SVN-fs-dump-format-version: 3 UUID: cda61777-01e9-0310-a592-d414129be87e Revision-number: 0 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T11:58:55.428047Z PROPS-END Revision-number: 1 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:45.539204Z PROPS-END Revision-number: 2 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:45.546370Z PROPS-END Revision-number: 3 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:45.552105Z PROPS-END Revision-number: 4 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:45.558130Z PROPS-END Revision-number: 5 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:45.563716Z PROPS-END Revision-number: 6 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:45.569886Z PROPS-END Revision-number: 7 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:45.576315Z PROPS-END Revision-number: 8 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:45.581979Z PROPS-END Revision-number: 9 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:45.587551Z PROPS-END Revision-number: 10 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:45.593149Z PROPS-END Revision-number: 11 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 1999-01-08T13:02:13.000000Z K 7 svn:log V 27 Initial checkin: beta 0.43 K 10 svn:author V 5 simon PROPS-END Node-path: putty Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1509 Text-content-md5: 355167c207fb2ce1a2bb90eeadb7b798 Text-content-sha1: f8eb9ec9e985dc1845abe3056484873ab11f72a3 Content-length: 1625 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNWWW# Makefile for PuTTY. Use `FWHACK=/DFWHACK' to cause the firewall hack # to be built in. (requires rebuild of ssh.obj only) CFLAGS = /nologo /W3 /YX /O2 /Yd /D_X86_ /D_WINDOWS /DDEBUG /ML /Fd .c.obj: cl $(FWHACK) $(CFLAGS) /c $*.c OBJS1 = window.obj windlg.obj terminal.obj telnet.obj misc.obj noise.obj OBJS2 = ssh.obj sshcrc.obj sshdes.obj sshmd5.obj sshrsa.obj sshrand.obj OBJS3 = sshsha.obj RESRC = win_res.res LIBS1 = advapi32.lib user32.lib gdi32.lib LIBS2 = wsock32.lib comctl32.lib comdlg32.lib putty.exe: $(OBJS1) $(OBJS2) $(OBJS3) $(RESRC) link.rsp link /debug -out:putty.exe @link.rsp puttyd.exe: $(OBJS1) $(OBJS2) $(OBJS3) $(RESRC) link.rsp link /debug -out:puttyd.exe @link.rsp link.rsp: makefile echo /nologo /subsystem:windows > link.rsp echo $(OBJS1) >> link.rsp echo $(OBJS2) >> link.rsp echo $(OBJS3) >> link.rsp echo $(RESRC) >> link.rsp echo $(LIBS1) >> link.rsp echo $(LIBS2) >> link.rsp window.obj: window.c putty.h win_res.h windlg.obj: windlg.c putty.h ssh.h win_res.h terminal.obj: terminal.c putty.h telnet.obj: telnet.c putty.h misc.obj: misc.c putty.h noise.obj: noise.c putty.h ssh.h ssh.obj: ssh.c ssh.h putty.h sshcrc.obj: sshcrc.c ssh.h sshdes.obj: sshdes.c ssh.h sshmd5.obj: sshmd5.c ssh.h sshrsa.obj: sshrsa.c ssh.h sshsha.obj: sshsha.c ssh.h sshrand.obj: sshrand.c ssh.h win_res.res: win_res.rc win_res.h putty.ico rc $(FWHACK) -r win_res.rc clean: del *.obj del *.exe del *.res del *.pch del *.aps del *.ilk del *.pdb del link.rsp Node-path: putty/misc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1516 Text-content-md5: a84182fac8e9428fb65d495f26ede8b7 Text-content-sha1: 5a42a4468f97159587f8791e8fd4d7dd6bdf1a8f Content-length: 1632 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN^^^#include #include #include #include "putty.h" /* My own versions of malloc, realloc and free. Because I want malloc and * realloc to bomb out and exit the program if they run out of memory, * realloc to reliably call malloc if passed a NULL pointer, and free * to reliably do nothing if passed a NULL pointer. Of course we can also * put trace printouts in, if we need to. */ #ifdef MALLOC_LOG static FILE *fp = NULL; void mlog(char *file, int line) { if (!fp) fp = fopen("putty_mem.log", "w"); if (fp) fprintf (fp, "%s:%d: ", file, line); } #endif void *safemalloc(size_t size) { void *p = malloc (size); if (!p) { MessageBox(NULL, "Out of memory!", "PuTTY Fatal Error", MB_SYSTEMMODAL | MB_ICONERROR | MB_OK); exit(1); } #ifdef MALLOC_LOG if (fp) fprintf(fp, "malloc(%d) returns %p\n", size, p); #endif return p; } void *saferealloc(void *ptr, size_t size) { void *p; if (!ptr) p = malloc (size); else p = realloc (ptr, size); if (!p) { MessageBox(NULL, "Out of memory!", "PuTTY Fatal Error", MB_SYSTEMMODAL | MB_ICONERROR | MB_OK); exit(1); } #ifdef MALLOC_LOG if (fp) fprintf(fp, "realloc(%p,%d) returns %p\n", ptr, size, p); #endif return p; } void safefree(void *ptr) { if (ptr) { #ifdef MALLOC_LOG if (fp) fprintf(fp, "free(%p)\n", ptr); #endif free (ptr); } #ifdef MALLOC_LOG else if (fp) fprintf(fp, "freeing null pointer - no action taken\n"); #endif } Node-path: putty/noise.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3521 Text-content-md5: 3f9938a682917c7055bd6b1359652144 Text-content-sha1: 26c601fc7b2a98159321569489f17f5050ee77e4 Content-length: 3637 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN333/* * Noise generation for PuTTY's cryptographic random number * generator. */ #include #include #include "putty.h" #include "ssh.h" static char seedpath[2*MAX_PATH+10] = "\0"; /* * Find the random seed file path and store it in `seedpath'. */ static void get_seedpath(void) { HKEY rkey; DWORD type, size; size = sizeof(seedpath); if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_POS, &rkey)==ERROR_SUCCESS) { int ret = RegQueryValueEx(rkey, "RandSeedFile", 0, &type, seedpath, &size); if (ret != ERROR_SUCCESS || type != REG_SZ) seedpath[0] = '\0'; RegCloseKey(rkey); } else seedpath[0] = '\0'; if (!seedpath[0]) { int len, ret; len = GetEnvironmentVariable("HOMEDRIVE", seedpath, sizeof(seedpath)); ret = GetEnvironmentVariable("HOMEPATH", seedpath+len, sizeof(seedpath)-len); if (ret == 0) { /* probably win95; store in \WINDOWS */ GetWindowsDirectory(seedpath, sizeof(seedpath)); len = strlen(seedpath); } else len += ret; strcpy(seedpath+len, "\\PUTTY.RND"); } } /* * This function is called once, at PuTTY startup, and will do some * seriously silly things like listing directories and getting disk * free space and a process snapshot. */ void noise_get_heavy(void (*func) (void *, int)) { HANDLE srch; HANDLE seedf; WIN32_FIND_DATA finddata; char winpath[MAX_PATH+3]; GetWindowsDirectory(winpath, sizeof(winpath)); strcat(winpath, "\\*"); srch = FindFirstFile(winpath, &finddata); if (srch != INVALID_HANDLE_VALUE) { do { func(&finddata, sizeof(finddata)); } while (FindNextFile(srch, &finddata)); FindClose(srch); } if (!seedpath[0]) get_seedpath(); seedf = CreateFile(seedpath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (seedf) { while (1) { char buf[1024]; DWORD len; if (ReadFile(seedf, buf, sizeof(buf), &len, NULL) && len) func(buf, len); else break; } CloseHandle(seedf); } } void random_save_seed(void) { HANDLE seedf; if (!seedpath[0]) get_seedpath(); seedf = CreateFile(seedpath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (seedf) { int len; DWORD lenwritten; void *data; random_get_savedata(&data, &len); WriteFile(seedf, data, len, &lenwritten, NULL); CloseHandle(seedf); } } /* * This function is called every time the random pool needs * stirring, and will acquire the system time in all available * forms and the battery status. */ void noise_get_light(void (*func) (void *, int)) { SYSTEMTIME systime; DWORD adjust[2]; BOOL rubbish; SYSTEM_POWER_STATUS pwrstat; GetSystemTime(&systime); func(&systime, sizeof(systime)); GetSystemTimeAdjustment(&adjust[0], &adjust[1], &rubbish); func(&adjust, sizeof(adjust)); if (GetSystemPowerStatus(&pwrstat)) func(&pwrstat, sizeof(pwrstat)); } /* * This function is called on every keypress or mouse move, and * will add the current Windows time and performance monitor * counter to the noise pool. It gets the scan code or mouse * position passed in. */ void noise_ultralight(DWORD data) { DWORD wintime; LARGE_INTEGER perftime; random_add_noise(&data, sizeof(DWORD)); wintime = GetTickCount(); random_add_noise(&wintime, sizeof(DWORD)); if (QueryPerformanceCounter(&perftime)) random_add_noise(&perftime, sizeof(perftime)); } Node-path: putty/putty.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5875 Text-content-md5: 84a0ed0d9293f22ecab1afc2f3304c42 Text-content-sha1: 4127504baec765ebf924a43e303279ae201cb45b Content-length: 5991 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNeee#ifndef PUTTY_PUTTY_H #define PUTTY_PUTTY_H #define PUTTY_REG_POS "Software\\SimonTatham\\PuTTY" /* * Global variables. Most modules declare these `extern', but * window.c will do `#define PUTTY_DO_GLOBALS' before including this * module, and so will get them properly defined. */ #ifdef PUTTY_DO_GLOBALS #define GLOBAL #else #define GLOBAL extern #endif #define ATTR_ACTCURS 0x80000000UL /* active cursor (block) */ #define ATTR_PASCURS 0x40000000UL /* passive cursor (box) */ #define ATTR_INVALID 0x20000000UL #define ATTR_WRAPPED 0x10000000UL #define ATTR_ASCII 0x00000000UL /* normal ASCII charset ESC ( B */ #define ATTR_GBCHR 0x00100000UL /* UK variant charset ESC ( A */ #define ATTR_LINEDRW 0x00200000UL /* line drawing charset ESC ( 0 */ #define ATTR_BOLD 0x00000100UL #define ATTR_UNDER 0x00000200UL #define ATTR_REVERSE 0x00000400UL #define ATTR_FGMASK 0x0000F000UL #define ATTR_BGMASK 0x000F0000UL #define ATTR_FGSHIFT 12 #define ATTR_BGSHIFT 16 #define ATTR_DEFAULT 0x00098000UL #define ATTR_DEFFG 0x00008000UL #define ATTR_DEFBG 0x00090000UL #define ATTR_CUR_XOR 0x000BA000UL #define ERASE_CHAR (ATTR_DEFAULT | ' ') #define ATTR_MASK 0xFFFFFF00UL #define CHAR_MASK 0x000000FFUL typedef HDC Context; #define SEL_NL { 13, 10 } GLOBAL int rows, cols, savelines; GLOBAL int font_width, font_height; #define INBUF_SIZE 2048 #define INBUF_MASK (INBUF_SIZE-1) GLOBAL unsigned char inbuf[INBUF_SIZE]; GLOBAL int inbuf_head, inbuf_reap; #define OUTBUF_SIZE 2048 #define OUTBUF_MASK (OUTBUF_SIZE-1) GLOBAL unsigned char outbuf[OUTBUF_SIZE]; GLOBAL int outbuf_head, outbuf_reap; GLOBAL int has_focus; GLOBAL int app_cursor_keys, app_keypad_keys; #define WM_NETEVENT (WM_USER + 1) 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 } Telnet_Special; typedef enum { MB_NOTHING, MB_SELECT, MB_EXTEND, MB_PASTE } Mouse_Button; typedef enum { MA_NOTHING, MA_CLICK, MA_2CLK, MA_3CLK, MA_DRAG, MA_RELEASE } Mouse_Action; typedef enum { VT_XWINDOWS, VT_OEMANSI, VT_OEMONLY, VT_POORMAN } VT_Mode; typedef struct { char *(*init) (HWND hwnd, char *host, int port, char **realhost); int (*msg) (WPARAM wParam, LPARAM lParam); void (*send) (char *buf, int len); void (*size) (void); void (*special) (Telnet_Special code); } Backend; GLOBAL Backend *back; typedef struct { /* Basic options */ char host[512]; int port; enum { PROT_TELNET, PROT_SSH } protocol; int close_on_exit; /* Telnet options */ char termtype[32]; char termspeed[32]; char environ[1024]; /* VAR\tvalue\0VAR\tvalue\0\0 */ char username[32]; int rfc_environ; /* Keyboard options */ int bksp_is_delete; int rxvt_homeend; int linux_funkeys; int app_cursor; int app_keypad; /* Terminal options */ int savelines; int dec_om; int wrap_mode; int win_name_always; int width, height; char font[64]; int fontisbold; int fontheight; VT_Mode vtmode; /* Colour options */ int try_palette; int bold_colour; unsigned char colours[22][3]; /* Selection options */ int mouse_is_xterm; short wordness[256]; } Config; GLOBAL Config cfg; /* * Exports from window.c. */ void request_resize (int, int); void do_text (Context, int, int, char *, int, unsigned long); void set_title (char *); void set_icon (char *); void set_sbar (int, int, int); Context get_ctx(); void free_ctx (Context); void palette_set (int, int, int, int); void palette_reset (void); void write_clip (void *, int); void get_clip (void **, int *); void optimised_move (int, int, int); void fatalbox (char *, ...); void beep (void); #define OPTIMISE_IS_SCROLL 1 /* * Exports from noise.c. */ void noise_get_heavy(void (*func) (void *, int)); void noise_get_light(void (*func) (void *, int)); void noise_ultralight(DWORD data); void random_save_seed(void); /* * Exports from windlg.c. */ int do_config (void); int do_reconfig (HWND); void do_defaults (char *); void lognegot (char *); void shownegot (HWND); void showabout (HWND); void verify_ssh_host_key(char *host, struct RSAKey *key); /* * Exports from terminal.c. */ void term_init (void); void term_size (int, int, int); void term_out (void); void term_paint (Context, int, int, int, int); void term_scroll (int, int); void term_pwron (void); void term_clrsb (void); void term_mouse (Mouse_Button, Mouse_Action, int, int); void term_deselect (void); void term_update (void); void term_invalidate(void); /* * Exports from telnet.c. */ Backend telnet_backend; /* * Exports from ssh.c. */ Backend ssh_backend; /* * Exports from sshrand.c. */ void random_add_noise(void *noise, int length); void random_init(void); int random_byte(void); void random_get_savedata(void **data, int *len); /* * Exports from misc.c. */ /* #define MALLOC_LOG do this if you suspect putty of leaking memory */ #ifdef MALLOC_LOG #define smalloc(z) (mlog(__FILE__,__LINE__), safemalloc(z)) #define srealloc(y,z) (mlog(__FILE__,__LINE__), saferealloc(y,z)) #define sfree(z) (mlog(__FILE__,__LINE__), safefree(z)) void mlog(char *, int); #else #define smalloc safemalloc #define srealloc saferealloc #define sfree safefree #endif void *safemalloc(size_t); void *saferealloc(void *, size_t); void safefree(void *); /* * A debug system. */ #ifdef DEBUG #include #define debug(x) (dprintf x) static void dprintf(char *fmt, ...) { char buf[2048]; DWORD dw; va_list ap; static int gotconsole = 0; if (!gotconsole) { AllocConsole(); gotconsole = 1; } va_start(ap, fmt); vsprintf(buf, fmt, ap); WriteFile (GetStdHandle(STD_OUTPUT_HANDLE), buf, strlen(buf), &dw, NULL); va_end(ap); } #else #define debug(x) #endif #endif Node-path: putty/putty.ico Node-kind: file Node-action: add Prop-content-length: 88 Text-delta: true Text-content-length: 3332 Text-content-md5: 1eeb6033797eebd2e3781a4228a05e22 Text-content-sha1: 7615b8c192f81b6416b8ede7d82bad03eb6992ea Content-length: 3420 K 15 cvs2svn:cvs-rev V 3 1.1 K 13 svn:mime-type V 24 application/octet-stream PROPS-END SVNvvv 6  0 ( @wwwwxwwwwwwwxpxxx x x x 𻰈pww xwwwx  Lj Lj Lj Lj Lj Ljwwwwwx???????( @ʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___www???????( @@@@ @  ?߀`0??????? Node-path: putty/resource.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 410 Text-content-md5: 355e758830bb28a0289005585629651c Text-content-sha1: 3da6f45463048903169f95999351286273d19d9f Content-length: 526 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  //{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by win_res.rc // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif Node-path: putty/ssh.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 16588 Text-content-md5: 8287ad7cfcbef0e760042d87fdd7c094 Text-content-sha1: b2171dffeaf34d492fb64d875c1192c9afb1a0ab Content-length: 16704 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN;;;#include #include #include #include "putty.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #include "ssh.h" /* Coroutine mechanics for the sillier bits of the code */ #define crBegin1 static int crLine = 0; #define crBegin2 switch(crLine) { case 0:; #define crBegin crBegin1; crBegin2; #define crFinish(z) } crLine = 0; return (z) #define crFinishV } crLine = 0; return #define crReturn(z) \ do {\ crLine=__LINE__; return (z); case __LINE__:;\ } while (0) #define crReturnV \ do {\ crLine=__LINE__; return; case __LINE__:;\ } while (0) #define crStop(z) do{ crLine = 0; return (z); }while(0) #define crStopV do{ crLine = 0; return; }while(0) #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif static SOCKET s = INVALID_SOCKET; static unsigned char session_key[32]; static struct ssh_cipher *cipher = NULL; static char *savedhost; static enum { SSH_STATE_BEFORE_SIZE, SSH_STATE_INTERMED, SSH_STATE_SESSION } ssh_state = SSH_STATE_BEFORE_SIZE; static int size_needed = FALSE; static void s_write (char *buf, int len) { while (len > 0) { int i = send (s, buf, len, 0); if (i > 0) len -= i, buf += i; } } static int s_read (char *buf, int len) { int ret = 0; while (len > 0) { int i = recv (s, buf, len, 0); if (i > 0) len -= i, buf += i, ret += i; else return i; } return ret; } static void c_write (char *buf, int len) { while (len--) { int new_head = (inbuf_head + 1) & INBUF_MASK; int c = (unsigned char) *buf; if (new_head != inbuf_reap) { inbuf[inbuf_head] = *buf++; inbuf_head = new_head; } } } struct Packet { long length; int type; unsigned long crc; unsigned char *data; unsigned char *body; long maxlen; }; static struct Packet pktin = { 0, 0, 0, NULL, 0 }; static struct Packet pktout = { 0, 0, 0, NULL, 0 }; static void ssh_protocol(unsigned char *in, int inlen, int ispkt); static void ssh_size(void); static void ssh_gotdata(unsigned char *data, int datalen) { static long len, biglen, to_read; static unsigned char c, *p; static int i, pad; static char padding[8]; static unsigned char word[4]; crBegin; while (1) { for (i = len = 0; i < 4; i++) { while (datalen == 0) crReturnV; len = (len << 8) + *data; data++, datalen--; } pad = 8 - (len%8); biglen = len + pad; len -= 5; /* type and CRC */ pktin.length = len; if (pktin.maxlen < biglen) { pktin.maxlen = biglen; pktin.data = (pktin.data == NULL ? malloc(biglen) : realloc(pktin.data, biglen)); if (!pktin.data) fatalbox("Out of memory"); } p = pktin.data, to_read = biglen; while (to_read > 0) { static int chunk; chunk = to_read; while (datalen == 0) crReturnV; if (chunk > datalen) chunk = datalen; memcpy(p, data, chunk); data += chunk; datalen -= chunk; p += chunk; to_read -= chunk; } if (cipher) cipher->decrypt(pktin.data, biglen); pktin.type = pktin.data[pad]; pktin.body = pktin.data+pad+1; if (pktin.type == 36) { /* SSH_MSG_DEBUG */ /* FIXME: log it */ } else ssh_protocol(NULL, 0, 1); } crFinishV; } static void s_wrpkt_start(int type, int len) { int pad, biglen; len += 5; /* type and CRC */ pad = 8 - (len%8); biglen = len + pad; pktout.length = len-5; if (pktout.maxlen < biglen) { pktout.maxlen = biglen; pktout.data = (pktout.data == NULL ? malloc(biglen) : realloc(pktout.data, biglen)); if (!pktout.data) fatalbox("Out of memory"); } pktout.type = type; pktout.body = pktout.data+4+pad+1; } static void s_wrpkt(void) { int pad, len, biglen, i; unsigned long crc; len = pktout.length + 5; /* type and CRC */ pad = 8 - (len%8); biglen = len + pad; pktout.body[-1] = pktout.type; for (i=0; i> 24) & 0xFF); pktout.data[biglen+1] = (unsigned char) ((crc >> 16) & 0xFF); pktout.data[biglen+2] = (unsigned char) ((crc >> 8) & 0xFF); pktout.data[biglen+3] = (unsigned char) (crc & 0xFF); pktout.data[0] = (len >> 24) & 0xFF; pktout.data[1] = (len >> 16) & 0xFF; pktout.data[2] = (len >> 8) & 0xFF; pktout.data[3] = len & 0xFF; if (cipher) cipher->encrypt(pktout.data+4, biglen); s_write(pktout.data, biglen+4); } static int do_ssh_init(void) { char c; char version[10]; char vstring[40]; int i; #ifdef FWHACK i = 0; while (s_read(&c, 1) == 1) { if (c == 'S' && i < 2) i++; else if (c == 'S' && i == 2) i = 2; else if (c == 'H' && i == 2) break; else i = 0; } #else if (s_read(&c,1) != 1 || c != 'S') return 0; if (s_read(&c,1) != 1 || c != 'S') return 0; if (s_read(&c,1) != 1 || c != 'H') return 0; #endif if (s_read(&c,1) != 1 || c != '-') return 0; i = 0; while (1) { if (s_read(&c,1) != 1) return 0; if (i >= 0) { if (c == '-') { version[i] = '\0'; i = -1; } else if (i < sizeof(version)-1) version[i++] = c; } else if (c == '\n') break; } sprintf(vstring, "SSH-%s-7.7.7\n", (strcmp(version, "1.5") <= 0 ? version : "1.5")); s_write(vstring, strlen(vstring)); } static void ssh_protocol(unsigned char *in, int inlen, int ispkt) { int i, j, len; unsigned char session_id[16]; unsigned char *rsabuf, *keystr1, *keystr2; unsigned char cookie[8]; struct RSAKey servkey, hostkey; struct MD5Context md5c; extern struct ssh_cipher ssh_3des; crBegin; random_init(); while (!ispkt) crReturnV; if (pktin.type != 2) fatalbox("Public key packet not received"); memcpy(cookie, pktin.body, 8); MD5Init(&md5c); i = makekey(pktin.body+8, &servkey, &keystr1); j = makekey(pktin.body+8+i, &hostkey, &keystr2); MD5Update(&md5c, keystr2, hostkey.bytes); MD5Update(&md5c, keystr1, servkey.bytes); MD5Update(&md5c, pktin.body, 8); MD5Final(session_id, &md5c); for (i=0; i<32; i++) session_key[i] = random_byte(); len = (hostkey.bytes > servkey.bytes ? hostkey.bytes : servkey.bytes); rsabuf = malloc(len); if (!rsabuf) fatalbox("Out of memory"); verify_ssh_host_key(savedhost, &hostkey); for (i=0; i<32; i++) { rsabuf[i] = session_key[i]; if (i < 16) rsabuf[i] ^= session_id[i]; } if (hostkey.bytes > servkey.bytes) { rsaencrypt(rsabuf, 32, &servkey); rsaencrypt(rsabuf, servkey.bytes, &hostkey); } else { rsaencrypt(rsabuf, 32, &hostkey); rsaencrypt(rsabuf, hostkey.bytes, &servkey); } s_wrpkt_start(3, len+15); pktout.body[0] = 3; /* SSH_CIPHER_3DES */ memcpy(pktout.body+1, cookie, 8); pktout.body[9] = (len*8) >> 8; pktout.body[10] = (len*8) & 0xFF; memcpy(pktout.body+11, rsabuf, len); pktout.body[len+11] = pktout.body[len+12] = 0; /* protocol flags */ pktout.body[len+13] = pktout.body[len+14] = 0; s_wrpkt(); free(rsabuf); cipher = &ssh_3des; cipher->sesskey(session_key); do { crReturnV; } while (!ispkt); if (pktin.type != 14) fatalbox("Encryption not successfully enabled"); fflush(stdout); { static char username[100]; static int pos = 0; static char c; if (!*cfg.username) { c_write("login as: ", 10); while (pos >= 0) { do { crReturnV; } while (ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: username[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) { c_write("\b \b", 3); pos--; } break; case 21: case 27: while (pos > 0) { c_write("\b \b", 3); pos--; } break; case 3: case 4: random_save_seed(); exit(0); break; default: if (c >= ' ' && c <= '~' && pos < 40) { username[pos++] = c; c_write(&c, 1); } break; } } c_write("\r\n", 2); username[strcspn(username, "\n\r")] = '\0'; } else { char stuff[200]; strncpy(username, cfg.username, 99); username[99] = '\0'; sprintf(stuff, "Sent username \"%s\".\r\n", username); c_write(stuff, strlen(stuff)); } s_wrpkt_start(4, 4+strlen(username)); pktout.body[0] = pktout.body[1] = pktout.body[2] = 0; pktout.body[3] = strlen(username); memcpy(pktout.body+4, username, strlen(username)); s_wrpkt(); } do { crReturnV; } while (!ispkt); while (pktin.type == 15) { static char password[100]; static int pos; static char c; c_write("password: ", 10); pos = 0; while (pos >= 0) { do { crReturnV; } while (ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: password[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) pos--; break; case 21: case 27: pos = 0; break; case 3: case 4: random_save_seed(); exit(0); break; default: if (c >= ' ' && c <= '~' && pos < 40) password[pos++] = c; break; } } c_write("\r\n", 2); s_wrpkt_start(9, 4+strlen(password)); pktout.body[0] = pktout.body[1] = pktout.body[2] = 0; pktout.body[3] = strlen(password); memcpy(pktout.body+4, password, strlen(password)); s_wrpkt(); memset(password, 0, strlen(password)); do { crReturnV; } while (!ispkt); if (pktin.type == 15) { c_write("Access denied\r\n", 15); } else if (pktin.type != 14) { fatalbox("Strange packet received, type %d", pktin.type); } } i = strlen(cfg.termtype); s_wrpkt_start(10, i+5*4+1); pktout.body[0] = (i >> 24) & 0xFF; pktout.body[1] = (i >> 16) & 0xFF; pktout.body[2] = (i >> 8) & 0xFF; pktout.body[3] = i & 0xFF; memcpy(pktout.body+4, cfg.termtype, i); i += 4; pktout.body[i++] = (rows >> 24) & 0xFF; pktout.body[i++] = (rows >> 16) & 0xFF; pktout.body[i++] = (rows >> 8) & 0xFF; pktout.body[i++] = rows & 0xFF; pktout.body[i++] = (cols >> 24) & 0xFF; pktout.body[i++] = (cols >> 16) & 0xFF; pktout.body[i++] = (cols >> 8) & 0xFF; pktout.body[i++] = cols & 0xFF; memset(pktout.body+i, 0, 9); /* 0 pixwidth, 0 pixheight, 0.b endofopt */ s_wrpkt(); ssh_state = SSH_STATE_INTERMED; do { crReturnV; } while (!ispkt); if (pktin.type != 14 && pktin.type != 15) { fatalbox("Protocol confusion"); } else if (pktin.type == 15) { c_write("Server refused to allocate pty\r\n", 32); } s_wrpkt_start(12, 0); s_wrpkt(); ssh_state = SSH_STATE_SESSION; if (size_needed) ssh_size(); while (1) { crReturnV; if (ispkt) { if (pktin.type == 17 || pktin.type == 18) { long len = 0; for (i = 0; i < 4; i++) len = (len << 8) + pktin.body[i]; c_write(pktin.body+4, len); } else if (pktin.type == 1) { /* SSH_MSG_DISCONNECT: do nothing */ } else if (pktin.type == 14) { /* SSH_MSG_SUCCESS: may be from EXEC_SHELL on some servers */ } else if (pktin.type == 15) { /* SSH_MSG_FAILURE: may be from EXEC_SHELL on some servers * if no pty is available or in other odd cases. Ignore */ } else if (pktin.type == 20) { /* EXITSTATUS */ s_wrpkt_start(33, 0); s_wrpkt(); } else { fatalbox("Strange packet received: type %d", pktin.type); } } else { s_wrpkt_start(16, 4+inlen); pktout.body[0] = (inlen >> 24) & 0xFF; pktout.body[1] = (inlen >> 16) & 0xFF; pktout.body[2] = (inlen >> 8) & 0xFF; pktout.body[3] = inlen & 0xFF; memcpy(pktout.body+4, in, inlen); s_wrpkt(); } } crFinishV; } /* * Called to set up the connection. Will arrange for WM_NETEVENT * messages to be passed to the specified window, whose window * procedure should then call telnet_msg(). * * Returns an error message, or NULL on success. * * Also places the canonical host name into `realhost'. */ static char *ssh_init (HWND hwnd, char *host, int port, char **realhost) { SOCKADDR_IN addr; struct hostent *h; unsigned long a; #ifdef FWHACK char *FWhost; int FWport; #endif savedhost = malloc(1+strlen(host)); if (!savedhost) fatalbox("Out of memory"); strcpy(savedhost, host); #ifdef FWHACK FWhost = host; FWport = port; host = FWSTR; port = 23; #endif /* * Try to find host. */ if ( (a = inet_addr(host)) == (unsigned long) INADDR_NONE) { if ( (h = gethostbyname(host)) == NULL) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAHOST_NOT_FOUND: case WSANO_DATA: return "Host does not exist"; case WSATRY_AGAIN: return "Host not found"; default: return "gethostbyname: unknown error"; } memcpy (&a, h->h_addr, sizeof(a)); *realhost = h->h_name; } else *realhost = host; #ifdef FWHACK *realhost = FWhost; #endif a = ntohl(a); if (port < 0) port = 22; /* default ssh port */ /* * Open socket. */ s = socket(AF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAEAFNOSUPPORT: return "TCP/IP support not present"; default: return "socket(): unknown error"; } /* * Bind to local address. */ addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(0); if (bind (s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "bind(): unknown error"; } /* * Connect to remote address. */ addr.sin_addr.s_addr = htonl(a); addr.sin_port = htons((short)port); if (connect (s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAECONNREFUSED: return "Connection refused"; case WSAENETUNREACH: return "Network is unreachable"; case WSAEHOSTUNREACH: return "No route to host"; default: return "connect(): unknown error"; } #ifdef FWHACK send(s, "connect ", 8, 0); send(s, FWhost, strlen(FWhost), 0); { char buf[20]; sprintf(buf, " %d\n", FWport); send (s, buf, strlen(buf), 0); } #endif if (!do_ssh_init()) return "Protocol initialisation error"; if (WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ | FD_CLOSE) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "WSAAsyncSelect(): unknown error"; } return NULL; } /* * Process a WM_NETEVENT message. Will return 0 if the connection * has closed, or <0 for a socket error. */ static int ssh_msg (WPARAM wParam, LPARAM lParam) { int ret; char buf[256]; if (s == INVALID_SOCKET) /* how the hell did we get here?! */ return -5000; if (WSAGETSELECTERROR(lParam) != 0) return -WSAGETSELECTERROR(lParam); switch (WSAGETSELECTEVENT(lParam)) { case FD_READ: ret = recv(s, buf, sizeof(buf), 0); if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK) return 1; if (ret < 0) /* any _other_ error */ return -10000-WSAGetLastError(); if (ret == 0) { s = INVALID_SOCKET; return 0; /* can't happen, in theory */ } ssh_gotdata (buf, ret); return 1; case FD_CLOSE: s = INVALID_SOCKET; return 0; } return 1; /* shouldn't happen, but WTF */ } /* * Called to send data down the Telnet connection. */ static void ssh_send (char *buf, int len) { if (s == INVALID_SOCKET) return; ssh_protocol(buf, len, 0); } /* * Called to set the size of the window from Telnet's POV. */ static void ssh_size(void) { switch (ssh_state) { case SSH_STATE_BEFORE_SIZE: break; /* do nothing */ case SSH_STATE_INTERMED: size_needed = TRUE; /* buffer for later */ break; case SSH_STATE_SESSION: s_wrpkt_start(11, 16); pktout.body[0] = (rows >> 24) & 0xFF; pktout.body[1] = (rows >> 16) & 0xFF; pktout.body[2] = (rows >> 8) & 0xFF; pktout.body[3] = rows & 0xFF; pktout.body[4] = (cols >> 24) & 0xFF; pktout.body[5] = (cols >> 16) & 0xFF; pktout.body[6] = (cols >> 8) & 0xFF; pktout.body[7] = cols & 0xFF; memset(pktout.body+8, 0, 8); s_wrpkt(); } } /* * (Send Telnet special codes) */ static void ssh_special (Telnet_Special code) { /* do nothing */ } Backend ssh_backend = { ssh_init, ssh_msg, ssh_send, ssh_size, ssh_special }; Node-path: putty/ssh.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1064 Text-content-md5: a509ea6e47d5e26a94b4c51f7de62ed5 Text-content-sha1: 956b14ba4724b7726d7419c32e1b08f503cf909d Content-length: 1180 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNstruct RSAKey { int bits; int bytes; void *modulus; void *exponent; }; int makekey(unsigned char *data, struct RSAKey *result, unsigned char **keystr); void rsaencrypt(unsigned char *data, int length, struct RSAKey *key); int rsastr_len(struct RSAKey *key); void rsastr_fmt(char *str, struct RSAKey *key); typedef unsigned int word32; typedef unsigned int uint32; unsigned long crc32(const unsigned char *s, unsigned int len); struct MD5Context { uint32 buf[4]; uint32 bits[2]; unsigned char in[64]; }; void MD5Init(struct MD5Context *context); void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len); void MD5Final(unsigned char digest[16], struct MD5Context *context); struct ssh_cipher { void (*sesskey)(unsigned char *key); void (*encrypt)(unsigned char *blk, int len); void (*decrypt)(unsigned char *blk, int len); }; void SHATransform(word32 *digest, word32 *data); int random_byte(void); void random_add_noise(void *noise, int length); Node-path: putty/sshcrc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 7095 Text-content-md5: 5de39024b25f15fc6c2e2c63a29c9d6c Text-content-sha1: d8dd1c263705eb16b5e4088c5ddf299324b4dc6a Content-length: 7211 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN))) /* ============================================================= */ /* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or */ /* code or tables extracted from it, as desired without restriction. */ /* */ /* First, the polynomial itself and its table of feedback terms. The */ /* polynomial is */ /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */ /* */ /* Note that we take it "backwards" and put the highest-order term in */ /* the lowest-order bit. The X^32 term is "implied"; the LSB is the */ /* X^31 term, etc. The X^0 term (usually shown as "+1") results in */ /* the MSB being 1. */ /* */ /* Note that the usual hardware shift register implementation, which */ /* is what we're using (we're merely optimizing it by doing eight-bit */ /* chunks at a time) shifts bits into the lowest-order term. In our */ /* implementation, that means shifting towards the right. Why do we */ /* do it this way? Because the calculated CRC must be transmitted in */ /* order from highest-order term to lowest-order term. UARTs transmit */ /* characters in order from LSB to MSB. By storing the CRC this way, */ /* we hand it to the UART in the order low-byte to high-byte; the UART */ /* sends each low-bit to hight-bit; and the result is transmission bit */ /* by bit from highest- to lowest-order term without requiring any bit */ /* shuffling on our part. Reception works similarly. */ /* */ /* The feedback terms table consists of 256, 32-bit entries. Notes: */ /* */ /* The table can be generated at runtime if desired; code to do so */ /* is shown later. It might not be obvious, but the feedback */ /* terms simply represent the results of eight shift/xor opera- */ /* tions for all combinations of data and CRC register values. */ /* */ /* The values must be right-shifted by eight bits by the "updcrc" */ /* logic; the shift must be unsigned (bring in zeroes). On some */ /* hardware you could probably optimize the shift in assembler by */ /* using byte-swap instructions. */ /* polynomial $edb88320 */ /* */ /* -------------------------------------------------------------------- */ static unsigned long crc32_tab[] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL }; /* Return a 32-bit CRC of the contents of the buffer. */ unsigned long crc32(const unsigned char *s, unsigned int len) { unsigned int i; unsigned long crc32val; crc32val = 0; for (i = 0; i < len; i ++) { crc32val = crc32_tab[(crc32val ^ s[i]) & 0xff] ^ (crc32val >> 8); } return crc32val; } Node-path: putty/sshdes.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 27041 Text-content-md5: 1b3e5883a3b497a867d763f3e0e76c5d Text-content-sha1: b9174adc4fb82a577eabc731b506dae832b368ac Content-length: 27157 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN#include #include "ssh.h" /* DES implementation; 1995 Tatu Ylonen This implementation is derived from libdes-3.06, which is copyright (c) 1993 Eric Young, and distributed under the GNU GPL or the ARTISTIC licence (at the user's option). The original distribution can be found e.g. from ftp://ftp.dsi.unimi.it/pub/security/crypt/libdes/libdes-3.06.tar.gz. This implementation is distributed under the same terms. See libdes-README, libdes-ARTISTIC, and libdes-COPYING for more information. */ /* * $Id: sshdes.c,v 1.1 1999/01/08 13:02:12 simon Exp $ * $Log: sshdes.c,v $ * Revision 1.1 1999/01/08 13:02:12 simon * Initial checkin: beta 0.43 * * Revision 1.1.1.1 1996/02/18 21:38:11 ylo * Imported ssh-1.2.13. * * Revision 1.2 1995/07/13 01:22:57 ylo * Added cvs log. * * $Endlog$ */ typedef struct { word32 key_schedule[32]; } DESContext; /* Sets the des key for the context. Initializes the context. The least significant bit of each byte of the key is ignored as parity. */ static void des_set_key(unsigned char *key, DESContext *ks); /* Encrypts 32 bits in l,r, and stores the result in output[0] and output[1]. Performs encryption if encrypt is non-zero, and decryption if it is zero. The key context must have been initialized previously with des_set_key. */ static void des_encrypt(word32 l, word32 r, word32 *output, DESContext *ks, int encrypt); /* Encrypts len bytes from src to dest in CBC modes. Len must be a multiple of 8. iv will be modified at end to a value suitable for continuing encryption. */ static void des_cbc_encrypt(DESContext *ks, unsigned char *iv, unsigned char *dest, const unsigned char *src, unsigned int len); /* Decrypts len bytes from src to dest in CBC modes. Len must be a multiple of 8. iv will be modified at end to a value suitable for continuing decryption. */ static void des_cbc_decrypt(DESContext *ks, unsigned char *iv, unsigned char *dest, const unsigned char *src, unsigned int len); /* Encrypts in CBC mode using triple-DES. */ static void des_3cbc_encrypt(DESContext *ks1, unsigned char *iv1, DESContext *ks2, unsigned char *iv2, DESContext *ks3, unsigned char *iv3, unsigned char *dest, const unsigned char *src, unsigned int len); /* Decrypts in CBC mode using triple-DES. */ static void des_3cbc_decrypt(DESContext *ks1, unsigned char *iv1, DESContext *ks2, unsigned char *iv2, DESContext *ks3, unsigned char *iv3, unsigned char *dest, const unsigned char *src, unsigned int len); #define GET_32BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8) | \ ((unsigned long)(unsigned char)(cp)[2] << 16) | \ ((unsigned long)(unsigned char)(cp)[3] << 24)) #define PUT_32BIT_LSB_FIRST(cp, value) do { \ (cp)[0] = (value); \ (cp)[1] = (value) >> 8; \ (cp)[2] = (value) >> 16; \ (cp)[3] = (value) >> 24; } while (0) /* DES implementation; 1995 Tatu Ylonen This implementation is derived from libdes-3.06, which is copyright (c) 1993 Eric Young, and distributed under the GNU GPL or the ARTISTIC licence (at the user's option). The original distribution can be found e.g. from ftp://ftp.dsi.unimi.it/pub/security/crypt/libdes/libdes-3.06.tar.gz. This implementation is distributed under the same terms. See libdes-README, libdes-ARTISTIC, and libdes-COPYING for more information. A description of the DES algorithm can be found in every modern book on cryptography and data security, including the following: Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1994. Jennifer Seberry and Josed Pieprzyk: Cryptography: An Introduction to Computer Security. Prentice-Hall, 1989. Man Young Rhee: Cryptography and Secure Data Communications. McGraw-Hill, 1994. */ /* * $Id: sshdes.c,v 1.1 1999/01/08 13:02:12 simon Exp $ * $Log: sshdes.c,v $ * Revision 1.1 1999/01/08 13:02:12 simon * Initial checkin: beta 0.43 * * Revision 1.1.1.1 1996/02/18 21:38:11 ylo * Imported ssh-1.2.13. * * Revision 1.2 1995/07/13 01:22:25 ylo * Added cvs log. * * $Endlog$ */ /* Table for key generation. This used to be in sk.h. */ /* Copyright (C) 1993 Eric Young - see README for more details */ static const word32 des_skb[8][64]={ /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ { 0x00000000,0x00000010,0x20000000,0x20000010, 0x00010000,0x00010010,0x20010000,0x20010010, 0x00000800,0x00000810,0x20000800,0x20000810, 0x00010800,0x00010810,0x20010800,0x20010810, 0x00000020,0x00000030,0x20000020,0x20000030, 0x00010020,0x00010030,0x20010020,0x20010030, 0x00000820,0x00000830,0x20000820,0x20000830, 0x00010820,0x00010830,0x20010820,0x20010830, 0x00080000,0x00080010,0x20080000,0x20080010, 0x00090000,0x00090010,0x20090000,0x20090010, 0x00080800,0x00080810,0x20080800,0x20080810, 0x00090800,0x00090810,0x20090800,0x20090810, 0x00080020,0x00080030,0x20080020,0x20080030, 0x00090020,0x00090030,0x20090020,0x20090030, 0x00080820,0x00080830,0x20080820,0x20080830, 0x00090820,0x00090830,0x20090820,0x20090830 }, /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ { 0x00000000,0x02000000,0x00002000,0x02002000, 0x00200000,0x02200000,0x00202000,0x02202000, 0x00000004,0x02000004,0x00002004,0x02002004, 0x00200004,0x02200004,0x00202004,0x02202004, 0x00000400,0x02000400,0x00002400,0x02002400, 0x00200400,0x02200400,0x00202400,0x02202400, 0x00000404,0x02000404,0x00002404,0x02002404, 0x00200404,0x02200404,0x00202404,0x02202404, 0x10000000,0x12000000,0x10002000,0x12002000, 0x10200000,0x12200000,0x10202000,0x12202000, 0x10000004,0x12000004,0x10002004,0x12002004, 0x10200004,0x12200004,0x10202004,0x12202004, 0x10000400,0x12000400,0x10002400,0x12002400, 0x10200400,0x12200400,0x10202400,0x12202400, 0x10000404,0x12000404,0x10002404,0x12002404, 0x10200404,0x12200404,0x10202404,0x12202404 }, /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ { 0x00000000,0x00000001,0x00040000,0x00040001, 0x01000000,0x01000001,0x01040000,0x01040001, 0x00000002,0x00000003,0x00040002,0x00040003, 0x01000002,0x01000003,0x01040002,0x01040003, 0x00000200,0x00000201,0x00040200,0x00040201, 0x01000200,0x01000201,0x01040200,0x01040201, 0x00000202,0x00000203,0x00040202,0x00040203, 0x01000202,0x01000203,0x01040202,0x01040203, 0x08000000,0x08000001,0x08040000,0x08040001, 0x09000000,0x09000001,0x09040000,0x09040001, 0x08000002,0x08000003,0x08040002,0x08040003, 0x09000002,0x09000003,0x09040002,0x09040003, 0x08000200,0x08000201,0x08040200,0x08040201, 0x09000200,0x09000201,0x09040200,0x09040201, 0x08000202,0x08000203,0x08040202,0x08040203, 0x09000202,0x09000203,0x09040202,0x09040203 }, /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ { 0x00000000,0x00100000,0x00000100,0x00100100, 0x00000008,0x00100008,0x00000108,0x00100108, 0x00001000,0x00101000,0x00001100,0x00101100, 0x00001008,0x00101008,0x00001108,0x00101108, 0x04000000,0x04100000,0x04000100,0x04100100, 0x04000008,0x04100008,0x04000108,0x04100108, 0x04001000,0x04101000,0x04001100,0x04101100, 0x04001008,0x04101008,0x04001108,0x04101108, 0x00020000,0x00120000,0x00020100,0x00120100, 0x00020008,0x00120008,0x00020108,0x00120108, 0x00021000,0x00121000,0x00021100,0x00121100, 0x00021008,0x00121008,0x00021108,0x00121108, 0x04020000,0x04120000,0x04020100,0x04120100, 0x04020008,0x04120008,0x04020108,0x04120108, 0x04021000,0x04121000,0x04021100,0x04121100, 0x04021008,0x04121008,0x04021108,0x04121108 }, /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ { 0x00000000,0x10000000,0x00010000,0x10010000, 0x00000004,0x10000004,0x00010004,0x10010004, 0x20000000,0x30000000,0x20010000,0x30010000, 0x20000004,0x30000004,0x20010004,0x30010004, 0x00100000,0x10100000,0x00110000,0x10110000, 0x00100004,0x10100004,0x00110004,0x10110004, 0x20100000,0x30100000,0x20110000,0x30110000, 0x20100004,0x30100004,0x20110004,0x30110004, 0x00001000,0x10001000,0x00011000,0x10011000, 0x00001004,0x10001004,0x00011004,0x10011004, 0x20001000,0x30001000,0x20011000,0x30011000, 0x20001004,0x30001004,0x20011004,0x30011004, 0x00101000,0x10101000,0x00111000,0x10111000, 0x00101004,0x10101004,0x00111004,0x10111004, 0x20101000,0x30101000,0x20111000,0x30111000, 0x20101004,0x30101004,0x20111004,0x30111004 }, /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ { 0x00000000,0x08000000,0x00000008,0x08000008, 0x00000400,0x08000400,0x00000408,0x08000408, 0x00020000,0x08020000,0x00020008,0x08020008, 0x00020400,0x08020400,0x00020408,0x08020408, 0x00000001,0x08000001,0x00000009,0x08000009, 0x00000401,0x08000401,0x00000409,0x08000409, 0x00020001,0x08020001,0x00020009,0x08020009, 0x00020401,0x08020401,0x00020409,0x08020409, 0x02000000,0x0A000000,0x02000008,0x0A000008, 0x02000400,0x0A000400,0x02000408,0x0A000408, 0x02020000,0x0A020000,0x02020008,0x0A020008, 0x02020400,0x0A020400,0x02020408,0x0A020408, 0x02000001,0x0A000001,0x02000009,0x0A000009, 0x02000401,0x0A000401,0x02000409,0x0A000409, 0x02020001,0x0A020001,0x02020009,0x0A020009, 0x02020401,0x0A020401,0x02020409,0x0A020409 }, /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ { 0x00000000,0x00000100,0x00080000,0x00080100, 0x01000000,0x01000100,0x01080000,0x01080100, 0x00000010,0x00000110,0x00080010,0x00080110, 0x01000010,0x01000110,0x01080010,0x01080110, 0x00200000,0x00200100,0x00280000,0x00280100, 0x01200000,0x01200100,0x01280000,0x01280100, 0x00200010,0x00200110,0x00280010,0x00280110, 0x01200010,0x01200110,0x01280010,0x01280110, 0x00000200,0x00000300,0x00080200,0x00080300, 0x01000200,0x01000300,0x01080200,0x01080300, 0x00000210,0x00000310,0x00080210,0x00080310, 0x01000210,0x01000310,0x01080210,0x01080310, 0x00200200,0x00200300,0x00280200,0x00280300, 0x01200200,0x01200300,0x01280200,0x01280300, 0x00200210,0x00200310,0x00280210,0x00280310, 0x01200210,0x01200310,0x01280210,0x01280310 }, /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ { 0x00000000,0x04000000,0x00040000,0x04040000, 0x00000002,0x04000002,0x00040002,0x04040002, 0x00002000,0x04002000,0x00042000,0x04042000, 0x00002002,0x04002002,0x00042002,0x04042002, 0x00000020,0x04000020,0x00040020,0x04040020, 0x00000022,0x04000022,0x00040022,0x04040022, 0x00002020,0x04002020,0x00042020,0x04042020, 0x00002022,0x04002022,0x00042022,0x04042022, 0x00000800,0x04000800,0x00040800,0x04040800, 0x00000802,0x04000802,0x00040802,0x04040802, 0x00002800,0x04002800,0x00042800,0x04042800, 0x00002802,0x04002802,0x00042802,0x04042802, 0x00000820,0x04000820,0x00040820,0x04040820, 0x00000822,0x04000822,0x00040822,0x04040822, 0x00002820,0x04002820,0x00042820,0x04042820, 0x00002822,0x04002822,0x00042822,0x04042822 } }; /* Tables used for executing des. This used to be in spr.h. */ /* Copyright (C) 1993 Eric Young - see README for more details */ static const word32 des_SPtrans[8][64]={ /* nibble 0 */ { 0x00820200, 0x00020000, 0x80800000, 0x80820200, 0x00800000, 0x80020200, 0x80020000, 0x80800000, 0x80020200, 0x00820200, 0x00820000, 0x80000200, 0x80800200, 0x00800000, 0x00000000, 0x80020000, 0x00020000, 0x80000000, 0x00800200, 0x00020200, 0x80820200, 0x00820000, 0x80000200, 0x00800200, 0x80000000, 0x00000200, 0x00020200, 0x80820000, 0x00000200, 0x80800200, 0x80820000, 0x00000000, 0x00000000, 0x80820200, 0x00800200, 0x80020000, 0x00820200, 0x00020000, 0x80000200, 0x00800200, 0x80820000, 0x00000200, 0x00020200, 0x80800000, 0x80020200, 0x80000000, 0x80800000, 0x00820000, 0x80820200, 0x00020200, 0x00820000, 0x80800200, 0x00800000, 0x80000200, 0x80020000, 0x00000000, 0x00020000, 0x00800000, 0x80800200, 0x00820200, 0x80000000, 0x80820000, 0x00000200, 0x80020200 }, /* nibble 1 */ { 0x10042004, 0x00000000, 0x00042000, 0x10040000, 0x10000004, 0x00002004, 0x10002000, 0x00042000, 0x00002000, 0x10040004, 0x00000004, 0x10002000, 0x00040004, 0x10042000, 0x10040000, 0x00000004, 0x00040000, 0x10002004, 0x10040004, 0x00002000, 0x00042004, 0x10000000, 0x00000000, 0x00040004, 0x10002004, 0x00042004, 0x10042000, 0x10000004, 0x10000000, 0x00040000, 0x00002004, 0x10042004, 0x00040004, 0x10042000, 0x10002000, 0x00042004, 0x10042004, 0x00040004, 0x10000004, 0x00000000, 0x10000000, 0x00002004, 0x00040000, 0x10040004, 0x00002000, 0x10000000, 0x00042004, 0x10002004, 0x10042000, 0x00002000, 0x00000000, 0x10000004, 0x00000004, 0x10042004, 0x00042000, 0x10040000, 0x10040004, 0x00040000, 0x00002004, 0x10002000, 0x10002004, 0x00000004, 0x10040000, 0x00042000 }, /* nibble 2 */ { 0x41000000, 0x01010040, 0x00000040, 0x41000040, 0x40010000, 0x01000000, 0x41000040, 0x00010040, 0x01000040, 0x00010000, 0x01010000, 0x40000000, 0x41010040, 0x40000040, 0x40000000, 0x41010000, 0x00000000, 0x40010000, 0x01010040, 0x00000040, 0x40000040, 0x41010040, 0x00010000, 0x41000000, 0x41010000, 0x01000040, 0x40010040, 0x01010000, 0x00010040, 0x00000000, 0x01000000, 0x40010040, 0x01010040, 0x00000040, 0x40000000, 0x00010000, 0x40000040, 0x40010000, 0x01010000, 0x41000040, 0x00000000, 0x01010040, 0x00010040, 0x41010000, 0x40010000, 0x01000000, 0x41010040, 0x40000000, 0x40010040, 0x41000000, 0x01000000, 0x41010040, 0x00010000, 0x01000040, 0x41000040, 0x00010040, 0x01000040, 0x00000000, 0x41010000, 0x40000040, 0x41000000, 0x40010040, 0x00000040, 0x01010000 }, /* nibble 3 */ { 0x00100402, 0x04000400, 0x00000002, 0x04100402, 0x00000000, 0x04100000, 0x04000402, 0x00100002, 0x04100400, 0x04000002, 0x04000000, 0x00000402, 0x04000002, 0x00100402, 0x00100000, 0x04000000, 0x04100002, 0x00100400, 0x00000400, 0x00000002, 0x00100400, 0x04000402, 0x04100000, 0x00000400, 0x00000402, 0x00000000, 0x00100002, 0x04100400, 0x04000400, 0x04100002, 0x04100402, 0x00100000, 0x04100002, 0x00000402, 0x00100000, 0x04000002, 0x00100400, 0x04000400, 0x00000002, 0x04100000, 0x04000402, 0x00000000, 0x00000400, 0x00100002, 0x00000000, 0x04100002, 0x04100400, 0x00000400, 0x04000000, 0x04100402, 0x00100402, 0x00100000, 0x04100402, 0x00000002, 0x04000400, 0x00100402, 0x00100002, 0x00100400, 0x04100000, 0x04000402, 0x00000402, 0x04000000, 0x04000002, 0x04100400 }, /* nibble 4 */ { 0x02000000, 0x00004000, 0x00000100, 0x02004108, 0x02004008, 0x02000100, 0x00004108, 0x02004000, 0x00004000, 0x00000008, 0x02000008, 0x00004100, 0x02000108, 0x02004008, 0x02004100, 0x00000000, 0x00004100, 0x02000000, 0x00004008, 0x00000108, 0x02000100, 0x00004108, 0x00000000, 0x02000008, 0x00000008, 0x02000108, 0x02004108, 0x00004008, 0x02004000, 0x00000100, 0x00000108, 0x02004100, 0x02004100, 0x02000108, 0x00004008, 0x02004000, 0x00004000, 0x00000008, 0x02000008, 0x02000100, 0x02000000, 0x00004100, 0x02004108, 0x00000000, 0x00004108, 0x02000000, 0x00000100, 0x00004008, 0x02000108, 0x00000100, 0x00000000, 0x02004108, 0x02004008, 0x02004100, 0x00000108, 0x00004000, 0x00004100, 0x02004008, 0x02000100, 0x00000108, 0x00000008, 0x00004108, 0x02004000, 0x02000008 }, /* nibble 5 */ { 0x20000010, 0x00080010, 0x00000000, 0x20080800, 0x00080010, 0x00000800, 0x20000810, 0x00080000, 0x00000810, 0x20080810, 0x00080800, 0x20000000, 0x20000800, 0x20000010, 0x20080000, 0x00080810, 0x00080000, 0x20000810, 0x20080010, 0x00000000, 0x00000800, 0x00000010, 0x20080800, 0x20080010, 0x20080810, 0x20080000, 0x20000000, 0x00000810, 0x00000010, 0x00080800, 0x00080810, 0x20000800, 0x00000810, 0x20000000, 0x20000800, 0x00080810, 0x20080800, 0x00080010, 0x00000000, 0x20000800, 0x20000000, 0x00000800, 0x20080010, 0x00080000, 0x00080010, 0x20080810, 0x00080800, 0x00000010, 0x20080810, 0x00080800, 0x00080000, 0x20000810, 0x20000010, 0x20080000, 0x00080810, 0x00000000, 0x00000800, 0x20000010, 0x20000810, 0x20080800, 0x20080000, 0x00000810, 0x00000010, 0x20080010 }, /* nibble 6 */ { 0x00001000, 0x00000080, 0x00400080, 0x00400001, 0x00401081, 0x00001001, 0x00001080, 0x00000000, 0x00400000, 0x00400081, 0x00000081, 0x00401000, 0x00000001, 0x00401080, 0x00401000, 0x00000081, 0x00400081, 0x00001000, 0x00001001, 0x00401081, 0x00000000, 0x00400080, 0x00400001, 0x00001080, 0x00401001, 0x00001081, 0x00401080, 0x00000001, 0x00001081, 0x00401001, 0x00000080, 0x00400000, 0x00001081, 0x00401000, 0x00401001, 0x00000081, 0x00001000, 0x00000080, 0x00400000, 0x00401001, 0x00400081, 0x00001081, 0x00001080, 0x00000000, 0x00000080, 0x00400001, 0x00000001, 0x00400080, 0x00000000, 0x00400081, 0x00400080, 0x00001080, 0x00000081, 0x00001000, 0x00401081, 0x00400000, 0x00401080, 0x00000001, 0x00001001, 0x00401081, 0x00400001, 0x00401080, 0x00401000, 0x00001001 }, /* nibble 7 */ { 0x08200020, 0x08208000, 0x00008020, 0x00000000, 0x08008000, 0x00200020, 0x08200000, 0x08208020, 0x00000020, 0x08000000, 0x00208000, 0x00008020, 0x00208020, 0x08008020, 0x08000020, 0x08200000, 0x00008000, 0x00208020, 0x00200020, 0x08008000, 0x08208020, 0x08000020, 0x00000000, 0x00208000, 0x08000000, 0x00200000, 0x08008020, 0x08200020, 0x00200000, 0x00008000, 0x08208000, 0x00000020, 0x00200000, 0x00008000, 0x08000020, 0x08208020, 0x00008020, 0x08000000, 0x00000000, 0x00208000, 0x08200020, 0x08008020, 0x08008000, 0x00200020, 0x08208000, 0x00000020, 0x00200020, 0x08008000, 0x08208020, 0x00200000, 0x08200000, 0x08000020, 0x00208000, 0x00008020, 0x08008020, 0x08200000, 0x00000020, 0x08208000, 0x00208020, 0x00000000, 0x08000000, 0x08200020, 0x00008000, 0x00208020 }}; /* Some stuff that used to be in des_locl.h. Heavily modified. */ /* IP and FP * The problem is more of a geometric problem that random bit fiddling. 0 1 2 3 4 5 6 7 62 54 46 38 30 22 14 6 8 9 10 11 12 13 14 15 60 52 44 36 28 20 12 4 16 17 18 19 20 21 22 23 58 50 42 34 26 18 10 2 24 25 26 27 28 29 30 31 to 56 48 40 32 24 16 8 0 32 33 34 35 36 37 38 39 63 55 47 39 31 23 15 7 40 41 42 43 44 45 46 47 61 53 45 37 29 21 13 5 48 49 50 51 52 53 54 55 59 51 43 35 27 19 11 3 56 57 58 59 60 61 62 63 57 49 41 33 25 17 9 1 The output has been subject to swaps of the form 0 1 -> 3 1 but the odd and even bits have been put into 2 3 2 0 different words. The main trick is to remember that t=((l>>size)^r)&(mask); r^=t; l^=(t<>(n))^(b))&(m)),\ (b)^=(t),\ (a)^=((t)<<(n))) #define IP(l,r,t) \ PERM_OP(r,l,t, 4,0x0f0f0f0f); \ PERM_OP(l,r,t,16,0x0000ffff); \ PERM_OP(r,l,t, 2,0x33333333); \ PERM_OP(l,r,t, 8,0x00ff00ff); \ PERM_OP(r,l,t, 1,0x55555555); #define FP(l,r,t) \ PERM_OP(l,r,t, 1,0x55555555); \ PERM_OP(r,l,t, 8,0x00ff00ff); \ PERM_OP(l,r,t, 2,0x33333333); \ PERM_OP(r,l,t,16,0x0000ffff); \ PERM_OP(l,r,t, 4,0x0f0f0f0f); #define D_ENCRYPT(L,R,S) \ u=(R^s[S ]); \ t=R^s[S+1]; \ t=((t>>4)+(t<<28)); \ L^= des_SPtrans[1][(t )&0x3f]| \ des_SPtrans[3][(t>> 8)&0x3f]| \ des_SPtrans[5][(t>>16)&0x3f]| \ des_SPtrans[7][(t>>24)&0x3f]| \ des_SPtrans[0][(u )&0x3f]| \ des_SPtrans[2][(u>> 8)&0x3f]| \ des_SPtrans[4][(u>>16)&0x3f]| \ des_SPtrans[6][(u>>24)&0x3f]; /* This part is based on code that used to be in ecb_enc.c. */ /* Copyright (C) 1993 Eric Young - see README for more details */ static void des_encrypt(word32 l, word32 r, word32 *output, DESContext *ks, int encrypt) { register word32 t,u; register int i; register word32 *s; s = ks->key_schedule; IP(l,r,t); /* Things have been modified so that the initial rotate is * done outside the loop. This required the * des_SPtrans values in sp.h to be rotated 1 bit to the right. * One perl script later and things have a 5% speed up on a sparc2. * Thanks to Richard Outerbridge <71755.204@CompuServe.COM> * for pointing this out. */ t=(r<<1)|(r>>31); r=(l<<1)|(l>>31); l=t; /* I don't know if it is worth the effort of loop unrolling the * inner loop */ if (encrypt) { for (i=0; i<32; i+=4) { D_ENCRYPT(l,r,i+0); /* 1 */ D_ENCRYPT(r,l,i+2); /* 2 */ } } else { for (i=30; i>0; i-=4) { D_ENCRYPT(l,r,i-0); /* 16 */ D_ENCRYPT(r,l,i-2); /* 15 */ } } l=(l>>1)|(l<<31); r=(r>>1)|(r<<31); FP(r,l,t); output[0]=l; output[1]=r; } /* Code based on set_key.c. */ /* Copyright (C) 1993 Eric Young - see README for more details */ #define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\ (a)=(a)^(t)^(t>>(16-(n)))) static void des_set_key(unsigned char *key, DESContext *ks) { register word32 c, d, t, s, shifts; register int i; register word32 *schedule; schedule = ks->key_schedule; c = GET_32BIT_LSB_FIRST(key); d = GET_32BIT_LSB_FIRST(key + 4); /* I now do it in 47 simple operations :-) * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov) * for the inspiration. :-) */ PERM_OP(d,c,t,4,0x0f0f0f0f); HPERM_OP(c,t,-2,0xcccc0000); HPERM_OP(d,t,-2,0xcccc0000); PERM_OP(d,c,t,1,0x55555555); PERM_OP(c,d,t,8,0x00ff00ff); PERM_OP(d,c,t,1,0x55555555); d = ((d & 0xff) << 16) | (d & 0xff00) | ((d >> 16) & 0xff) | ((c >> 4) & 0xf000000); c&=0x0fffffff; shifts = 0x7efc; for (i=0; i < 16; i++) { if (shifts & 1) { c=((c>>2)|(c<<26)); d=((d>>2)|(d<<26)); } else { c=((c>>1)|(c<<27)); d=((d>>1)|(d<<27)); } shifts >>= 1; c&=0x0fffffff; d&=0x0fffffff; /* could be a few less shifts but I am to lazy at this * point in time to investigate */ s = des_skb[0][ (c )&0x3f ] | des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)] | des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)] | des_skb[3][((c>>20)&0x01)|((c>>21)&0x06)|((c>>22)&0x38)]; t = des_skb[4][ (d )&0x3f ] | des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)] | des_skb[6][ (d>>15)&0x3f ] | des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)]; /* table contained 0213 4657 */ *schedule++ = ((t << 16) | (s & 0xffff)); s = ((s >> 16) | (t & 0xffff0000)); *schedule++ = (s << 4) | (s >> 28); } } static void des_cbc_encrypt(DESContext *ks, unsigned char *iv, unsigned char *dest, const unsigned char *src, unsigned int len) { word32 iv0, iv1, out[2]; unsigned int i; assert((len & 7) == 0); iv0 = GET_32BIT_LSB_FIRST(iv); iv1 = GET_32BIT_LSB_FIRST(iv + 4); for (i = 0; i < len; i += 8) { iv0 ^= GET_32BIT_LSB_FIRST(src + i); iv1 ^= GET_32BIT_LSB_FIRST(src + i + 4); des_encrypt(iv0, iv1, out, ks, 1); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_LSB_FIRST(dest + i, iv0); PUT_32BIT_LSB_FIRST(dest + i + 4, iv1); } PUT_32BIT_LSB_FIRST(iv, iv0); PUT_32BIT_LSB_FIRST(iv + 4, iv1); } static void des_cbc_decrypt(DESContext *ks, unsigned char *iv, unsigned char *dest, const unsigned char *src, unsigned int len) { word32 iv0, iv1, d0, d1, out[2]; unsigned int i; assert((len & 7) == 0); iv0 = GET_32BIT_LSB_FIRST(iv); iv1 = GET_32BIT_LSB_FIRST(iv + 4); for (i = 0; i < len; i += 8) { d0 = GET_32BIT_LSB_FIRST(src + i); d1 = GET_32BIT_LSB_FIRST(src + i + 4); des_encrypt(d0, d1, out, ks, 0); iv0 ^= out[0]; iv1 ^= out[1]; PUT_32BIT_LSB_FIRST(dest + i, iv0); PUT_32BIT_LSB_FIRST(dest + i + 4, iv1); iv0 = d0; iv1 = d1; } PUT_32BIT_LSB_FIRST(iv, iv0); PUT_32BIT_LSB_FIRST(iv + 4, iv1); } static void des_3cbc_encrypt(DESContext *ks1, unsigned char *iv1, DESContext *ks2, unsigned char *iv2, DESContext *ks3, unsigned char *iv3, unsigned char *dest, const unsigned char *src, unsigned int len) { des_cbc_encrypt(ks1, iv1, dest, src, len); des_cbc_decrypt(ks2, iv2, dest, dest, len); des_cbc_encrypt(ks3, iv3, dest, dest, len); } static void des_3cbc_decrypt(DESContext *ks1, unsigned char *iv1, DESContext *ks2, unsigned char *iv2, DESContext *ks3, unsigned char *iv3, unsigned char *dest, const unsigned char *src, unsigned int len) { des_cbc_decrypt(ks3, iv3, dest, src, len); des_cbc_encrypt(ks2, iv2, dest, dest, len); des_cbc_decrypt(ks1, iv1, dest, dest, len); } DESContext ekey1, ekey2, ekey3; unsigned char eiv1[8], eiv2[8], eiv3[8]; DESContext dkey1, dkey2, dkey3; unsigned char div1[8], div2[8], div3[8]; static void des3_sesskey(unsigned char *key) { des_set_key(key, &ekey1); des_set_key(key+8, &ekey2); des_set_key(key+16, &ekey3); memset(eiv1, 0, sizeof(eiv1)); memset(eiv2, 0, sizeof(eiv2)); memset(eiv3, 0, sizeof(eiv3)); des_set_key(key, &dkey1); des_set_key(key+8, &dkey2); des_set_key(key+16, &dkey3); memset(div1, 0, sizeof(div1)); memset(div2, 0, sizeof(div2)); memset(div3, 0, sizeof(div3)); } static void des3_encrypt_blk(unsigned char *blk, int len) { des_3cbc_encrypt(&ekey1, eiv1, &ekey2, eiv2, &ekey3, eiv3, blk, blk, len); } static void des3_decrypt_blk(unsigned char *blk, int len) { des_3cbc_decrypt(&dkey1, div1, &dkey2, div2, &dkey3, div3, blk, blk, len); } struct ssh_cipher ssh_3des = { des3_sesskey, des3_encrypt_blk, des3_decrypt_blk }; #ifdef DES_TEST void des_encrypt_buf(DESContext *ks, unsigned char *out, const unsigned char *in, int encrypt) { word32 in0, in1, output[0]; in0 = GET_32BIT_LSB_FIRST(in); in1 = GET_32BIT_LSB_FIRST(in + 4); des_encrypt(in0, in1, output, ks, encrypt); PUT_32BIT_LSB_FIRST(out, output[0]); PUT_32BIT_LSB_FIRST(out + 4, output[1]); } int main(int ac, char **av) { FILE *f; char line[1024], *cp; int i, value; unsigned char key[8], data[8], result[8], output[8]; DESContext ks; while (fgets(line, sizeof(line), stdin)) { for (i = 0; i < 8; i++) { if (sscanf(line + 2 * i, "%02x", &value) != 1) { fprintf(stderr, "1st col, i = %d, line: %s", i, line); exit(1); } key[i] = value; } for (i = 0; i < 8; i++) { if (sscanf(line + 2 * i + 17, "%02x", &value) != 1) { fprintf(stderr, "2nd col, i = %d, line: %s", i, line); exit(1); } data[i] = value; } for (i = 0; i < 8; i++) { if (sscanf(line + 2 * i + 2*17, "%02x", &value) != 1) { fprintf(stderr, "3rd col, i = %d, line: %s", i, line); exit(1); } result[i] = value; } des_set_key(key, &ks); des_encrypt_buf(&ks, output, data, 1); if (memcmp(output, result, 8) != 0) fprintf(stderr, "Encrypt failed: %s", line); des_encrypt_buf(&ks, output, result, 0); if (memcmp(output, data, 8) != 0) fprintf(stderr, "Decrypt failed: %s", line); } exit(0); } #endif /* DES_TEST */ Node-path: putty/sshmd5.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 8296 Text-content-md5: d47275d160983e0412e047b6b22981d3 Text-content-sha1: 9aad8314438e9e92829edf06bc9f2969e8ced025 Content-length: 8412 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNZZZ/* This code has been heavily hacked by Tatu Ylonen to make it compile on machines like Cray that don't have a 32 bit integer type. */ /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. * * To compute the message digest of a chunk of bytes, declare an * MD5Context structure, pass it to MD5Init, call MD5Update as * needed on buffers full of bytes, and then call MD5Final, which * will fill a supplied 16-byte array with the digest. */ #include "ssh.h" #define GET_32BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8) | \ ((unsigned long)(unsigned char)(cp)[2] << 16) | \ ((unsigned long)(unsigned char)(cp)[3] << 24)) #define PUT_32BIT_LSB_FIRST(cp, value) do { \ (cp)[0] = (value); \ (cp)[1] = (value) >> 8; \ (cp)[2] = (value) >> 16; \ (cp)[3] = (value) >> 24; } while (0) void MD5Transform(uint32 buf[4], const unsigned char in[64]); /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ void MD5Init(struct MD5Context *ctx) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bits[0] = 0; ctx->bits[1] = 0; } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) { uint32 t; /* Update bitcount */ t = ctx->bits[0]; if ((ctx->bits[0] = (t + ((uint32)len << 3)) & 0xffffffff) < t) ctx->bits[1]++; /* Carry from low to high */ ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ /* Handle any leading odd-sized chunks */ if (t) { unsigned char *p = ctx->in + t; t = 64 - t; if (len < t) { memcpy(p, buf, len); return; } memcpy(p, buf, t); MD5Transform(ctx->buf, ctx->in); buf += t; len -= t; } /* Process data in 64-byte chunks */ while (len >= 64) { memcpy(ctx->in, buf, 64); MD5Transform(ctx->buf, ctx->in); buf += 64; len -= 64; } /* Handle any remaining bytes of data. */ memcpy(ctx->in, buf, len); } /* * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ void MD5Final(unsigned char digest[16], struct MD5Context *ctx) { unsigned count; unsigned char *p; /* Compute number of bytes mod 64 */ count = (ctx->bits[0] >> 3) & 0x3F; /* Set the first char of padding to 0x80. This is safe since there is always at least one byte free */ p = ctx->in + count; *p++ = 0x80; /* Bytes of padding needed to make 64 bytes */ count = 64 - 1 - count; /* Pad out to 56 mod 64 */ if (count < 8) { /* Two lots of padding: Pad the first block to 64 bytes */ memset(p, 0, count); MD5Transform(ctx->buf, ctx->in); /* Now fill the next block with 56 bytes */ memset(ctx->in, 0, 56); } else { /* Pad block to 56 bytes */ memset(p, 0, count - 8); } /* Append length in bits and transform */ PUT_32BIT_LSB_FIRST(ctx->in + 56, ctx->bits[0]); PUT_32BIT_LSB_FIRST(ctx->in + 60, ctx->bits[1]); MD5Transform(ctx->buf, ctx->in); PUT_32BIT_LSB_FIRST(digest, ctx->buf[0]); PUT_32BIT_LSB_FIRST(digest + 4, ctx->buf[1]); PUT_32BIT_LSB_FIRST(digest + 8, ctx->buf[2]); PUT_32BIT_LSB_FIRST(digest + 12, ctx->buf[3]); memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ } #ifndef ASM_MD5 /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #define MD5STEP(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ void MD5Transform(uint32 buf[4], const unsigned char inext[64]) { register word32 a, b, c, d, i; word32 in[16]; for (i = 0; i < 16; i++) in[i] = GET_32BIT_LSB_FIRST(inext + 4 * i); a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } #endif Node-path: putty/sshrand.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4672 Text-content-md5: c0c75f9434b6cd5988c0c22d3bfd4ba7 Text-content-sha1: f879ca887ace22301c38622be419e17744c77a97 Content-length: 4788 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN222/* * cryptographic random number generator for PuTTY's ssh client */ #include "ssh.h" void noise_get_heavy(void (*func) (void *, int)); void noise_get_light(void (*func) (void *, int)); /* * `pool' itself is a pool of random data which we actually use: we * return bytes from `pool', at position `poolpos', until `poolpos' * reaches the end of the pool. At this point we generate more * random data, by adding noise, stirring well, and resetting * `poolpos' to point to just past the beginning of the pool (not * _the_ beginning, since otherwise we'd give away the whole * contents of our pool, and attackers would just have to guess the * next lot of noise). * * `incomingb' buffers acquired noise data, until it gets full, at * which point the acquired noise is SHA'ed into `incoming' and * `incomingb' is cleared. The noise in `incoming' is used as part * of the noise for each stirring of the pool, in addition to local * time, process listings, and other such stuff. */ #define HASHINPUT 64 /* 64 bytes SHA input */ #define HASHSIZE 20 /* 160 bits SHA output */ #define POOLSIZE 1200 /* size of random pool */ struct RandPool { unsigned char pool[POOLSIZE]; int poolpos; unsigned char incoming[HASHSIZE]; unsigned char incomingb[HASHINPUT]; int incomingpos; }; static struct RandPool pool; void random_add_noise(void *noise, int length) { unsigned char *p = noise; while (length >= (HASHINPUT - pool.incomingpos)) { memcpy(pool.incomingb + pool.incomingpos, p, HASHINPUT - pool.incomingpos); p += HASHINPUT - pool.incomingpos; length -= HASHINPUT - pool.incomingpos; SHATransform((word32 *)pool.incoming, (word32 *)pool.incomingb); pool.incomingpos = 0; } memcpy(pool.incomingb, p, length); pool.incomingpos = length; } void random_stir(void) { word32 block[HASHINPUT/sizeof(word32)]; word32 digest[HASHSIZE/sizeof(word32)]; int i, j, k; noise_get_light(random_add_noise); SHATransform((word32 *)pool.incoming, (word32 *)pool.incomingb); pool.incomingpos = 0; /* * Chunks of this code are blatantly endianness-dependent, but * as it's all random bits anyway, WHO CARES? */ memcpy(digest, pool.incoming, sizeof(digest)); /* * Make two passes over the pool. */ for (i = 0; i < 2; i++) { /* * We operate SHA in CFB mode, repeatedly adding the same * block of data to the digest. But we're also fiddling * with the digest-so-far, so this shouldn't be Bad or * anything. */ memcpy(block, pool.pool, sizeof(block)); /* * Each pass processes the pool backwards in blocks of * HASHSIZE, just so that in general we get the output of * SHA before the corresponding input, in the hope that * things will be that much less predictable that way * round, when we subsequently return bytes ... */ for (j = POOLSIZE; (j -= HASHSIZE) >= 0 ;) { /* * XOR the bit of the pool we're processing into the * digest. */ for (k = 0; k < sizeof(digest)/sizeof(*digest); k++) digest[k] ^= ((word32 *)(pool.pool+j))[k]; /* * Munge our unrevealed first block of the pool into * it. */ SHATransform(digest, block); /* * Stick the result back into the pool. */ for (k = 0; k < sizeof(digest)/sizeof(*digest); k++) ((word32 *)(pool.pool+j))[k] = digest[k]; } } /* * Might as well save this value back into `incoming', just so * there'll be some extra bizarreness there. */ SHATransform(digest, block); memcpy(digest, pool.incoming, sizeof(digest)); pool.poolpos = sizeof(pool.incoming); } static void random_add_heavynoise(void *noise, int length) { unsigned char *p = noise; while (length >= (POOLSIZE - pool.poolpos)) { memcpy(pool.pool + pool.poolpos, p, POOLSIZE - pool.poolpos); p += POOLSIZE - pool.poolpos; length -= POOLSIZE - pool.poolpos; random_stir(); pool.poolpos = 0; } memcpy(pool.pool, p, length); pool.poolpos = length; } void random_init(void) { memset(&pool, 0, sizeof(pool)); /* just to start with */ /* * For noise_get_heavy, we temporarily use `poolpos' as the * pointer for addition of noise, rather than extraction of * random numbers. */ pool.poolpos = 0; noise_get_heavy(random_add_heavynoise); random_stir(); } int random_byte(void) { if (pool.poolpos >= POOLSIZE) random_stir(); return pool.pool[pool.poolpos++]; } void random_get_savedata(void **data, int *len) { random_stir(); *data = pool.pool+pool.poolpos; *len = POOLSIZE/2; } Node-path: putty/sshrsa.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 8070 Text-content-md5: f71d39341da175d27d6b697831eebefa Text-content-sha1: d6d68273f6fbab468e98088e9d6478f7d7d22bf5 Content-length: 8186 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNxxx/* * RSA implementation just sufficient for ssh client-side * initialisation step */ /*#include #define RSADEBUG #define DLVL 2 #include "stel.h"*/ #include #include #include #include "ssh.h" typedef unsigned short *Bignum; static unsigned short Zero[1] = { 0 }; #if defined TESTMODE || defined RSADEBUG #ifndef DLVL #define DLVL 10000 #endif #define debug(x) bndebug(#x,x) static int level = 0; static void bndebug(char *name, Bignum b) { int i; int w = 50-level-strlen(name)-5*b[0]; if (level >= DLVL) return; if (w < 0) w = 0; dprintf("%*s%s%*s", level, "", name, w, ""); for (i=b[0]; i>0; i--) dprintf(" %04x", b[i]); dprintf("\n"); } #define dmsg(x) do {if(level0; i--) if (r[i]) break; j = (i-1)*16; n = r[i]; if (n & 0xFF00) j += 8, n >>= 8; if (n & 0x00F0) j += 4, n >>= 4; if (n & 0x000C) j += 2, n >>= 2; if (n & 0x0002) j += 1, n >>= 1; return j; } static void add(Bignum r1, Bignum r2, Bignum result) { int i; long stuff = 0; enter((">add\n")); debug(r1); debug(r2); for (i = 1 ;; i++) { if (i <= r1[0]) stuff += r1[i]; if (i <= r2[0]) stuff += r2[i]; if (i <= result[0]) result[i] = stuff & 0xFFFFU; if (i > r1[0] && i > r2[0] && i >= result[0]) break; stuff >>= 16; } debug(result); leave(("sub\n")); debug(r1); debug(r2); for (i = 1 ;; i++) { if (i <= r1[0]) stuff += r1[i]; if (i <= r2[0]) stuff -= r2[i]; if (i <= result[0]) result[i] = stuff & 0xFFFFU; if (i > r1[0] && i > r2[0] && i >= result[0]) break; stuff = stuff<0 ? -1 : 0; } debug(result); leave(("ge\n")); debug(r1); debug(r2); if (r1[0] < r2[0]) i = r2[0]; else i = r1[0]; while (i > 0) { unsigned short n1 = (i > r1[0] ? 0 : r1[i]); unsigned short n2 = (i > r2[0] ? 0 : r2[i]); if (n1 > n2) { dmsg(("greater\n")); leave((" r2 */ } else if (n1 < n2) { dmsg(("less\n")); leave(("modmult\n")); debug(r1); debug(r2); debug(modulus); for (i=1; i<=result[0]; i++) result[i] = 0; /* result := 0 */ for (i=1; i<=temp[0]; i++) temp[i] = (i > r2[0] ? 0 : r2[i]); /* temp := r2 */ bits = 1+msb(r1); for (bit = 0; bit < bits; bit++) { digit = 1 + bit / 16; smallbit = bit % 16; debug(temp); if (digit <= r1[0] && (r1[digit] & (1<modpow\n")); debug(r1); debug(r2); debug(modulus); for (i=1; i<=result[0]; i++) result[i] = (i==1); /* result := 1 */ for (i=1; i<=temp[0]; i++) temp[i] = (i > r1[0] ? 0 : r1[i]); /* temp := r1 */ bits = 1+msb(r2); for (bit = 0; bit < bits; bit++) { digit = 1 + bit / 16; smallbit = bit % 16; debug(temp); if (digit <= r2[0] && (r2[digit] & (1<bits = 0; for (i=0; i<4; i++) result->bits = (result->bits << 8) + *p++; for (j=0; j<2; j++) { w = 0; for (i=0; i<2; i++) w = (w << 8) + *p++; result->bytes = b = (w+7)/8; /* bits -> bytes */ w = (w+15)/16; /* bits -> words */ bn[j] = newbn(w); if (keystr) *keystr = p; /* point at key string, second time */ for (i=1; i<=w; i++) bn[j][i] = 0; for (i=0; iexponent = bn[0]; result->modulus = bn[1]; return p - data; } void rsaencrypt(unsigned char *data, int length, struct RSAKey *key) { Bignum b1, b2; int w, i; unsigned char *p; debug(key->exponent); memmove(data+key->bytes-length, data, length); data[0] = 0; data[1] = 2; for (i = 2; i < key->bytes-length-1; i++) { do { data[i] = random_byte(); } while (data[i] == 0); } data[key->bytes-length-1] = 0; w = (key->bytes+1)/2; b1 = newbn(w); b2 = newbn(w); p = data; for (i=1; i<=w; i++) b1[i] = 0; for (i=0; ibytes; i++) { unsigned char byte = *p++; if ((key->bytes-i) & 1) b1[w-i/2] |= byte; else b1[w-i/2] |= byte<<8; } debug(b1); modpow(b1, key->exponent, key->modulus, b2); debug(b2); p = data; for (i=0; ibytes; i++) { unsigned char b; if (i & 1) b = b2[w-i/2] & 0xFF; else b = b2[w-i/2] >> 8; *p++ = b; } freebn(b1); freebn(b2); } int rsastr_len(struct RSAKey *key) { Bignum md, ex; md = key->modulus; ex = key->exponent; return 4 * (ex[0]+md[0]) + 10; } void rsastr_fmt(char *str, struct RSAKey *key) { Bignum md, ex; int len = 0, i; md = key->modulus; ex = key->exponent; for (i=1; i<=ex[0]; i++) { sprintf(str+len, "%04x", ex[i]); len += strlen(str+len); } str[len++] = '/'; for (i=1; i<=md[0]; i++) { sprintf(str+len, "%04x", md[i]); len += strlen(str+len); } str[len] = '\0'; } #ifdef TESTMODE #ifndef NODDY #define p1 10007 #define p2 10069 #define p3 10177 #else #define p1 3 #define p2 7 #define p3 13 #endif unsigned short P1[2] = { 1, p1 }; unsigned short P2[2] = { 1, p2 }; unsigned short P3[2] = { 1, p3 }; unsigned short bigmod[5] = { 4, 0, 0, 0, 32768U }; unsigned short mod[5] = { 4, 0, 0, 0, 0 }; unsigned short a[5] = { 4, 0, 0, 0, 0 }; unsigned short b[5] = { 4, 0, 0, 0, 0 }; unsigned short c[5] = { 4, 0, 0, 0, 0 }; unsigned short One[2] = { 1, 1 }; unsigned short Two[2] = { 1, 2 }; int main(void) { modmult(P1, P2, bigmod, a); debug(a); modmult(a, P3, bigmod, mod); debug(mod); sub(P1, One, a); debug(a); sub(P2, One, b); debug(b); modmult(a, b, bigmod, c); debug(c); sub(P3, One, a); debug(a); modmult(a, c, bigmod, b); debug(b); modpow(Two, b, mod, a); debug(a); return 0; } #endif Node-path: putty/sshsha.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 6486 Text-content-md5: b69a40d3ca1f7a403e60490d00874be3 Text-content-sha1: b07762aa25421251ff327e2718737cefc849910f Content-length: 6602 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNHHH/* * The following code was taken directly from drivers/char/random.c * in the Linux kernel. */ #include "ssh.h" /* * SHA transform algorithm, taken from code written by Peter Gutman, * and apparently in the public domain. */ /* The SHA f()-functions. */ #define f1(x,y,z) ( z ^ ( x & ( y ^ z ) ) ) /* Rounds 0-19 */ #define f2(x,y,z) ( x ^ y ^ z ) /* Rounds 20-39 */ #define f3(x,y,z) ( ( x & y ) | ( z & ( x | y ) ) ) /* Rounds 40-59 */ #define f4(x,y,z) ( x ^ y ^ z ) /* Rounds 60-79 */ /* The SHA Mysterious Constants */ #define K1 0x5A827999L /* Rounds 0-19 */ #define K2 0x6ED9EBA1L /* Rounds 20-39 */ #define K3 0x8F1BBCDCL /* Rounds 40-59 */ #define K4 0xCA62C1D6L /* Rounds 60-79 */ #define ROTL(n,X) ( ( ( X ) << n ) | ( ( X ) >> ( 32 - n ) ) ) #define expand(W,i) ( W[ i & 15 ] = \ ROTL( 1, ( W[ i & 15 ] ^ W[ (i - 14) & 15 ] ^ \ W[ (i - 8) & 15 ] ^ W[ (i - 3) & 15 ] ) ) ) #define subRound(a, b, c, d, e, f, k, data) \ ( e += ROTL( 5, a ) + f( b, c, d ) + k + data, b = ROTL( 30, b ) ) void SHATransform(word32 *digest, word32 *data) { word32 A, B, C, D, E; /* Local vars */ word32 eData[ 16 ]; /* Expanded data */ /* Set up first buffer and local data buffer */ A = digest[ 0 ]; B = digest[ 1 ]; C = digest[ 2 ]; D = digest[ 3 ]; E = digest[ 4 ]; memcpy( eData, data, 16*sizeof(word32)); /* Heavy mangling, in 4 sub-rounds of 20 iterations each. */ subRound( A, B, C, D, E, f1, K1, eData[ 0 ] ); subRound( E, A, B, C, D, f1, K1, eData[ 1 ] ); subRound( D, E, A, B, C, f1, K1, eData[ 2 ] ); subRound( C, D, E, A, B, f1, K1, eData[ 3 ] ); subRound( B, C, D, E, A, f1, K1, eData[ 4 ] ); subRound( A, B, C, D, E, f1, K1, eData[ 5 ] ); subRound( E, A, B, C, D, f1, K1, eData[ 6 ] ); subRound( D, E, A, B, C, f1, K1, eData[ 7 ] ); subRound( C, D, E, A, B, f1, K1, eData[ 8 ] ); subRound( B, C, D, E, A, f1, K1, eData[ 9 ] ); subRound( A, B, C, D, E, f1, K1, eData[ 10 ] ); subRound( E, A, B, C, D, f1, K1, eData[ 11 ] ); subRound( D, E, A, B, C, f1, K1, eData[ 12 ] ); subRound( C, D, E, A, B, f1, K1, eData[ 13 ] ); subRound( B, C, D, E, A, f1, K1, eData[ 14 ] ); subRound( A, B, C, D, E, f1, K1, eData[ 15 ] ); subRound( E, A, B, C, D, f1, K1, expand( eData, 16 ) ); subRound( D, E, A, B, C, f1, K1, expand( eData, 17 ) ); subRound( C, D, E, A, B, f1, K1, expand( eData, 18 ) ); subRound( B, C, D, E, A, f1, K1, expand( eData, 19 ) ); subRound( A, B, C, D, E, f2, K2, expand( eData, 20 ) ); subRound( E, A, B, C, D, f2, K2, expand( eData, 21 ) ); subRound( D, E, A, B, C, f2, K2, expand( eData, 22 ) ); subRound( C, D, E, A, B, f2, K2, expand( eData, 23 ) ); subRound( B, C, D, E, A, f2, K2, expand( eData, 24 ) ); subRound( A, B, C, D, E, f2, K2, expand( eData, 25 ) ); subRound( E, A, B, C, D, f2, K2, expand( eData, 26 ) ); subRound( D, E, A, B, C, f2, K2, expand( eData, 27 ) ); subRound( C, D, E, A, B, f2, K2, expand( eData, 28 ) ); subRound( B, C, D, E, A, f2, K2, expand( eData, 29 ) ); subRound( A, B, C, D, E, f2, K2, expand( eData, 30 ) ); subRound( E, A, B, C, D, f2, K2, expand( eData, 31 ) ); subRound( D, E, A, B, C, f2, K2, expand( eData, 32 ) ); subRound( C, D, E, A, B, f2, K2, expand( eData, 33 ) ); subRound( B, C, D, E, A, f2, K2, expand( eData, 34 ) ); subRound( A, B, C, D, E, f2, K2, expand( eData, 35 ) ); subRound( E, A, B, C, D, f2, K2, expand( eData, 36 ) ); subRound( D, E, A, B, C, f2, K2, expand( eData, 37 ) ); subRound( C, D, E, A, B, f2, K2, expand( eData, 38 ) ); subRound( B, C, D, E, A, f2, K2, expand( eData, 39 ) ); subRound( A, B, C, D, E, f3, K3, expand( eData, 40 ) ); subRound( E, A, B, C, D, f3, K3, expand( eData, 41 ) ); subRound( D, E, A, B, C, f3, K3, expand( eData, 42 ) ); subRound( C, D, E, A, B, f3, K3, expand( eData, 43 ) ); subRound( B, C, D, E, A, f3, K3, expand( eData, 44 ) ); subRound( A, B, C, D, E, f3, K3, expand( eData, 45 ) ); subRound( E, A, B, C, D, f3, K3, expand( eData, 46 ) ); subRound( D, E, A, B, C, f3, K3, expand( eData, 47 ) ); subRound( C, D, E, A, B, f3, K3, expand( eData, 48 ) ); subRound( B, C, D, E, A, f3, K3, expand( eData, 49 ) ); subRound( A, B, C, D, E, f3, K3, expand( eData, 50 ) ); subRound( E, A, B, C, D, f3, K3, expand( eData, 51 ) ); subRound( D, E, A, B, C, f3, K3, expand( eData, 52 ) ); subRound( C, D, E, A, B, f3, K3, expand( eData, 53 ) ); subRound( B, C, D, E, A, f3, K3, expand( eData, 54 ) ); subRound( A, B, C, D, E, f3, K3, expand( eData, 55 ) ); subRound( E, A, B, C, D, f3, K3, expand( eData, 56 ) ); subRound( D, E, A, B, C, f3, K3, expand( eData, 57 ) ); subRound( C, D, E, A, B, f3, K3, expand( eData, 58 ) ); subRound( B, C, D, E, A, f3, K3, expand( eData, 59 ) ); subRound( A, B, C, D, E, f4, K4, expand( eData, 60 ) ); subRound( E, A, B, C, D, f4, K4, expand( eData, 61 ) ); subRound( D, E, A, B, C, f4, K4, expand( eData, 62 ) ); subRound( C, D, E, A, B, f4, K4, expand( eData, 63 ) ); subRound( B, C, D, E, A, f4, K4, expand( eData, 64 ) ); subRound( A, B, C, D, E, f4, K4, expand( eData, 65 ) ); subRound( E, A, B, C, D, f4, K4, expand( eData, 66 ) ); subRound( D, E, A, B, C, f4, K4, expand( eData, 67 ) ); subRound( C, D, E, A, B, f4, K4, expand( eData, 68 ) ); subRound( B, C, D, E, A, f4, K4, expand( eData, 69 ) ); subRound( A, B, C, D, E, f4, K4, expand( eData, 70 ) ); subRound( E, A, B, C, D, f4, K4, expand( eData, 71 ) ); subRound( D, E, A, B, C, f4, K4, expand( eData, 72 ) ); subRound( C, D, E, A, B, f4, K4, expand( eData, 73 ) ); subRound( B, C, D, E, A, f4, K4, expand( eData, 74 ) ); subRound( A, B, C, D, E, f4, K4, expand( eData, 75 ) ); subRound( E, A, B, C, D, f4, K4, expand( eData, 76 ) ); subRound( D, E, A, B, C, f4, K4, expand( eData, 77 ) ); subRound( C, D, E, A, B, f4, K4, expand( eData, 78 ) ); subRound( B, C, D, E, A, f4, K4, expand( eData, 79 ) ); /* Build message digest */ digest[ 0 ] += A; digest[ 1 ] += B; digest[ 2 ] += C; digest[ 3 ] += D; digest[ 4 ] += E; } Node-path: putty/telnet.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 19838 Text-content-md5: e3f5ef0291e770c1325d4abe3c4fc74d Text-content-sha1: c11980b920156e4b8a1b57bd110cb9c407f533e3 Content-length: 19954 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNmmm#include #include #include #include #include "putty.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif static SOCKET s = INVALID_SOCKET; #define IAC 255 /* interpret as command: */ #define DONT 254 /* you are not to use option */ #define DO 253 /* please, you use option */ #define WONT 252 /* I won't use option */ #define WILL 251 /* I will use option */ #define SB 250 /* interpret as subnegotiation */ #define SE 240 /* end sub negotiation */ #define GA 249 /* you may reverse the line */ #define EL 248 /* erase the current line */ #define EC 247 /* erase the current character */ #define AYT 246 /* are you there */ #define AO 245 /* abort output--but let prog finish */ #define IP 244 /* interrupt process--permanently */ #define BREAK 243 /* break */ #define DM 242 /* data mark--for connect. cleaning */ #define NOP 241 /* nop */ #define EOR 239 /* end of record (transparent mode) */ #define ABORT 238 /* Abort process */ #define SUSP 237 /* Suspend process */ #define xEOF 236 /* End of file: EOF is already used... */ #define TELOPT_BINARY 0 /* 8-bit data path */ #define TELOPT_ECHO 1 /* echo */ #define TELOPT_RCP 2 /* prepare to reconnect */ #define TELOPT_SGA 3 /* suppress go ahead */ #define TELOPT_NAMS 4 /* approximate message size */ #define TELOPT_STATUS 5 /* give status */ #define TELOPT_TM 6 /* timing mark */ #define TELOPT_RCTE 7 /* remote controlled transmission and echo */ #define TELOPT_NAOL 8 /* negotiate about output line width */ #define TELOPT_NAOP 9 /* negotiate about output page size */ #define TELOPT_NAOCRD 10 /* negotiate about CR disposition */ #define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */ #define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */ #define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */ #define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */ #define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */ #define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */ #define TELOPT_XASCII 17 /* extended ascic character set */ #define TELOPT_LOGOUT 18 /* force logout */ #define TELOPT_BM 19 /* byte macro */ #define TELOPT_DET 20 /* data entry terminal */ #define TELOPT_SUPDUP 21 /* supdup protocol */ #define TELOPT_SUPDUPOUTPUT 22 /* supdup output */ #define TELOPT_SNDLOC 23 /* send location */ #define TELOPT_TTYPE 24 /* terminal type */ #define TELOPT_EOR 25 /* end or record */ #define TELOPT_TUID 26 /* TACACS user identification */ #define TELOPT_OUTMRK 27 /* output marking */ #define TELOPT_TTYLOC 28 /* terminal location number */ #define TELOPT_3270REGIME 29 /* 3270 regime */ #define TELOPT_X3PAD 30 /* X.3 PAD */ #define TELOPT_NAWS 31 /* window size */ #define TELOPT_TSPEED 32 /* terminal speed */ #define TELOPT_LFLOW 33 /* remote flow control */ #define TELOPT_LINEMODE 34 /* Linemode option */ #define TELOPT_XDISPLOC 35 /* X Display Location */ #define TELOPT_OLD_ENVIRON 36 /* Old - Environment variables */ #define TELOPT_AUTHENTICATION 37/* Authenticate */ #define TELOPT_ENCRYPT 38 /* Encryption option */ #define TELOPT_NEW_ENVIRON 39 /* New - Environment variables */ #define TELOPT_EXOPL 255 /* extended-options-list */ #define TELQUAL_IS 0 /* option is... */ #define TELQUAL_SEND 1 /* send option */ #define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */ #define BSD_VAR 1 #define BSD_VALUE 0 #define RFC_VAR 0 #define RFC_VALUE 1 #define CR 13 #define LF 10 #define NUL 0 #define iswritable(x) ( (x) != IAC && (x) != CR ) static char *telopt(int opt) { #define i(x) if (opt == TELOPT_ ## x) return #x; i(BINARY); i(ECHO); i(RCP); i(SGA); i(NAMS); i(STATUS); i(TM); i(RCTE); i(NAOL); i(NAOP); i(NAOCRD); i(NAOHTS); i(NAOHTD); i(NAOFFD); i(NAOVTS); i(NAOVTD); i(NAOLFD); i(XASCII); i(LOGOUT); i(BM); i(DET); i(SUPDUP); i(SUPDUPOUTPUT); i(SNDLOC); i(TTYPE); i(EOR); i(TUID); i(OUTMRK); i(TTYLOC); i(X3PAD); i(NAWS); i(TSPEED); i(LFLOW); i(LINEMODE); i(XDISPLOC); i(OLD_ENVIRON); i(AUTHENTICATION); i(ENCRYPT); i(NEW_ENVIRON); i(EXOPL); #undef i return ""; } static void telnet_size(void); struct Opt { int send; /* what we initially send */ int nsend; /* -ve send if requested to stop it */ int ack, nak; /* +ve and -ve acknowledgements */ int option; /* the option code */ enum { REQUESTED, ACTIVE, INACTIVE, REALLY_INACTIVE } state; }; static struct Opt o_naws = {WILL, WONT, DO, DONT, TELOPT_NAWS, REQUESTED}; static struct Opt o_tspeed = {WILL, WONT, DO, DONT, TELOPT_TSPEED, REQUESTED}; static struct Opt o_ttype = {WILL, WONT, DO, DONT, TELOPT_TTYPE, REQUESTED}; static struct Opt o_oenv = {WILL, WONT, DO, DONT, TELOPT_OLD_ENVIRON, INACTIVE}; static struct Opt o_nenv = {WILL, WONT, DO, DONT, TELOPT_NEW_ENVIRON, REQUESTED}; static struct Opt o_echo = {DO, DONT, WILL, WONT, TELOPT_ECHO, REQUESTED}; static struct Opt o_we_sga = {WILL, WONT, DO, DONT, TELOPT_SGA, REQUESTED}; static struct Opt o_they_sga = {DO, DONT, WILL, WONT, TELOPT_SGA, REQUESTED}; static struct Opt *opts[] = { &o_naws, &o_tspeed, &o_ttype, &o_oenv, &o_nenv, &o_echo, &o_we_sga, &o_they_sga, NULL }; #if 0 static int in_synch; #endif static int sb_opt, sb_len; static char *sb_buf = NULL; static int sb_size = 0; #define SB_DELTA 1024 static void try_write (void) { while (outbuf_head != outbuf_reap) { int end = (outbuf_reap < outbuf_head ? outbuf_head : OUTBUF_SIZE); int len = end - outbuf_reap; int ret; ret = send (s, outbuf+outbuf_reap, len, 0); if (ret > 0) outbuf_reap = (outbuf_reap + ret) & OUTBUF_MASK; if (ret < len) return; } } static void s_write (void *buf, int len) { unsigned char *p = buf; while (len--) { int new_head = (outbuf_head + 1) & OUTBUF_MASK; if (new_head != outbuf_reap) { outbuf[outbuf_head] = *p++; outbuf_head = new_head; } } try_write(); } static void c_write (char *buf, int len) { while (len--) { int new_head = (inbuf_head + 1) & INBUF_MASK; int c = (unsigned char) *buf; if (new_head != inbuf_reap) { inbuf[inbuf_head] = *buf++; inbuf_head = new_head; } } } static void log_option (char *sender, int cmd, int option) { char buf[50]; sprintf(buf, "%s:\t%s %s", sender, (cmd == WILL ? "WILL" : cmd == WONT ? "WONT" : cmd == DO ? "DO" : cmd == DONT ? "DONT" : ""), telopt(option)); lognegot(buf); } static void send_opt (int cmd, int option) { unsigned char b[3]; b[0] = IAC; b[1] = cmd; b[2] = option; s_write (b, 3); log_option("client", cmd, option); } static void deactivate_option (struct Opt *o) { if (o->state == REQUESTED || o->state == ACTIVE) send_opt (o->nsend, o->option); o->state = REALLY_INACTIVE; } static void activate_option (struct Opt *o) { if (o->send == WILL && o->option == TELOPT_NAWS) telnet_size(); if (o->send == WILL && (o->option == TELOPT_NEW_ENVIRON || o->option == TELOPT_OLD_ENVIRON)) { /* * We may only have one kind of ENVIRON going at a time. * This is a hack, but who cares. */ deactivate_option (o->option==TELOPT_NEW_ENVIRON ? &o_oenv : &o_nenv); } } static void refused_option (struct Opt *o) { if (o->send == WILL && o->option == TELOPT_NEW_ENVIRON && o_oenv.state == INACTIVE) { send_opt (WILL, TELOPT_OLD_ENVIRON); o_oenv.state = REQUESTED; } } static void proc_rec_opt (int cmd, int option) { struct Opt **o; log_option ("server", cmd, option); for (o = opts; *o; o++) { if ((*o)->option == option && (*o)->ack == cmd) { switch ((*o)->state) { case REQUESTED: (*o)->state = ACTIVE; activate_option (*o); break; case ACTIVE: break; case INACTIVE: (*o)->state = ACTIVE; send_opt ((*o)->send, option); activate_option (*o); break; case REALLY_INACTIVE: send_opt ((*o)->nsend, option); break; } return; } else if ((*o)->option == option && (*o)->nak == cmd) { switch ((*o)->state) { case REQUESTED: (*o)->state = INACTIVE; refused_option (*o); break; case ACTIVE: (*o)->state = INACTIVE; send_opt ((*o)->nsend, option); break; case INACTIVE: case REALLY_INACTIVE: break; } return; } } /* * If we reach here, the option was one we weren't prepared to * cope with. So send a negative ack. */ send_opt ((cmd == WILL ? DONT : WONT), option); } static void process_subneg (void) { unsigned char b[2048], *p, *q; int var, value, n; char *e; switch (sb_opt) { case TELOPT_TSPEED: if (sb_len == 1 && sb_buf[0] == TELQUAL_SEND) { char logbuf[sizeof(cfg.termspeed)+80]; b[0] = IAC; b[1] = SB; b[2] = TELOPT_TSPEED; b[3] = TELQUAL_IS; strcpy(b+4, cfg.termspeed); n = 4 + strlen(cfg.termspeed); b[n] = IAC; b[n+1] = SE; s_write (b, n+2); lognegot("server:\tSB TSPEED SEND"); sprintf(logbuf, "client:\tSB TSPEED IS %s", cfg.termspeed); lognegot (logbuf); } else lognegot ("server:\tSB TSPEED "); break; case TELOPT_TTYPE: if (sb_len == 1 && sb_buf[0] == TELQUAL_SEND) { char logbuf[sizeof(cfg.termtype)+80]; b[0] = IAC; b[1] = SB; b[2] = TELOPT_TTYPE; b[3] = TELQUAL_IS; for (n = 0; cfg.termtype[n]; n++) b[n+4] = (cfg.termtype[n] >= 'a' && cfg.termtype[n] <= 'z' ? cfg.termtype[n] + 'A'-'a' : cfg.termtype[n]); b[n+4] = IAC; b[n+5] = SE; s_write (b, n+6); b[n+4] = 0; lognegot("server:\tSB TTYPE SEND"); sprintf(logbuf, "client:\tSB TTYPE IS %s", b+4); lognegot(logbuf); } else lognegot("server:\tSB TTYPE \r\n"); break; case TELOPT_OLD_ENVIRON: case TELOPT_NEW_ENVIRON: p = sb_buf; q = p + sb_len; if (p < q && *p == TELQUAL_SEND) { char logbuf[50]; p++; sprintf (logbuf, "server:\tSB %s SEND", telopt(sb_opt)); lognegot (logbuf); if (sb_opt == TELOPT_OLD_ENVIRON) { if (cfg.rfc_environ) { value = RFC_VALUE; var = RFC_VAR; } else { value = BSD_VALUE; var = BSD_VAR; } /* * Try to guess the sense of VAR and VALUE. */ while (p < q) { if (*p == RFC_VAR) { value = RFC_VALUE; var = RFC_VAR; } else if (*p == BSD_VAR) { value = BSD_VALUE; var = BSD_VAR; } p++; } } else { /* * With NEW_ENVIRON, the sense of VAR and VALUE * isn't in doubt. */ value = RFC_VALUE; var = RFC_VAR; } b[0] = IAC; b[1] = SB; b[2] = sb_opt; b[3] = TELQUAL_IS; n = 4; e = cfg.environ; while (*e) { b[n++] = var; while (*e && *e != '\t') b[n++] = *e++; if (*e == '\t') e++; b[n++] = value; while (*e) b[n++] = *e++; e++; } if (*cfg.username) { b[n++] = var; b[n++] = 'U'; b[n++] = 'S'; b[n++] = 'E'; b[n++] = 'R'; b[n++] = value; e = cfg.username; while (*e) b[n++] = *e++; } b[n++] = IAC; b[n++] = SE; s_write (b, n); sprintf(logbuf, "client:\tSB %s IS %s", telopt(sb_opt), n==6 ? "" : ""); lognegot (logbuf); } break; } } static enum { TOPLEVEL, SEENIAC, SEENWILL, SEENWONT, SEENDO, SEENDONT, SEENSB, SUBNEGOT, SUBNEG_IAC, SEENCR } telnet_state = TOPLEVEL; static void do_telnet_read (char *buf, int len) { unsigned char b[10]; while (len--) { int c = (unsigned char) *buf++; switch (telnet_state) { case TOPLEVEL: case SEENCR: if (c == NUL && telnet_state == SEENCR) telnet_state = TOPLEVEL; else if (c == IAC) telnet_state = SEENIAC; else { b[0] = c; #if 0 if (!in_synch) #endif c_write (b, 1); if (c == CR) telnet_state = SEENCR; else telnet_state = TOPLEVEL; } break; case SEENIAC: if (c == DO) telnet_state = SEENDO; else if (c == DONT) telnet_state = SEENDONT; else if (c == WILL) telnet_state = SEENWILL; else if (c == WONT) telnet_state = SEENWONT; else if (c == SB) telnet_state = SEENSB; else telnet_state = TOPLEVEL;/* ignore _everything_ else! */ break; case SEENWILL: proc_rec_opt (WILL, c); telnet_state = TOPLEVEL; break; case SEENWONT: proc_rec_opt (WONT, c); telnet_state = TOPLEVEL; break; case SEENDO: proc_rec_opt (DO, c); telnet_state = TOPLEVEL; break; case SEENDONT: proc_rec_opt (DONT, c); telnet_state = TOPLEVEL; break; case SEENSB: sb_opt = c; sb_len = 0; telnet_state = SUBNEGOT; break; case SUBNEGOT: if (c == IAC) telnet_state = SUBNEG_IAC; else { subneg_addchar: if (sb_len >= sb_size) { char *newbuf; sb_size += SB_DELTA; newbuf = (sb_buf ? realloc(sb_buf, sb_size) : malloc(sb_size)); if (newbuf) sb_buf = newbuf; else sb_size -= SB_DELTA; } if (sb_len < sb_size) sb_buf[sb_len++] = c; telnet_state = SUBNEGOT;/* in case we came here by goto */ } break; case SUBNEG_IAC: if (c != SE) goto subneg_addchar; /* yes, it's a hack, I know, but... */ else { process_subneg(); telnet_state = TOPLEVEL; } break; } } } /* * Called to set up the Telnet connection. Will arrange for * WM_NETEVENT messages to be passed to the specified window, whose * window procedure should then call telnet_msg(). * * Returns an error message, or NULL on success. * * Also places the canonical host name into `realhost'. */ static char *telnet_init (HWND hwnd, char *host, int port, char **realhost) { SOCKADDR_IN addr; struct hostent *h; unsigned long a; /* * Try to find host. */ if ( (a = inet_addr(host)) == (unsigned long) INADDR_NONE) { if ( (h = gethostbyname(host)) == NULL) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAHOST_NOT_FOUND: case WSANO_DATA: return "Host does not exist"; case WSATRY_AGAIN: return "Host not found"; default: return "gethostbyname: unknown error"; } memcpy (&a, h->h_addr, sizeof(a)); *realhost = h->h_name; } else *realhost = host; a = ntohl(a); if (port < 0) port = 23; /* default telnet port */ /* * Open socket. */ s = socket(AF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAEAFNOSUPPORT: return "TCP/IP support not present"; default: return "socket(): unknown error"; } #if 0 { BOOL b = TRUE; setsockopt (s, SOL_SOCKET, SO_OOBINLINE, (void *)&b, sizeof(b)); } #endif /* * Bind to local address. */ addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(0); if (bind (s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "bind(): unknown error"; } /* * Connect to remote address. */ addr.sin_addr.s_addr = htonl(a); addr.sin_port = htons((short)port); if (connect (s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAECONNREFUSED: return "Connection refused"; case WSAENETUNREACH: return "Network is unreachable"; case WSAEHOSTUNREACH: return "No route to host"; default: return "connect(): unknown error"; } if (WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ | FD_WRITE | FD_OOB | FD_CLOSE) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "WSAAsyncSelect(): unknown error"; } /* * Initialise option states. */ { struct Opt **o; for (o = opts; *o; o++) if ((*o)->state == REQUESTED) send_opt ((*o)->send, (*o)->option); } #if 0 /* * Set up SYNCH state. */ in_synch = FALSE; #endif return NULL; } /* * Process a WM_NETEVENT message. Will return 0 if the connection * has closed, or <0 for a socket error. */ static int telnet_msg (WPARAM wParam, LPARAM lParam) { int ret; char buf[256]; if (s == INVALID_SOCKET) /* how the hell did we get here?! */ return -5000; if (WSAGETSELECTERROR(lParam) != 0) return -WSAGETSELECTERROR(lParam); switch (WSAGETSELECTEVENT(lParam)) { case FD_READ: ret = recv(s, buf, sizeof(buf), 0); if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK) return 1; if (ret < 0) /* any _other_ error */ return -10000-WSAGetLastError(); if (ret == 0) { s = INVALID_SOCKET; return 0; /* can't happen, in theory */ } #if 0 if (in_synch) { BOOL i; if (ioctlsocket (s, SIOCATMARK, &i) < 0) { return -20000-WSAGetLastError(); } if (i) in_synch = FALSE; } #endif do_telnet_read (buf, ret); return 1; case FD_OOB: do { ret = recv(s, buf, sizeof(buf), 0); } while (ret > 0); telnet_state = TOPLEVEL; do { ret = recv(s, buf, 1, MSG_OOB); if (ret > 0) do_telnet_read (buf, ret); } while (ret > 0); if (ret < 0 && WSAGetLastError() != WSAEWOULDBLOCK) return -30000-WSAGetLastError(); return 1; case FD_WRITE: if (outbuf_head != outbuf_reap) try_write(); return 1; case FD_CLOSE: s = INVALID_SOCKET; return 0; } return 1; /* shouldn't happen, but WTF */ } /* * Called to send data down the Telnet connection. */ static void telnet_send (char *buf, int len) { char *p; static unsigned char iac[2] = { IAC, IAC }; static unsigned char cr[2] = { CR, NUL }; if (s == INVALID_SOCKET) return; p = buf; while (p < buf+len) { char *q = p; while (iswritable((unsigned char)*p) && p < buf+len) p++; s_write (q, p-q); while (p < buf+len && !iswritable((unsigned char)*p)) { s_write ((unsigned char)*p == IAC ? iac : cr, 2); p++; } } } /* * Called to set the size of the window from Telnet's POV. */ static void telnet_size(void) { unsigned char b[16]; char logbuf[50]; if (s == INVALID_SOCKET || o_naws.state != ACTIVE) return; b[0] = IAC; b[1] = SB; b[2] = TELOPT_NAWS; b[3] = cols >> 8; b[4] = cols & 0xFF; b[5] = rows >> 8; b[6] = rows & 0xFF; b[7] = IAC; b[8] = SE; s_write (b, 9); sprintf(logbuf, "client:\tSB NAWS %d,%d", ((unsigned char)b[3] << 8) + (unsigned char)b[4], ((unsigned char)b[5] << 8) + (unsigned char)b[6]); lognegot (logbuf); } /* * Send Telnet special codes. */ static void telnet_special (Telnet_Special code) { unsigned char b[2]; if (s == INVALID_SOCKET) return; b[0] = IAC; switch (code) { case TS_AYT: b[1] = AYT; s_write (b, 2); break; case TS_BRK: b[1] = BREAK; s_write (b, 2); break; case TS_EC: b[1] = EC; s_write (b, 2); break; case TS_EL: b[1] = EL; s_write (b, 2); break; case TS_GA: b[1] = GA; s_write (b, 2); break; case TS_NOP: b[1] = NOP; s_write (b, 2); break; case TS_ABORT: b[1] = ABORT; s_write (b, 2); break; case TS_AO: b[1] = AO; s_write (b, 2); break; case TS_IP: b[1] = IP; s_write (b, 2); break; case TS_SUSP: b[1] = SUSP; s_write (b, 2); break; case TS_EOR: b[1] = EOR; s_write (b, 2); break; case TS_EOF: b[1] = xEOF; s_write (b, 2); break; case TS_SYNCH: outbuf_head = outbuf_reap = 0; b[0] = DM; send (s, b, 1, MSG_OOB); break; } } Backend telnet_backend = { telnet_init, telnet_msg, telnet_send, telnet_size, telnet_special }; Node-path: putty/terminal.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 37011 Text-content-md5: 7371101239d4a3ea5a06506354c6daeb Text-content-sha1: 67f37ad1ebc6727c81ed22464b2440e6988722a2 Content-length: 37127 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN#include #include #include #include "putty.h" static unsigned long *text; /* buffer of text on terminal screen */ static unsigned long *scrtop; /* top of working screen */ static unsigned long *disptop; /* top of displayed screen */ static unsigned long *sbtop; /* top of scrollback */ static unsigned long *cpos; /* cursor position (convenience) */ static unsigned long *disptext; /* buffer of text on real screen */ static unsigned long *wanttext; /* buffer of text we want on screen */ static unsigned long *alttext; /* buffer of text on alt. screen */ static unsigned char *selspace; /* buffer for building selections in */ #define TSIZE (sizeof(*text)) #define fix_cpos do { cpos = scrtop + curs_y * (cols+1) + curs_x; } while(0) static unsigned long curr_attr, save_attr; static int curs_x, curs_y; /* cursor */ static int save_x, save_y; /* saved cursor position */ static int marg_t, marg_b; /* scroll margins */ static int dec_om; /* DEC origin mode flag */ static int wrap, wrapnext; /* wrap flags */ static int insert; /* insert-mode flag */ static int cset; /* 0 or 1: which char set */ static int save_cset, save_csattr; /* saved with cursor position */ static int rvideo; /* global reverse video flag */ static unsigned long cset_attr[2]; /* * Saved settings on the alternate screen. */ static int alt_x, alt_y, alt_om, alt_wrap, alt_wnext, alt_ins, alt_cset; static int alt_t, alt_b; static int alt_which; #define ARGS_MAX 32 /* max # of esc sequence arguments */ #define ARG_DEFAULT -1 /* if an arg isn't specified */ #define def(a,d) ( (a) == ARG_DEFAULT ? (d) : (a) ) static int esc_args[ARGS_MAX]; static int esc_nargs; static int esc_query; #define OSC_STR_MAX 2048 static int osc_strlen; static char osc_string[OSC_STR_MAX+1]; static int osc_w; static unsigned char *tabs; #define MAXNL 5 static int nl_count; static int scroll_heuristic; static enum { TOPLEVEL, IGNORE_NEXT, SEEN_ESC, SEEN_CSI, SET_GL, SET_GR, SEEN_OSC, SEEN_OSC_P, SEEN_OSC_W, OSC_STRING, OSC_MAYBE_ST, SEEN_ESCHASH } termstate; static enum { NO_SELECTION, ABOUT_TO, DRAGGING, SELECTED } selstate; static enum { SM_CHAR, SM_WORD, SM_LINE } selmode; static unsigned long *selstart, *selend, *selanchor; static short wordness[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 01 */ 0,1,2,1,1,1,1,1,1,1,1,1,1,2,2,2, 2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1, /* 23 */ 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2, /* 45 */ 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1, /* 67 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 89 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* AB */ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2, /* CD */ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2, /* EF */ }; static unsigned char sel_nl[] = SEL_NL; /* * Internal prototypes. */ static void do_paint (Context, int); static void erase_lots (int, int, int); static void swap_screen (int); static void update_sbar (void); static void deselect (void); /* * Set up power-on settings for the terminal. */ static void power_on(void) { curs_x = curs_y = alt_x = alt_y = save_x = save_y = 0; alt_t = marg_t = 0; if (rows != -1) alt_b = marg_b = rows - 1; else alt_b = marg_b = 0; if (cols != -1) { int i; for (i = 0; i < cols; i++) tabs[i] = (i % 8 == 0 ? TRUE : FALSE); } alt_om = dec_om = cfg.dec_om; alt_wnext = wrapnext = alt_ins = insert = FALSE; alt_wrap = wrap = cfg.wrap_mode; alt_cset = cset = 0; cset_attr[0] = cset_attr[1] = ATTR_ASCII; rvideo = 0; save_attr = curr_attr = ATTR_DEFAULT; app_cursor_keys = cfg.app_cursor; app_keypad_keys = cfg.app_keypad; alt_which = 0; { int i; for (i = 0; i < 256; i++) wordness[i] = cfg.wordness[i]; } if (text) { swap_screen (1); erase_lots (FALSE, TRUE, TRUE); swap_screen (0); erase_lots (FALSE, TRUE, TRUE); } } /* * Force a screen update. */ void term_update(void) { Context ctx; ctx = get_ctx(); if (ctx) { do_paint (ctx, TRUE); free_ctx (ctx); nl_count = 0; scroll_heuristic = 0; } } /* * Same as power_on(), but an external function. */ void term_pwron(void) { power_on(); fix_cpos; disptop = scrtop; deselect(); term_update(); } /* * Clear the scrollback. */ void term_clrsb(void) { disptop = sbtop = scrtop; update_sbar(); } /* * Initialise the terminal. */ void term_init(void) { text = sbtop = scrtop = disptop = cpos = NULL; disptext = wanttext = NULL; tabs = NULL; selspace = NULL; deselect(); rows = cols = -1; nl_count = 0; power_on(); } /* * Set up the terminal for a given size. */ void term_size(int newrows, int newcols, int newsavelines) { unsigned long *newtext, *newdisp, *newwant, *newalt; int i, j, crows, ccols; if (newrows == rows && newcols == cols && newsavelines == savelines) return; /* nothing to do */ alt_t = marg_t = 0; alt_b = marg_b = newrows - 1; newtext = smalloc ((newrows+newsavelines)*(newcols+1)*TSIZE); disptop = newtext + newsavelines*(newcols+1); for (i=0; i<(newrows+newsavelines)*(newcols+1); i++) newtext[i] = ERASE_CHAR; if (rows != -1) { crows = rows + (scrtop - sbtop) / (cols+1); if (crows > newrows+newsavelines) crows = newrows+newsavelines; ccols = (cols < newcols ? cols : newcols); for (i=0; i disptop) sbtop = disptop; } else sbtop = disptop; scrtop = disptop; sfree (text); text = newtext; newdisp = smalloc (newrows*(newcols+1)*TSIZE); for (i=0; i 0 ? cols : 0); i < newcols; i++) tabs[i] = (i % 8 == 0 ? TRUE : FALSE); } if (rows > 0) curs_y += newrows - rows; if (curs_y < 0) curs_y = 0; if (curs_y >= newrows) curs_y = newrows-1; if (curs_x >= newcols) curs_x = newcols-1; alt_x = alt_y = 0; wrapnext = alt_wnext = FALSE; rows = newrows; cols = newcols; savelines = newsavelines; fix_cpos; deselect(); update_sbar(); term_update(); } /* * Swap screens. */ static void swap_screen (int which) { int t; unsigned long tt; if (which == alt_which) return; alt_which = which; for (t=0; t 0 && topline == 0 && botline == (rows-1) && sb) { /* * Since we're going to scroll the whole screen upwards, * let's also affect the scrollback buffer. */ sbtop -= lines * (cols+1); if (sbtop < text) sbtop = text; scroll_size += scroll_top - sbtop; scroll_top = sbtop; update_sbar(); } if (scroll_size < 0) { size += scroll_size; scroll_size = 0; } if (lines > 0) { if (scroll_size) memmove (scroll_top, scroll_top + size, scroll_size*TSIZE); for (i = 0; i < size; i++) scroll_top[i+scroll_size] = ERASE_CHAR; if (selstart > scroll_top && selstart < scroll_top + size + scroll_size) { selstart -= size; if (selstart < scroll_top) selstart = scroll_top; } if (selend > scroll_top && selend < scroll_top + size + scroll_size) { selend -= size; if (selend < scroll_top) selend = scroll_top; } } else { if (scroll_size) memmove (scroll_top + size, scroll_top, scroll_size*TSIZE); for (i = 0; i < size; i++) scroll_top[i] = ERASE_CHAR; if (selstart > scroll_top && selstart < scroll_top + size + scroll_size) { selstart += size; if (selstart > scroll_top + size + scroll_size) selstart = scroll_top + size + scroll_size; } if (selend > scroll_top && selend < scroll_top + size + scroll_size) { selend += size; if (selend > scroll_top + size + scroll_size) selend = scroll_top + size + scroll_size; } } scroll_heuristic += lines; } /* * Move the cursor to a given position, clipping at boundaries. We * may or may not want to clip at the scroll margin: marg_clip is 0 * not to, 1 to disallow _passing_ the margins, and 2 to disallow * even _being_ outside the margins. */ static void move (int x, int y, int marg_clip) { if (x < 0) x = 0; if (x >= cols) x = cols-1; if (marg_clip) { if ((curs_y >= marg_t || marg_clip == 2) && y < marg_t) y = marg_t; if ((curs_y <= marg_b || marg_clip == 2) && y > marg_b) y = marg_b; } if (y < 0) y = 0; if (y >= rows) y = rows-1; curs_x = x; curs_y = y; fix_cpos; wrapnext = FALSE; } /* * Save or restore the cursor and SGR mode. */ static void save_cursor(int save) { if (save) { save_x = curs_x; save_y = curs_y; save_attr = curr_attr; save_cset = cset; save_csattr = cset_attr[cset]; } else { curs_x = save_x; curs_y = save_y; curr_attr = save_attr; cset = save_cset; cset_attr[cset] = save_csattr; fix_cpos; } } /* * Erase a large portion of the screen: the whole screen, or the * whole line, or parts thereof. */ static void erase_lots (int line_only, int from_begin, int to_end) { unsigned long *startpos, *endpos; if (line_only) { startpos = cpos - curs_x; endpos = startpos + cols+1; } else { startpos = scrtop; endpos = startpos + rows * (cols+1); } if (!from_begin) startpos = cpos; if (!to_end) endpos = cpos; check_selection (startpos, endpos); while (startpos < endpos) *startpos++ = ERASE_CHAR; } /* * Insert or delete characters within the current line. n is +ve if * insertion is desired, and -ve for deletion. */ static void insch (int n) { int dir = (n < 0 ? -1 : +1); int m; n = (n < 0 ? -n : n); if (n > cols - curs_x) n = cols - curs_x; m = cols - curs_x - n; check_selection (cpos, cpos+n); if (dir < 0) { memmove (cpos, cpos+n, m*TSIZE); while (n--) cpos[m++] = ERASE_CHAR; } else { memmove (cpos+n, cpos, m*TSIZE); while (n--) cpos[n] = ERASE_CHAR; } } /* * Toggle terminal mode `mode' to state `state'. (`query' indicates * whether the mode is a DEC private one or a normal one.) */ static void toggle_mode (int mode, int query, int state) { if (query) switch (mode) { case 1: /* application cursor keys */ app_cursor_keys = state; break; case 3: /* 80/132 columns */ deselect(); request_resize (state ? 132 : 80, rows); break; case 5: /* reverse video */ rvideo = state; disptop = scrtop; break; case 6: /* DEC origin mode */ dec_om = state; break; case 7: /* auto wrap */ wrap = state; break; case 47: /* alternate screen */ deselect(); swap_screen (state); disptop = scrtop; break; } else switch (mode) { case 4: /* set insert mode */ insert = state; break; } } /* * Process an OSC sequence: set window title or icon name. */ static void do_osc(void) { if (osc_w) { while (osc_strlen--) wordness[(unsigned char)osc_string[osc_strlen]] = esc_args[0]; } else { osc_string[osc_strlen] = '\0'; switch (esc_args[0]) { case 0: case 1: set_icon (osc_string); if (esc_args[0] == 1) break; /* fall through: parameter 0 means set both */ case 2: case 21: set_title (osc_string); break; } } } /* * Remove everything currently in `inbuf' and stick it up on the * in-memory display. There's a big state machine in here to * process escape sequences... */ void term_out(void) { int c; int must_update = FALSE; while ( (c = inbuf_getc()) != -1) { #ifdef LOG { static FILE *fp = NULL; if (!fp) fp = fopen("putty.log", "wb"); if (fp) fputc (c, fp); } #endif switch (termstate) { case TOPLEVEL: do_toplevel: switch (c) { case '\005': /* terminal type query */ back->send ("\033[?1;2c", 7); break; case '\007': beep(); disptop = scrtop; must_update = TRUE; break; case '\b': if (curs_x == 0 && curs_y > 0) curs_x = cols-1, curs_y--; else if (wrapnext) wrapnext = FALSE; else curs_x--; fix_cpos; disptop = scrtop; must_update = TRUE; break; case '\016': cset = 1; break; case '\017': cset = 0; break; case '\033': termstate = SEEN_ESC; break; case 0233: termstate = SEEN_CSI; esc_nargs = 1; esc_args[0] = ARG_DEFAULT; esc_query = FALSE; break; case 0235: termstate = SEEN_OSC; esc_args[0] = 0; break; case '\r': curs_x = 0; wrapnext = FALSE; fix_cpos; disptop = scrtop; must_update = TRUE; break; case '\013': case '\014': case '\n': if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; fix_cpos; wrapnext = FALSE; disptop = scrtop; nl_count++; break; case '\t': do { curs_x++; } while (curs_x < cols-1 && !tabs[curs_x]); if (curs_x >= cols) curs_x = cols-1; { unsigned long *old_cpos = cpos; fix_cpos; check_selection (old_cpos, cpos); } disptop = scrtop; must_update = TRUE; break; default: if (c >= ' ' && c != 0234) { if (wrapnext) { cpos[1] = ATTR_WRAPPED; if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; curs_x = 0; fix_cpos; wrapnext = FALSE; nl_count++; } if (insert) insch (1); check_selection (cpos, cpos+1); *cpos++ = c | curr_attr | (c <= 0x7F ? cset_attr[cset] : ATTR_ASCII); curs_x++; if (curs_x == cols) { cpos--; curs_x--; wrapnext = wrap; } disptop = scrtop; } } break; case IGNORE_NEXT: termstate = TOPLEVEL; break; case OSC_MAYBE_ST: /* * This state is virtually identical to SEEN_ESC, with the * exception that we have an OSC sequence in the pipeline, * and _if_ we see a backslash, we process it. */ if (c == '\\') { do_osc(); termstate = TOPLEVEL; break; } /* else fall through */ case SEEN_ESC: termstate = TOPLEVEL; switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case ' ': /* some weird sequence? */ termstate = IGNORE_NEXT; break; case '[': /* enter CSI mode */ termstate = SEEN_CSI; esc_nargs = 1; esc_args[0] = ARG_DEFAULT; esc_query = FALSE; break; case ']': /* xterm escape sequences */ termstate = SEEN_OSC; esc_args[0] = 0; break; case '(': /* should set GL */ termstate = SET_GL; break; case ')': /* should set GR */ termstate = SET_GR; break; case '7': /* save cursor */ save_cursor (TRUE); break; case '8': /* restore cursor */ save_cursor (FALSE); disptop = scrtop; must_update = TRUE; break; case '=': app_keypad_keys = TRUE; break; case '>': app_keypad_keys = FALSE; break; case 'D': /* exactly equivalent to LF */ if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; fix_cpos; wrapnext = FALSE; disptop = scrtop; nl_count++; break; case 'E': /* exactly equivalent to CR-LF */ curs_x = 0; wrapnext = FALSE; if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; fix_cpos; wrapnext = FALSE; nl_count++; disptop = scrtop; break; case 'M': /* reverse index - backwards LF */ if (curs_y == marg_t) scroll (marg_t, marg_b, -1, TRUE); else if (curs_y > 0) curs_y--; fix_cpos; wrapnext = FALSE; disptop = scrtop; must_update = TRUE; break; case 'Z': /* terminal type query */ back->send ("\033[?6c", 5); break; case 'c': /* restore power-on settings */ power_on(); fix_cpos; disptop = scrtop; must_update = TRUE; break; case '#': /* ESC # 8 fills screen with Es :-) */ termstate = SEEN_ESCHASH; break; case 'H': /* set a tab */ tabs[curs_x] = TRUE; break; } break; case SEEN_CSI: termstate = TOPLEVEL; /* default */ switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (esc_nargs <= ARGS_MAX) { if (esc_args[esc_nargs-1] == ARG_DEFAULT) esc_args[esc_nargs-1] = 0; esc_args[esc_nargs-1] = 10 * esc_args[esc_nargs-1] + c - '0'; } termstate = SEEN_CSI; break; case ';': if (++esc_nargs <= ARGS_MAX) esc_args[esc_nargs-1] = ARG_DEFAULT; termstate = SEEN_CSI; break; case '?': esc_query = TRUE; termstate = SEEN_CSI; break; case 'A': /* move up N lines */ move (curs_x, curs_y - def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'B': case 'e': /* move down N lines */ move (curs_x, curs_y + def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'C': case 'a': /* move right N cols */ move (curs_x + def(esc_args[0], 1), curs_y, 1); disptop = scrtop; must_update = TRUE; break; case 'D': /* move left N cols */ move (curs_x - def(esc_args[0], 1), curs_y, 1); disptop = scrtop; must_update = TRUE; break; case 'E': /* move down N lines and CR */ move (0, curs_y + def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'F': /* move up N lines and CR */ move (0, curs_y - def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'G': case '`': /* set horizontal posn */ move (def(esc_args[0], 1) - 1, curs_y, 0); disptop = scrtop; must_update = TRUE; break; case 'd': /* set vertical posn */ move (curs_x, (dec_om ? marg_t : 0) + def(esc_args[0], 1) - 1, (dec_om ? 2 : 0)); disptop = scrtop; must_update = TRUE; break; case 'H': case 'f': /* set horz and vert posns at once */ if (esc_nargs < 2) esc_args[1] = ARG_DEFAULT; move (def(esc_args[1], 1) - 1, (dec_om ? marg_t : 0) + def(esc_args[0], 1) - 1, (dec_om ? 2 : 0)); disptop = scrtop; must_update = TRUE; break; case 'J': /* erase screen or parts of it */ { unsigned int i = def(esc_args[0], 0) + 1; if (i > 3) i = 0; erase_lots(FALSE, !!(i & 2), !!(i & 1)); } disptop = scrtop; must_update = TRUE; break; case 'K': /* erase line or parts of it */ { unsigned int i = def(esc_args[0], 0) + 1; if (i > 3) i = 0; erase_lots(TRUE, !!(i & 2), !!(i & 1)); } disptop = scrtop; must_update = TRUE; break; case 'L': /* insert lines */ if (curs_y <= marg_b) scroll (curs_y, marg_b, -def(esc_args[0], 1), FALSE); disptop = scrtop; must_update = TRUE; break; case 'M': /* delete lines */ if (curs_y <= marg_b) scroll (curs_y, marg_b, def(esc_args[0], 1), FALSE); disptop = scrtop; must_update = TRUE; break; case '@': /* insert chars */ insch (def(esc_args[0], 1)); disptop = scrtop; must_update = TRUE; break; case 'P': /* delete chars */ insch (-def(esc_args[0], 1)); disptop = scrtop; must_update = TRUE; break; case 'c': /* terminal type query */ back->send ("\033[?6c", 5); break; case 'n': /* cursor position query */ if (esc_args[0] == 6) { char buf[32]; sprintf (buf, "\033[%d;%dR", curs_y + 1, curs_x + 1); back->send (buf, strlen(buf)); } break; case 'h': /* toggle a mode to high */ toggle_mode (esc_args[0], esc_query, TRUE); break; case 'l': /* toggle a mode to low */ toggle_mode (esc_args[0], esc_query, FALSE); break; case 'g': /* clear tabs */ if (esc_nargs == 1) { if (esc_args[0] == 0) { tabs[curs_x] = FALSE; } else if (esc_args[0] == 3) { int i; for (i = 0; i < cols; i++) tabs[i] = FALSE; } } break; case 'r': /* set scroll margins */ if (esc_nargs <= 2) { int top, bot; top = def(esc_args[0], 1) - 1; if (top < 0) top = 0; bot = (esc_nargs == 1 ? rows : def(esc_args[1], rows)) - 1; if (bot >= rows) bot = rows-1; if (top <= bot) { marg_t = top; marg_b = bot; curs_x = 0; /* * I used to think the cursor should be * placed at the top of the newly marginned * area. Apparently not: VMS TPU falls over * if so. */ curs_y = 0; fix_cpos; disptop = scrtop; must_update = TRUE; } } break; case 'm': /* set graphics rendition */ { int i; for (i=0; i cols - curs_x) n = cols - curs_x; check_selection (cpos, cpos+n); while (n--) *p++ = ERASE_CHAR; disptop = scrtop; must_update = TRUE; } break; case 'x': /* report terminal characteristics */ { char buf[32]; int i = def(esc_args[0], 0); if (i == 0 || i == 1) { strcpy (buf, "\033[2;1;1;112;112;1;0x"); buf[2] += i; back->send (buf, 20); } } break; } break; case SET_GL: case SET_GR: switch (c) { case 'A': cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_GBCHR; break; case '0': cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_LINEDRW; break; default: /* specifically, 'B' */ cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_ASCII; break; } termstate = TOPLEVEL; break; case SEEN_OSC: osc_w = FALSE; switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case 'P': /* Linux palette sequence */ termstate = SEEN_OSC_P; osc_strlen = 0; break; case 'R': /* Linux palette reset */ palette_reset(); term_invalidate(); termstate = TOPLEVEL; break; case 'W': /* word-set */ termstate = SEEN_OSC_W; osc_w = TRUE; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': esc_args[0] = 10 * esc_args[0] + c - '0'; break; case 'L': /* * Grotty hack to support xterm and DECterm title * sequences concurrently. */ if (esc_args[0] == 2) { esc_args[0] = 1; break; } /* else fall through */ default: termstate = OSC_STRING; osc_strlen = 0; } break; case OSC_STRING: if (c == 0234 || c == '\007') { /* * These characters terminate the string; ST and BEL * terminate the sequence and trigger instant * processing of it, whereas ESC goes back to SEEN_ESC * mode unless it is followed by \, in which case it is * synonymous with ST in the first place. */ do_osc(); termstate = TOPLEVEL; } else if (c == '\033') termstate = OSC_MAYBE_ST; else if (osc_strlen < OSC_STR_MAX) osc_string[osc_strlen++] = c; break; case SEEN_OSC_P: { int max = (osc_strlen == 0 ? 21 : 16); int val; if (c >= '0' && c <= '9') val = c - '0'; else if (c >= 'A' && c <= 'A'+max-10) val = c - 'A' + 10; else if (c >= 'a' && c <= 'a'+max-10) val = c - 'a' + 10; else termstate = TOPLEVEL; osc_string[osc_strlen++] = val; if (osc_strlen >= 7) { palette_set (osc_string[0], osc_string[1] * 16 + osc_string[2], osc_string[3] * 16 + osc_string[4], osc_string[5] * 16 + osc_string[6]); term_invalidate(); termstate = TOPLEVEL; } } break; case SEEN_OSC_W: switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': esc_args[0] = 10 * esc_args[0] + c - '0'; break; default: termstate = OSC_STRING; osc_strlen = 0; } break; case SEEN_ESCHASH: if (c == '8') { unsigned long *p = scrtop; int n = rows * (cols+1); while (n--) *p++ = ATTR_DEFAULT | 'E'; disptop = scrtop; must_update = TRUE; check_selection (scrtop, scrtop + rows * (cols+1)); } termstate = TOPLEVEL; break; } check_selection (cpos, cpos+1); } if (must_update || nl_count > MAXNL) term_update(); } /* * Compare two lines to determine whether they are sufficiently * alike to scroll-optimise one to the other. Return the degree of * similarity. */ static int linecmp (unsigned long *a, unsigned long *b) { int i, n; for (i=n=0; i < cols; i++) n += (*a++ == *b++); return n; } /* * Given a context, update the window. Out of paranoia, we don't * allow WM_PAINT responses to do scrolling optimisations. */ static void do_paint (Context ctx, int may_optimise){ int i, j, start, our_curs_y; unsigned long attr, rv, cursor; char ch[1024]; cursor = (has_focus ? ATTR_ACTCURS : ATTR_PASCURS); rv = (rvideo ? ATTR_REVERSE : 0); our_curs_y = curs_y + (scrtop - disptop) / (cols+1); for (i=0; i 0 ? sbtop : disptop) + n; if (disptop < sbtop) disptop = sbtop; if (disptop > scrtop) disptop = scrtop; update_sbar(); term_update(); } /* * Spread the selection outwards according to the selection mode. */ static unsigned long *sel_spread_half (unsigned long *p, int dir) { unsigned long *linestart, *lineend; int x; short wvalue; x = (p - text) % (cols+1); linestart = p - x; lineend = linestart + cols; switch (selmode) { case SM_CHAR: /* * In this mode, every character is a separate unit, except * for runs of spaces at the end of a non-wrapping line. */ if (!(linestart[cols] & ATTR_WRAPPED)) { unsigned long *q = lineend; while (q > linestart && (q[-1] & CHAR_MASK) == 0x20) q--; if (q == lineend) q--; if (p >= q) p = (dir == -1 ? q : lineend - 1); } break; case SM_WORD: /* * In this mode, the units are maximal runs of characters * whose `wordness' has the same value. */ wvalue = wordness[*p & CHAR_MASK]; if (dir == +1) { while (p < lineend && wordness[p[1] & CHAR_MASK] == wvalue) p++; } else { while (p > linestart && wordness[p[-1] & CHAR_MASK] == wvalue) p--; } break; case SM_LINE: /* * In this mode, every line is a unit. */ p = (dir == -1 ? linestart : lineend - 1); break; } return p; } static void sel_spread (void) { selstart = sel_spread_half (selstart, -1); selend = sel_spread_half (selend - 1, +1) + 1; } void term_mouse (Mouse_Button b, Mouse_Action a, int x, int y) { unsigned long *selpoint = disptop + y * (cols+1) + x; if (b == MB_SELECT && a == MA_CLICK) { deselect(); selstate = ABOUT_TO; selanchor = selpoint; selmode = SM_CHAR; } else if (b == MB_SELECT && (a == MA_2CLK || a == MA_3CLK)) { deselect(); selmode = (a == MA_2CLK ? SM_WORD : SM_LINE); selstate = DRAGGING; selstart = selanchor = selpoint; selend = selstart + 1; sel_spread(); } else if ((b == MB_SELECT && a == MA_DRAG) || (b == MB_EXTEND && a != MA_RELEASE)) { if (selstate == ABOUT_TO && selanchor == selpoint) return; if (b == MB_EXTEND && a != MA_DRAG && selstate == SELECTED) { if (selpoint-selstart < (selend-selstart)/2) selanchor = selend - 1; else selanchor = selstart; selstate = DRAGGING; } if (selstate != ABOUT_TO && selstate != DRAGGING) selanchor = selpoint; selstate = DRAGGING; if (selpoint < selanchor) { selstart = selpoint; selend = selanchor + 1; } else { selstart = selanchor; selend = selpoint + 1; } sel_spread(); } else if ((b == MB_SELECT || b == MB_EXTEND) && a == MA_RELEASE) { if (selstate == DRAGGING) { /* * We've completed a selection. We now transfer the * data to the clipboard. */ unsigned char *p = selspace; unsigned long *q = selstart; while (q < selend) { int nl = FALSE; unsigned long *lineend = q - (q-text) % (cols+1) + cols; unsigned long *nlpos = lineend; if (!(*nlpos & ATTR_WRAPPED)) { while ((nlpos[-1] & CHAR_MASK) == 0x20 && nlpos > q) nlpos--; if (nlpos < selend) nl = TRUE; } while (q < nlpos && q < selend) *p++ = (unsigned char) (*q++ & CHAR_MASK); if (nl) { int i; for (i=0; isend (q, p-q); if (p <= data+len-sizeof(sel_nl) && !memcmp(p, sel_nl, sizeof(sel_nl))) { back->send ("\r", 1); p += sizeof(sel_nl); } q = p; } } get_clip(NULL, NULL); } term_update(); } static void deselect (void) { selstate = NO_SELECTION; selstart = selend = scrtop; } void term_deselect (void) { deselect(); term_update(); } Node-path: putty/win_res.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3010 Text-content-md5: 2b9d580516f74aba08c19ee4ab7c0051 Text-content-sha1: f3083beb37caf69cd89b89e17b23d4346bce4ce5 Content-length: 3126 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN444#ifndef PUTTY_WIN_RES_H #define PUTTY_WIN_RES_H #define IDI_MAINICON 200 #define IDD_MAINBOX 102 #define IDD_PANEL0 103 #define IDD_PANEL1 104 #define IDD_PANEL2 105 #define IDD_PANEL3 106 #define IDD_PANEL35 107 #define IDD_PANEL4 108 #define IDD_PANEL5 109 #define IDD_LOGBOX 110 #define IDD_ABOUTBOX 111 #define IDD_RECONF 112 #define IDD_LICENCEBOX 113 #define IDN_LIST 1001 #define IDA_ICON 1001 #define IDA_TEXT 1002 #define IDA_LICENCE 1003 #define IDC_TAB 1001 #define IDC_ABOUT 1002 #define IDC0_HOSTSTATIC 1001 #define IDC0_HOST 1002 #define IDC0_PORTSTATIC 1003 #define IDC0_PORT 1004 #define IDC0_PROTSTATIC 1005 #define IDC0_PROTTELNET 1006 #define IDC0_PROTSSH 1007 #define IDC0_SESSSTATIC 1008 #define IDC0_SESSEDIT 1009 #define IDC0_SESSLIST 1010 #define IDC0_SESSLOAD 1011 #define IDC0_SESSSAVE 1012 #define IDC0_SESSDEL 1013 #define IDC0_CLOSEEXIT 1014 #define IDC1_DELSTATIC 1001 #define IDC1_DEL008 1002 #define IDC1_DEL127 1003 #define IDC1_HOMESTATIC 1004 #define IDC1_HOMETILDE 1005 #define IDC1_HOMERXVT 1006 #define IDC1_FUNCSTATIC 1007 #define IDC1_FUNCTILDE 1008 #define IDC1_FUNCLINUX 1009 #define IDC1_KPSTATIC 1010 #define IDC1_KPNORMAL 1011 #define IDC1_KPAPPLIC 1012 #define IDC1_CURSTATIC 1013 #define IDC1_CURNORMAL 1014 #define IDC1_CURAPPLIC 1015 #define IDC2_WRAPMODE 1001 #define IDC2_DECOM 1002 #define IDC2_WINNAME 1003 #define IDC2_DIMSTATIC 1004 #define IDC2_ROWSSTATIC 1005 #define IDC2_ROWSEDIT 1006 #define IDC2_COLSSTATIC 1007 #define IDC2_COLSEDIT 1008 #define IDC2_SAVESTATIC 1009 #define IDC2_SAVEEDIT 1010 #define IDC2_FONTSTATIC 1011 #define IDC2_CHOOSEFONT 1012 #define IDC2_VTSTATIC 1013 #define IDC2_VTXWINDOWS 1014 #define IDC2_VTOEMANSI 1015 #define IDC2_VTOEMONLY 1016 #define IDC2_VTPOORMAN 1017 #define IDC3_TTSTATIC 1001 #define IDC3_TTEDIT 1002 #define IDC3_TSSTATIC 1003 #define IDC3_TSEDIT 1004 #define IDC3_LOGSTATIC 1005 #define IDC3_LOGEDIT 1006 #define IDC3_ENVSTATIC 1007 #define IDC3_VARSTATIC 1008 #define IDC3_VAREDIT 1009 #define IDC3_VALSTATIC 1010 #define IDC3_VALEDIT 1011 #define IDC3_ENVLIST 1012 #define IDC3_ENVADD 1013 #define IDC3_ENVREMOVE 1014 #define IDC3_EMSTATIC 1015 #define IDC3_EMBSD 1016 #define IDC3_EMRFC 1017 #define IDC4_MBSTATIC 1001 #define IDC4_MBWINDOWS 1002 #define IDC4_MBXTERM 1003 #define IDC4_CCSTATIC 1004 #define IDC4_CCLIST 1005 #define IDC4_CCSET 1006 #define IDC4_CCSTATIC2 1007 #define IDC4_CCEDIT 1008 #define IDC5_BOLDCOLOUR 1001 #define IDC5_PALETTE 1002 #define IDC5_STATIC 1003 #define IDC5_LIST 1004 #define IDC5_RSTATIC 1005 #define IDC5_GSTATIC 1006 #define IDC5_BSTATIC 1007 #define IDC5_RVALUE 1008 #define IDC5_GVALUE 1009 #define IDC5_BVALUE 1010 #define IDC5_CHANGE 1011 #endif Node-path: putty/win_res.rc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 10429 Text-content-md5: 2bea44bb3f01ece9b7b9fd40b478a6cd Text-content-sha1: 1dbf680fb07c301fa6815e51eab27d87a2c2a243 Content-length: 10545 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN///#include #define TCS_MULTILINE 0x0200 #include "win_res.h" IDI_MAINICON ICON "putty.ico" IDD_ABOUTBOX DIALOG DISCARDABLE 140, 40, 136, 58 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About PuTTY" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Close", IDOK, 82, 40, 48, 14 PUSHBUTTON "View &Licence", IDA_LICENCE, 6, 40, 70, 14 ICON IDI_MAINICON, IDA_ICON, 10, 10, 0, 0 LTEXT "PuTTY Beta 0.43\n\251 1997-8 Simon Tatham\nAll rights reserved.", IDA_TEXT, 40, 6, 96, 24 END IDD_MAINBOX DIALOG DISCARDABLE 0, 0, 180, 216 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Configuration" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Open", IDOK, 86, 199, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 133, 199, 44, 14 PUSHBUTTON "&About", IDC_ABOUT, 3, 199, 44, 14, NOT WS_TABSTOP CONTROL "", IDC_TAB, L"SysTabControl32", TCS_MULTILINE | WS_TABSTOP, 3, 3, 174, 193 END IDD_RECONF DIALOG DISCARDABLE 0, 0, 180, 216 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Reconfiguration" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Apply", IDOK, 86, 199, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 133, 199, 44, 14 CONTROL "", IDC_TAB, L"SysTabControl32", TCS_MULTILINE | WS_TABSTOP, 3, 3, 174, 193 END IDD_PANEL0 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" BEGIN LTEXT "Host Name", IDC0_HOSTSTATIC, 3, 3, 122, 8 EDITTEXT IDC0_HOST, 3, 11, 122, 12, ES_AUTOHSCROLL LTEXT "Port", IDC0_PORTSTATIC, 131, 3, 34, 8 EDITTEXT IDC0_PORT, 131, 11, 34, 12 #ifdef FWHACK RTEXT "Protocol:", IDC0_PROTSTATIC, 3, 29, 77, 8 AUTORADIOBUTTON "Telnet", IDC0_PROTTELNET, 86, 29, 33, 10, WS_GROUP AUTORADIOBUTTON "SSH/hack", IDC0_PROTSSH, 122, 29, 43, 10 #else RTEXT "Protocol:", IDC0_PROTSTATIC, 3, 29, 87, 8 AUTORADIOBUTTON "Telnet", IDC0_PROTTELNET, 96, 29, 33, 10, WS_GROUP AUTORADIOBUTTON "SSH", IDC0_PROTSSH, 132, 29, 33, 10 #endif LTEXT "Stored Sessions", IDC0_SESSSTATIC, 3, 40, 122, 8 EDITTEXT IDC0_SESSEDIT, 3, 48, 122, 12, ES_AUTOHSCROLL LISTBOX IDC0_SESSLIST, 3, 63, 122, 81, LBS_HASSTRINGS | WS_VSCROLL PUSHBUTTON "Load", IDC0_SESSLOAD, 131, 63, 34, 14 PUSHBUTTON "Save", IDC0_SESSSAVE, 131, 80, 34, 14 PUSHBUTTON "Delete", IDC0_SESSDEL, 131, 97, 34, 14 AUTOCHECKBOX "Close Window on Exit", IDC0_CLOSEEXIT, 3, 147, 162, 10 END IDD_PANEL1 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" BEGIN LTEXT "Action of Backspace:", IDC1_DELSTATIC, 3, 3, 162, 8 AUTORADIOBUTTON "Control-H (ASCII 8)", IDC1_DEL008, 3, 12, 162, 10, WS_GROUP AUTORADIOBUTTON "Control-? (ASCII 127)", IDC1_DEL127, 3, 22, 162, 10 LTEXT "Action of Home and End:", IDC1_HOMESTATIC, 3, 35, 162, 8 AUTORADIOBUTTON "Standard (ESC [ 1 ~ and ESC [ 4 ~)", IDC1_HOMETILDE, 3, 44, 162, 10, WS_GROUP AUTORADIOBUTTON "rxvt (ESC [ H and ESC O w)", IDC1_HOMERXVT, 3, 54, 162, 10 LTEXT "Action of F1 through F5:", IDC1_FUNCSTATIC, 3, 67, 162, 8 AUTORADIOBUTTON "Standard (ESC [ 11 ~ through ESC [ 15 ~)", IDC1_FUNCTILDE, 3, 76, 162, 10, WS_GROUP AUTORADIOBUTTON "Linux (ESC [ [ A through ESC [ [ E)", IDC1_FUNCLINUX, 3, 86, 162, 10 LTEXT "Initial state of numeric keypad:", IDC1_KPSTATIC, 3, 99, 162, 8 AUTORADIOBUTTON "Normal (depends on NumLock)", IDC1_KPNORMAL, 3, 108, 162, 10, WS_GROUP AUTORADIOBUTTON "Application (ESC O P etc)", IDC1_KPAPPLIC, 3, 118, 162, 10 LTEXT "Initial state of cursor keys:", IDC1_CURSTATIC, 3, 131, 162, 8 AUTORADIOBUTTON "Normal (ESC [ A through ESC [ D)", IDC1_CURNORMAL, 3, 140, 162, 10, WS_GROUP AUTORADIOBUTTON "Application (ESC O A through ESC O D)", IDC1_CURAPPLIC, 3, 150, 162, 10 END IDD_PANEL2 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" BEGIN AUTOCHECKBOX "Auto wrap mode initially on", IDC2_WRAPMODE, 3, 3, 162, 10 AUTOCHECKBOX "DEC Origin Mode initially on", IDC2_DECOM, 3, 13, 162, 10 AUTOCHECKBOX "Avoid ever using icon title", IDC2_WINNAME, 3, 23, 162, 10 LTEXT "Terminal screen dimensions:", IDC2_DIMSTATIC, 3, 33, 162, 8 RTEXT "Rows", IDC2_ROWSSTATIC, 20, 44, 90, 8 EDITTEXT IDC2_ROWSEDIT, 118, 42, 30, 12 RTEXT "Columns", IDC2_COLSSTATIC, 20, 59, 90, 8 EDITTEXT IDC2_COLSEDIT, 118, 57, 30, 12 RTEXT "Saved lines of scrollback", IDC2_SAVESTATIC, 20, 74, 90, 8 EDITTEXT IDC2_SAVEEDIT, 118, 72, 30, 12 LTEXT "Font:", IDC2_FONTSTATIC, 3, 93, 99, 8 PUSHBUTTON "Change...", IDC2_CHOOSEFONT, 105, 90, 60, 14 LTEXT "Handling of VT100 line drawing characters:",IDC2_VTSTATIC, 3, 111, 162, 8 AUTORADIOBUTTON "Font has XWindows encoding", IDC2_VTXWINDOWS, 3, 120, 162, 10, WS_GROUP AUTORADIOBUTTON "Use font in both ANSI and OEM modes", IDC2_VTOEMANSI, 3, 130, 162, 10 AUTORADIOBUTTON "Use font in OEM mode only", IDC2_VTOEMONLY, 3, 140, 162, 10 AUTORADIOBUTTON "Poor man's line drawing (""+"", ""-"" and ""|"")", IDC2_VTPOORMAN, 3, 150, 162, 10 END IDD_PANEL3 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" BEGIN LTEXT "Terminal-type string", IDC3_TTSTATIC, 3, 5, 90, 8 EDITTEXT IDC3_TTEDIT, 96, 3, 69, 12, ES_AUTOHSCROLL LTEXT "Terminal-speed string", IDC3_TSSTATIC, 3, 20, 90, 8 EDITTEXT IDC3_TSEDIT, 96, 18, 69, 12, ES_AUTOHSCROLL LTEXT "Auto-login username", IDC3_LOGSTATIC, 3, 35, 90, 8 EDITTEXT IDC3_LOGEDIT, 96, 33, 69, 12, ES_AUTOHSCROLL LTEXT "Environment variables:", IDC3_ENVSTATIC, 3, 53, 162, 8 LTEXT "Variable", IDC3_VARSTATIC, 3, 70, 29, 8 EDITTEXT IDC3_VAREDIT, 35, 68, 35, 12, ES_AUTOHSCROLL LTEXT "Value", IDC3_VALSTATIC, 76, 70, 19, 8 EDITTEXT IDC3_VALEDIT, 98, 68, 67, 12, ES_AUTOHSCROLL LISTBOX IDC3_ENVLIST, 3, 85, 122, 55, LBS_HASSTRINGS | LBS_USETABSTOPS | WS_VSCROLL PUSHBUTTON "Add", IDC3_ENVADD, 131, 85, 34, 14 PUSHBUTTON "Remove", IDC3_ENVREMOVE, 131, 102, 34, 14 LTEXT "ENVIRON interpretation:", IDC3_EMSTATIC, 3, 147, 90, 8 AUTORADIOBUTTON "BSD", IDC3_EMBSD, 96, 147, 33, 10, WS_GROUP AUTORADIOBUTTON "RFC", IDC3_EMRFC, 132, 147, 33, 10 END IDD_PANEL35 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" BEGIN LTEXT "Terminal-type string", IDC3_TTSTATIC, 3, 5, 90, 8 EDITTEXT IDC3_TTEDIT, 96, 3, 69, 12, ES_AUTOHSCROLL LTEXT "Auto-login username", IDC3_LOGSTATIC, 3, 35, 90, 8 EDITTEXT IDC3_LOGEDIT, 96, 33, 69, 12, ES_AUTOHSCROLL END IDD_PANEL4 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" BEGIN LTEXT "Action of mouse buttons:", IDC4_MBSTATIC, 3, 3, 162, 8 AUTORADIOBUTTON "Windows (Right pastes, Middle extends)", IDC4_MBWINDOWS, 3, 12, 162, 10, WS_GROUP AUTORADIOBUTTON "xterm (Right extends, Middle pastes)", IDC4_MBXTERM, 3, 22, 162, 10 LTEXT "Character classes:", IDC4_CCSTATIC, 3, 35, 162, 8 LISTBOX IDC4_CCLIST, 3, 45, 162, 96, LBS_HASSTRINGS | WS_VSCROLL | LBS_USETABSTOPS | LBS_MULTIPLESEL PUSHBUTTON "Set", IDC4_CCSET, 33, 145, 34, 14 LTEXT "to class", IDC4_CCSTATIC2, 73, 148, 26, 8 EDITTEXT IDC4_CCEDIT, 105, 146, 36, 12 END IDD_PANEL5 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" BEGIN AUTOCHECKBOX "Bolded text is a different colour", IDC5_BOLDCOLOUR,3, 10, 162, 10 AUTOCHECKBOX "Attempt to use logical palettes", IDC5_PALETTE, 3, 25, 162, 10 LTEXT "Colours:", IDC5_STATIC, 3, 40, 162, 8 LISTBOX IDC5_LIST, 3, 50, 100, 110, LBS_HASSTRINGS | WS_VSCROLL LTEXT "Red:", IDC5_RSTATIC, 109, 50, 27, 8 RTEXT "", IDC5_RVALUE, 138, 50, 27, 8 LTEXT "Green:", IDC5_GSTATIC, 109, 58, 27, 8 RTEXT "", IDC5_GVALUE, 138, 58, 27, 8 LTEXT "Blue:", IDC5_BSTATIC, 109, 66, 27, 8 RTEXT "", IDC5_BVALUE, 138, 66, 27, 8 PUSHBUTTON "Change...", IDC5_CHANGE, 109, 140, 56, 14 END IDD_LOGBOX DIALOG DISCARDABLE 100, 20, 160, 119 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Negotiation Log" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Close", IDOK, 58, 102, 44, 14 LISTBOX IDN_LIST, 3, 3, 154, 95, LBS_HASSTRINGS | LBS_USETABSTOPS | WS_VSCROLL END IDD_LICENCEBOX DIALOG DISCARDABLE 50, 50, 226, 231 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Licence" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK", IDOK, 98, 211, 44, 14 LTEXT "Copyright \251 1998 Simon Tatham", 1000, 10, 10, 206, 8 LTEXT "Portions copyright Gary S. Brown and Eric Young", 1100, 10, 18, 206, 8 LTEXT "Permission is hereby granted, free of charge, to any person", 1002, 10, 34, 206, 8 LTEXT "obtaining a copy of this software and associated documentation", 1003, 10, 42, 206, 8 LTEXT "files (the ""Software""), to deal in the Software without restriction,", 1004, 10, 50, 206, 8 LTEXT "including without limitation the rights to use, copy, modify, merge,", 1005, 10, 58, 206, 8 LTEXT "publish, distribute, sublicense, and/or sell copies of the Software,", 1006, 10, 66, 206, 8 LTEXT "and to permit persons to whom the Software is furnished to do so,", 1007, 10, 74, 206, 8 LTEXT "subject to the following conditions:", 1008, 10, 82, 206, 8 LTEXT "The above copyright notice and this permission notice shall be", 1010, 10, 98, 206, 8 LTEXT "included in all copies or substantial portions of the Software.", 1011, 10, 106, 206, 8 LTEXT "THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT", 1013, 10, 122, 206, 8 LTEXT "WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,", 1014, 10, 130, 206, 8 LTEXT "INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", 1015, 10, 138, 206, 8 LTEXT "MERCHANTABILITY, FITNESS FOR A PARTICULAR", 1016, 10, 146, 206, 8 LTEXT "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL", 1017, 10, 154, 206, 8 LTEXT "SIMON TATHAM BE LIABLE FOR ANY CLAIM, DAMAGES OR", 1018, 10, 162, 206, 8 LTEXT "OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,", 1019, 10, 170, 206, 8 LTEXT "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN", 1020, 10, 178, 206, 8 LTEXT "CONNECTION WITH THE SOFTWARE OR THE USE OR", 1021, 10, 186, 206, 8 LTEXT "OTHER DEALINGS IN THE SOFTWARE.", 1022, 10, 194, 206, 8 END Node-path: putty/windlg.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 38014 Text-content-md5: 22b95992a611e83c1d707b9eebfa863e Text-content-sha1: aa581ca35a071834ae8f2cd3747d6c541d3412dc Content-length: 38130 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNmmm#include #include #include #include #include #include #include "putty.h" #include "ssh.h" #include "win_res.h" #define NPANELS 7 #define MAIN_NPANELS 7 #define RECONF_NPANELS 4 static const char *const puttystr = PUTTY_REG_POS "\\Sessions"; static void get_sesslist(int allocate); static char **negots = NULL; static int nnegots = 0, negsize = 0; static HWND logbox = NULL, abtbox = NULL; static char hex[16] = "0123456789ABCDEF"; static void mungestr(char *in, char *out) { int candot = 0; while (*in) { if (*in == ' ' || *in == '\\' || *in == '*' || *in == '?' || *in == '%' || *in < ' ' || *in > '~' || (*in == '.' && !candot)) { *out++ = '%'; *out++ = hex[((unsigned char)*in) >> 4]; *out++ = hex[((unsigned char)*in) & 15]; } else *out++ = *in; in++; candot = 1; } *out = '\0'; return; } static void unmungestr(char *in, char *out) { int candot = 0; while (*in) { if (*in == '%' && in[1] && in[2]) { int i, j; i = in[1] - '0'; i -= (i > 9 ? 7 : 0); j = in[2] - '0'; j -= (j > 9 ? 7 : 0); *out++ = (i<<4) + j; in += 3; } else *out++ = *in++; } *out = '\0'; return; } static void wpps(HKEY key, LPCTSTR name, LPCTSTR value) { RegSetValueEx(key, name, 0, REG_SZ, value, 1+strlen(value)); } static void wppi(HKEY key, LPCTSTR name, int value) { RegSetValueEx(key, name, 0, REG_DWORD, (CONST BYTE *)&value, sizeof(value)); } static void gpps(HKEY key, LPCTSTR name, LPCTSTR def, LPTSTR val, int len) { DWORD type, size; size = len; if (key == NULL || RegQueryValueEx(key, name, 0, &type, val, &size) != ERROR_SUCCESS || type != REG_SZ) { strncpy(val, def, len); val[len-1] = '\0'; } } static void gppi(HKEY key, LPCTSTR name, int def, int *i) { DWORD type, val, size; size = sizeof(val); if (key == NULL || RegQueryValueEx(key, name, 0, &type, (BYTE *)&val, &size) != ERROR_SUCCESS || size != sizeof(val) || type != REG_DWORD) *i = def; else *i = val; } typedef struct { void *posn; void *temp; char dataspace[2048]; } DTemplate; static HINSTANCE hinst; static char **sessions; static int nsessions; static void save_settings (char *section, int do_host) { int i; HKEY subkey1, sesskey; char *p; p = malloc(3*strlen(section)+1); mungestr(section, p); if (RegCreateKey(HKEY_CURRENT_USER, puttystr, &subkey1)!=ERROR_SUCCESS || RegCreateKey(subkey1, p, &sesskey) != ERROR_SUCCESS) { free(p); sesskey = NULL; } free(p); RegCloseKey(subkey1); wppi (sesskey, "Present", 1); if (do_host) { wpps (sesskey, "HostName", cfg.host); wppi (sesskey, "PortNumber", cfg.port); wpps (sesskey, "Protocol", cfg.protocol == PROT_SSH ? "ssh" : "telnet"); } wppi (sesskey, "CloseOnExit", !!cfg.close_on_exit); wpps (sesskey, "TerminalType", cfg.termtype); wpps (sesskey, "TerminalSpeed", cfg.termspeed); { char buf[2*sizeof(cfg.environ)], *p, *q; p = buf; q = cfg.environ; while (*q) { while (*q) { int c = *q++; if (c == '=' || c == ',' || c == '\\') *p++ = '\\'; if (c == '\t') c = '='; *p++ = c; } *p++ = ','; q++; } *p = '\0'; wpps (sesskey, "Environment", buf); } wpps (sesskey, "UserName", cfg.username); wppi (sesskey, "RFCEnviron", cfg.rfc_environ); wppi (sesskey, "BackspaceIsDelete", cfg.bksp_is_delete); wppi (sesskey, "RXVTHomeEnd", cfg.rxvt_homeend); wppi (sesskey, "LinuxFunctionKeys", cfg.linux_funkeys); wppi (sesskey, "ApplicationCursorKeys", cfg.app_cursor); wppi (sesskey, "ApplicationKeypad", cfg.app_keypad); wppi (sesskey, "ScrollbackLines", cfg.savelines); wppi (sesskey, "DECOriginMode", cfg.dec_om); wppi (sesskey, "AutoWrapMode", cfg.wrap_mode); wppi (sesskey, "WinNameAlways", cfg.win_name_always); wppi (sesskey, "TermWidth", cfg.width); wppi (sesskey, "TermHeight", cfg.height); wpps (sesskey, "Font", cfg.font); wppi (sesskey, "FontIsBold", cfg.fontisbold); wppi (sesskey, "FontHeight", cfg.fontheight); wppi (sesskey, "FontVTMode", cfg.vtmode); wppi (sesskey, "TryPalette", cfg.try_palette); wppi (sesskey, "BoldAsColour", cfg.bold_colour); for (i=0; i<22; i++) { char buf[20], buf2[30]; sprintf(buf, "Colour%d", i); sprintf(buf2, "%d,%d,%d", cfg.colours[i][0], cfg.colours[i][1], cfg.colours[i][2]); wpps (sesskey, buf, buf2); } wppi (sesskey, "MouseIsXterm", cfg.mouse_is_xterm); for (i=0; i<256; i+=32) { char buf[20], buf2[256]; int j; sprintf(buf, "Wordness%d", i); *buf2 = '\0'; for (j=i; j 0) { if (!*p) goto disaster; while (*p) p++; p++; i--; } q = p; if (!*p) goto disaster; while (*p) p++; p++; while (*p) { while (*p) *q++ = *p++; *q++ = *p++; } *q = '\0'; disaster:; } break; } break; } return GeneralPanelProc (hwnd, msg, wParam, lParam); } static int CALLBACK SshProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: SetDlgItemText (hwnd, IDC3_TTEDIT, cfg.termtype); SetDlgItemText (hwnd, IDC3_LOGEDIT, cfg.username); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC3_TTEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC3_TTEDIT, cfg.termtype, sizeof(cfg.termtype)-1); break; case IDC3_LOGEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC3_LOGEDIT, cfg.username, sizeof(cfg.username)-1); break; } break; } return GeneralPanelProc (hwnd, msg, wParam, lParam); } static int CALLBACK SelectionProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { int i; switch (msg) { case WM_INITDIALOG: CheckRadioButton (hwnd, IDC4_MBWINDOWS, IDC4_MBXTERM, cfg.mouse_is_xterm ? IDC4_MBXTERM : IDC4_MBWINDOWS); { static int tabs[4] = {25, 61, 96, 128}; SendDlgItemMessage (hwnd, IDC4_CCLIST, LB_SETTABSTOPS, 4, (LPARAM) tabs); } for (i=0; i<256; i++) { char str[100]; sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i, (i>=0x21 && i != 0x7F) ? i : ' ', cfg.wordness[i]); SendDlgItemMessage (hwnd, IDC4_CCLIST, LB_ADDSTRING, 0, (LPARAM) str); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC4_MBWINDOWS: case IDC4_MBXTERM: cfg.mouse_is_xterm = IsDlgButtonChecked (hwnd, IDC4_MBXTERM); break; case IDC4_CCSET: { BOOL ok; int i; int n = GetDlgItemInt (hwnd, IDC4_CCEDIT, &ok, FALSE); if (!ok) MessageBeep (0); else { for (i=0; i<256; i++) if (SendDlgItemMessage (hwnd, IDC4_CCLIST, LB_GETSEL, i, 0)) { char str[100]; cfg.wordness[i] = n; SendDlgItemMessage (hwnd, IDC4_CCLIST, LB_DELETESTRING, i, 0); sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i, (i>=0x21 && i != 0x7F) ? i : ' ', cfg.wordness[i]); SendDlgItemMessage (hwnd, IDC4_CCLIST, LB_INSERTSTRING, i, (LPARAM)str); } } } break; } break; } return GeneralPanelProc (hwnd, msg, wParam, lParam); } static int CALLBACK ColourProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static const char *const colours[] = { "Default Foreground", "Default Bold Foreground", "Default Background", "Default Bold Background", "Cursor Text", "Cursor Colour", "ANSI Black", "ANSI Black Bold", "ANSI Red", "ANSI Red Bold", "ANSI Green", "ANSI Green Bold", "ANSI Yellow", "ANSI Yellow Bold", "ANSI Blue", "ANSI Blue Bold", "ANSI Magenta", "ANSI Magenta Bold", "ANSI Cyan", "ANSI Cyan Bold", "ANSI White", "ANSI White Bold" }; static const int permanent[] = { TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE }; switch (msg) { case WM_INITDIALOG: CheckDlgButton (hwnd, IDC5_BOLDCOLOUR, cfg.bold_colour); CheckDlgButton (hwnd, IDC5_PALETTE, cfg.try_palette); { int i; for (i=0; i<22; i++) if (cfg.bold_colour || permanent[i]) SendDlgItemMessage (hwnd, IDC5_LIST, LB_ADDSTRING, 0, (LPARAM) colours[i]); } SendDlgItemMessage (hwnd, IDC5_LIST, LB_SETCURSEL, 0, 0); SetDlgItemInt (hwnd, IDC5_RVALUE, cfg.colours[0][0], FALSE); SetDlgItemInt (hwnd, IDC5_GVALUE, cfg.colours[0][1], FALSE); SetDlgItemInt (hwnd, IDC5_BVALUE, cfg.colours[0][2], FALSE); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC5_BOLDCOLOUR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { int n, i; cfg.bold_colour = IsDlgButtonChecked (hwnd, IDC5_BOLDCOLOUR); n = SendDlgItemMessage (hwnd, IDC5_LIST, LB_GETCOUNT, 0, 0); if (cfg.bold_colour && n!=22) { for (i=0; i<22; i++) if (!permanent[i]) SendDlgItemMessage (hwnd, IDC5_LIST, LB_INSERTSTRING, i, (LPARAM) colours[i]); } else if (!cfg.bold_colour && n!=12) { for (i=22; i-- ;) if (!permanent[i]) SendDlgItemMessage (hwnd, IDC5_LIST, LB_DELETESTRING, i, 0); } } break; case IDC5_PALETTE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.try_palette = IsDlgButtonChecked (hwnd, IDC5_PALETTE); break; case IDC5_LIST: if (HIWORD(wParam) == LBN_DBLCLK || HIWORD(wParam) == LBN_SELCHANGE) { int i = SendDlgItemMessage (hwnd, IDC5_LIST, LB_GETCURSEL, 0, 0); if (!cfg.bold_colour) i = (i < 3 ? i*2 : i == 3 ? 5 : i*2-2); SetDlgItemInt (hwnd, IDC5_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt (hwnd, IDC5_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt (hwnd, IDC5_BVALUE, cfg.colours[i][2], FALSE); } break; case IDC5_CHANGE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { static CHOOSECOLOR cc; static DWORD custom[16] = {0}; /* zero initialisers */ int i = SendDlgItemMessage (hwnd, IDC5_LIST, LB_GETCURSEL, 0, 0); if (!cfg.bold_colour) i = (i < 3 ? i*2 : i == 3 ? 5 : i*2-2); cc.lStructSize = sizeof(cc); cc.hwndOwner = hwnd; cc.hInstance = hinst; cc.lpCustColors = custom; cc.rgbResult = RGB (cfg.colours[i][0], cfg.colours[i][1], cfg.colours[i][2]); cc.Flags = CC_FULLOPEN | CC_RGBINIT; if (ChooseColor(&cc)) { cfg.colours[i][0] = (unsigned char) (cc.rgbResult & 0xFF); cfg.colours[i][1] = (unsigned char) (cc.rgbResult >> 8) & 0xFF; cfg.colours[i][2] = (unsigned char) (cc.rgbResult >> 16) & 0xFF; SetDlgItemInt (hwnd, IDC5_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt (hwnd, IDC5_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt (hwnd, IDC5_BVALUE, cfg.colours[i][2], FALSE); } } break; } break; } return GeneralPanelProc (hwnd, msg, wParam, lParam); } static DTemplate negot, main, reconf, panels[NPANELS]; static DLGPROC panelproc[NPANELS] = { ConnectionProc, KeyboardProc, TerminalProc, TelnetProc, SshProc, SelectionProc, ColourProc }; static char *panelids[NPANELS] = { MAKEINTRESOURCE(IDD_PANEL0), MAKEINTRESOURCE(IDD_PANEL1), MAKEINTRESOURCE(IDD_PANEL2), MAKEINTRESOURCE(IDD_PANEL3), MAKEINTRESOURCE(IDD_PANEL35), MAKEINTRESOURCE(IDD_PANEL4), MAKEINTRESOURCE(IDD_PANEL5) }; static char *names[NPANELS] = { "Connection", "Keyboard", "Terminal", "Telnet", "SSH", "Selection", "Colours" }; static int mainp[MAIN_NPANELS] = { 0, 1, 2, 3, 4, 5, 6 }; static int reconfp[RECONF_NPANELS] = { 1, 2, 5, 6 }; static int GenericMainDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, int npanels, int *panelnums, HWND *page) { HWND hw; switch (msg) { case WM_INITDIALOG: { /* centre the window */ RECT rs, rd; hw = GetDesktopWindow(); if (GetWindowRect (hw, &rs) && GetWindowRect (hwnd, &rd)) MoveWindow (hwnd, (rs.right + rs.left + rd.left - rd.right)/2, (rs.bottom + rs.top + rd.top - rd.bottom)/2, rd.right-rd.left, rd.bottom-rd.top, TRUE); } *page = NULL; { /* initialise the tab control */ TC_ITEMHEADER tab; int i; hw = GetDlgItem (hwnd, IDC_TAB); for (i=0; icode == TCN_SELCHANGE) { int i = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom); if (*page) DestroyWindow (*page); /* *page = CreateDialogIndirect (hinst, panels[panelnums[i]].temp, hwnd, panelproc[panelnums[i]]);*/ *page = CreateDialog (hinst, panelids[panelnums[i]], hwnd, panelproc[panelnums[i]]); SetWindowLong (*page, GWL_EXSTYLE, GetWindowLong (*page, GWL_EXSTYLE) | WS_EX_CONTROLPARENT); SetFocus (((LPNMHDR)lParam)->hwndFrom); /* ensure focus stays */ return 0; } break; /* case WM_CTLCOLORDLG: */ /* return (int) GetStockObject (LTGRAY_BRUSH); */ case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if (*cfg.host) EndDialog (hwnd, 1); else MessageBeep (0); return 0; case IDCANCEL: EndDialog (hwnd, 0); return 0; } return 0; case WM_CLOSE: EndDialog (hwnd, 0); return 0; } return 0; } static int CALLBACK MainDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { #if 0 HWND hw; int i; #endif static HWND page = NULL; if (msg == WM_COMMAND && LOWORD(wParam) == IDOK) { #if 0 /* * If the Connection panel is active and the Session List * box is selected, we treat a press of Open to have an * implicit press of Load preceding it. */ hw = GetDlgItem (hwnd, IDC_TAB); i = TabCtrl_GetCurSel(hw); if (panelproc[mainp[i]] == ConnectionProc && page && implicit_load_ok) { SendMessage (page, WM_COMMAND, MAKELONG(IDC0_SESSLOAD, BN_CLICKED), 0); } #endif } if (msg == WM_COMMAND && LOWORD(wParam) == IDC_ABOUT) { EnableWindow(hwnd, 0); DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), GetParent(hwnd), AboutProc); EnableWindow(hwnd, 1); } return GenericMainDlgProc (hwnd, msg, wParam, lParam, MAIN_NPANELS, mainp, &page); } static int CALLBACK ReconfDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND page; return GenericMainDlgProc (hwnd, msg, wParam, lParam, RECONF_NPANELS, reconfp, &page); } static void get_sesslist(int allocate) { static char *buffer; int buflen, bufsize, i, ret; char otherbuf[2048]; char *p; HKEY subkey1; if (allocate) { if (RegCreateKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS) return; buflen = bufsize = 0; buffer = NULL; i = 0; do { ret = RegEnumKey(subkey1, i++, otherbuf, sizeof(otherbuf)); if (ret == ERROR_SUCCESS) { bufsize = buflen + 2048; buffer = srealloc(buffer, bufsize); unmungestr(otherbuf, buffer+buflen); buflen += strlen(buffer+buflen)+1; } } while (ret == ERROR_SUCCESS); buffer = srealloc(buffer, buflen+1); buffer[buflen] = '\0'; p = buffer; nsessions = 1; /* "Default Settings" counts as one */ while (*p) { if (strcmp(p, "Default Settings")) nsessions++; while (*p) p++; p++; } sessions = smalloc(nsessions * sizeof(char *)); sessions[0] = "Default Settings"; p = buffer; i = 1; while (*p) { if (strcmp(p, "Default Settings")) sessions[i++] = p; while (*p) p++; p++; } } else { sfree (buffer); sfree (sessions); } } int do_config (void) { int ret; get_sesslist(TRUE); ret = DialogBox (hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL, MainDlgProc); get_sesslist(FALSE); return ret; } int do_reconfig (HWND hwnd) { Config backup_cfg; int ret; backup_cfg = cfg; /* structure copy */ ret = DialogBox (hinst, MAKEINTRESOURCE(IDD_RECONF), hwnd, ReconfDlgProc); if (!ret) cfg = backup_cfg; /* structure copy */ return ret; } void do_defaults (char *session) { if (session) load_settings (session, TRUE); else load_settings ("Default Settings", FALSE); } void lognegot (char *string) { if (nnegots >= negsize) { negsize += 64; negots = srealloc (negots, negsize * sizeof(*negots)); } negots[nnegots] = smalloc(1+strlen(string)); strcpy (negots[nnegots], string); nnegots++; if (logbox) SendDlgItemMessage (logbox, IDN_LIST, LB_ADDSTRING, 0, (LPARAM)string); } void shownegot (HWND hwnd) { if (!logbox) { logbox = CreateDialog (hinst, MAKEINTRESOURCE(IDD_LOGBOX), hwnd, LogProc); ShowWindow (logbox, SW_SHOWNORMAL); } } void showabout (HWND hwnd) { if (!abtbox) { abtbox = CreateDialog (hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc); ShowWindow (abtbox, SW_SHOWNORMAL); } } void verify_ssh_host_key(char *host, struct RSAKey *key) { char *keystr, *otherstr, *mungedhost; int len; HKEY rkey; /* * Format the key into a string. */ len = rsastr_len(key); keystr = malloc(len); if (!keystr) fatalbox("Out of memory"); rsastr_fmt(keystr, key); /* * Now read a saved key in from the registry and see what it * says. */ otherstr = malloc(len); mungedhost = malloc(3*strlen(host)+1); if (!otherstr || !mungedhost) fatalbox("Out of memory"); mungestr(host, mungedhost); if (RegCreateKey(HKEY_CURRENT_USER, PUTTY_REG_POS "\\SshHostKeys", &rkey) != ERROR_SUCCESS) { if (MessageBox(NULL, "PuTTY was unable to open the host key cache\n" "in the registry. There is thus no way to tell\n" "if the remote host is what you think it is.\n" "Connect anyway?", "PuTTY Problem", MB_ICONWARNING | MB_YESNO) == IDNO) exit(0); } else { DWORD readlen = len; DWORD type; int ret; ret = RegQueryValueEx(rkey, mungedhost, NULL, &type, otherstr, &readlen); if (ret == ERROR_MORE_DATA || (ret == ERROR_SUCCESS && type == REG_SZ && strcmp(otherstr, keystr))) { if (MessageBox(NULL, "This host's host key is different from the\n" "one cached in the registry! Someone may be\n" "impersonating this host for malicious reasons;\n" "alternatively, the host key may have changed\n" "due to sloppy system administration.\n" "Replace key in registry and connect?", "PuTTY: Security Warning", MB_ICONWARNING | MB_YESNO) == IDNO) exit(0); RegSetValueEx(rkey, mungedhost, 0, REG_SZ, keystr, strlen(keystr)+1); } else if (ret != ERROR_SUCCESS || type != REG_SZ) { if (MessageBox(NULL, "This host's host key is not cached in the\n" "registry. Do you want to add it to the cache\n" "and carry on connecting?", "PuTTY: New Host", MB_ICONWARNING | MB_YESNO) == IDNO) exit(0); RegSetValueEx(rkey, mungedhost, 0, REG_SZ, keystr, strlen(keystr)+1); } RegCloseKey(rkey); } } Node-path: putty/window.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 41158 Text-content-md5: 3ee3a0ac68c7c117fc3ed79bd9da1cf3 Text-content-sha1: 008654b50d60aa50689198fd7ae999e6b7f27401 Content-length: 41274 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN555#include #include #include #include #include #define PUTTY_DO_GLOBALS /* actually _define_ globals */ #include "putty.h" #include "win_res.h" #define IDM_SHOWLOG 501 #define IDM_NEWSESS 502 #define IDM_DUPSESS 503 #define IDM_RECONF 504 #define IDM_CLRSB 505 #define IDM_RESET 506 #define IDM_TEL_AYT 507 #define IDM_TEL_BRK 508 #define IDM_TEL_SYNCH 509 #define IDM_TEL_EC 510 #define IDM_TEL_EL 511 #define IDM_TEL_GA 512 #define IDM_TEL_NOP 513 #define IDM_TEL_ABORT 514 #define IDM_TEL_AO 515 #define IDM_TEL_IP 516 #define IDM_TEL_SUSP 517 #define IDM_TEL_EOR 518 #define IDM_TEL_EOF 519 #define IDM_ABOUT 520 #define WM_IGNORE_SIZE (WM_USER + 2) #define WM_IGNORE_CLIP (WM_USER + 3) static int WINAPI WndProc (HWND, UINT, WPARAM, LPARAM); static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output); static void cfgtopalette(void); static void init_palette(void); static void init_fonts(void); static int extra_width, extra_height; #define FONT_NORMAL 0 #define FONT_BOLD 1 #define FONT_UNDERLINE 2 #define FONT_BOLDUND 3 #define FONT_OEM 4 #define FONT_OEMBOLD 5 #define FONT_OEMBOLDUND 6 #define FONT_OEMUND 7 static HFONT fonts[8]; static enum { BOLD_COLOURS, BOLD_SHADOW, BOLD_FONT } bold_mode; static enum { UND_LINE, UND_FONT } und_mode; static int descent; #define NCOLOURS 24 static COLORREF colours[NCOLOURS]; static HPALETTE pal; static LPLOGPALETTE logpal; static RGBTRIPLE defpal[NCOLOURS]; static HWND hwnd; static int dbltime, lasttime, lastact; static Mouse_Button lastbtn; static char *window_name, *icon_name; int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { static char appname[] = "PuTTY"; WORD winsock_ver; WSADATA wsadata; WNDCLASS wndclass; MSG msg; int guess_width, guess_height; winsock_ver = MAKEWORD(1, 1); if (WSAStartup(winsock_ver, &wsadata)) { MessageBox(NULL, "Unable to initialise WinSock", "WinSock Error", MB_OK | MB_ICONEXCLAMATION); return 1; } if (LOBYTE(wsadata.wVersion) != 1 || HIBYTE(wsadata.wVersion) != 1) { MessageBox(NULL, "WinSock version is incompatible with 1.1", "WinSock Error", MB_OK | MB_ICONEXCLAMATION); WSACleanup(); return 1; } /* WISHLIST: maybe allow config tweaking even if winsock not present? */ InitCommonControls(); /* * Process the command line. */ { char *p; do_defaults(NULL); p = cmdline; while (*p && isspace(*p)) p++; /* * An initial @ means to activate a saved session. */ if (*p == '@') { do_defaults (p+1); if (!*cfg.host && !do_config()) { WSACleanup(); return 0; } } else if (*p == '&') { /* * An initial & means we've been given a command line * containing the hex value of a HANDLE for a file * mapping object, which we must then extract as a * config. */ HANDLE filemap; Config *cp; if (sscanf(p+1, "%x", &filemap) == 1 && (cp = MapViewOfFile(filemap, FILE_MAP_READ, 0, 0, sizeof(Config))) != NULL) { cfg = *cp; UnmapViewOfFile(cp); CloseHandle(filemap); } else if (!do_config()) { WSACleanup(); return 0; } } else if (*p) { char *q = p; while (*p && !isspace(*p)) p++; if (*p) *p++ = '\0'; strncpy (cfg.host, q, sizeof(cfg.host)-1); cfg.host[sizeof(cfg.host)-1] = '\0'; while (*p && isspace(*p)) p++; if (*p) cfg.port = atoi(p); else cfg.port = -1; } else { if (!do_config()) { WSACleanup(); return 0; } } } back = (cfg.protocol == PROT_SSH ? &ssh_backend : &telnet_backend); if (!prev) { wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = inst; wndclass.hIcon = LoadIcon (inst, MAKEINTRESOURCE(IDI_MAINICON)); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = GetStockObject (BLACK_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = appname; RegisterClass (&wndclass); } hwnd = NULL; savelines = cfg.savelines; term_init(); cfgtopalette(); /* * Guess some defaults for the window size. This all gets * updated later, so we don't really care too much. However, we * do want the font width/height guesses to correspond to a * large font rather than a small one... */ font_width = 10; font_height = 20; extra_width = 25; extra_height = 28; term_size (cfg.height, cfg.width, cfg.savelines); guess_width = extra_width + font_width * cols; guess_height = extra_height + font_height * rows; { RECT r; HWND w = GetDesktopWindow(); GetWindowRect (w, &r); if (guess_width > r.right - r.left) guess_width = r.right - r.left; if (guess_height > r.bottom - r.top) guess_height = r.bottom - r.top; } hwnd = CreateWindow (appname, appname, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, guess_width, guess_height, NULL, NULL, inst, NULL); /* * Initialise the fonts, simultaneously correcting the guesses * for font_{width,height}. */ bold_mode = cfg.bold_colour ? BOLD_COLOURS : BOLD_FONT; und_mode = UND_FONT; init_fonts(); /* * Correct the guesses for extra_{width,height}. */ { RECT cr, wr; GetWindowRect (hwnd, &wr); GetClientRect (hwnd, &cr); extra_width = wr.right - wr.left - cr.right + cr.left; extra_height = wr.bottom - wr.top - cr.bottom + cr.top; } /* * Resize the window, now we know what size we _really_ want it * to be. */ guess_width = extra_width + font_width * cols; guess_height = extra_height + font_height * rows; SendMessage (hwnd, WM_IGNORE_SIZE, 0, 0); SetWindowPos (hwnd, NULL, 0, 0, guess_width, guess_height, SWP_NOMOVE | SWP_NOREDRAW | SWP_NOZORDER); /* * Initialise the scroll bar. */ { SCROLLINFO si; si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_DISABLENOSCROLL; si.nMin = 0; si.nMax = rows-1; si.nPage = rows; si.nPos = 0; SetScrollInfo (hwnd, SB_VERT, &si, FALSE); } /* * Start up the telnet connection. */ { char *error; char msg[1024]; char *realhost; error = back->init (hwnd, cfg.host, cfg.port, &realhost); if (error) { sprintf(msg, "Unable to open connection:\n%s", error); MessageBox(NULL, msg, "PuTTY Error", MB_ICONERROR | MB_OK); return 0; } window_name = icon_name = NULL; sprintf(msg, "PuTTY: %s", realhost); set_title (msg); set_icon (msg); } /* * Set up the input and output buffers. */ inbuf_reap = inbuf_head = 0; outbuf_reap = outbuf_head = 0; /* * Prepare the mouse handler. */ lastact = MA_NOTHING; lastbtn = MB_NOTHING; dbltime = GetDoubleClickTime(); /* * Set up the session-control options on the system menu. */ { HMENU m = GetSystemMenu (hwnd, FALSE); HMENU p; AppendMenu (m, MF_SEPARATOR, 0, 0); if (cfg.protocol == PROT_TELNET) { p = CreateMenu(); AppendMenu (p, MF_ENABLED, IDM_TEL_AYT, "Are You There"); AppendMenu (p, MF_ENABLED, IDM_TEL_BRK, "Break"); AppendMenu (p, MF_ENABLED, IDM_TEL_SYNCH, "Synch"); AppendMenu (p, MF_SEPARATOR, 0, 0); AppendMenu (p, MF_ENABLED, IDM_TEL_EC, "Erase Character"); AppendMenu (p, MF_ENABLED, IDM_TEL_EL, "Erase Line"); AppendMenu (p, MF_ENABLED, IDM_TEL_GA, "Go Ahead"); AppendMenu (p, MF_ENABLED, IDM_TEL_NOP, "No Operation"); AppendMenu (p, MF_SEPARATOR, 0, 0); AppendMenu (p, MF_ENABLED, IDM_TEL_ABORT, "Abort Process"); AppendMenu (p, MF_ENABLED, IDM_TEL_AO, "Abort Output"); AppendMenu (p, MF_ENABLED, IDM_TEL_IP, "Interrupt Process"); AppendMenu (p, MF_ENABLED, IDM_TEL_SUSP, "Suspend Process"); AppendMenu (p, MF_SEPARATOR, 0, 0); AppendMenu (p, MF_ENABLED, IDM_TEL_EOR, "End Of Record"); AppendMenu (p, MF_ENABLED, IDM_TEL_EOF, "End Of File"); AppendMenu (m, MF_POPUP | MF_ENABLED, (UINT) p, "Telnet Command"); AppendMenu (m, MF_ENABLED, IDM_SHOWLOG, "Show Negotiation"); AppendMenu (m, MF_SEPARATOR, 0, 0); } AppendMenu (m, MF_ENABLED, IDM_NEWSESS, "New Session"); AppendMenu (m, MF_ENABLED, IDM_DUPSESS, "Duplicate Session"); AppendMenu (m, MF_ENABLED, IDM_RECONF, "Change Settings"); AppendMenu (m, MF_SEPARATOR, 0, 0); AppendMenu (m, MF_ENABLED, IDM_CLRSB, "Clear Scrollback"); AppendMenu (m, MF_ENABLED, IDM_RESET, "Reset Terminal"); AppendMenu (m, MF_SEPARATOR, 0, 0); AppendMenu (m, MF_ENABLED, IDM_ABOUT, "About PuTTY"); } /* * Finally show the window! */ ShowWindow (hwnd, show); /* * Set the palette up. */ pal = NULL; logpal = NULL; init_palette(); has_focus = (GetForegroundWindow() == hwnd); UpdateWindow (hwnd); while (GetMessage (&msg, NULL, 0, 0)) { DispatchMessage (&msg); if (inbuf_reap != inbuf_head) term_out(); /* In idle moments, do a full screen update */ if (!PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) term_update(); } /* * Clean up. */ { int i; for (i=0; i<8; i++) if (fonts[i]) DeleteObject(fonts[i]); } sfree(logpal); if (pal) DeleteObject(pal); WSACleanup(); if (cfg.protocol == PROT_SSH) random_save_seed(); return msg.wParam; } /* * Copy the colour palette from the configuration data into defpal. * This is non-trivial because the colour indices are different. */ static void cfgtopalette(void) { int i; static const int ww[] = { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, 1, 2, 3, 4, 4, 5, 5 }; for (i=0; i<24; i++) { int w = ww[i]; defpal[i].rgbtRed = cfg.colours[w][0]; defpal[i].rgbtGreen = cfg.colours[w][1]; defpal[i].rgbtBlue = cfg.colours[w][2]; } } /* * Set up the colour palette. */ static void init_palette(void) { int i; HDC hdc = GetDC (hwnd); if (hdc) { if (cfg.try_palette && GetDeviceCaps (hdc, RASTERCAPS) & RC_PALETTE) { logpal = smalloc(sizeof(*logpal) - sizeof(logpal->palPalEntry) + NCOLOURS * sizeof(PALETTEENTRY)); logpal->palVersion = 0x300; logpal->palNumEntries = NCOLOURS; for (i = 0; i < NCOLOURS; i++) { logpal->palPalEntry[i].peRed = defpal[i].rgbtRed; logpal->palPalEntry[i].peGreen = defpal[i].rgbtGreen; logpal->palPalEntry[i].peBlue = defpal[i].rgbtBlue; logpal->palPalEntry[i].peFlags = PC_NOCOLLAPSE; } pal = CreatePalette (logpal); if (pal) { SelectPalette (hdc, pal, FALSE); RealizePalette (hdc); SelectPalette (hdc, GetStockObject (DEFAULT_PALETTE), FALSE); } } ReleaseDC (hwnd, hdc); } if (pal) for (i=0; i= font_height) descent = font_height - 1; } widths[i] = tm.tmAveCharWidth; } } ReleaseDC (hwnd, hdc); if (widths[FONT_UNDERLINE] != widths[FONT_NORMAL] || (bold_mode == BOLD_FONT && widths[FONT_BOLDUND] != widths[FONT_BOLD])) { und_mode = UND_LINE; DeleteObject (fonts[FONT_UNDERLINE]); if (bold_mode == BOLD_FONT) DeleteObject (fonts[FONT_BOLDUND]); } if (bold_mode == BOLD_FONT && widths[FONT_BOLD] != widths[FONT_NORMAL]) { bold_mode = BOLD_SHADOW; DeleteObject (fonts[FONT_BOLD]); if (und_mode == UND_FONT) DeleteObject (fonts[FONT_BOLDUND]); } if (cfg.vtmode == VT_OEMANSI && widths[FONT_OEM] != widths[FONT_NORMAL]) { MessageBox(NULL, "The OEM and ANSI versions of this font are\n" "different sizes. Using OEM-only mode instead", "Font Size Mismatch", MB_ICONINFORMATION | MB_OK); cfg.vtmode = VT_OEMONLY; for (i=0; i<4; i++) if (fonts[i]) DeleteObject (fonts[i]); } } void request_resize (int w, int h) { int width = extra_width + font_width * w; int height = extra_height + font_height * h; SetWindowPos (hwnd, NULL, 0, 0, width, height, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); } static void click (Mouse_Button b, int x, int y) { if (lastbtn == b && GetMessageTime() - lasttime < dbltime) { lastact = (lastact == MA_CLICK ? MA_2CLK : lastact == MA_2CLK ? MA_3CLK : lastact == MA_3CLK ? MA_CLICK : MA_NOTHING); } else { lastbtn = b; lastact = MA_CLICK; } if (lastact != MA_NOTHING) term_mouse (b, lastact, x, y); lasttime = GetMessageTime(); } static int WINAPI WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; static int ignore_size = FALSE; static int ignore_clip = FALSE; static int just_reconfigged = FALSE; switch (message) { case WM_CREATE: break; case WM_DESTROY: PostQuitMessage (0); return 0; case WM_SYSCOMMAND: switch (wParam) { case IDM_SHOWLOG: shownegot(hwnd); break; case IDM_NEWSESS: case IDM_DUPSESS: { char b[2048]; char c[30], *cl; STARTUPINFO si; PROCESS_INFORMATION pi; HANDLE filemap = NULL; if (wParam == IDM_DUPSESS) { /* * Allocate a file-mapping memory chunk for the * config structure. */ SECURITY_ATTRIBUTES sa; Config *p; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; filemap = CreateFileMapping((HANDLE)0xFFFFFFFF, &sa, PAGE_READWRITE, 0, sizeof(Config), NULL); if (filemap) { p = (Config *)MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, sizeof(Config)); if (p) { *p = cfg; /* structure copy */ UnmapViewOfFile(p); } } sprintf(c, "putty &%08x", filemap); cl = c; } else cl = NULL; GetModuleFileName (NULL, b, sizeof(b)-1); si.cb = sizeof(si); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = NULL; si.dwFlags = 0; si.cbReserved2 = 0; si.lpReserved2 = NULL; CreateProcess (b, cl, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); if (filemap) CloseHandle(filemap); } break; case IDM_RECONF: if (!do_reconfig(hwnd)) break; just_reconfigged = TRUE; { int i; for (i=0; i<8; i++) if (fonts[i]) DeleteObject(fonts[i]); } bold_mode = cfg.bold_colour ? BOLD_COLOURS : BOLD_FONT; und_mode = UND_FONT; init_fonts(); sfree(logpal); if (pal) DeleteObject(pal); logpal = NULL; pal = NULL; cfgtopalette(); init_palette(); term_size(cfg.height, cfg.width, cfg.savelines); InvalidateRect(hwnd, NULL, TRUE); SetWindowPos (hwnd, NULL, 0, 0, extra_width + font_width * cfg.width, extra_height + font_height * cfg.height, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); if (IsIconic(hwnd)) { SetWindowText (hwnd, cfg.win_name_always ? window_name : icon_name); } break; case IDM_CLRSB: term_clrsb(); break; case IDM_RESET: term_pwron(); break; case IDM_TEL_AYT: back->special (TS_AYT); break; case IDM_TEL_BRK: back->special (TS_BRK); break; case IDM_TEL_SYNCH: back->special (TS_SYNCH); break; case IDM_TEL_EC: back->special (TS_EC); break; case IDM_TEL_EL: back->special (TS_EL); break; case IDM_TEL_GA: back->special (TS_GA); break; case IDM_TEL_NOP: back->special (TS_NOP); break; case IDM_TEL_ABORT: back->special (TS_ABORT); break; case IDM_TEL_AO: back->special (TS_AO); break; case IDM_TEL_IP: back->special (TS_IP); break; case IDM_TEL_SUSP: back->special (TS_SUSP); break; case IDM_TEL_EOR: back->special (TS_EOR); break; case IDM_TEL_EOF: back->special (TS_EOF); break; case IDM_ABOUT: showabout (hwnd); break; } break; case WM_LBUTTONDOWN: click (MB_SELECT, LOWORD(lParam) / font_width, HIWORD(lParam) / font_height); return 0; case WM_LBUTTONUP: term_mouse (MB_SELECT, MA_RELEASE, LOWORD(lParam) / font_width, HIWORD(lParam) / font_height); return 0; case WM_MBUTTONDOWN: click (cfg.mouse_is_xterm ? MB_PASTE : MB_EXTEND, LOWORD(lParam) / font_width, HIWORD(lParam) / font_height); return 0; case WM_MBUTTONUP: term_mouse (cfg.mouse_is_xterm ? MB_PASTE : MB_EXTEND, MA_RELEASE, LOWORD(lParam) / font_width, HIWORD(lParam) / font_height); return 0; case WM_RBUTTONDOWN: click (cfg.mouse_is_xterm ? MB_EXTEND : MB_PASTE, LOWORD(lParam) / font_width, HIWORD(lParam) / font_height); return 0; case WM_RBUTTONUP: term_mouse (cfg.mouse_is_xterm ? MB_EXTEND : MB_PASTE, MA_RELEASE, LOWORD(lParam) / font_width, HIWORD(lParam) / font_height); return 0; case WM_MOUSEMOVE: /* * Add the mouse position and message time to the random * number noise, if we're using ssh. */ if (cfg.protocol == PROT_SSH) noise_ultralight(lParam); if (wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) { Mouse_Button b; if (wParam & MK_LBUTTON) b = MB_SELECT; else if (wParam & MK_MBUTTON) b = cfg.mouse_is_xterm ? MB_PASTE : MB_EXTEND; else b = cfg.mouse_is_xterm ? MB_EXTEND : MB_PASTE; term_mouse (b, MA_DRAG, LOWORD(lParam) / font_width, HIWORD(lParam) / font_height); } lastbtn = MB_NOTHING; lastact = MA_NOTHING; lasttime = GetMessageTime(); return 0; case WM_IGNORE_CLIP: ignore_clip = wParam; /* don't panic on DESTROYCLIPBOARD */ break; case WM_DESTROYCLIPBOARD: if (!ignore_clip) term_deselect(); ignore_clip = FALSE; return 0; case WM_PAINT: { PAINTSTRUCT p; hdc = BeginPaint (hwnd, &p); if (pal) { SelectPalette (hdc, pal, TRUE); RealizePalette (hdc); } term_paint (hdc, p.rcPaint.left, p.rcPaint.top, p.rcPaint.right, p.rcPaint.bottom); SelectObject (hdc, GetStockObject(SYSTEM_FONT)); SelectObject (hdc, GetStockObject(WHITE_PEN)); EndPaint (hwnd, &p); } return 0; case WM_NETEVENT: { int i = back->msg (wParam, lParam); if (i < 0) { char buf[1024]; switch (WSABASEERR + (-i) % 10000) { case WSAECONNRESET: sprintf(buf, "Connection reset by peer"); break; default: sprintf(buf, "Unexpected network error %d", -i); break; } MessageBox(hwnd, buf, "PuTTY Fatal Error", MB_ICONERROR | MB_OK); PostQuitMessage(1); } else if (i == 0) { if (cfg.close_on_exit) PostQuitMessage(0); else { MessageBox(hwnd, "Connection closed by remote host", "PuTTY", MB_OK | MB_ICONINFORMATION); SetWindowText (hwnd, "PuTTY (inactive)"); } } } return 0; case WM_SETFOCUS: has_focus = TRUE; term_out(); term_update(); break; case WM_KILLFOCUS: has_focus = FALSE; term_out(); term_update(); break; case WM_IGNORE_SIZE: ignore_size = TRUE; /* don't panic on next WM_SIZE msg */ break; case WM_SIZING: { int width, height, w, h, ew, eh; LPRECT r = (LPRECT)lParam; width = r->right - r->left - extra_width; height = r->bottom - r->top - extra_height; w = (width + font_width/2) / font_width; if (w < 1) w = 1; h = (height + font_height/2) / font_height; if (h < 1) h = 1; ew = width - w * font_width; eh = height - h * font_height; if (ew != 0) { if (wParam == WMSZ_LEFT || wParam == WMSZ_BOTTOMLEFT || wParam == WMSZ_TOPLEFT) r->left += ew; else r->right -= ew; } if (eh != 0) { if (wParam == WMSZ_TOP || wParam == WMSZ_TOPRIGHT || wParam == WMSZ_TOPLEFT) r->top += eh; else r->bottom -= eh; } if (ew || eh) return 1; else return 0; } break; case WM_SIZE: if (wParam == SIZE_MINIMIZED) { SetWindowText (hwnd, cfg.win_name_always ? window_name : icon_name); break; } if (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED) SetWindowText (hwnd, window_name); if (!ignore_size) { int width, height, w, h, ew, eh; width = LOWORD(lParam); height = HIWORD(lParam); w = width / font_width; if (w < 1) w = 1; h = height / font_height; if (h < 1) h = 1; #if 0 /* we have fixed this using WM_SIZING now */ ew = width - w * font_width; eh = height - h * font_height; if (ew != 0 || eh != 0) { RECT r; GetWindowRect (hwnd, &r); SendMessage (hwnd, WM_IGNORE_SIZE, 0, 0); SetWindowPos (hwnd, NULL, 0, 0, r.right - r.left - ew, r.bottom - r.top - eh, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); } #endif if (w != cols || h != rows || just_reconfigged) { term_invalidate(); term_size (h, w, cfg.savelines); back->size(); just_reconfigged = FALSE; } } ignore_size = FALSE; return 0; case WM_VSCROLL: switch (LOWORD(wParam)) { case SB_BOTTOM: term_scroll(-1, 0); break; case SB_TOP: term_scroll(+1, 0); break; case SB_LINEDOWN: term_scroll (0, +1); break; case SB_LINEUP: term_scroll (0, -1); break; case SB_PAGEDOWN: term_scroll (0, +rows/2); break; case SB_PAGEUP: term_scroll (0, -rows/2); break; case SB_THUMBPOSITION: case SB_THUMBTRACK: term_scroll (1, HIWORD(wParam)); break; } break; case WM_PALETTECHANGED: if ((HWND) wParam != hwnd && pal != NULL) { HDC hdc = get_ctx(); if (hdc) { if (RealizePalette (hdc) > 0) UpdateColors (hdc); free_ctx (hdc); } } break; case WM_QUERYNEWPALETTE: if (pal != NULL) { HDC hdc = get_ctx(); if (hdc) { if (RealizePalette (hdc) > 0) UpdateColors (hdc); free_ctx (hdc); return TRUE; } } return FALSE; case WM_KEYDOWN: case WM_SYSKEYDOWN: /* * Add the scan code and keypress timing to the random * number noise, if we're using ssh. */ if (cfg.protocol == PROT_SSH) noise_ultralight(lParam); /* * We don't do TranslateMessage since it disassociates the * resulting CHAR message from the KEYDOWN that sparked it, * which we occasionally don't want. Instead, we process * KEYDOWN, and call the Win32 translator functions so that * we get the translations under _our_ control. */ { unsigned char buf[20]; int len; len = TranslateKey (wParam, lParam, buf); back->send (buf, len); } return 0; case WM_CHAR: case WM_SYSCHAR: /* * Nevertheless, we are prepared to deal with WM_CHAR * messages, should they crop up. So if someone wants to * post the things to us as part of a macro manoeuvre, * we're ready to cope. */ { char c = wParam; back->send (&c, 1); } return 0; } return DefWindowProc (hwnd, message, wParam, lParam); } /* * Draw a line of text in the window, at given character * coordinates, in given attributes. * * We are allowed to fiddle with the contents of `text'. */ void do_text (Context ctx, int x, int y, char *text, int len, unsigned long attr) { COLORREF fg, bg, t; int nfg, nbg, nfont; HDC hdc = ctx; x *= font_width; y *= font_height; if (attr & ATTR_ACTCURS) { attr &= (bold_mode == BOLD_COLOURS ? 0x200 : 0x300); attr ^= ATTR_CUR_XOR; } nfont = 0; if (cfg.vtmode == VT_OEMONLY) nfont |= FONT_OEM; /* * Map high-half characters in order to approximate ISO using * OEM character set. Characters missing are 0xC3 (Atilde) and * 0xCC (Igrave). */ if (nfont & FONT_OEM) { int i; for (i=0; i= '\xA0' && text[i] <= '\xFF') { static const char oemhighhalf[] = "\x20\xAD\xBD\x9C\xCF\xBE\xDD\xF5" /* A0-A7 */ "\xF9\xB8\xA6\xAE\xAA\xF0\xA9\xEE" /* A8-AF */ "\xF8\xF1\xFD\xFC\xEF\xE6\xF4\xFA" /* B0-B7 */ "\xF7\xFB\xA7\xAF\xAC\xAB\xF3\xA8" /* B8-BF */ "\xB7\xB5\xB6\x41\x8E\x8F\x92\x80" /* C0-C7 */ "\xD4\x90\xD2\xD3\x49\xD6\xD7\xD8" /* C8-CF */ "\xD1\xA5\xE3\xE0\xE2\xE5\x99\x9E" /* D0-D7 */ "\x9D\xEB\xE9\xEA\x9A\xED\xE8\xE1" /* D8-DF */ "\x85\xA0\x83\xC6\x84\x86\x91\x87" /* E0-E7 */ "\x8A\x82\x88\x89\x8D\xA1\x8C\x8B" /* E8-EF */ "\xD0\xA4\x95\xA2\x93\xE4\x94\xF6" /* F0-F7 */ "\x9B\x97\xA3\x96\x81\xEC\xE7\x98" /* F8-FF */ ; text[i] = oemhighhalf[(unsigned char)text[i] - 0xA0]; } } if (attr & ATTR_GBCHR) { int i; /* * GB mapping: map # to pound, and everything else stays * normal. */ for (i=0; i= '\x60' && text[i] <= '\x7E') text[i] += '\x01' - '\x60'; break; case VT_OEMANSI: case VT_OEMONLY: nfont |= FONT_OEM; for (i=0; i= '\x60' && text[i] <= '\x7E') text[i] = oemmap[(unsigned char)text[i] - 0x60]; break; case VT_POORMAN: for (i=0; i= '\x60' && text[i] <= '\x7E') text[i] = poorman[(unsigned char)text[i] - 0x60]; break; } } nfg = 2 * ((attr & ATTR_FGMASK) >> ATTR_FGSHIFT); nbg = 2 * ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT); if (bold_mode == BOLD_FONT && (attr & ATTR_BOLD)) nfont |= FONT_BOLD; if (und_mode == UND_FONT && (attr & ATTR_UNDER)) nfont |= FONT_UNDERLINE; if (attr & ATTR_REVERSE) { t = nfg; nfg = nbg; nbg = t; } if (bold_mode == BOLD_COLOURS && (attr & ATTR_BOLD)) nfg++; fg = colours[nfg]; bg = colours[nbg]; SelectObject (hdc, fonts[nfont]); SetTextColor (hdc, fg); SetBkColor (hdc, bg); SetBkMode (hdc, OPAQUE); TextOut (hdc, x, y, text, len); if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) { SetBkMode (hdc, TRANSPARENT); TextOut (hdc, x-1, y, text, len); } if (und_mode == UND_LINE && (attr & ATTR_UNDER)) { SelectObject (hdc, CreatePen(PS_SOLID, 0, fg)); MoveToEx (hdc, x, y+descent, NULL); LineTo (hdc, x+len*font_width, y+descent); } if (attr & ATTR_PASCURS) { POINT pts[5]; pts[0].x = pts[1].x = pts[4].x = x; pts[2].x = pts[3].x = x+font_width-1; pts[0].y = pts[3].y = pts[4].y = y; pts[1].y = pts[2].y = y+font_height-1; SelectObject (hdc, CreatePen(PS_SOLID, 0, colours[23])); Polyline (hdc, pts, 5); } } /* * Translate a WM_(SYS)?KEYDOWN message into a string of ASCII * codes. Returns number of bytes used. */ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) { unsigned char *p = output; BYTE keystate[256]; int ret, code; /* * Prepend ESC if ALT was pressed at the time. */ if (lParam & 0x20000000) *p++ = 0x1B; /* * Get hold of the keyboard state, because we'll need it a few * times shortly. */ ret = GetKeyboardState(keystate); /* * Shift-PgUp, Shift-PgDn, and Alt-F4 all produce window * events: we'll deal with those now. */ if (ret && (keystate[VK_SHIFT] & 0x80) && wParam == VK_PRIOR) { SendMessage (hwnd, WM_VSCROLL, SB_PAGEUP, 0); return 0; } if (ret && (keystate[VK_SHIFT] & 0x80) && wParam == VK_NEXT) { SendMessage (hwnd, WM_VSCROLL, SB_PAGEDOWN, 0); return 0; } if ((lParam & 0x20000000) && wParam == VK_F4) { SendMessage (hwnd, WM_DESTROY, 0, 0); return 0; } /* * In general, the strategy is to see what the Windows keymap * translation has to say for itself, and then process function * keys and suchlike ourselves if that fails. But first we must * deal with the small number of special cases which the * Windows keymap translator thinks it can do but gets wrong. * * First special case: we might want the Backspace key to send * 0x7F not 0x08. */ if (wParam == VK_BACK) { *p++ = (cfg.bksp_is_delete ? 0x7F : 0x08); return p - output; } /* * Control-Space should send ^@ (0x00), not Space. */ if (ret && (keystate[VK_CONTROL] & 0x80) && wParam == VK_SPACE) { *p++ = 0x00; return p - output; } /* * If we're in applications keypad mode, we have to process it * before char-map translation, because it will pre-empt lots * of stuff, even if NumLock is off. */ if (app_keypad_keys) { if (ret) { /* * Hack to ensure NumLock doesn't interfere with * perception of Shift for Keypad Plus. I don't pretend * to understand this, but it seems to work as is. * Leave it alone, or die. */ keystate[VK_NUMLOCK] = 0; SetKeyboardState (keystate); GetKeyboardState (keystate); } switch ( (lParam >> 16) & 0x1FF ) { case 0x145: p += sprintf((char *)p, "\x1BOP"); return p - output; case 0x135: p += sprintf((char *)p, "\x1BOQ"); return p - output; case 0x037: p += sprintf((char *)p, "\x1BOR"); return p - output; case 0x047: p += sprintf((char *)p, "\x1BOw"); return p - output; case 0x048: p += sprintf((char *)p, "\x1BOx"); return p - output; case 0x049: p += sprintf((char *)p, "\x1BOy"); return p - output; case 0x04A: p += sprintf((char *)p, "\x1BOS"); return p - output; case 0x04B: p += sprintf((char *)p, "\x1BOt"); return p - output; case 0x04C: p += sprintf((char *)p, "\x1BOu"); return p - output; case 0x04D: p += sprintf((char *)p, "\x1BOv"); return p - output; case 0x04E: /* keypad + is ^[Ol, but ^[Om with Shift */ p += sprintf((char *)p, (ret && (keystate[VK_SHIFT] & 0x80)) ? "\x1BOm" : "\x1BOl"); return p - output; case 0x04F: p += sprintf((char *)p, "\x1BOq"); return p - output; case 0x050: p += sprintf((char *)p, "\x1BOr"); return p - output; case 0x051: p += sprintf((char *)p, "\x1BOs"); return p - output; case 0x052: p += sprintf((char *)p, "\x1BOp"); return p - output; case 0x053: p += sprintf((char *)p, "\x1BOn"); return p - output; case 0x11C: p += sprintf((char *)p, "\x1BOM"); return p - output; } } /* * Before doing Windows charmap translation, remove ALT from * the keymap, since its sole effect should be to prepend ESC, * which we've already done. Note that removal of ALT has to * happen _after_ the above call to SetKeyboardState, or dire * things will befall. */ keystate[VK_MENU] = keystate[VK_LMENU] = keystate[VK_RMENU] = 0; /* * Attempt the Windows char-map translation. */ if (ret) { WORD chr; int r = ToAscii (wParam, (lParam >> 16) & 0xFF, keystate, &chr, 0); if (r == 1) { *p++ = chr & 0xFF; return p - output; } } /* * OK, we haven't had a key code from the keymap translation. * We'll try our various special cases and function keys, and * then give up. (There's nothing wrong with giving up: * Scrollock, Pause/Break, and of course the various buckybit * keys all produce KEYDOWN events that we really _do_ want to * ignore.) */ /* * Control-2 should return ^@ (0x00), Control-6 should return * ^^ (0x1E), and Control-Minus should return ^_ (0x1F). Since * the DOS keyboard handling did it, and we have nothing better * to do with the key combo in question, we'll also map * Control-Backquote to ^\ (0x1C). */ if (ret && (keystate[VK_CONTROL] & 0x80) && wParam == '2') { *p++ = 0x00; return p - output; } if (ret && (keystate[VK_CONTROL] & 0x80) && wParam == '6') { *p++ = 0x1E; return p - output; } if (ret && (keystate[VK_CONTROL] & 0x80) && wParam == 0xBD) { *p++ = 0x1F; return p - output; } if (ret && (keystate[VK_CONTROL] & 0x80) && wParam == 0xDF) { *p++ = 0x1C; return p - output; } /* * First, all the keys that do tilde codes. (ESC '[' nn '~', * for integer decimal nn.) * * We also deal with the weird ones here. Linux VCs replace F1 * to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but * does replace Home and End (1~ and 4~) by ESC [ H and ESC O w * respectively. */ code = 0; switch (wParam) { case VK_F1: code = (keystate[VK_SHIFT] & 0x80 ? 23 : 11); break; case VK_F2: code = (keystate[VK_SHIFT] & 0x80 ? 24 : 12); break; case VK_F3: code = (keystate[VK_SHIFT] & 0x80 ? 25 : 13); break; case VK_F4: code = (keystate[VK_SHIFT] & 0x80 ? 26 : 14); break; case VK_F5: code = (keystate[VK_SHIFT] & 0x80 ? 28 : 15); break; case VK_F6: code = (keystate[VK_SHIFT] & 0x80 ? 29 : 17); break; case VK_F7: code = (keystate[VK_SHIFT] & 0x80 ? 31 : 18); break; case VK_F8: code = (keystate[VK_SHIFT] & 0x80 ? 32 : 19); break; case VK_F9: code = (keystate[VK_SHIFT] & 0x80 ? 33 : 20); break; case VK_F10: code = (keystate[VK_SHIFT] & 0x80 ? 34 : 21); break; case VK_F11: code = 23; break; case VK_F12: code = 24; break; case VK_HOME: code = 1; break; case VK_INSERT: code = 2; break; case VK_DELETE: code = 3; break; case VK_END: code = 4; break; case VK_PRIOR: code = 5; break; case VK_NEXT: code = 6; break; } if (cfg.linux_funkeys && code >= 11 && code <= 15) { p += sprintf((char *)p, "\x1B[[%c", code + 'A' - 11); return p - output; } if (cfg.rxvt_homeend && (code == 1 || code == 4)) { p += sprintf((char *)p, code == 1 ? "\x1B[H" : "\x1BOw"); return p - output; } if (code) { p += sprintf((char *)p, "\x1B[%d~", code); return p - output; } /* * Now the remaining keys (arrows and Keypad 5. Keypad 5 for * some reason seems to send VK_CLEAR to Windows...). */ switch (wParam) { case VK_UP: p += sprintf((char *)p, app_cursor_keys ? "\x1BOA" : "\x1B[A"); return p - output; case VK_DOWN: p += sprintf((char *)p, app_cursor_keys ? "\x1BOB" : "\x1B[B"); return p - output; case VK_RIGHT: p += sprintf((char *)p, app_cursor_keys ? "\x1BOC" : "\x1B[C"); return p - output; case VK_LEFT: p += sprintf((char *)p, app_cursor_keys ? "\x1BOD" : "\x1B[D"); return p - output; case VK_CLEAR: p += sprintf((char *)p, "\x1B[G"); return p - output; } return 0; } void set_title (char *title) { sfree (window_name); window_name = smalloc(1+strlen(title)); strcpy (window_name, title); if (!IsIconic(hwnd)) SetWindowText (hwnd, title); } void set_icon (char *title) { sfree (icon_name); icon_name = smalloc(1+strlen(title)); strcpy (icon_name, title); if (IsIconic(hwnd)) SetWindowText (hwnd, title); } void set_sbar (int total, int start, int page) { SCROLLINFO si; si.cbSize = sizeof(si); si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_DISABLENOSCROLL; si.nMin = 0; si.nMax = total - 1; si.nPage = page; si.nPos = start; SetScrollInfo (hwnd, SB_VERT, &si, TRUE); } Context get_ctx() { HDC hdc; if (hwnd) { hdc = GetDC (hwnd); if (hdc && pal) SelectPalette (hdc, pal, FALSE); return hdc; } else return NULL; } void free_ctx (Context ctx) { SelectPalette (ctx, GetStockObject (DEFAULT_PALETTE), FALSE); ReleaseDC (hwnd, ctx); } static void real_palette_set (int n, int r, int g, int b) { if (pal) { logpal->palPalEntry[n].peRed = r; logpal->palPalEntry[n].peGreen = g; logpal->palPalEntry[n].peBlue = b; logpal->palPalEntry[n].peFlags = PC_NOCOLLAPSE; colours[n] = PALETTERGB(r, g, b); SetPaletteEntries (pal, 0, NCOLOURS, logpal->palPalEntry); } else colours[n] = RGB(r, g, b); } void palette_set (int n, int r, int g, int b) { static const int first[21] = { 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15, 16, 17, 18, 20, 22 }; real_palette_set (first[n], r, g, b); if (first[n] >= 18) real_palette_set (first[n]+1, r, g, b); if (pal) { HDC hdc = get_ctx(); UnrealizeObject (pal); RealizePalette (hdc); free_ctx (hdc); } } void palette_reset (void) { int i; for (i = 0; i < NCOLOURS; i++) { if (pal) { logpal->palPalEntry[i].peRed = defpal[i].rgbtRed; logpal->palPalEntry[i].peGreen = defpal[i].rgbtGreen; logpal->palPalEntry[i].peBlue = defpal[i].rgbtBlue; logpal->palPalEntry[i].peFlags = 0; colours[i] = PALETTERGB(defpal[i].rgbtRed, defpal[i].rgbtGreen, defpal[i].rgbtBlue); } else colours[i] = RGB(defpal[i].rgbtRed, defpal[i].rgbtGreen, defpal[i].rgbtBlue); } if (pal) { HDC hdc; SetPaletteEntries (pal, 0, NCOLOURS, logpal->palPalEntry); hdc = get_ctx(); RealizePalette (hdc); free_ctx (hdc); } } void write_clip (void *data, int len) { HGLOBAL clipdata; void *lock; clipdata = GlobalAlloc (GMEM_DDESHARE | GMEM_MOVEABLE, len + 1); if (!clipdata) return; lock = GlobalLock (clipdata); if (!lock) return; memcpy (lock, data, len); ((unsigned char *) lock) [len] = 0; GlobalUnlock (clipdata); SendMessage (hwnd, WM_IGNORE_CLIP, TRUE, 0); if (OpenClipboard (hwnd)) { EmptyClipboard(); SetClipboardData (CF_TEXT, clipdata); CloseClipboard(); } else GlobalFree (clipdata); SendMessage (hwnd, WM_IGNORE_CLIP, FALSE, 0); } void get_clip (void **p, int *len) { static HGLOBAL clipdata = NULL; if (!p) { if (clipdata) GlobalUnlock (clipdata); clipdata = NULL; return; } else { if (OpenClipboard (NULL)) { clipdata = GetClipboardData (CF_TEXT); CloseClipboard(); if (clipdata) { *p = GlobalLock (clipdata); if (*p) { *len = strlen(*p); return; } } } } *p = NULL; *len = 0; } /* * Move `lines' lines from position `from' to position `to' in the * window. */ void optimised_move (int to, int from, int lines) { RECT r; int min, max, d; min = (to < from ? to : from); max = to + from - min; d = max - min; r.left = 0; r.right = cols * font_width; r.top = min * font_height; r.bottom = (max+lines) * font_height; ScrollWindow (hwnd, 0, (to - from) * font_height, &r, &r); } /* * Print a message box and perform a fatal exit. */ void fatalbox(char *fmt, ...) { va_list ap; char stuff[200]; va_start(ap, fmt); vsprintf(stuff, fmt, ap); va_end(ap); MessageBox(hwnd, stuff, "PuTTY Fatal Error", MB_ICONERROR | MB_OK); exit(1); } /* * Beep. */ void beep(void) { MessageBeep(MB_OK); } Revision-number: 12 Prop-content-length: 449 Content-length: 449 K 8 svn:date V 27 1999-01-08T13:10:19.000000Z K 7 svn:log V 348 John Sullivan's patches plus more fixes: - Stop using the identifier `environ' as some platforms make it a macro - Fix silly error box at end of connection in FWHACK mode - Fix GPF on maximise-then-restore - Use SetCapture to allow drag-selecting outside the window - Correctly update window title when iconic and in win_name_always mode K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 84a0ed0d9293f22ecab1afc2f3304c42 Text-delta-base-sha1: 4127504baec765ebf924a43e303279ae201cb45b Text-content-length: 43 Text-content-md5: 0014803eca76e14dd0f47f9961d4a7d1 Text-content-sha1: 740da7d3ee30f573445c610d91589c40fabe50e8 Content-length: 82 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNer cylmt[1024]; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8287ad7cfcbef0e760042d87fdd7c094 Text-delta-base-sha1: b2171dffeaf34d492fb64d875c1192c9afb1a0ab Text-content-length: 204 Text-content-md5: fd473bbe14e683774861c59aa52fe14e Text-content-sha1: b2d6351a9089389002e17b8ad10d21dfd0741249 Content-length: 243 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN;o 2d2Yb#ifdef FWHACK if (len == 0x52656d6f) { /* "Remo"te server has closed ... */ len = 0x300; /* big enough to carry to end */ } #endif Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a509ea6e47d5e26a94b4c51f7de62ed5 Text-delta-base-sha1: 956b14ba4724b7726d7419c32e1b08f503cf909d Text-content-length: 37 Text-content-md5: 29f9caec1f83f2fff361477b3290ad39 Text-content-sha1: db4df35fc88476634dd59e7a6b59e19a11722f11 Content-length: 76 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN/#include Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1b3e5883a3b497a867d763f3e0e76c5d Text-delta-base-sha1: b9174adc4fb82a577eabc731b506dae832b368ac Text-content-length: 969 Text-content-md5: 531d4ee38915c9ed70d8fb73d3d8ebbc Text-content-sha1: e708ebf6a1a9ac6a75cc9ac391260b0d43c92ec3 Content-length: 1008 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN0"'Q-(Qq(IG2 1999/01/08 13:10:15 simon Exp $ * $Log: sshdes.c,v $ * Revision 1.2 1999/01/08 13:10:15 simon * John Sullivan's patches plus more fixes: * - Stop using the identifier `environ' as some platforms make it a macro * - Fix silly error box at end of connection in FWHACK mode * - Fix GPF on maximise-then-restore * - Use SetCapture to allow drag-selecting outside the window * - Correctly update window title when iconic and in win_name_always mode2 1999/01/08 13:10:15 simon Exp $ * $Log: sshdes.c,v $ * Revision 1.2 1999/01/08 13:10:15 simon * John Sullivan's patches plus more fixes: * - Stop using the identifier `environ' as some platforms make it a macro * - Fix silly error box at end of connection in FWHACK mode * - Fix GPF on maximise-then-restore * - Use SetCapture to allow drag-selecting outside the window * - Correctly update window title when iconic and in win_name_always mode Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e3f5ef0291e770c1325d4abe3c4fc74d Text-delta-base-sha1: c11980b920156e4b8a1b57bd110cb9c407f533e3 Text-content-length: 50 Text-content-md5: b621bce4cc8aea4a0ff6457f7fae93e3 Text-content-sha1: b1032617e0afb19e7baf6407d860d97ac5714fb5 Content-length: 89 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNmt 6#J e = cfg.environmt Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7371101239d4a3ea5a06506354c6daeb Text-delta-base-sha1: 67f37ad1ebc6727c81ed22464b2440e6988722a2 Text-content-length: 204 Text-content-md5: 8aa67ffcceb11235783dabfeb7dd0333 Text-content-sha1: 76cd76786bc7cfc9cfc0e92b19a885237e6da761 Content-length: 243 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN*n,nO3 && j=rows) y = rows-1; if (x<0) x = 0; if (x>=cols) x = cols-1; Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 22b95992a611e83c1d707b9eebfa863e Text-delta-base-sha1: aa581ca35a071834ae8f2cd3747d6c541d3412dc Text-content-length: 549 Text-content-md5: f0eb7d8fd45b024e387be59f14305890 Text-content-sha1: a7381a33a5c70298a8407998231ef7bb4e7c179d Content-length: 588 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNmJ1fXRY+oE4!76o~ char buf[2*sizeof(cfg.environmt)], *p, *q; p = buf; q = cfg.environmt char buf[2*sizeof(cfg.environmt)], *p, *q; gpps (sesskey, "Environment", "", buf, sizeof(buf)); p = buf; q = cfg.environmt char *p = cfg.environmt char str[sizeof(cfg.environmt p = cfg.environmt; while (*p) { while (*p) p++; p++; } if ((p-cfg.environmt) + strlen(str) + 2 < sizeof(cfg.environmt p = cfg.environmt Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3ee3a0ac68c7c117fc3ed79bd9da1cf3 Text-delta-base-sha1: 008654b50d60aa50689198fd7ae999e6b7f27401 Text-content-length: 950 Text-content-md5: b6a57dd47f8ccde21c27e9545a38fa08 Text-content-sha1: 55aae6452259b21d82b5abc940241e0d4fed06bb Content-length: 989 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN5F=k^Ea7~f~;Ww[8y1 #define X_POS(l) ((int)(short)LOWORD(l)) #define Y_POS(l) ((int)(short)HIWORD(l)) case WM_LBUTTONDOWN: SetCapture(hwnd); click (MB_SELECT, X_POS(lParam) / font_width, Y_POSX_POS(lParam) / font_width, Y_POS(lParam) / font_height); ReleaseCapture(); return 0; case WM_MBUTTONDOWN: SetCapture(hwnd); click (cfg.mouse_is_xterm ? MB_PASTE : MB_EXTEND, X_POS(lParam) / font_width, Y_POSX_POS(lParam) / font_width, Y_POS(lParam) / font_height); return 0; ReleaseCapture(); case WM_RBUTTONDOWN: SetCapture(hwnd); click (cfg.mouse_is_xterm ? MB_EXTEND : MB_PASTE, X_POS(lParam) / font_width, Y_POSX_POS(lParam) / font_width, Y_POS(lParam) / font_height); ReleaseCapture(X_POS(lParam) / font_width, Y_POScfg.win_name_always || !cfg.win_name_always && Revision-number: 13 Prop-content-length: 136 Content-length: 136 K 7 svn:log V 36 Remove buffering on malloc log file K 10 svn:author V 5 simon K 8 svn:date V 27 1999-01-15T11:27:36.000000Z PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a84182fac8e9428fb65d495f26ede8b7 Text-delta-base-sha1: 5a42a4468f97159587f8791e8fd4d7dd6bdf1a8f Text-content-length: 101 Text-content-md5: ab578a31f34832dd9c50050f61d90546 Text-content-sha1: 4ac02d988b448735267b084b9e51060fe9e1d6bb Content-length: 140 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN^ OxOC { fp = fopen("putty_mem.log", "w"); setvbuf(fp, NULL, _IONBF, BUFSIZ); } Revision-number: 14 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 Fix breakage in window redraw K 10 svn:author V 5 simon K 8 svn:date V 27 1999-01-15T11:28:11.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8aa67ffcceb11235783dabfeb7dd0333 Text-delta-base-sha1: 76cd76786bc7cfc9cfc0e92b19a885237e6da761 Text-content-length: 80 Text-content-md5: cf2e61ceda90b5e1af8313160e6b3853 Text-content-sha1: fd48236d181e351af1b29c60b18b3f3b9878ae5a Content-length: 119 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN 7rn%i < rows ; i++) for (j = left; j <= right && j < Revision-number: 15 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 1999-01-15T11:29:55.000000Z K 7 svn:log V 16 Remove CVS logs K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 531d4ee38915c9ed70d8fb73d3d8ebbc Text-delta-base-sha1: e708ebf6a1a9ac6a75cc9ac391260b0d43c92ec3 Text-content-length: 28 Text-content-md5: 5da3d9e974848bfd8043919fda2fef11 Text-content-sha1: 639635feb1dca2994fceec034b310e75a1137acb Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN0w Revision-number: 16 Prop-content-length: 184 Content-length: 184 K 10 svn:author V 5 simon K 8 svn:date V 27 1999-01-15T11:30:40.000000Z K 7 svn:log V 84 Add SSH don't-allocate-pty option, and corresponding LF-implies-CR terminal setting PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0014803eca76e14dd0f47f9961d4a7d1 Text-delta-base-sha1: 740da7d3ee30f573445c610d91589c40fabe50e8 Text-content-length: 62 Text-content-md5: 4d31084c751cd393d5377f5b9946a782 Text-content-sha1: e6590eb04a8081ff561d05b525ff86191ebab19e Content-length: 101 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNr(#% N$SSH options */ int noptylfhascr Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fd473bbe14e683774861c59aa52fe14e Text-delta-base-sha1: b2d6351a9089389002e17b8ad10d21dfd0741249 Text-content-length: 1644 Text-content-md5: a6c1d45dc37f602f183b1518b8446600 Text-content-sha1: a8f1e9327c3daed65cce5fddfd99bcea4af2f8fb Content-length: 1683 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNo(Cekc3;sZ return 1f (!cfg.nopty) { i = strlen(cfg.termtype); s_wrpkt_start(10, i+5*4+1); pktout.body[0] = (i >> 24) & 0xFF; pktout.body[1] = (i >> 16) & 0xFF; pktout.body[2] = (i >> 8) & 0xFF; pktout.body[3] = i & 0xFF; memcpy(pktout.body+4, cfg.termtype, i); i += 4; pktout.body[i++] = (rows >> 24) & 0xFF; pktout.body[i++] = (rows >> 16) & 0xFF; pktout.body[i++] = (rows >> 8) & 0xFF; pktout.body[i++] = rows & 0xFF; pktout.body[i++] = (cols >> 24) & 0xFF; pktout.body[i++] = (cols >> 16) & 0xFF; pktout.body[i++] = (cols >> 8) & 0xFF; pktout.body[i++] = cols & 0xFF; memset(pktout.body+i, 0, 9); /* 0 pixwidth, 0 pixheight, 0.b endofopt */ s_wrpkt(); ssh_state = SSH_STATE_INTERMED; do { crReturnV; } while (!ispkt); if (pktin.type != 14 && pktin.type != 15) { fatalbox("Protocol confusion"); } else if (pktin.type == 15) { c_write("Server refused to allocate pty\r\n", 32); } if (!cfg.nopty) { s_wrpkt_start(11, 16); pktout.body[0] = (rows >> 24) & 0xFF; pktout.body[1] = (rows >> 16) & 0xFF; pktout.body[2] = (rows >> 8) & 0xFF; pktout.body[3] = rows & 0xFF; pktout.body[4] = (cols >> 24) & 0xFF; pktout.body[5] = (cols >> 16) & 0xFF; pktout.body[6] = (cols >> 8) & 0xFF; pktout.body[7] = cols & 0xFF; memset(pktout.body+8, 0, 8); s_wrpkt(); } Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cf2e61ceda90b5e1af8313160e6b3853 Text-delta-base-sha1: fd48236d181e351af1b29c60b18b3f3b9878ae5a Text-content-length: 92 Text-content-md5: be414c08459648fd1aa07c78c59d9c37 Text-content-sha1: c1896587101b6f7e8f83d8e951a817b881a9aa5d Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNX?ZZqe2 if (cfg.lfhascr) curs_x = 0 Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2b9d580516f74aba08c19ee4ab7c0051 Text-delta-base-sha1: f3083beb37caf69cd89b89e17b23d4346bce4ce5 Text-content-length: 72 Text-content-md5: d3bfa36b5c6188604b5e23102c1c9d59 Text-content-sha1: 8976bb81cc4e736288eae1a8ff3da6683366d09c Content-length: 111 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN4o-{2#define IDC2_LFHASCR 10183_NOPTY 1018 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2bea44bb3f01ece9b7b9fd40b478a6cd Text-delta-base-sha1: 1dbf680fb07c301fa6815e51eab27d87a2c2a243 Text-content-length: 544 Text-content-md5: 2e983ffe0a1a509a02a4476791828be5 Text-content-sha1: 1ed1fb41773dca3131b6e4b26c692e6b3ac78a5b Content-length: 583 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN/I{;$<.9EL6y4AUTOCHECKBOX "Implicit CR in every LF", IDC2_LFHASCR, 3, 33, 162, 10 LTEXT "Terminal screen dimensions:", IDC2_DIMSTATIC, 3, 48, 162, 8 RTEXT "Rows", IDC2_ROWSSTATIC, 10, 59, 32, 8 EDITTEXT IDC2_ROWSEDIT, 50, 57, 30, 12 RTEXT "Columns", IDC2_COLSSTATIC, 95, 59, 32, 8 EDITTEXT IDC2_COLSEDIT, 135, 57, 30, 12 RTEXT "Saved lines of scrollback", IDC2_SAVESTATIC, 20, 74, 107, 8 EDITTEXT IDC2_SAVEEDIT, 135AUTOCHECKBOX "Don't allocate a pseudo-terminal", IDC3_NOPTY, 3, 19, 162, 10 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f0eb7d8fd45b024e387be59f14305890 Text-delta-base-sha1: a7381a33a5c70298a8407998231ef7bb4e7c179d Text-content-length: 395 Text-content-md5: 48d39bacb6c8014730fce9491414bc34 Text-content-sha1: 7aee28ddafa76d3e4d7bdf41565d0cff0e169130 Content-length: 434 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNJ2T)bK~<.#:-=Q@dNg88W3n|BNoPTY", cfg.noptyLFImpliesCR", cfg.lfhascrNoPTY", 0, &cfg.noptyLFImpliesCR", 0, &cfg.lfhascrCheckDlgButton (hwnd, IDC2_LFHASCR, cfg.lfhascrLFHASC cfg.lfhascr = IsDlgButtonChecked (hwnd, IDC2_LFHASCRCheckDlgButton (hwnd, IDC3_NOPTY, cfg.noptyNOPTYnopty = IsDlgButtonChecked (hwnd, IDC3_NOPTY);Sel Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b6a57dd47f8ccde21c27e9545a38fa08 Text-delta-base-sha1: 55aae6452259b21d82b5abc940241e0d4fed06bb Text-content-length: 135 Text-content-md5: dd156cc03dc8aca47cbae23fd111b265 Text-content-sha1: 2c6a53b51e84f455db63d85b4152e8b108ac6eb5 Content-length: 174 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNFFlMl 9 click (MB_SELECT, X_POS(lParam) / font_width, Y_POS(lParam) / font_height); SetCapture(hwnd Revision-number: 17 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 1999-01-19T16:09:04.000000Z K 7 svn:log V 65 Remove /D_X86_ in Makefile to allow Alpha builds equally happily K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 355167c207fb2ce1a2bb90eeadb7b798 Text-delta-base-sha1: f8eb9ec9e985dc1845abe3056484873ab11f72a3 Text-content-length: 20 Text-content-md5: db2cf122b21c96f133a9f11b6db1c79d Text-content-sha1: 45cfd223a223a3fa9954e20937abb1998d1f0a3a Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNWO !.) Revision-number: 18 Prop-content-length: 139 Content-length: 139 K 10 svn:author V 5 simon K 8 svn:date V 27 1999-01-22T09:34:42.000000Z K 7 svn:log V 39 Update version number for 0.45 release PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2e983ffe0a1a509a02a4476791828be5 Text-delta-base-sha1: 1ed1fb41773dca3131b6e4b26c692e6b3ac78a5b Text-content-length: 22 Text-content-md5: e504f65c657f0e370bb15379195a2d51 Text-content-sha1: d30354830aeee41a603ff5bb8dad85506006b9c3 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNII ; <5 Revision-number: 19 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 1999-01-22T09:35:08.000000Z K 7 svn:log V 49 Fix double/triple click, and improve drag select K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dd156cc03dc8aca47cbae23fd111b265 Text-delta-base-sha1: 2c6a53b51e84f455db63d85b4152e8b108ac6eb5 Text-content-length: 806 Text-content-md5: 93258cf73e6385b0d3f3017fd9218e07 Text-content-sha1: 57a64221477c5d59c8f9cc0f0029245bef751925 Content-length: 845 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNFiCU A.U]pemF}SqFqK_gnt thistime = GetMessageTime(); if (lastbtn == b && thistimethistime#define TO_CHR_X(x) (((x)<0 ? (x)-font_width+1 : (x)) / font_width) #define TO_CHR_Y(y) (((y)<0 ? (y)-font_height+1: (y)) / font_height) case WM_LBUTTONDOWN: click (MB_SELECT, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))); ReleaseCapture(); return 0; case WM_MPASTE : MB_EXTEND, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam))); } Revision-number: 20 Prop-content-length: 177 Content-length: 177 K 7 svn:log V 77 Improve drag select (dragging outside LHS doesn't now select first char too) K 10 svn:author V 5 simon K 8 svn:date V 27 1999-01-22T09:36:21.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: be414c08459648fd1aa07c78c59d9c37 Text-delta-base-sha1: c1896587101b6f7e8f83d8e951a817b881a9aa5d Text-content-length: 129 Text-content-md5: 1fe77645c195b4368c61789055e369a6 Text-content-sha1: 57085a33a1a93483d277bc7b84d830e822f73d91 Content-length: 168 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNX9 g`grf{ if (y > 0) { x = cols-1; y--; } else x = 0; } Revision-number: 21 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 1999-01-22T09:36:21.000000Z K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-45'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-0.45 Node-kind: dir Node-action: add Node-copyfrom-rev: 20 Node-copyfrom-path: putty Revision-number: 22 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:46.497569Z PROPS-END Revision-number: 23 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:46.504803Z PROPS-END Revision-number: 24 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:46.512676Z PROPS-END Revision-number: 25 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:46.520960Z PROPS-END Revision-number: 26 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:46.529186Z PROPS-END Revision-number: 27 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:46.537270Z PROPS-END Revision-number: 28 Prop-content-length: 223 Content-length: 223 K 7 svn:log V 122 Added automatic version distinguishing code, to differentiate releases from nightly builds from random development builds K 10 svn:author V 5 simon K 8 svn:date V 27 1999-02-09T15:18:34.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: db2cf122b21c96f133a9f11b6db1c79d Text-delta-base-sha1: 45cfd223a223a3fa9954e20937abb1998d1f0a3a Text-content-length: 767 Text-content-md5: aadae578a14ba9ddf8a6ba4f623b4ed3 Text-content-sha1: 2e1f6aaec5e6ce6a2b465814853c7d33687c6d20 Content-length: 806 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNOe*I}h{Anc~E~d;hrf`# Can also build with `VER=/DSNAPSHOT=1999-01-25' or # `VER=/DRELEASE=0.43' to get version numbering; otherwise you'll # get `Unidentified build'.PUTTYOBJS = window.obj windlg.obj terminal.obj telnet.obj OBJS1 = version.obj RESRC = win_res.res LIBS1 = advapi32.lib user32.lib gdi32.lib LIBS2 = ws2_32.lib comctl32.lib comdlg32.lib putty.exe: $(PUTTYOBJS)PUTTYOBJS)d.exe @link.rsp link.rsp: makefile echo /nologo /subsystem:windows > link.rsp echo $(PUTTYOBJS) >version.obj: versionpseudotarget # Hack to force version.obj to be rebuilt always versionpseudotarget: cl $(FWHACK) $(VER) $(CFLAGS) /c version.c win_res.res: win_res.rc win_res.h putty.ico rc $(FWHACK) -r -DWIN32 -D_WIN32 -DWINVER=0x0400*.rsp Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4d31084c751cd393d5377f5b9946a782 Text-delta-base-sha1: e6590eb04a8081ff561d05b525ff86191ebab19e Text-content-length: 66 Text-content-md5: df2fce26410fbdb5c70d45ba7e69121b Text-content-sha1: 6408014a4811c59883fca3cf645f166ccc9971c1 Content-length: 105 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN(^ -eL\Exports from version.c. */ extern char ver[] Node-path: putty/version.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 303 Text-content-md5: eeaaf3b0bbb907c5b622209d68cf35a0 Text-content-sha1: 5e49bcc18716d508b3fe4e3226c6ed75fd471d8e Content-length: 419 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN!!!/* * PuTTY version numbering */ #define STR1(x) #x #define STR(x) STR1(x) #if defined SNAPSHOT char ver[] = "Development snapshot " STR(SNAPSHOT); #elif defined RELEASE char ver[] = "Release " STR(RELEASE); #else char ver[] = "Unidentified build, " __DATE__ " " __TIME__; #endif Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d3bfa36b5c6188604b5e23102c1c9d59 Text-delta-base-sha1: 8976bb81cc4e736288eae1a8ff3da6683366d09c Text-content-length: 121 Text-content-md5: 00adaac14319a2620997e10d1514b4fb Text-content-sha1: 401808ce967ce45fa78e1610afd3d4a985748d0d Content-length: 160 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNo) cwcO 1 1002 #define IDA_VERSION 1003 #define IDA_TEXT2 1004 #define IDA_LICENCE 1005 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e504f65c657f0e370bb15379195a2d51 Text-delta-base-sha1: d30354830aeee41a603ff5bb8dad85506006b9c3 Text-content-length: 337 Text-content-md5: b4b0fa83183b065f145df3eda3f21a1e Text-content-sha1: efc19e51831a13f3e1c50f3e3791eb7a780d9501 Content-length: 376 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNIG.M}:~KD_ABOUTBOX DIALOG DISCARDABLE 140, 40, 136, 7052, 48, 14 PUSHBUTTON "View &Licence", IDA_LICENCE, 6, 52, 70, 14 CTEXT "PuTTY", IDA_TEXT1, 10, 6, 120, 8 CTEXT "", IDA_VERSION, 10, 16, 120, 16 CTEXT "\251 1997-9 Simon Tatham. All rights reserved.", IDA_TEXT2, 10, 34, 120, 167-9 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 48d39bacb6c8014730fce9491414bc34 Text-delta-base-sha1: 7aee28ddafa76d3e4d7bdf41565d0cff0e169130 Text-content-length: 87 Text-content-md5: 8d5793700614063c314293cea1c4d496 Text-content-sha1: e2dd693312c7877158016528d475b05f2702b3cd Content-length: 126 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN2c:To:x SetDlgItemText (hwnd, IDA_VERSION, ver); return 1 Revision-number: 29 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 1999-02-09T15:39:08.000000Z K 7 svn:log V 64 Fix various segfaults and heap trashes. Thanks to Andrew Mobbs. K 10 svn:author V 5 simon PROPS-END Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3f9938a682917c7055bd6b1359652144 Text-delta-base-sha1: 26c601fc7b2a98159321569489f17f5050ee77e4 Text-content-length: 75 Text-content-md5: 6c25c435d1caaef69c55d3fec5c1fdb6 Text-content-sha1: 4b0b13f8bc9c246ae50995a60a5002526f00f346 Content-length: 114 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN3c0QQPc != INVALID_HANDLE_VALUE != INVALID_HANDLE_VALUE Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a6c1d45dc37f602f183b1518b8446600 Text-delta-base-sha1: a8f1e9327c3daed65cce5fddfd99bcea4af2f8fb Text-content-length: 67 Text-content-md5: bc60054c910b5809b643a6dc237eea1a Text-content-sha1: bc7864e87f1ce9d0e75d47b19edee8ee644cfeb6 Content-length: 106 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN(, ,%[M+4) : realloc(pktout.data, biglen+4 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8d5793700614063c314293cea1c4d496 Text-delta-base-sha1: e2dd693312c7877158016528d475b05f2702b3cd Text-content-length: 28 Text-content-md5: 83aba6272bfd47c44522e3707e7a0e67 Text-content-sha1: 51c556f408593d8cffc9d007353db1214cbb3729 Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNcO3 V Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 93258cf73e6385b0d3f3017fd9218e07 Text-delta-base-sha1: 57a64221477c5d59c8f9cc0f0029245bef751925 Text-content-length: 39 Text-content-md5: faa2c0d8294319c3b728ff203f97359b Text-content-sha1: 868799b002fba3293335ceb7c83aa8af3f5aca35 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNi{ Zif (hwnd) Revision-number: 30 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 1999-02-09T15:39:08.000000Z K 7 svn:log V 78 This commit was manufactured by cvs2svn to create branch 'ben-early-mac-port'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-ben-early-mac-port Node-kind: dir Node-action: add Node-copyfrom-rev: 29 Node-copyfrom-path: putty Node-path: putty-ben-early-mac-port/putty.ico Node-action: delete Node-path: putty-ben-early-mac-port/noise.c Node-action: delete Node-path: putty-ben-early-mac-port/windlg.c Node-action: delete Node-path: putty-ben-early-mac-port/version.c Node-action: delete Node-path: putty-ben-early-mac-port/sshcrc.c Node-action: delete Node-path: putty-ben-early-mac-port/win_res.rc Node-action: delete Node-path: putty-ben-early-mac-port/sshsha.c Node-action: delete Node-path: putty-ben-early-mac-port/sshdes.c Node-action: delete Node-path: putty-ben-early-mac-port/putty.h Node-action: delete Node-path: putty-ben-early-mac-port/telnet.c Node-action: delete Node-path: putty-ben-early-mac-port/misc.c Node-action: delete Node-path: putty-ben-early-mac-port/resource.h Node-action: delete Node-path: putty-ben-early-mac-port/Makefile Node-action: delete Node-path: putty-ben-early-mac-port/sshrand.c Node-action: delete Node-path: putty-ben-early-mac-port/ssh.h Node-action: delete Node-path: putty-ben-early-mac-port/sshrsa.c Node-action: delete Node-path: putty-ben-early-mac-port/sshmd5.c Node-action: delete Node-path: putty-ben-early-mac-port/window.c Node-action: delete Node-path: putty-ben-early-mac-port/win_res.h Node-action: delete Revision-number: 31 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 1999-02-10T09:48:15.000000Z K 7 svn:log V 58 Replaced ICON line which was accidentally removed *blush* K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b4b0fa83183b065f145df3eda3f21a1e Text-delta-base-sha1: efc19e51831a13f3e1c50f3e3791eb7a780d9501 Text-content-length: 102 Text-content-md5: a93e75f686d02bd4162941233131171b Text-content-sha1: ebadb90966ee34c3c0d208582aea981f9885abd9 Content-length: 141 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNGfMMMC? >I_MAINICON ICON "putty.ico" IDD_ABOUTBOX DIALOG DISCARDABLE 140, 40, 136, 70 Revision-number: 32 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 56 Attempt to fix problems with version.obj in some nmakes K 10 svn:author V 5 simon K 8 svn:date V 27 1999-02-10T09:48:29.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aadae578a14ba9ddf8a6ba4f623b4ed3 Text-delta-base-sha1: 2e1f6aaec5e6ce6a2b465814853c7d33687c6d20 Text-content-length: 64 Text-content-md5: 62cd2e9ebecd611a77539893cc809532 Text-content-sha1: 04c0c8444700ed617e5b1625599a1f35db94d428 Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNe +(>' cl $(FWHACK) $(VER) $(CFLAGS) /c version.c Revision-number: 33 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 1999-02-10T10:30:17.000000Z K 7 svn:log V 70 Improve nasty version.obj hack so it doesn't actually do two compiles K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 62cd2e9ebecd611a77539893cc809532 Text-delta-base-sha1: 04c0c8444700ed617e5b1625599a1f35db94d428 Text-content-length: 46 Text-content-md5: 6f1b43fd8b4cd184fc3da87a31aa02a8 Text-content-sha1: c2e02dc83d067708d3e9a7115b83983b40f7c9d1 Content-length: 85 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN )>S@echo (built version.obj) Revision-number: 34 Prop-content-length: 240 Content-length: 240 K 7 svn:log V 139 Add DeleteObject calls to go with the CreatePen calls in do_text. Should fix a fairly nasty-looking resource leak. Thanks to Andrew Mobbs. K 10 svn:author V 5 simon K 8 svn:date V 27 1999-02-10T11:11:11.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: faa2c0d8294319c3b728ff203f97359b Text-delta-base-sha1: 868799b002fba3293335ceb7c83aa8af3f5aca35 Text-content-length: 473 Text-content-md5: bc5797a09917f80e479590f02c61d3ba Text-content-sha1: 219f29771025fd7f40db02bc69df076bf51142ef Content-length: 512 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN{&%aSjr%$k; #if 0 /* we have fixed this using WM_SIZING now */ int ew, eh; #endif HPEN oldpen; oldpen = oldpen = SelectObject (hdc, oldpen); DeleteObject (oldpen); } if (attr & ATTR_PASCURS) { POINT pts[5]; HPEN oldpenoldpen = SelectObject (hdc, CreatePen(PS_SOLID, 0, colours[23])); Polyline (hdc, pts, 5); oldpen = SelectObject (hdc, oldpen); DeleteObject (oldpen Revision-number: 35 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 1999-02-10T11:13:28.000000Z K 7 svn:log V 61 Cause irritating ? markers in cvs update/commit to disappear K 10 svn:author V 5 simon PROPS-END Node-path: putty Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 67 Content-length: 67 K 10 svn:ignore V 35 *.pdb *.ilk *.res *.RES *.pch *.rsp PROPS-END Node-path: putty/.cvsignore Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 46 Text-content-md5: 91d2c7f274245107dac3e76f09767869 Text-content-sha1: 5f97366a6eab5231659b170d1e6b6a8fef78d75a Content-length: 162 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN$$*.pdb *.ilk *.res *.RES *.pch *.rsp Revision-number: 36 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 1999-02-11T09:07:20.000000Z K 7 svn:log V 65 Revert to using WinSock 1 - the upgrade to 2 was a checkin error K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6f1b43fd8b4cd184fc3da87a31aa02a8 Text-delta-base-sha1: c2e02dc83d067708d3e9a7115b83983b40f7c9d1 Text-content-length: 24 Text-content-md5: 635a7f1567c7b32b87db19c2297fff41 Text-content-sha1: 3ba372d25bfa8d92aecb3f9f6ab22d4af03b3e60 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN {}ock Revision-number: 37 Prop-content-length: 225 Content-length: 225 K 7 svn:log V 124 Use SetCapture() to fix the problem with double-clicks on saved sessions carrying throuh to the window below the config box K 10 svn:author V 5 simon K 8 svn:date V 27 1999-02-18T10:39:23.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 83aba6272bfd47c44522e3707e7a0e67 Text-delta-base-sha1: 51c556f408593d8cffc9d007353db1214cbb3729 Text-content-length: 555 Text-content-md5: 68b03e759a938bcf531b0db262fd1eae Text-content-sha1: 75f572db3ed6198e55314cae7415edf4feb35ef4 Content-length: 594 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNO *s6\>TU}S{bz i#,static HINSTANCE hinst; static char **sessions; static int nsessions; static int readytogoLBUTTONUP: /* * Button release should trigger WM_OK if there was a * previous double click on the session list. */ ReleaseCapture(); if (readytogo) SendMessage (GetParent(hwnd), WM_COMMAND, IDOK, 0); { readytogo = TRUE; SetCapture(hwnd); } } break; case IDC0_SESSDEL Revision-number: 38 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 1999-02-19T15:05:41.000000Z K 7 svn:log V 72 This commit was manufactured by cvs2svn to create branch 'ben-mac-port'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-ben-mac-port Node-kind: dir Node-action: add Node-copyfrom-rev: 35 Node-copyfrom-path: putty Node-path: putty-ben-mac-port/windlg.c Node-action: delete Node-path: putty-ben-mac-port/window.c Node-action: delete Node-path: putty-ben-mac-port/win_res.rc Node-action: delete Node-path: putty-ben-mac-port/terminal.c Node-action: delete Node-path: putty-ben-mac-port/win_res.h Node-action: delete Node-path: putty-ben-mac-port/Makefile Node-action: delete Node-path: putty-ben-mac-port/ssh.c Node-action: delete Node-path: putty-ben-mac-port/ssh.h Node-action: delete Node-path: putty-ben-mac-port/sshrand.c Node-action: delete Node-path: putty-ben-mac-port/sshrsa.c Node-action: delete Revision-number: 39 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 1999-02-19T15:05:41.000000Z K 7 svn:log V 48 initial, pretty much as generated by CreateMake K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/PuTTY.make Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 2536 Text-content-md5: e7832d3559dc44a67ac9550a5d120b5f Text-content-sha1: 1228fdded5423196934dd3a4544729731f33283f Content-length: 2656 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 PROPS-END SVNZZZ# This is the Makefile for building PuTTY for the Mac OS. # File: PuTTY.make # Target: PuTTY # Sources: bjh21:putty:foo.c # bjh21:putty:mac.c # bjh21:putty:misc.c # bjh21:putty:putty.r # bjh21:putty:ssh.c # bjh21:putty:sshcrc.c # bjh21:putty:sshdes.c # bjh21:putty:sshmd5.c # bjh21:putty:sshrand.c # bjh21:putty:sshrsa.c # bjh21:putty:sshsha.c # bjh21:putty:telnet.c # bjh21:putty:terminal.c # Created: Thursday, February 18, 1999 06:11:49 PM MAKEFILE = PuTTY.make MondoBuild = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified Includes = Sym68K = ObjDir68K = COptions = {Includes} {Sym68K} Objects68K = "{ObjDir68K}mac.c.o" "{ObjDir68K}misc.c.o" "{ObjDir68K}ssh.c.o" "{ObjDir68K}sshcrc.c.o" "{ObjDir68K}sshdes.c.o" "{ObjDir68K}sshmd5.c.o" "{ObjDir68K}sshrand.c.o" "{ObjDir68K}sshrsa.c.o" "{ObjDir68K}sshsha.c.o" "{ObjDir68K}telnet.c.o" "{ObjDir68K}terminal.c.o" PuTTY {MondoBuild} {Objects68K} Link -o {Targ} -d {Sym68K} {Objects68K} -t 'APPL' -c '????' "{Libraries}MathLib.o" #"{CLibraries}Complex.o" "{CLibraries}StdCLib.o" "{Libraries}MacRuntime.o" "{Libraries}IntEnv.o" "{Libraries}ToolLibs.o" "{Libraries}Interface.o" PuTTY {MondoBuild} bjh21:putty:putty.r Rez bjh21:putty:putty.r -o {Targ} {Includes} -append "{ObjDir68K}mac.c.o" {MondoBuild} mac.c {C} mac.c -o {Targ} {COptions} "{ObjDir68K}misc.c.o" {MondoBuild} misc.c {C} misc.c -o {Targ} {COptions} "{ObjDir68K}ssh.c.o" {MondoBuild} ssh.c {C} ssh.c -o {Targ} {COptions} "{ObjDir68K}sshcrc.c.o" {MondoBuild} sshcrc.c {C} sshcrc.c -o {Targ} {COptions} "{ObjDir68K}sshdes.c.o" {MondoBuild} sshdes.c {C} sshdes.c -o {Targ} {COptions} "{ObjDir68K}sshmd5.c.o" {MondoBuild} sshmd5.c {C} sshmd5.c -o {Targ} {COptions} "{ObjDir68K}sshrand.c.o" {MondoBuild} sshrand.c {C} sshrand.c -o {Targ} {COptions} "{ObjDir68K}sshrsa.c.o" {MondoBuild} sshrsa.c {C} sshrsa.c -o {Targ} {COptions} "{ObjDir68K}sshsha.c.o" {MondoBuild} sshsha.c {C} sshsha.c -o {Targ} {COptions} "{ObjDir68K}telnet.c.o" {MondoBuild} telnet.c {C} telnet.c -o {Targ} {COptions} "{ObjDir68K}terminal.c.o" {MondoBuild} terminal.c {C} terminal.c -o {Targ} {COptions} Revision-number: 40 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 62 Removed windowsism: now uses fatalbox rather than MessageBox. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-02-19T15:24:15.000000Z PROPS-END Node-path: putty-ben-mac-port/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: ab578a31f34832dd9c50050f61d90546 Text-delta-base-sha1: 4ac02d988b448735267b084b9e51060fe9e1d6bb Text-content-length: 157 Text-content-md5: b120e33b85bcc1221b9f79a3e30c8d60 Text-content-sha1: 66b97eae0566f1774a28f45195b7adb2cbfc930e Content-length: 200 K 15 cvs2svn:cvs-rev V 7 1.2.2.1 PROPS-END SVN 8rD\./* $Id: misc.c,v 1.2.2.1 1999/02/19 15:24:15 ben Exp $ */ fatalbox("%s", "Out of memory!"); fatalbox("%s", "Out of memory!"); Revision-number: 41 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 1999-02-19T15:28:27.000000Z K 7 svn:log V 23 get line-endings right K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/PuTTY.make Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: e7832d3559dc44a67ac9550a5d120b5f Text-delta-base-sha1: 1228fdded5423196934dd3a4544729731f33283f Text-content-length: 2670 Text-content-md5: 19d2fa70767243adfd9e290631bcc4fa Text-content-sha1: 002139443c1aefc82a6e259fd65a721a4e32a9ae Content-length: 2713 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVNZ___# $Id: PuTTY.make,v 1.1.2.2 1999/02/19 15:28:27 ben Exp $ # This is the Makefile for building PuTTY for the Mac OS. # Users of non-Mac systems will see some pretty strange characters around. # File: PuTTY.make # Target: PuTTY # Sources: bjh21:putty:foo.c # bjh21:putty:mac.c # bjh21:putty:misc.c # bjh21:putty:putty.r # bjh21:putty:ssh.c # bjh21:putty:sshcrc.c # bjh21:putty:sshdes.c # bjh21:putty:sshmd5.c # bjh21:putty:sshrand.c # bjh21:putty:sshrsa.c # bjh21:putty:sshsha.c # bjh21:putty:telnet.c # bjh21:putty:terminal.c # Created: Thursday, February 18, 1999 06:11:49 PM MAKEFILE = PuTTY.make MondoBuild = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified Includes = Sym68K = ObjDir68K = COptions = {Includes} {Sym68K} Objects68K = "{ObjDir68K}mac.c.o" "{ObjDir68K}misc.c.o" "{ObjDir68K}ssh.c.o" "{ObjDir68K}sshcrc.c.o" "{ObjDir68K}sshdes.c.o" "{ObjDir68K}sshmd5.c.o" "{ObjDir68K}sshrand.c.o" "{ObjDir68K}sshrsa.c.o" "{ObjDir68K}sshsha.c.o" "{ObjDir68K}telnet.c.o" "{ObjDir68K}terminal.c.o" PuTTY {MondoBuild} {Objects68K} Link -o {Targ} -d {Sym68K} {Objects68K} -t 'APPL' -c '????' "{Libraries}MathLib.o" #"{CLibraries}Complex.o" "{CLibraries}StdCLib.o" "{Libraries}MacRuntime.o" "{Libraries}IntEnv.o" "{Libraries}ToolLibs.o" "{Libraries}Interface.o" PuTTY {MondoBuild} bjh21:putty:putty.r Rez bjh21:putty:putty.r -o {Targ} {Includes} -append "{ObjDir68K}mac.c.o" {MondoBuild} mac.c {C} mac.c -o {Targ} {COptions} "{ObjDir68K}misc.c.o" {MondoBuild} misc.c {C} misc.c -o {Targ} {COptions} "{ObjDir68K}ssh.c.o" {MondoBuild} ssh.c {C} ssh.c -o {Targ} {COptions} "{ObjDir68K}sshcrc.c.o" {MondoBuild} sshcrc.c {C} sshcrc.c -o {Targ} {COptions} "{ObjDir68K}sshdes.c.o" {MondoBuild} sshdes.c {C} sshdes.c -o {Targ} {COptions} "{ObjDir68K}sshmd5.c.o" {MondoBuild} sshmd5.c {C} sshmd5.c -o {Targ} {COptions} "{ObjDir68K}sshrand.c.o" {MondoBuild} sshrand.c {C} sshrand.c -o {Targ} {COptions} "{ObjDir68K}sshrsa.c.o" {MondoBuild} sshrsa.c {C} sshrsa.c -o {Targ} {COptions} "{ObjDir68K}sshsha.c.o" {MondoBuild} sshsha.c {C} sshsha.c -o {Targ} {COptions} "{ObjDir68K}telnet.c.o" {MondoBuild} telnet.c {C} telnet.c -o {Targ} {COptions} "{ObjDir68K}terminal.c.o" {MondoBuild} terminal.c {C} terminal.c -o {Targ} {COptions} Revision-number: 42 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 1999-02-19T20:52:58.000000Z K 7 svn:log V 66 Initial version -- most of the Finder resources and the fatalbox. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/putty.r Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 7776 Text-content-md5: bc3d40f14b8975056ff23e8cc7115b0e Text-content-sha1: 883ba60789ee31b56eab72a746b690904c23e2e7 Content-length: 7896 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNRRR/* $Id: putty.r,v 1.1.2.1 1999/02/19 20:52:58 ben Exp $ */ /* PuTTY resources */ #include "Types.r" /* * Finder-related resources */ /* For now, PuTTY uses the signature "pTTY" */ type 'pTTY' as 'STR '; resource 'pTTY' (0, purgeable) { "PuTTY experimental Mac port" }; resource 'vers' (1, purgeable) { 0x00, 0x45, /* Major and minor (BCD) */ development, 0, /* Status and pre-release */ 2, /* Region code (2 = UK) */ "Mac exp", /* Short version (list views) */ "Mac experimental", /* Long version (get info) */ }; resource 'FREF' (128, purgeable) { /* The application itself */ 'APPL', 128, "" }; resource 'FREF' (129, purgeable) { /* Saved session */ 'Sess', 129, "" }; resource 'FREF' (130, purgeable) { /* SSH host keys database */ 'HKey', 130, "" }; resource 'BNDL' (128, purgeable) { 'pTTY', 0, { 'ICN#', { 128, 128, 129, 129, 130, 130 }, 'FREF', { 128, 128, 129, 129, 130, 130 }; }; }; /* Icons, courtesy of DeRez */ /* Application icon */ resource 'ICN#' (128, purgeable) { { /* array: 2 elements */ /* [1] */ $"0000 3FFE 0000 4001 0000 4FF9 0000 5005" $"0000 5545 0000 5005 0000 5405 0000 5005" $"0000 5505 0000 5005 0000 4FF9 0000 4001" $"0000 4001 7FFC 407D 8002 4001 9FF2 4001" $"A00A 3FFE AA8A 2002 A00A 3FFE A80A 0000" $"A00A 0000 AA0A 0000 A00A 0000 9FF2 0000" $"8002 0000 8002 0000 80FA 0000 8002 0000" $"8002 0000 7FFC 0000 4004 0000 7FFC", /* [2] */ $"0000 3FFE 0000 7FFF 0000 7FFF 0000 7FFF" $"0000 7FFF 0000 7FFF 0000 7FFF 0000 7FFF" $"0000 7FFF 0000 7FFF 0000 7FFF 0000 7FFF" $"0000 7FFF 7FFC 7FFF FFFE 7FFF FFFE 7FFF" $"FFFE 3FFE FFFE 3FFE FFFE 3FFE FFFE 0000" $"FFFE 0000 FFFE 0000 FFFE 0000 FFFE 0000" $"FFFE 0000 FFFE 0000 FFFE 0000 FFFE 0000" $"FFFE 0000 7FFC 0000 7FFC 0000 7FFC" } }; resource 'ics#' (128, purgeable) { { /* array: 2 elements */ /* [1] */ $"00FF 0081 00BD 00A5 00A5 00BD FF81 818D" $"BD81 A57E A500 BD00 8100 8D00 8100 7E", /* [2] */ $"00FF 00FF 00FF 00FF 00FF 00FF FFFF FFFF" $"FFFF FF7E FF00 FF00 FF00 FF00 FF00 7E" } }; /* Known hosts icon */ resource 'ICN#' (130, purgeable) { { /* array: 2 elements */ /* [1] */ $"1FFF FC00 1000 0600 1000 0500 1FFF FC80" $"1000 0440 1000 0420 1FFF FFF0 1000 0010" $"13FC 0F90 1C03 F0F0 15FA 8090 150A 8090" $"1D0B 80F0 150A 8050 15FA 8050 1C03 8070" $"143A 8050 1402 8050 1FFF ABF0 1204 8110" $"13FC FF10 1AAA AAB0 1000 0010 17FF FFD0" $"1400 0050 1525 2250 1555 5550 1525 2250" $"1400 0050 17FF FFD0 1000 0010 1FFF FFF0", /* [2] */ $"1FFF FC00 1FFF FE00 1FFF FF00 1FFF FF80" $"1FFF FFC0 1FFF FFE0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" } }; resource 'icl4' (130, purgeable) { $"000F FFFF FFFF FFFF FFFF FF00 0000 0000" $"000F 0000 0000 0000 0000 0FF0 0000 0000" $"000F 0000 0000 0000 0000 0FCF 0000 0000" $"000F FFFF FFFF FFFF FFFF FFCC F000 0000" $"000F 0000 0000 0000 0000 0FCC CF00 0000" $"000F 0000 0000 0000 0000 0FCC CCF0 0000" $"000F FFFF FFFF FFFF FFFF FFFF FFFF 0000" $"000F 0000 0000 0000 0000 0000 000F 0000" $"000F 00FF FFFF FF00 0000 FFFF F00F 0000" $"000F FFCC CCCC CCFF FFFF CCCC FFFF 0000" $"000F 0FCE EEEE CCF0 FCCC CCCC F00F 0000" $"000F 0FCE 0D0D 0CF0 FCCC CCCC F00F 0000" $"000F FFCE D0D0 CCFF FCCC CCCC FFFF 0000" $"000F 0FCE 0D0D 0CF0 FCCC CCCC CF0F 0000" $"000F 0FCC C0C0 CCF0 FCCC CCCC CF0F 0000" $"000F FFCC CCCC CCFF FCCC CCCC CFFF 0000" $"000F 0FCC CCFF FCF0 FCCC CCCC CF0F 0000" $"000F 0FCC CCCC CCF0 FCCC CCCC CF0F 0000" $"000F FFFF FFFF FFFF FDDD DDDF FFFF 0000" $"000F 00FC CDDE EF00 FDDD DDDF 000F 0000" $"000F 00FF FFFF FF00 FFFF FFFF 000F 0000" $"000F 0C0C 0C0C 0C0C 0C0C 0C0C 0C0F 0000" $"000F C0C0 C0C0 C0C0 C0C0 C0C0 C0CF 0000" $"000F 0FFF FFFF FFFF FFFF FFFF FF0F 0000" $"000F CF00 0000 0000 0000 0000 0FCF 0000" $"000F 0F0F 00F0 0F0F 00F0 00F0 0F0F 0000" $"000F CF0F 0F0F 0F0F 0F0F 0F0F 0FCF 0000" $"000F 0F0F 00F0 0F0F 00F0 00F0 0F0F 0000" $"000F CF00 0000 0000 0000 0000 0FCF 0000" $"000F 0FFF FFFF FFFF FFFF FFFF FF0F 0000" $"000F C0C0 C0C0 C0C0 C0C0 C0C0 C0CF 0000" $"000F FFFF FFFF FFFF FFFF FFFF FFFF" }; resource 'icl8' (130, purgeable) { $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF 0000 0000 0000 0000 0000" $"0000 00FF 0000 0000 0000 0000 0000 0000" $"0000 0000 00FF FF00 0000 0000 0000 0000" $"0000 00FF 0000 0000 0000 0000 0000 0000" $"0000 0000 00FF F6FF 0000 0000 0000 0000" $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF F6F6 FF00 0000 0000 0000" $"0000 00FF 0000 0000 0000 0000 0000 0000" $"0000 0000 00FF F6F6 F6FF 0000 0000 0000" $"0000 00FF 0000 0000 0000 0000 0000 0000" $"0000 0000 00FF F6F6 F6F6 FF00 0000 0000" $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF FFFF FFFF FFFF 0000 0000" $"0000 00FF 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 00FF 0000 0000" $"0000 00FF 0000 FFFF FFFF FFFF FFFF 0000" $"0000 0000 FFFF FFFF FF00 00FF 0000 0000" $"0000 00FF FFFF 2B2B 2B2B 2B2B 2B2B FFFF" $"FFFF FFFF 2B2B 2B2B FFFF FFFF 0000 0000" $"0000 00FF 00FF 2BFC FCFC FCFC F82B FF00" $"FF2B 2B2B 2B2B 2B2B FF00 00FF 0000 0000" $"0000 00FF 00FF 2BFC 2A2A 2A2A 002B FF00" $"FF2B 2B2B 2B2B 2B2B FF00 00FF 0000 0000" $"0000 00FF FFFF 2BFC 2A2A 2A2A 002B FFFF" $"FF2B 2B2B 2B2B 2B2B FFFF FFFF 0000 0000" $"0000 00FF 00FF 2BFC 2A2A 2A2A 002B FF00" $"FF2B 2B2B 2B2B 2B2B 2BFF 00FF 0000 0000" $"0000 00FF 00FF 2BF8 0000 0000 002B FF00" $"FF2B 2B2B 2B2B 2B2B 2BFF 00FF 0000 0000" $"0000 00FF FFFF 2B2B 2B2B 2B2B 2B2B FFFF" $"FF2B 2B2B 2B2B 2B2B 2BFF FFFF 0000 0000" $"0000 00FF 00FF 2B2B 2B2B FFFF FF2B FF00" $"FF2B 2B2B 2B2B 2B2B 2BFF 00FF 0000 0000" $"0000 00FF 00FF 2B2B 2B2B 2B2B 2B2B FF00" $"FF2B 2B2B 2B2B 2B2B 2BFF 00FF 0000 0000" $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" $"FFF9 F9F9 F9F9 F9FF FFFF FFFF 0000 0000" $"0000 00FF 0000 FFF7 F8F9 FAFB FCFF 0000" $"FFF9 F9F9 F9F9 F9FF 0000 00FF 0000 0000" $"0000 00FF 0000 FFFF FFFF FFFF FFFF 0000" $"FFFF FFFF FFFF FFFF 0000 00FF 0000 0000" $"0000 00FF F5F5 F5F5 F5F5 F5F5 F5F5 F5F5" $"F5F5 F5F5 F5F5 F5F5 F5F5 F5FF 0000 0000" $"0000 00FF F5F5 F5F5 F5F5 F5F5 F5F5 F5F5" $"F5F5 F5F5 F5F5 F5F5 F5F5 F5FF 0000 0000" $"0000 00FF F5FF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF FFFF FFFF F5FF 0000 0000" $"0000 00FF F5FF 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 00FF F5FF 0000 0000" $"0000 00FF F5FF 00FF 0000 FF00 00FF 00FF" $"0000 FF00 0000 FF00 00FF F5FF 0000 0000" $"0000 00FF F5FF 00FF 00FF 00FF 00FF 00FF" $"00FF 00FF 00FF 00FF 00FF F5FF 0000 0000" $"0000 00FF F5FF 00FF 0000 FF00 00FF 00FF" $"0000 FF00 0000 FF00 00FF F5FF 0000 0000" $"0000 00FF F5FF 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 00FF F5FF 0000 0000" $"0000 00FF F5FF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF FFFF FFFF F5FF 0000 0000" $"0000 00FF F5F5 F5F5 F5F5 F5F5 F5F5 F5F5" $"F5F5 F5F5 F5F5 F5F5 F5F5 F5FF 0000 0000" $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF FFFF FFFF FFFF" }; /* * Internal resources */ /* Fatal error box. Stolen from the Finder. */ resource 'ALRT' (128, "fatalbox", purgeable) { {54, 67, 152, 435}, 128, silentStages, alertPositionMainScreen }; resource 'DITL' (128, "fatalbox", purgeable) { { /* array DITLarray: 3 elements */ /* [1] */ {68, 299, 88, 358}, Button { enabled, "OK" }, /* [2] */ {68, 227, 88, 286}, StaticText { disabled, "" }, /* [3] */ {7, 74, 55, 358}, StaticText { disabled, "^0" } } }; Revision-number: 43 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 1999-02-19T21:35:12.000000Z K 7 svn:log V 60 Now initialises enough to be able to generate fatal errors. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 1078 Text-content-md5: 27a1787d7c3b4dfd0132cb330214ffc8 Text-content-sha1: add21ecd63a4f1a092c3c5f1bc4898bdc501c1a3 Content-length: 1198 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 PROPS-END SVN(((/* $Id: mac.c,v 1.1.2.1 1999/02/19 21:35:12 ben Exp $ */ /* * mac.c -- miscellaneous Mac-specific routines */ #include #include #include #include #include #include #include #include /* putty.h needs size_t */ #include #include "putty.h" QDGlobals qd; int cold = 1; int main (int argc, char **argv) { /* Init QuickDraw */ InitGraf(&qd.thePort); /* Init Font Manager */ InitFonts(); /* Init Window Manager */ InitWindows(); /* Init Menu Manager */ InitMenus(); /* Init TextEdit */ TEInit(); /* Init Dialog Manager */ InitDialogs(nil); InitCursor(); cold = 0; fatalbox("Init complete"); } void fatalbox(const char *fmt, ...) { va_list ap; Str255 stuff; va_start(ap, fmt); /* We'd like stuff to be a Pascal string */ stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); va_end(ap); ParamText(stuff, NULL, NULL, NULL); StopAlert(128, nil); exit(1); } Revision-number: 44 Prop-content-length: 213 Content-length: 213 K 7 svn:log V 114 Now ignoring various Macish things too. (Is that how you spell "Macish"? Or is it "Mackish", or even "Maccish"?) K 10 svn:author V 3 ben K 8 svn:date V 27 1999-02-19T21:38:05.000000Z PROPS-END Node-path: putty-ben-mac-port Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 97 Content-length: 97 K 10 svn:ignore V 65 *.pdb *.ilk *.res *.RES *.pch *.rsp *.rsrc *.makeout .AppleDouble PROPS-END Node-path: putty-ben-mac-port/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 91d2c7f274245107dac3e76f09767869 Text-delta-base-sha1: 5f97366a6eab5231659b170d1e6b6a8fef78d75a Text-content-length: 77 Text-content-md5: 545c2596ac03f388ae41530fbc5542df Text-content-sha1: 87e65f5d246f6bf3faa0f2d41880e2fff1d6c9f3 Content-length: 120 K 15 cvs2svn:cvs-rev V 7 1.1.2.1 PROPS-END SVN$BBB*.pdb *.ilk *.res *.RES *.pch *.rsp *.rsrc *.makeout .AppleDouble Revision-number: 45 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 1999-02-19T21:39:25.000000Z K 7 svn:log V 38 Various cleanups, mostly Mac-related. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: df2fce26410fbdb5c70d45ba7e69121b Text-delta-base-sha1: 6408014a4811c59883fca3cf645f166ccc9971c1 Text-content-length: 585 Text-content-md5: 7b4b53cfc018f3c00bcf534c6b1f79fc Text-content-sha1: 90c7ab9dcc52d955d57384c5ac0ffe7c74bca3fc Content-length: 628 K 15 cvs2svn:cvs-rev V 7 1.4.2.1 PROPS-END SVN^F5caH aduvxpm\k^H#ifdef macintosh #include typedef UInt32 DWORD; #endif /* macintosh */ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0#ifdef macintosh typedef void *Context; /* Temporarily until I work out what it should really be */ #else /* not macintosh */ typedef HDC Context; #endif /* not macintosh */ #define SEL_NL { 13, 10 }#ifdef macintosh char *(*init) (char *host, int port, char **realhost); int (*msg)(void); #else /* not macintosh */#endif /* not macintosh */onst #ifndef macintosh#endif Revision-number: 46 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 1999-02-19T21:44:14.000000Z K 7 svn:log V 58 Don\'t bother compiling bits I haven\'t got round to yet. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/PuTTY.make Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 19d2fa70767243adfd9e290631bcc4fa Text-delta-base-sha1: 002139443c1aefc82a6e259fd65a721a4e32a9ae Text-content-length: 310 Text-content-md5: 25e20450421ffab49bc1ff31db2b69b8 Text-content-sha1: c444532b5d0aac664afd8fc587ca4fc8e59265ad Content-length: 353 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVN_& / Q+U I# $Id: PuTTY.make,v 1.1.2.3 1999/02/19 21:44:14# "{ObjDir68K}ssh.c.o" # "{ObjDir68K}sshcrc.c.o" # "{ObjDir68K}sshdes.c.o" # "{ObjDir68K}sshmd5.c.o" # "{ObjDir68K}sshrand.c.o" # "{ObjDir68K}sshrsa.c.o" # "{ObjDir68K}sshsha.c.o" #pTTY' ## Revision-number: 47 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 1999-02-19T22:06:36.000000Z K 7 svn:log V 20 added SIZE resource K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/putty.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: bc3d40f14b8975056ff23e8cc7115b0e Text-delta-base-sha1: 883ba60789ee31b56eab72a746b690904c23e2e7 Text-content-length: 496 Text-content-md5: 10c2802076e00c93c969f8bce651b6a8 Text-content-sha1: 6db7d19373176e1dad3d77485ef235874ee21050 Content-length: 539 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVNR W-*3/* $Id: putty.r,v 1.1.2.2 1999/02/19 22:06:36SIZE' (-1) { reserved, ignoreSuspendResumeEvents, reserved, cannotBackground, needsActivateOnFGSwitch, backgroundAndForeground, dontGetFrontClicks, ignoreAppDiedEvents, is32BitCompatible, notHighLevelEventAware, onlyLocalHLEvents, notStationeryAware, useTextEditServices, reserved, reserved, reserved, 65536, /* Minimum size */ 65536, /* Preferred size Revision-number: 48 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 1999-02-19T23:03:29.000000Z K 7 svn:log V 21 Now with added menus K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 27a1787d7c3b4dfd0132cb330214ffc8 Text-delta-base-sha1: add21ecd63a4f1a092c3c5f1bc4898bdc501c1a3 Text-content-length: 309 Text-content-md5: 512b32a56cae9a77d831cbb52e25c921 Text-content-sha1: 9edba8e2c174ce22e3ae4cac91ce561241759e18 Content-length: 352 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVN({+>![NZ/* $Id: mac.c,v 1.1.2.2 1999/02/19 23:03:29Handle menuBar; menuBar = GetNewMBar(128); if (menuBar == NULL) fatalbox("Unable to create menu bar."); SetMenuBar(menuBar); AppendResMenu(GetMenuHandle(128), 'DRVR'); /* adjustmenus */ DrawMenuBar(); Node-path: putty-ben-mac-port/putty.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 10c2802076e00c93c969f8bce651b6a8 Text-delta-base-sha1: 6db7d19373176e1dad3d77485ef235874ee21050 Text-content-length: 541 Text-content-md5: 9dace4ff23e3a1740ca8903f5a13d688 Text-content-sha1: 7a2fb13c475ddff2aefaaf07c7a1080246104da2 Content-length: 584 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVNj  -W[3/* $Id: putty.r,v 1.1.2.3 1999/02/19 23:03:29Menu bar */ resource 'MBAR' (128, preload) { { 128, 129 } }; resource 'MENU' (128, preload) { 128, textMenuProc, 0b11111111111111111111111111111101, enabled, apple, { "About PuTTY", noicon, nokey, nomark, plain, "-", noicon, nokey, nomark, plain, } }; resource 'MENU' (129, preload) { 129, textMenuProc, 0b11111111111111111111111111111111, enabled, "File", { "Quit", noicon, "Q", nomark, plain, } }; Revision-number: 49 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 1999-02-19T23:41:24.000000Z K 7 svn:log V 59 OK, so why did I think a fatal alert box should be silent? K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/putty.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 9dace4ff23e3a1740ca8903f5a13d688 Text-delta-base-sha1: 7a2fb13c475ddff2aefaaf07c7a1080246104da2 Text-content-length: 71 Text-content-md5: 3a59c57036af69fb109a82fcf01f94e8 Text-content-sha1: b1f76080e3b2c487eb31b5fcfb677b8d93dbca68 Content-length: 114 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVNjh 1`-W/* $Id: putty.r,v 1.1.2.4 1999/02/19 23:41:24beep Revision-number: 50 Prop-content-length: 343 Content-length: 343 K 8 svn:date V 27 1999-02-19T23:51:21.000000Z K 7 svn:log V 244 We now have an event loop, albeit one which ignores everything going on around it, then proclaims itself to be bored and leaves in a huff. I suspect this coulbe be turned into a satirical comment on someone, but I can't be bothered right now. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 512b32a56cae9a77d831cbb52e25c921 Text-delta-base-sha1: 9edba8e2c174ce22e3ae4cac91ce561241759e18 Text-content-length: 601 Text-content-md5: 2143070ace79db19065a1a3c3171d8d8 Text-content-sha1: b0cd473f516a5b8e9f9518b69966a3b2d62c74b6 Content-length: 644 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVNu3g+-1[2k/* $Id: mac.c,v 1.1.2.3 1999/02/19 23:51:21limits.h> #include #include /* putty.h needs size_t */ #include "putty.h" QDGlobals qd; int cold = 1; static void mac_startup(void); static void mac_eventloop(void); int main (int argc, char **argv) { mac_startup(); mac_eventloop(); } static void mac_startup(void} static void mac_eventloop(void) { Boolean gotevent; EventRecord event; int i; for (i = 0; i < 100; i++) { gotevent = WaitNextEvent(everyEvent, &event, LONG_MAX, NULL); } fatalbox("I'm bored. Revision-number: 51 Prop-content-length: 243 Content-length: 243 K 8 svn:date V 27 1999-02-20T18:12:47.000000Z K 7 svn:log V 142 Use different window procedures for the About box and the Licence box. Should prevent the version string masking part of the licence text ;-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 68b03e759a938bcf531b0db262fd1eae Text-delta-base-sha1: 75f572db3ed6198e55314cae7415edf4feb35ef4 Text-content-length: 134 Text-content-md5: cf05ea7ef155db67a59d9a3485d74199 Text-content-sha1: f9f90509e430acbc8cfe6354fd191049b507cd98 Content-length: 173 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN ]NNwY[uKULicenceProc (HWND hwnd, UINT msg, return 1;} return 0; case WM_CLOSE: abtLicence Revision-number: 52 Prop-content-length: 197 Content-length: 197 K 7 svn:log V 99 We now have a fairly minimal Mac application. I'm about to try lashing in the terminal emulator... K 10 svn:author V 3 ben K 8 svn:date V 27 1999-02-20T22:10:34.000000Z PROPS-END Node-path: putty-ben-early-mac-port/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: bc60054c910b5809b643a6dc237eea1a Text-delta-base-sha1: bc7864e87f1ce9d0e75d47b19edee8ee644cfeb6 Text-content-length: 619 Text-content-md5: c6678c65c325fa84e90733bc65a7c2a6 Text-content-sha1: a7659c56cceff6836d1c30b2aabda2d1765333f5 Content-length: 662 K 15 cvs2svn:cvs-rev V 7 1.4.2.1 PROPS-END SVN,*;"|B =EMT cQ3tNjB#include #include #ifndef macintosh #include #endif /* not macintosh */ #include "putty.h"macintosh static SOCKET s = INVALID_SOCKET; #endif#ifdef macintosh static void s_write (unsigned char *buf, int len) { panic("s_write not implemented"); } #else /* not macintosh */#endif /* not macintosh */ #ifdef macintosh static int s_read (unsigned char *buf, int len) { panic("s_read not implemented"); } #else /* not macintosh */#endif) : realloc(pktout.data, biglenunsigned(unsigned char *)(char *) Node-path: putty-ben-early-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 1fe77645c195b4368c61789055e369a6 Text-delta-base-sha1: 57085a33a1a93483d277bc7b84d830e822f73d91 Text-content-length: 85 Text-content-md5: 441aaa0a6d9976fe257d5414593bdd52 Text-content-sha1: a3d2529f8acc236d3b13640def55193a82157571 Content-length: 128 K 15 cvs2svn:cvs-rev V 7 1.5.2.1 PROPS-END SVN9fAA%#ifndef macintosh #include #endif /* not macintosh */ Node-path: putty-ben-mac-port/PuTTY.make Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 25e20450421ffab49bc1ff31db2b69b8 Text-delta-base-sha1: c444532b5d0aac664afd8fc587ca4fc8e59265ad Text-content-length: 298 Text-content-md5: 0ed594531882e9d29ae16257faf394fe Text-content-sha1: c74dc4fa45ed8e6241ce48d9cded49ec06c08209 Content-length: 341 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVN&< }/V t'# $Id: PuTTY.make,v 1.1.2.4 1999/02/20 22:10:33putty.r macresid.h Rez putty.r -o {Targ} {Includes} -append "{ObjDir68K}mac.c.o" {MondoBuild} mac.c putty.h macresid.h {C} mac.c -o {Targ} {COptions} "{ObjDir68K}misc.c.o" {MondoBuild} misc.c putty.h putty.h Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 2143070ace79db19065a1a3c3171d8d8 Text-delta-base-sha1: b0cd473f516a5b8e9f9518b69966a3b2d62c74b6 Text-content-length: 4956 Text-content-md5: 1125026b111b15305678fa2d91475bf9 Text-content-sha1: d8fff5486bb0dd9d7495a16e0e7f98250ef0909b Content-length: 4999 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVNuh')\+1s`.*K)IlcV1D/* $Id: mac.c,v 1.1.2.4 1999/02/20 22:10:33#include #include #include #include #include #include /* putty.h needs size_t */ #include "macresid.h"static void mac_event(EventRecord *); static void mac_contentclick(WindowPtr, EventRecord *); static void mac_updatewindow(WindowPtr); static void mac_keypress(EventRecord *); static int mac_windowtype(WindowPtr); static void mac_menucommand(long); static void mac_adjustcursor(void); static void mac_adjustmenus(void); static void mac_closewindow(WindowPtr); static void mac_zoomwindow(WindowPtr, short); static void mac_shutdownmApple), 'DRVR'); mac_adjustmenus(); DrawMenuBar(); InitCurso;;) { mac_adjustcursor(); gotevent = WaitNextEvent(everyEvent, &event, LONG_MAX, NULL); mac_adjustcursor(); if (gotevent) mac_event(&event); } } static void mac_event(EventRecord *event) { short part; WindowPtr window; Point pt; switch (event->what) { case mouseDown: part = FindWindow(event->where, &window); switch (part) { case inMenuBar: mac_adjustmenus(); mac_menucommand(MenuSelect(event->where)); break; case inSysWindow: SystemClick(event, window); break; case inContent: if (window != FrontWindow()) /* XXX: check for movable modal dboxes? */ SelectWindow(window); else mac_contentclick(window, event); break; case inGoAway: if (TrackGoAway(window, event->where)) mac_closewindow(window); break; case inDrag: /* XXX: moveable modal check? */ DragWindow(window, event->where, &qd.screenBits.bounds); break; case inGrow: break; case inZoomIn: case inZoomOut: if (TrackBox(window, event->where, part)) mac_zoomwindow(window, part); break; } break; case keyDown: case autoKey: mac_keypress(event); break; case activateEvt: /* FIXME: Do something */ break; case updateEvt: mac_updatewindow((WindowPtr)event->message); break; case diskEvt: if (HiWord(event->message) != noErr) { SetPt(&pt, 120, 120); DIBadMount(pt, event->message); } break; } } static void mac_contentclick(WindowPtr window, EventRecord *event) { short item; switch (mac_windowtype(window)) { case wTerminal: /* XXX: Do something. */ break; case wAbout: if (DialogSelect(event, &(DialogPtr)window, &item)) switch (item) { case wiAboutClose: mac_closewindow(window); break; case wiAboutLicence: /* XXX: Do something */ break; } break; } } static void mac_updatewindow(WindowPtr window) { switch (mac_windowtype(window)) { case wTerminal: /* XXX: DO something */ break; case wAbout: BeginUpdate(window); UpdateDialog(window, window->visRgn); EndUpdate(window); break; } } /* * Work out what kind of window we're dealing with. * Concept shamelessly nicked from SurfWriter. */ static int mac_windowtype(WindowPtr window) { int kind; if (window == NULL) return wNone; kind = ((WindowPeek)window)->windowKind; if (kind < 0) return wDA; else if (kind == userKind) return wTerminal; else return GetWRefCon(window); } /* * Handle a key press */ static void mac_keypress(EventRecord *event) { char key; if (event->what == keyDown && (event->modifiers & cmdKey)) { mac_adjustmenus(); mac_menucommand(MenuKey(event->message & charCodeMask)); } } static void mac_menucommand(long result) { short menu, item; Str255 da; menu = HiWord(result); item = LoWord(result); switch (menu) { case mApple: switch (item) { case iAbout: GetNewDialog(wAbout, NULL, (GrafPort *)-1); break; default: GetMenuItemText(GetMenuHandle(mApple), item, da); OpenDeskAcc(da); break; } break; case mFile: switch (item) { case iClose: mac_closewindow(FrontWindow()); break; case iQuit: mac_shutdown(); break; } break; } HiliteMenu(0); } static void mac_closewindow(WindowPtr window) { switch (mac_windowtype(window)) { case wDA: CloseDeskAcc(((WindowPeek)window)->windowKind); break; case wTerminal: /* FIXME: end session and stuff */ break; default: CloseWindow(window); break; } } static void mac_zoomwindow(WindowPtr window, short part) { /* FIXME: do something */ } /* * Make the menus look right before the user gets to see them. */ static void mac_adjustmenus(void) { } /* * Make sure the right cursor's being displayed. */ static void mac_adjustcursor(void) { SetCursor(&qd.arrow); } static void mac_shutdown(void) { ExitToShell( Node-path: putty-ben-mac-port/macresid.h Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 646 Text-content-md5: 74340b8b4bb7157ebb7183ef2625d2ae Text-content-sha1: 5983862e958f10551b7a457b5edb55fb013167fd Content-length: 766 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 PROPS-END SVNxxx/* $Id: macresid.h,v 1.1.2.1 1999/02/20 22:10:34 ben Exp $ */ /* * macresid.h -- Mac resource IDs * * This file is shared by C and Rez source files */ /* Menu bar IDs */ #define MBAR_Main 128 /* Menu IDs */ #define mApple 128 #define mFile 129 /* Menu Items */ /* Apple menu */ #define iAbout 1 /* File menu */ #define iClose 1 #define iQuit 3 /* Window types (and resource IDs) */ #define wNone 0 /* Dummy value for no window */ #define wDA 1 /* DUmmy value for desk accessory */ #define wFatal 128 #define wAbout 129 #define wiAboutClose 1 #define wiAboutLicence 2 #define wTerminal 130 #define wLicence 131 Node-path: putty-ben-mac-port/putty.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 3a59c57036af69fb109a82fcf01f94e8 Text-delta-base-sha1: b1f76080e3b2c487eb31b5fcfb677b8d93dbca68 Text-content-length: 3206 Text-content-md5: fe93bbe0362581ae3a968fdc3e09979c Text-content-sha1: 761b7a3a65e87a0f3ac9f3304dde5df20d3c1896 Content-length: 3249 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVNh* ZIsc^K#Bt_Jq/* $Id: putty.r,v 1.1.2.5 1999/02/20 22:10:34 ben Exp $ */ /* PuTTY resources */ #define PICT_RezTemplateVersion 1 #include "Types.r" /* Get resource IDs we share with C code */ #include "macresid.hMBAR_Main, preload) { { mApple, mFile } }; resource 'MENU' (mApple, preload) { mApplemFile, preload) { mFile, textMenuProc, 0b11111111111111111111111111111101, enabled, "File", { "Close", noicon, "W", nomark, plain, "-", noicon, nokey, nomark, plain,wFatal, "fatalbox", purgeable) { {54, 67, 152, 435}, wFatal, beepStages, alertPositionMainScreen }; resource 'DITL' (wFatal/* "About" box */ resource 'DLOG' (wAbout, "about", purgeable) { { 0, 0, 120, 186 }, noGrowDocProc, visible, goAway, wAbout, /* RefCon -- identifies the window to PuTTY */ wAbout, /* DITL ID */ "About PuTTY", alertPositionMainScreen }; resource 'DITL' (wAbout, "about", purgeable) { { { 87, 116, 107, 173 }, Button { enabled, "Close" }, { 87, 13, 107, 103 }, Button { enabled, "View Licence" }, { 13, 13, 29, 173 }, StaticText { disabled, "PuTTY"}, { 42, 13, 74, 173 }, StaticText { disabled, "Mac Development\n 1997-9 Simon Tatham"}, } }; /* Licence box */ resource 'DLOG' (wLicence, "licence", purgeable) { { 0, 0, 300, 300 }, noGrowDocProc, visible, goAway, wLicence, wLicence, "PuTTY Licence", alertPositionParentWindowScreen }; type 'TEXT' { string; }; resource 'TEXT' (wLicence, "licence", purgeable) { "Copyright 1997-9 Simon Tatham\n" "Portions copyright Gary S. Brown and Eric Young\n\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy of this software and associated documentation " "files (the \"Software\"), to deal in the Software without " "restriction, including without limitation the rights to use, " "copy, modify, merge, publish, distribute, sublicense, and/or " "sell copies of the Software, and to permit persons to whom the " "Software is furnished to do so, subject to the following " "conditions:\n\n" "The above copyright notice and this permission notice shall be " "included in all copies or substantial portions of the Software.\n\n" "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, " "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF " "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND " "NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR " "ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF " "CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN " "CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE " "SOFTWARE." }; #if 0 resource 'DITL' (wLicence, "licence", purgeable) { { { 13, 23, 287, 277 }, Picture { enabled, wLicence } } }; resource 'PICT' (wLicence, "licence", purgeable) { { 0, 0, 274, 254 }, VersionTwo { { LongText { { 16, 0 }, "Copyright 1997-9 Simon Tatham" }, LongText { { 32, 0 }, "Portions copyright Gary S. Brown and Eric Young" }, } } }; #endif Node-path: putty-ben-mac-port/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: b621bce4cc8aea4a0ff6457f7fae93e3 Text-delta-base-sha1: b1032617e0afb19e7baf6407d860d97ac5714fb5 Text-content-length: 168 Text-content-md5: f8b180987bb109ff14131d623951101e Text-content-sha1: 1939e791cf10f0e4d882f212b808e92a07256be5 Content-length: 211 K 15 cvs2svn:cvs-rev V 7 1.2.2.1 PROPS-END SVNtX G-#ifndef macintosh #include #include #endif /* not macintosh */ #include #include #include "putty.h" Revision-number: 53 Prop-content-length: 431 Content-length: 431 K 8 svn:date V 27 1999-02-20T23:55:55.000000Z K 7 svn:log V 332 End of a night's work. Not a very useful state, but this is my branch and I'll do what I want with it. Anyway, made a start on a Mac display for the terminal emulator, and the enumeration of the global variables that will have to die. Oh, and the licence is now in a TEXT resource -- I just have to work out how to display it... K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 1125026b111b15305678fa2d91475bf9 Text-delta-base-sha1: d8fff5486bb0dd9d7495a16e0e7f98250ef0909b Text-content-length: 149 Text-content-md5: ff62c4e8bb24e3e77561ab18c69736c4 Text-content-sha1: 234a4ad4958f355fa787ca2937ec1a13852d8f3a Content-length: 192 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVNhQy7+XV/* $Id: mac.c,v 1.1.2.5 1999/02/20 23:55:55static void mac_newsessioNew: mac_newsession(); break; Node-path: putty-ben-mac-port/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 74340b8b4bb7157ebb7183ef2625d2ae Text-delta-base-sha1: 5983862e958f10551b7a457b5edb55fb013167fd Text-content-length: 111 Text-content-md5: 545ff3006e10e2b997f11f9b1c35fdf2 Text-content-sha1: 530b451cb61f172195c2ca7083b24a39858fcf22 Content-length: 154 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVNx Y0e/* $Id: macresid.h,v 1.1.2.2 1999/02/20 23:55:55New 1 #define iClose 2 #define iQuit 4 Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 7b4b53cfc018f3c00bcf534c6b1f79fc Text-delta-base-sha1: 90c7ab9dcc52d955d57384c5ac0ffe7c74bca3fc Text-content-length: 472 Text-content-md5: 8b27694ddde42b4466996d3ac82df3b5 Text-content-sha1: e7ac98a4b40848a049d247b742ce0ce34098f937 Content-length: 515 K 15 cvs2svn:cvs-rev V 7 1.4.2.2 PROPS-END SVNF @M@{Kstruct session { /* Display state */ int rows, cols, savelines; int font_width, font_height; int has_focus; /* Buffers */ unsigned char inbuf[INBUF_SIZE]; int inbuf_head, inbuf_reap; unsigned char outbuf[OUTBUF_SIZE]; int outbuf_head, outbuf_reap; /* Emulator state */ int app_cursor_keys, app_keypad_keys; /* Backend */ Backend *back; /* Config that created this session */ Config cfg; } Node-path: putty-ben-mac-port/putty.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: fe93bbe0362581ae3a968fdc3e09979c Text-delta-base-sha1: 761b7a3a65e87a0f3ac9f3304dde5df20d3c1896 Text-content-length: 342 Text-content-md5: a09c6511dcad4ef76d44a3eed6908cea Text-content-sha1: 161d577e1af3203f2527828d34e4f604aa184edf Content-length: 385 K 15 cvs2svn:cvs-rev V 7 1.1.2.6 PROPS-END SVN*"10-ENr}?>v4/* $Id: putty.r,v 1.1.2.6 1999/02/20 23:55:55New Session" noicon, "N", nomark, plain, "Close", noicon, "W", Terminal window */ resource 'WIND' (wTerminal, "terminal", purgeable) { { 0, 0, 0, 0 }, zoomDocProc, invisible, goAway, 0x0, "untitled" staggerParentWindowScreen Revision-number: 54 Prop-content-length: 149 Content-length: 149 K 7 svn:log V 51 Start of a Mac front-end to the terminal emulator. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-02-20T23:57:58.000000Z PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 1003 Text-content-md5: adcb93d8cc5b230b41a3d27085dd9ff5 Text-content-sha1: b86076ce92fdebb9c14fffeff86b742b4e6533dc Content-length: 1123 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN]]]/* * macterm.c -- Macintosh terminal front-end */ #include #include #include "macresid.h" #include "putty.h" struct mac_session { short fnum; int fsize; } void mac_newsession(void) { WindowPtr window; struct mac_session *s; /* This should obviously be initialised by other means */ s = smalloc(sizeof(*s)); s->fnum = GetFNum("\pMonaco"); s->fsize = 9; rows = 24; cols = 80; /* XXX: non-Color-QuickDraw? Own storage management? */ window = GetNewCWindow(wTerminal, NULL, (WindowPtr)-1); SetPort(window); mac_initfont(s); term_init(); term_size(rows, cols); } void mac_initfont(struct mac_session *s) { FMetricRec metrics; TextFont(s->fnum); TextFace(0); TextSize(s->fsize); FontMetrics(&metrics); font_width = metrics.widMax; font_height = metrics.ascent + metrics.descent + metrics.leading; SizeWindow(window, cols * font_width, rows * font_height, TRUE); } Revision-number: 55 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 67 putty.r renamed to mac_res.r for consistency with Windows version. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-02-21T10:29:13.000000Z PROPS-END Node-path: putty-ben-mac-port/PuTTY.make Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 0ed594531882e9d29ae16257faf394fe Text-delta-base-sha1: c74dc4fa45ed8e6241ce48d9cded49ec06c08209 Text-content-length: 102 Text-content-md5: 582270634dd247c3550ca172c3246f0c Text-content-sha1: 312072816b05b9e209fed6a7a3c9e230f58f81a7 Content-length: 145 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVN<@ P}/sI# $Id: PuTTY.make,v 1.1.2.5 1999/02/21 10:29:12mac_res.r macresid.h Rez mac_res Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 11698 Text-content-md5: caefe2ac31cea4e2f25245b2d67fe4d9 Text-content-sha1: 14dfc95fcddbbb5765f453f45c15b8e5ca8237cc Content-length: 11818 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 PROPS-END SVN$$$/* $Id: mac_res.r,v 1.1.2.1 1999/02/21 10:29:13 ben Exp $ */ /* PuTTY resources */ #define PICT_RezTemplateVersion 1 #include "Types.r" /* Get resource IDs we share with C code */ #include "macresid.h" /* * Finder-related resources */ /* For now, PuTTY uses the signature "pTTY" */ type 'pTTY' as 'STR '; resource 'pTTY' (0, purgeable) { "PuTTY experimental Mac port" }; resource 'vers' (1, purgeable) { 0x00, 0x45, /* Major and minor (BCD) */ development, 0, /* Status and pre-release */ 2, /* Region code (2 = UK) */ "Mac exp", /* Short version (list views) */ "Mac experimental", /* Long version (get info) */ }; resource 'SIZE' (-1) { reserved, ignoreSuspendResumeEvents, reserved, cannotBackground, needsActivateOnFGSwitch, backgroundAndForeground, dontGetFrontClicks, ignoreAppDiedEvents, is32BitCompatible, notHighLevelEventAware, onlyLocalHLEvents, notStationeryAware, useTextEditServices, reserved, reserved, reserved, 65536, /* Minimum size */ 65536, /* Preferred size */ }; resource 'FREF' (128, purgeable) { /* The application itself */ 'APPL', 128, "" }; resource 'FREF' (129, purgeable) { /* Saved session */ 'Sess', 129, "" }; resource 'FREF' (130, purgeable) { /* SSH host keys database */ 'HKey', 130, "" }; resource 'BNDL' (128, purgeable) { 'pTTY', 0, { 'ICN#', { 128, 128, 129, 129, 130, 130 }, 'FREF', { 128, 128, 129, 129, 130, 130 }; }; }; /* Icons, courtesy of DeRez */ /* Application icon */ resource 'ICN#' (128, purgeable) { { /* array: 2 elements */ /* [1] */ $"0000 3FFE 0000 4001 0000 4FF9 0000 5005" $"0000 5545 0000 5005 0000 5405 0000 5005" $"0000 5505 0000 5005 0000 4FF9 0000 4001" $"0000 4001 7FFC 407D 8002 4001 9FF2 4001" $"A00A 3FFE AA8A 2002 A00A 3FFE A80A 0000" $"A00A 0000 AA0A 0000 A00A 0000 9FF2 0000" $"8002 0000 8002 0000 80FA 0000 8002 0000" $"8002 0000 7FFC 0000 4004 0000 7FFC", /* [2] */ $"0000 3FFE 0000 7FFF 0000 7FFF 0000 7FFF" $"0000 7FFF 0000 7FFF 0000 7FFF 0000 7FFF" $"0000 7FFF 0000 7FFF 0000 7FFF 0000 7FFF" $"0000 7FFF 7FFC 7FFF FFFE 7FFF FFFE 7FFF" $"FFFE 3FFE FFFE 3FFE FFFE 3FFE FFFE 0000" $"FFFE 0000 FFFE 0000 FFFE 0000 FFFE 0000" $"FFFE 0000 FFFE 0000 FFFE 0000 FFFE 0000" $"FFFE 0000 7FFC 0000 7FFC 0000 7FFC" } }; resource 'ics#' (128, purgeable) { { /* array: 2 elements */ /* [1] */ $"00FF 0081 00BD 00A5 00A5 00BD FF81 818D" $"BD81 A57E A500 BD00 8100 8D00 8100 7E", /* [2] */ $"00FF 00FF 00FF 00FF 00FF 00FF FFFF FFFF" $"FFFF FF7E FF00 FF00 FF00 FF00 FF00 7E" } }; /* Known hosts icon */ resource 'ICN#' (130, purgeable) { { /* array: 2 elements */ /* [1] */ $"1FFF FC00 1000 0600 1000 0500 1FFF FC80" $"1000 0440 1000 0420 1FFF FFF0 1000 0010" $"13FC 0F90 1C03 F0F0 15FA 8090 150A 8090" $"1D0B 80F0 150A 8050 15FA 8050 1C03 8070" $"143A 8050 1402 8050 1FFF ABF0 1204 8110" $"13FC FF10 1AAA AAB0 1000 0010 17FF FFD0" $"1400 0050 1525 2250 1555 5550 1525 2250" $"1400 0050 17FF FFD0 1000 0010 1FFF FFF0", /* [2] */ $"1FFF FC00 1FFF FE00 1FFF FF00 1FFF FF80" $"1FFF FFC0 1FFF FFE0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" $"1FFF FFF0 1FFF FFF0 1FFF FFF0 1FFF FFF0" } }; resource 'icl4' (130, purgeable) { $"000F FFFF FFFF FFFF FFFF FF00 0000 0000" $"000F 0000 0000 0000 0000 0FF0 0000 0000" $"000F 0000 0000 0000 0000 0FCF 0000 0000" $"000F FFFF FFFF FFFF FFFF FFCC F000 0000" $"000F 0000 0000 0000 0000 0FCC CF00 0000" $"000F 0000 0000 0000 0000 0FCC CCF0 0000" $"000F FFFF FFFF FFFF FFFF FFFF FFFF 0000" $"000F 0000 0000 0000 0000 0000 000F 0000" $"000F 00FF FFFF FF00 0000 FFFF F00F 0000" $"000F FFCC CCCC CCFF FFFF CCCC FFFF 0000" $"000F 0FCE EEEE CCF0 FCCC CCCC F00F 0000" $"000F 0FCE 0D0D 0CF0 FCCC CCCC F00F 0000" $"000F FFCE D0D0 CCFF FCCC CCCC FFFF 0000" $"000F 0FCE 0D0D 0CF0 FCCC CCCC CF0F 0000" $"000F 0FCC C0C0 CCF0 FCCC CCCC CF0F 0000" $"000F FFCC CCCC CCFF FCCC CCCC CFFF 0000" $"000F 0FCC CCFF FCF0 FCCC CCCC CF0F 0000" $"000F 0FCC CCCC CCF0 FCCC CCCC CF0F 0000" $"000F FFFF FFFF FFFF FDDD DDDF FFFF 0000" $"000F 00FC CDDE EF00 FDDD DDDF 000F 0000" $"000F 00FF FFFF FF00 FFFF FFFF 000F 0000" $"000F 0C0C 0C0C 0C0C 0C0C 0C0C 0C0F 0000" $"000F C0C0 C0C0 C0C0 C0C0 C0C0 C0CF 0000" $"000F 0FFF FFFF FFFF FFFF FFFF FF0F 0000" $"000F CF00 0000 0000 0000 0000 0FCF 0000" $"000F 0F0F 00F0 0F0F 00F0 00F0 0F0F 0000" $"000F CF0F 0F0F 0F0F 0F0F 0F0F 0FCF 0000" $"000F 0F0F 00F0 0F0F 00F0 00F0 0F0F 0000" $"000F CF00 0000 0000 0000 0000 0FCF 0000" $"000F 0FFF FFFF FFFF FFFF FFFF FF0F 0000" $"000F C0C0 C0C0 C0C0 C0C0 C0C0 C0CF 0000" $"000F FFFF FFFF FFFF FFFF FFFF FFFF" }; resource 'icl8' (130, purgeable) { $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF 0000 0000 0000 0000 0000" $"0000 00FF 0000 0000 0000 0000 0000 0000" $"0000 0000 00FF FF00 0000 0000 0000 0000" $"0000 00FF 0000 0000 0000 0000 0000 0000" $"0000 0000 00FF F6FF 0000 0000 0000 0000" $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF F6F6 FF00 0000 0000 0000" $"0000 00FF 0000 0000 0000 0000 0000 0000" $"0000 0000 00FF F6F6 F6FF 0000 0000 0000" $"0000 00FF 0000 0000 0000 0000 0000 0000" $"0000 0000 00FF F6F6 F6F6 FF00 0000 0000" $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF FFFF FFFF FFFF 0000 0000" $"0000 00FF 0000 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 0000 00FF 0000 0000" $"0000 00FF 0000 FFFF FFFF FFFF FFFF 0000" $"0000 0000 FFFF FFFF FF00 00FF 0000 0000" $"0000 00FF FFFF 2B2B 2B2B 2B2B 2B2B FFFF" $"FFFF FFFF 2B2B 2B2B FFFF FFFF 0000 0000" $"0000 00FF 00FF 2BFC FCFC FCFC F82B FF00" $"FF2B 2B2B 2B2B 2B2B FF00 00FF 0000 0000" $"0000 00FF 00FF 2BFC 2A2A 2A2A 002B FF00" $"FF2B 2B2B 2B2B 2B2B FF00 00FF 0000 0000" $"0000 00FF FFFF 2BFC 2A2A 2A2A 002B FFFF" $"FF2B 2B2B 2B2B 2B2B FFFF FFFF 0000 0000" $"0000 00FF 00FF 2BFC 2A2A 2A2A 002B FF00" $"FF2B 2B2B 2B2B 2B2B 2BFF 00FF 0000 0000" $"0000 00FF 00FF 2BF8 0000 0000 002B FF00" $"FF2B 2B2B 2B2B 2B2B 2BFF 00FF 0000 0000" $"0000 00FF FFFF 2B2B 2B2B 2B2B 2B2B FFFF" $"FF2B 2B2B 2B2B 2B2B 2BFF FFFF 0000 0000" $"0000 00FF 00FF 2B2B 2B2B FFFF FF2B FF00" $"FF2B 2B2B 2B2B 2B2B 2BFF 00FF 0000 0000" $"0000 00FF 00FF 2B2B 2B2B 2B2B 2B2B FF00" $"FF2B 2B2B 2B2B 2B2B 2BFF 00FF 0000 0000" $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" $"FFF9 F9F9 F9F9 F9FF FFFF FFFF 0000 0000" $"0000 00FF 0000 FFF7 F8F9 FAFB FCFF 0000" $"FFF9 F9F9 F9F9 F9FF 0000 00FF 0000 0000" $"0000 00FF 0000 FFFF FFFF FFFF FFFF 0000" $"FFFF FFFF FFFF FFFF 0000 00FF 0000 0000" $"0000 00FF F5F5 F5F5 F5F5 F5F5 F5F5 F5F5" $"F5F5 F5F5 F5F5 F5F5 F5F5 F5FF 0000 0000" $"0000 00FF F5F5 F5F5 F5F5 F5F5 F5F5 F5F5" $"F5F5 F5F5 F5F5 F5F5 F5F5 F5FF 0000 0000" $"0000 00FF F5FF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF FFFF FFFF F5FF 0000 0000" $"0000 00FF F5FF 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 00FF F5FF 0000 0000" $"0000 00FF F5FF 00FF 0000 FF00 00FF 00FF" $"0000 FF00 0000 FF00 00FF F5FF 0000 0000" $"0000 00FF F5FF 00FF 00FF 00FF 00FF 00FF" $"00FF 00FF 00FF 00FF 00FF F5FF 0000 0000" $"0000 00FF F5FF 00FF 0000 FF00 00FF 00FF" $"0000 FF00 0000 FF00 00FF F5FF 0000 0000" $"0000 00FF F5FF 0000 0000 0000 0000 0000" $"0000 0000 0000 0000 00FF F5FF 0000 0000" $"0000 00FF F5FF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF FFFF FFFF F5FF 0000 0000" $"0000 00FF F5F5 F5F5 F5F5 F5F5 F5F5 F5F5" $"F5F5 F5F5 F5F5 F5F5 F5F5 F5FF 0000 0000" $"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF" $"FFFF FFFF FFFF FFFF FFFF FFFF" }; /* * Internal resources */ /* Menu bar */ resource 'MBAR' (MBAR_Main, preload) { { mApple, mFile } }; resource 'MENU' (mApple, preload) { mApple, textMenuProc, 0b11111111111111111111111111111101, enabled, apple, { "About PuTTY", noicon, nokey, nomark, plain, "-", noicon, nokey, nomark, plain, } }; resource 'MENU' (mFile, preload) { mFile, textMenuProc, 0b11111111111111111111111111111101, enabled, "File", { "New Session" noicon, "N", nomark, plain, "Close", noicon, "W", nomark, plain, "-", noicon, nokey, nomark, plain, "Quit", noicon, "Q", nomark, plain, } }; /* Fatal error box. Stolen from the Finder. */ resource 'ALRT' (wFatal, "fatalbox", purgeable) { {54, 67, 152, 435}, wFatal, beepStages, alertPositionMainScreen }; resource 'DITL' (wFatal, "fatalbox", purgeable) { { /* array DITLarray: 3 elements */ /* [1] */ {68, 299, 88, 358}, Button { enabled, "OK" }, /* [2] */ {68, 227, 88, 286}, StaticText { disabled, "" }, /* [3] */ {7, 74, 55, 358}, StaticText { disabled, "^0" } } }; /* Terminal window */ resource 'WIND' (wTerminal, "terminal", purgeable) { { 0, 0, 0, 0 }, zoomDocProc, invisible, goAway, 0x0, "untitled" staggerParentWindowScreen }; /* "About" box */ resource 'DLOG' (wAbout, "about", purgeable) { { 0, 0, 120, 186 }, noGrowDocProc, visible, goAway, wAbout, /* RefCon -- identifies the window to PuTTY */ wAbout, /* DITL ID */ "About PuTTY", alertPositionMainScreen }; resource 'DITL' (wAbout, "about", purgeable) { { { 87, 116, 107, 173 }, Button { enabled, "Close" }, { 87, 13, 107, 103 }, Button { enabled, "View Licence" }, { 13, 13, 29, 173 }, StaticText { disabled, "PuTTY"}, { 42, 13, 74, 173 }, StaticText { disabled, "Mac Development\n 1997-9 Simon Tatham"}, } }; /* Licence box */ resource 'DLOG' (wLicence, "licence", purgeable) { { 0, 0, 300, 300 }, noGrowDocProc, visible, goAway, wLicence, wLicence, "PuTTY Licence", alertPositionParentWindowScreen }; type 'TEXT' { string; }; resource 'TEXT' (wLicence, "licence", purgeable) { "Copyright 1997-9 Simon Tatham\n" "Portions copyright Gary S. Brown and Eric Young\n\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy of this software and associated documentation " "files (the \"Software\"), to deal in the Software without " "restriction, including without limitation the rights to use, " "copy, modify, merge, publish, distribute, sublicense, and/or " "sell copies of the Software, and to permit persons to whom the " "Software is furnished to do so, subject to the following " "conditions:\n\n" "The above copyright notice and this permission notice shall be " "included in all copies or substantial portions of the Software.\n\n" "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, " "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF " "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND " "NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR " "ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF " "CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN " "CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE " "SOFTWARE." }; #if 0 resource 'DITL' (wLicence, "licence", purgeable) { { { 13, 23, 287, 277 }, Picture { enabled, wLicence } } }; resource 'PICT' (wLicence, "licence", purgeable) { { 0, 0, 274, 254 }, VersionTwo { { LongText { { 16, 0 }, "Copyright 1997-9 Simon Tatham" }, LongText { { 32, 0 }, "Portions copyright Gary S. Brown and Eric Young" }, } } }; #endif Node-path: putty-ben-mac-port/putty.r Node-action: delete Revision-number: 56 Prop-content-length: 238 Content-length: 238 K 7 svn:log V 139 Bloody Hell! It just managed to say "Hello, world" in a terminal window! I'd better check this lot in before something bad happens to it. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-02-21T18:09:41.000000Z PROPS-END Node-path: putty-ben-mac-port/PuTTY.make Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 582270634dd247c3550ca172c3246f0c Text-delta-base-sha1: 312072816b05b9e209fed6a7a3c9e230f58f81a7 Text-content-length: 209 Text-content-md5: a34832e6060ccb3eb1187b02fc2b095d Text-content-sha1: a8e07aa68339414fde323bcd86ab5da1462dd11c Content-length: 252 K 15 cvs2svn:cvs-rev V 7 1.1.2.6 PROPS-END SVN@L3/&~ 7# $Id: PuTTY.make,v 1.1.2.6 1999/02/21 18:09:41acterm.h macresid.h {C} mac.c -o {Targ} {COptions} "{ObjDir68K}macterm.c.o" {MondoBuild} macterm.c mac.h putty.h {C} macterm Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: ff62c4e8bb24e3e77561ab18c69736c4 Text-delta-base-sha1: 234a4ad4958f355fa787ca2937ec1a13852d8f3a Text-content-length: 631 Text-content-md5: 1ce0efeb8fb6ae827ec47bb31fceaccb Text-content-sha1: 70978389a88421cd8bad1e88b5c0d2b262fe4201 Content-length: 674 K 15 cvs2svn:cvs-rev V 7 1.1.2.6 PROPS-END SVNQ."I+w- Qhd.y()/* $Id: mac.c,v 1.1.2.6 1999/02/21 18:09:41Gestaldefine PUTTY_DO_GLOBALS #include "macresid.h" #include "putty.h" #include "mac.h" QDGlobals qd; static int cold = 1; long mac_qdversion/* Find out if we've got Color Quickdraw */ if (Gestalt(gestaltQuickdrawVersion, &mac_qdversion) != noErr) mac_qdversion = gestaltOriginalQDBeginUpdate(window); term_paint((struct mac_session *)GetWRefCon(window), (*window->visRgn)->rgnBBox.left, (*window->visRgn)->rgnBBox.top, (*window->visRgn)->rgnBBox.right, (*window->visRgn)->rgnBBox.bottom); EndUpdate(window); Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: caefe2ac31cea4e2f25245b2d67fe4d9 Text-delta-base-sha1: 14dfc95fcddbbb5765f453f45c15b8e5ca8237cc Text-content-length: 289 Text-content-md5: a70228142abd95df0e225217d0d87a7e Text-content-sha1: 9ac21ecad38a25b7e0259d23625efd03d9ef2492 Content-length: 332 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVN$9w\/1ZkP?E_/* $Id: mac_res.r,v 1.1.2.2 1999/02/21 18:09:411024 * 1024, /* Minimum size */ 1024 * 1024,011, enabled, "File", { "New Session",200, 200 }, zoomDocProc, invisible, goAway, 0x0, "untitled","Experimantal Mac Por Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: adcb93d8cc5b230b41a3d27085dd9ff5 Text-delta-base-sha1: b86076ce92fdebb9c14fffeff86b742b4e6533dc Text-content-length: 3682 Text-content-md5: 9e81e80dd07a961b238a3047afc469d2 Text-content-sha1: e354c1cb99aea611d176b23f0d96a0ec52d40e94 Content-length: 3725 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVN]PBPTypes.h> #include #include #include #include #include #include #include "macresid.h" #include "putty.h" #include "mac.h" struct mac_session { short fontnum; int font_ascent; WindowPtr(window); }; static void mac_initfont(struct mac_session *); /* Temporary hack till I get the terminal emulator supporting multiple sessions */ static struct mac_session *onlysession; void mac_newsession(void) { struct mac_session *s; /* This should obviously be initialised by other means */ s = smalloc(sizeof(*s)); strcpy(cfg.font, "Monaco"); cfg.fontisbold = 0; cfg.fontheight = 9; onlysession = s; /* XXX: non-Color-QuickDraw? Own storage management? */ if (mac_qdversion == gestaltOriginalQD) s->window = GetNewWindow(wTerminal, NULL, (WindowPtr)-1); else s->window = GetNewCWindow(wTerminal, NULL, (WindowPtr)-1); SetWRefCon(s->window, (long)s); term_init(); term_size(24, 80, 100); mac_initfont(s); ShowWindow(s->window); } static void inbuf_putc(int c) { inbuf[inbuf_head] = c; inbuf_head = (inbuf_head+1) & INBUF_MASK; } static void inbuf_putstr(const char *c) { while (*c) inbuf_putc(*c++); } static void mac_initfont(struct mac_session *s) { Str255 macfont; FontInfo fi; SetPort(s->window); macfont[0] = sprintf((char *)&macfont[1], "%s", cfg.font); GetFNum(macfont, &s->fontnum); TextFont(s->fontnum); TextFace(cfg.fontisbold ? bold : 0); TextSize(cfg.fontheight); GetFontInfo(&fi); font_width = fi.widMax; font_height = fi.ascent + fi.descent + fi.leading; s->font_ascent = fi.ascent; SizeWindow(s->window, cols * font_width, rows * font_height, true); inbuf_putstr("Hello,\007 world\007"); term_out(); } /* * Call from the terminal emulator to draw a bit of text * * x and y are text row and column (zero-based) */ void do_text(struct mac_session *s, int x, int y, char *text, int len, unsigned long attr) { int style = 0; SetPort(s->window); TextFont(s->fontnum); if (cfg.fontisbold || (attr & ATTR_BOLD) && !cfg.bold_colour) style |= bold; if (attr & ATTR_UNDER) style |= underline; TextFace(style); TextSize(cfg.fontheight); TextMode(srcCopy); SetFractEnable(FALSE); /* We want characters on pixel boundaries */ MoveTo(x * font_width, y * font_height + s->font_ascent); DrawText(text, 0, len); } /* * Call from the terminal emulator to get its graphics context. * I feel this should disappear entirely (and do_text should take * a Session as an argument. Simon may disagree. */ struct mac_session *get_ctx(void) { return onlysession; } /* * Presumably this does something in Windows */ void free_ctx(struct mac_session *ctx) { } /* * Set the scroll bar position */ void set_sbar(int total, int start, int page) { /* Do something once we actually have a scroll bar */ } /* * Beep */ void beep(void) { SysBeep(30); } /* * Set icon string -- a no-op here (WIndowshade?) */ void set_icon(char *icon) { } /* * Set the window title */ void set_title(char *title) { Str255 mactitle; mactitle[0] = sprintf((char *)&mactitle[1], "%s", title); SetWTitle(onlysession->window, mactitle); } /* * Resize the window at the emulator's request */ void request_resize(int w, int h) { /* XXX: Do something */ } /* * Set the logical palette */ void palette_set(int n, int r, int g, int b) { /* XXX: Do something */ } /* * Reset to the default palette */ void palette_reset(void) { /* XXX: Do something */ } Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 8b27694ddde42b4466996d3ac82df3b5 Text-delta-base-sha1: e7ac98a4b40848a049d247b742ce0ce34098f937 Text-content-length: 142 Text-content-md5: 4c35cac5e88577138d19ea5d07be5aee Text-content-sha1: 4c1eae32cdf069e5bd642988794992e1d8967ef9 Content-length: 185 K 15 cvs2svn:cvs-rev V 7 1.4.2.3 PROPS-END SVN !b on_(2[S5struct mac_sessionstruct mac_session; typedef struct mac_session *Context;typedef struct Session; Revision-number: 57 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 1999-02-21T18:11:35.000000Z K 7 svn:log V 56 Added mac.h for stuff that's only used by the Mac port. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 178 Text-content-md5: 035b80757c65074279da4be728a869da Text-content-sha1: 82aa8e25b4c60158b12f226938073b893a67f5c3 Content-length: 298 K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN$$$/* * mac.h -- macintosh-specific declarations */ #ifndef _PUTTY_MAC_H #define _PUTTY_MAC_H extern long mac_qdversion; extern void mac_newsession(void); #endif Revision-number: 58 Prop-content-length: 250 Content-length: 250 K 8 svn:date V 27 1999-02-21T22:05:00.000000Z K 7 svn:log V 151 Most attributes work now. Palette changes aren't yet done (but should be easy). Character-set attributes aren't done. QuickDraw is too clever by half. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 9e81e80dd07a961b238a3047afc469d2 Text-delta-base-sha1: e354c1cb99aea611d176b23f0d96a0ec52d40e94 Text-content-length: 3522 Text-content-md5: 0335560519f9484ed419fdba31a38466 Text-content-sha1: cd412d7a1ae6b2407f3c1fe99b852800107bce7e Content-length: 3565 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVN$>xWMzkkruT4kr [H]N%q RGBColor defpal[24]; RGBColor palette[24]; }; static void mac_initfont(struct mac_session *); static void mac_initpalette int i; /* This should obviously be initialised by other means */ s = smalloc(sizeof(*s)); cfg.bksp_is_delete = TRUE; cfg.rxvt_homeend = FALSE; cfg.linux_funkeys = FALSE; cfg.app_cursor = FALSE; cfg.app_keypad = FALSE; cfg.savelines = 100; cfg.dec_om = FALSE; cfg.wrap_mode = cfg.lfhascr = FALSE; cfg.win_name_always = FALSE; cfg.width = 80; cfg.height = 24; strcpy(cfg.font, "Monaco"); cfg.fontisbold = 0; cfg.fontheight = 9; cfg.vtmode = VT_POORMAN; cfg.try_palette = FALSE; cfg.bold_colour = TRUE; for (i = 0; i < 22; i++) { static char defaults[22][3] = { {187, 187, 187}, {255, 255, 255}, {0, 0, 0}, {85, 85, 85}, {0, 0, 0}, {0, 255, 0}, {0, 0, 0}, {85, 85, 85}, {187, 0, 0}, {255, 85, 85}, {0, 187, 0}, {85, 255, 85}, {187, 187, 0}, {255, 255, 85}, {0, 0, 187}, {85, 85, 255}, {187, 0, 187}, {255, 85, 255}, {0, 187, 187}, {85, 255, 255}, {187, 187, 187}, {255, 255, 255} }; cfg.colours[i][0] = defaults[i][0]; cfg.colours[i][1] = defaults[i][1]; cfg.colours[i][2] = defaults[i][2]; }mac_initpalette\033[1mBold\033[m \033[2mfaint\033[m \033[3mitalic\033[m \033[4mu_line\033[m " "\033[5mslow bl\033[m \033[6mfast bl\033[m \033[7minverse\033[m \033[8mconceal\033[m " "\033[9mstruck\033[m \033[21mdbl ul\033[m\015\012"); term_out(); inbuf_putstr("\033[30mblack \033[31mred \033[32mgreen \033[33myellow " "\033[34mblue \033[35mmagenta \033[36mcyan \033[37mwhite\015\012"); term_out(); inbuf_putstr("\033[1m\033[30mblack \033[31mred \033[32mgreen \033[33myellow " "\033[1m\033[34mblue \033[35mmagenta \033[36mcyan \033[37mwhite\015\012"); term_out(); inbuf_putstr("\033[37;44mwhite on blue \033[32;41mgreen on red\015\012"); term_out(); } /* * Set up the default palette, then call palette_reset to transfer * it to the working palette (should the emulator do this at * startup? */ static void mac_initpalette(struct mac_session *s) { int i; static const int ww[] = { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, 1, 2, 3, 4, 4, 5, 5 }; for (i=0; i<24; i++) { int w = ww[i]; s->defpal[i].red = cfg.colours[w][0] * 0x0101; s->defpal[i].green = cfg.colours[w][1] * 0x0101; s->defpal[i].blue = cfg.colours[w][2] * 0x0101; } palette_reset(); } int bgcolour, fgcolour; RGBColor rgbfore, rgbbackif (attr & ATTR_REVERSE) { bgcolour = ((attr & ATTR_FGMASK) >> ATTR_FGSHIFT) * 2; fgcolour = ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT) * 2; } else { fgcolour = ((attr & ATTR_FGMASK) >> ATTR_FGSHIFT) * 2; bgcolour = ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT) * 2; } if ((attr & ATTR_BOLD) && cfg.bold_colour) fgcolour++; RGBForeColor(&s->palette[fgcolour]); RGBBackColor(&s->palette[bgcolour]) int i; struct mac_session *s = onlysession; for (i = 0; i < 24; i++) { s->palette[i].red = s->defpal[i].red; s->palette[i].green = s->defpal[i].green; s->palette[i].blue = s->defpal[i].blue; } term_invalidate(); } Revision-number: 59 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 1999-02-21T23:49:04.000000Z K 7 svn:log V 89 Slight optimisation of do_text so we don't do anything if the entire string's invisible. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 0335560519f9484ed419fdba31a38466 Text-delta-base-sha1: cd412d7a1ae6b2407f3c1fe99b852800107bce7e Text-content-length: 687 Text-content-md5: 6cfac574ba9f1069f21146e1c611cbb5 Text-content-sha1: 0aa93f3cfc29856bff92a9214b423d0b56ddde28 Content-length: 730 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVN$# x RgnHandle textregion, intersection; Rect textrect; SetPort(s->window); #if 0 /* First check this text is relevant */ textregion = NewRgn(); SetRectRgn(textregion, x * font_width, (x + len) * font_width, y * font_height, (y + 1) * font_height); SectRgn(textregion, s->window->visRgn, textregion); if (EmptyRgn(textregion)) { DisposeRgn(textregion); return; } #else /* alternatively */ textrect.top = y * font_height; textrect.bottom = (y + 1) * font_height; textrect.left = x * font_width; textrect.right = (x + len) * font_width; if (!RectInRgn(&textrect, s->window->visRgn)) return; #endif Revision-number: 60 Prop-content-length: 242 Content-length: 242 K 8 svn:date V 27 1999-02-24T01:29:10.000000Z K 7 svn:log V 143 Now uses the Palette Manager for everything. Unfortunately this seems to have killed colour entirely. It was working earlier today. Really! K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 1ce0efeb8fb6ae827ec47bb31fceaccb Text-delta-base-sha1: 70978389a88421cd8bad1e88b5c0d2b262fe4201 Text-content-length: 192 Text-content-md5: 461d00da38a809571fee505c7236df3a Text-content-sha1: 7b9c223f635498fc856ce224bc87077b803d7e2b Content-length: 235 K 15 cvs2svn:cvs-rev V 7 1.1.2.7 PROPS-END SVN.6j+,S.tTZ/* $Id: mac.c,v 1.1.2.7 1999/02/24 01:29:10 case wLicence: /* Do something */ if (GetWVariant(window) == zoomDocProc) return wTerminal; Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: a70228142abd95df0e225217d0d87a7e Text-delta-base-sha1: 9ac21ecad38a25b7e0259d23625efd03d9ef2492 Text-content-length: 1964 Text-content-md5: 96a16a249f0b377882a1df072dac9fb3 Text-content-sha1: e6f377d79b9715b714f8d79f069596bd5ba6e25e Content-length: 2007 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVN96j[/Q;g(x)R>PT{;oD/* $Id: mac_res.r,v 1.1.2.3 1999/02/24 01:29:10#include "Palett355 0000 4505 0000 5A05 0000 2405" $"0000 4A85 0001 9005 0002 23F9 0004 7C01" $"0018 0201 7FA0 0C7D 801F 1001 9FE2 2001" $"A00C DFFE AA89 2002 A012 3FFE A82C 0000" $"A052 0000 AA6PREF_pltt_IDresource 'pltt' (wTerminal, "terminal", purgeable) { { 0x0000, 0x0000, 0x0000, pmTolerant, 0x2000, /* black */ 0x5555, 0x5555, 0x5555, pmTolerant, 0x2000, /* bright black */ 0xbbbb, 0x0000, 0x0000, pmTolerant, 0x2000, /* red */ 0xffff, 0x5555, 0x5555, pmTolerant, 0x2000, /* bright red */ 0x0000, 0xbbbb, 0x0000, pmTolerant, 0x2000, /* green */ 0x5555, 0xffff, 0x5555, pmTolerant, 0x2000, /* bright green */ 0xbbbb, 0xbbbb, 0x0000, pmTolerant, 0x2000, /* yellow */ 0xffff, 0xffff, 0x0000, pmTolerant, 0x2000, /* bright yellow */ 0x0000, 0x0000, 0xbbbb, pmTolerant, 0x2000, /* blue */ 0x5555, 0x5555, 0xffff, pmTolerant, 0x2000, /* bright blue */ 0xbbbb, 0x0000, 0xbbbb, pmTolerant, 0x2000, /* magenta */ 0xffff, 0x5555, 0xffff, pmTolerant, 0x2000, /* bright magenta */ 0x0000, 0xbbbb, 0xbbbb, pmTolerant, 0x2000, /* cyan */ 0x5555, 0xffff, 0xffff, pmTolerant, 0x2000, /* bright cyan */ 0xbbbb, 0xbbbb, 0xbbbb, pmTolerant, 0x2000, /* white */ 0xffff, 0xffff, 0xffff, pmTolerant, 0x2000, /* bright white */ 0xbbbb, 0xbbbb, 0xbbbb, pmTolerant, 0x2000, /* default fg */ 0xffff, 0xffff, 0xffff, pmTolerant, 0x2000, /* default bold fg */ 0x0000, 0x0000, 0x0000, pmTolerant, 0x2000, /* default bg */ 0x5555, 0x5555, 0x5555, pmTolerant, 0x2000, /* default bold bg */ 0x0000, 0x0000, 0x0000, pmTolerant, 0x2000, /* cursor bg */ 0x0000, 0x0000, 0x0000, pmTolerant, 0x2000, /* bold cursor bg */ 0x0000, 0xffff, 0x0000, pmTolerant, 0x2000, /* cursor fg */ 0x0000, 0xffff, 0x0000, pmTolerant, 0x2000, /* bold cursor fg */ }3, 107, 17ental Mac Port\n 1997-9 Simon Tatham"}, } }; /* Licence box */ resource 'WIND Node-path: putty-ben-mac-port/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 545ff3006e10e2b997f11f9b1c35fdf2 Text-delta-base-sha1: 530b451cb61f172195c2ca7083b24a39858fcf22 Text-content-length: 262 Text-content-md5: be7f37402c09e552f21126fb99665d2e Text-content-sha1: 998a20332eacb3fcf3489a722599a9c4d5135443 Content-length: 305 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVNr+0B/* $Id: macresid.h,v 1.1.2.3 1999/02/24 01:29:101 /* Dummy value for desk accessory */ #define wFatal 128 #define wAbout 129 #define wiAboutLicence 1 #define wTerminal 130 #define wLicence 131 /* Preferences */ #define PREF_pltt_ID 1024 Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 6cfac574ba9f1069f21146e1c611cbb5 Text-delta-base-sha1: 0aa93f3cfc29856bff92a9214b423d0b56ddde28 Text-content-length: 2182 Text-content-md5: 3adabfdafe0175ab230d7757392cb161 Text-content-sha1: b85d4f8465185b9699332d9bfbe432c58bf259ba Content-length: 2225 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVN#=b9Rg&;L MJh 1+RTa'A1*=wwmU{sPalette fontnum; int font_ascent; WindowPtr window; PaletteHandle palettecfg.colours = GetNewPalette(PREF_pltt_ID); onlysession = s; /* XXX:/* Set to TRUE to get palette updates in the background. */ SetPalette(s->window, s->palette, FALSE); ShowWindow(s->window} static void mac_initpalette(struct mac_session *s) { s->palette = NewPalette(0, NULL, 0, 0); CopyPalette(cfg.colours, s->palette, 0, 0, (*cfg.colours)->pmEntries); }ect textrect; SetPort(s->window); /* First check this text is relevant /* RGBForeColor(&s->palette[fgcolour]); */ /* XXX Non-Color-QD version */ /* RGBBackColor(&s->palette[bgcolour]); */ PmForeColor(fgcolour); PmBackColor(bgcolour); SetFractEnable(FALSE); /* We want characters on pixel boundaries */ MoveTo(textrect.left, textrect.top + s->font_ascent); DrawText(text, 0, len); /* Tell the window manager about it in case this isn't an update */ ValidRect(&textrect /* * XXX We should indicate the relevant window and/or use the * Notification Manager */ } /* * Set icon string -- a no-op here (Wi struct mac_session *s = onlysession; mactitle[0] = sprintf((char *)&mactitle[1], "%s", title); SetWTitle(scols = w; rows = h; mac_initfont(onlysession); RGBColor col; struct mac_session *s = onlysession; static const int first[21] = { 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15, 16, 17, 18, 20, 22 }; col.red = r * 0x0101; col.green = g * 0x0101; col.blue = b * 0x0101; SetEntryColor(s->palette, first[n], &col); if (first[n] >= 18) SetEntryColor(s->palette, first[n]+1, &col); ActivatePalette(s->window); } /* * Reset to the default palette */ void palette_reset(void) { struct mac_session *s = onlysession; if (mac_qdversion == gestaltOriginalQD) return; CopyPalette(cfg.colours, s->palette, 0, 0, (*cfg.colours)->pmEntries); ActivatePalette(s->window); /* Palette Manager will generate update events as required. */ } Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 4c35cac5e88577138d19ea5d07be5aee Text-delta-base-sha1: 4c1eae32cdf069e5bd642988794992e1d8967ef9 Text-content-length: 176 Text-content-md5: 4018e2e8ebe08a3f4f8fed7fff34a39a Text-content-sha1: c07bde7b56a8f823952f4e4b27f6732f8cc643af Content-length: 219 K 15 cvs2svn:cvs-rev V 7 1.4.2.4 PROPS-END SVN  ] #include window);if (mac_qdversion == gestaltOriginalQD) return; s->palette = NewPalette((*cfg.colours)->pmEntries, NULL, pmCourteous, 0); if (s->palette == NULL) fatalbox("Unable to create palette" Revision-number: 62 Prop-content-length: 353 Content-length: 353 K 8 svn:date V 27 1999-02-28T02:38:41.000000Z K 7 svn:log V 254 Right, we now have: * The ability to load the configuration from the current resource file (ie the application for now). * A scroll bar and size box that look right, even if they don't actually _do_ anything yet. * A load of other minor tweaks. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/PuTTY.make Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: a34832e6060ccb3eb1187b02fc2b095d Text-delta-base-sha1: a8e07aa68339414fde323bcd86ab5da1462dd11c Text-content-length: 150 Text-content-md5: bbab44cc4a007d6f7d602e422c52bc4e Text-content-sha1: 65aa45a77318fa45733d304a19ba5d3911cca9e4 Content-length: 193 K 15 cvs2svn:cvs-rev V 7 1.1.2.7 PROPS-END SVNLYy/^&Gq[# $Id: PuTTY.make,v 1.1.2.7 1999/02/28 02:38:40cfgcfg.c.o" {MondoBuild} maccfg.c putty.h mac.h macresid.h {C} maccfg Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 461d00da38a809571fee505c7236df3a Text-delta-base-sha1: 7b9c223f635498fc856ce224bc87077b803d7e2b Text-content-length: 750 Text-content-md5: 42d00990d3514e907e18e504c9876378 Text-content-sha1: 6e6eb86531d27b33fbc34ab7a4dc2013fc9da524 Content-length: 793 K 15 cvs2svn:cvs-rev V 7 1.1.2.8 PROPS-END SVN6{4.R*Wn8<NaQ)[iNw?/* $Id: mac.c,v 1.1.2.8 1999/02/28 02:38:4Appearancelong mac_appractivatewindow(WindowPtr, Boolean/* ... and the Appearance Manager? */ if (Gestalt(gestaltAppearanceVersion, &mac_apprversion) != noErr) if (Gestalt(gestaltAppearanceAttr, NULL) == noErr) mac_apprversion = 0x0100; else mac_apprversion = 0; /* We've been tested with the Appearance Manager */ if (mac_apprversion != 0) RegisterAppearanceClient() mac_activatewindow((WindowPtr)event->message, (event->modifiers & activeFlag) != 0);activatewindow(WindowPtr window, Boolean active) { switch (mac_windowtype(window)) { case wTerminal: mac_activateterm(window, active);mac_updateterm Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 035b80757c65074279da4be728a869da Text-delta-base-sha1: 82aa8e25b4c60158b12f226938073b893a67f5c3 Text-content-length: 284 Text-content-md5: ca5d114ec925de2fec4cd85338778a51 Text-content-sha1: 0c6405333a3b87fc256f99e772efe3ad952ebe6c Content-length: 327 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVN$i _ #include #include extern long mac_qdversion; /* from macterm.c */ extern void mac_newsession(void); extern void mac_activateterm(WindowPtr, Boolean); extern void mac_updateterm(WindowPtr); extern void mac_loadconfig(Config *); #endif Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: e369a157c42c90f9c6b186721d82c644 Text-delta-base-sha1: 5d74e2a5ec11723c17fbc4bfaa84cbb54cf5627e Text-content-length: 10053 Text-content-md5: 2aa8691d295cee1bffcc3fb078bf305e Text-content-sha1: d946d57d7904c1f611b713ab4b70e848203f617c Content-length: 10096 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVNv?ywM3<rOoa{[q.dxe/* $Id: mac_res.r,v 1.1.2.5 1999/02/28 02:38:40 ben Exp $ */ /* PuTTY resources */ #include "Types.r" #include "Dialog'pTTY' is now registered with Apple as PuTTY's signature version. " "Copyright Simon Tatham 1997-93FFE 00004001 00004FF9 00005005" $"00005355 00004505 00005A05 00002405" $"00004A85 00019005 000223F9 00047C01" $"00180201 7FA00C7D 801F1001 9FE22001" $"A00CDFFE AA892002 A0123FFE A82C0000" $"A0520000 AA6A0000 A00A0000 9FF20000" $"80020000 80020000 80FA0000 80020000" $"80020000 7FFC0000 40040000 7FFC", /* [2] */ $"00003FFE 00007FFF 0000 7FFF 00007FFF" $"00007FFF 00007FFF 0000 7FFF 00007FFF" $"00007FFF 00007FFF 0000 7FFF 00007FFF" $"00007FFF 7FFC7FFF FFFE 7FFF FFFE7FFF" $"FFFE3FFE FFFE3FFE FFFE 3FFE FFFE0000" $"FFFE0000 FFFE0000 FFFE 0000 FFFE0000" $"FFFE0000 FFFE0000 FFFE 0000 FFFE0000" $"FFFE0000 7FFCFC00 10000600 10000500 1FFFFC80" $"10000440 10000420 1FFFFFF0 10000010" $"13FC0F90 1C03F0F0 15FA8090 150A8090" $"1D0B80F0 150A8050 15FA8050 1C038070" $"143A8050 14028050 1FFFABF0 12048110" $"13FCFF10 1AAAAAB0 10000010 17FFFFD0" $"14000050 15252250 15555550 15252250" $"14000050 17FFFFD0 10000010 1FFFFFF0", /* [2] */ $"1FFFFC00 1FFFFE00 1FFFFF00 1FFFFF80" $"1FFFFFC0 1FFFFFE0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" } }; resource 'icl4' (130, purgeable) { $"000FFFFFFFFFFFFFFFFFFF0000000000" $"000F00000000000000000FF000000000" $"000F00000000000000000FCF00000000" $"000FFFFFFFFFFFFFFFFFFFCCF0000000" $"000F00000000000000000FCCCF000000" $"000F00000000000000000FCCCCF00000" $"000FFFFFFFFFFFFFFFFFFFFFFFFF0000" $"000F00000000000000000000000F0000" $"000F00FFFFFFFF000000FFFFF00F0000" $"000FFFCCCCCCCCFFFFFFCCCCFFFF0000" $"000F0FCEEEEECCF0FCCCCCCCF00F0000" $"000F0FCE0D0D0CF0FCCCCCCCF00F0000" $"000FFFCED0D0CCFFFCCCCCCCFFFF0000" $"000F0FCE0D0D0CF0FCCCCCCCCF0F0000" $"000F0FCCC0C0CCF0FCCCCCCCCF0F0000" $"000FFFCCCCCCCCFFFCCCCCCCCFFF0000" $"000F0FCCCCFFFCF0FCCCCCCCCF0F0000" $"000F0FCCCCCCCCF0FCCCCCCCCF0F0000" $"000FFFFFFFFFFFFFFDDDDDDFFFFF0000" $"000F00FCCDDEEF00FDDDDDDF000F0000" $"000F00FFFFFFFF00FFFFFFFF000F0000" $"000F0C0C0C0C0C0C0C0C0C0C0C0F0000" $"000FC0C0C0C0C0C0C0C0C0C0C0CF0000" $"000F0FFFFFFFFFFFFFFFFFFFFF0F0000" $"000FCF0000000000000000000FCF0000" $"000F0F0F00F00F0F00F000F00F0F0000" $"000FCF0F0F0F0F0F0F0F0F0F0FCF0000" $"000F0F0F00F00F0F00F000F00F0F0000" $"000FCF0000000000000000000FCF0000" $"000F0FFFFFFFFFFFFFFFFFFFFF0F0000" $"000FC0C0C0C0C0C0C0C0C0C0C0CF0000" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" }; resource 'icl8' (130, purgeable) { $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000" $"000000FF0000000000000000000000000000000000FFFF000000000000000000" $"000000FF0000000000000000000000000000000000FFF6FF0000000000000000" $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6FF00000000000000" $"000000FF0000000000000000000000000000000000FFF6F6F6FF000000000000" $"000000FF0000000000000000000000000000000000FFF6F6F6F6FF0000000000" $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000" $"000000FF0000000000000000000000000000000000000000000000FF00000000" $"000000FF0000FFFFFFFFFFFFFFFF000000000000FFFFFFFFFF0000FF00000000" $"000000FFFFFF2B2B2B2B2B2B2B2BFFFFFFFFFFFF2B2B2B2BFFFFFFFF00000000" $"000000FF00FF2BFCFCFCFCFCF82BFF00FF2B2B2B2B2B2B2BFF0000FF00000000" $"000000FF00FF2BFC2A2A2A2A002BFF00FF2B2B2B2B2B2B2BFF0000FF00000000" $"000000FFFFFF2BFC2A2A2A2A002BFFFFFF2B2B2B2B2B2B2BFFFFFFFF00000000" $"000000FF00FF2BFC2A2A2A2A002BFF00FF2B2B2B2B2B2B2B2BFF00FF00000000" $"000000FF00FF2BF800000000002BFF00FF2B2B2B2B2B2B2B2BFF00FF00000000" $"000000FFFFFF2B2B2B2B2B2B2B2BFFFFFF2B2B2B2B2B2B2B2BFFFFFF00000000" $"000000FF00FF2B2B2B2BFFFFFF2BFF00FF2B2B2B2B2B2B2B2BFF00FF00000000" $"000000FF00FF2B2B2B2B2B2B2B2BFF00FF2B2B2B2B2B2B2B2BFF00FF00000000" $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F9F9F9FFFFFFFFFF00000000" $"000000FF0000FFF7F8F9FAFBFCFF0000FFF9F9F9F9F9F9FF000000FF00000000" $"000000FF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000000FF00000000" $"000000FFF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FF00000000" $"000000FFF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FF00000000" $"000000FFF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FF00000000" $"000000FFF5FF00000000000000000000000000000000000000FFF5FF00000000" $"000000FFF5FF00FF0000FF0000FF00FF0000FF000000FF0000FFF5FF00000000" $"000000FFF5FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FFF5FF00000000" $"000000FFF5FF00FF0000FF0000FF00FF0000FF000000FF0000FFF5FF00000000" $"000000FFF5FF00000000000000000000000000000000000000FFF5FF00000000" $"000000FFF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FF00000000" $"000000FFF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FF00000000" $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCNTL' (cVScroll, "vscroll", purgeable) { { 0, 0, 48, 16 }, 0, invisible, 0, 0, scrollBarProc, 0, ""dlgx' (wAbout, "about", purgeable) { versionZero { kDialogFlagsUseThemeBackground | kDialogFlagsUseThemeControls } "Experimental Mac Port\n" " /* Default Preferences */ type PREF_wordness_type { wide array [256] { integer; }; }; /* * This resource collects together the various short settings we need. * Each area of the system gets its own longword for flags, and then * we have the other settings. Strings are stored as two shorts -- * the id of a STR# or STR resource, and the index if it's a STR# (0 * for STR). */ type 'pSET' { /* Basic boolean options */ boolean dont_close_on_exit, close_on_exit; align long; /* SSH options */ boolean use_pty, no_pty; align long; /* Telnet options */ boolean bsd_environ, rfc_environ; align long; /* Keyboard options */ boolean backspace, delete; boolean std_home_end, rxvt_home_end; boolean std_funkeys, linux_funkeys; boolean normal_cursor, app_cursor; boolean normal_keypad, app_keypad; align long; /* Terminal options */ boolean no_dec_om, dec_om; boolean no_auto_wrap, auto_wrap; boolean no_auto_cr, auto_cr; boolean use_icon_name, win_name_always; align long; /* Colour options */ boolean bold_font, bold_colour; align long; /* Non-boolean options */ integer; integer; /* host */ longint; /* port */ longint prot_telnet = 0, prot_ssh = 1; /* protocol */ integer; integer; /* termtype */ integer; integer; /* termspeed */ integer; integer; /* environmt */ integer; integer; /* username */ longint; /* width */ longint; /* height */ longint; /* save_lines */ integer; unsigned integer; /* font */ longint; /* font_height */ integer; /* 'pltt' for colours */ integer; /* 'wORD' for wordness */ }; resource 'pSET' (PREF_settings, "settings", purgeable) { close_on_exit, use_pty, rfc_environ, delete, std_home_end, std_funkeys, normal_cursor, normal_keypad, no_dec_om, auto_wrap, no_auto_cr, use_icon_name, bold_colour, #define PREF_strings 1024 PREF_strings, 1, /* host 'STR#' */ 23, prot_telnet, /* port, protocol */ PREF_strings, 2, /* termtype 'STR#' */ PREF_strings, 3, /* termspeed 'STR#' */ PREF_strings, 4, /* environmt 'STR#' */ PREF_strings, 5, /* username */ 80, 24, 200, /* width, height, save_lines */ PREF_strings, 6, /* font 'STR#' */ 9, /* font_height */ #define PREF_pltt 1024 PREF_pltt, /* colours 'pltt' */ #define PREF_wordness 1024 PREF_wordness, /* wordness 'wORD */ }; resource 'STR#' (PREF_strings, "strings", purgeable) { { "nowhere.loopback.edu", "xterm", "38400,38400", "\000", "", "Monaco", } }; resource PREF_wordness_type (PREF_wordness, "wordness", purgeable) { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1, 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2, 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2 } }; /* * and _why_ isn't this provided for us? */ type 'TMPL' { array { pstring; /* Item name */ literal longint; /* Item type */ }; }; resource 'TMPL' (128, "pSET") { { "Close on exit", 'BBIT', "", 'BBIT', /* Must pad to a multiple of 8 */ "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'ALNG', "No PTY", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'ALNG', "RFC OLD-ENVIRON", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'ALNG', "Delete key sends delete", 'BBIT', "rxvt home/end", 'BBIT', "Linux function keys", 'BBIT', "Application cursor keys", 'BBIT', "Application keypad", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'ALNG', "Use colour for bold", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'BBIT', "", 'ALNG', "Host STR# ID", 'DWRD', "Host STR# index", 'DWRD', "Port", 'DLNG', "Protocol", 'DLNG', "Termspeed STR# ID", 'DWRD', "Termspeed STR# index", 'DWRD', "Environ STR# ID", 'DWRD', "Environ STR# index", 'DWRD', "Username STR# ID", 'DWRD', "Username STR# index", 'DWRD', "Terminal width", 'DLNG', "Terminal height", 'DLNG', "Save lines", 'DLNG', "Font STR# ID", 'DWRD', "Font STR# index", 'DWRD', "Font size", 'DLNG', "pltt ID", 'DWRD', "wORD ID", 'DWRD', }; }; resource 'pltt' (PREF_pltt Node-path: putty-ben-mac-port/maccfg.c Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 3846 Text-content-md5: e5f6762df1296c82d74601005866880e Text-content-sha1: 37f7034097b5359b247b7d9eb415c535b7008d5a Content-length: 3966 K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNxxx/* $Id: maccfg.c,v 1.1.2.1 1999/02/28 02:38:40 ben Exp $ */ /* * maccfg.c -- Mac port configuration */ #include #include #include #include "putty.h" #include "mac.h" #include "macresid.h" struct strloc { short id, idx; }; static void get_string(struct strloc *l, char *d, size_t maxlen) { Str255 s; int i, len; GetIndString(s, l->id, l->idx); len = s[0]; /* maxlen includes a terminator */ if (len > maxlen - 1) len = maxlen - 1; for (i = 0; i < len; i++) d[i] = s[i + 1]; d[i] = '\0'; } static void get_wordness(short id, short *dst) { Handle h; h = GetResource(PREF_wordness_type, id); if (h == NULL || *h == NULL) fatalbox ("Couldn't get wordness (%d)", ResError()); memcpy(dst, *h, 256 * sizeof(short)); } struct pSET { unsigned long basic_flags; #define CLOSE_ON_EXIT 0x80000000 unsigned long ssh_flags; #define NO_PTY 0x80000000 unsigned long telnet_flags; #define RFC_ENVIRON 0x80000000 unsigned long kbd_flags; #define BKSP_IS_DELETE 0x80000000 #define RXVT_HOMEEND 0x40000000 #define LINUX_FUNKEYS 0x20000000 #define APP_CURSOR 0x10000000 #define APP_KEYPAD 0x08000000 unsigned long term_flags; #define DEC_OM 0x80000000 #define WRAP_MODE 0x40000000 #define LFHASCR 0x20000000 #define WIN_NAME_ALWAYS 0x10000000 unsigned long colour_flags; #define BOLD_COLOUR 0x80000000 struct strloc host; long port; long protocol; struct strloc termtype, termspeed; struct strloc environmt; struct strloc username; long width, height, savelines; struct strloc font; long font_height; short colours_id; short wordness_id; }; /* * Load a configuration from the current chain of resource files. */ void mac_loadconfig(Config *cfg) { Handle h; struct pSET *s; h = GetResource('pSET', PREF_settings); if (h == NULL) fatalbox("Can't load settings"); SetResAttrs(h, GetResAttrs(h) | resLocked); s = (struct pSET *)*h; /* Basic */ get_string(&s->host, cfg->host, sizeof(cfg->host)); cfg->port = s->port; cfg->protocol = s->protocol; cfg->close_on_exit = (s->basic_flags & CLOSE_ON_EXIT) != 0; /* SSH */ cfg->nopty = (s->ssh_flags & NO_PTY) != 0; /* Telnet */ get_string(&s->termtype, cfg->termtype, sizeof(cfg->termtype)); get_string(&s->termspeed, cfg->termspeed, sizeof(cfg->termspeed)); get_string(&s->environmt, cfg->environmt, sizeof(cfg->environmt)); get_string(&s->username, cfg->username, sizeof(cfg->username)); cfg->rfc_environ = (s->telnet_flags & RFC_ENVIRON) != 0; /* Keyboard */ cfg->bksp_is_delete = (s->kbd_flags & BKSP_IS_DELETE) != 0; cfg->rxvt_homeend = (s->kbd_flags & RXVT_HOMEEND) != 0; cfg->linux_funkeys = (s->kbd_flags & LINUX_FUNKEYS) != 0; cfg->app_cursor = (s->kbd_flags & APP_CURSOR) != 0; cfg->app_keypad = (s->kbd_flags & APP_KEYPAD) != 0; /* Terminal */ cfg->savelines = s->savelines; cfg->dec_om = (s->term_flags & DEC_OM) != 0; cfg->wrap_mode = (s->term_flags & WRAP_MODE) != 0; cfg->lfhascr = (s->term_flags & LFHASCR) != 0; cfg->win_name_always = (s->term_flags & WIN_NAME_ALWAYS) != 0; cfg->width = s->width; cfg->height = s->height; get_string(&s->font, cfg->font, sizeof(cfg->font)); cfg->fontisbold = FALSE; /* XXX */ cfg->fontheight = s->font_height; cfg->vtmode = VT_POORMAN; /* XXX */ /* Colour */ cfg->try_palette = FALSE; /* XXX */ cfg->bold_colour = (s->colour_flags & BOLD_COLOUR) != 0; cfg->colours = GetNewPalette(s->colours_id); if (cfg->colours == NULL) fatalbox("Failed to get default palette"); /* Selection */ get_wordness(s->wordness_id, cfg->wordness); SetResAttrs(h, GetResAttrs(h) & ~resLocked); ReleaseResource(h); } Node-path: putty-ben-mac-port/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: be7f37402c09e552f21126fb99665d2e Text-delta-base-sha1: 998a20332eacb3fcf3489a722599a9c4d5135443 Text-content-length: 184 Text-content-md5: dc4cd46e57fffe63f7424368f2c4a3d8 Text-content-sha1: f23f389bcab9166b1a5809d1ec871eda187bc017 Content-length: 227 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVNf%A/v/* $Id: macresid.h,v 1.1.2.4 1999/02/28 02:38:4/* Controls */ #define cVScroll 128 /* Preferences */ #define PREF_wordness_type 'wORD' #define PREF_settings 1024 Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 02e6aecf0c63972804dc9cb9d8329fb4 Text-delta-base-sha1: 6b5f168c99ac0d290040f0f5e11513c7161865c4 Text-content-length: 2343 Text-content-md5: 02fe55085ee0787f2052318ba94f6976 Text-content-sha1: 8c01a73dbbed17806eb99b3b9e92428c6a67cc1a Content-length: 2386 K 15 cvs2svn:cvs-rev V 7 1.1.2.7 PROPS-END SVNDz1jqCfi'Ww?eM~.O=limits.h> ControlHandle scrollbarstatic void mac_adjustsizmac_loadconfig(&cfg); s = smalloc(sizeof(*s)s->scrollbar = GetNewControl(cVScroll, s->windowmac_adjustsize(s); } /* * To be called whenever the window size changes. * rows and cols should be desired values. * It's assumed the terminal emulator will be or has been informed. */ static void mac_adjustsize(struct mac_session *s) { int winwidth, winheight; winwidth = cols * font_width + 15; winheight = rows * font_height; SizeWindow(s->window, winwidth, winheight, true); HideControl(s->scrollbar); MoveControl(s->scrollbar, winwidth - 15, -1); SizeControl(s->scrollbar, 16, winheight - 13); ShowControl(s->scrollbar); } static void mac_initpalette(struct mac_session *s) { WinCTab ct; I don't think this is (a) safe or (b) a good way to do this. */ static void mac_updatewinbg(struct mac_session *s) { WinCTab ct; WCTabPtr ctp = &ct; WCTabHandle cth = &ctp; ct.wCSeed = 0; ct.wCReserved = 0; ct.ctSize = 1; ct.ctTable[0].value = wContentColor; ct.ctTable[0].rgb = (*s->palette)->pmInfo[16].ciRGB; SetWinColor(s->window, cth); } void mac_activateterm(WindowPtr window, Boolean active) { struct mac_session *s; s = (struct mac_session *)GetWRefCon(window); if (active) ShowControl(s->scrollbar); else HideControl(s->scrollbar); } void mac_updateterm(WindowPtr window) { struct mac_session *s; Rect clip; s = (struct mac_session *)GetWRefCon(window); BeginUpdate(window); term_paint(s, (*window->visRgn)->rgnBBox.left, (*window->visRgn)->rgnBBox.top, (*window->visRgn)->rgnBBox.right, (*window->visRgn)->rgnBBox.bottom); /* Restore default colours in case the Window Manager uses them */ PmForeColor(16); PmBackColor(18); if (FrontWindow() != window) EraseRect(&(*s->scrollbar)->contrlRect); UpdateControls(window, window->visRgn); /* Stop DrawGrowIcon giving us space for a horizontal scrollbar */ clip.left = window->portRect.right - 15; clip.right = SHRT_MAX; clip.top = SHRT_MIN; clip.bottom = SHRT_MAX; ClipRect(&clip); DrawGrowIcon(window); clip.left = SHRT_MIN; ClipRect(&clip); EndUpdate(window Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 4018e2e8ebe08a3f4f8fed7fff34a39a Text-delta-base-sha1: c07bde7b56a8f823952f4e4b27f6732f8cc643af Text-content-length: 69 Text-content-md5: a51b32cc7471a7a78a4498a91ae14d49 Text-content-sha1: 0f3a1408cea471d9fee94363acb27d07c09c90ba Content-length: 112 K 15 cvs2svn:cvs-rev V 7 1.4.2.5 PROPS-END SVN 0V-#ifndef macintosh int mouse_is_xterm; #endif Revision-number: 63 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 1999-02-28T17:05:11.000000Z K 7 svn:log V 200 Erm, major change at the moment is a new test case. You need a file called 'fragment' to build it, but its licence prevents me distributing it at present. Now, about those scrolling optimisations... K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 42d00990d3514e907e18e504c9876378 Text-delta-base-sha1: 6e6eb86531d27b33fbc34ab7a4dc2013fc9da524 Text-content-length: 568 Text-content-md5: 67cb910d096dd6cab2113f5db1f44443 Text-content-sha1: dfb2ea815d10a32302a21fc3cb1aab19a1544cb1 Content-length: 611 K 15 cvs2svn:cvs-rev V 7 1.1.2.9 PROPS-END SVN{<*_qow;@/* $Id: mac.c,v 1.1.2.9 1999/02/28 17:05:1struct mac_gestalts mac_gestaltsgestalts.qdvers) != noErr) mac_gestalts.qdversgestalts.apprvers) != noErr) if (Gestalt(gestaltAppearanceAttr, NULL) == noErr) mac_gestalts.apprvers = 0x0100; else mac_gestalts.apprvers = 0; /* Mac OS 8.5 Control Manager (proportional scrollbars)? */ if (Gestalt(gestaltControlMgrAttr, &mac_gestalts.cntlattr) != noErr) mac_gestalts.cntlattr = 0; /* We've been tested with the Appearance Manager */ if (mac_gestalts.apprvers Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: ca5d114ec925de2fec4cd85338778a51 Text-delta-base-sha1: 0c6405333a3b87fc256f99e772efe3ad952ebe6c Text-content-length: 142 Text-content-md5: 5e257c911f859ad429feb9864f06f4a8 Text-content-sha1: a8f70b9cdb9f5da833eb1b621c1efad3a0b827e3 Content-length: 185 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVNid x*xB'struct mac_gestalts { long qdvers; long apprvers; long cntlattr; }; extern struct mac_gestalts mac_gestalts Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 2aa8691d295cee1bffcc3fb078bf305e Text-delta-base-sha1: d946d57d7904c1f611b713ab4b70e848203f617c Text-content-length: 1268 Text-content-md5: 4b6a0a4eedb413d037fb1c441242261a Text-content-sha1: fa8dc8305fd31c153ef41517a1529327e589a3dc Content-length: 1311 K 15 cvs2svn:cvs-rev V 7 1.1.2.6 PROPS-END SVNv ]':scrollbar, 0); SetControlMaximum(s->scrollbar, total - page); SetControlValue(s->scrollbar, start); #if 0 /* XXX: This doesn't compile for me - bjh */ if (mac_gestalts.cntlattr & gestaltControlMgrPresent) SetControlViewSize(s->scrollbar, page); #endifgestalts.qdvers Revision-number: 64 Prop-content-length: 351 Content-length: 351 K 8 svn:date V 27 1999-03-01T22:26:50.000000Z K 7 svn:log V 252 Right, so that's a hook for scroll optimisations (when Simon gets round to them) and a vaguely-working scrollbar. Next stop: faster and more sensible redraw in 1-bit modes at least. Waiting five minutes for the test case to scroll past is _tedious_. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 67cb910d096dd6cab2113f5db1f44443 Text-delta-base-sha1: dfb2ea815d10a32302a21fc3cb1aab19a1544cb1 Text-content-length: 1238 Text-content-md5: 02eb3619e969d7d1ec728241d24176ea Text-content-sha1: d14891a228fd6e1225e3bd7d81a62f340433f538 Content-length: 1282 K 15 cvs2svn:cvs-rev V 8 1.1.2.10 PROPS-END SVN<, = 5lP/* $Id: mac.c,v 1.1.2.10 1999/03/01 22:26:49 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. mac_clickterm(window, event); Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: b255d45a41aca9ea4c7ed815f42ad9cf Text-delta-base-sha1: 0640f3c44fa64b016075cbf3fadb15e9ad16909e Text-content-length: 2180 Text-content-md5: 4dc3ccb07559f448d66b5aaca7e2c20f Text-content-sha1: c0148966eac0ecf9ca0e668bee7bbb429966fa51 Content-length: 2223 K 15 cvs2svn:cvs-rev V 7 1.1.2.9 PROPS-END SVN]0H/@kcI{=wAq-DW/* $Id: macterm.c,v 1.1.2.9 1999/03/01 22:26:50static pascal void mac_scrolltracker(ControlHandle, short); /* * Temporary hack till I get the terminal emulator supporting multiple * sessions cfg.height, cfg.width, cfg.savelinesclickterm(WindowPtr window, EventRecord *event) { struct mac_session *s; Point mouse; ControlHandle control; int part; s = (struct mac_session *)GetWRefCon(window); SetPort(window); mouse = event->where; GlobalToLocal(&mouse); part = FindControl(mouse, window, &control); if (control == s->scrollbar) { switch (part) { case kControlIndicatorPart: if (TrackControl(control, mouse, NULL) == kControlIndicatorPart) term_scroll(+1, GetControlValue(control)); break; case kControlUpButtonPart: case kControlDownButtonPart: case kControlPageUpPart: case kControlPageDownPart: TrackControl(control, mouse, mac_scrolltracker); break; } } } static pascal void mac_scrolltracker(ControlHandle control, short part(*control)->contrlOwner); switch (part) { case kControlUpButtonPart: term_scroll(0, -1); break; case kControlDownButtonPart: term_scroll(0, +1); break; case kControlPageUpPart: term_scroll(0, -(rows - 1)); break; case kControlPageDownPart: term_scroll(0, +(rows - 1)); break; }if (mac_gestalts.qdvers == gestaltOriginalQD) return; /* * Move `lines' lines from position `from' to position `to' in the * window. * Note that this is currently broken if "from" and "to" are more * than "lines" lines apart. */ void optimised_move(int to, int from, int lines) { Rect r; RgnHandle update; struct mac_session *s = onlysession; int min, max, d; SetPort(s->window); min = (to < from ? to : from); max = to + from - min; d = max - min; update = NewRgn(); r.left = 0; r.right = cols * font_width; r.top = min * font_height; r.bottom = (max+lines) * font_height; ScrollRect(&r, 0, (to - from) * font_height, update); InvalRgn(update); /* XXX: necessary? probably harmless anyway */ DisposeRgn(update); } Revision-number: 65 Prop-content-length: 400 Content-length: 400 K 8 svn:date V 27 1999-03-01T23:43:29.000000Z K 7 svn:log V 301 We now use DeviceLoop for redraws, which allows for depth-specific tweaks. The first of these is that in 1-bit modes we ignore colour attributes entirely, which has nice effects on some of Fragments efforts if nothing else. We still seem to be a lot slower than BetterTelnet, which is a bit worrying. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 4dc3ccb07559f448d66b5aaca7e2c20f Text-delta-base-sha1: c0148966eac0ecf9ca0e668bee7bbb429966fa51 Text-content-length: 1907 Text-content-md5: 011fa39e8a74aff2d02d7ae9638e868a Text-content-sha1: 8c5204c73ee159a2459b4049ab055ba8c47652ba Content-length: 1951 K 15 cvs2svn:cvs-rev V 8 1.1.2.10 PROPS-END SVN=)>U/B{*;X}7oT-/* $Id: macterm.c,v 1.1.2.10 1999/03/01 23:43:29static pascal void do_text_for_device(short, short, GDHandle, longstruct do_text_args { struct mac_session *s; Rect textrect; char *text; int len; unsigned long attr; };struct do_text_args a; RgnHandle textrgn; SetPort(s->window); /* First check this text is relevant */ a.textrect.top = y * font_height; a.textrect.bottom = (y + 1) * font_height; a.textrect.left = x * font_width; a.textrect.right = (x + len) * font_width; if (!RectInRgn(&a.textrect, s->window->visRgn)) return; a.s = s; a.text = text; a.len = len; a.attr = attr; SetPort(s->window);if (attr & ATTR_REVERSE) TextMode(notSrcCopy); else TextMode(srcCopy); SetFractEnable(FALSE); /* We want characters on pixel boundaries */ textrgn = NewRgn(); RectRgn(textrgn, &a.textrect); DeviceLoop(textrgn, do_text_for_device, (long)&a, 0); /* Tell the window manager about it in case this isn't an update */ DisposeRgn(textrgn); ValidRect(&a.textrect); } static pascal void do_text_for_device(short depth, short devflags, GDHandle device, long cookie) { struct do_text_args *a; int bgcolour, fgcolour; a = (struct do_text_args *)cookie; switch (depth) { case 1: /* XXX This should be done with a _little_ more configurability */ ForeColor(whiteColor); BackColor(blackColor); break; default: fgcolour = ((a->attr & ATTR_FGMASK) >> ATTR_FGSHIFT) * 2; bgcolour = ((a->attr & ATTR_BGMASK) >> ATTR_BGSHIFT) * 2; if ((a->attr & ATTR_BOLD) && cfg.bold_colour) if (a->attr & ATTR_REVERSE) bgcolour++; else fgcolour++; PmForeColor(fgcolour); PmBackColor(bgcolour); break; } MoveTo(a->textrect.left, a->textrect.top + a->s->font_ascent); DrawText(a->text, 0, a->lenlink Revision-number: 66 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 1999-03-02T14:52:35.000000Z K 7 svn:log V 70 Scroll bar no longer glitches when a new line is added to the window. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 011fa39e8a74aff2d02d7ae9638e868a Text-delta-base-sha1: 8c5204c73ee159a2459b4049ab055ba8c47652ba Text-content-length: 312 Text-content-md5: 385687d585f2f657a9a2520175f7a689 Text-content-sha1: 7b39282b78250d497f16d563fbcc632ef9ecbda0 Content-length: 356 K 15 cvs2svn:cvs-rev V 8 1.1.2.11 PROPS-END SVN={ 0oGv/* $Id: macterm.c,v 1.1.2.11 1999/03/02 14:52:35/* We don't redraw until we've set everything up, to avoid glitches */ (*s->scrollbar)->contrlMin = 0; (*s->scrollbar)->contrlMax = total - page; SetControlValue(s->scrollbar, start); #if 0 /* XXX: This doesn't link for me. Revision-number: 67 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 1999-03-02T21:51:55.000000Z K 7 svn:log V 138 Right, I think we now hove scrolling optimisations. They should probably be conditional on something, but I can't be bothered right now. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-early-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 441aaa0a6d9976fe257d5414593bdd52 Text-delta-base-sha1: a3d2529f8acc236d3b13640def55193a82157571 Text-content-length: 842 Text-content-md5: efce2339dd489e63d890913667a6e76d Text-content-sha1: 5c6fa88da5da9ba590aad708b707e735af15612a Content-length: 885 K 15 cvs2svn:cvs-rev V 7 1.5.2.2 PROPS-END SVNfp!%?"($QGstatic void scroll_display(int, int, int scroll_display(topline, botline, lines); } static void scroll_display(int topline, int botline, int lines) { unsigned long *start, *end; int distance, size, i; start = disptext + topline * (cols + 1); end = disptext + (botline + 1) * (cols + 1); distance = (lines > 0 ? lines : -lines) * (cols + 1); size = end - start - distance; if (lines > 0) { memmove(start, start + distance, size * TSIZE); for (i = 0; i < distance; i++) (start + size)[i] |= ATTR_INVALID; } else { memmove(start + distance, start, size * TSIZE); for (i = 0; i < distance; i++) start[i] |= ATTR_INVALID; } do_scroll(topline, botline, lines); } if (rel == 0 && where < rows && where > -rows) scroll_display(0, rows - 1, where Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 385687d585f2f657a9a2520175f7a689 Text-delta-base-sha1: 7b39282b78250d497f16d563fbcc632ef9ecbda0 Text-content-length: 569 Text-content-md5: e9d5f7db66cc13166286430765c15245 Text-content-sha1: da263b8b2d1967be7a2ebcba70bece0e973ceb34 Content-length: 613 K 15 cvs2svn:cvs-rev V 8 1.1.2.12 PROPS-END SVN{q%L/v/* $Id: macterm.c,v 1.1.2.12 1999/03/02 21:51:5 /* * Scroll the screen. (`lines' is +ve for scrolling forward, -ve * for backward.) */ void do_scroll(int topline, int botline, int lines) { struct mac_session *s = onlysession; Rect r; RgnHandle update; SetPort(s->window); update = NewRgn(); SetRect(&r, 0, topline * font_height, cols * font_width, (botline + 1) * font_height); ScrollRect(&r, 0, - lines * font_height, update); /* XXX: move update region? */ InvalRgn(update); DisposeRgn(update); } Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: a51b32cc7471a7a78a4498a91ae14d49 Text-delta-base-sha1: 0f3a1408cea471d9fee94363acb27d07c09c90ba Text-content-length: 30 Text-content-md5: 4f0b85e8543096619789acf29e2c689b Text-content-sha1: bc6b5addedae1d7134c4d75de7e49e15594d3178 Content-length: 73 K 15 cvs2svn:cvs-rev V 7 1.4.2.6 PROPS-END SVN; qA[do_scroll Revision-number: 68 Prop-content-length: 281 Content-length: 281 K 8 svn:date V 27 1999-03-02T23:19:20.000000Z K 7 svn:log V 182 We now have saner handling of 4-bit modes (disable colour, get the Palette Manager to give us bg, fg, bold fg and cursor). I've also removed some traces of the old scroll-optimiser. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-early-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: efce2339dd489e63d890913667a6e76d Text-delta-base-sha1: 5c6fa88da5da9ba590aad708b707e735af15612a Text-content-length: 28 Text-content-md5: 2ff61186f78b0dda5ebe48060b4994eb Text-content-sha1: bb11118feb7d6c56e6b1dbded6a0ce1d507a0270 Content-length: 71 K 15 cvs2svn:cvs-rev V 7 1.5.2.3 PROPS-END SVNp;J:U Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 4b6a0a4eedb413d037fb1c441242261a Text-delta-base-sha1: fa8dc8305fd31c153ef41517a1529327e589a3dc Text-content-length: 2102 Text-content-md5: 63a2acf01271fb6712384f412f7b12e1 Text-content-sha1: 5ec2f418a07c2941db15bbf667eeff67f7282b3b Content-length: 2145 K 15 cvs2svn:cvs-rev V 7 1.1.2.7 PROPS-END SVN,3/k_8/* $Id: mac_res.r,v 1.1.2.7 1999/03/02 23:19:20 /* * *mutter* It might be nice if Apple could actually put all the flags in * Palettes.r. */ #define pmCourteous 0x0000 #define pmDithered 0x0001 #define pmTolerant 0x0002 #define pmAnimated 0x0004 #define pmExplicit 0x0008 #define pmWhite 0x0010 #define pmBlack 0x0020 #define pmInhibitG2 0x0100 #define pmInhibitC2 0x0200 #define pmInhibitG4 0x0400 #define pmInhibitC4 0x0800 #define pmInhibitG8 0x1000 #define pmInhibitC8 0x2000 #define PM_BASIC (pmTolerant | pmInhibitG4 | pmInhibitG8) #define PM_NORMAL (PM_BASIC | pmInhibitG2 | pmInhibitC2) resource 'pltt' (PREF_pltt, purgeable) { { 0x0000, 0x0000, 0x0000, PM_NORMAL, 0x2000, /* black */ 0x5555, 0x5555, 0x5555, PM_NORMAL, 0x2000, /* bright black */ 0xbbbb, 0x0000, 0x0000, PM_NORMAL, 0x2000, /* red */ 0xffff, 0x5555, 0x5555, PM_NORMAL, 0x2000, /* bright red */ 0x0000, 0xbbbb, 0x0000, PM_NORMAL, 0x2000, /* green */ 0x5555, 0xffff, 0x5555, PM_NORMAL, 0x2000, /* bright green */ 0xbbbb, 0xbbbb, 0x0000, PM_NORMAL, 0x2000, /* yellow */ 0xffff, 0xffff, 0x0000, PM_NORMAL, 0x2000, /* bright yellow */ 0x0000, 0x0000, 0xbbbb, PM_NORMAL, 0x2000, /* blue */ 0x5555, 0x5555, 0xffff, PM_NORMAL, 0x2000, /* bright blue */ 0xbbbb, 0x0000, 0xbbbb, PM_NORMAL, 0x2000, /* magenta */ 0xffff, 0x5555, 0xffff, PM_NORMAL, 0x2000, /* bright magenta */ 0x0000, 0xbbbb, 0xbbbb, PM_NORMAL, 0x2000, /* cyan */ 0x5555, 0xffff, 0xffff, PM_NORMAL, 0x2000, /* bright cyan */ 0xbbbb, 0xbbbb, 0xbbbb, PM_NORMAL, 0x2000, /* white */ 0xffff, 0xffff, 0xffff, PM_NORMAL, 0x2000, /* bright white */ 0xbbbb, 0xbbbb, 0xbbbb, PM_BASIC, 0x2000, /* default fg */ 0xffff, 0xffff, 0xffff, PM_BASIC, 0x2000, /* default bold fg */ 0x0000, 0x0000, 0x0000, PM_BASIC, 0x2000, /* default bg */ 0x5555, 0x5555, 0x5555, PM_NORMAL, 0x2000, /* default bold bg */ 0x0000, 0x0000, 0x0000, PM_NORMAL, 0x2000, /* cursor bg */ 0x0000, 0x0000, 0x0000, PM_NORMAL, 0x2000, /* bold cursor bg */ 0x0000, 0xffff, 0x0000, PM_BASIC, 0x2000, /* cursor fg */ 0x0000, 0xffff, 0x0000, PM_NORMAL Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: e9d5f7db66cc13166286430765c15245 Text-delta-base-sha1: da263b8b2d1967be7a2ebcba70bece0e973ceb34 Text-content-length: 411 Text-content-md5: 202c6685d5f9fb2bc066b289e3681ff3 Text-content-sha1: ffe98308a8358faf3cf5e50cc3b487d7e745bd8f Content-length: 455 K 15 cvs2svn:cvs-rev V 8 1.1.2.13 PROPS-END SVNqt oq0aTI/j#n/* $Id: macterm.c,v 1.1.2.13 1999/03/02 23:19:20#define DEFAULT_FG 16 #define DEFAULT_FG_BOLD 17 #define DEFAULT_BG 18 #define DEFAULT_BG_BOLD 19SetRect(&clip, window->portRect.right - 15, SHRT_MIN, SHRT_MAX, SHRT_MAX)case 2: if ((a->attr & ATTR_BOLD) && cfg.bold_colour) PmForeColor(DEFAULT_FG_BOLD); else PmForeColor(DEFAULT_FG); PmBackColor(DEFAULT_BG Revision-number: 69 Prop-content-length: 234 Content-length: 234 K 8 svn:date V 27 1999-03-02T23:47:23.000000Z K 7 svn:log V 135 Scroll optimisations are now controlled by #ifdef OPTIMISE_SCROLL. Scroll-bar manipulation now uses scroll optimisation more sensibly. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-early-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 2ff61186f78b0dda5ebe48060b4994eb Text-delta-base-sha1: bb11118feb7d6c56e6b1dbded6a0ce1d507a0270 Text-content-length: 460 Text-content-md5: 2dbdcbe69fc68718c3c022a93c29f6aa Text-content-sha1: b11c1afdd71b4d51a2fb21f2d894fef98f51b311 Content-length: 503 K 15 cvs2svn:cvs-rev V 7 1.5.2.4 PROPS-END SVN;R#Wduozk7h0Ev#ifdef OPTIMISE_SCROLL scroll_display(topline, botline, lines); #endif } #ifdef OPTIMISE_SCROLL#endif /* OPTIMISE_SCROLL */#ifdef OPTIMISE_SCROLL unsigned long *olddisptop = disptop; int shift; #endif /* OPTIMISE_SCROLL */#ifdef OPTIMISE_SCROLL shift = (disptop - olddisptop) / (cols + 1); if (shift < rows && shift > -rows) scroll_display(0, rows - 1, shift); #endif /* OPTIMISE_SCROLL */ Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 4f0b85e8543096619789acf29e2c689b Text-delta-base-sha1: bc6b5addedae1d7134c4d75de7e49e15594d3178 Text-content-length: 48 Text-content-md5: 113fbd317c1fe34fb872feaddecc9b9e Text-content-sha1: 83f010fc13f8ec46c389b2895bb8246afcad103f Content-length: 91 K 15 cvs2svn:cvs-rev V 7 1.4.2.7 PROPS-END SVN;luZadefine OPTIMISE_SCROLL #endif Revision-number: 70 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 1999-03-03T11:34:43.000000Z K 7 svn:log V 89 No longer assume the values of '\n' and '\r', so CR and LF don't get swapped on the Mac. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-early-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 2dbdcbe69fc68718c3c022a93c29f6aa Text-delta-base-sha1: b11c1afdd71b4d51a2fb21f2d894fef98f51b311 Text-content-length: 348 Text-content-md5: 00939458ed482ef7eca3f713d880fdfd Text-content-sha1: c51de826b63d67b296e6b3cbb78d492ebbfc1d4c Content-length: 391 K 15 cvs2svn:cvs-rev V 7 1.5.2.5 PROPS-END SVNRf;KQ9gZ7yA73iZ7g#7015': curs_x = 0; wrapnext = FALSE3': case '\014': case '\012015': case '\013': case '\014': case '\012015': case '\013': case '\014': case '\012015': case '\013': case '\014': case '\012015': case '\013': case '\014': case '\012 Revision-number: 71 Prop-content-length: 182 Content-length: 182 K 7 svn:log V 80 This commit was manufactured by cvs2svn to create tag 'ben-scrollopt-for-simon'. K 10 svn:author V 7 cvs2svn K 8 svn:date V 27 1999-03-03T11:34:43.000000Z PROPS-END Node-path: putty-ben-scrollopt-for-simon Node-kind: dir Node-action: add Node-copyfrom-rev: 70 Node-copyfrom-path: putty-ben-early-mac-port Node-path: putty-ben-scrollopt-for-simon/ssh.c Node-action: delete Revision-number: 72 Prop-content-length: 278 Content-length: 278 K 8 svn:date V 27 1999-03-03T22:03:54.000000Z K 7 svn:log V 179 Resizing of terminal windows added. Seems to work, but term_size might benefit from calling scroll_display. This is where my scroll-optimisations look less useful than Simon's. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 02eb3619e969d7d1ec728241d24176ea Text-delta-base-sha1: d14891a228fd6e1225e3bd7d81a62f340433f538 Text-content-length: 273 Text-content-md5: 2fc39da595b045ed264e703730d090f9 Text-content-sha1: 2f6bfa0c94db362306fc4e19de428ce06d197232 Content-length: 317 K 15 cvs2svn:cvs-rev V 8 1.1.2.11 PROPS-END SVN,'fY,VYk) vy1{/* $Id: mac.c,v 1.1.2.11 1999/03/03 22:03:54growwindowmac_growwindow(window, event);growwindow(WindowPtr window, EventRecord *event) { switch (mac_windowtype(window)) { case wTerminal: mac_growterm(window, event)exit(0 Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 5e257c911f859ad429feb9864f06f4a8 Text-delta-base-sha1: a8f70b9cdb9f5da833eb1b621c1efad3a0b827e3 Text-content-length: 131 Text-content-md5: 778ff7485271f46c4fcbcddef2c7079c Text-content-sha1: f1e2f7372a616ad0737384b3d01b5d4c1f90d082 Content-length: 174 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVNda kEpf22Eventextern void mac_clickterm(WindowPtr, EventRecord *); extern void mac_growterm(WindowPtr, EventRecord * Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 202c6685d5f9fb2bc066b289e3681ff3 Text-delta-base-sha1: ffe98308a8358faf3cf5e50cc3b487d7e745bd8f Text-content-length: 892 Text-content-md5: fa031e0535a83a076d4f2b2683ebb6ac Text-content-sha1: 19ce75ba337efa6d054ebf37b2005d8049d3f138 Content-length: 936 K 15 cvs2svn:cvs-rev V 8 1.1.2.14 PROPS-END SVNt'I 0q8)<]te/* $Id: macterm.c,v 1.1.2.14 1999/03/03 22:03:54#include where, &limits); if (grow_result != 0) { newrows = HiWord(grow_result) / font_height; newcols = (LoWord(grow_result) - 15) / font_width; mac_adjustsize(s, newrows, newcols); term_size(newrows, newcols, cfg.savelines) Revision-number: 73 Prop-content-length: 197 Content-length: 197 K 7 svn:log V 99 Added testback.c (not that it works). Now compile with strict prototypes and optimisation (whee!). K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-07T23:15:56.000000Z PROPS-END Node-path: putty-ben-mac-port/PuTTY.make Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: bbab44cc4a007d6f7d602e422c52bc4e Text-delta-base-sha1: 65aa45a77318fa45733d304a19ba5d3911cca9e4 Text-content-length: 205 Text-content-md5: b9c84e0115a4043e14d1dc2e1bf04ae6 Text-content-sha1: 6064607dee5dfaa03fff1edc886df720757fbb39 Content-length: 248 K 15 cvs2svn:cvs-rev V 7 1.1.2.8 PROPS-END SVNYs+R/ P L@# $Id: PuTTY.make,v 1.1.2.8 1999/03/07 23:15:56-proto strict -opt all "{ObjDir68K}testback"{ObjDir68K}testback.c.o" {MondoBuild} testback.c putty.h {C} testback Revision-number: 74 Prop-content-length: 345 Content-length: 345 K 8 svn:date V 27 1999-03-07T23:19:02.000000Z K 7 svn:log V 246 Lots of things, notably: * Tidied state machine, with better handling of unknown escape and control sequences. * Support for automatic newline mode, with lfhascr now being a session variable. * #include for mem*() and str*(). K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-early-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 00939458ed482ef7eca3f713d880fdfd Text-delta-base-sha1: c51de826b63d67b296e6b3cbb78d492ebbfc1d4c Text-content-length: 3577 Text-content-md5: 2fe48cfa00fbf9833de02d502cf11b28 Text-content-sha1: 6d7fa2ddb941de177650b597f2fd53da45744bad Content-length: 3620 K 15 cvs2svn:cvs-rev V 7 1.5.2.6 PROPS-END SVNfO"HOBBmk36Tc~!jdls6c'Q9kr Kt&Nv.),w-hH99N@guwu>n-Gring.h>lfhascr; /* Auto-crEN_GZD4, SEEN_G1D4, SEEN_OSC, SEEN_OSC_P, SEEN_OSC_W, OSC_STRING, OSC_MAYBE_ST, SEEN_ESCHASH, SEEN_ESC_CONFUSED, SEEN_CSI_CONFUSED,lfhascr = cfg.lfhascr case 20: /* line feed/new line mode */ lfhascrenum c0 { NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL, BS, HT, LF, VT, FF, CR, SO, SI, DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB, CAN, EM, SUB, ESC, IS1, IS2, IS3, IS4 }; enum c1 { BPH = 0x82, NBH, IND, NEL, SSA, ESA, HTS, HTJ, VTS, PLD, PLU, RI, SS1, SS2, DCS, PU1, PU2, STS, CCH, MW, SPA, EPA, SOS, SCI = 0x9a, CSI, ST, OSC, PM, APC }; int reprocess = FALSE; while (reprocess || (c = inbuf_getc()) != -1) { #ifdef LOG if (!reprocess) reprocess = FALSE;5': curs_x = 0; wrapnext = FALSE3': case '\014': case '\012': case 'INDNELHTS: /* set a tab */ tabs[curs_x] = TRUE; break; case RISCI: /* terminal type query */ /* This sequence is standardised as something else entirely. */ back->send ("\033[?6c", 5)default: if (c >= ' ' && c < 0x7f || c >= 0xa0 break;/* * According to ECMA-35, an escape sequence consists of * ESC, a sequence (possibly empty) of intermediate bytes * from column 02 (SPACE--/), and a final byte from * columns 03-07 (0--~). */ termstate = TOPLEVEL; if (c >= 0x40 && c < 0x60) { /* Fe sequences -- C1 control as an escape sequence */ c += 0x40; reprocess = TRUE; } else switch (c) { /* nF sequences -- with intermediate bytes */ case '#': /* Single control functions */ termstate = SEEN_ESCHASH; break; case '(': /* GZD4: should set G0 */ termstate = SEEN_GZD4; break; case ')': /* G1D4: should set G1 */ termstate = SEEN_G1D4; break; /* Fp sequences -- private control functions */ /* Fs sequences -- standardised control functions */ case 'c': /* RIS: restore power-on settings */ power_on()default: termstate = SEEN_ESC_CONFUSED; reprocess = TRUE; break; } break; case SEEN_ESC_CONFUSED: /* * We're in an escape sequence, but we no longer know what * it means and we just want it to go away */ termstate = TOPLEVEL; if (c < 0x20 || c >= 0x7f) /* * ECMA-35 says this isn't allowed, so we can do what * we like. */ reprocess = TRUE; else if (c <= 0x30) /* Intermediate byte -- more to come */ termstate = SEEN_ESC_CONFUSED; /* Otherwise, that was a final byte and we're free! */ break; case SEEN_CSI: /* * In theory, a control sequence consists of CSI, then a * sequence (possibly empty) of parameter bytes (0--?) * then a sequence (possibly empty) of intermediate bytes * (SPACE--/), then a final byte (@--~). We're rather * more relaxed, and don't differentiate between parameter * and intermediate bytes. */ default: termstate = SEEN_CSI_CONFUSED; reprocess = TRUE; break; } break; case SEEN_CSI_CONFUSED: termstate = TOPLEVEL; if (c < 0x20 || c >= 0x7f) reprocess = TRUE; else if (c < 0x40) termstate = SEEN_CSI_CONFUSED; case SEEN_GZD4: case SEEN_G1D4: switch (c) { case 'A': cset_attr[termstate == SEEN_GZD4 ? 0 : 1] = ATTR_GBCHR; break; case '0': cset_attr[termstate == SEEN_GZD4EN_GZD4 Revision-number: 75 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 48 Pass keyboard events to the terminal front-end. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-07T23:20:20.000000Z PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 2fc39da595b045ed264e703730d090f9 Text-delta-base-sha1: 2f6bfa0c94db362306fc4e19de428ce06d197232 Text-content-length: 283 Text-content-md5: 38c04c387067e06a04cc58b99d87e15b Text-content-sha1: c7f7f26a274ad8a395fb89b85dfb3368a3ac29f3 Content-length: 327 K 15 cvs2svn:cvs-rev V 8 1.1.2.12 PROPS-END SVN'wv,6OAf/* $Id: mac.c,v 1.1.2.12 1999/03/07 23:20:20#include /* for vsprintf WindowPtr window else { window = FrontWindow(); switch (mac_windowtype(window)) { case wTerminal: mac_keyterm(window, event); break; } } Revision-number: 76 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 1999-03-07T23:22:23.000000Z K 7 svn:log V 40 Keyboard handling and a visible cursor. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: fa031e0535a83a076d4f2b2683ebb6ac Text-delta-base-sha1: 19ce75ba337efa6d054ebf37b2005d8049d3f138 Text-content-length: 6701 Text-content-md5: 0baf2122943e3807bfec1165277edb79 Text-content-sha1: d6d16af92892aeb57cacdfce3b87520567eec605 Content-length: 6745 K 15 cvs2svn:cvs-rev V 8 1.1.2.15 PROPS-END SVNY?aL0"x5LKz]W?LXD\v/* $Id: macterm.c,v 1.1.2.15 1999/03/07 23:22:23#include send((char *)buf, len); */ for (i = 0; i < len; i++) inbuf_putc(buf[i]); term_out(); term_update(); } static int mac_keytrans(struct mac_session *s, EventRecord *event, unsigned char *output) { unsigned char *p = output; int code; /* No meta key yet -- that'll be rather fun. */ /* Keys that we handle locally */ if (event->modifiers & shiftKey) { switch (event->message & keyCodeMask) { case K_PRIOR: /* shift-pageup */ term_scroll(0, -(rows - 1)); return 0; case K_NEXT: /* shift-pagedown */ term_scroll(0, +(rows - 1)); return 0; } } /* * Control-2 should return ^@ (0x00), Control-6 should return * ^^ (0x1E), and Control-Minus should return ^_ (0x1F). Since * the DOS keyboard handling did it, and we have nothing better * to do with the key combo in question, we'll also map * Control-Backquote to ^\ (0x1C). */ if (event->modifiers & controlKey) { switch (event->message & charCodeMask) { case ' ': case '2': *p++ = 0x00; return p - output; case '`': *p++ = 0x1c; return p - output; case '6': *p++ = 0x1e; return p - output; case '/': *p++ = 0x1f; return p - output; } } /* * First, all the keys that do tilde codes. (ESC '[' nn '~', * for integer decimal nn.) * * We also deal with the weird ones here. Linux VCs replace F1 * to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but * does replace Home and End (1~ and 4~) by ESC [ H and ESC O w * respectively. */ code = 0; switch (event->message & keyCodeMask) { case K_F1: code = (event->modifiers & shiftKey ? 23 : 11); break; case K_F2: code = (event->modifiers & shiftKey ? 24 : 12); break; case K_F3: code = (event->modifiers & shiftKey ? 25 : 13); break; case K_F4: code = (event->modifiers & shiftKey ? 26 : 14); break; case K_F5: code = (event->modifiers & shiftKey ? 28 : 15); break; case K_F6: code = (event->modifiers & shiftKey ? 29 : 17); break; case K_F7: code = (event->modifiers & shiftKey ? 31 : 18); break; case K_F8: code = (event->modifiers & shiftKey ? 32 : 19); break; case K_F9: code = (event->modifiers & shiftKey ? 33 : 20); break; case K_F10: code = (event->modifiers & shiftKey ? 34 : 21); break; case K_F11: code = 23; break; case K_F12: code = 24; break; case K_HOME: code = 1; break; case K_INSERT: code = 2; break; case K_DELETE: code = 3; break; case K_END: code = 4; break; case K_PRIOR: code = 5; break; case K_NEXT: code = 6; break; } if (cfg.linux_funkeys && code >= 11 && code <= 15) { p += sprintf((char *)p, "\x1B[[%c", code + 'A' - 11); return p - output; } if (cfg.rxvt_homeend && (code == 1 || code == 4)) { p += sprintf((char *)p, code == 1 ? "\x1B[H" : "\x1BOw"); return p - output; } if (code) { p += sprintf((char *)p, "\x1B[%d~", code); return p - output; } if (app_keypad_keys) { switch (event->message & keyCodeMask) { case KP_ENTER: p += sprintf((char *)p, "\x1BOM"); return p - output; case KP_CLEAR: p += sprintf((char *)p, "\x1BOP"); return p - output; case KP_EQUAL: p += sprintf((char *)p, "\x1BOQ"); return p - output; case KP_SLASH: p += sprintf((char *)p, "\x1BOR"); return p - output; case KP_STAR: p += sprintf((char *)p, "\x1BOS"); return p - output; case KP_PLUS: p += sprintf((char *)p, "\x1BOl"); return p - output; case KP_MINUS: p += sprintf((char *)p, "\x1BOm"); return p - output; case KP_DOT: p += sprintf((char *)p, "\x1BOn"); return p - output; case KP_0: p += sprintf((char *)p, "\x1BOp"); return p - output; case KP_1: p += sprintf((char *)p, "\x1BOq"); return p - output; case KP_2: p += sprintf((char *)p, "\x1BOr"); return p - output; case KP_3: p += sprintf((char *)p, "\x1BOs"); return p - output; case KP_4: p += sprintf((char *)p, "\x1BOt"); return p - output; case KP_5: p += sprintf((char *)p, "\x1BOu"); return p - output; case KP_6: p += sprintf((char *)p, "\x1BOv"); return p - output; case KP_7: p += sprintf((char *)p, "\x1BOw"); return p - output; case KP_8: p += sprintf((char *)p, "\x1BOx"); return p - output; case KP_9: p += sprintf((char *)p, "\x1BOy"); return p - output; } } switch (event->message & keyCodeMask) { case K_UP: p += sprintf((char *)p, app_cursor_keys ? "\x1BOA" : "\x1B[A"); return p - output; case K_DOWN: p += sprintf((char *)p, app_cursor_keys ? "\x1BOB" : "\x1B[B"); return p - output; case K_RIGHT: p += sprintf((char *)p, app_cursor_keys ? "\x1BOC" : "\x1B[C"); return p - output; case K_LEFT: p += sprintf((char *)p, app_cursor_keys ? "\x1BOD" : "\x1B[D"); return p - output; case K_BS: *p++ = (cfg.bksp_is_delete ? 0x7f : 0x08); return p - output; default: *p++ = event->message & charCodeMask; return p - outputhas_focus = active; term_update(if (a->attr & ATTR_ACTCURS) PmBackColor(CURSOR_FG); else if (a->attr & ATTR_ACTCURS) bgcolour = CURSOR_FGPmBackColor(DEFAULT_BG Revision-number: 77 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 1999-03-07T23:23:38.000000Z K 7 svn:log V 55 Attempt at some back-ends useful for testing purposes. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/testback.c Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 2217 Text-content-md5: bda2e2e0f166f383e37156566d980ab2 Text-content-sha1: 45ab149a14e4b8ad8b452fa09d0bfd7e6aa2b24d Content-length: 2337 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN/* $Id: testback.c,v 1.1.2.1 1999/03/07 23:23:38 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* PuTTY test backends */ #include #include "putty.h" static char *null_init(char *, int, char **); static int null_msg(void); static void null_send(char *, int); static void loop_send(*char *, int); static void null_size(void); static void null_special(Telnet_Special); Backend null_backend = { null_init, null_msg, null_send, null_size, null_special }; Backend loop_backend = { null_init, null_msg, loop_send, null_size, null_special }; static char *null_init(char *host, int port, char **realhost) { return NULL; } static int null_msg(void) { return 1; } static void null_send(char *buf, int len) { } static void lo_send (char *buf, int len) { while (len--) { int new_head = (inbuf_head + 1) & INBUF_MASK; int c = (unsigned char) *buf; if (new_head != inbuf_reap) { inbuf[inbuf_head] = *buf++; inbuf_head = new_head; } } } static void null_size(void) { } static void null_special(Telnet_Special code) { } Revision-number: 78 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 31 Changes for updates elsewhere. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-07T23:25:43.000000Z PROPS-END Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 778ff7485271f46c4fcbcddef2c7079c Text-delta-base-sha1: f1e2f7372a616ad0737384b3d01b5d4c1f90d082 Text-content-length: 90 Text-content-md5: 99d1f472b5b3584f841c48912e991b4e Text-content-sha1: 369593cd6e81542997ccfee0416711e519b626ff Content-length: 133 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVNa' F2F/2extern void mac_keyterm(WindowPtr, EventRecord *); /* from maccfg.c */ Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 113fbd317c1fe34fb872feaddecc9b9e Text-delta-base-sha1: 83f010fc13f8ec46c389b2895bb8246afcad103f Text-content-length: 94 Text-content-md5: 8faabb0b3c9e57f69badfb8a1b955abc Text-content-sha1: 27da7804054228b1ce2d339579cfb056f70ff116 Content-length: 137 K 15 cvs2svn:cvs-rev V 7 1.4.2.8 PROPS-END SVNlJ HHjtestback.c */ extern Backend null_backend; extern Backend loop_backend Revision-number: 79 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 1999-03-09T00:06:34.000000Z K 7 svn:log V 67 Tanslation tables to Mac OS written, though nothing uses them yet. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 63a2acf01271fb6712384f412f7b12e1 Text-delta-base-sha1: 5ec2f418a07c2941db15bbf667eeff67f7282b3b Text-content-length: 659 Text-content-md5: 015e21e06c8ed1dddd6d4d3c86553b72 Text-content-sha1: ac15f1a4b01678211c9742745d09964eb095fe1f Content-length: 702 K 15 cvs2svn:cvs-rev V 7 1.1.2.8 PROPS-END SVN,y |}/M/* $Id: mac_res.r,v 1.1.2.8 1999/03/09 00:06:34 type 'cMAP' { hexstring; }; resource 'cMAP' (128, "Latin-1 G1 -> Mac OS Roman") { $"20 c1 a2 a3 db b4 00 a4 ac a9 bb c7 c2 00 a8 f8" $"a1 b1 00 00 ab b5 a6 e1 fc 00 bc c8 00 00 00 c0" $"cb e7 e5 cc 80 81 ae 82 e9 83 e6 e8 ed ea eb ec" $"00 84 f1 ee ef cd 85 00 af f4 f2 f3 86 00 00 a7" $"88 87 89 8b 8a 8c be 8d 8f 8e 90 91 93 92 94 95" $"00 96 98 97 99 9b 9a d6 bf 9d 9c 9e 9f 00 00 D8" }; resource 'cMAP' (129, "DEC line drawing -> Mac OS VT100") { $"d7 bd 09 0c 0d 0a a1 b1 00 0b d2 d3 d4 d5 da e2" $"e3 e4 f5 f6 f7 f8 f9 fa fb b2 b3 b9 ad a3 e1" Revision-number: 80 Prop-content-length: 128 Content-length: 128 K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-09T00:08:41.000000Z K 7 svn:log V 30 Tiny \n/\r fix in term_mouse. PROPS-END Node-path: putty-ben-early-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 2fe48cfa00fbf9833de02d502cf11b28 Text-delta-base-sha1: 6d7fa2ddb941de177650b597f2fd53da45744bad Text-content-length: 26 Text-content-md5: 4a6204444cd16088c237f5e0946d96e4 Text-content-sha1: 5e39c640d7862d7ab4b57fa56359a5c066109653 Content-length: 69 K 15 cvs2svn:cvs-rev V 7 1.5.2.7 PROPS-END SVNOO B Cn Revision-number: 81 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 1999-03-09T00:09:50.000000Z K 7 svn:log V 116 Beginnings of support for selecting text -- clicking mostly does the right thing, but dragging doesn't work at all. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 38c04c387067e06a04cc58b99d87e15b Text-delta-base-sha1: c7f7f26a274ad8a395fb89b85dfb3368a3ac29f3 Text-content-length: 204 Text-content-md5: 13f17491b30029f09b663d8eba7d0595 Text-content-sha1: bde56a3ad9445e8deee1b1e34d2e52ce5244588e Content-length: 248 K 15 cvs2svn:cvs-rev V 8 1.1.2.13 PROPS-END SVNw 3o+a/* $Id: mac.c,v 1.1.2.13 1999/03/09 00:09:5void write_clip(void *data, int len) { /* XXX: do something */ } void get_clip(void **p, int *lenp) { /* XXX: do something */ Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 0baf2122943e3807bfec1165277edb79 Text-delta-base-sha1: d6d16af92892aeb57cacdfce3b87520567eec605 Text-content-length: 1155 Text-content-md5: ee82ada06bd04968941155b6e31f633b Text-content-sha1: 2c237b362003980776bfb4d9b7d2cb7328dd5f89 Content-length: 1199 K 15 cvs2svn:cvs-rev V 8 1.1.2.16 PROPS-END SVNYb/0YZz&3/* $Id: macterm.c,v 1.1.2.16 1999/03/09 00:09:50static void text_click(struct mac_session *, EventRecord else { text_click(s, event); } } static void text_click(struct mac_session *s, EventRecord *event) { Point localwhere; int row, col; static UInt32 lastwhen = 0; static struct mac_session *lastsess = NULL; static int lastrow = -1, lastcol = -1; static Mouse_Action lastact = MA_NOTHING; SetPort(s->window); localwhere = event->where; GlobalToLocal(&localwhere); col = localwhere.h / font_width; row = localwhere.v / font_height; if (event->when - lastwhen < GetDblTime() && row == lastrow && col == lastcol && s == lastsess) lastact = (lastact == MA_CLICK ? MA_2CLK : lastact == MA_2CLK ? MA_3CLK : lastact == MA_3CLK ? MA_CLICK : MA_NOTHING); else lastact = MA_CLICK; term_mouse(event->modifiers & shiftKey ? MB_EXTEND : MB_SELECT, lastact, col, row); while (StillDown()) { /* XXX Do something */ } lastsess = s; lastrow = row; lastcol = col; lastwhen = event->when; /* XXX: should be time of mmouse _up_ */ Revision-number: 82 Prop-content-length: 406 Content-length: 406 K 8 svn:date V 27 1999-03-09T11:57:13.000000Z K 7 svn:log V 307 Removed support for Line Feed/New Line Mode on the grounds that it doesn't do the same as lfhascr -- it also changes the "return" key to send CR/LF, which lfhascr doesn't do (and shouldn't do). Also, Line Feed/New Line mode isn't meant to affect IND, which lfhascr currently does (but arguably shouldn't). K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-early-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 4a6204444cd16088c237f5e0946d96e4 Text-delta-base-sha1: 5e39c640d7862d7ab4b57fa56359a5c066109653 Text-content-length: 23 Text-content-md5: 0a5a0d5f5f9414a210f7838cf486e97a Text-content-sha1: 3e5b3a9873e600311ea2253dd91a85111cd2c993 Content-length: 66 K 15 cvs2svn:cvs-rev V 7 1.5.2.8 PROPS-END SVNO K4 Revision-number: 83 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 1999-03-09T12:10:05.000000Z K 7 svn:log V 104 IND no longer notices lfhascr. I've actually got the fix in term_mouse right now (or less wrong). Yeah. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-early-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 0a5a0d5f5f9414a210f7838cf486e97a Text-delta-base-sha1: 3e5b3a9873e600311ea2253dd91a85111cd2c993 Text-content-length: 85 Text-content-md5: f748728f17310c781396d8ac89156af9 Text-content-sha1: d1b8aff3809883efa609f85037c65ee96a8afddb Content-length: 128 K 15 cvs2svn:cvs-rev V 7 1.5.2.9 PROPS-END SVN .m}b sIND: if (lfhascr && c != IND015 Revision-number: 84 Prop-content-length: 178 Content-length: 178 K 7 svn:log V 76 This commit was manufactured by cvs2svn to create tag 'ben-hacked-terminal'. K 10 svn:author V 7 cvs2svn K 8 svn:date V 27 1999-03-09T12:10:05.000000Z PROPS-END Node-path: putty-ben-hacked-terminal Node-kind: dir Node-action: add Node-copyfrom-rev: 83 Node-copyfrom-path: putty-ben-early-mac-port Node-path: putty-ben-hacked-terminal/ssh.c Node-action: delete Revision-number: 85 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 1999-03-11T10:27:12.000000Z K 7 svn:log V 76 Allow CSI 0;0r to set default scroll region (previously did nothing useful) K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1fe77645c195b4368c61789055e369a6 Text-delta-base-sha1: 57085a33a1a93483d277bc7b84d830e822f73d91 Text-content-length: 49 Text-content-md5: 1f6f39c62bfb3fbd15f8323dbf9be0fd Text-content-sha1: 9573640e413ace3de7029e8a624e2963d5160c2d Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN9M 2<= 1 || esc_args[1] == 0 Revision-number: 86 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 1999-03-11T11:10:53.000000Z K 7 svn:log V 72 This commit was manufactured by cvs2svn to create branch 'ben-mac-port'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-ben-mac-port/terminal.c Node-kind: file Node-action: add Node-copyfrom-rev: 70 Node-copyfrom-path: putty-ben-early-mac-port/terminal.c Text-copy-source-md5: 00939458ed482ef7eca3f713d880fdfd Text-copy-source-sha1: c51de826b63d67b296e6b3cbb78d492ebbfc1d4c Revision-number: 87 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 1999-03-11T11:10:53.000000Z K 7 svn:log V 38 pasting now sends \015 rather than \r K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 48 Text-delta: true Text-delta-base-md5: 00939458ed482ef7eca3f713d880fdfd Text-delta-base-sha1: c51de826b63d67b296e6b3cbb78d492ebbfc1d4c Text-content-length: 28 Text-content-md5: b5e5ea2d99b90e52e51a313ebf8a5984 Text-content-sha1: 0965c961c709836c3a758640981f45d4428fd6f8 Content-length: 76 K 15 cvs2svn:cvs-rev V 11 1.5.2.5.2.1 PROPS-END SVNfh Y Z015 Revision-number: 88 Prop-content-length: 140 Content-length: 140 K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-11T12:03:18.000000Z K 7 svn:log V 42 merged changes up to terminal.c 1.6 [r85] PROPS-END Node-path: putty-ben-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 48 Text-delta: true Text-delta-base-md5: b5e5ea2d99b90e52e51a313ebf8a5984 Text-delta-base-sha1: 0965c961c709836c3a758640981f45d4428fd6f8 Text-content-length: 49 Text-content-md5: a311cf9a2d3ba6b2fc36250e1defb135 Text-content-sha1: 57f9f63f9d9fdf3f45e8c3e1b9ae54a7eb6ea161 Content-length: 97 K 15 cvs2svn:cvs-rev V 11 1.5.2.5.2.2 PROPS-END SVNh|  Y<= 1 || esc_args[1] == 0 Revision-number: 89 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 1999-03-11T15:07:16.000000Z K 7 svn:log V 42 Oh, and we'll have back too... K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 48 Text-delta: true Text-delta-base-md5: a311cf9a2d3ba6b2fc36250e1defb135 Text-delta-base-sha1: 57f9f63f9d9fdf3f45e8c3e1b9ae54a7eb6ea161 Text-content-length: 41 Text-content-md5: 2f675c0197735b65784345dd0eb9745d Text-content-sha1: 83a1f52ee22438484dc3e97b29f4886807afa609 Content-length: 89 K 15 cvs2svn:cvs-rev V 11 1.5.2.5.2.3 PROPS-END SVN| jj#include Revision-number: 90 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 1999-03-11T21:40:32.000000Z K 7 svn:log V 86 Menu items now turn on and off in a vaguely useful way. Dragging to select now works. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 13f17491b30029f09b663d8eba7d0595 Text-delta-base-sha1: bde56a3ad9445e8deee1b1e34d2e52ce5244588e Text-content-length: 867 Text-content-md5: 711293b9be3191d82620f245068abfcc Text-content-sha1: b440228d26730c375c633ec07f7e797d78d90445 Content-length: 911 K 15 cvs2svn:cvs-rev V 8 1.1.2.14 PROPS-END SVN#4V, [QX,o\h/* $Id: mac.c,v 1.1.2.14 1999/03/11 21:40:31struct mac_windows { WindowPtr terminal; /* XXX: Temporary */ WindowPtr about; WindowPtr licence; }; struct mac_windows windows windows.terminal = NULL; windows.about = NULL; windows.licence = NULLmac_adjustmenus(); WindowPtr window; MenuHandle menu; window = FrontWindow(); menu = GetMenuHandle(mApple); EnableItem(menu, 0); EnableItem(menu, iAbout); menu = GetMenuHandle(mFile); EnableItem(menu, 0); EnableItem(menu, iNew); EnableItem(menu, iQuit); switch (mac_windowtype(window)) { case wTerminal: mac_adjusttermmenus(window); break; default: menu = GetMenuHandle(mEdit); DisableItem(menu, 0); break; } DrawMenuBar(); /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 99d1f472b5b3584f841c48912e991b4e Text-delta-base-sha1: 369593cd6e81542997ccfee0416711e519b626ff Text-content-length: 46 Text-content-md5: f56ee91fa9a2762e9437efa177546766 Text-content-sha1: 22d773b1d63ba1e85579f702d6a3798572f3bebc Content-length: 89 K 15 cvs2svn:cvs-rev V 7 1.1.2.6 PROPS-END SVN'S 2adjusttermmenus(WindowPtr Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 015e21e06c8ed1dddd6d4d3c86553b72 Text-delta-base-sha1: ac15f1a4b01678211c9742745d09964eb095fe1f Text-content-length: 547 Text-content-md5: ffc73653332c89bf539fe39bebc62aba Text-content-sha1: 4facea16f058c6de6692493fcc331e343b77f000 Content-length: 590 K 15 cvs2svn:cvs-rev V 7 1.1.2.9 PROPS-END SVNy4"sA/'p:yY]/* $Id: mac_res.r,v 1.1.2.9 1999/03/11 21:40:31, mEditresource 'MENU' (mEdit, preload) { mEdit, textMenuProc, 0b11111111111111111111111111111101, enabled, "Edit", { "Undo", noicon, "Z", nomark, plain, "-", noicon, nokey, nomark, plain, "Cut", noicon, "X", nomark, plain, "Copy", noicon, "C", nomark, plain, "Paste", noicon, "V", nomark, plain, "Clear", noicon, nokey, nomark, plain, "Select All", noicon, "ApMAP' { hex string; }; resource 'pp}; Node-path: putty-ben-mac-port/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: dc4cd46e57fffe63f7424368f2c4a3d8 Text-delta-base-sha1: f23f389bcab9166b1a5809d1ec871eda187bc017 Text-content-length: 217 Text-content-md5: 1693d7e93702c8413b955c2c6f3bfb08 Text-content-sha1: d4c5cf67bb4bc65ed6854647685805844c6a7ada Content-length: 260 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVNft<N0y}zqu/* $Id: macresid.h,v 1.1.2.5 1999/03/11 21:40:32#define mEdit 130/* Edit menu */ #define iUndo 1 #define iCut 3 #define iCopy 4 #define iPaste 5 #define iClear 6 #define iSelectAll 7 Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: ee82ada06bd04968941155b6e31f633b Text-delta-base-sha1: 2c237b362003980776bfb4d9b7d2cb7328dd5f89 Text-content-length: 1132 Text-content-md5: 7a253ab034e275273a270af276f48620 Text-content-sha1: 6a13944de6a8ef47d2fa7779a6ad9bd00547df5d Content-length: 1176 K 15 cvs2svn:cvs-rev V 8 1.1.2.17 PROPS-END SVNA0y%1"&jM/* $Id: macterm.c,v 1.1.2.17 1999/03/11 21:40:32crap/* * Enable/disable menu items based on the active terminal window. */ void mac_adjusttermmenus(WindowPtr window) { struct mac_session *s; MenuHandle menu; long offset; s = (struct mac_session *)GetWRefCon(window); menu = GetMenuHandle(mEdit); EnableItem(menu, 0); DisableItem(menu, iUndo); DisableItem(menu, iCut); DisableItem(menu, iCopy); if (GetScrap(NULL, 'TEXT', &offset) == noTypeErr) DisableItem(menu, iPaste); else EnableItem(menu, iPaste); DisableItem(menu, iClear); EnableItem(menu, iSelectAlllastsess = s; lastrow = row; lastcol = col; while (StillDown()) { GetMouse(&localwhere); col = localwhere.h / font_width; row = localwhere.v / font_height; term_mouse(event->modifiers & shiftKey ? MB_EXTEND : MB_SELECT, MA_DRAG, col, row); if (row > rows - 1) term_scroll(0, row - (rows - 1)); else if (row < 0) term_scroll(0, row); } lastwhen = TickCount(); /* * Emacs magic: * Local Variables: * c-file-style: "simon" * End: */ Revision-number: 91 Prop-content-length: 232 Content-length: 232 K 7 svn:log V 133 First attempt at copying to the clipboard -- doesn't seem to work. Also a bug-fix in auto-scrolling when drag-selecting off the top. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-11T23:23:45.000000Z PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 7a253ab034e275273a270af276f48620 Text-delta-base-sha1: 6a13944de6a8ef47d2fa7779a6ad9bd00547df5d Text-content-length: 430 Text-content-md5: 4b3b86f8cb6052388e7b883a7d25dd13 Text-content-sha1: 00e222c780d849e28b03e866fab27a5956864d8e Content-length: 474 K 15 cvs2svn:cvs-rev V 8 1.1.2.18 PROPS-END SVN* $0cs/* $Id: macterm.c,v 1.1.2.18 1999/03/11 23:23:45= 0) term_scroll(0, row - 1); } term_mouse(event->modifiers & shiftKey ? MB_EXTEND : MB_SELECT, MA_RELEASE, col, row); lastwhen = TickCount(); } void write_clip(void *data, int len) { if (ZeroScrap() != noErr) return; PutScrap(len, 'TEXT', data); } void get_clip(void **p, int *lenp) { /* XXX: do something */ Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 8faabb0b3c9e57f69badfb8a1b955abc Text-delta-base-sha1: 27da7804054228b1ce2d339579cfb056f70ff116 Text-content-length: 98 Text-content-md5: 827f7b016389dc4019b4ed4380758bd1 Text-content-sha1: 873b8dd82894b469d590d0bdb80a3f8a3749ae89 Content-length: 141 K 15 cvs2svn:cvs-rev V 7 1.4.2.9 PROPS-END SVNJ~ LmLEifdef macintosh #define SEL_NL { 13 } #else #define SEL_NL { 13, 10 } #endif Revision-number: 92 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 1999-03-12T17:14:06.000000Z K 7 svn:log V 101 Add AltGr support at last! Thanks to for the technique if not all of the details. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bc5797a09917f80e479590f02c61d3ba Text-delta-base-sha1: 219f29771025fd7f40db02bc69df076bf51142ef Text-content-length: 2083 Text-content-md5: a03094b5b8802aa2305cf66f093dc203 Text-content-sha1: 697e32d1a8ab9595f83b1f9ba72e45b9bd8b1cba Content-length: 2122 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNv'nV>4XDeGRKEYUP: case WM_SYSKEYUP: /* * We handle KEYUP ourselves in order to distinghish left * and right Alt or Control keys, which Windows won't do * right if left to itself. See also the special processing * at the top of TranslateKey. */ { BYTE keystate[256]; int ret = GetKeyboardState(keystate); if (ret && wParam == VK_MENU) { if (lParam & 0x1000000) keystate[VK_RMENU] = 0; else keystate[VK_LMENU] = 0; SetKeyboardState (keystate); } if (ret && wParam == VK_CONTROL) { if (lParam & 0x1000000) keystate[VK_RCONTROL] = 0; else keystate[VK_LCONTROL] = 0; SetKeyboardState (keystate); } } /* * We don't return here, in order to allow Windows to do * its own KEYUP processing as well. */ break int cancel_alt = FALSE * Windows does not always want to distinguish left and right * Alt or Control keys. Thus we keep track of them ourselves. * See also the WM_KEYUP handler. */ if (wParam == VK_MENU) { if (lParam & 0x1000000) keystate[VK_RMENU] = 0x80; else keystate[VK_LMENU] = 0x80; SetKeyboardState (keystate); return 0; } if (wParam == VK_CONTROL) { if (lParam & 0x1000000) keystate[VK_RCONTROL] = 0x80; else keystate[VK_LCONTROL] = 0x80; SetKeyboardState (keystate); return 0; } /* * Prepend ESC, and cancel ALT, if ALT was pressed at the time * and it wasn't AltGr. */ if (lParam & 0x20000000 && (keystate[VK_LMENU] & 0x80)) { *p++ = 0x1B; cancel_alt = TRUE; }LeftALT * from the keymap, since its sole effect should be to prepend * ESC, which we've already done. Note that removal of LeftALT * has to happen _after_ the above call to SetKeyboardState, or * dire things will befall. */ if (cancel_alt) { keystate[VK_MENU] = keystate[VK_RMENU]; keystate[VK_LMENU] = 0; } Revision-number: 93 Prop-content-length: 246 Content-length: 246 K 7 svn:log V 147 Mac OS Makefile renamed to not have a >8.3 file name. Since this stops BuildProgram working, I've created a modified BuildProgram as mkputty.mpw. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-13T16:51:46.000000Z PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 2565 Text-content-md5: da372a19dff9ad2e9fb7790970d3e824 Text-content-sha1: e636eb9bba71356ca87853b042e6c5f62d2611eb Content-length: 2685 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNwww# $Id: Makefile.mpw,v 1.1.2.1 1999/03/13 16:51:46 ben Exp $ # This is the Makefile for building PuTTY for the Mac OS. # Users of non-Mac systems will see some pretty strange characters around. MAKEFILE = Makefile.mpw MondoBuild = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified Includes = Sym68K = ObjDir68K = COptions = {Includes} {Sym68K} -proto strict -opt all Objects68K = "{ObjDir68K}mac.c.o" "{ObjDir68K}maccfg.c.o" "{ObjDir68K}macterm.c.o" "{ObjDir68K}misc.c.o" # "{ObjDir68K}ssh.c.o" # "{ObjDir68K}sshcrc.c.o" # "{ObjDir68K}sshdes.c.o" # "{ObjDir68K}sshmd5.c.o" # "{ObjDir68K}sshrand.c.o" # "{ObjDir68K}sshrsa.c.o" # "{ObjDir68K}sshsha.c.o" # "{ObjDir68K}telnet.c.o" "{ObjDir68K}terminal.c.o" "{ObjDir68K}testback.c.o" PuTTY {MondoBuild} {Objects68K} Link -o {Targ} -d {Sym68K} {Objects68K} -t 'APPL' -c 'pTTY' #"{Libraries}MathLib.o" #"{CLibraries}Complex.o" "{CLibraries}StdCLib.o" "{Libraries}MacRuntime.o" "{Libraries}IntEnv.o" #"{Libraries}ToolLibs.o" "{Libraries}Interface.o" PuTTY {MondoBuild} mac_res.r macresid.h Rez mac_res.r -o {Targ} {Includes} -append "{ObjDir68K}mac.c.o" {MondoBuild} mac.c putty.h mac.h macresid.h {C} mac.c -o {Targ} {COptions} "{ObjDir68K}maccfg.c.o" {MondoBuild} maccfg.c putty.h mac.h macresid.h {C} maccfg.c -o {Targ} {COptions} "{ObjDir68K}macterm.c.o" {MondoBuild} macterm.c mac.h putty.h {C} macterm.c -o {Targ} {COptions} "{ObjDir68K}misc.c.o" {MondoBuild} misc.c putty.h {C} misc.c -o {Targ} {COptions} "{ObjDir68K}ssh.c.o" {MondoBuild} ssh.c {C} ssh.c -o {Targ} {COptions} "{ObjDir68K}sshcrc.c.o" {MondoBuild} sshcrc.c {C} sshcrc.c -o {Targ} {COptions} "{ObjDir68K}sshdes.c.o" {MondoBuild} sshdes.c {C} sshdes.c -o {Targ} {COptions} "{ObjDir68K}sshmd5.c.o" {MondoBuild} sshmd5.c {C} sshmd5.c -o {Targ} {COptions} "{ObjDir68K}sshrand.c.o" {MondoBuild} sshrand.c {C} sshrand.c -o {Targ} {COptions} "{ObjDir68K}sshrsa.c.o" {MondoBuild} sshrsa.c {C} sshrsa.c -o {Targ} {COptions} "{ObjDir68K}sshsha.c.o" {MondoBuild} sshsha.c {C} sshsha.c -o {Targ} {COptions} "{ObjDir68K}telnet.c.o" {MondoBuild} telnet.c {C} telnet.c -o {Targ} {COptions} "{ObjDir68K}terminal.c.o" {MondoBuild} terminal.c putty.h {C} terminal.c -o {Targ} {COptions} "{ObjDir68K}testback.c.o" {MondoBuild} testback.c putty.h {C} testback.c -o {Targ} {COptions} Node-path: putty-ben-mac-port/mkputty.mpw Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 895 Text-content-md5: 244d2e0ac9f229f4b9fa9469652a27b6 Text-content-sha1: 3b928ebf19d509a11a04fdfa87bb3cd775439115 Content-length: 1015 K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNqqqSet program PuTTY Set makefile Makefile.mac # Run Make, then execute its output. Echo "# `Date -t` ----- Build of {program}." Echo "# `Date -t` ----- Analyzing dependencies." Begin Echo "Set Echo 1" Make {"Parameters"} -f "{makefile}" End > "{program}".makeout Echo "# `Date -t` ----- Executing build commands." "{program}".makeout Delete "{program}".makeout Echo "# `Date -t` ----- Done." Set type "`files -i -n -x t "{program}" OR "{type}" =~ / MPST/ # application or tool Echo -n t; Quote -n "{program}"; Echo -n " " Else If "{type}" =~ / DFIL/ # desk accessory in Suitcase Echo -n t Quote -n "Font/DA Mover" "{SystemFolder}"System "{program}"; Echo -n " # Install DA" Else If "{type}" =~ / dfil/ # desk accessory (System 7) Echo -n t Quote -n Duplicate -y "{program}" "{SystemFolder}Apple Menu Items"; Echo -n " # Install DA into Apple Menu" End Node-path: putty-ben-mac-port/PuTTY.make Node-action: delete Revision-number: 94 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 1999-03-13T16:57:30.000000Z K 7 svn:log V 46 Oops. Don't forget to rename the Makefile... K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 244d2e0ac9f229f4b9fa9469652a27b6 Text-delta-base-sha1: 3b928ebf19d509a11a04fdfa87bb3cd775439115 Text-content-length: 59 Text-content-md5: 0d2208b194c37c898d26a0da69ba2ab3 Text-content-sha1: 92af806c3d2cb305c0ba0c07205545f9b72f0b73 Content-length: 102 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVNqq+F+Set program PuTTY Set makefile Makefile.mpw Revision-number: 95 Prop-content-length: 109 Content-length: 109 K 7 svn:log V 11 Works now. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-13T18:20:14.000000Z PROPS-END Node-path: putty-ben-mac-port/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 0d2208b194c37c898d26a0da69ba2ab3 Text-delta-base-sha1: 92af806c3d2cb305c0ba0c07205545f9b72f0b73 Text-content-length: 368 Text-content-md5: 81cacd14a02c86aaa84d6dfe59e67d19 Text-content-sha1: 279150e9c619e74bd45d862f83220f3ad788aaf8 Content-length: 411 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVNqjT2!oXuy Dev:Null || Set Status 0`" Set CaseSensitive True #filetype check for DA must be case sensitive If "{type}" =~ / APPL/ OR "{type}" =~ / MPST/ # application or tool Echo -n t; Quote -n "{program}"; Echo -n " " Else If "{type}" =~ / DFIL/ # desk accessory in Suitcase Echo -n dfil/ # desk accessory (System 7) Echo -n Revision-number: 96 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 1999-03-13T18:22:47.000000Z K 7 svn:log V 20 Sane version number K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: ffc73653332c89bf539fe39bebc62aba Text-delta-base-sha1: 4facea16f058c6de6692493fcc331e343b77f000 Text-content-length: 197 Text-content-md5: 0de99b5a4085749661cf2930635efd79 Text-content-sha1: 192bfaa4af5c57ba8fbe620d506adc5e6394c57e Content-length: 241 K 15 cvs2svn:cvs-rev V 8 1.1.2.10 PROPS-END SVN44}/Frx%3/* $Id: mac_res.r,v 1.1.2.10 1999/03/13 18:22:47Dev 0.45 Mac 0", /* Short version (list views) */ "Dev 0.45 Mac 0Dev 0.45 Mac 0, Eric Young and Ben Harris Revision-number: 97 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 1999-03-13T18:23:24.000000Z K 7 svn:log V 35 Auto-scrolling now works properly. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 4b3b86f8cb6052388e7b883a7d25dd13 Text-delta-base-sha1: 00e222c780d849e28b03e866fab27a5956864d8e Text-content-length: 427 Text-content-md5: b964d7adcaaa97d919738f2e206fe53c Text-content-sha1: 4c9a0b2464305e2e243ecce37ae554f7c486fc62 Content-length: 471 K 15 cvs2svn:cvs-rev V 8 1.1.2.19 PROPS-END SVN*^%x@0@lnX'-;t*/* $Id: macterm.c,v 1.1.2.19 1999/03/13 18:23:24#define PTOCC(x) ((x) < 0 ? -(-(x - font_width - 1) / font_width) : \ (x) / font_width) #define PTOCR(y) ((y) < 0 ? -(-(y - font_height - 1) / font_height) : \ (y) / font_height)PTOCC(localwhere.h); row = PTOCR(localwhere.v)PTOCC(localwhere.h); row = PTOCR(localwhere.v) 0) term_scroll(0, rowSysBeep(30); Revision-number: 98 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 1999-03-14T13:08:44.000000Z K 7 svn:log V 87 Drag-select now autoscrolls more sensibly. Selected text now ends up in the clipboard. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 711293b9be3191d82620f245068abfcc Text-delta-base-sha1: b440228d26730c375c633ec07f7e797d78d90445 Text-content-length: 65 Text-content-md5: a0f9c37a825a6da19b6695ef8436a43b Text-content-sha1: 55d797aa9df1a8a04964bb1fe4cbcc5e115abe8d Content-length: 109 K 15 cvs2svn:cvs-rev V 8 1.1.2.15 PROPS-END SVN ,C,{/* $Id: mac.c,v 1.1.2.15 1999/03/14 13:08:43 Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: b964d7adcaaa97d919738f2e206fe53c Text-delta-base-sha1: 4c9a0b2464305e2e243ecce37ae554f7c486fc62 Text-content-length: 71 Text-content-md5: cb9c22aab51d6e24d3897f260a4fdd96 Text-content-sha1: b247e6288fc246b19dd4d3cc1fe863619406e00e Content-length: 115 K 15 cvs2svn:cvs-rev V 8 1.1.2.20 PROPS-END SVN^M 0"0{c/* $Id: macterm.c,v 1.1.2.20 1999/03/14 13:08:43 Node-path: putty-ben-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 48 Text-delta: true Text-delta-base-md5: 2f675c0197735b65784345dd0eb9745d Text-delta-base-sha1: 83a1f52ee22438484dc3e97b29f4886807afa609 Text-content-length: 323 Text-content-md5: 8002c21c0df61b25cf49bcf5c1ac507a Text-content-sha1: 6781255fb495e39e515000c220e1fc309928a068 Content-length: 371 K 15 cvs2svn:cvs-rev V 11 1.5.2.5.2.4 PROPS-END SVNQ'~',cx < 0) { x = cols - 1; y--; } else if (x >= cols) x = cols - 1; selpoint = disptop + y * (cols + 1) + x; if (selpoint < sbtop) selpoint = sbtop; else if (selpoint > scrtop + rows * (cols + 1) - 1) /* XXX put this in a variable? */ selpoint = scrtop + rows * (cols + 1) - 1 Revision-number: 99 Prop-content-length: 274 Content-length: 274 K 8 svn:date V 27 1999-03-14T15:48:35.000000Z K 7 svn:log V 175 There's something going wrong here. Occasional builds have difficulty loading the wordness resource. I've added extra diagnostics, but I haven't worked out what's going on. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/maccfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: e5f6762df1296c82d74601005866880e Text-delta-base-sha1: 37f7034097b5359b247b7d9eb415c535b7008d5a Text-content-length: 504 Text-content-md5: c7544a7086ac73662bafe5eac7c062d7 Text-content-sha1: 25cb6d72006f40e1ecf1165e505c4a83bff3c99f Content-length: 547 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVNx:P@.gq.NSk M/* $Id: maccfg.c,v 1.1.2.2 1999/03/14 15:48:35id %d (%d)", id, ResError()); memcpy(dst, *h, 256 * sizeof(short)); } #pragma options align=mac68k#pragma options align=reset || *h == NULL) fatalbox("Can't load settings"); if (GetResourceSizeOnDisk(h) != sizeof(struct pSET)) fatalbox("Settings resource is wrong size (%d vs %d)", GetResourceSizeOnDisk(h), sizeof(struct pSET) /* * Emacs magic: * Local Variables: * c-file-style: "simon" * End: */ Revision-number: 100 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 1999-03-14T15:50:19.000000Z K 7 svn:log V 70 Slightly corrected TMPL for pSET, but it still doesn't work properly. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 0de99b5a4085749661cf2930635efd79 Text-delta-base-sha1: 192bfaa4af5c57ba8fbe620d506adc5e6394c57e Text-content-length: 126 Text-content-md5: 51021520a6f070b7b21210ee33118e51 Text-content-sha1: 0017877d766434a7ef9783b4d5e6fe1b3d263c08 Content-length: 170 K 15 cvs2svn:cvs-rev V 8 1.1.2.11 PROPS-END SVN4q dm0 /* $Id: mac_res.r,v 1.1.2.11 1999/03/14 15:50:19type STR# ID", 'DWRD', "Termtype STR# index", 'DWRD Revision-number: 101 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 1999-03-14T15:51:34.000000Z K 7 svn:log V 67 Cursor painting is now _right_ and scrollbar removal works better. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: cb9c22aab51d6e24d3897f260a4fdd96 Text-delta-base-sha1: b247e6288fc246b19dd4d3cc1fe863619406e00e Text-content-length: 1670 Text-content-md5: 67751e3f4af06af1b1afdc5f7ad34b67 Text-content-sha1: d0c184125d6d576229ce6ca2ed13666b5504eebe Content-length: 1714 K 15 cvs2svn:cvs-rev V 8 1.1.2.21 PROPS-END SVNM3E#0A:ej ;=\C.=QSz/* $Id: macterm.c,v 1.1.2.21 1999/03/14 15:51:340 #define CURSOR_FG_BOLD 21 #define CURSOR_BG 22 #define CURSOR_B { PmBackColor(DEFAULT_BG); /* HideControl clears behind the control */ HideControl(s->scrollbar); }DisposeRgn(textrgn); /* Tell the window manager about it in case this isn't an update */, bright; a = (struct do_text_args *)cookie; bright = (a->attr & ATTR_BOLD) && cfg.bold_colour; if (a->attr & ATTR_REVERSE) TextMode(notSrcCopy); else TextMode(srcCopy)if (a->attr & ATTR_ACTCURS) TextMode((a->attr & ATTR_REVERSE) ? srcCopy : notSrcCopy); break; case 2: if (a->attr & ATTR_ACTCURS) { PmForeColor(bright ? CURSOR_FG_BOLD : CURSOR_FG); PmBackColor(CURSOR_BG); TextMode(srcCopy); } else { PmForeColor(bright ? DEFAULT_FG_BOLD : DEFAULT_FG); PmBackColor(DEFAULT_BG); } break; default: if (a->attr & ATTR_ACTCURS) { fgcolour = (bright ? CURSOR_FG_BOLD : CURSOR_FG); bgcolour = CURSOR_BG; TextMode(srcCopy); } else { fgcolour = ((a->attr & ATTR_FGMASK) >> ATTR_FGSHIFT) * 2; bgcolour = ((a->attr & ATTR_BGMASK) >> ATTR_BGSHIFT) * 2; if (bright) if (a->attr & ATTR_REVERSE) bgcolour++; else fgcolour++; } PmForeColor(fgcolour); PmBackColor(bgcolour); break; } MoveTo(a->textrect.left, a->textrect.top + a->s->font_ascent); DrawText(a->text, 0, a->len); if (a->attr & ATTR_PASCURS) { PenNormal(); switch (depth) { case 1: PenMode(patXor); break; default: PmForeColor(CURSOR_BG); break; } FrameRect(&a->textrect); } Revision-number: 102 Prop-content-length: 367 Content-length: 367 K 7 svn:log V 268 Attribute masking implemented. The variable attr_mask stored the current set of "interesting" attributes, and do_paint only takes those ones into account when deciding when to break style runs. Makes redraw quite a bit faster on displays which don't do ANSI colour. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-14T17:43:35.000000Z PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 67751e3f4af06af1b1afdc5f7ad34b67 Text-delta-base-sha1: d0c184125d6d576229ce6ca2ed13666b5504eebe Text-content-length: 995 Text-content-md5: d5bb3703d755b9f33e9c7ca74b9b8010 Text-content-sha1: 0da6308f50308a6af6403f30e51b8808ff8a37f1 Content-length: 1039 K 15 cvs2svn:cvs-rev V 8 1.1.2.22 PROPS-END SVN{=k0:t6(W lMRe7NA9LM/* $Id: macterm.c,v 1.1.2.22 1999/03/14 17:43:35pascal void mac_set_attr_maskattr_mask = ATTR_MASKget_ctx(free_ctx(NULLTextMode(a->attr & ATTR_REVERSE ? notSrcCopy : a->attr & ATTR_REVERSEbright ? CURSOR_FG_BOLD : CURSOR_FG Should probably be called start_redraw or something. */ struct mac_session *get_ctx(void) { struct mac_session *s = onlysession; attr_mask = ATTR_INVALID; DeviceLoop(s->window->visRgn, mac_set_attr_mask, (long)s, 0); return s; } static pascal void mac_set_attr_mask(short depth, short devflags, GDHandle device, long cookie) { switch (depth) { default: attr_mask |= ATTR_FGMASK | ATTR_BGMASK; /* FALLTHROUGH */ case 2: attr_mask |= ATTR_BOLD; /* FALLTHROUGH */ case 1: attr_mask |= ATTR_UNDER | ATTR_REVERSE | ATTR_ACTCURS | ATTR_PASCURS | ATTR_ASCII | ATTR_GBCHR | ATTR_LINEDRW | (cfg.bold_colour ? 0 : ATTR_BOLD); break; } Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 827f7b016389dc4019b4ed4380758bd1 Text-delta-base-sha1: 873b8dd82894b469d590d0bdb80a3f8a3749ae89 Text-content-length: 45 Text-content-md5: efa5c62aed7180d6df94cc8e94143df6 Text-content-sha1: 20ec208c56e2a967202c4d13521ed781950e022c Content-length: 89 K 15 cvs2svn:cvs-rev V 8 1.4.2.10 PROPS-END SVN~ I>@unsigned long attr_mask; Node-path: putty-ben-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 48 Text-delta: true Text-delta-base-md5: 8002c21c0df61b25cf49bcf5c1ac507a Text-delta-base-sha1: 6781255fb495e39e515000c220e1fc309928a068 Text-content-length: 50 Text-content-md5: 07a82d05ec8af0ba15551d713968e616 Text-content-sha1: 8092dfad49d60b2187841ab3485ee06c90ce6f53 Content-length: 98 K 15 cvs2svn:cvs-rev V 11 1.5.2.5.2.5 PROPS-END SVNQQ$g-4attr_maskattr_mask Revision-number: 103 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 1999-03-14T20:07:04.000000Z K 7 svn:log V 25 Tweaked build procedure. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: da372a19dff9ad2e9fb7790970d3e824 Text-delta-base-sha1: e636eb9bba71356ca87853b042e6c5f62d2611eb Text-content-length: 383 Text-content-md5: ccf9db383cb11f66a43de8257a2f9289 Text-content-sha1: 20b4a099c2bdc4362ba054133ad9bef6c40e9a2b Content-length: 426 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVNw*X<1WxyPU{q# $Id: Makefile.mpw,v 1.1.2.2 1999/03/14 20:07:04Libs68K ="{Libraries}Interface.o" PuTTY {Objects68K} {Libs68K} IF (`exists {Targ}.NJ`) ILink -o {Targ} {Sym68K} -t 'APPL' -c 'pTTY' -newerdeps {NewerDeps} ELSE ILink -o {Targ} {Sym68K} -t 'APPL' -c 'pTTY' {Objects68K} {Libs68K} END Revision-number: 104 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 1999-03-14T20:08:09.000000Z K 7 svn:log V 69 externed backends so I can safely turn on duplicate-symbol warnings. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: efa5c62aed7180d6df94cc8e94143df6 Text-delta-base-sha1: 20ec208c56e2a967202c4d13521ed781950e022c Text-content-length: 92 Text-content-md5: bd7255352b746f988545583a56ba00e8 Text-content-sha1: eda625807b0ea41946cadd3f790c93e0fa232a3c Content-length: 136 K 15 cvs2svn:cvs-rev V 8 1.4.2.11 PROPS-END SVN- FEF"}extern Backend telnet_backend; /* * Exports from ssh.c. */ extern Revision-number: 105 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 1999-03-14T20:09:03.000000Z K 7 svn:log V 66 Scrollbar now updates if a character appears while scrolled back. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 48 Text-delta: true Text-delta-base-md5: 07a82d05ec8af0ba15551d713968e616 Text-delta-base-sha1: 8092dfad49d60b2187841ab3485ee06c90ce6f53 Text-content-length: 65 Text-content-md5: 97498991802fb87d19b47fd455cc4f73 Text-content-sha1: df8b800f59bf4b3d1e515c7cd0af117ea7f77edd Content-length: 113 K 15 cvs2svn:cvs-rev V 11 1.5.2.5.2.6 PROPS-END SVNQi ()9 { update_sbar(); term_update(); } Revision-number: 106 Prop-content-length: 201 Content-length: 201 K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-14T20:43:51.000000Z K 7 svn:log V 102 Since Proff doesn't like me, I'll just print the number of elapsed ticks at the end of the test data. PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: d5bb3703d755b9f33e9c7ca74b9b8010 Text-delta-base-sha1: 0da6308f50308a6af6403f30e51b8808ff8a37f1 Text-content-length: 289 Text-content-md5: 7081c1c1fad082e916f19c4e5092c5f1 Text-content-sha1: 8de81695a05976112daf84f8f271b1e3a26d980c Content-length: 333 K 15 cvs2svn:cvs-rev V 8 1.1.2.23 PROPS-END SVN{0k0"($W/* $Id: macterm.c,v 1.1.2.23 1999/03/14 20:43:51 UInt32 starttime; char msg[128]starttime = TickCount(); display_resource('pTST', 128); sprintf(msg, "Elapsed ticks: %d\015\012", TickCount() - starttime); inbuf_putstr(msg); term_out( Revision-number: 107 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 1999-03-15T00:40:55.000000Z K 7 svn:log V 25 Colour icons, allegedly. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 51021520a6f070b7b21210ee33118e51 Text-delta-base-sha1: 0017877d766434a7ef9783b4d5e6fe1b3d263c08 Text-content-length: 3886 Text-content-md5: 14cc8343b57fcbc35932b9546d1cfab2 Text-content-sha1: 31c39158a84d6f494c466ee51d9675f3ad6e101e Content-length: 3930 K 15 cvs2svn:cvs-rev V 8 1.1.2.12 PROPS-END SVNqA '0cj/* $Id: mac_res.r,v 1.1.2.12 1999/03/15 00:40:5590FA0000 80020000" $"80020000 7FFC0000 40040000 7FFC", /* [2] */ $"00003FFE 00007FFF 00007FFF 00007FFF" $"00007FFF 00007FFF 00007FFF 00007FFF" $"00007FFF 0001FFFF 0003FFFF 0007FFFF" $"001FFFFF 7FFFFFFF FFFFFFFF FFFFFFFF" $"FFFFFFFE FFFF3FFE FFFE3FFE FFFE0000" $"FFFE0000 FFFE0000 FFFE0000 FFFE0000" $"FFFE0000 FFFE0000 FFFE0000 FFFE0000" $"FFFE0000 7FFC0000 7FFC0000 7FFC" } }; resource 'icl4' (128, purgeable) { $"000000000000000000FFFFFFFFFFFFF0" $"00000000000000000FCCCCCCCCCCCCCF" $"00000000000000000FCEEEEEEEEEEECF" $"00000000000000000FCE0D0D0D0D0CCF" $"00000000000000000FCED0FFD0D0D0CF" $"00000000000000000FCE0F1F0D0D0CCF" $"00000000000000000FCFF1F0D0D0D0CF" $"00000000000000000FF11F0D0D0D0CCF" $"00000000000000000F11F0D0D0D0D0CF" $"000000000000000FF11F0D0D0D0D0CCF" $"00000000000000F111FEC0C0C0C0C0CF" $"0000000000000F111FFFFFCCCCCCCCCF" $"00000000000FF111111111FCCCCCCCCF" $"0FFFFFFFFFF111111111FFCCCFFFFFCF" $"FCCCCCCCCCCFFFFF111F3CCCCCCCCCCF" $"FCEEEEEEEEEEECF111FCCCCCCCCCCCCF" $"FCE0D0D0D0D0FF11FFFFFFFFFFFFFFF0" $"FCED0D0D0D0DF11F00FCCCDDDEEEEAF0" $"FCE0D0D0D0DF11F000FFFFFFFFFFFFF0" $"FCED0D0D0DF1FFF00000000000000000" $"FCE0D0D0DF1FCCF00000000000000000" $"FCED0D0D0FFD0CF00000000000000000" $"FCE0D0D0D0D0CCF00000000000000000" $"FCEC0C0C0C0C0CF00000000000000000" $"FCCCCCCCCCCCCCF00000000000000000" $"FCCCCCCCCCCCCCF00000000000000000" $"FC88CCCCFFFFFCF00000000000000000" $"FC33CCCCCCCCCCF00000000000000000" $"FCCCCCCCCCCCCCF00000000000000000" $"0FFFFFFFFFFFFF000000000000000000" $"0FCCCDDDEEEEAF000000000000000000" $"0FFFFFFFFFFFFF" }; resource 'icl8' (128, purgeable) { $"000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF00" $"0000000000000000000000000000000000FF2B2B2B2B2B2B2B2B2B2B2B2B2BFF" $"0000000000000000000000000000000000FF2BFCFCFCFCFCFCFCFCFCFCFC2BFF" $"0000000000000000000000000000000000FF2BFC2A2A2A2A2A2A2A2A2A002BFF" $"0000000000000000000000000000000000FF2BFC2A2AFFFF2A2A2A2A2A002BFF" $"0000000000000000000000000000000000FF2BFC2AFF05FF2A2A2A2A2A002BFF" $"0000000000000000000000000000000000FF2BFFFF05FF2A2A2A2A2A2A002BFF" $"0000000000000000000000000000000000FFFF0505FF2A2A2A2A2A2A2A002BFF" $"0000000000000000000000000000000000FF0505FF2A2A2A2A2A2A2A2A002BFF" $"000000000000000000000000000000FFFF0505FF2A2A2A2A2A2A2A2A2A002BFF" $"0000000000000000000000000000FF050505FFFC000000000000000000002BFF" $"00000000000000000000000000FF050505FFFFFFFFFF2B2B2B2B2B2B2B2B2BFF" $"0000000000000000000000FFFF050505050505050505FF2B2B2B2B2B2B2B2BFF" $"00FFFFFFFFFFFFFFFFFFFF050505050505050505FFFF2B2B2BFFFFFFFFFF2BFF" $"FF2B2B2B2B2B2B2B2B2B2BFFFFFFFFFF050505FFD82B2B2B2B2B2B2B2B2B2BFF" $"FF2BFCFCFCFCFCFCFCFCFCFCFC2BFF050505FF2B2B2B2B2B2B2B2B2B2B2B2BFF" $"FF2BFC2A2A2A2A2A2A2A2A2AFFFF0505FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00" $"FF2BFC2A2A2A2A2A2A2A2A2AFF0505FF0000FF2BF7F8F9FAFAFBFBFCFCFDFF00" $"FF2BFC2A2A2A2A2A2A2A2AFF0505FF000000FFFFFFFFFFFFFFFFFFFFFFFFFF00" $"FF2BFC2A2A2A2A2A2A2AFF05FFFFFF0000000000000000000000000000000000" $"FF2BFC2A2A2A2A2A2AFF05FF002BFF0000000000000000000000000000000000" $"FF2BFC2A2A2A2A2A2AFFFF2A002BFF0000000000000000000000000000000000" $"FF2BFC2A2A2A2A2A2A2A2A2A002BFF0000000000000000000000000000000000" $"FF2BFC000000000000000000002BFF0000000000000000000000000000000000" $"FF2B2B2B2B2B2B2B2B2B2B2B2B2BFF0000000000000000000000000000000000" $"FF2B2B2B2B2B2B2B2B2B2B2B2B2BFF0000000000000000000000000000000000" $"FF2BE3E32B2B2B2BFFFFFFFFFF2BFF0000000000000000000000000000000000" $"FF2BD8D82B2B2B2B2B2B2B2B2B2BFF0000000000000000000000000000000000" $"FF2B2B2B2B2B2B2B2B2B2B2B2B2BFF0000000000000000000000000000000000" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000" $"00FF2BF7F8F9FAFAFBFBFCFCFDFF000000000000000000000000000000000000" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" Revision-number: 108 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 1999-03-15T14:22:45.000000Z K 7 svn:log V 10 macterm.c K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 7081c1c1fad082e916f19c4e5092c5f1 Text-delta-base-sha1: 8de81695a05976112daf84f8f271b1e3a26d980c Text-content-length: 685 Text-content-md5: b918ba2fcf271fc4e96192ebdbaae082 Text-content-sha1: 48d422dbeb378fe5246f9ec765332356275f85f7 Content-length: 729 K 15 cvs2svn:cvs-rev V 8 1.1.2.24 PROPS-END SVN0=br0Rn?;L^+(+0THh/* $Id: macterm.c,v 1.1.2.24 1999/03/15 14:22:45#include wctab == NULL) s->wctab = (WCTabHandle)NewHandle(sizeof(**s->wctab)); if (s->wctab == NULL) return; /* do without */ (*s->wctab)->wCSeed = 0; (*s->wctab)->wCReserved = 0; (*s->wctab)->ctSize = 0; (*s->wctab)->ctTable[0].value = wContentColor; (*s->wctab)->ctTable[0].rgb = (*s->palette)->pmInfo[DEFAULT_BG].ciRGB; SetWinColor(s->window, s->wctabif (first[n] == DEFAULT_BG) mac_adjustwinbg(smac_adjustwinbg( Revision-number: 109 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 1999-03-15T22:27:04.000000Z K 7 svn:log V 128 Split off copy and paste functionality from term_mouse.c so it can be used from menu items without faking up a term_mouse call. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 48 Text-delta: true Text-delta-base-md5: 97498991802fb87d19b47fd455cc4f73 Text-delta-base-sha1: df8b800f59bf4b3d1e515c7cd0af117ea7f77edd Text-content-length: 1454 Text-content-md5: 2ff2e04b1fb644d68468949e10575495 Text-content-sha1: 9758283ec505929c123fc2d3b011394bec72b931 Content-length: 1502 K 15 cvs2svn:cvs-rev V 11 1.5.2.5.2.7 PROPS-END SVNi| 2;%Delect if (selstate == DRAGGING) { term_copy(); selstate = SELECTED; } else selstate = NO_SELECTION; else if (b == MB_PASTE && (a==MA_CLICK || a==MA_2CLK || a==MA_3CLK)) term_paste(); term_update(); } /* * We've completed a selection. We now transfer the * data to the clipboard. */ void term_copy() { unsigned char *p = selspace; unsigned long *q = selstart; while (q < selend) { int nl = FALSE; unsigned long *lineend = q - (q-text) % (cols+1) + cols; unsigned long *nlpos = lineend; if (!(*nlpos & ATTR_WRAPPED)) { while ((nlpos[-1] & CHAR_MASK) == 0x20 && nlpos > q) nlpos--; if (nlpos < selend) nl = TRUE; } while (q < nlpos && q < selend) *p++ = (unsigned char) (*q++ & CHAR_MASK); if (nl) { int i; for (i=0; isend (q, p-q); if (p <= data+len-sizeof(sel_nl) && !memcmp(p, sel_nl, sizeof(sel_nl))) { back->send ("\015", 1); p += sizeof(sel_nl); } q = p; } } get_clip(NULL, NULL Revision-number: 110 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 1999-03-15T22:27:36.000000Z K 7 svn:log V 31 added term_copy and term_paste K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: bd7255352b746f988545583a56ba00e8 Text-delta-base-sha1: eda625807b0ea41946cadd3f790c93e0fa232a3c Text-content-length: 53 Text-content-md5: cc1f3f8e10c56282315c7b38a4cc4aec Text-content-sha1: 465f6f69bdf6818b70ef862c44d888ebd939788c Content-length: 97 K 15 cvs2svn:cvs-rev V 8 1.4.2.12 PROPS-END SVN-Z \^Ocopy(void); void term_paste(void Revision-number: 111 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:50.611468Z PROPS-END Revision-number: 112 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:50.617324Z PROPS-END Revision-number: 113 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:50.623568Z PROPS-END Revision-number: 114 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:50.629911Z PROPS-END Revision-number: 115 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:50.635970Z PROPS-END Revision-number: 116 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:50.642461Z PROPS-END Revision-number: 117 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:50.649254Z PROPS-END Revision-number: 118 Prop-content-length: 240 Content-length: 240 K 7 svn:log V 141 The edit menu is now mostly functional. I'm not sure about paste, since I haven't got a working backend at the moment, but it all looks OK. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-16T20:27:31.000000Z PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: ccf9db383cb11f66a43de8257a2f9289 Text-delta-base-sha1: 20b4a099c2bdc4362ba054133ad9bef6c40e9a2b Text-content-length: 90 Text-content-md5: 092a416a39a8384ba36bb3f37f7167cc Text-content-sha1: bc242b11f53e2db68f5d97a5a8171de8bd2222fc Content-length: 133 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVN*F?O1hyPZ# $Id: Makefile.mpw,v 1.1.2.3 1999/03/16 20:27:30compactcompact Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: a0f9c37a825a6da19b6695ef8436a43b Text-delta-base-sha1: 55d797aa9df1a8a04964bb1fe4cbcc5e115abe8d Text-content-length: 941 Text-content-md5: 20d5e9af033edcff23c64fc3a211c3e4 Text-content-sha1: 8bdb6216674b1f92e4a3be11a06602b3395f4bde Content-length: 985 K 15 cvs2svn:cvs-rev V 8 1.1.2.16 PROPS-END SVN ".sW,%W9|YZ|Q /* $Id: mac.c,v 1.1.2.16 1999/03/16 20:27:30 WindowPtr window; menu = HiWord(result); item = LoWord(result); window = FrontWindow(); /* Things which do the same whatever window we're in. */ if (windows.about) SelectWindow(windows.about); else windows.about = GetNewDialog(wAbout, NULL, (WindowPtr)-1); goto donegoto donegoto done; case iClose: mac_closewindow(window); goto done; case iQuit: mac_shutdown(); goto done; } break; } /* If we get here, handling is up to window-specific code. */ switch (mac_windowtype(window)) { case wTerminal: mac_menuterm(window, menu, item); break; } done:case wAbout: windows.about = NULL; CloseWindow(window);if (window != NULL) EnableItem(menu, iClose); else DisableItem(menu, iClose Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: f56ee91fa9a2762e9437efa177546766 Text-delta-base-sha1: 22d773b1d63ba1e85579f702d6a3798572f3bebc Text-content-length: 68 Text-content-md5: 8d4bc9b6626686b0d3f04cc153952fea Text-content-sha1: d96e88a6b5fdf72a733c3681ae70877cdd5ad4b8 Content-length: 111 K 15 cvs2svn:cvs-rev V 7 1.1.2.7 PROPS-END SVNS 0Eextern void mac_menuterm(WindowPtr, short, short Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 14cc8343b57fcbc35932b9546d1cfab2 Text-delta-base-sha1: 31c39158a84d6f494c466ee51d9675f3ad6e101e Text-content-length: 320 Text-content-md5: 95ea6ad7153828ffe6a2c85cf2af2012 Text-content-sha1: 90e63c68963b8b56c7619c7649e09103a9136e71 Content-length: 364 K 15 cvs2svn:cvs-rev V 8 1.1.2.13 PROPS-END SVNA~' +0z @H~JDE@c^/* $Id: mac_res.r,v 1.1.2.13 1999/03/16 20:27:30 1999 Ben Harris\n" "Portions copyright 1993 Eric Young\n" "Portions copyright 1986 Gary S. Brown\n" "\n"Selection options */ boolean no_implicit_copy, implicit_copy no_implicit_copyImplicit copy Node-path: putty-ben-mac-port/maccfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: c7544a7086ac73662bafe5eac7c062d7 Text-delta-base-sha1: 25cb6d72006f40e1ecf1165e505c4a83bff3c99f Text-content-length: 190 Text-content-md5: 21f4645de9d9f3b058165819c89a1c5b Text-content-sha1: 636ecdf79ab31ba034c8eef68909a75b41844229 Content-length: 233 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVN:B!.VJp/* $Id: maccfg.c,v 1.1.2.3 1999/03/16 20:27:30unsigned long selection_flags; #define IMPLICIT_COPYcfg->implicit_copy = (s->selection_flags & IMPLICIT_COPY) != 0; Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: b918ba2fcf271fc4e96192ebdbaae082 Text-delta-base-sha1: 48d422dbeb378fe5246f9ec765332356275f85f7 Text-content-length: 1269 Text-content-md5: e6f80520de204b33fb0e8e63b5c8b2a2 Text-content-sha1: 6958828b76d5d5d0a58233f9739b9a71c101e01b Content-length: 1313 K 15 cvs2svn:cvs-rev V 8 1.1.2.25 PROPS-END SVNC$0K.0o]V7rQ0#@V7I_%?D/* $Id: macterm.c,v 1.1.2.25 1999/03/16 20:27:31Memoryvoid mac_drawgrowicon(struct mac_session *sif (term_hasselection()) EnableItem(menu, iCopy); else menuterm(WindowPtr window, short menu, short itemswitch (menu) { case mEdit: switch (item) { case iCopy: term_copy(); break; case iPaste: term_paste(); break; } } } static Handle h = NULL; long offset; if (p == NULL) { /* release memory */ if (h != NULL) DisposeHandle(h); h = NULL; } else if (GetScrap(NULL, 'TEXT', &offset) > 0) { h = NewEmptyHandle(); *lenp = GetScrap(h, 'TEXT', &offset); HLock(h); *p = *h; } else { *p = NULL; *lenp = 0; } mac_drawgrowicon(s); } void mac_updateterm(WindowPtr windowmac_drawgrowicon(s); free_ctx(NULL); EndUpdate(window); } static void mac_drawgrowicon(struct mac_session *s) { Rect clip; SetPort(s->window); /* Stop DrawGrowIcon giving us space for a horizontal scrollbar */ SetRect(&clip, s->window->portRect.right - 15, SHRT_MIN, SHRT_MAX, SHRT_MAX); ClipRect(&clip); DrawGrowIcon(s->window); clip.left = SHRT_MIN; ClipRect(&clip); } Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: cc1f3f8e10c56282315c7b38a4cc4aec Text-delta-base-sha1: 465f6f69bdf6818b70ef862c44d888ebd939788c Text-content-length: 74 Text-content-md5: 15556a596086eaa4fee0de77683229c7 Text-content-sha1: 80a6d5206cbea98e908b5c346a6ca058417a800a Content-length: 118 K 15 cvs2svn:cvs-rev V 8 1.4.2.13 PROPS-END SVNZ /_ cw int implicit_copy; #ifint term_hasselection Node-path: putty-ben-mac-port/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 48 Text-delta: true Text-delta-base-md5: 2ff2e04b1fb644d68468949e10575495 Text-delta-base-sha1: 9758283ec505929c123fc2d3b011394bec72b931 Text-content-length: 164 Text-content-md5: a45f6993e5cdbf9fba568d58a0e580ec Text-content-sha1: 12c14cf6111771a91a7384e5c0711496ffefc20c Content-length: 212 K 15 cvs2svn:cvs-rev V 11 1.5.2.5.2.8 PROPS-END SVN|sjsi$Xif (cfg.implicit_copy) /* * Find out if there's a selection. */ int term_hasselection(void) { return selstate == SELECTED Revision-number: 119 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:50.779080Z PROPS-END Revision-number: 120 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:50.784706Z PROPS-END Revision-number: 121 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 1999-03-17T21:53:34.000000Z K 7 svn:log V 25 ignore ILink state files K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 102 Content-length: 102 K 10 svn:ignore V 70 *.pdb *.ilk *.res *.RES *.pch *.rsp *.rsrc *.makeout .AppleDouble *.NJ PROPS-END Node-path: putty-ben-mac-port/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 545c2596ac03f388ae41530fbc5542df Text-delta-base-sha1: 87e65f5d246f6bf3faa0f2d41880e2fff1d6c9f3 Text-content-length: 19 Text-content-md5: e5c0b3bc7418dd533fac6997f9f839b7 Text-content-sha1: bdeaa99bfe986740a355059bdc64df94007af060 Content-length: 62 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVNBGA *.NJ Revision-number: 122 Prop-content-length: 279 Content-length: 279 K 8 svn:date V 27 1999-03-18T00:04:34.000000Z K 7 svn:log V 180 Backends now seem to work. Pasting still doesn't. macterm.c now uses UPPs for a few things so that it should work if compiled natively for the PowerPC. Not tested it yet though. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: e6f80520de204b33fb0e8e63b5c8b2a2 Text-delta-base-sha1: 6958828b76d5d5d0a58233f9739b9a71c101e01b Text-content-length: 934 Text-content-md5: 69726fa08531ac697d5629739f7851e8 Text-content-sha1: 017366fcb693f3db9d4bc64fd875facf549bdce1 Content-length: 978 K 15 cvs2svn:cvs-rev V 8 1.1.2.26 PROPS-END SVNY3e;03]5:pfeg,jR(y /* $Id: macterm.c,v 1.1.2.26 1999/03/18 00:04:34MixedMode#ifdef USES_ROUTINE_DESCRIPTORS static RoutineDescriptor mac_scrolltracker_upp = BUILD_ROUTINE_DESCRIPTOR(uppControlActionProcInfo, (ProcPtr)mac_scrolltracker); static RoutineDescriptor do_text_for_device_upp = BUILD_ROUTINE_DESCRIPTOR(uppDeviceLoopDrawingProcInfo, (ProcPtr)do_text_for_device); static RoutineDescriptor mac_set_attr_mask_upp = BUILD_ROUTINE_DESCRIPTOR(uppDeviceLoopDrawingProcInfo, (ProcPtr)mac_set_attr_mask); #else /* not USES_ROUTINE_DESCRIPTORS */ #define mac_scrolltracker_upp mac_scrolltracker #define do_text_for_device_upp do_text_for_device #define mac_set_attr_mask_upp mac_set_attr_mask #endif /* not USES_ROUTINE_DESCRIPTORS */ back = &loop_backend;&mac_scrolltracker_uppback->send((char *)buf, len&do_text_for_device_upp&mac_set_attr_mask_upp Node-path: putty-ben-mac-port/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: bda2e2e0f166f383e37156566d980ab2 Text-delta-base-sha1: 45ab149a14e4b8ad8b452fa09d0bfd7e6aa2b24d Text-content-length: 77 Text-content-md5: 56a0f45508820d18b8b7a38314238d2a Text-content-sha1: 4fc860b1c8ba4bf4c6ea250bd36a20a04ad2ffba Content-length: 120 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVN2c0I>]/* $Id: testback.c,v 1.1.2.2 1999/03/18 00:04:34op Revision-number: 123 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 1999-03-21T23:23:43.000000Z K 7 svn:log V 100 Pointer-shape canging added -- we now have an I-beam cursor in the terminal window. Pasting works! K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 20d5e9af033edcff23c64fc3a211c3e4 Text-delta-base-sha1: 8bdb6216674b1f92e4a3be11a06602b3395f4bde Text-content-length: 1055 Text-content-md5: 65b5ab5a29f2bd02e9ddc0820eb0afb4 Text-content-sha1: 58dc32fb085da0041bfc0762cd87841cb6bff372 Content-length: 1099 K 15 cvs2svn:cvs-rev V 8 1.1.2.17 PROPS-END SVN"x,WB BA/* $Id: mac.c,v 1.1.2.17 1999/03/21 23:23:42RgnHandle RgnHandle cursrgn; cursrgn = NewRgn(); for (;;) { mac_adjustcursor(cursrgn); gotevent = WaitNextEvent(everyEvent, &event, LONG_MAX, cursrgn); mac_adjustcursor(cursrgn); if (gotevent) mac_event(&event); } DisposeRgn(cursrgn);RgnHandle cursrgn) { Point mouse; WindowPtr window, front; short part; GetMouse(&mouse); LocalToGlobal(&mouse); part = FindWindow(mouse, &window); front = FrontWindow(); if (part != inContent || window == NULL || window != front) { /* Cursor isn't in the front window, so switch to arrow */ SetCursor(&qd.arrow); SetRectRgn(cursrgn, SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX); if (front != NULL) DiffRgn(cursrgn, front->visRgn, cursrgn); } else { switch (mac_windowtype(window)) { case wTerminal: mac_adjusttermcursor(window, mouse, cursrgn); break; default: SetCursor(&qd.arrow); CopyRgn(window->visRgn, cursrgn); break; } } Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 8d4bc9b6626686b0d3f04cc153952fea Text-delta-base-sha1: d96e88a6b5fdf72a733c3681ae70877cdd5ad4b8 Text-content-length: 55 Text-content-md5: 98c68dded72a4e59fa0444106884f102 Text-content-sha1: ea8af190e9ac2ad3f435873e6bac6e036eafe58b Content-length: 98 K 15 cvs2svn:cvs-rev V 7 1.1.2.8 PROPS-END SVNE "<gcursor(WindowPtr, Point, RgnHandle Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 69726fa08531ac697d5629739f7851e8 Text-delta-base-sha1: 017366fcb693f3db9d4bc64fd875facf549bdce1 Text-content-length: 941 Text-content-md5: e57fdef7db20a8200d7d73e0b51d6f26 Text-content-sha1: c829e92c9d0b274338f31fc97b78bc06336dcf0a Content-length: 985 K 15 cvs2svn:cvs-rev V 8 1.1.2.27 PROPS-END SVNY+!~'0 re4M1~[/* $Id: macterm.c,v 1.1.2.27 1999/03/21 23:23:42Set the cursor shape correctly */ void mac_adjusttermcursor(WindowPtr window, Point mouse, RgnHandle cursrgn) { struct mac_session *s; ControlHandle control; short part; int x, y; SetPort(window); s = (struct mac_session *)GetWRefCon(window)SetCursor(&qd.arrow); RectRgn(cursrgn, &(*s->scrollbar)->contrlRect); SectRgn(cursrgn, window->visRgn, cursrgn); } else { x = mouse.h / font_width; y = mouse.v / font_height; SetCursor(*GetCursor(iBeamCursor)); /* Ask for shape changes if we leave this character cell. */ SetRectRgn(cursrgn, x * font_width, y * font_height, (x + 1) * font_width, (y + 1) * font_height); SectRgn(cursrgn, window->visRgn, cursrgn); }Handle(0); *lenp = GetScrap(h, 'TEXT', &offset); HLock(h); *p = *h; if (*p == NULL || *lenp <= 0) fatalbox("Empty scrap") Node-path: putty-ben-mac-port/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 56a0f45508820d18b8b7a38314238d2a Text-delta-base-sha1: 4fc860b1c8ba4bf4c6ea250bd36a20a04ad2ffba Text-content-length: 103 Text-content-md5: 5ff67219df85022dbd7f636209023f60 Text-content-sha1: 40e4204e6548fbed3ad050474218621269035ad1 Content-length: 146 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVN? R0[A/* $Id: testback.c,v 1.1.2.3 1999/03/21 23:23:43 term_out(); term_update(); Revision-number: 124 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 1999-03-23T00:43:46.000000Z K 7 svn:log V 53 Fonts with leading and/or the wrong widMax now work. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: e57fdef7db20a8200d7d73e0b51d6f26 Text-delta-base-sha1: c829e92c9d0b274338f31fc97b78bc06336dcf0a Text-content-length: 585 Text-content-md5: e7514c8b107b5364a1bdd57046e01c44 Text-content-sha1: d4fd91bc18f709c1430c9ac62ffa34fd9b0ba243 Content-length: 629 K 15 cvs2svn:cvs-rev V 8 1.1.2.28 PROPS-END SVN+E,70a2M_"98+XM^/* $Id: macterm.c,v 1.1.2.28 1999/03/23 00:43:46int font_leadingCharWidth('W'); /* Well, it's what NCSA uses. */ s->font_ascent = fi.ascent; s->font_leading = fi.leading; font_height = s->font_ascent + fi.descent + s->font_leadingRect leadif (s->font_leading > 0) SetRect(&a.leadrect, a.textrect.left, a.textrect.bottom - s->font_leading, a.textrect.right, a.textrect.bottom); else SetRect(&a.leadrect, 0, 0, 0, 0)if (a->attr & ATTR_REVERSE) PaintRect(&a->leadrect); else EraseRect(&a->leadrect); Revision-number: 125 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 1999-03-23T17:14:00.000000Z K 7 svn:log V 42 Change default mouse pointer to an I-beam K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a03094b5b8802aa2305cf66f093dc203 Text-delta-base-sha1: 697e32d1a8ab9595f83b1f9ba72e45b9bd8b1cba Text-content-length: 29 Text-content-md5: a08ba785e147f346e537e30b25d39d0a Text-content-sha1: 3463c0e343c2144e2206646407dd9271d5a9940c Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNvv -D2IBEAM Revision-number: 126 Prop-content-length: 257 Content-length: 257 K 8 svn:date V 27 1999-03-23T17:21:44.000000Z K 7 svn:log V 156 Add SSH_STATE_CLOSED to prevent accidentally sending resizes down a closed connection; was causing process hangs under NT and whole- system hangs under '95 K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bc60054c910b5809b643a6dc237eea1a Text-delta-base-sha1: bc7864e87f1ce9d0e75d47b19edee8ee644cfeb6 Text-content-length: 176 Text-content-md5: b3d68f198bb319f38eb97ecd7ec13088 Text-content-sha1: a4040437b4516829d2c9586b32686079723556c8 Content-length: 215 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN,'~~z2, SSH_STATE_CLOSED */ ssh_state = SSH_STATE_CLOSED; ssh_state = SSH_STATE_CLOSED case SSH_STATE_CLOSED Revision-number: 127 Prop-content-length: 255 Content-length: 255 K 8 svn:date V 27 1999-03-23T21:00:05.000000Z K 7 svn:log V 156 Ha! Nasty intermittent bug nailed (I think)! "That word, resLocked: I do not think it means what you think it means." HLock seems to be my friend though. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/maccfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 21f4645de9d9f3b058165819c89a1c5b Text-delta-base-sha1: 636ecdf79ab31ba034c8eef68909a75b41844229 Text-content-length: 392 Text-content-md5: 3c7ec027dd1d30056d8a443e73aaeb15 Text-content-sha1: 7afead8bb9f1dd91bc85983b3ff620c20a365bf3 Content-length: 435 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVNBgC8vjX/* $Id: maccfg.c,v 1.1.2.4 1999/03/23 21:00:05 ben Exp $ */ /* * maccfg.c -- Mac port configuration */ #include #include #include #include HLock(h); if (GetHandleSize(h) != sizeof(struct pSET)) fatalbox("Settings resource is wrong size (%d vs %d)", GetHandleSize(h), sizeof(struct pSET)HUnlock(h Revision-number: 128 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:51.111327Z PROPS-END Revision-number: 129 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:51.119228Z PROPS-END Revision-number: 130 Prop-content-length: 264 Content-length: 264 K 8 svn:date V 27 1999-03-27T15:39:46.000000Z K 7 svn:log V 165 General cleanup because MrC is rather pickier than SC. Not that the PPC build actually links, you understand, but it does most of the rest of the things it should. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 092a416a39a8384ba36bb3f37f7167cc Text-delta-base-sha1: bc242b11f53e2db68f5d97a5a8171de8bd2222fc Text-content-length: 2789 Text-content-md5: eac30600d770fd1eb43730cef4efdf05 Text-content-sha1: 28970a599c1c6e9d92adf23bab67a462f31281c3 Content-length: 2832 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVNFwT#1 .+|;Yc5lqmpeah*_fT_= _n:msbmXb =# $Id: Makefile.mpw,v 1.1.2.4 1999/03/27 15:39:45SymPPC = ObjDirPPC = COptions = {Includes} {Sym68K} -proto strict -opt all PPCCOptions = {Includes} {SymPPC} -opt size ObjectsPPC = "{ObjDirPPC}mac.c.x" "{ObjDirPPC}maccfg.c.x" "{ObjDirPPC}macterm.c.x" "{ObjDirPPC}misc.c.x" # "{ObjDirPPC}ssh.c.x" # "{ObjDirPPC}sshcrc.c.x" # "{ObjDirPPC}sshdes.c.x" # "{ObjDirPPC}sshmd5.c.x" # "{ObjDirPPC}sshrand.c.x" # "{ObjDirPPC}sshrsa.c.x" # "{ObjDirPPC}sshsha.c.x" # "{ObjDirPPC}telnet.c.x" "{ObjDirPPC}terminal.c.x" "{ObjDirPPC}testback.c.x" LibsPPC = "{SharedLibraries}InterfaceLib" "{SharedLibraries}StdCLib" "{SharedLibraries}MathLib" "{PPCLibraries}StdCRuntime.o" "{PPCLibraries}PPCCRuntime.o" "{PPCLibraries}PPCToolLibs.o" PuTTY.ppc {MondoBuild} {ObjectsPPC} PPCLink -o {Targ} {SymPPC} {ObjectsPPC} -t 'APPL' -c 'pTTY' {LibsPPC} "{ObjDirPPC}mac.c.x" {MondoBuild} mac.c putty.h mac.h macresid.h {PPCC} mac.c -o {Targ} {PPCCOptions} "{ObjDirPPC}maccfg.c.x" {MondoBuild} maccfg.c putty.h mac.h macresid.h {PPCC} maccfg.c -o {Targ} {PPCCo"{ObjDirPPC}macterm.c.x" {MondoBuild} macterm.c mac.h putty.h {PPCC} macterm.c -o {Targ} {PPCCo"{ObjDirPPC}misc.c.x" {MondoBuild} misc.c putty.h {PPCC} misc.c -o {Targ} {PPCCoptions} "{ObjDir68K}ssh.c.o" {MondoBuild} ssh.c {C} ssh.c -o {Targ} {COptions} "{ObjDirPPC}ssh.c.x" {MondoBuild} ssh.c {PPCC} ssh.c -o {Targ} {PPCCoptions} "{ObjDir68K}sshcrc.c.o" {MondoBuild} sshcrc.c {C} sshcrc.c -o {Targ} {COptions} "{ObjDirPPC}sshcrc.c.x" {MondoBuild} sshcrc.c {PPCC} sshcrc.c -o {Targ} {PPCCo"{ObjDirPPC}sshdes.c.x" {MondoBuild} sshdes.c {PPCC} sshdes.c -o {Targ} {PPCCo"{ObjDirPPC}sshmd5.c.x" {MondoBuild} sshmd5.c {PPCC} sshmd5.c -o {Targ} {PPCCoptions} "{ObjDir68K}sshrand.c.o" {MondoBuild} sshrand.c {C} sshrand.c -o {Targ} {COptions} "{ObjDirPPC}sshrand.c.x" {MondoBuild} sshrand.c {PPCC} sshrand.c -o {Targ} {PPCCo"{ObjDirPPC}sshrsa.c.x" {MondoBuild} sshrsa.c {PPCC} sshrsa.c -o {Targ} {PPCCoptions} "{ObjDir68K}sshsha.c.o" {MondoBuild} sshsha.c {C} sshsha.c -o {Targ} {COptions} "{ObjDirPPC}sshsha.c.x" {MondoBuild} sshsha.c {PPCC} sshsha.c -o {Targ} {PPCCoptions} "{ObjDir68K}telnet.c.o" {MondoBuild} telnet.c {C} telnet.c -o {Targ} {COptions} "{ObjDirPPC}telnet.c.x" {MondoBuild} telnet.c {PPCC} telnet.c -o {Targ} {PPCCo"{ObjDirPPC}terminal.c.x" {MondoBuild} terminal.c putty.h {PPCC} terminal.c -o {Targ} {PPCCo"{ObjDirPPC}testback.c.x" {MondoBuild} testback.c putty.h {PPCC} testback.c -o {Targ} {PPCCo Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 65b5ab5a29f2bd02e9ddc0820eb0afb4 Text-delta-base-sha1: 58dc32fb085da0041bfc0762cd87841cb6bff372 Text-content-length: 210 Text-content-md5: 2d4286266a2ca4016d5ee66144cb7b66 Text-content-sha1: 62225c80cbc63a4ace241f24697c3e263b92d3e5 Content-length: 254 K 15 cvs2svn:cvs-rev V 8 1.1.2.18 PROPS-END SVNl+:,~ }#"LS/* $Id: mac.c,v 1.1.2.18 1999/03/27 15:39:45 /* Mac OS 8.5 Window Manager? */ if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr) mac_gestalts.wind Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 98c68dded72a4e59fa0444106884f102 Text-delta-base-sha1: ea8af190e9ac2ad3f435873e6bac6e036eafe58b Text-content-length: 96 Text-content-md5: f18c85bb5991d5c1c9c0adc27ca68ae5 Text-content-sha1: 9904be26698059f94c820fdc5624a2765f796b11 Content-length: 139 K 15 cvs2svn:cvs-rev V 7 1.1.2.9 PROPS-END SVNE J @ long wind /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: e7514c8b107b5364a1bdd57046e01c44 Text-delta-base-sha1: d4fd91bc18f709c1430c9ac62ffa34fd9b0ba243 Text-content-length: 923 Text-content-md5: 94ddd17f259247bb82df69c5a190ed33 Text-content-sha1: 4401580227192ff57efd70c25cf00d13c7d253e4 Content-length: 967 K 15 cvs2svn:cvs-rev V 8 1.1.2.29 PROPS-END SVNE[/^0?^$54q 0zY70?/* $Id: macterm.c,v 1.1.2.29 1999/03/27 15:39:45 TARGET_RT_MAC_CFMTARGET_RT_MAC_CFMTARGET_RT_MAC_CFMSet the background colour of the window correctly. Should be * called whenever the default background changes. */ static void mac_adjustwinbg(struct mac_session *s) { #if 0 /* XXX doesn't link (at least for 68k) */ if (mac_gestalts.windattr & gestaltWindowMgrPresent) SetWindowContentColor(s->window, &(*s->palette)->pmInfo[DEFAULT_BG].ciRGB); else #endif { if (s->wctab == NULL) s->wctab = (WCTabHandle)NewHandle(sizeof(**s->wctab)); if (s->wctab == NULL) return; /* do without */ (*s->wctab)->wCSeed = 0; (*s->wctab)->wCReserved = 0; (*s->wctab)->ctSize = 0; (*s->wctab)->ctTable[0].value = wContentColor; (*s->wctab)->ctTable[0].rgb = (*s->palette)->pmInfo[DEFAULT_BG].ciRGB; SetWinColor(s->window, s->wctab); } Node-path: putty-ben-mac-port/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 81cacd14a02c86aaa84d6dfe59e67d19 Text-delta-base-sha1: 279150e9c619e74bd45d862f83220f3ad788aaf8 Text-content-length: 32 Text-content-md5: 387c21d1c3ab1553fd4be5c6cf6031a5 Text-content-sha1: 4c9ddc9c22f024b48288c531f681b4df172747b4 Content-length: 75 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVNjv PO"{program}" Revision-number: 131 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 1999-03-28T02:06:11.000000Z K 7 svn:log V 26 Meta key support, mostly. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 2d4286266a2ca4016d5ee66144cb7b66 Text-delta-base-sha1: 62225c80cbc63a4ace241f24697c3e263b92d3e5 Text-content-length: 525 Text-content-md5: 04f858df8c30c52ff22485ec9c01fa25 Text-content-sha1: 0b24ee3d67bc09b5b732506803e00539a69388c6 Content-length: 569 K 15 cvs2svn:cvs-rev V 8 1.1.2.19 PROPS-END SVNlQ#^,&=`bw@\aoi/* $Id: mac.c,v 1.1.2.19 1999/03/28 02:06:10#pragma noreturn (mac_eventloop)#pragma noreturn (mac_shutdown)#pragma noreturn (main)window = FrontWindow(); /* * Check for a command-key combination, but ignore it if it counts * as a meta-key combination and we're in a terminal window. */ if (event->what == keyDown && (event->modifiers & cmdKey) && !((event->modifiers & cfg.meta_modifiers) == cfg.meta_modifiers && mac_windowtype(window) == wTerminal Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 95ea6ad7153828ffe6a2c85cf2af2012 Text-delta-base-sha1: 90e63c68963b8b56c7619c7649e09103a9136e71 Text-content-length: 183 Text-content-md5: 4f79b73d24915d1b110ccb31d27d215a Text-content-sha1: 4e268531e591f6bf8a3a073891bba1941987df54 Content-length: 227 K 15 cvs2svn:cvs-rev V 8 1.1.2.14 PROPS-END SVN~l'/CQI+S/* $Id: mac_res.r,v 1.1.2.14 1999/03/28 02:06:1 integer; /* meta modifier 0x900, /* meta modifiers (cmd+option) "meta modifiers", 'H Node-path: putty-ben-mac-port/maccfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 3c7ec027dd1d30056d8a443e73aaeb15 Text-delta-base-sha1: 7afead8bb9f1dd91bc85983b3ff620c20a365bf3 Text-content-length: 146 Text-content-md5: da819cdb8e31a0fcfc0fa3bf026637ae Text-content-sha1: cdb081c3ea99239b9c125bce50e6e42cb72f91b6 Content-length: 189 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVNjv.0o+/* $Id: maccfg.c,v 1.1.2.5 1999/03/28 02:06:10 unsigned short meta_modifierscfg->meta_modifiers = s->meta_modifiers Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 94ddd17f259247bb82df69c5a190ed33 Text-delta-base-sha1: 4401580227192ff57efd70c25cf00d13c7d253e4 Text-content-length: 925 Text-content-md5: 3ba39408c97100b73cd61b35cf9445a9 Text-content-sha1: 318618f6738cf521d370012295d2b27a67d52d79 Content-length: 969 K 15 cvs2svn:cvs-rev V 8 1.1.2.30 PROPS-END SVN[""mE0 f Kiq8+az/* $Id: macterm.c,v 1.1.2.30 1999/03/28 02:06:10criptUInt32 mac_rekey(EventModifiers newmodifiers, UInt32 oldmessage) { UInt32 transresult, state; Ptr kchr; state = 0; kchr = (Ptr)GetScriptManagerVariable(smKCHRCache); transresult = KeyTranslate(kchr, (oldmessage & keyCodeMask) >> 8 | newmodifiers & 0xff00, &state); /* * KeyTranslate returns two character codes. We only worry about * one. Yes, this is slightly bogus, but it makes life less * painful. */ return oldmessage & ~charCodeMask | transresult & 0xff; } Check if the meta "key" was held down */ if ((event->modifiers & cfg.meta_modifiers) == cfg.meta_modifiers) { *p++ = '\033'; event->modifiers &= ~cfg.meta_modifiers; event->message = mac_rekey(event->modifiers, event->message); }DEFAULT_FG); PmBackColor(DEFAULT_BG Node-path: putty-ben-mac-port/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 387c21d1c3ab1553fd4be5c6cf6031a5 Text-delta-base-sha1: 4c9ddc9c22f024b48288c531f681b4df172747b4 Text-content-length: 174 Text-content-md5: 8e98758685e33e4804ce5cffc6fcef77 Text-content-sha1: 1085f210fe120777bc196ce995b2f85b90151b8c Content-length: 217 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVNv. W# $Id: mkputty.mpw,v 1.1.2.5 1999/03/28 02:06:11 ben Exp $ #if (`exists "#""#"`) # echo "# `Date -t` ----- Warning: auto-save file present." #endnd Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 15556a596086eaa4fee0de77683229c7 Text-delta-base-sha1: 80a6d5206cbea98e908b5c346a6ca058417a800a Text-content-length: 96 Text-content-md5: 7f10c6718b29d3f2083328d7af75e070 Text-content-sha1: 77af6660a317351ae43dcc5814f8152d61c3c7d4 Content-length: 140 K 15 cvs2svn:cvs-rev V 8 1.4.2.14 PROPS-END SVN YE]sWDIint meta_modifiers#ifdef macintosh #pragma noreturn (fatalbox) #endif Revision-number: 132 Prop-content-length: 118 Content-length: 118 K 7 svn:log V 20 XCOFF object files. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-28T02:07:03.000000Z PROPS-END Node-path: putty-ben-mac-port Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 108 Content-length: 108 K 10 svn:ignore V 76 *.pdb *.ilk *.res *.RES *.pch *.rsp *.rsrc *.makeout .AppleDouble *.NJ *.c.x PROPS-END Node-path: putty-ben-mac-port/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: e5c0b3bc7418dd533fac6997f9f839b7 Text-delta-base-sha1: bdeaa99bfe986740a355059bdc64df94007af060 Text-content-length: 20 Text-content-md5: cc877c3ac6b3b0040f8c4530167d18e7 Text-content-sha1: 02820ddc3fcf1835138f0e2369b339833a925782 Content-length: 63 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVNGMF *.c.x Revision-number: 133 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 1999-03-28T15:23:37.000000Z K 7 svn:log V 65 PowerPC build sorted and general serious tidying-up of Makefile. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: eac30600d770fd1eb43730cef4efdf05 Text-delta-base-sha1: 28970a599c1c6e9d92adf23bab67a462f31281c3 Text-content-length: 1712 Text-content-md5: d3de88bc1691b1c22376ee34c6f75d48 Text-content-sha1: 4c5ef3aa6af3ea82ed2bcffac4d602bfcd6315dc Content-length: 1755 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVNw|){12m5_T~[{adlU2# $Id: Makefile.mpw,v 1.1.2.5 1999/03/28 15:23:37SymPPC = COptions = {Includes} {Sym68K} -proto strict -opt all # disable "unused parameter" warnings PPCCOptions = {Includes} {SymPPC} -w 35 # short names for targets 68k PuTTY ppc PuTTY.ppc fat PuTTY.fat Objects68K = mac.c.o maccfg.c.o macterm.c.o misc.c.o # ssh.c.o # sshcrc.c.o # sshdes.c.o # sshmd5.c.o # sshrand.c.o # sshrsa.c.o # sshsha.c.o # telnet.c.o terminal.c.o testback.c.o ObjectsPPC = mac.c.x maccfg.c.x macterm.c.x misc.c.x # ssh.c.x # sshcrc.c.x # sshdes.c.x # sshmd5.c.x # sshrand.c.x # sshrsa.c.x # sshsha.c.x # telnet.c.x terminal.c.x testback.c.xSharedLibraries}AppearanceLib" "{PPCLibraries}StdCRuntime.o" "{PPCLibraries}PPCCRuntime-t 'APPL' -c 'pTTY' {ObjectsPPC}PuTTY.ppcPuTTY.fat PuTTY PuTTY.ppc Duplicate -y PuTTY PuTTY.fat MergeFragment PuTTY.ppc PuTTY.fat .c.o .c {C} {default}.c -o {Targ} {COptions} # The odd stuff here seems to stop afpd getting confused. .c.x .c echo -n > {Targ} setfile -t XCOF {Targ} {PPCC} {default}.c -o {Targ} {PPCCOptions} mac.c.o mac.c.x putty.h mac.h macresid.h maccfg.c.o maccfg.c.x putty.h mac.h macresid.h macterm.c.o macterm.c.x putty.h mac.h misc.c.o misc.c.x putty.h ssh.c.o ssh.c.x putty.h ssh.h sshcrc.c.o sshcrc.c.x sshdes.c.o sshdes.c.x ssh.h sshmd5.c.o sshmd5.c.x ssh.h sshrand.c.o sshrand.c.x ssh.h sshrsa.c.o sshrsa.c.x ssh.h sshsha.c.o sshsha.c.x ssh.h telnet.c.o telnet.c.x putty.h terminal.c.o terminal.c.x putty.h testback.c.o testback.c.x putty.h Node-path: putty-ben-mac-port/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 8e98758685e33e4804ce5cffc6fcef77 Text-delta-base-sha1: 1085f210fe120777bc196ce995b2f85b90151b8c Text-content-length: 273 Text-content-md5: 48332ee77db13c499008cf126576d9b7 Text-content-sha1: e5d11ae05524bdd85f27c383cc0464ac5913c4f1 Content-length: 316 K 15 cvs2svn:cvs-rev V 7 1.1.2.6 PROPS-END SVN._~~aM# $Id: mkputty.mpw,v 1.1.2.6 1999/03/28 15:23:37 ben Exp $ set program "{1}" shift if "{program}" == "" || "{program}" == "68k" set program PuTTY end if "{program}" == "ppc" set program PuTTY.ppc end if "{program}" == "fat" set program PuTTY.fat end Revision-number: 134 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 1999-03-28T15:25:45.000000Z K 7 svn:log V 55 Very basic hex-dump backend for testing meta handling. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 7f10c6718b29d3f2083328d7af75e070 Text-delta-base-sha1: 77af6660a317351ae43dcc5814f8152d61c3c7d4 Text-content-length: 42 Text-content-md5: 7375086edaeba637b5d68db7f4eafd5a Text-content-sha1: 3ebf6bb34c36d8d3963f98802d31359ddde78227 Content-length: 86 K 15 cvs2svn:cvs-rev V 8 1.4.2.15 PROPS-END SVNYy Y Nextern Backend hexdum Node-path: putty-ben-mac-port/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 5ff67219df85022dbd7f636209023f60 Text-delta-base-sha1: 40e4204e6548fbed3ad050474218621269035ad1 Text-content-length: 532 Text-content-md5: 664eb01e9ece409b82a3d69a1e507715 Text-content-sha1: 3da826b057e5741aae4fa22613f891566cf7b38c Content-length: 575 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVN?uiD0Gf wnzs/* $Id: testback.c,v 1.1.2.4 1999/03/28 15:25:45io.h>hexdumBackend hexdump_backend = { null_init, null_msg, hexdumstatic void hexdump_send(char *buf, int len) { static char mybuf[10]; int mylen; while (len--) { mylen = sprintf(mybuf, "%02x\015\012", (unsigned char)*buf++); loop_send(mybuf, mylen); } } static void null_size(void) { } static void null_special(Telnet_Special code) { } /* * Emacs magic: * Local Variables: * c-file-style: "simon" * End: */ Revision-number: 135 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 1999-03-28T15:27:03.000000Z K 7 svn:log V 81 Correct handling of keypad enter in normal keypad mode. Use of hex dump backend. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 3ba39408c97100b73cd61b35cf9445a9 Text-delta-base-sha1: 318618f6738cf521d370012295d2b27a67d52d79 Text-content-length: 220 Text-content-md5: 04ad5f55b37d14f810312292dd745f34 Text-content-sha1: c32b522d612e2de15f65ac5f9dbb0ccd8923f002 Content-length: 264 K 15 cvs2svn:cvs-rev V 8 1.1.2.31 PROPS-END SVN"'0ck@^.#!/* $Id: macterm.c,v 1.1.2.31 1999/03/28 15:27:03 ben Exp $ */ /* * Copyright (c) 1999 Simon TathamhexdumF13 0x6900 #define K_F14 0x6b00 #define K_F15 0x71P_ENTER: *p++ = 0x0d Revision-number: 136 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 1999-03-28T17:34:36.000000Z K 7 svn:log V 16 Makefile fixes. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: d3de88bc1691b1c22376ee34c6f75d48 Text-delta-base-sha1: 4c5ef3aa6af3ea82ed2bcffac4d602bfcd6315dc Text-content-length: 217 Text-content-md5: 7326ec6fc8f57bc80186fb36627d1fd6 Text-content-sha1: c506dad4d96fd16d9c65a3b0078d1d231691e8d6 Content-length: 260 K 15 cvs2svn:cvs-rev V 7 1.1.2.6 PROPS-END SVN|;1x6Fu# $Id: Makefile.mpw,v 1.1.2.6 1999/03/28 17:34:36# pseudo-targets all 68k ppc fat clean delete -i {Objects68K} {ObjectsPPC} PuTTY PuTTY.fat PuTTY.ppc PuTTY.NJo {Targ} {Sym68K} Revision-number: 137 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 1999-03-29T19:48:50.000000Z K 7 svn:log V 62 "real bold" temporarily the default to persuade me to fix it. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 4f79b73d24915d1b110ccb31d27d215a Text-delta-base-sha1: 4e268531e591f6bf8a3a073891bba1941987df54 Text-content-length: 77 Text-content-md5: 5a88af9d2e8bca91e5df0e9c56873fc9 Text-content-sha1: 893ae1a0cc94ad5785513e1c040ee7649616ece6 Content-length: 121 K 15 cvs2svn:cvs-rev V 8 1.1.2.15 PROPS-END SVNlj 3X/_ /* $Id: mac_res.r,v 1.1.2.15 1999/03/29 19:48:5font Revision-number: 138 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 1999-03-29T19:50:24.000000Z K 7 svn:log V 134 First attempt at multiple-session support. This has broken meta handling, since mac.c needs to know whether to grab Cmd-keys or not. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 04f858df8c30c52ff22485ec9c01fa25 Text-delta-base-sha1: 0b24ee3d67bc09b5b732506803e00539a69388c6 Text-content-length: 75 Text-content-md5: 5b0e717a3cd9c63eff53d76067cb5901 Text-content-sha1: b1d9e37e70349199df4da80c9633d766a11a7338 Content-length: 119 K 15 cvs2svn:cvs-rev V 8 1.1.2.20 PROPS-END SVNQU0R,p~cn/* $Id: mac.c,v 1.1.2.20 1999/03/29 19:50:22/**/ Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 04ad5f55b37d14f810312292dd745f34 Text-delta-base-sha1: c32b522d612e2de15f65ac5f9dbb0ccd8923f002 Text-content-length: 5410 Text-content-md5: 0a68a2cbd754f7ee2bd4ad3676c2a923 Text-content-sha1: 5130ea0b5ad4589ce0b42b36b67710ea41fb1732 Content-length: 5454 K 15 cvs2svn:cvs-rev V 8 1.1.2.32 PROPS-END SVN'font_width - 1) / s->font_width) : \ (x) / s->font_width) #define PTOCR(y) ((y) < 0 ? -(-(y - s->font_height - 1) / s->font_height) : \ (y) / s->font_height) static void mac_initfont(Session *); static void mac_initpalette(Session *); static void mac_adjustwinbg(Session *); static void mac_adjustsize(Session *, int, int); static void mac_drawgrowicon(SSession *, EventRecord *, unsigned char *); static void text_click(Svoid inbuf_putc(Session *s, int c) { s->inbuf[s->inbuf_head] = c; s->inbuf_head = (s->inbuf_head+1) & INBUF_MASK; } static void inbuf_putstr(Session *s, const char *c) { while (*c) inbuf_putc(s, *c++); } static void display_resource(Session *s, s, t[i]); term_out(sSs = smalloc(sizeof(*s)); memset(s, 0, sizeof(*s)); mac_loadconfig(&s->cfg); s->back = &hexdump_backends); term_size(s, s->cfg.height, s->cfg.width, s->cfg.savelines); mac_initfont(s); mac_initpalette(s); s->s, 'pTST', 128); sprintf(msg, "Elapsed ticks: %d\015\012", TickCount() - starttime); inbuf_putstr(s, msg); term_out(s); } static void mac_initfont(Ss->s->cfg.fontisbold ? bold : 0); TextSize(s->cfg.fontheight); GetFontInfo(&fi); s->s->font_height = s->font_ascent + fi.descent + s->font_leading; mac_adjustsize(s, s->rows, s->Ss->font_width + 15; winheight = newrows * s->Session *s) { if (mac_gestalts.qdvers == gestaltOriginalQD) return; s->palette = NewPalette((*s->cfg.colours)->pmEntries, NULL, pmCourteous, 0); if (s->palette == NULL) fatalbox("Unable to create palette"); CopyPalette(s->cfg.colours, s->palette, 0, 0, (*s->Session *s) { #if TARGET_RT_CFMSession *s; ControlHandle control; short part; int x, y; SetPort(window); s = (Ss->font_width; y = mouse.v / s->s->font_width, y * s->font_height, (x + 1) * s->font_width, (y + 1) * s->Session *s; MenuHandle menu; long offset; s = (SsSession *s; s = (Ss); break; case iPaste: term_paste(s); break; } } } void mac_clickterm(WindowPtr window, EventRecord *event) { SSs, SSs, s, s->rows - 1) term_scroll(s, 0, row - (s->rows - 1)); else if (row < 0) term_scroll(s, 0, row); } term_mouse(s, event->modifiers & shiftKey ? MB_EXTEND : MB_SELECT, MA_RELEASE,Session *s; s = (Ss, 0, -1); break; case kControlDownButtonPart: term_scroll(s, 0, +1); break; case kControlPageUpPart: term_scroll(s, 0, -(s->rows - 1)); break; case kControlPageDownPart: term_scroll(s, 0, +(s->Session *s; s = (Session *)GetWRefCon(window); len = mac_keytrans(s, event, buf); s->back->send(s, Ss->cfg.meta_modifiers) == s->cfg.meta_modifiers) { *p++ = '\033'; event->modifiers &= ~s->s, 0, -(s->rows - 1)); return 0; case K_NEXT: /* shift-pagedown */ term_scroll(s, 0, +(s->s->s->s->s->app_cursor_keys ? "\x1BOA" : "\x1B[A"); return p - output; case K_DOWN: p += sprintf((char *)p, s->s->s->s->Session *s; s = (Session *)GetWRefCon(window); SetRect(&limits, s->font_width + 15, s->s->font_height; newcols = (LoWord(grow_result) - 15) / s->font_width; mac_adjustsize(s, newrows, newcols); term_size(s, newrows, newcols, s->Session *s; s = (Session *)GetWRefCon(window); s->has_focus = active; term_update(sSession *s; s = (Session *)GetWRefCon(window); SetPort(window); BeginUpdate(window); pre_paint(spost_paint(s); EndUpdate(window); } static void mac_drawgrowicon(SSSs->font_height; a.textrect.bottom = (y + 1) * s->font_height; a.textrect.left = x * s->font_width; a.textrect.right = (x + len) * s->s->cfg.fontisbold || (attr & ATTR_BOLD) && !s->s->a->s->void pre_paint(Session *s) { s->attr_mask = ATTR_INVALID; DeviceLoop(s->window->visRgn, &mac_set_attr_mask_upp, (long)s, 0); } static pascal void mac_set_attr_mask(short depth, short devflags, GDHandle device, long cookie) { Session *s = (Session *)cookie; switch (depth) { default: s->attr_mask |= ATTR_FGMASK | ATTR_BGMASK; /* FALLTHROUGH */ case 2: s->attr_mask |= ATTR_BOLD; /* FALLTHROUGH */ case 1: s->s->post_paint(Session *sSession *s, int total, int start, int page) {TARGET_RT_CFMSession *sSession *s, char *icon) { } /* * Set the window title */ void set_title(Session *s, char *title) { Str255 mactitleSession *s, int w, int h) { s->cols = w; s->rows = h; mac_initfont(s); } /* * Set the logical palette */ void palette_set(Session *s, int n, int r, int g, int b) { RGBColor colSession *s) { if (mac_gestalts.qdvers == gestaltOriginalQD) return; CopyPalette(s->cfg.colours, s->palette, 0, 0, (*s->Session *s, int topline, int botline, int lines) {s->font_height, s->cols * s->font_width, (botline + 1) * s->font_height); ScrollRect(&r, 0, - lines * s-> Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 7375086edaeba637b5d68db7f4eafd5a Text-delta-base-sha1: 3ebf6bb34c36d8d3963f98802d31359ddde78227 Text-content-length: 4306 Text-content-md5: 0520af1ad30e6d3eaab734084cbfc66e Text-content-sha1: 0f5b45cb461321d41976be6e5c79eecd9666e2a1 Content-length: 4350 K 15 cvs2svn:cvs-rev V 8 1.4.2.16 PROPS-END SVNy;= QvLwD ? }GX?~CAg/%G.K#include #include )T }W T-%|%#NJ*$a+QJ8GqTcNH Tqb+#@VpPGCg`g^8 )$51[]l|# !H,bviZmEQJpZ6W k !>ldmuC#!jdUSV)Ftm[cG>^_Y98qx F+f2RV~~#define cfg (s->cfg) #define back (s->back) #define rows (s->rows) #define cols (s->cols) #define savelines (s->savelines) #define font_width (s->font_width) #define font_height (s->font_height) #define has_focus (s->has_focus) #define inbuf (s->inbuf) #define inbuf_head (s->inbuf_head) #define inbuf_reap (s->inbuf_reap) #define app_cursor_keys (s->app_cursor_keys) #define app_keypad_keys (s->app_keypad_keys) #define attr_mask (s->attr_mask) #define text s->ts.text #define scrtop s->ts.scrtop #define disptop s->ts.disptop #define sbtop s->ts.sbtop #define cpos s->ts.cpos #define disptext s->ts.disptext #define wanttext s->ts.wanttext #define alttext s->ts.alttext #define selspace s->ts.selspace#define curr_attr s->ts.curr_attr #define save_attr s->ts.save_attr #define curs_x s->ts.curs_x #define curs_y s->ts.curs_y #define save_x s->ts.save_x #define save_y s->ts.save_y #define marg_t s->ts.marg_t #define marg_b s->ts.marg_b #define curr_dec_om s->ts.dec_om #define wrap s->ts.wrap #define wrapnext s->ts.wrapnext #define insert s->ts.insert #define cset s->ts.cset #define save_cset s->ts.save_cset #define save_csattr s->ts.save_csattr #define rvideo s->ts.rvideo #define cset_attr s->ts.cset_attr #define alt_x s->ts.alt_x #define alt_y s->ts.alt_y #define alt_om s->ts.alt_om #define alt_wrap s->ts.alt_wrap #define alt_wnext s->ts.alt_wnext #define alt_ins s->ts.alt_ins #define alt_cset s->ts.alt_cset #define alt_t s->ts.alt_t #define alt_b s->ts.alt_b #define alt_which s->ts.alt_which #define esc_args s->ts.esc_args #define esc_nargs s->ts.esc_nargs #define esc_query s->ts.esc_query #define osc_strlen s->ts.osc_strlen #define osc_string s->ts.osc_string #define osc_w s->ts.osc_w #define tabs s->ts.tabs #define MAXNL 5 #define nl_count s->ts.nl_count #define termstate (s->ts.termstate) #define selstate (s->ts.selstate) #define selmode (s->ts.selmode) #define selstart (s->ts.selstart) #define selend (s->ts.selend) #define selanchor (s->ts.selanchor) #define curr_wordness s->ts.wordnessSession *, int); static void erase_lots (Session *, int, int, int); static void swap_screen (Session *, int); static void update_sbar (Session *); static void deselect (Session *); static void scroll_display(Session *, Session *scurr_curr_wordness[i] = cfg.wordness[i]; } if (text) { swap_screen (s, 1); erase_lots (s, FALSE, TRUE, TRUE); swap_screen (s, 0); erase_lots (s, Session *s) { pre_paint(s); do_paint(s, TRUE); post_paint(s); nl_count = 0;Session *s) { power_on(s); fix_cpos; disptop = scrtop; deselect(s); term_update(s); } /* * Clear the scrollback. */ void term_clrsb(Session *s) { disptop = sbtop = scrtop; update_sbar(s); } /* * Initialise the terminal. */ void term_init(Session *ss); rows = cols = -1; nl_count = 0; power_on(s); } /* * Set up the terminal for a given size. */ void term_size(Session *s, s); update_sbar(s); term_update(s); } /* * Swap screens. */ static void swap_screen (Session *s, curr_dec_om; curr_Session *sSession *s) { int min; min = (sbtop - text) / (cols+1); set_sbar(s, (scrtop - text) / (cols+1) + rows - min, (disptop - text) / (cols+1) - min, (Session *s, unsigned long *from, unsigned long *to) { if (from < selend && selstart < to) deselect(sSession *s, ss, topline, botline, lines); #endif } #ifdef OPTIMISE_SCROLL static void scroll_display(Session *s, s, Session *s, Session *s, (Session *s, (s, (Session *s, (s, (Session *s, s); request_resize(s, curr_s); swap_screen(s, Session *s) { if (osc_w) { while (osc_strlen--) curr_s, (s, Session *s) { int c; int must_update = FALSE; while ( (c = inbuf_getc(s(s, "\033[?1;2c", 7); break; case '\007': beep(s(s, (s, (s, (s, 1); check_selection(s, s(s, TRUE); break; case '8': /* restore cursor */ save_cursor(s(s, (s, (s, (s, "\033[?6c", 5); break; case 'c': /* restore power-on settings */ power_on(s)(s, (s, (s, curs_x +D': /* move left N cols */ move(s, (s, (s, (s, (s, curs_x, (curr_dec_om ? marg_t : 0) + def(esc_args[0], 1) - 1, (curr_(s, def(esc_args[1], 1) - 1, (curr_dec_om ? marg_t : 0) + def(esc_args[0], 1) - 1, (curr_s, FALSs, (s, (s, curs_y, marg_b, @': /* insert chars */ insch(s, (s, (s, (s, (s, (s, (s, TRUE); break; case 'u': /* restore cursor */ save_cursor(st': /* set page size - ie window height */ request_resize(s, cols, def(esc_args[0], 24)); deselect(s(s, (s, s); term_invalidate(sss, (s, (s, cpos, cpos+1); } if (must_update || nl_count > MAXNL) { update_sbar(s); term_update(s); }Session *s(sSession *s(Session *ss(Session *s, ss, 0, rows - 1, shift); #endif /* OPTIMISE_SCROLL */ term_update(s(Session *s, curr_curr_wordness[p[1] & CHAR_MASK] == wvalue) p++; } else { while (p > linestart && curr_(Session *s) { selstart = sel_spread_half(s, selstart, -1); selend = sel_spread_half(s, selend - 1, +1) + 1; } void term_mouse(Session *s, ssssss); term_update(s); } /* * We've completed a selection. We now transfer the * data to the clipboard. */ void term_copy(Session *s(selspace, p - selspace); } void term_paste(Session *s(s, (s, Session *s) { return selstate == SELECTED; } static void deselect(Session *s(Session *s) { deselect(s); term_update(s Node-path: putty-ben-mac-port/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 664eb01e9ece409b82a3d69a1e507715 Text-delta-base-sha1: 3da826b057e5741aae4fa22613f891566cf7b38c Text-content-length: 935 Text-content-md5: 5790afb9f1432b9e266ca860ddf5f362 Text-content-sha1: f787cd11a705c1c2b4b98d1213feb03b42fa6397 Content-length: 978 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVNu"y 0:N:- hg/* $Id: testback.c,v 1.1.2.5 1999/03/29 19:50:24Session *, char *, int, char **); static int null_msg(Session *); static void null_send(Session *, char *, int); static void loop_send(Session *, char *, int); static void hexdump_send(Session *, char *, int); static void null_size(Session *); static void null_special(Session *, Session *s, char *host, int port, char **realhost) { return NULL; } static int null_msg(Session *s) { return 1; } static void null_send(Session *s, char *buf, int len) { } static void loop_send (Session *s, char *buf, int len) { while (len--) { int new_head = (s->s->inbuf_reap) { s->inbuf[s->inbuf_head] = *buf++; s->inbuf_head = new_head; } } term_out(s); term_update(s); } static void hexdump_send(Session *s, s, mybuf, mylen); } } static void null_size(Session *s) { } static void null_special(Session *s, Revision-number: 139 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 1999-03-29T19:51:40.000000Z K 7 svn:log V 57 Ooh! It's some documentation! What's that doing there? K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/README.mac Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 978 Text-content-md5: 1b69a1c855efad14cfff2d0fd2c1f223 Text-content-sha1: f5d9516285858b36f483538cda42a26584bcb36b Content-length: 1098 K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNDDD$Id: README.mac,v 1.1.2.1 1999/03/29 19:51:40 ben Exp $ Information about PuTTY for the Mac OS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Known bugs: * PowerPC and fat versions fail to start on systems without AppearanceLib (ie most System 7 ones). The 68k version works fine. * If the screen scrolls more than once between calls to WaitNextEvent, Bad Things can happen owing to a bug in do_scroll. This can be fixed when I have an easy way to test it. * Display is far too slow. * Fails to work on systems without Color QuickDraw. * Real bold doesn't compensate for changing character widths. * ResEdit 'TMPL' resource seems to be broken. Features we need (and aren't entirely obvious): * Scroll-conflation -- scroll_display should change the in-memory display and remember the scroll, then do_scroll should be called only when scroll_display gets called for a different rectangle or term_paint happens. Local Variables: mode: text End: Revision-number: 140 Prop-content-length: 250 Content-length: 250 K 8 svn:date V 27 1999-03-29T23:55:06.000000Z K 7 svn:log V 151 We now only link weakly with AppearanceLib, which should let us run on PowerPCs without the Appearance Manager. Not that I've tested this, of course. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 7326ec6fc8f57bc80186fb36627d1fd6 Text-delta-base-sha1: c506dad4d96fd16d9c65a3b0078d1d231691e8d6 Text-content-length: 92 Text-content-md5: 63cb1a935ca4ab23344b52855d8ccd7c Text-content-sha1: dad8d4314034ee8b1073c8a0696c75fb46eaadd3 Content-length: 135 K 15 cvs2svn:cvs-rev V 7 1.1.2.7 PROPS-END SVN& FS0 # $Id: Makefile.mpw,v 1.1.2.7 1999/03/29 23:55:0-weaklib AppearanceLib Node-path: putty-ben-mac-port/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 1b69a1c855efad14cfff2d0fd2c1f223 Text-delta-base-sha1: f5d9516285858b36f483538cda42a26584bcb36b Text-content-length: 81 Text-content-md5: 2ff6895be4a4f79086416d63e096ba5f Text-content-sha1: c2555dc8a9692c82295c9f1257e2175349abe203 Content-length: 124 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVNDR ;k-,$Id: README.mac,v 1.1.2.2 1999/03/29 23:55:06 [MAYBE FIXED] Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 5b0e717a3cd9c63eff53d76067cb5901 Text-delta-base-sha1: b1d9e37e70349199df4da80c9633d766a11a7338 Text-content-length: 165 Text-content-md5: 78b563ff35c6c8517c7f8214f1c402fa Text-content-sha1: 3f70bf961812ee80eaed7c0c0f355740d99b7f60 Content-length: 209 K 15 cvs2svn:cvs-rev V 8 1.1.2.21 PROPS-END SVNUX t,aW~/* $Id: mac.c,v 1.1.2.21 1999/03/29 23:55:06Paranoia: Did we manage to pull in AppearanceLib? */ if (&RegisterAppearanceClient == NULL) Revision-number: 141 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 1999-03-30T19:44:52.000000Z K 7 svn:log V 163 Fonts where boldface is wider than usual are now beaten up so they fit. Note that this doesn't happen for non-COlor QuickDraw yet, due to the lack of CharExtra(). K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 0a68a2cbd754f7ee2bd4ad3676c2a923 Text-delta-base-sha1: 5130ea0b5ad4589ce0b42b36b67710ea41fb1732 Text-content-length: 582 Text-content-md5: 06cd7c17a0b812963f38d5c92b996f7d Text-content-sha1: e727fdb1e8bc520bb322b0213097f8d9218ff320 Content-length: 626 K 15 cvs2svn:cvs-rev V 8 1.1.2.33 PROPS-END SVN@!G0Wqm/* $Id: macterm.c,v 1.1.2.33 1999/03/30 19:44:51if (!s->cfg.bold_colour) { TextFace(bold); s->font_boldadjust = s->font_width - CharWidth('W'); } else s->font_boldadjust = 0if (mac_gestalts.qdvers > gestaltOriginalQD) if (style & bold) { SpaceExtra(s->font_boldadjust << 16); CharExtra(s->font_boldadjust << 16); } else { SpaceExtra(0); CharExtra(0); } textrgn = NewRgn(); RectRgn(textrgn, &a.textrect); if (mac_gestalts.qdvers == gestaltOriginalQD) do_text_for_device(1, 0, NULL, (long)&a); else Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 0520af1ad30e6d3eaab734084cbfc66e Text-delta-base-sha1: 0f5b45cb461321d41976be6e5c79eecd9666e2a1 Text-content-length: 52 Text-content-md5: 7e23a44c8c5adec58137c2353a25b875 Text-content-sha1: ee758116bd2a09ae2b19f878977c7eb4953ccbb4 Content-length: 96 K 15 cvs2svn:cvs-rev V 8 1.4.2.17 PROPS-END SVN;-m&s(&int font_boldadjust Revision-number: 142 Prop-content-length: 103 Content-length: 103 K 7 svn:log V 6 Yeah. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-03-30T19:46:44.000000Z PROPS-END Node-path: putty-ben-mac-port/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 2ff6895be4a4f79086416d63e096ba5f Text-delta-base-sha1: c2555dc8a9692c82295c9f1257e2175349abe203 Text-content-length: 94 Text-content-md5: 73020479a24b6713cfe58e7fd3723bd1 Text-content-sha1: e2b9933793284f5da7dc4cc134c32b5c09891b0a Content-length: 137 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVNRm H@-em$Id: README.mac,v 1.1.2.3 1999/03/30 19:46:44 without Color QuickDraw Revision-number: 143 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:51.888527Z PROPS-END Revision-number: 144 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:51.896989Z PROPS-END Revision-number: 145 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:51.905775Z PROPS-END Revision-number: 146 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:51.915113Z PROPS-END Revision-number: 147 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:51.923526Z PROPS-END Revision-number: 148 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 1999-04-01T21:25:06.000000Z K 7 svn:log V 60 New version-number system. Doesn't yet do the "about" box. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 63cb1a935ca4ab23344b52855d8ccd7c Text-delta-base-sha1: dad8d4314034ee8b1073c8a0696c75fb46eaadd3 Text-content-length: 416 Text-content-md5: ac83b8ad761fe0cc3dae1f03ef68a1c4 Text-content-sha1: b768ecabad5344667a743e4f1a3994a4a5982f1e Content-length: 459 K 15 cvs2svn:cvs-rev V 7 1.1.2.8 PROPS-END SVN&5}C-G"+{# $Id: Makefile.mpw,v 1.1.2.8 1999/04/01 21:2 version.r version.h Rez mac_res.r -d BUILD_ARCH='"68k"'ppc version.r version.h Rez mac_res.r -d BUILD_ARCH='"PowerPC"' -o {Targ} {Includes} -append PuTTY.fat PuTTY PuTTY.ppc version.r version.h Duplicate -y PuTTY PuTTY.fat MergeFragment PuTTY.ppc PuTTY.fat Rez mac_res.r -d BUILD_ARCH='"fat"' -o {Targ} {Includes} -append Node-path: putty-ben-mac-port/version.h Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 425 Text-content-md5: e067e93dbc7435e96007d3fc946dcd3f Text-content-sha1: 706a310d39fab35a63ae9513bd3c00987606931f Content-length: 545 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN/* PuTTY version number */ /* * Note that this file is used by resource compilers that don't * implement the funkier bits of CPP */ #define PUTTY_VERS_MAJOR 0 #define PUTTY_VERS_MAJOR_BCD 0x00 #define PUTTY_VERS_MINOR 45 #define PUTTY_VERS_MINOR_BCD 0x45 #define PUTTY_VERS_PRERELEASE 0 #define PUTTY_VERS_STATE development #define PUTTY_VERS_SHORT_STR "0.45d0" #define PUTTY_VERS_LONG_STR "Dev 0.45 Mac 0" Node-path: putty-ben-mac-port/version.r Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 495 Text-content-md5: 885d9e57c096fe61625e02cb8faa37ae Text-content-sha1: e125d3792aa1ddf2585c96b446f98c436b0789c4 Content-length: 615 K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNaaa/* * PuTTY version resource * (separated because it gets rebuilt for each architecture) */ #include "version.h" #include "Types.r" #ifndef BUILD_ARCH #define BUILD_ARCH "unknown" #endif resource 'vers' (1, purgeable) { PUTTY_VERS_MAJOR_BCD, PUTTY_VERS_MINOR_BCD, PUTTY_VERS_STATE, PUTTY_VERS_PRERELEASE, 2, /* Region code (2 = UK) */ PUTTY_VERS_SHORT_STR, PUTTY_VERS_LONG_STR " (" BUILD_ARCH ")\n" "Copyright \$a9 Simon Tatham 1997-9", }; Revision-number: 149 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 1999-04-01T21:26:03.000000Z K 7 svn:log V 55 Beginnings of an attempt at MacTCP networking support. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macnet.c Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 2996 Text-content-md5: 7dda2b4aeb04af3671fd3deb84f95d7f Text-content-sha1: 0f527ec475c1a7e4764151ecccbbf8fd9adec1ff Content-length: 3116 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN&&&/* $Id: macnet.c,v 1.1.2.1 1999/04/01 21:26:03 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * macnet.c -- PuTTY-to-MacTCP glue */ #include #include #incldue #include #include #include #include "putty.h" static short mtcp_refnum; statis OSErr mtcp_initted = FALSE; static void macnet_init(void); static pascal void macnet_resolved(struct HostInfo *, char *); #ifdef TARGET_RT_MAC_CFM static RoutineDescriptor macnet_resolved_upp = BUILD_ROUTINE_DESCRIPTOR(uppResultProcInfo, (ProcPtr)macnet_resolved); #else #define macnet_resolved_upp macnet_resolved #endif /* * Initialise networking. Set mtcp_initted if it goes OK. */ static OSErr macnet_init(void) { OSErr err; err = OpenDriver(".IPP", &mtcp_refnum); if (err != noErr) return err; err = OpenResolver(NULL); if (err != noErr) return err; mtcp_initted = TRUE; /* XXX: otherwise report an error */ } Socket *tcp_open(const char *host, int port, char **realhost) { ip_addr a; OSError err = noErr; Socket *s; s = smalloc(sizeof(struct Socket)); if (!mtcp_initted) if ((err = macnet_init()) != noErr) fatalbox("Couldn't init network (%d)", err); s->port = port; GetCurrentProcess(&s->psn); err = StrToAddr(host, &s->host_info, &macnet_resolved_upp, (char *)s); if (err != noErr) fatalbox("Host lookup failed (%d)", err); if (s->host_info.rtnCode != cacheFault) macnet_resolved(&s->host_info, s); return s; } static pascal void macnet_resolved(struct hostInfo *hi, char *cookie) { Socket *s = (Socket *)cookie; /* We should probably tell the process what's going on here. */ /* Alternatively, we should kick off the next stage in the process */ WakeUpProcess(&s->psn); } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty-ben-mac-port/macnet.h Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 840 Text-content-md5: 932eb216d6b9781ed46d621ead8fc2f2 Text-content-sha1: 29b6ec7b92b0a08eb43ad626f02f1f50c3ba1628 Content-length: 960 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN:::/* * macnet.h -- Mac OS networtking stuff for PuTTY */ #ifndef _PUTTY_MACNET_H #define _PUTTY_MACNET_H #include #include #include #include typedef struct { StreamPtr tcp_stream; struct HostInfo host_info; int port; unsigned char *inbuf; int inbuf_head, inbuf_reap, inbuf_size; unsigned char *outbuf; int outbuf_head, outbuf_reap, outbuf_size; ProcessSerialNumber psn; } Socket; typedef Socket *SOCKET #define INVALID_SOCKET NULL #define MSG_OOB 1 extern int send(SOCKET, const void *, size_t, int); extern int recv(SOCKET, void *, size_t, int); extern SOCKET tcp_open(const char *, int, char **); extern void tcp_close(SOCKET); extern void tcp_abort(SOCKET); #endif /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty-ben-mac-port/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: f8b180987bb109ff14131d623951101e Text-delta-base-sha1: 1939e791cf10f0e4d882f212b808e92a07256be5 Text-content-length: 78 Text-content-md5: d4ab10e64d6d574ea793ada4880c0aea Text-content-sha1: 890827b1e2ea8ef5d4eba6ab13bce4574149dcb0 Content-length: 121 K 15 cvs2svn:cvs-rev V 7 1.2.2.2 PROPS-END SVNX;G#ifdef macintosh #include #else /* not macintosh */ Revision-number: 150 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 1999-04-01T21:26:44.000000Z K 7 svn:log V 20 Minor code clean-up K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 78b563ff35c6c8517c7f8214f1c402fa Text-delta-base-sha1: 3f70bf961812ee80eaed7c0c0f355740d99b7f60 Text-content-length: 124 Text-content-md5: 10326dbfdd19123fb62e68df1fbfa214 Text-content-sha1: c8e87733dca1fcfcab0b8d1ed7f85960f602feae Content-length: 168 K 15 cvs2svn:cvs-rev V 8 1.1.2.22 PROPS-END SVNXBVS,Wqu?~~Z/* $Id: mac.c,v 1.1.2.22 1999/04/01 21:26:44CodeFragmentskUnresolvedCFragSymbolAddress Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: f18c85bb5991d5c1c9c0adc27ca68ae5 Text-delta-base-sha1: 9904be26698059f94c820fdc5624a2765f796b11 Text-content-length: 20 Text-content-md5: 40070e99020c396a4b5e5687d6930063 Text-content-sha1: 3e6b7cd1b1572f9e7633fdcf7a1dfa7f053e74a7 Content-length: 64 K 15 cvs2svn:cvs-rev V 8 1.1.2.10 PROPS-END SVNy "W> Revision-number: 151 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 1999-04-01T21:27:36.000000Z K 7 svn:log V 23 Mac versioning update. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 5a88af9d2e8bca91e5df0e9c56873fc9 Text-delta-base-sha1: 893ae1a0cc94ad5785513e1c040ee7649616ece6 Text-content-length: 72 Text-content-md5: 44efaf657ee833848030581c0fffab5e Text-content-sha1: cb391ac5f557ae5502318e95c9a389c839816bde Content-length: 116 K 15 cvs2svn:cvs-rev V 8 1.1.2.16 PROPS-END SVNj3 0_0$F/* $Id: mac_res.r,v 1.1.2.16 1999/04/01 21:27:36 Revision-number: 152 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 1999-04-02T10:21:49.000000Z K 7 svn:log V 63 Build process tweaks -- now only runs Rez over mac_res.r once. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: ac83b8ad761fe0cc3dae1f03ef68a1c4 Text-delta-base-sha1: b768ecabad5344667a743e4f1a3994a4a5982f1e Text-content-length: 1011 Text-content-md5: a62f005b52458253517239026ee76755 Text-content-sha1: 600cec4430e558f10a2ec108f478fa1f1aa7b1d9 Content-length: 1054 K 15 cvs2svn:cvs-rev V 7 1.1.2.9 PROPS-END SVN5tN11/)^fh?`U# $Id: Makefile.mpw,v 1.1.2.9 1999/04/02 10:21:48# short names for targets 68k PuTTY.68k ppc PuTTY.ppc fat PuTTY PuTTY.rsrc mac_res.r macresid.h Rez mac_res.r -o {Targ} {Includes} PuTTY.ppc {ObjectsPPC} PuTTY.rsrc Delete -i {Targ} PPCLink -o {Targ} {SymPPC} -t 'APPL' -c 'pTTY' -fragname PuTTY {ObjectsPPC} {LibsPPC} Echo 'Include "PuTTY.rsrc";' > merge.r Rez merge.r -o {Targ} -append Delete -i merge.r Rez version.r -d BUILD_ARCH='"PowerPC"' -o {Targ} {Includes} -append PuTTY.68k-c 'pTTY' -newerdeps {NewerDeps} ELSE ILink -o {Targ} {Sym68K} -t 'APPL' -c 'pTTY' {Objects68K} {Libs68K} END PuTTY.68k PuTTY.rsrc Echo 'Include "PuTTY.rsrc";' > merge.r Rez merge.r -o {Targ} -append Delete -i merge.r Rez version.r -d BUILD_ARCH='"68k"' -o {Targ} {Includes} -append PuTTY PuTTY.68k PuTTY.ppc version.r version.h Duplicate -y PuTTY.68k {Targ} MergeFragment PuTTY.ppc {Targ} Rez version Node-path: putty-ben-mac-port/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 48332ee77db13c499008cf126576d9b7 Text-delta-base-sha1: e5d11ae05524bdd85f27c383cc0464ac5913c4f1 Text-content-length: 173 Text-content-md5: 6a399af7ea51fbe4281b5bccaca48035 Text-content-sha1: 73fd21bbb533000673cb3de0b0e3708aa9119213 Content-length: 216 K 15 cvs2svn:cvs-rev V 7 1.1.2.7 PROPS-END SVN__ c0ffy# $Id: mkputty.mpw,v 1.1.2.7 1999/04/02 10:21:49.68k end if "{program}" == "ppc" set program PuTTY.ppc end if "{program}" == "fat" set program PuTTY Revision-number: 153 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 1999-04-02T12:56:57.000000Z K 7 svn:log V 19 Missing dependency K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: a62f005b52458253517239026ee76755 Text-delta-base-sha1: 600cec4430e558f10a2ec108f478fa1f1aa7b1d9 Text-content-length: 92 Text-content-md5: bead78aa7d143e252a1e836b2d5e8642 Text-content-sha1: d6ed557a93a83f5f03891de8e3e3426818feeddd Content-length: 136 K 15 cvs2svn:cvs-rev V 8 1.1.2.10 PROPS-END SVNt FJ1y{# $Id: Makefile.mpw,v 1.1.2.10 1999/04/02 12:56:57 version.r version.h Revision-number: 154 Prop-content-length: 197 Content-length: 197 K 8 svn:date V 27 1999-04-02T12:58:03.000000Z K 7 svn:log V 99 The "about" box now behaves approximately as it should (though we still don't have a licence box). K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 10326dbfdd19123fb62e68df1fbfa214 Text-delta-base-sha1: c8e87733dca1fcfcab0b8d1ed7f85960f602feae Text-content-length: 1475 Text-content-md5: 13ed0ac1fe4fbc58f410011be0ce93f8 Text-content-sha1: 9a9469106fca6ec531f4fc55279313dcf75c8377 Content-length: 1519 K 15 cvs2svn:cvs-rev V 8 1.1.2.23 PROPS-END SVNBq;|C,<|F.?dZViYQZ0UD{}+/* $Id: mac.c,v 1.1.2.23 1999/04/02 12:58:02Resources.h> #include #include EventRecord *); static void mac_activateabout(WindowPtr, EventRecord *openabout(void eventEventRecord *event) { int active; active = (event->modifiers & activeFlag) != 0; case wAbout: mac_activateabout(window, event); break; } } static void mac_activateabout(WindowPtr window, EventRecord *event) { DialogItemType itemtype; Handle itemhandle; short item; Rect itemrect; int active; active = (event->modifiers & activeFlag) != 0; GetDialogItem(window, wiAboutLicence, &itemtype, &itemhandle, &itemrect); HiliteControl((ControlHandle)itemhandle, active ? 0 : 255); DialogSelect(event, &window, &item);mac_openabout(openabout(void) { DialogItemType itemtype; Handle item; VersRecHndl vers; Rect box; StringPtr longvers; if (windows.about) SelectWindow(windows.about); else { windows.about = GetNewDialog(wAbout, NULL, (WindowPtr)-1); /* XXX check we're using the right resource file? */ vers = (VersRecHndl)GetResource('vers', 1); assert(vers != NULL && *vers != NULL); longvers = (*vers)->shortVersion + (*vers)->shortVersion[0] + 1; GetDialogItem(windows.about, wiAboutVersion, &itemtype, &item, &box); assert(itemtype & kStaticTextDialogItem); SetDialogItemText(item, longvers); ShowWindow(windows.about); } Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 44efaf657ee833848030581c0fffab5e Text-delta-base-sha1: cb391ac5f557ae5502318e95c9a389c839816bde Text-content-length: 306 Text-content-md5: 6d3aca5b3ce907be0c20b84549b3c65d Text-content-sha1: 27bf130799bb532e9b586204b44806f455ab4fba Content-length: 350 K 15 cvs2svn:cvs-rev V 8 1.1.2.17 PROPS-END SVN3F/0n}A/* $Id: mac_res.r,v 1.1.2.17 1999/04/02 12:58:02240 }, noGrowDocProc, in227 }, Button { enabled, "View Licence" }, { 13, 13, 29, 227 }, StaticText { disabled, "PuTTY"}, { 42, 13, 74, 227 }, StaticText { disabled, "Some version or other\n" "Copyright Node-path: putty-ben-mac-port/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 1693d7e93702c8413b955c2c6f3bfb08 Text-delta-base-sha1: d4c5cf67bb4bc65ed6854647685805844c6a7ada Text-content-length: 86 Text-content-md5: e5883dacbd38b4a1a89d10815b5e2c85 Text-content-sha1: 3802e5917e62d06c471ca07e6ce07f69806f7951 Content-length: 129 K 15 cvs2svn:cvs-rev V 7 1.1.2.6 PROPS-END SVNt @+0#Q/* $Id: macresid.h,v 1.1.2.6 1999/04/02 12:58:03iAboutVersion 3 Node-path: putty-ben-mac-port/version.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 885d9e57c096fe61625e02cb8faa37ae Text-delta-base-sha1: e125d3792aa1ddf2585c96b446f98c436b0789c4 Text-content-length: 24 Text-content-md5: d951358954653f8540bfe22b07fd9ccf Text-content-sha1: 17d9dfb610771bbc1eb94e6a4d063e3a8ccc6ff7 Content-length: 67 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVNa_W9", }; Revision-number: 155 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 1999-04-03T21:53:29.000000Z K 7 svn:log V 74 Yeah. Some progress on Mac OS networking. Still some way to go, though. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: bead78aa7d143e252a1e836b2d5e8642 Text-delta-base-sha1: d6ed557a93a83f5f03891de8e3e3426818feeddd Text-content-length: 98 Text-content-md5: 8466e7422fc0b0bbac671a0d5a158354 Text-content-sha1: 3af82526b92ca8c2d1f915f1e945c8325b681414 Content-length: 142 K 15 cvs2svn:cvs-rev V 8 1.1.2.11 PROPS-END SVN ) L[2# $Id: Makefile.mpw,v 1.1.2.11 1999/04/03 21:53:29net.c.o macnet.c.x putty Node-path: putty-ben-mac-port/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 7dda2b4aeb04af3671fd3deb84f95d7f Text-delta-base-sha1: 0f527ec475c1a7e4764151ecccbbf8fd9adec1ff Text-content-length: 11202 Text-content-md5: 4ba139ed41bffd39ecf0ab5cc702d656 Text-content-sha1: c81d109cdc91360ab3eeb7cc00ca8314390721ff Content-length: 11245 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVN&.!J.tW[{H^/* $Id: macnet.c,v 1.1.2.2 1999/04/03 21:53:29sXlation.h> #include #include #include #include #include #include #include #include #include "putty.h" /* * The theory behind this stuff: * * net_recv attempts to deliver any incoming data waiting on the * queue. Since MacTCP maintains a buffer for incoming data, there's * no need for us to run asynchronous TCPRcvs, and we just do a * synchronous one if we detect some data waiting. Since TCPRcv can't * be given a timeout of zero, we use TCPStatus to work out if there's * anything waiting first. * * Sending data is trickier. TCPSend reserves the right to block * until everything we've sent is ACKed, which means we have to use it * asynchronously. In order to make life easier for backends, and to * save a proliferation of circular buffers, we guarantee to take data * off the hands of the backend as soon as it gives it to us. This is * reasonable because currently there's no way for the backend to say * it can't take data, and once it's got them, it may as well give * them to us. * * Anyway, in order to avoid a fixed-size buffer overflowing, the send * buffer is kept as a queue of blocks. When net_send is called, we * malloc a new block and stick it on the queue. If the queue was * empty, we kick off a new asynchronous TCPSend to handle our block. * */ typedef struct Socket { TCPiopb iopb; /* current MacTCP operation */ TCPiopb spareiopb; /* for closing etc */ hostInfo hostinfo; int port; // unsigned char *inbuf; // int inbuf_head, inbuf_reap, inbuf_size; // unsigned char *outbuf; // int outbuf_head, outbuf_reap, outbuf_size; ProcessSerialNumber psn; Session *s; UInt32 a5; qHdr sendq; /* Blocks waiting to be sent */ qHdr freeq; /* Blocks sent, waiting to be freed */ } Socket; typedef struct { QElem qelem; int flags; int len; } Send_Buffer; /* * Yes, I know the struct QElem has a short[1] to represent the user * data. I'm ignoring it because it makes my code prettier and * improves the alignment. */ typedef struct { QElem qelem; Socket *sock; Net_Event_Type type; } NetEvent; #define TCPBUF_SIZE 8192 static QHdr macnet_eventq; static QHdr macnet_freeq; static short mtcp_refnum; static int mtcp_initted = FALSE; static OSErr macnet_init(void); static pascal void macnet_resolved(hostInfo *, char *); static void macnet_opened(TCPiopb*); static void macnet_sent(TCPiopb*); static void macnet_closed(TCPiopb*); static pascal void macnet_asr(StreamPtr, unsigned short, Ptr, unsigned short, ICMPReport *); static void macnet_sendevent(Socket *, Net_Event_Type); #istatic RoutineDescriptor macnet_opened_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPIOCompletionProcInfo, (ProcPtr)macnet_opened); static RoutineDescriptor macnet_sent_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPIOCompletionProcInfo, (ProcPtr)macnet_sent); static RoutineDescriptor macnet_closed_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPIOCompletionProcInfo, (ProcPtr)macnet_closed); static RoutineDescriptor macnet_asr_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPNotifyProcInfo, (ProcPtr)macnet_asr); #else #define macnet_resolved_upp macnet_resolved #define macnet_opened_upp macnet_opened #define macnet_sent_upp macnet_sent #define macnet_closed_upp macnet_closed #define macnet_asr_upp macnet_asr #endif /* * Number of outstanding network events allowed. */ #define NUM_EVENTS 16 NetEvent *eventblock; int i; err = opend/* Set up the event queues, and fill the free queue with events */ macnet_eventq.qFlags = 0; macnet_eventq.qHead = macnet_eventq.qTail = NULL; macnet_freeq.qFlags = 0; macnet_freeq.qHead = macnet_eventq.qTail = NULL; eventblock = smalloc(NUM_EVENTS * sizeof(NetEvent)); for (i = 0; i < NUM_EVENTS; i++) Enqueue(&eventblock[i].qelem, &macnet_freeq); mtcp_initted = TRUE; } Socket *net_open(Session *s, char *host, int port) { ip_addr a; OSErr err = noErr; Socket *sock; void *tcpbuf; /* * First, get hold of all the memory we'll need (a lot of the * later stuff happens at interrupt time) */ sock = smalloc(sizeof(struct Socket)); memset(sock, 0, sizeof(*sock)); tcpbuf = smalloc(TCPBUF_SIZE); /* Make a note of anything we don't want to forget */ sock->port = port; GetCurrentProcess(&sock->psn); sock->a5 = SetCurrentA5(); /* Get MacTCP running if it's not already */ if (!mtcp_initted) if ((err = macnet_init()) != noErr) fatalbox("Couldn't init network (%d)", err); /* Get ourselves a TCP stream to play with */ sock->iopb.ioCRefNum = mtcp_refnum; sock->iopb.csCode = TCPCreate; sock->iopb.csParam.create.rcvBuff = tcpbuf; sock->iopb.csParam.create.rcvBuffLen = TCPBUF_SIZE; sock->iopb.csParam.create.notifyProc = macnet_asr_upp; sock->iopb.csParam.create.userDataPtr = (Ptr)sock; /* This could be done asynchronously, but I doubt it'll take long. */ err = PBControlSync((ParmBlkPtr)&sock->iopb); if (err != noErr) fatalbox("TCP stream open failed (%d)", err); err = StrToAddr(host, &sock->hostinfo, &macnet_resolved_upp, (char *)sock); if (err != noErr) fatalbox("Host lookup failed (%d)", err); if (sock->hostinfo.rtnCode != cacheFault) macnet_resolved(&sock->hostinfo, (char *)sock); return sock; } static pascal void macnet_resolved(hostInfo *hi, char *cookie) { Socket *sock = (Socket *)cookie; OSErr err; UInt32 olda5; olda5 = SetA5(sock->a5); /* * We've resolved a name, so now we'd like to connect to it (or * report an error). */ switch (sock->hostinfo.rtnCode) { case noErr: /* Open a connection */ sock->iopb.ioCompletion = macnet_opened_upp; sock->iopb.csCode = TCPActiveOpen; sock->iopb.csParam.open.validityFlags = typeOfService; sock->iopb.csParam.open.commandTimeoutValue = 0; /* unused */ sock->iopb.csParam.open.remoteHost = sock->hostinfo.addr[0]; /*XXX*/ sock->iopb.csParam.open.remotePort = sock->port; /* localHost is set by MacTCP. */ sock->iopb.csParam.open.localPort = 0; sock->iopb.csParam.open.tosFlags = lowDelay; sock->iopb.csParam.open.dontFrag = 0; sock->iopb.csParam.open.timeToLive = 0; /* default */ sock->iopb.csParam.open.security = 0; sock->iopb.csParam.open.optionCnt = 0; sock->iopb.csParam.open.userDataPtr = (char *)sock; err = PBControlSync((ParmBlkPtr)&sock->iopb); if (err != noErr) macnet_sendevent(sock, NE_NOOPEN); break; default: /* Something went wrong */ macnet_sendevent(sock, NE_NOHOST); break; } SetA5(olda5); } static void macnet_opened(TCPiopb *iopb) { Socket *sock = (Socket *)iopb->csParam.open.userDataPtr; UInt32 olda5; olda5 = SetA5(sock->a5); switch (iopb->ioResult) { case noErr: macnet_sendevent(sock, NE_OPEN); break; default: macnet_sendevent(sock, NE_NOOPEN); break; } SetA5(olda5); } static pascal void macnet_asr(StreamPtr tcpstream, unsigned short eventcode, Ptr cookie, unsigned short terminreason, ICMPReport *icmpmsg) { Socket *sock = (Socket *)cookie; UInt32 olda5; olda5 = SetA5(sock->a5); switch (eventcode) { case TCPClosing: macnet_sendevent(sock, NE_CLOSING); break; case TCPULPTimeout: macnet_sendevent(sock, NE_TIMEOUT); break; case TCPTerminate: switch (terminreason) { case TCPRemoteAbort: macnet_sendevent(sock, NE_ABORT); break; default: macnet_sendevent(sock, NE_DIED); break; } break; case TCPDataArrival: macnet_sendevent(sock, NE_DATA); break; case TCPUrgent: macnet_sendevent(sock, NE_URGENT); break; case TCPICMPReceived: switch (icmpmsg->reportType) { case portUnreach: macnet_sendevent(sock, NE_REFUSED); break; } break; } SetA5(olda5); } /* * Send a block of data. */ int net_send(Socket *sock, void *buf, int buflen, int flags) {{ OSErr err; Send_Buffer *buff; buff = smalloc(sizeof(Send_Buffer) + buflen); buff->flags = flags; buff->len = buflen; memcpy(buff + 1, buf, buflen); Enqueue(&buff->qelem, &sock->sendq); macnet_start(sock); } int net_recv(Socket *sock, void *buf, int buflen, int flags) { TCPiopb iopb; OSErr err; int avail, want, got; memcpy(&iopb, &sock->iopb, sizeof(TCPiopb)); /* Work out if there's anything to recieve (we don't want to block) */ iopb.csCode = TCPStatus; err = PBControlSync((ParmBlkPtr)&iopb); if (err != noErr) return 0; /* macnet_asr should catch it anyway */ avail = iopb.csParam.status.amtUnreadData; if (avail == 0) return 0; want = avail < buflen ? avail : buflen; iopb.csCode = TCPRcv; iopb.csParam.receive.buffPtr = buf; iopb.csParam.receive.buffLen = want; err = PBControlSync((ParmBlkPtr)&iopb); if (err != noErr) return 0; return iopb.csParam.receive.buffLen; } void net_close(Socket *sock) { OSErr err; /* * This might get called in the middle of processing another * request on the socket, so we have a spare parameter block for * this purpose (allocating one dynamically would mean having to * free it, which we can't do at interrupt time). */ memcpy(&sock->spareiopb, &sock->iopb, sizeof(TCPiopb)); sock->spareiopb.ioCompletion = macnet_closed_upp; sock->spareiopb.csCode = TCPClose; sock->spareiopb.csParam.close.validityFlags = 0; sock->spareiopb.csParam.close.userDataPtr = (char *)sock; err = PBControlAsync((ParmBlkPtr)&sock->spareiopb); switch (err) { case noErr: case connectionClosing: case connectionTerminated: /* We'll get an ASR */ break; default: macnet_sendevent(sock, NE_DIED); break; } } static void macnet_closed(TCPiopb* iopb) { Socket *sock = (Socket *)iopb->csParam.close.userDataPtr; UInt32 olda5; olda5 = SetA5(sock->a5); switch (iopb->ioResult) { case noErr: macnet_sendevent(sock, NE_CLOSED); break; case connectionClosing: case connectionTerminated: break; default: macnet_sendevent(sock, NE_DIED); break; } SetA5(olda5); } /* * Free all the data structures associated with a socket and tear down * any connection through it. */ void net_destroy(Socket *sock) { TCPiopb iopb; OSErr err; /* * Yes, we need _another_ iopb, as there may be a send _and_ a * close outstanding. Luckily, destroying a socket is * synchronous, so we can allocate this one dynamically. */ memcpy(&iopb, &sock->iopb, sizeof(TCPiopb)); iopb.csCode = TCPRelease; err = PBControlSync((ParmBlkPtr)&iopb); sfree(iopb.csParam.create.rcvBuff); sfree(sock); } static void macnet_sendevent(Socket *sock, Net_Event_Type type) { NetEvent *ne; ne = (NetEvent *)macnet_freeq.qHead; assert (ne != NULL); Dequeue(&ne->qelem, &macnet_freeq); ne->sock = sock; ne->type = type; Enqueue(&ne->qelem, &macnet_eventq); WakeUpProcess(&sock Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 7e23a44c8c5adec58137c2353a25b875 Text-delta-base-sha1: ee758116bd2a09ae2b19f878977c7eb4953ccbb4 Text-content-length: 1263 Text-content-md5: bd1c720fd89a9b1fc826c9847f679c28 Text-content-sha1: 73b6b6ec3c05dc0d6c6899de79fc07f58f732b47 Content-length: 1307 K 15 cvs2svn:cvs-rev V 8 1.4.2.18 PROPS-END SVN-1 C'7H;+`dItypedef struct Socket Socket; /* Types of network event */ typedef enum { NE_NULL, /* Nothing happened */ NE_OPEN, /* Connection successfully opened */ NE_NOHOST, /* DNS lookup failed for some reason */ NE_REFUSED, /* Port unreachable */ NE_NOOPEN, /* Connection failed to open for some other reason */ NE_DATA, /* Incoming normal data */ NE_URGENT, /* Incoming urgent data */ NE_CLOSING, /* Connection closed by remote host */ NE_CLOSED, /* Connection close completed */ NE_TIMEOUT, /* Remote host vanished */ NE_ABORT, /* Remote host reset connection */ NE_DIED, /* Connection has failed for some other reason */ } Net_Event_Type; typedef struct { char *(*init) (Session *, char *host, int port); int (*msg)(Session *, Socket *, Net_Event_Type); void (*shutdown) (Session *typedef struct Socket Socket; /* * Exports from the network system */ extern Socket *net_open(Session *, char *host, int port); extern char *net_realname(Socket *); extern int net_recv(Socket *, void *, int, int); extern int net_send(Socket *, void *, int, int); extern void net_close(Socket *); /* ask the remote end to close */ extern void net_destroy(Socket *); /* Tidy up */ Node-path: putty-ben-mac-port/macnet.h Node-action: delete Revision-number: 156 Prop-content-length: 401 Content-length: 401 K 10 svn:author V 3 ben K 8 svn:date V 27 1999-04-04T18:23:35.000000Z K 7 svn:log V 302 Lots of MacTCP networking stuff. I think all the code's written, but it doesn't actually work yet. Also the telnet backend is still single-session, and I haven't even touched the ssh one. Oh, and the "Main" segment just overflowed 32k, so we have extra linker incantations. I'm off to the pub now. PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 8466e7422fc0b0bbac671a0d5a158354 Text-delta-base-sha1: 3af82526b92ca8c2d1f915f1e945c8325b681414 Text-content-length: 313 Text-content-md5: 1e0901a8dc81de5fadc0ad1f31f00097 Text-content-sha1: 798221f2e77cba92c23b3da1c5ffb53856b5c400 Content-length: 357 K 15 cvs2svn:cvs-rev V 8 1.1.2.12 PROPS-END SVN) (D2ppcb_p<~+# $Id: Makefile.mpw,v 1.1.2.12 1999/04/04 18:23:33dnr.c.o mac.c.o maccfg.c.o macnet telnet.c.o terminal.c.o testback.c.o ObjectsPPC = dnr.c.x mac.c.x maccfg.c.x macnetbr 68k -model far-br 68k -model fardnr.c.o dnr.c.x Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 13ed0ac1fe4fbc58f410011be0ce93f8 Text-delta-base-sha1: 9a9469106fca6ec531f4fc55279313dcf75c8377 Text-content-length: 85 Text-content-md5: 8757583a25b6d8b18b2db97396c67b2e Text-content-sha1: 92b334d94c8e5ea1298599a93f1e8369dc5ed717 Content-length: 129 K 15 cvs2svn:cvs-rev V 8 1.1.2.24 PROPS-END SVNq ?,E,/* $Id: mac.c,v 1.1.2.24 1999/04/04 18:23:33 macnet_eventcheck( Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 40070e99020c396a4b5e5687d6930063 Text-delta-base-sha1: 3e6b7cd1b1572f9e7633fdcf7a1dfa7f053e74a7 Text-content-length: 74 Text-content-md5: 5bc1249eb65f8be45d80fdaef52a6d7a Text-content-sha1: e40a9f5ca21ed14d7f46c6429177551dad083f9f Content-length: 118 K 15 cvs2svn:cvs-rev V 8 1.1.2.11 PROPS-END SVNy2 64H1/* from macnet.c */ extern void macnet_eventcheck(void Node-path: putty-ben-mac-port/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 4ba139ed41bffd39ecf0ab5cc702d656 Text-delta-base-sha1: c81d109cdc91360ab3eeb7cc00ca8314390721ff Text-content-length: 3831 Text-content-md5: 0df15c092d552529febcb1c8b9926bc4 Text-content-sha1: 234ec6288d12f8ec196737c0b1e25fe3fdab94d8 Content-length: 3874 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVN.(P_.I 4[h#7)D UVP*=xG`dBJPO:G8HeG \cv}Z5zFC?|+3(1`%L8a% /* $Id: macnet.c,v 1.1.2.3 1999/04/04 18:23:34 ProcessSerialNumber psn; Session *s; long a5; QHdr sendq; /* Blocks waiting to be sent */ } Socket; typedef struct { QElem qelem; int flags; wdsEntry wds; short wdstermcompleted_open(TCPiopb*); static void macnet_completed_send(TCPiopb*); static void macnet_sent(Socket *); static void macnet_startsend(Socket *); static void macnet_completed_closecompleted_open_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPIOCompletionProcInfo, (ProcPtr)macnet_completed_open); static RoutineDescriptor macnet_complete_send_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPIOCompletionProcInfo, (ProcPtr)macnet_completed_send); static RoutineDescriptor macnet_completed_close_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPIOCompletionProcInfo, (ProcPtr)macnet_completed_closecompleted_open_upp macnet_completed_open #define macnet_completed_send_upp macnet_completed_send #define macnet_completed_close_upp macnet_completed_close/* * FIXME: This is hideously broken, in that we're meant to faff * with unit numbers and stuff, and we blatantly don't. */ return 0#if !TARGET_RT_CFM long olda5; olda5 = SetA5(sock->a5); #endifcompleted_open#if !TARGET_RT_CFM SetA5(olda5); #endif } static void macnet_completed_open#if !TARGET_RT_CFM long olda5; olda5 = SetA5(sock->a5); #endif#if !TARGET_RT_CFM SetA5(olda5); #endif#if !TARGET_RT_CFM long olda5; olda5 = SetA5(sock->a5); #endif#if !TARGET_RT_CFM SetA5(olda5); #endifwds.length = buflen; buff->wds.ptr = (Ptr)&buff[1]; /* after the end of the struct */ buff->wdsterm = 0; memcpy(&buff[1], buf, buflen); Enqueue(&buff->qelem, &sock->sendq); /* Kick off the transmit if the queue was empty */ if (sock->sendq.qHead == &buff->qelem) macnet_startsend(sock); } /* * This is called once every time round the event loop to check for * network events and handle them. */ void macnet_eventcheck() { NetEvent *ne; if (!mtcp_initted) return; ne = (NetEvent *)macnet_eventq.qHead; if (ne == NULL) return; Dequeue(&ne->qelem, &macnet_eventq); switch (ne->type) { case NE_SENT: macnet_sent(ne->sock); break; default: (ne->sock->s->back->msg)(ne->sock->s, ne->sock, ne->type); break; } Enqueue(&ne->qelem, &macnet_freeq); } /* * The block at the head of the send queue has finished sending, so we * can free it. Kick off the next transmission if there is one. */ static void macnet_sent(Socket *sock) { Send_Buffer *buff; assert(sock->sendq.qHead != NULL); buff = (Send_Buffer *)sock->sendq.qHead; Dequeue(&buff->qelem, &sock->sendq); sfree(buff); if (sock->sendq.qHead != NULL) macnet_startsend(sock); } /* * There's a block on the head of the send queue which needs to be * sent. */ static void macnet_startsend(Socket *sock) { Send_Buffer *buff; OSErr err; buff = (Send_Buffer *)sock->sendq.qHead; sock->iopb.csCode = TCPSend; sock->iopb.csParam.send.validityFlags = 0; sock->iopb.csParam.send.pushFlag = buff->flags & SEND_PUSH ? true : false; sock->iopb.csParam.send.urgentFlag = buff->flags & SEND_URG ? true : false; sock->iopb.csParam.send.wdsPtr = (Ptr)&buff->wds; sock->iopb.csParam.send.userDataPtr = (char *)sock; err = PBControlAsync((ParmBlkPtr)&sock->iopb rcvBuff = buf; iopb.csParam.receive.rcvBrcvBompleted_closeompleted_close(TCPiopb* iopb) { Socket *sock = (Socket *)iopb->csParam.close.userDataPtr; #if !TARGET_RT_CFM long olda5; olda5 = SetA5(sock->a5); #endif#if !TARGET_RT_CFM SetA5(olda5); #endif Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 06cd7c17a0b812963f38d5c92b996f7d Text-delta-base-sha1: e727fdb1e8bc520bb322b0213097f8d9218ff320 Text-content-length: 399 Text-content-md5: e36e5d08207e3448ecda81c8ed0e6905 Text-content-sha1: 16f2cf4adbc69b224d3a38b9d4062e75dcb1283f Content-length: 443 K 15 cvs2svn:cvs-rev V 8 1.1.2.34 PROPS-END SVN@Cfd0d\LQo/* $Id: macterm.c,v 1.1.2.34 1999/04/04 18:23:34telnet->back->init(s); /* starttime = TickCount(); */ /* display_resource(s, 'pTST', 128); */ /* sprintf(msg, "Elapsed ticks: %d\015\012", TickCount() - starttime); */ /* inbuf_putstr(s, msg); */ /* term_out(s); */void lognegot(/*Session *s,*/ const char *str) { /* XXX Do something */ Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: bd1c720fd89a9b1fc826c9847f679c28 Text-delta-base-sha1: 73b6b6ec3c05dc0d6c6899de79fc07f58f732b47 Text-content-length: 572 Text-content-md5: d8677e37c4d12cd7d248eccd6c6e1df9 Text-content-sha1: e74d2737001eab31efb170f5e1b86f1f8d616bc7 Content-length: 616 K 15 cvs2svn:cvs-rev V 8 1.4.2.19 PROPS-END SVN1 .#b%pjXYSENT, /* Used internally by Mac network stack#ifdef macintosh typedef Socket *SOCKET; #define INVALID_SOCKET NULL #endif typedef struct { char *(*init) (Session *); int (*msg)(Session *, SOCKETextern void write_clip (void *, int); extern void get_clip (void **, int *); extern void do_scroll(Session *, int, int, int); extern void fatalbox(const char *, ...); #ifdef macintosh #pragma noreturn (fatalbox) #endif extern void beep(Session *s); extern void lognegot(const char *#define SEND_PUSH 0x01 #define SEND_URG 0x02 Node-path: putty-ben-mac-port/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: d4ab10e64d6d574ea793ada4880c0aea Text-delta-base-sha1: 890827b1e2ea8ef5d4eba6ab13bce4574149dcb0 Text-content-length: 2759 Text-content-md5: 7da33904edb36ccecc48a047a63a1962 Text-content-sha1: f35749c56569db8021801d499522419626646b97 Content-length: 2802 K 15 cvs2svn:cvs-rev V 7 1.2.2.3 PROPS-END SVNgbV!!]xox4A[ zbw\- fRmX@;W{8R| z/ue{P|5KyZwBs~kpZa>_)5<q-T4l Sz#ifdef macintosh#include #include "putty.h" static SOCKET s = INVALID_SOCKET; /* kludge till we decide where to put telnet state */ static Session *sessSession *ignoreunsignedsess->outbuf_head != sess->outbuf_reap) { int end = (sess->outbuf_reap < sess->outbuf_head ? sess->outbuf_head : OUTBUF_SIZE); int len = end - sess->outbuf_reap; int ret; ret = net_send (s, sess->outbuf+sess->outbuf_reap, len, 0); if (ret > 0) sess->outbuf_reap = (sess->sess->outbuf_head + 1) & OUTBUF_MASK; if (new_head != sess->outbuf_reap) { sess->outbuf[sess->outbuf_head] = *p++; sess->sess->inbuf_head + 1) & INBUF_MASK; int c = (unsigned char) *buf; if (new_head != sess->inbuf_reap) { sess->inbuf[sess->inbuf_head] = *buf++; sess->sesssess->cfg.termspeed)+80]; b[0] = IAC; b[1] = SB; b[2] = TELOPT_TSPEED; b[3] = TELQUAL_IS; strcpy((char *)b+4, sess->cfg.termspeed); n = 4 + strlen(sess->sess->sess->sess->cfg.termtype[n]; n++) b[n+4] = (sess->cfg.termtype[n] >= 'a' && sess->cfg.termtype[n] <= 'z' ? sess->cfg.termtype[n] + 'A'-'a' : sess->sess->sess->sess->cfg.username) { b[n++] = var; b[n++] = 'U'; b[n++] = 'S'; b[n++] = 'E'; b[n++] = 'R'; b[n++] = value; e = sess->ELNET_TOPLEVEL, SEENIAC, SEENWILL, SEENWONT, SEENDO, SEENDONT, SEENSB, SUBNEGOT, SUBNEG_IAC, SEENCR } telnet_state = TELNET_ELNET_TOPLEVEL: case SEENCR: if (c == NUL && telnet_state == SEENCR) telnet_state = TELNET_(char *)ELNET_ELNET_ELNET_ELNET_TOPLEVEL; break; case SEENDO: proc_rec_opt (DO, c); telnet_state = TELNET_TOPLEVEL; break; case SEENDONT: proc_rec_opt (DONT, c); telnet_state = TELNET_unsignedELNET_/ static char *telnet_init (Session *this_sess) { sess = this_sess; s = net_open(sess, sess->cfg.host, sess->cfg.port);Session *sess, SOCKET sock, Net_Event_Type neswitch (ne) { case NE_DATA: ret = net_recv(s, buf, sizeof(buf), 0); if (ret < 0) /* any _other_ error */ return -1NE_URGENT: do { ret = net_recv(s, buf, sizeof(buf), 0); } while (ret > 0); telnet_state = TELNET_TOPLEVEL; do { ret = net_recv(s, buf, 1, /*MSG_OOB*/ 0); if (ret > 0) do_telnet_read (buf, ret); } while (ret > 0); if (ret < 0) return -3; return 1; case NE_CLOSINGSession *this_sess, Session *sesssess->cols >> 8; b[4] = sess->cols & 0xFF; b[5] = sess->rows >> 8; b[6] = sess->Session *sess, sess->outbuf_head = sess->outbuf_reap = 0; b[0] = DM; net_send (s, b, 1, SEND_URG Node-path: putty-ben-mac-port/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 5790afb9f1432b9e266ca860ddf5f362 Text-delta-base-sha1: f787cd11a705c1c2b4b98d1213feb03b42fa6397 Text-content-length: 224 Text-content-md5: 4489195c6aa8c81b4bf89ddbc8335c35 Text-content-sha1: 1a693d8297698d5a7cbba524267bb38b0bdab9ef Content-length: 267 K 15 cvs2svn:cvs-rev V 7 1.1.2.6 PROPS-END SVNB0yXt/* $Id: testback.c,v 1.1.2.6 1999/04/04 18:23:35); static int null_msg(Session *, Socket *, Net_Event_Type) { return NULL; } static int null_msg(Session *s, Socket *sock, Net_Event_Type ne Revision-number: 157 Prop-content-length: 330 Content-length: 330 K 8 svn:date V 27 1999-04-06T23:18:50.000000Z K 7 svn:log V 231 Mac networking ios still as shafted as ever, but I should probably commit what I _have_ done. It does manage to open a connection to the correct port on the correct host -- it just then bombs the client with a "CHK error". Pity. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 0df15c092d552529febcb1c8b9926bc4 Text-delta-base-sha1: 234ec6288d12f8ec196737c0b1e25fe3fdab94d8 Text-content-length: 3514 Text-content-md5: be337b35125d636e21f0a3805f1c4e22 Text-content-sha1: 6df90445972952f142f84338f67f823591232167 Content-length: 3557 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVN(jji|U.o?szM=2MO?irLuNF +` ttLuCvx}zmSBZbt:cu6elMI[M/* $Id: macnet.c,v 1.1.2.4 1999/04/06 23:18:49#if TARGET_CPU_68K && !TARGET_RT_CFM long a5; #endif/* These handle A5 switching to thwart the optimiser. */ static pascal void macnet_resolved_upp(hostInfo *, char *); static void macnet_completed_open_upp(TCPiopb *); static void macnet_completed_send_upp(TCPiopb *); static void macnet_completed_close_upp(TCPiopb *); static pascal void macnet_asr_upp(StreamPtr, unsigned short, Ptr, unsigned short, ICMPReport *); On the other hand, neither does NCSA Telnet. Hmm#if TARGET_CPU_68K && !TARGET_RT_CFM sock->a5 = SetCurrentA5(); #endifioCompletion = NULLcreate/* * A cache fault indicates that the DNR will call us back when * it's found the host for us. */ if (err#if TARGET_CPU_68K && !TARGET_RT_CFM static pascal void macnet_resolved_upp(hostInfo *hi, char *cookie) { Socket *sock = (Socket *)cookie; long olda5; olda5 = SetA5(sock->a5); macnet_resolved(hi, cookie); SetA5(olda5); } #endif static pascal void macnet_resolved(hostInfo *hi, char *cookie) { Socket *sock = (Socket *)cookie; OSErr err; memset(&sock->iopb.csParam, 0, sizeof(sock->iopb.csParam)); sock->iopb.csParam.open.validityFlags = typeOfService;As} #if TARGET_CPU_68K && !TARGET_RT_CFM static void macnet_completed_open_upp long olda5; olda5 = SetA5(sock->a5); macnet_completed_open(iopb); SetA5(olda5); } #endifOPEN); break; default: macnet_sendevent(sock, NE_NOOPEN); break; } } #if TARGET_CPU_68K && !TARGET_RT_CFM static pascal void macnet_asr_upp(StreamPtr tcpstream, unsigned short eventcode, Ptr cookie, unsigned short terminreason, ICMPReport *icmpmsg) { Socket *sock = (Socket *)cookie; long olda5; olda5 = SetA5(sock->a5); macnet_asr(tcpstream, eventcode, cookie, terminreason, icmpmsg); SetA5(olda5); } #endifioCompletion = macnet_completed_send_upp; sock->iopb.csCode = TCPSend; memset(&sock->iopb.csParam, 0, sizeof(sock->iopb.csParam))#if TARGET_CPU_68K && !TARGET_RT_CFM static void macnet_completed_send_upp(TCPiopb *iopb) { Socket *sock = (Socket *)iopb->csParam.send.userDataPtr; long olda5; olda5 = SetA5(sock->a5); macnet_completed_send(iopb); SetA5(olda5); } #endif static void macnet_completed_send(TCPiopb *iopb) { Socket *sock = (Socket *)iopb->csParam.send.userDataPtr; SENT); break; case connectionClosing: case connectionTerminated: /* We'll get an ASR, so ignore it here. */ break; default: macnet_sendevent(sock, NE_DIED); break; } } */ iopb.ioCompletion = NULL; iopb.csCode = TCPStatus; memset(&sock->iopb.csParam, 0, sizeof(sock->iopb.csParam))ioCompletion = NULL; iopb.csCode = TCPRcv; memset(&sock->iopb.csParam, 0, sizeof(sock->iopb.csParam))memset(&sock->spareiopb.csParam, 0, sizeof(sock->spareiopb.csParam#if TARGET_CPU_68K && !TARGET_RT_CFM static void macnet_completed_close_upp(TCPiopb* iopb) { Socket *sock = (Socket *)iopb->csParam.close.userDataPtr; long olda5; olda5 = SetA5(sock->a5); macnet_completed_close(iopb); SetA5(olda5); } #endifioCompletion = NULL; iopb.csCode = TCPRelease; memset(&iopb.csParam, 0, sizeof(iopb.csParam))if (ne == NULL) return; /* It's a disaster, but how do we tell anyone? */ Node-path: putty-ben-mac-port/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 7da33904edb36ccecc48a047a63a1962 Text-delta-base-sha1: f35749c56569db8021801d499522419626646b97 Text-content-length: 522 Text-content-md5: 268e5e5b086c5a9db307a1a18ccd29d0 Text-content-sha1: 2612822b25b769b4117271d7857645b4ff4e0f14 Content-length: 565 K 15 cvs2svn:cvs-rev V 7 1.2.2.4 PROPS-END SVNgJ#Y@X>W#kK{l#ifdef macintosh #pragma segment Telnet #endifreturn NULL; } static void telnet_opened(Session *sess) {OPEN: telnet_opened(sess); return 1; case NE_NOHOST: fatalbox("Host not found"); case NE_REFUSED: fatalbox("Connection refused"); case NE_NOOPEN: fatalbox("Unable to open connection"); case NE_TIMEOUT: fatalbox("Connection timed out"); case NE_ABORT: fatalbox("Connection reset by peer"); case NE_DIED: fatalbox("Connection died") Revision-number: 158 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 73 Some tweaks, but it still crashes. Really need to do some proper tests. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-04-07T22:43:35.000000Z PROPS-END Node-path: putty-ben-mac-port/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: be337b35125d636e21f0a3805f1c4e22 Text-delta-base-sha1: 6df90445972952f142f84338f67f823591232167 Text-content-length: 201 Text-content-md5: 54404678e81cf6eb85f1cefca8c2bbfd Text-content-sha1: 19393fcfd60429b082664e61b57ff7450bff7737 Content-length: 244 K 15 cvs2svn:cvs-rev V 7 1.1.2.5 PROPS-END SVNj0".[d-KA937/* $Id: macnet.c,v 1.1.2.5 1999/04/07 22:43:35/* ASRs apparently get their A5 world set up for them. */ #define macnet_asr_upp macnet_asr*eventblock*sock Revision-number: 159 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 39 original version from MacTCP 2.0.6 SDK K 10 svn:author V 3 ben K 8 svn:date V 27 1999-04-07T22:48:55.000000Z PROPS-END Node-path: putty-ben-mac-port/dnr.c Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 9613 Text-content-md5: b3647bca3a744e2f62d59fba58fe5e90 Text-content-sha1: 955256058f43579c86908a30009e058d5f787783 Content-length: 9733 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 PROPS-END SVN/* File: DNR.c Contains: DNR library for MPW Copyright: 1989-1995 by Apple Computer, Inc., all rights reserved Version: Technology: Networking Package: Use with MacTCP 2.0.6 and the Universal Interfaces 2.1b1 Change History (most recent first): <3> 1/23/95 rrk implemented use of universal procptrs Changed selector name HINFO to HXINFO due to conflict of name in MacTCP header Removed use of TrapAvailable and exchanged for the TrapExists call. Changed symbol codeHandle to gDNRCodeHndl Changed symbol dnr to gDNRCodePtr Further modifications by Steve Falkenburg, Apple MacDTS 8/91 Modifications by Jim Matthews, Dartmouth College, 5/91 */ #ifndef __OSUTILS__ #include #endif #ifndef __ERRORS__ #include #endif #ifndef __FILES__ #include #endif #ifndef __RESOURCES__ #include #endif #ifndef __MEMORY__ #include #endif #ifndef __TRAPS__ #include #endif #ifndef __GESTALTEQU__ #include #endif #ifndef __FOLDERS__ #include #endif #ifndef __TOOLUTILS__ #include #endif #ifndef __MACTCP__ #include "MacTCP.h" #endif #ifndef __ADDRESSXLATION__ #include "AddressXlation.h" #endif // think C compatibility stuff #ifndef _GestaltDispatch #define _GestaltDispatch _Gestalt #endif /* RRK Modification 1/95 - commenting out the following defines as they are defined in the DNRCalls.h header file */ void GetSystemFolder(short *vRefNumP, long *dirIDP); void GetCPanelFolder(short *vRefNumP, long *dirIDP); short SearchFolderForDNRP(long targetType, long targetCreator, short vRefNum, long dirID); short OpenOurRF(void); short NumToolboxTraps(void); TrapType GetTrapType(short theTrap); Boolean TrapExists(short theTrap); static Handle gDNRCodeHndl = nil; static ProcPtr gDNRCodePtr = nil; /* Check the bits of a trap number to determine its type. */ /* InitGraf is always implemented (trap $A86E). If the trap table is big ** enough, trap $AA6E will always point to either Unimplemented or some other ** trap, but will never be the same as InitGraf. Thus, you can check the size ** of the trap table by asking if the address of trap $A86E is the same as ** $AA6E. */ #pragma segment UtilMain short NumToolboxTraps(void) { if (NGetTrapAddress(_InitGraf, ToolTrap) == NGetTrapAddress(0xAA6E, ToolTrap)) return(0x200); else return(0x400); } #pragma segment UtilMain TrapType GetTrapType(short theTrap) { /* OS traps start with A0, Tool with A8 or AA. */ if ((theTrap & 0x0800) == 0) /* per D.A. */ return(OSTrap); else return(ToolTrap); } Boolean TrapExists(short theTrap) { TrapType theTrapType; theTrapType = GetTrapType(theTrap); if ((theTrapType == ToolTrap) && ((theTrap &= 0x07FF) >= NumToolboxTraps())) theTrap = _Unimplemented; return(NGetTrapAddress(_Unimplemented, ToolTrap) != NGetTrapAddress(theTrap, theTrapType)); } void GetSystemFolder(short *vRefNumP, long *dirIDP) { SysEnvRec info; long wdProcID; SysEnvirons(1, &info); if (GetWDInfo(info.sysVRefNum, vRefNumP, dirIDP, &wdProcID) != noErr) { *vRefNumP = 0; *dirIDP = 0; } } void GetCPanelFolder(short *vRefNumP, long *dirIDP) { Boolean hasFolderMgr = false; long feature; if (TrapExists(_GestaltDispatch)) if (Gestalt(gestaltFindFolderAttr, &feature) == noErr) hasFolderMgr = true; if (!hasFolderMgr) { GetSystemFolder(vRefNumP, dirIDP); return; } else { if (FindFolder(kOnSystemDisk, kControlPanelFolderType, kDontCreateFolder, vRefNumP, dirIDP) != noErr) { *vRefNumP = 0; *dirIDP = 0; } } } /* SearchFolderForDNRP is called to search a folder for files that might contain the 'dnrp' resource */ short SearchFolderForDNRP(long targetType, long targetCreator, short vRefNum, long dirID) { HParamBlockRec fi; Str255 filename; short refnum; fi.fileParam.ioCompletion = nil; fi.fileParam.ioNamePtr = filename; fi.fileParam.ioVRefNum = vRefNum; fi.fileParam.ioDirID = dirID; fi.fileParam.ioFDirIndex = 1; while (PBHGetFInfo(&fi, false) == noErr) { /* scan system folder for driver resource files of specific type & creator */ if (fi.fileParam.ioFlFndrInfo.fdType == targetType && fi.fileParam.ioFlFndrInfo.fdCreator == targetCreator) { /* found the MacTCP driver file? */ refnum = HOpenResFile(vRefNum, dirID, filename, fsRdPerm); if (GetIndResource('dnrp', 1) == NULL) CloseResFile(refnum); else return refnum; } /* check next file in system folder */ fi.fileParam.ioFDirIndex++; fi.fileParam.ioDirID = dirID; /* PBHGetFInfo() clobbers ioDirID */ } return(-1); } /* OpenOurRF is called to open the MacTCP driver resources */ short OpenOurRF(void) { short refnum; short vRefNum; long dirID; /* first search Control Panels for MacTCP 1.1 */ GetCPanelFolder(&vRefNum, &dirID); refnum = SearchFolderForDNRP('cdev', 'ztcp', vRefNum, dirID); if (refnum != -1) return(refnum); /* next search System Folder for MacTCP 1.0.x */ GetSystemFolder(&vRefNum, &dirID); refnum = SearchFolderForDNRP('cdev', 'mtcp', vRefNum, dirID); if (refnum != -1) return(refnum); /* finally, search Control Panels for MacTCP 1.0.x */ GetCPanelFolder(&vRefNum, &dirID); refnum = SearchFolderForDNRP('cdev', 'mtcp', vRefNum, dirID); if (refnum != -1) return(refnum); return -1; } OSErr OpenResolver(char *fileName) { short refnum; OSErr rc; if (gDNRCodePtr != nil) /* resolver already loaded in */ return(noErr); /* open the MacTCP driver to get DNR resources. Search for it based on creator & type rather than simply file name */ refnum = OpenOurRF(); /* ignore failures since the resource may have been installed in the System file if running on a Mac 512Ke */ /* load in the DNR resource package */ gDNRCodeHndl = GetIndResource('dnrp', 1); if (gDNRCodeHndl == nil) { /* can't open DNR */ return(ResError()); } DetachResource(gDNRCodeHndl); if (refnum != -1) { CloseResFile(refnum); } /* lock the DNR resource since it cannot be reloated while opened */ MoveHHi(gDNRCodeHndl); HLock(gDNRCodeHndl); gDNRCodePtr = (ProcPtr)*gDNRCodeHndl; /* call open resolver */ // RRK modification 1/95 use CallOpenResolverProc define to call UPP rc = CallOpenResolverProc(gDNRCodePtr, OPENRESOLVER, fileName); if (rc != noErr) { /* problem with open resolver, flush it */ HUnlock(gDNRCodeHndl); DisposeHandle(gDNRCodeHndl); gDNRCodePtr = nil; } return(rc); } OSErr CloseResolver(void) { if (gDNRCodePtr == nil) /* resolver not loaded error */ return(notOpenErr); /* call close resolver */ // RRK modification 1/95 use CallCloseResolverProc define to call UPP // (void) (*dnr)(CLOSERESOLVER); CallCloseResolverProc(gDNRCodePtr, CLOSERESOLVER); /* release the DNR resource package */ HUnlock(gDNRCodeHndl); DisposeHandle(gDNRCodeHndl); gDNRCodePtr = nil; return(noErr); } // RRK modification 1/95 declare parameter resultProc to be of type // ResultProcUPP instead of a long OSErr StrToAddr(char *hostName, struct hostInfo *rtnStruct, ResultUPP resultproc, Ptr userDataPtr) { if (gDNRCodePtr == nil) /* resolver not loaded error */ return(notOpenErr); // RRK modification 1/95 use CallStrToAddrProc define to call UPP // return((*dnr)(STRTOADDR, hostName, rtnStruct, resultproc, userDataPtr)); return (CallStrToAddrProc(gDNRCodePtr, STRTOADDR, hostName, rtnStruct, resultproc, userDataPtr)); } OSErr AddrToStr(unsigned long addr, char *addrStr) { OSErr err; if (gDNRCodePtr == nil) /* resolver not loaded error */ return(notOpenErr); // RRK modification 1/95 use CallAddrToStrProc define to call UPP // (*dnr)(ADDRTOSTR, addr, addrStr); err = CallAddrToStrProc(gDNRCodePtr, ADDRTOSTR, addr, addrStr); return(noErr); } OSErr EnumCache(EnumResultUPP resultproc, Ptr userDataPtr) { if (gDNRCodePtr == nil) /* resolver not loaded error */ return(notOpenErr); // RRK modification 1/95 use CallEnumCacheProc define to call UPP // return((*dnr)(ENUMCACHE, resultproc, userDataPtr)); return (CallEnumCacheProc(gDNRCodePtr, ENUMCACHE, resultproc, userDataPtr)); } OSErr AddrToName(unsigned long addr, struct hostInfo *rtnStruct, ResultUPP resultproc, Ptr userDataPtr) { if (gDNRCodePtr == nil) /* resolver not loaded error */ return(notOpenErr); // RRK modification 1/95 use CallAddrToNameProc define to call UPP // return((*dnr)(ADDRTONAME, addr, rtnStruct, resultproc, userDataPtr)); return(CallAddrToNameProc(gDNRCodePtr, ADDRTONAME, addr, rtnStruct, resultproc, userDataPtr)); } extern OSErr HInfo(char *hostName, struct returnRec *returnRecPtr, ResultProc2UPP resultProc, Ptr userDataPtr) { if (gDNRCodePtr == nil) /* resolver not loaded error */ return(notOpenErr); // RRK modification 1/95 use CallHInfoProc define to call UPP // return((*dnr)(HINFO, hostName, returnRecPtr, resultProc, userDataPtr)); return(CallHInfoProc(gDNRCodePtr, HXINFO, hostName, returnRecPtr, resultProc, userDataPtr)); } extern OSErr MXInfo(char *hostName, struct returnRec *returnRecPtr, ResultProc2UPP resultProc, Ptr userDataPtr) { if (gDNRCodePtr == nil) /* resolver not loaded error */ return(notOpenErr); // RRK modification 1/95 use CallHInfoProc define to call UPP // return((*dnr)(MXINFO, hostName, returnRecPtr, resultProc, userDataPtr)); return(CallMXInfoProc(gDNRCodePtr, MXINFO, hostName, returnRecPtr, resultProc, userDataPtr)); } /* removed ; (causes syntax err in Think C 5.0 */ Revision-number: 160 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 48 various tweaks to make it work with current MPW K 10 svn:author V 3 ben K 8 svn:date V 27 1999-04-07T22:50:11.000000Z PROPS-END Node-path: putty-ben-mac-port/dnr.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: b3647bca3a744e2f62d59fba58fe5e90 Text-delta-base-sha1: 955256058f43579c86908a30009e058d5f787783 Text-content-length: 431 Text-content-md5: ae0a6d0e0ba98f466b30b894b133fbee Text-content-sha1: cc148a42879cd190ff37d90e72222fe39a36e0ea Content-length: 474 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVN}C`F0@>i|'e#e%m4;F __ #include = 0; j--) c[j+len] = 0; for (i = len - 1; i >= 0; i--) { ai = a[i]; t = 0; for (j = len - 1; j >= 0; j--) { t += ai * (unsigned long) b[j]; t += (unsigned long) c[i+j+1]; c[i+j+1] = t; t = t >> 16; } c[i] = t; } } /* * Compute a = a % m. * Input in first 2*len words of a and first len words of m. * Output in first 2*len words of a (of which first len words will be zero). * The MSW of m MUST have its high bit set. */ static void bigmod(unsigned short *a, unsigned short *m, int len) { unsigned short m0, m1; unsigned int h; int i, k; /* Special case for len == 1 */ if (len == 1) { a[1] = (((long) a[0] << 16) + a[1]) % m[0]; a[0] = 0; return; } m0 = m[0]; m1 = m[1]; for (i = 0; i <= len; i++) { unsigned long t; unsigned int q, r, c; if (i == 0) { h = 0; } else { h = a[i-1]; a[i-1] = 0; } /* Find q = h:a[i] / m0 */ t = ((unsigned long) h << 16) + a[i]; q = t / m0; r = t % m0; /* Refine our estimate of q by looking at h:a[i]:a[i+1] / m0:m1 */ t = (long) m1 * (long) q; if (t > ((unsigned long) r << 16) + a[i+1]) { q--; t -= m1; r = (r + m0) & 0xffff; /* overflow? */ if (r >= m0 && t > ((unsigned long) r << 16) + a[i+1]) q--; } /* Substract q * m from a[i...] */ c = 0; for (k = len - 1; k >= 0; k--) { t = (long) q * (long) m[k]; t += c; c = t >> 16; if ((unsigned short) t > a[i+k]) c++; a[i+k] -= (unsigned short) t; } /* Add back m in case of borrow */ if (c != h) { t = 0; for (k = len - 1; k >= 0; k--) { t += m[k]; t += a[i+k]; a[i+k] = t; t = t >> 16; } } } } /* * Compute (base ^ exp) % mod. * The base MUST be smaller than the modulus. * The most significant word of mod MUST be non-zero. * We assume that the result array is the same size as the mod array. */ static void modpow(Bignum base, Bignum exp, Bignum mod, Bignum result) { unsigned short *a, *b, *n, *m; int mshift; int mlen, i, j; /* Allocate m of size mlen, copy mod to m */ /* We use big endian internally */ mlen = mod[0]; m = malloc(mlen * sizeof(unsigned short)); for (j = 0; j < mlen; j++) m[j] = mod[mod[0] - j]; /* Shift m left to make msb bit set */ for (mshift = 0; mshift < 15; mshift++) if ((m[0] << mshift) & 0x8000) break; if (mshift) { for (i = 0; i < mlen - 1; i++) m[i] = (m[i] << mshift) | (m[i+1] >> (16-mshift)); m[mlen-1] = m[mlen-1] << mshift; } /* Allocate n of size mlen, copy base to n */ n = malloc(mlen * sizeof(unsigned short)); i = mlen - base[0]; for (j = 0; j < i; j++) n[j] = 0; for (j = 0; j < base[0]; j++) n[i+j] = base[base[0] - j]; /* Allocate a and b of size 2*mlen. Set a = 1 */ a = malloc(2 * mlen * sizeof(unsigned short)); b = malloc(2 * mlen * sizeof(unsigned short)); for (i = 0; i < 2*mlen; i++) a[i] = 0; a[2*mlen-1] = 1; /* Skip leading zero bits of exp. */ i = 0; j = 15; while (i < exp[0] && (exp[exp[0] - i] & (1 << j)) == 0) { j--; if (j < 0) { i++; j = 15; } } /* Main computation */ while (i < exp[0]) { while (j >= 0) { bigmul(a + mlen, a + mlen, b, mlen); bigmod(b, m, mlen); if ((exp[exp[0] - i] & (1 << j)) != 0) { bigmul(b + mlen, n, a, mlen); bigmod(a, m, mlen); } else { unsigned short *t; t = a; a = b; b = t; } j--; } i++; j = 15; } /* Fixup result in case the modulus was shifted */ if (mshift) { for (i = mlen - 1; i < 2*mlen - 1; i++) a[i] = (a[i] << mshift) | (a[i+1] >> (16-mshift)); a[2*mlen-1] = a[2*mlen-1] << mshift; bigmod(a, m, mlen); for (i = 2*mlen - 1; i >= mlen; i--) a[i] = (a[i] >> mshift) | (a[i-1] << (16-mshift)); } /* Copy result to buffer */ for (i = 0; i < mlen; i++) result[result[0] - i] = a[i+mlen]; /* Free temporary arrays */ for (i = 0; i < 2*mlen; i++) a[i] = 0; free(a); for (i = 0; i < 2*mlen; i++) b[i] = 0; free(b); for (i = 0; i < mlen; i++) m[i] = 0; free(m); for (i = 0; i < mlen; i++) n[i] = 0; free(n); } #else#endif Revision-number: 172 Prop-content-length: 162 Content-length: 162 K 10 svn:author V 5 simon K 8 svn:date V 27 1999-07-05T16:35:34.000000Z K 7 svn:log V 62 Put that ReleaseCapture call just _before_ return, not after! PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a08ba785e147f346e537e30b25d39d0a Text-delta-base-sha1: 3463c0e343c2144e2206646407dd9271d5a9940c Text-content-length: 61 Text-content-md5: 5e34c4d6f1bc52897a8402f3531a226f Text-content-sha1: 4869a100eb9e09989e93a28766cad983907ee01c Content-length: 100 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNvv #Mp ReleaseCapture(); return 0 Revision-number: 173 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 1999-07-06T19:38:54.000000Z K 7 svn:log V 51 Joris's RSA works; reformat and remove old version K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 697b421b87bac4234b124b1b6f3aa475 Text-delta-base-sha1: 168ca19ce45ede43dde9ad3b501ac0f96e660c94 Text-content-length: 4203 Text-content-md5: c73102bed8aa555bdef5bddd03f2eb85 Text-content-sha1: 4d9de5f38d21fcdb08e6bb7f2282f65f99af5e3f Content-length: 4242 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN'8VTJ!J3Ns(vs * Rewritten for more speed by Joris van Rantwijk, Jun 1999. /* * Compute c = a * b. * Input is in the first len words of a and b. * int i, j; unsigned long ai, t; for (j = len - 1; j >= 0; j--) c[j+len] = 0; for (i = len - 1; i >= 0; i--) { ai = a[i]; t = 0; for (j = len - 1; j >= 0; j--) { t += ai * (unsigned long) b[j]; t += (unsigned long) c[i+j+1]; c[i+j+1] = (unsigned short)t; t = t >> 16; } c[i] = (unsigned short)t; } } /* * Compute a = a % m. * Input in first 2*len words of a and first len words of m. *The MSW of m MUST have its high bit set. */ static void bigmod(unsigned short *a, unsigned short *m, int len) { unsigned short m0, m1; unsigned int h; int i, k; /* Special case for len == 1 */ if (len == 1) { a[1] = (((long) a[0] << 16) + a[1]) % m[0]; a[0] = 0; return; } m0 = m[0]; m1 = m[1]; for (i = 0; i <= len; i++) { unsigned long t; unsigned int q, r, c; if (i == 0) { h = 0; } else { h = a[i-1]; a[i-1] = 0; } /* Find q = h:a[i] / m0 */ t = ((unsigned long) h << 16) + a[i]; q = t / m0; r = t % m0; /* Refine our estimate of q by looking at h:a[i]:a[i+1] / m0:m1 */ t = (long) m1 * (long) q; if (t > ((unsigned long) r << 16) + a[i+1]) { q--; t -= m1; r = (r + m0) & 0xffff; /* overflow? */ if (r >= m0 && t > ((unsigned long) r << 16) + a[i+1]) q--; } /* Substract q * m from a[i...] */ c = 0; for (k = len - 1; k >= 0; k--) { t = (long) q * (long) m[k]; t += c; c = t >> 16; if ((unsigned short) t > a[i+k]) c++; a[i+k] -= (unsigned short) t; } /* Add back m in case of borrow */ if (c != h) { t = 0; for (k = len - 1; k >= 0; k--) { t += m[k]; t += a[i+k]; a[i+k] = (unsigned short)t; t = t >> 16; } } } } /* * Compute (base ^ exp) % mod. * The base MUST be smaller than the modulus. * The most significant word of mod MUST be non-zero. * unsigned short *a, *b, *n, *m; int mshift; int mlen, i, j; /* Allocate m of size mlen, copy mod to m */ /* We use big endian internally */ mlen = mod[0]; m = malloc(mlen * sizeof(unsigned short)); for (j = 0; j < mlen; j++) m[j] = mod[mod[0] - j]; /* Shift m left to make msb bit set */ for (mshift = 0; mshift < 15; mshift++) if ((m[0] << mshift) & 0x8000) break; if (mshift) { for (i = 0; i < mlen - 1; i++) m[i] = (m[i] << mshift) | (m[i+1] >> (16-mshift)); m[mlen-1] = m[mlen-1] << mshift; } /* Allocate n of size mlen, copy base to n */ n = malloc(mlen * sizeof(unsigned short)); i = mlen - base[0]; for (j = 0; j < i; j++) n[j] = 0; for (j = 0; j < base[0]; j++) n[i+j] = base[base[0] - j]; /* Allocate a and b of size 2*mlen. Set a = 1 */ a = malloc(2 * mlen * sizeof(unsigned short)); b = malloc(2 * mlen * sizeof(unsigned short)); for (i = 0; i < 2*mlen; i++) a[i] = 0; a[2*mlen-1] = 1; /* Skip leading zero bits of exp. */ i = 0; j = 15; while (i < exp[0] && (exp[exp[0] - i] & (1 << j)) == 0) { j--; if (j < 0) { i++; j = 15; } } /* Main computation */ while (i < exp[0]) { while (j >= 0) { bigmul(a + mlen, a + mlen, b, mlen); bigmod(b, m, mlen); if ((exp[exp[0] - i] & (1 << j)) != 0) { bigmul(b + mlen, n, a, mlen); bigmod(a, m, mlen); } else { unsigned short *t; t = a; a = b; b = t; } j--; } i++; j = 15; } /* Fixup result in case the modulus was shifted */ if (mshift) { for (i = mlen - 1; i < 2*mlen - 1; i++) a[i] = (a[i] << mshift) | (a[i+1] >> (16-mshift)); a[2*mlen-1] = a[2*mlen-1] << mshift; bigmod(a, m, mlen); for (i = 2*mlen - 1; i >= mlen; i--) a[i] = (a[i] >> mshift) | (a[i-1] << (16-mshift)); } /* Copy result to buffer */ for (i = 0; i < mlen; i++) result[result[0] - i] = a[i+mlen]; /* Free temporary arrays */ for (i = 0; i < 2*mlen; i++) a[i] = 0; free(a); for (i = 0; i < 2*mlen; i++) b[i] = 0; free(b); for (i = 0; i < mlen; i++) m[i] = 0; free(m); for (i = 0; i < mlen; i++) n[i] = 0; free(n); } Revision-number: 174 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 1999-07-06T19:38:54.000000Z K 7 svn:log V 69 This commit was manufactured by cvs2svn to create tag 'pre-blowfish'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-pre-blowfish Node-kind: dir Node-action: add Node-copyfrom-rev: 173 Node-copyfrom-path: putty Revision-number: 175 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 1999-07-06T19:42:57.000000Z K 7 svn:log V 56 Add encryption selection, and Blowfish as second option K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: df2fce26410fbdb5c70d45ba7e69121b Text-delta-base-sha1: 6408014a4811c59883fca3cf645f166ccc9971c1 Text-content-length: 65 Text-content-md5: 0b174db02c6a0d76f6334cea27e6a256 Text-content-sha1: 444d4881b226c1f1cca3bff5eeabfe9a715cb2df Content-length: 104 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN^ ,40.enum { CIPHER_3DES, CIPHER_BLOWFISH } cipher Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b3d68f198bb319f38eb97ecd7ec13088 Text-delta-base-sha1: a4040437b4516829d2c9586b32686079723556c8 Text-content-length: 815 Text-content-md5: 0ac06fa485a04a032f0ee507fe514956 Text-content-sha1: 155f214d4e33858493fe7a886166d1036619a90e Content-length: 854 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN'9#~3;YvfTF+A7p unsigned long supported_ciphers_mask; int cipher_type; extern struct ssh_cipher ssh_3des; extern struct ssh_cipher ssh_blowfishsupported_ciphers_mask = (pktin.body[12+i+j] << 24) | (pktin.body[13+i+j] << 16) | (pktin.body[14+i+j] << 8) | (pktin.body[15+i+j]cipher_type = cfg.cipher == CIPHER_BLOWFISH ? SSH_CIPHER_BLOWFISH : SSH_CIPHER_3DES; if ((supported_ciphers_mask & (1 << cipher_type)) == 0) { c_write("Selected cipher not supported, falling back to 3DES\r\n", 53); cipher_type = SSH_CIPHER_3DES; } s_wrpkt_start(3, len+15); pktout.body[0] = cipher_type;cipher_type == SSH_CIPHER_BLOWFISH ? &ssh_blowfish : Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 29f9caec1f83f2fff361477b3290ad39 Text-delta-base-sha1: db4df35fc88476634dd59e7a6b59e19a11722f11 Text-content-length: 121 Text-content-md5: bde993964679114fe44daa648b5bdc85 Text-content-sha1: 72ffba89f98a1eb96b56ead8a39625f7897ff66b Content-length: 160 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN/hh#include #define SSH_CIPHER_IDEA 1 #define SSH_CIPHER_3DES 3 #define SSH_CIPHER_BLOWFISH 6 Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 00adaac14319a2620997e10d1514b4fb Text-delta-base-sha1: 401808ce967ce45fa78e1610afd3d4a985748d0d Text-content-length: 111 Text-content-md5: 47a6bdf22550963e7253e68d2e196cf3 Text-content-sha1: 02ee7a1244786950ef3b71987f1476509a7c6ff2 Content-length: 150 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN) YxY2w#define IDC3_CIPHERSTATIC 1019 #define IDC3_CIPHER3DES 1020 #define IDC3_CIPHERBLOWF 1021 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5df33ee55a9ad8ecf854a73e68813b52 Text-delta-base-sha1: 303974969d45de45c722c431b23506df3592bf1c Text-content-length: 761 Text-content-md5: 2ce9bfdfb72ab80fc3300f8c67b06021 Text-content-sha1: 75e384e70c65189a0f1a38ba597f35f5a9fefdf9 Content-length: 800 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNARA*f9']2Gu DPU@*w<1ssh.h" #include "puttys (sesskey, "Cipher", cfg.cipher == CIPHER_BLOWFISH ? "blowfish" : "3des" RegCloseKey(subkey1{ char cipher[10]; gpps (sesskey, "Cipher", "3des", cipher, 10); if (!strcmp(cipher, "blowfish")) cfg.cipher = CIPHER_BLOWFISH; else cfg.cipher = CIPHER_3DES; }CheckRadioButton (hwnd, IDC3_CIPHER3DES, IDC3_CIPHERBLOWF, cfg.cipher == CIPHER_BLOWFISH ? IDC3_CIPHERBLOWF : IDC3_CIPHER3DES); case IDC3_CIPHER3DES: case IDC3_CIPHERBLOWFif (IsDlgButtonChecked (hwnd, IDC3_CIPHER3DES)) cfg.cipher = CIPHER_3DES; else if (IsDlgButtonChecked (hwnd, IDC3_CIPHERBLOWF)) cfg.cipher = CIPHER_BLOWFISH Revision-number: 176 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 1999-07-07T13:16:41.000000Z K 7 svn:log V 70 Fix misparse of ESC[?9r sequence; I must find out what it _should_ do K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1f6f39c62bfb3fbd15f8323dbf9be0fd Text-delta-base-sha1: 9573640e413ace3de7029e8a624e2963d5160c2d Text-content-length: 39 Text-content-md5: 1ad59138ce03da81c8cc34863ed2ea33 Text-content-sha1: c2b9f3cfe50aee9f0381f1b00bff364e28b01315 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNM[ K!esc_query && Revision-number: 177 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:53.042674Z PROPS-END Revision-number: 178 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 1999-07-07T17:33:34.000000Z K 7 svn:log V 31 Blowfish patch, second attempt K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 635a7f1567c7b32b87db19c2297fff41 Text-delta-base-sha1: 3ba372d25bfa8d92aecb3f9f6ab22d4af03b3e60 Text-content-length: 57 Text-content-md5: bac9e909fff1ee4981d9fad8c17b66dd Text-content-sha1: 888981e887fc694c1c415c3ee13e2053b1655bfe Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN-'f"sshblowfsshblowf.obj: sshblowf Node-path: putty/sshblowf.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 18151 Text-content-md5: de80e079a942cd45361b05c80ad24eb8 Text-content-sha1: 56f31b5f302fe5d3bccb406faba62f38fc437120 Content-length: 18267 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNVVV/* * Blowfish implementation for PuTTY. * * Coded from scratch from the algorithm description, apart from * the S and P boxes which are from Bruce Schneier's own * implementation. */ #include #include #include "ssh.h" typedef struct { word32 S0[256], S1[256], S2[256], S3[256], P[18]; word32 iv0, iv1; /* for CBC mode */ } BlowfishContext; #define GET_32BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8) | \ ((unsigned long)(unsigned char)(cp)[2] << 16) | \ ((unsigned long)(unsigned char)(cp)[3] << 24)) #define PUT_32BIT_LSB_FIRST(cp, value) do { \ (cp)[0] = (value); \ (cp)[1] = (value) >> 8; \ (cp)[2] = (value) >> 16; \ (cp)[3] = (value) >> 24; } while (0) /* * The Blowfish init data, straight from Bruce Schneier's reference * implementation. */ word32 sbox0[] = { 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076aL}; word32 sbox1[] = { 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7L}; word32 sbox2[] = { 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0L}; word32 sbox3[] = { 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6L}; word32 parray[] = { 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1bL}; #define Fprime(a,b,c,d) ( ( (S0[a] + S1[b]) ^ S2[c] ) + S3[d] ) #define F(x) Fprime( ((x>>24)&0xFF), ((x>>16)&0xFF), ((x>>8)&0xFF), (x&0xFF) ) #define ROUND(n) ( xL ^= P[n], t = xL, xL = F(xL) ^ xR, xR = t ) static void blowfish_encrypt(word32 xL, word32 xR, word32 *output, BlowfishContext *ctx) { word32 *S0 = ctx->S0; word32 *S1 = ctx->S1; word32 *S2 = ctx->S2; word32 *S3 = ctx->S3; word32 *P = ctx->P; word32 t; ROUND(0); ROUND(1); ROUND(2); ROUND(3); ROUND(4); ROUND(5); ROUND(6); ROUND(7); ROUND(8); ROUND(9); ROUND(10); ROUND(11); ROUND(12); ROUND(13); ROUND(14); ROUND(15); xL ^= P[16]; xR ^= P[17]; output[0] = xR; output[1] = xL; } static void blowfish_decrypt(word32 xL, word32 xR, word32 *output, BlowfishContext *ctx) { word32 *S0 = ctx->S0; word32 *S1 = ctx->S1; word32 *S2 = ctx->S2; word32 *S3 = ctx->S3; word32 *P = ctx->P; word32 t; ROUND(17); ROUND(16); ROUND(15); ROUND(14); ROUND(13); ROUND(12); ROUND(11); ROUND(10); ROUND(9); ROUND(8); ROUND(7); ROUND(6); ROUND(5); ROUND(4); ROUND(3); ROUND(2); xL ^= P[1]; xR ^= P[0]; output[0] = xR; output[1] = xL; } static void blowfish_encrypt_cbc(unsigned char *blk, int len, BlowfishContext *ctx) { word32 xL, xR, out[2], iv0, iv1; assert((len & 7) == 0); iv0 = ctx->iv0; iv1 = ctx->iv1; while (len > 0) { xL = GET_32BIT_LSB_FIRST(blk); xR = GET_32BIT_LSB_FIRST(blk+4); iv0 ^= xL; iv1 ^= xR; blowfish_encrypt(iv0, iv1, out, ctx); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_LSB_FIRST(blk, iv0); PUT_32BIT_LSB_FIRST(blk+4, iv1); blk += 8; len -= 8; } ctx->iv0 = iv0; ctx->iv1 = iv1; } static void blowfish_decrypt_cbc(unsigned char *blk, int len, BlowfishContext *ctx) { word32 xL, xR, out[2], iv0, iv1; assert((len & 7) == 0); iv0 = ctx->iv0; iv1 = ctx->iv1; while (len > 0) { xL = GET_32BIT_LSB_FIRST(blk); xR = GET_32BIT_LSB_FIRST(blk+4); blowfish_decrypt(xL, xR, out, ctx); iv0 ^= out[0]; iv1 ^= out[1]; PUT_32BIT_LSB_FIRST(blk, iv0); PUT_32BIT_LSB_FIRST(blk+4, iv1); iv0 = xL; iv1 = xR; blk += 8; len -= 8; } ctx->iv0 = iv0; ctx->iv1 = iv1; } static void blowfish_setkey(BlowfishContext *ctx, const unsigned char *key, short keybytes) { word32 *S0 = ctx->S0; word32 *S1 = ctx->S1; word32 *S2 = ctx->S2; word32 *S3 = ctx->S3; word32 *P = ctx->P; word32 str[2]; int i; for (i = 0; i < 18; i++) { P[i] = parray[i]; P[i] ^= ((word32)(unsigned char)(key[ (i*4+0) % keybytes ])) << 24; P[i] ^= ((word32)(unsigned char)(key[ (i*4+1) % keybytes ])) << 16; P[i] ^= ((word32)(unsigned char)(key[ (i*4+2) % keybytes ])) << 8; P[i] ^= ((word32)(unsigned char)(key[ (i*4+3) % keybytes ])); } for (i = 0; i < 256; i++) { S0[i] = sbox0[i]; S1[i] = sbox1[i]; S2[i] = sbox2[i]; S3[i] = sbox3[i]; } str[0] = str[1] = 0; for (i = 0; i < 18; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); P[i] = str[0]; P[i+1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S0[i] = str[0]; S0[i+1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S1[i] = str[0]; S1[i+1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S2[i] = str[0]; S2[i+1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S3[i] = str[0]; S3[i+1] = str[1]; } } /* -- Interface with PuTTY -- */ #define SSH_SESSION_KEY_LENGTH 32 static BlowfishContext ectx, dctx; static void blowfish_sesskey(unsigned char *key) { blowfish_setkey(&ectx, key, SSH_SESSION_KEY_LENGTH); ectx.iv0 = 0; ectx.iv1 = 0; dctx = ectx; } static void blowfish_encrypt_blk(unsigned char *blk, int len) { blowfish_encrypt_cbc(blk, len, &ectx); } static void blowfish_decrypt_blk(unsigned char *blk, int len) { blowfish_decrypt_cbc(blk, len, &dctx); } struct ssh_cipher ssh_blowfish = { blowfish_sesskey, blowfish_encrypt_blk, blowfish_decrypt_blk }; Revision-number: 179 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 1999-07-08T08:37:32.000000Z K 7 svn:log V 34 Third attempt at Blowfish, dammit K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a93e75f686d02bd4162941233131171b Text-delta-base-sha1: ebadb90966ee34c3c0d208582aea981f9885abd9 Text-content-length: 231 Text-content-md5: dba18bf45fb8cc29dcee23fcb00d2d79 Text-content-sha1: e2a22c67d5b62c6a8c88e31a92feebb488a68d4f Content-length: 270 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNf"K'Ky}7/ LTEXT "Cipher:", IDC3_CIPHERSTATIC, 3, 50, 40, 8 AUTORADIOBUTTON "3DES", IDC3_CIPHER3DES, 46, 50, 35, 10, WS_GROUP AUTORADIOBUTTON "Blowfish", IDC3_CIPHERBLOWF, 84, 50, 40, 10 END IDD_PANEL4 Revision-number: 180 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 1999-07-08T08:37:32.000000Z K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-46'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-0.46 Node-kind: dir Node-action: add Node-copyfrom-rev: 179 Node-copyfrom-path: putty Revision-number: 181 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 Add a couple of `extern' keywords K 10 svn:author V 5 simon K 8 svn:date V 27 1999-07-12T10:28:18.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0b174db02c6a0d76f6334cea27e6a256 Text-delta-base-sha1: 444d4881b226c1f1cca3bff5eeabfe9a715cb2df Text-content-length: 92 Text-content-md5: 50142377b39f1a1267ac5dea08bbb96f Text-content-sha1: 344dfdca88b562e14a0613237cee21ed615692c5 Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN FFDLextern Backend telnet_backend; /* * Exports from ssh.c. */ extern Revision-number: 182 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 1999-07-16T08:13:51.000000Z K 7 svn:log V 36 Remove double close of registry key K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2ce9bfdfb72ab80fc3300f8c67b06021 Text-delta-base-sha1: 75e384e70c65189a0f1a38ba597f35f5a9fefdf9 Text-content-length: 23 Text-content-md5: 634d7f5f9a3eaa5adb4e42fcd56a3cd7 Text-content-sha1: c014a7ef12fb6f4aa5099911dd1b4199d1d919c2 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNR8 Phj Revision-number: 183 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 Jimen Ching's patches to remove compiler warnings K 10 svn:author V 5 simon K 8 svn:date V 27 1999-07-20T13:01:56.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 50142377b39f1a1267ac5dea08bbb96f Text-delta-base-sha1: 344dfdca88b562e14a0613237cee21ed615692c5 Text-content-length: 25 Text-content-md5: 80cd9e121c8a6f98da3e055bd4325915 Text-content-sha1: 136fd65b9a7909ab5605b2f92c094f0d70109066 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN" =a=void Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0ac06fa485a04a032f0ee507fe514956 Text-delta-base-sha1: 155f214d4e33858493fe7a886166d1036619a90e Text-content-length: 53 Text-content-md5: d878688914ff016eaab04be5e693a2be Text-content-sha1: 4d1c263ab80ad99852171a293203fb8b38f72038 Content-length: 92 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN9Y(6GbW*p; static int i, pad Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b621bce4cc8aea4a0ff6457f7fae93e3 Text-delta-base-sha1: b1032617e0afb19e7baf6407d860d97ac5714fb5 Text-content-length: 22 Text-content-md5: 54f1d3a2f8bbe6971322436fd8471c5c Text-content-sha1: 461f1a4d0453a0716a8742cc833081ab65870b3f Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNtU rc Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 634d7f5f9a3eaa5adb4e42fcd56a3cd7 Text-delta-base-sha1: c014a7ef12fb6f4aa5099911dd1b4199d1d919c2 Text-content-length: 23 Text-content-md5: 556de6b4a720baa06c734e748e814f3f Text-content-sha1: 9d45126abb54db4befc28f6adbc2e8927fb7224d Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN8# KX` Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5e34c4d6f1bc52897a8402f3531a226f Text-delta-base-sha1: 4869a100eb9e09989e93a28766cad983907ee01c Text-content-length: 93 Text-content-md5: e812861733dc85fea923b6380764a395 Text-content-sha1: 9300543d711144433a9a58170e79a0ebe63121fa Content-length: 133 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNvd=]6]bvoid; min = (to < from ? to : from); max = to + from Revision-number: 184 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:53.297589Z PROPS-END Revision-number: 185 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:53.304639Z PROPS-END Revision-number: 186 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 1999-07-24T15:51:12.000000Z K 7 svn:log V 54 Fixes so it runs (with bugs) without Color QuickDraw. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 5bc1249eb65f8be45d80fdaef52a6d7a Text-delta-base-sha1: e40a9f5ca21ed14d7f46c6429177551dad083f9f Text-content-length: 154 Text-content-md5: 8d02caa2dfdbd75302cf6bc8fc62cb28 Text-content-sha1: 7ad9169369bfca2c6d20465975b116417c09c9a5 Content-length: 198 K 15 cvs2svn:cvs-rev V 8 1.1.2.12 PROPS-END SVN2Cy+A?.MeGestalt#define HAVE_COLOR_QD() (mac_gestalts.qdvers > gestaltOriginalQD)/* from opentpt.c */ extern void opentpt_shutdown Node-path: putty-ben-mac-port/maccfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: da819cdb8e31a0fcfc0fa3bf026637ae Text-delta-base-sha1: cdb081c3ea99239b9c125bce50e6e42cb72f91b6 Text-content-length: 232 Text-content-md5: 617af82b6a34aade932a529d35c287b8 Text-content-sha1: de7cf10a0fa07f4569c02c5627831414aa32e4c5 Content-length: 275 K 15 cvs2svn:cvs-rev V 7 1.1.2.6 PROPS-END SVNjK].v}i/* $Id: maccfg.c,v 1.1.2.6 1999/07/24 15:51:12Palettesif (HAVE_COLOR_QD()) { cfg->colours = GetNewPalette(s->colours_id); if (cfg->colours == NULL) fatalbox("Failed to get default palette"); } Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: e36e5d08207e3448ecda81c8ed0e6905 Text-delta-base-sha1: 16f2cf4adbc69b224d3a38b9d4062e75dcb1283f Text-content-length: 1624 Text-content-md5: aa64fe27e11d5f1a371fa8fb3e728e27 Text-content-sha1: 97e16dba0df5676f4d37a37cb22fd53d805a51d9 Content-length: 1668 K 15 cvs2svn:cvs-rev V 8 1.1.2.35 PROPS-END SVNCrXg0"r(%W X:4Hc@ 1Xc0~2*C0W-Gm3)<40/* $Id: macterm.c,v 1.1.2.35 1999/07/24 15:51:12null_backend; /* XXX: Own storage management? */ if (HAVE_COLOR_QD()) s->window = GetNewCWindow(wTerminal, NULL, (WindowPtr)-1); else s->window = GetNewif (HAVE_COLOR_QD()) { /* Set to FALSE to not get palette updates in the background. */ SetPalette(s->window, s->palette, TRUE); ActivatePalette(s->window); } ShowWindow(s->window); s->back->init(s); starttime = TickCount(); display_resource(s, 'pTST', 128); sprintf(msg, "Elapsed ticks: %d\015\012", TickCount() - starttime); inbuf_putstr(s, msg); term_out(s);!HAVE_COLOR_QD() if (!HAVE_COLOR_QD()) return;if (HAVE_COLOR_QD()) PmBackColor(DEFAULT_BG);/* HideControl clears behind the control */ else BackColor(blackColor);if (HAVE_COLOR_QD()) { PmForeColor(DEFAULT_FG); PmBackColor(DEFAULT_BG); } else { ForeColor(whiteColor); BackColor(blackColor); }HAVE_COLOR_QD()HAVE_COLOR_QD()) DeviceLoop(textrgn, &do_text_for_device_upp, (long)&a, 0); else do_text_for_device(1, 0, NULL, (long)&a/* FIXME: Sort out bold width adjustments on Original QuickDraw. */if (HAVE_COLOR_QD()) DeviceLoop(s->window->visRgn, &mac_set_attr_mask_upp, (long)s, 0); else mac_set_attr_mask(1, 0, NULL, (long)s!HAVE_COLOR_QD()!HAVE_COLOR_QD()) return/* FIXME: This is seriously broken on Original QuickDraw. No idea why. */ SetPort(s->window); if (HAVE_COLOR_QD()) PmBackColor(DEFAULT_BG); else BackColor(blackColor Revision-number: 187 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:53.415848Z PROPS-END Revision-number: 188 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 1999-08-02T08:04:31.000000Z K 7 svn:log V 36 Various changes for Open Transport. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 1e0901a8dc81de5fadc0ad1f31f00097 Text-delta-base-sha1: 798221f2e77cba92c23b3da1c5ffb53856b5c400 Text-content-length: 790 Text-content-md5: 2dcf47be3d0e25380ac28b9be435ca81 Text-content-sha1: 434df3bed3fdb216360df3158949bc9a153e3664 Content-length: 834 K 15 cvs2svn:cvs-rev V 8 1.1.2.13 PROPS-END SVN d%ei2 @B]H>b# $Id: Makefile.mpw,v 1.1.2.13 1999/08/02 08:04:31# macnet.c.o macterm.c.o misc.c.o opentpt opentpt "{Libraries}OpenTransport.o" "{Libraries}OpenTptInet -weaklib AppearanceLib "{SharedLibraries}OpenTransportLib" -weaklib OTGlobalLib -weaklib OTUtilityLib -weaklib OTClientUtilLib -weaklib OTClientLib -weaklib OTStreamUnixLib -weaklib OTXTILib -weaklib OTConfigLib -weaklib OTNtvUtilLib -weaklib OTNativeClientLib "{SharedLibraries}OpenTptInternetLib" -weaklib OTInetClientLib "{PPCLibraries}StdCRuntime.o" "{PPCLibraries}PPCCRuntime.o" "{PPCLibraries}OpenTransportAppPPC.o" "{PPCLibraries}OpenTptInetPPCopentpt.c.o opentpt.c.x putty.h mac Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 8757583a25b6d8b18b2db97396c67b2e Text-delta-base-sha1: 92b334d94c8e5ea1298599a93f1e8369dc5ed717 Text-content-length: 393 Text-content-md5: c2e42a7b30cbb916d9d81b748abfc950 Text-content-sha1: 009d7a9f3288669b8fb3b5e6984ed53c834ca5ef Content-length: 437 K 15 cvs2svn:cvs-rev V 8 1.1.2.25 PROPS-END SVN4dM,!8xRAy/* $Id: mac.c,v 1.1.2.25 1999/08/02 08:04:31 /* Initialise networking */ #ifdef WITH_OPENTRANSPORT if ((*opentpt_stack.init)() == 0) net_stack = &opentpt_stack; else #endif #ifdef WITH_MACTCP if ((*mactcp_stack.init)() == 0) net_stack = &mactcp_stack; else #endif fatalbox("No useful TCP/IP stack found"); net_pollnet_shutdown(); Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: d8677e37c4d12cd7d248eccd6c6e1df9 Text-delta-base-sha1: e74d2737001eab31efb170f5e1b86f1f8d616bc7 Text-content-length: 872 Text-content-md5: 3133f4f6096d03aef10fda2b217a1bed Text-content-sha1: 6f8952a9f2387de2a7f1cff5919ee95d9fc3924c Content-length: 916 K 15 cvs2svn:cvs-rev V 8 1.4.2.20 PROPS-END SVN ": EqfVB;t*dvoid#ifdef macintosh typedef struct { int (*init)(void); SOCKET (*open)(Session *, char const *, int); int (*recv)(SOCKET, void *, int, int); int (*send)(SOCKET, void *, int, int); void (*poll)(void); void (*close)(SOCKET); void (*destroy)(SOCKET); void (*shutdown)(void); } Network_Stack; GLOBAL Network_Stack *net_stack; #define net_open(s, h, p) ((*net_stack->open)((s), (h), (p))) #define net_recv(s, b, l, f) ((*net_stack->recv)((s), (b), (l), (f))) #define net_send(s, b, l, f) ((*net_stack->send)((s), (b), (l), (f))) #define net_poll() ((*net_stack->poll)()) #define net_close(s) ((*net_stack->close)(s)) #define net_destroy(s) ((*net_stack->destroy)(s)) #define net_shutdown() ((*net_stack->shutdown)()) #endif#ifndef macintosh#endif #define SEND_PUSH 0x01 #define SEND_URG 0x02 Node-path: putty-ben-mac-port/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 4489195c6aa8c81b4bf89ddbc8335c35 Text-delta-base-sha1: 1a693d8297698d5a7cbba524267bb38b0bdab9ef Text-content-length: 87 Text-content-md5: 1c38a6ccc957ce5af45331e7118849be Text-content-sha1: 70cccf62af758454f29bdf7a623cb86a36bac1f0 Content-length: 130 K 15 cvs2svn:cvs-rev V 7 1.1.2.7 PROPS-END SVN ;60gm5[/* $Id: testback.c,v 1.1.2.7 1999/08/02 08:04:31OCKETOCKET Revision-number: 189 Prop-content-length: 202 Content-length: 202 K 7 svn:log V 103 Open Transport support, maybe. Also renamed macnet.c to mactcp.c, but it's still as broken as before. K 10 svn:author V 3 ben K 8 svn:date V 27 1999-08-02T08:06:32.000000Z PROPS-END Node-path: putty-ben-mac-port/mactcp.c Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 16577 Text-content-md5: fdbca2e64e091c010cdfa19823ac766a Text-content-sha1: 70269373d3efab30b02189b1cc2823c0ecc09d98 Content-length: 16697 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 7 1.1.2.1 PROPS-END SVN000/* $Id: mactcp.c,v 1.1.2.1 1999/08/02 08:06:32 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * macnet.c -- PuTTY-to-MacTCP glue */ #include #include #include #include #include #include #include #include #include #include #include "putty.h" /* * The theory behind this stuff: * * net_recv attempts to deliver any incoming data waiting on the * queue. Since MacTCP maintains a buffer for incoming data, there's * no need for us to run asynchronous TCPRcvs, and we just do a * synchronous one if we detect some data waiting. Since TCPRcv can't * be given a timeout of zero, we use TCPStatus to work out if there's * anything waiting first. * * Sending data is trickier. TCPSend reserves the right to block * until everything we've sent is ACKed, which means we have to use it * asynchronously. In order to make life easier for backends, and to * save a proliferation of circular buffers, we guarantee to take data * off the hands of the backend as soon as it gives it to us. This is * reasonable because currently there's no way for the backend to say * it can't take data, and once it's got them, it may as well give * them to us. * * Anyway, in order to avoid a fixed-size buffer overflowing, the send * buffer is kept as a queue of blocks. When net_send is called, we * malloc a new block and stick it on the queue. If the queue was * empty, we kick off a new asynchronous TCPSend to handle our block. * */ typedef struct Socket { TCPiopb iopb; /* current MacTCP operation */ TCPiopb spareiopb; /* for closing etc */ hostInfo hostinfo; int port; ProcessSerialNumber psn; Session *s; #if TARGET_CPU_68K && !TARGET_RT_CFM long a5; #endif QHdr sendq; /* Blocks waiting to be sent */ } Socket; typedef struct { QElem qelem; int flags; wdsEntry wds; short wdsterm; } Send_Buffer; /* * Yes, I know the struct QElem has a short[1] to represent the user * data. I'm ignoring it because it makes my code prettier and * improves the alignment. */ typedef struct { QElem qelem; Socket *sock; Net_Event_Type type; } NetEvent; #define TCPBUF_SIZE 8192 static QHdr macnet_eventq; static QHdr macnet_freeq; static short mtcp_refnum; static int mtcp_initted = FALSE; static OSErr macnet_init(void); static pascal void macnet_resolved(hostInfo *, char *); static void macnet_completed_open(TCPiopb*); static void macnet_completed_send(TCPiopb*); static void macnet_sent(Socket *); static void macnet_startsend(Socket *); static void macnet_completed_close(TCPiopb*); static pascal void macnet_asr(StreamPtr, unsigned short, Ptr, unsigned short, ICMPReport *); static void macnet_sendevent(Socket *, Net_Event_Type); #if TARGET_RT_MAC_CFM static RoutineDescriptor macnet_resolved_upp = BUILD_ROUTINE_DESCRIPTOR(uppResultProcInfo, (ProcPtr)macnet_resolved); static RoutineDescriptor macnet_completed_open_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPIOCompletionProcInfo, (ProcPtr)macnet_completed_open); static RoutineDescriptor macnet_complete_send_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPIOCompletionProcInfo, (ProcPtr)macnet_completed_send); static RoutineDescriptor macnet_completed_close_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPIOCompletionProcInfo, (ProcPtr)macnet_completed_close); static RoutineDescriptor macnet_asr_upp = BUILD_ROUTINE_DESCRIPTOR(uppTCPNotifyProcInfo, (ProcPtr)macnet_asr); #else /* These handle A5 switching to thwart the optimiser. */ static pascal void macnet_resolved_upp(hostInfo *, char *); static void macnet_completed_open_upp(TCPiopb *); static void macnet_completed_send_upp(TCPiopb *); static void macnet_completed_close_upp(TCPiopb *); /* ASRs apparently get their A5 world set up for them. */ #define macnet_asr_upp macnet_asr #endif /* * Number of outstanding network events allowed. */ #define NUM_EVENTS 16 /* * Initialise networking. Set mtcp_initted if it goes OK. */ static OSErr macnet_init(void) { OSErr err; NetEvent *eventblock; int i; /* * FIXME: This is hideously broken, in that we're meant to faff * with unit numbers and stuff, and we blatantly don't. * On the other hand, neither does NCSA Telnet. Hmm. */ err = opendriver(".IPP", &mtcp_refnum); if (err != noErr) return err; err = OpenResolver(NULL); if (err != noErr) return err; /* Set up the event queues, and fill the free queue with events */ macnet_eventq.qFlags = 0; macnet_eventq.qHead = macnet_eventq.qTail = NULL; macnet_freeq.qFlags = 0; macnet_freeq.qHead = macnet_eventq.qTail = NULL; eventblock = smalloc(NUM_EVENTS * sizeof(*eventblock)); for (i = 0; i < NUM_EVENTS; i++) Enqueue(&eventblock[i].qelem, &macnet_freeq); mtcp_initted = TRUE; return 0; } Socket *net_open(Session *s, char *host, int port) { ip_addr a; OSErr err = noErr; Socket *sock; void *tcpbuf; /* * First, get hold of all the memory we'll need (a lot of the * later stuff happens at interrupt time) */ sock = smalloc(sizeof(*sock)); memset(sock, 0, sizeof(*sock)); tcpbuf = smalloc(TCPBUF_SIZE); /* Make a note of anything we don't want to forget */ sock->port = port; GetCurrentProcess(&sock->psn); #if TARGET_CPU_68K && !TARGET_RT_CFM sock->a5 = SetCurrentA5(); #endif /* Get MacTCP running if it's not already */ if (!mtcp_initted) if ((err = macnet_init()) != noErr) fatalbox("Couldn't init network (%d)", err); /* Get ourselves a TCP stream to play with */ sock->iopb.ioCRefNum = mtcp_refnum; sock->iopb.ioCompletion = NULL; sock->iopb.csCode = TCPCreate; sock->iopb.csParam.create.rcvBuff = tcpbuf; sock->iopb.csParam.create.rcvBuffLen = TCPBUF_SIZE; sock->iopb.csParam.create.notifyProc = macnet_asr_upp; sock->iopb.csParam.create.userDataPtr = (Ptr)sock; /* This could be done asynchronously, but I doubt it'll take long. */ err = PBControlSync((ParmBlkPtr)&sock->iopb); if (err != noErr) fatalbox("TCP stream create failed (%d)", err); err = StrToAddr(host, &sock->hostinfo, &macnet_resolved_upp, (char *)sock); /* * A cache fault indicates that the DNR will call us back when * it's found the host for us. */ if (err != cacheFault) macnet_resolved(&sock->hostinfo, (char *)sock); return sock; } #if TARGET_CPU_68K && !TARGET_RT_CFM static pascal void macnet_resolved_upp(hostInfo *hi, char *cookie) { Socket *sock = (Socket *)cookie; long olda5; olda5 = SetA5(sock->a5); macnet_resolved(hi, cookie); SetA5(olda5); } #endif static pascal void macnet_resolved(hostInfo *hi, char *cookie) { Socket *sock = (Socket *)cookie; OSErr err; /* * We've resolved a name, so now we'd like to connect to it (or * report an error). */ switch (sock->hostinfo.rtnCode) { case noErr: /* Open a connection */ sock->iopb.ioCompletion = macnet_completed_open_upp; sock->iopb.csCode = TCPActiveOpen; memset(&sock->iopb.csParam, 0, sizeof(sock->iopb.csParam)); sock->iopb.csParam.open.validityFlags = typeOfService; sock->iopb.csParam.open.remoteHost = sock->hostinfo.addr[0]; /*XXX*/ sock->iopb.csParam.open.remotePort = sock->port; sock->iopb.csParam.open.tosFlags = lowDelay; sock->iopb.csParam.open.userDataPtr = (char *)sock; err = PBControlAsync((ParmBlkPtr)&sock->iopb); if (err != noErr) macnet_sendevent(sock, NE_NOOPEN); break; default: /* Something went wrong */ macnet_sendevent(sock, NE_NOHOST); break; } } #if TARGET_CPU_68K && !TARGET_RT_CFM static void macnet_completed_open_upp(TCPiopb *iopb) { Socket *sock = (Socket *)iopb->csParam.open.userDataPtr; long olda5; olda5 = SetA5(sock->a5); macnet_completed_open(iopb); SetA5(olda5); } #endif static void macnet_completed_open(TCPiopb *iopb) { Socket *sock = (Socket *)iopb->csParam.open.userDataPtr; switch (iopb->ioResult) { case noErr: macnet_sendevent(sock, NE_OPEN); break; default: macnet_sendevent(sock, NE_NOOPEN); break; } } static pascal void macnet_asr(StreamPtr tcpstream, unsigned short eventcode, Ptr cookie, unsigned short terminreason, ICMPReport *icmpmsg) { Socket *sock = (Socket *)cookie; switch (eventcode) { case TCPClosing: macnet_sendevent(sock, NE_CLOSING); break; case TCPULPTimeout: macnet_sendevent(sock, NE_TIMEOUT); break; case TCPTerminate: switch (terminreason) { case TCPRemoteAbort: macnet_sendevent(sock, NE_ABORT); break; default: macnet_sendevent(sock, NE_DIED); break; } break; case TCPDataArrival: macnet_sendevent(sock, NE_DATA); break; case TCPUrgent: macnet_sendevent(sock, NE_URGENT); break; case TCPICMPReceived: switch (icmpmsg->reportType) { case portUnreach: macnet_sendevent(sock, NE_REFUSED); break; } break; } } /* * Send a block of data. */ int net_send(Socket *sock, void *buf, int buflen, int flags) { OSErr err; Send_Buffer *buff; buff = smalloc(sizeof(Send_Buffer) + buflen); buff->flags = flags; buff->wds.length = buflen; buff->wds.ptr = (Ptr)&buff[1]; /* after the end of the struct */ buff->wdsterm = 0; memcpy(&buff[1], buf, buflen); Enqueue(&buff->qelem, &sock->sendq); /* Kick off the transmit if the queue was empty */ if (sock->sendq.qHead == &buff->qelem) macnet_startsend(sock); } /* * This is called once every time round the event loop to check for * network events and handle them. */ void macnet_eventcheck() { NetEvent *ne; if (!mtcp_initted) return; ne = (NetEvent *)macnet_eventq.qHead; if (ne == NULL) return; Dequeue(&ne->qelem, &macnet_eventq); switch (ne->type) { case NE_SENT: macnet_sent(ne->sock); break; default: (ne->sock->s->back->msg)(ne->sock->s, ne->sock, ne->type); break; } Enqueue(&ne->qelem, &macnet_freeq); } /* * The block at the head of the send queue has finished sending, so we * can free it. Kick off the next transmission if there is one. */ static void macnet_sent(Socket *sock) { Send_Buffer *buff; assert(sock->sendq.qHead != NULL); buff = (Send_Buffer *)sock->sendq.qHead; Dequeue(&buff->qelem, &sock->sendq); sfree(buff); if (sock->sendq.qHead != NULL) macnet_startsend(sock); } /* * There's a block on the head of the send queue which needs to be * sent. */ static void macnet_startsend(Socket *sock) { Send_Buffer *buff; OSErr err; buff = (Send_Buffer *)sock->sendq.qHead; sock->iopb.ioCompletion = macnet_completed_send_upp; sock->iopb.csCode = TCPSend; memset(&sock->iopb.csParam, 0, sizeof(sock->iopb.csParam)); sock->iopb.csParam.send.validityFlags = 0; sock->iopb.csParam.send.pushFlag = buff->flags & SEND_PUSH ? true : false; sock->iopb.csParam.send.urgentFlag = buff->flags & SEND_URG ? true : false; sock->iopb.csParam.send.wdsPtr = (Ptr)&buff->wds; sock->iopb.csParam.send.userDataPtr = (char *)sock; err = PBControlAsync((ParmBlkPtr)&sock->iopb); } #if TARGET_CPU_68K && !TARGET_RT_CFM static void macnet_completed_send_upp(TCPiopb *iopb) { Socket *sock = (Socket *)iopb->csParam.send.userDataPtr; long olda5; olda5 = SetA5(sock->a5); macnet_completed_send(iopb); SetA5(olda5); } #endif static void macnet_completed_send(TCPiopb *iopb) { Socket *sock = (Socket *)iopb->csParam.send.userDataPtr; switch (iopb->ioResult) { case noErr: macnet_sendevent(sock, NE_SENT); break; case connectionClosing: case connectionTerminated: /* We'll get an ASR, so ignore it here. */ break; default: macnet_sendevent(sock, NE_DIED); break; } } int net_recv(Socket *sock, void *buf, int buflen, int flags) { TCPiopb iopb; OSErr err; int avail, want, got; memcpy(&iopb, &sock->iopb, sizeof(TCPiopb)); /* Work out if there's anything to recieve (we don't want to block) */ iopb.ioCompletion = NULL; iopb.csCode = TCPStatus; memset(&sock->iopb.csParam, 0, sizeof(sock->iopb.csParam)); err = PBControlSync((ParmBlkPtr)&iopb); if (err != noErr) return 0; /* macnet_asr should catch it anyway */ avail = iopb.csParam.status.amtUnreadData; if (avail == 0) return 0; want = avail < buflen ? avail : buflen; iopb.ioCompletion = NULL; iopb.csCode = TCPRcv; memset(&sock->iopb.csParam, 0, sizeof(sock->iopb.csParam)); iopb.csParam.receive.rcvBuff = buf; iopb.csParam.receive.rcvBuffLen = want; err = PBControlSync((ParmBlkPtr)&iopb); if (err != noErr) return 0; return iopb.csParam.receive.rcvBuffLen; } void net_close(Socket *sock) { OSErr err; /* * This might get called in the middle of processing another * request on the socket, so we have a spare parameter block for * this purpose (allocating one dynamically would mean having to * free it, which we can't do at interrupt time). */ memcpy(&sock->spareiopb, &sock->iopb, sizeof(TCPiopb)); memset(&sock->spareiopb.csParam, 0, sizeof(sock->spareiopb.csParam)); sock->spareiopb.ioCompletion = macnet_completed_close_upp; sock->spareiopb.csCode = TCPClose; sock->spareiopb.csParam.close.validityFlags = 0; sock->spareiopb.csParam.close.userDataPtr = (char *)sock; err = PBControlAsync((ParmBlkPtr)&sock->spareiopb); switch (err) { case noErr: case connectionClosing: case connectionTerminated: /* We'll get an ASR */ break; default: macnet_sendevent(sock, NE_DIED); break; } } #if TARGET_CPU_68K && !TARGET_RT_CFM static void macnet_completed_close_upp(TCPiopb* iopb) { Socket *sock = (Socket *)iopb->csParam.close.userDataPtr; long olda5; olda5 = SetA5(sock->a5); macnet_completed_close(iopb); SetA5(olda5); } #endif static void macnet_completed_close(TCPiopb* iopb) { Socket *sock = (Socket *)iopb->csParam.close.userDataPtr; switch (iopb->ioResult) { case noErr: macnet_sendevent(sock, NE_CLOSED); break; case connectionClosing: case connectionTerminated: break; default: macnet_sendevent(sock, NE_DIED); break; } } /* * Free all the data structures associated with a socket and tear down * any connection through it. */ void net_destroy(Socket *sock) { TCPiopb iopb; OSErr err; /* * Yes, we need _another_ iopb, as there may be a send _and_ a * close outstanding. Luckily, destroying a socket is * synchronous, so we can allocate this one dynamically. */ memcpy(&iopb, &sock->iopb, sizeof(TCPiopb)); iopb.ioCompletion = NULL; iopb.csCode = TCPRelease; memset(&iopb.csParam, 0, sizeof(iopb.csParam)); err = PBControlSync((ParmBlkPtr)&iopb); sfree(iopb.csParam.create.rcvBuff); sfree(sock); } static void macnet_sendevent(Socket *sock, Net_Event_Type type) { NetEvent *ne; ne = (NetEvent *)macnet_freeq.qHead; if (ne == NULL) return; /* It's a disaster, but how do we tell anyone? */ Dequeue(&ne->qelem, &macnet_freeq); ne->sock = sock; ne->type = type; Enqueue(&ne->qelem, &macnet_eventq); WakeUpProcess(&sock->psn); } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty-ben-mac-port/opentpt.c Node-kind: file Node-action: add Prop-content-length: 120 Text-delta: true Text-content-length: 9419 Text-content-md5: 505eb94058dfaf51dc88afd874999a20 Text-content-sha1: dc5db076b7519c4563f023553e82b87a17a22631 Content-length: 9539 K 15 cvs2svn:cvs-rev V 7 1.1.2.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN===/* $Id: opentpt.c,v 1.1.2.1 1999/08/02 08:06:32 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include #include #include #incldue #include #include "putty.h" /* See the top of macnet.c for some idea of how this is meant to work. */ struct otpt_socket { EndpointRef ep; Session *sess; OTLIFO *sendq; OTLIFO *eventq; long eventhandler; }; struct otpt_netevent { OTLink *next; Net_Event_Type type; }; static int otpt_probe(void); static void otpt_init(void); static void *otpt_open(Session *, char const *, int); static int otpt_recv(void *, void *, int, int); static int otpt_send(void *, void *, int, int); static void otpt_close(void *); static void otpt_destroy(void *); static pascal void otpt_notifier(void *, OTEventCode, OTResult , void *); static void otpt_sendevent(struct otpt_socket *, Net_Event_Type); static pascal void otpt_rcvevent(void *); Network_Stack otpt_stack = { otpt_init, otpt_open, otpt_recv, otpt_send, otpt_poll, otpt_close, otpt_destroy, otpt_shutdown }; static OTConfiguration *otpt_config = kOTInvalidCOnfigurationPtr; static int otpt_init(void) { OSErr err; err = InitOpenTransport(); if (err != noErr) return err; otpt_config = OTCreateConfiguration("tcp"); if (otpt_config == kOTInvalidConfigurationPtr || otpt_config == kOTNoMemoryConfigurationPtr) return 1; return 0; } /* * This should only be called once all the connections have been * closed (we don't bother keeping a table of them). */ void otpt_shutdown(void) { CloseOpenTransport(); } static void *otpt_open(Session *sess, char const *host, int port) { struct otpt_socket *s = NULL; OSStatus err; TCall remote; DNSAddress *remoteaddr; s = smalloc(sizeof(*s)); memset(s, 0, sizeof(*s)); /* Get a TCP endpoint (equiv of socket()) */ s->ep = OTOpenEndpoint(OTCloneConfiguration(otpt_config), 0, NULL, &err); if (err != kOTNoError || s->ep == NULL) goto splat; /* Attach our notifier function (note that this is _not_ a UPP) */ err = OTInstallNotifier(s->ep, otpt_notifier, (void *)s); if (err != kOTNoError) goto splat; s->eventhandler = OTCreateSystemTask(&otpt_rcvevent, (void *)s); if (s->eventhandler = 0) goto splat; /* Bind to any local address */ err = OTBind(s->ep, NULL, NULL); if (err != kOTNoError) goto splat; memset(&remote, 0, sizeof(remote)); remoteaddr = smalloc(sizeof(*remoteaddr) - sizeof(remoteaddr->fName) + strlen(host) + 7); /* allow space for port no. */ remote.addr.buf = (UInt8 *)remoteaddr; remote.addr.len = OTInitDNSAddress(remoteaddr, host); remote.addr.len += sprintf(&remoteaddr->fName[strlen(remoteaddr->fName)], ":%d", port); /* Asynchronous blocking mode, so we don't have to wait */ err = OTSetAsynchronous(s->ep); if (err != kOTNoError) goto splat; err = OTSetBlocking(s->ep); if (err != kOTNoError) goto splat; err = OTConnect(s->ep, &remote, NULL); if (err != kOTNoDataErr) goto splat; return s; splat: otpt_destroy(s); return NULL; } static int otpt_recv(void *sock, void *buf, int buflen, int flags) { struct otpt_socket *s = (struct otpt_socket *)sock; OTResult result; OTFlags flags; OTSetNonBlocking(s->ep); OTSetSynchronous(s->ep); result = OTRcv(s->ep, buf, buflen, flags); if (result >= 0) return result; else if (result == kOTNoDataError) return 0; else /* confusion! */ return 0; } static void otpt_poll(void) { } static int otpt_send(void *sock, void *buf, int buflen, int flags) { struct otpt_socket *s = (struct otpt_socket *)sock; /* XXX: using blocking mode is bogus, but it's far easier than not. */ OTSetSynchronous(s->ep); OTSetBlocking(s->ep); return OTSnd(s->ep, buf, buflen, flags); } /* * Politely ask the other end to close the connection. */ static void otpt_close(void *sock) { struct otpt_socket *s = (struct otpt_socket *)sock; /* XXX: using blocking mode is bogus, but it's far easier than not. */ OTSetSynchronous(s->ep); OTSetBlocking(s->ep); OTSndOrderlyDisconnect(s->ep); } /* * This should take a socket in any state and undo it all, freeing any * allocated memory and generally making it safe to forget about it. * It should onlu be called at system task time. */ static void otpt_destroy(void *sock) { struct otpt_socket *s = (struct otpt_socket *)sock; OSStatus err; OTLink *link; if (s == NULL) return; /* Tear down the connection */ /* If we ever start using T_MEMORYRELEASED, we need to be careful here. */ err = OTSetSynchronous(s->ep); if (err == kOTNoError) err = OTSetNonBlocking(s->ep); if (err == kOTNoError) err = OTCloseProvider(s->ep); /* Stop the event handler running */ if (s->eventhandler != 0) OTDestroySystemTask(s->eventhandler); /* Flush the event and send queues */ while ((link = OTLIFODequeue(s->eventq)) != NULL) OTFreeMem(link); while ((link = OTLIFODequeue(s->sendq)) != NULL) OTFreeMem(link); /* Finally, free the socket record itself */ sfree(s); } /* * Any asynchronous events OpenTransport wants to tell us about end up * here. This function may be called at deferred task or system task * time, and must be re-entrant. */ static pascal void otpt_notifier(void *contextPtr, OTEventCode code, OTResult result, void *cookie) { struct otpt_socket *s = (struct otpt_socket *)contextPtr; OSStatus status; TDiscon discon; switch (code) { case T_CONNECT: /* OTConnect completed */ status = OTRcvConnect(s->ep, NULL); /* XXX do we want the new TCall? */ if (status == kOTNoDataErr) break; else if (status != kOTNoError) { otpt_sendevent(s, NE_DIED); break; } /* Synchronous non-blocking mode for normal data transfer */ OTSetSynchronous(s->ep); OTSetNonBlocking(s->ep); otpt_sendevent(s, NE_OPEN); break; case T_DATA: otpt_sendevent(s, NE_DATA); break; case T_EXDATA: otpt_sendevent(s, NE_URGENT); break; case T_DISCONNECT: /* Disconnection complete or OTConnect rejected */ memset(&discon, 0, sizeof(discon)); /* * This function returns a positive error code. To obtain the * negative error code, subtract that positive value from * -3199. */ status = OTRcvDisconnect(s->ep, &discon); if (cookie == NULL) /* spontaneous disconnect */ switch (E2OSStatus(discon.reason)) { case kECONNRESETErr: otpt_sendevent(s, NE_ABORT); break; case kETIMEDOUTErr: otpt_sendevent(s, NE_TIMEOUT); break; default: otpt_sendevent(s, NE_DIED); break; } else /* failed connect */ otpt_sendevent(s, NE_NOOPEN); case T_ORDREL: OTRcvOrderlyDisconnect(s->ep); otpt_sendevent(s, NE_CLOSING); } } /* * This function is called at interrupt time (or thereabouts) to * dispatch an event that has to be handled at system task time. * Network backends will expect their msg entries to be called then. */ static void otpt_sendevent(struct otpt_socket *s, Net_Event_Type type) { struct otpt_netevent *ne; ne = OTAllocMem(sizeof(*ne)); if (ne == NULL) fatalbox("OTAllocMem failed. Aargh!"); ne->type = type; OTLIFOEnqueue(&s->eventq, &ne->next); /* Schedule something */ OTScheduleSystemTask(s->eventhandler); } /* * Pull one or more network events off a socket's queue and handle * them. Keep gong until we run out (events may be getting enqueued * while we're running). This is mildly evil as it'll prevent any * other task running if we're under heavy load. */ static pascal void otpt_rcvevent(void *arg) { struct otpt_socket *s = (struct otpt_socket *)arg; OTLink *link; struct otpt_netevent *ne; /* idiom stolen from "Networking With Open Transport". Blame Apple. */ while ((link = OTLIFOStealList(s->eventq)) != NULL) { link = OTReverseList(link); while (link != NULL) { ne = (struct otpt_netevent *)link; link = ne->next; switch (ne->type) { default: (s->sess->back->msg)(s->sess, s, ne->type); break; } OTFreeMem(ne); } } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty-ben-mac-port/macnet.c Node-action: delete Revision-number: 190 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 1999-08-02T08:35:11.000000Z K 7 svn:log V 59 Fix potential security problems in random number generator K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c0c75f9434b6cd5988c0c22d3bfd4ba7 Text-delta-base-sha1: f879ca887ace22301c38622be419e17744c77a97 Text-content-length: 156 Text-content-md5: 46a218923552898f39d0982191a8a830 Text-content-sha1: 4d57acf43ac249a4d5f3a983ac77eab42de7951f Content-length: 195 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN2V{wy(\V + pool_incomingpos, p, length); pool.incomingpos +pool.incoming, digest + pool.poolpos, p, length); pool.poolpos + Revision-number: 191 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 1999-08-02T08:35:11.000000Z K 7 svn:log V 72 This commit was manufactured by cvs2svn to create branch 'ben-mac-port'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-ben-mac-port/Makefile Node-kind: file Node-action: add Node-copyfrom-rev: 190 Node-copyfrom-path: putty/Makefile Text-copy-source-md5: bac9e909fff1ee4981d9fad8c17b66dd Text-copy-source-sha1: 888981e887fc694c1c415c3ee13e2053b1655bfe Node-path: putty-ben-mac-port/ssh.c Node-kind: file Node-action: add Node-copyfrom-rev: 190 Node-copyfrom-path: putty/ssh.c Text-copy-source-md5: d878688914ff016eaab04be5e693a2be Text-copy-source-sha1: 4d1c263ab80ad99852171a293203fb8b38f72038 Node-path: putty-ben-mac-port/ssh.h Node-kind: file Node-action: add Node-copyfrom-rev: 190 Node-copyfrom-path: putty/ssh.h Text-copy-source-md5: bde993964679114fe44daa648b5bdc85 Text-copy-source-sha1: 72ffba89f98a1eb96b56ead8a39625f7897ff66b Node-path: putty-ben-mac-port/sshblowf.c Node-kind: file Node-action: add Node-copyfrom-rev: 190 Node-copyfrom-path: putty/sshblowf.c Text-copy-source-md5: de80e079a942cd45361b05c80ad24eb8 Text-copy-source-sha1: 56f31b5f302fe5d3bccb406faba62f38fc437120 Node-path: putty-ben-mac-port/sshrand.c Node-kind: file Node-action: add Node-copyfrom-rev: 190 Node-copyfrom-path: putty/sshrand.c Text-copy-source-md5: 46a218923552898f39d0982191a8a830 Text-copy-source-sha1: 4d57acf43ac249a4d5f3a983ac77eab42de7951f Node-path: putty-ben-mac-port/sshrsa.c Node-kind: file Node-action: add Node-copyfrom-rev: 190 Node-copyfrom-path: putty/sshrsa.c Text-copy-source-md5: c73102bed8aa555bdef5bddd03f2eb85 Text-copy-source-sha1: 4d9de5f38d21fcdb08e6bb7f2282f65f99af5e3f Node-path: putty-ben-mac-port/win_res.h Node-kind: file Node-action: add Node-copyfrom-rev: 190 Node-copyfrom-path: putty/win_res.h Text-copy-source-md5: 47a6bdf22550963e7253e68d2e196cf3 Text-copy-source-sha1: 02ee7a1244786950ef3b71987f1476509a7c6ff2 Node-path: putty-ben-mac-port/win_res.rc Node-kind: file Node-action: add Node-copyfrom-rev: 190 Node-copyfrom-path: putty/win_res.rc Text-copy-source-md5: dba18bf45fb8cc29dcee23fcb00d2d79 Text-copy-source-sha1: e2a22c67d5b62c6a8c88e31a92feebb488a68d4f Node-path: putty-ben-mac-port/windlg.c Node-kind: file Node-action: add Node-copyfrom-rev: 190 Node-copyfrom-path: putty/windlg.c Text-copy-source-md5: 556de6b4a720baa06c734e748e814f3f Text-copy-source-sha1: 9d45126abb54db4befc28f6adbc2e8927fb7224d Node-path: putty-ben-mac-port/window.c Node-kind: file Node-action: add Node-copyfrom-rev: 190 Node-copyfrom-path: putty/window.c Text-copy-source-md5: e812861733dc85fea923b6380764a395 Text-copy-source-sha1: 9300543d711144433a9a58170e79a0ebe63121fa Revision-number: 192 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 1999-08-02T22:32:39.000000Z K 7 svn:log V 88 Open Transport stuff now actually compiles. Various stuff caught up to latest versions. K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 2dcf47be3d0e25380ac28b9be435ca81 Text-delta-base-sha1: 434df3bed3fdb216360df3158949bc9a153e3664 Text-content-length: 157 Text-content-md5: fdeb5cf2f4455570852beb950e0401a1 Text-content-sha1: 47e13cd76eb953cf4e782803ade512c2d36ac470 Content-length: 201 K 15 cvs2svn:cvs-rev V 8 1.1.2.14 PROPS-END SVNd+#oo2 $6 . D# $Id: Makefile.mpw,v 1.1.2.14 1999/08/02 22:32:38tcp# mactcpransportApptcp.c.o mactcpblowf.c.o sshblowf.c.x Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: c2e42a7b30cbb916d9d81b748abfc950 Text-delta-base-sha1: 009d7a9f3288669b8fb3b5e6984ed53c834ca5ef Text-content-length: 205 Text-content-md5: 40118a47bcc8a5e48b3355db9a4cc98c Text-content-sha1: db073bfad68f7892069a2de74e143fc4230865ea Content-length: 249 K 15 cvs2svn:cvs-rev V 8 1.1.2.26 PROPS-END SVN4* 4,cQ/* $Id: mac.c,v 1.1.2.26 1999/08/02 22:32:38tpt_stack.init)() == 0) net_stack = &otpt_stack; else #endif #ifdef WITH_MACTCP if ((*mtcp_stack.init)() == 0) net_stack = &m Node-path: putty-ben-mac-port/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 8d02caa2dfdbd75302cf6bc8fc62cb28 Text-delta-base-sha1: 7ad9169369bfca2c6d20465975b116417c09c9a5 Text-content-length: 104 Text-content-md5: 6bc016854319d598c6ac4e380ef7d503 Text-content-sha1: 8b3ea8c6f796c0cbe29889a14dbd28a69c9de7f0 Content-length: 148 K 15 cvs2svn:cvs-rev V 8 1.1.2.13 PROPS-END SVNCxN7,5G|/* config.h or somesuch? */ #define WITH_OPENTRANSPORTNetwork_Stack otpt_stack Node-path: putty-ben-mac-port/opentpt.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 505eb94058dfaf51dc88afd874999a20 Text-delta-base-sha1: dc5db076b7519c4563f023553e82b87a17a22631 Text-content-length: 1008 Text-content-md5: c39b95ca48eb442e428b941a1fc49fc0 Text-content-sha1: 0b5ab49aaad9f5022f943dae394e2d10b5272c3f Content-length: 1051 K 15 cvs2svn:cvs-rev V 7 1.1.2.2 PROPS-END SVN=L/m+LPxTQZVr_nP:{ J/Oj oEx/* $Id: opentpt.c,v 1.1.2.2 1999/08/02 22:32:39CodeFragments.h> #include #include #include #include ep); OTSetSynchronous(s->ep); result = OTRcv(s->ep, buf, buflen, &ot&s->eventq)) != NULL) OTFreeMem(link); while ((link = OTLIFODequeue(&while ((link = OTLIFOStealList(&.fN} Node-path: putty-ben-mac-port/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 3133f4f6096d03aef10fda2b217a1bed Text-delta-base-sha1: 6f8952a9f2387de2a7f1cff5919ee95d9fc3924c Text-content-length: 65 Text-content-md5: 868751af6f1fd09689a9615b70247ecc Text-content-sha1: 425cfbaea7dacb38b24f32f9244c5cc59a8d1cc8 Content-length: 109 K 15 cvs2svn:cvs-rev V 8 1.4.2.21 PROPS-END SVN > ,{enum { CIPHER_3DES, CIPHER_BLOWFISH } cipher Revision-number: 193 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:53.806883Z PROPS-END Revision-number: 194 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:53.817102Z PROPS-END Revision-number: 195 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:53.824925Z PROPS-END Revision-number: 196 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 Module description file added K 10 svn:author V 5 simon K 8 svn:date V 27 1999-08-10T16:04:43.000000Z PROPS-END Node-path: putty/MODULE Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 348 Text-content-md5: 1c7e9eb29fd5c576df5809a22f24083f Text-content-sha1: 1600829e966db5e174f22142f56cc7d43d7277a8 Content-length: 464 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNNNNModule: putty Author: Simon Tatham Description: PuTTY is a free (MIT-licensed) Win32 implementation of Telnet and SSH, with a comprehensive xterm/Linux/vt220 terminal emulator attached. Homepage: http://www.chiark.greenend.org.uk/~sgtatham/putty.html Release: http://www.chiark.greenend.org.uk/~sgtatham/putty.html Revision-number: 197 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:53.898230Z PROPS-END Revision-number: 198 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 32 Small but highly unhelpful typo K 10 svn:author V 5 simon K 8 svn:date V 27 1999-08-11T08:50:36.000000Z PROPS-END Node-path: putty/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 46a218923552898f39d0982191a8a830 Text-delta-base-sha1: 4d57acf43ac249a4d5f3a983ac77eab42de7951f Text-content-length: 22 Text-content-md5: de0ad27457e5e3a0bdf6b1eee21f96f9 Text-content-sha1: bf849c18050ad09a99a983aea2df0001dd9a70ab Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNVV ~W. Revision-number: 199 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 1999-08-11T08:50:36.000000Z K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-47'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-0.47 Node-kind: dir Node-action: add Node-copyfrom-rev: 198 Node-copyfrom-path: putty Revision-number: 200 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:53.951671Z PROPS-END Revision-number: 201 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 1999-08-21T18:18:09.000000Z K 7 svn:log V 31 ssh_gotdata now compiles again K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: d878688914ff016eaab04be5e693a2be Text-delta-base-sha1: 4d1c263ab80ad99852171a293203fb8b38f72038 Text-content-length: 11333 Text-content-md5: 12d3ca14110a69a0598741d6fbeec073 Text-content-sha1: f9ce1affabdf130c80762129b233df6279cb599e Content-length: 11376 K 15 cvs2svn:cvs-rev V 7 1.7.2.1 PROPS-END SVNYpFT<;Pd: =J`L4OVb,9uaQab$`s&?8F>KVvQ7(OFvowGN{ _ nbl.l~  ~8AtfXp{9dhhe#kI#include #include #ifndef macintosh #include #endif(l) (l) = 0; #define crBegin2(l) switch(l) { case 0:; #define crBegin(l) crBegin1(l); crBegin2(l); #define crFinish(l,z) } (l) = 0; return (l) #define foolemacs { #define crFinishV(l) } (l) = 0; return #define crReturn(l,z) \ do {\ (l)=__LINE__; return (z); case __LINE__:;\ } while (0) #define crReturnV(l) \ do {\ (l)=__LINE__; return; case __LINE__:;\ } while (0) #define crStop(l,z) do{ (l) = 0; return (z); }while(0) #define crStopV(l) do{ (l)ruct ssh_private { SOCKET s; unsigned char session_key[32]; struct ssh_cipher *cipher; char *savedhost; enum { SSH_STATE_BEFORE_SIZE, SSH_STATE_INTERMED, SSH_STATE_SESSION, SSH_STATE_CLOSED } ssh_state; int size_needed; #ifdef FWHACK char *FWhost; int FWport; #endif struct Packet pktin; struct Packet pktout; /* State for ssh_gotdata coroutine */ int gd_line; long len, biglen, to_read; unsigned char *p; int i, pad; int chunk; char *sversion; size_t sversion_space, sversion_len; /* State for ssh_protocol coroutine */ int pr_line; }; static void s_write (Session *sess, unsigned char *buf, int len) { struct ssh_private *sp = (struct ssh_private*)sess->back_priv; while (len > 0) { int i = net_send (sp->s, buf, len, 0); if (i > 0) len -= i, buf += i; } } static int s_read (Session *sess, unsigned char *buf, int len) { struct ssh_private *sp = (struct ssh_private*)sess->back_priv; int ret = 0; while (len > 0) { int i = net_recv (sp->Session *sess, char *buf, int len) { while (len--) { int new_head = (sess->inbuf_head + 1) & INBUF_MASK; if (new_head != sess->inbuf_reap) { sess->inbuf[sess->inbuf_head] = *buf++; sess->inbuf_head = new_head; } } } static void ssh_protocol(Session *,unsigned char *in, int inlen, int ispkt); static void ssh_size(void); static void ssh_gotdata(Session *sess, unsigned char *data, int datalen) { struct ssh_private *sp = (struct ssh_private *)sess->back_priv; unsigned char *eol; size_t fraglen = datalen; static char vstring[] = "SSH-1.5-PuTTY\n"; crBegin(sp->gd_line); #ifdef FWHACK /* Should wait for "SSH-" */ #endif sp->sversion = smalloc(16); /* enough for "SSH-1.5-1.2.27\n" */ sp->sversion_space = 16; sp->sversion_len = 0; do { while (datalen == 0) crReturnV(sp->gd_line); eol = memchr(data, '\n', datalen); if (eol != NULL) fraglen = eol + 1 - data; /* include \n */ if (sp->sversion_len + fraglen > sp->sversion_space) { /* FIXME Sanity-check length */ srealloc(sp->sversion, sp->sversion_len + fraglen); sp->sversion_space = sp->sversion_len + fraglen; } memcpy(sp->sversion + sp->sversion_len, data, fraglen); data += fraglen; datalen -= fraglen; } while (eol == NULL); sp->sversion[sp->sversion_len - 1] = '\0'; if (sp->sversion_len < 4 || memcmp(sp->sversion, "SSH-", 4) != 0) /* XXX explode! */; /* * We ignore the rest of the banner on the grounds that we only * speak SSH 1.5 anyway. If the server can't, that's its problem. */ s_write(sess, (unsigned char *)vstring, strlen(vstring)); /* End of do_ssh_init */ while (1) { for (sp->i = sp->len = 0; sp->i < 4; sp->i++) { while (datalen == 0) crReturnV(sp->gd_line); sp->len = (sp->len << 8) + *data; data++, datalen--; } #ifdef FWHACK if (sp->sp->sp->pad = 8 - (sp->len%8); sp->biglen = sp->len + sp->pad; sp->len -= 5; /* type and CRC */ sp->pktin.length = sp->len; if (sp->pktin.maxlen < sp->biglen) { sp->pktin.maxlen = sp->biglen; sp->pktin.data = (sp->pktin.data == NULL ? smalloc(sp->biglen) : srealloc(sp->pktin.data, sp->biglen)); } sp->p = sp->pktin.data, sp->to_read = sp->biglen; while (sp->to_read > 0) { sp->chunk = sp->to_read; while (datalen == 0) crReturnV(sp->gd_line); if (sp->chunk > datalen) sp->chunk = datalen; memcpy(sp->p, data, sp->chunk); data += sp->chunk; datalen -= sp->chunk; sp->p += sp->chunk; sp->to_read -= sp->chunk; } if (sp->cipher) sp->cipher->decrypt(sp->pktin.data, sp->biglen); sp->pktin.type = sp->pktin.data[sp->pad]; sp->pktin.body = sp->pktin.data+sp->pad+1; if (sp->sess, NULL, 0, 1); } crFinishV(sp->gd_line); } static void s_wrpkt_start(Session *sess, int type, int len) { struct ssh_private *sp = (struct ssh_private *)sess->back_priv;sp->pktout.length = len-5; if (sp->pktout.maxlen < biglen) { sp->pktout.maxlen = biglen; sp->pktout.data = (sp->pktout.data == NULL ? smalloc(biglen+4) : srealloc(sp->pktout.data, biglen+4)); } sp->pktout.type = type; sp->pktout.body = sp->pktout.data+4+pad+1; } static void s_wrpkt(Session *sess) { struct ssh_private *sp = (struct ssh_private *)sess->back_priv; int pad, len, biglen, i; unsigned long crc; len = sp->sp->pktout.body[-1] = sp->pktout.type; for (i=0; ipktout.data[i+4] = random_byte(); crc = crc32(sp->pktout.data+4, biglen-4); sp->pktout.data[biglen+0] = (unsigned char) ((crc >> 24) & 0xFF); sp->pktout.data[biglen+1] = (unsigned char) ((crc >> 16) & 0xFF); sp->pktout.data[biglen+2] = (unsigned char) ((crc >> 8) & 0xFF); sp->pktout.data[biglen+3] = (unsigned char) (crc & 0xFF); sp->pktout.data[0] = (len >> 24) & 0xFF; sp->pktout.data[1] = (len >> 16) & 0xFF; sp->pktout.data[2] = (len >> 8) & 0xFF; sp->pktout.data[3] = len & 0xFF; if (sp->cipher) sp->cipher->encrypt(sp->pktout.data+4, biglen); s_write(sess, sp->pktout.data, biglen+4); } static int do_ssh_init(Session *sess) { } static void ssh_protocol(Session *sess, unsigned char *in, int inlen, int ispkt) { struct ssh_private *sp = (struct ssh_private *)sess->back_priv;(sp->pr_line); random_init(); while (!ispkt) crReturnV(sp->pr_line); if (sp->pktin.type != 2) fatalbox("Public key packet not received"); memcpy(cookie, sp->pktin.body, 8); MD5Init(&md5c); i = makekey(sp->pktin.body+8, &servkey, &keystr1); j = makekey(sp->pktin.body+8+i, &hostkey, &keystr2); supported_ciphers_mask = (sp->pktin.body[12+i+j] << 24) | (sp->pktin.body[13+i+j] << 16) | (sp->pktin.body[14+i+j] << 8) | (sp->sp->sp->pktout.body[0] = cipher_type; memcpy(sp->pktout.body+1, cookie, 8); sp->pktout.body[9] = (len*8) >> 8; sp->pktout.body[10] = (len*8) & 0xFF; memcpy(sp->pktout.body+11, rsabuf, len); sp->pktout.body[len+11] = sp->pktout.body[len+12] = 0; /* protocol flags */ sp->pktout.body[len+13] = sp->(sp->pr_line); } while (!ispkt); if (sp->(sp->pr_line)sp->pktout.body[0] = sp->pktout.body[1] = sp->pktout.body[2] = 0; sp->pktout.body[3] = strlen(username); memcpy(sp->(sp->pr_line); } while (!ispkt); while (sp->(sp->pr_line)sp->pktout.body[0] = sp->pktout.body[1] = sp->pktout.body[2] = 0; sp->pktout.body[3] = strlen(password); memcpy(sp->(sp->pr_line); } while (!ispkt); if (sp->sp->pktin.type != 14) { fatalbox("Strange packet received, type %d", sp->sp->pktout.body[0] = (i >> 24) & 0xFF; sp->pktout.body[1] = (i >> 16) & 0xFF; sp->pktout.body[2] = (i >> 8) & 0xFF; sp->pktout.body[3] = i & 0xFF; memcpy(sp->pktout.body+4, cfg.termtype, i); i += 4; sp->pktout.body[i++] = (rows >> 24) & 0xFF; sp->pktout.body[i++] = (rows >> 16) & 0xFF; sp->pktout.body[i++] = (rows >> 8) & 0xFF; sp->pktout.body[i++] = rows & 0xFF; sp->pktout.body[i++] = (cols >> 24) & 0xFF; sp->pktout.body[i++] = (cols >> 16) & 0xFF; sp->pktout.body[i++] = (cols >> 8) & 0xFF; sp->pktout.body[i++] = cols & 0xFF; memset(sp->(sp->pr_line); } while (!ispkt); if (sp->pktin.type != 14 && sp->pktin.type != 15) { fatalbox("Protocol confusion"); } else if (sp->(sp->pr_line); if (ispkt) { if (sp->pktin.type == 17 || sp->pktin.type == 18) { long len = 0; for (i = 0; i < 4; i++) len = (len << 8) + sp->pktin.body[i]; c_write(sp->pktin.body+4, len); } else if (sp->sp->pktin.type == 14) { /* SSH_MSG_SUCCESS: may be from EXEC_SHELL on some servers */ } else if (sp->sp->sp->pktin.type); } } else { s_wrpkt_start(16, 4+inlen); sp->pktout.body[0] = (inlen >> 24) & 0xFF; sp->pktout.body[1] = (inlen >> 16) & 0xFF; sp->pktout.body[2] = (inlen >> 8) & 0xFF; sp->pktout.body[3] = inlen & 0xFF; memcpy(sp->(Session *sess) { struct ssh_private *sp; char *host = sess->cfg.host; int port = sess->cfg.port; sess->back_priv = smalloc(sizeof(struct ssh_private)); sp = (struct ssh_private *)sess->back_priv; memset(*sp, 0, sizeof(*sp)); sp->s = INVALID_SOCKET; sp->ssh_state = SSH_STATE_BEFORE_SIZE; sp->savedhost = smalloc(1+strlen(host)); strcpy(sp->savedhost, host); #ifdef FWHACK sp->FWhost = host; sp->FWport = port; host = FWSTR; port = 23; #endif if (port < 0) port = 22; /* default ssh port */ sp->s = net_open(sess, host, port); return NULL; } static void ssh_opened(Session *sess) { struct ssh_private *sp = (struct ssh_private *)sess->back_priv; #ifdef FWHACK send(sp->s, "connect ", 8, 0); send(sp->Session *sess, SOCKET sock, Net_Event_Type ne) { struct ssh_private *sp = (struct ssh_provate *)sess->back_priv;switch (ne) { case NE_OPEN: ssh_opened(sess); return 1; case NE_DATA: ret = net_recv(sock, buf, sizeof(buf), 0); if (ret < 0) /* any _other_ error */ return -1; if (ret == 0) { sp->(sess, buf, ret); return 1; case NE_CLOSING: sp->s = INVALID_SOCKET; sp->ssh_state = SSH_STATE_CLOSED; return 0; case NE_NOHOST: fatalbox("Host not found"); case NE_REFUSED: fatalbox("Connection refused"); case NE_NOOPEN: fatalbox("Unable to open connection"); case NE_TIMEOUT: fatalbox("Connection timed out"); case NE_ABORT: fatalbox("Connection reset by peer"); case NE_DIED: fatalbox("Connection died")(Session *sess, char *buf, int len) { if (s == INVALID_SOCKET) return; ssh_protocol(sess, Session *sess) { struct ssh_private *sp = (struct ssh_private *sp)sess->back_priv; switch (sp->p->sess->cfg.nopty) { s_wrpkt_start(11, 16); sp->pktout.body[0] = (rows >> 24) & 0xFF; sp->pktout.body[1] = (rows >> 16) & 0xFF; sp->pktout.body[2] = (rows >> 8) & 0xFF; sp->pktout.body[3] = rows & 0xFF; sp->pktout.body[4] = (cols >> 24) & 0xFF; sp->pktout.body[5] = (cols >> 16) & 0xFF; sp->pktout.body[6] = (cols >> 8) & 0xFF; sp->pktout.body[7] = cols & 0xFF; memset(sp-> Revision-number: 202 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:54.018753Z PROPS-END Revision-number: 203 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:54.025271Z PROPS-END Revision-number: 204 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:54.032689Z PROPS-END Revision-number: 205 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 1999-08-31T09:20:48.000000Z K 7 svn:log V 38 Added Joris van Rantwijk's scp client K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 17217 Text-content-md5: 9afb401f7c90f1b52edd4d3e1ac7a6d9 Text-content-sha1: fa661647f2c7681ccbb2b2409ec0205a142e07a3 Content-length: 17333 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN000/* * scp.c - Scp (Secure Copy) client for PuTTY. * Joris van Rantwijk, Aug 1999. * * This is mainly based on ssh-1.2.26/scp.c by Timo Rinne & Tatu Ylonen. * They, in turn, used stuff from BSD rcp. */ #include #include #include #include #include #include #define PUTTY_DO_GLOBALS #include "putty.h" #include "scp.h" #define TIME_POSIX_TO_WIN(t, ft) (*(LONGLONG*)&(ft) = \ ((LONGLONG) (t) + (LONGLONG) 11644473600) * (LONGLONG) 10000000) #define TIME_WIN_TO_POSIX(ft, t) ((t) = (unsigned long) \ ((*(LONGLONG*)&(ft)) / (LONGLONG) 10000000 - (LONGLONG) 11644473600)) int verbose = 0; static int recursive = 0; static int preserve = 0; static int targetshouldbedirectory = 0; static int statistics = 1; static int errs = 0; static int connection_open = 0; static void source(char *src); static void rsource(char *src); static void sink(char *targ); /* * Print an error message and perform a fatal exit. */ void fatalbox(char *fmt, ...) { va_list ap; va_start(ap, fmt); fprintf(stderr, "Fatal: "); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); va_end(ap); exit(1); } /* * Print an error message and exit after closing the SSH link. */ static void bump(char *fmt, ...) { va_list ap; va_start(ap, fmt); fprintf(stderr, "Fatal: "); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); va_end(ap); if (connection_open) { char ch; ssh_send_eof(); ssh_recv(&ch, 1); } exit(1); } void ssh_get_password(char *prompt, char *str, int maxlen) { HANDLE hin, hout; DWORD savemode, i; hin = GetStdHandle(STD_INPUT_HANDLE); hout = GetStdHandle(STD_OUTPUT_HANDLE); if (hin == INVALID_HANDLE_VALUE || hout == INVALID_HANDLE_VALUE) bump("Cannot get standard input/output handles"); GetConsoleMode(hin, &savemode); SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT); WriteFile(hout, prompt, strlen(prompt), &i, NULL); ReadFile(hin, str, maxlen-1, &i, NULL); SetConsoleMode(hin, savemode); if (i > maxlen) i = maxlen-1; else i = i - 2; str[i] = '\0'; WriteFile(hout, "\r\n", 2, &i, NULL); } /* * Open an SSH connection to user@host and execute cmd. */ static void do_cmd(char *host, char *user, char *cmd) { char *err, *realhost; if (host == NULL || host[0] == '\0') bump("Empty host name"); /* Try to load settings for this host */ do_defaults(host); if (cfg.host[0] == '\0') { /* No settings for this host; use defaults */ strncpy(cfg.host, host, sizeof(cfg.host)-1); cfg.host[sizeof(cfg.host)-1] = '\0'; cfg.port = 22; } /* Set username */ if (user != NULL && user[0] != '\0') { strncpy(cfg.username, user, sizeof(cfg.username)-1); cfg.username[sizeof(cfg.username)-1] = '\0'; cfg.port = 22; } else if (cfg.username[0] == '\0') { bump("Empty user name"); } if (cfg.protocol != PROT_SSH) cfg.port = 22; err = ssh_init(cfg.host, cfg.port, cmd, &realhost); if (err != NULL) bump("ssh_init: %s", err); if (verbose && realhost != NULL) fprintf(stderr, "Connected to %s\n", realhost); connection_open = 1; } /* * Update statistic information about current file. */ static void print_stats(char *name, unsigned long size, unsigned long done, unsigned long start, unsigned long now) { float ratebs; unsigned long eta; char etastr[10]; int pct; if (now > start) ratebs = (float) done / (now - start); else ratebs = (float) done; if (ratebs < 1.0) eta = size - done; else eta = (size - done) / ratebs; sprintf(etastr, "%02d:%02d:%02d", eta / 3600, (eta % 3600) / 60, eta % 60); pct = 100.0 * (float) done / size; printf("\r%-25.25s | %10ld kB | %5.1f kB/s | ETA: %8s | %3d%%", name, done / 1024, ratebs / 1024.0, etastr, pct); if (done == size) printf("\n"); } /* * Find a colon in str and return a pointer to the colon. * This is used to seperate hostname from filename. */ static char * colon(char *str) { /* We ignore a leading colon, since the hostname cannot be empty. We also ignore a colon as second character because of filenames like f:myfile.txt. */ if (str[0] == '\0' || str[0] == ':' || str[1] == ':') return (NULL); while (*str != '\0' && *str != ':' && *str != '/' && *str != '\\') str++; if (*str == ':') return (str); else return (NULL); } /* * Wait for a response from the other side. * Return 0 if ok, -1 if error. */ static int response(void) { char ch, resp, rbuf[2048]; int p; if (ssh_recv(&resp, 1) <= 0) bump("Lost connection"); p = 0; switch (resp) { case 0: /* ok */ return (0); default: rbuf[p++] = resp; /* fallthrough */ case 1: /* error */ case 2: /* fatal error */ do { if (ssh_recv(&ch, 1) <= 0) bump("Protocol error: Lost connection"); rbuf[p++] = ch; } while (p < sizeof(rbuf) && ch != '\n'); rbuf[p-1] = '\0'; if (resp == 1) fprintf(stderr, "%s\n", rbuf); else bump("%s", rbuf); errs++; return (-1); } } /* * Send an error message to the other side and to the screen. * Increment error counter. */ static void run_err(const char *fmt, ...) { char str[2048]; va_list ap; va_start(ap, fmt); errs++; strcpy(str, "\01scp: "); vsprintf(str+strlen(str), fmt, ap); strcat(str, "\n"); ssh_send(str, strlen(str)); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); va_end(ap); } /* * Execute the source part of the SCP protocol. */ static void source(char *src) { char buf[2048]; unsigned long size; char *last; HANDLE f; DWORD attr; unsigned long i; unsigned long stat_bytes; unsigned long stat_starttime, stat_lasttime; attr = GetFileAttributes(src); if (attr == -1) { run_err("%s: No such file or directory", src); return; } if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { if (recursive) rsource(src); else run_err("%s: not a regular file", src); return; } if ((last = strrchr(src, '/')) == NULL) last = src; else last++; if (strrchr(last, '\\') != NULL) last = strrchr(last, '\\') + 1; if (last == src && strchr(src, ':') != NULL) last = strchr(src, ':') + 1; f = CreateFile(src, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if (f == INVALID_HANDLE_VALUE) { run_err("%s: Cannot open file"); return; } if (preserve) { FILETIME actime, wrtime; unsigned long mtime, atime; GetFileTime(f, NULL, &actime, &wrtime); TIME_WIN_TO_POSIX(actime, atime); TIME_WIN_TO_POSIX(wrtime, mtime); sprintf(buf, "T%lu 0 %lu 0\n", mtime, atime); ssh_send(buf, strlen(buf)); if (response()) return; } size = GetFileSize(f, NULL); sprintf(buf, "C0644 %lu %s\n", size, last); if (verbose) fprintf(stderr, "Sending file modes: %s", buf); ssh_send(buf, strlen(buf)); if (response()) return; if (statistics) { stat_bytes = 0; stat_starttime = time(NULL); stat_lasttime = 0; } for (i = 0; i < size; i += 4096) { char transbuf[4096]; DWORD j, k = 4096; if (i + k > size) k = size - i; if (! ReadFile(f, transbuf, k, &j, NULL) || j != k) { if (statistics) printf("\n"); bump("%s: Read error", src); } ssh_send(transbuf, k); if (statistics) { stat_bytes += k; if (time(NULL) != stat_lasttime || i + k == size) { stat_lasttime = time(NULL); print_stats(last, size, stat_bytes, stat_starttime, stat_lasttime); } } } CloseHandle(f); ssh_send("", 1); (void) response(); } /* * Recursively send the contents of a directory. */ static void rsource(char *src) { char buf[2048]; char *last; HANDLE dir; WIN32_FIND_DATA fdat; int ok; if ((last = strrchr(src, '/')) == NULL) last = src; else last++; if (strrchr(last, '\\') != NULL) last = strrchr(last, '\\') + 1; if (last == src && strchr(src, ':') != NULL) last = strchr(src, ':') + 1; /* maybe send filetime */ sprintf(buf, "D0755 0 %s\n", last); if (verbose) fprintf(stderr, "Entering directory: %s", buf); ssh_send(buf, strlen(buf)); if (response()) return; sprintf(buf, "%s/*", src); dir = FindFirstFile(buf, &fdat); ok = (dir != INVALID_HANDLE_VALUE); while (ok) { if (strcmp(fdat.cFileName, ".") == 0 || strcmp(fdat.cFileName, "..") == 0) { } else if (strlen(src) + 1 + strlen(fdat.cFileName) >= sizeof(buf)) { run_err("%s/%s: Name too long", src, fdat.cFileName); } else { sprintf(buf, "%s/%s", src, fdat.cFileName); source(buf); } ok = FindNextFile(dir, &fdat); } FindClose(dir); sprintf(buf, "E\n"); ssh_send(buf, strlen(buf)); (void) response(); } /* * Execute the sink part of the SCP protocol. */ static void sink(char *targ) { char buf[2048]; char namebuf[2048]; char ch; int targisdir = 0; int settime = 0; int exists; DWORD attr; HANDLE f; unsigned long mtime, atime; unsigned int mode; unsigned long size, i; int wrerror = 0; unsigned long stat_bytes; unsigned long stat_starttime, stat_lasttime; char *stat_name; attr = GetFileAttributes(targ); if (attr != -1 && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0) targisdir = 1; if (targetshouldbedirectory && !targisdir) bump("%s: Not a directory", targ); ssh_send("", 1); while (1) { settime = 0; gottime: if (ssh_recv(&ch, 1) <= 0) return; if (ch == '\n') bump("Protocol error: Unexpected newline"); i = 0; buf[i++] = ch; do { if (ssh_recv(&ch, 1) <= 0) bump("Lost connection"); buf[i++] = ch; } while (i < sizeof(buf) && ch != '\n'); buf[i-1] = '\0'; switch (buf[0]) { case '\01': /* error */ fprintf(stderr, "%s\n", buf+1); errs++; continue; case '\02': /* fatal error */ bump("%s", buf+1); case 'E': ssh_send("", 1); return; case 'T': if (sscanf(buf, "T%d %*d %d %*d", &mtime, &atime) == 2) { settime = 1; ssh_send("", 1); goto gottime; } bump("Protocol error: Illegal time format"); case 'C': case 'D': break; default: bump("Protocol error: Expected control record"); } if (sscanf(buf+1, "%u %u %[^\n]", &mode, &size, namebuf) != 3) bump("Protocol error: Illegal file descriptor format"); if (targisdir) { char t[2048]; strcpy(t, targ); if (targ[0] != '\0') strcat(t, "/"); strcat(t, namebuf); strcpy(namebuf, t); } else { strcpy(namebuf, targ); } attr = GetFileAttributes(namebuf); exists = (attr != -1); if (buf[0] == 'D') { if (exists && (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) { run_err("%s: Not a directory", namebuf); continue; } if (!exists) { if (! CreateDirectory(namebuf, NULL)) { run_err("%s: Cannot create directory", namebuf); continue; } } sink(namebuf); /* can we set the timestamp for directories ? */ continue; } f = CreateFile(namebuf, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (f == INVALID_HANDLE_VALUE) { run_err("%s: Cannot create file", namebuf); continue; } ssh_send("", 1); if (statistics) { stat_bytes = 0; stat_starttime = time(NULL); stat_lasttime = 0; if ((stat_name = strrchr(namebuf, '/')) == NULL) stat_name = namebuf; else stat_name++; if (strrchr(stat_name, '\\') != NULL) stat_name = strrchr(stat_name, '\\') + 1; } for (i = 0; i < size; i += 4096) { char transbuf[4096]; int j, k = 4096; if (i + k > size) k = size - i; if (ssh_recv(transbuf, k) == 0) bump("Lost connection"); if (wrerror) continue; if (! WriteFile(f, transbuf, k, &j, NULL) || j != k) { wrerror = 1; if (statistics) printf("\r%-25.25s | %50s\n", stat_name, "Write error.. waiting for end of file"); continue; } if (statistics) { stat_bytes += k; if (time(NULL) > stat_lasttime || i + k == size) { stat_lasttime = time(NULL); print_stats(stat_name, size, stat_bytes, stat_starttime, stat_lasttime); } } } (void) response(); if (settime) { FILETIME actime, wrtime; TIME_POSIX_TO_WIN(atime, actime); TIME_POSIX_TO_WIN(mtime, wrtime); SetFileTime(f, NULL, &actime, &wrtime); } CloseHandle(f); if (wrerror) { run_err("%s: Write error", namebuf); continue; } ssh_send("", 1); } } /* * We will copy local files to a remote server. */ static void toremote(int argc, char *argv[]) { char *src, *targ, *host, *user; char *cmd; int i; targ = argv[argc-1]; /* Seperate host from filename */ host = targ; targ = colon(targ); if (targ == NULL) bump("targ == NULL in toremote()"); *targ++ = '\0'; if (*targ == '\0') targ = "."; /* Substitute "." for emtpy target */ /* Seperate host and username */ user = host; host = strrchr(host, '@'); if (host == NULL) { host = user; user = NULL; } else { *host++ = '\0'; if (*user == '\0') user = NULL; } if (argc == 2) { /* Find out if the source filespec covers multiple files if so, we should set the targetshouldbedirectory flag */ HANDLE fh; WIN32_FIND_DATA fdat; if (colon(argv[0]) != NULL) bump("%s: Remote to remote not supported", argv[0]); fh = FindFirstFile(argv[0], &fdat); if (fh == INVALID_HANDLE_VALUE) bump("%s: No such file or directory\n", argv[0]); if (FindNextFile(fh, &fdat)) targetshouldbedirectory = 1; FindClose(fh); } cmd = smalloc(strlen(targ) + 100); sprintf(cmd, "scp%s%s%s%s -t %s", verbose ? " -v" : "", recursive ? " -r" : "", preserve ? " -p" : "", targetshouldbedirectory ? " -d" : "", targ); do_cmd(host, user, cmd); sfree(cmd); (void) response(); for (i = 0; i < argc - 1; i++) { HANDLE dir; WIN32_FIND_DATA fdat; src = argv[i]; if (colon(src) != NULL) { fprintf(stderr, "%s: Remote to remote not supported\n", src); errs++; continue; } dir = FindFirstFile(src, &fdat); if (dir == INVALID_HANDLE_VALUE) { run_err("%s: No such file or directory", src); continue; } do { char *last; char namebuf[2048]; if (strlen(src) + strlen(fdat.cFileName) >= sizeof(namebuf)) { fprintf(stderr, "%s: Name too long", src); continue; } strcpy(namebuf, src); if ((last = strrchr(namebuf, '/')) == NULL) last = namebuf; else last++; if (strrchr(last, '\\') != NULL) last = strrchr(last, '\\') + 1; if (last == namebuf && strrchr(namebuf, ':') != NULL) last = strchr(namebuf, ':') + 1; strcpy(last, fdat.cFileName); source(namebuf); } while (FindNextFile(dir, &fdat)); FindClose(dir); } } /* * We will copy files from a remote server to the local machine. */ static void tolocal(int argc, char *argv[]) { char *src, *targ, *host, *user; char *cmd; if (argc != 2) bump("More than one remote source not supported"); src = argv[0]; targ = argv[1]; /* Seperate host from filename */ host = src; src = colon(src); if (src == NULL) bump("Local to local copy not supported"); *src++ = '\0'; if (*src == '\0') src = "."; /* Substitute "." for empty filename */ /* Seperate username and hostname */ user = host; host = strrchr(host, '@'); if (host == NULL) { host = user; user = NULL; } else { *host++ = '\0'; if (*user == '\0') user = NULL; } cmd = smalloc(strlen(src) + 100); sprintf(cmd, "scp%s%s%s%s -f %s", verbose ? " -v" : "", recursive ? " -r" : "", preserve ? " -p" : "", targetshouldbedirectory ? " -d" : "", src); do_cmd(host, user, cmd); sfree(cmd); sink(targ); } /* * Initialize the Win$ock driver. */ static void init_winsock() { WORD winsock_ver; WSADATA wsadata; winsock_ver = MAKEWORD(1, 1); if (WSAStartup(winsock_ver, &wsadata)) bump("Unable to initialise WinSock"); if (LOBYTE(wsadata.wVersion) != 1 || HIBYTE(wsadata.wVersion) != 1) bump("WinSock version is incompatible with 1.1"); } /* * Short description of parameters. */ static void usage() { printf("PuTTY Secure Copy client\n"); printf("%s\n", ver); printf("usage: scp [-p] [-q] [-r] [-v] [user@]host:source target\n"); printf(" scp [-p] [-q] [-r] [-v] source [source..]" " [user@]host:target\n"); exit(1); } /* * Main program (no, really?) */ int main(int argc, char *argv[]) { int i; init_winsock(); for (i = 1; i < argc; i++) { if (argv[i][0] != '-') break; if (strcmp(argv[i], "-v") == 0) verbose = 1; else if (strcmp(argv[i], "-r") == 0) recursive = 1; else if (strcmp(argv[i], "-p") == 0) preserve = 1; else if (strcmp(argv[i], "-q") == 0) statistics = 0; else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-?") == 0) usage(); else if (strcmp(argv[i], "--") == 0) { i++; break; } else usage(); } argc -= i; argv += i; if (argc < 2) usage(); if (argc > 2) targetshouldbedirectory = 1; if (colon(argv[argc-1]) != NULL) toremote(argc, argv); else tolocal(argc, argv); if (connection_open) { char ch; ssh_send_eof(); ssh_recv(&ch, 1); } WSACleanup(); random_save_seed(); return (errs == 0 ? 0 : 1); } /* end */ Node-path: putty/scp.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 394 Text-content-md5: 4172bda57980f7f72b768c4948851ea6 Text-content-sha1: 41d7dc0ca0f28795374690c8a42c7f0c7438bcc9 Content-length: 510 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN|||/* * scp.h * Joris van Rantwijk, Aug 1999. */ /* * Exported from scp.c */ extern int verbose; void ssh_get_password(char *prompt, char *str, int maxlen); /* * Exported from scpssh.c */ char * ssh_init(char *host, int port, char *cmd, char **realhost); int ssh_recv(unsigned char *buf, int len); void ssh_send(unsigned char *buf, int len); void ssh_send_eof(void); Node-path: putty/scp.ico Node-kind: file Node-action: add Prop-content-length: 88 Text-delta: true Text-content-length: 1100 Text-content-md5: 401b5a0ee63cc6d9d0346d2c1270f718 Text-content-sha1: 14176796b0ca4e635d0a4757f80ea1198d1de089 Content-length: 1188 K 15 cvs2svn:cvs-rev V 3 1.1 K 13 svn:mime-type V 24 application/octet-stream PROPS-END SVN>>> & 0( @   𻰈p xwwwx  Lj Lj Lj Lj Lj Ljwwwwwx( @x@<@ a<s\@A?߀`0 Node-path: putty/scp.rc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 30 Text-content-md5: 3f5ca2ffc5a0ab8ce79ec50398e0ab40 Text-content-sha1: e96499dad88d0e1819c6151109efae012beee0cd Content-length: 146 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN200 ICON "scp.ico" Node-path: putty/scpssh.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 13513 Text-content-md5: fe7b58b2273302a0097d95027b6bcca5 Text-content-sha1: 7586e4d7548e66c93407ff7b7b2442452789b59c Content-length: 13629 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN;;;/* * scpssh.c - SSH implementation for PuTTY Secure Copy * Joris van Rantwijk, Aug 1999. * Based on PuTTY ssh.c by Simon Tatham. */ #include #include #include #include #include "putty.h" #include "ssh.h" #include "scp.h" #define SSH_MSG_DISCONNECT 1 #define SSH_SMSG_PUBLIC_KEY 2 #define SSH_CMSG_SESSION_KEY 3 #define SSH_CMSG_USER 4 #define SSH_CMSG_AUTH_PASSWORD 9 #define SSH_CMSG_EXEC_CMD 13 #define SSH_SMSG_SUCCESS 14 #define SSH_SMSG_FAILURE 15 #define SSH_CMSG_STDIN_DATA 16 #define SSH_SMSG_STDOUT_DATA 17 #define SSH_SMSG_STDERR_DATA 18 #define SSH_CMSG_EOF 19 #define SSH_SMSG_EXIT_STATUS 20 #define SSH_CMSG_EXIT_CONFIRMATION 33 #define SSH_MSG_DEBUG 36 #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) #define PUT_32BIT(cp, value) { \ (cp)[0] = (value) >> 24; \ (cp)[1] = (value) >> 16; \ (cp)[2] = (value) >> 8; \ (cp)[3] = (value); } static SOCKET s = INVALID_SOCKET; static unsigned char session_key[32]; static struct ssh_cipher *cipher = NULL; static char *savedhost; struct Packet { long length; int type; unsigned long crc; unsigned char *data; unsigned char *body; long maxlen; }; static struct Packet pktin = { 0, 0, 0, NULL, 0 }; static struct Packet pktout = { 0, 0, 0, NULL, 0 }; static void s_write (char *buf, int len) { while (len > 0) { int i = send (s, buf, len, 0); noise_ultralight(i); if (i <= 0) fatalbox("Lost connection while sending"); len -= i, buf += i; } } static int s_read (char *buf, int len) { int ret = 0; while (len > 0) { int i = recv (s, buf, len, 0); noise_ultralight(i); if (i > 0) len -= i, buf += i, ret += i; else return i; } return ret; } /* * Read and decrypt one incoming SSH packet. */ static void get_packet() { unsigned char buf[4]; int ret; int len, pad, biglen; next_packet: pktin.type = 0; pktin.length = 0; ret = s_read(buf, 4); if (ret != 4) { closesocket(s); s = INVALID_SOCKET; return; } len = GET_32BIT(buf); #ifdef FWHACK if (len == 0x52656d6f) { len = 0x300; } #endif pad = 8 - (len % 8); biglen = len + pad; len -= 5; /* type and CRC */ pktin.length = len; if (pktin.maxlen < biglen) { pktin.maxlen = biglen; pktin.data = (pktin.data == NULL) ? smalloc(biglen) : srealloc(pktin.data, biglen); } ret = s_read(pktin.data, biglen); if (ret != biglen) { closesocket(s); s = INVALID_SOCKET; return; } if (cipher) cipher->decrypt(pktin.data, biglen); pktin.type = pktin.data[pad]; pktin.body = pktin.data + pad + 1; if (pktin.type == SSH_MSG_DEBUG) { if (verbose) { int len = GET_32BIT(pktin.body); fprintf(stderr, "Remote: "); fwrite(pktin.body + 4, len, 1, stderr); fprintf(stderr, "\n"); } goto next_packet; } } static void s_wrpkt_start(int type, int len) { int pad, biglen; len += 5; /* type and CRC */ pad = 8 - (len%8); biglen = len + pad; pktout.length = len-5; if (pktout.maxlen < biglen) { pktout.maxlen = biglen; pktout.data = (pktout.data == NULL ? malloc(biglen+4) : realloc(pktout.data, biglen+4)); if (!pktout.data) fatalbox("Out of memory"); } pktout.type = type; pktout.body = pktout.data+4+pad+1; } static void s_wrpkt(void) { int pad, len, biglen, i; unsigned long crc; len = pktout.length + 5; /* type and CRC */ pad = 8 - (len%8); biglen = len + pad; pktout.body[-1] = pktout.type; for (i=0; iencrypt(pktout.data+4, biglen); s_write(pktout.data, biglen+4); } static int do_ssh_init(void) { char c; char version[10]; char vstring[40]; int i; #ifdef FWHACK i = 0; while (s_read(&c, 1) == 1) { if (c == 'S' && i < 2) i++; else if (c == 'S' && i == 2) i = 2; else if (c == 'H' && i == 2) break; else i = 0; } #else if (s_read(&c,1) != 1 || c != 'S') return 0; if (s_read(&c,1) != 1 || c != 'S') return 0; if (s_read(&c,1) != 1 || c != 'H') return 0; #endif if (s_read(&c,1) != 1 || c != '-') return 0; i = 0; while (1) { if (s_read(&c,1) != 1) return 0; if (i >= 0) { if (c == '-') { version[i] = '\0'; i = -1; } else if (i < sizeof(version)-1) version[i++] = c; } else if (c == '\n') break; } sprintf(vstring, "SSH-%s-7.7.7\n", (strcmp(version, "1.5") <= 0 ? version : "1.5")); s_write(vstring, strlen(vstring)); return 1; } /* * Login on the server and request execution of the command. */ static void ssh_login(char *username, char *cmd) { int i, j, len; unsigned char session_id[16]; unsigned char *rsabuf, *keystr1, *keystr2; unsigned char cookie[8]; struct RSAKey servkey, hostkey; struct MD5Context md5c; unsigned long supported_ciphers_mask; int cipher_type; extern struct ssh_cipher ssh_3des; extern struct ssh_cipher ssh_blowfish; get_packet(); if (pktin.type != SSH_SMSG_PUBLIC_KEY) fatalbox("Public key packet not received"); memcpy(cookie, pktin.body, 8); MD5Init(&md5c); i = makekey(pktin.body+8, &servkey, &keystr1); j = makekey(pktin.body+8+i, &hostkey, &keystr2); supported_ciphers_mask = GET_32BIT(pktin.body+12+i+j); MD5Update(&md5c, keystr2, hostkey.bytes); MD5Update(&md5c, keystr1, servkey.bytes); MD5Update(&md5c, pktin.body, 8); MD5Final(session_id, &md5c); for (i=0; i<32; i++) session_key[i] = random_byte(); len = (hostkey.bytes > servkey.bytes ? hostkey.bytes : servkey.bytes); rsabuf = malloc(len); if (!rsabuf) fatalbox("Out of memory"); verify_ssh_host_key(savedhost, &hostkey); for (i=0; i<32; i++) { rsabuf[i] = session_key[i]; if (i < 16) rsabuf[i] ^= session_id[i]; } if (hostkey.bytes > servkey.bytes) { rsaencrypt(rsabuf, 32, &servkey); rsaencrypt(rsabuf, servkey.bytes, &hostkey); } else { rsaencrypt(rsabuf, 32, &hostkey); rsaencrypt(rsabuf, hostkey.bytes, &servkey); } cipher_type = cfg.cipher == CIPHER_BLOWFISH ? SSH_CIPHER_BLOWFISH : SSH_CIPHER_3DES; if ((supported_ciphers_mask & (1 << cipher_type)) == 0) { fprintf(stderr, "Selected cipher not supported, falling back to 3DES\n"); cipher_type = SSH_CIPHER_3DES; } s_wrpkt_start(SSH_CMSG_SESSION_KEY, len+15); pktout.body[0] = cipher_type; memcpy(pktout.body+1, cookie, 8); pktout.body[9] = (len*8) >> 8; pktout.body[10] = (len*8) & 0xFF; memcpy(pktout.body+11, rsabuf, len); pktout.body[len+11] = pktout.body[len+12] = 0; /* protocol flags */ pktout.body[len+13] = pktout.body[len+14] = 0; s_wrpkt(); free(rsabuf); cipher = cipher_type == SSH_CIPHER_BLOWFISH ? &ssh_blowfish : &ssh_3des; cipher->sesskey(session_key); get_packet(); if (pktin.type != SSH_SMSG_SUCCESS) fatalbox("Encryption not successfully enabled"); if (verbose) fprintf(stderr, "Logging in as \"%s\".\n", username); s_wrpkt_start(SSH_CMSG_USER, 4+strlen(username)); pktout.body[0] = pktout.body[1] = pktout.body[2] = 0; pktout.body[3] = strlen(username); memcpy(pktout.body+4, username, strlen(username)); s_wrpkt(); get_packet(); while (pktin.type == SSH_SMSG_FAILURE) { char password[100]; char prompt[200]; sprintf(prompt, "%s@%s's password: ", username, savedhost); ssh_get_password(prompt, password, 100); s_wrpkt_start(SSH_CMSG_AUTH_PASSWORD, 4+strlen(password)); pktout.body[0] = pktout.body[1] = pktout.body[2] = 0; pktout.body[3] = strlen(password); memcpy(pktout.body+4, password, strlen(password)); s_wrpkt(); memset(password, 0, strlen(password)); get_packet(); if (pktin.type == SSH_SMSG_FAILURE) { fprintf(stderr, "Access denied\n"); } else if (pktin.type != SSH_SMSG_SUCCESS) { fatalbox("Strange packet received, type %d", pktin.type); } } /* Execute command */ if (verbose) fprintf(stderr, "Sending command: %s\n", cmd); i = strlen(cmd); s_wrpkt_start(SSH_CMSG_EXEC_CMD, 4+i); PUT_32BIT(pktout.body, i); memcpy(pktout.body+4, cmd, i); s_wrpkt(); } /* * Receive a block of data over the SSH link. Block until * all data is available. Return nr of bytes read (0 if lost connection). */ int ssh_recv(unsigned char *buf, int len) { static int pending_input_len = 0; static unsigned char *pending_input_ptr; int to_read = len; if (pending_input_len >= to_read) { memcpy(buf, pending_input_ptr, to_read); pending_input_ptr += to_read; pending_input_len -= to_read; return len; } if (pending_input_len > 0) { memcpy(buf, pending_input_ptr, pending_input_len); buf += pending_input_len; to_read -= pending_input_len; pending_input_len = 0; } if (s == INVALID_SOCKET) return 0; while (to_read > 0) { get_packet(); if (s == INVALID_SOCKET) return 0; if (pktin.type == SSH_SMSG_STDOUT_DATA) { int plen = GET_32BIT(pktin.body); if (plen <= to_read) { memcpy(buf, pktin.body + 4, plen); buf += plen; to_read -= plen; } else { memcpy(buf, pktin.body + 4, to_read); pending_input_len = plen - to_read; pending_input_ptr = pktin.body + 4 + to_read; to_read = 0; } } else if (pktin.type == SSH_SMSG_STDERR_DATA) { int plen = GET_32BIT(pktin.body); fwrite(pktin.body + 4, plen, 1, stderr); } else if (pktin.type == SSH_MSG_DISCONNECT) { } else if (pktin.type == SSH_SMSG_SUCCESS || pktin.type == SSH_SMSG_FAILURE) { } else if (pktin.type == SSH_SMSG_EXIT_STATUS) { if (verbose) fprintf(stderr, "Remote exit status %d\n", GET_32BIT(pktin.body)); s_wrpkt_start(SSH_CMSG_EXIT_CONFIRMATION, 0); s_wrpkt(); if (verbose) fprintf(stderr, "Closing connection\n"); closesocket(s); s = INVALID_SOCKET; } } return len; } /* * Send a block of data over the SSH link. * Block until all data is sent. */ void ssh_send(unsigned char *buf, int len) { if (s == INVALID_SOCKET) return; s_wrpkt_start(SSH_CMSG_STDIN_DATA, 4 + len); PUT_32BIT(pktout.body, len); memcpy(pktout.body + 4, buf, len); s_wrpkt(); } /* * Send an EOF notification to the server. */ void ssh_send_eof(void) { if (s == INVALID_SOCKET) return; s_wrpkt_start(SSH_CMSG_EOF, 0); s_wrpkt(); } /* * Set up the connection, login on the remote host and * start execution of a command. * * Returns an error message, or NULL on success. * * Also places the canonical host name into `realhost'. */ char *ssh_init(char *host, int port, char *cmd, char **realhost) { SOCKADDR_IN addr; struct hostent *h; unsigned long a; #ifdef FWHACK char *FWhost; int FWport; #endif savedhost = malloc(1+strlen(host)); if (!savedhost) fatalbox("Out of memory"); strcpy(savedhost, host); #ifdef FWHACK FWhost = host; FWport = port; host = FWSTR; port = 23; #endif /* * Try to find host. */ if ( (a = inet_addr(host)) == (unsigned long) INADDR_NONE) { if ( (h = gethostbyname(host)) == NULL) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAHOST_NOT_FOUND: case WSANO_DATA: return "Host does not exist"; case WSATRY_AGAIN: return "Host not found"; default: return "gethostbyname: unknown error"; } memcpy (&a, h->h_addr, sizeof(a)); *realhost = h->h_name; } else *realhost = host; #ifdef FWHACK *realhost = FWhost; #endif a = ntohl(a); if (port < 0) port = 22; /* default ssh port */ /* * Open socket. */ s = socket(AF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAEAFNOSUPPORT: return "TCP/IP support not present"; default: return "socket(): unknown error"; } /* * Bind to local address. */ addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(0); if (bind (s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "bind(): unknown error"; } /* * Connect to remote address. */ addr.sin_addr.s_addr = htonl(a); addr.sin_port = htons((short)port); if (connect (s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAECONNREFUSED: return "Connection refused"; case WSAENETUNREACH: return "Network is unreachable"; case WSAEHOSTUNREACH: return "No route to host"; default: return "connect(): unknown error"; } #ifdef FWHACK send(s, "connect ", 8, 0); send(s, FWhost, strlen(FWhost), 0); { char buf[20]; sprintf(buf, " %d\n", FWport); send (s, buf, strlen(buf), 0); } #endif random_init(); if (!do_ssh_init()) return "Protocol initialisation error"; ssh_login(cfg.username, cmd); return NULL; } /* end */ Revision-number: 206 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:54.198470Z PROPS-END Revision-number: 207 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:54.205831Z PROPS-END Revision-number: 208 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 1999-09-01T22:12:12.000000Z K 7 svn:log V 38 Disable real network backends for now K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/Makefile.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: fdeb5cf2f4455570852beb950e0401a1 Text-delta-base-sha1: 47e13cd76eb953cf4e782803ade512c2d36ac470 Text-content-length: 80 Text-content-md5: 8b73b2ea0b3e1a1d5434e8d2e828fde9 Text-content-sha1: 081f8649553c9d461d9d04711e318b5ef3a9c8c9 Content-length: 124 K 15 cvs2svn:cvs-rev V 8 1.1.2.15 PROPS-END SVN+-42FRY# $Id: Makefile.mpw,v 1.1.2.15 1999/09/01 22:12:12## Revision-number: 209 Prop-content-length: 116 Content-length: 116 K 7 svn:log V 18 sunc with reality K 10 svn:author V 3 ben K 8 svn:date V 27 1999-09-01T22:12:48.000000Z PROPS-END Node-path: putty-ben-mac-port/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 73020479a24b6713cfe58e7fd3723bd1 Text-delta-base-sha1: e2b9933793284f5da7dc4cc134c32b5c09891b0a Text-content-length: 325 Text-content-md5: 6a351ddddd6146ddc8cfbbcee1161b05 Text-content-sha1: 572fd2c4c8a1c52a1680d37ac0dea1e3ef93c8fa Content-length: 368 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVNm9'-Z/r67$Id: README.mac,v 1.1.2.4 1999/09/01 22:12:48 [FIXED] [MAYBE FIXED] * Scrolling appears to be shafted on Original QuickDraw. * ResEdit 'TMPL' resource seems to be broken. * sshsha.c and sshmd5.c cause a stack overflow in Apple's PowerPC C compiler unless optimisation is entirely disabled Revision-number: 210 Prop-content-length: 148 Content-length: 148 K 10 svn:author V 3 ben K 8 svn:date V 27 1999-09-01T22:13:52.000000Z K 7 svn:log V 50 Don't bother with CFM checks on non-CFM machines. PROPS-END Node-path: putty-ben-mac-port/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 40118a47bcc8a5e48b3355db9a4cc98c Text-delta-base-sha1: db073bfad68f7892069a2de74e143fc4230865ea Text-content-length: 104 Text-content-md5: 0bc2d8268dc7ed80db6dbc6c8e5129a4 Text-content-sha1: 16a465ccc158c0b571e6af41f7abe37422def030 Content-length: 148 K 15 cvs2svn:cvs-rev V 8 1.1.2.27 PROPS-END SVN*CGf,)-PZ/* $Id: mac.c,v 1.1.2.27 1999/09/01 22:13:52#if TARGET_RT_MAC_CFM#endif Revision-number: 211 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 1999-09-01T22:16:15.000000Z K 7 svn:log V 31 Initial simple raw TCP backend K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 6d3aca5b3ce907be0c20b84549b3c65d Text-delta-base-sha1: 27bf130799bb532e9b586204b44806f455ab4fba Text-content-length: 94 Text-content-md5: e09bfa08dd749f1cdfc85ca638ebad70 Text-content-sha1: 937b9195acd033a8daed456248f1c89136346ae8 Content-length: 138 K 15 cvs2svn:cvs-rev V 8 1.1.2.18 PROPS-END SVNF==0=G./* $Id: mac_res.r,v 1.1.2.18 1999/09/01 22:16:157172.17.11.11 Node-path: putty-ben-mac-port/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: aa64fe27e11d5f1a371fa8fb3e728e27 Text-delta-base-sha1: 97e16dba0df5676f4d37a37cb22fd53d805a51d9 Text-content-length: 102 Text-content-md5: 4f1da52e11d921fd993053e6e2132701 Text-content-sha1: 71a81b69d288ba4c30b947e47f1951dc468b2246 Content-length: 146 K 15 cvs2svn:cvs-rev V 8 1.1.2.36 PROPS-END SVN)A 0!=7]/* $Id: macterm.c,v 1.1.2.36 1999/09/01 22:16:15rawtcp#if 0#endif Node-path: putty-ben-mac-port/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 1c38a6ccc957ce5af45331e7118849be Text-delta-base-sha1: 70cccf62af758454f29bdf7a623cb86a36bac1f0 Text-content-length: 1270 Text-content-md5: 85b3b939ce01efbcbb71ee1f01a87b19 Text-content-sha1: 3f61a8229407f3d6272015cbeb64abd10b651b40 Content-length: 1313 K 15 cvs2svn:cvs-rev V 7 1.1.2.8 PROPS-END SVN VQ50\bmT N?/* $Id: testback.c,v 1.1.2.8 1999/09/01 22:16:15static char *rawtcp_init(Session *); static int rawtcp_msg(Session *, SOCKET, Net_Event_TypeBackend rawtcp_backend = { rawtcp_init, rawtcp_msg, nullstruct rawtcp_private { SOCKET s; }; static char *rawtcp_init(Session *sess) { struct rawtcp_private *rp; sess->back_priv = smalloc(sizeof(struct rawtcp_private)); rp = (struct rawtcp_private *)sess->back_priv; rp->s = net_open(sess, sess->cfg.host, sess->cfg.port); if (rp->s == INVALID_SOCKET) fatalbox("Open failed"); } static int rawtcp_msg(Session *sess, SOCKET sock, Net_Event_Type ne) { struct rawtcp_private *rp = (struct rawtcp_private *)sess->back_priv; switch (ne) { case NE_NULL: break; case NE_OPEN: break; case NE_NOHOST: case NE_REFUSED: case NE_NOOPEN: rp->s = INVALID_SOCKET; fatalbox("Open failed"); break; case NE_DATA: break; case NE_URGENT: break; case NE_CLOSING: /* net_close(rp->s);*/ break; case NE_CLOSED: rp->s = INVALID_SOCKET; fatalbox("Connection closed"); break; case NE_TIMEOUT: case NE_ABORT: case NE_DIED: fatalbox("Connection died"); rp->s = INVALID_SOCKET; break; } } Revision-number: 212 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 1999-09-01T22:24:41.000000Z K 7 svn:log V 21 Various minor tweaks K 10 svn:author V 3 ben PROPS-END Node-path: putty-ben-mac-port/opentpt.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: c39b95ca48eb442e428b941a1fc49fc0 Text-delta-base-sha1: 0b5ab49aaad9f5022f943dae394e2d10b5272c3f Text-content-length: 499 Text-content-md5: 4e8ccc635817b3f2265a4b62e2141ee4 Text-content-sha1: 69fb6b758c2880ada83f738454efd5ddefe8316d Content-length: 542 K 15 cvs2svn:cvs-rev V 7 1.1.2.3 PROPS-END SVN=25 /:sP4_?5-d2AAX/* $Id: opentpt.c,v 1.1.2.3 1999/09/01 22:24:41#if TARGET_RT_MAC_CFM#endif Stuff below here is only needed if you actually have Open Transport. */ /* #pragma segment OpenTpt */ /* Last I looked, this only produced a 1.5k segment, which isn't worth it. */Set up a system-task-time event handler (scheduled by the notifier) */ s->eventhandler = OTCreateSystemTask(&otpt_rcvevent, (void *)s); if (s->eventhandler == 0) goto splat;yi Revision-number: 213 Prop-content-length: 106 Content-length: 106 K 7 svn:log V 9 typo fix K 10 svn:author V 3 ben K 8 svn:date V 27 1999-09-01T22:28:03.000000Z PROPS-END Node-path: putty-ben-mac-port/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 12d3ca14110a69a0598741d6fbeec073 Text-delta-base-sha1: f9ce1affabdf130c80762129b233df6279cb599e Text-content-length: 24 Text-content-md5: 747305c05ad2122852f885c7ebf54727 Text-content-sha1: 8070cdeae26bd5b74adba46d81eeda24cae3fa31 Content-length: 67 K 15 cvs2svn:cvs-rev V 7 1.7.2.2 PROPS-END SVN i Node-path: putty-ben-mac-port/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 46a218923552898f39d0982191a8a830 Text-delta-base-sha1: 4d57acf43ac249a4d5f3a983ac77eab42de7951f Text-content-length: 22 Text-content-md5: de0ad27457e5e3a0bdf6b1eee21f96f9 Text-content-sha1: bf849c18050ad09a99a983aea2df0001dd9a70ab Content-length: 65 K 15 cvs2svn:cvs-rev V 7 1.2.2.1 PROPS-END SVNVV ~W. Revision-number: 214 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:54.526795Z PROPS-END Revision-number: 215 Prop-content-length: 126 Content-length: 126 K 7 svn:log V 26 Oops, add scp to makefile K 10 svn:author V 5 simon K 8 svn:date V 27 1999-09-03T15:12:04.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bac9e909fff1ee4981d9fad8c17b66dd Text-delta-base-sha1: 888981e887fc694c1c415c3ee13e2053b1655bfe Text-content-length: 693 Text-content-md5: 34e05c0f23e523a0d91892313cac9ada Text-content-sha1: 88cb2f8c4ba316213deae6060ae8f98ceec7cd47 Content-length: 732 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN-I,F#+PdISCPOBJS = scp.obj windlg.obj misc.obj noise.obj SCPOBJS2 = scpssh.obj sshcrc.obj sshdes.obj sshmd5.obj SCPOBJS3 = sshrsa.obj sshrand.obj sshsha.obj sshblowf.obj version.obj all: putty.exe pscp.exepscp.exe: $(SCPOBJS) $(SCPOBJS2) $(SCPOBJS3) scp.res scp.rsp link /debug -out:pscp.exe @scp.rsp scp.rsp: makefile echo /nologo /subsystem:console > scp.rsp echo $(SCPOBJS) >> scp.rsp echo $(SCPOBJS2) >> scp.rsp echo $(SCPOBJS3) >> scp.rsp echo scp.res >> link.rsp echo $(LIBS1) >> link.rsp echo $(LIBS2) >> link.rsp scp.obj: scp.c putty.h scp.h scpssh.obj: scpssh.c putty.h ssh.h scp.h scp.res: scp.rc scp.ico rc -r -DWIN32 -D_WIN32 -DWINVER=0x0400 scp Revision-number: 216 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 1999-09-07T16:36:23.000000Z K 7 svn:log V 35 Disastrously silly Makefile errors K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 34e05c0f23e523a0d91892313cac9ada Text-delta-base-sha1: 88cb2f8c4ba316213deae6060ae8f98ceec7cd47 Text-content-length: 76 Text-content-md5: 14a954503099eb5aa8dbb55f4f4d4617 Text-content-sha1: c9e1098ca8a39a617fcc17d3b520a584703d9696 Content-length: 115 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNIF 7tUscp.rsp echo $(LIBS1) >> scp.rsp echo $(LIBS2) >> scp Revision-number: 217 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 36 Symbolic constants? What are they? K 10 svn:author V 3 ben K 8 svn:date V 27 1999-09-07T23:40:19.000000Z PROPS-END Node-path: putty-ben-mac-port/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 747305c05ad2122852f885c7ebf54727 Text-delta-base-sha1: 8070cdeae26bd5b74adba46d81eeda24cae3fa31 Text-content-length: 939 Text-content-md5: 072dc2701c4d3789220834145acc0595 Text-content-sha1: bee64c04e98515b4cc2d907c03cd365340fa10c6 Content-length: 982 K 15 cvs2svn:cvs-rev V 7 1.7.2.3 PROPS-END SVNs*t!vmT9\Q6d)>I? |+.@Hog @T :LNSSH_MSG_DEBUGSSH_SMSG_PUBLIC_KEYSSH_CMSG_SESSION_KEYSSH_SMSG_SUCCESSSSH_CMSG_USERSSH_SMSG_FAILURESSH_CMSG_AUTH_PASSWORD, 4+strlen(passwordSSH_SMSG_FAILURESSH_SMSG_SUCCESSSSH_CMSG_REQUEST_PTYSSH_SMSG_SUCCESS && sp->pktin.type != SSH_SMSG_FAILURE) { fatalbox("Protocol confusion"); } else if (sp->pktin.type == SSH_SMSG_FAILURE) { c_write("Server refused to allocate pty\r\n", 32); } } s_wrpkt_start(SSH_CMSG_EXEC_SHELLSSH_SMSG_STDOUT_DATA || sp->pktin.type == SSH_SMSG_STDERR_DATASSH_MSG_DISCONNECTSSH_SMSG_SUCCESS) { /* SSH_MSG_SUCCESS: may be from EXEC_SHELL on some servers */ } else if (sp->pktin.type == SSH_SMSG_FAILURESSH_SMSG_EXITSTATUS) { /* EXITSTATUS */ s_wrpkt_start(SSH_CMSG_EXIT_CONFIRMATIONSSH_CMSG_STDIN_DATASSH_CMSG_WINDOW_SIZE Node-path: putty-ben-mac-port/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: bde993964679114fe44daa648b5bdc85 Text-delta-base-sha1: 72ffba89f98a1eb96b56ead8a39625f7897ff66b Text-content-length: 1950 Text-content-md5: f72611a68a87046c3077b2c971585157 Text-content-sha1: 0c25195e94312efdeec8f19c39dc63a7006a5e8c Content-length: 1993 K 15 cvs2svn:cvs-rev V 7 1.3.2.1 PROPS-END SVN' h#include #define SSH_CIPHER_NONE 0 #define SSH_CIPHER_IDEA 1 #define SSH_CIPHER_DES 2 #define SSH_CIPHER_3DES 3 #define SSH_CIPHER_RC4 5 #define SSH_CIPHER_BLOWFISH 6 #define SSH_AUTH_RHOSTS 1 #define SSH_AUTH_RSA 2 #define SSH_AUTH_PASSWORD 3 #define SSH_AUTH_RHOSTS_RSA 4 #define SSH_PROTOFLAG_SCREEN_NUMBER 0x00000001 #define SSH_PROTOFLAG_HOST_IN_FWD_OPEN 0x00000002 #define SSH_MSG_NONE 0 #define SSH_MSG_DISCONNECT 1 #define SSH_SMSG_PUBLIC_KEY 2 #define SSH_CMSG_SESSION_KEY 3 #define SSH_CMSG_USER 4 #define SSH_CMSG_AUTH_RHOSTS 5 #define SSH_CMSG_AUTH_RSA 6 #define SSH_SMSG_RSA_CHALLENGE 7 #define SSH_CMSG_AUTH_RSA_RESPONSE 8 #define SSH_CMSG_AUTH_PASSWORD 9 #define SSH_CMSG_REQUEST_PTY 10 #define SSH_CMSG_WINDOW_SIZE 11 #define SSH_CMSG_EXEC_SHELL 12 #define SSH_CMSG_EXEC_CMD 13 #define SSH_SMSG_SUCCESS 14 #define SSH_SMSG_FAILURE 15 #define SSH_CMSG_STDIN_DATA 16 #define SSH_SMSG_STDOUT_DATA 17 #define SSH_SMSG_STDERR_DATA 18 #define SSH_CMSG_EOF 19 #define SSH_SMSG_EXITSTATUS 20 #define SSH_MSG_CHANNEL_OPEN_CONFIRMATION 21 #define SSH_MSG_CHANNEL_OPEN_FAILURE 22 #define SSH_MSG_CHANNEL_DATA 23 #define SSH_MSG_CHANNEL_CLOSE 24 #define SSH_MSG_CHANNEL_CLOSE_CONFIRMATION 25 /* 26 was unix-domain X11 forwarding */ #define SSH_SMSG_X11_OPEN 27 #define SSH_CMSG_PORT_FORWARD_REQUEST 28 #define SSH_MSG_PORT_OPEN 29 #define SSH_CMSG_AGENT_REQUEST_FORWARDING 30 #define SSH_SMSG_AGENT_OPEN 31 #define SSH_MSG_IGNORE 32 #define SSH_CMSG_EXIT_CONFIRMATION 33 #define SSH_CMSG_X11_REQUEST_FARWARDING 34 #define SSH_CMSG_AUTH_RHOSTS_RSA 35 #define SSH_MSG_DEBUG 36 #define SSH_CMSG_REQUEST_COMPRESSION 37 #define SSH_CMSG_MAX_PACKET_SIZE 38 #define SSH_CMSG_AUTH_TIS 39 #define SSH_SMSG_AUTH_TIS_CHALLENGE 40 #define SSH_CMSG_AUTH_TIS_RESPONSE 41 #define SSH_CMSG_AUTH_KERBEROS 42 #define SSH_SMSG_AUTH_KERBEROS_RESPONSE 43 #define SSH_CMSG_HAVE_KERBEROS_TGT 44 Revision-number: 218 Prop-content-length: 136 Content-length: 136 K 7 svn:log V 38 Removing one bug, and hunting another K 10 svn:author V 3 ben K 8 svn:date V 27 1999-09-07T23:41:32.000000Z PROPS-END Node-path: putty-ben-mac-port/opentpt.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 4e8ccc635817b3f2265a4b62e2141ee4 Text-delta-base-sha1: 69fb6b758c2880ada83f738454efd5ddefe8316d Text-content-length: 230 Text-content-md5: 5f6f16c8f87a86b74d7be77dd84871f5 Text-content-sha1: 1225f6ada9d5eb176dcb27dd88f82cd817e1d035 Content-length: 273 K 15 cvs2svn:cvs-rev V 7 1.1.2.4 PROPS-END SVN=)Am/k1{B/* $Id: opentpt.c,v 1.1.2.4 1999/09/07 23:41:32assert.h>assert(otpt_config != kOTInvalidConfigurationPtr); s = smalloc(sizeof(*s)); memset(s, 0, sizeof(*s)); s->sess = sessDebugger( Revision-number: 219 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 1999-09-10T15:35:26.000000Z K 7 svn:log V 39 We failed to ignore SSH_MSG_IGNORE :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/scpssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fe7b58b2273302a0097d95027b6bcca5 Text-delta-base-sha1: 7586e4d7548e66c93407ff7b7b2442452789b59c Text-content-length: 76 Text-content-md5: b5bbc8bf123fdf13be0ec5dc8483f4b7 Text-content-sha1: 339733125270da0e49491c9285bbac976827abfe Content-length: 115 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN;1LN;LoIGNORE 32 if (pktin.type == SSH_MSG_IGNORE) { Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d878688914ff016eaab04be5e693a2be Text-delta-base-sha1: 4d1c263ab80ad99852171a293203fb8b38f72038 Text-content-length: 92 Text-content-md5: 88662d6af8544f3dd68f896aab116729 Text-content-sha1: ef79ed4e19d092c042b3eeb06bd346e543aff425 Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNY% D{Dfs if (pktin.type == 32) { /* SSH_MSG_IGNORE */ /* do nothing */; Revision-number: 220 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:54.772888Z PROPS-END Revision-number: 221 Prop-content-length: 153 Content-length: 153 K 10 svn:author V 4 owen K 8 svn:date V 27 1999-09-20T15:58:50.000000Z K 7 svn:log V 54 Changed default title bar format to host.name - PuTTY PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e812861733dc85fea923b6380764a395 Text-delta-base-sha1: 9300543d711144433a9a58170e79a0ebe63121fa Text-content-length: 34 Text-content-md5: ad6cafaa0d6a0918431a95eeeec534de Text-content-sha1: 7dcea9b5b185ac2248e97f8b1b94c5ae41419d03 Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNde N%s - PuTTY Revision-number: 222 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:54.817491Z PROPS-END Revision-number: 223 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:54.825398Z PROPS-END Revision-number: 224 Prop-content-length: 196 Content-length: 196 K 10 svn:author V 4 owen K 8 svn:date V 27 1999-09-23T14:30:19.000000Z K 7 svn:log V 97 Added accelerators for most of main dialogue box. Still can't get focus into list boxes though. PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dba18bf45fb8cc29dcee23fcb00d2d79 Text-delta-base-sha1: e2a22c67d5b62c6a8c88e31a92feebb488a68d4f Text-content-length: 1760 Text-content-md5: f410a6d29185c272faa07a18b8d24ae4 Text-content-sha1: 8d1d0c718478e02870c52acaa07c2829428f3ba5 Content-length: 1799 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN"Y\wLi&3Lw#@/ SadfJia&J^pNdkYOJ]pSt^`n*Nxc]xGeuzt/noH v}eemn7h7|dHd,LNT&Name", IDC0_HOSTSTATIC, 3, 3, 122, 8 EDITTEXT IDC0_HOST, 3, 11, 122, 12, ES_AUTOHSCROLL LTEXT "&&Telnet", IDC0_PROTTELNET, 86, 29, 33, 10, WS_GROUP AUTORADIOBUTTON "SS&&Telnet", IDC0_PROTTELNET, 96, 29, 33, 10, WS_GROUP AUTORADIOBUTTON "SS&H", IDC0_PROTSSH, 132, 29, 33, 10 #endif LTEXT "Sto&&Load", IDC0_SESSLOAD, 131, 63, 34, 14 PUSHBUTTON "&Save", IDC0_SESSSAVE, 131, 80, 34, 14 PUSHBUTTON "&Delete", IDC0_SESSDEL, 131, 97, 34, 14 AUTOCHECKBOX "Close &&H (ASCII 8)", IDC1_DEL008, 3, 12, 162, 10, WS_GROUP AUTORADIOBUTTON "Control-&&&&&&&&&&wrap mode initially on", IDC2_WRAPMODE, 3, 3, 162, 10 AUTOCHECKBOX "&&icon title", IDC2_WINNAME, 3, 23, 162, 10 AUTOCHECKBOX "Implicit CR in every &&Rows", IDC2_ROWSSTATIC, 10, 59, 32, 8 EDITTEXT IDC2_ROWSEDIT, 50, 57, 30, 12 RTEXT "&&&&XWindows encoding", IDC2_VTXWINDOWS, 3, 120, 162, 10, WS_GROUP AUTORADIOBUTTON "Use font in &&EM mode only", IDC2_VTOEMONLY, 3, 140, 162, 10 AUTORADIOBUTTON "&&&&&&&dd", IDC3_ENVADD, 131, 85, 34, 14 PUSHBUTTON "&&BSD", IDC3_EMBSD, 96, 147, 33, 10, WS_GROUP AUTORADIOBUTTON "R&FC", IDC3_EMRFC, 132, 147, 33, 10 END IDD_PANEL35&AUTOCHECKBOX "Don't allocate a &pseudo-terminal", IDC3_NOPTY, 3, 19, 162, 10 LTEXT "Auto-login &Cipher:", IDC3_CIPHERSTATIC, 3, 50, 40, 8 AUTORADIOBUTTON "&3DES", IDC3_CIPHER3DES, 46, 50, 35, 10, WS_GROUP AUTORADIOBUTTON "&&&&Set", IDC4_CCSET, 33, 145, 34, 14 LTEXT "&&&logical palettes", IDC5_PALETTE, 3, 25, 162, 10 LTEXT "C&& Revision-number: 225 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 1999-09-24T10:24:45.000000Z K 7 svn:log V 43 Add WS_TABSTOP on configuration list boxes K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f410a6d29185c272faa07a18b8d24ae4 Text-delta-base-sha1: 8d1d0c718478e02870c52acaa07c2829428f3ba5 Text-content-length: 180 Text-content-md5: e75ea5aeecb4d107ff434f277c733e18 Text-content-sha1: 9426e235f252d6fe2018992f5c607e0ee288176a Content-length: 219 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNY 5QCh;oj LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP | WS_TABSTOP LBS_MULTIPLESEL | WS_TABSTOP LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP Revision-number: 226 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.334666Z PROPS-END Revision-number: 227 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.346508Z PROPS-END Revision-number: 228 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.352991Z PROPS-END Revision-number: 229 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.360037Z PROPS-END Revision-number: 230 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.366888Z PROPS-END Revision-number: 231 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.373640Z PROPS-END Revision-number: 232 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 1999-10-04T14:20:17.000000Z K 7 svn:log V 72 Stop IAC IAC from being swallowed in telnet (fix due to Robert de Bath) K 10 svn:author V 5 simon PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 54f1d3a2f8bbe6971322436fd8471c5c Text-delta-base-sha1: 461f1a4d0453a0716a8742cc833081ab65870b3f Text-content-length: 130 Text-content-md5: 5265ea47befdd706749f880ffc650a36 Text-content-sha1: f410062f66a2d2dcfd83081928183d4a17e8cec9 Content-length: 169 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNU jCj[z{ /* ignore (and print) everything else */ b[0] = c; c_write(b,1); telnet_state = TOPLEVEL; } Revision-number: 233 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.789960Z PROPS-END Revision-number: 234 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.799154Z PROPS-END Revision-number: 235 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.807575Z PROPS-END Revision-number: 236 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.814125Z PROPS-END Revision-number: 237 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.822114Z PROPS-END Revision-number: 238 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.829012Z PROPS-END Revision-number: 239 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.834959Z PROPS-END Revision-number: 240 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.842354Z PROPS-END Revision-number: 241 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.850445Z PROPS-END Revision-number: 242 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.856627Z PROPS-END Revision-number: 243 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.863173Z PROPS-END Revision-number: 244 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.871793Z PROPS-END Revision-number: 245 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.882383Z PROPS-END Revision-number: 246 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:55.892952Z PROPS-END Revision-number: 247 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 70 Silly error in loading Default Settings - reset port but not protocol K 10 svn:author V 5 simon K 8 svn:date V 27 1999-10-22T15:47:26.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 556de6b4a720baa06c734e748e814f3f Text-delta-base-sha1: 9d45126abb54db4befc28f6adbc2e8927fb7224d Text-content-length: 46 Text-content-md5: f984436c333c1f9f9fc191dd6c3ec63a Text-content-sha1: 368b0e7e1c02d0cb25d47fad7ec7984c3a81644b Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN#@ n= IDM_SAVED_MIN && wParam <= IDM_SAVED_MAX) { SendMessage(hwnd, WM_SYSCOMMAND, IDM_SAVEDSESS, wParam); } Revision-number: 264 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 1999-10-28T16:25:15.000000Z K 7 svn:log V 26 Added a couple of GLOBALs K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ab7bb643e5a6dfceb3f83da6ce0f7f0 Text-delta-base-sha1: 0b6b9d8df803d623e8c48bb0879031dc7b210cae Text-content-length: 50 Text-content-md5: 89012f460c0ac1cc88b1ffa032739d0a Text-content-sha1: 90d4235a6f8e14fbcbc4c8dd24b8af76b0fadec5 Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN A4PGLOBAL int nsessions; GLOBAL Revision-number: 265 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 Stop putting meaning in bottom four bits of WM_SYSCOMMAND wParam K 10 svn:author V 5 simon K 8 svn:date V 27 1999-10-28T16:29:06.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ae85cab1269f27df1c0ccb36bc2121a4 Text-delta-base-sha1: 0953b559f60a434766006b5aa62f5c1063ba48c5 Text-content-length: 887 Text-content-md5: a74c4fbcc2a843c19b6a5c3f0f4f5498 Text-content-sha1: 88a40aab5205b7c2c3eee1d31b4ddad10e0835d0 Content-length: 927 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN4:"GhS*Zc#Vf50x0010 #define IDM_NEWSESS 0x0020 #define IDM_DUPSESS 0x0030 #define IDM_RECONF 0x0040 #define IDM_CLRSB 0x0050 #define IDM_RESET 0x0060 #define IDM_TEL_AYT 0x0070 #define IDM_TEL_BRK 0x0080 #define IDM_TEL_SYNCH 0x0090 #define IDM_TEL_EC 0x00a0 #define IDM_TEL_EL 0x00b0 #define IDM_TEL_GA 0x00c0 #define IDM_TEL_NOP 0x00d0 #define IDM_TEL_ABORT 0x00e0 #define IDM_TEL_AO 0x00f0 #define IDM_TEL_IP 0x0100 #define IDM_TEL_SUSP 0x0110 #define IDM_TEL_EOR 0x0120 #define IDM_TEL_EOF 0x0130 #define IDM_ABOUT 0x0140 #define IDM_SAVEDSESS 0x0150 #define IDM_SAVED_MIN 0x1000 #define IDM_SAVED_MAX 0x2000 case WM_SYSCOMMAND: switch (wParam & ~0xF) { /* low 4 bits reserved to Windows */ sprintf(c, "putty @%s", sessions[(lParam - IDM_SAVED_MIN) / 16]); cl = c; } else Revision-number: 266 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 Mark Baker's raw-TCP back end (untested and experimental as yet) K 10 svn:author V 5 simon K 8 svn:date V 27 1999-11-01T16:40:40.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 14a954503099eb5aa8dbb55f4f4d4617 Text-delta-base-sha1: c9e1098ca8a39a617fcc17d3b520a584703d9696 Text-content-length: 43 Text-content-md5: 908db92edee3e07e84900d12f97fa5e9 Text-content-sha1: 19ac0252143b7a8a1c7a758bb455065ebb420c01 Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNFe05,pV rawraw.obj: raw Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 89012f460c0ac1cc88b1ffa032739d0a Text-delta-base-sha1: 90d4235a6f8e14fbcbc4c8dd24b8af76b0fadec5 Text-content-length: 62 Text-content-md5: 5c890bed2b0839e45f81cfefd206614c Text-content-sha1: 879b6afba385415d07c1ec07222eaa6036c487ea Content-length: 102 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNQ#W(Q/cRAW,raw.c. */ Backend raw_backend Node-path: putty/raw.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5397 Text-content-md5: 2c67eb32178a7900056475330e7ef5d0 Text-content-sha1: 3620309a0bcd6e765fedc5d9df4d02062939c296 Content-length: 5513 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN#include #include #include #include #include "putty.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif static SOCKET s = INVALID_SOCKET; #define iswritable(x) ( (x) != IAC && (x) != CR ) static void raw_size(void); static int sb_opt, sb_len; static char *sb_buf = NULL; static int sb_size = 0; #define SB_DELTA 1024 static void try_write (void) { while (outbuf_head != outbuf_reap) { int end = (outbuf_reap < outbuf_head ? outbuf_head : OUTBUF_SIZE); int len = end - outbuf_reap; int ret; ret = send (s, outbuf+outbuf_reap, len, 0); if (ret > 0) outbuf_reap = (outbuf_reap + ret) & OUTBUF_MASK; if (ret < len) return; } } static void s_write (void *buf, int len) { unsigned char *p = buf; while (len--) { int new_head = (outbuf_head + 1) & OUTBUF_MASK; if (new_head != outbuf_reap) { outbuf[outbuf_head] = *p++; outbuf_head = new_head; } } try_write(); } static void c_write (char *buf, int len) { while (len--) { int new_head = (inbuf_head + 1) & INBUF_MASK; int c = (unsigned char) *buf; if (new_head != inbuf_reap) { inbuf[inbuf_head] = *buf++; inbuf_head = new_head; } } } /* * Called to set up the raw connection. Will arrange for * WM_NETEVENT messages to be passed to the specified window, whose * window procedure should then call raw_msg(). * * Returns an error message, or NULL on success. * * Also places the canonical host name into `realhost'. */ static char *raw_init (HWND hwnd, char *host, int port, char **realhost) { SOCKADDR_IN addr; struct hostent *h; unsigned long a; /* * Try to find host. */ if ( (a = inet_addr(host)) == (unsigned long) INADDR_NONE) { if ( (h = gethostbyname(host)) == NULL) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAHOST_NOT_FOUND: case WSANO_DATA: return "Host does not exist"; case WSATRY_AGAIN: return "Host not found"; default: return "gethostbyname: unknown error"; } memcpy (&a, h->h_addr, sizeof(a)); *realhost = h->h_name; } else *realhost = host; a = ntohl(a); if (port < 0) port = 23; /* default telnet port */ /* * Open socket. */ s = socket(AF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAEAFNOSUPPORT: return "TCP/IP support not present"; default: return "socket(): unknown error"; } /* * Bind to local address. */ addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(0); if (bind (s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "bind(): unknown error"; } /* * Connect to remote address. */ addr.sin_addr.s_addr = htonl(a); addr.sin_port = htons((short)port); if (connect (s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; case WSAECONNREFUSED: return "Connection refused"; case WSAENETUNREACH: return "Network is unreachable"; case WSAEHOSTUNREACH: return "No route to host"; default: return "connect(): unknown error"; } if (WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ | FD_WRITE | FD_OOB | FD_CLOSE) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "WSAAsyncSelect(): unknown error"; } return NULL; } /* * Process a WM_NETEVENT message. Will return 0 if the connection * has closed, or <0 for a socket error. */ static int raw_msg (WPARAM wParam, LPARAM lParam) { int ret; char buf[256]; if (s == INVALID_SOCKET) /* how the hell did we get here?! */ return -5000; if (WSAGETSELECTERROR(lParam) != 0) return -WSAGETSELECTERROR(lParam); switch (WSAGETSELECTEVENT(lParam)) { case FD_READ: ret = recv(s, buf, sizeof(buf), 0); if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK) return 1; if (ret < 0) /* any _other_ error */ return -10000-WSAGetLastError(); if (ret == 0) { s = INVALID_SOCKET; return 0; /* can't happen, in theory */ } c_write( buf, ret ); return 1; case FD_OOB: do { ret = recv(s, buf, sizeof(buf), 0); c_write( buf, ret ); } while (ret > 0); do { ret = recv(s, buf, 1, MSG_OOB); } while (ret > 0); if (ret < 0 && WSAGetLastError() != WSAEWOULDBLOCK) return -30000-WSAGetLastError(); return 1; case FD_WRITE: if (outbuf_head != outbuf_reap) try_write(); return 1; case FD_CLOSE: s = INVALID_SOCKET; return 0; } return 1; /* shouldn't happen, but WTF */ } /* * Called to send data down the raw connection. */ static void raw_send (char *buf, int len) { if (s == INVALID_SOCKET) return; s_write( buf, len ); } /* * Called to set the size of the window */ static void raw_size(void) { /* Do nothing! */ return; } /* * Send raw special codes. */ static void raw_special (Telnet_Special code) { /* Do nothing! */ return; } Backend raw_backend = { raw_init, raw_msg, raw_send, raw_size, raw_special }; Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ce499b532bcd6f1fcf306c4fe3495115 Text-delta-base-sha1: a6dfcc0e02e5ea32e00dc3dd3316f3846dc74640 Text-content-length: 296 Text-content-md5: e3b79bd4ff775006f2f4789e01b14fdf Text-content-sha1: 2f062a2e77a1bea123950509d9b65afff804d371 Content-length: 335 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN = 9t,RAW 1006 #define IDC0_PROTTELNET 1007 #define IDC0_PROTSSH 1008 #define IDC0_SESSSTATIC 1009 #define IDC0_SESSEDIT 1010 #define IDC0_SESSLIST 1011 #define IDC0_SESSLOAD 1012 #define IDC0_SESSSAVE 1013 #define IDC0_SESSDEL 1014 #define IDC0_CLOSEEXIT 1015 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a38e7aaf54ea415113ec2801a6f3f333 Text-delta-base-sha1: 9bb721269035c4fdafffb3790619aa9b156c8bdc Text-content-length: 301 Text-content-md5: e2ea02c6455af99d1be6189876976a7c Text-content-sha1: 224342fbc314fc7c95236b67ddcb3ea96779de1b Content-length: 341 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNYK@uQ42, 8 AUTORADIOBUTTON "R&aw", IDC0_PROTRAW, 51, 29, 33, 10, WS_GROUP AUTORADIOBUTTON "&Telnet", IDC0_PROTTELNET, 86, 29, 33, 1052, 8 AUTORADIOBUTTON "R&aw", IDC0_PROTRAW, 61, 29, 33, 10, WS_GROUP AUTORADIOBUTTON "&Telnet", IDC0_PROTTELNET, 96, 29, 33, 10 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: abbf03a550872a4cfae920870dfc807d Text-delta-base-sha1: 436a1d937c128a4a2aaad155387863deff92933d Text-content-length: 606 Text-content-md5: 437cec8f2c345749ed3e96d374aec11d Text-content-sha1: 46c9202f121192e179d35604553e5df958174dbd Content-length: 646 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNYt."j[r:CNOP='LIip cfg.protocol == PROT_TELNET ? "telnet" : "raw" if (!strcmp(prot, "raw")) cfg.protocol = PROT_RAWRAW, IDC0_PROTSSH, cfg.protocol==PROT_SSH ? IDC0_PROTSSH : cfg.protocol==PROT_TELNET ? IDC0_PROTTELNET : IDC0_PROTRAW case IDC0_PROTRAW { int i = IsDlgButtonChecked (hwnd, IDC0_PROTSSH); int j = IsDlgButtonChecked (hwnd, IDC0_PROTTELNET); cfg.protocol = i ? PROT_SSH : j ? PROT_TELNET : PROT_RAW RAW, IDC0_PROTSSH, (cfg.protocol==PROT_SSH ? IDC0_PROTSSH : cfg.protocol==PROT_TELNET ? IDC0_PROTTELNET : IDC0_PROTRAW Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a74c4fbcc2a843c19b6a5c3f0f4f5498 Text-delta-base-sha1: 88a40aab5205b7c2c3eee1d31b4ddad10e0835d0 Text-content-length: 90 Text-content-md5: 4540a8962fd8edf715ee28afff813fc1 Text-content-sha1: 0929dc6b6a835e3c28dacc0771f79d6eb87361da Content-length: 130 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN:l AnA=} cfg.protocol == PROT_TELNET ? &telnet_backend : &raw_backend Revision-number: 267 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 1999-11-01T17:18:08.000000Z K 7 svn:log V 55 Fix potential buffer overrun in new saved-session menu K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4540a8962fd8edf715ee28afff813fc1 Text-delta-base-sha1: 0929dc6b6a835e3c28dacc0771f79d6eb87361da Text-content-length: 341 Text-content-md5: 067902b6fa5a901d4aae4811c7bb7caf Text-content-sha1: cbc47ceb4f9c5a00d715409046c2741ba908cd67 Content-length: 381 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNlI*qm~s^Mint freecl = FALSEchar *session = sessions[(lParam - IDM_SAVED_MIN) / 16]; cl = malloc(16 + strlen(session)); /* 8, but play safe */ if (!cl) cl = NULL; /* not a very important failure mode */ sprintf(cl, "putty @%s", session); freecl = TRUE if (freecl) free(cl Revision-number: 268 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:56.715973Z PROPS-END Revision-number: 269 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 1999-11-03T14:08:26.000000Z K 7 svn:log V 45 John Sullivan's sizetip patch - experimental K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5c890bed2b0839e45f81cfefd206614c Text-delta-base-sha1: 879b6afba385415d07c1ec07222eaa6036c487ea Text-content-length: 49 Text-content-md5: 5c8cbe7583a25786fcee8e87477ab779 Text-content-sha1: c12b89d0601921e503e19d404b4d15ad3e2d14c5 Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNQo jihGLOBAL HINSTANCE putty_inst; Node-path: putty/sizetip.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4375 Text-content-md5: 280f9d3fc58417a63127eadfcf6dbceb Text-content-sha1: 627ed4b3a335e6b24fbb5c961f861b3ca46aa113 Content-length: 4491 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  #include #include #include #include #include "putty.h" ATOM tip_class = 0; HFONT tip_font; COLORREF tip_bg; COLORREF tip_text; LRESULT CALLBACK SizeTipWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { switch (nMsg) { case WM_ERASEBKGND: return TRUE; case WM_PAINT: { HBRUSH hbr; HGDIOBJ holdbr; RECT cr; int wtlen; LPTSTR wt; HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); SelectObject(hdc, tip_font); SelectObject(hdc, GetStockObject(BLACK_PEN)); hbr = CreateSolidBrush(tip_bg); holdbr = SelectObject(hdc, hbr); GetClientRect(hWnd, &cr); Rectangle(hdc, cr.left, cr.top, cr.right, cr.bottom); wtlen = GetWindowTextLength(hWnd); wt = (LPTSTR)malloc((wtlen+1)*sizeof(TCHAR)); GetWindowText(hWnd, wt, wtlen+1); SetTextColor(hdc, tip_text); SetBkColor(hdc, tip_bg); TextOut(hdc, cr.left+3, cr.top+3, wt, wtlen); free(wt); SelectObject(hdc, holdbr); DeleteObject(hbr); EndPaint(hWnd, &ps); } return 0; case WM_NCHITTEST: return HTTRANSPARENT; case WM_DESTROY: DeleteObject(tip_font); tip_font = NULL; break; case WM_SETTEXT: { LPCTSTR str = (LPCTSTR)lParam; SIZE sz; HDC hdc = CreateCompatibleDC(NULL); SelectObject(hdc, tip_font); GetTextExtentPoint32(hdc, str, _tcslen(str), &sz); SetWindowPos(hWnd, NULL, 0, 0, sz.cx+6, sz.cy+6, SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE); InvalidateRect(hWnd, NULL, FALSE); DeleteDC(hdc); } break; } return DefWindowProc(hWnd, nMsg, wParam, lParam); } HWND tip_wnd = NULL; int tip_enabled = 0; void UpdateSizeTip(HWND src, int cx, int cy) { TCHAR str[16]; if (!tip_enabled) return; if (!tip_wnd) { NONCLIENTMETRICS nci; // First make sure the window class is registered if (!tip_class) { WNDCLASS wc; wc.style = CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = SizeTipWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = putty_inst; wc.hIcon = NULL; wc.hCursor = NULL; wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = "SizeTipClass"; tip_class = RegisterClass(&wc); } // // Default values based on Windows Standard color scheme // // tip_font = GetStockObject(SYSTEM_FONT); // tip_bg = RGB(255, 255, 225); // tip_text = RGB(0, 0, 0); // Prepare other GDI objects and drawing info tip_bg = GetSysColor(COLOR_INFOBK); tip_text = GetSysColor(COLOR_INFOTEXT); memset(&nci, 0, sizeof(NONCLIENTMETRICS)); nci.cbSize = sizeof(NONCLIENTMETRICS); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &nci, 0); tip_font = CreateFontIndirect(&nci.lfStatusFont); } // Generate the tip text _sntprintf(str, 16, "%dx%d", cx, cy); if (!tip_wnd) { HDC hdc; SIZE sz; RECT wr; int ix, iy; // calculate the tip's size hdc = CreateCompatibleDC(NULL); GetTextExtentPoint32(hdc, str, _tcslen(str), &sz); DeleteDC(hdc); GetWindowRect(src, &wr); ix = wr.left; if (ix<16) ix = 16; iy = wr.top - sz.cy; if (iy<16) iy = 16; // Create the tip window tip_wnd = CreateWindowEx(WS_EX_TOOLWINDOW|WS_EX_TOPMOST, MAKEINTRESOURCE(tip_class), str, WS_POPUP, ix, iy, sz.cx, sz.cy, NULL, NULL, putty_inst, NULL); ShowWindow(tip_wnd, SW_SHOWNOACTIVATE); } else { // Tip already exists, just set the text SetWindowText(tip_wnd, str); } } void EnableSizeTip(int bEnable) { if (tip_wnd && !bEnable) { DestroyWindow(tip_wnd); tip_wnd = NULL; } tip_enabled = bEnable; } Node-path: putty/sizetip.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 94 Text-content-md5: ef0d19ec4c8bc93a20db83ea5f2526a4 Text-content-sha1: 151f7ec6d242932febdd3d42695407fa899e779f Content-length: 210 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSSS void UpdateSizeTip(HWND src, int cx, int cy); void EnableSizeTip(int bEnable); Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 067902b6fa5a901d4aae4811c7bb7caf Text-delta-base-sha1: cbc47ceb4f9c5a00d715409046c2741ba908cd67 Text-content-length: 239 Text-content-md5: 4b1fce218748146eeec4f99f7e98d872 Text-content-sha1: 4dcc665dbca7239901e12f320d178f13d9d43555 Content-length: 279 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNI,!@QCM ~J|D#include "sizetipputty_inst = insENTERSIZEMOVE: EnableSizeTip(1); break; case WM_EXITSIZEMOVE: EnableSizeTip(0); UpdateSizeTip(hwnd, w, h) Revision-number: 270 Prop-content-length: 137 Content-length: 137 K 10 svn:author V 5 simon K 8 svn:date V 27 1999-11-04T09:18:46.000000Z K 7 svn:log V 37 Add sizetip stuff to makefile - oops PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 908db92edee3e07e84900d12f97fa5e9 Text-delta-base-sha1: 19ac0252143b7a8a1c7a758bb455065ebb420c01 Text-content-length: 70 Text-content-md5: a349aea785ba8e8b4b1763b5e502a64d Text-content-sha1: 8a7ba0734203df8d16822006d20cd40d9ef110a1 Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNe&G6GQ{$A sizetip.c sizetipsizetip.obj: sizetip Revision-number: 271 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 1999-11-04T11:26:07.000000Z K 7 svn:log V 67 Can now build with /DWIN32S_COMPAT to work (minimally) with Win32s K 10 svn:author V 4 owen PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a349aea785ba8e8b4b1763b5e502a64d Text-delta-base-sha1: 8a7ba0734203df8d16822006d20cd40d9ef110a1 Text-content-length: 200 Text-content-md5: e8de60066b6fefefdb8569aca37a4dda Text-content-sha1: 9bf1d6b91bb24d1947d67ee00e86b6d255865dbd Content-length: 240 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNy*'wYGQ# COMPAT=/DWIN32S_COMPAT will produce a binary that works (minimally) # with Win32s CFLAGS = /nologo /W3 /YX /O2 /Yd /D_WINDOWS /DDEBUG /ML /Fd .c.obj: cl $(COMPAT)obj Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6c25c435d1caaef69c55d3fec5c1fdb6 Text-delta-base-sha1: 4b0b13f8bc9c246ae50995a60a5002526f00f346 Text-content-length: 124 Text-content-md5: 9fba2931b8b8f8268f74c6bc2fc4ba79 Text-content-sha1: 71ed2298a1859968d2bf67d1eb4ec80cf2de290c Content-length: 163 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNc ff Z#ifndef WIN32S_COMPAT if (GetSystemPowerStatus(&pwrstat)) func(&pwrstat, sizeof(pwrstat)); #endif Revision-number: 272 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 1999-11-04T13:44:21.000000Z K 7 svn:log V 42 Prompt before summarily closing a session K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b1fce218748146eeec4f99f7e98d872 Text-delta-base-sha1: 4dcc665dbca7239901e12f320d178f13d9d43555 Text-content-length: 235 Text-content-md5: e7747267ffb003e92127b2f65c3ccc04 Text-content-sha1: 99f34420ec5ef5312350b44b6ed958991ba207f8 Content-length: 275 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN,~IqD%a CLOSE: if (MessageBox(hwnd, "Are you sure you want to close this session?", "PuTTY Exit Confirmation", MB_ICONWARNING | MB_OKCANCEL) == IDOK) DestroyWindow(hwnd); return 0CLOSE Revision-number: 273 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 1999-11-05T09:50:49.000000Z K 7 svn:log V 38 Warn-on-close is now configurable off K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5c8cbe7583a25786fcee8e87477ab779 Text-delta-base-sha1: c12b89d0601921e503e19d404b4d15ad3e2d14c5 Text-content-length: 38 Text-content-md5: c62cebd3224737965bbc02ca7eeea8db Text-content-sha1: 44fb49241acc1eb5b34a838239a6e3a4dd95e74e Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNo 7>1int warn_on_close Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e3b79bd4ff775006f2f4789e01b14fdf Text-delta-base-sha1: 2f062a2e77a1bea123950509d9b65afff804d371 Text-content-length: 49 Text-content-md5: b535db40229d569eaa6e17f8000064a6 Text-content-sha1: 4481c303206968ca6f40ecac6ec028b8d9ca7c06 Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN=Z JtI#define IDC0_CLOSEWARN 1016 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e2ea02c6455af99d1be6189876976a7c Text-delta-base-sha1: 224342fbc314fc7c95236b67ddcb3ea96779de1b Text-content-length: 139 Text-content-md5: 30fe29e04f36649759abb566dff80465 Text-content-sha1: ba25040ab90d68ec65ef44858e38c14d3f82b84c Content-length: 179 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNK !_[z]:Y,Yr?J&R&Rr&91, 10 AUTOCHECKBOX "Warn on C&lose", IDC0_CLOSEWARN, 96, 147, 69, 10 END IDD_PANEL1 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 437cec8f2c345749ed3e96d374aec11d Text-delta-base-sha1: 46c9202f121192e179d35604553e5df958174dbd Text-content-length: 334 Text-content-md5: 2956ee2081a23b4e72785c14584b5eb7 Text-content-sha1: 81d05a22880d3fd119c7227f22b0039dfb988744 Content-length: 374 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNt,f?\:"P @a4K)i (sesskey, "WarnOnClose", !!cfg.warn_on_closei (sesskey, "WarnOnClose", 1, &cfg.warn_on_closeCheckDlgButton (hwnd, IDC0_CLOSEWARN, cfg.warn_on_closeCLOSEWARN cfg.warn_on_close = IsDlgButtonChecked (hwnd, IDC0_CLOSEWARNCheckDlgButton (hwnd, IDC0_CLOSEWARN, cfg.warn_on_close Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e7747267ffb003e92127b2f65c3ccc04 Text-delta-base-sha1: 99f34420ec5ef5312350b44b6ed958991ba207f8 Text-content-length: 51 Text-content-md5: 3e0ea2c3e1d94b15ba927626aca58971 Text-content-sha1: bca40c570c217eda4ad63dd11db0d42116ed0ce2 Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN~ }}!cfg.warn_on_close || Revision-number: 274 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:57.102565Z PROPS-END Revision-number: 275 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:57.108800Z PROPS-END Revision-number: 276 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:57.115256Z PROPS-END Revision-number: 277 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 1999-11-08T11:08:09.000000Z K 7 svn:log V 43 Oleg Panashchenko's Cyrillic support patch K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e8de60066b6fefefdb8569aca37a4dda Text-delta-base-sha1: 9bf1d6b91bb24d1947d67ee00e86b6d255865dbd Text-content-length: 46 Text-content-md5: 4cf0e9ae89cce0afe25e4b8d955fe4bc Text-content-sha1: 4a971b94bac5a1ad2ca415ea0bf4f1b8ecfd0c0f Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNyp xlatxlat.obj: xlat Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c62cebd3224737965bbc02ca7eeea8db Text-delta-base-sha1: 44fb49241acc1eb5b34a838239a6e3a4dd95e74e Text-content-length: 302 Text-content-md5: 1a0e8642d6d2f1966c4e49d272c50fd2 Text-content-sha1: aa40863234c64f82eeb120c1ed6c24f1191def2f Content-length: 342 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN! HIAZ;!L:int fontcharse /* russian language translation */ int xlat_enablekoiwin; int xlat_capslockcyrExports from xlat.c. */ unsigned char xlat_kbd2tty(unsigned char c); unsigned char xlat_tty2scr(unsigned char c); unsigned char xlat_latkbd2win(unsigned char c) Node-path: putty/sizetip.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ef0d19ec4c8bc93a20db83ea5f2526a4 Text-delta-base-sha1: 151f7ec6d242932febdd3d42695407fa899e779f Text-content-length: 90 Text-content-md5: 77a5fb3afbe56fd4a04f6de4f1d26c3a Text-content-sha1: b740527fa208d49f0827810bfc13a3b6f07c9579 Content-length: 129 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNSOOOvoid UpdateSizeTip(HWND src, int cx, int cy); void EnableSizeTip(int bEnable); Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1ad59138ce03da81c8cc34863ed2ea33 Text-delta-base-sha1: c2b9f3cfe50aee9f0381f1b00bff364e28b01315 Text-content-length: 211 Text-content-md5: b0484e8beba9923abad13c1010a1296d Text-content-sha1: 8f22350f3195bebe9dbe6d8cd8f5d820c856efdf Content-length: 250 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN[e0qPtgxlat_tty2scr((unsigned char)c) | curr_attr | { int i; unsigned char c; for(i=0;isend(&c,1); } } Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b535db40229d569eaa6e17f8000064a6 Text-delta-base-sha1: 4481c303206968ca6f40ecac6ec028b8d9ca7c06 Text-content-length: 122 Text-content-md5: 72436dda6452fa3006bf5fd74b814d14 Text-content-sha1: a47eb1e0a148f0e27dfc222c16bd9e736ebc79f7 Content-length: 161 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNZD cC6SPANEL6 114define IDC6_ENABLEKOIWINXLAT 1001 #define IDC6_CAPSLOCKCYR 1002 #endif Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 30fe29e04f36649759abb566dff80465 Text-delta-base-sha1: ba25040ab90d68ec65ef44858e38c14d3f82b84c Text-content-length: 321 Text-content-md5: c197e9dfc3df9fa624d38a53669f1d20 Text-content-sha1: f6f8e0ea13e5b9bb5ee57e7d40a63611d333f98e Content-length: 361 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN @ )q)&gPANEL6 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE FONT 8, "MS Sans Serif" BEGIN AUTOCHECKBOX "Enable &KOI8-Win1251 translation", IDC6_ENABLEKOIWINXLAT, 13, 14, 135, 10 AUTOCHECKBOX "&CAPS LOCK acts as cyrillic switch", IDC6_CAPSLOCKCYR, 13, 30, 136, 10 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2956ee2081a23b4e72785c14584b5eb7 Text-delta-base-sha1: 81d05a22880d3fd119c7227f22b0039dfb988744 Text-content-length: 1267 Text-content-md5: dcb4767ca676bf205bd8f25bd7c6bee0 Text-content-sha1: 405523881dbd6633f87fd1220816c6478142d145 Content-length: 1307 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN_GaxP>qt fv4b"B2P@TU={U=_K*q)h8 #define MAIN_NPANELS 8 #define RECONF_NPANELS 5CharSet", cfg.fontcharset wppi (sesskey, "KoiWinXlat", cfg.xlat_enablekoiwin); wppi (sesskey, "CapsLockCyr", cfg.xlat_capslockcyr);CharSet", ANSI_CHARSET, &cfg.fontcharsetgppi (sesskey, "KoiWinXlat", 0, &cfg.xlat_enablekoiwin); gppi (sesskey, "CapsLockCyr", 0, &cfg.xlat_capslockcyr); cfg.fontcharsetcharset = lf.lfCharSetint CALLBACK LanguageProc (HWND hwnd, UINT msg, CheckDlgButton (hwnd, IDC6_ENABLEKOIWINXLAT, cfg.xlat_enablekoiwin); CheckDlgButton (hwnd, IDC6_CAPSLOCKCYR, cfg.xlat_capslockcyr); case WM_COMMAND: switch (LOWORD(wParam)) { case IDC6_ENABLEKOIWINXLATcfg.xlat_enablekoiwin = IsDlgButtonChecked (hwnd, IDC6_ENABLEKOIWINXLAT); } break; case IDC6_CAPSLOCKCYRcfg.xlat_capslockcyr = IsDlgButtonChecked (hwnd, IDC6_CAPSLOCKCYR); } break; }, Language, MAKEINTRESOURCE(IDD_PANEL6) }; static char *names[NPANELS] = { "Connection", "Keyboard", "Terminal", "Telnet", "SSH", "Selection", "Colours", "Language" }; static int mainp[MAIN_NPANELS] = { 0, 1, 2, 3, 4, 5, 6, 7}; static int reconfp[RECONF_NPANELS] = { 1, 2, 5, 6, 7 Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e0ea2c3e1d94b15ba927626aca58971 Text-delta-base-sha1: bca40c570c217eda4ad63dd11db0d42116ed0ce2 Text-content-length: 604 Text-content-md5: f1023cb0b5c4eb2978dd9ce26710a6a2 Text-content-sha1: b680e37422afa372e9be220919f3cc4f887c5014 Content-length: 644 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNU",HaFq8/{k.cfg.fontcharset, fw_dontcare, FALSE); f(FONT_UNDERLINE, cfg.fontcharsetcfg.fontcharset, fw_bold, FALSE); f(FONT_BOLDUND, cfg.fontcharsetxlat_kbd2tty((unsigned char)wParam); BOOL capsOn=keystate[VK_CAPITAL] !=0; /* helg: clear CAPS LOCK state if caps lock switches to cyrillic */ if(cfg.xlat_capslockcyr) keystate[VK_CAPITAL] = 0; r = ToAscii (wParam, (lParam >> 16) & 0xFF, keystate, &chr, 0); if(capsOn) chr = xlat_latkbd2win((unsigned char)(chr & 0xFF)); if (r == 1) { *p++ = xlat_kbd2tty((unsigned char)(chr & 0xFF)) Node-path: putty/xlat.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3830 Text-content-md5: 9163298b9cf01650cf5856e8cd1560a0 Text-content-sha1: 71b47a5b934046eb2aa9966b93e54d0073d1e5f0 Content-length: 3946 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNhhh#include #include "putty.h" static unsigned char win2koi[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, 160,161,162,163,164,189,166,167,179,169,180,171,172,173,174,183, 176,177,182,166,173,181,182,183,163,185,164,187,188,189,190,167, 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240, 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241, 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208, 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209 }; static unsigned char koi2win[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, 160,161,162,184,186,165,179,191,168,169,170,171,172,180,174,175, 176,177,178,168,170,181,178,175,184,185,186,187,188,165,190,191, 254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238, 239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250, 222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206, 207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218 }; unsigned char xlat_kbd2tty(unsigned char c) { if(cfg.xlat_enablekoiwin) return win2koi[c]; return c; } unsigned char xlat_tty2scr(unsigned char c) { if(cfg.xlat_enablekoiwin) return koi2win[c]; return c; } static unsigned char latkbd2_win[]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,221, 35, 36, 37, 38,253, 40, 41, 42,178,225,186,254, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,198,230,193,179,222, 44, 64,212,200,209,194,211,192,207,208,216,206,203,196,220,210,217, 199,201,202,219,197,195,204,214,215,205,223,245,191,250, 94,170, 96,244,232,241,226,243,224,239,240,248,238,235,228,252,242,249, 231,233,234,251,229,227,236,246,247,237,255,213,175,218,126,127, 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 }; unsigned char xlat_latkbd2win(unsigned char c) { if(cfg.xlat_capslockcyr) return latkbd2_win[c]; return c; } Revision-number: 278 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Clean up sizetip patch: remove separate header file and // comments K 10 svn:author V 5 simon K 8 svn:date V 27 1999-11-08T11:13:53.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1a0e8642d6d2f1966c4e49d272c50fd2 Text-delta-base-sha1: aa40863234c64f82eeb120c1ed6c24f1191def2f Text-content-length: 114 Text-content-md5: 9d92d789ea11f543f0936777f98087d2 Text-content-sha1: 9fec952406ea6243cd9dfc41a43f1abec1ecb333 Content-length: 154 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN! \A\v+sizetip.c. */ void UpdateSizeTip(HWND src, int cx, int cy); void EnableSizeTip(int bEnable) Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 280f9d3fc58417a63127eadfcf6dbceb Text-delta-base-sha1: 627ed4b3a335e6b24fbb5c961f861b3ca46aa113 Text-content-length: 827 Text-content-md5: e345012a8731ccf9bed030c1ba0a274d Text-content-sha1: d03e9db5b912ab75996f8b19f1a4a0d752df4744 Content-length: 866 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN b?pYHL1a-_l3n_i(/8k case WM_ERASEBKGND: return TRUE; case WM_NCHITTEST: return HTTRANSPARENT; case WM_DESTROY: DeleteObject(tip_font); tip_font = NULL; break; * First make sure the window class is registered */#if 0 /* Default values based on Windows Standard color scheme */ tip_font = GetStockObject(SYSTEM_FONT); tip_bg = RGB(255, 255, 225); tip_text = RGB(0, 0, 0); #endif /* Prepare other GDI objects and drawing info */ tip_bg = GetSysColor(COLOR_INFOBK); tip_text = GetSysColor(COLOR_INFOTEXT); * Generate the tip text */* calculate the tip's size */* Create the tip window */ ix, iy, sz.cx, sz.cy, * Tip already exists, just set the text */ Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f1023cb0b5c4eb2978dd9ce26710a6a2 Text-delta-base-sha1: b680e37422afa372e9be220919f3cc4f887c5014 Text-content-length: 23 Text-content-md5: 4df849cd908d7dfdd542eff0d6b14a99 Text-content-sha1: 7ba9b48c53954a3849fd73b41350e563fa3ac294 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNU@ Qof Node-path: putty/sizetip.h Node-action: delete Revision-number: 279 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 1999-11-08T11:14:33.000000Z K 7 svn:log V 34 xlat.c needs stdio.h for vsprintf K 10 svn:author V 5 simon PROPS-END Node-path: putty/xlat.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9163298b9cf01650cf5856e8cd1560a0 Text-delta-base-sha1: 71b47a5b934046eb2aa9966b93e54d0073d1e5f0 Text-content-length: 52 Text-content-md5: 7bc578df73bc0fb598c2f7369199c4ed Text-content-sha1: a533fadc8b939688468e5dd5b68610f53072a4cc Content-length: 91 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNh{$W#include #include maxlen) i = maxlen-1; else i = i - 2; str[i] = '\0'; WriteFile(hout, "\r\n", 2, &i, NULL); } /* * Open an SSH connection to user@host and execute cmd. */ static void do_cmd(char *host, char *user, char *cmd) { char *err, *realhost; if (host == NULL || host[0] == '\0') bump("Empty host name"); /* Try to load settings for this host */ do_defaults(host); if (cfg.host[0] == '\0') { /* No settings for this host; use defaults */ strncpy(cfg.host, host, sizeof(cfg.host)-1); cfg.host[sizeof(cfg.host)-1] = '\0'; cfg.port = 22; } /* Set username */ if (user != NULL && user[0] != '\0') { strncpy(cfg.username, user, sizeof(cfg.username)-1); cfg.username[sizeof(cfg.username)-1] = '\0'; cfg.port = 22; } else if (cfg.username[0] == '\0') { bump("Empty user name"); } if (cfg.protocol != PROT_SSH) cfg.port = 22; err = ssh_init(cfg.host, cfg.port, cmd, &realhost); if (err != NULL) bump("ssh_init: %s", err); if (verbose && realhost != NULL) fprintf(stderr, "Connected to %s\n", realhost); connection_open = 1; }time_t start, time_t now) { float ratebs; unsigned long eta; char etastr[10]; int pct; if (now > start) ratebs = (float) done / (now - start); else ratebs = (float) done; if (ratebs < 1.0) eta = size - done; else eta = (unsigned long) ((size - done) / ratebs); sprintf(etastr, "%02d:%02d:%02d", eta / 3600, (eta % 3600) / 60, eta % 60); pct = (int) (100.0 * (float) done / size); name, done / 1024, ratebs / 1024.0, etastr, pct); if (done == size) printf("\n"); } /* We ignore a leading colon, since the hostname cannot be empty. We also ignore a colon as second character because of filenames like f:myfile.txt. */ if (str[0] == '\0' || str[0] == ':' || str[1] == ':') return (NULL); while (*str != '\0' && *str != ':' && *str != '/' && *str != '\\') str++; if (*str == ':') return (str); else return (NULL); } char ch, resp, rbuf[2048]; int p; if (ssh_recv(&resp, 1) <= 0) bump("Lost connection"); p = 0; switch (resp) { case 0: /* ok */ return (0); default: rbuf[p++] = resp; /* fallthrough */ case 1: /* error */ case 2: /* fatal error */ do { if (ssh_recv(&ch, 1) <= 0) bump("Protocol error: Lost connection"); rbuf[p++] = ch; } while (p < sizeof(rbuf) && ch != '\n'); rbuf[p-1] = '\0'; if (resp == 1) fprintf(stderr, "%s\n", rbuf); else bump("%s", rbuf); errs++; return (-1); } } char str[2048]; va_list ap; va_start(ap, fmt); errs++; strcpy(str, "\01scp: "); vsprintf(str+strlen(str), fmt, ap); strcat(str, "\n"); ssh_send(str, strlen(str)); vfprintf(stderr, fmt, ap); fprintf(stderr, "\n"); va_end(ap); } /* * Execute the source part of the SCP protocol. */ static void source(char *src) { char buf[2048]; unsigned long size; char *last; HANDLE f; DWORD attr; unsigned long i; unsigned long stat_bytes; time_t stat_starttime, stat_lasttime; attr = GetFileAttributes(src); if (attr == -1) { run_err("%s: No such file or directory", src); return; } if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { if (recursive) rsource(src); else run_err("%s: not a regular file", src); return; } if ((last = strrchr(src, '/')) == NULL) last = src; else last++; if (strrchr(last, '\\') != NULL) last = strrchr(last, '\\') + 1; if (last == src && strchr(src, ':') != NULL) last = strchr(src, ':') + 1; f = CreateFile(src, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if (f == INVALID_HANDLE_VALUE) { run_err("%s: Cannot open file"); return; } if (preserve) { FILETIME actime, wrtime; unsigned long mtime, atime; GetFileTime(f, NULL, &actime, &wrtime); TIME_WIN_TO_POSIX(actime, atime); TIME_WIN_TO_POSIX(wrtime, mtime); sprintf(buf, "T%lu 0 %lu 0\n", mtime, atime); ssh_send(buf, strlen(buf)); if (response()) return; } size = GetFileSize(f, NULL); sprintf(buf, "C0644 %lu %s\n", size, last); if (verbose) fprintf(stderr, "Sending file modes: %s", buf); ssh_send(buf, strlen(buf)); if (response()) return; if (statistics) { stat_bytes = 0; stat_starttime = time(NULL); stat_lasttime = 0; } for (i = 0; i < size; i += 4096) { char transbuf[4096]; DWORD j, k = 4096; if (i + k > size) k = size - i; if (! ReadFile(f, transbuf, k, &j, NULL) || j != k) { if (statistics) printf("\n"); bump("%s: Read error", src); } ssh_send(transbuf, k); if (statistics) { stat_bytes += k; if (time(NULL) != stat_lasttime || i + k == size) { stat_lasttime = time(NULL); print_stats(last, size, stat_bytes, stat_starttime, stat_lasttime); } } } CloseHandle(f); ssh_send("", 1); (void) response(); } char buf[2048]; char *last; HANDLE dir; WIN32_FIND_DATA fdat; int ok; if ((last = strrchr(src, '/')) == NULL) last = src; else last++; if (strrchr(last, '\\') != NULL) last = strrchr(last, '\\') + 1; if (last == src && strchr(src, ':') != NULL) last = strchr(src, ':') + 1; /* maybe send filetime */ sprintf(buf, "D0755 0 %s\n", last); if (verbose) fprintf(stderr, "Entering directory: %s", buf); ssh_send(buf, strlen(buf)); if (response()) return; sprintf(buf, "%s/*", src); dir = FindFirstFile(buf, &fdat); ok = (dir != INVALID_HANDLE_VALUE); while (ok) { if (strcmp(fdat.cFileName, ".") == 0 || strcmp(fdat.cFileName, "..") == 0) { } else if (strlen(src) + 1 + strlen(fdat.cFileName) >= sizeof(buf)) { run_err("%s/%s: Name too long", src, fdat.cFileName); } else { sprintf(buf, "%s/%s", src, fdat.cFileName); source(buf); } ok = FindNextFile(dir, &fdat); } FindClose(dir); sprintf(buf, "E\n"); ssh_send(buf, strlen(buf)); (void) response(); } /* * Execute the sink part of the SCP protocol. */ static void sink(char *targ) { char buf[2048]; char namebuf[2048]; char ch; int targisdir = 0; int settime = 0; int exists; DWORD attr; HANDLE f; unsigned long mtime, atime; unsigned int mode; unsigned long size, i; int wrerror = 0; unsigned long stat_bytes; time_t stat_starttime, stat_lasttime; char *stat_name; attr = GetFileAttributes(targ); if (attr != -1 && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0) targisdir = 1; if (targetshouldbedirectory && !targisdir) bump("%s: Not a directory", targ); ssh_send("", 1); while (1) { settime = 0; gottime: if (ssh_recv(&ch, 1) <= 0) return; if (ch == '\n') bump("Protocol error: Unexpected newline"); i = 0; buf[i++] = ch; do { if (ssh_recv(&ch, 1) <= 0) bump("Lost connection"); buf[i++] = ch; } while (i < sizeof(buf) && ch != '\n'); buf[i-1] = '\0'; switch (buf[0]) { case '\01': /* error */ fprintf(stderr, "%s\n", buf+1); errs++; continue; case '\02': /* fatal error */ bump("%s", buf+1); case 'E': ssh_send("", 1); return; case 'T': if (sscanf(buf, "T%d %*d %d %*d", &mtime, &atime) == 2) { settime = 1; ssh_send("", 1); goto gottime; } bump("Protocol error: Illegal time format"); case 'C': case 'D': break; default: bump("Protocol error: Expected control record"); } if (sscanf(buf+1, "%u %u %[^\n]", &mode, &size, namebuf) != 3) bump("Protocol error: Illegal file descriptor format"); if (targisdir) { char t[2048]; strcpy(t, targ); if (targ[0] != '\0') strcat(t, "/"); strcat(t, namebuf); strcpy(namebuf, t); } else { strcpy(namebuf, targ); } attr = GetFileAttributes(namebuf); exists = (attr != -1); if (buf[0] == 'D') { if (exists && (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) { run_err("%s: Not a directory", namebuf); continue; } if (!exists) { if (! CreateDirectory(namebuf, NULL)) { run_err("%s: Cannot create directory", namebuf); continue; } } sink(namebuf); /* can we set the timestamp for directories ? */ continue; } f = CreateFile(namebuf, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (f == INVALID_HANDLE_VALUE) { run_err("%s: Cannot create file", namebuf); continue; } ssh_send("", 1); if (statistics) { stat_bytes = 0; stat_starttime = time(NULL); stat_lasttime = 0; if ((stat_name = strrchr(namebuf, '/')) == NULL) stat_name = namebuf; else stat_name++; if (strrchr(stat_name, '\\') != NULL) stat_name = strrchr(stat_name, '\\') + 1; } for (i = 0; i < size; i += 4096) { char transbuf[4096]; int j, k = 4096; if (i + k > size) k = size - i; if (ssh_recv(transbuf, k) == 0) bump("Lost connection"); if (wrerror) continue; if (! WriteFile(f, transbuf, k, &j, NULL) || j != k) { wrerror = 1; if (statistics) printf("\r%-25.25s | %50s\n", stat_name, "Write error.. waiting for end of file"); continue; } if (statistics) { stat_bytes += k; if (time(NULL) > stat_lasttime || i + k == size) { stat_lasttime = time(NULL); print_stats(stat_name, size, stat_bytes, stat_starttime, stat_lasttime); } } } (void) response(); if (settime) { FILETIME actime, wrtime; TIME_POSIX_TO_WIN(atime, actime); TIME_POSIX_TO_WIN(mtime, wrtime); SetFileTime(f, NULL, &actime, &wrtime); } CloseHandle(f); if (wrerror) { run_err("%s: Write error", namebuf); continue; } ssh_send("", 1); } } /* * We will copy local files to a remote server. */ static void toremote(int argc, char *argv[]) { char *src, *targ, *host, *user; char *cmd; int i; targ = argv[argc-1]; /* Seperate host from filename */ host = targ; targ = colon(targ); if (targ == NULL) bump("targ == NULL in toremote()"); *targ++ = '\0'; if (*targ == '\0') targ = "."; /* Substitute "." for emtpy target */ /* Seperate host and username */ user = host; host = strrchr(host, '@'); if (host == NULL) { host = user; user = NULL; } else { *host++ = '\0'; if (*user == '\0') user = NULL; } if (argc == 2) { /* Find out if the source filespec covers multiple files if so, we should set the targetshouldbedirectory flag */ HANDLE fh; WIN32_FIND_DATA fdat; if (colon(argv[0]) != NULL) bump("%s: Remote to remote not supported", argv[0]); fh = FindFirstFile(argv[0], &fdat); if (fh == INVALID_HANDLE_VALUE) bump("%s: No such file or directory\n", argv[0]); if (FindNextFile(fh, &fdat)) targetshouldbedirectory = 1; FindClose(fh); } cmd = smalloc(strlen(targ) + 100); sprintf(cmd, "scp%s%s%s%s -t %s", verbose ? " -v" : "", recursive ? " -r" : "", preserve ? " -p" : "", targetshouldbedirectory ? " -d" : "", targ); do_cmd(host, user, cmd); sfree(cmd); (void) response(); for (i = 0; i < argc - 1; i++) { HANDLE dir; WIN32_FIND_DATA fdat; src = argv[i]; if (colon(src) != NULL) { fprintf(stderr, "%s: Remote to remote not supported\n", src); errs++; continue; } dir = FindFirstFile(src, &fdat); if (dir == INVALID_HANDLE_VALUE) { run_err("%s: No such file or directory", src); continue; } do { char *last; char namebuf[2048]; if (strlen(src) + strlen(fdat.cFileName) >= sizeof(namebuf)) { fprintf(stderr, "%s: Name too long", src); continue; } strcpy(namebuf, src); if ((last = strrchr(namebuf, '/')) == NULL) last = namebuf; else last++; if (strrchr(last, '\\') != NULL) last = strrchr(last, '\\') + 1; if (last == namebuf && strrchr(namebuf, ':') != NULL) last = strchr(namebuf, ':') + 1; strcpy(last, fdat.cFileName); source(namebuf); } while (FindNextFile(dir, &fdat)); FindClose(dir); } } char *src, *targ, *host, *user; char *cmd; if (argc != 2) bump("More than one remote source not supported"); src = argv[0]; targ = argv[1]; /* Seperate host from filename */ host = src; src = colon(src); if (src == NULL) bump("Local to local copy not supported"); *src++ = '\0'; if (*src == '\0') src = "."; /* Substitute "." for empty filename */ /* Seperate username and hostname */ user = host; host = strrchr(host, '@'); if (host == NULL) { host = user; user = NULL; } else { *host++ = '\0'; if (*user == '\0') user = NULL; } cmd = smalloc(strlen(src) + 100); sprintf(cmd, "scp%s%s%s%s -f %s", verbose ? " -v" : "", recursive ? " -r" : "", preserve ? " -p" : "", targetshouldbedirectory ? " -d" : "", src); do_cmd(host, user, cmd); sfree(cmd); sink(targ); } /* * Initialize the Win$ock driver. */ static void init_winsock() { WORD winsock_ver; WSADATA wsadata; winsock_ver = MAKEWORD(1, 1); if (WSAStartup(winsock_ver, &wsadata)) bump("Unable to initialise WinSock"); if (LOBYTE(wsadata.wVersion) != 1 || HIBYTE(wsadata.wVersion) != 1) bump("WinSock version is incompatible with 1.1"); } /* * Short description of parameters. */ static void usage() { printf("PuTTY Secure Copy client\n"); printf("%s\n", ver); printf(" scp [-p] [-q] [-r] [-v] source [source..]" " [user@]host:target\n"); exit(1); } /* * Main program (no, really?) */ int main(int argc, char *argv[]) { int i; init_winsock(); for (i = 1; i < argc; i++) { if (argv[i][0] != '-') break; if (strcmp(argv[i], "-v") == 0) verbose = 1; else if (strcmp(argv[i], "-r") == 0) recursive = 1; else if (strcmp(argv[i], "-p") == 0) preserve = 1; else if (strcmp(argv[i], "-q") == 0) statistics = 0; else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-?") == 0) usage(); else if (strcmp(argv[i], "--") == 0) { i++; break; } else usage(); } argc -= i; argv += i; if (argc < 2) usage(); if (argc > 2) targetshouldbedirectory = 1; if (colon(argv[argc-1]) != NULL) toremote(argc, argv); else tolocal(argc, argv); if (connection_open) { char ch; ssh_send_eof(); ssh_recv(&ch, 1); } WSACleanup(); random_save_seed(); return (errs == 0 ? 0 : 1); } /* end */ Node-path: putty/scpssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b5bbc8bf123fdf13be0ec5dc8483f4b7 Text-delta-base-sha1: 339733125270da0e49491c9285bbac976827abfe Text-content-length: 181 Text-content-md5: 9f6031fdbe1204e911284875d3897f2b Text-content-sha1: c4ed9bf6f0cb4b66845c78066edf7cb5e10788f6 Content-length: 220 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNY  2eunsigned char)((value) >> 24); \ (cp)[1] = (unsigned char)((value) >> 16); \ (cp)[2] = (unsigned char)((value) >> 8); \ (cp)[3] = (unsigned char) Revision-number: 281 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 1999-11-08T12:19:02.000000Z K 7 svn:log V 60 Removed now obsolete sizetip.h from window.obj dependencies K 10 svn:author V 4 owen PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4cf0e9ae89cce0afe25e4b8d955fe4bc Text-delta-base-sha1: 4a971b94bac5a1ad2ca415ea0bf4f1b8ecfd0c0f Text-content-length: 20 Text-content-md5: d3ef38ff23e5c00bff282f3026958f66 Text-content-sha1: 1f3c1404be1998740454677cb1863a849893e7d2 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN q { Revision-number: 282 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 1999-11-08T17:36:08.000000Z K 7 svn:log V 31 Switch to using SSH_MSG macros K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c6c47190b63b3757552e25fe0ed5a07e Text-delta-base-sha1: 8f0b48bc12dd4f2beebaf06995cd7fb9fad4d2e1 Text-content-length: 1368 Text-content-md5: 2bba0831db96dc87943fa38a83542e87 Text-content-sha1: 1e86c62dc36c7c7874481f80226f1dd25b7c7ef3 Content-length: 1408 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNAj`,`*Ui( W,xy%D T8 L3[fw_JYA=@#define SSH_MSG_DISCONNECT 1 #define SSH_SMSG_PUBLIC_KEY 2 #define SSH_CMSG_SESSION_KEY 3 #define SSH_CMSG_USER 4 #define SSH_CMSG_AUTH_PASSWORD 9 #define SSH_CMSG_REQUEST_PTY 10 #define SSH_CMSG_EXEC_SHELL 12 #define SSH_CMSG_STDIN_DATA 16 #define SSH_SMSG_STDOUT_DATA 17 #define SSH_SMSG_STDERR_DATA 18 #define SSH_SMSG_SUCCESS 14 #define SSH_SMSG_FAILURE 15 #define SSH_SMSG_EXITSTATUS 20 #define SSH_MSG_IGNORE 32 #define SSH_CMSG_EXIT_CONFIRMATION 33 #define SSH_MSG_DEBUG 36SSH_MSG_DEBUG) { /* FIXME: log it */ } else if (pktin.type == SSH_MSG_IGNORE) {SSH_SMSG_PUBLIC_KEYSSH_CMSG_SESSION_KEYSSH_SMSG_SUCCESSSSH_CMSG_USERSSH_SMSG_FAILURESSH_CMSG_AUTH_PASSWORD, 4+strlen(passwordSSH_CMSG_REQUEST_PTYSSH_MSG_SUCCESS && pktin.type != SSH_MSG_FAILURE) { fatalbox("Protocol confusion"); } else if (pktin.type == SSH_MSG_FAILURESSH_CMSG_EXEC_SHELLSSH_SMSG_STDOUT_DATA || pktin.type == SSH_SMSG_STDERR_DATASSH_MSG_DISCONNECT) { ssh_state = SSH_STATE_CLOSED; } else if (pktin.type == SSH_MSG_SUCCESS) { /* may be from EXEC_SHELL on some servers */ } else if (pktin.type == SSH_MSG_FAILURE) { /*SSH_SMSG_EXITSTATUS) { s_wrpkt_start(SSH_CMSG_EXIT_CONFIRMATIONSSH_CMSG_STDIN_DATA Revision-number: 283 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 1999-11-08T17:42:12.000000Z K 7 svn:log V 30 Add TIS authentication option K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d92d789ea11f543f0936777f98087d2 Text-delta-base-sha1: 9fec952406ea6243cd9dfc41a43f1abec1ecb333 Text-content-length: 37 Text-content-md5: 5c8969c72853af27ab3d41babe247b48 Text-content-sha1: 53c41fe3ec23466f90a32386ad2b061d9d8e6533 Content-length: 77 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN) 1h+int try_tis_auth Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2bba0831db96dc87943fa38a83542e87 Text-delta-base-sha1: 1e86c62dc36c7c7874481f80226f1dd25b7c7ef3 Text-content-length: 1759 Text-content-md5: 1cb3fe0fa9111eec8b04b69f9f803895 Text-content-sha1: 870ba89e551df586cb70b624dff8f915c0c00c08 Content-length: 1799 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNG A skWz-Z3hT@Xw`pcP`3l#define SSH_CMSG_AUTH_TIS 39 #define SSH_SMSG_AUTH_TIS_CHALLENGE 40 #define SSH_CMSG_AUTH_TIS_RESPONSE 41 #define SSH_AUTH_TIS 5static unsigned long supported_ciphers_mask, supported_auth(pktin.body[12+i+j] << 24) | (pktin.body[14+i+j] << 8) | (pktin.body[15+i+j])); supported_auths_mask = ((pktin.body[16+i+j] << 24) | (pktin.body[17+i+j] << 16) | (pktin.body[18+i+j] << 8) | (pktin.body[19+i+j]) static int pwpkt_type; /* * Show password prompt, having first obtained it via a TIS * exchange if we're doing TIS authentication. */ pwpkt_type = SSH_CMSG_AUTH_PASSWORD; if (pktin.type == SSH_SMSG_FAILURE && cfg.try_tis_auth && (supported_auths_mask & (1<= negsize) { negsize += 64; events = srealloc (events, negsize * sizeof(*events)); } events[nevents] = smalloc(1+strlen(string)); strcpy (events[nevents], string); neveneventlog Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4df849cd908d7dfdd542eff0d6b14a99 Text-delta-base-sha1: 7ba9b48c53954a3849fd73b41350e563fa3ac294 Text-content-length: 1386 Text-content-md5: 6ccb07b91cda45d92e4e355e286409d1 Text-content-sha1: 80b7bbeae2468a038485e1f1ad72b68a87958ac6 Content-length: 1426 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN@,0 pc Dh)^ KoQSEPARATOR, 0, 0); } AppendMenu (m, MF_ENABLED, IDM_SHOWLOG, "Event Log"); AppendMenu (m, MF_SEPARATOR, 0, 0);eventlogif (len == -1) return DefWindowProc (hwnd, message, wParam, lParam && cfg.alt_f4) { return -1; } if ((lParam & 0x20000000) && wParam == VK_SPACE && cfg.alt_space) { SendMessage (hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0); return -1if (cfg.nethack_keypad) { int shift = keystate[VK_SHIFT] & 0x80; /* * NB the shifted versions only work with numlock off. */ switch ( (lParam >> 16) & 0x1FF ) { case 0x047: *p++ = shift ? 'Y' : 'y'; return p - output; case 0x048: *p++ = shift ? 'K' : 'k'; return p - output; case 0x049: *p++ = shift ? 'U' : 'u'; return p - output; case 0x04B: *p++ = shift ? 'H' : 'h'; return p - output; case 0x04C: *p++ = '.'; return p - output; case 0x04D: *p++ = shift ? 'L' : 'l'; return p - output; case 0x04F: *p++ = shift ? 'B' : 'b'; return p - output; case 0x050: *p++ = shift ? 'J' : 'j'; return p - output; case 0x051: *p++ = shift ? 'N' : 'n'; return p - output; case 0x053: *p++ = '.'; return p - output; } } else if (app_keypad_keys) { /* * If we're in applications keypad mode, we have to process it * before char-map translation, because it will pre-empt lots * of stuff, even if NumLock is off. */ Revision-number: 285 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 1999-11-09T11:19:34.000000Z K 7 svn:log V 52 Oops - Shift-PgUp/PgDn conflicted with NetHack mode K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ccb07b91cda45d92e4e355e286409d1 Text-delta-base-sha1: 80b7bbeae2468a038485e1f1ad72b68a87958ac6 Text-content-length: 132 Text-content-md5: 5c659c66d5151263f88983d32caa11a3 Text-content-sha1: 8997b3f647a1e65a93a2f51a121a9572da6d7eab Content-length: 172 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN^6^Y<&/iNetHack keypad mode. This may conflict with Shift-PgUp/PgDn, * so we do it first. */ Revision-number: 286 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 1999-11-09T11:34:14.000000Z K 7 svn:log V 34 Fix unexpected network error 5000 K 10 svn:author V 5 simon PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2c67eb32178a7900056475330e7ef5d0 Text-delta-base-sha1: 3620309a0bcd6e765fedc5d9df4d02062939c296 Text-content-length: 441 Text-content-md5: 7f4d8b9f46b2faed65b80b84cf05ea74 Text-content-sha1: 62a300595bfe73d1d45fae5793d986dac297cb00 Content-length: 480 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNm~ lww-Z/* * Because reading less than the whole of the available pending * data can generate an FD_READ event, we need to allow for the * possibility that FD_READ may arrive with FD_CLOSE already in * the queue; so it's possible that we can get here even with s * invalid. If so, we return 1 and don't worry about it. */ if (s == INVALID_SOCKET) return 1 case FD_CLOSE Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 818e11cc1d62b2f90e49dee73239afbf Text-delta-base-sha1: 3d73c8c171c33117b25bf036106a44b955cba82a Text-content-length: 481 Text-content-md5: bfea446f81ea6716484160c15ce8b90f Text-content-sha1: 10034892153dbb1a4ab0bb03e10d274f08834bb6 Content-length: 521 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN]7B~ w =/* * Because reading less than the whole of the available pending * data can generate an FD_READ event, we need to allow for the * possibility that FD_READ may arrive with FD_CLOSE already in * the queue; so it's possible that we can get here even with s * invalid. If so, we return 1 and don't worry about it. */ if (s == INVALID_SOCKET) return 1 case FD_CLOSE } ssh_gotdata (buf, ret); return 1 Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3de5a664c7d8f539afdcb08e6424da06 Text-delta-base-sha1: c8379bae78fc5b21e7a29d148b17d5f2d59216ae Text-content-length: 448 Text-content-md5: 43212738fa30c4792de25b8cae6af167 Text-content-sha1: 0e51b937607ee035700a63e094c5e43e101df8d5 Content-length: 487 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNn!K~ w(nE h/* * Because reading less than the whole of the available pending * data can generate an FD_READ event, we need to allow for the * possibility that FD_READ may arrive with FD_CLOSE already in * the queue; so it's possible that we can get here even with s * invalid. If so, we return 1 and don't worry about it. */ if (s == INVALID_SOCKET) return 1 case FD_CLOSE Revision-number: 287 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 1999-11-09T12:05:34.000000Z K 7 svn:log V 63 Added local-editing line discipline to make raw backend usable K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3ef38ff23e5c00bff282f3026958f66 Text-delta-base-sha1: 1f3c1404be1998740454677cb1863a849893e7d2 Text-content-length: 308 Text-content-md5: 7b938b3c34a93b334ce03ee53b36341d Text-content-sha1: 596092ea1484875f40d42617d459d6f17df5b7c8 Content-length: 348 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNc WUbsp!OBJS1 = window.obj windlg.obj terminal.obj telnet.obj raw.obj POBJS2 = xlat.obj ldiscOBJS1) $(POBJS2) $(OBJS1) $(OBJS2) $(OBJS3) $(RESRC) link.rsp link /debug -out:putty.exe @link.rsp puttyd.exe: $(POBJS1) $(POBJS2OBJS1) >> link.rsp echo $(POBJS2ldisc.obj: ldisc Node-path: putty/ldisc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3372 Text-content-md5: 1d59f68b54e6c83422d68a05b3087894 Text-content-sha1: 980bab6f929cbbe996196091530d49b7da1bbe69 Content-length: 3488 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN#include #include #include "putty.h" /* * ldisc.c: PuTTY line disciplines */ static void c_write (char *buf, int len) { while (len--) { int new_head = (inbuf_head + 1) & INBUF_MASK; int c = (unsigned char) *buf; if (new_head != inbuf_reap) { inbuf[inbuf_head] = *buf++; inbuf_head = new_head; } } } static char *term_buf = NULL; static int term_buflen = 0, term_bufsiz = 0, term_quotenext = 0; static int plen(unsigned char c) { if ((c >= 32 && c <= 126) || (c >= 160)) return 1; else if (c < 128) return 2; /* ^x for some x */ else return 4; /* for hex XY */ } static void pwrite(unsigned char c) { if ((c >= 32 && c <= 126) || (c >= 160)) { char cc = (char)c; c_write(&cc, 1); } else if (c < 128) { char cc[2]; cc[1] = (c == 127 ? '?' : c + 0x40); cc[0] = '^'; c_write(cc, 2); } else { char cc[5]; sprintf(cc, "<%02X>", c); c_write(cc, 4); } } static void bsb(int n) { while (n--) c_write("\010 \010", 3); } static void term_send(char *buf, int len) { while (len--) { char c; c = *buf++; switch (term_quotenext ? ' ' : c) { /* * ^h/^?: delete one char and output one BSB * ^w: delete, and output BSBs, to return to last space/nonspace * boundary * ^u: delete, and output BSBs, to return to BOL * ^r: echo "^R\n" and redraw line * ^v: quote next char * ^d: if at BOL, end of file and close connection, else send line * and reset to BOL * ^m/^j: send line-plus-\r\n and reset to BOL */ case 8: case 127: /* backspace/delete */ if (term_buflen > 0) { bsb(plen(term_buf[term_buflen-1])); term_buflen--; } break; case 23: /* ^W delete word */ while (term_buflen > 0) { bsb(plen(term_buf[term_buflen-1])); term_buflen--; if (term_buflen > 0 && isspace(term_buf[term_buflen-1]) && !isspace(term_buf[term_buflen])) break; } break; case 21: /* ^U delete line */ while (term_buflen > 0) { bsb(plen(term_buf[term_buflen-1])); term_buflen--; } break; case 18: /* ^R redraw line */ c_write("^R\r\n", 4); { int i; for (i = 0; i < term_buflen; i++) pwrite(term_buf[i]); } break; case 22: /* ^V quote next char */ term_quotenext = TRUE; break; case 4: /* ^D logout or send */ if (term_buflen == 0) { /* FIXME: eof */; } else { back->send(term_buf, term_buflen); term_buflen = 0; } break; case 13: case 10: /* ^M/^J send with newline */ back->send(term_buf, term_buflen); back->send("\r\n", 2); c_write("\r\n", 2); term_buflen = 0; break; default: /* get to this label from ^V handler */ if (term_buflen >= term_bufsiz) { term_bufsiz = term_buflen + 256; term_buf = saferealloc(term_buf, term_bufsiz); } term_buf[term_buflen++] = c; pwrite(c); term_quotenext = FALSE; break; } } } static void simple_send(char *buf, int len) { back->send(buf, len); } Ldisc ldisc_term = { term_send }; Ldisc ldisc_simple = { simple_send }; Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 89aa28141a6ca58a8cdc95e43c48195f Text-delta-base-sha1: fc5c382a175d3385cf4d71f63c2901cb150551d9 Text-content-length: 165 Text-content-md5: bd07e2c21f298fa2b977a8c7c49dc3cc Text-content-sha1: e01d4919cd223ecf2a6751c1662130537661f48c Content-length: 205 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN"W/@piMUvoid (*send) (char *buf, int len); } Ldisc; GLOBAL Ldisc *ldiscint ldisc_term;ldisc.c. */ extern Ldisc ldisc_term, ldisc_simple Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b0484e8beba9923abad13c1010a1296d Text-delta-base-sha1: 8f22350f3195bebe9dbe6d8cd8f5d820c856efdf Text-content-length: 99 Text-content-md5: b4e799695b93e4c64d76b5bd3d2ae433 Text-content-sha1: 96ca9aac12f115d5358fb8124200e4a88b2ec271 Content-length: 138 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNel3#/(3F_F)s]vsWNldiscldiscldiscldiscldiscldiscldisc Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 44f9e1a14a5b723c2b90b2956db09046 Text-delta-base-sha1: cfa99c006ea645b550bdc82e83a601b4247e9599 Text-content-length: 49 Text-content-md5: 8e27448660d847229b288a2ecbbd548b Text-content-sha1: bce46f36962880d63e36e62c6b4bc0d9bfb14adf Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN8U *#define IDC1_LDISCTERM 1019 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aebbd203070a6ae3078e577a0225e9d6 Text-delta-base-sha1: fc57e86bb5d3ddeb4570a9b36bfa1013abe3a6d1 Text-content-length: 138 Text-content-md5: ea5335b3ead2352208359050b82ff772 Text-content-sha1: 081f7a916c5f5fab9e12fb12dd7b313fb9900f90 Content-length: 178 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN* oon% AUTOCHECKBOX "&Use local terminal line discipline", IDC1_LDISCTERM, 3, 133, 162, 10 END IDD_PANEL2 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e710ae9b06ca9b20eeb18280994ba644 Text-delta-base-sha1: 883ce88a5eae10e2aa2401d6d0574e3e575042f2 Text-content-length: 257 Text-content-md5: f79101f2c21ce3afb6f916adeb7ee176 Text-content-sha1: ca0f3d33d058b9f5640b4cf6d49041e44d759736 Content-length: 297 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN_4+HbvKu*^\+GJ?DLdiscTerm", cfg.ldisc_termLdiscTerm", 0, &cfg.ldisc_termCheckDlgButton (hwnd, IDC1_LDISCTERM, cfg.ldisc_term case IDC1_LDISCTERMldisc_term = IsDlgButtonChecked (hwnd, IDC1_LDISCTERM); break; } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5c659c66d5151263f88983d32caa11a3 Text-delta-base-sha1: 8997b3f647a1e65a93a2f51a121a9572da6d7eab Text-content-length: 182 Text-content-md5: fd274d8d0de13749b6c8974fb7178c49 Text-content-sha1: a1def97297f421d948b068d198411ec8f704d277 Content-length: 222 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNJ 0G8{N7 cfg.protocol == PROT_TELNET ? &telnet_backend : &raw_backend); ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simpleldiscldisc Revision-number: 288 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 1999-11-09T14:20:51.000000Z K 7 svn:log V 54 Should be able to switch line disciplines mid-session K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fd274d8d0de13749b6c8974fb7178c49 Text-delta-base-sha1: a1def97297f421d948b068d198411ec8f704d277 Text-content-length: 79 Text-content-md5: fe6ff1e692e47ce3e58e03a9543c28f2 Text-content-sha1: 452a63c3842ad9756c4573123275bbbbfd7bbdaf Content-length: 119 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNJ 5jhbldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple Revision-number: 289 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 Add "extern" on declaration of raw_backend K 10 svn:author V 5 simon K 8 svn:date V 27 1999-11-10T09:14:08.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd07e2c21f298fa2b977a8c7c49dc3cc Text-delta-base-sha1: e01d4919cd223ecf2a6751c1662130537661f48c Text-content-length: 28 Text-content-md5: 68a3cdedfc58531e92cd2b19cd454222 Text-content-sha1: 7f3fae8f85bfa7cd8ce87e13487edb9fc3b8afa5 Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNW^ 0'0extern Revision-number: 290 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 1999-11-10T09:47:31.000000Z K 7 svn:log V 31 Added LICENCE and README files K 10 svn:author V 5 simon PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1111 Text-content-md5: 0f0d8d51b7edbd7a641c26daf8f4666e Text-content-sha1: 1efb7798f67b69eda57d8bd82220e178d8a81a1b Content-length: 1227 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNIIIPuTTY is copyright 1997-1999 Simon Tatham. Portions copyright Gary S. Brown and Eric Young. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Node-path: putty/README Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 837 Text-content-md5: aba0bd096e5e9169460bf83229f67537 Text-content-sha1: 9b89cd3b5eb2eb89099876bf68b2eef5bd4bb36a Content-length: 953 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN777This is the README for PuTTY, a free Win32 Telnet and SSH client. The provided Makefile is for MS Visual C++ systems. Type `nmake' to build both putty.exe (the main program) and pscp.exe (an SCP client). Setting up a project file in the Visual C++ IDE sometimes fails to work. In particular, Visual Studio 6 falls over on the odd macro usage in ssh.c. This is a bug in Visual Studio, since the VC++6 command line compiler works fine. If in doubt, just use `nmake'. The PuTTY home web site is http://www.chiark.greenend.org.uk/~sgtatham/putty.html Bug reports and feature requests should be sent to . PLEASE read the section on the web site about how to report bugs effectively. Do NOT send one-line reports saying `it doesn't work'! See the file LICENCE for the licence conditions. Revision-number: 291 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 1999-11-10T10:28:59.000000Z K 7 svn:log V 61 Add spiel about there being a comment at the top of Makefile K 10 svn:author V 5 simon PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aba0bd096e5e9169460bf83229f67537 Text-delta-base-sha1: 9b89cd3b5eb2eb89099876bf68b2eef5bd4bb36a Text-content-length: 225 Text-content-md5: ac3f153f8c07f827804754799ee7bccf Text-content-sha1: a5ddc35a0d6f83722cc45617525e08d2579feb95 Content-length: 264 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN7 ILIlK The comment at the top of the Makefile gives extra build options you can use to build in limited Win32s compatibility, a hack to pass SSH through some types of firewall, and `official' version numbers Revision-number: 292 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.018540Z PROPS-END Revision-number: 293 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.027362Z PROPS-END Revision-number: 294 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.037941Z PROPS-END Revision-number: 295 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.048242Z PROPS-END Revision-number: 296 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.058073Z PROPS-END Revision-number: 297 Prop-content-length: 147 Content-length: 147 K 7 svn:log V 47 _sntprintf is nonportable; use sprintf instead K 10 svn:author V 5 simon K 8 svn:date V 27 1999-11-11T10:13:40.000000Z PROPS-END Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e345012a8731ccf9bed030c1ba0a274d Text-delta-base-sha1: d03e9db5b912ab75996f8b19f1a4a0d752df4744 Text-content-length: 59 Text-content-md5: ccff27df48f4a093e059f10b28ddc0eb Text-content-sha1: a4e8f9e2c82f1941d953cfd9b3621f46d5f6abe4 Content-length: 98 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNbZ %u' B32sprintf(str, "%dx%d", cx, cy); Revision-number: 298 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 1999-11-11T10:27:09.000000Z K 7 svn:log V 49 Put a #ifndef around definition of TCS_MULTILINE K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ea5335b3ead2352208359050b82ff772 Text-delta-base-sha1: 081f7a916c5f5fab9e12fb12dd7b313fb9900f90 Text-content-length: 168 Text-content-md5: f7b8728287622bc1929d8189bd9ace6a Text-content-sha1: b43180db18d005475f711544e6954870bfe8519a Content-length: 208 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN lW3#include /* Some systems don't define this, so I do it myself if necessary */ #ifndef TCS_MULTILINE #define TCS_MULTILINE 0x0200 #endif Revision-number: 299 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.258909Z PROPS-END Revision-number: 300 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.265834Z PROPS-END Revision-number: 301 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.272672Z PROPS-END Revision-number: 302 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.281598Z PROPS-END Revision-number: 303 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.290628Z PROPS-END Revision-number: 304 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.300140Z PROPS-END Revision-number: 305 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.310466Z PROPS-END Revision-number: 306 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.320610Z PROPS-END Revision-number: 307 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.328878Z PROPS-END Revision-number: 308 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.338992Z PROPS-END Revision-number: 309 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.347910Z PROPS-END Revision-number: 310 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.355582Z PROPS-END Revision-number: 311 Prop-content-length: 309 Content-length: 309 K 7 svn:log V 208 Declare `struct RSAKey' so that its implicit declaration in the parameter list of verify_ssh_host_key() does not have scope restricted to that parameter list. Probably unnecessary but let's not take chances. K 10 svn:author V 5 simon K 8 svn:date V 27 1999-11-15T10:31:06.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 68a3cdedfc58531e92cd2b19cd454222 Text-delta-base-sha1: 7f3fae8f85bfa7cd8ce87e13487edb9fc3b8afa5 Text-content-length: 79 Text-content-md5: f58c1b36532d1048a5268a682deebd9e Text-content-sha1: ca7ab03724e93e94af480816ffec842943f80f2b Content-length: 119 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN^ :&:$struct RSAKey; /* be a little careful of scope */ Revision-number: 312 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 1999-11-16T09:26:19.000000Z K 7 svn:log V 89 Update from Joris van Rantwijk: command line options to specify port and password in scp K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ebad092216caba10216239dc7a64ffb8 Text-delta-base-sha1: 9ce909a782e9c3e7b858be44933c4766901ff768 Text-content-length: 881 Text-content-md5: 649ea2f0fa7c6d0196bcea657cb0a909 Text-content-sha1: 4b1e365d8931de10078350647fc7986f9a3c4c70 Content-length: 920 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNP-6UIPR r7jfc B, Novportnumber = 0; static char *password = NULL, i; if (password) { strncpy(str, password, maxlen); str[maxlen-1] = '\0'; password = NULL; return; }if (portnumber) cfg.port = portnumber;Usage: scp [options] [user@]host:source target\n"); printf(" scp [options] source [source...] [user@]host:target\n"); printf("Options:\n"); printf(" -p preserve file attributes\n"); printf(" -q quiet, don't show statistics\n"); printf(" -r copy directories recursively\n"); printf(" -v show verbose messages\n"); printf(" -P port connect to specified port\n"); printf(" -pw passw login with specified passwordP") == 0 && i+1 < argc) portnumber = atoi(argv[++i]); else if (strcmp(argv[i], "-pw") == 0 && i+1 < argc) password = argv[++i] Revision-number: 313 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 1999-11-16T09:57:40.000000Z K 7 svn:log V 36 Fix printing of Telnet GA as ugrave K 10 svn:author V 5 simon PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 43212738fa30c4792de25b8cae6af167 Text-delta-base-sha1: 0e51b937607ee035700a63e094c5e43e101df8d5 Text-content-length: 122 Text-content-md5: beec306e3b2b44c8ddcfa2cdc248b3af Text-content-sha1: d8078822a05898d6b3caaeb8d16d5f6d7419961b Content-length: 161 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNn bQbc everything else; print it if it's IAC */ if (c == IAC) { b[0] = c; c_write(b,1); } Revision-number: 314 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.480523Z PROPS-END Revision-number: 315 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.490440Z PROPS-END Revision-number: 316 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.497197Z PROPS-END Revision-number: 317 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 1999-11-17T10:39:17.000000Z K 7 svn:log V 38 Fix a slightly picky compiler warning K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 649ea2f0fa7c6d0196bcea657cb0a909 Text-delta-base-sha1: 4b1e365d8931de10078350647fc7986f9a3c4c70 Text-content-length: 28 Text-content-md5: 998ce19e4ac4963f2ba6d422fbcd7d70 Text-content-sha1: 4172ea1eed6c6492071924f96c3b95dff12029ff Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN! (int) Revision-number: 318 Prop-content-length: 147 Content-length: 147 K 7 svn:log V 47 Add ISO-8859-2 / Win-1250 char set translation K 10 svn:author V 5 simon K 8 svn:date V 27 1999-11-17T10:44:43.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f58c1b36532d1048a5268a682deebd9e Text-delta-base-sha1: ca7ab03724e93e94af480816ffec842943f80f2b Text-content-length: 31 Text-content-md5: 2d661f432ef2048851695a093c06276c Text-content-sha1: e3fdbdbc28e41487a4de320d067fb046d4801290 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN3 fCW88592w1250 Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8e27448660d847229b288a2ecbbd548b Text-delta-base-sha1: bce46f36962880d63e36e62c6b4bc0d9bfb14adf Text-content-length: 163 Text-content-md5: 37a9f78f5b5bcd79fe27bd11d182c1e7 Text-content-sha1: ef1938a1af0364826fdfc3b61a85f506aec98138 Content-length: 203 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNUXLATSTATIC 1001 #define IDC6_NOXLAT 1002 #define IDC6_KOI8WIN1251 1003 #define IDC6_88592WIN1250 1004 #define IDC6_CAPSLOCKCYR 1005 #endif Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f7b8728287622bc1929d8189bd9ace6a Text-delta-base-sha1: b43180db18d005475f711544e6954870bfe8519a Text-content-length: 404 Text-content-md5: e9d8843ca6488875b27f677614c958af Text-content-sha1: 926636de7e64e81cff7870204dd6a2c72fd42a98 Content-length: 444 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNl, | |$HLTEXT "Character set translation:", IDC6_XLATSTATIC, 3, 3, 162, 8 AUTORADIOBUTTON "&None", IDC6_NOXLAT, 3, 12, 162, 10, WS_GROUP AUTORADIOBUTTON "&KOI8 / Win-1251", IDC6_KOI8WIN1251, 3, 22, 162, 10 AUTORADIOBUTTON "&ISO-8859-2 / Win-1250", IDC6_88592WIN1250, 3, 32, 162, 10 AUTOCHECKBOX "&CAPS LOCK acts as cyrillic switch", IDC6_CAPSLOCKCYR, 3, 46, 162 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f79101f2c21ce3afb6f916adeb7ee176 Text-delta-base-sha1: ca0f3d33d058b9f5640b4cf6d49041e44d759736 Text-content-length: 488 Text-content-md5: 626b67c219a133c64c2195be928bcbf9 Text-content-sha1: 68d20ff499448c54c2f4a75e119f335778377e25 Content-length: 528 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN4!#7,l2"pS-88592Xlat", cfg.xlat_88592w125088592Xlat", 0, &cfg.xlat_88592w1250RadioButton (hwnd, IDC6_NOXLAT, IDC6_88592WIN1250, cfg.xlat_88592w1250 ? IDC6_88592WIN1250 : cfg.xlat_enablekoiwin ? IDC6_KOI8WIN1251 : IDC6_NOXLATNOXLAT: case IDC6_KOI8WIN1251: case IDC6_88592WIN1250: cfg.xlat_enablekoiwin = IsDlgButtonChecked (hwnd, IDC6_KOI8WIN1251); cfg.xlat_88592w1250 = IsDlgButtonChecked (hwnd, IDC6_88592WIN1250); Node-path: putty/xlat.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7bc578df73bc0fb598c2f7369199c4ed Text-delta-base-sha1: a533fadc8b939688468e5dd5b68610f53072a4cc Text-content-length: 789 Text-content-md5: f6d96eca8448709bb766183bfdad6825 Text-content-sha1: ebc95ebefb0396a5cc906492b8f7397f6e97a85a Content-length: 828 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN{5T(-ug-&uz0gQ;~tstatic unsigned char xlatWIN1250toISO88592[] 39,131, 34, 46,124,124,136, 47,169, 60,166,171,174,172, 144, 96, 39, 34, 34, 42, 45, 45,152, 84,185, 62,182,187,190,188, 160,183,162,163,164,161,124,167,168, 99,170, 34, 39,173, 82,175, 176, 63,178,179,180,117,182,255,184,177,186, 34,165,189,181static unsigned char xlatISO88592toWIN1250[] 5,162,163,164,188,140,167,168,138,170,141,143,173,142,175, 176,185,178,179,180,190,156,161,184,154,186,157,159,189,158else if (cfg.xlat_88592w1250) return xlatWIN1250toISO88592[c]; return c; } unsigned char xlat_tty2scr(unsigned char c) { if(cfg.xlat_enablekoiwin) return koi2win[c]; else if (cfg.xlat_88592w1250) return xlatISO88592toWIN1250 Revision-number: 319 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.649772Z PROPS-END Revision-number: 320 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.659488Z PROPS-END Revision-number: 321 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 1999-11-17T14:00:45.000000Z K 7 svn:log V 46 Remove accelerator conflict in Language panel K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e9d8843ca6488875b27f677614c958af Text-delta-base-sha1: 926636de7e64e81cff7870204dd6a2c72fd42a98 Text-content-length: 24 Text-content-md5: 7fea1033d222947e5f8454c137a7263a Text-content-sha1: e7029585c1680034bce5fc0090ba48195ed9c269 Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN,, ?jBCA& Revision-number: 322 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 1999-11-17T14:00:45.000000Z K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-48'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-0.48 Node-kind: dir Node-action: add Node-copyfrom-rev: 321 Node-copyfrom-path: putty Revision-number: 323 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 1999-11-17T14:22:12.000000Z K 7 svn:log V 41 Fix potential segfault on malloc failure K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fe6ff1e692e47ce3e58e03a9543c28f2 Text-delta-base-sha1: 452a63c3842ad9756c4573123275bbbbfd7bbdaf Text-content-length: 97 Text-content-md5: c8f58c2110f56b23d126678ce3ad74df Text-content-sha1: 1eac2c9120986669fb2c08c064ef62a936db961a Content-length: 137 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNFZFvelse { sprintf(cl, "putty @%s", session); freecl = TRUE; } Revision-number: 324 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:58.762307Z PROPS-END Revision-number: 325 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 1999-11-22T10:07:24.000000Z K 7 svn:log V 56 Cleanups to remove warnings for GNU/mingw32 compilation K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1d59f68b54e6c83422d68a05b3087894 Text-delta-base-sha1: 980bab6f929cbbe996196091530d49b7da1bbe69 Text-content-length: 71 Text-content-md5: fd5ba23333161f7a2a8a3131c9f8584d Text-content-sha1: c3a84b3483c612c860967ea23f2d8e5ab6f95b44 Content-length: 110 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN17z$#include #include #include (int *)int c0, c1, c2; sprintf(buf, "Colour%d", i); gpps (sesskey, buf, defaults[i], buf2, sizeof(buf2)); if(sscanf(buf2, "%d,%d,%d", &c0, &c1, &c2) == 3) { cfg.colours[i][0] = c0; cfg.colours[i][1] = c1; cfg.colours[i][2] = c2; }(HWND) Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c8f58c2110f56b23d126678ce3ad74df Text-delta-base-sha1: 1eac2c9120986669fb2c08c064ef62a936db961a Text-content-length: 52 Text-content-md5: 53138cad944ceca615469ea526c352e7 Text-content-sha1: 5b50db4b82f58559d523b447bc83f7da86c8167a Content-length: 92 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN'gcSsMI#include send ("PuTTY\r", 6); break; case '\007': beep(); disptop = scrtopseen_disp_eventseen_disp_event if (cfg.lfhascr) curs_x = 0; fix_cpos; wrapnext = FALSE; seen_disp_event = 1seen_disp_event = TRUE; break; } } else switch (termstate) { case TOPLEVEL: if (c >= ' ' && c != 0234) { if (wrapnext) { cpos[1] = ATTR_WRAPPED; if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; curs_x = 0; fix_cpos; wrapnext = FALSE; nl_count++; } if (insert) insch (1); check_selection (cpos, cpos+1); *cpos++ = xlat_tty2scr((unsigned char)c) | curr_attr | (c <= 0x7F ? cset_attr[cset] : ATTR_ASCII); curs_x++; if (curs_x == cols) { cpos--; curs_x--; wrapnext = wrap; } seen_disp_event = 1; } break; seen_disp_eventseen_disp_event = TRUEseen_disp_event = TRUEseen_disp_event = TRUE; break; case 'Zc': /* restore power-on settings */ power_on(); fix_cpos; disptop = scrtop; seen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventTRUE); seen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_eventseen_disp_event Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 53138cad944ceca615469ea526c352e7 Text-delta-base-sha1: 5b50db4b82f58559d523b447bc83f7da86c8167a Text-content-length: 326 Text-content-md5: 47fe783a9aaf8c890bef3e4e9149e254 Text-content-sha1: f7c8ece55a3e1a3b0ac0c58863785eadf43bf0c8 Content-length: 366 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN'd#vDKm_' * Choose unscroll method */ unscroll_event = US_DISPRecord that we pressed key so the scroll window can be reset, but * be careful to avoid Shift-UP/Down */ if( wParam != VK_SHIFT && wParam != VK_PRIOR && wParam != VK_NEXT ) { seen_key_event = 1; } Revision-number: 329 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 1999-11-30T11:13:33.000000Z K 7 svn:log V 49 Oops - fix total idiocies in applying that patch K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e2a7192e63abe52ddcd485da594e0ea4 Text-delta-base-sha1: 5bcea6c52362f5288939ff8fac854344cdd8e961 Text-content-length: 22 Text-content-md5: 33ce96afd9193499a44ed9f5308e0490 Text-content-sha1: ba4ab8961a57fc91f9b08578affd8d5e02ae37cb Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNnn uxvT Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 362024338a3de5bcb767522c03325ccb Text-delta-base-sha1: 8e89cf46013bb446e96af5cf333135883111227a Text-content-length: 18 Text-content-md5: a7665f6e0ce7b2ce2e3b18c50b6e912e Text-content-sha1: 803018d04de8f99f2e53acf11119e449150aa98a Content-length: 58 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNcc+ Revision-number: 330 Prop-content-length: 161 Content-length: 161 K 7 svn:log V 61 Turn #ifdef LOG into a command-line option for debugging use K 10 svn:author V 5 simon K 8 svn:date V 27 1999-11-30T11:22:30.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 33ce96afd9193499a44ed9f5308e0490 Text-delta-base-sha1: ba4ab8961a57fc91f9b08578affd8d5e02ae37cb Text-content-length: 41 Text-content-md5: 37788c706c8a5fc92e38c53594abf4ab Text-content-sha1: 3e5bb7017ceb72cf6ef34ce845a456968364db76 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNn c GLOBAL char *logfile Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a7665f6e0ce7b2ce2e3b18c50b6e912e Text-delta-base-sha1: 803018d04de8f99f2e53acf11119e449150aa98a Text-content-length: 300 Text-content-md5: 44db9e11b0383630fa321f041ea0d5b7 Text-content-sha1: 1c61946ef8c1f670d8963208758aaf9c6a16aeaa Content-length: 340 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNcw  Y /* * Optionally log the session traffic to a file. Useful for * debugging and possibly also useful for actual logging. */ if (logfile) { static FILE *fp = NULL; if (!fp) fp = fopen(logfile, "wb"); if (fp) fputc (c, fp); } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 47fe783a9aaf8c890bef3e4e9149e254 Text-delta-base-sha1: f7c8ece55a3e1a3b0ac0c58863785eadf43bf0c8 Text-content-length: 166 Text-content-md5: bdd7ab10167732b88c57b26b30a767f5 Text-content-sha1: 9763ef29db7fd8bc447474ee7f98ba61a0dc6b07 Content-length: 206 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNdw  ^ else if (q == p + 3 && tolower(p[0]) == 'l' && tolower(p[1]) == 'o' && tolower(p[2]) == 'g') { logfile = "putty.log" Revision-number: 331 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 1999-11-30T11:39:04.000000Z K 7 svn:log V 58 Add description of workaround for Visual Studio 6 problem K 10 svn:author V 5 simon PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ac3f153f8c07f827804754799ee7bccf Text-delta-base-sha1: a5ddc35a0d6f83722cc45617525e08d2579feb95 Text-content-length: 558 Text-content-md5: eedadc2f8b231eecbeabf9bb2d6024f9 Text-content-sha1: 66e2db42682e7239a7f11a231bd6f145b337495b Content-length: 597 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN fMS Visual Studio version 6 falls over on the nasty macros in ssh.c. This is a bug in Visual Studio. The culprit is the /ZI compiler option (debug info generation: Edit and Continue). To avoid this problem while compiling PuTTY under VS6, you should: - right-click ssh.c in the FileView - click Settings - select the C/C++ tab and the General category - under `Debug info:', select anything _other_ than `Program Database for Edit and Continue'. Alternatively disable the /ZI option, replacing it with a saner value, such as /Zi Revision-number: 332 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 1999-11-30T11:53:42.000000Z K 7 svn:log V 46 Avoid recursing into . and .. when in -r mode K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ee0dbcf1dc48db577edff935905b1f7e Text-delta-base-sha1: 2bca3a1a5068291bd64c9429022620237245f70b Text-content-length: 510 Text-content-md5: d46bd33d5ddbf522f39375f840f12483 Text-content-sha1: f319eb8ec1fb0b2345a28b6551b7dd8d695505ae Content-length: 549 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN'E d3d.y { /* * Avoid . and .. directories. */ char *p; p = strrchr(src, '/'); if (!p) p = strrchr(src, '\\'); if (!p) p = src; else p++; if (!strcmp(p, ".") || !strcmp(p, "..")) /* skip . and .. */; else rsource(src); } else { run_err("%s: not a regular file", src); } Revision-number: 333 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.180668Z PROPS-END Revision-number: 334 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 1999-12-03T11:32:50.000000Z K 7 svn:log V 46 Replace SHA implementation with homegrown one K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b69a40d3ca1f7a403e60490d00874be3 Text-delta-base-sha1: b07762aa25421251ff327e2718737cefc849910f Text-content-length: 1420 Text-content-md5: 77d1c7ac26672ca3371d525f300a15bc Text-content-sha1: 315375500e6ce02ecd2200e0205782eaf33ed634 Content-length: 1459 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNH}}}/* * SHA core transform algorithm, used here solely as a `stirring' * function for the PuTTY random number pool. Implemented directly * from the specification by Simon Tatham. */ #include "ssh.h" #define rol(x,y) ( ((x) << (y)) | (((word32)x) >> (32-y)) ) void SHATransform(word32 *digest, word32 *block) { word32 w[80]; word32 a,b,c,d,e; int t; for (t = 0; t < 16; t++) w[t] = block[t]; for (t = 16; t < 80; t++) { word32 tmp = w[t-3] ^ w[t-8] ^ w[t-14] ^ w[t-16]; w[t] = rol(tmp, 1); } a = digest[0]; b = digest[1]; c = digest[2]; d = digest[3]; e = digest[4]; for (t = 0; t < 20; t++) { word32 tmp = rol(a, 5) + ( (b&c) | (d&~b) ) + e + w[t] + 0x5a827999; e = d; d = c; c = rol(b, 30); b = a; a = tmp; } for (t = 20; t < 40; t++) { word32 tmp = rol(a, 5) + (b^c^d) + e + w[t] + 0x6ed9eba1; e = d; d = c; c = rol(b, 30); b = a; a = tmp; } for (t = 40; t < 60; t++) { word32 tmp = rol(a, 5) + ( (b&c) | (b&d) | (c&d) ) + e + w[t] + 0x8f1bbcdc; e = d; d = c; c = rol(b, 30); b = a; a = tmp; } for (t = 60; t < 80; t++) { word32 tmp = rol(a, 5) + (b^c^d) + e + w[t] + 0xca62c1d6; e = d; d = c; c = rol(b, 30); b = a; a = tmp; } digest[0] += a; digest[1] += b; digest[2] += c; digest[3] += d; digest[4] += e; } Revision-number: 335 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.266574Z PROPS-END Revision-number: 336 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.275754Z PROPS-END Revision-number: 337 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.283928Z PROPS-END Revision-number: 338 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.290635Z PROPS-END Revision-number: 339 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.297943Z PROPS-END Revision-number: 340 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.305507Z PROPS-END Revision-number: 341 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.311778Z PROPS-END Revision-number: 342 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.317636Z PROPS-END Revision-number: 343 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.326067Z PROPS-END Revision-number: 344 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.334699Z PROPS-END Revision-number: 345 Prop-content-length: 206 Content-length: 206 K 8 svn:date V 27 1999-12-06T14:57:49.000000Z K 7 svn:log V 105 Added keyboard shortcuts on the system menu. I haven't tried to compile it, but the changes are trivial. K 10 svn:author V 5 chris PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bdd7ab10167732b88c57b26b30a767f5 Text-delta-base-sha1: 9763ef29db7fd8bc447474ee7f98ba61a0dc6b07 Text-content-length: 414 Text-content-md5: 4e984bf6c3137ace41a5521296a6015b Text-content-sha1: 4d63714a50d1a72565b735bc3dbbfa821fb9612a Content-length: 454 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNwvw][g5B&Event Log"); AppendMenu (m, MF_SEPARATOR, 0, 0); AppendMenu (m, MF_ENABLED, IDM_NEWSESS, "Ne&w Session"); AppendMenu (m, MF_ENABLED, IDM_DUPSESS, "&&ved Sessions"); AppendMenu (m, MF_ENABLED, IDM_RECONF, "Chan&ge Settings"); AppendMenu (m, MF_SEPARATOR, 0, 0); AppendMenu (m, MF_ENABLED, IDM_CLRSB, "C&lear Scrollback"); AppendMenu (m, MF_ENABLED, IDM_RESET, "Rese&& Revision-number: 346 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.393461Z PROPS-END Revision-number: 347 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.403805Z PROPS-END Revision-number: 348 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 1999-12-09T17:10:28.000000Z K 7 svn:log V 50 Oops - that unscroll stuff was a little broken... K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 44db9e11b0383630fa321f041ea0d5b7 Text-delta-base-sha1: 1c61946ef8c1f670d8963208758aaf9c6a16aeaa Text-content-length: 26 Text-content-md5: be32ebca5f8ccffa3ab2c96f4470e9d7 Text-content-sha1: d4bfb7027bd6f1013a187a1764171c979e8c3ccf Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNww XZ|| Revision-number: 349 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 37 Add multi-makefile management system K 10 svn:author V 5 simon K 8 svn:date V 27 1999-12-13T17:21:42.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7b938b3c34a93b334ce03ee53b36341d Text-delta-base-sha1: 596092ea1484875f40d42617d459d6f17df5b7c8 Text-content-length: 2833 Text-content-md5: 5d61a77390f50c9b46458ea5e1f4876a Text-content-sha1: 01dcb237b1399875bb80e2c9b023e001c8061c9e Content-length: 2873 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNcirdVbJ8M W# Visual C++ Makefile for PuTTY. # # Use `nmake' to build. # ##-- help # # Extra options you can set: # # - FWHACK=/DFWHACK # Enables a hack that tunnels through some firewall proxies. # # - VER=/DSNAPSHOT=1999-01-25 # Generates executables whose About box report them as being a # development snapshot. # # - VER=/DRELEASE=0.43 # Generates executables whose About box report them as being a # release version. # # - COMPAT=/DWIN32S_COMPAT # Generates a binary that works (minimally) with Win32s. # ##--OBJ=obj RES=res ##-- objects putty POBJS1 = window.$(OBJ) windlg.$(OBJ) terminal.$(OBJ) telnet.$(OBJ) raw.$(OBJ) POBJS2 = xlat.$(OBJ) ldisc.$(OBJ) sizetip.$(OBJ) ssh.$(OBJ) ##-- objects pscp SOBJS = scp.$(OBJ) windlg.$(OBJ) scpssh.$(OBJ) ##-- objects putty pscp OBJS1 = misc.$(OBJ) noise.$(OBJ) OBJS2 = sshcrc.$(OBJ) sshdes.$(OBJ) sshmd5.$(OBJ) sshrsa.$(OBJ) sshrand.$(OBJ) OBJS3 = sshsha.$(OBJ) sshblowf.$(OBJ) version.$(OBJ) ##-- resources putty PRESRC = win_res.$(RES) ##-- resources pscp SRESRC = scp.$(RES) ##-- ##-- gui-apps # putty ##-- console-apps # pscp ##-- LIBS1 = advapi32.lib user32.lib gdi32.lib LIBS2 = wsock32.lib comctl32.lib comdlg32.lib all: putty.exe pscp.exe putty.exe: $(POBJS1) $(POBJS2) $(OBJS1) $(OBJS2) $(OBJS3) $(PRESRC) link.rsp link /debug -out:putty.exe @link.rsp pscp.exe: $(SOBJS) $(OBJS1) $(OBJS2) $(OBJS3) $(SRESRC) scp.rsp link /debug -out:pscp.exe @scpPscp.rsp: makefile echo /nologo /subsystem:console > scp.rsp echo $(SOBJS) >> scp.rsp echo $(OBJS1) >> scp.rsp echo $(OBJS2) >> scp.rsp echo $(OBJS3) >> scp.rsp echo $(SRESRC) >> scp.rsp echo $(LIBS1) >> scp.rsp echo $(LIBS2) >> scp.rsp ##-- dependencies window.$(OBJ): window.c putty.h win_res.h windlg.$(OBJ): windlg.c putty.h ssh.h win_res.h terminal.$(OBJ): terminal.c putty.h sizetip.$(OBJ): sizetip.c putty.h telnet.$(OBJ): telnet.c putty.h raw.$(OBJ): raw.c putty.h xlat.$(OBJ): xlat.c putty.h ldisc.$(OBJ): ldisc.c putty.h misc.$(OBJ): misc.c putty.h noise.$(OBJ): noise.c putty.h ssh.h ssh.$(OBJ): ssh.c ssh.h putty.h sshcrc.$(OBJ): sshcrc.c ssh.h sshdes.$(OBJ): sshdes.c ssh.h sshmd5.$(OBJ): sshmd5.c ssh.h sshrsa.$(OBJ): sshrsa.c ssh.h sshsha.$(OBJ): sshsha.c ssh.h sshrand.$(OBJ): sshrand.c ssh.h sshblowf.$(OBJ): sshblowf.c ssh.h scp.$(OBJ): scp.c putty.h scp.h scpssh.$(OBJ): scpssh.c putty.h ssh.h scp.h version.$(OBJ): version.c ##-- # Hack to force version.obj to be rebuilt always version.obj: versionpseudotarget @echo (built version.obj) versionpseudotarget: cl $(FWHACK) $(VER) $(CFLAGS) /c version.c ##-- dependencies win_res.$(RES): win_res.rc win_res.h putty.ico ##-- win_res.$(RES): rc $(FWHACK) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 win_res.rc ##-- dependencies scp.$(RES): scp.rc scp.ico ##-- scp.$(RES): rc $(FWHACK) Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eedadc2f8b231eecbeabf9bb2d6024f9 Text-delta-base-sha1: 66e2db42682e7239a7f11a231bd6f145b337495b Text-content-length: 316 Text-content-md5: 36efa246bcc08f383eedbe8ba68e053f Text-content-sha1: b910abb0dea28e136e3d8a195ea604d5e07ae063 Content-length: 355 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN; $1$f.For other compilers, some alternative Makefiles are provided. These Makefiles are generated automatically from the master `Makefile' by the Perl script `mkfiles.pl'. Additions and corrections to the script are more useful than additions and corrections to the alternative Makefiles themselves Node-path: putty/mkfiles.pl Node-kind: file Node-action: add Prop-content-length: 142 Text-delta: true Text-content-length: 4347 Text-content-md5: b1841428a146711d9451d7317f1c47cc Text-content-sha1: 7620d45597afa0dc3d98384b1b9137b7891659d3 Content-length: 4489 K 14 svn:executable V 1 * K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNmmm#!/usr/bin/env perl # # Makefile generator. # Produces the other PuTTY makefiles from the master one. open IN,"Makefile"; @current = (); while () { chomp; if (/^##--/) { @words = split /\s+/,$_; shift @words; # remove ##-- $i = shift @words; # first word if (!defined $i) { # no words @current = (); } elsif (!defined $words[0]) { # only one word @current = ($i); } else { # at least two words @current = map { $i . "." . $_ } @words; foreach $i (@words) { $projects{$i} = $i; } push @current, "objdefs"; } } else { foreach $i (@current) { $store{$i} .= $_ . "\n"; } } } close IN; @projects = keys %projects; foreach $i (split '\n',$store{'gui-apps'}) { $i =~ s/^# //; $gui{$i} = 1; } foreach $i (split '\n',$store{'console-apps'}) { $i =~ s/^# //; $gui{$i} = -0; } sub project { my ($p) = @_; my ($q) = $store{"$p"} . $store{"objects.$p"} . $store{"resources.$p"}; $q =~ s/(\S+)\s[^\n]*\n/\$($1) /gs; $q =~ s/ $//; $q; } sub projlist { my ($p) = @_; my ($q) = $store{"$p"} . $store{"objects.$p"} . $store{"resources.$p"}; $q =~ s/(\S+)\s[^\n]*\n/$1 /gs; my (@q) = split ' ',$q; @q; } ##-- CygWin makefile open OUT, ">Makefile.cyg"; select OUT; print "# Makefile for PuTTY under cygwin.\n"; # gcc command line option is -D not /D ($_ = $store{"help"}) =~ s/=\/D/=-D/gs; print $_; print "\n". "# You can define this path to point at your tools if you need to\n". "# TOOLPATH = c:\\cygwin\\bin\\ # or similar, if you're running Windows\n". "# TOOLPATH = /pkg/mingw32msvc/i386-mingw32msvc/bin/\n". "CC = \$(TOOLPATH)gcc\n". "RC = \$(TOOLPATH)windres\n". "# You may also need to tell windres where to find include files:\n". "# RCINC = --include-dir c:\\cygwin\\include\\\n". "\n". "CFLAGS = -g -O2 -D_WINDOWS -DDEBUG\n". "RCFLAGS = \$(RCINC) --define WIN32=1 --define _WIN32=1 --define WINVER=0x0400\n". "LIBS = -ladvapi32 -luser32 -lgdi32 -lwsock32 -lcomctl32 -lcomdlg32\n". "OBJ=o\n". "RES=res\n". "\n"; print $store{"objdefs"}; print "\n". ".SUFFIXES:\n". "\n". "%.o %.obj: %.c\n". "\t\$(CC) \$(FWHACK) \$(CFLAGS) -c \$<\n". "\n". "%.res: %.rc\n". "\t\$(RC) \$(FWHACK) \$(RCFLAGS) \$<\n". "\n"; foreach $p (@projects) { print $p, ".exe: ", &project($p), "\n"; print "\t\$(CC) \$(LDFLAGS) -o \$@ " . &project($p), " \$(LIBS)\n\n"; } print $store{"dependencies"}; print "\n". "version.o: FORCE\n". "# Hack to force version.o to be rebuilt always\n". "FORCE:\n". "\t\$(CC) \$(FWHACK) \$(CFLAGS) \$(VER) -c \$<\n\n". "clean:\n". "\trm -f *.o *.exe *.res\n". "\n"; select STDOUT; close OUT; ##-- Borland makefile open OUT, ">Makefile.bor"; select OUT; print "# Makefile for PuTTY under Borland C.\n"; # bcc32 command line option is -D not /D ($_ = $store{"help"}) =~ s/=\/D/=-D/gs; print $_; print "\n". "# If you rename this file to `Makefile', you should change this line,\n". "# so that the .rsp files still depend on the correct makefile.\n". "MAKEFILE = Makefile.bor\n". "\n". "# Stop windows.h including winsock2.h which would conflict with winsock 1\n". "CFLAGS = -DWIN32_LEAN_AND_MEAN\n". "\n". "# Get include directory for resource compiler\n". "!if !\$d(BCB)\n". "BCB = \$(MAKEDIR)\\..\n". "!endif\n". "\n". ".c.obj:\n". "\tbcc32 \$(COMPAT) \$(FWHACK) \$(CFLAGS) /c \$*.c\n". ".rc.res:\n". "\tbrc32 \$(FWHACK) -i \$(BCB)\\include \\\n". "\t\t-r -DWIN32 -D_WIN32 -DWINVER=0x0400 \$*.rc\n". "\n". "OBJ=obj\n". "RES=res\n". "\n"; print $store{"objdefs"}; print "\n"; print "all:"; print map { " $_.exe" } @projects; print "\n\n"; foreach $p (@projects) { print $p, ".exe: ", &project($p), " $p.rsp\n"; $tw = $gui{$p} ? " -tW" : ""; print "\tbcc32$tw -e$p.exe \@$p.rsp\n"; print "\tbrc32 -fe$p.exe " . (join " ", &project("resources.$p")) . "\n\n"; } foreach $p (@projects) { print $p, ".rsp: \$(MAKEFILE)\n"; $arrow = ">"; foreach $i (&projlist("objects.$p")) { print "\techo \$($i) $arrow $p.rsp\n"; $arrow = ">>"; } print "\n"; } print $store{"dependencies"}; print "\n". "version.o: FORCE\n". "# Hack to force version.o to be rebuilt always\n". "FORCE:\n". "\tbcc32 \$(FWHACK) \$(VER) \$(CFLAGS) /c version.c\n\n". "clean:\n". "\tdel *.obj\n". "\tdel *.exe\n". "\tdel *.res\n". "\tdel *.pch\n". "\tdel *.aps\n". "\tdel *.ilk\n". "\tdel *.pdb\n". "\tdel *.rsp\n"; select STDOUT; close OUT; Revision-number: 350 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 1999-12-14T09:29:55.000000Z K 7 svn:log V 39 Couple of bug fixes to cygwin makefile K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b1841428a146711d9451d7317f1c47cc Text-delta-base-sha1: 7620d45597afa0dc3d98384b1b9137b7891659d3 Text-content-length: 177 Text-content-md5: f95e242a611a11a75e90feedc8cf868b Text-content-sha1: 3482151433e874f2f3bb6865ab9198c3e8a33c48 Content-length: 216 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNmiM raVo\n". "\n"; print $store{"objdefs"}; print "\n". ".SUFFIXES:\n". "\n". "%.o: %.c\n". "\t\$(CC) \$(FWHACK) \$(CFLAGS) -c \$<\n". "\n". "%.oversion.c Revision-number: 351 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.573623Z PROPS-END Revision-number: 352 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.581500Z PROPS-END Revision-number: 353 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.590873Z PROPS-END Revision-number: 354 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.599444Z PROPS-END Revision-number: 355 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.608516Z PROPS-END Revision-number: 356 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.619375Z PROPS-END Revision-number: 357 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 1999-12-21T10:19:05.000000Z K 7 svn:log V 43 Disable warn-on-close for inactive windows K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 37788c706c8a5fc92e38c53594abf4ab Text-delta-base-sha1: 3e5bb7017ceb72cf6ef34ce845a456968364db76 Text-content-length: 46 Text-content-md5: 79f329d8ba1e29d37ed8601f5ed7d8b1 Text-content-sha1: a83174f1e74b5625cad46759347c5d8d36fd29bd Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN!  }GLOBAL int session_closed Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4e984bf6c3137ace41a5521296a6015b Text-delta-base-sha1: 4d63714a50d1a72565b735bc3dbbfa821fb9612a Text-content-length: 118 Text-content-md5: 2f5a596986b0dba5c21c3b4117953d8f Text-content-sha1: 54e468e546df500c04ccfbc7def2fb2c6f6d3ac1 Content-length: 158 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNYP`"^session_closed = FALSE; session_closed session_closed = TRUE; Revision-number: 358 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.769040Z PROPS-END Revision-number: 359 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.777675Z PROPS-END Revision-number: 360 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.787638Z PROPS-END Revision-number: 361 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.796999Z PROPS-END Revision-number: 362 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.804087Z PROPS-END Revision-number: 363 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.815719Z PROPS-END Revision-number: 364 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.827786Z PROPS-END Revision-number: 365 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.835600Z PROPS-END Revision-number: 366 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.849413Z PROPS-END Revision-number: 367 Prop-content-length: 173 Content-length: 173 K 7 svn:log V 73 New option to allow SysTabControl32 to be specified in ASCII not Unicode K 10 svn:author V 5 simon K 8 svn:date V 27 2000-01-18T18:14:07.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5d61a77390f50c9b46458ea5e1f4876a Text-delta-base-sha1: 01dcb237b1399875bb80e2c9b023e001c8061c9e Text-content-length: 267 Text-content-md5: ca829d1776e52da32e2e2995442da5be Text-content-sha1: b09ac831de6122aea4aac2554b917070502f5330 Content-length: 307 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN ssu - CFL=/DASCIICTLS # Uses ASCII rather than Unicode to specify the tab control in # the resource file. Probably most useful when compiling with # Cygnus/mingw32, whose resource compiler may have less of a # problem with it Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7fea1033d222947e5f8454c137a7263a Text-delta-base-sha1: e7029585c1680034bce5fc0090ba48195ed9c269 Text-content-length: 295 Text-content-md5: 4b113dda2adb155579f68b477dfc2ada Text-content-sha1: 61625cd61b2eec12bdf4ce20914d681346e7efa3 Content-length: 335 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN,.ws7)y|) #ifdef ASCIICTLS "SysTabControl32", #else L"SysTabControl32", #endif TCS_MULTILINE | WS_TABSTOP, #ifdef ASCIICTLS "SysTabControl32", #else L"SysTabControl32", #endif TCS_MULTILINE | WS_TABSTOP, 3, 3, 174, 193 END IDD_PANEL0 Revision-number: 368 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.905893Z PROPS-END Revision-number: 369 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:06:59.914489Z PROPS-END Revision-number: 370 Prop-content-length: 136 Content-length: 136 K 7 svn:log V 36 Fix FORCE target in Cygwin makefile K 10 svn:author V 5 simon K 8 svn:date V 27 2000-01-19T12:11:38.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f95e242a611a11a75e90feedc8cf868b Text-delta-base-sha1: 3482151433e874f2f3bb6865ab9198c3e8a33c48 Text-content-length: 26 Text-content-md5: 22e8edd9136ccf2ef99fb6fe00001e8e Text-content-sha1: ac1b51c250e977267fbecc72172e10465a95adfe Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNijYH<H!; Revision-number: 371 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2000-01-19T12:16:19.000000Z K 7 svn:log V 54 Fix problems with resource compilation Makefile lines K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ca829d1776e52da32e2e2995442da5be Text-delta-base-sha1: b09ac831de6122aea4aac2554b917070502f5330 Text-content-length: 45 Text-content-md5: 7ebca2c1d1d83ac2d99d016067875f68 Text-content-sha1: 282a9d546c14066cc25b59efd452196d3158628e Content-length: 85 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN ]~v rR$(RCFL$(RCFL Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 22e8edd9136ccf2ef99fb6fe00001e8e Text-delta-base-sha1: ac1b51c250e977267fbecc72172e10465a95adfe Text-content-length: 56 Text-content-md5: 3a1f83b9a2bfb478a0854656cd7d022a Text-content-sha1: c27ed8b3cea7bacea6b174d6f3303b5771bb2d2a Content-length: 95 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNj~wo{) \$(RCFLAGS) \$< \$\@\$(RCFL Revision-number: 372 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:00.371608Z PROPS-END Revision-number: 373 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:00.639951Z PROPS-END Revision-number: 374 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:00.701503Z PROPS-END Revision-number: 375 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2000-01-28T20:20:58.000000Z K 7 svn:log V 37 Joris van Rantwijk's fix for pscp -P K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d46bd33d5ddbf522f39375f840f12483 Text-delta-base-sha1: f319eb8ec1fb0b2345a28b6551b7dd8d695505ae Text-content-length: 71 Text-content-md5: eab71d59872759d64ebcdb2d3d6384b3 Text-content-sha1: 3ee13d5544a422f5a548a705084f59c72e7b12e4 Content-length: 110 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNE5&O"|.)if (portnumber) cfg.port = portnumber Revision-number: 376 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.149919Z PROPS-END Revision-number: 377 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.161163Z PROPS-END Revision-number: 378 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.171113Z PROPS-END Revision-number: 379 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.180583Z PROPS-END Revision-number: 380 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.189859Z PROPS-END Revision-number: 381 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.200190Z PROPS-END Revision-number: 382 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.208640Z PROPS-END Revision-number: 383 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.218230Z PROPS-END Revision-number: 384 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.227795Z PROPS-END Revision-number: 385 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.236967Z PROPS-END Revision-number: 386 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.246993Z PROPS-END Revision-number: 387 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.256063Z PROPS-END Revision-number: 388 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.263709Z PROPS-END Revision-number: 389 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2000-02-20T11:01:00.000000Z K 7 svn:log V 66 Joris van Rantwijk's fixes for cygwin (NB includes WIN32S_COMPAT) K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3a1f83b9a2bfb478a0854656cd7d022a Text-delta-base-sha1: c27ed8b3cea7bacea6b174d6f3303b5771bb2d2a Text-content-length: 220 Text-content-md5: aeeabe371562f3966d915716badeff48 Text-content-sha1: 01c44ee4fefb56b1453dc77234b0188f8ff5baf3 Content-length: 259 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN 2h0 MUCsmno-cygwin -Wall -O2 -D_WINDOWS -DDEBUG -DWIN32S_COMPAT -D_NO_OLDNAMES -I.\n". "LDFLAGS = -mno-cygwin -sres.resmy $mw = $gui{$p} ? " -mwindows" : ""; print "\t\$(CC)" . $mw . " Revision-number: 390 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2000-02-21T14:20:19.000000Z K 7 svn:log V 29 Fix an error message in pscp K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eab71d59872759d64ebcdb2d3d6384b3 Text-delta-base-sha1: 3ee13d5544a422f5a548a705084f59c72e7b12e4 Text-content-length: 28 Text-content-md5: bd4e47b8e9b6410fd0775223268ff52d Text-content-sha1: e3d0b4a9d613fd77483e50ff2d423c9392034208 Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN5:  , src Revision-number: 391 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.412977Z PROPS-END Revision-number: 392 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.420756Z PROPS-END Revision-number: 393 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.428250Z PROPS-END Revision-number: 394 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:01.436841Z PROPS-END Revision-number: 395 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 Borland makefile should now work sanely with the free-beer bcc55 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-03-08T09:41:17.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aeeabe371562f3966d915716badeff48 Text-delta-base-sha1: 01c44ee4fefb56b1453dc77234b0188f8ff5baf3 Text-content-length: 757 Text-content-md5: 779285c42a82b24a0d85f42e0686cb64 Text-content-sha1: d21d4cc3f5b63819d042fea0b4d0f56b549946c1 Content-length: 796 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN .K&c&JB17Nn++c32 \$(FWHACK) \$(RCFL) -i \$(BCB)\\include \\\n". "\t\t-r -DNO_WINRESRC_Hap = $gui{$p} ? "" : " -ap"; print "\tilink32$ap -Gn -L\$(BCB)\\lib \@$p.rsp\n\n"; } foreach $p (@projects) { print $p, ".rsp: \$(MAKEFILE)\n"; $c0w = $gui{$p} ? "c0w32" : "c0x32"; print "\techo $c0w + > $p.rsp\n"; @objlines = &projlist("objects.$p"); for ($i=0; $i<=$#objlines; $i++) { $plus = ($i < $#objlines ? " +" : ""); print "\techo \$($objlines[$i])$plus >> $p.rsp\n"; } print "\techo $p.exe >> $p.rsp\n"; print "\techo nul,cw32 import32, >> $p.rsp\n"; print "\techo " . (join " ", &project("resources.$p")) . " >> $p.rsp\n";*\n". "\tdel *.pdb\n". "\tdel *.rsp\n". "\tdel *.tds\n". "\tdel *.\$\$\$\$\$\$ Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b113dda2adb155579f68b477dfc2ada Text-delta-base-sha1: 61625cd61b2eec12bdf4ce20914d681346e7efa3 Text-content-length: 125 Text-content-md5: 2124eaca3e81c7af7347a3b834538e2d Text-content-sha1: 5c8185bfb7c0faab4844142b16f36784f59adf5f Content-length: 165 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN.ll/* Some compilers, like Borland, don't have winresrc.h */ #ifndef NO_WINRESRC_H #include #endif Revision-number: 396 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2000-03-08T10:21:13.000000Z K 7 svn:log V 68 Fix some picky compiler warnings kindly provided by Borland C++ 5.5 K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fd5ba23333161f7a2a8a3131c9f8584d Text-delta-base-sha1: c3a84b3483c612c860967ea23f2d8e5ab6f95b44 Text-content-length: 20 Text-content-md5: 7c46c16572724610983d10613dc02b0a Text-content-sha1: f138c14ca0687bd027f0615796036a8cdbc1d79d Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN1 k' Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 20cadb9a7b30d69c53f3b5b217d8612d Text-delta-base-sha1: 5e8c931d642d18fe0d124a5fb6dd2d531a519c2f Text-content-length: 20 Text-content-md5: 9a964ff0c5e8e5554801e915ef3fd0d2 Text-content-sha1: 0d733c0205308bd015225029066d3d58c7bd7642 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNM. Kcj Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bd4e47b8e9b6410fd0775223268ff52d Text-delta-base-sha1: e3d0b4a9d613fd77483e50ff2d423c9392034208 Text-content-length: 94 Text-content-md5: 73303c479f38722443008e93ad1d1f6a Text-content-sha1: 1de35040b1f126f458f3e8f236121d8e9dd2fda3 Content-length: 133 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN:U/"_)a(N gZaA"(DWORD)(DWORD)(DWORD)DWORDvoidvoid Node-path: putty/scpssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9f6031fdbe1204e911284875d3897f2b Text-delta-base-sha1: c4ed9bf6f0cb4b66845c78066edf7cb5e10788f6 Text-content-length: 25 Text-content-md5: 2959b938e2111741c86d12e278ed73ad Text-content-sha1: b4471f83f8caaa82f65dccf692afc1d9941a7e6c Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNY] 5$5void Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c73102bed8aa555bdef5bddd03f2eb85 Text-delta-base-sha1: 4d9de5f38d21fcdb08e6bb7f2282f65f99af5e3f Text-content-length: 57 Text-content-md5: 2719ed3b67a112650edc1472d8636a1f Text-content-sha1: f19fd4f6c22dd36060be823d1ee1f56b83e0cb76 Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN7 $<WA(unsigned long)m0 && Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2f5a596986b0dba5c21c3b4117953d8f Text-delta-base-sha1: 54e468e546df500c04ccfbc7def2fb2c6f6d3ac1 Text-content-length: 275 Text-content-md5: 94681a26d6f263cfdc6c62f8956db86b Text-content-sha1: eca28a8ae3f9688b3ffb5cbc8672e893134997ef Content-length: 315 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNY(]Tj^QBxWZposfLRESULT CALLBACKLRESULT CALLBACK WndProc (HWND hwnd, UINT message, EnableSizeTip(1); break; case WM_EXITSIZEMOVE: EnableSizeTip(0); /* break; (never reached) */ Revision-number: 397 Prop-content-length: 251 Content-length: 251 K 8 svn:date V 27 2000-03-08T16:13:32.000000Z K 7 svn:log V 150 New CRC32 implementation, from scratch, not copyrighted by somebody else! Removed Gary S Brown's name from copyrights. Only Eric Young's DES left :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f0d8d51b7edbd7a641c26daf8f4666e Text-delta-base-sha1: 1efb7798f67b69eda57d8bd82220e178d8a81a1b Text-content-length: 84 Text-content-md5: 8448af6d05e84667366226aa28af9f3b Text-content-sha1: e563aaf3942bf25bfdd69aff43144398f3a1497e Content-length: 123 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNI7CCtUPuTTY is copyright 1997-1999 Simon Tatham. Portions copyright Eric Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3cb4494661ce8640e822192e568be205 Text-delta-base-sha1: 0905a97be824b411061756efbaa6edc692cf59cd Text-content-length: 35 Text-content-md5: 1cc6fc431222d4a1d6c6bda3a3d9aaf3 Text-content-sha1: c503054d3813a1e59b2478006e1f151a05abe2d7 Content-length: 74 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN7( "x?void *s, size_ Node-path: putty/sshcrc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5de39024b25f15fc6c2e2c63a29c9d6c Text-delta-base-sha1: d8dd1c263705eb16b5e4088c5ddf299324b4dc6a Text-content-length: 8758 Text-content-md5: 49a2a4ba4a2df38c2e32482826c13d86 Text-content-sha1: 3d03ce32532aee03e787601e3ec775dc13248047 Content-length: 8797 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN)'''/* * CRC32 implementation. * * The basic concept of a CRC is that you treat your bit-string * abcdefg... as a ludicrously long polynomial M=a+bx+cx^2+dx^3+... * over Z[2]. You then take a modulus polynomial P, and compute the * remainder of M on division by P. Thus, an erroneous message N * will only have the same CRC if the difference E = M-N is an * exact multiple of P. (Note that as we are working over Z[2], M-N * = N-M = M+N; but that's not very important.) * * What makes the CRC good is choosing P to have good properties: * * - If its first and last terms are both nonzero then it cannot * be a factor of any single term x^i. Therefore if M and N * differ by exactly one bit their CRCs will guaranteeably * be distinct. * * - If it has a prime (irreducible) factor with three terms then * it cannot divide a polynomial of the form x^i(1+x^j). * Therefore if M and N differ by exactly _two_ bits they will * have different CRCs. * * - If it has a factor (x+1) then it cannot divide a polynomial * with an odd number of terms. Therefore if M and N differ by * _any odd_ number of bits they will have different CRCs. * * - If the error term E is of the form x^i*B(x) where B(x) has * order less than P (i.e. a short _burst_ of errors) then P * cannot divide E (since no polynomial can divide a shorter * one), so any such error burst will be spotted. * * The CRC32 standard polynomial is * x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0 * * In fact, we don't compute M mod P; we compute M*x^32 mod P. * * The concrete implementation of the CRC is this: we maintain at * all times a 32-bit word which is the current remainder of the * polynomial mod P. Whenever we receive an extra bit, we multiply * the existing remainder by x, add (XOR) the x^32 term thus * generated to the new x^32 term caused by the incoming bit, and * remove the resulting combined x^32 term if present by replacing * it with (P-x^32). * * Bit 0 of the word is the x^31 term and bit 31 is the x^0 term. * Thus, multiplying by x means shifting right. So the actual * algorithm goes like this: * * x32term = (crcword & 1) ^ newbit; * crcword = (crcword >> 1) ^ (x32term * 0xEDB88320); * * In practice, we pre-compute what will happen to crcword on any * given sequence of eight incoming bits, and store that in a table * which we then use at run-time to do the job: * * outgoingplusnew = (crcword & 0xFF) ^ newbyte; * crcword = (crcword >> 8) ^ table[outgoingplusnew]; * * where table[outgoingplusnew] is computed by setting crcword=0 * and then iterating the first code fragment eight times (taking * the incoming byte low bit first). * * Note that all shifts are rightward and thus no assumption is * made about exact word length! (Although word length must be at * _least_ 32 bits, but ANSI C guarantees this for `unsigned long' * anyway.) */ #include /* ---------------------------------------------------------------------- * Multi-function module. Can be compiled three ways. * * - Compile with no special #defines. Will generate a table * that's already initialised at compile time, and one function * crc32(buf,len) that uses it. Normal usage. * * - Compile with INITFUNC defined. Will generate an uninitialised * array as the table, and as well as crc32(buf,len) it will * also generate void crc32_init(void) which sets up the table * at run time. Useful if binary size is important. * * - Compile with GENPROGRAM defined. Will create a standalone * program that does the initialisation and outputs the table as * C code. */ #define POLY (0xEDB88320L) #ifdef GENPROGRAM #define INITFUNC /* the gen program needs the init func :-) */ #endif #ifdef INITFUNC /* * This variant of the code generates the table at run-time from an * init function. */ static unsigned long crc32_table[256]; void crc32_init(void) { unsigned long crcword; int i; for (i = 0; i < 256; i++) { unsigned long newbyte, x32term; int j; crcword = 0; newbyte = i; for (j = 0; j < 8; j++) { x32term = (crcword ^ newbyte) & 1; crcword = (crcword >> 1) ^ (x32term * POLY); newbyte >>= 1; } crc32_table[i] = crcword; } } #else /* * This variant of the code has the data already prepared. */ static const unsigned long crc32_table[256] = { 0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL, 0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L, 0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L, 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L, 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL, 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L, 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL, 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L, 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L, 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL, 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L, 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L, 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L, 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL, 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L, 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL, 0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL, 0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L, 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L, 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L, 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL, 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L, 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL, 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L, 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L, 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL, 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L, 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L, 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L, 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL, 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L, 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL, 0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL, 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L, 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L, 0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L, 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL, 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L, 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL, 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L, 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L, 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL, 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L, 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L, 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L, 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL, 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L, 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL, 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL, 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L, 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L, 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L, 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL, 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L, 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL, 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L, 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L, 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL, 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L, 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L, 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L, 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL, 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L, 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL }; #endif #ifdef GENPROGRAM int main(void) { unsigned long crcword; int i; crc32_init(); for (i = 0; i < 256; i++) { printf("%s0x%08XL%s", (i % 4 == 0 ? " " : " "), crc32_table[i], (i % 4 == 3 ? (i == 255 ? "\n" : ",\n") : ",")); } return 0; } #endif unsigned long crc32(const void *buf, size_t len) { unsigned long crcword = 0L; const unsigned char *p = (const unsigned char *) buf; while (len--) { unsigned long newbyte = *p++; newbyte ^= crcword & 0xFFL; crcword = (crcword >> 8) ^ crc32_table[newbyte]; } return crcword; } Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2124eaca3e81c7af7347a3b834538e2d Text-delta-base-sha1: 5c8185bfb7c0faab4844142b16f36784f59adf5f Text-content-length: 20 Text-content-md5: adaf4adfe75c25861d5f5f5e186c1623 Text-content-sha1: 47db4cbf2e895a087976ed92ecee68818615474c Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNs J)\ Revision-number: 398 Prop-content-length: 234 Content-length: 234 K 7 svn:log V 133 New DES implementation, replacing Eric Young's. All of PuTTY is now under my own copyright and there are no tricky licensing issues! K 10 svn:author V 5 simon K 8 svn:date V 27 2000-03-10T17:27:20.000000Z PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8448af6d05e84667366226aa28af9f3b Text-delta-base-sha1: e563aaf3942bf25bfdd69aff43144398f3a1497e Text-content-length: 57 Text-content-md5: 22774cbb1843318e4c6f946f99504b06 Text-content-sha1: 047ffe573f7046abe4452a47107b98a4e977526d Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN7)oHPuTTY is copyright 1997-2000 Simon Tatham Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: edc8e28b891e639e592a47ac02d28f20 Text-delta-base-sha1: c99f8f2bb5ce05cd1f9c2ce7122d5d8cb4760f26 Text-content-length: 21203 Text-content-md5: ec8e98e06ff3e9db2ae78e4b1244a770 Text-content-sha1: f4ca184a9a8cdf3110226199a1050353188843bd Content-length: 21242 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNs&# ?WZ!{a4#include #include "ssh.h" /* des.c - implementation of DES */ /* * Description of DES * * Unlike the description in FIPS 46, I'm going to use _sensible_ indices: * bits in an n-bit word are numbered from 0 at the LSB to n-1 at the MSB. * And S-boxes are indexed by six consecutive bits, not by the outer two * followed by the middle four. * * The DES encryption routine requires a 64-bit input, and a key schedule K * containing 16 48-bit elements. * * First the input is permuted by the initial permutation IP. * Then the input is split into 32-bit words L and R. (L is the MSW.) * Next, 16 rounds. In each round: * (L, R) <- (R, L xor f(R, K[i])) * Then the pre-output words L and R are swapped. * Then L and R are glued back together into a 64-bit word. (L is the MSW, * again, but since we just swapped them, the MSW is the R that came out * of the last round.) * The 64-bit output block is permuted by the inverse of IP and returned. * * Decryption is identical except that the elements of K are used in the * opposite order. (This wouldn't work if that word swap didn't happen.) * * The function f, used in each round, accepts a 32-bit word R and a * 48-bit key block K. It produces a 32-bit output. * * First R is expanded to 48 bits using the bit-selection function E. * The resulting 48-bit block is XORed with the key block K to produce * a 48-bit block X. * This block X is split into eight groups of 6 bits. Each group of 6 * bits is then looked up in one of the eight S-boxes to convert * it to 4 bits. These eight groups of 4 bits are glued back * together to produce a 32-bit preoutput block. * The preoutput block is permuted using the permutation P and returned. * * Key setup maps a 64-bit key word into a 16x48-bit key schedule. Although * the approved input format for the key is a 64-bit word, eight of the * bits are discarded, so the actual quantity of key used is 56 bits. * * First the input key is converted to two 28-bit words C and D using * the bit-selection function PC1. * Then 16 rounds of key setup occur. In each round, C and D are each * rotated left by either 1 or 2 bits (depending on which round), and * then converted into a key schedule element using the bit-selection * function PC2. * * That's the actual algorithm. Now for the tedious details: all those * painful permutations and lookup tables. * * IP is a 64-to-64 bit permutation. Its output contains the following * bits of its input (listed in order MSB to LSB of output). * * 6 14 22 30 38 46 54 62 4 12 20 28 36 44 52 60 * 2 10 18 26 34 42 50 58 0 8 16 24 32 40 48 56 * 7 15 23 31 39 47 55 63 5 13 21 29 37 45 53 61 * 3 11 19 27 35 43 51 59 1 9 17 25 33 41 49 57 * * E is a 32-to-48 bit selection function. Its output contains the following * bits of its input (listed in order MSB to LSB of output). * * 0 31 30 29 28 27 28 27 26 25 24 23 24 23 22 21 20 19 20 19 18 17 16 15 * 16 15 14 13 12 11 12 11 10 9 8 7 8 7 6 5 4 3 4 3 2 1 0 31 * * The S-boxes are arbitrary table-lookups each mapping a 6-bit input to a * 4-bit output. In other words, each S-box is an array[64] of 4-bit numbers. * The S-boxes are listed below. The first S-box listed is applied to the * most significant six bits of the block X; the last one is applied to the * least significant. * * 14 0 4 15 13 7 1 4 2 14 15 2 11 13 8 1 * 3 10 10 6 6 12 12 11 5 9 9 5 0 3 7 8 * 4 15 1 12 14 8 8 2 13 4 6 9 2 1 11 7 * 15 5 12 11 9 3 7 14 3 10 10 0 5 6 0 13 * * 15 3 1 13 8 4 14 7 6 15 11 2 3 8 4 14 * 9 12 7 0 2 1 13 10 12 6 0 9 5 11 10 5 * 0 13 14 8 7 10 11 1 10 3 4 15 13 4 1 2 * 5 11 8 6 12 7 6 12 9 0 3 5 2 14 15 9 * * 10 13 0 7 9 0 14 9 6 3 3 4 15 6 5 10 * 1 2 13 8 12 5 7 14 11 12 4 11 2 15 8 1 * 13 1 6 10 4 13 9 0 8 6 15 9 3 8 0 7 * 11 4 1 15 2 14 12 3 5 11 10 5 14 2 7 12 * * 7 13 13 8 14 11 3 5 0 6 6 15 9 0 10 3 * 1 4 2 7 8 2 5 12 11 1 12 10 4 14 15 9 * 10 3 6 15 9 0 0 6 12 10 11 1 7 13 13 8 * 15 9 1 4 3 5 14 11 5 12 2 7 8 2 4 14 * * 2 14 12 11 4 2 1 12 7 4 10 7 11 13 6 1 * 8 5 5 0 3 15 15 10 13 3 0 9 14 8 9 6 * 4 11 2 8 1 12 11 7 10 1 13 14 7 2 8 13 * 15 6 9 15 12 0 5 9 6 10 3 4 0 5 14 3 * * 12 10 1 15 10 4 15 2 9 7 2 12 6 9 8 5 * 0 6 13 1 3 13 4 14 14 0 7 11 5 3 11 8 * 9 4 14 3 15 2 5 12 2 9 8 5 12 15 3 10 * 7 11 0 14 4 1 10 7 1 6 13 0 11 8 6 13 * * 4 13 11 0 2 11 14 7 15 4 0 9 8 1 13 10 * 3 14 12 3 9 5 7 12 5 2 10 15 6 8 1 6 * 1 6 4 11 11 13 13 8 12 1 3 4 7 10 14 7 * 10 9 15 5 6 0 8 15 0 14 5 2 9 3 2 12 * * 13 1 2 15 8 13 4 8 6 10 15 3 11 7 1 4 * 10 12 9 5 3 6 14 11 5 0 0 14 12 9 7 2 * 7 2 11 1 4 14 1 7 9 4 12 10 14 8 2 13 * 0 15 6 12 10 9 13 0 15 3 3 5 5 6 8 11 * * P is a 32-to-32 bit permutation. Its output contains the following * bits of its input (listed in order MSB to LSB of output). * * 16 25 12 11 3 20 4 15 31 17 9 6 27 14 1 22 * 30 24 8 18 0 5 29 23 13 19 2 26 10 21 28 7 * * PC1 is a 64-to-56 bit selection function. Its output is in two words, * C and D. The word C contains the following bits of its input (listed * in order MSB to LSB of output). * * 7 15 23 31 39 47 55 63 6 14 22 30 38 46 * 54 62 5 13 21 29 37 45 53 61 4 12 20 28 * * And the word D contains these bits. * * 1 9 17 25 33 41 49 57 2 10 18 26 34 42 * 50 58 3 11 19 27 35 43 51 59 36 44 52 60 * * PC2 is a 56-to-48 bit selection function. Its input is in two words, * C and D. These are treated as one 56-bit word (with C more significant, * so that bits 55 to 28 of the word are bits 27 to 0 of C, and bits 27 to * 0 of the word are bits 27 to 0 of D). The output contains the following * bits of this 56-bit input word (listed in order MSB to LSB of output). * * 42 39 45 32 55 51 53 28 41 50 35 46 33 37 44 52 30 48 40 49 29 36 43 54 * 15 4 25 19 9 1 26 16 5 11 23 8 12 7 17 0 22 3 10 14 6 20 27 24 */ typedef struct { word32 k0246[16], k1357[16]; word32 eiv0, eiv1; word32 div0, div1; } DESContext; #define rotl(x, c) ( (x << c) | (x >> (32-c)) ) #define rotl28(x, c) ( ( (x << c) | (x >> (28-c)) ) & 0x0FFFFFFF) static word32 bitsel(word32 *input, const int *bitnums, int size) { word32 ret = 0; while (size--) { int bitpos = *bitnums++; ret <<= 1; if (bitpos >= 0) ret |= 1 & (input[bitpos / 32] >> (bitpos % 32)); } return ret; } void des_key_setup(word32 key_msw, word32 key_lsw, DESContext *sched) { static const int PC1_Cbits[] = { 7, 15, 23, 31, 39, 47, 55, 63, 6, 14, 22, 30, 38, 46, 54, 62, 5, 13, 21, 29, 37, 45, 53, 61, 4, 12, 20, 28 }; static const int PC1_Dbits[] = { 1, 9, 17, 25, 33, 41, 49, 57, 2, 10, 18, 26, 34, 42, 50, 58, 3, 11, 19, 27, 35, 43, 51, 59, 36, 44, 52, 60 }; static const int PC2_0246[] = { 49, 36, 59, 55, -1, -1, 37, 41, 48, 56, 34, 52, -1, -1, 15, 4, 25, 19, 9, 1, -1, -1, 12, 7, 17, 0, 22, 3, -1, -1, 46, 43 }; static const int PC2_1357[] = { -1, -1, 57, 32, 45, 54, 39, 50, -1, -1, 44, 53, 33, 40, 47, 58, -1, -1, 26, 16, 5, 11, 23, 8, -1, -1, 10, 14, 6, 20, 27, 24 }; static const int leftshifts[] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; word32 C, D; word32 buf[2]; int i; buf[0] = key_lsw; buf[1] = key_msw; C = bitsel(buf, PC1_Cbits, 28); D = bitsel(buf, PC1_Dbits, 28); for (i = 0; i < 16; i++) { C = rotl28(C, leftshifts[i]); D = rotl28(D, leftshifts[i]); buf[0] = D; buf[1] = C; sched->k0246[i] = bitsel(buf, PC2_0246, 32); sched->k1357[i] = bitsel(buf, PC2_1357, 32); } sched->eiv0 = sched->eiv1 = 0; sched->div0 = sched->div1 = 0; /* for good measure */ } static const word32 SPboxes[8][64] = { {0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004L}, {0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000L}, {0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200L}, {0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080L}, {0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100L}, {0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010L}, {0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002L}, {0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000L} }; #define f(R, K0246, K1357) (\ s0246 = R ^ K0246, \ s1357 = R ^ K1357, \ s0246 = rotl(s0246, 28), \ SPboxes[0] [(s0246 >> 24) & 0x3F] | \ SPboxes[1] [(s1357 >> 24) & 0x3F] | \ SPboxes[2] [(s0246 >> 16) & 0x3F] | \ SPboxes[3] [(s1357 >> 16) & 0x3F] | \ SPboxes[4] [(s0246 >> 8) & 0x3F] | \ SPboxes[5] [(s1357 >> 8) & 0x3F] | \ SPboxes[6] [(s0246 ) & 0x3F] | \ SPboxes[7] [(s1357 ) & 0x3F]) #define bitswap(L, R, n, mask) (\ swap = mask & ( (R >> n) ^ L ), \ R ^= swap << n, \ L ^= swap) /* Initial permutation */ #define IP(L, R) (\ bitswap(R, L, 4, 0x0F0F0F0F), \ bitswap(R, L, 16, 0x0000FFFF), \ bitswap(L, R, 2, 0x33333333), \ bitswap(L, R, 8, 0x00FF00FF), \ bitswap(R, L, 1, 0x55555555)) /* Final permutation */ #define FP(L, R) (\ bitswap(R, L, 1, 0x55555555), \ bitswap(L, R, 8, 0x00FF00FF), \ bitswap(L, R, 2, 0x33333333), \ bitswap(R, L, 16, 0x0000FFFF), \ bitswap(R, L, 4, 0x0F0F0F0F)) void des_encipher(word32 *output, word32 L, word32 R, DESContext *sched) { word32 swap, s0246, s1357; IP(L, R); L = rotl(L, 1); R = rotl(R, 1); L ^= f(R, sched->k0246[ 0], sched->k1357[ 0]); R ^= f(L, sched->k0246[ 1], sched->k1357[ 1]); L ^= f(R, sched->k0246[ 2], sched->k1357[ 2]); R ^= f(L, sched->k0246[ 3], sched->k1357[ 3]); L ^= f(R, sched->k0246[ 4], sched->k1357[ 4]); R ^= f(L, sched->k0246[ 5], sched->k1357[ 5]); L ^= f(R, sched->k0246[ 6], sched->k1357[ 6]); R ^= f(L, sched->k0246[ 7], sched->k1357[ 7]); L ^= f(R, sched->k0246[ 8], sched->k1357[ 8]); R ^= f(L, sched->k0246[ 9], sched->k1357[ 9]); L ^= f(R, sched->k0246[10], sched->k1357[10]); R ^= f(L, sched->k0246[11], sched->k1357[11]); L ^= f(R, sched->k0246[12], sched->k1357[12]); R ^= f(L, sched->k0246[13], sched->k1357[13]); L ^= f(R, sched->k0246[14], sched->k1357[14]); R ^= f(L, sched->k0246[15], sched->k1357[15]); L = rotl(L, 31); R = rotl(R, 31); swap = L; L = R; R = swap; FP(L, R); output[0] = L; output[1] = R; } void des_decipher(word32 *output, word32 L, word32 R, DESContext *sched) { word32 swap, s0246, s1357; IP(L, R); L = rotl(L, 1); R = rotl(R, 1); L ^= f(R, sched->k0246[15], sched->k1357[15]); R ^= f(L, sched->k0246[14], sched->k1357[14]); L ^= f(R, sched->k0246[13], sched->k1357[13]); R ^= f(L, sched->k0246[12], sched->k1357[12]); L ^= f(R, sched->k0246[11], sched->k1357[11]); R ^= f(L, sched->k0246[10], sched->k1357[10]); L ^= f(R, sched->k0246[ 9], sched->k1357[ 9]); R ^= f(L, sched->k0246[ 8], sched->k1357[ 8]); L ^= f(R, sched->k0246[ 7], sched->k1357[ 7]); R ^= f(L, sched->k0246[ 6], sched->k1357[ 6]); L ^= f(R, sched->k0246[ 5], sched->k1357[ 5]); R ^= f(L, sched->k0246[ 4], sched->k1357[ 4]); L ^= f(R, sched->k0246[ 3], sched->k1357[ 3]); R ^= f(L, sched->k0246[ 2], sched->k1357[ 2]); L ^= f(R, sched->k0246[ 1], sched->k1357[ 1]); R ^= f(L, sched->k0246[ 0], sched->k1357[ 0]); L = rotl(L, 31); R = rotl(R, 31); swap = L; L = R; R = swap; FP(L, R); output[0] = L; output[1] = R; } #define GET_32BIT_MSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[3]) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[0] << 24)) #define PUT_32BIT_MSB_FIRST(cp, value) do { \ (cp)[3] = (value); \ (cp)[2] = (value) >> 8; \ (cp)[1] = (value) >> 16; \ (cp)[0] = (value) >> 24; } while (0) static void des_cbc_encrypt(unsigned char *dest, const unsigned char *src, unsigned int len, DESContext *sched) { word32 out[2], iv0, iv1; unsigned int i; assert((len & 7) == 0); iv0 = sched->eiv0; iv1 = sched->eiv1; for (i = 0; i < len; i += 8) { iv0 ^= GET_32BIT_MSB_FIRST(src); src += 4; iv1 ^= GET_32BIT_MSB_FIRST(src); src += 4; des_encipher(out, iv0, iv1, sched); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_MSB_FIRST(dest, iv0); dest += 4; PUT_32BIT_MSB_FIRST(dest, iv1); dest += 4; } sched->eiv0 = iv0; sched->eiv1 = iv1; } static void des_cbc_decrypt(unsigned char *dest, const unsigned char *src, unsigned int len, DESContext *sched) { word32 out[2], iv0, iv1, xL, xR; unsigned int i; assert((len & 7) == 0); iv0 = sched->div0; iv1 = sched->div1; for (i = 0; i < len; i += 8) { xL = GET_32BIT_MSB_FIRST(src); src += 4; xR = GET_32BIT_MSB_FIRST(src); src += 4; des_decipher(out, xL, xR, sched); iv0 ^= out[0]; iv1 ^= out[1]; PUT_32BIT_MSB_FIRST(dest, iv0); dest += 4; PUT_32BIT_MSB_FIRST(dest, iv1); dest += 4; iv0 = xL; iv1 = xR; } sched->div0 = iv0; sched->div1 = iv1; } static void des_3cbc_encrypt(unsigned char *dest, const unsigned char *src, unsigned int len, DESContext *scheds) { des_cbc_encrypt(dest, src, len, &scheds[0]); des_cbc_decrypt(dest, src, len, &scheds[1]); des_cbc_encrypt(dest, src, len, &scheds[2]); } static void des_3cbc_decrypt(unsigned char *dest, const unsigned char *src, unsigned int len, DESContext *scheds) { des_cbc_decrypt(dest, src, len, &scheds[2]); des_cbc_encrypt(dest, src, len, &scheds[1]); des_cbc_decrypt(dest, src, len, &scheds[0]); } DESContext keys[3]; static void des3_sesskey(unsigned char *key) { des_key_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key+4), &keys[0]); des_key_setup(GET_32BIT_MSB_FIRST(key+8), GET_32BIT_MSB_FIRST(key+12), &keys[1]); des_key_setup(GET_32BIT_MSB_FIRST(key+16), GET_32BIT_MSB_FIRST(key+20), &keys[2]blk, blk, len, keysblk, blk, len, keyskey_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key+4), &keys[0]blk, blk, len, keys); } static void des_decrypt_blk(unsigned char *blk, int len) { des_cbc_decrypt(blk, blk, len, keys Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: adaf4adfe75c25861d5f5f5e186c1623 Text-delta-base-sha1: 47db4cbf2e895a087976ed92ecee68818615474c Text-content-length: 1204 Text-content-md5: 985f7c12d83346f355a04e539f031d60 Text-content-sha1: 45ebeeea5c1feb3ff9b38e268fc36fe3261d6f0f Content-length: 1244 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNs59oFHK]ccg#iesfE>d`gqK9)T-r2303, 44, 14 LTEXT "Copyright \251 1997-2000 Simon Tatham", 1000, 10, 1026, 206, 8 LTEXT "obtaining a copy of this software and associated documentation", 1003, 10, 3442, 206, 8 LTEXT "including without limitation the rights to use, copy, modify, merge,", 1005, 10, 5058, 206, 8 LTEXT "and to permit persons to whom the Software is furnished to do so,", 1007, 10, 6674, 206, 8 LTEXT "The above copyright notice and this permission notice shall be", 1010, 10, 9098, 206, 8 LTEXT "THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT", 1013, 10, 114, 206, 8 LTEXT "WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,", 1014, 10, 122, 206, 8 LTEXT "INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", 1015, 10, 13038, 206, 8 LTEXT "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL", 1017, 10, 146, 206, 8 LTEXT "SIMON TATHAM BE LIABLE FOR ANY CLAIM, DAMAGES OR", 1018, 10, 15462, 206, 8 LTEXT "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN", 1020, 10, 170, 206, 8 LTEXT "CONNECTION WITH THE SOFTWARE OR THE USE OR", 1021, 10, 178, 206, 8 LTEXT "OTHER DEALINGS IN THE SOFTWARE.", 1022, 10, 186, 206, 8 END Revision-number: 399 Prop-content-length: 224 Content-length: 224 K 8 svn:date V 27 2000-03-11T11:06:06.000000Z K 7 svn:log V 123 Added a large comment describing the transformations between the DES specification and the optimised implementation given. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ec8e98e06ff3e9db2ae78e4b1244a770 Text-delta-base-sha1: f4ca184a9a8cdf3110226199a1050353188843bd Text-content-length: 6460 Text-content-md5: d5ba8c09435e5bfcfc26141ac3331a72 Text-content-sha1: b049ab4942b1d985b5791b806cb2c5345bd22bed Content-length: 6499 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN(gwd|U d ------------------/* * Implementation details * ---------------------- * * If you look at the code in this module, you'll find it looks * nothing _like_ the above algorithm. Here I explain the * differences... * * Key setup has not been heavily optimised here. We are not * concerned with key agility: we aren't codebreakers. We don't * mind a little delay (and it really is a little one; it may be a * factor of five or so slower than it could be but it's still not * an appreciable length of time) while setting up. The only tweaks * in the key setup are ones which change the format of the key * schedule to speed up the actual encryption. I'll describe those * below. * * The first and most obvious optimisation is the S-boxes. Since * each S-box always targets the same four bits in the final 32-bit * word, so the output from (for example) S-box 0 must always be * shifted left 28 bits, we can store the already-shifted outputs * in the lookup tables. This reduces lookup-and-shift to lookup, * so the S-box step is now just a question of ORing together eight * table lookups. * * The permutation P is just a bit order change; it's invariant * with respect to OR, in that P(x)|P(y) = P(x|y). Therefore, we * can apply P to every entry of the S-box tables and then we don't * have to do it in the code of f(). This yields a set of tables * which might be called SP-boxes. * * The bit-selection function E is our next target. Note that E is * immediately followed by the operation of splitting into 6-bit * chunks. Examining the 6-bit chunks coming out of E we notice * they're all contiguous within the word (speaking cyclically - * the end two wrap round); so we can extract those bit strings * individually rather than explicitly running E. This would yield * code such as * * y |= SPboxes[0][ (rotl(R, 5) ^ top6bitsofK) & 0x3F ]; * t |= SPboxes[1][ (rotl(R,11) ^ next6bitsofK) & 0x3F ]; * * and so on; and the key schedule preparation would have to * provide each 6-bit chunk separately. * * Really we'd like to XOR in the key schedule element before * looking up bit strings in R. This we can't do, naively, because * the 6-bit strings we want overlap. But look at the strings: * * 3322222222221111111111 * bit 10987654321098765432109876543210 * * box0 XXXXX X * box1 XXXXXX * box2 XXXXXX * box3 XXXXXX * box4 XXXXXX * box5 XXXXXX * box6 XXXXXX * box7 X XXXXX * * The bit strings we need to XOR in for boxes 0, 2, 4 and 6 don't * overlap with each other. Neither do the ones for boxes 1, 3, 5 * and 7. So we could provide the key schedule in the form of two * words that we can separately XOR into R, and then every S-box * index is available as a (cyclically) contiguous 6-bit substring * of one or the other of the results. * * The comments in Eric Young's libdes implementation point out * that two of these bit strings require a rotation (rather than a * simple shift) to extract. It's unavoidable that at least _one_ * must do; but we can actually run the whole inner algorithm (all * 16 rounds) rotated one bit to the left, so that what the `real' * DES description sees as L=0x80000001 we see as L=0x00000003. * This requires rotating all our SP-box entries one bit to the * left, and rotating each word of the key schedule elements one to * the left, and rotating L and R one bit left just after IP and * one bit right again just before FP. And in each round we convert * a rotate into a shift, so we've saved a few per cent. * * That's about it for the inner loop; the SP-box tables as listed * below are what I've described here (the original S value, * shifted to its final place in the input to P, run through P, and * then rotated one bit left). All that remains is to optimise the * initial permutation IP. * * IP is not an arbitrary permutation. It has the nice property * that if you take any bit number, write it in binary (6 bits), * permute those 6 bits and invert some of them, you get the final * position of that bit. Specifically, the bit whose initial * position is given (in binary) as fedcba ends up in position * AcbFED (where a capital letter denotes the inverse of a bit). * * We have the 64-bit data in two 32-bit words L and R, where bits * in L are those with f=1 and bits in R are those with f=0. We * note that we can do a simple transformation: suppose we exchange * the bits with f=1,c=0 and the bits with f=0,c=1. This will cause * the bit fedcba to be in position cedfba - we've `swapped' bits c * and f in the position of each bit! * * Better still, this transformation is easy. In the example above, * bits in L with c=0 are bits 0x0F0F0F0F, and those in R with c=1 * are 0xF0F0F0F0. So we can do * * difference = ((R >> 4) ^ L) & 0x0F0F0F0F * R ^= (difference << 4) * L ^= difference * * to perform the swap. Let's denote this by bitswap(4,0x0F0F0F0F). * Also, we can invert the bit at the top just by exchanging L and * R. So in a few swaps and a few of these bit operations we can * do: * * Initially the position of bit fedcba is fedcba * Swap L with R to make it Fedcba * Perform bitswap( 4,0x0F0F0F0F) to make it cedFba * Perform bitswap(16,0x0000FFFF) to make it ecdFba * Swap L with R to make it EcdFba * Perform bitswap( 2,0x33333333) to make it bcdFEa * Perform bitswap( 8,0x00FF00FF) to make it dcbFEa * Swap L with R to make it DcbFEa * Perform bitswap( 1,0x55555555) to make it acbFED * Swap L with R to make it AcbFED * * (In the actual code the four swaps are implicit: R and L are * simply used the other way round in the first, second and last * bitswap operations.) * * The final permutation is just the inverse of IP, so it can be * performed by a similar set of operations./* * The bit numbers in the two lists below don't correspond to * the ones in the above description of PC2, because in the * above description C and D are concatenated so `bit 28' means * bit 0 of C. In this implementation we're using the standard * `bitsel' function above and C is in the second word, so bit * 0 of C is addressed by writing `32' here. */ Revision-number: 400 Prop-content-length: 242 Content-length: 242 K 8 svn:date V 27 2000-03-11T14:03:04.000000Z K 7 svn:log V 141 Robert de Bath's patch: ^C ^Z and ^D send Telnet specials in terminal line discipline; also switching disciplines in midsession works better K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7c46c16572724610983d10613dc02b0a Text-delta-base-sha1: f138c14ca0687bd027f0615796036a8cdbc1d79d Text-content-length: 1053 Text-content-md5: 7d9a36168ec580f09451c18f5d48b0c2 Text-content-sha1: b4ad64f8053f1520ee68b0fd24a40dc020a02c02 Content-length: 1092 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN}ELxTvy0@R 9[j<ajJw4c32!f,#define CTRL(x) (x^'@')c: Do a ^u then send a telnet IP * ^z: Do a ^u then send a telnet SUSP * ^\: Do a ^u then send a telnet ABORT: send line-plus-\r\n and reset to BOL */ case CTRL('H'): case CTRL('?'):CTRL('W'): /* delete wordCTRL('U'): /* delete line */ case CTRL('C'): /* Send IP */ case CTRL('\\'): /* Quit */ case CTRL('Z'): /* Suspend if( c == CTRL('C') ) back->special (TS_IP); if( c == CTRL('Z') ) back->special (TS_SUSP); if( c == CTRL('\\') ) back->special (TS_ABORT); break; case CTRL('R'): /*CTRL('V'): /* quote next char */ term_quotenext = TRUE; break; case CTRL('D'): /* logout or send */ if (term_buflen == 0) { back->special (TS_EOF)CTRL('M'): /*if( term_buflen != 0 ) { back->send(term_buf, term_buflen); while (term_buflen > 0) { bsb(plen(term_buf[term_buflen-1])); term_buflen--; } } Revision-number: 401 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2000-03-11T14:06:11.000000Z K 7 svn:log V 122 Robert de Bath's patch: integrate line disciplines into Telnet and have them interoperate sensibly with ECHO negotiations K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79f329d8ba1e29d37ed8601f5ed7d8b1 Text-delta-base-sha1: a83174f1e74b5625cad46759347c5d8d36fd29bd Text-content-length: 41 Text-content-md5: b36d6e96ec8955fc88f872ac834d577b Text-content-sha1: 49062958012bce799f645b841e1316a725d175e2 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN!5 b?b, TS_LECHO, TS_RECHO Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 978a64afd3ba9c1fb0ec07a45dd3ee45 Text-delta-base-sha1: 3aec625f621f269da2291eab7857f925b93a8070 Text-content-length: 560 Text-content-md5: cb46622b96e19bd37266ede7fcebd317 Text-content-sha1: 3aeac195c451676af485803222687aefd7e8476d Content-length: 599 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNvk,WZ$TXv\p if (o->option == TELOPT_ECHO) { cfg.ldisc_term = FALSE; ldisc = &ldisc_simple if (o->option == TELOPT_ECHO) { cfg.ldisc_term = TRUE; ldisc = &ldisc_term1] = DM; send (s, b, 2, MSG_OOB); break; case TS_RECHO: if (o_echo.state == INACTIVE || o_echo.state == REALLY_INACTIVE) { o_echo.state = REQUESTED; send_opt (o_echo.send, o_echo.option); } break; case TS_LECHO: if (o_echo.state == ACTIVE) { o_echo.state = REQUESTED; send_opt (o_echo.nsend, o_echo.option); } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 94681a26d6f263cfdc6c62f8956db86b Text-delta-base-sha1: eca28a8ae3f9688b3ffb5cbc8672e893134997ef Text-content-length: 77 Text-content-md5: ae11562f9f0503ccd00f43f4bf859df7 Text-content-sha1: d7b5dac40f1fd704978fb55c447c85500b09de57 Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNU 3}back->special (cfg.ldisc_term ? TS_LECHO : TS_RECHO Revision-number: 402 Prop-content-length: 226 Content-length: 226 K 8 svn:date V 27 2000-03-11T14:08:36.000000Z K 7 svn:log V 125 Robert de Bath's patch: sort out once and for all the confusion between ESC [ ... Q and ESC [ ... ? Q (for all values of Q). K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: be32ebca5f8ccffa3ab2c96f4470e9d7 Text-delta-base-sha1: d4bfb7027bd6f1013a187a1764171c979e8c3ccf Text-content-length: 1591 Text-content-md5: 7113ee4a4f2567cdf6a8ea01533c6c1c Text-content-sha1: bd75ac2ddbc149c159624eb0b8343f25db6fc367 Content-length: 1631 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNw&N[:A 9soa3wR(fUCmd"sxR%#define ANSI(x,y) ((x)+((y)<<8)) #define ANSI_QUE(x) ANSI(x,TRUE)/* Only graphic characters get this far, ctrls are stripped above */ if (wrapnext) { cpos[1] = ATTR_WRAPPED;curs_x = 0; fix_cpos; wrapnext = FALSE; nl_count++; } if (insert) insch (1); check_selection (cpos, cpos+1); *cpos++ = xlat_tty2scr((unsigned char)c) | curr_attr | (c <= 0x7F ? cset_attr[cset] : ATTR_ASCII); curs_x++; if (curs_x == cols) { cpos--; curs_x--; wrapnext = wrap; } seen_disp_event = 1;if( isdigit(c) ) { } else if( c == ';' ) { if (++esc_nargs <= ARGS_MAX) esc_args[esc_nargs-1] = ARG_DEFAULT; termstate = SEEN_CSI; } else if( c < '@' ) { if( esc_query ) esc_query = -1; else if( c == '?' ) esc_query = TRUE; else esc_query = c; termstate = SEEN_CSI; } else switch (ANSI(c,esc_query)) { case ANSI_QUE('h'): case ANSI_QUE('l'):if( c != '%' ) /* * This OSC stuff is EVIL. It takes just one character to get into * sysline mode and it's not initially obvious how to get out. * So I've added CR and LF as string aborts. * This shouldn't effect compatibility as I believe embedded * control characters are supposed to be interpreted (maybe?) * and they don't display anything useful anyway. * * -- RDB */ if (c == '\n' || c == '\r') { termstate = TOPLEVEL; } else if (c == 0234 || c == '\007' Revision-number: 403 Prop-content-length: 278 Content-length: 278 K 8 svn:date V 27 2000-03-11T14:10:10.000000Z K 7 svn:log V 177 Robert de Bath's patch: be a little more careful of main and alternate screens when resizing the window. Should avoid lines of alternate screen showing up in scrollback buffer. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7113ee4a4f2567cdf6a8ea01533c6c1c Text-delta-base-sha1: bd75ac2ddbc149c159624eb0b8343f25db6fc367 Text-content-length: 241 Text-content-md5: a8d735ca42c7c010ff22c124daad8b12 Text-content-sha1: 8caccbfaebc170534bb55182c9f8f38e3baec694 Content-length: 281 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN&PO3a8$nt save_alt_which = alt_which; if (newrows == rows && newcols == cols && newsavelines == savelines) return; /* nothing to do */ deselect(); swap_screen(0);swap_screen(save_alt_which); Revision-number: 404 Prop-content-length: 184 Content-length: 184 K 7 svn:log V 84 Robert de Bath's patch: a few more character translations for OEM line drawing mode K 10 svn:author V 5 simon K 8 svn:date V 27 2000-03-11T14:11:02.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ae11562f9f0503ccd00f43f4bf859df7 Text-delta-base-sha1: d7b5dac40f1fd704978fb55c447c85500b09de57 Text-content-length: 128 Text-content-md5: d509ddffad89c50bc5a3c8d3027d2af6 Text-content-sha1: f95cb7949d43f53267bb8a9c648cadd26082525e Content-length: 168 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNUa f&fU\x04\xB1****\xF8\xF1**\xD9\xBF\xDA\xC0\xC5" "\xC4\xC4\xC4\xC4\xC4\xC3\xB4\xC1\xC2\xB3\xF3\xF2\xE3 Revision-number: 405 Prop-content-length: 230 Content-length: 230 K 8 svn:date V 27 2000-03-11T14:15:24.000000Z K 7 svn:log V 129 Robert de Bath's patch: be much more careful about font heights and widths, including underline mode and OEM/ANSI size mismatch. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d509ddffad89c50bc5a3c8d3027d2af6 Text-delta-base-sha1: f95cb7949d43f53267bb8a9c648cadd26082525e Text-content-length: 2970 Text-content-md5: 2406e2ffac8f69105a4ead29ea934d74 Text-content-sha1: 41b858537ee49a4c412ba88d9c74f60aaaca4cd3 Content-length: 3010 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNaB4Xze6=4xN4&o.BK; int fsize[5]; HDC hdc; int fw_dontcare, fw_bold; int firstchar = ' '; font_messup: hdc = GetDC(hwnd); font_height = cfg.fontheight; font_width = 0; #define f(i,c,w,u) \ fonts[i] = CreateFont (font_height, font_width if (cfg.vtmode != VT_OEMONLY) { f(FONT_NORMAL, cfg.fontcharset, fw_dontcare, FALSE); SelectObject (hdc, fonts[FONT_NORMAL]); GetTextMetrics(hdc, &tm); font_height = tm.tmHeight; font_width = tm.tmAveCharWidth; f(FONT_UNDERLINE, cfg.fontcharset, fw_dontcare, TRUE); if (bold_mode == BOLD_FONT) { f(FONT_BOLD, cfg.fontcharset, fw_bold, FALSE); f(FONT_BOLDUND, cfg.fontcharset, fw_bold, TRUE); } if (cfg.vtmode == VT_OEMANSI) { f(FONT_OEM, OEM_CHARSET, fw_dontcare, FALSE); f(FONT_OEMUND, OEM_CHARSET, fw_dontcare, TRUE); if (bold_mode == BOLD_FONT) { f(FONT_OEMBOLD, OEM_CHARSET, fw_bold, FALSE); f(FONT_OEMBOLDUND, OEM_CHARSET, fw_bold, TRUE); } } } else { f(FONT_OEM, cfg.fontcharset, fw_dontcare, FALSE); SelectObject (hdc, fonts[FONT_OEM]); GetTextMetrics(hdc, &tm); font_height = tm.tmHeight; font_width = tm.tmAveCharWidth; f(FONT_OEMUND, cfg.fontcharset, fw_dontcare, TRUE); if (bold_mode == BOLD_FONT) { f(FONT_BOLD, cfg.fontcharset, fw_bold, FALSE); f(FONT_BOLDUND, cfg.fontcharset, fw_bold, TRUE); } } #undef f descent = tm.tmAscent + 1; if (descent >= font_height) descent = font_height - 1; firstchar = tm.tmFirstChar; if( cfg.vtmode == VT_XWINDOWS && firstchar >= ' ' ) cfg.vtmode = VT_POORMAN; for (i=0; i<8; i++) { if (fonts[i]) { SelectObject (hdc, fonts[i]); GetTextMetrics(hdc, &tm); fsize[i] = tm.tmAveCharWidth + 256 * tm.tmHeight; } } ReleaseDC (hwnd, hdc); if (fsize[FONT_UNDERLINE] != fsize[FONT_NORMAL] || (bold_mode == BOLD_FONT && fsize[FONT_BOLDUND] != fsize #if 0 MessageBox(NULL, "Disabling underline font", "Font Size Mismatch", MB_ICONINFORMATION | MB_OK); #endif } if (bold_mode == BOLD_FONT && fsize[FONT_BOLD] != fsize #if 0 MessageBox(NULL, "Disabling bold font", "Font Size Mismatch", MB_ICONINFORMATION | MB_OK); #endif } if (cfg.vtmode == VT_OEMANSI && fsize[FONT_OEM] != fsize[FONT_NORMAL] ) { if( cfg.fontcharset == OEM_CHARSET ) { cfg.vtmode = VT_OEMONLY; } else if( firstchar < ' ' ) { MessageBox(NULL, "The OEM and ANSI versions of this font are\n" "different sizes. Using XTerm mode instead", "Font Size Mismatch", MB_ICONINFORMATION | MB_OK); cfg.vtmode = VT_XWINDOWS; } else { MessageBox(NULL, "The OEM and ANSI versions of this font are\n" "different sizes. Using ISO8859-1 mode instead", "Font Size Mismatch", MB_ICONINFORMATION | MB_OK); cfg.vtmode = VT_POORMAN; } for (i=0; i<8; i++) if (fonts[i]) DeleteObject (fonts[i]); goto font_messup Revision-number: 406 Prop-content-length: 375 Content-length: 375 K 8 svn:date V 27 2000-03-11T14:16:55.000000Z K 7 svn:log V 274 Robert de Bath's patch: ARG_DEFAULT is now zero because it's apparently defined behaviour for _all_ CSI-type sequences that ESC[Q should be equivalent to ESC[0Q. Which is a pain in the wossname and not a sane way to do it, but if the standards say it then I suppose ... :-( K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a8d735ca42c7c010ff22c124daad8b12 Text-delta-base-sha1: 8caccbfaebc170534bb55182c9f8f38e3baec694 Text-content-length: 25 Text-content-md5: 2cc648d965f6974c6bc9b33e0d780dc3 Text-content-sha1: 9bcec2aa4cb7b884950f32da6e516c6ec33fdeb2 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN p0 Revision-number: 407 Prop-content-length: 302 Content-length: 302 K 8 svn:date V 27 2000-03-11T14:25:35.000000Z K 7 svn:log V 201 Robert de Bath's patch: when the user presses CR, the Telnet backend now sends NVT `NL' (CR,LF) instead of NVT `CR' (CR,NUL). Unix telnetd apparently cares not a jot for the difference, but others do. K 10 svn:author V 5 simon PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cb46622b96e19bd37266ede7fcebd317 Text-delta-base-sha1: 3aeac195c451676af485803222687aefd7e8476d Text-content-length: 704 Text-content-md5: fad3dc060a3795dd0b6284df4ef42a7d Text-content-sha1: 193ea92d5dace0c0557690528e8af18dab8907cc Content-length: 744 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNkL`F[]Y38if( cfg.ldisc_term ) { struct Opt **o; for (o = opts; *o; o++) if ((*o)->state == REQUESTED) (*o)->state = INACTIVE; } else static unsigned char nl[2] = { CR, LF }; if (s == INVALID_SOCKET) return; p = buf; if (cfg.ldisc_term) { while (p < buf+len) { char *q = p; unsigned char * cstr = 0; while (p < buf+len) { if ((unsigned char)*p == IAC) { cstr = iac; break; } if (*p == '\r') { if( p+1 >= buf+len || ( p[1] != '\n' && p[1] != '\0')) { cstr = cr; break; } } p++; } if (p!=q) s_write (q, p-q); if (cstr) s_write (cstr,2), p++; } } elsenl Revision-number: 408 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2000-03-13T14:45:32.000000Z K 7 svn:log V 28 Shift-Tab now sends ESC [ Z K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2406e2ffac8f69105a4ead29ea934d74 Text-delta-base-sha1: 41b858537ee49a4c412ba88d9c74f60aaaca4cd3 Text-content-length: 239 Text-content-md5: ac2d436f925dddae21c82382f26edd77 Text-content-sha1: 65d791a4c4200c400eb01283efeb4d0c9b84a7c5 Content-length: 279 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNB+SdStNShift-Tab should send ESC [ Z. */ if (ret && (keystate[VK_SHIFT] & 0x80) && wParam == '\t') { *p++ = 0x1B; /* ESC */ *p++ = '['; *p++ = 'Z'; return p - output; Revision-number: 409 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2000-03-13T15:04:07.000000Z K 7 svn:log V 69 Let's spell '\t' as VK_TAB in that last patch, in fact, just in case K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ac2d436f925dddae21c82382f26edd77 Text-delta-base-sha1: 65d791a4c4200c400eb01283efeb4d0c9b84a7c5 Text-content-length: 31 Text-content-md5: 2b1fce697d5ecf64213a7a7e207b8d31 Text-content-sha1: 4ad88be9396f349a54b32a86b11cfc0472979ac0 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN+- CdGVK_TAB Revision-number: 410 Prop-content-length: 408 Content-length: 408 K 8 svn:date V 27 2000-03-15T15:08:48.000000Z K 7 svn:log V 307 First stab at the ability to compile puttytel.exe, an SSH-free variant which is patent-safe in the US and legal in France and Russia. This is a horrible hack in some ways: it's shown up serious deficiencies in the module boundaries. Needs further work, probably once the SSH implementations are recombined. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7ebca2c1d1d83ac2d99d016067875f68 Text-delta-base-sha1: 282a9d546c14066cc25b59efd452196d3158628e Text-content-length: 2129 Text-content-md5: 8c039bd2194d5b6b0596ef26ccdc4104 Text-content-sha1: 1067a3607a5999e9effeea7324fb1cc806ea1901 Content-length: 2169 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN5*(N2\ !OMKf] h( puttytel GOBJS1 = window.$(OBJ) windlg.$(OBJ) terminal.$(OBJ) telnet.$(OBJ) raw.$(OBJ) GOBJS2 = xlat.$(OBJ) ldisc.$(OBJ) sizetip.$(OBJ) ##-- objects putty POBJS = ssh.$(OBJ) be_all.$(OBJ) ##-- objects puttytel TOBJS = be_nossh.$(OBJ) ##-- objects pscp SOBJS = scp.$(OBJ) windlg.$(OBJ) scpssh.$(OBJ) be_none.$(OBJ) ##-- objects putty puttytel pscp MOBJS = misc.$(OBJ) version.$(OBJ) ##-- objects putty pscp OBJS12 = sshsha.$(OBJ) sshblowf.$(OBJ) noise.$(OBJ) ##-- resources putty PRESRC = win_res.$(RES) ##-- resources puttytel TRESRC = nossh_res.$(RES) ##-- resources pscp SRESRC = scp.$(RES) ##-- ##-- gui-apps # putty # puttyteluttytel.exe pscp.exe putty.exe: $(GOBJS1) $(GOBJS2) $(POBJS) $(MOBJS) $(OBJS1) $(OBJS2) $(PRESRC) putty.rsp link /debug -out:putty.exe @putty.rsp puttytel.exe: $(GOBJS1) $(GOBJS2) $(TOBJS) $(MOBJS) $(PRESRC) puttytel.rsp link /debug -out:puttytel.exe @puttytel.rsp pscp.exe: $(SOBJS) $(OBJS1) $(OBJS2) $(OBJS3) $(SRESRC) pscp.rsp link /debug -out:pscp.exe @pscp.rsp putty.rsp: makefile echo /nologo /subsystem:windows > putty.rsp echo $(GOBJS1) >> putty.rsp echo $(GOBJS2) >> putty.rsp echo $(POBJS) >> putty.rsp echo $(MOBJS) >> putty.rsp echo $(OBJS1) >> putty.rsp echo $(OBJS2) >> putty.rsp echo $(PRESRC) >> putty.rsp echo $(LIBS1) >> putty.rsp echo $(LIBS2) >> putty.rsp puttytel.rsp: makefile echo /nologo /subsystem:windows > puttytel.rsp echo $(GOBJS1) >> puttytel.rsp echo $(GOBJS2) >> puttytel.rsp echo $(TOBJS) >> puttytel.rsp echo $(MOBJS) >> puttytel.rsp echo $(TRESRC) >> puttytel.rsp echo $(LIBS1) >> puttytel.rsp echo $(LIBS2) >> puttytel.rsp pscp.rsp: makefile echo /nologo /subsystem:console > pscp.rsp echo $(SOBJS) >> pscp.rsp echo $(MOBJS) >> pscp.rsp echo $(OBJS1) >> pscp.rsp echo $(OBJS2) >> pscp.rsp echo $(SRESRC) >> pscp.rsp echo $(LIBS1) >> pscp.rsp echo $(LIBS2) >> pbe_all.$(OBJ): be_all.c be_nossh.$(OBJ): be_nossh.c be_none.$(OBJ): be_nonenossh_res.$(RES): nossh_res.rc win_res.h putty.ico ##-- nossh_res.$(RES): rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 nossh Node-path: putty/be_all.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 336 Text-content-md5: 966c57698ec7ef2d38f468b5d79d2288 Text-content-sha1: 3a5e64fc1c9bf88d3d70c3f4bdc995c3bdbb9290 Content-length: 452 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNBBB/* * Linking module for PuTTY proper: list the available backends * including ssh. */ #include #include #include "putty.h" struct backend_list backends[] = { {PROT_SSH, "ssh", &ssh_backend}, {PROT_TELNET, "telnet", &telnet_backend}, {PROT_RAW, "raw", &raw_backend}, {0, NULL} }; Node-path: putty/be_none.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 302 Text-content-md5: baa0956335f552ce87e08fbd42cba366 Text-content-sha1: a841db2c05ecaa7cd126be122e1b9163ee1c9271 Content-length: 418 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  /* * Linking module for PSCP: list no available backends. This is * only present to satisfy linker requirements. I should really * untangle the whole lot a bit better. */ #include #include #include "putty.h" struct backend_list backends[] = { {0, NULL} }; Node-path: putty/be_nossh.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 445 Text-content-md5: c6bc2ee9a9f9fc950576f7ba78c6a7bf Text-content-sha1: fe282a5909ca206a237187c9fc6e4a7eedb2bf3d Content-length: 561 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN////* * Linking module for PuTTYtel: list the available backends not * including ssh. */ #include #include #include "putty.h" struct backend_list backends[] = { {PROT_TELNET, "telnet", &telnet_backend}, {PROT_RAW, "raw", &raw_backend}, {0, NULL} }; /* * Stub implementations of functions not used in non-ssh versions. */ void random_save_seed(void) { } void noise_ultralight(DWORD data) { } Node-path: putty/nossh_res.rc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 100 Text-content-md5: 02d089ca2a8c5635aeb3096266f3354c Text-content-sha1: 10f828e78f4f794fe3dc3b1a74a6f392cbd004a4 Content-length: 216 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNYYY/* Stub rc file for the PuTTYtel ssh-free binary */ #define NO_SSH #include "win_res.rc" Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b36d6e96ec8955fc88f872ac834d577b Text-delta-base-sha1: 49062958012bce799f645b841e1316a725d175e2 Text-content-length: 137 Text-content-md5: 814498d76abc5bee155a5cf3b22ed02a Text-content-sha1: 32b20aea4f01aae8bdca2265af52777e4431bb40 Content-length: 177 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN5masGLOBAL struct backend_list { int protocol; char *name; Backend *backend; } backends[]char *keystr Node-path: putty/scpssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2959b938e2111741c86d12e278ed73ad Text-delta-base-sha1: b4471f83f8caaa82f65dccf692afc1d9941a7e6c Text-content-length: 388 Text-content-md5: 9b3c763ff75f306238bb6b7e38b4267a Text-content-sha1: 5e43a746b73b38b6e129d2ce0985e7fdc82ec26c Content-length: 427 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN] lelO/* * Verify the host key. */ { /* * First format the key into a string. */ int len = rsastr_len(&hostkey); char *keystr = malloc(len); if (!keystr) fatalbox("Out of memory"); rsastr_fmt(keystr, &hostkey); verify_ssh_host_key(savedhost, keystr); free(keystr); } Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79383ee645e808c6401998dd2aebc005 Text-delta-base-sha1: e4530b115479c95b8d35a57c34ffafe9145c225a Text-content-length: 390 Text-content-md5: 15737c892680290d9f069bb523da2b06 Text-content-sha1: 8ade4c2c419e2cb83b664fda589173fb9c59eb92 Content-length: 430 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN}@ lGl p/* * Verify the host key. */ { /* * First format the key into a string. */ int len = rsastr_len(&hostkey); char *keystr = malloc(len); if (!keystr) fatalbox("Out of memory"); rsastr_fmt(keystr, &hostkey); verify_ssh_host_key(savedhost, keystr); free(keystr); } Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 985f7c12d83346f355a04e539f031d60 Text-delta-base-sha1: 45ebeeea5c1feb3ff9b38e268fc36fe3261d6f0f Text-content-length: 39 Text-content-md5: 81c1606b8ca3035c8a79c77c71959405 Text-content-sha1: f2045130be27400dab71371d2e4ef00e4a2de3d3 Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN5KB~|9#ifndef NO_SSH Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2f113cf325e152029b24ecb55d95de7a Text-delta-base-sha1: d5bf7ba94062828efe462df754831ea6a78fdf77 Text-content-length: 653 Text-content-md5: a9aa1a4b0123cdae7aa8c41b98def332 Text-content-sha1: 1415d120c913ddc7a79fe5d5af044f7594225197 Content-length: 693 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNn2b%p* Z`i'G p = "raw"; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == cfg.protocol) { p = backends[i].name; break; } wpps (sesskey, "Protocol", p gpps (sesskey, "Protocol", "default", prot, 10); cfg.protocol = default_protocol; for (i = 0; backends[i].backend != NULL; i++) if (!strcmp(prot, backends[i].name)) { cfg.protocol = backends[i].protocol; break; }char *keystr) { char *otherstr, *mungedhost; int len; HKEY rkey; len = 1 + strlen(keystr Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2b1fce697d5ecf64213a7a7e207b8d31 Text-delta-base-sha1: 4ad88be9396f349a54b32a86b11cfc0472979ac0 Text-content-length: 617 Text-content-md5: 0402de65fee2593dfa142d3d16783f7b Text-content-sha1: 8cae84ec75ab1ce528ffd53d4be145968b688a5b Content-length: 657 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN- NN2{/* * Select protocol. This is farmed out into a table in a * separate file to enable an ssh-free variant. */ { int i; back = NULL; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == cfg.protocol) { back = backends[i].backend; break; } if (back == NULL) { MessageBox(NULL, "Unsupported protocol number found", "PuTTY Internal Error", MB_OK | MB_ICONEXCLAMATION); WSACleanup(); return 1; } } Revision-number: 411 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2000-03-16T10:43:30.000000Z K 7 svn:log V 17 More cvs ignores K 10 svn:author V 5 simon PROPS-END Node-path: putty Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 105 Content-length: 105 K 10 svn:ignore V 73 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe Makefile.bor Makefile.cyg PROPS-END Node-path: putty/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 91d2c7f274245107dac3e76f09767869 Text-delta-base-sha1: 5f97366a6eab5231659b170d1e6b6a8fef78d75a Text-content-length: 85 Text-content-md5: 4d47ac536c682d87d0df551b59b2bfa7 Text-content-sha1: 24177b2fcefa9b78ac02f15cfaa107b51f48fa0b Content-length: 124 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN$JJJ*.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe Makefile.bor Makefile.cyg Revision-number: 412 Prop-content-length: 145 Content-length: 145 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-03-16T10:45:48.000000Z K 7 svn:log V 45 Fix a couple of Makefile dependencies - oops PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8c039bd2194d5b6b0596ef26ccdc4104 Text-delta-base-sha1: 1067a3607a5999e9effeea7324fb1cc806ea1901 Text-content-length: 27 Text-content-md5: e1a3e5593228b8f864a438cd94e93c6e Text-content-sha1: cc652daaf64caa6c557a644b786211c3c42fd989 Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN5@B(CU`T Revision-number: 413 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:02.343597Z PROPS-END Revision-number: 414 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:02.353954Z PROPS-END Revision-number: 415 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2000-03-16T14:56:26.000000Z K 7 svn:log V 34 PuTTY website URL spelling change K 10 svn:author V 5 simon PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 36efa246bcc08f383eedbe8ba68e053f Text-delta-base-sha1: b910abb0dea28e136e3d8a195ea604d5e07ae063 Text-content-length: 22 Text-content-md5: 16875ccfb314f1fbaa57c67925e3c403 Text-content-sha1: 89fd9593c3a2e561cdef7ae9b873fc83f03e600e Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN;7 ) ./ Revision-number: 416 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2000-03-17T10:30:21.000000Z K 7 svn:log V 61 RDB patch: disable incremental linking and disable debugging K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e1a3e5593228b8f864a438cd94e93c6e Text-delta-base-sha1: cc652daaf64caa6c557a644b786211c3c42fd989 Text-content-length: 228 Text-content-md5: 88ca3a0b5c442475777a91abcc236eb4 Text-content-sha1: f2991c9183c1fc8078ccf1204c7b249ba1eb19ac Content-length: 268 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN@k<Q!PmpicnR# LFLAGS = /debug # Use MSVC DLL # CFLAGS = /nologo /W3 /YX /O2 /Yd /D_WINDOWS /DDEBUG /ML /Fd # Disable debug and incremental linking LFLAGS = /incremental:no$(LFLAGS)$(LFLAGS)$(LFLAGS) Revision-number: 417 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2000-03-17T10:31:14.000000Z K 7 svn:log V 124 RDB's patch: ^U sends Telnet Erase Line; line ending is now \r or \r\n depending on protocol, so local ldisc works with ssh K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7d9a36168ec580f09451c18f5d48b0c2 Text-delta-base-sha1: b4ad64f8053f1520ee68b0fd24a40dc020a02c02 Text-content-length: 149 Text-content-md5: 55265948a373533716ec11e7053678fe Text-content-sha1: 2e061d260b0c4f8c5909d9997bc77a7d13cb0437 Content-length: 188 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN}hyrNlc/Nback->special (TS_EL);if (cfg.protocol == PROT_RAW) back->send("\r\n", 2); else back->send("\r", 1 Revision-number: 418 Prop-content-length: 439 Content-length: 439 K 8 svn:date V 27 2000-03-17T10:34:41.000000Z K 7 svn:log V 338 RDB's patch: - use WM_TIMER for various things (blinking cursor; updates while moving/sizing; coping with overloading influx of netevents) - clip text output to avoid underlines outside character cell - even more careful font selection (we can now do OEMANSI by default) - a few extra keyboard mappings from the VTxxx terminals K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0402de65fee2593dfa142d3d16783f7b Text-delta-base-sha1: 8cae84ec75ab1ce528ffd53d4be145968b688a5b Text-content-length: 7892 Text-content-md5: 49c943a50dc160705a8941ef75915117 Text-content-sha1: bbed815e1cb78a10018408adfeeb4350558f529c Content-length: 7932 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNXCfJG?\9!;;NG2U40!T:u]k/U Bl@xsj`3mROKG@$:;? l0lH\9Ugp.OVyVyVyi|fiYxgXUSER + 1) #define WM_IGNORE_CLIP (WM_XUSER + 2int); static int extra_width, extra_height; static int pending_netevent = 0; static WPARAM pend_netevent_wParam = 0; static LPARAM pend_netevent_lParam = 0; static void enact_pending_netevent(void)0{ int timer_id = 0, long_timer = 0; while (GetMessage (&msg, NULL, 0, 0) == 1) { /* Sometimes DispatchMessage calls routines that use their own * GetMessage loop, setup this timer so we get some control back. * * Also call term_update() from the timer so that if the host * is sending data flat out we still do redraws. */ if(timer_id && long_timer) { KillTimer(hwnd, timer_id); long_timer = timer_id = 0; } if(!timer_id) timer_id = SetTimer(hwnd, 1, 20, NULL); DispatchMessage (&msg); /* This is too fast, but I'll leave it for now 'cause it shows * how often term_update is called (far too often at times!) */ term_blink(0); /* If there's nothing new in the queue then we can do everything * we've delayed, reading the socket, writing, and repainting * the window. */ if (!PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { if (pending_netevent) { enact_pending_netevent(); term_blink(1); } } else continue; if (!PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { if (timer_id) { KillTimer(hwnd, timer_id); timer_id = 0; } if (inbuf_reap != inbuf_head) term_out(); term_update(); timer_id = SetTimer(hwnd, 1, 500, NULL); long_timer = 1; } }Actually do the job requested by a WM_NETEVENT */ static void enact_pending_netevent(void) { int i; pending_netevent = FALSE; i = back->msg (pend_netevent_wParam, pend_netevent_lParam); if (i < 0) { char buf[1024]; switch (WSABASEERR + (-i) % 10000) { case WSAECONNRESET: sprintf(buf, "Connection reset by peer"); break; default: sprintf(buf, "Unexpected network error %d", -i); break; } MessageBox(hwnd, buf, "PuTTY Fatal Error", MB_ICONERROR | MB_OK); PostQuitMessage(1); } else if (i == 0) { if (cfg.close_on_exit) PostQuitMessage(0); else { session_closed = TRUE; MessageBox(hwnd, "Connection closed by remote host", "PuTTY", MB_OK | MB_ICONINFORMATION); SetWindowText (hwnd, "PuTTY (inactive)"); } }/ static void init_fonts(int pick_width) { TEXTMETRIC tm; int i; int fsize[8]; HDC hdc; int fw_dontcare, fw_bold; int firstchar = ' '; #ifdef CHECKOEMFONT font_messup: #endifpick_widthfor (i=0; i<8; i++) { if (fonts[i]) { if (SelectObject (hdc, fonts[i]) && GetTextMetrics(hdc, &tm) ) fsize[i] = tm.tmAveCharWidth + 256 * tm.tmHeight; else fsize[i] = -i; } else fsize[i] = -i; } ReleaseDC (hwnd, hdc); /* ... This is wrong in OEM only mode */ } #ifdef CHECKOEMFONT /* With the facist font painting it doesn't matter if the linedraw font * isn't exactly the right size anymore so we don't have to check this. */#endif } void request_resize (int w, int h, int refont) { int width, height; #ifdef CHECKOEMFONT /* Don't do this in OEMANSI, you may get disable messages */ if (refont && w != cols && (cols==80 || cols==132) && cfg.vtmode != VT_OEMANSI) #else if (refont && w != cols && (cols==80 || cols==132)) #endif { /* If font width too big for screen should we shrink the font more ? */ if (w==132) font_width = ((font_width*cols+w/2)/w); else font_width = 0; { int i; for (i=0; i<8; i++) if (fonts[i]) DeleteObject(fonts[i]); } bold_mode = cfg.bold_colour ? BOLD_COLOURS : BOLD_FONT; und_mode = UND_FONT; init_fonts(font_width); } width = extra_width + font_width * w; TIMER: if (pending_netevent) enact_pending_netevent(); if (inbuf_reap != inbuf_head) term_out(); term_update(); return 0;0); sfree(logpal); /* Telnet will change local echo -> remote if the remote asks */ if (cfg.protocol != PROT_TELNET) ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple/* Notice we can get multiple netevents, FD_READ, FD_WRITE etc * but the only one that's likely to try to overload us is FD_READ. * This means buffering just one is fine. */ if (pending_netevent) enact_pending_netevent(); pending_netevent = TRUE; pend_netevent_wParam=wParam; pend_netevent_lParam=lParam;int lattr = 0; /* Will be arg later for line attribute type */ COLORREF fg, bg, t; int nfg, nbg, nfont; HDC hdc = ctx; RECT line_box; int force_manual_underline = 0; static int *IpDx = 0, IpDxLEN = 0;; if (len>IpDxLEN || IpDx[0] != font_width*(1+!lattr)) { int i; if (len>IpDxLEN) { sfree(IpDx); IpDx = smalloc((len+16)*sizeof(int)); IpDxLEN = (len+16); } for(i=0; i= '\x60' && text[i] <= '\x7E') text[i] = oemmap[(unsigned char)text[i] - 0x60]; break; }!fonts[nfont]) { if (nfont&FONT_UNDERLINE) force_manual_underline = 1; /* Don't do the same for manual bold, it could be bad news. */ nfont &= ~(FONT_BOLD|FONT_UNDERLINE); }if (bold_mode == BOLD_COLOURS && (attr & ATTR_BLINK)) nbline_box.left = x; line_box.top = y; line_box.right = x+font_width*len; line_box.bottom = y+font_height; ExtTextOut (hdc, x, y, ETO_CLIPPED|ETO_OPAQUE, &line_box, text, len, IpDx /* GRR: This draws the character outside it's box and can leave * 'droppings' even with the clip box! I suppose I could loop it * one character at a time ... yuk. */ ExtTextOut (hdc, x-1, y, ETO_CLIPPED, &line_box, text, len, IpDx); } if (force_manual_underline || (und_mode == UND_LINE && (attr & ATTR_UNDER) * In addition a real VT100 maps Ctrl-3/4/5/7 and 83') { *p++ = 0x1B'4') { *p++ = 0x1C'5') { *p++ = 0x1D'7''8') { *p++ = 0x7 Revision-number: 419 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2000-03-17T10:35:09.000000Z K 7 svn:log V 84 RDB's patch: thanks to improvements in OEMANSI font mode, it can now be the default K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a9aa1a4b0123cdae7aa8c41b98def332 Text-delta-base-sha1: 1415d120c913ddc7a79fe5d5af044f7594225197 Text-content-length: 31 Text-content-md5: 1240c2116086226e07214844305a7487 Text-content-sha1: 91a26a452704e2a904a443eba69331dc8b2665f5 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN22 FeMOEMANSI Revision-number: 420 Prop-content-length: 530 Content-length: 530 K 8 svn:date V 27 2000-03-17T10:37:35.000000Z K 7 svn:log V 429 RDB's patch: - `local ldisc' config option now switches between PuTTY's original behaviour when off (aggressively start negotiations, never use local line discipline) and Unix telnet's off-port-25 behaviour when on (wait to be negotiated with, toggle local line discipline when TELOPT_ECHO changes) - SYNCH handling has been improved again, though it may still be broken due to WinSock being irretrievably pants K 10 svn:author V 5 simon PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fad3dc060a3795dd0b6284df4ef42a7d Text-delta-base-sha1: 193ea92d5dace0c0557690528e8af18dab8907cc Text-content-length: 1358 Text-content-md5: 5dc5b693f1d85f0fae34f5d8d4b3bdbb Text-content-sha1: ade52a6cb835a29034d180d5ea0e1b5146ce3219 Content-length: 1398 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNL3B~&Hs 8KnpH/S]lAgYD;static int in_synch; && cfg.ldisc_term) ldisc = &ldisc_simple; && cfg.ldisc_term) ldisc = &ldisc_term; if (!in_synch) c_write (b, 1); #if 1 /* I can't get the F***ing winsock to insert the urgent IAC * into the right position! Even with SO_OOBINLINE it gives * it to recv too soon. And of course the DM byte (that * arrives in the same packet!) appears several K later!! * * Oh well, we do get the DM in the right place so I'll * just stop hiding on the next 0xf2 and hope for the best. */ else if (c == DM) in_synch = 0; #endifif (c == DM) { in_synch = 0; telnet_state = TOPLEVEL; } { BOOL b = TRUE; setsockopt (s, SOL_SOCKET, SO_OOBINLINE, (void *)&b, sizeof(b)); } /* * Set up SYNCH state. */ in_synch = FALSE;{ int clear_of_oob = 1; if (ioctlsocket (s, SIOCATMARK, &clear_of_oob) < 0 ) return -20000-WSAGetLastError(); in_synch = !clear_of_oob; do { ret = recv(s, buf, sizeof(buf), 0); if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK) return 1; if (ret < 0) /* any _other_ error */ return -10000-WSAGetLastError(); if (ret == 0) { s = INVALID_SOCKET; return 0; } do_telnet_read (buf, ret); } while (in_synch); } Revision-number: 421 Prop-content-length: 347 Content-length: 347 K 8 svn:date V 27 2000-03-17T10:39:05.000000Z K 7 svn:log V 246 RDB's patch. Oodles of new terminal functionality, including ATTR_BLINK (as bold background) and VT52 support. Plus a compatibility tracking system whereby all escape sequences can be disabled for a pure-VT102 compatibility mode or other levels. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 814498d76abc5bee155a5cf3b22ed02a Text-delta-base-sha1: 32b20aea4f01aae8bdca2265af52777e4431bb40 Text-content-length: 370 Text-content-md5: 55fe85d98c26900f12ad8b10b3436f32 Text-content-sha1: 0b0d31cfc9bcff02f0ea1dba401f7acf385c965f Content-length: 410 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNUI$/=b+QBBLINK 0x000008/* * I've just looked in the windows standard headr files for WM_USER, there * are hundreds of flags defined using the form WM_USER+123 so I've * renumbered this NETEVENT value and the two in window.c */ #define WM_XUSER (WM_USER + 0x2000) #define WM_NETEVENT (WM_XUSER + 5void term_blink(int set_cursor Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2cc648d965f6974c6bc9b33e0d780dc3 Text-delta-base-sha1: 9bcec2aa4cb7b884950f32da6e516c6ec33fdeb2 Text-content-length: 14931 Text-content-md5: 3ca733901b116f52dc62d564079d4c7b Text-content-sha1: f61da740301eff226f718b3454d14f0441f9519e Content-length: 14971 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNr^fRt!P{o5fIG|;|ifwaga-p3-ngJ@O#paMto't:0<wF#M<qtGi](]>t0o"GL;Ao:1%^d`@c Z^OcbOoTqZJ{J}6%"$E\pfxTCG~|*C]etQ]` E`ToT@L|Tm#c#$Vu'CZNNOTlJl#define CL_ANSIMIN 0x0001 /* Everybody has these even MSDOS */ #define CL_VT100 0x0002 /* VT100 */ #define CL_VT100AVO 0x0004 /* VT100 +AVO; 132x24 (not 132x14) & attrs */ #define CL_VT102 0x0008 /* VT102 */ #define CL_VT220 0x0010 /* VT220 */ #define CL_VT320 0x0020 /* VT320 */ #define CL_VT420 0x0040 /* VT420 */ #define CL_VT510 0x0080 /* VT510, NB VT510 includes ANSI */ #define CL_VT340TEXT 0x0100 /* VT340 extensions that appear in the VT420 */ #define CL_ANSI 0x1000 /* ANSI ECMA-48 not in the VT100..VT420 */ #define CL_OTHER 0x2000 /* Others, Xterm, linux, putty, dunno, etc */ #define TM_ANSIMIN (CL_ANSIMIN) #define TM_VT100 (CL_ANSIMIN+CL_VT100) #define TM_VT100AVO (TM_VT100+CL_VT100AVO) #define TM_VT102 (TM_VT100AVO+CL_VT102) #define TM_PUTTY (-1) #define compatibility(x) \ if ( ((CL_##x)&compatibility_level) == 0 ) { \ termstate=TOPLEVEL; \ break; \ } #define has_compat(x) ( ((CL_##x)&compatibility_level) != 0 ) static int compatibility_level = TM_PUTTY; static unsigned long erase_char = ERASE_CHARstatic int cursor_on; /* cursor enabled flag */ static int reset_132; /* Flag ESC c resets to 80 cols */ static int use_bce; /* Use Background coloured erase */ static int blinker; /* When blinking is the cursor on ? */ static int vt52_mode; /* Is VT100+ in vt52 mode ?, VT52_ESC, VT52_Y1, VT52_Y2cursor_on = 1use_bce = 0; erase_char = ERASE_CHARerase_charerase_charerase_char if (use_bce) erase_char = (' ' |(curr_attr&(ATTR_FGMASK|ATTR_BGMASK)))+1; check_selection (startpos, endpos); /* Clear screen also forces a full window redraw, just in case. */ if (startpos == scrtop && endpos == scrtop + rows * (cols+1)) term_invalidate(); while (startpos < endpos) *startpos++ = erase_charerase_char; } else { memmove (cpos+n, cpos, m*TSIZE); while (n--) cpos[n] = erase_char2: /* VT52 mode */ vt52_mode = !, 1); reset_132 = state; break; case 5: /* reverse video */ rvideo = state; seen_disp_event = TRUE; if (state) term_update()25: /* enable/disable cursor */ compatibility(VT220); cursor_on = state; seen_disp_event = TRUE; break; case 47: /* alternate screen */ compatibility(OTHER);compatibility(VT102); insert = state; break; case 12: /* set echo mode */ /* * This may be very good in smcup and rmcup (or smkx & rmkx) if you * have a long RTT and the telnet client/daemon doesn't understand * linemode. * * DONT send TS_RECHO/TS_LECHO; the telnet daemon tries to fix the * tty and _really_ confuses some programs. */ compatibility(VT220); ldisc = (state? &ldisc_simple : &ldisc_term)/* Note only VT220+ are 8-bit VT102 is seven bit, it shouldn't even * be able to display 8-bit characters, but I'll let that go 'cause * of i18n. */ if( (c&0x60) == 0 && termstate < DO_CTRLS && ( (c&0x80) == 0 || has_compat(VT220))) { switch (c) { case '\005': /* terminal type query */ /* Strictly speaking this is VT100 but a VT100 defaults to * no response. Other terminals respond at their option. * * Don't put a CR in the default string as this tends to * upset some weird software. * * An xterm returns "xterm" (5 characters) */ compatibility(OTHER); ldisc->send ("PuTTY", 5 compatibility(VT100); cset = 1; break; case '\017': compatibility(VT100); cset = 0; break; case '\033': if (vt52_mode) termstate = VT52_ESC; else { compatibility(ANSIMIN); termstate = SEEN_ESC; } break; case 0233: compatibility(VT220);0235: compatibility(VT220); compatibility(VT100); } if (insert) insch (1); if (selstate != NO_SELECTION) check_selection (cpos, cpos+1); switch (cset_attr[cset]) { /* Linedraw characters are different from 'ESC ( B' only * for a small range, for ones outside that range make sure * we use the same font as well as the same encoding. */ case ATTR_LINEDRW: if (c<0x60 || c>0x7F) *cpos++ = xlat_tty2scr((unsigned char)c) | curr_attr | ATTR_ASCII; else *cpos++ = ((unsigned char)c) | curr_attr | ATTR_LINEDRW; break; default: *cpos++ = xlat_tty2scr((unsigned char)c) | curr_attr | (c <= 0x7F ? cset_attr[cset] : ATTR_ASCII); break; } compatibility(VT220);/* Compatibility is nasty here, xterm, linux, decterm yuk! */ compatibility(OTHER); termstate = SEEN_OSC; esc_args[0] = 0; break; case '(': /* should set GL */ compatibility(VT100); termstate = SET_GL; break; case ')': /* should set GR */ compatibility(VT100); compatibility(VT100); save_cursor (TRUE); break; case '8': /* restore cursor */ compatibility(VT100); save_cursor (FALSE); seen_disp_event = TRUE; break; case '=': compatibility(VT100); app_keypad_keys = TRUE; break; case '>': compatibility(VT100); app_keypad_keys = FALSE; break; case 'D': /* exactly equivalent to LF */ compatibility(VT100);fix_cpos; wrapnext = FALSE; seen_disp_event = TRUE; break; case 'E': /* exactly equivalent to CR-LF */ compatibility(VT100); compatibility(VT100); compatibility(VT100); compatibility(VT100); power_on(); if (reset_132) { request_resize (80, rows, 1); reset_132 = 0; } compatibility(VT100); termstate = SEEN_ESCHASH; break; case 'H': /* set a tab */ compatibility(VT100);e': /* move down N lines */ compatibility(ANSI); case 'B':a': /* move right N cols */ compatibility(ANSI); case 'C': compatibility(ANSI); move (0F': /* move up N lines and CR */ compatibility(ANSI); move (0, curs_y -G': case '`': /* set horizontal posn */ compatibility(ANSI); compatibility(ANSI); move (curs_x, compatibility(VT102); compatibility(VT102);/* XXX VTTEST says this is vt220, vt510 manual says vt102 */ compatibility(VT102); compatibility(VT102); compatibility(VT100); /* This is the response for a VT102/* Wonder of wonders ANSI.SYS has this!! */ char buf[32]; sprintf (buf, "\033[%d;%dR", curs_y + 1, curs_x + 1); ldisc->send (buf, strlen(buf)); } else if (esc_args[0] == 5) { /* Are we working ... well I suppose so :-) */ /* But ANSI.SYS doesn't say it's working :-) :-) */ compatibility(VT100); ldisc->send ("\033[0n", 4); } break; case 'h': /* toggle modes to high */ case ANSI_QUE('h'): compatibility(VT100); { int i; for (i=0; i=24)) { request_resize (cols, def(esc_args[0], 24), 0); deselect(); } break; case ANSI('|', '*'): /* VT420 sequence DECSNLS * Set number of lines on screen * VT420 uses VGA like hardware and can support any size in * reasonable range (24..49 AIUI) with no default specified. */ compatibility(VT420); if (esc_nargs==1 && esc_args[0]>=24) { request_resize (cols, def(esc_args[0], cfg.height), 0); deselect(); } break; case ANSI('|', '$'): /* VT340/VT420 sequence DECSCPP * Set number of columns per page * Docs imply range is only 80 or 132, but I'll allow any. */ compatibility(VT340TEXT); if (esc_nargs<=1) { request_resize (cols, def(esc_args[0], cfg.width), 0); deselect(); }/* XXX VTTEST says this is vt220, vt510 manual says vt100 */ compatibility(VT100);erase_char; seen_disp_event = TRUE; } break; case 'x': /* report terminal characteristics */ compatibility(VT100); case ANSI('L','='): compatibility(OTHER); use_bce = (esc_args[0]<=0); erase_char = ERASE_CHAR; if (use_bce) erase_char = (' '|(curr_attr&(ATTR_FGMASK|ATTR_BGMASK))); break; case ANSI('p','"'): /* Allow the host to make this emulator a 'perfect' VT102. * This first appeared in the VT220, but we do need to get * back to PuTTY mode so I won't check it. * * The arg == 60 is a PuTTY extension. * The 2nd arg, 8bit vs 7bit is not obeyed. * * Setting VT102 mode should also change the Fkeys to * generate PF* codes as a real VT102 has no Fkeys. * The VT220 does this, F11..F13 become ESC,BS,LF other Fkeys * send nothing. * * Note ESC c will NOT change this! */ if (esc_args[0] == 61) compatibility_level = TM_VT102; else if (esc_args[0] == 60) compatibility_level = TM_ANSIMIN; else compatibility_level = TM_PUTTY; break; } break; case SET_GL: case SET_GR: /* VT100 only here, checked above */case 'B':!has_compat(VT220) || case VT52_ESC: termstate = TOPLEVEL; seen_disp_event = TRUE; switch (c) { case 'A': move (curs_x, curs_y - 1, 1); break; case 'B': move (curs_x, curs_y + 1, 1); break; case 'C': move (curs_x + 1, curs_y, 1); break; case 'D': move (curs_x - 1, curs_y, 1); break; case 'F': cset_attr[cset=0] = ATTR_LINEDRW; break; case 'G': cset_attr[cset=0] = ATTR_ASCII; break; case 'H': move (0, 0, 0); break; case 'I': if (curs_y == 0) scroll (0, rows-1break; case 'J': erase_lots(FALSE, FALSE, TRUE); disptop = scrtop; break; case 'K': erase_lots(TRUE, FALSE, TRUE); break; case 'V': /* XXX Print cursor line */ break; case 'W': /* XXX Start controller mode */ break; case 'X': /* XXX Stop controller mode */ break; case 'Y': termstate = VT52_Y1; break; case 'Z': ldisc->send ("\033/Z", 3); break; case '=': app_cursor_keys = TRUE; break; case '>': app_cursor_keys = FALSE; break; case '<': /* XXX This should switch to VT100 mode not current or default * VT mode. But this will only have effect in a VT220+ * emulation. */ vt52_mode = FALSE; break; case '^': /* XXX Enter auto print mode */ break; case '_': /* XXX Exit auto print mode */ break; case ']': /* XXX Print screen */ break; } break; case VT52_Y1: termstate = VT52_Y2; move(curs_x, c-' ', 0); break; case VT52_Y2: termstate = TOPLEVEL; move(c-' ', curs_y, 0); break; } if (selstate != NO_SELECTION) check_selection (cpos, cpos+1); }if (cursor_on) { if (has_focus) { if (blinker) cursor = ATTR_ACTCURS; else cursor = 0; } else cursor = ATTR_PASCURS; } else cursor = 0Flick the switch that says if blinking things should be shown or hidden. */ void term_blink(int flg) { static long last_blink = 0; long now, blink_diff; if (flg) { blinker = 1; last_blink = GetTickCount(); return; } now = GetTickCount(); blink_diff = now-last_blink; /* Make sure the cursor blinks no more than 2Hz */ if (blink_diff>=0 && blink_diff<450) return; last_blink = now; blinker = !blinker;/* This should happen soon enough, also for some reason it sometimes * fails to actually do anything when re-sizing ... painting the wrong * window perhaps ? do_paint (ctx, FALSE); */ Revision-number: 422 Prop-content-length: 160 Content-length: 160 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-03-17T10:40:36.000000Z K 7 svn:log V 60 Spelling fix to RDB's comments: fascist is spelled thus :-) PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 49c943a50dc160705a8941ef75915117 Text-delta-base-sha1: bbed815e1cb78a10018408adfeeb4350558f529c Text-content-length: 27 Text-content-md5: cce79bf0a72141e2f0c04ecf56c69f36 Text-content-sha1: 6b41ae1befe74d35204caed1ad53fc637d92f417 Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNXY frfs Revision-number: 423 Prop-content-length: 201 Content-length: 201 K 8 svn:date V 27 2000-03-17T10:46:59.000000Z K 7 svn:log V 100 Patch to RDB's blinking cursor: make it configurable and by default off. It's terribly distracting. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 55fe85d98c26900f12ad8b10b3436f32 Text-delta-base-sha1: 0b0d31cfc9bcff02f0ea1dba401f7acf385c965f Text-content-length: 34 Text-content-md5: bc09a3c57a3de2cdbf1613d6c65cf6a8 Text-content-sha1: 8d748abc05d3b29a4ee98ca21e307da2dd47707e Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNUh ufoint blink_cur Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ca733901b116f52dc62d564079d4c7b Text-delta-base-sha1: f61da740301eff226f718b3454d14f0441f9519e Text-content-length: 109 Text-content-md5: 20af9a59c4e8902a09a1530259f3f095 Text-content-sha1: d206fbaa7bd793c11b7c4c63b9126269226f76e2 Content-length: 149 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNr# SS6< || !cfg.blink_cur) cursor = ATTR_ACTCURS; else Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 37a9f78f5b5bcd79fe27bd11d182c1e7 Text-delta-base-sha1: ef1938a1af0364826fdfc3b61a85f506aec98138 Text-content-length: 49 Text-content-md5: fbb30648927a5e43f4a177c70f683d3b Text-content-sha1: 849df60fa689258bb2a15573fd0a3e936bc64017 Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN; ,s+#define IDC1_BLINKCUR 1020 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 81c1606b8ca3035c8a79c77c71959405 Text-delta-base-sha1: f2045130be27400dab71371d2e4ef00e4a2de3d3 Text-content-length: 87 Text-content-md5: 27fa15ded1d5d24ce2617c2c95b6b1c6 Text-content-sha1: a28e10efea364c20b215c1f40ea431d61397a904 Content-length: 127 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNK AGA< AUTOCHECKBOX "&Blinking cursor", IDC1_BLINKCUR, 3, 14 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1240c2116086226e07214844305a7487 Text-delta-base-sha1: 91a26a452704e2a904a443eba69331dc8b2665f5 Text-content-length: 224 Text-content-md5: 6918fc95c07030c2b56b13a66eb84fba Text-content-sha1: 11b7725d4219b2d6bd473cadf61b69f8f0868bfb Content-length: 264 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN2~%- Sr..X\hV\BlinkCur", cfg.blink_curBlinkCur", 0, &cfg.blink_curCheckDlgButton (hwnd, IDC1_BLINKCUR, cfg.blink_cur case IDC1_BLINKCURblink_cur = IsDlgButtonChecked (hwnd, IDC1_BLINKCUR Revision-number: 424 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2000-03-17T11:23:33.000000Z K 7 svn:log V 30 Oops - move homepage location K 10 svn:author V 5 simon PROPS-END Node-path: putty/MODULE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1c7e9eb29fd5c576df5809a22f24083f Text-delta-base-sha1: 1600829e966db5e174f22142f56cc7d43d7277a8 Text-content-length: 78 Text-content-md5: 45a4d6e340db266505ea95ca46bc8e4f Text-content-sha1: 29f752a8544bdbaae77dd54f3c124991eb0f9197 Content-length: 117 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNNF>/ Release: http://www.chiark.greenend.org.uk/~sgtatham/putty/ Revision-number: 425 Prop-content-length: 450 Content-length: 450 K 8 svn:date V 27 2000-03-24T09:45:49.000000Z K 7 svn:log V 349 Peter Schellenbach's patch: re-implement the PuTTY cryptographic functions as calls to the MS Crypto API. Not integrated into the Makefile yet, but should eventually allow building of an SSH-enabled PuTTY which contains no native crypto code, so it can be used everywhere (and anyone who can get the MS encryption pack can still use the SSH parts). K 10 svn:author V 5 simon PROPS-END Node-path: putty/mscrypto.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 11807 Text-content-md5: 8ac044e607ab27c18e1977dac885e7fa Text-content-sha1: 23d4bfc8e0fc5644eac0cf2f2a5b0ec8962b73bf Content-length: 11923 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN#define _WIN32_WINNT 0x0400 #include #include #include #include #include "ssh.h" void fatalbox(char *fmt, ...); static HCRYPTKEY create_des_key(unsigned char *key); HCRYPTPROV hCryptProv; HCRYPTKEY hDESKey[2][3] = {{0,0,0},{0,0,0}}; /* global for now */ /* use Microsoft Enhanced Cryptographic Service Provider */ #define CSP MS_ENHANCED_PROV static BYTE PrivateKeyWithExponentOfOne[] = { 0x07, 0x02, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x52, 0x53, 0x41, 0x32, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xAB, 0xEF, 0xFA, 0xC6, 0x7D, 0xE8, 0xDE, 0xFB, 0x68, 0x38, 0x09, 0x92, 0xD9, 0x42, 0x7E, 0x6B, 0x89, 0x9E, 0x21, 0xD7, 0x52, 0x1C, 0x99, 0x3C, 0x17, 0x48, 0x4E, 0x3A, 0x44, 0x02, 0xF2, 0xFA, 0x74, 0x57, 0xDA, 0xE4, 0xD3, 0xC0, 0x35, 0x67, 0xFA, 0x6E, 0xDF, 0x78, 0x4C, 0x75, 0x35, 0x1C, 0xA0, 0x74, 0x49, 0xE3, 0x20, 0x13, 0x71, 0x35, 0x65, 0xDF, 0x12, 0x20, 0xF5, 0xF5, 0xF5, 0xC1, 0xED, 0x5C, 0x91, 0x36, 0x75, 0xB0, 0xA9, 0x9C, 0x04, 0xDB, 0x0C, 0x8C, 0xBF, 0x99, 0x75, 0x13, 0x7E, 0x87, 0x80, 0x4B, 0x71, 0x94, 0xB8, 0x00, 0xA0, 0x7D, 0xB7, 0x53, 0xDD, 0x20, 0x63, 0xEE, 0xF7, 0x83, 0x41, 0xFE, 0x16, 0xA7, 0x6E, 0xDF, 0x21, 0x7D, 0x76, 0xC0, 0x85, 0xD5, 0x65, 0x7F, 0x00, 0x23, 0x57, 0x45, 0x52, 0x02, 0x9D, 0xEA, 0x69, 0xAC, 0x1F, 0xFD, 0x3F, 0x8C, 0x4A, 0xD0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0xD5, 0xAA, 0xB1, 0xA6, 0x03, 0x18, 0x92, 0x03, 0xAA, 0x31, 0x2E, 0x48, 0x4B, 0x65, 0x20, 0x99, 0xCD, 0xC6, 0x0C, 0x15, 0x0C, 0xBF, 0x3E, 0xFF, 0x78, 0x95, 0x67, 0xB1, 0x74, 0x5B, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; /* ---------------------------------------------------------* * Utility functions * * ---------------------------------------------------------*/ int crypto_startup() { if(CryptAcquireContext(&hCryptProv, "Putty", CSP, PROV_RSA_FULL, CRYPT_NEWKEYSET) == 0) { if(GetLastError() == NTE_EXISTS) { if(CryptAcquireContext(&hCryptProv, "Putty", CSP, PROV_RSA_FULL, 0) == 0) { return FALSE; /* failed to acquire context - probably * don't have high encryption installed! */ } } else return FALSE; /* failed to acquire context - probably * don't have high encryption installed! */ } return TRUE; } void crypto_wrapup() { int i, j; for(i=0; i<2; i++) { for(j=0; j<3; j++) { if(hDESKey[i][j]) CryptDestroyKey(hDESKey[i][j]); hDESKey[i][j] = 0; } } if(hCryptProv) CryptReleaseContext(hCryptProv, 0); hCryptProv = 0; } /* ---------------------------------------------------------* * Random number functions * * ---------------------------------------------------------*/ int random_byte(void) { unsigned char b; if(!CryptGenRandom(hCryptProv, 1, &b)) fatalbox("random number generator failure!"); return b; } void random_add_noise(void *noise, int length) { /* do nothing */ } void random_init(void) { /* do nothing */ } void random_get_savedata(void **data, int *len) { /* do nothing */ } void noise_get_heavy(void (*func) (void *, int)) { /* do nothing */ } void noise_get_light(void (*func) (void *, int)) { /* do nothing */ } void noise_ultralight(DWORD data) { /* do nothing */ } void random_save_seed(void) { /* do nothing */ } /* ---------------------------------------------------------* * MD5 hash functions * * ---------------------------------------------------------*/ void MD5Init(struct MD5Context *ctx) { if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &ctx->hHash)) fatalbox("Error during CryptBeginHash!\n"); } void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) { if(CryptHashData(ctx->hHash, buf, len, 0) == 0) fatalbox("Error during CryptHashSessionKey!\n"); } void MD5Final(unsigned char digest[16], struct MD5Context *ctx) { DWORD cb = 16; if(CryptGetHashParam(ctx->hHash, HP_HASHVAL, digest, &cb, 0) == 0) fatalbox("Error during CryptGetHashParam!\n"); if(ctx->hHash) CryptDestroyHash(ctx->hHash); ctx->hHash = 0; } /* ---------------------------------------------------------* * RSA public key functions * * ---------------------------------------------------------*/ int makekey(unsigned char *data, struct RSAKey *result, unsigned char **keystr) { unsigned char *p = data; int i; int w, b; /* get size (bits) of modulus */ result->bits = 0; for(i=0; i<4; i++) result->bits = (result->bits << 8) + *p++; /* get size (bits) of public exponent */ w = 0; for (i=0; i<2; i++) w = (w << 8) + *p++; b = (w+7)/8; /* bits -> bytes */ /* convert exponent to DWORD */ result->exponent = 0; for (i=0; iexponent = (result->exponent << 8) + *p++; /* get size (bits) of modulus */ w = 0; for (i=0; i<2; i++) w = (w << 8) + *p++; result->bytes = b = (w+7)/8; /* bits -> bytes */ /* allocate buffer for modulus & copy it */ result->modulus = malloc(b); memcpy(result->modulus, p, b); /* update callers pointer */ if (keystr) *keystr = p; /* point at key string, second time */ return (p - data) + b; } void rsaencrypt(unsigned char *data, int length, struct RSAKey *rsakey) { int i; unsigned char *pKeybuf, *pKeyin; HCRYPTKEY hRsaKey; PUBLICKEYSTRUC *pBlob; RSAPUBKEY *pRPK; unsigned char *buf; DWORD dlen; DWORD bufsize; /* allocate buffer for public key blob */ if((pBlob = malloc(sizeof(PUBLICKEYSTRUC) + sizeof(RSAPUBKEY) + rsakey->bytes)) == NULL) fatalbox("Out of memory"); /* allocate buffer for message encryption block */ bufsize = (length + rsakey->bytes) << 1; if((buf = malloc(bufsize)) == NULL) fatalbox("Out of memory"); /* construct public key blob from host public key */ pKeybuf = ((unsigned char*)pBlob) + sizeof(PUBLICKEYSTRUC) + sizeof(RSAPUBKEY); pKeyin = ((unsigned char*)rsakey->modulus); /* change big endian to little endian */ for(i=0; ibytes; i++) pKeybuf[i] = pKeyin[rsakey->bytes-i-1]; pBlob->bType = PUBLICKEYBLOB; pBlob->bVersion = 0x02; pBlob->reserved = 0; pBlob->aiKeyAlg = CALG_RSA_KEYX; pRPK = (RSAPUBKEY*)(((unsigned char*)pBlob) + sizeof(PUBLICKEYSTRUC)); pRPK->magic = 0x31415352; /* "RSA1" */ pRPK->bitlen = rsakey->bits; pRPK->pubexp = rsakey->exponent; /* import public key blob into key container */ if(CryptImportKey(hCryptProv, (void*)pBlob, sizeof(PUBLICKEYSTRUC)+sizeof(RSAPUBKEY)+rsakey->bytes, 0, 0, &hRsaKey) == 0) fatalbox("Error importing RSA key!"); /* copy message into buffer */ memcpy(buf, data, length); dlen = length; /* using host public key, encrypt the message */ if(CryptEncrypt(hRsaKey, 0, TRUE, 0, buf, &dlen, bufsize) == 0) fatalbox("Error encrypting using RSA key!"); /* * For some strange reason, Microsoft CryptEncrypt using public * key, returns the cyphertext in backwards (little endian) * order, so reverse it! */ for(i = 0; i < (int)dlen; i++) data[i] = buf[dlen - i - 1]; /* make it big endian */ CryptDestroyKey(hRsaKey); free(buf); free(pBlob); } int rsastr_len(struct RSAKey *key) { return 2 * (sizeof(DWORD) + key->bytes) + 10; } void rsastr_fmt(char *str, struct RSAKey *key) { int len = 0, i; sprintf(str+len, "%04x", key->exponent); len += strlen(str+len); str[len++] = '/'; for (i=1; ibytes; i++) { sprintf(str+len, "%02x", key->modulus[i]); len += strlen(str+len); } str[len] = '\0'; } /* ---------------------------------------------------------* * DES encryption / decryption functions * * ---------------------------------------------------------*/ void des3_sesskey(unsigned char *key) { int i, j; for(i = 0; i < 2; i++) { for(j = 0; j < 3; j++) { hDESKey[i][j] = create_des_key(key + (j * 8)); } } } void des3_encrypt_blk(unsigned char *blk, int len) { DWORD dlen; dlen = len; if(CryptEncrypt(hDESKey[0][0], 0, FALSE, 0, blk, &dlen, len + 8) == 0) fatalbox("Error encrypting block!\n"); if(CryptDecrypt(hDESKey[0][1], 0, FALSE, 0, blk, &dlen) == 0) fatalbox("Error encrypting block!\n"); if(CryptEncrypt(hDESKey[0][2], 0, FALSE, 0, blk, &dlen, len + 8) == 0) fatalbox("Error encrypting block!\n"); } void des3_decrypt_blk(unsigned char *blk, int len) { DWORD dlen; dlen = len; if(CryptDecrypt(hDESKey[1][2], 0, FALSE, 0, blk, &dlen) == 0) fatalbox("Error decrypting block!\n"); if(CryptEncrypt(hDESKey[1][1], 0, FALSE, 0, blk, &dlen, len + 8) == 0) fatalbox("Error decrypting block!\n"); if(CryptDecrypt(hDESKey[1][0], 0, FALSE, 0, blk, &dlen) == 0) fatalbox("Error decrypting block!\n"); } struct ssh_cipher ssh_3des = { des3_sesskey, des3_encrypt_blk, des3_decrypt_blk }; void des_sesskey(unsigned char *key) { int i; for(i = 0; i < 2; i++) { hDESKey[i][0] = create_des_key(key); } } void des_encrypt_blk(unsigned char *blk, int len) { DWORD dlen; dlen = len; if(CryptEncrypt(hDESKey[0][0], 0, FALSE, 0, blk, &dlen, len + 8) == 0) fatalbox("Error encrypting block!\n"); } void des_decrypt_blk(unsigned char *blk, int len) { DWORD dlen; dlen = len; if(CryptDecrypt(hDESKey[1][0], 0, FALSE, 0, blk, &dlen) == 0) fatalbox("Error decrypting block!\n"); } struct ssh_cipher ssh_des = { des_sesskey, des_encrypt_blk, des_decrypt_blk }; static HCRYPTKEY create_des_key(unsigned char *key) { HCRYPTKEY hSessionKey, hPrivateKey; DWORD dlen = 8; BLOBHEADER *pbh; char buf[sizeof(BLOBHEADER) + sizeof(ALG_ID) + 256]; /* * Need special private key to encrypt session key so we can * import session key, since only encrypted session keys can be * imported */ if(CryptImportKey(hCryptProv, PrivateKeyWithExponentOfOne, sizeof(PrivateKeyWithExponentOfOne), 0, 0, &hPrivateKey) == 0) return 0; /* now encrypt session key using special private key */ memcpy(buf + sizeof(BLOBHEADER) + sizeof(ALG_ID), key, 8); if(CryptEncrypt(hPrivateKey, 0, TRUE, 0, buf + sizeof(BLOBHEADER) + sizeof(ALG_ID), &dlen, 256) == 0) return 0; /* build session key blob */ pbh = (BLOBHEADER*)buf; pbh->bType = SIMPLEBLOB; pbh->bVersion = 0x02; pbh->reserved = 0; pbh->aiKeyAlg = CALG_DES; *((ALG_ID*)(buf+sizeof(BLOBHEADER))) = CALG_RSA_KEYX; /* import session key into key container */ if(CryptImportKey(hCryptProv, buf, dlen + sizeof(BLOBHEADER) + sizeof(ALG_ID), hPrivateKey, 0, &hSessionKey) == 0) return 0; if(hPrivateKey) CryptDestroyKey(hPrivateKey); return hSessionKey; } Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bc09a3c57a3de2cdbf1613d6c65cf6a8 Text-delta-base-sha1: 8d748abc05d3b29a4ee98ca21e307da2dd47707e Text-content-length: 119 Text-content-md5: 319a5804d24b2b566383c1eb12ac9f0f Text-content-sha1: 44a9abcbece106f4524b65b2a47673025af28820 Content-length: 159 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNhQ a%aKExports from mscrypto.c */ #ifdef MSCRYPTOAPI int crypto_startup(); void crypto_wrapup(); #endif Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 73303c479f38722443008e93ad1d1f6a Text-delta-base-sha1: 1de35040b1f126f458f3e8f236121d8e9dd2fda3 Text-content-length: 70 Text-content-md5: 70bf1c61bfac3054186368e35265563a Text-content-sha1: 5cc8c3ca8652a7690414ec8a8309e23575ce9ba0 Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNU .}Y|#ifdef MSCRYPTOAPI crypto_wrapup(); #endif Node-path: putty/scp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4172bda57980f7f72b768c4948851ea6 Text-delta-base-sha1: 41d7dc0ca0f28795374690c8a42c7f0c7438bcc9 Text-content-length: 122 Text-content-md5: 31f3ef3a098332f095625b75ecb38c0b Text-content-sha1: a7e03c06f82315b81fc0d549781971dd64738acd Content-length: 161 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN|ei|i/* * Exports from mscrypto.c */ #ifdef MSCRYPTOAPI int crypto_startup(); void crypto_wrapup(); #endif Node-path: putty/scpssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9b3c763ff75f306238bb6b7e38b4267a Text-delta-base-sha1: 5e43a746b73b38b6e129d2ce0985e7fdc82ec26c Text-content-length: 649 Text-content-md5: dc5f234a38fe937c9846e266ceb94395 Text-content-sha1: 43d640c29df2e4cbc74a10e0b6e98dc254cb1e38 Content-length: 688 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN & ]%&Id"h#ifdef MSCRYPTOAPI /* allocate enough buffer space for extra block * for MS CryptEncrypt() */ pktin.data = (pktin.data == NULL) ? smalloc(biglen+8) : srealloc(pktin.data, biglen+8); #else pktin.data = (pktin.data == NULL) ? smalloc(biglen) : srealloc(pktin.data, biglen); #endif#ifdef MSCRYPTOAPI /* Allocate enough buffer space for extra block * for MS CryptEncrypt() */ pktout.data = (pktout.data == NULL ? malloc(biglen+8) : realloc(pktout.data, biglen+8)); #else#endif#ifdef MSCRYPTOAPI if(crypto_startup() == 0) return "Microsoft high encryption pack not installed!" Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 15737c892680290d9f069bb523da2b06 Text-delta-base-sha1: 8ade4c2c419e2cb83b664fda589173fb9c59eb92 Text-content-length: 666 Text-content-md5: 8e67ba1314e02498b240e239c451363f Text-content-sha1: 46de560c6f2f67e8102e996e0fc588eeb644fc4d Content-length: 706 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN@]!k@1Jd+]j^b#ifdef MSCRYPTOAPI /* Allocate enough buffer space for extra block * for MS CryptEncrypt() */ pktin.data = (pktin.data == NULL ? malloc(biglen+8) : realloc(pktin.data, biglen+8)); #else pktin.data = (pktin.data == NULL ? malloc(biglen) : realloc(pktin.data, biglen)); #endif#ifdef MSCRYPTOAPI /* Allocate enough buffer space for extra block * for MS CryptEncrypt() */ pktout.data = (pktout.data == NULL ? malloc(biglen+8) : realloc(pktout.data, biglen+8)); #else#endif #ifdef MSCRYPTOAPI if(crypto_startup() == 0) return "Microsoft high encryption pack not installed!" Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1cc6fc431222d4a1d6c6bda3a3d9aaf3 Text-delta-base-sha1: c503054d3813a1e59b2478006e1f151a05abe2d7 Text-content-length: 358 Text-content-md5: 68c46e08543ee9a8a43ba1fe738ad07d Text-content-sha1: b2d613bfc16f8a0082c4e82fb628e1a04f845c1e Content-length: 397 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN(HB1~vWy}KbF#ifdef MSCRYPTOAPI unsigned long exponent; unsigned char *modulus; #else void *modulus; void *exponent; #endif#ifdef MSCRYPTOAPI unsigned long hHash; #else uint32 buf[4]; uint32 bits[2]; unsigned char in[64]; #endif#ifndef MSCRYPTOAPI void SHATransform(word32 *digest, word32 *data); #endif Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cce79bf0a72141e2f0c04ecf56c69f36 Text-delta-base-sha1: 6b41ae1befe74d35204caed1ad53fc637d92f417 Text-content-length: 98 Text-content-md5: 8f94bf64afc33a2bf2b0c1057e3f5ba2 Text-content-sha1: 3443564335527a8d019f46973cdd4b12d83fbee9 Content-length: 138 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNY IyIK { random_save_seed(); #ifdef MSCRYPTOAPI crypto_wrapup(); #endif } Revision-number: 426 Prop-content-length: 317 Content-length: 317 K 8 svn:date V 27 2000-03-24T11:46:39.000000Z K 7 svn:log V 216 Rather silly byte-string / word-string transformations in RSA key handling were failing when the key had an odd number of bytes. A server with an 850-bit key was suffering connection failures as a result. Now fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2719ed3b67a112650edc1472d8636a1f Text-delta-base-sha1: f19fd4f6c22dd36060be823d1ee1f56b83e0cb76 Text-content-length: 378 Text-content-md5: 3d9ba38ff01ac8ed934e2bb514a77c47 Text-content-sha1: ebf702e7c17aa5a30834d7e560349ed1c0e2bd76 Content-length: 417 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN7VwxttkVab; i-- ;) { unsigned char byte = *p++; if (i & 1) bn[j][1+i/2] |= byte<<8; else bn[j][1+i/2] |= bytekey->bytes; i-- ;) { unsigned char byte = *p++; if (i & 1) b1[1+i/2] |= byte<<8; else b1[1+i/2] |= bytekey->bytes; i-- ;) { unsigned char b; if (i & 1) b = b2[1+i/2] >> 8; else b = b2[1+i/2] & 0xFF Revision-number: 427 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:02.944202Z PROPS-END Revision-number: 428 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:02.952444Z PROPS-END Revision-number: 429 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2000-03-29T13:15:00.000000Z K 7 svn:log V 33 Yet another accelerator clash... K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 27fa15ded1d5d24ce2617c2c95b6b1c6 Text-delta-base-sha1: a28e10efea364c20b215c1f40ea431d61397a904 Text-content-length: 26 Text-content-md5: 6c8b066aa1da2a24a571b460077fd7ec Text-content-sha1: 1120218bb8bef15d97df1cbffe1b021984d78441 Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN r wColu& Revision-number: 430 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2000-03-31T13:19:19.000000Z K 7 svn:log V 31 oops - keys[] should be static K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d5ba8c09435e5bfcfc26141ac3331a72 Text-delta-base-sha1: b049ab4942b1d985b5791b806cb2c5345bd22bed Text-content-length: 32 Text-content-md5: 19a36719af89d601af74c8600d045dd6 Text-content-sha1: e56ad658d270d4bff828f0ff7771ab6cf3b1259a Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN(/ PXPstatic Revision-number: 431 Prop-content-length: 202 Content-length: 202 K 7 svn:log V 101 Tidy up Blowfish S- and P-boxes: make them static and const, and clean up the declarations a bit :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2000-03-31T13:33:37.000000Z PROPS-END Node-path: putty/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9cd91f5a4dc8b33abf1bc1398331f271 Text-delta-base-sha1: beb50d046011d7db1db1f9f76448abdd376aa0ef Text-content-length: 13512 Text-content-md5: dc8b7147c65bbc568c793514e4289514 Text-content-sha1: a1a0bef3ec971f8ad431d54520a446222c49319b Content-length: 13551 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNT*`w7*S4: hex digits of the fractional part of pi. * (ie pi as a hex fraction is 3.243F6A8885A308D3...) */ static const word32 parray[] = { 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B, }; static const word32 sbox0[] = { 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A, }; static const word32 sbox1[] = { 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7, }; static const word32 sbox2[] = { 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0, }; static const word32 sbox3[] = { 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6, Revision-number: 432 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.085543Z PROPS-END Revision-number: 433 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.092650Z PROPS-END Revision-number: 434 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.099879Z PROPS-END Revision-number: 435 Prop-content-length: 231 Content-length: 231 K 8 svn:date V 27 2000-04-03T19:54:31.000000Z K 7 svn:log V 130 Add the -ls option to execute `ls -la' on a directory instead of trying to copy anything. Likely to be useful for GUI front ends. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 70bf1c61bfac3054186368e35265563a Text-delta-base-sha1: 5cc8c3ca8652a7690414ec8a8309e23575ce9ba0 Text-content-length: 1077 Text-content-md5: 8071179a392acbf01d47e6d3e34976d4 Text-content-sha1: 7ab8d6ddf8d7730c71ed17918dff7a66ffcaf5f4 Content-length: 1117 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN2NYHtIl>+n>k-On>_- P V[zQY+aaaaaWe will issue a list command to get a remote directory. */ static void get_dir_list(int argc, char *argv[]) { char *src, *host, *user; char *cmd, *p, *q; char c; src = argv[0]; /* Sepaa4*strlen(src) + 100); strcpy(cmd, "ls -la '"); p = cmd + strlen(cmd); for (q = src; *q; q++) { if (*q == '\'') { *p++ = '\''; *p++ = '\\'; *p++ = '\''; *p++ = '\''; } else { *p++ = *q; } } *p++ = '\''; *p = '\0'; do_cmd(host, user, cmd); sfree(cmd); while (ssh_recv(&c, 1) > 0) fputc(c, stdout); /* thank heavens for buffered I/O */ int list = 0ls") == 0) list = 1list) { if (argc != 1) usage(); get_dir_list(argc, argv); } else { if (argc < 2) usage(); if (argc > 2) targetshouldbedirectory = 1; if (colon(argv[argc-1]) != NULL) toremote(argc, argv); else tolocal(argc, argv); } if (connection_open) { char ch; ssh_send_eof(); ssh_recv(&ch, 1); } Revision-number: 436 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2000-04-04T14:40:44.000000Z K 7 svn:log V 27 Add -ls to online help bit K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8071179a392acbf01d47e6d3e34976d4 Text-delta-base-sha1: 7ab8d6ddf8d7730c71ed17918dff7a66ffcaf5f4 Text-content-length: 68 Text-content-md5: 0d0a579185932b910eadd0d9671a3e6d Text-content-sha1: f8077c2f7587a0c4ab2c99e38e3c551ea01f329f Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN2o +Ou= scp [options] -ls user@host:filespec Revision-number: 437 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 44 Replace MD5 implementation with my own code K 10 svn:author V 5 simon K 8 svn:date V 27 2000-04-04T14:47:22.000000Z PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 68c46e08543ee9a8a43ba1fe738ad07d Text-delta-base-sha1: b2d613bfc16f8a0082c4e82fb628e1a04f845c1e Text-content-length: 246 Text-content-md5: 5f8178e44322d193d65967cb61a77f30 Text-content-sha1: d0ddfbdcb366389af10932b570fd1f0dd724ee14 Content-length: 285 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNH! ^^2typedef struct { uint32 h[4]; } MD5_Core_State; struct MD5Context { #ifdef MSCRYPTOAPI unsigned long hHash; #else MD5_Core_State core; unsigned char block[BLKSIZE]; int blkused; uint32 lenhi, lenlo Node-path: putty/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d47275d160983e0412e047b6b22981d3 Text-delta-base-sha1: 9aad8314438e9e92829edf06bc9f2969e8ced025 Text-content-length: 6730 Text-content-md5: 0bfe8d8570214631e801bf4db1417d96 Text-content-sha1: f118b36abf2bbd8caad44468b22e2a0c4e99fd62 Content-length: 6769 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNZ;;;#include "ssh.h" /* * MD5 implementation for PuTTY. Written directly from the spec by * Simon Tatham. */ /* ---------------------------------------------------------------------- * Core MD5 algorithm: processes 16-word blocks into a message digest. */ #define F(x,y,z) ( ((x) & (y)) | ((~(x)) & (z)) ) #define G(x,y,z) ( ((x) & (z)) | ((~(z)) & (y)) ) #define H(x,y,z) ( (x) ^ (y) ^ (z) ) #define I(x,y,z) ( (y) ^ ( (x) | ~(z) ) ) #define rol(x,y) ( ((x) << (y)) | (((uint32)x) >> (32-y)) ) #define subround(f,w,x,y,z,k,s,ti) \ w = x + rol(w + f(x,y,z) + block[k] + ti, s) typedef struct { uint32 h[4]; } MD5_Core_State; void MD5_Core_Init(MD5_Core_State *s) { s->h[0] = 0x67452301; s->h[1] = 0xefcdab89; s->h[2] = 0x98badcfe; s->h[3] = 0x10325476; } void MD5_Block(MD5_Core_State *s, uint32 *block) { uint32 a,b,c,d; a = s->h[0]; b = s->h[1]; c = s->h[2]; d = s->h[3]; subround(F, a, b, c, d, 0, 7, 0xd76aa478); subround(F, d, a, b, c, 1, 12, 0xe8c7b756); subround(F, c, d, a, b, 2, 17, 0x242070db); subround(F, b, c, d, a, 3, 22, 0xc1bdceee); subround(F, a, b, c, d, 4, 7, 0xf57c0faf); subround(F, d, a, b, c, 5, 12, 0x4787c62a); subround(F, c, d, a, b, 6, 17, 0xa8304613); subround(F, b, c, d, a, 7, 22, 0xfd469501); subround(F, a, b, c, d, 8, 7, 0x698098d8); subround(F, d, a, b, c, 9, 12, 0x8b44f7af); subround(F, c, d, a, b, 10, 17, 0xffff5bb1); subround(F, b, c, d, a, 11, 22, 0x895cd7be); subround(F, a, b, c, d, 12, 7, 0x6b901122); subround(F, d, a, b, c, 13, 12, 0xfd987193); subround(F, c, d, a, b, 14, 17, 0xa679438e); subround(F, b, c, d, a, 15, 22, 0x49b40821); subround(G, a, b, c, d, 1, 5, 0xf61e2562); subround(G, d, a, b, c, 6, 9, 0xc040b340); subround(G, c, d, a, b, 11, 14, 0x265e5a51); subround(G, b, c, d, a, 0, 20, 0xe9b6c7aa); subround(G, a, b, c, d, 5, 5, 0xd62f105d); subround(G, d, a, b, c, 10, 9, 0x02441453); subround(G, c, d, a, b, 15, 14, 0xd8a1e681); subround(G, b, c, d, a, 4, 20, 0xe7d3fbc8); subround(G, a, b, c, d, 9, 5, 0x21e1cde6); subround(G, d, a, b, c, 14, 9, 0xc33707d6); subround(G, c, d, a, b, 3, 14, 0xf4d50d87); subround(G, b, c, d, a, 8, 20, 0x455a14ed); subround(G, a, b, c, d, 13, 5, 0xa9e3e905); subround(G, d, a, b, c, 2, 9, 0xfcefa3f8); subround(G, c, d, a, b, 7, 14, 0x676f02d9); subround(G, b, c, d, a, 12, 20, 0x8d2a4c8a); subround(H, a, b, c, d, 5, 4, 0xfffa3942); subround(H, d, a, b, c, 8, 11, 0x8771f681); subround(H, c, d, a, b, 11, 16, 0x6d9d6122); subround(H, b, c, d, a, 14, 23, 0xfde5380c); subround(H, a, b, c, d, 1, 4, 0xa4beea44); subround(H, d, a, b, c, 4, 11, 0x4bdecfa9); subround(H, c, d, a, b, 7, 16, 0xf6bb4b60); subround(H, b, c, d, a, 10, 23, 0xbebfbc70); subround(H, a, b, c, d, 13, 4, 0x289b7ec6); subround(H, d, a, b, c, 0, 11, 0xeaa127fa); subround(H, c, d, a, b, 3, 16, 0xd4ef3085); subround(H, b, c, d, a, 6, 23, 0x04881d05); subround(H, a, b, c, d, 9, 4, 0xd9d4d039); subround(H, d, a, b, c, 12, 11, 0xe6db99e5); subround(H, c, d, a, b, 15, 16, 0x1fa27cf8); subround(H, b, c, d, a, 2, 23, 0xc4ac5665); subround(I, a, b, c, d, 0, 6, 0xf4292244); subround(I, d, a, b, c, 7, 10, 0x432aff97); subround(I, c, d, a, b, 14, 15, 0xab9423a7); subround(I, b, c, d, a, 5, 21, 0xfc93a039); subround(I, a, b, c, d, 12, 6, 0x655b59c3); subround(I, d, a, b, c, 3, 10, 0x8f0ccc92); subround(I, c, d, a, b, 10, 15, 0xffeff47d); subround(I, b, c, d, a, 1, 21, 0x85845dd1); subround(I, a, b, c, d, 8, 6, 0x6fa87e4f); subround(I, d, a, b, c, 15, 10, 0xfe2ce6e0); subround(I, c, d, a, b, 6, 15, 0xa3014314); subround(I, b, c, d, a, 13, 21, 0x4e0811a1); subround(I, a, b, c, d, 4, 6, 0xf7537e82); subround(I, d, a, b, c, 11, 10, 0xbd3af235); subround(I, c, d, a, b, 2, 15, 0x2ad7d2bb); subround(I, b, c, d, a, 9, 21, 0xeb86d391); s->h[0] += a; s->h[1] += b; s->h[2] += c; s->h[3] += d; } /* ---------------------------------------------------------------------- * Outer MD5 algorithm: take an arbitrary length byte string, * convert it into 16-word blocks with the prescribed padding at * the end, and pass those blocks to the core MD5 algorithm. */ #define BLKSIZE 64 void MD5Init(struct MD5Context *s) { MD5_Core_Init(&s->core); s->blkused = 0; s->lenhi = s->lenlo = 0; } void MD5Update(struct MD5Context *s, unsigned char const *p, unsigned len) { unsigned char *q = (unsigned char *)p; uint32 wordblock[16]; uint32 lenw = len; int i; /* * Update the length field. */ s->lenlo += lenw; s->lenhi += (s->lenlo < lenw); if (s->blkused+len < BLKSIZE) { /* * Trivial case: just add to the block. */ memcpy(s->block + s->blkused, q, len); s->blkused += len; } else { /* * We must complete and process at least one block. */ while (s->blkused + len >= BLKSIZE) { memcpy(s->block + s->blkused, q, BLKSIZE - s->blkused); q += BLKSIZE - s->blkused; len -= BLKSIZE - s->blkused; /* Now process the block. Gather bytes little-endian into words */ for (i = 0; i < 16; i++) { wordblock[i] = ( ((uint32)s->block[i*4+3]) << 24 ) | ( ((uint32)s->block[i*4+2]) << 16 ) | ( ((uint32)s->block[i*4+1]) << 8 ) | ( ((uint32)s->block[i*4+0]) << 0 ); } MD5_Block(&s->core, wordblock); s->blkused = 0; } memcpy(s->block, q, len); s->blkused = len; } } void MD5Final(unsigned char output[16], struct MD5Context *s) { int i; int pad; unsigned char c[64]; uint32 lenhi, lenlo; if (s->blkused >= 56) pad = 56 + 64 - s->blkused; else pad = 56 - s->blkused; lenhi = (s->lenhi << 3) | (s->lenlo >> (32-3)); lenlo = (s->lenlo << 3); memset(c, 0, pad); c[0] = 0x80; MD5_Bytes(s, &c, pad); c[7] = (lenhi >> 24) & 0xFF; c[6] = (lenhi >> 16) & 0xFF; c[5] = (lenhi >> 8) & 0xFF; c[4] = (lenhi >> 0) & 0xFF; c[3] = (lenlo >> 24) & 0xFF; c[2] = (lenlo >> 16) & 0xFF; c[1] = (lenlo >> 8) & 0xFF; c[0] = (lenlo >> 0) & 0xFF; MD5_Bytes(s, &c, 8); for (i = 0; i < 4; i++) { output[4*i+3] = (s->core.h[i] >> 24) & 0xFF; output[4*i+2] = (s->core.h[i] >> 16) & 0xFF; output[4*i+1] = (s->core.h[i] >> 8) & 0xFF; output[4*i+0] = (s->core.h[i] >> 0) & 0xFF; } } Revision-number: 438 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2000-04-04T14:51:17.000000Z K 7 svn:log V 49 Oops - now let's get that MD5 change _right_ :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5f8178e44322d193d65967cb61a77f30 Text-delta-base-sha1: d0ddfbdcb366389af10932b570fd1f0dd724ee14 Text-content-length: 23 Text-content-md5: 2bf4cc7847cedad3604faa7b4ca42a8d Text-content-sha1: 0e33744f4c324eace4fa0f5ca21870ca2dade4dd Content-length: 62 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN! =]D64 Node-path: putty/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0bfe8d8570214631e801bf4db1417d96 Text-delta-base-sha1: f118b36abf2bbd8caad44468b22e2a0c4e99fd62 Text-content-length: 66 Text-content-md5: 9ffec13db42df7d1e04690daca7e91dc Text-content-sha1: 1a1f8cd1d29c93063ab14925e7f7ad8e397b9967 Content-length: 105 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN; Oa!h9unsignedUpdate(s, Update(s, Revision-number: 439 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.403392Z PROPS-END Revision-number: 440 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.411937Z PROPS-END Revision-number: 441 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.419989Z PROPS-END Revision-number: 442 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.427911Z PROPS-END Revision-number: 443 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.435966Z PROPS-END Revision-number: 444 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.443846Z PROPS-END Revision-number: 445 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.452180Z PROPS-END Revision-number: 446 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.460108Z PROPS-END Revision-number: 447 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.468352Z PROPS-END Revision-number: 448 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.476554Z PROPS-END Revision-number: 449 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.483396Z PROPS-END Revision-number: 450 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.491950Z PROPS-END Revision-number: 451 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.498512Z PROPS-END Revision-number: 452 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.505820Z PROPS-END Revision-number: 453 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.513332Z PROPS-END Revision-number: 454 Prop-content-length: 163 Content-length: 163 K 7 svn:log V 63 Enable high-half characters (>=160) in usernames and passwords K 10 svn:author V 5 simon K 8 svn:date V 27 2000-04-11T10:39:58.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8e67ba1314e02498b240e239c451363f Text-delta-base-sha1: 46de560c6f2f67e8102e996e0fc588eeb644fc4d Text-content-length: 105 Text-content-md5: b9cdb90720e358f2a5cd0f5ffce6f03c Text-content-sha1: 841ad4c658017da578a8113c7387a0d2f345ddbe Content-length: 145 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN]L7Kjs((c >= ' ' && c <= '~') || (c >= 160))((c >= ' ' && c <= '~') || (c >= 160)) Revision-number: 455 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.561554Z PROPS-END Revision-number: 456 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.569484Z PROPS-END Revision-number: 457 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2000-04-13T12:07:37.000000Z K 7 svn:log V 66 Update copyright dates in About box to match those in Licence box K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6c8b066aa1da2a24a571b460077fd7ec Text-delta-base-sha1: 1120218bb8bef15d97df1cbffe1b021984d78441 Text-content-length: 25 Text-content-md5: 5303916179fcaa5096c6f02302b91fe3 Text-content-sha1: fbe80dea6cf77cd5eac1b6182bd7b54bcf026e54 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN }2000 Revision-number: 458 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.719376Z PROPS-END Revision-number: 459 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.726431Z PROPS-END Revision-number: 460 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.732964Z PROPS-END Revision-number: 461 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.740426Z PROPS-END Revision-number: 462 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.747925Z PROPS-END Revision-number: 463 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.768490Z PROPS-END Revision-number: 464 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.775811Z PROPS-END Revision-number: 465 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2000-04-26T08:07:08.000000Z K 7 svn:log V 59 Environment settings were broken. Fix due to Andros Tantas K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6918fc95c07030c2b56b13a66eb84fba Text-delta-base-sha1: 11b7725d4219b2d6bd473cadf61b69f8f0868bfb Text-content-length: 32 Text-content-md5: cbe4e1226e7e2ea2a2ca85eab1fca2c1 Text-content-sha1: 1e7d8255cb0e61fabd1cb7b027ba43c33474d614 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN~yN0 q Revision-number: 466 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.841498Z PROPS-END Revision-number: 467 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:03.848652Z PROPS-END Revision-number: 468 Prop-content-length: 182 Content-length: 182 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-05-09T08:56:30.000000Z K 7 svn:log V 82 Ahem. This time high-half characters really _do_ work in username and password... PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b9cdb90720e358f2a5cd0f5ffce6f03c Text-delta-base-sha1: 841ad4c658017da578a8113c7387a0d2f345ddbe Text-content-length: 109 Text-content-md5: 701e815d7d920830b85ca6f9881a1824 Text-content-sha1: 01e160447f5c9c2f902ea8704553257a21318631 Content-length: 149 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNMPQ8St ((unsigned char) ((unsigned char) Revision-number: 469 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.176962Z PROPS-END Revision-number: 470 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.197547Z PROPS-END Revision-number: 471 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.203971Z PROPS-END Revision-number: 472 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.211154Z PROPS-END Revision-number: 473 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.217472Z PROPS-END Revision-number: 474 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.224053Z PROPS-END Revision-number: 475 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.231030Z PROPS-END Revision-number: 476 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.238604Z PROPS-END Revision-number: 477 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.246204Z PROPS-END Revision-number: 478 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.253641Z PROPS-END Revision-number: 479 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.261369Z PROPS-END Revision-number: 480 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.271156Z PROPS-END Revision-number: 481 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.279009Z PROPS-END Revision-number: 482 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.286412Z PROPS-END Revision-number: 483 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.294316Z PROPS-END Revision-number: 484 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.302645Z PROPS-END Revision-number: 485 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.309242Z PROPS-END Revision-number: 486 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.316744Z PROPS-END Revision-number: 487 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.324376Z PROPS-END Revision-number: 488 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.332774Z PROPS-END Revision-number: 489 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2000-05-31T10:18:24.000000Z K 7 svn:log V 52 Security improvement: check CRC on incoming packets K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 701e815d7d920830b85ca6f9881a1824 Text-delta-base-sha1: 01e160447f5c9c2f902ea8704553257a21318631 Text-content-length: 354 Text-content-md5: fb9a66a9690057f1d099dfaeeac9fa27 Text-content-sha1: ebfd34617cf58a0e72c8b0d185eaad5d5d9bc3be Content-length: 394 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNMAJ HN static unsigned long realcrc, gotcrcrealcrc = crc32(pktin.data, biglen-4); gotcrc = (pktin.data[biglen-4] << 24); gotcrc |= (pktin.data[biglen-3] << 16); gotcrc |= (pktin.data[biglen-2] << 8); gotcrc |= (pktin.data[biglen-1] << 0); if (gotcrc != realcrc) { fatalbox("Incorrect CRC received on packet"); } Revision-number: 490 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.506294Z PROPS-END Revision-number: 491 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.513441Z PROPS-END Revision-number: 492 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.520562Z PROPS-END Revision-number: 493 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.528210Z PROPS-END Revision-number: 494 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:04.535450Z PROPS-END Revision-number: 495 Prop-content-length: 263 Content-length: 263 K 8 svn:date V 27 2000-06-05T16:33:58.000000Z K 7 svn:log V 162 Hack to work around the rootshell.com xterm DoS problem. A better fix might be possible, but it's unclear whether this is a productive strategy in the long term. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 20af9a59c4e8902a09a1530259f3f095 Text-delta-base-sha1: d206fbaa7bd793c11b7c4c63b9126269226f76e2 Text-content-length: 677 Text-content-md5: 510b6fd7a81623e50073db42936d9267 Text-content-sha1: 646595bfd05fa10fb1016ea6ddff3037ef2f9b39 Content-length: 717 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN# wNJHVDS,wunsigned int newrows = def(esc_args[0], 24); /* Hack: prevent big-resize DoS attack. */ if (newrows > max(512, cfg.height)) newrows = max(512, cfg.height); request_resize (cols, newrowsunsigned int newrows = def(esc_args[0], cfg.height); /* Hack: prevent big-resize DoS attack. */ if (newrows > max(512, cfg.height)) newrows = max(512, cfg.height); request_resize (cols, newrowsunsigned int newcols = def(esc_args[0], cfg.width); /* Hack: prevent big-resize DoS attack. */ if (newcols > max(512, cfg.width)) newcols = max(512, cfg.width); request_resize (newcols, rows Revision-number: 496 Prop-content-length: 279 Content-length: 279 K 8 svn:date V 27 2000-06-06T08:57:55.000000Z K 7 svn:log V 178 Security improvement: check that string length field in SSH_SMSG_{STDOUT,STDERR}_DATA packets is consistent with length field in packet header. (Helps prevent insertion attack.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fb9a66a9690057f1d099dfaeeac9fa27 Text-delta-base-sha1: ebfd34617cf58a0e72c8b0d185eaad5d5d9bc3be Text-content-length: 158 Text-content-md5: 9d45e2fe05c26da068563cdc09855a28 Text-content-sha1: 5410e42e1fc29b9e27269198f01267faf4026b74 Content-length: 198 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNGLGif (len+4 != pktin.length) { logevent("Received data packet with bogus string length" ", ignoring"); } else Revision-number: 497 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2000-06-06T09:51:27.000000Z K 7 svn:log V 42 "pscp" was spelled "scp" in usage message K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0d0a579185932b910eadd0d9671a3e6d Text-delta-base-sha1: f8077c2f7587a0c4ab2c99e38e3c551ea01f329f Text-content-length: 171 Text-content-md5: 64eda7348f4a0b19eb2761eda4f22a1e Text-content-sha1: 1f4d42d59fac7d0b2fa63e1ec08fb61a4ec1b0db Content-length: 211 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNorJVpscp [options] [user@]host:source target\n"); printf(" pscp [options] source [source...] [user@]host:target\n"); printf(" p Revision-number: 498 Prop-content-length: 246 Content-length: 246 K 8 svn:date V 27 2000-06-06T10:54:41.000000Z K 7 svn:log V 145 Security fixes, copied from ssh.c: check string length versus packet length on incoming SSH_SMSG_*_DATA, and check CRCs on all incoming packets. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scpssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dc5f234a38fe937c9846e266ceb94395 Text-delta-base-sha1: 43d640c29df2e4cbc74a10e0b6e98dc254cb1e38 Text-content-length: 756 Text-content-md5: d8fad965237ccc65b9f9d50170b64fb7 Text-content-sha1: 67c7bc1a713dd44aafd4dfbb816276e69d35fbbb Content-length: 795 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN&o"F~Q|.{G5ZFB! unsigned long realcrc, gotcrcrealcrc = crc32(pktin.data, biglen-4); gotcrc = (pktin.data[biglen-4] << 24); gotcrc |= (pktin.data[biglen-3] << 16); gotcrc |= (pktin.data[biglen-2] << 8); gotcrc |= (pktin.data[biglen-1] << 0); if (gotcrc != realcrc) { fatalbox("Incorrect CRC received on packet"); } if (plen+4 != pktin.length) { fprintf(stderr, "Received data packet with bogus string length" ", ignoring\n"); } else if (plen+4 != pktin.length) { fprintf(stderr, "Received data packet with bogus string length" ", ignoring\n"); } else Revision-number: 499 Prop-content-length: 245 Content-length: 245 K 8 svn:date V 27 2000-06-21T16:08:08.000000Z K 7 svn:log V 144 Joris van Rantwijk knows how to cause a Borland-built PuTTY to release the console! Hooray! Let's do that then. It's the -aa option on ilink32. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 779285c42a82b24a0d85f42e0686cb64 Text-delta-base-sha1: d21d4cc3f5b63819d042fea0b4d0f56b549946c1 Text-content-length: 25 Text-content-md5: 9c02df22be0b611d694eec089062e2c6 Text-content-sha1: 6f04bfe55713f795aa07ca11c5a8ce2072b1b9f9 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN.2 jDj -aa Revision-number: 500 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2000-06-21T16:28:18.000000Z K 7 svn:log V 53 Rename nossh_res.rc to nosshres.rc for 8.3 cleanness K 10 svn:author V 5 simon PROPS-END Node-path: putty/nosshres.rc Node-kind: file Node-action: add Node-copyfrom-rev: 499 Node-copyfrom-path: putty/nossh_res.rc Text-copy-source-md5: 02d089ca2a8c5635aeb3096266f3354c Text-copy-source-sha1: 10f828e78f4f794fe3dc3b1a74a6f392cbd004a4 Text-delta: true Text-delta-base-md5: 02d089ca2a8c5635aeb3096266f3354c Text-delta-base-sha1: 10f828e78f4f794fe3dc3b1a74a6f392cbd004a4 Text-content-length: 12 Text-content-md5: 02d089ca2a8c5635aeb3096266f3354c Text-content-sha1: 10f828e78f4f794fe3dc3b1a74a6f392cbd004a4 Content-length: 12 SVNYYY Node-path: putty/nossh_res.rc Node-action: delete Revision-number: 501 Prop-content-length: 199 Content-length: 199 K 7 svn:log V 99 Remove the underscore from nossh_res.rc for 8.3 cleanness; also add MOBJS in the pscp dependencies K 10 svn:author V 5 simon K 8 svn:date V 27 2000-06-21T16:29:44.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 88ca3a0b5c442475777a91abcc236eb4 Text-delta-base-sha1: f2991c9183c1fc8078ccf1204c7b249ba1eb19ac Text-content-length: 103 Text-content-md5: 067f412cdaef6410deaf6b09ecb4aa0d Text-content-sha1: f89c39f4a81d6330cf792b61029a07054c94b5c2 Content-length: 143 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNkoB6 7::AK8gMres.$(RES): nosshres.rc win_res.rc win_res.h putty.ico ##-- nossh Revision-number: 502 Prop-content-length: 152 Content-length: 152 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-06-22T08:41:25.000000Z K 7 svn:log V 52 Change a `GLOBAL' to an `extern' for Borland sanity PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 319a5804d24b2b566383c1eb12ac9f0f Text-delta-base-sha1: 44a9abcbece106f4524b65b2a47673025af28820 Text-content-length: 27 Text-content-md5: 0cd02c4ff6e42835367733899184bb24 Text-content-sha1: 4322e46f1f31b938373b815a919cf27b2c592de8 Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNQQ 8>extern Revision-number: 503 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 44 This ought to fix the scp protocol problems K 10 svn:author V 5 simon K 8 svn:date V 27 2000-06-22T08:51:51.000000Z PROPS-END Node-path: putty/be_none.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: baa0956335f552ce87e08fbd42cba366 Text-delta-base-sha1: a841db2c05ecaa7cd126be122e1b9163ee1c9271 Text-content-length: 246 Text-content-md5: a68d50fd4f75d3bcdffa2a03d10aa471 Text-content-sha1: 47f7793f4969a9c16f5c2ead059c50a0d07f69a2 Content-length: 285 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN L ak)[/* * Linking module for PSCP: list the available backends, but * without accompanying function suites. Used only for name * lookupsPROT_SSH, "ssh", NULL}, {PROT_TELNET, "telnet", NULL}, {PROT_RAW, "raw", NULL}, }; Revision-number: 504 Prop-content-length: 166 Content-length: 166 K 7 svn:log V 66 Joris van Rantwijk's unified SSH code suitable for PuTTY and PSCP K 10 svn:author V 5 simon K 8 svn:date V 27 2000-06-22T12:18:34.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 067f412cdaef6410deaf6b09ecb4aa0d Text-delta-base-sha1: f89c39f4a81d6330cf792b61029a07054c94b5c2 Text-content-length: 25 Text-content-md5: 4a37b5b02a84b59a953eb004c87a6ef9 Text-content-sha1: 797732723589b9ce0706cdf1a69c54df95cdc9ec Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNo@ilC, Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 64eda7348f4a0b19eb2761eda4f22a1e Text-delta-base-sha1: 1f4d42d59fac7d0b2fa63e1ec08fb61a4ec1b0db Text-content-length: 754 Text-content-md5: 8517827df5aeec27e71f4a8f20d180b7 Text-content-sha1: 03d86179310fe2bddd76ca166496942d63f84a05 Content-length: 794 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNrNGM1`[n%c[XR)y?>70sZ!yP;b3D >SY:s2,\wp` bnSimon Tathamstatic This function is needed to link with ssh.c, but it never gets called. */ void term_out(void) { abort(); }cp_send_eof(); ssh_scp_recv(&ch, 1); } exit(1); } static void get_password(const scpscpscpcpcpcpcpcpcpcpcp_send("", 1); while (1) { settime = 0; gottime: if (ssh_scpscpcpcpcpscpcpscpdefault_protocol = PROT_TELNET; scp_flags = SCP_FLAG; ssh_get_password = &get_password;, scp_flags |= SCP_VERBOSEcp_send_eof(); ssh_scp_recv(&ch, 1); } WSACleanup(); random_save_seed(); return (errs == 0 ? 0 : 1); } /* end */ Node-path: putty/scp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 31f3ef3a098332f095625b75ecb38c0b Text-delta-base-sha1: a7e03c06f82315b81fc0d549781971dd64738acd Text-content-length: 484 Text-content-md5: 4ef97d2d7c8656ab3f02b154bac42c75 Text-content-sha1: 9c33c6ccd486154fc9b80fccf69274fc40796455 Content-length: 523 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNeUUU/* * scp.h * Joris van Rantwijk, Aug 1999, Jun 2000. */ #define SCP_FLAG 1 #define SCP_VERBOSE 2 #define IS_SCP ((scp_flags & SCP_FLAG) != 0) /* Exported from ssh.c */ extern int scp_flags; extern void (*ssh_get_password)(const char *prompt, char *str, int maxlen); char * ssh_scp_init(char *host, int port, char *cmd, char **realhost); int ssh_scp_recv(unsigned char *buf, int len); void ssh_scp_send(unsigned char *buf, int len); void ssh_scp_send_eof(void); Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d45e2fe05c26da068563cdc09855a28 Text-delta-base-sha1: 5410e42e1fc29b9e27269198f01267faf4026b74 Text-content-length: 13532 Text-content-md5: 2603dd52287d7f8377a0e87efc23c564 Text-content-sha1: 0225ae22ccf86e23ebeb56a1f7ee07fc300d16cb Content-length: 13572 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNx4;(=vd$-I6HS_2U8o:S2 7{Rw@%5+l6+dZ<mWJ9Lu4B ~gwLuZ*gR)1mzF:UR(%}1 wPyPId]]HYyLH=/s]h\H=Yd1#include #include #include #include #include #include "putty.h" #include "ssh.h" #include "scp.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define logevent(s) { logevent(s); \ if (IS_SCP && (scp_flags & SCP_VERBOSE) != 0) \ fprintf(stderr, "%s\n", s); } #define SSH_MSG_DISCONNECT 1 #define SSH_SMSG_PUBLIC_KEY 2 #define SSH_CMSG_SESSION_KEY 3 #define SSH_CMSG_USER 4 #define SSH_CMSG_AUTH_PASSWORD 9 #define SSH_CMSG_REQUEST_PTY 10 #define SSH_CMSG_WINDOW_SIZE 11 #define SSH_CMSG_EXEC_SHELL 12 #define SSH_CMSG_EXEC_CMD 13 #define SSH_SMSG_SUCCESS 14 #define SSH_SMSG_FAILURE 15 #define SSH_CMSG_STDIN_DATA 16 #define SSH_SMSG_STDOUT_DATA 17 #define SSH_SMSG_STDERR_DATA 18 #define SSH_CMSG_EOF 19 #define SSH_SMSG_EXIT_STATUS 20 #define SSH_CMSG_EXIT_CONFIRMATION 33 #define SSH_MSG_IGNORE 32 #define SSH_MSG_DEBUG 36 #define SSH_CMSG_AUTH_TIS 39 #define SSH_SMSG_AUTH_TIS_CHALLENGE 40 #define SSH_CMSG_AUTH_TIS_RESPONSE 41 #define SSH_AUTH_TIS 5 #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) #define PUT_32BIT(cp, value) { \ (cp)[0] = (unsigned char)((value) >> 24); \ (cp)[1] = (unsigned char)((value) >> 16); \ (cp)[2] = (unsigned char)((value) >> 8); \ (cp)[3] = (unsigned char)(value); } enum { PKT_END, PKT_INT, PKT_CHAR, PKT_DATA, PKT_STR };#define crWaitUntil(c) do { crReturn(0); } while (!(c)) static SOCKET s = INVALID_SOCKET; static unsigned char session_key[32]; static struct ssh_cipher *cipher = NULL; int scp_flags = 0; void (*ssh_get_password)(const char *prompt, char *str, int maxlen)IS_SCP) { noise_ultralight(i); if (i <= 0) fatalbox("Lost connection while sending"); }IS_SCP) noise_ultralight(iif (IS_SCP) { if (len > 0 && buf[len-1] == '\n') len--; if (len > 0 && buf[len-1] == '\r') len--; if (len > 0) { fwrite(buf, len, 1, stderr); fputc('\n', stderr); } return; }NULL, NULL, 0 }; static struct Packet pktout = { 0, 0, NULL, NULL, 0 }; static void ssh_protocol(unsigned char *in, int inlen, int ispkt); static void ssh_size(void); /* * Collect incoming data in the incoming packet buffer. * Decihper and verify the packet when it is completely read. * Drop SSH_MSG_DEBUG and SSH_MSG_IGNORE packets. * Update the *data and *datalen variables. * Return the additional nr of bytes needed, or 0 when * a complete packet is available. */ static int s_rdpkt(unsigned char **data, int *datalen) { static long len, pad, biglen, to_read; static unsigned long realcrc, gotcrc; static unsigned char *p; static int i; crBegin; next_packet: pktin.type = 0; pktin.length = 0; for (i = len = 0; i < 4; i++) { while ((*datalen) == 0) crReturn(4-i); len = (len << 8) + **data; (*data)++, (*datalen)--; } #ifdef FWHACK if (len == 0x52656d6f) { /* "Remo"te server has closed ... */ len = 0x300; /* big enough to carry to end */ } #endif pad = 8 - (len % 8); biglen = len + pad; pktin.length = len - 5; if (pktin.maxlen < biglen) { pktin * for MS CryptEncrypt() */ pktin.data = (pktin.data == NULL ? malloc(biglen+8) : realloc(pktin.data, biglen+8)); #else pktin.data = (pktin.data == NULL ? malloc(biglen) : realloc(pktin.data, biglen)); #endif if (!pktin.data) fatalbox("Out of memory"); } to_read = biglen; p = pktin.data; while (to_read > 0) { static int chunk; chunk = to_read; while ((*datalen) == 0) crReturn(to_read); if (chunk > (*datalen)) chunk = (*datalen); memcpy(p, *data, chunk); *data += chunk; *datalen -= chunk; p += chunk; to_read -= chunk; } if (cipher) cipher->decrypt(pktin.data, biglen); pktin.type = pktin.data[pad]; pktin.body = pktin.data + pad + 1; realcrc = crc32(pktin.data, biglen-4); gotcrc = GET_32BIT(pktin.data+biglen-4); if (gotcrc != realcrc) { fatalbox("Incorrect CRC received on packet"); } if (pktin.type == SSH_SMSG_STDOUT_DATA || pktin.type == SSH_SMSG_STDERR_DATA || pktin.type == SSH_MSG_DEBUG || pktin.type == SSH_SMSG_AUTH_TIS_CHALLENGE) { long strlen = GET_32BIT(pktin.body); if (strlen + 4 != pktin.length) fatalbox("Received data packet with bogus string length"); } if (pktin.type == SSH_MSG_DEBUG) { /* log debug message */ char buf[80]; int strlen = GET_32BIT(pktin.body); strcpy(buf, "Remote: "); if (strlen > 70) strlen = 70; memcpy(buf+8, pktin.body+4, strlen); buf[8+strlen] = '\0'; logevent(buf); goto next_packet; } else if (pktin.type == SSH_MSG_IGNORE) { /* do nothing */ goto next_packet; } crFinish(0); } static void ssh_gotdata(unsigned char *data, int datalen) { while (datalen > 0) { if ( s_rdpkt(&data, &datalen) == 0 ) ssh_protocol(NULL, 0, 1); } } * for MS CryptEncrypt() */ pktout.data = (pktout.data == NULL ? malloc(biglen+12) : realloc(pktout.data, biglen+12 PUT_32BIT(pktout.data+biglen, crc); PUT_32BIT(pktout.data, len); if (cipher) cipher->encrypt(pktout.data+4, biglen); s_write(pktout.data, biglen+4); } /* * Construct a packet with the specified contents and * send it to the server. */ static void send_packet(int pkttype, ...) { va_list args; unsigned char *p, *argp, argchar; unsigned long argint; int pktlen, argtype, arglen; pktlen = 0; va_start(args, pkttype); while ((argtype = va_arg(args, int)) != PKT_END) { switch (argtype) { case PKT_INT: (void) va_arg(args, int); pktlen += 4; break; case PKT_CHAR: (void) va_arg(args, char); pktlen++; break; case PKT_DATA: (void) va_arg(args, unsigned char *); arglen = va_arg(args, int); pktlen += arglen; break; case PKT_STR: argp = va_arg(args, unsigned char *); arglen = strlen(argp); pktlen += 4 + arglen; break; default: assert(0); } } va_end(args); s_wrpkt_start(pkttype, pktlen); p = pktout.body; va_start(args, pkttype); while ((argtype = va_arg(args, int)) != PKT_END) { switch (argtype) { case PKT_INT: argint = va_arg(args, int); PUT_32BIT(p, argint); p += 4; break; case PKT_CHAR: argchar = va_arg(args, unsigned char); *p = argchar; p++; break; case PKT_DATA: argp = va_arg(args, unsigned char *); arglen = va_arg(args, int); memcpy(p, argp, arglen); p += arglen; break; case PKT_STR: argp = va_arg(args, unsigned char *); arglen = strlen(argp); PUT_32BIT(p, arglen); memcpy(p + 4, argp, arglen); p += 4 + arglen; break; } } va_end(args); s_wrpkt(); } /* * Connect to specified host and port. * Returns an error message, or NULL on success. * Also places the canonical host name into `realhost'. */ static char *connect_to_host(char *host, int port, char **realhost) if (port < 0) port = 22; /* default ssh port */return NULL/* * Handle the key exchange and user authentication phases. */ static int do_ssh_login(unsigned char *in, int inlen, int ispkt) if (!ispkt) crWaitUntil(ispkt)GET_32BIT(pktin.body+12+i+j); supported_auths_mask = GET_32BIT(pktin.body+16+i+j); end_packet(SSH_CMSG_SESSION_KEY, PKT_CHAR, cipher_type, PKT_DATA, cookie, 8, PKT_CHAR, (len*8) >> 8, PKT_CHAR, (len*8) & 0xFF, PKT_DATA, rsabuf, len, PKT_INT, 0, PKT_END); crWaitUntil(IS_SCP && crWaitUntil(!if (!IS_SCP) { sprintf(stuff, "Sent username \"%s\".\r\n", username); c_write(stuff, strlen(stuff)); } } send_packet(SSH_CMSG_USER, PKT_STR, username, PKT_END } crWaitUntil( if (IS_SCP) { char prompt[200]; sprintf(prompt, "%s@%s's password: ", cfg.username, savedhost); ssh_get_password(prompt, password, sizeof(password)); } else { send_packet(SSH_CMSG_AUTH_TIS, PKT_END); crWaitUntil(crWaitUntil(! } send_packet(pwpkt_type, PKT_STR, password, PKT_END); logevent("Sent password"); memset(password, 0, strlen(password)); crWaitUntil(ispkt); if (pktin.type == SSH_SMSG_FAILURE) { c_write("Access denied\r\n", 15); logevent("Authentication refused"); } else if (pktin.type == SSH_MSG_DISCONNECT) { logevent("Received disconnect request"); crReturn(0); } else if (pktin.type != SSH_SMSG_SUCCESScrFinish(1); } static void ssh_protocol(unsigned char *in, int inlen, int ispkt) { crBegin; random_init(); while (!do_ssh_login(in, inlen, ispkt)) crReturnV; if (!cfg.nopty) { send_packet(SSH_CMSG_REQUEST_PTY, PKT_STR, cfg.termtype, PKT_INT, rows, PKT_INT, cols, PKT_INT, 0, PKT_INT, 0, PKT_CHAR, 0, PKT_ENDend_packet(SSH_CMSG_EXEC_SHELL, PKT_ENDGET_32BIT(pktin.body); _STATUS) { send_packet(SSH_CMSG_EXIT_CONFIRMATION, PKT_ENDend_packet(SSH_CMSG_STDIN_DATA, PKT_INT, inlen, PKT_DATA, in, inlen, PKT_END/ static char *ssh_init (HWND hwnd, char *host, int port, char **realhost) { char *p;p = connect_to_host(host, port, realhost); if (p != NULL) return p; send_packet(SSH_CMSG_WINDOW_SIZE, PKT_INT, rows, PKT_INT, cols, PKT_INT, 0, PKT_INT, 0, PKT_END /* * Read and decrypt one incoming SSH packet. * (only used by pSCP) */ static void get_packet(void) { unsigned char buf[4096], *p; long to_read; int len; assert(IS_SCP); p = NULL; len = 0; while ((to_read = s_rdpkt(&p, &len)) > 0) { if (to_read > sizeof(buf)) to_read = sizeof(buf); len = s_read(buf, to_read); if (len != to_read) { closesocket(s); s = INVALID_SOCKET; return; } p = buf; } assert(len == 0); } /* * Receive a block of data over the SSH link. Block until * all data is available. Return nr of bytes read (0 if lost connection). * (only used by pSCP) */ int ssh_scp_recv(unsigned char *buf, int len) { static int pending_input_len = 0; static unsigned char *pending_input_ptr; int to_read = len; assert(IS_SCP); if (pending_input_len >= to_read) { memcpy(buf, pending_input_ptr, to_read); pending_input_ptr += to_read; pending_input_len -= to_read; return len; } if (pending_input_len > 0) { memcpy(buf, pending_input_ptr, pending_input_len); buf += pending_input_len; to_read -= pending_input_len; pending_input_len = 0; } if (s == INVALID_SOCKET) return 0; while (to_read > 0) { get_packet(); if (s == INVALID_SOCKET) return 0; if (pktin.type == SSH_SMSG_STDOUT_DATA) { int plen = GET_32BIT(pktin.body); if (plen <= to_read) { memcpy(buf, pktin.body + 4, plen); buf += plen; to_read -= plen; } else { memcpy(buf, pktin.body + 4, to_read); pending_input_len = plen - to_read; pending_input_ptr = pktin.body + 4 + to_read; to_read = 0; } } else if (pktin.type == SSH_SMSG_STDERR_DATA) { int plen = GET_32BIT(pktin.body); fwrite(pktin.body + 4, plen, 1, stderr); } else if (pktin.type == SSH_MSG_DISCONNECT) { logevent("Received disconnect request"); } else if (pktin.type == SSH_SMSG_SUCCESS || pktin.type == SSH_SMSG_FAILURE) { /* ignore */ } else if (pktin.type == SSH_SMSG_EXIT_STATUS) { char logbuf[100]; sprintf(logbuf, "Remote exit status: %d", GET_32BIT(pktin.body)); logevent(logbuf); send_packet(SSH_CMSG_EXIT_CONFIRMATION, PKT_END); logevent("Closing connection"); closesocket(s); s = INVALID_SOCKET; } else { fatalbox("Strange packet received: type %d", pktin.type); } } return len; } /* * Send a block of data over the SSH link. * Block until all data is sent. * (only used by pSCP) */ void ssh_scp_send(unsigned char *buf, int len) { assert(IS_SCP); if (s == INVALID_SOCKET) return; send_packet(SSH_CMSG_STDIN_DATA, PKT_INT, len, PKT_DATA, buf, len, PKT_END); } /* * Send an EOF notification to the server. * (only used by pSCP) */ void ssh_scp_send_eof(void) { assert(IS_SCP); if (s == INVALID_SOCKET) return; send_packet(SSH_CMSG_EOF, PKT_END); } /* * Set up the connection, login on the remote host and * start execution of a command. * Returns an error message, or NULL on success. * (only used by pSCP) */ char *ssh_scp_init(char *host, int port, char *cmd, char **realhost) { char buf[160], *p; assert(IS_SCP); #ifdef MSCRYPTOAPI if p = connect_to_host(host, port, realhost); if (p != NULL) return p; random_init();/* Exchange keys and login */ do { get_packet(); if (s == INVALID_SOCKET) return "Connection closed by remote host"; } while (!do_ssh_login(NULL, 0, 1)); /* Execute command */ sprintf(buf, "Sending command: %.100s", cmd); logevent(buf); send_packet(SSH_CMSG_EXEC_CMD, PKT_STR, cmd, PKT_END); return NULL; } Node-path: putty/scpssh.c Node-action: delete Revision-number: 505 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2000-06-23T09:44:15.000000Z K 7 svn:log V 52 Fix subtle problem with scp protocol/port selection K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cbe4e1226e7e2ea2a2ca85eab1fca2c1 Text-delta-base-sha1: 1e7d8255cb0e61fabd1cb7b027ba43c33474d614 Text-content-length: 38 Text-content-md5: 256bace9216bcfd4a2fc4bd9d990a4ca Text-content-sha1: 76ab172f9a35fdcf4e7209cf3ee1117001fa0386 Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNysX_ lnamename Revision-number: 506 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2000-06-23T10:58:17.000000Z K 7 svn:log V 37 Oops - add a terminator to the array K 10 svn:author V 5 simon PROPS-END Node-path: putty/be_none.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a68d50fd4f75d3bcdffa2a03d10aa471 Text-delta-base-sha1: 47f7793f4969a9c16f5c2ead059c50a0d07f69a2 Text-content-length: 33 Text-content-md5: 3436475773e0696a6d0ea7684f754a7a Text-content-sha1: b2c1b730c0d26cf7679fbb344bfa54d11ab9839e Content-length: 72 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNLZI {0, NULL} }; Revision-number: 507 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2000-06-24T17:00:49.000000Z K 7 svn:log V 43 Make beep optional - thanks to Antal Novak K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0cd02c4ff6e42835367733899184bb24 Text-delta-base-sha1: 4322e46f1f31b938373b815a919cf27b2c592de8 Text-content-length: 29 Text-content-md5: d1206588dfa6aabadf9877e7179d3f77 Text-content-sha1: 00a0349f40f262ccc777360ae60de513c14a2d60 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNQ_ Oint beep Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 510b6fd7a81623e50073db42936d9267 Text-delta-base-sha1: 646595bfd05fa10fb1016ea6ddff3037ef2f9b39 Text-content-length: 55 Text-content-md5: ef926aa7bf1899b1162d44c250ba6a35 Text-content-sha1: a1dea9dba265124e7c1dd7f309f4ce95c4470062 Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN ( ?LA if(cfg.beep) Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fbb30648927a5e43f4a177c70f683d3b Text-delta-base-sha1: 849df60fa689258bb2a15573fd0a3e936bc64017 Text-content-length: 49 Text-content-md5: b2a6d33b6253295b602a3648eddcd994 Text-content-sha1: e6431922be82eb5167cd0cea5474071caa9b7adc Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN;X IsH#define IDC1_BEEP 1021 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5303916179fcaa5096c6f02302b91fe3 Text-delta-base-sha1: fbe80dea6cf77cd5eac1b6182bd7b54bcf026e54 Text-content-length: 110 Text-content-md5: 37da8d5b0a783a54ad2d5c3fb353b642 Text-content-sha1: 708b4dac5729dcaa063f468d341cc2022f7664d6 Content-length: 150 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN_TTrn AUTOCHECKBOX "Bee&p enabled", IDC1_BEEP, 3, 153, 162, 10 END IDD_PANEL2 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 256bace9216bcfd4a2fc4bd9d990a4ca Text-delta-base-sha1: 76ab172f9a35fdcf4e7209cf3ee1117001fa0386 Text-content-length: 356 Text-content-md5: ce9153e0d89658284a100fab74687c50 Text-content-sha1: 2030fc77fa07af389e15a2e32da6369ba521ccca Content-length: 396 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNsF&05~c;e]KvzyBeep", cfg.beepBeep", 1, &cfg.beep CheckDlgButton (hwnd, IDC1_BEEP, cfg.beep case IDC1_BEEP: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.beep = IsDlgButtonChecked (hwnd, IDC1_BEEP); break; Revision-number: 508 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2000-06-26T12:55:47.000000Z K 7 svn:log V 140 Avoid the ldisc passing zero-length strings to back->send(). VMS sshd has interesting behaviour on receiving a zero-length SSH data packet. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 55265948a373533716ec11e7053678fe Text-delta-base-sha1: 2e061d260b0c4f8c5909d9997bc77a7d13cb0437 Text-content-length: 76 Text-content-md5: 68af2fcdebdb91e7c6105ed4a0f4027f Text-content-sha1: 367a4fb932b1ca6f3b4a04e93708d8e6a1d461ba Content-length: 115 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNh"2.]*eif (term_buflen > 0) if (len > 0) Revision-number: 509 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2000-06-26T12:55:47.000000Z K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-49'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-0.49 Node-kind: dir Node-action: add Node-copyfrom-rev: 502 Node-copyfrom-path: putty Node-path: putty-0.49/be_none.c Node-kind: file Node-action: delete Node-path: putty-0.49/be_none.c Node-kind: file Node-action: add Node-copyfrom-rev: 506 Node-copyfrom-path: putty/be_none.c Text-copy-source-md5: 3436475773e0696a6d0ea7684f754a7a Text-copy-source-sha1: b2c1b730c0d26cf7679fbb344bfa54d11ab9839e Node-path: putty-0.49/ldisc.c Node-kind: file Node-action: delete Node-path: putty-0.49/ldisc.c Node-kind: file Node-action: add Node-copyfrom-rev: 508 Node-copyfrom-path: putty/ldisc.c Text-copy-source-md5: 68af2fcdebdb91e7c6105ed4a0f4027f Text-copy-source-sha1: 367a4fb932b1ca6f3b4a04e93708d8e6a1d461ba Node-path: putty-0.49/windlg.c Node-kind: file Node-action: delete Node-path: putty-0.49/windlg.c Node-kind: file Node-action: add Node-copyfrom-rev: 505 Node-copyfrom-path: putty/windlg.c Text-copy-source-md5: 256bace9216bcfd4a2fc4bd9d990a4ca Text-copy-source-sha1: 76ab172f9a35fdcf4e7209cf3ee1117001fa0386 Revision-number: 510 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2000-06-26T12:55:47.000000Z K 7 svn:log V 68 This commit was manufactured by cvs2svn to create branch 'zlib-dll'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-zlib-dll Node-kind: dir Node-action: add Node-copyfrom-rev: 508 Node-copyfrom-path: putty Revision-number: 511 Prop-content-length: 256 Content-length: 256 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-07-04T09:15:12.000000Z K 7 svn:log V 155 SSH compression by linking with zlib.dll if present (compression quietly becomes unavailable if zlib.dll not found). Thanks to Joris van Rantwijk (again). PROPS-END Node-path: putty-zlib-dll/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: d1206588dfa6aabadf9877e7179d3f77 Text-delta-base-sha1: 00a0349f40f262ccc777360ae60de513c14a2d60 Text-content-length: 189 Text-content-md5: e4362123b3f2f8eafd3268989362945f Text-content-sha1: 1e028fe692a50e841552b5355f747e6beaf122c8 Content-length: 233 K 15 cvs2svn:cvs-rev V 8 1.33.2.1 PROPS-END SVN_ !  Cint ssh_compressionNeeded for PuTTY Secure Copy */ #define SCP_FLAG 1 #define SCP_VERBOSE 2 #define IS_SCP ((scp_flags & SCP_FLAG) != 0) GLOBAL int scp_flags; Node-path: putty-zlib-dll/scp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 4ef97d2d7c8656ab3f02b154bac42c75 Text-delta-base-sha1: 9c33c6ccd486154fc9b80fccf69274fc40796455 Text-content-length: 105 Text-content-md5: 4679f0ca1e48a511bcad36e77c4f950d Text-content-sha1: b72236a25dfa331ce8892420645493692dfeff51 Content-length: 148 K 15 cvs2svn:cvs-rev V 7 1.3.2.1 PROPS-END SVNUhWWD/* * scp.h * Joris van Rantwijk, Aug 1999, Jun 2000. */ /* Exported from ssh.c */ Node-path: putty-zlib-dll/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 2603dd52287d7f8377a0e87efc23c564 Text-delta-base-sha1: 0225ae22ccf86e23ebeb56a1f7ee07fc300d16cb Text-content-length: 1651 Text-content-md5: 475a33438ca10e8ebce7a8eace6c12cb Text-content-sha1: c1c039926800cd69ee92f33aae6e2517819c6a33 Content-length: 1695 K 15 cvs2svn:cvs-rev V 8 1.22.2.1 PROPS-END SVNxX lD >O?Cjjy#\oB/{rH{lak %PyuREQUEST_COMPRESSION 37#define COMPRESSION_LEVELstatic int use_compressionstatic void pktalloc(struct Packet *pkt, long newlen) { if (pkt->maxlen < newlen) { pkt->maxlen = new->data = (pkt->data == NULL ? malloc(newlen+8) : realloc(pkt->data, newlen+8)); #else pkt->data = (pkt->data == NULL ? malloc(newlen) : realloc(pkt->data, newlen)); #endif if (!pkt->data) fatalbox("Out of memory"); } } if (pktin.maxlen < biglen) pktalloc(&pktin, biglen);use_compression) { ssh_decompress(pktin.data + pad, len - 4, &p, &len); pktin.length = len - 1; pktin.type = p[0]; pktin.body = p + 1; } else { pktin.length = len - 5; pktin.type = pktin.data[pad]; pktin.body = pktin.data + pad + 1 + 4) pktalloc(&pktout, biglen + 4); pktout.body[-1] = pktout.type; if (use_compression) { unsigned char *p; unsigned int n; pktout.body = NULL; ssh_compress(pktout.data + 4 + pad, pktout.length + 1, &p, &n); len = n + 4; pad = 8 - (len%8); biglen = len + pad; if (pktout.maxlen < biglen + 4) pktalloc(&pktout, biglen + 4); memcpy(pktout.data + 4 + pad, p, n); } if (cfg.ssh_compression && ssh_compression_init(COMPRESSION_LEVEL)) { send_packet(SSH_CMSG_REQUEST_COMPRESSION, PKT_INT, COMPRESSION_LEVEL, PKT_END); crWaitUntil(ispkt); if (pktin.type == SSH_SMSG_SUCCESS) { use_compression = 1; logevent("Enabled SSH packet compression"); } else if (pktin.type == SSH_SMSG_FAILURE) { logevent("Server does not support packet compression"); } else Node-path: putty-zlib-dll/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 2bf4cc7847cedad3604faa7b4ca42a8d Text-delta-base-sha1: 0e33744f4c324eace4fa0f5ca21870ca2dade4dd Text-content-length: 302 Text-content-md5: 576754c5857c4089adec58f38121253b Text-content-sha1: 19721edd74f48c5b24e8ac1277fe50bcee25b236 Content-length: 345 K 15 cvs2svn:cvs-rev V 7 1.9.2.1 PROPS-END SVN7 int ssh_compression_init(int); void ssh_compress(unsigned char *src, unsigned int srclen, unsigned char **dest, unsigned int *destlen); void ssh_decompress(unsigned char *src, unsigned int srclen, unsigned char **dest, unsigned int *destlen); Node-path: putty-zlib-dll/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: b2a6d33b6253295b602a3648eddcd994 Text-delta-base-sha1: e6431922be82eb5167cd0cea5474071caa9b7adc Text-content-length: 47 Text-content-md5: 195c707bf58e931eb8bd480a39b1cc94 Text-content-sha1: 7bb0063a3341c8b0de3a7230de20a26f86cb153a Content-length: 91 K 15 cvs2svn:cvs-rev V 8 1.14.2.1 PROPS-END SVNXs H#define IDC3_COMPRESS 1024 Node-path: putty-zlib-dll/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 37da8d5b0a783a54ad2d5c3fb353b642 Text-delta-base-sha1: 708b4dac5729dcaa063f468d341cc2022f7664d6 Text-content-length: 117 Text-content-md5: e2439123be31a60006935d419419b66d Text-content-sha1: 2cd5a9fd40d5c8519116541f4883e0c3041fa3d3 Content-length: 161 K 15 cvs2svn:cvs-rev V 8 1.27.2.1 PROPS-END SVN_+[Y[r3Z AUTOCHECKBOX "Enable packet compression", IDC3_COMPRESS, 3, 70, 162, 10 END IDD_PANEL4 Node-path: putty-zlib-dll/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: ce9153e0d89658284a100fab74687c50 Text-delta-base-sha1: 2030fc77fa07af389e15a2e32da6369ba521ccca Text-content-length: 455 Text-content-md5: 3376d07dd641fa67e747509e853ae392 Text-content-sha1: 5d029467cb199b43dae516f047357cc78ece0a13 Content-length: 499 K 15 cvs2svn:cvs-rev V 8 1.29.2.1 PROPS-END SVNF ;~mxVd7gP$l*vKZlSSHCompression", cfg.ssh_compressionSSHCompression", 0, &cfg.ssh_compressionCheckDlgButton (hwnd, IDC3_COMPRESS, cfg.ssh_compressionNOPTY case IDC3_COMPRESS: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.ssh_compression = IsDlgButtonChecked (hwnd, IDC3_COMPRESIS_SCP && (scp_flags & SCP_VERBOSE) != 0) fprintf(stderr, "%s\n", string); Revision-number: 512 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 2000-07-08T16:09:39.000000Z K 7 svn:log V 198 Silly mistake - restore-cursor-pos doesn't make sure the cursor position is inside the screen (it might not be if the screen has shrunk since the save of cursor position). Thanks to Robert de Bath. K 10 svn:author V 5 simon PROPS-END Node-path: putty-zlib-dll/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: ef926aa7bf1899b1162d44c250ba6a35 Text-delta-base-sha1: a1dea9dba265124e7c1dd7f309f4ce95c4470062 Text-content-length: 157 Text-content-md5: e6960991e0053e8ee17a8b40bf53f082 Text-content-sha1: 6eb7248164e8028bcd7eb5d7faacb502a30c1e72 Content-length: 201 K 15 cvs2svn:cvs-rev V 8 1.20.2.1 PROPS-END SVN(- &#/* Make sure the window hasn't shrunk since the save */ if (curs_x >= cols) curs_x = cols-1; if (curs_y >= rows) curs_y = rows-1 Revision-number: 513 Prop-content-length: 264 Content-length: 264 K 8 svn:date V 27 2000-07-21T09:17:05.000000Z K 7 svn:log V 163 PSCP: After a password supplied with `-pw' fails to authenticate, we should _not_ fall back to console input for a second attempt, because this hangs batch files. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8517827df5aeec27e71f4a8f20d180b7 Text-delta-base-sha1: 03d86179310fe2bddd76ca166496942d63f84a05 Text-content-length: 292 Text-content-md5: b1b7e8c55aa49e4c7dce304baa98cea5 Text-content-sha1: ffd32593fd7f65f2bf22e79871ec38227385808a Content-length: 332 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNNx~B}FngTzint static int tried_once = 0; if (tried_once) { return 0; } else { strncpy(str, password, maxlen); str[maxlen-1] = '\0'; tried_once = 1; return 1; } return 1 Node-path: putty/scp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4ef97d2d7c8656ab3f02b154bac42c75 Text-delta-base-sha1: 9c33c6ccd486154fc9b80fccf69274fc40796455 Text-content-length: 24 Text-content-md5: bb1f3285c68d0ed29b6c6791ee6797c4 Text-content-sha1: 75584c9eb71ccf31cbd57a12e7d99f7fe6dcdb30 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNUT LPint Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2603dd52287d7f8377a0e87efc23c564 Text-delta-base-sha1: 0225ae22ccf86e23ebeb56a1f7ee07fc300d16cb Text-content-length: 1075 Text-content-md5: c260e08ac944ae639ff9a090bd0672e7 Text-content-sha1: 2cbe9ce55f53deebe55058685909fd03ffd5cf25 Content-length: 1115 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNxx= INBUF_SIZE) term_out(); \ inbuf[inbuf_head++] = (_C) ; } while(0) #define INBUF_SIZE 2048 GLOBAL unsigned char inbuf[INBUF_SIZE]; GLOBAL int inbuf_head, vt52_mode; GLOBAL int repeat_off, cr_lf_returnfunky_typescroll_on_key; /* Terminal options */ int savelines; int dec_om; int wrap_mode; int lfhascr; int blink_cur; int beep; int scrollbar; int locksize; int bce; int blinktexttranslations */ VT_Mode vtmode;, intintvoid term_paste(void); void term_nopaste(void Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9a964ff0c5e8e5554801e915ef3fd0d2 Text-delta-base-sha1: 0d733c0205308bd015225029066d3d58c7bd7642 Text-content-length: 52 Text-content-md5: 1b936a9a2cc22100dbb25b6840c755c1 Text-content-sha1: 5fd4ab6c7d2ee77be5bd6c94cc5953c2283562d4 Content-length: 91 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN. R! c_write1(*buf++); Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c260e08ac944ae639ff9a090bd0672e7 Text-delta-base-sha1: 2cbe9ce55f53deebe55058685909fd03ffd5cf25 Text-content-length: 50 Text-content-md5: a0cf58cdfc14d9403a0e8b1694fc9ac3 Text-content-sha1: 9e7e6479fe8491755ac85b97008c83c081dc97af Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNx d c_write1(*buf++); Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5dc5b693f1d85f0fae34f5d8d4b3bdbb Text-delta-base-sha1: ade52a6cb835a29034d180d5ea0e1b5146ce3219 Text-content-length: 324 Text-content-md5: 8543ddc2988c41c20cb68e3ed18d4f38 Text-content-sha1: 183ccc9c1f0b60c9d75d1550ac9c112965daaf8f Content-length: 364 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN3v) 76z7.=La>x;if (!in_synch) c_write1(cc_write1(csrealloc(sb_buf, sb_size) : s/* This needs to be larger than the packet size now that inbuf * cannot overflow, in fact the fewer calls we make to windows * the faster we will run! */ char buf[16384]; Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef926aa7bf1899b1162d44c250ba6a35 Text-delta-base-sha1: a1dea9dba265124e7c1dd7f309f4ce95c4470062 Text-content-length: 9305 Text-content-md5: 55f8a42d8fa80e9ab09d88324d68de38 Text-content-sha1: 09c66be5fd6bfdd36754f404346eeeb2564c1439 Content-length: 9345 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN(gBo om NVLSBuC@KWmDaQ .nU M'y0{ A-VAAAJQBdN$e/u& @9",,vI*.;~Wl-NxZ@'v ZV O- =':vf5Bz}1RQ.Y"^wTC3V]Y^^NDl\{ |g% $Codes in all ANSI like terminals.SCOANSI 0x1000 /* SCOANSI not in ANSIMIN. */ #define CL_ANSI 0x2000 /* ANSI ECMA-48 not in the VT100..VT420 */ #define CL_OTHER 0x4|CL_VT100) #define TM_VT100AVO (TM_VT100|CL_VT100AVO) #define TM_VT102 (TM_VT100AVO|CL_VT102) #define TM_VT220 (TM_VT102|CL_VT220) #define TM_VTXXX (TM_VT220|CL_VT340TEXT|CL_VT510|CL_VT420|CL_VT320) #define TM_SCOANSI (CL_ANSIMIN|CL_SCOANSI) #define TM_PUTTY (0xFFFF#define compatibility2(x,y) \ if ( ((CL_##x|CL_##y)&compatibility_level) == 0 ) { sbbot; /* furthest extenttblinker; /* When the blinking text is on */ static int blink_is_real; /* Actually blink blinking textchar id_string[1024] = "\033[?6c"static char * paste_buffer = 0; static int paste_len, paste_pos, paste_holdcfg.bce; blink_is_real = cfg.blinktextcfg.scroll_on_key)) || (seen_disp_event && (!cfg.scroll_on_keybbotsbboterase_charif (newrows>crows) disptop = newtext; else disptop = newtext + (crows-newrows)*(newcols+1); ccols = (cols < newcols ? cols : newcols); for (i=0; i botline - topline + 1) lines = botline - topline + 1effect the scrollback buffer. * * This is normally done by moving the position the screen * painter reads from to reduce the amount of memory copying * required. */ if (scroll_size >= 0 && !recursive) { newscr = scrtop + lines * (cols+1); if (newscr > sbbot && botline == rows-1) { /* We've hit the bottom of memory, so we have to do a * physical scroll. But instead of just 1 line do it * by 10% of the available memory. * * If the scroll region isn't the whole screen then we can't * do this as it stands. We would need to recover the bottom * of the screen from the scroll buffer after being sure that * it doesn't get deleted. */ i = (rows+savelines)/10; /* Make it simple and ensure safe recursion */ if ( i scroll_top && disptop < scroll_top + size + scroll_size) { disptop -= size; if (disptop < scroll_top) disptop if (scrtop_is_disptop) disptop = scrtop; else if (disptop > scroll_top && disptop < scroll_top + size + scroll_size) { disptop += size; if (disptop > scroll_top + size + scroll_size) disptop/* Make sure the window hasn't shrunk since the save */ if (curs_x >= cols) curs_x = cols-1; if (curs_y >= rows) curs_y = rows-1; ; /* I've removed the +1 so that the Wide screen stuff is not * removed when it shouldn't be. */8: /* auto key repeat */ repeat_off = ! case 20: /* Return sends ... */ cr_lf_return = state, inbuf_reap; static int beep_overload = 0; int beep_count = 0; for(inbuf_reap = 0; inbuf_reap < inbuf_head; inbuf_reap++) { c = inbuf[inbuf_reap]; (c&0x60) == 0 || c == '\177') && beep_count++; if(beep_count>6) beep_overload=1; disptop = scrtop; break; case '\b': if (curs_x == 0 && curs_y == 0) ; else paste_hold = 0paste_hold = 0; break; case '\t': { unsigned long *old_cpos = cpos; unsigned long *p = scrtop + curs_y * (cols+1) + cols; do { curs_x++; } while (curs_x < cols-1 && !tabs[curs_x]); if ((*p & LATTR_MODE) != LATTR_NORM) { if (curs_x >= cols/2) curs_x = cols/2-1; } else { if (curs_x >= cols) curs_x = cols-1; } |id_string, strlen(id_string)id_string, strlen(id_string)); break; case 'n': /* cursor position query */ if (esc_args[0] == 6) { (' '| (curr_attr&(ATTR_FGMASK|ATTR_BGMASK|ATTR_BLINK)) request_resize (cols, def(esc_args[0], 24)0) { request_resize (cols, def(esc_args[0], cfg.height)request_resize (def(esc_args[0], cfg.width)ANSIMINE','='): compatibility(OTHER); blink_is_real = (esc_args[0]>=1{ unsigned long *p; unsigned long nlattr; int n; switch (c) { case '8': p = scrtop; n = rows * (cols+1); while (n--) *p++ = ATTR_DEFAULT | 'E'; disptop = scrtop; seen_disp_event = TRUE; check_selection (scrtop, scrtop + rows * (cols+1)); break; case '3': nlattr = LATTR_TOP; if(0) { case '4': nlattr = LATTR_BOT; } if(0) { case '5': nlattr = LATTR_NORM; } if(0) { case '6': nlattr = LATTR_WIDE; } p = scrtop + curs_y * (cols+1) + cols; *p &= ~LATTR_MODE; *p |= nlattr; } inbuf_head = 0; if (beep_overload) { if(!beep_count) beep_overload=0; } else if(beep_count && beep_count<5 && cfg.beep) beep(beep_count/3);int lattr = (disptop[idx+cols] & LATTR_MODElattr | if (blink_is_real) { if (has_focus && tblinker && (wanttext[idx]&ATTR_BLINK) ) { wanttext[idx] &= ATTR_MASK; wanttext[idx] += ' '; } wanttext[idx] &= ~ATTR_BLINK; }int lattr = (wanttext[idx+cols] & LATTR_MODE, lstatic long last_tblink = 0; long now, blink_diff; now = GetTickCount(); blink_diff = now-last_tblink; /* Make sure the text blinks no more than 2Hz */ if (blink_diff<0 || blink_diff>450) { last_tblink = now; tblinker = !tblinker; } if (flg) { blinker = 1; last_blink = now; return; } { if ( (disptext[i*(cols+1)+cols]&LATTR_MODE) == LATTR_NORM) for (j = left; j <= right && j < cols ; j++) disptext[i*(cols+1)+j] = ATTR_INVALID; else for (j = left/2; j <= right/2+1 && j < cols ; j++) disptext[i*(cols+1)+j] = ATTR_INVALID; }; if ((selpoint[cols]&LATTR_MODE) != LATTR_NORM) selpoint += x/2; else selpoint += if (paste_buffer) sfree(paste_buffer); paste_pos = paste_hold = paste_len = 0; paste_buffer = smalloc(len); paste_buffer[paste_len++] = cpaste_buffer[paste_len++] = '\r'; p += sizeof(sel_nl); } q = p; } /* Assume a small paste will be OK in one go. */ if (paste_len<256) { ldisc->send (paste_buffer, paste_len); if (paste_buffer) sfree(paste_buffer); paste_buffer = 0; paste_pos = paste_hold = paste_len = 0; } } get_clip(NULL, NULL); } term_update(); } void term_nopaste() { if(paste_len == 0) return; sfree(paste_buffer); paste_buffer = 0; paste_len = 0; } void term_paste() { static long last_paste = 0; long now, paste_diff; if(paste_len == 0) return; /* Don't wait forever to paste */ if(paste_hold) { now = GetTickCount(); paste_diff = now-last_paste; if (paste_diff>=0 && paste_diff<450) return; } paste_hold = 0; while(paste_possend (&c, 1); if (c =='\r') { paste_hold = 1; return; } } sfree(paste_buffer); paste_buffer = 0; paste_len = 0 Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b2a6d33b6253295b602a3648eddcd994 Text-delta-base-sha1: e6431922be82eb5167cd0cea5474071caa9b7adc Text-content-length: 555 Text-content-md5: e70fe4c77016862fb222c56127f5bc2b Text-content-sha1: 45572df5e5888a9c873f155c7b24522f2faba3dd Content-length: 595 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNX~Hq_5`pCFUNCXTERM 1010 #define IDC1_KPSTATIC 1011 #define IDC1_KPNORMAL 1012 #define IDC1_KPAPPLIC 1013 #define IDC1_KPNH 1014 #define IDC1_CURSTATIC 1015 #define IDC1_CURNORMAL 1016 #define IDC1_CURAPPLIC 1017 #define IDC1_ALTF4 1018 #define IDC1_ALTSPACE 1019 #define IDC1_LDISCTERM 1020 #define IDC1_SCROLLKEYLFHASCR 1018 #define IDC1_BLINKCUR 1020 #define IDC1_BEEP 1021 #define IDC2_SCROLLBAR 1022 #define IDC2_LOCKSIZE 1023 #define IDC2_BCE 1024 #define IDC2_BLINKTEXT 1025 #endif Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 37da8d5b0a783a54ad2d5c3fb353b642 Text-delta-base-sha1: 708b4dac5729dcaa063f468d341cc2022f7664d6 Text-content-length: 7509 Text-content-md5: 3b0114679f1a79c7d13b8ab7de6711dd Text-content-sha1: 92e67138063f82267196551479a8cc3532c4017f Content-length: 7549 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN_ fct4h3yU[e&Nj h3sx@zi2Ch3U[vo]7x#%iWR?.P BEGIN LTEXT "Host &Name", IDC0_HOSTSTATIC, 3, 3, 119, 8 EDITTEXT IDC0_HOST, 3, 11, 119, 12, ES_AUTOHSCROLL LTEXT "&Port", IDC0_PORTSTATIC, 129, 3, 35, 8 EDITTEXT IDC0_PORT, 129, 11, 35, 12 #ifdef FWHACK RTEXT "Protocol:", IDC0_PROTSTATIC, 3, 27, 35, 8 AUTORADIOBUTTON "&Raw", IDC0_PROTRAW, 45, 27, 35, 8, WS_GROUP AUTORADIOBUTTON "&Telnet", IDC0_PROTTELNET, 87, 27, 35, 8 AUTORADIOBUTTON "SS&H/hack", IDC0_PROTSSH, 129, 27, 35, 8 #else RTEXT "Protocol:", IDC0_PROTSTATIC, 3, 27, 35, 8 AUTORADIOBUTTON "&Raw", IDC0_PROTRAW, 45, 27, 35, 8, WS_GROUP AUTORADIOBUTTON "&Telnet", IDC0_PROTTELNET, 87, 27, 35, 8 #ifndef NO_SSH AUTORADIOBUTTON "SS&H", IDC0_PROTSSH, 129, 27, 35, 8 #endif #endif LTEXT "Stor&ed Sessions", IDC0_SESSSTATIC, 3, 37, 162, 8 EDITTEXT IDC0_SESSEDIT, 3, 45, 119, 12, ES_AUTOHSCROLL LISTBOX IDC0_SESSLIST, 3, 59, 119, 71, LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Load", IDC0_SESSLOAD, 129, 59, 35, 14 PUSHBUTTON "&Save", IDC0_SESSSAVE, 129, 76, 35, 14 PUSHBUTTON "&Delete", IDC0_SESSDEL, 129, 93, 35, 14 AUTOCHECKBOX "Close &Window on Exit", IDC0_CLOSEEXIT, 3, 130, 162, 8 AUTOCHECKBOX "Warn on C&lose", IDC0_CLOSEWARN, 3, 140, 162, 8 END IDD_PANEL1 3, 49, 8, WS_GROUP AUTORADIOBUTTON "Control-&? (127)", IDC1_DEL127, 59, 13, 105, 8 IDC1_HOMETILDE, 3, 35, 49, 8, WS_GROUP AUTORADIOBUTTON "&rxvt", IDC1_HOMERXVT, 59, 35, 49, 8 LTEXT "Function key and keypad layout:", IDC1_FUNCSTATIC, 3, 47, 162, 8 AUTORADIOBUTTON "&VT400", IDC1_FUNCTILDE, 3, 57, 49, 8, WS_GROUP AUTORADIOBUTTON "&Linux", IDC1_FUNCLINUX, 59, 57, 49, 8 AUTORADIOBUTTON "&Xterm R6", IDC1_FUNCXTERM, 115, 57, 49, 8 LTEXT "Initial state of cursor keys:", IDC1_CURSTATIC, 3, 69, 162, 8 AUTORADIOBUTTON "&Normal", IDC1_CURNORMAL, 3, 79, 49, 8, WS_GROUP AUTORADIOBUTTON "A&pplication", IDC1_CURAPPLIC, 59, 79, 49, 8 IDC1_KPNORMAL, 3, 101, 49, 8, WS_GROUP AUTORADIOBUTTON "Appl&ication", IDC1_KPAPPLIC, 59, 101, 49, 8 AUTORADIOBUTTON "N&etHack", IDC1_KPNH, 115, 101, 49, 8 AUTOCHECKBOX "ALT-F&4 is special (closes window)", IDC1_ALTF4, 3, 113, 162, 8 AUTOCHECKBOX "ALT-Space is special (S&ystem menu)", IDC1_ALTSPACE, 3, 123, 162, 8 AUTOCHECKBOX "&Use local terminal line discipline", IDC1_LDISCTERM, 3, 133, 162, 8 AUTOCHECKBOX "Reset scrollback on &keypress", IDC1_SCROLLKEY, 3, 143, 162, 8 END IDD_PANEL2 BEGIN LTEXT "Terminal screen dimensions:", IDC2_DIMSTATIC, 3, 3, 162, 8 RTEXT "&Rows", IDC2_ROWSSTATIC, 3, 15, 35, 8 EDITTEXT IDC2_ROWSEDIT, 45, 13, 35, 12 RTEXT "Colu&mns", IDC2_COLSSTATIC, 87, 15, 35, 8 EDITTEXT IDC2_COLSEDIT, 129, 13, 35, 12 RTEXT "&Saved lines of scrollback", IDC2_SAVESTATIC, 3, 30, 119, 8 EDITTEXT IDC2_SAVEEDIT, 129, 28, 35, 12 RTEXT "Font:", IDC2_FONTSTATIC, 3, 48, 105, 8 PUSHBUTTON "C&hange...", IDC2_CHOOSEFONT, 115, 45, 49, 14 AUTOCHECKBOX "Auto &wrap mode initially on", IDC2_WRAPMODE, 3, 62, 162, 8 AUTOCHECKBOX "&DEC Origin Mode initially on", IDC2_DECOM, 3, 72, 162, 8 AUTOCHECKBOX "Avoid ever using &icon title", IDC2_WINNAME, 3, 82, 162, 8 AUTOCHECKBOX "Implicit CR in every &LF", IDC2_LFHASCR, 3, 92, 162, 8 AUTOCHECKBOX "&Blinking cursor", IDC1_BLINKCUR, 3, 102, 162, 8 AUTOCHECKBOX "Bee&p enabled", IDC1_BEEP, 3, 112, 162, 8 AUTOCHECKBOX "Displa&y scrollbar", IDC2_SCROLLBAR, 3, 122, 162, 8 AUTOCHECKBOX "Loc&k Window size", IDC2_LOCKSIZE, 3, 132, 162, 8 AUTOCHECKBOX "Use Backgroud colour erase", IDC2_BCE, 3, 142, 162, 8 AUTOCHECKBOX "Enable blinking text", IDC2_BLINKTEXT, 3, 152, 162, 8 BEGIN LTEXT "Terminal-&type string", IDC3_TTSTATIC, 3, 5, 77, 8 EDITTEXT IDC3_TTEDIT, 87, 3, 77, 12, ES_AUTOHSCROLL LTEXT "Terminal-&speed string", IDC3_TSSTATIC, 3, 19, 77, 8 EDITTEXT IDC3_TSEDIT, 87, 17, 77, 12, ES_AUTOHSCROLL LTEXT "Auto-login &username", IDC3_LOGSTATIC, 3, 33, 77, 8 EDITTEXT IDC3_LOGEDIT, 87, 31, 77, 12, ES_AUTOHSCROLL LTEXT "Environment variables:", IDC3_ENVSTATIC, 3, 53, 162, 8 LTEXT "&Variable", IDC3_VARSTATIC, 3, 65, 26, 8 EDITTEXT IDC3_VAREDIT, 36, 63, 26, 12, ES_AUTOHSCROLL LTEXT "Va&lue", IDC3_VALSTATIC, 70, 65, 26, 8 EDITTEXT IDC3_VALEDIT, 104, 63, 59, 12, ES_AUTOHSCROLL LISTBOX IDC3_ENVLIST, 3, 81, 119, 55, LBS_HASSTRINGS | LBS_USETABSTOPS | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "A&dd", IDC3_ENVADD, 129, 81, 35, 14 PUSHBUTTON "&Remove", IDC3_ENVREMOVE, 129, 98, 35, 14 LTEXT "ENVIRON interpretation:", IDC3_EMSTATIC, 3, 136, 77, 8 AUTORADIOBUTTON "&BSD", IDC3_EMBSD, 87, 136, 35, 8, WS_GROUP AUTORADIOBUTTON "R&FC", IDC3_EMRFC, 129, 136, 35, 8 END IDD_PANEL3 BEGIN LTEXT "Terminal-&type string", IDC3_TTSTATIC, 3, 5, 77, 8 EDITTEXT IDC3_TTEDIT, 87, 3, 77, 12, ES_AUTOHSCROLL AUTOCHECKBOX "Don't allocate a &pseudo-terminal", IDC3_NOPTY, 3, 19, 162, 8 LTEXT "Auto-login &username", IDC3_LOGSTATIC, 3, 31, 77, 8 EDITTEXT IDC3_LOGEDIT, 87, 29, 77, 12, ES_AUTOHSCROLL LTEXT "Cipher:", IDC3_CIPHERSTATIC, 3, 45, 35, 8 AUTORADIOBUTTON "&3DES", IDC3_CIPHER3DES, 45, 45, 35, 8, WS_GROUP AUTORADIOBUTTON "&Blowfish", IDC3_CIPHERBLOWF, 87, 45, 35, 8 AUTORADIOBUTTON "&DES", IDC3_CIPHERDES, 129, 45, 35, 8 AUTOCHECKBOX "Attempt TIS authentication", IDC3_AUTHTIS, 3, 55, 162, 8 END IDD_PANEL4 BEGIN 3, 162, 83, 162, 8 LTEXT "Character classes:", IDC4_CCSTATIC, 3, 37, 162, 8 LISTBOX IDC4_CCLIST, 3, 47 PUSHBUTTON "&Set", IDC4_CCSET, 33, 147, 34, 14 LTEXT "&to class", IDC4_CCSTATIC2, 73, 147+3, 26, 8 EDITTEXT IDC4_CCEDIT, 105, 147+1, 36, 12 BEGIN AUTOCHECKBOX "&Bolded text is a different colour", IDC5_BOLDCOLOUR, 3, 3, 162, 8 AUTOCHECKBOX "Attempt to use &logical palettes", IDC5_PALETTE, 3, 19, 162, 8 LTEXT "C&olours:", IDC5_STATIC, 3, 35, 162, 8 LISTBOX IDC5_LIST, 3, 45, 100, 110, LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP LTEXT "Red:", IDC5_RSTATIC, 109, 45, 27, 8 RTEXT "", IDC5_RVALUE, 138, 45, 27, 8 LTEXT "Green:", IDC5_GSTATIC, 109, 45+8, 27, 8 RTEXT "", IDC5_GVALUE, 138, 45+8, 27, 8 LTEXT "Blue:", IDC5_BSTATIC, 109, 45+16, 27, 8 RTEXT "", IDC5_BVALUE, 138, 45+16, 27, 8 PUSHBUTTON "C&hange...", IDC5_CHANGE, 109, 135, 56, 14 BEGIN LTEXT "Handling of VT100 line drawing characters:",IDC2_VTSTATIC, 3, 33, 162, 8, WS_GROUP AUTORADIOBUTTON "Use font in &both ANSI and OEM modes", IDC2_VTOEMANSI, 3, 23, 162, 8 AUTORADIOBUTTON "Use font in O&EM mode only", IDC2_VTOEMONLY, 3, 33, 162, 8 AUTORADIOBUTTON "&Poor man's line drawing (""+"", ""-"" and ""|"")", IDC2_VTPOORMAN, 3, 43, 162, 8 LTEXT "Character set translation:", IDC6_XLATSTATIC, 3, 59, 162, 8 AUTORADIOBUTTON "&None", IDC6_NOXLAT, 3, 69, 162, 8, WS_GROUP AUTORADIOBUTTON "&KOI8 / Win-1251", IDC6_KOI8WIN1251, 3, 79, 162, 8 AUTORADIOBUTTON "&ISO-8859-2 / Win-1250", IDC6_88592WIN1250, 3, 89, 162, 8 AUTOCHECKBOX "CA&PS LOCK acts as cyrillic switch", IDC6_CAPSLOCKCYR, 3, 105, 162, 8 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ce9153e0d89658284a100fab74687c50 Text-delta-base-sha1: 2030fc77fa07af389e15a2e32da6369ba521ccca Text-content-length: 2905 Text-content-md5: 4aff3976fabc62bd2483f1299a2bf87b Text-content-sha1: eecfa8838a50a675ae290666b3a575663818ca97 Content-length: 2945 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNF]/*o7ex#_(7 eNPinN<\yGpKHQ5 l2}y`Yxe1jQG8L=/MHu,a.-funky_type wppi (sesskey, "ScrollBar", cfg.scrollbar); wppi (sesskey, "ScrollOnKey", cfg.scroll_on_key); wppi (sesskey, "LockSize", cfg.locksize); wppi (sesskey, "BCE", cfg.bce); wppi (sesskey, "BlinkText", cfg.blinktextfunky_type gppi (sesskey, "ScrollBar", 1, &cfg.scrollbar); gppi (sesskey, "ScrollOnKey", 0, &cfg.scroll_on_key); gppi (sesskey, "LockSize", 0, &cfg.locksize); gppi (sesskey, "BCE", 0, &cfg.bce); gppi (sesskey, "BlinkText", 0, &cfg.blinktext); RegCloseKey(sesskey); } static void force_normal(HWND hwnd) { static int recurse = 0; WINDOWPLACEMENT wp; if(recurse) return; recurse = 1; wp.length = sizeof(wp); if (GetWindowPlacement(hwnd, &wp)) { wp.showCmd = SW_SHOWNORMAL; SetWindowPlacement(hwnd, &wp); } recurse = 0XTERM, cfg.funky_type ? (cfg.funky_type==2 ? IDC1_FUNCXTERM : IDC1_FUNCLINUX ) SCROLLKEY, cfg.scroll_on_keyXTERM: cfg.funky_type = 2; break; case IDC1_FUNCTILDE: case IDC1_FUNCLINUX: cfg.funky_typeSCROLLKEYscroll_on_key = IsDlgButtonChecked (hwnd, IDC1_SCROLLKEYDlgButton (hwnd, IDC1_BLINKCUR, cfg.blink_cur); CheckDlgButton (hwnd, IDC1_BEEP, cfg.beep); CheckDlgButton (hwnd, IDC2_SCROLLBAR, cfg.scrollbar); CheckDlgButton (hwnd, IDC2_LOCKSIZE, cfg.locksize); CheckDlgButton (hwnd, IDC2_BCE, cfg.bce); CheckDlgButton (hwnd, IDC2_BLINKTEXT, cfg.blinktext2_WRAPMOD case IDC1_BLINKCUR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.blink_cur = IsDlgButtonChecked (hwnd, IDC1_BLINKCUR); break; case IDC1_BEEP: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.beep = IsDlgButtonChecked (hwnd, IDC1_BEEP); break; case IDC2_SCROLLBAR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.scrollbar = IsDlgButtonChecked (hwnd, IDC2_SCROLLBAR); break; case IDC2_LOCKSIZE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.locksize = IsDlgButtonChecked (hwnd, IDC2_LOCKSIZE); break; case IDC2_BLINKTEXT: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.blinktext = IsDlgButtonChecked (hwnd, IDC2_BLINKTEXT); break; case IDC2_BCE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.bce = IsDlgButtonChecked (hwnd, IDC2_BCE); TelnetTranslationTranslationTranslation /* Grrr Explorer will maximize Dialogs! */ case WM_SIZE: if (wParam == SIZE_MAXIMIZED) force_normal(hwndelse force_normal(hwnd); smalloc(len); mungedhost = s Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 00bf0aeac97bf0d227476139db152587 Text-delta-base-sha1: 0230731517dc0b1e29ba620b49fd13f61b8d30aa Text-content-length: 15810 Text-content-md5: 3cd6fbe67b0c8267d9b6655a64100f04 Text-content-sha1: b1ac2e0118c2372dc5420b4d7eeeaa0d7b635389 Content-length: 15850 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVNjBq% %]=Z%1d[E]3> I]g9hs=iAB%e~|G/c y6j9 $Az^}C>^>Un T$AvUINT message, { int winmode = WS_OVERLAPPEDWINDOW|WS_VSCROLL; if (!cfg.scrollbar) winmode &= ~(WS_VSCROLL); if (cfg.locksize) winmode &= ~(WS_THICKFRAME|WS_MAXIMIZEBOX); hwnd = CreateWindow (appname, appname, winmode, CW_USEDEFAULT, CW_USEDEFAULT, guess_width, guess_height, NULL, NULL, inst, NULL); }ALLhead = 0; outbuf_reap = outbuf_head = 0Send the paste buffer if there's anything to send */ term_paste(head) term_out(); term_update(); if (!has_focus) timer_id = SetTimer(hwnd, 1, 2000, NULL); else if (cfg.blinktext) timer_id = SetTimer(hwnd, 1, 250, NULL); else /* If the window is maximized supress resizing attempts */ if(IsZoomed(hwnd)) return else { static int first_time = 1; static RECT ss; switch(first_time) { case 1: /* Get the size of the screen */ if (GetClientRect(GetDesktopWindow(),&ss)) /* first_time = 0 */; else { first_time = 2; break; } case 0: /* Make sure the values are sane */ width = (ss.right-ss.left-extra_width ) / font_width; height = (ss.bottom-ss.top-extra_height ) / font_height; if (w>width) w=width; if (h>height) h=height; if (w<15) w = 15; if (h<1) w = 1; } /* Enable or disable the scroll bar, etc */ { LONG nflg, flag = GetWindowLong(hwnd, GWL_STYLE); nflg = flag; if (cfg.scrollbar) nflg |= WS_VSCROLL; else nflg &= ~WS_VSCROLL; if (cfg.locksize) nflg &= ~(WS_THICKFRAME|WS_MAXIMIZEBOX); else nflg |= (WS_THICKFRAME|WS_MAXIMIZEBOX); if (nflg != flag) { RECT cr, wr; SetWindowLong(hwnd, GWL_STYLE, nflg); SendMessage (hwnd, WM_IGNORE_SIZE, 0, 0); SetWindowPos(hwnd, NULL, 0,0,0,0, SWP_NOACTIVATE|SWP_NOCOPYBITS| SWP_NOMOVE|SWP_NOSIZE| SWP_NOZORDER| SWP_FRAMECHANGED); GetWindowRect (hwnd, &wr); GetClientRect (hwnd, &cr); extra_width = wr.right - wr.left - cr.right + cr.left; extra_height = wr.bottom - wr.top - cr.bottom + cr.top; } } case WM_KEYUP: case WM_SYSKEYUPmessage, , int lattr) { int fnt_width = font_width*(1+(lattr!=LATTR_NORM)); static int *IpDx = 0, IpDxLEN = 0;; if (len>IpDxLEN || IpDx[0] != fnt_widthIpDxLEN; i++) IpDx[i] = fnt_width; } x *= fnt_width; y *= font_height; if (attr & ATTR_ACTCURS) { attr &= (bold_mode == BOLD_COLOURS ? 0x300200 : 0x300 * * Or ... I could do a test print with "W", and use +1 or -1 for this * shift depending on if the leftmost column is blank... static int check_compose(int first, int second) { static char * composetbl[] = { "++#", "AA@", "(([", "//\\", "))]", "(-{", "-)}", "/^|", "!!", "C/", "C|", "L-", "L=", "XO", "X0", "Y-", "Y=", "||", "SO", "S!", "S0", "\"\"", "CO", "C0", "A_", "<<", ",-", "--", "RO", "-^", "0^", "+-", "2^", "3^", "''", "/U", "P!", ".^", ",,", "1^", "O_", ">>", "14", "12", "34", "??", "`A", "'A", "^A", "~A", "\"A", "*A", "AE", ",C", "`E", "'E", "^E", "\"E", "`I", "'I", "^I", "\"I", "-D", "~N", "`O", "'O", "^O", "~O", "\"O", "XX", "/O", "`U", "'U", "^U", "\"U", "'Y", "HT", "ss", "`a", "'a", "^a", "~a", "\"a", "*a", "ae", ",c", "`e", "'e", "^e", "\"e", "`i", "'i", "^i", "\"i", "-d", "~n", "`o", "'o", "^o", "~o", "\"o", ":-", "o/", "`u", "'u", "^u", "\"u", "'y", "ht", "\"y", 0}; char ** c; static int recurse = 0; int nc = -1; if(0) { char buf[256]; char * p; sprintf(buf, "cc(%d,%d)", first, second); for(p=buf; *p; p++) c_write1(*p); } for(c=composetbl; *c; c++) { if( (*c)[0] == first && (*c)[1] == second) { return (*c)[2] & 0xFF; } } if(recurse==0) { recurse=1; nc = check_compose(second, first); if(nc == -1) nc = check_compose(toupper(first), toupper(second)); if(nc == -1) nc = check_compose(toupper(second), toupper(first)); recurse=0; } return nc; } /* * Translate a WM_(SYS)?KEY(UP|DOWN) message into a string of ASCII * codes. Returns number of bytes used or zero to drop the message * or -1 to forward the message to windows. */ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, unsigned char *output) { BYTE keystate[256]; int scan, left_alt = 0, key_down, shift_state; int r, i, code; unsigned char * p = output; static WORD keys[3]; static int compose_state = 0; static int compose_char = 0; static WPARAM compose_key = 0; r = GetKeyboardState(keystate); if (!r) memset(keystate, 0, sizeof(keystate)); else { /* Note if AltGr was pressed and if it was used as a compose key */ if (wParam == VK_MENU && (HIWORD(lParam)&KF_EXTENDED)) { keystate[VK_RMENU] = keystate[VK_MENU]; if (!compose_state) compose_key = wParam; } if (wParam == VK_APPS && !compose_state) compose_key = wParam; if (wParam == compose_key) { if (compose_state == 0 && (HIWORD(lParam)&(KF_UP|KF_REPEAT))==0) compose_state = 1; else if (compose_state == 1 && (HIWORD(lParam)&KF_UP)) compose_state = 2; else compose_state = 0; } else if (compose_state==1 && wParam != VK_CONTROL) compose_state = 0; /* Nastyness with NUMLock - Shift-NUMLock is left alone though */ if ( (cfg.funky_type == 0 || (cfg.funky_type == 1 && app_keypad_keys)) && wParam==VK_NUMLOCK && !(keystate[VK_SHIFT]&0x80)) { wParam = VK_EXECUTE; /* UnToggle NUMLock */ if ((HIWORD(lParam)&(KF_UP|KF_REPEAT))==0) keystate[VK_NUMLOCK] ^= 1; } /* And write back the 'adjusted' state */ SetKeyboardState (keystate); } /* Disable Auto repeat if required */ if (repeat_off && (HIWORD(lParam)&(KF_UP|KF_REPEAT))==KF_REPEAT) return 0; if ((HIWORD(lParam)&KF_ALTDOWN) && (keystate[VK_RMENU]&0x80) == 0) left_alt = 1; key_down = ((HIWORD(lParam)&KF_UP)==0); /* Make sure Ctrl-ALT is not the same as AltGr for ToAscii */ if (left_alt && (keystate[VK_CONTROL]&0x80)) keystate[VK_MENU] = 0; scan = (HIWORD(lParam) & (KF_UP | KF_EXTENDED | 0xFF)); shift_state = ((keystate[VK_SHIFT]&0x80)!=0) + ((keystate[VK_CONTROL]&0x80)!=0)*2Make sure we're not pasting */ if (key_down) term_nopaste(); if (compose_state>1 && left_alt) compose_state = 0; /* Sanitize the number pad if not using a PC NumPad */ if( left_alt || (app_keypad_keys && cfg.funky_type != 2) || cfg.nethack_keypad || compose_state ) { if ((HIWORD(lParam)&KF_EXTENDED) == 0) { int nParam = 0; switch(wParam) { case VK_INSERT: nParam = VK_NUMPAD0; break; case VK_END: nParam = VK_NUMPAD1; break; case VK_DOWN: nParam = VK_NUMPAD2; break; case VK_NEXT: nParam = VK_NUMPAD3; break; case VK_LEFT: nParam = VK_NUMPAD4; break; case VK_CLEAR: nParam = VK_NUMPAD5; break; case VK_RIGHT: nParam = VK_NUMPAD6; break; case VK_HOME: nParam = VK_NUMPAD7; break; case VK_UP: nParam = VK_NUMPAD8; break; case VK_PRIOR: nParam = VK_NUMPAD9; break; case VK_DELETE: nParam = VK_DECIMAL; break; } if (nParam) { if (keystate[VK_NUMLOCK]&1) shift_state |= 1; wParam = nParam; } } } /* If a key is pressed and AltGr is not active */ if (key_down && (keystate[VK_RMENU]&0x80) == 0 && !compose_state) { /* Okay, prepare for most alts then ...*/ if (left_alt) *p++ = '\033'; /* Lets see if it's a pattern we know all about ... */ if (wParam == VK_PRIOR && shift_state == 1) { SendMessage (hwnd, WM_VSCROLL, SB_PAGEUP, 0); return 0; } if (wParam == VK_NEXT && shift_state == 1) { SendMessage (hwnd, WM_VSCROLL, SB_PAGEDOWN, 0); return 0; } if (left_alt && wParam == VK_F4 && cfg.alt_f4) { return -1; } if (left_alt && wParam == VK_SPACE && cfg.alt_space) { SendMessage (hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0); return -1; } /* Nethack keypad */ if (cfg.nethack_keypad && !left_alt) { switch(wParam) { case VK_NUMPAD1: *p++ = shift_state ? 'B': 'b'; return p-output; case VK_NUMPAD2: *p++ = shift_state ? 'J': 'j'; return p-output; case VK_NUMPAD3: *p++ = shift_state ? 'N': 'n'; return p-output; case VK_NUMPAD4: *p++ = shift_state ? 'H': 'h'; return p-output; case VK_NUMPAD5: *p++ = shift_state ? '.': '.'; return p-output; case VK_NUMPAD6: *p++ = shift_state ? 'L': 'l'; return p-output; case VK_NUMPAD7: *p++ = shift_state ? 'Y': 'y'; return p-output; case VK_NUMPAD8: *p++ = shift_state ? 'K': 'k'; return p-output; case VK_NUMPAD9: *p++ = shift_state ? 'U': 'u'; return p-output; } } /* Application Keypad */ if (!left_alt) { int xkey = 0; if ( cfg.funky_type == 0 || ( cfg.funky_type == 1 && app_keypad_keys)) switch(wParam) { case VK_EXECUTE: xkey = 'P'; break; case VK_DIVIDE: xkey = 'Q'; break; case VK_MULTIPLY:xkey = 'R'; break; case VK_SUBTRACT:xkey = 'S'; break; } if(app_keypad_keys) switch(wParam) { case VK_NUMPAD0: xkey = 'p'; break; case VK_NUMPAD1: xkey = 'q'; break; case VK_NUMPAD2: xkey = 'r'; break; case VK_NUMPAD3: xkey = 's'; break; case VK_NUMPAD4: xkey = 't'; break; case VK_NUMPAD5: xkey = 'u'; break; case VK_NUMPAD6: xkey = 'v'; break; case VK_NUMPAD7: xkey = 'w'; break; case VK_NUMPAD8: xkey = 'x'; break; case VK_NUMPAD9: xkey = 'y'; break; case VK_DECIMAL: xkey = 'n'; break; case VK_ADD: if(shift_state) xkey = 'm'; else xkey = 'l'; break; case VK_RETURN: if (HIWORD(lParam)&KF_EXTENDED) xkey = 'M'; break; } if(xkey) { if (vt52_mode) { if (xkey>='P' && xkey<='S') p += sprintf((char *)p, "\x1B%c", xkey); else p += sprintf((char *)p, "\x1B?%c", xkey); } else p += sprintf((char *)p, "\x1BO%c", xkey); return p - output; } } if (wParam == VK_BACK && shift_state == 0 ) /* Backspace */ { *p++ = (cfg.bksp_is_delete ? 0x7F : 0x08); return p-output; } if (wParam == VK_TAB && shift_state == 1 ) /* Shift tab */ { *p++ = 0x1B; *p++ = '['; *p++ = 'Z'; return p - output; } if (wParam == VK_SPACE && shift_state == 2 ) /* Ctrl-Space */ { *p++ = 0; return p - output; } if (wParam == VK_SPACE && shift_state == 3 ) /* Ctrl-Shift-Space */ { *p++ = 160; return p - output; } if (wParam == VK_CANCEL && shift_state == 2 ) /* Ctrl-Break */ { *p++ = 3; return p - output; } /* Control-2 to Control-8 are special */ if (shift_state == 2 && wParam >= '2' && wParam <= '8') { *p++ = "\000\033\034\035\036\037\177"[wParam-'2']; return p - output; } if (shift_state == 2 && wParam == 0xBD) { *p++ = 0x1F; return p - output; } if (shift_state == 2 && wParam == 0xDF) { *p++ = 0x1C; return p - output; } if (shift_state == 0 && wParam == VK_RETURN && cr_lf_return) { *p++ = '\r'; *p++ = '\n'; return p - output; } /* * Next, all the keys that do tilde codes. (ESC '[' nn '~', * for integer decimal nn.) * * We also deal with the weird ones here. Linux VCs replace F1 * to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but * does replace Home and End (1~ and 4~) by ESC [ H and ESC O w * respectively. */ code = 0; switch (wParam) { case VK_F1: code = (keystate[VK_SHIFT] & 0x80 ? 23 : 11); break; case VK_F2: code = (keystate[VK_SHIFT] & 0x80 ? 24 : 12); break; case VK_F3: code = (keystate[VK_SHIFT] & 0x80 ? 25 : 13); break; case VK_F4: code = (keystate[VK_SHIFT] & 0x80 ? 26 : 14); break; case VK_F5: code = (keystate[VK_SHIFT] & 0x80 ? 28 : 15); break; case VK_F6: code = (keystate[VK_SHIFT] & 0x80 ? 29 : 17); break; case VK_F7: code = (keystate[VK_SHIFT] & 0x80 ? 31 : 18); break; case VK_F8: code = (keystate[VK_SHIFT] & 0x80 ? 32 : 19); break; case VK_F10: code = (keystate[VK_SHIFT] & 0x80 ? 34 : 21); break; case VK_F11: code = 23; break; case VK_F12: code = 24; break; case VK_F13: code = 25; break; case VK_F14: code = 26; break; case VK_F15: code = 28; break; case VK_F16: code = 29; break; case VK_F17: code = 31; break; case VK_F18: code = 32; break; case VK_F19: code = 33; break; case VK_F20: code = 34; break; case VK_HOME: code = 1; break; case VK_INSERT: code = 2; break; case VK_DELETE: code = 3; break; case VK_END: code = 4; break; case VK_PRIOR: code = 5; break; case VK_NEXT: code = 6; break; } if (cfg.funky_type == 1 && code >= 11 && code <= 15) { p += sprintf((char *)p, "\x1B[[%c", code + 'A' - 11); return p - output; } if (cfg.funky_type == 2 && code >= 11 && code <= 14) { p += sprintf((char *)p, "\x1BO%c", code + 'P' - 11); return p - output; } if (cfg.rxvt_homeend && (code == 1 || code == 4)) { p += sprintf((char *)p, code == 1 ? "\x1B[H" : "\x1BOw"); return p - output; } if (code) { p += sprintf((char *)p, "\x1B[%d~", code); return p - output; } /* * Now the remaining keys (arrows and Keypad 5. Keypad 5 for * some reason seems to send VK_CLEAR to Windows...). */ { char xkey = 0; switch (wParam) { case VK_UP: xkey = 'A'; break; case VK_DOWN: xkey = 'B'; break; case VK_RIGHT: xkey = 'C'; break; case VK_LEFT: xkey = 'D'; break; case VK_CLEAR: xkey = 'G'; break; } if (xkey) { if (vt52_mode) p += sprintf((char *)p, "\x1B%c", xkey); else if (app_cursor_keys) p += sprintf((char *)p, "\x1BO%c", xkey); else p += sprintf((char *)p, "\x1B[%c", xkey); return p - output; } } } /* Okay we've done everything interesting; let windows deal with * the boring stuff */ {scan, keystate, keys, 0); if(r>0) { p = output; for(i=0; i' ') { compose_char = ch; compose_state ++; continue; } if (compose_state==3 && (ch&0x80) == 0 && ch>' ') { int nc; compose_state = 0; if ((nc=check_compose(compose_char,ch)) == -1) { c_write1('\007'); return 0; } *p++ = xlat_kbd2tty((unsigned char)nc); return p-output; } compose_state = 0; if( left_alt && key_down ) *p++ = '\033'; if (!key_down) *p++ = ch; else { if(capsOn) ch = xlat_latkbd2win(ch); *p++ = xlat_kbd2tty(ch); } } /* This is so the ALT-Numpad and dead keys work correctly. */ keys[0] = 0; return p-output; } } /* This stops ALT press-release doing a 'COMMAND MENU' function */ #if 0 if (message == WM_SYSKEYUP && wParam == VK_MENU) { keystate[VK_MENU] = 0; return 0; } #endif return -1 if (!cfg.scrollbar) return; si.cbSize = sizeof(si); si.fMask = SIF_ALLint errorbeep) { static long last_beep = 0; long now, beep_diff; now = GetTickCount(); beep_diff = now-last_beep; /* Make sure we only respond to one beep per packet or so */ if (beep_diff>=0 && beep_diff<50) return; if(errorbeep) MessageBeep(MB_ICONHAND); else MessageBeep(MB_OK); last_beep = GetTickCount(); } Revision-number: 517 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 Robert de Bath's automatic dialog-box creator K 10 svn:author V 5 simon K 8 svn:date V 27 2000-07-26T12:16:11.000000Z PROPS-END Node-path: putty/mkres.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 7068 Text-content-md5: a372af80d89a294fa24c970547bc4140 Text-content-sha1: ea38ffd4e2ffc32758c4e6d3d3a3e6822ba2ef9c Content-length: 7184 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN/* * * Commands ... * * INIT(...) : Set configs. (rowstep, totwidth, stdheight, stdwidth) * SPOS(V,H) : Set current position. * * SCOL : Standard column, for a single column, increment position * NEXT(V,H) : increment postion by standard + (V,H) * COL(K,N) : X,Y position for col K of N (default 1of [same as last]) * SS : Standard size of last COL (using number of cols). * ADJ(V,H) : Adjust next COL or SCOL by (V,H) * * CURX(H) : Current Xpos+H * CURY(V) : Current Ypos+V * */ #include FILE * ifd; FILE * ofd; char wordbuf[256]; #define T_INIT 100 /* Init the style of the values */ #define T_SPOS 101 /* Set the current position */ #define T_SCOL 102 /* Standard column COL(1,1), SS NEXT */ #define T_NEXT 103 /* Next line */ #define T_COL 104 /* Multi-column */ #define T_SS 105 /* Standard Size */ #define T_ADJ 106 /* Adjust next COL/SCOL */ #define T_GRID 107 /* */ #define T_GAP 108 /* */ #define T_CURX 120 /* Current X + offset */ #define T_CURY 121 /* Current Y + offset */ #define T_SAVEPOSN 122 /* Save current status */ #define T_RESTOREPOSN 123 /* Restore current status */ struct keys { char * name; int token; } keywords[] = { {"INIT", T_INIT, }, {"SPOS", T_SPOS, }, {"SCOL", T_SCOL, }, {"NEXT", T_NEXT, }, {"COL", T_COL, }, {"SS", T_SS, }, {"ADJ", T_ADJ, }, {"GRID", T_GRID, }, {"GAP", T_GAP, }, {"CURX", T_CURX, }, {"CURY", T_CURY, }, {"SAVEPOSN", T_SAVEPOSN, }, {"RESTOREPOSN", T_RESTOREPOSN, }, {0,0} }; struct statbuf { int token; int curx; int cury; int cols; int con_width; int con_height; int row_step; int tot_width; int gutter; int vadjust; int hadjust; } status, saved_status; int ar_count, ar_val[10]; main(argc, argv) int argc; char ** argv; { int ch; ifd = stdin; ofd = stdout; while(!feof(ifd)) { if (ferror(ifd)) { fprintf(stderr, "Error reading input file\n"); exit(1); } if (readword() < 0) break; if (check_keys() < 0) { fprintf(ofd, "%s", wordbuf); continue; } /* To get here we have found one of our keywords, some words will * be followed by an argument. */ ar_count = 0; while((ch = getc(ifd)) != EOF && isspace(ch) && ch != '\n') putc(ch, ofd); if (ch == '(' ) { for(;;) { ar_val[ar_count++] = get_number(); while((ch=getc(ifd)) != EOF && isspace(ch)) ; if (ch != ',') break; } if (ch == EOF) break; } else ungetc(ch, ifd); /* Ok got args, now doit */ execute_command(); } exit(0); } /* This is the lexer - not using lex(1) because this will have to * compile under windows. */ int readword() { int ch; char *wp; try_again:; /* This is for "too big" words and strings. */ wp=wordbuf; /* Find a word ... */ while((ch=getc(ifd)) != EOF && !isalpha(ch) && ch != '"') putc(ch, ofd); if (ch == '"') { putc(ch, ofd); while((ch=getc(ifd)) != EOF && ch != '"') putc(ch, ofd); if (ch != EOF) putc(ch, ofd); goto try_again; } if (ch == EOF) return -1; do { if (wp>=wordbuf+sizeof(wordbuf)-2) { *wp = 0; fprintf(ofd, "%s", wordbuf); while(ch!=EOF && isalpha(ch)) { putc(ch, ofd); ch=getc(ifd); } ungetc(ch, ifd); goto try_again; } *wp++ = ch; ch = getc(ifd); } while(ch != EOF && (isalnum(ch) || ch == '_')); *wp = 0; ungetc(ch, ifd); return wp-wordbuf; } int get_number() { int ch; int sign = 0; int value = 0; while((ch=getc(ifd)) != EOF && isspace(ch)) ; if( ch == '+' ) { sign=1; ch=getc(ifd); } else if( ch == '-' ) { sign=-1; ch=getc(ifd); } while(ch>='0' && ch<='9') { value = value * 10 + ch - '0'; ch = getc(ifd); } ungetc(ch, ifd); if (sign < 0) value = -value; return value; } check_keys() { struct keys *p; for(p=keywords; p->name; p++) { if (strcmp(wordbuf, p->name) == 0 ) { status.token = p->token; return p->token; } } return -1; } execute_command() { if (status.cols < 1) status.cols = 1; switch(status.token) { case T_INIT: if (ar_count > 0) status.row_step = ar_val[0]; if (ar_count > 1) status.tot_width = ar_val[1]; if (ar_count > 2) status.con_height = ar_val[2]; else status.con_height = status.row_step; if (ar_count > 3) status.con_width = ar_val[3]; else status.con_width = status.tot_width; status.gutter = ( status.tot_width - status.con_width ) /2; break; case T_SPOS: status.cury = status.curx = 0; if (ar_count > 0) status.cury = ar_val[0]; if (ar_count > 1) status.curx = ar_val[1]; break; case T_SCOL: fprintf(ofd, "%d, %d", status.curx + status.hadjust, status.cury + status.vadjust); status.hadjust = status.vadjust = 0; fprintf(ofd, ", %d, %d", status.con_width, status.con_height); status.cury += status.row_step; if (ar_count > 0) status.cury += ar_val[0]; if (ar_count > 1) status.curx += ar_val[1]; break; case T_NEXT: status.cury += status.row_step; if (ar_count > 0) status.cury += ar_val[0]; if (ar_count > 1) status.curx += ar_val[1]; break; case T_COL: { int curcol; int col_pos; if (ar_count > 0) curcol = ar_val[0]; else curcol = 1; if (ar_count > 1) status.cols = ar_val[1]; col_pos = (status.con_width+status.gutter) *(curcol-1) /status.cols; fprintf(ofd, "%d, %d", status.curx + status.hadjust + col_pos, status.cury + status.vadjust); status.hadjust = status.vadjust = 0; } break; case T_SS: { int wm = 1, hm=1; int width; if (ar_count > 0) wm = ar_val[0]; if (ar_count > 1) hm = ar_val[1]; width = (status.con_width+status.gutter) / status.cols; width *= wm; width -= status.gutter; fprintf(ofd, "%d, %d", width, hm*status.con_height); } break; case T_ADJ: if (ar_count > 0) status.vadjust = ar_val[0]; if (ar_count > 1) status.hadjust = ar_val[0]; break; case T_GRID: if (ar_count > 0) status.cols = ar_val[0]; else status.cols = 1; if (ar_count > 1) status.con_height = ar_val[1]; if (ar_count > 2) status.row_step = ar_val[2]; break; case T_GAP: if (ar_count > 0) status.cury += ar_val[0]; else status.cury += 2; break; case T_CURX: if (ar_count>0) fprintf(ofd, "%d", status.curx+ar_val[0]); else fprintf(ofd, "%d", status.curx); break; case T_CURY: if (ar_count>0) fprintf(ofd, "%d", status.cury+ar_val[0]); else fprintf(ofd, "%d", status.cury); break; case T_SAVEPOSN: saved_status = status; break; case T_RESTOREPOSN: status = saved_status; break; } } Revision-number: 518 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 telnet:// URLs don't always have the //. (Incorrect but common.) K 10 svn:author V 5 simon K 8 svn:date V 27 2000-08-05T08:58:07.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3cd6fbe67b0c8267d9b6655a64100f04 Text-delta-base-sha1: b1ac2e0118c2372dc5420b4d7eeeaa0d7b635389 Text-content-length: 134 Text-content-md5: aab5957ac4190c6f3e39979a6593e06b Text-content-sha1: 12aae6f12b517eda4a19b59e22b065a1a0c9baac Content-length: 174 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNjhhzp", 7)) { char c; q += 7; if (q[0] == '/' && q[1] == '/') q += 2 Revision-number: 519 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.050200Z PROPS-END Revision-number: 520 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.057733Z PROPS-END Revision-number: 521 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.066883Z PROPS-END Revision-number: 522 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.075481Z PROPS-END Revision-number: 523 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.104504Z PROPS-END Revision-number: 524 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.112243Z PROPS-END Revision-number: 525 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.120018Z PROPS-END Revision-number: 526 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.128923Z PROPS-END Revision-number: 527 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.137271Z PROPS-END Revision-number: 528 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.145702Z PROPS-END Revision-number: 529 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.154244Z PROPS-END Revision-number: 530 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.182167Z PROPS-END Revision-number: 531 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.190010Z PROPS-END Revision-number: 532 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.198239Z PROPS-END Revision-number: 533 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.208055Z PROPS-END Revision-number: 534 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.216836Z PROPS-END Revision-number: 535 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.226228Z PROPS-END Revision-number: 536 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.233471Z PROPS-END Revision-number: 537 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.240899Z PROPS-END Revision-number: 538 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.249434Z PROPS-END Revision-number: 539 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.258082Z PROPS-END Revision-number: 540 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.266467Z PROPS-END Revision-number: 541 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.275718Z PROPS-END Revision-number: 542 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.282059Z PROPS-END Revision-number: 543 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.289617Z PROPS-END Revision-number: 544 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.296744Z PROPS-END Revision-number: 545 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.303155Z PROPS-END Revision-number: 546 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.309069Z PROPS-END Revision-number: 547 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.316554Z PROPS-END Revision-number: 548 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.341387Z PROPS-END Revision-number: 549 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.349520Z PROPS-END Revision-number: 550 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.358521Z PROPS-END Revision-number: 551 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.366765Z PROPS-END Revision-number: 552 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.374437Z PROPS-END Revision-number: 553 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.381822Z PROPS-END Revision-number: 554 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.415745Z PROPS-END Revision-number: 555 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.423562Z PROPS-END Revision-number: 556 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.431562Z PROPS-END Revision-number: 557 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.439901Z PROPS-END Revision-number: 558 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.447361Z PROPS-END Revision-number: 559 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.455648Z PROPS-END Revision-number: 560 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.485794Z PROPS-END Revision-number: 561 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.493520Z PROPS-END Revision-number: 562 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.501845Z PROPS-END Revision-number: 563 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.509725Z PROPS-END Revision-number: 564 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.517467Z PROPS-END Revision-number: 565 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.524639Z PROPS-END Revision-number: 566 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.532284Z PROPS-END Revision-number: 567 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.562423Z PROPS-END Revision-number: 568 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:07.570282Z PROPS-END Revision-number: 569 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2000-09-05T14:28:17.000000Z K 7 svn:log V 136 SSH 2 support, phase 1, debugging. Currently does Diffie-Hellman and gets the same results as the server, which is a pretty good start. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 023ae877c1f204f9bb0b31d8906db67b Text-delta-base-sha1: 304bd53655b73d00ef466942a6d0585ac377c5c9 Text-content-length: 179 Text-content-md5: 50ca411a403c193264330d1c33aace3a Text-content-sha1: d85307e5fdab4c012f0b2b176f1a816f371c52cd Content-length: 219 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN@#_X#lblksize; else cipherblk = 8; if (cipherblk < 8) cipherblk = 8; if (pktin.maxlen < cipherblk) { pktin.maxlen = cipherblk; pktin.data = (pktin.data == NULL ? malloc(cipherblk+APIEXTRA) : realloc(pktin.data, cipherblk+APIEXTRA)); if (!pktin.data) fatalbox("Out of memory"); } /* * Acquire and decrypt the first block of the packet. This will * contain the length and padding details. */ for (i = len = 0; i < cipherblk; i++) { while ((*datalen) == 0) crReturn(cipherblk-i); pktin.data[i] = *(*data)++; (*datalen)--; } #ifdef FWHACK if (!memcmp(pktin.data, "Remo", 4)) {/* "Remo"te server has closed ... */ /* FIXME */ } #endif if (sccipher) sccipher->decrypt(pktin.data, cipherblk); /* * Now get the length and padding figures. */ len = GET_32BIT(pktin.data); pad = pktin.data[4]; /* * This enables us to deduce the payload length. */ payload = len - pad - 1; pktin.length = payload + 5; /* * So now we can work out the total packet length. */ packetlen = len + 4; maclen = scmac ? scmac->len : 0; /* * Adjust memory allocation if packet is too big. */ if (pktin.maxlen < packetlen) { pktin.maxlen = packetlen; pktin.data = (pktin.data == NULL ? malloc(packetlen+APIEXTRA) : realloc(pktin.data, packetlen+APIEXTRA)); if (!pktin.data) fatalbox("Out of memory"); } /* * Read and decrypt the remainder of the packet. */ for (i = cipherblk; i < packetlen + maclen; i++) { while ((*datalen) == 0) crReturn(packetlen + maclen - i); pktin.data[i] = *(*data)++; (*datalen)--; } /* Decrypt everything _except_ the MAC. */ if (sccipher) sccipher->decrypt(pktin.data + cipherblk, packetlen - cipherblk); /* * Check the MAC. */ if (scmac && !scmac->verify(pktin.data, incoming_sequence++, len+4)) fatalbox("Incorrect MAC received on packet"); pktin.savedpos = 6; pktin.type = pktin.data[5]; #if 0 debug(("Got packet len=%d pad=%d\r\n", len, pad)); for (i = 0; i < payload; i++) debug((" %02x", (unsigned char)pktin.data[i])); debug(("\r\n")); #endif /* * FIXME: handle IGNORE and DEBUG messages. */ /* * Utility routine for putting an SSH-protocol `string' into a SHA * state. */ #include void sha_string(SHA_State *s, void *str, int len) { unsigned char lenblk[4]; static FILE *fp; PUT_32BIT(lenblk, len); if (!fp) fp = fopen("h:\\statham\\windows\\putty\\data","wb"); fwrite(lenblk, 4, 1, fp); SHA_Bytes(s, lenblk, 4); fwrite(str, len, 1, fp); fflush(fp); SHA_Bytes(s, str, len)if (ssh_versioncmp(version, "1.99") >= 0) { /* * This is a v2 server. Begin v2 protocol. */ char *verstring = "SSH-2.0-PuTTY"; SHA_Init(&exhash); /* * Hash our version string and their version string. */ sha_string(&exhash, verstring, strlen(verstring)); sha_string(&exhash, vstring, strcspn(vstring, "\r\n")); sprintf(vstring, "%s\n", verstring); sprintf(vlog, "We claim version: %s", verstring); logevent(vlog); logevent("Using SSH protocol version 2"); s_write(vstring, strlen(vstring)); ssh_protocol = ssh2_protocol; s_rdpkt = ssh2_rdpkt; } else { /* * This is a v1 server. Begin v1 protocol. */ sprintf(vstring, "SSH-%s-PuTTY\n", sprintf(vlog, "We claim version: %s", vstring); vlog[strcspn(vlog, "\r\n")] = '\0'; logevent(vlog); logevent("Using SSH protocol version 1"); s_write(vstring, strlen(vstring)); ssh_protocol = ssh1_protocol; s_rdpkt = ssh1_rdpkt; } return 1; } /* * Handle the key exchange and user authentication phases. */ static int do_ssh1crBegin; if (!ispkt) crWaitUntil(ispkt); if (pktin.type != SSH1111111_SMSG_FAILURE && cfg.try_tis_auth && (supported_auths_mask & (1<> 8) & 0xFF; p[i*2+2] = (b[n-i] ) & 0xFF; } i = 0; while (p[i] == 0 && (p[i+1] & 0x80) == 0) i++; memmove(p, p+i, n*2+1-i); *len = n*2+1-i; return p; } void ssh2_pkt_addmp(Bignum b) { unsigned char *p; int len; p = ssh2_mpint_fmt(b, &len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(p, len); free(p); } void ssh2_pkt_send(void) { int cipherblk, maclen, padding, i; unsigned long outgoing_sequence = 0; /* * Add padding. At least four bytes, and must also bring total * length (minus MAC) up to a multiple of the block size. */ cipherblk = cipher ? cipher->blksize : 8; /* block size */ cipherblk = cipherblk < 8 ? 8 : cipherblk; /* or 8 if blksize < 8 */ padding = 4; padding += (cipherblk - (pktout.length + padding) % cipherblk) % cipherblk; pktout.data[4] = padding; for (i = 0; i < padding; i++) pktout.data[pktout.length + i] = random_byte(); PUT_32BIT(pktout.data, pktout.length + padding - 4); if (csmac) csmac->generate(pktout.data, outgoing_sequence++, pktout.length + padding); if (cscipher) cscipher->encrypt(pktout.data, pktout.length + padding); maclen = csmac ? csmac->len : 0; #if 0 debug(("Sending packet len=%d\r\n", pktout.length+padding+maclen)); for (i = 0; i < pktout.length+padding+maclen; i++) debug((" %02x", (unsigned char)pktout.data[i])); debug(("\r\n")); #endif s_write(pktout.data, pktout.length + padding + maclen); } void sha_mpint(SHA_State *s, Bignum b) { unsigned char *p; int len; p = ssh2_mpint_fmt(b, &len); sha_string(s, p, len); free(p); } /* * SSH2 packet decode functions. */ void ssh2_pkt_getstring(char **p, int *length) { *p = NULL; if (pktin.length - pktin.savedpos < 4) return; *length = GET_32BIT(pktin.data+pktin.savedpos); pktin.savedpos += 4; if (pktin.length - pktin.savedpos < *length) return; *p = pktin.data+pktin.savedpos; pktin.savedpos += *length; } Bignum ssh2_pkt_getmp(void) { char *p; int i, j, length; Bignum b; ssh2_pkt_getstring(&p, &length); if (!p) return NULL; if (p[0] & 0x80) fatalbox("internal error: Can't handle negative mpints"); b = newbn((length+1)/2); for (i = 0; i < length; i++) { j = length - 1 - i; if (j & 1) b[j/2+1] |= ((unsigned char)p[i]) << 8; else b[j/2+1] |= ((unsigned char)p[i]); } return b; } void bndebug(char *string, Bignum b) { unsigned char *p; int i, len; p = ssh2_mpint_fmt(b, &len); debug(("%s", string)); for (i = 0; i < len; i++) debug((" %02x", p[i])); debug(("\r\n")); free(p); } /* * Utility routine for decoding comma-separated strings in KEXINIT. */ int in_commasep_string(char *needle, char *haystack, int haylen) { int needlen = strlen(needle); while (1) { /* * Is it at the start of the string? */ if (haylen >= needlen && /* haystack is long enough */ !memcmp(needle, haystack, needlen) && /* initial match */ (haylen == needlen || haystack[needlen] == ',') /* either , or EOS follows */ ) return 1; /* * If not, search for the next comma and resume after that. * If no comma found, terminate. */ while (haylen > 0 && *haystack != ',') haylen--, haystack++; if (haylen == 0) return 0; haylen--, haystack++; /* skip over comma itself */ } } /* * Handle the SSH2 key exchange phase. */ static int do_ssh2_kex(unsigned char *in, int inlen, int ispkt) { static int i, len; static char *str; static Bignum e, f, K; static struct ssh_cipher *cscipher_tobe = NULL; static struct ssh_cipher *sccipher_tobe = NULL; static struct ssh_mac *csmac_tobe = NULL; static struct ssh_mac *scmac_tobe = NULL; static struct ssh_compress *cscomp_tobe = NULL; static struct ssh_compress *sccomp_tobe = NULL; static char *hostkeydata, *sigdata; static int hostkeylen, siglen; static unsigned char exchange_hash[20]; crBegin; /* * Construct and send our key exchange packet. */ ssh2_pkt_init(SSH2_MSG_KEXINIT); for (i = 0; i < 16; i++) ssh2_pkt_addbyte((unsigned char)random_byte()); /* List key exchange algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < lenof(kex_algs); i++) { ssh2_pkt_addstring_str(kex_algs[i]->name); if (i < lenof(kex_algs)-1) ssh2_pkt_addstring_str(","); } /* List server host key algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < lenof(hostkey_algs); i++) { ssh2_pkt_addstring_str(hostkey_algs[i]->name); if (i < lenof(hostkey_algs)-1) ssh2_pkt_addstring_str(","); } /* List client->server encryption algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < lenof(ciphers); i++) { ssh2_pkt_addstring_str(ciphers[i]->name); if (i < lenof(ciphers)-1) ssh2_pkt_addstring_str(","); } /* List server->client encryption algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < lenof(ciphers); i++) { ssh2_pkt_addstring_str(ciphers[i]->name); if (i < lenof(ciphers)-1) ssh2_pkt_addstring_str(","); } /* List client->server MAC algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < lenof(macs); i++) { ssh2_pkt_addstring_str(macs[i]->name); if (i < lenof(macs)-1) ssh2_pkt_addstring_str(","); } /* List server->client MAC algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < lenof(macs); i++) { ssh2_pkt_addstring_str(macs[i]->name); if (i < lenof(macs)-1) ssh2_pkt_addstring_str(","); } /* List client->server compression algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < lenof(compressions); i++) { ssh2_pkt_addstring_str(compressions[i]->name); if (i < lenof(compressions)-1) ssh2_pkt_addstring_str(","); } /* List server->client compression algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < lenof(compressions); i++) { ssh2_pkt_addstring_str(compressions[i]->name); if (i < lenof(compressions)-1) ssh2_pkt_addstring_str(","); } /* List client->server languages. Empty list. */ ssh2_pkt_addstring_start(); /* List server->client languages. Empty list. */ ssh2_pkt_addstring_start(); /* First KEX packet does _not_ follow, because we're not that brave. */ ssh2_pkt_addbool(FALSE); /* Reserved. */ ssh2_pkt_adduint32(0); sha_string(&exhash, pktout.data+5, pktout.length-5); ssh2_pkt_send(); if (!ispkt) crWaitUntil(ispkt); sha_string(&exhash, pktin.data+5, pktin.length-5); /* * Now examine the other side's KEXINIT to see what we're up * to. */ if (pktin.type != SSH2_MSG_KEXINIT) fatalbox("expected key exchange packet from server"); kex = NULL; hostkey = NULL; cscipher_tobe = NULL; sccipher_tobe = NULL; csmac_tobe = NULL; scmac_tobe = NULL; cscomp_tobe = NULL; sccomp_tobe = NULL; pktin.savedpos += 16; /* skip garbage cookie */ ssh2_pkt_getstring(&str, &len); /* key exchange algorithms */ for (i = 0; i < lenof(kex_algs); i++) { if (in_commasep_string(kex_algs[i]->name, str, len)) { kex = kex_algs[i]; break; } } ssh2_pkt_getstring(&str, &len); /* host key algorithms */ for (i = 0; i < lenof(hostkey_algs); i++) { if (in_commasep_string(hostkey_algs[i]->name, str, len)) { hostkey = hostkey_algs[i]; break; } } ssh2_pkt_getstring(&str, &len); /* client->server cipher */ for (i = 0; i < lenof(ciphers); i++) { if (in_commasep_string(ciphers[i]->name, str, len)) { cscipher_tobe = ciphers[i]; break; } } ssh2_pkt_getstring(&str, &len); /* server->client cipher */ for (i = 0; i < lenof(ciphers); i++) { if (in_commasep_string(ciphers[i]->name, str, len)) { sccipher_tobe = ciphers[i]; break; } } ssh2_pkt_getstring(&str, &len); /* client->server mac */ for (i = 0; i < lenof(macs); i++) { if (in_commasep_string(macs[i]->name, str, len)) { csmac_tobe = macs[i]; break; } } ssh2_pkt_getstring(&str, &len); /* server->client mac */ for (i = 0; i < lenof(macs); i++) { if (in_commasep_string(macs[i]->name, str, len)) { scmac_tobe = macs[i]; break; } } ssh2_pkt_getstring(&str, &len); /* client->server compression */ for (i = 0; i < lenof(compressions); i++) { if (in_commasep_string(compressions[i]->name, str, len)) { cscomp_tobe = compressions[i]; break; } } ssh2_pkt_getstring(&str, &len); /* server->client compression */ for (i = 0; i < lenof(compressions); i++) { if (in_commasep_string(compressions[i]->name, str, len)) { sccomp_tobe = compressions[i]; break; } } debug(("key exchange is %s\r\n", kex ? kex->name : NULL)); debug(("host key alg is %s\r\n", hostkey ? hostkey->name : NULL)); debug(("cscipher alg is %s\r\n", cscipher_tobe ? cscipher_tobe->name : NULL)); debug(("sccipher alg is %s\r\n", sccipher_tobe ? sccipher_tobe->name : NULL)); debug(("csmac alg is %s\r\n", csmac_tobe ? csmac_tobe->name : NULL)); debug(("scmac alg is %s\r\n", scmac_tobe ? scmac_tobe->name : NULL)); debug(("cscomp alg is %s\r\n", cscomp_tobe ? cscomp_tobe->name : NULL)); debug(("sccomp alg is %s\r\n", sccomp_tobe ? sccomp_tobe->name : NULL)); /* * Currently we only support Diffie-Hellman and DSS, so let's * bomb out if those aren't selected. */ if (kex != &ssh_diffiehellman || hostkey != &ssh_dss) fatalbox("internal fault: chaos in SSH 2 transport layer"); /* * Now we begin the fun. Generate and send e for Diffie-Hellman. */ e = dh_create_e(); bndebug("e=", e); ssh2_pkt_init(SSH2_MSG_KEXDH_INIT); ssh2_pkt_addmp(e); ssh2_pkt_send(); crWaitUntil(ispkt); if (pktin.type != SSH2_MSG_KEXDH_REPLY) fatalbox("expected key exchange packet from server"); ssh2_pkt_getstring(&hostkeydata, &hostkeylen); f = ssh2_pkt_getmp(); bndebug("f=", f); ssh2_pkt_getstring(&sigdata, &siglen); K = dh_find_K(f); bndebug("K=", K); sha_string(&exhash, hostkeydata, hostkeylen); sha_mpint(&exhash, e); sha_mpint(&exhash, f); sha_mpint(&exhash, K); SHA_Final(&exhash, exchange_hash); debug(("Exchange hash is:\r\n")); for (i = 0; i < 20; i++) debug((" %02x", exchange_hash[i])); debug(("\r\n")); /* * FIXME: verify hostkeydata and sigdata. */ crWaitUntil(0); crFinish(1); } static void ssh22_kex(in, inlen, ispkt)) { crReturnV;1111_MSG_DISCONNECT) { logevent("Received disconnect request"); } else if (pktin.type == SSH1_SMSG_SUCCESS || pktin.type == SSH1_SMSG_FAILURE) { /* ignore */ } else if (pktin.type == SSH111111 Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2bf4cc7847cedad3604faa7b4ca42a8d Text-delta-base-sha1: 0e33744f4c324eace4fa0f5ca21870ca2dade4dd Text-content-length: 1214 Text-content-md5: 291fded180d223a2c23b2f8bc5a48ab3 Text-content-sha1: d51c4d606bf12dca0c5c4a3180d566ea11620918 Content-length: 1254 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN%tqEHu&E3ia#include /* * Useful thing. */ #ifndef lenof #define lenof(x) ( (sizeof((x))) / (sizeof(*(x)))) #endif#ifdef MSCRYPTOAPI #define APIEXTRA 8 #else #define APIEXTRA 0 #endiftypedef struct { uint32 h[5]; unsigned char block[64]; int blkused; uint32 lenhi, lenlo; } SHA_State; void SHA_Init(SHA_State *s); void SHA_Bytes(SHA_State *s, void *p, int len); void SHA_Final(SHA_State *s, unsigned char *outpu char *name; int blksize; }; struct ssh_mac { void (*sesskey)(unsigned char *key, int len); void (*generate)(unsigned char *blk, int len, unsigned long seq); int (*verify)(unsigned char *blk, int len, unsigned long seq); char *name; int len; }; struct ssh_kex { char *name; }; struct ssh_hostkey { char *name; }; struct ssh_compress { char *name /* * A Bignum is stored as a sequence of `unsigned short' words. The * first tells how many remain; the remaining ones are digits, LS * first. */ typedef unsigned short *Bignum; Bignum newbn(int length); void freebn(Bignum b); void modpow(Bignum base, Bignum exp, Bignum mod, Bignum result); Bignum dh_create_e(void); Bignum dh_find_K(Bignum f); Node-path: putty/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dc8b7147c65bbc568c793514e4289514 Text-delta-base-sha1: a1a0bef3ec971f8ad431d54520a446222c49319b Text-content-length: 50 Text-content-md5: e62d72a8e506731af86effe1ae0d5eac Text-content-sha1: 1e41491d1542caed86723c1e00472de7e8a123fa Content-length: 89 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNToP, "blowfish-cbc", 8 }; Node-path: putty/sshbn.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5702 Text-content-md5: b677953c6f2cc22c152fc6f9ecd48812 Text-content-sha1: de6e2878d79ecf6166972f0f2bcb0e692093ade9 Content-length: 5818 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN888/* * Bignum routines for RSA and DH and stuff. */ #include #include #include #include "ssh.h" static unsigned short Zero[1] = { 0 }; #if defined TESTMODE || defined RSADEBUG #ifndef DLVL #define DLVL 10000 #endif #define debug(x) bndebug(#x,x) static int level = 0; static void bndebug(char *name, Bignum b) { int i; int w = 50-level-strlen(name)-5*b[0]; if (level >= DLVL) return; if (w < 0) w = 0; dprintf("%*s%s%*s", level, "", name, w, ""); for (i=b[0]; i>0; i--) dprintf(" %04x", b[i]); dprintf("\n"); } #define dmsg(x) do {if(level= 0; j--) c[j+len] = 0; for (i = len - 1; i >= 0; i--) { ai = a[i]; t = 0; for (j = len - 1; j >= 0; j--) { t += ai * (unsigned long) b[j]; t += (unsigned long) c[i+j+1]; c[i+j+1] = (unsigned short)t; t = t >> 16; } c[i] = (unsigned short)t; } } /* * Compute a = a % m. * Input in first 2*len words of a and first len words of m. * Output in first 2*len words of a (of which first len words will be zero). * The MSW of m MUST have its high bit set. */ static void bigmod(unsigned short *a, unsigned short *m, int len) { unsigned short m0, m1; unsigned int h; int i, k; /* Special case for len == 1 */ if (len == 1) { a[1] = (((long) a[0] << 16) + a[1]) % m[0]; a[0] = 0; return; } m0 = m[0]; m1 = m[1]; for (i = 0; i <= len; i++) { unsigned long t; unsigned int q, r, c; if (i == 0) { h = 0; } else { h = a[i-1]; a[i-1] = 0; } /* Find q = h:a[i] / m0 */ t = ((unsigned long) h << 16) + a[i]; q = t / m0; r = t % m0; /* Refine our estimate of q by looking at h:a[i]:a[i+1] / m0:m1 */ t = (long) m1 * (long) q; if (t > ((unsigned long) r << 16) + a[i+1]) { q--; t -= m1; r = (r + m0) & 0xffff; /* overflow? */ if (r >= (unsigned long)m0 && t > ((unsigned long) r << 16) + a[i+1]) q--; } /* Substract q * m from a[i...] */ c = 0; for (k = len - 1; k >= 0; k--) { t = (long) q * (long) m[k]; t += c; c = t >> 16; if ((unsigned short) t > a[i+k]) c++; a[i+k] -= (unsigned short) t; } /* Add back m in case of borrow */ if (c != h) { t = 0; for (k = len - 1; k >= 0; k--) { t += m[k]; t += a[i+k]; a[i+k] = (unsigned short)t; t = t >> 16; } } } } /* * Compute (base ^ exp) % mod. * The base MUST be smaller than the modulus. * The most significant word of mod MUST be non-zero. * We assume that the result array is the same size as the mod array. */ void modpow(Bignum base, Bignum exp, Bignum mod, Bignum result) { unsigned short *a, *b, *n, *m; int mshift; int mlen, i, j; /* Allocate m of size mlen, copy mod to m */ /* We use big endian internally */ mlen = mod[0]; m = malloc(mlen * sizeof(unsigned short)); for (j = 0; j < mlen; j++) m[j] = mod[mod[0] - j]; /* Shift m left to make msb bit set */ for (mshift = 0; mshift < 15; mshift++) if ((m[0] << mshift) & 0x8000) break; if (mshift) { for (i = 0; i < mlen - 1; i++) m[i] = (m[i] << mshift) | (m[i+1] >> (16-mshift)); m[mlen-1] = m[mlen-1] << mshift; } /* Allocate n of size mlen, copy base to n */ n = malloc(mlen * sizeof(unsigned short)); i = mlen - base[0]; for (j = 0; j < i; j++) n[j] = 0; for (j = 0; j < base[0]; j++) n[i+j] = base[base[0] - j]; /* Allocate a and b of size 2*mlen. Set a = 1 */ a = malloc(2 * mlen * sizeof(unsigned short)); b = malloc(2 * mlen * sizeof(unsigned short)); for (i = 0; i < 2*mlen; i++) a[i] = 0; a[2*mlen-1] = 1; /* Skip leading zero bits of exp. */ i = 0; j = 15; while (i < exp[0] && (exp[exp[0] - i] & (1 << j)) == 0) { j--; if (j < 0) { i++; j = 15; } } /* Main computation */ while (i < exp[0]) { while (j >= 0) { bigmul(a + mlen, a + mlen, b, mlen); bigmod(b, m, mlen); if ((exp[exp[0] - i] & (1 << j)) != 0) { bigmul(b + mlen, n, a, mlen); bigmod(a, m, mlen); } else { unsigned short *t; t = a; a = b; b = t; } j--; } i++; j = 15; } /* Fixup result in case the modulus was shifted */ if (mshift) { for (i = mlen - 1; i < 2*mlen - 1; i++) a[i] = (a[i] << mshift) | (a[i+1] >> (16-mshift)); a[2*mlen-1] = a[2*mlen-1] << mshift; bigmod(a, m, mlen); for (i = 2*mlen - 1; i >= mlen; i--) a[i] = (a[i] >> mshift) | (a[i-1] << (16-mshift)); } /* Copy result to buffer */ for (i = 0; i < mlen; i++) result[result[0] - i] = a[i+mlen]; /* Free temporary arrays */ for (i = 0; i < 2*mlen; i++) a[i] = 0; free(a); for (i = 0; i < 2*mlen; i++) b[i] = 0; free(b); for (i = 0; i < mlen; i++) m[i] = 0; free(m); for (i = 0; i < mlen; i++) n[i] = 0; free(n); } Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 19a36719af89d601af74c8600d045dd6 Text-delta-base-sha1: e56ad658d270d4bff828f0ff7771ab6cf3b1259a Text-content-length: 132 Text-content-md5: 275cbe6c906897e41b26e843254d7eb0 Text-content-sha1: 45986d37e798b644e6d8e56a7e5d26de08709a6f Content-length: 171 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN/i6u6R, "3des-cbc", 8, "des-cbc", /* should never be used - not a valid cipher in ssh2 */ 8 }; Node-path: putty/sshdh.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3149 Text-content-md5: be3c0898554db1461de4ae85cb98cca5 Text-content-sha1: 22ef7d201c0327ba7bfdfcaf555f822e62802a9b Content-length: 3265 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN???#include "ssh.h" struct ssh_kex ssh_diffiehellman = { "diffie-hellman-group1-sha1" }; /* * The prime p used in the key exchange. */ static unsigned short P[] = { 64, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x5381, 0xECE6, 0x6651, 0x4928, 0x1FE6, 0x7C4B, 0x2411, 0xAE9F, 0x9FA5, 0x5A89, 0x6BFB, 0xEE38, 0xB7ED, 0xF406, 0x5CB6, 0x0BFF, 0xED6B, 0xA637, 0x42E9, 0xF44C, 0x7EC6, 0x625E, 0xB576, 0xE485, 0xC245, 0x6D51, 0x356D, 0x4FE1, 0x1437, 0xF25F, 0x0A6D, 0x302B, 0x431B, 0xCD3A, 0x19B3, 0xEF95, 0x04DD, 0x8E34, 0x0879, 0x514A, 0x9B22, 0x3B13, 0xBEA6, 0x020B, 0xCC74, 0x8A67, 0x4E08, 0x2902, 0x1CD1, 0x80DC, 0x628B, 0xC4C6, 0xC234, 0x2168, 0xDAA2, 0xC90F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, }; /* * The order q of the group: (p-1)/2. */ static unsigned short Q[] = { 64, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x29C0, 0xF673, 0x3328, 0x2494, 0x8FF3, 0xBE25, 0x9208, 0xD74F, 0xCFD2, 0xAD44, 0x35FD, 0xF71C, 0x5BF6, 0x7A03, 0xAE5B, 0x85FF, 0xF6B5, 0xD31B, 0x2174, 0x7A26, 0x3F63, 0x312F, 0xDABB, 0xF242, 0xE122, 0xB6A8, 0x9AB6, 0xA7F0, 0x8A1B, 0xF92F, 0x8536, 0x9815, 0x218D, 0xE69D, 0x8CD9, 0xF7CA, 0x026E, 0xC71A, 0x043C, 0x28A5, 0xCD91, 0x1D89, 0xDF53, 0x0105, 0xE63A, 0x4533, 0x2704, 0x9481, 0x0E68, 0xC06E, 0x3145, 0x6263, 0x611A, 0x10B4, 0xED51, 0xE487, 0xFFFF, 0xFFFF, 0xFFFF, 0x7FFF, }; /* * The bitmask covering q (for ease of generation of x). */ static unsigned short Qmask[] = { 64, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7FFF, }; /* * The generator g = 2. */ static unsigned short G[] = { 1, 2 }; /* * Variables. */ static Bignum x, e; /* * DH stage 1: invent a number x between 1 and q, and compute e = * g^x mod p. Return e. */ Bignum dh_create_e(void) { int i; x = newbn(Q[0]); tryagain: /* * Create a potential x, by ANDing a string of random bytes * with Qmask. */ for (i = 1; i <= x[0]; i++) x[i] = ((random_byte() << 8) + random_byte()) & Qmask[i]; /* * If x <= 1, go round again. */ for (i = 2; i <= x[0]; i++) if (x[i] != 0) break; if (i > x[0] && x[1] <= 1) goto tryagain; /* * If x >= q, go round again. */ for (i = x[0]; i > 0; i--) { if (x[i] > Q[i]) goto tryagain; if (x[i] < Q[i]) break; } /* * Done. Now compute e = g^x mod p. */ e = newbn(P[0]); modpow(G, x, P, e); return e; } /* * DH stage 2: given a number f, compute K = f^x mod p. */ Bignum dh_find_K(Bignum f) { Bignum K = newbn(P[0]); modpow(f, x, P, K); return K; } Node-path: putty/sshdss.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 77 Text-content-md5: b4a0c491a1cf43fb4dbd7d6a3fa7cc75 Text-content-sha1: 7ed2fda415f65eebca95c4d1ac5f1955d0a187ac Content-length: 193 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNBBB#include "ssh.h" struct ssh_hostkey ssh_dss = { "ssh-dss" }; Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3d9ba38ff01ac8ed934e2bb514a77c47 Text-delta-base-sha1: ebf702e7c17aa5a30834d7e560349ed1c0e2bd76 Text-content-length: 42 Text-content-md5: 23681d826a66de1e3498922e7b12bff7 Text-content-sha1: cb626c97fb5ed620b0fc6ecdeba0a853c544c481 Content-length: 81 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNaW!2YD#include "ssh.h" Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 77d1c7ac26672ca3371d525f300a15bc Text-delta-base-sha1: 315375500e6ce02ecd2200e0205782eaf33ed634 Text-content-length: 5145 Text-content-md5: d95d30d0a12b0e5f7c8a80243627af89 Text-content-sha1: 1da341d4f542aead24ee5a788ed691d7011101f8 Content-length: 5184 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN}z px/* * SHA1 hash algorithm. Used in SSH2 as a MAC, and the transform is * also used as a `stirring' function for the PuTTY random number * pool. Implemented directly from the specification by Simon * Tatham. */ #include "ssh.h" typedef unsigned int uint32; /* ---------------------------------------------------------------------- * Core SHA algorithm: processes 16-word blocks into a message digest. */ #define rol(x,y) ( ((x) << (y)) | (((uint32)x) >> (32-y)) ) void SHA_Core_Init(uint32 h[5]) { h[0] = 0x67452301; h[1] = 0xefcdab89; h[2] = 0x98badcfe; h[3] = 0x10325476; h[4] = 0xc3d2e1f0; } /* ---------------------------------------------------------------------- * Outer SHA algorithm: take an arbitrary length byte string, * convert it into 16-word blocks with the prescribed padding at * the end, and pass those blocks to the core SHA algorithm. */ void SHA_Init(SHA_State *s) { SHA_Core_Init(s->h); s->blkused = 0; s->lenhi = s->lenlo = 0; } void SHA_Bytes(SHA_State *s, void *p, int len) { unsigned char *q = (unsigned char *)p; uint32 wordblock[16]; uint32 lenw = len; int i; /* * Update the length field. */ s->lenlo += lenw; s->lenhi += (s->lenlo < lenw); if (s->blkused && s->blkused+len < 64) { /* * Trivial case: just add to the block. */ memcpy(s->block + s->blkused, q, len); s->blkused += len; } else { /* * We must complete and process at least one block. */ while (s->blkused + len >= 64) { memcpy(s->block + s->blkused, q, 64 - s->blkused); q += 64 - s->blkused; len -= 64 - s->blkused; /* Now process the block. Gather bytes big-endian into words */ for (i = 0; i < 16; i++) { wordblock[i] = ( ((uint32)s->block[i*4+0]) << 24 ) | ( ((uint32)s->block[i*4+1]) << 16 ) | ( ((uint32)s->block[i*4+2]) << 8 ) | ( ((uint32)s->block[i*4+3]) << 0 ); } SHATransform(s->h, wordblock); s->blkused = 0; } memcpy(s->block, q, len); s->blkused = len; } } void SHA_Final(SHA_State *s, unsigned char *output) { int i; int pad; unsigned char c[64]; uint32 lenhi, lenlo; if (s->blkused >= 56) pad = 56 + 64 - s->blkused; else pad = 56 - s->blkused; lenhi = (s->lenhi << 3) | (s->lenlo >> (32-3)); lenlo = (s->lenlo << 3); memset(c, 0, pad); c[0] = 0x80; SHA_Bytes(s, &c, pad); c[0] = (lenhi >> 24) & 0xFF; c[1] = (lenhi >> 16) & 0xFF; c[2] = (lenhi >> 8) & 0xFF; c[3] = (lenhi >> 0) & 0xFF; c[4] = (lenlo >> 24) & 0xFF; c[5] = (lenlo >> 16) & 0xFF; c[6] = (lenlo >> 8) & 0xFF; c[7] = (lenlo >> 0) & 0xFF; SHA_Bytes(s, &c, 8); for (i = 0; i < 5; i++) { output[i*4 ] = (s->h[i] >> 24) & 0xFF; output[i*4+1] = (s->h[i] >> 16) & 0xFF; output[i*4+2] = (s->h[i] >> 8) & 0xFF; output[i*4+3] = (s->h[i] ) & 0xFF; } } void SHA_Simple(void *p, int len, unsigned char *output) { SHA_State s; SHA_Init(&s); SHA_Bytes(&s, p, len); SHA_Final(&s, output); } /* ---------------------------------------------------------------------- * The above is the SHA-1 algorithm itself. Now we implement the * HMAC wrapper on it. */ static SHA_State sha1_mac_s1, sha1_mac_s2; static void sha1_sesskey(unsigned char *key, int len) { unsigned char foo[64]; int i; memset(foo, 0x36, 64); for (i = 0; i < len && i < 64; i++) foo[i] ^= key[i]; SHA_Init(&sha1_mac_s1); SHA_Bytes(&sha1_mac_s1, foo, 64); memset(foo, 0x5C, 64); for (i = 0; i < len && i < 64; i++) foo[i] ^= key[i]; SHA_Init(&sha1_mac_s2); SHA_Bytes(&sha1_mac_s2, foo, 64); memset(foo, 0, 64); /* burn the evidence */ } static void sha1_do_hmac(unsigned char *blk, int len, unsigned long seq, unsigned char *hmac) { SHA_State s; unsigned char intermediate[20]; intermediate[0] = (unsigned char)((seq >> 24) & 0xFF); intermediate[1] = (unsigned char)((seq >> 16) & 0xFF); intermediate[2] = (unsigned char)((seq >> 8) & 0xFF); intermediate[3] = (unsigned char)((seq ) & 0xFF); s = sha1_mac_s1; /* structure copy */ SHA_Bytes(&s, intermediate, 4); SHA_Bytes(&s, blk, len); SHA_Final(&s, intermediate); s = sha1_mac_s2; /* structure copy */ SHA_Bytes(&s, intermediate, 20); SHA_Final(&s, hmac); } static void sha1_generate(unsigned char *blk, int len, unsigned long seq) { sha1_do_hmac(blk, len, seq, blk+len); } static int sha1_verify(unsigned char *blk, int len, unsigned long seq) { unsigned char correct[20]; sha1_do_hmac(blk, len, seq, correct); return !memcmp(correct, blk+len, 20); } struct ssh_mac ssh_sha1 = { sha1_sesskey, sha1_generate, sha1_verify, "hmac-sha1", 20 }; Revision-number: 570 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2000-09-05T16:23:36.000000Z K 7 svn:log V 72 Second attempt. Can successfully decrypt the _first block_ of a packet. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9711937c0121a61ad3f92f0141c48ec9 Text-delta-base-sha1: 5fabc46d1390ca72fe7f6cd6fe6c1e712c6fd21d Text-content-length: 2207 Text-content-md5: 3961aa285291715dbc481a02007af7b8 Text-content-sha1: a767cecdef1b5ff774ad760b5d5d316937c27c60 Content-length: 2247 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNRGBOH[kWJa@^IzYZ{$8_hpYykey(unsigned char *keykey, nullmac_debug(("Got initblk:")); for (i = 0; i < cipherblk; i++) debug((" %02x", (unsigned char)pktin.data[i])); debug(("\r\n")); if (sccipher) sccipher->decrypt(pktin.data, cipherblk); debug(("Decrypted initblk:")); for (i = 0; i < cipherblk; i++) debug((" %02x", (unsigned char)pktin.data[i])); debug(("\r\n")cketlen; i++) debug((" %02x", (unsigned char)pktin.data[i])); debug(("\r\n")SSH2 key creation method. */ void ssh2_mkkey(Bignum K, char *H, char chr, char *keyspace) { SHA_State s; /* First 20 bytes. */ SHA_Init(&s); sha_mpint(&s, K); SHA_Bytes(&s, H, 20); SHA_Bytes(&s, &chr, 1); SHA_Bytes(&s, H, 20); SHA_Final(&s, keyspace); /* Next 20 bytes. */ SHA_Init(&s); sha_mpint(&s, K); SHA_Bytes(&s, H, 20); SHA_Bytes(&s, keyspace, 20); SHA_Final(&s, keyspace+20); static unsigned char keyspace[4 key. This bit will be moderately * unpleasant, because of having to rewrite it to work * alongside the old scheme. */ /* * FIXME: verify signature of exchange hash. */ /* * Send SSH2_MSG_NEWKEYS. Expect it from server. */ ssh2_pkt_init(SSH2_MSG_NEWKEYS); ssh2_pkt_send(); crWaitUntil(ispkt); if (pktin.type != SSH2_MSG_NEWKEYS) fatalbox("expected new-keys packet from server"); /* * Create and initialise session keys. */ cscipher = cscipher_tobe; sccipher = sccipher_tobe; csmac = csmac_tobe; scmac = scmac_tobe; cscomp = cscomp_tobe; sccomp = sccomp_tobe; /* * Set IVs after keys. */ ssh2_mkkey(K, exchange_hash, 'C', keyspace); cscipher->setcskey(keyspace); ssh2_mkkey(K, exchange_hash, 'D', keyspace); cscipher->setsckey(keyspace); ssh2_mkkey(K, exchange_hash, 'A', keyspace); cscipher->setcsiv(keyspace); ssh2_mkkey(K, exchange_hash, 'B', keyspace); sccipher->setsciv(keyspace); ssh2_mkkey(K, exchange_hash, 'E', keyspace); csmac->setcskey(keyspace); ssh2_mkkey(K, exchange_hash, 'F', keyspace); scmac->setsckey(keyspace); Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 291fded180d223a2c23b2f8bc5a48ab3 Text-delta-base-sha1: d51c4d606bf12dca0c5c4a3180d566ea11620918 Text-content-length: 355 Text-content-md5: 93cbd9b4a82921c03da332c394908752 Text-content-sha1: 2f4e4b01842fb78c7cd3c78ce11e6e8cbfe63914 Content-length: 395 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN%GD(((D3r /* for ssh 1 */ void (*setcsiv)(unsigned char *key); /* for ssh 2 */ void (*setcskey)(unsigned char *key); /* for ssh 2 */ void (*setsciv)(unsigned char *key); /* for ssh 2 */ void (*setsckey)(unsigned char *key); /* for ssh 2 */tcskey)(unsigned char *key); void (*setsckey)(unsigned char *key Node-path: putty/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e62d72a8e506731af86effe1ae0d5eac Text-delta-base-sha1: 1e41491d1542caed86723c1e00472de7e8a123fa Text-content-length: 643 Text-content-md5: a81469309443cc5eacfaba38b8f2dd31 Text-content-sha1: 33b178f253b2a1539c5810120e257081107ca1ff Content-length: 682 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNoyaH-z1Vcskey(unsigned char *key) { blowfish_setkey(&ectx, key, 16); logevent("Initialised Blowfish client->server encryption"); } static void blowfish_sckey(unsigned char *key) { blowfish_setkey(&dctx, key, 16); logevent("Initialised Blowfish server->client encryption"); } static void blowfish_csiv(unsigned char *key) { ectx.iv0 = GET_32BIT_LSB_FIRST(key); ectx.iv1 = GET_32BIT_LSB_FIRST(key+4); } static void blowfish_sciv(unsigned char *key) { dctx.iv0 = GET_32BIT_LSB_FIRST(key); dctx.iv1 = GET_32BIT_LSB_FIRST(key+4); }csiv, blowfish_cskey, blowfish_sciv, blowfish_sc Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 275cbe6c906897e41b26e843254d7eb0 Text-delta-base-sha1: 45986d37e798b644e6d8e56a7e5d26de08709a6f Text-content-length: 1036 Text-content-md5: 0f213a1c60fc6715ecf80a65cc4242a4 Text-content-sha1: 71afa1dc98ebd03149c82ccfb1d4b08517235f05 Content-length: 1076 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN]O/bvhvi^ufhvi^jgnT[hy{{cskeys[3], sckeys[3]; static void des3_ccscscskeys[2]); logevent("Initialised triple-DES client->server encryption"); } static void des3_csiv(unsigned char *key) { cskeys[0].eiv0 = GET_32BIT_MSB_FIRST(key); cskeys[0].eiv1 = GET_32BIT_MSB_FIRST(key+4); } static void des3_sciv(unsigned char *key) { sckeys[0].div0 = GET_32BIT_MSB_FIRST(key); sckeys[0].div1 = GET_32BIT_MSB_FIRST(key+4); } static void des3_scscscsckeys[2]); logevent("Initialised triple-DES server->client encryption"); } static void des3_sesskey(unsigned char *key) { des3_cskey(key); des3_sckey(key); } static void des3_encrypt_blk(unsigned char *blk, int len) { des_3cbc_encrypt(blk, blk, len, cssckeys); } struct ssh_cipher ssh_3des = { des3_sesskey, des3_csiv, des3_cskey, des3_sciv, des3_sccscscskeys); } struct ssh_cipher ssh_des = { des_sesskey, NULL, NULL, NULL, NULL, /* SSH 2 bits - unused */ Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d95d30d0a12b0e5f7c8a80243627af89 Text-delta-base-sha1: 1da341d4f542aead24ee5a788ed691d7011101f8 Text-content-length: 833 Text-content-md5: 03578f9f6464b060a0ef42a5bf3cff19 Text-content-sha1: cc8d8954c07d89604f1f9d4ad3f2659f83fcd590 Content-length: 872 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNz2'0Vy- 7NFl2D6cs_mac_s1, sha1_cs_mac_s2; static SHA_State sha1_sc_mac_s1, sha1_sc_mac_s2; static void sha1_key(SHA_State *s1, SHA_State *s2, s1); SHA_Bytes(s2); SHA_Bytes(s2, foo, 64); memset(foo, 0, 64); /* burn the evidence */ } static void sha1_cskey(unsigned char *key) { sha1_key(&sha1_cs_mac_s1, &sha1_cs_mac_s2, key, 20); } static void sha1_sckey(unsigned char *key) { sha1_key(&sha1_sc_mac_s1, &sha1_sc_mac_s2, key, 20); } static void sha1_do_hmac(SHA_State *s1, SHA_State *s2, *s1; *s2; &sha1_cs_mac_s1, &sha1_cs_mac_s2, &sha1_sc_mac_s1, &sha1_sc_mac_s2, blk, len, seq, correct); return !memcmp(correct, blk+len, 20); } struct ssh_mac ssh_sha1 = { sha1_cskey, sha1_sc Revision-number: 571 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2000-09-06T09:55:32.000000Z K 7 svn:log V 74 SSH2 transport layer now enables encryption and MAC successfully for 3DES K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3961aa285291715dbc481a02007af7b8 Text-delta-base-sha1: a767cecdef1b5ff774ad760b5d5d316937c27c60 Text-content-length: 543 Text-content-md5: 63fe247d682f2d1896726580fbab0036 Text-content-sha1: 171c26f2e458c01f819c9f13d31dde350098de80 Content-length: 583 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNG?2_9}6j i =64\k3des_ssh2_ssh2len+4, incoming_sequence)) fatalbox("Incorrect MAC received on packet"); incoming_sequence++; /* whether or not we MACed */staticpktout.length + padding, outgoing_sequence); outgoing_sequence++; /* whether or not we MACed *//* * Now we're encrypting. Send a test packet (FIXME). */ crWaitUntil(!ispkt); ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring("oo-er"); ssh2_pkt_send( Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0f213a1c60fc6715ecf80a65cc4242a4 Text-delta-base-sha1: 71afa1dc98ebd03149c82ccfb1d4b08517235f05 Text-content-length: 1228 Text-content-md5: 209dd94714f4d886c3b784bc7f029093 Text-content-sha1: 1286404c02aef671de37cfbf1e427ac074a1b24d Content-length: 1268 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN]hPn$~@s5Kt73$=bc/\xJ^K_Q #include #include /* FIXME */ #include /* FIXME */ #include "putty.h" /* FIXME */ #include "ssh.h" cbc3_enword32 out[2], iv0, iv1; unsigned int i; assert((len & 7) == 0); iv0 = scheds->eiv0; iv1 = scheds&scheds[0]); des_decipher(out, out[0], out[1], &scheds[1]); des_encipher(out, out[0], out[1], &scheds[2]); iv0 = out[0]; iv1 } scheds->eiv0 = iv0; scheds->eiv1 = iv1void des_cbc3s->div0; iv1 = scheds&scheds[2]); des_encipher(out, out[0], out[1], &scheds[1]); des_decipher(out, out[0], out[1], &scheds[0]s->div0 = iv0; scheds->div1 = iv1atic void des3_ssh2_encrypt_blk(unsigned char *blk, int len) { des_cbc3_encrypt(blk, blk, len, cskeys); } static void des3_ssh2_decrypt_blk(unsigned char *blk, int len) { des_cbc3_decrypt(blk, blk, len, sckeys); } struct ssh_cipher ssh_3des_ssh2 = { NULL, des3_csiv, des3_cskey, des3_sciv, des3_sckey, des3_ssh2_encrypt_blk, des3_ssh2_decrypt_blk, "3des-cbc", 8 }; struct ssh_cipher ssh_3des = { des3_sesskey, NULL, NULL, NULL, NULL Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 03578f9f6464b060a0ef42a5bf3cff19 Text-delta-base-sha1: cc8d8954c07d89604f1f9d4ad3f2659f83fcd590 Text-content-length: 1044 Text-content-md5: bb354e257aaac9ce0d6d5a548d05d72a Text-content-sha1: 5d59040f293cfc062391b66c625eca3d060f18c8 Content-length: 1083 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNmka lp3}%j#include /* FIXME */ #include /* FIXME */ #include "putty.h" /* FIXME */ {int j; debug(("Key supplied is:\r\n")); for (j=0; j U@cYS!SG;&`v_n`' wZiFq7?=F :j44S/?md X9Pjh"" P0)%^c'Tu ]m\2zDRSA 6 #define SSH1_SMSG_AUTH_RSA_CHALLENGE 7 #define SSH1_CMSG_AUTH_RSA_RESPONSE 8#define SSH2_MSG_USERAUTH_REQUEST 50 #define SSH2_MSG_USERAUTH_FAILURE 51 #define SSH2_MSG_USERAUTH_SUCCESS 52 #define SSH2_MSG_USERAUTH_BANNER 53 #define SSH2_MSG_USERAUTH_PK_OK 60 #define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60 #define SSH2_MSG_GLOBAL_REQUEST 80 #define SSH2_MSG_REQUEST_SUCCESS 81 #define SSH2_MSG_REQUEST_FAILURE 82 #define SSH2_MSG_CHANNEL_OPEN 90 #define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91 #define SSH2_MSG_CHANNEL_OPEN_FAILURE 92 #define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93 #define SSH2_MSG_CHANNEL_DATA 94 #define SSH2_MSG_CHANNEL_EXTENDED_DATA 95 #define SSH2_MSG_CHANNEL_EOF 96 #define SSH2_MSG_CHANNEL_CLOSE 97 #define SSH2_MSG_CHANNEL_REQUEST 98 #define SSH2_MSG_CHANNEL_SUCCESS 99 #define SSH2_MSG_CHANNEL_FAILURE 100 #define SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED 1 #define SSH2_OPEN_CONNECT_FAILED 2 #define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE 3 #define SSH2_OPEN_RESOURCE_SHORTAGE 4 #define SSH2_EXTENDED_DATA_STDERR , PKT_BIGNUM#define crWaitUntilV(c) do { crReturnVif (sccipher) sccipher->decrypt(pktin.data, cipherblk#if 0#endifif (pktin.type == SSH2_MSG_IGNORE || pktin.type == SSH2_MSG_DEBUG) goto next_packet; /* FIXME: print DEBUG message Bignum bn; int icase PKT_BIGNUM: bn = va_arg(args, Bignum); i = 16 * bn[0] - 1; while ( i > 0 && (bn[i/16+1] >> (i%16)) == 0 ) i--; pktlen += 2 + (i+7)/8 case PKT_BIGNUM: bn = va_arg(args, Bignum); i = 16 * bn[0] - 1; while ( i > 0 && (bn[i/16+1] >> (i%16)) == 0 ) i--; *p++ = (i >> 8) & 0xFF; *p++ = i & 0xFF; i = (i + 7) / 8; while (i-- > 0) { if (i % 2) *p++ = bn[i/2+1] >> 8; else *p++ = bn[i/2+1] & 0xFF; } #if 0 debug(("Sending packet len=%d\r\n", pktout.length+padding)); for (i = 0; i < pktout.length+padding s_write(pktout.data, pktout.length + padding + maclen); } #if 0%02x", p[i])); debug(("\r\n")); free(p); } #endif void sha_mpint(SHA_State *s, unsigned long ssh2_pkt_getuint32(void) { unsigned long value; if (pktin.length - pktin.savedpos < 4) return 0; /* arrgh, no way to decline (FIXME?) */ value = GET_32BIT(pktin.data+pktin.savedpos); pktin.savedpos += 4; return value; }2.0" /* FIXME: "1.99" */ static int tried_publickey; static unsigned char session_id[16], 0); j = makekey(pktin.body+8+i, &hostkey, &keystr2, 0tried_publickey = 0 if (*cfg.keyfile && !tried_publickey) pwpkt_type = SSH1_CMSG_AUTH_RSA if (pktin.type == SSH1_SMSG_FAILURE && cfg.try_tis_auth && pwpkt_type = SSH1_CMSG_AUTH_TIS_RESPONSE; logevent("Requested TIS authentication"); send_packet(SSH1_CMSG_AUTH_TIS, PKT_END); crWaitUntil(ispkt); if (pktin.type != SSH1_SMSG_AUTH_TIS_CHALLENGE) { logevent("TIS authentication declined"); c_write("TIS authentication refused.\r\n", 29); } else { (pktin.body[1] << 16) | (pktin.body[3])); logevent("Received TIS challenge"); c_write(pktin.body+4, challengelen); } } if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) c_write("password: ", 10); if (pwpkt_type == SSH1_CMSG_AUTH_RSA) { c_write("Trying public key authentication.\r\n", 35); if (!rsakey_encrypted(cfg.keyfile)) { c_write("No passphrase required.\r\n", 25); goto tryauth; } c_write("passphrase: ", 12); } pos = 0; while (pos >= 0) { crWaitUntil(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: password[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) pos--; break; case 21: case 27: pos = 0; break; case 3: case 4: random_save_seed(); exit(0); break; default: sizeof(password)) password[pos++] = c; break; } } c_write("\r\n", 2); } tryauth: if (pwpkt_type == SSH1_CMSG_AUTH_RSA) { /* * Try public key authentication with the specified * key file. */ static struct RSAKey pubkey; static Bignum challenge, response; static int i; static unsigned char buffer[32]; tried_publickey = 1; i = loadrsakey(cfg.keyfile, &pubkey, password); if (i == 0) { c_write("Couldn't load public key from ", 30); c_write(cfg.keyfile, strlen(cfg.keyfile)); c_write(".\r\n", 3); continue; /* go and try password */ } if (i == -1) { c_write("Wrong passphrase.\r\n", 19); tried_publickey = 0; continue; /* try again */ } /* * Send a public key attempt. */ send_packet(SSH1_CMSG_AUTH_RSA, PKT_BIGNUM, pubkey.modulus, PKT_END); crWaitUntil(ispkt); if (pktin.type == SSH1_SMSG_FAILURE) { c_write("Server refused our public key.\r\n", 32); continue; /* go and try password */ } if (pktin.type != SSH1_SMSG_AUTH_RSA_CHALLENGE) fatalbox("Bizarre response to offer of public key"); ssh1_read_bignum(pktin.body, &challenge); response = rsadecrypt(challenge, &pubkey); freebn(pubkey.private_exponent); /* burn the evidence */ for (i = 0; i < 32; i += 2) { buffer[i] = response[16-i/2] >> 8; buffer[i+1] = response[16-i/2] & 0xFF; } MD5Init(&md5c); MD5Update(&md5c, buffer, 32); MD5Update(&md5c, session_id, 16); MD5Final(buffer, &md5c); send_packet(SSH1_CMSG_AUTH_RSA_RESPONSE, PKT_DATA, buffer, 16, PKT_END); crWaitUntil(ispkt); if (pktin.type == SSH1_SMSG_FAILURE) { c_write("Failed to authenticate with our public key.\r\n", 45); continue; /* go and try password */ } else if (pktin.type != SSH1_SMSG_SUCCESS) { fatalbox("Bizarre response to RSA authentication response"); } break; /* we're through! */ } else { send_packet(pwpkt_type, PKT_STR, password, PKT_END); }transport layer. */ static int do_ssh2_transport, *keystr random_init(); begin_key_exchange: { fatalbox("expected key exchange packet from server"); } { fatalbox("expected key exchange packet from server"); } ssh2_pkt_getstring(&hostkeydata, &hostkeylen); f = ssh2_pkt_getmp(); ssh2_pkt_getstring(&sigdata, &siglen); K = dh_find_K(f#if 0#endif hostkey->setkey(hostkeydata, hostkeylen); if (!hostkey->verifysig(sigdata, siglen, exchange_hash, 20)) fatalbox("Server failed host key check"); /* * Expect SSH2_MSG_NEWKEYS from server. */Authenticate remote host: verify host key. (We've already * checked the signature of the exchange hash.) */ keystr = hostkey->fmtkey(); verify_ssh_host_key(savedhost, keystr); free(keystr); /* * Send SSH2_MSG_NEWKEYS. */ ssh2_pkt_init(SSH2_MSG_NEWKEYS); ssh2_pkt_send(Begin returning 1 to the protocol main * function so that other things can run on top of the * transport. If we ever see a KEXINIT, we must go back to the * start. */ do { crReturn(1); } while (!(ispkt && pktin.type == SSH2_MSG_KEXINIT)); goto begin_key_exchange; crFinish(1); } /* * Handle the SSH2 userauth and connection layers. */ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) { static unsigned long their_channel; static unsigned long remote_winsize; static unsigned long remote_maxpkt; crBegin; /* * Request userauth protocol, and await a response to it. */ ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST); ssh2_pkt_addstring("ssh-userauth"); ssh2_pkt_send(); crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_SERVICE_ACCEPT) fatalbox("Server refused user authentication protocol"); /* * FIXME: currently we support only password authentication. * (This places us technically in violation of the SSH2 spec. * We must fix this.) */ while (1) { /* * Get a username and a password. */ static char username[100]; static char password[100]; static int pos = 0; static char c; VUsingV; } } else { c_write("password: ", 10); pos = 0; while (pos >= 0) { crWaitUntilV(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: password[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) pos--; break; case 21: case 27: pos = 0; break; case 3: case 4: random_save_seed(); exit(0); break; default: password[pos++] = c; break; } } c_write("\r\n", 2); } ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("password"); ssh2_pkt_addbool(FALSE); ssh2_pkt_addstring(password); ssh2_pkt_send(); crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_SUCCESS } else break; } /* * Now we're authenticated for the connection protocol. The * connection protocol will automatically have started at this * point; there's no need to send SERVICE_REQUEST. */ /* * So now create a channel with a session in it. */ ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring("session"); ssh2_pkt_adduint32(100); /* as good as any */ ssh2_pkt_adduint32(0xFFFFFFFFUL); /* very big window which we ignore */ ssh2_pkt_adduint32(0xFFFFFFFFUL); /* very big max pkt size */ ssh2_pkt_send(); crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) { fatalbox("Server refused to open a session"); /* FIXME: error data comes back in FAILURE packet */ } if (ssh2_pkt_getuint32() != 100) { fatalbox("Server's channel confirmation cited wrong channel"); } their_channel = ssh2_pkt_getuint32(); remote_winsize = ssh2_pkt_getuint32(); remote_maxpkt = ssh2_pkt_getuint32(); logevent("Opened channel for session"); /* * Now allocate a pty for the session. */ ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(their_channel); /* recipient channel */ ssh2_pkt_addstring("pty-req"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addstring(cfg.termtype); ssh2_pkt_adduint32(cols); ssh2_pkt_adduint32(rows); ssh2_pkt_adduint32(0); /* pixel width */ ssh2_pkt_adduint32(0); /* pixel height */ ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data("\0", 1); /* TTY_OP_END, no special options */ ssh2_pkt_send(); do { /* FIXME: pay attention to these */ crWaitUntilV(ispkt); } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) { fatalbox("Server got confused by pty request"); } c_write("Server refused to allocate pty\r\n", 32); } else { logevent("Allocated pty"); } /* * Start a shell. */ ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(their_channel); /* recipient channel */ ssh2_pkt_addstring("shell"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_send(); do { /* FIXME: pay attention to these */ crWaitUntilV(ispkt); } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) { fatalbox("Server got confused by shell request"); } fatalbox("Server refused to start a shell"); } else { logevent("Started a shell"); } /* * Transfer data! */ while (1) { crReturnV; if (ispkt) { if (pktin.type == SSH2_MSG_CHANNEL_DATA || pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA) { char *data; int length; if (ssh2_pkt_getuint32() != 100) continue; /* wrong channel */ if (pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA && ssh2_pkt_getuint32() != SSH2_EXTENDED_DATA_STDERR) continue; /* extended but not stderr */ ssh2_pkt_getstring(&data, &length); if (data) c_write(data, length); } else if (pktin.type == SSH22_MSG_CHANNEL_REQUEST) { continue; /* exit status et al; ignore (FIXME?) */ } else if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { continue; /* ignore for now (FIXME!) */ /* FIXME: for now, ignore window size */ ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA); ssh2_pkt_adduint32(their_channel); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(in, inlen); ssh2_pkt_send(); } } crFinishV; } /* * Handle the top-level SSH2 protocol. */ static void ssh2_protocol(unsigned char *in, int inlen, int ispkt) { if (do_ssh2_transport(in, inlen, ispkt) == 0) return; do_ssh2_authconn(in, inlen, ispkt) Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 93cbd9b4a82921c03da332c394908752 Text-delta-base-sha1: 2f4e4b01842fb78c7cd3c78ce11e6e8cbfe63914 Text-content-length: 1478 Text-content-md5: 533354c115c11bf89aef20d2c45af59d Text-content-sha1: ca34b73b51b9ea700d04be599c3335ad34b5f539 Content-length: 1518 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNGH,,7g,:cQVmz[5.Bignum modulus; Bignum exponent; Bignum private_exponent; #endif }; int makekey(unsigned char *data, struct RSAKey *result, unsigned char **keystr, int order); int makeprivate(unsigned char *data, struct RSAKey *result); void rsaencrypt(unsigned char *data, int length, struct RSAKey *key); Bignum rsadecrypt(Bignum input, struct RSAKey *key); void rsasign(unsigned char *data, int length, struct RSAKey *key); void rsasanitise(void SHA_Simple(void *p, int len/* * Plugging in another KEX algorithm requires structural chaos, * so it's hard to abstract them into nice little structures * like this. Hence, for the moment, this is just a * placeholder. I claim justification in the fact that OpenSSH * does this too :-) */ char *name; }; struct ssh_hostkey { void (*setkey)(char *data, int len); char *(*fmtkey)(void); int (*verifysig)(char *sig, int siglen, char *data, int datalen);Bignum newbn(int length); Bignum copybn(Bignum bvoid modmul(Bignum a, Bignum b, Bignum mod, Bignum result); void decbn(Bignum n); extern Bignum Zero, One; int ssh1_read_bignum(unsigned char *data, Bignum *result); Bignum dh_create_e(void); Bignum dh_find_K(Bignum f); int loadrsakey(char *filename, struct RSAKey *key, char *passphrase); int rsakey_encrypted(char *filename); void des3_decrypt_pubkey(unsigned char *key, unsigned char *blk, int len); Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b677953c6f2cc22c152fc6f9ecd48812 Text-delta-base-sha1: de6e2878d79ecf6166972f0f2bcb0e692093ade9 Text-content-length: 2849 Text-content-md5: d099e1191cf34016f86621a10d947339 Text-content-sha1: 55ad4b29bdb8abfd06b1566c280815ff59af38d3 Content-length: 2888 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN8fQDzrNL-evy[utJ4:~ }vu{wKf'. /* FIXME */ #include /* FIXME */ #include /* FIXME */ #include "putty.h" /* FIXME */ #include "ssh.h" unsigned short bnZero[1] = { 0 }; unsigned short bnOne[2] = { 1, 1 }; Bignum Zero = bnZero, One = bnOne;Bignum copybn(Bignum orig) { Bignum b = malloc((orig[0]+1)*sizeof(unsigned short)); if (!b) abort(); /* FIXME */ memcpy(b, orig, (orig[0]+1)*sizeof(*b))len2 words of a and first len words of m. * Output in first len2 words of a * (of which first len2- int len, int len22-, mlen*2); if ((exp[exp[0] - i] & (1 << j)) != 0) { bigmul(b + mlen, n, a, mlen); bigmod(a, m, mlen, mlen*2, mlen*2 /* * Compute (p * q) % modmul(Bignum p, Bignum q, Bignum mod, Bignum result) { unsigned short *a, *n, *m, *o; int mshift; int pqlen,pqlen = (p[0] > q[0] ? p[0] : q[0]); /* Allocate n of size pqlen, copy p to n */ n = malloc(pqlen * sizeof(unsigned short)); i = pqlen - p[0]; for (j = 0; j < i; j++) n[j] = 0; for (j = 0; j < p[0]; j++) n[i+j] = p[p[0] - j]; /* Allocate o of size pqlen, copy q to o */ o = malloc(pqlen * sizeof(unsigned short)); i = pqlen - q[0]; for (j = 0; j < i; j++) o[j] = 0; for (j = 0; j < q[0]; j++) o[i+j] = q[q[0] - j]; /* Allocate a of size 2*pqlen for result */ a = malloc(2 * pqlen * sizeof(unsigned short)); /* Main computation */ bigmul(n, o, a, pqlen); bigmod(a, m, mlen, 2*pqlen); /* Fixup result in case the modulus was shifted */ if (mshift) { for (i = 2*pqlen - mlen - 1; i < 2*pqpqlen-1] = a[2*pqlen-1] << mshift; bigmod(a, m, mlen, pqlen*2); for (i = 2*pqlen - 1; i >= 2*pqlen -2*pqlen-mlen]; /* Free temporary arrays */ for (i = 0; i < 2*pqlen; i++) a[i] = 0; free(a); for (i = 0; i < mlen; i++) m[i] = 0; free(m); for (i = 0; i < pqlen; i++) n[i] = 0; free(n); for (i = 0; i < pqlen; i++) o[i] = 0; free(o); } /* * Decrement a number. */ void decbn(Bignum bn) { int i = 1; while (i < bn[0] && bn[i] == 0) bn[i++] = 0xFFFF; bn[i]--; } /* * Read an ssh1-format bignum from a data buffer. Return the number * of bytes consumed. */ int ssh1_read_bignum(unsigned char *data, Bignum *result) { unsigned char *p = data; Bignum bn; int i; int w, b; w = 0; for (i=0; i<2; i++) w = (w << 8) + *p++; b = (w+7)/8; /* bits -> bytes */ w = (w+15)/16; /* bits -> words */ bn = newbn(w); for (i=1; i<=w; i++) bn[i] = 0; for (i=b; i-- ;) { unsigned char byte = *p++; if (i & 1) bn[1+i/2] |= byte<<8; else bn[1+i/2] |= byte; } *result = bn; return p - data; } Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 209dd94714f4d886c3b784bc7f029093 Text-delta-base-sha1: 1286404c02aef671de37cfbf1e427ac074a1b24d Text-content-length: 290 Text-content-md5: b5ddecb70a34cfb76aae22a712b7ac1d Text-content-sha1: 0b8d1fb8f5ef804a75c7e019cd6c1f9da5f2a470 Content-length: 330 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNhs t\h^\Z#include #include /* FIXME */void des3_decrypt_pubkey(unsigned char *key, unsigned char *blk, int len) { DESContext ourkeys[3];ourourkeys[1]);ourkeys[2]); des_3cbc_decrypt(blk, blk, len, our Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b4a0c491a1cf43fb4dbd7d6a3fa7cc75 Text-delta-base-sha1: 7ed2fda415f65eebca95c4d1ac5f1955d0a187ac Text-content-length: 4567 Text-content-md5: d9ade49397ab82cb3a3324ba50bebc3b Text-content-sha1: 7c668f939506cca96b305c29e44f18a71277df16 Content-length: 4606 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNBYGG0#include #include #include "ssh.h" #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) static void getstring(char **data, int *datalen, char **p, int *length) { *p = NULL; if (*datalen < 4) return; *length = GET_32BIT(*data); *datalen -= 4; *data += 4; if (*datalen < *length) return; *p = *data; *data += *length; *datalen -= *length; } static Bignum getmp(char **data, int *datalen) { char *p; int i, j, length; Bignum b; getstring(data, datalen, &p, &length); if (!p) return NULL; if (p[0] & 0x80) return NULL; /* negative mp */ b = newbn((length+1)/2); for (i = 0; i < length; i++) { j = length - 1 - i; if (j & 1) b[j/2+1] |= ((unsigned char)p[i]) << 8; else b[j/2+1] |= ((unsigned char)p[i]); } return b; } static Bignum get160(char **data, int *datalen) { char *p; int i, j, length; Bignum b; p = *data; *data += 20; *datalen -= 20; length = 20; while (length > 0 && !p[0]) p++, length--; b = newbn((length+1)/2); for (i = 0; i < length; i++) { j = length - 1 - i; if (j & 1) b[j/2+1] |= ((unsigned char)p[i]) << 8; else b[j/2+1] |= ((unsigned char)p[i]); } return b; } static Bignum dss_p, dss_q, dss_g, dss_y; static void dss_setkey(char *data, int len) { char *p; int slen; getstring(&data, &len, &p, &slen); if (!p || memcmp(p, "ssh-dss", 7)) { dss_p = NULL; return; } dss_p = getmp(&data, &len); dss_q = getmp(&data, &len); dss_g = getmp(&data, &len); dss_y = getmp(&data, &len); } static char *dss_fmtkey(void) { char *p; int len; int i; if (!dss_p) return NULL; len = 7 + 4 + 1; /* "ssh-dss", punctuation, \0 */ len += 4 * (dss_p[0] + dss_q[0] + dss_g[0] + dss_y[0]); /* digits */ p = malloc(len); if (!p) return NULL; strcpy(p, "ssh-dss:"); for (i = dss_p[0]; i > 0; i--) sprintf(p+strlen(p), "%04X", dss_p[i]); strcat(p, "/"); for (i = dss_q[0]; i > 0; i--) sprintf(p+strlen(p), "%04X", dss_q[i]); strcat(p, "/"); for (i = dss_g[0]; i > 0; i--) sprintf(p+strlen(p), "%04X", dss_g[i]); strcat(p, "/"); for (i = dss_y[0]; i > 0; i--) sprintf(p+strlen(p), "%04X", dss_y[i]); return p; } static int dss_verifysig(char *sig, int siglen, char *data, int datalen) { char *p; int i, slen; char hash[20]; Bignum qm2, r, s, w, i1, i2, i3, u1, u2, sha, v; int ret; if (!dss_p) return 0; getstring(&sig, &siglen, &p, &slen); if (!p || memcmp(p, "ssh-dss", 7)) { return 0; } sig += 4, siglen -= 4; /* skip yet another length field */ r = get160(&sig, &siglen); s = get160(&sig, &siglen); if (!r || !s) return 0; /* * Step 1. w <- s^-1 mod q. */ w = newbn(dss_q[0]); qm2 = copybn(dss_q); decbn(qm2); decbn(qm2); /* Now qm2 is q-2, and by Fermat's Little Theorem, s^qm2 == s^-1 (mod q). * This is a silly way to do it; may fix it later. */ modpow(s, qm2, dss_q, w); /* * Step 2. u1 <- SHA(message) * w mod q. */ u1 = newbn(dss_q[0]); SHA_Simple(data, datalen, hash); p = hash; slen = 20; sha = get160(&p, &slen); modmul(sha, w, dss_q, u1); /* * Step 3. u2 <- r * w mod q. */ u2 = newbn(dss_q[0]); modmul(r, w, dss_q, u2); /* * Step 4. v <- (g^u1 * y^u2 mod p) mod q. */ i1 = newbn(dss_p[0]); i2 = newbn(dss_p[0]); i3 = newbn(dss_p[0]); v = newbn(dss_q[0]); modpow(dss_g, u1, dss_p, i1); modpow(dss_y, u2, dss_p, i2); modmul(i1, i2, dss_p, i3); modmul(i3, One, dss_q, v); /* * Step 5. v should now be equal to r. */ ret = 1; for (i = 1; i <= v[0] || i <= r[0]; i++) { if ((i > v[0] && r[i] != 0) || (i > r[0] && v[i] != 0) || (i <= v[0] && i <= r[0] && r[i] != v[i])) ret = 0; } freebn(w); freebn(qm2); freebn(sha); freebn(i1); freebn(i2); freebn(i3); freebn(v); freebn(r); freebn(s); return ret; } struct ssh_hostkey ssh_dss = { dss_setkey, dss_fmtkey, dss_verifysig, Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 23681d826a66de1e3498922e7b12bff7 Text-delta-base-sha1: cb626c97fb5ed620b0fc6ecdeba0a853c544c481 Text-content-length: 861 Text-content-md5: 1992a98269db34c6f6206fc0f289f798 Text-content-sha1: df5e1a55b7e4443a55f342443b07089fec4b6326 Content-length: 900 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNa18]b*P,3$=, int order) { unsigned char *p = data; int i/* * order=0 means exponent then modulus (the keys sent by the * server). order=1 means modulus then exponent (the keys * stored in a keyfile). */ if (order == 0) p += ssh1_read_bignum(p, &result->exponent); result->bytes = (((p[0] << 8) + p[1]) + 7) / 8; if (keystr) *keystr = p+2; p += ssh1_read_bignum(p, &result->modulus); if (order == 1) p += ssh1_read_bignum(p, &result->exponent); return p - data; } int makeprivate(unsigned char *data, struct RSAKey *result) { return ssh1_read_bignum(data, &result->private_exponent)Bignum rsadecrypt(Bignum input, struct RSAKey *key) { Bignum ret; ret = newbn(key->modulus[0]); modpow(input, key->private_exponent, key->modulus, ret); return ret Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bb354e257aaac9ce0d6d5a548d05d72a Text-delta-base-sha1: 5d59040f293cfc062391b66c625eca3d060f18c8 Text-content-length: 176 Text-content-md5: 03578f9f6464b060a0ef42a5bf3cff19 Text-content-sha1: cc8d8954c07d89604f1f9d4ad3f2659f83fcd590 Content-length: 215 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNmakoGp[G%Hsha1_do_hmac(&sha1_cs_mac_s1, &sha1_cs_mac_s2, blk, len, seq, blk+len);sha1_do_hmac(&sha1_sc_mac_s1, &sha1_sc_mac_s2, blk, len, seq, correct); Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e70fe4c77016862fb222c56127f5bc2b Text-delta-base-sha1: 45572df5e5888a9c873f155c7b24522f2faba3dd Text-content-length: 108 Text-content-md5: ebd10553ea872f702e53c40b2068833d Text-content-sha1: c2113e5d2305e15935ff29a190044f05a6987f7f Content-length: 148 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN~U V&VY%#define IDC3_PKSTATIC 1024 #define IDC3_PKEDIT 1025 #define IDC3_PKBUTTON 1026 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b0114679f1a79c7d13b8ab7de6711dd Text-delta-base-sha1: 92e67138063f82267196551479a8cc3532c4017f Text-content-length: 216 Text-content-md5: 58797294d054a990d5aca2d53b8856d1 Text-content-sha1: 9c5b30eaac552dcb36d769d386c83516c2d0e9fd Content-length: 256 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN K @v@u LTEXT "Public key file:", IDC3_PKSTATIC, 3, 75, 119, 8 EDITTEXT IDC3_PKEDIT, 3, 83, 119, 12, ES_AUTOHSCROLL PUSHBUTTON "C&hange...", IDC3_PKBUTTON, 129, 83, 35, 12 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4aff3976fabc62bd2483f1299a2bf87b Text-delta-base-sha1: eecfa8838a50a675ae290666b3a575663818ca97 Text-content-length: 1262 Text-content-md5: c9a144c6d41ac72ebf947bb8f6dd6299 Text-content-sha1: 397acb2cb28889ca46a54da88a2580a6036131bd Content-length: 1302 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN]cK`PVAh;Hy8P9$%I;4";s (sesskey, "PublicKeyFile", cfg.keyfiles (sesskey, "PublicKeyFile", "", cfg.keyfile, sizeof(cfg.keyfile)OPENFILENAME of; char filename[sizeof(cfg.keyfile)]SetDlgItemText (hwnd, IDC3_PKEDIT, cfg.keyfileNOPTY case IDC3_PKPKEDIT, cfg.keyfile, sizeof(cfg.keyfile)-1); break; case IDC3_PKBUTTON: /* * FIXME: this crashes. Find out why. */ memset(&of, 0, sizeof(of)); #ifdef OPENFILENAME_SIZE_VERSION_400 of.lStructSize = OPENFILENAME_SIZE_VERSION_400; #else of.lStructSize = sizeof(of); #endif of.hwndOwner = hwnd; of.lpstrFilter = "All Files\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filename; strcpy(filename, cfg.keyfile); of.nMaxFile = sizeof(filename); of.lpstrFileTitle = NULL; of.lpstrInitialDir = NULL; of.lpstrTitle = "Select Public Key File"; of.Flags = 0; if (GetOpenFileName(&of)) { strcpy(cfg.keyfile, filename); SetDlgItemText (hwnd, IDC3_PKEDIT, cfg.keyfile); } Revision-number: 573 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2000-09-07T16:40:50.000000Z K 7 svn:log V 53 Add sshpubk.c to load authenticating keys from files K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3597 Text-content-md5: 459ab615ffe2dbe4d54a72ca12834336 Text-content-sha1: 11f0302b1b6a27346c37e0ba8587bd91e456d517 Content-length: 3713 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * Read SSH public keys from files. * * First implementation: only supports unencrypted SSH 1.1 format * RSA keys. Encryption, and SSH 2 DSS keys, to be supported later. */ #include #include /* FIXME */ #include /* FIXME */ #include /* FIXME */ #include "putty.h" /* FIXME */ #include "ssh.h" #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) #define rsa_signature "SSH PRIVATE KEY FILE FORMAT 1.1\n" int loadrsakey(char *filename, struct RSAKey *key, char *passphrase) { FILE *fp; unsigned char buf[16384]; unsigned char keybuf[16]; int len; int i, j, ciphertype; int ret = 0; struct MD5Context md5c; fp = fopen(filename, "rb"); if (!fp) goto end; /* Slurp the whole file into a buffer. */ len = fread(buf, 1, sizeof(buf), fp); fclose(fp); if (len < 0 || len == sizeof(buf)) goto end; /* file too big or not read */ if (len < sizeof(rsa_signature) || memcmp(buf, rsa_signature, sizeof(rsa_signature)) != 0) goto end; /* failure to have sig at front */ i = sizeof(rsa_signature); /* Next, one byte giving encryption type, and one reserved uint32. */ if (len-i < 1) goto end; ciphertype = buf[i]; if (ciphertype != 0 && ciphertype != SSH_CIPHER_3DES) goto end; i++; if (len-i < 4) goto end; /* reserved field not present */ if (buf[i] != 0 || buf[i+1] != 0 || buf[i+2] != 0 || buf[i+3] != 0) goto end; /* reserved field nonzero, panic! */ i += 4; /* Now the serious stuff. An ordinary SSH 1 public key. */ i += makekey(buf+i, key, NULL, 1); if (len-i < 0) goto end; /* overran */ /* Next, the comment field. */ j = GET_32BIT(buf+i); if (len-i < 4+j) goto end; i += 4+j; /* * FIXME: might need to use this string. */ /* * Decrypt remainder of buffer. */ if (ciphertype) { MD5Init(&md5c); MD5Update(&md5c, passphrase, strlen(passphrase)); MD5Final(keybuf, &md5c); des3_decrypt_pubkey(keybuf, buf+i, (len-i+7)&~7); memset(keybuf, 0, sizeof(buf)); /* burn the evidence */ } /* * We are now in the secret part of the key. The first four * bytes should be of the form a, b, a, b. */ if (len-i < 4) goto end; if (buf[i] != buf[i+2] || buf[i+1] != buf[i+3]) { ret = -1; goto end; } i += 4; /* * After that, we have one further bignum which is our * decryption modulus, and then we're done. */ i += makeprivate(buf+i, key); if (len-i < 0) goto end; ret = 1; end: memset(buf, 0, sizeof(buf)); /* burn the evidence */ return ret; } /* * See whether an RSA key is encrypted. */ int rsakey_encrypted(char *filename) { FILE *fp; unsigned char buf[1+sizeof(rsa_signature)]; int len; fp = fopen(filename, "rb"); if (!fp) return 0; /* doesn't even exist */ /* Slurp the whole file into a buffer. */ len = fread(buf, 1, sizeof(buf), fp); fclose(fp); if (len < sizeof(buf)) return 0; /* not even valid */ if (buf[sizeof(buf)-1]) return 1; /* encrypted */ return 0; } Revision-number: 574 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2000-09-08T08:33:52.000000Z K 7 svn:log V 55 Public key authentication now works in pscp too - oops K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e248050e6f762fd5d1d08dd838dc0f51 Text-delta-base-sha1: 3b09bc8d2a71789c98608e67d47cf168313cf1d3 Text-content-length: 67 Text-content-md5: e6d164ecef6a29a8673e6fca5f9b05d5 Text-content-sha1: d66edf35a94de40db94d7066d8bfd973e06b1ce3 Content-length: 107 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN(Q )_I_pwpkt_type == SSH1_CMSG_AUTH_PASSWORD && Revision-number: 575 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2000-09-08T14:45:20.000000Z K 7 svn:log V 69 Added a fourth application: plink, a command line connection utility K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: db41cb7611369eeac5846017b92d13dd Text-delta-base-sha1: 3af9a5470e1373843e1737ea6bfeefeed2017868 Text-content-length: 1137 Text-content-md5: 3e662e12a893de76314ed72214390184 Text-content-sha1: 288f6e5b991a8602ce7c347e8fe9a59a8dd0689a Content-length: 1177 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN5DY ^eu-GL]P ^pP1.6+Rbx\Y GOBJS2 = xlat.$(OBJ) sizetip.$(OBJ) ##-- objects putty puttytel plink LOBJS1 = telnet.$(OBJ) raw.$(OBJ) ldisc.$(OBJ) ##-- objects putty plinklink PLOBJS = plink.$(OBJ) windlg plink MOBJS = misc.$(OBJ) version.$(OBJ) ##-- objects putty pscp plink resources plink LRESRC = plinkcomctl32.lib comdlg32.lib SOCK1 = wsock32.lib SOCK2 = ws2_32.lib all: putty.exe puttytel.exe pscp.exe plink.exe putty.exe: $(GOBJS1) $(GOBJS2) $(LOBJS1LOBJS1link.exe: $(LOBJS1) $(POBJS) $(PLOBJS) $(MOBJS) $(OBJS1) $(OBJS2) $(OBJS3) $(LRESRC) plink.rsp link $(LFLAGS) -out:plink.exe @plinkLOBJS1 echo $(SOCK1LOBJS1 echo $(SOCK1 echo $(SOCK1) >> pscp.rsp plink.rsp: makefile echo /nologo /subsystem:console > plink.rsp echo $(LOBJS1) >> plink.rsp echo $(POBJS) >> plink.rsp echo $(PLOBJS) >> plink.rsp echo $(MOBJS) >> plink.rsp echo $(OBJS1) >> plink.rsp echo $(OBJS2) >> plink.rsp echo $(OBJS3) >> plink.rsp echo $(LRESRC) >> plink.rsp echo $(LIBS1) >> plink.rsp echo $(LIBS2) >> plink.rsp echo $(SOCK2) >> plinkplink.$(OBJ): plink.c putty.h Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d9a1a24a82950e861ba66bebb58ec627 Text-delta-base-sha1: e9d482dd8c126fd506ba358a7836a033592ccf82 Text-content-length: 224 Text-content-md5: 4b98622d6df4d70dfb5c6daf86e6ee76 Text-content-sha1: ba38d90016acb2310bd890fbb7477df36b53b811 Content-length: 264 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN`B2o/(} SOCKET (*socket) (void/* * Some global flags denoting the type of application. */ #define FLAG_VERBOSE 0x0001 #define FLAG_WINDOWED 0x0002 #define FLAG_CONNECTION 0x0004 GLOBAL int flags; Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1b936a9a2cc22100dbb25b6840c755c1 Text-delta-base-sha1: 5fd4ab6c7d2ee77be5bd6c94cc5953c2283562d4 Text-content-length: 91 Text-content-md5: 6836427a70f2c78711876c9546872cf1 Text-content-sha1: 69a2d8eb1a08f898faffd4c765ebb7b18f07d911 Content-length: 130 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN _@9a;hwnd && SOCKET raw_socket(void) { return s; , raw_socket }; Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b1b7e8c55aa49e4c7dce304baa98cea5 Text-delta-base-sha1: ffd32593fd7f65f2bf22e79871ec38227385808a Text-content-length: 54 Text-content-md5: d3ecb6b888ff81ad9c142e93b183a1f4 Text-content-sha1: b0c52124ea948f022474b7f8e5439966e810b2ac Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNxj 5cflags = 0flags |= FLAG Node-path: putty/scp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bb1f3285c68d0ed29b6c6791ee6797c4 Text-delta-base-sha1: 75584c9eb71ccf31cbd57a12e7d99f7fe6dcdb30 Text-content-length: 77 Text-content-md5: cf2c840e585b4c14f4214ecf2b4c307d Text-content-sha1: b5d30a657b52b9f38e61068134d85929c47ba759 Content-length: 116 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNT}<A/* * scp.h * Joris van Rantwijk, Aug 1999, Jun 2000. */ Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e6d164ecef6a29a8673e6fca5f9b05d5 Text-delta-base-sha1: d66edf35a94de40db94d7066d8bfd973e06b1ce3 Text-content-length: 1085 Text-content-md5: 922f4bb68a131f2d867969739a6ca967 Text-content-sha1: aa765ad7b6416639396aa2023e52b0c30ecf522f Content-length: 1125 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNQ~,#hKvFg%)RMWqqq1/S+Vnv~mu[qLPrBe 'XH-5rvT| e`m!(flags & FLAG_CONNECTION) && (flags & FLAG_VERBOSE) noise_ultralight(i); if (i <= 0) fatalbox("Lost connection while sending"); !(flags & FLAG_CONNECTION)) { int i; for (i = 0; i < len; i++) if (buf[i] != '\r') fputc(buf[i], stderr);(flags & FLAG_CONNECTION) if (flags & FLAG_VERBOSE) { sprintf(stuff, "Sent username \"%s\".\r\n", username); !FLAG_WINDOWEDif (flags & FLAG_VERBOSE) if (flags & FLAG_VERBOSE) if (flags & FLAG_VERBOSE) if (flags & FLAG_VERBOSE) c_write("Failed to authenticate with our public key.\r\n", if (flags & FLAG_VERBOSE) (flags & FLAG_CONNECTION)Vflags & FLAG_VERBOSE) { sprintf(stuff, "Usingif (!(flags & FLAG_WINDOWED)hwnd && SOCKET ssh_socket(void) { return s; }, ssh_socket }; Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8543ddc2988c41c20cb68e3ed18d4f38 Text-delta-base-sha1: 183ccc9c1f0b60c9d75d1550ac9c112965daaf8f Text-content-length: 106 Text-content-md5: 6c3019609df45127f53737a60d3d9b13 Text-content-sha1: 5579b06922c8cb3db12246571b1563f76709f3fc Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNv:FK5Mshwnd && SOCKET telnet_socket(void) { return s; , telnet_socket }; Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aab5957ac4190c6f3e39979a6593e06b Text-delta-base-sha1: 12aae6f12b517eda4a19b59e22b065a1a0c9baac Text-content-length: 82 Text-content-md5: ef8f04f66dbb79146ddba5884382b09d Text-content-sha1: 11e77de8c7e652f1b7f025d6ffea41a71ab5dbfa Content-length: 122 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNR :g1e flags = FLAG_VERBOSE | FLAG_WINDOWED | FLAG_CONNECTION Revision-number: 576 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2000-09-08T15:24:19.000000Z K 7 svn:log V 73 plink can now execute a specific command instead of just a shell session K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b98622d6df4d70dfb5c6daf86e6ee76 Text-delta-base-sha1: ba38d90016acb2310bd890fbb7477df36b53b811 Text-content-length: 42 Text-content-md5: c7606f004951f00c7220d03525bd3d1c Text-content-sha1: 79f6db047fe767e08483eef4be5a81ea4925f978 Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN`z xmschar remote_cmd[512]; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 922f4bb68a131f2d867969739a6ca967 Text-delta-base-sha1: aa765ad7b6416639396aa2023e52b0c30ecf522f Text-content-length: 892 Text-content-md5: f480ef894e966c9c9311f1606a3f96e4 Text-content-sha1: 7ae554165e3b18be33e364e12fe5ab386a42a34f Content-length: 932 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN~"T; 3t1ZmrpbZb!,}4C6w!]int ssh_version;sh_version = 2sh_version = 1if (*cfg.remote_cmd) send_packet(SSH1_CMSG_EXEC_CMD, PKT_STR, cfg.remote_cmd, PKT_END); else SSH2: remote identifier for the main session channel. */ static unsigned long ssh_remote_channel;ssh_remotessh_remotessh_remotessh_remoteSend Telnet special codes. TS_EOF is useful for `plink', so you * can send an EOF and collect resulting output (e.g. `plink * hostname sort'). */ static void ssh_special (Telnet_Special code) { if (code == TS_EOF) { if (ssh_version = 1) { send_packet(SSH1_CMSG_EOF, PKT_END); } else { ssh2_pkt_init(SSH2_MSG_CHANNEL_EOF); ssh2_pkt_adduint32(ssh_remote_channel); ssh2_pkt_send(); } } else { /* do nothing */ } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c9a144c6d41ac72ebf947bb8f6dd6299 Text-delta-base-sha1: 397acb2cb28889ca46a54da88a2580a6036131bd Text-content-length: 127 Text-content-md5: c611753bad46a90dd9e3ca73cfc078d4 Text-content-sha1: 679dbb5a7d93a4db37399dc753126c572f0f6aa0 Content-length: 167 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNca`)FA"RemoteCmd", cfg.remote_cmdgpps (sesskey, "RemoteCmd", "", cfg.remote_cmd, sizeof(cfg.remote_cmd) Revision-number: 577 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 Stop plink losing data at start of session K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-08T16:42:11.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c7606f004951f00c7220d03525bd3d1c Text-delta-base-sha1: 79f6db047fe767e08483eef4be5a81ea4925f978 Text-content-length: 37 Text-content-md5: a763b63a29301ad7d8238bdae77602b9 Text-content-sha1: da94757de0693b64cc9d702ad75f89974f994ab7 Content-length: 77 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNz O5E int (*sendok Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6836427a70f2c78711876c9546872cf1 Text-delta-base-sha1: 69a2d8eb1a08f898faffd4c765ebb7b18f07d911 Text-content-length: 126 Text-content-md5: 81154764b9f437bedeccf52f97dfd8a1 Text-content-sha1: 591755d7a750848060ffa31a8d222ae56f2620ab Content-length: 165 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN_! hFTshstatic SOCKET raw_socket(void) { return s; } static int raw_sendok(void) { return 1, raw_sendok }; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f480ef894e966c9c9311f1606a3f96e4 Text-delta-base-sha1: 7ae554165e3b18be33e364e12fe5ab386a42a34f Text-content-length: 239 Text-content-md5: 1f225b8439b4ccf0dd44014c515840c8 Text-content-sha1: 5112f71eb9065572a7a126c1f7d143f59d8fe193 Content-length: 279 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN"E)8q> zBR7^s+static int ssh_send_okssh_send_ok = 0;ssh_send_ok = 1;ssh_send_ok = 1;static SOCKET ssh_socket(void) { return s; } static int ssh_sendok(void) { return ssh_send_ok, ssh_sendok }; Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6c3019609df45127f53737a60d3d9b13 Text-delta-base-sha1: 5579b06922c8cb3db12246571b1563f76709f3fc Text-content-length: 140 Text-content-md5: 7d860ab78b23c87bb64dd439791d1779 Text-content-sha1: c997ce462852f5c2e59555906eeeab7cbe2537fe Content-length: 180 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN:q Z.static SOCKET telnet_socket(void) { return s; } static int telnet_sendok(void) { return 1, telnet_sendok }; Revision-number: 578 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2000-09-09T08:21:34.000000Z K 7 svn:log V 38 Oops - remove SHA debugging from ssh2 K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1f225b8439b4ccf0dd44014c515840c8 Text-delta-base-sha1: 5112f71eb9065572a7a126c1f7d143f59d8fe193 Text-content-length: 80 Text-content-md5: 1865fe31409e752d4201e355b8889621 Text-content-sha1: 9df449192199187f3b0955b43c7b1c1f06b51c1e Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNE6 6yL PUT_32BIT(lenblk, len); SHA_Bytes(s, lenblk, 4 Revision-number: 579 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:08.731953Z PROPS-END Revision-number: 580 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2000-09-11T08:27:15.000000Z K 7 svn:log V 58 Actually _commit_ plink. It now works as a CVS transport! K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 9150 Text-content-md5: a8bd8e2afb1afb36efafa18e4ce8c74e Text-content-sha1: dccbef44f53e81714442157bc18e3196f4bbc8f4 Content-length: 9266 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN000/* * PLink - a command-line (stdin/stdout) variant of PuTTY. */ #include #include #include #include #define PUTTY_DO_GLOBALS /* actually _define_ globals */ #include "putty.h" void fatalbox (char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: ", p); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); WSACleanup(); exit(1); } HANDLE outhandle; void term_out(void) { int reap; DWORD ret; reap = 0; while (reap < inbuf_head) { if (!WriteFile(outhandle, inbuf+reap, inbuf_head-reap, &ret, NULL)) return; /* give up in panic */ reap += ret; } inbuf_head = 0; } struct input_data { DWORD len; char buffer[4096]; HANDLE event; }; int WINAPI stdin_read_thread(void *param) { struct input_data *idata = (struct input_data *)param; HANDLE inhandle; inhandle = GetStdHandle(STD_INPUT_HANDLE); while (ReadFile(inhandle, idata->buffer, sizeof(idata->buffer), &idata->len, NULL)) { SetEvent(idata->event); } idata->len = 0; SetEvent(idata->event); return 0; } int main(int argc, char **argv) { WSADATA wsadata; WORD winsock_ver; WSAEVENT netevent, stdinevent; HANDLE handles[2]; SOCKET socket; DWORD threadid; struct input_data idata; int sending; flags = FLAG_CONNECTION; /* * Process the command line. */ default_protocol = DEFAULT_PROTOCOL; default_port = DEFAULT_PORT; do_defaults(NULL); while (--argc) { char *p = *++argv; if (*p == '-') { if (!strcmp(p, "-ssh")) { default_protocol = cfg.protocol = PROT_SSH; default_port = cfg.port = 22; } else if (!strcmp(p, "-log")) { logfile = "putty.log"; } } else if (*p) { if (!*cfg.host) { char *q = p; /* * If the hostname starts with "telnet:", set the * protocol to Telnet and process the string as a * Telnet URL. */ if (!strncmp(q, "telnet:", 7)) { char c; q += 7; if (q[0] == '/' && q[1] == '/') q += 2; cfg.protocol = PROT_TELNET; p = q; while (*p && *p != ':' && *p != '/') p++; c = *p; if (*p) *p++ = '\0'; if (c == ':') cfg.port = atoi(p); else cfg.port = -1; strncpy (cfg.host, q, sizeof(cfg.host)-1); cfg.host[sizeof(cfg.host)-1] = '\0'; } else { /* * Three cases. Either (a) there's a nonzero * length string followed by an @, in which * case that's user and the remainder is host. * Or (b) there's only one string, not counting * a potential initial @, and it exists in the * saved-sessions database. Or (c) only one * string and it _doesn't_ exist in the * database. */ char *r = strrchr(p, '@'); if (r == p) p++, r = NULL; /* discount initial @ */ if (r == NULL) { /* * One string. */ do_defaults (p); if (cfg.host[0] == '\0') { /* No settings for this host; use defaults */ strncpy(cfg.host, p, sizeof(cfg.host)-1); cfg.host[sizeof(cfg.host)-1] = '\0'; cfg.port = 22; } } else { *r++ = '\0'; strncpy(cfg.username, p, sizeof(cfg.username)-1); cfg.username[sizeof(cfg.username)-1] = '\0'; strncpy(cfg.host, r, sizeof(cfg.host)-1); cfg.host[sizeof(cfg.host)-1] = '\0'; cfg.port = 22; } } } else { int len = sizeof(cfg.remote_cmd) - 1; char *cp = cfg.remote_cmd; int len2; strncpy(cp, p, len); cp[len] = '\0'; len2 = strlen(cp); len -= len2; cp += len2; while (--argc) { if (len > 0) len--, *cp++ = ' '; strncpy(cp, *++argv, len); cp[len] = '\0'; len2 = strlen(cp); len -= len2; cp += len2; } cfg.nopty = TRUE; /* command => no terminal */ cfg.ldisc_term = TRUE; /* use stdin like a line buffer */ break; /* done with cmdline */ } } } /* * Select protocol. This is farmed out into a table in a * separate file to enable an ssh-free variant. */ { int i; back = NULL; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == cfg.protocol) { back = backends[i].backend; break; } if (back == NULL) { fprintf(stderr, "Internal fault: Unsupported protocol found\n"); return 1; } } /* * Initialise WinSock. */ winsock_ver = MAKEWORD(2, 0); if (WSAStartup(winsock_ver, &wsadata)) { MessageBox(NULL, "Unable to initialise WinSock", "WinSock Error", MB_OK | MB_ICONEXCLAMATION); return 1; } if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 0) { MessageBox(NULL, "WinSock version is incompatible with 2.0", "WinSock Error", MB_OK | MB_ICONEXCLAMATION); WSACleanup(); return 1; } /* * Start up the connection. */ { char *error; char *realhost; error = back->init (NULL, cfg.host, cfg.port, &realhost); if (error) { fprintf(stderr, "Unable to open connection:\n%s", error); return 1; } } netevent = CreateEvent(NULL, FALSE, FALSE, NULL); stdinevent = CreateEvent(NULL, FALSE, FALSE, NULL); if (!cfg.ldisc_term) SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), ENABLE_PROCESSED_INPUT); outhandle = GetStdHandle(STD_OUTPUT_HANDLE); /* * Now we must send the back end oodles of stuff. */ socket = back->socket(); /* * Turn off ECHO and LINE input modes. We don't care if this * call fails, because we know we aren't necessarily running in * a console. */ WSAEventSelect(socket, netevent, FD_READ | FD_CLOSE); handles[0] = netevent; handles[1] = stdinevent; sending = FALSE; while (1) { int n; n = WaitForMultipleObjects(2, handles, FALSE, INFINITE); if (n == 0) { WSANETWORKEVENTS things; if (!WSAEnumNetworkEvents(socket, netevent, &things)) { if (things.lNetworkEvents & FD_READ) back->msg(0, FD_READ); if (things.lNetworkEvents & FD_CLOSE) { back->msg(0, FD_CLOSE); break; } } term_out(); if (!sending && back->sendok()) { /* * Create a separate thread to read from stdin. * This is a total pain, but I can't find another * way to do it: * * - an overlapped ReadFile or ReadFileEx just * doesn't happen; we get failure from * ReadFileEx, and ReadFile blocks despite being * given an OVERLAPPED structure. Perhaps we * can't do overlapped reads on consoles. WHY * THE HELL NOT? * * - WaitForMultipleObjects(netevent, console) * doesn't work, because it signals the console * when _anything_ happens, including mouse * motions and other things that don't cause * data to be readable - so we're back to * ReadFile blocking. */ idata.event = stdinevent; if (!CreateThread(NULL, 0, stdin_read_thread, &idata, 0, &threadid)) { fprintf(stderr, "Unable to create second thread\n"); exit(1); } sending = TRUE; } } else if (n == 1) { if (idata.len > 0) { back->send(idata.buffer, idata.len); } else { back->special(TS_EOF); } } } WSACleanup(); return 0; } Node-path: putty/plink.rc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 31 Text-content-md5: a4f6e7df7066180cf02df9f0e8b8dea8 Text-content-sha1: c9dd6df3ed1161f08be3dbc37676f171d6ad0223 Content-length: 147 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN200 ICON "putty.ico" Revision-number: 581 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2000-09-11T09:23:23.000000Z K 7 svn:log V 63 Add further types of garbage to .cvsignore and to "make clean" K 10 svn:author V 5 simon PROPS-END Node-path: putty Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 152 Content-length: 152 K 10 svn:ignore V 119 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp mkres mkres.exe Makefile.bor Makefile.cyg PROPS-END Node-path: putty/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4d47ac536c682d87d0df551b59b2bfa7 Text-delta-base-sha1: 24177b2fcefa9b78ac02f15cfaa107b51f48fa0b Text-content-length: 102 Text-content-md5: bc2eaa10b5e1013d626b5a52b2a6bb40 Text-content-sha1: 26b6c1d132cdfffb878e85428e6530e05d39b49a Content-length: 141 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNJxYY+*.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp mkres mkres Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e662e12a893de76314ed72214390184 Text-delta-base-sha1: 288f6e5b991a8602ce7c347e8fe9a59a8dd0689a Text-content-length: 71 Text-content-md5: a0583e6538e0c3d480060174e422674f Text-content-sha1: 2be4a1d4e51bdd50dcee2a9a41b6f6975bedeb7d Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVND{7D del *.dsp del *.dsw del *.ncb del *.opt del *.plg Revision-number: 582 Prop-content-length: 197 Content-length: 197 K 7 svn:log V 97 Saner handling of WM_SYSCOMMAND:SC_KEYMENU to avoid problems on an isolated press of the Alt key K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-11T09:23:52.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef8f04f66dbb79146ddba5884382b09d Text-delta-base-sha1: 11e77de8c7e652f1b7f025d6ffea41a71ab5dbfa Text-content-length: 1048 Text-content-md5: 84c8e2cd8474134bcbd2df298ef0307f Text-content-sha1: fb00cf4326e8d4409dec47aaf9c668bf7628141e Content-length: 1088 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNRI/[N4L#X$oP8y'8#define WM_IGNORE_KEYMENU (WM_XUSER + 3ignore_keymenu = TRUE; static int just_reconfigged = FALSE; if (message != 275) debug(("msg=%d wParam=%08x lParam=%08x\r\n", message, wParam, lParam)) case SC_KEYMENU: if (ignore_keymenu) return 0; /* don't put up system menu on Alt */ break;IGNORE_KEYMENU: ignore_keymenu = wParam; /* do or don't ignore SC_KEYMENU SendMessage (hwnd, WM_VSCROLL, SB_PAGEUP, 0); return 0; } if (wParam == VK_NEXT && shift_state == 1) { SendMessage (hwnd, WM_VSCROLL, SB_PAGEDOWN, 0); return 0; } if (left_alt && wParam == VK_F4 && cfg.alt_f4) { return -1; } if (left_alt && wParam == VK_SPACE && cfg.alt_space) { SendMessage (hwnd, WM_IGNORE_KEYMENU, FALSE, 0); SendMessage (hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0); SendMessage (hwnd, WM_IGNORE_KEYMENU, TRUE, 0); Revision-number: 583 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 Oops - remove diagnostics :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-11T09:36:12.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 84c8e2cd8474134bcbd2df298ef0307f Text-delta-base-sha1: fb00cf4326e8d4409dec47aaf9c668bf7628141e Text-content-length: 25 Text-content-md5: 59a8c7ace5f99de1e155cc4253613b55 Text-content-sha1: aa6f563055bceb67b18a9ff6ad98bcf18caa3722 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNId nvS Revision-number: 584 Prop-content-length: 183 Content-length: 183 K 7 svn:log V 83 Add switch to choose SSH v1-versus-v2 protocol preference where both are available K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-11T09:37:43.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a763b63a29301ad7d8238bdae77602b9 Text-delta-base-sha1: da94757de0693b64cc9d702ad75f89974f994ab7 Text-content-length: 91 Text-content-md5: 6e584b06781d247d27a43311ae520c29 Text-content-sha1: c4d97a4d754e2ef077b4ad96a656b9fd612c0950 Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNb EEsshprot; /* use v1 or v2 when both available */ Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1865fe31409e752d4201e355b8889621 Text-delta-base-sha1: 9df449192199187f3b0955b43c7b1c1f06b51c1e Text-content-length: 227 Text-content-md5: cd2284751b0b3052865e7b5d302958d0 Text-content-sha1: 2ea77d0cd37a4fd11b351beaf4fe89898914e4e9 Content-length: 267 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN6FF3FMi/* * Server version "1.99" means we can choose whether we use v1 * or v2 protocol. Choice is based on cfg.sshprot. */ if (ssh_versioncmp(version, cfg.sshprot == 1 ? "2.0" : "1.99" Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ebd10553ea872f702e53c40b2068833d Text-delta-base-sha1: c2113e5d2305e15935ff29a190044f05a6987f7f Text-content-length: 111 Text-content-md5: 0fab443d8db4248bb212bdf04e3a1663 Text-content-sha1: 7258e3c8345a3d2f307cc824830abfa7dd0b8a3e Content-length: 151 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNU/ Y}YY|#define IDC3_SSHPROTSTATIC 1027 #define IDC3_SSHPROT1 1028 #define IDC3_SSHPROT2 1029 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 58797294d054a990d5aca2d53b8856d1 Text-delta-base-sha1: 9c5b30eaac552dcb36d769d386c83516c2d0e9fd Text-content-length: 389 Text-content-md5: cc2623630a81f2732a09231d5efe5b12 Text-content-sha1: d1cfa937dd5fd197381e5b19831f0d15d1c22b3e Content-length: 429 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNK m m-refer protocol version:", IDC3_SSHPROTSTATIC, 3, 75, 105, 8 AUTORADIOBUTTON "&1", IDC3_SSHPROT1, 115, 75, 21, 8, WS_GROUP AUTORADIOBUTTON "&2", IDC3_SSHPROT2, 143, 75, 21, 8 LTEXT "Public key file:", IDC3_PKSTATIC, 3, 85, 119, 8 EDITTEXT IDC3_PKEDIT, 3, 93, 119, 12, ES_AUTOHSCROLL PUSHBUTTON "C&hange...", IDC3_PKBUTTON, 129, 9 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c611753bad46a90dd9e3ca73cfc078d4 Text-delta-base-sha1: 679dbb5a7d93a4db37399dc753126c572f0f6aa0 Text-content-length: 422 Text-content-md5: b3dae620e14beb0fcfa436bdaa742ece Text-content-sha1: f06cbd800f2522816a17d2e610550ff017a9bf34 Content-length: 462 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNaP*n'#@QUroi (sesskey, "SshProt", cfg.sshprotSshProt", 1, &cfg.sshprot); IDC3_CIPHER3DES); CheckRadioButton (hwnd, IDC3_SSHPROT1, IDC3_SSHPROT2, cfg.sshprot == 1 ? IDC3_SSHPROT1 : IDC3_SSHPROT2SSHPROT1: case IDC3_SSHPROT2if (IsDlgButtonChecked (hwnd, IDC3_SSHPROT1)) cfg.sshprot = 1; else if (IsDlgButtonChecked (hwnd, IDC3_SSHPROT2)) cfg.sshprot = 2 Revision-number: 585 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2000-09-11T11:06:17.000000Z K 7 svn:log V 48 Fix cutting-off of "Blowfish" in SSH config box K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cc2623630a81f2732a09231d5efe5b12 Text-delta-base-sha1: d1cfa937dd5fd197381e5b19831f0d15d1c22b3e Text-content-length: 230 Text-content-md5: 741b2726b907751d7e647a86b3ab08b6 Text-content-sha1: 49b2320ccb127c7562f3fec67dc6ce3364561d6e Content-length: 270 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN! NYNz23, 8 AUTORADIOBUTTON "&3DES", IDC3_CIPHER3DES, 33, 45, 38, 8, WS_GROUP AUTORADIOBUTTON "&Blowfish", IDC3_CIPHERBLOWF, 79, 45, 38, 8, WS_GROUP AUTORADIOBUTTON "&DES", IDC3_CIPHERDES, 125, 45, 38 Revision-number: 586 Prop-content-length: 155 Content-length: 155 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-11T14:47:57.000000Z K 7 svn:log V 55 Yet another pedantic fix for scroll margin setting :-) PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 55f8a42d8fa80e9ab09d88324d68de38 Text-delta-base-sha1: 09c66be5fd6bfdd36754f404346eeeb2564c1439 Text-content-length: 308 Text-content-md5: 2dadeca619208d591af502f1e1945403 Text-content-sha1: 6bb2835d6805561b61351ab388de7cb73ac0dd53 Content-length: 348 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNg_|Ltop = def(esc_args[0], 1) - 1; bot = (esc_nargs <= 1 || esc_args[1] == 0 ? rows : def(esc_args[1], rows)) - 1; if (bot >= rows) bot = rows-1; /* VTTEST Bug 9 - if region is less than 2 lines * don't change region. */ if (bot-top > 1 Revision-number: 587 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2000-09-12T08:44:30.000000Z K 7 svn:log V 30 Add CryptoCard authentication K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cd2284751b0b3052865e7b5d302958d0 Text-delta-base-sha1: 2ea77d0cd37a4fd11b351beaf4fe89898914e4e9 Text-content-length: 882 Text-content-md5: 14b5634450d5e8408b7934c7bc339a34 Text-content-sha1: d87c9214373b29b3eb7d9e81c6cb607613c47292 Content-length: 922 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNFZ31:(wSd@B?|p]f< #define SSH1_CMSG_AUTH_CCARD 70 #define SSH1_SMSG_AUTH_CCARD_CHALLENGE 71 #define SSH1_CMSG_AUTH_CCARD_RESPONSE 72 #define SSH1_AUTH_TIS 5 #define SSH1_AUTH_CCARD 16 || pktin.type == SSH1_SMSG_AUTH_CCARDor CryptoCard exchange if we're doing TIS or CryptoCard *CCARD))) { pwpkt_type = SSH1_CMSG_AUTH_CCARD_RESPONSE; logevent("Requested CryptoCard authentication"); send_packet(SSH1_CMSG_AUTH_CCARD, PKT_END); crWaitUntil(ispkt); if (pktin.type != SSH1_SMSG_AUTH_CCARD_CHALLENGE) { logevent("CryptoCard authentication declined"); c_write("CryptoCardCryptoCard challenge"); c_write(pktin.body+4, challengelen); c_write("\r\nResponse : ", 13 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 741b2726b907751d7e647a86b3ab08b6 Text-delta-base-sha1: 49b2320ccb127c7562f3fec67dc6ce3364561d6e Text-content-length: 34 Text-content-md5: 9799016c837117b8a019a1cde10e0351 Text-content-sha1: 95073c836fae1dcc842b76149257597bac8b47d6 Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN!/ SORor CryptoCard Revision-number: 588 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2000-09-14T15:02:50.000000Z K 7 svn:log V 36 Header file for 2-3-4 tree routines K 10 svn:author V 5 simon PROPS-END Node-path: putty/tree234.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1750 Text-content-md5: de582ee4fc80bcf1e55ad2ce7581d303 Text-content-sha1: 6d76d363f88709ea847b05b54a5b1dbbf75bc2e0 Content-length: 1866 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNHHH/* * tree234.h: header defining functions in tree234.c. */ #ifndef TREE234_H #define TREE234_H /* * These typedefs are notionally opaque outside tree234.c itself. */ typedef struct node234_Tag node234; typedef struct tree234_Tag tree234; typedef struct enum234_Tag enum234; /* * enum234 must be declared here because client code needs to be * able to create automatic instances of it. This declaration does * not constitute licence to use its internals outside tree234.c. * The contents of this structure may change without notice. YOU * HAVE BEEN WARNED. */ struct enum234_Tag { node234 *node; int posn; }; typedef int (*cmpfn234)(void *, void *); /* * Create a 2-3-4 tree. */ tree234 *newtree234(cmpfn234 cmp); /* * Free a 2-3-4 tree (not including freeing the elements). */ void freetree234(tree234 *t); /* * Add an element e to a 2-3-4 tree t. Returns e on success, or if * an existing element compares equal, returns that. */ void *add234(tree234 *t, void *e); /* * Find an element e in a 2-3-4 tree t. Returns NULL if not found. * e is always passed as the first argument to cmp, so cmp can be * an asymmetric function if desired. cmp can also be passed as * NULL, in which case the compare function from the tree proper * will be used. */ void *find234(tree234 *t, void *e, cmpfn234 cmp); /* * Delete an element e in a 2-3-4 tree. Does not free the element, * merely removes all links to it from the tree nodes. */ void *del234(tree234 *t, void *e); /* * Iterate over the elements of a tree234, in order. * * enum234 e; * for (p = first234(tree, &e); p; p = next234(&e)) consume(p); */ void *first234(tree234 *t, enum234 *e); void *next234(enum234 *e); #endif /* TREE234_H */ Revision-number: 589 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2000-09-14T15:02:50.000000Z K 7 svn:log V 58 Added Pageant, a first-attempt PuTTY authentication agent K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a0583e6538e0c3d480060174e422674f Text-delta-base-sha1: 2be4a1d4e51bdd50dcee2a9a41b6f6975bedeb7d Text-content-length: 1099 Text-content-md5: a452ebbab8f6fed39c0ef5d8c2806dfd Text-content-sha1: 9fba91bdb63b5ebe85ca3a35526dd2503b0c08af Content-length: 1139 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN{\A~&*7[,v in"(]~C /:Kf` ssh.$(OBJ) pageantc.$(OBJ) ##-- objects pageant PAGE1 = pageant.$(OBJ) sshrsa.$(OBJ) sshpubk.$(OBJ) sshdes.$(OBJ) sshbn.$(OBJ) PAGE2 = sshmd5.$(OBJ) version.$(OBJ) tree234ageant PAGERC = pageant pageant ##-- console-apps # pscp # plink ##-- LIBS1 = advapi32.lib user32.lib gdi32.lib LIBS2 = comctl32.lib comdlg32.lib LIBS3 = shell32.lib SOCK1 = wsock32.lib SOCK2 = ws2_32.lib all: putty.exe puttytel.exe pscp.exe plink.exe pageantageant.exe: $(PAGE1) $(PAGE2) $(PAGERC) pageant.rsp link $(LFLAGS) -out:pageant.exe @pageantageant.rsp: makefile echo /nologo /subsystem:windows > pageant.rsp echo $(PAGE1) >> pageant.rsp echo $(PAGE2) >> pageant.rsp echo $(PAGERC) >> pageant.rsp echo $(LIBS1) >> pageant.rsp echo $(LIBS2) >> pageant.rsp echo $(LIBS3) >> pageantpageant.$(OBJ): pageant.c ssh.h tree234.h tree234.$(OBJ): tree234.c tree234##-- dependencies pageant.$(RES): pageant.rc pageant.ico pageants.ico ##-- pageant.$(RES): rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 pageant Node-path: putty/pageant.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 18233 Text-content-md5: 42f4e794dbf5a3aeb4c5a1d860a23aba Text-content-sha1: 90a325f4c9d7dd184cdc35d4e0455ee2a7378ca2 Content-length: 18349 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN(((/* * Pageant: the PuTTY Authentication Agent. */ #include #include /* FIXME */ #include "putty.h" /* FIXME */ #include "ssh.h" #include "tree234.h" #define IDI_MAINICON 200 #define IDI_TRAYICON 201 #define WM_XUSER (WM_USER + 0x2000) #define WM_SYSTRAY (WM_XUSER + 6) #define WM_SYSTRAY2 (WM_XUSER + 7) #define WM_CLOSEMEM (WM_XUSER + 10) #define IDM_CLOSE 0x0010 #define IDM_VIEWKEYS 0x0020 #define APPNAME "Pageant" #define MAILSLOTNAME "\\\\.\\mailslot\\pageant_listener" #define SSH_AGENTC_REQUEST_RSA_IDENTITIES 1 #define SSH_AGENT_RSA_IDENTITIES_ANSWER 2 #define SSH_AGENTC_RSA_CHALLENGE 3 #define SSH_AGENT_RSA_RESPONSE 4 #define SSH_AGENT_FAILURE 5 #define SSH_AGENT_SUCCESS 6 #define SSH_AGENTC_ADD_RSA_IDENTITY 7 #define SSH_AGENTC_REMOVE_RSA_IDENTITY 8 HINSTANCE instance; HWND hwnd; HWND keylist; HMENU systray_menu; tree234 *rsakeys; /* * We need this to link with the RSA code, because rsaencrypt() * pads its data with random bytes. Since we only use rsadecrypt(), * which is deterministic, this should never be called. * * If it _is_ called, there is a _serious_ problem, because it * won't generate true random numbers. So we must scream, panic, * and exit immediately if that should happen. */ int random_byte(void) { MessageBox(hwnd, "Internal Error", APPNAME, MB_OK | MB_ICONERROR); exit(0); } /* * This function is needed to link with the DES code. We need not * have it do anything at all. */ void logevent(char *msg) { } #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) #define PUT_32BIT(cp, value) { \ (cp)[0] = (unsigned char)((value) >> 24); \ (cp)[1] = (unsigned char)((value) >> 16); \ (cp)[2] = (unsigned char)((value) >> 8); \ (cp)[3] = (unsigned char)(value); } #define PASSPHRASE_MAXLEN 512 /* * Dialog-box function for the passphrase box. */ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static char *passphrase; switch (msg) { case WM_INITDIALOG: passphrase = (char *)lParam; *passphrase = 0; return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if (*passphrase) EndDialog (hwnd, 1); else MessageBeep (0); return 0; case IDCANCEL: EndDialog (hwnd, 0); return 0; case 102: /* edit box */ if (HIWORD(wParam) == EN_CHANGE) { GetDlgItemText (hwnd, 102, passphrase, PASSPHRASE_MAXLEN-1); passphrase[PASSPHRASE_MAXLEN-1] = '\0'; } return 0; } return 0; case WM_CLOSE: EndDialog (hwnd, 0); return 0; } return 0; } /* * This function loads a key from a file and adds it. */ void add_keyfile(char *filename) { char passphrase[PASSPHRASE_MAXLEN]; struct RSAKey *key; int needs_pass; int ret; int attempts; needs_pass = rsakey_encrypted(filename); attempts = 0; key = malloc(sizeof(*key)); do { if (needs_pass) { int dlgret; dlgret = DialogBoxParam(instance, MAKEINTRESOURCE(210), NULL, PassphraseProc, (LPARAM)passphrase); if (!dlgret) { free(key); return; /* operation cancelled */ } } else *passphrase = '\0'; ret = loadrsakey(filename, key, passphrase); attempts++; } while (ret == -1); if (ret == 0) { MessageBox(NULL, "Couldn't load public key.", APPNAME, MB_OK | MB_ICONERROR); free(key); return; } if (add234(rsakeys, key) != key) free(key); /* already present, don't waste RAM */ } /* * This is the main agent function that answers messages. */ void answer_msg(void *in, int inlen, void **out, int *outlen) { unsigned char *ret; unsigned char *p = in; int type; *out = NULL; /* default `no go' response */ /* * Basic sanity checks. len >= 5, and len[0:4] holds len-4. */ if (inlen < 5 || GET_32BIT(p) != (unsigned long)(inlen-4)) return; /* * Get the message type. */ type = p[4]; p += 5; switch (type) { case SSH_AGENTC_REQUEST_RSA_IDENTITIES: /* * Reply with SSH_AGENT_RSA_IDENTITIES_ANSWER. */ { enum234 e; struct RSAKey *key; int len, nkeys; /* * Count up the number and length of keys we hold. */ len = nkeys = 0; for (key = first234(rsakeys, &e); key; key = next234(&e)) { nkeys++; len += 4; /* length field */ len += ssh1_bignum_length(key->exponent); len += ssh1_bignum_length(key->modulus); len += 4 + strlen(key->comment); } /* * Packet header is the obvious five bytes, plus four * bytes for the key count. */ len += 5 + 4; if ((ret = malloc(len)) != NULL) { PUT_32BIT(ret, len-4); ret[4] = SSH_AGENT_RSA_IDENTITIES_ANSWER; PUT_32BIT(ret+5, nkeys); p = ret + 5 + 4; for (key = first234(rsakeys, &e); key; key = next234(&e)) { PUT_32BIT(p, ssh1_bignum_bitcount(key->modulus)); p += 4; p += ssh1_write_bignum(p, key->exponent); p += ssh1_write_bignum(p, key->modulus); PUT_32BIT(p, strlen(key->comment)); memcpy(p+4, key->comment, strlen(key->comment)); p += 4 + strlen(key->comment); } } } break; case SSH_AGENTC_RSA_CHALLENGE: /* * Reply with either SSH_AGENT_RSA_RESPONSE or * SSH_AGENT_FAILURE, depending on whether we have that key * or not. */ { struct RSAKey reqkey, *key; Bignum challenge, response; unsigned char response_source[48], response_md5[16]; struct MD5Context md5c; int i, len; p += 4; p += ssh1_read_bignum(p, &reqkey.exponent); p += ssh1_read_bignum(p, &reqkey.modulus); p += ssh1_read_bignum(p, &challenge); memcpy(response_source+32, p, 16); p += 16; if (GET_32BIT(p) != 1 || (key = find234(rsakeys, &reqkey, NULL)) == NULL) { freebn(reqkey.exponent); freebn(reqkey.modulus); freebn(challenge); goto failure; } response = rsadecrypt(challenge, key); for (i = 0; i < 32; i++) response_source[i] = bignum_byte(response, 31-i); MD5Init(&md5c); MD5Update(&md5c, response_source, 48); MD5Final(response_md5, &md5c); memset(response_source, 0, 48); /* burn the evidence */ freebn(response); /* and that evidence */ freebn(challenge); /* yes, and that evidence */ freebn(reqkey.exponent); /* and free some memory ... */ freebn(reqkey.modulus); /* ... while we're at it. */ /* * Packet is the obvious five byte header, plus sixteen * bytes of MD5. */ len = 5 + 16; if ((ret = malloc(len)) != NULL) { PUT_32BIT(ret, len-4); ret[4] = SSH_AGENT_RSA_RESPONSE; memcpy(ret+5, response_md5, 16); } } break; #if 0 /* FIXME: implement these */ case SSH_AGENTC_ADD_RSA_IDENTITY: /* * Add to the list and return SSH_AGENT_SUCCESS, or * SSH_AGENT_FAILURE if the key was malformed. */ break; case SSH_AGENTC_REMOVE_RSA_IDENTITY: /* * Remove from the list and return SSH_AGENT_SUCCESS, or * perhaps SSH_AGENT_FAILURE if it wasn't in the list to * start with. */ break; #endif default: failure: /* * Unrecognised message. Return SSH_AGENT_FAILURE. */ if ((ret = malloc(5)) != NULL) { PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_FAILURE; } break; } if (ret) { *out = ret; *outlen = 4 + GET_32BIT(ret); } } /* * Key comparison function for the 2-3-4 tree of RSA keys. */ int cmpkeys(void *av, void *bv) { struct RSAKey *a = (struct RSAKey *)av; struct RSAKey *b = (struct RSAKey *)bv; Bignum am, bm; int alen, blen; am = a->modulus; bm = b->modulus; /* * Compare by length of moduli. */ alen = ssh1_bignum_bitcount(am); blen = ssh1_bignum_bitcount(bm); if (alen > blen) return +1; else if (alen < blen) return -1; /* * Now compare by moduli themselves. */ alen = (alen + 7) / 8; /* byte count */ while (alen-- > 0) { int abyte, bbyte; abyte = bignum_byte(am, alen); bbyte = bignum_byte(bm, alen); if (abyte > bbyte) return +1; else if (abyte < bbyte) return -1; } /* * Give up. */ return 0; } static void error(char *s) { MessageBox(hwnd, s, APPNAME, MB_OK | MB_ICONERROR); } /* * Dialog-box function for the key list box. */ static int CALLBACK KeyListProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { enum234 e; struct RSAKey *key; OPENFILENAME of; char filename[FILENAME_MAX]; switch (msg) { case WM_INITDIALOG: for (key = first234(rsakeys, &e); key; key = next234(&e)) { SendDlgItemMessage (hwnd, 100, LB_ADDSTRING, 0, (LPARAM) key->comment); } return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: keylist = NULL; DestroyWindow(hwnd); return 0; case 101: /* add key */ if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { memset(&of, 0, sizeof(of)); #ifdef OPENFILENAME_SIZE_VERSION_400 of.lStructSize = OPENFILENAME_SIZE_VERSION_400; #else of.lStructSize = sizeof(of); #endif of.hwndOwner = hwnd; of.lpstrFilter = "All Files\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filename; *filename = '\0'; of.nMaxFile = sizeof(filename); of.lpstrFileTitle = NULL; of.lpstrInitialDir = NULL; of.lpstrTitle = "Select Public Key File"; of.Flags = 0; if (GetOpenFileName(&of)) { add_keyfile(filename); } SendDlgItemMessage(hwnd, 100, LB_RESETCONTENT, 0, 0); for (key = first234(rsakeys, &e); key; key = next234(&e)) { SendDlgItemMessage (hwnd, 100, LB_ADDSTRING, 0, (LPARAM) key->comment); } SendDlgItemMessage (hwnd, 100, LB_SETCURSEL, (WPARAM) -1, 0); } return 0; case 102: /* remove key */ if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { int n = SendDlgItemMessage (hwnd, 100, LB_GETCURSEL, 0, 0); if (n == LB_ERR || n == 0) { MessageBeep(0); break; } for (key = first234(rsakeys, &e); key; key = next234(&e)) if (n-- == 0) break; del234(rsakeys, key); freersakey(key); free(key); SendDlgItemMessage(hwnd, 100, LB_RESETCONTENT, 0, 0); for (key = first234(rsakeys, &e); key; key = next234(&e)) { SendDlgItemMessage (hwnd, 100, LB_ADDSTRING, 0, (LPARAM) key->comment); } SendDlgItemMessage (hwnd, 100, LB_SETCURSEL, (WPARAM) -1, 0); } return 0; } return 0; case WM_CLOSE: keylist = NULL; DestroyWindow(hwnd); return 0; } return 0; } static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int ret; static int menuinprogress; switch (message) { case WM_SYSTRAY: if (lParam == WM_RBUTTONUP) { POINT cursorpos; GetCursorPos(&cursorpos); PostMessage(hwnd, WM_SYSTRAY2, cursorpos.x, cursorpos.y); } break; case WM_SYSTRAY2: if (!menuinprogress) { menuinprogress = 1; SetForegroundWindow(hwnd); ret = TrackPopupMenu(systray_menu, TPM_RIGHTALIGN | TPM_BOTTOMALIGN | TPM_RIGHTBUTTON, wParam, lParam, 0, hwnd, NULL); menuinprogress = 0; } break; case WM_COMMAND: case WM_SYSCOMMAND: switch (wParam & ~0xF) { /* low 4 bits reserved to Windows */ case IDM_CLOSE: SendMessage(hwnd, WM_CLOSE, 0, 0); break; case IDM_VIEWKEYS: if (!keylist) { keylist = CreateDialog (instance, MAKEINTRESOURCE(211), NULL, KeyListProc); ShowWindow (keylist, SW_SHOWNORMAL); } break; } break; case WM_DESTROY: PostQuitMessage (0); return 0; case WM_COPYDATA: { COPYDATASTRUCT *cds; void *in, *out, *ret; int inlen, outlen; HANDLE filemap; char mapname[64]; int id; cds = (COPYDATASTRUCT *)lParam; /* * FIXME: use dwData somehow. */ in = cds->lpData; inlen = cds->cbData; answer_msg(in, inlen, &out, &outlen); if (out) { id = 0; do { sprintf(mapname, "PageantReply%08x", ++id); filemap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, outlen+sizeof(int), mapname); } while (filemap == INVALID_HANDLE_VALUE); ret = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, outlen+sizeof(int)); if (ret) { *((int *)ret) = outlen; memcpy(((int *)ret)+1, out, outlen); UnmapViewOfFile(ret); return id; } } else return 0; /* invalid request */ } break; case WM_CLOSEMEM: /* * FIXME! */ break; } return DefWindowProc (hwnd, message, wParam, lParam); } int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { WNDCLASS wndclass; HANDLE mailslot; MSG msg; instance = inst; if (!prev) { wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = inst; wndclass.hIcon = LoadIcon (inst, MAKEINTRESOURCE(IDI_MAINICON)); wndclass.hCursor = LoadCursor (NULL, IDC_IBEAM); wndclass.hbrBackground = GetStockObject (BLACK_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = APPNAME; RegisterClass (&wndclass); } hwnd = keylist = NULL; hwnd = CreateWindow (APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, NULL, NULL, inst, NULL); /* Set up a system tray icon */ { BOOL res; NOTIFYICONDATA tnid; HICON hicon; #ifdef NIM_SETVERSION tnid.uVersion = 0; res = Shell_NotifyIcon(NIM_SETVERSION, &tnid); #endif tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = 1; /* unique within this systray use */ tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; tnid.uCallbackMessage = WM_SYSTRAY; tnid.hIcon = hicon = LoadIcon (instance, MAKEINTRESOURCE(201)); strcpy(tnid.szTip, "Pageant (PuTTY authentication agent)"); res = Shell_NotifyIcon(NIM_ADD, &tnid); if (hicon) DestroyIcon(hicon); systray_menu = CreatePopupMenu(); AppendMenu (systray_menu, MF_ENABLED, IDM_VIEWKEYS, "View Keys"); AppendMenu (systray_menu, MF_ENABLED, IDM_CLOSE, "Terminate"); } ShowWindow (hwnd, SW_HIDE); /* * Create the mailslot. */ { SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; mailslot = CreateMailslot(MAILSLOTNAME, 0, 0, &sa); } /* * Initialise storage for RSA keys. */ rsakeys = newtree234(cmpkeys); while (GetMessage(&msg, NULL, 0, 0) == 1) { TranslateMessage(&msg); DispatchMessage(&msg); } /* Clean up the system tray icon */ { NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = 1; Shell_NotifyIcon(NIM_DELETE, &tnid); DestroyMenu(systray_menu); } exit(msg.wParam); } Node-path: putty/pageant.ico Node-kind: file Node-action: add Prop-content-length: 88 Text-delta: true Text-content-length: 1092 Text-content-md5: 8c20e7258f00f854018808c30d31dcbd Text-content-sha1: 219f03de1754f86888c796e7c3a209c4a76665ab Content-length: 1180 K 15 cvs2svn:cvs-rev V 3 1.1 K 13 svn:mime-type V 24 application/octet-stream PROPS-END SVN666 &(( @pwwwwwxwwwwwwwwwx Lj Lj Lj Lj Lj Lj Lj Ljwwp?c?c( wwwxxpwwwxLxLxLxLxwwxw Node-path: putty/pageant.rc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 963 Text-content-md5: d67d08382cb09ef0ffa4d8b01bc43eba Text-content-sha1: 34dc3bd94c8246cea47f4488938821ae158d98db Content-length: 1079 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN555/* Some compilers, like Borland, don't have winresrc.h */ #ifndef NO_WINRESRC_H #include #endif 200 ICON "pageant.ico" 201 ICON "pageants.ico" 210 DIALOG DISCARDABLE 0, 0, 140, 60 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Pageant: Enter Passphrase" FONT 8, "MS Sans Serif" BEGIN CTEXT "Enter passphrase for key", 100, 10, 6, 120, 8 CTEXT "", 101, 10, 16, 120, 8 EDITTEXT 102, 10, 26, 120, 12, ES_PASSWORD DEFPUSHBUTTON "O&K", IDOK, 20, 42, 40, 14 PUSHBUTTON "&Cancel", IDCANCEL, 80, 42, 40, 14 END 211 DIALOG DISCARDABLE 0, 0, 300, 200 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Pageant Key List" FONT 8, "MS Sans Serif" BEGIN LISTBOX 100, 10, 10, 280, 155, LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Add Key", 101, 60, 162, 60, 14 PUSHBUTTON "&Remove Key", 102, 180, 162, 60, 14 DEFPUSHBUTTON "&Close", IDOK, 240, 182, 50, 14 END Node-path: putty/pageantc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4297 Text-content-md5: 6934af9031a104bb46180d590ad5ede2 Text-content-sha1: b23b2589bf4a3f0109bdc2d9ea9e6e440b4f1075 Content-length: 4413 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN;;;/* * Pageant client code. */ #include #include #include #ifdef TESTMODE #define debug(x) (printf x) #else #define debug(x) #endif int agent_exists(void) { HWND hwnd; hwnd = FindWindow("Pageant", "Pageant"); if (!hwnd) return FALSE; else return TRUE; } void agent_query(void *in, int inlen, void **out, int *outlen) { #if 0 #define MAILSLOTNAME "\\\\.\\mailslot\\pageant_listener" SECURITY_ATTRIBUTES sa; HANDLE my_mailslot, agent_mailslot; char name[64]; char *p; DWORD msglen, byteswritten, bytesread, inid; *out = NULL; *outlen = 0; agent_mailslot = CreateFile(MAILSLOTNAME, GENERIC_WRITE, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL); debug(("opened %s: %p\n", MAILSLOTNAME, agent_mailslot)); if (agent_mailslot == INVALID_HANDLE_VALUE) return; inid = GetCurrentThreadId(); inid--; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; do { sprintf(name, "\\\\.\\mailslot\\pclient_request_%08x", ++inid); /* * Five-minute timeout. */ my_mailslot = CreateMailslot(name, 0, 0, &sa); debug(("mailslot %s: %p\n", name, my_mailslot)); } while (my_mailslot == INVALID_HANDLE_VALUE); Sleep(3000); msglen = strlen(name) + 1 + inlen; p = malloc(msglen); if (!p) { CloseHandle(my_mailslot); CloseHandle(agent_mailslot); return; } strcpy(p, name); memcpy(p+strlen(p)+1, in, inlen); debug(("ooh\n")); if (WriteFile(agent_mailslot, p, msglen, &byteswritten, NULL) == 0) { debug(("eek!\n")); free(p); CloseHandle(my_mailslot); CloseHandle(agent_mailslot); return; } debug(("aah\n")); free(p); CloseHandle(agent_mailslot); WaitForSingleObject(my_mailslot, 3000000); debug(("waited\n")); if (!GetMailslotInfo(my_mailslot, NULL, &msglen, NULL, NULL)) { CloseHandle(my_mailslot); return; } if (msglen == MAILSLOT_NO_MESSAGE) { debug(("no message\n")); CloseHandle(my_mailslot); return; } debug(("msglen=%d\n", msglen)); p = malloc(msglen); if (!p) { CloseHandle(my_mailslot); return; } if (ReadFile(my_mailslot, p, msglen, &bytesread, NULL) == 0 && bytesread == msglen) { *out = p; *outlen = msglen; } CloseHandle(my_mailslot); #endif HWND hwnd; char mapname[64]; HANDLE filemap; void *p, *ret; int id, retlen; COPYDATASTRUCT cds; *out = NULL; *outlen = 0; hwnd = FindWindow("Pageant", "Pageant"); debug(("hwnd is %p\n", hwnd)); if (!hwnd) return; cds.dwData = 0; /* FIXME */ cds.cbData = inlen; cds.lpData = in; id = SendMessage(hwnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds); debug(("return is %d\n", id)); if (id > 0) { sprintf(mapname, "PageantReply%08x", id); filemap = OpenFileMapping(FILE_MAP_READ, FALSE, mapname); debug(("name is `%s', filemap is %p\n", mapname, filemap)); debug(("error is %d\n", GetLastError())); if (filemap != NULL && filemap != INVALID_HANDLE_VALUE) { p = MapViewOfFile(filemap, FILE_MAP_READ, 0, 0, 0); debug(("p is %p\n", p)); if (p) { retlen = *(int *)p; debug(("len is %d\n", retlen)); ret = malloc(retlen); if (ret) { memcpy(ret, ((int *)p) + 1, retlen); *out = ret; *outlen = retlen; } UnmapViewOfFile(p); } CloseHandle(filemap); } /* FIXME: tell agent to close its handle too */ } } #ifdef TESTMODE int main(void) { void *msg; int len; int i; agent_query("\0\0\0\1\1", 5, &msg, &len); debug(("%d:", len)); for (i = 0; i < len; i++) debug((" %02x", ((unsigned char *)msg)[i])); debug(("\n")); return 0; } #endif Node-path: putty/pageants.ico Node-kind: file Node-action: add Prop-content-length: 88 Text-delta: true Text-content-length: 332 Text-content-md5: fe0b946e4fcf82c5462e395b52615006 Text-content-sha1: cbb00a9216fb9cb4be47454a1b94bb3f1770a07d Content-length: 420 K 15 cvs2svn:cvs-rev V 3 1.1 K 13 svn:mime-type V 24 application/octet-stream PROPS-END SVN>>>(( wwwxxpwwwxLxLxLxLxwwxw Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6e584b06781d247d27a43311ae520c29 Text-delta-base-sha1: c4d97a4d754e2ef077b4ad96a656b9fd612c0950 Text-content-length: 137 Text-content-md5: 9ba3512f9741c4dd85a2597ae50e6bd6 Text-content-sha1: cb73ff1f5d8f5ceb7273e9a7aaad7b3e5ecf38f8 Content-length: 177 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNb] ssKExports from pageantc.c */ void agent_query(void *in, int inlen, void **out, int *outlen); int agent_exists(void); Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 14b5634450d5e8408b7934c7bc339a34 Text-delta-base-sha1: d87c9214373b29b3eb7d9e81c6cb607613c47292 Text-content-length: 4706 Text-content-md5: c6d7993141003b99b8baf57f829103e4 Text-content-sha1: 31c7b61e0ae3d76d26ff29e86fea3d61f0025f62 Content-length: 4746 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNZ<=olxb=EtF>yt[}1G~cw_AGENTC_REQUEST_RSA_IDENTITIES 1 #define SSH_AGENT_RSA_IDENTITIES_ANSWER 2 #define SSH_AGENTC_RSA_CHALLENGE 3 #define SSH_AGENT_RSA_RESPONSE 4 #define SSH_AGENT_FAILURE 5 #define SSH_AGENT_SUCCESS 6 #define SSH_AGENTC_ADD_RSA_IDENTITY 7 #define SSH_AGENTC_REMOVE_RSA_IDENTITY 8 pktlen = 0;pktlen += ssh1_bignum_length(bn)p += ssh1_write_bignum(p, bn);agent_exists()) { /* * Attempt RSA authentication using Pageant. */ static unsigned char request[5], *response, *p; static int responselen; static int i, nkeys; static int authed = FALSE; void *r; logevent("Pageant is running. Requesting keys."); /* Request the keys held by the agent. */ PUT_32BIT(request, 1); request[4] = SSH_AGENTC_REQUEST_RSA_IDENTITIES; agent_query(request, 5, &r, &responselen); response = (unsigned char *)r; if (response) { p = response + 5; nkeys = GET_32BIT(p); p += 4; { char buf[64]; sprintf(buf, "Pageant has %d keys", nkeys); logevent(buf); } for (i = 0; i < nkeys; i++) { static struct RSAKey key; static Bignum challenge; { char buf[64]; sprintf(buf, "Trying Pageant key #%d", i); logevent(buf); } p += 4; p += ssh1_read_bignum(p, &key.exponent); p += ssh1_read_bignum(p, &key.modulus); send_packet(SSH1_CMSG_AUTH_RSA, PKT_BIGNUM, key.modulus, PKT_END); crWaitUntil(ispkt); if (pktin.type != SSH1_SMSG_AUTH_RSA_CHALLENGE) { logevent("Key refused"); continue; } logevent("Received RSA challenge"); ssh1_read_bignum(pktin.body, &challenge); { char *agentreq, *q, *ret; int len, retlen; len = 1 + 4; /* message type, bit count */ len += ssh1_bignum_length(key.exponent); len += ssh1_bignum_length(key.modulus); len += ssh1_bignum_length(challenge); len += 16; /* session id */ len += 4; /* response format */ agentreq = malloc(4 + len); PUT_32BIT(agentreq, len); q = agentreq + 4; *q++ = SSH_AGENTC_RSA_CHALLENGE; PUT_32BIT(q, ssh1_bignum_bitcount(key.modulus)); q += 4; q += ssh1_write_bignum(q, key.exponent); q += ssh1_write_bignum(q, key.modulus); q += ssh1_write_bignum(q, challenge); memcpy(q, session_id, 16); q += 16; PUT_32BIT(q, 1); /* response format */ agent_query(agentreq, len+4, &ret, &retlen); free(agentreq); if (ret) { if (ret[4] == SSH_AGENT_RSA_RESPONSE) { logevent("Sending Pageant's response"); send_packet(SSH1_CMSG_AUTH_RSA_RESPONSE, PKT_DATA, ret+5, 16, PKT_END); free(ret); crWaitUntil(ispkt); if (pktin.type == SSH1_SMSG_SUCCESS) { logevent("Pageant's response accepted"); authed = TRUE; } else logevent("Pageant's response not accepted"); } else { logevent("Pageant failed to answer challenge"); free(ret); } } else { logevent("No reply received from Pageant"); } } freebn(key.exponent); freebn(key.modulus); freebn(challenge); if (authed) if (authed) break; } Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 533354c115c11bf89aef20d2c45af59d Text-delta-base-sha1: ca34b73b51b9ea700d04be599c3335ad34b5f539 Text-content-length: 222 Text-content-md5: f5e2e25715f37d90b6dd45ccaddd7c12 Text-content-sha1: 6ef40c1e378556e8da2f5c427761aa3a88bab64e Content-length: 262 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNH9.[-Ms = char *comment;void freersakey(int ssh1_bignum_bitcount(Bignum bn); int ssh1_bignum_length(Bignum bn); int bignum_byte(Bignum bn, int i); int ssh1_write_bignum(void *data, Bignum bn Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d099e1191cf34016f86621a10d947339 Text-delta-base-sha1: 55ad4b29bdb8abfd06b1566c280815ff59af38d3 Text-content-length: 1164 Text-content-md5: 6f710c9415dc629689bd6f87bcdf9f91 Text-content-sha1: 295e7adf27fd884444df3cafb7b75f587d7f1033 Content-length: 1203 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNf_yfy /* * Return the bit count of a bignum, for ssh1 encoding. */ int ssh1_bignum_bitcount(Bignum bn) { int bitcount = bn[0] * 16 - 1; while (bitcount >= 0 && (bn[bitcount/16+1] >> (bitcount % 16)) == 0) bitcount--; return bitcount + 1; } /* * Return the byte length of a bignum when ssh1 encoded. */ int ssh1_bignum_length(Bignum bn) { return 2 + (ssh1_bignum_bitcount(bn)+7)/8; } /* * Return a byte from a bignum; 0 is least significant, etc. */ int bignum_byte(Bignum bn, int i) { if (i >= 2*bn[0]) return 0; /* beyond the end */ else if (i & 1) return (bn[i/2+1] >> 8) & 0xFF; else return (bn[i/2+1] ) & 0xFF; } /* * Write a ssh1-format bignum into a buffer. It is assumed the * buffer is big enough. Returns the number of bytes used. */ int ssh1_write_bignum(void *data, Bignum bn) { unsigned char *p = data; int len = ssh1_bignum_length(bn); int i; int bitc = ssh1_bignum_bitcount(bn); *p++ = (bitc >> 8) & 0xFF; *p++ = (bitc ) & 0xFF; for (i = len-2; i-- ;) *p++ = bignum_byte(bn, i); return len; } Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 459ab615ffe2dbe4d54a72ca12834336 Text-delta-base-sha1: 11f0302b1b6a27346c37e0ba8587bd91e456d517 Text-content-length: 214 Text-content-md5: ae6bfa1da5c6f67f065c8775eb81ef6b Text-content-sha1: e7e90e9cccb46b665faad424b2208e40ac3ec317 Content-length: 253 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNX85uq += 4; if (len-i < j) goto end; key->comment = malloc(j+1); if (key->comment) { memcpy(key->comment, buf+i, j); key->comment[j] = '\0'; } i += j;key Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1992a98269db34c6f6206fc0f289f798 Text-delta-base-sha1: df5e1a55b7e4443a55f342443b07089fec4b6326 Text-content-length: 254 Text-content-md5: bb5cda05cde45eeaf57652a1432339e3 Text-content-sha1: 13db2ae87511b06952643c3f03b4db4db4d0f24d Content-length: 293 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN1 ffvoid freersakey(struct RSAKey *key) { if (key->modulus) freebn(key->modulus); if (key->exponent) freebn(key->exponent); if (key->private_exponent) freebn(key->private_exponent); if (key->comment) free(key->comment) Revision-number: 590 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2000-09-14T15:02:50.000000Z K 7 svn:log V 20 2-3-4 tree routines K 10 svn:author V 5 simon PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 18800 Text-content-md5: 4eacf573dcf0735e21b9ce3b5d81454d Text-content-sha1: a4a73d223d4b4ff0d50919787131065cd40d1a81 Content-length: 18916 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN___/* * tree234.c: reasonably generic 2-3-4 tree routines. Currently * supports insert, delete, find and iterate operations. */ #include #include #include "tree234.h" #define mknew(typ) ( (typ *) malloc (sizeof (typ)) ) #define sfree free #ifdef TEST #define LOG(x) (printf x) #else #define LOG(x) #endif struct tree234_Tag { node234 *root; cmpfn234 cmp; }; struct node234_Tag { node234 *parent; node234 *kids[4]; void *elems[3]; }; /* * Create a 2-3-4 tree. */ tree234 *newtree234(cmpfn234 cmp) { tree234 *ret = mknew(tree234); LOG(("created tree %p\n", ret)); ret->root = NULL; ret->cmp = cmp; return ret; } /* * Free a 2-3-4 tree (not including freeing the elements). */ static void freenode234(node234 *n) { if (!n) return; freenode234(n->kids[0]); freenode234(n->kids[1]); freenode234(n->kids[2]); freenode234(n->kids[3]); sfree(n); } void freetree234(tree234 *t) { freenode234(t->root); sfree(t); } /* * Add an element e to a 2-3-4 tree t. Returns e on success, or if * an existing element compares equal, returns that. */ void *add234(tree234 *t, void *e) { node234 *n, **np, *left, *right; void *orig_e = e; int c; LOG(("adding node %p to tree %p\n", e, t)); if (t->root == NULL) { t->root = mknew(node234); t->root->elems[1] = t->root->elems[2] = NULL; t->root->kids[0] = t->root->kids[1] = NULL; t->root->kids[2] = t->root->kids[3] = NULL; t->root->parent = NULL; t->root->elems[0] = e; LOG((" created root %p\n", t->root)); return orig_e; } np = &t->root; while (*np) { n = *np; LOG((" node %p: %p [%p] %p [%p] %p [%p] %p\n", n, n->kids[0], n->elems[0], n->kids[1], n->elems[1], n->kids[2], n->elems[2], n->kids[3])); if ((c = t->cmp(e, n->elems[0])) < 0) np = &n->kids[0]; else if (c == 0) return n->elems[0]; /* already exists */ else if (n->elems[1] == NULL || (c = t->cmp(e, n->elems[1])) < 0) np = &n->kids[1]; else if (c == 0) return n->elems[1]; /* already exists */ else if (n->elems[2] == NULL || (c = t->cmp(e, n->elems[2])) < 0) np = &n->kids[2]; else if (c == 0) return n->elems[2]; /* already exists */ else np = &n->kids[3]; LOG((" moving to child %d (%p)\n", np - n->kids, *np)); } /* * We need to insert the new element in n at position np. */ left = NULL; right = NULL; while (n) { LOG((" at %p: %p [%p] %p [%p] %p [%p] %p\n", n, n->kids[0], n->elems[0], n->kids[1], n->elems[1], n->kids[2], n->elems[2], n->kids[3])); LOG((" need to insert %p [%p] %p at position %d\n", left, e, right, np - n->kids)); if (n->elems[1] == NULL) { /* * Insert in a 2-node; simple. */ if (np == &n->kids[0]) { LOG((" inserting on left of 2-node\n")); n->kids[2] = n->kids[1]; n->elems[1] = n->elems[0]; n->kids[1] = right; n->elems[0] = e; n->kids[0] = left; } else { /* np == &n->kids[1] */ LOG((" inserting on right of 2-node\n")); n->kids[2] = right; n->elems[1] = e; n->kids[1] = left; } if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; if (n->kids[2]) n->kids[2]->parent = n; LOG((" done\n")); break; } else if (n->elems[2] == NULL) { /* * Insert in a 3-node; simple. */ if (np == &n->kids[0]) { LOG((" inserting on left of 3-node\n")); n->kids[3] = n->kids[2]; n->elems[2] = n->elems[1]; n->kids[2] = n->kids[1]; n->elems[1] = n->elems[0]; n->kids[1] = right; n->elems[0] = e; n->kids[0] = left; } else if (np == &n->kids[1]) { LOG((" inserting in middle of 3-node\n")); n->kids[3] = n->kids[2]; n->elems[2] = n->elems[1]; n->kids[2] = right; n->elems[1] = e; n->kids[1] = left; } else { /* np == &n->kids[2] */ LOG((" inserting on right of 3-node\n")); n->kids[3] = right; n->elems[2] = e; n->kids[2] = left; } if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; if (n->kids[2]) n->kids[2]->parent = n; if (n->kids[3]) n->kids[3]->parent = n; LOG((" done\n")); break; } else { node234 *m = mknew(node234); m->parent = n->parent; LOG((" splitting a 4-node; created new node %p\n", m)); /* * Insert in a 4-node; split into a 2-node and a * 3-node, and move focus up a level. * * I don't think it matters which way round we put the * 2 and the 3. For simplicity, we'll put the 3 first * always. */ if (np == &n->kids[0]) { m->kids[0] = left; m->elems[0] = e; m->kids[1] = right; m->elems[1] = n->elems[0]; m->kids[2] = n->kids[1]; e = n->elems[1]; n->kids[0] = n->kids[2]; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; } else if (np == &n->kids[1]) { m->kids[0] = n->kids[0]; m->elems[0] = n->elems[0]; m->kids[1] = left; m->elems[1] = e; m->kids[2] = right; e = n->elems[1]; n->kids[0] = n->kids[2]; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; } else if (np == &n->kids[2]) { m->kids[0] = n->kids[0]; m->elems[0] = n->elems[0]; m->kids[1] = n->kids[1]; m->elems[1] = n->elems[1]; m->kids[2] = left; /* e = e; */ n->kids[0] = right; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; } else { /* np == &n->kids[3] */ m->kids[0] = n->kids[0]; m->elems[0] = n->elems[0]; m->kids[1] = n->kids[1]; m->elems[1] = n->elems[1]; m->kids[2] = n->kids[2]; n->kids[0] = left; n->elems[0] = e; n->kids[1] = right; e = n->elems[2]; } m->kids[3] = n->kids[3] = n->kids[2] = NULL; m->elems[2] = n->elems[2] = n->elems[1] = NULL; if (m->kids[0]) m->kids[0]->parent = m; if (m->kids[1]) m->kids[1]->parent = m; if (m->kids[2]) m->kids[2]->parent = m; if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; LOG((" left (%p): %p [%p] %p [%p] %p\n", m, m->kids[0], m->elems[0], m->kids[1], m->elems[1], m->kids[2])); LOG((" right (%p): %p [%p] %p\n", n, n->kids[0], n->elems[0], n->kids[1])); left = m; right = n; } if (n->parent) np = (n->parent->kids[0] == n ? &n->parent->kids[0] : n->parent->kids[1] == n ? &n->parent->kids[1] : n->parent->kids[2] == n ? &n->parent->kids[2] : &n->parent->kids[3]); n = n->parent; } /* * If we've come out of here by `break', n will still be * non-NULL and we've finished. If we've come here because n is * NULL, we need to create a new root for the tree because the * old one has just split into two. */ if (!n) { LOG((" root is overloaded, split into two\n")); t->root = mknew(node234); t->root->kids[0] = left; t->root->elems[0] = e; t->root->kids[1] = right; t->root->elems[1] = NULL; t->root->kids[2] = NULL; t->root->elems[2] = NULL; t->root->kids[3] = NULL; t->root->parent = NULL; if (t->root->kids[0]) t->root->kids[0]->parent = t->root; if (t->root->kids[1]) t->root->kids[1]->parent = t->root; LOG((" new root is %p [%p] %p\n", t->root->kids[0], t->root->elems[0], t->root->kids[1])); } return orig_e; } /* * Find an element e in a 2-3-4 tree t. Returns NULL if not found. * e is always passed as the first argument to cmp, so cmp can be * an asymmetric function if desired. cmp can also be passed as * NULL, in which case the compare function from the tree proper * will be used. */ void *find234(tree234 *t, void *e, cmpfn234 cmp) { node234 *n; int c; if (t->root == NULL) return NULL; if (cmp == NULL) cmp = t->cmp; n = t->root; while (n) { if ( (c = t->cmp(e, n->elems[0])) < 0) n = n->kids[0]; else if (c == 0) return n->elems[0]; else if (n->elems[1] == NULL || (c = t->cmp(e, n->elems[1])) < 0) n = n->kids[1]; else if (c == 0) return n->elems[1]; else if (n->elems[2] == NULL || (c = t->cmp(e, n->elems[2])) < 0) n = n->kids[2]; else if (c == 0) return n->elems[2]; else n = n->kids[3]; } /* * We've found our way to the bottom of the tree and we know * where we would insert this node if we wanted to. But it * isn't there. */ return NULL; } /* * Delete an element e in a 2-3-4 tree. Does not free the element, * merely removes all links to it from the tree nodes. */ void *del234(tree234 *t, void *e) { node234 *n; int ei = -1; n = t->root; LOG(("deleting %p from tree %p\n", e, t)); while (1) { while (n) { int c; int ki; node234 *sub; LOG((" node %p: %p [%p] %p [%p] %p [%p] %p\n", n, n->kids[0], n->elems[0], n->kids[1], n->elems[1], n->kids[2], n->elems[2], n->kids[3])); if ((c = t->cmp(e, n->elems[0])) < 0) { ki = 0; } else if (c == 0) { ei = 0; break; } else if (n->elems[1] == NULL || (c = t->cmp(e, n->elems[1])) < 0) { ki = 1; } else if (c == 0) { ei = 1; break; } else if (n->elems[2] == NULL || (c = t->cmp(e, n->elems[2])) < 0) { ki = 2; } else if (c == 0) { ei = 2; break; } else { ki = 3; } /* * Recurse down to subtree ki. If it has only one element, * we have to do some transformation to start with. */ LOG((" moving to subtree %d\n", ki)); sub = n->kids[ki]; if (!sub->elems[1]) { LOG((" subtree has only one element!\n", ki)); if (ki > 0 && n->kids[ki-1]->elems[1]) { /* * Case 3a, left-handed variant. Child ki has * only one element, but child ki-1 has two or * more. So we need to move a subtree from ki-1 * to ki. * * . C . . B . * / \ -> / \ * [more] a A b B c d D e [more] a A b c C d D e */ node234 *sib = n->kids[ki-1]; int lastelem = (sib->elems[2] ? 2 : sib->elems[1] ? 1 : 0); sub->kids[2] = sub->kids[1]; sub->elems[1] = sub->elems[0]; sub->kids[1] = sub->kids[0]; sub->elems[0] = n->elems[ki-1]; sub->kids[0] = sib->kids[lastelem+1]; n->elems[ki-1] = sib->elems[lastelem]; sib->kids[lastelem+1] = NULL; sib->elems[lastelem] = NULL; LOG((" case 3a left\n")); } else if (ki < 3 && n->kids[ki+1] && n->kids[ki+1]->elems[1]) { /* * Case 3a, right-handed variant. ki has only * one element but ki+1 has two or more. Move a * subtree from ki+1 to ki. * * . B . . C . * / \ -> / \ * a A b c C d D e [more] a A b B c d D e [more] */ node234 *sib = n->kids[ki+1]; int j; sub->elems[1] = n->elems[ki]; sub->kids[2] = sib->kids[0]; n->elems[ki] = sib->elems[0]; sib->kids[0] = sib->kids[1]; for (j = 0; j < 2 && sib->elems[j+1]; j++) { sib->kids[j+1] = sib->kids[j+2]; sib->elems[j] = sib->elems[j+1]; } sib->kids[j+1] = NULL; sib->elems[j] = NULL; LOG((" case 3a right\n")); } else { /* * Case 3b. ki has only one element, and has no * neighbour with more than one. So pick a * neighbour and merge it with ki, taking an * element down from n to go in the middle. * * . B . . * / \ -> | * a A b c C d a A b B c C d * * (Since at all points we have avoided * descending to a node with only one element, * we can be sure that n is not reduced to * nothingness by this move, _unless_ it was * the very first node, ie the root of the * tree. In that case we remove the now-empty * root and replace it with its single large * child as shown.) */ node234 *sib; int j; if (ki > 0) ki--; sib = n->kids[ki]; sub = n->kids[ki+1]; sub->kids[3] = sub->kids[1]; sub->elems[2] = sub->elems[0]; sub->kids[2] = sub->kids[0]; sub->elems[1] = n->elems[ki]; sub->kids[1] = sib->kids[1]; sub->elems[0] = sib->elems[0]; sub->kids[0] = sib->kids[0]; sfree(sib); /* * That's built the big node in sub. Now we * need to remove the reference to sib in n. */ for (j = ki; j < 3 && n->kids[j+1]; j++) { n->kids[j] = n->kids[j+1]; n->elems[j] = j<2 ? n->elems[j+1] : NULL; } n->kids[j] = NULL; if (j < 3) n->elems[j] = NULL; LOG((" case 3b\n")); if (!n->elems[0]) { /* * The root is empty and needs to be * removed. */ LOG((" shifting root!\n")); t->root = sub; sub->parent = NULL; sfree(n); } } } n = sub; } if (ei==-1) return; /* nothing to do; `already removed' */ /* * Treat special case: this is the one remaining item in * the tree. n is the tree root (no parent), has one * element (no elems[1]), and has no kids (no kids[0]). */ if (!n->parent && !n->elems[1] && !n->kids[0]) { LOG((" removed last element in tree\n")); sfree(n); t->root = NULL; return; } /* * Now we have the element we want, as n->elems[ei], and we * have also arranged for that element not to be the only * one in its node. So... */ if (!n->kids[0] && n->elems[1]) { /* * Case 1. n is a leaf node with more than one element, * so it's _really easy_. Just delete the thing and * we're done. */ int i; LOG((" case 1\n")); for (i = ei; i < 3 && n->elems[i+1]; i++) n->elems[i] = n->elems[i+1]; n->elems[i] = NULL; return; /* finished! */ } else if (n->kids[ei]->elems[1]) { /* * Case 2a. n is an internal node, and the root of the * subtree to the left of e has more than one element. * So find the predecessor p to e (ie the largest node * in that subtree), place it where e currently is, and * then start the deletion process over again on the * subtree with p as target. */ node234 *m = n->kids[ei]; void *target; LOG((" case 2a\n")); while (m->kids[0]) { m = (m->kids[3] ? m->kids[3] : m->kids[2] ? m->kids[2] : m->kids[1] ? m->kids[1] : m->kids[0]); } target = (m->elems[2] ? m->elems[2] : m->elems[1] ? m->elems[1] : m->elems[0]); n->elems[ei] = target; n = n->kids[ei]; e = target; } else if (n->kids[ei+1]->elems[1]) { /* * Case 2b, symmetric to 2a but s/left/right/ and * s/predecessor/successor/. (And s/largest/smallest/). */ node234 *m = n->kids[ei+1]; void *target; LOG((" case 2b\n")); while (m->kids[0]) { m = m->kids[0]; } target = m->elems[0]; n->elems[ei] = target; n = n->kids[ei+1]; e = target; } else { /* * Case 2c. n is an internal node, and the subtrees to * the left and right of e both have only one element. * So combine the two subnodes into a single big node * with their own elements on the left and right and e * in the middle, then restart the deletion process on * that subtree, with e still as target. */ node234 *a = n->kids[ei], *b = n->kids[ei+1]; int j; LOG((" case 2c\n")); a->elems[1] = n->elems[ei]; a->kids[2] = b->kids[0]; a->elems[2] = b->elems[0]; a->kids[3] = b->kids[1]; sfree(b); /* * That's built the big node in a, and destroyed b. Now * remove the reference to b (and e) in n. */ for (j = ei; j < 2 && n->elems[j+1]; j++) { n->elems[j] = n->elems[j+1]; n->kids[j+1] = n->kids[j+2]; } n->elems[j] = NULL; n->kids[j+1] = NULL; /* * Now go round the deletion process again, with n * pointing at the new big node and e still the same. */ n = a; } } } /* * Iterate over the elements of a tree234, in order. */ void *first234(tree234 *t, enum234 *e) { node234 *n = t->root; if (!n) return NULL; while (n->kids[0]) n = n->kids[0]; e->node = n; e->posn = 0; return n->elems[0]; } void *next234(enum234 *e) { node234 *n = e->node; int pos = e->posn; if (n->kids[pos+1]) { n = n->kids[pos+1]; while (n->kids[0]) n = n->kids[0]; e->node = n; e->posn = 0; return n->elems[0]; } if (pos == 0 && n->elems[1]) { e->posn = 1; return n->elems[1]; } do { node234 *nn = n->parent; if (nn == NULL) return NULL; /* end of tree */ pos = (nn->kids[0] == n ? 0 : nn->kids[1] == n ? 1 : nn->kids[2] == n ? 2 : 3); n = nn; } while (pos == 3 || n->kids[pos+1] == NULL); e->node = n; e->posn = pos; return n->elems[pos]; } #ifdef TEST int pnode(node234 *n, int level) { printf("%*s%p\n", level*4, "", n); if (n->kids[0]) pnode(n->kids[0], level+1); if (n->elems[0]) printf("%*s\"%s\"\n", level*4+4, "", n->elems[0]); if (n->kids[1]) pnode(n->kids[1], level+1); if (n->elems[1]) printf("%*s\"%s\"\n", level*4+4, "", n->elems[1]); if (n->kids[2]) pnode(n->kids[2], level+1); if (n->elems[2]) printf("%*s\"%s\"\n", level*4+4, "", n->elems[2]); if (n->kids[3]) pnode(n->kids[3], level+1); } int ptree(tree234 *t) { if (t->root) pnode(t->root, 0); else printf("empty tree\n"); } int cmp(void *av, void *bv) { char *a = (char *)av; char *b = (char *)bv; return strcmp(a, b); } int main(void) { tree234 *t = newtree234(cmp); add234(t, "Richard"); add234(t, "Of"); add234(t, "York"); add234(t, "Gave"); add234(t, "Battle"); add234(t, "In"); add234(t, "Vain"); add234(t, "Rabbits"); add234(t, "On"); add234(t, "Your"); add234(t, "Garden"); add234(t, "Bring"); add234(t, "Invisible"); add234(t, "Vegetables"); ptree(t); del234(t, find234(t, "Richard", NULL)); ptree(t); del234(t, find234(t, "Of", NULL)); ptree(t); del234(t, find234(t, "York", NULL)); ptree(t); del234(t, find234(t, "Gave", NULL)); ptree(t); del234(t, find234(t, "Battle", NULL)); ptree(t); del234(t, find234(t, "In", NULL)); ptree(t); del234(t, find234(t, "Vain", NULL)); ptree(t); del234(t, find234(t, "Rabbits", NULL)); ptree(t); del234(t, find234(t, "On", NULL)); ptree(t); del234(t, find234(t, "Your", NULL)); ptree(t); del234(t, find234(t, "Garden", NULL)); ptree(t); del234(t, find234(t, "Bring", NULL)); ptree(t); del234(t, find234(t, "Invisible", NULL)); ptree(t); del234(t, find234(t, "Vegetables", NULL)); ptree(t); } #endif Revision-number: 591 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2000-09-14T15:04:05.000000Z K 7 svn:log V 26 Source form of win_res.rc K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.inp Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 13837 Text-content-md5: f1f92c466a83d2631b551ad7a6edfb40 Text-content-sha1: 78ece60703cac098e8c4d437780abf13091ef7cf Content-length: 13953 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* Some compilers, like Borland, don't have winresrc.h */ #ifndef NO_WINRESRC_H #include #endif /* Some systems don't define this, so I do it myself if necessary */ #ifndef TCS_MULTILINE #define TCS_MULTILINE 0x0200 #endif #include "win_res.h" IDI_MAINICON ICON "putty.ico" IDD_ABOUTBOX DIALOG DISCARDABLE 140, 40, 136, 70 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About PuTTY" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Close", IDOK, 82, 52, 48, 14 PUSHBUTTON "View &Licence", IDA_LICENCE, 6, 52, 70, 14 CTEXT "PuTTY", IDA_TEXT1, 10, 6, 120, 8 CTEXT "", IDA_VERSION, 10, 16, 120, 16 CTEXT "\251 1997-2000 Simon Tatham. All rights reserved.", IDA_TEXT2, 10, 34, 120, 16 END IDD_MAINBOX DIALOG DISCARDABLE 0, 0, 180, 216 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Configuration" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Open", IDOK, 86, 199, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 133, 199, 44, 14 PUSHBUTTON "&About", IDC_ABOUT, 3, 199, 44, 14, NOT WS_TABSTOP CONTROL "", IDC_TAB, #ifdef ASCIICTLS "SysTabControl32", #else L"SysTabControl32", #endif TCS_MULTILINE | WS_TABSTOP, 3, 3, 174, 193 END IDD_RECONF DIALOG DISCARDABLE 0, 0, 180, 216 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Reconfiguration" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Apply", IDOK, 86, 199, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 133, 199, 44, 14 CONTROL "", IDC_TAB, #ifdef ASCIICTLS "SysTabControl32", #else L"SysTabControl32", #endif TCS_MULTILINE | WS_TABSTOP, 3, 3, 174, 193 END IDD_PANEL0 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" INIT(0,176,4,162) SPOS(3,3) BEGIN GRID(4,4,24) LTEXT "Host &Name", IDC0_HOSTSTATIC, COL(1), SS(3,2) EDITTEXT IDC0_HOST, ADJ(8) COL(1), SS(3,3), ES_AUTOHSCROLL LTEXT "&Port", IDC0_PORTSTATIC, COL(4), SS(1,2) EDITTEXT IDC0_PORT, ADJ(8) COL(4), SS(1,3) NEXT GRID(4,8,10) #ifdef FWHACK RTEXT "Protocol:", IDC0_PROTSTATIC, COL(1), SS AUTORADIOBUTTON "&Raw", IDC0_PROTRAW, COL(2), SS, WS_GROUP AUTORADIOBUTTON "&Telnet", IDC0_PROTTELNET, COL(3), SS AUTORADIOBUTTON "SS&H/hack", IDC0_PROTSSH, COL(4), SS #else RTEXT "Protocol:", IDC0_PROTSTATIC, COL(1), SS AUTORADIOBUTTON "&Raw", IDC0_PROTRAW, COL(2), SS, WS_GROUP AUTORADIOBUTTON "&Telnet", IDC0_PROTTELNET, COL(3), SS #ifndef NO_SSH AUTORADIOBUTTON "SS&H", IDC0_PROTSSH, COL(4), SS #endif #endif NEXT GRID(1,8,8) LTEXT "Stor&ed Sessions", IDC0_SESSSTATIC, SCOL GRID(4,12,14) EDITTEXT IDC0_SESSEDIT, COL(1), SS(3), ES_AUTOHSCROLL NEXT GRID(4,71,0) LISTBOX IDC0_SESSLIST, COL(1), SS(3), LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP GRID(4,14,17) PUSHBUTTON "&Load", IDC0_SESSLOAD, COL(4), SS NEXT PUSHBUTTON "&Save", IDC0_SESSSAVE, COL(4), SS NEXT PUSHBUTTON "&Delete", IDC0_SESSDEL, COL(4), SS NEXT GAP(20) GRID(1,8,10) AUTOCHECKBOX "Close &Window on Exit", IDC0_CLOSEEXIT, SCOL AUTOCHECKBOX "Warn on C&lose", IDC0_CLOSEWARN, SCOL END IDD_PANEL1 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" INIT(10,176,8,162) SPOS(3,3) GRID(3) BEGIN LTEXT "Action of Backspace:", IDC1_DELSTATIC, SCOL AUTORADIOBUTTON "Control-&H", IDC1_DEL008, COL(1), SS, WS_GROUP AUTORADIOBUTTON "Control-&? (127)", IDC1_DEL127, COL(2), SS(2) NEXT(2) LTEXT "Action of Home and End:", IDC1_HOMESTATIC, SCOL AUTORADIOBUTTON "&Standard", IDC1_HOMETILDE, COL(1), SS, WS_GROUP AUTORADIOBUTTON "&rxvt", IDC1_HOMERXVT, COL(2), SS NEXT(2) LTEXT "Function key and keypad layout:", IDC1_FUNCSTATIC, SCOL AUTORADIOBUTTON "&VT400", IDC1_FUNCTILDE, COL(1), SS, WS_GROUP AUTORADIOBUTTON "&Linux", IDC1_FUNCLINUX, COL(2), SS AUTORADIOBUTTON "&Xterm R6", IDC1_FUNCXTERM, COL(3), SS NEXT(2) LTEXT "Initial state of cursor keys:", IDC1_CURSTATIC, SCOL AUTORADIOBUTTON "&Normal", IDC1_CURNORMAL, COL(1), SS, WS_GROUP AUTORADIOBUTTON "A&pplication", IDC1_CURAPPLIC, COL(2), SS NEXT(2) LTEXT "Initial state of numeric keypad:", IDC1_KPSTATIC, SCOL AUTORADIOBUTTON "Nor&mal", IDC1_KPNORMAL, COL(1), SS, WS_GROUP AUTORADIOBUTTON "Appl&ication", IDC1_KPAPPLIC, COL(2), SS AUTORADIOBUTTON "N&etHack", IDC1_KPNH, COL(3), SS NEXT(2) AUTOCHECKBOX "ALT-F&4 is special (closes window)", IDC1_ALTF4, SCOL AUTOCHECKBOX "ALT-Space is special (S&ystem menu)", IDC1_ALTSPACE, SCOL AUTOCHECKBOX "&Use local terminal line discipline", IDC1_LDISCTERM, SCOL AUTOCHECKBOX "Reset scrollback on &keypress", IDC1_SCROLLKEY, SCOL END IDD_PANEL2 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" INIT(10,176,8,162) SPOS(3,3) BEGIN GRID(1,8,10) LTEXT "Terminal screen dimensions:", IDC2_DIMSTATIC, SCOL GRID(4,4,15) RTEXT "&Rows", IDC2_ROWSSTATIC, ADJ(2) COL(1), SS(1,2) EDITTEXT IDC2_ROWSEDIT, COL(2), SS(1,3) RTEXT "Colu&mns", IDC2_COLSSTATIC, ADJ(2) COL(3), SS(1,2) EDITTEXT IDC2_COLSEDIT, COL(4), SS(1,3) NEXT RTEXT "&Saved lines of scrollback", IDC2_SAVESTATIC, ADJ(2) COL(1), SS(3,2) EDITTEXT IDC2_SAVEEDIT, COL(4), SS(1,3) NEXT(2) GRID(3,8,0) RTEXT "Font:", IDC2_FONTSTATIC, ADJ(3) COL(1), SS(2) GRID(3,14,17) PUSHBUTTON "C&hange...", IDC2_CHOOSEFONT, COL(3), SS(1) NEXT GRID(1,8,10) AUTOCHECKBOX "Auto &wrap mode initially on", IDC2_WRAPMODE, SCOL AUTOCHECKBOX "&DEC Origin Mode initially on", IDC2_DECOM, SCOL AUTOCHECKBOX "Avoid ever using &icon title", IDC2_WINNAME, SCOL AUTOCHECKBOX "Implicit CR in every &LF", IDC2_LFHASCR, SCOL AUTOCHECKBOX "&Blinking cursor", IDC1_BLINKCUR, SCOL AUTOCHECKBOX "Bee&p enabled", IDC1_BEEP, SCOL AUTOCHECKBOX "Displa&y scrollbar", IDC2_SCROLLBAR, SCOL AUTOCHECKBOX "Loc&k Window size", IDC2_LOCKSIZE, SCOL AUTOCHECKBOX "Use Backgroud colour erase", IDC2_BCE, SCOL AUTOCHECKBOX "Enable blinking text", IDC2_BLINKTEXT, SCOL GAP(6) GAP(6) GAP(6) END IDD_PANEL3 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" INIT(10,176,8,162) SPOS(3,3) BEGIN GRID(2,4,14) LTEXT "Terminal-&type string", IDC3_TTSTATIC, ADJ(2) COL(1), SS(1,2) EDITTEXT IDC3_TTEDIT, COL(2), SS(1,3), ES_AUTOHSCROLL NEXT LTEXT "Terminal-&speed string", IDC3_TSSTATIC, ADJ(2) COL(1), SS(1,2) EDITTEXT IDC3_TSEDIT, COL(2), SS(1,3), ES_AUTOHSCROLL NEXT LTEXT "Auto-login &username", IDC3_LOGSTATIC, ADJ(2) COL(1), SS(1,2) EDITTEXT IDC3_LOGEDIT, COL(2), SS(1,3), ES_AUTOHSCROLL NEXT GAP(8) GRID(1,8,10) LTEXT "Environment variables:", IDC3_ENVSTATIC, SCOL GRID(5,4,14) LTEXT "&Variable", IDC3_VARSTATIC, ADJ(2) COL(1), SS(1,2) EDITTEXT IDC3_VAREDIT, COL(2), SS(1,3), ES_AUTOHSCROLL LTEXT "Va&lue", IDC3_VALSTATIC, ADJ(2) COL(3), SS(1,2) EDITTEXT IDC3_VALEDIT, COL(4), SS(2,3), ES_AUTOHSCROLL NEXT GAP(4) GRID(4,55,0) LISTBOX IDC3_ENVLIST, COL(1), SS(3), LBS_HASSTRINGS | LBS_USETABSTOPS | WS_VSCROLL | WS_TABSTOP GRID(4,14,17) PUSHBUTTON "A&dd", IDC3_ENVADD, COL(4), SS NEXT PUSHBUTTON "&Remove", IDC3_ENVREMOVE, COL(4), SS NEXT GAP(21) GRID(4,8,10) LTEXT "ENVIRON interpretation:", IDC3_EMSTATIC, COL(1), SS(2) AUTORADIOBUTTON "&BSD", IDC3_EMBSD, COL(3), SS, WS_GROUP AUTORADIOBUTTON "R&FC", IDC3_EMRFC, COL(4), SS NEXT END IDD_PANEL35 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" INIT(10,176,8,162) SPOS(3,3) BEGIN GRID(2,4,16) LTEXT "Terminal-&type string", IDC3_TTSTATIC, ADJ(2) COL(1), SS(1,2) EDITTEXT IDC3_TTEDIT, COL(2), SS(1,3), ES_AUTOHSCROLL NEXT GRID(1,8,10) AUTOCHECKBOX "Don't allocate a &pseudo-terminal", IDC3_NOPTY, SCOL GRID(2,4,16) LTEXT "Auto-login &username", IDC3_LOGSTATIC, ADJ(2) COL(1), SS(1,2) EDITTEXT IDC3_LOGEDIT, COL(2), SS(1,3), ES_AUTOHSCROLL NEXT GRID(11,8,10) LTEXT "Cipher:", IDC3_CIPHERSTATIC, COL(1), SS(2) AUTORADIOBUTTON "&3DES", IDC3_CIPHER3DES, COL(3), SS(3), WS_GROUP AUTORADIOBUTTON "&Blowfish", IDC3_CIPHERBLOWF, COL(6), SS(3), WS_GROUP AUTORADIOBUTTON "&DES", IDC3_CIPHERDES, COL(9), SS(3) NEXT GRID(1,8,10) AUTOCHECKBOX "Attempt TIS or CryptoCard authentication", IDC3_AUTHTIS, SCOL NEXT GRID(6,8,10) LTEXT "Prefer protocol version:", IDC3_SSHPROTSTATIC, COL(1), SS(4) AUTORADIOBUTTON "&1", IDC3_SSHPROT1, COL(5), SS, WS_GROUP AUTORADIOBUTTON "&2", IDC3_SSHPROT2, COL(6), SS NEXT GRID(4,4,24) LTEXT "Public key file:", IDC3_PKSTATIC, COL(1), SS(3,2) EDITTEXT IDC3_PKEDIT, ADJ(8) COL(1), SS(3,3), ES_AUTOHSCROLL GRID(4,12,24) PUSHBUTTON "C&hange...", IDC3_PKBUTTON, ADJ(8) COL(4), SS(1) END IDD_PANEL4 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" INIT(10,176,8,162) SPOS(3,3) BEGIN GRID(1,8,10) LTEXT "Action of mouse buttons:", IDC4_MBSTATIC, SCOL AUTORADIOBUTTON "&Windows (Right pastes, Middle extends)", IDC4_MBWINDOWS, SCOL, WS_GROUP AUTORADIOBUTTON "&xterm (Right extends, Middle pastes)", IDC4_MBXTERM, SCOL GAP(4) LTEXT "Character classes:", IDC4_CCSTATIC, SCOL GRID(1,96,100) LISTBOX IDC4_CCLIST, SCOL, LBS_HASSTRINGS | WS_VSCROLL | LBS_USETABSTOPS | LBS_MULTIPLESEL | WS_TABSTOP GRID(1,14,17) PUSHBUTTON "&Set", IDC4_CCSET, 33, CURY, 34, 14 LTEXT "&to class", IDC4_CCSTATIC2, 73, CURY+3, 26, 8 EDITTEXT IDC4_CCEDIT, 105, CURY+1, 36, 12 NEXT END IDD_PANEL5 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER FONT 8, "MS Sans Serif" INIT(10,176,8,162) SPOS(3,3) BEGIN GRID(1,8,10) AUTOCHECKBOX "&Bolded text is a different colour", IDC5_BOLDCOLOUR, SCOL GAP(6) AUTOCHECKBOX "Attempt to use &logical palettes", IDC5_PALETTE, SCOL GAP(6) LTEXT "C&olours:", IDC5_STATIC, SCOL LISTBOX IDC5_LIST, 3, CURY, 100, 110, LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP LTEXT "Red:", IDC5_RSTATIC, 109, CURY, 27, 8 RTEXT "", IDC5_RVALUE, 138, CURY, 27, 8 LTEXT "Green:", IDC5_GSTATIC, 109, CURY+8, 27, 8 RTEXT "", IDC5_GVALUE, 138, CURY+8, 27, 8 LTEXT "Blue:", IDC5_BSTATIC, 109, CURY+16, 27, 8 RTEXT "", IDC5_BVALUE, 138, CURY+16, 27, 8 GAP(90) PUSHBUTTON "C&hange...", IDC5_CHANGE, 109, CURY, 56, 14 GAP(17) END IDD_PANEL6 DIALOG DISCARDABLE 6, 30, 168, 163 STYLE WS_CHILD | WS_VISIBLE FONT 8, "MS Sans Serif" INIT(10,176,8,162) SPOS(3,3) BEGIN GRID(1,8,10) LTEXT "Handling of VT100 line drawing characters:",IDC2_VTSTATIC, SCOL AUTORADIOBUTTON "Font has &XWindows encoding", IDC2_VTXWINDOWS, SCOL, WS_GROUP AUTORADIOBUTTON "Use font in &both ANSI and OEM modes", IDC2_VTOEMANSI, SCOL AUTORADIOBUTTON "Use font in O&EM mode only", IDC2_VTOEMONLY, SCOL AUTORADIOBUTTON "&Poor man's line drawing (""+"", ""-"" and ""|"")", IDC2_VTPOORMAN, SCOL GAP(6) LTEXT "Character set translation:", IDC6_XLATSTATIC, SCOL AUTORADIOBUTTON "&None", IDC6_NOXLAT, SCOL, WS_GROUP AUTORADIOBUTTON "&KOI8 / Win-1251", IDC6_KOI8WIN1251, SCOL AUTORADIOBUTTON "&ISO-8859-2 / Win-1250", IDC6_88592WIN1250, SCOL GAP(6) AUTOCHECKBOX "CA&PS LOCK acts as cyrillic switch", IDC6_CAPSLOCKCYR, SCOL GAP(6) END IDD_LOGBOX DIALOG DISCARDABLE 100, 20, 160, 119 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Event Log" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Close", IDOK, 58, 102, 44, 14 LISTBOX IDN_LIST, 3, 3, 154, 95, LBS_HASSTRINGS | LBS_USETABSTOPS | WS_VSCROLL END IDD_LICENCEBOX DIALOG DISCARDABLE 50, 50, 226, 223 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Licence" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK", IDOK, 98, 203, 44, 14 LTEXT "Copyright \251 1997-2000 Simon Tatham", 1000, 10, 10, 206, 8 LTEXT "Permission is hereby granted, free of charge, to any person", 1002, 10, 26, 206, 8 LTEXT "obtaining a copy of this software and associated documentation", 1003, 10, 34, 206, 8 LTEXT "files (the ""Software""), to deal in the Software without restriction,", 1004, 10, 42, 206, 8 LTEXT "including without limitation the rights to use, copy, modify, merge,", 1005, 10, 50, 206, 8 LTEXT "publish, distribute, sublicense, and/or sell copies of the Software,", 1006, 10, 58, 206, 8 LTEXT "and to permit persons to whom the Software is furnished to do so,", 1007, 10, 66, 206, 8 LTEXT "subject to the following conditions:", 1008, 10, 74, 206, 8 LTEXT "The above copyright notice and this permission notice shall be", 1010, 10, 90, 206, 8 LTEXT "included in all copies or substantial portions of the Software.", 1011, 10, 98, 206, 8 LTEXT "THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT", 1013, 10, 114, 206, 8 LTEXT "WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,", 1014, 10, 122, 206, 8 LTEXT "INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", 1015, 10, 130, 206, 8 LTEXT "MERCHANTABILITY, FITNESS FOR A PARTICULAR", 1016, 10, 138, 206, 8 LTEXT "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL", 1017, 10, 146, 206, 8 LTEXT "SIMON TATHAM BE LIABLE FOR ANY CLAIM, DAMAGES OR", 1018, 10, 154, 206, 8 LTEXT "OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,", 1019, 10, 162, 206, 8 LTEXT "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN", 1020, 10, 170, 206, 8 LTEXT "CONNECTION WITH THE SOFTWARE OR THE USE OR", 1021, 10, 178, 206, 8 LTEXT "OTHER DEALINGS IN THE SOFTWARE.", 1022, 10, 186, 206, 8 END Revision-number: 592 Prop-content-length: 160 Content-length: 160 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-15T10:48:42.000000Z K 7 svn:log V 60 Pageant now accepts an initial key list on the command line PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a452ebbab8f6fed39c0ef5d8c2806dfd Text-delta-base-sha1: 9fba91bdb63b5ebe85ca3a35526dd2503b0c08af Text-content-length: 43 Text-content-md5: a4b1ed7222c594e0f0108f3db9c12fe3 Text-content-sha1: 27a62a2d66072cb9f3f97c2511de9b35662eef54 Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN\uVxd tree234 tree234 Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 42f4e794dbf5a3aeb4c5a1d860a23aba Text-delta-base-sha1: 90a325f4c9d7dd184cdc35d4e0455ee2a7378ca2 Text-content-length: 615 Text-content-md5: f4e4924cc5ee157bd7a22674e5587d63 Text-content-sha1: 80d4addb1e8d8b7b5c995f64544201df5223f6c4 Content-length: 654 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN(PBS} *BInitialise storage for RSA keys. */ rsakeys = newtree234(cmpkeys); /* * Process the command line and add RSA keys as listed on it. * FIXME: we don't support spaces in filenames here. We should. */ { char *p = cmdline; while (*p) { while (*p && isspace(*p)) p++; if (*p && !isspace(*p)) { char *q = p; while (*p && !isspace(*p)) p++; if (*p) *p++ = '\0'; add_keyfile(q); } } } /* * Main message loop. */ Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c6d7993141003b99b8baf57f829103e4 Text-delta-base-sha1: 31c7b61e0ae3d76d26ff29e86fea3d61f0025f62 Text-content-length: 6140 Text-content-md5: 2dedae0dfd9227f74bf0257a208609ac Text-content-sha1: 1ea438569b720488064710dc9ec96fceebe804e6 Content-length: 6180 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN<B,tn3 FW>0llu cz`\tree234MSG_CHANNEL_OPEN_CONFIRMATION 21 #define SSH1_MSG_CHANNEL_OPEN_FAILURE 22 #define SSH1_MSG_CHANNEL_DATA 23 #define SSH1_MSG_CHANNEL_CLOSE 24 #define SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION 25 #define SSH1_CMSG_AGENT_REQUEST_FORWARDING 30 #define SSH1_SMSG_AGENT_OPEN 31static /* * 2-3-4 tree storing channels. */ struct ssh_channel { int remoteid, localid; int type; int closes; union { struct ssh_agent_channel { unsigned char *message; unsigned char msglen[4]; int lensofar, totallen; } a; } u; }; static tree234 *ssh_channels; /* indexed by local id */ static int ssh_channelcmp(void *av, void *bv) { struct ssh_channel *a = (struct ssh_channel *)av; struct ssh_channel *b = (struct ssh_channel *)bv; if (a->localid < b->localid) return -1; if (a->localid > b->localid) return +1; return 0; } static int ssh_channelfind(void *av, void *bv) { int *a = (int *)av; struct ssh_channel *b = (struct ssh_channel *)bv; if (*a < b->localid) return -1; if (*a > b->localid) return +1; return 0; }1 /* FIXME: agent exists && agent forwarding configured */ ) { logevent("Requesting agent forwarding"); send_packet(SSH1_CMSG_AGENT_REQUEST_FORWARDING, PKT_END)logevent("Agent forwarding refused"); } else logevent("Agent forwarding enabled"); }ssh_channels = newtree234(ssh_channelcmp) } else if (pktin.type == SSH1_SMSG_AGENT_OPEN) { /* Remote side is trying to open a channel to talk to our * agent. Give them back a local channel number. */ int i = 1; struct ssh_channel *c; enum234 e; for (c = first234(ssh_channels, &e); c; c = next234(&e)) { if (c->localid > i) break; /* found a free number */ i = c->localid + 1; } c = malloc(sizeof(struct ssh_channel)); c->remoteid = GET_32BIT(pktin.body); c->localid = i; c->type = SSH1_SMSG_AGENT_OPEN; /* identify channel type */ add234(ssh_channels, c); send_packet(SSH1_MSG_CHANNEL_OPEN_CONFIRMATION, PKT_INT, c->remoteid, PKT_INT, c->localid, PKT_END); } else if (pktin.type == SSH1_MSG_CHANNEL_CLOSE || pktin.type == SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION) { /* Remote side closes a channel. */ int i = GET_32BIT(pktin.body); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (c) { int closetype; closetype = (pktin.type == SSH1_MSG_CHANNEL_CLOSE ? 1 : 2); send_packet(pktin.type, PKT_INT, c->remoteid, PKT_END); c->closes |= closetype; if (c->closes == 3) { del234(ssh_channels, c); free(c); } } } else if (pktin.type == SSH1_MSG_CHANNEL_DATA) { /* Data sent down one of our channels. */ int i = GET_32BIT(pktin.body); int len = GET_32BIT(pktin.body+4); unsigned char *p = pktin.body+8; struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (c) { switch(c->type) { case SSH1_SMSG_AGENT_OPEN: /* Data for an agent message. Buffer it. */ while (len > 0) { if (c->u.a.lensofar < 4) { int l = min(4 - c->u.a.lensofar, len); memcpy(c->u.a.msglen + c->u.a.lensofar, p, l); p += l; len -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == 4) { c->u.a.totallen = 4 + GET_32BIT(c->u.a.msglen); c->u.a.message = malloc(c->u.a.totallen); memcpy(c->u.a.message, c->u.a.msglen, 4); } if (c->u.a.lensofar >= 4 && len > 0) { int l = min(c->u.a.totallen - c->u.a.lensofar, len); memcpy(c->u.a.message + c->u.a.lensofar, p, l); p += l; len -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == c->u.a.totallen) { void *reply, *sentreply; int replylen; agent_query(c->u.a.message, c->u.a.totallen, &reply, &replylen); if (reply) sentreply = reply; else { /* Fake SSH_AGENT_FAILURE. */ sentreply = "\0\0\0\1\5"; replylen = 5; } send_packet(SSH1_MSG_CHANNEL_DATA, PKT_INT, c->remoteid, PKT_INT, replylen, PKT_DATA, sentreply, replylen, PKT_END); if (reply) free(reply); free(c->u.a.message); c->u.a.lensofar = 0; } } break; } } Revision-number: 593 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2000-09-15T10:48:42.000000Z K 7 svn:log V 34 Delete should be void not void *. K 10 svn:author V 5 simon PROPS-END Node-path: putty/tree234.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: de582ee4fc80bcf1e55ad2ce7581d303 Text-delta-base-sha1: 6d76d363f88709ea847b05b54a5b1dbbf75bc2e0 Text-content-length: 20 Text-content-md5: 4a01108a8e9d9717e10c123aa9a38ad6 Text-content-sha1: 66abc9050d8acbbe2f3417a160bdf3b652069cac Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNHG > ? Revision-number: 594 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2000-09-15T10:48:42.000000Z K 7 svn:log V 71 Delete should be void not void *; also use correct compare fn in find. K 10 svn:author V 5 simon PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4eacf573dcf0735e21b9ce3b5d81454d Text-delta-base-sha1: a4a73d223d4b4ff0d50919787131065cd40d1a81 Text-content-length: 37 Text-content-md5: 9b8b6f515d5820c63a62633571e32321 Text-content-sha1: 858ecd346e2dd1a71c3f15e4694f7dacc74240ff Content-length: 76 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN_U03699ls Revision-number: 595 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2000-09-15T10:57:15.000000Z K 7 svn:log V 27 A couple of small cleanups K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2dedae0dfd9227f74bf0257a208609ac Text-delta-base-sha1: 1ea438569b720488064710dc9ec96fceebe804e6 Text-content-length: 455 Text-content-md5: 22c608fcf68365983c04320d1ded25ec Text-content-sha1: 3eaa1d49232ba310025799760dd0b3e8593e2896 Content-length: 495 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNj&~T$|Te aH?D static char *commentp; static int commentlencommentlen = GET_32BIT(p); p += 4; commentp = p; p += commentlenc_write("Authenticated using RSA key \"", 29); c_write(commentp, commentlen); c_write("\" from agent\r\n", 14closes = 0 Revision-number: 596 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2000-09-15T11:17:31.000000Z K 7 svn:log V 41 Rationalise accelerators in dialog boxes K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.inp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f1f92c466a83d2631b551ad7a6edfb40 Text-delta-base-sha1: 78ece60703cac098e8c4d437780abf13091ef7cf Text-content-length: 919 Text-content-md5: fd6e5b9bb7bad7d558561b8ea532f155 Text-content-sha1: 509ddc5a9f01129436c8f81e0793ed4e2ecc26fa Content-length: 958 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN\ #K"llkx5Mm5y4w*CH|5tS{5Mn:;Du 85OQr$Vd,4 _/* Accelerators used: cl *//* Accelerators used: aco *//* Accelerators used: ac */ IDD_RECONF/* Accelerators used: [aco] dehlnprstwx */ IDD_PANEL0Window on E&xit", IDC0_CLOSEEXIT, SCOL AUTOCHECKBOX "&Warn on Close", IDC0_CLOSEWARN, SCOL END /* Accelerators used: [aco] 4?ehiklmnprsuvxy *//* Accelerators used: [aco] bdghiklmnprswy */&ground colour erase", IDC2_BCE, SCOL AUTOCHECKBOX "Enable bli&/* Accelerators used: [aco] bdflrstuv */ IDD_PANEL32,4,14/* Accelerators used: [aco] 123bdhkmptu */ IDD_PANEL35&&/* Accelerators used: [aco] stwx *//* Accelerators used: [aco] bhlu */ IDD_PANEL5olo&/* Accelerators used: [aco] beiknpsx */P&S LOCK acts as cyrillic switch", IDC6_CAPSLOCKCYR, SCOL GAP(6) END /* Accelerators used: c *//* No accelerators used */ Revision-number: 597 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2000-09-15T11:26:18.000000Z K 7 svn:log V 42 Configuration option for agent forwarding K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9ba3512f9741c4dd85a2597ae50e6bd6 Text-delta-base-sha1: cb73ff1f5d8f5ceb7273e9a7aaad7b3e5ecf38f8 Text-content-length: 33 Text-content-md5: b8e0dea85bf5a2e2829b35339b40f37f Text-content-sha1: ce27424b04670d90aaebae1e506582e0ff8cf0a5 Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVN]o ;(5int agentfwd Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 22c608fcf68365983c04320d1ded25ec Text-delta-base-sha1: 3eaa1d49232ba310025799760dd0b3e8593e2896 Text-content-length: 56 Text-content-md5: 13c2a2d45f242f0db87c5e2fda35a46e Text-content-sha1: 8fddb2d9d2b874440ffa7f09b670c2389bc305f4 Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNjM bMcfg.agentfwd && agent_exists() Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0fab443d8db4248bb212bdf04e3a1663 Text-delta-base-sha1: 7258e3c8345a3d2f307cc824830abfa7dd0b8a3e Text-content-length: 49 Text-content-md5: 831a19512b1585538799f9e3c6ec8d31 Text-content-sha1: faeae860dbedc019051b005bd29a77d50dcdbb3d Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN/L WYV#define IDC3_AGENTFWD 1030 Node-path: putty/win_res.inp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fd6e5b9bb7bad7d558561b8ea532f155 Text-delta-base-sha1: 509ddc5a9f01129436c8f81e0793ed4e2ecc26fa Text-content-length: 118 Text-content-md5: 90112215051bf8a7ade349a052f40c91 Text-content-sha1: be18bb42573d9ff6a42c6770757635bd4279230f Content-length: 157 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN\7ZwtwYrja NEXT GRID(1,8,10) AUTOCHECKBOX "Allow &agent forwarding", IDC3_AGENTFWD, SCOL Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9799016c837117b8a019a1cde10e0351 Text-delta-base-sha1: 95073c836fae1dcc842b76149257597bac8b47d6 Text-content-length: 1122 Text-content-md5: 609eae5377eba7777f34c20d78c62342 Text-content-sha1: 2faaf223c09385952a6c9801b7bd3f390262877b Content-length: 1162 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN/a L#K"llkx5Miw1u2uwe wN5clvw{P+K%viwuiwH{^Gs$h,d /* Accelerators used: cl *//* Accelerators used: aco *//* Accelerators used: ac */ IDD_RECONF/* Accelerators used: [aco] dehlnprstwx */ IDD_PANEL0Window on E&xit", IDC0_CLOSEEXIT, 3, 130, 162, 8 AUTOCHECKBOX "&Warn on Close", IDC0_CLOSEWARN, 3, 140, 162, 8 END /* Accelerators used: [aco] 4?ehiklmnprsuvxy */ IDD_PANEL1/* Accelerators used: [aco] bdghiklmnprswy */ IDD_PANEL2&ground colour erase", IDC2_BCE, 3, 142, 162, 8 AUTOCHECKBOX "Enable bli&nking text", IDC2_BLINKTEXT, 3, 152, 162, 8 END /* Accelerators used: [aco] bdflrstuv *//* Accelerators used: [aco] 123abdhkmptu */ IDD_PANEL35&& AUTOCHECKBOX "Allow &agent forwarding", IDC3_AGENTFWD, 3, 109, 162, 8 END /* Accelerators used: [aco] stwx */ IDD_PANEL4/* Accelerators used: [aco] bhlu */ IDD_PANEL5olo&/* Accelerators used: [aco] beiknpsx */P&S LOCK acts as cyrillic switch", IDC6_CAPSLOCKCYR, 3, 105, 162, 8 END /* Accelerators used: c *//* No accelerators used */ Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3dae620e14beb0fcfa436bdaa742ece Text-delta-base-sha1: f06cbd800f2522816a17d2e610550ff017a9bf34 Text-content-length: 230 Text-content-md5: 155046afb078a70357243264dec1876c Text-content-sha1: f42f38a55baaf5895a07cacb3f12c93095c0e522 Content-length: 270 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNP&2w|7rWC i (sesskey, "AgentFwd", cfg.agentfwdi (sesskey, "AgentFwd", 0, &cfg.agentfwdDlgButton (hwnd, IDC3_AGENTFWD, cfg.agentfwdAGENTFWDagentfwd = IsDlgButtonChecked (hwnd, IDC3_AGENTFWD Revision-number: 598 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2000-09-15T15:54:04.000000Z K 7 svn:log V 40 Lars Gunnarsson's GUI interface changes K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3ecb6b888ff81ad9c142e93b183a1f4 Text-delta-base-sha1: b0c52124ea948f022474b7f8e5439966e810b2ac Text-content-length: 5469 Text-content-md5: 256c4cbe10b546528fdd8bae13f2c7b3 Text-content-sha1: dcacd0ea5d38cbf2bde3fca93771dbf2b7d2281b Content-length: 5509 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNj8;UH}RF@J.Q}a6H[]8 /+KRhtw%/#n+'6Rr^KT-0>pAdu 5# * Adaptations to enable connecting a GUI by L. Gunnarsson - Sept 2000/* GUI Adaptation - Sept 2000 */ #include #include 0) str[0] = '\0'; } else { hin = GetStdHandle(STD_INPUT_HANDLE); hout = GetStdHandle(STD_OUTPUT_HANDLE); if (hin == INVALID_HANDLE_VALUE || hout == INVALID_HANDLE_VALUE) bump("Cannot get standard input/output handles"); GetConsoleMode(hin, &savemode); SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT); WriteFile(hout, prompt, strlen(prompt), &i, NULL); ReadFile(hin, str, maxlen-1, &i, NULL); SetConsoleMode(hin, savemode); if ((int)i > maxlen) i = maxlen-1; else i = i - 2; str[i] = '\0'; WriteFile(hout, "\r\n", 2, &i, NULL); }tell_user/* GUI Adaptation - Sept 2000 */ if (gui_mode) gui_update_stats(name, size, ((done *100) / size), now-start); else { if (now > start) ratebs = (float) done / (now - start); else ratebs = (float) done; if (ratebs < 1.0) eta = size - done; else eta = (unsigned long) ((size - done) / ratebs); sprintf(etastr, "%02ld:%02ld:%02ld", eta / 3600, (eta % 3600) / 60, eta % 60); pct = (int) (100.0 * (float) done / size); printf("\r%-25.25s | %10ld kB | %5.1f kB/s | ETA: %8s | %3d%%", name, done / 1024, ratebs / 1024.0, etastr, pct); if (done == size) printf("\n"); }tell_usertell_user(stderr, "%s",strtell_usertell_usertell_usertell_user(stderr,tell_usertell_char(stdout, c);/* GUI Adaptation - Sept 2000 */ printf(" -gui hWnd GUI mode with the windows handle for receiving messagesgui") == 0 && i+1 < argc) { gui_hwnd = argv[++i]; gui_mode = 1; } else if (strcmp(argv[i], "-ls") == 0) /* GUI Adaptation - August 2000 */ if (gui_mode) { unsigned int msg_id = WM_RET_ERR_CNT; if (list) msg_id = WM_LS_RET_ERR_CNT; while (!PostMessage( (HWND)atoi(gui_hwnd), msg_id, (WPARAM)errs, 0/*lParam*/ ) ) SleepEx(1000,TRUE); } return (errs == 0 ? 0 : 1); } /* end */ Revision-number: 599 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2000-09-17T07:30:56.000000Z K 7 svn:log V 79 Jacob Nevins provided this workaround for a bug in mingw32's resource compiler K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.inp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 90112215051bf8a7ade349a052f40c91 Text-delta-base-sha1: be18bb42573d9ff6a42c6770757635bd4279230f Text-content-length: 252 Text-content-md5: d6f029a30680a7678526252470da52b3 Text-content-sha1: 2a7dfc818169006e2d1af413d23c1964533b5fdf Content-length: 291 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN7sWmtl#_Fr16J WicwKAAvovfdnI"","","","", IDC2_ROWSEDIT, COL(2), SS(1,3) RTEXT "Colu&mns", IDC2_COLSSTATIC, ADJ(2) COL(3), SS(1,2) EDITTEXT "","","","","","","","","","","", Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 609eae5377eba7777f34c20d78c62342 Text-delta-base-sha1: 2faaf223c09385952a6c9801b7bd3f390262877b Text-content-length: 354 Text-content-md5: bb6487532dfe5b59decc3bdc6ac89990 Text-content-sha1: 5284144891b957f22aede5c6236be810a7f9e843 Content-length: 394 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNaPDq-,>cizKDB@F>tbpXQ<(+cT "", IDC0_HOST, 3, 11, 119, 12, ES_AUTOHSCROLL LTEXT "&Port", IDC0_PORTSTATIC, 129, 3, 35, 8 EDITTEXT "","","","","","","","","", IDC3_VAREDIT, 36, 63, 26, 12, ES_AUTOHSCROLL LTEXT "Va&lue", IDC3_VALSTATIC, 70, 65, 26, 8 EDITTEXT "","","","","", Revision-number: 600 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2000-09-19T08:24:51.000000Z K 7 svn:log V 114 Fix Jacob's fix for mingw32 resource compiler so that it _only_ happens when using the mingw32 resource compiler! K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9c02df22be0b611d694eec089062e2c6 Text-delta-base-sha1: 6f04bfe55713f795aa07ca11c5a8ce2072b1b9f9 Text-content-length: 44 Text-content-md5: 6cf132a87ec05478cc044ad990637400 Text-content-sha1: ce9498432ef5986eda4690f29b42a12ddaa1e7e6 Content-length: 83 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN2I @r@ --define MINGW32_FIX=1 Node-path: putty/win_res.inp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d6f029a30680a7678526252470da52b3 Text-delta-base-sha1: 2a7dfc818169006e2d1af413d23c1964533b5fdf Text-content-length: 143 Text-content-md5: d407e85db20c48a8d44aba459892d4e9 Text-content-sha1: f34aad8a6ccba86a33a37b1c4daa42126f4ea48d Content-length: 182 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNstR2pesq"hEkWFO g xhvt@nu2n+emfdef MINGW32_FIX #define EDITTEXT EDITTEXT "", Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bb6487532dfe5b59decc3bdc6ac89990 Text-delta-base-sha1: 5284144891b957f22aede5c6236be810a7f9e843 Text-content-length: 244 Text-content-md5: ecef997bb230ec4a1ad458320f2bc4f7 Text-content-sha1: 4cf09ac98e61c6a9ae884614528de19bdd8e1ea2 Content-length: 284 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNMp_ei5+Kbzy`~]~_~aEcm,aW;]*SJfdef MINGW32_FIX #define EDITTEXT EDITTEXT "",IDC0_HOST, 3, 11, 119, 12, ES_AUTOHSCROLL LTEXT "&Port", IDC0_PORTSTATIC, 129, 3, 35, 8 EDITTEXT Revision-number: 601 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2000-09-19T16:29:28.000000Z K 7 svn:log V 46 Improved means of IPC between agent and PuTTY K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f4e4924cc5ee157bd7a22674e5587d63 Text-delta-base-sha1: 80d4addb1e8d8b7b5c995f64544201df5223f6c4 Text-content-length: 3964 Text-content-md5: 7246ec9596d43ab7eb50161a17e33fb0 Text-content-sha1: c9a3284ada2e6e6f2adcce2ddee49c8aa722d6e9 Content-length: 4003 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNP^=1S Euk/xXh`NNpiUD t."aclapi #define AGENT_COPYDATA_ID 0x804e50ba /* random goop */ /* * FIXME: maybe some day we can sort this out ... */ #define AGENT_MAX_MSGLEN 8192msg) { unsigned char *p = msg; unsigned char *ret = msg; int type; /* * Get the message type. */ type = p[4]; p += 5;len > AGENT_MAX_MSGLEN) goto failure; /* aaargh! too much stuff! */ PUT_32BIT(ret, len-4); ret[4] = SSH_AGENT_RSA_IDENTITIES_ANSWER; PUT_32BIT(ret+5, nkeys); p = ret + 5 + 4; PUT_32BIT(p, ssh1_bignum_bitcount(key->modulus)); p += 4; p += ssh1_write_bignum(p, key->exponent); p += ssh1_write_bignum(p, key->modulus); PUT_32BIT(p, strlen(key->comment)); memcpy(p+4, key->comment, strlen(key->comment)); p += 4 + strlen(key->comment);PUT_32BIT(ret, len-4); ret[4] = SSH_AGENT_RSA_RESPONSE; memcpy(ret+5, response_md5, 16);PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_FAILURE; breakchar *mapname; void *p; HANDLE filemap, proc; PSID mapowner, procowner; PSECURITY_DESCRIPTOR psd1 = NULL, psd2 = NULL; int ret = 0; cds = (COPYDATASTRUCT *)lParam; if (cds->dwData != AGENT_COPYDATA_ID) return 0; /* not our message, mate */ mapname = (char *)cds->lpData; if (mapname[cds->cbData - 1] != '\0') return 0; /* failure to be ASCIZ! */ #ifdef DEBUG_IPC debug(("mapname is :%s:\r\n", mapname)); #endif filemap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, mapname); #ifdef DEBUG_IPC debug(("filemap is %p\r\n", filemap)); #endif if (filemap != NULL && filemap != INVALID_HANDLE_VALUE) { int rc; if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE, GetCurrentProcessId())) == NULL) { #ifdef DEBUG_IPC debug(("couldn't get handle for process\r\n")); #endif return 0; } if (GetSecurityInfo(proc, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &procowner, NULL, NULL, NULL, &psd2) != ERROR_SUCCESS) { #ifdef DEBUG_IPC debug(("couldn't get owner info for process\r\n")); #endif CloseHandle(proc); return 0; /* unable to get security info */ } CloseHandle(proc); if ((rc = GetSecurityInfo(filemap, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &mapowner, NULL, NULL, NULL, &psd1) != ERROR_SUCCESS)) { #ifdef DEBUG_IPC debug(("couldn't get owner info for filemap: %d\r\n", rc)); #endif return 0; } #ifdef DEBUG_IPC debug(("got security stuff\r\n")); #endif if (!EqualSid(mapowner, procowner)) return 0; /* security ID mismatch! */ #ifdef DEBUG_IPC debug(("security stuff matched\r\n")); #endif LocalFree(psd1); LocalFree(psd2); p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0); #ifdef DEBUG_IPC debug(("p is %p\r\n", p)); {int i; for(i=0;i<5;i++)debug(("p[%d]=%02x\r\n", i, ((unsigned char *)p)[i]));} #endif answer_msg(p); ret = 1; UnmapViewOfFile(p); } CloseHandle(filemap); return ret; } Node-path: putty/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6934af9031a104bb46180d590ad5ede2 Text-delta-base-sha1: b23b2589bf4a3f0109bdc2d9ea9e6e440b4f1075 Text-content-length: 1198 Text-content-md5: ad52755f8895ffa8b0e163dab29c22fe Text-content-sha1: a24ebed175c41f2eb17628e2303c10bfd9352e00 Content-length: 1237 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN;!"^ ^&JNE(define AGENT_COPYDATA_ID 0x804e50ba /* random goop */ #define AGENT_MAX_MSGLEN 8192 #ifdef TESTMODE #define debug(x) (printf x) #else #define debug(x) #endif #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) HWND hwnd; char mapname[64]; HANDLE filemap; unsigned charsprintf(mapname, "PageantRequest%08x", GetCurrentThreadId()); filemap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, AGENT_MAX_MSGLEN, mapname); if (!filemap) return; p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0); memcpy(p, in, inlen); cds.dwData = AGENT_COPYDATA_ID; cds.cbData = 1+strlen(mapname); cds.lpData = mapnameretlen = 4 + GET_32BIT(p); debug(("len is %d\n", retlen)); ret = malloc(retlen); if (ret) { memcpy(ret, p, retlen); *out = ret; *outlen = retlen; } } UnmapViewOfFile(p); CloseHandle(filemap); Revision-number: 602 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-20T10:59:24.000000Z K 7 svn:log V 23 A couple of SSH2 fixes PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 13c2a2d45f242f0db87c5e2fda35a46e Text-delta-base-sha1: 8fddb2d9d2b874440ffa7f09b670c2389bc305f4 Text-content-length: 199 Text-content-md5: ef927865423f3956a8e15d74874f107d Text-content-sha1: db88364e0cf68b77776fcb223beeb362c921439e Content-length: 239 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNMap}yLw D+maclen) { pktin.maxlen = packetlen+maclen; pktin.data = (pktin.data == NULL ? malloc(pktin.maxlen+APIEXTRA) : realloc(pktin.data, pktin.max77 Revision-number: 603 Prop-content-length: 210 Content-length: 210 K 8 svn:date V 27 2000-09-20T11:40:23.000000Z K 7 svn:log V 109 Ensure backend netevent handlers are never reentered - fixes many strange problems with the ssh.c coroutines K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 59a8c7ace5f99de1e155cc4253613b55 Text-delta-base-sha1: aa6f563055bceb67b18a9ff6ad98bcf18caa3722 Text-content-length: 279 Text-content-md5: 728405ee3fd84a30c472652b280bd6f6 Text-content-sha1: d9e33566ebf47ebf92ff8c62c76bbdad8194a751 Content-length: 319 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNd || Zstatic int reentering = 0; if (reentering) return; /* don't unpend the pending */ pending_netevent = FALSE; reentering = 1; i = back->msg (pend_netevent_wParam, pend_netevent_lParam); reentering = 0 Revision-number: 604 Prop-content-length: 174 Content-length: 174 K 7 svn:log V 74 SSH2 is now more plausible - window sizes listened to, basic non-crashing K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-20T14:29:52.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef927865423f3956a8e15d74874f107d Text-delta-base-sha1: db88364e0cf68b77776fcb223beeb362c921439e Text-content-length: 10211 Text-content-md5: 731f1d4747b35b93f536dcac30179b19 Text-content-sha1: 4d033a5f4711712d999da22d8f41feed103ada14 Content-length: 10251 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNah"2@g 3_@( /zCW@aeghdzp\-Z{&R%AHEpZ,{1=<+]jR;B 1 /* 0x1 */ #define SSH1_SMSG_PUBLIC_KEY 2 /* 0x2 */ #define SSH1_CMSG_SESSION_KEY 3 /* 0x3 */ #define SSH1_CMSG_USER 4 /* 0x4 */ #define SSH1_CMSG_AUTH_RSA 6 /* 0x6 */ #define SSH1_SMSG_AUTH_RSA_CHALLENGE 7 /* 0x7 */ #define SSH1_CMSG_AUTH_RSA_RESPONSE 8 /* 0x8 */ #define SSH1_CMSG_AUTH_PASSWORD 9 /* 0x9 */ #define SSH1_CMSG_REQUEST_PTY 10 /* 0xa */ #define SSH1_CMSG_WINDOW_SIZE 11 /* 0xb */ #define SSH1_CMSG_EXEC_SHELL 12 /* 0xc */ #define SSH1_CMSG_EXEC_CMD 13 /* 0xd */ #define SSH1_SMSG_SUCCESS 14 /* 0xe */ #define SSH1_SMSG_FAILURE 15 /* 0xf */ #define SSH1_CMSG_STDIN_DATA 16 /* 0x10 */ #define SSH1_SMSG_STDOUT_DATA 17 /* 0x11 */ #define SSH1_SMSG_STDERR_DATA 18 /* 0x12 */ #define SSH1_CMSG_EOF 19 /* 0x13 */ #define SSH1_SMSG_EXIT_STATUS 20 /* 0x14 */ #define SSH1_MSG_CHANNEL_OPEN_CONFIRMATION 21 /* 0x15 */ #define SSH1_MSG_CHANNEL_OPEN_FAILURE 22 /* 0x16 */ #define SSH1_MSG_CHANNEL_DATA 23 /* 0x17 */ #define SSH1_MSG_CHANNEL_CLOSE 24 /* 0x18 */ #define SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION 25 /* 0x19 */ #define SSH1_CMSG_AGENT_REQUEST_FORWARDING 30 /* 0x1e */ #define SSH1_SMSG_AGENT_OPEN 31 /* 0x1f */ #define SSH1_CMSG_EXIT_CONFIRMATION 33 /* 0x21 */ #define SSH1_MSG_IGNORE 32 /* 0x20 */ #define SSH1_MSG_DEBUG 36 /* 0x24 */ #define SSH1_CMSG_AUTH_TIS 39 /* 0x27 */ #define SSH1_SMSG_AUTH_TIS_CHALLENGE 40 /* 0x28 */ #define SSH1_CMSG_AUTH_TIS_RESPONSE 41 /* 0x29 */ #define SSH1_CMSG_AUTH_CCARD 70 /* 0x46 */ #define SSH1_SMSG_AUTH_CCARD_CHALLENGE 71 /* 0x47 */ #define SSH1_CMSG_AUTH_CCARD_RESPONSE 72 /* 0x48 */ #define SSH1_AUTH_TIS 5 /* 0x5 */ #define SSH1_AUTH_CCARD 16 /* 0x10 */ #define SSH_AGENTC_REQUEST_RSA_IDENTITIES 1 /* 0x1 */ #define SSH_AGENT_RSA_IDENTITIES_ANSWER 2 /* 0x2 */ #define SSH_AGENTC_RSA_CHALLENGE 3 /* 0x3 */ #define SSH_AGENT_RSA_RESPONSE 4 /* 0x4 */ #define SSH_AGENT_FAILURE 5 /* 0x5 */ #define SSH_AGENT_SUCCESS 6 /* 0x6 */ #define SSH_AGENTC_ADD_RSA_IDENTITY 7 /* 0x7 */ #define SSH_AGENTC_REMOVE_RSA_IDENTITY 8 /* 0x8 */ #define SSH2_MSG_DISCONNECT 1 /* 0x1 */ #define SSH2_MSG_IGNORE 2 /* 0x2 */ #define SSH2_MSG_UNIMPLEMENTED 3 /* 0x3 */ #define SSH2_MSG_DEBUG 4 /* 0x4 */ #define SSH2_MSG_SERVICE_REQUEST 5 /* 0x5 */ #define SSH2_MSG_SERVICE_ACCEPT 6 /* 0x6 */ #define SSH2_MSG_KEXINIT 20 /* 0x14 */ #define SSH2_MSG_NEWKEYS 21 /* 0x15 */ #define SSH2_MSG_KEXDH_INIT 30 /* 0x1e */ #define SSH2_MSG_KEXDH_REPLY 31 /* 0x1f */ #define SSH2_MSG_USERAUTH_REQUEST 50 /* 0x32 */ #define SSH2_MSG_USERAUTH_FAILURE 51 /* 0x33 */ #define SSH2_MSG_USERAUTH_SUCCESS 52 /* 0x34 */ #define SSH2_MSG_USERAUTH_BANNER 53 /* 0x35 */ #define SSH2_MSG_USERAUTH_PK_OK 60 /* 0x3c */ #define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60 /* 0x3c */ #define SSH2_MSG_GLOBAL_REQUEST 80 /* 0x50 */ #define SSH2_MSG_REQUEST_SUCCESS 81 /* 0x51 */ #define SSH2_MSG_REQUEST_FAILURE 82 /* 0x52 */ #define SSH2_MSG_CHANNEL_OPEN 90 /* 0x5a */ #define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91 /* 0x5b */ #define SSH2_MSG_CHANNEL_OPEN_FAILURE 92 /* 0x5c */ #define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93 /* 0x5d */ #define SSH2_MSG_CHANNEL_DATA 94 /* 0x5e */ #define SSH2_MSG_CHANNEL_EXTENDED_DATA 95 /* 0x5f */ #define SSH2_MSG_CHANNEL_EOF 96 /* 0x60 */ #define SSH2_MSG_CHANNEL_CLOSE 97 /* 0x61 */ #define SSH2_MSG_CHANNEL_REQUEST 98 /* 0x62 */ #define SSH2_MSG_CHANNEL_SUCCESS 99 /* 0x63 */ #define SSH2_MSG_CHANNEL_FAILURE 100 /* 0x64 */ #define SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED 1 /* 0x1 */ #define SSH2_OPEN_CONNECT_FAILED 2 /* 0x2 */ #define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE 3 /* 0x3 */ #define SSH2_OPEN_RESOURCE_SHORTAGE 4 /* 0x4 */ #define SSH2_EXTENDED_DATA_STDERR 1 /* 0x1 */unsigned struct ssh2_data_channel { unsigned char *outbuffer; unsigned outbuflen, outbufsize; unsigned remwindow, remmaxpkt; } v2unsigned *a = (unsignedstruct ssh_channel *mainchan; /* primary session channel */unsignedunsignedmainchan = malloc(sizeof(struct ssh_channel)); mainchan->localid = 100; /* as good as anymainchan->localid); ssh2_pkt_adduint32(0x7FFFFFFFUL); /* our window size */ ssh2_pkt_adduint32(0x4000UL); /* ourmainchan->localid) { fatalbox("Server's channel confirmation cited wrong channel"); } mainchan->remoteid = ssh2_pkt_getuint32(); mainchan->u.v2.remwindow = ssh2_pkt_getuint32(); mainchan->u.v2.remmaxpkt = ssh2_pkt_getuint32(); mainchan->u.v2.outbuffer = NULL; mainchan->u.v2.outbuflen = mainchan->u.v2.outbufsize = 0mainchan->remoteidmainchan->remoteid crWaitUntilV(ispkt); if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { /* FIXME: be able to handle other channels here */ if (ssh2_pkt_getuint32() != mainchan->localid) continue; /* wrong channel */ mainchan->u.v2.remwindow += ssh2_pkt_getuint32(); } static int try_send; crReturnV; try_send = FALSE/* FIXME: be able to handle other channels here */ if (ssh2_pkt_getuint32() != mainchan->localid { c_write(data, length); /* * Enlarge the window again at the remote side, * just in case it ever runs down and they fail * to send us any more data. */ ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST); ssh2_pkt_adduint32(mainchan->remoteid); ssh2_pkt_adduint32(length); ssh2_pkt_send(); }messageEOF) { continue; /* remote sends EOF; ignore */ } else if (pktin.type == SSH2_MSG_CHANNEL_CLOSE) { /* FIXME: be able to handle other channels here */ if (ssh2_pkt_getuint32() != mainchan->localid) continue; /* wrong channel */ ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(mainchan->remoteid); ssh2_pkt_send(); /* FIXME: mark the channel as closed */ if (1 /* FIXME: "all channels are closed" */) { logevent("All channels closed. Disconnecting"); ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_send(); } continue; /* remote sends close; ignore (FIXME) */ } else if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { /* FIXME: be able to handle other channels here */ if (ssh2_pkt_getuint32() != mainchan->localid) continue; /* wrong channel */ mainchan->u.v2.remwindow += ssh2_pkt_getuint32(); try_send = TRUE /* * We have spare data. Add it to the channel buffer. */ if (mainchan->u.v2.outbufsize < mainchan->u.v2.outbuflen + inlen) { mainchan->u.v2.outbufsize = mainchan->u.v2.outbuflen + inlen + 1024; mainchan->u.v2.outbuffer = srealloc(mainchan->u.v2.outbuffer, mainchan->u.v2.outbufsize); } memcpy(mainchan->u.v2.outbuffer + mainchan->u.v2.outbuflen, in, inlen); mainchan->u.v2.outbuflen += inlen; try_send = TRUE; } if (try_send) { /* * Try to send data on the channel if we can. (FIXME: * on _all_ channels.) */ while (mainchan->u.v2.remwindow > 0 && mainchan->u.v2.outbuflen > 0) { unsigned len = mainchan->u.v2.remwindow; if (len > mainchan->u.v2.outbuflen) len = mainchan->u.v2.outbuflen; if (len > mainchan->u.v2.remmaxpkt) len = mainchan->u.v2.remmaxpkt; ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA); ssh2_pkt_adduint32(mainchan->remoteid); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(mainchan->u.v2.outbuffer, len); ssh2_pkt_send(); mainchan->u.v2.outbuflen -= len; memmove(mainchan->u.v2.outbuffer, mainchan->u.v2.outbuffer+len, mainchan->u.v2.outbuflen); mainchan->u.v2.remwindow -= len; } mainchan->remoteid Revision-number: 605 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2000-09-20T14:58:26.000000Z K 7 svn:log V 27 Remove a spurious WS_GROUP K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.inp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d407e85db20c48a8d44aba459892d4e9 Text-delta-base-sha1: f34aad8a6ccba86a33a37b1c4daa42126f4ea48d Text-content-length: 20 Text-content-md5: 676fa655ddf176f714bb33dc0871701f Text-content-sha1: e4d3246d03848557718814b67aef7956e25acdf7 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNtj 91C Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ecef997bb230ec4a1ad458320f2bc4f7 Text-delta-base-sha1: 4cf09ac98e61c6a9ae884614528de19bdd8e1ea2 Text-content-length: 20 Text-content-md5: 1e20ad01c6474db1ad075990e53489ee Text-content-sha1: 1d4726df90a4ef6cddf791a9899cd6eb234494d4 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN X> 24; \ (cp)[1] = (value) >> 16; \ (cp)[2] = (value) >> 8; \ (cp)[3] = (value)lsb_encrypt_cbc(unsigned char *blk, int len, lsb_decrypt_cbc(unsigned char *blk, int len, msb_encrypt_cbc(unsigned char *blk, int len, MSB_FIRST(blk); xR = GET_32BIT_MMSB_FIRST(blk, iv0); PUT_32BIT_MSB_FIRST(blk+4, iv1)msb_decrypt_cbc(unsigned char *blk, int len, MSB_FIRST(blk); xR = GET_32BIT_MMSB_FIRST(blk, iv0); PUT_32BIT_MMSB_FIRST(key); ectx.iv1 = GET_32BIT_MSB_FIRST(key+4); } static void blowfish_sciv(unsigned char *key) { dctx.iv0 = GET_32BIT_MSB_FIRST(key); dctx.iv1 = GET_32BIT_Mssh1_encrypt_blk(unsigned char *blk, int len) { blowfish_lsb_encrypt_cbc(blk, len, &ectx); } static void blowfish_ssh1_decrypt_blk(unsigned char *blk, int len) { blowfish_lsb_decrypt_cbc(blk, len, &dctx); } static void blowfish_ssh2_encrypt_blk(unsigned char *blk, int len) { blowfish_msb_encrypt_cbc(blk, len, &ectx); } static void blowfish_ssh2_decrypt_blk(unsigned char *blk, int len) { blowfish_msb_decrypt_cbc(blk, len, &dctx); } struct ssh_cipher ssh_blowfish_ssh1 = { blowfish_sesskey, blowfish_csiv, blowfish_cskey, blowfish_sciv, blowfish_sckey, blowfish_ssh1_encrypt_blk, blowfish_ssh1_decrypt_blk, "blowfish-cbc", 8 }; struct ssh_cipher ssh_blowfish_ssh2 = { blowfish_sesskey, blowfish_csiv, blowfish_cskey, blowfish_sciv, blowfish_sckey, blowfish_ssh2_encrypt_blk, blowfish_ssh2_decrypt_blk, "blowfish-cbc", 8 }; Revision-number: 607 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:10.634637Z PROPS-END Revision-number: 608 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2000-09-21T14:34:32.000000Z K 7 svn:log V 55 Miscellaneous ssh2 fixes. plink is now relatively sane K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a8bd8e2afb1afb36efafa18e4ce8c74e Text-delta-base-sha1: dccbef44f53e81714442157bc18e3196f4bbc8f4 Text-content-length: 1329 Text-content-md5: 7c48a7b23680de8c11d87e1010e15efa Text-content-sha1: 6095842a056e997524ac7fd35d34b738c1e41c1b Content-length: 1368 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN0GAjg?m=> mCstatic int get_password(const char *prompt, char *str, int maxlen) { HANDLE hin, hout; DWORD savemode, i; #if 0 /* this allows specifying a password some other way */ if (password) { static int tried_once = 0; if (tried_once) { return 0; } else { strncpy(str, password, maxlen); str[maxlen-1] = '\0'; tried_once = 1; return 1; } } #endif hin = GetStdHandle(STD_INPUT_HANDLE); hout = GetStdHandle(STD_OUTPUT_HANDLE); if (hin == INVALID_HANDLE_VALUE || hout == INVALID_HANDLE_VALUE) { fprintf(stderr, "Cannot get standard input/output handles"); return 0; } GetConsoleMode(hin, &savemode); SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT); WriteFile(hout, prompt, strlen(prompt), &i, NULL); ReadFile(hin, str, maxlen-1, &i, NULL); SetConsoleMode(hin, savemode); if ((int)i > maxlen) i = maxlen-1; else i = i - 2; str[i] = '\0'; WriteFile(hout, "\r\n", 2, &i, NULL); return 1; }ssh_get_password = get_password; flags = FLAG_STDERRv")) { flags |= FLAG_VERBOSEif (!*cfg.remote_cmd) flags |= FLAG_INTERACTIVE; Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b8e0dea85bf5a2e2829b35339b40f37f Text-delta-base-sha1: ce27424b04670d90aaebae1e506582e0ff8cf0a5 Text-content-length: 640 Text-content-md5: dc9e1535975e6a35ad0c38f773671db9 Text-content-sha1: bdbcc17486fd962aaa5151c7100262ef75fe806f Content-length: 680 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNoa ^CZ * FLAG_VERBOSE is set when the user requests verbose details. * * FLAG_STDERR is set in command-line applications (which have a * functioning stderr that it makes sense to write to) and not in * GUI applications (which don't). * * FLAG_INTERACTIVE is set when a full interactive shell session is * being run, _either_ because no remote command has been provided * _or_ because the application is GUI and can't run non- * interactively. */ #define FLAG_VERBOSE 0x0001 #define FLAG_STDERR 0x0002 #define FLAG_INTERACTIVEint (*ssh_get_password)(const char *prompt, char *str, int maxlen); Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 256c4cbe10b546528fdd8bae13f2c7b3 Text-delta-base-sha1: dcacd0ea5d38cbf2bde3fca93771dbf2b7d2281b Text-content-length: 36 Text-content-md5: c47a78eebacbd91ec5dc6ba5308f9386 Text-content-sha1: 2b2c06a6c6c1f703cb352d83138e2ac022f11297 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN8B 5FLAG_STDERR Node-path: putty/scp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cf2c840e585b4c14f4214ecf2b4c307d Text-delta-base-sha1: b5d30a657b52b9f38e61068134d85929c47ba759 Text-content-length: 19 Text-content-md5: 6fdc43bbb6ac570482f9bf35d4aa48c1 Text-content-sha1: 0ba4618db1aa316f50403692aa542156d39a7775 Content-length: 58 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN}2nD9 Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a40240ea2dfa7e4312f4c84725e25d6a Text-delta-base-sha1: bfe6a812ca1e83210786d72ebb474a3b42c259fe Text-content-length: 2102 Text-content-md5: adc95f037da02d18c8a6e28da1ef18c4 Text-content-sha1: b42ab8b278fd7c3878e7029fb9b023ed03329c07 Content-length: 2142 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVNg {-8?Q@)]3(]ot[K+?^(]$ED~[]= 0) { crWaitUntilINTERACTIVE) && !*cfg.username) { c_write("login as: ", 10); ssh_send_ok = 1 if ((flags & FLAG_VERBOSE) || (flags & FLAG_INTERACTIVE)INTERACTIVE)V; } } else { c_write("password: ", 10); ssh_send_ok = 1if (!cfg.nopty) { ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(mainchan->remoteid); /* recipient channel */ ssh2_pkt_addstring("pty-req"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addstring(cfg.termtype); ssh2_pkt_adduint32(cols); ssh2_pkt_adduint32(rows); ssh2_pkt_adduint32(0); /* pixel width */ ssh2_pkt_adduint32(0); /* pixel height */ ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data("\0", 1);/* TTY_OP_END, no special options */ ssh2_pkt_send(); do { crWaitUntilV(ispkt); } } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) { fatalbox("Server got confused by pty request"); } c_write("Server refused to allocate pty\r\n", 32); } else { logevent("Allocated pty"); } } /* * Start a shell or a remote commandif (*cfg.remote_cmd) { ssh2_pkt_addstring("exec"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addstring(cfg.remote_cmd); } else { ssh2_pkt_addstring("shell"); ssh2_pkt_addbool(1); /* want reply */ } logevent("Sent EOF message"); Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 728405ee3fd84a30c472652b280bd6f6 Text-delta-base-sha1: d9e33566ebf47ebf92ff8c62c76bbdad8194a751 Text-content-length: 35 Text-content-md5: 76dfa3e54624f900017842b9a6d7a674 Text-content-sha1: bdd39c7b424b5cc45984b510e5d0230c245a5c20 Content-length: 75 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNy 0>JINTERACTIVE Revision-number: 609 Prop-content-length: 148 Content-length: 148 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-22T09:30:11.000000Z K 7 svn:log V 48 Work around the missing underline in some fonts PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 76dfa3e54624f900017842b9a6d7a674 Text-delta-base-sha1: bdd39c7b424b5cc45984b510e5d0230c245a5c20 Text-content-length: 2128 Text-content-md5: 05f2e117455eac5c2ff94f13fa8c976b Text-content-sha1: 8f0cca9f0226544ef16573339b05cd1625d063fd Content-length: 2168 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNy3$`|$ Ri]W<=int font_needs_hand_underlining/* * Some fonts, e.g. 9-pt Courier, draw their underlines * outside their character cell. We successfully prevent * screen corruption by clipping the text output, but then * we lose the underline completely. Here we try to work * out whether this is such a font, and if it is, we set a * flag that causes underlines to be drawn by hand. * * Having tried other more sophisticated approaches (such * as examining the TEXTMETRIC structure or requesting the * height of a string), I think we'll do this the brute * force way: we create a small bitmap, draw an underlined * space on it, and test to see whether any pixels are * foreground-coloured. (Since we expect the underline to * go all the way across the character cell, we only search * down a single column of the bitmap, half way across.) */ { HDC und_dc; HBITMAP und_bm, und_oldbm; int i, gotit; COLORREF c; und_dc = CreateCompatibleDC(hdc); und_bm = CreateCompatibleBitmap(hdc, font_width, font_height); und_oldbm = SelectObject(und_dc, und_bm); SelectObject(und_dc, fonts[FONT_UNDERLINE]); SetTextAlign(und_dc, TA_TOP | TA_LEFT | TA_NOUPDATECP); SetTextColor (und_dc, RGB(255,255,255)); SetBkColor (und_dc, RGB(0,0,0)); SetBkMode (und_dc, OPAQUE); ExtTextOut (und_dc, 0, 0, ETO_OPAQUE, NULL, " ", 1, NULL); gotit = FALSE; for (i = 0; i < font_height; i++) { c = GetPixel(und_dc, font_width/2, i); if (c != RGB(0,0,0)) gotit = TRUE; } SelectObject(und_dc, und_oldbm); DeleteObject(und_bm); DeleteDC(und_dc); font_needs_hand_underlining = !gotit; } font_needs_hand_underlining && (attr & ATTR_UNDER)) force_manual_underline = 1; Revision-number: 610 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2000-09-22T09:35:06.000000Z K 7 svn:log V 56 Saved-session name box now persists over panel switches K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 155046afb078a70357243264dec1876c Text-delta-base-sha1: f42f38a55baaf5895a07cacb3f12c93095c0e522 Text-content-length: 377 Text-content-md5: 2cd4805c54f33650dbdc0a77a3c7bb6b Text-content-sha1: 7726c13ca6eff78c5ee8c9cf2d71749b7415b50b Content-length: 417 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNM,?"Ti_SshSK>Tchar savedsession[2048];Text (hwnd, IDC0_SESSEDIT, savedsession { GetDlgItemText (hwnd, IDC0_SESSEDIT, savedsession, sizeof(savedsession)-1); savedsession[sizeof(savedsession)-1] = '\0'; } break; case IDC0_SESSSAVEsavedsession[0] = '\0' Revision-number: 611 Prop-content-length: 228 Content-length: 228 K 8 svn:date V 27 2000-09-22T09:38:35.000000Z K 7 svn:log V 127 Closing the About box now returns focus to the config box, and likewise closing the Licence box returns focus to the About box K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2cd4805c54f33650dbdc0a77a3c7bb6b Text-delta-base-sha1: 7726c13ca6eff78c5ee8c9cf2d71749b7415b50b Text-content-length: 138 Text-content-md5: 3287b4641c73f3ebfc8a655c6433a048 Text-content-sha1: afaba07335d3c0026cab789f0091a6df167608a4 Content-length: 178 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNMa?O4 SetActiveWindowGeneralPanelProc (HWND hwnd, UINT msg, SetActiveWindow(hwnd Revision-number: 612 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2000-09-22T09:49:34.000000Z K 7 svn:log V 56 Num Lock shouldn't send anything in non-app-keypad mode K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 05f2e117455eac5c2ff94f13fa8c976b Text-delta-base-sha1: 8f0cca9f0226544ef16573339b05cd1625d063fd Text-content-length: 45 Text-content-md5: 073e50376d1c04a2f99bbfbe6b668c66 Text-content-sha1: 1a8623410721999d37a817e87925c9161446bfda Content-length: 85 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVN3H 6~5if (app_keypad_keys) Revision-number: 613 Prop-content-length: 173 Content-length: 173 K 7 svn:log V 73 Prevent network errors from summarily closing the window when CoE is off K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-22T11:04:57.000000Z PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7c48a7b23680de8c11d87e1010e15efa Text-delta-base-sha1: 6095842a056e997524ac7fd35d34b738c1e41c1b Text-content-length: 42 Text-content-md5: af685a5b1b012888e4a40fe56c8b868d Text-content-sha1: 98f3b83270112b1a04081ad149fc8f1df11c088e Content-length: 81 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNG# ?Oxvoid connection_fatal Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dc9e1535975e6a35ad0c38f773671db9 Text-delta-base-sha1: bdbcc17486fd962aaa5151c7100262ef75fe806f Text-content-length: 49 Text-content-md5: 892b47bc89688f8679d94088bb88f34e Text-content-sha1: 8bfbab71bc11063a6bd6cd22c095092fb3829f5b Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN) ~vconnection_fatal(char *, ... Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 81154764b9f437bedeccf52f97dfd8a1 Text-delta-base-sha1: 591755d7a750848060ffa31a8d222ae56f2620ab Text-content-length: 244 Text-content-md5: 8ad86c5841d71af0d56a337887f5ba3a Text-content-sha1: 3a24efee204417e391885eca364e6d4abce0e30f Content-length: 283 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN!%UIGTp1 { closesocket(s); s = INVALID_SOCKET; return 1; } { /* any _other_ error */ closesocket(s); s = INVALID_SOCKET; return -10000-WSAGetLastError(); } Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c47a78eebacbd91ec5dc6ba5308f9386 Text-delta-base-sha1: 2b2c06a6c6c1f703cb352d83138e2ac022f11297 Text-content-length: 50 Text-content-md5: a4023caecfd97517ce63c3bad4115d18 Text-content-sha1: f870807811935a1b02ed7c210854405e0fde8cc0 Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNBZax9lVvoid connection_fatal Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: adc95f037da02d18c8a6e28da1ef18c4 Text-delta-base-sha1: b42ab8b278fd7c3878e7029fb9b023ed03329c07 Text-content-length: 2779 Text-content-md5: cab235a1c9277564b1fc1fc2be03678d Text-content-sha1: c8a0245c782e3c6f7080f095fabd66c8cb523c2b Content-length: 2819 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN `l(jX$?ADf_M `aKa*Pi=sYkX{~QU0A#vT_0I]BbcID&P|XmR]@IQJu8c(LTN,`JH.Or.bombout(msg) ( ssh_state == SSH_STATE_CLOSED, closesocket(s), \ s = INVALID_SOCKET, connection_fatal msg ) { bombout(("Lost connection while sending")); return; }bombout(("Incorrect CRC received on packet")); crReturn(0 { bombout(("Received data packet with bogus string length")); crReturn(0); } { bombout(("Incorrect MAC received on packet")); crReturn(0); } { bombout(("internal error: Can't handle negative mpints")); return NULL; } { bombout(("Public key packet not received")); crReturn(0); } { bombout(("Encryption not successfully enabled")); crReturn(0); } { bombout(("Bizarre response to offer of public key")); crReturn(0); }bombout(("Bizarre response to RSA authentication response")); crReturn(0bombout(("Strange packet received, type %d", pktin.type)); crReturn(0bombout(("Protocol confusion")); crReturnVbombout(("Protocol confusion")); crReturnVbombout(("Strange packet received: type %d", pktin.type)); crReturnVbombout(("expected key exchange packet from server")); crReturn(0 { bombout(("internal fault: chaos in SSH 2 transport layer")); crReturn(0); }bombout(("expected key exchange packet from server")); crReturn(0 { bombout(("Server failed host key check")); crReturn(0); } { bombout(("expected new-keys packet from server")); crReturn(0); } { bombout(("Server refused user authentication protocol")); crReturnV; }bombout(("Server refused to open a session")); crReturnVbombout(("Server's channel confirmation cited wrong channel")); crReturnVbombout(("Server got confused by pty request")); crReturnVbombout(("Server got confused by shell/command request")); crReturnV; } bombout(("Server refused to start a shell/command")); crReturnV; } else { logevent("Started a shell/commandbombout(("Strange packet received: type %d", pktin.type)); crReturnV { closesocket(s); s = INVALID_SOCKET; return -WSAGETSELECTERROR(lParam); } { /* any _other_ error */ closesocket(s); s = INVALID_SOCKET; return -10000-WSAGetLastError(); }bombout(("Strange packet received: type %d", pktin.type)); return 0 Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7d860ab78b23c87bb64dd439791d1779 Text-delta-base-sha1: c997ce462852f5c2e59555906eeeab7cbe2537fe Text-content-length: 299 Text-content-md5: f831e1f9e709c6b4a99dcaef470ac0f1 Text-content-sha1: ea6fc06003ce5468577c40a4d8c6d591999615f4 Content-length: 339 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN4`tX'o { closesocket(s); s = INVALID_SOCKET; return -WSAGETSELECTERROR(lParam); } { /* any _other_ error */ closesocket(s); s = INVALID_SOCKET; return -10000-WSAGetLastError(); } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 073e50376d1c04a2f99bbfbe6b668c66 Text-delta-base-sha1: 1a8623410721999d37a817e87925c9161446bfda Text-content-length: 308 Text-content-md5: 6f5ecc07107e2c12b27fcc4607d183c4 Text-content-sha1: e74ea6fee8d08e78af1ea20b95656ec98e81e76d Content-length: 348 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNH8 .GJba$TtPrint a message box and close the connection. */ void connection_fatalif (cfg.close_on_exit) PostQuitMessage(1); else { session_closed = TRUE; SetWindowText (hwnd, "PuTTY (inactive)"); } connection_fatal(buf); } if (i < Revision-number: 614 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2000-09-22T13:10:19.000000Z K 7 svn:log V 132 Bug fix: line discipline selection is not enabled until after ssh authentication phase to stop user/password prompts behaving oddly K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: af685a5b1b012888e4a40fe56c8b868d Text-delta-base-sha1: 98f3b83270112b1a04081ad149fc8f1df11c088e Text-content-length: 289 Text-content-md5: 8ba90dabd3611ed0302f8b7374bcf357 Text-content-sha1: b5a593d84dd1f8dc6de5bbb4c5463a87cd083094 Content-length: 328 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN#A}.n`bD%~DWORD orig_console_mode; void begin_session(void) {else SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), orig_console_mode); } void term_out(void) { int reap; DWORD ret;GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &orig_console_mode); Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 892b47bc89688f8679d94088bb88f34e Text-delta-base-sha1: 8bfbab71bc11063a6bd6cd22c095092fb3829f5b Text-content-length: 44 Text-content-md5: ff8262c56d88abb25dce48022364e401 Text-content-sha1: 1ecb6611af8051be2ab6d8c6b20810ba7a0e409b Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN)C KaHvoid begin_session(void Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8ad86c5841d71af0d56a337887f5ba3a Text-delta-base-sha1: 3a24efee204417e391885eca364e6d4abce0e30f Text-content-length: 90 Text-content-md5: 8f89751a2f390098b7d44dc0838b7d00 Text-content-sha1: 248e2c3153056ea69c902160110e79e7b63fff6e Content-length: 129 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN%o DzD1t/* * We have no pre-session phase. */ begin_session(); Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a4023caecfd97517ce63c3bad4115d18 Text-delta-base-sha1: f870807811935a1b02ed7c210854405e0fde8cc0 Text-content-length: 163 Text-content-md5: b744fbb2c378b1ac90e1001bffe3a544 Text-content-sha1: c25197a24632b310694ea5cf51b2984b13522ebf Content-length: 203 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNZu (EThese functions are needed to link with ssh.c, but never get called. */ void term_out(void) { abort(); } void begin_session(void) { Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cab235a1c9277564b1fc1fc2be03678d Text-delta-base-sha1: c8a0245c782e3c6f7080f095fabd66c8cb523c2b Text-content-length: 62 Text-content-md5: 2d8d3efc8aca9a689521c731d927fda7 Text-content-sha1: 17d676c91cda38e891701527faea3f8eeb91dfd6 Content-length: 102 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVN=mkfHKbegin_session(begin_session() Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f831e1f9e709c6b4a99dcaef470ac0f1 Text-delta-base-sha1: ea6fc06003ce5468577c40a4d8c6d591999615f4 Text-content-length: 100 Text-content-md5: 3d4ac8ef03988953759ccba93bd08eba Text-content-sha1: 149d3511928e2738b6b63833cee395d52df69c45 Content-length: 140 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNi JzJ%y /* * We have no pre-session phase. */ begin_session(); Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6f5ecc07107e2c12b27fcc4607d183c4 Text-delta-base-sha1: e74ea6fee8d08e78af1ea20b95656ec98e81e76d Text-content-length: 332 Text-content-md5: 4bdbfef85a5ca5f7c19c5d01f36276dd Text-content-sha1: e0265227dd95fca0d3144dea346afdabd5d53405 Content-length: 372 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN8.*;Oj9[_Ystatic Ldisc *real_ldisc; void begin_session(void) { ldisc = real_ldisc; }real_ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple); /* To start with, we use the simple line discipline, so we can * type passwords etc without fear of them being echoed... */ ldisc = &ldisc_simple Revision-number: 615 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 Enable better build-time flexibility over which WinSock to include K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-22T13:16:49.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a4b1ed7222c594e0f0108f3db9c12fe3 Text-delta-base-sha1: 27a62a2d66072cb9f3f97c2511de9b35662eef54 Text-content-length: 366 Text-content-md5: bf82352084fdd64aa3c21b2d177eecfe Text-content-sha1: 5e23c8569e873b6ee78b15832d3a76619dd1b755 Content-length: 406 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNuU VVdCOMPAT=/DAUTO_WINSOCK # Causes PuTTY to assume that includes its own WinSock # header file, so that it won't try to include . # # - COMPAT=/DWINSOCK_TWO # Causes the PuTTY utilities to include instead of # , except Plink which _needs_ WinSock 2 so it already # does thi Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8ba90dabd3611ed0302f8b7374bcf357 Text-delta-base-sha1: b5a593d84dd1f8dc6de5bbb4c5463a87cd083094 Text-content-length: 66 Text-content-md5: 94f92ee7b3783355208e71b69e3df781 Text-content-sha1: 6a8aae258a86c8b431eacb9449c5664ad7a71787 Content-length: 105 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNA]/EiXfndef AUTO_WINSOCK #include #endif Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8f89751a2f390098b7d44dc0838b7d00 Text-delta-base-sha1: 248e2c3153056ea69c902160110e79e7b63fff6e Text-content-length: 181 Text-content-md5: 94ef4dca366198129d98b608db87f65e Text-content-sha1: a4f454bbe911bab62ca12546e9ecaddb1a32bcc5 Content-length: 221 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNoA""P#include #include #include #ifndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b744fbb2c378b1ac90e1001bffe3a544 Text-delta-base-sha1: c25197a24632b310694ea5cf51b2984b13522ebf Text-content-length: 125 Text-content-md5: b7450dd26886730311465c2a7db818aa Text-content-sha1: 795992ebf8ae67bd2175a693043fe680f7885982 Content-length: 165 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNuG d:d)Lfndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2d8d3efc8aca9a689521c731d927fda7 Text-delta-base-sha1: 17d676c91cda38e891701527faea3f8eeb91dfd6 Text-content-length: 123 Text-content-md5: ebaf4d0d10da5cfaf29eafea870f6e73 Text-content-sha1: 907c0af9ad2cca3f2abb5012777feaf0093880e8 Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVN= dQdZcfndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d4ac8ef03988953759ccba93bd08eba Text-delta-base-sha1: 149d3511928e2738b6b63833cee395d52df69c45 Text-content-length: 184 Text-content-md5: 61798a53184385608fa668f74c6d4f7e Text-content-sha1: 2e52ae0f035902abb95eb7087f8811ddfba20e57 Content-length: 224 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNi;""P#include #include #include #ifndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3287b4641c73f3ebfc8a655c6433a048 Text-delta-base-sha1: afaba07335d3c0026cab789f0091a6df167608a4 Text-content-length: 123 Text-content-md5: 54f1933dae8a32a4f5666ecf624f8979 Text-content-sha1: 5cd5e8dac3ccaaf959d1c3cbdfaf313696e6890c Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNa dBd;Tfndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4bdbfef85a5ca5f7c19c5d01f36276dd Text-delta-base-sha1: e0265227dd95fca0d3144dea346afdabd5d53405 Text-content-length: 167 Text-content-md5: 3ebfe510382501e86a19ae7405258230 Text-content-sha1: f2655752c79f724bf55015fffec14407f041489d Content-length: 207 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN.o?#include #include #ifndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Revision-number: 616 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2000-09-22T13:23:35.000000Z K 7 svn:log V 58 Everyone's favourite trivial change: Shift-Ins now pastes K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ebfe510382501e86a19ae7405258230 Text-delta-base-sha1: f2655752c79f724bf55015fffec14407f041489d Text-content-length: 217 Text-content-md5: 8a40897a592194afb3fac3b17add84d1 Text-content-sha1: ecad3f362b3cb68bc38c8fbba69e314ee2d96ab4 Content-length: 257 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN?=b= ` if (wParam == VK_INSERT && shift_state == 1) { term_mouse (MB_PASTE, MA_CLICK, 0, 0); term_mouse (MB_PASTE, MA_RELEASE, 0, 0); return 0; Revision-number: 617 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 54 Avoid rapid-fire resize events during NT opaque drags K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-22T14:10:58.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8a40897a592194afb3fac3b17add84d1 Text-delta-base-sha1: ecad3f362b3cb68bc38c8fbba69e314ee2d96ab4 Text-content-length: 488 Text-content-md5: 1a408e1b243cf5435aef1aea7d7f6da5 Text-content-sha1: 0c965d3ae3dcc298234880c40bc20ff43b3806aa Content-length: 528 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN?H; X!eZ static int resizingresizing = TRUE; break; case WM_EXITSIZEMOVE: EnableSizeTip(0); resizing = FALSE; back->size( /* * Don't call back->size in mid-resize. (To prevent * massive numbers of resize events getting sent * down the connection during an NT opaque drag.) */ if (!resizing) Revision-number: 618 Prop-content-length: 161 Content-length: 161 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-22T14:24:27.000000Z K 7 svn:log V 61 Make the Event Log scroll down when more things appear on it PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 54f1933dae8a32a4f5666ecf624f8979 Text-delta-base-sha1: 5cd5e8dac3ccaaf959d1c3cbdfaf313696e6890c Text-content-length: 268 Text-content-md5: efc447614efdfa73911fdd48e0fe36d2 Text-content-sha1: d5e1fa98381f4f42101852142813be91c864fd56 Content-length: 308 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNapgp*7 { int count; SendDlgItemMessage (logbox, IDN_LIST, LB_ADDSTRING, 0, (LPARAM)string); count = SendDlgItemMessage (logbox, IDN_LIST, LB_GETCOUNT, 0, 0); SendDlgItemMessage (logbox, IDN_LIST, LB_SETCURSEL, count-1, 0); } Revision-number: 619 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2000-09-22T14:46:26.000000Z K 7 svn:log V 29 Enable copying the Event Log K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 94f92ee7b3783355208e71b69e3df781 Text-delta-base-sha1: 6a8aae258a86c8b431eacb9449c5664ad7a71787 Text-content-length: 139 Text-content-md5: 4eb0ae3619d01040da076906b26cce49 Text-content-sha1: 18a1f640693a76ce68a9500345c223593fbf34b9 Content-length: 178 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN]U u8u(5/* * Stubs for linking with other modules. */ void write_clip (void *data, int len) { } void term_deselect(void) { Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b7450dd26886730311465c2a7db818aa Text-delta-base-sha1: 795992ebf8ae67bd2175a693043fe680f7885982 Text-content-length: 211 Text-content-md5: 2cc6229111dbcc4ebffbe16e54686f67 Text-content-sha1: b25a74d216f4769800e48e43d077f71f2e519efc Content-length: 251 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNG 8"8Dother modules, but * (should) never get called. */ void term_out(void) { abort(); } void begin_session(void) { } void write_clip (void *data, int len) { } void term_deselect(void) { Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 831a19512b1585538799f9e3c6ec8d31 Text-delta-base-sha1: faeae860dbedc019051b005bd29a77d50dcdbb3d Text-content-length: 49 Text-content-md5: 6a34c6dbd5854eee64a786eeb92b445d Text-content-sha1: 8776bb414b4b89246b3e43c79067e8a73bcc58e7 Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNLi fge#define IDN_COPY 1002 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1e20ad01c6474db1ad075990e53489ee Text-delta-base-sha1: 1d4726df90a4ef6cddf791a9899cd6eb234494d4 Text-content-length: 102 Text-content-md5: 4a41603525d0a25647400c8b6e9e6d82 Text-content-sha1: 7846a2c32f052060566b3f11f4b21ea8024c7643 Content-length: 142 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNYF+G+`tASo85, 102, 44, 14 PUSHBUTTON "C&opy", IDN_COPY, 31 | LBS_EXTENDEDSE Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: efc447614efdfa73911fdd48e0fe36d2 Text-delta-base-sha1: d5e1fa98381f4f42101852142813be91c864fd56 Text-content-length: 1623 Text-content-md5: 756ccadb10f99f01f3bd91fa731204ef Text-content-sha1: 949661e8d72f8715951c8a00ee078762cd7392d6 Content-length: 1663 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN /+S; >C case IDN_COPY int selcount; int *selitems; selcount = SendDlgItemMessage(hwnd, IDN_LIST, LB_GETSELCOUNT, 0, 0); selitems = malloc(selcount * sizeof(int)); if (selitems) { int count = SendDlgItemMessage(hwnd, IDN_LIST, LB_GETSELITEMS, selcount, (LPARAM)selitems); int i; int size; char *clipdata; static unsigned char sel_nl[] = SEL_NL; size = 0; for (i = 0; i < count; i++) size += strlen(events[selitems[i]]) + sizeof(sel_nl); clipdata = malloc(size); if (clipdata) { char *p = clipdata; for (i = 0; i < count; i++) { char *q = events[selitems[i]]; int qlen = strlen(q); memcpy(p, q, qlen); p += qlen; memcpy(p, sel_nl, sizeof(sel_nl)); p += sizeof(sel_nl); } write_clip(clipdata, size); term_deselect(); free(clipdata); } free(selitems); } } TOPINDEX Revision-number: 620 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2000-09-25T09:27:26.000000Z K 7 svn:log V 58 Enable PuTTY command line to deal with "user@host" format K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1a408e1b243cf5435aef1aea7d7f6da5 Text-delta-base-sha1: 0c965d3ae3dcc298234880c40bc20ff43b3806aa Text-content-length: 421 Text-content-md5: 4b031950c69415d1937ba4715225798d Text-content-sha1: 9d62f352b9160805b539700fdc92e4f588f040f6 Content-length: 461 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVNH^ g m[ /* See if host is of the form user@host */ if (cfg.host[0] != '\0') { char *atsign = strchr(cfg.host, '@'); /* Make sure we're not overflowing the user field */ if (atsign) { if (atsign-cfg.host < sizeof cfg.username) { strncpy (cfg.username, cfg.host, atsign-cfg.host); cfg.username[atsign-cfg.host] = '\0'; } memmove(cfg.host, atsign+1, 1+strlen(atsign+1)) Revision-number: 621 Prop-content-length: 241 Content-length: 241 K 7 svn:log V 140 Rationalise ordering of authentication operations. Still some work to do, but at least pscp no longer hangs when prompting for a passphrase K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-25T10:14:53.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7246ec9596d43ab7eb50161a17e33fb0 Text-delta-base-sha1: c9a3284ada2e6e6f2adcce2ddee49c8aa722d6e9 Text-content-length: 134 Text-content-md5: 44093ddd0896065459cb5a14c61b3826 Text-content-sha1: a1f279dad23a455eacf724ac4df35fbeea9440d7 Content-length: 173 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN^& n?nye/* FIXME: we can acquire comment here and use it in dialog */ needs_pass = rsakey_encrypted(filename, NULL Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ebaf4d0d10da5cfaf29eafea870f6e73 Text-delta-base-sha1: 907c0af9ad2cca3f2abb5012777feaf0093880e8 Text-content-length: 2930 Text-content-md5: 3b64fc60d3088891f1b686e16ddc6df8 Text-content-sha1: b65a5b275facd7b3cd685495072ff4224bbc67f2 Content-length: 2970 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNlHpQ}xI@I=fK{a]92, `tchar prompt[2 if (pktin.type == SSH1_SMSG_FAILURE && cfg.try_tis_auth && (supported_auths_mask & (1< sizeof(prompt)-1) challengelen = sizeof(prompt)-1; /* prevent overrun */ memcpy(prompt, pktin.body+4, challengelen); prompt[challengelen] = '\0'; } } if (pktin.type == SSH1_SMSG_FAILURE && cfg.try_tis_auth && pwpkt_type = SSH1_CMSG_AUTH_CCARD_RESPONSE; send_packet(SSH1_CMSG_AUTH_CCARD, PKT_END); crWaitUntil(ispkt); if (pktin.type != SSH1_SMSG_AUTH_CCARD_CHALLENGE) { logevent("CryptoCard authentication declined"); c_write("CryptoCard authentication refused.\r\n", 29); } else { int challengelen = ((pktin.body[0] << 24) | (pktin.body[1] << 16) | (pktin.body[2] << 8) | (pktin.body[3])); logevent("Received CryptoCard challenge"); if (challengelen > sizeof(prompt)-1) challengelen = sizeof(prompt)-1; /* prevent overrun */ memcpy(prompt, pktin.body+4, challengelen); strncpy(prompt + challengelen, "\r\nResponse : ", sizeof(prompt)-challengelen); prompt[sizeof(prompt)-1] = '\0'; } } if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { sprintf(prompt, "%.90s@%.90s's password: ", cfg.username, savedhost); } if (pwpkt_type == SSH1_CMSG_AUTH_RSA) { char *comment = NULL; if (flags & FLAG_VERBOSE) c_write("Trying public key authentication.\r\n", 35); if (!rsakey_encrypted(cfg.keyfile, &comment)No passphrase required.\r\n", 25); goto tryauth; } sprintf(prompt, "Passphrase for key \"%.100s\": ", comment); free(comment); } if (!(flags & FLAG_INTERACTIVE)) { c_write(prompt, strlen(prompt)); Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f5e2e25715f37d90b6dd45ccaddd7c12 Text-delta-base-sha1: 6ef40c1e378556e8da2f5c427761aa3a88bab64e Text-content-length: 36 Text-content-md5: e8a3d375008838cf793c6e5b1206e114 Text-content-sha1: ddb0dfe5b746dde5d0f4b6b99d0b79621f0dd83d Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN* 2h2, char **comment Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6f710c9415dc629689bd6f87bcdf9f91 Text-delta-base-sha1: 295e7adf27fd884444df3cafb7b75f587d7f1033 Text-content-length: 103 Text-content-md5: 088abad638fc834ab8dffc982239a0af Text-content-sha1: d2ea17fc27abaeda8678b1fb53ede4b2bc71b8ce Content-length: 142 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN_6 Q^QXif (!result) /* just return length */ return b + 2; Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ae6bfa1da5c6f67f065c8775eb81ef6b Text-delta-base-sha1: e7e90e9cccb46b665faad424b2208e40ac3ec317 Text-content-length: 2434 Text-content-md5: c3acefe8c48e19014337fcc7aab6805d Text-content-sha1: e2be9856993cbf536808bc246ab17f904381c35f Content-length: 2473 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNXx.H|5H.RB@?dZ[Kk~1/* * Generic SSH public-key handling operations. In particular, * reading of SSH public-key files, and also the generic `sign' * operation for ssh2 (which checks the type of the key and * dispatches to the appropriate key-type specific function). */ #include #include #include /* FIXME */ #include /* FIXME */ #include "putty.h"#define dss_signature "-----BEGIN DSA PRIVATE KEY-----\n" #define BASE64_TOINT(x) ( (x)-'A'<26 ? (x)-'A'+0 :\ (x)-'a'<26 ? (x)-'a'+26 :\ (x)-'0'<10 ? (x)-'0'+52 :\ (x)=='+' ? 62 : \ (x)=='/' ? 63 : 0 ) static int loadrsakey_main(FILE *fp, struct RSAKey *key, char **commentptr, char *passphrase) { char *comment; /* Slurp the whole file (minus the header) = 0; /* * A zero byte. (The signature includes a terminating NUL.) */ if (len-i < 1 || buf[i] != 0) goto end; i++; /* Ocomment = malloc(j+1); if (comment) { memcpy(comment, buf+i, j); comment[j] = '\0'; } i += j; if (commentptr) *commentptr = comment; if (key) key->comment = comment; if (!key) { return ciphertype != 0; }64]; fp = fopen(filename, "rb"); if (!fp) return 0; /* doesn't even exist */ /* * Read the first line of the file and see if it's a v1 private * key file. */ if (fgets(buf, sizeof(buf), fp) && !strcmp(buf, rsa_signature)) { return loadrsakey_main(fp, key, NULL, passphrase); } /* * Otherwise, we have nothing. Return empty-handed. */ fclose(fp); return 0; } /* * See whether an RSA key is encrypted. Return its comment field as * well. */ int rsakey_encrypted(char *filename, char **comment) { FILE *fp; unsigned char buf[64]; fp = fopen(filename, "rb"); if (!fp) return 0; /* doesn't even exist */ /* * Read the first line of the file and see if it's a v1 private * key file. */ if (fgets(buf, sizeof(buf), fp) && !strcmp(buf, rsa_signature)) { return loadrsakey_main(fp, NULL, comment, NULL); } return 0; /* wasn't the right kind of file */ } Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bb5cda05cde45eeaf57652a1432339e3 Text-delta-base-sha1: 13db2ae87511b06952643c3f03b4db4db4d0f24d Text-content-length: 361 Text-content-md5: 0bb36e0ff34277c096bf88a5315f4ec2 Text-content-sha1: b1c637f4ed3842db49cad6aa6a1f3a35d3241c11 Content-length: 400 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN Edmpeyn.if (result) { result->bits = 0; for (i=0; i<4; i++) result->bits = (result->bits << 8) + *p++; } else p += 4result ? &result->exponent : NULL); if (result) result ? &result->modulus : NULL); if (order == 1) p += ssh1_read_bignum(p, result ? &result->exponent : NULL Revision-number: 622 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 71 Double-clicking on the Pageant systray icon now brings up the key list K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-25T10:50:54.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 44093ddd0896065459cb5a14c61b3826 Text-delta-base-sha1: a1f279dad23a455eacf724ac4df35fbeea9440d7 Text-content-length: 506 Text-content-md5: 5b42bfe4ae573b4a39aebbd56072fa88 Text-content-sha1: 57f6ec1f073e03e16505d45ecca65b7fd3404bf8 Content-length: 545 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN&XR FIf@ else if (lParam == WM_LBUTTONDBLCLK) { /* Equivalent to IDM_VIEWKEYS. */ PostMessage(hwnd, WM_COMMAND, IDM_VIEWKEYS, 0 /* * Sometimes the window comes up minimised / hidden * for no obvious reason. Prevent this. */ SetForegroundWindow(keylist); SetWindowPos (keylist, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW Revision-number: 623 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2000-09-25T10:55:00.000000Z K 7 svn:log V 76 Pageant now allows filenames with spaces on cmdline. Thanks to Brian Coogan K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5b42bfe4ae573b4a39aebbd56072fa88 Text-delta-base-sha1: 57f6ec1f073e03e16505d45ecca65b7fd3404bf8 Text-content-length: 511 Text-content-md5: 7b6565309a1103f82eae0f2ab1562921 Text-content-sha1: 28c520f97301e699086c57d4a2bc01bce2be9f73 Content-length: 550 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNE\_9!|/ { char *p; int inquotes = 0; , *pp = p; while (*p && (inquotes || !isspace(*p))) { if (*p == '"') { inquotes = !inquotes; p++; continue; } *pp++ = *p++; } if (*pp) { if (*p) p++; *pp++ = '\0'; } Revision-number: 624 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2000-09-25T10:56:56.000000Z K 7 svn:log V 72 Pageant now detects if it is already running and refuses to start if so K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7b6565309a1103f82eae0f2ab1562921 Text-delta-base-sha1: 28c520f97301e699086c57d4a2bc01bce2be9f73 Text-content-length: 277 Text-content-md5: fe96a5ca5282801a46eded994868da25 Text-content-sha1: 66908d9481116b4e86d49a0fc698c2935b77f465 Content-length: 316 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNEDy'y$!/* * First bomb out totally if we are already running. */ if (FindWindow("Pageant", "Pageant")) { MessageBox(NULL, "Pageant is already running", "Pageant Error", MB_ICONERROR | MB_OK); return 0; } Revision-number: 625 Prop-content-length: 224 Content-length: 224 K 7 svn:log V 123 Robert de Bath has a better alternative to revs 1.47/48 [r582,r583]; back out those changes and commit the simpler version K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-25T11:11:46.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b031950c69415d1937ba4715225798d Text-delta-base-sha1: 9d62f352b9160805b539700fdc92e4f588f040f6 Text-content-length: 179 Text-content-md5: 01fdef928162f2421f62906ee4cca72b Text-content-sha1: bc16bea20a2defca04836fccc281e77b7464908c Content-length: 219 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN^,z I#42AdksSYSCOMMAND, SC_KEYMENU if (message == WM_SYSKEYUP && wParam == VK_MENU) { keystate[VK_MENU] = 0; return 0; } Revision-number: 626 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 27 Implement "putty -cleanup" K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-25T15:47:57.000000Z PROPS-END Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9fba2931b8b8f8268f74c6bc2fc4ba79 Text-delta-base-sha1: 71ed2298a1859968d2bf67d1eb4ec80cf2de290c Text-content-length: 180 Text-content-md5: 570ddbaba855561e24b69ebb9fb02bc4 Text-content-sha1: dcdeeffa627e176ae7b5f60f66132a60fb7bd5ec Content-length: 219 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN> RP0from `putty -cleanup'. It removes the * random seed file. */ void random_destroy_seed(void) { if (!seedpath[0]) get_seedpath(); remove(seedpath); Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ff8262c56d88abb25dce48022364e401 Text-delta-base-sha1: 1ecb6611af8051be2ab6d8c6b20810ba7a0e409b Text-content-length: 248 Text-content-md5: 834d7f3a6642ddedb842d9c0a76771b5 Text-content-sha1: 1a42e15c8aab2d17a8593def55407a9e63a333e5 Content-length: 288 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNC+Vb)g`:vM#define PUTTY_REG_PARENT "Software\\SimonTatham" #define PUTTY_REG_PARENT_CHILD "PuTTY" #define PUTTY_REG_GPARENT "Software" #define PUTTY_REG_GPARENT_CHILD "SimonTathamvoid random_destroyvoid registry_cleanup(void Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 756ccadb10f99f01f3bd91fa731204ef Text-delta-base-sha1: 949661e8d72f8715951c8a00ee078762cd7392d6 Text-content-length: 1741 Text-content-md5: f25e764c6e257f89303ca654001c3815 Text-content-sha1: bd43ba467aa7265a35df9b9f77f8e4e9d11421f9 Content-length: 1781 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN B7 7 /* * Recursively delete a registry key and everything under it. */ static void registry_recursive_remove(HKEY key) { DWORD i; char name[MAX_PATH+1]; HKEY subkey; i = 0; while (RegEnumKey(key, i, name, sizeof(name)) == ERROR_SUCCESS) { if (RegOpenKey(key, name, &subkey) == ERROR_SUCCESS) { registry_recursive_remove(subkey); RegCloseKey(subkey); } RegDeleteKey(key, name); } } /* * Destroy all registry information associated with PuTTY. */ void registry_cleanup(void) { HKEY key; int ret; char name[MAX_PATH+1]; /* * Open the main PuTTY registry key and remove everything in it. */ if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_POS, &key) == ERROR_SUCCESS) { registry_recursive_remove(key); RegCloseKey(key); } /* * Now open the parent key and remove the PuTTY main key. Once * we've done that, see if the parent key has any other * children. */ if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_PARENT, &key) == ERROR_SUCCESS) { RegDeleteKey(key, PUTTY_REG_PARENT_CHILD); ret = RegEnumKey(key, 0, name, sizeof(name)); RegCloseKey(key); /* * If the parent key had no other children, we must delete * it in its turn. That means opening the _grandparent_ * key. */ if (ret != ERROR_SUCCESS) { if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_GPARENT, &key) == ERROR_SUCCESS) { RegDeleteKey(key, PUTTY_REG_GPARENT_CHILD); RegCloseKey(key); } } } /* * Now we're done. */ } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 01fdef928162f2421f62906ee4cca72b Text-delta-base-sha1: bc16bea20a2defca04836fccc281e77b7464908c Text-content-length: 1178 Text-content-md5: 3bf303d828d542fa23212ef36059fb13 Text-content-sha1: 18ddf12624dbf7f369b86ac7fbcecd3d978010b0 Content-length: 1218 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN JBB else if (q == p + 7 && tolower(p[0]) == 'c' && tolower(p[1]) == 'l' && tolower(p[2]) == 'e' && tolower(p[3]) == 'a' && tolower(p[4]) == 'n' && tolower(p[5]) == 'u' && tolower(p[6]) == 'p') { /* * `putty -cleanup'. Remove all registry entries * associated with PuTTY, and also find and delete * the random seed file. */ if (MessageBox(NULL, "This procedure will remove ALL Registry\n" "entries associated with PuTTY, and will\n" "also remove the PuTTY random seed file.\n" "\n" "THIS PROCESS WILL DESTROY YOUR SAVED\n" "SESSIONS. Are you really sure you want\n" "to continue?", "PuTTY Warning", MB_YESNO | MB_ICONWARNING) == IDYES) { random_destroy_seed(); registry_cleanup(); } exit(0) Revision-number: 627 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2000-09-25T16:17:53.000000Z K 7 svn:log V 65 Add an invisible System Caret for blind-helper-software to track K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 834d7f3a6642ddedb842d9c0a76771b5 Text-delta-base-sha1: 1a42e15c8aab2d17a8593def55407a9e63a333e5 Text-content-length: 49 Text-content-md5: fba5cfa33b84eb1c376d77e618a1a69d Text-content-sha1: 273f5175d6009294f618fbc08fee6507aca15645 Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVN+J  void sys_cursor(int x, int y Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2dadeca619208d591af502f1e1945403 Text-delta-base-sha1: 6bb2835d6805561b61351ab388de7cb73ac0dd53 Text-content-length: 96 Text-content-md5: a5024346ee3f59a84868adc0ee410124 Text-content-sha1: 42969c67e6a55d8e92d4a5b477ab1cf16d57b1a7 Content-length: 136 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN_"A?A[<G sys_cursor(curs_x, curs_y + (scrtop - disptop) / (cols+1) Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3bf303d828d542fa23212ef36059fb13 Text-delta-base-sha1: 18ddf12624dbf7f369b86ac7fbcecd3d978010b0 Text-content-length: 486 Text-content-md5: f6050df7f0a3909a93e08278fe926a3b Text-content-sha1: bbebfbb609adc943346ff29061a9bccdf6cc83c9 Content-length: 526 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVN @m"L=} CreateCaret(hwnd, NULL, font_width, font_height); term_out(); term_update(); break; case WM_KILLFOCUS: has_focus = FALSE; DestroyCaret()Move the system caret. (We maintain one, even though it's * invisible, for the benefit of blind people: apparently some * helper software tracks the system caret, so we should arrange to * have one.) */ void sys_cursor(int x, int y) { SetCaretPos(x * font_width, y * font_height Revision-number: 628 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2000-09-25T16:25:12.000000Z K 7 svn:log V 66 Oops - puttytel now needs a stub random_destroy_seed() to compile K 10 svn:author V 5 simon PROPS-END Node-path: putty/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c6bc2ee9a9f9fc950576f7ba78c6a7bf Text-delta-base-sha1: fe282a5909ca206a237187c9fc6e4a7eedb2bf3d Text-content-length: 87 Text-content-md5: 325b9d2fe6a49a5be846c18d623dc30f Text-content-sha1: e72246e551cd96e343541fc554d25ee9aa052669 Content-length: 126 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN/TFFrandom_destroy_seed(void) { } void noise_ultralight(DWORD data) { } Revision-number: 629 Prop-content-length: 175 Content-length: 175 K 7 svn:log V 75 Pageant should now not fail for lack of security APIs on 95-type platforms K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-26T09:22:40.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fe96a5ca5282801a46eded994868da25 Text-delta-base-sha1: 66908d9481116b4e86d49a0fc698c2935b77f465 Text-content-length: 2632 Text-content-md5: 5a2dee7b1f56ceaad0aa8c63aeed678e Text-content-sha1: f7211bd83e07b1df8ce29a3a04b461baf4f9b333 Content-length: 2671 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNDuLny6h:lvc_KIyJ>k%jMUTq *+int has_security; typedef DWORD (WINAPI *gsi_fn_t) (HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION, PSID *, PSID *, PACL *, PACL *, PSECURITY_DESCRIPTOR *); gsi_fn_t getsecurityinfohas_security) { GetCurrentProcessId())) == NULL) { #ifdef DEBUG_IPC debug(("couldn't get handle for process\r\n")); #endif return 0; } if (getsecurityinfo(proc, SE_KERNEL_OBJECT, &procowner, NULL, NULL, NULL, &psd2) != ERROR_SUCCESS) { #ifdef DEBUG_IPC CloseHandle(proc); return 0; /* unable to get security info */ } CloseHandle(proc); if ((rc = getsecurityi &mapowner, NULL, NULL, NULL, debug(("couldn't get owner info for filemap: %d\r\n", rc)); #endif return 0; } #ifdef DEBUG_IPC debug(("got security stuff\r\n")); #endif if (!EqualSid(mapowner, procowner)) return 0; /* security ID mismatch! */ #ifdef DEBUG_IPC debug(("security stuff matched\r\n")); #endif LocalFree(psd1); LocalFree(psd2); } else { #ifdef DEBUG_IPC debug(("security APIs not present\r\n")); #endif } OSVERSIONINFO osi; HMODULE advapi; /* * Determine whether we're an NT system (should have security * APIs) or a non-NT system (don't do security). */ memset(&osi, 0, sizeof(OSVERSIONINFO)); osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (GetVersionEx(&osi) && osi.dwPlatformId==VER_PLATFORM_WIN32_NT) { has_security = TRUE; } else has_security = FALSE; if (has_security) { /* * Attempt to ge the security API we need. */ advapi = LoadLibrary("ADVAPI32.DLL"); getsecurityinfo = (gsi_fn_t)GetProcAddress(advapi, "GetSecurityInfo"); if (!getsecurityinfo) { MessageBox(NULL, "Unable to access security APIs. Pageant will\n" "not run, in case it causes a security breach.", "Pageant Fatal Error", MB_ICONERROR | MB_OK); return 1; } } else advapi = NULLif (advapi) FreeLibrary(advapiif (advapi) FreeLibrary(advapi); Revision-number: 630 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2000-09-26T10:05:48.000000Z K 7 svn:log V 42 Fix a small bug in 2-3-4 tree enumeration K 10 svn:author V 5 simon PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9b8b6f515d5820c63a62633571e32321 Text-delta-base-sha1: 858ecd346e2dd1a71c3f15e4694f7dacc74240ff Text-content-length: 94 Text-content-md5: 39a8a2bc0e2b90a173e15d681d133c8d Text-content-sha1: 1f154835ab2f36975ee1d59b49abade63d108287 Content-length: 133 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNUb DbD<< 2 && n->elems[pos+1]) { e->posn = pos+1; return n->elems[e->posn Revision-number: 631 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2000-09-26T10:06:05.000000Z K 7 svn:log V 71 The "Authenticated using key from agent" message is a verbose-only one K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b64fc60d3088891f1b686e16ddc6df8 Text-delta-base-sha1: b65a5b275facd7b3cd685495072ff4224bbc67f2 Text-content-length: 159 Text-content-md5: b45a1a45ce88f3c961661ab8855b5f38 Text-content-sha1: 899af6c77433d22b655d36eb873c78ef20a51b55 Content-length: 199 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNlbxKz'g&K>.if (flags & FLAG_VERBOSE) { 29); c_write("\" from agent\r\n", 14); } Revision-number: 632 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 58 Fix tree corruption in the "really easy" case on deletion K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-26T11:16:33.000000Z PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 39a8a2bc0e2b90a173e15d681d133c8d Text-delta-base-sha1: 1f154835ab2f36975ee1d59b49abade63d108287 Text-content-length: 24 Text-content-md5: efb9084457b62facfc1add2a7aa6773d Text-content-sha1: 3a2867c77787ec4c46147f71b019d86ddd806830 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNbb PQ2 Revision-number: 633 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2000-09-26T11:16:47.000000Z K 7 svn:log V 40 Fix a segfault in agent forwarding code K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b45a1a45ce88f3c961661ab8855b5f38 Text-delta-base-sha1: 899af6c77433d22b655d36eb873c78ef20a51b55 Text-content-length: 46 Text-content-md5: 14d2e4f62cc70910dfd7a062ac94e78d Text-content-sha1: 5db68ccb47b835e6e0308f8b3a99c7fed94b8cfe Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNb )Jc->u.a.lensofar = 0; Revision-number: 634 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2000-09-26T12:54:43.000000Z K 7 svn:log V 56 Accelerators and wording change in Pageant systray menu K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5a2dee7b1f56ceaad0aa8c63aeed678e Text-delta-base-sha1: f7211bd83e07b1df8ce29a3a04b461baf4f9b333 Text-content-length: 103 Text-content-md5: ec9608eadf11cb9bd00dbe3a5f7f950d Text-content-sha1: 29f2abe67e95c28f4e6c7491bcb6cf22403eacb4 Content-length: 142 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNur MDMa&View Keys"); AppendMenu (systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit Revision-number: 635 Prop-content-length: 147 Content-length: 147 K 7 svn:log V 47 Remote addition and removal of keys in Pageant K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-26T13:18:43.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ec9608eadf11cb9bd00dbe3a5f7f950d Text-delta-base-sha1: 29f2abe67e95c28f4e6c7491bcb6cf22403eacb4 Text-content-length: 1778 Text-content-md5: c9c0ea53f879a02816c4887bda9642ea Text-content-sha1: c9e3ca210ce2fea31c08f29fe9467ba3b5e22b41 Content-length: 1818 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNr-7i$b3F_:Xs9N 9G+Update the visible key list. */ void keylist_update(void) { struct RSAKey *key; enum234 e; if (keylist) { SendDlgItemMessage(keylist, 100, LB_RESETCONTENT, 0, 0); for (key = first234(rsakeys, &e); key; key = next234(&e)) { SendDlgItemMessage (keylistSendDlgItemMessage (keylist, 100, LB_SETCURSEL, (WPARAM) -1, 0); }{ struct RSAKey *key; char *comment; key = malloc(sizeof(struct RSAKey)); memset(key, 0, sizeof(key)); p += makekey(p, key, NULL, 1); p += makeprivate(p, key); p += ssh1_read_bignum(p, NULL); /* p^-1 mod q */ p += ssh1_read_bignum(p, NULL); /* p */ p += ssh1_read_bignum(p, NULL); /* q */ comment = malloc(GET_32BIT(p)); if (comment) { memcpy(comment, p+4, GET_32BIT(p)); key->comment = comment; } PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_FAILURE; if (add234(rsakeys, key) == key) { keylist_update(); ret[4] = SSH_AGENT_SUCCESS; } else { freersakey(key); } }{ struct RSAKey reqkey, *key; p += makekey(p, &reqkey, NULL, 0); key = find234(rsakeys, &reqkey, NULL); freebn(reqkey.exponent); freebn(reqkey.modulus); PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_FAILURE; if (key) { del234(rsakeys, key); keylist_update(); ret[4] = SSH_AGENT_SUCCESS; } } break; keylist_update(); } Revision-number: 636 Prop-content-length: 139 Content-length: 139 K 7 svn:log V 39 Oops - free the key after removing it! K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-26T13:31:15.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c9c0ea53f879a02816c4887bda9642ea Text-delta-base-sha1: c9e3ca210ce2fea31c08f29fe9467ba3b5e22b41 Text-content-length: 707 Text-content-md5: 800a3917b489df2f24f3b80e02697a08 Text-content-sha1: d18dd1c1be48799559ee8c0de96abe7edf514d6c Content-length: 747 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN.aIP_r \g2M@9L9struct PassphraseProcStruct { char *passphrase; char *comment; }; struct PassphraseProcStruct *p; switch (msg) { case WM_INITDIALOG: p = (struct PassphraseProcStruct *)lParam; passphrase = p->passphrase; if (p->comment) SetDlgItemText(hwnd, 101, p->comment) char *comment; struct PassphraseProcStruct pps; needs_pass = rsakey_encrypted(filename, &comment); attempts = 0; key = malloc(sizeof(*key)); pps.passphrase = passphrase; pps.comment = comment&pps); if (!dlgret) { if (comment) free(comment);comment) free(commentfreersakey(key Revision-number: 637 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2000-09-26T14:26:21.000000Z K 7 svn:log V 74 Implement OpenSSH-compatible RSA key fingerprints and use them throughout K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 800a3917b489df2f24f3b80e02697a08 Text-delta-base-sha1: d18dd1c1be48799559ee8c0de96abe7edf514d6c Text-content-length: 686 Text-content-md5: 09ad1cd22093f21ad0c274c648685573 Text-content-sha1: 3ee568c30a5ada27066d801e8766d1d4ee48c129 Content-length: 726 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN+ ^JdF|jS;char listentry[512], *p; /* * Replace two spaces in the fingerprint with tabs, for * nice alignment in the box. */ rsa_fingerprint(listentry, sizeof(listentry), key); p = strchr(listentry, ' '); if (p) *p = '\t'; p = strchr(listentry, ' '); if (p) *p = '\t'; SendDlgItemMessage (keylist, 100, LB_ADDSTRING, 0, (LPARAM)listentry freekeylist = hwnd; { static int tabs[2] = {25, 175}; SendDlgItemMessage (hwnd, 100, LB_SETTABSTOPS, 2, (LPARAM) tabs); } keylist_update();keylist_update( Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d67d08382cb09ef0ffa4d8b01bc43eba Text-delta-base-sha1: 34dc3bd94c8246cea47f4488938821ae158d98db Text-content-length: 35 Text-content-md5: 210aa3fa534f03fe951eeb59327e0354 Text-content-sha1: e6acff29ebfee74d5692f57a617e3086e15e0727 Content-length: 74 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN5G 7~LBS_USETABSTOP Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 14d2e4f62cc70910dfd7a062ac94e78d Text-delta-base-sha1: 5db68ccb47b835e6e0308f8b3a99c7fed94b8cfe Text-content-length: 299 Text-content-md5: 00bee6ec10b67ad3f6539be19889205c Text-content-sha1: 2c5c5c3706a4b8b233a3628aaba2e113a126fb01 Content-length: 339 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVN&wLog the host key fingerprint. */ { char logmsg[80]; logevent("Host key fingerprint is:"); strcpy(logmsg, " "); hostkey.comment = NULL; rsa_fingerprint(logmsg+strlen(logmsg), sizeof(logmsg)-strlen(logmsg), &hostkey Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e8a3d375008838cf793c6e5b1206e114 Text-delta-base-sha1: ddb0dfe5b746dde5d0f4b6b99d0b79621f0dd83d Text-content-length: 55 Text-content-md5: afa16878cfc50aaf90cec98191496fe3 Text-content-sha1: 28516608ce40a142fdbe419acb500cb19449791e Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN*h " &rsa_fingerprint(char *str, int len Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0bb36e0ff34277c096bf88a5315f4ec2 Text-delta-base-sha1: b1c637f4ed3842db49cad6aa6a1f3a35d3241c11 Text-content-length: 1165 Text-content-md5: f60297a77f8d194f9cf632cc691dbd4a Text-content-sha1: 16aeca61f89c73325bddf5c4da3a88f94bbb79ad Content-length: 1205 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN YdWHjk~-nnclude "ssh.h" modpow(b1, key->exponent, key->modulus, /* * Generate a fingerprint string for the key. Compatible with the * OpenSSH fingerprint code. */ void rsa_fingerprint(char *str, int len, struct RSAKey *key) { struct MD5Context md5c; unsigned char digest[16]; char buffer[16*3+40]; int numlen, slen, i; MD5Init(&md5c); numlen = ssh1_bignum_length(key->modulus) - 2; for (i = numlen; i-- ;) { unsigned char c = bignum_byte(key->modulus, i); MD5Update(&md5c, &c, 1); } numlen = ssh1_bignum_length(key->exponent) - 2; for (i = numlen; i-- ;) { unsigned char c = bignum_byte(key->exponent, i); MD5Update(&md5c, &c, 1); } MD5Final(digest, &md5c); sprintf(buffer, "%d ", ssh1_bignum_bitcount(key->modulus)); for (i = 0; i < 16; i++) sprintf(buffer+strlen(buffer), "%s%02x", i?":":"", digest[i]); strncpy(str, buffer, len); str[len-1] = '\0'; slen = strlen(str); if (key->comment && slen < len-1) { str[slen] = ' '; strncpy(str+slen+1, key->comment, len-slen-1); str[len-1] = '\0'; } Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4a41603525d0a25647400c8b6e9e6d82 Text-delta-base-sha1: 7846a2c32f052060566b3f11f4b21ea8024c7643 Text-content-length: 125 Text-content-md5: 69e126472a0759f185c70ce92e70a9b3 Text-content-sha1: 42de5ad488ecb511b07d50e3aa002216973a16ce Content-length: 165 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNYZaWX`R2135, 102, 44, 14 PUSHBUTTON "C&opy", IDN_COPY, 81, 102, 44, 14 LISTBOX IDN_LIST, 3, 3, 2 Revision-number: 638 Prop-content-length: 266 Content-length: 266 K 8 svn:date V 27 2000-09-27T09:36:39.000000Z K 7 svn:log V 165 Remove the special hooks in ssh.c for pscp. pscp now uses the standard interface to the outside of the ssh module. This means pscp now works without change in SSH2. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bf82352084fdd64aa3c21b2d177eecfe Text-delta-base-sha1: 5e23c8569e873b6ee78b15832d3a76619dd1b755 Text-content-length: 20 Text-content-md5: 4ccea6cbcdd85fad723a904e67703d88 Text-content-sha1: b347780dc9295bdfedc50d0599c993486dc09965 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNUO GM Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2cc6229111dbcc4ebffbe16e54686f67 Text-delta-base-sha1: b25a74d216f4769800e48e43d077f71f2e519efc Text-content-length: 3466 Text-content-md5: 9c59e08c3bdd5ac69154a410c6523db9 Text-content-sha1: d809fab5d2c3bebcdf723b0c0e47dff78548144b Content-length: 3506 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNtdguG}u:@>IVb@ PLc57-t )>HifDWr,Receive a block of data from the SSH link. Block until all data * is available. * * To do this, we repeatedly call the SSH protocol module, with our * own trap in term_out() to catch the data that comes back. We do * this until we have enough data. */ static unsigned char *outptr; /* where to put the data */ static unsigned outlen; /* how much data required */ static unsigned char *pending = NULL; /* any spare data */ static unsigned pendlen=0, pendsize=0; /* length and phys. size of buffer */ void term_out(void) { /* * Here we must deal with a block of data, in `inbuf', size * `inbuf_head'. */ unsigned char *p = inbuf; unsigned len = inbuf_head; inbuf_head = 0; /* * If this is before the real session begins, just return. */ if (!outptr) return; if (outlen > 0) { unsigned used = outlen; if (used > len) used = len; memcpy(outptr, p, used); outptr += used; outlen -= used; p += used; len -= used; } if (len > 0) { if (pendsize < pendlen + len) { pendsize = pendlen + len + 4096; pending = (pending ? realloc(pending, pendsize) : malloc(pendsize)); if (!pending) fatalbox("Out of memory"); } memcpy(pending+pendlen, p, len); pendlen += len; } } static int ssh_scp_recv(unsigned char *buf, int len) { SOCKET s; outptr = buf; outlen = len; /* * See if the pending-input block contains some of what we * need. */ if (pendlen > 0) { unsigned pendused = pendlen; if (pendused > outlen) pendused = outlen; memcpy(outptr, pending, pendused); memmove(pending, pending+pendused, pendlen-pendused); outptr += pendused; outlen -= pendused; pendlen -= pendused; if (pendlen == 0) { pendsize = 0; free(pending); pending = NULL; } if (outlen == 0) return len; } while (outlen > 0) { fd_set readfds; s = back->socket(); if (s == INVALID_SOCKET) { connection_open = FALSE; return 0; } FD_ZERO(&readfds); FD_SET(s, &readfds); if (select(1, &readfds, NULL, NULL, NULL) < 0) return 0; /* doom */ back->msg(0, FD_READ); term_out(); } return len; } /* * Loop through the ssh connection and authentication process. */ static void ssh_scp_init(void) { SOCKET s; s = back->socket(); if (s == INVALID_SOCKET) return; while (!back->sendok()) { fd_set readfds; FD_ZERO(&readfds); FD_SET(s, &readfds); if (select(1, &readfds, NULL, NULL, NULL) < 0) return; /* doom */ back->msg(0, FD_READ); term_out(); }back->special(TS_EOFstrncpy(cfg.remote_cmd, cmd, sizeof(cfg.remote_cmd)); cfg.remote_cmd[sizeof(cfg.remote_cmd)-1] = '\0'; cfg.nopty = TRUE; back = &ssh_backend; err = back->init(NULL, cfg.host, cfg.port, &realhost); if (err != NULL) bump("ssh_init: %s", err); ssh_scp_init(back->back->back->back->back->back->back->back->back->back->back->back->back->special(TS_EOF Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 00bee6ec10b67ad3f6539be19889205c Text-delta-base-sha1: 2c5c5c3706a4b8b233a3628aaba2e113a126fb01 Text-content-length: 136 Text-content-md5: 8d3b5a33e5b4002e142041199dd78d9e Text-content-sha1: 3e0e161f8fac5bf891fd637e55a8a26e3b4dd1d1 Content-length: 176 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVN&f,OpZE;#;&EaeAatic void c_writedata (char *buf, int len) { while (len--)data.90s@%.90data Node-path: putty/scp.h Node-action: delete Revision-number: 639 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2000-09-27T15:21:04.000000Z K 7 svn:log V 140 Rationalised host key storage. Also started code reorg: persistent-state routines have been moved out into a replaceable module winstore.c. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4ccea6cbcdd85fad723a904e67703d88 Text-delta-base-sha1: b347780dc9295bdfedc50d0599c993486dc09965 Text-content-length: 164 Text-content-md5: 34ae837abe041ccbb9c313afff2845d6 Text-content-sha1: 18192d0b278218c07cce147096eecf45ee3b3e09 Content-length: 204 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNO+}vp|93 winstore storage.h windlg.$(OBJ): windlg.c putty.h ssh.h win_res.h storage.h winstore.$(OBJ): winstore.c putty.h storage storage Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 570ddbaba855561e24b69ebb9fb02bc4 Text-delta-base-sha1: dcdeeffa627e176ae7b5f60f66132a60fb7bd5ec Text-content-length: 211 Text-content-md5: 6ab0ffd9ec9c5559366ad44720692a32 Text-content-sha1: 29d1d828e8322d021ea54dd90066ed197b2bef91 Content-length: 250 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN>t06SHRl#include "storage.h"read_random_seed(func); } void random_save_seed(void) { int len; void *data; random_get_savedata(&data, &len); write_random_seed(data, len Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fba5cfa33b84eb1c376d77e618a1a69d Text-delta-base-sha1: 273f5175d6009294f618fbc08fee6507aca15645 Text-content-length: 83 Text-content-md5: dade95564b34c9020d0c0e558e5b906b Text-content-sha1: a7075bd19ccce663827536340872a929b020e232 Content-length: 123 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNJ >4type, char *keystr, char *fingerprint Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8d3b5a33e5b4002e142041199dd78d9e Text-delta-base-sha1: 3e0e161f8fac5bf891fd637e55a8a26e3b4dd1d1 Text-content-length: 410 Text-content-md5: 7574c0090ca838bc12a1160d3e22fd79 Text-content-sha1: 96c51356e72bd5711c78d1f2f4cd3dec78968f64 Content-length: 450 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNf&f'~:M\J^fingerprint[100]rsa_fingerprint(fingerprint, sizeof(fingerprint), &hostkey); verify_ssh_host_key(savedhost, "rsa", keystr, fingerprint, *fingerprintfingerprint = hostkey->fingerprint(); verify_ssh_host_key(savedhost, hostkey->keytype, keystr, fingerprint); logevent("Host key fingerprint is:"); logevent(fingerprint); free(fingerprint Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: afa16878cfc50aaf90cec98191496fe3 Text-delta-base-sha1: 28516608ce40a142fdbe419acb500cb19449791e Text-content-length: 201 Text-content-md5: 014dfd900686b65a728ca9a4c9ddfc79 Text-content-sha1: d62b908838efb89c7382c3454b3a893af3dca280 Content-length: 241 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNhH 1W1@(char *(*fingerprint)(void); int (*verifysig)(char *sig, int siglen, char *data, int datalen); char *name; char *keytype; /* for host key cache */ Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d9ade49397ab82cb3a3324ba50bebc3b Text-delta-base-sha1: 7c668f939506cca96b305c29e44f18a71277df16 Text-content-length: 2239 Text-content-md5: bc87ee2385a07f673ddde0ecdd6f32df Text-content-sha1: bdf59739da26900a74adc22c9f51fd0ad2c20db5 Content-length: 2278 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNYb"W h<#define PUT_32BIT(cp, value) { \ (cp)[0] = (unsigned char)((value) >> 24); \ (cp)[1] = (unsigned char)((value) >> 16); \ (cp)[2] = (unsigned char)((value) >> 8); \ (cp)[3] = (unsigned char)(value); }, i, pos, nibbles; static const char hex[] = "0123456789abcdef"; if (!dss_p) return NULL; len = 8 + 4 + 1; /* 4 x "0x pos = 0; pos += sprintf(p+pos, "0x"); nibbles = (3 + ssh1_bignum_bitcount(dss_p))/4; if (nibbles<1) nibbles=1; for (i=nibbles; i-- ;) p[pos++] = hex[(bignum_byte(dss_p, i/2) >> (4*(i%2))) & 0xF]; pos += sprintf(p+pos, "0x"); nibbles = (3 + ssh1_bignum_bitcount(dss_q))/4; if (nibbles<1) nibbles=1; for (i=nibbles; i-- ;) p[pos++] = hex[(bignum_byte(dss_q, i/2) >> (4*(i%2))) & 0xF]; pos += sprintf(p+pos, "0x"); nibbles = (3 + ssh1_bignum_bitcount(dss_g))/4; if (nibbles<1) nibbles=1; for (i=nibbles; i-- ;) p[pos++] = hex[(bignum_byte(dss_g, i/2) >> (4*(i%2))) & 0xF]; pos += sprintf(p+pos, "0x"); nibbles = (3 + ssh1_bignum_bitcount(dss_y))/4; if (nibbles<1) nibbles=1; for (i=nibbles; i-- ;) p[pos++] = hex[(bignum_byte(dss_y, i/2) >> (4*(i%2))) & 0xF]; p[pos] = '\0'; return p; } static char *dss_fingerprint(void) { struct MD5Context md5c; unsigned char digest[16], lenbuf[4]; char buffer[16*3+40]; char *ret; int numlen, i; MD5Init(&md5c); MD5Update(&md5c, "\0\0\0\7ssh-dss", 11); #define ADD_BIGNUM(bignum) \ numlen = (ssh1_bignum_bitcount(bignum)+8)/8; \ PUT_32BIT(lenbuf, numlen); MD5Update(&md5c, lenbuf, 4); \ for (i = numlen; i-- ;) { \ unsigned char c = bignum_byte(bignum, i); \ MD5Update(&md5c, &c, 1); \ } ADD_BIGNUM(dss_p); ADD_BIGNUM(dss_q); ADD_BIGNUM(dss_g); ADD_BIGNUM(dss_y); #undef ADD_BIGNUM MD5Final(digest, &md5c); sprintf(buffer, "%d ", ssh1_bignum_bitcount(dss_p)); for (i = 0; i < 16; i++) sprintf(buffer+strlen(buffer), "%s%02x", i?":":"", digest[i]); ret = malloc(strlen(buffer)+1); if (ret) strcpy(ret, buffer); return retfingerprint, dss_verifysig, "ssh-dss", "dss" }; Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f60297a77f8d194f9cf632cc691dbd4a Text-delta-base-sha1: 16aeca61f89c73325bddf5c4da3a88f94bbb79ad Text-content-length: 641 Text-content-md5: 0319148739f524bb874962154352c9ae Text-content-sha1: ab732cf1fd0ee2726d02245df1a69b0a7da8c689 Content-length: 681 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNY] i@i4%20; } void rsastr_fmt(char *str, struct RSAKey *key) { Bignum md, ex; int len = 0, i, nibbles; static const char hex[] = "0123456789abcdef"; md = key->modulus; ex = key->exponent; len += sprintf(str+len, "0x"); nibbles = (3 + ssh1_bignum_bitcount(ex))/4; if (nibbles<1) nibbles=1; for (i=nibbles; i-- ;) str[len++] = hex[(bignum_byte(ex, i/2) >> (4*(i%2))) & 0xF]; len += sprintf(str+len, ",0x"); nibbles = (3 + ssh1_bignum_bitcount(md))/4; if (nibbles<1) nibbles=1; for (i=nibbles; i-- ;) str[len++] = hex[(bignum_byte(md, i/2) >> (4*(i%2))) & 0xF]; Node-path: putty/storage.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3088 Text-content-md5: bb8e5f84bfedf6a30afa8ca1e37e7152 Text-content-sha1: 09172c00e6e30166384d7854669756f7be4e51c2 Content-length: 3204 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN/* * storage.h: interface defining functions for storage and recovery * of PuTTY's persistent data. */ #ifndef PUTTY_STORAGE_H #define PUTTY_STORAGE_H /* ---------------------------------------------------------------------- * Functions to save and restore PuTTY sessions. Note that this is * only the low-level code to do the reading and writing. The * higher-level code that translates a Config structure into a set * of (key,value) pairs is elsewhere, since it doesn't (mostly) * change between platforms. */ /* * Write a saved session. The caller is expected to call * open_setting_w() to get a `void *' handle, then pass that to a * number of calls to write_setting_s() and write_setting_i(), and * then close it using close_settings_w(). At the end of this call * sequence the settings should have been written to the PuTTY * persistent storage area. */ void *open_settings_w(char *sessionname); void write_setting_s(void *handle, char *key, char *value); void write_setting_i(void *handle, char *key, int value); void *close_settings_w(void *handle); /* * Read a saved session. The caller is expected to call * open_setting_r() to get a `void *' handle, then pass that to a * number of calls to read_setting_s() and read_setting_i(), and * then close it using close_settings_r(). * * read_setting_s() writes into the provided buffer and returns a * pointer to the same buffer. * * If a particular string setting is not present in the session, * read_setting_s() can return NULL, in which case the caller * should invent a sensible default. If an integer setting is not * present, read_setting_i() returns its provided default. */ void *open_settings_r(char *sessionname); char *read_setting_s(void *handle, char *key, char *buffer, int buflen); int read_setting_i(void *handle, char *key, int defvalue); void *close_settings_r(void *handle); /* ---------------------------------------------------------------------- * Functions to access PuTTY's host key database. */ /* * See if a host key matches the database entry. Return values can * be 0 (entry matches database), 1 (entry is absent in database), * or 2 (entry exists in database and is different). */ int verify_host_key(char *hostname, char *keytype, char *key); /* * Write a host key into the database, overwriting any previous * entry that might have been there. */ void store_host_key(char *hostname, char *keytype, char *key); /* ---------------------------------------------------------------------- * Functions to access PuTTY's random number seed file. */ typedef void (*noise_consumer_t)(void *data, size_t len); /* * Read PuTTY's random seed file and pass its contents to a noise * consumer function. */ void read_random_seed(noise_consumer_t consumer); /* * Write PuTTY's random seed file from a given chunk of noise. */ void write_random_seed(void *data, size_t len); /* ---------------------------------------------------------------------- * Cleanup function: remove all of PuTTY's persistent state. */ void cleanup_all(void); #endif Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f25e764c6e257f89303ca654001c3815 Text-delta-base-sha1: bd43ba467aa7265a35df9b9f77f8e4e9d11421f9 Text-content-length: 2588 Text-content-md5: e44eee648357a982103f380440bbaf4a Text-content-sha1: d03c158ed6e6d572b3d9601cc3e1f87010ebff8f Content-length: 2628 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNB|~k?#include "storagetype, char *keystr, char *fingerprint) { int ret; static const char absentmsg[] = "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, hit Yes to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you do not trust this host, hit No to abandon the\n" "connection.\n"; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "hit Yes to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, hit No.\n" "If you want to abandon the connection completely, hit\n" "Cancel. Hitting Cancel is the ONLY guaranteed safe\n" "choice.\n"; static const char mbtitle[] = "PuTTY Security Alert"; char message[160+ /* sensible fingerprint max size */ (sizeof(absentmsg) > sizeof(wrongmsg) ? sizeof(absentmsg) : sizeof(wrongmsg))]; /* * Verify the key against the registry. */ ret = verify_host_key(host, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; if (ret == 2) { /* key was different */ int mbret; sprintf(message, wrongmsg, fingerprint); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNOCANCEL); if (mbret == IDYES) store_host_key(host, keytype, keystr); if (mbret == IDCANCEL) exit(0); } if (ret == 1) { /* key was absent */ int mbret; sprintf(message, absentmsg, fingerprint); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNO); if (mbret == IDNO) exit(0); store_host_key(host, keytype, keystr); } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f6050df7f0a3909a93e08278fe926a3b Text-delta-base-sha1: bbebfbb609adc943346ff29061a9bccdf6cc83c9 Text-content-length: 48 Text-content-md5: 3812873609b71a25a6d504c5cef5c3f8 Text-content-sha1: f75cb124403d412d512c718bc7e48bbe33e294d4 Content-length: 88 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVNl+Dkstoragecleanup_all Node-path: putty/winstore.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 9714 Text-content-md5: 47034205e98fd5e69c3504ab6f1bde07 Text-content-sha1: df842de6fcd005aa0c8e1cd7cf2e7653d217c824 Content-length: 9830 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNddd/* * winstore.c: Windows-specific implementation of the interface * defined in storage.h. */ #include #include #include "putty.h" #include "storage.h" static char seedpath[2*MAX_PATH+10] = "\0"; static char hex[16] = "0123456789ABCDEF"; static void mungestr(char *in, char *out) { int candot = 0; while (*in) { if (*in == ' ' || *in == '\\' || *in == '*' || *in == '?' || *in == '%' || *in < ' ' || *in > '~' || (*in == '.' && !candot)) { *out++ = '%'; *out++ = hex[((unsigned char)*in) >> 4]; *out++ = hex[((unsigned char)*in) & 15]; } else *out++ = *in; in++; candot = 1; } *out = '\0'; return; } static void unmungestr(char *in, char *out) { while (*in) { if (*in == '%' && in[1] && in[2]) { int i, j; i = in[1] - '0'; i -= (i > 9 ? 7 : 0); j = in[2] - '0'; j -= (j > 9 ? 7 : 0); *out++ = (i<<4) + j; in += 3; } else *out++ = *in++; } *out = '\0'; return; } void *open_settings_w(char *sessionname); void write_setting_s(void *handle, char *key, char *value); void write_setting_i(void *handle, char *key, int value); void *close_settings_w(void *handle); void *open_settings_r(char *sessionname); char *read_setting_s(void *handle, char *key, char *buffer, int buflen); int read_setting_i(void *handle, char *key, int defvalue); void *close_settings_r(void *handle); static void hostkey_regname(char *buffer, char *hostname, char *keytype) { strcpy(buffer, keytype); strcat(buffer, "@"); mungestr(hostname, buffer + strlen(buffer)); } int verify_host_key(char *hostname, char *keytype, char *key) { char *otherstr, *regname; int len; HKEY rkey; DWORD readlen; DWORD type; int ret, compare; len = 1 + strlen(key); /* * Now read a saved key in from the registry and see what it * says. */ otherstr = smalloc(len); regname = smalloc(3*(strlen(hostname)+strlen(keytype))+5); if (!otherstr || !regname) fatalbox("Out of memory"); hostkey_regname(regname, hostname, keytype); if (RegCreateKey(HKEY_CURRENT_USER, PUTTY_REG_POS "\\SshHostKeys", &rkey) != ERROR_SUCCESS) return 1; /* key does not exist in registry */ readlen = len; ret = RegQueryValueEx(rkey, regname, NULL, &type, otherstr, &readlen); if (ret != ERROR_SUCCESS && ret != ERROR_MORE_DATA && !strcmp(keytype, "rsa")) { /* * Key didn't exist. If the key type is RSA, we'll try * another trick, which is to look up the _old_ key format * under just the hostname and translate that. */ char *justhost = regname + 1 + strlen(keytype); char *oldstyle = smalloc(len + 10); /* safety margin */ readlen = len; ret = RegQueryValueEx(rkey, justhost, NULL, &type, oldstyle, &readlen); if (ret == ERROR_SUCCESS && type == REG_SZ) { /* * The old format is two old-style bignums separated by * a slash. An old-style bignum is made of groups of * four hex digits: digits are ordered in sensible * (most to least significant) order within each group, * but groups are ordered in silly (least to most) * order within the bignum. The new format is two * ordinary C-format hex numbers (0xABCDEFG...XYZ, with * A nonzero except in the special case 0x0, which * doesn't appear anyway in RSA keys) separated by a * comma. All hex digits are lowercase in both formats. */ char *p = otherstr; char *q = oldstyle; int i, j; for (i = 0; i < 2; i++) { int ndigits, nwords; *p++ = '0'; *p++ = 'x'; ndigits = strcspn(q, "/"); /* find / or end of string */ nwords = ndigits / 4; /* now trim ndigits to remove leading zeros */ while (q[ (ndigits-1) ^ 3 ] == '0' && ndigits > 1) ndigits--; /* now move digits over to new string */ for (j = 0; j < ndigits; j++) p[ndigits-1-j] = q[j^3]; p += ndigits; q += nwords*4; if (*q) { q++; /* eat the slash */ *p++ = ','; /* add a comma */ } *p = '\0'; /* terminate the string */ } /* * Now _if_ this key matches, we'll enter it in the new * format. If not, we'll assume something odd went * wrong, and hyper-cautiously do nothing. */ if (!strcmp(otherstr, key)) RegSetValueEx(rkey, regname, 0, REG_SZ, otherstr, strlen(otherstr)+1); } } RegCloseKey(rkey); compare = strcmp(otherstr, key); sfree(otherstr); sfree(regname); if (ret == ERROR_MORE_DATA || (ret == ERROR_SUCCESS && type == REG_SZ && compare)) return 2; /* key is different in registry */ else if (ret != ERROR_SUCCESS || type != REG_SZ) return 1; /* key does not exist in registry */ else return 0; /* key matched OK in registry */ } void store_host_key(char *hostname, char *keytype, char *key) { char *regname; HKEY rkey; regname = smalloc(3*(strlen(hostname)+strlen(keytype))+5); if (!regname) fatalbox("Out of memory"); hostkey_regname(regname, hostname, keytype); if (RegCreateKey(HKEY_CURRENT_USER, PUTTY_REG_POS "\\SshHostKeys", &rkey) != ERROR_SUCCESS) return; /* key does not exist in registry */ RegSetValueEx(rkey, regname, 0, REG_SZ, key, strlen(key)+1); RegCloseKey(rkey); } /* * Find the random seed file path and store it in `seedpath'. */ static void get_seedpath(void) { HKEY rkey; DWORD type, size; size = sizeof(seedpath); if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_POS, &rkey)==ERROR_SUCCESS) { int ret = RegQueryValueEx(rkey, "RandSeedFile", 0, &type, seedpath, &size); if (ret != ERROR_SUCCESS || type != REG_SZ) seedpath[0] = '\0'; RegCloseKey(rkey); } else seedpath[0] = '\0'; if (!seedpath[0]) { int len, ret; len = GetEnvironmentVariable("HOMEDRIVE", seedpath, sizeof(seedpath)); ret = GetEnvironmentVariable("HOMEPATH", seedpath+len, sizeof(seedpath)-len); if (ret == 0) { /* probably win95; store in \WINDOWS */ GetWindowsDirectory(seedpath, sizeof(seedpath)); len = strlen(seedpath); } else len += ret; strcpy(seedpath+len, "\\PUTTY.RND"); } } void read_random_seed(noise_consumer_t consumer) { HANDLE seedf; if (!seedpath[0]) get_seedpath(); seedf = CreateFile(seedpath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (seedf != INVALID_HANDLE_VALUE) { while (1) { char buf[1024]; DWORD len; if (ReadFile(seedf, buf, sizeof(buf), &len, NULL) && len) consumer(buf, len); else break; } CloseHandle(seedf); } } void write_random_seed(void *data, size_t len) { HANDLE seedf; if (!seedpath[0]) get_seedpath(); seedf = CreateFile(seedpath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (seedf != INVALID_HANDLE_VALUE) { DWORD lenwritten; WriteFile(seedf, data, len, &lenwritten, NULL); CloseHandle(seedf); } } /* * Recursively delete a registry key and everything under it. */ static void registry_recursive_remove(HKEY key) { DWORD i; char name[MAX_PATH+1]; HKEY subkey; i = 0; while (RegEnumKey(key, i, name, sizeof(name)) == ERROR_SUCCESS) { if (RegOpenKey(key, name, &subkey) == ERROR_SUCCESS) { registry_recursive_remove(subkey); RegCloseKey(subkey); } RegDeleteKey(key, name); } } void cleanup_all(void) { HKEY key; int ret; char name[MAX_PATH+1]; /* ------------------------------------------------------------ * Wipe out the random seed file. */ if (!seedpath[0]) get_seedpath(); remove(seedpath); /* ------------------------------------------------------------ * Destroy all registry information associated with PuTTY. */ /* * Open the main PuTTY registry key and remove everything in it. */ if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_POS, &key) == ERROR_SUCCESS) { registry_recursive_remove(key); RegCloseKey(key); } /* * Now open the parent key and remove the PuTTY main key. Once * we've done that, see if the parent key has any other * children. */ if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_PARENT, &key) == ERROR_SUCCESS) { RegDeleteKey(key, PUTTY_REG_PARENT_CHILD); ret = RegEnumKey(key, 0, name, sizeof(name)); RegCloseKey(key); /* * If the parent key had no other children, we must delete * it in its turn. That means opening the _grandparent_ * key. */ if (ret != ERROR_SUCCESS) { if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_GPARENT, &key) == ERROR_SUCCESS) { RegDeleteKey(key, PUTTY_REG_GPARENT_CHILD); RegCloseKey(key); } } } /* * Now we're done. */ } Revision-number: 640 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2000-09-27T16:21:52.000000Z K 7 svn:log V 72 Finish creating the storage.h abstraction and winstore.c implementation K 10 svn:author V 5 simon PROPS-END Node-path: putty/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bb8e5f84bfedf6a30afa8ca1e37e7152 Text-delta-base-sha1: 09172c00e6e30166384d7854669756f7be4e51c2 Text-content-length: 321 Text-content-md5: 14e159b865527e07468feb333d146f57 Text-content-sha1: a206f88d35cf450fe6d3f00f02d70094a577ef21 Content-length: 360 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN~&tLE4Nclose_settings_r(void *handle); /* * Delete a whole saved session. */ void del_settings(char *sessionname); /* * Enumerate all saved sessions. */ void *enum_settings_start(void); char *enum_settings_next(void *handle, char *buffer, int buflen); void enum_settings_finishinin Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e44eee648357a982103f380440bbaf4a Text-delta-base-sha1: d03c158ed6e6d572b3d9601cc3e1f87010ebff8f Text-content-length: 4323 Text-content-md5: 781f37d7ad39d0e6560d336e1f397627 Text-content-sha1: e89515451bf5466929fbb11a7f353d2eff74d5ea Content-length: 4363 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNvkjim*tKW}[iwgR+'b8YllFm3W(W8H}pV%"cvoid gpps(void *handle, char *name, char *def, char *val, int len) { if (!read_setting_s(handle, name, val, len)void *handle, char *name, int def, int *i) { *i = read_setting_i(handle, name, def)char *p; void *sesskey; sesskey = open_settings_w(section); if (!sesskey) return; write_setting_i (sesskey, "Present", 1); if (do_host) { write_setting_s (sesskey, "HostName", cfg.host); write_setting_rite_setting_s (sesskey, "Protocol", p); } write_setting_i (sesskey, "CloseOnExit", !!cfg.close_on_exit); write_setting_i (sesskey, "WarnOnClose", !!cfg.warn_on_close); write_setting_s (sesskey, "TerminalType", cfg.termtype); write_setting_rite_setting_s (sesskey, "Environment", buf); } write_setting_s (sesskey, "UserName", cfg.username); write_setting_i (sesskey, "NoPTY", cfg.nopty); write_setting_i (sesskey, "AgentFwd", cfg.agentfwd); write_setting_s (sesskey, "RemoteCmd", cfg.remote_cmd); write_setting_rite_setting_i (sesskey, "AuthTIS", cfg.try_tis_auth); write_setting_i (sesskey, "SshProt", cfg.sshprot); write_setting_s (sesskey, "PublicKeyFile", cfg.keyfile); write_setting_i (sesskey, "RFCEnviron", cfg.rfc_environ); write_setting_i (sesskey, "BackspaceIsDelete", cfg.bksp_is_delete); write_setting_i (sesskey, "RXVTHomeEnd", cfg.rxvt_homeend); write_setting_i (sesskey, "LinuxFunctionKeys", cfg.funky_type); write_setting_i (sesskey, "ApplicationCursorKeys", cfg.app_cursor); write_setting_i (sesskey, "ApplicationKeypad", cfg.app_keypad); write_setting_i (sesskey, "NetHackKeypad", cfg.nethack_keypad); write_setting_i (sesskey, "AltF4", cfg.alt_f4); write_setting_i (sesskey, "AltSpace", cfg.alt_space); write_setting_i (sesskey, "LdiscTerm", cfg.ldisc_term); write_setting_i (sesskey, "BlinkCur", cfg.blink_cur); write_setting_i (sesskey, "Beep", cfg.beep); write_setting_i (sesskey, "ScrollbackLines", cfg.savelines); write_setting_i (sesskey, "DECOriginMode", cfg.dec_om); write_setting_i (sesskey, "AutoWrapMode", cfg.wrap_mode); write_setting_i (sesskey, "LFImpliesCR", cfg.lfhascr); write_setting_i (sesskey, "WinNameAlways", cfg.win_name_always); write_setting_i (sesskey, "TermWidth", cfg.width); write_setting_i (sesskey, "TermHeight", cfg.height); write_setting_s (sesskey, "Font", cfg.font); write_setting_i (sesskey, "FontIsBold", cfg.fontisbold); write_setting_i (sesskey, "FontCharSet", cfg.fontcharset); write_setting_i (sesskey, "FontHeight", cfg.fontheight); write_setting_i (sesskey, "FontVTMode", cfg.vtmode); write_setting_i (sesskey, "TryPalette", cfg.try_palette); write_setting_rite_setting_s (sesskey, buf, buf2); } write_setting_rite_setting_s (sesskey, buf, buf2); } write_setting_i (sesskey, "KoiWinXlat", cfg.xlat_enablekoiwin); write_setting_i (sesskey, "88592Xlat", cfg.xlat_88592w1250); write_setting_i (sesskey, "CapsLockCyr", cfg.xlat_capslockcyr); write_setting_i (sesskey, "ScrollBar", cfg.scrollbar); write_setting_i (sesskey, "ScrollOnKey", cfg.scroll_on_key); write_setting_i (sesskey, "LockSize", cfg.locksize); write_setting_i (sesskey, "BCE", cfg.bce); write_setting_i (sesskey, "BlinkText", cfg.blinktext); close_settings_w(sesskey); } static void load_settings (char *section, int do_host) { int i; char prot[10]; void *sesskey; sesskey = open_settings_r(sectionclose_settings_rttings(sessions[n]}Keyboardotherbuf[2048]; static char *buffer; int buflen, bufsize, i; char *p, *ret; void *handle; if (allocate) { if ((handle = enum_settings_start()) == NULL) return; buflen = bufsize = 0; buffer = NULL; do { ret = enum_settings_next(handle, otherbuf, sizeof(otherbuf)); if (ret) { int len = strlen(otherbuf)+1; if (bufsize < buflen+len) { bufsize = buflen + len + 2048; buffer = srealloc(buffer, bufsize); } strcpy(buffer+buflen, otherbuf); buflen += strlen(buffer+buflen)+1; } } while (ret); enum_settings_finish(handle Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 47034205e98fd5e69c3504ab6f1bde07 Text-delta-base-sha1: df842de6fcd005aa0c8e1cd7cf2e7653d217c824 Text-content-length: 3437 Text-content-md5: 201a3e6c2b794921dd08965748384402 Text-content-sha1: 8f62432bdcb1d4e3ef5b4ac4159c1b0df0fc939f Content-length: 3476 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNd,5:!0>Q|O9i7z I+kyonst char *const puttystr = PUTTY_REG_POS "\\Sessions";, int outlen if (!--outlen) return; in += 3; } else { *out++ = *in++; if (!--outlen) return; } { HKEY subkey1, sesskey; int ret; char *p; p = malloc(3*strlen(sessionname)+1); mungestr(sessionname, p); ret = RegCreateKey(HKEY_CURRENT_USER, puttystr, &subkey1); if (ret != ERROR_SUCCESS) { free(p); return NULL; } ret = RegCreateKey(subkey1, p, &sesskey); free(p); RegCloseKey(subkey1); if (ret != ERROR_SUCCESS) return NULL; return (void *)sesskey; } void write_setting_s(void *handle, char *key, char *value) { if (handle) RegSetValueEx((HKEY)handle, key, 0, REG_SZ, value, 1+strlen(value)); } void write_setting_i(void *handle, char *key, int value) { if (handle) RegSetValueEx((HKEY)handle, key, 0, REG_DWORD, (CONST BYTE *)&value, sizeof(value)); } void close_settings_w(void *handle) { RegCloseKey((HKEY)handle); } void *open_settings_r(char *sessionname) { HKEY subkey1, sesskey; char *p; p = malloc(3*strlen(sessionname)+1); mungestr(sessionname, p); if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS) { sesskey = NULL; } else { if (RegOpenKey(subkey1, p, &sesskey) != ERROR_SUCCESS) { sesskey = NULL; } RegCloseKey(subkey1); } free(p); return (void *)sesskey; } char *read_setting_s(void *handle, char *key, char *buffer, int buflen) { DWORD type, size; size = buflen; if (!handle || RegQueryValueEx((HKEY)handle, key, 0, &type, buffer, &size) != ERROR_SUCCESS || type != REG_SZ) return NULL; else return buffer; } int read_setting_i(void *handle, char *key, int defvalue) { DWORD type, val, size; size = sizeof(val); if (!handle || RegQueryValueEx((HKEY)handle, key, 0, &type, (BYTE *)&val, &size) != ERROR_SUCCESS || size != sizeof(val) || type != REG_DWORD) return defvalue; else return val; } void close_settings_r(void *handle) { RegCloseKey((HKEY)handle); } void del_settings (char *sessionname) { HKEY subkey1; char *p; if (RegOpenKey(HKEY_CURRENT_USER, puttystr, &subkey1) != ERROR_SUCCESS) return; p = malloc(3*strlen(sessionname)+1); mungestr(sessionname, p); RegDeleteKey(subkey1, p); free(p); RegCloseKey(subkey1); }struct enumsettings { HKEY key; int i; }; void *enum_settings_start(void) { struct enumsettings *ret; HKEY key; if (RegCreateKey(HKEY_CURRENT_USER, puttystr, &key) != ERROR_SUCCESS) return NULL; ret = malloc(sizeof(*ret)); if (ret) { ret->key = key; ret->i = 0; } return ret; } char *enum_settings_next(void *handle, char *buffer, int buflen) { struct enumsettings *e = (struct enumsettings *)handle; char *otherbuf; otherbuf = malloc(3*buflen); if (otherbuf && RegEnumKey(e->key, e->i++, otherbuf, 3*buflen) == ERROR_SUCCESS) { unmungestr(otherbuf, buffer, buflen); free(otherbuf); return buffer; } else return NULL; } void enum_settings_finish(void *handle) { struct enumsettings *e = (struct enumsettings *)handle; RegCloseKey(e->key); free(ein Revision-number: 641 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2000-09-27T16:44:00.000000Z K 7 svn:log V 27 Remove unnecessary DSS bit K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c3acefe8c48e19014337fcc7aab6805d Text-delta-base-sha1: e2be9856993cbf536808bc246ab17f904381c35f Text-content-length: 25 Text-content-md5: 99284612ee4f3cd580dc8f1352e5b294 Text-content-sha1: 866d0931aa70dfa99b4fd61a2a810cf8acf9e2cf Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNxi1+ k Revision-number: 642 Prop-content-length: 141 Content-length: 141 K 7 svn:log V 41 Fix small compilation problem in Pageant K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-28T08:35:20.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 09ad1cd22093f21ad0c274c648685573 Text-delta-base-sha1: 3ee568c30a5ada27066d801e8766d1d4ee48c129 Text-content-length: 22 Text-content-md5: 62be34407cd018c0554ed16abc4b7bd8 Text-content-sha1: 8a1f2811b631118102294fa85ff14a7bfccf8fd7 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN+ o Revision-number: 643 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2000-09-28T08:37:10.000000Z K 7 svn:log V 62 While we're doing a hostkey reorg, store port numbers as well K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dade95564b34c9020d0c0e558e5b906b Text-delta-base-sha1: a7075bd19ccce663827536340872a929b020e232 Text-content-length: 28 Text-content-md5: 9fc6eb990092ea459405713142c89007 Text-content-sha1: 58a625acedcef3c977e5973d624c35b9c477c69b Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVN  ~int por Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7574c0090ca838bc12a1160d3e22fd79 Text-delta-base-sha1: 96c51356e72bd5711c78d1f2f4cd3dec78968f64 Text-content-length: 134 Text-content-md5: 35925d7b6a7a00bb6283c2d824c1cf54 Text-content-sha1: 7e5ab5981068e9035108a9edad04baee8deb3538 Content-length: 174 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNk!X7(' (NCavedpor savedport = port;savedporsavedport, hostkey->keytype, Node-path: putty/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 14e159b865527e07468feb333d146f57 Text-delta-base-sha1: a206f88d35cf450fe6d3f00f02d70094a577ef21 Text-content-length: 43 Text-content-md5: 2c3f5cd46f425ea4c3224fad59d41f89 Text-content-sha1: 56dc332525593592a1e994397b4896faa1a00814 Content-length: 82 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN~F.Dpint portint port Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 781f37d7ad39d0e6560d336e1f397627 Text-delta-base-sha1: e89515451bf5466929fbb11a7f353d2eff74d5ea Text-content-length: 85 Text-content-md5: 26171a55d295a4f8805c3b7717913abe Text-content-sha1: fffdaf90fe650db64a1734bf538b988a8c668b06 Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVNv-C|<Uint porporporport, keytype, keystr); } } Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 201a3e6c2b794921dd08965748384402 Text-delta-base-sha1: 8f62432bdcb1d4e3ef5b4ac4159c1b0df0fc939f Text-content-length: 461 Text-content-md5: b2f128c1330ded32f788ef8e10172b83 Text-content-sha1: 945e50d1348ee1dd120a2d70ff1821b8f7063df6 Content-length: 500 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN*7 I[czg]zuDdD|&Nvzstatic void hostkey_regname(char *buffer, char *hostname, int port, char *keytype) { int len; strcpy(buffer, keytype); strcat(buffer, "@"); len = strlen(buffer); len += sprintf(buffer+len, "%d:", port); mungestr(hostname, buffer + strlen(buffer)); } int verify_host_key(char *hostname, int port1portcspn(regname, ":"int port15); if (port Revision-number: 644 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2000-09-28T08:37:10.000000Z K 7 svn:log V 31 Remove some spurious #includes K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 088abad638fc834ab8dffc982239a0af Text-delta-base-sha1: d2ea17fc27abaeda8678b1fb53ede4b2bc71b8ce Text-content-length: 19 Text-content-md5: 523086374f20d6fe983b8213410720f3 Text-content-sha1: 86ae5d6f47988c2a7bf977bc880d429d493547e5 Content-length: 58 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN66z Revision-number: 645 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2000-09-28T09:48:49.000000Z K 7 svn:log V 43 Keep parent pointers valid during deletion K 10 svn:author V 5 simon PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: efb9084457b62facfc1add2a7aa6773d Text-delta-base-sha1: 3a2867c77787ec4c46147f71b019d86ddd806830 Text-content-length: 447 Text-content-md5: f92ec543f47cf71f3c390912df726712 Text-content-sha1: 6033d6a43e3b3aa1e1a1412d811aecd95109c191 Content-length: 486 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNb @58kids[0]) sub->kids[0]->parent = subif (sub->kids[2]) sub->kids[2]->parent = subif (sub->kids[1]) sub->kids[1]->parent = sub; sub->elems[0] = sib->elems[0]; sub->kids[0] = sib->kids[0]; if (sub->kids[0]) sub->kids[0]->parent = subif (a->kids[2]) a->kids[2]->parent = a; a->elems[2] = b->elems[0]; a->kids[3] = b->kids[1]; if (a->kids[3]) a->kids[3]->parent = a Revision-number: 646 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2000-09-28T11:05:43.000000Z K 7 svn:log V 46 DSS key format string was missing some commas K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bc87ee2385a07f673ddde0ecdd6f32df Text-delta-base-sha1: bdf59739da26900a74adc22c9f51fd0ad2c20db5 Text-content-length: 36 Text-content-md5: 27f44beea7934022c262a95030632f9d Text-content-sha1: ebaf63e292062ac531007ccb954285cf3468829c Content-length: 75 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNbe5O5OS,,, Revision-number: 647 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2000-09-29T08:42:55.000000Z K 7 svn:log V 65 Fix a very old bug nobody ever noticed: multiple About boxes :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 26171a55d295a4f8805c3b7717913abe Text-delta-base-sha1: fffdaf90fe650db64a1734bf538b988a8c668b06 Text-content-length: 113 Text-content-md5: 72fcc01c784c419c56a13a2800153ebc Text-content-sha1: e7709f98916701967b6a95339301a8d1e6e6e6b1 Content-length: 153 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVNj XtXtEndDialog(hwnd, 1); return 0; } return 0; case WM_CLOSE: EndDialog(hwnd, 1 Revision-number: 648 Prop-content-length: 143 Content-length: 143 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-29T08:43:06.000000Z K 7 svn:log V 43 Add the About and Licence boxes to Pageant PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 62be34407cd018c0554ed16abc4b7bd8 Text-delta-base-sha1: 8a1f2811b631118102294fa85ff14a7bfccf8fd7 Text-content-length: 1528 Text-content-md5: a844d519bd55bb7758990ea25040b2d7 Text-content-sha1: 2d32bb15ff7957a7ea5881ddebe920d4a9eff656 Content-length: 1568 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN>@*N]F%"GWZV>_~$\#define IDM_ABOUT 0x003extern char ver[]; HINSTANCE instance; HWND hwnd; HWND keylist; HWND aboutboxLicence box. */ static int CALLBACK LicenceProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwnd, 1); return 0; } return 0; case WM_CLOSE: EndDialog(hwnd, 1); return 0; } return 0; } /* * Dialog-box function for the About box. */ static int CALLBACK AboutProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: SetDlgItemText (hwnd, 100, ver); return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: aboutbox = NULL; DestroyWindow (hwnd); return 0; case 101: EnableWindow(hwnd, 0); DialogBox (instance, MAKEINTRESOURCE(214), NULL, LicenceProc); EnableWindow(hwnd, 1); SetActiveWindow(hwnd); return 0; } return 0; case WM_CLOSE: aboutbox = NULL; DestroyWindow (hwnd); return 0; } return 0; }rivaterivate case IDM_ABOUT: if (!aboutbox) { aboutbox = CreateDialog (instance, MAKEINTRESOURCE(213), NULL, AboutProc); ShowWindow (aboutboxaboutbox); SetWindowPos (aboutbox/* accelerators used: vxa */ABOUT, "&About Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 210aa3fa534f03fe951eeb59327e0354 Text-delta-base-sha1: e6acff29ebfee74d5692f57a617e3086e15e0727 Text-content-length: 2442 Text-content-md5: 0ab61f2ff3f95ed64edd01bb59ab9596 Text-content-sha1: 087d5d451af647a7a2223b6b08aa6997d37e0392 Content-length: 2481 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNG>wGw /* Accelerators used: cl */ 213 DIALOG DISCARDABLE 140, 40, 136, 70 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pageant" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Close", IDOK, 82, 52, 48, 14 PUSHBUTTON "View &Licence", 101, 6, 52, 70, 14 CTEXT "Pageant", 102, 10, 6, 120, 8 CTEXT "", 100, 10, 16, 120, 16 CTEXT "\251 1997-2000 Simon Tatham. All rights reserved.", 103, 10, 34, 120, 16 END /* No accelerators used */ 214 DIALOG DISCARDABLE 50, 50, 226, 223 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Pageant Licence" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK", IDOK, 98, 203, 44, 14 LTEXT "Copyright \251 1997-2000 Simon Tatham", 1000, 10, 10, 206, 8 LTEXT "Permission is hereby granted, free of charge, to any person", 1002, 10, 26, 206, 8 LTEXT "obtaining a copy of this software and associated documentation", 1003, 10, 34, 206, 8 LTEXT "files (the ""Software""), to deal in the Software without restriction,", 1004, 10, 42, 206, 8 LTEXT "including without limitation the rights to use, copy, modify, merge,", 1005, 10, 50, 206, 8 LTEXT "publish, distribute, sublicense, and/or sell copies of the Software,", 1006, 10, 58, 206, 8 LTEXT "and to permit persons to whom the Software is furnished to do so,", 1007, 10, 66, 206, 8 LTEXT "subject to the following conditions:", 1008, 10, 74, 206, 8 LTEXT "The above copyright notice and this permission notice shall be", 1010, 10, 90, 206, 8 LTEXT "included in all copies or substantial portions of the Software.", 1011, 10, 98, 206, 8 LTEXT "THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT", 1013, 10, 114, 206, 8 LTEXT "WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,", 1014, 10, 122, 206, 8 LTEXT "INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", 1015, 10, 130, 206, 8 LTEXT "MERCHANTABILITY, FITNESS FOR A PARTICULAR", 1016, 10, 138, 206, 8 LTEXT "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL", 1017, 10, 146, 206, 8 LTEXT "SIMON TATHAM BE LIABLE FOR ANY CLAIM, DAMAGES OR", 1018, 10, 154, 206, 8 LTEXT "OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,", 1019, 10, 162, 206, 8 LTEXT "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN", 1020, 10, 170, 206, 8 LTEXT "CONNECTION WITH THE SOFTWARE OR THE USE OR", 1021, 10, 178, 206, 8 LTEXT "OTHER DEALINGS IN THE SOFTWARE.", 1022, 10, 186, 206, 8 END Revision-number: 649 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2000-09-29T08:43:47.000000Z K 7 svn:log V 66 Minor restructuring to ssh.c in preparation for portability drive K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 35925d7b6a7a00bb6283c2d824c1cf54 Text-delta-base-sha1: 7e5ab5981068e9035108a9edad04baee8deb3538 Text-content-length: 4005 Text-content-md5: df2182256f7afa541dd41d2ed7c71e2e Text-content-sha1: 3aeffc7ff93f03e1492c6be52c3f4e5d3ab32f40 Content-length: 4045 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNk}3c6+W\!m}K`W;Z8"I7zf&L(nx\`yreJ{u.8_]: Lgu3Q2 i = st->len = 0; st->i < 4; st->i++) { while ((*datalen) == 0) crReturn(4-st->i); st->len = (st->len << 8) + **data; (*data)++, (*datalen)--; } #ifdef FWHACK if (st->len == 0x52656d6f) { /* "Remo"te server has closed ... */ st->len = 0x300; /* big enough to carry to end */ } #endif st->pad = 8 - (st->len % 8); st->biglen = st->len + st->pad; pktin.length = st->len - 5; if (pktin.maxlen < st->biglen) { pktin.maxlen = st->biglen; pktin.data = (pktin.data == NULL ? malloc(st->biglen+APIEXTRA) : realloc(pktin.data, st->biglenst->to_read = st->biglen; st->p = pktin.data; while (st->to_read > 0) { st->chunk = st->to_read; while ((*datalen) == 0) crReturn(st->to_read); if (st->chunk > (*datalen)) st->chunk = (*datalen); memcpy(st->p, *data, st->chunk); *data += st->chunk; *datalen -= st->chunk; st->p += st->chunk; st->to_read -= st->chunk; } if (cipher) cipher->decrypt(pktin.data, st->biglen); pktin.type = pktin.data[st->pad]; pktin.body = pktin.data + st->pad + 1; st->realcrc = crc32(pktin.data, st->biglen-4); st->gotcrc = GET_32BIT(pktin.data+st->biglen-4); if (st->gotcrc != st->const struct ssh_cipher *cscipher_tobe = NULL; static const struct ssh_cipher *sccipher_tobe = NULL; static const struct ssh_mac *csmac_tobe = NULL; static const struct ssh_mac *scmac_tobe = NULL; static const struct ssh_compress *cscomp_tobe = NULL; static const static const struct ssh_cipher *preferred_cipherpreferred_cipherpreferred_cipher = &ssh_3des_ssh2; } else if (cfg.cipher == CIPHER_3DES) { preferred_cipherpreferred_cipher-1; i < lenof(ciphers); i++) { const struct ssh_cipher *c = i<0 ? preferred_cipher : ciphers[i]; ssh2_pkt_addstring_str(c-1; i < lenof(ciphers); i++) { const struct ssh_cipher *c = i<0 ? preferred_cipher : ciphers[i]; ssh2_pkt_addstring_str(c->name); if (i < lenof(cipherMAC-1; i < lenof(ciphers); i++) { const struct ssh_cipher *c = i<0 ? preferred_cipher : ciphers[i]; if (in_commasep_string(c-1; i < lenof(ciphers); i++) { const struct ssh_cipher *c = i<0 ? preferred_cipher : ciphers[i]; if (in_commasep_string(c Revision-number: 650 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2000-09-29T08:56:30.000000Z K 7 svn:log V 60 Add -pw and -P options, and usage/version message, to plink K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4eb0ae3619d01040da076906b26cce49 Text-delta-base-sha1: 18a1f640693a76ce68a9500345c223593fbf34b9 Text-content-length: 938 Text-content-md5: c75943fabf8362adaa90d02b5fbb5592 Text-content-sha1: a1da81145758dd919a4d92875da7671c05bcba21 Content-length: 977 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNU1m8a6 T0d[a(nxWVstatic char *password = NULL;/* * Short description of parameters. */ static void usage(void) { printf("PuTTY Link: command-line connection utility\n"); printf("%s\n", ver); printf("Usage: plink [options] [user@]host [command]\n"); printf("Options:\n"); printf(" -v show verbose messages\n"); printf(" -ssh force use of ssh protocol\n"); printf(" -P port connect to specified port\n"); printf(" -pw passw login with specified password\n"); exit(1) int portnumber = -1 } else if (!strcmp(p, "-pw") && argc > 1) { --argc, password = *++argv; printf("pw is %s\n", password); } else if (!strcmp(p, "-P") && argc > 1) { --argc, portnumber = atoi(*++argv); host) { usage(); } if (portnumber != -1) cfg.port = portnumber; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: df2182256f7afa541dd41d2ed7c71e2e Text-delta-base-sha1: 3aeffc7ff93f03e1492c6be52c3f4e5d3ab32f40 Text-content-length: 74 Text-content-md5: 98eb6a0e1097978ee84ec9b5e6eadf2d Text-content-sha1: 286aedb9bafb5c84908305d2bff35103f602199c Content-length: 114 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN}g#3@>-$Yssh_get_password) {ssh_get_password Revision-number: 651 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2000-09-29T10:32:07.000000Z K 7 svn:log V 31 Try to improve the caret usage K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3812873609b71a25a6d504c5cef5c3f8 Text-delta-base-sha1: f75cb124403d412d512c718bc7e48bbe33e294d4 Text-content-length: 645 Text-content-md5: 5b66d22b6abbb327b008f66916310eb7 Text-content-sha1: 25ba81d42584a641432f64f11ae28a30793dfa02 Content-length: 685 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNlp6A6 $@0tC"orU_;1c HBITMAP caretbmSet up a caret bitmap, with no content. */ { char *bits; int size = (font_width+15)/16 * 2 * font_height; bits = calloc(size, 1); memset(bits, 0x55, size); caretbm = CreateBitmap(font_width, font_height, 1, 1, bits); free(bits); } HideCaret(hwnd); if (inbuf_head) term_out(); term_update(); ShowCaret(hwnd HideCaret(hwnd); term_update(); ShowCaret(hwnd HideCaret(hwnd) ShowCaret(hwndcaretbm, 0, 0); ShowCaret(hwnd Revision-number: 652 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 52 Oops - remove ugly debugging test pattern in cursor K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-29T12:04:27.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5b66d22b6abbb327b008f66916310eb7 Text-delta-base-sha1: 25ba81d42584a641432f64f11ae28a30793dfa02 Text-content-length: 23 Text-content-md5: 35c154c8b95a89e9d4eecedaa76d399d Text-content-sha1: 7126a47074c80ef2ce2d529fe8e4c665416b8895 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNpN I' Revision-number: 653 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2000-09-29T12:04:42.000000Z K 7 svn:log V 71 Make sure a locally entered login name still comes up in the pw prompt K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 98eb6a0e1097978ee84ec9b5e6eadf2d Text-delta-base-sha1: 286aedb9bafb5c84908305d2bff35103f602199c Text-content-length: 73 Text-content-md5: e1943f7cce9c3f3a126c1a2997652e05 Text-content-sha1: 4877e33878a16eacebbfdda1d8afba05c38bbbe3 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVNgb%U#wT static char username[100] Revision-number: 654 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:14.676093Z PROPS-END Revision-number: 655 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:14.683541Z PROPS-END Revision-number: 656 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 Fix ssh2 after the rev 1.54 [r649] reorg broke it K 10 svn:author V 5 simon K 8 svn:date V 27 2000-09-29T15:53:59.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e1943f7cce9c3f3a126c1a2997652e05 Text-delta-base-sha1: 4877e33878a16eacebbfdda1d8afba05c38bbbe3 Text-content-length: 681 Text-content-md5: 90f47e4e71451de633088436e631486c Text-content-sha1: 23d48db6e457046b7c1c71cf298e5bc099141124 Content-length: 721 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVNb\8c434(xjD?_vU?Ovvl0; i < lenof(ciphers)+1; i++) { const struct ssh_cipher *c = i==0 ? preferred_cipher : ciphers[i-1]; ssh2_pkt_addstring_str(c->name); if (i < lenof(ciphers)0; i < lenof(ciphers)+1; i++) { const struct ssh_cipher *c = i==0 ? preferred_cipher : ciphers[i-1]; ssh2_pkt_addstring_str(c->name); if (i < lenof(ciphers)0; i < lenof(ciphers)+1; i++) { const struct ssh_cipher *c = i==0 ? preferred_cipher : ciphers[i-1cscipher_tobe = cipher */ for (i = 0; i < lenof(ciphers)+1; i++) { const struct ssh_cipher *c = i==0 ? preferred_cipher : ciphers[i-1 Revision-number: 657 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2000-09-29T15:56:33.000000Z K 7 svn:log V 22 Further restructuring K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 90f47e4e71451de633088436e631486c Text-delta-base-sha1: 23d48db6e457046b7c1c71cf298e5bc099141124 Text-content-length: 1858 Text-content-md5: c93f74b1d731e90798d510fefba54580 Text-content-sha1: 4edef356f35f3dae7eaf827bd05befd32d9bbfdf Content-length: 1898 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN\8Nfq.aET>~gbI~C"KztxPxBstruct rdpkt2_state_tag { long len, pad, payload, packetlen, maclen; int i; int cipherblk; unsigned long incoming_sequence; } rdpkt2ruct rdpkt2_state_tag *st = &rdpkt2_state; crBegin; next_packet: pktin.type = 0; pktin.length = 0; if (sccipher) st->cipherblk = sccipher->blksize; else st->cipherblk = 8; if (st->cipherblk < 8) st->cipherblk = 8; if (pktin.maxlen < st->cipherblk) { pktin.maxlen = st->cipherblk; pktin.data = (pktin.data == NULL ? malloc(st->cipherblk+APIEXTRA) : realloc(pktin.data, st->cipherblkst->i = st->len = 0; st->i < st->cipherblk; st->i++) { while ((*datalen) == 0) crReturn(st->cipherblk-st->i); pktin.data[st->st->cipherblk); /* * Now get the length and padding figures. */ st->len = GET_32BIT(pktin.data); st->pad = pktin.data[4]; /* * This enables us to deduce the payload length. */ st->payload = st->len - st->pad - 1; pktin.length = st->payload + 5; /* * So now we can work out the total packet length. */ st->packetlen = st->len + 4; st->st->packetlen+st->maclen) { pktin.maxlen = st->packetlen+st->st->i = st->cipherblk; st->i < st->packetlen + st->maclen; st->i++) { while ((*datalen) == 0) crReturn(st->packetlen + st->maclen - st->i); pktin.data[st->st->cipherblk, st->packetlen - st->cipherblk); #if 0 debug(("Got packet len=%d pad=%d\r\n", st->len, st->pad)); for (st->i = 0; st->i < st->packetlen; st->i++) debug((" %02x", (unsigned char)pktin.data[st->st->len+4, st->incoming_sequence)) { bombout(("Incorrect MAC received on packet")); crReturn(0); } st->rdpkt2_state.incoming_sequence = 0; Revision-number: 658 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 Shiny new test harness for the 2-3-4 tree K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-02T11:46:10.000000Z PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f92ec543f47cf71f3c390912df726712 Text-delta-base-sha1: 6033d6a43e3b3aa1e1a1412d811aecd95109c191 Text-content-length: 8940 Text-content-md5: 2800715f01a664f214d91cd83cc62689 Text-content-sha1: b0a409d7fba81ead4b8ceb26cd980ec0400090f6 Content-length: 8979 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN r Q D ki=%d\n", ki/* * Test code for the 2-3-4 tree. This code maintains an alternative * representation of the data in the tree, in an array (using the * obvious and slow insert and delete functions). After each tree * operation, the tree_valid() function is called, which ensures * all the tree properties are preserved (node->child->parent * always equals node; number of kids == number of elements + 1; * all tree nodes are distinct; ordering property between elements * of a node and elements of its children is preserved) and also * ensures the list represented by the tree is the same list it * should be. (This last check also verifies the ordering * properties, because the `same list it should be' is by * definition correctly ordered.) */ #include /* * Error reporting function. */ void error(char *fmt, ...) { va_list ap; printf("ERROR: "); va_start(ap, fmt); vfprintf(stdout, fmt, ap); va_end(ap); printf("\n"); } /* The array representation of the data. */ void **array; int arraylen, arraysize; cmpfn234 cmp; /* The tree representation of the same data. */ tree234 *tree; typedef struct { int treedepth; int elemcount; } chkctx; void chknode(chkctx *ctx, int level, node234 *node, void *lowbound, void *highbound) { int nkids, nelems; int i; /* Count the non-NULL kids. */ for (nkids = 0; nkids < 4 && node->kids[nkids]; nkids++); /* Ensure no kids beyond the first NULL are non-NULL. */ for (i = nkids; i < 4; i++) if (node->kids[i]) { error("node %p: nkids=%d but kids[%d] non-NULL", node, nkids, i); } /* Count the non-NULL elements. */ for (nelems = 0; nelems < 3 && node->elems[nelems]; nelems++); /* Ensure no elements beyond the first NULL are non-NULL. */ for (i = nelems; i < 3; i++) if (node->elems[i]) { error("node %p: nelems=%d but elems[%d] non-NULL", node, nelems, i); } if (nkids == 0) { /* * If nkids==0, this is a leaf node; verify that the tree * depth is the same everywhere. */ if (ctx->treedepth < 0) ctx->treedepth = level; /* we didn't know the depth yet */ else if (ctx->treedepth != level) error("node %p: leaf at depth %d, previously seen depth %d", node, level, ctx->treedepth); } else { /* * If nkids != 0, then it should be nelems+1, unless nelems * is 0 in which case nkids should also be 0 (and so we * shouldn't be in this condition at all). */ int shouldkids = (nelems ? nelems+1 : 0); if (nkids != shouldkids) { error("node %p: %d elems should mean %d kids but has %d", node, nelems, shouldkids, nkids); } } /* * nelems should be at least 1. */ if (nelems == 0) { error("node %p: no elems", node, nkids); } /* * Add nelems to the running element count of the whole tree * (to ensure the enum234 routines see them all). */ ctx->elemcount += nelems; /* * Check ordering property: all elements should be strictly > * lowbound, strictly < highbound, and strictly < each other in * sequence. (lowbound and highbound are NULL at edges of tree * - both NULL at root node - and NULL is considered to be < * everything and > everything. IYSWIM.) */ for (i = -1; i < nelems; i++) { void *lower = (i == -1 ? lowbound : node->elems[i]); void *higher = (i+1 == nelems ? highbound : node->elems[i+1]); if (lower && higher && cmp(lower, higher) >= 0) { error("node %p: kid comparison [%d=%s,%d=%s] failed", node, i, lower, i+1, higher); } } /* * Check parent pointers: all non-NULL kids should have a * parent pointer coming back to this node. */ for (i = 0; i < nkids; i++) if (node->kids[i]->parent != node) { error("node %p kid %d: parent ptr is %p not %p", node, i, node->kids[i]->parent, node); } /* * Now (finally!) recurse into subtrees. */ for (i = 0; i < nkids; i++) { void *lower = (i == 0 ? lowbound : node->elems[i-1]); void *higher = (i >= nelems ? highbound : node->elems[i]); chknode(ctx, level+1, node->kids[i], lower, higher); } } void verify(void) { chkctx ctx; enum234 e; int i; void *p; ctx.treedepth = -1; /* depth unknown yet */ ctx.elemcount = 0; /* no elements seen yet */ /* * Verify validity of tree properties. */ if (tree->root) chknode(&ctx, 0, tree->root, NULL, NULL); printf("tree depth: %d\n", ctx.treedepth); /* * Enumerate the tree and ensure it matches up to the array. */ for (i = 0, p = first234(tree, &e); p; i++, p = next234(&e)) { if (i >= arraylen) error("tree contains more than %d elements", arraylen); if (array[i] != p) error("enum at position %d: array says %s, tree says %s", i, array[i], p); } if (i != ctx.elemcount) { error("tree really contains %d elements, enum gave %d", i, ctx.elemcount); } if (i < arraylen) { error("enum gave only %d elements, array has %d", i, arraylen); } } void addtest(void *elem) { int i, j; void *retval, *realret; if (arraysize < arraylen+1) { arraysize = arraylen+1+256; array = (array == NULL ? malloc(arraysize*sizeof(*array)) : realloc(array, arraysize*sizeof(*array))); } i = 0; while (i < arraylen && cmp(elem, array[i]) > 0) i++; /* now i points to the first element >= elem */ if (i < arraylen && !cmp(elem, array[i])) retval = array[i]; /* expect that returned not elem */ else { retval = elem; /* expect elem returned (success) */ for (j = arraylen; j > i; j--) array[j] = array[j-1]; array[i] = elem; /* add elem to array */ arraylen++; } realret = add234(tree, elem); if (realret != retval) { error("add: retval was %p expected %p", realret, retval); } verify(); } void deltest(void *elem) { int i; i = 0; while (i < arraylen && cmp(elem, array[i]) > 0) i++; /* now i points to the first element >= elem */ if (i >= arraylen || cmp(elem, array[i]) != 0) return; /* don't do it! */ else { while (i < arraylen-1) { array[i] = array[i+1]; i++; } arraylen--; /* delete elem from array */ } del234(tree, elem); verify(); } /* A sample data set and test utility. Designed for pseudo-randomness, * and yet repeatability. */ /* * This random number generator uses the `portable implementation' * given in ANSI C99 draft N869. It assumes `unsigned' is 32 bits; * change it if not. */ int randomnumber(unsigned *seed) { *seed *= 1103515245; *seed += 12345; return ((*seed) / 65536) % 32768; } int mycmp(void *av, void *bv) { char const *a = (char const *)av; char const *b = (char const *)bv; return strcmp(a, b); } #define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) char *strings[] = { "a", "ab", "absque", "coram", "de", "palam", "clam", "cum", "ex", "e", "sine", "tenus", "pro", "prae", "banana", "carrot", "cabbage", "broccoli", "onion", "zebra", "penguin", "blancmange", "pangolin", "whale", "hedgehog", "giraffe", "peanut", "bungee", "foo", "bar", "baz", "quux", "murfl", "spoo", "breen", "flarn", "octothorpe", "snail", "tiger", "elephant", "octopus", "warthog", "armadillo", "aardvark", "wyvern", "dragon", "elf", "dwarf", "orc", "goblin", "pixie", "basilisk", "warg", "ape", "lizard", "newt", "shopkeeper", "wand", "ring", "amulet" }; #define NSTR lenof(strings) int main(void) { int in[NSTR]; int i, j; unsigned seed = 0; for (i = 0; i < NSTR; i++) in[i] = 0; array = NULL; arraylen = arraysize = 0; tree = newtree234(mycmp); cmp = mycmp; verify(); for (i = 0; i < 10000; i++) { j = randomnumber(&seed); j %= NSTR; printf("trial: %d\n", i); if (in[j]) { printf("deleting %s (%d)\n", strings[j], j); deltest(strings[j]); in[j] = 0; } else { printf("adding %s (%d)\n", strings[j], j); addtest(strings[j]); in[j] = 1; } } while (arraylen > 0) { j = randomnumber(&seed); j %= arraylen; deltest(array[j]); } return 0; } #endif Revision-number: 659 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2000-10-02T11:47:30.000000Z K 7 svn:log V 34 Add trailing newline in tree234.h K 10 svn:author V 5 simon PROPS-END Node-path: putty/tree234.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4a01108a8e9d9717e10c123aa9a38ad6 Text-delta-base-sha1: 66abc9050d8acbbe2f3417a160bdf3b652069cac Text-content-length: 17 Text-content-md5: c6ab5d3c351b0fedc6d83391c58209ee Text-content-sha1: 7e71705ffd332fea64e1e2a87f3e5f8c03238996 Content-length: 56 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNGHG Revision-number: 660 Prop-content-length: 367 Content-length: 367 K 7 svn:log V 266 Deletion case 2c can shift the root; case 3b is not the only case that can do that. The bad case happens when you have a root node containing only one actual element, and its two child nodes have only one element each, and you try to delete the element in the root. K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-02T11:47:30.000000Z PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2800715f01a664f214d91cd83cc62689 Text-delta-base-sha1: b0a409d7fba81ead4b8ceb26cd980ec0400090f6 Text-content-length: 406 Text-content-md5: d03e2423473f53d5b9b445ef582cd01c Text-content-sha1: 7b9b2f746f510e2a88b7d554c88f837f32382920 Content-length: 445 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNro ||a /* * It's possible, in this case, that we've just removed * the only element in the root of the tree. If so, * shift the root. */ if (n->elems[0] == NULL) { LOG((" shifting root!\n")); t->root = a; a->parent = NULL; sfree(n); } Revision-number: 661 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 Add ability to configure the initial window title K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-02T12:24:58.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9fc6eb990092ea459405713142c89007 Text-delta-base-sha1: 58a625acedcef3c977e5973d624c35b9c477c69b Text-content-length: 82 Text-content-md5: 719c9ef826064154f6737db54c788c2b Text-content-sha1: c9d65d977c3b16440a71c3bef76cb8b63a047322 Content-length: 122 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNQ ="rchar wintitle[256]; /* initial window title */ Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6a34c6dbd5854eee64a786eeb92b445d Text-delta-base-sha1: 8776bb414b4b89246b3e43c79067e8a73bcc58e7 Text-content-length: 284 Text-content-md5: dbc321490bfc98f046339d797323824a Text-content-sha1: 5c95c83ccab62c223773f42eeaf9a954e28785c8 Content-length: 324 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNiAyT A#hoG"W 11EEP 1021 #define IDC2_BCE 1024 #define IDC2_BLINKTEXT 1025 #define IDCW_WINNAME 1001 #define IDCW_BLINKCUR 1002 #define IDCW_SCROLLBAR 1003 #define IDCW_LOCKSIZE 1004 #define IDCW_WINTITLE 1005 #define IDCW_WINEDIT 1006 Node-path: putty/win_res.inp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 676fa655ddf176f714bb33dc0871701f Text-delta-base-sha1: e4d3246d03848557718814b67aef7956e25acdf7 Text-content-length: 607 Text-content-md5: 7188bd1057177426813ce90b97229dd4 Text-content-sha1: 3fd8d89cfb2e107ebfe5a5644eb202edc9eba96e Content-length: 646 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNjY$/4oUYI6o,\dghlmnprsw */ IDD_PANEL2Implicit CR in every &LF", IDC2_LFHASCR, SCOL AUTOCHECKBOX "Bee&p enabled", IDC1_BEEPikty */ IDD_PANELW BEGIN GRID(4,4,24) LTEXT "Initial window &title:", IDCW_WINTITLE, COL(1), SS(3,2) EDITTEXT IDCW_WINEDIT, ADJ(8) COL(1), SS(3,3), ES_AUTOHSCROLL NEXT(2) GRID(1,8,10) AUTOCHECKBOX "Avoid ever using &icon title", IDCW_WINNAME, SCOL AUTOCHECKBOX "&Blinking cursor", IDCW_BLINKCUR, SCOL AUTOCHECKBOX "Displa&y scrollbar", IDCW_SCROLLBAR, SCOL AUTOCHECKBOX "Loc&k Window size", IDCW_LOCKSIZE, SCOL Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 69e126472a0759f185c70ce92e70a9b3 Text-delta-base-sha1: 42de5ad488ecb511b07d50e3aa002216973a16ce Text-content-length: 949 Text-content-md5: 64ea7b973db3a45867470a941cd05e19 Text-content-sha1: 87b6c31f47bf54e70e8900e5ca541653058ee162 Content-length: 989 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNZ;,} >'0H>&XaAdghlmnprsw */ IDD_PANEL2Implicit CR in every &LF", IDC2_LFHASCR, 3, 82, 162, 8 AUTOCHECKBOX "Bee&p enabled", IDC1_BEEP, 3, 92, 162, 8 AUTOCHECKBOX "Use Back&ground colour erase", IDC2_BCE, 3, 102, 162, 8 AUTOCHECKBOX "Enable bli&nking text", IDC2_BLINKTEXT, 3, 112, 162, 8 END /* Accelerators used: [aco] bikty */ IDD_PANELWInitial window &title:", IDCW_WINTITLE, 3, 3, 119, 8 EDITTEXT IDCW_WINEDIT, 3, 11, 119, 12, ES_AUTOHSCROLL AUTOCHECKBOX "Avoid ever using &icon title", IDCW_WINNAME, 3, 29, 162, 8 AUTOCHECKBOX "&Blinking cursor", IDCW_BLINKCUR, 3, 39, 162, 8 AUTOCHECKBOX "Displa&y scrollbar", IDCW_SCROLLBAR, 3, 49, 162, 8 AUTOCHECKBOX "Loc&k Window size", IDCW_LOCKSIZE, 3, 59, 162, 8 */ IDD_LOGBOX DIALOG DISCARDABLE 100, 20, 158, 102, 44, 14 LISTBOX IDN_LIST, 3, 3, 154, 95, LBS_HASSTRINGS | LBS_USETABSTOPS | WS_VSCROL Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 72fcc01c784c419c56a13a2800153ebc Text-delta-base-sha1: e7709f98916701967b6a95339301a8d1e6e6e6b1 Text-content-length: 1526 Text-content-md5: 531fee7b99bc5f7b35257722195864d2 Text-content-sha1: a5291f570557443e8ef1dd7f3b027fecfc415b6f Content-length: 1566 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNjwd.__3)R@h2P?4!Z6IvH>BH;P?*S6hnb"?p\w,{Q9 #define MAIN_NPANELS 9 #define RECONF_NPANELS 6s (sesskey, "WinTitle", cfg.wintitles (sesskey, "WinTitle", "", cfg.wintitle, sizeof(cfg.wintitle) CheckDlgButton (hwnd, IDC1_BEEP, cfg.beepDECOMEEPbeep = IsDlgButtonChecked (hwnd, IDC1_BEEPWindowW_WINEDIT, cfg.wintitle); CheckDlgButton (hwnd, IDCW_WINNAME, cfg.win_name_always); CheckDlgButton (hwnd, IDCW_BLINKCUR, cfg.blink_cur); CheckDlgButton (hwnd, IDCW_SCROLLBAR, cfg.scrollbar); CheckDlgButton (hwnd, IDCW_LOCKSIZE, cfg.locksizeW_WINNAME cfg.win_name_always = IsDlgButtonChecked (hwnd, IDCW_WINNAME); break; case IDCW_BLINKCUR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.blink_cur = IsDlgButtonChecked (hwnd, IDCW_BLINKCUR); break; case IDCW_SCROLLBAR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.scrollbar = IsDlgButtonChecked (hwnd, IDCW_SCROLLBAR); break; case IDCW_LOCKSIZE cfg.locksize = IsDlgButtonChecked (hwnd, IDCW_LOCKSIZE); break; case IDCW_WINEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDCW_WINEDIT, cfg.wintitle, sizeof(cfg.wintitle)-1); WindowWWindow, 8}; static int reconfp[RECONF_NPANELS] = { 1, 2, 3, 6, 7, 8 Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 35c154c8b95a89e9d4eecedaa76d399d Text-delta-base-sha1: 7126a47074c80ef2ce2d529fe8e4c665416b8895 Text-content-length: 242 Text-content-md5: d853a73d80ce7b274e8a2bdfefcc8f85 Text-content-sha1: 8e06ef21343829059f3469a62fcb2565806c2b51 Content-length: 282 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNNXQ6 6ID , *title if (*cfg.wintitle) { title = cfg.wintitle; } else { sprintf(msg, "%s - PuTTY", realhost); title = msg; } set_title (title); set_icon (title Revision-number: 662 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2000-10-02T12:38:12.000000Z K 7 svn:log V 49 Local remove of first key in list wasn't working K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a844d519bd55bb7758990ea25040b2d7 Text-delta-base-sha1: 2d32bb15ff7957a7ea5881ddebe920d4a9eff656 Text-content-length: 22 Text-content-md5: e39f2af7741db0cfffd1d52b2f49d69f Text-content-sha1: 99acc6e78d510b1acc9ad115dd32d86c8731a9a0 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN>4 eOo Revision-number: 663 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2000-10-02T13:57:41.000000Z K 7 svn:log V 52 Make the new test suite's comment more accurate :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d03e2423473f53d5b9b445ef582cd01c Text-delta-base-sha1: 7b9b2f746f510e2a88b7d554c88f837f32382920 Text-content-length: 698 Text-content-md5: 54acc4926d43491c0bc6ac26f40c04f5 Text-content-sha1: dbaed15837b985cb511331ee95a0a7636e8ec737 Content-length: 737 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNob verify() function is called, which ensures all * the tree properties are preserved (node->child->parent always * equals node; number of kids == 0 or number of elements + 1; * ordering property between elements of a node and elements of its * children is preserved; tree has the same depth everywhere; every * node has at least one element) and also ensures the list * represented by the tree is the same list it should be. (This * last check also verifies the ordering properties, because the * `same list it should be' is by definition correctly ordered. It * also ensures all nodes are distinct, because the enum functions * would get caught in a loop if not Revision-number: 664 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2000-10-02T15:22:41.000000Z K 7 svn:log V 52 Ability to specify a remote command in PuTTY proper K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dbc321490bfc98f046339d797323824a Text-delta-base-sha1: 5c95c83ccab62c223773f42eeaf9a954e28785c8 Text-content-length: 78 Text-content-md5: 83560511b7b01a6d1f3dc3735427f50b Text-content-sha1: f9fcde89a65848037b8b73770e6bdeb69920c1f1 Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNA{ 9iYh#define IDC3_CMDSTATIC 1031 #define IDC3_CMDEDIT 1032 Node-path: putty/win_res.inp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7188bd1057177426813ce90b97229dd4 Text-delta-base-sha1: 3fd8d89cfb2e107ebfe5a5644eb202edc9eba96e Text-content-length: 120 Text-content-md5: 3c2f163011518db403c85996581d42a8 Text-content-sha1: 773dcb25422bee94270ca7aa0e67163a8052131a Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNYf\**[KrNEXT(2) LTEXT "&Remote command:", IDC3_CMDSTATIC, COL(1), SS(3,2) EDITTEXT IDC3_CMD Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 64ea7b973db3a45867470a941cd05e19 Text-delta-base-sha1: 87b6c31f47bf54e70e8900e5ca541653058ee162 Text-content-length: 310 Text-content-md5: 45b37acc3ce19e25eaf44b2cc6f8fad2 Text-content-sha1: 58e320861dbf9d700cec71a64c06d874dc2f721d Content-length: 350 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN;;cj?]Cxrtu */ IDD_PANEL3LTEXT "&Remote command:", IDC3_CMDSTATIC, 3, 111, 119, 8 EDITTEXT IDC3_CMDEDIT, 3, 119, 119, 12, ES_AUTOHSCROLL PUSHBUTTON "C&hange...", IDC3_PKBUTTON, 129, 119, 35, 12 AUTOCHECKBOX "Allow &agent forwarding", IDC3_AGENTFWD, 3, 135 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 531fee7b99bc5f7b35257722195864d2 Text-delta-base-sha1: a5291f570557443e8ef1dd7f3b027fecfc415b6f Text-content-length: 376 Text-content-md5: 2a172d475536eb0d262e05a099e4111a Text-content-sha1: c9b18bcfcfe3a87107aa90ef2e1885d515c589c6 Content-length: 416 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNwe73aP UD|y1Q?1~N)s (sesskey, "RemoteCommand", cfg.remote_cmds (sesskey, "RemoteCommand", "", cfg.remote_cmd, sizeof(cfg.remote_cmdSetDlgItemText (hwnd, IDC3_CMDEDIT, cfg.remote_cmd); NOPTCMDEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC3_CMDEDIT, cfg.remote_cmd, sizeof(cfg.remote_cmd Revision-number: 665 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2000-10-03T09:05:56.000000Z K 7 svn:log V 56 Work around DSA formatting bug in commercial-SSH 2.0.13 K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 27f44beea7934022c262a95030632f9d Text-delta-base-sha1: ebaf63e292062ac531007ccb954285cf3468829c Text-content-length: 822 Text-content-md5: 5aa5e5915bd7875d9d91057aeb95924d Text-content-sha1: beb40c820be2ad91aa8ac6f43583c93448b30399 Content-length: 861 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNeOy"C/* * Commercial SSH (2.0.13) and OpenSSH disagree over the format * of a DSA signature. OpenSSH is in line with the IETF drafts: * it uses a string "ssh-dss", followed by a 40-byte string * containing two 160-bit integers end-to-end. Commercial SSH * can't be bothered with the header bit, and considers a DSA * signature blob to be _just_ the 40-byte string containing * the two 160-bit integers. We tell them apart by measuring * the length: length 40 means the commercial-SSH bug, anything * else is assumed to be IETF-compliant. */ if (siglen != 40) { /* bug not present; read admin fields */ getstring(&sig, &siglen, &p, &slen); if (!p || memcmp(p, "ssh-dss", 7)) { return 0; } } Revision-number: 666 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:15.233861Z PROPS-END Revision-number: 667 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 32 Fix a typo; thanks to Al Sutton K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-04T10:02:25.000000Z PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9c59e08c3bdd5ac69154a410c6523db9 Text-delta-base-sha1: d809fab5d2c3bebcdf723b0c0e47dff78548144b Text-content-length: 23 Text-content-md5: 84698901d70a075e81ee3e3aed1498fd Text-content-sha1: e867c6b46eb2dd710040f473ccc80818d067fba1 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN b5a Revision-number: 668 Prop-content-length: 234 Content-length: 234 K 7 svn:log V 133 Plink now honours the Default Settings protocol and supports -l for username. Also removed a diagnostic which had got in by mistake. K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-04T14:13:17.000000Z PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c75943fabf8362adaa90d02b5fbb5592 Text-delta-base-sha1: a1da81145758dd919a4d92875da7671c05bcba21 Text-content-length: 362 Text-content-md5: 48f389e6e77adcc8cca0887ea6c3af37 Text-content-sha1: a2b9a5f1e9893d84f82e3b87885670b57643075d Content-length: 401 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNeK9RGy|o_defaults(NULL); default_protocol = cfg.protocol; default_port = cfg.port} else if (!strcmp(p, "-l") && argc > 1) { char *username; --argc, username = *++argv; strncpy(cfg.username, username, sizeof(cfg.username)); cfg.username[sizeof(cfg.username)-1] = '\0' Revision-number: 669 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 Store default port number in each back end K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-04T14:35:15.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 719c9ef826064154f6737db54c788c2b Text-delta-base-sha1: c9d65d977c3b16440a71c3bef76cb8b63a047322 Text-content-length: 41 Text-content-md5: e5458a6f7e0aa1080eaf2039d3c6c498 Text-content-sha1: cbaae74f4970e0314e05eda7bcfcd64d921b2425 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNQg ? int default_port Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 94ef4dca366198129d98b608db87f65e Text-delta-base-sha1: a4f454bbe911bab62ca12546e9ecaddb1a32bcc5 Text-content-length: 26 Text-content-md5: 9837a5ae7856fa6a008bff6ed09dac0e Text-content-sha1: bc740c12844cbbdc283f298ad82a2357ffed830e Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNAH==, 1 Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c93f74b1d731e90798d510fefba54580 Text-delta-base-sha1: 4edef356f35f3dae7eaf827bd05befd32d9bbfdf Text-content-length: 31 Text-content-md5: 8c9a3bf633ab7ebe129db0b2c6683e53 Text-content-sha1: b6e2887fb79135fd3915e0da23a8272d2c669653 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN8@ 4, 22 }; Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 61798a53184385608fa668f74c6d4f7e Text-delta-base-sha1: 2e52ae0f035902abb95eb7087f8811ddfba20e57 Text-content-length: 31 Text-content-md5: 74a62bb0fd16dcb921fdbba487dad210 Text-content-sha1: f4fa967ccaf05f40f99ca6c446b2770942651d24 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN;C 7, 23 }; Revision-number: 670 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2000-10-04T14:35:31.000000Z K 7 svn:log V 56 Enable protocol prefix on [user@]host argument in Plink K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 48f389e6e77adcc8cca0887ea6c3af37 Text-delta-base-sha1: a2b9a5f1e9893d84f82e3b87885670b57643075d Text-content-length: 1180 Text-content-md5: 3a220a86261faa83d8da318de01703b2 Text-content-sha1: 1c2c0b19717f1b82baff8ac100b4ad52bc681361 Content-length: 1219 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNemwJZlH,Q } else if (!strcmp(p, "-telnet")) { default_protocol = cfg.protocol = PROT_TELNET; default_port = cfg.port = 23; } else if (!strcmp(p, "-raw")) { default_protocol = cfg.protocol = PROT_RAWchar *r; /* * Before we process the [user@]host string, we * first check for the presence of a protocol * prefix (a protocol name followed by ","). */ r = strchr(p, ','); if (r) { int i, j; for (i = 0; backends[i].backend != NULL; i++) { j = strlen(backends[i].name); if (j == r-p && !memcmp(backends[i].name, p, j)) { default_protocol = cfg.protocol = backends[i].protocol; portnumber = backends[i].backend->default_port; p = r+1; break; } } } Revision-number: 671 Prop-content-length: 396 Content-length: 396 K 8 svn:date V 27 2000-10-05T12:15:22.000000Z K 7 svn:log V 295 We now honour the PLINK_PROTOCOL environment variable if it's set. Also we are able to notice when a backend is instantly sendok(), rather than waiting until after the first successful socket read. (This was zogging raw connections. They're still slightly zogged but not as badly as they were.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3a220a86261faa83d8da318de01703b2 Text-delta-base-sha1: 1c2c0b19717f1b82baff8ac100b4ad52bc681361 Text-content-length: 1717 Text-content-md5: cb4d63e1e6b51a76a3dc3d49fc8a83c7 Text-content-sha1: 4bfa7513f8601d50fd0720f867767e6591fb05e4 Content-length: 1757 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNmt,}`sS FM&N`sg{ /* * Override the default protocol if PLINK_PROTOCOL is set. */ char *p = getenv("PLINK_PROTOCOL"); int i; if (p) { for (i = 0; backends[i].backend != NULL; i++) { if (!strcmp(backends[i].name, p)) { default_port = cfg.port = backends[i].backend->default_port; break; } } } }Select port. */ if (portnumber != -1) cfg.port = portnumber; if (!sending && back->sendok()) { /* * Create a separate thread to read from stdin. This is * a total pain, but I can't find another way to do it: * * - an overlapped ReadFile or ReadFileEx just doesn't * happen; we get failure from ReadFileEx, and * ReadFile blocks despite being given an OVERLAPPED * structure. Perhaps we can't do overlapped reads * on consoles. WHY THE HELL NOT? * * - WaitForMultipleObjects(netevent, console) doesn't * work, because it signals the console when * _anything_ happens, including mouse motions and * other things that don't cause data to be readable * - so we're back to ReadFile blocking. */ idata.event = stdinevent; if (!CreateThread(NULL, 0, stdin_read_thread, &idata, 0, &threadid)) { fprintf(stderr, "Unable to create second thread\n"); exit(1); } sending = TRUE; } Revision-number: 672 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2000-10-05T16:48:37.000000Z K 7 svn:log V 101 Remove /DWIN32S_COMPAT by detecting presence of GetSystemPowerStatus at runtime using GetProcAddress K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 34ae837abe041ccbb9c313afff2845d6 Text-delta-base-sha1: 18192d0b278218c07cce147096eecf45ee3b3e09 Text-content-length: 20 Text-content-md5: 4bb2f532848a0879947bd36d316ab2ea Text-content-sha1: 2a880a3a13ca49a55f5f77689c9f1b796d9035fa Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN+O H$ Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6ab0ffd9ec9c5559366ad44720692a32 Text-delta-base-sha1: 29d1d828e8322d021ea54dd90066ed197b2bef91 Text-content-length: 500 Text-content-md5: a9e58d772c5dc1db5e96c33acca2cc3a Text-content-sha1: 21c4f92b17c1dc3696a9d125191db2686b7dd902 Content-length: 539 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNt`!G;e835i9h kGetSystemPowerStatus function. */ typedef BOOL (WINAPI *gsps_t)(LPSYSTEM_POWER_STATUS); gsps_t gsps; HMODULE mod gsps = NULL; mod = GetModuleHandle("KERNEL32"); if (mod) { gsps = (gsps_t)GetProcAddress(mod, "GetSystemPowerStatus"); debug(("got gsps=%p\n", gsps)); } /* * Call GetSystemPowerStatus if present. */ if (gsps) { if (gsps(&pwrstat)) func(&pwrstat, sizeof(pwrstat)); } Revision-number: 673 Prop-content-length: 577 Content-length: 577 K 8 svn:date V 27 2000-10-05T17:19:04.000000Z K 7 svn:log V 476 Revamp the auto-layout of PuTTY configuration box controls. They are now auto-laid-out at runtime instead of compile time. Byebye win_res.inp and mkres.c; byebye most of win_res.rc; hello a whole new load of control-creation functions in windlg.c. Also, now that we're creating the tab control at runtime, we can check to see if it succeeded and use an alternative if so. This _should_ enable the config box to work on Win32s, although at the time of checkin that's untested. K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 83560511b7b01a6d1f3dc3735427f50b Text-delta-base-sha1: f9fcde89a65848037b8b73770e6bdeb69920c1f1 Text-content-length: 125 Text-content-md5: d4c601eedb6d1053de2fd5af8a4b17d1 Text-content-sha1: bb4277a69cf9d2ad6bf4952be2cc1801cdba2101 Content-length: 165 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN{R g\glTABSTATIC1 1002 #define IDC_TABSTATIC2 1003 #define IDC_TABLIST 1004 #define IDC_ABOUT 1005 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 45b37acc3ce19e25eaf44b2cc6f8fad2 Text-delta-base-sha1: 58e320861dbf9d700cec71a64c06d874dc2f721d Text-content-length: 25 Text-content-md5: 83e89d81899c04853889754b4b0a05fe Text-content-sha1: 9c39c06ce3c5a2dcdb8235d6e6a5d1543c7b626d Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVN;`/,I6 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2a172d475536eb0d262e05a099e4111a Text-delta-base-sha1: c9b18bcfcfe3a87107aa90ef2e1885d515c589c6 Text-content-length: 30018 Text-content-md5: 13d1724d1584359f86b24d4e5e60aa39 Text-content-sha1: fc0bf01f63f63626fa9d248783130cce9532f918 Content-length: 30058 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNe$kZfkW[;#CC>_Zl4SeZ +l0mC/2jtkqQ%NnlURnof{n+9'>/* ---------------------------------------------------------------------- * Routines to self-manage the controls in a dialog box. */ #define GAPBETWEEN 3 #define GAPWITHIN 1 #define DLGWIDTH 168 #define STATICHEIGHT 8 #define CHECKBOXHEIGHT 8 #define RADIOHEIGHT 8 #define EDITHEIGHT 12 #define COMBOHEIGHT 12 #define PUSHBTNHEIGHT 14 struct ctlpos { HWND hwnd; LONG units; WPARAM font; int ypos, width; }; /* Used on self-constructed dialogs. */ void ctlposinit(struct ctlpos *cp, HWND hwnd) { RECT r; cp->hwnd = hwnd; cp->units = GetWindowLong(hwnd, GWL_USERDATA); cp->font = GetWindowLong(hwnd, DWL_USER); cp->ypos = GAPBETWEEN; GetClientRect(hwnd, &r); cp->width = (r.right * 4) / (cp->units & 0xFFFF) - 2*GAPBETWEEN; } /* Used on kosher dialogs. */ void ctlposinit2(struct ctlpos *cp, HWND hwnd) { RECT r; cp->hwnd = hwnd; r.left = r.top = 0; r.right = 4; r.bottom = 8; MapDialogRect(hwnd, &r); cp->units = (r.bottom << 16) | r.right; cp->font = SendMessage(hwnd, WM_GETFONT, 0, 0); cp->ypos = GAPBETWEEN; GetClientRect(hwnd, &r); cp->width = (r.right * 4) / (cp->units & 0xFFFF) - 2*GAPBETWEEN; } void doctl(struct ctlpos *cp, RECT r, char *wclass, int wstyle, int exstyle, char *wtext, int wid) { HWND ctl; /* * Note nonstandard use of RECT. This is deliberate: by * transforming the width and height directly we arrange to * have all supposedly same-sized controls really same-sized. */ /* MapDialogRect, or its near equivalent. */ r.left = (r.left * (cp->units & 0xFFFF)) / 4; r.right = (r.right * (cp->units & 0xFFFF)) / 4; r.top = (r.top * ((cp->units>>16) & 0xFFFF)) / 8; r.bottom = (r.bottom * ((cp->units>>16) & 0xFFFF)) / 8; ctl = CreateWindowEx(exstyle, wclass, wtext, wstyle, r.left, r.top, r.right, r.bottom, cp->hwnd, (HMENU)wid, hinst, NULL); SendMessage(ctl, WM_SETFONT, cp->font, MAKELPARAM(TRUE, 0)); } /* * Some edit boxes. Each one has a static above it. The percentages * of the horizontal space are provided. */ void multiedit(struct ctlpos *cp, ...) { RECT r; va_list ap; int percent, xpos; percent = xpos = 0; va_start(ap, cp); while (1) { char *text; int staticid, editid, pcwidth; text = va_arg(ap, char *); if (!text) break; staticid = va_arg(ap, int); editid = va_arg(ap, int); pcwidth = va_arg(ap, int); r.left = xpos + GAPBETWEEN; percent += pcwidth; xpos = (cp->width + GAPBETWEEN) * percent / 100; r.right = xpos - r.left; r.top = cp->ypos; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid); r.top = cp->ypos + 8 + GAPWITHIN; r.bottom = EDITHEIGHT; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", editid); } va_end(ap); cp->ypos += 8+GAPWITHIN+12+GAPBETWEEN; } /* * A set of radio buttons on the same line, with a static above * them. `nacross' dictates how many parts the line is divided into * (you might want this not to equal the number of buttons if you * needed to line up some 2s and some 3s to look good in the same * panel). */ void radioline(struct ctlpos *cp, char *text, int id, int nacross, ...) { RECT r; va_list ap; int group; int i; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id); va_start(ap, nacross); group = WS_GROUP; i = 0; while (1) { char *btext; int bid; btext = va_arg(ap, char *); if (!btext) break; bid = va_arg(ap, int); r.left = GAPBETWEEN + i * (cp->width+GAPBETWEEN)/nacross; r.right = (i+1) * (cp->width+GAPBETWEEN)/nacross - r.left; r.top = cp->ypos; r.bottom = RADIOHEIGHT; doctl(cp, r, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group, 0, btext, bid); group = 0; i++; } va_end(ap); cp->ypos += r.bottom + GAPBETWEEN; } /* * A set of radio buttons on multiple lines, with a static above * them. */ void radiobig(struct ctlpos *cp, char *text, int id, ...) { RECT r; va_list ap; int group; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id); va_start(ap, id); group = WS_GROUP; while (1) { char *btext; int bid; btext = va_arg(ap, char *); if (!btext) break; bid = va_arg(ap, int); r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group, 0, btext, bid); group = 0; } va_end(ap); cp->ypos += GAPBETWEEN - GAPWITHIN; } /* * A single standalone checkbox. */ void checkbox(struct ctlpos *cp, char *text, int id) { RECT r; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = CHECKBOXHEIGHT; cp->ypos += r.bottom + GAPBETWEEN; doctl(cp, r, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, text, id); } /* * A button on the right hand side, with a static to its left. */ void staticbtn(struct ctlpos *cp, char *stext, int sid, char *btext, int bid) { const int height = (PUSHBTNHEIGHT > STATICHEIGHT ? PUSHBTNHEIGHT : STATICHEIGHT); RECT r; int lwid, rwid, rpos; rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4; lwid = rpos - 2*GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; r.left = GAPBETWEEN; r.top = cp->ypos + (height-STATICHEIGHT)/2; r.right = lwid; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); r.left = rpos; r.top = cp->ypos + (height-PUSHBTNHEIGHT)/2; r.right = rwid; r.bottom = PUSHBTNHEIGHT; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); cp->ypos += height + GAPBETWEEN; } /* * An edit control on the right hand side, with a static to its left. */ void staticedit(struct ctlpos *cp, char *stext, int sid, int eid) { const int height = (EDITHEIGHT > STATICHEIGHT ? EDITHEIGHT : STATICHEIGHT); RECT r; int lwid, rwid, rpos; rpos = GAPBETWEEN + (cp->width + GAPBETWEEN) / 2; lwid = rpos - 2*GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; r.left = GAPBETWEEN; r.top = cp->ypos + (height-STATICHEIGHT)/2; r.right = lwid; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); r.left = rpos; r.top = cp->ypos + (height-EDITHEIGHT)/2; r.right = rwid; r.bottom = EDITHEIGHT; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", eid); cp->ypos += height + GAPBETWEEN; } /* * A tab-control substitute when a real tab control is unavailable. */ void ersatztab(struct ctlpos *cp, char *stext, int sid, int lid, int s2id) { const int height = (COMBOHEIGHT > STATICHEIGHT ? COMBOHEIGHT : STATICHEIGHT); RECT r; int bigwid, lwid, rwid, rpos; static const int BIGGAP = 15; static const int MEDGAP = 3; bigwid = cp->width + 2*GAPBETWEEN - 2*BIGGAP; cp->ypos += MEDGAP; rpos = BIGGAP + (bigwid + BIGGAP) / 2; lwid = rpos - 2*BIGGAP; rwid = bigwid + BIGGAP - rpos; r.left = BIGGAP; r.top = cp->ypos + (height-STATICHEIGHT)/2; r.right = lwid; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); r.left = rpos; r.top = cp->ypos + (height-COMBOHEIGHT)/2; r.right = rwid; r.bottom = COMBOHEIGHT*10; doctl(cp, r, "COMBOBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", lid); cp->ypos += height + MEDGAP + GAPBETWEEN; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = 2; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, 0, "", s2id); } /* * A static line, followed by an edit control on the left hand side * and a button on the right. */ void editbutton(struct ctlpos *cp, char *stext, int sid, int eid, char *btext, int bid) { const int height = (EDITHEIGHT > PUSHBTNHEIGHT ? EDITHEIGHT : PUSHBTNHEIGHT); RECT r; int lwid, rwid, rpos; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4; lwid = rpos - 2*GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; r.left = GAPBETWEEN; r.top = cp->ypos + (height-EDITHEIGHT)/2; r.right = lwid; r.bottom = EDITHEIGHT; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", eid); r.left = rpos; r.top = cp->ypos + (height-PUSHBTNHEIGHT)/2; r.right = rwid; r.bottom = PUSHBTNHEIGHT; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); cp->ypos += height + GAPBETWEEN; } /* * Special control which was hard to describe generically: the * session-saver assembly. A static; below that an edit box; below * that a list box. To the right of the list box, a column of * buttons. */ void sesssaver(struct ctlpos *cp, char *text, int staticid, int editid, int listid, ...) { RECT r; va_list ap; int lwid, rwid, rpos; int y; const int LISTDEFHEIGHT = 66; rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4; lwid = rpos - 2*GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; /* The static control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid); /* The edit control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; r.bottom = EDITHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", staticid); /* * The buttons (we should hold off on the list box until we * know how big the buttons are). */ va_start(ap, listid); y = cp->ypos; while (1) { char *btext = va_arg(ap, char *); int bid; if (!btext) break; bid = va_arg(ap, int); r.left = rpos; r.top = y; r.right = rwid; r.bottom = PUSHBTNHEIGHT; y += r.bottom + GAPWITHIN; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); } /* Compute list box height. LISTDEFHEIGHT, or height of buttons. */ y -= cp->ypos; y -= GAPWITHIN; if (y < LISTDEFHEIGHT) y = LISTDEFHEIGHT; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; r.bottom = y; cp->ypos += y + GAPBETWEEN; doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", listid); } /* * Another special control: the environment-variable setter. A * static line first; then a pair of edit boxes with associated * statics, and two buttons; then a list box. */ void envsetter(struct ctlpos *cp, char *stext, int sid, char *e1stext, int e1sid, int e1id, char *e2stext, int e2sid, int e2id, int listid, char *b1text, int b1id, char *b2text, int b2id) { RECT r; const int height = (STATICHEIGHT > EDITHEIGHT && STATICHEIGHT > PUSHBTNHEIGHT ? STATICHEIGHT : EDITHEIGHT > PUSHBTNHEIGHT ? EDITHEIGHT : PUSHBTNHEIGHT); const static int percents[] = { 20, 35, 10, 25 }; int i, j, xpos, percent; const int LISTHEIGHT = 42; /* The static control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); /* The statics+edits+buttons. */ for (j = 0; j < 2; j++) { percent = 10; for (i = 0; i < 4; i++) { xpos = (cp->width + GAPBETWEEN) * percent / 100; r.left = xpos + GAPBETWEEN; percent += percents[i]; xpos = (cp->width + GAPBETWEEN) * percent / 100; r.right = xpos - r.left; r.top = cp->ypos; r.bottom = (i==0 ? STATICHEIGHT : i==1 ? EDITHEIGHT : PUSHBTNHEIGHT); r.top += (height-r.bottom)/2; if (i==0) { doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, j==0 ? e1stext : e2stext, j==0 ? e1sid : e2sid); } else if (i==1) { doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", j==0 ? e1id : e2id); } else if (i==3) { doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, j==0 ? b1text : b2text, j==0 ? b1id : b2id); } } cp->ypos += height + GAPWITHIN; } /* The list box. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = LISTHEIGHT; cp->ypos += r.bottom + GAPBETWEEN; doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | LBS_USETABSTOPS, WS_EX_CLIENTEDGE, "", listid); } /* * Yet another special control: the character-class setter. A * static, then a list, then a line containing a * button-and-static-and-edit. */ void charclass(struct ctlpos *cp, char *stext, int sid, int listid, char *btext, int bid, int eid, char *s2text, int s2id) { RECT r; const int height = (STATICHEIGHT > EDITHEIGHT && STATICHEIGHT > PUSHBTNHEIGHT ? STATICHEIGHT : EDITHEIGHT > PUSHBTNHEIGHT ? EDITHEIGHT : PUSHBTNHEIGHT); const static int percents[] = { 30, 40, 30 }; int i, xpos, percent; const int LISTHEIGHT = 66; /* The static control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); /* The list box. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = LISTHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | LBS_USETABSTOPS, WS_EX_CLIENTEDGE, "", listid); /* The button+static+edit. */ percent = xpos = 0; for (i = 0; i < 3; i++) { r.left = xpos + GAPBETWEEN; percent += percents[i]; xpos = (cp->width + GAPBETWEEN) * percent / 100; r.right = xpos - r.left; r.top = cp->ypos; r.bottom = (i==0 ? PUSHBTNHEIGHT : i==1 ? STATICHEIGHT : EDITHEIGHT); r.top += (height-r.bottom)/2; if (i==0) { doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); } else if (i==1) { doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_CENTER, 0, s2text, s2id); } else if (i==2) { doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", eid); } } cp->ypos += height + GAPBETWEEN; } /* * A special control (horrors!). The colour editor. A static line; * then on the left, a list box, and on the right, a sequence of * two-part statics followed by a button. */ void colouredit(struct ctlpos *cp, char *stext, int sid, int listid, char *btext, int bid, ...) { RECT r; int y; va_list ap; int lwid, rwid, rpos; const int LISTHEIGHT = 66; /* The static control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); rpos = GAPBETWEEN + 2 * (cp->width + GAPBETWEEN) / 3; lwid = rpos - 2*GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; /* The list box. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; r.bottom = LISTHEIGHT; doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | LBS_USETABSTOPS, WS_EX_CLIENTEDGE, "", listid); /* The statics. */ y = cp->ypos; va_start(ap, bid); while (1) { char *ltext; int lid, rid; ltext = va_arg(ap, char *); if (!ltext) break; lid = va_arg(ap, int); rid = va_arg(ap, int); r.top = y; r.bottom = STATICHEIGHT; y += r.bottom + GAPWITHIN; r.left = rpos; r.right = rwid/2; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, ltext, lid); r.left = rpos + r.right; r.right = rwid - r.right; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_RIGHT, 0, "", rid); } va_end(ap); /* The button. */ r.top = y + 2*GAPWITHIN; r.bottom = PUSHBTNHEIGHT; r.left = rpos; r.right = rwid; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); cp->ypos += LISTHEIGHT + GAPBETWEENSETFONT: { HFONT hfont = (HFONT)wParam; HFONT oldfont; HDC hdc; TEXTMETRIC tm; LONG units; hdc = GetDC(hwnd); oldfont = SelectObject(hdc, hfont); GetTextMetrics(hdc, &tm); units = (tm.tmHeight << 16) | tm.tmAveCharWidth; SelectObject(hdc, oldfont); DeleteDC(hdc); SetWindowLong(hwnd, GWL_USERDATA, units); SetWindowLong(hwnd, DWL_USER, wParam); } return 0; struct ctlpos cp; switch (msg) { case WM_INITDIALOG: /* Accelerators used: [aco] dehlnprstwx */ ctlposinit(&cp, hwnd); multiedit(&cp, "Host &Name", IDC0_HOSTSTATIC, IDC0_HOST, 75, "&Port", IDC0_PORTSTATIC, IDC0_PORT, 25, NULL); radioline(&cp, "Protocol:", IDC0_PROTSTATIC, 3, "&Raw", IDC0_PROTRAW, "&Telnet", IDC0_PROTTELNET, #ifdef FWHACK "SS&H/hack", #else "SS&H", #endif IDC0_PROTSSH, NULL); sesssaver(&cp, "Stor&ed Sessions", IDC0_SESSSTATIC, IDC0_SESSEDIT, IDC0_SESSLIST, "&Load", IDC0_SESSLOAD, "&Save", IDC0_SESSSAVE, "&Delete", IDC0_SESSDEL, NULL); checkbox(&cp, "Close Window on E&xit", IDC0_CLOSEEXIT); checkbox(&cp, "&Warn on Close", IDC0_CLOSEWARN); WPARAM wParam, LPARAM lParam) { struct ctlpos cp; switch (msg) { case WM_INITDIALOG: /* Accelerators used: [aco] 4?ehiklmnprsuvxy */ ctlposinit(&cp, hwnd); radioline(&cp, "Action of Backspace:", IDC1_DELSTATIC, 2, "Control-&H", IDC1_DEL008, "Control-&? (127)", IDC1_DEL127, NULL); radioline(&cp, "Action of Home and End:", IDC1_HOMESTATIC, 2, "&Standard", IDC1_HOMETILDE, "&rxvt", IDC1_HOMERXVT, NULL); radioline(&cp, "Function key and keypad layout:", IDC1_FUNCSTATIC, 3, "&VT400", IDC1_FUNCTILDE, "&Linux", IDC1_FUNCLINUX, "&Xterm R6", IDC1_FUNCXTERM, NULL); radioline(&cp, "Initial state of cursor keys:", IDC1_CURSTATIC, 2, "&Normal", IDC1_CURNORMAL, "A&pplication", IDC1_CURAPPLIC, NULL); radioline(&cp, "Initial state of numeric keypad:", IDC1_KPSTATIC, 3, "Nor&mal", IDC1_KPNORMAL, "Appl&ication", IDC1_KPAPPLIC, "N&etHack", IDC1_KPNH, NULL); checkbox(&cp, "ALT-F&4 is special (closes window)", IDC1_ALTF4); checkbox(&cp, "ALT-Space is special (S&ystem menu)", IDC1_ALTSPACE); checkbox(&cp, "&Use local terminal line discipline", IDC1_LDISCTERM); checkbox(&cp, "Reset scrollback on &keypress", IDC1_SCROLLKEY); struct ctlpos cp; /* Accelerators used: [aco] dghlmnprsw */ ctlposinit(&cp, hwnd); multiedit(&cp, "&Rows", IDC2_ROWSSTATIC, IDC2_ROWSEDIT, 33, "Colu&mns", IDC2_COLSSTATIC, IDC2_COLSEDIT, 33, "&Scrollback", IDC2_SAVESTATIC, IDC2_SAVEEDIT, 33, NULL); staticbtn(&cp, "", IDC2_FONTSTATIC, "C&hange...", IDC2_CHOOSEFONT); checkbox(&cp, "Auto &wrap mode initially on", IDC2_WRAPMODE); checkbox(&cp, "&DEC Origin Mode initially on", IDC2_DECOM); checkbox(&cp, "Implicit CR in every &LF", IDC2_LFHASCR); checkbox(&cp, "Bee&p enabled", IDC1_BEEP); checkbox(&cp, "Use Back&ground colour erase", IDC2_BCE); checkbox(&cp, "Enable bli&nking text", IDC2_BLINKTEXT); truct ctlpos cp; switch (msg) { case WM_INITDIALOG: /* Accelerators used: [aco] bikty */ ctlposinit(&cp, hwnd); multiedit(&cp, "Initial window &title:", IDCW_WINTITLE, IDCW_WINEDIT, 100, NULL); checkbox(&cp, "Avoid ever using &icon title", IDCW_WINNAME); checkbox(&cp, "&Blinking cursor", IDCW_BLINKCUR); checkbox(&cp, "Displa&y scrollbar", IDCW_SCROLLBAR); checkbox(&cp, "Loc&k Window size", IDCW_LOCKSIZE); struct ctlpos cp; switch (msg) { case WM_INITDIALOG: /* Accelerators used: [aco] bdflrstuv */ ctlposinit(&cp, hwnd); staticedit(&cp, "Terminal-&type string", IDC3_TTSTATIC, IDC3_TTEDIT); staticedit(&cp, "Terminal-&speed string", IDC3_TSSTATIC, IDC3_TSEDIT); staticedit(&cp, "Auto-login &username", IDC3_LOGSTATIC, IDC3_LOGEDIT); envsetter(&cp, "Environment variables:", IDC3_ENVSTATIC, "&Variable", IDC3_VARSTATIC, IDC3_VAREDIT, "Va&lue", IDC3_VALSTATIC, IDC3_VALEDIT, IDC3_ENVLIST, "A&dd", IDC3_ENVADD, "&Remove", IDC3_ENVREMOVE); radioline(&cp, "Handling of OLD_ENVIRON ambiguity:", IDC3_EMSTATIC, 2, "&BSD (commonplace)", IDC3_EMBSD, "R&FC 1408 (unusual)", IDC3_EMRFC, NULL); struct ctlpos cp; /* Accelerators used: [aco] 123abdkmprtuw */ ctlposinit(&cp, hwnd); staticedit(&cp, "Terminal-&type string", IDC3_TTSTATIC, IDC3_TTEDIT); staticedit(&cp, "Auto-login &username", IDC3_LOGSTATIC, IDC3_LOGEDIT); multiedit(&cp, "&Remote command:", IDC3_CMDSTATIC, IDC3_CMDEDIT, 100, NULL); checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC3_NOPTY); checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication", IDC3_AUTHTIS); checkbox(&cp, "Allow &agent forwarding", IDC3_AGENTFWD); editbutton(&cp, "Private &key file for authentication:", IDC3_PKSTATIC, IDC3_PKEDIT, "Bro&wse...", IDC3_PKBUTTON); radioline(&cp, "Preferred SSH protocol version:", IDC3_SSHPROTSTATIC, 2, "&1", IDC3_SSHPROT1, "&2", IDC3_SSHPROT2, NULL); radioline(&cp, "Preferred encryption algorithm:", IDC3_CIPHERSTATIC, 3, "&3DES", IDC3_CIPHER3DES, "&Blowfish", IDC3_CIPHERBLOWF, "&DES", IDC3_CIPHERDES, NULL); struct ctlpos cp; int i; switch (msg) { case WM_INITDIALOG: /* Accelerators used: [aco] stwx */ ctlposinit(&cp, hwnd); radiobig(&cp, "Action of mouse buttons:", IDC4_MBSTATIC, "&Windows (Right pastes, Middle extends)", IDC4_MBWINDOWS, "&xterm (Right extends, Middle pastes)", IDC4_MBXTERM, NULL); charclass(&cp, "Character classes:", IDC4_CCSTATIC, IDC4_CCLIST, "&Set", IDC4_CCSET, IDC4_CCEDIT, "&to class", IDC4_CCSTATIC2); truct ctlpos cp; switch (msg) { case WM_INITDIALOG: /* Accelerators used: [aco] bmlu */ ctlposinit(&cp, hwnd); checkbox(&cp, "&Bolded text is a different colour", IDC5_BOLDCOLOUR); checkbox(&cp, "Attempt to use &logical palettes", IDC5_PALETTE); colouredit(&cp, "Select a colo&ur and click to modify it:", IDC5_STATIC, IDC5_LIST, "&Modify...", IDC5_CHANGE, "Red:", IDC5_RSTATIC, IDC5_RVALUE, "Green:", IDC5_GSTATIC, IDC5_GVALUE, "Blue:", IDC5_BSTATIC, IDC5_BVALUE, NULL); truct ctlpos cp; switch (msg) { case WM_INITDIALOG: /* Accelerators used: [aco] beiknpsx */ ctlposinit(&cp, hwnd); radiobig(&cp, "Handling of VT100 line drawing characters:", IDC2_VTSTATIC, "Font has &XWindows encoding", IDC2_VTXWINDOWS, "Use font in &both ANSI and OEM modes", IDC2_VTOEMANSI, "Use font in O&EM mode only", IDC2_VTOEMONLY, "&Poor man's line drawing (""+"", ""-"" and ""|"")", IDC2_VTPOORMAN, NULL); radiobig(&cp, "Character set translation:", IDC6_XLATSTATIC, "&None", IDC6_NOXLAT, "&KOI8 / Win-1251", IDC6_KOI8WIN1251, "&ISO-8859-2 / Win-1250", IDC6_88592WIN1250, NULL); checkbox(&cp, "CAP&S LOCK acts as cyrillic switch", IDC6_CAPSLOCKCYR); HWND makesubdialog(HWND hwnd, int x, int y, int w, int h, int n) { RECT r; HWND ret; WPARAM font; r.left = x; r.top = y; r.right = r.left + w; r.bottom = r.top + h; MapDialogRect(hwnd, &r); ret = CreateWindowEx(WS_EX_CONTROLPARENT, WC_DIALOG, "", /* no title */ WS_CHILD | WS_VISIBLE | DS_SETFONT, r.left, r.top, r.right-r.left, r.bottom-r.top, hwnd, (HMENU)(panelids[n]), hinst, NULL); SetWindowLong (ret, DWL_DLGPROC, (LONG)panelproc[n]); font = SendMessage(hwnd, WM_GETFONT, 0, 0); SendMessage (ret, WM_SETFONT, font, MAKELPARAM(0, 0)); SendMessage (ret, WM_INITDIALOG, 0, 0); return ret; }, tabctl { RECT r; r.left = 3; r.right = r.left + 174; r.top = 3; r.bottom = r.top + 193; MapDialogRect(hwnd, &r); tabctl = CreateWindowEx(0, WC_TABCONTROL, "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | TCS_MULTILINE, r.left, r.top, r.right-r.left, r.bottom-r.top, hwnd, (HMENU)IDC_TAB, hinst, NULL); if (!tabctl) { struct ctlpos cp; ctlposinit2(&cp, hwnd); ersatztab(&cp, "Category:", IDC_TABSTATIC1, IDC_TABLIST, IDC_TABSTATIC2); } else { WPARAM font = SendMessage(hwnd, WM_GETFONT, 0, 0); SendMessage(tabctl, WM_SETFONT, font, MAKELPARAM(TRUE, 0)); } } *page = NULL; if (tabctl) { tabctl, i, &tab); } } else { int i; for (i=0; ihwndFrom); /* ensure focus stays */ return 0; } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_TABLIST: if (HIWORD(wParam) == CBN_SELCHANGE) { HWND tablist = GetDlgItem (hwnd, IDC_TABLIST); int i = SendMessage (tablist, CB_GETCURSEL, 0, 0); if (*page) DestroyWindow (*page); *page = makesubdialog(hwnd, 6, 30, 168, 163, panelnums[i]); SetFocus(tablist); /* ensure focus stays */ return 0; } break; Node-path: putty/win_res.inp Node-action: delete Node-path: putty/mkres.c Node-action: delete Revision-number: 674 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 29 Remove rogue debug statement K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-06T08:06:23.000000Z PROPS-END Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a9e58d772c5dc1db5e96c33acca2cc3a Text-delta-base-sha1: 21c4f92b17c1dc3696a9d125191db2686b7dd902 Text-content-length: 20 Text-content-md5: f372058eaa238ab93d28d1cdfb2ed4e0 Text-content-sha1: 6e7a68e1719492b064f16efa43a68308c3192964 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN`8 , T Revision-number: 675 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2000-10-06T08:10:53.000000Z K 7 svn:log V 68 Add LBS_STANDARD on saved session list box, so you can double-click K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 13d1724d1584359f86b24d4e5e60aa39 Text-delta-base-sha1: fc0bf01f63f63626fa9d248783130cce9532f918 Text-content-length: 58 Text-content-md5: 62a8ae564b66098855c31fdcf1155afb Text-content-sha1: 3838ca6fd4966309194e4624078832fed2b14c75 Content-length: 98 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNtFE-(o LBS_STANDARD Revision-number: 676 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2000-10-06T09:06:33.000000Z K 7 svn:log V 67 Localise control IDs in each dialog procedure, for maintainability K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d4c601eedb6d1053de2fd5af8a4b17d1 Text-delta-base-sha1: bb4277a69cf9d2ad6bf4952be2cc1801cdba2101 Text-content-length: 57 Text-content-md5: 36632719c2bf16b0fbc3d917cb9592c2 Text-content-sha1: 9321fd3fb6727907b30f2c1c1c0f905743dc1690 Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNRd %xG}#define IDC_SUBDLG 1006 #endif Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 62a8ae564b66098855c31fdcf1155afb Text-delta-base-sha1: 3838ca6fd4966309194e4624078832fed2b14c75 Text-content-length: 19738 Text-content-md5: 3574575cdfea2a255818f16118800b06 Text-content-sha1: 64296ee1f07d06541a92dc49c0958b958300fb22 Content-length: 19778 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN;G4\>frT;b7a@W}RW}Fu[7D ~3X5.U;m[*_}W}`{~Z-uT6jG@ f%U;Wnp9j*H<J=QG@BP}X8X*{U5 &^1eT;da4f`fhO6 `$G@L;W}|?V@DP}:W}QG@MG@PsFDl>M?xT;\J9RrauT? yA LU;e2Ked:i%Q|q]9pOW}M| m:]P}~;i:8W;Ef[rU8Q|h%e Y3T@F enum { controlstartvalue = 1000, IDC_HOSTSTATIC, IDC_HOST, IDC_PORTSTATIC, IDC_PORT, IDC_PROTSTATIC, IDC_PROTRAW, IDC_PROTTELNET, IDC_PROTSSH, IDC_SESSSTATIC, IDC_SESSEDIT, IDC_SESSLIST, IDC_SESSLOAD, IDC_SESSSAVE, IDC_SESSDEL, IDC_CLOSEEXIT, IDC_CLOSEWARN }_HOSTSTATIC, IDC_HOST, 75, "&Port", IDC_PORTSTATIC, IDC_PORT, 25, NULL); radioline(&cp, "Protocol:", IDC_PROTSTATIC, 3, "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTTELNET, #ifdef FWHACK "SS&H/hack", #else "SS&H", #endif IDC_SESSSTATIC, IDC_SESSEDIT, IDC_SESSLIST, "&Load", IDC_SESSLOAD, "&Save", IDC_SESSSAVE, "&Delete", IDC_SESSDEL, NULL); checkbox(&cp, "Close Window on E&xit", IDC_CLOSEEXIT); checkbox(&cp, "&Warn on Close", IDC_CLOSEWARN); SetDlgItemText (hwnd, IDC_HOST, cfg.host); SetDlgItemText (hwnd, IDC_SESSEDIT, savedsession); SetDlgItemInt (hwnd, IDC_SESSLIST, LB_ADDSTRING, 0, (LPARAM) (sessions[i])); CheckRadioButton (hwnd, IDC_PROTRAW, IDC_PROTSSH, cfg.protocol==PROT_SSH ? IDC_PROTSSH : cfg.protocol==PROT_TELNET ? IDC_PROTTELNET : IDC_PROTRAW ); CheckDlgButton (hwnd, IDC_CLOSEEXIT, cfg.close_on_exit); CheckDlgButton (hwnd, IDC_PROTTELNET: case IDC_PROTSSH: case IDC_PROTSSH); int j = IsDlgButtonChecked (hwnd, IDC_PORT, cfg.port, FALSE); } } break; case IDC_HOST: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_HOST, cfg.host, sizeof(cfg.host)-1); break; case IDC_PORT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_PORT, &cfg.port); break; case IDC_CLOSEEXITclose_on_exit = IsDlgButtonChecked (hwnd, IDC_CLOSEEXIT); break; case IDC_CLOSEWARNwarn_on_close = IsDlgButtonChecked (hwnd, IDC_CLOSEWARN); break; case IDC_SESSEDIT: if (HIWORD(wParam) == EN_CHANGE) { SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) -1, 0); GetDlgItemText (hwnd, IDC_SESSSAVE { /* * Save a session */ char str[2048]; GetDlgItemText (hwnd, IDC_SESSEDIT, str, sizeof(str)-1); if (!*str) { int n = SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) -1, 0); } break; case IDC_SESSLIST: case IDC_SESSLOAD: if (LOWORD(wParam) == IDC_HOST, cfg.host); SetDlgItemInt (hwnd, IDC_PORT, cfg.port, FALSE); CheckRadioButton (hwnd, IDC_PROTRAW, IDC_PROTSSH, (cfg.protocol==PROT_SSH ? IDC_PROTSSH : cfg.protocol==PROT_TELNET ? IDC_PROTTELNET : IDC_PROTRAW)); CheckDlgButton (hwnd, IDC_CLOSEEXIT, cfg.close_on_exit); CheckDlgButton (hwnd, IDC_CLOSEWARN, cfg.warn_on_close); SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) -1, 0); } if (LOWORD(wParam) == IDC_SESSDEL { int n = SendDlgItemMessage (hwnd, IDCenum { controlstartvalue = 1000, IDC_DELSTATIC, IDC_DEL008, IDC_DEL127, IDC_HOMESTATIC, IDC_HOMETILDE, IDC_HOMERXVT, IDC_FUNCSTATIC, IDC_FUNCTILDE, IDC_FUNCLINUX, IDC_FUNCXTERM, IDC_KPSTATIC, IDC_KPNORMAL, IDC_KPAPPLIC, IDC_KPNH, IDC_CURSTATIC, IDC_CURNORMAL, IDC_CURAPPLIC, IDC_ALTF4, IDC_ALTSPACE, IDC_LDISCTERM, IDC_SCROLLKEY }_DELSTATIC, 2, "Control-&H", IDC_DEL008, "Control-&? (127)", IDC_DEL127, NULL); radioline(&cp, "Action of Home and End:", IDC_HOMESTATIC, 2, "&Standard", IDC_HOMETILDE, "&rxvt", IDC_HOMERXVT, NULL); radioline(&cp, "Function key and keypad layout:", IDC_FUNCSTATIC, 3, "&VT400", IDC_FUNCTILDE, "&Linux", IDC_FUNCLINUX, "&Xterm R6", IDC_FUNCXTERM, NULL); radioline(&cp, "Initial state of cursor keys:", IDC_CURSTATIC, 2, "&Normal", IDC_CURNORMAL, "A&pplication", IDC_CURAPPLIC, NULL); radioline(&cp, "Initial state of numeric keypad:", IDC_KPSTATIC, 3, "Nor&mal", IDC_KPNORMAL, "Appl&ication", IDC_KPAPPLIC, "N&etHack", IDC_ALTF4); checkbox(&cp, "ALT-Space is special (S&ystem menu)", IDC_ALTSPACE); checkbox(&cp, "&Use local terminal line discipline", IDC_LDISCTERM); checkbox(&cp, "Reset scrollback on &keypress", IDC_SCROLLKEY); CheckRadioButton (hwnd, IDC_DEL008, IDC_DEL127, cfg.bksp_is_delete ? IDC_DEL127 : IDC_DEL008); CheckRadioButton (hwnd, IDC_HOMETILDE, IDC_HOMERXVT, cfg.rxvt_homeend ? IDC_HOMERXVT : IDC_HOMETILDE); CheckRadioButton (hwnd, IDC_FUNCTILDE, IDC_FUNCXTERM, cfg.funky_type ? (cfg.funky_type==2 ? IDC_FUNCXTERM : IDC_FUNCLINUX ) : IDC_FUNCTILDE); CheckRadioButton (hwnd, IDC_CURNORMAL, IDC_CURAPPLIC, cfg.app_cursor ? IDC_CURAPPLIC : IDC_CURNORMAL); CheckRadioButton (hwnd, IDC_KPNORMAL, IDC_KPNH, cfg.nethack_keypad ? IDC_KPNH : cfg.app_keypad ? IDC_KPAPPLIC : IDC_KPNORMAL); CheckDlgButton (hwnd, IDC_ALTF4, cfg.alt_f4); CheckDlgButton (hwnd, IDC_ALTSPACE, cfg.alt_space); CheckDlgButton (hwnd, IDC_LDISCTERM, cfg.ldisc_term); CheckDlgButton (hwnd, IDC_DEL008: case IDC_DEL127: cfg.bksp_is_delete = IsDlgButtonChecked (hwnd, IDC_DEL127); break; case IDC_HOMETILDE: case IDC_HOMERXVT: cfg.rxvt_homeend = IsDlgButtonChecked (hwnd, IDC_HOMERXVT); break; case IDC_FUNCXTERM: cfg.funky_type = 2; break; case IDC_FUNCTILDE: case IDC_FUNCLINUX: cfg.funky_type = IsDlgButtonChecked (hwnd, IDC_FUNCLINUX); break; case IDC_KPNORMAL: case IDC_KPAPPLIC: cfg.app_keypad = IsDlgButtonChecked (hwnd, IDC_KPAPPLIC); cfg.nethack_keypad = FALSE; break; case IDC_CURNORMAL: case IDC_CURAPPLIC: cfg.app_cursor = IsDlgButtonChecked (hwnd, IDC_CURAPPLIC); break; case IDC_ALTF4alt_f4 = IsDlgButtonChecked (hwnd, IDC_ALTF4); break; case IDC_ALTSPACE); break; case IDC_LDISCTERM); break; case IDC_SCROLLKEYscroll_on_key = IsDlgButtonChecked (hwnd, IDC enum { controlstartvalue = 1000, IDC_WRAPMODE, IDC_DECOM, IDC_DIMSTATIC, IDC_ROWSSTATIC, IDC_ROWSEDIT, IDC_COLSSTATIC, IDC_COLSEDIT, IDC_SAVESTATIC, IDC_SAVEEDIT, IDC_FONTSTATIC, IDC_CHOOSEFONT, IDC_LFHASCR, IDC_BEEP, IDC_BCE, IDC_BLINKTEXT }_ROWSSTATIC, IDC_ROWSEDIT, 33, "Colu&mns", IDC_COLSSTATIC, IDC_COLSEDIT, 33, "&Scrollback", IDC_SAVESTATIC, IDC_SAVEEDIT, 33, NULL); staticbtn(&cp, "", IDC_FONTSTATIC, "C&hange...", IDC_CHOOSEFONT); checkbox(&cp, "Auto &wrap mode initially on", IDC_WRAPMODE); checkbox(&cp, "&DEC Origin Mode initially on", IDC_DECOM); checkbox(&cp, "Implicit CR in every &LF", IDC_LFHASCR); checkbox(&cp, "Bee&p enabled", IDC_BEEP); checkbox(&cp, "Use Back&ground colour erase", IDC_BCE); checkbox(&cp, "Enable bli&nking text", IDC_BLINKTEXT); CheckDlgButton (hwnd, IDC_WRAPMODE, cfg.wrap_mode); CheckDlgButton (hwnd, IDC_DECOM, cfg.dec_om); CheckDlgButton (hwnd, IDC_LFHASCR, cfg.lfhascr); SetDlgItemInt (hwnd, IDC_ROWSEDIT, cfg.height, FALSE); SetDlgItemInt (hwnd, IDC_COLSEDIT, cfg.width, FALSE); SetDlgItemInt (hwnd, IDC_SAVEEDIT, cfg.savelines, FALSE); fmtfont (fontstatic); SetDlgItemText (hwnd, IDC_FONTSTATIC, fontstatic); CheckDlgButton (hwnd, IDC_BEEP, cfg.beep); CheckDlgButton (hwnd, IDC_BCE, cfg.bce); CheckDlgButton (hwnd, IDC_WRAPMODEwrap_mode = IsDlgButtonChecked (hwnd, IDC_WRAPMODE); break; case IDC_DECOMdec_om = IsDlgButtonChecked (hwnd, IDC_DECOM); break; case IDC_LFHASCR); break; case IDC_ROWSEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_ROWSEDIT, &cfg.height); break; case IDC_COLSEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_COLSEDIT, &cfg.width); break; case IDC_SAVEEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_SAVEEDIT, &cfg.savelines); break; case IDC_FONTSTATIC, fontstatic); } break; case IDC_BEEPeep = IsDlgButtonChecked (hwnd, IDC_BEEP); break; case IDC_BLINKTEXT); break; case IDCenum { controlstartvalue = 1000, IDC_WINNAME, IDC_BLINKCUR, IDC_SCROLLBAR, IDC_LOCKSIZE, IDC_WINTITLE, IDC_WINEDIT }_WINTITLE, IDC_WINEDIT, 100, NULL); checkbox(&cp, "Avoid ever using &icon title", IDC_WINNAME); checkbox(&cp, "&Blinking cursor", IDC_BLINKCUR); checkbox(&cp, "Displa&y scrollbar", IDC_SCROLLBAR); checkbox(&cp, "Loc&k Window size", IDC_LOCKSIZE); SetDlgItemText (hwnd, IDC_WINEDIT, cfg.wintitle); CheckDlgButton (hwnd, IDC_WINNAME, cfg.win_name_always); CheckDlgButton (hwnd, IDC_BLINKCUR, cfg.blink_cur); CheckDlgButton (hwnd, IDC_SCROLLBAR, cfg.scrollbar); CheckDlgButton (hwnd, IDC_WINNAMEwin_name_always = IsDlgButtonChecked (hwnd, IDC_WINNAME); break; case IDC_BLINKCUblink_cur = IsDlgButtonChecked (hwnd, IDC_BLINKCUR); break; case IDC_SCROLLBAR); break; case IDC_LOCKSIZ cfg.locksize = IsDlgButtonChecked (hwnd, IDC_LOCKSIZE); break; case IDC_WIN enum { controlstartvalue = 1000, IDC_TTSTATIC, IDC_TTEDIT, IDC_TSSTATIC, IDC_TSEDIT, IDC_LOGSTATIC, IDC_LOGEDIT, IDC_ENVSTATIC, IDC_VARSTATIC, IDC_VAREDIT, IDC_VALSTATIC, IDC_VALEDIT, IDC_ENVLIST, IDC_ENVADD, IDC_ENVREMOVE, IDC_EMSTATIC, IDC_EMBSD, IDC_EMRFC }dflrstuv_TTSTATIC, IDC_TTEDIT); staticedit(&cp, "Terminal-&speed string", IDC_TSSTATIC, IDC_TSEDIT); staticedit(&cp, "Auto-login &username", IDC_LOGSTATIC, IDC_LOGEDIT); envsetter(&cp, "Environment variables:", IDC_ENVSTATIC, "&Variable", IDC_VARSTATIC, IDC_VAREDIT, "Va&lue", IDC_VALSTATIC, IDC_VALEDIT, IDC_ENVLIST, "A&dd", IDC_ENVADD, "&Remove", IDC_ENVREMOVE); radioline(&cp, "Handling of OLD_ENVIRON ambiguity:", IDC_EMSTATIC, 2, "&BSD (commonplace)", IDC_EMBSD, "R&FC 1408 (unusual)", IDC_EMRFC, NULL); SetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype); SetDlgItemText (hwnd, IDC_TSEDIT, cfg.termspeed); SetDlgItemText (hwnd, IDC_EMBSD, IDC_EMRFC, cfg.rfc_environ ? IDC_EMRFC : IDC_EMBSD_TTEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype, sizeof(cfg.termtype)-1); break; case IDC_TSEDIT, cfg.termspeed, sizeof(cfg.termspeed)-1); break; case IDC_LOG_LOGEDIT, cfg.username, sizeof(cfg.username)-1); break; case IDC_EMBSD: case IDC_EMRFC: cfg.rfc_environ = IsDlgButtonChecked (hwnd, IDC_EMRFC); break; case IDC_ENVADD_ENVLIST, LB_ADDSTRING, 0, (LPARAM)str); SetDlgItemText (hwnd, IDC_VAREDIT, ""); SetDlgItemText (hwnd, IDC_ENVREMOVE: if ( = SendDlgItemMessage (hwnd, IDC enum { controlstartvalue = 1000, IDC_TTSTATIC, IDC_TTEDIT, IDC_LOGSTATIC, IDC_LOGEDIT, IDC_NOPTY, IDC_CIPHERSTATIC, IDC_CIPHER3DES, IDC_CIPHERBLOWF, IDC_CIPHERDES, IDC_AUTHTIS, IDC_PKSTATIC, IDC_PKEDIT, IDC_PKBUTTON, IDC_SSHPROTSTATIC, IDC_SSHPROT1, IDC_SSHPROT2, IDC_AGENTFWD, IDC_CMDSTATIC, IDC_CMDEDIT }_TTSTATIC, IDC_TTEDIT); staticedit(&cp, "Auto-login &username", IDC_LOGSTATIC, IDC_LOGEDIT); multiedit(&cp, "&Remote command:", IDC_CMDSTATIC, IDC_AUTHTIS); checkbox(&cp, "Allow &agent forwarding", IDC_AGENTFWD); editbutton(&cp, "Private &key file for authentication:", IDC_PKSTATIC, IDC_PKEDIT, "Bro&wse...", IDC_PKBUTTON); radioline(&cp, "Preferred SSH protocol version:", IDC_SSHPROTSTATIC, 2, "&1", IDC_SSHPROT1, "&2", IDC_CIPHERSTATIC, 3, "&3DES", IDC_CIPHER3DES, "&Blowfish", IDC_CIPHERBLOWF, "&DES", IDC_CIPHERDES, NULL); SetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype); SetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username); CheckDlgButton (hwnd, IDC_NOPTY, cfg.nopty); CheckDlgButton (hwnd, IDC_AGENTFWD, cfg.agentfwd); CheckRadioButton (hwnd, IDC_CIPHER3DES, IDC_CIPHERDES, cfg.cipher == CIPHER_BLOWFISH ? IDC_CIPHERBLOWF : cfg.cipher == CIPHER_DES ? IDC_CIPHERDES : IDC_CIPHER3DES); CheckRadioButton (hwnd, IDC_SSHPROT1, IDC_SSHPROT2, cfg.sshprot == 1 ? IDC_SSHPROT1 : IDC_SSHPROT2); CheckDlgButton (hwnd, IDC_AUTHTIS, cfg.try_tis_auth); SetDlgItemText (hwnd, IDC_PKEDIT, cfg.keyfile); SetDlgItemText (hwnd, IDC_TTEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype, sizeof(cfg.termtype)-1); break; case IDC_LOG_LOGEDIT, cfg.username, sizeof(cfg.username)-1); break; case IDC_NOPTY); break; case IDC_AGENTFWDagentfwd = IsDlgButtonChecked (hwnd, IDC_AGENTFWD); break; case IDC_CIPHER3DES: case IDC_CIPHERBLOWF: case IDC_CIPHERBLOWF)) cfg.cipher = CIPHER_BLOWFISH; else if (IsDlgButtonChecked (hwnd, IDC_CIPHERDES)) cfg.cipher = CIPHER_DES; } break; case IDC_SSHPROT1: case IDC_SSHPROT2 { if (IsDlgButtonChecked (hwnd, IDC_SSHPROT1)) cfg.sshprot = 1; else if (IsDlgButtonChecked (hwnd, IDC_SSHPROT2)) cfg.sshprot = 2; } break; case IDC_AUTHTIStry_tis_auth = IsDlgButtonChecked (hwnd, IDC_AUTHTIS); break; case IDC_PK_PKEDIT, cfg.keyfile, sizeof(cfg.keyfile)-1); break; case IDC_CMD_PKEDIT, cfg.keyfile); } Selstruct ctlpos cp; int i; enum { controlstartvalue = 1000, IDC_MBSTATIC, IDC_MBWINDOWS, IDC_MBXTERM, IDC_CCSTATIC, IDC_CCLIST, IDC_CCSET, IDC_CCSTATIC2, IDC_CCEDIT }stwx */ ctlposinit(&cp, hwnd); radiobig(&cp, "Action of mouse buttons:", IDC_MBWINDOWS, "&xterm (Right extends, Middle pastes)", IDC_MBXTERM, NULL); charclass(&cp, "Character classes:", IDC_CCSTATIC, IDC_CCLIST, "&Set", IDC_CCSET, IDC_CCEDIT, "&to class", IDC_CCSTATIC2); CheckRadioButton (hwnd, IDC_MBWINDOWS, IDC_MBXTERM, cfg.mouse_is_xterm ? IDC_MBXTERM : IDC_MBWINDOWS); { static int tabs[4] = {25, 61, 96, 128}; SendDlgItemMessage (hwnd, IDC_MBWINDOWS: case IDC_MBXTERM: cfg.mouse_is_xterm = IsDlgButtonChecked (hwnd, IDC_MBXTERM); break; case IDC_CCSET: { BOOL ok; int i; int n = GetDlgItemInt (hwnd, IDC enum { controlstartvalue = 1000, IDC_BOLDCOLOUR, IDC_PALETTE, IDC_STATIC, IDC_LIST, IDC_RSTATIC, IDC_GSTATIC, IDC_BSTATIC, IDC_RVALUE, IDC_GVALUE, IDC_BVALUE, IDC_CHANGE }_BOLDCOLOUR); checkbox(&cp, "Attempt to use &logical palettes", IDC_STATIC, IDC_LIST, "&Modify...", IDC_CHANGE, "Red:", IDC_RSTATIC, IDC_RVALUE, "Green:", IDC_GSTATIC, IDC_GVALUE, "Blue:", IDC_BSTATIC, IDC_BVALUE, NULL); CheckDlgButton (hwnd, IDC_BOLDCOLOUR, cfg.bold_colour); CheckDlgButton (hwnd, IDC_LIST, LB_ADDSTRING, 0, (LPARAM) colours[i]); } SendDlgItemMessage (hwnd, IDC_LIST, LB_SETCURSEL, 0, 0); SetDlgItemInt (hwnd, IDC_RVALUE, cfg.colours[0][0], FALSE); SetDlgItemInt (hwnd, IDC_GVALUE, cfg.colours[0][1], FALSE); SetDlgItemInt (hwnd, IDC_BOLDCOLOU { int n, i; cfg.bold_colour = IsDlgButtonChecked (hwnd, IDC_BOLDCOLOUR); n = SendDlgItemMessage (hwnd, IDC_LIST, LB_DELETESTRING, i, 0); } } break; case IDC_PALETTEtry_palette = IsDlgButtonChecked (hwnd, IDC_PALETTE); break; case IDCSetDlgItemInt (hwnd, IDC_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt (hwnd, IDC_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt (hwnd, IDC_BVALUE, cfg.colours[i][2], FALSE); } break; case IDC_CHANGE_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt (hwnd, IDC_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt (hwnd, IDC enum { controlstartvalue = 1000, IDC_XLATSTATIC, IDC_NOXLAT, IDC_KOI8WIN1251, IDC_88592WIN1250, IDC_CAPSLOCKCYR, IDC_VTSTATIC, IDC_VTXWINDOWS, IDC_VTOEMANSI, IDC_VTOEMONLY, IDC_VTPOORMAN }_VTSTATIC, "Font has &XWindows encoding", IDC_VTXWINDOWS, "Use font in &both ANSI and OEM modes", IDC_VTOEMANSI, "Use font in O&EM mode only", IDC_VTPOORMAN, NULL); radiobig(&cp, "Character set translation:", IDC_XLATSTATIC, "&None", IDC_NOXLAT, "&KOI8 / Win-1251", IDC_KOI8WIN1251, "&ISO-8859-2 / Win-1250", IDC_CAPSLOCKCYR); CheckRadioButton (hwnd, IDC_NOXLAT, IDC_88592WIN1250, cfg.xlat_88592w1250 ? IDC_88592WIN1250 : cfg.xlat_enablekoiwin ? IDC_KOI8WIN1251 : IDC_NOXLAT); CheckDlgButton (hwnd, IDC_CAPSLOCKCYR, cfg.xlat_capslockcyr); CheckRadioButton (hwnd, IDC_VTXWINDOWS, IDC_VTPOORMAN, cfg.vtmode == VT_XWINDOWS ? IDC_VTXWINDOWS : cfg.vtmode == VT_OEMANSI ? IDC_VTOEMANSI : cfg.vtmode == VT_OEMONLY ? IDC_VTOEMONLY : IDC_VTPOORMAN); case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_NOXLAT: case IDC_KOI8WIN1251: case IDC_88592WIN1250: cfg.xlat_enablekoiwin = IsDlgButtonChecked (hwnd, IDC_KOI8WIN1251); cfg.xlat_88592w1250 = IsDlgButtonChecked (hwnd, IDC_88592WIN1250); break; case IDC_CAPSLOCKCY { cfg.xlat_capslockcyr = IsDlgButtonChecked (hwnd, IDC_CAPSLOCKCYR); } break; case IDC_VTXWINDOWS: case IDC_VTOEMANSI: case IDC_VTOEMONLY: case IDC_VTPOORMAN: cfg.vtmode = (IsDlgButtonChecked (hwnd, IDC_VTXWINDOWS) ? VT_XWINDOWS : IsDlgButtonChecked (hwnd, IDC_VTOEMANSI) ? VT_OEMANSI : IsDlgButtonChecked (hwnd, IDCIDC_SUBDLG static HWND page = NULL; if (msg == WM_COMMAND && LOWORD(wParam) == IDOK) { Revision-number: 677 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2000-10-06T11:42:30.000000Z K 7 svn:log V 132 Tighten up use of "static" throughout. Module-internal things should NOT be exported willy-nilly. It encourages people to use them. K 10 svn:author V 5 simon PROPS-END Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f372058eaa238ab93d28d1cdfb2ed4e0 Text-delta-base-sha1: 6e7a68e1719492b064f16efa43a68308c3192964 Text-content-length: 28 Text-content-md5: 60103424cb3387a33ab91b692f89f8d8 Text-content-sha1: ad6f640c289f74ffc8dbd9331482c822a8700619 Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN8? $static Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e39f2af7741db0cfffd1d52b2f49d69f Text-delta-base-sha1: 99acc6e78d510b1acc9ad115dd32d86c8731a9a0 Text-content-length: 240 Text-content-md5: d197abe2b58251beb7aef66fb55fac5c Text-content-sha1: a6b426db1876e033946458f9f5972a9199cc8d90 Content-length: 280 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN4*8Ka/"N2 = W]static HINSTANCE instance; static HWND hwnd; static HWND keylist; static HWND aboutbox; static HMENU systray_menu; static tree234 *rsakeys; static static static static static static Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 84698901d70a075e81ee3e3aed1498fd Text-delta-base-sha1: e867c6b46eb2dd710040f473ccc80818d067fba1 Text-content-length: 206 Text-content-md5: 27239fb6eebd61f611b516a30226ef87 Text-content-sha1: e1d3bbd506123dce779a9fdab19b762debc52d35 Content-length: 246 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN:#LLtQEqrdc4static static static static void tell_user(FILE *stream, vsprintf(str, fmt, ap); va_end(ap); strcat(str, "\n"); tell_str(stream, str); } static Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b9524bef8c0ba24375f68508c71a23ff Text-delta-base-sha1: 497c239cdfd3d3bad17f36072a8589bbf9f6c52b Text-content-length: 265 Text-content-md5: 4f135bf8a4527a0b46e3ab638ea61d9e Text-content-sha1: 25c401ef84f3c5aac9cd53480491e0a789c9c2f7 Content-length: 304 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNnFlxIZwfstatic ATOM tip_class = 0; static HFONT tip_font; static COLORREF tip_bg; static COLORREF tip_text; static LRESULT CALLBACK SizeTipWndProc(HWND hWnd, UINT nMsg, static HWND tip_wnd = NULL; static Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8c9a3bf633ab7ebe129db0b2c6683e53 Text-delta-base-sha1: b6e2887fb79135fd3915e0da23a8272d2c669653 Text-content-length: 429 Text-content-md5: 4beb6680fdee1642dc23aa2d9fa5cfba Text-content-sha1: 3eecbbd9d0684c208c20350d70c723b6ef2ff748 Content-length: 469 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN@E|#]W])4\k+^~fhd7L8j;,%8Q_ @h(NCxa Vjstatic static static void ssh2_pkt_addbyte(unsigned char byte) { ssh2_pkt_adddata(&byte, 1); } static static void ssh2_pkt_addbool(unsigned char value) { ssh2_pkt_adddata(&value, 1); } static static static static static static static static static static static static static static Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3574575cdfea2a255818f16118800b06 Text-delta-base-sha1: 64296ee1f07d06541a92dc49c0958b958300fb22 Text-content-length: 911 Text-content-md5: 91eee32c85a502e7d2f4f4bf99d35ca9 Text-content-sha1: 63dee649e8d40c1cd9e51b5424ff136f94390ec6 Content-length: 951 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVN;F{P dmr;i-78TTImZT6~GkmUjNF|?.Um;static static static void doctl(struct ctlpos *cp, RECT r, char *wclass, int wstyle, int exstyle, static static void radioline(struct ctlpos *cp, static static static void staticbtn(struct ctlpos *cp, char *stext, int sid, static static void ersatztab(struct ctlpos *cp, char *stext, int sid, static void editbutton(struct ctlpos *cp, char *stext, int sid, static void sesssaver(struct ctlpos *cp, char *text, static void envsetter(struct ctlpos *cp, char *stext, int sid, char *e1stext, int e1sid, int e1id, char *e2stext, int e2sid, int e2id, int listid, static void charclassstatic Revision-number: 678 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2000-10-06T11:49:40.000000Z K 7 svn:log V 69 Mistaken identity in sesssaver() was breaking saved-session edit box K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 91eee32c85a502e7d2f4f4bf99d35ca9 Text-delta-base-sha1: 63dee649e8d40c1cd9e51b5424ff136f94390ec6 Text-content-length: 30 Text-content-md5: f9a0924e0d5de6900ebb497dce39168d Text-content-sha1: 9a8ce9aa697a85ee8d40dd53702ea13558665b84 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNFD e[kedit Revision-number: 679 Prop-content-length: 162 Content-length: 162 K 7 svn:log V 62 Cross-reference cleanup: winstore.c should not use fatalbox() K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-06T12:10:26.000000Z PROPS-END Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b2f128c1330ded32f788ef8e10172b83 Text-delta-base-sha1: 945e50d1348ee1dd120a2d70ff1821b8f7063df6 Text-content-length: 30 Text-content-md5: 3bd8efdf09fe94cd40ac7b6bfd53f361 Text-content-sha1: a8be8f0b47d54a3524b2a22c099dbc9ca15e916e Content-length: 69 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN*Af.psO:p Revision-number: 680 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2000-10-06T12:31:54.000000Z K 7 svn:log V 76 Re-enable copying the Event Log. (rev 1.39 [r661] accidentally disabled it) K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 83e89d81899c04853889754b4b0a05fe Text-delta-base-sha1: 9c39c06ce3c5a2dcdb8235d6e6a5d1543c7b626d Text-content-length: 322 Text-content-md5: 0e8ad38f272ef4e742d98b6d1a7d1acd Text-content-sha1: 4032ad5432e4391ee15a28a142583c50b79e4f79 Content-length: 362 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVN`&%wI|qAo */ IDD_LOGBOX DIALOG DISCARDABLE 100, 20, 260, 119Event Log" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Close", IDOK, 135, 102, 44, 14 PUSHBUTTON "C&opy", IDN_COPY, 81, 102, 44, 14 LISTBOX IDN_LIST, 3, 3, 254, 95, LBS_HASSTRINGS | LBS_USETABSTOPS | WS_VSCROLL | LBS_EXTENDEDSE Revision-number: 681 Prop-content-length: 177 Content-length: 177 K 7 svn:log V 77 Add a parameter to write_clip() so that windlg.c need not call term_deselect K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-06T12:32:25.000000Z PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cb4d63e1e6b51a76a3dc3d49fc8a83c7 Text-delta-base-sha1: 4bfa7513f8601d50fd0720f867767e6591fb05e4 Text-content-length: 53 Text-content-md5: 8270e13899a96ea4c3b1371da1984990 Text-content-sha1: 0e07671194fcab3b350ea4c62651c14a536709a9 Content-length: 93 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNt+@+ k, int must_deselectstatic Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e5458a6f7e0aa1080eaf2039d3c6c498 Text-delta-base-sha1: cbaae74f4970e0314e05eda7bcfcd64d921b2425 Text-content-length: 20 Text-content-md5: 2adb0f1188f0927bd992cb39d1d2be28 Text-content-sha1: ffca615a7ea4e516df34a3dd395974a217c3845d Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNgl 48/ Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 27239fb6eebd61f611b516a30226ef87 Text-delta-base-sha1: e1d3bbd506123dce779a9fdab19b762debc52d35 Text-content-length: 43 Text-content-md5: f26d6b72792338fa513ead27ea346645 Text-content-sha1: 7b48c33be8eda6f4a0223699ed0dde5c12e8e297 Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN:M 3, int must_deselect Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a5024346ee3f59a84868adc0ee410124 Text-delta-base-sha1: 42969c67e6a55d8e92d4a5b477ab1cf16d57b1a7 Text-content-length: 32 Text-content-md5: 98f9f6917b644d2dacbb4be5db816744 Text-content-sha1: c5e479be7b34731dccb99f7562e28690534846e4 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN") z(z, FALSE Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f9a0924e0d5de6900ebb497dce39168d Text-delta-base-sha1: 9a8ce9aa697a85ee8d40dd53702ea13558665b84 Text-content-length: 357 Text-content-md5: fd6026ef0a64b77759f230504c1af000 Text-content-sha1: 7f4d4e843f7a8288a6f20842c359acc49c3f5ea9 Content-length: 397 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNDq={ Qee_,Aif (count == 0) { /* can't copy zero stuff */ MessageBeep(0); break; }, TRUE for (i = 0; i < nevents; i++) SendDlgItemMessage(hwnd, IDN_LIST, LB_SETSEL, FALSE, i Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d853a73d80ce7b274e8a2bdfefcc8f85 Text-delta-base-sha1: 8e06ef21343829059f3469a62fcb2565806c2b51 Text-content-length: 161 Text-content-md5: bd7e2164945af6211c73ae566085e59f Text-content-sha1: 7e391e9f51fb9aa573114e3b3d1f35bbcfe1507b Content-length: 201 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNX%yJ.JI$#5, int must_deselectif (!must_deselect) SendMessage (hwnd, WM_IGNORE_CLIP, TRUE, 0); if (!must_deselect) Revision-number: 682 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2000-10-06T12:43:19.000000Z K 7 svn:log V 99 Move omission of SSH protocol setting in PuTTYtel into windlg.c and remove nosshres.rc accordingly K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4bb2f532848a0879947bd36d316ab2ea Text-delta-base-sha1: 2a880a3a13ca49a55f5f77689c9f1b796d9035fa Text-content-length: 63 Text-content-md5: 30a6ce84cfbd086786ce73bccb398596 Text-content-sha1: a3c426f2e475d1ad686a2710c0f34d9f0de78923 Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNO|g~&*%/P%* puttytel PRESRC = win_PP Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fd6026ef0a64b77759f230504c1af000 Text-delta-base-sha1: 7f4d4e843f7a8288a6f20842c359acc49c3f5ea9 Text-content-length: 469 Text-content-md5: 7f16c2ba4d7189a0b06320a4d5950c12 Text-content-sha1: 738e4b3039c38307eaed02ac6c4b1b2b436d41c0 Content-length: 509 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNq1*kIfIYmif (backends[2].backend == NULL) { /* this is PuTTYtel, so only two protocols available */ "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTTELNET, NULL); } else { "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTTELNET, #ifdef FWHACK "SS&H/hack", #else "SS&H", #endif IDC_PROTSSH, NULL); } Node-path: putty/nosshres.rc Node-action: delete Revision-number: 683 Prop-content-length: 356 Content-length: 356 K 7 svn:log V 255 Create settings.c and move the load/save session code out of windlg.c into it. Allows plink and pscp to no longer link with windlg.c, meaning they lose some of the sillier stub functions and also can provide a console-based form of verify_ssh_host_key(). K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-06T13:21:36.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 30a6ce84cfbd086786ce73bccb398596 Text-delta-base-sha1: a3c426f2e475d1ad686a2710c0f34d9f0de78923 Text-content-length: 215 Text-content-md5: 5c21bb1622254af88364ae429dfa1027 Text-content-sha1: cd0064af1cde33294a56b9c3f7ed81bbf05f3e9d Content-length: 255 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN|9'*-O ##-- objects pscp SOBJS = scp.$(OBJ) be_none.$(OBJ) ##-- objects putty puttytel pscp plink MOBJS = misc.$(OBJ) version.$(OBJ) winstore.$(OBJ) settings settings.$(OBJ): settings.c putty Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8270e13899a96ea4c3b1371da1984990 Text-delta-base-sha1: 0e07671194fcab3b350ea4c62651c14a536709a9 Text-content-length: 2729 Text-content-md5: 240686bb58b10d7bac4ebf9119501989 Text-content-sha1: 24e6ce0dac01382e78c845c3856306e471618fd5 Content-length: 2769 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNr#zGp|[K_b#include "storage.h" void fatalboxvoid logevent(char *string) { } void verify_ssh_host_key(char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; static const char absentmsg[] = "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, enter \"y\" to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you do not trust this host, enter \"n\" to abandon the\n" "connection.\n" "Continue connecting? (y/n) "; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "enter \"y\" to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, enter \"n\".\n" "If you want to abandon the connection completely, press\n" "Return to cancel. Pressing Return is the ONLY guaranteed\n" "safe choice.\n" "Update cached key? (y/n, Return cancels connection) "; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; /* * Verify the key against the registry. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; if (ret == 2) { /* key was different */ fprintf(stderr, wrongmsg, fingerprint); if (fgets(line, sizeof(line), stdin) && line[0] != '\0' && line[0] != '\n') { if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); } else { fprintf(stderr, abandoned); exit(0); } } if (ret == 1) { /* key was absent */ fprintf(stderr, absentmsg, fingerprint); if (fgets(line, sizeof(line), stdin) && (line[0] == 'y' || line[0] == 'Y')) store_host_key(host, port, keytype, keystr); else { fprintf(stderr, abandoned); exit(0); } } , &cfg, &cfg Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2adb0f1188f0927bd992cb39d1d2be28 Text-delta-base-sha1: ffca615a7ea4e516df34a3dd395974a217c3845d Text-content-length: 300 Text-content-md5: e35ef3084b8f985d345c1e5f0b0eb617 Text-content-sha1: 11d779dd6935f9ee0ca7002907aeac1c455074f2 Content-length: 340 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNlvLtF&, Configregistry_cleanup(void); GLOBAL int nsessions; GLOBAL char **sessions; /* * Exports from settings.c. */ void save_settings (char *section, int do_host, Config *cfg); void load_settings (char *section, int do_host, Config *cfg); void get_sesslist(int allocate) Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f26d6b72792338fa513ead27ea346645 Text-delta-base-sha1: 7b48c33be8eda6f4a0223699ed0dde5c12e8e297 Text-content-length: 2721 Text-content-md5: a75661e876c8bb37c41083b6d5cfc436 Text-content-sha1: 24ae8d9ac2b8c59e2481a59ebbdb17bb3ad44a1d Content-length: 2761 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNMszd`c;uX#include "storagevoid begin_session(void) { } void logevent(char *string) { } void verify_ssh_host_key(char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; static const char absentmsg[] = "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, enter \"y\" to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you do not trust this host, enter \"n\" to abandon the\n" "connection.\n" "Continue connecting? (y/n) "; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "enter Yes to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, enter No.\n" "If you want to abandon the connection completely, press\n" "Return to cancel. Pressing Return is the ONLY guaranteed\n" "safe choice.\n" "Update cached key? (y/n, Return cancels connection) "; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; /* * Verify the key against the registry. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; if (ret == 2) { /* key was different */ fprintf(stderr, wrongmsg, fingerprint); if (fgets(line, sizeof(line), stdin) && line[0] != '\0' && line[0] != '\n') { if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); } else { fprintf(stderr, abandoned); exit(0); } } if (ret == 1) { /* key was absent */ fprintf(stderr, absentmsg, fingerprint); if (fgets(line, sizeof(line), stdin) && (line[0] == 'y' || line[0] == 'Y')) store_host_key(host, port, keytype, keystr); else { fprintf(stderr, abandoned); exit(0); } } , &cfg Node-path: putty/settings.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 12103 Text-content-md5: ff7f59aa1369d13b228870e12f1e0cbe Text-content-sha1: 31834ed8b80109ed66490baf44b38da5687a0027 Content-length: 12219 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN999/* * settings.c: read and write saved sessions. */ #include #include #include "putty.h" #include "storage.h" static void gpps(void *handle, char *name, char *def, char *val, int len) { if (!read_setting_s(handle, name, val, len)) { strncpy(val, def, len); val[len-1] = '\0'; } } static void gppi(void *handle, char *name, int def, int *i) { *i = read_setting_i(handle, name, def); } void save_settings (char *section, int do_host, Config *cfg) { int i; char *p; void *sesskey; sesskey = open_settings_w(section); if (!sesskey) return; write_setting_i (sesskey, "Present", 1); if (do_host) { write_setting_s (sesskey, "HostName", cfg->host); write_setting_i (sesskey, "PortNumber", cfg->port); p = "raw"; for (i = 0; backends[i].name != NULL; i++) if (backends[i].protocol == cfg->protocol) { p = backends[i].name; break; } write_setting_s (sesskey, "Protocol", p); } write_setting_i (sesskey, "CloseOnExit", !!cfg->close_on_exit); write_setting_i (sesskey, "WarnOnClose", !!cfg->warn_on_close); write_setting_s (sesskey, "TerminalType", cfg->termtype); write_setting_s (sesskey, "TerminalSpeed", cfg->termspeed); { char buf[2*sizeof(cfg->environmt)], *p, *q; p = buf; q = cfg->environmt; while (*q) { while (*q) { int c = *q++; if (c == '=' || c == ',' || c == '\\') *p++ = '\\'; if (c == '\t') c = '='; *p++ = c; } *p++ = ','; q++; } *p = '\0'; write_setting_s (sesskey, "Environment", buf); } write_setting_s (sesskey, "UserName", cfg->username); write_setting_i (sesskey, "NoPTY", cfg->nopty); write_setting_i (sesskey, "AgentFwd", cfg->agentfwd); write_setting_s (sesskey, "RemoteCmd", cfg->remote_cmd); write_setting_s (sesskey, "Cipher", cfg->cipher == CIPHER_BLOWFISH ? "blowfish" : cfg->cipher == CIPHER_DES ? "des" : "3des"); write_setting_i (sesskey, "AuthTIS", cfg->try_tis_auth); write_setting_i (sesskey, "SshProt", cfg->sshprot); write_setting_s (sesskey, "PublicKeyFile", cfg->keyfile); write_setting_s (sesskey, "RemoteCommand", cfg->remote_cmd); write_setting_i (sesskey, "RFCEnviron", cfg->rfc_environ); write_setting_i (sesskey, "BackspaceIsDelete", cfg->bksp_is_delete); write_setting_i (sesskey, "RXVTHomeEnd", cfg->rxvt_homeend); write_setting_i (sesskey, "LinuxFunctionKeys", cfg->funky_type); write_setting_i (sesskey, "ApplicationCursorKeys", cfg->app_cursor); write_setting_i (sesskey, "ApplicationKeypad", cfg->app_keypad); write_setting_i (sesskey, "NetHackKeypad", cfg->nethack_keypad); write_setting_i (sesskey, "AltF4", cfg->alt_f4); write_setting_i (sesskey, "AltSpace", cfg->alt_space); write_setting_i (sesskey, "LdiscTerm", cfg->ldisc_term); write_setting_i (sesskey, "BlinkCur", cfg->blink_cur); write_setting_i (sesskey, "Beep", cfg->beep); write_setting_i (sesskey, "ScrollbackLines", cfg->savelines); write_setting_i (sesskey, "DECOriginMode", cfg->dec_om); write_setting_i (sesskey, "AutoWrapMode", cfg->wrap_mode); write_setting_i (sesskey, "LFImpliesCR", cfg->lfhascr); write_setting_i (sesskey, "WinNameAlways", cfg->win_name_always); write_setting_s (sesskey, "WinTitle", cfg->wintitle); write_setting_i (sesskey, "TermWidth", cfg->width); write_setting_i (sesskey, "TermHeight", cfg->height); write_setting_s (sesskey, "Font", cfg->font); write_setting_i (sesskey, "FontIsBold", cfg->fontisbold); write_setting_i (sesskey, "FontCharSet", cfg->fontcharset); write_setting_i (sesskey, "FontHeight", cfg->fontheight); write_setting_i (sesskey, "FontVTMode", cfg->vtmode); write_setting_i (sesskey, "TryPalette", cfg->try_palette); write_setting_i (sesskey, "BoldAsColour", cfg->bold_colour); for (i=0; i<22; i++) { char buf[20], buf2[30]; sprintf(buf, "Colour%d", i); sprintf(buf2, "%d,%d,%d", cfg->colours[i][0], cfg->colours[i][1], cfg->colours[i][2]); write_setting_s (sesskey, buf, buf2); } write_setting_i (sesskey, "MouseIsXterm", cfg->mouse_is_xterm); for (i=0; i<256; i+=32) { char buf[20], buf2[256]; int j; sprintf(buf, "Wordness%d", i); *buf2 = '\0'; for (j=i; jwordness[j]); } write_setting_s (sesskey, buf, buf2); } write_setting_i (sesskey, "KoiWinXlat", cfg->xlat_enablekoiwin); write_setting_i (sesskey, "88592Xlat", cfg->xlat_88592w1250); write_setting_i (sesskey, "CapsLockCyr", cfg->xlat_capslockcyr); write_setting_i (sesskey, "ScrollBar", cfg->scrollbar); write_setting_i (sesskey, "ScrollOnKey", cfg->scroll_on_key); write_setting_i (sesskey, "LockSize", cfg->locksize); write_setting_i (sesskey, "BCE", cfg->bce); write_setting_i (sesskey, "BlinkText", cfg->blinktext); close_settings_w(sesskey); } void load_settings (char *section, int do_host, Config *cfg) { int i; char prot[10]; void *sesskey; sesskey = open_settings_r(section); gpps (sesskey, "HostName", "", cfg->host, sizeof(cfg->host)); gppi (sesskey, "PortNumber", default_port, &cfg->port); gpps (sesskey, "Protocol", "default", prot, 10); cfg->protocol = default_protocol; for (i = 0; backends[i].name != NULL; i++) if (!strcmp(prot, backends[i].name)) { cfg->protocol = backends[i].protocol; break; } gppi (sesskey, "CloseOnExit", 1, &cfg->close_on_exit); gppi (sesskey, "WarnOnClose", 1, &cfg->warn_on_close); gpps (sesskey, "TerminalType", "xterm", cfg->termtype, sizeof(cfg->termtype)); gpps (sesskey, "TerminalSpeed", "38400,38400", cfg->termspeed, sizeof(cfg->termspeed)); { char buf[2*sizeof(cfg->environmt)], *p, *q; gpps (sesskey, "Environment", "", buf, sizeof(buf)); p = buf; q = cfg->environmt; while (*p) { while (*p && *p != ',') { int c = *p++; if (c == '=') c = '\t'; if (c == '\\') c = *p++; *q++ = c; } if (*p == ',') p++; *q++ = '\0'; } *q = '\0'; } gpps (sesskey, "UserName", "", cfg->username, sizeof(cfg->username)); gppi (sesskey, "NoPTY", 0, &cfg->nopty); gppi (sesskey, "AgentFwd", 0, &cfg->agentfwd); gpps (sesskey, "RemoteCmd", "", cfg->remote_cmd, sizeof(cfg->remote_cmd)); { char cipher[10]; gpps (sesskey, "Cipher", "3des", cipher, 10); if (!strcmp(cipher, "blowfish")) cfg->cipher = CIPHER_BLOWFISH; else if (!strcmp(cipher, "des")) cfg->cipher = CIPHER_DES; else cfg->cipher = CIPHER_3DES; } gppi (sesskey, "SshProt", 1, &cfg->sshprot); gppi (sesskey, "AuthTIS", 0, &cfg->try_tis_auth); gpps (sesskey, "PublicKeyFile", "", cfg->keyfile, sizeof(cfg->keyfile)); gpps (sesskey, "RemoteCommand", "", cfg->remote_cmd, sizeof(cfg->remote_cmd)); gppi (sesskey, "RFCEnviron", 0, &cfg->rfc_environ); gppi (sesskey, "BackspaceIsDelete", 1, &cfg->bksp_is_delete); gppi (sesskey, "RXVTHomeEnd", 0, &cfg->rxvt_homeend); gppi (sesskey, "LinuxFunctionKeys", 0, &cfg->funky_type); gppi (sesskey, "ApplicationCursorKeys", 0, &cfg->app_cursor); gppi (sesskey, "ApplicationKeypad", 0, &cfg->app_keypad); gppi (sesskey, "NetHackKeypad", 0, &cfg->nethack_keypad); gppi (sesskey, "AltF4", 1, &cfg->alt_f4); gppi (sesskey, "AltSpace", 0, &cfg->alt_space); gppi (sesskey, "LdiscTerm", 0, &cfg->ldisc_term); gppi (sesskey, "BlinkCur", 0, &cfg->blink_cur); gppi (sesskey, "Beep", 1, &cfg->beep); gppi (sesskey, "ScrollbackLines", 200, &cfg->savelines); gppi (sesskey, "DECOriginMode", 0, &cfg->dec_om); gppi (sesskey, "AutoWrapMode", 1, &cfg->wrap_mode); gppi (sesskey, "LFImpliesCR", 0, &cfg->lfhascr); gppi (sesskey, "WinNameAlways", 0, &cfg->win_name_always); gpps (sesskey, "WinTitle", "", cfg->wintitle, sizeof(cfg->wintitle)); gppi (sesskey, "TermWidth", 80, &cfg->width); gppi (sesskey, "TermHeight", 24, &cfg->height); gpps (sesskey, "Font", "Courier", cfg->font, sizeof(cfg->font)); gppi (sesskey, "FontIsBold", 0, &cfg->fontisbold); gppi (sesskey, "FontCharSet", ANSI_CHARSET, &cfg->fontcharset); gppi (sesskey, "FontHeight", 10, &cfg->fontheight); gppi (sesskey, "FontVTMode", VT_OEMANSI, (int *)&cfg->vtmode); gppi (sesskey, "TryPalette", 0, &cfg->try_palette); gppi (sesskey, "BoldAsColour", 1, &cfg->bold_colour); for (i=0; i<22; i++) { static char *defaults[] = { "187,187,187", "255,255,255", "0,0,0", "85,85,85", "0,0,0", "0,255,0", "0,0,0", "85,85,85", "187,0,0", "255,85,85", "0,187,0", "85,255,85", "187,187,0", "255,255,85", "0,0,187", "85,85,255", "187,0,187", "255,85,255", "0,187,187", "85,255,255", "187,187,187", "255,255,255" }; char buf[20], buf2[30]; int c0, c1, c2; sprintf(buf, "Colour%d", i); gpps (sesskey, buf, defaults[i], buf2, sizeof(buf2)); if(sscanf(buf2, "%d,%d,%d", &c0, &c1, &c2) == 3) { cfg->colours[i][0] = c0; cfg->colours[i][1] = c1; cfg->colours[i][2] = c2; } } gppi (sesskey, "MouseIsXterm", 0, &cfg->mouse_is_xterm); for (i=0; i<256; i+=32) { static char *defaults[] = { "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", "0,1,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1", "1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2", "1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1", "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1", "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1", "2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2", "2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2" }; char buf[20], buf2[256], *p; int j; sprintf(buf, "Wordness%d", i); gpps (sesskey, buf, defaults[i/32], buf2, sizeof(buf2)); p = buf2; for (j=i; jwordness[j] = atoi(q); } } gppi (sesskey, "KoiWinXlat", 0, &cfg->xlat_enablekoiwin); gppi (sesskey, "88592Xlat", 0, &cfg->xlat_88592w1250); gppi (sesskey, "CapsLockCyr", 0, &cfg->xlat_capslockcyr); gppi (sesskey, "ScrollBar", 1, &cfg->scrollbar); gppi (sesskey, "ScrollOnKey", 0, &cfg->scroll_on_key); gppi (sesskey, "LockSize", 0, &cfg->locksize); gppi (sesskey, "BCE", 0, &cfg->bce); gppi (sesskey, "BlinkText", 0, &cfg->blinktext); close_settings_r(sesskey); } void do_defaults (char *session, Config *cfg) { if (session) load_settings (session, TRUE, cfg); else load_settings ("Default Settings", FALSE, cfg); } void get_sesslist(int allocate) { static char otherbuf[2048]; static char *buffer; int buflen, bufsize, i; char *p, *ret; void *handle; if (allocate) { if ((handle = enum_settings_start()) == NULL) return; buflen = bufsize = 0; buffer = NULL; do { ret = enum_settings_next(handle, otherbuf, sizeof(otherbuf)); if (ret) { int len = strlen(otherbuf)+1; if (bufsize < buflen+len) { bufsize = buflen + len + 2048; buffer = srealloc(buffer, bufsize); } strcpy(buffer+buflen, otherbuf); buflen += strlen(buffer+buflen)+1; } } while (ret); enum_settings_finish(handle); buffer = srealloc(buffer, buflen+1); buffer[buflen] = '\0'; p = buffer; nsessions = 1; /* "Default Settings" counts as one */ while (*p) { if (strcmp(p, "Default Settings")) nsessions++; while (*p) p++; p++; } sessions = smalloc(nsessions * sizeof(char *)); sessions[0] = "Default Settings"; p = buffer; i = 1; while (*p) { if (strcmp(p, "Default Settings")) sessions[i++] = p; while (*p) p++; p++; } } else { sfree (buffer); sfree (sessions); } } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7f16c2ba4d7189a0b06320a4d5950c12 Text-delta-base-sha1: 738e4b3039c38307eaed02ac6c4b1b2b436d41c0 Text-content-length: 184 Text-content-md5: 9d8b4a25689d0dac570580792766edb9 Text-content-sha1: 16f3da72adace671ea06b3927c32c8fa4f99e924 Content-length: 224 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN1Q-~VSKTek yHINSTANCE hinst; static int readytogo; static void force_normal(HWND hwnd) { , &cfg, &cfg Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd7e2164945af6211c73ae566085e59f Text-delta-base-sha1: 7e391e9f51fb9aa573114e3b3d1f35bbcfe1507b Text-content-length: 72 Text-content-md5: b09ec7adb42db43ed095e22e93a735c9 Text-content-sha1: e4ba4318893c1bd5af1a30fbc223c4c25af11348 Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVN%1&.).As2, &cfg, &cfg); if (!*cfg.host && Revision-number: 684 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2000-10-06T15:54:04.000000Z K 7 svn:log V 72 Update Makefile generation and ensure everything works with Borland 5.5 K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5c21bb1622254af88364ae429dfa1027 Text-delta-base-sha1: cd0064af1cde33294a56b9c3f7ed81bbf05f3e9d Text-content-length: 28 Text-content-md5: d3d227021645f12d16b8dbb8223e9fab Text-content-sha1: 1cde5b87e678e30174ec858bb2deb7ba20990384 Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN PDP ws2_32 Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6cf132a87ec05478cc044ad990637400 Text-delta-base-sha1: ce9498432ef5986eda4690f29b42a12ddaa1e7e6 Text-content-length: 494 Text-content-md5: b21111285b3a904de9a3f36c92ae1afb Text-content-sha1: 0958a385e3a66fb8b0a3b2c697e1850fb6a9225a Content-length: 533 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNIV)9n}Jy}-OEMyFRZs~Kspeciallibs = [split ' ', $i]; $i = shift @$speciallibs; # take off project name $gui{$i} = 1; $libs{$i} = $speciallibsspeciallibs = [split ' ', $i]; $i = shift @$speciallibs; # take off project name $gui{$i} = 0; $libs{$i} = $speciallibs$libstr = ""; foreach $lib (@{$libs{$p}}) { $libstr .= " -l$lib"; }$libstr@libs = @{$libs{$p}}; unshift @libs, "cw32", "import32"; $libstr = join ' ', @libs; print "\techo nul,$libstr Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 240686bb58b10d7bac4ebf9119501989 Text-delta-base-sha1: 24e6ce0dac01382e78c845c3856306e471618fd5 Text-content-length: 26 Text-content-md5: 16d5f90e6d193a345cfae5da273b5918 Text-content-sha1: 50b7c3ad5b1e7f5948acd9fae34b3cb46cc02f41 Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNrt ]`DWORD Revision-number: 685 Prop-content-length: 276 Content-length: 276 K 7 svn:log V 175 Stop throwing out the Connection panel during midsession reconfig. Instead, only throw out the useless parts of it. See, the new auto- layout features bear fruit immediately! K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-06T16:01:09.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d8b4a25689d0dac570580792766edb9 Text-delta-base-sha1: 16f3da72adace671ea06b3927c32c8fa4f99e924 Text-content-length: 2989 Text-content-md5: 4210357aaba36bd19f880e3e28744001 Text-content-sha1: edd2cb9adca1338add9ee503b8e26c5f6903c782 Content-length: 3029 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVNQm^r_/Q|nQ|wr%[TxE`qm1,TxT,WI #endif#ifndef NO_SECURITY#endif#ifndef NO_SECURITY#endif#ifndef NO_SECURITY#else MessageBox(NULL, "This program has been compiled for Win9X and will\n" "not run on NT, in case it causes a security breach.", "Pageant Fatal Error", MB_ICONERROR | MB_OK); return 1; #endif Revision-number: 689 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:17.563563Z PROPS-END Revision-number: 690 Prop-content-length: 141 Content-length: 141 K 7 svn:log V 41 Remove the hierarchical dialog structure K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-09T12:16:27.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: be4037f8d9ff3b26515151ea80eb6736 Text-delta-base-sha1: 880a7807fdc9d1a81745aed83f1c05b9388b04bb Text-content-length: 28235 Text-content-md5: f17576624c7772dd6998feeb59cb9779 Text-content-sha1: b6286e949ba1ffae2535b429e4354d12eb6040c1 Content-length: 28275 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVNk]9`a<rQfuJXz@^L?VfbKp'\{.W{? "`7vkGP?dP?ZR|]4)U?J;\_pv[P?QU|~`.^|Y?Z\pv<P?yP?bP?QP?wU?}U?vP?]P?XP?_P?aP?cP?[P?O<#]P?VP?ZP?RP?i{\-wToM{8S?VbXz~M g qe{M{,P?WP?V?V*[c;K:KP?"I=(k|3y5A.To7G P?S=B>Um=|BI>HKzs5fHjG4Y29WPARAM font; int ypos, width; int xoff, yoff; }; static void ctlposinit(struct ctlpos *cp, HWND hwnd, int sideborder, int topborder) { RECT r, r2; cp->hwnd = hwndr2.left = r2.top = 0; r2.right = 4; r2.bottom = 8; MapDialogRect(hwnd, &r2); cp->width = (r.right * 4) / (r2.right) - 2*GAPBETWEEN; cp->xoff = sideborder; cp->width -= 2*sideborder; cp->yoff = topborderr.left += cp->xoff; r.top += cp->yoff; MapDialogRect(cp->hwnd, &r)char savedsession[2048]; enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TAB, controlstartvalue, connectionpanelstart, IDC0_HOSTSTATIC, IDC0_HOST, IDC0_PORTSTATIC, IDC0_PORT, IDC0_PROTSTATIC, IDC0_PROTRAW, IDC0_PROTTELNET, IDC0_PROTSSH, IDC0_SESSSTATIC, IDC0_SESSEDIT, IDC0_SESSLIST, IDC0_SESSLOAD, IDC0_SESSSAVE, IDC0_SESSDEL, IDC0_CLOSEEXIT, IDC0_CLOSEWARN, connectionpanelend, keyboardpanelstart, IDC1_DELSTATIC, IDC1_DEL008, IDC1_DEL127, IDC1_HOMESTATIC, IDC1_HOMETILDE, IDC1_HOMERXVT, IDC1_FUNCSTATIC, IDC1_FUNCTILDE, IDC1_FUNCLINUX, IDC1_FUNCXTERM, IDC1_KPSTATIC, IDC1_KPNORMAL, IDC1_KPAPPLIC, IDC1_KPNH, IDC1_CURSTATIC, IDC1_CURNORMAL, IDC1_CURAPPLIC, IDC1_ALTF4, IDC1_ALTSPACE, IDC1_LDISCTERM, IDC1_SCROLLKEY, keyboardpanelend, terminalpanelstart, IDC2_WRAPMODE, IDC2_DECOM, IDC2_DIMSTATIC, IDC2_ROWSSTATIC, IDC2_ROWSEDIT, IDC2_COLSSTATIC, IDC2_COLSEDIT, IDC2_SAVESTATIC, IDC2_SAVEEDIT, IDC2_FONTSTATIC, IDC2_CHOOSEFONT, IDC2_LFHASCR, IDC2_BEEP, IDC2_BCE, IDC2_BLINKTEXT, terminalpanelend, windowpanelstart, IDC3_WINNAME, IDC3_BLINKCUR, IDC3_SCROLLBAR, IDC3_LOCKSIZE, IDC3_WINTITLE, IDC3_WINEDIT, windowpanelend, telnetpanelstart, IDC4_TTSTATIC, IDC4_TTEDIT, IDC4_TSSTATIC, IDC4_TSEDIT, IDC4_LOGSTATIC, IDC4_LOGEDIT, IDC4_ENVSTATIC, IDC4_VARSTATIC, IDC4_VAREDIT, IDC4_VALSTATIC, IDC4_VALEDIT, IDC4_ENVLIST, IDC4_ENVADD, IDC4_ENVREMOVE, IDC4_EMSTATIC, IDC4_EMBSD, IDC4_EMRFC, telnetpanelend, sshpanelstart, IDC5_TTSTATIC, IDC5_TTEDIT, IDC5_LOGSTATIC, IDC5_LOGEDIT, IDC5_NOPTY, IDC5_CIPHERSTATIC, IDC5_CIPHER3DES, IDC5_CIPHERBLOWF, IDC5_CIPHERDES, IDC5_AUTHTIS, IDC5_PKSTATIC, IDC5_PKEDIT, IDC5_PKBUTTON, IDC5_SSHPROTSTATIC, IDC5_SSHPROT1, IDC5_SSHPROT2, IDC5_AGENTFWD, IDC5_CMDSTATIC, IDC5_CMDEDIT, sshpanelend, selectionpanelstart, IDC6_MBSTATIC, IDC6_MBWINDOWS, IDC6_MBXTERM, IDC6_CCSTATIC, IDC6_CCLIST, IDC6_CCSET, IDC6_CCSTATIC2, IDC6_CCEDIT, selectionpanelend, colourspanelstart, IDC7_BOLDCOLOUR, IDC7_PALETTE, IDC7_STATIC, IDC7_LIST, IDC7_RSTATIC, IDC7_GSTATIC, IDC7_BSTATIC, IDC7_RVALUE, IDC7_GVALUE, IDC7_BVALUE, IDC7_CHANGE, colourspanelend, translationpanelstart, IDC8_XLATSTATIC, IDC8_NOXLAT, IDC8_KOI8WIN1251, IDC8_88592WIN1250, IDC8_CAPSLOCKCYR, IDC8_VTSTATIC, IDC8_VTXWINDOWS, IDC8_VTOEMANSI, IDC8_VTOEMONLY, IDC8_VTPOORMAN, translationpanelend, controlendvalue }; static const char *const colours[] = { "Default Foreground", "Default Bold Foreground", "Default Background", "Default Bold Background", "Cursor Text", "Cursor Colour", "ANSI Black", "ANSI Black Bold", "ANSI Red", "ANSI Red Bold", "ANSI Green", "ANSI Green Bold", "ANSI Yellow", "ANSI Yellow Bold", "ANSI Blue", "ANSI Blue Bold", "ANSI Magenta", "ANSI Magenta Bold", "ANSI Cyan", "ANSI Cyan Bold", "ANSI White", "ANSI White Bold" }; static const int permcolour[] = { TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE };void init_dlg_ctrls(HWND hwnd) { int i; char fontstatic[256]; SetDlgItemText (hwnd, IDC0_HOST, cfg.host); SetDlgItemText (hwnd, IDC0_SESSEDIT, savedsession); SetDlgItemInt (hwnd, IDC0_PORT, cfg.port, FALSE); for (i = 0; i < nsessions; i++) SendDlgItemMessage (hwnd, IDC0_SESSLIST, LB_ADDSTRING, 0, (LPARAM) (sessions[i])); CheckRadioButton (hwnd, IDC0_PROTRAW, IDC0_PROTSSH, cfg.protocol==PROT_SSH ? IDC0_PROTSSH : cfg.protocol==PROT_TELNET ? IDC0_PROTTELNET : IDC0_PROTRAW ); CheckDlgButton (hwnd, IDC0_CLOSEEXIT, cfg.close_on_exit); CheckDlgButton (hwnd, IDC0_CLOSEWARN, cfg.warn_on_close); CheckRadioButton (hwnd, IDC1_DEL008, IDC1_DEL127, cfg.bksp_is_delete ? IDC1_DEL127 : IDC1_DEL008); CheckRadioButton (hwnd, IDC1_HOMETILDE, IDC1_HOMERXVT, cfg.rxvt_homeend ? IDC1_HOMERXVT : IDC1_HOMETILDE); CheckRadioButton (hwnd, IDC1_FUNCTILDE, IDC1_FUNCXTERM, cfg.funky_type ? (cfg.funky_type==2 ? IDC1_FUNCXTERM : IDC1_FUNCLINUX ) : IDC1_FUNCTILDE); CheckRadioButton (hwnd, IDC1_CURNORMAL, IDC1_CURAPPLIC, cfg.app_cursor ? IDC1_CURAPPLIC : IDC1_CURNORMAL); CheckRadioButton (hwnd, IDC1_KPNORMAL, IDC1_KPNH, cfg.nethack_keypad ? IDC1_KPNH : cfg.app_keypad ? IDC1_KPAPPLIC : IDC1_KPNORMAL); CheckDlgButton (hwnd, IDC1_ALTF4, cfg.alt_f4); CheckDlgButton (hwnd, IDC1_ALTSPACE, cfg.alt_space); CheckDlgButton (hwnd, IDC1_LDISCTERM, cfg.ldisc_term); CheckDlgButton (hwnd, IDC1_SCROLLKEY, cfg.scroll_on_key); CheckDlgButton (hwnd, IDC2_WRAPMODE, cfg.wrap_mode); CheckDlgButton (hwnd, IDC2_DECOM, cfg.dec_om); CheckDlgButton (hwnd, IDC2_LFHASCR, cfg.lfhascr); SetDlgItemInt (hwnd, IDC2_ROWSEDIT, cfg.height, FALSE); SetDlgItemInt (hwnd, IDC2_COLSEDIT, cfg.width, FALSE); SetDlgItemInt (hwnd, IDC2_SAVEEDIT, cfg.savelines, FALSE); fmtfont (fontstatic); SetDlgItemText (hwnd, IDC2_FONTSTATIC, fontstatic); CheckDlgButton (hwnd, IDC2_BEEP, cfg.beep); CheckDlgButton (hwnd, IDC2_BCE, cfg.bce); CheckDlgButton (hwnd, IDC2_BLINKTEXT, cfg.blinktext); SetDlgItemText (hwnd, IDC3_WINEDIT, cfg.wintitle); CheckDlgButton (hwnd, IDC3_WINNAME, cfg.win_name_always); CheckDlgButton (hwnd, IDC3_BLINKCUR, cfg.blink_cur); CheckDlgButton (hwnd, IDC3_SCROLLBAR, cfg.scrollbar); CheckDlgButton (hwnd, IDC3_LOCKSIZE, cfg.locksize); SetDlgItemText (hwnd, IDC4_TTEDIT, cfg.termtype); SetDlgItemText (hwnd, IDC4_TSEDIT, cfg.termspeed); SetDlgItemText (hwnd, IDC4_LOGEDIT, cfg.username); { char *p = cfg.environmt; while (*p) { SendDlgItemMessage (hwnd, IDC4_ENVLIST, LB_ADDSTRING, 0, (LPARAM) p); p += strlen(p)+1; } } CheckRadioButton (hwnd, IDC4_EMBSD, IDC4_EMRFC, cfg.rfc_environ ? IDC4_EMRFC : IDC4_EMBSD); SetDlgItemText (hwnd, IDC5_TTEDIT, cfg.termtype); SetDlgItemText (hwnd, IDC5_LOGEDIT, cfg.username); CheckDlgButton (hwnd, IDC5_NOPTY, cfg.nopty); CheckDlgButton (hwnd, IDC5_AGENTFWD, cfg.agentfwd); CheckRadioButton (hwnd, IDC5_CIPHER3DES, IDC5_CIPHERDES, cfg.cipher == CIPHER_BLOWFISH ? IDC5_CIPHERBLOWF : cfg.cipher == CIPHER_DES ? IDC5_CIPHERDES : IDC5_CIPHER3DES); CheckRadioButton (hwnd, IDC5_SSHPROT1, IDC5_SSHPROT2, cfg.sshprot == 1 ? IDC5_SSHPROT1 : IDC5_SSHPROT2); CheckDlgButton (hwnd, IDC5_AUTHTIS, cfg.try_tis_auth); SetDlgItemText (hwnd, IDC5_PKEDIT, cfg.keyfile); SetDlgItemText (hwnd, IDC5_CMDEDIT, cfg.remote_cmd); CheckRadioButton (hwnd, IDC6_MBWINDOWS, IDC6_MBXTERM, cfg.mouse_is_xterm ? IDC6_MBXTERM : IDC6_MBWINDOWS); { static int tabs[4] = {25, 61, 96, 128}; SendDlgItemMessage (hwnd, IDC6_CCLIST, LB_SETTABSTOPS, 4, (LPARAM) tabs); } for (i=0; i<256; i++) { char str[100]; sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i, (i>=0x21 && i != 0x7F) ? i : ' ', cfg.wordness[i]); SendDlgItemMessage (hwnd, IDC6_CCLIST, LB_ADDSTRING, 0, (LPARAM) str); } CheckDlgButton (hwnd, IDC7_BOLDCOLOUR, cfg.bold_colour); CheckDlgButton (hwnd, IDC7_PALETTE, cfg.try_palette); { int i; for (i=0; i<22; i++) if (cfg.bold_colour || permcolour[i]) SendDlgItemMessage (hwnd, IDC7_LIST, LB_ADDSTRING, 0, (LPARAM) colours[i]); } SendDlgItemMessage (hwnd, IDC7_LIST, LB_SETCURSEL, 0, 0); SetDlgItemInt (hwnd, IDC7_RVALUE, cfg.colours[0][0], FALSE); SetDlgItemInt (hwnd, IDC7_GVALUE, cfg.colours[0][1], FALSE); SetDlgItemInt (hwnd, IDC7_BVALUE, cfg.colours[0][2], FALSE); CheckRadioButton (hwnd, IDC8_NOXLAT, IDC8_88592WIN1250, cfg.xlat_88592w1250 ? IDC8_88592WIN1250 : cfg.xlat_enablekoiwin ? IDC8_KOI8WIN1251 : IDC8_NOXLAT); CheckDlgButton (hwnd, IDC8_CAPSLOCKCYR, cfg.xlat_capslockcyr); CheckRadioButton (hwnd, IDC8_VTXWINDOWS, IDC8_VTPOORMAN, cfg.vtmode == VT_XWINDOWS ? IDC8_VTXWINDOWS : cfg.vtmode == VT_OEMANSI ? IDC8_VTOEMANSI : cfg.vtmode == VT_OEMONLY ? IDC8_VTOEMONLY : IDC8_VTPOORMAN); } static void hide(HWND hwnd, int hide, int minid, int maxid) { int i; for (i = minid; i < maxid; i++) { HWND ctl = GetDlgItem(hwnd, i); if (ctl) { ShowWindow(ctl, hide ? SW_HIDE : SW_SHOW); } } } /* * This _huge_ function is the configuration box. */ static int GenericMainDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, int dlgtype) { HWND hw, tabctl; TC_ITEMHEADER tab; OPENFILENAME of; char filename[sizeof(cfg.keyfile)]; CHOOSEFONT cf; LOGFONT lf; char fontstatic[256]; int i; switch (msg) { case WM_INITDIALOG: SetWindowLong(hwnd, GWL_USERDATA, 0); /* * Centre the window. */ /* * Create the tab control. */ { RECT r; WPARAM font; X_TAB, hinst, NULL); font = SendMessage(hwnd, WM_GETFONT, 0, 0); SendMessage(tabctl, WM_SETFONT, font, MAKELPARAM(TRUE, 0)); } /* * Create the various panelfuls of controls. */ i = 0; /* The Connection panel. Accelerators used: [aco] dehlnprstwx */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 6, 30); if (dlgtype == 0) { multiedit(&cp, "Host &Name", IDC0_HOSTSTATIC, IDC0_HOST, 75, "&Port", IDC0_PORTSTATIC, IDC0_PORT, 25, NULL); if (backends[2].backend == NULL) { /* this is PuTTYtel, so only two protocols available */ radioline(&cp, "Protocol:", IDC0_PROTSTATIC, 3, "&Raw", IDC0_PROTRAW, "&Telnet", IDC0_PROTTELNET, NULL); } else { radioline(&cp, "Protocol:", IDC0_PROTSTATIC, 3, "&Raw", IDC0_PROTRAW, "&Telnet", IDC0_PROTTELNET, #ifdef FWHACK "SS&H/hack", #else "SS&H", #endif IDC0_PROTSSH, NULL); } sesssaver(&cp, "Stor&ed Sessions", IDC0_SESSSTATIC, IDC0_SESSEDIT, IDC0_SESSLIST, "&Load", IDC0_SESSLOAD, "&Save", IDC0_SESSSAVE, "&Delete", IDC0_SESSDEL, NULL); } checkbox(&cp, "Close Window on E&xit", IDC0_CLOSEEXIT); checkbox(&cp, "&Warn on Close", IDC0_CLOSEWARN); tab.mask = TCIF_TEXT; tab.pszText = "Connection"; TabCtrl_InsertItem (tabctl, i++, &tab); } /* The Keyboard panel. Accelerators used: [aco] 4?ehiklmnprsuvxy */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 6, 30); radioline(&cp, "Action of Backspace:", IDC1_DELSTATIC, 2, "Control-&H", IDC1_DEL008, "Control-&? (127)", IDC1_DEL127, NULL); radioline(&cp, "Action of Home and End:", IDC1_HOMESTATIC, 2, "&Standard", IDC1_HOMETILDE, "&rxvt", IDC1_HOMERXVT, NULL); radioline(&cp, "Function key and keypad layout:", IDC1_FUNCSTATIC, 3, "&VT400", IDC1_FUNCTILDE, "&Linux", IDC1_FUNCLINUX, "&Xterm R6", IDC1_FUNCXTERM, NULL); radioline(&cp, "Initial state of cursor keys:", IDC1_CURSTATIC, 2, "&Normal", IDC1_CURNORMAL, "A&pplication", IDC1_CURAPPLIC, NULL); radioline(&cp, "Initial state of numeric keypad:", IDC1_KPSTATIC, 3, "Nor&mal", IDC1_KPNORMAL, "Appl&ication", IDC1_KPAPPLIC, "N&etHack", IDC1_KPNH, NULL); checkbox(&cp, "ALT-F&4 is special (closes window)", IDC1_ALTF4); checkbox(&cp, "ALT-Space is special (S&ystem menu)", IDC1_ALTSPACE); checkbox(&cp, "&Use local terminal line discipline", IDC1_LDISCTERM); checkbox(&cp, "Reset scrollback on &keypress", IDC1_SCROLLKEY); tab.mask = TCIF_TEXT; tab.pszText = "Keyboard"; TabCtrl_InsertItem (tabctl, i++, &tab); } /* The Terminal panel. Accelerators used: [aco] dghlmnprsw */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 6, 30); multiedit(&cp, "&Rows", IDC2_ROWSSTATIC, IDC2_ROWSEDIT, 33, "Colu&mns", IDC2_COLSSTATIC, IDC2_COLSEDIT, 33, "&Scrollback", IDC2_SAVESTATIC, IDC2_SAVEEDIT, 33, NULL); staticbtn(&cp, "", IDC2_FONTSTATIC, "C&hange...", IDC2_CHOOSEFONT); checkbox(&cp, "Auto &wrap mode initially on", IDC2_WRAPMODE); checkbox(&cp, "&DEC Origin Mode initially on", IDC2_DECOM); checkbox(&cp, "Implicit CR in every &LF", IDC2_LFHASCR); checkbox(&cp, "Bee&p enabled", IDC2_BEEP); checkbox(&cp, "Use Back&ground colour erase", IDC2_BCE); checkbox(&cp, "Enable bli&nking text", IDC2_BLINKTEXT); tab.mask = TCIF_TEXT; tab.pszText = "Terminal"; TabCtrl_InsertItem (tabctl, i++, &tab); } /* The Window panel. Accelerators used: [aco] bikty */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 6, 30); if (dlgtype == 0) multiedit(&cp, "Initial window &title:", IDC3_WINTITLE, IDC3_WINEDIT, 100, NULL); checkbox(&cp, "Avoid ever using &icon title", IDC3_WINNAME); checkbox(&cp, "&Blinking cursor", IDC3_BLINKCUR); checkbox(&cp, "Displa&y scrollbar", IDC3_SCROLLBAR); checkbox(&cp, "Loc&k Window size", IDC3_LOCKSIZE); tab.mask = TCIF_TEXT; tab.pszText = "Window"; TabCtrl_InsertItem (tabctl, i++, &tab); } /* The Telnet panel. Accelerators used: [aco] bdflrstuv */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 6, 30); if (dlgtype == 0) { staticedit(&cp, "Terminal-&type string", IDC4_TTSTATIC, IDC4_TTEDIT); staticedit(&cp, "Terminal-&speed string", IDC4_TSSTATIC, IDC4_TSEDIT); staticedit(&cp, "Auto-login &username", IDC4_LOGSTATIC, IDC4_LOGEDIT); envsetter(&cp, "Environment variables:", IDC4_ENVSTATIC, "&Variable", IDC4_VARSTATIC, IDC4_VAREDIT, "Va&lue", IDC4_VALSTATIC, IDC4_VALEDIT, IDC4_ENVLIST, "A&dd", IDC4_ENVADD, "&Remove", IDC4_ENVREMOVE); radioline(&cp, "Handling of OLD_ENVIRON ambiguity:", IDC4_EMSTATIC, 2, "&BSD (commonplace)", IDC4_EMBSD, "R&FC 1408 (unusual)", IDC4_EMRFC, NULL); tab.mask = TCIF_TEXT; tab.pszText = "Telnet"; TabCtrl_InsertItem (tabctl, i++, &tab); } } /* The SSH panel. Accelerators used: [aco] 123abdkmprtuw */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 6, 30); if (dlgtype == 0) { staticedit(&cp, "Terminal-&type string", IDC5_TTSTATIC, IDC5_TTEDIT); staticedit(&cp, "Auto-login &username", IDC5_LOGSTATIC, IDC5_LOGEDIT); multiedit(&cp, "&Remote command:", IDC5_CMDSTATIC, IDC5_CMDEDIT, 100, NULL); checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC5_NOPTY); checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication", IDC5_AUTHTIS); checkbox(&cp, "Allow &agent forwarding", IDC5_AGENTFWD); editbutton(&cp, "Private &key file for authentication:", IDC5_PKSTATIC, IDC5_PKEDIT, "Bro&wse...", IDC5_PKBUTTON); radioline(&cp, "Preferred SSH protocol version:", IDC5_SSHPROTSTATIC, 2, "&1", IDC5_SSHPROT1, "&2", IDC5_SSHPROT2, NULL); radioline(&cp, "Preferred encryption algorithm:", IDC5_CIPHERSTATIC, 3, "&3DES", IDC5_CIPHER3DES, "&Blowfish", IDC5_CIPHERBLOWF, "&DES", IDC5_CIPHERDES, NULL); tab.mask = TCIF_TEXT; tab.pszText = "SSH"; TabCtrl_InsertItem (tabctl, i++, &tab); } } /* The Selection panel. Accelerators used: [aco] stwx */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 6, 30); radiobig(&cp, "Action of mouse buttons:", IDC6_MBSTATIC, "&Windows (Right pastes, Middle extends)", IDC6_MBWINDOWS, "&xterm (Right extends, Middle pastes)", IDC6_MBXTERM, NULL); charclass(&cp, "Character classes:", IDC6_CCSTATIC, IDC6_CCLIST, "&Set", IDC6_CCSET, IDC6_CCEDIT, "&to class", IDC6_CCSTATIC2); tab.mask = TCIF_TEXT; tab.pszText = "Selection"; TabCtrl_InsertItem (tabctl, i++, &tab); } /* The Colours panel. Accelerators used: [aco] bmlu */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 6, 30); checkbox(&cp, "&Bolded text is a different colour", IDC7_BOLDCOLOUR); checkbox(&cp, "Attempt to use &logical palettes", IDC7_PALETTE); colouredit(&cp, "Select a colo&ur and click to modify it:", IDC7_STATIC, IDC7_LIST, "&Modify...", IDC7_CHANGE, "Red:", IDC7_RSTATIC, IDC7_RVALUE, "Green:", IDC7_GSTATIC, IDC7_GVALUE, "Blue:", IDC7_BSTATIC, IDC7_BVALUE, NULL); tab.mask = TCIF_TEXT; tab.pszText = "Colours"; TabCtrl_InsertItem (tabctl, i++, &tab); } /* The Translation panel. Accelerators used: [aco] beiknpsx */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 6, 30); radiobig(&cp, "Handling of VT100 line drawing characters:", IDC8_VTSTATIC, "Font has &XWindows encoding", IDC8_VTXWINDOWS, "Use font in &both ANSI and OEM modes", IDC8_VTOEMANSI, "Use font in O&EM mode only", IDC8_VTOEMONLY, "&Poor man's line drawing (""+"", ""-"" and ""|"")", IDC8_VTPOORMAN, NULL); radiobig(&cp, "Character set translation:", IDC8_XLATSTATIC, "&None", IDC8_NOXLAT, "&KOI8 / Win-1251", IDC8_KOI8WIN1251, "&ISO-8859-2 / Win-1250", IDC8_88592WIN1250, NULL); checkbox(&cp, "CAP&S LOCK acts as cyrillic switch", IDC8_CAPSLOCKCYR); tab.mask = TCIF_TEXT; tab.pszText = "Translation"; TabCtrl_InsertItem (tabctl, i++, &tab); } init_dlg_ctrls(hwnd); hide(hwnd, TRUE, controlstartvalue, controlendvalue); hide(hwnd, FALSE, connectionpanelstart, connectionpanelend); /* * Set focus into the first available control. */ { HWND ctl; ctl = GetDlgItem(hwnd, IDC0_HOST); if (!ctl) ctl = GetDlgItem(hwnd, IDC0_CLOSEEXIT); SetFocus(ctl); } SetWindowLong(hwnd, GWL_USERDATA, 1); return 0hwnd, WM_COMMAND, IDOK, 0); break; case WM_NOTIFY: if (LOWORD(wParam) == IDCXTCITEM item; char buffer[64]; item.pszText = buffer; item.cchTextMax = sizeof(buffer); item.mask = TCIF_TEXT; TabCtrl_GetItem(((LPNMHDR)lParam)->hwndFrom, i, &item); hide(hwnd, TRUE, controlstartvalue, controlendvalue); if (!strcmp(buffer, "Connection")) hide(hwnd, FALSE, connectionpanelstart, connectionpanelend); if (!strcmp(buffer, "Keyboard")) hide(hwnd, FALSE, keyboardpanelstart, keyboardpanelend); if (!strcmp(buffer, "Terminal")) hide(hwnd, FALSE, terminalpanelstart, terminalpanelend); if (!strcmp(buffer, "Window")) hide(hwnd, FALSE, windowpanelstart, windowpanelend); if (!strcmp(buffer, "Telnet")) hide(hwnd, FALSE, telnetpanelstart, telnetpanelend); if (!strcmp(buffer, "SSH")) hide(hwnd, FALSE, sshpanelstart, sshpanelend); if (!strcmp(buffer, "Selection")) hide(hwnd, FALSE, selectionpanelstart, selectionpanelend); if (!strcmp(buffer, "Colours")) hide(hwnd, FALSE, colourspanelstart, colourspanelend); if (!strcmp(buffer, "Translation")) hide(hwnd, FALSE, translationpanelstart, translationpanelend); /* * Only process WM_COMMAND once the dialog is fully formed. */ if (GetWindowLong(hwnd, GWL_USERDATA) == 1) switch (LOWORD(wParam)) { case IDC0_PROTTELNET: case IDC0_PROTSSH: case IDC00_PROTSSH); int j = IsDlgButtonChecked (hwnd, IDC00_PORT, cfg.port, FALSE); } } break; case IDC0_HOST: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC0_HOST, cfg.host, sizeof(cfg.host)-1); break; case IDC0_PORT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC0_PORT, &cfg.port); break; case IDC0_CLOSEEXIT cfg.close_on_exit = IsDlgButtonChecked (hwnd, IDC0_CLOSEEXIT); break; case IDC0_CLOSEWARN cfg.warn_on_close = IsDlgButtonChecked (hwnd, IDC0_CLOSEWARN); break; case IDC00_SESSLIST, LB_SETCURSEL, (WPARAM) -1, 0); GetDlgItemText (hwnd, IDC00_SESSSAVE0_SESSEDIT, str, sizeof(str)-1); if (!*str) { int n = SendDlgItemMessage (hwnd, IDC000_SESSLIST, LB_ADDSTRING, 0, (LPARAM) (sessions[i])); SendDlgItemMessage (hwnd, IDC00_SESSLIST: case IDC0_SESSLOAD: if (LOWORD(wParam) == IDC0_SESSLOAD && f (LOWORD(wParam) == IDC0_SESSLIST && HIWORD(wParam) != LBN_DBLCLK) break; { int n = SendDlgItemMessage (hwnd, IDC0init_dlg_ctrls(hwnd); } if (LOWORD(wParam) == IDC00_SESSDELn = SendDlgItemMessage (hwnd, IDC000_SESSLIST, LB_ADDSTRING, 0, (LPARAM) (sessions[i])); SendDlgItemMessage (hwnd, IDC0_SESSLIST, LB_SETCURSEL, (WPARAM) -1, 0); } case IDC1_DEL008: case IDC1_DEL127 cfg.bksp_is_delete = IsDlgButtonChecked (hwnd, IDC1_DEL127); break; case IDC1_HOMETILDE: case IDC1_HOMERXVT cfg.rxvt_homeend = IsDlgButtonChecked (hwnd, IDC1_HOMERXVT); break; case IDC1_FUNCXTERM cfg.funky_type = 2; break; case IDC1_FUNCTILDE: case IDC1_FUNCLINUX cfg.funky_type = IsDlgButtonChecked (hwnd, IDC1_FUNCLINUX); break; case IDC1_KPNORMAL: case IDC1_KPAPPLICcfg.app_keypad = IsDlgButtonChecked (hwnd, IDC1_KPAPPLIC); cfg.nethack_keypad = FALSE; } break; case IDC1_KPNHcfg.app_keypad = FALSE; cfg.nethack_keypad = TRUE; } break; case IDC1_CURNORMAL: case IDC1_CURAPPLIC cfg.app_cursor = IsDlgButtonChecked (hwnd, IDC1_CURAPPLIC); break; case IDC1_ALTF4 cfg.alt_f4 = IsDlgButtonChecked (hwnd, IDC1_ALTF4); break; case IDC1_ALTSPACE cfg.alt_space = IsDlgButtonChecked (hwnd, IDC1_ALTSPACE); break; case IDC1_LDISCTERM cfg.ldisc_term = IsDlgButtonChecked (hwnd, IDC1_LDISCTERM); break; case IDC1_SCROLLKEY cfg.scroll_on_key = IsDlgButtonChecked (hwnd, IDC1_SCROLLKEY); break; case IDC2_WRAPMODE cfg.wrap_mode = IsDlgButtonChecked (hwnd, IDC2_WRAPMODE); break; case IDC2_DECOM cfg.dec_om = IsDlgButtonChecked (hwnd, IDC2_DECOM); break; case IDC22_LFHASCR); break; case IDC2_ROWSEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC2_ROWSEDIT, &cfg.height); break; case IDC2_COLSEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC2_COLSEDIT, &cfg.width); break; case IDC2_SAVEEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC2_SAVEEDIT, &cfg.savelines); break; case IDC22_FONTSTATIC, fontstatic); } break; case IDC2_BEEP cfg.beep = IsDlgButtonChecked (hwnd, IDC2_BEEP); break; case IDC2_BLINKTEXT cfg.blinktext = IsDlgButtonChecked (hwnd, IDC2_BLINKTEXT); break; case IDC2_BCE cfg.bce = IsDlgButtonChecked (hwnd, IDC2_BCE); break; case IDC3_WINNAME cfg.win_name_always = IsDlgButtonChecked (hwnd, IDC3_WINNAME); break; case IDC3_BLINKCUblink_cur = IsDlgButtonChecked (hwnd, IDC3_BLINKCUR); break; case IDC33_SCROLLBAR); break; case IDC3_LOCKSIZ cfg.locksize = IsDlgButtonChecked (hwnd, IDC3_LOCKSIZE); break; case IDC3_WINEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC3_WINEDIT, cfg.wintitle, sizeof(cfg.wintitle)-1); break; case IDC44_TTEDIT, cfg.termtype, sizeof(cfg.termtype)-1); break; case IDC4_TSEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC4_TSEDIT, cfg.termspeed, sizeof(cfg.termspeed)-1); break; case IDC4_LOGEDIT: if (HIWORD(wParam) == EN_CHANGE) { GetDlgItemText (hwnd, IDC4_LOGEDIT, cfg.username, sizeof(cfg.username)-1); cfg.username[sizeof(cfg.username)-1] = '\0'; SetWindowLong(hwnd, GWL_USERDATA, 0); SetDlgItemText (hwnd, IDC5_LOGEDIT, cfg.username); SetWindowLong(hwnd, GWL_USERDATA, 1); } break; case IDC4_EMBSD: case IDC4_EMRFC: cfg.rfc_environ = IsDlgButtonChecked (hwnd, IDC4_EMRFC); break; case IDC4_ENVADD char str[sizeof(cfg.environmt)]; char *p; GetDlgItemText (hwnd, IDC444_ENVLIST, LB_ADDSTRING, 0, (LPARAM)str); SetDlgItemText (hwnd, IDC4_VAREDIT, ""); SetDlgItemText (hwnd, IDC4444 case IDC55_TTEDIT, cfg.termtype, sizeof(cfg.termtype)-1); break; case IDC5_LOGEDIT: if (HIWORD(wParam) == EN_CHANGE) { GetDlgItemText (hwnd, IDC5_LOGEDIT, cfg.username, sizeof(cfg.username)-1); cfg.username[sizeof(cfg.username)-1] = '\0'; SetWindowLong(hwnd, GWL_USERDATA, 0); SetDlgItemText (hwnd, IDC4_LOGEDIT, cfg.username); SetWindowLong(hwnd, GWL_USERDATA, 1); } break; case IDC5_NOPTY cfg.nopty = IsDlgButtonChecked (hwnd, IDC5_NOPTY); break; case IDC5_AGENTFWD cfg.agentfwd = IsDlgButtonChecked (hwnd, IDC5_AGENTFWD); break; case IDC5_CIPHER3DES: case IDC5_CIPHERBLOWF: case IDC5_CIPHERDESf (IsDlgButtonChecked (hwnd, IDC555_CIPHERDES)) cfg.cipher = CIPHER_DES; } break; case IDC5_SSHPROT1: case IDC555_SSHPROT2)) cfg.sshprot = 2; } break; case IDC5_AUTHTIS cfg.try_tis_auth = IsDlgButtonChecked (hwnd, IDC5_AUTHTIS); break; case IDC5_PKEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC55_CMDEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC5_CMDEDIT, cfg.remote_cmd, sizeof(cfg.remote_cmd)-1); break; case IDC5_PKBUTTON:5_PKEDIT, cfg.keyfile); } break; case IDC6_MBWINDOWS: case IDC6_MBXTERM: cfg.mouse_is_xterm = IsDlgButtonChecked (hwnd, IDC6_MBXTERM); break; case IDC6_CCSET: { BOOL ok; int i; int n = GetDlgItemInt (hwnd, IDC6666 case IDC77_BOLDCOLOUR); n = SendDlgItemMessage (hwnd, IDC7_LIST, LB_GETCOUNT, 0, 0); if (cfg.bold_colour && n!=22) { for (i=0; i<22; i++) if (!permcolour[i]) SendDlgItemMessage (hwnd, IDC7colour[i]) SendDlgItemMessage (hwnd, IDC7_LIST, LB_DELETESTRING, i, 0); } } break; case IDC7_PALETTE cfg.try_palette = IsDlgButtonChecked (hwnd, IDC7_PALETTE); break; case IDC7_LIST: if (HIWORD(wParam) == LBN_DBLCLK || HIWORD(wParam) == LBN_SELCHANGE) { int i = SendDlgItemMessage (hwnd, IDC77_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt (hwnd, IDC7_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt (hwnd, IDC77777_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt (hwnd, IDC7_BVALUE, cfg.colours[i][2], FALSE); } } break; case IDC8_NOXLAT: case IDC8_KOI8WIN1251: case IDC88_KOI8WIN1251); cfg.xlat_88592w1250 = IsDlgButtonChecked (hwnd, IDC8_88592WIN1250); break; case IDC88_CAPSLOCKCYR); } break; case IDC8_VTXWINDOWS: case IDC8_VTOEMANSI: case IDC8_VTOEMONLY: case IDC8_VTPOORMAN: cfg.vtmode = (IsDlgButtonChecked (hwnd, IDC8_VTXWINDOWS) ? VT_XWINDOWS : IsDlgButtonChecked (hwnd, IDC8_VTOEMANSI) ? VT_OEMANSI : IsDlgButtonChecked (hwnd, IDC8_VTOEMONLY) ? VT_OEMONLY : VT_POORMAN); breakX 0 1 Revision-number: 691 Prop-content-length: 159 Content-length: 159 K 7 svn:log V 59 Miscellaneous fixes to try to make other compilers happier K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-09T12:19:09.000000Z PROPS-END Node-path: putty/be_all.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 966c57698ec7ef2d38f468b5d79d2288 Text-delta-base-sha1: 3a5e64fc1c9bf88d3d70c3f4bdc995c3bdbb9290 Text-content-length: 120 Text-content-md5: 26dbb7fabd32ad3faf6b85e8bbfc1d47 Text-content-sha1: 0285d2f9810b725cd7372c90b4bb0ecae2ebfc33 Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNB) dqdTnfndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/be_none.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3436475773e0696a6d0ea7684f754a7a Text-delta-base-sha1: b2c1b730c0d26cf7679fbb344bfa54d11ab9839e Text-content-length: 122 Text-content-md5: 346f27ff380ce78670807b79d7178af2 Text-content-sha1: 0cbf50e171a92d2173e7ea5fc8248c8048e338e1 Content-length: 161 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNZA d$d9!fndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 325b9d2fe6a49a5be846c18d623dc30f Text-delta-base-sha1: e72246e551cd96e343541fc554d25ee9aa052669 Text-content-length: 120 Text-content-md5: 8b4b0855dfab78cce4d8dc1350d81d3e Text-content-sha1: 076d9db8bd257f9f33dad6bc41e7c9efe6bc6bbe Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNT; dqdfnfndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1412bc4e98b9ee4decb269e43aac26d2 Text-delta-base-sha1: 4b429799d69772350991181478b7c6cb7a4a4b4a Text-content-length: 140 Text-content-md5: 6641252536844eabfb7cc5667b48e30c Text-content-sha1: bb236530bfd68e1b5aefcc84227ff3df76cbdd59 Content-length: 179 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNo{{t#include #ifndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ab578a31f34832dd9c50050f61d90546 Text-delta-base-sha1: 4ac02d988b448735267b084b9e51060fe9e1d6bb Text-content-length: 140 Text-content-md5: 27a1c7e2ab354f50f6478c917c0f8496 Text-content-sha1: aa040c327af04ab63f7a96a03e858c72c3ed0fe2 Content-length: 179 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN q{{v#include #ifndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 60103424cb3387a33ab91b692f89f8d8 Text-delta-base-sha1: ad6f640c289f74ffc8dbd9331482c822a8700619 Text-content-length: 120 Text-content-md5: 4c2c2340e075881372a74e7abff58684 Text-content-sha1: 295d70d0859f2ea28ae326f039b712b104466d1c Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN?& didYffndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eaa3ecd76f016f5d59b379f7ac771ccb Text-delta-base-sha1: 403d2769f5e58e5e4fac312b823451f8335878bd Text-content-length: 120 Text-content-md5: 1e0413d3d0d98da71e0b0d7e0c23e5d5 Text-content-sha1: 909bace7495d419a51fdf80ca3d8177d55272b3b Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN~e dMd4Jfndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4f135bf8a4527a0b46e3ab638ea61d9e Text-delta-base-sha1: 25c401ef84f3c5aac9cd53480491e0a789c9c2f7 Text-content-length: 140 Text-content-md5: 8201f475375e314cb3d60ab94a7476e2 Text-content-sha1: 9deadf93c0a534c0c2da91fabd8e0b3d327db26e Content-length: 179 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNF-{{2#include #ifndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 03578f9f6464b060a0ef42a5bf3cff19 Text-delta-base-sha1: cc8d8954c07d89604f1f9d4ad3f2659f83fcd590 Text-content-length: 20 Text-content-md5: 311a2970edbf34b358e950bb59f4bea2 Text-content-sha1: b1080d30ae3672984101fa8017e92c4fe9afab74 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNq i Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 98f9f6917b644d2dacbb4be5db816744 Text-delta-base-sha1: c5e479be7b34731dccb99f7562e28690534846e4 Text-content-length: 143 Text-content-md5: 4333a3556296032d68fa7a31162c449d Text-content-sha1: a3c4cf69463ac1acd22ae8abc3bb709ce4460298 Content-length: 183 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN){{#include #ifndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4684da2e11732ca3d4f6c2a87c5b0812 Text-delta-base-sha1: 219d70add8fa5bb15ed443f604baa14950501791 Text-content-length: 31 Text-content-md5: 4902823c6f2268d7dead91bb5cf5d15e Text-content-sha1: 0fd16b12d9cf4f064e627f1daec97f05666e303c Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVN rwHEAVY Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3bd8efdf09fe94cd40ac7b6bfd53f361 Text-delta-base-sha1: a8be8f0b47d54a3524b2a22c099dbc9ca15e916e Text-content-length: 120 Text-content-md5: 9c324f2165f2ed7bc3187215e0031f20 Text-content-sha1: 07a80b1184b69961fe4067ce37a6b0921c859b16 Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNA( dxdLufndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Node-path: putty/xlat.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f6d96eca8448709bb766183bfdad6825 Text-delta-base-sha1: ebc95ebefb0396a5cc906492b8f7397f6e97a85a Text-content-length: 140 Text-content-md5: 166a809e846b38ba9a59587860d0bf14 Text-content-sha1: 697cefbf428a040470041e546c49e5c80d5362b0 Content-length: 179 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN{{#include #ifndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif Revision-number: 692 Prop-content-length: 371 Content-length: 371 K 8 svn:date V 27 2000-10-09T12:53:32.000000Z K 7 svn:log V 270 Robert de Bath's big patch: - cope with strange WinSock wrappers not supporting SIOCATMARK - define yet more terminal compatibility modes - support UK-ASCII (just like US-ASCII but # is a sterling sign) - support connection keepalives at a configurable interval K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e35ef3084b8f985d345c1e5f0b0eb617 Text-delta-base-sha1: 11d779dd6935f9ee0ca7002907aeac1c455074f2 Text-content-length: 53 Text-content-md5: e5938840058561bc5291815b6f4d8d2c Text-content-sha1: ce9feffc10555f79b38da13b1609cc4bc848ef79 Content-length: 93 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVN6ZcZ_7, TS_PINGint ping_interval Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1e0413d3d0d98da71e0b0d7e0c23e5d5 Text-delta-base-sha1: 909bace7495d419a51fdf80ca3d8177d55272b3b Text-content-length: 123 Text-content-md5: d4ccc392b8d3c83a78a6e72b8154ccc9 Text-content-sha1: b9b01cc740ddc7ef2d459f237a45446c9a590472 Content-length: 162 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNed` Au9,i (sesskey, "PingInterval", cfg->ping_intervali (sesskey, "PingInterval", 0, &cfg->ping_interval Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4beb6680fdee1642dc23aa2d9fa5cfba Text-delta-base-sha1: 3eecbbd9d0684c208c20350d70c723b6ef2ff748 Text-content-length: 286 Text-content-md5: 36bd1d1f1da6ccd462d7f8351d353e0b Text-content-sha1: b4be75961d2760b57b48f69007b57e96637194b7 Content-length: 326 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNES4(if (code == TS_PING) { if (ssh_version == 1) { send_packet(SSH1_MSG_IGNORE, PKT_STR, "", PKT_END); } else { ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(); ssh2_pkt_send(); } Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 74a62bb0fd16dcb921fdbba487dad210 Text-delta-base-sha1: f4fa967ccaf05f40f99ca6c446b2770942651d24 Text-content-length: 278 Text-content-md5: eb0631c35c9d587ac92e7eed6614895f Text-content-sha1: 0f1e5ee368b9859e2e95f2db210c7fa5119cda88 Content-length: 318 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNCfr# @}g2 /* Don't check for error return; some shims don't support * this ioctl. */ ioctlsocket (s, SIOCATMARK, &clear_of_oob case TS_PING: if (o_they_sga.state == ACTIVE) { b[1] = NOP; s_write (b, 2); } Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4333a3556296032d68fa7a31162c449d Text-delta-base-sha1: a3c4cf69463ac1acd22ae8abc3bb709ce4460298 Text-content-length: 2546 Text-content-md5: 35a08e6af64151f355980fa2c65b5409 Text-content-sha1: 140dd9ac74f6e44b04d97ed56430e6cd861e684e Content-length: 2586 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN(mwM8m &.0c@Nrho(\Qm.jzL~ZEAbi'2(OTHER,2(OTHER, case '\177': /* Destructive backspace This does nothing on a real VT100 */ compatibility(OTHER); if (curs_x && !wrapnext) curs_x--; wrapnext = FALSE; fix_cpos; *cpos = (' ' | curr_attr | ATTR_ASCII)5f if (c==0x5F) *cpos++ = ' ' | curr_attr |case ATTR_GBCHR: /* If UK-ASCII, make the '#' a LineDraw Pound */ if (c == '#') { *cpos++ = '}' | curr_attr | ATTR_LINEDRW; break; } /*FALLTHROUGH*/2(OTHER,2(OTHER,2(OTHER,VT220); curr_attr &= ~ATTR_BLINK; break; case 27: /* disable reverse video */ compatibility2(OTHER,in 40..42 are a PuTTY extension. * The 2nd arg, 8bit vs 7bit is not checkswitch (esc_args[0]) { case 61: compatibility_level &= ~TM_VTXXX; compatibility_level |= TM_VT102; break; case 62: compatibility_level &= ~TM_VTXXX; compatibility_level |= TM_VT220; break; default: if( esc_args[0] > 60 && esc_args[0] < 70 ) compatibility_level |= TM_VTXXX; break; case 40: compatibility_level &= TM_VTXXX; break; case 41: compatibility_level = TM_PUTTY; break; case 42: compatibility_level = TM_SCOANSI; break; case ARG_DEFAULT: compatibility_level = TM_PUTTY; break; case 50: break; } /* Change the response to CSI c */ if (esc_args[0] == 50) { int i; char lbuf[64]; strcpy(id_string, "\033[?"); for (i=1; i': app_keypad{ /* VT Specials -> ISO8859-1 */ static const char poorman2[] = "* # HTFFCRLF\xB0 \xB1 NLVT+ + + + + - - - - - + + + + | <=>=PI!=\xA3 \xB7 "; int ch = (*q & CHAR_MASK); if ((*q & ATTR_LINEDRW) && ch >= 0x60 && ch < 0x7F ) { int x; *p++ = poorman2[2*(ch-0x60)]; if ( (x = poorman2[2*(ch-0x60)+1]) != ' ') *p++ = x; } #if 0 else if ((*q & ATTR_GBCHR) && ch == '#') *p++ = (unsigned char) 0xA3; #endif else *p++ = (unsigned char) ch; q++; } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f17576624c7772dd6998feeb59cb9779 Text-delta-base-sha1: b6286e949ba1ffae2535b429e4354d12eb6040c1 Text-content-length: 1799 Text-content-md5: e5e90e4a8dde5f951b155109823dbf30 Text-content-sha1: be0d6d43a2f73576e57dc0702d80430976a72746 Content-length: 1839 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN]):>o,>/X5wI>=hu&R[qxzHvW2$sF?C^kE@pQByEBoQW=( W=xW=S:mp int sid, int eid, int percentedit100-percentedit) * (cp->width + GAPBETWEEN) / 100PINGSTATIC, IDC0_PINGEDITFUNCVT400IDC3_CLOSEEXIT, IDC3_CLOSEWARNSetDlgItemInt (hwnd, IDC0_PINGEDIT, cfg.ping_interval, FALSE cfg.funky_type == 0 ? IDC1_FUNCTILDE : cfg.funky_type == 1 ? IDC1_FUNCLINUX : cfg.funky_type == 2 ? IDC1_FUNCXTERM : cfg.funky_type == 3 ? IDC1_FUNCVT400 : IDC1_FUNCTILDE CheckDlgButton (hwnd, IDC3_CLOSEEXIT, cfg.close_on_exit); CheckDlgButton (hwnd, IDC3_CLOSEWARN, cfg.warn_on_clos staticedit(&cp, "Keepalive inter&val (minutes)", IDC0_PINGSTATIC, IDC0_PINGEDIT, 254, "&VT400", IDC1_FUNCTILDE, "&Linux", IDC1_FUNCLINUX, "&Xterm R6", IDC1_FUNCXTERM, "&VT400", IDC1_FUNCVT400vwcheckbox(&cp, "Close Window on E&xit", IDC3_CLOSEEXIT); checkbox(&cp, "&Warn on Close", IDC3_CLOSEWARN, 50); staticedit(&cp, "Terminal-&speed string", IDC4_TSSTATIC, IDC4_TSEDIT, 50); staticedit(&cp, "Auto-login &username", IDC4_LOGSTATIC, IDC4_LOGEDIT, 50, 50); staticedit(&cp, "Auto-login &username", IDC5_LOGSTATIC, IDC5_LOGEDIT, 50PINGED case IDC0_PINGEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC0_PINGEDIT, &cfg.ping_interval); break; case IDC1_DEL008: case IDC1_DEL127VT400funky_type = 33_CLOSEEXITclose_on_exit = IsDlgButtonChecked (hwnd, IDC3_CLOSEEXIT); break; case IDC33_CLOSEWARN Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4902823c6f2268d7dead91bb5cf5d15e Text-delta-base-sha1: 0fd16b12d9cf4f064e627f1daec97f05666e303c Text-content-length: 4291 Text-content-md5: c72db0455bed3b55f2baecd647185a31 Text-content-sha1: 3ef6f081797573c1cc0105a5567a05a6cf0d8837 Content-length: 4331 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN> *L*GZnp_z5-~c); z''sTB^,: N@`HMqLZ[ "8]#include 0) { time_t now; time(&now); if (now-last_movement > cfg.ping_interval * 60 - 10) { back->special(TS_PING); last_movement = now; } }time(&last_movement) * Actually '_' maps to space too, but that's done before#if 0 { /* Tell us all about key events */ static BYTE oldstate[256]; static int first = 1; static int scan; int ch; if(first) memcpy(oldstate, keystate, sizeof(oldstate)); first=0; if ((HIWORD(lParam)&(KF_UP|KF_REPEAT))==KF_REPEAT) { debug(("+")); } else if ((HIWORD(lParam)&KF_UP) && scan==(HIWORD(lParam) & 0xFF) ) { debug((". U")); } else { debug((".\n")); if (wParam >= VK_F1 && wParam <= VK_F20 ) debug(("K_F%d", wParam+1-VK_F1)); else switch(wParam) { case VK_SHIFT: debug(("SHIFT")); break; case VK_CONTROL: debug(("CTRL")); break; case VK_MENU: debug(("ALT")); break; default: debug(("VK_%02x", wParam)); } if(message == WM_SYSKEYDOWN || message == WM_SYSKEYUP) debug(("*")); debug((", S%02x", scan=(HIWORD(lParam) & 0xFF) )); ch = MapVirtualKey(wParam, 2); if (ch>=' ' && ch<='~') debug((", '%c'", ch)); else if (ch) debug((", $%02x", ch)); if (keys[0]) debug((", KB0=%02x", keys[0])); if (keys[1]) debug((", KB1=%02x", keys[1])); if (keys[2]) debug((", KB2=%02x", keys[2])); if ( (keystate[VK_SHIFT]&0x80)!=0) debug((", S")); if ( (keystate[VK_CONTROL]&0x80)!=0) debug((", C")); if ( (HIWORD(lParam)&KF_EXTENDED) ) debug((", E")); if ( (HIWORD(lParam)&KF_UP) ) debug((", U")); } if ((HIWORD(lParam)&(KF_UP|KF_REPEAT))==KF_REPEAT) ; else if ( (HIWORD(lParam)&KF_UP) ) oldstate[wParam&0xFF] ^= 0x80; else oldstate[wParam&0xFF] ^= 0x81; for(ch=0; ch<256; ch++) if (oldstate[ch] != keystate[ch]) debug((", M%02x=%02x", ch, keystate[ch])); memcpy(oldstate, keystate, sizeof(oldstate)); } #endif 3 || (cfg.funky_type <|| cfg.funky_type == 3 /* Control-Numlock for app-keypad mode switch */ if (wParam == VK_PAUSE && shift_state == 2) { app_keypad_keys ^= 1; return 03 || ( cfg.funky_type <= 1 && app_keypad_keys)) switch(wParam) { case VK_EXECUTE:cfg.funky_type==2) { if(shift_state) xkey = 'l'; else xkey = 'k'; } else if(shift_state) xkey = 'm'; else xkey = 'l'; break; case VK_DIVIDE: if(cfg.funky_type==2) xkey = 'o'; break; case VK_MULTIPLY:if(cfg.funky_type==2) xkey = 'j'; break; case VK_SUBTRACT:if(cfg.funky_type==2) xkey = 'm'; break; /* Reorder edit keys to physical order */ if (cfg.funky_type == 3 && code <= 6 ) code = "\0\2\1\4\5\3\6"[code]; if (vt52_mode) p += sprintf((char *)p, "\x1B%c", code + 'P' - 11); else return 0; Revision-number: 693 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2000-10-09T15:51:14.000000Z K 7 svn:log V 49 Abandon the tab control in favour of a tree view K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0e8ad38f272ef4e742d98b6d1a7d1acd Text-delta-base-sha1: 4032ad5432e4391ee15a28a142583c50b79e4f79 Text-content-length: 396 Text-content-md5: f38ec364f892cec1b960247cd35cfe19 Text-content-sha1: 88456e3f6b0c2a10f16faa13ef1f650c65200cc3 Content-length: 436 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN&(iI|$|TR280, 232Configuration" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Open", IDOK, 184, 215, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 231, 215, 44, 14 PUSHBUTTON "&About", IDC_ABOUT, 3, 215, 44, 14, NOT WS_TABSTOP END /* Accelerators used: ac */ IDD_RECONF DIALOG DISCARDABLE 0, 0, 280, 232184, 215, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 231, 215 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e5e90e4a8dde5f951b155109823dbf30 Text-delta-base-sha1: be0d6d43a2f73576e57dc0702d80430976a72746 Text-content-length: 32986 Text-content-md5: 895f9fe97bde13f2b6f16dfad5f2a4c7 Text-content-sha1: 83cbef7dd7d5c658f84b17340ea1cf725b863edd Content-length: 33026 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN)1j`A[8A~  6bbbDd @[iYNi5kXZzgUT= OhyH@]@O9h7S4Nh7S4EN[oP1h@)\X_3EQBq7vm [s4OU?JZ-p8Y)|}dz_^{Y?Z]p8Y)P?vP?V~P?OP?tU?H}U?tP?U=P?]P?_P?aP?YP?UP?IqP?TP?XP?PP?g{:Z-1KP?bP?=M? S?U/XMwt  o%P?UP? V?QJ@V?4P?3P@u{y AiY?hs:OP?T|85>U|m5|?I< U?cRWGAPXBOX 7 #define GAPYBOX 4dlu4inpix; int ypos, width; int xoff; int boxystart, boxid, boxtextid; char *boxtext; }; static void ctlposinit(struct ctlpos *cp, HWND hwnd, int leftborder, int righttopborderdlu4inpix = r2.right; cp->width = (r.right * 4) / (r2.right) - 2*GAPBETWEEN; cp->xoff = leftborder; cp->width -= leftborder + rightA title bar across the top of a sub-dialog. */ static void bartitle(struct ctlpos *cp, char *name, int id) { RECT r; r.left = GAPBETWEEN; r.right = cp->width; r.top = cp->ypos; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPBETWEEN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, name, id); } /* * Begin a grouping box, with or without a group title. */ static void beginbox(struct ctlpos *cp, char *name, int idbox, int idtext) { if (name) cp->ypos += STATICHEIGHT/2; cp->boxystart = cp->ypos; if (name) cp->ypos += STATICHEIGHT - (STATICHEIGHT/2); cp->ypos += GAPYBOX; cp->width -= 2*GAPXBOX; cp->xoff += GAPXBOX; cp->boxid = idbox; cp->boxtextid = idtext; cp->boxtext = name; } /* * End a grouping box. */ static void endbox(struct ctlpos *cp) { RECT r; cp->xoff -= GAPXBOX; cp->width += 2*GAPXBOX; cp->ypos += GAPYBOX - GAPBETWEEN; r.left = GAPBETWEEN; r.right = cp->width; r.top = cp->boxystart; r.bottom = cp->ypos - cp->boxystart; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_ETCHEDFRAME, 0, "", cp->boxid); if (cp->boxtext) { SIZE s; HDC hdc; HFONT oldfont, dlgfont; hdc = GetDC(cp->hwnd); dlgfont = (HFONT)cp->font; oldfont = SelectObject(hdc, dlgfont); GetTextExtentPoint32(hdc, cp->boxtext, strlen(cp->boxtext), &s); SelectObject(hdc, oldfont); DeleteDC(hdc); r.left = GAPXBOX + GAPBETWEEN; r.right = (s.cx * 4 + cp->dlu4inpix-1) / cp->dlu4inpix; r.top = cp->boxystart - STATICHEIGHT/2cp->boxtext, cp->boxtextid); } cp->ypos += GAPYBOXVSTATIC, IDCX_TREEVIEW, controlstartvalue, sessionpanelstart, IDC_TITLE_SESSION, IDC_BOX_SESSION1, IDC_BOXT_SESSION1, IDC_BOX_SESSION2, IDC_BOXT_SESSION2, IDC_BOX_SESSION3, IDC_HOSTSTATIC, IDC_HOST, IDC_PORTSTATIC, IDC_PORT, IDC_PROTSTATIC, IDC_PROTRAW, IDC_PROTTELNET, IDC_PROTSSH, IDC_SESSSTATIC, IDC_SESSEDIT, IDC_SESSLIST, IDC_SESSLOAD, IDC_SESSSAVE, IDC_SESSDEL, IDC_CLOSEEXIT, sessionpanelend, keyboardpanelstart, IDC_TITLE_KEYBOARD, IDC_BOX_KEYBOARD1, IDC_BOXT_KEYBOARD1, IDC_BOX_KEYBOARD2, IDC_BOXT_KEYBOARD2, IDC_DELSTATIC, IDC_DEL008, IDC_DEL127, IDC_HOMESTATIC, IDC_HOMETILDE, IDC_HOMERXVT, IDC_FUNCSTATIC, IDC_FUNCTILDE, IDC_FUNCLINUX, IDC_FUNCXTERM, IDC_FUNCVT400, IDC_KPSTATIC, IDC_KPNORMAL, IDC_KPAPPLIC, IDC_KPNH, IDC_CURSTATIC, IDC_CURNORMAL, IDC_CURAPPLIC, keyboardpanelend, terminalpanelstart, IDC_TITLE_TERMINAL, IDC_BOX_TERMINAL1, IDC_BOXT_TERMINAL1, IDC_BOX_TERMINAL2, IDC_BOXT_TERMINAL2, IDC_BOX_TERMINAL3, IDC_BOXT_TERMINAL3, IDC_WRAPMODE, IDC_DECOM, IDC_DIMSTATIC, IDC_ROWSSTATIC, IDC_ROWSEDIT, IDC_COLSSTATIC, IDC_COLSEDIT, IDC_LOCKSIZE, IDC_FONTSTATIC, IDC_CHOOSEFONT, IDC_LFHASCR, IDC_BEEP, IDC_BCE, IDC_BLINKTEXT, IDC_LDISCTERM, terminalpanelend, windowpanelstart, IDC_TITLE_WINDOW, IDC_BOX_WINDOW1, IDC_BOXT_WINDOW1, IDC_BOX_WINDOW2, IDC_BOXT_WINDOW2, IDC_BOX_WINDOW3, IDC_BOXT_WINDOW3, IDC_BOX_WINDOW4, IDC_WINNAME, IDC_BLINKCUR, IDC_SCROLLBAR, IDC_WINTITLE, IDC_WINEDIT, IDC_CLOSEWARN, IDC_SAVESTATIC, IDC_SAVEEDIT, IDC_ALTF4, IDC_ALTSPACE, IDC_SCROLLKEY, windowpanelend, connectionpanelstart, IDC_TITLE_CONNECTION, IDC_BOX_CONNECTION1, IDC_BOXT_CONNECTION1, IDC_BOX_CONNECTION2, IDC_BOXT_CONNECTION2, IDC_TTSTATIC, IDC_TTEDIT, IDC_LOGSTATIC, IDC_LOGEDIT, IDC_PINGSTATIC, IDC_PINGEDIT, connectionpanelend, telnetpanelstart, IDC_TITLE_TELNET, IDC_BOX_TELNET1, IDC_BOXT_TELNET1, IDC_BOX_TELNET2, IDC_BOXT_TELNET2, IDC_TSSTATIC, IDC_TSEDIT, IDC_ENVSTATIC, IDC_VARSTATIC, IDC_VAREDIT, IDC_VALSTATIC, IDC_VALEDIT, IDC_ENVLIST, IDC_ENVADD, IDC_ENVREMOVE, IDC_EMSTATIC, IDC_EMBSD, IDC_EMRFC, telnetpanelend, sshpanelstart, IDC_TITLE_SSH, IDC_BOX_SSH1, IDC_BOXT_SSH1, IDC_BOX_SSH2, IDC_BOXT_SSH2, IDC_BOX_SSH3, IDC_BOXT_SSH3, IDC_NOPTY, IDC_CIPHERSTATIC, IDC_CIPHER3DES, IDC_CIPHERBLOWF, IDC_CIPHERDES, IDC_AUTHTIS, IDC_PKSTATIC, IDC_PKEDIT, IDC_PKBUTTON, IDC_SSHPROTSTATIC, IDC_SSHPROT1, IDC_SSHPROT2, IDC_AGENTFWD, IDC_CMDSTATIC, IDC_CMDEDIT, sshpanelend, selectionpanelstart, IDC_TITLE_SELECTION, IDC_BOX_SELECTION1, IDC_BOXT_SELECTION1, IDC_BOX_SELECTION2, IDC_BOXT_SELECTION2, IDC_MBSTATIC, IDC_MBWINDOWS, IDC_MBXTERM, IDC_CCSTATIC, IDC_CCLIST, IDC_CCSET, IDC_CCSTATIC2, IDC_CCEDIT, selectionpanelend, colourspanelstart, IDC_TITLE_COLOURS, IDC_BOX_COLOURS1, IDC_BOXT_COLOURS1, IDC_BOX_COLOURS2, IDC_BOXT_COLOURS2, IDC_BOLDCOLOUR, IDC_PALETTE, IDC_STATIC, IDC_LIST, IDC_RSTATIC, IDC_GSTATIC, IDC_BSTATIC, IDC_RVALUE, IDC_GVALUE, IDC_BVALUE, IDC_CHANGE, colourspanelend, translationpanelstart, IDC_TITLE_TRANSLATION, IDC_BOX_TRANSLATION1, IDC_BOXT_TRANSLATION1, IDC_BOX_TRANSLATION2, IDC_BOXT_TRANSLATION2, IDC_BOX_TRANSLATION3, IDC_BOXT_TRANSLATION3, IDC_XLATSTATIC, IDC_NOXLAT, IDC_KOI8WIN1251, IDC_88592WIN1250, IDC_CAPSLOCKCYR, IDC_VTSTATIC, IDC_VTXWINDOWS, IDC_VTOEMANSI, IDC_VTOEMONLY, IDC_HOST, cfg.host); SetDlgItemText (hwnd, IDC_SESSEDIT, savedsession); SetDlgItemInt (hwnd, IDC_PORT, cfg.port, FALSE); for (i = 0; i < nsessions; i++) SendDlgItemMessage (hwnd, IDC_PROTRAW, IDC_PROTSSH, cfg.protocol==PROT_SSH ? IDC_PROTSSH : cfg.protocol==PROT_TELNET ? IDC_PROTTELNET : IDC_PROTRAW ); SetDlgItemInt (hwnd, IDC_PINGEDIT, cfg.ping_interval, FALSE); CheckRadioButton (hwnd, IDC_DEL008, IDC_DEL127, cfg.bksp_is_delete ? IDC_DEL127 : IDC_DEL008); CheckRadioButton (hwnd, IDC_HOMETILDE, IDC_HOMERXVT, cfg.rxvt_homeend ? IDC_HOMERXVT : IDC_HOMETILDE); CheckRadioButton (hwnd, IDC_FUNCTILDE, IDC_FUNCXTERM, cfg.funky_type == 0 ? IDC_FUNCTILDE : cfg.funky_type == 1 ? IDC_FUNCLINUX : cfg.funky_type == 2 ? IDC_FUNCXTERM : cfg.funky_type == 3 ? IDC_FUNCVT400 : IDC_FUNCTILDE ); CheckRadioButton (hwnd, IDC_CURNORMAL, IDC_CURAPPLIC, cfg.app_cursor ? IDC_CURAPPLIC : IDC_CURNORMAL); CheckRadioButton (hwnd, IDC_KPNORMAL, IDC_KPNH, cfg.nethack_keypad ? IDC_KPNH : cfg.app_keypad ? IDC_KPAPPLIC : IDC_KPNORMAL); CheckDlgButton (hwnd, IDC_ALTF4, cfg.alt_f4); CheckDlgButton (hwnd, IDC_ALTSPACE, cfg.alt_space); CheckDlgButton (hwnd, IDC_LDISCTERM, cfg.ldisc_term); CheckDlgButton (hwnd, IDC_SCROLLKEY, cfg.scroll_on_key); CheckDlgButton (hwnd, IDC_WRAPMODE, cfg.wrap_mode); CheckDlgButton (hwnd, IDC_DECOM, cfg.dec_om); CheckDlgButton (hwnd, IDC_LFHASCR, cfg.lfhascr); SetDlgItemInt (hwnd, IDC_ROWSEDIT, cfg.height, FALSE); SetDlgItemInt (hwnd, IDC_COLSEDIT, cfg.width, FALSE); SetDlgItemInt (hwnd, IDC_FONTSTATIC, fontstatic); CheckDlgButton (hwnd, IDC_BEEP, cfg.beep); CheckDlgButton (hwnd, IDC_BCE, cfg.bce); CheckDlgButton (hwnd, IDC_BLINKTEXT, cfg.blinktext); SetDlgItemText (hwnd, IDC_WINEDIT, cfg.wintitle); CheckDlgButton (hwnd, IDC_WINNAME, cfg.win_name_always); CheckDlgButton (hwnd, IDC_BLINKCUR, cfg.blink_cur); CheckDlgButton (hwnd, IDC_SCROLLBAR, cfg.scrollbar); CheckDlgButton (hwnd, IDC_LOCKSIZE, cfg.locksize); CheckDlgButton (hwnd, IDC_CLOSEEXIT, cfg.close_on_exit); CheckDlgButton (hwnd, IDC_CLOSEWARN, cfg.warn_on_close); SetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype); SetDlgItemText (hwnd, IDC_TSEDIT, cfg.termspeed); SetDlgItemText (hwnd, IDC_EMBSD, IDC_EMRFC, cfg.rfc_environ ? IDC_EMRFC : IDC_EMBSD); SetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype); SetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username); CheckDlgButton (hwnd, IDC_NOPTY, cfg.nopty); CheckDlgButton (hwnd, IDC_AGENTFWD, cfg.agentfwd); CheckRadioButton (hwnd, IDC_CIPHER3DES, IDC_CIPHERDES, cfg.cipher == CIPHER_BLOWFISH ? IDC_CIPHERBLOWF : cfg.cipher == CIPHER_DES ? IDC_CIPHERDES : IDC_CIPHER3DES); CheckRadioButton (hwnd, IDC_SSHPROT1, IDC_SSHPROT2, cfg.sshprot == 1 ? IDC_SSHPROT1 : IDC_SSHPROT2); CheckDlgButton (hwnd, IDC_AUTHTIS, cfg.try_tis_auth); SetDlgItemText (hwnd, IDC_PKEDIT, cfg.keyfile); SetDlgItemText (hwnd, IDC_CMDEDIT, cfg.remote_cmd); CheckRadioButton (hwnd, IDC_MBWINDOWS, IDC_MBXTERM, cfg.mouse_is_xterm ? IDC_MBXTERM : IDC_BOLDCOLOUR, cfg.bold_colour); CheckDlgButton (hwnd, IDC_LIST, LB_ADDSTRING, 0, (LPARAM) colours[i]); } SendDlgItemMessage (hwnd, IDC_LIST, LB_SETCURSEL, 0, 0); SetDlgItemInt (hwnd, IDC_RVALUE, cfg.colours[0][0], FALSE); SetDlgItemInt (hwnd, IDC_GVALUE, cfg.colours[0][1], FALSE); SetDlgItemInt (hwnd, IDC_BVALUE, cfg.colours[0][2], FALSE); CheckRadioButton (hwnd, IDC_NOXLAT, IDC_88592WIN1250, cfg.xlat_88592w1250 ? IDC_88592WIN1250 : cfg.xlat_enablekoiwin ? IDC_KOI8WIN1251 : IDC_NOXLAT); CheckDlgButton (hwnd, IDC_CAPSLOCKCYR, cfg.xlat_capslockcyr); CheckRadioButton (hwnd, IDC_VTXWINDOWS, IDC_VTPOORMAN, cfg.vtmode == VT_XWINDOWS ? IDC_VTXWINDOWS : cfg.vtmode == VT_OEMANSI ? IDC_VTOEMANSI : cfg.vtmode == VT_OEMONLY ? IDC_VTOEMONLY : IDCstruct treeview_faff { HWND treeview; HTREEITEM lastat[4]; }; static HTREEITEM treeview_insert(struct treeview_faff *faff, int level, char *text) { TVINSERTSTRUCT ins; int i; HTREEITEM newitem; ins.hParent = (level > 0 ? faff->lastat[level-1] : TVI_ROOT); ins.hInsertAfter = faff->lastat[level]; ins.DUMMYUNIONNAME.item.mask = TVIF_TEXT; ins.DUMMYUNIONNAME.item.pszText = text; newitem = TreeView_InsertItem(faff->treeview, &ins); if (level > 0) TreeView_Expand(faff->treeview, faff->lastat[level-1], TVE_EXPAND); faff->lastat[level] = newitem; for (i = level+1; i < 4; i++) faff->lastat[i] = NULL; return newitem;reeview; struct treeview_faff tvfaff; HTREEITEM hsessionree view. */ { RECT r; WPARAM font; HWND tvstatic; r.left = 3; r.right = r.left + 75; r.top = 3; r.bottom = r.top + 10; MapDialogRect(hwnd, &r); tvstatic = CreateWindowEx(0, "STATIC", "Cate&gory:", WS_CHILD | WS_VISIBLE, r.left, r.top, hwnd, (HMENU)IDCX_TVSTATICvstatic, WM_SETFONT, font, MAKELPARAM(TRUE, 0)); r.left = 3; r.right = r.left + 75; r.top = 13; r.bottom = r.top + 196; MapDialogRect(hwnd, &r); treeview = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_SHOWSELALWAYS, r.left, r.top, hwnd, (HMENU)IDCX_TREEVIEWreeview, WM_SETFONT, font, MAKELPARAM(TRUE, 0)); tvfaff.treeview = treeview; memset(tvfaff.lastat, 0, sizeof(tvfaff.lastat)); } /* * Create the various panelfuls of controls. */ /* The Session panel. Accelerators used: [acgo] nprthelsdx */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Basic options for your PuTTY session", IDC_TITLE_SESSION); if (dlgtype == 0) { beginbox(&cp, "Specify your connection by host name", IDC_BOX_SESSION1, IDC_BOXT_SESSION1); multiedit(&cp, "Host &Name", IDC_HOSTSTATIC, IDC_HOST, 75, "&Port", IDC_PORTSTATIC, IDC_PROTSTATIC, 3, "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTTELNET, NULL); } else { radioline(&cp, "Protocol:", IDC_PROTSTATIC, 3, "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTSSH, NULL); } endbox(&cp); beginbox(&cp, "Load, save or delete a stored session", IDC_BOX_SESSION2, IDC_BOXT_SESSION2); sesssaver(&cp, "Stor&ed Sessions", IDC_SESSSTATIC, IDC_SESSEDIT, IDC_SESSLIST, "&Load", IDC_SESSLOAD, "&Save", IDC_SESSSAVE, "&Delete", IDC_SESSDEL, NULL); endbox(&cp); } beginbox(&cp, NULL, IDC_BOX_SESSION3, 0); checkbox(&cp, "Close Window on E&xit", IDC_CLOSEEXIT); endbox(&cp); hsession = treeview_insert(&tvfaff, 0, "Session"); } /* The Terminal panel. Accelerators used: [acgo] rmkh&dlbenu */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the terminal emulation", IDC_TITLE_TERMINAL); beginbox(&cp, "Set the size of the terminal window", IDC_BOX_TERMINAL1, IDC_BOXT_TERMINAL1); multiedit(&cp, "&Rows", IDC_ROWSSTATIC, IDC_ROWSEDIT, 50, "Colu&mns", IDC_COLSSTATIC, IDC_COLSEDIT, 50, NULL); checkbox(&cp, "Loc&k window size against resizing", IDC_LOCKSIZE); endbox(&cp); beginbox(&cp, "Set the font used in the terminal window", IDC_BOX_TERMINAL2, IDC_BOXT_TERMINAL2); staticbtn(&cp, "", IDC_FONTSTATIC, "C&hange...", IDC_CHOOSEFONT); endbox(&cp); beginbox(&cp, "Set various terminal options", IDC_BOX_TERMINAL3, IDC_BOXT_TERMINAL3); checkbox(&cp, "Auto &wrap mode initially on", IDC_WRAPMODE); checkbox(&cp, "&DEC Origin Mode initially on", IDC_DECOM); checkbox(&cp, "Implicit CR in every &LF", IDC_LFHASCR); checkbox(&cp, "&Beep enabled", IDC_BEEP); checkbox(&cp, "Use background colour to &erase screen", IDC_BCE); checkbox(&cp, "Enable bli&nking text", IDC_BLINKTEXT); checkbox(&cp, "&Use local terminal line discipline", IDC_LDISCTERM); endbox(&cp); treeview_insert(&tvfaff, 0, "Terminal"); } /* The Keyboard panel. Accelerators used: [acgo] h?srvlxvnpmie */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the effects of keys", IDC_TITLE_KEYBOARD); beginbox(&cp, "Change the sequences sent by:", IDC_BOX_KEYBOARD1, IDC_BOXT_KEYBOARD1); radioline(&cp, "The Backspace key", IDC_DELSTATIC, 2, "Control-&H", IDC_DEL008, "Control-&? (127)", IDC_DEL127, NULL); radioline(&cp, "The Home and End keys", IDC_HOMESTATIC, 2, "&Standard", IDC_HOMETILDE, "&rxvt", IDC_HOMERXVT, NULL); radioline(&cp, "The Function keys and keypad", IDC_FUNCSTATIC, 4, "&VT400", IDC_FUNCTILDE, "&Linux", IDC_FUNCLINUX, "&Xterm R6", IDC_FUNCXTERM, "&VT400", IDC_FUNCVT400, NULL); endbox(&cp); beginbox(&cp, "Change the initial state of:", IDC_BOX_KEYBOARD2, IDC_BOXT_KEYBOARD2); radioline(&cp, "Initial state of cursor keys:", IDC_CURSTATIC, 2, "&Normal", IDC_CURNORMAL, "A&pplication", IDC_CURAPPLIC, NULL); radioline(&cp, "Initial state of numeric keypad:", IDC_KPSTATIC, 3, "Nor&mal", IDC_KPNORMAL, "Appl&ication", IDC_KPAPPLIC, "N&etHack", IDC_KPNH, NULL); endbox(&cp); treeview_insert(&tvfaff, 1, "Keyboard"); } /* The Window panel. Accelerators used: [acgo] tibsdkw4y */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling PuTTY's window", IDC_TITLE_WINDOW); beginbox(&cp, "Adjust the use of the window title", IDC_BOX_WINDOW1, IDC_BOXT_WINDOW1); if (dlgtype == 0) multiedit(&cp, "Initial window &title:", IDC_WINTITLE, IDC_WINEDIT, 100, NULL); checkbox(&cp, "Avoid ever using &icon title", IDC_WINNAME); endbox(&cp); beginbox(&cp, "Adjust the use of the cursor", IDC_BOX_WINDOW2, IDC_BOXT_WINDOW2); checkbox(&cp, "Cursor &blinks", IDC_BLINKCUR); endbox(&cp); beginbox(&cp, "Control the scrollback in the window", IDC_BOX_WINDOW3, IDC_BOXT_WINDOW3); staticedit(&cp, "Lines of &scrollback", IDC_SAVESTATIC, IDC_SAVEEDIT, 50); checkbox(&cp, "&Display scrollbar", IDC_SCROLLBAR); checkbox(&cp, "Reset scrollback on &keypress", IDC_SCROLLKEY); endbox(&cp); beginbox(&cp, NULL, IDC_BOX_WINDOW4, 0); checkbox(&cp, "&Warn before closing window", IDC_CLOSEWARN); checkbox(&cp, "Window closes on ALT-F&4", IDC_ALTF4); checkbox(&cp, "S&ystem menu appears on ALT-Space)", IDC_ALTSPACE); endbox(&cp); treeview_insert(&tvfaff, 0, "Window"); } /* The Translation panel. Accelerators used: [acgo] xbepnkis */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling character set translation", IDC_TITLE_TRANSLATION); beginbox(&cp, "Adjust how PuTTY displays line drawing characters", IDC_BOX_TRANSLATION1, IDC_BOXT_TRANSLATION1); radiobig(&cp, "Handling of line drawing characters:", IDC_VTSTATIC, "Font has &XWindows encoding", IDC_VTXWINDOWS, "Use font in &both ANSI and OEM modes", IDC_VTOEMANSI, "Use font in O&EM mode only", IDC_VTOEMONLY, "&Poor man's line drawing (""+"", ""-"" and ""|"")", IDC_VTPOORMAN, NULL); endbox(&cp); beginbox(&cp, "Enable character set translation on received data", IDC_BOX_TRANSLATION2, IDC_BOXT_TRANSLATION2); radiobig(&cp, "Character set translation:", IDC_XLATSTATIC, "&None", IDC_NOXLAT, "&KOI8 / Win-1251", IDC_KOI8WIN1251, "&ISO-8859-2 / Win-1250", IDC_88592WIN1250, NULL); endbox(&cp); beginbox(&cp, "Enable character set translation on input data", IDC_BOX_TRANSLATION3, IDC_BOXT_TRANSLATION3); checkbox(&cp, "CAP&S LOCK acts as cyrillic switch", IDC_CAPSLOCKCYR); endbox(&cp); treeview_insert(&tvfaff, 1, "Translation"); } /* The Selection panel. Accelerators used: [acgo] wxst */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling copy and paste", IDC_TITLE_SELECTION); beginbox(&cp, "Control which mouse button does which thing", IDC_BOX_SELECTION1, IDC_BOXT_SELECTION1); radiobig(&cp, "Action of mouse buttons:", IDC_MBSTATIC, "&Windows (Right pastes, Middle extends)", IDC_MBWINDOWS, "&xterm (Right extends, Middle pastes)", IDC_MBXTERM, NULL); endbox(&cp); beginbox(&cp, "Control the select-one-word-at-a-time mode", IDC_BOX_SELECTION2, IDC_BOXT_SELECTION2); charclass(&cp, "Character classes:", IDC_CCSTATIC, IDC_CCLIST, "&Set", IDC_CCSET, IDC_CCEDIT, "&to class", IDC_CCSTATIC2); endbox(&cp); treeview_insert(&tvfaff, 1, "Selection"); } /* The Colours panel. Accelerators used: [acgo] blum */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling use of colours", IDC_TITLE_COLOURS); beginbox(&cp, "General options for colour usage", IDC_BOX_COLOURS1, IDC_BOXT_COLOURS1); checkbox(&cp, "&Bolded text is a different colour", IDC_BOLDCOLOUR); checkbox(&cp, "Attempt to use &logical palettes", IDC_PALETTE); endbox(&cp); beginbox(&cp, "Adjust the precise colours PuTTY displays", IDC_BOX_COLOURS2, IDC_BOXT_COLOURS2); colouredit(&cp, "Select a colo&ur and then click to modify it:", IDC_STATIC, IDC_LIST, "&Modify...", IDC_CHANGE, "Red:", IDC_RSTATIC, IDC_RVALUE, "Green:", IDC_GSTATIC, IDC_GVALUE, "Blue:", IDC_BSTATIC, IDC_BVALUE, NULL); endbox(&cp); treeview_insert(&tvfaff, 1, "Colours"); } /* The Connection panel. Accelerators used: [acgo] tuk */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the connection", IDC_TITLE_CONNECTION); if (dlgtype == 0) { beginbox(&cp, "Data to send to the server", IDC_BOX_CONNECTION1, IDC_BOXT_CONNECTION1); staticedit(&cp, "Terminal-&type string", IDC_TTSTATIC, IDC_TTEDIT, 50); staticedit(&cp, "Auto-login &username", IDC_LOGSTATIC, IDC_LOGEDIT, 50); endbox(&cp); } beginbox(&cp, "Sending of null packets to keep session active", IDC_BOX_CONNECTION2, IDC_BOXT_CONNECTION2); staticedit(&cp, "Minutes between &keepalives (0 to turn off)", IDC_PINGSTATIC, IDC_PINGEDIT, 25); endbox(&cp); treeview_insert(&tvfaff, 0, "Connection"); } /* The Telnet panel. Accelerators used: [acgo] svldrbf */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { bartitle(&cp, "Options controlling Telnet connections", IDC_TITLE_TELNET); beginbox(&cp, "Data to send to the server", IDC_BOX_TELNET1, IDC_BOXT_TELNET1); staticedit(&cp, "Terminal-&speed string", IDC_TSSTATIC, IDC_TSEDIT, 50); envsetter(&cp, "Environment variables:", IDC_ENVSTATIC, "&Variable", IDC_VARSTATIC, IDC_VAREDIT, "Va&lue", IDC_VALSTATIC, IDC_VALEDIT, IDC_ENVLIST, "A&dd", IDC_ENVADD, "&Remove", IDC_ENVREMOVE); endbox(&cp); beginbox(&cp, "Telnet protocol adjustments", IDC_BOX_TELNET2, IDC_BOXT_TELNET2); radioline(&cp, "Handling of OLD_ENVIRON ambiguity:", IDC_EMSTATIC, 2, "&BSD (commonplace)", IDC_EMBSD, "R&FC 1408 (unusual)", IDC_EMRFC, NULL); endbox(&cp); treeview_insert(&tvfaff, 1, "Telnet"); } } /* The SSH panel. Accelerators used: [acgo] rmakwp123bd */ { struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { bartitle(&cp, "Options controlling SSH connections", IDC_TITLE_SSH); beginbox(&cp, "Data to send to the server", IDC_BOX_SSH1, IDC_BOXT_SSH1); multiedit(&cp, "&Remote command:", IDC_CMDSTATIC, IDC_CMDEDIT, 100, NULL); endbox(&cp); beginbox(&cp, "Authentication options", IDC_BOX_SSH2, IDC_BOXT_SSH2); checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication", IDC_AUTHTIS); checkbox(&cp, "Allow &agent forwarding", IDC_PKSTATIC, IDC_PKEDIT, "Bro&wse...", IDC_PKBUTTON); endbox(&cp); beginbox(&cp, "Protocol options", IDC_BOX_SSH3, IDC_BOXT_SSH3); checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC_NOPTY); radioline(&cp, "Preferred SSH protocol version:", IDC_SSHPROTSTATIC, 2, "&1", IDC_SSHPROT1, "&2", IDC_SSHPROT2, NULL); radioline(&cp, "Preferred encryption algorithm:", IDC_CIPHERSTATIC, 3, "&3DES", IDC_CIPHER3DES, "&Blowfish", IDC_CIPHERBLOWF, "&DES", IDC_CIPHERDES, NULL); endbox(&cp); treeview_insert(&tvfaff, 1, "SSH"); } } init_dlg_ctrls(hwnd); /* * Hide all the controls to start with. */ hide(hwnd, TRUE, controlstartvalue, controlendvalue); /* * Put the treeview selection on to the Session panel. This * should also cause unhiding of the relevant controls. */ TreeView_SelectItem(treeview, hsession_HOST); if (!ctl) ctl = GetDlgItem(hwnd, IDC_CLOSEEXREEVIEW && ((LPNMHDR)lParam)->code == TVN_SELCHANGED) { HTREEITEM i = TreeView_GetSelection(((LPNMHDR)lParam)->hwndFrom); TVITEM item; char buffer[64]; item.hItem = i; item.pszText = buffer; item.cchTextMax = sizeof(buffer); item.mask = TVIF_TEXT; TreeView_GetItem(((LPNMHDR)lParam)->hwndFromSession")) hide(hwnd, FALSE, sessionpanelstart, sessConnection")) hide(hwnd, FALSE, connectionpanelstart, connection_PROTTELNET: case IDC_PROTSSH: case IDC_PROTSSH); int j = IsDlgButtonChecked (hwnd, IDC_PORT, cfg.port, FALSE); } } break; case IDC_HOST: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_HOST, cfg.host, sizeof(cfg.host)-1); break; case IDC_PORT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_PORT, &cfg.port); break; case IDC_SESSEDIT: if (HIWORD(wParam) == EN_CHANGE) { SendDlgItemMessage (hwnd, IDC_SESSSAVE/* * Save a session */ char str[2048]; GetDlgItemText (hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) -1, 0); } break; case IDC_SESSLIST: case IDC_SESSLOAD: if (LOWORD(wParam) == IDC_SESSDELn = SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) -1, 0); } case IDC_PINGEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_PINGEDIT, &cfg.ping_interval); break; case IDC_DEL008: case IDC_DEL127 cfg.bksp_is_delete = IsDlgButtonChecked (hwnd, IDC_DEL127); break; case IDC_HOMETILDE: case IDC_HOMERXVT cfg.rxvt_homeend = IsDlgButtonChecked (hwnd, IDC_HOMERXVT); break; case IDC_FUNCVT400 cfg.funky_type = 3; break; case IDC_FUNCTILDE: case IDC_FUNCLINUX cfg.funky_type = IsDlgButtonChecked (hwnd, IDC_FUNCLINUX); break; case IDC_KPNORMAL: case IDC_KPAPPLICcfg.app_keypad = IsDlgButtonChecked (hwnd, IDC_KPNHcfg.app_keypad = FALSE; cfg.nethack_keypad = TRUE; } break; case IDC_CURNORMAL: case IDC_CURAPPLIC cfg.app_cursor = IsDlgButtonChecked (hwnd, IDC_CURAPPLIC); break; case IDC_ALTF4); break; case IDC_ALTSPACE cfg.alt_space = IsDlgButtonChecked (hwnd, IDC_ALTSPACE); break; case IDC_LDISCTERM cfg.ldisc_term = IsDlgButtonChecked (hwnd, IDC_LDISCTERM); break; case IDC_SCROLLKEY cfg.scroll_on_key = IsDlgButtonChecked (hwnd, IDC_SCROLLKEY); break; case IDC_WRAPMODE cfg.wrap_mode = IsDlgButtonChecked (hwnd, IDC_WRAPMODE); break; case IDC_DECOM cfg.dec_om = IsDlgButtonChecked (hwnd, IDC_DECOM); break; case IDC_LFHASCR cfg.lfhascr = IsDlgButtonChecked (hwnd, IDC_LFHASCR); break; case IDC_ROWSEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_ROWSEDIT, &cfg.height); break; case IDC_COLSEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_COLSEDIT, &cfg.width); break; case IDC_SAVEEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_SAVEEDIT, &cfg.savelines); break; case IDC_FONTSTATIC, fontstatic); } break; case IDC_BEEP cfg.beep = IsDlgButtonChecked (hwnd, IDC_BEEP); break; case IDC_BLINKTEXT cfg.blinktext = IsDlgButtonChecked (hwnd, IDC_BLINKTEXT); break; case IDC_BCE cfg.bce = IsDlgButtonChecked (hwnd, IDC_BCE); break; case IDC_WINNAME cfg.win_name_always = IsDlgButtonChecked (hwnd, IDC_WINNAME); break; case IDC_BLINKCUblink_cur = IsDlgButtonChecked (hwnd, IDC_BLINKCUR); break; case IDC_SCROLLBAR); break; case IDC_LOCKSIZE); break; case IDC_WINEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_WINEDIT, cfg.wintitle, sizeof(cfg.wintitle)-1); break; case IDC_CLOSEEXIT cfg.close_on_exit = IsDlgButtonChecked (hwnd, IDC_CLOSEEXIT); break; case IDC_CLOSEWARN cfg.warn_on_close = IsDlgButtonChecked (hwnd, IDC_CLOSEWARN); break; case IDC_TTEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype, sizeof(cfg.termtype)-1); break; case IDC_TSEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_LOGEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username, sizeof(cfg.username)-1); break; case IDC_EMBSD: case IDC_EMRFC: cfg.rfc_environ = IsDlgButtonChecked (hwnd, IDC_EMRFC); break; case IDC_ENVADD_VAREDIT, ""); SetDlgItemText (hwnd, IDC_NOPTY cfg.nopty = IsDlgButtonChecked (hwnd, IDC_NOPTY); break; case IDC_AGENTFWD cfg.agentfwd = IsDlgButtonChecked (hwnd, IDC_AGENTFWD); break; case IDC_CIPHER3DES: case IDC_CIPHERBLOWF: case IDC_CIPHERDESf (IsDlgButtonChecked (hwnd, IDC_CIPHER3DES)) cfg.cipher = CIPHER_3DES; else if (IsDlgButtonChecked (hwnd, IDC_CIPHERBLOWF)) cfg.cipher = CIPHER_BLOWFISH; else if (IsDlgButtonChecked (hwnd, IDC_SSHPROT1: case IDC_SSHPROT2f (IsDlgButtonChecked (hwnd, IDC_SSHPROT1)) cfg.sshprot = 1; else if (IsDlgButtonChecked (hwnd, IDC_SSHPROT2)) cfg.sshprot = 2; } break; case IDC_AUTHTIS cfg.try_tis_auth = IsDlgButtonChecked (hwnd, IDC_AUTHTIS); break; case IDC_PKEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_PKEDIT, cfg.keyfile, sizeof(cfg.keyfile)-1); break; case IDC_CMDEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_PKEDIT, cfg.keyfile); } break; case IDC_MBWINDOWS: case IDC_MBXTERM: cfg.mouse_is_xterm = IsDlgButtonChecked (hwnd, IDC_MBXTERM); break; case IDC_CCSET: { BOOL ok; int i; int n = GetDlgItemInt (hwnd, IDC_CCLIST, LB_INSERTSTRING, i, (LPARAM)str); } } } break; case IDC_BOLDCOLOURn, i; cfg.bold_colour = IsDlgButtonChecked (hwnd, IDC_BOLDCOLOUR); n = SendDlgItemMessage (hwnd, IDC_LIST, LB_DELETESTRING, i, 0); } } break; case IDC_PALETTE cfg.try_palette = IsDlgButtonChecked (hwnd, IDC_PALETTE); break; case IDC_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt (hwnd, IDC_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt (hwnd, IDC_BVALUE, cfg.colours[i][2], FALSE); } break; case IDC_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt (hwnd, IDC_BVALUE, cfg.colours[i][2], FALSE); } } break; case IDC_NOXLAT: case IDC_KOI8WIN1251: case IDC_88592WIN1250: cfg.xlat_enablekoiwin = IsDlgButtonChecked (hwnd, IDC_KOI8WIN1251); cfg.xlat_88592w1250 = IsDlgButtonChecked (hwnd, IDC_88592WIN1250); break; case IDC_CAPSLOCKCYRcfg.xlat_capslockcyr = IsDlgButtonChecked (hwnd, IDC_CAPSLOCKCYR); } break; case IDC_VTXWINDOWS: case IDC_VTOEMANSI: case IDC_VTOEMONLY: case IDC_VTPOORMAN: cfg.vtmode = (IsDlgButtonChecked (hwnd, IDC_VTXWINDOWS) ? VT_XWINDOWS : IsDlgButtonChecked (hwnd, IDC_VTOEMANSI) ? VT_OEMANSI : IsDlgButtonChecked (hwnd, IDC Revision-number: 694 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2000-10-09T16:12:51.000000Z K 7 svn:log V 67 Work around horrifyingly nonportable use of unions in K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 895f9fe97bde13f2b6f16dfad5f2a4c7 Text-delta-base-sha1: 83cbef7dd7d5c658f84b17340ea1cf725b863edd Text-content-length: 199 Text-content-md5: 40800a120fb58673658ad4a987bc4ac1 Text-content-sha1: cc3b047cf43032c86c17c1f80007badb8c57b2f4 Content-length: 239 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN1*Y*"#if _WIN32_IE >= 0x0400 && defined NONAMELESSUNION #define INSITEM DUMMYUNIONNAME.item #else #define INSITEM item #endif ins.INSITEM.mask = TVIF_TEXT; ins.INSITEM Revision-number: 695 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2000-10-09T16:29:12.000000Z K 7 svn:log V 61 Add ISO8859-2 / CP852 translation courtesy of Jaromir Filsak K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e5938840058561bc5291815b6f4d8d2c Text-delta-base-sha1: ce9feffc10555f79b38da13b1609cc4bc848ef79 Text-content-length: 31 Text-content-md5: 1617fbdd6df15d453bbb96e87a5abbdb Text-content-sha1: 23727b6c5512c36783c94bc63717949dc780f346 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN6O |Im88592cp852 Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d4ccc392b8d3c83a78a6e72b8154ccc9 Text-delta-base-sha1: b9b01cc740ddc7ef2d459f237a45446c9a590472 Text-content-length: 99 Text-content-md5: c7184b5fd265f5f7e74ce31d9a37a0a3 Text-content-sha1: 4abe0adaa5fff8332d848a7a195169229978800e Content-length: 138 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNdeHmK);88592-CP852", cfg->xlat_88592cp85288592-CP852", 0, &cfg->xlat_88592cp852 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 40800a120fb58673658ad4a987bc4ac1 Text-delta-base-sha1: cc3b047cf43032c86c17c1f80007badb8c57b2f4 Text-content-length: 309 Text-content-md5: ebb6aff0d14913500442fad30e21bfda Text-content-sha1: 31fe48ba92b100b205ebfcbc1cfb7c1587bebc90 Content-length: 349 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNo+|%Ld(EN@0b88592CP852CP852, cfg.xlat_88592w1250 ? IDC_88592WIN1250 : cfg.xlat_88592cp852 ? IDC_88592CP852 "&ISO-8859-2 / CP852", IDC_88592CP852case IDC_88592CP852cfg.xlat_88592cp852 = IsDlgButtonChecked (hwnd, IDC_88592CP852 Node-path: putty/xlat.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 166a809e846b38ba9a59587860d0bf14 Text-delta-base-sha1: 697cefbf428a040470041e546c49e5c80d5362b0 Text-content-length: 1612 Text-content-md5: f172a786f078ed61fad5bfdf9b40210d Text-content-sha1: b486c602cf2fd3ad3be4e31492caef3aaa5ba1e1 Content-length: 1651 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNR.3?P?c"43ystatic unsigned char xlatISO88592toCP852242, 32, 34, 32, 34, 46, 43, 35, 32, 47,138, 60,151,141,166,141, 032, 34, 34, 34, 34,254, 45, 45, 32,126,154, 62,152,157,167,171, 255,164,244,157,207,149,151,245,249,230,184,155,141,240,166,189, 248,165,247,136,239,150,152,243,242,231,173,156,171,241,167,190, 232,181,182,198,142,145,143,128,172,144,168,211,183,214,215,210, 209,227,213,224,226,138,153,158,252,222,233,235,154,237,221,225, 234,160,131,199,132,146,134,135,159,130,169,137,216,161,140,212, 208,228,229,162,147,139,148,246,253,133,163,251,129,236,238,250, }; static unsigned char xlatCP852toISO88592 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 99,252,233,226,228,249,230,231,179,235,138,245,238,141,196,198, 201,197,229,244,246,165,181,140,156,214,154,171,187,157,215,232, 225,237,243,250,161,177,142,158,202,234,170,159,200,186,174,175, 176,177,178,179,180,193,194,204,170,185,186,187,188,175,191,191, 192,193,194,195,196,197,195,227,200,201,202,203,204,205,206,164, 240,208,207,203,239,210,205,206,236,217,218,219,220,222,217,223, 211,223,212,209,241,242,169,185,192,218,224,219,253,221,254,180, 173,189,128,183,162,167,247,178,176,168,255,251,216,248,149,160,else if (cfg.xlat_88592cp852) return xlatCP852cp852) return xlatISO88592toCP852 Revision-number: 696 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2000-10-10T08:20:26.000000Z K 7 svn:log V 80 Rename IDC_FUNCTILDE from "VT400" to "ESC[n~" because another VT400 now exists! K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ebb6aff0d14913500442fad30e21bfda Text-delta-base-sha1: 31fe48ba92b100b205ebfcbc1cfb7c1587bebc90 Text-content-length: 33 Text-content-md5: d11a1eca3088c608d6fd66af058dd928 Text-content-sha1: b62e04231e0ac8fad851eeb9dfa914a4de18b386 Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVNop >+DESC[n&~ Revision-number: 697 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2000-10-10T08:33:49.000000Z K 7 svn:log V 140 Move initialisation of the saved session box outside init_dlg_ctrls() so that you don't end up with twice as many items after clicking Load K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d11a1eca3088c608d6fd66af058dd928 Text-delta-base-sha1: b62e04231e0ac8fad851eeb9dfa914a4de18b386 Text-content-length: 199 Text-content-md5: 921ff78b4438c063f17295add15f0bf6 Text-content-sha1: 6259903ad05e3e2e01fb9c5577346ccf1da0c68f Content-length: 239 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNp#5B3#~r for (i = 0; i < nsessions; i++) SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_ADDSTRING, 0, (LPARAM) (sessions[i]) Revision-number: 698 Prop-content-length: 497 Content-length: 497 K 8 svn:date V 27 2000-10-10T09:03:20.000000Z K 7 svn:log V 396 Now when a saved session is loaded, its name appears in the IDC_SESSEDIT box, so that clicking Save will save over it. Useful for people who want to load, modify, and re-save. Special case: this doesn't apply to Default Settings, because I think people will be more likely to load DS, modify it, and save under a _different_ name, so it's good not to allow a single mouse click to screw them up. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 921ff78b4438c063f17295add15f0bf6 Text-delta-base-sha1: 6259903ad05e3e2e01fb9c5577346ccf1da0c68f Text-content-length: 345 Text-content-md5: d97074d8c97c9e30878c8861ec7c6324 Text-content-sha1: 9ad7aab6b0ef4f1bf15f6e8dd7e653567c402c15 Content-length: 385 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVN <Z<t$ int isdef; if (n == LB_ERR) { MessageBeep(0); break; } isdef = !strcmp(sessions[n], "Default Settings"); load_settings (sessions[n], !isdef, &cfg); init_dlg_ctrls(hwnd); if (!isdef) SetDlgItemText(hwnd, IDC_SESSEDIT, sessions[n] Revision-number: 699 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2000-10-10T09:17:13.000000Z K 7 svn:log V 48 Trivial bug with the function-key radio buttons K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d97074d8c97c9e30878c8861ec7c6324 Text-delta-base-sha1: 9ad7aab6b0ef4f1bf15f6e8dd7e653567c402c15 Text-content-length: 31 Text-content-md5: 7a7eb01499ca9b12f45c8ab533a4ca8e Text-content-sha1: d915a8f69aefce646b7598b5e6cfc413a8c95614 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVN .W3VT400 Revision-number: 700 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2000-10-10T10:50:14.000000Z K 7 svn:log V 40 Scroll regions of two lines are allowed K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 35a08e6af64151f355980fa2c65b5409 Text-delta-base-sha1: 140dd9ac74f6e44b04d97ed56430e6cd861e684e Text-content-length: 27 Text-content-md5: 83f3ad0ab06b2176290cc07af1815e98 Text-content-sha1: f145621009cece963318739a72ee74e092ac52ad Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN((  0 Revision-number: 701 Prop-content-length: 393 Content-length: 393 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-10T12:43:24.000000Z K 7 svn:log V 292 ISO8859-2 to CP852 output translation wants to have Win1250 to ISO8859-2 input translation as its counterpart, not CP852 to ISO8859-2. Because the reason you want this translation is if your _font_ is coded CP852 - in which case your keymap will not follow suit but will still be in Win1250. PROPS-END Node-path: putty/xlat.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f172a786f078ed61fad5bfdf9b40210d Text-delta-base-sha1: b486c602cf2fd3ad3be4e31492caef3aaa5ba1e1 Text-content-length: 72 Text-content-md5: 4178d5b019ecd30072d698c3c34383b3 Text-content-sha1: 5a026b287594c045905d92843af81b8d2c54294f Content-length: 111 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNR 3"K || cfg.xlat_88592cp852) return xlatWIN1250 Revision-number: 702 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2000-10-10T16:02:08.000000Z K 7 svn:log V 73 Turn off paste-as-poorman for line drawing chars until it's configurable K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 83f3ad0ab06b2176290cc07af1815e98 Text-delta-base-sha1: f145621009cece963318739a72ee74e092ac52ad Text-content-length: 197 Text-content-md5: c1793c6265a396addddc36d9d8410500 Text-content-sha1: c53aea7e059695d8f8ca801976397857277e34ed Content-length: 237 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN(: 98it7E<#if 0#endif int ch = (*q & CHAR_MASK); #if 0 if ((*q & ATTR_LINEDRW) && ch >= 0x60 && ch < 0x7F) else #endif #if 0 else #endif Revision-number: 703 Prop-content-length: 136 Content-length: 136 K 7 svn:log V 36 Add UNE 10053 to the cleartext ones K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-11T19:56:22.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c72db0455bed3b55f2baecd647185a31 Text-delta-base-sha1: 3ef6f081797573c1cc0105a5567a05a6cf0d8837 Text-content-length: 85 Text-content-md5: db91e579f8fe9aff3e2948366339cdb7 Text-content-sha1: 0e6878933b52436c0468fcfb7a4460df15a1392c Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVN> ;Q>case WSAECONNABORTED: sprintf(buf, "Connection aborted Revision-number: 704 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 Stop plink's key verification locking up on input K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-12T09:10:31.000000Z PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 16d5f90e6d193a345cfae5da273b5918 Text-delta-base-sha1: 50b7c3ad5b1e7f5948acd9fae34b3cb46cc02f41 Text-content-length: 649 Text-content-md5: d2d662afe4d877454dbcb97ec70085f8 Text-content-sha1: 45c864cb531a4df5d132fcab99cfd0b60f23fd38 Content-length: 689 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNtm]%Zh)pT HANDLE hin; DWORD savemode, i if (ret == 2) /* key was different */ fprintf(stderr, wrongmsg, fingerprint); if (ret == 1) hin = GetStdHandle(STD_INPUT_HANDLE); GetConsoleMode(hin, &savemode); SetConsoleMode(hin, (savemode | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT)); ReadFile(hin, line, sizeof(line)-1, &i, NULL); SetConsoleMode(hin, savemode); if (ret == 2) { /* key was different */ if (line[0] != '\0' && line[0] != '\rif (line[0] == 'y' || line[0] == 'Y' Revision-number: 705 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2000-10-12T09:10:45.000000Z K 7 svn:log V 41 Stop the SSH panel appearing in PuTTYtel K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7a7eb01499ca9b12f45c8ab533a4ca8e Text-delta-base-sha1: d915a8f69aefce646b7598b5e6cfc413a8c95614 Text-content-length: 73 Text-content-md5: 0a08d8fc133ea7530a993f2b10ad07f4 Text-content-sha1: 266fe301647f323d934b085d1199a92eeff5663c Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVN 2) fw if (backends[2].backend != NULL) Revision-number: 706 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2000-10-12T12:39:44.000000Z K 7 svn:log V 136 Add a config option to emulate the HMAC bug in commercial SSH v2.3.x and earlier (namely, it uses only 16 bytes of key rather than 20). K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1617fbdd6df15d453bbb96e87a5abbdb Text-delta-base-sha1: 23727b6c5512c36783c94bc63717949dc780f346 Text-content-length: 89 Text-content-md5: 2e9ee62e0a6e9c438a3598e2bf22619e Text-content-sha1: f67fb9772a6b25b472f1173f891a34f2507e9b39 Content-length: 129 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVNO C^C}Rbuggymac; /* MAC bug commmercial <=v2.3.x SSH2 Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c7184b5fd265f5f7e74ce31d9a37a0a3 Text-delta-base-sha1: 4abe0adaa5fff8332d848a7a195169229978800e Text-content-length: 92 Text-content-md5: ba4e68aa67a25235f9cfc9dd673b4896 Text-content-sha1: 0f82eb552918e71e4e91b4b366083de4ea2d301b Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNeRA 2 ?&i (sesskey, "BuggyMAC", cfg->buggymacBuggyMAC", 0, &cfg->buggymac Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 36bd1d1f1da6ccd462d7f8351d353e0b Text-delta-base-sha1: b4be75961d2760b57b48f69007b57e96637194b7 Text-content-length: 885 Text-content-md5: 79b48dba0353788a93643a6044e62040 Text-content-sha1: 68dcf01cb62aee9535bdf97899373c881025ebea Content-length: 925 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVNSM44);iFP)]@@<:@oOx"^x/4, ssh_sha1_buggyconst static struct ssh_mac *buggymacs[] = { &ssh_sha1_buggymac **maclist/* * Be prepared to work around the buggy MAC problem. */ if (cfg.buggymac) maclist = buggymacs; else maclist = macs;list); i++) { ssh2_pkt_addstring_str(maclist[i]->name); if (i < lenof(maclistserver->client MAC algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < lenof(maclist); i++) { ssh2_pkt_addstring_str(maclist[i]->name); if (i < lenof(maclistlist); i++) { if (in_commasep_string(maclist[i]->name, str, len)) { csmac_tobe = maclist[i]server->client mac */ for (i = 0; i < lenof(maclist); i++) { if (in_commasep_string(maclist[i]->name, str, len)) { scmac_tobe = maclist[i] Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 311a2970edbf34b358e950bb59f4bea2 Text-delta-base-sha1: b1080d30ae3672984101fa8017e92c4fe9afab74 Text-content-length: 229 Text-content-md5: f3c2b5689425ef30518c8bfec3dba35b Text-content-sha1: bfb503c25a3af867e4cbe5b5276639efd6ec9f36 Content-length: 268 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNqYC!yL<g HB/cskey_buggy(unsigned char *key) { sha1_key(&sha1_cs_mac_s1, &sha1_cs_mac_s2, key, 16); } static void sha1_sckey_bugg16 struct ssh_mac ssh_sha1_buggy = { sha1_cskey_buggy, sha1_sckey_bugg Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0a08d8fc133ea7530a993f2b10ad07f4 Text-delta-base-sha1: 266fe301647f323d934b085d1199a92eeff5663c Text-content-length: 251 Text-content-md5: 414539ea4e949d34e1216dc2b3f6c471 Text-content-sha1: 6f85cdd9eb543aa134bfcd8f371d149004b53ee0 Content-length: 291 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVN2)DKAm>fh(P>=uBUGGYMACBUGGYMAC, cfg.buggymac checkbox(&cp, "Imitate SSH 2 MAC bug in commercial <= v2.3.x", IDC_BUGGYMACBUGGYMAC cfg.buggymac = IsDlgButtonChecked (hwnd, IDC_BUGGYMAC Revision-number: 707 Prop-content-length: 231 Content-length: 231 K 8 svn:date V 27 2000-10-12T12:56:33.000000Z K 7 svn:log V 130 Implement a much more visually appealing, but much more internally grotty, hack to get around Explorer maximising the config box. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2e9ee62e0a6e9c438a3598e2bf22619e Text-delta-base-sha1: f67fb9772a6b25b472f1173f891a34f2507e9b39 Text-content-length: 44 Text-content-md5: ccba8937d18c0dfffc078712e25dea71 Text-content-sha1: 316962f54bf9b55b141dadc5458b61008177b622 Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN; =g7efuse_showwindow(void); Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 414539ea4e949d34e1216dc2b3f6c471 Text-delta-base-sha1: 6f85cdd9eb543aa134bfcd8f371d149004b53ee0 Text-content-length: 582 Text-content-md5: 3b69e35e5103eaa34e88edfbff680587 Text-content-sha1: 544307da343716064ceb6adee246f166de47dd5d Content-length: 622 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVNN" rv 0_ * Null dialog procedure. */ static int CALLBACK NullDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {efuse_showwindow(void) { /* * Work around the fact that the app's first call to ShowWindow * will ignore the default in favour of the shell-provided * setting. */ { HWND hwnd; hwnd = CreateDialog (hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, NullDlgProc); ShowWindow(hwnd, SW_HIDE); DestroyWindow(hwnd); } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: db91e579f8fe9aff3e2948366339cdb7 Text-delta-base-sha1: 0e6878933b52436c0468fcfb7a4460df15a1392c Text-content-length: 128 Text-content-md5: 32c37d915c32d76ec357aa1398c85001 Text-content-sha1: 117dd8401069c27fbc062e420446cf0afb951189 Content-length: 168 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVN ~ gQgFF Ensure a Maximize setting in Explorer doesn't maximise the * config box. */ defuse_showwindow Revision-number: 708 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2000-10-12T13:34:46.000000Z K 7 svn:log V 68 Miscellaneous fixes for better interoperation with commercial SSH 2 K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d2d662afe4d877454dbcb97ec70085f8 Text-delta-base-sha1: 45c864cb531a4df5d132fcab99cfd0b60f23fd38 Text-content-length: 170 Text-content-md5: 61ddff0a96ac8ee771befa5714748cf0 Text-content-sha1: 7fe3d03a2307f27e46cd9cb9e47ebbf6f5ab2425 Content-length: 210 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNm]I if (back->socket() == INVALID_SOCKET) break; /* we closed the connection */ } WSACleanup(); return 0; } Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79b48dba0353788a93643a6044e62040 Text-delta-base-sha1: 68dcf01cb62aee9535bdf97899373c881025ebea Text-content-length: 150 Text-content-md5: 4fec632f09a63f2741ec935b09840d76 Text-content-sha1: 63a7385602efaf2f132eabdd9bf10276413d849a Content-length: 190 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNpt~l2l8000 ssh_state = SSH_STATE_CLOSED; closesocket(s); s = INVALID_SOCKET Revision-number: 709 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2000-10-12T14:24:58.000000Z K 7 svn:log V 54 Implement MD5 MAC for the benefit of old SSH2 servers K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4fec632f09a63f2741ec935b09840d76 Text-delta-base-sha1: 63a7385602efaf2f132eabdd9bf10276413d849a Text-content-length: 473 Text-content-md5: ab479568acecc7042c6be7c0ba440f27 Text-content-sha1: 3a914afc1eb091097ee2a9cd8a785e9a4919aedd Content-length: 513 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNKE/*uC^OPHNU}U0yc7S7{md5, &ssh_sha1, &ssh_md5, &ssh_mac_none }; const static struct ssh_mac *buggymacs[] = { &ssh_sha1_buggy, &ssh_md5int nmacs, nmacs = lenof(buggymacs); else maclist = macs, nmacs = lenof(macs)nmacs; i++) { ssh2_pkt_addstring_str(maclist[i]->name); if (i < nmacsnmacs; i++) { ssh2_pkt_addstring_str(maclist[i]->name); if (i < nmacsnmacsnmacs Node-path: putty/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9ffec13db42df7d1e04690daca7e91dc Text-delta-base-sha1: 1a1f8cd1d29c93063ab14925e7f7ad8e397b9967 Text-content-length: 2254 Text-content-md5: 7f537391761b73d206e529ffc240ac46 Text-content-sha1: 78c233222238f1ef7eaac95cb97aaf5cc9b83632 Content-length: 2293 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN D; ; /* ---------------------------------------------------------------------- * The above is the MD5 algorithm itself. Now we implement the * HMAC wrapper on it. */ static struct MD5Context md5_cs_mac_s1, md5_cs_mac_s2; static struct MD5Context md5_sc_mac_s1, md5_sc_mac_s2; static void md5_key(struct MD5Context *s1, struct MD5Context *s2, unsigned char *key, int len) { unsigned char foo[64]; int i; memset(foo, 0x36, 64); for (i = 0; i < len && i < 64; i++) foo[i] ^= key[i]; MD5Init(s1); MD5Update(s1, foo, 64); memset(foo, 0x5C, 64); for (i = 0; i < len && i < 64; i++) foo[i] ^= key[i]; MD5Init(s2); MD5Update(s2, foo, 64); memset(foo, 0, 64); /* burn the evidence */ } static void md5_cskey(unsigned char *key) { md5_key(&md5_cs_mac_s1, &md5_cs_mac_s2, key, 16); } static void md5_sckey(unsigned char *key) { md5_key(&md5_sc_mac_s1, &md5_sc_mac_s2, key, 16); } static void md5_do_hmac(struct MD5Context *s1, struct MD5Context *s2, unsigned char *blk, int len, unsigned long seq, unsigned char *hmac) { struct MD5Context s; unsigned char intermediate[16]; intermediate[0] = (unsigned char)((seq >> 24) & 0xFF); intermediate[1] = (unsigned char)((seq >> 16) & 0xFF); intermediate[2] = (unsigned char)((seq >> 8) & 0xFF); intermediate[3] = (unsigned char)((seq ) & 0xFF); s = *s1; /* structure copy */ MD5Update(&s, intermediate, 4); MD5Update(&s, blk, len); MD5Final(intermediate, &s); s = *s2; /* structure copy */ MD5Update(&s, intermediate, 16); MD5Final(hmac, &s); } static void md5_generate(unsigned char *blk, int len, unsigned long seq) { md5_do_hmac(&md5_cs_mac_s1, &md5_cs_mac_s2, blk, len, seq, blk+len); } static int md5_verify(unsigned char *blk, int len, unsigned long seq) { unsigned char correct[16]; md5_do_hmac(&md5_sc_mac_s1, &md5_sc_mac_s2, blk, len, seq, correct); return !memcmp(correct, blk+len, 16); } struct ssh_mac ssh_md5 = { md5_cskey, md5_sckey, md5_generate, md5_verify, "hmac-md5", 16 }; Revision-number: 710 Prop-content-length: 155 Content-length: 155 K 7 svn:log V 55 Add an "Add Key" option to the systray menu in Pageant K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-12T15:26:40.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 24b48c4cc922a4c41776df2e1c338259 Text-delta-base-sha1: 188ecf462e079ad5d8c894862057861bbfa690de Text-content-length: 1067 Text-content-md5: 2d72ee8b6e1e81e348c8c7518028e16d Text-content-sha1: e12ec391e90f60d67c54010d330191cae75dcf58 Content-length: 1107 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNAC:c.C; Ju_T5#?lrV6 hYDDKEY 0x0030 #define IDM_ABOUT 0x004SetForegroundWindow(hwnd); SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);Prompt for a key file to add, and add it. */ static void prompt_add_keyfile(void) { OPENFILENAME of; char filename[FILENAME_MAX]; memset(&of, 0, sizeof(of)); #ifdef OPENFILENAME_SIZE_VERSION_400 of.lStructSize = OPENFILENAME_SIZE_VERSION_400; #else of.lStructSize = sizeof(of); #endif of.hwndOwner = hwnd; of.lpstrFilter = "All Files\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filename; *filename = '\0'; of.nMaxFile = sizeof(filename); of.lpstrFileTitle = NULL; of.lpstrInitialDir = NULL; of.lpstrTitle = "Select Private Key File"; of.Flags = 0; if (GetOpenFileName(&of)) { add_keyfile(filename); keylist_update(); }prompt_add_keyfile();DDKEY: prompt_add_keyfile();kDDKEY, "Add &Key Revision-number: 711 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2000-10-12T15:26:40.000000Z K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-50'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-0.50 Node-kind: dir Node-action: add Node-copyfrom-rev: 710 Node-copyfrom-path: putty Revision-number: 712 Prop-content-length: 232 Content-length: 232 K 7 svn:log V 131 RSA key generation routines, and the bignum enhancements required to support them. A key generation tool will be forthcoming soon. K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-18T15:00:36.000000Z PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 014dfd900686b65a728ca9a4c9ddfc79 Text-delta-base-sha1: d62b908838efb89c7382c3454b3a893af3dca280 Text-content-length: 912 Text-content-md5: af12cc6da7c6029c4072813c24e1c9c2 Text-content-sha1: 74e95b668d778ae3815ccccc704fa8696f129798 Content-length: 952 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNHiEY?p$,astruct RSAAux { Bignum p; Bignum q; Bignum iqmpBignum bignum_from_short(unsigned short nbignum_bit(Bignum bn, int i); void bignum_set_bit(Bignum bn, int i, int value); int ssh1_write_bignum(void *data, Bignum bn); Bignum biggcd(Bignum a, Bignum b); unsigned short bignum_mod_short(Bignum number, unsigned short modulus); Bignum bignum_add_long(Bignum number, unsigned long addend); Bignum bigmul(Bignum a, Bignum b); Bignum modinv(Bignum number, Bignum modulus); Bignum bignum_rshift(Bignum number, int shift /* * For progress updates in the key generation utility. */ typedef void (*progfn_t)(void *param, int phase, int progress); int rsa_generate(struct RSAKey *key, struct RSAAux *aux, int bits, progfn_t pfn, void *pfnparam); Bignum primegen(int bits, int modulus, int residue, int phase, progfn_t pfn, void *pfnparam); Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 523086374f20d6fe983b8213410720f3 Text-delta-base-sha1: 86ae5d6f47988c2a7bf977bc880d429d493547e5 Text-content-length: 9771 Text-content-md5: 8937a8935837e46c41d2c264c91ae81d Text-content-sha1: 88e38b0190f09a3d3cae061939c2e50c8b76d751 Content-length: 9810 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN6aw'6D@g|hEwLVp-Y9LMU2 DUin!zpYU2xK>_T2a:|binternal_mul(unsigned short *a, unsigned short *b, unsigned short *c, int len) { int i, j; unsigned long ai, t; for (j = 0; j < 2*len; j++) c[jstatic int internal_add_shifted(unsigned short *number, unsigned short n, int shift) { int word = 1 + (shift / 16); int bshift = shift % 16; unsigned long carry, addend; addend = n << bshift; while (addend) { addend += number[word]; number[word] = addend & 0xFFFF; addend >>= 16; word++; } } /* * Compute a = a % m. * Input in first alen words of a and first mlen words of m. * Output in first alen words of a * (of which first alen-mlen words will be zero). * The MSW of m MUST have its high bit set. * Quotient is accumulated in the `quotient' array, which is a Bignum * rather than the internal bigendian format. Quotient parts are shifted * left by `qshift' before adding into quot. */ static void internal_mod(unsigned short *a, int alen, unsigned short *m, int mlen, unsigned short *quot, int qshift) { unsigned short m0, m1; unsigned int h; int i, k; m0 = m[0]; if (mlen > 1) m1 = m[1]; else m1 = 0; for (i = 0; i <= alen-mlen; i++) { unsigned long t; unsigned int q, r, c, ai1; if (i == 0) { h = 0; } else { h = a[i-1]; a[i-1] = 0; } if (i == alen-1) ai1 = 0; else ai1 = a[i+1];i1i1) q--; } /* Subtract q * m from a[i...] */ c = 0; for (k = mmlen - 1; k >= 0; k--) { t += m[k]; t += a[i+k]; a[i+k] = (unsigned short)t; t = t >> 16; } q--; } if (quot) internal_add_shifted(quot, q, qshift + 16 * (alen-mlen-i));internal_mul(a + mlen, a + mlen, b, mlen); internal_mod(b, mlen*2, m, mlen, NULL, 0); if ((exp[exp[0] - i] & (1 << j)) != 0) { internal_mul(b + mlen, n, a, mlen); internal_mod(a, mlen*2, m, mlen, NULL, 0internal_mod(a, mlen*2, m, mlen, NULL, 0internal_mul(n, o, a, pqlen); internal_mod(a, pqlen*2, m, mlen, NULL, 0);internal_mod(a, pqlen*2, m, mlen, NULL, 0Compute p We optionally write out a quotient. */ void bigmod(Bignum p, Bignum mod, Bignum result, Bignum quotient) { unsigned short *n, *m; int mshift; int plen = p[0]; /* Ensure plen > mlen */ if (plen <= mlen) plen = mlen+1; /* Allocate n of size plen, copy p to n */ n = malloc(plen * sizeof(unsigned short)); for (j = 0; j < plen; j++) n[j] = 0; for (j = 1; j <= p[0]; j++) n[plen-j] = p[j]; /* Main computation */ internal_mod(n, plen, m, mlen, quotient, mshift);plen - mlen - 1; i < plen - 1; i++) n[i] = (n[i] << mshift) | (n[i+1] >> (16-mshift)); n[plen-1] = n[plen-1] << mshift; internal_mod(n, plen, m, mlen, quotient, 0); for (i = plen - 1; i >= plen - mlen; i--) n[i] = (n[i] >> mshift) | (n1; i <= result[0]; i++) { int j = plen-i; result[i] = j>=0 ? n[j] : 0; } /* Free temporary arrays */ for (i = 0; i < mlen; i++) m[i] = 0; free(m); for (i = 0; i < plen; i++) n[i] = 0; free(nReturn a bit from a bignum; 0 is least significant, etc. */ int bignum_bit(Bignum bn, int i) { if (i >= 16*bn[0]) return 0; /* beyond the end */ else return (bn[i/16+1] >> (i%16)) & 1; } /* * Set a bit in a bignum; 0 is least significant, etc. */ void bignum_set_bit(Bignum bn, int bitnum, int value) { if (bitnum >= 16*bn[0]) abort(); /* beyond the end */ else { int v = bitnum/16+1; int mask = 1 << (bitnum%16); if (value) bn[v] |= mask; else bn[v] &= ~mask; } /* * Compare two bignums. Returns like strcmp. */ int bignum_cmp(Bignum a, Bignum b) { int amax = a[0], bmax = b[0]; int i = (amax > bmax ? amax : bmax); while (i) { unsigned short aval = (i > amax ? 0 : a[i]); unsigned short bval = (i > bmax ? 0 : b[i]); if (aval < bval) return -1; if (aval > bval) return +1; i--; } return 0; } /* * Right-shift one bignum to form another. */ Bignum bignum_rshift(Bignum a, int shift) { Bignum ret; int i, shiftw, shiftb, shiftbb, bits; unsigned short ai, ai1; bits = ssh1_bignum_bitcount(a) - shift; ret = newbn((bits+15)/16); if (ret) { shiftw = shift / 16; shiftb = shift % 16; shiftbb = 16 - shiftb; ai1 = a[shiftw+1]; for (i = 1; i <= ret[0]; i++) { ai = ai1; ai1 = (i+shiftw+1 <= a[0] ? a[i+shiftw+1] : 0); ret[i] = ((ai >> shiftb) | (ai1 << shiftbb)) & 0xFFFF; } } return ret; } /* * Non-modular multiplication and addition. */ Bignum bigmuladd(Bignum a, Bignum b, Bignum addend) { int alen = a[0], blen = b[0]; int mlen = (alen > blen ? alen : blen); int rlen, i, maxspot; unsigned short *workspace; Bignum ret; /* mlen space for a, mlen space for b, 2*mlen for result */ workspace = malloc(mlen * 4 * sizeof(unsigned short)); for (i = 0; i < mlen; i++) { workspace[0*mlen + i] = (mlen-i <= a[0] ? a[mlen-i] : 0); workspace[1*mlen + i] = (mlen-i <= b[0] ? b[mlen-i] : 0); } internal_mul(workspace+0*mlen, workspace+1*mlen, workspace+2*mlen, mlen); /* now just copy the result back */ rlen = alen + blen + 1; if (addend && rlen <= addend[0]) rlen = addend[0] + 1; ret = newbn(rlen); maxspot = 0; for (i = 1; i <= ret[0]; i++) { ret[i] = (i <= 2*mlen ? workspace[4*mlen - i] : 0); if (ret[i] != 0) maxspot = i; } ret[0] = maxspot; /* now add in the addend, if any */ if (addend) { unsigned long carry = 0; for (i = 1; i <= rlen; i++) { carry += (i <= ret[0] ? ret[i] : 0); carry += (i <= addend[0] ? addend[i] : 0); ret[i] = carry & 0xFFFF; carry >>= 16; if (ret[i] != 0 && i > maxspot) maxspot = i; } } ret[0] = maxspot; return ret; } /* * Non-modular multiplication. */ Bignum bigmul(Bignum a, Bignum b) { return bigmuladd(a, b, NULL); } /* * Convert a (max 16-bit) short into a bignum. */ Bignum bignum_from_short(unsigned short n) { Bignum ret; ret = newbn(2); ret[1] = n & 0xFFFF; ret[2] = (n >> 16) & 0xFFFF; ret[0] = (ret[2] ? 2 : 1); return ret; } /* * Add a long to a bignum. */ Bignum bignum_add_long(Bignum number, unsigned long addend) { Bignum ret = newbn(number[0]+1); int i, maxspot = 0; unsigned long carry = 0; for (i = 1; i <= ret[0]; i++) { carry += addend & 0xFFFF; carry += (i <= number[0] ? number[i] : 0); addend >>= 16; ret[i] = carry & 0xFFFF; carry >>= 16; if (ret[i] != 0) maxspot = i; } ret[0] = maxspot; return ret; } /* * Compute the residue of a bignum, modulo a (max 16-bit) short. */ unsigned short bignum_mod_short(Bignum number, unsigned short modulus) { Bignum ret; unsigned long mod, r; int i; r = 0; mod = modulus; for (i = number[0]; i > 0; i--) r = (r * 65536 + number[i]) % mod; return r; } static void diagbn(char *prefix, Bignum md) { int i, nibbles, morenibbles; static const char hex[] = "0123456789ABCDEF"; printf("%s0x", prefix ? prefix : ""); nibbles = (3 + ssh1_bignum_bitcount(md))/4; if (nibbles<1) nibbles=1; morenibbles = 4*md[0] - nibbles; for (i=0; i> (4*(i%2))) & 0xF]); if (prefix) putchar('\n'); } /* * Greatest common divisor. */ Bignum biggcd(Bignum av, Bignum bv) { Bignum a = copybn(av); Bignum b = copybn(bv); diagbn("a = ", a); diagbn("b = ", b); while (bignum_cmp(b, Zero) != 0) { Bignum t = newbn(b[0]); bigmod(a, b, t, NULL); diagbn("t = ", t); while (t[0] > 1 && t[t[0]] == 0) t[0]--; freebn(a); a = b; b = t; } freebn(b); return a; } /* * Modular inverse, using Euclid's extended algorithm. */ Bignum modinv(Bignum number, Bignum modulus) { Bignum a = copybn(modulus); Bignum b = copybn(number); Bignum xp = copybn(Zero); Bignum x = copybn(One); int sign = +1; while (bignum_cmp(b, One) != 0) { Bignum t = newbn(b[0]); Bignum q = newbn(a[0]); bigmod(a, b, t, q); while (t[0] > 1 && t[t[0]] == 0) t[0]--; freebn(a); a = b; b = t; t = xp; xp = x; x = bigmuladd(q, xp, t); sign = -sign; freebn(t); } freebn(b); freebn(a); freebn(xp); /* now we know that sign * x == 1, and that x < modulus */ if (sign < 0) { /* set a new x to be modulus - x */ Bignum newx = newbn(modulus[0]); unsigned short carry = 0; int maxspot = 1; int i; for (i = 1; i <= newx[0]; i++) { unsigned short aword = (i <= modulus[0] ? modulus[i] : 0); unsigned short bword = (i <= x[0] ? x[i] : 0); newx[i] = aword - bword - carry; bword = ~bword; carry = carry ? (newx[i] >= bword) : (newx[i] > bword); if (newx[i] != 0) maxspot = i; } newx[0] = maxspot; freebn(x); x = newx; } /* and return. */ return x; } Node-path: putty/sshprime.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 45038 Text-content-md5: 856fe1055ee11164f67ef33c43910134 Text-content-sha1: b88785d9797a136ba6c2848a1bb820b182863bc8 Content-length: 45154 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN]]]/* * Prime generation. */ #include "ssh.h" /* * The first few odd primes. * * import sys * def sieve(n): * z = [] * list = [] * for i in range(n): z.append(1) * for i in range(2,n): * if z[i]: * list.append(i) * for j in range(i,n,i): z[j] = 0 * return list * list = sieve(65535) * for i in list[1:]: sys.stdout.write("%d," % i) */ static const unsigned short primes[] = { 3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101, 103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193, 197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293, 307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409, 419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521, 523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641, 643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757, 761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881, 883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009, 1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093, 1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201, 1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297, 1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427, 1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499, 1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607, 1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709, 1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823, 1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933, 1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039, 2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141, 2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269, 2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371, 2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467, 2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609, 2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699, 2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797, 2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909, 2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037, 3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169, 3181,3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299, 3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389, 3391,3407,3413,3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517, 3527,3529,3533,3539,3541,3547,3557,3559,3571,3581,3583,3593,3607,3613, 3617,3623,3631,3637,3643,3659,3671,3673,3677,3691,3697,3701,3709,3719, 3727,3733,3739,3761,3767,3769,3779,3793,3797,3803,3821,3823,3833,3847, 3851,3853,3863,3877,3881,3889,3907,3911,3917,3919,3923,3929,3931,3943, 3947,3967,3989,4001,4003,4007,4013,4019,4021,4027,4049,4051,4057,4073, 4079,4091,4093,4099,4111,4127,4129,4133,4139,4153,4157,4159,4177,4201, 4211,4217,4219,4229,4231,4241,4243,4253,4259,4261,4271,4273,4283,4289, 4297,4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,4421,4423,4441, 4447,4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,4547,4549, 4561,4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,4663, 4673,4679,4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793, 4799,4801,4813,4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933, 4937,4943,4951,4957,4967,4969,4973,4987,4993,4999,5003,5009,5011,5021, 5023,5039,5051,5059,5077,5081,5087,5099,5101,5107,5113,5119,5147,5153, 5167,5171,5179,5189,5197,5209,5227,5231,5233,5237,5261,5273,5279,5281, 5297,5303,5309,5323,5333,5347,5351,5381,5387,5393,5399,5407,5413,5417, 5419,5431,5437,5441,5443,5449,5471,5477,5479,5483,5501,5503,5507,5519, 5521,5527,5531,5557,5563,5569,5573,5581,5591,5623,5639,5641,5647,5651, 5653,5657,5659,5669,5683,5689,5693,5701,5711,5717,5737,5741,5743,5749, 5779,5783,5791,5801,5807,5813,5821,5827,5839,5843,5849,5851,5857,5861, 5867,5869,5879,5881,5897,5903,5923,5927,5939,5953,5981,5987,6007,6011, 6029,6037,6043,6047,6053,6067,6073,6079,6089,6091,6101,6113,6121,6131, 6133,6143,6151,6163,6173,6197,6199,6203,6211,6217,6221,6229,6247,6257, 6263,6269,6271,6277,6287,6299,6301,6311,6317,6323,6329,6337,6343,6353, 6359,6361,6367,6373,6379,6389,6397,6421,6427,6449,6451,6469,6473,6481, 6491,6521,6529,6547,6551,6553,6563,6569,6571,6577,6581,6599,6607,6619, 6637,6653,6659,6661,6673,6679,6689,6691,6701,6703,6709,6719,6733,6737, 6761,6763,6779,6781,6791,6793,6803,6823,6827,6829,6833,6841,6857,6863, 6869,6871,6883,6899,6907,6911,6917,6947,6949,6959,6961,6967,6971,6977, 6983,6991,6997,7001,7013,7019,7027,7039,7043,7057,7069,7079,7103,7109, 7121,7127,7129,7151,7159,7177,7187,7193,7207,7211,7213,7219,7229,7237, 7243,7247,7253,7283,7297,7307,7309,7321,7331,7333,7349,7351,7369,7393, 7411,7417,7433,7451,7457,7459,7477,7481,7487,7489,7499,7507,7517,7523, 7529,7537,7541,7547,7549,7559,7561,7573,7577,7583,7589,7591,7603,7607, 7621,7639,7643,7649,7669,7673,7681,7687,7691,7699,7703,7717,7723,7727, 7741,7753,7757,7759,7789,7793,7817,7823,7829,7841,7853,7867,7873,7877, 7879,7883,7901,7907,7919,7927,7933,7937,7949,7951,7963,7993,8009,8011, 8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111,8117,8123,8147, 8161,8167,8171,8179,8191,8209,8219,8221,8231,8233,8237,8243,8263,8269, 8273,8287,8291,8293,8297,8311,8317,8329,8353,8363,8369,8377,8387,8389, 8419,8423,8429,8431,8443,8447,8461,8467,8501,8513,8521,8527,8537,8539, 8543,8563,8573,8581,8597,8599,8609,8623,8627,8629,8641,8647,8663,8669, 8677,8681,8689,8693,8699,8707,8713,8719,8731,8737,8741,8747,8753,8761, 8779,8783,8803,8807,8819,8821,8831,8837,8839,8849,8861,8863,8867,8887, 8893,8923,8929,8933,8941,8951,8963,8969,8971,8999,9001,9007,9011,9013, 9029,9041,9043,9049,9059,9067,9091,9103,9109,9127,9133,9137,9151,9157, 9161,9173,9181,9187,9199,9203,9209,9221,9227,9239,9241,9257,9277,9281, 9283,9293,9311,9319,9323,9337,9341,9343,9349,9371,9377,9391,9397,9403, 9413,9419,9421,9431,9433,9437,9439,9461,9463,9467,9473,9479,9491,9497, 9511,9521,9533,9539,9547,9551,9587,9601,9613,9619,9623,9629,9631,9643, 9649,9661,9677,9679,9689,9697,9719,9721,9733,9739,9743,9749,9767,9769, 9781,9787,9791,9803,9811,9817,9829,9833,9839,9851,9857,9859,9871,9883, 9887,9901,9907,9923,9929,9931,9941,9949,9967,9973,10007,10009,10037, 10039,10061,10067,10069,10079,10091,10093,10099,10103,10111,10133,10139, 10141,10151,10159,10163,10169,10177,10181,10193,10211,10223,10243,10247, 10253,10259,10267,10271,10273,10289,10301,10303,10313,10321,10331,10333, 10337,10343,10357,10369,10391,10399,10427,10429,10433,10453,10457,10459, 10463,10477,10487,10499,10501,10513,10529,10531,10559,10567,10589,10597, 10601,10607,10613,10627,10631,10639,10651,10657,10663,10667,10687,10691, 10709,10711,10723,10729,10733,10739,10753,10771,10781,10789,10799,10831, 10837,10847,10853,10859,10861,10867,10883,10889,10891,10903,10909,10937, 10939,10949,10957,10973,10979,10987,10993,11003,11027,11047,11057,11059, 11069,11071,11083,11087,11093,11113,11117,11119,11131,11149,11159,11161, 11171,11173,11177,11197,11213,11239,11243,11251,11257,11261,11273,11279, 11287,11299,11311,11317,11321,11329,11351,11353,11369,11383,11393,11399, 11411,11423,11437,11443,11447,11467,11471,11483,11489,11491,11497,11503, 11519,11527,11549,11551,11579,11587,11593,11597,11617,11621,11633,11657, 11677,11681,11689,11699,11701,11717,11719,11731,11743,11777,11779,11783, 11789,11801,11807,11813,11821,11827,11831,11833,11839,11863,11867,11887, 11897,11903,11909,11923,11927,11933,11939,11941,11953,11959,11969,11971, 11981,11987,12007,12011,12037,12041,12043,12049,12071,12073,12097,12101, 12107,12109,12113,12119,12143,12149,12157,12161,12163,12197,12203,12211, 12227,12239,12241,12251,12253,12263,12269,12277,12281,12289,12301,12323, 12329,12343,12347,12373,12377,12379,12391,12401,12409,12413,12421,12433, 12437,12451,12457,12473,12479,12487,12491,12497,12503,12511,12517,12527, 12539,12541,12547,12553,12569,12577,12583,12589,12601,12611,12613,12619, 12637,12641,12647,12653,12659,12671,12689,12697,12703,12713,12721,12739, 12743,12757,12763,12781,12791,12799,12809,12821,12823,12829,12841,12853, 12889,12893,12899,12907,12911,12917,12919,12923,12941,12953,12959,12967, 12973,12979,12983,13001,13003,13007,13009,13033,13037,13043,13049,13063, 13093,13099,13103,13109,13121,13127,13147,13151,13159,13163,13171,13177, 13183,13187,13217,13219,13229,13241,13249,13259,13267,13291,13297,13309, 13313,13327,13331,13337,13339,13367,13381,13397,13399,13411,13417,13421, 13441,13451,13457,13463,13469,13477,13487,13499,13513,13523,13537,13553, 13567,13577,13591,13597,13613,13619,13627,13633,13649,13669,13679,13681, 13687,13691,13693,13697,13709,13711,13721,13723,13729,13751,13757,13759, 13763,13781,13789,13799,13807,13829,13831,13841,13859,13873,13877,13879, 13883,13901,13903,13907,13913,13921,13931,13933,13963,13967,13997,13999, 14009,14011,14029,14033,14051,14057,14071,14081,14083,14087,14107,14143, 14149,14153,14159,14173,14177,14197,14207,14221,14243,14249,14251,14281, 14293,14303,14321,14323,14327,14341,14347,14369,14387,14389,14401,14407, 14411,14419,14423,14431,14437,14447,14449,14461,14479,14489,14503,14519, 14533,14537,14543,14549,14551,14557,14561,14563,14591,14593,14621,14627, 14629,14633,14639,14653,14657,14669,14683,14699,14713,14717,14723,14731, 14737,14741,14747,14753,14759,14767,14771,14779,14783,14797,14813,14821, 14827,14831,14843,14851,14867,14869,14879,14887,14891,14897,14923,14929, 14939,14947,14951,14957,14969,14983,15013,15017,15031,15053,15061,15073, 15077,15083,15091,15101,15107,15121,15131,15137,15139,15149,15161,15173, 15187,15193,15199,15217,15227,15233,15241,15259,15263,15269,15271,15277, 15287,15289,15299,15307,15313,15319,15329,15331,15349,15359,15361,15373, 15377,15383,15391,15401,15413,15427,15439,15443,15451,15461,15467,15473, 15493,15497,15511,15527,15541,15551,15559,15569,15581,15583,15601,15607, 15619,15629,15641,15643,15647,15649,15661,15667,15671,15679,15683,15727, 15731,15733,15737,15739,15749,15761,15767,15773,15787,15791,15797,15803, 15809,15817,15823,15859,15877,15881,15887,15889,15901,15907,15913,15919, 15923,15937,15959,15971,15973,15991,16001,16007,16033,16057,16061,16063, 16067,16069,16073,16087,16091,16097,16103,16111,16127,16139,16141,16183, 16187,16189,16193,16217,16223,16229,16231,16249,16253,16267,16273,16301, 16319,16333,16339,16349,16361,16363,16369,16381,16411,16417,16421,16427, 16433,16447,16451,16453,16477,16481,16487,16493,16519,16529,16547,16553, 16561,16567,16573,16603,16607,16619,16631,16633,16649,16651,16657,16661, 16673,16691,16693,16699,16703,16729,16741,16747,16759,16763,16787,16811, 16823,16829,16831,16843,16871,16879,16883,16889,16901,16903,16921,16927, 16931,16937,16943,16963,16979,16981,16987,16993,17011,17021,17027,17029, 17033,17041,17047,17053,17077,17093,17099,17107,17117,17123,17137,17159, 17167,17183,17189,17191,17203,17207,17209,17231,17239,17257,17291,17293, 17299,17317,17321,17327,17333,17341,17351,17359,17377,17383,17387,17389, 17393,17401,17417,17419,17431,17443,17449,17467,17471,17477,17483,17489, 17491,17497,17509,17519,17539,17551,17569,17573,17579,17581,17597,17599, 17609,17623,17627,17657,17659,17669,17681,17683,17707,17713,17729,17737, 17747,17749,17761,17783,17789,17791,17807,17827,17837,17839,17851,17863, 17881,17891,17903,17909,17911,17921,17923,17929,17939,17957,17959,17971, 17977,17981,17987,17989,18013,18041,18043,18047,18049,18059,18061,18077, 18089,18097,18119,18121,18127,18131,18133,18143,18149,18169,18181,18191, 18199,18211,18217,18223,18229,18233,18251,18253,18257,18269,18287,18289, 18301,18307,18311,18313,18329,18341,18353,18367,18371,18379,18397,18401, 18413,18427,18433,18439,18443,18451,18457,18461,18481,18493,18503,18517, 18521,18523,18539,18541,18553,18583,18587,18593,18617,18637,18661,18671, 18679,18691,18701,18713,18719,18731,18743,18749,18757,18773,18787,18793, 18797,18803,18839,18859,18869,18899,18911,18913,18917,18919,18947,18959, 18973,18979,19001,19009,19013,19031,19037,19051,19069,19073,19079,19081, 19087,19121,19139,19141,19157,19163,19181,19183,19207,19211,19213,19219, 19231,19237,19249,19259,19267,19273,19289,19301,19309,19319,19333,19373, 19379,19381,19387,19391,19403,19417,19421,19423,19427,19429,19433,19441, 19447,19457,19463,19469,19471,19477,19483,19489,19501,19507,19531,19541, 19543,19553,19559,19571,19577,19583,19597,19603,19609,19661,19681,19687, 19697,19699,19709,19717,19727,19739,19751,19753,19759,19763,19777,19793, 19801,19813,19819,19841,19843,19853,19861,19867,19889,19891,19913,19919, 19927,19937,19949,19961,19963,19973,19979,19991,19993,19997,20011,20021, 20023,20029,20047,20051,20063,20071,20089,20101,20107,20113,20117,20123, 20129,20143,20147,20149,20161,20173,20177,20183,20201,20219,20231,20233, 20249,20261,20269,20287,20297,20323,20327,20333,20341,20347,20353,20357, 20359,20369,20389,20393,20399,20407,20411,20431,20441,20443,20477,20479, 20483,20507,20509,20521,20533,20543,20549,20551,20563,20593,20599,20611, 20627,20639,20641,20663,20681,20693,20707,20717,20719,20731,20743,20747, 20749,20753,20759,20771,20773,20789,20807,20809,20849,20857,20873,20879, 20887,20897,20899,20903,20921,20929,20939,20947,20959,20963,20981,20983, 21001,21011,21013,21017,21019,21023,21031,21059,21061,21067,21089,21101, 21107,21121,21139,21143,21149,21157,21163,21169,21179,21187,21191,21193, 21211,21221,21227,21247,21269,21277,21283,21313,21317,21319,21323,21341, 21347,21377,21379,21383,21391,21397,21401,21407,21419,21433,21467,21481, 21487,21491,21493,21499,21503,21517,21521,21523,21529,21557,21559,21563, 21569,21577,21587,21589,21599,21601,21611,21613,21617,21647,21649,21661, 21673,21683,21701,21713,21727,21737,21739,21751,21757,21767,21773,21787, 21799,21803,21817,21821,21839,21841,21851,21859,21863,21871,21881,21893, 21911,21929,21937,21943,21961,21977,21991,21997,22003,22013,22027,22031, 22037,22039,22051,22063,22067,22073,22079,22091,22093,22109,22111,22123, 22129,22133,22147,22153,22157,22159,22171,22189,22193,22229,22247,22259, 22271,22273,22277,22279,22283,22291,22303,22307,22343,22349,22367,22369, 22381,22391,22397,22409,22433,22441,22447,22453,22469,22481,22483,22501, 22511,22531,22541,22543,22549,22567,22571,22573,22613,22619,22621,22637, 22639,22643,22651,22669,22679,22691,22697,22699,22709,22717,22721,22727, 22739,22741,22751,22769,22777,22783,22787,22807,22811,22817,22853,22859, 22861,22871,22877,22901,22907,22921,22937,22943,22961,22963,22973,22993, 23003,23011,23017,23021,23027,23029,23039,23041,23053,23057,23059,23063, 23071,23081,23087,23099,23117,23131,23143,23159,23167,23173,23189,23197, 23201,23203,23209,23227,23251,23269,23279,23291,23293,23297,23311,23321, 23327,23333,23339,23357,23369,23371,23399,23417,23431,23447,23459,23473, 23497,23509,23531,23537,23539,23549,23557,23561,23563,23567,23581,23593, 23599,23603,23609,23623,23627,23629,23633,23663,23669,23671,23677,23687, 23689,23719,23741,23743,23747,23753,23761,23767,23773,23789,23801,23813, 23819,23827,23831,23833,23857,23869,23873,23879,23887,23893,23899,23909, 23911,23917,23929,23957,23971,23977,23981,23993,24001,24007,24019,24023, 24029,24043,24049,24061,24071,24077,24083,24091,24097,24103,24107,24109, 24113,24121,24133,24137,24151,24169,24179,24181,24197,24203,24223,24229, 24239,24247,24251,24281,24317,24329,24337,24359,24371,24373,24379,24391, 24407,24413,24419,24421,24439,24443,24469,24473,24481,24499,24509,24517, 24527,24533,24547,24551,24571,24593,24611,24623,24631,24659,24671,24677, 24683,24691,24697,24709,24733,24749,24763,24767,24781,24793,24799,24809, 24821,24841,24847,24851,24859,24877,24889,24907,24917,24919,24923,24943, 24953,24967,24971,24977,24979,24989,25013,25031,25033,25037,25057,25073, 25087,25097,25111,25117,25121,25127,25147,25153,25163,25169,25171,25183, 25189,25219,25229,25237,25243,25247,25253,25261,25301,25303,25307,25309, 25321,25339,25343,25349,25357,25367,25373,25391,25409,25411,25423,25439, 25447,25453,25457,25463,25469,25471,25523,25537,25541,25561,25577,25579, 25583,25589,25601,25603,25609,25621,25633,25639,25643,25657,25667,25673, 25679,25693,25703,25717,25733,25741,25747,25759,25763,25771,25793,25799, 25801,25819,25841,25847,25849,25867,25873,25889,25903,25913,25919,25931, 25933,25939,25943,25951,25969,25981,25997,25999,26003,26017,26021,26029, 26041,26053,26083,26099,26107,26111,26113,26119,26141,26153,26161,26171, 26177,26183,26189,26203,26209,26227,26237,26249,26251,26261,26263,26267, 26293,26297,26309,26317,26321,26339,26347,26357,26371,26387,26393,26399, 26407,26417,26423,26431,26437,26449,26459,26479,26489,26497,26501,26513, 26539,26557,26561,26573,26591,26597,26627,26633,26641,26647,26669,26681, 26683,26687,26693,26699,26701,26711,26713,26717,26723,26729,26731,26737, 26759,26777,26783,26801,26813,26821,26833,26839,26849,26861,26863,26879, 26881,26891,26893,26903,26921,26927,26947,26951,26953,26959,26981,26987, 26993,27011,27017,27031,27043,27059,27061,27067,27073,27077,27091,27103, 27107,27109,27127,27143,27179,27191,27197,27211,27239,27241,27253,27259, 27271,27277,27281,27283,27299,27329,27337,27361,27367,27397,27407,27409, 27427,27431,27437,27449,27457,27479,27481,27487,27509,27527,27529,27539, 27541,27551,27581,27583,27611,27617,27631,27647,27653,27673,27689,27691, 27697,27701,27733,27737,27739,27743,27749,27751,27763,27767,27773,27779, 27791,27793,27799,27803,27809,27817,27823,27827,27847,27851,27883,27893, 27901,27917,27919,27941,27943,27947,27953,27961,27967,27983,27997,28001, 28019,28027,28031,28051,28057,28069,28081,28087,28097,28099,28109,28111, 28123,28151,28163,28181,28183,28201,28211,28219,28229,28277,28279,28283, 28289,28297,28307,28309,28319,28349,28351,28387,28393,28403,28409,28411, 28429,28433,28439,28447,28463,28477,28493,28499,28513,28517,28537,28541, 28547,28549,28559,28571,28573,28579,28591,28597,28603,28607,28619,28621, 28627,28631,28643,28649,28657,28661,28663,28669,28687,28697,28703,28711, 28723,28729,28751,28753,28759,28771,28789,28793,28807,28813,28817,28837, 28843,28859,28867,28871,28879,28901,28909,28921,28927,28933,28949,28961, 28979,29009,29017,29021,29023,29027,29033,29059,29063,29077,29101,29123, 29129,29131,29137,29147,29153,29167,29173,29179,29191,29201,29207,29209, 29221,29231,29243,29251,29269,29287,29297,29303,29311,29327,29333,29339, 29347,29363,29383,29387,29389,29399,29401,29411,29423,29429,29437,29443, 29453,29473,29483,29501,29527,29531,29537,29567,29569,29573,29581,29587, 29599,29611,29629,29633,29641,29663,29669,29671,29683,29717,29723,29741, 29753,29759,29761,29789,29803,29819,29833,29837,29851,29863,29867,29873, 29879,29881,29917,29921,29927,29947,29959,29983,29989,30011,30013,30029, 30047,30059,30071,30089,30091,30097,30103,30109,30113,30119,30133,30137, 30139,30161,30169,30181,30187,30197,30203,30211,30223,30241,30253,30259, 30269,30271,30293,30307,30313,30319,30323,30341,30347,30367,30389,30391, 30403,30427,30431,30449,30467,30469,30491,30493,30497,30509,30517,30529, 30539,30553,30557,30559,30577,30593,30631,30637,30643,30649,30661,30671, 30677,30689,30697,30703,30707,30713,30727,30757,30763,30773,30781,30803, 30809,30817,30829,30839,30841,30851,30853,30859,30869,30871,30881,30893, 30911,30931,30937,30941,30949,30971,30977,30983,31013,31019,31033,31039, 31051,31063,31069,31079,31081,31091,31121,31123,31139,31147,31151,31153, 31159,31177,31181,31183,31189,31193,31219,31223,31231,31237,31247,31249, 31253,31259,31267,31271,31277,31307,31319,31321,31327,31333,31337,31357, 31379,31387,31391,31393,31397,31469,31477,31481,31489,31511,31513,31517, 31531,31541,31543,31547,31567,31573,31583,31601,31607,31627,31643,31649, 31657,31663,31667,31687,31699,31721,31723,31727,31729,31741,31751,31769, 31771,31793,31799,31817,31847,31849,31859,31873,31883,31891,31907,31957, 31963,31973,31981,31991,32003,32009,32027,32029,32051,32057,32059,32063, 32069,32077,32083,32089,32099,32117,32119,32141,32143,32159,32173,32183, 32189,32191,32203,32213,32233,32237,32251,32257,32261,32297,32299,32303, 32309,32321,32323,32327,32341,32353,32359,32363,32369,32371,32377,32381, 32401,32411,32413,32423,32429,32441,32443,32467,32479,32491,32497,32503, 32507,32531,32533,32537,32561,32563,32569,32573,32579,32587,32603,32609, 32611,32621,32633,32647,32653,32687,32693,32707,32713,32717,32719,32749, 32771,32779,32783,32789,32797,32801,32803,32831,32833,32839,32843,32869, 32887,32909,32911,32917,32933,32939,32941,32957,32969,32971,32983,32987, 32993,32999,33013,33023,33029,33037,33049,33053,33071,33073,33083,33091, 33107,33113,33119,33149,33151,33161,33179,33181,33191,33199,33203,33211, 33223,33247,33287,33289,33301,33311,33317,33329,33331,33343,33347,33349, 33353,33359,33377,33391,33403,33409,33413,33427,33457,33461,33469,33479, 33487,33493,33503,33521,33529,33533,33547,33563,33569,33577,33581,33587, 33589,33599,33601,33613,33617,33619,33623,33629,33637,33641,33647,33679, 33703,33713,33721,33739,33749,33751,33757,33767,33769,33773,33791,33797, 33809,33811,33827,33829,33851,33857,33863,33871,33889,33893,33911,33923, 33931,33937,33941,33961,33967,33997,34019,34031,34033,34039,34057,34061, 34123,34127,34129,34141,34147,34157,34159,34171,34183,34211,34213,34217, 34231,34253,34259,34261,34267,34273,34283,34297,34301,34303,34313,34319, 34327,34337,34351,34361,34367,34369,34381,34403,34421,34429,34439,34457, 34469,34471,34483,34487,34499,34501,34511,34513,34519,34537,34543,34549, 34583,34589,34591,34603,34607,34613,34631,34649,34651,34667,34673,34679, 34687,34693,34703,34721,34729,34739,34747,34757,34759,34763,34781,34807, 34819,34841,34843,34847,34849,34871,34877,34883,34897,34913,34919,34939, 34949,34961,34963,34981,35023,35027,35051,35053,35059,35069,35081,35083, 35089,35099,35107,35111,35117,35129,35141,35149,35153,35159,35171,35201, 35221,35227,35251,35257,35267,35279,35281,35291,35311,35317,35323,35327, 35339,35353,35363,35381,35393,35401,35407,35419,35423,35437,35447,35449, 35461,35491,35507,35509,35521,35527,35531,35533,35537,35543,35569,35573, 35591,35593,35597,35603,35617,35671,35677,35729,35731,35747,35753,35759, 35771,35797,35801,35803,35809,35831,35837,35839,35851,35863,35869,35879, 35897,35899,35911,35923,35933,35951,35963,35969,35977,35983,35993,35999, 36007,36011,36013,36017,36037,36061,36067,36073,36083,36097,36107,36109, 36131,36137,36151,36161,36187,36191,36209,36217,36229,36241,36251,36263, 36269,36277,36293,36299,36307,36313,36319,36341,36343,36353,36373,36383, 36389,36433,36451,36457,36467,36469,36473,36479,36493,36497,36523,36527, 36529,36541,36551,36559,36563,36571,36583,36587,36599,36607,36629,36637, 36643,36653,36671,36677,36683,36691,36697,36709,36713,36721,36739,36749, 36761,36767,36779,36781,36787,36791,36793,36809,36821,36833,36847,36857, 36871,36877,36887,36899,36901,36913,36919,36923,36929,36931,36943,36947, 36973,36979,36997,37003,37013,37019,37021,37039,37049,37057,37061,37087, 37097,37117,37123,37139,37159,37171,37181,37189,37199,37201,37217,37223, 37243,37253,37273,37277,37307,37309,37313,37321,37337,37339,37357,37361, 37363,37369,37379,37397,37409,37423,37441,37447,37463,37483,37489,37493, 37501,37507,37511,37517,37529,37537,37547,37549,37561,37567,37571,37573, 37579,37589,37591,37607,37619,37633,37643,37649,37657,37663,37691,37693, 37699,37717,37747,37781,37783,37799,37811,37813,37831,37847,37853,37861, 37871,37879,37889,37897,37907,37951,37957,37963,37967,37987,37991,37993, 37997,38011,38039,38047,38053,38069,38083,38113,38119,38149,38153,38167, 38177,38183,38189,38197,38201,38219,38231,38237,38239,38261,38273,38281, 38287,38299,38303,38317,38321,38327,38329,38333,38351,38371,38377,38393, 38431,38447,38449,38453,38459,38461,38501,38543,38557,38561,38567,38569, 38593,38603,38609,38611,38629,38639,38651,38653,38669,38671,38677,38693, 38699,38707,38711,38713,38723,38729,38737,38747,38749,38767,38783,38791, 38803,38821,38833,38839,38851,38861,38867,38873,38891,38903,38917,38921, 38923,38933,38953,38959,38971,38977,38993,39019,39023,39041,39043,39047, 39079,39089,39097,39103,39107,39113,39119,39133,39139,39157,39161,39163, 39181,39191,39199,39209,39217,39227,39229,39233,39239,39241,39251,39293, 39301,39313,39317,39323,39341,39343,39359,39367,39371,39373,39383,39397, 39409,39419,39439,39443,39451,39461,39499,39503,39509,39511,39521,39541, 39551,39563,39569,39581,39607,39619,39623,39631,39659,39667,39671,39679, 39703,39709,39719,39727,39733,39749,39761,39769,39779,39791,39799,39821, 39827,39829,39839,39841,39847,39857,39863,39869,39877,39883,39887,39901, 39929,39937,39953,39971,39979,39983,39989,40009,40013,40031,40037,40039, 40063,40087,40093,40099,40111,40123,40127,40129,40151,40153,40163,40169, 40177,40189,40193,40213,40231,40237,40241,40253,40277,40283,40289,40343, 40351,40357,40361,40387,40423,40427,40429,40433,40459,40471,40483,40487, 40493,40499,40507,40519,40529,40531,40543,40559,40577,40583,40591,40597, 40609,40627,40637,40639,40693,40697,40699,40709,40739,40751,40759,40763, 40771,40787,40801,40813,40819,40823,40829,40841,40847,40849,40853,40867, 40879,40883,40897,40903,40927,40933,40939,40949,40961,40973,40993,41011, 41017,41023,41039,41047,41051,41057,41077,41081,41113,41117,41131,41141, 41143,41149,41161,41177,41179,41183,41189,41201,41203,41213,41221,41227, 41231,41233,41243,41257,41263,41269,41281,41299,41333,41341,41351,41357, 41381,41387,41389,41399,41411,41413,41443,41453,41467,41479,41491,41507, 41513,41519,41521,41539,41543,41549,41579,41593,41597,41603,41609,41611, 41617,41621,41627,41641,41647,41651,41659,41669,41681,41687,41719,41729, 41737,41759,41761,41771,41777,41801,41809,41813,41843,41849,41851,41863, 41879,41887,41893,41897,41903,41911,41927,41941,41947,41953,41957,41959, 41969,41981,41983,41999,42013,42017,42019,42023,42043,42061,42071,42073, 42083,42089,42101,42131,42139,42157,42169,42179,42181,42187,42193,42197, 42209,42221,42223,42227,42239,42257,42281,42283,42293,42299,42307,42323, 42331,42337,42349,42359,42373,42379,42391,42397,42403,42407,42409,42433, 42437,42443,42451,42457,42461,42463,42467,42473,42487,42491,42499,42509, 42533,42557,42569,42571,42577,42589,42611,42641,42643,42649,42667,42677, 42683,42689,42697,42701,42703,42709,42719,42727,42737,42743,42751,42767, 42773,42787,42793,42797,42821,42829,42839,42841,42853,42859,42863,42899, 42901,42923,42929,42937,42943,42953,42961,42967,42979,42989,43003,43013, 43019,43037,43049,43051,43063,43067,43093,43103,43117,43133,43151,43159, 43177,43189,43201,43207,43223,43237,43261,43271,43283,43291,43313,43319, 43321,43331,43391,43397,43399,43403,43411,43427,43441,43451,43457,43481, 43487,43499,43517,43541,43543,43573,43577,43579,43591,43597,43607,43609, 43613,43627,43633,43649,43651,43661,43669,43691,43711,43717,43721,43753, 43759,43777,43781,43783,43787,43789,43793,43801,43853,43867,43889,43891, 43913,43933,43943,43951,43961,43963,43969,43973,43987,43991,43997,44017, 44021,44027,44029,44041,44053,44059,44071,44087,44089,44101,44111,44119, 44123,44129,44131,44159,44171,44179,44189,44201,44203,44207,44221,44249, 44257,44263,44267,44269,44273,44279,44281,44293,44351,44357,44371,44381, 44383,44389,44417,44449,44453,44483,44491,44497,44501,44507,44519,44531, 44533,44537,44543,44549,44563,44579,44587,44617,44621,44623,44633,44641, 44647,44651,44657,44683,44687,44699,44701,44711,44729,44741,44753,44771, 44773,44777,44789,44797,44809,44819,44839,44843,44851,44867,44879,44887, 44893,44909,44917,44927,44939,44953,44959,44963,44971,44983,44987,45007, 45013,45053,45061,45077,45083,45119,45121,45127,45131,45137,45139,45161, 45179,45181,45191,45197,45233,45247,45259,45263,45281,45289,45293,45307, 45317,45319,45329,45337,45341,45343,45361,45377,45389,45403,45413,45427, 45433,45439,45481,45491,45497,45503,45523,45533,45541,45553,45557,45569, 45587,45589,45599,45613,45631,45641,45659,45667,45673,45677,45691,45697, 45707,45737,45751,45757,45763,45767,45779,45817,45821,45823,45827,45833, 45841,45853,45863,45869,45887,45893,45943,45949,45953,45959,45971,45979, 45989,46021,46027,46049,46051,46061,46073,46091,46093,46099,46103,46133, 46141,46147,46153,46171,46181,46183,46187,46199,46219,46229,46237,46261, 46271,46273,46279,46301,46307,46309,46327,46337,46349,46351,46381,46399, 46411,46439,46441,46447,46451,46457,46471,46477,46489,46499,46507,46511, 46523,46549,46559,46567,46573,46589,46591,46601,46619,46633,46639,46643, 46649,46663,46679,46681,46687,46691,46703,46723,46727,46747,46751,46757, 46769,46771,46807,46811,46817,46819,46829,46831,46853,46861,46867,46877, 46889,46901,46919,46933,46957,46993,46997,47017,47041,47051,47057,47059, 47087,47093,47111,47119,47123,47129,47137,47143,47147,47149,47161,47189, 47207,47221,47237,47251,47269,47279,47287,47293,47297,47303,47309,47317, 47339,47351,47353,47363,47381,47387,47389,47407,47417,47419,47431,47441, 47459,47491,47497,47501,47507,47513,47521,47527,47533,47543,47563,47569, 47581,47591,47599,47609,47623,47629,47639,47653,47657,47659,47681,47699, 47701,47711,47713,47717,47737,47741,47743,47777,47779,47791,47797,47807, 47809,47819,47837,47843,47857,47869,47881,47903,47911,47917,47933,47939, 47947,47951,47963,47969,47977,47981,48017,48023,48029,48049,48073,48079, 48091,48109,48119,48121,48131,48157,48163,48179,48187,48193,48197,48221, 48239,48247,48259,48271,48281,48299,48311,48313,48337,48341,48353,48371, 48383,48397,48407,48409,48413,48437,48449,48463,48473,48479,48481,48487, 48491,48497,48523,48527,48533,48539,48541,48563,48571,48589,48593,48611, 48619,48623,48647,48649,48661,48673,48677,48679,48731,48733,48751,48757, 48761,48767,48779,48781,48787,48799,48809,48817,48821,48823,48847,48857, 48859,48869,48871,48883,48889,48907,48947,48953,48973,48989,48991,49003, 49009,49019,49031,49033,49037,49043,49057,49069,49081,49103,49109,49117, 49121,49123,49139,49157,49169,49171,49177,49193,49199,49201,49207,49211, 49223,49253,49261,49277,49279,49297,49307,49331,49333,49339,49363,49367, 49369,49391,49393,49409,49411,49417,49429,49433,49451,49459,49463,49477, 49481,49499,49523,49529,49531,49537,49547,49549,49559,49597,49603,49613, 49627,49633,49639,49663,49667,49669,49681,49697,49711,49727,49739,49741, 49747,49757,49783,49787,49789,49801,49807,49811,49823,49831,49843,49853, 49871,49877,49891,49919,49921,49927,49937,49939,49943,49957,49991,49993, 49999,50021,50023,50033,50047,50051,50053,50069,50077,50087,50093,50101, 50111,50119,50123,50129,50131,50147,50153,50159,50177,50207,50221,50227, 50231,50261,50263,50273,50287,50291,50311,50321,50329,50333,50341,50359, 50363,50377,50383,50387,50411,50417,50423,50441,50459,50461,50497,50503, 50513,50527,50539,50543,50549,50551,50581,50587,50591,50593,50599,50627, 50647,50651,50671,50683,50707,50723,50741,50753,50767,50773,50777,50789, 50821,50833,50839,50849,50857,50867,50873,50891,50893,50909,50923,50929, 50951,50957,50969,50971,50989,50993,51001,51031,51043,51047,51059,51061, 51071,51109,51131,51133,51137,51151,51157,51169,51193,51197,51199,51203, 51217,51229,51239,51241,51257,51263,51283,51287,51307,51329,51341,51343, 51347,51349,51361,51383,51407,51413,51419,51421,51427,51431,51437,51439, 51449,51461,51473,51479,51481,51487,51503,51511,51517,51521,51539,51551, 51563,51577,51581,51593,51599,51607,51613,51631,51637,51647,51659,51673, 51679,51683,51691,51713,51719,51721,51749,51767,51769,51787,51797,51803, 51817,51827,51829,51839,51853,51859,51869,51871,51893,51899,51907,51913, 51929,51941,51949,51971,51973,51977,51991,52009,52021,52027,52051,52057, 52067,52069,52081,52103,52121,52127,52147,52153,52163,52177,52181,52183, 52189,52201,52223,52237,52249,52253,52259,52267,52289,52291,52301,52313, 52321,52361,52363,52369,52379,52387,52391,52433,52453,52457,52489,52501, 52511,52517,52529,52541,52543,52553,52561,52567,52571,52579,52583,52609, 52627,52631,52639,52667,52673,52691,52697,52709,52711,52721,52727,52733, 52747,52757,52769,52783,52807,52813,52817,52837,52859,52861,52879,52883, 52889,52901,52903,52919,52937,52951,52957,52963,52967,52973,52981,52999, 53003,53017,53047,53051,53069,53077,53087,53089,53093,53101,53113,53117, 53129,53147,53149,53161,53171,53173,53189,53197,53201,53231,53233,53239, 53267,53269,53279,53281,53299,53309,53323,53327,53353,53359,53377,53381, 53401,53407,53411,53419,53437,53441,53453,53479,53503,53507,53527,53549, 53551,53569,53591,53593,53597,53609,53611,53617,53623,53629,53633,53639, 53653,53657,53681,53693,53699,53717,53719,53731,53759,53773,53777,53783, 53791,53813,53819,53831,53849,53857,53861,53881,53887,53891,53897,53899, 53917,53923,53927,53939,53951,53959,53987,53993,54001,54011,54013,54037, 54049,54059,54083,54091,54101,54121,54133,54139,54151,54163,54167,54181, 54193,54217,54251,54269,54277,54287,54293,54311,54319,54323,54331,54347, 54361,54367,54371,54377,54401,54403,54409,54413,54419,54421,54437,54443, 54449,54469,54493,54497,54499,54503,54517,54521,54539,54541,54547,54559, 54563,54577,54581,54583,54601,54617,54623,54629,54631,54647,54667,54673, 54679,54709,54713,54721,54727,54751,54767,54773,54779,54787,54799,54829, 54833,54851,54869,54877,54881,54907,54917,54919,54941,54949,54959,54973, 54979,54983,55001,55009,55021,55049,55051,55057,55061,55073,55079,55103, 55109,55117,55127,55147,55163,55171,55201,55207,55213,55217,55219,55229, 55243,55249,55259,55291,55313,55331,55333,55337,55339,55343,55351,55373, 55381,55399,55411,55439,55441,55457,55469,55487,55501,55511,55529,55541, 55547,55579,55589,55603,55609,55619,55621,55631,55633,55639,55661,55663, 55667,55673,55681,55691,55697,55711,55717,55721,55733,55763,55787,55793, 55799,55807,55813,55817,55819,55823,55829,55837,55843,55849,55871,55889, 55897,55901,55903,55921,55927,55931,55933,55949,55967,55987,55997,56003, 56009,56039,56041,56053,56081,56087,56093,56099,56101,56113,56123,56131, 56149,56167,56171,56179,56197,56207,56209,56237,56239,56249,56263,56267, 56269,56299,56311,56333,56359,56369,56377,56383,56393,56401,56417,56431, 56437,56443,56453,56467,56473,56477,56479,56489,56501,56503,56509,56519, 56527,56531,56533,56543,56569,56591,56597,56599,56611,56629,56633,56659, 56663,56671,56681,56687,56701,56711,56713,56731,56737,56747,56767,56773, 56779,56783,56807,56809,56813,56821,56827,56843,56857,56873,56891,56893, 56897,56909,56911,56921,56923,56929,56941,56951,56957,56963,56983,56989, 56993,56999,57037,57041,57047,57059,57073,57077,57089,57097,57107,57119, 57131,57139,57143,57149,57163,57173,57179,57191,57193,57203,57221,57223, 57241,57251,57259,57269,57271,57283,57287,57301,57329,57331,57347,57349, 57367,57373,57383,57389,57397,57413,57427,57457,57467,57487,57493,57503, 57527,57529,57557,57559,57571,57587,57593,57601,57637,57641,57649,57653, 57667,57679,57689,57697,57709,57713,57719,57727,57731,57737,57751,57773, 57781,57787,57791,57793,57803,57809,57829,57839,57847,57853,57859,57881, 57899,57901,57917,57923,57943,57947,57973,57977,57991,58013,58027,58031, 58043,58049,58057,58061,58067,58073,58099,58109,58111,58129,58147,58151, 58153,58169,58171,58189,58193,58199,58207,58211,58217,58229,58231,58237, 58243,58271,58309,58313,58321,58337,58363,58367,58369,58379,58391,58393, 58403,58411,58417,58427,58439,58441,58451,58453,58477,58481,58511,58537, 58543,58549,58567,58573,58579,58601,58603,58613,58631,58657,58661,58679, 58687,58693,58699,58711,58727,58733,58741,58757,58763,58771,58787,58789, 58831,58889,58897,58901,58907,58909,58913,58921,58937,58943,58963,58967, 58979,58991,58997,59009,59011,59021,59023,59029,59051,59053,59063,59069, 59077,59083,59093,59107,59113,59119,59123,59141,59149,59159,59167,59183, 59197,59207,59209,59219,59221,59233,59239,59243,59263,59273,59281,59333, 59341,59351,59357,59359,59369,59377,59387,59393,59399,59407,59417,59419, 59441,59443,59447,59453,59467,59471,59473,59497,59509,59513,59539,59557, 59561,59567,59581,59611,59617,59621,59627,59629,59651,59659,59663,59669, 59671,59693,59699,59707,59723,59729,59743,59747,59753,59771,59779,59791, 59797,59809,59833,59863,59879,59887,59921,59929,59951,59957,59971,59981, 59999,60013,60017,60029,60037,60041,60077,60083,60089,60091,60101,60103, 60107,60127,60133,60139,60149,60161,60167,60169,60209,60217,60223,60251, 60257,60259,60271,60289,60293,60317,60331,60337,60343,60353,60373,60383, 60397,60413,60427,60443,60449,60457,60493,60497,60509,60521,60527,60539, 60589,60601,60607,60611,60617,60623,60631,60637,60647,60649,60659,60661, 60679,60689,60703,60719,60727,60733,60737,60757,60761,60763,60773,60779, 60793,60811,60821,60859,60869,60887,60889,60899,60901,60913,60917,60919, 60923,60937,60943,60953,60961,61001,61007,61027,61031,61043,61051,61057, 61091,61099,61121,61129,61141,61151,61153,61169,61211,61223,61231,61253, 61261,61283,61291,61297,61331,61333,61339,61343,61357,61363,61379,61381, 61403,61409,61417,61441,61463,61469,61471,61483,61487,61493,61507,61511, 61519,61543,61547,61553,61559,61561,61583,61603,61609,61613,61627,61631, 61637,61643,61651,61657,61667,61673,61681,61687,61703,61717,61723,61729, 61751,61757,61781,61813,61819,61837,61843,61861,61871,61879,61909,61927, 61933,61949,61961,61967,61979,61981,61987,61991,62003,62011,62017,62039, 62047,62053,62057,62071,62081,62099,62119,62129,62131,62137,62141,62143, 62171,62189,62191,62201,62207,62213,62219,62233,62273,62297,62299,62303, 62311,62323,62327,62347,62351,62383,62401,62417,62423,62459,62467,62473, 62477,62483,62497,62501,62507,62533,62539,62549,62563,62581,62591,62597, 62603,62617,62627,62633,62639,62653,62659,62683,62687,62701,62723,62731, 62743,62753,62761,62773,62791,62801,62819,62827,62851,62861,62869,62873, 62897,62903,62921,62927,62929,62939,62969,62971,62981,62983,62987,62989, 63029,63031,63059,63067,63073,63079,63097,63103,63113,63127,63131,63149, 63179,63197,63199,63211,63241,63247,63277,63281,63299,63311,63313,63317, 63331,63337,63347,63353,63361,63367,63377,63389,63391,63397,63409,63419, 63421,63439,63443,63463,63467,63473,63487,63493,63499,63521,63527,63533, 63541,63559,63577,63587,63589,63599,63601,63607,63611,63617,63629,63647, 63649,63659,63667,63671,63689,63691,63697,63703,63709,63719,63727,63737, 63743,63761,63773,63781,63793,63799,63803,63809,63823,63839,63841,63853, 63857,63863,63901,63907,63913,63929,63949,63977,63997,64007,64013,64019, 64033,64037,64063,64067,64081,64091,64109,64123,64151,64153,64157,64171, 64187,64189,64217,64223,64231,64237,64271,64279,64283,64301,64303,64319, 64327,64333,64373,64381,64399,64403,64433,64439,64451,64453,64483,64489, 64499,64513,64553,64567,64577,64579,64591,64601,64609,64613,64621,64627, 64633,64661,64663,64667,64679,64693,64709,64717,64747,64763,64781,64783, 64793,64811,64817,64849,64853,64871,64877,64879,64891,64901,64919,64921, 64927,64937,64951,64969,64997,65003,65011,65027,65029,65033,65053,65063, 65071,65089,65099,65101,65111,65119,65123,65129,65141,65147,65167,65171, 65173,65179,65183,65203,65213,65239,65257,65267,65269,65287,65293,65309, 65323,65327,65353,65357,65371,65381,65393,65407,65413,65419,65423,65437, 65447,65449,65479,65497,65519,65521, }; #define NPRIMES (sizeof(primes) / sizeof(*primes)) /* * Generate a prime. We arrange to select a prime with the property * (prime % modulus) != residue (to speed up use in RSA). */ Bignum primegen(int bits, int modulus, int residue, int phase, progfn_t pfn, void *pfnparam) { int i, k, v, byte, bitsleft, check, checks; unsigned long delta, moduli[NPRIMES+1], residues[NPRIMES+1]; Bignum p, q, wqp, wqp2; int progress = 0; byte = 0; bitsleft = 0; STARTOVER: pfn(pfnparam, phase, ++progress); /* * Generate a k-bit random number with top and bottom bits set. */ p = newbn((bits+15)/16); for (i = 0; i < bits; i++) { if (i == 0 || i == bits-1) v = 1; else { if (bitsleft <= 0) bitsleft = 8; byte = random_byte(); v = byte & 1; byte >>= 1; bitsleft--; } bignum_set_bit(p, i, v); } /* * Ensure this random number is coprime to the first few * primes, by repeatedly adding 2 to it until it is. */ for (i = 0; i < NPRIMES; i++) { moduli[i] = primes[i]; residues[i] = bignum_mod_short(p, primes[i]); } moduli[NPRIMES] = modulus; residues[NPRIMES] = bignum_mod_short(p, modulus) + modulus - residue; delta = 0; while (1) { for (i = 0; i < (sizeof(moduli) / sizeof(*moduli)); i++) if (!((residues[i] + delta) % moduli[i])) break; if (i < (sizeof(moduli) / sizeof(*moduli))) {/* we broke */ delta += 2; if (delta < 2) { freebn(p); goto STARTOVER; } continue; } break; } q = p; p = bignum_add_long(q, delta); freebn(q); /* * Now apply the Fermat primality test a few times. First work * out how many checks are needed. */ checks = 27; if (bits >= 150) checks = 18; if (bits >= 200) checks = 15; if (bits >= 250) checks = 12; if (bits >= 300) checks = 9; if (bits >= 350) checks = 8; if (bits >= 400) checks = 7; if (bits >= 450) checks = 6; if (bits >= 550) checks = 5; if (bits >= 650) checks = 4; if (bits >= 850) checks = 3; if (bits >= 1300) checks = 2; /* * Next, write p-1 as q*2^k. */ for (k = 0; bignum_bit(p, k) == !k; k++); /* find first 1 bit in p-1 */ q = bignum_rshift(p, k); /* * Now, for each check ... */ for (check = 0; check < checks; check++) { Bignum w; /* * Invent a random number between 1 and p-1 inclusive. */ while (1) { w = newbn((bits+15)/16); for (i = 0; i < bits; i++) { if (bitsleft <= 0) bitsleft = 8; byte = random_byte(); v = byte & 1; byte >>= 1; bitsleft--; bignum_set_bit(w, i, v); } if (bignum_cmp(w, p) >= 0 || bignum_cmp(w, Zero) == 0) { freebn(w); continue; } break; } pfn(pfnparam, phase, ++progress); /* * Compute w^q mod p. */ wqp = newbn(p[0]); modpow(w, q, p, wqp); freebn(w); /* * See if this is 1, or if it becomes 1 when squared at * most k times. */ if (bignum_cmp(wqp, One) == 0) { freebn(wqp); continue; } for (i = 0; i < k; i++) { wqp2 = newbn(p[0]); modmul(wqp, wqp, p, wqp2); freebn(wqp); wqp = wqp2; if (bignum_cmp(wqp, One) == 0) break; } if (i < k) { freebn(wqp); continue; } /* * It didn't. Therefore, w is a witness for the * compositeness of p. */ freebn(p); freebn(q); goto STARTOVER; } /* * We have a prime! */ freebn(q); return p; } Node-path: putty/sshrsag.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3930 Text-content-md5: 35747a5e5642ee8b5979586d6915903c Text-content-sha1: 0cade8c8907e3e43e4bcf60fd7244d291ab8c71d Content-length: 4046 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNLLL/* * RSA key generation. */ #include "ssh.h" #define RSA_EXPONENT 37 /* we like this prime */ static void diagbn(char *prefix, Bignum md) { int i, nibbles, morenibbles; static const char hex[] = "0123456789ABCDEF"; printf("%s0x", prefix ? prefix : ""); nibbles = (3 + ssh1_bignum_bitcount(md))/4; if (nibbles<1) nibbles=1; morenibbles = 4*md[0] - nibbles; for (i=0; i> (4*(i%2))) & 0xF]); if (prefix) putchar('\n'); } int rsa_generate(struct RSAKey *key, struct RSAAux *aux, int bits, progfn_t pfn, void *pfnparam) { Bignum pm1, qm1, phi_n; /* * Set up the phase limits for the progress report. We do this * by passing minus the phase number. * * For prime generation: our initial filter finds things * coprime to everything below 2^16. Computing the product of * (p-1)/p for all prime p below 2^16 gives about 20.33; so * among B-bit integers, one in every 20.33 will get through * the initial filter to be a candidate prime. * * Meanwhile, we are searching for primes in the region of 2^B; * since pi(x) ~ x/log(x), when x is in the region of 2^B, the * prime density will be d/dx pi(x) ~ 1/log(B), i.e. about * 1/0.6931B. So the chance of any given candidate being prime * is 20.33/0.6931B, which is roughly 29.34 divided by B. * * So now we have this probability P, we're looking at an * exponential distribution with parameter P: we will manage in * one attempt with probability P, in two with probability * P(1-P), in three with probability P(1-P)^2, etc. The * probability that we have still not managed to find a prime * after N attempts is (1-P)^N. * * We therefore inform the progress indicator of the number B * (29.34/B), so that it knows how much to increment by each * time. We do this in 16-bit fixed point, so 29.34 becomes * 0x1D.57C4. */ pfn(pfnparam, -1, -0x1D57C4/(bits/2)); pfn(pfnparam, -2, -0x1D57C4/(bits-bits/2)); pfn(pfnparam, -3, 5); /* * We don't generate e; we just use a standard one always. */ key->exponent = bignum_from_short(RSA_EXPONENT); diagbn("e = ",key->exponent); /* * Generate p and q: primes with combined length `bits', not * congruent to 1 modulo e. (Strictly speaking, we wanted (p-1) * and e to be coprime, and (q-1) and e to be coprime, but in * general that's slightly more fiddly to arrange. By choosing * a prime e, we can simplify the criterion.) */ aux->p = primegen(bits/2, RSA_EXPONENT, 1, 1, pfn, pfnparam); aux->q = primegen(bits - bits/2, RSA_EXPONENT, 1, 2, pfn, pfnparam); /* * Ensure p > q, by swapping them if not. */ if (bignum_cmp(aux->p, aux->q) < 0) { Bignum t = aux->p; aux->p = aux->q; aux->q = t; } /* * Now we have p, q and e. All we need to do now is work out * the other helpful quantities: n=pq, d=e^-1 mod (p-1)(q-1), * and (q^-1 mod p). */ pfn(pfnparam, 3, 1); key->modulus = bigmul(aux->p, aux->q); pfn(pfnparam, 3, 2); pm1 = copybn(aux->p); decbn(pm1); qm1 = copybn(aux->q); decbn(qm1); phi_n = bigmul(pm1, qm1); pfn(pfnparam, 3, 3); freebn(pm1); freebn(qm1); diagbn("p = ", aux->p); diagbn("q = ", aux->q); diagbn("e = ", key->exponent); diagbn("n = ", key->modulus); diagbn("phi(n) = ", phi_n); key->private_exponent = modinv(key->exponent, phi_n); pfn(pfnparam, 3, 4); diagbn("d = ", key->private_exponent); aux->iqmp = modinv(aux->q, aux->p); pfn(pfnparam, 3, 5); diagbn("iqmp = ", aux->iqmp); /* * Clean up temporary numbers. */ freebn(phi_n); return 1; } Revision-number: 713 Prop-content-length: 149 Content-length: 149 K 7 svn:log V 49 Add some more commented-out diagnostics for ssh1 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-18T15:33:05.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ab479568acecc7042c6be7c0ba440f27 Text-delta-base-sha1: 3a914afc1eb091097ee2a9cd8a785e9a4919aedd Text-content-length: 234 Text-content-md5: 5f1efebb2bac60ed1bd7e39c6bded4a4 Text-content-sha1: 99f011bd4681022230bb151eeb93e107537b4309 Content-length: 274 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNKM>"hl}a'V]7C#if 0 debug(("Got packet len=%d pad=%d\r\n", st->len, st->pad)); for (st->i = 0; st->i < st->big#if 0 debug(("Sending packet len=%d\r\n", biglen+4)); for (i = 0; i < biglen+4 Revision-number: 714 Prop-content-length: 277 Content-length: 277 K 8 svn:date V 27 2000-10-18T15:36:32.000000Z K 7 svn:log V 176 Miscellaneous cleanups and reorgs in preparation for building PuTTYgen. In particular, moved self-managing controls stuff out of windlg.c into the new and reusable winctrls.c. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3d227021645f12d16b8dbb8223e9fab Text-delta-base-sha1: 1cde5b87e678e30174ec858bb2deb7ba20990384 Text-content-length: 200 Text-content-md5: 0f76d8016c9401efa8cc34d8563ab90d Text-content-sha1: 9f2dba62e00513af27643e66723615fa6be35774 Content-length: 240 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN#}'uv$JRl<YBwinctrls winstuff.h windlg.$(OBJ): windlg.c putty.h ssh.h win_res.h winstuff.h winctrls.$(OBJ): winctrls.c winstuff.h winstuff winstuff winstuff winstuff Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 61ddff0a96ac8ee771befa5714748cf0 Text-delta-base-sha1: 7fe3d03a2307f27e46cd9cb9e47ebbf6f5ab2425 Text-content-length: 32 Text-content-md5: 9f36ab828223f7faa2428a4515c4c193 Text-content-sha1: de69f8b0c5a049b71f42ced92796b97c1f294cc2 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN]s [winstuff Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ccba8937d18c0dfffc078712e25dea71 Text-delta-base-sha1: 316962f54bf9b55b141dadc5458b61008177b622 Text-content-length: 30 Text-content-md5: 3bc11840ac48bd1d5b3d87a4b5c5d51c Text-content-sha1: 45a4a8ebfbfd1051f1e2062281ca24406dfb6243 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN;3;void Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a75661e876c8bb37c41083b6d5cfc436 Text-delta-base-sha1: 24ae8d9ac2b8c59e2481a59ebbdb17bb3ad44a1d Text-content-length: 32 Text-content-md5: 384039420a5e4b2d40fa677237c3c0ca Text-content-sha1: 468fe3e2fb7821793ca951d446bab728c092b97b Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNs n`winstuff Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8201f475375e314cb3d60ab94a7476e2 Text-delta-base-sha1: 9deadf93c0a534c0c2da91fabd8e0b3d327db26e Text-content-length: 53 Text-content-md5: a15965e45b7624f04ff7587afc8319b2 Text-content-sha1: 7e2bc706af970bb7c7b2f246d61618c72c304899 Content-length: 92 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN-9^Z_{M`#include "winstuffhh Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: af12cc6da7c6029c4072813c24e1c9c2 Text-delta-base-sha1: 74e95b668d778ae3815ccccc704fa8696f129798 Text-content-length: 54 Text-content-md5: 804b5aa99956cf9f980777e8c37ecc90 Text-content-sha1: 2aa8c4a52784b795ea9eb6679512d1f4186084c7 Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN7 !}int bignum_cmp(Bignum a, Bignum b Node-path: putty/sshrsag.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 35747a5e5642ee8b5979586d6915903c Text-delta-base-sha1: 0cade8c8907e3e43e4bcf60fd7244d291ab8c71d Text-content-length: 257 Text-content-md5: ecccd62a87dd85c21077b5a4c608d92f Text-content-sha1: 6484b67644b2fcec9caa1884775dcdd43615767b Content-length: 296 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNLZrGKqW;G4 Zr#if 0 /* bignum diagnostic function */#endifkey->private_exponent = modinv(key->exponent, phi_n); pfn(pfnparam, 3, 4); aux->iqmp = modinv(aux->q, aux->p); pfn(pfnparam, 3, 5 Node-path: putty/winctrls.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 20069 Text-content-md5: eaf48601e850674453ddcb88c7369d36 Text-content-sha1: d73b9e85301a2b5fe960320b9aefb76e3314ab82 Content-length: 20185 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNTTT/* * winctrls.c: routines to self-manage the controls in a dialog * box. */ #include #include "winstuff.h" #define GAPBETWEEN 3 #define GAPWITHIN 1 #define GAPXBOX 7 #define GAPYBOX 4 #define DLGWIDTH 168 #define STATICHEIGHT 8 #define CHECKBOXHEIGHT 8 #define RADIOHEIGHT 8 #define EDITHEIGHT 12 #define COMBOHEIGHT 12 #define PUSHBTNHEIGHT 14 void ctlposinit(struct ctlpos *cp, HWND hwnd, int leftborder, int rightborder, int topborder) { RECT r, r2; cp->hwnd = hwnd; cp->font = SendMessage(hwnd, WM_GETFONT, 0, 0); cp->ypos = topborder; GetClientRect(hwnd, &r); r2.left = r2.top = 0; r2.right = 4; r2.bottom = 8; MapDialogRect(hwnd, &r2); cp->dlu4inpix = r2.right; cp->width = (r.right * 4) / (r2.right) - 2*GAPBETWEEN; cp->xoff = leftborder; cp->width -= leftborder + rightborder; } void doctl(struct ctlpos *cp, RECT r, char *wclass, int wstyle, int exstyle, char *wtext, int wid) { HWND ctl; /* * Note nonstandard use of RECT. This is deliberate: by * transforming the width and height directly we arrange to * have all supposedly same-sized controls really same-sized. */ r.left += cp->xoff; MapDialogRect(cp->hwnd, &r); ctl = CreateWindowEx(exstyle, wclass, wtext, wstyle, r.left, r.top, r.right, r.bottom, cp->hwnd, (HMENU)wid, hinst, NULL); SendMessage(ctl, WM_SETFONT, cp->font, MAKELPARAM(TRUE, 0)); } /* * A title bar across the top of a sub-dialog. */ void bartitle(struct ctlpos *cp, char *name, int id) { RECT r; r.left = GAPBETWEEN; r.right = cp->width; r.top = cp->ypos; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPBETWEEN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, name, id); } /* * Begin a grouping box, with or without a group title. */ void beginbox(struct ctlpos *cp, char *name, int idbox, int idtext) { if (name) cp->ypos += STATICHEIGHT/2; cp->boxystart = cp->ypos; if (name) cp->ypos += STATICHEIGHT - (STATICHEIGHT/2); cp->ypos += GAPYBOX; cp->width -= 2*GAPXBOX; cp->xoff += GAPXBOX; cp->boxid = idbox; cp->boxtextid = idtext; cp->boxtext = name; } /* * End a grouping box. */ void endbox(struct ctlpos *cp) { RECT r; cp->xoff -= GAPXBOX; cp->width += 2*GAPXBOX; cp->ypos += GAPYBOX - GAPBETWEEN; r.left = GAPBETWEEN; r.right = cp->width; r.top = cp->boxystart; r.bottom = cp->ypos - cp->boxystart; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_ETCHEDFRAME, 0, "", cp->boxid); if (cp->boxtext) { SIZE s; HDC hdc; HFONT oldfont, dlgfont; hdc = GetDC(cp->hwnd); dlgfont = (HFONT)cp->font; oldfont = SelectObject(hdc, dlgfont); GetTextExtentPoint32(hdc, cp->boxtext, strlen(cp->boxtext), &s); SelectObject(hdc, oldfont); DeleteDC(hdc); r.left = GAPXBOX + GAPBETWEEN; r.right = (s.cx * 4 + cp->dlu4inpix-1) / cp->dlu4inpix; r.top = cp->boxystart - STATICHEIGHT/2; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, cp->boxtext, cp->boxtextid); } cp->ypos += GAPYBOX; } /* * Some edit boxes. Each one has a static above it. The percentages * of the horizontal space are provided. */ void multiedit(struct ctlpos *cp, ...) { RECT r; va_list ap; int percent, xpos; percent = xpos = 0; va_start(ap, cp); while (1) { char *text; int staticid, editid, pcwidth; text = va_arg(ap, char *); if (!text) break; staticid = va_arg(ap, int); editid = va_arg(ap, int); pcwidth = va_arg(ap, int); r.left = xpos + GAPBETWEEN; percent += pcwidth; xpos = (cp->width + GAPBETWEEN) * percent / 100; r.right = xpos - r.left; r.top = cp->ypos; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid); r.top = cp->ypos + 8 + GAPWITHIN; r.bottom = EDITHEIGHT; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", editid); } va_end(ap); cp->ypos += 8+GAPWITHIN+12+GAPBETWEEN; } /* * A set of radio buttons on the same line, with a static above * them. `nacross' dictates how many parts the line is divided into * (you might want this not to equal the number of buttons if you * needed to line up some 2s and some 3s to look good in the same * panel). */ void radioline(struct ctlpos *cp, char *text, int id, int nacross, ...) { RECT r; va_list ap; int group; int i; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id); va_start(ap, nacross); group = WS_GROUP; i = 0; while (1) { char *btext; int bid; btext = va_arg(ap, char *); if (!btext) break; bid = va_arg(ap, int); r.left = GAPBETWEEN + i * (cp->width+GAPBETWEEN)/nacross; r.right = (i+1) * (cp->width+GAPBETWEEN)/nacross - r.left; r.top = cp->ypos; r.bottom = RADIOHEIGHT; doctl(cp, r, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group, 0, btext, bid); group = 0; i++; } va_end(ap); cp->ypos += r.bottom + GAPBETWEEN; } /* * A set of radio buttons on multiple lines, with a static above * them. */ void radiobig(struct ctlpos *cp, char *text, int id, ...) { RECT r; va_list ap; int group; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id); va_start(ap, id); group = WS_GROUP; while (1) { char *btext; int bid; btext = va_arg(ap, char *); if (!btext) break; bid = va_arg(ap, int); r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group, 0, btext, bid); group = 0; } va_end(ap); cp->ypos += GAPBETWEEN - GAPWITHIN; } /* * A single standalone checkbox. */ void checkbox(struct ctlpos *cp, char *text, int id) { RECT r; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = CHECKBOXHEIGHT; cp->ypos += r.bottom + GAPBETWEEN; doctl(cp, r, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, text, id); } /* * A button on the right hand side, with a static to its left. */ void staticbtn(struct ctlpos *cp, char *stext, int sid, char *btext, int bid) { const int height = (PUSHBTNHEIGHT > STATICHEIGHT ? PUSHBTNHEIGHT : STATICHEIGHT); RECT r; int lwid, rwid, rpos; rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4; lwid = rpos - 2*GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; r.left = GAPBETWEEN; r.top = cp->ypos + (height-STATICHEIGHT)/2; r.right = lwid; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); r.left = rpos; r.top = cp->ypos + (height-PUSHBTNHEIGHT)/2; r.right = rwid; r.bottom = PUSHBTNHEIGHT; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); cp->ypos += height + GAPBETWEEN; } /* * An edit control on the right hand side, with a static to its left. */ void staticedit(struct ctlpos *cp, char *stext, int sid, int eid, int percentedit) { const int height = (EDITHEIGHT > STATICHEIGHT ? EDITHEIGHT : STATICHEIGHT); RECT r; int lwid, rwid, rpos; rpos = GAPBETWEEN + (100-percentedit) * (cp->width + GAPBETWEEN) / 100; lwid = rpos - 2*GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; r.left = GAPBETWEEN; r.top = cp->ypos + (height-STATICHEIGHT)/2; r.right = lwid; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); r.left = rpos; r.top = cp->ypos + (height-EDITHEIGHT)/2; r.right = rwid; r.bottom = EDITHEIGHT; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", eid); cp->ypos += height + GAPBETWEEN; } /* * A tab-control substitute when a real tab control is unavailable. */ void ersatztab(struct ctlpos *cp, char *stext, int sid, int lid, int s2id) { const int height = (COMBOHEIGHT > STATICHEIGHT ? COMBOHEIGHT : STATICHEIGHT); RECT r; int bigwid, lwid, rwid, rpos; static const int BIGGAP = 15; static const int MEDGAP = 3; bigwid = cp->width + 2*GAPBETWEEN - 2*BIGGAP; cp->ypos += MEDGAP; rpos = BIGGAP + (bigwid + BIGGAP) / 2; lwid = rpos - 2*BIGGAP; rwid = bigwid + BIGGAP - rpos; r.left = BIGGAP; r.top = cp->ypos + (height-STATICHEIGHT)/2; r.right = lwid; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); r.left = rpos; r.top = cp->ypos + (height-COMBOHEIGHT)/2; r.right = rwid; r.bottom = COMBOHEIGHT*10; doctl(cp, r, "COMBOBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", lid); cp->ypos += height + MEDGAP + GAPBETWEEN; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = 2; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, 0, "", s2id); } /* * A static line, followed by an edit control on the left hand side * and a button on the right. */ void editbutton(struct ctlpos *cp, char *stext, int sid, int eid, char *btext, int bid) { const int height = (EDITHEIGHT > PUSHBTNHEIGHT ? EDITHEIGHT : PUSHBTNHEIGHT); RECT r; int lwid, rwid, rpos; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4; lwid = rpos - 2*GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; r.left = GAPBETWEEN; r.top = cp->ypos + (height-EDITHEIGHT)/2; r.right = lwid; r.bottom = EDITHEIGHT; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", eid); r.left = rpos; r.top = cp->ypos + (height-PUSHBTNHEIGHT)/2; r.right = rwid; r.bottom = PUSHBTNHEIGHT; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); cp->ypos += height + GAPBETWEEN; } /* * Special control which was hard to describe generically: the * session-saver assembly. A static; below that an edit box; below * that a list box. To the right of the list box, a column of * buttons. */ void sesssaver(struct ctlpos *cp, char *text, int staticid, int editid, int listid, ...) { RECT r; va_list ap; int lwid, rwid, rpos; int y; const int LISTDEFHEIGHT = 66; rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4; lwid = rpos - 2*GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; /* The static control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid); /* The edit control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; r.bottom = EDITHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", editid); /* * The buttons (we should hold off on the list box until we * know how big the buttons are). */ va_start(ap, listid); y = cp->ypos; while (1) { char *btext = va_arg(ap, char *); int bid; if (!btext) break; bid = va_arg(ap, int); r.left = rpos; r.top = y; r.right = rwid; r.bottom = PUSHBTNHEIGHT; y += r.bottom + GAPWITHIN; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); } /* Compute list box height. LISTDEFHEIGHT, or height of buttons. */ y -= cp->ypos; y -= GAPWITHIN; if (y < LISTDEFHEIGHT) y = LISTDEFHEIGHT; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; r.bottom = y; cp->ypos += y + GAPBETWEEN; doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_NOTIFY | LBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", listid); } /* * Another special control: the environment-variable setter. A * static line first; then a pair of edit boxes with associated * statics, and two buttons; then a list box. */ void envsetter(struct ctlpos *cp, char *stext, int sid, char *e1stext, int e1sid, int e1id, char *e2stext, int e2sid, int e2id, int listid, char *b1text, int b1id, char *b2text, int b2id) { RECT r; const int height = (STATICHEIGHT > EDITHEIGHT && STATICHEIGHT > PUSHBTNHEIGHT ? STATICHEIGHT : EDITHEIGHT > PUSHBTNHEIGHT ? EDITHEIGHT : PUSHBTNHEIGHT); const static int percents[] = { 20, 35, 10, 25 }; int i, j, xpos, percent; const int LISTHEIGHT = 42; /* The static control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); /* The statics+edits+buttons. */ for (j = 0; j < 2; j++) { percent = 10; for (i = 0; i < 4; i++) { xpos = (cp->width + GAPBETWEEN) * percent / 100; r.left = xpos + GAPBETWEEN; percent += percents[i]; xpos = (cp->width + GAPBETWEEN) * percent / 100; r.right = xpos - r.left; r.top = cp->ypos; r.bottom = (i==0 ? STATICHEIGHT : i==1 ? EDITHEIGHT : PUSHBTNHEIGHT); r.top += (height-r.bottom)/2; if (i==0) { doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, j==0 ? e1stext : e2stext, j==0 ? e1sid : e2sid); } else if (i==1) { doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", j==0 ? e1id : e2id); } else if (i==3) { doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, j==0 ? b1text : b2text, j==0 ? b1id : b2id); } } cp->ypos += height + GAPWITHIN; } /* The list box. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = LISTHEIGHT; cp->ypos += r.bottom + GAPBETWEEN; doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | LBS_USETABSTOPS, WS_EX_CLIENTEDGE, "", listid); } /* * Yet another special control: the character-class setter. A * static, then a list, then a line containing a * button-and-static-and-edit. */ void charclass(struct ctlpos *cp, char *stext, int sid, int listid, char *btext, int bid, int eid, char *s2text, int s2id) { RECT r; const int height = (STATICHEIGHT > EDITHEIGHT && STATICHEIGHT > PUSHBTNHEIGHT ? STATICHEIGHT : EDITHEIGHT > PUSHBTNHEIGHT ? EDITHEIGHT : PUSHBTNHEIGHT); const static int percents[] = { 30, 40, 30 }; int i, xpos, percent; const int LISTHEIGHT = 66; /* The static control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); /* The list box. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = LISTHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | LBS_USETABSTOPS, WS_EX_CLIENTEDGE, "", listid); /* The button+static+edit. */ percent = xpos = 0; for (i = 0; i < 3; i++) { r.left = xpos + GAPBETWEEN; percent += percents[i]; xpos = (cp->width + GAPBETWEEN) * percent / 100; r.right = xpos - r.left; r.top = cp->ypos; r.bottom = (i==0 ? PUSHBTNHEIGHT : i==1 ? STATICHEIGHT : EDITHEIGHT); r.top += (height-r.bottom)/2; if (i==0) { doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); } else if (i==1) { doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_CENTER, 0, s2text, s2id); } else if (i==2) { doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", eid); } } cp->ypos += height + GAPBETWEEN; } /* * A special control (horrors!). The colour editor. A static line; * then on the left, a list box, and on the right, a sequence of * two-part statics followed by a button. */ void colouredit(struct ctlpos *cp, char *stext, int sid, int listid, char *btext, int bid, ...) { RECT r; int y; va_list ap; int lwid, rwid, rpos; const int LISTHEIGHT = 66; /* The static control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); rpos = GAPBETWEEN + 2 * (cp->width + GAPBETWEEN) / 3; lwid = rpos - 2*GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; /* The list box. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; r.bottom = LISTHEIGHT; doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | LBS_USETABSTOPS, WS_EX_CLIENTEDGE, "", listid); /* The statics. */ y = cp->ypos; va_start(ap, bid); while (1) { char *ltext; int lid, rid; ltext = va_arg(ap, char *); if (!ltext) break; lid = va_arg(ap, int); rid = va_arg(ap, int); r.top = y; r.bottom = STATICHEIGHT; y += r.bottom + GAPWITHIN; r.left = rpos; r.right = rwid/2; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, ltext, lid); r.left = rpos + r.right; r.right = rwid - r.right; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_RIGHT, 0, "", rid); } va_end(ap); /* The button. */ r.top = y + 2*GAPWITHIN; r.bottom = PUSHBTNHEIGHT; r.left = rpos; r.right = rwid; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); cp->ypos += LISTHEIGHT + GAPBETWEEN; } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b69e35e5103eaa34e88edfbff680587 Text-delta-base-sha1: 544307da343716064ceb6adee246f166de47dd5d Text-content-length: 51 Text-content-md5: d5063b57ec9e35724cc0951b7e13e338 Text-content-sha1: 6be9860d1f81bcfd954d4cf1a8f5a35415a4ec6e Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNNy $o,?stuffvoid Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 32c37d915c32d76ec357aa1398c85001 Text-delta-base-sha1: 117dd8401069c27fbc062e420446cf0afb951189 Text-content-length: 39 Text-content-md5: 2d9eb62b306f2945e6d5113357c68662 Text-content-sha1: 9ff2cab26d7e0446974db77c82a58272d0551e1e Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVN~ =R/wwinstuffh Node-path: putty/winstuff.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2185 Text-content-md5: 0c7b29dc6ef5d572e38e947039f6eccf Text-content-sha1: b51ae05736d0e0076d16fa20aac083c8211ebd32 Content-length: 2301 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN{{{/* * winstuff.h: Windows-specific inter-module stuff. */ /* * Global variables. Most modules declare these `extern', but * window.c will do `#define PUTTY_DO_GLOBALS' before including this * module, and so will get them properly defined. */ #ifdef PUTTY_DO_GLOBALS #define GLOBAL #else #define GLOBAL extern #endif GLOBAL HINSTANCE hinst; /* * Exports from winctrls.c. */ struct ctlpos { HWND hwnd; WPARAM font; int dlu4inpix; int ypos, width; int xoff; int boxystart, boxid, boxtextid; char *boxtext; }; void ctlposinit(struct ctlpos *cp, HWND hwnd, int leftborder, int rightborder, int topborder); void doctl(struct ctlpos *cp, RECT r, char *wclass, int wstyle, int exstyle, char *wtext, int wid); void bartitle(struct ctlpos *cp, char *name, int id); void beginbox(struct ctlpos *cp, char *name, int idbox, int idtext); void endbox(struct ctlpos *cp); void multiedit(struct ctlpos *cp, ...); void radioline(struct ctlpos *cp, char *text, int id, int nacross, ...); void radiobig(struct ctlpos *cp, char *text, int id, ...); void checkbox(struct ctlpos *cp, char *text, int id); void staticbtn(struct ctlpos *cp, char *stext, int sid, char *btext, int bid); void staticedit(struct ctlpos *cp, char *stext, int sid, int eid, int percentedit); void ersatztab(struct ctlpos *cp, char *stext, int sid, int lid, int s2id); void editbutton(struct ctlpos *cp, char *stext, int sid, int eid, char *btext, int bid); void sesssaver(struct ctlpos *cp, char *text, int staticid, int editid, int listid, ...); void envsetter(struct ctlpos *cp, char *stext, int sid, char *e1stext, int e1sid, int e1id, char *e2stext, int e2sid, int e2id, int listid, char *b1text, int b1id, char *b2text, int b2id); void charclass(struct ctlpos *cp, char *stext, int sid, int listid, char *btext, int bid, int eid, char *s2text, int s2id); void colouredit(struct ctlpos *cp, char *stext, int sid, int listid, char *btext, int bid, ...); Revision-number: 715 Prop-content-length: 447 Content-length: 447 K 7 svn:log V 346 PuTTYgen initial version. Still to do are basic user-friendliness features (prompt for passphrase twice, prompt before overwriting a file, check the key file was actually saved OK), testing of the generated keys to make sure I got the file format right, and support for a variable key size. I think what's already here is basically sound though. K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-19T15:43:08.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0f76d8016c9401efa8cc34d8563ab90d Text-delta-base-sha1: 9f2dba62e00513af27643e66723615fa6be35774 Text-content-length: 994 Text-content-md5: 737fe47d18c8108e0d59e474643f70d8 Text-content-sha1: 3d399dca5445b8a8ba48a16a502918982db03bad Content-length: 1034 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN9\}O 4q?,nB+z?5L2yobjects puttygen GEN1 = puttygen.$(OBJ) sshrsag.$(OBJ) sshprime.$(OBJ) sshdes.$(OBJ) GEN2 = sshbn.$(OBJ) sshmd5.$(OBJ) version.$(OBJ) sshrand.$(OBJ) noise.$(OBJ) GEN3 = sshsha.$(OBJ) winstore.$(OBJ) misc.$(OBJ) winctrls.$(OBJ) GEN4 = sshrsa.$(OBJ) sshpubkuttygen GENRC = puttygen puttygen puttygenuttygen.exe: $(GEN1) $(GEN2) $(GEN3) $(GEN4) $(GENRC) puttygen.rsp link $(LFLAGS) -out:puttygen.exe @puttygen echo $(PAGE1) >> pageant.rsp echo $(PAGE2) >> pageant.rsp uttygen.rsp: makefile echo /nologo /subsystem:windows > puttygen.rsp echo $(GEN1) >> puttygen.rsp echo $(GEN2) >> puttygen.rsp echo $(GEN3) >> puttygen.rsp echo $(GEN4) >> puttygen.rsp echo $(GENRC) >> puttygen.rsp echo $(LIBS1) >> puttygen.rsp echo $(LIBS2) >> puttygen.rsp echo $(LIBS3) >> puttygen##-- dependencies puttygen.$(RES): puttygen.rc puttygen.ico ##-- puttygen.$(RES): rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 puttygen Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2d72ee8b6e1e81e348c8c7518028e16d Text-delta-base-sha1: e12ec391e90f60d67c54010d330191cae75dcf58 Text-content-length: 28 Text-content-md5: ecf4a6312aa5aca17048527d2660ffa6 Text-content-sha1: f699b4e68c9b58f5f421f3b0d578f7fcb9e9dd30 Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNCI /NULL Node-path: putty/puttygen.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 23305 Text-content-md5: 25b8e2dbee6c29ba0a0eadc5045d16ae Text-content-sha1: 0a09fdfdad16658f5fb04edd1ee5763f8e08274d Content-length: 23421 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNxxx/* * PuTTY key generation front end. */ #include #include #include #ifndef NO_SECURITY #include #endif #include #define PUTTY_DO_GLOBALS #include "putty.h" #include "ssh.h" #include "winstuff.h" #define WM_DONEKEY (WM_XUSER + 1) #define KEYSIZE 1024 /* * TODO: * - have some means of verifying passphrase changes against typos * - prompt before overwriting an existing file * - check the return value from saversakey() * - test the generated keys for actual working-RSA-key-hood * - variable key size */ /* ---------------------------------------------------------------------- * Progress report code. This is really horrible :-) */ #define PHASE1TOTAL 0x10000 #define PHASE2TOTAL 0x10000 #define PHASE3TOTAL 0x04000 #define PHASE1START 0 #define PHASE2START (PHASE1TOTAL) #define PHASE3START (PHASE1TOTAL + PHASE2TOTAL) #define TOTALTOTAL (PHASE1TOTAL + PHASE2TOTAL + PHASE3TOTAL) #define PROGRESSBIGRANGE 65535 #define DIVISOR ((TOTALTOTAL + PROGRESSBIGRANGE - 1) / PROGRESSBIGRANGE) #define PROGRESSRANGE (TOTALTOTAL / DIVISOR) struct progress { unsigned phase1param, phase1current, phase1n; unsigned phase2param, phase2current, phase2n; unsigned phase3mult; HWND progbar; }; static void progress_update(void *param, int phase, int iprogress) { struct progress *p = (struct progress *)param; unsigned progress = iprogress; int position; switch (phase) { case -1: p->phase1param = 0x10000 + progress; p->phase1current = 0x10000; p->phase1n = 0; return; case -2: p->phase2param = 0x10000 + progress; p->phase2current = 0x10000; p->phase2n = 0; return; case -3: p->phase3mult = PHASE3TOTAL / progress; return; case 1: while (p->phase1n < progress) { p->phase1n++; p->phase1current *= p->phase1param; p->phase1current /= 0x10000; } position = PHASE1START + 0x10000 - p->phase1current; break; case 2: while (p->phase2n < progress) { p->phase2n++; p->phase2current *= p->phase2param; p->phase2current /= 0x10000; } position = PHASE2START + 0x10000 - p->phase2current; break; case 3: position = PHASE3START + progress * p->phase3mult; break; } SendMessage(p->progbar, PBM_SETPOS, position / DIVISOR, 0); } extern char ver[]; #define PASSPHRASE_MAXLEN 512 struct PassphraseProcStruct { char *passphrase; char *comment; }; /* * Dialog-box function for the passphrase box. */ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static char *passphrase; struct PassphraseProcStruct *p; switch (msg) { case WM_INITDIALOG: SetForegroundWindow(hwnd); SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); p = (struct PassphraseProcStruct *)lParam; passphrase = p->passphrase; if (p->comment) SetDlgItemText(hwnd, 101, p->comment); *passphrase = 0; return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if (*passphrase) EndDialog (hwnd, 1); else MessageBeep (0); return 0; case IDCANCEL: EndDialog (hwnd, 0); return 0; case 102: /* edit box */ if (HIWORD(wParam) == EN_CHANGE) { GetDlgItemText (hwnd, 102, passphrase, PASSPHRASE_MAXLEN-1); passphrase[PASSPHRASE_MAXLEN-1] = '\0'; } return 0; } return 0; case WM_CLOSE: EndDialog (hwnd, 0); return 0; } return 0; } /* * Prompt for a key file. Assumes the filename buffer is of size * FILENAME_MAX. */ static int prompt_keyfile(HWND hwnd, char *dlgtitle, char *filename, int save) { OPENFILENAME of; memset(&of, 0, sizeof(of)); #ifdef OPENFILENAME_SIZE_VERSION_400 of.lStructSize = OPENFILENAME_SIZE_VERSION_400; #else of.lStructSize = sizeof(of); #endif of.hwndOwner = hwnd; of.lpstrFilter = "All Files\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filename; *filename = '\0'; of.nMaxFile = FILENAME_MAX; of.lpstrFileTitle = NULL; of.lpstrInitialDir = NULL; of.lpstrTitle = dlgtitle; of.Flags = 0; if (save) return GetSaveFileName(&of); else return GetOpenFileName(&of); } /* * This function is needed to link with the DES code. We need not * have it do anything at all. */ void logevent(char *msg) { } /* * Dialog-box function for the Licence box. */ static int CALLBACK LicenceProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwnd, 1); return 0; } return 0; case WM_CLOSE: EndDialog(hwnd, 1); return 0; } return 0; } /* * Dialog-box function for the About box. */ static int CALLBACK AboutProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: SetDlgItemText (hwnd, 100, ver); return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwnd, 1); return 0; case 101: EnableWindow(hwnd, 0); DialogBox (hinst, MAKEINTRESOURCE(214), NULL, LicenceProc); EnableWindow(hwnd, 1); SetActiveWindow(hwnd); return 0; } return 0; case WM_CLOSE: EndDialog(hwnd, 1); return 0; } return 0; } /* * Thread to generate a key. */ struct rsa_key_thread_params { HWND progressbar; /* notify this with progress */ HWND dialog; /* notify this on completion */ struct RSAKey *key; struct RSAAux *aux; }; static DWORD WINAPI generate_rsa_key_thread(void *param) { struct rsa_key_thread_params *params = (struct rsa_key_thread_params *)param; struct progress prog; prog.progbar = params->progressbar; rsa_generate(params->key, params->aux, KEYSIZE, progress_update, &prog); PostMessage(params->dialog, WM_DONEKEY, 0, 0); free(params); return 0; } struct MainDlgState { int collecting_entropy; int generation_thread_exists; int key_exists; int entropy_got, entropy_required, entropy_size; unsigned *entropy; struct RSAKey key; struct RSAAux aux; }; static void hidemany(HWND hwnd, const int *ids, int hideit) { while (*ids) { ShowWindow(GetDlgItem(hwnd, *ids++), (hideit ? SW_HIDE : SW_SHOW)); } } static void setupbigedit(HWND hwnd, int id, struct RSAKey *key) { char *buffer; char *dec1, *dec2; dec1 = bignum_decimal(key->exponent); dec2 = bignum_decimal(key->modulus); buffer = malloc(strlen(dec1)+strlen(dec2)+ strlen(key->comment)+30); sprintf(buffer, "%d %s %s %s", ssh1_bignum_bitcount(key->modulus), dec1, dec2, key->comment); SetDlgItemText(hwnd, id, buffer); free(dec1); free(dec2); free(buffer); } /* * Dialog-box function for the main PuTTYgen dialog box. */ static int CALLBACK MainDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { enum { controlidstart = 100, IDC_TITLE, IDC_BOX_KEY, IDC_BOXT_KEY, IDC_NOKEY, IDC_GENERATING, IDC_PROGRESS, IDC_PKSTATIC, IDC_KEYDISPLAY, IDC_FPSTATIC, IDC_FINGERPRINT, IDC_COMMENTSTATIC, IDC_COMMENTEDIT, IDC_PASSPHRASESTATIC, IDC_PASSPHRASEEDIT, IDC_BOX_ACTIONS, IDC_BOXT_ACTIONS, IDC_GENSTATIC, IDC_GENERATE, IDC_LOADSTATIC, IDC_LOAD, IDC_SAVESTATIC, IDC_SAVE, IDC_ABOUT, }; static const int nokey_ids[] = { IDC_NOKEY, 0 }; static const int generating_ids[] = { IDC_GENERATING, IDC_PROGRESS, 0 }; static const int gotkey_ids[] = { IDC_PKSTATIC, IDC_KEYDISPLAY, IDC_FPSTATIC, IDC_FINGERPRINT, IDC_COMMENTSTATIC, IDC_COMMENTEDIT, IDC_PASSPHRASESTATIC, IDC_PASSPHRASEEDIT, 0 }; static const char generating_msg[] = "Please wait while a key is generated..."; static const char entropy_msg[] = "Please move the mouse in this window to generate randomness"; struct MainDlgState *state; switch (msg) { case WM_INITDIALOG: state = malloc(sizeof(*state)); state->generation_thread_exists = FALSE; state->key_exists = FALSE; SetWindowLong(hwnd, GWL_USERDATA, (LONG)state); { struct ctlpos cp, cp2; ctlposinit(&cp, hwnd, 10, 10, 10); bartitle(&cp, "Public and private key generation for PuTTY", IDC_TITLE); beginbox(&cp, "Key", IDC_BOX_KEY, IDC_BOXT_KEY); cp2 = cp; statictext(&cp2, "No key.", IDC_NOKEY); cp2 = cp; statictext(&cp2, "", IDC_GENERATING); progressbar(&cp2, IDC_PROGRESS); bigeditctrl(&cp, "&Public key for pasting into authorized_keys file:", IDC_PKSTATIC, IDC_KEYDISPLAY, 7); SendDlgItemMessage(hwnd, IDC_KEYDISPLAY, EM_SETREADONLY, 1, 0); staticedit(&cp, "Key fingerprint:", IDC_FPSTATIC, IDC_FINGERPRINT, 70); SendDlgItemMessage(hwnd, IDC_FINGERPRINT, EM_SETREADONLY, 1, 0); staticedit(&cp, "Key &comment:", IDC_COMMENTSTATIC, IDC_COMMENTEDIT, 70); staticpassedit(&cp, "Key p&assphrase:", IDC_PASSPHRASESTATIC, IDC_PASSPHRASEEDIT, 70); endbox(&cp); beginbox(&cp, "Actions", IDC_BOX_ACTIONS, IDC_BOXT_ACTIONS); staticbtn(&cp, "Generate a public/private key pair", IDC_GENSTATIC, "&Generate", IDC_GENERATE); staticbtn(&cp, "Load an existing private key file", IDC_LOADSTATIC, "&Load", IDC_LOAD); staticbtn(&cp, "Save the generated key to a new file", IDC_SAVESTATIC, "&Save", IDC_SAVE); endbox(&cp); } /* * Initially, hide the progress bar and the key display, * and show the no-key display. Also disable the Save * button, because with no key we obviously can't save * anything. */ hidemany(hwnd, nokey_ids, FALSE); hidemany(hwnd, generating_ids, TRUE); hidemany(hwnd, gotkey_ids, TRUE); EnableWindow(GetDlgItem(hwnd, IDC_SAVE), 0); return 1; case WM_MOUSEMOVE: state = (struct MainDlgState *)GetWindowLong(hwnd, GWL_USERDATA); if (state->collecting_entropy) { state->entropy[state->entropy_got++] = lParam; state->entropy[state->entropy_got++] = GetMessageTime(); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, state->entropy_got, 0); if (state->entropy_got >= state->entropy_required) { struct rsa_key_thread_params *params; DWORD threadid; /* * Seed the entropy pool */ random_add_heavynoise(state->entropy, state->entropy_size); memset(state->entropy, 0, state->entropy_size); free(state->entropy); SetDlgItemText(hwnd, IDC_GENERATING, generating_msg); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, PROGRESSRANGE)); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, 0, 0); params = malloc(sizeof(*params)); params->progressbar = GetDlgItem(hwnd, IDC_PROGRESS); params->dialog = hwnd; params->key = &state->key; params->aux = &state->aux; if (!CreateThread(NULL, 0, generate_rsa_key_thread, params, 0, &threadid)) { MessageBox(hwnd, "Out of thread resources", "Key generation error", MB_OK | MB_ICONERROR); free(params); } else { state->generation_thread_exists = TRUE; state->collecting_entropy = FALSE; } } } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_COMMENTEDIT: if (HIWORD(wParam) == EN_CHANGE) { state = (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA); if (state->key_exists) { HWND editctl = GetDlgItem(hwnd, IDC_COMMENTEDIT); int len = GetWindowTextLength(editctl); if (state->key.comment) free(state->key.comment); state->key.comment = malloc(len+1); GetWindowText(editctl, state->key.comment, len+1); } } break; case IDC_ABOUT: EnableWindow(hwnd, 0); DialogBox (hinst, MAKEINTRESOURCE(213), NULL, AboutProc); EnableWindow(hwnd, 1); SetActiveWindow(hwnd); return 0; case IDC_GENERATE: state = (struct MainDlgState *)GetWindowLong(hwnd, GWL_USERDATA); if (!state->generation_thread_exists) { hidemany(hwnd, nokey_ids, TRUE); hidemany(hwnd, generating_ids, FALSE); hidemany(hwnd, gotkey_ids, TRUE); EnableWindow(GetDlgItem(hwnd, IDC_GENERATE), 0); EnableWindow(GetDlgItem(hwnd, IDC_LOAD), 0); EnableWindow(GetDlgItem(hwnd, IDC_SAVE), 0); state->key_exists = FALSE; SetDlgItemText(hwnd, IDC_GENERATING, entropy_msg); state->collecting_entropy = TRUE; /* * My brief statistical tests on mouse movements * suggest that there are about 5 bits of * randomness in the x position, 5 in the y * position, and 1.7 in the message time, making * 11.7 bits of unpredictability per mouse * movement. However, other people have told me * it's far less than that, so I'm going to be * stupidly cautious and knock that down to a nice * round 4. */ state->entropy_required = (KEYSIZE / 4) * 2; state->entropy_got = 0; state->entropy_size = (state->entropy_required * sizeof(*state->entropy)); state->entropy = malloc(state->entropy_size); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, state->entropy_required)); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, 0, 0); } break; case IDC_SAVE: state = (struct MainDlgState *)GetWindowLong(hwnd, GWL_USERDATA); if (state->key_exists) { char filename[FILENAME_MAX]; char passphrase[PASSPHRASE_MAXLEN]; GetDlgItemText(hwnd, IDC_PASSPHRASEEDIT, passphrase, sizeof(passphrase)-1); if (!*passphrase) { int ret; ret = MessageBox(hwnd, "Are you sure you want to save this key\n" "without a passphrase to protect it?", "PuTTYgen Warning", MB_YESNO | MB_ICONWARNING); if (ret != IDYES) break; } if (prompt_keyfile(hwnd, "Save private key as:", filename, 1)) { /* FIXME: prompt before overwriting */ saversakey(filename, &state->key, &state->aux, *passphrase ? passphrase : NULL); /* FIXME: check return value */ } } break; case IDC_LOAD: state = (struct MainDlgState *)GetWindowLong(hwnd, GWL_USERDATA); if (!state->generation_thread_exists) { char filename[FILENAME_MAX]; if (prompt_keyfile(hwnd, "Load private key:", filename, 0)) { char passphrase[PASSPHRASE_MAXLEN]; int needs_pass; int ret; char *comment; struct PassphraseProcStruct pps; struct RSAKey newkey; struct RSAAux newaux; needs_pass = rsakey_encrypted(filename, &comment); pps.passphrase = passphrase; pps.comment = comment; do { if (needs_pass) { int dlgret; dlgret = DialogBoxParam(hinst, MAKEINTRESOURCE(210), NULL, PassphraseProc, (LPARAM)&pps); if (!dlgret) { ret = -2; break; } } else *passphrase = '\0'; ret = loadrsakey(filename, &newkey, &newaux, passphrase); } while (ret == -1); if (comment) free(comment); if (ret == 0) { MessageBox(NULL, "Couldn't load private key.", "PuTTYgen Error", MB_OK | MB_ICONERROR); } else if (ret == 1) { state->key = newkey; state->aux = newaux; EnableWindow(GetDlgItem(hwnd, IDC_GENERATE), 1); EnableWindow(GetDlgItem(hwnd, IDC_LOAD), 1); EnableWindow(GetDlgItem(hwnd, IDC_SAVE), 1); /* * Now update the key controls with all the * key data. */ { char buf[128]; SetDlgItemText(hwnd, IDC_PASSPHRASEEDIT, passphrase); SetDlgItemText(hwnd, IDC_COMMENTEDIT, state->key.comment); /* * Set the key fingerprint. */ { char *savecomment = state->key.comment; state->key.comment = NULL; rsa_fingerprint(buf, sizeof(buf), &state->key); state->key.comment = savecomment; } SetDlgItemText(hwnd, IDC_FINGERPRINT, buf); /* * Construct a decimal representation * of the key, for pasting into * .ssh/authorized_keys on a Unix box. */ setupbigedit(hwnd, IDC_KEYDISPLAY, &state->key); } /* * Finally, hide the progress bar and show * the key data. */ hidemany(hwnd, nokey_ids, TRUE); hidemany(hwnd, generating_ids, TRUE); hidemany(hwnd, gotkey_ids, FALSE); state->key_exists = TRUE; } } } break; } return 0; case WM_DONEKEY: state = (struct MainDlgState *)GetWindowLong(hwnd, GWL_USERDATA); state->generation_thread_exists = FALSE; state->key_exists = TRUE; SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, PROGRESSRANGE, 0); EnableWindow(GetDlgItem(hwnd, IDC_GENERATE), 1); EnableWindow(GetDlgItem(hwnd, IDC_LOAD), 1); EnableWindow(GetDlgItem(hwnd, IDC_SAVE), 1); /* * Invent a comment for the key. We'll do this by including * the date in it. This will be so horrifyingly ugly that * the user will immediately want to change it, which is * what we want :-) */ state->key.comment = malloc(30); { time_t t; struct tm *tm; time(&t); tm = localtime(&t); strftime(state->key.comment, 30, "rsa-key-%Y%m%d", tm); } /* * Now update the key controls with all the key data. */ { char buf[128]; /* * Blank passphrase, initially. This isn't dangerous, * because we will warn (Are You Sure?) before allowing * the user to save an unprotected private key. */ SetDlgItemText(hwnd, IDC_PASSPHRASEEDIT, ""); /* * Set the comment. */ SetDlgItemText(hwnd, IDC_COMMENTEDIT, state->key.comment); /* * Set the key fingerprint. */ { char *savecomment = state->key.comment; state->key.comment = NULL; rsa_fingerprint(buf, sizeof(buf), &state->key); state->key.comment = savecomment; } SetDlgItemText(hwnd, IDC_FINGERPRINT, buf); /* * Construct a decimal representation of the key, for * pasting into .ssh/authorized_keys on a Unix box. */ setupbigedit(hwnd, IDC_KEYDISPLAY, &state->key); } /* * Finally, hide the progress bar and show the key data. */ hidemany(hwnd, nokey_ids, TRUE); hidemany(hwnd, generating_ids, TRUE); hidemany(hwnd, gotkey_ids, FALSE); break; case WM_CLOSE: state = (struct MainDlgState *)GetWindowLong(hwnd, GWL_USERDATA); free(state); EndDialog(hwnd, 1); return 0; } return 0; } int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { hinst = inst; random_init(); return DialogBox(hinst, MAKEINTRESOURCE(201), NULL, MainDlgProc) != IDOK; } Node-path: putty/puttygen.rc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3138 Text-content-md5: 01faaa1190b9b8507c4b56dd394548ec Text-content-sha1: ce896d081a89952b1e50b91412f2b1b785450106 Content-length: 3254 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN444/* Some compilers, like Borland, don't have winresrc.h */ #ifndef NO_WINRESRC_H #include #endif 200 ICON "puttygen.ico" 201 DIALOG DISCARDABLE 0, 0, 300, 300 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTYgen Key Generator" FONT 8, "MS Sans Serif" BEGIN END 210 DIALOG DISCARDABLE 0, 0, 140, 60 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTYgen: Enter Passphrase" FONT 8, "MS Sans Serif" BEGIN CTEXT "Enter passphrase for key", 100, 10, 6, 120, 8 CTEXT "", 101, 10, 16, 120, 8 EDITTEXT 102, 10, 26, 120, 12, ES_PASSWORD DEFPUSHBUTTON "O&K", IDOK, 20, 42, 40, 14 PUSHBUTTON "&Cancel", IDCANCEL, 80, 42, 40, 14 END /* Accelerators used: cl */ 213 DIALOG DISCARDABLE 140, 40, 136, 70 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About PuTTYgen" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Close", IDOK, 82, 52, 48, 14 PUSHBUTTON "View &Licence", 101, 6, 52, 70, 14 CTEXT "PuTTYgen", 102, 10, 6, 120, 8 CTEXT "", 100, 10, 16, 120, 16 CTEXT "\251 1997-2000 Simon Tatham. All rights reserved.", 103, 10, 34, 120, 16 END /* No accelerators used */ 214 DIALOG DISCARDABLE 50, 50, 226, 223 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTYgen Licence" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK", IDOK, 98, 203, 44, 14 LTEXT "Copyright \251 1997-2000 Simon Tatham", 1000, 10, 10, 206, 8 LTEXT "Permission is hereby granted, free of charge, to any person", 1002, 10, 26, 206, 8 LTEXT "obtaining a copy of this software and associated documentation", 1003, 10, 34, 206, 8 LTEXT "files (the ""Software""), to deal in the Software without restriction,", 1004, 10, 42, 206, 8 LTEXT "including without limitation the rights to use, copy, modify, merge,", 1005, 10, 50, 206, 8 LTEXT "publish, distribute, sublicense, and/or sell copies of the Software,", 1006, 10, 58, 206, 8 LTEXT "and to permit persons to whom the Software is furnished to do so,", 1007, 10, 66, 206, 8 LTEXT "subject to the following conditions:", 1008, 10, 74, 206, 8 LTEXT "The above copyright notice and this permission notice shall be", 1010, 10, 90, 206, 8 LTEXT "included in all copies or substantial portions of the Software.", 1011, 10, 98, 206, 8 LTEXT "THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT", 1013, 10, 114, 206, 8 LTEXT "WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,", 1014, 10, 122, 206, 8 LTEXT "INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", 1015, 10, 130, 206, 8 LTEXT "MERCHANTABILITY, FITNESS FOR A PARTICULAR", 1016, 10, 138, 206, 8 LTEXT "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL", 1017, 10, 146, 206, 8 LTEXT "SIMON TATHAM BE LIABLE FOR ANY CLAIM, DAMAGES OR", 1018, 10, 154, 206, 8 LTEXT "OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,", 1019, 10, 162, 206, 8 LTEXT "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN", 1020, 10, 170, 206, 8 LTEXT "CONNECTION WITH THE SOFTWARE OR THE USE OR", 1021, 10, 178, 206, 8 LTEXT "OTHER DEALINGS IN THE SOFTWARE.", 1022, 10, 186, 206, 8 END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5f1efebb2bac60ed1bd7e39c6bded4a4 Text-delta-base-sha1: 99f011bd4681022230bb151eeb93e107537b4309 Text-content-length: 30 Text-content-md5: 0ab289baef0ab2507cfed4eba7537b58 Text-content-sha1: f9fbbba89f3245dd1d9c271b3332f9c150a44c13 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNMS HNULL Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 804b5aa99956cf9f980777e8c37ecc90 Text-delta-base-sha1: 2aa8c4a52784b795ea9eb6679512d1f4186084c7 Text-content-length: 313 Text-content-md5: 36f5fe154f3af81d9e2a9bf6a0700ecd Text-content-sha1: 5c62491867ff7dc52028a9ab36bc256fcfa0e5eb Content-length: 353 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN7} Qln:Shn9~void random_add_heavychar *bignum_decimal(Bignum xstruct RSAAux *aux, char *passphrase); int rsakey_encrypted(char *filename, char **comment); int saversakey(char *filename, struct RSAKey *key, struct RSAAux *aux, char *passphrasevoid des3_en Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8937a8935837e46c41d2c264c91ae81d Text-delta-base-sha1: 88e38b0190f09a3d3cae061939c2e50c8b76d751 Text-content-length: 2410 Text-content-md5: 134b5e2d4d1b8098ba28e12a650b0fee Text-content-sha1: 041fccd7a7d6109ee2108ac8874c16ae8fb6f742 Content-length: 2449 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNa..XZa7p5uB6ce|void internal_add_shifted(unsigned short *number, unsigned(unsigned short)(unsigned short)(unsigned short)(unsigned short) /* * Render a bignum into decimal. Return a malloced string holding * the decimal representation. */ char *bignum_decimal(Bignum x) { int ndigits, ndigit; int i, iszero; unsigned long carry; char *ret; unsigned short *workspace; /* * First, estimate the number of digits. Since log(10)/log(2) * is just greater than 93/28 (the joys of continued fraction * approximations...) we know that for every 93 bits, we need * at most 28 digits. This will tell us how much to malloc. * * Formally: if x has i bits, that means x is strictly less * than 2^i. Since 2 is less than 10^(28/93), this is less than * 10^(28i/93). We need an integer power of ten, so we must * round up (rounding down might make it less than x again). * Therefore if we multiply the bit count by 28/93, rounding * up, we will have enough digits. */ i = ssh1_bignum_bitcount(x); ndigits = (28*i + 92)/93; /* multiply by 28/93 and round up */ ndigits++; /* allow for trailing \0 */ ret = malloc(ndigits); /* * Now allocate some workspace to hold the binary form as we * repeatedly divide it by ten. Initialise this to the * big-endian form of the number. */ workspace = malloc(sizeof(unsigned short) * x[0]); for (i = 0; i < x[0]; i++) workspace[i] = x[x[0] - i]; /* * Next, write the decimal number starting with the last digit. * We use ordinary short division, dividing 10 into the * workspace. */ ndigit = ndigits-1; ret[ndigit] = '\0'; do { iszero = 1; carry = 0; for (i = 0; i < x[0]; i++) { carry = (carry << 16) + workspace[i]; workspace[i] = (unsigned short) (carry / 10); if (workspace[i]) iszero = 0; carry %= 10; } ret[--ndigit] = (char)(carry + '0'); } while (!iszero); /* * There's a chance we've fallen short of the start of the * string. Correct if so. */ if (ndigit > 0) memmove(ret, ret+ndigit, ndigits-ndigit); /* * Done. */ return ret; } Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0666f30b8eb5b19b13e1cfb27d6d0442 Text-delta-base-sha1: 4a5cc472d1e224280be8e65fa2641aa4d82b58a9 Text-content-length: 46 Text-content-md5: 7272b0c72c3618840253aef256e85116 Text-content-sha1: 2ef6e36fb8319b624068e8bb608abe674ebb0375 Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNt`$> 8; \ (cp)[1] = (value) >> 16; \ (cp)[0] = (value) >> 24; } while (0) struct RSAAux *auxexponent, and then the three auxiliary values * (iqmp, q, p). */ i += makeprivate(buf+i, key); if (len-i < 0) goto end; if (aux) { i += ssh1_read_bignum(buf+i, &aux->iqmp); if (len-i < 0) goto end; i += ssh1_read_bignum(buf+i, &aux->q); if (len-i < 0) goto end; i += ssh1_read_bignum(buf+i, &aux->p); if (len-i < 0) goto end; }struct RSAAux *aux, aux /* * Save an RSA key file. Return nonzero on success. */ int saversakey(char *filename, struct RSAKey *key, struct RSAAux *aux, struct MD5Context md5c; char *p, *estart; FILE *fp; /* * Write the initial signature. */ p = buf; memcpy(p, rsa_signature, sizeof(rsa_signature)); p += sizeof(rsa_signature); /* * One byte giving encryption type, and one reserved (zero) * uint32. */ *p++ = (passphrase ? SSH_CIPHER_3DES : 0); PUT_32BIT(p, 0); p += 4; /* * An ordinary SSH 1 public key consists of: a uint32 * containing the bit count, then two bignums containing the * modulus and exponent respectively. */ PUT_32BIT(p, ssh1_bignum_bitcount(key->modulus)); p += 4; p += ssh1_write_bignum(p, key->modulus); p += ssh1_write_bignum(p, key->exponent); /* * A string containing the comment field. */ if (key->comment) { PUT_32BIT(p, strlen(key->comment)); p += 4; memcpy(p, key->comment, strlen(key->comment)); p += strlen(key->comment); } else { PUT_32BIT(p, 0); p += 4; } /* * The encrypted portion starts here. */ estart = p; /* * Two bytes, then the same two bytes repeated. */ *p++ = random_byte(); *p++ = random_byte(); p[0] = p[-2]; p[1] = p[-1]; p += 2; /* * Four more bignums: the decryption exponent, then iqmp, then * q, then p. */ p += ssh1_write_bignum(p, key->private_exponent); p += ssh1_write_bignum(p, aux->iqmp); p += ssh1_write_bignum(p, aux->q); p += ssh1_write_bignum(p, aux->p); /* * Now write zeros until the encrypted portion is a multiple of * 8 bytes. */ while ((p-estart) % 8) *p++ = '\0'; /* * Now encrypt the encrypted portion. */ if (passphrasencrypt_pubkey(keybuf, estart, p-estartDone. Write the result to the file. */ fp = fopen(filename, "wb"); if (fp) { int ret = (fwrite(buf, 1, p-buf, fp) == (size_t)(p-buf)); ret = ret && (fclose(fp) == 0); return ret; } else return 0; } Node-path: putty/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: de0ad27457e5e3a0bdf6b1eee21f96f9 Text-delta-base-sha1: bf849c18050ad09a99a983aea2df0001dd9a70ab Text-content-length: 1486 Text-content-md5: 682faa8634e02e360b6e11d726f2555a Text-content-sha1: f4d4cc7f7b056bfd99f82a1c0c9a237e31147edc Content-length: 1525 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNVX!!a6G'${?|Zvoid random_add_noise(void *noise, int length) { unsigned char *p = noise; int i; /* * This function processes HASHINPUT bytes into only HASHSIZE * bytes, so _if_ we were getting incredibly high entropy * sources then we would be throwing away valuable stuff. */ for (i = 0; i < HASHSIZE; i++) { pool.pool[pool.poolpos++] ^= pool.incomingb[i]; if (pool.poolpos >= POOLSIZE) pool.poolpos = 0; } if (pool.poolpos < HASHSIZE) random_stir(); add_heavynoise(void *noise, int length) { unsigned char *p = noise; int i; while (length >= POOLSIZE) { for (i = 0; i < POOLSIZE; i++) pool.pool[i] ^= *p++; random_stir(); length -= POOLSIZE; } for (i = 0; i < length; i++) pool.pool[i] ^= *p++; random_stir(); } static void random_add_heavynoise_bitbybit(void *noise, int length) { unsigned char *p = noise; int i; while (length >= POOLSIZE - pool.poolpos) { for (i = 0; i < POOLSIZE - pool.poolpos; i++) pool.pool[pool.poolpos + i] ^= *p++; random_stir(); length -= POOLSIZE - pool.poolpos; pool.poolpos = 0; } for (i = 0; i < length; i++) pool.pool[i] ^= *p++; pool.poolpos = i; } void random_init(void) { memset(&pool, 0, sizeof(pool)); /* just to start with */ noise_get_heavy(random_add_heavynoise_bitbybit Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eaf48601e850674453ddcb88c7369d36 Text-delta-base-sha1: d73b9e85301a2b5fe960320b9aefb76e3314ab82 Text-content-length: 1451 Text-content-md5: 1847bfd4ad8ef20fa02134cf1643d945 Text-content-sha1: 4f8b57e0e3176d00896132ddb495e5d841da7b47 Content-length: 1490 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNT2NOe avaj:cA,bj##N<J~H9r\xhh:Q#include ypos += height + GAPBETWEEN; } staticedit_internal(cp, stext, sid, eid, percentedit, 0); } void staticpassedit(struct ctlpos *cp, char *stext, int sid, int eid, int percentedit) { staticedit_internal(cp, stext, sid, eid, percentedit, ES_PASSWORD); } /* * A big multiline edit control with a static labelling it. */ void bigeditctrl(struct ctlpos *cp, char *stext, int sid, int eid, int lines) { RECT rEDITHEIGHT + (lines-1) *EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE, WS_EX_CLIENTEDGE, "", eid)/* * A progress bar (from Common Controls). We like our progress bars * to be smooth and unbroken, without those ugly divisions; some * older compilers may not support that, but that's life. */ void progressbar(struct ctlpos *cpPROGBARHEIGHT; cp->ypos += r.bottom + GAPBETWEEN; doctl(cp, r, PROGRESS_CLASS, WS_CHILD | WS_VISIBLE #ifdef PBS_SMOOTH | PBS_SMOOTH #endif , WS_EX_CLIENTEDGE, "", id); } Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0c7b29dc6ef5d572e38e947039f6eccf Text-delta-base-sha1: b51ae05736d0e0076d16fa20aac083c8211ebd32 Text-content-length: 276 Text-content-md5: 9c25703a1ac9dc56deeb3d26020ca32a Text-content-sha1: 3db6b69cce5f5448a02a72db21fd359d9dc131cb Content-length: 315 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN{,u"pnD%Vtextstaticpassedit(struct ctlpos *cp, char *stext, int sid, int eid, int percentedit); void bigeditctrl(struct ctlpos *cp, char *stext, int sid, int eid, int linesvoid progressbar(struct ctlpos *cp, int id); Revision-number: 716 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2000-10-20T09:24:44.000000Z K 7 svn:log V 68 We must InitCommonControls() or the progress bar doesn't work on 95 K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 25b8e2dbee6c29ba0a0eadc5045d16ae Text-delta-base-sha1: 0a09fdfdad16658f5fb04edd1ee5763f8e08274d Text-content-length: 45 Text-content-md5: 6e533625d0d9a15d7e15a17547b71695 Text-content-sha1: 529e05924e723684bf52f907bed752f45ffb9147 Content-length: 84 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNx vInitCommonControls(); Revision-number: 717 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2000-10-20T09:31:16.000000Z K 7 svn:log V 56 Add a second passphrase prompt to protect against typos K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6e533625d0d9a15d7e15a17547b71695 Text-delta-base-sha1: 529e05924e723684bf52f907bed752f45ffb9147 Text-content-length: 1014 Text-content-md5: 6dd6a828dbb2365564c497da8f3fd666 Text-content-sha1: ec1f4b909f007d39d51a4e8b90e32ef9924945c0 Content-length: 1053 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN#A'KhLk L7U[kds~3~a11STATIC, IDC_PASSPHRASE1EDIT, IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE21STATIC, IDC_PASSPHRASE1EDIT, IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2 /* Accelerators used: acglops */1STATIC, IDC_PASSPHRASE1EDIT, 70); staticpassedit(&cp, "C&onfirm passphrase:", IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2char passphrase2[PASSPHRASE_MAXLEN]; GetDlgItemText(hwnd, IDC_PASSPHRASE1EDIT, passphrase, sizeof(passphrase)); GetDlgItemText(hwnd, IDC_PASSPHRASE2EDIT, passphrase2, sizeof(passphrase2)); if (strcmp(passphrase, passphrase2)) { MessageBox(hwnd, "The two passphrases given do not match.", "PuTTYgen Error", MB_OK | MB_ICONERROR); break; }1PASSPHRASE21EDIT, ""); SetDlgItemText(hwnd, IDC_PASSPHRASE2 Revision-number: 718 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2000-10-20T09:36:11.000000Z K 7 svn:log V 40 Adjust the title of the PuTTYgen window K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 01faaa1190b9b8507c4b56dd394548ec Text-delta-base-sha1: ce896d081a89952b1e50b91412f2b1b785450106 Text-content-length: 20 Text-content-md5: 0465e30739f3b315a867479e3371c9bf Text-content-sha1: cb77414539d713226cddb909addc5a343955e331 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN41 t=w Revision-number: 719 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2000-10-20T09:41:13.000000Z K 7 svn:log V 57 Save Key now prompts before overwriting an existing file K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6dd6a828dbb2365564c497da8f3fd666 Text-delta-base-sha1: ec1f4b909f007d39d51a4e8b90e32ef9924945c0 Text-content-length: 360 Text-content-md5: a3075737a4cd37a7bf304aa677278337 Text-content-sha1: 05f8f4e5814d914193f69508dfb388d52afce7b6 Content-length: 399 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN#GKB|G+x FILE *fp = fopen(filename, "r"); if (fp) { int ret; char buffer[FILENAME_MAX+80]; fclose(fp); sprintf(buffer, "Overwrite existing file\n%.*s?", FILENAME_MAX, filename); ret = MessageBox(hwnd, buffer, "PuTTYgen Warning", MB_YESNO | MB_ICONWARNING); if (ret != IDYES) break; } Revision-number: 720 Prop-content-length: 154 Content-length: 154 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-20T09:43:58.000000Z K 7 svn:log V 54 Check whether key was actually saved, and warn if not PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a3075737a4cd37a7bf304aa677278337 Text-delta-base-sha1: 05f8f4e5814d914193f69508dfb388d52afce7b6 Text-content-length: 330 Text-content-md5: afa597c7e2f9ab614c92d1ce1d6a7d5b Text-content-sha1: 969a73c8d9edcf39a056d20aafdedcdec8ff020c Content-length: 369 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN"KzOcs int ret; FILE *fp = fopen(filename, "r"); if (fp) {ret = saversakey(filename, &state->key, &state->aux, *passphrase ? passphrase : NULL); if (ret <= 0) { MessageBox(hwnd, "Unable to save key file", "PuTTYgen Error", MB_OK | MB_ICONERROR); } Revision-number: 721 Prop-content-length: 120 Content-length: 120 K 7 svn:log V 20 Add a PuTTYgen icon K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-20T09:50:56.000000Z PROPS-END Node-path: putty/puttygen.ico Node-kind: file Node-action: add Prop-content-length: 88 Text-delta: true Text-content-length: 780 Text-content-md5: 42b6ba5e5c543bac15811a1768e0f6fe Text-content-sha1: 071b7f309749c0546ddf19dc43313011a50c40b7 Content-length: 868 K 15 cvs2svn:cvs-rev V 3 1.1 K 13 svn:mime-type V 24 application/octet-stream PROPS-END SVN~~~ ( @wwwwxwwwwwwwxpxxx x www 0 3333330333333303 333303333300333333333303333333333 000033330333333033???????  Revision-number: 722 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2000-10-20T10:07:53.000000Z K 7 svn:log V 115 Variable key size in PuTTYgen. Also required adding WM_VSCROLL to the window style in bigeditctrl() in winctrls.c. K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: afa597c7e2f9ab614c92d1ce1d6a7d5b Text-delta-base-sha1: 969a73c8d9edcf39a056d20aafdedcdec8ff020c Text-content-length: 587 Text-content-md5: b5d760495de0cf79ce0d3f48a07a066e Text-content-sha1: ecaa2f229c6e171808936969026a47bfb11eb5dc Content-length: 626 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNmFw+Z+'9<}>57h|3mZpeI^5DEFAULT_int keysize; /* bits in key params->keysizeint keyBOX_PARAMS, IDC_BOXT_PARAMS, IDC_BITSSTATIC, IDC_BITSedit(&cp, "Length of generated keys in &bits:", IDC_BITSSTATIC, IDC_BITS, 20); endbox(&cp); } SetDlgItemInt(hwnd, IDC_BITS, DEFAULT_KEYSIZE, FALSE); params->keysize = state->keysize { BOOL ok; state->keysize = GetDlgItemInt(hwnd, IDC_BITS, &ok, FALSE); if (!ok) state->keysize = DEFAULT_KEYSIZE; }state->keysize Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1847bfd4ad8ef20fa02134cf1643d945 Text-delta-base-sha1: 4f8b57e0e3176d00896132ddb495e5d841da7b47 Text-content-length: 33 Text-content-md5: 80128b20652b2e0f00fee27429f26e00 Text-content-sha1: ec75196772e802cc3396a7e316b8e04c8dd40f21 Content-length: 72 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN2? y Win1250 translation which I accidentally blew away K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-20T11:16:58.000000Z PROPS-END Node-path: putty/xlat.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4178d5b019ecd30072d698c3c34383b3 Text-delta-base-sha1: 5a026b287594c045905d92843af81b8d2c54294f Text-content-length: 64 Text-content-md5: ee2d528cf048dbb211bcb6a868c6410c Text-content-sha1: ba157279020632cb80d5f0cd0165f9d687820816 Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN k +pPPw1250) return xlatISO88592toWIN1250 Revision-number: 727 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2000-10-20T12:31:02.000000Z K 7 svn:log V 54 Remember to update scrollbar when scrollback is reset K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c1793c6265a396addddc36d9d8410500 Text-delta-base-sha1: c53aea7e059695d8f8ca801976397857277e34ed Text-content-length: 41 Text-content-md5: d21b6cabb39a9bd614549fd52e0f61a7 Text-content-sha1: 8862bc340007d99869a82b795656c24e4ca0a334 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN:N mPj update_sbar() Revision-number: 728 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2000-10-20T13:23:24.000000Z K 7 svn:log V 69 Trim trailing whitespace off saved session names on the command line K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2d9eb62b306f2945e6d5113357c68662 Text-delta-base-sha1: 9ff2cab26d7e0446974db77c82a58272d0551e1e Text-content-length: 106 Text-content-md5: 7ab9918d55e7adf845216d944e521de5 Text-content-sha1: ba8860f7b75fb50c03c155f939b72fd4f11e886a Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVNf QQ~int i = strlen(p); while (i > 1 && isspace(p[i-1])) i--; p[i] = '\0'; Revision-number: 729 Prop-content-length: 613 Content-length: 613 K 8 svn:date V 27 2000-10-20T13:51:46.000000Z K 7 svn:log V 512 Introduce a sane interface function, from_backend(), for backends to use when they have data from the network. Replaces the utterly daft inbuf / inbuf_head / term_out() interface, which only made sense when feeding to terminal.c. (terminal.c now implements from_backend() as a small function that gateways to the old interface.) As a side effect, from_backend() also has an `is_stderr' parameter, so scp can once again separate the server's pronouncements on stderr from the actual protocol progress on stdout. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6641252536844eabfb7cc5667b48e30c Text-delta-base-sha1: bb236530bfd68e1b5aefcc84227ff3df76cbdd59 Text-content-length: 101 Text-content-md5: 97fe00b3bf36e5e8fb03adb436ceafc2 Text-content-sha1: 25ee10ce609e18683197d28a5081c30b94bbeb84 Content-length: 140 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNo OO87from_backend(0, buf, len); } static void c_write1 (char c) { c_write(&c, 1 Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9f36ab828223f7faa2428a4515c4c193 Text-delta-base-sha1: de69f8b0c5a049b71f42ced92796b97c1f294cc2 Text-content-length: 321 Text-content-md5: c1bb86562737c5d0a9449409d0c3a416 Text-content-sha1: e9871be946da75adcf35c8de1319f872ecae165b Content-length: 361 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNs<#YSTUnirW, errfrom_backend(int is_stderr, char *data, int len) { int pos; DWORD ret; HANDLE h = (is_stderr ? errhandle : outhandle); pos = 0; while (pos < len) { if (!WriteFile(h, data+pos, len-pospos += ret; } errhandle = GetStdHandle(STD_ERROR Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3bc11840ac48bd1d5b3d87a4b5c5d51c Text-delta-base-sha1: 45a4a8ebfbfd1051f1e2062281ca24406dfb6243 Text-content-length: 78 Text-content-md5: e48e0ebb6f47e802cc1b1d7acced7770 Text-content-sha1: 39d1a07cbac28a31976d7649472a4abee29af3a5 Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVNb4]QPvoid from_backend(int is_stderr, char *data, int len Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9837a5ae7856fa6a008bff6ed09dac0e Text-delta-base-sha1: bc740c12844cbbdc283f298ad82a2357ffed830e Text-content-length: 45 Text-content-md5: c357fe53d2e3cb37619bd59580c1de9e Text-content-sha1: b7d811b8c8533ec2a41c9522d0298c16507d1ecc Content-length: 85 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNH: )yOfrom_backend(0, buf, len Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 384039420a5e4b2d40fa677237c3c0ca Text-delta-base-sha1: 468fe3e2fb7821793ca951d446bab728c092b97b Text-content-length: 403 Text-content-md5: 6ff5ce49c0aec73b9e352054980be51f Text-content-sha1: f8062ee006d191e61c7de22dbb156343a71c9e78 Content-length: 443 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN bh&:\.JGD% }from_backend() to catch the data that comes back. We * dofrom_backend(int is_stderr, char *data, int datalen) { unsigned char *p = (unsigned char *)data; unsigned len = (unsigned)datalen; /* * stderr data is just spouted to local stderr and otherwise * ignored. */ if (is_stderr) { fwrite(data, 1, len, stderr); return; } Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0ab289baef0ab2507cfed4eba7537b58 Text-delta-base-sha1: f9fbbba89f3245dd1d9c271b3332f9c150a44c13 Text-content-length: 187 Text-content-md5: c357b7fdec1b292c89b931c26119c446 Text-content-sha1: dd756c62c3eb04454086ec1189d0298af7f26dc7 Content-length: 227 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVNSIP Tk@=from_backend(1, buf, lenfrom_backend(pktin.type == SSH1_SMSG_STDERR_DATA, from_backend(pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA, Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eb0631c35c9d587ac92e7eed6614895f Text-delta-base-sha1: 0f1e5ee368b9859e2e95f2db210c7fa5119cda88 Text-content-length: 91 Text-content-md5: b18f006f1b465dacaad438a220559772 Text-content-sha1: e45ba504c50ae144f79e353407939dd63e2c42c1 Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNf; CRC&@c_write1(int c) { char cc = (char)c; from_backend(0, &cc, 1 Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d21b6cabb39a9bd614549fd52e0f61a7 Text-delta-base-sha1: 8862bc340007d99869a82b795656c24e4ca0a334 Text-content-length: 260 Text-content-md5: 80befedefcc3a6eebcce4a0b61df8c3f Text-content-sha1: e72b59162c57844b16371e480a25bf98ce897ae5 Content-length: 300 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNN<nNn /* * from_backend(), to get data from the backend for the terminal. */ void from_backend(int is_stderr, char *data, int len) { while (len--) { if (inbuf_head >= INBUF_SIZE) term_out(); inbuf[inbuf_head++] = *data++; } } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7ab9918d55e7adf845216d944e521de5 Text-delta-base-sha1: ba8860f7b75fb50c03c155f939b72fd4f11e886a Text-content-length: 54 Text-content-md5: 3ce779d3b2a9d391d5aca61b5ff745bf Text-content-sha1: c2d637abe4cbfdad4ade02693ff7e083687e3fc6 Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVNfi398fMessageBeep(MB_ICONHAND Revision-number: 730 Prop-content-length: 194 Content-length: 194 K 8 svn:date V 27 2000-10-20T14:45:16.000000Z K 7 svn:log V 94 Add the LBS_NOTIFY style to the list box in colouredit(), which was vital to it working right K 10 svn:author V 5 simon PROPS-END Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 80128b20652b2e0f00fee27429f26e00 Text-delta-base-sha1: ec75196772e802cc3396a7e316b8e04c8dd40f21 Text-content-length: 38 Text-content-md5: 10d3a87788f561033e63b60fc8687187 Text-content-sha1: 92d379f20d83f63a21c1ab394f92b21f9f63703b Content-length: 77 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN?L = | LBS_NOTIFY Revision-number: 731 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2000-10-20T15:09:35.000000Z K 7 svn:log V 62 Some better IDC_* names for the controls on the Colours panel K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d5063b57ec9e35724cc0951b7e13e338 Text-delta-base-sha1: 6be9860d1f81bcfd954d4cf1a8f5a35415a4ec6e Text-content-length: 204 Text-content-md5: 4428991b095518fca033e1a6e85afe22 Text-content-sha1: 18fa4e494b74da4456de0de6cc4299d06b354e08 Content-length: 244 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVNySLsKT[]/_ rwi:|s6|)j=1 <=COLOURSTATIC, IDC_COLOURCOLOURCOLOURCOLOURSTATIC, IDC_COLOURCOLOURCOLOURCOLOURCOLOURCOLOURdebug(("ooh\n")COLOUR Revision-number: 732 Prop-content-length: 161 Content-length: 161 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-20T15:09:56.000000Z K 7 svn:log V 61 Rename "Stored Sessions" to "Saved Sessions" for consistency PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4428991b095518fca033e1a6e85afe22 Text-delta-base-sha1: 18fa4e494b74da4456de0de6cc4299d06b354e08 Text-content-length: 28 Text-content-md5: cb9b1eb48173198ee1054408721be8b3 Text-content-sha1: 37f2f731866c322ef7e1d6ba2d2b5c20d207d365 Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVNSR C Fav Revision-number: 733 Prop-content-length: 381 Content-length: 381 K 8 svn:date V 27 2000-10-20T15:20:53.000000Z K 7 svn:log V 280 Put back the code that ensures "Default Settings" is always in the session list even if it isn't in the Registry. This got deleted overenthusiastically because I didn't have a comment explaining what it was doing there. Now there's a comment, so I probably won't remove it again. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ba4e68aa67a25235f9cfc9dd673b4896 Text-delta-base-sha1: 0f82eb552918e71e4e91b4b366083de4ea2d301b Text-content-length: 526 Text-content-md5: a53a7cc102218a44f53d39a691c2f1b9 Text-content-sha1: 77a96dd2649188f12b3fe3e1c8ce584237fb2196 Content-length: 565 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNR vev'+/* * Now set up the list of sessions. Note that "Default * Settings" must always be claimed to exist, even if it * doesn't really. */ p = buffer; nsessions = 1; /* "Default Settings" counts as one */ while (*p) { if (strcmp(p, "Default Settings")) nsessions++; while (*p) p++; p++; } sessions = smalloc((nsessions+1) * sizeof(char *)); sessions[0] = "Default Settings"; p = buffer; i = 1; while (*p) { if (strcmp(p, "Default Settings")) Revision-number: 734 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:20.952564Z PROPS-END Revision-number: 735 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:20.959561Z PROPS-END Revision-number: 736 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:20.966493Z PROPS-END Revision-number: 737 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:20.973421Z PROPS-END Revision-number: 738 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:20.979953Z PROPS-END Revision-number: 739 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Remember to close key files when rsakey_encrypted meets a bogus one K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-20T17:57:47.000000Z PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4e830636a003afb0e7db379aa215eeca Text-delta-base-sha1: b22729529ebcac4ca61864c2273db6a980b1631f Text-content-length: 32 Text-content-md5: 50bbe0785896ec8c4e68f72c11fd45ee Text-content-sha1: 946aa9b182a69d6569e140644d7270141e83be2e Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN* +t&fclose(fp); Revision-number: 740 Prop-content-length: 149 Content-length: 149 K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-20T18:36:15.000000Z K 7 svn:log V 49 Chinese support patch from zmx@cdpa.nsysu.edu.tw PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ce779d3b2a9d391d5aca61b5ff745bf Text-delta-base-sha1: c2d637abe4cbfdad4ade02693ff7e083687e3fc6 Text-content-length: 1040 Text-content-md5: 86d4a9d7dde717b5279738fc0c041a06 Text-content-sha1: 6ea5dedbbe2916f293f80aa22a91014b972a7c55 Content-length: 1080 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVNi`%]^{b\%{w9 H!/* Needed for Chinese support and apparently not always defined. */ #ifndef VK_PROCESSKEY #define VK_PROCESSKEY 0xE5 #endif int winmode = WS_OVERLAPPEDWINDOW|WS_VSCROLL; if (!cfg.scrollbar) winmode &= ~(WS_VSCROLL); if (cfg.locksize) winmode &= ~(WS_THICKFRAME|WS_MAXIMIZEBOX); hwnd = CreateWindow (appname, appname, winmode, CW_USEDEFAULT, CW_USEDEFAULT, guess_width, guess_height, if (wParam==VK_PROCESSKEY) { MSG m; m.hwnd = hwnd; m.message = WM_KEYDOWN; m.wParam = wParam; m.lParam = lParam & 0xdfff; TranslateMessage(&m); } else { len = TranslateKey (message, wParam, lParam, buf); if (len == -1) return DefWindowProc (hwnd, message, wParam, lParam); ldisc->send (buf, len); } } return 0; case WM_IME_CHAR: { unsigned char buf[2]; buf[1] = wParam; buf[0] = wParam >> 8; ldisc->send (buf, 2); } Revision-number: 741 Prop-content-length: 462 Content-length: 462 K 7 svn:log V 361 Three new configurable options: - Robert de Bath's Compose key is now off by default and configurable on - The ages-old controversy over whether ALT by itself should bring the System menu up is now controllable by a config option - You can now independently configure whether scrollback resets on a keypress _and_ whether it resets on screen activity. K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-21T16:30:58.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e48e0ebb6f47e802cc1b1d7acced7770 Text-delta-base-sha1: 39d1a07cbac28a31976d7649472a4abee29af3a5 Text-content-length: 143 Text-content-md5: 6c4ca714d6418ec1da7eceaeb52aa902 Text-content-sha1: ec53ec257fa4623d7540104e0adf4fe89a336218 Content-length: 183 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVNb> yoyV alt_only; /* is it special? */ int ldisc_term; int scroll_on_key; int scroll_on_disp; int compose Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a53a7cc102218a44f53d39a691c2f1b9 Text-delta-base-sha1: 77a96dd2649188f12b3fe3e1c8ce584237fb2196 Text-content-length: 283 Text-content-md5: 4aa6b3457fc10914bb3adcc13bb59a67 Text-content-sha1: 6e18c540ac2079dd7d07cd5ee9c7ba2492812a4b Content-length: 322 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNeq7V Si+WAltOnly", cfg->alt_only); write_setting_i (sesskey, "ComposeKey", cfg->compose_keyScrollOnDisp", cfg->scroll_on_dispAltOnly", 0, &cfg->alt_only); gppi (sesskey, "ComposeKey", 0, &cfg->compose_keyScrollOnDisp", 1, &cfg->scroll_on_disp Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 80befedefcc3a6eebcce4a0b61df8c3f Text-delta-base-sha1: e72b59162c57844b16371e480a25bf98ce897ae5 Text-content-length: 42 Text-content-md5: f37a8ec2e7ff9acf9de203d75f70bec1 Text-content-sha1: fcf3f7388279ce01b74b82363c9b56cce92bc08b Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN<< #cfg.scroll_on_disp Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cb9b1eb48173198ee1054408721be8b3 Text-delta-base-sha1: 37f2f731866c322ef7e1d6ba2d2b5c20d207d365 Text-content-length: 1009 Text-content-md5: eaddc7ac01e96e2a4f3bc4e7c32f488b Text-content-sha1: c592da485f11c7264df63aa82fd6c84b0ab2e365 Content-length: 1049 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNR|ghO^^'=Qz*(!Gtv'UO`vQ UgW@|kW@^W@XQ@?BOX_KEYBOARD3, IDC_BOXT_KEYBOARD3IDC_COMPOSEKEYALTONLY, IDC_SCROLLKEY, IDC_SCROLLDISPALTONLY, cfg.alt_only); CheckDlgButton (hwnd, IDC_COMPOSEKEY, cfg.compose_key CheckDlgButton (hwnd, IDC_SCROLLDISP, cfg.scroll_on_dispreadytogo = 0;t beginbox(&cp, "Enable extra keyboard features:", IDC_BOX_KEYBOARD3, IDC_BOXT_KEYBOARD3); checkbox(&cp, "Application and AltGr ac&t as Compose key", IDC_COMPOSEKEYlp checkbox(&cp, "Reset scrollback on dis&play activity", IDC_SCROLLDISP", IDC_ALTSPACE); checkbox(&cp, "System menu appears on A< alone", IDC_ALTONLYALTONLYalt_only = IsDlgButtonChecked (hwnd, IDC_ALTONLYSCROLLDISPscroll_on_disp = IsDlgButtonChecked (hwnd, IDC_SCROLLDISP); break; case IDC_COMPOSEKEYcompose_key = IsDlgButtonChecked (hwnd, IDC_COMPOSEKEY); break; case IDC_WRAPMOD Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 86d4a9d7dde717b5279738fc0c041a06 Text-delta-base-sha1: 6ea5dedbbe2916f293f80aa22a91014b972a7c55 Text-content-length: 713 Text-content-md5: c386c87931534a8ec1dba50881689952 Text-content-sha1: 3c2d67bf9c6e178846b30fd200ae3bb4d7a5b895 Content-length: 753 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVN`7%WMmX8(cfg.compose_key) { if (wParam == VK_MENU && (HIWORD(lParam)&KF_EXTENDED)) { keystate[VK_RMENU] = keystate[VK_MENU]; if (!compose_state) compose_key = wParam; } if (wParam == VK_APPS && !compose_state) compose_key = wParam; if (wParam == compose_key) { if (compose_state == 0 && (HIWORD(lParam)&(KF_UP|KF_REPEAT))==0) compose_state = 1; else if (compose_state == 1 && (HIWORD(lParam)&KF_UP)) compose_state = 2; else compose_state = 0; } else if (compose_state==1 && wParam != VK_CONTROL) compose_state = 0; } else !cfg.alt_only) { if (message == WM_SYSKEYUP && wParam == VK_MENU) return 0; } Revision-number: 742 Prop-content-length: 419 Content-length: 419 K 8 svn:date V 27 2000-10-21T17:36:44.000000Z K 7 svn:log V 318 Fix a potential vulnerability in incoming `pscp -r'. The server sends filenames of things in the directory being copied. A malicious server could have sent, for example, "..\..\windows\system\foo.dll" and overwritten something crucial. The filenames are now vetted to ensure they don't contain slashes or backslashes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ff5ce49c0aec73b9e352054980be51f Text-delta-base-sha1: f8062ee006d191e61c7de22dbb156343a71c9e78 Text-content-length: 224 Text-content-md5: bf51d3c6fd4c006f3ab95d901ce41d61 Text-content-sha1: 10c3a6277315e8a7b19b9e6d8580ba316ef42c29 Content-length: 264 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNbL@K)N@Jchar *p; strcpy(t, targ); if (targ[0] != '\0') strcat(t, "/"); p = namebuf + strlen(namebuf); while (p > namebuf && p[-1] != '/' && p[-1] != '\\') p--; strcat(t, p Revision-number: 743 Prop-content-length: 608 Content-length: 608 K 8 svn:date V 27 2000-10-21T17:52:54.000000Z K 7 svn:log V 507 Ooh. Actually, that vulnerability is further-reaching than I thought. As well as the ".." attack in recursive copies, the name sent by the client was also trusted in a single-file implicit- destination copy such as "pscp host:foo .". (The result was ./foo, where foo is what the server claimed the file was rather than what the user asked for. I think it's not unreasonable that if the user requests file `foo' from the host, he should get the result in a file called `foo' no matter what the host thinks.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bf51d3c6fd4c006f3ab95d901ce41d61 Text-delta-base-sha1: 10c3a6277315e8a7b19b9e6d8580ba316ef42c29 Text-content-length: 289 Text-content-md5: b4f6d1ed8f7712d288f6b49c3d084781 Text-content-sha1: e5f91cb233d306d0350c37c4f56aa7c8308ecf1b Content-length: 329 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNL8)j7 ?I-I8v., char *src, char *src/* Security fix: ensure the file ends up where we asked for it. */ if (src) { char *p = src + strlen(src); while (p > src && p[-1] != '/' && p[-1] != '\\') p--; strcpy(namebuf, p); }, NULL, src Revision-number: 744 Prop-content-length: 716 Content-length: 716 K 8 svn:date V 27 2000-10-23T10:32:37.000000Z K 7 svn:log V 615 Created a shiny new abstraction for the socket handling. Has many advantages: - protocol modules can call sk_write() without having to worry about writes blocking, because blocking writes are handled in the abstraction layer and retried later. - `Lost connection while sending' is a thing of the past. - is no longer needed in most modules, because "putty.h" doesn't have to declare `SOCKET' variables any more, only the abstracted `Socket' type. - select()-equivalent between multiple sockets will now be handled sensibly, which opens the way for things like SSH port forwarding. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 737fe47d18c8108e0d59e474643f70d8 Text-delta-base-sha1: 3d399dca5445b8a8ba48a16a502918982db03bad Text-content-length: 851 Text-content-md5: 3fbd5c0551df6ba3b9db990c0f1644df Text-content-sha1: edfa17da2dad7de351ece913653c48cac93f6a2d Content-length: 891 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNm_h3 5.>?AW 4B9Da u} winnetwinnetMOBJ2 = tree234MOBJ2MOBJ2MOBJ2MOBJ2MOBJ2MOBJ2MOBJ2MOBJ2network.h win_res.h storage.h winstuff.h windlg.$(OBJ): windlg.c putty.h network.h ssh.h win_res.h winstuff.h winctrls.$(OBJ): winctrls.c winstuff.h winstuff.h settings.$(OBJ): settings.c putty.h network.h storage.h winstore.$(OBJ): winstore.c putty.h network.h storage.h terminal.$(OBJ): terminal.c putty.h network.h sizetip.$(OBJ): sizetip.c putty.h network.h winstuff.h telnet.$(OBJ): telnet.c putty.h network.h raw.$(OBJ): raw.c putty.h network.h xlat.$(OBJ): xlat.c putty.h network.h ldisc.$(OBJ): ldisc.c putty.h network.h misc.$(OBJ): misc.c putty.h network.h noise.$(OBJ): noise.c putty.h network.h ssh.h storage.h ssh.$(OBJ): ssh.c ssh.h putty.h networknetworknetwork Node-path: putty/be_all.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 26dbb7fabd32ad3faf6b85e8bbfc1d47 Text-delta-base-sha1: 0285d2f9810b725cd7372c90b4bb0ecae2ebfc33 Text-content-length: 19 Text-content-md5: 966c57698ec7ef2d38f468b5d79d2288 Text-content-sha1: 3a5e64fc1c9bf88d3d70c3f4bdc995c3bdbb9290 Content-length: 58 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN)BqQX Node-path: putty/be_none.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 346f27ff380ce78670807b79d7178af2 Text-delta-base-sha1: 0cbf50e171a92d2173e7ea5fc8248c8048e338e1 Text-content-length: 20 Text-content-md5: 3436475773e0696a6d0ea7684f754a7a Text-content-sha1: b2c1b730c0d26cf7679fbb344bfa54d11ab9839e Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNAZ $6 Node-path: putty/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8b4b0855dfab78cce4d8dc1350d81d3e Text-delta-base-sha1: 076d9db8bd257f9f33dad6bc41e7c9efe6bc6bbe Text-content-length: 19 Text-content-md5: 325b9d2fe6a49a5be846c18d623dc30f Text-content-sha1: e72246e551cd96e343541fc554d25ee9aa052669 Content-length: 58 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN;TqcX Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 97fe00b3bf36e5e8fb03adb436ceafc2 Text-delta-base-sha1: 25ee10ce609e18683197d28a5081c30b94bbeb84 Text-content-length: 36 Text-content-md5: bc11cd7c99432343be3c18b1bf560e6c Text-content-sha1: ba5d2cc2b98ce2356f29ec44a798e6d700c9e710 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN1{#include Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 27a1c7e2ab354f50f6478c917c0f8496 Text-delta-base-sha1: aa040c327af04ab63f7a96a03e858c72c3ed0fe2 Text-content-length: 36 Text-content-md5: ab578a31f34832dd9c50050f61d90546 Text-content-sha1: 4ac02d988b448735267b084b9e51060fe9e1d6bb Content-length: 75 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNq v{#include Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4c2c2340e075881372a74e7abff58684 Text-delta-base-sha1: 295d70d0859f2ea28ae326f039b712b104466d1c Text-content-length: 19 Text-content-md5: 60103424cb3387a33ab91b692f89f8d8 Text-content-sha1: ad6f640c289f74ffc8dbd9331482c822a8700619 Content-length: 59 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN&?iVP Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c1bb86562737c5d0a9449409d0c3a416 Text-delta-base-sha1: e9871be946da75adcf35c8de1319f872ecae165b Text-content-length: 2998 Text-content-md5: 8cb0394e0ac72ad4634f850c92b05581 Text-content-sha1: 8c8b3c7c7de56fdac10612e80e2588745b71dc33 Content-length: 3038 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN.N$6KWXlPstorage.h" #include "tree234WSAEVENT netevent, eventback && idata->len > 0) { SetEvent(idata->event); WaitForSingleObject(idata->eventback, INFINITEchar *do_select(SOCKET skt, int startup) { int events; if (startup) { events = FD_READ | FD_WRITE | FD_OOB | FD_CLOSE; } else { events = 0; } if (WSAEventSelect (skt, netevent, events) == SOCKET_ERROR) { switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "WSAAsyncSelect(): unknown error"; } } return NULLstdinevent; HANDLE handles[2]; DWORD threadid; struct input_data idata; int sending; int portnumber = -1; SOCKET *sklist; int skcount, sksize; int connopen; ssh_get_password = get_password; sklist = NULL; skcount = sksize = 0 sk_init(); /* * Start up the connection. */ netevent = CreateEvent(NULL, FALSE, FALSE, NULL); { char *error; char *realhost; error = back->init ( connopen = 1; data.eventback = CreateEvent(NULL, FALSE, FALSE, NULL) enum234 e; SOCKET socket; extern SOCKET first_socket(enum234 *), next_socket(enum234 *); extern int select_result(WPARAM, LPARAM); int i; /* * We must not call select_result() for any socket * until we have finished enumerating within the tree. * This is because select_result() may close the socket * and modify the tree. */ /* Count the active sockets. */ i = 0; for (socket = first_socket(&e); socket != INVALID_SOCKET; socket = next_socket(&e)) i++; /* Expand the buffer if necessary. */ if (i > sksize) { sksize = i+16; sklist = srealloc(sklist, sksize * sizeof(*sklist)); } /* Retrieve the sockets into sklist. */ skcount = 0; for (socket = first_socket(&e); socket != INVALID_SOCKET; socket = next_socket(&e)) { sklist[skcount++] = socket; } /* Now we're done enumerating; go through the list. */ for (i = 0; i < skcount; i++) { WPARAM wp; socket = sklist[i]; wp = (WPARAM)socket; if (!WSAEnumNetworkEvents(socket, netevent, &things)) { if (things.lNetworkEvents & FD_READ) connopen &= select_result(wp, (LPARAM)FD_READ); if (things.lNetworkEvents & FD_CLOSE) connopen &= select_result(wp, (LPARAM)FD_CLOSE); if (things.lNetworkEvents & FD_OOB) connopen &= select_result(wp, (LPARAM)FD_OOB); if (things.lNetworkEvents & FD_WRITE) connopen &= select_result(wp, (LPARAM)FD_WRITE); } SetEvent(idata.eventback); } if (!connopen || back->socket() == NULL Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6c4ca714d6418ec1da7eceaeb52aa902 Text-delta-base-sha1: ec53ec257fa4623d7540104e0adf4fe89a336218 Text-content-length: 135 Text-content-md5: 3d3b22501ae2c2d247fd2db6671eab1f Text-content-sha1: 255698e5ef50b57c2e93896b116cbd143d343cd9 Content-length: 175 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN>kA]+sg__#ifndef PUTTY_PUTTY_H #define PUTTY_PUTTY_H #include "network.h"char *host, int port, char **realhostocket Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c357fe53d2e3cb37619bd59580c1de9e Text-delta-base-sha1: b7d811b8c8533ec2a41c9522d0298c16507d1ecc Text-content-length: 1016 Text-content-md5: e9301ded3cf0a9e115307276fba07f43 Text-content-sha1: 72b8d566d92cd0d599867a9564204ba2fcd00d86 Content-length: 1056 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN:f+Ag"!5y+f8vjzeNl#include #include #include ocket s = NULLc_write (char *buf, int len) { from_backend(0, buf, len); } static int raw_receive (Socket s, int urgent, char *data, int len) { if (!len) { /* Connection has closed. */ sk_close(s); s = NULL; return 0; } c_write(data, len); return 1; } /* * Called to set up the raw connection. * char *host, int port, char **realhost) { SockAddr addr; char *err; /* * Try to find host. */ addr = sk_namelookup(host, realhost); if ( (err = sk_addr_error(addr)) ) return err; if (port < 0) port = 23; /* default telnet port */ /* * Open socket. */ s = sk_new(addr, port, raw_receive); if ( (err = sk_socket_error(s)) ) return err; sk_addr_free(addr);Called to send data down the raw connection. */ static void raw_send (char *buf, int len) { if (s == NULL) return; sk_write(s, buf, lenocket Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b4f6d1ed8f7712d288f6b49c3d084781 Text-delta-base-sha1: e5f91cb233d306d0350c37c4f56aa7c8308ecf1b Text-content-length: 534 Text-content-md5: bd6c542f55fa9a148cd5c648b8defa8c Text-content-sha1: 595f4425f216c5c835a17a79a287df1a3cf8e2dc Content-length: 574 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN8=K 8V~~J~HgS|@8Be told what socket we're supposed to be using. */ static SOCKET scp_ssh_socket; char *do_select(SOCKET skt, int startup) { if (startup) scp_ssh_socket = skt; else scp_ssh_socket = INVALID_SOCKET; return NULL; } extern int select_result(WPARAM, LPARAM); FD_ZERO(&readfds); FD_SET(scp_ssh_socketselect_result((WPARAM)scp_ssh_socket, (LPARAM)if (scp_ssh_socketcp_ssh_socketselect_result((WPARAM)scp_ssh_socket, (LPARAM) sk_init Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4aa6b3457fc10914bb3adcc13bb59a67 Text-delta-base-sha1: 6e18c540ac2079dd7d07cd5ee9c7ba2492812a4b Text-content-length: 19 Text-content-md5: 1368ad46566c1eee3266ca89d1a20665 Text-content-sha1: bf266368e8c5d75f5e527f0795e9b2a6ea2427bc Content-length: 58 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNe~M14 Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a15965e45b7624f04ff7587afc8319b2 Text-delta-base-sha1: 7e2bc706af970bb7c7b2f246d61618c72c304899 Text-content-length: 36 Text-content-md5: d13c590b5509c022b3577956804328e1 Text-content-sha1: 44571f98c0839896da4698900d452a14acbc107e Content-length: 75 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN9R>{#include Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c357b7fdec1b292c89b931c26119c446 Text-delta-base-sha1: dd756c62c3eb04454086ec1189d0298af7f26dc7 Text-content-length: 3133 Text-content-md5: bc512d2988a5663323ef8562f71ce757 Text-content-sha1: 2a186d6d3b5eb1b5cb8727c3fa231964d2768173 Content-length: 3173 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVNIvO`6Q|8E3d 0It&{!~#Hd 5RBB*|epP.jpwktpiOz#include sk_close(s), \ s = NULLocket s = NULLk_write(s, k_write(s, unsigned char c) { static char *vsp; static char version[10]; static char vstring[80]; static char vlog[sizeof(vstring)+20]; static int i; crBegin; /* Search for the string "SSH-" in the input. */ i = 0; while (1) { static const int transS[] = { 1, 2, 2, 1 }; static const int transH[] = { 0, 0, 3, 0 }; static const int transminus[] = { 0, 0, 0, -1 }; if (c == 'S') i = transS[i]; else if (c == 'H') i = transH[i]; else if (c == '-') i = transminus[i]; else i = 0; if (i < 0) break; crReturn(1); /* get another character */ } strcpy(vstring, "SSH-"); vsp = vstring+4; i = 0; while (1) { crReturn(1); /* get another char */k_write(s, k_write(s, crFinish(0); } static void ssh_gotdata(unsigned char *data, int datalen) { crBegin; /* * To begin with, feed the characters one by one to the * protocol initialisation / selection function do_ssh_init(). * When that returns 0, we're done with the initial greeting * exchange and can move on to packet discipline. */ while (1) { int ret; if (datalen == 0) crReturnV; /* more data please */ ret = do_ssh_init(*data); data++; datalen--; if (ret == 0) break; } /* * We emerge from that loop when the initial negotiation is * over and we have selected an s_rdpkt function. Now pass * everything to s_rdpkt, and then pass the resulting packets * to the proper protocol handler. */ if (datalen == 0) crReturnV; while (1) { while (datalen > 0) { if ( s_rdpkt(&data, &datalen) == 0 ) { ssh_protocol(NULL, 0, 1); if (ssh_state == SSH_STATE_CLOSED) { return; } } } crReturnV; } crFinishV; } static int ssh_receive(Socket s, int urgent, char *data, int len) { if (!len) { /* Connection has closed. */ sk_close(s); s = NULL; return 0; } ssh_gotdata (data, len); return 1; }ockAddr addr; char *erraddr = sk_namelookup(host, realhost); if ( (err = sk_addr_error(addr)) ) return err; #ifdef FWHACK *realhost = FWhost; #endif /* * Open socket. */ s = sk_new(addr, port, ssh_receive); if ( (err = sk_socket_error(s)) ) return err; #ifdef FWHACK sk_write(s, "connect ", 8); sk_write(s, FWhost, strlen(FWhost)); { char buf[20]; sprintf(buf, " %d\n", FWport); sk_write(s, buf, strlen(buf)); } #endif return NULLwhile (inlen > 0) { int len = min(inlen, 512); send_packet(SSH1_CMSG_STDIN_DATA, PKT_INT, len, PKT_DATA, in, len, PKT_END); in += len; inlen -= len; }sk_close(s); s = NULL * * Returns an error message, or NULL on success. */ static char *ssh_init (ssh_send_ok = 0; p = connect_to_host(host, port, realhost); if (p != NULL) return p; return NULL;NULLocket Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b18f006f1b465dacaad438a220559772 Text-delta-base-sha1: e45ba504c50ae144f79e353407939dd63e2c42c1 Text-content-length: 1943 Text-content-md5: bc8a80961ae5486b66fc85291d8f548e Text-content-sha1: f0a44a1aa2de05093113e6029d3a91f5a1855d9d Content-length: 1983 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN;pg"^!NR(QNV'9|r.o w_]fHQ #include #include ocket s = NULLk_write(s, k_write(s, k_write(s, k_write(s, static int telnet_receive(Socket s, int urgent, char *data, int len) { if (!len) { /* Connection has closed. */ sk_close(s); s = NULL; return 0; } do_telnet_read (data, len); return 1; } /* * Called to set up the Telnet connectionchar *host, int port, char **realhost) { SockAddr addr; char *err; /* * Try to find host. */ addr = sk_namelookup(host, realhost); if ( (err = sk_addr_error(addr)) ) return err; if (port < 0) port = 23; /* default telnet port */ /* * Open socket. */ s = sk_new(addr, port, telnet_receive); if ( (err = sk_socket_error(s)) ) return err; sk_addr_free(addr);NULLk_write(s, q, p-q); while (p < buf+len && !iswritable((unsigned char)*p)) { sk_write(s, NULLk_write(s, NULL) return; b[0] = IAC; switch (code) { case TS_AYT: b[1] = AYT; sk_write(s, b, 2); break; case TS_BRK: b[1] = BREAK; sk_write(s, b, 2); break; case TS_EC: b[1] = EC; sk_write(s, b, 2); break; case TS_EL: b[1] = EL; sk_write(s, b, 2); break; case TS_GA: b[1] = GA; sk_write(s, b, 2); break; case TS_NOP: b[1] = NOP; sk_write(s, b, 2); break; case TS_ABORT: b[1] = ABORT; sk_write(s, b, 2); break; case TS_AO: b[1] = AO; sk_write(s, b, 2); break; case TS_IP: b[1] = IP; sk_write(s, b, 2); break; case TS_SUSP: b[1] = SUSP; sk_write(s, b, 2); break; case TS_EOR: b[1] = EOR; sk_write(s, b, 2); break; case TS_EOF: b[1] = xEOF; sk_write(s, b, 2); break; case TS_SYNCH: b[1] = DM; sk_write (s, b, 1); sk_write_oob (s, b+1, 1); k_write(s, b, 2); } break; } } static Socket Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f37a8ec2e7ff9acf9de203d75f70bec1 Text-delta-base-sha1: fcf3f7388279ce01b74b82363c9b56cce92bc08b Text-content-length: 254 Text-content-md5: 74d3b38bfdccfce1d9724f81e76d6c1f Text-content-sha1: c35d87edcfb177fa4d23e6acf465e6073a5866bb Content-length: 294 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN int n = 0; while (n + paste_pos < paste_len) { if (paste_buffer[paste_pos + n++] == '\r') break; } ldisc->send (paste_buffer+paste_pos, n); paste_pos += n; if (paste_pos < paste_len Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eaddc7ac01e96e2a4f3bc4e7c32f488b Text-delta-base-sha1: c592da485f11c7264df63aa82fd6c84b0ab2e365 Text-content-length: 22 Text-content-md5: ba3ee9ca6fbca7cb1b5613ee1747ce6f Text-content-sha1: a3a3ff71b02183c8a5d677d2436359e9c89b12e6 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVN' Be) Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c386c87931534a8ec1dba50881689952 Text-delta-base-sha1: 3c2d67bf9c6e178846b30fd200ae3bb4d7a5b895 Text-content-length: 825 Text-content-md5: 0afad1e0cc1128bf5db79c6fbd82fe6b Text-content-sha1: a4998472c23c13fd5ec4aa417b7697d925769e5c Content-length: 865 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVN7a)=.<lp<QTdW` sk_init();Set up, or shut down, an AsyncSelect. Called from winnet.c. */ char *do_select(SOCKET skt, int startup) { int msg, events; if (startup) { msg = WM_NETEVENT; events = FD_READ | FD_WRITE | FD_OOB | FD_CLOSE; } else { msg = events = 0; } if (!hwnd) return "do_select(): internal error (hwnd==NULL)"; if (WSAAsyncSelect (skt, hwnd, msg, events) == SOCKET_ERROR) { switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "WSAAsyncSelect(): unknown error"; } } return NULLstatic int reentering = 0; extern int select_result(WPARAM, LPARAM); int retret = select_result (pend_netevent_wParam, pend_netevent_lParam); reentering = 0; if (ret = Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9c324f2165f2ed7bc3187215e0031f20 Text-delta-base-sha1: 07a80b1184b69961fe4067ce37a6b0921c859b16 Text-content-length: 19 Text-content-md5: 3bd8efdf09fe94cd40ac7b6bfd53f361 Text-content-sha1: a8be8f0b47d54a3524b2a22c099dbc9ca15e916e Content-length: 58 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN(AxI_ Node-path: putty/xlat.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ee2d528cf048dbb211bcb6a868c6410c Text-delta-base-sha1: ba157279020632cb80d5f0cd0165f9d687820816 Text-content-length: 36 Text-content-md5: 8f2b57a888c7858b9564f1eb301afe1f Text-content-sha1: a9a8de4155c37d95d307c95a6a0057dafc0b7219 Content-length: 75 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNkp{#include Revision-number: 745 Prop-content-length: 716 Content-length: 716 K 8 svn:date V 27 2000-10-23T11:55:11.000000Z K 7 svn:log V 615 Created a shiny new abstraction for the socket handling. Has many advantages: - protocol modules can call sk_write() without having to worry about writes blocking, because blocking writes are handled in the abstraction layer and retried later. - `Lost connection while sending' is a thing of the past. - is no longer needed in most modules, because "putty.h" doesn't have to declare `SOCKET' variables any more, only the abstracted `Socket' type. - select()-equivalent between multiple sockets will now be handled sensibly, which opens the way for things like SSH port forwarding. K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1630 Text-content-md5: 0f4472ef2472f1e2a0915f0e4532e16b Text-content-sha1: c764f5fefec345e7dcb729b646771efbf86820e0 Content-length: 1746 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNPPP/* * Networking abstraction in PuTTY. * * The way this works is: a back end can choose to open any number * of sockets - including zero, which might be necessary in some. * It can register a function to be called when data comes in on * any given one, and it can call the networking abstraction to * send data without having to worry about blocking. The stuff * behind the abstraction takes care of selects and nonblocking * writes and all that sort of painful gubbins. * * If urgent data comes in on a socket, the back end will read and * discard up to the urgent pointer, then read the urgent byte and * send _that_ to the receiver function with `urgent' set. */ typedef struct Socket_tag *Socket; typedef struct SockAddr_tag *SockAddr; typedef int (*sk_receiver_t)(Socket s, int urgent, char *data, int len); void sk_init(void); /* called once at program startup */ SockAddr sk_namelookup(char *host, char **canonicalname); void sk_addr_free(SockAddr addr); Socket sk_new(SockAddr addr, int port, sk_receiver_t receiver); void sk_close(Socket s); void sk_write(Socket s, char *buf, int len); void sk_write_oob(Socket s, char *buf, int len); /* * Each socket abstraction contains a `void *' private field in * which the client can keep state. */ void sk_set_private_ptr(Socket s, void *ptr); void *sk_get_private_ptr(Socket s); /* * Special error values are returned from sk_namelookup and sk_new * if there's a problem. These functions extract an error message, * or return NULL if there's no problem. */ char *sk_addr_error(SockAddr addr); char *sk_socket_error(Socket addr); Node-path: putty/winnet.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 12529 Text-content-md5: 8bd95c003725ea8c505aa0945deab724 Text-content-sha1: 1639153637f78c172df5ba373a1a1ab7897d4ee8 Content-length: 12645 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNccc/* * Windows networking abstraction. */ #include #include #include #include "putty.h" #include "network.h" #include "tree234.h" #define BUFFER_GRANULE 512 struct Socket_tag { char *error; SOCKET s; sk_receiver_t receiver; void *private_ptr; struct buffer *head, *tail; int writable; int in_oob, sending_oob; }; struct SockAddr_tag { char *error; unsigned long address; }; struct buffer { struct buffer *next; int buflen, bufpos; char buf[BUFFER_GRANULE]; }; static tree234 *sktree; static int cmpfortree(void *av, void *bv) { Socket a = (Socket)av, b = (Socket)bv; unsigned long as = (unsigned long)a->s, bs = (unsigned long)b->s; if (as < bs) return -1; if (as > bs) return +1; return 0; } static int cmpforsearch(void *av, void *bv) { Socket b = (Socket)bv; unsigned long as = (unsigned long)av, bs = (unsigned long)b->s; if (as < bs) return -1; if (as > bs) return +1; return 0; } void sk_init(void) { sktree = newtree234(cmpfortree); } SockAddr sk_namelookup(char *host, char **canonicalname) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); unsigned long a; struct hostent *h; if ( (a = inet_addr(host)) == (unsigned long) INADDR_NONE) { if ( (h = gethostbyname(host)) == NULL) { DWORD err = WSAGetLastError(); ret->error = (err == WSAENETDOWN ? "Network is down" : err == WSAHOST_NOT_FOUND ? "Host does not exist" : err == WSATRY_AGAIN ? "Host not found" : "gethostbyname: unknown error"); } else { ret->error = NULL; memcpy (&a, h->h_addr, sizeof(a)); *canonicalname = h->h_name; } } else { *canonicalname = host; } ret->address = ntohl(a); return ret; } void sk_addr_free(SockAddr addr) { sfree(addr); } Socket sk_new(SockAddr addr, int port, sk_receiver_t receiver) { SOCKET s; SOCKADDR_IN a; DWORD err; char *errstr; Socket ret; extern char *do_select(SOCKET skt, int startup); /* * Create Socket structure. */ ret = smalloc(sizeof(struct Socket_tag)); ret->error = NULL; ret->receiver = receiver; ret->head = ret->tail = NULL; ret->writable = 1; /* to start with */ ret->in_oob = FALSE; /* * Open socket. */ s = socket(AF_INET, SOCK_STREAM, 0); ret->s = s; if (s == INVALID_SOCKET) { err = WSAGetLastError(); ret->error = (err == WSAENETDOWN ? "Network is down" : err == WSAEAFNOSUPPORT ? "TCP/IP support not present" : "socket(): unknown error"); return ret; } /* * Bind to local address. */ a.sin_family = AF_INET; a.sin_addr.s_addr = htonl(INADDR_ANY); a.sin_port = htons(0); if (bind (s, (struct sockaddr *)&a, sizeof(a)) == SOCKET_ERROR) { err = WSAGetLastError(); ret->error = (err == WSAENETDOWN ? "Network is down" : "bind(): unknown error"); return ret; } /* * Connect to remote address. */ a.sin_addr.s_addr = htonl(addr->address); a.sin_port = htons((short)port); if (connect (s, (struct sockaddr *)&a, sizeof(a)) == SOCKET_ERROR) { err = WSAGetLastError(); ret->error = (err == WSAENETDOWN ? "Network is down" : err == WSAECONNREFUSED ? "Connection refused" : err == WSAENETUNREACH ? "Network is unreachable" : err == WSAEHOSTUNREACH ? "No route to host" : "connect(): unknown error"); return ret; } /* Set up a select mechanism. This could be an AsyncSelect on a * window, or an EventSelect on an event object. */ errstr = do_select(s, 1); if (errstr) { ret->error = errstr; return ret; } add234(sktree, ret); return ret; } void sk_close(Socket s) { del234(sktree, s); do_select(s->s, 0); closesocket(s->s); free(s); } char *winsock_error_string(int error) { switch (error) { case WSAEACCES: return "Network error: Permission denied"; case WSAEADDRINUSE: return "Network error: Address already in use"; case WSAEADDRNOTAVAIL: return "Network error: Cannot assign requested address"; case WSAEAFNOSUPPORT: return "Network error: Address family not supported by protocol family"; case WSAEALREADY: return "Network error: Operation already in progress"; case WSAECONNABORTED: return "Network error: Software caused connection abort"; case WSAECONNREFUSED: return "Network error: Connection refused"; case WSAECONNRESET: return "Network error: Connection reset by peer"; case WSAEDESTADDRREQ: return "Network error: Destination address required"; case WSAEFAULT: return "Network error: Bad address"; case WSAEHOSTDOWN: return "Network error: Host is down"; case WSAEHOSTUNREACH: return "Network error: No route to host"; case WSAEINPROGRESS: return "Network error: Operation now in progress"; case WSAEINTR: return "Network error: Interrupted function call"; case WSAEINVAL: return "Network error: Invalid argument"; case WSAEISCONN: return "Network error: Socket is already connected"; case WSAEMFILE: return "Network error: Too many open files"; case WSAEMSGSIZE: return "Network error: Message too long"; case WSAENETDOWN: return "Network error: Network is down"; case WSAENETRESET: return "Network error: Network dropped connection on reset"; case WSAENETUNREACH: return "Network error: Network is unreachable"; case WSAENOBUFS: return "Network error: No buffer space available"; case WSAENOPROTOOPT: return "Network error: Bad protocol option"; case WSAENOTCONN: return "Network error: Socket is not connected"; case WSAENOTSOCK: return "Network error: Socket operation on non-socket"; case WSAEOPNOTSUPP: return "Network error: Operation not supported"; case WSAEPFNOSUPPORT: return "Network error: Protocol family not supported"; case WSAEPROCLIM: return "Network error: Too many processes"; case WSAEPROTONOSUPPORT: return "Network error: Protocol not supported"; case WSAEPROTOTYPE: return "Network error: Protocol wrong type for socket"; case WSAESHUTDOWN: return "Network error: Cannot send after socket shutdown"; case WSAESOCKTNOSUPPORT: return "Network error: Socket type not supported"; case WSAETIMEDOUT: return "Network error: Connection timed out"; case WSAEWOULDBLOCK: return "Network error: Resource temporarily unavailable"; case WSAEDISCON: return "Network error: Graceful shutdown in progress"; default: return "Unknown network error"; } } /* * The function which tries to send on a socket once it's deemed * writable. */ void try_send(Socket s) { while (s->head) { int nsent; DWORD err; int len, urgentflag; if (s->sending_oob) { urgentflag = MSG_OOB; len = s->sending_oob; } else { urgentflag = 0; len = s->head->buflen - s->head->bufpos; } nsent = send(s->s, s->head->buf + s->head->bufpos, len, urgentflag); if (nsent <= 0) { err = (nsent < 0 ? WSAGetLastError() : 0); if (err == WSAEWOULDBLOCK) { /* Perfectly normal: we've sent all we can for the moment. */ s->writable = FALSE; return; } else if (nsent == 0 || err == WSAECONNABORTED || err == WSAECONNRESET) { /* * FIXME. This will have to be done better when we * start managing multiple sockets (e.g. SSH port * forwarding), because if we get CONNRESET while * trying to write a particular forwarded socket * then it isn't necessarily the end of the world. * Ideally I'd like to pass the error code back to * somewhere the next select_result() will see it, * but that might be hard. Perhaps I should pass it * back to be queued in the Windows front end bit. */ fatalbox(winsock_error_string(err)); } else { fatalbox(winsock_error_string(err)); } } else { s->head->bufpos += nsent; if (s->sending_oob) s->sending_oob -= nsent; if (s->head->bufpos >= s->head->buflen) { struct buffer *tmp = s->head; s->head = tmp->next; free(tmp); if (!s->head) s->tail = NULL; } } } } void sk_write(Socket s, char *buf, int len) { /* * Add the data to the buffer list on the socket. */ if (s->tail && s->tail->buflen < BUFFER_GRANULE) { int copylen = min(len, BUFFER_GRANULE - s->tail->buflen); memcpy(s->tail->buf + s->tail->buflen, buf, copylen); buf += copylen; len -= copylen; s->tail->buflen += copylen; } while (len > 0) { int grainlen = min(len, BUFFER_GRANULE); struct buffer *newbuf; newbuf = smalloc(sizeof(struct buffer)); newbuf->bufpos = 0; newbuf->buflen = grainlen; memcpy(newbuf->buf, buf, grainlen); buf += grainlen; len -= grainlen; if (s->tail) s->tail->next = newbuf; else s->head = s->tail = newbuf; newbuf->next = NULL; s->tail = newbuf; } /* * Now try sending from the start of the buffer list. */ if (s->writable) try_send(s); } void sk_write_oob(Socket s, char *buf, int len) { /* * Replace the buffer list on the socket with the data. */ if (!s->head) { s->head = smalloc(sizeof(struct buffer)); } else { struct buffer *walk = s->head->next; while (walk) { struct buffer *tmp = walk; walk = tmp->next; free(tmp); } } s->head->next = NULL; s->tail = s->head; s->head->buflen = len; memcpy(s->head->buf, buf, len); /* * Set the Urgent marker. */ s->sending_oob = len; /* * Now try sending from the start of the buffer list. */ if (s->writable) try_send(s); } int select_result(WPARAM wParam, LPARAM lParam) { int ret; DWORD err; char buf[BUFFER_GRANULE]; Socket s; int atmark; /* wParam is the socket itself */ s = find234(sktree, (void *)wParam, cmpforsearch); if (!s) return 1; /* boggle */ if ((err = WSAGETSELECTERROR(lParam)) != 0) { fatalbox(winsock_error_string(err)); } switch (WSAGETSELECTEVENT(lParam)) { case FD_READ: ret = recv(s->s, buf, sizeof(buf), 0); if (ret < 0) { err = WSAGetLastError(); if (err == WSAEWOULDBLOCK) { break; } } if (ret < 0) { fatalbox(winsock_error_string(err)); } else { int type = s->in_oob ? 2 : 0; s->in_oob = FALSE; return s->receiver(s, type, buf, ret); } break; case FD_OOB: /* * Read all data up to the OOB marker, and send it to the * receiver with urgent==1 (OOB pending). */ atmark = 1; s->in_oob = TRUE; /* Some WinSock wrappers don't support this call, so we * deliberately don't check the return value. If the call * fails and does nothing, we will get back atmark==1, * which is good enough to keep going at least. */ ioctlsocket(s->s, SIOCATMARK, &atmark); ret = recv(s->s, buf, sizeof(buf), MSG_OOB); if (ret <= 0) { fatalbox(ret == 0 ? "Internal networking trouble" : winsock_error_string(WSAGetLastError())); } else { return s->receiver(s, atmark ? 2 : 1, buf, ret); } break; case FD_WRITE: s->writable = 1; try_send(s); break; case FD_CLOSE: /* Signal a close on the socket. */ return s->receiver(s, 0, NULL, 0); break; } return 1; } /* * Each socket abstraction contains a `void *' private field in * which the client can keep state. */ void sk_set_private_ptr(Socket s, void *ptr) { s->private_ptr = ptr; } void *sk_get_private_ptr(Socket s) { return s->private_ptr; } /* * Special error values are returned from sk_namelookup and sk_new * if there's a problem. These functions extract an error message, * or return NULL if there's no problem. */ char *sk_addr_error(SockAddr addr) { return addr->error; } char *sk_socket_error(Socket s) { return s->error; } /* * For Plink: enumerate all sockets currently active. */ SOCKET first_socket(enum234 *e) { Socket s = first234(sktree, e); return s ? s->s : INVALID_SOCKET; } SOCKET next_socket(enum234 *e) { Socket s = next234(e); return s ? s->s : INVALID_SOCKET; } Revision-number: 746 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 Remove the NO_SECURITY define I accidentally copied from Pageant K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-23T11:57:41.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f282de70e8a243c797375a538e928711 Text-delta-base-sha1: 5838dda2e34fd3c8b99085cfc4d5b91425b100d2 Text-content-length: 22 Text-content-md5: ebef51a7907185cdd48cab5f8d6591fd Text-content-sha1: d6e972c4107549c8cbf7f0f210f003034bdd39eb Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNQ" j8 Revision-number: 747 Prop-content-length: 279 Content-length: 279 K 8 svn:date V 27 2000-10-23T12:20:53.000000Z K 7 svn:log V 178 Plink and PSCP were failing to load the `Default Settings' options when connecting to an arbitrary hostname. In particular, setting a default user name didn't work. Now it does. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8cb0394e0ac72ad4634f850c92b05581 Text-delta-base-sha1: 8c8b3c7c7de56fdac10612e80e2588745b71dc33 Text-content-length: 169 Text-content-md5: 7870abd33db5d55787e73d762b3fca83 Text-content-sha1: 1122cbdf50167045e7904012468732ff1065e3e9 Content-length: 209 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNvJ d])3CConfig cfg2; do_defaults (p, &cfg2); if (cfg2 else cfg = cfg2; Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd6c542f55fa9a148cd5c648b8defa8c Text-delta-base-sha1: 595f4425f216c5c835a17a79a287df1a3cf8e2dc Text-content-length: 56 Text-content-md5: a1d3f027fb5ff88ce624a95cf71d20dd Text-content-sha1: cc6039617f250e99f2395246f39922f709fbc46b Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN' y do_defaults(NULL, &cfg); Revision-number: 748 Prop-content-length: 228 Content-length: 228 K 8 svn:date V 27 2000-10-23T12:31:54.000000Z K 7 svn:log V 127 Oops. A field like `sending_oob' in the Socket structure really deserves to be initialised to something sane at creation time. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8bd95c003725ea8c505aa0945deab724 Text-delta-base-sha1: 1639153637f78c172df5ba373a1a1ab7897d4ee8 Text-content-length: 45 Text-content-md5: 65116cdf85e98128c1c415c987b95f01 Text-content-sha1: 62c65a04edfb534beec09f832e9d3cb09047c452 Content-length: 84 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNc} zkx ret->sending_oob = 0 Revision-number: 749 Prop-content-length: 273 Content-length: 273 K 8 svn:date V 27 2000-10-23T15:18:37.000000Z K 7 svn:log V 172 Fix a bug which was causing occasional failed-host-key-check messages. Also left some diagnostics in, under #if 0, so that next time this happens it'll be easier to debug. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5aa5e5915bd7875d9d91057aeb95924d Text-delta-base-sha1: beb40c820be2ad91aa8ac6f43583c93448b30399 Text-content-length: 1742 Text-content-md5: 4cdb7054d20a763494d8402c14b60c7b Text-content-sha1: 2bff4f8d19a49c28f8f640871a64148a1ee009bb Content-length: 1781 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNzKw{<yNT5}6 7rE)7,V8|DS1Y@]#if 0 #define DEBUG_DSS /* * Condition this section in for debugging of DSS. */ static void diagbn(char *prefix, Bignum md) { int i, nibbles, morenibbles; static const char hex[] = "0123456789ABCDEF"; printf("%s0x", prefix ? prefix : ""); nibbles = (3 + ssh1_bignum_bitcount(md))/4; if (nibbles<1) nibbles=1; morenibbles = 4*md[0] - nibbles; for (i=0; i> (4*(i%2))) & 0xF]); if (prefix) putchar('\n'); } #else #define diagbn(x,y) #endifwhile (b[0] > 1 && b[b[0]] == 0) b[0]--; return b; } static Bignum get160 #ifdef DEBUG_DSS { int i; printf("key:"); for (i=0;i 1 && result[result[0]] == 0) result[0]-- return resultBignum modmul(Bignum p, Bignum q, Bignum mod Bignum resultresult = newbn(mod[0]); for (i = 0; i < mlen; i++) result[result[0] - i] = a[i+2*pqlen-mlen]; while (result[0] > 1 && result[result[0]] == 0) result[0]-- return result; } /* * Compute p Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: be3c0898554db1461de4ae85cb98cca5 Text-delta-base-sha1: 22ef7d201c0327ba7bfdfcaf555f822e62802a9b Text-content-length: 73 Text-content-md5: 6c7ed7977d8e97cd509b8b8430cc3752 Text-content-sha1: 000b473d71937504c3bf8023fe2ab052487744ae Content-length: 112 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN?, 3h modpow(G, x, PK = modpow(f, x, P); return K; } Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b1017a70f5c15681c0e3899c3d65d3bf Text-delta-base-sha1: 8310d8c28488002cca70984d520a64cab19e6f30 Text-content-length: 387 Text-content-md5: b3b6ded244955f144cb8c3d1a189f02b Text-content-sha1: b7098af5b14829424d0be097532a300bcb2948ce Content-length: 426 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN0H&Q\xfpxU]h: Gigu1p, yu2p, gu1yu2pu1 = modmul(sha, w, dss_qmodmul(r, w, dss_qgu1p = modpow(dss_g, u1, dss_p); diagbn("gu1p=", gu1p); yu2p = modpow(dss_y, u2, dss_p); diagbn("yu2p=", yu2p); gu1yu2p = modmul(gu1p, yu2p, dss_p); diagbn("gu1yu2p=", gu1yu2p); v = modmul(gu1yu2p, One, dss_qgu1p); freebn(yu2p); freebn(gu1yu2p Node-path: putty/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 856fe1055ee11164f67ef33c43910134 Text-delta-base-sha1: b88785d9797a136ba6c2848a1bb820b182863bc8 Text-content-length: 63 Text-content-md5: 7e04946d47896ab41ba7f30ac201d826 Text-content-sha1: b264d23d5ed9d14fe875e8de5d69ee173fb2beb2 Content-length: 102 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN]$EHmodpow(w, q, modmul(wqp, wqp, p Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0319148739f524bb874962154352c9ae Text-delta-base-sha1: ab732cf1fd0ee2726d02245df1a69b0a7da8c689 Text-content-length: 124 Text-content-md5: fcb46dc9597aa9cf7e8166d1e695f09f Text-content-sha1: 787c233ac4c526f05e7cbf62da3dbad678699a0b Content-length: 164 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN]*\E@XB:#b2 = modpow(b1, key->exponent, key->modulusmodpow(input, key->private_exponent, key->modulus Revision-number: 753 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2000-10-24T09:49:03.000000Z K 7 svn:log V 39 Window resizing wasn't working in SSH2 K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bc512d2988a5663323ef8562f71ce757 Text-delta-base-sha1: 2a186d6d3b5eb1b5cb8727c3fa231964d2768173 Text-content-length: 718 Text-content-md5: ec7cf28a253345c074553f505a038ebd Text-content-sha1: 048bd308020d3b9578acb7075e0a7ad01ec92c00 Content-length: 758 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNvW,`p^@@H5Tm*L ssh_state = SSH_STATE_INTERMEDssh_state = SSH_STATE_SESSION; if (size_needed) ssh_size();SSH if (ssh_version == 1) { send_packet(SSH1_CMSG_WINDOW_SIZE, PKT_INT, rows, PKT_INT, cols, PKT_INT, 0, PKT_INT, 0, PKT_END); } else { ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUESTaddstring("window-change"); ssh2_pkt_addbool(0); ssh2_pkt_adduint32(cols); ssh2_pkt_adduint32(rows); ssh2_pkt_adduint32(0); ssh2_pkt_adduint32(0); ssh2_pkt_send(); } Revision-number: 754 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2000-10-24T09:55:45.000000Z K 7 svn:log V 69 SSH2 connections weren't closing cleanly after socket revamp. Fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ec7cf28a253345c074553f505a038ebd Text-delta-base-sha1: 048bd308020d3b9578acb7075e0a7ad01ec92c00 Text-content-length: 232 Text-content-md5: 71ab2c5870f1a6b6145cdcb75f3ea573 Text-content-sha1: 59a5c8bfd724bd17fd2a20a583ad71c35c5ee206 Content-length: 272 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVNWx%5WRaKl*?if (ssh_state == SSH_STATE_CLOSED) { if (s) { sk_close(s); s = NULL; } return 0; } crReturnV crReturnVcrReturnV Revision-number: 755 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2000-10-24T10:47:49.000000Z K 7 svn:log V 60 Fix miscellaneous compiler warnings. Thanks to Jacob Nevins K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f4472ef2472f1e2a0915f0e4532e16b Text-delta-base-sha1: c764f5fefec345e7dcb729b646771efbf86820e0 Text-content-length: 77 Text-content-md5: fc6809695384f88c6348a3813111d238 Text-content-sha1: ff45bedd0d86d79532c5b022de66631824e56a12 Content-length: 116 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNP 7))'#ifndef PUTTY_NETWORK_H #define PUTTY_NETWORK_H #endif Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ecf4a6312aa5aca17048527d2660ffa6 Text-delta-base-sha1: f699b4e68c9b58f5f421f3b0d578f7fcb9e9dd30 Text-content-length: 50 Text-content-md5: 5a7296406964d8a37fe284c0859cff5c Text-content-sha1: dd5bc11833626634845996acb9cb38739bff3c11 Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNIp B #include |blibvoid connection_fatal Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ebef51a7907185cdd48cab5f8d6591fd Text-delta-base-sha1: d6e972c4107549c8cbf7f0f210f003034bdd39eb Text-content-length: 38 Text-content-md5: 52f8eb82340c9e89284b4124fd4ad093 Text-content-sha1: eebfaa72aba8b207bac35804459fb01e7eb983ce Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN"6 {+w#include #include #include #include #include #include option == TELOPT_ECHO && cfg.ldisc_term) ldisc = enabled ? &ldisc_simple : &ldisc_termoption_side_effects(o, 1)option_side_effects(o, 0) option_side_effects(*o, 0 Revision-number: 757 Prop-content-length: 153 Content-length: 153 K 7 svn:log V 53 Add the Appearance panel and reorganise things a bit K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-24T13:38:27.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ba3ee9ca6fbca7cb1b5613ee1747ce6f Text-delta-base-sha1: a3a3ff71b02183c8a5d677d2436359e9c89b12e6 Text-content-length: 1396 Text-content-md5: ca6c03880325006b7b9d75f8e8cbbd67 Text-content-sha1: 3c7dd1ea45ed9f3d8b2368d9db45de7b0b0542a4 Content-length: 1436 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVN'{k{yg|-y94tu7HOtu& ] MaWAtu\${\wcPE~0B WRAPMODE, IDC_DECOMSCROLLBARappearancepanelstart, IDC_TITLE_APPEARANCE, IDC_BOX_APPEARANCE1, IDC_BOXT_APPEARANCE1, IDC_BOX_APPEARANCE2, IDC_BOXT_APPEARANCE2, IDC_BOX_APPEARANCE3, IDC_BOXT_APPEARANCE3, IDC_BLINKCUR, IDC_FONTSTATIC, IDC_CHOOSEFONT, IDC_WINTITLE, IDC_WINEDIT, IDC_WINNAME, appearance&dlbenuthe terminal emulation", IDC_TITLE_TERMINAL); beginbox(&cp, "Set various terminal options", IDC_BOX_TERMINAL1, IDC_BOXT_TERMINAL1bsdkw4ylpPuTTY's window", IDC_TITLE_WINDOW); beginbox(&cp, "Set the size of the window", IDC_BOX_WINDOW1, IDC_BOXT_WINDOWControl the scrollback in the window", IDC_BOX_WINDOW2, IDC_BOXT_WINDOW23 /* The Appearance panel. Accelerators used: [acgo] rmkhtiPuTTY's appearancecursor", IDC_BOX_APPEARANCE1, IDC_BOXT_APPEARANCE1); checkbox(&cp, "Cursor &blinks", IDC_BLINKCURAPPEARANCE2, IDC_BOXT_APPEARANCEAdjust the use of the window title", IDC_BOX_APPEARANCE3, IDC_BOXT_APPEARANCE3 treeview_insert(&tvfaff, 1, "AppearanceAppearance")) hide(hwnd, FALSE, appearancepanelstart, appearance Revision-number: 758 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2000-10-24T13:39:21.000000Z K 7 svn:log V 26 Remove a rogue diagnostic K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ca6c03880325006b7b9d75f8e8cbbd67 Text-delta-base-sha1: 3c7dd1ea45ed9f3d8b2368d9db45de7b0b0542a4 Text-content-length: 24 Text-content-md5: 72229f5c4997a5160bfd3173e5ce970b Text-content-sha1: 01fa968404acf2b0b71fdd73f0f51515a3d98b54 Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVNu p Revision-number: 759 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2000-10-24T13:40:19.000000Z K 7 svn:log V 40 Add a couple of ellipses in system menu K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 34b34b6b5a41e499e5df94e17925228d Text-delta-base-sha1: 8a4cf392fa724856b51b16fdd3ac05611d543934 Text-content-length: 36 Text-content-md5: 0b6e774fad9578660f94855a2c75b9ed Text-content-sha1: b01b11c4957a498ba5e58efdca4207414460e01e Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVN+1fpfUV...... Revision-number: 760 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2000-10-24T13:49:23.000000Z K 7 svn:log V 74 Add configurable option to disable application keypad/cursor keys totally K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d8167b5c2b015d1df36599bf629f6b05 Text-delta-base-sha1: 2f0d0916077a89b5f4e2e8e75f6e622195631f02 Text-content-length: 92 Text-content-md5: a4ba8d00e6eee18fe0548912f2aeb635 Text-content-sha1: 3c0c2c4dbb7138f58073c015d8daa733ac6a9510 Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVN2 F-F$no_applic; /* totally disable application modes */ Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 624f1ab6d860e42ef1287c3f6bd4e39f Text-delta-base-sha1: 0278024206a0f1190c01bb24ffd4495a5f2b1274 Text-content-length: 99 Text-content-md5: 00f94e011a7ce3d94f6ceb4724837356 Text-content-sha1: b6e1ac5d2fec94b8d06137854c094058a993c152 Content-length: 139 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNH!fDNNoApplicationKeys", cfg->no_applicNoApplicationKeys", 0, &cfg->no_applic Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 72229f5c4997a5160bfd3173e5ce970b Text-delta-base-sha1: 01fa968404acf2b0b71fdd73f0f51515a3d98b54 Text-content-length: 386 Text-content-md5: 5356da682c26e6319384893710bafa66 Text-content-sha1: bb036db8f153511e3e061580bcaa2e2a1c4d6c1c Content-length: 426 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVNuv(L<[2qdKW?:;NOAPPLICDlgButton (hwnd, IDC_NOAPPLIC, cfg.no_applicApplication keypad settings:", IDC_BOX_KEYBOARD2, IDC_BOXT_KEYBOARD2); checkbox(&cp, "Application ke&ypad and cursor keys totally disabled", IDC_NOAPPLICNOAPPLICno_applic = IsDlgButtonChecked (hwnd, IDC_NO Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0b6e774fad9578660f94855a2c75b9ed Text-delta-base-sha1: b01b11c4957a498ba5e58efdca4207414460e01e Text-content-length: 226 Text-content-md5: 8e47c6badbc81f933d7fcda605f016f7 Text-content-sha1: 06d362c65076ad2a03075869100315ee4cfde20f Content-length: 266 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVN1()+H2=ek``0@Ap (cfg.funky_type <= 1 && app_keypad_keys && !cfg.no_applic!cfg.no_applic app_keypad_keys && !cfg.no_applic && !cfg.no_applic && !cfg.no_applic Revision-number: 761 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2000-10-24T21:43:39.000000Z K 7 svn:log V 68 Fix another bignum formatting problem. This one hit Diffie-Hellmann K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 71ab2c5870f1a6b6145cdcb75f3ea573 Text-delta-base-sha1: 59a5c8bfd724bd17fd2a20a583ad71c35c5ee206 Text-content-length: 66 Text-content-md5: 9ab3112f896b56677e5561f5b21c7ba1 Text-content-sha1: ec59644ce5eceec1babcdbacdff237383f5895e3 Content-length: 106 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVNx% (*S%while (b[0] > 1 && b[b[0]] == 0) b[0]--; Revision-number: 762 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2000-10-25T06:57:36.000000Z K 7 svn:log V 56 Enhance Diffie-Hellman implementation to use bignum_cmp K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6c7ed7977d8e97cd509b8b8430cc3752 Text-delta-base-sha1: 000b473d71937504c3bf8023fe2ab052487744ae Text-content-length: 297 Text-content-md5: c3e695fb3878afc49cf87a9c85562c80 Text-content-sha1: b4a943d74569bf75645cfd2c53fdcdc42022b0f3 Content-length: 336 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN,B nvD'do { /* * Create a potential x, by ANDing a string of random bytes * with Qmask. */ for (i = 1; i <= x[0]; i++) x[i] = ((random_byte() << 8) + random_byte()) & Qmask[i]; } while (bignum_cmp(x, One) <= 0 || bignum_cmp(x, Q) >= 0);return modpow(f, x, P); } Revision-number: 763 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2000-10-25T06:59:25.000000Z K 7 svn:log V 26 Reintroduce random_stir() K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7252dccd57878f415886e0d0ba918129 Text-delta-base-sha1: 62038fc650e93fe20b13e98fe4f73481216f478f Text-content-length: 37 Text-content-md5: 845f3d21f3f1ab40964875e34dd33034 Text-content-sha1: 22ad0002be6b2c393e267355c147ca9a5f45c042 Content-length: 76 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN7J >|; random_stir( Revision-number: 764 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2000-10-25T08:23:41.000000Z K 7 svn:log V 71 Fix control ID bug causing rogue Appearance title bars in other panels K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5356da682c26e6319384893710bafa66 Text-delta-base-sha1: bb036db8f153511e3e061580bcaa2e2a1c4d6c1c Text-content-length: 36 Text-content-md5: bd958f858b87ec4bb36233bb3be5ee5a Text-content-sha1: d8c6e3083f85864008a3aa4173a076d832268d76 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVNvz D,JAPPEARANCE Revision-number: 765 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Be more sure that state->collecting_entropy can't be spuriously set K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-25T10:25:10.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 52f8eb82340c9e89284b4124fd4ad093 Text-delta-base-sha1: eebfaa72aba8b207bac35804459fb01e7eb983ce Text-content-length: 238 Text-content-md5: f62af739a6b28215a0fc0a7a36a4ecf2 Text-content-sha1: 7f97f9c7504d59d4cd178469de089e7b796befbc Content-length: 278 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN6VDptZdkvcollecting_entropy = FALSE; state->entropy = NULL && state->entropy && state->entropy_got < state->entropy_required state->collecting_entropy = FALSE Revision-number: 766 Prop-content-length: 420 Content-length: 420 K 8 svn:date V 27 2000-10-25T14:20:47.000000Z K 7 svn:log V 319 Gaaah, I might have known. Split combined app cursor / app keypad disablement option into two options so the app cursor keys and app keypad can be controlled separately. The Pedantic Software Award in this case goes to the Midnight Commander for its egregious failure to just use the terminal in Perfectly Normal mode. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a4ba8d00e6eee18fe0548912f2aeb635 Text-delta-base-sha1: 3c0c2c4dbb7138f58073c015d8daa733ac6a9510 Text-content-length: 152 Text-content-md5: 5904e9d775189f7d4634ae3d14abe055 Text-content-sha1: 0f8de93b8e265a884a9da9f092fa97ab21dc9f0f Content-length: 192 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNG 6p_c; /* totally disable app cursor keys */ int no_applic_k; /* totally disable app keypad Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 00f94e011a7ce3d94f6ceb4724837356 Text-delta-base-sha1: b6e1ac5d2fec94b8d06137854c094058a993c152 Text-content-length: 171 Text-content-md5: 5e69066ee6b2d9e9131c8e030564a8a9 Text-content-sha1: 27fa2e53ba6707f55275c9e263ffcfc7bbdebe80 Content-length: 211 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN" CJ BCEN_k); write_setting_i (sesskey, "NoApplicationCursors", cfg->no_applic__k); gppi (sesskey, "NoApplicationCursors", 0, &cfg->no_applic_ Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd958f858b87ec4bb36233bb3be5ee5a Text-delta-base-sha1: d8c6e3083f85864008a3aa4173a076d832268d76 Text-content-length: 535 Text-content-md5: 92d0cb907d42b343076c7d0448f2ae47 Text-content-sha1: 430bcdac446af055568f871af9a5792bbb813ca8 Content-length: 575 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVNzxHADyCMKs~zZA~7a=200 to be generated correctly, and I thought 256 was a nice round number beyond that just to be sure. Perhaps I should also have a security warning on any key less than 768; or perhaps I should let people shoot themselves in the feet if they really want to. K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f62af739a6b28215a0fc0a7a36a4ecf2 Text-delta-base-sha1: 7f97f9c7504d59d4cd178469de089e7b796befbc Text-content-length: 860 Text-content-md5: e4e2c22cac2432cd0b8361b0c4b0d32d Text-content-sha1: be94448ee1096c8ef2d94c550310b97e90594b4b Content-length: 900 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNV=j=vYtbBOOL ok; state->keysize = GetDlgItemInt(hwnd, IDC_BITS, &ok, FALSE); if (!ok) state->keysize = DEFAULT_KEYSIZE; if (state->keysize < 256) { int ret = MessageBox(hwnd, "PuTTYgen will not generate a key" " smaller than 256 bits.\n" "Key length reset to 256. Continue?", "PuTTYgen Warning", MB_ICONWARNING | MB_OKCANCEL); if (ret != IDOK) break; state->keysize = 256; SetDlgItemInt(hwnd, IDC_BITS, 256, FALSE); } Revision-number: 768 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2000-10-26T08:25:43.000000Z K 7 svn:log V 77 Fix a segfault (addr->error was unpredictable following a dotted-dec lookup) K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0fd0c0be69a435076caff5015465b72d Text-delta-base-sha1: e943bd1cac955e4ec0344ed0ba1d1861ee9b6694 Text-content-length: 44 Text-content-md5: 1616b44c9d46d97c1303710c59e07e58 Text-content-sha1: 78790ed6604262ebe579c66e3586e853def0427b Content-length: 83 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNsrphkkret->error = NULL; Revision-number: 769 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:23.916857Z PROPS-END Revision-number: 770 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2000-10-26T13:10:47.000000Z K 7 svn:log V 90 Format SSH2_MSG_DISCONNECT correctly (with reason code, reason string, and language tag). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9ab3112f896b56677e5561f5b21c7ba1 Text-delta-base-sha1: ec59644ce5eceec1babcdbacdff237383f5895e3 Text-content-length: 913 Text-content-md5: c9f01715c924aaa0c7a68cf34f8864ba Text-content-sha1: 60122540d437a64c1f61312b43bbf09fbf495125 Content-length: 953 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVN%BmV<rD1 DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1 /* 0x1 */ #define SSH2_DISCONNECT_PROTOCOL_ERROR 2 /* 0x2 */ #define SSH2_DISCONNECT_KEY_EXCHANGE_FAILED 3 /* 0x3 */ #define SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED 4 /* 0x4 */ #define SSH2_DISCONNECT_MAC_ERROR 5 /* 0x5 */ #define SSH2_DISCONNECT_COMPRESSION_ERROR 6 /* 0x6 */ #define SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE 7 /* 0x7 */ #define SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8 /* 0x8 */ #define SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9 /* 0x9 */ #define SSH2_DISCONNECT_CONNECTION_LOST 10 /* 0xa */ #define SSH2_DISCONNECT_BY_APPLICATION 11 /* 0xbadduint32(SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring("All open channels closed"); ssh2_pkt_addstring("en"); /* language tag */ Revision-number: 771 Prop-content-length: 114 Content-length: 114 K 7 svn:log V 14 Misc bugfixes K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-27T09:17:19.000000Z PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a1d3f027fb5ff88ce624a95cf71d20dd Text-delta-base-sha1: cc6039617f250e99f2395246f39922f709fbc46b Text-content-length: 85 Text-content-md5: 81de2179fb65d06546ef76f0a544a523 Text-content-sha1: 5729f7aece31c6ee8df88537e5377f509cf659d6 Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN'{,E9P wback->socket() != NULLback->socket() != NULL Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c9f01715c924aaa0c7a68cf34f8864ba Text-delta-base-sha1: 60122540d437a64c1f61312b43bbf09fbf495125 Text-content-length: 28 Text-content-md5: 43d663c8c63828bd9399ffecd377920a Text-content-sha1: 03d752d7dfb5d059d31965ba1afd6bec0f65357f Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVNBD 44kt Revision-number: 772 Prop-content-length: 163 Content-length: 163 K 7 svn:log V 63 Stop the "Sent username %s" message coming up twice in pscp -v K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-27T09:24:32.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 43d663c8c63828bd9399ffecd377920a Text-delta-base-sha1: 03d752d7dfb5d059d31965ba1afd6bec0f65357f Text-content-length: 399 Text-content-md5: 0657b2f486e79d19bbc8f6a7e49cdd89 Text-content-sha1: 2f9223b594285e4a59512004b4ec671378b809a5 Content-length: 439 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVND@ldUo.)strncpy(username, cfg.username, 99); username[99] = '\0';2+sizeof(username)]; sprintf(userlog, "Sent username \"%s\"", username); logevent(userlog); if (flags & FLAG_INTERACTIVE && (!((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)))) { strcat(userlog, "\r\n"); c_write(userlog, strlen(userlog)); } Revision-number: 773 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2000-10-27T09:46:04.000000Z K 7 svn:log V 65 Add support for Always On Top. Patch due to Janes "Ender" Brown. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5904e9d775189f7d4634ae3d14abe055 Text-delta-base-sha1: 0f8de93b8e265a884a9da9f092fa97ab21dc9f0f Text-content-length: 32 Text-content-md5: 5d0afdf5ca8fad4d5e072a8d125b2da8 Text-content-sha1: 24e5555f961847908a7a34f68861e90272eb2f44 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNG\ #.alwaysontop Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5e69066ee6b2d9e9131c8e030564a8a9 Text-delta-base-sha1: 27fa2e53ba6707f55275c9e263ffcfc7bbdebe80 Text-content-length: 91 Text-content-md5: 96b65b008623a89044b6c75afd791f87 Text-content-sha1: b1f2eff9d7322e6394a2057af6a10c28dc4930cf Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN"@(/AlwaysOnTop", cfg->alwaysontopAlwaysOnTop", 0, &cfg->alwaysontop Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 92d0cb907d42b343076c7d0448f2ae47 Text-delta-base-sha1: 430bcdac446af055568f871af9a5792bbb813ca8 Text-content-length: 294 Text-content-md5: da786546bb23c4b825e374ceca539ddb Text-content-sha1: 6e9fc7dec76a32d0eb8b609d6e4229f09702d1f8 Content-length: 334 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVNxj;]9(29_Xt?5+@)QP@L kIDC_ALWAYSONTOALWAYSONTOP, cfg.alwaysontop tcheckbox(&cp, "Ensure window is always on &top", IDC_ALWAYSONTOP case IDC_ALWAYSONTOP cfg.alwaysontop = IsDlgButtonChecked (hwnd, IDC_ALWAYSONTOP Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d1a9963093a691fc54e26586d959e60 Text-delta-base-sha1: 0ad983560a4e8ba714bbf1cad1f85b918b42c58a Text-content-length: 1299 Text-content-md5: 84af4601f24aaf66012212beefa24185 Text-content-sha1: 106513659e365f93cb21b0b6a3ae33393c0069b3 Content-length: 1339 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVNG DdmNWY8Cunsigned long int percentage, unsigned longunsigned longint)(100 * (done*1.0/size)), (unsigned long)difftime(now, start) Revision-number: 779 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 58 Reset compose state to zero when PuTTY window gains focus K 10 svn:author V 5 simon K 8 svn:date V 27 2000-10-30T10:16:32.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 84af4601f24aaf66012212beefa24185 Text-delta-base-sha1: 106513659e365f93cb21b0b6a3ae33393c0069b3 Text-content-length: 91 Text-content-md5: 1c616d99497079496b81a792997bf3f0 Text-content-sha1: c26b9f62a1735272da8e6316aca4f32c21a94363 Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVN !5^A^HAstatic int compose_state = 0 compose_state = 0 Revision-number: 780 Prop-content-length: 234 Content-length: 234 K 8 svn:date V 27 2000-10-30T10:39:10.000000Z K 7 svn:log V 133 Fix side-effect of Always On Top patch: any reconfiguring in mid-session was zapping the window to the top left corner of the screen K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1c616d99497079496b81a792997bf3f0 Text-delta-base-sha1: c26b9f62a1735272da8e6316aca4f32c21a94363 Text-content-length: 3751 Text-content-md5: 556a0dfc32a9fff725c1806c014674e4 Text-content-sha1: db24bde5c46d3aabfb53075c948bfed090eed4d5 Content-length: 3791 K 15 cvs2svn:cvs-rev V 4 1.86 PROPS-END SVN!Z$uBBN=MR;f { int prev_alwaysontop = cfg.alwaysontop; if (!do_reconfig(hwnd)) break; just_reconfigged = TRUE; { int i; for (i=0; i<8; i++) if (fonts[i]) DeleteObject(fonts[i]); } bold_mode = cfg.bold_colour ? BOLD_COLOURS : BOLD_FONT; und_mode = UND_FONT; init_fonts(0); sfree(logpal); /* * Telnet will change local echo -> remote if the * remote asks. */ if (cfg.protocol != PROT_TELNET) ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple); if (pal) DeleteObject(pal); logpal = NULL; pal = NULL; cfgtopalette(); init_palette(); /* Enable or disable the scroll bar, etc */ { nexflag = exflag; if (cfg.alwaysontop != prev_alwaysontop) { if (cfg.alwaysontop) { nexflag = WS_EX_TOPMOST; SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } else { nexflag = 0; SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } } nflg = flag; if (cfg.scrollbar) nflg |= WS_VSCROLL; else nflg &= ~WS_VSCROLL; if (cfg.locksize) nflg &= ~(WS_THICKFRAME|WS_MAXIMIZEBOX); else nflg |= (WS_THICKFRAME|WS_MAXIMIZEBOX); if (nflg != flag || nexflag != exflag) { RECT cr, wr; if (nflg != flag) if (nexflag != exflag) SetWindowLong(hwnd, GWL_EXSTYLE, nexflag); SendMessage (hwnd, WM_IGNORE_SIZE, 0, 0); SetWindowPos(hwnd, NULL, 0,0,0,0, SWP_NOACTIVATE|SWP_NOCOPYBITS| SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER| SWP_FRAMECHANGED); GetWindowRect (hwnd, &wr); GetClientRect (hwnd, &cr); extra_width = wr.right - wr.left - cr.right + cr.left; extra_height = wr.bottom - wr.top - cr.bottom + cr.top; } } term_size(cfg.height, cfg.width, cfg.savelines); InvalidateRect(hwnd, NULL, TRUE); SetWindowPos (hwnd, NULL, 0, 0, extra_width + font_width * cfg.width, extra_height + font_height * cfg.height, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); if (IsIconic(hwnd)) { SetWindowText (hwnd, cfg.win_name_always ? window_name : icon_name); } } break; case IDM_CLRSB: term_clrsb(); break; case IDM_RESET: term_pwron(); break; Revision-number: 781 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.490407Z PROPS-END Revision-number: 782 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.496813Z PROPS-END Revision-number: 783 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.503430Z PROPS-END Revision-number: 784 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.510653Z PROPS-END Revision-number: 785 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.516976Z PROPS-END Revision-number: 786 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.523339Z PROPS-END Revision-number: 787 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.530405Z PROPS-END Revision-number: 788 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.536678Z PROPS-END Revision-number: 789 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.543346Z PROPS-END Revision-number: 790 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2000-10-31T09:29:05.000000Z K 7 svn:log V 99 Back off a bit of that vulnerability fix, which was breaking `pscp host:wildcard* .' and suchlike. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dc29f4b0ef007e5b16cce2b50a615056 Text-delta-base-sha1: ed7c38a9a94f58dcf687db09da9ee701987796ef Text-content-length: 24 Text-content-md5: 373e91552e768936bb1f78709956b285 Text-content-sha1: 0ed1dde5c1d4d7d037bb249dde0bac9309704c67 Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNha CJ Revision-number: 791 Prop-content-length: 260 Content-length: 260 K 8 svn:date V 27 2000-11-01T19:54:46.000000Z K 7 svn:log V 159 Move dprintf and the debug system out into misc.c, to centralise it. Saves binary space and also allows redirection of debug statements to a file `debug.log'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ab578a31f34832dd9c50050f61d90546 Text-delta-base-sha1: 4ac02d988b448735267b084b9e51060fe9e1d6bb Text-content-length: 523 Text-content-md5: 03a0550773933f115488c6b3f2b659b8 Text-content-sha1: 0c33b4b7fa2314c68effe54a16c3e57f245ecfa4 Content-length: 562 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN x x #ifdef DEBUG static FILE *debug_fp = NULL; static int debug_got_console = 0; void dprintf(char *fmt, ...) { char buf[2048]; DWORD dw; va_list ap; if (!debug_got_console) { AllocConsole(); debug_got_console = 1; } if (!debug_fp) { debug_fp = fopen("debug.log", "w"); } va_start(ap, fmt); vsprintf(buf, fmt, ap); WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), buf, strlen(buf), &dw, NULL); fputs(buf, debug_fp); fflush(debug_fp); va_end(ap); } #endif Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5d0afdf5ca8fad4d5e072a8d125b2da8 Text-delta-base-sha1: 24e5555f961847908a7a34f68861e90272eb2f44 Text-content-length: 91 Text-content-md5: cb8b30bfdcfe6f26288cb6e9013f85fb Text-content-sha1: d6a3d4d7b62c0caf33a107a74ee378ac2fbeb5f9 Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVN\ GG'5#ifdef DEBUG void dprintf(char *fmt, ...); #define debug(x) (dprintf x) Revision-number: 792 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Implement Zlib compression, in both SSH1 and SSH2. K 10 svn:author V 5 simon K 8 svn:date V 27 2000-11-01T21:34:21.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3fbd5c0551df6ba3b9db990c0f1644df Text-delta-base-sha1: edfa17da2dad7de351ece913653c48cac93f6a2d Text-content-length: 57 Text-content-md5: 184c69e9665be8025b98f1b9a7ace924 Text-content-sha1: 15ba6c842458e686e7009de22eb7206d44aac44d Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNmbZ[B+ sshzlibshzlib.$(OBJ): sshzlib Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cb8b30bfdcfe6f26288cb6e9013f85fb Text-delta-base-sha1: d6a3d4d7b62c0caf33a107a74ee378ac2fbeb5f9 Text-content-length: 32 Text-content-md5: d27ecf15f939d7a04e12a660804e7458 Text-content-sha1: 399e9b6a4711dd2839af47c7a8df6a0aff1d3ba0 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVN k acompression Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 96b65b008623a89044b6c75afd791f87 Text-delta-base-sha1: b1f2eff9d7322e6394a2057af6a10c28dc4930cf Text-content-length: 91 Text-content-md5: 7911c1acee81e69e0b37d68bb41b675a Text-content-sha1: d901415e90825a252b0c0e3c2ad678503890e3c4 Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN@NV,0kCompression", cfg->compressionCompression", 0, &cfg->compression Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0657b2f486e79d19bbc8f6a7e49cdd89 Text-delta-base-sha1: 2f9223b594285e4a59512004b4ec671378b809a5 Text-content-length: 4745 Text-content-md5: 4e8f7e2823412959e3c8dfb99d15caed Text-content-sha1: 5fe28ac484f1e8b6113df54a2c08ca786aad4591 Content-length: 4785 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVN@0.L Mt3[6eY?J4 :Zl4@7 Z5PI}N;uMPw"%RMu\B`).)s-O@rpNrREQUEST_COMPRESSION 37 /* 0x25static void ssh_comp_none_init(void) { } static int ssh_comp_none_block(unsigned char *block, int len, unsigned char **outblock, int *outlen) { return 0; } const static struct ssh_compress ssh_comp_none = { "none", ssh_comp_none_init, ssh_comp_none_block, ssh_comp_none_init, ssh_comp_none_block }; extern const struct ssh_compress ssh_zlib; const static struct ssh_compress *compressions[] = { &ssh_zlib,int ssh1_compressingpktin.body = pktin.data + st->pad + 1; if (ssh1_compressing) { unsigned char *decompblk; int decomplen; #if 0 int i; debug(("Packet payload pre-decompression:\n")); for (i = -1; i < pktin.length; i++) debug((" %02x", (unsigned char)pktin.body[i])); debug(("\r\n")); #endif zlib_decompress_block(pktin.body-1, pktin.length+1, &decompblk, &decomplen); if (pktin.maxlen < st->pad + decomplen) { pktin.maxlen = st->pad + decomplen; pktin.data = realloc(pktin.data, pktin.maxlen+APIEXTRA); if (!pktin.data) fatalbox("Out of memory"); } memcpy(pktin.body-1, decompblk, decomplen); free(decompblk); pktin.length = decomplen-1; #if 0 debug(("Packet payload post-decompression:\n")); for (i = -1; i < pktin.length; i++) debug((" %02x", (unsigned char)pktin.body[i])); debug(("\r\n")); #endifpktin.type = pktin.body[-1];/* * Decompress packet payload. */ { unsigned char *newpayload; int newlen; if (sccomp && sccomp->decompress(pktin.data+5, pktin.length-5, &newpayload, &newlen)) { if (pktin.maxlen < newlen+5) { pktin.maxlen = newlen+5; pktin.data = (pktin.data == NULL ? malloc(pktin.maxlen+APIEXTRA) : realloc(pktin.data, pktin.maxlen+APIEXTRA)); if (!pktin.data) fatalbox("Out of memory"); } pktin.length = 5 + newlen; memcpy(pktin.data+5, newpayload, newlen); #if 0 debug(("Post-decompression payload:\r\n")); for (st->i = 0; st->i < newlen; st->i++) debug((" %02x", (unsigned char)pktin.data[5+st->i])); debug(("\r\n")); #endif free(newpayload); } }sh1_pktout_size( pktout.body = pktout.data+4+pad+1; } static void s_wrpkt_start(int type, int len) { ssh1_pktout_size(len); pktout.type = typepktout.body[-1] = pktout.type; if (ssh1_compressing) { unsigned char *compblk; int complen; #if 0 debug(("Packet payload pre-compression:\n")); for (i = -1; i < pktout.length; i++) debug((" %02x", (unsigned char)pktout.body[i])); debug(("\r\n")); #endif zlib_compress_block(pktout.body-1, pktout.length+1, &compblk, &complen); ssh1_pktout_size(complen-1); memcpy(pktout.body-1, compblk, complen); free(compblk); #if 0 debug(("Packet payload post-compression:\n")); for (i = -1; i < pktout.length; i++) debug((" %02x", (unsigned char)pktout.body[i])); debug(("\r\n")); #endif } len = pktout.length + 5; /* type and CRC */ pad = 8 - (len%8); biglen = len + pad; Compress packet payload. */ #if 0 debug(("Pre-compression payload:\r\n")); for (i = 5; i < pktout.length; i++) { unsigned char *newpayload; int newlen; if (cscomp && cscomp->compress(pktout.data+5, pktout.length-5, &newpayload, &newlen)) { pktout.length = 5; ssh2_pkt_adddata(newpayload, newlen); free(newpayload); } }cfg.compression) { send_packet(SSH1_CMSG_REQUEST_COMPRESSION, PKT_INT, 6c_write("Server refused to compress\r\n", 32); } logevent("Started compression"); ssh1_compressing = TRUE; zlib_compress_init(); zlib_decompress_init( static const struct ssh_compress *preferred_comp and compression if (cfg.compression) preferred_comp = &ssh_zlib; else preferred_comp = &ssh_comp_none;+1; i++) { const struct ssh_compress *c = i==0 ? preferred_comp : compressions[i-1]; ssh2_pkt_addstring_str(c->name); if (i < lenof(compressions)+1; i++) { const struct ssh_compress *c = i==0 ? preferred_comp : compressions[i-1]; ssh2_pkt_addstring_str(c->name); if (i < lenof(compressions)+1; i++) { const struct ssh_compress *c = i==0 ? preferred_comp : compressions[i-1]; if (in_commasep_string(c->name, str, len)) { cscomp_tobe = cserver->client compression */ for (i = 0; i < lenof(compressions)+1; i++) { const struct ssh_compress *c = i==0 ? preferred_comp : compressions[i-1]; if (in_commasep_string(c->name, str, len)) { sccomp_tobe = ccscomp->compress_init(); sccomp->decompress_init() Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b52f5056379210087dc739ae10d4ba19 Text-delta-base-sha1: 7d18e2a4f4d1f95436ebc7285ebc6e8e46926fcf Text-content-length: 584 Text-content-md5: bb82973c2004bfac6ca4911fc334f34e Text-content-sha1: f53f331431705d1dfcc7e94fe017c7686042a956 Content-length: 624 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNc-tqr% void (*compress_init)(void); int (*compress)(unsigned char *block, int len, unsigned char **outblock, int *outlen); void (*decompress_init)(void); int (*decompress)(unsigned char *block, int len, unsigned char **outblock, int *outlen) /* * zlib compression. */ void zlib_compress_init(void); void zlib_decompress_init(void); int zlib_compress_block(unsigned char *block, int len, unsigned char **outblock, int *outlen); int zlib_decompress_block(unsigned char *block, int len, unsigned char **outblock, int *outlen); Node-path: putty/sshzlib.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 32010 Text-content-md5: c5a54de384678c1cf5da36079bcb772e Text-content-sha1: 3d0913129de573806e2fe275ca778818177b3e11 Content-length: 32126 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNyyy/* * Zlib (RFC1950 / RFC1951) compression for PuTTY. * * There will no doubt be criticism of my decision to reimplement * Zlib compression from scratch instead of using the existing zlib * code. People will cry `reinventing the wheel'; they'll claim * that the `fundamental basis of OSS' is code reuse; they'll want * to see a really good reason for me having chosen not to use the * existing code. * * Well, here are my reasons. Firstly, I don't want to link the * whole of zlib into the PuTTY binary; PuTTY is justifiably proud * of its small size and I think zlib contains a lot of unnecessary * baggage for the kind of compression that SSH requires. * * Secondly, I also don't like the alternative of using zlib.dll. * Another thing PuTTY is justifiably proud of is its ease of * installation, and the last thing I want to do is to start * mandating DLLs. Not only that, but there are two _kinds_ of * zlib.dll kicking around, one with C calling conventions on the * exported functions and another with WINAPI conventions, and * there would be a significant danger of getting the wrong one. * * Thirdly, there seems to be a difference of opinion on the IETF * secsh mailing list about the correct way to round off a * compressed packet and start the next. In particular, there's * some talk of switching to a mechanism zlib isn't currently * capable of supporting (see below for an explanation). Given that * sort of uncertainty, I thought it might be better to have code * that will support even the zlib-incompatible worst case. * * Fourthly, it's a _second implementation_. Second implementations * are fundamentally a Good Thing in standardisation efforts. The * difference of opinion mentioned above has arisen _precisely_ * because there has been only one zlib implementation and * everybody has used it. I don't intend that this should happen * again. */ #include #include /* FIXME */ #include #include #include "putty.h" #include "ssh.h" /* ---------------------------------------------------------------------- * Basic LZ77 code. This bit is designed modularly, so it could be * ripped out and used in a different LZ77 compressor. Go to it, * and good luck :-) */ struct LZ77InternalContext; struct LZ77Context { struct LZ77InternalContext *ictx; void *userdata; void (*literal)(struct LZ77Context *ctx, unsigned char c); void (*match)(struct LZ77Context *ctx, int distance, int len); }; /* * Initialise the private fields of an LZ77Context. It's up to the * user to initialise the public fields. */ static int lz77_init(struct LZ77Context *ctx); /* * Supply data to be compressed. Will update the private fields of * the LZ77Context, and will call literal() and match() to output. */ static void lz77_compress(struct LZ77Context *ctx, unsigned char *data, int len); /* * Modifiable parameters. */ #define WINSIZE 32768 /* window size. Must be power of 2! */ #define HASHMAX 2039 /* one more than max hash value */ #define MAXMATCH 32 /* how many matches we track */ #define HASHCHARS 3 /* how many chars make a hash */ /* * This compressor takes a less slapdash approach than the * gzip/zlib one. Rather than allowing our hash chains to fall into * disuse near the far end, we keep them doubly linked so we can * _find_ the far end, and then every time we add a new byte to the * window (thus rolling round by one and removing the previous * byte), we can carefully remove the hash chain entry. */ #define INVALID -1 /* invalid hash _and_ invalid offset */ struct WindowEntry { int next, prev; /* array indices within the window */ int hashval; }; struct HashEntry { int first; /* window index of first in chain */ }; struct Match { int distance, len; }; struct LZ77InternalContext { struct WindowEntry win[WINSIZE]; unsigned char data[WINSIZE]; int winpos; struct HashEntry hashtab[HASHMAX]; unsigned char pending[HASHCHARS]; int npending; }; static int lz77_hash(unsigned char *data) { return (257*data[0] + 263*data[1] + 269*data[2]) % HASHMAX; } static int lz77_init(struct LZ77Context *ctx) { struct LZ77InternalContext *st; int i; st = (struct LZ77InternalContext *)malloc(sizeof(*st)); if (!st) return 0; ctx->ictx = st; for (i = 0; i < WINSIZE; i++) st->win[i].next = st->win[i].prev = st->win[i].hashval = INVALID; for (i = 0; i < HASHMAX; i++) st->hashtab[i].first = INVALID; st->winpos = 0; st->npending = 0; return 1; } static void lz77_advance(struct LZ77InternalContext *st, unsigned char c, int hash) { int off; /* * Remove the hash entry at winpos from the tail of its chain, * or empty the chain if it's the only thing on the chain. */ if (st->win[st->winpos].prev != INVALID) { st->win[st->win[st->winpos].prev].next = INVALID; } else if (st->win[st->winpos].hashval != INVALID) { st->hashtab[st->win[st->winpos].hashval].first = INVALID; } /* * Create a new entry at winpos and add it to the head of its * hash chain. */ st->win[st->winpos].hashval = hash; st->win[st->winpos].prev = INVALID; off = st->win[st->winpos].next = st->hashtab[hash].first; st->hashtab[hash].first = st->winpos; if (off != INVALID) st->win[off].prev = st->winpos; st->data[st->winpos] = c; /* * Advance the window pointer. */ st->winpos = (st->winpos + 1) & (WINSIZE-1); } #define CHARAT(k) ( (k)<0 ? st->data[(st->winpos+k)&(WINSIZE-1)] : data[k] ) static void lz77_compress(struct LZ77Context *ctx, unsigned char *data, int len) { struct LZ77InternalContext *st = ctx->ictx; int i, hash, distance, off, nmatch, matchlen, advance; struct Match defermatch, matches[MAXMATCH]; int deferchr; /* * Add any pending characters from last time to the window. (We * might not be able to.) */ for (i = 0; i < st->npending; i++) { unsigned char foo[HASHCHARS]; int j; if (len + st->npending - i < HASHCHARS) { /* Update the pending array. */ for (j = i; j < st->npending; j++) st->pending[j-i] = st->pending[j]; break; } for (j = 0; j < HASHCHARS; j++) foo[j] = (i + j < st->npending ? st->pending[i+j] : data[i + j - st->npending]); lz77_advance(st, foo[0], lz77_hash(foo)); } st->npending -= i; defermatch.len = 0; while (len > 0) { if (len >= HASHCHARS) { /* * Hash the next few characters. */ hash = lz77_hash(data); /* * Look the hash up in the corresponding hash chain and see * what we can find. */ nmatch = 0; for (off = st->hashtab[hash].first; off != INVALID; off = st->win[off].next) { /* distance = 1 if off == st->winpos-1 */ /* distance = WINSIZE if off == st->winpos */ distance = WINSIZE - (off + WINSIZE - st->winpos) % WINSIZE; for (i = 0; i < HASHCHARS; i++) if (CHARAT(i) != CHARAT(i-distance)) break; if (i == HASHCHARS) { matches[nmatch].distance = distance; matches[nmatch].len = 3; if (++nmatch >= MAXMATCH) break; } } } else { nmatch = 0; hash = INVALID; } if (nmatch > 0) { /* * We've now filled up matches[] with nmatch potential * matches. Follow them down to find the longest. (We * assume here that it's always worth favouring a * longer match over a shorter one.) */ matchlen = HASHCHARS; while (matchlen < len) { int j; for (i = j = 0; i < nmatch; i++) { if (CHARAT(matchlen) == CHARAT(matchlen - matches[i].distance)) { matches[j++] = matches[i]; } } if (j == 0) break; matchlen++; nmatch = j; } /* * We've now got all the longest matches. We favour the * shorter distances, which means we go with matches[0]. * So see if we want to defer it or throw it away. */ matches[0].len = matchlen; if (defermatch.len > 0) { if (matches[0].len > defermatch.len + 1) { /* We have a better match. Emit the deferred char, * and defer this match. */ ctx->literal(ctx, (unsigned char)deferchr); defermatch = matches[0]; deferchr = data[0]; advance = 1; } else { /* We don't have a better match. Do the deferred one. */ ctx->match(ctx, defermatch.distance, defermatch.len); advance = defermatch.len - 1; defermatch.len = 0; } } else { /* There was no deferred match. Defer this one. */ defermatch = matches[0]; deferchr = data[0]; advance = 1; } } else { /* * We found no matches. Emit the deferred match, if * any; otherwise emit a literal. */ if (defermatch.len > 0) { ctx->match(ctx, defermatch.distance, defermatch.len); advance = defermatch.len - 1; defermatch.len = 0; } else { ctx->literal(ctx, data[0]); advance = 1; } } /* * Now advance the position by `advance' characters, * keeping the window and hash chains consistent. */ while (advance > 0) { if (len >= HASHCHARS) { lz77_advance(st, *data, lz77_hash(data)); } else { st->pending[st->npending++] = *data; } data++; len--; advance--; } } } /* ---------------------------------------------------------------------- * Zlib compression. We always use the static Huffman tree option. * Mostly this is because it's hard to scan a block in advance to * work out better trees; dynamic trees are great when you're * compressing a large file under no significant time constraint, * but when you're compressing little bits in real time, things get * hairier. * * I suppose it's possible that I could compute Huffman trees based * on the frequencies in the _previous_ block, as a sort of * heuristic, but I'm not confident that the gain would balance out * having to transmit the trees. */ static struct LZ77Context ectx; struct Outbuf { unsigned char *outbuf; int outlen, outsize; unsigned long outbits; int noutbits; int firstblock; }; static void outbits(struct Outbuf *out, unsigned long bits, int nbits) { assert(out->noutbits + nbits <= 32); out->outbits |= bits << out->noutbits; out->noutbits += nbits; while (out->noutbits >= 8) { if (out->outlen >= out->outsize) { out->outsize = out->outlen + 64; out->outbuf = realloc(out->outbuf, out->outsize); } out->outbuf[out->outlen++] = (unsigned char)(out->outbits & 0xFF); out->outbits >>= 8; out->noutbits -= 8; } } static const unsigned char mirrorbytes[256] = { 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff, }; typedef struct { int code, extrabits, min, max; } coderecord; static const coderecord lencodes[] = { {257, 0, 3,3}, {258, 0, 4,4}, {259, 0, 5,5}, {260, 0, 6,6}, {261, 0, 7,7}, {262, 0, 8,8}, {263, 0, 9,9}, {264, 0, 10,10}, {265, 1, 11,12}, {266, 1, 13,14}, {267, 1, 15,16}, {268, 1, 17,18}, {269, 2, 19,22}, {270, 2, 23,26}, {271, 2, 27,30}, {272, 2, 31,34}, {273, 3, 35,42}, {274, 3, 43,50}, {275, 3, 51,58}, {276, 3, 59,66}, {277, 4, 67,82}, {278, 4, 83,98}, {279, 4, 99,114}, {280, 4, 115,130}, {281, 5, 131,162}, {282, 5, 163,194}, {283, 5, 195,226}, {284, 5, 227,257}, {285, 0, 258,258}, }; static const coderecord distcodes[] = { {0, 0, 1,1}, {1, 0, 2,2}, {2, 0, 3,3}, {3, 0, 4,4}, {4, 1, 5,6}, {5, 1, 7,8}, {6, 2, 9,12}, {7, 2, 13,16}, {8, 3, 17,24}, {9, 3, 25,32}, {10, 4, 33,48}, {11, 4, 49,64}, {12, 5, 65,96}, {13, 5, 97,128}, {14, 6, 129,192}, {15, 6, 193,256}, {16, 7, 257,384}, {17, 7, 385,512}, {18, 8, 513,768}, {19, 8, 769,1024}, {20, 9, 1025,1536}, {21, 9, 1537,2048}, {22, 10, 2049,3072}, {23, 10, 3073,4096}, {24, 11, 4097,6144}, {25, 11, 6145,8192}, {26, 12, 8193,12288}, {27, 12, 12289,16384}, {28, 13, 16385,24576}, {29, 13, 24577,32768}, }; static void zlib_literal(struct LZ77Context *ectx, unsigned char c) { struct Outbuf *out = (struct Outbuf *)ectx->userdata; if (c <= 143) { /* 0 through 143 are 8 bits long starting at 00110000. */ outbits(out, mirrorbytes[0x30 + c], 8); } else { /* 144 through 255 are 9 bits long starting at 110010000. */ outbits(out, 1 + 2*mirrorbytes[0x90 - 144 + c], 9); } } static void zlib_match(struct LZ77Context *ectx, int distance, int len) { const coderecord *d, *l; int i, j, k; struct Outbuf *out = (struct Outbuf *)ectx->userdata; while (len > 0) { int thislen; /* * We can transmit matches of lengths 3 through 258 * inclusive. So if len exceeds 258, we must transmit in * several steps, with 258 or less in each step. * * Specifically: if len >= 261, we can transmit 258 and be * sure of having at least 3 left for the next step. And if * len <= 258, we can just transmit len. But if len == 259 * or 260, we must transmit len-3. */ thislen = (len > 260 ? 258 : len <= 258 ? len : len-3); len -= thislen; /* * Binary-search to find which length code we're * transmitting. */ i = -1; j = sizeof(lencodes)/sizeof(*lencodes); while (j - i >= 2) { k = (j+i)/2; if (thislen < lencodes[k].min) j = k; else if (thislen > lencodes[k].max) i = k; else { l = &lencodes[k]; break; /* found it! */ } } /* * Transmit the length code. 256-279 are seven bits * starting at 0000000; 280-287 are eight bits starting at * 11000000. */ if (l->code <= 279) { outbits(out, mirrorbytes[(l->code-256)*2], 7); } else { outbits(out, mirrorbytes[0xc0 - 280 + l->code], 8); } /* * Transmit the extra bits. */ if (l->extrabits) outbits(out, thislen - l->min, l->extrabits); /* * Binary-search to find which distance code we're * transmitting. */ i = -1; j = sizeof(distcodes)/sizeof(*distcodes); while (j - i >= 2) { k = (j+i)/2; if (distance < distcodes[k].min) j = k; else if (distance > distcodes[k].max) i = k; else { d = &distcodes[k]; break; /* found it! */ } } /* * Transmit the distance code. Five bits starting at 00000. */ outbits(out, mirrorbytes[d->code*8], 5); /* * Transmit the extra bits. */ if (d->extrabits) outbits(out, distance - d->min, d->extrabits); } } void zlib_compress_init(void) { struct Outbuf *out; lz77_init(&ectx); ectx.literal = zlib_literal; ectx.match = zlib_match; out = malloc(sizeof(struct Outbuf)); out->outbits = out->noutbits = 0; out->firstblock = 1; ectx.userdata = out; logevent("Initialised zlib (RFC1950) compression"); } int zlib_compress_block(unsigned char *block, int len, unsigned char **outblock, int *outlen) { struct Outbuf *out = (struct Outbuf *)ectx.userdata; out->outbuf = NULL; out->outlen = out->outsize = 0; /* * If this is the first block, output the Zlib (RFC1950) header * bytes 78 9C. (Deflate compression, 32K window size, default * algorithm.) */ if (out->firstblock) { outbits(out, 0x9C78, 16); out->firstblock = 0; /* * Start a Deflate (RFC1951) fixed-trees block. We transmit * a zero bit (BFINAL=0), followed by a zero bit and a one * bit (BTYPE=01). Of course these are in the wrong order * (01 0). */ outbits(out, 2, 3); } /* * Do the compression. */ lz77_compress(&ectx, block, len); /* * End the block (by transmitting code 256, which is 0000000 in * fixed-tree mode), and transmit some empty blocks to ensure * we have emitted the byte containing the last piece of * genuine data. There are three ways we can do this: * * - Minimal flush. Output end-of-block and then open a new * static block. This takes 9 bits, which is guaranteed to * flush out the last genuine code in the closed block; but * allegedly zlib can't handle it. * * - Zlib partial flush. Output EOB, open and close an empty * static block, and _then_ open the new block. This is the * best zlib can handle. * * - Zlib sync flush. Output EOB, then an empty _uncompressed_ * block (000, then sync to byte boundary, then send bytes * 00 00 FF FF). Then open the new block. * * For the moment, we will use Zlib partial flush. */ outbits(out, 0, 7); /* close block */ outbits(out, 2, 3+7); /* empty static block */ outbits(out, 2, 3); /* open new block */ *outblock = out->outbuf; *outlen = out->outlen; return 1; } /* ---------------------------------------------------------------------- * Zlib decompression. Of course, even though our compressor always * uses static trees, our _decompressor_ has to be capable of * handling dynamic trees if it sees them. */ /* * The way we work the Huffman decode is to have a table lookup on * the first N bits of the input stream (in the order they arrive, * of course, i.e. the first bit of the Huffman code is in bit 0). * Each table entry lists the number of bits to consume, plus * either an output code or a pointer to a secondary table. */ struct zlib_table; struct zlib_tableentry; struct zlib_tableentry { unsigned char nbits; int code; struct zlib_table *nexttable; }; struct zlib_table { int mask; /* mask applied to input bit stream */ struct zlib_tableentry *table; }; #define MAXCODELEN 16 #define MAXSYMS 288 /* * Build a single-level decode table for elements * [minlength,maxlength) of the provided code/length tables, and * recurse to build subtables. */ static struct zlib_table *zlib_mkonetab(int *codes, unsigned char *lengths, int nsyms, int pfx, int pfxbits, int bits) { struct zlib_table *tab = malloc(sizeof(struct zlib_table)); int pfxmask = (1 << pfxbits) - 1; int nbits, i, j, code; tab->table = malloc((1 << bits) * sizeof(struct zlib_tableentry)); tab->mask = (1 << bits) - 1; for (code = 0; code <= tab->mask; code++) { tab->table[code].code = -1; tab->table[code].nbits = 0; tab->table[code].nexttable = NULL; } for (i = 0; i < nsyms; i++) { if (lengths[i] <= pfxbits || (codes[i] & pfxmask) != pfx) continue; code = (codes[i] >> pfxbits) & tab->mask; for (j = code; j <= tab->mask; j += 1 << (lengths[i]-pfxbits)) { tab->table[j].code = i; nbits = lengths[i] - pfxbits; if (tab->table[j].nbits < nbits) tab->table[j].nbits = nbits; } } for (code = 0; code <= tab->mask; code++) { if (tab->table[code].nbits <= bits) continue; /* Generate a subtable. */ tab->table[code].code = -1; nbits = tab->table[code].nbits - bits; if (nbits > 7) nbits = 7; tab->table[code].nbits = bits; tab->table[code].nexttable = zlib_mkonetab(codes, lengths, nsyms, pfx | (code << pfxbits), pfxbits + bits, nbits); } return tab; } /* * Build a decode table, given a set of Huffman tree lengths. */ static struct zlib_table *zlib_mktable(unsigned char *lengths, int nlengths) { int count[MAXCODELEN], startcode[MAXCODELEN], codes[MAXSYMS]; int code, maxlen; int i, j; /* Count the codes of each length. */ maxlen = 0; for (i = 1; i < MAXCODELEN; i++) count[i] = 0; for (i = 0; i < nlengths; i++) { count[lengths[i]]++; if (maxlen < lengths[i]) maxlen = lengths[i]; } /* Determine the starting code for each length block. */ code = 0; for (i = 1; i < MAXCODELEN; i++) { startcode[i] = code; code += count[i]; code <<= 1; } /* Determine the code for each symbol. Mirrored, of course. */ for (i = 0; i < nlengths; i++) { code = startcode[lengths[i]]++; codes[i] = 0; for (j = 0; j < lengths[i]; j++) { codes[i] = (codes[i] << 1) | (code & 1); code >>= 1; } } /* * Now we have the complete list of Huffman codes. Build a * table. */ return zlib_mkonetab(codes, lengths, nlengths, 0, 0, maxlen < 9 ? maxlen : 9); } static struct zlib_decompress_ctx { struct zlib_table *staticlentable, *staticdisttable; struct zlib_table *currlentable, *currdisttable, *lenlentable; enum { START, OUTSIDEBLK, TREES_HDR, TREES_LENLEN, TREES_LEN, TREES_LENREP, INBLK, GOTLENSYM, GOTLEN, GOTDISTSYM, UNCOMP_LEN, UNCOMP_NLEN, UNCOMP_DATA } state; int sym, hlit, hdist, hclen, lenptr, lenextrabits, lenaddon, len, lenrep; int uncomplen; unsigned char lenlen[19]; unsigned char lengths[286+32]; unsigned long bits; int nbits; unsigned char window[WINSIZE]; int winpos; unsigned char *outblk; int outlen, outsize; } dctx; void zlib_decompress_init(void) { unsigned char lengths[288]; memset(lengths, 8, 144); memset(lengths+144, 9, 256-144); memset(lengths+256, 7, 280-256); memset(lengths+280, 8, 288-280); dctx.staticlentable = zlib_mktable(lengths, 288); memset(lengths, 5, 32); dctx.staticdisttable = zlib_mktable(lengths, 32); dctx.state = START; /* even before header */ dctx.currlentable = dctx.currdisttable = NULL; dctx.bits = 0; dctx.nbits = 0; logevent("Initialised zlib (RFC1950) decompression"); } int zlib_huflookup(unsigned long *bitsp, int *nbitsp, struct zlib_table *tab) { unsigned long bits = *bitsp; int nbits = *nbitsp; while (1) { struct zlib_tableentry *ent; ent = &tab->table[bits & tab->mask]; if (ent->nbits > nbits) return -1; /* not enough data */ bits >>= ent->nbits; nbits -= ent->nbits; if (ent->code == -1) tab = ent->nexttable; else { *bitsp = bits; *nbitsp = nbits; return ent->code; } } } static void zlib_emit_char(int c) { dctx.window[dctx.winpos] = c; dctx.winpos = (dctx.winpos + 1) & (WINSIZE-1); if (dctx.outlen >= dctx.outsize) { dctx.outsize = dctx.outlen + 512; dctx.outblk = realloc(dctx.outblk, dctx.outsize); } dctx.outblk[dctx.outlen++] = c; } #define EATBITS(n) ( dctx.nbits -= (n), dctx.bits >>= (n) ) int zlib_decompress_block(unsigned char *block, int len, unsigned char **outblock, int *outlen) { const coderecord *rec; int code, blktype, rep, dist, nlen; static const unsigned char lenlenmap[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; dctx.outblk = NULL; dctx.outsize = dctx.outlen = 0; while (len > 0 || dctx.nbits > 0) { while (dctx.nbits < 24 && len > 0) { dctx.bits |= (*block++) << dctx.nbits; dctx.nbits += 8; len--; } switch (dctx.state) { case START: /* Expect 16-bit zlib header, which we'll dishonourably ignore. */ if (dctx.nbits < 16) goto finished; /* done all we can */ EATBITS(16); dctx.state = OUTSIDEBLK; break; case OUTSIDEBLK: /* Expect 3-bit block header. */ if (dctx.nbits < 3) goto finished; /* done all we can */ EATBITS(1); blktype = dctx.bits & 3; EATBITS(2); if (blktype == 0) { int to_eat = dctx.nbits & 7; dctx.state = UNCOMP_LEN; EATBITS(to_eat); /* align to byte boundary */ } else if (blktype == 1) { dctx.currlentable = dctx.staticlentable; dctx.currdisttable = dctx.staticdisttable; dctx.state = INBLK; } else if (blktype == 2) { dctx.state = TREES_HDR; } break; case TREES_HDR: /* * Dynamic block header. Five bits of HLIT, five of * HDIST, four of HCLEN. */ if (dctx.nbits < 5+5+4) goto finished; /* done all we can */ dctx.hlit = 257 + (dctx.bits & 31); EATBITS(5); dctx.hdist = 1 + (dctx.bits & 31); EATBITS(5); dctx.hclen = 4 + (dctx.bits & 15); EATBITS(4); dctx.lenptr = 0; dctx.state = TREES_LENLEN; memset(dctx.lenlen, 0, sizeof(dctx.lenlen)); break; case TREES_LENLEN: if (dctx.nbits < 3) goto finished; while (dctx.lenptr < dctx.hclen && dctx.nbits >= 3) { dctx.lenlen[lenlenmap[dctx.lenptr++]] = (unsigned char)(dctx.bits & 7); EATBITS(3); } if (dctx.lenptr == dctx.hclen) { dctx.lenlentable = zlib_mktable(dctx.lenlen, 19); dctx.state = TREES_LEN; dctx.lenptr = 0; } break; case TREES_LEN: if (dctx.lenptr >= dctx.hlit+dctx.hdist) { dctx.currlentable = zlib_mktable(dctx.lengths, dctx.hlit); dctx.currdisttable = zlib_mktable(dctx.lengths + dctx.hlit, dctx.hdist); /* FIXME: zlib_freetable(dctx.lenlentable); */ dctx.state = INBLK; break; } code = zlib_huflookup(&dctx.bits, &dctx.nbits, dctx.lenlentable); if (code == -1) goto finished; if (code < 16) dctx.lengths[dctx.lenptr++] = code; else { dctx.lenextrabits = (code == 16 ? 2 : code == 17 ? 3 : 7); dctx.lenaddon = (code == 18 ? 11 : 3); dctx.lenrep = (code == 16 && dctx.lenptr > 0 ? dctx.lengths[dctx.lenptr-1] : 0); dctx.state = TREES_LENREP; } break; case TREES_LENREP: if (dctx.nbits < dctx.lenextrabits) goto finished; rep = dctx.lenaddon + (dctx.bits & ((1< 0 && dctx.lenptr < dctx.hlit+dctx.hdist) { dctx.lengths[dctx.lenptr] = dctx.lenrep; dctx.lenptr++; rep--; } dctx.state = TREES_LEN; break; case INBLK: code = zlib_huflookup(&dctx.bits, &dctx.nbits, dctx.currlentable); if (code == -1) goto finished; if (code < 256) zlib_emit_char(code); else if (code == 256) { dctx.state = OUTSIDEBLK; /* FIXME: zlib_freetable(both) if not static */ } else if (code < 286) { /* static tree can give >285; ignore */ dctx.state = GOTLENSYM; dctx.sym = code; } break; case GOTLENSYM: rec = &lencodes[dctx.sym - 257]; if (dctx.nbits < rec->extrabits) goto finished; dctx.len = rec->min + (dctx.bits & ((1<extrabits)-1)); EATBITS(rec->extrabits); dctx.state = GOTLEN; break; case GOTLEN: code = zlib_huflookup(&dctx.bits, &dctx.nbits, dctx.currdisttable); if (code == -1) goto finished; dctx.state = GOTDISTSYM; dctx.sym = code; break; case GOTDISTSYM: rec = &distcodes[dctx.sym]; if (dctx.nbits < rec->extrabits) goto finished; dist = rec->min + (dctx.bits & ((1<extrabits)-1)); EATBITS(rec->extrabits); dctx.state = INBLK; while (dctx.len--) zlib_emit_char(dctx.window[(dctx.winpos-dist) & (WINSIZE-1)]); break; case UNCOMP_LEN: /* * Uncompressed block. We expect to see a 16-bit LEN. */ if (dctx.nbits < 16) goto finished; dctx.uncomplen = dctx.bits & 0xFFFF; EATBITS(16); dctx.state = UNCOMP_NLEN; break; case UNCOMP_NLEN: /* * Uncompressed block. We expect to see a 16-bit NLEN, * which should be the one's complement of the previous * LEN. */ if (dctx.nbits < 16) goto finished; nlen = dctx.bits & 0xFFFF; EATBITS(16); dctx.state = UNCOMP_DATA; break; case UNCOMP_DATA: if (dctx.nbits < 8) goto finished; zlib_emit_char(dctx.bits & 0xFF); EATBITS(8); if (--dctx.uncomplen == 0) dctx.state = OUTSIDEBLK; /* end of uncompressed block */ break; } } finished: *outblock = dctx.outblk; *outlen = dctx.outlen; return 1; } const struct ssh_compress ssh_zlib = { "zlib", zlib_compress_init, zlib_compress_block, zlib_decompress_init, zlib_decompress_block }; Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f38ec364f892cec1b960247cd35cfe19 Text-delta-base-sha1: 88456e3f6b0c2a10f16faa13ef1f650c65200cc3 Text-content-length: 381 Text-content-md5: b0885553f92c9fdf2064cce0dabfdf4b Text-content-sha1: 73c03ad699159e3dff7e3d313988fa09ae5c75cf Content-length: 421 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN((ZJ|#!|US4Configuration" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "&Open", IDOK, 184, 225, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 231, 225, 44, 14 PUSHBUTTON "&About", IDC_ABOUT, 3, 225, 44, 14, NOT WS_TABSTOP END /* Accelerators used: ac */ IDD_RECONF DIALOG DISCARDABLE 0, 0, 280, 2425, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 231, 22 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: da786546bb23c4b825e374ceca539ddb Text-delta-base-sha1: 6e9fc7dec76a32d0eb8b609d6e4229f09702d1f8 Text-content-length: 247 Text-content-md5: a1efe7d483bff47bc82c5a90ac12fcb8 Text-content-sha1: 64a5302be6920719fece611099019fae1713bef2 Content-length: 287 K 15 cvs2svn:cvs-rev V 4 1.80 PROPS-END SVNj27dX^8wO!AW~WW~)AIDC_COMPRESSCOMPRESS, cfg.compression20checkbox(&cp, "Enable compr&ession", IDC_COMPRESSCOMPRESScompression = IsDlgButtonChecked (hwnd, IDC_COMPRESS); break; case IDC_BUGGYMAC Revision-number: 793 Prop-content-length: 242 Content-length: 242 K 7 svn:log V 141 Software invocation of the System menu now pops up the actual menu, rather than just putting the window into the state where Down will do so K 10 svn:author V 5 simon K 8 svn:date V 27 2000-11-07T17:50:59.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 556a0dfc32a9fff725c1806c014674e4 Text-delta-base-sha1: db24bde5c46d3aabfb53075c948bfed090eed4d5 Text-content-length: 494 Text-content-md5: a35943b51c73d2e8c3a8e18e5438e68b Text-content-sha1: 911f21e6ee50b30cab8b4b0fc142929405651b95 Content-length: 534 K 15 cvs2svn:cvs-rev V 4 1.87 PROPS-END SVNZKZ(Z(M PostMessage(hwnd, WM_CHAR, ' ', 0);ALT alone may or may not want to bring up the System menu */ if (wParam == VK_MENU) { if (cfg.alt_only) { static int alt_state = 0; if (message == WM_SYSKEYDOWN) alt_state = 1; else if (message == WM_SYSKEYUP && alt_state) PostMessage(hwnd, WM_CHAR, ' ', 0); if (message == WM_SYSKEYUP) alt_state = 0; } else Revision-number: 794 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.903751Z PROPS-END Revision-number: 795 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.910834Z PROPS-END Revision-number: 796 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.917327Z PROPS-END Revision-number: 797 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.924166Z PROPS-END Revision-number: 798 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.933107Z PROPS-END Revision-number: 799 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:24.939678Z PROPS-END Revision-number: 800 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2000-11-15T11:13:22.000000Z K 7 svn:log V 27 Fix another silly segfault K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 373e91552e768936bb1f78709956b285 Text-delta-base-sha1: 0ed1dde5c1d4d7d037bb249dde0bac9309704c67 Text-content-length: 82 Text-content-md5: b1f4c38ddc537d9c555be7d297dc8b68 Text-content-sha1: c38fececb6984f3b8242a6538373d3f183a87266 Content-length: 122 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNa']65m +6 != NULL && back = NULL != NULL && Revision-number: 801 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2000-11-15T15:03:17.000000Z K 7 svn:log V 63 Use a Miller-Rabin test instead of a Fermat test; add comments K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7e04946d47896ab41ba7f30ac201d826 Text-delta-base-sha1: b264d23d5ed9d14fe875e8de5d69ee173fb2beb2 Text-content-length: 2793 Text-content-md5: f9c3c1f73185ba22934aa16c7a2513aa Text-content-sha1: 56e3050a71ead7e28e6ffa435ad63a11d0f3b00a Content-length: 2832 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN$E=gJ-[u[E4T~vl.Nmo)/* * Prime generation. */ #include "ssh.h" /* * This prime generation algorithm is pretty much cribbed from * OpenSSL. The algorithm is: * * - invent a B-bit random number and ensure the top and bottom * bits are set (so it's definitely B-bit, and it's definitely * odd) * * - see if it's coprime to all primes below 2^16; increment it by * two until it is (this shouldn't take long in general) * * - perform the Miller-Rabin primality test enough times to * ensure the probability of it being composite is 2^-80 or * less * * - go back to square one if any M-R test fails. */ /* * The Miller-Rabin primality test is an extension to the Fermat * test. The Fermat test just checks that a^(n-1) == 1 mod n; this * is vulnerable to Carmichael numbers. Miller-Rabin makes use of * the fact that if p is truly prime and a^K == 1 mod p for even K, * then a^(K/2) must be congruent to either 1 or -1. In Hence, we * write n-1 as q * 2^k, with odd q, and then we compute a^q, a^2q, * a^4q, a^8q, ..., a^(n-1) mod n. If n is prime, the last of these * must be 1, and the last one that _isn't_ 1 must be -1. So we * expect to see either a^q congruent to 1, or a^q congruent to -1, * or a^q to become congruent to -1 after squaring at most k-1 * times. * * For example, consider a=2 and n=1729 (a Carmichael number). * 2^1728 mod 1729 is 1, so the Fermat test would have no problem * with this. But Miller-Rabin looks at 2^(1728/2), 2^(1728/4), * ..., 2^(1728/64) as well. Now 2^(1728/64) == 645, 2^(1728/32) == * 1065, 2^(1728/16) == 1. Hang on! The value before the first 1 * was 1065, and we expected 1728 (i.e. -1). Guards! Seize this * impostor. * * (It doesn't work for all bases. Try a=932 and n=1729, and even * the Miller-Rabin test can't tell the difference, because * 932^(1728/64) is already 1 and so we don't get to see what * happens before the first 1. But there isn't any class of numbers * which give false positives on Miller-Rabin for _all_ bases, so * by trying several bases we probabilistically rule out Carmichael * numbers as well as everything else composite.) */pm1(bignum_mod_short(p, (unsigned short)modulus) + modulus - residue)Miller-Rabin primality test a few times. First * work /* And store p-1 itself, which we'll need. */ pm1 = copybn(p); decbn(pm1is -1, or if it becomes -1 * when squared at most k-1 times. */ if (bignum_cmp(wqp, One) == 0 || bignum_cmp(wqp, pm1) == 0) { freebn(wqp); continue; } for (i = 0; i < k-1pm1) == 0) break; } if (i < k-1pm1freebn(pm1); return p; } Revision-number: 802 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2000-11-16T10:47:59.000000Z K 7 svn:log V 70 Improve comment so I don't misunderstand when I come back to this :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f9c3c1f73185ba22934aa16c7a2513aa Text-delta-base-sha1: 56e3050a71ead7e28e6ffa435ad63a11d0f3b00a Text-content-length: 3661 Text-content-md5: 45887be16330c93a95a3d8edee4ea3e2 Text-content-sha1: 048a09e49f64931d8bcea9a8c74fb8ca2bd0ad56 Content-length: 3700 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNEt 2^2dap-1) == 1 mod p; this * is vulnerable to Carmichael numbers. Miller-Rabin considers how * that 1 is derived as well. * * Lemma: if a^2 == 1 (mod p), and p is prime, then either a == 1 * or a == -1 (mod p). * * Proof: p divides a^2-1, i.e. p divides (a+1)(a-1). Hence, * since p is prime, either p divides (a+1) or p divides (a-1). * But this is the same as saying that either a is congruent to * -1 mod p or a is congruent to +1 mod p. [] * * Comment: This fails when p is not prime. Consider p=mn, so * that mn divides (a+1)(a-1). Now we could have m dividing (a+1) * and n dividing (a-1), without the whole of mn dividing either. * For example, consider a=10 and p=99. 99 = 9 * 11; 9 divides * 10-1 and 11 divides 10+1, so a^2 is congruent to 1 mod p * without a having to be congruent to either 1 or -1. * * So the Miller-Rabin test, as well as considering a^(p-1), * considers a^((p-1)/2), a^((p-1)/4), and so on as far as it can * go. In other words. we write p-1 as q * 2^k, with k as large as * possible (i.e. q must be odd), and we consider the powers * * a^(q*2^0) a^(q*2^1) ... a^(q*2^(k-1)) a^(q*2^k) * i.e. a^((n-1)/2^k) a^((n-1)/2^(k-1)) ... a^((n-1)/2) a^(n-1) * * If p is to be prime, the last of these must be 1. Therefore, by * the above lemma, the one before it must be either 1 or -1. And * _if_ it's 1, then the one before that must be either 1 or -1, * and so on ... In other words, we expect to see a trailing chain * of 1s preceded by a -1. (If we're unlucky, our trailing chain of * 1s will be as long as the list so we'll never get to see what * lies before it. This doesn't count as a test failure because it * hasn't _proved_ that p is not prime.) * * For example, consider a=2 and p=1729. 1729 is a Carmichael * number: although it's not prime, it satisfies a^(p-1) == 1 mod p * for any a coprime to it. So the Fermat test wouldn't have a * problem with it at all, unless we happened to stumble on an a * which had a common factor. * * So. 1729 - 1 equals 27 * 2^6. So we look at * * 2^27 mod 1729 == 645 * 2^108 mod 1729 == 1065 * 2^216 mod 1729 == 1 * 2^432 mod 1729 == 1 * 2^864 mod 1729 == 1 * 2^1728 mod 1729 == 1 * * We do have a trailing string of 1s, so the Fermat test would * have been happy. But this trailing string of 1s is preceded by * 1065; whereas if 1729 were prime, we'd expect to see it preceded * by -1 (i.e. 1728.). Guards! Seize this impostor. * * (If we were unlucky, we might have tried a=16 instead of a=2; * now 16^27 mod 1729 == 1, so we would have seen a long string of * 1s and wouldn't have seen the thing _before_ the 1s. So, just * like the Fermat test, for a given p there may well exist values * of a which fail to show up its compositeness. So we try several, * just like the Fermat test. The difference is that Miller-Rabin * is not _in general_ fooled by Carmichael numbers.) * * Put simply, then, the Miller-Rabin test requires us to: * * 1. write p-1 as q * 2^k, with q odd * 2. compute z = (a^q) mod p. * 3. report success if z == 1 or z == -1. * 4. square z at most k-1 times, and report success if it becomes * -1 at any point. * 5. report failure otherwise. * * (We expect z to become -1 after at most k-1 squarings, because * if it became -1 after k squarings then a^(p-1) would fail to be * 1. And we don't need to investigate what happens after we see a * -1, because we _know_ that -1 squared is 1 modulo anything at * all, so after we've seen a -1 we can be sure of seeing nothing * but 1s Revision-number: 803 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2000-11-21T10:53:10.000000Z K 7 svn:log V 132 Fix segfault when you press a key before the SSH protocol decides whether it's doing SSH1 or SSH2. Only visible on slow servers :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4e8f7e2823412959e3c8dfb99d15caed Text-delta-base-sha1: 5fe28ac484f1e8b6113df54a2c08ca786aad4591 Text-content-length: 41 Text-content-md5: 633db1565b6755f3691175b060a5d534 Text-content-sha1: f0a6779b7c5938cf4d73971a04a2c98e2703a931 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVN0H qGi || ssh_protocol Revision-number: 804 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2000-11-21T11:13:27.000000Z K 7 svn:log V 64 Add link map files to Makefile, in case people send crash dumps K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 184c69e9665be8025b98f1b9a7ace924 Text-delta-base-sha1: 15ba6c842458e686e7009de22eb7206d44aac44d Text-content-length: 240 Text-content-md5: 3d89a6b661f0eb3a399dfb564057535c Text-content-sha1: f28978a2d750911283c38354681af0423fcb6f7c Content-length: 280 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVN}#AK Ju;//ZB-map:putty.map-map:puttytel.map @puttytel.rsp pageant.exe: $(PAGE1) $(PAGE2) $(PAGERC) pageant.rsp link $(LFLAGS) -out:pageant.exe -map:pageant.map-map:puttygen.map-map:pscp.map-map:plink.map Revision-number: 805 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2000-11-21T11:14:57.000000Z K 7 svn:log V 73 Oops - and if we generate link maps, "make clean" should remove them too K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d89a6b661f0eb3a399dfb564057535c Text-delta-base-sha1: f28978a2d750911283c38354681af0423fcb6f7c Text-content-length: 186 Text-content-md5: 38521a68cc3d371dd7cf1b9ad07d802e Text-content-sha1: 7b36e333077d200afe3e1c291d4496acdc898b30 Content-length: 226 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN}'m' tidy del *.exe tidy: del *.obj del *.res del *.pch del *.aps del *.ilk del *.pdb del *.rsp del *.dsp del *.dsw del *.ncb del *.opt del *.plg del *.map Revision-number: 806 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2000-11-21T19:00:11.000000Z K 7 svn:log V 98 Patch from Robert de Bath: blank the saved-session name edit box when loading `Default Settings'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a1efe7d483bff47bc82c5a90ac12fcb8 Text-delta-base-sha1: 64a5302be6920719fece611099019fae1713bef2 Text-content-length: 89 Text-content-md5: 3faf3fb7ffc1faa6fe32eb139474a9e5 Text-content-sha1: ae19e0dfe94f158ad72d3e54e9acf316f72f98ee Content-length: 129 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVN] ?]AY else SetDlgItemText(hwnd, IDC_SESSEDIT, "" Revision-number: 807 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2000-11-21T19:00:32.000000Z K 7 svn:log V 54 Patch from Robert de Bath: increase timer resolution. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a35943b51c73d2e8c3a8e18e5438e68b Text-delta-base-sha1: 911f21e6ee50b30cab8b4b0fc142929405651b95 Text-content-length: 28 Text-content-md5: 45738eed3b9a78a5f2c0bf359da23029 Text-content-sha1: 4b6073b9f65ac61017cebfd40341f2230353db9d Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.88 PROPS-END SVN |~10 Revision-number: 808 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2000-11-21T19:28:25.000000Z K 7 svn:log V 49 Ron Kuris's "copy everything to clipboard" patch K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d27ecf15f939d7a04e12a660804e7458 Text-delta-base-sha1: 399e9b6a4711dd2839af47c7a8df6a0aff1d3ba0 Text-content-length: 43 Text-content-md5: af4f85f4039aab533dc7b62190978069 Text-content-sha1: c56fc10f224e6011b1c1d1e9bb66ccefa615d428 Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVN/ t%qvoid term_copyall(void Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 56a9c463ecae4b9f0a782840e76a819f Text-delta-base-sha1: 413bd870398eb9f2c418292f4e45965d22d0f16f Text-content-length: 2034 Text-content-md5: 7de78e4b88a38c28aa0c4bdfe5abbcad Text-content-sha1: 1b8a02e44db357ce59cf785f6206742130c94655 Content-length: 2074 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNf]Oq. kRstatic void clipme(long *top, long *bottom, char *workbuf) { char *wbptr; /* where next char goes within workbuf */ int wblen = 0; /* workbuf len */ int buflen; /* amount of memory allocated to workbuf */ if ( workbuf != NULL ) { /* user supplied buffer? */ buflen = -1; /* assume buffer passed in is big enough */ wbptr = workbuf; /* start filling here */ } else buflen = 0; /* No data is available yet */ while (top < bottom) { int nl = FALSE; unsigned long *lineend = top - (top-text) % (cols+1) + cols; unsigned long *nlpos = lineend; if (!(*nlpos & ATTR_WRAPPED)) { while ((nlpos[-1] & CHAR_MASK) == 0x20 && nlpos > top) nlpos--; if (nlpos < bottom) nl = TRUE; } while (top < nlpos && top < bottom) { #if 0 /* VT Specials -> ISO8859-1 */ static const char poorman2[] = "* # HTFFCRLF\xB0 \xB1 NLVT+ + + + + - - - - - + + + + | <=>=PI!=\xA3 \xB7 "; #endif int ch = (*top & CHAR_MASK); #if 0 if ((*top & ATTR_LINEDRW) && ch >= 0x60 && ch < 0x7F) { int x; *wbptr++ = poorman2[2*(ch-0x60)]; if ( (x = poorman2[2*(ch-0x60)+1]) != ' ') *wbptr++ = x; } else #endif #if 0 if ((*top & ATTR_GBCHR) && ch == '#') *wbptr++ = (unsigned char) 0xA3; else #endif if ( wblen == buflen ) { workbuf = srealloc(workbuf, buflen += 100); wbptr = workbuf + wblen; } wblen++; *wbptr++ = (unsigned char) ch; top++; } if (nl) { int i; for (i=0; i 0 ) /* indicates we allocated this buffer */ sfree(workbuf); } void term_copyall (void) { clipme(sbtop, cpos, NULL /* dynamic allocation */clipme(selstart, selend, selspace Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 45738eed3b9a78a5f2c0bf359da23029 Text-delta-base-sha1: 4b6073b9f65ac61017cebfd40341f2230353db9d Text-content-length: 140 Text-content-md5: 79853949e15b88d1194034c33d822e27 Text-content-sha1: c51c0a29d6696b78c48935f3edddb616d5635370 Content-length: 180 K 15 cvs2svn:cvs-rev V 4 1.89 PROPS-END SVN1ffd{Ee5#define IDM_COPYALL 0x016OPYALL, "C&opy All to Clipboard" case IDM_COPYALL: term_copyall(); Revision-number: 809 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:25.438650Z PROPS-END Revision-number: 810 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:25.445022Z PROPS-END Revision-number: 811 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:25.451433Z PROPS-END Revision-number: 812 Prop-content-length: 145 Content-length: 145 K 7 svn:log V 45 Correct pointer types in new clipme function K 10 svn:author V 5 simon K 8 svn:date V 27 2000-11-24T22:27:51.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7de78e4b88a38c28aa0c4bdfe5abbcad Text-delta-base-sha1: 1b8a02e44db357ce59cf785f6206742130c94655 Text-content-length: 53 Text-content-md5: 49336518818d493384bcf7713445ff43 Text-content-sha1: 3b8fd8ae9c92d6109cf04de5fd870f072fee60cc Content-length: 93 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN]o Ounsigned long *top, unsigned Revision-number: 813 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2000-11-30T21:35:28.000000Z K 7 svn:log V 56 Prevent wildcards in source specs from matching . or .. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b1f4c38ddc537d9c555be7d297dc8b68 Text-delta-base-sha1: c38fececb6984f3b8242a6538373d3f183a87266 Text-content-length: 702 Text-content-md5: 76d74468e38c8d9cf90171f33fb3cab2 Text-content-sha1: 7afe4d7ba798a97b821bec3c4fb93d74626a9fab Content-length: 742 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN:"2"f,/* * Ensure that . and .. are never matched by wildcards, * but only by deliberate action. */ if (!strcmp(fdat.cFileName, ".") || !strcmp(fdat.cFileName, "..")) { /* * Find*File has returned a special dir. We require * that _either_ `src' ends in a backslash followed * by that string, _or_ `src' is precisely that * string. */ int len = strlen(src), dlen = strlen(fdat.cFileName); if (len == dlen && !strcmp(src, fdat.cFileName)) { /* ok */; } else if (len > dlen+1 && src[len-dlen-1] == '\\' && !strcmp(src+len-dlen, fdat.cFileName)) { /* ok */; } else continue; /* ignore this one */ } Revision-number: 814 Prop-content-length: 295 Content-length: 295 K 7 svn:log V 194 Fix bugtraq 1949: server could open an agent forwarding channel even if agent forwarding had not been negotiated on, and more particularly even if it had been deliberately disabled by the user. K 10 svn:author V 5 simon K 8 svn:date V 27 2000-12-02T11:43:25.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 633db1565b6755f3691175b060a5d534 Text-delta-base-sha1: f0a6779b7c5938cf4d73971a04a2c98e2703a931 Text-content-length: 1059 Text-content-md5: 109270dd68787fda55a0cc6b4f7ded56 Text-content-sha1: 3519910f17ca68eb87e4816219c72de1e9dbe9f7 Content-length: 1099 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVNH%p.U%GuYxnbh`int ssh_agentfwd_enabledssh_agentfwd_enabled = FALSE; { logevent("Agent forwarding enabled"); ssh_agentfwd_enabled = TRUE; }; struct ssh_channel *c; enum234 e; /* Refuse if agent forwarding is disabled. */ if (!ssh_agentfwd_enabled) { send_packet(SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(pktin.body), PKT_END); } else { i = 1; for (c = first234(ssh_channels, &e); c; c = next234(&e)) { if (c->localid > i) break; /* found a free number */ i = c->localid + 1; } c = malloc(sizeof(struct ssh_channel)); c->remoteid = GET_32BIT(pktin.body); c->localid = i; c->closes = 0; c->type = SSH1_SMSG_AGENT_OPEN;/* identify channel type */ c->u.a.lensofar = 0; add234(ssh_channels, c); send_packet(SSH1_MSG_CHANNEL_OPEN_CONFIRMATION, PKT_INT, c->remoteid, PKT_INT, c->localid, PKT_END); } } else if (pktin.type == SSH1_MSG_CHANNEL_CLOSE || Revision-number: 815 Prop-content-length: 314 Content-length: 314 K 8 svn:date V 27 2000-12-02T12:48:15.000000Z K 7 svn:log V 213 Improve SSH2 host key abstraction into a generic `signing key' abstraction, so as to be able to re-use the same abstraction for user authentication keys and probably in the SSH2 agent (when that happens) as well. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 109270dd68787fda55a0cc6b4f7ded56 Text-delta-base-sha1: 3519910f17ca68eb87e4816219c72de1e9dbe9f7 Text-content-length: 308 Text-content-md5: 82a1006e465b014eeefdfdc3e1bd6fd0 Text-content-sha1: 5b84068c1d358e708eb9f012de1a78323389104f Content-length: 348 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVN/wn7 V*TRkC_Xf4signkey ssh_dss; const static struct ssh_signsignvoid *hkey; /* actual host key */key = hostkey->newkey(hostkeydata, hostkeylen); if (!hostkey->verifysig(hkey, hkey); fingerprint = hostkey->fingerprint(hkey hostkey->freekey(hkey Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bb82973c2004bfac6ca4911fc334f34e Text-delta-base-sha1: f53f331431705d1dfcc7e94fe017c7686042a956 Text-content-length: 317 Text-content-md5: 66d4bcbe0e499b9dd7035dc79a2a8290 Text-content-sha1: da2cfc805ce1f157e8742dd9ef876b8b1b8fb8e3 Content-length: 357 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN %F%2`signkey { void *(*newkey)(char *data, int len); void (*freekey)(void *key); char *(*fmtkey)(void *key); char *(*fingerprint)(void *key); int (*verifysig)(void *key, char *sig, int siglen, char *data, int datalen); int (*sign)(void *key, char *sig, int siglen, Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b3b6ded244955f144cb8c3d1a189f02b Text-delta-base-sha1: b7098af5b14829424d0be097532a300bcb2948ce Text-content-length: 1890 Text-content-md5: 5eba3789078bdb8f738be2121e079a3d Text-content-sha1: bcd13c39c347b5405e2f2f7090e1ece73007fc89 Content-length: 1929 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNHPQUQ EEjc:j?b;j?b;k>b;btJhcqOPU7a fooV\**ruct dss_key { Bignum p, q, g, y; }; static void *dss_newkey(char *data, int len) { char *p; int slen; struct dss_key *dss; dss = malloc(sizeof(struct dss_key)); if (!dss) return NULL free(dss); return NULL; } dss->p = getmp(&data, &len); dss->q = getmp(&data, &len); dss->g = getmp(&data, &len); dss->y = getmp(&data, &len); return dss; } static void dss_freekey(void *key) { struct dss_key *dss = (struct dss_key *)key; freebn(dss->p); freebn(dss->q); freebn(dss->g); freebn(dss->y); free(dss); } static char *dss_fmtkey(void *key) { struct dss_key *dss = (struct dss_key *)key;->p) return NULL; len = 8 + 4 + 1; /* 4 x "0x", punctuation, \0 */ len += 4 * (dss->p[0] + dss->q[0] + dss->g[0] + dss->->->p->q->q->g->->y->y, i/2) >> (4*(i%2))) & 0xF]; p[pos] = '\0'; return p; } static char *dss_fingerprint(void *key) { struct dss_key *dss = (struct dss_key *)key;->p); ADD_BIGNUM(dss->q); ADD_BIGNUM(dss->g); ADD_BIGNUM(dss->->void *key, char *sig, int siglen, char *data, int datalen) { struct dss_key *dss = (struct dss_key *)key;->->p); diagbn("q=", dss->q); diagbn("g=", dss->g); diagbn("y=", dss->->->->->g, u1, dss->p); diagbn("gu1p=", gu1p); yu2p = modpow(dss->y, u2, dss->p); diagbn("yu2p=", yu2p); gu1yu2p = modmul(gu1p, yu2p, dss->p); diagbn("gu1yu2p=", gu1yu2p); v = modmul(gu1yu2p, One, dss->int dss_sign(void *key, char *sig, int siglen, char *data, int datalen) { return 0; /* do nothing */ } struct ssh_signkey ssh_dss = { dss_newkey, dss_freekey, dss_fmtkey, dss_fingerprint, dss_verifysig, dss_sign Revision-number: 816 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:25.877549Z PROPS-END Revision-number: 817 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:25.883882Z PROPS-END Revision-number: 818 Prop-content-length: 339 Content-length: 339 K 7 svn:log V 238 Make memory management uniform: _everything_ now goes through the smalloc() macros and thence to the safemalloc() functions in misc.c. This should allow me to plug in a debugging allocator and track memory leaks and segfaults and things. K 10 svn:author V 5 simon K 8 svn:date V 27 2000-12-12T10:33:13.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 38521a68cc3d371dd7cf1b9ad07d802e Text-delta-base-sha1: 7b36e333077d200afe3e1c291d4496acdc898b30 Text-content-length: 1441 Text-content-md5: 0e622c13fbd7528f0b2818bc5cefa483 Text-content-sha1: 8f49eee7f090d35137c041ed744abe58b0a25661 Content-length: 1481 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN u 1\~yl[(;Y miscputtymem.h network.h win_res.h storage.h winstuff.h windlg.$(OBJ): windlg.c putty.h puttymemputtymem.h network.h storage.h winstore.$(OBJ): winstore.c putty.h puttymem.h network.h storage.h terminal.$(OBJ): terminal.c putty.h puttymem.h network.h sizetip.$(OBJ): sizetip.c putty.h puttymem.h network.h winstuff.h telnet.$(OBJ): telnet.c putty.h puttymem.h network.h raw.$(OBJ): raw.c putty.h puttymem.h network.h xlat.$(OBJ): xlat.c putty.h puttymem.h network.h ldisc.$(OBJ): ldisc.c putty.h puttymem.h network.h misc.$(OBJ): misc.c putty.h puttymem.h network.h noise.$(OBJ): noise.c putty.h puttymem.h network.h ssh.h storage.h ssh.$(OBJ): ssh.c ssh.h putty.h puttymem.h network.h tree234.h sshcrc.$(OBJ): sshcrc.c ssh.h puttymem.h sshdes.$(OBJ): sshdes.c ssh.h puttymem.h sshmd5.$(OBJ): sshmd5.c ssh.h puttymem.h sshrsa.$(OBJ): sshrsa.c ssh.h puttymem.h sshsha.$(OBJ): sshsha.c ssh.h puttymem.h sshrand.$(OBJ): sshrand.c ssh.h puttymem.h sshblowf.$(OBJ): sshblowf.c ssh.h puttymem.h sshdh.$(OBJ): sshdh.c ssh.h puttymem.h sshdss.$(OBJ): sshdss.c ssh.h puttymem.h sshbn.$(OBJ): sshbn.c ssh.h puttymem.h sshpubk.$(OBJ): sshpubk.c ssh.h puttymem.h sshzlib.$(OBJ): sshzlib.c ssh.h puttymem.h scp.$(OBJ): scp.c putty.h puttymemputtymem.h network.h winstuff.h pageant.$(OBJ): pageant.c ssh.h puttymem.h tree234.h pageantc.$(OBJ): pageantc.c puttymem.h tree234.$(OBJ): tree234.c tree234.h puttymem Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a7296406964d8a37fe284c0859cff5c Text-delta-base-sha1: dd5bc11833626634845996acb9cb38739bff3c11 Text-content-length: 178 Text-content-md5: 4b6fe73b61833924f50d92bb3e42cd75 Text-content-sha1: 3749e9dc8823aacd542acfa64f8b898c44836811 Content-length: 218 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNpy/vwvw Pkey.comment); state->key.comment = sssss Node-path: putty/puttymem.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 588 Text-content-md5: 1384d2001b9a0eda66124dca5f8cb948 Text-content-sha1: 78d059c44715ffdf11ed0c84d97382e109349a73 Content-length: 704 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN>>>/* * PuTTY memory-handling header. */ #ifndef PUTTY_PUTTYMEM_H #define PUTTY_PUTTYMEM_H /* #define MALLOC_LOG do this if you suspect putty of leaking memory */ #ifdef MALLOC_LOG #define smalloc(z) (mlog(__FILE__,__LINE__), safemalloc(z)) #define srealloc(y,z) (mlog(__FILE__,__LINE__), saferealloc(y,z)) #define sfree(z) (mlog(__FILE__,__LINE__), safefree(z)) void mlog(char *, int); #else #define smalloc safemalloc #define srealloc saferealloc #define sfree safefree #endif void *safemalloc(size_t); void *saferealloc(void *, size_t); void safefree(void *); #endif Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 76d74468e38c8d9cf90171f33fb3cab2 Text-delta-base-sha1: 7afe4d7ba798a97b821bec3c4fb93d74626a9fab Text-content-length: 85 Text-content-md5: 2c03435904818e6e3df832578c0dba3b Text-content-sha1: 2d4857507c658a7f573b5c2aa6d3d078be0c77dc Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN:=7TGkOsrealloc(pending, pendsize) : ss Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d13c590b5509c022b3577956804328e1 Text-delta-base-sha1: 44571f98c0839896da4698900d452a14acbc107e Text-content-length: 29 Text-content-md5: a56daeb4b2174edc644eac23df2fe9bd Text-content-sha1: 6d2e04b718c132d1d6d0756a2afec0fe542b2ce3 Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNRTfNss Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 82a1006e465b014eeefdfdc3e1bd6fd0 Text-delta-base-sha1: 5b84068c1d358e708eb9f012de1a78323389104f Text-content-length: 716 Text-content-md5: a92be37893ddac36fed22e40fecfc529 Text-content-sha1: 95e6596d0f7766b493dc00d800e513fa2b1466c0 Content-length: 756 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVN)\a"Od_uU5xfn^ mS@ 9yW&Pvby[ k)v(#sK>xOEG( m4z!Hsnsmalloc(st->biglen+APIEXTRA) : ssssmalloc(st->cipherblk+APIEXTRA) : ssmalloc(pktin.maxlen+APIEXTRA) : ssmalloc(pktin.maxlen+APIEXTRA) : sssmalloc(biglen+12) : srealloc(pktout.data, biglen+12)); #else pktout.data = (pktout.data == NULL ? smalloc(biglen+4) : sssmalloc(pktout.maxlen+APIEXTRA) : ssssssssssssssssssssfree(reply); ssfree(fingerprint); ss Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 66d4bcbe0e499b9dd7035dc79a2a8290 Text-delta-base-sha1: da2cfc805ce1f157e8742dd9ef876b8b1b8fb8e3 Text-content-length: 58 Text-content-md5: e80a2d3dcb8d537f1bd46c25afffb2f7 Text-content-sha1: 0f48e82d3e6e05682653b5e3f5e22baa6ca079c1 Content-length: 98 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN4* #include #include "puttymem.h" Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 81104e109368b95f9d2806c28a154b6b Text-delta-base-sha1: c7349a71e3f2852ca03f88b6c25b268b8cc0fe5c Text-content-length: 622 Text-content-md5: 276b46912612ec32902ed244349bba2d Text-content-sha1: 5ede7d628463240ef7923bd9c2ebab45bbdee755 Content-length: 662 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN_y{elNl:Nta B=RRQR#*u[7u 7QS _ssss/* Allocate n of size mlen, copy base to n */ n = ssmalloc(2 * mlen * sizeof(unsigned short)); b = ssfree(a); for (i = 0; i < 2*mlen; i++) b[i] = 0; sfree(b); for (i = 0; i < mlen; i++) m[i] = 0; sfree(m); for (i = 0; i < mlen; i++) n[i] = 0; ssssssfree(a); for (i = 0; i < mlen; i++) m[i] = 0; sfree(m); for (i = 0; i < pqlen; i++) n[i] = 0; sfree(n); for (i = 0; i < pqlen; i++) o[i] = 0; ssssfree(m); for (i = 0; i < plen; i++) n[i] = 0; ssss Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5eba3789078bdb8f738be2121e079a3d Text-delta-base-sha1: bcd13c39c347b5405e2f2f7090e1ece73007fc89 Text-content-length: 88 Text-content-md5: 94a644f8c715b37014fe139460ef93fc Text-content-sha1: 1a8d1d99da60a298bb9fc2b33f7664716f2f92f7 Content-length: 128 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNPU&'mCma0F{y8sssfree(dss); } static char *dss_fmtss Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 57e69e75255b908434ab6ef67068765e Text-delta-base-sha1: 65f9c52db6af0be90f2aaeae34f6b2e9efc34259 Text-content-length: 22 Text-content-md5: bab44a40f0e0d994e41ed5a0e2b51fcc Text-content-sha1: 750c3534672c7eaee6626767b771088cf8b150ff Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN34 s Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fcb46dc9597aa9cf7e8166d1e695f09f Text-delta-base-sha1: 787c233ac4c526f05e7cbf62da3dbad678699a0b Text-content-length: 39 Text-content-md5: 75955dc912a94f7f33a9df15cfe77908 Text-content-sha1: 5b89040da81dfeaf6c9fdcc2eba95fa702debe3b Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN*+sfree(key->comment); } Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c5a54de384678c1cf5da36079bcb772e Text-delta-base-sha1: 3d0913129de573806e2fe275ca778818177b3e11 Text-content-length: 80 Text-content-md5: 27a5d692a8bf60719b0daa48df0d0081 Text-content-sha1: 86f39e3839b848183b0a3c61ed7ebe6ab2572a36 Content-length: 119 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNy2 ] Fgk-vz~{~sssssdctx.lenlens Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 54acc4926d43491c0bc6ac26f40c04f5 Text-delta-base-sha1: dbaed15837b985cb511331ee95a0a7636e8ec737 Text-content-length: 200 Text-content-md5: 0235a2de3ab22cdfe06c653fd68d068f Text-content-sha1: afe66b63101246fdfa40b047b490802d5404e1a7 Content-length: 239 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN('3qYuputtymem.h" #include "tree234.h" #define mknew(typ) ( (typ *) smalloc (sizeof (typ)) ) /* #define sfree free */smalloc(arraysize*sizeof(*array)) : s Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3faf3fb7ffc1faa6fe32eb139474a9e5 Text-delta-base-sha1: ae19e0dfe94f158ad72d3e54e9acf316f72f98ee Text-content-length: 98 Text-content-md5: 8de455d136139dbf4d85a7751a19354b Text-content-sha1: a3d2875778de2e7a24eb32b9807af1970fc2e4ba Content-length: 138 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVN]a>h h4uzcsssfree(clipdata); } s Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79853949e15b88d1194034c33d822e27 Text-delta-base-sha1: c51c0a29d6696b78c48935f3edddb616d5635370 Text-content-length: 90 Text-content-md5: 3913b5f93a8d29e2a6f4a9b1962b94c0 Text-content-sha1: e6b9c961233497937c2062858de48e742508a87f Content-length: 130 K 15 cvs2svn:cvs-rev V 4 1.90 PROPS-END SVN1Q.oP} MOY (smalloc(size); memset(bits, 0, sizesss Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1616b44c9d46d97c1303710c59e07e58 Text-delta-base-sha1: 78790ed6604262ebe579c66e3586e853def0427b Text-content-length: 36 Text-content-md5: 4a6b7a5b9e6c23a2c17954a5dd713789 Text-content-sha1: e50fef5de5d30a471b7b0b2ac62b6fffb2dc2fe2 Content-length: 75 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNru3J3p}msss Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 34c903d74888757fc7e4a00778ab6841 Text-delta-base-sha1: 97eb75c9cdf6ca013c32b081637af2b78a4505ae Text-content-length: 266 Text-content-md5: 52f40a5a109a723b1c3978d11b8b7840 Text-content-sha1: f9a14142081ac1be47f6123507538dd271747e7a Content-length: 305 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNU`N]*+ssfree(p); return NULL; } ret = RegCreateKey(subkey1, p, &sesskey); ssssmalloc(3*strlen(sessionname)+1); mungestr(sessionname, p); RegDeleteKey(subkey1, p); sssss Revision-number: 819 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2000-12-12T10:57:34.000000Z K 7 svn:log V 122 Added Minefield: an alternative memory allocator along the lines of Electric Fence. Enable by compiling with /DMINEFIELD. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0e622c13fbd7528f0b2818bc5cefa483 Text-delta-base-sha1: 8f49eee7f090d35137c041ed744abe58b0a25661 Text-content-length: 535 Text-content-md5: 45c68ec62c4b6d04a4151386760f06f8 Text-content-sha1: ed00b82ab1dea6cbc4241dfc066ece9eeabdef3d Content-length: 575 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNys p - XFLAGS=/DMALLOC_LOG # Causes PuTTY to emit a file called putty_mem.log, logging every # memory allocation and free, so you can track memory leaks. # # - XFLAGS=/DMINEFIELD # Causes PuTTY to use a custom memory allocator, similar in # concept to Electric Fence, in place of regular malloc(). Wastes # huge amounts of RAM, but should cause heap-corruption bugs to # show up as GPFs at the point of failure rather than appearing # later on as second-level damageXFLAGS Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 03a0550773933f115488c6b3f2b659b8 Text-delta-base-sha1: 0c33b4b7fa2314c68effe54a16c3e57f245ecfa4 Text-content-length: 6873 Text-content-md5: 868191b5185cad885fad5eb294d3854a Text-content-sha1: 09eb85266f635b603076da4d4acd88a9ca441bee Content-length: 6912 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN &'RFY3@E1@6[Ce * My own versions of malloc, realloc and free. Because I want * malloc and realloc to bomb out and exit the program if they run * out of memory, realloc to reliably call malloc if passed a NULL * pointer, and free to reliably do nothing if passed a NULL * pointer. We can also put trace printouts in, if we need to; and * we can also replace the allocator with an ElectricFence-like * one. */ #ifdef MINEFIELD /* * Minefield - a Windows equivalent for Electric Fence */ #define PAGESIZE 4096 /* * Design: * * We start by reserving as much virtual address space as Windows * will sensibly (or not sensibly) let us have. We flag it all as * invalid memory. * * Any allocation attempt is satisfied by committing one or more * pages, with an uncommitted page on either side. The returned * memory region is jammed up against the _end_ of the pages. * * Freeing anything causes instantaneous decommitment of the pages * involved, so stale pointers are caught as soon as possible. */ static int minefield_initialised = 0; static void *minefield_region = NULL; static long minefield_size = 0; static long minefield_npages = 0; static long minefield_curpos = 0; static unsigned short *minefield_admin = NULL; static void *minefield_pages = NULL; static void minefield_admin_hide(int hide) { int access = hide ? PAGE_NOACCESS : PAGE_READWRITE; VirtualProtect(minefield_admin, minefield_npages*2, access, NULL); } static void minefield_init(void) { int size; int admin_size; int i; for (size = 0x40000000; size > 0; size = ((size >> 3) * 7) &~ 0xFFF) { printf("trying size=%d\n", size); minefield_region = VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS); if (minefield_region) break; } minefield_size = size; printf("got region %p size %d\n", minefield_region, minefield_size); /* * Firstly, allocate a section of that to be the admin block. * We'll need a two-byte field for each page. */ minefield_admin = minefield_region; minefield_npages = minefield_size / PAGESIZE; admin_size = (minefield_npages * 2 + PAGESIZE-1) &~ (PAGESIZE-1); minefield_npages = (minefield_size - admin_size) / PAGESIZE; minefield_pages = (char *)minefield_region + admin_size; printf("admin at %p, pages at %p, npages %x, admin_size %x\n", minefield_admin, minefield_pages, minefield_npages, admin_size); /* * Commit the admin region. */ VirtualAlloc(minefield_admin, minefield_npages * 2, MEM_COMMIT, PAGE_READWRITE); /* * Mark all pages as unused (0xFFFF). */ for (i = 0; i < minefield_npages; i++) minefield_admin[i] = 0xFFFF; /* * Hide the admin region. */ minefield_admin_hide(1); minefield_initialised = 1; } static void minefield_bomb(void) { div(1, *(int*)minefield_pages); } static void *minefield_alloc(int size) { int npages; int pos, lim, region_end, region_start; int start; int i; npages = (size + PAGESIZE-1) / PAGESIZE; minefield_admin_hide(0); /* * Search from current position until we find a contiguous * bunch of npages+2 unused pages. */ pos = minefield_curpos; lim = minefield_npages; while (1) { /* Skip over used pages. */ while (pos < lim && minefield_admin[pos] != 0xFFFF) pos++; /* Count unused pages. */ start = pos; while (pos < lim && pos - start < npages+2 && minefield_admin[pos] == 0xFFFF) pos++; if (pos - start == npages+2) break; /* If we've reached the limit, reset the limit or stop. */ if (pos >= lim) { if (lim == minefield_npages) { /* go round and start again at zero */ lim = minefield_curpos; pos = 0; } else { minefield_admin_hide(1); return NULL; } } } minefield_curpos = pos-1; /* * We have npages+2 unused pages starting at start. We leave * the first and last of these alone and use the rest. */ region_end = (start + npages+1) * PAGESIZE; region_start = region_end - size; /* FIXME: could align here if we wanted */ /* * Update the admin region. */ for (i = start + 2; i < start + npages-1; i++) minefield_admin[i] = 0xFFFE; /* used but no region starts here */ minefield_admin[start+1] = region_start % PAGESIZE; minefield_admin_hide(1); VirtualAlloc((char *)minefield_pages + region_start, size, MEM_COMMIT, PAGE_READWRITE); return (char *)minefield_pages + region_start; } static void minefield_free(void *ptr) { int region_start, i, j; minefield_admin_hide(0); region_start = (char *)ptr - (char *)minefield_pages; i = region_start / PAGESIZE; if (i < 0 || i >= minefield_npages || minefield_admin[i] != region_start % PAGESIZE) minefield_bomb(); for (j = i; j < minefield_npages && minefield_admin[j] != 0xFFFF; j++) { minefield_admin[j] = 0xFFFF; } VirtualFree(ptr, j*PAGESIZE - region_start, MEM_DECOMMIT); minefield_admin_hide(1); } static int minefield_get_size(void *ptr) { int region_start, i, j; minefield_admin_hide(0); region_start = (char *)ptr - (char *)minefield_pages; i = region_start / PAGESIZE; if (i < 0 || i >= minefield_npages || minefield_admin[i] != region_start % PAGESIZE) minefield_bomb(); for (j = i; j < minefield_npages && minefield_admin[j] != 0xFFFF; j++); minefield_admin_hide(1); return j*PAGESIZE - region_start; } static void *minefield_c_malloc(size_t size) { if (!minefield_initialised) minefield_init(); return minefield_alloc(size); } static void minefield_c_free(void *p) { if (!minefield_initialised) minefield_init(); minefield_free(p); } /* * realloc _always_ moves the chunk, for rapid detection of code * that assumes it won't. */ static void *minefield_c_realloc(void *p, size_t size) { size_t oldsize; void *q; if (!minefield_initialised) minefield_init(); q = minefield_alloc(size); oldsize = minefield_get_size(p); memcpy(q, p, (oldsize < size ? oldsize : size)); minefield_free(p); return q; } #endif /* MINEFIELD; #ifdef MINEFIELD p = minefield_c_malloc (size); #else p = malloc (size); #endif { #ifdef MINEFIELD p = minefield_c_malloc (size); #else p = malloc (size); #endif } else { #ifdef MINEFIELD p = minefield_c_realloc (ptr, size); #else p = realloc (ptr, size); #endif }#ifdef MINEFIELD minefield_c_free (ptr); #else free (ptr); #endif Revision-number: 820 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2000-12-12T11:07:59.000000Z K 7 svn:log V 132 Fix an intermittent segfault that prevented the new Zlib compression from being very useful. (Thanks to Minefield for catching it.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a92be37893ddac36fed22e40fecfc529 Text-delta-base-sha1: 95e6596d0f7766b493dc00d800e513fa2b1466c0 Text-content-length: 73 Text-content-md5: 077b945dc4f4e4bce6a4cd08e47a35a6 Text-content-sha1: 920dd49aaa1f5d07ad93c155433da3c20688b9f2 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.80 PROPS-END SVN)\ 1 pktin.body = pktin.data + st->pad + 1 Revision-number: 821 Prop-content-length: 168 Content-length: 168 K 10 svn:author V 7 cvs2svn K 8 svn:date V 27 2000-12-12T11:07:59.000000Z K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-51'. PROPS-END Node-path: putty-0.51 Node-kind: dir Node-action: add Node-copyfrom-rev: 820 Node-copyfrom-path: putty Revision-number: 822 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 Remove unnecessary printfs from Minefield K 10 svn:author V 5 simon K 8 svn:date V 27 2000-12-12T14:04:43.000000Z PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 868191b5185cad885fad5eb294d3854a Text-delta-base-sha1: 09eb85266f635b603076da4d4acd88a9ca441bee Text-content-length: 30 Text-content-md5: 65fc512b014fe5f1cdb06ee632d9a258 Text-content-sha1: 7290f440fede9f86f0d02d4410569667c9b64567 Content-length: 69 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN CE"Q Revision-number: 823 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.330796Z PROPS-END Revision-number: 824 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.337219Z PROPS-END Revision-number: 825 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.343796Z PROPS-END Revision-number: 826 Prop-content-length: 228 Content-length: 228 K 7 svn:log V 127 Attempt to get repeated key exchange working in SSH2. Still under test - might not be 100%. I think it _ought_ to work though. K 10 svn:author V 5 simon K 8 svn:date V 27 2000-12-18T09:20:08.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 077b945dc4f4e4bce6a4cd08e47a35a6 Text-delta-base-sha1: 920dd49aaa1f5d07ad93c155433da3c20688b9f2 Text-content-length: 858 Text-content-md5: 21699f4a99446b620322685f5f6c3baf Text-content-sha1: 16c4abab8e058ed576b14d8162c62b340d09963c Content-length: 898 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVN\/HBH8l6LmASf:kq, exhashbasebase); /* * Hash our version string and their version string. */ sha_string(&exhashbase, verstring, strlen(verstring)); sha_string(&exhashbase static int first_kex; crBegin; random_init(); first_kex = 1 exhash = exhashbase; sha_string(&exhash, pktout.data+5, pktout.length-5); If this is the first key exchange phase, we must pass the * SSH2_MSG_NEWKEYS packet to the next layer, not because it * wants to see it but because it will need time to initialise * itself before it sees an actual packet. In subsequent key * exchange phases, we don't pass SSH2_MSG_NEWKEYS on, because * it would only confuse the layer above. */ if (!first_kex) { crReturn(0); } first_kex = 0 Revision-number: 827 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2000-12-18T09:20:26.000000Z K 7 svn:log V 93 Apply improved WinSock error handling to the few situations it still hadn't been applied to. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4a6b7a5b9e6c23a2c17954a5dd713789 Text-delta-base-sha1: e50fef5de5d30a471b7b0b2ac62b6fffb2dc2fe2 Text-content-length: 214 Text-content-md5: 03a52e8c46264cc56b5a85dd0fb4cf99 Text-content-sha1: 11343ccc7425439a341c826d73759a0a98c77d2e Content-length: 253 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNun+KM@ZKfXW~4 5h winsock_error_string(err ret->error = winsock_error_string(err ret->error = winsock_error_string(err ret->error = winsock_error_string(err Revision-number: 828 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.533200Z PROPS-END Revision-number: 829 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.541384Z PROPS-END Revision-number: 830 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.548396Z PROPS-END Revision-number: 831 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.555164Z PROPS-END Revision-number: 832 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.562973Z PROPS-END Revision-number: 833 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.570029Z PROPS-END Revision-number: 834 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.578831Z PROPS-END Revision-number: 835 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:26.587203Z PROPS-END Revision-number: 836 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2001-01-07T13:31:49.000000Z K 7 svn:log V 78 Patch from Christian Biesinger: pscp guesses your Windows username by default K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2c03435904818e6e3df832578c0dba3b Text-delta-base-sha1: 2d4857507c658a7f573b5c2aa6d3d078be0c77dc Text-content-length: 381 Text-content-md5: 63fcdf09e72745e8510549f42a691e12 Text-content-sha1: 28943326b9cbb842b4a4a2f2175d82c923f47c77 Content-length: 421 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN=\]<[K- DWORD namelennamelen = 0; if (GetUserName(user, &namelen) == FALSE) bump("Empty user name"); user = malloc(namelen * sizeof(char)); GetUserName(user, &namelen); if (verbose) tell_user(stderr, "Guessing user name: %s", user); strncpy(cfg.username, user, sizeof(cfg.username)-1); cfg.username[sizeof(cfg.username)-1] = '\0'; free(user Revision-number: 837 Prop-content-length: 159 Content-length: 159 K 7 svn:log V 59 Make the colour list failsafe. Patch due to Robert de Bath K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-07T13:39:31.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8de455d136139dbf4d85a7751a19354b Text-delta-base-sha1: a3d2875778de2e7a24eb32b9807af1970fc2e4ba Text-content-length: 559 Text-content-md5: c230ba170a99f7a0327e800c04423a8a Text-content-sha1: d0bf850d9d8e13e37faac63f1c9bfa0674f51cd6 Content-length: 599 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVNa *Ea4-, n; n = SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_GETCOUNT, 0, 0); for (i=n; i-- >0 ;) SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_DELETESTRING, i, 0)n != 12+10*cfg.bold_colour) { for (i=n; i-- >0 ;) SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_DELETESTRING, i, 0); for (i=0; i<22; i++) if (cfg.bold_colour || permcolour[i]) SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_ADDSTRING, 0, (LPARAM) colours[i] Revision-number: 838 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2001-01-07T14:30:00.000000Z K 7 svn:log V 59 AltGr should now work again even when Compose key disabled K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3913b5f93a8d29e2a6f4a9b1962b94c0 Text-delta-base-sha1: e6b9c961233497937c2062858de48e742508a87f Text-content-length: 174 Text-content-md5: 84241258f04bbf1ff46fa1822badb2fb Text-content-sha1: 3f92dcd59099512197060de7bccb18e3ce120db4 Content-length: 214 K 15 cvs2svn:cvs-rev V 4 1.91 PROPS-END SVNQRh$OHT}if (wParam == VK_MENU && (HIWORD(lParam)&KF_EXTENDED)) { keystate[VK_RMENU] = keystate[VK_MENU]; } { compose_state = 0; } Revision-number: 839 Prop-content-length: 208 Content-length: 208 K 8 svn:date V 27 2001-01-07T15:12:20.000000Z K 7 svn:log V 107 Apply `getservbyname' to the Port Number field in case it's non-numeric. Patch due to Christian Biesinger. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c230ba170a99f7a0327e800c04423a8a Text-delta-base-sha1: d0bf850d9d8e13e37faac63f1c9bfa0674f51cd6 Text-content-length: 360 Text-content-md5: 78598a206f2bdad2acbdcd181595938d Text-content-sha1: 73188f4d7827bdc80e637dc901d3aa2e22ef380e Content-length: 400 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVN,Css_port); else cfg.port = 0; } } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 84241258f04bbf1ff46fa1822badb2fb Text-delta-base-sha1: 3f92dcd59099512197060de7bccb18e3ce120db4 Text-content-length: 244 Text-content-md5: 9a5080128e52511bff740d2af9f778ea Text-content-sha1: 3ce119462bd540acb4ac10ad35e369b62d256646 Content-length: 284 K 15 cvs2svn:cvs-rev V 4 1.92 PROPS-END SVN| Y+Yx/* Check for invalid Port number (i.e. zero) */ if (cfg.port == 0) { MessageBox(NULL, "Invalid Port Number", "PuTTY Internal Error", MB_OK |MB_ICONEXCLAMATION); WSACleanup(); return 1; Revision-number: 840 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2001-01-07T15:27:19.000000Z K 7 svn:log V 31 Turn a rogue malloc to smalloc K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 63fcdf09e72745e8510549f42a691e12 Text-delta-base-sha1: 28943326b9cbb842b4a4a2f2175d82c923f47c77 Text-content-length: 25 Text-content-md5: 37b844d4c55a2e74b42ed7268b73d4c2 Text-content-sha1: 9c7753cd93d5f6615ea59a5bac56dc1b1d4a6577 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVN }s Revision-number: 841 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2001-01-07T16:27:48.000000Z K 7 svn:log V 59 `Change Settings' now behaves sensibly w.r.t. window size. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bc065fd50e32776770ed926aebaa2efd Text-delta-base-sha1: e0836447faa77212c3203c9624922350c22f3ebc Text-content-length: 47 Text-content-md5: 537a5766f5063fe4ade5828fd0643865 Text-content-sha1: d37a5acb5f65559b367d94bdce2ca1909276558b Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNk ivoid force_normal(HWND hwn Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 78598a206f2bdad2acbdcd181595938d Text-delta-base-sha1: 73188f4d7827bdc80e637dc901d3aa2e22ef380e Text-content-length: 69 Text-content-md5: 1ba9c70a233254d027185d436d6f54be Text-content-sha1: 14c4be30a3a102defb002e94d715d93ff4b7c493 Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVN,""R@Y=1{ && wp.showCmd == SW_SHOWMAXIMIZED Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9a5080128e52511bff740d2af9f778ea Text-delta-base-sha1: 3ce119462bd540acb4ac10ad35e369b62d256646 Text-content-length: 485 Text-content-md5: 6af70c2c7e2b39102dc6d18e9fbd55dd Text-content-sha1: 081582ab40eb04991b0a1a9ebc97a93b795f6661 Content-length: 525 K 15 cvs2svn:cvs-rev V 4 1.93 PROPS-END SVN|%2+CR)/zs(|,P int need_setwpos = FALSE; cfg.width = cols; cfg.height = rows if (cfg.height != rows || cfg.width != cols || cfg.savelines != savelines) need_setwpos = TRUE;if (need_setwpos) { force_normal(hwnd); SetWindowPos (hwnd, NULL, 0, 0, extra_width + font_width * cfg.width, extra_height + font_height * cfg.height, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); } Revision-number: 842 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2001-01-07T16:35:44.000000Z K 7 svn:log V 72 Fix the System Caret so it really is invisible, and the right size too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6af70c2c7e2b39102dc6d18e9fbd55dd Text-delta-base-sha1: 081582ab40eb04991b0a1a9ebc97a93b795f6661 Text-content-length: 111 Text-content-md5: 017ad4b67e7fda537d390ce9cd179823 Text-content-sha1: 42c05c651fabfc1a3b379b1bd681f32aa1938d4f Content-length: 151 K 15 cvs2svn:cvs-rev V 4 1.94 PROPS-END SVNZObeaDJ CreateCaret(hwnd, caretbm, font_width, font_height);font_width, font_height Revision-number: 843 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2001-01-07T16:38:35.000000Z K 7 svn:log V 74 Oops - that do-we-need-to-resize-window check failed to spot font changes K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 017ad4b67e7fda537d390ce9cd179823 Text-delta-base-sha1: 42c05c651fabfc1a3b379b1bd681f32aa1938d4f Text-content-length: 219 Text-content-md5: 1192694856ada7c83e2af2a80de1bf20 Text-content-sha1: 5503c78bf8e0c76a0ffb8a12b89e1ad2051994ca Content-length: 259 K 15 cvs2svn:cvs-rev V 4 1.95 PROPS-END SVNZw8|>'[int old_fwidth, old_fheight; cfg.width = cols; cfg.height = rows; old_fwidth = font_width; old_fheight = font_heightold_fwidth != font_width || old_fheight != font_height Revision-number: 844 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2001-01-07T17:18:12.000000Z K 7 svn:log V 138 Adam D Ligas's segfault: one form of connection closure was failing to set SSH_STATE_CLOSED, causing subsequent resize events to go foom. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 21699f4a99446b620322685f5f6c3baf Text-delta-base-sha1: 16c4abab8e058ed576b14d8162c62b340d09963c Text-content-length: 54 Text-content-md5: 13f7270cb1939eebd89d8d82d74bf784 Text-content-sha1: 2244a97c64d74eac8ec80dd569b23392b36bfaeb Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVN& 3W0sh_state = SSH_STATE_CLOSED; Revision-number: 845 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2001-01-07T17:18:24.000000Z K 7 svn:log V 37 Squelch some spurious resize events. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1192694856ada7c83e2af2a80de1bf20 Text-delta-base-sha1: 5503c78bf8e0c76a0ffb8a12b89e1ad2051994ca Text-content-length: 171 Text-content-md5: 713f173283c6a76c22d6dbececbbc82b Text-content-sha1: 78b325cf548331afe2fb9a46a6a21503ec4ea93e Content-length: 211 K 15 cvs2svn:cvs-rev V 4 1.96 PROPS-END SVNw!}\\Rb+@*M static int need_backend_resize need_backend_resize = FALS if (need_backend_resize) else need_backend_resize = TRUE Revision-number: 846 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 52 Improved session logging courtesy of Roman Pompejus K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-07T18:24:59.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 537a5766f5063fe4ade5828fd0643865 Text-delta-base-sha1: d37a5acb5f65559b367d94bdce2ca1909276558b Text-content-length: 310 Text-content-md5: 615f45350a7757cb1cfdf97f4ace2379 Text-content-sha1: 9212743c12e92d72fff1590aef5c54decae8d0ec Content-length: 350 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN ' X1fz#define LGTYP_NONE 0 /* logmode: no logging */ #define LGTYP_ASCII 1 /* logmode: pure ascii */ #define LGTYP_DEBUG 2 /* logmode: all chars of taffic */char logfilename[FILENAME_MAX]; int logtypeint askappend(char *filenamelogfopen (void); void logfclose (void Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7911c1acee81e69e0b37d68bb41b675a Text-delta-base-sha1: d901415e90825a252b0c0e3c2ad678503890e3c4 Text-content-length: 283 Text-content-md5: afec7a73d3a6929a97cafb0842358f18 Text-content-sha1: fa143406d3f92ad92d835ddc2f51025c11060d30 Content-length: 323 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN|oP /e write_setting_s (sesskey, "LogFileName", cfg->logfilename); write_setting_i (sesskey, "LogType", cfg->logtype gpps (sesskey, "LogFileName", "putty.log", cfg->logfilename, sizeof(cfg->logfilename)); gppi (sesskey, "LogType", 0, &cfg->logtype Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 49336518818d493384bcf7713445ff43 Text-delta-base-sha1: 3b8fd8ae9c92d6109cf04de5fd870f072fee60cc Text-content-length: 1908 Text-content-md5: 96a0e46f744ced76d46349f5aa3d0622 Text-content-sha1: 0a33c77c60abb94f74f6cc033243f80f241ca3d0 Content-length: 1948 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNo751Z3PqcV@dQ d`/* log session to file stuff ... */ static FILE *lgfp = NULL; static void logtraffic(unsigned char c, int logmodelogtraffic((unsigned char)c, LGTYP_DEBUG); logtraffic((unsigned char)c,LGTYP_ASCII)logtraffic((unsigned char)c,LGTYP_ASCII) *cposlogtraffic((unsigned char)c, LGTYP_ASCII); cpos++ /* * Log session traffic. */ void logtraffic(unsigned char c, int logmode) { if (cfg.logtype > 0) { if (cfg.logtype == logmode) { /* deferred open file from pgm start? */ if (!lgfp) logfopen(); if (lgfp) fputc (c, lgfp); } } } /* open log file append/overwrite mode */ void logfopen(void) { char buf[256]; time_t t; struct tm *tm; char writemod[4]; if (!cfg.logtype) return; sprintf (writemod, "wb"); /* default to rewrite */ lgfp = fopen(cfg.logfilename, "r"); /* file already present? */ if (lgfp) { int i; fclose(lgfp); i = askappend(cfg.logfilename); if (i == 1) writemod[0] = 'a'; /* set append mode */ else if (i == 0) { /* cancelled */ lgfp = NULL; return; } } lgfp = fopen(cfg.logfilename, writemod); if (lgfp) { /* enter into event log */ sprintf(buf, "%s session log (%s mode) to file : ", (writemod[0] == 'a') ? "Appending" : "Writing new", (cfg.logtype == LGTYP_ASCII ? "ASCII" : cfg.logtype == LGTYP_DEBUG ? "raw" : "") ); /* Make sure we do not exceed the output buffer size */ strncat (buf, cfg.logfilename, 128); buf[strlen(buf)] = '\0'; logevent(buf); /* --- write header line iinto log file */ fputs ("=~=~=~=~=~=~=~=~=~=~=~= PuTTY log ", lgfp); time(&t); tm = localtime(&t); strftime(buf, 24, "%Y.%m.%d %H:%M:%S", tm); fputs (buf, lgfp); fputs (" =~=~=~=~=~=~=~=~=~=~=~=\r\n", lgfp); } } void logfclose (void) { if (lgfp) { fclose(lgfp); lgfp = NULL; } } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ba9c70a233254d027185d436d6f54be Text-delta-base-sha1: 14c4be30a3a102defb002e94d715d93ff4b7c493 Text-content-length: 2346 Text-content-md5: 79b9b89b6b7042c46d3cc35271be4532 Text-content-sha1: 7aa0591cddc1316c624f3b95be7652d4af595494 Content-length: 2386 K 15 cvs2svn:cvs-rev V 4 1.86 PROPS-END SVN"PL@y6~)S&)s;L2HLK{XF8!P@K'{UBOX_TERMINAL2, IDC_BOXT_TERMINAL2IDC_LSTATSTATIC, IDC_LSTATOFF, IDC_LSTATASCII, IDC_LSTATRAW, IDC_LGFSTATIC, IDC_LGFEDIT, IDC_LGFBUTTONSetDlgItemText (hwnd, IDC_LGFEDIT, cfg.logfilename); CheckRadioButton(hwnd, IDC_LSTATOFF, IDC_LSTATRAW, cfg.logtype == 0 ? IDC_LSTATOFF : cfg.logtype == 1 ? IDC_LSTATASCII : IDC_LSTATRAWflbenuw */ beginbox(&cp, "Control session logging", IDC_BOX_TERMINAL2, IDC_BOXT_TERMINAL2); radiobig(&cp, "Session logging:", IDC_LSTATSTATIC, "Logging turned &off completely", IDC_LSTATOFF, "Log printable output only", IDC_LSTATASCII, "Log all session output", IDC_LSTATRAW, NULL); editbutton(&cp, "Log &file name:", IDC_LGFSTATIC, IDC_LGFEDIT, "Bro&wse...", IDC_LGFBUTTON); LGFLGFEDIT, cfg.logfilename, sizeof(cfg.logfilename)-1); break; case IDC_LGFsession log file"; of.Flags = 0; if (GetSaveFileName(&of)) { strcpy(cfg.keyfile, filename); SetDlgItemText (hwnd, IDC_LGFEDIT, cfg.keyfile); } break; case IDC_LSTATOFF: case IDC_LSTATASCII: case IDC_LSTATRAW { if (IsDlgButtonChecked (hwnd, IDC_LSTATOFF)) cfg.logtype = 0; if (IsDlgButtonChecked (hwnd, IDC_LSTATASCII)) cfg.logtype = 1; if (IsDlgButtonChecked (hwnd, IDC_LSTATRAW)) cfg.logtype = 2; } /* * Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ int askappend(char *filename) { static const char mbtitle[] = "PuTTY Log to File"; static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n" "You can overwrite it with a new session log,\n" "append your session log to the end of it,\n" "or disable session logging for this session.\n" "Hit Yes to wipe the file, No to append to it,\n" "or Cancel to disable logging."; char message[sizeof(msgtemplate) + FILENAME_MAX]; int mbret; sprintf(message, msgtemplate, FILENAME_MAX, filename); mbret = MessageBox(NULL, message, mbtitle, MB_ICONQUESTION | MB_YESNOCANCEL); if (mbret == IDYES) return 2; else if (mbret == IDNO) return 1; else return 0; } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 713f173283c6a76c22d6dbececbbc82b Text-delta-base-sha1: 78b325cf548331afe2fb9a46a6a21503ec4ea93e Text-content-length: 625 Text-content-md5: 1bb1473dbb0b7f020b1ba0295403ff09 Text-content-sha1: 6e4af37c41d11f5b97fb42bec232263103281a1b Content-length: 665 K 15 cvs2svn:cvs-rev V 4 1.97 PROPS-END SVNh!B,d*{!@ in cfg.logtype = LGTYP_NONEOpen the initial log file if there is one. */ logfopen(char oldlogfile[FILENAME_MAX]; int oldlogtype; int need_setwpos = FALSE; int old_fwidth, old_fheight; strcpy(oldlogfile, cfg.logfilename); oldlogtype = cfg.logtype; cfg.width = cols; cfg.height = rows; old_fwidth = font_width; old_fheight = font_height; if (!do_reconfig(hwnd)) break; if (strcmp(oldlogfile, cfg.logfilename) || oldlogtype != cfg.logtype) { logfclose(); /* reset logging */ logfopen(); } Revision-number: 847 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2001-01-07T18:28:01.000000Z K 7 svn:log V 67 Kestutis Kupciunas's Lithuanian-friendliness patch to TranslateKey K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1bb1473dbb0b7f020b1ba0295403ff09 Text-delta-base-sha1: 6e4af37c41d11f5b97fb42bec232263103281a1b Text-content-length: 156 Text-content-md5: bf7a555701354557c85d596dcb0104f8 Text-content-sha1: b66f3aa5c06a7f12e49eaa892a14b82b69179e4d Content-length: 196 K 15 cvs2svn:cvs-rev V 4 1.98 PROPS-END SVNh3 on`gcGS4@(HKL kbd_layout = GetKeyboardLayout(0) Ex(wParam, 2, kbd_layoutEx(wParam, scan, keystate, keys, 0, kbd_layout Revision-number: 848 Prop-content-length: 590 Content-length: 590 K 8 svn:date V 27 2001-01-07T19:15:59.000000Z K 7 svn:log V 489 Fix for spurious Space getting sent when alt_space and alt_only are both set and you bring up the Sysmenu with an alt_space and dispatch it with an alt_only. (The SYSKEYDOWN for alt_only is never received, but we get the SYSKEYUP which PostMessages the space since it expects to be triggering the _creation_ of a sysmenu. Solution: set alt_state to 0 when an alt_space triggers a sysmenu, so that the final SYSKEYUP will be seen as spurious, which it is. Perhaps we could do this better.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bf7a555701354557c85d596dcb0104f8 Text-delta-base-sha1: b66f3aa5c06a7f12e49eaa892a14b82b69179e4d Text-content-length: 85 Text-content-md5: 615b58e7d5fefaf4b1c9fc255270aec8 Text-content-sha1: 0daba08bb07d2d776739f55626854bf313b2a824 Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.99 PROPS-END SVN3?/isggYMf static int alt_state = 0 alt_state = 0; Revision-number: 849 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2001-01-07T19:16:16.000000Z K 7 svn:log V 58 Jeroen Massar's IPv6 patch. Disabled by default, for now. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 03a52e8c46264cc56b5a85dd0fb4cf99 Text-delta-base-sha1: 11343ccc7425439a341c826d73759a0a98c77d2e Text-content-length: 7384 Text-content-md5: 828decda42fd0a75605ba9a3f5bf7cbf Text-content-sha1: a63c1906404947976e2618a1d8f592ce47e067dd Content-length: 7423 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNn2sjQwP +HDNMJx$V/* * Windows networking abstraction. * * Due to this clean abstraction it was possible * to easily implement IPv6 support :) * * IPv6 patch 1 (27 October 2000) Jeroen Massar * - Preliminary hacked IPv6 support. * - Connecting to IPv6 address (eg fec0:4242:4242:100:2d0:b7ff:fe8f:5d42) works. * - Connecting to IPv6 hostname (eg heaven.ipv6.unfix.org) works. * - Compiles as either IPv4 or IPv6. * * IPv6 patch 2 (29 October 2000) Jeroen Massar * - When compiled as IPv6 it also allows connecting to IPv4 hosts. * - Added some more documentation. * * IPv6 patch 3 (18 November 2000) Jeroen Massar * - It now supports dynamically loading the IPv6 resolver dll's. * This way we should be able to distribute one (1) binary * which supports both IPv4 and IPv6. * - getaddrinfo() and getnameinfo() are loaded dynamicaly if possible. * - in6addr_any is defined in this file so we don't need to link to wship6.lib * - The patch is now more unified so that we can still * remove all IPv6 support by undef'ing IPV6. * But where it fallsback to IPv4 it uses the IPv4 code which is already in place... * - Canonical name resolving works. * * IPv6 patch 4 (07 January 2001) Jeroen Massar * - patch against CVS of today, will be submitted to the bugs list * as a 'cvs diff -u' on Simon's request... * */ /* * Define IPV6 to have IPv6 on-the-fly-loading support. * This means that one doesn't have to have an IPv6 stack to use it. * But if an IPv6 stack is found it is used with a fallback to IPv4. */ /* #define IPV6 1 */ #ifdef IPV6 #include #include #include #else #include #endif #include family = 0; /* We set this one when we have resolved the host. */ *canonicalname = ret->realhost; /* This makes sure we always have a hostname to return. */ if ( (a = inet_addr(host)) == (unsigned long) INADDR_NONE) { #ifdef IPV6 /* Try to get the getaddrinfo() function from wship6.dll */ /* This way one doesn't need to have IPv6 dll's to use PuTTY and * it will fallback to IPv4. */ typedef int (CALLBACK* FGETADDRINFO)(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res); FGETADDRINFO fGetAddrInfo = NULL; HINSTANCE dllWSHIP6 = LoadLibrary("wship6.dll"); if (dllWSHIP6) fGetAddrInfo = (FGETADDRINFO)GetProcAddress(dllWSHIP6, "getaddrinfo"); /* * Use fGetAddrInfo when it's available (which usually also * means IPv6 is installed...) */ if (fGetAddrInfo) { /*debug(("Resolving \"%s\" with getaddrinfo() (IPv4+IPv6 capable)...\n", host)); */ if (fGetAddrInfo(host, NULL, NULL, &ret->ai) == 0) ret->family = ret->ai->ai_family; } else #endif /* * Otherwise use the IPv4-only gethostbyname... * (NOTE: we don't use gethostbyname as a * fallback!) */ if (ret->family == 0) { /*debug(("Resolving \"%s\" with gethostbyname() (IPv4 only)...\n", host)); */ if (h = gethostbyname(host)) ret->family = AF_INET; } /*debug(("Done resolving...(family is %d) AF_INET = %d, AF_INET6 = %d\n", ret->family, AF_INET, AF_INET6)); */ if (ret->family == 0) { DWORD err = WSAGetLastError(); ret->error = (err == WSAENETDOWN ? "Network is down" : err == WSAHOST_NOT_FOUND ? "Host does not exist" : err == WSATRY_AGAIN ? "Host not found" : #ifdef IPV6 fGetAddrInfo ? "getaddrinfo: unknown error" : #endif "gethostbyname: unknown error"); #ifdef DEBUG { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); debug(("Error %ld: %s (h=%lx)\n", err, lpMsgBuf, h)); /* Free the buffer. */ LocalFree(lpMsgBuf); } #endif } else { ret->error = NULL; #ifdef IPV6 /* If we got an address info use that... */ if (ret->ai) { typedef int (CALLBACK* FGETNAMEINFO) (const struct sockaddr FAR *sa, socklen_t salen, char FAR * host, size_t hostlen, char FAR * serv, size_t servlen, int flags); FGETNAMEINFO fGetNameInfo = NULL; /* Are we in IPv4 fallback mode? */ /* We put the IPv4 address into the a variable so we can further-on use the IPv4 code... */ if (ret->family == AF_INET) memcpy(&a, (char *)&((SOCKADDR_IN *)ret->ai->ai_addr)->sin_addr, sizeof(a)); /* Now let's find that canonicalname... */ if ((dllWSHIP6) && (fGetNameInfo = (FGETNAMEINFO)GetProcAddress(dllWSHIP6, "getnameinfo"))) { if (fGetNameInfo((struct sockaddr *)ret->ai->ai_addr, ret->family == AF_INET ? sizeof(SOCKADDR_IN) : sizeof(SOCKADDR_IN6), ret->realhost, sizeof(ret->realhost), NULL, 0, 0) != 0) { strncpy(ret->realhost, host, sizeof(ret->realhost)); } } } /* We used the IPv4-only gethostbyname()... */ else { #endif memcpy(&a, h->h_addr, sizeof(a)); /* This way we are always sure the h->h_name is valid :) */ strncpy(ret->realhost, h->h_name, sizeof(ret->realhost)); #ifdef IPV6 } #endif } #ifdef IPV6 FreeLibrary(dllWSHIP6); #endif } else { *canonicalname = host; } ret->address = ntohl(a);#ifdef IPV6 SOCKADDR_IN6 a6; #endifaddr->family#ifdef IPV6 if (addr->family == AF_INET6) { memset(&a6,0,sizeof(a6)); a6.sin6_family = AF_INET6; /*a6.sin6_addr = in6addr_any;*/ /* == 0 */ a6.sin6_port = htons(0); } else { #endif a.sin_family = AF_INET; a.sin_addr.s_addr = htonl(INADDR_ANY); a.sin_port = htons(0); #ifdef IPV6 } if (bind (s, (addr->family == AF_INET6) ? (struct sockaddr *)&a6 : (struct sockaddr *)&a, (addr->family == AF_INET6) ? sizeof(a6) : sizeof(a)) == SOCKET_ERROR) #else if (bind (s, (struct sockaddr *)&a, sizeof(a)) == SOCKET_ERROR) #endif { err = WSAGetLastError(); Connect to remote address. */ #ifdef IPV6 if (addr->family == AF_INET6) { memset(&a,0,sizeof(a)); a6.sin6_family = AF_INET6; a6.sin6_port = htons((short)port); a6.sin6_addr = ((struct sockaddr_in6 *)addr->ai->ai_addr)->sin6_addr; } else { #endif a.sin_family = AF_INET; a.sin_addr.s_addr = htonl(addr->address); a.sin_port = htons((short)port); #ifdef IPV6 } if (connect (s, (addr->family == AF_INET6) ? (struct sockaddr *)&a6 : (struct sockaddr *)&a, (addr->family == AF_INET6) ? sizeof(a6) : sizeof(a)) == SOCKET_ERROR) #else if (connect (s, (struct sockaddr *)&a, sizeof(a)) == SOCKET_ERROR) #endif { err = WSAGetLastError(); Revision-number: 850 Prop-content-length: 440 Content-length: 440 K 7 svn:log V 339 Ensure ssh specials (EOF and PING) don't occur except in connection states where they're meaningful. In case Plink misses an EOF by attempting to send it before reaching SSH_STATE_SESSION, it is buffered and sent later. PINGs can be sent during any part of the initialisation phase _except_ before deciding whether to use protocol 1 or 2. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-08T13:57:45.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 13f7270cb1939eebd89d8d82d74bf784 Text-delta-base-sha1: 2244a97c64d74eac8ec80dd569b23392b36bfaeb Text-content-length: 700 Text-content-md5: 0a86dac6ee762aff298080c991c4e148 Text-content-sha1: 8804849c7bf30d97079a8c19e6b18946edc311df Content-length: 740 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVN&R\.x4 3w<R9k !a*GtR|*PREPACKET,PREPACKET; static int size_needed = FALSE, eofstatic void ssh_special (Telnet_Special ssh_state = SSH_STATE_BEFORE_SIZE; if (eof_needed) ssh_special(TS_EOF if (eof_needed) ssh_special(TS_EOFPREPACKET break;state != SSH_STATE_SESSION) { /* * Buffer the EOF in case we are pre-SESSION, so we can * send it as soon as we reach SESSION. */ if (code == TS_EOF) eof_needed = TRUE; return; }state == SSH_STATE_CLOSED || ssh_state == SSH_STATE_PREPACKET) return; Revision-number: 851 Prop-content-length: 188 Content-length: 188 K 7 svn:log V 88 Disable logging completely if the user selects Cancel when told the file already exists K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-08T16:24:13.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 96a0e46f744ced76d46349f5aa3d0622 Text-delta-base-sha1: 0a33c77c60abb94f74f6cc033243f80f241ca3d0 Text-content-length: 85 Text-content-md5: 77689fdefb82f555c6b4e76b93dccbb8 Text-content-sha1: 17ef9eb378c9004f39c9e391f00307e981a79d12 Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN7t <+ * cfg.logtype = 0; /* disable logging */ Revision-number: 852 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2001-01-08T16:28:21.000000Z K 7 svn:log V 65 Enable explicit changing of the window title after session start K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79b9b89b6b7042c46d3cc35271be4532 Text-delta-base-sha1: 7aa0591cddc1316c624f3b95be7652d4af595494 Text-content-length: 128 Text-content-md5: 4f344728ddd7e7ebd7e2082d4d40c932 Text-content-sha1: 0a525d09fca04be3aa03c21fe7cf007b8c150b48 Content-length: 168 K 15 cvs2svn:cvs-rev V 4 1.87 PROPS-END SVNe e"e multiedit(&cp, "Window &title:", IDC_WINTITLE, Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 615b58e7d5fefaf4b1c9fc255270aec8 Text-delta-base-sha1: 0daba08bb07d2d776739f55626854bf313b2a824 Text-content-length: 129 Text-content-md5: 83cbba1dea3bdd589b39d1f9fd3dc0f7 Text-content-sha1: 1e7b2a5cc2c4dd34b8592406e59868fb24cc93ca Content-length: 170 K 15 cvs2svn:cvs-rev V 5 1.100 PROPS-END SVN?1_}Ga{tK GetWindowText(hwnd, cfg.wintitle, sizeof(cfg.wintitle))set_title(cfg.wintitle); Revision-number: 853 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2001-01-09T17:16:43.000000Z K 7 svn:log V 42 Oops - accidentally undid rev 1.82 [r844] K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0a86dac6ee762aff298080c991c4e148 Text-delta-base-sha1: 8804849c7bf30d97079a8c19e6b18946edc311df Text-content-length: 54 Text-content-md5: 4f54772cd8516bb235be04c4e31183ab Text-content-sha1: 5f8ac72ec0bb26dbc7bd18952c177e4678ef862a Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVN< /q,sh_state = SSH_STATE_CLOSED; Revision-number: 854 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2001-01-09T17:25:06.000000Z K 7 svn:log V 56 IPv4 numeric addresses were broken thanks to IPv6 patch K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 828decda42fd0a75605ba9a3f5bf7cbf Text-delta-base-sha1: a63c1906404947976e2618a1d8f592ce47e067dd Text-content-length: 190 Text-content-md5: b0e06aeb2c6a746eb85601eb32a7d95a Text-content-sha1: 5aeb42bc4ee0181b07c7cad3e3309d427c8e0fc1 Content-length: 229 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN: $%$q$ /* * Hack inserted to deal with problems with numeric IPs. * FIXME: how will this work in IPv6? */ ret->family = AF_INET; Revision-number: 855 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2001-01-11T13:19:11.000000Z K 7 svn:log V 29 Remove rogue debug statement K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b0e06aeb2c6a746eb85601eb32a7d95a Text-delta-base-sha1: 5aeb42bc4ee0181b07c7cad3e3309d427c8e0fc1 Text-content-length: 80 Text-content-md5: d069d4c061eda2c38523cf19768da1f6 Text-content-sha1: d8a4fa512b2fe87c145177fa5fffc51b9cb827ad Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN:> 9M8/*debug(("Error %ld: %s (h=%lx)\n", err, lpMsgBuf, h));*/ Revision-number: 856 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:27.858554Z PROPS-END Revision-number: 857 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:27.865489Z PROPS-END Revision-number: 858 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:27.872499Z PROPS-END Revision-number: 859 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:27.879251Z PROPS-END Revision-number: 860 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:27.886708Z PROPS-END Revision-number: 861 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:27.893332Z PROPS-END Revision-number: 862 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:27.899968Z PROPS-END Revision-number: 863 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:27.907744Z PROPS-END Revision-number: 864 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:27.914279Z PROPS-END Revision-number: 865 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2001-01-17T10:11:16.000000Z K 7 svn:log V 57 Initial checkin of an outline for the PuTTY user manual. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 345 Text-content-md5: 998c385a4c94400680603229aa3c6b61 Text-content-sha1: 249b2d0989a654173770251a651d4a582eaaf088 Content-length: 461 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNKKKCHAPTERS = blurb intro gs config pscp plink pubkey pageant trouble INPUTS = $(patsubst %,%.but,$(CHAPTERS)) # This is temporary. Hack it locally or something. BUTTRESS = $(HOME)/src/buttress/build/buttress Contents.html: $(INPUTS) $(HOME)/src/buttress/build/buttress $(INPUTS) rm -f index.html ln -s Contents.html index.html Node-path: putty/doc/blurb.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 406 Text-content-md5: 71815daa8a39b293f869d06d2b31355d Text-content-sha1: ceb1680a291b4004f530efabe649f6e78c83052d Content-length: 522 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN\title PuTTY User Manual \cfg{xhtml-leaf-smallest-contents}{2} \cfg{xhtml-leaf-contains-contents}{true} \preamble PuTTY is a free (MIT-licensed) Win32 Telnet and SSH client. This manual documents PuTTY, and its companion utilities PSCP, Plink, Pageant and PuTTYgen. \copyright Copyright 2001 Simon Tatham. All rights reserved. You may distribute this documentation under the MIT licence. Node-path: putty/doc/config.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 118 Text-content-md5: 19b3b8e43dcbdb096fb1259ee6f93479 Text-content-sha1: b9f8e7f6b90e74a9b4697036c565fa004d94b5fc Content-length: 234 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNkkk\C{config} Configuring PuTTY \# Walk the user through the whole config box explaining all the \# options. Node-path: putty/doc/gs.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 106 Text-content-md5: 22f8b64c34e9735598182e4f1950174a Text-content-sha1: 6d402ca376e5a347475945652c9a69e4c56f10f8 Content-length: 222 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN___\C{gs} Getting started with PuTTY \# Walk the user through starting an SSH or Telnet session. Node-path: putty/doc/intro.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 454 Text-content-md5: 90074e30e020e0cdb160288a9e669971 Text-content-sha1: 5babbefa8b44f5a1a7f03acb6417d839da34b467 Content-length: 570 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN888\C{intro} Introduction to PuTTY \# PuTTY is an SSH and Telnet client \# Section on `what is Telnet? what is SSH?' for the people who \# don't have the first clue what they are. Explain what they're \# good for and why you might want to use one, and explain under \# what conditions you might _not_ want to use one. \# Section on `what's the difference between Telnet and SSH?' where \# we evangelise - POLITELY! - about SSH and security Node-path: putty/doc/pageant.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2521 Text-content-md5: 8b9099fbb780192f213a572d78a55760 Text-content-sha1: 7f547d227ee44cd548d89734f7531b95b28550a3 Content-length: 2637 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNKKK\C{pageant} Using Pageant for authentication Pageant is an SSH authentication agent. It holds your private keys in memory, already decoded, so that you can use them often without needing to type a passphrase. Currently, Pageant only works with SSH v1. \H{pageant-start} Getting started with Pageant Before you run Pageant, you need to have a private key. See [FIXME: chapter unwritten] to find out how to generate and use one. When you run Pageant, it will put an icon of a computer wearing a hat into the System tray. It will then sit and do nothing. If you click the Pageant icon with the right mouse button, you will see a menu. Select \e{View Keys} from this menu. The Pageant main window will appear. (You can also bring this window up by double-clicking on the Pageant icon.) The Pageant window contains a list box. This shows the private keys Pageant is holding. When you start Pageant, it has no keys, so the list box will be empty. To add a key to Pageant, press the \e{Add Key} button. Pageant will bring up a file dialog, labelled \q{Select Private Key File}. Find your private key file in this dialog, and press \e{Open}. Pageant will now load the private key. If the key is protected by a passphrase, Pageant will ask you to type the passphrase. When the key has been loaded, it will appear in the list in the Pageant window. Now start PuTTY and open an SSH session to a site that accepts your key. PuTTY will notice that Pageant is running, retrieve the key automatically from Pageant, and use it to authenticate. You can now open as many PuTTY sessions as you like without having to type your passphrase again. When you want to shut down Pageant, click the right button on the Pageant icon in the System tray, and select \e{Exit} from the menu. Closing the Pageant main window does \e{not} shut down Pageant. \H{pageant-forward} Using agent forwarding \# Walk the user through enabling agent forwarding and starting a \# second-level session. \# Demonstrate the use of ssh-add at the remote end. \H{pageant-security} Security considerations \# Explain that local use of Pageant allows you convenient one-touch \# authentication without ever storing a decrypted key on disk \# Explain that, despite this, it still doesn't protect you against \# your local machine being hacked (swap files, but more importantly \# trojans) \# Explain that forwarding agent connections to a remote site \# can be abused by the sysadmin of that site, so you'd better know \# you can trust them Node-path: putty/doc/plink.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 411 Text-content-md5: 7d2c31a7601172ce48abc920dbf93279 Text-content-sha1: 44664e6251587b91184b6067972b570bf9d528f9 Content-length: 527 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  \C{plink} Using the command-line connection tool Plink \# Explain Plink \# Explain that Plink is probably not what you want if you want to \# run an interactive session in a Command Prompt window \# Explain that Plink is really for batch-file use, and that \# therefore it works best with public-key authentication; link to \# that chapter \# Give instructions on how to set up Plink with CVS Node-path: putty/doc/pscp.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 196 Text-content-md5: dd9c8c10990d815faabf4db3c06426e6 Text-content-sha1: 47141f532b6559fce0a482a24f61cff9a436af61 Content-length: 312 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN666\C{pscp} Using PSCP to transfer files securely \# Explain PSCP: the command line, the modes of use (local->remote \# and remote->local, recursive, wildcards). \# Link to iXplorer. Node-path: putty/doc/pubkey.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 705 Text-content-md5: 8b43e560eca509414321995a10593712 Text-content-sha1: 202199bfbbd2f342ad1bd8465db6d6f3567604a8 Content-length: 821 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN333\C{pubkey} Using public keys for SSH authentication \# Explain the basic principles of public key authentication. Many \# people don't have the faintest idea what it is or why it's good. \# Explain the dangers of leaving an unprotected private key around. \# Explain passphrases, and urge that people NEVER store \# unpassphrased keys unless they really need to or they can be sure \# the machine is secure. \# Mention a good length for a passphrase. (I think Schneier \# said something about this on counterpane.com once.) \# In case people don't like the idea of exchanging a short password \# typed every time for a longer passphrase typed every time, link \# to the Pageant chapter. Node-path: putty/doc/trouble.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 170 Text-content-md5: 762173a22d231c10635666047b70c8e5 Text-content-sha1: 447c601c4e032ac2d2a73e0abfe78e76f8238a37 Content-length: 286 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN\C{trouble} Troubleshooting PuTTY \# This chapter should accumulate common problems as they come up. \# It's conceptually the bug-hunting part of the FAQ. Revision-number: 866 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:28.494342Z PROPS-END Revision-number: 867 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2001-01-17T12:46:50.000000Z K 7 svn:log V 58 Continue writing documentation. Looks like a long job :-( K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 19b3b8e43dcbdb096fb1259ee6f93479 Text-delta-base-sha1: b9f8e7f6b90e74a9b4697036c565fa004d94b5fc Text-content-length: 11595 Text-content-md5: a4031958af62ef376dd723baf8b11f0d Text-content-sha1: 3dd5f4df6fecd70a95c89760394e2155442425e1 Content-length: 11634 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNk===\C{config} Configuring PuTTY This chapter describes all the configuration options in PuTTY. PuTTY is configured using the control panel that comes up before you start a session. Some options can also be changed in the middle of a session, by selecting \e{Change Settings} from the window menu. \H{config-session} The Session panel The Session configuration panel contains the basic options you need to specify in order to open a session at all, and also allows you to save your settings to be reloaded later. \S{config-hostname} The host name section The top box on the Session panel, labelled \q{Specify your connection by host name}, contains the details that need to be filled in before PuTTY can open a session at all. \b The \e{Host Name} box is where you type the name, or the IP address, of the server you want to connect to. \b The \e{Protocol} radio buttons let you choose what type of connection you want to make: a raw connection, a Telnet connection, or an SSH connection. \#{ FIXME: link to sections on these? } \b The \e{Port} box lets you specify which port number on the server to connect to. If you select Telnet or SSH, this box will be filled in automatically to the usual value, and you will only need to change it if you have an unusual server. If you select Raw mode, you will almost certainly need to fill in the \e{Port} box. \S{config-saving} Loading and storing saved sessions The next part of the Session configuration panel allows you to save your preferred PuTTY options so they will appear automatically the next time you start PuTTY. It also allows you to create \e{saved sessions}, which contain a full set of configuration options plus a host name and protocol. A saved session contains all the information PuTTY needs to start exactly the session you want. \b To save your default settings: first set up the settings the way you want them saved. Then come back to the Session panel. Select the \q{Default Settings} entry in the saved sessions list, with a single click. Then press the \e{Save} button. \b To save a session: first go through the rest of the configuration box setting up all the options you want. Then come back to the Session panel. Enter a name for the saved session in the \e{Saved Sessions} input box. (The server name is often a good choice for a saved session name.) Then press the \e{Save} button. Your saved session name should now appear in the list box. \b To reload a saved session: single-click to select the session name in the list box, and then press the \e{Load} button. Your saved settings should all appear in the configuration panel. \b To modify a saved session: first load it as described above. Then make the changes you want. Come back to the Session panel, single-click to select the session name in the list box, and press the \e{Save} button. The new settings will be saved over the top of the old ones. \b To start a saved session immediately: double-click on the session name in the list box. \b To delete a saved session: single-click to select the session name in the list box, and then press the \e{Delete} button. Each saved session is independent of the Default Settings configuration. If you change your preferences and update Default Settings, you must also update every saved session separately. \S{config-closeonexit} \q{Close Window on Exit} Finally in the Session panel, there is a check box labelled \q{Close Window on Exit}. If this is turned on, the PuTTY session window will disappear as soon as the session inside it terminates. Otherwise, the window will remain on the desktop until you close it yourself, so you can still read and copy text out of it. \H{config-terminal} The Terminal panel The Terminal configuration panel allows you to control the behaviour of PuTTY's terminal emulation. \S{config-autowrap} \q{Auto wrap mode initially on} Auto wrap mode controls what happens when text printed in a PuTTY window reaches the right-hand edge of the window. With auto wrap mode on, if a long line of text reaches the right-hand edge, it will wrap over on to the next line so you can still see all the text. With auto wrap mode off, the cursor will stay at the right-hand edge of the screen, and all the characters in the line will be printed on top of each other. If you are running a full-screen application and you occasionally find the screen scrolling up when it looks as if it shouldn't, you could try turning this option off. Auto wrap mode can be turned on and off by control sequences sent by the server. This configuration option only controls the \e{default} state. If you modify this option in mid-session using \e{Change Settings}, you will need to reset the terminal \#{ FIXME } before the change takes effect. \S{config-decom} \q{DEC Origin Mode initially on} DEC Origin Mode is a minor option which controls how PuTTY interprets cursor-position control sequences sent by the server. The server can send a control sequence that restricts the scrolling region of the display. For example, in an editor, the server might reserve a line at the top of the screen and a line at the bottom, and might send a control sequence that causes scrolling operations to affect only the remaining lines. With DEC Origin Mode on, cursor coordinates are counted from the top of the scrolling region. With it turned off, cursor coordinates are counted from the top of the whole screen regardless of the scrolling region. It is unlikely you would need to change this option, but if you find a full-screen application is displaying pieces of text in what looks like the wrong part of the screen, you could try turning DEC Origin Mode on to see whether that helps. DEC Origin Mode can be turned on and off by control sequences sent by the server. This configuration option only controls the \e{default} state. If you modify this option in mid-session using \e{Change Settings}, you will need to reset the terminal \#{ FIXME } before the change takes effect. \S{config-crlf} \q{Implicit CR in every LF} Most servers send two control characters, CR and LF, to start a new line of the screen. The CR character makes the cursor return to the left-hand side of the screen. The LF character makes the cursor move one line down (and might make the screen scroll). Some servers only send LF, and expect the terminal to move the cursor over to the left automatically. If you come across a server that does this, you will see a stepped effect on the screen, like this: \c First line of text \c Second line \c Third line If this happens to you, try enabling the \q{Implicit CR in every LF} option, and things might go back to normal: \c First line of text \c Second line \c Third line \S{config-beep} \q{Beep enabled} This option lets you turn off beeps in PuTTY. If your server is beeping too much or attracting unwelcome attention, you can turn the beeps off. \S{config-erase} \q{Use background colour to erase screen} Not all terminals agree on what colour to turn the screen when the server sends a \q{clear screen} sequence. Some terminals believe the screen should always be cleared to the \e{default} background colour. Others believe the screen should be cleared to whatever the server has selected as a background colour. There exist applications that expect both kinds of behaviour. Therefore, PuTTY can be configured to do either. With this option disabled, screen clearing is always done in the default background colour. With this option enabled, it is done in the \e{current} background colour. \S{config-blink} \q{Enable blinking text} The server can ask PuTTY to display text that blinks on and off. This is very distracting, so PuTTY allows you to turn blinking text off completely. \S{config-localterm} \q{Use local terminal line discipline} Normally, every character you type into the PuTTY window is sent straight to the server. If you enable local terminal line discipline, this changes. PuTTY will let you edit a whole line at a time locally, and the line will only be sent to the server when you press Return. If you make a mistake, you can use the Backspace key to correct it before you press Return, and the server will never see the mistake. Since it would be hard to edit a line locally without being able to see it, local terminal line discipline also makes PuTTY echo what you type. This makes it ideal for use in raw mode \#{ FIXME } or when connecting to MUDs or talkers. \S{config-logging} Controlling session logging PuTTY has the ability to log the output from your session into a file. You might want this if you were saving a particular piece of output to mail to somebody, for example in a bug report. You can choose between: \b not logging anything (the default) \b logging only the printable characters in a session (ignoring control sequences to change colours or clear the screen) \b logging everything sent to the terminal by the server. You can turn logging on and off in mid-session using \e{Change Settings}. \H{config-keyboard} The Keyboard panel \S{config-backspace} Changing the action of the Backspace key \S{config-homeend} Changing the action of the Home and End keys \S{config-funkeys} Changing the action of the function keys and keypad \S{config-appcursor} Controlling Application Cursor Keys mode \S{config-appkeypad} Controlling Application Keypad mode \S{config-nethack} Using NetHack keypad mode \S{config-compose} Enabling a DEC-like Compose key \H{config-window} The Window panel \S{config-winsize} Setting the size of the PuTTY window \S{config-scrollback} Controlling scrollback \S{config-warnonclose} \q{Warn before closing window} \S{config-altf4} \q{Window closes on ALT-F4} \S{config-altspace} \q{System menu appears on ALT-Space} \S{config-altonly} \q{System menu appears on Alt alone} \S{config-alwaysontop} \q{Ensure window is always on top} \H{config-appearance} The Appearance panel \S{config-cursor} Controlling the appearance of the cursor \# this will look considerably less silly when we bring in \# underline-versus-block-versus-vertical-line cursor configuration \# and also allow the cursor to vanish on keypress a la Word. Until \# then, this box does look silly with only one thing in it. Deal. \S{config-font} Controlling the font used in the terminal window \S{config-title} Controlling the window title \H{config-translation} The Translation panel \S{config-linedraw} Line drawing characters \S{config-outputtrans} Character set translation of output data \S{config-inputtrans} Character set translation of input data \H{config-selection} The Selection panel \S{config-mouse} Changing the actions of the mouse buttons \S{config-charclasses} Configuring word-by-word selection \H{config-colours} The Colours panel \S{config-boldcolour} \q{Bolded text is a different colour} \S{config-logpalette} \q{Attempt to use logical palettes} \S{config-colourcfg} Adjusting the colours in the terminal window \H{config-connection} The Connection panel \S{config-termtype} \q{Terminal-type string} \S{config-username} \q{Auto-login username} \S{config-keepalive} Using keepalives to prevent disconnection \H{config-telnet} The Telnet panel \S{config-termspeed} \q{Terminal-speed string} \S{config-environ} Setting environment variables on the server \S{config-oldenviron} \q{Handling of OLD_ENVIRON ambiguity} \H{config-ssh} The SSH panel \S{config-command} Executing a specific command on the server \S{config-auth} SSH authentication options \S{config-protocol} SSH protocol options Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8b9099fbb780192f213a572d78a55760 Text-delta-base-sha1: 7f547d227ee44cd548d89734f7531b95b28550a3 Text-content-length: 32 Text-content-md5: 59e5d579f0e1111e01e807483e52fee8 Text-content-sha1: 446dd53b0feb01a342042dffc0286ed649ec98d6 Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNK; jF \k{pubkey} Revision-number: 868 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2001-01-17T16:33:26.000000Z K 7 svn:log V 35 Further work on writing the manual K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a4031958af62ef376dd723baf8b11f0d Text-delta-base-sha1: 3dd5f4df6fecd70a95c89760394e2155442425e1 Text-content-length: 8856 Text-content-md5: aeb8e9ab37ecc0609d7e3a73b4282475 Text-content-sha1: 5480a4e6ee1bb3c42e9d9b6241d99b0c6d41cc53 Content-length: 8895 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN=36Uud`'YBZi6dATM\N'The Keyboard configuration panel allows you to control the behaviour of the keyboard in PuTTY. \S{config-backspace} Changing the action of the Backspace key Some terminals believe that the Backspace key should send the same thing to the server as Control-H (ASCII code 8). Other terminals believe that the Backspace key should send ASCII code 127 (usually known as Control-?) so that it can be distinguished from Control-H. This option allows you to choose which code PuTTY generates when you press Backspace. If you are connecting to a Unix system, you will probably find that the Unix \c{stty} command lets you configure which the server expects to see, so you might not need to change which one PuTTY generates. On other systems, the server's expectation might be fixed and you might have no choice but to configure PuTTY. If you do have the choice, we recommend configuring PuTTY to generate Control-? and configuring the server to expect it, because that allows applications such as \c{emacs} to use Control-H for help. \S{config-homeend} Changing the action of the Home and End keys The Unix terminal emulator \c{rxvt} disagrees with the rest of the world about what character sequences should be sent to the server by the Home and End keys. \c{xterm}, and other terminals, send \c{ESC [1~} for the Home key, and \c{ESC [4~} for the End key. \c{rxvt} sends \c{ESC [H} for the Home key and \c{ESC [Ow} for the End key. If you find an application on which the Home and End keys aren't working, you could try switching this option to see if it helps. \S{config-funkeys} Changing the action of the function keys and keypad This option affects the function keys (F1 to F12) and the top row of the numeric keypad. \b In the default mode, labelled \c{ESC [n~}, the function keys generate sequences like \c{ESC [11~}, \c{ESC [12~} and so on. This matches the general behaviour of Digital's terminals. \b In Linux mode, F6 to F12 behave just like the default mode, but F1 to F5 generate \c{ESC [[A} through to \c{ESC [[E}. This mimics the Linux virtual console. \b In Xterm R6 mode, F5 to F12 behave like the default mode, but F1 to F4 generate \c{ESC OP} through to \c{ESC OS}, which are the sequences produced by the top row of the \e{keypad} on Digital's terminals. \b In VT400 mode, all the function keys behave like the default mode, but the actual top row of the numeric keypad generates \c{ESC OP} through to \c{ESC OS}. If you don't know what any of this means, you probably don't need to fiddle with it. \S{config-appcursor} Controlling Application Cursor Keys mode Application Cursor Keys mode is a way for the server to change the control sequences sent by the arrow keys. In normal mode, the arrow keys send \c{ESC [A} through to \c{ESC [D}. In application mode, they send \c{ESC OA} through to \c{ESC OD}. Application Cursor Keys mode can be turned on and off by the server, depending on the application. PuTTY allows you to configure the initial state, and also allows you to disable application mode completely. \S{config-appkeypad} Controlling Application Keypad mode Application Keypad mode is a way for the server to change the behaviour of the numeric keypad. In normal mode, the keypad behaves like a normal Windows keypad: with NumLock on, the number keys generate numbers, and with NumLock off they act like the arrow keys and Home, End etc. In application mode, all the keypad keys send special control sequences, \e{including} Num Lock. Num Lock stops behaving like Num Lock and becomes another function key. Depending on which version of Windows you run, you may find the Num Lock light still flashes on and off every time you press Num Lock, even when application mode is active and Num Lock is acting like a function key. This is unavoidable. Application keypad mode can be turned on and off by the server, depending on the application. PuTTY allows you to configure the initial state, and also allows you to disable application mode completely. \S{config-nethack} Using NetHack keypad mode PuTTY has a special mode for playing NetHack. You can enable it by selecting \q{NetHack} in the \q{Initial state of numeric keypad} control. In this mode, the numeric keypad keys 1-9 generate the NetHack movement commands (\cw{hjklyubn}). The 5 key generates the \c{.} command (do nothing). Better still, pressing Shift with the keypad keys generates the capital forms of the commands (\cw{HJKLYUBN}), which tells NetHack to keep moving you in the same direction until you encounter something interesting. For some reason, this feature only works properly when Num Lock is on. We don't know why. \S{config-compose} Enabling a DEC-like Compose key DEC terminals have a Compose key, which provides an easy-to-remember way of typing accented characters. You press Compose and then type two more characters. The two characters are \q{combined} to produce an accented character. The choices of character are designed to be easy to remember; for example, composing \q{e} and \q{`} produces the \q{\u00e8{e-grave}} character. If you enable the \q{Application and AltGr act as Compose key} option, the Windows Application key and the AltGr key will both have this behaviour. \H{config-window} The Window panel The Window configuration panel allows you to control aspects of the PuTTY window and its behaviour. \S{config-winsize} Setting the size of the PuTTY window The \e{Rows} and \e{Columns} boxes let you set the PuTTY window to a precise size. Of course you can also drag the window to a new size while a session is running. If you are running an application which is unable to deal with changes in window size, you might want to enable the \q{Lock window size against resizing} option, which prevents the user from accidentally changing the size of the window. \S{config-scrollback} Controlling scrollback Text that scrolls off the top of the PuTTY terminal window is kept for reference. The scrollbar on the right of the window lets you view the scrolled-off text. You can also page through the scrollback using the keyboard, by pressing Shift-PgUp and Shift-PgDn. The \q{Lines of scrollback} box lets you configure how many lines of text PuTTY keeps. The \q{Display scrollbar} option allows you to hide the scrollbar (although you can still view the scrollback using Shift-PgUp and Shift-PgDn). If you are viewing part of the scrollback when the server sends more text to PuTTY, the screen will revert to showing the current terminal contents. You can disable this behaviour by turning off \q{Reset scrollback on display activity}. You can also make the screen revert when you press a key, by turning on \q{Reset scrollback on keypress}. \S{config-warnonclose} \q{Warn before closing window} If you press the Close button in a PuTTY window that contains a running session, PuTTY will put up a warning window asking if you really meant to close the window. A window whose session has already terminated can always be closed without a warning. If you want to be able to close a window quickly, you can disable the \q{Warn before closing window} option. \S{config-altf4} \q{Window closes on ALT-F4} By default, pressing ALT-F4 causes the window to close (or a warning box to appear; see \k{config-warnonclose}). If you disable the \q{Window closes on ALT-F4} option, then pressing ALT-F4 will simply send a key sequence to the server. \S{config-altspace} \q{System menu appears on ALT-Space} If this option is enabled, then pressing ALT-Space will bring up the PuTTY window's menu, like clicking on the top left corner. If it is disabled, then pressing ALT-Space will just send \c{ESC SPACE} to the server. \S{config-altonly} \q{System menu appears on Alt alone} If this option is enabled, then pressing and releasing ALT will bring up the PuTTY window's menu, like clicking on the top left corner. If it is disabled, then pressing and releasing ALT will have no effect. \S{config-alwaysontop} \q{Ensure window is always on top} If this option is enabled, the PuTTY window will stay on top of all other windows. \H{config-appearance} The Appearance panel The Appearance configuration panel allows you to control aspects of PuTTY's appearance.The Translation configuration panel allows you to control the translation between the character set understood by the server and the character set understood by PuTTY.The Selection panel allows you to control the way copy and paste work in the PuTTY window.The Colours panel allows you to control PuTTY's use of colour.The Connection panel allows you to configure options that apply to more than one type of connection.The Telnet panel allows you to configure options that only apply to Telnet sessions.The SSH panel allows you to configure options that only apply to SSH sessions. Revision-number: 869 Prop-content-length: 179 Content-length: 179 K 7 svn:log V 79 Trivial fix for when the two directions select different encryption algorithms K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-17T16:57:15.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4f54772cd8516bb235be04c4e31183ab Text-delta-base-sha1: 5f8ac72ec0bb26dbc7bd18952c177e4678ef862a Text-content-length: 28 Text-content-md5: a5ac11955693107d88edff89b1fc44ac Text-content-sha1: 25e58787e948331b2e09697602b6047ae2a34ffa Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVN<< MmOsc Revision-number: 870 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2001-01-17T16:57:33.000000Z K 7 svn:log V 62 Introduce alternative cursor shapes: underline, vertical line K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 615f45350a7757cb1cfdf97f4ace2379 Text-delta-base-sha1: 9212743c12e92d72fff1590aef5c54decae8d0ec Text-content-length: 165 Text-content-md5: dbc81e8164250ef51e96c3cbdc93d07b Text-content-sha1: c83b7a51ff9d5b35b88e48ade1b26271df2878c1 Content-length: 205 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVN'9tO^s_H#define ATTR_RIGHTCURS 0x10000000UL /* doubles as cursor-on-RHS indicator */cursor_type; /* 0=block 1=underline 2=vertical */ Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: afec7a73d3a6929a97cafb0842358f18 Text-delta-base-sha1: fa143406d3f92ad92d835ddc2f51025c11060d30 Text-content-length: 83 Text-content-md5: 8be974bc0ea5daefbae82edaa4c7c4a9 Text-content-sha1: 8b7b62a9a169c33c95877115e568c9eb970a2c7a Content-length: 123 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN81xCurType", cfg->cursor_typeCurType", 0, &cfg->cursor_type Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 77689fdefb82f555c6b4e76b93dccbb8 Text-delta-base-sha1: 17ef9eb378c9004f39c9e391f00307e981a79d12 Text-content-length: 97 Text-content-md5: 6370fbb2c9a69c64521a090b4e5a7757 Text-content-sha1: b013a6a92b8358bfa1411ff1d36275a1891ef2fb Content-length: 137 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNt3<>S8~ h if (wrapnext) cursor |= ATTR_RIGHT(*d &~ ATTR_WRAPPED) Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4f344728ddd7e7ebd7e2082d4d40c932 Text-delta-base-sha1: 0a525d09fca04be3aa03c21fe7cf007b8c150b48 Text-content-length: 597 Text-content-md5: 58e7e1fb3be9011040e94d05369c26bd Text-content-sha1: 7fb578f82d5dcf112e5900d1d6ccf6ac8f9d0465 Content-length: 637 K 15 cvs2svn:cvs-rev V 4 1.88 PROPS-END SVNJBv4l|*9$.tUW@W@W@Y;CURSTATIC, IDC_CURBLOCK, IDC_CURUNDER, IDC_CURVERTRadioButton (hwnd, IDC_CURBLOCK, IDC_CURVERT, cfg.cursor_type==0 ? IDC_CURBLOCK : cfg.cursor_type==1 ? IDC_CURUNDER : IDC_CURVERTbluvradioline(&cp, "Cursor appearance:", IDC_CURSTATIC, 3, "B&lock", IDC_CURBLOCK, "&Underline", IDC_CURUNDER, "&Vertical line", IDC_CURVERT, NULL case IDC_CURBLOCKcursor_type = 0; break; case IDC_CURUNDERcursor_type = 1; break; case IDC_CURVERTcursor_type = 2 Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 83cbba1dea3bdd589b39d1f9fd3dc0f7 Text-delta-base-sha1: 1e7b2a5cc2c4dd34b8592406e59868fb24cc93ca Text-content-length: 685 Text-content-md5: f4f23203c8bd1e2667163f45084efa58 Text-content-sha1: 82735629401981d976a30e7a7c540a3d36d688c0 Content-length: 726 K 15 cvs2svn:cvs-rev V 5 1.101 PROPS-END SVN1`u@n[(;v(attr & ATTR_ACTCURS) && cfg.cursor_type == 0(attr & ATTR_PASCURS) && cfg.cursor.type == 0 if ((attr & (ATTR_ACTCURS | ATTR_PASCURS)) && cfg.cursor_type != 0) { HPEN oldpen; int pentype; if (attr & ATTR_PASCURS) pentype = PS_DOTTED; else pentype = PS_SOLID; oldpen = SelectObject (hdc, CreatePen(pentype, 0, colours[23])); if (cfg.cursor_type == 1) { MoveToEx (hdc, x, y+descent, NULL); LineTo (hdc, x+fnt_width-1, y+descent); } else { int xadjust = 0; if (attr & ATTR_RIGHTCURS) xadjust = fnt_width-1; MoveToEx (hdc, x+xadjust, y, NULL); LineTo (hdc, x+xadjust, y+font_height-1); } Revision-number: 871 Prop-content-length: 374 Content-length: 374 K 8 svn:date V 27 2001-01-17T17:20:28.000000Z K 7 svn:log V 273 Tidy up that latest checkin. PS_DOTTED is spelled PS_DOT and in any case doesn't really cut it; we have to SetPixel every other one manually because although PS_ALTERNATE exists it only works under NT. Meanwhile, IDC_CURSTATIC was already used, for the cursor _keys_. Duh. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 58e7e1fb3be9011040e94d05369c26bd Text-delta-base-sha1: 7fb578f82d5dcf112e5900d1d6ccf6ac8f9d0465 Text-content-length: 34 Text-content-md5: 1934724a203872cd626d53753c401a88 Text-content-sha1: b7302f7253120a0ec807d828ba2318e166b27ef3 Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.89 PROPS-END SVNJPz{xYqOO Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f4f23203c8bd1e2667163f45084efa58 Text-delta-base-sha1: 82735629401981d976a30e7a7c540a3d36d688c0 Text-content-length: 887 Text-content-md5: 9146e2027af53946dbcfa3b3438a85e6 Text-content-sha1: a50ae67d54bcc193419e5a531a222551918d8d99 Content-length: 928 K 15 cvs2svn:cvs-rev V 5 1.102 PROPS-END SVN``KI(Xs"oq_int startx, starty, dx, dy, length, i; if (cfg.cursor_type == 1) { startx = x; starty = y+descent; dx = 1; dy = 0; length = fnt_width; startx = x+xadjust; starty = y; dx = 0; dy = 1; length = font_height; } if (attr & ATTR_ACTCURS) { HPEN oldpen; oldpen = SelectObject (hdc, CreatePen(PS_SOLID, 0, colours[23])); MoveToEx (hdc, startx, starty, NULL); LineTo (hdc, startx+dx*length, starty+dy*length); oldpen = SelectObject (hdc, oldpen); DeleteObject (oldpen); } else { for (i = 0; i < length; i++) { if (i % 2 == 0) { SetPixel(hdc, startx, starty, colours[23]); } startx += dx; starty += dy; } } Revision-number: 872 Prop-content-length: 580 Content-length: 580 K 7 svn:log V 479 The `wrapnext' variable now states whether we _would_ wrap next character if we were wrapping, not whether we _will_ wrap next character. Makes for saner behaviour with vertical-line cursor and also when changing autowrap mode while on rightmost column. Does entail small behavioural changes to backspace and destructive- backspace when in rightmost column with Auto Wrap off, but I don't think they should be catastrophic, or indeed that there's a well defined Right Behaviour. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-17T17:25:58.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6370fbb2c9a69c64521a090b4e5a7757 Text-delta-base-sha1: b013a6a92b8358bfa1411ff1d36275a1891ef2fb Text-content-length: 51 Text-content-md5: 91e7677aea16d617d521c7e40e2f24cd Text-content-sha1: c4651bcd68be8625fb431dfaf47896ffd0ea3c52 Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN3: IVJc , && wrapTRUE Revision-number: 873 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 Add a .cvsignore file K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-18T17:29:01.000000Z PROPS-END Node-path: putty/doc Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 44 Content-length: 44 K 10 svn:ignore V 12 *.html *.txt PROPS-END Node-path: putty/doc/.cvsignore Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 23 Text-content-md5: b00932915a821fde81d934c075485431 Text-content-sha1: 401551da083e0ca5c300617a77fae5a173ef6b68 Content-length: 139 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  *.html *.txt Revision-number: 874 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2001-01-19T09:01:50.000000Z K 7 svn:log V 42 Keepalives are now in seconds not minutes K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dbc81e8164250ef51e96c3cbdc93d07b Text-delta-base-sha1: c83b7a51ff9d5b35b88e48ade1b26271df2878c1 Text-content-length: 54 Text-content-md5: d97ceca00b488fee0be80ec912933553 Text-content-sha1: f655e46dfb13944d7ffec7dc5ab5dc447bd29a56 Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVN9Z !* /* in seconds */ Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8be974bc0ea5daefbae82edaa4c7c4a9 Text-delta-base-sha1: 8b7b62a9a169c33c95877115e568c9eb970a2c7a Text-content-length: 409 Text-content-md5: 991a3c3f883292cc108d8d1d33d8ef61 Text-content-sha1: 61adf44db0fec674145b3568aa3d08c46fcbaead Content-length: 449 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNHzWsQY&a / 60); /* minutes */ write_setting_i (sesskey, "PingIntervalSecs", cfg->ping_interval % 60); /* seconds */{ /* This is two values for backward compatibility with 0.50/0.51 */ int pingmin, pingsec; gppi (sesskey, "PingInterval", 0, &pingmin); gppi (sesskey, "PingIntervalSecs", 0, &pingsec); cfg->ping_interval = pingmin*60 + pingsec; } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1934724a203872cd626d53753c401a88 Text-delta-base-sha1: b7302f7253120a0ec807d828ba2318e166b27ef3 Text-content-length: 32 Text-content-md5: 411a380c81241446cf941513e9af20c1 Text-content-sha1: 6a1fc1cca2f712c619cd48f05d8772a4cb893878 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.90 PROPS-END SVNPP sWySecond Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9146e2027af53946dbcfa3b3438a85e6 Text-delta-base-sha1: a50ae67d54bcc193419e5a531a222551918d8d99 Text-content-length: 25 Text-content-md5: b85c4199ea3baf77dfd2971bbfbc58fb Text-content-sha1: 816a88a3c7f496856f9ae5fd83fb88355b6decb7 Content-length: 66 K 15 cvs2svn:cvs-rev V 5 1.103 PROPS-END SVN`V J T Revision-number: 875 Prop-content-length: 259 Content-length: 259 K 8 svn:date V 27 2001-01-19T10:10:37.000000Z K 7 svn:log V 158 Experimental Rlogin support, thanks to Delian Delchev. Local flow control is unsupported, and server-to-client comms may fail for want of working TCP Urgent. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 45c68ec62c4b6d04a4151386760f06f8 Text-delta-base-sha1: ed00b82ab1dea6cbc4241dfc066ece9eeabdef3d Text-content-length: 54 Text-content-md5: 310a9e203fb35c3fae029c1a71bde1b0 Text-content-sha1: a9e36948b6138d0e8ad457f686f6a1459f1aa699 Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNK]L #include #include #include "putty.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif static Socket s = NULL; static void rlogin_size(void); static int sb_opt, sb_len; static char *sb_buf = NULL; static int sb_size = 0; #define SB_DELTA 1024 static void c_write (char *buf, int len) { from_backend(0, buf, len); } static int rlogin_receive (Socket s, int urgent, char *data, int len) { if (!len) { /* Connection has closed. */ sk_close(s); s = NULL; return 0; } if (urgent == 2) { char c; int i; c = *data++; len--; if (c == 0x80) rlogin_size(); /* * We should flush everything (aka Telnet SYNCH) if we see * 0x02, and we should turn off and on _local_ flow control * on 0x10 and 0x20 respectively. I'm not convinced it's * worth it... */ } c_write(data, len); return 1; } /* * Called to set up the rlogin connection. * * Returns an error message, or NULL on success. * * Also places the canonical host name into `realhost'. */ static char *rlogin_init (char *host, int port, char **realhost) { SockAddr addr; char *err; /* * Try to find host. */ addr = sk_namelookup(host, realhost); if ( (err = sk_addr_error(addr)) ) return err; if (port < 0) port = 513; /* default rlogin port */ /* * Open socket. */ s = sk_new(addr, port, 1, rlogin_receive); if ( (err = sk_socket_error(s)) ) return err; sk_addr_free(addr); /* * Send local username, remote username, terminal/speed */ { char z = 0; char *p; sk_write(s, &z, 1); sk_write(s, cfg.localusername, strlen(cfg.localusername)); sk_write(s, &z, 1); sk_write(s, cfg.username, strlen(cfg.username)); sk_write(s, &z, 1); sk_write(s, cfg.termtype, strlen(cfg.termtype)); sk_write(s, "/", 1); for(p = cfg.termspeed; isdigit(*p); p++); sk_write(s, cfg.termspeed, p - cfg.termspeed); sk_write(s, &z, 1); } begin_session(); return NULL; } /* * Called to send data down the rlogin connection. */ static void rlogin_send (char *buf, int len) { if (s == NULL) return; sk_write(s, buf, len); } /* * Called to set the size of the window */ static void rlogin_size(void) { char b[12] = { 0xFF, 0xFF, 0x73, 0x73, 0, 0, 0, 0, 0, 0, 0, 0 }; b[6] = cols >> 8; b[7] = cols & 0xFF; b[4] = rows >> 8; b[5] = rows & 0xFF; sk_write(s, b, 12); return; } /* * Send rlogin special codes. */ static void rlogin_special (Telnet_Special code) { /* Do nothing! */ return; } static Socket rlogin_socket(void) { return s; } static int rlogin_sendok(void) { return 1; } Backend rlogin_backend = { rlogin_init, rlogin_send, rlogin_size, rlogin_special, rlogin_socket, rlogin_sendok, 1 }; Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 991a3c3f883292cc108d8d1d33d8ef61 Text-delta-base-sha1: 61adf44db0fec674145b3568aa3d08c46fcbaead Text-content-length: 137 Text-content-md5: 056e521be09a25ad0bb2645db57ea979 Text-content-sha1: 1d41595b80cd1778fa87d4fee41f47f55ff2da4d Content-length: 177 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNHemp4SFTts (sesskey, "LocalUserName", cfg->locals (sesskey, "LocalUserName", "", cfg->localusername, sizeof(cfg->local Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a5ac11955693107d88edff89b1fc44ac Text-delta-base-sha1: 25e58787e948331b2e09697602b6047ae2a34ffa Text-content-length: 27 Text-content-md5: 3a8d2bde92fe0f7d5ec158b972ba2308 Text-content-sha1: 35447ea85dd4c3d94bb704f57d47f90e98b4230f Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.86 PROPS-END SVNPi_^=[uRLOGINrloginpanelstart, IDC_TITLE_RLOGIN, IDC_BOX_RLOGIN1, IDC_BOXT_RLOGIN1, IDC_BOX_RLOGIN2, IDC_BOXT_RLOGIN2, IDC_R_TSSTATIC, IDC_R_TSEDIT, IDC_RLLUSERSTATIC, IDC_RLLUSEREDIT, rlogin cfg.protocol==PROT_RLOGIN ? IDC_PROTRLOGINR_TSEDIT, cfg.termspeed); SetDlgItemText (hwnd, IDC_RLLUSEREDIT, cfg.localusername4, "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTTELNET, "R&login", IDC_PROTRLOGIN, NULL); } else { radioline(&cp, "Protocol:", IDC_PROTSTATIC, 4, "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTTELNET, "R&login", IDC_PROTRLOGIN /* The Rlogin PanelRlogin connections", IDC_TITLE_RLOGINRLOGIN1, IDC_BOXT_RLOGIN1); staticedit(&cp, "Terminal-&speed string", IDC_R_TSSTATIC, IDC_R_TSEDIT, 50); staticedit(&cp, "&Local username:", IDC_RLLUSERSTATIC, IDC_RLLUSEREDIT, 50RloginRlogin")) hide(hwnd, FALSE, rloginpanelstart, rloginRLOGINint k = IsDlgButtonChecked (hwnd, IDC_PROTRLOGIN); cfg.protocol = i ? PROT_SSH : j ? PROT_TELNET : k ? PROT_RLOGIN : PROT_RAW ; if ((cfg.protocol == PROT_SSH && cfg.port != 22) || (cfg.protocol == PROT_TELNET && cfg.port != 23) || (cfg.protocol == PROT_RLOGIN && cfg.port != 513)) { cfg.port = i ? 22 : j ? 23 : 51case IDC_R_TSEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, LOWORD(wParam)RLLUSEREDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_RLLUSEREDIT, cfg.localusername, sizeof(cfg.local Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d069d4c061eda2c38523cf19768da1f6 Text-delta-base-sha1: d8a4fa512b2fe87c145177fa5fffc51b9cb827ad Text-content-length: 1574 Text-content-md5: 1c4156049aa25714d65b90033a39f607 Text-content-sha1: 923b66f8322eeef2e51f07d10c4179388f254c70 Content-length: 1614 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN>{zOt*Ae6int priv short localport if (privport) localport = 1023; /* count from 1023 downwards */ else localport = 0; /* just use port 0 (ie winsock picks) */ /* Loop round trying to bind */ while (1) { int retcode; #ifdef IPV6 if (addr->family == AF_INET6) { memset(&a6,0,sizeof(a6)); a6.sin6_family = AF_INET6; /*a6.sin6_addr = in6addr_any;*/ /* == 0 */ a6.sin6_port = htons(localport); } else { #endif a.sin_family = AF_INET; a.sin_addr.s_addr = htonl(INADDR_ANY); a.sin_port = htons(localport); #ifdef IPV6 } retcode = bind (s, (addr->family == AF_INET6 ? (struct sockaddr *)&a6 : (struct sockaddr *)&a), (addr->family == AF_INET6 ? sizeof(a6) : sizeof(a))); #else retcode = bind (s, (struct sockaddr *)&a, sizeof(a)); #endif if (retcode != SOCKET_ERROR) { err = 0; break; /* done */ } else { err = WSAGetLastError(); if (err != WSAEADDRINUSE) /* failed, for a bad reason */ break; } if (localport == 0) break; /* we're only looping once */ localport--; if (localport == 0) break; /* we might have got to the end */ } if (err) { Revision-number: 876 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:29.309765Z PROPS-END Revision-number: 877 Prop-content-length: 191 Content-length: 191 K 7 svn:log V 91 Make sure it's SSH, and not Rlogin, which gets omitted from the PuTTYtel config box. Oops! K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-20T11:00:07.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 92116f97bf10df76aab3fb7b75589b58 Text-delta-base-sha1: 56426ff3d78bfbcf221299e84edb3d33a02b8cbd Text-content-length: 35 Text-content-md5: a8cd4529638756bf2e47f3338942d7b4 Text-content-sha1: fb76e6052f599910881dd4f9ef2f49ed0cbb7235 Content-length: 75 K 15 cvs2svn:cvs-rev V 4 1.92 PROPS-END SVNMM647al33 Revision-number: 878 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2001-01-22T11:34:52.000000Z K 7 svn:log V 53 Add X11 forwarding, mainly thanks to Andreas Schultz K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 310a9e203fb35c3fae029c1a71bde1b0 Text-delta-base-sha1: a9e36948b6138d0e8ad457f686f6a1459f1aa699 Text-content-length: 101 Text-content-md5: e626b709be294a0cd0ce1e82307b2e90 Text-content-sha1: 63549aa83cf4de85661f8d19d297972f4d725a3d Content-length: 141 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNKO.,x11_forward); write_setting_s (sesskey, "X11Display", cfg->x11_display gppi (sesskey, "X11Forward", 0, &cfg->x11_forward); gpps (sesskey, "X11Display", "localhost:0", cfg->x11_display, sizeof(cfg->x11_display) Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3a8d2bde92fe0f7d5ec158b972ba2308 Text-delta-base-sha1: 35447ea85dd4c3d94bb704f57d47f90e98b4230f Text-content-length: 3044 Text-content-md5: 5ec7990ec1f04722c1d0c87061730770 Text-content-sha1: a22e959f3d3dcb06da32ea379fc2966eb40644a4 Content-length: 3084 K 15 cvs2svn:cvs-rev V 4 1.87 PROPS-END SVN?+og;5*S.sn2>bol G%M ,r LfZtm,%D(PmRSMSG_X11_OPEN 27 /* 0x1b */ #define SSH1_CMSG_PORT_FORWARD_REQUEST 28 /* 0x1c */ #define SSH1_MSG_PORT_OPEN 29 /* 0x1dMSG_IGNORE 32 /* 0x20CMSG_X11_REQUEST_FORWARDING 34 /* 0x22 */ #define SSH1_CMSG_AUTH_RHOSTS_RSA 35 /* 0x23extern char *x11_init (Socket *, char *, void *, char **); extern void x11_close (Socket); extern void x11_send (Socket , char *, int); extern void x11_invent_auth(char *, int, char *, int)_x11_channel { Socket s; } x11; int ssh_X11_void sshfwd_close(struct ssh_channel *c) { if (c) { send_packet(SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid, PKT_END); logevent("X11 connection terminated"); c->closes = 1; c->u.x11.s = NULL; } } void sshfwd_write(struct ssh_channel *c, char *buf, int len) { send_packet(SSH1_MSG_CHANNEL_DATA, PKT_INT, c->remoteid, PKT_INT, len, PKT_DATA, buf, len, PKT_ENDcfg.x11_forward) { char proto[20], data[64]; logevent("Requesting X11 forwarding"); x11_invent_auth(proto, sizeof(proto), data, sizeof(data)); send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKT_STR, data, PKT_INT, 0, logevent("X11 forwarding refused"); } else { logevent("X11 forwarding enabled"); ssh_X11_X11X-Server. Give them back a local channel number. */ unsigned i; struct ssh_channel *c, *d; enum234 e; logevent("Received X11 connect request"); /* Refuse if X11 forwarding is disabled. */ if (!ssh_X11_ logevent("Rejected X11 connect request"); } else { char *rh; c = smalloc(sizeof(struct ssh_channel)); if ( x11_init(&c->u.x11.s, cfg.x11_display, c, &rh) != NULL ) { logevent("opening X11 forward connection failed"); sfree(c); send_packet(SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(pktin.body), PKT_END); } else { logevent("opening X11 forward connection succeeded"); for (i=1, d = first234(ssh_channels, &e); d; d = next234(&e)) { if (d->localid > i) break; /* found a free number */ i = d->localid + 1; } c->remoteid = GET_32BIT(pktin.body); c->localid = i; c->closes = 0; c->type = SSH1_SMSG_X11_OPEN;/* identify channel type */ add234(ssh_channels, c); send_packet(SSH1_MSG_CHANNEL_OPEN_CONFIRMATION, PKT_INT, c->remoteid, PKT_INT, c->localid, PKT_END); logevent("Opened X11 forward channel"); } } if ((c->closes == 0) && (c->type == SSH1_SMSG_X11_OPEN)) { logevent("X11 connection closed"); assert(c->u.x11.s != NULL); x11_close(c->u.x11.s); c->u.x11.s = NULL; }X11_OPEN: x11_send(c->u.x11.s, p, len); break; Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a8cd4529638756bf2e47f3338942d7b4 Text-delta-base-sha1: fb76e6052f599910881dd4f9ef2f49ed0cbb7235 Text-content-length: 1198 Text-content-md5: fbad0b05d3ec896efa8e2ee253ccd5d0 Text-content-sha1: cee56b8e60f02971a18b05238be170507652f3bc Content-length: 1238 K 15 cvs2svn:cvs-rev V 4 1.93 PROPS-END SVNMU5kVcGxO'#tzrX@m`tunnelspanelstart, IDC_BOX_TUNNELS, IDC_BOXT_TUNNELS, IDC_X11_FORWARD, IDC_X11_DISPSTATIC, IDC_X11_DISPLAY, tunnels CheckDlgButton (hwnd, IDC_X11_FORWARD, cfg.x11_forward); SetDlgItemText (hwnd, IDC_X11_DISPLAY, cfg.x11_display /* The Tunnels panel. Accelerators used: [acgo] ex */ { struct ctlpos tp; ctlposinit(&tp, hwnd, 80, 3, 13); if (dlgtype == 0) { beginbox(&tp, "X11 forwarding options", IDC_BOX_TUNNELS, IDC_BOXT_TUNNELS); checkbox(&tp, "&Enable X11 forwarding", IDC_X11_FORWARD); multiedit(&tp, "&X display location", IDC_X11_DISPSTATIC, IDC_X11_DISPLAY, 50, NULL); endbox(&tp); treeview_insert(&tvfaff, 2, "Tunnels"); } Tunnels")) hide(hwnd, FALSE, tunnelspanelstart, tunnels case IDC_X11_FORWARx11_forward = IsDlgButtonChecked (hwnd, IDC_X11_FORWARD); break; case IDC_X11_DISPLAY: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_X11_DISPLAY, cfg.x11_display, sizeof(cfg.x11_display)-1); Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1c4156049aa25714d65b90033a39f607 Text-delta-base-sha1: 923b66f8322eeef2e51f07d10c4179388f254c70 Text-content-length: 72 Text-content-md5: 18c14316d551edf75de80bb6ba240b32 Text-content-sha1: efb5f985435a02fff76bb46d0957f557abb6114c Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN{1 1@@;extern char *do_select(SOCKET skt, int startup); Node-path: putty/x11fwd.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 8039 Text-content-md5: 5d4e6f2999fbe7707ca90cf4ed367c83 Text-content-sha1: 0504a9516669f0cdd2c8feffad4ef0425e7ce2b7 Content-length: 8155 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNYYY#include #include #include #include "putty.h" #include "ssh.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define GET_32BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8) | \ ((unsigned long)(unsigned char)(cp)[2] << 16) | \ ((unsigned long)(unsigned char)(cp)[3] << 24)) #define PUT_32BIT_LSB_FIRST(cp, value) ( \ (cp)[0] = (value), \ (cp)[1] = (value) >> 8, \ (cp)[2] = (value) >> 16, \ (cp)[3] = (value) >> 24 ) #define GET_16BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8)) #define PUT_16BIT_LSB_FIRST(cp, value) ( \ (cp)[0] = (value), \ (cp)[1] = (value) >> 8 ) #define GET_32BIT_MSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) #define PUT_32BIT_MSB_FIRST(cp, value) ( \ (cp)[0] = (value) >> 24, \ (cp)[1] = (value) >> 16, \ (cp)[2] = (value) >> 8, \ (cp)[3] = (value) ) #define GET_16BIT_MSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 8) | \ ((unsigned long)(unsigned char)(cp)[1])) #define PUT_16BIT_MSB_FIRST(cp, value) ( \ (cp)[0] = (value) >> 8, \ (cp)[1] = (value) ) #define GET_16BIT(endian, cp) \ (endian=='B' ? GET_16BIT_MSB_FIRST(cp) : GET_16BIT_LSB_FIRST(cp)) #define PUT_16BIT(endian, cp, val) \ (endian=='B' ? PUT_16BIT_MSB_FIRST(cp, val) : PUT_16BIT_LSB_FIRST(cp, val)) extern void sshfwd_close(void *); extern void sshfwd_write(void *, char *, int); struct X11Private { unsigned char firstpkt[12]; /* first X data packet */ char *auth_protocol; unsigned char *auth_data; int data_read, auth_plen, auth_psize, auth_dlen, auth_dsize; int verified; void *c; /* data used by ssh.c */ }; void x11_close (Socket s); static unsigned char x11_authdata[64]; static int x11_authdatalen; void x11_invent_auth(char *proto, int protomaxlen, char *data, int datamaxlen) { char ourdata[64]; int i; /* MIT-MAGIC-COOKIE-1. Cookie size is 128 bits (16 bytes). */ x11_authdatalen = 16; for (i = 0; i < 16; i++) x11_authdata[i] = random_byte(); /* Now format for the recipient. */ strncpy(proto, "MIT-MAGIC-COOKIE-1", protomaxlen); ourdata[0] = '\0'; for (i = 0; i < x11_authdatalen; i++) sprintf(ourdata+strlen(ourdata), "%02x", x11_authdata[i]); strncpy(data, ourdata, datamaxlen); } static int x11_verify(char *proto, unsigned char *data, int dlen) { if (strcmp(proto, "MIT-MAGIC-COOKIE-1") != 0) return 0; /* wrong protocol attempted */ if (dlen != x11_authdatalen) return 0; /* cookie was wrong length */ if (memcmp(x11_authdata, data, dlen) != 0) return 0; /* cookie was wrong cookie! */ return 1; } static int x11_receive (Socket s, int urgent, char *data, int len) { struct X11Private *pr = (struct X11Private *)sk_get_private_ptr(s); if (!len) { /* Connection has closed. */ sshfwd_close(pr->c); x11_close(s); return 1; } sshfwd_write(pr->c, data, len); return 1; } /* * Called to set up the raw connection. * * Returns an error message, or NULL on success. * also, fills the SocketsStructure * * Also places the canonical host name into `realhost'. */ char *x11_init (Socket *s, char *display, void *c, char **realhost) { SockAddr addr; int port; char *err; char host[128]; int n, displaynum; struct X11Private *pr; /* * Split up display name into host and display-number parts. */ n = strcspn(display, ":"); if (display[n]) displaynum = atoi(display+n+1); else displaynum = 0; /* sensible default */ if (n > sizeof(host)-1) n = sizeof(host)-1; strncpy(host, display, n); host[n] = '\0'; /* * Try to find host. */ addr = sk_namelookup(host, realhost); if ( (err = sk_addr_error(addr)) ) return err; port = 6000 + displaynum; /* * Open socket. */ *s = sk_new(addr, port, 0, x11_receive); if ( (err = sk_socket_error(*s)) ) return err; pr = (struct X11Private *)smalloc(sizeof(struct X11Private)); pr->auth_protocol = NULL; pr->verified = 0; pr->data_read = 0; pr->c = c; sk_set_private_ptr(*s, pr); sk_addr_free(addr); return NULL; } void x11_close (Socket s) { struct X11Private *pr = (struct X11Private *)sk_get_private_ptr(s); if (pr->auth_protocol) { sfree(pr->auth_protocol); sfree(pr->auth_data); } sfree(pr); sk_close(s); } /* * Called to send data down the raw connection. */ void x11_send (Socket s, char *data, int len) { struct X11Private *pr = (struct X11Private *)sk_get_private_ptr(s); if (s == NULL) return; /* * Read the first packet. */ while (len > 0 && pr->data_read < 12) pr->firstpkt[pr->data_read++] = (unsigned char)(len--, *data++); if (pr->data_read < 12) return; /* * If we have not allocated the auth_protocol and auth_data * strings, do so now. */ if (!pr->auth_protocol) { pr->auth_plen = GET_16BIT(pr->firstpkt[0], pr->firstpkt+6); pr->auth_dlen = GET_16BIT(pr->firstpkt[0], pr->firstpkt+8); pr->auth_psize = (pr->auth_plen + 3) &~ 3; pr->auth_dsize = (pr->auth_dlen + 3) &~ 3; /* Leave room for a terminating zero, to make our lives easier. */ pr->auth_protocol = (char *)smalloc(pr->auth_psize+1); pr->auth_data = (char *)smalloc(pr->auth_dsize); } /* * Read the auth_protocol and auth_data strings. */ while (len > 0 && pr->data_read < 12 + pr->auth_psize) pr->auth_protocol[pr->data_read++ - 12] = (len--, *data++); while (len > 0 && pr->data_read < 12 + pr->auth_psize + pr->auth_dsize) pr->auth_data[pr->data_read++ - 12 - pr->auth_psize] = (unsigned char)(len--, *data++); if (pr->data_read < 12 + pr->auth_psize + pr->auth_dsize) return; /* * If we haven't verified the authentication, do so now. */ if (!pr->verified) { int ret; pr->auth_protocol[pr->auth_plen] = '\0'; /* ASCIZ */ ret = x11_verify(pr->auth_protocol, pr->auth_data, pr->auth_dlen); /* * If authentication failed, construct and send an error * packet, then terminate the connection. */ if (!ret) { char message[] = "Authentication failed at PuTTY X11 proxy"; unsigned char reply[8 + sizeof(message) + 4]; int msglen = sizeof(message)-1; /* skip zero byte */ int msgsize = (msglen+3) &~ 3; reply[0] = 0; /* failure */ reply[1] = msglen; /* length of reason string */ memcpy(reply+2, pr->firstpkt+2, 4); /* major/minor proto vsn */ PUT_16BIT(pr->firstpkt[0], reply+6, msglen >> 2); /* data len */ memset(reply+8, 0, msgsize); memcpy(reply+8, message, msglen); sshfwd_write(pr->c, reply, 8+msgsize); sshfwd_close(pr->c); x11_close(s); return; } /* * Now we know we're going to accept the connection. Strip * the auth data. (TODO: if we ever work out how, we should * replace some real auth data in here.) */ PUT_16BIT(pr->firstpkt[0], pr->firstpkt+6, 0); /* auth proto */ PUT_16BIT(pr->firstpkt[0], pr->firstpkt+8, 0); /* auth data */ sk_write(s, pr->firstpkt, 12); pr->verified = 1; } /* * After initialisation, just copy data simply. */ sk_write(s, data, len); } Revision-number: 879 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2001-01-22T12:35:16.000000Z K 7 svn:log V 86 Try the blindingly-obvious fix for the hidden-controls-are-still- accessible GUI bug. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fbad0b05d3ec896efa8e2ee253ccd5d0 Text-delta-base-sha1: cee56b8e60f02971a18b05238be170507652f3bc Text-content-length: 195 Text-content-md5: 8c30bafa12722ed0329d419fb3505ab6 Text-content-sha1: 3f43200fbb347cbd200fa9ee0a1d10ca9c30228c Content-length: 235 K 15 cvs2svn:cvs-rev V 4 1.94 PROPS-END SVNUN&Z&N if (!hide) EnableWindow(ctl, 1); ShowWindow(ctl, hide ? SW_HIDE : SW_SHOW); if (hide) EnableWindow(ctl, 0 Revision-number: 880 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2001-01-22T13:15:52.000000Z K 7 svn:log V 33 Add a title to the Tunnels panel K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8c30bafa12722ed0329d419fb3505ab6 Text-delta-base-sha1: 3f43200fbb347cbd200fa9ee0a1d10ca9c30228c Text-content-length: 451 Text-content-md5: 422ddf7ee9552cad0bf0c0d0493e99a5 Text-content-sha1: 328c569dbcb82fd4f3d5e6a85bd1a18359027a12 Content-length: 491 K 15 cvs2svn:cvs-rev V 4 1.95 PROPS-END SVNN3qtg{ PvmaTITLE_TUNNELStunnelling", IDC_TITLE_TUNNELS); beginbox(&cp, "X11 forwarding options", IDC_BOX_TUNNELS, IDC_BOXT_TUNNELS); checkbox(&cp, "&Enable X11 forwarding", IDC_X11_FORWARD); multiedit(&cp, "&X display location", IDC_X11_DISPSTATIC, IDC_X11_DISPLAY, 50 Revision-number: 881 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 35 Update the file list in .cvsignore K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-22T13:32:05.000000Z PROPS-END Node-path: putty Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 148 Content-length: 148 K 10 svn:ignore V 115 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp *.tds *.map Makefile.bor Makefile.cyg PROPS-END Node-path: putty/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bc2eaa10b5e1013d626b5a52b2a6bb40 Text-delta-base-sha1: 26b6c1d132cdfffb878e85428e6530e05d39b49a Text-content-length: 51 Text-content-md5: fbfee0bf1543d1d3a68e4d1efe87efc3 Text-content-sha1: 4112aac537e482248d71b80880391e0d71f84d90 Content-length: 90 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNxt&N*.tds *.map Makefile.bor Makefile.cyg Revision-number: 882 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2001-01-22T15:36:07.000000Z K 7 svn:log V 147 Bring the SSH2 channel architecture up to scratch, enabling X forwarding to work under SSH2. Also - surprise! - implement X forwarding under SSH2. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5ec7990ec1f04722c1d0c87061730770 Text-delta-base-sha1: a22e959f3d3dcb06da32ea379fc2966eb40644a4 Text-content-length: 9341 Text-content-md5: dffdc3faa4eb28b271a275cfead64de9 Text-content-sha1: 5f2c5c84e4a7682a4307f4a4db737a1a9e4b9154 Content-length: 9381 K 15 cvs2svn:cvs-rev V 4 1.88 PROPS-END SVN+J'GUoQpMm}8{Od4syV /BL}#;c b4&ZZ[n*?.9}W.T=A}=XYC =S}=XYf--}=@{1?md&G|w}=_S@ Lx7l~^" enum { /* channel types */ CHAN_MAINSESSION, CHAN_X11, CHAN_AGENT, struct ssh2_data_channel { unsigned char *outbuffer; unsigned outbuflen, outbufsize; unsigned remwindow, remmaxpkt; } v2static void ssh2_try_send(struct ssh_channel *c); static void ssh2_add_channel_data(struct ssh_channel *c, char *buf, int lenensure(int length) { if (pktout.maxlen < length) { pktout.maxlen = } static void ssh2_pkt_adddata(void *data, int len) { pktout.length += len; ssh2_pkt_ensure(pktout.length);maclen = csmac ? csmac->len : 0; ssh2_pkt_ensure(pktout.length + padding + maclen) if (c) { if (ssh_version == 1) { } else { ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_send(); } c->closes = 1; if (c->type == CHAN_X11) { c->u.x11.s = NULL; logevent("X11 connection terminated"); } } } void sshfwd_write(struct ssh_channel *c, char *buf, int len) { if (ssh_version == 1) { send_packet(SSH1_MSG_CHANNEL_DATA, PKT_INT, c->remoteid, PKT_INT, len, PKT_DATA, buf, len, PKT_END); } else { ssh2_add_channel_data(c, buf, len); ssh2_try_send(c); } if (d->localid > i) break; /* found a free number */ CHAN_X11; CHAN_AGENT; CHAN_X11CHAN_X11: x11_send(c->u.x11.s, p, len); break; case CHAN_AGENTAdd data to an SSH2 channel output buffer. */ static void ssh2_add_channel_data(struct ssh_channel *c, char *buf, int len) { if (c->v2.outbufsize < c->v2.outbuflen + len) { c->v2.outbufsize = c->v2.outbuflen + len + 1024; c->v2.outbuffer = srealloc(c->v2.outbuffer, c->v2.outbufsize); } memcpy(c->v2.outbuffer + c->v2.outbuflen, buf, len); c->v2.outbuflen += len; } /* * Attempt to send data on an SSH2 channel. */ static void ssh2_try_send(struct ssh_channel *c) { while (c->v2.remwindow > 0 && c->v2.outbuflen > 0) { unsigned len = c->v2.remwindow; if (len > c->v2.outbuflen) len = c->v2.outbuflen; if (len > c->v2.remmaxpkt) len = c->v2.remmaxpkt; ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(c->v2.outbuffer, len); ssh2_pkt_send(); c->v2.outbuflen -= len; memmove(c->v2.outbuffer, c->v2.outbuffer+len, c->v2.outbuflen); c->v2.remwindow -= len; }type = CHAN_MAINSESSION; mainchan->closes = 0; mainchan->v2.remwindow = ssh2_pkt_getuint32(); mainchan->v2.remmaxpkt = ssh2_pkt_getuint32(); mainchan->v2.outbuffer = NULL; mainchan->v2.outbuflen = mainchan->v2.outbufsize = 0; ssh_channels = newtree234(ssh_channelcmp); add234(ssh_channels, mainchan); logevent("Opened channel for session"); /* * Potentially enable X11 forwarding. */ ssh2_pkt_addstring("x11bool(0); /* many connections */ ssh2_pkt_addstring(proto); ssh2_pkt_addstring(data); ssh2_pkt_adduint32(0); /* screen number */ ssh2_pkt_send()unsigned i = ssh2_pkt_getuint32()!c) continue; /* nonexistent channel */ c->X11 forwarding request")); crReturnV; } } }unsigned i = ssh2_pkt_getuint32()!c) continue; /* nonexistent channel */ c->unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ c->unsigned i = ssh2_pkt_getuint32()!c) continue; /* nonexistentswitch (c->type) { case CHAN_MAINSESSION: from_backend(pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA, data, length); break; case CHAN_X11: x11_send(c->u.x11.s, data, length); break; } /* * Enlarge the window again at the remote * side, just in case it ever runs down and * they failcunsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ if (c->type == CHAN_X11) { /* * Remote EOF on an X11 channel means we should * wrap up and close the channel ourselves. */ x11_close(c->u.x11.s); sshfwd_close(c); } } else if (pktin.type == SSH2_MSG_CHANNEL_CLOSE) { unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; enum234 e; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ if (c->closes == 0) { ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_send(); } /* Do pre-close processing on the channel. */ switch (c->type) { case CHAN_MAINSESSION: break; /* nothing to see here, move along */ case CHAN_X11: break; } del234(ssh_channels, c); sfree(c->v2.outbuffer); sfree(c); /* * See if that was the last channel left open. */ c = first234(ssh_channels, &e); if (!cunsigned i = ssh2_pkt_getuint32()!c) continue; /* nonexistent channel */ mainchan->if (pktin.type == SSH2_MSG_CHANNEL_OPEN) { char *type; int typelen; char *error = NULL; struct ssh_channel *c; ssh2_pkt_getstring(&type, &typelen); c = smalloc(sizeof(struct ssh_channel)); if (typelen == 3 && !memcmp(type, "x11", 3)) { char *rh; if (!ssh_X11_fwd_enabled) error = "X11 forwarding is not enabled"; else if ( x11_init(&c->u.x11.s, cfg.x11_display, c, &rh) != NULL ) { error = "Unable to open an X11 connection"; } else { c->type = CHAN_X11; } } else { error = "Unsupported channel type requested"; } c->remoteid = ssh2_pkt_getuint32(); if (error) { ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURE); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_adduint32(SSH2_OPEN_CONNECT_FAILED); ssh2_pkt_addstring(errorfree(c); } else { struct ssh_channel *d; unsigned i; enum234 e; for (i=1, d = first234(ssh_channels, &e); d; d = next234(&e)) { if (d->localid > i) break; /* found a free number */ i = d->localid + 1; } c->localid = i; c->closes = 0; c->v2.remwindow = ssh2_pkt_getuint32(); c->v2.remmaxpkt = ssh2_pkt_getuint32(); c->v2.outbuffer = NULL; c->v2.outbuflen = c->v2.outbufsize = 0; add234(ssh_channels, c); ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_adduint32(c->localid); ssh2_pkt_adduint32(0x8000UL); /* our window size */ ssh2_pkt_adduint32(0x4000UL); /* our max pkt size */ ssh2_pkt_send(); }ssh2_add_channel_data(mainchan, in, inlen); try_send = TRUE; } if (try_send) { enum234 e; struct ssh_channel *c; /* * Try to send data on all channels if we can. */ for (c = first234(ssh_channels, &e); c; c = next234(&e)) ssh2_try_send(c); Revision-number: 883 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2001-01-22T16:38:43.000000Z K 7 svn:log V 58 Ability to hide the mouse pointer on a keypress a la Word K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d8472e61178f0eee10d5c5eb61a30c4c Text-delta-base-sha1: dcd908faac23fa55b67adfcbf7b94c05706ebb64 Text-content-length: 38 Text-content-md5: 2e333510dc38c2fc0b6a6544a7afa1b3 Text-content-sha1: d559a40764eb469a9d4b28f28dc857dcbe8f4447 Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVN% DP>int hide_mouseptr Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c3bbf26236a2b1f375259179b8dfaeba Text-delta-base-sha1: 982ffc6cfab4fc7a474ef154e1f92ab2ebef5695 Text-content-length: 97 Text-content-md5: 8c0ce40c1589b35aae1b8dadb9340e87 Text-content-sha1: 60469a870841823944e0b699583fd5d13730ed88 Content-length: 137 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNFO-X*HideMousePtr", cfg->hide_mouseptrHideMousePtr", 0, &cfg->hide_mouseptr Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 422ddf7ee9552cad0bf0c0d0493e99a5 Text-delta-base-sha1: 328c569dbcb82fd4f3d5e6a85bd1a18359027a12 Text-content-length: 448 Text-content-md5: 0f670635ef3a722ab420fed61a67b6c7 Text-content-sha1: 53ba8eaf2816a0655831356339ef64d8b16a97c3 Content-length: 488 K 15 cvs2svn:cvs-rev V 4 1.96 PROPS-END SVN3d. ?8`Dc{WMfBOX_APPEARANCE4, IDC_BOXT_APPEARANCE4IDC_HIDEMOUSDlgButton (hwnd, IDC_HIDEMOUSE, cfg.hide_mouseptr beginbox(&cp, "Adjust the use of the mouse pointer", IDC_BOX_APPEARANCE4, IDC_BOXT_APPEARANCE4); checkbox(&cp, "Hide mouse &pointer when typing in window", IDC_HIDEMOUSHIDEMOUSEhide_mouseptr = IsDlgButtonChecked (hwnd, IDC_HIDEMOUS Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b85c4199ea3baf77dfd2971bbfbc58fb Text-delta-base-sha1: 816a88a3c7f496856f9ae5fd83fb88355b6decb7 Text-content-length: 718 Text-content-md5: 277a6c15b7e423c8edaf634ae1acea86 Text-content-sha1: c08cf1129edddbf576e9b0450e8d214d54d213ab Content-length: 759 K 15 cvs2svn:cvs-rev V 5 1.104 PROPS-END SVNVb]c#8`vCy ;&G5dL5[BSPw"A@void show_mouseptr(int show) { static int cursor_visible = 1; if (!cfg.hide_mouseptr) /* override if this feature disabled */ show = 1; if (cursor_visible && !show) ShowCursor(FALSE); else if (!cursor_visible && show) ShowCursor(TRUE); cursor_visible = show show_mouseptr(1); show_mouseptr(1); show_mouseptr(1); show_mouseptr(1);show_mouseptr(1); show_mouseptr(1);show_mouseptr(1); show_mouseptr(1); show_mouseptr(1); show_mouseptr(1); if (len > 0) show_mouseptr(0 Revision-number: 884 Prop-content-length: 315 Content-length: 315 K 8 svn:date V 27 2001-01-22T17:17:26.000000Z K 7 svn:log V 214 Jeremy Sawicki's fix for the multiple-conflicting-accelerators problems: controls are now destroyed and recreated on a panel switch. In addition, this patch also introduces a better means of doing the group boxes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 10d3a87788f561033e63b60fc8687187 Text-delta-base-sha1: 92d379f20d83f63a21c1ab394f92b21f9f63703b Text-content-length: 276 Text-content-md5: ab6896a80ece001df4e15ffeaed38281 Text-content-sha1: 26d209f92da6d069504e7703f08829e8f3dba69f Content-length: 315 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNLAnVvw2 fUw) { cp->boxystart = cp->ypos; if (!name) cp->boxystart -= STATICHEIGHT/2; if (name) cp->ypos += STATICHEIGHTBUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 0, cp->boxtext ? cp->boxtext : "", cp->boxid); Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0f670635ef3a722ab420fed61a67b6c7 Text-delta-base-sha1: 53ba8eaf2816a0655831356339ef64d8b16a97c3 Text-content-length: 17953 Text-content-md5: d7f8e1036aef152b5d068bf687431ec1 Text-content-sha1: b42b7473025833a1b70bfad4e6f994860cf0d119 Content-length: 17993 K 15 cvs2svn:cvs-rev V 4 1.97 PROPS-END SVNd,eMlKZku?#S@( rS2wBh-)zY}1'1Xv3F{aRo<OzoO8&F:fQtoV=LK|dL<6a`Zqcn_I@,F{bcl_M>H]|lI8<U9x6c n!lSx` IDC_BOX IDC_BOX_KEYBOARD2, IDC_BOX IDC_BOX IDC_BOX IDC_BOX_APPEARANCE2, IDC_BOX_APPEARANCE3, IDC_BOX IDC_BOX IDC_BOX IDC_BOX IDC_BOX_SSH2, IDC_BOX IDC_BOX IDC_BOX IDC_BOX_TRANSLATION2, IDC_BOX{ int i, n; n = SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_GETCOUNT, 0, 0); for (i=n; i-- >0 ;) SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_DELETESTRING, i, 0 }Create the panelfuls of controls in the configuration box. */ static void create_controls(HWND hwnd, int dlgtype, int panel) { if (panel == sessionpanelstart) { /* The Session panel. Accelerators used: [acgo] nprthelsdx */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Basic options for your PuTTY session", IDC_TITLE_SESSION); if (dlgtype == 0) { beginbox(&cp, "Specify your connection by host name", IDC_BOX_SESSION1); multiedit(&cp, "Host &Name", IDC_HOSTSTATIC, IDC_HOST, 75, "&Port", IDC_PORTSTATIC, IDC_PORT, 25, NULL); if (backends[3].backend == NULL) { /* this is PuTTYtel, so only three protocols available */ radioline(&cp, "Protocol:", IDC_PROTSTATIC, 4, "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTTELNET, "R&login", IDC_PROTRLOGIN, NULL); } else { radioline(&cp, "Protocol:", IDC_PROTSTATIC, 4, "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTTELNET, "R&login", IDC_PROTRLOGIN, #ifdef FWHACK "SS&H/hack", #else "SS&H", #endif IDC_PROTSSH, NULL); } endbox(&cp); IDC_BOX_SESSION2); sesssaver(&cp, "Sav&ed Sessions", IDC_SESSSTATIC, IDC_SESSEDIT, IDC_SESSLIST, "&Load", IDC_SESSLOAD, "&Save", IDC_SESSSAVE, "&Delete", IDC_SESSDEL, NULL); endbox(&cp); } beginbox(&cp, NULL, IDC_BOX_SESSION3); checkbox(&cp, "Close Window on E&xit", IDC_CLOSEEXIT); endbox(&cp); } if (panel == terminalpanelstart) { /* The Terminal panel. Accelerators used: [acgo] &dflbenuw */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the terminal emulation", IDC_TITLE_TERMINAL); beginbox(&cp, "Set various terminal options", IDC_BOX_TERMINAL1); checkbox(&cp, "Auto &wrap mode initially on", IDC_WRAPMODE); checkbox(&cp, "&DEC Origin Mode initially on", IDC_DECOM); checkbox(&cp, "Implicit CR in every &LF", IDC_LFHASCR); checkbox(&cp, "&Beep enabled", IDC_BEEP); checkbox(&cp, "Enable bli&nking text", IDC_BLINKTEXT); checkbox(&cp, "&Use local terminal line discipline", IDC_LDISCTERM); endbox(&cp); beginbox(&cp, "Control session logging", IDC_BOX_TERMINAL2); radiobig(&cp, "Session logging:", IDC_LSTATSTATIC, "Logging turned &off completely", IDC_LSTATOFF, "Log printable output only", IDC_LSTATASCII, "Log all session output", IDC_LSTATRAW, NULL); editbutton(&cp, "Log &file name:", IDC_LGFSTATIC, IDC_LGFEDIT, "Bro&wse...", IDC_LGFBUTTON); endbox(&cp); } if (panel == keyboardpanelstart) { /* The Keyboard panel. Accelerators used: [acgo] h?srvlxvnpmietu */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); IDC_TITLE_KEYBOARD); beginbox(&cp, "Change the sequences sent by:", IDC_BOX_KEYBOARD1); radioline(&cp, "The Backspace key", IDC_DELSTATIC, 2, "Control-&H", IDC_DEL008, "Control-&? (127)", IDC_DEL127, NULL); radioline(&cp, "The Home and End keys", IDC_HOMESTATIC, 2, "&Standard", IDC_HOMETILDE, "&rxvt", IDC_HOMERXVT, NULL); radioline(&cp, "The Function keys and keypad", IDC_FUNCSTATIC, 4, "ESC[n&~", IDC_FUNCTILDE, "&Linux", IDC_FUNCLINUX, "&Xterm R6", IDC_FUNCXTERM, "&VT400", IDC_FUNCVT400, NULL); endbox(&cp); beginbox(&cp, "Application keypad settings:", IDC_BOX_KEYBOARD2); checkbox(&cp, IDC_NOAPPLICC); radioline(&cp, "Initial state of cursor keys:", IDC_CURSTATIC, 2, "&Normal", IDC_CURNORMAL, "A&pplication", IDC_CURAPPLIC, NULL); checkbox(&cp, "Application ke&ypad keys totally disabled", IDC_NOAPPLICK); radioline(&cp, "Initial state of numeric keypad:", IDC_KPSTATIC, 3, "Nor&mal", IDC_KPNORMAL, "Appl&ication", IDC_KPAPPLIC, "N&etHack", IDC_KPNH, NULL); endbox(&cp); beginbox(&cp, "Enable extra keyboard features:", IDC_BOX_KEYBOARD3); checkbox(&cp, "Application and AltGr ac&t as Compose key", IDC_COMPOSEKEY); endbox(&cp); } if (panel == windowpanelstart) { /* The Window panel. Accelerators used: [acgo] bsdkw4ylpt */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling PuTTY's window", IDC_TITLE_WINDOW); beginbox(&cp, "Set the size of the window", IDC_BOX_WINDOW1); multiedit(&cp, "&Rows", IDC_ROWSSTATIC, IDC_ROWSEDIT, 50, "Colu&mns", IDC_COLSSTATIC, IDC_COLSEDIT, 50, NULL); checkbox(&cp, "Loc&k window size against resizing", IDC_LOCKSIZE); endbox(&cp); IDC_BOX_WINDOW2); staticedit(&cp, "Lines of &scrollback", IDC_SAVESTATIC, IDC_SAVEEDIT, 50); checkbox(&cp, "&Display scrollbar", IDC_SCROLLBAR); checkbox(&cp, "Reset scrollback on &keypress", IDC_SCROLLKEY); checkbox(&cp, "Reset scrollback on dis&play activity", IDC_SCROLLDISP); endbox(&cp); beginbox(&cp, NULL, IDC_BOX_WINDOW3); checkbox(&cp, "&Warn before closing window", IDC_CLOSEWARN); checkbox(&cp, "Window closes on ALT-F&4", IDC_ALTF4); checkbox(&cp, "System menu appears on A< alone", IDC_ALTONLY); checkbox(&cp, "Ensure window is always on &top", IDC_ALWAYSONTOP); endbox(&cp); } if (panel == appearancepanelstart) { /* The Appearance panel. Accelerators used: [acgo] rmkhtibluv */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); IDC_TITLE_APPEARANCE); beginbox(&cp, "Adjust the use of the cursor", IDC_BOX_APPEARANCE1); radioline(&cp, "Cursor appearance:", IDC_CURSORSTATIC, 3, "B&lock", IDC_CURBLOCK, "&Underline", IDC_CURUNDER, "&Vertical line", IDC_CURVERT, NULL); checkbox(&cp, "Cursor &blinks", IDC_BLINKCUR); endbox(&cp); beginbox(&cp, "Set the font used in the terminal window", IDC_BOX_APPEARANCE2); staticbtn(&cp, "", IDC_FONTSTATIC, "C&hange...", IDC_CHOOSEFONT); endbox(&cp); beginbox(&cp, "Adjust the use of the window title", IDC_BOX_APPEARANCE3); multiedit(&cp, "Window &title:", IDC_WINTITLE, IDC_WINEDIT, 100, NULL); checkbox(&cp, "Avoid ever using &icon title", IDC_WINNAME); endbox(&cp); beginbox(&cp, "Adjust the use of the mouse pointer", IDC_BOX_APPEARANCE4); checkbox(&cp, "Hide mouse &pointer when typing in window", IDC_HIDEMOUSE); endbox(&cp); } if (panel == translationpanelstart) { /* The Translation panel. Accelerators used: [acgo] xbepnkis */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling character set translation", IDC_TITLE_TRANSLATION); beginbox(&cp, "Adjust how PuTTY displays line drawing characters", IDC_BOX_TRANSLATION1); radiobig(&cp, "Handling of line drawing characters:", IDC_VTSTATIC, "Font has &XWindows encoding", IDC_VTXWINDOWS, "Use font in &both ANSI and OEM modes", IDC_VTOEMANSI, "Use font in O&EM mode only", IDC_VTOEMONLY, "&Poor man's line drawing (""+"", ""-"" and ""|"")", IDC_VTPOORMAN, NULL); endbox(&cp); beginbox(&cp, "Enable character set translation on received data", IDC_BOX_TRANSLATION2); radiobig(&cp, "Character set translation:", IDC_XLATSTATIC, "&None", IDC_NOXLAT, "&KOI8 / Win-1251", IDC_KOI8WIN1251, "&ISO-8859-2 / Win-1250", IDC_88592WIN1250, "&ISO-8859-2 / CP852", IDC_88592CP852, NULL); endbox(&cp); beginbox(&cp, "Enable character set translation on input data", IDC_BOX_TRANSLATION3); checkbox(&cp, "CAP&S LOCK acts as cyrillic switch", IDC_CAPSLOCKCYR); endbox(&cp); } if (panel == selectionpanelstart) { /* The Selection panel. Accelerators used: [acgo] wxst */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling copy and paste", IDC_TITLE_SELECTION); IDC_BOX_SELECTION1); radiobig(&cp, "Action of mouse buttons:", IDC_MBSTATIC, "&Windows (Right pastes, Middle extends)", IDC_MBWINDOWS, "&xterm (Right extends, Middle pastes)", IDC_MBXTERM, NULL); endbox(&cp); beginbox(&cp, "Control the select-one-word-at-a-time mode", IDC_BOX_SELECTION2); charclass(&cp, "Character classes:", IDC_CCSTATIC, IDC_CCLIST, "&Set", IDC_CCSET, IDC_CCEDIT, "&to class", IDC_CCSTATIC2); endbox(&cp); } if (panel == colourspanelstart) { /* The Colours panel. Accelerators used: [acgo] blum */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling use of colours", IDC_TITLE_COLOURS); IDC_BOX_COLOURS1); checkbox(&cp, "&Bolded text is a different colour", IDC_BOLDCOLOUR); endbox(&cp); beginbox(&cp, "Adjust the precise colours PuTTY displays", IDC_BOX_COLOURS2); colouredit(&cp, "Select a colo&ur and then click to modify it:", IDC_COLOURSTATIC, IDC_COLOURLIST, "&Modify...", IDC_CHANGE, "Red:", IDC_RSTATIC, IDC_RVALUE, "Green:", IDC_GSTATIC, IDC_GVALUE, "Blue:", IDC_BSTATIC, IDC_BVALUE, NULL); endbox(&cp); } if (panel == connectionpanelstart) { /* The Connection panel. Accelerators used: [acgo] tuk */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the connection", IDC_TITLE_CONNECTION); if (dlgtype == 0) { beginbox(&cp, "Data to send to the server", IDC_BOX_CONNECTION1); staticedit(&cp, "Terminal-&type string", IDC_TTSTATIC, IDC_TTEDIT, 50); endbox(&cp); } beginbox(&cp, "Sending of null packets to keep session active", IDC_BOX_CONNECTION2); IDC_PINGSTATIC, IDC_PINGEDIT, 25); endbox(&cp); } if (panel == telnetpanelstart) { /* The Telnet panel. Accelerators used: [acgo] svldrbf */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { beginbox(&cp, "Data to send to the server", IDC_BOX_TELNET1); envsetter(&cp, "Environment variables:", IDC_ENVSTATIC, "&Variable", IDC_VARSTATIC, IDC_VAREDIT, "Va&lue", IDC_VALSTATIC, IDC_VALEDIT, IDC_ENVLIST, "A&dd", IDC_ENVADD, "&Remove", IDC_ENVREMOVE); endbox(&cp); beginbox(&cp, "Telnet protocol adjustments", IDC_BOX_TELNET2); "&BSD (commonplace)", IDC_EMBSD, "R&FC 1408 (unusual)", IDC_EMRFC, NULL); endbox(&cp); } } if (panel == rloginpanelstart) { /* The Rlogin panel. Accelerators used: [acgo] sl */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { beginbox(&cp, "Data to send to the server", IDC_BOX_RLOGIN1); staticedit(&cp, "&Local username:", IDC_RLLUSERSTATIC, IDC_RLLUSEREDIT, 50); endbox(&cp); } } if (panel == sshpanelstart) { /* The SSH panel. Accelerators used: [acgo] rmakwp123bd */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { beginbox(&cp, "Data to send to the server", IDC_BOX_SSH1); multiedit(&cp, "&Remote command:", IDC_CMDSTATIC, IDC_CMDEDIT, 100, NULL); endbox(&cp); IDC_BOX_SSH2); checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication", IDC_AUTHTIS); checkbox(&cp, "Allow &agent forwarding", IDC_AGENTFWD); editbutton(&cp, "Private &key file for authentication:", IDC_PKSTATIC, IDC_PKEDIT, "Bro&wse...", IDC_PKBUTTON); endbox(&cp); beginbox(&cp, "Protocol options", IDC_BOX_SSH3); checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC_NOPTY); checkbox(&cp, "Enable compr&ession", IDC_COMPRESS); radioline(&cp, "Preferred SSH protocol version:", IDC_SSHPROTSTATIC, 2, "&1", IDC_SSHPROT1, "&2", IDC_SSHPROT2, NULL); radioline(&cp, "Preferred encryption algorithm:", IDC_CIPHERSTATIC, 3, "&3DES", IDC_CIPHER3DES, "&Blowfish", IDC_CIPHERBLOWF, "&DES", IDC_CIPHERDES, NULL); checkbox(&cp, "Imitate SSH 2 MAC bug in commercial <= v2.3.x", IDC_BUGGYMAC); endbox(&cp); } } if (panel == tunnelspanelstart) { /* The Tunnels panel. Accelerators used: [acgo] ex */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { IDC_TITLE_TUNNELS); beginbox(&cp, "X11 forwarding options", IDC_BOX_TUNNELS); checkbox(&cp, "&Enable X11 forwarding", IDC_X11_FORWARD); multiedit(&cp, "&X display location", IDC_X11_DISPSTATIC, IDC_X11_DISPLAY, 50, NULL); endbox(&cp); } } } /* * ThisSet up the tree view contents. */ hsession = treeview_insert(&tvfaff, 0, "Session"); treeview_insert(&tvfaff, 0, "Terminal"); treeview_insert(&tvfaff, 1, "Keyboard"); treeview_insert(&tvfaff, 0, "Window"); treeview_insert(&tvfaff, 1, "Appearance"); treeview_insert(&tvfaff, 1, "Translation"); treeview_insert(&tvfaff, 1, "Selection"); treeview_insert(&tvfaff, 1, "Colours"); treeview_insert(&tvfaff, 0, "Connection"); if (dlgtype == 0) { treeview_insert(&tvfaff, 1, "Telnet"); treeview_insert(&tvfaff, 1, "Rlogin"); if (backends[3].backend != NULL) treeview_insert(&tvfaff, 1, "SSH"); treeview_insert(&tvfaff, 2, "Tunnels"); }creation int jfor (j = controlstartvalue; j < controlendvalue; j++) { HWND item = GetDlgItem(hwnd, j); if (item) DestroyWindow(item); } if (!strcmp(buffer, "Session")) create_controls(hwnd, dlgtype, sessionpanelstart); if (!strcmp(buffer, "Keyboard")) create_controls(hwnd, dlgtype, keyboardpanelstart); if (!strcmp(buffer, "Terminal")) create_controls(hwnd, dlgtype, terminalpanelstart); if (!strcmp(buffer, "Window")) create_controls(hwnd, dlgtype, windowpanelstart); if (!strcmp(buffer, "Appearance")) create_controls(hwnd, dlgtype, appearancepanelstart); if (!strcmp(buffer, "Tunnels")) create_controls(hwnd, dlgtype, tunnelspanelstart); if (!strcmp(buffer, "Connection")) create_controls(hwnd, dlgtype, connectionpanelstart); if (!strcmp(buffer, "Telnet")) create_controls(hwnd, dlgtype, telnetpanelstart); if (!strcmp(buffer, "Rlogin")) create_controls(hwnd, dlgtype, rloginpanelstart); if (!strcmp(buffer, "SSH")) create_controls(hwnd, dlgtype, sshpanelstart); if (!strcmp(buffer, "Selection")) create_controls(hwnd, dlgtype, selectionpanelstart); if (!strcmp(buffer, "Colours")) create_controls(hwnd, dlgtype, colourspanelstart); if (!strcmp(buffer, "Translation")) create_controls(hwnd, dlgtype, translationpanelstart); init_dlg_ctrls(hw Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9c25703a1ac9dc56deeb3d26020ca32a Text-delta-base-sha1: 3db6b69cce5f5448a02a72db21fd359d9dc131cb Text-content-length: 25 Text-content-md5: 59b8e31bb5829bf88e668da64f2d27c3 Text-content-sha1: 462d4748f90d8f75eb3bf2e6b2953df0dbade351 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN,~n ) Revision-number: 885 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2001-01-22T17:24:38.000000Z K 7 svn:log V 48 Clean up a couple of trivial compiler warnings. K 10 svn:author V 5 simon PROPS-END Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0b190d898cda1fa20b0d29b19c27244b Text-delta-base-sha1: 05ce1a9bedd197ae3b75b7cb8978fd279fb1089e Text-content-length: 40 Text-content-md5: 3fceebb249ef148c2feb28c774ca0433 Text-content-sha1: 60388d9590fcdff9af48a515e8f0a0bbff418345 Content-length: 79 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN=2U>d,'\xFF', '\xFF' Revision-number: 886 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2001-01-22T17:24:58.000000Z K 7 svn:log V 32 Add dependencies for puttygen.c K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e626b709be294a0cd0ce1e82307b2e90 Text-delta-base-sha1: 63549aa83cf4de85661f8d19d297972f4d725a3d Text-content-length: 71 Text-content-md5: 41315589095ddf20d980da8b9379d7e8 Text-content-sha1: 3a54bfcabbf74fd9c86d5635b36a9c6f799e6484 Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNO 2;puttygen.$(OBJ): puttygen.c putty.h ssh.h winstuff Revision-number: 887 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Update puttygen GUI code to use Jeremy Sawicki's better group boxes K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-22T17:25:20.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 26825f11bc3783b947faecada552669b Text-delta-base-sha1: 1d7d0a20a6142c1f7e532d6c16983b584bb005fe Text-content-length: 47 Text-content-md5: 8eb9582af445251e895341bab6f26671 Text-content-sha1: 02afa7088591bc7f8b44ca9643998df7aed96f18 Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN!?"G;U"4U^`Ek6 Revision-number: 888 Prop-content-length: 769 Content-length: 769 K 8 svn:date V 27 2001-01-23T10:19:17.000000Z K 7 svn:log V 668 Fix a subtle bug affecting multiple-socket handling in Plink. (Was interfering with X forwarding.) Details of bug: the event object used as the target of WSAEventSelect is created in such a way that it is automatically reset when it releases a thread from WaitFor*Objects. Subsequently, a read on the first socket in the list causes another network event if not all the available data was read; thus the event object is set again. Then, WSAEnumNetworkEvents is called again for the _second_ socket, and is passed the network event, which it therefore resets. So an event has been dropped, and things only get restarted when some more data arrives on the first socket. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a5f85e17501294281fe99ee3328fa58b Text-delta-base-sha1: bb23fe910e8a7e0e049121cdd3ac3e1486b82ebc Text-content-length: 29 Text-content-md5: 3e1f85ac348700bea71b20acbbb359b4 Text-content-sha1: 9a8fbbe8cdffa9f618e86044006344e403b9e1c4 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNlh E'NULL Revision-number: 889 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2001-01-23T11:02:02.000000Z K 7 svn:log V 64 Remove the entirely pointless fourth parameter from x11_init(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dffdc3faa4eb28b271a275cfead64de9 Text-delta-base-sha1: 5f2c5c84e4a7682a4307f4a4db737a1a9e4b9154 Text-content-length: 47 Text-content-md5: cde54289f3bc8216ae3491946ea836b8 Text-content-sha1: 593ce4f80dd978f86eeb0e91e94fb9ea0ad9aeb5 Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.89 PROPS-END SVNJz"$"ce4M!E Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5d4e6f2999fbe7707ca90cf4ed367c83 Text-delta-base-sha1: 0504a9516669f0cdd2c8feffad4ef0425e7ce2b7 Text-content-length: 153 Text-content-md5: 4eb6b09f9c743c57ac37b71e8ac2c758 Text-content-sha1: b881e7353d66617db046b9a61d672fe648d7910c Content-length: 192 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNY%}9vnjX/ char *x11_init (Socket *s, char *display, void *c) { SockAddr addr; int port; char *err, *dummy_realhost&dummy_ Revision-number: 890 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2001-01-23T14:20:04.000000Z K 7 svn:log V 73 When the SSH panel disappears in puttytel, the Tunnels panel should too! K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d7f8e1036aef152b5d068bf687431ec1 Text-delta-base-sha1: b42b7473025833a1b70bfad4e6f994860cf0d119 Text-content-length: 151 Text-content-md5: e3bd8ecd1e82dc2c4998d626a6da4ab4 Text-content-sha1: ddf2a8d0395205cf7f39caaa4968b668d8fef5eb Content-length: 191 K 15 cvs2svn:cvs-rev V 4 1.98 PROPS-END SVN,|d|LL { treeview_insert(&tvfaff, 1, "SSH"); treeview_insert(&tvfaff, 2, "Tunnels"); } Revision-number: 891 Prop-content-length: 162 Content-length: 162 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-23T17:37:52.000000Z K 7 svn:log V 62 Roman Pompejus's fix for the TAB-not-working-in-Event-Log bug PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2e333510dc38c2fc0b6a6544a7afa1b3 Text-delta-base-sha1: d559a40764eb469a9d4b28f28dc857dcbe8f4447 Text-content-length: 127 Text-content-md5: 0cd8be9a3b02cfa1a25318fc07b53e84 Text-content-sha1: 90a3c6ea172679a1442271634a40d7eb7cb353a9 Content-length: 167 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVN% i"i Window handles for the dialog boxes that can be running during a * PuTTY session. */ GLOBAL HWND logbox Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e3bd8ecd1e82dc2c4998d626a6da4ab4 Text-delta-base-sha1: ddf2a8d0395205cf7f39caaa4968b668d8fef5eb Text-content-length: 212 Text-content-md5: e69af94a1003e25b4ab4958cc2d47623 Text-content-sha1: e8786524ae92c40531ad103ba59d23b27b56709e Content-length: 252 K 15 cvs2svn:cvs-rev V 4 1.99 PROPS-END SVN,E$"ABA~ kp@case IDCANCEL case IDCANCEL: EndDialog(hwnd, TRUE EndDialog(hwnd, TRUEDialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX),hwnd, AboutProc); Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 277a6c15b7e423c8edaf634ae1acea86 Text-delta-base-sha1: c08cf1129edddbf576e9b0450e8d214d54d213ab Text-content-length: 107 Text-content-md5: 071e86af508b1bb4d6fcfcebbd36e1fe Text-content-sha1: 65a16ad7fc2ae9bfabdded8a6e89edecdeb4d8ab Content-length: 148 K 15 cvs2svn:cvs-rev V 5 1.105 PROPS-END SVNb3 RBRC if (!(IsWindow(logbox) && IsDialogMessage(logbox, &msg))) Revision-number: 892 Prop-content-length: 209 Content-length: 209 K 8 svn:date V 27 2001-01-23T17:40:51.000000Z K 7 svn:log V 108 Roman Pompejus's suggestion: do sensible things with focus when the event log window appears or disappears. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e69af94a1003e25b4ab4958cc2d47623 Text-delta-base-sha1: e8786524ae92c40531ad103ba59d23b27b56709e Text-content-length: 149 Text-content-md5: 7e3212ada7fdf4291a18b9a3926cf9e8 Text-content-sha1: f819cea461d744ac2b48eb0c3f2253d0d8383ac7 Content-length: 190 K 15 cvs2svn:cvs-rev V 5 1.100 PROPS-END SVNE:p{yAvO SetActiveWindow(GetParent(hwnd)) SetActiveWindow(GetParent(hwnd)) SetActiveWindow(logbox); Revision-number: 893 Prop-content-length: 268 Content-length: 268 K 8 svn:date V 27 2001-01-24T09:29:55.000000Z K 7 svn:log V 167 Ahem. The log-file Browse button should set cfg.logfilename and not cfg.keyfile. Next time I copy and paste a huge chunk of code, I should take more care about it :-/ K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7e3212ada7fdf4291a18b9a3926cf9e8 Text-delta-base-sha1: f819cea461d744ac2b48eb0c3f2253d0d8383ac7 Text-content-length: 137 Text-content-md5: 1d07fb6d3aded7e2eda712af4c6fb06e Text-content-sha1: d8e7653dd342eb218b56b6112180f1cfa8ba4318 Content-length: 178 K 15 cvs2svn:cvs-rev V 5 1.101 PROPS-END SVN:Fc6!>p]Ylogfilenamlogfilename, filename); SetDlgItemText (hwnd, IDC_LGFEDIT, cfg.logfilenam Revision-number: 894 Prop-content-length: 294 Content-length: 294 K 8 svn:date V 27 2001-01-24T10:11:18.000000Z K 7 svn:log V 193 Improve socket error handling so that a socket error isn't an automatic fatalbox(). Instead, the error is passed to the receiver routine, which can decide just how fatal the problem really is. K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a20394e379570224cae526b66104a1f3 Text-delta-base-sha1: 308c333242edbcd4f85c529a524845c165e7ecfb Text-content-length: 657 Text-content-md5: b685be1d821c61b3f9707fe3a9923c86 Text-content-sha1: f8d2ead751897d7b5a1e150f530cc30e77b3992b Content-length: 696 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNHua~&ut# /* * This is the function a client must register with each socket, to * receive data coming in on that socket. The parameter `urgent' * decides the meaning of `data' and `len': * * - urgent==0. `data' points to `len' bytes of perfectly ordinary * data. * * - urgent==1. `data' points to `len' bytes of data, which were * read from before an Urgent pointer. * * - urgent==2. `data' points to `len' bytes of data, the first of * which was the one at the Urgent mark. * * - urgent==3. An error has occurred on the socket. `data' points * to an error string, and `len' points to an error code. */ Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 28a8699792ab593e55cdf692f967b53b Text-delta-base-sha1: 713666458138b2f703aace5fc7c2267c0e12e081 Text-content-length: 132 Text-content-md5: 119235432fc892e9ae08beab807e15f7 Text-content-sha1: 5df8b071d63579bcf7e096f2d16464ec979c6af7 Content-length: 172 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNi` nPn"Gurgent==3) { /* A socket error has occurred. */ connection_fatal(data); len = 0; } Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3fceebb249ef148c2feb28c774ca0433 Text-delta-base-sha1: 60388d9590fcdff9af48a515e8f0a0bbff418345 Text-content-length: 132 Text-content-md5: b655055038e79184c7e9a938f0d4d959 Text-content-sha1: 026fc8f18f36d0f05f4599a035f7c9b6b235b240 Content-length: 171 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN2) nVneMurgent==3) { /* A socket error has occurred. */ connection_fatal(data); len = 0; } Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cde54289f3bc8216ae3491946ea836b8 Text-delta-base-sha1: 593ce4f80dd978f86eeb0e91e94fb9ea0ad9aeb5 Text-content-length: 137 Text-content-md5: 33349022d8694325bf44d036c7cd8632 Text-content-sha1: 587760a488af7b8e8664d1e680898fd778895c03 Content-length: 177 K 15 cvs2svn:cvs-rev V 4 1.90 PROPS-END SVNzqnGn<>urgent==3) { /* A socket error has occurred. */ connection_fatal(data); len = 0; } Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6376f4f8cb7147be3f598e58ab794266 Text-delta-base-sha1: 33bd28be597b93a98509ecb7c7fee6efa702cd06 Text-content-length: 134 Text-content-md5: f126bf714e5a9a04603e361aa003a5b4 Text-content-sha1: d40b1cb92a612a7ba4b22d3f36174bd51bf86125 Content-length: 174 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNF= nn= urgent==3) { /* A socket error has occurred. */ connection_fatal(data); len = 0; } Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 18c14316d551edf75de80bb6ba240b32 Text-delta-base-sha1: efb5f985435a02fff76bb46d0957f557abb6114c Text-content-length: 270 Text-content-md5: 1da6eed8d555798d3a03dfb5959edd4d Text-content-sha1: 16d245bc18c928d07b5f9e3f26bdf438845dcdb8 Content-length: 310 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN1Wk94\- /* * An error has occurred on this socket. Pass it to the * receiver function. */ return s->receiver(s, 3, winsock_error_string(err), errreturn s->receiver(s, 3, winsock_error_string(err), err Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4eb6b09f9c743c57ac37b71e8ac2c758 Text-delta-base-sha1: b881e7353d66617db046b9a61d672fe648d7910c Text-content-length: 254 Text-content-md5: b21d2c1a9ae6f315da5a248bbc036b8f Text-content-sha1: ea787547439a5d5b3ce118c0338deb4c7d2611d4 Content-length: 293 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN% ff urgent==3) { /* * A socket error has occurred. We have no way to * communicate this down the forwarded connection, so we'll * just treat it like a proper close. */ len = 0; } Revision-number: 895 Prop-content-length: 510 Content-length: 510 K 8 svn:date V 27 2001-01-24T14:08:20.000000Z K 7 svn:log V 409 Rethink the whole line discipline architecture. Instead of having multiple switchable line disciplines, we now have a single unified one which changes its behaviour based on option settings. Each option setting can be suggested by the back end and/or the terminal handler, and can be forcibly overridden by the configuration. Local echo and local line editing are separate, independently switchable, options. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bc11cd7c99432343be3c18b1bf560e6c Text-delta-base-sha1: ba5d2cc2b98ce2356f29ec44a798e6d700c9e710 Text-content-length: 5193 Text-content-md5: f741bbbf9a74f68e8641fdeb89670a0f Text-content-sha1: 067fd99046e7d47c689a3a77a2766804a16f9d81 Content-length: 5233 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN1`#vPMVyINRZ/* * ldisc.c: PuTTY line discipline. Sits between the input coming * from keypresses in the window, and the output channel leading to * the back end. Implements echo and/or local line editing, * depending on what's currently configured. */ #define ECHOING (cfg.localecho == LD_YES || \ (cfg.localecho == LD_BACKEND && \ (back->ldisc(LD_ECHO) || term_ldisc(LD_ECHO)))) #define EDITING (cfg.localedit == LD_YES || \ (cfg.localedit == LD_BACKEND && \ (back->ldisc(LD_EDIT) || term_ldisc(LD_EDIT))))(&c, 1void ldisc_send(char *buf, int len) { /* * Called with len=0 when the options change. We must inform * the front end in case it needs to know. */ if (len == 0) { void ldisc_update(int echo, int edit); ldisc_update(ECHOING, EDITING); } /* * Either perform local editing, or just send characters. */ if (EDITING) { while (len--) { char c; c = *buf++; switch (term_quotenext ? ' ' : c) { /* * ^h/^?: delete one char and output one BSB * ^w: delete, and output BSBs, to return to last * space/nonspace boundary * ^u: delete, and output BSBs, to return to BOL * ^c: Do a ^u then send a telnet IP * ^z: Do a ^u then send a telnet SUSP * ^\: Do a ^u then send a telnet ABORT * ^r: echo "^R\n" and redraw line * ^v: quote next char * ^d: if at BOL, end of file and close connection, * else send line and reset to BOL * ^m: send line-plus-\r\n and reset to BOL */ case CTRL('H'): case CTRL('?'): /* backspace/delete */ if (term_buflen > 0) { if (ECHOING) bsb(plen(term_buf[term_buflen-1])); term_buflen--; } break; case CTRL('W'): /* delete word */ while (term_buflen > 0) { if (ECHOING) bsb(plen(term_buf[term_buflen-1])); term_buflen--; if (term_buflen > 0 && isspace(term_buf[term_buflen-1]) && !isspace(term_buf[term_buflen])) break; } break; case CTRL('U'): /* delete line */ case CTRL('C'): /* Send IP */ case CTRL('\\'): /* Quit */ case CTRL('Z'): /* Suspend */ while (term_buflen > 0) { if (ECHOING) bsb(plen(term_buf[term_buflen-1])); term_buflen--; } back->special (TS_EL); if( c == CTRL('C') ) back->special (TS_IP); if( c == CTRL('Z') ) back->special (TS_SUSP); if( c == CTRL('\\') ) back->special (TS_ABORT); break; case CTRL('R'): /* redraw line */ if (ECHOING) { int i; c_write("^R\r\n", 4); for (i = 0; i < term_buflen; i++) pwrite(term_buf[i]); } break; case CTRL('V'): /* quote next char */ term_quotenext = TRUE; break; case CTRL('D'): /* logout or send */ if (term_buflen == 0) { back->special (TS_EOF); } else { back->send(term_buf, term_buflen); term_buflen = 0; } break; case CTRL('M'): /* send with newline */ if (term_buflen > 0) back->send(term_buf, term_buflen); if (cfg.protocol == PROT_RAW) back->send("\r\n", 2); else back->send("\r", 1); if (ECHOING) c_write("\r\n", 2); term_buflen = 0; break; default: /* get to this label from ^V handler */ if (term_buflen >= term_bufsiz) { term_bufsiz = term_buflen + 256; term_buf = saferealloc(term_buf, term_bufsiz); } term_buf[term_buflen++] = c; if (ECHOING) pwrite(c); term_quotenext = FALSE; break; } } } else { if( term_buflen != 0 ) { back->send(term_buf, term_buflen); while (term_buflen > 0) { bsb(plen(term_buf[term_buflen-1])); term_buflen--; } } if (len > 0) { if (ECHOING) c_write(buf, len); back->send(buf, len); } } } Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e1f85ac348700bea71b20acbbb359b4 Text-delta-base-sha1: 9a8fbbe8cdffa9f618e86044006344e403b9e1c4 Text-content-length: 817 Text-content-md5: fa6b8073a9f9a563f5beac04681b677d Text-content-sha1: ec175b3da0a4975b198a2ceef122ba9dc7d6f462 Content-length: 857 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNh ]LEzF_;Xdq>*inhandle, outhandle, errhandle; DWORD orig_console_mode; WSAEVENT netevent;int term_ldisc(int mode) { return FALSE; } void ldisc_update(int echo, int edit) { /* Update stdin read mode to reflect changes in line discipline. */ DWORD mode; mode = ENABLE_PROCESSED_INPUT; if (echo) mode = mode | ENABLE_ECHO_INPUT; else mode = mode &~ ENABLE_ECHO_INPUT; if (edit) mode = mode | ENABLE_LINE_INPUT; else mode = mode &~ ENABLE_LINE_INPUT; SetConsoleMode(inhandle, mode);inhandle = GetStdHandle(STD_INPUT_HANDLE); outhandle = GetStdHandle(STD_OUTPUT_HANDLE); errhandle = GetStdHandle(STD_ERROR_HANDLE); GetConsoleMode(inhandle, &orig_console_mode); SetConsoleMode(inhandle, ENABLE_PROCESSED_INPUT Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0cd8be9a3b02cfa1a25318fc07b53e84 Text-delta-base-sha1: 90a3c6ea172679a1442271634a40d7eb7cb353a9 Text-content-length: 491 Text-content-md5: db3748a0bed46fca7e121f58bf1ba285 Text-content-sha1: ffabac1fab358a8bf1eef5a62413dd8b413bedaf Content-length: 531 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVN_)6XPyU5C}P#Vqvenum { /* * Line discipline option states: off, on, up to the backend. */ LD_YES, LD_NO, LD_BACKEND }; enum { /* * Line discipline options which the backend might try to control. */ LD_EDIT, /* local line editing */ LD_ECHO /* local echo */ }(*ldisc) (intocalecho; int localeditint telnet_ldisc(int optionvoid ldisc_send(char *buf, int len) Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 119235432fc892e9ae08beab807e15f7 Text-delta-base-sha1: 5df8b071d63579bcf7e096f2d16464ec979c6af7 Text-content-length: 163 Text-content-md5: f2d7a44c1fddb46339147d0cff8afb35 Text-content-sha1: bc44afbd09ff9b32a26eeb683edf66e1ec89f572 Content-length: 203 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN`*ptszastatic int raw_ldisc(int option) { if (option == LD_EDIT || option == LD_ECHO) return 1; return 0; raw_ldisc, 1 }; Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b655055038e79184c7e9a938f0d4d959 Text-delta-base-sha1: 026fc8f18f36d0f05f4599a035f7c9b6b235b240 Text-content-length: 102 Text-content-md5: 2093dd8bbcfa45a4e4d24f4ed8027f80 Text-content-sha1: d789727bf52d6f123a526d9c30a71a3c1a448691 Content-length: 141 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN)\K]%sstatic int rlogin_ldisc(int option) { return 0; rlogin_ldisc, 1 }; Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 37b844d4c55a2e74b42ed7268b73d4c2 Text-delta-base-sha1: 9c7753cd93d5f6615ea59a5bac56dc1b1d4a6577 Text-content-length: 23 Text-content-md5: a2269f3e752e1872a908a403ac706108 Text-content-sha1: f86c6cefd55380b802688446cd5302af7d324d8c Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNi )@F Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8c0ce40c1589b35aae1b8dadb9340e87 Text-delta-base-sha1: 60469a870841823944e0b699583fd5d13730ed88 Text-content-length: 215 Text-content-md5: e0370d97a90d1d7878a966720cc02884 Text-content-sha1: 3fb8c82efc877aff3860d50fc1d88eba925f85cc Content-length: 255 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN9SU)mdM4ocalEcho", cfg->localecho); write_setting_i (sesskey, "LocalEdit", cfg->localeditocalEcho", LD_BACKEND, &cfg->localecho); gppi (sesskey, "LocalEdit", LD_BACKEND, &cfg->localedit Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 33349022d8694325bf44d036c7cd8632 Text-delta-base-sha1: 587760a488af7b8e8664d1e680898fd778895c03 Text-content-length: 816 Text-content-md5: 24197efbd70ca8ea7c5f8742182ca2e5 Text-content-sha1: 50828f4f4165e86173e0db38ff70867f88ecb4b7 Content-length: 856 K 15 cvs2svn:cvs-rev V 4 1.91 PROPS-END SVNq>dP)N{Yh>_Zirzqstatic int ssh_echoing, ssh_editing ssh_editing = ssh_echoing = 1; } logevent("Allocated pty"); } else { ssh_editing = ssh_echoing = 1ldisc_send(NULL, 0); /* cause ldisc to notice changes */ ssh_send_ok = 1; ssh_channels = newtree234(ssh_channelcmp ssh_editing = ssh_echoing = 1; } else { logevent("Allocated pty"); } } else { ssh_editing = ssh_echoing = 1;ldisc_send(NULL, 0); /* cause ldisc to notice changes */ ssh_send_ok = 1 ssh_editing = 0; ssh_echoingstatic int ssh_ldisc(int option) { if (option == LD_ECHO) return ssh_echoing; if (option == LD_EDIT) return ssh_editing; return FALSE; ssh_ldisc, 22 }; Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f126bf714e5a9a04603e361aa003a5b4 Text-delta-base-sha1: d40b1cb92a612a7ba4b22d3f36174bd51bf86125 Text-content-length: 450 Text-content-md5: 26e9737b24f7991886ec6efeeeb7bf2b Text-content-sha1: 9386602a0cfc33abab4a5756a9d5f3eee248133f Content-length: 490 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN=7&cJ&CB\O(echoing = TRUE, editing = TRUEo->send == DO) echoing = !enabled; else if (o->option = TELOPT_SGA && o->send == DO) editing = !enabled; ldisc_send(NULL, 0); /* cause ldisc to notice the change */static int telnet_ldisc(int option) { if (option == LD_ECHO) return echoing; if (option == LD_EDIT) return editing; return FALSE; telnet_ldisc, 23 }; Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 91e7677aea16d617d521c7e40e2f24cd Text-delta-base-sha1: c4651bcd68be8625fb431dfaf47896ffd0ea3c52 Text-content-length: 844 Text-content-md5: 1bfcf3e60352826af5b2d5882c06b8d6 Text-content-sha1: 97b0be7dbf9394587c648137d16612b702545a30 Content-length: 884 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN:rfXB?>ox8i!%48XnIZum(db* 3static int term_echoing; /* Does terminal want local echo? */ static int term_editing; /* Does terminal want local edit?term_editing = term_echoing = FALSE; ldisc_send(NULL, 0); /* cause ldisc to notice changes */10: /* set local edit mode */ term_editing = state; ldisc_send(NULL, 0); /* cause ldisc to notice changes */ term_echoing = !state; ldisc_send(NULL, 0); /* cause ldisc to notice changes */____send (buf, strlen(buf)); } else if (esc_args[0] == 5) { ldisc_____int term_ldisc(int option) { if (option == LD_ECHO) return term_echoing; if (option == LD_EDIT) return term_editing; return FALSE Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1d07fb6d3aded7e2eda712af4c6fb06e Text-delta-base-sha1: d8e7653dd342eb218b56b6112180f1cfa8ba4318 Text-content-length: 2196 Text-content-md5: 88382ea84d08cc6becc41c05740fefe9 Text-content-sha1: eb6bb4394358ce7a2bf421798c291be3b9882a65 Content-length: 2237 K 15 cvs2svn:cvs-rev V 5 1.102 PROPS-END SVNFvuH "`9 "&j@vMv}Ff4V6s%m$j9iA{PPlQxNloggingpanelstart, IDC_BOX_LOGGING1loggingECHOSTATIC, IDC_ECHOBACKEND, IDC_ECHOYES, IDC_ECHONO, IDC_EDITSTATIC, IDC_EDITBACKEND, IDC_EDITYES, IDC_EDITNORadioButton (hwnd, IDC_ECHOBACKEND, IDC_ECHONO, cfg.localecho == LD_BACKEND ? IDC_ECHOBACKEND: cfg.localecho == LD_YES ? IDC_ECHOYES : IDC_ECHONO); CheckRadioButton (hwnd, IDC_EDITBACKEND, IDC_EDITNO, cfg.localedit == LD_BACKEND ? IDC_EDITBACKEND: cfg.localedit == LD_YES ? IDC_EDITYES : IDC_EDITNOloggingpanelstart) { /* The Logging panel. Accelerators used: [acgo] session logging", IDC_TITLE_TERMINAL); beginbox(&cp, NULL, IDC_BOX_LOGGING1); radiobig(&cp, "Session logging:", IDC_LSTATSTATIC, "Logging &turned off completely", IDC_LSTATOFF, "Log &printable output only", IDC_LSTATASCII, "&tuwendbox(&cp); beginbox(&cp, "Line discipline options", IDC_BOX_TERMINAL2); radioline(&cp, "Local echo:", IDC_ECHOSTATIC, 3, "A&uto", IDC_ECHOBACKEND, "Force on", IDC_ECHOYES, "Force off", IDC_ECHONO, NULL); radioline(&cp, "Local line editing:", IDC_EDITSTATIC, 3, "Au&to", IDC_EDITBACKEND, "Force on", IDC_EDITYES, "Force off", IDC_EDITNO, NULL1, "LoggingLogging")) create_controls(hwnd, dlgtype, loggingECHOBACKEND: case IDC_ECHOYES: case IDC_ECHONO { if (LOWORD(wParam)==IDC_ECHOBACKEND) cfg.localecho=LD_BACKEND; if (LOWORD(wParam)==IDC_ECHOYES) cfg.localecho=LD_YES; if (LOWORD(wParam)==IDC_ECHONO) cfg.localecho=LD_NO; } break; case IDC_EDITBACKEND: case IDC_EDITYES: case IDC_EDITNO { if (LOWORD(wParam)==IDC_EDITBACKEND) cfg.localedit=LD_BACKEND; if (LOWORD(wParam)==IDC_EDITYES) cfg.localedit=LD_YES; if (LOWORD(wParam)==IDC_EDITNO) cfg.localedit=LD_NO; } break; case IDC_ALWAYSONTOP Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 071e86af508b1bb4d6fcfcebbd36e1fe Text-delta-base-sha1: 65a16ad7fc2ae9bfabdded8a6e89edecdeb4d8ab Text-content-length: 342 Text-content-md5: 0ca9b1533f8359879b13b9e51d6f07a2 Text-content-sha1: 4d241611b26bd2dcd11579cd2c4678aedf5ae492 Content-length: 383 K 15 cvs2svn:cvs-rev V 5 1.106 PROPS-END SVN3 0l$tz))v\!HjIint compose_state = 0; /* Dummy routine, only required in plink. */ void ldisc_update(int echo, int edit) {Flush the line discipline's edit buffer in the * case where local editing has just been disabled. */ ldisc_send(NULL, 0___ Revision-number: 896 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2001-01-24T14:55:48.000000Z K 7 svn:log V 68 Use `default_port' rather than `22' when loading a default session. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fa6b8073a9f9a563f5beac04681b677d Text-delta-base-sha1: ec175b3da0a4975b198a2ceef122ba9dc7d6f462 Text-content-length: 53 Text-content-md5: 339d3aef38d4d3f557945e1235187b79 Text-content-sha1: 6de8e49704a773b08014dacbf0c09379039f1d83 Content-length: 93 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN.Tsetcskey(keyspace); ssh2_mkkey(K, exchange_hash, first_exchange_hash, 'D', keyspace); sccipher->setsckey(keyspace); ssh2_mkkey(K, exchange_hash, first_exchange_hash, 'A', keyspace); cscipher->setcsiv(keyspace); ssh2_mkkey(K, exchange_hash, first_exchange_hash, 'B', keyspace); sccipher->setsciv(keyspace); ssh2_mkkey(K, exchange_hash, first_exchange_hash, 'E', keyspace); csmac->setcskey(keyspace); ssh2_mkkey(K, exchange_hash, first_exchange_hash, 'F', keyspace); logevent("Server initiated key re-exchange"G66 ssh_socket, ssh_sendok, ssh_ldisc, 22 }; Revision-number: 902 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:31.257765Z PROPS-END Revision-number: 903 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2001-01-27T15:51:41.000000Z K 7 svn:log V 86 Remove -gui from the command-line help in pscp, because it's an internal option only. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 68f68d082abeccc8f6ba27858319fd5b Text-delta-base-sha1: a43be11f98d463a3fe2658a0d31e116a0f5d49eb Text-content-length: 378 Text-content-md5: c0a969211e887d700ebd21e6f2480c2f Text-content-sha1: e6e1fc5897ee03247c2b992018025f5b288c5047 Content-length: 418 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN-eXRY2# #if 0 /* * -gui is an internal option, used by GUI front ends to get * pscp to pass progress reports back to them. It's not an * ordinary user-accessible option, so it shouldn't be part of * the command-line help. The only people who need to know * about it are programmers, and they can read the source. #endif Revision-number: 904 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2001-01-27T16:26:55.000000Z K 7 svn:log V 42 A start at some proper PSCP documentation K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dd9c8c10990d815faabf4db3c06426e6 Text-delta-base-sha1: 47141f532b6559fce0a482a24f61cff9a436af61 Text-content-length: 4537 Text-content-md5: a4e9800c178bf7eaec0a52a125598158 Text-content-sha1: 959fcd0a77c2bb96d42c162f2af83689932cbce8 Content-length: 4576 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN6F $m"7\versionid $Id: pscp.but,v 1.2 2001/01/27 16:26:55 owen Exp $ \#FIXME: Need examples, index entries, links H{pscp-intro} Introduction to PSCP PSCP, the PuTTY Secure Copy client, is a tool for transferring files securely between computers using an SSH connection. \H{pscp-starting} Starting PSCP PSCP is a command line application. This means that you cannot just double-click on its icon to run it and instead you have to bring up a console window. With Windows 95, 98, and ME, this is called an \q{MS-DOS Prompt} and with Windows NT and 2000 it is called a \q{Command Prompt}. It should be available from the Programs section of your Start Menu. To start PSCP it will need either to be on your \c{PATH} or in your current directory. To add the directory containing PSCP to your \c{PATH} environment variable, type into the console window: \c set PATH C:\path\to\putty\directory;%PATH% \# FIXME: or the Environment panel in NT, or something else in Win9x... \H{pscp-usage} PSCP Usage Once you've got a console window to type into, you can just type \c{pscp} on its own to bring up a usage message. This tells you the version of PSCP you're using, and gives you a brief summary of how to use PSCP: \c Z:\owendadmin>pscp \c PuTTY Secure Copy client \c Release 0.50 \c Usage: pscp [options] [user@]host:source target \c pscp [options] source [source...] [user@]host:target \c pscp [options] -ls user@host:filespec \c Options: \c -p preserve file attributes \c -q quiet, don't show statistics \c -r copy directories recursively \c -v show verbose messages \c -P port connect to specified port \c -pw passw login with specified password (PSCP's interface is much like the Unix \c{scp} command, if you're familiar with that.) \S{pscp-usage-basics} The basics To receive (a) file(s) from a remote server: \c{pscp [options] [user@]host:source target} To send (a) file(s) to a remote server: \c{pscp [options] source [source...] [user@]host:target} \b \c{user} The login name on the remote server. If this is omitted, scp will try to use the default login from the PuTTY saved session. \b \c{host} The name of the remote server, or the name of an existing PuTTY saved session. In the latter case, the session's settings for hostname, port number, cipher type and username will be used. \b \c{source} One or more source files. Wildcards are allowed. \# FIXME: describe wildcard syntax \b \c{target} The filename or directory to put the file(s). \S{pscp-usage-options} Options \# Document each command line option. \S2{pscp-usage-options-p}\c{-p} preserve file attributes By default, files copied with PSCP are timestamped with the date and time they were copied. The \c{-p} option preserves the original timestamp on copied files. \S2{pscp-usage-options-q}\c{-q} quiet, don't show statistics By default, PSCP displays a meter displaying the progress of the current transfer: \c mibs.tar | 168 kB | 84.0 kB/s | ETA: 00:00:13 | 13% The fields in this display are (from left to right), filename, size (in kilobytes) of file transferred so far, estimate of how fast the file is being transferred (in kilobytes per second), estimated time that the transfer will be complete, and percentage of the file so far transferred. The \c{-q} option to PSCP suppresses the printing of these statistics. \S2{pscp-usage-options-r}\c{-r} copies directories recursively \S2{pscp-usage-options-v}\c{-v} show verbose messages The \c{-v} option to PSCP makes it print extra information about the file transfer. For example: \c Logging in as "fred". \c fred@example.com's password: \c Sending command: scp -v -f mibs.tar \c Connected to example.com \c Sending file modes: C0644 1320960 mibs.tar \c mibs.tar | 1290 kB | 67.9 kB/s | ETA: 00:00:00 | 100% \c Remote exit status 0 \c Closing connection This information may be useful for debugging problems with PSCP. \S2{pscp-usage-options-P}\c{-P port} connect to specified port \# Defaults: Saved Session, or 22 \S2{pscp-usage-options-pw}\c{-pw passw} login with specified password \# Default is to ask. (May not be appropriate when running PSCP from \# batch scripts etc.) \# But should be using RSA key authentication (qv.) and possibly \# Pageant (qv.) anyway. \H{pscp-ixplorer} Secure iXplorer Lars Gunnarson has written a graphical interface for PSCP. You can get it from his web site, at \W{http://www.i-tree.org/}{www.i-tree.org}. Revision-number: 905 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2001-01-27T17:49:18.000000Z K 7 svn:log V 29 Documentation for -P and -pw K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a4e9800c178bf7eaec0a52a125598158 Text-delta-base-sha1: 959fcd0a77c2bb96d42c162f2af83689932cbce8 Text-content-length: 1076 Text-content-md5: f8233119605ce2e9206253bce41436dd Text-content-sha1: 1cd4f0dad7130e8e25f7a174e7989a6c12e602bb Content-length: 1115 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNF B2i3\versionid $Id: pscp.but,v 1.3 2001/01/27 17:49:18If the \c{host} you specify is a saved session, PSCP uses any port number specified in that saved session. If not, PSCP uses the port specified for SSH in \e{Default Settings}, or the default SSH port, 22. \#{Is this actually true? Can you actually specify a different default port for a protocol in Default Settings?} \S2{pscp-usage-options-pw}\c{-pw passw} login with specified password If a password is required to connect to the \c{host}, PSCP will interactively prompt you for it. However, this may not always be appropriate. If you are running PSCP as part of some automated job, it will not be possible to enter a password by hand. The \c{-p} option to PSCP lets you specify the password to use on the command line. Since specifying passwords in scripts is a bad idea for security reasons, you might want instead to consider using public-key authentication. PSCP will attempt to authenticate with any public key specified in a saved session's configuration before asking for a password Revision-number: 906 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2001-01-28T14:00:54.000000Z K 7 svn:log V 82 Use the PuTTY site's CSS stylesheet. Add Contact mail address to the page footer. K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 71815daa8a39b293f869d06d2b31355d Text-delta-base-sha1: ceb1680a291b4004f530efabe649f6e78c83052d Text-content-length: 266 Text-content-md5: 9d90d2daa5b8fd9dcb6850747082d098 Text-content-sha1: e6cc8769ed29e0002bf361ab8b6669a9f6613da8 Content-length: 305 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN tlt hcfg{xhtml-head-end}{} \cfg{xhtml-body-end}{Comments to putty@projects.tartarus.org Revision-number: 907 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2001-01-28T14:27:08.000000Z K 7 svn:log V 24 More options documented K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f8233119605ce2e9206253bce41436dd Text-delta-base-sha1: 1cd4f0dad7130e8e25f7a174e7989a6c12e602bb Text-content-length: 667 Text-content-md5: 86248fb734acab58a840ecd6c1b72c05 Text-content-sha1: 55e7a6d92e7783101e5f4ddfa66ebc7510112e68 Content-length: 706 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN"m}1;J,uO4X ;U\versionid $Id: pscp.but,v 1.4 2001/01/28 14:27:0By default, PSCP will only copy files. Any directories you specify to copy will be skipped, as will their contents. The \c{-r} option tells PSCP to descend into any directories you specify, and to copy them and their contents. This allows you to use PSCP to transfer whole directory structures between machines.default SSH port, 22. The \c{-P} option allows you specify the port number to connect to for PSCP's SSH connection.w (see \k{pubkey}). PSCP will attempt to authenticate with any public key specified in a saved session's configuration before asking for a Revision-number: 908 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 47 Instructions on setting PATH more permanently. K 10 svn:author V 4 owen K 8 svn:date V 27 2001-01-28T14:38:23.000000Z PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 86248fb734acab58a840ecd6c1b72c05 Text-delta-base-sha1: 55e7a6d92e7783101e5f4ddfa66ebc7510112e68 Text-content-length: 373 Text-content-md5: 31bfd2cbe8621e19fe70e1b0845ef49f Text-content-sha1: a871764a55e51d6f2836a729047458bf976ed6eb Content-length: 412 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNz \r2*,j\versionid $Id: pscp.but,v 1.5 2001/01/28 14:38:23This will only work for the lifetime of that particular console window. To set your \c{PATH} more permanently on Windows NT, use the Environment tab of the System Control Panel. On Windows 95, 98, and ME, you will need to edit your \c{AUTOEXEC.BAT} to include a \c{set} command like the one above Revision-number: 909 Prop-content-length: 360 Content-length: 360 K 8 svn:date V 27 2001-01-29T13:19:59.000000Z K 7 svn:log V 259 Remove a segfault in bombout() macro: don't sk_close() the socket if it's already NULL. The `Incorrect MAC' problem was causing ssh2_rdpkt to bombout(), setting s to NULL, and then a secondary bombout() was happening at the next level up, causing a segfault. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ebd66f8c23f970538749e068811998b Text-delta-base-sha1: 8332414fab213c5d4dcceefe4e1d535b18bbee51 Text-content-length: 176 Text-content-md5: 99a8a51d944d35ad19ab135732648c46 Text-content-sha1: 997c49a87bf64550acc5b2f09910cc0be7340cec Content-length: 216 K 15 cvs2svn:cvs-rev V 4 1.94 PROPS-END SVN ^D^^s\ (s ? sk_close(s), s = NULL : (void)0), \ 6e/6 ssh_send, ssh_size, ssh_special, Revision-number: 910 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2001-01-29T14:30:59.000000Z K 7 svn:log V 118 Prevent duplicate sk_close() calls on the same socket when the connection dies unexpectedly (CONNABORTED / CONNRESET) K 10 svn:author V 5 simon PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5fa0ca5fabb8e0e195de5aba850d6c06 Text-delta-base-sha1: 121e1bf806971da21aae938ef13592ee82289f21 Text-content-length: 129 Text-content-md5: dbb975586ec970fdfbccb9c91b3e17b8 Text-content-sha1: 02007dea9fa81fbe84807c2c398c866c333b651d Content-length: 169 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN/W kkYVk_close(s); s = NULL; connection_fatal(data); len = 0; return 0; } else Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b1856be454ec5f21f29cedf722decc4b Text-delta-base-sha1: 0fd95f4da3947d244b1076aa1ce43d63ec140541 Text-content-length: 112 Text-content-md5: 8fe53bd2f82f9c680bfd7cd25b06de6c Text-content-sha1: afeb48cca57d46e32b50eca8c131e0ba95b6436a Content-length: 151 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNp ZZ\k_close(s); s = NULL; connection_fatal(data); return 0; } else Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 99a8a51d944d35ad19ab135732648c46 Text-delta-base-sha1: 997c49a87bf64550acc5b2f09910cc0be7340cec Text-content-length: 151 Text-content-md5: c1ab6e57553cd740fdee8b1a3531f807 Text-content-sha1: 2b9ebb5c8d113d6d65201037ede876f0508b6f74 Content-length: 191 K 15 cvs2svn:cvs-rev V 4 1.95 PROPS-END SVNZZ$Ek_close(s); s = NULL; connection_fatal(data); return 0; } elsee|eend = { ssh_init, Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 58cd0601aafeae46716495720d83ae8a Text-delta-base-sha1: 36f786c90c0054ca89dad150b943eb4068b9b402 Text-content-length: 114 Text-content-md5: d1da9372b793f00a7baa167c8286ad26 Text-content-sha1: 4396905da3850b13097ee63cd36c292a44937d19 Content-length: 154 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNKb Z Z|Ok_close(s); s = NULL; connection_fatal(data); return 0; } else Revision-number: 911 Prop-content-length: 220 Content-length: 220 K 7 svn:log V 119 Prevent "Connection closed" message box from appearing after the "Network error" box. The latter on its own is enough. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-29T14:31:57.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0ca9b1533f8359879b13b9e51d6f07a2 Text-delta-base-sha1: 4d241611b26bd2dcd11579cd2c4678aedf5ae492 Text-content-length: 308 Text-content-md5: 7be0ba5ac0c6534dcb1bf14faff5448e Text-content-sha1: 912b00e3f63f061b941ad4e530cd8588de16e4b4 Content-length: 349 K 15 cvs2svn:cvs-rev V 5 1.107 PROPS-END SVN ]C if (!session_closed) { session_closed = TRUE; SetWindowText (hwnd, "PuTTY (inactive)"); MessageBox(hwnd, "Connection closed by remote host", "PuTTY", MB_OK | MB_ICONINFORMATION); } Revision-number: 912 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 Robert de Bath's TCP Urgent / Telnet SYNCH patch. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-29T14:49:21.000000Z PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d1da9372b793f00a7baa167c8286ad26 Text-delta-base-sha1: 4396905da3850b13097ee63cd36c292a44937d19 Text-content-length: 50 Text-content-md5: 42a4dedfcbad56cbb5e2de0f7ac9b041 Text-content-sha1: 76d5e5e285a8c6174f9dc980e8e340091c734327 Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNb ?(:if(urgent) in_synch = TRUE; Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1da6eed8d555798d3a03dfb5959edd4d Text-delta-base-sha1: 16d245bc18c928d07b5f9e3f26bdf438845dcdb8 Text-content-length: 285 Text-content-md5: 7fff6f07e65e0b4fd47d3823e60f7104 Text-content-sha1: 02ca161348f256c94a74450aca267a1b4863ef46 Content-length: 325 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNW+7X6!ppV{X.e{SoB? { BOOL b = TRUE; setsockopt (s, SOL_SOCKET, SO_OOBINLINE, (void *)&b, sizeof(b)) atmark = 10; if (atmark==0) { ioctlsocket(s->s, SIOCATMARK, &atmark); if(atmark) type = 2; else type = 1; }2 Revision-number: 913 Prop-content-length: 246 Content-length: 246 K 8 svn:date V 27 2001-01-29T15:10:56.000000Z K 7 svn:log V 145 Don't forget to read any outstanding data on receipt of FD_CLOSE. Particularly useful for people speaking HTTP, Finger etc over raw connections. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7fff6f07e65e0b4fd47d3823e60f7104 Text-delta-base-sha1: 02ca161348f256c94a74450aca267a1b4863ef46 Text-content-length: 482 Text-content-md5: f3eb6448b13c4964ac9bf05c6ad838c7 Text-content-sha1: 9d6d4f18674472bc88a931b26a73d10612db43d0 Content-length: 522 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN+=?iDi9QZ, openFirst read any outstanding data. */ open = 1; do { ret = recv(s->s, buf, sizeof(buf), 0); if (ret < 0) { err = WSAGetLastError(); if (err == WSAEWOULDBLOCK) break; return s->receiver(s, 3, winsock_error_string(err), err); } else open &= s->receiver(s, 0, buf, ret); } while (ret > 0); return open Revision-number: 914 Prop-content-length: 123 Content-length: 123 K 7 svn:log V 23 More stuff is written. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-29T17:26:20.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aeb8e9ab37ecc0609d7e3a73b4282475 Text-delta-base-sha1: 5480a4e6ee1bb3c42e9d9b6241d99b0c6d41cc53 Text-content-length: 424 Text-content-md5: 274e1dabee2ee977c3f8213811a53bac Text-content-sha1: 115a2d01245d19e6e6b1e95dd0f23aa3cdac03cb Content-length: 463 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN3x C ) The \q{Cursor appearance} option lets you configure the cursor to be a block, an underline, or a vertical line. A block cursor becomes an empty box when the window loses focus; an underline or a vertical line becomes dotted. The \q{Cursor blinks} option makes the cursor blink on and off. This works in any of the cursor modes. \S{config-font} Controlling the font used in the terminal window Revision-number: 915 Prop-content-length: 124 Content-length: 124 K 7 svn:log V 25 More pscp documentation. K 10 svn:author V 4 owen K 8 svn:date V 27 2001-01-31T00:25:57.000000Z PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 31bfd2cbe8621e19fe70e1b0845ef49f Text-delta-base-sha1: a871764a55e51d6f2836a729047458bf976ed6eb Text-content-length: 1505 Text-content-md5: 9cf7a65cf4525291a8f3ce22cba22883 Text-content-sha1: bfc9949760e8b4f6e212ea40a0fecf4ea0c0e9ad Content-length: 1544 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNz3J ]2"7|giHd'$CBf{8 S'k\versionid $Id: pscp.but,v 1.6 2001/01/31 00:25:57i{PSCP}\i{console window}i{\c{PATH}S2{pscp-usage-basics-user} \c{user} The login name on the remote server. If this is omitted, and \c{host} is a PuTTY saved session, PSCP will use any username specified by that saved session. Otherwise, PSCP will attempt to use the local Windows username. \S2{pscp-usage-basics-host} \c{host} The name of the remote server, or the name of an existing PuTTY saved session. In the latter case, the session's settings for hostname, port number, cipher type and username will be used. \S2{pscp-usage-basics-source} \c{source} One or more source files. \i{Wildcards} are allowed. The syntax of wildcards depends on the system to which they apply, so if you are copying \e{from} a Windows system \e{to} a UNIX system, you should use Windows wildcard syntax (e.g. \c{*.*}), but if you are copying \{from} a UNIX system \e{to} a Windows system, you would use the wildcard syntax allowed by your UNIX shell (e.g. \c{*}). \S2{pscp-usage-basics-target} \c{target} The filename or directory to put the file(s). \S{pscp-usage-options} Options These are the command line options that PSCP accepts\i{timestamp}\i{statistics}\i{recursive}\i{verbose}\i{port}\i{password}key specified in a saved session's configuration or with a key stored in Pageant (see \k{pageant}) before asking for a password. \H{pscp-ixplorer} \i{Secure iXplorer} Revision-number: 916 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2001-01-31T00:28:11.000000Z K 7 svn:log V 47 This time, a working version of the pscp docs. K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9cf7a65cf4525291a8f3ce22cba22883 Text-delta-base-sha1: bfc9949760e8b4f6e212ea40a0fecf4ea0c0e9ad Text-content-length: 73 Text-content-md5: d915c23633ca8147426e7bf745feb321 Text-content-sha1: 5285deb548f74f65a84d864b87f51ad1eb43f3b7 Content-length: 112 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN34 3?2Bq\versionid $Id: pscp.but,v 1.7 2001/01/31 00:28:11e Revision-number: 917 Prop-content-length: 176 Content-length: 176 K 7 svn:log V 76 Add zlib_freetable() to prevent memory leaks. Thanks to Kevin Eric Saunders K 10 svn:author V 5 simon K 8 svn:date V 27 2001-01-31T09:10:18.000000Z PROPS-END Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 27a5d692a8bf60719b0daa48df0d0081 Text-delta-base-sha1: 86f39e3839b848183b0a3c61ed7ebe6ab2572a36 Text-content-length: 676 Text-content-md5: c3765ccb1c916a1cf6b2c954d262aad7 Text-content-sha1: cce7b16440bd1e874d0eca73c03085308d8bdfcc Content-length: 715 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN x0#kz6n$int zlib_freetable(struct zlib_table ** ztab) { struct zlib_table *tab; int code; if (ztab == NULL) return -1; if (*ztab == NULL) return 0; tab = *ztab; for (code = 0; code <= tab->mask; code++) if (tab->table[code].nexttable != NULL) zlib_freetable(&tab->table[code].nexttable); sfree(tab->table); tab->table = NULL; sfree(tab); *ztab = NULL; return(0 zlib_freetable(&dctx.lenlentable); if (dctx.currlentable != dctx.staticlentable) zlib_freetable(&dctx.currlentable); if (dctx.currdisttable != dctx.staticdisttable) zlib_freetable(&dctx.currdisttable); Revision-number: 918 Prop-content-length: 274 Content-length: 274 K 8 svn:date V 27 2001-02-01T11:35:15.000000Z K 7 svn:log V 173 Avoid mallocing zero bytes in the event log Copy processing, which was apparently a problem for compilers other than Visual C. Thanks to Roman Pompejus for pointing it out. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 35febf767eaffe197df202ddddff0065 Text-delta-base-sha1: 0fe6d45cf245a2009d1bb027b25c091495b88fd2 Text-content-length: 191 Text-content-md5: 8c4adf6227704e064f98c51ead894ba0 Text-content-sha1: f627a522ecddfc0c9076068b6f4f832e099759ad Content-length: 232 K 15 cvs2svn:cvs-rev V 5 1.104 PROPS-END SVN= $ $ |if (selcount == 0) { /* don't even try to copy zero items */ MessageBeep(0); break; } Revision-number: 919 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2001-02-01T14:07:53.000000Z K 7 svn:log V 63 Fix an always-false comparison (don't compare a char to 0x80!) K 10 svn:author V 5 simon PROPS-END Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8fe53bd2f82f9c680bfd7cd25b06de6c Text-delta-base-sha1: afeb48cca57d46e32b50eca8c131e0ba95b6436a Text-content-length: 27 Text-content-md5: f0dfbe54539653c878e88a889a61c007 Text-content-sha1: c3a79d0e5e1a011fa9f7c2b9b31139504a777ac5 Content-length: 66 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN %^)'\x80' Revision-number: 920 Prop-content-length: 162 Content-length: 162 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-02-01T14:09:00.000000Z K 7 svn:log V 62 Ignore the zero byte at the start of the rlogin main protocol PROPS-END Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f0dfbe54539653c878e88a889a61c007 Text-delta-base-sha1: c3a79d0e5e1a011fa9f7c2b9b31139504a777ac5 Text-content-length: 437 Text-content-md5: 6fe258aa51842f41ed3f9cb3bca38e54 Text-content-sha1: 14b75ff0434f49652af37cbc5ddea742915475de Content-length: 476 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN  C.[ else { /* * Main rlogin protocol. This is really simple: the first * byte is expected to be NULL and is ignored, and the rest * is printed. */ static int firstbyte = 1; if (firstbyte) { if (data[0] == '\0') { data++; len--; } firstbyte = 0; } c_write(data, len); } Revision-number: 921 Prop-content-length: 577 Content-length: 577 K 8 svn:date V 27 2001-02-01T14:11:04.000000Z K 7 svn:log V 476 Yet another attempt at OOB handling in the network abstraction. This version allows you to specify, per socket, which sockets receive OOB data in-line (so that you know what was before the mark and what was after) and which receive it out of line (so it's really a one-byte out-of-band facility rather than discard-to-mark). This reflects the fact that rlogin appears to make more sense in the latter mode, and telnet in the former. This patch makes rlogin work right for me. K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b685be1d821c61b3f9707fe3a9923c86 Text-delta-base-sha1: f8d2ead751897d7b5a1e150f530cc30e77b3992b Text-content-length: 49 Text-content-md5: 973be852ecd2135db184ab1ec10cb174 Text-content-sha1: 9b1f4f13c561bb1a4fb0aef38ec81f60c7302b9e Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNHe sVrint oobinline, Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dbb975586ec970fdfbccb9c91b3e17b8 Text-delta-base-sha1: 02007dea9fa81fbe84807c2c398c866c333b651d Text-content-length: 22 Text-content-md5: 5205386462d1ab4c24418ae63d3a8261 Text-content-sha1: d3d3ad03858183a4a9a034538e94d1889911387e Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNWZ R1 Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6fe258aa51842f41ed3f9cb3bca38e54 Text-delta-base-sha1: 14b75ff0434f49652af37cbc5ddea742915475de Text-content-length: 22 Text-content-md5: d61852f79f7a07c6678a42138e97c538 Text-content-sha1: db56e83abe904df1ea1dc4c52a9fdf81fdf41e9d Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN  0 Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c1ab6e57553cd740fdee8b1a3531f807 Text-delta-base-sha1: 2b9ebb5c8d113d6d65201037ede876f0508b6f74 Text-content-length: 41 Text-content-md5: e65b657c73e0e7e9e0074c10e1584300 Text-content-sha1: 8d8c90912adcfa6a141a0d250cb81913c7efb39c Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.96 PROPS-END SVN ^!\1||ack Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 42a4dedfcbad56cbb5e2de0f7ac9b041 Text-delta-base-sha1: 76d5e5e285a8c6174f9dc980e8e340091c734327 Text-content-length: 24 Text-content-md5: 80f1773e2b3e24510a8d19d650199601 Text-content-sha1: 6f76ac7a0d0ae0567238ea815e84042eef836d0e Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN h1 Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f3eb6448b13c4964ac9bf05c6ad838c7 Text-delta-base-sha1: 9d6d4f18674472bc88a931b26a73d10612db43d0 Text-content-length: 1295 Text-content-md5: 8663c7d8127e2efa63b1cbf89b5366ad Text-content-sha1: 6ac507baa230c72612ff93282985e43f2367c0b1 Content-length: 1335 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN=}(Y&\$@\B&?{SGv int oobinlineint oobinline, ret->oobinline = oobinline; if (oobinline)/* * We have received data on the socket. For an oobinline * socket, this might be data _before_ an urgent pointer, * in which case we send it to the back end with type==1 * (data prior to urgent). */ if (s->oobinline) { atmark = 1; ioctlsocket(s->s, SIOCATMARK, &atmark); /* * Avoid checking the return value from ioctlsocket(), * on the grounds that some WinSock wrappers don't * support it. If it does nothing, we get atmark==1, * which is equivalent to `no OOB pending', so the * effect will be to non-OOB-ify any OOB data. */ } else atmark = 1; ret = recv(s->s, buf, sizeof(buf), 0); noise_ultralight(ret return s->receiver(s, atmark ? 0 : 1, buf, ret); } break; case FD_OOB: /* * This will only happen on a non-oobinline socket. It * indicates that we can immediately perform an OOB read * and get back OOB data, which we will send to the back * end with type==2 (urgent data). Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b21d2c1a9ae6f315da5a248bbc036b8f Text-delta-base-sha1: ea787547439a5d5b3ce118c0338deb4c7d2611d4 Text-content-length: 22 Text-content-md5: e47abca766006d35e9b2f87aa39245e7 Text-content-sha1: ac3418d33bbaad9974f5c88a2e59064256743b94 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN 4b21 Revision-number: 922 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2001-02-01T14:13:46.000000Z K 7 svn:log V 70 Shrink the keepalive-timeout box so the text beside it can all fit in K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8c4adf6227704e064f98c51ead894ba0 Text-delta-base-sha1: f627a522ecddfc0c9076068b6f4f832e099759ad Text-content-length: 27 Text-content-md5: 103fec7019df884d57cc81c4f8ef8edf Text-content-sha1: 20ada9b9774737133760a5e2bef1bbc4f6058389 Content-length: 68 K 15 cvs2svn:cvs-rev V 5 1.105 PROPS-END SVN== zB{0 Revision-number: 923 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2001-02-04T15:35:36.000000Z K 7 svn:log V 15 Some examples. K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d915c23633ca8147426e7bf745feb321 Text-delta-base-sha1: 5285deb548f74f65a84d864b87f51ad1eb43f3b7 Text-content-length: 1417 Text-content-md5: fdb8094fb607262cb4f100866a699b6a Text-content-sha1: b154314a2f0ef36e7d6eeeefa7fdb175edd59169 Content-length: 1456 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN4 `TVj;NmZjdqC\versionid $Id: pscp.but,v 1.8 2001/02/04 15:35:36 owen Exp $ \#FIXME: Need example pscp [options] [user@]host:source target So to copy the file /c{/etc/hosts} from the server /c{example.com} as user /c{fred} to the file \c{c:\temp\example-hosts.txt}, you would type: \c pscp fred@example.com:/etc/hosts c:\temp\example-hosts.txt To send (a) file(s) to a remote server: \c pscp [options] source [source...] [user@]host:target So to copy the local file /c{c:\documents\csh-whynot.txt} to the server /c{example.com} as user /c{fred} to the file \c{/tmp/csh-whynot} you would type: \c pscp c:\documents\csh-whynot.txt fred@example.com:/tmp/csh-whynotIf the source is a remote server and you do not specify a full pathname (in UNIX, a pathname beginning with a \c{/} (slash) character), what you specify as a source will be interpreted relative to your home directory on the remote server When copying from a remote server to a local host, you may wish simply to place the file(s) in the current directory. To do this, you should specify a target of \c{.}. For example: \c pscp fred@example.com:/home/tom/.emacs . ...would copy \c{/home/tom/.emacs} on the remote server to the current directory. As with the \c{source} parameter, if the target is on a remote server and is not a full path name, it is interpreted relative to your home directory on the remote server Revision-number: 924 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2001-02-04T15:47:01.000000Z K 7 svn:log V 71 Plink documentation cribs heavily from PSCP documentation, film at 11. K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7d2c31a7601172ce48abc920dbf93279 Text-delta-base-sha1: 44664e6251587b91184b6067972b570bf9d528f9 Text-content-length: 2065 Text-content-md5: 6a909b92c79b71e89219bc173b70dd88 Text-content-sha1: 19a966c5329b8ac4999660a29b690a0b68d76f72 Content-length: 2104 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN |A ;\versionid: $Id: plink.but,v 1.2 2001/02/04 15:47:01 owen Exp $ Plink (PuTTY Link), is a command-line connection tool similar to UNIX \c{ssh}. It is probably not what you want if you want to run an interactive session in a console window. \H{plink-starting} Starting Plink Plink is a command line application. This means that you cannot just double-click on its icon to run it and instead you have to bring up a \i{console window}. With Windows 95, 98, and ME, this is called an \q{MS-DOS Prompt} and with Windows NT and 2000 it is called a \q{Command Prompt}. It should be available from the Programs section of your Start Menu. To start Plink it will need either to be on your \i{\c{PATH}} or in your current directory. To add the directory containing Plink to your \c{PATH} environment variable, type into the console window: \c set PATH C:\path\to\putty\directory;%PATH% This will only work for the lifetime of that particular console window. To set your \c{PATH} more permanently on Windows NT, use the Environment tab of the System Control Panel. On Windows 95, 98, and ME, you will need to edit your \c{AUTOEXEC.BAT} to include a \c{set} command like the one above. \H{plink-usage} Plink Usage Once you've got a console window to type into, you can just type \c{plink} on its own to bring up a usage message. This tells you the version of Plink you're using, and gives you a brief summary of how to use Plink: \c Z:\sysosd>plink \c PuTTY Link: command-line connection utility \c Release 0.50 \c Usage: plink [options] [user@]host [command] \c Options: \c -v show verbose messages \c -ssh force use of ssh protocol \c -P port connect to specified port \c -pw passw login with specified password \S{plink-usage-basics} The basics \S{plink-usage-options} Options These are the command line options that Plink accepts. \H{plink-pubkey} Public key authentication \H{plink-batch} Using Plink in batch files and scripts \H{plink-cvs} Using Plink with CVS \H{plink-whatelse} Using Plink with... ? Revision-number: 925 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2001-02-04T15:49:49.000000Z K 7 svn:log V 21 Fix various slashes. K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fdb8094fb607262cb4f100866a699b6a Text-delta-base-sha1: b154314a2f0ef36e7d6eeeefa7fdb175edd59169 Text-content-length: 242 Text-content-md5: 99f4631e5b937eef799caf6b8bb9f4cd Text-content-sha1: 34f203ecc7848ffc1f394fb6a4e162d1a1f91576 Content-length: 281 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN $S72Xb?I8h\versionid $Id: pscp.but,v 1.9 2001/02/04 15:49:49\c{/etc/hosts} from the server \c{example.com} as user \c{fred} to the file \c{c:\\temp\\c{c:\\documents\\csh-whynot.txt} to the server \c{example.com} as user \ Revision-number: 926 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2001-02-05T13:04:00.000000Z K 7 svn:log V 37 Various bug/warning fixes from Jacob K 10 svn:author V 5 simon PROPS-END Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d61852f79f7a07c6678a42138e97c538 Text-delta-base-sha1: db56e83abe904df1ea1dc4c52a9fdf81fdf41e9d Text-content-length: 92 Text-content-md5: 80afbeac131d1a60c566722163b0559d Text-content-sha1: 980092c270e0cd2003c09c38e77986d901d5f726 Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN$KKY8#include #include #include #include ~COE_NORMAL Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8eb5fbf724a9f412833bd0614be20789 Text-delta-base-sha1: 61da5dd9db2ebd361969b1a080f3d81d656c9d8f Text-content-length: 905 Text-content-md5: e21554c1c4722fb2cce5c95324bbde58 Text-content-sha1: c81e2514933cfdc7d8a26b260e28aa3ec8348279 Content-length: 946 K 15 cvs2svn:cvs-rev V 5 1.107 PROPS-END SVN>=z>tG%c_?5hMQVfn W?IDC_COEALWAYS, IDC_COENORMAL, IDC_COENEVERRadioButton (hwnd, IDC_COEALWAYS, IDC_COENEVER, cfg.close_on_exit==COE_NEVER ? IDC_COENEVER : cfg.close_on_exit==COE_NORMAL ? IDC_COENORMAL : IDC_COEALWAYSwradioline(&cp, "At session end, close &window:", IDC_CLOSEEXIT, 3, "Always", IDC_COEALWAYS, "On clean exit", IDC_COENORMAL, "Never", IDC_COENEVER, NULL case IDC_COEALWAYS: case IDC_COENORMAL: case IDC_COENEVE { cfg.close_on_exit = IsDlgButtonChecked (hwnd, IDC_COEALWAYS) ? COE_ALWAYS : IsDlgButtonChecked (hwnd, IDC_COENORMAL) ? COE_NORMAL : COE_NEVER; } break; case IDC_CLOSEWARN Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7be0ba5ac0c6534dcb1bf14faff5448e Text-delta-base-sha1: 912b00e3f63f061b941ad4e530cd8588de16e4b4 Text-content-length: 512 Text-content-md5: 0cdb490390286c5928d54b2b45977e58 Text-content-sha1: 5f73727e03a97ecf9c241e5a2708def24f30e27d Content-length: 553 K 15 cvs2svn:cvs-rev V 5 1.108 PROPS-END SVN \;N]' == COE_ALWAYS && !session_closed) { /* Abnormal exits will already have set session_closed and taken * appropriate action. */ if (cfg.close_on_exit == COE_ALWAYS || cfg.close_on_exit == COE_NORMAL) PostQuitMessage(0); else { session_closed = TRUE; SetWindowText (hwnd, "PuTTY (inactive)"); MessageBox(hwnd, "Connection closed by remote host", "PuTTY", MB_OK | MB_ICONINFORMATION); Revision-number: 928 Prop-content-length: 407 Content-length: 407 K 8 svn:date V 27 2001-02-05T13:42:33.000000Z K 7 svn:log V 306 Modifications to the new Close On Exit option: - wording change (required a patch to winctrls.c:radioline()) - `only on clean exit' is used when an old-style config says `yes', on the grounds that it's more generally useful than `always' and also we want to map the old default to the new default. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 346913c172b9e8e7b2258df35de746fa Text-delta-base-sha1: b2238a89426ea47eef3712c6eaf3d0042f40c42f Text-content-length: 134 Text-content-md5: f32997b0b68a9450c74748b2d13fad05 Text-content-sha1: e13a33528062e6325b91aa734d2f81032932c7f1 Content-length: 174 K 15 cvs2svn:cvs-rev V 4 1.80 PROPS-END SVNYY p/p:NORMAL, /* Close window on "normal" (non-error) exits only */ COE_ALWAYS /* Always close the window Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ab6896a80ece001df4e15ffeaed38281 Text-delta-base-sha1: 26d209f92da6d069504e7703f08829e8f3dba69f Text-content-length: 838 Text-content-md5: 5e386f40369b7688da357af53c215f36 Text-content-sha1: 979a0aed541e00edccec78bf09304f674dc47a85 Content-length: 877 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNA!da;@[{= * There's a bit of a hack in here to ensure that if nacross * exceeds the actual number of buttons, the rightmost button * really does get all the space right to the edge of the line, so * you can do things like * * (*) Button1 (*) Button2 (*) ButtonWithReallyLongTitle char *btexttext, id); va_start(ap, nacross); group = WS_GROUP; i = 0; btext = va_arg(ap, char *); while (1) { char *nextbtext; int bid; if (!btext) break; bid = va_arg(ap, int); nextbtext = va_arg(ap, char *); r.left = GAPBETWEEN + i * (cp->width+GAPBETWEEN)/nacross; if (nextbtext) r.right = (i+1) * (cp->width+GAPBETWEEN)/nacross - r.left; else r.right = cp->width btext = nextbtext Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e21554c1c4722fb2cce5c95324bbde58 Text-delta-base-sha1: c81e2514933cfdc7d8a26b260e28aa3ec8348279 Text-content-length: 508 Text-content-md5: 2b54721f4248bab7c080eb2517c72b4f Text-content-sha1: 177a1c827aba12a1e8f1cd3b5def1fff7eeb2959 Content-length: 549 K 15 cvs2svn:cvs-rev V 5 1.108 PROPS-END SVN1=h,Z!4Z2e4%B{EVER, IDC_COENORMALORMAL, cfg.close_on_exit==COE_NORMAL ? IDC_COENORMAL : cfg.close_on_exit==COE_NEVER ? IDC_COENEVERClose &window on exit:", IDC_CLOSEEXIT, 4, "Always", IDC_COEALWAYS, "Never", IDC_COENEVER, "Only on clean exit", IDC_COENORMALEVER: case IDC_COENORMALEVER) ? COE_NEVER : COE_NORMAL Revision-number: 929 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2001-02-06T09:34:42.000000Z K 7 svn:log V 87 Mostly Mathias Leinmueller's PuTTYgen documentation, modified slightly and Buttressed. K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8b43e560eca509414321995a10593712 Text-delta-base-sha1: 202199bfbbd2f342ad1bd8465db6d6f3567604a8 Text-content-length: 3298 Text-content-md5: 42cf31a4d14b0bc8c7eb00c8beb336e5 Text-content-sha1: 3716ba616288984dcf18a542adfebab42e4a6c75 Content-length: 3337 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN3LD+m/>[\versionid $Id: pubkey.but,v 1.2 2001/02/06 09:34:42 owen Exp $ \# FIXME: passphrases, examples (e.g what does a key for pasting into \# authorized_keys look like?), index entries, links. \C{pubkey} Using public keys for SSH authentication \H{pubkey-intro} Public key authentication - an introducH{pubkey-puttygen} PuTTYgen: RSA key generator for PuTTY PuTTYgen is a key generator. It generates pairs of public and private keys to be used with PuTTY, PSCP, and Plink, as well as the PuTTY authentication agent, Pageant (see \k{pageant}). PuTTYgen generates RSA keys. When you run PuTTYgen you will see a window where you have two choices: \e{Generate} new public/private key pair or \e{Load} an existing private key. \S{pubkey-puttygen-generate} Generate a new key Before generating a new key you have to chose the strength of the encryption. With \e{Parameters} you define the strength of the key. The default of 1024 should be OK for most users. Pressing the \e{Generate} button starts the process of generating a new key pair. You then have to move the mouse over the blank area in order to generate random data for the algorithm. Continue until the progress bar is complete. As soon as enough random data is available the key is generated. This may take a little while, especially on slow machines. Once the key is generated, its details appear in the \e{Key} part of the PuTTYgen window. Now you can change the \e{Key comment} to something more meaningful than the default (which is based on the current date). e.g. add the name of the host you will use it for. When using multiple keys a meaningful comment may help you remember which passphrase to use! You should always enter a \e{Key passphrase} and \e{Confirm passphrase} to protect your keys Finally save the key by pressing the \e{Save} button. Do not close the window but proceed with step \k{pubkey-gettingready}, otherwise you will have to \e{Load} the private key again as described below. \S{pubkey-puttygen-load} Load and modify a key PuTTYgen does not store the public key in a file by default. If you have to distribute the public key you can press the \e{Load} button, select the private key file, and PuTTYgen will give you the public key again. You can also change the comment and passphrase for your private key this way. Just modify the values and \e{Save} the key. \S{pubkey-gettingready} Getting ready for public key authentication Connect to your SSH server using PuTTY with the SSH protocol. When the connection succeeds you will be prompted for your user name and password to login. Once logged in change into the \c{.ssh} directory and open the file \c{authorized_keys} with your favorite editor (you may have to create this file if this is the first key to add). Switch to the PuTTYgen window and select all of the content below \e{Public key for pasting into authorized_keys file}, copy it to the clipboard (\c{Ctrl+C}). Then, switch back to the PuTTY window and insert the data into the open file. Save the file. From now on you can use the private key for authentication to this host. Either select the private key in PuTTY's \e{Connection}, \e{SSH} panel: \e{Private key file for authentication} dialog or use it with Pageant as described in \k{pageant}. Revision-number: 930 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2001-02-07T11:20:15.000000Z K 7 svn:log V 24 Prelim. CVS/plink howto K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6a909b92c79b71e89219bc173b70dd88 Text-delta-base-sha1: 19a966c5329b8ac4999660a29b690a0b68d76f72 Text-content-length: 825 Text-content-md5: f2eda9bbb06c01481e373e726e6d24c6 Text-content-sha1: 6ed8da02158b401e0375ac04bd56dd427ff294eb Content-length: 864 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN o4J ,]\versionid $Id: plink.but,v 1.3 2001/02/07 11:20:15\i{Plink} (PuTTY Link), is a command-line connection tool similar to UNIX \i{batch files} and \i{scripts} \H{plink-cvs} Using Plink with \i{CVS} To use Plink with CVS, you need to do something like the following: \c set CVS_RSH=\path\to\plink.exe \c cvs -d :ext:user@hostname:/path/to/repository co module This should work, provided the command \c{plink hostname -l user} works without requiring a password. You can arrange for that to be the case by: \b running Pageant (see \k{pageant}) and putting a valid RSA key in it \b using a saved session name in place of \c{hostname}, and having that saved session specify a valid RSA key. (If you do this, you can also leave out \c{user@}, provided you specify it in the saved session.) Revision-number: 931 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2001-02-19T10:54:05.000000Z K 7 svn:log V 24 Add "make clean" target K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 998c385a4c94400680603229aa3c6b61 Text-delta-base-sha1: 249b2d0989a654173770251a651d4a582eaaf088 Text-content-length: 49 Text-content-md5: a8773b9996baa327a19da06a6a7ec601 Text-content-sha1: 22f10bf26f6a7b4b61e816301a8c8e5e3eae9daa Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNKl!K clean: rm -f *.html output.txt Revision-number: 932 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 58 Add a how-to section on public-key authentication in PSCP K 10 svn:author V 5 simon K 8 svn:date V 27 2001-02-19T10:54:18.000000Z PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 99f4631e5b937eef799caf6b8bb9f4cd Text-delta-base-sha1: 34f203ecc7848ffc1f394fb6a4e162d1a1f91576 Text-content-length: 1126 Text-content-md5: 06aedfdb2abde64641a6f64d59b0ef5e Text-content-sha1: 363518ee5a1c8aea6c14c72d4c0bfc4415115e50 Content-length: 1166 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN$} My67m\versionid $Id: pscp.but,v 1.10 2001/02/19 10:54:18 simo; see \k{pscp-pubkey}. \S{pscp-pubkey} Using public key authentication with PSCP Like PuTTY, PSCP can authenticate using a public key instead of a password. There are two ways you can do this. Firstly, PSCP can use PuTTY saved sessions in place of hostnames (see \k{pscp-usage-basics-host}). So you would do this: \b Run PuTTY, and create a PuTTY saved session (see \k{config-saving}) which specifies your private key file (see \k{config-auth}). You will probably also want to specify a username to log in as (see \k{config-username}). \b In PSCP, you can now use the name of the session instead of a hostname: \c{pscp sessionname:file localfile}. Secondly, PSCP will attempt to authenticate using Pageant if Pageant is running (see \k{pageant}). So you would do this: \b Ensure Pageant is running, and has your private key stored in it. \b Specify a user and host name to PSCP as normal. PSCP will automatically detect Pageant and try to use the keys within it. For more general information on public-key authentication, see \k{pubkey} Revision-number: 933 Prop-content-length: 149 Content-length: 149 K 7 svn:log V 50 More proto `how-to' documentation: CVS and WinCVS K 10 svn:author V 4 owen K 8 svn:date V 27 2001-02-19T23:24:01.000000Z PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f2eda9bbb06c01481e373e726e6d24c6 Text-delta-base-sha1: 6ed8da02158b401e0375ac04bd56dd427ff294eb Text-content-length: 2950 Text-content-md5: 995170b6690530c15bb8ea71ec810a04 Text-content-sha1: 6ed2c9eb9099a9faa37f80b17a871ee1c2f51cee Content-length: 2989 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNoj(3Y ^\versionid $Id: plink.but,v 1.4 2001/02/19 23:24:01S2{plink-usage-options-v}\c{-v} show verbose messages By default, Plink only displays any password prompts and the output of the remote command. The \c{-v} option makes it print extra information about the connection being made, for example: \c Server version: SSH-1.5-OpenSSH-1.2.3 \c We claim version: SSH-1.5-PuTTY \c Using SSH protocol version 1 \c Received public keys \c Host key fingerprint is: \c 1023 e3:65:44:44:bd:b1:04:59:bc:e2:3d:a1:4d:09:ce:99 \c Encrypted session key \c Using 3DES encryption \c Trying to enable encryption... \c Successfully started encryption \c Sent username "fred". \c Sent username "fred" \c fred@example.com's password: This information can be useful for diagnosing problems. \S2{plink-usage-options-ssh}\c{-ssh} force use of ssh protocol \S2{plink-usage-options-P}\c{-P port} connect to specified port \S2{plink-usage-options-pw}\c{-pw passw} login with specified password \H{plink-pubkey} Using public key authentication with Plinkset the environment variable \c{CVS_RSH} to point to Plink: \c set CVS_RSH=\path\to\plink.exe You also need to arrange to be able to connect to a remote host without a password. To do this, either: \b Run PuTTY, and create a PuTTY saved session (see \k{config-saving}) which specifies your private key file (see \k{config-auth}). You will probably also want to specify a username to log in as (see \k{config-username}). You should then be able to run CVS as follows: \c cvs -d :ext:user@sessionname:/path/to/repository co module If you specified a username in your saved session, you can just say: \c cvs -d :ext:sessionname:/path/to/repository co module Alternatively, you can use Pageant if Pageant is running (see \k{pageant}). To do this, you would: \b Ensure Pageant is running, and has your private key stored in it. \b Run CVS as follows: \c cvs -d :ext:user@hostname:/path/to/repository co module \H{plink-wincvs} Using Plink with \i{WinCVS} Plink can also be used with WinCVS. Firstly, arrange for Plink to be able to connect to a remote host without a password. \k{plink-cvs} has instructions on this. In WinCVS, bring up the \e{Preferences} dialogue box from the \e{Admin} menu, and switch to the \e{Ports} tab. Tick the box there labelled \e{Check for an alternate rsh name} and in the text entry field to the right enter the full path to \c{plink.exe}. Select \e{OK} on the \e{Preferences} dialogue box. Next, select \e{Command Line} from the WinCVS \e{Admin} menu, and type a CVS command as in \k{plink-cvs}, for example: \c cvs -d :ext:user@hostname:/path/to/repository co module Select the folder you want to check out to with the \e{Change Folder} button, and click \e{OK} to check out your module. Once you've got modules checked out, WinCVS will happily invoke plink from the GUI for CVS operations. \H{plink-whatelse} Using Plink with... ? Revision-number: 934 Prop-content-length: 149 Content-length: 149 K 7 svn:log V 49 Attempt to fix the remaining key re-exchange bug K 10 svn:author V 5 simon K 8 svn:date V 27 2001-02-20T13:55:59.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e65b657c73e0e7e9e0074c10e1584300 Text-delta-base-sha1: 8d8c90912adcfa6a141a0d250cb81913c7efb39c Text-content-length: 121 Text-content-md5: b7da68adbfef9af404d9fa7cfb15f5d1 Text-content-sha1: 0428bb8805ca08182ebe5e598203e62d0c461dba Content-length: 161 K 15 cvs2svn:cvs-rev V 4 1.97 PROPS-END SVNS"O uwhile (!(ispkt && pktin.type == SSH2_MSG_KEXINIT)) { crReturn(1); }acke{{ Revision-number: 935 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 35 Update copyright dates to 2001 :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2001-02-22T09:07:24.000000Z PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 22774cbb1843318e4c6f946f99504b06 Text-delta-base-sha1: 047ffe573f7046abe4452a47107b98a4e977526d Text-content-length: 44 Text-content-md5: 95b47314318a406ab047403e4eb8350c Text-content-sha1: 001879907f05b6df3e4415260be220121eb36f10 Content-length: 83 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN|PuTTY is copyright 1997-2001 Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0ab61f2ff3f95ed64edd01bb59ab9596 Text-delta-base-sha1: 087d5d451af647a7a2223b6b08aa6997d37e0392 Text-content-length: 29 Text-content-md5: aec58f36590b718d72b5eb1b6272c9f6 Text-content-sha1: 77dda8f22858d6c30b4c819adc8a06ea83f0fcf5 Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN>>BOC+11 Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e3f709559499695ff87f369a2351a2ed Text-delta-base-sha1: 6f41ecf07d790d4c7bd43f6fbae2b3a7124e73f8 Text-content-length: 29 Text-content-md5: 72986d762676869d34f6e64fb9de5a65 Text-content-sha1: 04fd609685eaa4c666119d4cd466b43a481b6125 Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN114P5+11 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b0885553f92c9fdf2064cce0dabfdf4b Text-delta-base-sha1: 73c03ad699159e3dff7e3d313988fa09ae5c75cf Text-content-length: 29 Text-content-md5: 2de15cc2c72c26dba23b6c608c101a2c Text-content-sha1: fb1c0c53923fa69ce75cd75d0941f234b461c2ec Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVN((uv+}11 Revision-number: 936 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2001-02-23T13:15:17.000000Z K 7 svn:log V 63 Add a traffic analysis defence to SSH2 password authentication K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b7da68adbfef9af404d9fa7cfb15f5d1 Text-delta-base-sha1: 0428bb8805ca08182ebe5e598203e62d0c461dba Text-content-length: 6131 Text-content-md5: 44c598602514596c0a4035a62c2f877b Text-content-sha1: 41efe260871af901591a00c7a810bb04349fdcf0 Content-length: 6171 K 15 cvs2svn:cvs-rev V 4 1.98 PROPS-END SVN0wy_7wS!GG["=!tA<static unsigned char *deferred_send_data = NULL; static int deferred_len = 0, deferred_size = 0 /* * Construct an SSH2 final-form packet: compress it, encrypt it, * put the MAC on it. Final packet, ready to be sent, is stored in * pktout.data. Total length is returned. */ static int ssh2_pkt_construct/* Ready-to-send packet starts at pktout.data. We return length. */ return pktout.length + padding + maclen; } /* * Construct and send an SSH2 packet immediately. */ static void ssh2_pkt_send(void) { int len = ssh2_pkt_construct(); sk_write(s, pktout.data, len); } /* * Construct an SSH2 packet and add it to a deferred data block. * Useful for sending multiple packets in a single sk_write() call, * to prevent a traffic-analysing listener from being able to work * out the length of any particular packet (such as the password * packet). * * Note that because SSH2 sequence-numbers its packets, this can * NOT be used as an m4-style `defer' allowing packets to be * constructed in one order and sent in another. */ static void ssh2_pkt_defer(void) { int len = ssh2_pkt_construct(); if (deferred_len + len > deferred_size) { deferred_size = deferred_len + len + 128; deferred_send_data = srealloc(deferred_send_data, deferred_size); } memcpy(deferred_send_data+deferred_len, pktout.data, len); deferred_len += len; } /* * Send the whole deferred data block constructed by * ssh2_pkt_defer(). */ static void ssh2_pkt_defersend(void) { sk_write(s, deferred_send_data, deferred_len); deferred_len = deferred_size = 0; sfree(deferred_send_data); deferred_send_data = NULL/* * We send the password packet lumped tightly together with * an SSH_MSG_IGNORE packet. The IGNORE packet contains a * string long enough to make the total length of the two * packets constant. This should ensure that a passive * listener doing traffic analyis can't work out the length * of the password. * * For this to work, we need an assumption about the * maximum length of the password packet. I think 256 is * pretty conservative. Anyone using a password longer than * that probably doesn't have much to worry about from * people who find out how long their password is! */defer(); /* * We'll include a string that's an exact multiple of the * cipher block size. If the cipher is NULL for some * reason, we don't do this trick at all because we gain * nothing by it. */ if (cscipher) { int i, j; ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(); for (i = deferred_len; i <= 256; i += cscipher->blksize) { for (j = 0; j < cscipher->blksize; j++) { char c = (char)random_byte(); ssh2_pkt_addstring_data(&c, 1); } } ssh2_pkt_defer(); } ssh2_pkt_defer{*//{ if(crypto_startup() == 0) return "Microsoft high encryption pack not installed!"; #endif ssh_send_ok = 0; ssh_editing = 0; ssh_echoing = 0; p = connect_to_host(host, port, realhost); if (p != NULL) return p; return NULL; } /* * Called to send data down the Telnet connection. */ static void ssh_send (char *buf, int len) { if (s == NULL || ssh_protocol == NULL) return; ssh_protocol(buf, len, 0); } /* * Called to set the size of the window from SSH's POV. */ static void ssh_size(void) { switch (ssh_state) { case SSH_STATE_BEFORE_SIZE: case SSH_STATE_PREPACKET: case SSH_STATE_CLOSED: break; /* do nothing */ case SSH_STATE_INTERMED: size_needed = TRUE; /* buffer for later */ break; case SSH_STATE_SESSION: if (!cfg.nopty) { if (ssh_version == 1) { send_packet(SSH1_CMSG_WINDOW_SIZE, PKT_INT, rows, PKT_INT, cols, PKT_INT, 0, PKT_INT, 0, PKT_END); } else { ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(mainchan->remoteid); ssh2_pkt_addstring("window-change"); ssh2_pkt_addbool(0); ssh2_pkt_adduint32(cols); ssh2_pkt_adduint32(rows); ssh2_pkt_adduint32(0); ssh2_pkt_adduint32(0); ssh2_pkt_send(); } } break; } } /* * Send Telnet special codes. TS_EOF is useful for `plink', so you * can send an EOF and collect resulting output (e.g. `plink * hostname sort'). */ static void ssh_special (Telnet_Special code) { if (code == TS_EOF) { if (ssh_state != SSH_STATE_SESSION) { /* * Buffer the EOF in case we are pre-SESSION, so we can * send it as soon as we reach SESSION. */ if (code == TS_EOF) eof_needed = TRUE; return; } if (ssh_version == 1) { send_packet(SSH1_CMSG_EOF, PKT_END); } else { ssh2_pkt_init(SSH2_MSG_CHANNEL_EOF); ssh2_pkt_adduint32(mainchan->remoteid); ssh2_pkt_send(); } logevent("Sent EOF message"); } else if (code == TS_PING) { if (ssh_state == SSH_STATE_CLOSED || ssh_state == SSH_STATE_PREPACKET) return; if (ssh_version == 1) { send_packet(SSH1_MSG_IGNORE, PKT_STR, "", PKT_END); } else { ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(); ssh2_pkt_send(); } } else { /* do nothing */ } } static Socket ssh_socket(void) { return s; } static int ssh_sendok(void) { return ssh_send_ok; } static int ssh_ldisc(int option) { if (option == LD_ECHO) return ssh_echoing; if (option == LD_EDIT) return ssh_editing; return FALSE; } Backend ssh_backe Revision-number: 937 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2001-02-23T18:21:06.000000Z K 7 svn:log V 24 64-bit integer routines K 10 svn:author V 5 simon PROPS-END Node-path: putty/int64.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1343 Text-content-md5: 0bb879d054146606bc5947934b416e49 Text-content-sha1: 5f7774cd3737af49a298bc25d01536a26ef3ea0c Content-length: 1459 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN111/* * Handling of the int64 and uint64 types. Done in 32-bit integers, * for (pre-C99) portability. Hopefully once C99 becomes widespread * we can kiss this lot goodbye... */ #include typedef struct { unsigned long hi, lo; } uint64, int64; uint64 uint64_div10(uint64 x, int *remainder) { uint64 y; int rem, r2; y.hi = x.hi / 10; y.lo = x.lo / 10; rem = x.lo % 10; /* * Now we have to add in the remainder left over from x.hi. */ r2 = x.hi % 10; y.lo += r2 * 2 * (0x80000000 / 10); rem += r2 * 2 * (0x80000000 % 10); y.lo += rem / 10; rem %= 10; if (remainder) *remainder = rem; return y; } void uint64_decimal(uint64 x, char *buffer) { char buf[20]; int start = 20; int d; while (x.hi || x.lo) { x = uint64_div10(x, &d); assert(start > 0); buf[--start] = d + '0'; } memcpy(buffer, buf+start, sizeof(buf)-start); buffer[sizeof(buf)-start] = '\0'; } uint64 uint64_make(unsigned long hi, unsigned long lo) { uint64 y; y.hi = hi; y.lo = lo; return y; } uint64 uint64_add(uint64 x, uint64 y) { x.lo += y.lo; x.hi += y.hi + (x.lo < y.lo ? 1 : 0); return x; } uint64 uint64_add32(uint64 x, unsigned long y) { uint64 yy; yy.hi = 0; yy.lo = y; return uint64_add(x, yy); } Node-path: putty/int64.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 394 Text-content-md5: d9ec727d511d2e07add3337c5a954909 Text-content-sha1: d3d7a40d9c8444d017017064097c5ca43ca93797 Content-length: 510 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN|||/* * Header for int64.c. */ #ifndef PUTTY_INT64_H #define PUTTY_INT64_H typedef struct { unsigned long hi, lo; } uint64, int64; uint64 uint64_div10(uint64 x, int *remainder); void uint64_decimal(uint64 x, char *buffer); uint64 uint64_make(unsigned long hi, unsigned long lo); uint64 uint64_add(uint64 x, uint64 y); uint64 uint64_add32(uint64 x, unsigned long y); #endif Revision-number: 938 Prop-content-length: 191 Content-length: 191 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-02-23T18:21:44.000000Z K 7 svn:log V 91 First stab at an SFTP client. Currently a Unixland testing app, not integrated into PuTTY. PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 11003 Text-content-md5: 4860131980393f7708bf63b1358d045e Text-content-sha1: a08b889f6452229329bd3db276fc1cee94e19845 Content-length: 11119 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNmmm/* * psftp.c: front end for PSFTP. */ #include #include #include #include #include "sftp.h" #include "int64.h" #define smalloc malloc #define srealloc realloc #define sfree free /* ---------------------------------------------------------------------- * String handling routines. */ char *dupstr(char *s) { int len = strlen(s); char *p = smalloc(len+1); strcpy(p, s); return p; } /* ---------------------------------------------------------------------- * sftp client state. */ char *pwd, *homedir; /* ---------------------------------------------------------------------- * Higher-level helper functions used in commands. */ /* * Canonify a pathname starting from the pwd. */ char *canonify(char *name) { if (name[0] == '/') return fxp_realpath(name, NULL); else return fxp_realpath(pwd, name); } /* ---------------------------------------------------------------------- * Actual sftp commands. */ struct sftp_command { char **words; int nwords, wordssize; int (*obey)(struct sftp_command *);/* returns <0 to quit */ }; int sftp_cmd_null(struct sftp_command *cmd) { return 0; } int sftp_cmd_unknown(struct sftp_command *cmd) { printf("psftp: unknown command \"%s\"\n", cmd->words[0]); return 0; } int sftp_cmd_quit(struct sftp_command *cmd) { return -1; } /* * List a directory. If no arguments are given, list pwd; otherwise * list the directory given in words[1]. */ static int sftp_ls_compare(const void *av, const void *bv) { const struct fxp_name *a = (const struct fxp_name *)av; const struct fxp_name *b = (const struct fxp_name *)bv; return strcmp(a->filename, b->filename); } int sftp_cmd_ls(struct sftp_command *cmd) { struct fxp_handle *dirh; struct fxp_names *names; struct fxp_name *ournames; int nnames, namesize; char *dir, *cdir; int i; if (cmd->nwords < 2) dir = "."; else dir = cmd->words[1]; cdir = canonify(dir); if (!cdir) { printf("%s: %s\n", dir, fxp_error()); return 0; } printf("Listing directory %s\n", cdir); dirh = fxp_opendir(cdir); if (dirh == NULL) { printf("Unable to open %s: %s\n", dir, fxp_error()); } else { nnames = namesize = 0; ournames = NULL; while (1) { names = fxp_readdir(dirh); if (names == NULL) { if (fxp_error_type() == SSH_FX_EOF) break; printf("Reading directory %s: %s\n", dir, fxp_error()); break; } if (names->nnames == 0) { fxp_free_names(names); break; } if (nnames + names->nnames >= namesize) { namesize += names->nnames + 128; ournames = srealloc(ournames, namesize * sizeof(*ournames)); } for (i = 0; i < names->nnames; i++) ournames[nnames++] = names->names[i]; names->nnames = 0; /* prevent free_names */ fxp_free_names(names); } fxp_close(dirh); /* * Now we have our filenames. Sort them by actual file * name, and then output the longname parts. */ qsort(ournames, nnames, sizeof(*ournames), sftp_ls_compare); /* * And print them. */ for (i = 0; i < nnames; i++) printf("%s\n", ournames[i].longname); } sfree(cdir); return 0; } /* * Change directories. We do this by canonifying the new name, then * trying to OPENDIR it. Only if that succeeds do we set the new pwd. */ int sftp_cmd_cd(struct sftp_command *cmd) { struct fxp_handle *dirh; char *dir; if (cmd->nwords < 2) dir = fxp_realpath(".", NULL); else dir = canonify(cmd->words[1]); if (!dir) { printf("%s: %s\n", dir, fxp_error()); return 0; } dirh = fxp_opendir(dir); if (!dirh) { printf("Directory %s: %s\n", dir, fxp_error()); sfree(dir); return 0; } fxp_close(dirh); sfree(pwd); pwd = dir; printf("Remote directory is now %s\n", pwd); return 0; } /* * Get a file and save it at the local end. */ int sftp_cmd_get(struct sftp_command *cmd) { struct fxp_handle *fh; char *fname, *outfname; uint64 offset; FILE *fp; if (cmd->nwords < 2) { printf("get: expects a filename\n"); return 0; } fname = canonify(cmd->words[1]); if (!fname) { printf("%s: %s\n", cmd->words[1], fxp_error()); return 0; } outfname = (cmd->nwords == 2 ? cmd->words[1] : cmd->words[2]); fh = fxp_open(fname, SSH_FXF_READ); if (!fh) { printf("%s: %s\n", fname, fxp_error()); sfree(fname); return 0; } fp = fopen(outfname, "wb"); if (!fp) { printf("local: unable to open %s\n", outfname); fxp_close(fh); sfree(fname); return 0; } printf("remote:%s => local:%s\n", fname, outfname); offset = uint64_make(0,0); /* * FIXME: we can use FXP_FSTAT here to get the file size, and * thus put up a progress bar. */ while (1) { char buffer[4096]; int len; int wpos, wlen; len = fxp_read(fh, buffer, offset, sizeof(buffer)); if ((len == -1 && fxp_error_type() == SSH_FX_EOF) || len == 0) break; if (len == -1) { printf("error while reading: %s\n", fxp_error()); break; } wpos = 0; while (wpos < len) { wlen = fwrite(buffer, 1, len-wpos, fp); if (wlen <= 0) { printf("error while writing local file\n"); break; } wpos += wlen; } if (wpos < len) /* we had an error */ break; offset = uint64_add32(offset, len); } fclose(fp); fxp_close(fh); sfree(fname); return 0; } /* * Send a file and store it at the remote end. */ int sftp_cmd_put(struct sftp_command *cmd) { struct fxp_handle *fh; char *fname, *origoutfname, *outfname; uint64 offset; FILE *fp; if (cmd->nwords < 2) { printf("put: expects a filename\n"); return 0; } fname = cmd->words[1]; origoutfname = (cmd->nwords == 2 ? cmd->words[1] : cmd->words[2]); outfname = canonify(origoutfname); ~|~ if (!outfname) { printf("%s: %s\n", origoutfname, fxp_error()); return 0; } fp = fopen(fname, "rb"); if (!fp) { printf("local: unable to open %s\n", fname); fxp_close(fh); sfree(outfname); return 0; } fh = fxp_open(outfname, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_TRUNC); if (!fh) { printf("%s: %s\n", outfname, fxp_error()); sfree(outfname); return 0; } printf("local:%s => remote:%s\n", fname, outfname); offset = uint64_make(0,0); /* * FIXME: we can use FXP_FSTAT here to get the file size, and * thus put up a progress bar. */ while (1) { char buffer[4096]; int len; len = fread(buffer, 1, len, fp); if (len == -1) { printf("error while reading local file\n"); break; } else if (len == 0) { break; } if (!fxp_write(fh, buffer, offset, sizeof(buffer))) { printf("error while writing: %s\n", fxp_error()); break; } offset = uint64_add32(offset, len); } fxp_close(fh); fclose(fp); sfree(outfname); return 0; } static struct sftp_cmd_lookup { char *name; int (*obey)(struct sftp_command *); } sftp_lookup[] = { /* * List of sftp commands. This is binary-searched so it MUST be * in ASCII order. */ {"bye", sftp_cmd_quit}, {"cd", sftp_cmd_cd}, {"exit", sftp_cmd_quit}, {"get", sftp_cmd_get}, {"ls", sftp_cmd_ls}, {"put", sftp_cmd_put}, {"quit", sftp_cmd_quit}, }; /* ---------------------------------------------------------------------- * Command line reading and parsing. */ struct sftp_command *sftp_getcmd(void) { char *line; int linelen, linesize; struct sftp_command *cmd; char *p, *q, *r; int quoting; printf("psftp> "); fflush(stdout); cmd = smalloc(sizeof(struct sftp_command)); cmd->words = NULL; cmd->nwords = 0; cmd->wordssize = 0; line = NULL; linesize = linelen = 0; while (1) { int len; char *ret; linesize += 512; line = srealloc(line, linesize); ret = fgets(line+linelen, linesize-linelen, stdin); if (!ret || (linelen == 0 && line[0] == '\0')) { cmd->obey = sftp_cmd_quit; printf("quit\n"); return cmd; /* eof */ } len = linelen + strlen(line+linelen); linelen += len; if (line[linelen-1] == '\n') { linelen--; line[linelen] = '\0'; break; } } /* * Parse the command line into words. The syntax is: * - double quotes are removed, but cause spaces within to be * treated as non-separating. * - a double-doublequote pair is a literal double quote, inside * _or_ outside quotes. Like this: * * firstword "second word" "this has ""quotes"" in" sodoes""this"" * * becomes * * >firstword< * >second word< * >this has "quotes" in< * >sodoes"this"< */ p = line; while (*p) { /* skip whitespace */ while (*p && (*p == ' ' || *p == '\t')) p++; /* mark start of word */ q = r = p; /* q sits at start, r writes word */ quoting = 0; while (*p) { if (!quoting && (*p == ' ' || *p == '\t')) break; /* reached end of word */ else if (*p == '"' && p[1] == '"') p+=2, *r++ = '"'; /* a literal quote */ else if (*p == '"') p++, quoting = !quoting; else *r++ = *p++; } if (*p) p++; /* skip over the whitespace */ *r = '\0'; if (cmd->nwords >= cmd->wordssize) { cmd->wordssize = cmd->nwords + 16; cmd->words = srealloc(cmd->words, cmd->wordssize*sizeof(char *)); } cmd->words[cmd->nwords++] = q; } /* * Now parse the first word and assign a function. */ if (cmd->nwords == 0) cmd->obey = sftp_cmd_null; else { int i, j, k, cmp; cmd->obey = sftp_cmd_unknown; i = -1; j = sizeof(sftp_lookup) / sizeof(*sftp_lookup); while (j - i > 1) { k = (j + i) / 2; cmp = strcmp(cmd->words[0], sftp_lookup[k].name); if (cmp < 0) j = k; else if (cmp > 0) i = k; else { cmd->obey = sftp_lookup[k].obey; break; } } } return cmd; } void do_sftp(void) { /* * Do protocol initialisation. */ if (!fxp_init()) { fprintf(stderr, "Fatal: unable to initialise SFTP: %s\n", fxp_error()); } /* * Find out where our home directory is. */ homedir = fxp_realpath(".", NULL); if (!homedir) { fprintf(stderr, "Warning: failed to resolve home directory: %s\n", fxp_error()); homedir = dupstr("."); } else { printf("Remote working directory is %s\n", homedir); } pwd = dupstr(homedir); /* ------------------------------------------------------------------ * Now we're ready to do Real Stuff. */ while (1) { struct sftp_command *cmd; cmd = sftp_getcmd(); if (!cmd) break; if (cmd->obey(cmd) < 0) break; } /* ------------------------------------------------------------------ * We've received an exit command. Tidy up and leave. */ io_finish(); } int main(void) { io_init(); do_sftp(); return 0; } Node-path: putty/sftp.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 16104 Text-content-md5: 4ce63bd2037bf32402348011b450edb0 Text-content-sha1: ce120196bbb24b6d68a4c85eb3dc3cb14de13ea8 Content-length: 16220 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNZZZ/* * sftp.c: SFTP generic client code. */ #include #include #include #include #include "int64.h" #include "sftp.h" #define smalloc malloc #define srealloc realloc #define sfree free #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) #define PUT_32BIT(cp, value) { \ (cp)[0] = (unsigned char)((value) >> 24); \ (cp)[1] = (unsigned char)((value) >> 16); \ (cp)[2] = (unsigned char)((value) >> 8); \ (cp)[3] = (unsigned char)(value); } struct sftp_packet { char *data; int length, maxlen; int savedpos; int type; }; /* ---------------------------------------------------------------------- * SFTP packet construction functions. */ static void sftp_pkt_ensure(struct sftp_packet *pkt, int length) { if (pkt->maxlen < length) { pkt->maxlen = length + 256; pkt->data = srealloc(pkt->data, pkt->maxlen); } } static void sftp_pkt_adddata(struct sftp_packet *pkt, void *data, int len) { pkt->length += len; sftp_pkt_ensure(pkt, pkt->length); memcpy(pkt->data+pkt->length-len, data, len); } static void sftp_pkt_addbyte(struct sftp_packet *pkt, unsigned char byte) { sftp_pkt_adddata(pkt, &byte, 1); } static struct sftp_packet *sftp_pkt_init(int pkt_type) { struct sftp_packet *pkt; pkt = smalloc(sizeof(struct sftp_packet)); pkt->data = NULL; pkt->savedpos = -1; pkt->length = 0; pkt->maxlen = 0; sftp_pkt_addbyte(pkt, (unsigned char)pkt_type); return pkt; } static void sftp_pkt_addbool(struct sftp_packet *pkt, unsigned char value) { sftp_pkt_adddata(pkt, &value, 1); } static void sftp_pkt_adduint32(struct sftp_packet *pkt, unsigned long value) { unsigned char x[4]; PUT_32BIT(x, value); sftp_pkt_adddata(pkt, x, 4); } static void sftp_pkt_adduint64(struct sftp_packet *pkt, uint64 value) { unsigned char x[8]; PUT_32BIT(x, value.hi); PUT_32BIT(x+4, value.lo); sftp_pkt_adddata(pkt, x, 8); } static void sftp_pkt_addstring_start(struct sftp_packet *pkt) { sftp_pkt_adduint32(pkt, 0); pkt->savedpos = pkt->length; } static void sftp_pkt_addstring_str(struct sftp_packet *pkt, char *data) { sftp_pkt_adddata(pkt, data, strlen(data)); PUT_32BIT(pkt->data + pkt->savedpos - 4, pkt->length - pkt->savedpos); } static void sftp_pkt_addstring_data(struct sftp_packet *pkt, char *data, int len) { sftp_pkt_adddata(pkt, data, len); PUT_32BIT(pkt->data + pkt->savedpos - 4, pkt->length - pkt->savedpos); } static void sftp_pkt_addstring(struct sftp_packet *pkt, char *data) { sftp_pkt_addstring_start(pkt); sftp_pkt_addstring_str(pkt, data); } /* ---------------------------------------------------------------------- * SFTP packet decode functions. */ static unsigned char sftp_pkt_getbyte(struct sftp_packet *pkt) { unsigned long value; if (pkt->length - pkt->savedpos < 1) return 0; /* arrgh, no way to decline (FIXME?) */ value = (unsigned char) pkt->data[pkt->savedpos]; pkt->savedpos++; return value; } static unsigned long sftp_pkt_getuint32(struct sftp_packet *pkt) { unsigned long value; if (pkt->length - pkt->savedpos < 4) return 0; /* arrgh, no way to decline (FIXME?) */ value = GET_32BIT(pkt->data+pkt->savedpos); pkt->savedpos += 4; return value; } static void sftp_pkt_getstring(struct sftp_packet *pkt, char **p, int *length) { *p = NULL; if (pkt->length - pkt->savedpos < 4) return; *length = GET_32BIT(pkt->data+pkt->savedpos); pkt->savedpos += 4; if (pkt->length - pkt->savedpos < *length) return; *p = pkt->data+pkt->savedpos; pkt->savedpos += *length; } static struct fxp_attrs sftp_pkt_getattrs(struct sftp_packet *pkt) { struct fxp_attrs ret; ret.flags = sftp_pkt_getuint32(pkt); if (ret.flags & SSH_FILEXFER_ATTR_SIZE) { unsigned long hi, lo; hi = sftp_pkt_getuint32(pkt); lo = sftp_pkt_getuint32(pkt); ret.size = uint64_make(hi, lo); } if (ret.flags & SSH_FILEXFER_ATTR_UIDGID) { ret.uid = sftp_pkt_getuint32(pkt); ret.gid = sftp_pkt_getuint32(pkt); } if (ret.flags & SSH_FILEXFER_ATTR_PERMISSIONS) { ret.permissions = sftp_pkt_getuint32(pkt); } if (ret.flags & SSH_FILEXFER_ATTR_ACMODTIME) { ret.atime = sftp_pkt_getuint32(pkt); ret.mtime = sftp_pkt_getuint32(pkt); } if (ret.flags & SSH_FILEXFER_ATTR_EXTENDED) { int count; count = sftp_pkt_getuint32(pkt); while (count--) { char *str; int len; /* * We should try to analyse these, if we ever find one * we recognise. */ sftp_pkt_getstring(pkt, &str, &len); sftp_pkt_getstring(pkt, &str, &len); } } return ret; } static void sftp_pkt_free(struct sftp_packet *pkt) { if (pkt->data) sfree(pkt->data); sfree(pkt); } /* ---------------------------------------------------------------------- * Send and receive packet functions. FIXME: change for PuTTY. */ int tossh, fromssh; int io_init(void) { int to[2], from[2]; int pid; assert(pipe(to) == 0); assert(pipe(from) == 0); pid = fork(); assert(pid >= 0); if (pid == 0) { /* We are child. Dup one end of each pipe to our std[io], * close other end, exec. */ close(0); dup2(to[0], 0); close(to[1]); close(1); dup2(from[1], 1); close(from[0]); execl("/home/simon/src/openssh/openssh_cvs/prefix/bin/ssh", "ssh", "-2", "simon@localhost", "-s", "sftp", NULL); assert(0); /* bomb out if not */ } else { /* We are parent. Close wrong end of each pipe, assign to glob vars. */ close(to[0]); tossh = to[1]; close(from[1]); fromssh = from[0]; } } int io_finish(void) { int pid, status; close(tossh); close(fromssh); pid = wait(&status); } int sftp_send(struct sftp_packet *pkt) { char x[4]; PUT_32BIT(x, pkt->length); assert(4 == write(tossh, x, 4)); assert(pkt->length = write(tossh, pkt->data, pkt->length)); sftp_pkt_free(pkt); } struct sftp_packet *sftp_recv(void) { struct sftp_packet *pkt; char x[4]; int p, ret; for (p = 0; p < 4 ;) { ret = read(fromssh, x+p, 4-p); assert(ret >= 0); if (ret == 0) return NULL; p += ret; } pkt = smalloc(sizeof(struct sftp_packet)); pkt->savedpos = 0; pkt->length = pkt->maxlen = GET_32BIT(x); pkt->data = smalloc(pkt->length); for (p = 0; p < pkt->length ;) { ret = read(fromssh, pkt->data+p, pkt->length-p); assert(ret >= 0); if (ret == 0) { sftp_pkt_free(pkt); return NULL; } p += ret; } pkt->type = sftp_pkt_getbyte(pkt); return pkt; } /* ---------------------------------------------------------------------- * String handling routines. */ static char *mkstr(char *s, int len) { char *p = smalloc(len+1); memcpy(p, s, len); p[len] = '\0'; return p; } /* ---------------------------------------------------------------------- * SFTP primitives. */ static const char *fxp_error_message; static int fxp_errtype; /* * Deal with (and free) an FXP_STATUS packet. Return 1 if * SSH_FX_OK, 0 if SSH_FX_EOF, and -1 for anything else (error). * Also place the status into fxp_errtype. */ static int fxp_got_status(struct sftp_packet *pktin) { static const char *const messages[] = { /* SSH_FX_OK. The only time we will display a _message_ for this * is if we were expecting something other than FXP_STATUS on * success, so this is actually an error message! */ "unexpected OK response", "end of file", "no such file or directory", "permission denied", "failure", "bad message", "no connection", "connection lost", "operation unsupported", }; if (pktin->type != SSH_FXP_STATUS) { fxp_error_message = "expected FXP_STATUS packet"; fxp_errtype = -1; } else { fxp_errtype = sftp_pkt_getuint32(pktin); if (fxp_errtype < 0 || fxp_errtype >= sizeof(messages)/sizeof(*messages)) fxp_error_message = "unknown error code"; else fxp_error_message = messages[fxp_errtype]; } if (fxp_errtype == SSH_FX_OK) return 1; else if (fxp_errtype == SSH_FX_EOF) return 0; else return -1; } static int fxp_internal_error(char *msg) { fxp_error_message = msg; fxp_errtype = -1; } const char *fxp_error(void) { return fxp_error_message; } int fxp_error_type(void) { return fxp_errtype; } /* * Perform exchange of init/version packets. Return 0 on failure. */ int fxp_init(void) { struct sftp_packet *pktout, *pktin; int remotever; pktout = sftp_pkt_init(SSH_FXP_INIT); sftp_pkt_adduint32(pktout, SFTP_PROTO_VERSION); sftp_send(pktout); pktin = sftp_recv(); if (pktin->type != SSH_FXP_VERSION) { fxp_internal_error("did not receive FXP_VERSION"); return 0; } remotever = sftp_pkt_getuint32(pktin); if (remotever > SFTP_PROTO_VERSION) { fxp_internal_error("remote protocol is more advanced than we support"); return 0; } /* * In principle, this packet might also contain extension- * string pairs. We should work through them and look for any * we recognise. In practice we don't currently do so because * we know we don't recognise _any_. */ sftp_pkt_free(pktin); return 1; } /* * Canonify a pathname. Concatenate the two given path elements * with a separating slash, unless the second is NULL. */ char *fxp_realpath(char *path, char *path2) { struct sftp_packet *pktin, *pktout; int id; pktout = sftp_pkt_init(SSH_FXP_REALPATH); sftp_pkt_adduint32(pktout, 0x123); /* request id */ sftp_pkt_addstring_start(pktout); sftp_pkt_addstring_str(pktout, path); if (path2) { sftp_pkt_addstring_str(pktout, "/"); sftp_pkt_addstring_str(pktout, path2); } sftp_send(pktout); pktin = sftp_recv(); id = sftp_pkt_getuint32(pktin); if (id != 0x123) { fxp_internal_error("request ID mismatch\n"); return NULL; } if (pktin->type == SSH_FXP_NAME) { int count; char *path; int len; count = sftp_pkt_getuint32(pktin); if (count != 1) { fxp_internal_error("REALPATH returned name count != 1\n"); return NULL; } sftp_pkt_getstring(pktin, &path, &len); if (!path) { fxp_internal_error("REALPATH returned malformed FXP_NAME\n"); return NULL; } path = mkstr(path, len); sftp_pkt_free(pktin); return path; } else { fxp_got_status(pktin); return NULL; } } /* * Open a file. */ struct fxp_handle *fxp_open(char *path, int type) { struct sftp_packet *pktin, *pktout; int id; pktout = sftp_pkt_init(SSH_FXP_OPEN); sftp_pkt_adduint32(pktout, 0x567); /* request id */ sftp_pkt_addstring(pktout, path); sftp_pkt_adduint32(pktout, type); sftp_pkt_adduint32(pktout, 0); /* (FIXME) empty ATTRS structure */ sftp_send(pktout); pktin = sftp_recv(); id = sftp_pkt_getuint32(pktin); if (id != 0x567) { fxp_internal_error("request ID mismatch\n"); return NULL; } if (pktin->type == SSH_FXP_HANDLE) { int count; char *hstring; struct fxp_handle *handle; int len; sftp_pkt_getstring(pktin, &hstring, &len); if (!hstring) { fxp_internal_error("OPEN returned malformed FXP_HANDLE\n"); return NULL; } handle = smalloc(sizeof(struct fxp_handle)); handle->hstring = mkstr(hstring, len); sftp_pkt_free(pktin); return handle; } else { fxp_got_status(pktin); return NULL; } } /* * Open a directory. */ struct fxp_handle *fxp_opendir(char *path) { struct sftp_packet *pktin, *pktout; int id; pktout = sftp_pkt_init(SSH_FXP_OPENDIR); sftp_pkt_adduint32(pktout, 0x456); /* request id */ sftp_pkt_addstring(pktout, path); sftp_send(pktout); pktin = sftp_recv(); id = sftp_pkt_getuint32(pktin); if (id != 0x456) { fxp_internal_error("request ID mismatch\n"); return NULL; } if (pktin->type == SSH_FXP_HANDLE) { int count; char *hstring; struct fxp_handle *handle; int len; sftp_pkt_getstring(pktin, &hstring, &len); if (!hstring) { fxp_internal_error("OPENDIR returned malformed FXP_HANDLE\n"); return NULL; } handle = smalloc(sizeof(struct fxp_handle)); handle->hstring = mkstr(hstring, len); sftp_pkt_free(pktin); return handle; } else { fxp_got_status(pktin); return NULL; } } /* * Close a file/dir. */ void fxp_close(struct fxp_handle *handle) { struct sftp_packet *pktin, *pktout; int id; pktout = sftp_pkt_init(SSH_FXP_CLOSE); sftp_pkt_adduint32(pktout, 0x789); /* request id */ sftp_pkt_addstring(pktout, handle->hstring); sftp_send(pktout); pktin = sftp_recv(); id = sftp_pkt_getuint32(pktin); if (id != 0x789) { fxp_internal_error("request ID mismatch\n"); return; } fxp_got_status(pktin); sfree(handle->hstring); sfree(handle); } /* * Read from a file. Returns the number of bytes read, or -1 on an * error, or possibly 0 if EOF. (I'm not entirely sure whether it * will return 0 on EOF, or return -1 and store SSH_FX_EOF in the * error indicator. It might even depend on the SFTP server.) */ int fxp_read(struct fxp_handle *handle, char *buffer, uint64 offset, int len) { struct sftp_packet *pktin, *pktout; int id; pktout = sftp_pkt_init(SSH_FXP_READ); sftp_pkt_adduint32(pktout, 0xBCD); /* request id */ sftp_pkt_addstring(pktout, handle->hstring); sftp_pkt_adduint64(pktout, offset); sftp_pkt_adduint32(pktout, len); sftp_send(pktout); pktin = sftp_recv(); id = sftp_pkt_getuint32(pktin); if (id != 0xBCD) { fxp_internal_error("request ID mismatch"); return; } if (pktin->type == SSH_FXP_DATA) { char *str; int rlen; sftp_pkt_getstring(pktin, &str, &rlen); if (rlen > len || rlen < 0) { fxp_internal_error("READ returned more bytes than requested"); return -1; } memcpy(buffer, str, rlen); sfree(pktin); return rlen; } else { fxp_got_status(pktin); return -1; } } /* * Read from a directory. */ struct fxp_names *fxp_readdir(struct fxp_handle *handle) { struct sftp_packet *pktin, *pktout; int id; pktout = sftp_pkt_init(SSH_FXP_READDIR); sftp_pkt_adduint32(pktout, 0xABC); /* request id */ sftp_pkt_addstring(pktout, handle->hstring); sftp_send(pktout); pktin = sftp_recv(); id = sftp_pkt_getuint32(pktin); if (id != 0xABC) { fxp_internal_error("request ID mismatch\n"); return; } if (pktin->type == SSH_FXP_NAME) { struct fxp_names *ret; int i; ret = smalloc(sizeof(struct fxp_names)); ret->nnames = sftp_pkt_getuint32(pktin); ret->names = smalloc(ret->nnames * sizeof(struct fxp_name)); for (i = 0; i < ret->nnames; i++) { char *str; int len; sftp_pkt_getstring(pktin, &str, &len); ret->names[i].filename = mkstr(str, len); sftp_pkt_getstring(pktin, &str, &len); ret->names[i].longname = mkstr(str, len); ret->names[i].attrs = sftp_pkt_getattrs(pktin); } return ret; } else { fxp_got_status(pktin); return NULL; } } /* * Write to a file. Returns 0 on error, 1 on OK. */ int fxp_write(struct fxp_handle *handle, char *buffer, uint64 offset, int len) { struct sftp_packet *pktin, *pktout; int id; pktout = sftp_pkt_init(SSH_FXP_WRITE); sftp_pkt_adduint32(pktout, 0xDCB); /* request id */ sftp_pkt_addstring(pktout, handle->hstring); sftp_pkt_adduint64(pktout, offset); sftp_pkt_addstring_start(pktout); sftp_pkt_addstring_data(pktout, buffer, len); sftp_send(pktout); pktin = sftp_recv(); id = sftp_pkt_getuint32(pktin); fxp_got_status(pktin); return fxp_errtype == SSH_FX_OK; } /* * Free up an fxp_names structure. */ void fxp_free_names(struct fxp_names *names) { int i; for (i = 0; i < names->nnames; i++) { sfree(names->names[i].filename); sfree(names->names[i].longname); } sfree(names->names); sfree(names); } Node-path: putty/sftp.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4120 Text-content-md5: ab2d25989df96700d567adf9d088a3b7 Text-content-sha1: 6cd292e4ae425e663e1cf601c286a7dfd6e6a7a6 Content-length: 4236 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  /* * sftp.h: definitions for SFTP and the sftp.c routines. */ #include "int64.h" #define SSH_FXP_INIT 1 /* 0x1 */ #define SSH_FXP_VERSION 2 /* 0x2 */ #define SSH_FXP_OPEN 3 /* 0x3 */ #define SSH_FXP_CLOSE 4 /* 0x4 */ #define SSH_FXP_READ 5 /* 0x5 */ #define SSH_FXP_WRITE 6 /* 0x6 */ #define SSH_FXP_LSTAT 7 /* 0x7 */ #define SSH_FXP_FSTAT 8 /* 0x8 */ #define SSH_FXP_SETSTAT 9 /* 0x9 */ #define SSH_FXP_FSETSTAT 10 /* 0xa */ #define SSH_FXP_OPENDIR 11 /* 0xb */ #define SSH_FXP_READDIR 12 /* 0xc */ #define SSH_FXP_REMOVE 13 /* 0xd */ #define SSH_FXP_MKDIR 14 /* 0xe */ #define SSH_FXP_RMDIR 15 /* 0xf */ #define SSH_FXP_REALPATH 16 /* 0x10 */ #define SSH_FXP_STAT 17 /* 0x11 */ #define SSH_FXP_RENAME 18 /* 0x12 */ #define SSH_FXP_STATUS 101 /* 0x65 */ #define SSH_FXP_HANDLE 102 /* 0x66 */ #define SSH_FXP_DATA 103 /* 0x67 */ #define SSH_FXP_NAME 104 /* 0x68 */ #define SSH_FXP_ATTRS 105 /* 0x69 */ #define SSH_FXP_EXTENDED 200 /* 0xc8 */ #define SSH_FXP_EXTENDED_REPLY 201 /* 0xc9 */ #define SSH_FX_OK 0 #define SSH_FX_EOF 1 #define SSH_FX_NO_SUCH_FILE 2 #define SSH_FX_PERMISSION_DENIED 3 #define SSH_FX_FAILURE 4 #define SSH_FX_BAD_MESSAGE 5 #define SSH_FX_NO_CONNECTION 6 #define SSH_FX_CONNECTION_LOST 7 #define SSH_FX_OP_UNSUPPORTED 8 #define SSH_FILEXFER_ATTR_SIZE 0x00000001 #define SSH_FILEXFER_ATTR_UIDGID 0x00000002 #define SSH_FILEXFER_ATTR_PERMISSIONS 0x00000004 #define SSH_FILEXFER_ATTR_ACMODTIME 0x00000008 #define SSH_FILEXFER_ATTR_EXTENDED 0x80000000 #define SSH_FXF_READ 0x00000001 #define SSH_FXF_WRITE 0x00000002 #define SSH_FXF_APPEND 0x00000004 #define SSH_FXF_CREAT 0x00000008 #define SSH_FXF_TRUNC 0x00000010 #define SSH_FXF_EXCL 0x00000020 #define SFTP_PROTO_VERSION 3 struct fxp_attrs { unsigned long flags; uint64 size; unsigned long uid; unsigned long gid; unsigned long permissions; unsigned long atime; unsigned long mtime; }; struct fxp_handle { char *hstring; }; struct fxp_name { char *filename, *longname; struct fxp_attrs attrs; }; struct fxp_names { int nnames; struct fxp_name *names; }; const char *fxp_error(void); int fxp_error_type(void); /* * Perform exchange of init/version packets. Return 0 on failure. */ int fxp_init(void); /* * Canonify a pathname. Concatenate the two given path elements * with a separating slash, unless the second is NULL. */ char *fxp_realpath(char *path, char *path2); /* * Open a file. */ struct fxp_handle *fxp_open(char *path, int type); /* * Open a directory. */ struct fxp_handle *fxp_opendir(char *path); /* * Close a file/dir. */ void fxp_close(struct fxp_handle *handle); /* * Read from a file. */ int fxp_read(struct fxp_handle *handle, char *buffer, uint64 offset, int len); /* * Read from a directory. */ struct fxp_names *fxp_readdir(struct fxp_handle *handle); /* * Free up an fxp_names structure. */ void fxp_free_names(struct fxp_names *names); Revision-number: 939 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2001-02-24T12:02:35.000000Z K 7 svn:log V 58 SFTP client now successfully handles cd, ls, get and put. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4860131980393f7708bf63b1358d045e Text-delta-base-sha1: a08b889f6452229329bd3db276fc1cee94e19845 Text-content-length: 1126 Text-content-md5: a9ec7691a8099575bc90cb775bde2df1 Text-content-sha1: 56184fcd26438b96ec9a4893c3f5968a29200400 Content-length: 1165 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNm,8"ZPt/fR<^DG8*!/A^H%stdarg.h> #include hlen = lenhandle->hlen = len_start(pktout); sftp_pkt_addstring_data(pktout, handle->hstring, handle->h_start(pktout); sftp_pkt_addstring_data(pktout, handle->hstring, handle->hlen_start(pktout); sftp_pkt_addstring_data(pktout, handle->hstring, handle->h_start(pktout); sftp_pkt_addstring_data(pktout, handle->hstring, handle->hlen Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ab2d25989df96700d567adf9d088a3b7 Text-delta-base-sha1: 6cd292e4ae425e663e1cf601c286a7dfd6e6a7a6 Text-content-length: 38 Text-content-md5: e2b77ab368b3005ad1e3c6462336f71f Text-content-sha1: 76e4bdf6fb2027917c0515f149ffe38b1ebc846d Content-length: 77 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN  4K2 int hlen Revision-number: 940 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2001-02-24T16:08:56.000000Z K 7 svn:log V 43 psftp now works as part of the PuTTY suite K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 41315589095ddf20d980da8b9379d7e8 Text-delta-base-sha1: 3a54bfcabbf74fd9c86d5635b36a9c6f799e6484 Text-content-length: 299 Text-content-md5: b8df150e93cb0e08cc96014213d2eb7c Text-content-sha1: 41687419d7b7e35e4c373f7314bf6ddaf523e3f5 Content-length: 339 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN{#|u{aoI|;Isftp SOBJS = psftp.$(OBJ) sftp.$(OBJ) int64.$(OBJ) winnet.$(OBJ) be_none.$(OBJ) ##-- objects putty puttytel pscp psftsft psftsftpsftp.$(OBJ): psftp.c putty.h ssh.h storage.h sftp.h int64.h sftp.$(OBJ): psftp.c sftp.h int64.h int64.$(OBJ): int64.c int64 Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a9ec7691a8099575bc90cb775bde2df1 Text-delta-base-sha1: 56184fcd26438b96ec9a4893c3f5968a29200400 Text-content-length: 12261 Text-content-md5: 3f63fead260a3f81a9a02934e5c6bbc3 Text-content-sha1: e129893012849d6e972fda5d1b112e1647346711 Content-length: 12300 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN,V"6 E-+t l`lE!/* * psftp.c: front end for PSFTP. */ #include #include #include #include #include #define PUTTY_DO_GLOBALS #include "putty.h" #include "storage.h" #include "ssh.h" #include "sftp.h" #include "int64.h" /* if (name[0] == '/') { fullname = dupstr(name); } else { char *slash; if (pwd[strlen(pwd)-1] == '/') slash = ""; else slash = "/"; fullname = dupcat(pwd, slash, name, NULL); } canonname = fxp_realpath(fullname); dir", sftp_cmd_ls} /* - * Dirty bits: integration with PuTTY. */ static int verbose = 0; void verify_ssh_host_key(char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; static const char absentmsg[] = "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, enter \"y\" to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you do not trust this host, enter \"n\" to abandon the\n" "connection.\n" "Continue connecting? (y/n) "; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "enter Yes to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, enter No.\n" "If you want to abandon the connection completely, press\n" "Return to cancel. Pressing Return is the ONLY guaranteed\n" "safe choice.\n" "Update cached key? (y/n, Return cancels connection) "; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; /* * Verify the key against the registry. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; if (ret == 2) { /* key was different */ fprintf(stderr, wrongmsg, fingerprint); if (fgets(line, sizeof(line), stdin) && line[0] != '\0' && line[0] != '\n') { if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); } else { fprintf(stderr, abandoned); exit(0); } } if (ret == 1) { /* key was absent */ fprintf(stderr, absentmsg, fingerprint); if (fgets(line, sizeof(line), stdin) && (line[0] == 'y' || line[0] == 'Y')) store_host_key(host, port, keytype, keystr); else { fprintf(stderr, abandoned); exit(0); } } } /* * Print an error message and perform a fatal exit. */ void fatalbox(char *fmt, ...) { char str[0x100]; /* Make the size big enough */ va_list ap; va_start(ap, fmt); strcpy(str, "Fatal:"); vsprintf(str+strlen(str), fmt, ap); va_end(ap); strcat(str, "\n"); fprintf(stderr, str); exit(1); } void connection_fatal(char *fmt, ...) { char str[0x100]; /* Make the size big enough */ va_list ap; va_start(ap, fmt); strcpy(str, "Fatal:"); vsprintf(str+strlen(str), fmt, ap); va_end(ap); strcat(str, "\n"); fprintf(stderr, str); exit(1); } void logevent(char *string) { } void ldisc_send(char *buf, int len) { /* * This is only here because of the calls to ldisc_send(NULL, * 0) in ssh.c. Nothing in PSFTP actually needs to use the * ldisc as an ldisc. So if we get called with any real data, I * want to know about it. */ assert(len == 0); } /* * Be told what socket we're supposed to be using. */ static SOCKET sftp_ssh_socket; char *do_select(SOCKET skt, int startup) { if (startup) sftp_ssh_socket = skt; else sftp_ssh_socket = INVALID_SOCKET; return NULL; } extern int select_result(WPARAM, LPARAM); /* * Receive a block of data from the SSH link. Block until all data * is available. * * To do this, we repeatedly call the SSH protocol module, with our * own trap in from_backend() to catch the data that comes back. We * do this until we have enough data. */ static unsigned char *outptr; /* where to put the data */ static unsigned outlen; /* how much data required */ static unsigned char *pending = NULL; /* any spare data */ static unsigned pendlen=0, pendsize=0; /* length and phys. size of buffer */ void from_backend(int is_stderr, char *data, int datalen) { unsigned char *p = (unsigned char *)data; unsigned len = (unsigned)datalen; /* * stderr data is just spouted to local stderr and otherwise * ignored. */ if (is_stderr) { fwrite(data, 1, len, stderr); return; } /* * If this is before the real session begins, just return. */ if (!outptr) return; if (outlen > 0) { unsigned used = outlen; if (used > len) used = len; memcpy(outptr, p, used); outptr += used; outlen -= used; p += used; len -= used; } if (len > 0) { if (pendsize < pendlen + len) { pendsize = pendlen + len + 4096; pending = (pending ? srealloc(pending, pendsize) : smalloc(pendsize)); if (!pending) fatalbox("Out of memory"); } memcpy(pending+pendlen, p, len); pendlen += len; } } int sftp_recvdata(char *buf, int len) { outptr = (unsigned char *)buf; outlen = len; /* * See if the pending-input block contains some of what we * need. */ if (pendlen > 0) { unsigned pendused = pendlen; if (pendused > outlen) pendused = outlen; memcpy(outptr, pending, pendused); memmove(pending, pending+pendused, pendlen-pendused); outptr += pendused; outlen -= pendused; pendlen -= pendused; if (pendlen == 0) { pendsize = 0; sfree(pending); pending = NULL; } if (outlen == 0) return 1; } while (outlen > 0) { fd_set readfds; FD_ZERO(&readfds); FD_SET(sftp_ssh_socket, &readfds); if (select(1, &readfds, NULL, NULL, NULL) < 0) return 0; /* doom */ select_result((WPARAM)sftp_ssh_socket, (LPARAM)FD_READ); } return 1; } int sftp_senddata(char *buf, int len) { back->send((unsigned char *)buf, len); return 1; } /* * Loop through the ssh connection and authentication process. */ static void ssh_sftp_init(void) { if (sftp_ssh_socket == INVALID_SOCKET) return; while (!back->sendok()) { fd_set readfds; FD_ZERO(&readfds); FD_SET(sftp_ssh_socket, &readfds); if (select(1, &readfds, NULL, NULL, NULL) < 0) return; /* doom */ select_result((WPARAM)sftp_ssh_socket, (LPARAM)FD_READ); } } static char *password = NULL; static int get_password(const char *prompt, char *str, int maxlen) { HANDLE hin, hout; DWORD savemode, i; if (password) { static int tried_once = 0; if (tried_once) { return 0; } else { strncpy(str, password, maxlen); str[maxlen-1] = '\0'; tried_once = 1; return 1; } } hin = GetStdHandle(STD_INPUT_HANDLE); hout = GetStdHandle(STD_OUTPUT_HANDLE); if (hin == INVALID_HANDLE_VALUE || hout == INVALID_HANDLE_VALUE) { fprintf(stderr, "Cannot get standard input/output handles\n"); exit(1); } GetConsoleMode(hin, &savemode); SetConsoleMode(hin, (savemode & (~ENABLE_ECHO_INPUT)) | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT); WriteFile(hout, prompt, strlen(prompt), &i, NULL); ReadFile(hin, str, maxlen-1, &i, NULL); SetConsoleMode(hin, savemode); if ((int)i > maxlen) i = maxlen-1; else i = i - 2; str[i] = '\0'; WriteFile(hout, "\r\n", 2, &i, NULL); return 1; } /* * Initialize the Win$ock driver. */ static void init_winsock(void) { WORD winsock_ver; WSADATA wsadata; winsock_ver = MAKEWORD(1, 1); if (WSAStartup(winsock_ver, &wsadata)) { fprintf(stderr, "Unable to initialise WinSock"); exit(1); } if (LOBYTE(wsadata.wVersion) != 1 || HIBYTE(wsadata.wVersion) != 1) { fprintf(stderr, "WinSock version is incompatible with 1.1"); exit(1); } } /* * Short description of parameters. */ static void usage(void) { printf("PuTTY Secure File Transfer (SFTP) client\n"); printf("%s\n", ver); printf("Usage: psftp [options] user@host\n"); printf("Options:\n"); printf(" -v show verbose messages\n"); printf(" -P port connect to specified port\n"); printf(" -pw passw login with specified password\n"); exit(1); } /* * Main program. Parse arguments etc. */ int main(int argc, char *argv[]) { int i; int portnumber = 0; char *user, *host, *userhost, *realhost; char *err; flags = FLAG_STDERR; ssh_get_password = &get_password; init_winsock(); sk_init(); userhost = user = NULL; for (i = 1; i < argc; i++) { if (argv[i][0] != '-') { if (userhost) usage(); else userhost = dupstr(argv[i]); } else if (strcmp(argv[i], "-v") == 0) { verbose = 1, flags |= FLAG_VERBOSE; } else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-?") == 0) { usage(); } else if (strcmp(argv[i], "-l") == 0 && i+1 < argc) { user = argv[++i]; } else if (strcmp(argv[i], "-P") == 0 && i+1 < argc) { portnumber = atoi(argv[++i]); } else if (strcmp(argv[i], "-pw") == 0 && i+1 < argc) { password = argv[++i]; } else if (strcmp(argv[i], "--") == 0) { i++; break; } else { usage(); } } argc -= i; argv += i; back = NULL; if (argc > 0 || !userhost) usage(); /* Separate host and username */ host = userhost; host = strrchr(host, '@'); if (host == NULL) { host = userhost; } else { *host++ = '\0'; if (user) { printf("psftp: multiple usernames specified; using \"%s\"\n", user); } else user = userhost; } /* Try to load settings for this host */ do_defaults(host, &cfg); if (cfg.host[0] == '\0') { /* No settings for this host; use defaults */ do_defaults(NULL, &cfg); strncpy(cfg.host, host, sizeof(cfg.host)-1); cfg.host[sizeof(cfg.host)-1] = '\0'; cfg.port = 22; } /* Set username */ if (user != NULL && user[0] != '\0') { strncpy(cfg.username, user, sizeof(cfg.username)-1); cfg.username[sizeof(cfg.username)-1] = '\0'; } if (!cfg.username[0]) { printf("login as: "); if (!fgets(cfg.username, sizeof(cfg.username), stdin)) { fprintf(stderr, "psftp: aborting\n"); exit(1); } else { int len = strlen(cfg.username); if (cfg.username[len-1] == '\n') cfg.username[len-1] = '\0'; } } if (cfg.protocol != PROT_SSH) cfg.port = 22; if (portnumber) cfg.port = portnumber; /* SFTP uses SSH2 by default always */ cfg.sshprot = 2; /* Set up subsystem name. FIXME: fudge for SSH1. */ strcpy(cfg.remote_cmd, "sftp"); cfg.ssh_subsys = TRUE; cfg.nopty = TRUE; back = &ssh_backend; err = back->init(cfg.host, cfg.port, &realhost); if (err != NULL) { fprintf(stderr, "ssh_init: %s", err); return 1; } ssh_sftp_init(); if (verbose && realhost != NULL) printf("Connected to %s\n", realhost); do_sftp(); if (back != NULL && back->socket() != NULL) { char ch; back->special(TS_EOF); sftp_recvdata(&ch, 1); } WSACleanup(); random_save_seed(); return 0; } Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f32997b0b68a9450c74748b2d13fad05 Text-delta-base-sha1: e13a33528062e6325b91aa734d2f81032932c7f1 Text-content-length: 89 Text-content-md5: 7e907cca1a40868f0e0878030e13eaee Text-content-sha1: 625a9a428766956a84e090763e23751b6c1085bd Content-length: 129 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVNY! C:C$5int ssh_subsys; /* run a subsystem rather than a command */ Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 13a1cee2dae1403992f96cb75e5c4072 Text-delta-base-sha1: af30ac46b6f00dee3c876c2c9d94489b39cc938c Text-content-length: 526 Text-content-md5: 1de136d4bc012601c440640ff10e620c Text-content-sha1: 28ddf91e89cf3d052db26dce3e5728c95ef8c703 Content-length: 565 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN$5M^Px]k^!DO=sS[F>!TJZstring.h> #include length); ret = (sftp_senddata(x, 4) && sftp_senddata(pkt->data, pkt->length)); sftp_pkt_free(pkt); return retif (!sftp_recvdata(x, 4)) return NULL;if (!sftp_recvdata(pkt->data, pkt->length)) { sftp_pkt_free(pkt); return NULLvoid -1 NULLif (id != 0xDCB) { fxp_internal_error("request ID mismatch\n"); return NULL; } Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e2b77ab368b3005ad1e3c6462336f71f Text-delta-base-sha1: 76e4bdf6fb2027917c0515f149ffe38b1ebc846d Text-content-length: 460 Text-content-md5: dbf5080ab9ed033d7873e9a45ae4ba99 Text-content-sha1: 3ff731d86b190cb08805e2a510322bb5963596c6 Content-length: 499 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN .MoKx/* * External references. The sftp client module sftp.c expects to be * able to get at these functions. * * sftp_recvdata must never return less than len. It either blocks * until len is available, or it returns failure. * * Both functions return 1 on success, 0 on failure. */ int sftp_senddata(char *data, int len); int sftp_recvdata(char *data, int len);Write to a file. Returns 0 on error, 1 on OK. */ int fxp_write Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 44c598602514596c0a4035a62c2f877b Text-delta-base-sha1: 41efe260871af901591a00c7a810bb04349fdcf0 Text-content-length: 275 Text-content-md5: 4dbdbbf2d54ddaf5822fbe5e4abbe5fe Text-content-sha1: d13d65ff1cd6962595bb0297315fca22cdb6880b Content-length: 315 K 15 cvs2svn:cvs-rev V 4 1.99 PROPS-END SVN7}JsIcfg.ssh_subsys) { ssh2_pkt_addstring("subsystem*R((*connection. * * Returns an error message, or NULL on success. */ static char *ssh_init (char *host, int port, char **realhost) { char *p; #ifdef MSCRYPTOAPI Revision-number: 941 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:33.655080Z PROPS-END Revision-number: 942 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:33.665188Z PROPS-END Revision-number: 943 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:33.681438Z PROPS-END Revision-number: 944 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2001-02-26T09:21:55.000000Z K 7 svn:log V 51 Finish adding PSFTP to the master Makefile (oops!) K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b8df150e93cb0e08cc96014213d2eb7c Text-delta-base-sha1: 41687419d7b7e35e4c373f7314bf6ddaf523e3f5 Text-content-length: 571 Text-content-md5: 05104287f5b7b440b79ce5284ad2e0de Text-content-sha1: 864e963873a0d281d546deb562f96992c4983009 Content-length: 611 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVN{  4 >%Bo_Fsftp.exe \ sftp.exe: $(FOBJS) $(MOBJS) $(MOBJ2) $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(SRESRC) psftp.rsp link $(LFLAGS) -out:psftp.exe -map:psftp.map @psftsftp.rsp: makefile echo /nologo /subsystem:console > psftp.rsp echo $(FOBJS) >> psftp.rsp echo $(MOBJS) >> psftp.rsp echo $(MOBJ2) >> psftp.rsp echo $(OBJS1) >> psftp.rsp echo $(OBJS2) >> psftp.rsp echo $(OBJS3) >> psftp.rsp echo $(OBJS4) >> psftp.rsp echo $(SRESRC) >> psftp.rsp echo $(LIBS1) >> psftp.rsp echo $(LIBS2) >> psftp.rsp echo $(SOCK1) >> psft Revision-number: 945 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:33.799628Z PROPS-END Revision-number: 946 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:33.806295Z PROPS-END Revision-number: 947 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:33.813605Z PROPS-END Revision-number: 948 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:33.820092Z PROPS-END Revision-number: 949 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:33.826622Z PROPS-END Revision-number: 950 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:33.833865Z PROPS-END Revision-number: 951 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:33.841541Z PROPS-END Revision-number: 952 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2001-02-26T16:37:22.000000Z K 7 svn:log V 49 Ahem. sftp.obj depends on sftp.c not on psftp.c! K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 05104287f5b7b440b79ce5284ad2e0de Text-delta-base-sha1: 864e963873a0d281d546deb562f96992c4983009 Text-content-length: 20 Text-content-md5: 48acedbc13d41ffd0adb10aa7b08532e Text-content-sha1: 1b01dfcde3bdceeb5725ffd2a090d4daf49d7767 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVN .l/ Revision-number: 953 Prop-content-length: 516 Content-length: 516 K 8 svn:date V 27 2001-02-26T16:39:15.000000Z K 7 svn:log V 415 Moderately evil workaround to compensate for a variation in behaviour of FXP_REALPATH. (Specifically, BSD and GNU realpath(3) disagree over whether to return success when computing the realpath for a putative new file to be created in a valid directory. There's no way we can tell from (say) the OpenSSH version string because OpenSSH might have been compiled to use the local realpath _or_ its own nonbroken one.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3f63fead260a3f81a9a02934e5c6bbc3 Text-delta-base-sha1: e129893012849d6e972fda5d1b112e1647346711 Text-content-length: 2623 Text-content-md5: b6a53c942d167deae671cdb128a94d4e Text-content-sha1: 789b41cd21fb0f1e6d1819f5ea223602da726794 Content-length: 2662 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNVd 5 Qy> { /* * Attempt number 2. Some FXP_REALPATH implementations * (glibc-based ones, in particular) require the _whole_ * path to point to something that exists, whereas others * (BSD-based) only require all but the last component to * exist. So if the first call failed, we should strip off * everything from the last slash onwards and try again, * then put the final component back on. * * Special cases: * * - if the last component is "/." or "/..", then we don't * bother trying this because there's no way it can work. * * - if the thing actually ends with a "/", we remove it * before we start. Except if the string is "/" itself * (although I can't see why we'd have got here if so, * because surely "/" would have worked the first * time?), in which case we don't bother. * * - if there's no slash in the string at all, give up in * confusion (we expect at least one because of the way * we constructed the string). */ int i; char *returnname; i = strlen(fullname); if (i > 2 && fullname[i-1] == '/') fullname[--i] = '\0'; /* strip trailing / unless at pos 0 */ while (i > 0 && fullname[--i] != '/'); /* * Give up on special cases. */ if (fullname[i] != '/' || /* no slash at all */ !strcmp(fullname+i, "/.") || /* ends in /. */ !strcmp(fullname+i, "/..") || /* ends in /.. */ !strcmp(fullname, "/")) { return fullname; } /* * Now i points at the slash. Deal with the final special * case i==0 (ie the whole path was "/nonexistentfile"). */ fullname[i] = '\0'; /* separate the string */ if (i == 0) { canonname = fxp_realpath("/"); } else { canonname = fxp_realpath(fullname); } if (!canonname) return fullname; /* even that failed; give up */ /* * We have a canonical name for all but the last path * component. Concatenate the last component and return. */ returnname = dupcat(canonname, canonname[strlen(canonname)-1] == '/' ? "" : "/", fullname+i+1, NULL); sfree(fullname); sfree(canonname); return returnname; } Revision-number: 954 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2001-02-27T09:11:42.000000Z K 7 svn:log V 45 Patches to prevent a couple of silly crashes K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b6a53c942d167deae671cdb128a94d4e Text-delta-base-sha1: 789b41cd21fb0f1e6d1819f5ea223602da726794 Text-content-length: 30 Text-content-md5: ef9816ad4ce539d8a55a8606795140e8 Text-content-sha1: 6b0579f7b2aa34facb6422681d0b6b1aab8e5755 Content-length: 69 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNdm /7- return Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1de136d4bc012601c440640ff10e620c Text-delta-base-sha1: 28ddf91e89cf3d052db26dce3e5728c95ef8c703 Text-content-length: 90 Text-content-md5: bec76500f07c84a5ee1ba326523d01a7 Text-content-sha1: e5a9a50a1908ec63c7fe303236efb8e9102046a3 Content-length: 129 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNg DeD>\!pktin) { fxp_internal_error("could not connect"); return 0; } Revision-number: 955 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:34.022009Z PROPS-END Revision-number: 956 Prop-content-length: 357 Content-length: 357 K 8 svn:date V 27 2001-02-27T17:02:51.000000Z K 7 svn:log V 256 Timestamp every line of the Event Log. The primary reason for this (generating detail in bug reports when SSH2 repeat key exchange failed) is no longer an issue, but it might be useful for other things. It's a _log_ dammit, and logs should be timestamped. K 10 svn:author V 5 simon PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2de15cc2c72c26dba23b6c608c101a2c Text-delta-base-sha1: fb1c0c53923fa69ce75cd75d0941f234b461c2ec Text-content-length: 40 Text-content-md5: 9857cdf5f4939aa748366dba3a24807f Text-content-sha1: 8fb56ce8df104da3080ddb030346625c36e4f0df Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVN(( %I}+v"300, 1199 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2b54721f4248bab7c080eb2517c72b4f Text-delta-base-sha1: 177a1c827aba12a1e8f1cd3b5def1fff7eeb2959 Text-content-length: 292 Text-content-md5: 583edc0b477f9e5818bc6f9e6695b6ff Text-content-sha1: cba90cd87c1cd89ce37f54e241f8f76baaec70dc Content-length: 333 K 15 cvs2svn:cvs-rev V 5 1.109 PROPS-END SVNa~zumwQu #include ssh_subsys = 0; /* FIXME: load this properly */ Revision-number: 960 Prop-content-length: 265 Content-length: 265 K 7 svn:log V 164 Remove the last lingering knowledge, outside sshbn.c, of the internal structure of the Bignum type. Bignum is now a fully opaque type unless you're inside sshbn.c. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-01T17:41:26.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4dbdbbf2d54ddaf5822fbe5e4abbe5fe Text-delta-base-sha1: d13d65ff1cd6962595bb0297315fca22cdb6880b Text-content-length: 783 Text-content-md5: b3a4a50c7ca7f145486fec885f9e55bf Text-content-sha1: 33d3437722af37e1399743b2c336e24b72dcbbdd Content-length: 824 K 15 cvs2svn:cvs-rev V 5 1.100 PROPS-END SVN6=l- 3ZB;$ PHWe(ssh1_bignum_bitcount(b)+7)/8; p = smalloc(n + 1); if (!p) fatalbox("out of memory"); p[0] = 0; for (i = 1; i <= n; i++) p[i] = bignum_byte(b, n-i); i = 0; while (i <= n && p[i] == 0 && (p[i+1] & 0x80) == 0) i++; memmove(p, p+i, n+1-i); *len = nbignum_from_bytes(p, length)++) { buffer[i] = bignum_byte(response, 31-i)dh_setup_group1(); dh_cleanup(connection. * * Returns an error message, or NULL on success. */ static char *ssh_init (char *host, int port, char **realhost) { char *p; #ifdef MSCRYPTOAPI if(crypto_startup() == 0) return "Microsoft high encryption pack not installed!"; #endif ssh_send_ok R== Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e80a2d3dcb8d537f1bd46c25afffb2f7 Text-delta-base-sha1: 0f48e82d3e6e05682653b5e3f5e22baa6ca079c1 Text-content-length: 295 Text-content-md5: 953b70b2fe0e4957f3efd282b03c9bf2 Text-content-sha1: 59dc9c9e7f8d05e17eafb84ee200d4c6992e0cf5 Content-length: 335 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN4l"yCxEa.1 x-$#ifndef BIGNUM_INTERNAL typedef void *Bignum; #endifcopybn(Bignum b); Bignum bn_power_2(int n); void bn_restore_invariantBignum bignum_from_bytes(unsigned char *data, int nbytes)bitmask(Bignum numbervoid dh_setup_group1(void); void dh_cleanup(void); Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 276b46912612ec32902ed244349bba2d Text-delta-base-sha1: 5ede7d628463240ef7923bd9c2ebab45bbdee755 Text-content-length: 1604 Text-content-md5: 8589def7be67db23fb68ebcd7907b5de Text-content-sha1: 70a9e92216ed1826bc0761ea834f7501be61be45 Content-length: 1644 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNy]?wrSoMBQS k/X]C!nS;Jm define BIGNUM_INTERNAL typedef unsigned short *Bignum;static void bn_restore_invariant(Bignum b) { while (b[0] > 1 && b[b[0]] == 0) b[0]--Bignum bn_power_2(int n) { Bignum ret = newbn((n+15)/16); bignum_set_bit(ret, n, 1); return retBignum bignum_from_bytes(unsigned char *data, int nbytes) { Bignum result; int w, i; w = (nbytes+1)/2; /* bytes -> words */ result = newbn(w); for (i=1; i<=w; i++) result[i] = 0; for (i=nbytes; i-- ;) { unsigned char byte = *data++; if (i & 1) result[1+i/2] |= byte<<8; else result[1+i/2] |= byte; } while (result[0] > 1 && result[result[0]] == 0) result[0]--; return resultint i; int w, b; w = 0; for (i=0; i<2; i++) w = (w << 8) + *p++; b = (w+7)/8; /* bits -> bytes */ if (!result) /* just return length */ return b + 2; *result = bignum_from_bytes(p, b); return p + breate a bignum which is the bitmask covering another one. That * is, the smallest integer which is >= N and is also one less than * a power of two. */ Bignum bignum_bitmask(Bignum n) { Bignum ret = copybn(n); int i; unsigned short j; i = ret[0]; while (n[i] == 0 && i > 0) i--; if (i <= 0) return ret; /* input was zero */ j = 1; while (j < n[i]) j = 2*j+1; ret[i] = j; while (--i > 0) ret[i] = 0xFFFF; return ret Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c3e695fb3878afc49cf87a9c85562c80 Text-delta-base-sha1: b4a943d74569bf75645cfd2c53fdcdc42022b0f3 Text-content-length: 1940 Text-content-md5: e52b2c8b9e49cef0212fa54bddf0d8a9 Text-content-sha1: 84eaae83d67b09067ad478a2ea06b58ba737b00e Content-length: 1979 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNB)prJ} 3=char P[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; /* * The generator g = 2. */ static unsigned char G[] = { 2 }; /* * Variables. */ static Bignum x, e, p, q, qmask, g; static int need_to_free_pg; /* * Common DH initialisation. */ static void dh_init(void) { q = bignum_rshift(p, 1); qmask = bignum_bitmask(q); } /* * Initialise DH for the standard group1. */ void dh_setup_group1(void) { p = bignum_from_bytes(P, sizeof(P)); g = bignum_from_bytes(G, sizeof(G)); dh_init(); } /* * Clean up. */ void dh_cleanup(void) { freebn(p); freebn(g); freebn(q); freebn(qmask); }int nbytes; unsigned char *buf; nbytes = ssh1_bignum_length(qmask); buf = smalloc(nbytes); do { /* * Create a potential x, by ANDing a string of random bytes * with qmask. */ if (x) freebn(x); ssh1_write_bignum(buf, qmask); for (i = 2; i < nbytes; i++) buf[i] &= random_byte(); ssh1_read_bignum(buf, &x); } while (bignum_cmp(x, One) <= 0 || bignum_cmp(x, q) >= 0); /* * Done. Now compute e = g^x mod p. */ e = modpow(g, x, pp Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 94a644f8c715b37014fe139460ef93fc Text-delta-base-sha1: 1a8d1d99da60a298bb9fc2b33f7664716f2f92f7 Text-content-length: 425 Text-content-md5: cd4a6e4c4887f99e9d7c4bf0277de6c9 Text-content-sha1: 05eba9255a5b18e0d39be63040ab1e7f27d64feb Content-length: 465 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNU*#z!9,7ACEbignum_from_bytes(p, length); return b; } static Bignum get160(char **data, int *datalen) { Bignum b; b = bignum_from_bytes(*data, 20); *data += 20; *datalen -= 20; ssh1_bignum_bitcount(dss->p)+15)/16; len += 4 * (ssh1_bignum_bitcount(dss->q)+15)/16; len += 4 * (ssh1_bignum_bitcount(dss->g)+15)/16; len += 4 * (ssh1_bignum_bitcount(dss->y)+15)/16; Node-path: putty/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 45887be16330c93a95a3d8edee4ea3e2 Text-delta-base-sha1: 048a09e49f64931d8bcea9a8c74fb8ca2bd0ad56 Text-content-length: 97 Text-content-md5: 853d70448198d6c799a0e45cc9317a82 Text-content-sha1: 8a204f613f7fbd4793be7d12954b0289c5399954 Content-length: 136 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNt:9K lubn_power_2(bits-1bn_power_2(bits-1bn_restore_invariant(w); Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 75955dc912a94f7f33a9df15cfe77908 Text-delta-base-sha1: 5b89040da81dfeaf6c9fdcc2eba95fa702debe3b Text-content-length: 307 Text-content-md5: 99267cd09f19c0c90e8bc0b66e2aea55 Text-content-sha1: 57ad5bcb5ac7f3c4b7a2e317e6b3b8da7eb8f453 Content-length: 347 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN+# c{CA" b1 = bignum_from_bytes(data, key->bytes); *p++ = bignum_byte(b2, i) int mdlen, exlen; md = key->modulus; ex = key->exponent; mdlen = (ssh1_bignum_bitcount(md)+15) / 16; exlen = (ssh1_bignum_bitcount(ex)+15) / 16; return 4 * (mdlen+exlen Revision-number: 961 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2001-03-01T17:45:31.000000Z K 7 svn:log V 186 Add a key length indication to each SSH2 cipher structure, in preparation for needing to know how much key material each cipher needs in order to select a suitable Diffie-Hellman group. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 953b70b2fe0e4957f3efd282b03c9bf2 Text-delta-base-sha1: 59dc9c9e7f8d05e17eafb84ee200d4c6992e0cf5 Text-content-length: 35 Text-content-md5: 4ba4e32f4a8e09c8f5b7c4c6dc348b39 Text-content-sha1: 1c7f200b9a6850cedfe72da9eded1f4d795368e9 Content-length: 75 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNl| q}o int keylen Node-path: putty/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8c696f4edfa743bd0f57516c5ea5c410 Text-delta-base-sha1: 22bee01f9a6088d84b8f15a7adac3dd051b6ea92 Text-content-length: 40 Text-content-md5: 8e0f0246cea48cc2c2646310bb1192e5 Text-content-sha1: 70d504af63c5d761a68a42f563d0723bd207778a Content-length: 79 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN `, 256, 128 }; Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7272b0c72c3618840253aef256e85116 Text-delta-base-sha1: 2ef6e36fb8319b624068e8bb608abe674ebb0375 Text-content-length: 80 Text-content-md5: 6bf9387003c3c5f2c9e030c7a7d05e71 Text-content-sha1: e8dde310d354288819f979f1d8e2a4edbee54242 Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN`n)?>:lp, 16, 168 }; static void des_ses, 56 }; Revision-number: 962 Prop-content-length: 343 Content-length: 343 K 8 svn:date V 27 2001-03-01T17:55:40.000000Z K 7 svn:log V 242 Diffie-Hellman group exchange in SSH2. Currently #ifdeffed out (change the sense of #ifdef DO_DIFFIE_HELLMAN_GEX in ssh.c) because it's _far_ too slow. Will be re-enabled once the bignum routines work a bit faster (or rather a _lot_ faster). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b3a4a50c7ca7f145486fec885f9e55bf Text-delta-base-sha1: 33d3437722af37e1399743b2c336e24b72dcbbdd Text-content-length: 4595 Text-content-md5: 331e369801fc6b03b5bdfaeb6e8f202b Text-content-sha1: 94e7110c372fa27c8428f66e3c254ad6587b9dc2 Content-length: 4636 K 15 cvs2svn:cvs-rev V 5 1.101 PROPS-END SVNPsfsmQ"iAO$ mn)V^l@y }XKEX_DH_GEX_REQUEST 30 /* 0x1e */ #define SSH2_MSG_KEX_DH_GEX_GROUP 31 /* 0x1f */ #define SSH2_MSG_KEX_DH_GEX_INIT 32 /* 0x20 */ #define SSH2_MSG_KEX_DH_GEX_REPLY 33 /* 0x21extern const struct ssh_kex ssh_diffiehellman_gex; const static struct ssh_kex *kex_algs[] = { #ifdef DO_DIFFIE_HELLMAN_GEX &ssh_diffiehellman_gex, #endif s for putting an SSH-protocol `string' and * `uint32' into a SHAstatic void sha_uint32(SHA_State *s, unsigned i) { unsigned char intblk[4]; PUT_32BIT(intblk, i); SHA_Bytes(s, intblk, 4, nbits; static char *str; static Bignum p, g, e, f, K; static int kex_init_value, kex_reply_valueIf we're doing Diffie-Hellman group exchange, start by * requesting a group. */ if (kex == &ssh_diffiehellman_gex) { int csbits, scbits; logevent("Doing Diffie-Hellman group exchange"); /* * Work out number of bits. We start with the maximum key * length of either cipher... */ csbits = cscipher_tobe->keylen; scbits = sccipher_tobe->keylen; nbits = (csbits > scbits ? csbits : scbits); /* The keys only have 160-bit entropy, since they're based on * a SHA-1 hash. So cap the key size at 160 bits. */ if (nbits > 160) nbits = 160; /* * ... and then work out how big a DH group we will need to * allow that much data. */ nbits = 512 << ((nbits-1) / 64); ssh2_pkt_init(SSH2_MSG_KEX_DH_GEX_REQUEST); ssh2_pkt_adduint32(nbits); ssh2_pkt_send(); crWaitUntil(ispkt); if (pktin.type != SSH2_MSG_KEX_DH_GEX_GROUP) { bombout(("expected key exchange group packet from server")); crReturn(0); } p = ssh2_pkt_getmp(); g = ssh2_pkt_getmp(); dh_setup_group(p, g); kex_init_value = SSH2_MSG_KEX_DH_GEX_INIT; kex_reply_value = SSH2_MSG_KEX_DH_GEX_REPLY; } else { dh_setup_group1(); kex_init_value = SSH2_MSG_KEXDH_INIT; kex_reply_value = SSH2_MSG_KEXDH_REPLY; } logevent("Doing Diffie-Hellman key exchange"); /* * Now generate and send e for Diffie-Hellman. */ e = dh_create_e(); ssh2_pkt_init(kex_init_valuekex_reply_value) { bombout(("expected key exchange replyif (kex == &ssh_diffiehellman_gex) { sha_uint32(&exhash, nbits); sha_mpint(&exhash, p); sha_mpint(&exhash, g); } =N=k; /* found a free number */ i = d->localid + 1; } c->localid = i; c->closes = 0; c->v2.remwindow = ssh2_pkt_getuint32(); c->v2.remmaxpkt = ssh2_pkt_getuint32(); c->v2.outbuffer = NULL; c->v2.outbuflen = c->v2.outbufsize = 0; add234(ssh_channels, c); ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_adduint32(c->localid); ssh2_pkt_adduint32(0x8000UL); /* our window size */ ssh2_pkt_adduint32(0x4000UL); /* our max pkt size */ ssh2_pkt_send(); } } else { bombout(("Strange packet received: type %d", pktin.type)); crReturnV; } } else { /* * We have spare data. Add it to the channel buffer. */ ssh2_add_channel_data(mainchan, in, inlen); try_send = TRUE; } if (try_send) { enum234 e; struct ssh_channel *c; /* * Try to send data on all channels if we can. */ for (c = first234(ssh_channels, &e); c; c = next234(&e)) ssh2_try_send(c); } } crFinishV; } /* * Handle the top-level SSH2 protocol. */ static void ssh2_protocol(unsigned char *in, int inlen, int ispkt) { if (do_ssh2_transport(in, inlen, ispkt) == 0) return; do_ssh2_authconn(in, inlen, ispkt); } /* * Called to set up the connection. * * Returns an error message, or NULL on success. */ static char *ssh_init (char *host, int port, char **realhost) { char *p; #ifdef MSCRYPTOAPI if(crypto_startup() == 0) return "Microsoft high encryption pack not installed!"; #endif ssh_send_ok Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4ba4e32f4a8e09c8f5b7c4c6dc348b39 Text-delta-base-sha1: 1c7f200b9a6850cedfe72da9eded1f4d795368e9 Text-content-length: 57 Text-content-md5: 7ca1a1a1234a3edb516fd262a1f97992 Text-content-sha1: 75105855150b051e390277139ca7129d62684446 Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN|+ $^)Ssetup_group(Bignum pval, Bignum gval Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e52b2c8b9e49cef0212fa54bddf0d8a9 Text-delta-base-sha1: 84eaae83d67b09067ad478a2ea06b58ba737b00e Text-content-length: 237 Text-content-md5: 7902177edd0bbe72f17f5e29b47ccd1f Text-content-sha1: 23395218bea63c8835884244fe68778f01736ad8 Content-length: 276 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN)P\KWQ struct ssh_kex ssh_diffiehellman_gex = { "diffie-hellman-group-exchangeInitialise DH for an alternative group. */ void dh_setup_group(Bignum pval, Bignum gval) { p = copybn(pval); g = copybn(gval Revision-number: 963 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2001-03-02T09:24:05.000000Z K 7 svn:log V 32 Jacob's fixes for the Event Log K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2fdc7f4a1b3890f4fdf6783b93be095c Text-delta-base-sha1: b26ec90b5ece4b2dbc329398d2d24657ad5c54cd Text-content-length: 172 Text-content-md5: 40600d74df9837e6f9251a24a894889d Text-content-sha1: d4d469505ad09aacc49890afdd6d0bc30eaff63c Content-length: 213 K 15 cvs2svn:cvs-rev V 5 1.111 PROPS-END SVN_]ew?JNif (logbox) { int count; SendDlgItemMessage (logbox, IDN_LIST, LB_ADDSTRING, 0, (LPARAM)events[nevents] nevents++; Revision-number: 964 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2001-03-02T09:25:14.000000Z K 7 svn:log V 32 Fix problem with pointer hiding K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0cdb490390286c5928d54b2b45977e58 Text-delta-base-sha1: 5f73727e03a97ecf9c241e5a2708def24f30e27d Text-content-length: 92 Text-content-md5: 92f96d6d31fdfbdc96bd97e82b73f614 Text-content-sha1: 3b7c3efa269b57bc81a42b42a02e0be9196fe7fb Content-length: 133 K 15 cvs2svn:cvs-rev V 5 1.109 PROPS-END SVN gAANCMOUSEMOVE: show_mouseptr(1); noise_ultralight(lParam); Revision-number: 965 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2001-03-02T10:29:23.000000Z K 7 svn:log V 118 A fix in modmul: don't segfault or fill the result with rubbish if the unreduced product is shorter than the modulus. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8589def7be67db23fb68ebcd7907b5de Text-delta-base-sha1: 70a9e92216ed1826bc0761ea834f7501be61be45 Text-content-length: 169 Text-content-md5: feb400f970a5380d48f131f8697b93a0 Text-content-sha1: d525c6d52e35b30a47a26c358e8fee3292be7ff5 Content-length: 209 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN] F~= rlen = (mlen < pqlen*2 ? mlen : pqlen*2); result = newbn(rlen); for (i = 0; i < rlen; i++) result[result[0] - i] = a[i+2*pqlen-r Revision-number: 966 Prop-content-length: 210 Content-length: 210 K 8 svn:date V 27 2001-03-02T11:44:35.000000Z K 7 svn:log V 109 Add AES support in SSH2. Not yet complete: there's no way to select it in the GUI (or even in the registry). K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 48acedbc13d41ffd0adb10aa7b08532e Text-delta-base-sha1: 1b01dfcde3bdceeb5725ffd2a090d4daf49d7767 Text-content-length: 76 Text-content-md5: f6ac002712a0ce3abf9aedfb68e4abbe Text-content-sha1: bd6cf64ee07e6c734839a146b7c014344412f94d Content-length: 116 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNm%+z}*  sshaes sshaes sshaesaes.$(OBJ): ssha Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 331e369801fc6b03b5bdfaeb6e8f202b Text-delta-base-sha1: 94e7110c372fa27c8428f66e3c254ad6587b9dc2 Text-content-length: 509 Text-content-md5: 3f43aeff203c6d0da9875cc03c9b850a Text-content-sha1: 0edd83b7b757776b66f996552896d174d0af08c2 Content-length: 550 K 15 cvs2svn:cvs-rev V 5 1.102 PROPS-END SVNeYk;4nn4aes128_ssh2; extern const struct ssh_cipher ssh_aes192_ssh2; extern const struct ssh_cipher ssh_aes256_ssh2 &ssh_aes256_ssh2, &ssh_aes192_ssh2, &ssh_aes128_ssh2, &ssh_blowfish_ssh2, &ssh_3des_ssh2 scipher ? csN,^^N unsigned i; enum234 e; for (i=1, d = first234(ssh_channels, &e); d; d = next234(&e)) { if (d->localid > i) brea Node-path: putty/sshaes.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 44970 Text-content-md5: bfda293f0185ba1e8d358593126999db Text-content-sha1: 7506e7711b02af5b20933ab27aae11369d0b789e Content-length: 45086 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN/* * aes.c - implementation of AES / Rijndael * * AES is a flexible algorithm as regards endianness: it has no * inherent preference as to which way round you should form words * from the input byte stream. It talks endlessly of four-byte * _vectors_, but never of 32-bit _words_ - there's no 32-bit * addition at all, which would force an endianness by means of * which way the carries went. So it would be possible to write a * working AES that read words big-endian, and another working one * that read them little-endian, just by computing a different set * of tables - with no speed drop. * * It's therefore tempting to do just that, and remove the overhead * of GET_32BIT_MSB_FIRST() et al, allowing every system to use its * own endianness-native code; but I decided not to, partly for * ease of testing, and mostly because I like the flexibility that * allows you to encrypt a non-word-aligned block of memory (which * many systems would stop being able to do if I went the * endianness-dependent route). * * This implementation reads and stores words big-endian, but * that's a minor implementation detail. By flipping the endianness * of everything in the E0..E3, D0..D3 tables, and substituting * GET_32BIT_LSB_FIRST for GET_32BIT_MSB_FIRST, I could create an * implementation that worked internally little-endian and gave the * same answers at the same speed. */ #include #include #include "ssh.h" typedef unsigned int word32; #define MAX_NR 14 /* max no of rounds */ #define MAX_NK 8 /* max no of words in input key */ #define MAX_NB 8 /* max no of words in cipher blk */ #define mulby2(x) ( ((x&0x7F) << 1) ^ (x & 0x80 ? 0x1B : 0) ) #define GET_32BIT_MSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[3]) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[0] << 24)) #define PUT_32BIT_MSB_FIRST(cp, value) do { \ (cp)[3] = (value); \ (cp)[2] = (value) >> 8; \ (cp)[1] = (value) >> 16; \ (cp)[0] = (value) >> 24; } while (0) typedef struct AESContext AESContext; struct AESContext { word32 keysched[(MAX_NR+1) * MAX_NB]; word32 invkeysched[(MAX_NR+1) * MAX_NB]; void (*encrypt)(AESContext *ctx, word32 *block); void (*decrypt)(AESContext *ctx, word32 *block); word32 iv[MAX_NB]; int Nb, Nr; }; static const unsigned char Sbox[256], Sboxinv[256]; static const word32 E0[256], E1[256], E2[256], E3[256]; static const word32 D0[256], D1[256], D2[256], D3[256]; /* * Common macros in both the encryption and decryption routines. */ #define ADD_ROUND_KEY_4 (block[0]^=*keysched++, block[1]^=*keysched++, \ block[2]^=*keysched++, block[3]^=*keysched++) #define ADD_ROUND_KEY_6 (block[0]^=*keysched++, block[1]^=*keysched++, \ block[2]^=*keysched++, block[3]^=*keysched++, \ block[4]^=*keysched++, block[5]^=*keysched++) #define ADD_ROUND_KEY_8 (block[0]^=*keysched++, block[1]^=*keysched++, \ block[2]^=*keysched++, block[3]^=*keysched++, \ block[4]^=*keysched++, block[5]^=*keysched++, \ block[6]^=*keysched++, block[7]^=*keysched++) #define MOVEWORD(i) ( block[i] = newstate[i] ) /* * Macros for the encryption routine. There are three encryption * cores, for Nb=4,6,8. */ #define MAKEWORD(i) ( newstate[i] = (E0[(block[i] >> 24) & 0xFF] ^ \ E1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \ E2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \ E3[block[(i+C3)%Nb] & 0xFF]) ) #define LASTWORD(i) ( newstate[i] = (Sbox[(block[i] >> 24) & 0xFF] << 24) | \ (Sbox[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \ (Sbox[(block[(i+C2)%Nb] >> 8) & 0xFF] << 8) | \ (Sbox[(block[(i+C3)%Nb] ) & 0xFF] ) ) /* * Core encrypt routines, expecting word32 inputs read big-endian * from the byte-oriented input stream. */ static void aes_encrypt_nb_4(AESContext *ctx, word32 *block) { int i; static const int C1 = 1, C2 = 2, C3 = 3, Nb = 4; word32 *keysched = ctx->keysched; word32 newstate[4]; for (i = 0; i < ctx->Nr-1; i++) { ADD_ROUND_KEY_4; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); } ADD_ROUND_KEY_4; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); ADD_ROUND_KEY_4; } static void aes_encrypt_nb_6(AESContext *ctx, word32 *block) { int i; static const int C1 = 1, C2 = 2, C3 = 3, Nb = 6; word32 *keysched = ctx->keysched; word32 newstate[6]; for (i = 0; i < ctx->Nr-1; i++) { ADD_ROUND_KEY_6; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MAKEWORD(4); MAKEWORD(5); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); } ADD_ROUND_KEY_6; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); LASTWORD(4); LASTWORD(5); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); ADD_ROUND_KEY_6; } static void aes_encrypt_nb_8(AESContext *ctx, word32 *block) { int i; static const int C1 = 1, C2 = 3, C3 = 4, Nb = 8; word32 *keysched = ctx->keysched; word32 newstate[8]; for (i = 0; i < ctx->Nr-1; i++) { ADD_ROUND_KEY_8; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MAKEWORD(4); MAKEWORD(5); MAKEWORD(6); MAKEWORD(7); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); MOVEWORD(6); MOVEWORD(7); } ADD_ROUND_KEY_8; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); LASTWORD(4); LASTWORD(5); LASTWORD(6); LASTWORD(7); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); MOVEWORD(6); MOVEWORD(7); ADD_ROUND_KEY_8; } #undef MAKEWORD #undef LASTWORD /* * Macros for the decryption routine. There are three decryption * cores, for Nb=4,6,8. */ #define MAKEWORD(i) ( newstate[i] = (D0[(block[i] >> 24) & 0xFF] ^ \ D1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \ D2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \ D3[block[(i+C3)%Nb] & 0xFF]) ) #define LASTWORD(i) (newstate[i] = (Sboxinv[(block[i] >> 24) & 0xFF] << 24) | \ (Sboxinv[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \ (Sboxinv[(block[(i+C2)%Nb] >> 8) & 0xFF] << 8) | \ (Sboxinv[(block[(i+C3)%Nb] ) & 0xFF] ) ) /* * Core decrypt routines, expecting word32 inputs read big-endian * from the byte-oriented input stream. */ static void aes_decrypt_nb_4(AESContext *ctx, word32 *block) { int i; static const int C1 = 4-1, C2 = 4-2, C3 = 4-3, Nb = 4; word32 *keysched = ctx->invkeysched; word32 newstate[4]; for (i = 0; i < ctx->Nr-1; i++) { ADD_ROUND_KEY_4; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); } ADD_ROUND_KEY_4; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); ADD_ROUND_KEY_4; } static void aes_decrypt_nb_6(AESContext *ctx, word32 *block) { int i; static const int C1 = 6-1, C2 = 6-2, C3 = 6-3, Nb = 6; word32 *keysched = ctx->invkeysched; word32 newstate[6]; for (i = 0; i < ctx->Nr-1; i++) { ADD_ROUND_KEY_6; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MAKEWORD(4); MAKEWORD(5); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); } ADD_ROUND_KEY_6; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); LASTWORD(4); LASTWORD(5); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); ADD_ROUND_KEY_6; } static void aes_decrypt_nb_8(AESContext *ctx, word32 *block) { int i; static const int C1 = 8-1, C2 = 8-3, C3 = 8-4, Nb = 8; word32 *keysched = ctx->invkeysched; word32 newstate[8]; for (i = 0; i < ctx->Nr-1; i++) { ADD_ROUND_KEY_8; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MAKEWORD(4); MAKEWORD(5); MAKEWORD(6); MAKEWORD(7); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); MOVEWORD(6); MOVEWORD(7); } ADD_ROUND_KEY_8; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); LASTWORD(4); LASTWORD(5); LASTWORD(6); LASTWORD(7); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); MOVEWORD(6); MOVEWORD(7); ADD_ROUND_KEY_8; } #undef MAKEWORD #undef LASTWORD static const unsigned char Sbox[256] = { 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; static const unsigned char Sboxinv[256] = { 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d }; static const word32 E0[256] = { 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, }; static const word32 E1[256] = { 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, }; static const word32 E2[256] = { 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, }; static const word32 E3[256] = { 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, }; static const word32 D0[256] = { 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, }; static const word32 D1[256] = { 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, }; static const word32 D2[256] = { 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, }; static const word32 D3[256] = { 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, }; /* * Set up an AESContext. `keylen' and `blocklen' are measured in * bytes; each can be either 16 (128-bit), 24 (192-bit), or 32 * (256-bit). */ void aes_setup(AESContext *ctx, int blocklen, unsigned char *key, int keylen) { int i, j, Nk, rconst; assert(blocklen == 16 || blocklen == 24 || blocklen == 32); assert(keylen == 16 || keylen == 24 || keylen == 32); /* * Basic parameters. Words per block, words in key, rounds. */ Nk = keylen / 4; ctx->Nb = blocklen / 4; ctx->Nr = 6 + (ctx->Nb > Nk ? ctx->Nb : Nk); /* * Assign core-function pointers. */ if (ctx->Nb == 8) ctx->encrypt = aes_encrypt_nb_8, ctx->decrypt = aes_decrypt_nb_8; else if (ctx->Nb == 6) ctx->encrypt = aes_encrypt_nb_6, ctx->decrypt = aes_decrypt_nb_6; else if (ctx->Nb == 4) ctx->encrypt = aes_encrypt_nb_4, ctx->decrypt = aes_decrypt_nb_4; /* * Now do the key setup itself. */ rconst = 1; for (i = 0; i < (ctx->Nr+1) * ctx->Nb; i++) { if (i < Nk) ctx->keysched[i] = GET_32BIT_MSB_FIRST(key + 4*i); else { word32 temp = ctx->keysched[i-1]; if (i % Nk == 0) { int a, b, c, d; a = (temp >> 16) & 0xFF; b = (temp >> 8) & 0xFF; c = (temp >> 0) & 0xFF; d = (temp >> 24) & 0xFF; temp = Sbox[a] ^ rconst; temp = (temp << 8) | Sbox[b]; temp = (temp << 8) | Sbox[c]; temp = (temp << 8) | Sbox[d]; rconst = mulby2(rconst); } else if (i % Nk == 4 && Nk > 6) { int a, b, c, d; a = (temp >> 24) & 0xFF; b = (temp >> 16) & 0xFF; c = (temp >> 8) & 0xFF; d = (temp >> 0) & 0xFF; temp = Sbox[a]; temp = (temp << 8) | Sbox[b]; temp = (temp << 8) | Sbox[c]; temp = (temp << 8) | Sbox[d]; } ctx->keysched[i] = ctx->keysched[i-Nk] ^ temp; } } /* * Now prepare the modified keys for the inverse cipher. */ for (i = 0; i <= ctx->Nr; i++) { for (j = 0; j < ctx->Nb; j++) { word32 temp; temp = ctx->keysched[(ctx->Nr - i) * ctx->Nb + j]; if (i != 0 && i != ctx->Nr) { /* * Perform the InvMixColumn operation on i. The D * tables give the result of InvMixColumn applied * to Sboxinv on individual bytes, so we should * compose Sbox with the D tables for this. */ int a, b, c, d; a = (temp >> 24) & 0xFF; b = (temp >> 16) & 0xFF; c = (temp >> 8) & 0xFF; d = (temp >> 0) & 0xFF; temp = D0[Sbox[a]]; temp ^= D1[Sbox[b]]; temp ^= D2[Sbox[c]]; temp ^= D3[Sbox[d]]; } ctx->invkeysched[i * ctx->Nb + j] = temp; } } } static void aes_encrypt(AESContext *ctx, word32 *block) { ctx->encrypt(ctx, block); } static void aes_decrypt(AESContext *ctx, word32 *block) { ctx->decrypt(ctx, block); } static void aes_encrypt_cbc(unsigned char *blk, int len, AESContext *ctx) { word32 iv[4]; int i; assert((len & 15) == 0); memcpy(iv, ctx->iv, sizeof(iv)); while (len > 0) { for (i = 0; i < 4; i++) iv[i] ^= GET_32BIT_MSB_FIRST(blk+4*i); aes_encrypt(ctx, iv); for (i = 0; i < 4; i++) PUT_32BIT_MSB_FIRST(blk+4*i, iv[i]); blk += 16; len -= 16; } memcpy(ctx->iv, iv, sizeof(iv)); } static void aes_decrypt_cbc(unsigned char *blk, int len, AESContext *ctx) { word32 iv[4], x[4], ct[4]; int i; assert((len & 15) == 0); memcpy(iv, ctx->iv, sizeof(iv)); while (len > 0) { for (i = 0; i < 4; i++) x[i] = ct[i] = GET_32BIT_MSB_FIRST(blk+4*i); aes_decrypt(ctx, x); for (i = 0; i < 4; i++) { PUT_32BIT_MSB_FIRST(blk+4*i, iv[i] ^ x[i]); iv[i] = ct[i]; } blk += 16; len -= 16; } memcpy(ctx->iv, iv, sizeof(iv)); } static AESContext csctx, scctx; static void aes128_cskey(unsigned char *key) { aes_setup(&csctx, 16, key, 16); logevent("Initialised AES-128 client->server encryption"); } static void aes128_sckey(unsigned char *key) { aes_setup(&scctx, 16, key, 16); logevent("Initialised AES-128 server->client encryption"); } static void aes192_cskey(unsigned char *key) { aes_setup(&csctx, 16, key, 24); logevent("Initialised AES-192 client->server encryption"); } static void aes192_sckey(unsigned char *key) { aes_setup(&scctx, 16, key, 24); logevent("Initialised AES-192 server->client encryption"); } static void aes256_cskey(unsigned char *key) { aes_setup(&csctx, 16, key, 32); logevent("Initialised AES-256 client->server encryption"); } static void aes256_sckey(unsigned char *key) { aes_setup(&scctx, 16, key, 32); logevent("Initialised AES-256 server->client encryption"); } static void aes_csiv(unsigned char *iv) { int i; for (i = 0; i < 4; i++) csctx.iv[i] = GET_32BIT_MSB_FIRST(iv+4*i); } static void aes_sciv(unsigned char *iv) { int i; for (i = 0; i < 4; i++) scctx.iv[i] = GET_32BIT_MSB_FIRST(iv+4*i); } static void aes_ssh2_encrypt_blk(unsigned char *blk, int len) { aes_encrypt_cbc(blk, len, &csctx); } static void aes_ssh2_decrypt_blk(unsigned char *blk, int len) { aes_decrypt_cbc(blk, len, &scctx); } struct ssh_cipher ssh_aes128_ssh2 = { NULL, aes_csiv, aes128_cskey, aes_sciv, aes128_sckey, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "aes128-cbc", 16, 128 }; struct ssh_cipher ssh_aes192_ssh2 = { NULL, aes_csiv, aes192_cskey, aes_sciv, aes192_sckey, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "aes192-cbc", 16, 192 }; struct ssh_cipher ssh_aes256_ssh2 = { NULL, aes_csiv, aes256_cskey, aes_sciv, aes256_sckey, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "aes256-cbc", 16, 256 }; #ifdef TESTMODE #include int main(void) { AESContext c; static unsigned char key[32] = {}; word32 block[32]; int i, j, k; for (i = 16; i <= 32; i += 8) { for (j = 16; j <= 32; j += 8) { printf("b%d, k%d: ", i, j); fflush(stdout); aes_setup(&c, i, key, j); memset(block, 0, sizeof(block)); aes_encrypt(&c, block); aes_decrypt(&c, block); for (k = 0; k < i/4; k++) printf("%08x ", block[k]); printf("\n"); } } return 0; } #endif Revision-number: 967 Prop-content-length: 564 Content-length: 564 K 8 svn:date V 27 2001-03-02T13:55:23.000000Z K 7 svn:log V 463 Support for selecting AES from the GUI. In the process, I've had to introduce another layer of abstraction in SSH2 ciphers, such that a single `logical cipher' (as desired by a user) can equate to more than one `physical cipher'. This is because AES comes in several key lengths (PuTTY will pick the highest supported by the remote end) and several different SSH2-protocol-level names (aes*-cbc, rijndael*-cbc, and an unofficial one rijndael-cbc@lysator.liu.se). K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7e907cca1a40868f0e0878030e13eaee Text-delta-base-sha1: 625a9a428766956a84e090763e23751b6c1085bd Text-content-length: 31 Text-content-md5: b3dd781e694ef4ad24b4bac48b7aa483 Text-content-sha1: baf2d95457a24b98cccedae21d988b52738dc460 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVN!- XKV, CIPHER_A Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3733aef5d50ab561c34a7414d35b6b3 Text-delta-base-sha1: 1e96edb14fbd400f152e7bd8d5589d88f5d388e7 Text-content-length: 288 Text-content-md5: 496d7f2607b0ec68451e683af4768527 Text-content-sha1: 0789ca383d7b6af80bbcb2d21037692284561cec Content-length: 328 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNQm2J!7 cfg->cipher == CIPHER_BLOWFISH ? "blowfish" : cfg->cipher == CIPHER_DES ? "des" : cfg->cipher == CIPHER_AES ? "aes" : if (!strcmp(cipher, "aes")) cfg->cipher = CIPHER_A Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3f43aeff203c6d0da9875cc03c9b850a Text-delta-base-sha1: 0edd83b7b757776b66f996552896d174d0af08c2 Text-content-length: 2783 Text-content-md5: bd0cea4068cfe03da3a3306a33ee586b Text-content-sha1: 5316fea250dea172f25696757d83bb421f7e2c45 Content-length: 2824 K 15 cvs2svn:cvs-rev V 5 1.103 PROPS-END SVNyiwHA(Kwl[VQh2s$,^MvW{M%R!Gd-P-2_ciphers ssh2_3des; extern const struct ssh_cipher ssh_des; extern const struct ssh2_ciphers ssh2_aes; extern const struct ssh_cipher ssh_blowfish_ssh1; extern const struct ssh2_ciphers ssh2_blowfish2_ciphers *ciphers[] = { &ssh2_aes, &ssh2_blowfish, &ssh2_3des,2_cipher *cscipher = NULL; static const struct ssh2switch (cfg.cipher) { case CIPHER_BLOWFISH: cipher_type = SSH_CIPHER_BLOWFISH; break; case CIPHER_DES: cipher_type = SSH_CIPHER_DES; break; case CIPHER_3DES: cipher_type = SSH_CIPHER_3DES; break; case CIPHER_AES: c_write("AES not supported in SSH1, falling back to 3DES\r\n", 49); cipher_type = SSH_CIPHER_3DES; break; }j2_cipher *cscipher_tobe = NULL; static const struct ssh22_ciphers2_blowfish2_3des2_3des; } else if (cfg.cipher == CIPHER_AES) { preferred_cipher = &ssh2_aes2_3des2_ciphers *c = i==0 ? preferred_cipher : ciphers[i-1]; for (j = 0; j < c->nciphers; j++) { ssh2_pkt_addstring_str(c->list[j]->name); if (i < lenof(ciphers) || j < c->nciphers-1) ssh2_pkt_addstring_str(","); }2_ciphers *c = i==0 ? preferred_cipher : ciphers[i-1]; for (j = 0; j < c->nciphers; j++) { ssh2_pkt_addstring_str(c->list[j]->name); if (i < lenof(ciphers) || j < c->nciphers-1) ssh2_pkt_addstring_str(","); }2_ciphers *c = i==0 ? preferred_cipher : ciphers[i-1]; for (j = 0; j < c->nciphers; j++) { if (in_commasep_string(c->list[j]->name, str, len)) { cscipher_tobe = c->list[j]; break; } } if (cscipher_tobe) break;2_ciphers *c = i==0 ? preferred_cipher : ciphers[i-1]; for (j = 0; j < c->nciphers; j++) { if (in_commasep_string(c->list[j]->name, str, len)) { sccipher_tobe = c->list[j]; break; } } if (sccipher_tobe) break;, ^^, error = "Unsupported channel type requested"; } c->remoteid = ssh2_pkt_getuint32(); if (error) { ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURE); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_adduint32(SSH2_OPEN_CONNECT_FAILED); ssh2_pkt_addstring(error); ssh2_pkt_addstring("en"); /* language tag */ ssh2_pkt_send(); sfree(c); } else { struct ssh_channel *d; Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7ca1a1a1234a3edb516fd262a1f97992 Text-delta-base-sha1: 75105855150b051e390277139ca7129d62684446 Text-content-length: 127 Text-content-md5: b3f3cd5b2ef8b79926b96425e335d279 Text-content-sha1: 2508e80ae08f2b049ff08b628d78573f9282d0a8 Content-length: 167 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN+` ]w},int blksize; }; struct ssh2_cipher {2_ciphers { int nciphers; struct ssh2_cipher **list Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bfda293f0185ba1e8d358593126999db Text-delta-base-sha1: 7506e7711b02af5b20933ab27aae11369d0b789e Text-content-length: 1378 Text-content-md5: 567206cfd5c9a8fb58719adf16b57ef0 Text-content-sha1: a0f3970c85854da740dd97cbdfde7dd7c09dd21e Content-length: 1417 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN07_ WE=rD=Hatic struct ssh2_cipher ssh_aes128 = {atic struct ssh2_cipher ssh_aes192 = { aes_csiv, aes192_cskey, aes_sciv, aes19292-cbc", 16, 192 }; static struct ssh2_cipher ssh_aes256 = { aes_csiv, aes256_cskey, aes_sciv, aes256256-cbc", 16, 256 }; static struct ssh2_cipher ssh_rijndael128 = { aes_csiv, aes128_cskey, aes_sciv, aes128_sckey, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "rijndael128-cbc", 16, 128 }; static struct ssh2_cipher ssh_rijndael192 = { aes_csiv, aes192_cskey, aes_sciv, aes192_sckey, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "rijndael192-cbc", 16, 192 }; static struct ssh2_cipher ssh_rijndael256 = { aes_csiv, aes256_cskey, aes_sciv, aes256_sckey, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "rijndael256-cbc", 16, 256 }; static struct ssh2_cipher ssh_rijndael_lysator = { aes_csiv, aes256_cskey, aes_sciv, aes256_sckey, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "rijndael-cbc@lysator.liu.se", 16, 256 }; static struct ssh2_cipher *aes_list[] = { &ssh_aes256, &ssh_rijndael256, &ssh_rijndael_lysator, &ssh_aes192, &ssh_rijndael192, &ssh_aes128, &ssh_rijndael128, }; struct ssh2_ciphers ssh2_aes = { sizeof(aes_list) / sizeof(*aes_list), aes_list }; Node-path: putty/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8e0f0246cea48cc2c2646310bb1192e5 Text-delta-base-sha1: 70d504af63c5d761a68a42f563d0723bd207778a Text-content-length: 326 Text-content-md5: e1b4baa9ec042bf03343e0a545c6cd9f Text-content-sha1: 17b4bb866078203502303bb7ce160ff6d03fbb15 Content-length: 365 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN W$ jW~P::ssh1_encrypt_blk, blowfish_ssh1_decrypt_blk, 8 }; static struct ssh2_cipher ssh_blowfish_ssh2 = { static struct ssh2_cipher *blowfish_list[] = { &ssh_blowfish_ssh2 }; struct ssh2_ciphers ssh2_blowfish = { sizeof(blowfish_list) / sizeof(*blowfish_list), blowfish_list }; Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6bf9387003c3c5f2c9e030c7a7d05e71 Text-delta-base-sha1: e8dde310d354288819f979f1d8e2a4edbee54242 Text-content-length: 412 Text-content-md5: 30ebbd89001efab3f0765a781f741d11 Text-content-sha1: 31321fa12b878a708f7040ddc219d19faba83755 Content-length: 452 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNnQr=:9zatic struct ssh2_cipher ssh_3des_ssh2 = {atic struct ssh2_cipher *des3_list[] = { &ssh_3des_ssh2 }; struct ssh2_ciphers ssh2_3des = { sizeof(des3_list) / sizeof(*des3_list), des3_list }; struct ssh_cipher ssh_3des = { des3_sesskey, des3_encrypt_blk, des3_decrypt_blk, 8 }; static void des_sesdes_encrypt_blk, des_decrypt_blk, 8 }; Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 40600d74df9837e6f9251a24a894889d Text-delta-base-sha1: d4d469505ad09aacc49890afdd6d0bc30eaff63c Text-content-length: 283 Text-content-md5: 7a8610ce0d3aca15f8bfbc43db0cc26f Text-content-sha1: de54afed1102bf786ed040c107bf11d012008243 Content-length: 324 K 15 cvs2svn:cvs-rev V 5 1.112 PROPS-END SVN:S y&1C@BV~SOOLCIPHERAAcfg.cipher == CIPHER_AES ? IDC_CIPHERA4 "&AES", IDC_CIPHERAES, case IDC_CIPHERAES else if (IsDlgButtonChecked (hwnd, IDC_CIPHERAES)) cfg.cipher = CIPHER_A Revision-number: 968 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 52 Extra crash-safety in decoding a DSS signature blob K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-02T17:13:16.000000Z PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cd4a6e4c4887f99e9d7c4bf0277de6c9 Text-delta-base-sha1: 05eba9255a5b18e0d39be63040ab1e7f27d64feb Text-content-length: 30 Text-content-md5: ab1faa14a825555518589e3493a61eb4 Text-content-sha1: 82fa733c5e641287f0928cd8cfc9e1a4ff28a7a3 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN*7 ,~slen != 7 Revision-number: 969 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2001-03-02T17:13:36.000000Z K 7 svn:log V 52 Added support for RSA host keys (not user keys yet) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bd0cea4068cfe03da3a3306a33ee586b Text-delta-base-sha1: 5316fea250dea172f25696757d83bb421f7e2c45 Text-content-length: 192 Text-content-md5: 9a0fb9fe5f3ada3d8d1d53a7684a5cd4 Text-content-sha1: 5d8c7add2af0d6522a49123cf169b95ce67fd6cb Content-length: 233 K 15 cvs2svn:cvs-rev V 5 1.104 PROPS-END SVN fbf8extern const struct ssh_signkey ssh_rsa; const static struct ssh_signkey *hostkey_algs[] = { &ssh_rsa, =3 11; } } else { Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 99267cd09f19c0c90e8bc0b66e2aea55 Text-delta-base-sha1: 57ad5bcb5ac7f3c4b7a2e317e6b3b8da7eb8f453 Text-content-length: 5057 Text-content-md5: 0e25b01307e73cd425a8ff869d12aca0 Text-content-sha1: 3e359bf98d27836361740a17248fd688d1a95965 Content-length: 5097 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN#?'#ua /* ---------------------------------------------------------------------- * Implementation of the ssh-rsa signing key type. */ #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) #define PUT_32BIT(cp, value) { \ (cp)[0] = (unsigned char)((value) >> 24); \ (cp)[1] = (unsigned char)((value) >> 16); \ (cp)[2] = (unsigned char)((value) >> 8); \ (cp)[3] = (unsigned char)(value); } static void getstring(char **data, int *datalen, char **p, int *length) { *p = NULL; if (*datalen < 4) return; *length = GET_32BIT(*data); *datalen -= 4; *data += 4; if (*datalen < *length) return; *p = *data; *data += *length; *datalen -= *length; } static Bignum getmp(char **data, int *datalen) { char *p; int length; Bignum b; getstring(data, datalen, &p, &length); if (!p) return NULL; b = bignum_from_bytes(p, length); return b; } static void *rsa2_newkey(char *data, int len) { char *p; int slen; struct RSAKey *rsa; rsa = smalloc(sizeof(struct RSAKey)); if (!rsa) return NULL; getstring(&data, &len, &p, &slen); if (!p || memcmp(p, "ssh-rsa", 7)) { sfree(rsa); return NULL; } rsa->exponent = getmp(&data, &len); rsa->modulus = getmp(&data, &len); rsa->private_exponent = NULL; rsa->comment = NULL; return rsa; } static void rsa2_freekey(void *key) { struct RSAKey *rsa = (struct RSAKey *)key; freersakey(rsa); sfree(rsa); } static char *rsa2_fmtkey(void *key) { struct RSAKey *rsa = (struct RSAKey *)key; char *p; int len; len = rsastr_len(rsa); p = smalloc(len); rsastr_fmt(p, rsa); return p; } static char *rsa2_fingerprint(void *key) { struct RSAKey *rsa = (struct RSAKey *)key; struct MD5Context md5c; unsigned char digest[16], lenbuf[4]; char buffer[16*3+40]; char *ret; int numlen, i; MD5Init(&md5c); MD5Update(&md5c, "\0\0\0\7ssh-rsa", 11); #define ADD_BIGNUM(bignum) \ numlen = (ssh1_bignum_bitcount(bignum)+8)/8; \ PUT_32BIT(lenbuf, numlen); MD5Update(&md5c, lenbuf, 4); \ for (i = numlen; i-- ;) { \ unsigned char c = bignum_byte(bignum, i); \ MD5Update(&md5c, &c, 1); \ } ADD_BIGNUM(rsa->exponent); ADD_BIGNUM(rsa->modulus); #undef ADD_BIGNUM MD5Final(digest, &md5c); sprintf(buffer, "%d ", ssh1_bignum_bitcount(rsaret = smalloc(strlen(buffer)+1); if (ret) strcpy(ret, buffer); return ret; } /* * This is the magic ASN.1/DER prefix that goes in the decoded * signature, between the string of FFs and the actual SHA hash * value. As closely as I can tell, the meaning of it is: * * 00 -- this marks the end of the FFs; not part of the ASN.1 bit itself * * 30 21 -- a constructed SEQUENCE of length 0x21 * 30 09 -- a constructed sub-SEQUENCE of length 9 * 06 05 -- an object identifier, length 5 * 2B 0E 03 02 1A -- * 05 00 -- NULL * 04 14 -- a primitive OCTET STRING of length 0x14 * [0x14 bytes of hash data follows] */ static unsigned char asn1_weird_stuff[] = { 0x00,0x30,0x21,0x30,0x09,0x06,0x05,0x2B, 0x0E,0x03,0x02,0x1A,0x05,0x00,0x04,0x14, }; static int rsa2_verifysig(void *key, char *sig, int siglen, char *data, int datalen) { struct RSAKey *rsa = (struct RSAKey *)key; Bignum in, out; char *p; int slen; int bytes, i, j, ret; unsigned char hash[20]; getstring(&sig, &siglen, &p, &slen); if (!p || slen != 7 || memcmp(p, "ssh-rsa", 7)) { return 0; } in = getmp(&sig, &siglen); out = modpow(in, rsa->exponent, rsa->modulus); freebn(in); ret = 1; bytes = ssh1_bignum_bitcount(rsa->modulus) / 8; /* Top (partial) byte should be zero. */ if (bignum_byte(out, bytes-1) != 0) ret = 0; /* First whole byte should be 1. */ if (bignum_byte(out, bytes-2) != 1) ret = 0; /* Most of the rest should be FF. */ for (i = bytes-3; i >= 20 + sizeof(asn1_weird_stuff); i--) { if (bignum_byte(out, i) != 0xFF) ret = 0; } /* Then we expect to see the asn1_weird_stuff. */ for (i = 20 + sizeof(asn1_weird_stuff) - 1, j=0; i >= 20; i--,j++) { if (bignum_byte(out, i) != asn1_weird_stuff[j]) ret = 0; } /* Finally, we expect to see the SHA-1 hash of the signed data. */ SHA_Simple(data, datalen, hash); for (i = 19, j=0; i >= 0; i--,j++) { if (bignum_byte(out, i) != hash[j]) ret = 0; } return ret; } int rsa2_sign(void *key, char *sig, int siglen, char *data, int datalen) { return 0; /* FIXME */ } struct ssh_signkey ssh_rsa = { rsa2_newkey, rsa2_freekey, rsa2_fmtkey, rsa2_fingerprint, rsa2_verifysig, rsa2_sign, "ssh-rsa", "rsa2" }; Revision-number: 970 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2001-03-02T17:14:10.000000Z K 7 svn:log V 63 Argh, sshrsa.c now depends on sshsha.c so Pageant needs it :-( K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f6ac002712a0ce3abf9aedfb68e4abbe Text-delta-base-sha1: bd6cf64ee07e6c734839a146b7c014344412f94d Text-content-length: 49 Text-content-md5: 4aebf3b2c1fb90d14490605b05d04752 Text-content-sha1: ad073f75a048017fca62e94dfa194ee1789c990a Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNm*B`:ePAGE3 = sshsha33 Revision-number: 971 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2001-03-02T17:16:22.000000Z K 7 svn:log V 69 Include key type in SSH2 key fingerprints, now we have more than one K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ab1faa14a825555518589e3493a61eb4 Text-delta-base-sha1: 82fa733c5e641287f0928cd8cfc9e1a4ff28a7a3 Text-content-length: 29 Text-content-md5: 9ddfb1a781a117c1c1f904bd8cdd658e Text-content-sha1: c2cf44572fc80d3d5057e671967ca5587fcf4088 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN7? _X_ssh-dss Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0e25b01307e73cd425a8ff869d12aca0 Text-delta-base-sha1: 3e359bf98d27836361740a17248fd688d1a95965 Text-content-length: 29 Text-content-md5: 0d6f1a28524941de50a2d58d589d0267 Text-content-sha1: ad20c0ad7cdad15467f6e0d6fa38ff0fa22f7b66 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN?G  ssh-rsa Revision-number: 972 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2001-03-03T11:53:07.000000Z K 7 svn:log V 34 More options for bignum debugging K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: feb400f970a5380d48f131f8697b93a0 Text-delta-base-sha1: d525c6d52e35b30a47a26c358e8fee3292be7ff5 Text-content-length: 391 Text-content-md5: 899424ff09efe5802fee8b464c7e8731 Text-content-sha1: d7d9833ab305503953e72e599bad99203cee0c31 Content-length: 431 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNF^r2oD/`if 0 // use PuTTY main debugging for diagbn() #include #include "putty.h" #define debugprint debug #else #define debugprint(x) printf x #endifdebugprint(("%s0x", prefix ? prefix : "")debugprint(("-")); for (i=nibbles; i-- ;) debugprint(("%c",hex[(bignum_byte(md, i/2) >> (4*(i%2))) & 0xF])); if (prefix) debugprint(("\n") Revision-number: 973 Prop-content-length: 489 Content-length: 489 K 8 svn:date V 27 2001-03-03T11:54:34.000000Z K 7 svn:log V 388 Preliminary support for RSA user authentication in SSH2! Most of the error messages are currently wrong, and Pageant doesn't yet support the new key type, and I haven't thoroughly tested that falling back to password authentication and trying invalid keys etc all work. But what I have here has successfully performed a public key authentication, so it's working to at least some extent. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b6fe73b61833924f50d92bb3e42cd75 Text-delta-base-sha1: 3749e9dc8823aacd542acfa64f8b898c44836811 Text-content-length: 23 Text-content-md5: a957b117ab97901725bbda804b15ee8a Text-content-sha1: a7b31db815dda828c51b3a97baaf5c90de940715 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNys @3F Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8eb9582af445251e895341bab6f26671 Text-delta-base-sha1: 02afa7088591bc7f8b44ca9643998df7aed96f18 Text-content-length: 5821 Text-content-md5: dcefd569d8138cf7ca01600c10c080a8 Text-content-sha1: 33b168c7e57f47fb63d6655823cb683ff400b9b8 Content-length: 5861 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN? -GmdFk(lQ8!-2%D^b!H<pl_q9Q  H4TAd{+=pcrQ`ME\Ue U_`KVoh2n* v%;cJ#\; /* * Centre the window. */ { /* centre the window */ RECT rs, rd; HWND hw; hw = GetDesktopWindow(); if (GetWindowRect (hw, &rs) && GetWindowRect (hwnd, &rd)) MoveWindow (hwnd, (rs.right + rs.left + rd.left - rd.right)/2, (rs.bottom + rs.top + rd.top - rd.bottom)/2, rd.right-rd.left, rd.bottom-rd.top, TRUE); } /* * Centre the window. */ { /* centre the window */ RECT rs, rd; HWND hw; hw = GetDesktopWindow(); if (GetWindowRect (hw, &rs) && GetWindowRect (hwnd, &rd)) MoveWindow (hwnd, (rs.right + rs.left + rd.left - rd.right)/2, (rs.bottom + rs.top + rd.top - rd.bottom)/2, rd.right-rd.left, rd.bottom-rd.top, TRUE); } /* * Centre the window. */ { /* centre the window */ RECT rs, rd; HWND hw; hw = GetDesktopWindow(); if (GetWindowRect (hw, &rs) && GetWindowRect (hwnd, &rd)) MoveWindow (hwnd, (rs.right + rs.left + rd.left - rd.right)/2, (rs.bottom + rs.top + rd.top - rd.bottom)/2, rd.right-rd.left, rd.bottom-rd.top, TRUE); } int ssh2; char **commentptr; /* points to key.comment or ssh2key.comment */ struct ssh2_userkey ssh2key; unsigned *entropy; struct RSAKey key1static void setupbigedit2(HWND hwnd, int id, struct ssh2_userkey *key) { unsigned char *pub_blob; char *buffer, *p; int pub_len, buflen; int i; pub_blob = key->alg->public_blob(key->data, &pub_len); buffer = smalloc(strlen(key->alg->name) + 4*((pub_len+2)/3) + strlen(key->comment) + 3); strcpy(buffer, key->alg->name); p = buffer + strlen(buffer); *p++ = ' '; i = 0; while (i < pub_len) { int n = (pub_len-i < 3 ? pub_len-i : 3); base64_encode_atom(pub_blob+i, n, p); i += n; p += 4; } *p++ = ' '; strcpy(p, key->comment); SetDlgItemText(hwnd, id, buffer); sfree(pub_blob); sfree(buffer); IDC_TYPESTATIC, IDC_KEYSSH1, IDC_KEYSSH2RSA /* * Centre the window. */ { /* centre the window */ RECT rs, rd; HWND hw; hw = GetDesktopWindow(); if (GetWindowRect (hw, &rs) && GetWindowRect (hwnd, &rd)) MoveWindow (hwnd, (rs.right + rs.left + rd.left - rd.right)/2, (rs.bottom + rs.top + rd.top - rd.bottom)/2, rd.right-rd.left, rd.bottom-rd.top, TRUE); } 5555 radioline(&cp, "Type of key to generate:", IDC_TYPESTATIC, 2, "SSH&1 (RSA)", IDC_KEYSSH1, "SSH2 &RSA", IDC_KEYSSH2RSA, NULLCheckRadioButton(hwnd, IDC_KEYSSH1, IDC_KEYSSH2RSA, IDC_KEYSSH1);*state->commentptr) sfree(*state->commentptr); *state->commentptr = smalloc(len+1); GetWindowText(editctl, *state->commentptr /* If we ever introduce a new key type, check it here! */ state->ssh2 = !IsDlgButtonChecked(hwnd, IDC_KEYSSH1) if (state->ssh2) { ret = ssh2_save_userkey(filename, &state->ssh2key, *passphrase ? passphrase : NULL); } else { ret = saversakey(filename, &state->key, *passphrase ? passphrase : NULL); } int ver1; struct ssh2_userkey *newkey2; ver = keyfile_version(filename); if (ver break; } comment = NULL; if (ver == 1) needs_pass = rsakey_encrypted(filename, &comment); else needs_pass = ssh2_user if (ver == 1) ret = loadrsakey(filename, &newkey1, passphrase); else { newkey2 = ssh2_load_userkey(filename, passphrase); if (newkey2 == SSH2_WRONG_PASSPHRASE) ret = -1; else if (!newkey2) ret = 0; else ret = 1; } if (ver == 1) { char buf[128]; char *savecomment; state->ssh2 = FALSE; state->commentptr = &state->key.comment; state->key = newkey1; /* * Set the key fingerprint. */ SetDlgItemText(hwnd, IDC_FINGERPRINT, buf); /* * Construct a decimal representation * of the key, for pasting into * .ssh/authorized_keys on a Unix box. */ setupbigedit1(hwnd, IDC_KEYDISPLAY, &state->key); } else { char *fp; char *savecomment; state->ssh2 = TRUE; state->commentptr = &state->ssh2key.comment; state->ssh2key = *newkey2; /* structure copy */ sfree(newkey2); savecomment = state->ssh2key.comment; state->ssh2key.comment = NULL; fp = state-> ssh2key.alg->fingerprint(state->ssh2key.data); state->ssh2key.comment = savecomment; SetDlgItemText(hwnd, IDC_FINGERPRINT, fp); sfree(fp); setupbigedit2(hwnd, IDC_KEYDISPLAY, &state->ssh2key); }*state->commentptr if (state->ssh2) state->commentptr = &state->ssh2key.comment; else state->commentptr = &state->key.comment*state->commentptr*state->commentptr char *savecomment*state->commentptr); /* * Set the key fingerprint. */ savecomment = *state->commentptr; *state->commentptr = NULL; if (state->ssh2) { char *fp; fp = state->ssh2key.alg->fingerprint(state->ssh2key.data); SetDlgItemText(hwnd, IDC_FINGERPRINT, fp); sfree(fp); } else { char buf[128]; rsa_fingerprint(buf, sizeof(buf), &state->key); SetDlgItemText(hwnd, IDC_FINGERPRINT, buf); } *state->commentptr = savecomment if (state->ssh2) { setupbigedit2(hwnd, IDC_KEYDISPLAY, &state->ssh2key); } else { setupbigedit1(hwnd, IDC_KEYDISPLAY, &state->key); } Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 72986d762676869d34f6e64fb9de5a65 Text-delta-base-sha1: 04fd609685eaa4c666119d4cd466b43a481b6125 Text-content-length: 27 Text-content-md5: 7a9c244ef840f2cf1108477c912bd42a Text-content-sha1: b4f0333d844a49d31b0b5209b56b114eeb175838 Content-length: 66 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN11 %+30, 29 Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9a0fb9fe5f3ada3d8d1d53a7684a5cd4 Text-delta-base-sha1: 5d8c7add2af0d6522a49123cf169b95ce67fd6cb Text-content-length: 14295 Text-content-md5: 4a8cc6dd51e430b7fe8436b0ab39fdf4 Text-content-sha1: b76360e1dba560a4649cc3428f8b0ef502ac40f0 Content-length: 14336 K 15 cvs2svn:cvs-rev V 5 1.105 PROPS-END SVNw ?J2HAQR_]lDtPfvLU46 O|V|x{|O=V%;}Ywconst static struct ssh_signkey *hostkey_algs[] = { &ssh_rsa, &ssh_dss }static unsigned char ssh2_session_id[20]int ssh2_pkt_getbool(void) { unsigned long value; if (pktin.length - pktin.savedpos < 1pktin.data[pktin.savedpos] != 0; pktin.savedpos++ssh2_session_id, exchange_hash, sizeof(exchange_hash)); ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'C', keyspace); cscipher->setcskey(keyspace); ssh2_mkkey(K, exchange_hash, ssh2_session_idssh2_session_id, 'A', keyspace); cscipher->setcsiv(keyspace); ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'B', keyspace); sccipher->setsciv(keyspace); ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'E', keyspace); csmac->setcskey(keyspace); ssh2_mkkey(K, exchange_hash, ssh2_session_id static enum { AUTH_INVALID, AUTH_PUBLICKEY_AGENT, AUTH_PUBLICKEY_FILE, AUTH_PASSWORD } method; static int gotit, need_pw, can_pubkey, can_passwd, tried_pubkey_config; static char username[100]; static char pwprompt[200]; static char password[100]Get a username. */ { char stuff[200]; strncpy(username, cfg.username, 99); username[99] = '\0'; } /* * Send an authentication request using method "none": (a) * just in case it succeeds, and (b) so that we know what * authentication methods we can usefully try next. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("none"); /* method */ ssh2_pkt_send(); logevent("Attempting null authentication"); gotit = FALSE; while (1) { /* * Wait for the result of the last authentication request. */ if (!gotit) crWaitUntilV(ispkt); while (pktin.type == SSH2_MSG_USERAUTH_BANNER) { /* FIXME: should support this */ crWaitUntilV(ispkt); } if (pktin.type == SSH2_MSG_USERAUTH_SUCCESS) { logevent("Access granted"); break; } if (pktin.type != SSH2_MSG_USERAUTH_FAILURE) { bombout(("Strange packet received during authentication: type %d", pktin.type)); } gotit = FALSE; /* * OK, we're now sitting on a USERAUTH_FAILURE message, so * we can look at the string in it and know what we can * helpfully try next. */ { char *methods; int methlen; ssh2_pkt_getstring(&methods, &methlen); if (!ssh2_pkt_getbool()) { /* * FIXME: these messages are often inappropriate. */ c_write("Access denied\r\n", 15); logevent("Access denied"); } else { c_write("Authentication partially successful\r\n", 37); logevent("Authentication partially successful"); } can_pubkey = in_commasep_string("publickey", methods, methlen); can_passwd = in_commasep_string("password", methods, methlen); } method = 0; if (!method && can_pubkey && *cfg.keyfile && !tried_pubkey_config) { unsigned char *pub_blob; char *algorithm, *comment; int pub_blob_len; tried_pubkey_config = TRUE; /* * Try the public key supplied in the configuration. * * First, offer the public blob to see if the server is * willing to accept it. */ pub_blob = ssh2_userkey_loadpub(cfg.keyfile, &algorithm, &pub_blob_len); if (pub_blob) { ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey");/* method */ ssh2_pkt_addbool(FALSE); /* no signature included */ ssh2_pkt_addstring(algorithm); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pub_blob, pub_blob_len); ssh2_pkt_send(); logevent("Offered public key"); /* FIXME */ crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) { gotit = TRUE; continue; /* key refused; give up on it */ } logevent("Offer of public key accepted"); /* * Actually attempt a serious authentication using * the key. */ if (ssh2_userkey_encrypted(cfg.keyfile, &comment)) { sprintf(pwprompt, "Passphrase for key \"%.100s\": ", comment); need_pw = TRUE; } else { need_pw = FALSE; } method = AUTH_PUBLICKEY_FILE; } } if (!method && can_passwd) { method = AUTH_PASSWORD; sprintf(pwprompt, "%.90s@%.90s's password: ", username, savedhost); need_pw = TRUE; } if (need_pw) { if (ssh_get_password) { if (!ssh_get_password(pwprompt, password, sizeof(password))) { /* * get_password failed to get a password (for * example because one was supplied on the command * line which has already failed to work). * Terminate. */ logevent("No more passwords to try"); ssh_state = SSH_STATE_CLOSED; crReturnV; } } else { static int pos = 0; static char c; c_write(pwprompt, strlen(pwprompt)); ssh_send_ok = 1; pos = 0; while (pos >= 0) { crWaitUntilV(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: password[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) pos--; break; case 21: case 27: pos = 0; break; case 3: case 4: random_save_seed(); exit(0); break; default: if (((c >= ' ' && c <= '~') || ((unsigned char)c >= 160)) && pos < 40) password[pos++] = c; break; } } c_write("\r\n", 2); } } if (method == AUTH_PUBLICKEY_FILE) { /* * We have our passphrase. Now try the actual authentication. */ struct ssh2_userkey *key; key = ssh2_load_userkey(cfg.keyfile, password); if (key == SSH2_WRONG_PASSPHRASE) { c_write("Wrong passphrase\r\n", 18); tried_pubkey_config = FALSE; /* Send a spurious AUTH_NONE to return to the top. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("none"); /* method */ ssh2_pkt_send(); } else if (key == NULL) { c_write("Unable to load private key\r\n",28); tried_pubkey_config = TRUE; /* Send a spurious AUTH_NONE to return to the top. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("none"); /* method */ ssh2_pkt_send(); } else { unsigned char *blob, *sigdata; int blob_len, sigdata_len; /* * We have loaded the private key and the server * has announced that it's willing to accept it. * Hallelujah. Generate a signature and send it. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(TRUE); ssh2_pkt_addstring(key->alg->name); blob = key->alg->public_blob(key->data, &blob_len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(blob, blob_len); sfree(blob); /* * The data to be signed is: * * string session-id * * followed by everything so far placed in the * outgoing packet. */ sigdata_len = pktout.length - 5 + 4 + 20; sigdata = smalloc(sigdata_len); PUT_32BIT(sigdata, 20); memcpy(sigdata+4, ssh2_session_id, 20); memcpy(sigdata+24, pktout.data+5, pktout.length-5); blob = key->alg->sign(key->data, sigdata, sigdata_len, &blob_len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(blob, blob_len); sfree(blob); sfree(sigdata); ssh2_pkt_send(); } } else if (method == AUTH_PASSWORD) { /* * We send the password packet lumped tightly together with * an SSH_MSG_IGNORE packet. The IGNORE packet contains a * string long enough to make the total length of the two * packets constant. This should ensure that a passive * listener doing traffic analyis can't work out the length * of the password. * * For this to work, we need an assumption about the * maximum length of the password packet. I think 256 is * pretty conservative. Anyone using a password longer than * that probably doesn't have much to worry about from * people who find out how long their password is! */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("password"); ssh2_pkt_addbool(FALSE); ssh2_pkt_addstring(password); ssh2_pkt_defer(); /* * We'll include a string that's an exact multiple of the * cipher block size. If the cipher is NULL for some * reason, we don't do this trick at all because we gain * nothing by it. */ if (cscipher) { int i, j; ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(); for (i = deferred_len; i <= 256; i += cscipher->blksize) { for (j = 0; j < cscipher->blksize; j++) { char c = (char)random_byte(); ssh2_pkt_addstring_data(&c, 1); } } ssh2_pkt_defer(); } ssh2_pkt_defersend(); } else { c_write("No supported authentication methods left to try!\r\n", 50); logevent("No supported authentications offered. Disconnecting"); ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring("No supported authentication methods available"); ssh2_pkt_addstring("en"); /* language tag */ ssh2_pkt_send(); ssh_state = SSH_STATE_CLOSED; crReturnV; }=m0I>g=xtended but not stderr */ ssh2_pkt_getstring(&data, &length); if (data) { switch (c->type) { case CHAN_MAINSESSION: from_backend(pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA, data, length); break; case CHAN_X11: x11_send(c->u.x11.s, data, length); break; } /* * Enlarge the window again at the remote * side, just in case it ever runs down and * they fail to send us any more data. */ ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_adduint32(length); ssh2_pkt_send(); } } else if (pktin.type == SSH2_MSG_DISCONNECT) { ssh_state = SSH_STATE_CLOSED; logevent("Received disconnect message"); crReturnV; } else if (pktin.type == SSH2_MSG_CHANNEL_REQUEST) { continue; /* exit status et al; ignore (FIXME?) */ } else if (pktin.type == SSH2_MSG_CHANNEL_EOF) { unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ if (c->type == CHAN_X11) { /* * Remote EOF on an X11 channel means we should * wrap up and close the channel ourselves. */ x11_close(c->u.x11.s); sshfwd_close(c); } } else if (pktin.type == SSH2_MSG_CHANNEL_CLOSE) { unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; enum234 e; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ if (c->closes == 0) { ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_send(); } /* Do pre-close processing on the channel. */ switch (c->type) { case CHAN_MAINSESSION: break; /* nothing to see here, move along */ case CHAN_X11: break; } del234(ssh_channels, c); sfree(c->v2.outbuffer); sfree(c); /* * See if that was the last channel left open. */ c = first234(ssh_channels, &e); if (!c) { logevent("All channels closed. Disconnecting"); ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring("All open channels closed"sh_state = SSH_STATE_CLOSED; crReturnV; } continue; /* remote sends close; ignore (FIXME) */ } else if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ mainchan->v2.remwindow += ssh2_pkt_getuint32(); try_send = TRUE; } else if (pktin.type == SSH2_MSG_CHANNEL_OPEN) { char *type; int typelen; char *error = NULL; struct ssh_channel *c; ssh2_pkt_getstring(&type, &typelen); c = smalloc(sizeof(struct ssh_channel)); if (typelen == 3 && !memcmp(type, "x11", 3)) { if (!ssh_X11_fwd_enabled) error = "X11 forwarding is not enabled"; else if ( x11_init(&c->u.x11.s, cfg.x11_display, c) != NULL ) { error = "Unable to open an X11 connection"; } else { c->type = CHAN_X Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3f3cd5b2ef8b79926b96425e335d279 Text-delta-base-sha1: 2508e80ae08f2b049ff08b628d78573f9282d0a8 Text-content-length: 2115 Text-content-md5: fa67282bdea1270b9d35de56c1c548c0 Text-content-sha1: 69715536503f9e0290593cb4b6b6226161bd2100 Content-length: 2155 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNt=z=E)jSY6C~iV mK{D_3Q Bignum p; Bignum q; Bignum iqmp; #endif char *commentconst struct ssh2_cipher *const unsigned char *(*public_blob)(void *key, int *len); unsigned char *(*private_blob)(void *key, int *len); void *(*createkey)(unsigned char *pub_blob, int pub_len, unsigned char *priv_blob, int priv_lenunsigned char *(*sign)(void *key, char *data, int datalen, int *sigstruct ssh2_userkey { const struct ssh_signkey *alg; /* the key algorithm */ void *data; /* the key data */ char *comment; /* the key comment */ }; extern const struct ssh_cipher ssh_3des; extern const struct ssh_cipher ssh_des; extern const struct ssh_cipher ssh_blowfish_ssh1; extern const struct ssh2_ciphers ssh2_3des; extern const struct ssh2_ciphers ssh2_aes; extern const struct ssh2_ciphers ssh2_blowfish; extern const struct ssh_kex ssh_diffiehellman; extern const struct ssh_kex ssh_diffiehellman_gex; extern const struct ssh_signkey ssh_dss; extern const struct ssh_signkey ssh_rsa; extern const struct ssh_mac ssh_md5; extern const struct ssh_mac ssh_sha1; extern const struct ssh_mac ssh_sha1_buggychar *passphrase); int rsakey_encrypted(char *filename, char **comment); int saversakey(char *filename, struct RSAKey *key, char *passphrase); void base64_encode_atom(unsigned char *data, int n, char *out); /* ssh2_load_userkey can return this as an error */ extern struct ssh2_userkey ssh2_wrong_passphrase; #define SSH2_WRONG_PASSPHRASE (&ssh2_wrong_passphrase) int ssh2_userkey_encrypted(char *filename, char **comment); struct ssh2_userkey *ssh2_load_userkey(char *filename, char *passphrase); char *ssh2_userkey_loadpub(char *filename, char **algorithm, int *pub_blob_len); int ssh2_save_userkey(char *filename, struct ssh2_userkey *key, char *passphrase); int keyfile_version(char *filename); void des3_decrypt_pubkey(unsigned char *key, unsigned char *blk, int len); void aes256_encrypt_pubkey(unsigned char *key, unsigned char *blk, int len); void aes256_decrypt_pubkey(unsigned char *key,int bits, Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 567206cfd5c9a8fb58719adf16b57ef0 Text-delta-base-sha1: a0f3970c85854da740dd97cbdfde7dd7c09dd21e Text-content-length: 864 Text-content-md5: 5b77ac032f8c8e4687af632db78bc411 Text-content-sha1: b29148fde5ea185fdde487a1503187d82ef791bf Content-length: 903 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN0D]28c8vsIy~Ny5Q~sSK#2[Uvoid aes256_encrypt_pubkey(unsigned char *key, unsigned char *blk, int len) { AESContext ctx; aes_setup(&ctx, 16, key, 32); memset(ctx.iv, 0, sizeof(ctx.iv)); aes_encrypt_cbc(blk, len, &ctx); } void aes256_decrypt_pubkey(unsigned char *key, unsigned char *blk, int len) { AESContext ctx; aes_setup(&ctx, 16, key, 32); memset(ctx.iv, 0, sizeof(ctx.iv)); aes_decrypt_cbc(blk, len, &ctx); } static constconstconst struct ssh2_cipher ssh_aes256aes256-cbc", 16, 256 }; static const struct ssh2_cipher ssh_rijndaelrijndael128-cbc", 16, 128 }; static const struct ssh2_cipher ssh_rijndaelrijndael192-cbc", 16, 192 }; static const struct ssh2_cipher ssh_rijndael256256-cbc", 16, 256 }; static constconst struct ssh2_cipher *const const Node-path: putty/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e1b4baa9ec042bf03343e0a545c6cd9f Text-delta-base-sha1: 17b4bb866078203502303bb7ce160ff6d03fbb15 Text-content-length: 135 Text-content-md5: 51f4566ede9618f437d79b4ab577bec4 Text-content-sha1: 86dbf19fb1c776cbdfb35ce20e97b277456e44b8 Content-length: 174 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNWu`A AXMUohconst constconst struct ssh2_cipher *const blowfish_list[] = { &ssh_blowfish_ssh2 }; const Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 30ebbd89001efab3f0765a781f741d11 Text-delta-base-sha1: 31321fa12b878a708f7040ddc219d19faba83755 Text-content-length: 231 Text-content-md5: ff2f02b4b3e9ff3d553cce9363492098 Text-content-sha1: 3550a8b743653d7b2a421b26f8ac5ad015dbea26 Content-length: 271 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNQu>83iboconstconst struct ssh2_cipher *const des3_list[] = { &ssh_3des_ssh2 }; const struct ssh2_ciphers ssh2_3des = { sizeof(des3_list) / sizeof(*des3_list), des3_list }; const const Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7902177edd0bbe72f17f5e29b47ccd1f Text-delta-base-sha1: 23395218bea63c8835884244fe68778f01736ad8 Text-content-length: 121 Text-content-md5: 888713ac493bf1fa12944f2ee246b070 Text-content-sha1: 4c133b4e1f79196176789019b568d0073ff4c657 Content-length: 160 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN+hhC\#include "ssh.h" const struct ssh_kex ssh_diffiehellman = { "diffie-hellman-group1-sha1" }; const Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9ddfb1a781a117c1c1f904bd8cdd658e Text-delta-base-sha1: c2cf44572fc80d3d5057e671967ca5587fcf4088 Text-content-length: 1762 Text-content-md5: 8e2c264fabbb835fc4e8230c4f522cb9 Text-content-sha1: 27dddca8db9a0747c4efa2d69c768d24f403b1a0 Content-length: 1802 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN? J#Wh#include #include #include p)+8)/8; qlen = (ssh1_bignum_bitcount(dss->q)+8)/8; glen = (ssh1_bignum_bitcount(dss->g)+8)/8; ylen = (ssh1_bignum_bitcount(dss->y)+8)/8; /* * string "ssh-dss", mpint p, mpint q, mpint g, mpint y. Total * 27 + sum of lengths. (five length fields, 20+7=27). */ bloblen = 27+plen+qlen+glen+ylen; blob = smalloc(bloblen); p = blob; PUT_32BIT(p, 7); p += 4; memcpy(p, "ssh-dss", 7); p += 7; PUT_32BIT(p, plen); p += 4; for (i = plen; i-- ;) *p++ = bignum_byte(dss->p, i); PUT_32BIT(p, qlen); p += 4; for (i = qlen; i-- ;) *p++ = bignum_byte(dss->q, i); PUT_32BIT(p, glen); p += 4; for (i = glen; i-- ;) *p++ = bignum_byte(dss->g, i); PUT_32BIT(p, ylen); p += 4; for (i = ylen; i-- ;) *p++ = bignum_byte(dss->y, i); assert(p == blob + bloblen); *len = bloblen; return blob; } static unsigned char *dss_private_blob(void *key, int *len) { return NULL; /* can't handle DSS private keys */ } static void *dss_createkey(unsigned char *pub_blob, int pub_len, unsigned char *priv_blob, int priv_len) { return NULL; /* can't handle DSS private keys */ } unsigned char *dss_sign(void *key, char *data, int datalen, int *siglen) { return NULL; /* can't handle DSS private keys */ } const struct ssh_signkey ssh_dss = { dss_newkey, dss_freekey, dss_fmtkey, dss_public_blob, dss_private_blob, dss_create Node-path: putty/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7f537391761b73d206e529ffc240ac46 Text-delta-base-sha1: 78c233222238f1ef7eaac95cb97aaf5cc9b83632 Text-content-length: 26 Text-content-md5: dcc29756406c439e976faaf2316e4e6b Text-content-sha1: 02e90ee04b196ad8d429265e19593e23b1742c71 Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNDJ SqSconst Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bab44a40f0e0d994e41ed5a0e2b51fcc Text-delta-base-sha1: 750c3534672c7eaee6626767b771088cf8b150ff Text-content-length: 15970 Text-content-md5: a7c8fa79a61f0a86e1929156c7d29406 Text-content-sha1: cd4b9b82869c0f3dbc3a2a3339893eed086881d3 Content-length: 16009 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN4;'#>UAq bTmkTfNN#include iqmp); if (len-i < 0) goto end; i += ssh1_read_bignum(buf+i, &key->q); if (len-i < 0) goto end; i += ssh1_read_bignum(buf+i, &key->p); if (len-i < 0) goto end;char *passphrasekeykey->iqmp); p += ssh1_write_bignum(p, key->q); p += ssh1_write_bignum(p, key /* ---------------------------------------------------------------------- * SSH2 private key load/store functions. */ /* * PuTTY's own format for SSH2 keys is as follows: * * The file is text. Lines are terminated by CRLF, although CR-only * and LF-only are tolerated on input. * * The first line says "PuTTY-User-Key-File-1: " plus the name of the * algorithm ("ssh-dss", "ssh-rsa" etc. Although, of course, this * being PuTTY, "ssh-dss" is not supported.) * * The next line says "Encryption: " plus an encryption type. * Currently the only supported encryption types are "aes256-cbc" * and "none". * * The next line says "Comment: " plus the comment string. * * Next there is a line saying "Public-Lines: " plus a number N. * The following N lines contain a base64 encoding of the public * part of the key. This is encoded as the standard SSH2 public key * blob (with no initial length): so for RSA, for example, it will * read * * string "ssh-rsa" * mpint exponent * mpint modulus * * Next, there is a line saying "Private-Lines: " plus a number N, * and then N lines containing the (potentially encrypted) private * part of the key. For the key type "ssh-rsa", this will be * composed of * * mpint private_exponent * mpint p (the larger of the two primes) * mpint q (the smaller prime) * mpint iqmp (the inverse of q modulo p) * data padding (to reach a multiple of the cipher block size) * * Finally, there is a line saying "Private-Hash: " plus a hex * representation of a SHA-1 hash of the plaintext version of the * private part, including the final padding. * * If the key is encrypted, the encryption key is derived from the * passphrase by means of a succession of SHA-1 hashes. Each hash * is the hash of: * * uint32 sequence-number * string passphrase * * where the sequence-number increases from zero. As many of these * hashes are used as necessary. */ static int read_header(FILE *fp, char *header) { int len = 39; int c; while (len > 0) { c = fgetc(fp); if (c == '\n' || c == '\r' || c == EOF) return 0; /* failure */ if (c == ':') { c = fgetc(fp); if (c != ' ') return 0; *header = '\0'; return 1; /* success! */ } if (len == 0) return 0; /* failure */ *header++ = c; len--; } return 0; /* failure */ } static char *read_body(FILE *fp) { char *text; int len; int size; int c; size = 128; text = smalloc(size); len = 0; text[len] = '\0'; while (1) { c = fgetc(fp); if (c == '\r' || c == '\n') { c = fgetc(fp); if (c != '\r' && c != '\n' && c != EOF) ungetc(c, fp); return text; } if (c == EOF) { sfree(text); return NULL; } if (len + 1 > size) { size += 128; text = srealloc(text, size); } text[len++] = c; text[len] = '\0'; } } int base64_decode_atom(char *atom, unsigned char *out) { int vals[4]; int i, v, len; unsigned word; char c; for (i = 0; i < 4; i++) { c = atom[i]; if (c >= 'A' && c <= 'Z') v = c - 'A'; else if (c >= 'a' && c <= 'z') v = c - 'a' + 26; else if (c >= '0' && c <= '9') v = c - '0' + 52; else if (c == '+') v = 62; else if (c == '/') v = 63; else if (c == '=') v = -1; else return 0; /* invalid atom */ vals[i] = v; } if (vals[0] == -1 || vals[1] == -1) return 0; if (vals[2] == -1 && vals[3] != -1) return 0; if (vals[3] != -1) len = 3; else if (vals[2] != -1) len = 2; else len = 1; word = ((vals[0] << 18) | (vals[1] << 12) | ((vals[2] & 0x3F) << 6) | (vals[3] & 0x3F)); out[0] = (word >> 16) & 0xFF; if (len > 1) out[1] = (word >> 8) & 0xFF; if (len > 2) out[2] = word & 0xFF; return len; } static char *read_blob(FILE *fp, int nlines, int *bloblen) { unsigned char *blob; char *line; int linelen, len; int i, j, k; /* We expect at most 64 base64 characters, ie 48 real bytes, per line. */ blob = smalloc(48 * nlines); len = 0; for (i = 0; i < nlines; i++) { line = read_body(fp); if (!line) { sfree(blob); return NULL; } linelen = strlen(line); if (linelen % 4 != 0 || linelen > 64) { sfree(blob); sfree(line); return NULL; } for (j = 0; j < linelen; j += 4) { k = base64_decode_atom(line+j, blob+len); if (!k) { sfree(line); sfree(blob); return NULL; } len += k; } sfree(line); } *bloblen = len; return blob; } /* * Magic error return value for when the passphrase is wrong. */ struct ssh2_userkey ssh2_wrong_passphrase = { NULL, NULL, NULL }; struct ssh2_userkey *ssh2_load_userkey(char *filename, char *passphrase) { FILE *fp; char header[40], *b, *comment, *hash; const struct ssh_signkey *alg; struct ssh2_userkey *ret; int cipher, cipherblk; unsigned char *public_blob, *private_blob; int public_blob_len, private_blob_len; int i; ret = NULL; /* return NULL for most errors */ comment = hash = NULL; public_blob = private_blob = NULL; fp = fopen(filename, "rb"); if (!fp) goto error; /* Read the first header line which contains the key type. */ if (!read_header(fp, header) || 0!=strcmp(header, "PuTTY-User-Key-File-1")) goto error; if ((b = read_body(fp)) == NULL) goto error; /* Select key algorithm structure. Currently only ssh-rsa. */ if (!strcmp(b, "ssh-rsa")) alg = &ssh_rsa; else { sfree(b); goto error; } sfree(b); /* Read the Encryption header line. */ if (!read_header(fp, header) || 0!=strcmp(header, "Encryption")) goto error; if ((b = read_body(fp)) == NULL) goto error; if (!strcmp(b, "aes256-cbc")) { cipher = 1; cipherblk = 16; } else if (!strcmp(b, "none")) { cipher = 0; cipherblk = 1; } else { sfree(b); goto error; } sfree(b); /* Read the Comment header line. */ if (!read_header(fp, header) || 0!=strcmp(header, "Comment")) goto error; if ((comment = read_body(fp)) == NULL) goto error; /* Read the Public-Lines header line and the public blob. */ if (!read_header(fp, header) || 0!=strcmp(header, "Public-Lines")) goto error; if ((b = read_body(fp)) == NULL) goto error; i = atoi(b); sfree(b); if ((public_blob = read_blob(fp, i, &public_blob_len)) == NULL) goto error; /* Read the Private-Lines header line and the Private blob. */ if (!read_header(fp, header) || 0!=strcmp(header, "Private-Lines")) goto error; if ((b = read_body(fp)) == NULL) goto error; i = atoi(b); sfree(b); if ((private_blob = read_blob(fp, i, &private_blob_len)) == NULL) goto error; /* Read the Private-Hash header line. */ if (!read_header(fp, header) || 0!=strcmp(header, "Private-Hash")) goto error; if ((hash = read_body(fp)) == NULL) goto error; fclose(fp); fp = NULL; /* * Decrypt the private blob. */ if (cipher) { unsigned char key[40]; SHA_State s; int passlen; if (!passphrase) goto error; if (private_blob_len % cipherblk) goto error; passlen = strlen(passphrase); SHA_Init(&s); SHA_Bytes(&s, "\0\0\0\0", 4); SHA_Bytes(&s, passphrase, passlen); SHA_Final(&s, key+0); SHA_Init(&s); SHA_Bytes(&s, "\0\0\0\1", 4); SHA_Bytes(&s, passphrase, passlen); SHA_Final(&s, key+20); aes256_decrypt_pubkey(key, private_blob, private_blob_len); } /* * Verify the private hash. */ { char realhash[41]; unsigned char binary[20]; SHA_State s; SHA_Simple(private_blob, private_blob_len, binary); for (i = 0; i < 20; i++) sprintf(realhash+2*i, "%02x", binary[i]); if (strcmp(hash, realhash)) { /* An incorrect hash is an unconditional Error if the key is * unencrypted. Otherwise, it means Wrong Passphrase. */ ret = cipher ? SSH2_WRONG_PASSPHRASE : NULL; goto error; } } sfree(hash); /* * Create and return the key. */ ret = smalloc(sizeof(struct ssh2_userkey)); ret->alg = alg; ret->comment = comment; ret->data = alg->createkey(public_blob, public_blob_len, private_blob, private_blob_len); sfree(public_blob); sfree(private_blob); return ret; /* * Error processing. */ error: if (fp) fclose(fp); if (comment) sfree(comment); if (hash) sfree(hash); if (public_blob) sfree(public_blob); if (private_blob) sfree(private_blob); return ret; } char *ssh2_userkey_loadpub(char *filename, char **algorithm, int *pub_blob_len) { FILE *fp; char header[40], *b; const struct ssh_signkey *alg; int cipher, cipherblk; unsigned char *public_blob; int public_blob_len; int i; public_blob = NULL; fp = fopen(filename, "rb"); if (!fp) goto error; /* Read the first header line which contains the key type. */ if (!read_header(fp, header) || 0!=strcmp(header, "PuTTY-User-Key-File-1")) goto error; if ((b = read_body(fp)) == NULL) goto error; /* Select key algorithm structure. Currently only ssh-rsa. */ if (!strcmp(b, "ssh-rsa")) alg = &ssh_rsa; else { sfree(b); goto error; } sfree(b); /* Read the Encryption header line. */ if (!read_header(fp, header) || 0!=strcmp(header, "Encryption")) goto error; if ((b = read_body(fp)) == NULL) goto error; sfree(b); /* we don't care */ /* Read the Comment header line. */ if (!read_header(fp, header) || 0!=strcmp(header, "Comment")) goto error; if ((b = read_body(fp)) == NULL) goto error; sfree(b); /* we don't care */ /* Read the Public-Lines header line and the public blob. */ if (!read_header(fp, header) || 0!=strcmp(header, "Public-Lines")) goto error; if ((b = read_body(fp)) == NULL) goto error; i = atoi(b); sfree(b); if ((public_blob = read_blob(fp, i, &public_blob_len)) == NULL) goto error; fclose(fp); *pub_blob_len = public_blob_len; *algorithm = alg->name; return public_blob; /* * Error processing. */ error: if (fp) fclose(fp); if (public_blob) sfree(public_blob); return NULL; } int ssh2_userkey_encrypted(char *filename, char **commentptr) { FILE *fp; char header[40], *b, *comment; int ret; if (commentptr) *commentptr = NULL; fp = fopen(filename, "rb"); if (!fp) return 0; if (!read_header(fp, header) || 0!=strcmp(header, "PuTTY-User-Key-File-1")) { fclose(fp); return 0; } if ((b = read_body(fp)) == NULL) { fclose(fp); return 0; } sfree(b); /* we don't care about key type here */ /* Read the Encryption header line. */ if (!read_header(fp, header) || 0!=strcmp(header, "Encryption")) { fclose(fp); return 0; } if ((b = read_body(fp)) == NULL) { fclose(fp); return 0; } /* Read the Comment header line. */ if (!read_header(fp, header) || 0!=strcmp(header, "Comment")) { fclose(fp); sfree(b); return 1; } if ((comment = read_body(fp)) == NULL) { fclose(fp); sfree(b); return 1; } if (commentptr) *commentptr = comment; fclose(fp); if (!strcmp(b, "aes256-cbc")) ret = 1; else ret = 0; sfree(b); return ret; } int base64_lines(int datalen) { /* When encoding, we use 64 chars/line, which equals 48 real chars. */ return (datalen+47) / 48; } void base64_encode_atom(unsigned char *data, int n, char *out) { static const char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; unsigned word; word = data[0] << 16; if (n > 1) word |= data[1] << 8; if (n > 2) word |= data[2]; out[0] = base64_chars[(word >> 18) & 0x3F]; out[1] = base64_chars[(word >> 12) & 0x3F]; if (n > 1) out[2] = base64_chars[(word >> 6) & 0x3F]; else out[2] = '='; if (n > 2) out[3] = base64_chars[word & 0x3F]; else out[3] = '='; } void base64_encode(FILE *fp, unsigned char *data, int datalen) { int linelen = 0; char out[4]; int n; while (datalen > 0) { if (linelen >= 64) { linelen = 0; fputc('\n', fp); } n = (datalen < 3 ? datalen : 3); base64_encode_atom(data, n, out); data += n; datalen -= n; fwrite(out, 1, 4, fp); linelen += 4; } fputc('\n', fp); } int ssh2_save_userkey(char *filename, struct ssh2_userkey *key, char *passphrase) { FILE *fp; unsigned char *pub_blob, *priv_blob, *priv_blob_encrypted; int pub_blob_len, priv_blob_len, priv_encrypted_len; int passlen; int cipherblk; int i; char *cipherstr; unsigned char priv_hash[20]; /* * Fetch the key component blobs. */ pub_blob = key->alg->public_blob(key->data, &pub_blob_len); priv_blob = key->alg->private_blob(key->data, &priv_blob_len); if (!pub_blob || !priv_blob) { sfree(pub_blob); sfree(priv_blob); return 0; } /* * Determine encryption details, and encrypt the private blob. */ if (passphrase) { cipherstr = "aes256-cbc"; cipherblk = 16; } else { cipherstr = "none"; cipherblk = 1; } priv_encrypted_len = priv_blob_len + cipherblk - 1; priv_encrypted_len -= priv_encrypted_len % cipherblk; priv_blob_encrypted = smalloc(priv_encrypted_len); memset(priv_blob_encrypted, 0, priv_encrypted_len); memcpy(priv_blob_encrypted, priv_blob, priv_blob_len); /* Create padding based on the SHA hash of the unpadded blob. This prevents * too easy a known-plaintext attack on the last block. */ SHA_Simple(priv_blob, priv_blob_len, priv_hash); assert(priv_encrypted_len - priv_blob_len < 20); memcpy(priv_blob_encrypted + priv_blob_len, priv_hash, priv_encrypted_len - priv_blob_len); /* Now create the _real_ private hash. */ SHA_Simple(priv_blob_encrypted, priv_encrypted_len, priv_hash); if (passphrase) { char key[40]; SHA_State s; passlen = strlen(passphrase); SHA_Init(&s); SHA_Bytes(&s, "\0\0\0\0", 4); SHA_Bytes(&s, passphrase, passlen); SHA_Final(&s, key+0); SHA_Init(&s); SHA_Bytes(&s, "\0\0\0\1", 4); SHA_Bytes(&s, passphrase, passlen); SHA_Final(&s, key+20); aes256_encrypt_pubkey(key, priv_blob_encrypted, priv_encrypted_len); } fp = fopen(filename, "w"); if (!fp) return 0; fprintf(fp, "PuTTY-User-Key-File-1: %s\n", key->alg->name); fprintf(fp, "Encryption: %s\n", cipherstr); fprintf(fp, "Comment: %s\n", key->comment); fprintf(fp, "Public-Lines: %d\n", base64_lines(pub_blob_len)); base64_encode(fp, pub_blob, pub_blob_len); fprintf(fp, "Private-Lines: %d\n", base64_lines(priv_encrypted_len)); base64_encode(fp, priv_blob_encrypted, priv_encrypted_len); fprintf(fp, "Private-Hash: "); for (i = 0; i < 20; i++) fprintf(fp, "%02x", priv_hash[i]); fprintf(fp, "\n"); fclose(fp); return 1; } /* ---------------------------------------------------------------------- * A function to determine which version of SSH to try on a private * key file. Returns 0 on failure, 1 or 2 on success. */ int keyfile_version(char *filename) { FILE *fp; int i; fp = fopen(filename, "r"); if (!fp) return 0; i = fgetc(fp); fclose(fp); if (i == 'S') return 1; /* "SSH PRIVATE KEY FORMAT" etc */ if (i == 'P') /* "PuTTY-User-Key-File" etc */ return 2; return 0; /* unrecognised or EOF */ } Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0d6f1a28524941de50a2d58d589d0267 Text-delta-base-sha1: ad20c0ad7cdad15467f6e0d6fa38ff0fa22f7b66 Text-content-length: 3597 Text-content-md5: df34ea2e022fdabae1bc63f2e1fb9861 Text-content-sha1: d585ee82e9f81d2e08c232d896b8ba03f546711d Content-length: 3637 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNGvgTM'S?9n[[l#include #include // FIXME #include "putty.h" // FIXMEunsigned char *rsa2_public_blob(void *key, int *len) { struct RSAKey *rsa = (struct RSAKey *)key; int elen, mlen, bloblen; int i; unsigned char *blob, *p; elen = (ssh1_bignum_bitcount(rsa->exponent)+8)/8; mlen = (ssh1_bignum_bitcount(rsa->modulus)+8)/8; /* * string "ssh-rsa", mpint exp, mpint mod. Total 19+elen+mlen. * (three length fields, 12+7=19). */ bloblen = 19+elen+mlen; blob = smalloc(bloblen); p = blob; PUT_32BIT(p, 7); p += 4; memcpy(p, "ssh-rsa", 7); p += 7; PUT_32BIT(p, elen); p += 4; for (i = elen; i-- ;) *p++ = bignum_byte(rsa->exponent, i); PUT_32BIT(p, mlen); p += 4; for (i = mlen; i-- ;) *p++ = bignum_byte(rsa->modulus, i); assert(p == blob + bloblen); *len = bloblen; return blob; } static unsigned char *rsa2_private_blob(void *key, int *len) { struct RSAKey *rsa = (struct RSAKey *)key; int dlen, plen, qlen, ulen, bloblen; int i; unsigned char *blob, *p; dlen = (ssh1_bignum_bitcount(rsa->private_exponent)+8)/8; plen = (ssh1_bignum_bitcount(rsa->p)+8)/8; qlen = (ssh1_bignum_bitcount(rsa->q)+8)/8; ulen = (ssh1_bignum_bitcount(rsa->iqmp)+8)/8; /* * mpint private_exp, mpint p, mpint q, mpint iqmp. Total 16 + * sum of lengths. */ bloblen = 16+dlen+plen+qlen+ulen; blob = smalloc(bloblen); p = blob; PUT_32BIT(p, dlen); p += 4; for (i = dlen; i-- ;) *p++ = bignum_byte(rsa->private_exponent, i); PUT_32BIT(p, plen); p += 4; for (i = plen; i-- ;) *p++ = bignum_byte(rsa->p, i); PUT_32BIT(p, qlen); p += 4; for (i = qlen; i-- ;) *p++ = bignum_byte(rsa->q, i); PUT_32BIT(p, ulen); p += 4; for (i = ulen; i-- ;) *p++ = bignum_byte(rsa->iqmp, i); assert(p == blob + bloblen); *len = bloblen; return blob; } static void *rsa2_createkey(unsigned char *pub_blob, int pub_len, unsigned char *priv_blob, int priv_len) { struct RSAKey *rsa; char *pb = (char *)priv_blob; rsa = rsa2_newkey((char *)pub_blob, pub_len); rsa->private_exponent = getmp(&pb, &priv_len); rsa->p = getmp(&pb, &priv_len); rsa->q = getmp(&pb, &priv_len); rsa->iqmp = getmp(&pb, &priv_len); return rsaunsigned char *rsa2_sign(void *key, char *data, int datalen, int *siglen) { struct RSAKey *rsa = (struct RSAKey *)key; unsigned char *bytes; int nbytes; unsigned char hash[20]; Bignum in, out; int i, j; SHA_Simple(data, datalen, hash); nbytes = (ssh1_bignum_bitcount(rsa->modulus)-1) / 8; bytes = smalloc(nbytes); bytes[0] = 1; for (i = 1; i < nbytes-20-sizeof(asn1_weird_stuff); i++) bytes[i] = 0xFF; for (i = nbytes-20-sizeof(asn1_weird_stuff), j=0; i < nbytes-20; i++,j++) bytes[i] = asn1_weird_stuff[j]; for (i = nbytes-20, j=0; i < nbytes; i++,j++) bytes[i] = hash[j]; in = bignum_from_bytes(bytes, nbytes); sfree(bytes); out = modpow(in, rsa->private_exponent, rsa->modulus); freebn(in); nbytes = (ssh1_bignum_bitcount(out)+7)/8; bytes = smalloc(4+7+4+nbytes); PUT_32BIT(bytes, 7); memcpy(bytes+4, "ssh-rsa", 7); PUT_32BIT(bytes+4+7, nbytes); for (i = 0; i < nbytes; i++) bytes[4+7+4+i] = bignum_byte(out, nbytes-1-i); freebn(out); *siglen = 4+7+4+nbytes; return bytes; } const struct ssh_signkey ssh_rsa = { rsa2_newkey, rsa2_freekey, rsa2_fmtkey, rsa2_public_blob, rsa2_private_blob, rsa2_create Node-path: putty/sshrsag.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ecccd62a87dd85c21077b5a4c608d92f Text-delta-base-sha1: 6484b67644b2fcec9caa1884775dcdd43615767b Text-content-length: 346 Text-content-md5: 4fd284401d26db3f5b426c16f87a8d5f Text-content-sha1: c04c299bee7aa5ebbcc95ef3d95f3d3b6a178c83 Content-length: 385 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNj$*1R_EvVn_hF5vint bits,key->p = primegen(bits/2, RSA_EXPONENT, 1, 1, pfn, pfnparam); keykey->p, key->q) < 0) { Bignum t = key->p; key->p = key->q; keykey->p, key->q); pfn(pfnparam, 3, 2); pm1 = copybn(key->p); decbn(pm1); qm1 = copybn(keykey->iqmp = modinv(key->q, key Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f3c2b5689425ef30518c8bfec3dba35b Text-delta-base-sha1: bfb503c25a3af867e4cbe5b5276639efd6ec9f36 Text-content-length: 38 Text-content-md5: 72eef2e5146cc0a821b2fa55c0c6d076 Text-content-sha1: 013dfa2754c046fc5a4caf0dd6c8481be2bd6afd Content-length: 77 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNYe XxX Pconst const Revision-number: 974 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 Oops - fix silly segfault in new puttygen K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-03T12:05:36.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dcefd569d8138cf7ca01600c10c080a8 Text-delta-base-sha1: 33b168c7e57f47fb63d6655823cb683ff400b9b8 Text-content-length: 215 Text-content-md5: a93734066363394ec329f04cecd0da81 Text-content-sha1: 03828dac5db30acce4c7702e2d2a8b44647f78b8 Content-length: 255 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN a;$; { state->ssh2key.data = &state->key; state->ssh2key.alg = &ssh_rsa; state->commentptr = &state->ssh2key.comment; } else { state->commentptr = &state->key.comment; } Revision-number: 975 Prop-content-length: 352 Content-length: 352 K 8 svn:date V 27 2001-03-03T13:53:44.000000Z K 7 svn:log V 251 The authentication diagnostics in SSH2 should now be better. Additionally, the ability to switch usernames if you mistype the first one has been restored (although it didn't actually work because OpenSSH didn't feel like playing; patch submitted :-). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4a8cc6dd51e430b7fe8436b0ab39fdf4 Text-delta-base-sha1: b76360e1dba560a4649cc3428f8b0ef502ac40f0 Text-content-length: 14751 Text-content-md5: e5e2108ecbf8ee9236b61d3e06b2deed Text-content-sha1: 9aa9742496173cb94a995dfe39c532d1e6463afe Content-length: 14792 K 15 cvs2svn:cvs-rev V 5 1.106 PROPS-END SVNo'~BRxGwYr8@b!}ys&$%tk%<'b' nQuQ0O dQ0tjN0R|~2Yo=q^r@vlF?6(hy/-static void c_write_str (char *buf) { c_write(buf, strlen(buf)_str("AES not supported in SSH1, falling back to 3DES\r\n"_str("Selected cipher not supported, falling back to 3DES\r\n"_str("login as: "_str("\b \b"); pos--; } break; case 21: case 27: while (pos > 0) { c_write_str("\b \b"_str("\r\n"_str(userlog_str("Authenticated using RSA key \""_str("\" from agent\r\n"_str("TIS authentication refused.\r\n"_str("CryptoCard authentication refused.\r\n"_str("Trying public key authentication.\r\n"_str("No passphrase required.\r\n"_str(prompt_str("\r\n"_str("Couldn't load public key from "); c_write_str(cfg.keyfile); c_write_str(".\r\n" if (i == -1) { c_write_str("Wrong passphrase.\r\n"_str("Server refused our public key.\r\n"_str("Failed to authenticate with our public key.\r\n"_str("Access denied\r\n"_str("Server refused to allocate pty\r\n"_str("Server refused to compress\r\n"enum { AUTH_TYPE_NONE, AUTH_TYPE_PUBLICKEY, AUTH_TYPE_PUBLICKEY_OFFER_LOUD, AUTH_TYPE_PUBLICKEY_OFFER_QUIET, AUTH_TYPE_PASSWORD } type; static int gotit, need_pw, can_pubkey, can_passwd, tried_pubkey_config; static int we_are_inWe repeat this whole loop, including the username prompt, * until we manage a successful authentication. If the user * types the wrong _password_, they are sent back to the * beginning to try another username. (If they specify a * username in the config, they are never asked, even if they * do give a wrong password.) * * I think this best serves the needs of * * - the people who have no configuration, no keys, and just * want to try repeated (username,password) pairs until they * type both correctly * * - people who have keys and configuration but occasionally * need to fall back to passwords * * - people with a key held in Pageant, who might not have * logged in to a particular machine before; so they want to * type a username, and then _either_ their key will be * accepted, _or_ they will type a password. If they mistype * the username they will want to be able to get back and * retype it! */ do { static int pos; static char c; /* * Get a username. */ pos = 0; if ((flags & FLAG_INTERACTIVE) && !*cfg.username) { c_write_str("login as: "_str("\b \b"); pos--; } break; case 21: case 27: while (pos > 0) { c_write_str("\b \b" _str("\r\n"_str(stuff); } } /* * Send an authentication request using method "none": (a) * just in case it succeeds, and (b) so that we know what * authentication methods we can usefully try next. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("none"); /* method */ ssh2_pkt_send(); type = AUTH_TYPE_NONE; gotit = FALSE; we_are_in = FALSE; tried_pubkey_config = FALSE; while (1) { /* * Wait for the result of the last authentication request. */ if (!gotit) crWaitUntilV(ispkt); while (pktin.type == SSH2_MSG_USERAUTH_BANNER) { /* FIXME: should support this */ crWaitUntilV(ispkt); } if (pktin.type == SSH2_MSG_USERAUTH_SUCCESS) { logevent("Access granted"); we_are_in = TRUE; break; } if (pktin.type != SSH2_MSG_USERAUTH_FAILURE) { bombout(("Strange packet received during authentication: type %d", pktin.type)); } gotit = FALSE; /* * OK, we're now sitting on a USERAUTH_FAILURE message, so * we can look at the string in it and know what we can * helpfully try next. */ { char *methods; int methlen; ssh2_pkt_getstring(&methods, &methlen); if (!ssh2_pkt_getbool()) { /* * We have received an unequivocal Access * Denied. This can translate to a variety of * messages: * * - if we'd just tried "none" authentication, * it's not worth printing anything at all * * - if we'd just tried a public key _offer_, * the message should be "Server refused our * key" (or no message at all if the key * came from Pageant) * * - if we'd just tried anything else, the * message really should be "Access denied". * * Additionally, if we'd just tried password * authentication, we should break out of this * whole loop so as to go back to the username * prompt. */ if (type == AUTH_TYPE_NONE) { /* do nothing */ } else if (type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD || type == AUTH_TYPE_PUBLICKEY_OFFER_QUIET) { if (type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD) c_write_str("Server refused our key\r\n"); logevent("Server refused public key"); } else { c_write_str("Access denied\r\n"); logevent("Access denied"); if (type == AUTH_TYPE_PASSWORD) { we_are_in = FALSE; break; } } } else { c_write_str("Further authentication required\r\n"); logevent("Further authentication required"); } can_pubkey = in_commasep_string("publickey", methods, methlen); can_passwd = in_commasep_string("password", methods, methlen); } method = 0; unsigned char *pub_blob; char *algorithm, *comment; int pub_blob_len; tried_pubkey_config = TRUE; /* * Try the public key supplied in the configuration. * * First, offer the public blob to see if the server is * willing to accept it. */ pub_blob = ssh2_userkey_loadpub(cfg.keyfile, &algorithm, &pub_blob_len); if (pub_blob) { ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey");/* method */ ssh2_pkt_addbool(FALSE); /* no signature included */ ssh2_pkt_addstring(algorithm); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pub_blob, pub_blob_len); ssh2_pkt_send(); logevent("Offered public key"); /* FIXME */ crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) { gotit = TRUE; type = AUTH_TYPE_PUBLICKEY_OFFER_LOUD; continue; /* key refused; give up on it */ } logevent("Offer of public key accepted"); /* * Actually attempt a serious authentication using * the key. */ if (ssh2_userkey_encrypted(cfg.keyfile, &comment)) { sprintf(pwprompt, "Passphrase for key \"%.100s\": ", comment); need_pw = TRUE; } else { need_pw = FALSE; } c_write_str("Authenticating with public key \""); c_write_str(comment); c_write_str("\"\r\n"); method = AUTH_PUBLICKEY_FILE; } } if (!method && can_passwd) { method = AUTH_PASSWORD; sprintf(pwprompt, "%.90s@%.90s's password: ", username, savedhost); need_pw = TRUE; } if (need_pw) { if (ssh_get_password) { if (!ssh_get_password(pwprompt, password, sizeof(password))) { /* * get_password failed to get a password (for * example because one was supplied on the command * line which has already failed to work). * Terminate. */ logevent("No more passwords to try"); ssh_state = SSH_STATE_CLOSED; crReturnV; } } else { static int pos = 0; static char c; c_write_str(pwprompt); ssh_send_ok = 1; pos = 0; while (pos >= 0) { crWaitUntilV(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: password[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) pos--; break; case 21: case 27: pos = 0; break; case 3: case 4: random_save_seed(); exit(0); break; default: if (((c >= ' ' && c <= '~') || ((unsigned char)c >= 160)) && pos < 40) password[pos++] = c; break; } } c_write_str("\r\n"); } } if (method == AUTH_PUBLICKEY_FILE) { /* * We have our passphrase. Now try the actual authentication. */ struct ssh2_userkey *key; key = ssh2_load_userkey(cfg.keyfile, password); if (key == SSH2_WRONG_PASSPHRASE || key == NULL) { if (key == SSH2_WRONG_PASSPHRASE) { c_write_str("Wrong passphrase\r\n"); tried_pubkey_config = FALSE; } else { c_write_str("Unable to load private key\r\n"); tried_pubkey_config = TRUE; } /* Send a spurious AUTH_NONE to return to the top. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("none"); /* method */ ssh2_pkt_send(); type = AUTH_TYPE_NONE; } else { unsigned char *blob, *sigdata; int blob_len, sigdata_len; /* * We have loaded the private key and the server * has announced that it's willing to accept it. * Hallelujah. Generate a signature and send it. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(TRUE); ssh2_pkt_addstring(key->alg->name); blob = key->alg->public_blob(key->data, &blob_len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(blob, blob_len); sfree(blob); /* * The data to be signed is: * * string session-id * * followed by everything so far placed in the * outgoing packet. */ sigdata_len = pktout.length - 5 + 4 + 20; sigdata = smalloc(sigdata_len); PUT_32BIT(sigdata, 20); memcpy(sigdata+4, ssh2_session_id, 20); memcpy(sigdata+24, pktout.data+5, pktout.length-5); blob = key->alg->sign(key->data, sigdata, sigdata_len, &blob_len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(blob, blob_len); sfree(blob); sfree(sigdata); ssh2_pkt_send(); type = AUTH_TYPE_PUBLICKEY; } } else if (method == AUTH_PASSWORD) { /* * We send the password packet lumped tightly together with * an SSH_MSG_IGNORE packet. The IGNORE packet contains a * string long enough to make the total length of the two * packets constant. This should ensure that a passive * listener doing traffic analyis can't work out the length * of the password. * * For this to work, we need an assumption about the * maximum length of the password packet. I think 256 is * pretty conservative. Anyone using a password longer than * that probably doesn't have much to worry about from * people who find out how long their password is! password"); ssh2_pkt_addbool(FALSE); ssh2_pkt_addstring(password); ssh2_pkt_defer(); /* * We'll include a string that's an exact multiple of the * cipher block size. If the cipher is NULL for some * reason, we don't do this trick at all because we gain * nothing by it. */ if (cscipher) { int i, j; ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(); for (i = deferred_len; i <= 256; i += cscipher->blksize) { for (j = 0; j < cscipher->blksize; j++) { char c = (char)random_byte(); ssh2_pkt_addstring_data(&c, 1); } } ssh2_pkt_defer(); } ssh2_pkt_defersend(); type = AUTH_TYPE_PASSWORD; } else { c_write_str("No supported authentication methods left to try!\r\n"); logevent("No supported authentications offered. Disconnecting"); ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring("No supported authentication methods available"); ssh2_pkt_addstring("en"); /* language tag */ ssh2_pkt_send(); ssh_state = SSH_STATE_CLOSED; crReturnV; } } } while (!we_are_in);_str("Server refused to allocate pty\r\n"); ssh_edimR];[)-"mting = ssh_echoing = 1; } else { logevent("Allocated pty"); } } else { ssh_editing = ssh_echoing = 1; } /* * Start a shell or a remote command. */ ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(mainchan->remoteid); /* recipient channel */ if (cfg.ssh_subsys) { ssh2_pkt_addstring("subsystem"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addstring(cfg.remote_cmd); } else if (*cfg.remote_cmd) { ssh2_pkt_addstring("exec"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addstring(cfg.remote_cmd); } else { ssh2_pkt_addstring("shell"); ssh2_pkt_addbool(1); /* want reply */ } ssh2_pkt_send(); do { crWaitUntilV(ispkt); if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ c->v2.remwindow += ssh2_pkt_getuint32(); } } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Server got confused by shell/command request")); crReturnV; } bombout(("Server refused to start a shell/command")); crReturnV; } else { logevent("Started a shell/command"); } ssh_state = SSH_STATE_SESSION; if (size_needed) ssh_size(); if (eof_needed) ssh_special(TS_EOF); /* * Transfer data! */ ldisc_send(NULL, 0); /* cause ldisc to notice changes */ ssh_send_ok = 1; while (1) { static int try_send; crReturnV; try_send = FALSE; if (ispkt) { if (pktin.type == SSH2_MSG_CHANNEL_DATA || pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA) { char *data; int length;pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA && ssh2_pkt_getuint32() != SSH2_EXTENDED_DATA_STDERR) continue; /* e Revision-number: 976 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2001-03-03T15:31:35.000000Z K 7 svn:log V 49 Add support for the OpenSSH SSH2 agent protocol. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a957b117ab97901725bbda804b15ee8a Text-delta-base-sha1: a7b31db815dda828c51b3a97baaf5c90de940715 Text-content-length: 10179 Text-content-md5: 43696d5aa36b9b6f38447a9409b5a4aa Text-content-sha1: bfa1ee42e040d20a7df1ed79d620592f79eae87f Content-length: 10219 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNsn<k1+!10[)I{>lw8v/GG HqYwK'rAp3{&UjULO6FN4ux>S&v>U\&DD(:2 g2A_&x rr~XGv"7oT$>WL}(_(Kputty.h" // FIXME/* * SSH1 agent messages. */ #define SSH1_AGENTC_REQUEST_RSA_IDENTITIES 1 #define SSH1_AGENT_RSA_IDENTITIES_ANSWER 2 #define SSH1_AGENTC_RSA_CHALLENGE 3 #define SSH1_AGENT_RSA_RESPONSE 4 #define SSH1_AGENTC_ADD_RSA_IDENTITY 7 #define SSH1_AGENTC_REMOVE_RSA_IDENTITY 8 #define SSH1_AGENTC_REMOVE_ALL_RSA_IDENTITIES 9 /* openssh private? */ /* * Messages common to SSH1 and OpenSSH's SSH2. */ #define SSH_AGENT_FAILURE 5 #define SSH_AGENT_SUCCESS 6 /* * OpenSSH's SSH2 agent messages. */ #define SSH2_AGENTC_REQUEST_IDENTITIES 11 #define SSH2_AGENT_IDENTITIES_ANSWER 12 #define SSH2_AGENTC_SIGN_REQUEST 13 #define SSH2_AGENT_SIGN_RESPONSE 14 #define SSH2_AGENTC_ADD_IDENTITY 17 #define SSH2_AGENTC_REMOVE_IDENTITY 18 #define SSH2_AGENTC_REMOVE_ALL_IDENTITIES 19, *ssh2 * and the signing functions, which are deterministic, this should * never be called. * Blob structure for passing to the asymmetric SSH2 key compare * function, prototyped here. */ struct blob { unsigned char *blob; int len; }; static int cmpkeys_ssh2_asymm(void *av, void *bv); /* * Centre the window. */ { /* centre the window */ RECT rs, rd; HWND hw; hw = GetDesktopWindow(); if (GetWindowRect (hw, &rs) && GetWindowRect (hwnd, &rd)) MoveWindow (hwnd, (rs.right + rs.left + rd.left - rd.right)/2, (rs.bottom + rs.top + rd.top - rd.bottom)/2, rd.right-rd.left, rd.bottom-rd.top, TRUE); } rkey; struct ssh2_userkey *srkey = first234(rsakeys, &e); rkey; r strcpy(listentry, "ssh1\t"); p = listentry+strlen(listentry); rsa_fingerprint(p, sizeof(listentry)-(p-listentry), rfor (skey = first234(ssh2keys, &e); skey; skey = next234(&e)) { char listentry[512], *p; int len p = skey->alg->fingerprint(skey->data); strncpy(listentry, p, sizeof(listentry) len = strlen(listentry); if (len < sizeof(listentry)-2) { listentry[len] = '\t'; strncpy(listentry+len+1, skey->comment, sizeof(listentry)-len-1); }rkey; struct ssh2_userkey *s int ver; ver = keyfile_version(filename); if (verreturn; } if (ver == 1) needs_pass = rsakey_encrypted(filename, &comment); else needs_pass = ssh2_userkey_encrypted(filename, &comment); attempts = 0; if (ver == 1) rkey = smalloc(sizeof(*rif (ver == 1) sfree(r if (ver == 1) ret = loadrsakey(filename, rkey, passphrase); else { skey = ssh2_load_userkey(filename, passphrase); if (skey == SSH2_WRONG_PASSPHRASE) ret = -1; else if (!skey) ret = 0; else ret = 1; }if (ver == 1) sfree(rkey); return; } if (ver == 1) { if (add234(rsakeys, rkey) != rkey) sfree(rkey); /* already present, don't waste RAM */ } else { if (add234(ssh2keys, skey) != skey) { skey->alg->freekey(skey->data); sfree(skey); /* already present, don't waste RAM */ } }1_AGENTC_REQUEST_RSA_IDENTITIES: /* * Reply with SSH112_AGENTC_REQUEST_IDENTITIES: /* * Reply with SSH2_AGENT_IDENTITIES_ANSWER. */ { enum234 e; struct ssh2_userkey *key; int len, nkeys; unsigned char *blob; int bloblenssh2 blob = key->alg->public_blob(key->data, &bloblen); len += bloblen; sfree(blob2_AGENTssh2keys, &e); key; key = next234(&e)) { blob = key->alg->public_blob(key->data, &bloblen); PUT_32BIT(p, bloblen); p += 4; memcpy(p, blob, bloblen); p += bloblen; sfree(blob1_AGENTC_RSA_CHALLENGE: /* * Reply with either SSH11_AGENT_RSA_RESPONSE; memcpy(ret+5, response_md5, 16); } break; case SSH2_AGENTC_SIGN_REQUEST: /* * Reply with either SSH2_AGENT_RSA_RESPONSE or * SSH_AGENT_FAILURE, depending on whether we have that key * or not. */ { struct ssh2_userkey *key; struct blob b; unsigned char *data, *signature; int datalen, siglen, len; b.len = GET_32BIT(p); p += 4; b.blob = p; p += b.len; datalen = GET_32BIT(p); p += 4; data = p; key = find234(ssh2keys, &b, cmpkeys_ssh2_asymm); if (!key) goto failure; signature = key->alg->sign(key->data, data, datalen, &siglen); len = 5+4+siglen; PUT_32BIT(ret, len-4); ret[4] = SSH2_AGENT_SIGN_RESPONSE; PUT_32BIT(ret+5, siglen); memcpy(ret+5+4, signature, siglen); sfree(signature); } break; case SSH1key->iqmp); /* p^-1 mod q */ p += ssh1_read_bignum(p, key->p); /* p */ p += ssh1_read_bignum(p, key->q2_AGENTC_ADDssh2_userkey *key; char *comment, *alg; int alglen, commlen; int bloblen; key = smalloc(sizeof(struct ssh2_userkey)); alglen = GET_32BIT(p); p += 4; alg = p; p += alglen; /* Add further algorithm names here. */ if (alglen == 7 && !memcmp(alg, "ssh-rsa", 7)) key->alg = &ssh_rsa; else { sfree(key); goto failure; } bloblen = GET_32BIT((unsigned char *)msg) - (p-(unsigned char *)msg-4); key->data = key->alg->openssh_createkey(&p, &bloblen); if (!key->data) { sfree(key); goto failure; } commlen = GET_32BIT(p); p += 4; comment = smalloc(commlen+1); if (comment) { memcpy(comment, p, commlen); comment[commlen] = '\0'; } key->comment = comment; ssh2 key->alg->freekey(key->data); sfree(key->comment); sfree(key); } } break; case SSH1 sfree(key); ret[4] = SSH_AGENT_SUCCESS; } } break; case SSH2_AGENTC_REMOVEssh2_userkey *key; struct blob b; b.len = GET_32BIT(p); p += 4; b.blob = p; p += b.len; key = find234(ssh2keys, &b, cmpkeys_ssh2_asymm); if (!key) goto failure; ssh2keys, key); keylist_update(); key->alg->freekey(key->data); sfree(key); ret[4] = SSH_AGENT_SUCCESS; } } break; case SSH1_AGENTC_REMOVE_ALL_RSA_IDENTITIES: /* * Remove all SSH1 keys. Always returns success. */ { struct RSAKey *rkey; enum234 e; while ( (rkey = first234(rsakeys, &e)) != NULL ) { del234(rsakeys, rkey); freersakey(rkey); sfree(rkey); } keylist_update(); PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_SUCCESS; } break; case SSH2_AGENTC_REMOVE_ALL_IDENTITIES: /* * Remove all SSH2 keys. Always returns success. */ { struct ssh2_userkey *skey; enum234 e; while ( (skey = first234(ssh2keys, &e)) != NULL ) { del234(ssh2keys, skey); skey->alg->freekey(skey->data); sfree(skey); } keylist_update(); PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_SUCCESS;_rsa/* * Key comparison function for the 2-3-4 tree of SSH2 keys. */ static int cmpkeys_ssh2(void *av, void *bv) { struct ssh2_userkey *a = (struct ssh2_userkey *)av; struct ssh2_userkey *b = (struct ssh2_userkey *)bv; int i; int alen, blen; unsigned char *ablob, *bblob; int c; /* * Compare purely by public blob. */ ablob = a->alg->public_blob(a->data, &alen); bblob = b->alg->public_blob(b->data, &blen); c = 0; for (i = 0; i < alen && i < blen; i++) { if (ablob[i] < bblob[i]) { c = -1; break; } else if (ablob[i] > bblob[i]) { c = +1; break; } } if (c == 0 && i < alen) c = +1; /* a is longer */ if (c == 0 && i < blen) c = -1; /* a is longer */ sfree(ablob); sfree(bblob); return c; } /* * Key comparison function for looking up a blob in the 2-3-4 tree * of SSH2 keys. */ static int cmpkeys_ssh2_asymm(void *av, void *bv) { struct blob *a = (struct blob *)av; struct ssh2_userkey *b = (struct ssh2_userkey *)bv; int i; int alen, blen; unsigned char *ablob, *bblob; int c; /* * Compare purely by public blob. */ ablob = a->blob; alen = a->len; bblob = b->alg->public_blob(b->data, &blen); c = 0; for (i = 0; i < alen && i < blen; i++) { if (ablob[i] < bblob[i]) { c = -1; break; } else if (ablob[i] > bblob[i]) { c = +1; break; } } if (c == 0 && i < alen) c = +1; /* a is longer */ if (c == 0 && i < blen) c = -1; /* a is longer */ sfree(bblob); return crkey; struct ssh2_userkey *skey; switch (msg) { case WM_INITDIALOG: /* * Centre the window. */ { /* centre the window */ RECT rs, rd; HWND hw; hw = GetDesktopWindow(); if (GetWindowRect (hw, &rs) && GetWindowRect (hwnd, &rd)) MoveWindow (hwnd, (rs.right + rs.left + rd.left - rd.right)/2, (rs.bottom + rs.top + rd.top - rd.bottom)/2, rd.right-rd.left, rd.bottom-rd.top, TRUE); } keylist = hwnd; { static int tabs[] = {35, 60, 210}; SendDlgItemMessage (hwnd, 100, LB_SETTABSTOPS, sizeof(tabs)/sizeof(*tabs), rkey = first234(rsakeys, &e); rkey; rkey = next234(&e)) if (n-- == 0) break; if (rkey) { del234(rsakeys, rkey); freersakey(rkey); sfree(rkey); } else { for (skey = first234(ssh2keys, &e); skey; skey = next234(&e)) if (n-- == 0) break; if (skey) { del234(ssh2keys, skey); skey->alg->freekey(skey->data); sfree(skey); } }_rsa); ssh2keys = newtree234(cmpkeys_ssh2); /* * Process the command line and add Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aec58f36590b718d72b5eb1b6272c9f6 Text-delta-base-sha1: 77dda8f22858d6c30b4c819adc8a06ea83f0fcf5 Text-content-length: 140 Text-content-md5: 7f58dbd1568b277151aea4b6e1af671a Text-content-sha1: 411c15f52d6960d13bec59ba80c46077f5f1a91f Content-length: 179 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN>>kLMkah 433175, 162, 60, 14 PUSHBUTTON "&Remove Key", 102, 195, 162, 60, 14 DEFPUSHBUTTON "&Close", IDOK, 27 Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fa67282bdea1270b9d35de56c1c548c0 Text-delta-base-sha1: 69715536503f9e0290593cb4b6b6226161bd2100 Text-content-length: 75 Text-content-md5: bdbde9dd7930456afdb710e113741404 Text-content-sha1: 02585a8f718ebda2eba2b6668f1c4770a0391220 Content-length: 115 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNt4 6i void *(*openssh_createkey)(unsigned char **blob, int * Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8e2c264fabbb835fc4e8230c4f522cb9 Text-delta-base-sha1: 27dddca8db9a0747c4efa2d69c768d24f403b1a0 Text-content-length: 95 Text-content-md5: 1fbac8cdf48ebd130e24034cfe898bc4 Text-content-sha1: 9c2ebf5dfdd1072778fbc1a1a1d049d161376f9a Content-length: 135 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN @E/nh^Bstatic void *dss_openssh_createkey(unsigned char **blob, int *openssh Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: df34ea2e022fdabae1bc63f2e1fb9861 Text-delta-base-sha1: d585ee82e9f81d2e08c232d896b8ba03f546711d Text-content-length: 756 Text-content-md5: 2c77aebd152fab065d9fa3c298de947d Text-content-sha1: 32efdac2b790ba31a1ac846f4699182330aaace9 Content-length: 796 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNv|Q{A2wbslen != 7void *rsa2_openssh_createkey(unsigned char **blob, int *len) { char **b = (char **)blob; struct RSAKey *rsa; char *p; int slen; rsa = smalloc(sizeof(struct RSAKey)); if (!rsa) return NULL; rsa->comment = NULL; rsa->modulus = getmp(b, len); rsa->exponent = getmp(b, len); rsa->private_exponent = getmp(b, len); rsa->iqmp = getmp(b, len); rsa->p = getmp(b, len); rsa->q = getmp(b, len); if (!rsa->modulus || !rsa->exponent || !rsa->private_exponent || !rsa->iqmp || !rsa->p || !rsa->q) { sfree(rsa->modulus); sfree(rsa->exponent); sfree(rsa->private_exponent); sfree(rsa->iqmp); sfree(rsa->p); sfree(rsa->q); sfree(rsa); return NULL; }openssh Revision-number: 977 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2001-03-03T15:56:39.000000Z K 7 svn:log V 45 SSH2 can now use Pageant to obtain keys from K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 43696d5aa36b9b6f38447a9409b5a4aa Text-delta-base-sha1: bfa1ee42e040d20a7df1ed79d620592f79eae87f Text-content-length: 23 Text-content-md5: 223d6ca751e6b28398e795267b559973 Text-content-sha1: 446fde137eea04d6f298df7302fc6a3041afd696 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNnA 8 e Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e5e2108ecbf8ee9236b61d3e06b2deed Text-delta-base-sha1: 9aa9742496173cb94a995dfe39c532d1e6463afe Text-content-length: 5622 Text-content-md5: 31dfedb2819d1ce15c76722120b9b30f Text-content-sha1: 65ee7ea696e13daa8cbcc15cce6dff6f89b4d28d Content-length: 5663 K 15 cvs2svn:cvs-rev V 5 1.107 PROPS-END SVNF@I#Ruz jOHJ/B5:nF#111; static int tried_pubkey_config, tried_agent tried_agentagent_exists && !tried_agent) { /* * Attempt public-key authentication using Pageant. */ static unsigned char request[5], *response, *p; static int responselen; static int i, nkeys; static int authed = FALSE; void *r; tried_agent = TRUE; logevent("Pageant is running. Requesting keys."); /* Request the keys held by the agent. */ PUT_32BIT(request, 1); request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; agent_query(request, 5, &r, &responselen); response = (unsigned char *)r; if (response) { p = response + 5; nkeys = GET_32BIT(p); p += 4; { char buf[64]; sprintf(buf, "Pageant has %d keys", nkeys); logevent(buf); } for (i = 0; i < nkeys; i++) { static char *pkblob, *alg, *commentp; static int pklen, alglen, commentlen; static int siglen, retlen, len; static char *q, *agentreq, *ret; { char buf[64]; sprintf(buf, "Trying Pageant key #%d", i); logevent(buf); } pklen = GET_32BIT(p); p += 4; pkblob = p; p += pklen; alglen = GET_32BIT(pkblob); alg = pkblob + 4; commentlen = GET_32BIT(p); p += 4; commentp = p; p += commentlen; ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection");/* service requested */ ssh2_pkt_addstring("publickey");/* method */ ssh2_pkt_addbool(FALSE); /* no signature included */ ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(alg, alglen); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pkblob, pklen); ssh2_pkt_send(); crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) { logevent("Key refused"); continue; } c_write_str("Authenticating with public key \""); c_write(commentp, commentlen); c_write_str("\" from agent\r\n"); /* * Server is willing to accept the key. * Construct a SIGN_REQUEST. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(TRUE); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(alg, alglen); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pkblob, pklen); siglen = pktout.length - 5 + 4 + 20; len = 1; /* message type */ len += 4 + pklen; /* key blob */ len += 4 + siglen; /* data to sign */ len += 4; /* flags */ agentreq = smalloc(4 + len); PUT_32BIT(agentreq, len); q = agentreq + 4; *q++ = SSH2_AGENTC_SIGN_REQUEST; PUT_32BIT(q, pklen); q += 4; memcpy(q, pkblob, pklen); q += pklen; PUT_32BIT(q, siglen); q += 4; /* Now the data to be signed... */ PUT_32BIT(q, 20); q += 4; memcpy(q, ssh2_session_id, 20); q += 20; memcpy(q, pktout.data+5, pktout.length-5); q += pktout.length-5; /* And finally the (zero) flags word. */ PUT_32BIT(q, 0); agent_query(agentreq, len+4, &ret, &retlen); sfree(agentreq); if (ret) { if (ret[4] == SSH2_AGENT_SIGN_RESPONSE) { logevent("Sending Pageant's response"); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(ret+9, GET_32BIT(ret+5)); ssh2_pkt_send(); authed = TRUE; break; } else { logevent("Pageant failed to answer challenge"); sfree(ret); } } } if (authed) continue; } }logevent("Sent password\r\n"Ri2&@P~vH;wH{[~(H;w$Ring. */ if (cfg.x11_forward) { char proto[20], data[64]; logevent("Requesting X11 forwarding"); x11_invent_auth(proto, sizeof(proto), data, sizeof(data)); ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(mainchan->remoteid); ssh2_pkt_addstring("x11-reqbool(0); /* many connections */ ssh2_pkt_addstring(proto); ssh2_pkt_addstring(data); ssh2_pkt_adduint32(0); /* screen number */ ssh2_pkt_send(); do { crWaitUntilV(ispkt); c->v2.remwindow += ssh2_pkt_getuint32(); } } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Server got confused by X11 forwarding request")); crReturnV; } logevent("X11 forwarding refused"); } else { logevent("X11 forwarding enabled"); ssh_X11_fwd_enabled = TRUE; } } /* * Now allocate a pty for the session. */ if (!cfg.nopty) { ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_addstring("pty-reqtermtype); ssh2_pkt_adduint32(cols); ssh2_pkt_adduint32(rows); ssh2_pkt_adduint32(0); /* pixel width */ ssh2_pkt_adduint32(0); /* pixel height */ ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data("\0", 1);/* TTY_OP_END, no special options */ ssh2_pkt_send(); ssh_state = SSH_STATE_INTERMED; do { crWaitUntilV(ispkt); c->v2.remwindow += ssh2_pkt_getuint32(); } } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Server got confused by pty request")); crReturnV; } c_write_str("Server refused to allocate pty\r\n"); ssh_edi Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bdbde9dd7930456afdb710e113741404 Text-delta-base-sha1: 02585a8f718ebda2eba2b6668f1c4770a0391220 Text-content-length: 960 Text-content-md5: cc0b67331f1e038a1d69e7bc3cb22dc6 Text-content-sha1: 429e1fff504adb6aa6788db194f16704435b8ff3 Content-length: 1000 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN4a-4- /* * SSH1 agent messages. */ #define SSH1_AGENTC_REQUEST_RSA_IDENTITIES 1 #define SSH1_AGENT_RSA_IDENTITIES_ANSWER 2 #define SSH1_AGENTC_RSA_CHALLENGE 3 #define SSH1_AGENT_RSA_RESPONSE 4 #define SSH1_AGENTC_ADD_RSA_IDENTITY 7 #define SSH1_AGENTC_REMOVE_RSA_IDENTITY 8 #define SSH1_AGENTC_REMOVE_ALL_RSA_IDENTITIES 9 /* openssh private? */ /* * Messages common to SSH1 and OpenSSH's SSH2. */ #define SSH_AGENT_FAILURE 5 #define SSH_AGENT_SUCCESS 6 /* * OpenSSH's SSH2 agent messages. */ #define SSH2_AGENTC_REQUEST_IDENTITIES 11 #define SSH2_AGENT_IDENTITIES_ANSWER 12 #define SSH2_AGENTC_SIGN_REQUEST 13 #define SSH2_AGENT_SIGN_RESPONSE 14 #define SSH2_AGENTC_ADD_IDENTITY 17 #define SSH2_AGENTC_REMOVE_IDENTITY 18 #define SSH2_AGENTC_REMOVE_ALL_IDENTITIES 19 Revision-number: 978 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2001-03-03T16:05:52.000000Z K 7 svn:log V 49 Remove a spurious \r\n from an Event Log message K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 31dfedb2819d1ce15c76722120b9b30f Text-delta-base-sha1: 65ee7ea696e13daa8cbcc15cce6dff6f89b4d28d Text-content-length: 42 Text-content-md5: 8fb01ef22539cf006c56678f3efe35ed Text-content-sha1: 17b8fa68337f4818575d55216214cf23a6bc3c04 Content-length: 83 K 15 cvs2svn:cvs-rev V 5 1.108 PROPS-END SVN 5G9ing.iee Revision-number: 979 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 Remove some stray diagnostics K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-03T16:10:04.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 223d6ca751e6b28398e795267b559973 Text-delta-base-sha1: 446fde137eea04d6f298df7302fc6a3041afd696 Text-content-length: 23 Text-content-md5: 9e557fe7a90716caba21103595ffa12d Text-content-sha1: 05e0a0708247156b170015a216d214b268b4165c Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNA& 2tM Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2c77aebd152fab065d9fa3c298de947d Text-delta-base-sha1: 32efdac2b790ba31a1ac846f4699182330aaace9 Text-content-length: 20 Text-content-md5: 475b1175b4c4e21e962d9d048f527b22 Text-content-sha1: a0884c986a018a7d3ed1685a896fed3f1a9a5d28 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN|B hZ" Revision-number: 980 Prop-content-length: 292 Content-length: 292 K 7 svn:log V 191 Implement OpenSSH's private agent forwarding extension. I believe we now interoperate with OpenSSH/SSH2 to _exactly_ the same level as we interoperate with SSH1. Which is pretty cool really. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-03T16:38:44.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8fb01ef22539cf006c56678f3efe35ed Text-delta-base-sha1: 17b8fa68337f4818575d55216214cf23a6bc3c04 Text-content-length: 2896 Text-content-md5: 0559bb0ed9d0fba55b8cb6c4d30fd615 Text-content-sha1: 6a4e5d0632abaa7a2344b68211b8a7cb74628a06 Content-length: 2937 K 15 cvs2svn:cvs-rev V 5 1.109 PROPS-END SVNe7:yO)OfM< {I@*<9ehq;*Potentially enable agent forwarding. */ if (cfg.agentfwd && agent_exists()) { char proto[20], data[64]; logevent("Requesting OpenSSH-style agentauth-agent-req@openssh.comsend()agent forwarding request")); crReturnV; } logevent("Agent forwarding refused"); } else { logevent("Agent forwarding enabled"); ssh_agent case CHAN_AGENT: while (length > 0) { if (c->u.a.lensofar < 4) { int l = min(4 - c->u.a.lensofar, length); memcpy(c->u.a.msglen + c->u.a.lensofar, data, l); data += l; length -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == 4) { c->u.a.totallen = 4 + GET_32BIT(c->u.a.msglen); c->u.a.message = smalloc(c->u.a.totallen); memcpy(c->u.a.message, c->u.a.msglen, 4); } if (c->u.a.lensofar >= 4 && length > 0) { int l = min(c->u.a.totallen - c->u.a.lensofar, length); memcpy(c->u.a.message + c->u.a.lensofar, data, l); data += l; length -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == c->u.a.totallen) { void *reply, *sentreply; int replylen; agent_query(c->u.a.message, c->u.a.totallen, &reply, &replylen); if (reply) sentreply = reply; else { /* Fake SSH_AGENT_FAILURE. */ sentreply = "\0\0\0\1\5"; replylen = 5; } ssh2_add_channel_data(c, sentreply, replylen); try_send = TRUE; if (reply) sfree(reply); sfree(c->u.a.message); c->u.a.lensofar = 0; } } else if (c->type == CHAN_AGENT) { sshfwd_close(c); case CHAN_AGENTif (typelen == 22 && !memcmp(type, "auth-agent@openssh.com", 3)) { if (!ssh_agentfwd_enabled) error = "Agent forwarding is not enabled"; else { c->type = CHAN_AGENT; /* identify channel type */ c->u.a.lensofar = 0 Revision-number: 981 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 Further traffic analysis defences K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-05T10:32:36.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0559bb0ed9d0fba55b8cb6c4d30fd615 Text-delta-base-sha1: 6a4e5d0632abaa7a2344b68211b8a7cb74628a06 Text-content-length: 7536 Text-content-md5: 219f246fa97be34ef53130614882c60f Text-content-sha1: 9d0d0dacd2c35688e0a76adcc7505abfd233141b Content-length: 7577 K 15 cvs2svn:cvs-rev V 5 1.110 PROPS-END SVNc:6FHy7Ow}eje.e.i'5:'4aq^!int s_wrpkt_preparereturn biglen+4; } static void s_wrpkt(void) { int len; len = s_wrpkt_prepare(); sk_write(s, pktout.data, len); } static void s_wrpkt_defer(void) { int len; len = s_wrpkt_prepareConstruct a packet with the specified contents. */ static void construct_packet(int pkttype, va_list ap1, va_list ap2) {while ((argtype = va_arg(ap1p1, int); pktlen += 4; break; case PKT_CHAR: (void) va_arg(ap1, char); pktlen++; break; case PKT_DATA: (void) va_arg(ap1, unsigned char *); arglen = va_arg(ap1, int); pktlen += arglen; break; case PKT_STR: argp = va_arg(ap1p1 s_wrpkt_start(pkttype, pktlen); p = pktout.body; while ((argtype = va_arg(ap2, int)) != PKT_END) { switch (argtype) { case PKT_INT: argint = va_arg(ap2p2, unsigned char); *p = argchar; p++; break; case PKT_DATA: argp = va_arg(ap2, unsigned char *); arglen = va_arg(ap2p2p2, Bignum); p += ssh1_write_bignum(p, bn); break; } } } static void send_packet(int pkttype, ...) { va_list ap1, ap2; va_start(ap1, pkttype); va_start(ap2, pkttype); construct_packet(pkttype, ap1, ap2); s_wrpkt(); } static void defer_packet(int pkttype, ...) { va_list ap1, ap2; va_start(ap1, pkttype); va_start(ap2, pkttype); construct_packet(pkttype, ap1, ap2); s_wrpkt_defer or SSH1's defer_packet(). */ static void sshif (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { /* * Defence against traffic analysis: we send a * whole bunch of packets containing strings of * different lengths. One of these strings is the * password, in a SSH1_CMSG_AUTH_PASSWORD packet. * The others are all random data in * SSH1_MSG_IGNORE packets. This way a passive * listener can't tell which is the password, and * hence can't deduce the password length. * * Anybody with a password length greater than 16 * bytes is going to have enough entropy in their * password that a listener won't find it _that_ * much help to know how long it is. So what we'll * do is: * * - if password length < 16, we send 15 packets * containing string lengths 1 through 15 * * - otherwise, we let N be the nearest multiple * of 8 below the password length, and send 8 * packets containing string lengths N through * N+7. This won't obscure the order of * magnitude of the password length, but it will * introduce a bit of extra uncertainty. */ int bottom, top, pwlen, i; char *randomstr; pwlen = strlen(password); if (pwlen < 16) { bottom = 1; top = 15; } else { bottom = pwlen &~ 7; top = bottom + 7; } assert(pwlen >= bottom && pwlen <= top); randomstr = smalloc(top+1); for (i = bottom; i <= top; i++) { if (i == pwlen) defer_packet(pwpkt_type, PKT_STR, password, PKT_END); else { for (j = 0; j < i; j++) { do { randomstr[j] = random_byte(); } while (randomstr[j] == '\0'); } randomstr[i] = '\0'; defer_packet(SSH1_MSG_IGNORE, PKT_STR, randomstr, PKT_END); } } ssh_pkt_defersend(); } else { send_packet(pwpkt_type, PKT_STR, password, PKT_END); }7XX7th of the two * packets constant. This should ensure that a passive * listener doing traffic analyis can't work out the length * of the password. * * For this to work, we need an assumption about the * maximum length of the password packet. I think 256 is * pretty conservative. Anyone using a password longer than * that probably doesn't have much to worry about from * people who find out how long their password is! */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("password"); ssh2_pkt_addbool(FALSE); ssh2_pkt_addstring(password); ssh2_pkt_defer(); /* * We'll include a string that's an exact multiple of the * cipher block size. If the cipher is NULL for some * reason, we don't do this trick at all because we gain * nothing by it. */ if (cscipher) { int i, j; ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(); for (i = deferred_len; i <= 256; i += cscipher->blksize) { for (j = 0; j < cscipher->blksize; j++) { char c = (char)random_byte(); ssh2_pkt_addstring_data(&c, 1); } } ssh2_pkt_defer(); } ssh_pkt_defersend(); logevent("Sent password"); type = AUTH_TYPE_PASSWORD; } else { c_write_str("No supported authentication methods left to try!\r\n"); logevent("No supported authentications offered. Disconnecting"); ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring("No supported authentication methods available"); ssh2_pkt_addstring("en"); /* language tag */ ssh2_pkt_send(); ssh_state = SSH_STATE_CLOSED; crReturnV; } } } while (!we_are_in); /* * Now we're authenticated for the connection protocol. The * connection protocol will automatically have started at this * point; there's no need to send SERVICE_REQUEST. */ /* * So now create a channel with a session in it. */ mainchan = smalloc(sizeof(struct ssh_channel)); mainchan->localid = 100; /* as good as any */ ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring("session"); ssh2_pkt_adduint32(mainchan->localid); ssh2_pkt_adduint32(0x8000UL); /* our window size */ ssh2_pkt_adduint32(0x4000UL); /* our max pkt size */ ssh2_pkt_send(); crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) { bombout(("Server refused to open a session")); crReturnV; /* FIXME: error data comes back in FAILURE packet */ } if (ssh2_pkt_getuint32() != mainchan->localid) { bombout(("Server's channel confirmation cited wrong channel")); crReturnV; } mainchan->remoteid = ssh2_pkt_getuint32(); mainchan->type = CHAN_MAINSESSION; mainchan->closes = 0; mainchan->v2.remwindow = ssh2_pkt_getuint32(); mainchan->v2.remmaxpkt = ssh2_pkt_getuint32(); mainchan->v2.outbuffer = NULL; mainchan->v2.outbuflen = mainchan->v2.outbufsize = 0; ssh_channels = newtree234(ssh_channelcmp); add234(ssh_channels, mainchan); logevent("Opened channel for session"); /* * Potentially enable X11 forwarding. Revision-number: 982 Prop-content-length: 365 Content-length: 365 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-05T16:38:42.000000Z K 7 svn:log V 264 Make the SSH2 traffic analysis defence robust in the face of Zlib compression. This involves introducing an option to disable Zlib compression (that is, continue to work within the Zlib format but output an uncompressed block) for the duration of a single packet. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 219f246fa97be34ef53130614882c60f Text-delta-base-sha1: 9d0d0dacd2c35688e0a76adcc7505abfd233141b Text-content-length: 1032 Text-content-md5: f4a21f8cb1e7f6cf84dc67b6a66cf812 Text-content-sha1: 7023ccca39fe537ed74ad22804c6e658c3e23a3e Content-length: 1073 K 15 cvs2svn:cvs-rev V 5 1.111 PROPS-END SVNVPX1W8 if (cscipher) { int stringlen, i; stringlen = (256 - deferred_len); stringlen += cscipher->blksize - 1; stringlen -= (stringlen % cscipher->blksize); if (cscomp) { /* * Temporarily disable actual compression, * so we can guarantee to get this string * exactly the length we want it. The * compression-disabling routine should * return an integer indicating how many * bytes we should adjust our string length * by. */ stringlen -= cscomp->disable_compression(); }0; i < stringlen; i++) { char c = (char)random_byte(); ssh2_pkt_addstring_data(&c, 1); Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cc0b67331f1e038a1d69e7bc3cb22dc6 Text-delta-base-sha1: 429e1fff504adb6aa6788db194f16704435b8ff3 Text-content-length: 56 Text-content-md5: c3c70bbadcb4eaa294972a11d34483ec Text-content-sha1: 3e34691edeea25ce30eda7b770028609e36f26eb Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNa #E int (*disable_compression)(void Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c3765ccb1c916a1cf6b2c954d262aad7 Text-delta-base-sha1: cce7b16440bd1e874d0eca73c03085308d8bdfcc Text-content-length: 5306 Text-content-md5: 8b45c3c90011f1e43cefa4ea7477975b Text-content-sha1: 1bebd022130281d6eef870ddeb9e7185e1d5006d Content-length: 5345 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN %Kafo{0jU\<J"QVl& !^C}uAD If `compress' is FALSE, it will never emit a match, but will * instead call literal() for everything, int compress, int compress/* Don't even look for a match, if we're not compressing. */ if (compress && int comp_disabledout->comp_disabled) { /* * We're in an uncompressed block, so just output the byte. */ outbits(out, c, 8); return; } assert(!out->comp_disabled); out->comp_disabled = FALSE; ectx.userdata = out; logevent("Initialised zlib (RFC1950) compression"); } /* * Turn off actual LZ77 analysis for one block, to facilitate * construction of a precise-length IGNORE packet. Returns the * length adjustment (which is only valid for packets < 65536 * bytes, but that seems reasonable enough). */ int zlib_disable_compression(void) { struct Outbuf *out = (struct Outbuf *)ectx.userdata; int n, startbits; out->comp_disabled = TRUE; n = 0; /* * If this is the first block, we will start by outputting two * header bytes, and then three bits to begin an uncompressed * block. This will cost three bytes (because we will start on * a byte boundary, this is certain). */ if (out->firstblock) { n = 3; } else { /* * Otherwise, we will output seven bits to close the * previous static block, and _then_ three bits to begin an * uncompressed block, and then flush the current byte. * This may cost two bytes or three, depending on noutbits. */ n += (out->noutbits + 10) / 8; } /* * Now we output four bytes for the length / ~length pair in * the uncompressed block. */ n += 4; return n int in_block in_block = FALSE; } if (out->comp_disabled) { if (in_block) outbits(out, 0, 7); /* close static block */ while (len > 0) { int blen = (len < 65535 ? len : 65535); /* * Start a Deflate (RFC1951) uncompressed block. We * transmit a zero bit (BFINAL=0), followed by a zero * bit and a one bit (BTYPE=00). Of course these are in * the wrong order (00 0). */ outbits(out, 0, 3); /* * Output zero bits to align to a byte boundary. */ if (out->noutbits) outbits(out, 0, 8 - out->noutbits); /* * Output the block length, and then its one's * complement. They're little-endian, so all we need to * do is pass them straight to outbits() with bit count * 16. */ outbits(out, blen, 16); outbits(out, blen ^ 0xFFFF, 16); /* * Do the `compression': we need to pass the data to * lz77_compress so that it will be taken into account * for subsequent (distance,length) pairs. But * lz77_compress is passed FALSE, which means it won't * actually find (or even look for) any matches; so * every character will be passed straight to * zlib_literal which will spot out->comp_disabled and * emit in the uncompressed format. */ lz77_compress(&ectx, block, blen, FALSE); len -= blen; block += blen; } outbits(out, 2, 3); /* open new block */ } else { if (!in_block) { /* * Start a Deflate (RFC1951) fixed-trees block. We * transmit a zero bit (BFINAL=0), followed by a zero * bit and a one bit (BTYPE=01). Of course these are in * the wrong order (01 0). */ outbits(out, 2, 3); } /* * Do the compression. */ lz77_compress(&ectx, block, len, TRUE); /* * End the block (by transmitting code 256, which is * 0000000 in fixed-tree mode), and transmit some empty * blocks to ensure we have emitted the byte containing the * last piece of genuine data. There are three ways we can * do this: * * - Minimal flush. Output end-of-block and then open a * new static block. This takes 9 bits, which is * guaranteed to flush out the last genuine code in the * closed block; but allegedly zlib can't handle it. * * - Zlib partial flush. Output EOB, open and close an * empty static block, and _then_ open the new block. * This is the best zlib can handle. * * - Zlib sync flush. Output EOB, then an empty * _uncompressed_ block (000, then sync to byte * boundary, then send bytes 00 00 FF FF). Then open the * new block. * * For the moment, we will use Zlib partial flush. */ outbits(out, 0, 7); /* close block */ outbits(out, 2, 3+7); /* empty static block */ outbits(out, 2, 3); /* open new block */ } out->comp_disabled = FALSE;, zlib_disable_compression }; Revision-number: 983 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2001-03-05T17:31:36.000000Z K 7 svn:log V 38 Fix various trivial compiler warnings K 10 svn:author V 5 simon PROPS-END Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bec76500f07c84a5ee1ba326523d01a7 Text-delta-base-sha1: e5a9a50a1908ec63c7fe303236efb8e9102046a3 Text-content-length: 57 Text-content-md5: 57c4a9d25b89d42114687be6b4f3a6df Text-content-sha1: 03722c0889e764ff8532942955c498bdba2b1602 Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNg<)l pm  Z! Qchar0 Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a7c8fa79a61f0a86e1929156c7d29406 Text-delta-base-sha1: cd4b9b82869c0f3dbc3a2a3339893eed086881d3 Text-content-length: 27 Text-content-md5: c591f6bb48469dd74730a9213ed3f50a Text-content-sha1: 061651994e952ef2b54475b0d62ff5141d2e4b26 Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN[GFUN6 Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 475b1175b4c4e21e962d9d048f527b22 Text-delta-base-sha1: a0884c986a018a7d3ed1685a896fed3f1a9a5d28 Text-content-length: 177 Text-content-md5: d6b8f1f1803e7aa5afdba871a57c3ee0 Text-content-sha1: 722fe2f706e5f8e98bdb5a7409376ae913a0ad43 Content-length: 217 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNB"[7v+as@aa#define ASN1_LEN ( (int) sizeof(asn1_weird_stuff) )ASN1_LENASN1_LENASN1_LEN; i++) bytes[i] = 0xFF; for (i = nbytes-20-ASN1_LEN Revision-number: 984 Prop-content-length: 234 Content-length: 234 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-06T09:29:43.000000Z K 7 svn:log V 133 Update a couple of messages to be clearer to users who don't have access to complete documentation (ie all of them at the moment :-) PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f4a21f8cb1e7f6cf84dc67b6a66cf812 Text-delta-base-sha1: 7023ccca39fe537ed74ad22804c6e658c3e23a3e Text-content-length: 68 Text-content-md5: dbd30487d66c4df583f28139f4c9ae3b Text-content-sha1: e5b7b14f5e31a104feada3bffc2cfe29460216eb Content-length: 109 K 15 cvs2svn:cvs-rev V 5 1.112 PROPS-END SVNGMFdSSH1SSH2 total leng Revision-number: 985 Prop-content-length: 226 Content-length: 226 K 7 svn:log V 125 Introduce the ability to distinguish remote SSH implementations by their version strings and enable bug compatibility modes. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-06T10:32:28.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: dbd30487d66c4df583f28139f4c9ae3b Text-delta-base-sha1: e5b7b14f5e31a104feada3bffc2cfe29460216eb Text-content-length: 6404 Text-content-md5: ce2441dc59cde9c902d8d1d41dc1daf9 Text-content-sha1: a28cd41eb3fc747e728d26f373c6487198c4e94d Content-length: 6445 K 15 cvs2svn:cvs-rev V 5 1.113 PROPS-END SVN_  %z?zTW J}b:jZvw[7G9 |w/* * Various remote-bug flags. */ #define BUG_CHOKES_ON_SSH1_IGNORE 1 #define BUG_SSH2_HMAC 2int ssh_remote_bugs#if 0 debug(("Packet payload pre-compression:\n")); for (i = -1; i < pktout.length; i++) debug((" %02x", (unsigned char)pktout.body[i])); debug(("\r\n")); #endif if (ssh1_compressing) { unsigned char *compblk; int complen;/* * Examine the remote side's version string and compare it against * a list of known buggy implementations. */ static void ssh_detect_bugs(char *vstring) { char *imp; /* pointer to implementation part */ imp = vstring; imp += strcspn(imp, "-"); imp += strcspn(imp, "-"); ssh_remote_bugs = 0; if (!strcmp(imp, "1.2.18") || !strcmp(imp, "1.2.19") || !strcmp(imp, "1.2.20") || !strcmp(imp, "1.2.21") || !strcmp(imp, "1.2.22")) { /* * These versions don't support SSH1_MSG_IGNORE, so we have * to use a different defence against password length * sniffing. */ ssh_remote_bugs |= BUG_CHOKES_ON_SSH1_IGNORE; logevent("We believe remote version has SSH1 ignore bug"); } if (!strncmp(imp, "2.1.0", 5) || !strncmp(imp, "2.0.", 4) || !strncmp(imp, "2.2.0", 5) || !strncmp(imp, "2.3.0", 5) || !strncmp(imp, "2.1 ", 4)) { /* * These versions have the HMAC bug. */ ssh_remote_bugs |= BUG_SSH2_HMAC; logevent("We believe remote version has SSH2 HMAC bug"); }ssh_detect_bugs( * A few servers (the old 1.2.18 through 1.2.22) * can't deal with SSH1_MSG_IGNORE. For these * servers, we need an alternative defence. We make * use of the fact that the password is interpreted * as a C string: so we can append a NUL, then some * random data. */ if (ssh_remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE) { char string[64]; char *s; int len; len = strlen(password); if (len < sizeof(string)) { s = string; strcpy(string, password); len++; /* cover the zero byte */ while (len < sizeof(string)) { string[len++] = (char)random_byte(); } } else { s = password; } send_packet(pwpkt_type, PKT_INT, len, PKT_DATA, s, len, PKT_END); } else { int bottom, top, pwlen, i; char *randomstr; pwlen = strlen(password); if (pwlen < 16) { bottom = 1; top = 15; } else { bottom = pwlen &~ 7; top = bottom + 7; } randomstr = smalloc(top+1); for (i = bottom; i <= top; i++) { if (i == pwlen) else { for (j = 0; j < i; j++) { do { } while (randomstr[j] == '\0'); } randomstr[i] = '\0'; PKT_STR, randomstr, PKT_ENDssh_pkt_defersend(); } || (ssh_remote_bugs & BUG_SSH2_HMAC)#os--; break; case 21: case 27: pos = 0; break; case 3: case 4: random_save_seed(); exit(0); break; default: if (((c >= ' ' && c <= '~') || ((unsigned char)c >= 160)) && pos < 40) password[pos++] = c; break; } } c_write_str("\r\n"); } } if (method == AUTH_PUBLICKEY_FILE) { /* * We have our passphrase. Now try the actual authentication. */ struct ssh2_userkey *key; key = ssh2_load_userkey(cfg.keyfile, password); if (key == SSH2_WRONG_PASSPHRASE || key == NULL) { if (key == SSH2_WRONG_PASSPHRASE) { c_write_str("Wrong passphrase\r\n"); tried_pubkey_config = FALSE; } else { c_write_str("Unable to load private key\r\n"); tried_pubkey_config = TRUE; } /* Send a spurious AUTH_NONE to return to the top. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("none"); /* method */ ssh2_pkt_send(); type = AUTH_TYPE_NONE; } else { unsigned char *blob, *sigdata; int blob_len, sigdata_len; /* * We have loaded the private key and the server * has announced that it's willing to accept it. * Hallelujah. Generate a signature and send it. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(TRUE); ssh2_pkt_addstring(key->alg->name); blob = key->alg->public_blob(key->data, &blob_len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(blob, blob_len); sfree(blob); /* * The data to be signed is: * * string session-id * * followed by everything so far placed in the * outgoing packet. */ sigdata_len = pktout.length - 5 + 4 + 20; sigdata = smalloc(sigdata_len); PUT_32BIT(sigdata, 20); memcpy(sigdata+4, ssh2_session_id, 20); memcpy(sigdata+24, pktout.data+5, pktout.length-5); blob = key->alg->sign(key->data, sigdata, sigdata_len, &blob_len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(blob, blob_len); sfree(blob); sfree(sigdata); ssh2_pkt_send(); type = AUTH_TYPE_PUBLICKEY; } } else if (method == AUTH_PASSWORD) { /* * We send the password packet lumped tightly together with * an SSH_MSG_IGNORE packet. The IGNORE packet contains a * string long enough to make the Revision-number: 986 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:36.592316Z PROPS-END Revision-number: 987 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2001-03-08T10:07:22.000000Z K 7 svn:log V 138 Having introduced a new function into the SSH2 compression structure, it would help if I implemented it in the dummy no-compression case! K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ce2441dc59cde9c902d8d1d41dc1daf9 Text-delta-base-sha1: a28cd41eb3fc747e728d26f373c6487198c4e94d Text-content-length: 206 Text-content-md5: 659c1cbc3418ed614451f8c5259b2b11 Text-content-sha1: 382c2aa6e213877cd2f33f94300d27e32ca76e37 Content-length: 247 K 15 cvs2svn:cvs-rev V 5 1.114 PROPS-END SVNNHFQ_static int ssh_comp_none_disable(void) { return 0; , ssh_comp_none_disable#sPP# pos = -1; break; case 8: case 127: if (pos > 0) p Revision-number: 988 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2001-03-09T13:30:43.000000Z K 7 svn:log V 64 Complete analysis of the magic ASN.1 stuff in RSASSA signatures K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d6b8f1f1803e7aa5afdba871a57c3ee0 Text-delta-base-sha1: 722fe2f706e5f8e98bdb5a7409376ae913a0ad43 Text-content-length: 466 Text-content-md5: 7d392ae6ec8bf40b7a1c5709465da693 Text-content-sha1: 1ed457ee3df89239cb636ca8536e822f4740b618 Content-length: 506 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN2.Rma| LTobject id { 1 3 14 3 2 26 } * (the 1,3 comes from 0x2B = 43 = 40*1+3) * The object id in the middle there is listed as `id-sha1' in * ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1d2.asn (the * ASN module for PKCS #1) and its expanded form is as follows: * * id-sha1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) oiw(14) secsig(3) * algorithms(2) 26 } Revision-number: 989 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2001-03-10T10:22:18.000000Z K 7 svn:log V 70 Update the text format of the public key as the comment box is edited K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a93734066363394ec329f04cecd0da81 Text-delta-base-sha1: 03828dac5db30acce4c7702e2d2a8b44647f78b8 Text-content-length: 191 Text-content-md5: c3636bee2ef086dc69edf9b1f606daee Text-content-sha1: 6f3e21fb45e9c6c1cd1574cc4837c3d5368fb5e6 Content-length: 231 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNaZ##4- if (state->ssh2) { setupbigedit2(hwnd, IDC_KEYDISPLAY, &state->ssh2key); } else { setupbigedit1(hwnd, IDC_KEYDISPLAY, &state->key); } } Revision-number: 990 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2001-03-10T11:03:26.000000Z K 7 svn:log V 85 Tiny bug in bn_power_2() - didn't work with powers that were a multiple of 16. Oops! K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 899424ff09efe5802fee8b464c7e8731 Text-delta-base-sha1: d7d9833ab305503953e72e599bad99203cee0c31 Text-content-length: 30 Text-content-md5: 6921682c08f0f698a205b1faed80ec97 Text-content-sha1: fb47b48dadc470649aaeb95c00ffc9fdab44f27b Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNFC B{Kn/16+1 Revision-number: 991 Prop-content-length: 331 Content-length: 331 K 7 svn:log V 230 Add support for using Diffie-Hellman with short exponents (sshdh.c contains a reference to a paper on the subject). Reduces time taken for DH group exchange to the point where it's viable to enable it all the time, so I have. :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-10T11:04:07.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 659c1cbc3418ed614451f8c5259b2b11 Text-delta-base-sha1: 382c2aa6e213877cd2f33f94300d27e32ca76e37 Text-content-length: 878 Text-content-md5: 0c7b7c8634fb781ca72e60e0effb033c Text-content-sha1: 45594d2dd109ffaa34a54965f5afae7cd249434a Content-length: 919 K 15 cvs2svn:cvs-rev V 5 1.115 PROPS-END SVN4uI4yKq8|{4P0 &ssh_diffiehellman_gex,, pWork out the number of bits of key we will need from the key * exchange. We start with the maximum key length of either * cipher... */ { int csbits, scbits; csbits = cscipher_tobe->keylen; scbits = sccipher_tobe->keylen; nbits = (csbits > scbits ? csbits : scbits); } /* The keys only have 160-bit entropy, since they're based on * a SHA-1 hash. So cap the key size at 160 bits. */ if (nbits > 160) nbits = 160;logevent("Doing Diffie-Hellman group exchange"); /* * Work out how big a DH group we will need to allow that * much data. */ pbits = 512 << ((nbits-1) / 64); ssh2_pkt_init(SSH2_MSG_KEX_DH_GEX_REQUEST); ssh2_pkt_adduint32(pnbits*2p pos = -1; sZZ Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c3c70bbadcb4eaa294972a11d34483ec Text-delta-base-sha1: 3e34691edeea25ce30eda7b770028609e36f26eb Text-content-length: 30 Text-content-md5: 275cf81148ae7bdbe3ecf71557f05902 Text-content-sha1: 2f3ef7f6e7237f4e72e7c2468d705f60faacdedc Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN 1R5int nbits Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 888713ac493bf1fa12944f2ee246b070 Text-delta-base-sha1: 4c133b4e1f79196176789019b568d0073ff4c657 Text-content-length: 1021 Text-content-md5: 538ad24a68e7eed697ddceae4aa0f981 Text-content-sha1: 22e40095729c23a758e2c3bc5b994c566aebc1fd Content-length: 1060 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN+H\r v  * If `nbits' is greater than zero, it is used as an upper limit * for the number of bits in x. This is safe provided that (a) you * use twice as many bits in x as the number of bits you expect to * use in your session key, and (b) the DH group is a safe prime * (which SSH demands that it must be). * * P. C. van Oorschot, M. J. Wiener * "On Diffie-Hellman Key Agreement with Short Exponents". * Advances in Cryptology: Proceedings of Eurocrypt '96 * Springer-Verlag, May 1996. */ Bignum dh_create_e(int nbits if (nbits == 0 || nbits > ssh1_bignum_bitcount(qmask)) { ssh1_write_bignum(buf, qmask); for (i = 2; i < nbytes; i++) buf[i] &= random_byte(); ssh1_read_bignum(buf, &x); } else { int b, nb; x = bn_power_2(nbits); nb = 0; for (i = 0; i < nbits; i++) { if (nb == 0) { nb = 8; b = random_byte(); } bignum_set_bit(x, i, b & 1); b >>= 1; nb--; } }Bignum ret; ret = modpow(f, x, p); return ret; } Revision-number: 992 Prop-content-length: 393 Content-length: 393 K 8 svn:date V 27 2001-03-12T12:24:07.000000Z K 7 svn:log V 292 Finally fixed the point/pixel confusion in font handling. Thanks to Roman Surma for pointing me at the relevant bits of documentation. All font sizes should now be measured in points, and everything should be consistent, and (with any luck) old Registry settings should adapt gracefully too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 496d7f2607b0ec68451e683af4768527 Text-delta-base-sha1: 0789ca383d7b6af80bbcb2d21037692284561cec Text-content-length: 370 Text-content-md5: 07b1b271d2df1ff210864dbaf926dbe3 Text-content-sha1: 3beb65d56781b96cc3f119de2b1c51b4fb664ea2 Content-length: 410 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNmL ZwZ{rif (cfg->fontheight < 0) { int oldh, newh; HDC hdc = GetDC(NULL); int logpix = GetDeviceCaps(hdc, LOGPIXELSY); ReleaseDC(NULL, hdc); oldh = -cfg->fontheight; newh = MulDiv(oldh, 72, logpix) + 1; if (MulDiv(newh, logpix, 72) > oldh) newh--; cfg->fontheight = newh; } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7a8610ce0d3aca15f8bfbc43db0cc26f Text-delta-base-sha1: de54afed1102bf786ed040c107bf11d012008243 Text-content-length: 116 Text-content-md5: 2f2c1e764b6c6ff42073dbe5b941b26b Text-content-sha1: 84815dcd5c6b261af88ceb5bdb56fbb34592c06f Content-length: 157 K 15 cvs2svn:cvs-rev V 5 1.113 PROPS-END SVNlSjAcULCpoint", (cfg.fontheight < 0 ? -cfg.fontheight : cfg.fontheightcf.iPointSize / 10 Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 92f96d6d31fdfbdc96bd97e82b73f614 Text-delta-base-sha1: 3b7c3efa269b57bc81a42b42a02e0be9196fe7fb Text-content-length: 135 Text-content-md5: 8ea94fb1bdc5f9a1240bc6f11f60b0d1 Text-content-sha1: 87d872e5193428540a5ca9c201d8585d576859c5 Content-length: 176 K 15 cvs2svn:cvs-rev V 5 1.110 PROPS-END SVNgXl.l>)if (font_height > 0) { font_height = -MulDiv(font_height, GetDeviceCaps(hdc, LOGPIXELSY), 72); } Revision-number: 993 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2001-03-12T15:12:33.000000Z K 7 svn:log V 63 Zero length passwords no longer cause an assertion failure :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0c7b7c8634fb781ca72e60e0effb033c Text-delta-base-sha1: 45594d2dd109ffaa34a54965f5afae7cd249434a Text-content-length: 131 Text-content-md5: c084a7be9d9f607a7946220fbd7827e9 Text-content-sha1: 2f8a57858ee2f3e5175046b877d438de99e97bd2 Content-length: 172 K 15 cvs2svn:cvs-rev V 5 1.116 PROPS-END SVN -Q0; /* zero length passwords are OK! :-) */Z+Zpassword[pos] = 0; pos = -1; Revision-number: 994 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2001-03-12T15:31:53.000000Z K 7 svn:log V 136 ssh_get_password has become ssh_get_line, so it can handle usernames as well. This should fix the multiple-reads-on-stdin bug in plink. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 339d3aef38d4d3f557945e1235187b79 Text-delta-base-sha1: 6de8e49704a773b08014dacbf0c09379039f1d83 Text-content-length: 406 Text-content-md5: 689395dc1f51e75330805a31271f4cdb Text-content-sha1: efab278c0b92ef7c9e8499c8c489fa2b9e9a2716 Content-length: 446 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN." h"%E[(6bLline(const char *prompt, char *str, int maxlen, int is_pw) { HANDLE hin, hout; DWORD savemode, newmode, i; if (is_pw && newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT; if (is_pw) newmode &= ~ENABLE_ECHO_INPUT; else newmode |= ENABLE_ECHO_INPUT; SetConsoleMode(hin, newmodeif (is_pw) line = get_line Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 66f2611debe76d4596a67a70115458d6 Text-delta-base-sha1: eee97adc4ec64ecb75e489d9541381889a7550c4 Text-content-length: 384 Text-content-md5: fd0a17180835ed7bcac1a192c9efe679 Text-content-sha1: e8f6a62be7317708165c9f3f488785e8934fef5a Content-length: 423 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNVO$Nj*_E[pOG(.line(const char *prompt, char *str, int maxlen, int is_pw) { HANDLE hin, hout; DWORD savemode, newnewmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT; if (is_pw) newmode &= ~ENABLE_ECHO_INPUT; else newmode |= ENABLE_ECHO_INPUT; SetConsoleMode(hin, newmodeif (is_pw) line = &get_line Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3dd781e694ef4ad24b4bac48b7aa483 Text-delta-base-sha1: baf2d95457a24b98cccedae21d988b52738dc460 Text-content-length: 107 Text-content-md5: 8410a124a5bb2ccbb5b5c17fb24e65a7 Text-content-sha1: e4362f447f914e4c526aafcec2c20603e3b38ff3 Content-length: 147 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVN-O U}U}0line)(const char *prompt, char *str, int maxlen, int is_pw Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c0a969211e887d700ebd21e6f2480c2f Text-delta-base-sha1: e6e1fc5897ee03247c2b992018025f5b288c5047 Text-content-length: 445 Text-content-md5: a9318c6fb676705fd8b367ec3d617154 Text-content-sha1: 7ba8ddfcfe015cca379aa40e1a85ab48471b3c9a Content-length: 485 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNe" BQ.aIkP4Iline(const char *prompt, char *str, int maxlen, int is_pw) { HANDLE hin, hout; DWORD savemode, newmode, i; if (is_pw && newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT; if (is_pw) newmode &= ~ENABLE_ECHO_INPUT; else newmode |= ENABLE_ECHO_INPUT; SetConsoleMode(hin, newmodeif (is_pw) line = &get_line Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c084a7be9d9f607a7946220fbd7827e9 Text-delta-base-sha1: 2f8a57858ee2f3e5175046b877d438de99e97bd2 Text-content-length: 5927 Text-content-md5: 58561a9d8c4ad9c1f5b7d77ddb48658d Text-content-sha1: 6b4acf018599cff910dc8d147e8371b73c7a19a4 Content-length: 5968 K 15 cvs2svn:cvs-rev V 5 1.117 PROPS-END SVNExYN ?Lx ahx"&{w@Lx ahline)(const char *prompt, char *str, int maxlen, int is_pw if (ssh_get_line) { if (!ssh_get_line("login as: ", username, sizeof(username), FALSE)) { /* * get_line failed to get a username. * Terminate. */ logevent("No username provided. Abandoning session."); ssh_state = SSH_STATE_CLOSED; crReturn(1); } } else { c_write_str("login as: "); ssh_send_ok = 1; while (pos >= 0) { crWaitUntil(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: username[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) { c_write_str("\b \b"); pos--; } break; case 21: case 27: while (pos > 0) { c_write_str("\b \b"); pos--; } break; case 3: case 4: random_save_seed(); exit(0); break; default: ((unsigned char)c >= 160)) && pos < 40) { username[pos++] = c; c_write(&c, 1); c_write_str("\r\n"); username[strcspn(username, "\n\r")] = '\0'; } line) { if (!ssh_get_line(prompt, password, sizeof(password), TRUE)) { /* * get_line failed to get a password (for example * because one was supplied on the command line * which has already failed to work). if (ssh_get_line) { if (!ssh_get_line("login as: ", username, sizeof(username), FALSE)) { /* * get_line failed to get a username. * Terminate. */ logevent("No username provided. Abandoning session."); ssh_state = SSH_STATE_CLOSED; crReturn(1); } } else { c_write_str("login as: "); ssh_send_ok = 1; while (pos >= 0) { crWaitUntilV(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: username[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) { c_write_str("\b \b"); pos--; } break; case 21: case 27: while (pos > 0) { c_write_str("\b \b"); pos--; } break; case 3: case 4: random_save_seed(); exit(0); break; default: ((unsigned char)c >= 160)) && pos < 40) { username[pos++] = c; c_write(&c, 1); @DAM|orithm, *comment; int pub_blob_len; tried_pubkey_config = TRUE; /* * Try the public key supplied in the configuration. * * First, offer the public blob to see if the server is * willing to accept it. */ pub_blob = ssh2_userkey_loadpub(cfg.keyfile, &algorithm, &pub_blob_len); if (pub_blob) {/* method */ ssh2_pkt_addbool(FALSE); /* no signature included */ ssh2_pkt_addstring(algorithm); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pub_blob, pub_blob_len); ssh2_pkt_send(); logevent("Offered public key"); /* FIXME */ crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) { gotit = TRUE; type = AUTH_TYPE_PUBLICKEY_OFFER_LOUD; continue; /* key refused; give up on it */ } logevent("Offer of public key accepted"); /* * Actually attempt a serious authentication using * the key. */ if (ssh2_userkey_encrypted(cfg.keyfile, &comment)) { sprintf(pwprompt, "Passphrase for key \"%.100s\": ", comment); need_pw = TRUE; } else { need_pw = FALSE; } c_write_str("Authenticating with public key \""); c_write_str(comment); c_write_str("\"\r\n"); method = AUTH_PUBLICKEY_FILE; } } if (!method && can_passwd) { method = AUTH_PASSWORD; sprintf(pwprompt, "%.90s@%.90s's password: ", username, savedhost); need_pw = TRUE; } if (need_pw) { if (ssh_get_line) { if (!ssh_get_line(pwprompt, password, sizeof(password), TRUE)) { /* * get_line failed to get a password (for * example because one was supplied on the * command line which has already failed to * work). Terminate. */ logevent("No more passwords to try"); ssh_state = SSH_STATE_CLOSED; crReturnV; } } else { static int pos = 0; static char c; c_write_str(pwprompt); ssh_send_ok = 1; pos = 0; while (pos >= 0) { crWaitUntilV(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: Revision-number: 995 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2001-03-13T09:41:02.000000Z K 7 svn:log V 65 Add dependencies for x11fwd.obj to Makefile (thanks Catbells :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4aebf3b2c1fb90d14490605b05d04752 Text-delta-base-sha1: ad073f75a048017fca62e94dfa194ee1789c990a Text-content-length: 77 Text-content-md5: 715a5737dc75758303b86b58f01c7b3a Text-content-sha1: c6fd160668d29488dea08b2cb9d3f0b2f458eaf6 Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN*e 8r;ox11fwd.$(OBJ): x11fwd.c putty.h network.h puttymem.h ssh Revision-number: 996 Prop-content-length: 217 Content-length: 217 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-13T10:22:45.000000Z K 7 svn:log V 116 Dave Hinton's modifications to the network layer interface, which should make it possible to add SSL support later. PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 973be852ecd2135db184ab1ec10cb174 Text-delta-base-sha1: 9b1f4f13c561bb1a4fb0aef38ec81f60c7302b9e Text-content-length: 3518 Text-content-md5: 9ed2f8b81baa54261db2b3fdaa677663 Text-content-sha1: 033a984f36a612870c3374a54075d13a70af9142 Content-length: 3557 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNeJ% Dw1dNk3%bunch of callbacks (most notably for when * data is received) for each socket, and it can call the networking * abstraction to send data without having to worry about blocking. * The stuff behind the abstraction takes care of selects and * nonblockingAddr_tag *SockAddr; /* pay attention to levels of indirection */ typedef struct socket_function_table **Socket; typedef struct plug_function_table **Plug; struct socket_function_table { Plug (*plug) (Socket s, Plug p); /* use a different plug (return the old one) */ /* if p is NULL, it doesn't change the plug */ /* but it does return the one it's using */ void (*close) (Socket s); void (*write) (Socket s, char *data, int len); void (*write_oob) (Socket s, char *data, int len); void (*flush) (Socket s); /* ignored by tcp, but vital for ssl */ char *(*socket_error) (Socket s); }; struct plug_function_table { int (*closing) (Plug p, char *error_msg, int error_code, int calling_back); /* error_msg is NULL iff it is not an error (ie it closed normally) */ /* calling_back != 0 iff there is a Plug function */ /* currently running (would cure the fixme in try_send()) */ int (*receive) (Plug p, int urgent, char *data, int len); /* * - urgent==0. `data' points to `len' bytes of perfectly * ordinary data. * * - urgent==1. `data' points to `len' bytes of data, * which were read from before an Urgent pointer. * * - urgent==2. `data' points to `len' bytes of data, * the first of which was the one at the Urgent mark. */ }; Plug p); #define sk_plug(s,p) (((*s)->plug) (s, p)) #define sk_close(s) (((*s)->close) (s)) #define sk_write(s,buf,len) (((*s)->write) (s, buf, len)) #define sk_write_oob(s,buf,len) (((*s)->write_oob) (s, buf, len)) #define sk_flush(s) (((*s)->flush) (s)) #ifdef DEFINE_PLUG_METHOD_MACROS #define plug_closing(p,msg,code,callback) (((*p)->closing) (p, msg, code, callback)) #define plug_receive(p,urgent,buf,len) (((*p)->receive) (p, urgent, buf, len)) #endif * This is perhaps unnecessary now that we have the notion of a plug, * but there is some existing code that uses it, so it stays#define sk_socket_error(s) (((*s)->socket_error) (s)) /********** SSL stuff **********/ /* * This section is subject to change, but you get the general idea * of what it will eventually look like. */ typedef struct certificate *Certificate; typedef struct our_certificate *Our_Certificate; /* to be defined somewhere else, somehow */ typedef struct ssl_client_socket_function_table **SSL_Client_Socket; typedef struct ssl_client_plug_function_table **SSL_Client_Plug; struct ssl_client_socket_function_table { struct socket_function_table base; void (*renegotiate) (SSL_Client_Socket s); /* renegotiate the cipher spec */ }; struct ssl_client_plug_function_table { struct plug_function_table base; int (*refuse_cert) (SSL_Client_Plug p, Certificate cert[]); /* do we accept this certificate chain? If not, why not? */ /* cert[0] is the server's certificate, cert[] is NULL-terminated */ /* the last certificate may or may not be the root certificate */ Our_Certificate (*client_cert) (SSL_Client_Plug p); /* the server wants us to identify ourselves */ /* may return NULL if we want anonymity */ }; SSL_Client_Socket sk_ssl_client_over ( Socket s, /* pre-existing (tcp) connection */ SSL_Client_Plug p ); #define sk_renegotiate(s) (((*s)->renegotiate) (s)) #endif Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5205386462d1ab4c24418ae63d3a8261 Text-delta-base-sha1: d3d3ad03858183a4a9a034538e94d1889911387e Text-content-length: 521 Text-content-md5: efcbabe0cb9e555d42998cd5c6a9fb18 Text-content-sha1: cb0e7ac45236c8a7b3bf2684e9bd95a4e0b5ec01 Content-length: 561 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNZxdk Rl0ZEclosing (Plug plug, char *error_msg, int error_code, int calling_back) { sk_close(s); s = NULL; if (error_msg) { /* A socket error has occurred. */ connection_fatal (error_msg); } /* Otherwise, the remote side closed the connection normally. */ return 0; } static int raw_receive (Plug plug, int urgent, char *data, int len) {static struct plug_function_table fn_table = { raw_closing, raw_receive }, *fn_table_ptr = &fn_table; &fn_table_ptr Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 80afbeac131d1a60c566722163b0559d Text-delta-base-sha1: 980092c270e0cd2003c09c38e77986d901d5f726 Text-content-length: 530 Text-content-md5: 379adbddbcd8e7ad6f9d78f3117d55aa Text-content-sha1: 3f1d53d52b1bd8212192b7112a983296f6618c8e Content-length: 570 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN$Ym+nZr1i|(closing (Plug plug, char *error_msg, int error_code, int calling_back) { sk_close(s); s = NULL; if (error_msg) { /* A socket error has occurred. */ connection_fatal (error_msg); } /* Otherwise, the remote side closed the connection normally. */ return 0; } static int rlogin_receive (Plug plug, int urgent, char *data, int len) {static struct plug_function_table fn_table = { rlogin_closing, rlogin_receive }, *fn_table_ptr = &fn_table; &fn_table_ptr Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 58561a9d8c4ad9c1f5b7d77ddb48658d Text-delta-base-sha1: 6b4acf018599cff910dc8d147e8371b73c7a19a4 Text-content-length: 749 Text-content-md5: 06a2ba7ea23c945cfb481e9368ef5b13 Text-content-sha1: acd39eac2c4a8ef0b388117c6c375f8324651272 Content-length: 790 K 15 cvs2svn:cvs-rev V 5 1.118 PROPS-END SVN;.l|DKclosing (Plug plug, char *error_msg, int error_code, int calling_back) { ssh_state = SSH_STATE_CLOSED; sk_close(s); s = NULL; if (error_msg) { /* A socket error has occurred. */ connection_fatal (error_msg); } else { /* Otherwise, the remote side closed the connection normally. */ } return 0; } static int ssh_receive(Plug plug, int urgent, char *data, int len) {static struct plug_function_table fn_table = { ssh_closing, ssh_receive }, *fn_table_ptr = &fn_table; &fn_table_ptr  if (authed) continue; } } if (!method && can_pubkey && *cfg.keyfile && !tried_pubkey_config) { unsigned char *pub_blob; char *alg Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b17dde056682ba446c7898fede8ed6cd Text-delta-base-sha1: 7a9495b83afbd2ceefbb4aa1dad77d187a922073 Text-content-length: 531 Text-content-md5: 1a89a2ced6d0a876c90e9d9c86daa7ac Text-content-sha1: 2f5d59526bc6c6591a5e7f63bba14d108e6fed93 Content-length: 571 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN;l m:;r0pX.closing (Plug plug, char *error_msg, int error_code, int calling_back) { sk_close(s); s = NULL; if (error_msg) { /* A socket error has occurred. */ connection_fatal (error_msg); } /* Otherwise, the remote side closed the connection normally. */ return 0; } static int telnet_receive(Plug plug, int urgent, char *data, int len) {static struct plug_function_table fn_table = { telnet_closing, telnet_receive }, *fn_table_ptr = &fn_table; &fn_table_ptr Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8663c7d8127e2efa63b1cbf89b5366ad Text-delta-base-sha1: 6ac507baa230c72612ff93282985e43f2367c0b1 Text-content-length: 3145 Text-content-md5: 776ebb7764c8b0d8f96965d1a865b110 Text-content-sha1: c175277b5fc86711948d10c5b3cd2409fedd4bb3 Content-length: 3185 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN}@" s]W:L-Yg=8E_coAW/R= SIh!Ilg0Y.:|4VAM- [|U{?>define DEFINE_PLUG_METHOD_MACROSstruct socket_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ char *error; SOCKET s; Plug plug; void *private_ptr; struct buffer *head, *tail; int writable; int sending_oob; int oobinline; }; /* * We used to typedef struct Socket_tag *Socket. * * Since we have made the networking abstraction slightly more * abstract, Socket no longer means a tcp socket (it could mean * an ssl socket). So now we must use Actual_Socket when we know * we are talking about a tcp socket. */ typedef struct Socket_tag *Actual_SocketActual_Socket a = (Actual_Socket)av, b = (Actual_Actual_Socket b = (Actual_static Plug sk_tcp_plug (Socket sock, Plug p) { Actual_Socket s = (Actual_Socket) sock; Plug ret = s->plug; if (p) s->plug = p; return ret; } static void sk_tcp_flush (Socket s) { /* * We send data to the socket as soon as we can anyway, * so we don't need to do anything here. :-) */ } void sk_tcp_close (Socket s); void sk_tcp_write (Socket s, char *data, int len); void sk_tcp_write_oob (Socket s, char *data, int len); char *sk_tcp_socket_error(Socket s); Socket sk_new(SockAddr addr, int port, int privport, int oobinline, Plug plug) { static struct socket_function_table fn_table = { sk_tcp_plug, sk_tcp_close, sk_tcp_write, sk_tcp_write_oob, sk_tcp_flush, sk_tcp_socket_error }; SOCKET s; #ifdef IPV6 SOCKADDR_IN6 a6; #endif SOCKADDR_IN a; DWORD err; char *errstr; Actual_fn = &fn_table; ret->error = NULL; ret->plug = plug(Socket)(Socket)(Socket)(Socket) ret; } add234(sktree, ret); return (Socket) ret; } static void sk_tcp_close(Socket sock) { extern char *do_select(SOCKET skt, int startup); Actual_Socket s = (Actual_Socket) sockActual_static void sk_tcp_write(Socket sock, char *buf, int len) { Actual_Socket s = (Actual_Socket) sock; static void sk_tcp_write_oob(Socket sock, char *buf, int len) { Actual_Socket s = (Actual_Socket) sock; Actual_plug. */ return plug_closing (s->plug, winsock_error_string(err), err, 0plug_closing (s->plug, winsock_error_string(err), err, 0); } else if (0 == ret) { return plug_closing (s->plug, NULL, 0, 0); } else { return plug_receive (s->plug return plug_receive (s->plugplug_closing (s->plug, winsock_error_string(err), err, 0); } else { if (ret) open &= plug_receive (s->plug, 0, buf, ret); else open &= plug_closing (s->plug, NULL, 0, 0); }ock, void *ptr) { Actual_Socket s = (Actual_Socket) sock; s->private_ptr = ptr; } void *sk_get_private_ptr(Socket sock) { Actual_Socket s = (Actual_Socket) sock;static char *sk_tcp_socket_error(Socket sock) { Actual_Socket s = (Actual_Socket) sock;Actual_Socket s = first234(sktree, e); return s ? s->s : INVALID_SOCKET; } SOCKET next_socket(enum234 *e) { Actual_ Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e47abca766006d35e9b2f87aa39245e7 Text-delta-base-sha1: ac3418d33bbaad9974f5c88a2e59064256743b94 Text-content-length: 907 Text-content-md5: 3d0601d43d5e54db9ca98ff3981a0448 Text-content-sha1: b6130a0f8ffcc5a7f8800811f9031dbe60569abf Content-length: 946 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN=0O2m -U8|wlQ;^F~a:zstruct plug_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ Socket s;closing (Plug plug, char *error_msg, int error_code, int calling_back) { struct X11Private *pr = (struct X11Private *) plug; /* * We have no way to communicate down the forwarded connection, * so if an error occurred on the socket, we just ignore it * and treat it like a proper close. */ sshfwd_close(pr->c); x11_close(pr->s); return 1; } static int x11_receive (Plug plug, int urgent, char *data, int len) { struct X11Private *pr = (struct X11Private *) plug; static struct plug_function_table fn_table = { x11_closing, x11_receive }; fn = &fn_tablepr->s = *s = sk_new(addr, port, 0, 1, (Plug) pr); if ( (err = sk_socket_error(*s)) ) { sfree (pr); return err; } Revision-number: 997 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2001-03-14T11:47:11.000000Z K 7 svn:log V 55 AES should have accelerator s, not a, to avoid a clash K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2f2c1e764b6c6ff42073dbe5b941b26b Text-delta-base-sha1: 84815dcd5c6b261af88ceb5bdb56fbb34592c06f Text-content-length: 44 Text-content-md5: 77901efcd950277fa91289a0d9016ef2 Text-content-sha1: fd416657152862b510f6b7dacd485f3e9fb2938d Content-length: 85 K 15 cvs2svn:cvs-rev V 5 1.114 PROPS-END SVNlmP9asys iAE& Revision-number: 998 Prop-content-length: 148 Content-length: 148 K 7 svn:log V 48 Fix a segfault on abrupt X connection shutdown. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-15T11:19:59.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 06a2ba7ea23c945cfb481e9368ef5b13 Text-delta-base-sha1: acd39eac2c4a8ef0b388117c6c375f8324651272 Text-content-length: 71 Text-content-md5: 802c268431a8c73908a578fb984d1f42 Text-content-sha1: 7c736b4c596cb4000e5112e47fd879c318eea5fa Content-length: 112 K 15 cvs2svn:cvs-rev V 5 1.119 PROPS-END SVN TT && !c->closes . } } Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3d0601d43d5e54db9ca98ff3981a0448 Text-delta-base-sha1: b6130a0f8ffcc5a7f8800811f9031dbe60569abf Text-content-length: 46 Text-content-md5: 30ecc56c025ad4a3d368e62b835b1db9 Text-content-sha1: 29ae7c0bb8cb591de07494fa65fb21f4b4c3db59 Content-length: 85 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN=X ><; if (!s) return; Revision-number: 999 Prop-content-length: 210 Content-length: 210 K 8 svn:date V 27 2001-03-15T11:32:23.000000Z K 7 svn:log V 109 Oops - don't invent an X authorisation when doing agent forwarding! Overenthusiastic c'n'p breaks the world. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 802c268431a8c73908a578fb984d1f42 Text-delta-base-sha1: 7c736b4c596cb4000e5112e47fd879c318eea5fa Text-content-length: 43 Text-content-md5: 3ca5da03b4514beeb719f30a7e2d3e5e Text-content-sha1: 0994efb383869b82ce99d21413da04d52212cef1 Content-length: 84 K 15 cvs2svn:cvs-rev V 5 1.120 PROPS-END SVN.kX~ ! Revision-number: 1000 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2001-03-15T11:38:02.000000Z K 7 svn:log V 44 Bit more robustness when talking to Pageant K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3ca5da03b4514beeb719f30a7e2d3e5e Text-delta-base-sha1: 0994efb383869b82ce99d21413da04d52212cef1 Text-content-length: 404 Text-content-md5: 7c0899f1a70d871c81cb267655d005c9 Text-content-sha1: 2a016e01ae433ada151fc2a18fb976a9c59c0d00 Content-length: 445 K 15 cvs2svn:cvs-rev V 5 1.121 PROPS-END SVN.YW;YW> && responselen >= 5 && response[4] == SSH1_AGENT_RSA_IDENTITIES_ANSWER && responselen >= 5 && response[4] == SSH2_AGENT_IDENTITIES_ANSWERk..kata(ret+9, GET_32BIT(ret+5)); ssh2_pkt_send(); authed = TRUE; break; } else { logevent("Pageant failed to answer challenge"); sfree(ret); } Revision-number: 1001 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2001-03-15T11:39:17.000000Z K 7 svn:log V 36 Fix a few trivial compiler warnings K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7c0899f1a70d871c81cb267655d005c9 Text-delta-base-sha1: 2a016e01ae433ada151fc2a18fb976a9c59c0d00 Text-content-length: 50 Text-content-md5: dce4528af82d7be2941c8765d2c82fd4 Text-content-sha1: 560b4716905ad87fdbd1c468969fbf06b405d350 Content-length: 91 K 15 cvs2svn:cvs-rev V 5 1.122 PROPS-END SVN ^"Vatu Q$u Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8b45c3c90011f1e43cefa4ea7477975b Text-delta-base-sha1: 1bebd022130281d6eef870ddeb9e7185e1d5006d Text-content-length: 25 Text-content-md5: 6af8e85bd865c94c95a4dda30d1bd821 Text-content-sha1: 0f58743107157fb178f1754b123d9ba77c612582 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN% ! Revision-number: 1002 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2001-03-15T12:14:09.000000Z K 7 svn:log V 31 Fix a trivial compiler warning K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c3636bee2ef086dc69edf9b1f606daee Text-delta-base-sha1: 6f3e21fb45e9c6c1cd1574cc4837c3d5368fb5e6 Text-content-length: 23 Text-content-md5: adad50732ddcb75b5f399119938f3b96 Text-content-sha1: 60d103ea60f64929b36c4435d60982eba6866a6f Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNZR RZ Revision-number: 1003 Prop-content-length: 367 Content-length: 367 K 7 svn:log V 266 At long last: PuTTY will now report its version to the server sensibly, as a release or a snapshot or a local build. With any luck this should make bug reporting easier to handle, because anyone who sends their Event Log should automatically include the version :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-15T12:15:02.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: dce4528af82d7be2941c8765d2c82fd4 Text-delta-base-sha1: 560b4716905ad87fdbd1c468969fbf06b405d350 Text-content-length: 201 Text-content-md5: 6dbd5bcdfe1c6ca300b567f08de9b1b3 Text-content-sha1: 8c192bb125895122e26d8a849a3b66b1b2907350 Content-length: 242 K 15 cvs2svn:cvs-rev V 5 1.123 PROPS-END SVNY(-DLvBverstring[80]; sprintf(verstring, "SSH-2.0-%s", sshver)%s, sshveru-8u ssh2_pkt_addstring_start(); ssh2_pkt_addstring_dat Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 275cf81148ae7bdbe3ecf71557f05902 Text-delta-base-sha1: 2f3ef7f6e7237f4e72e7c2468d705f60faacdedc Text-content-length: 110 Text-content-md5: 34a0a9093e32710b759a9e55c84df8f1 Text-content-sha1: c19f3d663e86610c513d24f0ab0901aea4ca8fb1 Content-length: 150 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN g X5XZ2/* * PuTTY version number formatted as an SSH version string. */ extern char sshver[] Node-path: putty/version.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eeaaf3b0bbb907c5b622209d68cf35a0 Text-delta-base-sha1: 5e49bcc18716d508b3fe4e3226c6ed75fd471d8e Text-content-length: 475 Text-content-md5: 147d7c7792c996020a79637a5adb429f Text-content-sha1: b40a3617b182601dd8b7657f650a821967094ffc Content-length: 514 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN!`HHchar sshver[] = "PuTTY-Snapshot-" STR(SNAPSHOT); #elif defined RELEASE char ver[] = "Release " STR(RELEASE); char sshver[] = "PuTTY-Release-" STR(RELEASE); #else char ver[] = "Unidentified build, " __DATE__ " " __TIME__; char sshver[] = "PuTTY-Local: " __DATE__ " " __TIME__; #endif /* * SSH local version string MUST be under 40 characters. Here's a * compile time assertion to verify this. */ enum { vorpal_sword = 1 / (sizeof(sshver) <= 40) }; Revision-number: 1004 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2001-03-15T13:25:48.000000Z K 7 svn:log V 77 David Brinegar's workaround for an error reporting problem in some WinSocks. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 776ebb7764c8b0d8f96965d1a865b110 Text-delta-base-sha1: c175277b5fc86711948d10c5b3cd2409fedd4bb3 Text-content-length: 351 Text-content-md5: 19633c40d3e6824aa6520b8fa1979fe7 Text-content-sha1: 934da78bec19f246e3d00f8e360d3004062d71f4 Content-length: 391 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN@0 E(EC}(err==0 && nsent < 0) || err == WSAEWOULDBLOCK) { /* * Perfectly normal: we've sent all we can for the moment. * * (Apparently some WinSocks can return <0 but * leave no error indication - WSAGetLastError() is * called but returns zero - so we check that case * and treat it just like WSAEWOULDBLOCK.) Revision-number: 1005 Prop-content-length: 380 Content-length: 380 K 8 svn:date V 27 2001-03-15T17:14:31.000000Z K 7 svn:log V 279 Add support for SSH2 userauth banners. We currently can't deal with printing them _before_ the username prompt. This apparently isn't very serious because OpenSSH doesn't _send_ it before the username prompt, but only in response to USERAUTH_REQUEST "none". Good job we do that! K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6dbd5bcdfe1c6ca300b567f08de9b1b3 Text-delta-base-sha1: 8c192bb125895122e26d8a849a3b66b1b2907350 Text-content-length: 844 Text-content-md5: c951d6862e6ad4ccbc754a99ce8193b6 Text-content-sha1: 2e58f5dfd6a3f9310ad64824fbaddf4b8e3d8969 Content-length: 885 K 15 cvs2svn:cvs-rev V 5 1.124 PROPS-END SVNya6a.B9untrusted(char *buf, int len) { int i; for (i = 0; i < len; i++) { if (buf[i] == '\n') c_write("\r\n", 2); else if ((buf[i] & 0x60) || (buf[i] == '\r')) c_write(buf+i, 1); } char *banner; int size; ssh2_pkt_getstring(&banner, &size); if (banner) c_write_untrusted(banner, size);-2- */ PUT_32BIT(q, 20); q += 4; memcpy(q, ssh2_session_id, 20); q += 20; memcpy(q, pktout.data+5, pktout.length-5); q += pktout.length-5; /* And finally the (zero) flags word. */ PUT_32BIT(q, 0); agent_query(agentreq, len+4, &ret, &retlen); sfree(agentreq); if (ret) { if (ret[4] == SSH2_AGENT_SIGN_RESPONSE) { logevent("Sending Pageant's response"); Revision-number: 1006 Prop-content-length: 309 Content-length: 309 K 8 svn:date V 27 2001-03-16T11:58:54.000000Z K 7 svn:log V 208 Correct handling of SSH1 protocol flags, in particular PROTOFLAG_SCREEN_NUMBER, without which OpenSSH 2.5.1 was objecting to my gratuitous inclusion of a screen number in the SSH1 X forwarding request. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c951d6862e6ad4ccbc754a99ce8193b6 Text-delta-base-sha1: 2e58f5dfd6a3f9310ad64824fbaddf4b8e3d8969 Text-content-length: 2379 Text-content-md5: c11d870eadb1b7b89115acc11331f951 Text-content-sha1: e1849e5c1c9e5d03c3770130b6d21fbadd1b3822 Content-length: 2420 K 15 cvs2svn:cvs-rev V 5 1.125 PROPS-END SVNK5I1t9up@7qz"#9 eO1_PROTOFLAG_SCREEN_NUMBER 1 /* 0x1 */ /* Mask for protoflags we will echo back to server if seen */ #define SSH1_PROTOFLAGS_SUPPORTED 0 /* 0x11_remote_protoflags; static int ssh1_local_protoflags { int i; debug(("Packet payload pre-decompression:\n")); for (i = -1; i < pktin.length; i++) debug((" %02x", (unsigned char)pktin.body[i])); debug(("\r\n")); } { int i; debug(("Packet payload post-decompression:\n")); for (i = -1; i < pktin.length; i++) debug((" %02x", (unsigned char)pktin.body[i])); debug(("\r\n")); }sh1_remote_protoflags = GET_32BIT(pktin.body+8+i+j);ssh1_local_protoflags = ssh1_remote_protoflags & SSH1_PROTOFLAGS_SUPPORTED; ssh1_local_protoflags |= SSH1_PROTOFLAG_SCREEN_NUMBERssh1_local_protoflagsif (ssh1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) { send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKT_STR, data, PKT_INT, 0, PKT_END); } else { send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKT_STR, data, PKT_END); }2[))2; c_write_str("\" from agent\r\n"); /* * Server is willing to accept the key. * Construct a SIGN_REQUEST. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(TRUE); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(alg, alglen); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pkblob, pklen); siglen = pktout.length - 5 + 4 + 20; len = 1; /* message type */ len += 4 + pklen; /* key blob */ len += 4 + siglen; /* data to sign */ len += 4; /* flags */ agentreq = smalloc(4 + len); PUT_32BIT(agentreq, len); q = agentreq + 4; *q++ = SSH2_AGENTC_SIGN_REQUEST; PUT_32BIT(q, pklen); q += 4; memcpy(q, pkblob, pklen); q += pklen; PUT_32BIT(q, siglen); q += 4; /* Now the data to be signed... Revision-number: 1007 Prop-content-length: 472 Content-length: 472 K 7 svn:log V 371 SSH2 channel fix: received WINDOW_ADJUSTs were always applied to the primary (shell session) channel, rather than the one they were aimed at. This _despite_ me having deliberately gone and looked the channel ID up in the B-tree - I was ignoring the result by accident :-/ X forwarding should now work in SSH2 even on non-trivial clients (ie things other than xdpyinfo). K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-16T12:09:44.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c11d870eadb1b7b89115acc11331f951 Text-delta-base-sha1: e1849e5c1c9e5d03c3770130b6d21fbadd1b3822 Text-content-length: 42 Text-content-md5: 80267295dfe6af63abaa3f87f8eb3d69 Text-content-sha1: bd79317e1affce937a88c722a7b9a6bed985daff Content-length: 83 K 15 cvs2svn:cvs-rev V 5 1.126 PROPS-END SVN[T T\c Revision-number: 1008 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:38.799236Z PROPS-END Revision-number: 1009 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:38.805985Z PROPS-END Revision-number: 1010 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2001-03-19T10:24:55.000000Z K 7 svn:log V 211 Add Norman Brandinger's suggested `-m' option in plink, to read the remote command from a local file. Advantage: you can have more than one line in it, so you can remotely run what's effectively a small script. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 689395dc1f51e75330805a31271f4cdb Text-delta-base-sha1: efab278c0b92ef7c9e8499c8c489fa2b9e9a2716 Text-content-length: 1120 Text-content-md5: c8b0bff19966067da3c46e6f533af041 Text-content-sha1: 98baac58f826ead1f8787f77f3092e18b7f0d273 Content-length: 1160 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN" :cYt4z(printf(" -m file read remote command(s) from filem") && argc > 1) { char *filename, *command; int cmdlen, cmdsize; FILE *fp; int c, d; --argc, filename = *++argv; cmdlen = cmdsize = 0; command = NULL; fp = fopen(filename, "r"); if (!fp) { fprintf(stderr, "plink: unable to open command " "file \"%s\"\n", filename); return 1; } do { c = fgetc(fp); d = c; if (c == EOF) d = 0; if (cmdlen >= cmdsize) { cmdsize = cmdlen + 512; command = srealloc(command, cmdsize); } command[cmdlen++] = d; } while (c != EOF); cfg.remote_cmd_ptr = command; cfg.nopty = TRUE; /* command => no terminal */_ptr Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8410a124a5bb2ccbb5b5c17fb24e65a7 Text-delta-base-sha1: e4362f447f914e4c526aafcec2c20603e3b38ff3 Text-content-length: 167 Text-content-md5: af833bb1e6e398603ab7293f22e9e165 Text-content-sha1: 28e391d8e1cc9800458fc343d6f395a658dad262 Content-length: 207 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVNOc sanchar *remote_cmd_ptr; /* might point to a larger command * but never for loading/saving */ Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 07b1b271d2df1ff210864dbaf926dbe3 Text-delta-base-sha1: 3beb65d56781b96cc3f119de2b1c51b4fb664ea2 Text-content-length: 73 Text-content-md5: 9aa5bce6a49f15ee0bd6acbc9c19f21e Text-content-sha1: d768b56776f7a24129fdc6d7461a4d64ee14cc03 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNLk*m?*xh/ cfg->remote_cmd_ptr = cfg->remote_cmd; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 80267295dfe6af63abaa3f87f8eb3d69 Text-delta-base-sha1: bd79317e1affce937a88c722a7b9a6bed985daff Text-content-length: 181 Text-content-md5: 7e895a40bc8cd4acc8529ec94bc2ee9a Text-content-sha1: e86ae69495017aca7da4977c536a20487744e23e Content-length: 222 K 15 cvs2svn:cvs-rev V 5 1.127 PROPS-END SVNIyI>:_ptr) send_packet(SSH1_CMSG_EXEC_CMD, PKT_STR, cfg.remote_cmd_ptrTh5 )"2mentlen)_ptr); } else if (*cfg.remote_cmd_ptr_ptr Revision-number: 1011 Prop-content-length: 355 Content-length: 355 K 8 svn:date V 27 2001-03-19T10:27:59.000000Z K 7 svn:log V 254 Plink in noninteractive-script mode should not show the `Authenticated with public key' message in SSH2 (it already doesn't in SSH1). It shouldn't show the login banner either, since its output is probably redirected to something which will choke on it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7e895a40bc8cd4acc8529ec94bc2ee9a Text-delta-base-sha1: e86ae69495017aca7da4977c536a20487744e23e Text-content-length: 1248 Text-content-md5: c108383cbdff1c24638bd8a5c6d35728 Text-content-sha1: 5a1e55254190da962eec03fee74192840b8ccca7 Content-length: 1289 K 15 cvs2svn:cvs-rev V 5 1.128 PROPS-END SVNuyuo /* * Don't show the banner if we're operating in * non-verbose non-interactive mode. (It's probably * a script, which means nobody will read the * banner _anyway_, and moreover the printing of * the banner will screw up processing on the * output of (say) plink.) */ if (flags & (FLAG_VERBOSE | FLAG_INTERACTIVE)) { ssh2_pkt_getstring(&banner, &size); if (banner) c_write_untrusted(banner, size); }h3 g(:.nection");/* service requested */ ssh2_pkt_addstring("publickey");/* method */ ssh2_pkt_addbool(FALSE); /* no signature included */ ssh2_pkt_send(); crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) { logevent("Key refused"); continue; } if (flags & FLAG_VERBOSE) { c_write_str("Authenticating with public key \""); c_write(commentp, commentlen); c_write_str("\" from agent\r\n"); } Revision-number: 1012 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:39.054355Z PROPS-END Revision-number: 1013 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:39.061477Z PROPS-END Revision-number: 1014 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:39.067593Z PROPS-END Revision-number: 1015 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:39.073708Z PROPS-END Revision-number: 1016 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:39.080488Z PROPS-END Revision-number: 1017 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:39.087378Z PROPS-END Revision-number: 1018 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:39.094334Z PROPS-END Revision-number: 1019 Prop-content-length: 310 Content-length: 310 K 8 svn:date V 27 2001-03-22T17:32:40.000000Z K 7 svn:log V 209 Remove the length limit on protocol version strings. (In principle, I could have got away with upping it to 256, but I didn't want a repeat of the chaos when some server accidentally breaks that limit too...) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c108383cbdff1c24638bd8a5c6d35728 Text-delta-base-sha1: 5a1e55254190da962eec03fee74192840b8ccca7 Text-content-length: 795 Text-content-md5: b2ca46f809f045899a42f01bc03af271 Text-content-sha1: 09ac1d42106cedb16aeaaa5f2e44c6aae0c6642d Content-length: 836 K 15 cvs2svn:cvs-rev V 5 1.129 PROPS-END SVN&&-lI+~p{ kvslen; static char version[10]; static char *vstring; static int vstrsize; static char *vlogvstring = smalloc(16); vstrsize = 16; strcpy(vstring, "SSH-"); vslen = 4; i = 0; while (1) { crReturn(1); /* get another char */ if (vslen >= vstrsize-1) { vstrsize += 16; vstring = srealloc(vstring, vstrsize); } vstring[vslen++]vstring[vslen] = 0; if (vslen > 80) vlog = smalloc(20 + vslen); else vlog = smalloc(100)sfree(vstring); sfree(vlog) ))wv _32BIT(p); p += 4; pkblob = p; p += pklen; alglen = GET_32BIT(pkblob); alg = pkblob + 4; commentlen = GET_32BIT(p); p += 4; commentp = p; p += commentlen; Revision-number: 1020 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2001-03-22T21:48:32.000000Z K 7 svn:log V 58 Remove needless redeclaration of word32 (it was in ssh.h) K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5b77ac032f8c8e4687af632db78bc411 Text-delta-base-sha1: b29148fde5ea185fdde487a1503187d82ef791bf Text-content-length: 23 Text-content-md5: 23ed5a4b7d05e6f3363431372fe9683f Text-content-sha1: 0bbb8ae3ebd0f252bcec1d2dda0abdd8b57ee45e Content-length: 62 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNt 9;W Revision-number: 1021 Prop-content-length: 413 Content-length: 413 K 8 svn:date V 27 2001-03-22T21:48:33.000000Z K 7 svn:log V 312 Following the recent advisory about attacks on PGP keys based on tampering with the unencrypted public part of the key but leaving the private part intact ... we are now ultra-paranoid about RSA key files, and we check that the public part matches the private part _before_ we generate any signatures with them. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c591f6bb48469dd74730a9213ed3f50a Text-delta-base-sha1: 061651994e952ef2b54475b0d62ff5141d2e4b26 Text-content-length: 617 Text-content-md5: fef1ac82ca5a00d7020e9b4ad6798317 Text-content-sha1: 1cedb0892df15bd491d90d88ab5638abd50f7396 Content-length: 657 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN[AI"1 !Gdata) { sfree(ret->comment); sfree(ret); ret = NULL; } Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7d392ae6ec8bf40b7a1c5709465da693 Text-delta-base-sha1: 1ed457ee3df89239cb636ca8536e822f4740b618 Text-content-length: 773 Text-content-md5: 3d1dcdbafcffbaa83b18c7429e49975f Text-content-sha1: 2b80b0f9fd04f1b479b1adc62120ce82e22a15a9 Content-length: 813 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN2bL#'HbnhJ/* * Verify that the public data in an RSA key matches the private * data. */ int rsa_verify(struct RSAKey *key) { Bignum n, ed, pm1, qm1, pm1qm1; int cmp; /* n must equal pq. */ n = bigmul(key->p, key->q); cmp = bignum_cmp(n, key->modulus); freebn(n); if (cmp != 0) return 0; /* e * d must be congruent to 1, modulo (p-1)(q-1). */ pm1 = copybn(key->p); decbn(pm1); qm1 = copybn(key->q); decbn(qm1); pm1qm1 = bigmul(pm1, qm1); freebn(pm1); freebn(qm1); ed = modmul(key->exponent, key->private_exponent, pm1qm1); sfree(pm1qm1); cmp = bignum_cmp(ed, One); sfree(ed); if (cmp != 0) return 0;if (!rsa_verify(rsa)) { rsa2_freekey(rsa); return NULL; } Revision-number: 1022 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2001-03-23T09:20:43.000000Z K 7 svn:log V 40 Fix a couple of silly compiler warnings K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 34a0a9093e32710b759a9e55c84df8f1 Text-delta-base-sha1: c19f3d663e86610c513d24f0ab0901aea4ca8fb1 Text-content-length: 36 Text-content-md5: 31f4579ddd0de397856cc52bba32c237 Text-content-sha1: fc3ebc4e48116dcb3181e71108a4db0d9a603b9c Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNg `int rsa_verify( Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d1dcdbafcffbaa83b18c7429e49975f Text-delta-base-sha1: 2b80b0f9fd04f1b479b1adc62120ce82e22a15a9 Text-content-length: 34 Text-content-md5: cb19a1ae19c1cf84808e3870243a2adc Text-content-sha1: d458f84c54067fdee39a44596a75142c28963e57 Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN. p1n return 1 Revision-number: 1023 Prop-content-length: 280 Content-length: 280 K 8 svn:date V 27 2001-03-23T10:28:36.000000Z K 7 svn:log V 179 Fix the SSH protocol version exchange, which had a weird stack trash in it which for some reason didn't show up when built with VC++6 but blew up the nightlies. Should be OK now. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b2ca46f809f045899a42f01bc03af271 Text-delta-base-sha1: 09ac1d42106cedb16aeaaa5f2e44c6aae0c6642d Text-content-length: 574 Text-content-md5: fde9b6adce4965c7b2bc66a43d2d575b Text-content-sha1: 7d7be15faaeb66946b7b53e74816207e4d1cfaeb Content-length: 615 K 15 cvs2svn:cvs-rev V 5 1.130 PROPS-END SVN q and that iqmp really is the inverse of q mod p). In addition, we _no longer_ check that e*d == 1 mod (p-1)(q-1): instead we do separate checks mod (p-1) and mod (q-1), since the order of the multiplicative group mod n is actually equal to lcm(p-1,q-1) rather than phi(n)=(p-1)(q-1). (In other words, the Fermat-Euler theorem doesn't point both ways.) K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-23T13:02:39.000000Z PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cb19a1ae19c1cf84808e3870243a2adc Text-delta-base-sha1: d458f84c54067fdee39a44596a75142c28963e57 Text-content-length: 862 Text-content-md5: 919bd392dc05315e78d3253f15c9178d Text-content-sha1: 3507d7537ac33f5ed17cbddd03e692c152752f5d Content-length: 902 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN.q>0SaHf We also check the private data itself: we ensure that p > * q and that iqmp really is the inverse of q mod p. */ int rsa_verify(struct RSAKey *key) { Bignum n, ed, pm1, and modulo (q-1). */ pm1 = copybn(key->p); decbn(pm1); ed = modmul(key->exponent, key->private_exponent, pm1); cmp = bignum_cmp(ed, One); sfree(ed); if (cmp != 0) return 0; qm1 = copybn(key->q); decbn(qm1); ed = modmul(key->exponent, key->private_exponent, qm1); cmp = bignum_cmp(ed, One); sfree(ed); if (cmp != 0) return 0; /* * Ensure p > q. */ if (bignum_cmp(key->p, key->q) <= 0) return 0; /* * Ensure iqmp * q is congruent to 1, modulo p. */ n = modmul(key->iqmp, key->q, key->p); cmp = bignum_cmp(n, One); sfree(n); if (cmp != 0) Revision-number: 1025 Prop-content-length: 300 Content-length: 300 K 8 svn:date V 27 2001-03-28T16:38:40.000000Z K 7 svn:log V 199 Oops. The new remote_cmd_ptr points in the wrong place when you copy a Config structure like plink does at one point. (I'm almost tempted to say this is where a copy constructor would be handy :-/ ) K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c8b0bff19966067da3c46e6f533af041 Text-delta-base-sha1: 98baac58f826ead1f8787f77f3092e18b7f0d273 Text-content-length: 159 Text-content-md5: dfc1ee753d8b6ddf597fb1d1a96db03b Text-content-sha1: 708a6ba403783cedf4e130e62db27b26cfbb2462 Content-length: 199 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN h Y  { cfg = cfg2; cfg.remote_cmd_ptr = cfg.remote_cmd; } Revision-number: 1026 Prop-content-length: 195 Content-length: 195 K 7 svn:log V 95 Fix the detect_bugs routine, which was failing to find the right bit of the version string :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2001-03-29T13:40:03.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fde9b6adce4965c7b2bc66a43d2d575b Text-delta-base-sha1: 7d7be15faaeb66946b7b53e74816207e4d1cfaeb Text-content-length: 151 Text-content-md5: bb3c8d2718badf16e990b61a2fa6b515 Text-content-sha1: 295ac254dad105a630e17d3bdda438de6d27d558 Content-length: 192 K 15 cvs2svn:cvs-rev V 5 1.131 PROPS-END SVNAA'/f (*imp) imp++; imp += strcspn(imp, "-"); if (*imp) imp++}'*} } pklen = GET_32BIT(p); p += 4; pkb Revision-number: 1027 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:39.619162Z PROPS-END Revision-number: 1028 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:39.626236Z PROPS-END Revision-number: 1029 Prop-content-length: 376 Content-length: 376 K 7 svn:log V 275 Default handling of VT100 line drawing characters in cut and paste is now to translate them into poor man's characters (+--+ and |). We also have an option to disable this (and map line drawing characters to the corresponding ASCII code as before). Thanks to Robert de Bath. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-09T11:59:35.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: af833bb1e6e398603ab7293f22e9e165 Text-delta-base-sha1: 28e391d8e1cc9800458fc343d6f395a658dad262 Text-content-length: 105 Text-content-md5: f62f26836b231c3c3025391a6a2c35e5 Text-content-sha1: 499411057e10048119f97b4b4fe5f101afde0aff Content-length: 145 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVNc7MBC.Azi#define CSET_MASK 0x00F00000UL /* mask for character set */int rawcnp Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9aa5bce6a49f15ee0bd6acbc9c19f21e Text-delta-base-sha1: d768b56776f7a24129fdc6d7461a4d64ee14cc03 Text-content-length: 75 Text-content-md5: ad0269e79f8c77e6ea77ef0bc3b79f98 Text-content-sha1: 015cea7108c7c6906ecba6918baa8c9eb1c4f398 Content-length: 115 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNkP0Y_H#RawCNP", cfg->rawcnp);RawCNP", 0, &cfg->rawcnp); Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1bfcf3e60352826af5b2d5882c06b8d6 Text-delta-base-sha1: 97b0be7dbf9394587c648137d16612b702545a30 Text-content-length: 680 Text-content-md5: 57f3e3546887f310b7edd0bb09d82db8 Text-content-sha1: 179ed64f57ef4eab1755ebc23014ceb5a3713ede Content-length: 720 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNrB4apr)I int ch = (*top & CHAR_MASK); int set = (*top & CSET_MASK); /* VT Specials -> ISO8859-1 for Cut&Paste */ static const unsigned if (set && !cfg.rawcnp) { if (set == ATTR_LINEDRW && ch >= 0x60 && ch < 0x7F) { int x; if ((x = poorman2[2*(ch-0x60)+1]) == ' ') x = 0; ch = (x<<8) + poorman2[2*(ch-0x60)]; } } while(ch != 0) { if (cfg.rawcnp || !!(ch&0xE0)) { if ( wblen == buflen ) { workbuf = srealloc(workbuf, buflen += 100); wbptr = workbuf + wblen; } wblen++; *wbptr++ = (unsigned char) ch; } ch>>=8; } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 77901efcd950277fa91289a0d9016ef2 Text-delta-base-sha1: fd416657152862b510f6b7dacd485f3e9fb2938d Text-content-length: 510 Text-content-md5: 82313c6de317d38deb42081691c21328 Text-content-sha1: 503ba39a488b93bbb5a613f1be6afe6e2c3aa839 Content-length: 551 K 15 cvs2svn:cvs-rev V 5 1.115 PROPS-END SVNmw:6wmdwT_9)jh~p `BOX_SELECTION3IDC_RAWCNPCheckDlgButton (hwnd, IDC_RAWCNP, cfg.rawcnpd wx hstOptions controlling copy and paste", IDC_TITLE_SELECTION); beginbox(&cp, "Translation of pasted characters", IDC_BOX_SELECTION1); checkbox(&cp, "&Don't translate line drawing chars into +, - and |", IDC_RAWCNP); endbox(&cp23RAWCNP: cfg.rawcnp = IsDlgButtonChecked (hwnd, IDC_RAWCNP) Revision-number: 1030 Prop-content-length: 220 Content-length: 220 K 8 svn:date V 27 2001-04-09T12:23:45.000000Z K 7 svn:log V 119 The About box now contains a button that starts up a browser pointing at the PuTTY web site. Thanks to Eric Theriault. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 715a5737dc75758303b86b58f01c7b3a Text-delta-base-sha1: c6fd160668d29488dea08b2cb9d3f0b2f458eaf6 Text-content-length: 37 Text-content-md5: eb0a01167f8d7c4f3e29e195537da77c Text-content-sha1: 6db1f4dafce011e082a28702251666e180af8711 Content-length: 77 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVNe   `LIBS3LIBS3 Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 36632719c2bf16b0fbc3d917cb9592c2 Text-delta-base-sha1: 9321fd3fb6727907b30f2c1c1c0f905743dc1690 Text-content-length: 49 Text-content-md5: d55dc5d7d73fa2d8175914a86c774418 Text-content-sha1: 44032a6d31897c05944882f3d62d42624aa56121 Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNd -8,#define IDA_WEB 1006 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9857cdf5f4939aa748366dba3a24807f Text-delta-base-sha1: 8fb56ce8df104da3080ddb030346625c36e4f0df Text-content-length: 341 Text-content-md5: 3f94d98ed0c89818c1364bd376f454cd Text-content-sha1: d15b36e6f30f868cbc35b7780d2a54c67b2d4f88 Content-length: 381 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVN(d.xC}CL>llanswerbacks (sesskey, "Answerback", "PuTTY", cfg->answerback, sizeof(cfg->answerback) Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 57f3e3546887f310b7edd0bb09d82db8 Text-delta-base-sha1: 179ed64f57ef4eab1755ebc23014ceb5a3713ede Text-content-length: 892 Text-content-md5: fb92f330c3ad68b51e9f45b0667bc9f0 Text-content-sha1: 914103822ded8f8f799cff2bf9c433b8a1c43fd3 Content-length: 932 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNB_C_]eANSIMIN); { char abuf[256], *s, *d; int state=0; for(s=cfg.answerback, d=abuf; *s; s++) { if (state) { if (*s >= 'a' && *s <= 'z') *d++ = (*s - ('a'-1)); else if ((*s >='@' && *s<='_') || *s == '?' || (*s&0x80)) *d++ = ('@'^*s); else if (*s == '~') *d++ = '^'; state = 0; } else if (*s == '^') { state = 1; } else *d++ = xlat_kbd2tty((unsigned char)*s); } ldisc_send (abuf, d-abuf); } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5459b1395d4d80194c83885dc49e9aac Text-delta-base-sha1: 511481078b24e9be61711b34f8b408d560031e78 Text-content-length: 405 Text-content-md5: 80dab68e717bda7c7c761f1582ed4ae8 Text-content-sha1: 101682b6a227ef042ea90ffc918354dab9a0f75d Content-length: 446 K 15 cvs2svn:cvs-rev V 5 1.117 PROPS-END SVNoq/X9Dw:!Zr8pTANSWERBACK, IDC_ANSWEREDISetDlgItemText (hwnd, IDC_ANSWEREDIT, cfg.answerbacksmultiedit(&cp, "An&swerback to ^E:", IDC_ANSWERBACK, IDC_ANSWEREDIT, 100, NULL case IDC_ANSWEREDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_ANSWEREDIT, cfg.answerback, sizeof(cfg.answerback)-1); Revision-number: 1032 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2001-04-09T12:46:45.000000Z K 7 svn:log V 121 Don't assume OEM fonts have a space in position 255. We know there's one in position 32 so let's use that! (Thanks RDB.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8ea94fb1bdc5f9a1240bc6f11f60b0d1 Text-delta-base-sha1: 87d872e5193428540a5ca9c201d8585d576859c5 Text-content-length: 28 Text-content-md5: 946fc60844c56dcf16a0b12ddeb14379 Text-content-sha1: 05bb1578666b77f3ad90202549c5280238e0a2b8 Content-length: 69 K 15 cvs2svn:cvs-rev V 5 1.111 PROPS-END SVNXX ;20 Revision-number: 1033 Prop-content-length: 305 Content-length: 305 K 8 svn:date V 27 2001-04-09T12:52:43.000000Z K 7 svn:log V 204 Keyboard handling patch from RDB: the Windows Application key is now always Compose (we have no better use for it), and Ctrl-Alt can be made to act like AltGr (but it's never Compose even when AltGr is). K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 494227e84d8956825b74aff09bdedbef Text-delta-base-sha1: e4d4482ca0600ba6e04625e8cc7733f840190743 Text-content-length: 36 Text-content-md5: bdf2b52c101ba4dd9f45d8dfcf0c8677 Text-content-sha1: 3385b393cd11e181980bc82f51835596db4aec97 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.87 PROPS-END SVNQf U|int ctrlaltkeys Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd1fa947d559ff20b04e689bdc47eb64 Text-delta-base-sha1: d18aee050e73fd1344f5ca8503a7058f2412e21d Text-content-length: 91 Text-content-md5: 6bab3b23d2c6943857e073317eec8cb1 Text-content-sha1: 799ab1e6397defdecf2dc206d34603c1c5720efb Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNc\@nL,7CtrlAltKeys", cfg->ctrlaltkeysCtrlAltKeys", 1, &cfg->ctrlaltkeys Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 80dab68e717bda7c7c761f1582ed4ae8 Text-delta-base-sha1: 101682b6a227ef042ea90ffc918354dab9a0f75d Text-content-length: 368 Text-content-md5: a3bcc1259b60f7de92e9cf7f4e2baf20 Text-content-sha1: 4e3db488bd70abbe37cc840d14c9c4235fa86195 Content-length: 409 K 15 cvs2svn:cvs-rev V 5 1.118 PROPS-END SVNqH4.DD>ZvP:i*;]P@t}IDC_CTRLALTKEYSDlgButton (hwnd, IDC_CTRLALTKEYS, cfg.ctrlaltkeysunpymietdltGr ac&ts as Compose key", IDC_COMPOSEKEY); checkbox(&cp, "Control-Alt is &different from AltGr", IDC_CTRLALTKEYSCTRLALTKEYS cfg.ctrlaltkeys = IsDlgButtonChecked (hwnd, IDC_CTRLALTKEYS Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 946fc60844c56dcf16a0b12ddeb14379 Text-delta-base-sha1: 05bb1578666b77f3ad90202549c5280238e0a2b8 Text-content-length: 943 Text-content-md5: 8114d0b172bf13c5469902842e1f4398 Text-content-sha1: 9cb98c514a51b41c09832ca3be6161ba8b56b590 Content-length: 984 K 15 cvs2svn:cvs-rev V 5 1.112 PROPS-END SVNX ,u 8-lSS8 unless told. */ if (left_alt && (keystate[VK_CONTROL]&0x80)) { if (cfg.ctrlaltkeys) keystate[VK_MENU] = 0; else { keystate[VK_RMENU] = 0x80; left_alt = 0; } }Note if AltGr was pressed and if it was used as a compose key */ if (!compose_state) { compose_key = -1; if (cfg.compose_key) { if (wParam == VK_MENU && (HIWORD(lParam)&KF_EXTENDED)) compose_key = wParam; } if (wParam == VK_APPS) compose_key = wParam; } if (wParam == compose_key) { if (compose_state == 0 && (HIWORD(lParam)&(KF_UP|KF_REPEAT))==0) compose_state = 1; else if (compose_state == 1 && (HIWORD(lParam)&KF_UP)) compose_state = 2; else compose_state = 0; } else if (compose_state==1 && wParam != VK_CONTROL) compose_state = 0if (wParam == VK_PAUSE) /* Break/Pause */ { *p++ = 26; *p++ = 0; return -2 else alt_state = 0; Revision-number: 1034 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:40.171346Z PROPS-END Revision-number: 1035 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:40.177726Z PROPS-END Revision-number: 1036 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2001-04-11T10:03:46.000000Z K 7 svn:log V 90 Jordan Russell's patch to match the PuTTY cursor blink rate to the system-configured one. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fb92f330c3ad68b51e9f45b0667bc9f0 Text-delta-base-sha1: 914103822ded8f8f799cff2bf9c433b8a1c43fd3 Text-content-length: 166 Text-content-md5: b307da3977ae1e8f457c8bd3f6c98146 Text-content-sha1: 437c20b6ed5c06f99b87dcb7b3389fd4ad7d7527 Content-length: 206 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN/u(`q static long last_blink = 0; faster than GetCaretBlinkTime() */ if (blink_diff>=0 && blink_diff<(long)GetCaretBlinkTime() Revision-number: 1037 Prop-content-length: 230 Content-length: 230 K 8 svn:date V 27 2001-04-11T12:29:35.000000Z K 7 svn:log V 129 Experimental checkin to see if we can prevent multiple closes ever being sent on an SSH1 forwarding (or indeed primary) channel. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bb3c8d2718badf16e990b61a2fa6b515 Text-delta-base-sha1: 295ac254dad105a630e17d3bdda438de6d27d558 Text-content-length: 131 Text-content-md5: 3f6f81588355c2964689b2e41ab4f413 Text-content-sha1: 52d4834eb5ecea5450b973c889c9fcdf533c4940 Content-length: 172 K 15 cvs2svn:cvs-rev V 5 1.132 PROPS-END SVN " Tvif (!(c->closes & closetype)) ']6'f, "Trying Pageant key #%d", i); logevent(buf); Revision-number: 1038 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2001-04-13T09:39:08.000000Z K 7 svn:log V 36 Some introductory blurb in the docs K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 90074e30e020e0cdb160288a9e669971 Text-delta-base-sha1: 5babbefa8b44f5a1a7f03acb6417d839da34b467 Text-content-length: 4055 Text-content-md5: 06ed6575e479029d9550e02447e44f83 Text-content-sha1: 949c52d7946aa25a83bf95ae15b77e53192574d6 Content-length: 4094 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN8HHH\C{intro} Introduction to PuTTY PuTTY is a free SSH, Telnet and Rlogin client for 32-bit Windows systems. \H{you-what} What are SSH, Telnet and Rlogin? If you already know what SSH, Telnet and Rlogin are, you can safely skip on to the next section. SSH, Telnet and Rlogin are three ways of doing the same thing: logging in to a multi-user computer from another computer, over a network. Multi-user operating systems, such as Unix and VMS, usually present a command-line interface to the user, much like the \q{Command Prompt} or \q{MS-DOS Prompt} in Windows. The system prints a prompt, and you type commands which the system will obey. Using this type of interface, there is no need for you to be sitting at the same machine you are typing commands to. The commands, and responses, can be sent over a network, so you can sit at one computer and give commands to another one, or even to more than one. SSH, Telnet and Rlogin are \e{network protocols} that allow you to do this. On the computer you sit at, you run a \e{client}, which makes a network connection to the other computer (the \e{server}). The network connection carries your keystrokes and commands from the client to the server, and carries the server's responses back to you. These protocols can also be used for other types of keyboard-based interactive session. In particular, there are a lot of bulletin boards, talker systems and MUDs (Multi-User Dungeons) which support access using Telnet. There are even a few that support SSH. You might want to use SSH, Telnet or Rlogin if: \b you have an account on a Unix or VMS system which you want to be able to access from somewhere else \b your Internet Service Provider provides you with a login account on a web server. (This might also be known as a \e{shell account}. A \e{shell} is the program that runs on the server and interprets your commands for you.) \b you want to use a bulletin board system, talker or MUD which can be accessed using Telnet. You probably do \e{not} want to use SSH, Telnet or Rlogin if: \b you only use Windows machines. Windows machines have their own ways of networking between themselves, and unless you are doing something fairly unusual, you will not need to use any of these remote login protocols. \H{which-one} How do SSH, Telnet and Rlogin differ? This list summarises some of the differences between SSH, Telnet and Rlogin. \b SSH is a recently designed, high-security protocol. It uses strong cryptography to protect your connection against eavesdropping, hijacking and other attacks. Telnet and Rlogin are both older protocols offering minimal security. \b Telnet allows you to pass some settings on to the server, such as environment variables. (These control various aspects of the server's behaviour. You can usually set them by entering commands into the server once you're connected, but it's easier to have Telnet do it automatically.) SSH and Rlogin do not support this. However, most modern Telnet servers don't allow it either, because it has been a constant source of security problems. \b SSH and Rlogin both allow you to log in to the server without having to type a password. (Rlogin's method of doing this is insecure, and can allow an attacker to access your account on the server. SSH's method is much more secure, and typically requires the attacker to have gained access to your actual client machine.) \b SSH allows you to connect to the server and automatically send a command, so that the server will run that command and then disconnect. So you can use it in automated processing. The Internet is a hostile environment and security is everybody's responsibility. If you are connecting across the open Internet, then we recommend you use SSH. If the server you want to connect to doesn't support SSH, it might be worth trying to persuade the administrator to install it. If you are behind a good firewall, it is more likely to be safe to use Telnet or Rlogin, but we still recommend you use SSH. \# perhaps a section on terminal emulation? Revision-number: 1039 Prop-content-length: 330 Content-length: 330 K 8 svn:date V 27 2001-04-13T10:52:36.000000Z K 7 svn:log V 229 New improved bell handling. Choice between visual and audible bell; configurable bell overload handling. Thanks to Robert de Bath for galvanising me into doing this, but I've had to rip most of his code out and redo it myself... K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bdf2b52c101ba4dd9f45d8dfcf0c8677 Text-delta-base-sha1: 3385b393cd11e181980bc82f51835596db4aec97 Text-content-length: 385 Text-content-md5: 7b5d6859571cd5da1b7df851585e4988 Text-content-sha1: d926b3917e18e0c5054fbbfbf668f2619fd414f0 Content-length: 425 K 15 cvs2svn:cvs-rev V 4 1.88 PROPS-END SVNfWc!x@Min_vbell; GLOBAL long vbell_timeout /* 0=none 1=defaultsound 2=visual */ int bellovl; /* bell overload protection active? */ int bellovl_n; /* number of bells to cause overload */ int bellovl_t; /* time interval for overload (seconds) */ int bellovl_s; /* period of silence to re-enable bell (s) */ Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6bab3b23d2c6943857e073317eec8cb1 Text-delta-base-sha1: 799ab1e6397defdecf2dc206d34603c1c5720efb Text-content-length: 454 Text-content-md5: fcf3f25a5f64dc8409ca1f457317331b Text-content-sha1: 14d4d95629dd2bfce608244e60ff06c69cb503c4 Content-length: 494 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN\:%[3nJR BellOverload", cfg->bellovl); write_setting_i (sesskey, "BellOverloadN", cfg->bellovl_n); write_setting_i (sesskey, "BellOverloadT", cfg->bellovl_t); write_setting_i (sesskey, "BellOverloadS", cfg->bellovl_sBellOverload", 1, &cfg->bellovl); gppi (sesskey, "BellOverloadN", 5, &cfg->bellovl_n); gppi (sesskey, "BellOverloadT", 2, &cfg->bellovl_t); gppi (sesskey, "BellOverloadS", 5, &cfg->bellovl_s Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b307da3977ae1e8f457c8bd3f6c98146 Text-delta-base-sha1: 437c20b6ed5c06f99b87dcb7b3389fd4ad7d7527 Text-content-length: 2696 Text-content-md5: 925126d11022928de47b9d6eeac045d7 Text-content-sha1: b752e23eebb9b41bfc30dcb579a928a04207c948 Content-length: 2736 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN/5?;3h'1kRa*;&>j< yI" #define VBELL_TIMEOUT 100 /* millisecond duration of visual bell */ struct beeptime { struct beeptime *next; long ticks; }; static struct beeptime *beephead, *beeptail; int nbeeps; int beep_overloaded; long lastbeep;in_vbell = FALSE beephead = beeptail = NULL; nbeeps = 0; lastbeep = FALSE; beep_overloaded = FALSE{ struct beeptime *newbeep; long ticks; ticks = GetTickCount(); debug(("beep received at %ld, last was %ld, nbeeps=%d\n", ticks, lastbeep, nbeeps)); if (!beep_overloaded) { newbeep = smalloc(sizeof(struct beeptime)); newbeep->ticks = ticks; newbeep->next = NULL; if (!beephead) beephead = newbeep; else beeptail->next = newbeep; beeptail = newbeep; nbeeps++; } /* * Throw out any beeps that happened more than * t seconds ago. */ while (beephead && beephead->ticks < ticks - cfg.bellovl_t*1000) { struct beeptime *tmp = beephead; beephead = tmp->next; debug(("throwing out beep received at %ld\n", tmp->ticks)); sfree(tmp); if (!beephead) beeptail = NULL; nbeeps--; } if (cfg.bellovl && beep_overloaded && ticks-lastbeep >= cfg.bellovl_s * 1000) { /* * If we're currently overloaded and the * last beep was more than s seconds ago, * leave overload mode. */ debug(("silence reigns, leaving overload mode\n")); beep_overloaded = FALSE; } else if (cfg.bellovl && !beep_overloaded && nbeeps >= cfg.bellovl_n) { /* * Now, if we have n or more beeps * remaining in the queue, go into overload * mode. */ debug(("%d beeps between times %ld and %ld, overload!\n", nbeeps, beephead->ticks, ticks)); beep_overloaded = TRUE; } lastbeep = ticks; /* * Perform an actual beep if we're not overloaded. */ if ((!cfg.bellovl || !beep_overloaded) && cfg.beep != 0) { debug(("not overloaded; performing a beep\n")); if (cfg.beep != 2) beep(cfg.beep); else if(cfg.beep == 2) { in_vbell = TRUE; vbell_timeout = ticks + VBELL_TIMEOUT; term_update(); } } disptop = scrtop; } long ticks; /* * Check the visual bell state. */ if (in_vbell) { ticks = GetTickCount(); if (ticks - vbell_timeout >= 0) in_vbell = FALSE; } /* Depends on: * screen array, disptop, scrtop, * selection, rv, * cfg.blinkpc, blink_is_real, tblinker, * curs_y, curs_x, blinker, cfg.blink_cur, cursor_on, has_focus */ cursor = 0; rv = (!rvideo ^ !in_vbell Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a3bcc1259b60f7de92e9cf7f4e2baf20 Text-delta-base-sha1: 4e3db488bd70abbe37cc840d14c9c4235fa86195 Text-content-length: 2794 Text-content-md5: 7f158de5ff32eaa903c936f97006e1c6 Text-content-sha1: d18b966ff374adfde4548b625af857645f552ee0 Content-length: 2835 K 15 cvs2svn:cvs-rev V 5 1.119 PROPS-END SVNHpom onNqq :IIw>u7Kw>O;i1-rP?RW?#%TITLE_LOGGINGbellpanelstart, IDC_TITLE_BELL, IDC_BOX_BELL1, IDC_BOX_BELL2, IDC_BELLSTATIC, IDC_BELL_DISABLED, IDC_BELL_DEFAULT, IDC_BELL_VISUAL, IDC_BELLOVL, IDC_BELLOVLNSTATIC, IDC_BELLOVLN, IDC_BELLOVLTSTATIC, IDC_BELLOVLT, IDC_BELLOVLEXPLAIN, IDC_BELLOVLSSTATIC, IDC_BELLOVLS, belRadioButton (hwnd, IDC_BELL_DISABLED, IDC_BELL_VISUAL, cfg.beep==0 ? IDC_BELL_DISABLED : cfg.beep==1 ? IDC_BELL_DEFAULT : IDC_BELL_VISUAL); CheckDlgButton (hwnd, IDC_BELLOVL, cfg.bellovl); SetDlgItemInt (hwnd, IDC_BELLOVLN, cfg.bellovl_n, FALSE); SetDlgItemInt (hwnd, IDC_BELLOVLT, cfg.bellovl_t, FALSE); SetDlgItemInt (hwnd, IDC_BELLOVLS, cfg.bellovl_s, FALSE); LOGGINGen htsbellpanelstart) { /* The Bell panel. Accelerators used: [acgo] bdsmterminal bell", IDC_TITLE_BELL); beginbox(&cp, "Set the style of bell", IDC_BOX_BELL1); radiobig(&cp, "Action to happen when a &bell occurs:", IDC_BELLSTATIC, "None (bell disabled)", IDC_BELL_DISABLED, "Play Windows Default Sound", IDC_BELL_DEFAULT, "Visual bell (flash window)", IDC_BELL_VISUAL, NULL); endbox(&cp); beginbox(&cp, "Control the bell overload behaviour", IDC_BOX_BELL2); checkbox(&cp, "Bell is temporarily &disabled when over-used", IDC_BELLOVL); staticedit(&cp, "Over-use means this &many bells...", IDC_BELLOVLNSTATIC, IDC_BELLOVLN, 20); staticedit(&cp, "... in this many &seconds", IDC_BELLOVLTSTATIC, IDC_BELLOVLT, 20); statictext(&cp, "The bell is re-enabled after a few seconds of silence.", IDC_BELLOVLEXPLAIN); staticedit(&cp, "Seconds of silence required", IDC_BELLOVLSSTATIC, IDC_BELLOVLS, 201, "BellBell")) create_controls(hwnd, dlgtype, belLL_DISABLED: case IDC_BELL_DEFAULT: case IDC_BELL_VISUAL { if (LOWORD(wParam)==IDC_BELL_DISABLED) cfg.beep = 0; if (LOWORD(wParam)==IDC_BELL_DEFAULT) cfg.beep = 1; if (LOWORD(wParam)==IDC_BELL_VISUAL) cfg.beep = 2; } break; case IDC_BELLOVLbellovl = IsDlgButtonChecked (hwnd, IDC_BELLOVL); break; case IDC_BELLOVLN: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_BELLOVLN, &cfg.bellovl_n); break; case IDC_BELLOVLT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_BELLOVLT, &cfg.bellovl_t); break; case IDC_BELLOVLS: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_BELLOVLS, &cfg.bellovl_s); Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8114d0b172bf13c5469902842e1f4398 Text-delta-base-sha1: 9cb98c514a51b41c09832ca3be6161ba8b56b590 Text-content-length: 255 Text-content-md5: f3ed0e9ab41ced0d7ce4d3ee7cd00e88 Text-content-sha1: e5e371b682c0499e902382e217446bbe2d0c6f88 Content-length: 296 K 15 cvs2svn:cvs-rev V 5 1.113 PROPS-END SVN ZZz quin_vbell) /* Hmm, term_update didn't want to do an update too soon ... */ timer_id = SetTimer(hwnd, 1, 50, NULL); elsearently unnecessary wait heremode) { if (mode == 1) MessageBeep(MB_OK); } Revision-number: 1040 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2001-04-13T11:01:56.000000Z K 7 svn:log V 36 Oops - remove rogue debug messages! K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 925126d11022928de47b9d6eeac045d7 Text-delta-base-sha1: b752e23eebb9b41bfc30dcb579a928a04207c948 Text-content-length: 49 Text-content-md5: 6ebd13004b9f0bd518c77ab084c16549 Text-content-sha1: df823712e0b8b771548a931e6be1ab202b2edb6c Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVN5]$Aq)Cc IfV_ Revision-number: 1041 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2001-04-14T11:37:47.000000Z K 7 svn:log V 43 Bell can now play an arbitrary sound file. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7b5d6859571cd5da1b7df851585e4988 Text-delta-base-sha1: d926b3917e18e0c5054fbbfbf668f2619fd414f0 Text-content-length: 136 Text-content-md5: 29a6a38916e107af8eb9e9bda236a4f0 Text-content-sha1: 7b05f7cec7f3b06bacef6e72a3e2d517100f830e Content-length: 176 K 15 cvs2svn:cvs-rev V 4 1.89 PROPS-END SVNWlAKxM enum { BELL_DISABLED, BELL_DEFAULT, BELL_VISUAL, BELL_WAVEFILE } beep;char bell_wavefile[FILENAME_MAX]; Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fcf3f25a5f64dc8409ca1f457317331b Text-delta-base-sha1: 14d4d95629dd2bfce608244e60ff06c69cb503c4 Text-content-length: 157 Text-content-md5: ce0342bdc79e1d65d792c1a4c612d574 Text-content-sha1: 5e4d0dae5b158b7ac752a1cf6a3a02ff68a63419 Content-length: 197 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN:X#nQ3s (sesskey, "BellWaveFile", cfg->bell_wavefiles (sesskey, "BellWaveFile", "", cfg->bell_wavefile, sizeof(cfg->bell_wavefile) Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7f158de5ff32eaa903c936f97006e1c6 Text-delta-base-sha1: d18b966ff374adfde4548b625af857645f552ee0 Text-content-length: 1507 Text-content-md5: 7773ab0b21e2b32f6e6834703da5df6e Text-content-sha1: 1c7a83f36897b29983c0d3f61d3725927011a3ed Content-length: 1548 K 15 cvs2svn:cvs-rev V 5 1.120 PROPS-END SVNpqP"fj(NbP7iIU@9{!%6:WAVEFILE, IDC_BELL_VISUAL, IDC_BELL_WAVESTATIC, IDC_BELL_WAVEEDIT, IDC_BELL_WAVEBROWSEBELL_DISABLED ? IDC_BELL_DISABLED : cfg.beep==BELL_DEFAULT ? IDC_BELL_DEFAULT : cfg.beep==BELL_WAVEFILE ? IDC_BELL_WAVEFILE : cfg.beep==BELL_VISUAL ? IDC_BELL_VISUAL : IDC_BELL_DEFAULT); SetDlgItemText (hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefilewPlay a custom sound file", IDC_BELL_WAVEFILE, "Visual bell (flash window)", IDC_BELL_VISUAL, NULL); editbutton(&cp, "Custom sound file to play as a bell:", IDC_BELL_WAVESTATIC, IDC_BELL_WAVEEDIT, "Bro&wse...", IDC_BELL_WAVEBROWSEWAVEFILE: case IDC_BELL_VISUALif (LOWORD(wParam)==IDC_BELL_DISABLED) cfg.beep = BELL_DISABLED; if (LOWORD(wParam)==IDC_BELL_DEFAULT) cfg.beep = BELL_DEFAULT; if (LOWORD(wParam)==IDC_BELL_WAVEFILE) cfg.beep = BELL_WAVEFILE; if (LOWORD(wParam)==IDC_BELL_VISUAL) cfg.beep = BELL_VISUAL; } break; case IDC_BELL_WAVEBROWSEWave Files\0*.WAV\0Allbell_wavefilBell Sound File"; of.Flags = 0; if (GetOpenFileName(&of)) { strcpy(cfg.bell_wavefile, filename); SetDlgItemText (hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile); } break; case IDC_BELL_WAVEEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText (hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile, sizeof(cfg.bell_wavefile)-1); Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f3ed0e9ab41ced0d7ce4d3ee7cd00e88 Text-delta-base-sha1: e5e371b682c0499e902382e217446bbe2d0c6f88 Text-content-length: 441 Text-content-md5: 3c4a7c2428b095af397da3213cf6779f Text-content-sha1: b603c79cbe3253bcfa808e2c5cf908e61835385b Content-length: 482 K 15 cvs2svn:cvs-rev V 5 1.114 PROPS-END SVNZc#@#BELL_DEFAULT) { MessageBeep(MB_OK); } else if (mode == BELL_WAVEFILE) { if (!PlaySound(cfg.bell_wavefile, NULL, SND_ASYNC | SND_FILENAME)) { char buf[sizeof(cfg.bell_wavefile)+80]; sprintf(buf, "Unable to play sound file\n%s\n" "Using default sound instead", cfg.bell_wavefile); MessageBox(hwnd, buf, "PuTTY Sound Error", MB_OK | MB_ICONEXCLAMATION); cfg.beep = BELL_DEFAULT; } } } Revision-number: 1042 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2001-04-16T07:49:11.000000Z K 7 svn:log V 114 After we fall back to 3DES, double-check the server really does support it, and bomb out with a complaint if not. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3f6f81588355c2964689b2e41ab4f413 Text-delta-base-sha1: 52d4834eb5ecea5450b973c889c9fcdf533c4940 Text-content-length: 396 Text-content-md5: b58151d6b290ea6deab2cc186230fe80 Text-content-sha1: 32f2db0a5396577ee1d48dfc65e4b53f366f5dbd Content-length: 437 K 15 cvs2svn:cvs-rev V 5 1.133 PROPS-END SVN-M-L if ((supported_ciphers_mask & (1 << cipher_type)) == 0) { bombout(("Server violates SSH 1 protocol by " "not supporting 3DES encryption")); crReturn(0); }] ..] char *pkblob, *alg, *commentp; static int pklen, alglen, commentlen; static int siglen, retlen, len; static char *q, *agentreq, *ret; { char buf[64]; sprintf(bu Revision-number: 1043 Prop-content-length: 257 Content-length: 257 K 7 svn:log V 156 Log the text message in SSH_MSG_DISCONNECT (both protocols) so that when people submit Event Logs for diagnosis it's a little easier to work out what's up. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-16T09:10:34.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b58151d6b290ea6deab2cc186230fe80 Text-delta-base-sha1: 32f2db0a5396577ee1d48dfc65e4b53f366f5dbd Text-content-length: 4201 Text-content-md5: bf30d4da9f8c52c3db4669bbfc8a978b Text-content-sha1: 62ba8f3cd9f422f481980098dc6e728fd3b60bea Content-length: 4242 K 15 cvs2svn:cvs-rev V 5 1.134 PROPS-END SVN& Tv vMs1a:L#define SSH2_DISCONNECT_TOO_MANY_CONNECTIONS 12 /* 0xc */ #define SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER 13 /* 0xd */ #define SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14 /* 0xe */ #define SSH2_DISCONNECT_ILLEGAL_USER_NAME 15 /* 0xf */ static const char *const ssh2_disconnect_reasons[] = { NULL, "SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT", "SSH_DISCONNECT_PROTOCOL_ERROR", "SSH_DISCONNECT_KEY_EXCHANGE_FAILED", "SSH_DISCONNECT_HOST_AUTHENTICATION_FAILED", "SSH_DISCONNECT_MAC_ERROR", "SSH_DISCONNECT_COMPRESSION_ERROR", "SSH_DISCONNECT_SERVICE_NOT_AVAILABLE", "SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED", "SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE", "SSH_DISCONNECT_CONNECTION_LOST", "SSH_DISCONNECT_BY_APPLICATION", "SSH_DISCONNECT_TOO_MANY_CONNECTIONS", "SSH_DISCONNECT_AUTH_CANCELLED_BY_USER", "SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE", "SSH_DISCONNECT_ILLEGAL_USER_NAME", };if (pktin.type == SSH1_MSG_DISCONNECT) { /* log reason code in disconnect message */ char buf[256]; int msglen = GET_32BIT(pktin.body); int nowlen; strcpy(buf, "Remote sent disconnect: "); nowlen = strlen(buf); if (msglen > sizeof(buf)-nowlen-1) msglen = sizeof(buf)-nowlen-1; memcpy(buf+nowlen, pktin.body+4, msglen); buf[nowlen+msglen] = '\0'; logevent(buf)if (pktin.type == SSH2_MSG_DISCONNECT) { /* log reason code in disconnect message */ char buf[256]; int reason = GET_32BIT(pktin.data+6); int msglen = GET_32BIT(pktin.data+10); int nowlen; if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) { sprintf(buf, "Received disconnect message (%s)", ssh2_disconnect_reasons[reason]); } else { sprintf(buf, "Received disconnect message (unknown type %d)", reason); } logevent(buf); strcpy(buf, "Disconnection message text: "); nowlen = strlen(buf); if (msglen > sizeof(buf)-nowlen-1) msglen = sizeof(buf)-nowlen-1; memcpy(buf+nowlen, pktin.data+14, msglen); buf[nowlen+msglen] = '\0'; logevent(buf); } crReturnV ' t tried a public key _offer_, * the message should be "Server refused our * key" (or no message at all if the key * came from Pageant) * * - if we'd just tried anything else, the * message really should be "Access denied". * * Additionally, if we'd just tried password * authentication, we should break out of this * whole loop so as to go back to the username * prompt. */ if (type == AUTH_TYPE_NONE) { /* do nothing */ } else if (type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD || type == AUTH_TYPE_PUBLICKEY_OFFER_QUIET) { if (type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD) c_write_str("Server refused our key\r\n"); logevent("Server refused public key"); } else { c_write_str("Access denied\r\n"); logevent("Access denied"); if (type == AUTH_TYPE_PASSWORD) { we_are_in = FALSE; break; } } } else { c_write_str("Further authentication required\r\n"); logevent("Further authentication required"); } can_pubkey = in_commasep_string("publickey", methods, methlen); can_passwd = in_commasep_string("password", methods, methlen); } method = 0; if (!method && can_pubkey && agent_exists && !tried_agent) { /* * Attempt public-key authentication using Pageant. */ static unsigned char request[5], *response, *p; static int responselen; static int i, nkeys; static int authed = FALSE; void *r; tried_agent = TRUE; logevent("Pageant is running. Requesting keys."); /* Request the keys held by the agent. */ PUT_32BIT(request, 1); request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; agent_query(request, 5, &r, &responselen); response = (unsigned char *)r; if (response && responselen >= 5 && response[4] == SSH2_AGENT_IDENTITIES_ANSWER) { p = response + 5; nkeys = GET_32BIT(p); p += 4; { char buf[64]; sprintf(buf, "Pageant has %d SSH2 keys", nkeys); logevent(buf); } for (i = 0; i < nkeys; i++) { static Revision-number: 1044 Prop-content-length: 689 Content-length: 689 K 7 svn:log V 588 Pageant interface changes. You can now do `pageant -c command' to spawn another command after starting Pageant. Also, if Pageant is already running, `pageant keyfile' and `pageant -c command' will do the Right Thing, that is, add the key to the _first_ Pageant and/or run a command and then exit. The only time you now get the `Pageant is already running' error is if you try to start the second copy with no arguments. NB the affected files in this checkin are rather wide-ranging because I renamed the not really SSH1-specific `ssh1_bignum_bitcount' function to just `bignum_bitcount'. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-16T11:16:58.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eb0a01167f8d7c4f3e29e195537da77c Text-delta-base-sha1: 6db1f4dafce011e082a28702251666e180af8711 Text-content-length: 30 Text-content-md5: ae7be54846af879e0cf0be821146c637 Text-content-sha1: 309301c3da2c75e19b8ee0d76166f6e0ad810eab Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN 0 WPP pageantc Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9e557fe7a90716caba21103595ffa12d Text-delta-base-sha1: 05e0a0708247156b170015a216d214b268b4165c Text-content-length: 8348 Text-content-md5: 8540c661133539e97069f4c02732fb50 Text-content-sha1: 9c0ba0a9596f62a1ddc715e753f4a9b7adb3d4e9 Content-length: 8388 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN&k#2s1H" i#[{YRj{`O[{/[T~!+IJQ>Hi=#include // FIXME #define DEBUG #ifdef DEBUG void dprintf(char *fmt, ...); #define debug(x) (dprintf x) #else #define debug(x) #endif static int already_runningdebug(("ooh %d\n", __LINE__));debug(("ooh %d\n", __LINE__)); attempts = 0; debug(("ooh %d\n", __LINE__)); if (ver == 1) rkey = smalloc(sizeof(*rkey)); debug(("ooh %d\n", __LINE__)); pps.passphrase = passphrase; pps.comment = comment; debug(("ooh %d\n", __LINE__)); do { debug(("ooh %d\n", __LINE__));debug(("ooh %d\n", __LINE__)); if (ver == 1) ret = loadrsakey(filename, rkey, passphrase); else { debug(("ooh %d\n", __LINE__)); skey = ssh2_load_userkey(filename, passphrase); debug(("ooh %d\n", __LINE__)debug(("ooh %d\n", __LINE__)); if (comment) sfree(comment); debug(("ooh %d\n", __LINE__)); if (retif (ver == 1) sfree(rkey); return; } debug(("ooh %d\n", __LINE__)); if (ver == 1) { if (already_running) { unsigned char *request, *response; int reqlen, clen, resplen; debug(("ooh %d\n", __LINE__)); clen = strlen(rkey->comment); debug(("ooh %d\n", __LINE__)); reqlen = 4 + 1 + /* length, message type */ 4 + /* bit count */ ssh1_bignum_length(rkey->modulus) + ssh1_bignum_length(rkey->exponent) + ssh1_bignum_length(rkey->private_exponent) + ssh1_bignum_length(rkey->iqmp) + ssh1_bignum_length(rkey->p) + ssh1_bignum_length(rkey->q) + 4 + clen /* comment */ ; debug(("ooh %d %d\n", __LINE__, reqlen)); request = smalloc(reqlen); debug(("ooh %d\n", __LINE__)); debug(("ooh %d\n", __LINE__)); request[4] = SSH1_AGENTC_ADD_RSA_IDENTITY; debug(("ooh %d\n", __LINE__)); reqlen = 5; PUT_32BIT(request+reqlen, bignum_bitcount(rkey->modulus)); reqlen += 4; reqlen += ssh1_write_bignum(request+reqlen, rkey->modulus); reqlen += ssh1_write_bignum(request+reqlen, rkey->exponent); reqlen += ssh1_write_bignum(request+reqlen, rkey->private_exponent); reqlen += ssh1_write_bignum(request+reqlen, rkey->iqmp); reqlen += ssh1_write_bignum(request+reqlen, rkey->p); reqlen += ssh1_write_bignum(request+reqlen, rkey->q); PUT_32BIT(request+reqlen, clen); memcpy(request+reqlen+4, rkey->comment, clen); reqlen += 4+clen; PUT_32BIT(request, reqlen-4); debug(("ooh %d\n", __LINE__)); agent_query(request, reqlen, &response, &resplen); debug(("ooh %d\n", __LINE__)); if (resplen < 5 || response[4] != SSH_AGENT_SUCCESS) MessageBox(NULL, "The already running Pageant " "refused to add the key.", APPNAME, MB_OK | MB_ICONERROR); } else { if (add234(rsakeys, rkey) != rkey) sfree(rkey); /* already present, don't waste RAM */ } } else { if (already_running) { unsigned char *request, *response; int reqlen, alglen, clen, keybloblen, resplen; debug(("ooh %d\n", __LINE__)); alglen = strlen(skey->alg->name); debug(("ooh %d\n", __LINE__)); clen = strlen(skey->comment); debug(("ooh %d\n", __LINE__)); debug(("ooh %d\n", __LINE__)); keybloblen = skey->alg->openssh_fmtkey(skey->data, NULL, 0); debug(("ooh %d\n", __LINE__)); debug(("ooh %d\n", __LINE__)); reqlen = 4 + 1 + /* length, message type */ 4 + alglen + /* algorithm name */ keybloblen + /* key data */ 4 + clen /* comment */ ; debug(("ooh %d\n", __LINE__)); debug(("ooh %d\n", __LINE__)); request = smalloc(reqlen); debug(("ooh %d\n", __LINE__)); request[4] = SSH2_AGENTC_ADD_IDENTITY; debug(("ooh %d\n", __LINE__)); reqlen = 5; debug(("ooh %d\n", __LINE__)); PUT_32BIT(request+reqlen, alglen); debug(("ooh %d\n", __LINE__)); reqlen += 4; debug(("ooh %d\n", __LINE__)); memcpy(request+reqlen, skey->alg->name, alglen); debug(("ooh %d\n", __LINE__)); reqlen += alglen; debug(("ooh %d\n", __LINE__)); reqlen += skey->alg->openssh_fmtkey(skey->data, request+reqlen, keybloblen); debug(("ooh %d\n", __LINE__)); PUT_32BIT(request+reqlen, clen); debug(("ooh %d\n", __LINE__)); memcpy(request+reqlen+4, skey->comment, clen); debug(("ooh %d\n", __LINE__)); PUT_32BIT(request, reqlen-4); debug(("ooh %d\n", __LINE__)); reqlen += clen+4; agent_query(request, reqlen, &response, &resplen); debug(("ooh %d\n", __LINE__)); if (resplen < 5 || response[4] != SSH_AGENT_SUCCESS) MessageBox(NULL, "The already running Pageant" "refused to add the key.", APPNAME, MB_OK | MB_ICONERROR); debug(("ooh %d\n", __LINE__)); } else { if (add234(ssh2keys, skey) != skey) { skey->alg->freekey(skey->data); sfree(skey); /* already present, don't waste RAM */ }bignum_bitcount(am); blen = /* * Fork and Exec the command in cmdline. [DBW] */ void spawn_cmd(char *cmdline, int show) { if (ShellExecute(NULL, _T("open"), cmdline, NULL, NULL, show) <= (HINSTANCE) 32) { TCHAR sMsg[140]; sprintf(sMsg, _T("Failed to run \"%.100s\", Error: %d"), cmdline, GetLastError()); MessageBox(NULL, sMsg, APPNAME, MB_OK | MB_ICONEXCLAMATION); } char *command = NULL; int added_keys = 0tinstance = inst; /* * Find out if Pageant is already running. */ already_running = FALSE; if (FindWindow("Pageant", "Pageant")) already_running = TRUE; else { if (!prev) { wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = inst; wndclass.hIcon = LoadIcon (inst, MAKEINTRESOURCE(IDI_MAINICON)); wndclass.hCursor = LoadCursor (NULL, IDC_IBEAM); wndclass.hbrBackground = GetStockObject (BLACK_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = APPNAME; RegisterClass (&wndclass); } hwnd = keylist = NULL; hwnd = CreateWindow (APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, NULL, NULL, inst, NULL); /* Set up a system tray icon */ { BOOL res; NOTIFYICONDATA tnid; HICON hicon; #ifdef NIM_SETVERSION tnid.uVersion = 0; res = Shell_NotifyIcon(NIM_SETVERSION, &tnid); #endif tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = 1; /* unique within this systray use */ tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; tnid.uCallbackMessage = WM_SYSTRAY; tnid.hIcon = hicon = LoadIcon (instance, MAKEINTRESOURCE(201)); strcpy(tnid.szTip, "Pageant (PuTTY authentication agent)"); res = Shell_NotifyIcon(NIM_ADD, &tnid); if (hicon) DestroyIcon(hicon); systray_menu = CreatePopupMenu(); /* accelerators used: vkxa */ AppendMenu (systray_menu, MF_ENABLED, IDM_VIEWKEYS, "&View Keys"); AppendMenu (systray_menu, MF_ENABLED, IDM_ADDKEY, "Add &Key"); AppendMenu (systray_menu, MF_ENABLED, IDM_ABOUT, "&About"); AppendMenu (systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit"); } ShowWindow (hwnd, SW_HIDE); /* * Initialise storage for RSA keys. */ rsakeys = newtree234(cmpkeys_rsa); ssh2keys = newtree234(cmpkeys_ssh2); } /* * Process the command line and add keys as listed on it. * If we already determined that we need to spawn a program from above we * need to ignore the first two arguments. [DBW] */ { char *p; int inquotes = 0; int ignorearg if (!strcmp(q, "-c")) { /* * If we see `-c', then the rest of the * command line should be treated as a * command to be spawned. */ while (*p && isspace(*p)) p++; command = p; break; } else { add_keyfile(q); added_keys = TRUE; } } } } if (command) spawn_cmd (command, show); /* * If Pageant was already running, we leave now. If we haven't * even taken any auxiliary action (spawned a command or added * keys), complain. */ if (already_running) { if (!command && !added_keys) { MessageBox(NULL, "Pageant is already running", "Pageant Error", MB_ICONERROR | MB_OK); } if (advapi) FreeLibrary(advapi); return 0; Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: adad50732ddcb75b5f399119938f3b96 Text-delta-base-sha1: 60d103ea60f64929b36c4435d60982eba6866a6f Text-content-length: 23 Text-content-md5: bc28ef9d775250ab186f52612a93f9fd Text-content-sha1: 4936d13b6011f4cc2369c1bde26895d9b85ee6e4 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNRM /# Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bf30d4da9f8c52c3db4669bbfc8a978b Text-delta-base-sha1: 62ba8f3cd9f422f481980098dc6e728fd3b60bea Text-content-length: 59 Text-content-md5: 81090652c34157a75bf39f0c93803ab0 Text-content-sha1: 5914d0e5af6ed1620a913c0e2cf7368fb1f94966 Content-length: 100 K 15 cvs2svn:cvs-rev V 5 1.135 PROPS-END SVN a!yt tried a ' Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 31f4579ddd0de397856cc52bba32c237 Text-delta-base-sha1: fc3ebc4e48116dcb3181e71108a4db0d9a603b9c Text-content-length: 84 Text-content-md5: 72605c430b192962eb834eaf555e3ca1 Text-content-sha1: f4badf8fe8fb96e22f7d4870ee8535946c1ade14 Content-length: 124 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN J:yOoHCint (*openssh_fmtkey)(void *key, unsigned char *blob, int Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6921682c08f0f698a205b1faed80ec97 Text-delta-base-sha1: fb47b48dadc470649aaeb95c00ffc9fdab44f27b Text-content-length: 219 Text-content-md5: 6e05572001e8b96db481ed0316410eac Text-content-sha1: becb963440ba9eeafa81a8a8897ea52153a2e5b1 Content-length: 259 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNC6'&i-n&*5od#X<Abignum_bitcount(bn)+7)/8; } /* * Return the byte length of a bignum when ssh2 encoded. */ int ssh2_bignum_length(Bignum bn) { return 4 + (bignum_bitcount(bn)+8 Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 538ad24a68e7eed697ddceae4aa0f981 Text-delta-base-sha1: 22e40095729c23a758e2c3bc5b994c566aebc1fd Text-content-length: 20 Text-content-md5: 971e172c4730aceb0809de8487de5f66 Text-content-sha1: d330213cf7a1c0512283f488ca7bbbb95c67cb1d Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNHC 5 Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1fbac8cdf48ebd130e24034cfe898bc4 Text-delta-base-sha1: 9c2ebf5dfdd1072778fbc1a1a1d049d161376f9a Text-content-length: 496 Text-content-md5: 716973bb2d9dadffd4593905cedee6ac Text-content-sha1: 434655d456fc4f638732281d2e70c6e39ae9faab Content-length: 536 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN@F7[Mqd}S=d}R>gr|~ XrWibignum_bitcount(dss->p)+15)/16; len += 4 * (bignum_bitcount(dss->q)+15)/16; len += 4 * (bignum_bitcount(dss->g)+15)/16; len += 4 * (bignum_bitcount(dss->qbignum_bitcount(dss->ggbignum_bitcount(dss->p)+8)/8; qlen = (bignum_bitcount(dss->q)+8)/8; glen = (bignum_bitcount(dss->g)+8)/8; ylen = (static int dss_openssh_fmtkey(void *key, unsigned char *blob, int len) { return -1; openssh_fmt Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fef1ac82ca5a00d7020e9b4ad6798317 Text-delta-base-sha1: 1cedb0892df15bd491d90d88ab5638abd50f7396 Text-content-length: 23 Text-content-md5: 63815ef2cca6449609d52ee0c68a2bc4 Text-content-sha1: de52ee0ab7f6972d521d848d167da80be9ec3b3a Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN z Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 919bd392dc05315e78d3253f15c9178d Text-delta-base-sha1: 3507d7537ac33f5ed17cbddd03e692c152752f5d Text-content-length: 1100 Text-content-md5: d9f07c12cf4c1a1f319e30761838fe59 Text-content-sha1: 79312a7ede5cd516102f3de1147f5bf7673eadb6 Content-length: 1140 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNq-Rn'?\K mpkb{ C$gN[l.uuY'RT\o5[bignum_bitcount(md)+15) / 16; exlen = (bignum_bitcount(rsa->exponent)+8)/8; mlen = (bignum_bitcount(rsa->private_exponent)+8)/8; plen = (bignum_bitcount(rsa->p)+8)/8; qlen = (bignum_bitcount(rsa->q)+8)/8; ulen = (int *rsa2_openssh_fmtkey(void *key, unsigned char *blob, int len) { struct RSAKey *rsa = (struct RSAKey *)key; int bloblen, i; bloblen = ssh2_bignum_length(rsa->modulus) + ssh2_bignum_length(rsa->exponent) + ssh2_bignum_length(rsa->private_exponent) + ssh2_bignum_length(rsa->iqmp) + ssh2_bignum_length(rsa->p) + ssh2_bignum_length(rsa->q); if (bloblen > len) return bloblen; bloblen = 0; #define ENC(x) \ PUT_32BIT(blob+bloblen, ssh2_bignum_length((x))-4); bloblen += 4; \ for (i = ssh2_bignum_length((x))-4; i-- ;) blob[bloblen++]=bignum_byte((x),i); ENC(rsa->modulus); ENC(rsa->exponent); ENC(rsa->private_exponent); ENC(rsa->iqmp); ENC(rsa->p); ENC(rsa->q); return bloblenbignum_bitcount(rsaopenssh_fmt Node-path: putty/sshrsag.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4fd284401d26db3f5b426c16f87a8d5f Text-delta-base-sha1: c04c299bee7aa5ebbcc95ef3d95f3d3b6a178c83 Text-content-length: 20 Text-content-md5: 84e4719f37e896f71329331bd622bfa1 Text-content-sha1: f7817e6dff640c9cb3908cd7c8a58a4f6defd39d Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNje zk Revision-number: 1045 Prop-content-length: 208 Content-length: 208 K 8 svn:date V 27 2001-04-16T11:18:15.000000Z K 7 svn:log V 107 Remove the diagnostics I checked in by mistake in the last revision. AGAIN. I really must stop doing that. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8540c661133539e97069f4c02732fb50 Text-delta-base-sha1: 9c0ba0a9596f62a1ddc715e753f4a9b7adb3d4e9 Text-content-length: 1238 Text-content-md5: c2135ccb39f95c66bb153675b4c903b0 Text-content-sha1: 269bf27f6cb2512377d4b05ee5b1f63b19fac313 Content-length: 1278 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNZnFSE 7[c|?um]@P{tl9=N A@SZzJ59 attempts = 0; if (ver == 1) rkey = smalloc(sizeof(*rkey)); pps.passphrase = passphrase; pps.comment = comment; do { if (ver == 1) ret = loadrsakey(filename, rkey, passphrase); else { skey = ssh2_load_userkey(filename, passphrase if (comment) sfree(comment clen = strlen(rkey->comment request = smalloc(reqlen); request[4] = SSH1_AGENTC_ADD_RSA_IDENTITY agent_query(request, reqlen, &response, &resplen alglen = strlen(skey->alg->name); clen = strlen(skey->comment); keybloblen = skey->alg->openssh_fmtkey(skey->data, NULL, 0 alglen + /* algorithm name */ keybloblen + /* key data */ 4 + clen /* comment */ ; request = smalloc(reqlen); request[4] = SSH2_AGENTC_ADD_IDENTITY; reqlen = 5; PUT_32BIT(request+reqlen, alglen); reqlen += 4; memcpy(request+reqlen, skey->alg->name, alglen); reqlen += alglen PUT_32BIT(request+reqlen, clen); memcpy(request+reqlen+4, skey->comment, clen); PUT_32BIT(request, reqlen-4); reqlen += clen+4; agent_query(request, reqlen, &response, &resplen Revision-number: 1046 Prop-content-length: 246 Content-length: 246 K 7 svn:log V 145 Small keyboard patches from Robert de Bath. Should fix the dead-key problem and also some unspecified woe with the ever-problematic Compose key. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-16T12:08:37.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3c4a7c2428b095af397da3213cf6779f Text-delta-base-sha1: b603c79cbe3253bcfa808e2c5cf908e61835385b Text-content-length: 135 Text-content-md5: 25ea7ede99f0760cf8d36c72c6eb6590 Text-content-sha1: 71352cc3832f5cf66f5e3d1aa7d19e1a99ce1a31 Content-length: 176 K 15 cvs2svn:cvs-rev V 5 1.115 PROPS-END SVNcHfw,ya?$0x100 /* If we're definitly not building up an ALT-54321 then clear it */ if (!left_alt) keys[0] = 0; Revision-number: 1047 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2001-04-16T12:25:03.000000Z K 7 svn:log V 69 Increase the read buffer size in network processing for extra speed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 19633c40d3e6824aa6520b8fa1979fe7 Text-delta-base-sha1: 934da78bec19f246e3d00f8e360d3004062d71f4 Text-content-length: 87 Text-content-md5: 871526959f2176c6a5dc904e16b7c1f0 Text-content-sha1: 8536fda411943e4c7e3415458add88d6623540c1 Content-length: 127 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN0Z9CHh20480]; /* nice big buffer for plenty of speed */ Revision-number: 1048 Prop-content-length: 141 Content-length: 141 K 7 svn:log V 41 Makefile enhancements by Robert de Bath. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-16T12:38:35.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ae7be54846af879e0cf0be821146c637 Text-delta-base-sha1: 309301c3da2c75e19b8ee0d76166f6e0ad810eab Text-content-length: 678 Text-content-md5: 40178e28caf7f0740b9838cdc20be37e Text-content-sha1: 580003d137430adc49192ba6d12e169a2880fa9c Content-length: 718 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN0!y!8!VGuJDEBUG # Causes PuTTY to enable internal debugging# Enable debug and incremental linking and compiling # CFLAGS = /nologo /W3 /YX /Yd /O1 /Gi /D_WINDOWS /DDEBUG # LFLAGS = /debug # Disable debug and incremental linking and compiling CFLAGS = /nologo /W3 /O1 /D_WINDOWS LFLAGS = /incremental:no /fixed # Use MSVC DLL # CFLAGS = /nologo /W3 /O1 /MD /D_WINDOWS # ssh.obj: cl $(FWHACK) $(VER) $(CFLAGS) /Gi- /c ssh.c*.c *.h *.rc-del *.exe tidy: -del *.obj -del *.res -del *.pch -del *.aps -del *.ilk -del *.pdb -del *.rsp -del *.dsp -del *.dsw -del *.ncb -del *.opt -del *.plg -del *.map -del *.idb -del debug.log Revision-number: 1049 Prop-content-length: 197 Content-length: 197 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-16T15:58:43.000000Z K 7 svn:log V 97 Roman Pompejus's patch to allow you to automatically select overwrite or append in logging mode. PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 29a6a38916e107af8eb9e9bda236a4f0 Text-delta-base-sha1: 7b05f7cec7f3b06bacef6e72a3e2d517100f830e Text-content-length: 177 Text-content-md5: 67ff30448480cbb1bcf59212668ebd21 Text-content-sha1: 97581a869241d911986f17708bcf7fa63460e03a Content-length: 217 K 15 cvs2svn:cvs-rev V 4 1.90 PROPS-END SVN9h j]T=XF_OVR 1 /* existing logfile overwrite */ #define LGXF_APN 0 /* existing logfile append */ #define LGXF_ASK -1 /* existing logfile ask */logxfovr Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ce0342bdc79e1d65d792c1a4c612d574 Text-delta-base-sha1: 5e4d0dae5b158b7ac752a1cf6a3a02ff68a63419 Text-content-length: 144 Text-content-md5: de2ae199cd2052c0071fe8c4f307589f Text-content-sha1: 755cb43d90887b9afcc7207455a6254857c9392b Content-length: 184 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNXQs P W write_setting_i (sesskey, "LogFileClash", cfg->logxfovr gppi (sesskey, "LogFileClash", LGXF_ASK, &cfg->logxfovr Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7773ab0b21e2b32f6e6834703da5df6e Text-delta-base-sha1: 1c7a83f36897b29983c0d3f61d3725927011a3ed Text-content-length: 999 Text-content-md5: 77b5b1cce689a73273fb7792be701e63 Text-content-sha1: c17c8e96bac9eccab12e20eed43325496876fbcf Content-length: 1040 K 15 cvs2svn:cvs-rev V 5 1.121 PROPS-END SVNqr[~MFG-ypos += r.bottom + GAPBETWEEN; i=0; } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 77b5b1cce689a73273fb7792be701e63 Text-delta-base-sha1: c17c8e96bac9eccab12e20eed43325496876fbcf Text-content-length: 1529 Text-content-md5: cfc070d5eb8f57600acd37d8f549c65f Text-content-sha1: 45bda6b40d735e1409bff83ac8f3746eba85450c Content-length: 1570 K 15 cvs2svn:cvs-rev V 5 1.122 PROPS-END SVNrUtAj0^kHhbyIQb_A[7/vQ~QSFUNCVT100P, IDC_FUNCSCOSCOcfg.funky_type == 4 ? IDC_FUNCVT100P : cfg.funky_type == 5 ? IDC_FUNCSCObhf ruyntd /* */&Backspace key", IDC_DELSTATIC, 2, "Control-H", IDC_DEL008, "Control-? (127)", IDC_DEL127, NULL); radioline(&cp, "The &Home and End keys", IDC_HOMESTATIC, 2, "Standard", IDC_HOMETILDE, "rxvt", IDC_HOMERXVT, NULL); radioline(&cp, "The &Function keys and keypad", IDC_FUNCSTATIC, 3, "ESC[n~", IDC_FUNCTILDE, "Linux", IDC_FUNCLINUX, "Xterm R6", IDC_FUNCXTERM, "VT400", IDC_FUNCVT400, "VT100+", IDC_FUNCVT100P, "SCO", IDC_FUNCSCO&rsor keys:", IDC_CURSTATIC, 2, "Normal", IDC_CURNORMAL, "A&numeric keypad:", IDC_KPSTATIC, 3, "Normal", IDC_KPNORMAL, "Application", IDC_KPAPPLIC, "NTILDE: case IDC_FUNCLINUX: case IDC_FUNCXTERM: case IDC_FUNCVT400: case IDC_FUNCVT100P: case IDC_FUNCSC switch (LOWORD(wParam)) { case IDC_FUNCTILDE: cfg.funky_type = 0; break; case IDC_FUNCLINUX: cfg.funky_type = 1; break; case IDC_FUNCXTERM: cfg.funky_type = 2; break; case IDC_FUNCVT400: cfg.funky_type = 3; break; case IDC_FUNCVT100P: cfg.funky_type = 4; break; case IDC_FUNCSCO: cfg.funky_type = 5; break; } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e6d1c527788ef354669bae64837125cf Text-delta-base-sha1: 965a635f0d73601014e071ffb9ffe5131a78ac7b Text-content-length: 556 Text-content-md5: 2bf4b9509c800d2553b8d33edc39b42b Text-content-sha1: b8e384009070bb00fd4fc555ac59ee5a39ffc8e5 Content-length: 597 K 15 cvs2svn:cvs-rev V 5 1.117 PROPS-END SVNb: ofH~yivt52_mode && code > 0 && code <= 6) { p += sprintf((char *)p, "\x1B%c", " HLMEIG"[code]); return p - output; } if (cfg.funky_type == 5 && code >= 11 && code <= 24) { p += sprintf((char *)p, "\x1B[%c", code + 'M' - 11); return p - output; } if ((vt52_mode || cfg.funky_type == 4) && code >= 11 && code <= 24) { int offt = 0; if (code>15) offt++; if (code>21) offt++; if (vt52_mode) p += sprintf((char *)p, "\x1B%c", code + 'P' - 11 - offt - offt); return p - output; } Revision-number: 1051 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2001-04-16T16:19:30.000000Z K 7 svn:log V 143 Quote the hostname in the `unable to connect' box so that if the user starts up N PuTTYs at once and one reports failure, they know which one. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2bf4b9509c800d2553b8d33edc39b42b Text-delta-base-sha1: b8e384009070bb00fd4fc555ac59ee5a39ffc8e5 Text-content-length: 68 Text-content-md5: c8108a652b3e090c82eeab3730783fa5 Text-content-sha1: 753be676a07ced405f3a99c2cd63f2582a32f93a Content-length: 109 K 15 cvs2svn:cvs-rev V 5 1.118 PROPS-END SVN:` ,FnL to\n" "%.800s\n" "%s", cfg.host Revision-number: 1052 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 37 Fix excessive calls to random_byte() K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-16T16:25:57.000000Z PROPS-END Node-path: putty/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 853d70448198d6c799a0e45cc9317a82 Text-delta-base-sha1: 8a204f613f7fbd4793be7d12954b0289c5399954 Text-content-length: 34 Text-content-md5: 8ee9c92466e70536da3769e5238654b4 Text-content-sha1: 9ef3a597056103ef1814c776e7fe82315359de45 Content-length: 73 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNnjo=Z,, Revision-number: 1053 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2001-04-16T17:18:24.000000Z K 7 svn:log V 126 Replace PuTTY's 2-3-4 tree implementation with the shiny new counted one, in preparation for using it to speed up scrollback. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c2135ccb39f95c66bb153675b4c903b0 Text-delta-base-sha1: 269bf27f6cb2512377d4b05ee5b1f63b19fac313 Text-content-length: 859 Text-content-md5: 5f1999edb45f6743c58e1ead2b4a05f9 Text-content-sha1: 4caa08a7cd5b823999a16d4dd86b0b8ec17b4f12 Content-length: 899 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN0bkwdC?nW1p1#Tln&1b .}pd|/dHJint ii = 0; NULL != (rkey = index234(rsakeys, i)); i++i = 0; NULL != (skey = index234(ssh2keys, i)); i++struct RSAKey *key; int len, nkeys; int ii = 0; NULL != (key = index234(rsakeys, i)); i++i = 0; NULL != (key = index234(rsakeys, i)); i++struct ssh2_userkey *key; int len, nkeys; unsigned char *blob; int bloblen; int ii = 0; NULL != (key = index234(ssh2keys, i)); i++i = 0; NULL != (key = index234(ssh2keys, i)); i++ while ( (rkey = index234(rsakeys, 0 while ( (skey = index234(ssh2keys, 0nt i; if (n == LB_ERR) { MessageBeep(0); break; } for (i = 0; NULL != (rkey = index234(rsakeys, i)); i++i = 0; NULL != (skey = index234(ssh2keys, i)); i++ Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dfc1ee753d8b6ddf597fb1d1a96db03b Text-delta-base-sha1: 708a6ba403783cedf4e130e62db27b26cfbb2462 Text-content-length: 346 Text-content-md5: 312ac1086d3f8fc8493f24358fabfa1a Text-content-sha1: fd795e82211308692abc497349a3e370af856061 Content-length: 386 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNh.s;KKeKgSOCKET socket; extern SOCKET first_socket(int *), next_socket(int *); extern int select_result(WPARAM, LPARAM); int i, socketstatesocketstate); socket != INVALID_SOCKET; socket = next_socket(&socketstatsocketstate); socket != INVALID_SOCKET; socket = next_socket(&socketstat Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 81090652c34157a75bf39f0c93803ab0 Text-delta-base-sha1: 5914d0e5af6ed1620a913c0e2cf7368fb1f94966 Text-content-length: 2212 Text-content-md5: 4a03793d7fadb91af776657c972478ca Text-content-sha1: f16d2132ead067c411c87b5566e615280f7c9bba Content-length: 2253 K 15 cvs2svn:cvs-rev V 5 1.136 PROPS-END SVN/HRQQFgL7(DzgnVint alloc_channel_id(void) { const int CHANNEL_NUMBER_OFFSET = 256; int low, high, mid; int tsize; struct ssh_channel *c; /* * First-fit allocation of channel numbers: always pick the * lowest unused one. To do this, binary-search using the * counted B-tree to find the largest channel ID which is in a * contiguous sequence from the beginning. (Precisely * everything in that sequence must have ID equal to its tree * index plus CHANNEL_NUMBER_OFFSET.) */ tsize = count234(ssh_channels); low = -1; high = tsize; while (high - low > 1) { mid = (high + low) / 2; c = index234(ssh_channels, mid); if (c->localid == mid + CHANNEL_NUMBER_OFFSET) low = mid; /* this one is fine */ else high = mid; /* this one is past it */ } /* * Now low points to either -1, or the tree index of the * largest ID in the initial sequence. */ { unsigned i = low + 1 + CHANNEL_NUMBER_OFFSET; assert(NULL == find234(ssh_channels, &i, ssh_channelfind)); } return low + 1 + CHANNEL_NUMBER_OFFSETstruct ssh_channel *c, *dc->remoteid = GET_32BIT(pktin.body); c->localid = alloc_channel_id()alloc_channel_id()d?T Mz0jmI*|{X3?G uthentication: type %d", pktin.type)); crReturnV; } gotit = FALSE; /* * OK, we're now sitting on a USERAUTH_FAILURE message, so * we can look at the string in it and know what we can * helpfully try next. */ { char *methods; int methlen; ssh2_pkt_getstring(&methods, &methlen); if (!ssh2_pkt_getbool()) { /* * We have received an unequivocal Access * Denied. This can translate to a variety of * messages: * * - if we'd just tried "none" authentication, * it's not worth printing anything at all * * - if we'd just tried a ssh_channels = newtree234(ssh_channelcmp);alloc_channel_id();if (count234(ssh_channels) == 0 c->localid = alloc_channel_id()int ii = 0; NULL != (c = index234(ssh_channels, i)); i++ Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6af8e85bd865c94c95a4dda30d1bd821 Text-delta-base-sha1: 0f58743107157fb178f1754b123d9ba77c612582 Text-content-length: 194 Text-content-md5: 397e3695a3025a487b2f9071cf5cbf99 Text-content-sha1: 28e5d05446cf4097822ab4654044937cf0fd3cc1 Content-length: 233 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN+ezZ=nm-short next, prev; /* array indices within the window */ short hashval; }; struct HashEntry { short first;short code, extrabits; intshor Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0235a2de3ab22cdfe06c653fd68d068f Text-delta-base-sha1: afe66b63101246fdfa40b047b490802d5404e1a7 Text-content-length: 23015 Text-content-md5: b555ab65bacbce78bbcd4f23046d5f5d Text-content-sha1: d849c29946df404e07ed55c250851f2f68c0abf5 Content-length: 23055 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN(X'0Bg7au |yPium8H( 6[pp\8k%e6:2[gAcd(W`^2{|@i,4Y8^I9"3e.sBnd9scO\$+xmHcs+\~&DRv\|qs.4A8@)_ H SsG[$l1i "vsS{o^yZ }|GYmNaH:ZZ/* * tree234.c: reasonably generic counted 2-3-4 tree routines. * * This file is copyright 1999-2001 Simon Tatham. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include #include #include #include "tree234.h" #define smalloc malloc #define sfree free #define mknew(typ) ( (typ *) smalloc (sizeof (typ)) ) #ifdef TEST #define LOG(x) (printf x) #else #define LOG(x) #endif typedef struct node234_Tag node234;int countInternal function to count a node. */ static int countnode234(node234 *n) { int count = 0; int i; for (i = 0; i < 4; i++) count += n->counts[i]; for (i = 0; i < 3; i++) if (n->elems[i]) count++; return count; } /* * Count the elements in a tree. */ int count234(tree234 *t) { if (t->root) return countnode234(t->root); else return 0static void *add234_internal(tree234 *t, void *e, int index) { node234 *n, **np, *left, *right; void *orig_e = e; int c, lcount, rcountcounts[0] = t->root->counts[1] = 0; t->root->counts[2] = t->root->counts[3] = 0int childnum; n = *np; LOG((" node %p: %p/%d [%p] %p/%d [%p] %p/%d [%p] %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); if (index >= 0) { if (!n->kids[0]) { /* * Leaf node. We want to insert at kid position * equal to the index: * * 0 A 1 B 2 C 3 */ childnum = index; } else { /* * Internal node. We always descend through it (add * always starts at the bottom, never in the * middle). */ do { /* this is a do ... while (0) to allow `break' */ if (index <= n->counts[0]) { childnum = 0; break; } index -= n->counts[0] + 1; if (index <= n->counts[1]) { childnum = 1; break; } index -= n->counts[1] + 1; if (index <= n->counts[2]) { childnum = 2; break; } index -= n->counts[2] + 1; if (index <= n->counts[3]) { childnum = 3; break; } return NULL; /* error: index out of range */ } while (0); } } else { if ((c = t->cmp(e, n->elems[0])) < 0) childnum = 0; else if (c == 0) return n->elems[0]; /* already exists */ else if (n->elems[1] == NULL || (c = t->cmp(e, n->elems[1])) < 0) childnum = 1; else if (c == 0) return n->elems[1]; /* already exists */ else if (n->elems[2] == NULL || (c = t->cmp(e, n->elems[2])) < 0) childnum = 2; else if (c == 0) return n->elems[2]; /* already exists */ else childnum = 3; } np = &n->kids[childnum]; LOG((" moving to child %d (%p)\n", childnum lcount = 0; right = NULL; rcount = 0; while (n) { LOG((" at %p: %p/%d [%p] %p/%d [%p] %p/%d [%p] %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3])); LOG((" need to insert %p/%d [%p] %p/%d at position %d\n", left, lcount, e, right, rcoun n->counts[2] = n->counts[1]; n->elems[1] = n->elems[0]; n->kids[1] = right; n->counts[1] = rcount; n->elems[0] = e; n->kids[0] = left; n->counts[0] = lcount; } else { /* np == &n->kids[1] */ LOG((" inserting on right of 2-node\n")); n->kids[2] = right; n->counts[2] = rcount; n->elems[1] = e; n->kids[1] = left; n->counts[1] = lcoun n->counts[3] = n->counts[2]; n->elems[2] = n->elems[1]; n->kids[2] = n->kids[1]; n->counts[2] = n->counts[1]; n->elems[1] = n->elems[0]; n->kids[1] = right; n->counts[1] = rcount; n->elems[0] = e; n->kids[0] = left; n->counts[0] = lcoun n->counts[3] = n->counts[2]; n->elems[2] = n->elems[1]; n->kids[2] = right; n->counts[2] = rcount; n->elems[1] = e; n->kids[1] = left; n->counts[1] = lcoun n->counts[3] = rcount; n->elems[2] = e; n->kids[2] = left; n->counts[2] = lcoun m->counts[0] = lcount; m->elems[0] = e; m->kids[1] = right; m->counts[1] = rcount; m->elems[1] = n->elems[0]; m->kids[2] = n->kids[1]; m->counts[2] = n->counts[1]; e = n->elems[1]; n->kids[0] = n->kids[2]; n->counts[0] = n->counts[2]; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; n->counts[1] = n->counts[3]; } else if (np == &n->kids[1]) { m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = left; m->counts[1] = lcount; m->elems[1] = e; m->kids[2] = right; m->counts[2] = rcount; e = n->elems[1]; n->kids[0] = n->kids[2]; n->counts[0] = n->counts[2]; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; n->counts[1] = n->counts[3]; } else if (np == &n->kids[2]) { m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = n->kids[1]; m->counts[1] = n->counts[1]; m->elems[1] = n->elems[1]; m->kids[2] = left; m->counts[2] = lcount; /* e = e; */ n->kids[0] = right; n->counts[0] = rcount; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; n->counts[1] = n->counts[3]; } else { /* np == &n->kids[3] */ m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = n->kids[1]; m->counts[1] = n->counts[1]; m->elems[1] = n->elems[1]; m->kids[2] = n->kids[2]; m->counts[2] = n->counts[2]; n->kids[0] = left; n->counts[0] = lcount; n->elems[0] = e; n->kids[1] = right; n->counts[1] = rcount; e = n->elems[2]; } m->kids[3] = n->kids[3] = n->kids[2] = NULL; m->counts[3] = n->counts[3] = n->counts[2] = 0/%d [%p] %p/%d [%p] %p/%d\n", m, m->kids[0], m->counts[0], m->elems[0], m->kids[1], m->counts[1], m->elems[1], m->kids[2], m->counts[2])); LOG((" right (%p): %p/%d [%p] %p/%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1])); left = m; lcount = countnode234(left); right = n; rcount = countnode234(right)all we need to do is go back up the tree * updating counts. If we've come here because n is NULL, we * need to create a new root for the tree because the old one * has just split into two. */ if (n) { while (n->parent) { int count = countnode234(n); int childnum; childnum = (n->parent->kids[0] == n ? 0 : n->parent->kids[1] == n ? 1 : n->parent->kids[2] == n ? 2 : 3); n->parent->counts[childnum] = count; n = n->parent; } } else { LOG((" root is overloaded, split into two\n")); t->root = mknew(node234); t->root->kids[0] = left; t->root->counts[0] = lcount; t->root->elems[0] = e; t->root->kids[1] = right; t->root->counts[1] = rcount; t->root->elems[1] = NULL; t->root->kids[2] = NULL; t->root->counts[2] = 0; t->root->elems[2] = NULL; t->root->kids[3] = NULL; t->root->counts[3] = 0/%d [%p] %p/%d\n", t->root->kids[0], t->root->counts[0], t->root->elems[0], t->root->kids[1], t->root->counts[1])); } return orig_e; } void *add234(tree234 *t, void *e) { if (!t->cmp) /* tree is unsorted */ return NULL; return add234_internal(t, e, -1); } void *addpos234(tree234 *t, void *e, int index) { if (index < 0 || /* index out of range */ t->cmp) /* tree is sorted */ return NULL; /* return failure */ return add234_internal(t, e, index); /* this checks the upper bound */ } /* * Look up the element at a given numeric index in a 2-3-4 tree. * Returns NULL if the index is out of range. */ void *index234(tree234 *t, int index) { node234 *n; if (!t->root) return NULL; /* tree is empty */ if (index < 0 || index >= countnode234(t->root)) return NULL; /* out of range */ n = t->root; while (n) { if (index < n->counts[0]) n = n->kids[0]; else if (index -= n->counts[0] + 1, index < 0) return n->elems[0]; else if (index < n->counts[1]) n = n->kids[1]; else if (index -= n->counts[1] + 1, index < 0) return n->elems[1]; else if (index < n->counts[2]) n = n->kids[2]; else if (index -= n->counts[2] + 1, index < 0) return n->elems[2]; else n = n->kids[3]; } /* We shouldn't ever get here. I wonder how we did. */ return NULL; } /* * Find an element e in a sorted 2-3-4 tree t. Returns NULL if not * found. e is always passed as the first argument to cmp, so cmp * can be an asymmetric function if desired. cmp can also be passed * asrelpos234(tree234 *t, void *e, cmpfn234 cmp, int relation, int *index) { node234 *n; void *ret; int c; int idx, ecount, kcount, cmpret; if (t->root == NULL) return NULL; if (cmp == NULL) cmp = t->cmp; n = t->root; /* * Attempt to find the element itself. */ idx = 0; ecount = -1; /* * Prepare a fake `cmp' result if e is NULL. */ cmpret = 0; if (e == NULL) { assert(relation == REL234_LT || relation == REL234_GT); if (relation == REL234_LT) cmpret = +1; /* e is a max: always greater */ else if (relation == REL234_GT) cmpret = -1; /* e is a min: always smaller */ } while (1) { for (kcount = 0; kcount < 4; kcount++) { if (kcount >= 3 || n->elems[kcount] == NULL || (c = cmpret ? cmpret : cmp(e, n->elems[kcount])) < 0) { break; } if (n->kids[kcount]) idx += n->counts[kcount]; if (c == 0) { ecount = kcount; break; } idx++; } if (ecount >= 0) break; if (n->kids[kcount]) n = n->kids[kcount]; else break; } if (ecount >= 0) { /* * We have found the element we're looking for. It's * n->elems[ecount], at tree index idx. If our search * relation is EQ, LE or GE we can now go home. */ if (relation != REL234_LT && relation != REL234_GT) { if (index) *index = idx; return n->elems[ecount]; } /* * Otherwise, we'll do an indexed lookup for the previous * or next element. (It would be perfectly possible to * implement these search types in a non-counted tree by * going back up from where we are, but far more fiddly.) */ if (relation == REL234_LT) idx--; else idx++; } else { /* * We've found our way to the bottom of the tree and we * know where we would insert this node if we wanted to: * we'd put it in in place of the (empty) subtree * n->kids[kcount], and it would have index idx * * But the actual element isn't there. So if our search * relation is EQ, we're doomed. */ if (relation == REL234_EQ) return NULL; /* * Otherwise, we must do an index lookup for index idx-1 * (if we're going left - LE or LT) or index idx (if we're * going right - GE or GT). */ if (relation == REL234_LT || relation == REL234_LE) { idx--; } } /* * We know the index of the element we want; just call index234 * to do the rest. This will return NULL if the index is out of * bounds, which is exactly what we want. */ ret = index234(t, idx); if (ret && index) *index = idx; return ret; } void *find234(tree234 *t, void *e, cmpfn234 cmp) { return findrelpos234(t, e, cmp, REL234_EQ, NULL); } void *findrel234(tree234 *t, void *e, cmpfn234 cmp, int relation) { return findrelpos234(t, e, cmp, relation, NULL); } void *findpos234(tree234 *t, void *e, cmpfn234 cmp, int *index) { return findrelpos234(t, e, cmp, REL234_EQ, index)static void *delpos234_internal(tree234 *t, int index) { node234 *n; void *retval; int ei = -1; retval = 0; n = t->root; LOG(("deleting item %d from tree %p\n", index/%d [%p] %p/%d [%p] %p/%d [%p] %p/%d index=%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3], index)); if (index < n->counts[0]) { ki = 0; } else if (index -= n->counts[0]+1, index < 0) { ei = 0; break; } else if (index < n->counts[1]) { ki = 1; } else if (index -= n->counts[1]+1, index < 0) { ei = 1; break; } else if (index < n->counts[2]) { ki = 2; } else if (index -= n->counts[2]+1, index countcounts[1] = sub->countsub->counts[0] = sib->countcounts[lastelem+1] = 0; sib->elems[lastelem] = NULL; n->counts[ki] = countnode234(sub); LOG((" case 3a left\n")); LOG((" index and left subtree count before adjustment: %d, %d\n", index, n->counts[ki-1])); index += n->counts[ki-1]; n->counts[ki-1] = countnode234(sib); index -= n->counts[ki-1]; LOG((" index and left subtree count after adjustment: %d, %d\n", index, n->counts[ki-1]sub->counts[2] = sib->countsib->counts[0] = sib->countcounts[j+1] = sib->counts[j+2]; sib->elems[j] = sib->elems[j+1]; } sib->kids[j+1] = NULL; sib->counts[j+1] = 0; sib->elems[j] = NULL; n->counts[ki] = countnode234(sub); n->counts[ki+1] = countnode234(sib) { ki--; index += n->counts[ki] + 1; }counts[3] = sub->counts[1]; sub->elems[2] = sub->elems[0]; sub->kids[2] = sub->kids[0]; sub->counts[2] = sub->counts[0]; sub->elems[1] = n->elems[ki]; sub->kids[1] = sib->kids[1]; sub->counts[1] = sib->countsub->counts[0] = sib->counts[0]; if (sub->kids[0]) sub->kids[0]->parent = sub; n->counts[ki+1] = countnode234(sub)counts[j] = n->countn->counts[j] = 0!retval) retval = n->elems[ei]; if (ei==-1) return NULL; /* although this shouldn't happen retval/* * Having done that to the leaf node, we now go back up * the tree fixing the counts. */ while (n->parent) { int childnum; childnum = (n->parent->kids[0] == n ? 0 : n->parent->kids[1] == n ? 1 : n->parent->kids[2] == n ? 2 : 3); n->parent->counts[childnum]--; n = n->parent; } return retval;index = n->counts[ei]-1; n = n->kids[ei]index = 0a->counts[2] = b->counta->counts[3] = b->counts[1]; if (a->kids[3]) a->kids[3]->parent = a; sfree(b); n->counts[ei] = countnode234(a n->counts[j+1] = n->counts[j+2]; } n->elems[j] = NULL; n->kids[j+1] = NULL; n->counts[j+1] = 0 index = a->counts[0] + a->counts[1] + 1; } } } void *delpos234(tree234 *t, int index) { if (index < 0 || index >= countnode234(t->root)) return NULL; return delpos234_internal(t, index); } void *del234(tree234 *t, void *e) { int index; if (!findrelpos234(t, e, NULL, REL234_EQ, &index)) return NULL; /* it wasn't in there anyway */ return delpos234_internal(t, index); /* it's there; delete it. */: * - node->child->parent always equals node * - tree->root->parent always equals NULL * - number of kids == 0 or number of elements + 1; * - tree has the same depth everywhere * - every node has at least one element * - subtree element counts are accurate * - any NULL kid pointer is accompanied by a zero count * - in a sorted tree: ordering property between elements of a * node and elements of its children is preserved * and also ensures the list represented by the tree is the same * list it should be. (This last check also doubly verifies the * ordering properties, because the `same list it should be' is by * definition correctly ordered. It also ensures all nodes are * distinct, because the enum functions would get caught in a loop * if not.) */ #include #define srealloc reallocint int count else if (node->counts[i]) { error("node %p: kids[%d] NULL but count[%d]=%d nonzero", node, i, i, node->counts[i]); if (cmp) { for (i = -1; i < nelems; i++) { void *lower = (i == -1 ? lowbound : node->elems[i]); void *higher = (i+1 == nelems ? highbound : node->elems[i+1]); if (lower && higher && cmp(lower, higher) >= 0) { error("node %p: kid comparison [%d=%s,%d=%s] failed", node, i, lower, i+1, higher); } count = nelems; int subcount = chknode(ctx, level+1, node->kids[i], lower, higher); if (node->counts[i] != subcount) { error("node %p kid %d: count says %d, subtree really has %d", node, i, node->counts[i], subcount); } count += subcount; } return count; } void verify(void) { chkctx ctx { if (tree->root->parent != NULL) error("root->parent is %p should be null", tree->root->parent); chknode(&ctx, 0, tree->root, NULL, NULL); }; NULL != (p = index234(tree, i)); i++ctx.elemcount != ictx.elemcount, i i = count234(tree); if (ctx.elemcount != i) { error("tree really contains %d elements, count234 gave %d", ctx.elemcount, i); } } void internal_addtest(void *elem, int index, void *realret) { int i, j; void *retvalindex; /* now i points to the first element >= elem */ retval = elem; /* expect elem returned (success) */ for (j = arraylen; j > i; j--) array[j] = array[j-1]; array[i] = elem; /* add elem to array */ arraylen++; addtest(void *elem) { int i; void *realret; realret = add234(tree, elem); i = 0; while (i < arraylen && cmp(elem, array[i]) > 0) i++; if (i < arraylen && !cmp(elem, array[i])) { void *retval = array[i]; /* expect that returned not elem */ if (realret != retval) { error("add: retval was %p expected %p", realret, retval); } } else internal_addtest(elem, i, realret); } void addpostest(void *elem, int i) { void *realret; realret = addpos234(tree, elem, i); internal_addtest(elem, i, realret); } void delpostest(int i) { int index = i; void *elem = array[i], *ret; /* i points to the right element */ while (i < arraylen-1) { array[i] = array[i+1]; i++; } arraylen--; /* delete elem from array */ if (tree->cmp) ret = del234(tree, elem); else ret = delpos234(tree, index); if (ret != elem) { error("del returned %p, expected %p", ret, elemdelpostest(ifindtest(void) { const static int rels[] = { REL234_EQ, REL234_GE, REL234_LE, REL234_LT, REL234_GT }; const static char *const relnames[] = { "EQ", "GE", "LE", "LT", "GT" }; int i, j, rel, index; char *p, *ret, *realret, *realret2; int lo, hi, mid, c; for (i = 0; i < NSTR; i++) { p = strings[i]; for (j = 0; j < sizeof(rels)/sizeof(*rels); j++) { rel = rels[j]; lo = 0; hi = arraylen-1; while (lo <= hi) { mid = (lo + hi) / 2; c = strcmp(p, array[mid]); if (c < 0) hi = mid-1; else if (c > 0) lo = mid+1; else break; } if (c == 0) { if (rel == REL234_LT) ret = (mid > 0 ? array[--mid] : NULL); else if (rel == REL234_GT) ret = (mid < arraylen-1 ? array[++mid] : NULL); else ret = array[mid]; } else { assert(lo == hi+1); if (rel == REL234_LT || rel == REL234_LE) { mid = hi; ret = (hi >= 0 ? array[hi] : NULL); } else if (rel == REL234_GT || rel == REL234_GE) { mid = lo; ret = (lo < arraylen ? array[lo] : NULL); } else ret = NULL; } realret = findrelpos234(tree, p, NULL, rel, &index); if (realret != ret) { error("find(\"%s\",%s) gave %s should be %s", p, relnames[j], realret, ret); } if (realret && index != mid) { error("find(\"%s\",%s) gave %d should be %d", p, relnames[j], index, mid); } if (realret && rel == REL234_EQ) { realret2 = index234(tree, index); if (realret2 != realret) { error("find(\"%s\",%s) gave %s(%d) but %d -> %s", p, relnames[j], realret, index, index, realret2); } } #if 0 printf("find(\"%s\",%s) gave %s(%d)\n", p, relnames[j], realret, index); #endif } } realret = findrelpos234(tree, NULL, NULL, REL234_GT, &index); if (arraylen && (realret != array[0] || index != 0)) { error("find(NULL,GT) gave %s(%d) should be %s(0)", realret, index, array[0]); } else if (!arraylen && (realret != NULL)) { error("find(NULL,GT) gave %s(%d) should be NULL", realret, index); } realret = findrelpos234(tree, NULL, NULL, REL234_LT, &index); if (arraylen && (realret != array[arraylen-1] || index != arraylen-1)) { error("find(NULL,LT) gave %s(%d) should be %s(0)", realret, index, array[arraylen-1]); } else if (!arraylen && (realret != NULL)) { error("find(NULL,LT) gave %s(%d) should be NULL", realret, index); } } int main(void) { int in[NSTR]; int i, j, k findtest();freetree234(tree); /* * Now try an unsorted tree. We don't really need to test * delpos234 because we know del234 is based on it, so it's * already been tested in the above sorted-tree code; but for * completeness we'll use it to tear down our unsorted tree * once we've built it. */ tree = newtree234(NULL); cmp = NULL; verify(); for (i = 0; i < 1000; i++) { printf("trial: %d\n", i); j = randomnumber(&seed); j %= NSTR; k = randomnumber(&seed); k %= count234(tree)+1; printf("adding string %s at index %d\n", strings[j], k); addpostest(strings[j], k); } while (count234(tree) > 0) { printf("cleanup: tree size %d\n", count234(tree)); j = randomnumber(&seed); j %= count234(tree); printf("deleting string %s from index %d\n", array[j], j); delpostest(j); } return 0; } #endif Node-path: putty/tree234.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c6ab5d3c351b0fedc6d83391c58209ee Text-delta-base-sha1: 7e71705ffd332fea64e1e2a87f3e5f8c03238996 Text-content-length: 5234 Text-content-md5: 809e627ca52e484e69d3c25ca18b17be Text-content-sha1: 0c7011266468320814a372e70f3176aefb5e6b72 Content-length: 5273 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNH`I'9R1I4S-/* * tree234.h: header defining functions in tree234.c. * * This file is copyright 1999-2001 Simon Tatham. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef TREE234_H #define TREE234_H /* * This typedef is opaque outside tree234.c itself. */ typedef struct tree234_Tag tree234; typedef int (*cmpfn234)(void *, void *); /* * Create a 2-3-4 tree. If `cmp' is NULL, the tree is unsorted, and * lookups by key will fail: you can only look things up by numeric * index, and you have to use addpos234() and delpos234()sorted 2-3-4 tree t. Returns e on success, * or if an existing element compares equal, returns that. */ void *add234(tree234 *t, void *e); /* * Add an element e to an unsorted 2-3-4 tree t. Returns e on * success, NULL on failure. (Failure should only occur if the * index is out of range or the tree is sorted.) * * Index range can be from 0 to the tree's current element count, * inclusive. */ void *addpos234(tree234 *t, void *e, int index); /* * Look up the element at a given numeric index in a 2-3-4 tree. * Returns NULL if the index is out of range. * * One obvious use for this function is in iterating over the whole * of a tree (sorted or unsorted): * * for (i = 0; (p = index234(tree, i)) != NULL; i++) consume(p); * * or * * int maxcount = count234(tree); * for (i = 0; i < maxcount; i++) { * p = index234(tree, i); * assert(p != NULL); * consume(p); * } */ void *index234(tree234 *t, int index); /* * Find an element e in a sorted 2-3-4 tree t. Returns NULL if not * found. e is always passed as the first argument to cmp, so cmp * can be an asymmetric function if desired. cmp can also be passed * as * Three of these functions are special cases of findrelpos234. The * non-`pos' variants lack the `index' parameter: if the parameter * is present and non-NULL, it must point to an integer variable * which will be filled with the numeric index of the returned * element. * * The non-`rel' variants lack the `relation' parameter. This * parameter allows you to specify what relation the element you * provide has to the element you're looking for. This parameter * can be: * * REL234_EQ - find only an element that compares equal to e * REL234_LT - find the greatest element that compares < e * REL234_LE - find the greatest element that compares <= e * REL234_GT - find the smallest element that compares > e * REL234_GE - find the smallest element that compares >= e * * Non-`rel' variants assume REL234_EQ. * * If `rel' is REL234_GT or REL234_LT, the `e' parameter may be * NULL. In this case, REL234_GT will return the smallest element * in the tree, and REL234_LT will return the greatest. This gives * an alternative means of iterating over a sorted tree, instead of * using index234: * * // to loop forwards * for (p = NULL; (p = findrel234(tree, p, NULL, REL234_GT)) != NULL ;) * consume(p); * * // to loop backwards * for (p = NULL; (p = findrel234(tree, p, NULL, REL234_LT)) != NULL ;) * consume(p); */ enum { REL234_EQ, REL234_LT, REL234_LE, REL234_GT, REL234_GE }; void *find234(tree234 *t, void *e, cmpfn234 cmp); void *findrel234(tree234 *t, void *e, cmpfn234 cmp, int relation); void *findpos234(tree234 *t, void *e, cmpfn234 cmp, int *index); void *findrelpos234(tree234 *t, void *e, cmpfn234 cmp, int relation, int *index * delpos234 deletes the element at a particular tree index: it * works on both sorted and unsorted trees. * * del234 deletes the element passed to it, so it only works on * sorted trees. (It's equivalent to using findpos234 to determine * the index of an element, and then passing that index to * delpos234.) * * Both functions return a pointer to the element they delete, for * the user to free or pass on elsewhere or whatever. If the index * is out of range (delpos234) or the element is already not in the * tree (del234) then they return NULL. */ void *del234(tree234 *t, void *e); void *delpos234(tree234 *t, int index); /* * Return the total element count of a tree234. */ int count234(tree234 *t Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 871526959f2176c6a5dc904e16b7c1f0 Text-delta-base-sha1: 8536fda411943e4c7e3415458add88d6623540c1 Text-content-length: 237 Text-content-md5: 997e0f756bf89cc2c4e8b11d47d0de20 Text-content-sha1: 52c7edfb2274d69d6c6036aa70bcb22e25be1625 Content-length: 277 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNZ SS+/int *state) { Actual_Socket s; *state = 0; s = index234(sktree, (*state)++); return s ? s->s : INVALID_SOCKET; } SOCKET next_socket(int *state) { Actual_Socket s = index234(sktree, (*state)++ Revision-number: 1054 Prop-content-length: 197 Content-length: 197 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-16T21:24:38.000000Z K 7 svn:log V 97 countnode234() should politely return 0 when passed NULL. Was breaking delpos234(empty_tree, 0). PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b555ab65bacbce78bbcd4f23046d5f5d Text-delta-base-sha1: d849c29946df404e07ed55c250851f2f68c0abf5 Text-content-length: 41 Text-content-md5: b0f7077eff3aaab445dc6942feee26a4 Text-content-sha1: 3f7629e13bb83c5f3cb853e671719025053c731e Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNXo uioif (!n) return 0 Revision-number: 1055 Prop-content-length: 254 Content-length: 254 K 7 svn:log V 153 Terminal now uses unsorted counted tree234 as its basic data type. Should speed up scrollback to usable levels no matter how big your scrollback buffer. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-16T21:25:13.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ebd13004b9f0bd518c77ab084c16549 Text-delta-base-sha1: df823712e0b8b771548a931e6be1ab202b2edb6c Text-content-length: 13495 Text-content-md5: 5244b4632d51be8ae33ea0b001876484 Text-content-sha1: cf7cadff2394c8d970449bab61f0cfe143348623 Content-length: 13535 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVN]i?vAr\NQ2f}42]q~d8qU5U?(}es` ?/tH+J4Yh5F$ 2I=pnJ F&o|-Rg k!s/)n ~inp(CGt #/](/oU/4R2P!|wwt)tJw\sfnsJwWMtpteOkW@!8azJhF3kzf3T;8I;Q= 0 ? index234(screen, x) : \ index234(scrollback, (x)+count234(scrollback)) ) ) #define fix_cpos do { cpos = lineptr(curs.y) + curs.x; } while(0) static unsigned long curr_attr, save_attr; static unsigned long erase_char = ERASE_CHAR; typedef struct { int y, x; } pos; #define poslt(p1,p2) ( (p1).y < (p2).y || ( (p1).y == (p2).y && (p1).x < (p2).x ) ) #define posle(p1,p2) ( (p1).y < (p2).y || ( (p1).y == (p2).y && (p1).x <= (p2).x ) ) #define poseq(p1,p2) ( (p1).y == (p2).y && (p1).x == (p2).x ) #define posdiff(p1,p2) ( ((p2).y - (p1).y) * (cols+1) + (p2).x - (p1).x ) #define incpos(p) ( (p).x == cols ? ((p).x = 0, (p).y++, 1) : ((p).x++, 0) ) #define decpos(p) ( (p).x == 0 ? ((p).x = cols, (p).y--, 1) : ((p).x--, 0) ) static pos curs; /* cursor */ static pos savecurs; pos selstart, selend, .x = curs.y = alt_x = alt_y = savecurs.x = savecurs.screen0; /* return to main screen */.x, curs.y - disptop0unsigned long *line; disptop = 0; while ((line = delpos234(scrollback, 0)) != NULL) { sfree(line); }screen = alt_screen = scrollback = NULL; disptop = 0tree234 *newsb, *newscreen, *newalt; unsigned long *newdisp, *newwant, *oldline, *line; int i, j, crows, ccols; int posn, oldposn, furthest_back, oldsbsize;sb = newtree234(NULL); newscreen = newtree234(NULL); ccols = (cols < newcols ? cols : newcols); oldsbsize = scrollback ? count234(scrollback) : 0; furthest_back = newrows - rows - oldsbsize; if (furthest_back > 0) furthest_back = 0; if (furthest_back < -newsavelines) furthest_back = -newsavelines; for (posn = newrows; posn-- > furthest_back ;) { oldposn = posn - newrows + rows; if (rows == -1 || oldposn < -oldsbsize) { line = smalloc(TSIZE * (newcols + 1)); for (j = 0; j < newcols; j++) line[j] = erase_char; line[newcols] = 0; } else { oldline = (oldposn >= 0 ? delpos234(screen, count234(screen)-1) : delpos234(scrollback, count234(scrollback)-1)); if (newcols != cols) { line = smalloc(TSIZE * (newcols + 1)); for (j = 0; j < ccols; j++) line[j] = oldline[j]; for (j = ccols; j < newcols; j++) line[j] = erase_char; line[newcols] = oldline[cols] & LATTR_MODE; sfree(oldline); } else { line = oldline; } } if (posn >= 0) addpos234(newscreen, line, 0); else addpos234(newsb, line, 0); } disptop = 0; if (scrollback) freetree234(scrollback); if (screen) freetree234(screen); scrollback = newsb; screen = newscreennewtree234(NULL); for (i=0; i= newrows) curs.y = newrows-1; if (curs.x >= newcols) curs. tree234 *ttr; if (which == alt_which) return; alt_which = which; ttr = alt_screen; alt_screen = screen; screen = ttr; t = curs.x; curs.x = alt_x; alt_x = t; t = curs.y; curs.nscreen, nscroll; nscroll = count234(scrollback); set_sbar (nscroll + rows, nscroll + disptop,pos from, pos to) { if (poslt(from, selend) && poslt(selstart, to)line, *line2; int i; if (topline != 0) sb = FALSE; if (lines < 0) { while (lines < 0) { line = delpos234(screen, botline); for (i = 0; i < cols; i++) line[i] = erase_char; line[cols] = 0; addpos234(screen, line, topline); if (selstart.y >= topline && selstart.y <= botline) { selstart.y++; if (selstart.y > botline) { selstart.y = botline; selstart.x = 0; } } if (selend.y >= topline && selend.y <= botline) { selend.y++; if (selend.y > botline) { selend.y = botline; selend.x = 0; } } lines++; } } else { while (lines > 0) { line = delpos234(screen, topline); if (sb) { int sblen = count234(scrollback); /* * We must add this line to the scrollback. We'll * remove a line from the top of the scrollback to * replace it, or allocate a new one if the * scrollback isn't full. */ if (sblen == savelines) sblen--, line2 = delpos234(scrollback, 0); else line2 = smalloc(TSIZE * (cols+1)); addpos234(scrollback, line, sblen); line = line2; } for (i = 0; i < cols; i++) line[i] = erase_char; line[cols] = 0; addpos234(screen, line, botline); if (selstart.y >= topline && selstart.y <= botline) { selstart.y--; if (selstart.y < topline) { selstart.y = topline; selstart.x = 0; } } if (selend.y >= topline && selend.y <= botline) { selend.y--; if (selend.y < topline) { selend.y = topline; selend.x = 0; } } lines--...x = x; curs.curs = curs; save_attr = curr_attr; save_cset = cset; save_csattr = cset_attr[cset]; } else { curs = savecurs; /* Make sure the window hasn't shrunk since the save */ if (curs.x >= cols) curs.x = cols-1; if (curs.y >= rows) curs.pos start, end, here; int erase_lattr; unsigned long *ldata; if (line_only) { start.y = curs.y; start.x = 0; end.y = curs.y + 1; end.x = 0; erase_lattr = FALSE; } else { start.y = 0; start.x = 0; end.y = rows; end.x = 0; erase_lattr = TRUE; } if (!from_begin) { start = curs; } if (!to_end) { end = curs; } check_selection (start, end); /* Clear screen also forces a full window redraw, just in case. */ if (start.y == 0 && start.x == 0 && end.y == rows) term_invalidate(); ldata = lineptr(start.y); while (poslt(start, end)) { if (start.y == cols && !erase_lattr) ldata[start.x] &= ~ATTR_WRAPPED; else ldata[start.x] = erase_char; if (incpos(start)) ldata = lineptr(start.y); } pos cursplus; unsigned long *ldata; n = (n < 0 ? -n : n); if (n > cols - curs.x) n = cols - curs.x; m = cols - curs.x - n; cursplus.y = curs.y; cursplus.x = curs.x + n; check_selection (curs, cursplus); ldata = lineptr(curs.y); if (dir < 0) { memmove (ldata + curs.x, ldata + curs.x + n, m*TSIZE); while (n--) ldata[curs.x + m++] = erase_char; } else { memmove (ldata + curs.x + n, ldata + curs.x, m*TSIZE); while (n--) ldata[curs.x + 00; } break; case '\b': if (curs.x == 0 && curs.y == 0) ; else if (curs.x == 0 && curs.y > 0) curs.x = cols-1, curs.y--; else if (wrapnext) wrapnext = FALSE; else curs...y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs.y < rows-1) curs.y++; if (cfg.lfhascr) curs.pos old_curs = curs; unsigned long *ldata = lineptr(curs.y); do { curs.x++; } while (curs.x < cols-1 && !tabs[curs.x]); if ((ldata[cols] & LATTR_MODE) != LATTR_NORM) { if (curs.x >= cols/2) curs.x = cols/2-1; } else { if (curs.x >= cols) curs.x = cols-1; } fix_cpos; check_selection (old_curs, cur.x && !wrapnext) curs..y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs.y < rows-1) curs.y++; curs. { pos cursplus = curs; incpos(cursplus); check_selection (curs, cursplus); } switch (cset_attr[cset]) { /* * Linedraw characters are different from 'ESC ( B' * only for a small range. For ones outside that * range, make sure we use the same font as well as *.x++; if (curs.x == cols) { cpos--; curs..y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs.y < rows-1) curs..x = 0; if (curs.y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs.y < rows-1) curs.M': /* reverse index - backwards LF */ compatibility(VT100); if (curs.y == marg_t) scroll (marg_t, marg_b, -1, TRUE); else if (curs.y > 0) curs.y--0..x, curs..x, curs.y +.x + def(esc_args[0], 1), curs..x - def(esc_args[0], 1), curs..y +F': /* move up N lines and CR */ compatibility(ANSI); move (0, curs...0.y <= marg_b) scroll (curs..y <= marg_b) scroll (curs..y + 1, curs....pos cursplus; unsigned long *p = cpos; if (n > cols - curs.x) n = cols - curs.x; cursplus = curs; cursplus.x += n; check_selection (curs, cursplusunsigned long *ldata; int i, j; pos scrtop, scrbot; switch (c) { case '8': for (i = 0; i < rows; i++) { ldata = lineptr(i); for (j = 0; j < cols; j++) ldata[j] = ATTR_DEFAULT | 'E'; ldata[cols] = 0; } disptop = 0; seen_disp_event = TRUE; scrtop.x = scrtop.y = 0; scrbot.x = 0; scrbot.y = rows; check_selection (scrtop, scrbot); break; case '3': nlattr = LATTR_TOP; goto lattr_common; case '4': nlattr = LATTR_BOT; goto lattr_common; case '5': nlattr = LATTR_NORM; goto lattr_common; case '6': nlattr = LATTR_WIDE; lattr_common: ldata = lineptr(curs.y); ldata[cols] &= ~LATTR_MODE; ldata[cols].x, curs.y - 1, 1); break; case 'B': move (curs.x, curs.y + 1, 1); break; case 'C': move (curs.x + 1, curs.y, 1); break; case 'D': move (curs.x - 1, curs..y == 0) scroll (0, rows-1, -1, TRUE); else if (curs.y > 0) curs.0..y, 0); break; } if (selstate != NO_SELECTION) { pos cursplus = curs; incpos(cursplus); check_selection (curs, cursplus); } { int i, j, start, our_curs_y; unsigned long attr, rv, cursor; pos scrpos.y, curs..y - disptop; for (i=0; i 0 ? sbtop : disptop) + where; if (disptop < sbtop) disptop = sbtop; if (disptop > 0) disptop = 0; update_sbar(); term_update(); } static void clipme(pos top, pos poslt(top, bottom)) { int nl = FALSE; unsigned long *ldata = lineptr(top.y); pos lineend, nlpos; nlpos.y = top.y; nlpos.x = cols; if (!(ldata[cols] & ATTR_WRAPPED)) { while ((ldata[nlpos.x-1] & CHAR_MASK) == 0x20 && poslt(top, nlpos)) decpos(nlpos); if (poslt(nlpos, bottom)) nl = TRUE; } while (poslt(top, bottom) && poslt(top, nlpos)) { int ch = (ldata[top.x] & CHAR_MASK); int set = (ldata[top.x].x.y++; top.x = 0;pos top; top.y = -count234(scrollback); top.x = 0; clipme(top, curpos sel_spread_half (pos p, int dir) { unsigned long *ldata; int x; short wvalue; ldata = lineptr(p.y)data[cols] & ATTR_WRAPPED)) { unsigned long *q = ldata+cols; while (q > ldata && (q[-1] & CHAR_MASK) == 0x20) q--; if (q == ldata+cols) q--; if (p.x >= q-ldata) p.x = (dir == -1 ? q-ldata : colsldata[p.x] & CHAR_MASK]; if (dir == +1) { while (p.x < cols && wordness[ldata[p.x+1] & CHAR_MASK] == wvalue) p.x++; } else { while (p.x > 0 && wordness[ldata[p.x-1] & CHAR_MASK] == wvalue) p.x--; } break; case SM_LINE: /* * In this mode, every line is a unit. */ p.x = (dir == -1 ? 0 : colsdecpos(selend); selend = sel_spread_half (selend, +1); incpos(selend); } void term_mouse (Mouse_Button b, Mouse_Action a, int x, int y) { pos selpoint; unsigned long *ldata.y = y + disptop; selpoint.x = x; ldata = lineptr(selpoint.y); if ((ldata[cols]&LATTR_MODE) != LATTR_NORM) selpoint.x /= 2; incpos(selend)poseq(selanchor, selpoint)) return; if (b == MB_EXTEND && a != MA_DRAG && selstate == SELECTED) { if (posdiff(selpoint,selstart) < posdiff(selend,selstart)/2) { selanchor = selend; decpos(selanchor); } else { selanchor = selstart; }poslt(selpoint, selanchor)) { selstart = selpoint; selend = selanchor; incpos(selend); } else { selstart = selanchor; selend = selpoint; incpos(selpoint).x = selstart.y = selend.x = selend.y = 0 Revision-number: 1056 Prop-content-length: 354 Content-length: 354 K 8 svn:date V 27 2001-04-16T21:29:12.000000Z K 7 svn:log V 253 Put back Robert de Bath's second level of bell overload tracking. It had a useful purpose: when primary overload handling is disabled, it prevents MessageBeep calls overloading the program, because they don't cancel each other like async PlaySounds do. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c8108a652b3e090c82eeab3730783fa5 Text-delta-base-sha1: 753be676a07ced405f3a99c2cd63f2582a32f93a Text-content-length: 452 Text-content-md5: 1cca01642fd68c6228674fd6105e2198 Text-content-sha1: e83f27146f9564662a496cf024114d097e1d37db Content-length: 493 K 15 cvs2svn:cvs-rev V 5 1.119 PROPS-END SVN`v(N(`/* * For MessageBeep style bells, we want to be careful of * timing, because they don't have the nice property of * PlaySound bells that each one cancels the previous * active one. So we limit the rate to one per 50ms or so. */ static long lastbeep = 0; long now, beepdiff; now = GetTickCount(); beepdiff = now - lastbeep; if (beepdiff >= 0 && beepdiff < 50) return; MessageBeep(MB_OK); lastbeep = now Revision-number: 1057 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2001-04-16T21:33:18.000000Z K 7 svn:log V 50 Include and winmm.lib for PlaySound. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 40178e28caf7f0740b9838cdc20be37e Text-delta-base-sha1: 580003d137430adc49192ba6d12e169a2880fa9c Text-content-length: 27 Text-content-md5: 066aaa2cbbe75254d30f0c262c66c9c5 Text-content-sha1: 38d64372f9826cf292189d3b1d4ecff53a0abb9f Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN |x winmm Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1cca01642fd68c6228674fd6105e2198 Text-delta-base-sha1: e83f27146f9564662a496cf024114d097e1d37db Text-content-length: 98 Text-content-md5: 6704847fee439ee9e68cfcfc4400eb9a Text-content-sha1: 9c08098b818d38e9b08015f1ba04d3d1f2e4fdaf Content-length: 139 K 15 cvs2svn:cvs-rev V 5 1.120 PROPS-END SVNv NN>8#include #include #include #include # j\L]Z#include /* for size_t */ #include /* for memcpy() */ /* smalloc a thing */ #define smalloca(type) ((type *) smalloc (sizeof (type))) /* smalloc a copy of a thing */ #define smallocc(ptr) memcpy (smalloc (sizeof (*ptr)), ptr, sizeof (*ptr)) /* smalloc n things */ #define smallocn(n,type) ((type *) smalloc ((n) * sizeof (type))) #endif Revision-number: 1080 Prop-content-length: 231 Content-length: 231 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-28T11:24:45.000000Z K 7 svn:log V 130 Remove my dire-warning `FIXME' in IPv4 dotted-decimal handling because Jeroen points out that it's perfectly OK the way it is :-) PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 997e0f756bf89cc2c4e8b11d47d0de20 Text-delta-base-sha1: 52c7edfb2274d69d6c6036aa70bcb22e25be1625 Text-content-length: 124 Text-content-md5: 1adf2b58e59396c80f62101be440e227 Text-content-sha1: 31925305ff529da81ad534bd9fd4ccc50a7aba6a Content-length: 164 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN n d.d\0 /* * This must be a numeric IPv4 address because it caused a * success return from inet_addr. Revision-number: 1081 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 Add -lwinmm to Cygwin makefile. Thanks Jacob. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-28T11:25:03.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b21111285b3a904de9a3f36c92ae1afb Text-delta-base-sha1: 0958a385e3a66fb8b0a3b2c697e1850fb6a9225a Text-content-length: 29 Text-content-md5: 3df72c4d9248de45ef56c85df56286a7 Text-content-sha1: 04e3680ae83b6b94b6156bca27408f88453d1b29 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNV^ T -lwinmm Revision-number: 1082 Prop-content-length: 273 Content-length: 273 K 8 svn:date V 27 2001-04-28T11:25:58.000000Z K 7 svn:log V 172 Fix completely stupid agent_exists test. (Hint to self: you have to actually _call_ a boolean-returning function, not just test its address for nonzerohood.) Thanks Jacob. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 43ea4fa76ed9be5ec8ae04dab266e77b Text-delta-base-sha1: c8543d89cbc49fbb47dd9eede66a483ebbb47598 Text-content-length: 42 Text-content-md5: 39c9579c1527448754e3fd2cc0e03bfc Text-content-sha1: be27be12aba3933f6003d83d8d21d1338bebc7a9 Content-length: 83 K 15 cvs2svn:cvs-rev V 5 1.139 PROPS-END SVN*, () Revision-number: 1083 Prop-content-length: 275 Content-length: 275 K 8 svn:date V 27 2001-04-28T11:27:04.000000Z K 7 svn:log V 174 Only update the system caret when we have the focus. This was apparently causing the weird caret behaviour in Change Settings, because that routine was still being called... K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6704847fee439ee9e68cfcfc4400eb9a Text-delta-base-sha1: 9c08098b818d38e9b08015f1ba04d3d1f2e4fdaf Text-content-length: 42 Text-content-md5: a4241295ba8ccce0a55171bfafd81e9b Text-content-sha1: 408c4f81a8faaa2b090093e5b14388eec106c15e Content-length: 83 K 15 cvs2svn:cvs-rev V 5 1.121 PROPS-END SVN  ,`,if (has_focus) Revision-number: 1084 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 56 Jacob's patch to make passphrase boxes work more sanely K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-28T11:41:33.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b9b62541fccabe7db84d51ec7e2f8e3a Text-delta-base-sha1: 4739f97f469b053573e6008c49419686ab95a95b Text-content-length: 124 Text-content-md5: b8527e957bee145297701fc1ebc66d88 Text-content-sha1: 22836a8143326f6e8cc9ad247edf42b1989a25bb Content-length: 164 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN`X'"5d = NULLSetDlgItemText (hwnd, 102, passphrase)(HIWORD(wParam) == EN_CHANGE) && passphrase Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7f58dbd1568b277151aea4b6e1af671a Text-delta-base-sha1: 411c15f52d6960d13bec59ba80c46077f5f1a91f Text-content-length: 38 Text-content-md5: 0c21234ae0db5c8627135679237d2f31 Text-content-sha1: 4f87ad122996345d6126d09cba7c3256c8e69c23 Content-length: 77 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN>O GwG | ES_AUTOHSCROLL Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bc28ef9d775250ab186f52612a93f9fd Text-delta-base-sha1: 4936d13b6011f4cc2369c1bde26895d9b85ee6e4 Text-content-length: 123 Text-content-md5: 0394f55aef9e34762362cae47ca545e7 Text-content-sha1: e5412c5ca2185eb901973f579e594e29c08c731b Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNMW]]'n0 = NULLSetDlgItemText(hwnd, 102, passphrase)(HIWORD(wParam) == EN_CHANGE) && passphrase Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7a9c244ef840f2cf1108477c912bd42a Text-delta-base-sha1: b4f0333d844a49d31b0b5209b56b114eeb175838 Text-content-length: 38 Text-content-md5: ab4029a55ea5c98852156f94c337fc0a Text-content-sha1: 535e05af0fd7974a2d3fb7f8f8e4b5716d4962e8 Content-length: 77 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN1B Q`Q | ES_AUTOHSCROLL Revision-number: 1085 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2001-04-28T12:07:41.000000Z K 7 svn:log V 52 Add the missing "all" target in the Cygwin makefile K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3df72c4d9248de45ef56c85df56286a7 Text-delta-base-sha1: 04e3680ae83b6b94b6156bca27408f88453d1b29 Text-content-length: 24 Text-content-md5: f838f03f651c23f005016177b7394552 Text-content-sha1: f241b6f729a965dae72ddb4ef7e328587300cb5f Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN^ y}%'7 Revision-number: 1086 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2001-04-28T14:39:16.000000Z K 7 svn:log V 147 Arrange that explicit visual bells performed using ESC[?5h and ESC[?5l in immediate succession will still give a visibly long flash of the screen. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 113d1538dc9a06a1313aa237ea69a6cc Text-delta-base-sha1: 55c45993e9f285e5f473c10db78e238e02f2ed2e Text-content-length: 866 Text-content-md5: 4a013a3fbcaf7eca7c0880f24299f658 Text-content-sha1: e06ad5e231c2cacf0b76f9b71956362a5546cc30 Content-length: 906 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNo>9/F iaq'Hrvbell_timeout; /* for explicit (ESC[?5hESC[?5l) vbelllong ticks;/* * Toggle reverse video. If we receive an OFF within the * visual bell timeout period after an ON, we trigger an * effective visual bell, so that ESC[?5hESC[?5l will * always be an actually _visible_ visual bell. */ ticks = GetTickCount(); if (rvideo && !state && /* we're turning it off */ ticks < rvbell_timeout) { /* and it's not long since it was turned on */ in_vbell = TRUE; /* we may clear rvideo but we set in_vbell */ if (vbell_timeout < rvbell_timeout) /* don't move vbell end forward */ vbell_timeout = rvbell_timeout; /* vbell end is at least then */ } else if (!rvideo && state) { /* This is an ON, so we notice the time and save it. */ rvbell_timeout = ticks + VBELL_TIMEOUT; } Revision-number: 1087 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2001-04-28T15:32:25.000000Z K 7 svn:log V 61 Implement lazy horizontal resizing of screen and scrollback. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4a013a3fbcaf7eca7c0880f24299f658 Text-delta-base-sha1: e06ad5e231c2cacf0b76f9b71956362a5546cc30 Text-content-length: 3519 Text-content-md5: 67fa98d97f26645e289ff260883296ef Text-content-sha1: 111e25e87e6f980355a88f65056310c0bea1fa46 Content-length: 3559 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVN>obOlp_U1v;cfNjB{S-VzO(F='VXf8<<Fx= 0) { whichtree = screen; treeindex = y; } else { whichtree = scrollback; treeindex = y + count234(scrollback); } line = index234(whichtree, treeindex); /* We assume that we don't screw up and retrieve something out of range. */ if (line == NULL) { debug(("line=%d y=%d treeindex=%d\n", lineno, y, treeindex)); debug(("screen:%d scrollback:%d\n", count234(screen), count234(scrollback))); assert(line != NULL); } if (line[0] != cols) { /* * This line is the wrong length, which probably means it * hasn't been accessed since a resize. Resize it now. */ oldlen = line[0]; lineattrs = line[oldlen+1]; delpos234(whichtree, treeindex); line = srealloc(line, TSIZE * (2+cols)); line[0] = cols; for (i = oldlen; i < cols; i++) line[i+1] = ERASE_CHAR; line[cols+1] = lineattrs & LATTR_MODE; addpos234(whichtree, line, treeindex); } return line+1; } #define lineptr(x) lineptr(x,__LINE__)sblenif (rows == -1) { scrollback = newtree234(NULL); screen = newtree234(NULL); rows = 0; } /* * Resize the screen and scrollback. We only need to shift * lines around within our data structures, because lineptr() * will take care of resizing each individual line if * necessary. So: * * - If the new screen and the old screen differ in length, we * must shunt some lines in from the scrollback or out to * the scrollback. * * - If doing that fails to provide us with enough material to * fill the new screen (i.e. the number of rows needed in * the new screen exceeds the total number in the previous * screen+scrollback), we must invent some blank lines to * cover the gap. * * - Then, if the new scrollback length is less than the * amount of scrollback we actually have, we must throw some * away. */ sblen = count234(scrollback); debug(("resizing rows=%d sblen=%d newrows=%d newsb=%d\n", rows, sblen, newrows, newsavelines)); if (newrows > rows) { for (i = rows; i < newrows; i++) { if (sblen > 0) { line = delpos234(scrollback, --sblen); } else { line = smalloc(TSIZE * (newcols+2)); line[0] = newcols; for (j = 0; j <= newcols; j++) line[j+1] = ERASE_CHAR; } addpos234(screen, line, 0); } } else if (newrows < rows) { for (i = newrows; i < rows; i++) { line = delpos234(screen, 0); addpos234(scrollback, line, sblen++); } } assert(count234(screen) == newrows); while (sblen > newsavelines) { line = delpos234(scrollback, 0); sfree(line); sblen--; } assert(count234(scrollback) <= newsavelines); debug(("screen:%d scrollback:%d\n", count234(screen), count234(scrollback))); disptop = 0; newdisp2)); line[0] = newcols; for (j = 0; j <= newcols; j++) line[j+1+1] = erase_char; line[cols+1 && savelines > 0 { sblen--, line2 = delpos234(scrollback, 0); } else { line2 = smalloc(TSIZE * (cols+2)); line2[0] = cols; }+1] = erase_char; line[cols+1 && start.y < rows Revision-number: 1088 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2001-04-28T15:33:48.000000Z K 7 svn:log V 45 Remove stray diagnostics. When will I learn? K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 67fa98d97f26645e289ff260883296ef Text-delta-base-sha1: 111e25e87e6f980355a88f65056310c0bea1fa46 Text-content-length: 59 Text-content-md5: 68dbd7050b095c1c434a1d8e43475433 Text-content-sha1: b53a8217f480e1ce58c3328517d7775a85d458a3 Content-length: 99 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNoY0 ,f assert(line != NULL); Revision-number: 1089 Prop-content-length: 235 Content-length: 235 K 8 svn:date V 27 2001-04-28T15:47:26.000000Z K 7 svn:log V 134 The bell overload times are now measured in milliseconds, although the config box still enters them in seconds (it allows fractions). K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: de2ae199cd2052c0071fe8c4f307589f Text-delta-base-sha1: 755cb43d90887b9afcc7207455a6254857c9392b Text-content-length: 86 Text-content-md5: 078b516a34fc639b90e44ce26dcb36b0 Text-content-sha1: 70c08bf4ba193ea634ba31050d6d861d48a0ac79 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNQW ?5cn000, &cfg->bellovl_t); gppi (sesskey, "BellOverloadS", 5000 Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 68dbd7050b095c1c434a1d8e43475433 Text-delta-base-sha1: b53a8217f480e1ce58c3328517d7775a85d458a3 Text-content-length: 31 Text-content-md5: 88c6f77797bbdf799ee184ce78172c5b Text-content-sha1: cc46274ec0590e0c0eacf18b5ca4b8142bd3ee13 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNx^}1b Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cfc070d5eb8f57600acd37d8f549c65f Text-delta-base-sha1: 45bda6b40d735e1409bff83ac8f3746eba85450c Text-content-length: 684 Text-content-md5: 2df47ed75dcba704347b4f29205fab7a Text-content-sha1: 1767eef411d8f04bdb40f6523763b4400b46267d Content-length: 725 K 15 cvs2svn:cvs-rev V 5 1.123 PROPS-END SVN0(v6t9*}oX|nXX@void MyGetDlgItemFlt (HWND hwnd, int id, int *result, int scale) { char text[80]; BOOL ok; ok = GetDlgItemText (hwnd, id, text, sizeof(text)-1); if (ok && text[0]) *result = (int) (scale * atof(text)); } static void MySetDlgItemFlt (HWND hwnd, int id, double value) { char text[80]; sprintf(text, "%g", value); SetDlgItemText (hwnd, id, text)MySetDlgItemFlt (hwnd, IDC_BELLOVLT, cfg.bellovl_t / 1000.0); MySetDlgItemFlt (hwnd, IDC_BELLOVLS, cfg.bellovl_s / 1000.0Flt (hwnd, IDC_BELLOVLT, &cfg.bellovl_t, 1000Flt (hwnd, IDC_BELLOVLS, &cfg.bellovl_s, 1000); break; case IDC_BLINKTEXT Revision-number: 1090 Prop-content-length: 356 Content-length: 356 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-28T17:18:47.000000Z K 7 svn:log V 255 Put the \001 prefix back on scp error messages when they're sent to the server. (Not sure _why_ they're sent to the server; scp is weird.) It may be pointless when sent to the screen, which is why I removed it, but it's extremely pointful on the wire :-( PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a5d4d25f385a58cd63f02df78d9b1956 Text-delta-base-sha1: 3d01817d5a7f46c03acb44687da14762c4c239fd Text-content-length: 75 Text-content-md5: c91f53c2308689b3dc6c6dced68b9ba8 Text-content-sha1: 4b0be0c5533372735b0e6449f21fd93eb5a68668 Content-length: 115 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVN(j 2#"\001", 1); /* scp protocol error prefix */ Revision-number: 1091 Prop-content-length: 413 Content-length: 413 K 7 svn:log V 312 Debugging improvements. Started using Dave Hinton's dmemdump function (woohoo!), improved that function so it provides an ASCII dump as well as hex (whee!), removed all remaining spurious \r in debug statements (ooh!), and made enabling of packet debugging in SSH a matter of one ifdef rather than lots (phew!). K 10 svn:author V 5 simon K 8 svn:date V 27 2001-04-28T17:35:18.000000Z PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2fe903bdd4fdccdf00a4d858c857b24c Text-delta-base-sha1: 63af7cff96b1e35ab9b68005fe13ce12d84fb7fa Text-content-length: 278 Text-content-md5: e2da8ca03d6ae2057bc973591e4efd0a Text-content-sha1: ba7134154d878f014bb94cf0b80e67a31522147e Content-length: 317 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNHp ;YseyV}$dchar foo[17] "); if (L) dprintf ("%p: ", p); strcpy(foo, "................"); /* sixteen dots */ foo[i] = ' '; if (p[i] >= ' ' && p[i] <= '~') foo[i] = (char)p[i]; } } foo[i] = '\0'; dprintf("%*s%s\n", (16-i)*3+2, "", foo Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b8527e957bee145297701fc1ebc66d88 Text-delta-base-sha1: 22836a8143326f6e8cc9ad247edf42b1989a25bb Text-content-length: 141 Text-content-md5: 0d81d82f361156a43986e9dfd4b23392 Text-content-sha1: dbf8ed46a157ef33061c4ea5e8aee19362b9e83b Content-length: 181 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN`L=C5'GCp 5P@7KC2.n", p)); {int i; for(i=0;i<5;i++)debug(("p[%d]=%02x Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 39c9579c1527448754e3fd2cc0e03bfc Text-delta-base-sha1: be27be12aba3933f6003d83d8d21d1338bebc7a9 Text-content-length: 2135 Text-content-md5: a02324b7d0cf15c5459c42556bcec313 Text-content-sha1: e757f17734d9adfcc64ec7930be50d674f389b4f Content-length: 2176 K 15 cvs2svn:cvs-rev V 5 1.140 PROPS-END SVNmKhJcfqZ j=Xk tWb:#n{i,!esgR+!=^`_!/* uncomment this for packet level debugging */ /* #define DUMP_PACKETS */def DUMP_PACKETS debug(("Got packet len=%d pad=%d\n", st->len, st->pad)); dmemdump(pktin.data, st->biglendef DUMP_PACKETS debug(("Packet payload pre-decompression:\n")); dmemdump(pktin.body-1, pktin.length+1);def DUMP_PACKETS debug(("Packet payload post-decompression:\n")); dmemdump(pktin.body-1, pktin.length+1);def DUMP_PACKETS debug(("Got packet len=%d pad=%d\n", st->len, st->pad)); dmemdump(pktin.data, st->packetlendef DUMP_PACKETS debug(("Post-decompression payload:\n")); dmemdump(pktin.data+5, newlendef DUMP_PACKETS debug(("Packet payload pre-compression:\n")); dmemdump(pktout.body-1, pktout.length+1def DUMP_PACKETS debug(("Packet payload post-compression:\n")); dmemdump(pktout.body-1, pktout.length+1def DUMP_PACKETS debug(("Sending packet len=%d\n", biglen+4)); dmemdump(pktout.data, biglen+4def DUMP_PACKETS debug(("Pre-compression payload:\n")); dmemdump(pktout.data+5, pktout.length-5def DUMP_PACKETS debug(("Sending packet len=%d\n", pktout.length+padding)); dmemdump(pktout.data, pktout.length+paddingn")); dmemdump(exchange_hash, 20 received during authentication: type %d", pktin.type)); crReturnV; } gotit = FALSE; /* * OK, we're now sitting on a USERAUTH_FAILURE message, so * we can look at the string in it and know what we can * helpfully try next. */ { char *methods; int methlen; ssh2_pkt_getstring(&methods, &methlen); if (!ssh2_pkt_getbool()) { /* * We have received an unequivocal Access * Denied. This can translate to a variety of * messages: * * - if we'd just tried "none" authentication, * it's not worth printing anything at all * * - if we'd just tried a public key _offer_, * the message should be "Server refused our * key" (or no message at all if the key ,   Revision-number: 1092 Prop-content-length: 249 Content-length: 249 K 8 svn:date V 27 2001-04-28T18:02:19.000000Z K 7 svn:log V 148 Add Jordan Russell's patch for a sunken-edge border like a DOS box. Configurable, of course, because I for one like the border as thin as possible. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0b496d69bce03ea75710349c82993614 Text-delta-base-sha1: c062f755a592d0ae6546de9a5063efc7665315f4 Text-content-length: 36 Text-content-md5: d56fe753dc1ade0cf62400e6bbf7b08b Text-content-sha1: 00cce43bcbc6971cb5752b5e96eae771b0e5b5a4 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.92 PROPS-END SVNOd S|int sunken_edge Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 078b516a34fc639b90e44ce26dcb36b0 Text-delta-base-sha1: 70c08bf4ba193ea634ba31050d6d861d48a0ac79 Text-content-length: 91 Text-content-md5: cac734101e7e65db021976b50539c7b2 Text-content-sha1: a55016bbc3a58e4248461694db0f4692ea4aa89b Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNWN>"F(/SunkenEdge", cfg->sunken_edgeSunkenEdge", 0, &cfg->sunken_edge Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2df47ed75dcba704347b4f29205fab7a Text-delta-base-sha1: 1767eef411d8f04bdb40f6523763b4400b46267d Text-content-length: 440 Text-content-md5: 4f6de2b4b81303d12cc19caad9280d87 Text-content-sha1: aa891b9ed97cd19d5d4fa7ea8a538984ec09d95d Content-length: 481 K 15 cvs2svn:cvs-rev V 5 1.124 PROPS-END SVN0J`mRcV.:xs9 &t8#%3H+WWY~^RBOX_APPEARANCE5IDC_SUNKENEDGDlgButton (hwnd, IDC_SUNKENEDGE, cfg.sunken_edge beginbox(&cp, "Adjust the window border", IDC_BOX_APPEARANCE5); checkbox(&cp, "&Sunken-edge border (slightly thicker)", IDC_SUNKENEDGSUNKENEDGEsunken_edge = IsDlgButtonChecked (hwnd, IDC_SUNKENEDGE); break; case IDC_CURBLO Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a4241295ba8ccce0a55171bfafd81e9b Text-delta-base-sha1: 408c4f81a8faaa2b090093e5b14388eec106c15e Text-content-length: 440 Text-content-md5: a0e1519e81060e192ad8189aa5818e6e Text-content-sha1: 4db8f14f3a48cc5f9774358ffd1e76f89bb4ad0f Content-length: 481 K 15 cvs2svn:cvs-rev V 5 1.122 PROPS-END SVN2x;EEJt b@f.D%3i|= WS_EX_TOPMOST; if (cfg.sunken_edge) exwinmode |= WS_EX_CLIENTEDGE int prev_sunken_edge = cfg.sunken_edge|&= ~(WS_EX_TOPMOST) if (cfg.sunken_edge) nexflag |= WS_EX_CLIENTEDGE; else nexflag &= ~(WS_EX_CLIENTEDGE); || cfg.sunken_edge != prev_sunken_edge Revision-number: 1093 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2001-04-28T18:23:58.000000Z K 7 svn:log V 122 Reduce out-of-focus timer interval to 2 seconds so we still have some control over keepalives when not in the foreground. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a0e1519e81060e192ad8189aa5818e6e Text-delta-base-sha1: 4db8f14f3a48cc5f9774358ffd1e76f89bb4ad0f Text-content-length: 28 Text-content-md5: eadf2981a058453075a356cbb4a00ede Text-content-sha1: 197ffbc665a74f7f41143d563abf38198f578e5e Content-length: 69 K 15 cvs2svn:cvs-rev V 5 1.123 PROPS-END SVN G;J20 Revision-number: 1094 Prop-content-length: 231 Content-length: 231 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-02T08:59:36.000000Z K 7 svn:log V 130 TEMPORARY ONLY: enable debugging on default build to try to get tomorrow's nightly to show us what the problem with term_size is. PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cd5a3e4dc9e145f09bc293b0be97921e Text-delta-base-sha1: e2fc868b69e633cb3c47dedfac314dc18167a73c Text-content-length: 181 Text-content-md5: 00b396c47b5fea2dc678b5f00f74c43a Text-content-sha1: 6426a6bdcd6b2fe5406ea4664eb7d5797196f60a Content-length: 221 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVNXN #5CFLAGS = /W3 /YX /Yd /O1 /Gi /D_WINDOWS /DDEBUG LFLAGS = /debug # Disable debug and incremental linking and compiling #CFLAGS = /nologo /W3 /O1 /D_WINDOWS # Revision-number: 1095 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2001-05-02T14:45:25.000000Z K 7 svn:log V 138 Extra diagnostics in the hope that we can track down the problem with the nightlies. I must remember to take it all out again when we do! K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 88c6f77797bbdf799ee184ce78172c5b Text-delta-base-sha1: cc46274ec0590e0c0eacf18b5ca4b8142bd3ee13 Text-content-length: 926 Text-content-md5: 927da5217fe184937bbb8f635c2d5441 Text-content-sha1: 59a7eee8608d2c5d523f5247de8c0e554d253866 Content-length: 966 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN-"nRWK (j*+)^debug(("term_size, old r,c,s (%d,%d,%d), new rcs (%d,%d,%d)\n", rows, cols, savelines, newrows, newcols, newsavelines))debug(("newrows=%d rows=%d sblen=%d\n", newrows, rows, sblen)); if (newrows > rows) { for (i = rows; i < newrows; i++) { debug(("increase screen: i=%d\n", i)); if (sblen > 0) { debug(("sblen=%d so use line from scrollback\n", sblen)); line = delpos234(scrollback, --sblen); } else { debug(("sblen=%d so make up a new line\n", sblen)); debug(("got new screen line %p\n", line)); debug(("decrease screen: i=%d\n", i)); line = delpos234(screen, 0); debug(("taken out line %p, count is now %d\n", line, count234(screen))); addpos234(scrollback, line, sblen++); debug(("added to scrollback, sblen is now %d\n", sblen) Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 40cdca1c1456e1206f8462104ec24aa6 Text-delta-base-sha1: b095c5d22c2035ea8f6261c2a3e504436c978f32 Text-content-length: 57 Text-content-md5: 5e68f5f76c92d3784eaaf57c00e72389 Text-content-sha1: d25cb93f4b61f36742229afbcbfd2a2ed402224f Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNcx !O// FIXME #define LOG(x) (dprintf Revision-number: 1096 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2001-05-03T10:10:53.000000Z K 7 svn:log V 66 Remove diagnostics and attempt to work around VC compiler bug :-( K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 00b396c47b5fea2dc678b5f00f74c43a Text-delta-base-sha1: 6426a6bdcd6b2fe5406ea4664eb7d5797196f60a Text-content-length: 122 Text-content-md5: cd5a3e4dc9e145f09bc293b0be97921e Text-content-sha1: e2fc868b69e633cb3c47dedfac314dc18167a73c Content-length: 162 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNNX`G>#+# CFLAGS = /nologo /W3 /YX /Yd /O1 /Gi /D_WINDOWS /DDEBUG # CFLAGS = /nologo /W3 /O1 /D_WINDOWS Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 927da5217fe184937bbb8f635c2d5441 Text-delta-base-sha1: 59a7eee8608d2c5d523f5247de8c0e554d253866 Text-content-length: 620 Text-content-md5: 748e0da9f819982155cc0f94e867e6b2 Text-content-sha1: bc50a57636b64a747b77392d428a0bbc29b6a9b6 Content-length: 660 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN-LRP[L$ /* Do this loop to expand the screen if newrows > rows */ for (i = rows; i < newrows; i++) { if (sblen > 0) { line = delpos234(scrollback, --sblen); } else { line = smalloc(TSIZE * (newcols+2)); line[0] = newcols; for (j = 0; j <= newcols; j++) line[j+1] = ERASE_CHAR; } addpos234(screen, line, 0); } /* Do this loop to shrink the screen if newrows < rows */ for (i = newrows; i < rows; i++) { line = delpos234(screen, 0); addpos234(scrollback, line, sblen++); Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5e68f5f76c92d3784eaaf57c00e72389 Text-delta-base-sha1: d25cb93f4b61f36742229afbcbfd2a2ed402224f Text-content-length: 36 Text-content-md5: 40cdca1c1456e1206f8462104ec24aa6 Text-content-sha1: b095c5d22c2035ea8f6261c2a3e504436c978f32 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNxc O)#define LOG( Revision-number: 1097 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2001-05-06T14:20:41.000000Z K 7 svn:log V 81 Wez Furlong's patch to add xterm mouse reporting and proper mouse wheel support. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cd5a3e4dc9e145f09bc293b0be97921e Text-delta-base-sha1: e2fc868b69e633cb3c47dedfac314dc18167a73c Text-content-length: 44 Text-content-md5: 2bf8bac7605906470f20d8116179546f Text-content-sha1: 1f06ab81f34e41a38167af9f61310327cfd71e43 Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVNXo 4$4 /D_WIN32_WINDOWS=0x401 Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d56fe753dc1ade0cf62400e6bbf7b08b Text-delta-base-sha1: 00cce43bcbc6971cb5752b5e96eae771b0e5b5a4 Text-content-length: 317 Text-content-md5: 7d5145067443f045109294a158e87299 Text-content-sha1: e53b16a53bcfcf3d4e1a496330978b94789bdb4c Content-length: 357 K 15 cvs2svn:cvs-rev V 4 1.93 PROPS-END SVNdgzTE"Ej_%?T_NOTHING, MBT_LEFT, MBT_MIDDLE, MBT_RIGHT, /* `raw' button designations */ MBT_SELECT, MBT_EXTEND, MBT_PASTE, /* `cooked' button designations */ MBT_WHEEL_UP, MBT_WHEEL_DOWN /* mouse wheel */set_raw_mouse_mode(int); Mouse_Button translate_button(Mouse_Button b Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 748e0da9f819982155cc0f94e867e6b2 Text-delta-base-sha1: bc50a57636b64a747b77392d428a0bbc29b6a9b6 Text-content-length: 1541 Text-content-md5: b46ec9b3cf6b9fd210acd7ffeb9abb5c Text-content-sha1: 2a89652f8cc043cad5cf785fa4c17b213818671d Content-length: 1581 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVNU"'w$O>3Wyc\pzlzq6$K#oint xterm_mouse; /* send mouse messages to app case 1000: /* xterm mouse 1 */ xterm_mouse = state ? 1 : 0; set_raw_mouse_mode(state); break; case 1002: /* xterm mouse 2 */ xterm_mouse = state ? 2: 0; set_raw_mouse_mode(state)ANSI('c', '>'): /* report xterm version */ compatibility(OTHER); /* this reports xterm version 136 so that VIM can use the drag messages from the mouse reporting */ ldisc_send("\033[>0;136;0c", 11); break, int shift, int ctrlxterm_mouse) { int encstate = 0, r, c; char abuf[16]; static int is_down = 0; switch(b) { case MBT_LEFT: encstate = 0x20; /* left button down */ break; case MBT_MIDDLE: encstate = 0x21; break; case MBT_RIGHT: encstate = 0x22; break; case MBT_WHEEL_UP: encstate = 0x60; break; case MBT_WHEEL_DOWN: encstate = 0x61; break; } switch(a) { case MA_DRAG: if (xterm_mouse == 1) return; encstate += 0x20; break; case MA_RELEASE: encstate = 0x23; is_down = 0; break; case MA_CLICK: if (is_down == b) return; is_down = b; break; } if (shift) encstate += 0x04; if (ctrl) encstate += 0x10; r = y + 33; c = x + 33; sprintf(abuf, "\033[M%c%c%c", encstate, c, r); ldisc_send(abuf, 6); return; } b = translate_button(b); if (b == MBTTT_SELECT && a == MA_DRAG) || (b == MBTTT_SELECT || b == MBTT Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: eadf2981a058453075a356cbb4a00ede Text-delta-base-sha1: 197ffbc665a74f7f41143d563abf38198f578e5e Text-content-length: 3537 Text-content-md5: 34c987451a3291ea7b8ce0b6e649cf7e Text-content-sha1: 4c821e96e6114e9a8623eaa0872fa4473d3a3e89 Content-length: 3578 K 15 cvs2svn:cvs-rev V 5 1.124 PROPS-END SVNOtmm z6/:+Y*+>=PkVS~/* this allows xterm-style mouse handling. */ static int send_raw_mouse = 0; static int wheel_accumulator = 0Tset or clear the "raw mouse message" mode */ void set_raw_mouse_mode(int activate) { send_raw_mouse = activate; SetCursor(LoadCursor(NULL, activate ? IDC_ARROW : IDC_IBEAM)), int shift, int ctrl) { int thistime = GetMessageTime(); if (send_raw_mouse) { term_mouse(b, MA_CLICK, x, y, shift, ctrl); return; }, shift, ctrl); lasttime = thistime; } /* * Translate a raw mouse button designation (LEFT, MIDDLE, RIGHT) * into a cooked one (SELECT, EXTEND, PASTE). */ Mouse_Button translate_button(Mouse_Button button) { if (button == MBT_LEFT) return MBT_SELECT; if (button == MBT_MIDDLE) return cfg.mouse_is_xterm ? MBT_PASTE : MBT_EXTEND; if (button == MBT_RIGHT) return cfg.mouse_is_xterm ? MBT_EXTEND : MBT_PASTE#define WHEEL_DELTA 120 case WM_MOUSEWHEEL: { wheel_accumulator += (short)HIWORD(wParam); wParam = LOWORD(wParam); /* process events when the threshold is reached */ while (abs(wheel_accumulator) >= WHEEL_DELTA) { int b; /* reduce amount for next time */ if (wheel_accumulator > 0) { b = MBT_WHEEL_UP; wheel_accumulator -= WHEEL_DELTA; } else if (wheel_accumulator < 0) { b = MBT_WHEEL_DOWN; wheel_accumulator += WHEEL_DELTA; } else break; if (send_raw_mouse) { /* send a mouse-down followed by a mouse up */ term_mouse(b, MA_CLICK, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT, wParam & MK_CONTROL); term_mouse(b, MA_RELEASE, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT, wParam & MK_CONTROL); } else { /* trigger a scroll */ term_scroll(0, b == MBT_WHEEL_UP ? -rows/2 : rows/2); } } return 0; } case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: { int button, press; switch (message) { case WM_LBUTTONDOWN: button = MBT_LEFT; press = 1; break; case WM_MBUTTONDOWN: button = MBT_MIDDLE; press = 1; break; case WM_RBUTTONDOWN: button = MBT_RIGHT; press = 1; break; case WM_LBUTTONUP: button = MBT_LEFT; press = 0; break; case WM_MBUTTONUP: button = MBT_MIDDLE; press = 0; break; case WM_RBUTTONUP: button = MBT_RIGHT; press = 0; break; } show_mouseptr(1); if (press) { click (button, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT, wParam & MK_CONTROL); SetCapture(hwnd); } else { term_mouse (button, MA_RELEASE, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT, wParam & MK_CONTROL); ReleaseCapture(); } }T_SELECT; else if (wParam & MK_MBUTTON) b = cfg.mouse_is_xterm ? MBT_PASTE : MBT_EXTEND; else b = cfg.mouse_is_xterm ? MBT_EXTEND : MBT_PASTE; term_mouse (b, MA_DRAG, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT, wParam & MK_CONTROL { char c = xlat_kbd2tty((unsigned char)wParam); ldisc_send (&c, 1); } return 0; case WM_SETCURSOR: if (send_raw_mouse) { SetCursor(LoadCursor(NULL, IDC_ARROW)); return TRUE; }T_PASTE, MA_CLICK, 0, 0, 0, 0); term_mouse (MBT_PASTE, MA_RELEASE, 0, 0 Revision-number: 1098 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2001-05-06T14:35:20.000000Z K 7 svn:log V 116 Run entire source base through GNU indent to tidy up the varying coding styles of the various contributors! Woohoo! K 10 svn:author V 5 simon PROPS-END Node-path: putty/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cb44ebe89a1aeb2018f7b6bf8e518c2d Text-delta-base-sha1: a34ed7b3ee24bf065c003ae2be0e25118282a63c Text-content-length: 127 Text-content-md5: d1cdbb902dae96636f4f2446ef16d47d Text-content-sha1: d5960676a502f4bccf378e0fbd17e73d8b2adda3 Content-length: 166 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNn1n { } void random_destroy_seed(void) { } void noise_ultralight(DWORD data) { } void noise_regular(void) { } Node-path: putty/int64.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0bb879d054146606bc5947934b416e49 Text-delta-base-sha1: 5f7774cd3737af49a298bc25d01536a26ef3ea0c Text-content-length: 179 Text-content-md5: 8abf48c4e3997ce34a7bcc9a9b670f6a Text-content-sha1: 254e4ac4c959e0b08bbf72bb5ef62df0ca168be2 Content-length: 218 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN17!233Pd}dOb + start, sizeof(buf) - start); buffer[sizeof(buf) - start] = '\0'; } uint64 uint64_make(unsigned long hi, unsigned long lo) Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f741bbbf9a74f68e8641fdeb89670a0f Text-delta-base-sha1: 067fd99046e7d47c689a3a77a2766804a16f9d81 Text-content-length: 3470 Text-content-md5: fac1b438e216e690f4b16ad050577a1f Text-content-sha1: cdc282f7bf54ffccea4f390abfd95dd9daa5c0bf Content-length: 3510 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN`4 b($>ek>*v>(char *buf, int len) { if ((c >= 32 && c <= 126) || (c >= 160)) return 1; else if (c < 128) return 2; /* ^x for some x */ else return 4; /* for hex XY */ } static void pwrite(unsigned char c) { if ((c >= 32 && c <= 126) || (c >= 160)) { c_write(&c, 1); } else if (c < 128) { char cc[2]; cc[1] = (c == 127 ? '?' : c + 0x40); cc[0] = '^'; c_write(cc, 2); } else { char cc[5]; sprintf(cc, "<%02X>", c); c_write(cc, 4); } } static void bsb(int n) void ldisc_update(int echo, int edit); while (len--) { char c; c = *buf++; switch (term_quotenext ? ' ' : c) { /* * ^h/^?: delete one char and output one BSB * ^w: delete, and output BSBs, to return to last * space/nonspace boundary * ^u: delete, and output BSBs, to return to BOL * ^c: Do a ^u then send a telnet IP * ^z: Do a ^u then send a telnet SUSP * ^\: Do a ^u then send a telnet ABORT * ^r: echo "^R\n" and redraw line * ^v: quote next char * ^d: if at BOL, end of file and close connection, * else send line and reset to BOL * ^m: send line-plus-\r\n and reset to BOL */ case CTRL('H'): case CTRL('?'): /* backspace/delete */ if (term_buflen > 0) { if (ECHOING) bsb(plen(term_buf[term_buflen - 1])); term_buflen--; } break; case CTRL('W'): /* delete word */ while (term_buflen > 0) { if (ECHOING) bsb(plen(term_buf[term_buflen - 1])); term_buflen--; if (term_buflen > 0 && isspace(term_buf[term_buflen - 1]) && !isspace(term_buf[term_buflen])) break; } break; case CTRL('U'): /* delete line */ case CTRL('C'): /* Send IP */ case CTRL('\\'): /* Quit */ case CTRL('Z'): /* Suspend */ while (term_buflen > 0) { if (ECHOING) bsb(plen(term_buf[term_buflen - 1])); term_buflen--; } back->special(TS_EL); if (c == CTRL('C')) back->special(TS_IP); if (c == CTRL('Z')) back->special(TS_SUSP); if (c == CTRL('\\')) back->special(TS_ABORT); break; case CTRL('R'): /* redraw line */ if (ECHOING) { int i; c_write("^R\r\n", 4); for (i = 0; i < term_buflen; i++) pwrite(term_buf[i]); } break; case CTRL('V'): /* quote next char */ term_quotenext = TRUE; break; case CTRL('D'): /* logout or send */ if (term_buflen == 0) { back->special(TS_EOF); } else { back->send(term_buf, term_buflen); term_buflen = 0; } break; case CTRL('M'): /* send with newline */ if (term_buflen > 0) back->send(term_buf, term_buflen); if (cfg.protocol == PROT_RAW) back->send("\r\n", 2); else back->send("\r", 1); if (ECHOING) c_write("\r\n", 2); term_buflen = 0; break; default: /* get to this label from ^V handler */ if (term_buflen >= term_bufsiz) { term_bufsiz = term_buflen + 256; term_buf = saferealloc(term_buf, term_bufsiz); } term_buf[term_buflen++] = c; if (ECHOING) pwrite(c); term_quotenext = FALSE; break; } } } else { if (term_buflen != 0) { back->send(term_buf, term_buflen); while (term_buflen > 0) { bsb(plen(term_buf[term_buflen - 1])); term_buflen--; } } if (len > 0) { if (ECHOING) c_write(buf, len); back->send(buf, len); } } } Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e2da8ca03d6ae2057bc973591e4efd0a Text-delta-base-sha1: ba7134154d878f014bb94cf0b80e67a31522147e Text-content-length: 2969 Text-content-md5: 8808feab9a882c7858378819193aabf2 Text-content-sha1: e4999158e9cf29b08d2d1efec7e7c39719b7d0e0 Content-length: 3009 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNH-HDrnspr;2c~ax+Svkv?/P>lV-$X3\._4qVX3\.\4\>D=E9E[r[$k^1y^zZdu`c2% DKkG * 2, access, NULL); } static void minefield_init(void) ~0xFFF) { minefield_region = VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS); if (minefield_region) - 1) & ~(PAGESIZE - { div(1, *(int *) minefield_pages); } static void *minefield_alloc(int size) - /* Skip over used pages. */ while (pos < lim && minefield_admin[pos] != 0xFFFF) pos++; /* Count unused pages. */ start = pos; while (pos < lim && pos - start < npages + 2 && minefield_admin[pos] == 0xFFFF) pos++; if (pos - start == npages + 2) break; /* If we've reached the limit, reset the limit or stop. */ if (pos >= lim) { if (lim == minefield_npages) { /* go round and start again at zero */ lim = minefield_curpos; pos = 0; } else { minefield_admin_hide(1); return NULL; } } } minefield_curpos = pos - + - 1; i++) minefield_admin[i] = 0xFFFE; /* used but no region starts here */ minefield_admin[start + minefield_pages + region_start, size, MEM_COMMIT, PAGE_READWRITE); return (char *) minefield_pages + region_start; } static void minefield_free(void *ptr) ptr - (char *) minefield_admin[i] != region_start % PAGESIZE) minefield_admin[j] = 0xFFFF; } VirtualFree(ptr, j * ptr - (char *) minefield_admin[i] != region_start % PAGESIZE) ; minefield_admin_hide(1); return j * PAGESIZE - region_start; } static void *minefield_c_malloc(size_t size) { if (!minefield_initialised) { if (!minefield_initialised) { size_t oldsize; void *q; if (!minefield_initialised) (fp, "%s:%d: ", file, line); } #endif void *safemalloc(size_t size) { void *p; #ifdef MINEFIELD p = minefield_c_malloc(size); #else p = malloc { void *p; if (!ptr) { #ifdef MINEFIELD p = minefield_c_malloc(size); #else p = malloc(size); #endif } else { #ifdef MINEFIELD p = minefield_c_realloc(ptr, size); #else p = realloc(ptr, size); #endif }realloc(%p,%d) returns %p\n", ptr, size, p); #endif return p; } void safefree(void *ptr) (ptr); #else free(char *buf) NULL); fputs(buf, debug_fp); fflush(debug_fp); } void dprintf(char *fmt, ...) (buf); va_end(ap); } void debug_memdump(void *buf, int len, int L) { int i; unsigned char *p = buf; char foo[17]; if (L) { int delta; dprintf(" "); if (L) dprintf("%p: ", p); strcpy(foo, "................"); (" "); /* 3 spaces */ foo[i] = ' '; } else { dprintf("%c%02.2x", &p[i] != (unsigned char *) buf && i % 4 ? '.' : ' ', p[i] ); if (p[i] >= ' ' && p[i] <= '~') foo[i] = (char) p[i]; } } foo[i] = '\0'; dprintf("%*s%s\n", (16 - i) * 3 + 2, "", foo); } } #endif /* def DEBUG */ Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 297bdc1477d8c6ea05ab75a6389440d7 Text-delta-base-sha1: aa25feb1ed099f9271289306c451c93a228f086f Text-content-length: 20 Text-content-md5: 1da3a7a0a2bc85dedf31b99155e73320 Text-content-sha1: d6c4e5a6e6d023a7846337b3cb72dd6a2b3044da Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNA@ qOr Node-path: putty/mscrypto.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8ac044e607ab27c18e1977dac885e7fa Text-delta-base-sha1: 23d4bfc8e0fc5644eac0cf2f2a5b0ec8962b73bf Text-content-length: 3527 Text-content-md5: efa11b095124ecbfe9b3d3a6b7f04150 Text-content-sha1: 2d9fc607ac0feb052a77fc1885ed248a2788ccba Content-length: 3566 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN0rH 59gY/A~|RCW##wbTY|.w2m?|Hj^B /j !j zP $Y6f7gx 2sfjYSLszmmwomf_gmA8Rk-r]Xy~SIH {0, 0, 0}, {0, 0, 0} }; { if (CryptAcquireContext(&hCryptProv, "Putty", CSP, PROV_RSA_FULL, CRYPT_NEWKEYSET) == 0) { if (GetLastError() == NTE_EXISTS) { if (CryptAcquireContext(&hCryptProv, "Putty", CSP, PROV_RSA_FULL, 0) == 0) { return FALSE; /* failed to acquire context - probably * don't have high encryption installed! */ } } else return FALSE; /* failed to acquire context - probably * don't have high encryption installed! */ } return TRUE; } void crypto_wrapup() { int i, j; for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { if { unsigned char b; if { /* do nothing */ } void random_init(void) { /* do nothing */ } void random_get_savedata(void **data, int *len) { /* do nothing */ } void noise_get_heavy(void (*func) (void *, int)) { /* do nothing */ } void noise_get_light(void (*func) (void *, int)) { /* do nothing */ } void noise_ultralight(DWORD data) { /* do nothing */ } void random_save_seed(void) { if { if { DWORD cb = 16; if (i = 0; i < = 0; i < 2; i++) w = (w << 8) + *p++; b = (w + 7) / 8; /* bits -> bytes */ /* convert exponent to DWORD */ result->exponent = 0; for (i = 0; i < b; i++) result->exponent = (result->exponent << 8) + *p++; /* get size (bits) of modulus */ w = 0; for (i = 0; i < 2; i++) w = (w << 8) + *p++; result->bytes = b = (w + 7) / *keystr = p; ((pBlob = malloc(sizeof(PUBLICKEYSTRUC) + sizeof(RSAPUBKEY) + *) pBlob) + sizeof(PUBLICKEYSTRUC) + sizeof(RSAPUBKEY); pKeyin = ((unsigned char *) rsakey->modulus); /* change big endian to little endian */ for (i = 0; i < rsakey->bytes; i++) pKeybuf[i] = pKeyin[rsakey->bytes - i - (RSAPUBKEY *) (((unsigned char *) pBlob) + sizeof(PUBLICKEYSTRUC)); pRPK->magic = 0x31415352; (CryptImportKey(hCryptProv, (void *) pBlob, sizeof(PUBLICKEYSTRUC) + sizeof(RSAPUBKEY) + rsakey->bytes, (i = 0; i < (int) dlen; i++) data[i] = buf[dlen - i - 1]; { int len = 0, i; sprintf(str + len, "%04x", key->exponent); len += strlen(str + len); str[len++] = '/'; for (i = 1; i < key->bytes; i++) { sprintf(str + len, "%02x", key->modulus[i]); len += strlen(str + { int i, j; for (i = 0; i < 2; i++) { for { DWORD dlen; dlen = len; if (CryptEncrypt(hDESKey[0][2} void des3_decrypt_blk(unsigned char *blk, int len) { DWORD dlen; dlen = len; if (CryptDecrypt(hDESKey[1][2], 0, FALSE, 0, blk, &dlen) == 0) fatalbox("Error decrypting block!\n"); if { int i; for { DWORD dlen; dlen = len; if } void des_decrypt_blk(unsigned char *blk, int len) { DWORD dlen; dlen = len; if (CryptImportKey(hCryptProv, PrivateKeyWithExponentOfOne, sizeof(PrivateKeyWithExponentOfOne), (CryptEncrypt(hPrivateKey, 0, TRUE, 0, buf + sizeof(BLOBHEADER) + sizeof(ALG_ID), *) *) (buf + sizeof(BLOBHEADER))) = CALG_RSA_KEYX; /* import session key into key container */ if (CryptImportKey(hCryptProv, buf, dlen + sizeof(BLOBHEADER) + sizeof(ALG_ID), hPrivateKey, 0, &hSessionKey) == 0) return 0; if Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9ed2f8b81baa54261db2b3fdaa677663 Text-delta-base-sha1: 033a984f36a612870c3374a54075d13a70af9142 Text-content-length: 1180 Text-content-md5: 0f2b7d016b66b5050fe6ae3acb3edd04 Text-content-sha1: cae08d869104e20c5135c7b76056fa7de4723c6f Content-length: 1219 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNJ;U~R}PJ{_kKQ63F@@ (*plug) (Socket s, Plug p); /* use a different plug (return the old one) */ /* if p is NULL, it doesn't change the plug */ (Plug p, char *error_msg, int error_code, int calling_back); /* error_msg is NULL iff it is not an error (ie it closed normally) */ /* calling_back != 0 iff there is a Plug function */ /* * - urgent==0. `data' points to `len' bytes of perfectly * ordinary data. * * - urgent==1. `data' points to `len' bytes of data, * which were read from before an Urgent pointer. * * - urgent==2. `data' points to `len' bytes of data, * the first of which was the one at the Urgent mark. /* do we accept this certificate chain? If not, why not? */ /* cert[0] is the server's certificate, cert[] is NULL-terminated */ Our_Certificate(*client_cert) (SSL_Client_Plug p); /* the server wants us to identify ourselves */ /* may return NULL if we want anonymity */ }; SSL_Client_Socket sk_ssl_client_over(Socket s, /* pre-existing (tcp) connection */ SSL_Client_Plug p Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bc8d0f8abcb79b55e664a3d8f7adf802 Text-delta-base-sha1: f89bdd2809a011bd5c30465ac85a9604f4f88ba9 Text-content-length: 887 Text-content-md5: 1bc08e512ab25f503de325c674eef7b9 Text-content-sha1: 64c11fd0d4bbe440f42662190ee490cd160749dd Content-length: 927 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN6T74j{N[c>TUN y[X-} +(WINAPI * gsps_t) { HANDLE srch; WIN32_FIND_DATA finddata; char winpath[MAX_PATH + gsps = (gsps_t) GetProcAddress(mod, "GetSystemPowerStatus"); } } void random_save_seed(void) if (gsps(&pwrstat)) random_add_noise(&w, sizeof(w)); w = GetCapture(); random_add_noise(&w, sizeof(w)); w = GetClipboardOwner(); random_add_noise(&w, sizeof(w)); z = GetQueueStatus(QS_ALLEVENTS); random_add_noise(&z, sizeof(z)); GetCursorPos(&pt); random_add_noise(&pt, sizeof(pt)); GlobalMemoryStatus(&memstat); random_add_noise(&memstat, sizeof(memstat)); GetThreadTimes(GetCurrentThread(), times, times + 1, times + 2, times + 3); random_add_noise(×, sizeof(times)); GetProcessTimes(GetCurrentProcess(), times, times + 1, times + 2, times + Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0d81d82f361156a43986e9dfd4b23392 Text-delta-base-sha1: dbf8ed46a157ef33061c4ea5e8aee19362b9e83b Text-content-length: 20603 Text-content-md5: 8131cbed1291ea7994cb6a7a774a204a Text-content-sha1: e8ee2f986a7ff083dd7a7ed2d8fb3932e89f27b6 Content-length: 20643 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNL` 3eg[*Cnz*O,{ m.uMxY{F8V!>(!S[ mf{0:$hRwXJM<'scm(B9FbWc S^xIp|yY]LK0Ayw<Y1p <U4 y UW'\xY['fQ!/_V@]p5}F+U:6Jsa$` :F^,/\h|uI`c*bGjZ"-(WINAPI * gsi_fn_t) (HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION, PSID *, PSID *, PACL *, PACL *, (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: SetDlgItemText(hwnd); return 0; case 101: EnableWindow(hwnd, 0); DialogBox(instance, MAKEINTRESOURCE(214), NULL, LicenceProc); EnableWindow(hwnd, 1); WPARAM wParam, LPARAM lParam) (hw, &rs) && GetWindowRect(hwnd, &rd)) MoveWindow(hwnd, (rs.right + rs.left + rd.left - rd.right) / 2, (rs.bottom + rs.top + rd.top - rd.bottom) / 2, rd.right - rd.left, rd.bottom - rd.top, TRUE); } SetForegroundWindow(hwnd); SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); p = (struct PassphraseProcStruct *) lParam; passphrase = p->passphrase; if (p->comment) SetDlgItemText(hwnd, 101, p->comment); *passphrase = 0; SetDlgItemText(hwnd, 102, passphrase); if (*passphrase) EndDialog(hwnd, 1); else MessageBeep(0); return 0; case IDCANCEL: EndDialog(hwnd, 0); return 0; case 102: /* edit box */ if ((HIWORD(wParam) == EN_CHANGE) && passphrase) { GetDlgItemText(hwnd, 102, passphrase, PASSPHRASE_MAXLEN - 1); passphrase[PASSPHRASE_MAXLEN - 1] = '\0'; } return 0; } return 0; case WM_CLOSE: EndDialog(hwnd, 0); return 0; } return 0; } /* * Update the visible key list. */ static void keylist_update(void) SendDlgItemMessage(keylist, 100, LB_RESETCONTENT, 0, 0); for (i = 0; NULL != (rkey = index234(rsakeys, i)); i++) { char listentry[512], *p; /* * Replace two spaces in the fingerprint with tabs, for * nice alignment in the box. */ strcpy(listentry, "ssh1\t"); p = listentry + strlen(listentry); rsa_fingerprint(p, sizeof(listentry) - (p - listentry), rkey); p = strchr(listentry, ' '); if (p) *p = '\t'; p = strchr(listentry, ' '); if (p) *p = '\t'; SendDlgItemMessage(keylist, 100, LB_ADDSTRING, 0, (LPARAM) listentry); } for (i = 0; NULL != (skey = index234(ssh2keys, i)); i++) { char listentry[512], *p; int len; /* * Replace two spaces in the fingerprint with tabs, for * nice alignment in the box. */ p = skey->alg->fingerprint(skey->data); strncpy(listentry, p, sizeof(listentry)); p = strchr(listentry, ' '); if (p) *p = '\t'; p = strchr(listentry, ' '); if (p) *p = '\t'; len = strlen(listentry); if (len < sizeof(listentry) - 2) { listentry[len] = '\t'; strncpy(listentry + len + 1, skey->comment, sizeof(listentry) - len - 1); } SendDlgItemMessage(keylist, 100, LB_ADDSTRING, 0, (LPARAM) listentry); } SendDlgItemMessage(keylist, 100, LB_SETCURSEL, (WPARAM) - 1, 0); } } /* * This function loads a key from a file and adds it. */ static void add_keyfile(char *filename) MessageBox(NULL, "Couldn't load private key.", APPNAME, MB_OK | MB_ICONERROR); if (needs_pass) { int dlgret; dlgret = DialogBoxParam(instance, MAKEINTRESOURCE(210), NULL, PassphraseProc, (LPARAM) & pps); if (!dlgret) { if (comment) sfree(comment); if (ver == 1) sfree(rkey); return; /* operation cancelled */ } } else attempts++; } while (ret == -1); if (comment) sfree(comment); if (ret == 0) { MessageBox(NULL, "Couldn't load private key.", APPNAME, MB_OK | MB_ICONERROR); if (ver == 1) sfree(rkey); 4 + clen + reqlen, bignum_bitcount(rkey->modulus)); reqlen += 4; reqlen += ssh1_write_bignum(request + reqlen, rkey->modulus); reqlen += ssh1_write_bignum(request + reqlen, rkey->exponent); reqlen += ssh1_write_bignum(request + reqlen, rkey->private_exponent); reqlen += ssh1_write_bignum(request + reqlen, rkey->iqmp); reqlen += ssh1_write_bignum(request + reqlen, rkey->p); reqlen += ssh1_write_bignum(request + reqlen, rkey->q); PUT_32BIT(request + reqlen, clen); memcpy(request + reqlen + 4, rkey->comment, clen); reqlen += 4 + clen; PUT_32BIT(request, reqlen - + reqlen, alglen); reqlen += 4; memcpy(request + + reqlen, keybloblen); PUT_32BIT(request + reqlen, clen); memcpy(request + reqlen + 4, skey->comment, clen); PUT_32BIT(request, reqlen - 4); reqlen += clen + 4 /* * Reply with SSH1_AGENT_RSA_IDENTITIES_ANSWER. */ { struct RSAKey *key; int len, nkeys; int i; /* * Count up the number and length of keys we hold. */ len = nkeys = 0; for (i = 0; NULL != (key = index234(rsakeys, i)); i++) { nkeys++; len += 4; /* length field */ len += ssh1_bignum_length(key->exponent); len += ssh1_bignum_length(key->modulus); len += 4 + strlen(key->comment); } /* * Packet header is the obvious five bytes, plus four * bytes for the key count. */ len += 5 + 4; if (len > AGENT_MAX_MSGLEN) goto failure; /* aaargh! too much stuff! */ PUT_32BIT(ret, len - 4); ret[4] = SSH1_AGENT_RSA_IDENTITIES_ANSWER; PUT_32BIT(ret + 5, nkeys); p = ret + 5 + 4; for (i = 0; NULL != (key = index234(rsakeys, i)); i++) { PUT_32BIT(p, bignum_bitcount(key->modulus)); p += 4; p += ssh1_write_bignum(p, key->exponent); p += ssh1_write_bignum(p, key->modulus); PUT_32BIT(p, strlen(key->comment)); memcpy(p + 4, key->comment, strlen(key->comment)); p += 4 + strlen(key->comment); } } break; case SSH2_AGENTC_REQUEST_IDENTITIES: /* * Reply with SSH2_AGENT_IDENTITIES_ANSWER. */ { struct ssh2_userkey *key; /* * Count up the number and length of keys we hold. */ len = nkeys = 0; for (i = 0; NULL != (key = index234(ssh2keys, i)); i++) { nkeys++; len += 4; /* length field */ blob = key->alg->public_blob(key->data, &bloblen); len += bloblen; sfree(blob); len += 4 + strlen(key->comment); } /* * Packet header is the obvious five bytes, plus four * bytes for the key count. */ len += 5 + 4; if (len > AGENT_MAX_MSGLEN) goto failure; /* aaargh! too much stuff! */ PUT_32BIT(ret, len - 4); ret[4] = SSH2_AGENT_IDENTITIES_ANSWER; PUT_32BIT(ret + 5, nkeys); p = ret + 5 + 4; PUT_32BIT(p, bloblen); p += 4; memcpy(p, blob, bloblen); p += bloblen; sfree(blob); PUT_32BIT(p, strlen(key->comment)); memcpy(p + 4, key->comment, strlen(key->comment)); p += 4 + strlen(key->comment); } } break; case SSH1_AGENTC_RSA_CHALLENGE: /* * Reply with either SSH1_AGENT_RSA_RESPONSE or * SSH_AGENT_FAILURE, depending on whether we have that key * or not. */ { struct RSAKey reqkey, *key; Bignum challenge, response; unsigned char response_source[48], response_md5[16]; struct MD5Context md5c; int i, len; p += 4; p += ssh1_read_bignum(p, &reqkey.exponent); p += ssh1_read_bignum(p, &reqkey.modulus); p += ssh1_read_bignum(p, &challenge); memcpy(response_source + 32, p, 16); p += 16; if (GET_32BIT(p) != 1 || (key = find234(rsakeys, &reqkey, NULL)) == NULL) { freebn(reqkey.exponent); freebn(reqkey.modulus); freebn(challenge); goto failure; } response = rsadecrypt(challenge, key); for (i = 0; i < 32; i++) response_source[i] = bignum_byte(response, 31 - i); MD5Init(&md5c); MD5Update(&md5c, response_source, 48); MD5Final(response_md5, &md5c); memset(response_source, 0, 48); /* burn the evidence */ freebn(response); /* and that evidence */ freebn(challenge); /* yes, and that evidence */ freebn(reqkey.exponent); /* and free some memory ... */ freebn(reqkey.modulus); /* ... while we're at it. */ /* * Packet is the obvious five byte header, plus sixteen * bytes of MD5. */ len = 5 + 16; PUT_32BIT(ret, len - 4); ret[4] = SSH1_AGENT_RSA_RESPONSE; memcpy(ret + 5, response_md5, 16); } break; case SSH2_AGENTC_SIGN_REQUEST: /* * Reply with either SSH2_AGENT_RSA_RESPONSE or * SSH_AGENT_FAILURE, depending on whether we have that key * or not. + 4 + siglen; PUT_32BIT(ret, len - 4); ret[4] = SSH2_AGENT_SIGN_RESPONSE; PUT_32BIT(ret + 5, siglen); memcpy(ret + 5 + 4, signature, siglen); sfree(signature); } break; case SSH1_AGENTC_ADD_RSA_IDENTITY: /* * Add to the list and return SSH_AGENT_SUCCESS, or * SSH_AGENT_FAILURE if the key was malformed. */ { struct RSAKey *key; char *comment; key = smalloc(sizeof(struct RSAKey)); memset(key, 0, sizeof(key)); p += makekey(p, key, NULL, 1); p += makeprivate(p, key); p += ssh1_read_bignum(p, key->iqmp); /* p^-1 mod q */ p += ssh1_read_bignum(p, key->p); /* p */ p += ssh1_read_bignum(p, key->q); /* q */ comment = smalloc(GET_32BIT(p)); if (comment) { memcpy(comment, p + 4, GET_32BIT(p)); key->comment = comment; } PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_FAILURE; if (add234(rsakeys, key) == key) { keylist_update(); ret[4] = SSH_AGENT_SUCCESS; } else { freersakey(key); sfree(key); } } break; case SSH2_AGENTC_ADD_IDENTITY: /* * Add to the list and return SSH_AGENT_SUCCESS, or * SSH_AGENT_FAILURE if the key was malformed. */ { struct ssh2_userkey *key; p += 4; alg = p; GET_32BIT((unsigned char *) msg) - (p - (unsigned char *) msg - p += 4; comment = smalloc(commlen + 1); if (comment) { memcpy(comment, p, commlen); comment[commlen] = '\0'; } key->comment = comment; PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_FAILURE; if (add234(ssh2keys, key) == key) { keylist_update(); ret[4] = SSH_AGENT_SUCCESS; } else { key->alg->freekey(key->data); sfree(key->comment); sfree(key); } } break; case SSH1_AGENTC_REMOVE_RSA_IDENTITY: /* * Remove from the list and return SSH_AGENT_SUCCESS, or * perhaps SSH_AGENT_FAILURE if it wasn't in the list to * start with. */ { struct RSAKey reqkey, *key; p += makekey(p, &reqkey, NULL, 0); key = find234(rsakeys, &reqkey, NULL); freebn(reqkey.exponent); freebn(reqkey.modulus); PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_FAILURE; if (key) { del234(rsakeys, key); keylist_update(); freersakey(key); sfree(key); ret[4] = SSH_AGENT_SUCCESS; } } break; case SSH2_AGENTC_REMOVE_IDENTITY: /* * Remove from the list and return SSH_AGENT_SUCCESS, or * perhaps SSH_AGENT_FAILURE if it wasn't in the list to * start with. */ { PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_FAILURE; if (key) { del234(ssh2keys, key); keylist_update(); key->alg->freekey(key->data); sfree(key); ret[4] = SSH_AGENT_SUCCESS; } } break; case SSH1_AGENTC_REMOVE_ALL_RSA_IDENTITIES: /* * Remove all SSH1 keys. Always returns success. */ { struct RSAKey *rkey; while ((rkey = index234(rsakeys, 0)) != NULL) { del234(rsakeys, rkey); freersakey(rkey); sfree(rkey); } keylist_update(); PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_SUCCESS; } break; case SSH2_AGENTC_REMOVE_ALL_IDENTITIES: /* * Remove all SSH2 keys. Always returns success. */ { struct ssh2_userkey *skey; while ((skey = index234(ssh2keys, 0)) != NULL) { } keylist_update(); PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_SUCCESS; } break; default: failure: /* * Unrecognised message. Return SSH_AGENT_FAILURE. */ PUT_32BIT(ret, 1); ret[4] = SSH_AGENT_FAILURE; { struct RSAKey *a = (struct RSAKey *) av; struct RSAKey *b = (struct RSAKey *) return +1; else if (alen < blen) return -1; /* * Now compare by moduli themselves. */ alen = (alen + 7) / 8; /* byte count */ while (alen-- > 0) { int abyte, bbyte; abyte = bignum_byte(am, alen); bbyte = bignum_byte(bm, alen); if (abyte > bbyte) return +1; else if (abyte < bbyte) { struct ssh2_userkey *a = (struct ssh2_userkey *) av; struct ssh2_userkey *b = (struct ssh2_userkey *) bv; int i; int alen, blen; unsigned char *ablob, *bblob; int c; break; } else if (ablob[i] > bblob[i]) { c = +1; break; } } if (c == 0 && i < alen) c = +1; /* a is longer */ if (c == 0 && i < blen) c = -1; { struct blob *a = (struct blob *) av; struct ssh2_userkey *b = (struct ssh2_userkey *) bv; int i; int alen, blen; unsigned char *ablob, *bblob; int c; break; } else if (ablob[i] > bblob[i]) { c = +1; break; } } if (c == 0 && i < alen) c = +1; /* a is longer */ if (c == 0 && i < blen) c = -1; add_keyfile(filename); WPARAM wParam, LPARAM lParam) (hw, &rs) && GetWindowRect(hwnd, &rd)) MoveWindow(hwnd, (rs.right + rs.left + rd.left - rd.right) / 2, (rs.bottom + rs.top + rd.top - rd.bottom) / 2, rd.right - rd.left, rd.bottom - rd.top, TRUE); } keylist = hwnd; { static int tabs[] = { 35, 60, 210 }; SendDlgItemMessage(hwnd, 100, LB_SETTABSTOPS, sizeof(tabs) / sizeof(*tabs), (LPARAM) tabs); } keylist_update(); keylist = NULL; DestroyWindow(hwnd); return 0; case 101: /* addprompt_add_keyfile(); } return 0; case 102: for (i = 0; NULL != (rkey = index234(rsakeys, i)); i++) if (n-- == 0) i++) keylist_update(); } return 0; } return 0; case WM_CLOSE: keylist = NULL; (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) if (lParam == WM_RBUTTONUP) { POINT cursorpos; GetCursorPos(&cursorpos); PostMessage(hwnd, WM_SYSTRAY2, cursorpos.x, cursorpos.y); } else if (lParam == WM_LBUTTONDBLCLK) { /* Equivalent to IDM_VIEWKEYS. */ PostMessage(hwnd, WM_COMMAND, IDM_VIEWKEYS, 0); } break; case WM_SYSTRAY2: if (!menuinprogress) { menuinprogress = 1; SetForegroundWindow(hwnd); ret = TrackPopupMenu(systray_menu, TPM_RIGHTALIGN | TPM_BOTTOMALIGN | TPM_RIGHTBUTTON, wParam, lParam, 0, hwnd, NULL); menuinprogress = 0; } case IDM_CLOSE: SendMessage(hwnd, WM_CLOSE, 0, 0); break; case IDM_VIEWKEYS: if (!keylist) { keylist = CreateDialog(instance, MAKEINTRESOURCE(211), NULL, KeyListProc); ShowWindow(keylist, SW_SHOWNORMAL); /* * Sometimes the window comes up minimised / hidden * for no obvious reason. Prevent this. */ SetForegroundWindow(keylist); SetWindowPos(keylist, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); } break; case IDM_ADDKEY: prompt_add_keyfile(); break; case IDM_ABOUT: if (!aboutbox) { aboutbox = CreateDialog(instance, MAKEINTRESOURCE(213), NULL, AboutProc); ShowWindow(aboutbox, SW_SHOWNORMAL); /* * Sometimes the window comes up minimised / hidden * for no obvious reason. Prevent this. */ SetForegroundWindow(aboutbox); SetWindowPos(aboutbox, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); } break; } break; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_COPYDATA: { COPYDATASTRUCT *cds; char *mapname; void *p; HANDLE filemap, proc; PSID mapowner, procowner; PSECURITY_DESCRIPTOR psd1 = NULL, psd2 = NULL; int ret = 0; cds = (COPYDATASTRUCT *) lParam; if (cds->dwData != AGENT_COPYDATA_ID) return 0; /* not our message, mate */ mapname = (char *) cds->lpData; if (mapname[cds->cbData - 1] != '\0') return 0; /* failure to be ASCIZ! */ #ifdef DEBUG_IPC debug(("mapname is :%s:\n", mapname)); #endif debug(("filemap is %p\n", filemap)); #endif if (filemap != NULL && filemap != INVALID_HANDLE_VALUE) { int rc; #ifndef NO_SECURITY if (has_security) { if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE, GetCurrentProcessId())) == NULL) { #ifdef DEBUG_IPC debug(("couldn't get handle for process\n")); #endif return 0; } if (getsecurityinfo(proc, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &procowner, NULL, NULL, NULL, &psd2) != ERROR_SUCCESS) { #ifdef DEBUG_IPC debug(("couldn't get owner info for process\n")); #endif CloseHandle(proc); return 0; /* unable to get security info */ } CloseHandle(proc); if ((rc = getsecurityinfo(filemap, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &mapowner, NULL, NULL, NULL, &psd1) != ERROR_SUCCESS)) { #ifdef DEBUG_IPC debug( ("couldn't get owner info for filemap: %d\n", rc)); #endif return 0; } #ifdef DEBUG_IPC debug(("got security stuff\n")); #endif if (!EqualSid(mapowner, procowner)) return 0; /* security ID mismatch! */ #ifdef DEBUG_IPC debug(("security stuff matched\n")); #endif LocalFree(psd1); LocalFree(psd2); } else { #ifdef DEBUG_IPC debug(("security APIs not present\n")); #endif } #endif p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0); #ifdef DEBUG_IPC debug(("p is %p\n", p)); { int i; for (i = 0; i < 5; i++) debug( ("p[%d]=%02x\n", i, ((unsigned char *) p)[i]));} #endif answer_msg(p); ret = 1; UnmapViewOfFile(p); } CloseHandle(filemap); return ret; } } return DefWindowProc { if (ShellExecute(NULL, _T("open"), cmdline, NULL, NULL, show) <= (HINSTANCE) 32) { TCHAR sMsg[140]; sprintf(sMsg, _T("Failed to run \"%.100s\", Error: %d"), cmdline, GetLastError()); == VER_PLATFORM_WIN32_NT) { has_security = TRUE; } else has_security = FALSE; if (has_security) { #ifndef NO_SECURITY /* * Attempt to get the security API we need. */ advapi = LoadLibrary("ADVAPI32.DLL"); getsecurityinfo = (gsi_fn_t) GetProcAddress(advapi, "GetSecurityInfo"); if (!getsecurityinfo) { MessageBox(NULL, "Unable to access security APIs. Pageant will\n" "not run, in case it causes a security breach.", "Pageant Fatal Error", MB_ICONERROR | MB_OK); return 1; = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = inst; wndclass.hIcon = LoadIcon(inst, MAKEINTRESOURCE(IDI_MAINICON)); wndclass.hCursor = LoadCursor(NULL, IDC_IBEAM); wndclass.hbrBackground = GetStockObject(BLACK_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = APPNAME; RegisterClass(&wndclass); } hwnd = keylist = NULL; hwnd = CreateWindow(APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, (systray_menu, MF_ENABLED, IDM_VIEWKEYS, "&View Keys"); AppendMenu(systray_menu, MF_ENABLED, IDM_ADDKEY, "Add &Key"); AppendMenu(systray_menu, MF_ENABLED, IDM_ABOUT, "&About"); AppendMenu(systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit"); } ShowWindow char *p; int inquotes = 0; int ignorearg = 0; p = cmdline; while (*p) { while (*p && isspace(*p)) p++; if (*p && !isspace(*p)) { char *q = p, *pp = p; while (*p && (inquotes || !isspace(*p))) { if (*p == '"') { inquotes = !inquotes; p++; continue; } *pp++ = *p++; } if (*pp) { if (*p) p++; *pp++ = '\0'; } } } if (command) spawn_cmd if (advapi) FreeLibrary(advapi); TranslateMessage(&msg); DispatchMessage(&msg); } /* Clean up the system tray icon */ { NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = 1; Shell_NotifyIcon(NIM_DELETE, &tnid); DestroyMenu(systray_menu); } if (advapi) Node-path: putty/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c6fb8baa9d6605d3ce393add1ed4f65e Text-delta-base-sha1: ad65c727eebc86495fb1472e20ace35555629dc9 Text-content-length: 631 Text-content-md5: 397ac7d15c3c351841af209c9f8a6231 Text-content-sha1: 210e860fdbd0e2c506760e3f3d37b03aa87c8c34 Content-length: 670 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN9H,?6ZhW[it\mJZ { HWND hwnd; hwnd = FindWindow("Pageant", "Pageant"); if (!hwnd) return FALSE; else return TRUE; } void agent_query(void *in, int inlen, void **out, int *outlen) 0, AGENT_MAX_MSGLEN, mapname); if (!filemap) + NULL, (LPARAM) & cds); debug(("return is %d\n", id)); if (id > 0) { retlen = 4 + GET_32BIT(p); debug(("len is %d\n", retlen)); ret = smalloc(retlen); if (ret) { memcpy(ret, p, retlen); *out = ret; *outlen = retlen; debug((" %02x", ((unsigned char *) msg)[i])); debug(("\n")); return 0; } #endif Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd60b24eb25c80df96ac9d2c3b60f9e1 Text-delta-base-sha1: 5c583d78fefab0d27fed4c82c2be9691dca8cd41 Text-content-length: 10800 Text-content-md5: 541b412a3dd3b1ec5bc54bd25930ed77 Text-content-sha1: 516b153da709a3f36c5cdc63662cf0f2f8a127ee Content-length: 10840 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNZMT_r`4;o;i[(p*gp>G6[cxyN W50&8 +lj8H@- nu(F+8l@y4w5)"\jN{W$_%VNO(char *p, ...) void connection_fatal(char *p, ...) { } void verify_ssh_host_key(char *host, int port, char *keytype, char *keystr, char *fingerprint) "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, enter \"y\" to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you do not trust this host, enter \"n\" to abandon the\n" "connection.\n" "Continue connecting? (y/n) "; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "enter \"y\" to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, enter \"n\".\n" "If you want to abandon the connection completely, press\n" "Return to cancel. Pressing Return is the ONLY guaranteed\n" "safe choice.\n" /* success - key matched OK */ return; if (ret == 2) { /* key was different */ ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT)); ReadFile(hin, line, sizeof(line) - 1, &i, NULL); SetConsoleMode(hin, savemode); if (ret == 2) { /* key was different */ if (line[0] != '\0' && line[0] != '\r' && line[0] != '\n') { if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); } else { fprintf(stderr, abandoned); exit(0); } } if (ret == 1) { /* key was absent */ if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); else { fprintf(stderr, abandoned); exit(0); if (!WriteFile(h, data + pos, len - pos, &ret, NULL)) return; /* give up in panic */ pos += ret; } } int term_ldisc(int mode) { return FALSE; } void ldisc_update(int echo, int edit) mode = mode | ENABLE_ECHO_INPUT; else mode = mode & ~ENABLE_ECHO_INPUT; if (edit) mode = mode | ENABLE_LINE_INPUT; else mode = mode & ~ static int tried_once = 0; if (tried_once) { return 0; } else { strncpy(str, password, maxlen); str[maxlen - 1] = '\0'; tried_once = 1; return 1; fprintf(stderr, "Cannot get standard input/output handles"); newmode &= ~ENABLE_ECHO_INPUT; else - 1, &i, NULL); SetConsoleMode(hin, savemode); if ((int) i > maxlen) i = maxlen - 1; else i = i - 2; str[i] = '\0'; if (is_pw) { struct input_data *idata = (struct input_data *) &idata->len, NULL) && idata->len > 0) { SetEvent(idata->event); (skt, netevent, events) == SOCKET_ERROR) { switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "WSAAsyncSelect(): unknown error"; } } return NULL; } int main(int argc, char **argv) /* * Override the default protocol if PLINK_PROTOCOL is set. */ char *p = getenv("PLINK_PROTOCOL"); int i; if (p) { for (i = 0; backends[i].backend != NULL; i++) { if (!strcmp(backends[i].name, p)) { default_protocol = cfg.protocol = backends[i].protocol; default_port = cfg.port = backends[i].backend->default_port; break; } } } } while (--argc) { char *p = *++argv; if (*p == '-') { flags |= FLAG_VERBOSE; } else if (!strcmp(p, "-log")) { logfile = "putty.log"; } else if (!strcmp(p, "-pw") && argc > 1) { --argc, password = *++argv; } else if (!strcmp(p, "-l") && argc > 1) { char *username; --argc, username = *++argv; strncpy(cfg.username, username, sizeof(cfg.username)); cfg.username[sizeof(cfg.username) - 1] = '\0'; } else if (!strcmp(p, "-m") && argc > 1) { char *filename, *command; int cmdlen, cmdsize; FILE *fp; int c, d; --argc, filename = *++argv; cmdlen = cmdsize = 0; command = NULL; fp = fopen(filename, "r"); if (!fp) { fprintf(stderr, "plink: unable to open command " "file \"%s\"\n", filename); return 1; } do { c = fgetc(fp); d = c; if (c == EOF) d = 0; if (cmdlen >= cmdsize) { cmdsize = cmdlen + 512; command = srealloc(command, cmdsize); } command[cmdlen++] = d; } while (c != EOF); cfg.remote_cmd_ptr = command; cfg.nopty = TRUE; /* command => no terminal */ } else if (!strcmp(p, "-P") && argc > 1) { --argc, portnumber = atoi(*++argv); } } else if (*p) { if (!*cfg.host) { char *q = p; /* * If the hostname starts with "telnet:", set the * protocol to Telnet and process the string as a * Telnet URL. */ if (!strncmp(q, "telnet:", 7)) { char c; q += 7; if (q[0] == '/' && q[1] == '/') q += 2; cfg.protocol = PROT_TELNET; p = q; while (*p && *p != ':' && *p != '/') p++; c = *p; if (*p) *p++ = '\0'; if (c == ':') cfg.port = atoi(p); else cfg.port = -1; strncpy(cfg.host, q, sizeof(cfg.host) - 1); cfg.host[sizeof(cfg.host) - 1] = '\0'; } else { char *r; /* * Before we process the [user@]host string, we * first check for the presence of a protocol * prefix (a protocol name followed by ","). */ r = strchr(p, ','); if (r) { int i, j; for (i = 0; backends[i].backend != NULL; i++) { j = strlen(backends[i].name); if (j == r - p && !memcmp(backends[i].name, p, j)) { default_protocol = cfg.protocol = backends[i].protocol; portnumber = backends[i].backend->default_port; p = r + 1; break; } } } /* * Three cases. Either (a) there's a nonzero * length string followed by an @, in which * case that's user and the remainder is host. * Or (b) there's only one string, not counting * a potential initial @, and it exists in the * saved-sessions database. Or (c) only one * string and it _doesn't_ exist in the * database. */ r = strrchr(p, '@'); if (r == p) p++, r = NULL; /* discount initial @ */ if (r == NULL) { /* * One string. */ Config cfg2; do_defaults(p, &cfg2); if (cfg2.host[0] == '\0') { /* No settings for this host; use defaults */ strncpy(cfg.host, p, sizeof(cfg.host) - 1); cfg.host[sizeof(cfg.host) - 1] = '\0'; cfg.port = default_port; } else { cfg = cfg2; cfg.remote_cmd_ptr = cfg.remote_cmd; } } else { *r++ = '\0'; strncpy(cfg.username, p, sizeof(cfg.username) - 1); cfg.username[sizeof(cfg.username) - 1] = '\0'; strncpy(cfg.host, r, sizeof(cfg.host) - 1); cfg.host[sizeof(cfg.host) - 1] = '\0'; cfg.port = default_port; } } } else { int len = sizeof(cfg.remote_cmd) - 1; char *cp = cfg.remote_cmd; int len2; strncpy(cp, p, len); cp[len] = '\0'; len2 = strlen(cp); len -= len2; cp += len2; while (--argc) { if (len > 0) len--, *cp++ = ' '; strncpy(cp, *++argv, len); cp[len] = '\0'; len2 = strlen(cp); len -= len2; cp += len2; } cfg.nopty = TRUE; /* command => no terminal */ break; /* done with cmdline */ } } } if (!*cfg.host) { usage(); } if (!*cfg.remote_cmd_ptr) int i; back = NULL; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == cfg.protocol) { back = backends[i].backend; break; } if (back == NULL) { fprintf(stderr, "Internal fault: Unsupported protocol found\n"); return 1; } } /* * Select port. */ if (portnumber != -1) int n; if (!sending && back->sendok()) { /* * Create a separate thread to read from stdin. This is * a total pain, but I can't find another way to do it: * * - an overlapped ReadFile or ReadFileEx just doesn't * happen; we get failure from ReadFileEx, and * ReadFile blocks despite being given an OVERLAPPED * structure. Perhaps we can't do overlapped reads * on consoles. WHY THE HELL NOT? * * - WaitForMultipleObjects(netevent, console) doesn't * work, because it signals the console when * _anything_ happens, including mouse motions and * other things that don't cause data to be readable * - so we're back to ReadFile blocking. */ idata.event = stdinevent; idata.eventback = CreateEvent(NULL, FALSE, FALSE, NULL); if (!CreateThread(NULL, 0, stdin_read_thread, &idata, 0, &threadid)) { fprintf(stderr, "Unable to create second thread\n"); exit(1); } sending = TRUE; } n = WaitForMultipleObjects(2, handles, FALSE, INFINITE); if (n == 0) { int i, socketstate; /* * We must not call select_result() for any socket * until we have finished enumerating within the tree. * This is because select_result() may close the socket * and modify the tree. */ /* Count the active sockets. */ i = 0; for (socket = first_socket(&socketstate); socket != INVALID_SOCKET; socket = next_socket(&socketstate)) i++; /* Expand the buffer if necessary. */ if (i > sksize) { sksize = i + 16; sklist = srealloc(sklist, sksize * sizeof(*sklist)); } /* Retrieve the sockets into sklist. */ skcount = 0; for (socket = first_socket(&socketstate); socket != INVALID_SOCKET; socket = next_socket(&socketstate)) { sklist[skcount++] = socket; } /* Now we're done enumerating; go through the list. */ for (i = 0; i < skcount; i++) { WPARAM wp; socket = sklist[i]; wp = (WPARAM) socket; if (!WSAEnumNetworkEvents(socket, NULL, &things)) { noise_ultralight(socket); FD_CLOSE); if (things.lNetworkEvents & FD_OOB) connopen &= select_result(wp, (LPARAM) FD_OOB); if (things.lNetworkEvents & FD_WRITE) connopen &= select_result(wp, (LPARAM) FD_WRITE); } } } else if (n == 1) { noise_ultralight(idata.len); if (idata.len > 0) { back->send(idata.buffer, idata.len); } else { back->special(TS_EOF); } SetEvent(idata.eventback); } if (!connopen || back->socket() == NULL) break; Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fd0a17180835ed7bcac1a192c9efe679 Text-delta-base-sha1: e8f6a62be7317708165c9f3f488785e8934fef5a Text-content-length: 7721 Text-content-md5: 4435970f04ac3a53def62f50da0b3cb9 Text-content-sha1: 17b09b38cbf95519e81455d43e422db78b4a655a Content-length: 7760 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNOhs'>`N*/ZWa7U=%|5B2y\k}HoE&5K\/#3o[F'3KS\O{M,+=j0U{r 2 && fullname[i - 1] == '/') fullname[--i] = '\0'; /* strip trailing / unless at pos 0 */ while (i > 0 && fullname[--i] != '/'); /* * Give up on special cases. */ if (fullname[i] != '/' || /* no slash at all */ !strcmp(fullname + i, "/.") || /* ends in /. */ !strcmp(fullname + i, "/..") || /* ends in /.. */ !strcmp(fullname, "/")) { return fullname; } /* * Now i points at the slash. Deal with the final special * case i==0 (ie the whole path was "/nonexistentfile"). */ fullname[i] = '\0'; /* separate the string */ if (i == 0) { canonname = fxp_realpath("/"); } else { canonname = fxp_realpath(fullname); } if (!canonname) return fullname; /* even that failed; give up */ /* * We have a canonical name for all but the last path * component. Concatenate the last component and return. */ returnname = dupcat(canonname, canonname[strlen(canonname) - 1] == '/' ? "" : "/", fullname + i + 1, NULL); sfree(fullname); sfree(canonname); (struct sftp_command *); /* returns <0 to quit */ }; int sftp_cmd_null(struct sftp_command *cmd) { return 0; } int sftp_cmd_unknown(struct sftp_command *cmd) { const struct fxp_name *a = (const struct fxp_name *) av; const struct fxp_name *b = (const struct fxp_name *) wpos = 0; while (wpos < len) { wlen = fwrite(buffer, 1, len - "bye", sftp_cmd_quit}, { "cd", sftp_cmd_cd}, { "dir", sftp_cmd_ls}, { "exit", sftp_cmd_quit}, { "get", sftp_cmd_get}, { "ls", sftp_cmd_ls}, { "put", sftp_cmd_put}, { "quit", sftp_cmd_quit},};Command line reading and parsing. */ struct sftp_command *sftp_getcmd(void) + linelen, linesize - + linelen); linelen += len; if (line[linelen - += 2, *r++ = '"'; p++; srealloc(cmd->words, cmd->wordssize * char *keystr, char *fingerprint) { int ret; static const char absentmsg[] = "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, enter \"y\" to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you do not trust this host, enter \"n\" to abandon the\n" "connection.\n" "Continue connecting? (y/n) "; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "enter Yes to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, enter No.\n" "If you want to abandon the connection completely, press\n" "Return to cancel. Pressing Return is the ONLY guaranteed\n" "safe choice.\n" /* success - key matched OK */ return; if (ret == 2) { /* key was different */ fprintf(stderr, wrongmsg, fingerprint); if (fgets(line, sizeof(line), stdin) && line[0] != '\0' && line[0] != '\n') { if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); } else { fprintf(stderr, abandoned); exit(0); } } if (ret == 1) { /* key was absent */ fprintf(stderr, absentmsg, fingerprint); if (fgets(line, sizeof(line), stdin) && (line[0] == 'y' || line[0] == 'Y')) store_host_key(host, port, keytype, keystr); else { fprintf(stderr, abandoned); exit(0); + void connection_fatal(char *fmt, ...) { char str[0x100]; + { } void ldisc_send(char *buf, int len) /* where to put the data */ static unsigned outlen; = 0, pendsize = 0; { unsigned char *p = (unsigned char *) data; unsigned len = (unsigned) return; if (outlen > 0) { unsigned used = outlen; if (used > len) used = len; memcpy(outptr, p, used); outptr += used; outlen -= used; p += used; len -= used; } if (len > 0) { if (pendsize < pendlen + len) { pendsize = pendlen + len + 4096; pending = (pending ? srealloc(pending, pendsize) : smalloc(pendsize)); if (!pending) fatalbox("Out of memory"); } memcpy(pending + pendlen, p, len); pendlen += len; } } int sftp_recvdata(char *buf, int len) { outptr = (unsigned char *) unsigned pendused = pendlen; if (pendused > outlen) pendused = outlen; memcpy(outptr, pending, pendused); memmove(pending, pending + pendused, pendlen - pendused); outptr += pendused; outlen -= pendused; pendlen -= pendused; if (pendlen == 0) { pendsize = 0; sfree(pending); pending = NULL; } if (outlen == 0) return 1; } while (outlen > 0) { fd_set readfds; FD_ZERO(&readfds); FD_SET(sftp_ssh_socket, &readfds); if (select(1, &readfds, NULL, NULL, NULL) < 0) return 0; /* doom */ select_result((WPARAM) sftp_ssh_socket, (LPARAM) FD_READ); } return 1; } int sftp_senddata(char *buf, int len) { back->send((unsigned char *) fd_set readfds; FD_ZERO(&readfds); FD_SET(sftp_ssh_socket, &readfds); if (select(1, &readfds, NULL, NULL, NULL) < 0) return; /* doom */ select_result((WPARAM) sftp_ssh_socket, (LPARAM) static int tried_once = 0; if (tried_once) { return 0; } else { strncpy(str, password, maxlen); str[maxlen - 1] = '\0'; tried_once = 1; return 1; newmode &= ~ENABLE_ECHO_INPUT; else - 1, &i, NULL); SetConsoleMode(hin, savemode); if ((int) i > maxlen) i = maxlen - 1; else i = i - 2; str[i] = '\0'; if (is_pw) + 1 < argc) { user = argv[++i]; } else if (strcmp(argv[i], "-P") == 0 && i + 1 < argc) { portnumber = atoi(argv[++i]); } else if (strcmp(argv[i], "-pw") == 0 && i + do_defaults(NULL, &cfg); strncpy(cfg.host, host, sizeof(cfg.host) - 1); cfg.host[sizeof(cfg.host) - - 1); cfg.username[sizeof(cfg.username) - - 1] == '\n') cfg.username[len - Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7d5145067443f045109294a158e87299 Text-delta-base-sha1: e53b16a53bcfcf3d4e1a496330978b94789bdb4c Text-content-length: 2105 Text-content-md5: a479f35db208b3905d73ef3945ee8bf6 Text-content-sha1: cd3a9a47168b6f3da27c130268673a8457e7be18 Content-length: 2145 K 15 cvs2svn:cvs-rev V 4 1.94 PROPS-END SVNgLr;q'k.c64 ZCnHaCE }h&d}&WvJb2dZxU{i G /* existing logfile overwrite */ #define LGXF_APN 0 /* existing logfile append */ #define LGXF_ASK -1 /* existing logfile ask */ #define LGTYP_NONE 0 /* logmode: no logging */ #define LGTYP_ASCII 1 /* logmode: pure ascii */ #define LGTYP_DEBUG 2 /* local line editing */ LD_ECHO /* local echo */ }; enum { /* * Close On Exit behaviours. (cfg.close_on_exit) */ COE_NEVER, /* Never close the window */ COE_NORMAL, /* Close window on "normal" (non-error) exits only */ COE_ALWAYS Socket /* in seconds */ /* SSH options */ char remote_cmd[512]; char *remote_cmd_ptr; /* might point to a larger command /* use v1 or v2 when both available */ int buggymac; /* totally disable app cursor keys */ int no_applic_k; (int, int, int); void do_text(Context, int, int, char *, int, unsigned long, int); void set_title(char *); void set_icon(char *); void set_sbar(int, int, int); Context get_ctx(void); void free_ctx(Context); void palette_set(int, int, int, int); void palette_reset(void); void write_clip(void *, int, int); void get_clip(void **, int *); void optimised_move(char *, ...); void beep (void *, int)); void noise_get_light(void (*func) (void); int do_reconfig(HWND); void do_defaults(char *, Config *); void logevent(char *); void showeventlog(HWND); void showabout(HWND); void verify_ssh_host_key(char *host, int port, char *keytype, (char *section, int do_host, Config * cfg); void load_settings(char *section, int do_host, Config * (void); void term_size(int, int, int); void term_out(void); void term_paint(Context, int, int, int, int); void term_scroll(int, int); void term_pwron(void); void term_clrsb(void); void term_mouse(Mouse_Button, Mouse_Action, int, int, int, int); void term_deselect(void); void term_update(void); void logfclose (const char *prompt, char *str, int maxlen, Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0394f55aef9e34762362cae47ca545e7 Text-delta-base-sha1: e5412c5ca2185eb901973f579e594e29c08c731b Text-content-length: 16134 Text-content-md5: 938c41ec328fac93d4077de0d3b8d594 Text-content-sha1: 1c286a1b4def62184051ab2b4bb22ab72ca83997 Content-length: 16174 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN$J-#z=Bx@HJk.;QX@. |H.J^7OH.wMxM%-P( I WA?tZphase1param = 0x10000 + progress; p->phase1current = 0x10000; p->phase1n = 0; return; case -2: p->phase2param = 0x10000 + progress; p->phase2current = 0x10000; p->phase2n = 0; return; case -3: p->phase3mult = PHASE3TOTAL / progress; return; case 1: while (p->phase1n < progress) { p->phase1n++; p->phase1current *= p->phase1param; p->phase1current /= 0x10000; } position = PHASE1START + 0x10000 - p->phase1current; break; case 2: while (p->phase2n < progress) { p->phase2n++; p->phase2current *= p->phase2param; p->phase2current /= 0x10000; } position = PHASE2START + 0x10000 - p->phase2current; break; case 3: position = PHASE3START + progress * p->phase3mult; WPARAM wParam, LPARAM lParam) SetForegroundWindow(hwnd); SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, (hw, &rs) && GetWindowRect(hwnd, &rd)) MoveWindow(hwnd, (rs.right + rs.left + rd.left - rd.right) / 2, (rs.bottom + rs.top + rd.top - rd.bottom) / 2, rd.right - rd.left, rd.bottom - rd.top, TRUE); } p = (struct PassphraseProcStruct *) lParam; passphrase = p->passphrase; if (p->comment) SetDlgItemText(hwnd, 101, p->comment); *passphrase = 0; SetDlgItemText(hwnd, 102, passphrase); (hwnd, 1); else MessageBeep(0); return 0; case IDCANCEL: EndDialog(hwnd, 0); return 0; case 102: /* edit box */ if ((HIWORD(wParam) == EN_CHANGE) && passphrase) { GetDlgItemText(hwnd, 102, passphrase, PASSPHRASE_MAXLEN - 1); passphrase[PASSPHRASE_MAXLEN - 1] = '\0'; } return 0; } return 0; case WM_CLOSE: EndDialog char *filename, int save) return GetSaveFileName(&of); else { } /* * Dialog-box function for the Licence box. */ static int CALLBACK LicenceProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) (hw, &rs) && GetWindowRect(hwnd, &rd)) MoveWindow(hwnd, (rs.right + rs.left + rd.left - rd.right) / 2, (rs.bottom + rs.top + rd.top - rd.bottom) / 2, rd.right - rd.left, rd.bottom - (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) (hw, &rs) && GetWindowRect(hwnd, &rd)) MoveWindow(hwnd, (rs.right + rs.left + rd.left - rd.right) / 2, (rs.bottom + rs.top + rd.top - rd.bottom) / 2, rd.right - rd.left, rd.bottom - rd.top, TRUE); } SetDlgItemText(hwnd, 100, ver); return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwnd, 1); return 0; case 101: EnableWindow(hwnd, 0); DialogBox(hinst, MAKEINTRESOURCE(214), NULL, LicenceProc); EnableWindow(hwnd, 1); /* notify this with progress */ HWND dialog; { struct rsa_key_thread_params *params = (struct rsa_key_thread_params *) { while (*ids) { + strlen(dec2) + strlen(key->comment) + 30); sprintf(buffer, "%d %s %s %s", bignum_bitcount(key->modulus), dec1, dec2 * ((pub_len + 2) / - i < 3 ? pub_len - i : 3); base64_encode_atom(pub_blob + (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { enum { controlidstart = 100, IDC_TITLE, IDC_BOX_KEY, IDC_NOKEY, IDC_GENERATING, IDC_PROGRESS, IDC_PKSTATIC, IDC_KEYDISPLAY, IDC_FPSTATIC, IDC_FINGERPRINT, IDC_COMMENTSTATIC, IDC_COMMENTEDIT, IDC_PASSPHRASE1STATIC, IDC_PASSPHRASE1EDIT, IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2EDIT, IDC_BOX_ACTIONS, IDC_GENSTATIC, IDC_GENERATE, IDC_LOADSTATIC, IDC_LOAD, IDC_SAVESTATIC, IDC_SAVE, IDC_BOX_PARAMS, IDC_TYPESTATIC, IDC_KEYSSH1, IDC_KEYSSH2RSA, IDC_BITSSTATIC, IDC_BITS, IDC_ABOUT, }; static const int nokey_ids[] = { IDC_NOKEY, 0 }; static const int generating_ids[] = { IDC_GENERATING, IDC_PROGRESS, 0 }; static const int gotkey_ids[] = { IDC_PKSTATIC, IDC_KEYDISPLAY, IDC_FPSTATIC, IDC_FINGERPRINT, IDC_COMMENTSTATIC, IDC_COMMENTEDIT, IDC_PASSPHRASE1STATIC, IDC_PASSPHRASE1EDIT, IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2EDIT, 0 }; static const char generating_msg[] = "Please wait while a key is generated..."; static const char entropy_msg[] = (hw, &rs) && GetWindowRect(hwnd, &rd)) MoveWindow(hwnd, (rs.right + rs.left + rd.left - rd.right) / 2, (rs.bottom + rs.top + rd.top - rd.bottom) / 2, rd.right - rd.left, rd.bottom - rd.top, TRUE); } state = smalloc(sizeof(*state)); state->generation_thread_exists = FALSE; state->collecting_entropy = FALSE; state->entropy = NULL; state->key_exists = FALSE; SetWindowLong(hwnd, GWL_USERDATA, (LONG) state); { struct ctlpos cp, cp2; /* Accelerators used: acglops */ ctlposinit(&cp, hwnd, 10, 10, 10); bartitle(&cp, "Public and private key generation for PuTTY", IDC_TITLE); beginbox(&cp, "Key", IDC_BOX_KEY); cp2 = cp; statictext(&cp2, "No key.", IDC_NOKEY); cp2 = cp; statictext(&cp2, "", IDC_GENERATING); progressbar(&cp2, IDC_PROGRESS); bigeditctrl(&cp, "&Public key for pasting into authorized_keys file:", IDC_PKSTATIC, IDC_KEYDISPLAY, 7); SendDlgItemMessage(hwnd, IDC_KEYDISPLAY, EM_SETREADONLY, 1, 0); staticedit(&cp, "Key fingerprint:", IDC_FPSTATIC, IDC_FINGERPRINT, 75); SendDlgItemMessage(hwnd, IDC_FINGERPRINT, EM_SETREADONLY, 1, 0); staticedit(&cp, "Key &comment:", IDC_COMMENTSTATIC, IDC_COMMENTEDIT, 75); staticpassedit(&cp, "Key p&assphrase:", IDC_PASSPHRASE1STATIC, IDC_PASSPHRASE1EDIT, 75); staticpassedit(&cp, "C&onfirm passphrase:", IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2EDIT, 75); endbox(&cp); beginbox(&cp, "Actions", IDC_BOX_ACTIONS); staticbtn(&cp, "Generate a public/private key pair", IDC_GENSTATIC, "&Generate", IDC_GENERATE); staticbtn(&cp, "Load an existing private key file", IDC_LOADSTATIC, "&Load", IDC_LOAD); staticbtn(&cp, "Save the generated key to a new file", IDC_SAVESTATIC, "&Save", IDC_SAVE); endbox(&cp); beginbox(&cp, "Parameters", IDC_BOX_PARAMS); radioline(&cp, "Type of key to generate:", IDC_TYPESTATIC, 2, "SSH&1 (RSA)", IDC_KEYSSH1, "SSH2 &RSA", IDC_KEYSSH2RSA, NULL); staticedit(&cp, "Number of &bits in a generated key:", IDC_BITSSTATIC, IDC_BITS, 20); endbox(&cp); /* * Initially, hide the progress bar and the key display, * and show the no-key display. Also disable the Save * button, because with no key we obviously can't save * anything. */ hidemany(hwnd, nokey_ids, FALSE); hidemany(hwnd, generating_ids, TRUE); hidemany(hwnd, gotkey_ids, TRUE); EnableWindow(GetDlgItem(hwnd, IDC_SAVE), 0); return 1; case WM_MOUSEMOVE: state = (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA); if (state->collecting_entropy && state->entropy && state->entropy_got < state->entropy_required) { state->entropy[state->entropy_got++] = lParam; state->entropy[state->entropy_got++] = GetMessageTime(); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, state->entropy_got, 0); if (state->entropy_got >= state->entropy_required) { struct rsa_key_thread_params *params; DWORD threadid; /* * Seed the entropy pool */ random_add_heavynoise(state->entropy, state->entropy_size); memset(state->entropy, 0, state->entropy_size); sfree(state->entropy); state->collecting_entropy = FALSE; SetDlgItemText(hwnd, IDC_GENERATING, generating_msg); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, PROGRESSRANGE)); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, 0, 0); params = smalloc(sizeof(*params)); params->progressbar = GetDlgItem(hwnd, IDC_PROGRESS); params->dialog = hwnd; params->keysize = state->keysize; params->key = &state->key; if (!CreateThread(NULL, 0, generate_rsa_key_thread, params, 0, &threadid)) { MessageBox(hwnd, "Out of thread resources", "Key generation error", MB_OK | MB_ICONERROR); sfree(params); } else { state->generation_thread_exists = TRUE; } } } state = (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA); if (state->key_exists) { HWND editctl = GetDlgItem(hwnd, IDC_COMMENTEDIT); int len = GetWindowTextLength(editctl); if (*state->commentptr) sfree(*state->commentptr); *state->commentptr = smalloc(len + 1); GetWindowText(editctl, *state->commentptr, len + 1); if (state->ssh2) { setupbigedit2(hwnd, IDC_KEYDISPLAY, (hinst, MAKEINTRESOURCE(213), NULL, AboutProc); EnableWindow(hwnd, 1); SetActiveWindow(hwnd); return 0; case IDC_GENERATE: state = (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA); if (!state->generation_thread_exists) { BOOL ok; state->keysize = GetDlgItemInt(hwnd, IDC_BITS, &ok, FALSE); if (!ok) if (state->keysize < 256) { int ret = MessageBox(hwnd, "PuTTYgen will not generate a key" " smaller than 256 bits.\n" "Key length reset to 256. Continue?", "PuTTYgen Warning", MB_ICONWARNING | MB_OKCANCEL); if (ret != IDOK) break; state->keysize = 256; SetDlgItemInt(hwnd, IDC_BITS, 256, FALSE); } hidemany(hwnd, nokey_ids, TRUE); hidemany(hwnd, generating_ids, FALSE); hidemany(hwnd, gotkey_ids, TRUE); EnableWindow(GetDlgItem(hwnd, IDC_GENERATE), 0); EnableWindow(GetDlgItem(hwnd, IDC_LOAD), 0); EnableWindow(GetDlgItem(hwnd, IDC_SAVE), 0); state->key_exists = FALSE; SetDlgItemText(hwnd, IDC_GENERATING, entropy_msg); state->collecting_entropy = TRUE; /* * My brief statistical tests on mouse movements * suggest that there are about 2.5 bits of * randomness in the x position, 2.5 in the y * position, and 1.7 in the message time, making * 5.7 bits of unpredictability per mouse movement. * However, other people have told me it's far less * than that, so I'm going to be stupidly cautious * and knock that down to a nice round 2. With this * method, we require two words per mouse movement, * so with 2 bits per mouse movement we expect 2 * bits every 2 words. */ state->entropy_required = (state->keysize / 2) * 2; state->entropy_got = 0; state->entropy_size = (state->entropy_required * sizeof(*state->entropy)); state->entropy = smalloc(state->entropy_size); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, state->entropy_required)); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, 0, 0); } break; case IDC_SAVE: state = (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA); if (state->key_exists) { char filename[FILENAME_MAX]; char passphrase[PASSPHRASE_MAXLEN]; char passphrase2[PASSPHRASE_MAXLEN]; GetDlgItemText(hwnd, IDC_PASSPHRASE1EDIT, passphrase, sizeof(passphrase)); GetDlgItemText(hwnd, IDC_PASSPHRASE2EDIT, MB_OK | MB_ICONERROR); break; } if (!*passphrase) { int ret; ret = MessageBox(hwnd, "Are you sure you want to save this key\n" "without a passphrase to protect it?", "PuTTYgen Warning", MB_YESNO | MB_ICONWARNING); if (ret != IDYES) break; } if (prompt_keyfile(hwnd, "Save private key as:", + MB_OK | MB_ICONERROR); } } } break; case IDC_LOAD: state = (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA); if (!state->generation_thread_exists) { char filename[FILENAME_MAX]; if (prompt_keyfile(hwnd, "Load private key:", filename, 0)) { char passphrase[PASSPHRASE_MAXLEN]; int needs_pass; int ver; int ret; char *comment; struct PassphraseProcStruct pps; MessageBox(NULL, "Couldn't load private key.", ssh2_userkey_encrypted(filename, &comment); pps.passphrase = passphrase; pps.comment = comment; do { if (needs_pass) { int dlgret; dlgret = DialogBoxParam(hinst, MAKEINTRESOURCE(210), NULL, PassphraseProc, (LPARAM) & pps); if (!dlgret) { ret = -2; break; } } else *passphrase = '\0'; if (ver == 1) ret = loadrsakey(filename, &newkey1, passphrase); else { newkey2 = } while (ret == -1); if (comment) sfree(comment); if (ret == 0) { MessageBox(NULL, "Couldn't load private key.", "PuTTYgen Error", MB_OK | MB_ICONERROR); } else if (ret == 1) { EnableWindow(GetDlgItem(hwnd, IDC_GENERATE), 1); EnableWindow(GetDlgItem(hwnd, IDC_LOAD), 1); EnableWindow(GetDlgItem(hwnd, IDC_SAVE), 1); /* * Now update the key controls with all the * key data. */ { SetDlgItemText(hwnd, IDC_PASSPHRASE1EDIT, passphrase); SetDlgItemText(hwnd, IDC_PASSPHRASE2EDIT, state->key.comment = NULL; rsa_fingerprint(buf, sizeof(buf), &state->key); &state->ssh2key.comment; state->ssh2key = *newkey2; /* structure copy */ sfree(newkey2); savecomment = state->ssh2key.comment; state->ssh2key.comment = NULL; fp = state->ssh2key.alg-> fingerprint(state->ssh2key.data); &state->ssh2key); } SetDlgItemText(hwnd, IDC_COMMENTEDIT, *state->commentptr); } /* * Finally, hide the progress bar and show * the key data. */ hidemany(hwnd, nokey_ids, TRUE); hidemany(hwnd, generating_ids, TRUE); hidemany(hwnd, gotkey_ids, FALSE); state->key_exists = TRUE; } } } break; } return 0; case WM_DONEKEY: state = (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA); state->generation_thread_exists = FALSE; state->key_exists = TRUE; SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, PROGRESSRANGE, 0); EnableWindow(GetDlgItem(hwnd, IDC_GENERATE), 1); EnableWindow(GetDlgItem(hwnd, IDC_LOAD), 1); /* * Invent a comment for the key. We'll do this by including * the date in it. This will be so horrifyingly ugly that * the user will immediately want to change it, which is * what we want :-) */ *state->commentptr = smalloc(30); { time_t t; struct tm *tm; time(&t); tm = localtime(&t); strftime(*state->commentptr, 30, "rsa-key-%Y%m%d", tm); } /* * Now update the key controls with all the key data. */ { char *savecomment; /* * Blank passphrase, initially. This isn't dangerous, * because we will warn (Are You Sure?) before allowing * the user to save an unprotected private key. */ SetDlgItemText(hwnd, IDC_PASSPHRASE1EDIT, ""); SetDlgItemText(hwnd, IDC_PASSPHRASE2EDIT, ""); /* * Set the comment. */ SetDlgItemText(hwnd, IDC_COMMENTEDIT, *state->commentptr); /* * Set the key fingerprint. */ savecomment = *state->commentptr; *state->commentptr = NULL; if (state->ssh2) { char *fp; rsa_fingerprint(buf, sizeof(buf), &state->key); SetDlgItemText(hwnd, IDC_FINGERPRINT, buf); } *state->commentptr = savecomment; /* * Construct a decimal representation of the key, for * pasting into .ssh/authorized_keys on a Unix box. } /* * Finally, hide the progress bar and show the key data. */ hidemany(hwnd, nokey_ids, TRUE); hidemany(hwnd, generating_ids, TRUE); hidemany(hwnd, gotkey_ids, FALSE); break; case WM_CLOSE: state = (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA); sfree(state); { InitCommonControls(); hinst = inst; random_init(); return DialogBox(hinst, MAKEINTRESOURCE(201), NULL, Node-path: putty/puttymem.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 21125717a5760da070706b5bdf6db600 Text-delta-base-sha1: 3ebe19565f8a2e05f1997c351000b497dc9ccbd8 Text-content-length: 73 Text-content-md5: 454a67cc6634b4e42ca3966d884ab561 Text-content-sha1: 00c20f70c69cac1fda36f81a373ac07b01388651 Content-length: 112 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN#3 5o /* for size_t */ #include Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: efcbabe0cb9e555d42998cd5c6a9fb18 Text-delta-base-sha1: cb0e7ac45236c8a7b3bf2684e9bd95a4e0b5ec01 Text-content-length: 754 Text-content-md5: d128f3989f00642342a49ae2ec81a360 Text-content-sha1: fd653bb94ef6092fcec6d65ba41cf35652cd79c8 Content-length: 794 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNxs60Iie_|p-Zx`r&R(char *buf, int len) { from_backend(0, buf, len); } static int raw_closing(Plug plug, char *error_msg, int error_code, int calling_back) { sk_close(s); s = NULL; if (error_msg) { /* A socket error has occurred. */ connection_fatal(error_msg); } (Plug plug, int urgent, char *data, int len) (char *host, int port, char **realhost) (err = sk_addr_error(addr))(err = sk_socket_error(s))(char *buf, int len) (Telnet_Special code) { /* Do nothing! */ return; } static Socket raw_socket(void) { return s; } static int raw_sendok(void) { return 1; } static int raw_ldisc(int option) { if (option == LD_EDIT || option == LD_ECHO) Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 379adbddbcd8e7ad6f9d78f3117d55aa Text-delta-base-sha1: 3f1d53d52b1bd8212192b7112a983296f6618c8e Text-content-length: 1860 Text-content-md5: 8f1e457a6233a4063e27aa70694488c5 Text-content-sha1: abcf39eebac026f43bfa45872ebd2a1160c012a1 Content-length: 1900 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNYO@x_l~qev'.:~; Q{gHyj6#(char *buf, int len) { from_backend(0, buf, len); } static int rlogin_closing(Plug plug, char *error_msg, int error_code, int calling_back) { sk_close(s); s = NULL; if (error_msg) { /* A socket error has occurred. */ connection_fatal(error_msg); } (Plug plug, int urgent, char *data, int len) { if (urgent == 2) { char c; c = *data++; len--; if (c == '\x80') rlogin_size(); /* * We should flush everything (aka Telnet SYNCH) if we see * 0x02, and we should turn off and on _local_ flow control * on 0x10 and 0x20 respectively. I'm not convinced it's * worth it... */ } else { /* * Main rlogin protocol. This is really simple: the first * byte is expected to be NULL and is ignored, and the rest * is printed. */ static int firstbyte = 1; if (firstbyte) { if (data[0] == '\0') { data++; len--; } firstbyte = 0; } (char *host, int port, char **realhost) (err = sk_addr_error(addr))(err = sk_socket_error(s))) return err; sk_addr_free(addr); /* * Send local username, remote username, terminal/speed */ { char z = 0; char *p; sk_write(s, &z, 1); sk_write(s, cfg.localusername, strlen(cfg.localusername)); sk_write(s, &z, 1); sk_write(s, cfg.username, strlen(cfg.username)); sk_write(s, &z, 1); sk_write(s, cfg.termtype, strlen(cfg.termtype)); sk_write(s, "/", 1); for (p = cfg.termspeed; isdigit(*p); p++); sk_write(s, cfg.termspeed, p - cfg.termspeed); (char *buf, int len) { char b[12] = { '\xFF', '\xFF', 0x73, 0x73, 0, 0, 0, 0, 0, 0, 0, 0 }; b[6] = cols >> 8; b[7] = cols & 0xFF; b[4] = rows >> 8; (Telnet_Special code) { return s; } static int rlogin_sendok(void) { return 1; } static int rlogin_ldisc(int option) Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c91f53c2308689b3dc6c6dced68b9ba8 Text-delta-base-sha1: 4b0be0c5533372735b0e6449f21fd93eb5a68668 Text-content-length: 8091 Text-content-md5: a78cfd413ebb7aa242a8a1fe849d1a39 Text-content-sha1: a3cebcd3066f7bb7ea4426fa7f7aea7273f5c100 Content-length: 8131 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNj0V6 D _H*vJ}DW;L dTS8MYrn^~G?rn^~ W=dwg_nP" 7Q"zrn{~6D{g)`fbS6BgUjCG?aTZ5.*~Y-Xc iWg>uIa:9xG[Hk&1 0) { unsigned used = outlen; if (used > len) used = len; memcpy(outptr, p, used); outptr += used; outlen -= used; p += used; len -= used; } if (len > 0) { if (pendsize < pendlen + len) { pendsize = pendlen + len + 4096; pending = (pending ? srealloc(pending, pendsize) : smalloc(pendsize)); if (!pending) fatalbox("Out of memory"); } memcpy(pending + pendlen, p, len); pendlen += len; } } static int ssh_scp_recv(unsigned char *buf, int len) unsigned pendused = pendlen; if (pendused > outlen) pendused = outlen; memcpy(outptr, pending, pendused); memmove(pending, pending + pendused, pendlen - pendused); outptr += pendused; outlen -= pendused; pendlen -= pendused; if (pendlen == 0) { pendsize = 0; sfree(pending); pending = NULL; } if (outlen == 0) return len; } while (outlen > 0) { fd_set readfds; FD_ZERO(&readfds); FD_SET(scp_ssh_socket, &readfds); if (select(1, &readfds, NULL, NULL, NULL) < 0) return 0; /* doom */ select_result((WPARAM) scp_ssh_socket, (LPARAM) { if (scp_ssh_socket == INVALID_SOCKET) return; while (!back->sendok()) { fd_set readfds; FD_ZERO(&readfds); FD_SET(scp_ssh_socket, &readfds); if (select(1, &readfds, NULL, NULL, NULL) < 0) return; /* doom */ select_result((WPARAM) scp_ssh_socket, (LPARAM) + static int tried_once = 0; if (tried_once) { return 0; } else { strncpy(str, password, maxlen); str[maxlen - 1] = '\0'; tried_once = 1; return 1; } } /* GUI Adaptation - Sept 2000 */ if (gui_mode) { if (maxlen > 0) newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT; if (is_pw) newmode &= ~ENABLE_ECHO_INPUT; else newmode |= ENABLE_ECHO_INPUT; SetConsoleMode(hin, newmode); WriteFile(hout, prompt, strlen(prompt), &i, NULL); ReadFile(hin, str, maxlen - 1, &i, NULL); SetConsoleMode(hin, savemode); if ((int) i > maxlen) i = maxlen - 1; else i = i - 2; str[i] = '\0'; if (is_pw) do_defaults(NULL, &cfg); strncpy(cfg.host, host, sizeof(cfg.host) - 1); cfg.host[sizeof(cfg.host) - - 1); cfg.username[sizeof(cfg.username) - tell_user(stderr, "Guessing user name: %s", user); strncpy(cfg.username, user, sizeof(cfg.username) - 1); cfg.username[sizeof(cfg.username) - - (100 * (done * 1.0 / size)), (unsigned long) colon(char *str) { /* We ignore a leading colon, since the hostname cannot be empty. We also ignore a colon as second character because of filenames like f:myfile.txt. */ if (str[0] == '\0' || str[0] == ':' || str[1] == ':') return (NULL); while (*str != '\0' && *str != ':' && *str != '/' && /* error */ case 2: - + - /* * Avoid . and .. directories. */ char *p; p = strrchr(src, '/'); if (!p) p = strrchr(src, '\\'); if (!p) p = src; else p++; if (!strcmp(p, ".") || !strcmp(p, "..")) /* skip . and .. */ ; else rsource(src); } else { run_err("%s: not a regular file", src); } return; } k = size - i; if (!ReadFile(f, transbuf, k, &j, NULL) || j != k) { if (statistics) - - 1] = '\0'; switch (buf[0]) { case '\01': /* error */ tell_user(stderr, "%s\n", buf + 1); errs++; continue; case '\02': /* fatal error */ bump("%s", buf + + - CreateDirectory(namebuf, NULL)) { run_err("%s: Cannot create directory", continue; if (! - ; } else if (len > dlen + 1 && src[len - dlen - 1] == '\\' && !strcmp(src + len - dlen, fdat.cFileName)) { /* ok */ * *p++ = '\\'; *p++ = '\''; + 1 < argc) portnumber = atoi(argv[++i]); else if (strcmp(argv[i], "-pw") == 0 && i + 1 < argc) password = argv[++i]; else if (strcmp(argv[i], "-gui") == 0 && i + list = 1; else if (strcmp(argv[i], "--") == 0) { i++; break; } - msg_id = WM_LS_RET_ERR_CNT; while (!PostMessage ((HWND) atoi(gui_hwnd), msg_id, (WPARAM) errs, 0 /*lParam */ ))SleepEx(1000, Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cac734101e7e65db021976b50539c7b2 Text-delta-base-sha1: a55016bbc3a58e4248461694db0f4692ea4aa89b Text-content-length: 12708 Text-content-md5: aa15832b957186636fc6e5730ff995f3 Text-content-sha1: 8cd383372a02d5696701352de974128eff6f5ed6 Content-length: 12748 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNN&0edZOs%@SjQ>D1\w ]7{ZK~j: { if (!read_setting_s(handle, name, val, len)) { strncpy(val, def, len); val[len - { *i = read_setting_i(handle, name, def); } void save_settings(char *section, int do_host, Config * cfg) return; write_setting_i(sesskey, "Present", 1); if (do_host) { write_setting_s(sesskey, "HostName", cfg->host); write_setting_i(sesskey, "PortNumber", cfg->port); write_setting_s(sesskey, "LogFileName", cfg->logfilename); write_setting_i(sesskey, "LogType", cfg->logtype); write_setting_i(sesskey, "LogFileClash", cfg->logxfovr); p = "raw"; for (i = 0; backends[i].name != NULL; i++) if (backends[i].protocol == cfg->protocol) { p = backends[i].name; break; } write_setting_s(sesskey, "Protocol", p); } write_setting_i(sesskey, "CloseOnExit", cfg->close_on_exit); write_setting_i(sesskey, "WarnOnClose", !!cfg->warn_on_close); write_setting_i(sesskey, "PingInterval", cfg->ping_interval / 60); /* minutes */ write_setting_i(sesskey, "PingIntervalSecs", cfg->ping_interval % 60); /* seconds */ write_setting_s(sesskey, "TerminalType", cfg->termtype); write_setting_s(sesskey, "TerminalSpeed", cfg->termspeed); { char buf[2 * sizeof(cfg->environmt)], *p, *q; p = buf; (sesskey, "Environment", buf); } write_setting_s(sesskey, "UserName", cfg->username); write_setting_s(sesskey, "LocalUserName", cfg->localusername); write_setting_i(sesskey, "NoPTY", cfg->nopty); write_setting_i(sesskey, "Compression", cfg->compression); write_setting_i(sesskey, "AgentFwd", cfg->agentfwd); write_setting_s(sesskey, "Cipher", cfg->cipher == CIPHER_BLOWFISH ? "blowfish" : cfg->cipher == CIPHER_DES ? "des" : cfg->cipher == CIPHER_AES ? "aes" : "3des"); write_setting_i(sesskey, "AuthTIS", cfg->try_tis_auth); write_setting_i(sesskey, "SshProt", cfg->sshprot); write_setting_i(sesskey, "BuggyMAC", cfg->buggymac); write_setting_s(sesskey, "PublicKeyFile", cfg->keyfile); write_setting_s(sesskey, "RemoteCommand", cfg->remote_cmd); write_setting_i(sesskey, "RFCEnviron", cfg->rfc_environ); write_setting_i(sesskey, "BackspaceIsDelete", cfg->bksp_is_delete); write_setting_i(sesskey, "RXVTHomeEnd", cfg->rxvt_homeend); write_setting_i(sesskey, "LinuxFunctionKeys", cfg->funky_type); write_setting_i(sesskey, "NoApplicationKeys", cfg->no_applic_k); write_setting_i(sesskey, "NoApplicationCursors", cfg->no_applic_c); write_setting_i(sesskey, "ApplicationCursorKeys", cfg->app_cursor); write_setting_i(sesskey, "ApplicationKeypad", cfg->app_keypad); write_setting_i(sesskey, "NetHackKeypad", cfg->nethack_keypad); write_setting_i(sesskey, "AltF4", cfg->alt_f4); write_setting_i(sesskey, "AltSpace", cfg->alt_space); write_setting_i(sesskey, "AltOnly", cfg->alt_only); write_setting_i(sesskey, "ComposeKey", cfg->compose_key); write_setting_i(sesskey, "CtrlAltKeys", cfg->ctrlaltkeys); write_setting_i(sesskey, "LocalEcho", cfg->localecho); write_setting_i(sesskey, "LocalEdit", cfg->localedit); write_setting_s(sesskey, "Answerback", cfg->answerback); write_setting_i(sesskey, "AlwaysOnTop", cfg->alwaysontop); write_setting_i(sesskey, "HideMousePtr", cfg->hide_mouseptr); write_setting_i(sesskey, "SunkenEdge", cfg->sunken_edge); write_setting_i(sesskey, "CurType", cfg->cursor_type); write_setting_i(sesskey, "BlinkCur", cfg->blink_cur); write_setting_i(sesskey, "Beep", cfg->beep); write_setting_s(sesskey, "BellOverload", cfg->bellovl); write_setting_i(sesskey, "BellOverloadN", cfg->bellovl_n); write_setting_i(sesskey, "BellOverloadT", cfg->bellovl_t); write_setting_i(sesskey, "BellOverloadS", cfg->bellovl_s); write_setting_i(sesskey, "DECOriginMode", cfg->dec_om); write_setting_i(sesskey, "AutoWrapMode", cfg->wrap_mode); write_setting_i(sesskey, "LFImpliesCR", cfg->lfhascr); write_setting_i(sesskey, "WinNameAlways", cfg->win_name_always); write_setting_s(sesskey, "WinTitle", cfg->wintitle); write_setting_i(sesskey, "TermWidth", cfg->width); write_setting_i(sesskey, "TermHeight", cfg->height); write_setting_s(sesskey, "Font", cfg->font); write_setting_i(sesskey, "FontIsBold", cfg->fontisbold); write_setting_i(sesskey, "FontCharSet", cfg->fontcharset); write_setting_i(sesskey, "FontHeight", cfg->fontheight); write_setting_i(sesskey, "FontVTMode", cfg->vtmode); write_setting_i(sesskey, "TryPalette", cfg->try_palette); write_setting_i(sesskey, "BoldAsColour", cfg->bold_colour); for (i = 0; i < (sesskey, buf, buf2); } write_setting_i(sesskey, "RawCNP", cfg->rawcnp); write_setting_i(sesskey, "MouseIsXterm", cfg->mouse_is_xterm); for (i = 0; i < 256; i += = i; j < i + 32; j++) { sprintf(buf2 + (sesskey, buf, buf2); } write_setting_i(sesskey, "KoiWinXlat", cfg->xlat_enablekoiwin); write_setting_i(sesskey, "88592Xlat", cfg->xlat_88592w1250); write_setting_i(sesskey, "88592-CP852", cfg->xlat_88592cp852); write_setting_i(sesskey, "ScrollBar", cfg->scrollbar); write_setting_i(sesskey, "ScrollOnDisp", cfg->scroll_on_disp); write_setting_i(sesskey, "LockSize", cfg->locksize); write_setting_i(sesskey, "BCE", cfg->bce); write_setting_i(sesskey, "BlinkText", cfg->blinktext); write_setting_i(sesskey, "X11Forward", cfg->x11_forward); write_setting_s(char *section, int do_host, Config * cfg) (sesskey, "HostName", "", cfg->host, sizeof(cfg->host)); gppi(sesskey, "PortNumber", default_port, &cfg->port); gpps(sesskey, "LogFileName", "putty.log", cfg->logfilename, sizeof(cfg->logfilename)); gppi(sesskey, "LogType", 0, &cfg->logtype); gppi(sesskey, "LogFileClash", LGXF_ASK, &cfg->logxfovr); gpps if (!strcmp(prot, backends[i].name)) { cfg->protocol = backends[i].protocol; break; } gppi(sesskey, "CloseOnExit", COE_NORMAL, &cfg->close_on_exit); gppi(sesskey, "WarnOnClose", 1, &cfg->warn_on_close); { /* This is two values for backward compatibility with 0.50/0.51 */ int pingmin, pingsec; gppi(sesskey, "PingInterval", 0, &pingmin); gppi(sesskey, "PingIntervalSecs", 0, &pingsec); cfg->ping_interval = pingmin * 60 + pingsec; } gpps(sesskey, "TerminalType", "xterm", cfg->termtype, sizeof(cfg->termtype)); gpps(sesskey, "TerminalSpeed", "38400,38400", cfg->termspeed, sizeof(cfg->termspeed)); { char buf[2 * sizeof(cfg->environmt)], *p, *q; gpps p++; *q++ = '\0'; } *q = '\0'; } gpps(sesskey, "UserName", "", cfg->username, sizeof(cfg->username)); gpps(sesskey, "LocalUserName", "", cfg->localusername, sizeof(cfg->localusername)); gppi(sesskey, "NoPTY", 0, &cfg->nopty); gppi(sesskey, "Compression", 0, &cfg->compression); gppi(sesskey, "AgentFwd", 0, &cfg->agentfwd); { char cipher[10]; gpps(sesskey, "SshProt", 1, &cfg->sshprot); gppi(sesskey, "BuggyMAC", 0, &cfg->buggymac); gppi(sesskey, "AuthTIS", 0, &cfg->try_tis_auth); gpps(sesskey, "PublicKeyFile", "", cfg->keyfile, sizeof(cfg->keyfile)); gpps(sesskey, "RemoteCommand", "", cfg->remote_cmd, sizeof(cfg->remote_cmd)); gppi(sesskey, "RFCEnviron", 0, &cfg->rfc_environ); gppi(sesskey, "BackspaceIsDelete", 1, &cfg->bksp_is_delete); gppi(sesskey, "RXVTHomeEnd", 0, &cfg->rxvt_homeend); gppi(sesskey, "LinuxFunctionKeys", 0, &cfg->funky_type); gppi(sesskey, "NoApplicationKeys", 0, &cfg->no_applic_k); gppi(sesskey, "NoApplicationCursors", 0, &cfg->no_applic_c); gppi(sesskey, "ApplicationCursorKeys", 0, &cfg->app_cursor); gppi(sesskey, "ApplicationKeypad", 0, &cfg->app_keypad); gppi(sesskey, "NetHackKeypad", 0, &cfg->nethack_keypad); gppi(sesskey, "AltF4", 1, &cfg->alt_f4); gppi(sesskey, "AltSpace", 0, &cfg->alt_space); gppi(sesskey, "AltOnly", 0, &cfg->alt_only); gppi(sesskey, "ComposeKey", 0, &cfg->compose_key); gppi(sesskey, "CtrlAltKeys", 1, &cfg->ctrlaltkeys); gppi(sesskey, "LocalEcho", LD_BACKEND, &cfg->localecho); gppi(sesskey, "LocalEdit", LD_BACKEND, &cfg->localedit); gpps(sesskey, "Answerback", "PuTTY", cfg->answerback, sizeof(cfg->answerback)); gppi(sesskey, "AlwaysOnTop", 0, &cfg->alwaysontop); gppi(sesskey, "HideMousePtr", 0, &cfg->hide_mouseptr); gppi(sesskey, "SunkenEdge", 0, &cfg->sunken_edge); gppi(sesskey, "CurType", 0, &cfg->cursor_type); gppi(sesskey, "BlinkCur", 0, &cfg->blink_cur); gppi(sesskey, "Beep", 1, &cfg->beep); gpps(sesskey, "BellWaveFile", "", cfg->bell_wavefile, sizeof(cfg->bell_wavefile)); gppi(sesskey, "BellOverload", 1, &cfg->bellovl); gppi(sesskey, "BellOverloadN", 5, &cfg->bellovl_n); gppi(sesskey, "BellOverloadT", 2000, &cfg->bellovl_t); gppi(sesskey, "BellOverloadS", 5000, &cfg->bellovl_s); gppi(sesskey, "ScrollbackLines", 200, &cfg->savelines); gppi(sesskey, "DECOriginMode", 0, &cfg->dec_om); gppi(sesskey, "AutoWrapMode", 1, &cfg->wrap_mode); gppi(sesskey, "LFImpliesCR", 0, &cfg->lfhascr); gppi(sesskey, "WinNameAlways", 0, &cfg->win_name_always); gpps(sesskey, "WinTitle", "", cfg->wintitle, sizeof(cfg->wintitle)); gppi(sesskey, "TermWidth", 80, &cfg->width); gppi(sesskey, "TermHeight", 24, &cfg->height); gpps(sesskey, "Font", "Courier", cfg->font, sizeof(cfg->font)); gppi(sesskey, "FontIsBold", 0, &cfg->fontisbold); gppi(sesskey, "FontCharSet", ANSI_CHARSET, &cfg->fontcharset); gppi(sesskey, "FontHeight", 10, &cfg->fontheight); if (cfg->fontheight < 0) { int oldh, newh; HDC hdc = GetDC(NULL); int logpix = GetDeviceCaps(hdc, LOGPIXELSY); ReleaseDC(NULL, hdc); oldh = -cfg->fontheight; newh = MulDiv(oldh, 72, logpix) + 1; if (MulDiv(newh, logpix, 72) > oldh) newh--; cfg->fontheight = newh; } gppi(sesskey, "FontVTMode", VT_OEMANSI, (int *) &cfg->vtmode); gppi(sesskey, "TryPalette", 0, &cfg->try_palette); gppi(sesskey, "BoldAsColour", 1, &cfg->bold_colour); for (i = 0; i < (sesskey, buf, defaults[i], buf2, sizeof(buf2)); if (sesskey, "RawCNP", 0, &cfg->rawcnp); gppi(sesskey, "MouseIsXterm", 0, &cfg->mouse_is_xterm); for (i = 0; i < 256; i += (sesskey, buf, defaults[i / 32], buf2, sizeof(buf2)); p = buf2; for (j = i; j < i + 32; j++) { char *q = p; while (*p && *p != ',') p++; if (*p == ',') *p++ = '\0'; cfg->wordness[j] = atoi(q); } } gppi(sesskey, "KoiWinXlat", 0, &cfg->xlat_enablekoiwin); gppi(sesskey, "88592Xlat", 0, &cfg->xlat_88592w1250); gppi(sesskey, "88592-CP852", 0, &cfg->xlat_88592cp852); gppi(sesskey, "CapsLockCyr", 0, &cfg->xlat_capslockcyr); gppi(sesskey, "ScrollBar", 1, &cfg->scrollbar); gppi(sesskey, "ScrollOnKey", 0, &cfg->scroll_on_key); gppi(sesskey, "ScrollOnDisp", 1, &cfg->scroll_on_disp); gppi(sesskey, "LockSize", 0, &cfg->locksize); gppi(sesskey, "BCE", 0, &cfg->bce); gppi(sesskey, "BlinkText", 0, &cfg->blinktext); gppi(sesskey, "X11Forward", 0, &cfg->x11_forward); gpps(sesskey, "X11Display", "localhost:0", cfg->x11_display, sizeof(cfg->x11_display)); close_settings_r(sesskey); } void do_defaults(char *session, Config * cfg) { if (session) load_settings(session, TRUE, cfg); else load_settings("Default Settings", FALSE, cfg); } static int sessioncmp(const void *av, const void *bv) { const char *a = *(const char *const *) av; const char *b = *(const char *const *) return -1; /* a comes first */ if (!strcmp(b, "Default Settings")) return +1; /* b comes first */ return strcmp(a, b); /* otherwise, compare normally */ } void get_sesslist(int allocate) if ((handle = enum_settings_start()) == NULL) return; buflen = bufsize = 0; buffer = NULL; do { ret = enum_settings_next(handle, otherbuf, sizeof(otherbuf)); if (ret) { int len = strlen(otherbuf) + 1; if (bufsize < buflen + len) { bufsize = buflen + len + 2048; buffer = srealloc(buffer, bufsize); } strcpy(buffer + buflen, otherbuf); buflen += strlen(buffer + buflen) + 1; } } while (ret); enum_settings_finish(handle); buffer = srealloc(buffer, buflen + if (strcmp(p, "Default Settings")) nsessions++; while (*p) p++; p++; } sessions = smalloc((nsessions + 1) * sizeof(char *)); sessions[0] = "Default Settings"; p = buffer; i = 1; while (*p) { p++; p++; } qsort(sessions, i, sizeof(char *), sessioncmp); } else { sfree(buffer); sfree Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 57c4a9d25b89d42114687be6b4f3a6df Text-delta-base-sha1: 03722c0889e764ff8532942955c498bdba2b1602 Text-content-length: 1468 Text-content-md5: 28cfd7b8f7cfe5b782a89c89e17cbe17 Text-content-sha1: 18c73d24a7d4ac7ccc486e9fada62cf4eddd1b8e Content-length: 1507 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN< gH>ig\iaO&guTIn6 %]2zUdz}_QNAQNtC]q>n0?4^tvVMB KnSw6q+qZ?iwZ? ;Z? I?Z?KlZ?)Z?m/ { if (pkt->maxlen < length) { { pkt->length += len; sftp_pkt_ensure(pkt, pkt->length); memcpy(pkt->data + pkt->length - { sftp_pkt_adddata(pkt, &byte, 1); } static struct sftp_packet *sftp_pkt_init(int pkt_type) { sftp_pkt_adddata(pkt, &value, 1); } static void sftp_pkt_adduint32(struct sftp_packet *pkt, unsigned long value) { unsigned char x[8]; PUT_32BIT(x, value.hi); PUT_32BIT(x + { sftp_pkt_adddata(pkt, data, len); PUT_32BIT(pkt->data + pkt->savedpos - 4, { unsigned char value; if (pkt->length - pkt->savedpos < 1) return 0; { unsigned long value; if (pkt->length - pkt->savedpos < 4) return 0; + { *p = NULL; if (pkt->length - pkt->savedpos < 4) return; *length = GET_32BIT(pkt->data + pkt->savedpos); pkt->savedpos += 4; if (pkt->length - pkt->savedpos < *length) return; *p = pkt->data + { if (pkt->data) { char *p = smalloc(len + / sizeof(*messages)) { return fxp_error_message; } int fxp_error_type(void) { return fxp_errtype; } /* * Perform exchange of init/version packets. Return 0 on failure. */ int fxp_init(void) int len) int len) Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dbf5080ab9ed033d7873e9a45ae4ba99 Text-delta-base-sha1: 3ff731d86b190cb08805e2a510322bb5963596c6 Text-content-length: 1570 Text-content-md5: 2876bb6b4b2a0ece6c2ef9c6f3dd173c Text-content-sha1: f8f0804d6c4cfd92bdab4a9aebc07683705da03b Content-length: 1609 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN^~q- <@E /* 0x1 */ #define SSH_FXP_VERSION 2 /* 0x2 */ #define SSH_FXP_OPEN 3 /* 0x3 */ #define SSH_FXP_CLOSE 4 /* 0x4 */ #define SSH_FXP_READ 5 /* 0x5 */ #define SSH_FXP_WRITE 6 /* 0x6 */ #define SSH_FXP_LSTAT 7 /* 0x7 */ #define SSH_FXP_FSTAT 8 /* 0x8 */ #define SSH_FXP_SETSTAT 9 /* 0x9 */ #define SSH_FXP_FSETSTAT 10 /* 0xa */ #define SSH_FXP_OPENDIR 11 /* 0xb */ #define SSH_FXP_READDIR 12 /* 0xc */ #define SSH_FXP_REMOVE 13 /* 0xd */ #define SSH_FXP_MKDIR 14 /* 0xe */ #define SSH_FXP_RMDIR 15 /* 0xf */ #define SSH_FXP_REALPATH 16 /* 0x10 */ #define SSH_FXP_STAT 17 /* 0x11 */ #define SSH_FXP_RENAME 18 /* 0x12 */ #define SSH_FXP_STATUS 101 /* 0x65 */ #define SSH_FXP_HANDLE 102 /* 0x66 */ #define SSH_FXP_DATA 103 /* 0x67 */ #define SSH_FXP_NAME 104 /* 0x68 */ #define SSH_FXP_ATTRS 105 /* 0x69 */ #define SSH_FXP_EXTENDED 200 /* 0xc8 */ #define SSH_FXP_EXTENDED_REPLY 201 Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a56daeb4b2174edc644eac23df2fe9bd Text-delta-base-sha1: 6d2e04b718c132d1d6d0756a2afec0fe542b2ce3 Text-content-length: 3154 Text-content-md5: 06a854f75d90240fd567db814b6f1c08 Text-content-sha1: 30dcd0e46699a6df3ee9710045b6e8ac23f50894 Content-length: 3194 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNT{,1 XlF=\4 WPARAM wParam, LPARAM lParam) { switch (nMsg) { case WM_ERASEBKGND: return TRUE; case WM_PAINT: { HBRUSH hbr; HGDIOBJ holdbr; RECT cr; int wtlen; LPTSTR wt; HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); SelectObject(hdc, tip_font); SelectObject(hdc, GetStockObject(BLACK_PEN)); hbr = CreateSolidBrush(tip_bg); holdbr = SelectObject(hdc, hbr); GetClientRect(hWnd, &cr); Rectangle(hdc, cr.left, cr.top, cr.right, cr.bottom); wtlen = GetWindowTextLength(hWnd); wt = (LPTSTR) smalloc((wtlen + 1) * sizeof(TCHAR)); GetWindowText(hWnd, wt, wtlen + 1); SetTextColor(hdc, tip_text); SetBkColor(hdc, tip_bg); TextOut(hdc, cr.left + 3, cr.top + 3, wt, wtlen); sfree(wt); SelectObject(hdc, holdbr); DeleteObject(hbr); EndPaint(hWnd, &ps); } return 0; case WM_NCHITTEST: return HTTRANSPARENT; case WM_DESTROY: DeleteObject(tip_font); tip_font = NULL; break; case WM_SETTEXT: { LPCTSTR str = (LPCTSTR) lParam; SIZE sz; HDC hdc = CreateCompatibleDC(NULL); SelectObject(hdc, tip_font); GetTextExtentPoint32(hdc, str, _tcslen(str), &sz); SetWindowPos(hWnd, NULL, 0, 0, sz.cx + 6, sz.cy + 6, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); InvalidateRect(hWnd, NULL, FALSE); DeleteDC(hdc); } return; if (!tip_wnd) { NONCLIENTMETRICS nci; /* First make sure the window class is registered */ if (!tip_class) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = SizeTipWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hinst; wc.hIcon = NULL; wc.hCursor = NULL; wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = "SizeTipClass"; tip_class = RegisterClass(&wc); } #if 0 /* Default values based on Windows Standard color scheme */ tip_font = GetStockObject(SYSTEM_FONT); tip_bg = RGB(255, 255, 225); tip_text = RGB(0, 0, 0); #endif /* Prepare other GDI objects and drawing info */ tip_bg = GetSysColor(COLOR_INFOBK); tip_text = GetSysColor(COLOR_INFOTEXT); memset(&nci, 0, sizeof(NONCLIENTMETRICS)); nci.cbSize = sizeof(NONCLIENTMETRICS); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &nci, 0); HDC hdc; SIZE sz; RECT wr; int ix, iy; /* calculate the tip's size */ hdc = CreateCompatibleDC(NULL); GetTextExtentPoint32(hdc, str, _tcslen(str), &sz); DeleteDC(hdc); GetWindowRect(src, &wr); ix = wr.left; if (ix < 16) ix = 16; iy = wr.top - sz.cy; if (iy < 16) iy = 16; /* Create the tip window */ tip_wnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, MAKEINTRESOURCE(tip_class), str, WS_POPUP, ix, iy, sz.cx, sz.cy, NULL, NULL, hinst, NULL); ShowWindow(tip_wnd, SW_SHOWNOACTIVATE); } else { /* Tip already exists, just set the text */ SetWindowText(tip_wnd, str); } } void EnableSizeTip(int bEnable) { if (tip_wnd && !bEnable) { DestroyWindow(tip_wnd); Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a02324b7d0cf15c5459c42556bcec313 Text-delta-base-sha1: e757f17734d9adfcc64ec7930be50d674f389b4f Text-content-length: 70551 Text-content-md5: 790dc44507e9fcfbbea1cc6ab6731272 Text-content-sha1: 04d4a320b1066f522c33182e24df67fcce26e230 Content-length: 70592 K 15 cvs2svn:cvs-rev V 5 1.141 PROPS-END SVN={H+{U- hzI}V|!z8JD pJ5Ml'#v"THzfB)!Qc"M6ovy?QW${Z)uJYu`VV-F:/:EK F&tBu]K`p,K=yKLey1U2WU-2_ }tsr6f5<{u`SjCXr9Kokh[z-ptZtC?1(Gdw5\\}O%EmI.qMVty{>r:]-dTuVu&t&`M|]Px5gm7] ;iJ?F QsGLSOz5;k[;S:Bhdjo5 ~shM|`xy; vEZHX75Swb#h eAq'y *Rj1rq) pG)V&2:`S"d+|_.C\l>*w#)Tt]u S0qQ(>vX'hIM&DdF/6;@FCIz*36zz@2 ]-0  `zbj/bw2wX23To =(f~HzF*j?oHklR?@<@vRKSU|/Q} /* 0x1 */ #define SSH1_SMSG_PUBLIC_KEY 2 /* 0x2 */ #define SSH1_CMSG_SESSION_KEY 3 /* 0x3 */ #define SSH1_CMSG_USER 4 /* 0x4 */ #define SSH1_CMSG_AUTH_RSA 6 /* 0x6 */ #define SSH1_SMSG_AUTH_RSA_CHALLENGE 7 /* 0x7 */ #define SSH1_CMSG_AUTH_RSA_RESPONSE 8 /* 0x8 */ #define SSH1_CMSG_AUTH_PASSWORD 9 /* 0x9 */ #define SSH1_CMSG_REQUEST_PTY 10 /* 0xa */ #define SSH1_CMSG_WINDOW_SIZE 11 /* 0xb */ #define SSH1_CMSG_EXEC_SHELL 12 /* 0xc */ #define SSH1_CMSG_EXEC_CMD 13 /* 0xd */ #define SSH1_SMSG_SUCCESS 14 /* 0xe */ #define SSH1_SMSG_FAILURE 15 /* 0xf */ #define SSH1_CMSG_STDIN_DATA 16 /* 0x10 */ #define SSH1_SMSG_STDOUT_DATA 17 /* 0x11 */ #define SSH1_SMSG_STDERR_DATA 18 /* 0x12 */ #define SSH1_CMSG_EOF 19 /* 0x13 */ #define SSH1_SMSG_EXIT_STATUS 20 /* 0x14 */ #define SSH1_MSG_CHANNEL_OPEN_CONFIRMATION 21 /* 0x15 */ #define SSH1_MSG_CHANNEL_OPEN_FAILURE 22 /* 0x16 */ #define SSH1_MSG_CHANNEL_DATA 23 /* 0x17 */ #define SSH1_MSG_CHANNEL_CLOSE 24 /* 0x18 */ #define SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION 25 /* 0x19 */ #define SSH1_SMSG_X11_OPEN 27 /* 0x1b */ #define SSH1_CMSG_PORT_FORWARD_REQUEST 28 /* 0x1c */ #define SSH1_MSG_PORT_OPEN 29 /* 0x1d */ #define SSH1_CMSG_AGENT_REQUEST_FORWARDING 30 /* 0x1e */ #define SSH1_SMSG_AGENT_OPEN 31 /* 0x1f */ #define SSH1_MSG_IGNORE 32 /* 0x20 */ #define SSH1_CMSG_EXIT_CONFIRMATION 33 /* 0x21 */ #define SSH1_CMSG_X11_REQUEST_FORWARDING 34 /* 0x22 */ #define SSH1_CMSG_AUTH_RHOSTS_RSA 35 /* 0x23 */ #define SSH1_MSG_DEBUG 36 /* 0x24 */ #define SSH1_CMSG_REQUEST_COMPRESSION 37 /* 0x25 */ #define SSH1_CMSG_AUTH_TIS 39 /* 0x27 */ #define SSH1_SMSG_AUTH_TIS_CHALLENGE 40 /* 0x28 */ #define SSH1_CMSG_AUTH_TIS_RESPONSE 41 /* 0x29 */ #define SSH1_CMSG_AUTH_CCARD 70 /* 0x46 */ #define SSH1_SMSG_AUTH_CCARD_CHALLENGE 71 /* 0x47 */ #define SSH1_CMSG_AUTH_CCARD_RESPONSE 72 /* 0x48 */ #define SSH1_AUTH_TIS 5 /* 0x5 */ #define SSH1_AUTH_CCARD 16 /* 0x10 */ #define SSH1_PROTOFLAG_SCREEN_NUMBER 1 /* 0x1 */ #define SSH2_MSG_DISCONNECT 1 /* 0x1 */ #define SSH2_MSG_IGNORE 2 /* 0x2 */ #define SSH2_MSG_UNIMPLEMENTED 3 /* 0x3 */ #define SSH2_MSG_DEBUG 4 /* 0x4 */ #define SSH2_MSG_SERVICE_REQUEST 5 /* 0x5 */ #define SSH2_MSG_SERVICE_ACCEPT 6 /* 0x6 */ #define SSH2_MSG_KEXINIT 20 /* 0x14 */ #define SSH2_MSG_NEWKEYS 21 /* 0x15 */ #define SSH2_MSG_KEXDH_INIT 30 /* 0x1e */ #define SSH2_MSG_KEXDH_REPLY 31 /* 0x1f */ #define SSH2_MSG_KEX_DH_GEX_REQUEST 30 /* 0x1e */ #define SSH2_MSG_KEX_DH_GEX_GROUP 31 /* 0x1f */ #define SSH2_MSG_KEX_DH_GEX_INIT 32 /* 0x20 */ #define SSH2_MSG_KEX_DH_GEX_REPLY 33 /* 0x21 */ #define SSH2_MSG_USERAUTH_REQUEST 50 /* 0x32 */ #define SSH2_MSG_USERAUTH_FAILURE 51 /* 0x33 */ #define SSH2_MSG_USERAUTH_SUCCESS 52 /* 0x34 */ #define SSH2_MSG_USERAUTH_BANNER 53 /* 0x35 */ #define SSH2_MSG_USERAUTH_PK_OK 60 /* 0x3c */ #define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60 /* 0x3c */ #define SSH2_MSG_GLOBAL_REQUEST 80 /* 0x50 */ #define SSH2_MSG_REQUEST_SUCCESS 81 /* 0x51 */ #define SSH2_MSG_REQUEST_FAILURE 82 /* 0x52 */ #define SSH2_MSG_CHANNEL_OPEN 90 /* 0x5a */ #define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91 /* 0x5b */ #define SSH2_MSG_CHANNEL_OPEN_FAILURE 92 /* 0x5c */ #define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93 /* 0x5d */ #define SSH2_MSG_CHANNEL_DATA 94 /* 0x5e */ #define SSH2_MSG_CHANNEL_EXTENDED_DATA 95 /* 0x5f */ #define SSH2_MSG_CHANNEL_EOF 96 /* 0x60 */ #define SSH2_MSG_CHANNEL_CLOSE 97 /* 0x61 */ #define SSH2_MSG_CHANNEL_REQUEST 98 /* 0x62 */ #define SSH2_MSG_CHANNEL_SUCCESS 99 /* 0x63 */ #define SSH2_MSG_CHANNEL_FAILURE 100 /* 0x64 */ #define SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1 /* 0x1 */ #define SSH2_DISCONNECT_PROTOCOL_ERROR 2 /* 0x2 */ #define SSH2_DISCONNECT_KEY_EXCHANGE_FAILED 3 /* 0x3 */ #define SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED 4 /* 0x4 */ #define SSH2_DISCONNECT_MAC_ERROR 5 /* 0x5 */ #define SSH2_DISCONNECT_COMPRESSION_ERROR 6 /* 0x6 */ #define SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE 7 /* 0x7 */ #define SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8 /* 0x8 */ #define SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9 /* 0x9 */ #define SSH2_DISCONNECT_CONNECTION_LOST 10 /* 0xa */ #define SSH2_DISCONNECT_BY_APPLICATION 11 /* 0xb */ #define SSH2_DISCONNECT_TOO_MANY_CONNECTIONS 12 /* 0xc */ #define SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER 13 /* 0xd */ #define SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14 /* 0xe */ #define SSH2_DISCONNECT_ILLEGAL_USER_NAME 15 /* 0x1 */ #define SSH2_OPEN_CONNECT_FAILED 2 /* 0x2 */ #define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE 3 /* 0x3 */ #define SSH2_OPEN_RESOURCE_SHORTAGE 4 /* 0x4 */ #define SSH2_EXTENDED_DATA_STDERR 1 (Socket *, char *, void *); extern void x11_close(Socket); extern void x11_send(Socket { } static void nullmac_generate(unsigned char *blk, int len, unsigned long seq) { } static int nullmac_verify(unsigned char *blk, int len, unsigned long seq) { return 1; }; const static struct ssh_mac *buggymacs[] = { &ssh_sha1_buggy, &ssh_md5, &ssh_mac_none }; static void ssh_comp_none_init(void) { { return 0; } static int ssh_comp_none_disable(void) { return 0; }; enum { unsigned char *outbuffer; unsigned outbuflen, outbufsize; unsigned remwindow, remmaxpkt; } v2; union { struct ssh_agent_channel { unsigned char *message; unsigned char msglen[4]; int lensofar, totallen; } a; struct ssh_x11_channel { Socket s; (const char *prompt, char *str, int maxlen, int len); static int (*s_rdpkt) { struct ssh_channel *a = (struct ssh_channel *) av; struct ssh_channel *b = (struct ssh_channel *) bv; if (a->localid < b->localid) return -1; if (a->localid > b->localid) return +1; return 0; } static int ssh_channelfind(void *av, void *bv) { unsigned *a = (unsigned *) av; struct ssh_channel *b = (struct ssh_channel *) bv; if (*a < b->localid) return -1; if (*a > b->localid) return +1; return 0; } static int alloc_channel_id(void) (char *buf, int len) { if ((flags & FLAG_STDERR)) { int i; for (i = 0; i < len; i++) if (buf[i] != '\r') { int i; for (i = 0; i < len; i++) { if (buf[i] == '\n') c_write("\r\n", 2); else if ((buf[i] & 0x60) || (buf[i] == '\r')) c_write(buf + i, 1); } } static void c_write_str(char *buf) - /* "Remo"te server has closed ... */ st->len = 0x300; + APIEXTRA) : srealloc(pktin.data, st->biglen + - 4); st->gotcrc = GET_32BIT(pktin.data + st->biglen - - 1, pktin.length + 1); #endif zlib_decompress_block(pktin.body - 1, pktin.length + + APIEXTRA); pktin.body = pktin.data + st->pad + 1; if (!pktin.data) fatalbox("Out of memory"); } memcpy(pktin.body - - 1; #ifdef DUMP_PACKETS debug(("Packet payload post-decompression:\n")); dmemdump(pktin.body - 1, pktin.length + 1); #endif } if (pktin.type == SSH1_SMSG_STDOUT_DATA || pktin.type == SSH1_SMSG_STDERR_DATA || pktin.type == SSH1_MSG_DEBUG || pktin.type == SSH1_SMSG_AUTH_TIS_CHALLENGE || crReturn(0); strlen = 70; memcpy(buf + 8, pktin.body + 4, strlen); buf[8 + - nowlen - 1) msglen = sizeof(buf) - nowlen - 1; memcpy(buf + nowlen, pktin.body + 4, msglen); buf[nowlen + next_packet: pktin.type = 0; pktin.length = 0; if (sccipher) st->cipherblk = sccipher->blksize; else st->cipherblk = 8; if (st->cipherblk < 8) st->cipherblk = 8; if (pktin.maxlen < st->cipherblk) { pktin.maxlen = st->cipherblk; pktin.data = (pktin.data == NULL ? smalloc(st->cipherblk + APIEXTRA) : srealloc(pktin.data, st->cipherblk + - st->i); pktin.data[st->i] = *(*data)++; (*datalen)--; } #ifdef FWHACK if (!memcmp(pktin.data, "Remo", 4)) { /* "Remo"te server has closed ... */ /* FIXME */ } #endif if (sccipher) + st->maclen) { pktin.maxlen = st->packetlen + st->maclen; pktin.data = (pktin.data == NULL ? smalloc(pktin.maxlen + APIEXTRA) : srealloc(pktin.data, pktin.maxlen + sccipher->decrypt(pktin.data + st->cipherblk, && !scmac->verify(pktin.data, st->len + 4, st->incoming_sequence)) { bombout(("Incorrect MAC received on packet")); crReturn(0); } st->incoming_sequence++; + 5, pktin.length - 5, &newpayload, &newlen)) { if (pktin.maxlen < newlen + 5) { pktin.maxlen = newlen + 5; pktin.data = (pktin.data == NULL ? smalloc(pktin.maxlen + APIEXTRA) : srealloc(pktin.data, pktin.maxlen + + + goto next_packet; + 6); unsigned msglen = GET_32BIT(pktin.data + - nowlen - 1) msglen = sizeof(buf) - nowlen - 1; memcpy(buf + nowlen, pktin.data + 14, msglen); buf[nowlen + { int pad, biglen; len += 5; /* type and CRC */ pad = 8 - (len % 8); biglen = len + pad; pktout.length = len - + 12) : srealloc(pktout.data, biglen + 12)); #else pktout.data = (pktout.data == NULL ? smalloc(biglen + 4) : srealloc(pktout.data, biglen + 4)); #endif if (!pktout.data) fatalbox("Out of memory"); } pktout.body = pktout.data + 4 + pad + 1; } static void s_wrpkt_start(int type, int len) - 1, pktout.length + - 1, pktout.length + 1, &compblk, &complen); ssh1_pktout_size(complen - 1); memcpy(pktout.body - - 1, pktout.length + % 8); biglen = len + pad; for (i = 0; i < pad; i++) pktout.data[i + 4] = random_byte(); crc = crc32(pktout.data + 4, biglen - 4); PUT_32BIT(pktout.data + + 4)); dmemdump(pktout.data, biglen + 4); #endif if (cipher) cipher->encrypt(pktout.data + 4, biglen); return biglen + 4; } static void s_wrpkt(void) { int len; len = s_wrpkt_prepare(); sk_write(s, pktout.data, len); } static void s_wrpkt_defer(void) deferred_size = deferred_len + len + 128; deferred_send_data = srealloc(deferred_send_data, deferred_size); } memcpy(deferred_send_data + _defer(); } static int ssh_versioncmp(char *a, char *b) return (av < bv ? -1 : +1); if (*ae == '.') ae++; if (*be == '.') be++; av = strtoul(ae, &ae, 10); bv = strtoul(be, &be, 10); if (av != bv) s, void *str, int len) s, unsigned i) { if (pktout.maxlen < length) { pktout.maxlen = length + 256; pktout.data = (pktout.data == NULL ? smalloc(pktout.maxlen + APIEXTRA) : srealloc(pktout.data, pktout.maxlen + APIEXTRA)); if (!pktout.data) fatalbox("Out of memory"); } } static void ssh2_pkt_adddata(void *data, int len) + pktout.length - len, data, len); } static void ssh2_pkt_addbyte(unsigned char byte) { ssh2_pkt_adddata(&byte, 1); } static void ssh2_pkt_init(int pkt_type) { pktout.length = 5; ssh2_pkt_addbyte((unsigned char) pkt_type); } static void ssh2_pkt_addbool(unsigned char value) { ssh2_pkt_adddata(&value, 1); } static void ssh2_pkt_adduint32(unsigned long value) pktout.length - pktout.savedpos); } static void ssh2_pkt_addstring_data(char *data, int len) pktout.length - pktout.savedpos); } static void ssh2_pkt_addstring(char *data) { unsigned char *p; int i, n = (bignum_bitcount(b) + 7) / 8; p = smalloc(n + 1); if (!p) fatalbox("out of memory"); p[0] = 0; for (i = 1; i <= n; i++) p[i] = bignum_byte(b, n - i); i = 0; while (i <= n && p[i] == 0 && (p[i + 1] & 0x80) == 0) i++; memmove(p, p + i, n + 1 - i); *len = n + 1 - i; return p; } static void ssh2_pkt_addmp(Bignum b) + 5, pktout.length - 5); #endif { unsigned char *newpayload; int newlen; if (cscomp && cscomp->compress(pktout.data + 5, pktout.length - /* block size */ cipherblk = cipherblk < 8 ? 8 : cipherblk; /* or 8 if blksize < 8 */ padding = 4; padding += csmac->generate(pktout.data, pktout.length + padding, outgoing_sequence); outgoing_sequence++; + padding)); dmemdump(pktout.data, pktout.length + padding); #endif if (cscipher) { int len = ssh2_pkt_construct(); if (deferred_len + len > deferred_size) { deferred_size = deferred_len + len + 128; deferred_send_data = srealloc(deferred_send_data, deferred_size); } memcpy(deferred_send_data + debug((" %02x", p[i])); debug(("\n")); sfree(p); } #endif static void sha_mpint(SHA_State * s, Bignum b) { unsigned long value; if (pktin.length - pktin.savedpos < 4) return 0; + pktin.savedpos); pktin.savedpos += 4; return value; } static int ssh2_pkt_getbool(void) { unsigned long value; if (pktin.length - pktin.savedpos < 1) return 0; { *p = NULL; if (pktin.length - pktin.savedpos < 4) return; *length = GET_32BIT(pktin.data + return; *p = pktin.data + { char *p; int length; Bignum b; ssh2_pkt_getstring(&p, &length); if (!p) return NULL; if (p[0] & 0x80) { bombout(("internal error: Can't handle negative mpints")); { char *imp; imp++; imp += strcspn(imp, "-"); if (*imp) imp++; ssh_remote_bugs = 0; if (!strcmp(imp, "1.2.18") || !strcmp(imp, "1.2.19") || !strcmp(imp, "1.2.20") || !strcmp(imp, "1.2.21") || !strcmp(imp, "1.2.22")) { /* * These versions don't support SSH1_MSG_IGNORE, so we have * to use a different defence against password length * sniffing. */ ssh_remote_bugs |= BUG_CHOKES_ON_SSH1_IGNORE; !strncmp(imp, "2.2.0", 5) || !strncmp(imp, "2.3.0", 5) || !strncmp(imp, "2.1 ", 4)) { /* * These versions have the HMAC bug. */ ssh_remote_bugs |= BUG_SSH2_HMAC; logevent("We believe remote version has SSH2 HMAC bug"); } } static int do_ssh_init(unsigned char c) i = transS[i]; else if (c == 'H') i = transH[i]; else if (c == '-') i = transminus[i]; else - 1) { vstrsize += 16; vstring = srealloc(vstring, vstrsize); } - 1) version[i++] = c; } /* * This is a v2 server. Begin v2 protocol. */ char verstring[80], vlog[100]; sprintf(verstring, "SSH-2.0-%s", sshver); SHA_Init(&exhashbase); /* * Hash our version string and their version string. */ sha_string(&exhashbase, verstring, strlen(verstring)); sha_string(&exhashbase, vstring, strcspn(vstring, "\r\n")); sprintf(vlog, "We claim version: %s", verstring); logevent(vlog); strcat(verstring, "\n"); logevent("Using SSH protocol version 2"); sk_write(s, verstring, strlen(verstring)); ssh_protocol = ssh2_protocol; ssh_version = 2; s_rdpkt = ssh2_rdpkt; } else { /* * This is a v1 server. Begin v1 protocol. */ char verstring[80], vlog[100]; sprintf(verstring, "SSH-%s-%s", (ssh_versioncmp(version, "1.5") <= 0 ? version : "1.5"), sshver); sprintf(vlog, "We claim version: %s", verstring); logevent(vlog); strcat(verstring, "\n"); logevent("Using SSH protocol version 1"); sk_write(s, verstring, strlen(verstring)); ssh_protocol = ssh1_protocol; ssh_version = 1; s_rdpkt(&data, &datalen) == 0(Plug plug, char *error_msg, int error_code, int calling_back) /* A socket error has occurred. */ connection_fatal { ssh_gotdata(data, len); if (ssh_state == SSH_STATE_CLOSED) { if (s) { sk_close(s); s = NULL; } + (err = sk_addr_error(addr))(err = sk_socket_error(s)) + 8, &servkey, &keystr1, 0); j = makekey(pktin.body + 8 + hostkey.comment = NULL; rsa_fingerprint(logmsg + strlen(logmsg), sizeof(logmsg) - strlen(logmsg), &hostkey); logevent(logmsg); } ssh1_remote_protoflags = GET_32BIT(pktin.body + 8 + i + j); supported_ciphers_mask = GET_32BIT(pktin.body + 12 + i + j); supported_auths_mask = GET_32BIT(pktin.body + 16 + i + j); ssh1_local_protoflags = = 0; i < /* * First format the key into a string. */ int len = rsastr_len(&hostkey); char fingerprint[100]; char *keystr = smalloc(len); if (!keystr) fatalbox("Out of memory"); rsastr_fmt(keystr, &hostkey); rsa_fingerprint(fingerprint, sizeof(fingerprint), &hostkey); verify_ssh_host_key(savedhost, savedport, "rsa", keystr, fingerprint); sfree(keystr); } for (i = 0; i < cipher_type = SSH_CIPHER_BLOWFISH; break; case CIPHER_DES: cipher_type = SSH_CIPHER_DES; break; case CIPHER_3DES: cipher_type = SSH_CIPHER_3DES; break; case CIPHER_AES: c_write_str("AES not supported in SSH1, falling back to 3DES\r\n"); cipher_type = SSH_CIPHER_3DES; break; } if ((supported_ciphers_mask & (1 << cipher_type)) == 0) { c_write_str logevent("Using 3DES encryption"); break; case SSH_CIPHER_DES: logevent("Using single-DES encryption"); break; case SSH_CIPHER_BLOWFISH: logevent("Using Blowfish encryption"); break; } send_packet(SSH1_CMSG_SESSION_KEY, PKT_CHAR, cipher_type, PKT_DATA, cookie, 8, PKT_CHAR, (len * 8) >> 8, PKT_CHAR, (len * 8) & 0xFF, PKT_DATA, rsabuf, len, PKT_INT, ssh1_local_protoflags, cipher_type == SSH_CIPHER_DES ? &ssh_des : if (ssh_get_line) { if (!ssh_get_line("login as: ", username, sizeof(username), FALSE)) { /* * get_line failed to get a username. * Terminate. */ logevent("No username provided. Abandoning session."); ssh_state = SSH_STATE_CLOSED; crReturn(1); } } else { c_write_str("login as: "); ssh_send_ok = 1; while (pos >= 0) { crWaitUntil(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: username[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) { c_write_str("\b \b"); pos--; } break; case 21: case 27: while (pos > 0) { c_write_str("\b \b"); pos--; } break; case 3: case 4: random_save_seed(); exit(0); break; default: if (((c >= ' ' && c <= '~') || ((unsigned char) c >= 160)) && pos < 40) { username[pos++] = c; c_write(&c, 1); } break; } } c_write_str("\r\n"); username[strcspn(username, "\n\r")] = '\0'; } + if (flags & FLAG_INTERACTIVE && (!((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)))) { strcat(userlog, "\r\n"); static int pwpkt_type; /* * Show password prompt, having first obtained it via a TIS * or CryptoCard exchange if we're doing TIS or CryptoCard * authentication. */ pwpkt_type = SSH1_CMSG_AUTH_PASSWORD; if (agent_exists()) { /* * Attempt RSA authentication using Pageant. */ static unsigned char request[5], *response, *p; static int responselen; static int i, nkeys; static int authed = FALSE; void *r; logevent("Pageant is running. Requesting keys."); /* Request the keys held by the agent. */ PUT_32BIT(request, 1); request[4] = SSH1_AGENTC_REQUEST_RSA_IDENTITIES; agent_query(request, 5, &r, &responselen); response = (unsigned char *) r; if (response && responselen >= 5 && response[4] == SSH1_AGENT_RSA_IDENTITIES_ANSWER) { p = response + 5; nkeys = GET_32BIT(p); p += 4; { char buf[64]; sprintf(buf, "Pageant has %d SSH1 keys", nkeys); logevent(buf); } for (i = 0; i < nkeys; i++) { static struct RSAKey key; static Bignum challenge; static char *commentp; static int commentlen; { char buf[64]; sprintf(buf, "Trying Pageant key #%d", i); logevent(buf); } p += 4; p += ssh1_read_bignum(p, &key.exponent); p += ssh1_read_bignum(p, &key.modulus); commentlen = GET_32BIT(p); p += 4; commentp = p; p += commentlen; send_packet(SSH1_CMSG_AUTH_RSA, PKT_BIGNUM, key.modulus, PKT_END); crWaitUntil(ispkt); if (pktin.type != SSH1_SMSG_AUTH_RSA_CHALLENGE) { logevent("Key refused"); continue; } logevent("Received RSA challenge"); ssh1_read_bignum(pktin.body, &challenge); { char *agentreq, *q, *ret; int len, retlen; len = 1 + 4; /* message type, bit count */ len += ssh1_bignum_length(key.exponent); len += ssh1_bignum_length(key.modulus); len += ssh1_bignum_length(challenge); len += 16; /* session id */ len += 4; /* response format */ agentreq = smalloc(4 + len); PUT_32BIT(agentreq, len); q = agentreq + 4; *q++ = SSH1_AGENTC_RSA_CHALLENGE; PUT_32BIT(q, bignum_bitcount(key.modulus)); q += 4; q += ssh1_write_bignum(q, key.exponent); q += ssh1_write_bignum(q, key.modulus); q += ssh1_write_bignum(q, challenge); memcpy(q, session_id, 16); q += 16; PUT_32BIT(q, 1); /* response format */ agent_query(agentreq, len + 4, &ret, &retlen); sfree(agentreq); if (ret) { if (ret[4] == SSH1_AGENT_RSA_RESPONSE) { logevent("Sending Pageant's response"); send_packet(SSH1_CMSG_AUTH_RSA_RESPONSE, PKT_DATA, ret + 5, 16, PKT_END); sfree(ret); crWaitUntil(ispkt); if (pktin.type == SSH1_SMSG_SUCCESS) { logevent ("Pageant's response accepted"); if (flags & FLAG_VERBOSE) { c_write_str ("Authenticated using RSA key \""); c_write(commentp, commentlen); c_write_str("\" from agent\r\n"); } authed = TRUE; } else logevent ("Pageant's response not accepted"); } else { logevent ("Pageant failed to answer challenge"); sfree(ret); } } else { logevent("No reply received from Pageant"); } } freebn(key.exponent); freebn(key.modulus); freebn(challenge); if (authed) break; } } if (authed) break; } if (*cfg.keyfile && !tried_publickey) pwpkt_type = SSH1_CMSG_AUTH_RSA; if (pktin.type == SSH1_SMSG_FAILURE && cfg.try_tis_auth && (supported_auths_mask & (1 << SSH1_AUTH_TIS))) { pwpkt_type = SSH1_CMSG_AUTH_TIS_RESPONSE; logevent("Requested TIS authentication"); send_packet(SSH1_CMSG_AUTH_TIS, PKT_END); crWaitUntil(ispkt); if (pktin.type != SSH1_SMSG_AUTH_TIS_CHALLENGE) { logevent("TIS authentication declined"); if (flags & FLAG_INTERACTIVE) c_write_str("TIS authentication refused.\r\n"); } else { int challengelen = ((pktin.body[0] << 24) | (pktin.body[1] << 16) | (pktin.body[2] << 8) | (pktin.body[3])); logevent("Received TIS challenge"); if (challengelen > sizeof(prompt) - 1) challengelen = sizeof(prompt) - 1; /* prevent overrun */ memcpy(prompt, pktin.body + 4, challengelen); prompt[challengelen] = '\0'; } } if (pktin.type == SSH1_SMSG_FAILURE && cfg.try_tis_auth && (supported_auths_mask & (1 << SSH1_AUTH_CCARD))) { pwpkt_type = SSH1_CMSG_AUTH_CCARD_RESPONSE; logevent("Requested CryptoCard authentication"); send_packet(SSH1_CMSG_AUTH_CCARD, PKT_END); crWaitUntil(ispkt); if (pktin.type != SSH1_SMSG_AUTH_CCARD_CHALLENGE) { logevent("CryptoCard authentication declined"); c_write_str("CryptoCard authentication refused.\r\n"); } else { int challengelen = ((pktin.body[0] << 24) | (pktin.body[1] << 16) | (pktin.body[2] << 8) | (pktin.body[3])); logevent("Received CryptoCard challenge"); if (challengelen > sizeof(prompt) - 1) challengelen = sizeof(prompt) - 1; /* prevent overrun */ memcpy(prompt, pktin.body + 4, challengelen); strncpy(prompt + challengelen, "\r\nResponse : ", sizeof(prompt) - challengelen); prompt[sizeof(prompt) - 1] = '\0'; } } if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { sprintf(prompt, "%.90s@%.90s's password: ", username, savedhost); } if (pwpkt_type == SSH1_CMSG_AUTH_RSA) { char *comment = NULL; if (flags & FLAG_VERBOSE) c_write_str("Trying public key authentication.\r\n"); if (!rsakey_encrypted(cfg.keyfile, &comment)) { if (flags & FLAG_VERBOSE) c_write_str("No passphrase required.\r\n"); goto tryauth; } sprintf(prompt, "Passphrase for key \"%.100s\": ", comment); sfree(comment); /* * get_line failed to get a password (for example * because one was supplied on the command line * which has already failed to work). Terminate. */ logevent("No more passwords to try"); ssh_state = SSH_STATE_CLOSED; crReturn(1); } } else { c_write_str(prompt); pos = 0; ssh_send_ok = 1; while (pos >= 0) { crWaitUntil(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: password[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) pos--; break; case 21: case 27: pos = 0; break; case 3: case 4: random_save_seed(); exit(0); break; default: if (((c >= ' ' && c <= '~') || ((unsigned char) c >= 160)) && pos < sizeof(password)) password[pos++] = c; break; } } c_write_str("\r\n"); } tryauth: if (pwpkt_type == SSH1_CMSG_AUTH_RSA) { /* * Try public key authentication with the specified * key file. */ static struct RSAKey pubkey; static Bignum challenge, response; static int i; static unsigned char buffer[32]; tried_publickey = 1; i = loadrsakey(cfg.keyfile, &pubkey, password); if (i == 0) { c_write_str("Couldn't load public key from "); c_write_str(cfg.keyfile); c_write_str(".\r\n"); continue; /* go and try password */ } if (i == -1) { c_write_str("Wrong passphrase.\r\n"); tried_publickey = 0; continue; /* try again */ } /* * Send a public key attempt. */ send_packet(SSH1_CMSG_AUTH_RSA, PKT_BIGNUM, pubkey.modulus, PKT_END); crWaitUntil(ispkt); if (pktin.type == SSH1_SMSG_FAILURE) { c_write_str("Server refused our public key.\r\n"); continue; /* go and try password */ } if (pktin.type != SSH1_SMSG_AUTH_RSA_CHALLENGE) { bombout(("Bizarre response to offer of public key")); crReturn(0); } ssh1_read_bignum(pktin.body, &challenge); response = rsadecrypt(challenge, &pubkey); freebn(pubkey.private_exponent); /* burn the evidence */ for (i = 0; i < 32; i++) { buffer[i] = bignum_byte(response, 31 - i); } MD5Init(&md5c); MD5Update(&md5c, buffer, 32); MD5Update(&md5c, session_id, 16); MD5Final(buffer, &md5c); send_packet(SSH1_CMSG_AUTH_RSA_RESPONSE, PKT_DATA, buffer, 16, PKT_END); crWaitUntil(ispkt); if (pktin.type == SSH1_SMSG_FAILURE) { if (flags & FLAG_VERBOSE) c_write_str ("Failed to authenticate with our public key.\r\n"); continue; /* go and try password */ } else if (pktin.type != SSH1_SMSG_SUCCESS) { bombout( ("Bizarre response to RSA authentication response")); crReturn(0); } break; /* we're through! */ } else { if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { /* * Defence against traffic analysis: we send a * whole bunch of packets containing strings of * different lengths. One of these strings is the * password, in a SSH1_CMSG_AUTH_PASSWORD packet. * The others are all random data in * SSH1_MSG_IGNORE packets. This way a passive * listener can't tell which is the password, and * hence can't deduce the password length. * * Anybody with a password length greater than 16 * bytes is going to have enough entropy in their * password that a listener won't find it _that_ * much help to know how long it is. So what we'll * do is: * * - if password length < 16, we send 15 packets * containing string lengths 1 through 15 * * - otherwise, we let N be the nearest multiple * of 8 below the password length, and send 8 * packets containing string lengths N through * N+7. This won't obscure the order of * magnitude of the password length, but it will * introduce a bit of extra uncertainty. * * A few servers (the old 1.2.18 through 1.2.22) * can't deal with SSH1_MSG_IGNORE. For these * servers, we need an alternative defence. We make * use of the fact that the password is interpreted * as a C string: so we can append a NUL, then some * random data. */ if (ssh_remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE) { char string[64]; char *s; int len; len = strlen(password); if (len < sizeof(string)) { s = string; strcpy(string, password); len++; /* cover the zero byte */ while (len < sizeof(string)) { string[len++] = (char) random_byte(); } } else { s = password; } send_packet(pwpkt_type, PKT_INT, len, PKT_DATA, s, len, PKT_END); } else { int bottom, top, pwlen, i; char *randomstr; pwlen = strlen(password); if (pwlen < 16) { bottom = 0; /* zero length passwords are OK! :-) */ top = 15; } else { bottom = pwlen & ~7; top = bottom + 7; } assert(pwlen >= bottom && pwlen <= top); randomstr = smalloc(top + 1); for (i = bottom; i <= top; i++) { if (i == pwlen) defer_packet(pwpkt_type, PKT_STR, password, PKT_END); else { for (j = 0; j < i; j++) { do { randomstr[j] = random_byte(); } while (randomstr[j] == '\0'); } randomstr[i] = '\0'; defer_packet(SSH1_MSG_IGNORE, PKT_STR, randomstr, PKT_END); } } ssh_pkt_defersend(); } } else { send_packet(pwpkt_type, PKT_STR, password, PKT_END); } if (flags & FLAG_VERBOSE) { if (c && !c->closes) { if (ssh_version == 1) { send_packet(SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid, PKT_END); } else { ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_send(); } c->closes = 1; if (c->type == CHAN_X11) { c->u.x11.s = NULL; logevent("X11 connection terminated"); } } } void sshfwd_write(struct ssh_channel *c, char *buf, int len) { if (ssh_version == 1) { send_packet(SSH1_MSG_CHANNEL_DATA, PKT_INT, c->remoteid, PKT_INT, len, PKT_DATA, buf, len, PKT_END); } else { ssh2_add_channel_data(c, buf, len); crReturnV; if (cfg.agentfwd && agent_exists()) { logevent("Requesting agent forwarding"); send_packet(SSH1_CMSG_AGENT_REQUEST_FORWARDING, PKT_END); do { crReturnV; } while (!ispkt); if (pktin.type != SSH1_SMSG_SUCCESS && pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crReturnV; } else if (pktin.type == SSH1_SMSG_FAILURE) { logevent("Agent forwarding refused"); } else { char proto[20], data[64]; logevent("Requesting X11 forwarding"); x11_invent_auth(proto, sizeof(proto), data, sizeof(data)); if (ssh1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) { send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKT_STR, data, PKT_INT, 0, PKT_END); } else { send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKT_STR, data, PKT_END); } do { crReturnV; } while (!ispkt); if (pktin.type != SSH1_SMSG_SUCCESS && pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crReturnV; } else if (pktin.type == SSH1_SMSG_FAILURE) { logevent("X11 forwarding refused"); } else { PKT_STR, cfg.termtype, PKT_INT, rows, PKT_INT, cols, PKT_INT, 0, PKT_INT, 0, PKT_CHAR, 0, PKT_END); ssh_state = SSH_STATE_INTERMED; do { crReturnV; } while (!ispkt); if (pktin.type != SSH1_SMSG_SUCCESS && pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crReturnV; } else if (pktin.type == SSH1_SMSG_FAILURE) { c_write_str("Server refused to allocate pty\r\n"); ssh_editing = ssh_echoing = 1; } logevent("Allocated pty"); } else { ssh_editing = ssh_echoing = 1; } if (cfg.compression) { send_packet(SSH1_CMSG_REQUEST_COMPRESSION, PKT_INT, 6, PKT_END); do { crReturnV; } while (!ispkt); if (pktin.type != SSH1_SMSG_SUCCESS && pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crReturnV; } else if (pktin.type == SSH1_SMSG_FAILURE) { c_write_str("Server refused to compress\r\n"); send_packet(SSH1_CMSG_EXEC_CMD, PKT_STR, cfg.remote_cmd_ptr, PKT_END); else ssh_special(TS_EOF); ldisc_send(NULL, 0); + 4, len); } else if (pktin.type == SSH1_MSG_DISCONNECT) { ssh_state = SSH_STATE_CLOSED; logevent("Received disconnect request"); crReturnV; } else if (pktin.type == SSH1_SMSG_X11_OPEN) { /* Remote side is trying to open a channel to talk to our * X-Server. Give them back a local channel number. */ x11_init(&c->u.x11.s, cfg.x11_display, c) != NULL) { logevent("opening X11 forward connection failed"); sfree(c); send_packet(SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(pktin.body), PKT_END); } else { logevent ("opening X11 forward connection succeeded"); c->remoteid = GET_32BIT(pktin.body); c->localid = alloc_channel_id(); c->closes = 0; c->type = CHAN_X11; /* identify channel type */ add234(ssh_channels, c); send_packet(SSH1_MSG_CHANNEL_OPEN_CONFIRMATION, PKT_INT, c->remoteid, PKT_INT, c->localid, PKT_END); logevent("Opened X11 forward channel"); } } } else if (pktin.type == SSH1_SMSG_AGENT_OPEN) { /* Remote side is trying to open a channel to talk to our * agent. Give them back a local channel number. */ /* Remote side closes a channel. */ unsigned i = GET_32BIT(pktin.body); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (c) { int closetype; closetype = (pktin.type == SSH1_MSG_CHANNEL_CLOSE ? 1 : 2); if (!(c->closes & closetype)) send_packet(pktin.type, PKT_INT, c->remoteid, PKT_END); if ((c->closes == 0) && (c->type == CHAN_X11)) { c->closes |= closetype; if (c->closes == 3) { del234(ssh_channels, c); sfree(c); } } } else if (pktin.type == SSH1_MSG_CHANNEL_DATA) { /* Data sent down one of our channels. */ int i = GET_32BIT(pktin.body); int len = GET_32BIT(pktin.body + 4); unsigned char *p = pktin.body + 8; struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (c) { switch (c->type) { case CHAN_X11: x11_send(c->u.x11.s, p, len); break; case CHAN_AGENT: /* Data for an agent message. Buffer it. */ while (len > 0) { if (c->u.a.lensofar < 4) { int l = min(4 - c->u.a.lensofar, len); memcpy(c->u.a.msglen + c->u.a.lensofar, p, l); p += l; len -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == 4) { c->u.a.totallen = 4 + GET_32BIT(c->u.a.msglen); c->u.a.message = smalloc(c->u.a.totallen); memcpy(c->u.a.message, c->u.a.msglen, 4); } if (c->u.a.lensofar >= 4 && len > 0) { int l = min(c->u.a.totallen - c->u.a.lensofar, len); memcpy(c->u.a.message + c->u.a.lensofar, p, l); p += l; len -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == c->u.a.totallen) { void *reply, *sentreply; int replylen; agent_query(c->u.a.message, c->u.a.totallen, &reply, &replylen); if (reply) sentreply = reply; else { /* Fake SSH_AGENT_FAILURE. */ sentreply = "\0\0\0\1\5"; replylen = 5; } send_packet(SSH1_MSG_CHANNEL_DATA, PKT_INT, c->remoteid, PKT_INT, replylen, PKT_DATA, sentreply, replylen, PKT_END); if (reply) sfree(reply); sfree(c->u.a.message); c->u.a.lensofar = 0; } } break; } } { int needlen = strlen(needle); while (1) { /* * Is it at the start of the string? */ if (haylen >= needlen && /* haystack is long enough */ !memcmp(needle, haystack, needlen) && /* initial match */ (haylen == needlen || haystack[needlen] == ',') /* either , or EOS follows */ ) return 1; /* * If not, search for the next comma and resume after that. * If no comma found, terminate. */ while (haylen > 0 && *haystack != ',') haylen--, haystack++; if (haylen == 0) return 0; haylen--, haystack++; char *keyspace) + preferred_cipher = &ssh2_blowfish; } else if (cfg.cipher == CIPHER_DES) { logevent("Single DES not supported in SSH2; using 3DES"); preferred_cipher = &ssh2_3des; } else if (cfg.cipher == CIPHER_3DES) { preferred_cipher = &ssh2_3des; } else if (cfg.cipher == CIPHER_AES) { preferred_cipher = &ssh2_aes; } else { /* Shouldn't happen, but we do want to initialise to _something_. */ maclist = buggymacs, nmacs = lenof(buggymacs); else maclist = macs, nmacs = lenof(macs); ssh2_pkt_addbyte((unsigned char) ssh2_pkt_addstring_str(kex_algs[i]->name); if (i < lenof(kex_algs) - 1) ssh2_pkt_addstring_str(hostkey_algs[i]->name); if (i < lenof(hostkey_algs) - 1) + 1; i++) { const struct ssh2_ciphers *c = i == 0 ? preferred_cipher : ciphers[i - 1]; for (j = 0; j < c->nciphers; j++) { ssh2_pkt_addstring_str(c->list[j]->name); if (i < lenof(ciphers) || j < c->nciphers - 1) ssh2_pkt_addstring_str(","); + 1; i++) { const struct ssh2_ciphers *c = i == 0 ? preferred_cipher : ciphers[i - 1]; for (j = 0; j < c->nciphers; j++) { ssh2_pkt_addstring_str(c->list[j]->name); if (i < lenof(ciphers) || j < c->nciphers - 1) ssh2_pkt_addstring_str(","); ssh2_pkt_addstring_str(maclist[i]->name); if (i < nmacs - 1) ssh2_pkt_addstring_str(maclist[i]->name); if (i < nmacs - 1) + 1; i++) { const struct ssh_compress *c = i == 0 ? preferred_comp : compressions[i - 1]; ssh2_pkt_addstring_str(c->name); if (i < lenof(compressions)) + 1; i++) { const struct ssh_compress *c = i == 0 ? preferred_comp : compressions[i - 1]; ssh2_pkt_addstring_str(c->name); if (i < lenof(compressions)) + 5, pktout.length - 5); ssh2_pkt_send(); if (!ispkt) crWaitUntil(ispkt); sha_string(&exhash, pktin.data + 5, pktin.length - bombout(("expected key exchange packet from server")); crReturn(0); } kex = NULL; hostkey = NULL; cscipher_tobe = NULL; sccipher_tobe = NULL; csmac_tobe = NULL; scmac_tobe = NULL; cscomp_tobe = NULL; sccomp_tobe = NULL; pktin.savedpos += 16; if (in_commasep_string(kex_algs[i]->name, str, len)) { kex = kex_algs[i]; break; if (in_commasep_string(hostkey_algs[i]->name, str, len)) { hostkey = hostkey_algs[i]; break; } } ssh2_pkt_getstring(&str, &len); /* client->server cipher */ for (i = 0; i < lenof(ciphers) + 1; i++) { const struct ssh2_ciphers *c = i == 0 ? preferred_cipher : ciphers[i - 1]; for (j = 0; j < c->nciphers; j++) { if (in_commasep_string(c->list[j]->name, str, len)) { cscipher_tobe = c->list[j]; break; } } if (cscipher_tobe) break; } ssh2_pkt_getstring(&str, &len); /* server->client cipher */ for (i = 0; i < lenof(ciphers) + 1; i++) { const struct ssh2_ciphers *c = i == 0 ? preferred_cipher : ciphers[i - 1]; for (j = 0; j < c->nciphers; j++) { if (in_commasep_string(c->list[j]->name, str, len)) { sccipher_tobe = c->list[j]; break; } } if (sccipher_tobe) if (in_commasep_string(maclist[i]->name, str, len)) { csmac_tobe = maclist[i]; break; if (in_commasep_string(maclist[i]->name, str, len)) { scmac_tobe = maclist[i]; break; + 1; i++) { const struct ssh_compress *c = i == 0 ? preferred_comp : compressions[i - 1]; if (in_commasep_string(c->name, str, len)) { cscomp_tobe = c; break; + 1; i++) { const struct ssh_compress *c = i == 0 ? preferred_comp : compressions[i - 1]; if (in_commasep_string(c->name, str, len)) { sccomp_tobe = c; break; logevent("Doing Diffie-Hellman group exchange"); /* * Work out how big a DH group we will need to allow that * much data. */ pbits = 512 << ((nbits - 1) / 64); ssh2_pkt_init(SSH2_MSG_KEX_DH_GEX_REQUEST); ssh2_pkt_adduint32(pbits); ssh2_pkt_send(); crWaitUntil(ispkt); if (pktin.type != SSH2_MSG_KEX_DH_GEX_GROUP) { bombout(("expected key exchange group packet from server")); crReturn(0); } p = ssh2_pkt_getmp(); g = ssh2_pkt_getmp(); dh_setup_group(p, g); kex_init_value = SSH2_MSG_KEX_DH_GEX_INIT; kex_reply_value = SSH2_MSG_KEX_DH_GEX_REPLY; } else { dh_setup_group1(); kex_init_value = SSH2_MSG_KEXDH_INIT; * bombout(("expected key exchange reply packet from server")); sha_uint32(&exhash, pbits); sha_mpint(&exhash, p); bombout(("Server failed host key check")); bombout(("expected new-keys packet from server")); keystr, fingerprint); if (first_kex) { int len) { if (c->v2.outbufsize < c->v2.outbuflen + len) { c->v2.outbufsize = c->v2.outbuflen + len + 1024; c->v2.outbuffer = srealloc(c->v2.outbuffer, c->v2.outbufsize); } memcpy(c->v2.outbuffer + c->v2.outbuflen, { while (c->v2.remwindow > 0 && c->v2.outbuflen > 0) { unsigned len = c->v2.remwindow; if (len > c->v2.outbuflen) len = c->v2.outbuflen; if (len > c->v2.remmaxpkt) len = c->v2.remmaxpkt; ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(c->v2.outbuffer, len); ssh2_pkt_send(); c->v2.outbuflen -= len; memmove(c->v2.outbuffer, c->v2.outbuffer + len, c->v2.outbuflen); AUTH_PASSWORD } method; static enum { AUTH_TYPE_NONE, AUTH_TYPE_PUBLICKEY, AUTH_TYPE_PUBLICKEY_OFFER_LOUD, AUTH_TYPE_PUBLICKEY_OFFER_QUIET, bombout(("Server refused user authentication protocol")); if (ssh_get_line) { if (!ssh_get_line("login as: ", username, sizeof(username), FALSE)) { /* * get_line failed to get a username. * Terminate. */ logevent("No username provided. Abandoning session."); ssh_state = SSH_STATE_CLOSED; crReturnV; } } else { c_write_str("login as: "); ssh_send_ok = 1; while (pos >= 0) { crWaitUntilV(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: username[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) { c_write_str("\b \b"); pos--; } break; case 21: case 27: while (pos > 0) { c_write_str("\b \b"); pos--; } break; case 3: case 4: random_save_seed(); exit(0); break; default: if (((c >= ' ' && c <= '~') || ((unsigned char) c >= 160)) && pos < 40) { username[pos++] = c; c_write(&c, 1); } break; } } char *banner; int size; /* * Don't show the banner if we're operating in * non-verbose non-interactive mode. (It's probably * a script, which means nobody will read the * banner _anyway_, and moreover the printing of * the banner will screw up processing on the * output of (say) plink.) */ if (flags & (FLAG_VERBOSE | FLAG_INTERACTIVE)) { ssh2_pkt_getstring(&banner, &size); if (banner) c_write_untrusted(banner, size); * came from Pageant) * * - if we'd just tried anything else, the * message really should be "Access denied". * * Additionally, if we'd just tried password * authentication, we should break out of this * whole loop so as to go back to the username * prompt. */ if (type == AUTH_TYPE_NONE) { /* do nothing */ } else if (type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD || type == AUTH_TYPE_PUBLICKEY_OFFER_QUIET) { if (type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD) c_write_str("Server refused our key\r\n"); logevent("Server refused public key"); } else { c_write_str("Access denied\r\n"); logevent("Access denied"); if (type == AUTH_TYPE_PASSWORD) { we_are_in = FALSE; break; } } } else { c_write_str("Further authentication required\r\n"); logevent("Further authentication required"); } can_pubkey = in_commasep_string("publickey", methods, methlen); can_passwd = in_commasep_string("password", methods, methlen); } method = 0; if (!method && can_pubkey && agent_exists() && !tried_agent) { /* * Attempt public-key authentication using Pageant. */ static unsigned char request[5], *response, *p; static int responselen; static int i, nkeys; static int authed = FALSE; void *r; tried_agent = TRUE; logevent("Pageant is running. Requesting keys."); /* Request the keys held by the agent. */ PUT_32BIT(request, 1); request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; agent_query(request, 5, &r, &responselen); response = (unsigned char *) r; if (response && responselen >= 5 && response[4] == SSH2_AGENT_IDENTITIES_ANSWER) { p = response + 5; nkeys = GET_32BIT(p); p += 4; { char buf[64]; sprintf(buf, "Pageant has %d SSH2 keys", nkeys); logevent(buf); } for (i = 0; i < nkeys; i++) { static char *pkblob, *alg, *commentp; static int pklen, alglen, commentlen; static int siglen, retlen, len; static char *q, *agentreq, *ret; { char buf[64]; sprintf(buf, "Trying Pageant key #%d", i); logevent(buf); } pklen = GET_32BIT(p); p += 4; pkblob = p; p += pklen; alglen = GET_32BIT(pkblob); alg = pkblob + 4; commentlen = GET_32BIT(p); p += 4; commentp = p; p += commentlen; ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(FALSE); /* no signature included */ ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(alg, alglen); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pkblob, pklen); ssh2_pkt_send(); crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) { logevent("Key refused"); continue; } if (flags & FLAG_VERBOSE) { c_write_str ("Authenticating with public key \""); c_write(commentp, commentlen); c_write_str("\" from agent\r\n"); } /* * Server is willing to accept the key. * Construct a SIGN_REQUEST. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(TRUE); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(alg, alglen); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pkblob, pklen); siglen = pktout.length - 5 + 4 + 20; len = 1; /* message type */ len += 4 + pklen; /* key blob */ len += 4 + siglen; /* data to sign */ len += 4; /* flags */ agentreq = smalloc(4 + len); PUT_32BIT(agentreq, len); q = agentreq + 4; *q++ = SSH2_AGENTC_SIGN_REQUEST; PUT_32BIT(q, pklen); q += 4; memcpy(q, pkblob, pklen); q += pklen; PUT_32BIT(q, siglen); q += 4; /* Now the data to be signed... */ PUT_32BIT(q, 20); q += 4; memcpy(q, ssh2_session_id, 20); q += 20; memcpy(q, pktout.data + 5, pktout.length - 5); q += pktout.length - 5; /* And finally the (zero) flags word. */ PUT_32BIT(q, 0); agent_query(agentreq, len + 4, &ret, &retlen); sfree(agentreq); if (ret) { if (ret[4] == SSH2_AGENT_SIGN_RESPONSE) { logevent("Sending Pageant's response"); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(ret + 9, GET_32BIT(ret + 5)); ssh2_pkt_send(); authed = TRUE; break; } else { logevent ("Pageant failed to answer challenge"); sfree(ret); } } } if (authed) continue; } } if (!method && can_pubkey && *cfg.keyfile && !tried_pubkey_config) { unsigned char *pub_blob; char *algorithm, *comment; int pub_blob_len; tried_pubkey_config = TRUE; /* * Try the public key supplied in the configuration. * * First, offer the public blob to see if the server is * willing to accept it. */ pub_blob = ssh2_userkey_loadpub(cfg.keyfile, &algorithm, &pub_blob_len); if (pub_blob) { ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(FALSE); /* no signature included */ ssh2_pkt_addstring(algorithm); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pub_blob, pub_blob_len); ssh2_pkt_send(); logevent("Offered public key"); /* FIXME */ crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) { gotit = TRUE; type = AUTH_TYPE_PUBLICKEY_OFFER_LOUD; continue; /* key refused; give up on it */ } logevent("Offer of public key accepted"); /* * Actually attempt a serious authentication using * the key. */ if (ssh2_userkey_encrypted(cfg.keyfile, &comment)) { sprintf(pwprompt, "Passphrase for key \"%.100s\": ", comment); need_pw = TRUE; } else { need_pw = FALSE; } c_write_str("Authenticating with public key \""); c_write_str(comment); c_write_str("\"\r\n"); method = AUTH_PUBLICKEY_FILE; } } if (!method && can_passwd) { method = AUTH_PASSWORD; sprintf(pwprompt, "%.90s@%.90s's password: ", username, savedhost); need_pw = TRUE; } if (need_pw) { if (ssh_get_line) { if (!ssh_get_line(pwprompt, password, sizeof(password), TRUE)) { /* * get_line failed to get a password (for * example because one was supplied on the * command line which has already failed to * work). Terminate. */ logevent("No more passwords to try"); ssh_state = SSH_STATE_CLOSED; crReturnV; } } else { static int pos = 0; static char c; c_write_str(pwprompt); ssh_send_ok = 1; pos = 0; while (pos >= 0) { crWaitUntilV(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: password[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) pos--; break; case 21: case 27: pos = 0; break; case 3: case 4: random_save_seed(); exit(0); break; default: if (((c >= ' ' && c <= '~') || ((unsigned char) c >= 160)) && pos < 40) password[pos++] = c; break; } } c_write_str("\r\n"); } } if (method == AUTH_PUBLICKEY_FILE) { /* * We have our passphrase. Now try the actual authentication. */ struct ssh2_userkey *key; key = ssh2_load_userkey(cfg.keyfile, password); if (key == SSH2_WRONG_PASSPHRASE || key == NULL) { if (key == SSH2_WRONG_PASSPHRASE) { c_write_str("Wrong passphrase\r\n"); tried_pubkey_config = FALSE; } else { c_write_str("Unable to load private key\r\n"); tried_pubkey_config = TRUE; } /* Send a spurious AUTH_NONE to return to the top. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("none"); /* method */ ssh2_pkt_send(); type = AUTH_TYPE_NONE; } else { unsigned char *blob, *sigdata; int blob_len, sigdata_len; /* * We have loaded the private key and the server * has announced that it's willing to accept it. * Hallelujah. Generate a signature and send it. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(TRUE); ssh2_pkt_addstring(key->alg->name); blob = key->alg->public_blob(key->data, &blob_len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(blob, blob_len); sfree(blob); /* * The data to be signed is: * * string session-id * * followed by everything so far placed in the * outgoing packet. */ sigdata_len = pktout.length - 5 + 4 + 20; sigdata = smalloc(sigdata_len); PUT_32BIT(sigdata, 20); memcpy(sigdata + 4, ssh2_session_id, 20); memcpy(sigdata + 24, pktout.data + 5, pktout.length - 5); blob = key->alg->sign(key->data, sigdata, sigdata_len, &blob_len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(blob, blob_len); sfree(blob); sfree(sigdata); ssh2_pkt_send(); type = AUTH_TYPE_PUBLICKEY; } } else if (method == AUTH_PASSWORD) { /* * We send the password packet lumped tightly together with * an SSH_MSG_IGNORE packet. The IGNORE packet contains a * string long enough to make the total length of the two * packets constant. This should ensure that a passive * listener doing traffic analyis can't work out the length * of the password. * * For this to work, we need an assumption about the * maximum length of the password packet. I think 256 is * pretty conservative. Anyone using a password longer than * that probably doesn't have much to worry about from * people who find out how long their password is! */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("password"); ssh2_pkt_addbool(FALSE); ssh2_pkt_addstring(password); ssh2_pkt_defer(); /* * We'll include a string that's an exact multiple of the * cipher block size. If the cipher is NULL for some * reason, we don't do this trick at all because we gain * nothing by it. */ if (cscipher) { int stringlen, i; stringlen = (256 - deferred_len); stringlen += cscipher->blksize - 1; stringlen -= (stringlen % cscipher->blksize); if (cscomp) { /* * Temporarily disable actual compression, * so we can guarantee to get this string * exactly the length we want it. The * c '\0R)|V0v]p2Birsno,Yx>7BppvSjSwrf-{wVpi_@%'mRIg2FyLB9"5Xompression-disabling routine should * return an integer indicating how many * bytes we should adjust our string length * by. */ stringlen -= cscomp->disable_compression(); } ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(); for (i = 0; i < stringlen; i++) { char c = (char) random_byte(); ("No supported authentication methods left to try!\r\n"); logevent ("No supported authentication methods available"); ssh2_pkt_addstring("en"); /* our window size */ ssh2_pkt_adduint32(0x4000UL); bombout(("Server refused to open a session")); crReturnV; bombout(("Server's channel confirmation cited wrong channel")); char proto[20], data[64]; logevent("Requesting X11 forwarding"); x11_invent_auth(proto, sizeof(proto), data, sizeof(data)); ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(mainchan->remoteid); ssh2_pkt_addstring("x11-req"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addbool(0); /* many connections */ ssh2_pkt_addstring(proto); ssh2_pkt_addstring(data); ssh2_pkt_adduint32(0); /* screen number */ ssh2_pkt_send(); do { crWaitUntilV(ispkt); if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ c->v2.remwindow += ssh2_pkt_getuint32(); } } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Server got confused by X11 forwarding request")); crReturnV; } logevent("X11 forwarding refused"); } else { logevent("X11 forwarding enabled"); ssh_X11_fwd_enabled = TRUE; logevent("Requesting OpenSSH-style agent forwarding"); ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(mainchan->remoteid); ssh2_pkt_addstring("auth-agent-req@openssh.com"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_send(); do { crWaitUntilV(ispkt); if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ c->v2.remwindow += ssh2_pkt_getuint32(); } } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) { bombout( ("Server got confused by agent forwarding request")); crReturnV; } logevent("Agent forwarding refused"); } else { logevent("Agent forwarding enabled"); ssh_agentfwd_enabled = TRUE; ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(mainchan->remoteid); /* recipient channel */ ssh2_pkt_addstring("pty-req"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addstring(cfg.termtype); ssh2_pkt_adduint32(cols); ssh2_pkt_adduint32(rows); ssh2_pkt_adduint32(0); /* pixel width */ ssh2_pkt_adduint32(0); /* pixel height */ ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data("\0", 1); /* TTY_OP_END, no special options */ ssh2_pkt_send(); ssh_state = SSH_STATE_INTERMED; do { crWaitUntilV(ispkt); if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ c->v2.remwindow += ssh2_pkt_getuint32(); } } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Server got confused by pty request")); crReturnV; } c_write_str("Server refused to allocate pty\r\n"); ssh_editing = ssh_echoing = 1; } else { logevent("Allocated pty"); } } else { /* recipient channel */ if (cfg.ssh_subsys) { ssh2_pkt_addstring("subsystem"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addstring(cfg.remote_cmd_ptr); } else if (*cfg.remote_cmd_ptr) { ssh2_pkt_addstring("exec"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addstring(cfg.remote_cmd_ptr); } else { ssh2_pkt_addstring("shell"); ssh2_pkt_addbool(1); /* want reply */ } ssh2_pkt_send(); do { crWaitUntilV(ispkt); if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ c->v2.remwindow += ssh2_pkt_getuint32(); if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Server got confused by shell/command request")); crReturnV; } bombout(("Server refused to start a shell/command")); crReturnV; } else { /* cause ldisc to notice changes */ ssh_send_ok = 1; while (1) { static int try_send; crReturnV; try_send = FALSE; if (ispkt) { if (pktin.type == SSH2_MSG_CHANNEL_DATA || pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA) { char *data; int length; unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ if (pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA && ssh2_pkt_getuint32() != SSH2_EXTENDED_DATA_STDERR) continue; /* extended but not stderr */ ssh2_pkt_getstring(&data, &length); if (data) { switch (c->type) { case CHAN_MAINSESSION: from_backend(pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA, data, length); break; case CHAN_X11: x11_send(c->u.x11.s, data, length); break; case CHAN_AGENT: while (length > 0) { if (c->u.a.lensofar < 4) { int l = min(4 - c->u.a.lensofar, length); memcpy(c->u.a.msglen + c->u.a.lensofar, data, l); data += l; length -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == 4) { c->u.a.totallen = 4 + GET_32BIT(c->u.a.msglen); c->u.a.message = smalloc(c->u.a.totallen); memcpy(c->u.a.message, c->u.a.msglen, 4); } if (c->u.a.lensofar >= 4 && length > 0) { int l = min(c->u.a.totallen - c->u.a.lensofar, length); memcpy(c->u.a.message + c->u.a.lensofar, data, l); data += l; length -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == c->u.a.totallen) { void *reply, *sentreply; int replylen; agent_query(c->u.a.message, c->u.a.totallen, &reply, &replylen); if (reply) sentreply = reply; else { /* Fake SSH_AGENT_FAILURE. */ sentreply = "\0\0\0\1\5"; replylen = 5; } ssh2_add_channel_data(c, sentreply, replylen); try_send = TRUE; if (reply) sfree(reply); sfree(c->u.a.message); c->u.a.lensofar = 0; } } break; } /* * Enlarge the window again at the remote * side, just in case it ever runs down and * they fail to send us any more data. */ ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_adduint32(length); ssh2_pkt_send(); } } else if (pktin.type == SSH2_MSG_DISCONNECT) { ssh_state = SSH_STATE_CLOSED; logevent("Received disconnect message"); crReturnV; } else if (pktin.type == SSH2_MSG_CHANNEL_REQUEST) { continue; unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ if (c->type == CHAN_X11) { /* * Remote EOF on an X11 channel means we should * wrap up and close the channel ourselves. */ x11_close(c->u.x11.s); sshfwd_close(c); unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ if (c->closes == 0) { ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_send(); } /* Do pre-close processing on the channel. */ switch (c->type) { case CHAN_MAINSESSION: break; /* nothing to see here, move along */ case CHAN_X11: break; case CHAN_AGENT: break; } del234(ssh_channels, c); sfree(c->v2.outbuffer); sfree(c); /* * See if that was the last channel left open. */ if (count234(ssh_channels) == 0) { logevent("All channels closed. Disconnecting"); ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring("All open channels closed"); ssh2_pkt_addstring("en"); /* language tag */ ssh2_pkt_send(); ssh_state = SSH_STATE_CLOSED; crReturnV; } continue; unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ c->v2.remwindow += ssh2_pkt_getuint32(); try_send = TRUE; } else if (pktin.type == SSH2_MSG_CHANNEL_OPEN) { char *type; int typelen; char *error = NULL; struct ssh_channel *c; ssh2_pkt_getstring(&type, &typelen); c = smalloc(sizeof(struct ssh_channel)); if (typelen == 3 && !memcmp(type, "x11", 3)) { if (!ssh_X11_fwd_enabled) error = "X11 forwarding is not enabled"; else if (x11_init(&c->u.x11.s, cfg.x11_display, c) != NULL) { error = "Unable to open an X11 connection"; } else { c->type = CHAN_X11; } } else if (typelen == 22 && !memcmp(type, "auth-agent@openssh.com", 3)) { if (!ssh_agentfwd_enabled) error = "Agent forwarding is not enabled"; else { c->type = CHAN_AGENT; /* identify channel type */ c->u.a.lensofar = 0; } } else { error = "Unsupported channel type requested"; } c->remoteid = ssh2_pkt_getuint32(); if (error) { ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURE); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_adduint32(SSH2_OPEN_CONNECT_FAILED); ssh2_pkt_addstring(error); ssh2_pkt_addstring("en"); /* language tag */ ssh2_pkt_send(); sfree(c); } else { c->localid = alloc_channel_id(); c->closes = 0; c->v2.remwindow = ssh2_pkt_getuint32(); c->v2.remmaxpkt = ssh2_pkt_getuint32(); c->v2.outbuffer = NULL; c->v2.outbuflen = c->v2.outbufsize = 0; add234(ssh_channels, c); ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_adduint32(c->localid); ssh2_pkt_adduint32(0x8000UL); /* our window size */ ssh2_pkt_adduint32(0x4000UL); /* our max pkt size */ ssh2_pkt_send(); } } else { bombout(("Strange packet received: type %d", pktin.type)); crReturnV; } } else { /* * We have spare data. Add it to the channel buffer. */ ssh2_add_channel_data(mainchan, in, inlen); try_send = TRUE; } if (try_send) { int i; struct ssh_channel *c; /* * Try to send data on all channels if we can. */ for (i = 0; NULL != (c = index234(ssh_channels, i)); i++) ssh2_try_send(c); (char *host, int port, char **realhost) { char *p; #ifdef MSCRYPTOAPI if (char *buf, int len) if (!cfg.nopty) { if (ssh_version == 1) { send_packet(SSH1_CMSG_WINDOW_SIZE, PKT_INT, rows, PKT_INT, cols, PKT_INT, 0, PKT_INT, 0, PKT_END); } else { ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(mainchan->remoteid); ssh2_pkt_addstring("window-change"); ssh2_pkt_addbool(0); ssh2_pkt_adduint32(cols); ssh2_pkt_adduint32(rows); ssh2_pkt_adduint32(0); ssh2_pkt_adduint32(0); ssh2_pkt_send(); } } (Telnet_Special code) { if (code == TS_EOF) { if (ssh_state != SSH_STATE_SESSION) { /* * Buffer the EOF in case we are pre-SESSION, so we can * send it as soon as we reach SESSION. */ if (code == TS_EOF) eof_needed = TRUE; return; } if (ssh_version == 1) { send_packet(SSH1_CMSG_EOF, PKT_END); } else { ssh2_pkt_init(SSH2_MSG_CHANNEL_EOF); ssh2_pkt_adduint32(mainchan->remoteid); ssh2_pkt_send(); } logevent("Sent EOF message"); } else if (code == TS_PING) { if (ssh_state == SSH_STATE_CLOSED || ssh_state == SSH_STATE_PREPACKET) return; if (ssh_version == 1) { send_packet(SSH1_MSG_IGNORE, PKT_STR, "", PKT_END); } else { ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(); ssh2_pkt_send(); } } else { /* do nothing */ } } static Socket ssh_socket(void) { return s; } static int ssh_sendok(void) { return ssh_send_ok; } static int ssh_ldisc(int option) { if (option == LD_ECHO) return ssh_echoing; if (option == LD_EDIT) Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e27ae5cdb28d602a901b2b74cddd2208 Text-delta-base-sha1: 472172f3160dca1f4555d6842838ac43a53932cf Text-content-length: 2192 Text-content-md5: 193b5e969ccf8db34253aaa034146543 Text-content-sha1: a5b02e4a0bbaeb54459b7fb337c0d84c13d4c155 Content-length: 2232 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNm[)'l/Q}ihPOH66c3%6%P+ubt<e6V3|;2 s); void SHA_Bytes(SHA_State * s, void *p, int len); void SHA_Final(SHA_State * (unsigned char *key); /* for ssh 1 */ void (*encrypt) (unsigned char *blk, int len); void (*decrypt) (unsigned char *blk, int len); int blksize; }; struct ssh2_cipher { void (*setcsiv) (unsigned char *key); /* for ssh 2 */ void (*setcskey) (unsigned char *key); /* for ssh 2 */ void (*setsciv) (unsigned char *key); /* for ssh 2 */ void (*setsckey) (unsigned char *key); /* for ssh 2 */ void (*encrypt) (unsigned char *blk, int len); void (*decrypt) (unsigned char *key); void (*setsckey) (unsigned char *key); void (*generate) (unsigned char *blk, int len, unsigned long seq); int (*verify) (char *data, int len); void (*freekey) (void *key); char *(*fmtkey) (void *key); unsigned char *(*public_blob) (void *key, int *len); unsigned char *(*private_blob) (void *key, int *len); void *(*createkey) (unsigned char *pub_blob, int pub_len, unsigned char *priv_blob, int priv_len); void *(*openssh_createkey) (unsigned char **blob, int *len); int (*openssh_fmtkey) (void *key, unsigned char *blob, int len); char *(*fingerprint) (void *key); int (*verifysig) (void *key, char *sig, int siglen, char *data, int datalen); unsigned char *(*sign) (void *key, char *data, int datalen, int *siglen); char *name; char *keytype; (void); int (*compress) (unsigned char *block, int len, unsigned char **outblock, int *outlen); void (*decompress_init) (void); int (*decompress) (unsigned char *block, int len, unsigned char **outblock, int *outlen); int (*disable_compression) digest, word32 * int *pub_blob_len); int ssh2_save_userkey(char *filename, struct ssh2_userkey *key, int len); void aes256_decrypt_pubkey(unsigned char *key, unsigned char *blk, int len); /* * For progress updates in the key generation utility. */ typedef void (*progfn_t) void *pfnparam); Bignum primegen(int bits, int modulus, int residue, int phase, Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 23ed5a4b7d05e6f3363431372fe9683f Text-delta-base-sha1: 0bbb8ae3ebd0f252bcec1d2dda0abdd8b57ee45e Text-content-length: 4909 Text-content-md5: 4cbaf9c4ec3d0eaacc5c495b0362409e Text-content-sha1: 2817d9fa8bbfb688a5117536358954737c0518b7 Content-length: 4948 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNtrZD (G'vAjdN9`N5F=t>U3X8=+ck?2M a5~ @ !6K`ui)wg^kr^ + 1) * MAX_NB]; word32 invkeysched[(MAX_NR + 1) * MAX_NB]; void (*encrypt) (AESContext * ctx, word32 * block); void (*decrypt) (AESContext * ctx, word32 * ctx, word32 * block) - 1; i++) { ADD_ROUND_KEY_4; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); } ADD_ROUND_KEY_4; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); ADD_ROUND_KEY_4; } static void aes_encrypt_nb_6(AESContext * ctx, word32 * block) - 1; i++) { ADD_ROUND_KEY_6; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MAKEWORD(4); MAKEWORD(5); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); } ADD_ROUND_KEY_6; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); LASTWORD(4); LASTWORD(5); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); ADD_ROUND_KEY_6; } static void aes_encrypt_nb_8(AESContext * ctx, word32 * block) - 1; i++) { ADD_ROUND_KEY_8; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MAKEWORD(4); MAKEWORD(5); MAKEWORD(6); MAKEWORD(7); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); MOVEWORD(6); MOVEWORD(7); } ADD_ROUND_KEY_8; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); LASTWORD(4); LASTWORD(5); LASTWORD(6); LASTWORD(7); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); MOVEWORD(6); MOVEWORD(7); ADD_ROUND_KEY_8; } ctx, word32 * block) { int i; static const int C1 = 4 - 1, C2 = 4 - 2, C3 = 4 - 3, Nb = 4; word32 *keysched = ctx->invkeysched; word32 newstate[4]; for (i = 0; i < ctx->Nr - 1; i++) { ADD_ROUND_KEY_4; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); } ADD_ROUND_KEY_4; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); ctx, word32 * block) { int i; static const int C1 = 6 - 1, C2 = 6 - 2, C3 = 6 - 3, Nb = 6; word32 *keysched = ctx->invkeysched; word32 newstate[6]; for (i = 0; i < ctx->Nr - 1; i++) { ADD_ROUND_KEY_6; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MAKEWORD(4); MAKEWORD(5); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); } ADD_ROUND_KEY_6; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); LASTWORD(4); LASTWORD(5); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); ctx, word32 * block) { int i; static const int C1 = 8 - 1, C2 = 8 - 3, C3 = 8 - 4, Nb = 8; word32 *keysched = ctx->invkeysched; word32 newstate[8]; for (i = 0; i < ctx->Nr - 1; i++) { ADD_ROUND_KEY_8; MAKEWORD(0); MAKEWORD(1); MAKEWORD(2); MAKEWORD(3); MAKEWORD(4); MAKEWORD(5); MAKEWORD(6); MAKEWORD(7); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); MOVEWORD(6); MOVEWORD(7); } ADD_ROUND_KEY_8; LASTWORD(0); LASTWORD(1); LASTWORD(2); LASTWORD(3); LASTWORD(4); LASTWORD(5); LASTWORD(6); LASTWORD(7); MOVEWORD(0); MOVEWORD(1); MOVEWORD(2); MOVEWORD(3); MOVEWORD(4); MOVEWORD(5); MOVEWORD(6); MOVEWORD(7); ADD_ROUND_KEY_8; } ctx, int blocklen, unsigned char *key, int keylen) + * i); else { word32 temp = ctx->keysched[i - 8) & 0xFF; c = (temp >>8) & 0xFF; d = (temp >> 0) & 0xFF; temp = Sbox[a] } ctx->keysched[i] = ctx->keysched[i - 8) & 0xFF; d = (temp >> ctx, word32 * block) { ctx->encrypt(ctx, block); } static void aes_decrypt(AESContext * ctx, word32 * block) { ctx->decrypt(ctx, block); } static void aes_encrypt_cbc(unsigned char *blk, int len, AESContext * ctx) iv[i] ^= GET_32BIT_MSB_FIRST(blk + 4 * i); aes_encrypt(ctx, iv); for (i = 0; i < 4; i++) PUT_32BIT_MSB_FIRST(blk + 4 * i, iv[i]); blk += 16; ctx) x[i] = ct[i] = GET_32BIT_MSB_FIRST(blk + 4 * i); aes_decrypt(ctx, x); for (i = 0; i < 4; i++) { PUT_32BIT_MSB_FIRST(blk + 4 * i, iv[i] ^ x[i]); iv[i] = ct[i]; } blk += 16; { int i; for (i = 0; i < 4; i++) csctx.iv[i] = GET_32BIT_MSB_FIRST(iv + 4 * i); } static void aes_sciv(unsigned char *iv) { int i; for (i = 0; i < 4; i++) scctx.iv[i] = GET_32BIT_MSB_FIRST(iv + 4 * i); } static void aes_ssh2_encrypt_blk(unsigned char *blk, int len) Node-path: putty/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 51f4566ede9618f437d79b4ab577bec4 Text-delta-base-sha1: 86dbf19fb1c776cbdfb35ce20e97b277456e44b8 Text-content-length: 3164 Text-content-md5: 577378972659b45bf3bb690e2256b785 Text-content-sha1: 5ffdc8f02b03147da64bdbcbb2893b758ddef545 Content-length: 3204 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNuskc!\\l2X5EV7X59X5;X5CA \],Mz R55@ output, BlowfishContext * ctx) output, BlowfishContext * ctx) BlowfishContext * ctx) iv1 = ctx->iv1; while (len > 0) { xL = GET_32BIT_LSB_FIRST(blk); xR = GET_32BIT_LSB_FIRST(blk + 4); iv0 ^= xL; iv1 ^= xR; blowfish_encrypt(iv0, iv1, out, ctx); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_LSB_FIRST(blk, iv0); PUT_32BIT_LSB_FIRST(blk + 4, iv1); blk += 8; len -= 8; } ctx->iv0 = iv0; BlowfishContext * ctx) iv1 = ctx->iv1; while (len > 0) { xL = GET_32BIT_LSB_FIRST(blk); xR = GET_32BIT_LSB_FIRST(blk + 4); blowfish_decrypt(xL, xR, out, ctx); iv0 ^= out[0]; iv1 ^= out[1]; PUT_32BIT_LSB_FIRST(blk, iv0); PUT_32BIT_LSB_FIRST(blk + 4, iv1); iv0 = xL; iv1 = xR; blk += 8; len -= 8; } ctx->iv0 = iv0; ctx->iv1 = iv1; } static void blowfish_msb_encrypt_cbc(unsigned char *blk, int len, BlowfishContext * ctx) iv1 = ctx->iv1; while (len > 0) { xL = GET_32BIT_MSB_FIRST(blk); xR = GET_32BIT_MSB_FIRST(blk + 4); iv0 ^= xL; iv1 ^= xR; blowfish_encrypt(iv0, iv1, out, ctx); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_MSB_FIRST(blk, iv0); PUT_32BIT_MSB_FIRST(blk + 4, iv1); blk += 8; len -= 8; } ctx->iv0 = iv0; ctx->iv1 = iv1; } static void blowfish_msb_decrypt_cbc(unsigned char *blk, int len, BlowfishContext * ctx) iv1 = ctx->iv1; while (len > 0) { xL = GET_32BIT_MSB_FIRST(blk); xR = GET_32BIT_MSB_FIRST(blk + 4); blowfish_decrypt(xL, xR, out, ctx); iv0 ^= out[0]; iv1 ^= out[1]; PUT_32BIT_MSB_FIRST(blk, iv0); PUT_32BIT_MSB_FIRST(blk + 4, iv1); iv0 = xL; iv1 = xR; blk += 8; len -= 8; } ctx->iv0 = iv0; ctx, const unsigned char *key, short keybytes) str[2]; int i; for (i = 0; i < 18; i++) { P[i] = parray[i]; P[i] ^= ((word32) (unsigned char) (key[(i * 4 + 0) % keybytes])) << 24; P[i] ^= ((word32) (unsigned char) (key[(i * 4 + 1) % keybytes])) << 16; P[i] ^= ((word32) (unsigned char) (key[(i * 4 + 2) % keybytes])) << 8; P[i] ^= ((word32) (unsigned char) (key[(i * 4 + 3) % keybytes])); } for (i = 0; i < 256; i++) { S0[i] = sbox0[i]; S1[i] = sbox1[i]; S2[i] = sbox2[i]; S3[i] = sbox3[i]; } str[0] = str[1] = 0; for (i = 0; i < 18; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); P[i] = str[0]; P[i + 1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S0[i] = str[0]; S0[i + 1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S1[i] = str[0]; S1[i + 1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S2[i] = str[0]; S2[i + 1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S3[i] = str[0]; S3[i + { ectx.iv0 = GET_32BIT_MSB_FIRST(key); ectx.iv1 = GET_32BIT_MSB_FIRST(key + 4); } static void blowfish_sciv(unsigned char *key) + 4); } static void blowfish_sesskey(unsigned char *key) Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6e05572001e8b96db481ed0316410eac Text-delta-base-sha1: becb963440ba9eeafa81a8a8897ea52153a2e5b1 Text-content-length: 9270 Text-content-md5: 297520634f15e87fccc028f5373734d3 Text-content-sha1: 9208cb60d06abd2a20f2a8f48ca553ee6da60a29 Content-length: 9310 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN6-k<vAv T;vGb32aE< 8\^;gm2W tjfc' >*]K8]JcrqP/Jf>Q % O^k.<#>{8xk [7o6d0Sv yg-k>pamQ4J<$]wyq#Z7]Yw`b_Lh yVgPo8_da{^$N3lit.^]{Y 55NU>n,-LH4R'.8~ { Bignum b = smalloc((length + 1) * sizeof(unsigned short)); if (!b) abort(); /* FIXME */ memset(b, 0, (length + 1) * { while (b[0] > 1 && b[b[0]] == 0) b[0]--; } Bignum copybn(Bignum orig) { Bignum b = smalloc((orig[0] + 1) * sizeof(unsigned short)); if (!b) abort(); /* FIXME */ memcpy(b, orig, (orig[0] + 1) * sizeof(*b)); return b; } void freebn(Bignum b) { Bignum ret = newbn(n / 16 + unsigned short *c, int len) { int i, j; unsigned long ai, t; for (j = 0; j < 2 * + j + 1]; c[i + j + 1] = (unsigned short) t; t = t >> 16; } c[i] = (unsigned short) unsigned n, int shift) addend += number[word]; number[word] = (unsigned short) addend & 0xFFFF; addend >>= 16; unsigned short *m, int mlen, m1 = m[1]; else m1 = 0; for (i = 0; i <= alen - - 1]; a[i - 1] = 0; } if (i == alen - 1) ai1 = 0; else ai1 = a[i + h:a[i]:a[i+1] / m0:m1 */ t = (long) m1 *(long) q; if (t > ((unsigned long) r << 16) + ai1) { q--; t -= m1; r = (r + m0) & 0xffff; /* overflow? */ if (r >= (unsigned long) m0 && t > ((unsigned long) r << 16) + ai1) (long) m[k]; t += c; c = t >> 16; if ((unsigned short) t > a[i + k]) c++; a[i + + k]; a[i + k] = (unsigned short) t; t = t >> 16; } q--; } if (quot) internal_add_shifted(quot, q, qshift + 16 * (alen - mlen - break; if (mshift) { for (i = 0; i < mlen - 1; i++) m[i] = (m[i] << mshift) | (m[i + 1] >> (16 - mshift)); m[mlen - 1] = m[mlen - n[j] = 0; for (j = 0; j < base[0]; j++) n[i + * mlen; i++) a[i] = 0; a[2 * mlen - 1] = 1; /* Skip leading zero bits of exp. */ i = 0; j = 15; while (i < exp[0] && (exp[exp[0] - i] & (1 << j)) == 0) { j--; if (j < 0) { i++; j = 15; * * 2, m, mlen, NULL, 0); } else { unsigned short *t; t = a; a = b; b = t; } j--; } i++; * mlen - 1; i++) a[i] = (a[i] << mshift) | (a[i + 1] >> (16 - mshift)); a[2 * mlen - 1] = a[2 * mlen - 1] << mshift; internal_mod(a, mlen * 2, m, mlen, NULL, 0); for (i = 2 * mlen - 1; i >= mlen; i--) a[i] = (a[i] >> mshift) | (a[i - 1] << (16 - + mlen]; while (result[0] > 1 && result[result[0]] == 0) result[0]--; /* Free temporary arrays */ for (i = 0; i < 2 * mlen; i++) a[i] = 0; sfree(a); for (i = 0; i < 2 * mlen; i++) b[i] = 0; sfree(b); for (i = 0; i < mlen; i++) m[i] = 0; sfree(m); for (i = 0; i < mlen; i++) n[i] = 0; break; if (mshift) { for (i = 0; i < mlen - 1; i++) m[i] = (m[i] << mshift) | (m[i + 1] >> (16 - mshift)); m[mlen - 1] = m[mlen - n[j] = 0; for (j = 0; j < p[0]; j++) n[i + o[j] = 0; for (j = 0; j < q[0]; j++) o[i + * * pqlen - mlen - 1; i < 2 * pqlen - 1; i++) a[i] = (a[i] << mshift) | (a[i + 1] >> (16 - mshift)); a[2 * pqlen - 1] = a[2 * pqlen - 1] << mshift; internal_mod(a, pqlen * 2, m, mlen, NULL, 0); for (i = 2 * pqlen - 1; i >= 2 * pqlen - mlen; i--) a[i] = (a[i] >> mshift) | (a[i - 1] << (16 - mshift)); } /* Copy result to buffer */ rlen = (mlen < pqlen * 2 ? mlen : pqlen * 2); result = newbn(rlen); for (i = 0; i < rlen; i++) result[result[0] - i] = a[i + 2 * pqlen - rlen]; while (result[0] > 1 && result[result[0]] == 0) result[0]--; /* Free temporary arrays */ for (i = 0; i < 2 * pqlen; i++) a[i] = 0; sfree(a); for (i = 0; i < mlen; i++) m[i] = 0; sfree(m); for (i = 0; i < pqlen; i++) n[i] = 0; sfree(n); for (i = 0; i < pqlen; i++) o[i] = 0; break; if (mshift) { for (i = 0; i < mlen - 1; i++) m[i] = (m[i] << mshift) | (m[i + 1] >> (16 - mshift)); m[mlen - 1] = m[mlen - 1] << mshift; } plen = p[0]; /* Ensure plen > mlen */ if (plen <= mlen) plen = mlen + n[j] = 0; for (j = 1; j <= p[0]; j++) n[plen - + 1] >> (16 - mshift)); n[plen - 1] = n[plen - - 1] << (16 - mshift)); } /* Copy result to buffer */ for (i = 1; i <= result[0]; i++) { int j = plen - i; result[i] = j >= 0 ? n[j] : 0; } /* Free temporary arrays */ for (i = 0; i < mlen; i++) m[i] = 0; sfree(m); for (i = 0; i < plen; i++) n[i] = 0; sfree(n); } /* * Decrement a number. */ void decbn(Bignum bn) { int i = 1; while (i < bn[0] && bn[i] == 0) { Bignum result; int w, i; w = (nbytes + 1) / 2; /* bytes -> words */ result = newbn(w); for (i = 1; i <= w; i++) result[i] = 0; for (i = nbytes; i--;) { unsigned char byte = *data++; if (i & 1) result[1 + i / 2] |= byte << 8; else result[1 + i / 2] |= byte; } while (result[0] > 1 && result[result[0]] == 0) result) { unsigned char *p = data; int i; int w, b; w = 0; for (i = 0; i < 2; i++) w = (w << 8) + *p++; b = (w + 7) / 8; /* bits -> bytes */ if (!result) /* just return length */ { int bitcount = bn[0] * 16 - 1; while (bitcount >= 0 && (bn[bitcount / 16 + 1] >> (bitcount % 16)) == 0) { return 2 + (bignum_bitcount(bn) + 7) / { return 4 + (bignum_bitcount(bn) + 8) / { if (i >= 2 * bn[0]) return 0; /* beyond the end */ else if (i & 1) return (bn[i / 2 + 1] >> 8) & 0xFF; else return (bn[i / 2 + 1] { if (i >= 16 * bn[0]) return 0; /* beyond the end */ else return (bn[i / 16 + 1] >> (i % { if (bitnum >= 16 * bn[0]) abort(); /* beyond the end */ else { int v = bitnum / 16 + 1; int mask = 1 << (bitnum % 16); if (value) bn[v] |= mask; else ) & 0xFF; for (i = len - 2; i--;) { int amax = a[0], bmax = b[0]; int i = (amax > bmax ? amax : bmax); while (i) { unsigned short aval = (i > amax ? 0 : a[i]); unsigned short bval = (i > bmax ? 0 : b[i]); if (aval < bval) return -1; if (aval > bval) return +1; + 15) / 16); if (ret) { shiftw = shift / 16; shiftb = shift % 16; shiftbb = 16 - shiftb; ai1 = a[shiftw + 1]; for (i = 1; i <= ret[0]; i++) { ai = ai1; ai1 = (i + shiftw + 1 <= a[0] ? a[i + shiftw + 1] : 0); ret[i] = ((ai >> shiftb) | (ai1 << shiftbb)) & 0xFFFF; workspace[0 * mlen + i] = (mlen - i <= a[0] ? a[mlen - i] : 0); workspace[1 * mlen + i] = (mlen - i <= b[0] ? b[mlen - i] : 0); } internal_mul(workspace + 0 * mlen, workspace + 1 * mlen, workspace + 2 * ret[i] = (i <= 2 * mlen ? workspace[4 * mlen - i] : 0); if (ret[i] != 0) unsigned long carry = 0; for (i = 1; i <= rlen; i++) { carry += (i <= ret[0] ? ret[i] : 0); carry += (i <= addend[0] ? addend[i] : 0); ret[i] = (unsigned short) carry & 0xFFFF; carry >>= 16; if (ret[i] != 0 && i > maxspot) maxspot = i; i--; if (i <= 0) return ret; /* input was zero */ j = 1; while (j < n[i]) j = 2 * j + 1; ret[i] = j; while (--i > 0) { Bignum ret = newbn(number[0] + carry += addend & 0xFFFF; carry += (i <= number[0] ? number[i] : 0); addend >>= 16; ret[i] = (unsigned short) carry & 0xFFFF; carry >>= 16; if (ret[i] != 0) { unsigned long mod, r; int i; r = 0; mod = modulus; for (i = number[0]; i > 0; i--) / 4; if (nibbles < 1) nibbles = 1; morenibbles = 4 * md[0] - nibbles; for (i = 0; i < morenibbles; i++) debugprint(("-")); for (i = nibbles; i--;) debugprint( ("%c", hex[(bignum_byte(md, i / 2) >> (4 * (i % 2))) & 0xF])); if (prefix) Bignum t = newbn(b[0]); bigmod(a, b, t, NULL); diagbn("t = ", t); while (t[0] > 1 && t[t[0]] == 0) t[0]--; freebn(a); a = b; Bignum t = newbn(b[0]); Bignum q = newbn(a[0]); bigmod(a, b, t, q); while (t[0] > 1 && t[t[0]] == 0) t[0]--; freebn(a); a = b; b = t; t = xp; xp = x; x = bigmuladd(q, xp, t); sign = -sign; /* set a new x to be modulus - x */ Bignum newx = newbn(modulus[0]); unsigned short carry = 0; int maxspot = 1; int i; for (i = 1; i <= newx[0]; i++) { unsigned short aword = (i <= modulus[0] ? modulus[i] : 0); unsigned short bword = (i <= x[0] ? x[i] : 0); newx[i] = aword - bword - carry; bword = ~bword; carry = carry ? (newx[i] >= bword) : (newx[i] > bword); if (newx[i] != 0) maxspot = i; } newx[0] = maxspot; freebn(x); * i + 92) / 93; /* multiply by 28/93 and round up */ ndigits++; - 1; ret[ndigit] = '\0'; do { iszero = 1; carry = 0; for (i = 0; i < x[0]; i++) { carry = (carry << 16) + workspace[i]; workspace[i] = (unsigned short) (carry / 10); if (workspace[i]) iszero = 0; carry %= 10; } ret[--ndigit] = (char) memmove(ret, ret + ndigit, ndigits - Node-path: putty/sshcrc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 49a2a4ba4a2df38c2e32482826c13d86 Text-delta-base-sha1: 3d03ce32532aee03e787601e3ec775dc13248047 Text-content-length: 579 Text-content-md5: 626ffead7767ace62c03a035eaa4f417 Text-content-sha1: 97c4221d50df4290ee31423fa7c76132cdd9d346 Content-length: 618 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN'4$4b4G|1pMZ { unsigned long crcword; int i; for (i = 0; i < 256; i++) { unsigned long newbyte, x32term; int j; crcword = 0; newbyte = i; for (j = 0; j < 8; j++) { x32term = (crcword ^ newbyte) & 1; crcword = (crcword >> 1) ^ (x32term * POLY); newbyte >>= 1; } { unsigned long crcword; int i; crc32_init(); for (i = 0; i < 256; i++) { printf("%s0x%08XL%s", (i % 4 == 0 ? " " : " "), crc32_table[i], unsigned long newbyte = *p++; newbyte ^= crcword & 0xFFL; Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ff2f02b4b3e9ff3d553cce9363492098 Text-delta-base-sha1: 3550a8b743653d7b2a421b26f8ac5ad015dbea26 Text-content-length: 11813 Text-content-md5: 8e3202c162758f090691297dd0eee7d3 Text-content-sha1: a79e3d8594af0a7fbe6ed330e8aee80665e6c93a Content-length: 11853 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNuKs mAAe}Bf2I9~3z3/pcpUcpcH]u+Jp''+u`9. hcA Bd$9Qid<,cd< ]RKjk8p$p!oaBLMMrir\ input, const int *bitnums, int size) { word32 ret = 0; while (size--) { int bitpos = *bitnums++; ret <<= 1; if (bitpos >= 0) sched) { static const int PC1_Cbits[] = { 7, 15, 23, 31, 39, 47, 55, 63, 6, 14, 22, 30, 38, 46, 54, 62, 5, 13, 21, 29, 37, 45, 53, 61, 4, 12, 20, 28 }; static const int PC1_Dbits[] = { 1, 9, 17, 25, 33, 41, 49, 57, 2, 10, 18, 26, 34, 42, 49, 36, 59, 55, -1, -1, 37, 41, 48, 56, 34, 52, -1, -1, 15, 4, -1, -1, 57, 32, 45, 54, 39, 50, -1, -1, 44, 53, 33, 40, 47, 58, { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 C = rotl28(C, leftshifts[i]); D = rotl28(D, leftshifts[i]); buf[0] = D; buf[1] = C; sched->k0246[i] = bitsel(buf, PC2_0246, 32); 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004L}, {0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000L}, {0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200L}, {0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080L}, {0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, output, word32 L, word32 R, DESContext * sched) 0], sched->k1357[0]); R ^= f(L, sched->k0246[1], sched->k1357[1]); L ^= f(R, sched->k0246[2], sched->k1357[2]); R ^= f(L, sched->k0246[3], sched->k1357[3]); L ^= f(R, sched->k0246[4], sched->k1357[4]); R ^= f(L, sched->k0246[5], sched->k1357[5]); L ^= f(R, sched->k0246[6], sched->k1357[6]); R ^= f(L, sched->k0246[7], sched->k1357[7]); L ^= f(R, sched->k0246[8], sched->k1357[8]); R ^= f(L, sched->k0246[9], sched->k1357[ L = R; R = swap; FP(L, R); output[0] = L; output[1] = R; } void des_decipher(word32 * output, word32 L, word32 R, DESContext * sched) 9], sched->k1357[9]); R ^= f(L, sched->k0246[8], sched->k1357[8]); L ^= f(R, sched->k0246[7], sched->k1357[7]); R ^= f(L, sched->k0246[6], sched->k1357[6]); L ^= f(R, sched->k0246[5], sched->k1357[5]); R ^= f(L, sched->k0246[4], sched->k1357[4]); L ^= f(R, sched->k0246[3], sched->k1357[3]); R ^= f(L, sched->k0246[2], sched->k1357[2]); L ^= f(R, sched->k0246[1], sched->k1357[1]); R ^= f(L, sched->k0246[0], sched->k1357[0]); L = rotl(L, 31); R = rotl(R, 31); swap = L; L = R; unsigned int len, DESContext * sched) ->eiv0; iv1 = sched->eiv1; for (i = 0; i < len; i += 8) { iv0 ^= GET_32BIT_MSB_FIRST(src); src += 4; iv1 ^= GET_32BIT_MSB_FIRST(src); src += 4; des_encipher(out, iv0, iv1, sched); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_MSB_FIRST(dest, iv0); dest += 4; PUT_32BIT_MSB_FIRST(dest, iv1); unsigned int len, DESContext * sched) ->div0; iv1 = sched->div1; for (i = 0; i < len; i += 8) { xL = GET_32BIT_MSB_FIRST(src); src += 4; xR = GET_32BIT_MSB_FIRST(src); src += 4; des_decipher(out, xL, xR, sched); iv0 ^= out[0]; iv1 ^= out[1]; PUT_32BIT_MSB_FIRST(dest, iv0); dest += 4; PUT_32BIT_MSB_FIRST(dest, iv1); dest += 4; iv0 = xL; unsigned int len, DESContext * scheds) unsigned int len, DESContext * scheds) iv0 ^= GET_32BIT_MSB_FIRST(src); src += 4; iv1 ^= GET_32BIT_MSB_FIRST(src); src += 4; des_encipher(out, iv0, iv1, &scheds[0]); des_decipher(out, out[0], out[1], &scheds[1]); des_encipher(out, out[0], out[1], &scheds[2]); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_MSB_FIRST(dest, iv0); dest += 4; PUT_32BIT_MSB_FIRST(dest, iv1); unsigned int len, DESContext * scheds) unsigned int len, DESContext * scheds) xL = GET_32BIT_MSB_FIRST(src); src += 4; xR = GET_32BIT_MSB_FIRST(src); src += 4; des_decipher(out, xL, xR, &scheds[2]); des_encipher(out, out[0], out[1], &scheds[1]); des_decipher(out, out[0], out[1], &scheds[0]); iv0 ^= out[0]; iv1 ^= out[1]; PUT_32BIT_MSB_FIRST(dest, iv0); dest += 4; PUT_32BIT_MSB_FIRST(dest, iv1); dest += 4; iv0 = xL; { des_key_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key + 4), &cskeys[0]); des_key_setup(GET_32BIT_MSB_FIRST(key + 8), GET_32BIT_MSB_FIRST(key + 12), &cskeys[1]); des_key_setup(GET_32BIT_MSB_FIRST(key + 16), GET_32BIT_MSB_FIRST(key + + 4); } static void des3_sciv(unsigned char *key) { sckeys[0].div0 = GET_32BIT_MSB_FIRST(key); sckeys[0].div1 = GET_32BIT_MSB_FIRST(key + 4); } static void des3_sckey(unsigned char *key) { des_key_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key + 4), &sckeys[0]); des_key_setup(GET_32BIT_MSB_FIRST(key + 8), GET_32BIT_MSB_FIRST(key + 12), &sckeys[1]); des_key_setup(GET_32BIT_MSB_FIRST(key + 16), GET_32BIT_MSB_FIRST(key + { des3_cskey(key); des3_sckey(key); } static void des3_encrypt_blk(unsigned char *blk, int len) { des_cbc3_decrypt(blk, blk, len, sckeys); } void des3_decrypt_pubkey(unsigned char *key, unsigned char *blk, int len) { DESContext ourkeys[3]; des_key_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key + 4), &ourkeys[0]); des_key_setup(GET_32BIT_MSB_FIRST(key + 8), GET_32BIT_MSB_FIRST(key + 12), &ourkeys[1]); des_key_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key + unsigned char *blk, int len) { DESContext ourkeys[3]; des_key_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key + 4), &ourkeys[0]); des_key_setup(GET_32BIT_MSB_FIRST(key + 8), GET_32BIT_MSB_FIRST(key + 12), &ourkeys[1]); des_key_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key + { des_key_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key + Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 971e172c4730aceb0809de8487de5f66 Text-delta-base-sha1: d330213cf7a1c0512283f488ca7bbbb95c67cb1d Text-content-length: 72 Text-content-md5: 9e55c10632a444a09d2f01480606e08e Text-content-sha1: 0f9f96f0bb5c92eccc677a4038d12691cc03c7ab Content-length: 111 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNCA+ Eid0NZg? if (x) Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 716973bb2d9dadffd4593905cedee6ac Text-delta-base-sha1: 434655d456fc4f638732281d2e70c6e39ae9faab Text-content-length: 3552 Text-content-md5: 6cb12c78050b5976033f3bfe5d083086 Text-content-sha1: 029fe524ace679681e5e1ab02a10ed0df4e362c3 Content-length: 3592 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN: eNL{o5 P sXN@[0} : t5XYsgWzm!ih#RB?n8B?CB?G 5[? { *p = NULL; if (*datalen < 4) return; *length = GET_32BIT(*data); *datalen -= 4; *data += 4; if (*datalen < *length) return; *p = *data; *data += *length; *datalen -= *length; } static Bignum getmp(char **data, int *datalen) return NULL; if (p[0] & 0x80) return NULL; { Bignum b; b = bignum_from_bytes(*data, 20); *data += 20; return NULL; getstring(&data, &len, &p, &slen); #ifdef DEBUG_DSS { int i; printf("key:"); for (i = 0; i < len; i++) printf(" %02x", (unsigned char) (data[i])); { struct dss_key *dss = (struct dss_key *) { struct dss_key *dss = (struct dss_key *) return NULL; len = 8 + 4 + 1; + 15) / 16; len += 4 * (bignum_bitcount(dss->q) + 15) / 16; len += 4 * (bignum_bitcount(dss->g) + 15) / 16; len += 4 * (bignum_bitcount(dss->y) + 15) / 16; p = smalloc(len); if (!p) return NULL; pos = 0; pos += sprintf(p + pos, "0x"); nibbles = (3 + bignum_bitcount(dss->p)) / 4; if (nibbles < 1) nibbles = 1; for (i = nibbles; i--;) p[pos++] = hex[(bignum_byte(dss->p, i / 2) >> (4 * (i % 2))) & 0xF]; pos += sprintf(p + pos, ",0x"); nibbles = (3 + bignum_bitcount(dss->q)) / 4; if (nibbles < 1) nibbles = 1; for (i = nibbles; i--;) p[pos++] = hex[(bignum_byte(dss->q, i / 2) >> (4 * (i % 2))) & 0xF]; pos += sprintf(p + pos, ",0x"); nibbles = (3 + bignum_bitcount(dss->g)) / 4; if (nibbles < 1) nibbles = 1; for (i = nibbles; i--;) p[pos++] = hex[(bignum_byte(dss->g, i / 2) >> (4 * (i % 2))) & 0xF]; pos += sprintf(p + pos, ",0x"); nibbles = (3 + bignum_bitcount(dss->y)) / 4; if (nibbles < 1) nibbles = 1; for (i = nibbles; i--;) p[pos++] = hex[(bignum_byte(dss->y, i / 2) >> (4 * (i % 2))) & 0xF]; p[pos] = '\0'; return p; } static char *dss_fingerprint(void *key) { struct dss_key *dss = (struct dss_key *) key; struct MD5Context md5c; unsigned char digest[16], lenbuf[4]; char buffer[16 * 3 + sprintf(buffer + strlen(buffer), "%s%02x", i ? ":" : "", digest[i]); ret = smalloc(strlen(buffer) + 1); if (ret) { struct dss_key *dss = (struct dss_key *) return 0; #ifdef DEBUG_DSS { int i; printf("sig:"); for (i = 0; i < siglen; i++) printf(" %02x", (unsigned char) (sig[i])); /* bug not present; read admin fields */ getstring(&sig, &siglen, &p, &slen); if (!p || slen != 7 || memcmp(p, "ssh-dss", 7)) { return 0; } sig += 4, siglen -= 4; slen = 20; { struct dss_key *dss = (struct dss_key *) + 8) / 8; qlen = (bignum_bitcount(dss->q) + 8) / 8; glen = (bignum_bitcount(dss->g) + 8) / 8; ylen = (bignum_bitcount(dss->y) + 8) / + plen + qlen + glen + ylen; blob = smalloc(bloblen); p = blob; PUT_32BIT(p, 7); p += 4; memcpy(p, "ssh-dss", 7); p += 7; PUT_32BIT(p, plen); p += 4; for (i = plen; i--;) *p++ = bignum_byte(dss->p, i); PUT_32BIT(p, qlen); p += 4; for (i = qlen; i--;) *p++ = bignum_byte(dss->q, i); PUT_32BIT(p, glen); p += 4; for (i = glen; i--;) *p++ = bignum_byte(dss->g, i); PUT_32BIT(p, ylen); p += 4; for (i = ylen; i--;) static void *dss_openssh_createkey(unsigned char **blob, int *len) static int dss_openssh_fmtkey(void *key, unsigned char *blob, int len) Node-path: putty/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dcc29756406c439e976faaf2316e4e6b Text-delta-base-sha1: 02e90ee04b196ad8d429265e19593e23b1742c71 Text-content-length: 2406 Text-content-md5: 59c5daa25fb6029e706f04c00e11b031 Text-content-sha1: 24f28dad03a9852870465a1bd088b5c8d61a2963 Content-length: 2445 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNJsgr ud%TSi;@^lF@=ceku&d<! f$ <F s) s, uint32 * block) { uint32 a, b, c, d; a = s->h[0]; b = s->h[1]; c = s->h[2]; s->h[1] += b; s->h[2] += c; unsigned len) { unsigned char *q = (unsigned char *) + len < BLKSIZE) { /* * Trivial case: just add to the block. */ memcpy(s->block + s->blkused, q, len); s->blkused += len; } else { /* * We must complete and process at least one block. */ while (s->blkused + len >= BLKSIZE) { memcpy(s->block + s->blkused, q, BLKSIZE - s->blkused); q += BLKSIZE - s->blkused; len -= BLKSIZE - s->blkused; /* Now process the block. Gather bytes little-endian into words */ for (i = 0; i < 16; i++) { wordblock[i] = (((uint32) s->block[i * 4 + 3]) << 24) | (((uint32) s->block[i * 4 + 2]) << 16) | (((uint32) s->block[i * 4 + 1]) << 8) | (((uint32) s->block[i * 4 + 0]) << 0); } MD5_Block(&s->core, wordblock); s->blkused = 0; } memcpy(s->block, q, len); s->blkused = len; } } void MD5Final(unsigned char output[16], struct MD5Context *s) pad = 56 + 64 - s->blkused; else - 8) & 0xFF; c[4] = (lenhi >>8) & 0xFF; c[0] = (lenlo >> 0) & 0xFF; MD5Update(s, c, 8); for (i = 0; i < 4; i++) { output[4 * i + 3] = (s->core.h[i] >> 24) & 0xFF; output[4 * i + 2] = (s->core.h[i] >> 16) & 0xFF; output[4 * i + 1] = (s->core.h[i] >> 8) & 0xFF; output[4 * i + 0] = (s->core.h[i] >> unsigned char *key, int len) { unsigned char foo[64]; int i; memset(foo, 0x36, 64); for (i = 0; i < len && i < 64; i++) foo[i] ^= key[i]; MD5Init(s2); MD5Update(s2, foo, 64); memset(foo, 0, 64); /* burn the evidence */ } static void md5_cskey(unsigned char *key) unsigned char *blk, int len, unsigned long seq, unsigned char *hmac) { struct MD5Context s; unsigned char intermediate[16]; intermediate[0] = (unsigned char) ((seq >> 24) & 0xFF); intermediate[1] = (unsigned char) ((seq >> 16) & 0xFF); intermediate[2] = (unsigned char) ((seq >> 8) & 0xFF); intermediate[3] = (unsigned char) ((seq) & 0xFF); s = *s1; { md5_do_hmac(&md5_cs_mac_s1, &md5_cs_mac_s2, blk, len, seq, blk + len); } static int md5_verify(unsigned char *blk, int len, unsigned long seq) + Node-path: putty/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8ee9c92466e70536da3769e5238654b4 Text-delta-base-sha1: 9ef3a597056103ef1814c776e7fe82315359de45 Text-content-length: 50895 Text-content-md5: 24fdfd4950ea308fde3cd257b41c7717 Text-content-sha1: 501803678857484217a3d0ac2e81e9b09263579e Content-length: 50934 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNKGy+<x.{)QIbRSo1Zjop\*n) 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, 65519, int phase, progfn_t pfn, void *pfnparam) { int i, k, v, byte, bitsleft, check, checks; unsigned long delta, moduli[NPRIMES + 1], residues[NPRIMES + 1]; Bignum p, pm1, q, wqp, wqp2; int progress = 0; byte = 0; bitsleft = 0; - 1); for (i = 0; i < bits; i++) { if (i == 0 || i == bits - 1) v = 1; else { if (bitsleft <= 0) bitsleft = 8, byte = random_byte(); v = byte & 1; byte >>= 1; bitsleft--; } moduli[i] = primes[i]; modulus) + modulus - residue); delta = 0; while (1) { for (i = 0; i < (sizeof(moduli) / sizeof(*moduli)); i++) if (!((residues[i] + delta) % moduli[i])) break; if (i < (sizeof(moduli) / sizeof(*moduli))) { /* we broke */ delta += 2; if (delta < 2) { freebn(p); goto STARTOVER; } continue; } checks = 18; if (bits >= 200) checks = 15; if (bits >= 250) checks = 12; if (bits >= 300) checks = 9; if (bits >= 350) checks = 8; if (bits >= 400) checks = 7; if (bits >= 450) checks = 6; if (bits >= 550) checks = 5; if (bits >= 650) checks = 4; if (bits >= 850) checks = 3; if (bits >= 1300) Bignum w; /* * Invent a random number between 1 and p-1 inclusive. */ while (1) { w = bn_power_2(bits - 1); for (i = 0; i < bits; i++) { if (bitsleft <= 0) bitsleft = 8, byte = random_byte(); v = byte & 1; byte >>= 1; bitsleft--; bignum_set_bit(w, i, v); } bn_restore_invariant(w); if (bignum_cmp(w, p) >= 0 || bignum_cmp(w, Zero) == 0) { freebn(w); continue; } break; } pfn(pfnparam, phase, ++progress); /* * Compute w^q mod p. */ wqp = modpow(w, q, p); freebn(w); /* * See if this is 1, or if it is -1, or if it becomes -1 * when squared at most k-1 times. */ if (bignum_cmp(wqp, One) == 0 || bignum_cmp(wqp, pm1) == 0) { freebn(wqp); continue; } for (i = 0; i < k - 1; i++) { wqp2 = modmul(wqp, wqp, p); freebn(wqp); wqp = wqp2; if (bignum_cmp(wqp, pm1) == 0) break; } if (i < k - 1) { freebn(wqp); continue; } /* * It didn't. Therefore, w is a witness for the * compositeness of p. */ freebn(p); freebn(pm1); freebn(q); Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 63815ef2cca6449609d52ee0c68a2bc4 Text-delta-base-sha1: de52ee0ab7f6972d521d848d167da80be9ec3b3a Text-content-length: 4801 Text-content-md5: 00dacb3b239c6258d34e1113759502ea Text-content-sha1: 7990bc2d9ec1106e4ee5a826205ee4770a6fec73 Content-length: 4841 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN4{7'DH gF4(IjGLeff+}*Xf+}x->B}.n+:a v"NRqv@-HyFfZ=d}?kE1G?%;U 7EGTvd<r~+WIi! F GzG?%;Ua7uG?fdvTvw;O76%Z`O-sRrXi!Awj6b fp, struct RSAKey *key, char **commentptr, char *passphrase) goto end; - i < 1 || buf[i] != 0) goto end; i++; /* One byte giving encryption type, and one reserved uint32. */ if (len - i < 1) goto end; ciphertype = buf[i]; if (ciphertype != 0 && ciphertype != SSH_CIPHER_3DES) goto end; i++; if (len - i < 4) goto end; /* reserved field not present */ if (buf[i] != 0 || buf[i + 1] != 0 || buf[i + 2] != 0 || buf[i + 3] != 0) goto end; + i, key, NULL, 1); if (len - i < 0) goto end; /* overran */ /* Next, the comment field. */ j = GET_32BIT(buf + i); i += 4; if (len - i < j) goto end; comment = smalloc(j + 1); if (comment) { memcpy(comment, buf + i, j); comment[j] = '\0'; } i += j; if (commentptr) *commentptr = comment; if (key) key->comment = comment; if (!key) { return ciphertype != 0; } /* * Decrypt remainder of buffer. */ if (ciphertype) { MD5Init(&md5c); MD5Update(&md5c, passphrase, strlen(passphrase)); MD5Final(keybuf, &md5c); des3_decrypt_pubkey(keybuf, buf + i, (len - i + 7) & ~7); memset(keybuf, 0, sizeof(keybuf)); - i < 4) goto end; if (buf[i] != buf[i + 2] || buf[i + 1] != buf[i + 3]) { ret = -1; goto end; + i, key); if (len - i < 0) goto end; i += ssh1_read_bignum(buf + i, &key->iqmp); if (len - i < 0) goto end; i += ssh1_read_bignum(buf + i, &key->q); if (len - i < 0) goto end; i += ssh1_read_bignum(buf + i, &key->p); if (len - i < 0) goto end; if (!rsa_verify(key)) { freersakey(key); ret = 0; } else ret = 1; { FILE *fp; unsigned char buf[64]; fp = fopen(filename, "rb"); if (!fp) return 0; !strcmp(buf, rsa_signature)) { { FILE *fp; unsigned char buf[64]; fp = fopen(filename, "rb"); if (!fp) return 0; !strcmp(buf, rsa_signature)) { return loadrsakey_main(fp, NULL, comment, NULL); } fclose(fp); return 0; PUT_32BIT(p, strlen(key->comment)); p += 4; memcpy(p, key->comment, strlen(key->comment)); p += strlen(key->comment); } else { PUT_32BIT(p, 0); p[1] = p[-1]; - estart) % 8) *p++ = '\0'; /* * Now encrypt the encrypted portion. */ if (passphrase) { MD5Init(&md5c); MD5Update(&md5c, passphrase, strlen(passphrase)); MD5Final(keybuf, &md5c); des3_encrypt_pubkey(keybuf, estart, p - estart); memset(keybuf, 0, sizeof(keybuf)); int ret = (fwrite(buf, 1, p - buf, fp) == (size_t) (p - buf)); ret = ret && (fclose(fp) == 0); return ret; } else return 0 fp, char *header) fp) { int vals[4]; int i, v, len; unsigned word; char c; ((vals[2] & 0x3F) << 6) | fp, int nlines, int *bloblen) + j, blob + || 0 != strcmp(header, "PuTTY-User-Key-File-1 /* Read the Encryption header line. */ if (!read_header(fp, header) || 0 != cipherblk = 16; } else if (!strcmp(b, "none")) { cipher = 0; != != != strcmp(header, "Private != + + + 2 * error: if (fp) fclose(fp); if (comment) sfree(comment); if (hash) sfree(hash); if (public_blob) sfree(public_blob); if (private_blob) sfree(private_blob); return ret; } char *ssh2_userkey_loadpub(char *filename, char **algorithm, int *pub_blob_len) || 0 != strcmp(header, "PuTTY-User-Key-File-1 /* Read the Encryption header line. */ if (!read_header(fp, header) || 0 != != strcmp(header, "Comment != error: if (fp) fclose(fp); if (public_blob) sfree(public_blob); return NULL; } int ssh2_userkey_encrypted(char *filename, char **commentptr) *commentptr = NULL; fp = fopen(filename, "rb"); if (!fp) return 0; if (!read_header(fp, header) || 0 != strcmp(header, "PuTTY-User-Key-File-1")) { fclose(fp); return 0; } if ((b = read_body(fp)) == NULL) { fclose(fp); != strcmp(header, "Encryption")) { fclose(fp); return 0; } if ((b = read_body(fp)) == NULL) { fclose(fp); return 0; } != strcmp(header, "Comment")) { fclose(fp); sfree(b); return 1; } if ((comment = read_body(fp)) == NULL) { fclose(fp); sfree(b); return 1; } if (commentptr) + 47) / 48; } void base64_encode_atom(unsigned char *data, int n, char *out) fp, unsigned char *data, int datalen) char *passphrase) + + 20); aes256_encrypt_pubkey(key, priv_blob_encrypted, Node-path: putty/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 845f3d21f3f1ab40964875e34dd33034 Text-delta-base-sha1: 22ad0002be6b2c393e267355c147ca9a5f45c042 Text-content-length: 1274 Text-content-md5: 9a6cec468bf7561140f3e55ee7196b0f Text-content-sha1: b7b13960d5b67e81e70b7048d16b735b9fce10df Content-length: 1313 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNJoI% OkR>Ae~QFG0\B Wo7\';. jW { word32 block[HASHINPUT / sizeof(word32)]; word32 digest[HASHSIZE / sizeof(word32)]; int i, j, k; noise_get_light(random_add_noise); SHATransform((word32 *) pool.incoming, (word32 *) / sizeof(*digest); k++) digest[k] ^= ((word32 *) (pool.pool + / sizeof(*digest); k++) ((word32 *) (pool.pool + { unsigned char *p = noise; int i; if (!random_active) pool.incoming, (word32 *) pool.incomingb); for (i = 0; i < HASHSIZE; i++) { pool.pool[pool.poolpos++] ^= pool.incomingb[i]; if (pool.poolpos >= POOLSIZE) pool.poolpos = 0; } if (pool.poolpos < HASHSIZE) { unsigned char *p = noise; int i; while (length >= POOLSIZE) { for (i = 0; i < POOLSIZE; i++) pool.pool[i] ^= *p++; random_stir(); length -= POOLSIZE; } for (i = 0; i < length; i++) for (i = 0; i < POOLSIZE - pool.poolpos; i++) pool.pool[pool.poolpos + i] ^= *p++; random_stir(); length -= POOLSIZE - pool.poolpos; pool.poolpos = 0; } for (i = 0; i < length; i++) pool.pool[i] ^= *p++; pool.poolpos = i; } void random_init(void) { random_stir(); *data = pool.pool + pool.poolpos; *len = POOLSIZE / 2; } Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e4684f1e7b82e3f7da6fb06b6a25076d Text-delta-base-sha1: 44fcfaa2499030387b65dd9875cc28ce9c76036b Text-content-length: 5503 Text-content-md5: 2b6fae866d4519920d95f33c8290a363 Text-content-sha1: 29d20b38fd8e82e3383589a9298b0db88b67a1ec Content-length: 5543 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN,L R[&Ivj|<`7x@9{?+E HaV~{k?qv37Qu# e2qpMPyu] '*& }} -[^RXtT\H{\p>O}5YGJR{$O1j&Mh^?aG$Bj { unsigned char *p = data; int i; if (result) { result->bits = 0; for (i = 0; i < 4; i++) result->bits = (result->bits << 8) + *p++; } else p += ssh1_read_bignum(p, result ? &result->exponent : NULL); if (result) result->bytes = (((p[0] << 8) + p[1]) + 7) / 8; if (keystr) *keystr = p + 2; p += ssh1_read_bignum(p, result ? &result->modulus : NULL); if (order == 1) { Bignum b1, b2; int i; unsigned char *p; memmove(data + key->bytes - length, data, length); data[0] = 0; data[1] = 2; for (i = 2; i < key->bytes - length - - length - = key->bytes; i--;) { + 15) / 16; exlen = (bignum_bitcount(ex) + 15) / 16; return 4 * (mdlen + exlen) + 20; } void rsastr_fmt(char *str, struct RSAKey *key) + len, "0x"); nibbles = (3 + bignum_bitcount(ex)) / 4; if (nibbles < 1) nibbles = 1; for (i = nibbles; i--;) str[len++] = hex[(bignum_byte(ex, i / 2) >> (4 * (i % 2))) & 0xF]; len += sprintf(str + len, ",0x"); nibbles = (3 + bignum_bitcount(md)) / 4; if (nibbles < 1) nibbles = 1; for (i = nibbles; i--;) str[len++] = hex[(bignum_byte(md, i / 2) >> (4 * (i % { struct MD5Context md5c; unsigned char digest[16]; char buffer[16 * 3 + ;) { unsigned char c = bignum_byte(key->modulus, i); ;) { unsigned char c = bignum_byte(key->exponent, i); sprintf(buffer + strlen(buffer), "%s%02x", i ? ":" : "", digest[i]); strncpy(str, buffer, len); str[len - 1] = '\0'; slen = strlen(str); if (key->comment && slen < len - 1) { str[slen] = ' '; strncpy(str + slen + 1, key->comment, len - slen - 1); str[len - return 0; return 1; } void freersakey(struct RSAKey *key) { if (key->modulus) freebn(key->modulus); if (key->exponent) freebn(key->exponent); if (key->private_exponent) freebn(key->private_exponent); if (key->comment) { *p = NULL; if (*datalen < 4) return; *length = GET_32BIT(*data); *datalen -= 4; *data += 4; if (*datalen < *length) return; *p = *data; *data += *length; *datalen -= *length; } static Bignum getmp(char **data, int *datalen) { char *p; int slen; struct RSAKey *rsa; rsa = smalloc(sizeof(struct RSAKey)); if (!rsa) { struct RSAKey *rsa = (struct RSAKey *) { struct RSAKey *rsa = (struct RSAKey *) key; char *p; int len; len = rsastr_len(rsa); p = smalloc(len); rsastr_fmt(p, rsa); return p; } static unsigned char *rsa2_public_blob(void *key, int *len) { struct RSAKey *rsa = (struct RSAKey *) + 8) / 8; mlen = (bignum_bitcount(rsa->modulus) + 8) / + elen + mlen; blob = smalloc(bloblen); p = blob; PUT_32BIT(p, 7); p += 4; memcpy(p, "ssh-rsa", 7); p += 7; PUT_32BIT(p, elen); p += 4; for (i = elen; i--;) *p++ = bignum_byte(rsa->exponent, i); PUT_32BIT(p, mlen); p += 4; for (i = mlen; i--;) { struct RSAKey *rsa = (struct RSAKey *) + 8) / 8; plen = (bignum_bitcount(rsa->p) + 8) / 8; qlen = (bignum_bitcount(rsa->q) + 8) / 8; ulen = (bignum_bitcount(rsa->iqmp) + 8) / + dlen + plen + qlen + ulen; blob = smalloc(bloblen); p = blob; PUT_32BIT(p, dlen); p += 4; for (i = dlen; i--;) *p++ = bignum_byte(rsa->private_exponent, i); PUT_32BIT(p, plen); p += 4; for (i = plen; i--;) *p++ = bignum_byte(rsa->p, i); PUT_32BIT(p, qlen); p += 4; for (i = qlen; i--;) *p++ = bignum_byte(rsa->q, i); PUT_32BIT(p, ulen); p += 4; for (i = ulen; i--;) { struct RSAKey *rsa; char *pb = (char *) priv_blob; rsa = rsa2_newkey((char *) { char **b = (char **) blob; struct RSAKey *rsa; rsa = smalloc(sizeof(struct RSAKey)); if (!rsa) { struct RSAKey *rsa = (struct RSAKey *) { struct RSAKey *rsa = (struct RSAKey *) * 3 + sprintf(buffer + strlen(buffer), "%s%02x", i ? ":" : "", digest[i]); ret = smalloc(strlen(buffer) + 1); if (ret) 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, char *data, int datalen) { struct RSAKey *rsa = (struct RSAKey *) - 1) != 0) - 2) != 1) ret = 0; /* Most of the rest should be FF. */ for (i = bytes - 3; i >= 20 + ASN1_LEN; i--) { if (bignum_byte(out, i) != 0xFF) = 0; i >= 20; i--, j++) { if (bignum_byte(out, i) != asn1_weird_stuff[j]) = 0; i >= 0; i--, j++) { if (bignum_byte(out, i) != hash[j]) ret = 0; } return ret; } unsigned char *rsa2_sign(void *key, char *data, int datalen, int *siglen) { struct RSAKey *rsa = (struct RSAKey *) - 1) / 8; bytes = smalloc(nbytes); bytes[0] = 1; for (i = 1; i < nbytes - 20 - ASN1_LEN; i++) bytes[i] = 0xFF; for (i = nbytes - 20 - ASN1_LEN, j = 0; i < nbytes - 20; i++, j++) bytes[i] = asn1_weird_stuff[j]; for (i = nbytes - 20, j = 0; i < nbytes; i++, + 7) / 8; bytes = smalloc(4 + 7 + 4 + nbytes); PUT_32BIT(bytes, 7); memcpy(bytes + 4, "ssh-rsa", 7); PUT_32BIT(bytes + 4 + 7, nbytes); for (i = 0; i < nbytes; i++) bytes[4 + 7 + 4 + i] = bignum_byte(out, nbytes - 1 - i); freebn(out); *siglen = 4 + 7 + 4 + Node-path: putty/sshrsag.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 84e4719f37e896f71329331bd622bfa1 Text-delta-base-sha1: f7817e6dff640c9cb3908cd7c8a58a4f6defd39d Text-content-length: 629 Text-content-md5: faa477e4f0dd2287ab953db4c08693ff Text-content-sha1: 7c56d5a1e8071e0c4d94f2f27625d6a388320141 Content-length: 668 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNeV,=H(fsUn TA Ng32 /* we like this prime */ #if 0 /* bignum diagnostic function */ static void diagbn(char *prefix, Bignum md) / 4; if (nibbles < 1) nibbles = 1; morenibbles = 4 * md[0] - nibbles; for (i = 0; i < morenibbles; i++) putchar('-'); for (i = nibbles; i--;) putchar(hex[(bignum_byte(md, i / 2) >> (4 * (i % 2))) & 0xF]); if (prefix) void *pfnparam) / (bits / 2)); pfn(pfnparam, -2, -0x1D57C4 / (bits - bits / / 2, RSA_EXPONENT, 1, 1, pfn, pfnparam); key->q = primegen(bits - bits / Bignum t = key->p; key->p = key->q; Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 72eef2e5146cc0a821b2fa55c0c6d076 Text-delta-base-sha1: 013dfa2754c046fc5a4caf0dd6c8481be2bd6afd Text-content-length: 3088 Text-content-md5: 79d75b5eb1eafc9c867bfc8c6a3f995b Text-content-sha1: e692c7aff01d42cfc0effd4a6835e3a5d667683e Content-length: 3128 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNe[\_TZTirAI8g`F|>Cc"O ml;/X;OhinRpb0 a& >K digest, word32 * block) { word32 w[80]; word32 a, b, c, d, e; int t; for (t = 0; t < 16; t++) w[t] = block[t]; for (t = 16; t < 80; t++) { word32 tmp = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]; word32 tmp = rol(a, 5) + ((b & c) | (d & ~b)) + e + w[t] + 0x5a827999; e = d; d = c; c = rol(b, 30); b = a; a = tmp; } for (t = 20; t < 40; t++) { word32 tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0x6ed9eba1; e = d; d = c; c = rol(b, 30); b = a; a = tmp; } for (t = 40; t < 60; t++) { word32 tmp = rol(a, 5) + ((b & c) | (b & d) | (c & d)) + e + w[t] + 0x8f1bbcdc; e = d; d = c; c = rol(b, 30); b = a; a = tmp; } for (t = 60; t < 80; t++) { word32 tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0xca62c1d6; e = d; d = c; c = rol(b, 30); b = a; s) s, void *p, int len) { unsigned char *q = (unsigned char *) + len < 64) { /* * Trivial case: just add to the block. */ memcpy(s->block + s->blkused, q, len); s->blkused += len; } else { /* * We must complete and process at least one block. */ while (s->blkused + len >= 64) { memcpy(s->block + s->blkused, q, 64 - s->blkused); q += 64 - s->blkused; len -= 64 - s->blkused; /* Now process the block. Gather bytes big-endian into words */ for (i = 0; i < 16; i++) { wordblock[i] = (((uint32) s->block[i * 4 + 0]) << 24) | (((uint32) s->block[i * 4 + 1]) << 16) | (((uint32) s->block[i * 4 + 2]) << 8) | (((uint32) s->block[i * 4 + 3]) << 0); } SHATransform(s->h, wordblock); s->blkused = 0; } memcpy(s->block, q, len); s->blkused = len; } } void SHA_Final(SHA_State * s, unsigned char *output) pad = 56 + 64 - s->blkused; else - 8) & 0xFF; c[3] = (lenhi >>8) & 0xFF; c[7] = (lenlo >> 0) & 0xFF; SHA_Bytes(s, &c, 8); for (i = 0; i < 5; i++) { output[i * 4] = (s->h[i] >> 24) & 0xFF; output[i * 4 + 1] = (s->h[i] >> 16) & 0xFF; output[i * 4 + 2] = (s->h[i] >> 8) & 0xFF; output[i * 4 + 3] = (s->h[i]) & 0xFF; } } void SHA_Simple(void *p, int len, unsigned char *output) s1, SHA_State * s2, unsigned char *key, int len) /* burn the evidence */ } static void sha1_cskey(unsigned char *key) { sha1_key(&sha1_cs_mac_s1, &sha1_cs_mac_s2, key, 16); } static void sha1_sckey_buggy(unsigned char *key) s1, SHA_State * s2, unsigned char *blk, int len, unsigned long seq, unsigned char *hmac) { SHA_State s; unsigned char intermediate[20]; intermediate[0] = (unsigned char) ((seq >> 24) & 0xFF); intermediate[1] = (unsigned char) ((seq >> 16) & 0xFF); intermediate[2] = (unsigned char) ((seq >> 8) & 0xFF); intermediate[3] = (unsigned char) ((seq) & 0xFF); s = *s1; { sha1_do_hmac(&sha1_cs_mac_s1, &sha1_cs_mac_s2, blk, len, seq, blk + len); } static int sha1_verify(unsigned char *blk, int len, unsigned long seq) + Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 397e3695a3025a487b2f9071cf5cbf99 Text-delta-base-sha1: 28e5d05446cf4097822ab4654044937cf0fd3cc1 Text-content-length: 14177 Text-content-md5: b459256a046e044dc366a082a1815f3f Text-content-sha1: b1c61f8b3e38d4c4dccfa9dea4a7c9e45454e149 Content-length: 14216 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN+%;^Vn06zY.PYx'x "0r(&/V`Ty&qtZfI@= Y'_b /#o1 e >8IGfQz!YUkb3Mow [;Z5%>lPet6.2dOsGPPiq (struct LZ77Context * ctx, unsigned char c); void (*match) (struct LZ77Context * { return (257 * data[0] + 263 * data[1] + 269 * data[2]) % HASHMAX; } static int lz77_init(struct LZ77Context *ctx) - unsigned char *data, int len, int compress) - + /* Don't even look for a match, if we're not compressing. */ if (compress && len >= HASHCHARS) { /* * Hash the next few characters. */ hash = lz77_hash(data); /* * Look the hash up in the corresponding hash chain and see * what we can find. */ nmatch = 0; for (off = st->hashtab[hash].first; off != INVALID; off = st->win[off].next) { /* distance = 1 if off == st->winpos-1 */ /* distance = WINSIZE if off == st->winpos */ distance = WINSIZE - (off + WINSIZE - st->winpos) % WINSIZE; for (i = 0; i < HASHCHARS; i++) if (CHARAT(i) != CHARAT(i - distance)) break; if (i == HASHCHARS) { matches[nmatch].distance = distance; matches[nmatch].len = 3; if (++nmatch >= MAXMATCH) break; } } } else { if (out->outlen >= out->outsize) { out->outsize = out->outlen + 64; out->outbuf = srealloc(out->outbuf, out->outsize); } out->outbuf[out->outlen++] = (unsigned char) (out->outbits & 0xFF); out->outbits >>= 8; 3}, {258, 0, 4, 4}, {259, 0, 5, 5}, {260, 0, 6, 6}, {261, 0, 7, 7}, {262, 0, 8, 8}, {263, 0, 9, 9}, {264, 0, 10, 10}, {265, 1, 11, 12}, {266, 1, 13, 14}, {267, 1, 15, 16}, {268, 1, 17, 18}, {269, 2, 19, 22}, {270, 2, 23, 26}, {271, 2, 27, 30}, {272, 2, 31, 34}, {273, 3, 35, 42}, {274, 3, 43, 50}, {275, 3, 51, 58}, {276, 3, 59, 66}, {277, 4, 67, 82}, {278, 4, 83, 98}, {279, 4, 99, 114}, {280, 4, 115, 130}, {281, 5, 131, 162}, {282, 5, 163, 194}, {283, 5, 195, 226}, {284, 5, 227, 257}, {285, 0, 258, 258}, }; static const coderecord distcodes[] = { {0, 0, 1, 1}, {1, 0, 2, 2}, {2, 0, 3, 3}, {3, 0, 4, 4}, {4, 1, 5, 6}, {5, 1, 7, 8}, {6, 2, 9, 12}, {7, 2, 13, 16}, {8, 3, 17, 24}, {9, 3, 25, 32}, {10, 4, 33, 48}, {11, 4, 49, 64}, {12, 5, 65, 96}, {13, 5, 97, 128}, {14, 6, 129, 192}, {15, 6, 193, 256}, {16, 7, 257, 384}, {17, 7, 385, 512}, {18, 8, 513, 768}, {19, 8, 769, 1024}, {20, 9, 1025, 1536}, {21, 9, 1537, 2048}, {22, 10, 2049, 3072}, {23, 10, 3073, 4096}, {24, 11, 4097, 6144}, {25, 11, 6145, 8192}, {26, 12, 8193, 12288}, {27, 12, 12289, 16384}, {28, 13, 16385, 24576}, {29, 13, 24577, 32768}, }; static void zlib_literal(struct LZ77Context *ectx, unsigned char c) { struct Outbuf *out = (struct Outbuf *) ectx->userdata; if (out->comp_disabled) { /* * We're in an uncompressed block, so just output the byte. */ outbits(out, c, 8); return; } if (c <= 143) { /* 0 through 143 are 8 bits long starting at 00110000. */ outbits(out, mirrorbytes[0x30 + c], 8); } else { /* 144 through 255 are 9 bits long starting at 110010000. */ outbits(out, 1 + 2 * int thislen; - 3); len -= thislen; /* * Binary-search to find which length code we're * transmitting. */ i = -1; j = sizeof(lencodes) / sizeof(*lencodes); while (j - i >= 2) { k = (j + i) / 2; if (thislen < lencodes[k].min) j = k; else if (thislen > lencodes[k].max) i = k; else { l = &lencodes[k]; break; /* found it! */ } } /* * Transmit the length code. 256-279 are seven bits * starting at 0000000; 280-287 are eight bits starting at * 11000000. */ if (l->code <= 279) { outbits(out, mirrorbytes[(l->code - 256) * 2], 7); } else { outbits(out, mirrorbytes[0xc0 - 280 + l->code], 8); } /* * Transmit the extra bits. */ if (l->extrabits) outbits(out, thislen - l->min, l->extrabits); /* * Binary-search to find which distance code we're * transmitting. */ i = -1; j = sizeof(distcodes) / sizeof(*distcodes); while (j - i >= 2) { k = (j + i) / 2; if (distance < distcodes[k].min) j = k; else if (distance > distcodes[k].max) i = k; else { d = &distcodes[k]; break; /* found it! */ } } /* * Transmit the distance code. Five bits starting at 00000. */ outbits(out, mirrorbytes[d->code * 8], 5); /* * Transmit the extra bits. */ if (d->extrabits) { struct Outbuf *out = (struct Outbuf *) n = 3; } else { /* * Otherwise, we will output seven bits to close the * previous static block, and _then_ three bits to begin an * uncompressed block, and then flush the current byte. * This may cost two bytes or three, depending on noutbits. */ { struct Outbuf *out = (struct Outbuf *) outbits(out, 0x9C78, 16); out->firstblock = 0; in_block = FALSE; } if (out->comp_disabled) { if (in_block) outbits(out, 0, 7); /* close static block */ while (len > 0) { int blen = (len < 65535 ? len : 65535); /* * Start a Deflate (RFC1951) uncompressed block. We * transmit a zero bit (BFINAL=0), followed by a zero * bit and a one bit (BTYPE=00). Of course these are in * the wrong order (00 0). */ outbits(out, 0, 3); /* * Output zero bits to align to a byte boundary. */ if (out->noutbits) outbits(out, 0, 8 - out->noutbits); /* * Output the block length, and then its one's * complement. They're little-endian, so all we need to * do is pass them straight to outbits() with bit count * 16. */ outbits(out, blen, 16); outbits(out, blen ^ 0xFFFF, 16); /* * Do the `compression': we need to pass the data to * lz77_compress so that it will be taken into account * for subsequent (distance,length) pairs. But * lz77_compress is passed FALSE, which means it won't * actually find (or even look for) any matches; so * every character will be passed straight to * zlib_literal which will spot out->comp_disabled and * emit in the uncompressed format. */ lz77_compress(&ectx, block, blen, FALSE); len -= blen; block += blen; } outbits(out, 2, 3); /* open new block */ } else { if (!in_block) { /* * Start a Deflate (RFC1951) fixed-trees block. We * transmit a zero bit (BFINAL=0), followed by a zero * bit and a one bit (BTYPE=01). Of course these are in * the wrong order (01 0). */ outbits(out, 2, 3); } /* * Do the compression. */ lz77_compress(&ectx, block, len, TRUE); /* * End the block (by transmitting code 256, which is * 0000000 in fixed-tree mode), and transmit some empty * blocks to ensure we have emitted the byte containing the * last piece of genuine data. There are three ways we can * do this: * * - Minimal flush. Output end-of-block and then open a * new static block. This takes 9 bits, which is * guaranteed to flush out the last genuine code in the * closed block; but allegedly zlib can't handle it. * * - Zlib partial flush. Output EOB, open and close an * empty static block, and _then_ open the new block. * This is the best zlib can handle. * * - Zlib sync flush. Output EOB, then an empty * _uncompressed_ block (000, then sync to byte * boundary, then send bytes 00 00 FF FF). Then open the * new block. * * For the moment, we will use Zlib partial flush. */ outbits(out, 0, 7); /* close block */ outbits(out, 2, 3 + 7); /* empty static block */ outbits(out, 2, 3); int nsyms, int pfx, int pfxbits, int bits) tab->table[code].code = -1; tab->table[code].nbits = 0; tab->table[code].nexttable = NULL; } for (i = 0; i < nsyms; i++) { if (lengths[i] <= pfxbits || (codes[i] & pfxmask) != pfx) continue; code = (codes[i] >> pfxbits) & tab->mask; for (j = code; j <= tab->mask; j += 1 << (lengths[i] - pfxbits)) { tab->table[j].code = i; nbits = lengths[i] - pfxbits; if (tab->table[j].nbits < nbits) tab->table[j].nbits = nbits; } } for (code = 0; code <= tab->mask; code++) { if (tab->table[code].nbits <= bits) continue; /* Generate a subtable. */ tab->table[code].code = -1; nbits = tab->table[code].nbits - bits; if (nbits > 7) nbits = 7; tab->table[code].nbits = bits; tab->table[code].nexttable = zlib_mkonetab(codes, lengths, nsyms, pfx | (code << pfxbits), int nlengths) count[i] = 0; for (i = 0; i < nlengths; i++) { count[lengths[i]]++; if (maxlen < lengths[i]) startcode[i] = code; code += count[i]; code = startcode[lengths[i]]++; codes[i] = 0; for (j = 0; j < lengths[i]; j++) { codes[i] = (codes[i] << 1) | (code & 1); code >>= 1; maxlen < 9 ? maxlen : 9); } static int zlib_freetable(struct zlib_table **ztab) START, OUTSIDEBLK, TREES_HDR, TREES_LENLEN, TREES_LEN, TREES_LENREP, INBLK, GOTLENSYM, GOTLEN, GOTDISTSYM, lenrep; int uncomplen; unsigned char lenlen[19]; unsigned char lengths[286 + { unsigned char lengths[288]; memset(lengths, 8, 144); memset(lengths + 144, 9, 256 - 144); memset(lengths + 256, 7, 280 - 256); memset(lengths + 280, 8, 288 - struct zlib_table *tab) { unsigned long bits = *bitsp; int nbits = *nbitsp; while (1) { struct zlib_tableentry *ent; ent = &tab->table[bits & tab->mask]; if (ent->nbits > nbits) return -1; /* not enough data */ bits >>= ent->nbits; nbits -= ent->nbits; if (ent->code == -1) tab = ent->nexttable; else { *bitsp = bits; *nbitsp = nbits; return ent->code; } } } static void zlib_emit_char(int c) { dctx.window[dctx.winpos] = c; dctx.winpos = (dctx.winpos + 1) & (WINSIZE - while (dctx.nbits < 24 && len > 0) { dctx.bits |= (*block++) << dctx.nbits; dctx.nbits += 8; len--; } switch (dctx.state) { case START: /* Expect 16-bit zlib header, which we'll dishonourably ignore. */ if (dctx.nbits < 16) goto finished; /* done all we can */ EATBITS(16); dctx.state = OUTSIDEBLK; break; case OUTSIDEBLK: /* Expect 3-bit block header. */ if (dctx.nbits < 3) goto finished; /* done all we can */ EATBITS(1); blktype = dctx.bits & 3; EATBITS(2); if (blktype == 0) { int to_eat = dctx.nbits & 7; } else if (blktype == 1) { dctx.currlentable = dctx.staticlentable; dctx.currdisttable = dctx.staticdisttable; dctx.state = INBLK; } else if (blktype == 2) { dctx.state = TREES_HDR; } break; case TREES_HDR: /* * Dynamic block header. Five bits of HLIT, five of * HDIST, four of HCLEN. */ if (dctx.nbits < 5 + 5 + 4) goto finished; /* done all we can */ dctx.hlit = 257 + (dctx.bits & 31); EATBITS(5); dctx.hdist = 1 + (dctx.bits & 31); EATBITS(5); dctx.hclen = 4 + (dctx.bits & 15); EATBITS(4); dctx.lenptr = 0; dctx.state = TREES_LENLEN; memset(dctx.lenlen, 0, sizeof(dctx.lenlen)); break; case TREES_LENLEN: if (dctx.nbits < 3) goto finished; while (dctx.lenptr < dctx.hclen && dctx.nbits >= 3) { dctx.lenlen[lenlenmap[dctx.lenptr++]] = (unsigned char) (dctx.bits & 7); EATBITS(3); } if (dctx.lenptr == dctx.hclen) { dctx.lenlentable = zlib_mktable(dctx.lenlen, 19); dctx.state = TREES_LEN; dctx.lenptr = 0; } break; case TREES_LEN: if (dctx.lenptr >= dctx.hlit + dctx.hdist) { dctx.currlentable = zlib_mktable(dctx.lengths, dctx.hlit); dctx.currdisttable = zlib_mktable(dctx.lengths + dctx.hlit, dctx.hdist); zlib_freetable(&dctx.lenlentable); dctx.state = INBLK; break; } code = zlib_huflookup(&dctx.bits, &dctx.nbits, dctx.lenlentable); if (code == -1) goto finished; if (code < 16) dctx.lengths[dctx.lenptr++] = code; else { dctx.lenextrabits = (code == 16 ? 2 : code == 17 ? 3 : 7); dctx.lenaddon = (code == 18 ? 11 : 3); dctx.lenrep = (code == 16 && dctx.lenptr > 0 ? dctx.lengths[dctx.lenptr - 1] : 0); dctx.state = TREES_LENREP; } break; case TREES_LENREP: if (dctx.nbits < dctx.lenextrabits) goto finished; rep = dctx.lenaddon + (dctx.bits & ((1 << dctx.lenextrabits) - 1)); EATBITS(dctx.lenextrabits); while (rep > 0 && dctx.lenptr < dctx.hlit + dctx.hdist) { dctx.lengths[dctx.lenptr] = dctx.lenrep; dctx.lenptr++; rep--; } dctx.state = TREES_LEN; break; case INBLK: code = zlib_huflookup(&dctx.bits, &dctx.nbits, dctx.currlentable); if (code == -1) goto finished; if (code < 256) zlib_emit_char(code); else if (code == 256) { } else if (code < 286) { /* static tree can give >285; ignore */ dctx.state = GOTLENSYM; dctx.sym = code; } break; case GOTLENSYM: rec = &lencodes[dctx.sym - 257]; if (dctx.nbits < rec->extrabits) goto finished; dctx.len = rec->min + (dctx.bits & ((1 << rec->extrabits) - 1)); EATBITS(rec->extrabits); dctx.state = GOTLEN; break; case GOTLEN: code = zlib_huflookup(&dctx.bits, &dctx.nbits, dctx.currdisttable); if (code == -1) goto finished; dctx.state = GOTDISTSYM; dctx.sym = code; break; case GOTDISTSYM: rec = &distcodes[dctx.sym]; if (dctx.nbits < rec->extrabits) goto finished; dist = rec->min + (dctx.bits & ((1 << rec->extrabits) - 1)); EATBITS(rec->extrabits); dctx.state = INBLK; while (dctx.len--) zlib_emit_char(dctx.window[(dctx.winpos - dist) & (WINSIZE - /* end of uncompressed block */ break; } } Node-path: putty/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2c3f5cd46f425ea4c3224fad59d41f89 Text-delta-base-sha1: 56dc332525593592a1e994397b4896faa1a00814 Text-content-length: 22 Text-content-md5: 1cf7de95ffd64454038cb893f570921e Text-content-sha1: fc65f43ca7258a9977374494fd626cb984094b0c Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN III Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1a89a2ced6d0a876c90e9d9c86daa7ac Text-delta-base-sha1: 2f5d59526bc6c6591a5e7f63bba14d108e6fed93 Text-content-length: 9800 Text-content-md5: 573fffb2bc1bc8a4d259425da06fb6c7 Text-content-sha1: df67eef876a01a6f6fb285162b3044a85df262b2 Content-length: 9840 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN;4+D'B?Tr$x Fuh>TnsP93 %k@f<w#FWd]Kb`KQp`| !'ZiQbs"VoyC(JS0Ej#H;-F07.V~`UO6K`W.v.-A7 IBW!R:vJIns h usIr /* interpret as command: */ #define DONT 254 /* you are not to use option */ #define DO 253 /* please, you use option */ #define WONT 252 /* I won't use option */ #define WILL 251 /* I will use option */ #define SB 250 /* interpret as subnegotiation */ #define SE 240 /* end sub negotiation */ #define GA 249 /* you may reverse the line */ #define EL 248 /* erase the current line */ #define EC 247 /* erase the current character */ #define AYT 246 /* are you there */ #define AO 245 /* abort output--but let prog finish */ #define IP 244 /* interrupt process--permanently */ #define BREAK 243 /* break */ #define DM 242 /* data mark--for connect. cleaning */ #define NOP 241 /* nop */ #define EOR 239 /* end of record (transparent mode) */ #define ABORT 238 /* Abort process */ #define SUSP 237 /* Suspend process */ #define xEOF 236 /* End of file: EOF is already used... */ #define TELOPT_BINARY 0 /* 8-bit data path */ #define TELOPT_ECHO 1 /* echo */ #define TELOPT_RCP 2 /* prepare to reconnect */ #define TELOPT_SGA 3 /* suppress go ahead */ #define TELOPT_NAMS 4 /* approximate message size */ #define TELOPT_STATUS 5 /* give status */ #define TELOPT_TM 6 /* timing mark */ #define TELOPT_RCTE 7 /* remote controlled transmission and echo */ #define TELOPT_NAOL 8 /* negotiate about output line width */ #define TELOPT_NAOP 9 /* negotiate about output page size */ #define TELOPT_NAOCRD 10 /* negotiate about CR disposition */ #define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */ #define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */ #define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */ #define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */ #define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */ #define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */ #define TELOPT_XASCII 17 /* extended ascic character set */ #define TELOPT_LOGOUT 18 /* force logout */ #define TELOPT_BM 19 /* byte macro */ #define TELOPT_DET 20 /* data entry terminal */ #define TELOPT_SUPDUP 21 /* supdup protocol */ #define TELOPT_SUPDUPOUTPUT 22 /* supdup output */ #define TELOPT_SNDLOC 23 /* send location */ #define TELOPT_TTYPE 24 /* terminal type */ #define TELOPT_EOR 25 /* end or record */ #define TELOPT_TUID 26 /* TACACS user identification */ #define TELOPT_OUTMRK 27 /* output marking */ #define TELOPT_TTYLOC 28 /* terminal location number */ #define TELOPT_3270REGIME 29 /* 3270 regime */ #define TELOPT_X3PAD 30 /* X.3 PAD */ #define TELOPT_NAWS 31 /* window size */ #define TELOPT_TSPEED 32 /* terminal speed */ #define TELOPT_LFLOW 33 /* remote flow control */ #define TELOPT_LINEMODE 34 /* Linemode option */ #define TELOPT_XDISPLOC 35 /* X Display Location */ #define TELOPT_OLD_ENVIRON 36 /* Authenticate */ #define TELOPT_ENCRYPT 38 /* Encryption option */ #define TELOPT_NEW_ENVIRON 39 /* New - Environment variables */ #define TELOPT_EXOPL 255 /* extended-options-list */ #define TELQUAL_IS 0 /* option is... */ #define TELQUAL_SEND 1 /* send option */ #define TELQUAL_INFO 2 { #define i(x) if (opt == TELOPT_ ## x) return #x; i(BINARY); i(ECHO); i(RCP); i(SGA); i(NAMS); i(STATUS); i(TM); i(RCTE); i(NAOL); i(NAOP); i(NAOCRD); i(NAOHTS); i(NAOHTD); i(NAOFFD); i(NAOVTS); i(NAOVTD); i(NAOLFD); i(XASCII); i(LOGOUT); i(BM); i(DET); i(SUPDUP); i(SUPDUPOUTPUT); i(SNDLOC); i(TTYPE); i(EOR); i(TUID); i(OUTMRK); i(TTYLOC); i(X3PAD); i(NAWS); i(TSPEED); i(LFLOW); i(LINEMODE); i(XDISPLOC); i(OLD_ENVIRON); i(AUTHENTICATION); i(ENCRYPT); i(NEW_ENVIRON); { WILL, WONT, DO, DONT, TELOPT_NAWS, REQUESTED }; static struct Opt o_tspeed = { WILL, WONT, DO, DONT, TELOPT_TSPEED, REQUESTED }; static struct Opt o_ttype = { WILL, WONT, DO, DONT, TELOPT_TTYPE, REQUESTED }; static struct Opt o_oenv = { WILL, WONT, DO, DONT, TELOPT_OLD_ENVIRON, INACTIVE }; static struct Opt o_nenv = { WILL, WONT, DO, DONT, TELOPT_NEW_ENVIRON, REQUESTED }; static struct Opt o_echo = { DO, DONT, WILL, WONT, TELOPT_ECHO, REQUESTED }; static struct Opt o_we_sga = { WILL, WONT, DO, DONT, TELOPT_SGA, REQUESTED }; static struct Opt o_they_sga = { DO, DONT, WILL, WONT, TELOPT_SGA, REQUESTED { char cc = (char) c; from_backend(0, &cc, 1); } static void log_option(char *sender, int cmd, int option) (int cmd, int option) { unsigned char b[3]; b[0] = IAC; b[1] = cmd; (struct Opt *o) { if (o->state == REQUESTED || o->state == ACTIVE) send_opt { if (o->option == TELOPT_ECHO && o->send == DO) echoing = !enabled; else if (o->option == TELOPT_SGA && o->send == DO) editing = !enabled; ldisc_send(NULL, 0); /* cause ldisc to notice the change */ } static void activate_option(struct Opt *o) (o->option == (struct Opt *o) (int cmd, int option) { struct Opt **o; log_option((*o)->send, option); activate_option(*o); break; case REALLY_INACTIVE: send_opt(*o); break; case ACTIVE: (*o)->state = INACTIVE; send_opt((*o)->nsend, option); ((cmd == WILL ? DONT : WONT), option); } static void process_subneg(void) + 80]; b[0] = IAC; b[1] = SB; b[2] = TELOPT_TSPEED; b[3] = TELQUAL_IS; strcpy(b + 4, cfg.termspeed); n = 4 + strlen(cfg.termspeed); b[n] = IAC; b[n + 1] = SE; sk_write(s, b, n + (logbuf); } else logevent + 80]; b[0] = IAC; b[1] = SB; + 4] = (cfg.termtype[n] >= 'a' && cfg.termtype[n] <= 'z' ? cfg.termtype[n] + 'A' - 'a' : cfg.termtype[n]); b[n + 4] = IAC; b[n + 5] = SE; sk_write(s, b, n + 6); b[n + + (logbuf, "server:\tSB %s SEND", telopt(sb_opt)); logevent b[1] = SB; b[2] = sb_opt; b[3] = TELQUAL_IS; n = 4; b[n++] = *e++; if (*e == '\t') e++; b[n++] = value; while (*e) b[n++] = *e++; e++; } if (*cfg.username) { b[n++] = var; b[n++] = 'U'; b[n++] = 'S'; b[n++] = 'E'; b[n++] = 'R'; b[n++] = value; e = cfg.username; while (*e) b[n++] = *e++; } b[n++] = IAC; == 6 ? "" : ""); logevent(char *buf, int len) telnet_state = SEENDO; else if (c == DONT) telnet_state = SEENDONT; else if (c == WILL) telnet_state = SEENWILL; else if (c == WONT) telnet_state = SEENWONT; else if (c == SB) telnet_state = SEENSB; else if (c == DM) { in_synch = 0; telnet_state = TOPLEVEL; }(WILL, c); telnet_state = TOPLEVEL; break; case SEENWONT: proc_rec_opt(WONT, c); telnet_state = TOPLEVEL; break; case SEENDO: proc_rec_opt (Plug plug, char *error_msg, int error_code, int calling_back) { sk_close(s); s = NULL; if (error_msg) { /* A socket error has occurred. */ connection_fatal(error_msg); } { if (urgent) in_synch = TRUE; do_telnet_read(char *host, int port, char **realhost) (err = sk_addr_error(addr))(err = sk_socket_error(s))(char *buf, int len) + len) { char *q = p; while (iswritable((unsigned char) *p) && p < buf + len) p++; sk_write(s, q, p - q); while (p < buf + len && !iswritable((unsigned char) *p)) { sk_write(s, (unsigned char) b[1] = SB; b[2] = TELOPT_NAWS; b[3] = cols >> 8; b[4] = cols & 0xFF; b[5] = rows >> 8; b[6] = rows & 0xFF; b[7] = IAC; b[8] = SE; sk_write(s, b, 9); sprintf(logbuf, "client:\tSB NAWS %d,%d", ((unsigned char) b[3] << 8) + (unsigned char) b[4], ((unsigned char) b[5] << 8) + (unsigned char) b[6]); logevent(logbuf); } /* * Send Telnet special codes. */ static void telnet_special(Telnet_Special code) b[1] = AYT; sk_write(s, b, 2); break; case TS_BRK: b[1] = BREAK; sk_write(s, b, 2); break; case TS_EC: b[1] = EC; sk_write(s, b, 2); break; case TS_EL: b[1] = EL; sk_write(s, b, 2); break; case TS_GA: b[1] = GA; sk_write(s, b, 2); break; case TS_NOP: b[1] = NOP; sk_write(s, b, 2); break; case TS_ABORT: b[1] = ABORT; sk_write(s, b, 2); break; case TS_AO: b[1] = AO; sk_write(s, b, 2); break; case TS_IP: b[1] = IP; sk_write(s, b, 2); break; case TS_SUSP: b[1] = SUSP; sk_write(s, b, 2); break; case TS_EOR: b[1] = EOR; sk_write(s, b, 2); break; case TS_EOF: b[1] = xEOF; sk_write(s, b, 2); break; case TS_SYNCH: b[1] = DM; sk_write(s, b, 1); sk_write_oob(s, b + 1, 1); (o_echo.nsend, o_echo.option); } break; case TS_PING: if (o_they_sga.state == ACTIVE) { b[1] = NOP; sk_write(s, b, 2); } break; } } static Socket telnet_socket(void) { return s; } static int telnet_sendok(void) { return 1; } static int telnet_ldisc(int option) { if (option == LD_ECHO) return echoing; if (option == LD_EDIT) Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b46ec9b3cf6b9fd210acd7ffeb9abb5c Text-delta-base-sha1: 2a89652f8cc043cad5cf785fa4c17b213818671d Text-content-length: 39042 Text-content-md5: 0efd4ed7d44d2350cdce03ac2131328d Text-content-sha1: 796358234d704fd74f4325d04b6feac118223b37 Content-length: 39082 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVNm f:<J7z-sstCXw )Qm`E~_>Hd t]1I| lt5aPNbs|+ /RDGa+Ngw&A?@h3]GP=y.>t)#DrEM6``8p )U6Hiv&PG KRr[R( kZ&voL]sSU-&t$i8s` /_>kgS 9x| BxcRx^Ovy1@{hCrk=(@;iy%zwZclpob_>  /* Codes in all ANSI like terminals. */ #define CL_VT100 0x0002 /* VT100 */ #define CL_VT100AVO 0x0004 /* VT100 +AVO; 132x24 (not 132x14) & attrs */ #define CL_VT102 0x0008 /* VT102 */ #define CL_VT220 0x0010 /* VT220 */ #define CL_VT320 0x0020 /* VT320 */ #define CL_VT420 0x0040 /* VT420 */ #define CL_VT510 0x0080 /* VT510, NB VT510 includes ANSI */ #define CL_VT340TEXT 0x0100 /* SCOANSI not in ANSIMIN. */ #define CL_ANSI 0x2000 /* ANSI ECMA-48 not in the VT100..VT420 */ #define CL_OTHER 0x4000 /* Does terminal want local echo? */ static int term_editing; /* Does terminal want local edit? */ static int xterm_mouse; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 01 */ 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, /* 23 */ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, /* 45 */ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, /* 67 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 89 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* AB */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, /* CD */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, /* EF */ }; static unsigned char sel_nl[] = SEL_NL; static char *(Context, int); static void erase_lots(int, int, int); static void swap_screen(int); static void update_sbar(void); static void deselect + 1]; delpos234(whichtree, treeindex); line = srealloc(line, TSIZE * (2 + cols)); line[0] = cols; for (i = oldlen; i < cols; i++) line[i + 1] = ERASE_CHAR; line[cols + 1] = lineattrs & LATTR_MODE; addpos234(whichtree, line, treeindex); } return line + 1; } (1); erase_lots(FALSE, TRUE, TRUE); swap_screen(0); erase_lots(FALSE, TRUE, TRUE); } } /* * Force a screen update. */ void term_update(void) { Context ctx; ctx = get_ctx(); if (ctx) { if ((seen_key_event && (cfg.scroll_on_key)) || (seen_disp_event && (cfg.scroll_on_disp))(ctx, TRUE); sys_cursor(curs.x, curs.y - disptop); free_ctx(ctx); } } /* * Same as power_on(), but an external function. */ void term_pwron(void) if (sblen > 0) { line = delpos234(scrollback, --sblen); } else { line = smalloc(TSIZE * (newcols + 2)); line[0] = newcols; for (j = 0; j <= newcols; j++) line[j + 1] = ERASE_CHAR; } line = delpos234(screen, 0); (newrows * (newcols + 1) * TSIZE); for (i = 0; i < newrows * (newcols + 1); i++) newdisp[i] = ATTR_INVALID; sfree(disptext); disptext = newdisp; newwant = smalloc(newrows * (newcols + 1) * TSIZE); for (i = 0; i < newrows * (newcols + 1); i++) newwant[i] = ATTR_INVALID; sfree(wanttext); wanttext = newwant; newalt = newtree234(NULL); for (i = 0; i < newrows; i++) { line = smalloc(TSIZE * (newcols + 2)); line[0] = newcols; for (j = 0; j <= newcols; j++) line[j + (selspace); selspace = smalloc((newrows + newsavelines) * (newcols + sizeof(sel_nl))); tabs = srealloc(tabs, newcols * - 1; if (curs.x >= newcols) curs.x = newcols - (int which) alt_screen = screen; screen = ttr; t = curs.x; curs.x = alt_x; alt_x = t; t = curs.y; curs.y = alt_y; alt_y = t; t = marg_t; marg_t = alt_t; alt_t = t; t = marg_b; marg_b = alt_b; alt_b = t; t = dec_om; dec_om = alt_om; alt_om = t; t = wrap; wrap = alt_wrap; alt_wrap = t; t = wrapnext; wrapnext = alt_wnext; alt_wnext = t; t = insert; insert = alt_ins; alt_ins = t; t = cset; cset = alt_cset; { int nscroll; nscroll = count234(scrollback); set_sbar(pos from, pos to) (int topline, int botline, int lines, int sb) + 1] = erase_char; line[cols + + + 1] = erase_char; line[cols + 1] = 0; addpos234(screen, line, bot(int x, int y, int marg_clip) { if (x < 0) x = 0; if (x >= cols) x = cols - - curs.x = cols - 1; if (curs.y >= rows) curs.y = rows - if (use_bce) erase_char = (' ' | (curr_attr & (ATTR_FGMASK | (int line_only, int from_begin, int to_end) (int n) (curs, cursplus); ldata = lineptr(curs.y); if (dir < 0) { memmove(ldata + curs.x, ldata + curs.x + n, m * TSIZE); while (n--) ldata[curs.x + m++] = erase_char; } else { memmove(ldata + curs.x + n, ldata + curs.x, m * (int mode, int query, int state) { long ticks; if (query) switch (mode) { case 1: /* application cursor keys */ app_cursor_keys = state; break; case 2: /* VT52 mode */ vt52_mode = !state; break; case 3: /* 80/132 columns */ deselect(); request_resize(state ? 132 : 80, rows, 1); reset_132 = state; break; case 5: /* reverse video */ /* * Toggle reverse video. If we receive an OFF within the * visual bell timeout period after an ON, we trigger an * effective visual bell, so that ESC[?5hESC[?5l will * always be an actually _visible_ visual bell. */ ticks = GetTickCount(); if (rvideo && !state && /* we're turning it off */ ticks < rvbell_timeout) { /* and it's not long since it was turned on */ in_vbell = TRUE; /* we may clear rvideo but we set in_vbell */ if (vbell_timeout < rvbell_timeout) /* don't move vbell end forward */ vbell_timeout = rvbell_timeout; /* vbell end is at least then */ } else if (!rvideo && state) { /* This is an ON, so we notice the time and save it. */ rvbell_timeout = ticks + VBELL_TIMEOUT; } rvideo = state; seen_disp_event = TRUE; if (state) term_update(); break; case 6: /* DEC origin mode */ dec_om = state; break; case 7: /* auto wrap */ wrap = state; break; case 8: /* auto key repeat */ repeat_off = !state; break; case 10: /* set local edit mode */ term_editing = state; ldisc_send(NULL, 0); /* cause ldisc to notice changes */ break; case 25: /* enable/disable cursor */ compatibility2(OTHER, VT220); cursor_on = state; seen_disp_event = TRUE; break; case 47: /* alternate screen */ compatibility(OTHER); deselect(); swap_screen(state); disptop = 0; break; case 1000: /* xterm mouse 1 */ xterm_mouse = state ? 1 : 0; set_raw_mouse_mode(state); break; case 1002: /* xterm mouse 2 */ xterm_mouse = state ? 2 : 0; set_raw_mouse_mode(state); break; } else switch (mode) { case 4: /* set insert mode */ compatibility(VT102); insert = state; break; case 12: /* set echo mode */ term_echoing = !state; ldisc_send(NULL, 0); /* cause ldisc to notice changes */ break; case 20: /* Return sends ... */ cr_lf_return = state; break; { if (osc_w) { while (osc_strlen--) wordness[(unsigned char) { int c, inbuf_reap; for (inbuf_reap = 0; inbuf_reap < inbuf_head; inbuf_reap++) { c = inbuf[inbuf_reap]; /* * Optionally log the session traffic to a file. Useful for * debugging and possibly also useful for actual logging. */ logtraffic((unsigned char) (((c & 0x60) == 0 || c == '\177') && termstate < DO_CTRLS && ((c & compatibility(ANSIMIN); { char abuf[256], *s, *d; int state = 0; for (s = cfg.answerback, d = abuf; *s; s++) { if (state) { if (*s >= 'a' && *s <= 'z') *d++ = (*s - ('a' - 1)); else if ((*s >= '@' && *s <= '_') || *s == '?' || (*s & 0x80)) *d++ = ('@' ^ *s); else if (*s == '~') *d++ = '^'; state = 0; } else if (*s == '^') { state = 1; } else *d++ = xlat_kbd2tty((unsigned char) *s); } ldisc_send(abuf, d - - && cfg.beep != 0) { if (cfg.beep != 2) beep(cfg.beep); else if ; else if (curs.x == 0 && curs.y > 0) curs.x = cols - compatibility(VT100); cset = 1; break; case '\017': compatibility(VT100); cset = 0; break; case '\033': if (vt52_mode) c, LGTYP_ASCII); break; case '\013': case '\014': compatibility(VT100); case '\n': if (curs.y == marg_b) scroll(marg_t, marg_b, 1, TRUE); else if (curs.y < rows - c, - 1 && !tabs[curs.x]); if ((ldata[cols] & LATTR_MODE) != LATTR_NORM) { if (curs.x >= cols / 2) curs.x = cols / 2 - 1; } else { if (curs.x >= cols) curs.x = cols - 1; } fix_cpos; check_selection(old_curs, curs); } seen_disp_event = TRUE; break; case '\177': /* Destructive backspace This does nothing on a real VT100 */ compatibility(OTHER); if (curs.x && !wrapnext) else switch (termstate) { case TOPLEVEL: /* Only graphic characters get this far, ctrls are stripped above */ if (wrapnext && wrap) { cpos[1] |= ATTR_WRAPPED; if (curs.y == marg_b) scroll(marg_t, marg_b, 1, TRUE); else if (curs.y < rows - 1) curs.y++; curs.x = 0; fix_cpos; wrapnext = FALSE; } if (insert) insch(1); if (selstate != NO_SELECTION) { pos cursplus = curs; incpos(cursplus); check_selection(curs, cursplus); } switch (cset_attr[cset]) { /* * Linedraw characters are different from 'ESC ( B' * only for a small range. For ones outside that * range, make sure we use the same font as well as * the same encoding. */ case ATTR_LINEDRW: if (c < 0x5f || c > 0x7F) *cpos++ = xlat_tty2scr((unsigned char) c) | curr_attr | ATTR_ASCII; else if (c == 0x5F) *cpos++ = ' ' | curr_attr | ATTR_ASCII; else *cpos++ = ((unsigned char) c) | curr_attr | ATTR_LINEDRW; break; case ATTR_GBCHR: /* If UK-ASCII, make the '#' a LineDraw Pound */ if (c == '#') { *cpos++ = '}' | curr_attr | ATTR_LINEDRW; break; } /*FALLTHROUGH*/ default: *cpos = xlat_tty2scr((unsigned char) c) | curr_attr | (c <= 0x7F ? cset_attr[cset] : ATTR_ASCII); logtraffic((unsigned char) c, LGTYP_ASCII); cpos++; break; } curs.x++; if (curs.x == cols) { cpos--; curs.x--; wrapnext = TRUE; } seen_disp_event = 1; break; case IGNORE_NEXT: termstate = TOPLEVEL; break; case OSC_MAYBE_ST: /* * This state is virtually identical to SEEN_ESC, with the * exception that we have an OSC sequence in the pipeline, * and _if_ we see a backslash, we process it. */ if (c == '\\') { do_osc(); termstate = TOPLEVEL; break; } /* else fall through */ case SEEN_ESC: termstate = TOPLEVEL; switch (c) { case ' ': /* some weird sequence? */ compatibility(VT220); termstate = IGNORE_NEXT; break; case '[': /* enter CSI mode */ termstate = SEEN_CSI; esc_nargs = 1; esc_args[0] = ARG_DEFAULT; esc_query = FALSE; break; case ']': /* xterm escape sequences */ /* Compatibility is nasty here, xterm, linux, decterm yuk! */ compatibility(OTHER); termstate = SEEN_OSC; esc_args[0] = 0; break; case '(': /* should set GL */ compatibility(VT100); termstate = SET_GL; break; case ')': /* should set GR */ compatibility(VT100); termstate = SET_GR; break; case '7': /* save cursor */ compatibility(VT100); save_cursor(TRUE); break; case '8': /* restore cursor */ compatibility(VT100); save_cursor(FALSE); seen_disp_event = TRUE; break; case '=': compatibility(VT100); app_keypad_keys = TRUE; break; case '>': compatibility(VT100); app_keypad_keys = FALSE; break; case 'D': /* exactly equivalent to LF */ compatibility(VT100); if (curs.y == marg_b) scroll(marg_t, marg_b, 1, TRUE); else if (curs.y < rows - 1) curs.y++; fix_cpos; wrapnext = FALSE; seen_disp_event = TRUE; break; case 'E': /* exactly equivalent to CR-LF */ compatibility(VT100); curs.x = 0; if (curs.y == marg_b) scroll(marg_t, marg_b, 1, TRUE); else if (curs.y < rows - 1) curs.y++; fix_cpos; wrapnext = FALSE; seen_disp_event = TRUE; break; case 'M': /* reverse index - backwards LF */ compatibility(VT100); if (curs.y == marg_t) scroll(marg_t, marg_b, -1, TRUE); else if (curs.y > 0) curs.y--; fix_cpos; wrapnext = FALSE; seen_disp_event = TRUE; break; case 'Z': /* terminal type query */ compatibility(VT100); ldisc_send(id_string, strlen(id_string)); break; case 'c': /* restore power-on settings */ compatibility(VT100); power_on(); if (reset_132) { request_resize(80, rows, 1); reset_132 = 0; } fix_cpos; disptop = 0; seen_disp_event = TRUE; break; case '#': /* ESC # 8 fills screen with Es :-) */ compatibility(VT100); termstate = SEEN_ESCHASH; break; case 'H': /* set a tab */ compatibility(VT100); tabs[curs.x] = TRUE; break; } break; case SEEN_CSI: termstate = TOPLEVEL; /* default */ if (isdigit(c)) { if (esc_nargs <= ARGS_MAX) { if (esc_args[esc_nargs - 1] == ARG_DEFAULT) esc_args[esc_nargs - 1] = 0; esc_args[esc_nargs - 1] = 10 * esc_args[esc_nargs - 1] + c - '0'; } termstate = SEEN_CSI; } else if (c == ';') { if (++esc_nargs <= ARGS_MAX) esc_args[esc_nargs - 1] = ARG_DEFAULT; termstate = SEEN_CSI; } else if (c < '@') { if (esc_query) esc_query = -1; else if (c == '?') esc_query = TRUE; else esc_query = c; termstate = SEEN_CSI; } else switch (ANSI(c, esc_query)) { case 'A': /* move up N lines */ move(curs.x, curs.y - def(esc_args[0], 1), 1); seen_disp_event = TRUE; break; case 'e': /* move down N lines */ compatibility(ANSI); case 'B': move(curs.x, curs.y + def(esc_args[0], 1), 1); seen_disp_event = TRUE; break; case 'a': /* move right N cols */ compatibility(ANSI); case ANSI('c', '>'): /* report xterm version */ compatibility(OTHER); /* this reports xterm version 136 so that VIM can use the drag messages from the mouse reporting */ ldisc_send("\033[>0;136;0c", 11); break; case 'C': move(curs.x + def(esc_args[0], 1), curs.y, 1); seen_disp_event = TRUE; break; case 'D': /* move left N cols */ move(curs.x - def(esc_args[0], 1), curs.y, 1); seen_disp_event = TRUE; break; case 'E': /* move down N lines and CR */ compatibility(ANSI); move(0, curs.y + def(esc_args[0], 1), 1); seen_disp_event = TRUE; break; case 'F': /* move up N lines and CR */ compatibility(ANSI); move(0, curs.y - def(esc_args[0], 1), 1); seen_disp_event = TRUE; break; case 'G': case '`': /* set horizontal posn */ compatibility(ANSI); move(def(esc_args[0], 1) - 1, curs.y, 0); seen_disp_event = TRUE; break; case 'd': /* set vertical posn */ compatibility(ANSI); move(curs.x, (dec_om ? marg_t : 0) + def(esc_args[0], 1) - 1, (dec_om ? 2 : 0)); seen_disp_event = TRUE; break; case 'H': case 'f': /* set horz and vert posns at once */ if (esc_nargs < 2) esc_args[1] = ARG_DEFAULT; move(def(esc_args[1], 1) - 1, (dec_om ? marg_t : 0) + def(esc_args[0], 1) - 1, (dec_om ? 2 : 0)); seen_disp_event = TRUE; break; case 'J': /* erase screen or parts of it */ { unsigned int i = def(esc_args[0], 0) + 1; if (i > 3) i = 0; erase_lots(FALSE, !!(i & 2), !!(i & 1)); } disptop = 0; seen_disp_event = TRUE; break; case 'K': /* erase line or parts of it */ { unsigned int i = def(esc_args[0], 0) + 1; if (i > 3) i = 0; erase_lots(TRUE, !!(i & 2), !!(i & 1)); } seen_disp_event = TRUE; break; case 'L': /* insert lines */ compatibility(VT102); if (curs.y <= marg_b) scroll(curs.y, marg_b, -def(esc_args[0], 1), FALSE); fix_cpos; seen_disp_event = TRUE; break; case 'M': /* delete lines */ compatibility(VT102); if (curs.y <= marg_b) scroll(curs.y, marg_b, def(esc_args[0], 1), TRUE); fix_cpos; seen_disp_event = TRUE; break; case '@': /* insert chars */ /* XXX VTTEST says this is vt220, vt510 manual says vt102 */ compatibility(VT102); insch(def(esc_args[0], 1)); seen_disp_event = TRUE; break; case 'P': /* delete chars */ compatibility(VT102); insch(-def(esc_args[0], 1)); seen_disp_event = TRUE; break; case 'c': /* terminal type query */ compatibility(VT100); /* This is the response for a VT102 */ ldisc_send(id_string, strlen(id_string)); break; case 'n': /* cursor position query */ if (esc_args[0] == 6) { char buf[32]; sprintf(buf, "\033[%d;%dR", curs.y + 1, curs.x + 1); ldisc_send(buf, strlen(buf)); } else if (esc_args[0] == 5) { ldisc_send("\033[0n", 4); } break; case 'h': /* toggle modes to high */ case ANSI_QUE('h'): compatibility(VT100); { int i; for (i = 0; i < esc_nargs; i++) toggle_mode(esc_args[i], esc_query, TRUE); } break; case 'l': /* toggle modes to low */ case ANSI_QUE('l'): compatibility(VT100); { int i; for (i = 0; i < esc_nargs; i++) toggle_mode(esc_args[i], esc_query, FALSE); } break; case 'g': /* clear tabs */ compatibility(VT100); if (esc_nargs == 1) { if (esc_args[0] == 0) { tabs[curs.x] = FALSE; } else if (esc_args[0] == 3) { int i; for (i = 0; i < cols; i++) tabs[i] = FALSE; } } break; case 'r': /* set scroll margins */ compatibility(VT100); if (esc_nargs <= 2) { int top, bot; top = def(esc_args[0], 1) - 1; bot = (esc_nargs <= 1 || esc_args[1] == 0 ? rows : def(esc_args[1], rows)) - 1; if (bot >= rows) bot = rows - 1; /* VTTEST Bug 9 - if region is less than 2 lines * don't change region. */ if (bot - top > 0) { marg_t = top; marg_b = bot; curs.x = 0; /* * I used to think the cursor should be * placed at the top of the newly marginned * area. Apparently not: VMS TPU falls over * if so. * * Well actually it should for Origin mode - RDB */ curs.y = (dec_om ? marg_t : 0); fix_cpos; seen_disp_event = TRUE; } } break; case 'm': /* set graphics rendition */ { /* * A VT100 without the AVO only had one attribute, either * underline or reverse video depending on the cursor type, * this was selected by CSI 7m. * * case 2: * This is DIM on the VT100-AVO and VT102 * case 5: * This is BLINK on the VT100-AVO and VT102+ * case 8: * This is INVIS on the VT100-AVO and VT102 * case 21: * This like 22 disables BOLD, DIM and INVIS * * The ANSI colours appear on any terminal that has colour * (obviously) but the interaction between sgr0 and the * colours varies but is usually related to the background * colour erase item. * The interaction between colour attributes and the mono * ones is also very implementation dependent. * * The 39 and 49 attributes are likely to be unimplemented. */ int i; for (i = 0; i < esc_nargs; i++) { switch (def(esc_args[i], 0)) { case 0: /* restore defaults */ curr_attr = ATTR_DEFAULT; break; case 1: /* enable bold */ compatibility(VT100AVO); curr_attr |= ATTR_BOLD; break; case 21: /* (enable double underline) */ compatibility(OTHER); case 4: /* enable underline */ compatibility(VT100AVO); curr_attr |= ATTR_UNDER; break; case 5: /* enable blink */ compatibility(VT100AVO); curr_attr |= ATTR_BLINK; break; case 7: /* enable reverse video */ curr_attr |= ATTR_REVERSE; break; case 22: /* disable bold */ compatibility2(OTHER, VT220); curr_attr &= ~ATTR_BOLD; break; case 24: /* disable underline */ compatibility2(OTHER, VT220); curr_attr &= ~ATTR_UNDER; break; case 25: /* disable blink */ compatibility2(OTHER, VT220); curr_attr &= ~ATTR_BLINK; break; case 27: /* disable reverse video */ compatibility2(OTHER, VT220); curr_attr &= ~ATTR_REVERSE; break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: /* foreground */ curr_attr &= ~ATTR_FGMASK; curr_attr |= (esc_args[i] - 30) << ATTR_FGSHIFT; break; case 39: /* default-foreground */ curr_attr &= ~ATTR_FGMASK; curr_attr |= ATTR_DEFFG; break; case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: /* background */ curr_attr &= ~ATTR_BGMASK; curr_attr |= (esc_args[i] - 40) << ATTR_BGSHIFT; break; case 49: /* default-background */ curr_attr &= ~ATTR_BGMASK; curr_attr |= ATTR_DEFBG; break; } } if (use_bce) erase_char = (' ' | (curr_attr & (ATTR_FGMASK | ATTR_BGMASK | ATTR_BLINK))); } break; case 's': /* save cursor */ save_cursor(TRUE); break; case 'u': /* restore cursor */ save_cursor(FALSE); seen_disp_event = TRUE; break; case 't': /* set page size - ie window height */ /* * VT340/VT420 sequence DECSLPP, DEC only allows values * 24/25/36/48/72/144 other emulators (eg dtterm) use * illegal values (eg first arg 1..9) for window changing * and reports. */ compatibility(VT340TEXT); if (esc_nargs <= 1 && (esc_args[0] < 1 || esc_args[0] >= 24)) { request_resize(cols, def(esc_args[0], 24), 0); deselect(); } break; case ANSI('|', '*'): /* VT420 sequence DECSNLS * Set number of lines on screen * VT420 uses VGA like hardware and can support any size in * reasonable range (24..49 AIUI) with no default specified. */ compatibility(VT420); if (esc_nargs == 1 && esc_args[0] > 0) { request_resize(cols, def(esc_args[0], cfg.height), 0); deselect(); } break; case ANSI('|', '$'): /* VT340/VT420 sequence DECSCPP * Set number of columns per page * Docs imply range is only 80 or 132, but I'll allow any. */ compatibility(VT340TEXT); if (esc_nargs <= 1) { request_resize(def(esc_args[0], cfg.width), rows, 0); deselect(); } break; case 'X': /* write N spaces w/o moving cursor */ compatibility(ANSIMIN); { int n = def(esc_args[0], 1); pos cursplus; unsigned long *p = cpos; if (n > cols - curs.x) n = cols - curs.x; cursplus = curs; cursplus.x += n; check_selection(curs, cursplus); while (n--) *p++ = erase_char; seen_disp_event = TRUE; } break; case 'x': /* report terminal characteristics */ compatibility(VT100); { char buf[32]; int i = def(esc_args[0], 0); if (i == 0 || i == 1) { strcpy(buf, "\033[2;1;1;112;112;1;0x"); buf[2] += i; ldisc_send(buf, 20); } } break; case ANSI('L', '='): compatibility(OTHER); use_bce = (esc_args[0] <= 0); erase_char = ERASE_CHAR; if (use_bce) erase_char = (' ' | (curr_attr & (ATTR_FGMASK | ATTR_BGMASK))); break; case ANSI('E', '='): compatibility(OTHER); blink_is_real = (esc_args[0] >= 1); break; case ANSI('p', '"'): /* Allow the host to make this emulator a 'perfect' VT102. * This first appeared in the VT220, but we do need to get * back to PuTTY mode so I won't check it. * * The arg in 40..42 are a PuTTY extension. * The 2nd arg, 8bit vs 7bit is not checked. * * Setting VT102 mode should also change the Fkeys to * generate PF* codes as a real VT102 has no Fkeys. * The VT220 does this, F11..F13 become ESC,BS,LF other Fkeys * send nothing. * * Note ESC c will NOT change this! */ switch (esc_args[0]) { case 61: compatibility_level &= ~TM_VTXXX; compatibility_level |= TM_VT102; break; case 62: compatibility_level &= ~TM_VTXXX; compatibility_level |= TM_VT220; break; default: if (esc_args[0] > 60 && esc_args[0] < 70) compatibility_level |= TM_VTXXX; break; case 40: compatibility_level &= TM_VTXXX; break; case 41: compatibility_level = TM_PUTTY; break; case 42: compatibility_level = TM_SCOANSI; break; case ARG_DEFAULT: compatibility_level = TM_PUTTY; break; case 50: break; } /* Change the response to CSI c */ if (esc_args[0] == 50) { int i; char lbuf[64]; strcpy(id_string, "\033[?"); for (i = 1; i < esc_nargs; i++) { if (i != 1) strcat(id_string, ";"); sprintf(lbuf, "%d", esc_args[i]); strcat(id_string, lbuf); } strcat(id_string, "c"); } #if 0 /* Is this a good idea ? * Well we should do a soft reset at this point ... */ if (!has_compat(VT420) && has_compat(VT100)) { if (reset_132) request_resize(132, 24, 1); else request_resize(80, 24, 1); } #endif break; } break; case SET_GL: case SET_GR: /* VT100 only here, checked above */ switch (c) { case 'A': cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_GBCHR; break; case '0': cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_LINEDRW; break; case 'B': default: /* specifically, 'B' */ cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_ASCII; break; } if (!has_compat(VT220) || c != '%') termstate = TOPLEVEL; break; case SEEN_OSC: osc_w = FALSE; switch (c) { case 'P': /* Linux palette sequence */ termstate = SEEN_OSC_P; osc_strlen = 0; break; case 'R': /* Linux palette reset */ palette_reset(); term_invalidate(); termstate = TOPLEVEL; break; case 'W': /* word-set */ termstate = SEEN_OSC_W; osc_w = TRUE; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': esc_args[0] = 10 * esc_args[0] + c - '0'; break; case 'L': /* * Grotty hack to support xterm and DECterm title * sequences concurrently. */ if (esc_args[0] == 2) { esc_args[0] = 1; break; } /* else fall through */ default: termstate = OSC_STRING; osc_strlen = 0; } break; case OSC_STRING: /* * This OSC stuff is EVIL. It takes just one character to get into * sysline mode and it's not initially obvious how to get out. * So I've added CR and LF as string aborts. * This shouldn't effect compatibility as I believe embedded * control characters are supposed to be interpreted (maybe?) * and they don't display anything useful anyway. * * -- RDB */ if (c == '\n' || c == '\r') { termstate = TOPLEVEL; } else if (c == 0234 || c == '\007') { /* * These characters terminate the string; ST and BEL * terminate the sequence and trigger instant * processing of it, whereas ESC goes back to SEEN_ESC * mode unless it is followed by \, in which case it is * synonymous with ST in the first place. */ do_osc(); termstate = TOPLEVEL; } else if (c == '\033') termstate = OSC_MAYBE_ST; else if (osc_strlen < OSC_STR_MAX) osc_string[osc_strlen++] = c; break; case SEEN_OSC_P: { int max = (osc_strlen == 0 ? 21 : 16); int val; if (c >= '0' && c <= '9') val = c - '0'; else if (c >= 'A' && c <= 'A' + max - 10) val = c - 'A' + 10; else if (c >= 'a' && c <= 'a' + max - 10) val = c - 'a' + 10; else termstate = TOPLEVEL; osc_string[osc_strlen++] = val; if (osc_strlen >= 7) { palette_set(osc_string[0], osc_string[1] * 16 + osc_string[2], osc_string[3] * 16 + osc_string[4], osc_string[5] * 16 + osc_string[6]); term_invalidate(); termstate = TOPLEVEL; } } break; case SEEN_OSC_W: switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': esc_args[0] = 10 * esc_args[0] + c - '0'; break; default: termstate = OSC_STRING; osc_strlen = 0; } break; case SEEN_ESCHASH: { unsigned long nlattr; unsigned long *ldata; int i, j; pos scrtop, scrbot; switch (c) { case '8': for (i = 0; i < rows; i++) { ldata = lineptr(i); for (j = 0; j < cols; j++) ldata[j] = ATTR_DEFAULT | 'E'; ldata[cols] = 0; } disptop = 0; seen_disp_event = TRUE; scrtop.x = scrtop.y = 0; scrbot.x = 0; scrbot.y = rows; check_selection(scrtop, scrbot); break; case '3': case '4': case '5': case '6': switch (c) { case '3': nlattr = LATTR_TOP; break; case '4': nlattr = LATTR_BOT; break; case '5': nlattr = LATTR_NORM; break; case '6': nlattr = LATTR_WIDE; break; } ldata = lineptr(curs.y); ldata[cols] &= ~LATTR_MODE; ldata[cols] |= nlattr; } } termstate = TOPLEVEL; break; case VT52_ESC: termstate = TOPLEVEL; seen_disp_event = TRUE; switch (c) { case 'A': move(curs.x, curs.y - 1, 1); break; case 'B': move(curs.x, curs.y + 1, 1); break; case 'C': move(curs.x + 1, curs.y, 1); break; case 'D': move(curs.x - 1, curs.y, 1); break; case 'F': cset_attr[cset = 0] = ATTR_LINEDRW; break; case 'G': cset_attr[cset = 0] = ATTR_ASCII; break; case 'H': move(0, 0, 0); break; case 'I': if (curs.y == 0) scroll(0, rows - 1, -1, TRUE); else if (curs.y > 0) curs.y--; fix_cpos; wrapnext = FALSE; break; case 'J': erase_lots(FALSE, FALSE, TRUE); disptop = 0; break; case 'K': erase_lots(TRUE, FALSE, TRUE); break; case 'V': /* XXX Print cursor line */ break; case 'W': /* XXX Start controller mode */ break; case 'X': /* XXX Stop controller mode */ break; case 'Y': termstate = VT52_Y1; break; case 'Z': ldisc_send("\033/Z", 3); break; case '=': app_keypad_keys = TRUE; break; case '>': app_keypad_keys = FALSE; break; case '<': /* XXX This should switch to VT100 mode not current or default * VT mode. But this will only have effect in a VT220+ * emulation. */ vt52_mode = FALSE; break; case '^': /* XXX Enter auto print mode */ break; case '_': /* XXX Exit auto print mode */ break; case ']': /* XXX Print screen */ break; } break; case VT52_Y1: termstate = VT52_Y2; move(curs.x, c - ' ', 0); break; case VT52_Y2: termstate = TOPLEVEL; move(c - ' ', curs.y, 0); break; (unsigned long *a, unsigned long *b) { int i, n; for (i = n = (Context ctx, int may_optimise) if (has_focus) { if (blinker || !cfg.blink_cur) cursor = ATTR_ACTCURS; else cursor = 0; } else cursor = ATTR_PASCURS; if (wrapnext) cursor |= ATTR_RIGHTCURS; } = 0; i < = 0; j <= cols; j++) { unsigned long d = ldata[j]; int idx = i * (cols + 1) + j; scrpos.x = j; wanttext[idx] = lattr | (((d & ~ == our_curs_y && j == curs.x ? cursor : 0)); if (blink_is_real) { if (has_focus && tblinker && (wanttext[idx] & ATTR_BLINK)) = 0; i < rows; i++) { int idx = i * (cols + 1); int lattr = (wanttext[idx + cols] & LATTR_MODE); start = -1; for (j = 0; j <= cols; j++, - start < sizeof(ch)); if (start != -1 && !keep_going) { do_text(ctx, start, i, ch, j - - - < 0 || blink_diff > 450) { last_tblink = now; tblinker = !tblinker; } if (flg) { blinker = 1; last_blink = now; return; } blink_diff = now - last_blink; /* Make sure the cursor blinks no faster than GetCaretBlinkTime() */ if (blink_diff >= 0 && blink_diff < (long) GetCaretBlinkTime()) return; { int i; for (i = 0; i < rows * (cols + (Context ctx, int l, int t, int r, int b) ; i++) { if ((disptext[i * (cols + 1) + cols] & LATTR_MODE) == LATTR_NORM) for (j = left; j <= right && j < cols; j++) disptext[i * (cols + 1) + j] = ATTR_INVALID; else for (j = left / 2; j <= right / 2 + 1 && j < cols; j++) disptext[i * (cols + 1) + do_paint (ctx, FALSE); (int rel, int where) { int sbtop = -count234(scrollback); disptop = (rel < 0 ? 0 : { char *wbptr; /* where next char goes within workbuf */ int wblen = 0; /* workbuf len */ int buflen; /* amount of memory allocated to workbuf */ if (workbuf != NULL) { /* user supplied buffer? */ buflen = -1; /* assume buffer passed in is big enough */ wbptr = workbuf; /* start filling here */ } else buflen = 0; - 1] & CHAR_MASK) == 0x20 && poslt(top, nlpos)) if (set == ATTR_LINEDRW && ch >= 0x60 && ch < 0x7F) { int x; if ((x = poorman2[2 * (ch - 0x60) + 1]) == ' ') x = 0; ch = (x << 8) + poorman2[2 * (ch - 0x60)]; } } while (ch != 0) { if (cfg.rawcnp || !!(ch & 0xE0)) { if (wblen == buflen) { workbuf = srealloc(workbuf, buflen += 100); >>= 8; } top.x++; } if (nl) { int i; for (i = 0; i < sizeof(sel_nl); i++) { if (wblen == buflen) { workbuf = srealloc(workbuf, buflen += 100); wbptr = workbuf + wblen; } (workbuf, wblen, FALSE); /* transfer to clipboard */ if (buflen > 0) /* indicates we allocated this buffer */ sfree(workbuf); } void term_copyall(void) (pos p, int dir) + cols; while (q > ldata && (q[-1] & CHAR_MASK) == 0x20) q--; if (q == ldata + cols) q--; if (p.x >= q - ldata) p.x = (dir == -1 ? q - && wordness[ldata[p.x + 1] & CHAR_MASK] == wvalue) p.x++; } else { while (p.x > 0 && wordness[ldata[p.x - 1] & CHAR_MASK] == wvalue) (void) { selstart = sel_spread_half(selstart, -1); decpos(selend); selend = sel_spread_half(selend, +1); incpos(selend); } void term_mouse(Mouse_Button b, Mouse_Action a, int x, int y, int shift, int ctrl) { pos selpoint; unsigned long *ldata; if (y < 0) y = 0; if (y >= rows) y = rows - 1; if (x < 0) { if (y > 0) { x = cols - 1; y--; } else x = 0; } if (x >= cols) x = cols - & (b) { case MBT_LEFT: encstate = 0x20; selstart) < posdiff(selend, selstart) / && (a == MA_CLICK || a == MA_2CLK || a == + len) { while (p < data + len && !(p <= data + len - (i = 0; i < p - q; i++) { c = + len - < 256) { ldisc_send(paste_buffer, paste_len); if (paste_buffer) sfree(paste_buffer); paste_buffer = 0; { if (paste_len == 0) return; sfree(paste_buffer); paste_buffer = 0; paste_len = 0; } void term_paste() { static long last_paste = 0; long now, paste_diff; if (paste_len == 0) return; /* Don't wait forever to paste */ if (paste_hold) { now = GetTickCount(); paste_diff = now - last_paste; if (paste_diff >= 0 && paste_diff < 450) return; } paste_hold = 0; while (paste_pos < paste_len)(paste_buffer + (void) (void) { deselect(); term_update(); } int term_ldisc(int option) { if (option == LD_ECHO) return term_echoing; if (option == LD_EDIT) logfopen(); if (lgfp) fputc(c, lgfp); } } } /* open log file append/overwrite mode */ void logfopen(void) (writemod, "wb"); /* default to rewrite */ lgfp = fopen(cfg.logfilename, "r"); cfg.logtype = 0; ); /* Make sure we do not exceed the output buffer size */ strncat(buf, cfg.logfilename, 128); buf[strlen(buf)] = '\0'; logevent(buf); /* --- write header line iinto log file */ fputs(buf, lgfp); fputs(" =~=~=~=~=~=~=~=~=~=~=~=\r\n", lgfp); } } void logfclose(void) { if (lgfp) { fclose(lgfp); lgfp = NULL; } } Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 40cdca1c1456e1206f8462104ec24aa6 Text-delta-base-sha1: b095c5d22c2035ea8f6261c2a3e504436c978f32 Text-content-length: 10586 Text-content-md5: 9e6875d0ed4d63427dba4b5d4581e53c Text-content-sha1: cd1e25427b6ebfc05b838ffbca239b26c971216c Content-length: 10626 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNc|O-j.{SzQnNSmV@j1txEm9#vkEN3PTs\+]Ts%a?N-EiF3_3@U9. J;6KfWw^Z2^'[,u("K}181OE_5:CP"IgPEs9:o1Z/ 6<!s p"^hI?&Q]x|VGr@p c< K:Yw?J|5Z=XbgBO|9=Hn1b*Vnt6+v,<WuZMn[ Pj+/:Xj:Cx{l(kO n) void freetree234(tree234 * t) n) t) t, void *e, int index) /* already exists */ else if (n->elems[1] == NULL || (c = t->cmp(e, n->elems[1])) < 0) childnum = 1; else if (c == 0) return n->elems[1]; /* already exists */ else if (n->elems[2] == NULL || (c = t->cmp(e, n->elems[2])) < 0) childnum = 2; else if (c == 0) return n->elems[2]; lcount = 0; right = NULL; n->counts[2] = n->counts[1]; n->elems[1] = n->elems[0]; n->kids[1] = right; n->counts[1] = rcount; n->elems[0] = e; n->kids[0] = left; n->counts[0] = lcount; } else { /* np == &n->kids[1] */ LOG((" inserting on right of 2-node\n")); n->kids[2] = right; n->counts[2] = rcount; n->elems[1] = e; n->kids[1] = left; n->counts[1] = lcount; } if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; if (n->kids[2]) n->counts[3] = n->counts[2]; n->elems[2] = n->elems[1]; n->kids[2] = n->kids[1]; n->counts[2] = n->counts[1]; n->elems[1] = n->elems[0]; n->kids[1] = right; n->counts[1] = rcount; n->elems[0] = e; n->kids[0] = left; n->counts[3] = n->counts[2]; n->elems[2] = n->elems[1]; n->kids[2] = right; n->counts[2] = rcount; n->elems[1] = e; n->kids[1] = left; n->counts[1] = lcount; } else { /* np == &n->kids[2] */ LOG((" inserting on right of 3-node\n")); n->kids[3] = right; n->counts[3] = rcount; n->elems[2] = e; n->kids[2] = left; n->counts[2] = lcount; } if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) n->kids[1]->parent = n; if (n->kids[2]) n->kids[2]->parent = n; if (n->kids[3]) m->counts[0] = lcount; m->elems[0] = e; m->kids[1] = right; m->counts[2] = n->counts[1]; e = n->elems[1]; n->kids[0] = n->kids[2]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = left; m->counts[1] = lcount; m->elems[1] = e; m->kids[2] = right; m->counts[2] = rcount; e = n->elems[1]; n->kids[0] = n->kids[2]; n->counts[1] = n->counts[3]; } else if (np == &n->kids[2]) { m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = n->kids[1]; m->counts[1] = n->counts[1]; m->elems[1] = n->elems[1]; m->kids[2] = left; m->counts[2] = lcount; /* e = e; */ n->kids[0] = right; n->counts[0] = rcount; n->elems[0] = n->elems[2]; n->kids[1] = n->kids[3]; n->counts[1] = n->counts[3]; } else { /* np == &n->kids[3] */ m->kids[0] = n->kids[0]; m->counts[0] = n->counts[0]; m->elems[0] = n->elems[0]; m->kids[1] = n->kids[1]; m->counts[1] = n->counts[1]; m->elems[1] = n->elems[1]; m->kids[2] = n->kids[2]; m->counts[2] = n->counts[2]; n->kids[0] = left; n->counts[0] = lcount; n->elems[0] = e; n->kids[1] = right; m->kids[0]->parent = m; if (m->kids[1]) m->kids[1]->parent = m; if (m->kids[2]) m->kids[2]->parent = m; if (n->kids[0]) n->kids[0]->parent = n; if (n->kids[1]) lcount = countnode234(left); right = n; t->root->counts[0] = lcount; t->root->elems[0] = e; t->root->kids[1] = right; t->root->counts[1] = rcount; t->root->elems[1] = NULL; t->root->kids[2] = NULL; t->root->counts[2] = 0; t->root->elems[2] = NULL; t->root->kids[3] = NULL; t->root->counts[3] = 0; t->root->parent = NULL; if (t->root->kids[0]) t->root->kids[0]->parent = t->root; if (t->root->kids[1]) t->root->kids[1], t->root->counts[1])); } return orig_e; } void *add234(tree234 * t, void *e) t, void *e, int index) t, int index) t, void *e, cmpfn234 cmp, int relation, int *index) *index = idx; return ret; } void *find234(tree234 * t, void *e, cmpfn234 cmp) { return findrelpos234(t, e, cmp, REL234_EQ, NULL); } void *findrel234(tree234 * t, void *e, cmpfn234 cmp, int relation) { return findrelpos234(t, e, cmp, relation, NULL); } void *findpos234(tree234 * t, void *e, cmpfn234 cmp, int *index) t, int index) (" node %p: %p/%d [%p] %p/%d [%p] %p/%d [%p] %p/%d index=%d\n", n, n->kids[0], n->counts[0], n->elems[0], n->kids[1], n->counts[1], n->elems[1], n->kids[2], n->counts[2], n->elems[2], n->kids[3], n->counts[3], + 1, index < 0) { ei = 0; + 1, index < 0) { ei = 1; break; } else if (index < n->counts[2]) { ki = 2; } else if (index -= n->counts[2] + 1, index < 0) { ei = 2; - - - 1]; sub->kids[0] = sib->kids[lastelem + 1]; sub->counts[0] = sib->counts[lastelem + 1]; if (sub->kids[0]) sub->kids[0]->parent = sub; n->elems[ki - 1] = sib->elems[lastelem]; sib->kids[lastelem + 1] = NULL; sib->counts[lastelem + (" index and left subtree count before adjustment: %d, %d\n", index, n->counts[ki - 1])); index += n->counts[ki - 1]; n->counts[ki - 1] = countnode234(sib); index -= n->counts[ki - 1]; LOG( (" index and left subtree count after adjustment: %d, %d\n", index, n->counts[ki - 1])); } else if (ki < 3 && n->kids[ki + 1] && n->kids[ki + + + 1]; j++) { sib->kids[j + 1] = sib->kids[j + 2]; sib->counts[j + 1] = sib->counts[j + 2]; sib->elems[j] = sib->elems[j + 1]; } sib->kids[j + 1] = NULL; sib->counts[j + + + sub->kids[0]->parent = sub; n->counts[ki + + 1]; j++) { n->kids[j] = n->kids[j + 1]; n->counts[j] = n->counts[j + 1]; n->elems[j] = j < 2 ? n->elems[j + 1] : NULL; } n->kids[j] = NULL; n->counts[j] = 0; if (j < 3) == + 1]; i++) n->elems[i] = n->elems[i + - 1; n = n->kids[ei]; } else if (n->kids[ei + + + + + 1]; j++) { n->elems[j] = n->elems[j + 1]; n->kids[j + 1] = n->kids[j + 2]; n->counts[j + 1] = n->counts[j + 2]; } n->elems[j] = NULL; n->kids[j + 1] = NULL; n->counts[j + 1] = 0; /* * It's possible, in this case, that we've just removed * the only element in the root of the tree. If so, * shift the root. */ if (n->elems[0] == NULL) { LOG((" shifting root!\n")); t->root = a; a->parent = NULL; sfree(n); t, int index) t, void *e) ctx, int level, node234 * node, void *lowbound, void *highbound) if (node->kids[i]) { error("node %p: nkids=%d but kids[%d] non-NULL", node, nkids, i); } else if (node->counts[i]) { error("node %p: kids[%d] NULL but count[%d]=%d nonzero", if (node->elems[i]) { error("node %p: nelems=%d but elems[%d] non-NULL", node, nelems, i); } if (nkids == 0) { /* * If nkids==0, this is a leaf node; verify that the tree * depth is the same everywhere. */ if (ctx->treedepth < 0) ctx->treedepth = level; /* we didn't know the depth yet */ else if (ctx->treedepth != level) error("node %p: leaf at depth %d, previously seen depth %d", node, level, ctx->treedepth); } else { /* * If nkids != 0, then it should be nelems+1, unless nelems * is 0 in which case nkids should also be 0 (and so we * shouldn't be in this condition at all). */ int shouldkids = (nelems ? nelems + 1 : 0); if (nkids != shouldkids) { error("node %p: %d elems should mean %d kids but has %d", node, nelems, shouldkids, nkids); } } /* * nelems should be at least 1. */ if (nelems == 0) { (i + 1 == nelems ? highbound : node->elems[i + + if (node->kids[i]->parent != node) { error("node %p kid %d: parent ptr is %p not %p", node, i, node->kids[i]->parent, node); void *lower = (i == 0 ? lowbound : node->elems[i - 1]); chknode(ctx, level + count += subcount; } return count; } void verify(void) { chkctx ctx; int i; void *p; ctx.treedepth = -1; /* depth unknown yet */ ctx.elemcount = 0; if (i >= arraylen) error("tree contains more than %d elements", arraylen); if (array[i] != p) error("enum at position %d: array says %s, tree says %s", i, array[i], p); } if (ctx.elemcount != i) { error("tree really contains %d elements, enum gave %d", ctx.elemcount, i); } if (i < arraylen) { { int i, j; void *retval; if (arraysize < arraylen + 1) { arraysize = arraylen + 1 + 256; array = (array == NULL ? smalloc(arraysize * sizeof(*array)) : srealloc(array, arraysize * - 1]; array[i] = elem; /* add elem to array */ arraylen++; if (realret != retval) { error("add: retval was %p expected %p", realret, retval); } verify(); } void addtest(void *elem) i++; if (i < arraylen && !cmp(elem, array[i])) { - 1) { array[i] = array[i + { int i; i = 0; while (i < arraylen && cmp(elem, array[i]) > 0) i++; if (i >= arraylen || cmp(elem, array[i]) != 0) return; { char const *a = (char const *) av; char const *b = (char const *) / sizeof(*rels); j++) { rel = rels[j]; lo = 0; hi = arraylen - - 1; else if (c > 0) lo = mid + - + realret, index); } realret = findrelpos234(tree, NULL, NULL, REL234_LT, &index); if (arraylen && (realret != array[arraylen - 1] || index != arraylen - 1)) { error("find(NULL,LT) gave %s(%d) should be %s(0)", realret, index, array[arraylen - 1]); } else if (!arraylen && (realret != NULL)) { error("find(NULL,LT) gave %s(%d) should be NULL", realret, index); } } int main(void) { int in[NSTR]; int i, j, k; unsigned seed = 0; for (i = 0; i < NSTR; i++) j = randomnumber(&seed); j %= NSTR; printf("trial: %d\n", i); if (in[j]) { printf("deleting %s (%d)\n", strings[j], j); deltest(strings[j]); in[j] = 0; } else { printf("adding %s (%d)\n", strings[j], j); addtest(strings[j]); in[j] = 1; } findtest(); } while (arraylen > 0) { j = randomnumber(&seed); j %= arraylen; + Node-path: putty/tree234.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 809e627ca52e484e69d3c25ca18b17be Text-delta-base-sha1: 0c7011266468320814a372e70f3176aefb5e6b72 Text-content-length: 329 Text-content-md5: 6848222b7303dd47840ac17c94216eb9 Text-content-sha1: 281e8d6a3939415f1d9ba0efdf9070e74c108075 Content-length: 368 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN`o0 <]<!0: js@ 7]g t, void *e, cmpfn234 cmp); void *findrel234(tree234 * t, void *e, cmpfn234 cmp, int relation); void *findpos234(tree234 * t, void *e, cmpfn234 cmp, int *index); void *findrelpos234(tree234 * t, void *e); void *delpos234(tree234 * t); #endif /* TREE234_H */ Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 64e9aab28c96ecdf41c68d49b441723a Text-delta-base-sha1: 73af6fd3f892c42f2bfcbd4e1dce15becfc0a68a Text-content-length: 10735 Text-content-md5: a2d876bc5494f1ad73b6a676a21ae6d9 Text-content-sha1: 505b7433975ea06747e3422c52096c37b68e04be Content-length: 10774 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNJAI; {EAQAI[v8S+ &d?t$e=<unwZ0]|zunG@Z(HoAFyl[8Z0o??D sI7vo?Xw ANzniSuW7N)9^ro?eS9Q75jnIzv8&3untW@L@{& }j2G|Fn^W3[5kkU@#nh@Q*k@nLgYZ_4%E{&0j[cmA!) int leftborder, int rightborder, int topborder) * char *wclass, int wstyle, int exstyle, char *wtext, int wid) r.left, r.top, r.right, r.bottom, cp->hwnd, (HMENU) { RECT r; r.left = GAPBETWEEN; r.right = cp->width; r.top = cp->ypos; { cp->boxystart = cp->ypos; if (!name) cp->boxystart -= STATICHEIGHT / 2; if (name) cp->ypos += STATICHEIGHT; cp->ypos += GAPYBOX; cp->width -= 2 * { RECT r; cp->xoff -= GAPXBOX; cp->width += 2 * GAPXBOX; cp->ypos += GAPYBOX - GAPBETWEEN; r.left = GAPBETWEEN; r.right = cp->width; r.top = cp->boxystart; r.bottom = cp->ypos - cp->boxystart; doctl(cp, r, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 0, char *text; int staticid, editid, pcwidth; text = va_arg(ap, char *); if (!text) break; staticid = va_arg(ap, int); editid = va_arg(ap, int); pcwidth = va_arg(ap, int); r.left = xpos + GAPBETWEEN; percent += pcwidth; xpos = (cp->width + GAPBETWEEN) * percent / 100; r.right = xpos - r.left; r.top = cp->ypos; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid); r.top = cp->ypos + 8 + GAPWITHIN; r.bottom = EDITHEIGHT; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", editid); } va_end(ap); cp->ypos += 8 + GAPWITHIN + 12 + char *text, int id, int nacross, ...) { RECT r; va_list ap; int group; int i; char *btext; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; char *nextbtext; int bid; if (!btext) break; if (i == nacross) { cp->ypos += r.bottom + GAPBETWEEN; i = 0; } bid = va_arg(ap, int); nextbtext = va_arg(ap, char *); r.left = GAPBETWEEN + i * (cp->width + GAPBETWEEN) / nacross; if (nextbtext) r.right = (i + 1) * (cp->width + GAPBETWEEN) / nacross - r.left; else r.right = cp->width - r.left; r.top = cp->ypos; r.bottom = RADIOHEIGHT; doctl(cp, r, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group, 0, btext, bid); group = 0; i++; { RECT r; va_list ap; int group; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; char *btext; int bid; btext = va_arg(ap, char *); if (!btext) break; bid = va_arg(ap, int); r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = STATICHEIGHT; cp->ypos += r.bottom + GAPWITHIN; doctl(cp, r, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group, 0, btext, bid); { RECT r; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = CHECKBOXBUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, { RECT r; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; char *btext, int bid) { const int height = (PUSHBTNHEIGHT > STATICHEIGHT ? * GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; r.left = GAPBETWEEN; r.top = cp->ypos + (height - STATICHEIGHT) / 2; r.right = lwid; r.top = cp->ypos + (height - PUSHBTNHEIGHT) / 2; r.right = rwid; r.bottom = PUSHBTNHEIGHT; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, int sid, int eid, int percentedit, int style) { const int height = (EDITHEIGHT > STATICHEIGHT ? EDIT GAPBETWEEN + (100 - percentedit) * (cp->width + GAPBETWEEN) / 100; lwid = rpos - 2 * GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; r.left = GAPBETWEEN; r.top = cp->ypos + (height - STATICHEIGHT) / 2; r.right = lwid; r.top = cp->ypos + (height - EDITHEIGHT) / 2; r.right = rwid; r.bottom = EDITHEIGHT; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | style, WS_EX_CLIENTEDGE, "", eid); cp->ypos += height + GAPBETWEEN; } void staticedit(struct ctlpos *cp, char *stext, int sid, int eid, int percentedit) int sid, int eid, int percentedit) int sid, int eid, int lines) { RECT r; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = EDITHEIGHT + (lines - WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | ES_MULTILINE, WS_EX_CLIENTEDGE, int lid, int s2id) { const int height = (COMBOHEIGHT > STATICHEIGHT ? * GAPBETWEEN - 2 * * BIGGAP; rwid = bigwid + BIGGAP - rpos; r.left = BIGGAP; r.top = cp->ypos + (height - STATICHEIGHT) / 2; r.right = lwid; r.top = cp->ypos + (height - COMBOHEIGHT) / 2; r.right = rwid; r.bottom = COMBOHEIGHT * 10; doctl(cp, r, "COMBOBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, r.top = cp->ypos; r.right = cp->width; int eid, char *btext, int bid) { const int height = (EDITHEIGHT > PUSHBTNHEIGHT ? EDITHEIGHT : PUSHBTNHEIGHT); RECT r; int lwid, rwid, rpos; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; * GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; r.left = GAPBETWEEN; r.top = cp->ypos + (height - EDITHEIGHT) / 2; r.right = lwid; r.bottom = EDITHEIGHT; doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", eid); r.left = rpos; r.top = cp->ypos + (height - PUSHBTNHEIGHT) / 2; r.right = rwid; r.bottom = PUSHBTNHEIGHT; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, int staticid, int editid, int listid, ...) * GAPBETWEEN; rwid = cp->width + GAPBETWEEN - rpos; /* The static control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; text, staticid); /* The edit control. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, char *btext = va_arg(ap, char *); int bid; if (!btext) break; bid = va_arg(ap, int); r.left = rpos; r.top = y; r.right = rwid; r.bottom = PUSHBTNHEIGHT; y += r.bottom + GAPWITHIN; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, y = LISTDEFHEIGHT; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = lwid; r.bottom = y; cp->ypos += y + GAPBETWEEN; doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_NOTIFY | LBS_HASSTRINGS, WS_EX_CLIENTEDGE, char *e1stext, int e1sid, int e1id, char *e2stext, int e2sid, int e2id, int listid, char *b1text, int b1id, char *b2text, int b2id) { RECT r; const int height = (STATICHEIGHT > EDITHEIGHT && STATICHEIGHT > PUSHBTNHEIGHT ? STATICHEIGHT : EDITHEIGHT > PUSHBTNHEIGHT ? r.top = cp->ypos; r.right = cp->width; percent = 10; for (i = 0; i < 4; i++) { xpos = (cp->width + GAPBETWEEN) * percent / 100; r.left = xpos + GAPBETWEEN; percent += percents[i]; xpos = (cp->width + GAPBETWEEN) * percent / 100; r.right = xpos - r.left; r.top = cp->ypos; r.bottom = (i == 0 ? STATICHEIGHT : i == 1 ? EDITHEIGHT : PUSHBTNHEIGHT); r.top += (height - r.bottom) / 2; if (i == 0) { doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, j == 0 ? e1stext : e2stext, j == 0 ? e1sid : e2sid); } else if (i == 1) { doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", j == 0 ? e1id : e2id); } else if (i == 3) { doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, j == 0 ? b1text : b2text, j == 0 ? b1id : b2id); } } r.top = cp->ypos; r.right = cp->width; WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | LBS_USETABSTOPS, WS_EX_CLIENTEDGE, char *btext, int bid, int eid, char *s2text, int s2id) { RECT r; const int height = (STATICHEIGHT > EDITHEIGHT && STATICHEIGHT > PUSHBTNHEIGHT ? STATICHEIGHT : EDITHEIGHT > PUSHBTNHEIGHT ? r.top = cp->ypos; r.right = cp->width; list box. */ r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; r.bottom = LISTLISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | LBS_USETABSTOPS, WS_EX_CLIENTEDGE, "", listid); /* The button+static+edit. */ percent = xpos = 0; for (i = 0; i < 3; i++) { r.left = xpos + GAPBETWEEN; percent += percents[i]; xpos = (cp->width + GAPBETWEEN) * percent / 100; r.right = xpos - r.left; r.top = cp->ypos; r.bottom = (i == 0 ? PUSHBTNHEIGHT : i == 1 ? STATICHEIGHT : EDITHEIGHT); r.top += (height - r.bottom) / 2; if (i == 0) { doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); } else if (i == 1) { doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_CENTER, 0, s2text, s2id); } else if (i == 2) { doctl(cp, r, "EDIT", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_CLIENTEDGE, "", eid); char *btext, int bid, ...) r.top = cp->ypos; r.right = cp->width; rpos = GAPBETWEEN + 2 * (cp->width + GAPBETWEEN) / 3; lwid = rpos - 2 * r.top = cp->ypos; r.right = lwid; r.bottom = LISTHEIGHT; doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | LBS_USETABSTOPS | LBS_NOTIFY, WS_EX_CLIENTEDGE, char *ltext; int lid, rid; ltext = va_arg(ap, char *); if (!ltext) break; lid = va_arg(ap, int); rid = va_arg(ap, int); r.top = y; r.bottom = STATICHEIGHT; y += r.bottom + GAPWITHIN; r.left = rpos; r.right = rwid / 2; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, ltext, lid); r.left = rpos + r.right; r.right = rwid - r.right; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_RIGHT, 0, "", * GAPWITHIN; r.bottom = PUSHBTNHEIGHT; r.left = rpos; r.right = rwid; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, { RECT r; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; WS_CHILD | WS_VISIBLE #ifdef PBS_SMOOTH | PBS_SMOOTH #endif Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4f6de2b4b81303d12cc19caad9280d87 Text-delta-base-sha1: aa891b9ed97cd19d5d4fa7ea8a538984ec09d95d Text-content-length: 59641 Text-content-md5: f6635e06df173ca77961461fad521f93 Text-content-sha1: a5f6b28f4a0ad1203a25ee9eabb147e39c468a27 Content-length: 59682 K 15 cvs2svn:cvs-rev V 5 1.125 PROPS-END SVNQU'~1u3PPzjN=wb3aL?{e&i,byMxdswLb7kE;0f OH}1vm_CM2!DF%ssf{C}"ZvJw&}(a|M=Q$U8I<_F~6z8V1~A*by:gcwK3J 0;) SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_DELETESTRING, i, 0); for (i = 0; i < nsessions; i++) SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_ADDSTRING, 0, (LPARAM) (sessions[i])); } SetDlgItemInt(hwnd, IDC_PORT, cfg.port, FALSE); CheckRadioButton(hwnd, IDC_PROTRAW, IDC_PROTSSH, cfg.protocol == PROT_SSH ? IDC_PROTSSH : cfg.protocol == PROT_TELNET ? IDC_PROTTELNET : cfg.protocol == PROT_RLOGIN ? IDC_PROTRLOGIN : IDC_PROTRAW); SetDlgItemInt(hwnd, IDC_DEL008, IDC_DEL127, cfg.bksp_is_delete ? IDC_DEL127 : IDC_DEL008); CheckRadioButton(hwnd, IDC_HOMETILDE, IDC_HOMERXVT, cfg.rxvt_homeend ? IDC_HOMERXVT : IDC_HOMETILDE); CheckRadioButton(hwnd, IDC_FUNCTILDE, IDC_FUNCSCO, cfg.funky_type == 0 ? IDC_FUNCTILDE : cfg.funky_type == 1 ? IDC_FUNCLINUX : cfg.funky_type == 2 ? IDC_FUNCXTERM : cfg.funky_type == 3 ? IDC_FUNCVT400 : cfg.funky_type == 4 ? IDC_FUNCVT100P : cfg.funky_type == 5 ? IDC_FUNCSCO : IDC_FUNCTILDE); CheckDlgButton(hwnd, IDC_NOAPPLICC, cfg.no_applic_c); CheckDlgButton(hwnd, IDC_NOAPPLICK, cfg.no_applic_k); CheckRadioButton(hwnd, IDC_CURNORMAL, IDC_CURAPPLIC, cfg.app_cursor ? IDC_CURAPPLIC : IDC_CURNORMAL); CheckRadioButton(hwnd, IDC_KPNORMAL, IDC_KPNH, cfg.nethack_keypad ? IDC_KPNH : cfg.app_keypad ? IDC_KPAPPLIC : IDC_KPNORMAL); CheckDlgButton(hwnd, IDC_ALTF4, cfg.alt_f4); CheckDlgButton(hwnd, IDC_ALTSPACE, cfg.alt_space); CheckDlgButton(hwnd, IDC_ALTONLY, cfg.alt_only); CheckDlgButton(hwnd, IDC_COMPOSEKEY, cfg.compose_key); CheckDlgButton(hwnd, IDC_CTRLALTKEYS, cfg.ctrlaltkeys); CheckRadioButton(hwnd, IDC_ECHOBACKEND, IDC_ECHONO, cfg.localecho == LD_BACKEND ? IDC_ECHOBACKEND : cfg.localecho == LD_YES ? IDC_ECHOYES : IDC_ECHONO); CheckRadioButton(hwnd, IDC_EDITBACKEND, IDC_EDITNO, cfg.localedit == LD_BACKEND ? IDC_EDITBACKEND : cfg.localedit == LD_YES ? IDC_EDITYES : IDC_EDITNO); SetDlgItemText(hwnd, IDC_ANSWEREDIT, cfg.answerback); CheckDlgButton(hwnd, IDC_ALWAYSONTOP, cfg.alwaysontop); CheckDlgButton(hwnd, IDC_SCROLLKEY, cfg.scroll_on_key); CheckDlgButton(hwnd, IDC_SCROLLDISP, cfg.scroll_on_disp); CheckDlgButton(hwnd, IDC_WRAPMODE, cfg.wrap_mode); CheckDlgButton(hwnd, IDC_DECOM, cfg.dec_om); CheckDlgButton(hwnd, IDC_LFHASCR, cfg.lfhascr); SetDlgItemInt(hwnd, IDC_ROWSEDIT, cfg.height, FALSE); SetDlgItemInt(hwnd, IDC_COLSEDIT, cfg.width, FALSE); SetDlgItemInt(hwnd, IDC_SAVEEDIT, cfg.savelines, FALSE); fmtfont(fontstatic); SetDlgItemText(hwnd, IDC_FONTSTATIC, fontstatic); CheckRadioButton(hwnd, IDC_BELL_DISABLED, IDC_BELL_VISUAL, cfg.beep == BELL_DISABLED ? IDC_BELL_DISABLED : cfg.beep == BELL_DEFAULT ? IDC_BELL_DEFAULT : cfg.beep == BELL_WAVEFILE ? IDC_BELL_WAVEFILE : cfg.beep == BELL_VISUAL ? IDC_BELL_VISUAL : IDC_BELL_DEFAULT); SetDlgItemText(hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile); CheckDlgButton(hwnd, IDC_BELLOVL, cfg.bellovl); SetDlgItemInt(hwnd, IDC_BELLOVLN, cfg.bellovl_n, FALSE); MySetDlgItemFlt(hwnd, IDC_BELLOVLT, cfg.bellovl_t / 1000.0); MySetDlgItemFlt(hwnd, IDC_BELLOVLS, cfg.bellovl_s / 1000.0); CheckDlgButton(hwnd, IDC_BCE, cfg.bce); CheckDlgButton(hwnd, IDC_BLINKTEXT, cfg.blinktext); SetDlgItemText(hwnd, IDC_WINEDIT, cfg.wintitle); CheckDlgButton(hwnd, IDC_WINNAME, cfg.win_name_always); CheckDlgButton(hwnd, IDC_HIDEMOUSE, cfg.hide_mouseptr); CheckDlgButton(hwnd, IDC_SUNKENEDGE, cfg.sunken_edge); CheckRadioButton(hwnd, IDC_CURBLOCK, IDC_CURVERT, cfg.cursor_type == 0 ? IDC_CURBLOCK : cfg.cursor_type == 1 ? IDC_CURUNDER : IDC_CURVERT); CheckDlgButton(hwnd, IDC_BLINKCUR, cfg.blink_cur); CheckDlgButton(hwnd, IDC_SCROLLBAR, cfg.scrollbar); CheckDlgButton(hwnd, IDC_LOCKSIZE, cfg.locksize); CheckRadioButton(hwnd, IDC_COEALWAYS, IDC_COENORMAL, cfg.close_on_exit == COE_NORMAL ? IDC_COENORMAL : cfg.close_on_exit == COE_NEVER ? IDC_COENEVER : IDC_COEALWAYS); CheckDlgButton(hwnd, IDC_CLOSEWARN, cfg.warn_on_close); SetDlgItemText(hwnd, IDC_TTEDIT, cfg.termtype); SetDlgItemText(hwnd, IDC_TSEDIT, cfg.termspeed); SetDlgItemText(hwnd, IDC_R_TSEDIT, cfg.termspeed); SetDlgItemText(hwnd, IDC_RLLUSEREDIT, cfg.localusername); SetDlgItemText(hwnd, IDC_LOGEDIT, cfg.username); SetDlgItemText(hwnd, IDC_ENVLIST, LB_ADDSTRING, 0, (LPARAM) p); p += strlen(p) + 1; } } CheckRadioButton(hwnd, IDC_EMBSD, IDC_EMRFC, cfg.rfc_environ ? IDC_EMRFC : IDC_EMBSD); SetDlgItemText(hwnd, IDC_TTEDIT, cfg.termtype); SetDlgItemText(hwnd, IDC_LOGEDIT, cfg.username); CheckDlgButton(hwnd, IDC_NOPTY, cfg.nopty); CheckDlgButton(hwnd, IDC_COMPRESS, cfg.compression); CheckDlgButton(hwnd, IDC_BUGGYMAC, cfg.buggymac); CheckDlgButton(hwnd, IDC_AGENTFWD, cfg.agentfwd); CheckRadioButton(hwnd, IDC_CIPHER3DES, IDC_CIPHERAES, cfg.cipher == CIPHER_BLOWFISH ? IDC_CIPHERBLOWF : cfg.cipher == CIPHER_DES ? IDC_CIPHERDES : cfg.cipher == CIPHER_AES ? IDC_CIPHERAES : IDC_CIPHER3DES); CheckRadioButton(hwnd, IDC_SSHPROT1, IDC_SSHPROT2, cfg.sshprot == 1 ? IDC_SSHPROT1 : IDC_SSHPROT2); CheckDlgButton(hwnd, IDC_AUTHTIS, cfg.try_tis_auth); SetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile); SetDlgItemText(hwnd, IDC_CMDEDIT, cfg.remote_cmd); CheckRadioButton(hwnd, IDC_MBWINDOWS, IDC_MBXTERM, cfg.mouse_is_xterm ? IDC_MBXTERM : IDC_MBWINDOWS); CheckDlgButton(hwnd, IDC_RAWCNP, cfg.rawcnp); { static int tabs[4] = { 25, 61, 96, 128 }; SendDlgItemMessage(hwnd, IDC_CCLIST, LB_SETTABSTOPS, 4, (LPARAM) tabs); } for (i = 0; i < 256; i++) { char str[100]; sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i, (i >= 0x21 && i != 0x7F) ? i : ' ', cfg.wordness[i]); SendDlgItemMessage(hwnd, IDC_CCLIST, LB_ADDSTRING, 0, (LPARAM) str); } CheckDlgButton(hwnd, IDC_BOLDCOLOUR, cfg.bold_colour); CheckDlgButton(hwnd, IDC_PALETTE, cfg.try_palette); { int i, n; n = SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_GETCOUNT, 0, 0); for (i = n; i-- > 0;) SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_DELETESTRING, i, 0); for (i = 0; i < (hwnd, IDC_COLOURLIST, LB_ADDSTRING, 0, (LPARAM) colours[i]); } SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_SETCURSEL, 0, 0); SetDlgItemInt(hwnd, IDC_RVALUE, cfg.colours[0][0], FALSE); SetDlgItemInt(hwnd, IDC_GVALUE, cfg.colours[0][1], FALSE); SetDlgItemInt(hwnd, IDC_BVALUE, cfg.colours[0][2], FALSE); CheckRadioButton(hwnd, IDC_NOXLAT, IDC_88592CP852, cfg.xlat_88592w1250 ? IDC_88592WIN1250 : cfg.xlat_88592cp852 ? IDC_88592CP852 : cfg.xlat_enablekoiwin ? IDC_KOI8WIN1251 : IDC_NOXLAT); CheckDlgButton(hwnd, IDC_CAPSLOCKCYR, cfg.xlat_capslockcyr); CheckRadioButton(hwnd, IDC_VTXWINDOWS, IDC_VTPOORMAN, cfg.vtmode == VT_XWINDOWS ? IDC_VTXWINDOWS : cfg.vtmode == VT_OEMANSI ? IDC_VTOEMANSI : cfg.vtmode == VT_OEMONLY ? IDC_VTOEMONLY : IDC_VTPOORMAN); CheckDlgButton(hwnd, IDC_X11_FORWARD, cfg.x11_forward); SetDlgItemText int level, char *text) - TreeView_Expand(faff->treeview, faff->lastat[level - 1], TVE_EXPAND); faff->lastat[level] = newitem; for (i = level + 1; i < 4; i++) { if (panel == sessionpanelstart) { /* The Session panel. Accelerators used: [acgo] nprtih elsd w */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Basic options for your PuTTY session", IDC_TITLE_SESSION); if (dlgtype == 0) { beginbox(&cp, "Specify your connection by host name", IDC_BOX_SESSION1); multiedit(&cp, "Host &Name", IDC_HOSTSTATIC, IDC_HOST, 75, "&Port", IDC_PORTSTATIC, IDC_PORT, 25, NULL); if (backends[3].backend == NULL) { /* this is PuTTYtel, so only three protocols available */ radioline(&cp, "Protocol:", IDC_PROTSTATIC, 4, "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTTELNET, "Rlog&in", IDC_PROTRLOGIN, NULL); } else { radioline(&cp, "Protocol:", IDC_PROTSTATIC, 4, "&Raw", IDC_PROTRAW, "&Telnet", IDC_PROTTELNET, "Rlog&in", IDC_PROTRLOGIN, #ifdef FWHACK "SS&H/hack", #else "SS&H", #endif IDC_PROTSSH, NULL); } endbox(&cp); beginbox(&cp, "Load, save or delete a stored session", IDC_BOX_SESSION2); sesssaver(&cp, "Sav&ed Sessions", IDC_SESSSTATIC, IDC_SESSEDIT, IDC_SESSLIST, "&Load", IDC_SESSLOAD, "&Save", IDC_SESSSAVE, "&Delete", IDC_SESSDEL, NULL); endbox(&cp); } beginbox(&cp, NULL, IDC_BOX_SESSION3); radioline(&cp, "Close &window on exit:", IDC_CLOSEEXIT, 4, "Always", IDC_COEALWAYS, "Never", IDC_COENEVER, "Only on clean exit", IDC_COENORMAL, NULL); endbox(&cp); } if (panel == loggingpanelstart) { /* The Logging panel. Accelerators used: [acgo] tplfwe */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling session logging", IDC_TITLE_LOGGING); beginbox(&cp, NULL, IDC_BOX_LOGGING1); radiobig(&cp, "Session logging:", IDC_LSTATSTATIC, "Logging &turned off completely", IDC_LSTATOFF, "Log &printable output only", IDC_LSTATASCII, "&Log all session output", IDC_LSTATRAW, NULL); editbutton(&cp, "Log &file name:", IDC_LGFSTATIC, IDC_LGFEDIT, "Bro&wse...", IDC_LGFBUTTON); radiobig(&cp, "What to do if the log file already &exists:", IDC_LSTATXIST, "Always overwrite it", IDC_LSTATXOVR, "Always append to the end of it", IDC_LSTATXAPN, "Ask the user every time", IDC_LSTATXASK, NULL); endbox(&cp); } if (panel == terminalpanelstart) { /* The Terminal panel. Accelerators used: [acgo] wdlen hts */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the terminal emulation", IDC_TITLE_TERMINAL); beginbox(&cp, "Set various terminal options", IDC_BOX_TERMINAL1); checkbox(&cp, "Auto &wrap mode initially on", IDC_WRAPMODE); checkbox(&cp, "&DEC Origin Mode initially on", IDC_DECOM); checkbox(&cp, "Implicit CR in every &LF", IDC_LFHASCR); checkbox(&cp, "Use background colour to &erase screen", IDC_BCE); checkbox(&cp, "Enable bli&nking text", IDC_BLINKTEXT); multiedit(&cp, "An&swerback to ^E:", IDC_ANSWERBACK, IDC_ANSWEREDIT, 100, NULL); endbox(&cp); beginbox(&cp, "Line discipline options", IDC_BOX_TERMINAL2); radioline(&cp, "Local ec&ho:", IDC_ECHOSTATIC, 3, "Auto", IDC_ECHOBACKEND, "Force on", IDC_ECHOYES, "Force off", IDC_ECHONO, NULL); radioline(&cp, "Local line edi&ting:", IDC_EDITSTATIC, 3, "Auto", IDC_EDITBACKEND, "Force on", IDC_EDITYES, "Force off", IDC_EDITNO, NULL); endbox(&cp); } if (panel == bellpanelstart) { /* The Bell panel. Accelerators used: [acgo] bdsm wt */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the terminal bell", IDC_TITLE_BELL); beginbox(&cp, "Set the style of bell", IDC_BOX_BELL1); radiobig(&cp, "Action to happen when a &bell occurs:", IDC_BELLSTATIC, "None (bell disabled)", IDC_BELL_DISABLED, "Play Windows Default Sound", IDC_BELL_DEFAULT, "Play a custom sound file", IDC_BELL_WAVEFILE, IDC_BELLOVLSSTATIC, IDC_BELLOVLS, 20); endbox(&cp); } if (panel == keyboardpanelstart) { /* The Keyboard panel. Accelerators used: [acgo] bhf ruyntd */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); /* bartitle(&cp, "Options controlling the effects of keys", IDC_TITLE_KEYBOARD); */ beginbox(&cp, "Change the sequences sent by:", IDC_BOX_KEYBOARD1); radioline(&cp, "The &Backspace key", IDC_DELSTATIC, 2, "Control-H", IDC_DEL008, "Control-? (127)", IDC_DEL127, NULL); radioline(&cp, "The &Home and End keys", IDC_HOMESTATIC, 2, "Standard", IDC_HOMETILDE, "rxvt", IDC_HOMERXVT, NULL); "ESC[n~", IDC_FUNCTILDE, "Linux", IDC_FUNCLINUX, "Xterm R6", IDC_FUNCXTERM, "VT400", IDC_FUNCVT400, "VT100+", IDC_FUNCVT100P, "SCO", IDC_FUNCSCO, NULL); endbox(&cp); beginbox(&cp, "Application keypad settings:", IDC_BOX_KEYBOARD2); checkbox(&cp, "Application c&ursor keys totally disabled", IDC_NOAPPLICC); radioline(&cp, "Initial state of cu&rsor keys:", IDC_CURSTATIC, 2, "Normal", IDC_CURNORMAL, "Application", IDC_CURAPPLIC, NULL); checkbox(&cp, "Application ke&ypad keys totally disabled", IDC_NOAPPLICK); radioline(&cp, "Initial state of &numeric keypad:", IDC_KPSTATIC, 3, "Normal", IDC_KPNORMAL, "Application", IDC_KPAPPLIC, "NetHack", IDC_KPNH, NULL); endbox(&cp); beginbox(&cp, "Enable extra keyboard features:", IDC_BOX_KEYBOARD3); checkbox(&cp, "AltGr ac&ts as Compose key", IDC_COMPOSEKEY); checkbox(&cp, "Control-Alt is &different from AltGr", IDC_CTRLALTKEYS); endbox(&cp); } if (panel == windowpanelstart) { /* The Window panel. Accelerators used: [acgo] rmz sdkp w4ylt */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling PuTTY's window", IDC_TITLE_WINDOW); beginbox(&cp, "Set the size of the window", IDC_BOX_WINDOW1); multiedit(&cp, "&Rows", IDC_ROWSSTATIC, IDC_ROWSEDIT, 50, "Colu&mns", IDC_COLSSTATIC, IDC_COLSEDIT, 50, NULL); checkbox(&cp, "Lock window size against resi&zing", IDC_LOCKSIZE); endbox(&cp); beginbox(&cp, "Control the scrollback in the window", IDC_BOX_WINDOW2); staticedit(&cp, "Lines of &scrollback", IDC_SAVESTATIC, IDC_SAVEEDIT, 50); checkbox(&cp, "&Display scrollbar", IDC_SCROLLBAR); checkbox(&cp, "Reset scrollback on &keypress", IDC_SCROLLKEY); checkbox(&cp, "Reset scrollback on dis&play activity", IDC_SCROLLDISP); endbox(&cp); beginbox(&cp, NULL, IDC_BOX_WINDOW3); checkbox(&cp, "&Warn before closing window", IDC_CLOSEWARN); checkbox(&cp, "Window closes on ALT-F&4", IDC_ALTF4); checkbox(&cp, "S&ystem menu appears on ALT-Space", IDC_ALTSPACE); checkbox(&cp, "System menu appears on A< alone", IDC_ALTONLY); checkbox(&cp, "Ensure window is always on &top", IDC_ALWAYSONTOP); endbox(&cp); } if (panel == appearancepanelstart) { /* The Appearance panel. Accelerators used: [acgo] luvb h ti p s */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling PuTTY's appearance", IDC_TITLE_APPEARANCE); beginbox(&cp, "Adjust the use of the cursor", IDC_BOX_APPEARANCE1); radioline(&cp, "Cursor appearance:", IDC_CURSORSTATIC, 3, "B&lock", IDC_CURBLOCK, "&Underline", IDC_CURUNDER, "&Vertical line", IDC_CURVERT, NULL); checkbox(&cp, "Cursor &blinks", IDC_BLINKCUR); endbox(&cp); beginbox(&cp, "Set the font used in the terminal window", IDC_BOX_APPEARANCE2); staticbtn(&cp, "", IDC_FONTSTATIC, "C&hange...", IDC_CHOOSEFONT); endbox(&cp); beginbox(&cp, "Adjust the use of the window title", IDC_BOX_APPEARANCE3); multiedit(&cp, "Window &title:", IDC_WINTITLE, IDC_WINEDIT, 100, NULL); checkbox(&cp, "Avoid ever using &icon title", IDC_WINNAME); endbox(&cp); beginbox(&cp, "Adjust the use of the mouse pointer", IDC_BOX_APPEARANCE4); checkbox(&cp, "Hide mouse &pointer when typing in window", IDC_HIDEMOUSE); endbox(&cp); beginbox(&cp, "Adjust the window border", IDC_BOX_APPEARANCE5); checkbox(&cp, "&Sunken-edge border (slightly thicker)", IDC_SUNKENEDGE); endbox(&cp); } if (panel == translationpanelstart) { /* The Translation panel. Accelerators used: [acgo] xbep t s */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling character set translation", IDC_TITLE_TRANSLATION); beginbox(&cp, "Adjust how PuTTY displays line drawing characters", IDC_BOX_TRANSLATION1); radiobig(&cp, "Handling of line drawing characters:", IDC_VTSTATIC, "Font has &XWindows encoding", IDC_VTXWINDOWS, "Use font in &both ANSI and OEM modes", IDC_VTOEMANSI, "Use font in O&EM mode only", IDC_VTOEMONLY, "&Poor man's line drawing (" "+" ", " "-" " and " "|" ")", IDC_VTPOORMAN, NULL); endbox(&cp); beginbox(&cp, "Enable character set translation on received data", IDC_BOX_TRANSLATION2); radiobig(&cp, "Character set &translation:", IDC_XLATSTATIC, "None", IDC_NOXLAT, "KOI8 / Win-1251", IDC_KOI8WIN1251, "ISO-8859-2 / Win-1250", IDC_88592WIN1250, "ISO-8859-2 / CP852", IDC_88592CP852, NULL); endbox(&cp); beginbox(&cp, "Enable character set translation on input data", IDC_BOX_TRANSLATION3); checkbox(&cp, "CAP&S LOCK acts as cyrillic switch", IDC_CAPSLOCKCYR); endbox(&cp); } if (panel == selectionpanelstart) { /* The Selection panel. Accelerators used: [acgo] d wx hst */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling copy and paste", IDC_TITLE_SELECTION); beginbox(&cp, "Translation of pasted characters", IDC_BOX_SELECTION1); checkbox(&cp, "&Don't translate line drawing chars into +, - and |", IDC_RAWCNP); endbox(&cp); beginbox(&cp, "Control which mouse button does which thing", IDC_BOX_SELECTION2); radiobig(&cp, "Action of mouse buttons:", IDC_MBSTATIC, "&Windows (Right pastes, Middle extends)", IDC_MBWINDOWS, "&xterm (Right extends, Middle pastes)", IDC_MBXTERM, NULL); endbox(&cp); beginbox(&cp, "Control the select-one-word-at-a-time mode", IDC_BOX_SELECTION3); charclass(&cp, "C&haracter classes:", IDC_CCSTATIC, IDC_CCLIST, "&Set", IDC_CCSET, IDC_CCEDIT, "&to class", IDC_CCSTATIC2); endbox(&cp); } if (panel == colourspanelstart) { /* The Colours panel. Accelerators used: [acgo] blum */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling use of colours", IDC_TITLE_COLOURS); beginbox(&cp, "General options for colour usage", IDC_BOX_COLOURS1); checkbox(&cp, "&Bolded text is a different colour", IDC_BOLDCOLOUR); checkbox(&cp, "Attempt to use &logical palettes", IDC_PALETTE); endbox(&cp); beginbox(&cp, "Adjust the precise colours PuTTY displays", IDC_BOX_COLOURS2); colouredit(&cp, "Select a colo&ur and then click to modify it:", IDC_COLOURSTATIC, IDC_COLOURLIST, "&Modify...", IDC_CHANGE, "Red:", IDC_RSTATIC, IDC_RVALUE, "Green:", IDC_GSTATIC, IDC_GVALUE, "Blue:", IDC_BSTATIC, IDC_BVALUE, NULL); endbox(&cp); } if (panel == connectionpanelstart) { /* The Connection panel. Accelerators used: [acgo] tuk */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); bartitle(&cp, "Options controlling the connection", IDC_TITLE_CONNECTION); if (dlgtype == 0) { beginbox(&cp, "Data to send to the server", IDC_BOX_CONNECTION1); staticedit(&cp, "Terminal-&type string", IDC_TTSTATIC, IDC_TTEDIT, 50); staticedit(&cp, "Auto-login &username", IDC_LOGSTATIC, IDC_LOGEDIT, 50); endbox(&cp); } beginbox(&cp, "Sending of null packets to keep session active", IDC_BOX_CONNECTION2); staticedit(&cp, "Seconds between &keepalives (0 to turn off)", IDC_PINGSTATIC, IDC_PINGEDIT, 20); endbox(&cp); } if (panel == telnetpanelstart) { /* The Telnet panel. Accelerators used: [acgo] svldr bf */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { bartitle(&cp, "Options controlling Telnet connections", IDC_TITLE_TELNET); beginbox(&cp, "Data to send to the server", IDC_BOX_TELNET1); staticedit(&cp, "Terminal-&speed string", IDC_TSSTATIC, IDC_TSEDIT, 50); envsetter(&cp, "Environment variables:", IDC_ENVSTATIC, "&Variable", IDC_VARSTATIC, IDC_VAREDIT, "Va&lue", IDC_VALSTATIC, IDC_VALEDIT, IDC_ENVLIST, "A&dd", IDC_ENVADD, "&Remove", IDC_ENVREMOVE); endbox(&cp); beginbox(&cp, "Telnet protocol adjustments", IDC_BOX_TELNET2); radioline(&cp, "Handling of OLD_ENVIRON ambiguity:", IDC_EMSTATIC, 2, "&BSD (commonplace)", IDC_EMBSD, "R&FC 1408 (unusual)", IDC_EMRFC, NULL); endbox(&cp); } } if (panel == rloginpanelstart) { /* The Rlogin panel. Accelerators used: [acgo] sl */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { bartitle(&cp, "Options controlling Rlogin connections", IDC_TITLE_RLOGIN); beginbox(&cp, "Data to send to the server", IDC_BOX_RLOGIN1); staticedit(&cp, "Terminal-&speed string", IDC_R_TSSTATIC, IDC_R_TSEDIT, 50); staticedit(&cp, "&Local username:", IDC_RLLUSERSTATIC, IDC_RLLUSEREDIT, 50); endbox(&cp); } } if (panel == sshpanelstart) { /* The SSH panel. Accelerators used: [acgo] rmfkw pe123bds i */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { bartitle(&cp, "Options controlling SSH connections", IDC_TITLE_SSH); beginbox(&cp, "Data to send to the server", IDC_BOX_SSH1); multiedit(&cp, "&Remote command:", IDC_CMDSTATIC, IDC_CMDEDIT, 100, NULL); endbox(&cp); beginbox(&cp, "Authentication options", IDC_BOX_SSH2); checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication", IDC_AUTHTIS); checkbox(&cp, "Allow agent &forwarding", IDC_AGENTFWD); editbutton(&cp, "Private &key file for authentication:", IDC_PKSTATIC, IDC_PKEDIT, "Bro&wse...", IDC_PKBUTTON); endbox(&cp); beginbox(&cp, "Protocol options", IDC_BOX_SSH3); checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC_NOPTY); checkbox(&cp, "Enable compr&ession", IDC_COMPRESS); radioline(&cp, "Preferred SSH protocol version:", IDC_SSHPROTSTATIC, 2, "&1", IDC_SSHPROT1, "&2", IDC_SSHPROT2, NULL); radioline(&cp, "Preferred encryption algorithm:", IDC_CIPHERSTATIC, 4, "&3DES", IDC_CIPHER3DES, "&Blowfish", IDC_CIPHERBLOWF, "&DES", IDC_CIPHERDES, "AE&S", IDC_CIPHERAES, NULL); checkbox(&cp, "&Imitate SSH 2 MAC bug in commercial <= v2.3.x", IDC_BUGGYMAC); endbox(&cp); } } if (panel == tunnelspanelstart) { /* The Tunnels panel. Accelerators used: [acgo] ex */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { bartitle(&cp, "Options controlling SSH tunnelling", IDC_TITLE_TUNNELS); beginbox(&cp, "X11 forwarding options", IDC_BOX_TUNNELS); checkbox(&cp, "&Enable X11 forwarding", IDC_X11_FORWARD); multiedit(&cp, "&X display location", IDC_X11_DISPSTATIC, IDC_X11_DISPLAY, 50, NULL); endbox(&cp); (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, int dlgtype) (hw, &rs) && GetWindowRect(hwnd, &rd)) MoveWindow(hwnd, (rs.right + rs.left + rd.left - rd.right) / 2, (rs.bottom + rs.top + rd.top - rd.bottom) / 2, rd.right - rd.left, rd.bottom - rd.top, TRUE); } /* * Create the tree view. */ { RECT r; WPARAM font; HWND tvstatic; r.left = 3; r.right = r.left + 75; r.top = 3; r.bottom = r.top + 10; MapDialogRect(hwnd, &r); tvstatic = CreateWindowEx(0, "STATIC", "Cate&gory:", WS_CHILD | WS_VISIBLE, r.left, r.top, r.right - r.left, r.bottom - r.top, hwnd, (HMENU) IDCX_TVSTATIC, hinst, r.left = 3; r.right = r.left + 75; r.top = 13; r.bottom = r.top + 206; MapDialogRect(hwnd, &r); treeview = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | TVS_HASLINES | TVS_DISABLEDRAGDROP | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_SHOWSELALWAYS, r.left, r.top, r.right - r.left, r.bottom - r.top, hwnd, (HMENU) IDCX_TREEVIEW, hinst, tvfaff.treeview = treeview; memset(tvfaff.lastat, 0, sizeof(tvfaff.lastat)); } /* * Set up the tree view contents. */ hsession = treeview_insert(&tvfaff, 0, "Session"); treeview_insert(&tvfaff, 1, "Logging"); treeview_insert(&tvfaff, 0, "Terminal"); treeview_insert(&tvfaff, 1, "Keyboard"); treeview_insert(&tvfaff, 1, "Bell"); treeview_insert(&tvfaff, 0, "Window"); treeview_insert(&tvfaff, 1, "Appearance"); treeview_insert(&tvfaff, 1, "Translation"); treeview_insert(&tvfaff, 1, "Selection"); treeview_insert(&tvfaff, 1, "Colours"); treeview_insert(&tvfaff, 0, "Connection"); if (dlgtype == 0) { treeview_insert(&tvfaff, 1, "Telnet"); treeview_insert(&tvfaff, 1, "Rlogin"); if (backends[3].backend != NULL) { treeview_insert(&tvfaff, 1, "SSH"); treeview_insert(&tvfaff, 2, "Tunnels"); } } /* * Put the treeview selection on to the Session panel. This * should also cause creation of the relevant controls. */ TreeView_SelectItem(treeview, hsession); /* * Set focus into the first available control. */ { HWND ctl; ctl = GetDlgItem(hwnd, IDC_HOST); if (!ctl) ctl = GetDlgItem(hwnd, IDC_CLOSEEXIT); SetFocus(ctl); } SetWindowLong(hwnd, GWL_USERDATA, 1); return 0; case WM_LBUTTONUP: /* * Button release should trigger WM_OK if there was a * previous double click on the session list. */ ReleaseCapture(); if (readytogo) SendMessage(hwnd, WM_COMMAND, IDOK, 0); break; case WM_NOTIFY: if (LOWORD(wParam) == IDCX_TREEVIEW && ((LPNMHDR) lParam)->code == TVN_SELCHANGED) { HTREEITEM i = TreeView_GetSelection(((LPNMHDR) lParam)->hwndFrom); TVITEM item; int j; char buffer[64]; lParam)->hwndFrom, &item); for (j = controlstartvalue; j < controlendvalue; j++) { HWND item = GetDlgItem(hwnd, j); if (item) DestroyWindow(item); init_dlg_ctrls(hwnd); SetFocus(((LPNMHDR) lParam)->hwndFrom); switch (LOWORD(wParam)) { case IDOK: if (*cfg.host) EndDialog(hwnd, 1); else MessageBeep(0); return 0; case IDCANCEL: EndDialog(hwnd, 0); return 0; case IDC_PROTTELNET: case IDC_PROTRLOGIN: case IDC_PROTSSH: case IDC_PROTRAW: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { int i = IsDlgButtonChecked(hwnd, IDC_PROTSSH); int j = IsDlgButtonChecked(hwnd, IDC_PROTTELNET); int k = IsDlgButtonChecked(hwnd, IDC_PROTRLOGIN); cfg.protocol = i ? PROT_SSH : j ? PROT_TELNET : k ? PROT_RLOGIN : PROT_RAW; if ((cfg.protocol == PROT_SSH && cfg.port != 22) || (cfg.protocol == PROT_TELNET && cfg.port != 23) || (cfg.protocol == PROT_RLOGIN && cfg.port != 513)) { cfg.port = i ? 22 : j ? 23 : 513; SetDlgItemInt(hwnd, IDC_PORT, cfg.port, FALSE); } } break; case IDC_HOST: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_HOST, cfg.host, sizeof(cfg.host) - 1); break; case IDC_PORT: if (HIWORD(wParam) == EN_CHANGE) { GetDlgItemText(hwnd, IDC_PORT, portname, 31); if (isdigit(portname[0])) MyGetDlgItemInt(hwnd, IDC_PORT, &cfg.port); else { service = getservbyname(portname, NULL); if (service) cfg.port = ntohs(service->s_port); else cfg.port = 0; } } break; case IDC_SESSEDIT: if (HIWORD(wParam) == EN_CHANGE) { SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) - 1, 0); GetDlgItemText(hwnd, IDC_SESSEDIT, savedsession, sizeof(savedsession) - 1); savedsession[sizeof(savedsession) - 1] = '\0'; } break; case IDC_SESSSAVE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { /* * Save a session */ char str[2048]; GetDlgItemText(hwnd, IDC_SESSEDIT, str, sizeof(str) - 1); if (!*str) { int n = SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_GETCURSEL, 0, 0); if (n == LB_ERR) { MessageBeep(0); break; } strcpy(str, sessions[n]); } save_settings(str, !!strcmp(str, "Default Settings"), &cfg); get_sesslist(FALSE); get_sesslist(TRUE); SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_RESETCONTENT, 0, 0); for (i = 0; i < nsessions; i++) SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_ADDSTRING, 0, (LPARAM) (sessions[i])); SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) - 1, 0); } break; case IDC_SESSLIST: case IDC_SESSLOAD: if (LOWORD(wParam) == IDC_SESSLOAD && HIWORD(wParam) != BN_CLICKED && HIWORD(wParam) != BN_DOUBLECLICKED) break; if (LOWORD(wParam) == IDC_SESSLIST && HIWORD(wParam) != LBN_DBLCLK) break; { int n = SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_GETCURSEL, 0, 0); int isdefisdef = !strcmp(sessions[n], "Default Settings"); load_settings(sessions[n], !isdef, &cfg); init_dlg_ctrls(hwnd); if (!isdef) SetDlgItemText(hwnd, IDC_SESSEDIT, sessions[n]); else SetDlgItemText(hwnd, IDC_SESSEDIT, ""); } if (LOWORD(wParam) == IDC_SESSLIST) { /* * A double-click on a saved session should * actually start the session, not just load it. * Unless it's Default Settings or some other * host-less set of saved settings. */ if (*cfg.host) { readytogo = TRUE; SetCapture(hwnd); } } break; case IDC_SESSDEL: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { int n = SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_GETCURSEL, 0, 0); if (n == LB_ERR || n == 0) { MessageBeep(0); break; } del_settings(sessions[n]); get_sesslist(FALSE); get_sesslist(TRUE); SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_RESETCONTENT, 0, 0); for (i = 0; i < nsessions; i++) SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_ADDSTRING, 0, (LPARAM) (sessions[i])); SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) - 1, 0); } case IDC_PINGEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt(hwnd, IDC_PINGEDIT, &cfg.ping_interval); break; case IDC_DEL008: case IDC_DEL127: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.bksp_is_delete = IsDlgButtonChecked(hwnd, IDC_DEL127); break; case IDC_HOMETILDE: case IDC_HOMERXVT: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.rxvt_homeend = IsDlgButtonChecked(hwnd, IDC_HOMERXVT); break; case IDC_FUNCTILDE: case IDC_FUNCLINUX: case IDC_FUNCXTERM: case IDC_FUNCVT400: case IDC_FUNCVT100P: case IDC_FUNCSCO: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) switch (LOWORD(wParam)) { case IDC_FUNCTILDE: cfg.funky_type = 0; break; case IDC_FUNCLINUX: cfg.funky_type = 1; break; case IDC_FUNCXTERM: cfg.funky_type = 2; break; case IDC_FUNCVT400: cfg.funky_type = 3; break; case IDC_FUNCVT100P: cfg.funky_type = 4; break; case IDC_FUNCSCO: cfg.funky_type = 5; break; } break; case IDC_KPNORMAL: case IDC_KPAPPLIC: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { cfg.app_keypad = IsDlgButtonChecked(hwnd, IDC_KPAPPLIC); cfg.nethack_keypad = FALSE; } break; case IDC_KPNH: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { cfg.app_keypad = FALSE; cfg.nethack_keypad = TRUE; } break; case IDC_CURNORMAL: case IDC_CURAPPLIC: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.app_cursor = IsDlgButtonChecked(hwnd, IDC_CURAPPLIC); break; case IDC_NOAPPLICC: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.no_applic_c = IsDlgButtonChecked(hwnd, IDC_NOAPPLICC); break; case IDC_NOAPPLICK: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.no_applic_k = IsDlgButtonChecked(hwnd, IDC_NOAPPLICK); break; case IDC_ALTF4: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.alt_f4 = IsDlgButtonChecked(hwnd, IDC_ALTF4); break; case IDC_ALTSPACE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.alt_space = IsDlgButtonChecked(hwnd, IDC_ALTSPACE); break; case IDC_ALTONLY: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.alt_only = IsDlgButtonChecked(hwnd, IDC_ALTONLY); break; case IDC_ECHOBACKEND: case IDC_ECHOYES: case IDC_ECHONO: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (LOWORD(wParam) == IDC_ECHOBACKEND) cfg.localecho = LD_BACKEND; if (LOWORD(wParam) == IDC_ECHOYES) cfg.localecho = LD_YES; if (LOWORD(wParam) == IDC_ECHONO) cfg.localecho = LD_NO; } break; case IDC_EDITBACKEND: case IDC_EDITYES: case IDC_EDITNO: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (LOWORD(wParam) == IDC_EDITBACKEND) cfg.localedit = LD_BACKEND; if (LOWORD(wParam) == IDC_EDITYES) cfg.localedit = LD_YES; if (LOWORD(wParam) == IDC_EDITNO) cfg.localedit = LD_NO; } break; case IDC_ANSWEREDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_ANSWEREDIT, cfg.answerback, sizeof(cfg.answerback) - 1); break; case IDC_ALWAYSONTOP: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.alwaysontop = IsDlgButtonChecked(hwnd, IDC_ALWAYSONTOP); break; case IDC_SCROLLKEY: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.scroll_on_key = IsDlgButtonChecked(hwnd, IDC_SCROLLKEY); break; case IDC_SCROLLDISP: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.scroll_on_disp = IsDlgButtonChecked(hwnd, IDC_SCROLLDISP); break; case IDC_COMPOSEKEY: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.compose_key = IsDlgButtonChecked(hwnd, IDC_COMPOSEKEY); break; case IDC_CTRLALTKEYS: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.ctrlaltkeys = IsDlgButtonChecked(hwnd, IDC_CTRLALTKEYS); break; case IDC_WRAPMODE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.wrap_mode = IsDlgButtonChecked(hwnd, IDC_WRAPMODE); break; case IDC_DECOM: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.dec_om = IsDlgButtonChecked(hwnd, IDC_DECOM); break; case IDC_LFHASCR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.lfhascr = IsDlgButtonChecked(hwnd, IDC_LFHASCR); break; case IDC_ROWSEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt(hwnd, IDC_ROWSEDIT, &cfg.height); break; case IDC_COLSEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt(hwnd, IDC_COLSEDIT, &cfg.width); break; case IDC_SAVEEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt(hwnd, IDC_SAVEEDIT, &cfg.savelines); break; case IDC_CHOOSEFONT: lf.lfHeight = cfg.fontheight; lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0; lf.lfItalic = lf.lfUnderline = lf.lfStrikeOut = 0; lf.lfWeight = (cfg.fontisbold ? FW_BOLD : 0); lf.lfCharSet = cfg.fontcharset; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE; strncpy(lf.lfFaceName, cfg.font, sizeof(lf.lfFaceName) - 1); lf.lfFaceName[sizeof(lf.lfFaceName) - 1] = '\0'; cf.lStructSize = sizeof(cf); cf.hwndOwner = hwnd; cf.lpLogFont = &lf; cf.Flags = CF_FIXEDPITCHONLY | CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS; if (ChooseFont(&cf)) { strncpy(cfg.font, lf.lfFaceName, sizeof(cfg.font) - 1); cfg.font[sizeof(cfg.font) - 1] = '\0'; cfg.fontisbold = (lf.lfWeight == FW_BOLD); cfg.fontcharset = lf.lfCharSet; cfg.fontheight = cf.iPointSize / 10; fmtfont(fontstatic); SetDlgItemText(hwnd, IDC_FONTSTATIC, fontstatic); } break; case IDC_BELL_DISABLED: case IDC_BELL_DEFAULT: case IDC_BELL_WAVEFILE: case IDC_BELL_VISUAL: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (LOWORD(wParam) == IDC_BELL_DISABLED) cfg.beep = BELL_DISABLED; if (LOWORD(wParam) == IDC_BELL_DEFAULT) cfg.beep = BELL_DEFAULT; if (LOWORD(wParam) == IDC_BELL_WAVEFILE) cfg.beep = BELL_WAVEFILE; if (LOWORD(wParam) == IDC_BELL_VISUAL) cfg.beep = BELL_VISUAL; } break; case IDC_BELL_WAVEBROWSE: memset(&of, 0, sizeof(of)); #ifdef OPENFILENAME_SIZE_VERSION_400 of.lStructSize = OPENFILENAME_SIZE_VERSION_400; #else of.lStructSize = sizeof(of); #endif of.hwndOwner = hwnd; of.lpstrFilter = "Wave Files\0*.WAV\0AllFiles\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filename; strcpy(filename, cfg.bell_wavefile); of.nMaxFile = sizeof(filename); of.lpstrFileTitle = NULL; of.lpstrInitialDir = NULL; of.lpstrTitle = "Select Bell Sound File"; of.Flags = 0; if (GetOpenFileName(&of)) { strcpy(cfg.bell_wavefile, filename); SetDlgItemText(hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile); } break; case IDC_BELL_WAVEEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile, sizeof(cfg.bell_wavefile) - 1); break; case IDC_BELLOVL: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.bellovl = IsDlgButtonChecked(hwnd, IDC_BELLOVL); break; case IDC_BELLOVLN: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt(hwnd, IDC_BELLOVLN, &cfg.bellovl_n); break; case IDC_BELLOVLT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemFlt(hwnd, IDC_BELLOVLT, &cfg.bellovl_t, 1000); break; case IDC_BELLOVLS: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemFlt(hwnd, IDC_BELLOVLS, &cfg.bellovl_s, 1000); break; case IDC_BLINKTEXT: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.blinktext = IsDlgButtonChecked(hwnd, IDC_BLINKTEXT); break; case IDC_BCE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.bce = IsDlgButtonChecked(hwnd, IDC_BCE); break; case IDC_WINNAME: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.win_name_always = IsDlgButtonChecked(hwnd, IDC_WINNAME); break; case IDC_HIDEMOUSE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.hide_mouseptr = IsDlgButtonChecked(hwnd, IDC_HIDEMOUSE); break; case IDC_SUNKENEDGE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.sunken_edge = IsDlgButtonChecked(hwnd, IDC_SUNKENEDGE); break; case IDC_CURBLOCK: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.cursor_type = 0; break; case IDC_CURUNDER: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.cursor_type = 1; break; case IDC_CURVERT: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.cursor_type = 2; break; case IDC_BLINKCUR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.blink_cur = IsDlgButtonChecked(hwnd, IDC_BLINKCUR); break; case IDC_SCROLLBAR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.scrollbar = IsDlgButtonChecked(hwnd, IDC_SCROLLBAR); break; case IDC_LOCKSIZE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.locksize = IsDlgButtonChecked(hwnd, IDC_LOCKSIZE); break; case IDC_WINEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_WINEDIT, cfg.wintitle, sizeof(cfg.wintitle) - 1); break; case IDC_COEALWAYS: case IDC_COENEVER: case IDC_COENORMAL: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { cfg.close_on_exit = IsDlgButtonChecked(hwnd, IDC_COEALWAYS) ? COE_ALWAYS : IsDlgButtonChecked(hwnd, IDC_COENEVER) ? COE_NEVER : COE_NORMAL; } break; case IDC_CLOSEWARN: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.warn_on_close = IsDlgButtonChecked(hwnd, IDC_CLOSEWARN); break; case IDC_TTEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_TTEDIT, cfg.termtype, sizeof(cfg.termtype) - 1); break; case IDC_LGFEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_LGFEDIT, cfg.logfilename, sizeof(cfg.logfilename) - 1); break; case IDC_LGFBUTTON: memset(&of, 0, sizeof(of)); #ifdef OPENFILENAME_SIZE_VERSION_400 of.lStructSize = OPENFILENAME_SIZE_VERSION_400; #else of.lStructSize = sizeof(of); #endif of.hwndOwner = hwnd; of.lpstrFilter = "All Files\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filename; strcpy(filename, cfg.logfilename); of.nMaxFile = sizeof(filename); of.lpstrFileTitle = NULL; of.lpstrInitialDir = NULL; of.lpstrTitle = "Select session log file"; of.Flags = 0; if (GetSaveFileName(&of)) { strcpy(cfg.logfilename, filename); SetDlgItemText(hwnd, IDC_LGFEDIT, cfg.logfilename); } break; case IDC_LSTATOFF: case IDC_LSTATASCII: case IDC_LSTATRAW: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (IsDlgButtonChecked(hwnd, IDC_LSTATOFF)) cfg.logtype = 0; if (IsDlgButtonChecked(hwnd, IDC_LSTATASCII)) cfg.logtype = 1; if (IsDlgButtonChecked(hwnd, IDC_LSTATRAW)) cfg.logtype = 2; } break; case IDC_LSTATXASK: case IDC_LSTATXAPN: case IDC_LSTATXOVR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (IsDlgButtonChecked(hwnd, IDC_LSTATXASK)) cfg.logxfovr = LGXF_ASK; if (IsDlgButtonChecked(hwnd, IDC_LSTATXAPN)) cfg.logxfovr = LGXF_APN; if (IsDlgButtonChecked(hwnd, IDC_LSTATXOVR)) cfg.logxfovr = LGXF_OVR; } break; case IDC_TSEDIT: case IDC_R_TSEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, LOWORD(wParam), cfg.termspeed, sizeof(cfg.termspeed) - 1); break; case IDC_LOGEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_LOGEDIT, cfg.username, sizeof(cfg.username) - 1); break; case IDC_RLLUSEREDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_RLLUSEREDIT, cfg.localusername, sizeof(cfg.localusername) - 1); break; case IDC_EMBSD: case IDC_EMRFC: cfg.rfc_environ = IsDlgButtonChecked(hwnd, IDC_EMRFC); break; case IDC_ENVADD: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { char str[sizeof(cfg.environmt)]; char *p; GetDlgItemText(hwnd, IDC_VAREDIT, str, sizeof(str) - 1); if (!*str) { MessageBeep(0); break; } p = str + strlen(str); *p++ = '\t'; GetDlgItemText(hwnd, IDC_VALEDIT, p, sizeof(str) - 1 - (p - str)); if (!*p) { MessageBeep(0); break; } p = cfg.environmt; while (*p) { while (*p) p++; p++; } if ((p - cfg.environmt) + strlen(str) + 2 < sizeof(cfg.environmt)) { strcpy(p, str); p[strlen(str) + 1] = '\0'; SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_ADDSTRING, 0, (LPARAM) str); SetDlgItemText(hwnd, IDC_VAREDIT, ""); SetDlgItemText(hwnd, IDC_VALEDIT, ""); } else { MessageBox(hwnd, "Environment too big", "PuTTY Error", MB_OK | MB_ICONERROR); } } break; case IDC_ENVREMOVE: if (HIWORD(wParam) != BN_CLICKED && HIWORD(wParam) != BN_DOUBLECLICKED) break; i = SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_GETCURSEL, 0, 0); if (i == LB_ERR) MessageBeep(0); else { char *p, *q; SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_DELETESTRING, i, 0); p = cfg.environmt; while (i > 0) { if (!*p) goto disaster; while (*p) p++; p++; i--; } q = p; if (!*p) goto disaster; while (*p) p++; p++; while (*p) { while (*p) *q++ = *p++; *q++ = *p++; } *q = '\0'; disaster:; } break; case IDC_NOPTY: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.nopty = IsDlgButtonChecked(hwnd, IDC_NOPTY); break; case IDC_COMPRESS: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.compression = IsDlgButtonChecked(hwnd, IDC_COMPRESS); break; case IDC_BUGGYMAC: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.buggymac = IsDlgButtonChecked(hwnd, IDC_BUGGYMAC); break; case IDC_AGENTFWD: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.agentfwd = IsDlgButtonChecked(hwnd, IDC_AGENTFWD); break; case IDC_CIPHER3DES: case IDC_CIPHERBLOWF: case IDC_CIPHERDES: case IDC_CIPHERAES: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (IsDlgButtonChecked(hwnd, IDC_CIPHER3DES)) cfg.cipher = CIPHER_3DES; else if (IsDlgButtonChecked(hwnd, IDC_CIPHERBLOWF)) cfg.cipher = CIPHER_BLOWFISH; else if (IsDlgButtonChecked(hwnd, IDC_CIPHERDES)) cfg.cipher = CIPHER_DES; else if (IsDlgButtonChecked(hwnd, IDC_CIPHERAES)) cfg.cipher = CIPHER_AES; } break; case IDC_SSHPROT1: case IDC_SSHPROT2: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (IsDlgButtonChecked(hwnd, IDC_SSHPROT1)) cfg.sshprot = 1; else if (IsDlgButtonChecked(hwnd, IDC_SSHPROT2)) cfg.sshprot = 2; } break; case IDC_AUTHTIS: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.try_tis_auth = IsDlgButtonChecked(hwnd, IDC_AUTHTIS); break; case IDC_PKEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile, sizeof(cfg.keyfile) - 1); break; case IDC_CMDEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_CMDEDIT, cfg.remote_cmd, sizeof(cfg.remote_cmd) - 1); break; case IDC_PKBUTTON: memset(&of, 0, sizeof(of)); #ifdef OPENFILENAME_SIZE_VERSION_400 of.lStructSize = OPENFILENAME_SIZE_VERSION_400; #else of.lStructSize = sizeof(of); #endif of.hwndOwner = hwnd; of.lpstrFilter = "All Files\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filename; strcpy(filename, cfg.keyfile); of.nMaxFile = sizeof(filename); of.lpstrFileTitle = NULL; of.lpstrInitialDir = NULL; of.lpstrTitle = "Select Public Key File"; of.Flags = 0; if (GetOpenFileName(&of)) { strcpy(cfg.keyfile, filename); SetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile); } break; case IDC_RAWCNP: cfg.rawcnp = IsDlgButtonChecked(hwnd, IDC_RAWCNP); case IDC_MBWINDOWS: case IDC_MBXTERM: cfg.mouse_is_xterm = IsDlgButtonChecked(hwnd, IDC_MBXTERM); break; case IDC_CCSET: { BOOL ok; int i; int n = GetDlgItemInt(hwnd, IDC_CCEDIT, &ok, FALSE); if (!ok) MessageBeep(0); else { for (i = 0; i < 256; i++) if (SendDlgItemMessage (hwnd, IDC_CCLIST, LB_GETSEL, i, 0)) { char str[100]; cfg.wordness[i] = n; SendDlgItemMessage(hwnd, IDC_CCLIST, LB_DELETESTRING, i, 0); sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i, (i >= 0x21 && i != 0x7F) ? i : ' ', cfg.wordness[i]); SendDlgItemMessage(hwnd, IDC_CCLIST, LB_INSERTSTRING, i, (LPARAM) str); } } } break; case IDC_BOLDCOLOUR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { int n, i; cfg.bold_colour = IsDlgButtonChecked(hwnd, IDC_BOLDCOLOUR); n = SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_GETCOUNT, 0, 0); if (n != 12 + 10 * cfg.bold_colour) { for (i = n; i-- > 0;) SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_DELETESTRING, i, 0); for (i = 0; i < 22; i++) if (cfg.bold_colour || permcolour[i]) SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_ADDSTRING, 0, (LPARAM) colours[i]); } } break; case IDC_PALETTE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.try_palette = IsDlgButtonChecked(hwnd, IDC_PALETTE); break; case IDC_COLOURLIST: if (HIWORD(wParam) == LBN_DBLCLK || HIWORD(wParam) == LBN_SELCHANGE) { int i = SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_GETCURSEL, 0, 0); if (!cfg.bold_colour) i = (i < 3 ? i * 2 : i == 3 ? 5 : i * 2 - 2); SetDlgItemInt(hwnd, IDC_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt(hwnd, IDC_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt(hwnd, IDC_BVALUE, cfg.colours[i][2], FALSE); } break; case IDC_CHANGE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { static CHOOSECOLOR cc; static DWORD custom[16] = { 0 }; /* zero initialisers */ int i = SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_GETCURSEL, 0, 0); if (!cfg.bold_colour) i = (i < 3 ? i * 2 : i == 3 ? 5 : i * 2 - 2); cc.lStructSize = sizeof(cc); cc.hwndOwner = hwnd; cc.hInstance = (HWND) hinst; cc.lpCustColors = custom; cc.rgbResult = RGB(cfg.colours[i][0], cfg.colours[i][1], cfg.colours[i][2]); cc.Flags = CC_FULLOPEN | CC_RGBINIT; if (ChooseColor(&cc)) { cfg.colours[i][0] = (unsigned char) (cc.rgbResult & 0xFF); cfg.colours[i][1] = (unsigned char) (cc.rgbResult >> 8) & 0xFF; cfg.colours[i][2] = (unsigned char) (cc.rgbResult >> 16) & 0xFF; SetDlgItemInt(hwnd, IDC_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt(hwnd, IDC_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt(hwnd, IDC_BVALUE, cfg.colours[i][2], FALSE); } } break; case IDC_NOXLAT: case IDC_KOI8WIN1251: case IDC_88592WIN1250: case IDC_88592CP852: cfg.xlat_enablekoiwin = IsDlgButtonChecked(hwnd, IDC_KOI8WIN1251); cfg.xlat_88592w1250 = IsDlgButtonChecked(hwnd, IDC_88592WIN1250); cfg.xlat_88592cp852 = IsDlgButtonChecked(hwnd, IDC_88592CP852); break; case IDC_CAPSLOCKCYR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { cfg.xlat_capslockcyr = IsDlgButtonChecked(hwnd, IDC_CAPSLOCKCYR); } break; case IDC_VTXWINDOWS: case IDC_VTOEMANSI: case IDC_VTOEMONLY: case IDC_VTPOORMAN: cfg.vtmode = (IsDlgButtonChecked(hwnd, IDC_VTXWINDOWS) ? VT_XWINDOWS : IsDlgButtonChecked(hwnd, IDC_VTOEMANSI) ? VT_OEMANSI : IsDlgButtonChecked(hwnd, IDC_VTOEMONLY) ? VT_OEMONLY : VT_POORMAN); break; case IDC_X11_FORWARD: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.x11_forward = IsDlgButtonChecked(hwnd, IDC_X11_FORWARD); break; case IDC_X11_DISPLAY: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_X11_DISPLAY, cfg.x11_display, sizeof(cfg.x11_display) - 1); break; } return 0; case WM_CLOSE: EndDialog(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) SetActiveWindow(hwnd); } return GenericMainDlgProc(hwnd, msg, wParam, lParam, 0); } static int CALLBACK ReconfDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { return GenericMainDlgProc(hwnd, msg, wParam, lParam, 1); } void defuse_showwindow(void) HWND hwnd; hwnd = CreateDialog(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, NullDlgProc); ShowWindow(hwnd, SW_HIDE); DestroyWindow(hwnd); } } int do_config(void) { int ret; get_sesslist(TRUE); savedsession[0] = '\0'; ret = DialogBox(hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL, MainDlgProc); get_sesslist(FALSE); return ret; } int do_reconfig(HWND hwnd) { Config backup_cfg; int ret; backup_cfg = cfg; /* structure copy */ ret = DialogBox(char *string) localtime(&t)); events[nevents] = smalloc(strlen(timebuf) + strlen(string) + 1); strcpy(events[nevents], timebuf); strcat(events[nevents], string); if (logbox) { int count; SendDlgItemMessage(logbox, IDN_LIST, LB_ADDSTRING, 0, (LPARAM) events[nevents]); count = SendDlgItemMessage(logbox, IDN_LIST, LB_GETCOUNT, 0, 0); SendDlgItemMessage(logbox, IDN_LIST, LB_SETTOPINDEX, count - 1, 0); } nevents++; } void showeventlog(HWND hwnd) { if (!logbox) { logbox = CreateDialog(hinst, MAKEINTRESOURCE(IDD_LOGBOX), hwnd, LogProc); ShowWindow(logbox, SW_SHOWNORMAL); } SetActiveWindow(logbox); } void showabout(HWND hwnd) { DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc); } void verify_ssh_host_key(char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; static const char absentmsg[] = "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, hit Yes to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you do not trust this host, hit No to abandon the\n" "connection.\n"; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "hit Yes to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, hit No.\n" "If you want to abandon the connection completely, hit\n" "Cancel. Hitting Cancel is the ONLY guaranteed safe\n" char message[160 + /* sensible fingerprint max size */ (sizeof(absentmsg) > sizeof(wrongmsg) ? /* success - key matched OK */ return; if (ret == 2) { /* key was different */ int mbret; sprintf(message, wrongmsg, fingerprint); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNOCANCEL); if (mbret == IDYES) store_host_key(host, port, keytype, keystr); if (mbret == IDCANCEL) exit(0); } if (ret == 1) { /* key was absent */ int mbret; sprintf(message, absentmsg, fingerprint); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNO); if (mbret == IDNO) exit(0); cfg.logxfovr != LGXF_ASK) { return ((cfg.logxfovr == Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 34c987451a3291ea7b8ce0b6e649cf7e Text-delta-base-sha1: 4c821e96e6114e9a8623eaa0872fa4473d3a3e89 Text-content-length: 40519 Text-content-md5: af8eea949f9adef79237627c262ea59b Text-content-sha1: 8970cc9c2782f0de14d43724c6637c74eccc3b37 Content-length: 40560 K 15 cvs2svn:cvs-rev V 5 1.125 PROPS-END SVN4Ni 4$^GQRHi1P:pqb-Ek@jzfhLON8Hd^IvQ,zr' oc6g>p7(eekaI++&Wr*kv(o::[9`kPqWqhjZMcO3bL]{VoT}Y h y,&x x 7KD|tf_{4L?V=L?K=L?K=$_wzsq8.[fv}]cRtA22.iRp[C.3G;X @1$%%BF,g7*!N -g8:'cS6"iV+:7Z;^vTz8H" .e@ 1M? ,z width) w = width; if (h > height) h = height; if (w < 15) w = 15; if (h < 1) w = 1; (hwnd, NULL, 0, 0, width, height, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); } static void click(Mouse_Button b, int x, int y, int shift, int ctrl) { static int cursor_visible = 1; if (!cfg.hide_mouseptr) /* override if this feature disabled */ show = 1; if (cursor_visible && !show) ShowCursor(FALSE); else if (!cursor_visible && show) ShowCursor(TRUE); cursor_visible = show; } static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) noise_regular(); HideCaret(hwnd); term_update(); ShowCaret(hwnd); if (cfg.ping_interval > 0) { time_t now; time(&now); if (now - last_movement > cfg.ping_interval) { back->special(TS_PING); last_movement = now; } } return 0; case WM_CREATE: break; case WM_CLOSE: show_mouseptr(1); if (!cfg.warn_on_close || session_closed || MessageBox(hwnd, show_mouseptr(1); PostQuitMessage 0xFFFFFFFF, &sa, PAGE_READWRITE, 0, sizeof(Config), NULL); if (filemap) { p = (Config *) MapViewOfFile(filemap, FILE_MAP_WRITE, (NULL, b, sizeof(b) - (b, cl, NULL, NULL, TRUE, case IDM_RECONF: { int prev_alwaysontop = cfg.alwaysontop; GetWindowText(hwnd, cfg.wintitle, sizeof(cfg.wintitle)); if (!do_reconfig(hwnd)) just_reconfigged = TRUE; { int i; for (i = 0; i < 8; i++) if (fonts[i]) DeleteObject(fonts[i]); } bold_mode = cfg.bold_colour ? BOLD_COLOURS : BOLD_FONT; und_mode = UND_FONT; init_fonts(0); sfree(logpal); /* * Flush the line discipline's edit buffer in the * case where local editing has just been disabled. */ ldisc_send(NULL, 0); if (pal) DeleteObject(pal); logpal = NULL; pal = NULL; cfgtopalette(); init_palette(); /* Enable or disable the scroll bar, etc */ { LONG nflg, flag = GetWindowLong(hwnd, GWL_STYLE); LONG nexflag, exflag = GetWindowLong(hwnd, GWL_EXSTYLE); nexflag = exflag; if (cfg.alwaysontop != prev_alwaysontop) { if (cfg.alwaysontop) { nexflag |= WS_EX_TOPMOST; SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } else { nexflag &= ~(WS_EX_TOPMOST); SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } } if (cfg.sunken_edge) nexflag |= WS_EX_CLIENTEDGE; else nexflag &= ~(WS_EX_CLIENTEDGE); nflg = flag; if (cfg.scrollbar) nflg |= WS_VSCROLL; else nflg &= ~WS_VSCROLL; if (cfg.locksize) nflg &= ~(WS_THICKFRAME | WS_MAXIMIZEBOX); else nflg |= (WS_THICKFRAME | WS_MAXIMIZEBOX); if (nflg != flag || nexflag != exflag) { RECT cr, wr; if (nflg != flag) SetWindowLong(hwnd, GWL_STYLE, nflg); if (nexflag != exflag) SetWindowLong(hwnd, GWL_EXSTYLE, nexflag); SendMessage(hwnd, WM_IGNORE_SIZE, 0, 0); SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); GetWindowRect(hwnd, &wr); GetClientRect(hwnd, &cr); extra_width = wr.right - wr.left - cr.right + cr.left; extra_height = wr.bottom - wr.top - cr.bottom + cr.top; } cfg.sunken_edge != prev_sunken_edge) need_setwpos = TRUE; term_size(cfg.height, cfg.width, cfg.savelines); InvalidateRect(hwnd, NULL, TRUE); if (need_setwpos) { force_normal(hwnd); SetWindowPos(hwnd, NULL, 0, 0, extra_width + font_width * cfg.width, extra_height + font_height * cfg.height, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); } set_title(cfg.wintitle); if (IsIconic(hwnd)) { SetWindowText(hwnd, cfg.win_name_always ? window_name : icon_name); } } break; case IDM_COPYALL: term_copyall(); break; case IDM_CLRSB: term_clrsb(); break; case IDM_RESET: term_pwron(); break; case IDM_TEL_AYT: back->special(TS_AYT); break; case IDM_TEL_BRK: back->special(TS_BRK); break; case IDM_TEL_SYNCH: back->special(TS_SYNCH); break; case IDM_TEL_EC: back->special(TS_EC); break; case IDM_TEL_EL: back->special(TS_EL); break; case IDM_TEL_GA: back->special(TS_GA); break; case IDM_TEL_NOP: back->special(TS_NOP); break; case IDM_TEL_ABORT: back->special(TS_ABORT); break; case IDM_TEL_AO: back->special(TS_AO); break; case IDM_TEL_IP: back->special(TS_IP); break; case IDM_TEL_SUSP: back->special(TS_SUSP); break; case IDM_TEL_EOR: back->special(TS_EOR); break; case IDM_TEL_EOF: back->special(TS_EOF); break; case IDM_ABOUT: showabout(hwnd); break; default: if (wParam >= IDM_SAVED_MIN && wParam <= IDM_SAVED_MAX) { SendMessage(hwnd, WM_SYSCOMMAND, IDM_SAVEDSESS, wParam); TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT, wParam & MK_CONTROL); term_mouse(b, MA_RELEASE, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT, wParam & MK_CONTROL); } else { /* trigger a scroll */ term_scroll(0, b == MBT_WHEEL_UP ? -rows / 2 : rows / button = MBT_LEFT; press = 1; break; case WM_MBUTTONDOWN: button = MBT_MIDDLE; press = 1; break; case WM_RBUTTONDOWN: button = MBT_RIGHT; press = 1; break; case WM_LBUTTONUP: button = MBT_LEFT; press = 0; break; case WM_MBUTTONUP: button = MBT_MIDDLE; press = 0; break; case WM_RBUTTONUP: button = MBT_RIGHT; press = 0; break; } show_mouseptr(1); if (press) { click(button, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT, wParam & MK_CONTROL); SetCapture(hwnd); } else { term_mouse(button, MA_RELEASE, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT, wParam & MK_CONTROL); ReleaseCapture(); } } return 0; case WM_MOUSEMOVE: (b, MA_DRAG, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT, HideCaret(hwnd); hdc = BeginPaint(hwnd, &p); if (pal) { SelectPalette(hdc, pal, TRUE); RealizePalette(hdc); } term_paint(hdc, p.rcPaint.left, p.rcPaint.top, p.rcPaint.right, p.rcPaint.bottom); SelectObject(hdc, GetStockObject(SYSTEM_FONT)); SelectObject(hdc, GetStockObject(WHITE_PEN)); EndPaint(hwnd, &p); = wParam; pend_netevent_lParam = lParam; time(&last_movement); return 0; case WM_SETFOCUS: has_focus = TRUE; CreateCaret(hwnd, caretbm, font_width, font_height); ShowCaret(hwnd); compose_state = 0; term_out(); term_update(); break; case WM_KILLFOCUS: show_mouseptr(1); has_focus = FALSE; EnableSizeTip(1); resizing = TRUE; need_backend_resize = FALSE; break; case WM_EXITSIZEMOVE: EnableSizeTip(0); resizing = FALSE; if (need_backend_resize) back->size(); / 2) / font_width; if (w < 1) w = 1; h = (height + font_height / 2) / font_height; if (h < 1) h = 1; (hwnd, /* we have fixed this using WM_SIZING now */ int ew, eh; #endif width = LOWORD(lParam); height = HIWORD(lParam); w = width / font_width; if (w < 1) w = 1; h = height / font_height; if (h < 1) h = 1; #if 0 (hwnd, &r); SendMessage(hwnd, WM_IGNORE_SIZE, 0, 0); SetWindowPos(hwnd, NULL, 0, 0, r.right - r.left - ew, r.bottom - r.top - eh, (h, w, cfg.savelines); /* * Don't call back->size in mid-resize. (To prevent * massive numbers of resize events getting sent * down the connection during an NT opaque drag.) */ if (!resizing) term_scroll(-1, 0); break; case SB_TOP: term_scroll(+1, 0); break; case SB_LINEDOWN: term_scroll(0, +1); break; case SB_LINEUP: term_scroll(0, -1); break; case SB_PAGEDOWN: term_scroll(0, +rows / 2); break; case SB_PAGEUP: term_scroll(0, -rows / 2); break; case SB_THUMBPOSITION: case SB_THUMBTRACK: term_scroll(1, HIWORD(wParam)); break; } break; (hdc) > 0) UpdateColors(hdc); free_ctx(hdc) > 0) UpdateColors(hdc); free_ctx if (wParam == VK_PROCESSKEY) { MSG m; m.hwnd = hwnd; m.message = WM_KEYDOWN; m.wParam = wParam; m.lParam = lParam & 0xdfff; TranslateMessage(&m); } else { len = TranslateKey(message, wParam, lParam, buf); if (len == -1) return DefWindowProc(hwnd, message, wParam, lParam); ldisc_send(buf, len); if (len > 0) { char c = xlat_kbd2tty((unsigned char) wParam); ldisc_send(&c, 1); } return 0; case WM_SETCURSOR: if (send_raw_mouse) { SetCursor(LoadCursor(NULL, IDC_ARROW)); return TRUE; } } return DefWindowProc (Context ctx, int x, int y, char *text, int len, unsigned long attr, int lattr) * (1 + (lattr != LATTR_NORM)); static int *IpDx = 0, IpDxLEN = 0;; if (len > IpDxLEN || IpDx[0] != fnt_width) { int i; if (len > IpDxLEN) { sfree(IpDx); IpDx = smalloc((len + 16) * sizeof(int)); IpDxLEN = (len + 16); } for (i = 0; i < = 0; i < "\x20\xAD\xBD\x9C\xCF\xBE\xDD\xF5" /* A0-A7 */ "\xF9\xB8\xA6\xAE\xAA\xF0\xA9\xEE" /* A8-AF */ "\xF8\xF1\xFD\xFC\xEF\xE6\xF4\xFA" /* B0-B7 */ "\xF7\xFB\xA7\xAF\xAC\xAB\xF3\xA8" /* B8-BF */ "\xB7\xB5\xB6\xC7\x8E\x8F\x92\x80" /* C0-C7 */ "\xD4\x90\xD2\xD3\xDE\xD6\xD7\xD8" /* C8-CF */ "\xD1\xA5\xE3\xE0\xE2\xE5\x99\x9E" /* D0-D7 */ "\x9D\xEB\xE9\xEA\x9A\xED\xE8\xE1" /* D8-DF */ "\x85\xA0\x83\xC6\x84\x86\x91\x87" /* E0-E7 */ "\x8A\x82\x88\x89\x8D\xA1\x8C\x8B" /* E8-EF */ "\xD0\xA4\x95\xA2\x93\xE4\x94\xF6" /* F0-F7 */ "\x9B\x97\xA3\x96\x81\xEC\xE7\x98" /* F8-FF */ = 0; i < | FONT_OEM]) { case VT_OEMONLY: nfont |= FONT_OEM; for (i = 0; i < len; i++) if (text[i] >= '\x60' && text[i] <= '\x7E') text[i] = oemmap[(unsigned char) text[i] - 0x60]; break; } case VT_POORMAN: for (i = 0; i < len; i++) if (text[i] >= '\x60' && text[i] <= '\x7E') text[i] = poorman[(unsigned char) { if (nfont & | FONT_UNDERLINE); } if (font_needs_hand_underlining && (attr & ATTR_UNDER)) force_manual_underline = 1; if (attr & ATTR_REVERSE) { t = nfg; nfg = nbg; (hdc, fonts[nfont]); SetTextColor(hdc, fg); SetBkColor(hdc, bg); SetBkMode(hdc, OPAQUE); line_box.left = x; line_box.top = y; line_box.right = x + fnt_width * len; line_box.bottom = y + font_height; ExtTextOut(hdc, x, y, ETO_CLIPPED | ETO_OPAQUE, &line_box, text, len, (hdc, TRANSPARENT); /* GRR: This draws the character outside it's box and can leave * 'droppings' even with the clip box! I suppose I could loop it * one character at a time ... yuk. * * Or ... I could do a test print with "W", and use +1 or -1 for this * shift depending on if the leftmost column is blank... */ ExtTextOut(hdc, x - (und_mode == UND_LINE && (attr & ATTR_UNDER))) { HPEN oldpen; oldpen = SelectObject(hdc, CreatePen(PS_SOLID, 0, fg)); MoveToEx(hdc, x, y + descent, NULL); LineTo(hdc, x + len * fnt_width, y + descent); oldpen = SelectObject(hdc, oldpen); DeleteObject(oldpen); } if ((attr & ATTR_PASCURS) && cfg.cursor_type == 0) { POINT pts[5]; HPEN oldpen; pts[0].x = pts[1].x = pts[4].x = x; pts[2].x = pts[3].x = x + fnt_width - 1; pts[0].y = pts[3].y = pts[4].y = y; pts[1].y = pts[2].y = y + font_height - 1; oldpen = SelectObject(hdc, CreatePen(PS_SOLID, 0, colours[23])); Polyline(hdc, pts, 5); oldpen = SelectObject(hdc, oldpen); DeleteObject(oldpen); } if ((attr & (ATTR_ACTCURS | ATTR_PASCURS)) && cfg.cursor_type != 0) { int startx, starty, dx, dy, length, i; if (cfg.cursor_type == 1) { startx = x; starty = y + descent; dx = 1; dy = 0; length = fnt_width; } else { int xadjust = 0; if (attr & ATTR_RIGHTCURS) xadjust = fnt_width - 1; startx = x + xadjust; starty = y; dx = 0; dy = 1; length = font_height; } if (attr & ATTR_ACTCURS) { HPEN oldpen; oldpen = SelectObject(hdc, CreatePen(PS_SOLID, 0, colours[23])); MoveToEx(hdc, startx, starty, NULL); LineTo(hdc, startx + dx * length, starty + dy * length); oldpen = SelectObject(hdc, oldpen); DeleteObject(oldpen); } else { for (i = 0; i < length; i++) { if (i % 2 == 0) { SetPixel(hdc, startx, starty, colours[23]); } startx += dx; starty += dy; } } } } static int check_compose(int first, int second) { static char *composetbl[] = { "++#", "AA@", "(([", "//\\", "))]", "(-{", "-)}", "/^|", "!!", "C/", "C|", "L-", "L=", "XO", "X0", "Y-", "Y=", "||", "SO", "S!", "S0", "\"\"", "CO", "C0", "A_", "<<", ",-", "--", "RO", "-^", "0^", "+-", "2^", "3^", "''", "/U", "P!", ".^", ",,", "1^", "O_", ">>", "14", "12", "34", "??", "`A", "'A", "^A", "~A", "\"A", "*A", "AE", ",C", "`E", "'E", "^E", "\"E", "`I", "'I", "^I", "\"I", "-D", "~N", "`O", "'O", "^O", "~O", "\"O", "XX", "/O", "`U", "'U", "^U", "\"U", "'Y", "HT", "ss", "`a", "'a", "^a", "~a", "\"a", "*a", "ae", ",c", "`e", "'e", "^e", "\"e", "`i", "'i", "^i", "\"i", "-d", "~n", "`o", "'o", "^o", "~o", "\"o", ":-", "o/", "`u", "'u", "^u", "\"u", "'y", "ht", "\"y", 0 }; char **c; static int recurse = 0; int nc = -1; for (c = composetbl; *c; c++) { if ((*c)[0] == first && (*c)[1] == second) { return (*c)[2] & 0xFF; } } if (recurse == 0) { recurse = 1; nc = check_compose(second, first); if (nc == -1) nc = check_compose(toupper(first), toupper(second)); if (nc == -1) nc = check_compose(toupper(second), toupper(first)); recurse = { BYTE keystate[256]; int scan, left_alt = 0, key_down, shift_state; int r, i, code; unsigned char * r = GetKeyboardState(keystate); if (!r) memset(keystate, 0, sizeof(keystate)); else { #if 0 { /* Tell us all about key events */ static BYTE oldstate[256]; static int first = 1; static int scan; int ch; if (first) memcpy(oldstate, keystate, sizeof(oldstate)); first = 0; if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) == KF_REPEAT) { debug(("+")); } else if ((HIWORD(lParam) & KF_UP) && scan == (HIWORD(lParam) & 0xFF)) { debug((". U")); } else { debug((".\n")); if (wParam >= VK_F1 && wParam <= VK_F20) debug(("K_F%d", wParam + 1 - VK_F1)); else switch (wParam) { case VK_SHIFT: debug(("SHIFT")); break; case VK_CONTROL: debug(("CTRL")); break; case VK_MENU: debug(("ALT")); break; default: debug(("VK_%02x", wParam)); } if (message == WM_SYSKEYDOWN || message == WM_SYSKEYUP) debug(("*")); debug((", S%02x", scan = (HIWORD(lParam) & 0xFF))); ch = MapVirtualKeyEx(wParam, 2, kbd_layout); if (ch >= ' ' && ch <= '~') debug((", '%c'", ch)); else if (ch) debug((", $%02x", ch)); if (keys[0]) debug((", KB0=%02x", keys[0])); if (keys[1]) debug((", KB1=%02x", keys[1])); if (keys[2]) debug((", KB2=%02x", keys[2])); if ((keystate[VK_SHIFT] & 0x80) != 0) debug((", S")); if ((keystate[VK_CONTROL] & 0x80) != 0) debug((", C")); if ((HIWORD(lParam) & KF_EXTENDED)) debug((", E")); if ((HIWORD(lParam) & KF_UP)) debug((", U")); } if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) == KF_REPEAT); else if ((HIWORD(lParam) & KF_UP)) oldstate[wParam & 0xFF] ^= 0x80; else oldstate[wParam & 0xFF] ^= 0x81; for (ch = 0; ch < 256; ch++) if (oldstate[ch] != keystate[ch]) debug((", M%02x=%02x", ch, keystate[ch])); memcpy(oldstate, keystate, sizeof(oldstate)); } #endif if (wParam == VK_MENU && (HIWORD(lParam) & (cfg.funky_type == 3 || (cfg.funky_type <= 1 && app_keypad_keys && !cfg.no_applic_k)) && wParam == VK_NUMLOCK && !(keystate[VK_SHIFT] & 0x80)) { wParam = VK_EXECUTE; /* UnToggle NUMLock */ if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) == 0) keystate[VK_NUMLOCK] ^= 1; } /* And write back the 'adjusted' state */ SetKeyboardState & (KF_UP | KF_REPEAT)) == KF_REPEAT) return 0; if ((HIWORD(lParam) & KF_ALTDOWN) && (keystate[VK_RMENU] & 0x80) == 0) left_alt = 1; key_down = ((HIWORD(lParam) & KF_UP) == & & 0x80) != 0) + ((keystate[VK_CONTROL] & 0x80) != 0) * & { if (compose_state == 0 && (HIWORD(lParam) & (KF_UP | KF_REPEAT)) == 0) compose_state = 1; else if (compose_state == 1 && (HIWORD(lParam) & KF_UP)) compose_state = 2; else compose_state = 0; } else if (compose_state == (wParam != VK_SHIFT && wParam != VK_PRIOR && wParam != VK_NEXT) { seen_key_event = 1; } /* Make sure we're not pasting */ if (key_down) term_nopaste(); if (compose_state > 1 && left_alt) compose_state = 0; /* Sanitize the number pad if not using a PC NumPad */ if (left_alt || (app_keypad_keys && !cfg.no_applic_k ) { if ((HIWORD(lParam) & KF_EXTENDED) == 0) { int nParam = 0; switch (wParam) { case VK_INSERT: nParam = VK_NUMPAD0; break; case VK_END: nParam = VK_NUMPAD1; break; case VK_DOWN: nParam = VK_NUMPAD2; break; case VK_NEXT: nParam = VK_NUMPAD3; break; case VK_LEFT: nParam = VK_NUMPAD4; break; case VK_CLEAR: nParam = VK_NUMPAD5; break; case VK_RIGHT: nParam = VK_NUMPAD6; break; case VK_HOME: nParam = VK_NUMPAD7; break; case VK_UP: nParam = VK_NUMPAD8; break; case VK_PRIOR: nParam = VK_NUMPAD9; break; case VK_DELETE: nParam = VK_DECIMAL; break; } if (nParam) { if (keystate[VK_NUMLOCK] & 1) & 0x80) == 0 && !compose_state) { /* Okay, prepare for most alts then ... */ if (left_alt) SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0); return 0; } if (wParam == VK_NEXT && shift_state == 1) { SendMessage(hwnd, WM_VSCROLL, SB_PAGEDOWN, 0); return 0; } if (wParam == VK_INSERT && shift_state == 1) { term_mouse(MBT_PASTE, MA_CLICK, 0, 0, 0, 0); term_mouse(MBT_PASTE, MA_RELEASE, 0, 0, 0, 0); return 0; } if (left_alt && wParam == VK_F4 && cfg.alt_f4) { PostMessage(hwnd, WM_CHAR, ' ', 0); SendMessage(hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0); switch (wParam) { case VK_NUMPAD1: *p++ = shift_state ? 'B' : 'b'; return p - output; case VK_NUMPAD2: *p++ = shift_state ? 'J' : 'j'; return p - output; case VK_NUMPAD3: *p++ = shift_state ? 'N' : 'n'; return p - output; case VK_NUMPAD4: *p++ = shift_state ? 'H' : 'h'; return p - output; case VK_NUMPAD5: *p++ = shift_state ? '.' : '.'; return p - output; case VK_NUMPAD6: *p++ = shift_state ? 'L' : 'l'; return p - output; case VK_NUMPAD7: *p++ = shift_state ? 'Y' : 'y'; return p - output; case VK_NUMPAD8: *p++ = shift_state ? 'K' : 'k'; return p - output; case VK_NUMPAD9: *p++ = shift_state ? 'U' : 'u'; return p - output; } } /* Application Keypad */ if (!left_alt) { int xkey = 0; if (cfg.funky_type == 3 || (cfg.funky_type <= 1 && app_keypad_keys && !cfg.no_applic_k)) switch (wParam) { case VK_EXECUTE: xkey = 'P'; break; case VK_DIVIDE: xkey = 'Q'; break; case VK_MULTIPLY: xkey = 'R'; break; case VK_SUBTRACT: xkey = 'S'; break; } if (app_keypad_keys && !cfg.no_applic_k) switch (wParam) { case VK_NUMPAD0: xkey = 'p'; break; case VK_NUMPAD1: xkey = 'q'; break; case VK_NUMPAD2: xkey = 'r'; break; case VK_NUMPAD3: xkey = 's'; break; case VK_NUMPAD4: xkey = 't'; break; case VK_NUMPAD5: xkey = 'u'; break; case VK_NUMPAD6: xkey = 'v'; break; case VK_NUMPAD7: xkey = 'w'; break; case VK_NUMPAD8: xkey = 'x'; break; case VK_NUMPAD9: xkey = 'y'; break; case VK_DECIMAL: xkey = 'n'; break; case VK_ADD: if (cfg.funky_type == 2) { if (shift_state) xkey = 'l'; else xkey = 'k'; } else if (shift_state) xkey = 'm'; else xkey = 'l'; break; case VK_DIVIDE: if (cfg.funky_type == 2) xkey = 'o'; break; case VK_MULTIPLY: if (cfg.funky_type == 2) xkey = 'j'; break; case VK_SUBTRACT: if (cfg.funky_type == 2) xkey = 'm'; break; case VK_RETURN: if (HIWORD(lParam) & KF_EXTENDED) xkey = 'M'; break; } if (xkey) { if (vt52_mode) { if (xkey >= 'P' && xkey <= 'S') p += sprintf((char *) p, "\x1B%c", xkey); else p += sprintf((char *) p, "\x1B?%c", xkey); } else p += sprintf((char *) p, "\x1BO%c", xkey); return p - output; } } if (wParam == VK_BACK && shift_state == 0) { /* Backspace */ *p++ = (cfg.bksp_is_delete ? 0x7F : 0x08); return p - output; } if (wParam == VK_TAB && shift_state == 1) { /* Shift tab */ *p++ = 0x1B; *p++ = '['; *p++ = 'Z'; ) { /* Ctrl-Space */ *p++ = 0; 3) { /* Ctrl-Shift-Space */ *p++ = 160; return p - output; } if (wParam == VK_CANCEL && shift_state == 2) { /* Ctrl-Break */ *p++ = 3; return p - output; } if (wParam == VK_PAUSE) { /* Break/Pause */ *p++ = 26; *p++ = 0; { *p++ = "\000\033\034\035\036\037\177"[wParam - code = (keystate[VK_SHIFT] & 0x80 ? 23 : 11); break; case VK_F2: code = (keystate[VK_SHIFT] & 0x80 ? 24 : 12); break; case VK_F3: code = (keystate[VK_SHIFT] & 0x80 ? 25 : 13); break; case VK_F4: code = (keystate[VK_SHIFT] & 0x80 ? 26 : 14); break; case VK_F5: code = (keystate[VK_SHIFT] & 0x80 ? 28 : 15); break; case VK_F6: code = (keystate[VK_SHIFT] & 0x80 ? 29 : 17); break; case VK_F7: code = (keystate[VK_SHIFT] & 0x80 ? 31 : 18); break; case VK_F8: code = (keystate[VK_SHIFT] & 0x80 ? 32 : 19); break; case VK_F9: code = (keystate[VK_SHIFT] & 0x80 ? 33 : 20); break; case VK_F10: code = (keystate[VK_SHIFT] & 0x80 ? 34 : 21); break; case VK_F11: code = 23; break; case VK_F12: code = 24; break; case VK_F13: code = 25; break; case VK_F14: code = 26; break; case VK_F15: code = 28; break; case VK_F16: code = 29; break; case VK_F17: code = 31; break; case VK_F18: code = 32; break; case VK_F19: code = 33; break; case VK_F20: code = 34; break; case VK_HOME: code = 1; break; case VK_INSERT: code = 2; break; case VK_DELETE: code = 3; break; case VK_END: code = 4; break; case VK_PRIOR: code = 5; break; case VK_NEXT: code = 6; ) code = "\0\2\1\4\5\3\6"[code]; if (vt52_mode && code > 0 && code <= 6) { p += sprintf((char *) > 15) offt++; if (code > 21) offt++; if (vt52_mode) p += sprintf((char *) p, "\x1B%c", code + 'P' - 11 - offt); else p += sprintf((char *) p += sprintf((char *) p, "\x1B%c", code + 'P' - 11); else p += sprintf((char *) p, code == 1 ? "\x1B[H" : "\x1BOw"); return p - output; } if (code) { p += sprintf((char *) case VK_UP: xkey = 'A'; break; case VK_DOWN: xkey = 'B'; break; case VK_RIGHT: xkey = 'C'; break; case VK_LEFT: xkey = 'D'; break; case VK_CLEAR: xkey = 'G'; break; } if (xkey) { if (vt52_mode) p += sprintf((char *) p, "\x1BO%c", xkey); else p += sprintf((char *) { /* Return */ *p++ = 0x0D; return p - = keystate[VK_CAPITAL] != 0; /* helg: clear CAPS LOCK state if caps lock switches to cyrillic */ if (r > 0) { p = output; for (i = 0; i < r; i++) { unsigned char ch = (unsigned char) keys[i]; if (compose_state == 2 && (ch & 0x80) == 0 && ch > ' ') { compose_char = ch; compose_state++; continue; } if (compose_state == 3 && (ch & 0x80) == 0 && ch > ' ') { int nc; compose_state = 0; if ((nc = check_compose(compose_char, ch)) == -1) { MessageBeep(MB_ICONHAND); return 0; } *p++ = xlat_kbd2tty((unsigned char) nc); return p - output; } compose_state = 0; if (left_alt && key_down) *p++ = '\033'; if (!key_down) *p++ = ch; else { if (capsOn) ch = xlat_latkbd2win(ch); - output; } /* If we're definitly not building up an ALT-54321 then clear it */ if (!left_alt) if (cfg.alt_only) { if (message == WM_SYSKEYDOWN) alt_state = 1; else if (message == WM_SYSKEYUP && alt_state) PostMessage(hwnd, WM_CHAR, ' ', 0); if (message == WM_SYSKEYUP) alt_state = 0; } else return 0; } else alt_state = 0; return -1; } void set_title(char *title) { sfree(window_name); window_name = smalloc(1 + strlen(title)); strcpy(hwnd, title); } void set_icon(char *title) { sfree(icon_name); icon_name = smalloc(1 + strlen(title)); strcpy(icon_name, title); if (!cfg.win_name_always && IsIconic(hwnd)) SetWindowText(hwnd, title); } void set_sbar(int total, int start, int page) { SCROLLINFO si; if (!cfg.scrollbar) SetScrollInfo(hwnd, SB_VERT, &si, TRUE); } Context get_ctx(void) { HDC hdc; if (hwnd) { hdc = GetDC(hwnd); if (hdc && pal) SelectPalette(hdc, pal, FALSE); return hdc; } else return NULL; } void free_ctx(Context ctx) { SelectPalette(ctx, GetStockObject(DEFAULT_PALETTE), FALSE); ReleaseDC(hwnd, ctx); } static void real_palette_set(int n, int r, int g, int b) (pal, 0, NCOLOURS, logpal->palPalEntry); } else colours[n] = RGB(r, g, b); } void palette_set(int n, int r, int g, int b) (first[n], r, g, b); if (first[n] >= 18) real_palette_set(first[n] + 1, r, g, b); if (pal) { HDC hdc = get_ctx(); UnrealizeObject(pal); RealizePalette(hdc); free_ctx(hdc); } } void palette_reset(void) defpal[i].rgbtBlue); } if (pal) { HDC hdc; SetPaletteEntries(pal, 0, NCOLOURS, logpal->palPalEntry); hdc = get_ctx(); RealizePalette(hdc); free_ctx(hdc); } } void write_clip(void *data, int len, int must_deselect) { HGLOBAL clipdata; void *lock; clipdata = GlobalAlloc(clipdata); if (!lock) return; memcpy(lock, data, len); ((unsigned char *) lock)[len] = 0; GlobalUnlock(clipdata); if (!must_deselect) SendMessage(hwnd, WM_IGNORE_CLIP, TRUE, 0); if (OpenClipboard(hwnd)) { EmptyClipboard(); SetClipboardData(CF_TEXT, clipdata); CloseClipboard(); } else GlobalFree(clipdata); if (!must_deselect) SendMessage(hwnd, WM_IGNORE_CLIP, FALSE, 0); } void get_clip(void **p, int *len) { static HGLOBAL clipdata = NULL; if (!p) { if (clipdata) GlobalUnlock(NULL)) { clipdata = GetClipboardData(CF_TEXT); CloseClipboard(); if (clipdata) { *p = GlobalLock(int to, int from, int lines) r.right = cols * font_width; r.top = min * font_height; r.bottom = (max + lines) * font_height; ScrollWindow + Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1adf2b58e59396c80f62101be440e227 Text-delta-base-sha1: 31925305ff529da81ad534bd9fd4ccc50a7aba6a Text-content-length: 9482 Text-content-md5: 0cd69191cdc527da0d5e91c15b9d8c9c Text-content-sha1: 2052a4cb7e17c36c21a70ce8706f90044fcec84b Content-length: 9522 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNnE`@!fT9iRoG=F{N=kYr2sxF% u $:/#v (m5iW:ua_y21@k+Y}S f-y.VjTe0J'C`zn. 2i&ZH{ t. .F;_*Z vd`^" 6J?:Jz$jK"Yu|^ { Actual_Socket a = (Actual_Socket) av, b = (Actual_Socket) bv; unsigned long as = (unsigned long) a->s, bs = (unsigned long) b->s; if (as < bs) return -1; if (as > bs) return +1; return 0; } static int cmpforsearch(void *av, void *bv) { Actual_Socket b = (Actual_Socket) bv; unsigned long as = (unsigned long) av, bs = (unsigned long) b->s; if (as < bs) return -1; if (as > bs) return +1; return 0; } void sk_init(void) { sktree = newtree234(cmpfortree); } char *winsock_error_string(int error) { switch (error) { case WSAEACCES: return "Network error: Permission denied"; case WSAEADDRINUSE: return "Network error: Address already in use"; case WSAEADDRNOTAVAIL: return "Network error: Address family not supported by protocol family"; case WSAEALREADY: return "Network error: Software caused connection abort"; case WSAECONNREFUSED: return "Network error: Connection refused"; case WSAECONNRESET: return "Network error: Connection reset by peer"; case WSAEDESTADDRREQ: return "Network error: Destination address required"; case WSAEFAULT: return "Network error: Bad address"; case WSAEHOSTDOWN: return "Network error: Host is down"; case WSAEHOSTUNREACH: return "Network error: No route to host"; case WSAEINPROGRESS: return "Network error: Interrupted function call"; case WSAEINVAL: return "Network error: Invalid argument"; case WSAEISCONN: return "Network error: Socket is already connected"; case WSAEMFILE: return "Network error: Too many open files"; case WSAEMSGSIZE: return "Network error: Message too long"; case WSAENETDOWN: return "Network error: Network is down"; case WSAENETRESET: return "Network error: Network dropped connection on reset"; case WSAENETUNREACH: return "Network error: No buffer space available"; case WSAENOPROTOOPT: return "Network error: Bad protocol option"; case WSAENOTCONN: return "Network error: Socket is not connected"; case WSAENOTSOCK: return "Network error: Socket operation on non-socket"; case WSAEOPNOTSUPP: return "Network error: Operation not supported"; case WSAEPFNOSUPPORT: return "Network error: Too many processes"; case WSAEPROTONOSUPPORT: return "Network error: Protocol not supported"; case WSAEPROTOTYPE: return "Network error: Protocol wrong type for socket"; case WSAESHUTDOWN: return "Network error: Socket type not supported"; case WSAETIMEDOUT: return "Network error: Connection timed out"; case WSAEWOULDBLOCK: return "Network error: Resource temporarily unavailable"; case WSAEDISCON: return "Network error: Graceful shutdown in progress"; default: (a = inet_addr(host)) == (unsigned long) INADDR_NONE) * FGETADDRINFO) (const char *nodename, const char *servname, const struct addrinfo * hints, struct addrinfo ** GetProcAddress(dllWSHIP6, else #endif { { /*debug(("Resolving \"%s\" with gethostbyname() (IPv4 only)...\n", host)); */ if (h = gethostbyname(host)) ret->family = AF_INET; } WSAHOST_NOT_FOUND ? "Host does not exist" : err FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL); /*debug(("Error %ld: %s (h=%lx)\n", err, lpMsgBuf, h)); */ /* Free the buffer. */ LocalFree(lpMsgBuf); } #endif } else { ret->error = NULL; #ifdef IPV6 /* If we got an address info use that... */ if (ret->ai) { typedef int (CALLBACK * FGETNAMEINFO) (const struct sockaddr FAR * sa, socklen_t salen, char FAR * host, size_t hostlen, char FAR * serv, (char *) &((SOCKADDR_IN *) ret->ai-> && (fGetNameInfo = (FGETNAMEINFO) GetProcAddress(dllWSHIP6, "getnameinfo"))) { if (fGetNameInfo ((struct sockaddr *) ret->ai->ai_addr, ret->family == AF_INET ? sizeof(SOCKADDR_IN) : sizeof(SOCKADDR_IN6), ret->realhost, sizeof(ret->realhost), NULL, 0, 0) != 0)#endif { } } #ifdef IPV6 FreeLibrary(dllWSHIP6); #endif } else { sfree(addr); } static Plug sk_tcp_plug(Socket sock, Plug p) { Actual_Socket s = (Actual_Socket) sock; Plug ret = s->plug; if (p) s->plug = p; return ret; } static void sk_tcp_flush(Socket s) (Socket s); void sk_tcp_write(Socket s, char *data, int len); void sk_tcp_write_oob (s, SOL_SOCKET, SO_OOBINLINE, (void *) localport = 1023; /* count from 1023 downwards */ else localport = 0; int retcode; #ifdef IPV6 if (addr->family == AF_INET6) { memset(&a6, 0, sizeof(a6)); a6.sin6_family = AF_INET6; /*a6.sin6_addr = in6addr_any; *//* == 0 */ a6.sin6_port = htons(localport); } else #endif { a.sin_family = AF_INET; a.sin_addr.s_addr = htonl(INADDR_ANY); a.sin_port = htons(localport); } #ifdef IPV6 retcode = bind(s, (addr->family == AF_INET6 ? (struct sockaddr *) &a6 : (struct sockaddr *) &a), (addr->family == AF_INET6 ? sizeof(a6) : sizeof(a))); #else retcode = bind(s, (struct sockaddr *) &a, sizeof(a)); #endif if (retcode != SOCKET_ERROR) { err = 0; break; /* done */ } else { err = WSAGetLastError(); if (err != WSAEADDRINUSE) /* failed, for a bad reason */ break; } if (localport == 0) break; /* we're only looping once */ localport--; if (localport == 0) break; /* we might have got to the end */ } if (err) { memset(&a, 0, sizeof(a)); a6.sin6_family = AF_INET6; a6.sin6_port = htons((short) port); a6.sin6_addr = ((struct sockaddr_in6 *) addr->ai->ai_addr)->sin6_addr; } else #endif { port); } if (( #ifdef IPV6 connect(s, ((addr->family == AF_INET6) ? (struct sockaddr *) &a6 : (struct sockaddr *) &a), (addr->family == AF_INET6) ? sizeof(a6) : sizeof(a)) #else connect(s, (struct sockaddr *) &a, sizeof(a)) #endif ) == SOCKET_ERROR) { while (s->head) { int nsent; DWORD err; int len, urgentflag; if (s->sending_oob) { urgentflag = MSG_OOB; len = s->sending_oob; } else { urgentflag = 0; len = s->head->buflen - s->head->bufpos; } nsent = send(s->s, s->head->buf + s->head->bufpos, len, urgentflag); == err == WSAECONNRESET) { /* * FIXME. This will have to be done better when we * start managing multiple sockets (e.g. SSH port * forwarding), because if we get CONNRESET while * trying to write a particular forwarded socket * then it isn't necessarily the end of the world. * Ideally I'd like to pass the error code back to * somewhere the next select_result() will see it, * but that might be hard. Perhaps I should pass it * back to be queued in the Windows front end bit. */ if (s->sending_oob) struct buffer *walk = s->head->next; while (walk) { struct buffer *tmp = walk; walk = tmp->next; sfree(tmp); /* * An error has occurred on this socket. Pass it to the * plug. */ return plug_closing /* * We have received data on the socket. For an oobinline * socket, this might be data _before_ an urgent pointer, * in which case we send it to the back end with type==1 * (data prior to urgent). */ if (s->oobinline) { atmark = 1; ioctlsocket(s->s, SIOCATMARK, &atmark); /* * Avoid checking the return value from ioctlsocket(), * on the grounds that some WinSock wrappers don't * support it. If it does nothing, we get atmark==1, * which is equivalent to `no OOB pending', so the * effect will be to non-OOB-ify any OOB data. */ } else atmark = 1; ret = recv(s->s, buf, sizeof(buf), 0); (s->plug, winsock_error_string(err), err, 0); } else if (0 == ret) { return plug_closing(s->plug, NULL, 0, 0); } else { return plug_receive(s->plug, atmark ? 0 : 1, buf, ret); } break; case FD_OOB: /* * This will only happen on a non-oobinline socket. It * indicates that we can immediately perform an OOB read * and get back OOB data, which we will send to the back * end with type==2 (urgent data). */ ret = recv(s->s, buf, sizeof(buf), MSG_OOB); noise_ultralight(ret); if (ret <= 0) { fatalbox(ret == 0 ? "Internal networking trouble" : winsock_error_string(WSAGetLastError())); } else { return plug_receive(s->plug, 2, buf, ret); } open = 1; do { ret = recv(s->s, buf, sizeof(buf), 0); if (ret < 0) { err = WSAGetLastError(); if (err == WSAEWOULDBLOCK) break; return plug_closing(s->plug, winsock_error_string(err), err, 0); } else { if (ret) open &= plug_receive(s->plug, 0, buf, ret); else open &= plug_closing(s->plug, NULL, 0, 0); } } while (ret > 0); void *sk_get_private_ptr(Socket sock) { return addr->error; } static char *sk_tcp_socket_error(Socket sock) SOCKET next_socket(int *state) Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 52f40a5a109a723b1c3978d11b8b7840 Text-delta-base-sha1: f9a14142081ac1be47f6123507538dd271747e7a Text-content-length: 5919 Text-content-md5: 11ab6b2c3a28b0ce558927573a3ecee3 Text-content-sha1: 678c747905164bf892b86dc4efa6e88a32f1a426 Content-length: 5958 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN` j(a' ^4%I<`@:<K>!S6 `<?K #>AyQf_,x1*#9%FEX B_zMrNg%\fac f'CRf|wv-|NwoYU00 * MAX_PATH + && !candot)) { *out++ = '%'; *out++ = hex[((unsigned char) *in) >> 4]; *out++ = hex[((unsigned char) i -= (i > 9 ? 7 : 0); j = in[2] - '0'; j -= (j > 9 ? 7 : 0); *out++ = (i << 4) + j; if (!--outlen) return; in += 3; } else { *out++ = *in++; if (!--outlen) return; } } *out = '\0'; return; } void *open_settings_w(char *sessionname) * strlen(sessionname) + 1); mungestr(sessionname, p); sfree(p); return NULL; return (void *) sesskey; } void write_setting_s(void *handle, char *key, char *value) { if (handle) RegSetValueEx((HKEY) handle, key, 0, REG_SZ, value, 1 + { if (handle) RegSetValueEx((HKEY) handle, key, 0, REG_DWORD, (CONST BYTE *) & value, sizeof(value)); } void close_settings_w(void *handle) { RegCloseKey((HKEY) handle); } void *open_settings_r(char *sessionname) { HKEY subkey1, sesskey; char *p; p = smalloc(3 * strlen(sessionname) + { DWORD type, size; size = buflen; if (!handle || RegQueryValueEx((HKEY) handle, key, 0, &type, buffer, &size) != ERROR_SUCCESS || type != REG_SZ) return NULL; else return buffer; } int read_setting_i(void *handle, char *key, int defvalue) handle, key, 0, &type, (BYTE *) & { RegCloseKey((HKEY) handle); } void del_settings(char *sessionname) * strlen(sessionname) + return NULL; ret = smalloc(sizeof(*ret)); if (ret) { ret->key = key; { struct enumsettings *e = (struct enumsettings *) handle; char *otherbuf; otherbuf = smalloc(3 * buflen); if (otherbuf && RegEnumKey(e->key, e->i++, otherbuf, 3 * buflen) == ERROR_SUCCESS) { unmungestr(otherbuf, buffer, buflen); sfree(otherbuf); return buffer; } else return NULL; } void enum_settings_finish(void *handle) { struct enumsettings *e = (struct enumsettings *) handle; RegCloseKey(e->key); sfree(e); } static void hostkey_regname(char *buffer, char *hostname, int port, char *keytype) + * (strlen(hostname) + strlen(keytype)) + return 1; !strcmp(keytype, "rsa")) { /* * Key didn't exist. If the key type is RSA, we'll try * another trick, which is to look up the _old_ key format * under just the hostname and translate that. */ char *justhost = regname + 1 + strcspn(regname, ":"); char *oldstyle = smalloc(len + 10); /* safety margin */ readlen = len; ret = RegQueryValueEx(rkey, justhost, NULL, &type, oldstyle, &readlen); if (ret == ERROR_SUCCESS && type == REG_SZ) { /* * The old format is two old-style bignums separated by * a slash. An old-style bignum is made of groups of * four hex digits: digits are ordered in sensible * (most to least significant) order within each group, * but groups are ordered in silly (least to most) * order within the bignum. The new format is two * ordinary C-format hex numbers (0xABCDEFG...XYZ, with * A nonzero except in the special case 0x0, which * doesn't appear anyway in RSA keys) separated by a * comma. All hex digits are lowercase in both formats. */ char *p = otherstr; char *q = oldstyle; int i, j; for (i = 0; i < 2; i++) { int ndigits, nwords; *p++ = '0'; *p++ = 'x'; ndigits = strcspn(q, "/"); /* find / or end of string */ nwords = ndigits / 4; /* now trim ndigits to remove leading zeros */ while (q[(ndigits - 1) ^ 3] == '0' && ndigits > 1) ndigits--; /* now move digits over to new string */ for (j = 0; j < ndigits; j++) p[ndigits - 1 - j] = q[j ^ 3]; p += ndigits; q += nwords * 4; if (*q) { q++; /* eat the slash */ *p++ = ','; /* add a comma */ } *p = '\0'; /* terminate the string */ } /* * Now _if_ this key matches, we'll enter it in the new * format. If not, we'll assume something odd went * wrong, and hyper-cautiously do nothing. */ if (!strcmp(otherstr, key)) RegSetValueEx(rkey, regname, 0, REG_SZ, otherstr, strlen(otherstr) + 1); (ret == ERROR_SUCCESS && type == REG_SZ && compare)) return 2; return 1; /* key does not exist in registry */ else return 0; { char *regname; HKEY rkey; regname = smalloc(3 * (strlen(hostname) + strlen(keytype)) + return; strlen(key) + == GetEnvironmentVariable("HOMEDRIVE", seedpath, sizeof(seedpath)); ret = GetEnvironmentVariable("HOMEPATH", seedpath + len, sizeof(seedpath) - + len, "\\PUTTY.RND"); } } void read_random_seed(noise_consumer_t consumer) consumer(buf, len); else break; } CloseHandle(seedf); } } void write_random_seed(void *data, int len) { DWORD i; char name[MAX_PATH + 1]; HKEY subkey; i = 0; while (RegEnumKey(key, i, name, sizeof(name)) == ERROR_SUCCESS) { if (RegOpenKey(key, name, &subkey) == ERROR_SUCCESS) { registry_recursive_remove(subkey); RegCloseKey(subkey); } RegDeleteKey(key, name); } } void cleanup_all(void) { HKEY key; int ret; char name[MAX_PATH + 1] ERROR_SUCCESS) { registry_recursive_remove(key); &key) == ERROR_SUCCESS) { RegDeleteKey(key, PUTTY_REG_PARENT_CHILD); ret = RegEnumKey(key, 0, name, sizeof(name)); RegCloseKey(key); /* * If the parent key had no other children, we must delete * it in its turn. That means opening the _grandparent_ * key. */ if (ret != ERROR_SUCCESS) { if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_GPARENT, &key) == ERROR_SUCCESS) { RegDeleteKey(key, PUTTY_REG_GPARENT_CHILD); RegCloseKey(key); } Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 59b8e31bb5829bf88e668da64f2d27c3 Text-delta-base-sha1: 462d4748f90d8f75eb3bf2e6b2953df0dbade351 Text-content-length: 645 Text-content-md5: c4e3342e731528c30ae97ad89cf61b67 Text-content-sha1: 4a62b1d79d654faffea989919c53bb8a51701490 Content-length: 684 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNX4EEph gNx\Y>wk@kv:8IL int leftborder, int rightborder, int topborder); void doctl(struct ctlpos *cp, RECT r, char *wclass, int wstyle, int exstyle, int sid, int eid, int percentedit); void staticpassedit(struct ctlpos *cp, char *stext, int sid, int eid, int lines); void ersatztab(struct ctlpos *cp, char *stext, int sid, int lid, int s2id); void editbutton(struct ctlpos *cp, char *stext, int sid, int eid, char *btext, int bid); void sesssaver(struct ctlpos *cp, char *text, char *e1stext, int e1sid, int e1id, char *e2stext, int e2sid, int e2id, int listid, Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 30ecc56c025ad4a3d368e62b835b1db9 Text-delta-base-sha1: 29ae7c0bb8cb591de07494fa65fb21f4b4c3db59 Text-content-length: 3013 Text-content-md5: 56c19ae6553fd1357922be75419fbc66 Text-content-sha1: 5059500a37caa6f7ab51dec3f9b6321fadd4aa8b Content-length: 3052 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNX1?7@CLB& MTOczp6U&t#0PT )`"oKr!n6BD}S{] /* data used by ssh.c */ Socket s; }; void x11_close char *data, int datamaxlen) sprintf(ourdata + { if (strcmp(proto, "MIT-MAGIC-COOKIE-1") != 0) return 0; /* wrong protocol attempted */ if (dlen != x11_authdatalen) return 0; /* cookie was wrong length */ if (memcmp(x11_authdata, data, dlen) != 0) return 0; /* cookie was wrong cookie! */ return 1; } static int x11_closing(Plug plug, char *error_msg, int error_code, int calling_back) (Plug plug, int urgent, char *data, int len) (Socket * s, char *display, void *c) displaynum = atoi(display + n + 1); else displaynum = 0; /* sensible default */ if (n > sizeof(host) - 1) n = sizeof(host) - (err = sk_addr_error(addr)) (err = sk_socket_error(*s))) { sfree(Socket s) { struct X11Private *pr; if (!s) return; pr = (struct X11Private *) sk_get_private_ptr(s); if (pr->auth_protocol) { sfree(pr->auth_protocol); (Socket s, char *data, int len) { struct X11Private *pr = (struct X11Private *) pr->firstpkt[pr->data_read++] = (unsigned char) (len--, *data++); if (pr->data_read < 12) pr->auth_plen = GET_16BIT(pr->firstpkt[0], pr->firstpkt + 6); pr->auth_dlen = GET_16BIT(pr->firstpkt[0], pr->firstpkt + 8); pr->auth_psize = (pr->auth_plen + 3) & ~3; pr->auth_dsize = (pr->auth_dlen + 3) & ~3; /* Leave room for a terminating zero, to make our lives easier. */ pr->auth_protocol = (char *) smalloc(pr->auth_psize + 1); pr->auth_data = (char *) pr->auth_data[pr->data_read++ - 12 - pr->auth_psize] = (unsigned char) (len--, *data++); if (pr->data_read < 12 + pr->auth_psize + pr->auth_dsize) int ret; pr->auth_protocol[pr->auth_plen] = '\0'; /* ASCIZ */ /* * If authentication failed, construct and send an error * packet, then terminate the connection. */ if (!ret) { char message[] = "Authentication failed at PuTTY X11 proxy"; unsigned char reply[8 + sizeof(message) + 4]; int msglen = sizeof(message) - 1; /* skip zero byte */ int msgsize = (msglen + 3) & ~3; reply[0] = 0; /* failure */ reply[1] = msglen; /* length of reason string */ memcpy(reply + 2, pr->firstpkt + 2, 4); /* major/minor proto vsn */ PUT_16BIT(pr->firstpkt[0], reply + 6, msglen >> 2); /* data len */ memset(reply + 8, 0, msgsize); memcpy(reply + 8, message, msglen); sshfwd_write(pr->c, reply, 8 + msgsize); sshfwd_close(pr->c); x11_close(s); return; } /* * Now we know we're going to accept the connection. Strip * the auth data. (TODO: if we ever work out how, we should * replace some real auth data in here.) */ PUT_16BIT(pr->firstpkt[0], pr->firstpkt + 6, 0); /* auth proto */ PUT_16BIT(pr->firstpkt[0], pr->firstpkt + 8, 0); /* auth data */ sk_write(s, pr->firstpkt, 12); Node-path: putty/xlat.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8f2b57a888c7858b9564f1eb301afe1f Text-delta-base-sha1: a9a8de4155c37d95d307c95a6a0057dafc0b7219 Text-content-length: 8735 Text-content-md5: e7a108b03f2f15ea24a8ab3f938adc9b Text-content-sha1: 84199e0cb2b645a7cb533a2c850dc77e78ef335a Content-length: 8774 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNn%\HHC@MHHC@[HHC@CHHC@YHHC@@HHC@&eof\&Hg?E { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 189, 166, 167, 179, 169, 180, 171, 172, 173, 174, 183, 176, 177, 182, 166, 173, 181, 182, 183, 163, 185, 164, 187, 188, 189, 190, 167, 225, 226, 247, 231, 228, 229, 246, 250, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, 245, 230, 232, 227, 254, 251, 253, 255, 249, 248, 252, 224, 241, 193, 194, 215, 199, 196, 197, 214, 218, 201, 202, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 198, 200, 195, 222, 219, 221, 223, 217, 216, 220, 192, 209 }; static unsigned char koi2win[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 184, 186, 165, 179, 191, 168, 169, 170, 171, 172, 180, 174, 175, 176, 177, 178, 168, 170, 181, 178, 175, 184, 185, 186, 187, 188, 165, 190, 191, 254, 224, 225, 246, 228, 229, 244, 227, 245, 232, 233, 234, 235, 236, 237, 238, 239, 255, 240, 241, 242, 243, 230, 226, 252, 251, 231, 248, 253, 249, 247, 250, 222, 192, 193, 214, 196, 197, 212, 195, 213, 200, 201, 202, 203, 204, 205, 206, 207, 223, 208, 209, 210, 211, 198, 194, 220, 219, 199, 216, 221, 217, 215, 218 }; static unsigned char xlatWIN1250toISO88592[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 39, 131, 34, 46, 124, 124, 136, 47, 169, 60, 166, 171, 174, 172, 144, 96, 39, 34, 34, 42, 45, 45, 152, 84, 185, 62, 182, 187, 190, 188, 160, 183, 162, 163, 164, 161, 124, 167, 168, 99, 170, 34, 39, 173, 82, 175, 176, 63, 178, 179, 180, 117, 182, 255, 184, 177, 186, 34, 165, 189, 181, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; static unsigned char xlatISO88592toWIN1250[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 165, 162, 163, 164, 188, 140, 167, 168, 138, 170, 141, 143, 173, 142, 175, 176, 185, 178, 179, 180, 190, 156, 161, 184, 154, 186, 157, 159, 189, 158, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; static unsigned char xlatISO88592toCP852[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 242, 32, 34, 32, 34, 46, 43, 35, 32, 47, 138, 60, 151, 141, 166, 141, 032, 34, 34, 34, 34, 254, 45, 45, 32, 126, 154, 62, 152, 157, 167, 171, 255, 164, 244, 157, 207, 149, 151, 245, 249, 230, 184, 155, 141, 240, 166, 189, 248, 165, 247, 136, 239, 150, 152, 243, 242, 231, 173, 156, 171, 241, 167, 190, 232, 181, 182, 198, 142, 145, 143, 128, 172, 144, 168, 211, 183, 214, 215, 210, 209, 227, 213, 224, 226, 138, 153, 158, 252, 222, 233, 235, 154, 237, 221, 225, 234, 160, 131, 199, 132, 146, 134, 135, 159, 130, 169, 137, 216, 161, 140, 212, 208, 228, 229, 162, 147, 139, 148, 246, 253, 133, 163, 251, 129, 236, 238, 250, }; static unsigned char xlatCP852toISO88592[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 199, 252, 233, 226, 228, 249, 230, 231, 179, 235, 138, 245, 238, 141, 196, 198, 201, 197, 229, 244, 246, 165, 181, 140, 156, 214, 154, 171, 187, 157, 215, 232, 225, 237, 243, 250, 161, 177, 142, 158, 202, 234, 170, 159, 200, 186, 174, 175, 176, 177, 178, 179, 180, 193, 194, 204, 170, 185, 186, 187, 188, 175, 191, 191, 192, 193, 194, 195, 196, 197, 195, 227, 200, 201, 202, 203, 204, 205, 206, 164, 240, 208, 207, 203, 239, 210, 205, 206, 236, 217, 218, 219, 220, 222, 217, 223, 211, 223, 212, 209, 241, 242, 169, 185, 192, 218, 224, 219, 253, 221, 254, 180, 173, 189, 128, 183, 162, 167, 247, 178, 176, 168, 255, 251, 216, 248, 149, 160, }; unsigned char xlat_kbd2tty(unsigned char c) { if (cfg.xlat_enablekoiwin) return koi2win[c]; else if (cfg.xlat_88592w1250) return xlatISO88592toWIN1250[c]; else if (cfg.xlat_88592cp852) return xlatISO88592toCP852[c]; return c; } static unsigned char latkbd2_win[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 33, 221, 35, 36, 37, 38, 253, 40, 41, 42, 178, 225, 186, 254, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 198, 230, 193, 179, 222, 44, 64, 212, 200, 209, 194, 211, 192, 207, 208, 216, 206, 203, 196, 220, 210, 217, 199, 201, 202, 219, 197, 195, 204, 214, 215, 205, 223, 245, 191, 250, 94, 170, 96, 244, 232, 241, 226, 243, 224, 239, 240, 248, 238, 235, 228, 252, 242, 249, 231, 233, 234, 251, 229, 227, 236, 246, 247, 237, 255, 213, 175, 218, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; unsigned char xlat_latkbd2win(unsigned char c) { if Revision-number: 1099 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2001-05-06T15:09:32.000000Z K 7 svn:log V 55 Strip off and ignore `:port' on the end of a hostname. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: af8eea949f9adef79237627c262ea59b Text-delta-base-sha1: 8970cc9c2782f0de14d43724c6637c74eccc3b37 Text-content-length: 132 Text-content-md5: 3287df01d6e1ce66187e56896d5ed0dd Text-content-sha1: 1f32e42be595de4ac20224f887dca3bcb25667f5 Content-length: 173 K 15 cvs2svn:cvs-rev V 5 1.126 PROPS-END SVN4 kk /* * Trim a colon suffix off the hostname if it's there. */ cfg.host[strcspn(cfg.host, ":")] = '\0'; Revision-number: 1100 Prop-content-length: 139 Content-length: 139 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-06T16:18:58.000000Z K 7 svn:log V 39 Fix de Bath's last-ditch bell overload PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3287df01d6e1ce66187e56896d5ed0dd Text-delta-base-sha1: 1f32e42be595de4ac20224f887dca3bcb25667f5 Text-content-length: 224 Text-content-md5: 2622a24954386c8bfff4cf3d637c1167 Text-content-sha1: c52f5f4d3da7df10c6c050c1e0dea0422bef67a2 Content-length: 265 K 15 cvs2svn:cvs-rev V 5 1.127 PROPS-END SVN >|U2 beepdiff; beepdiff = GetTickCount()/* * The above MessageBeep call takes time, so we record the * time _after_ it finishes rather than before it starts. */ lastbeep = GetTickCount() Revision-number: 1101 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2001-05-09T12:48:01.000000Z K 7 svn:log V 98 Fix due to Robert de Bath: backspace should not cross line boundaries when auto wrap is disabled. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0efd4ed7d44d2350cdce03ac2131328d Text-delta-base-sha1: 796358234d704fd74f4325d04b6feac118223b37 Text-content-length: 52 Text-content-md5: b1b8d950fe947af8b6651bb3ffff91d8 Text-content-sha1: 2b313b5292017ea6ccbc7e67a43667d2cfeb8ae7 Content-length: 92 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVNm| 7+B(curs.y == 0 || wrap == 0) Revision-number: 1102 Prop-content-length: 549 Content-length: 549 K 8 svn:date V 27 2001-05-09T13:03:16.000000Z K 7 svn:log V 448 RDB's alternative way to interpret the window size in Change Settings: it describes the size of the _unmaximised_ window. Maximisedness is a separate property which Change Settings doesn't affect. So if you change the font while the window is maximised, the terminal size adjusts accordingly. The downside is that you can't read the width and height of a maximised window out of Change Settings. Suggestions that restore this property are welcome. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2622a24954386c8bfff4cf3d637c1167 Text-delta-base-sha1: c52f5f4d3da7df10c6c050c1e0dea0422bef67a2 Text-content-length: 1337 Text-content-md5: 93ab8fb0988b55240e6b675c705dbaaa Text-content-sha1: 6ead65f8266481adb920466899375425eca23aa9 Content-length: 1378 K 15 cvs2svn:cvs-rev V 5 1.128 PROPS-END SVNq,XFW s_MS" `: static int defere need_setwpos = TRUE if (IsZoomed(hwnd)) { int w, h; RECT cr; if (need_setwpos) defered_resize = TRUE; GetClientRect(hwnd, &cr); w = cr.right - cr.left; h = cr.bottom - cr.top; w = w / font_width; if (w < 1) w = 1; h = h / font_height; if (h < 1) h = 1; term_size(h, w, cfg.savelines); InvalidateRect(hwnd, NULL, TRUE); back->size(); } else { term_size(cfg.height, cfg.width, cfg.savelines); InvalidateRect(hwnd, NULL, TRUE); if (need_setwpos) { SetWindowPos(hwnd, NULL, 0, 0, extra_width + font_width * cfg.width, extra_height + font_height * cfg.height, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); } } /* Oops */ if (cfg.locksize && IsZoomed(hwnd)) force_normal(hwnd); { need_backend_resize = TRUE; cfg.height = h; cfg.width = w; } just_reconfigged = FALSE; } } if (wParam == SIZE_RESTORED && defered_resize) { defered_resize = FALSE; SetWindowPos(hwnd, NULL, 0, 0, extra_width + font_width * cfg.width, extra_height + font_height * cfg.height, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); Revision-number: 1103 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2001-05-09T13:12:46.000000Z K 7 svn:log V 91 From RDB: yet another fix in the ongoing quest to deal correctly with font point sizes :-( K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f6635e06df173ca77961461fad521f93 Text-delta-base-sha1: a5f6b28f4a0ad1203a25ee9eabb147e39c468a27 Text-content-length: 180 Text-content-md5: ce4da481e44e3708b5b9489413f4070b Text-content-sha1: 4a377854816d5cad248a94f2d25c18fc8c079771 Content-length: 221 K 15 cvs2svn:cvs-rev V 5 1.126 PROPS-END SVNQK}7{ HDC hdc = GetDC(0); lf.lfHeight = -MulDiv(cfg.fontheight, GetDeviceCaps(hdc, LOGPIXELSY), 72); ReleaseDC(0, hdc); } Revision-number: 1104 Prop-content-length: 166 Content-length: 166 K 7 svn:log V 66 We can now save the protocol and port number in Default Settings. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-09T13:26:14.000000Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aa15832b957186636fc6e5730ff995f3 Text-delta-base-sha1: 8cd383372a02d5696701352de974128eff6f5ed6 Text-content-length: 286 Text-content-md5: a4e0c5374e5c837ef8dd6d5d7e51645c Text-content-sha1: e359c41773a73d6ee38d38ba838f1289dd7cd6fd Content-length: 326 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN&0n"(~ } p = "raw"; for (i = 0; backends[i].name != NULL; i++) if (backends[i].protocol == cfg->protocol) { p = backends[i].name; break; } write_setting_s(sesskey, "Protocol", p); write_setting_i(sesskey, "PortNumber", cfg->port); Revision-number: 1105 Prop-content-length: 318 Content-length: 318 K 7 svn:log V 217 From RDB: according to VT manuals, application cursor keys should never be enabled when app keypad is disabled. Also CTRL+arrows flips the application-ness to make it easy to generate the other sequences if required. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-09T13:30:06.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 93ab8fb0988b55240e6b675c705dbaaa Text-delta-base-sha1: 6ead65f8266481adb920466899375425eca23aa9 Text-content-length: 468 Text-content-md5: c273efebfd92ffa1fe18cf94b67f07ec Text-content-sha1: b835b4bb1a061320102b17e1bf7e9ea4bd5bda42 Content-length: 509 K 15 cvs2svn:cvs-rev V 5 1.129 PROPS-END SVNq88F+{ int app_flg = (app_cursor_keys && !cfg.no_applic_c); /* VT100 & VT102 manuals both state the app cursor keys * only work if the app keypad is on. */ if (!app_keypad_keys) app_flg = 0; /* Useful mapping of Ctrl-arrows */ if (shift_state == 2) app_flg = !app_flg; if (app_flg) p += sprintf((char *) p, "\x1BO%c", xkey); else p += sprintf((char *) p, "\x1B[%c", xkey); } Revision-number: 1106 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2001-05-09T13:35:08.000000Z K 7 svn:log V 62 From RDB: a few extra escape sequences seen in SCO terminals. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b1b8d950fe947af8b6651bb3ffff91d8 Text-delta-base-sha1: 2b313b5292017ea6ccbc7e67a43667d2cfeb8ae7 Text-content-length: 551 Text-content-md5: 147ca5bddfe4916c99f713d669c6a9f5 Text-content-sha1: 8abf22a90eff2e97050efbd28161a87a84429c37 Content-length: 591 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN|BDW="Z4': if (has_compat(SCOANSI)) { move(0, 0, 0); erase_lots(FALSE, FALSE, TRUE); disptop = 0; wrapnext = FALSE; seen_disp_event = 1; break; } case '\013'S': compatibility(SCOANSI); scroll(marg_t, marg_b, def(esc_args[0], 1), TRUE); fix_cpos; wrapnext = FALSE; seen_disp_event = TRUE; break; case 'T': compatibility(SCOANSI); scroll(marg_t, marg_b, -def(esc_args[0], 1), TRUE); fix_cpos; wrapnext = FALSE; seen_disp_event = TRUE; Revision-number: 1107 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2001-05-09T13:51:07.000000Z K 7 svn:log V 118 From RDB: telnet can now start up in passive mode, in which it doesn't do any negotiation until the remote side does. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a479f35db208b3905d73ef3945ee8bf6 Text-delta-base-sha1: cd3a9a47168b6f3da27c130268673a8457e7be18 Text-content-length: 39 Text-content-md5: 25bddddc8e290288bb4ed3df42689f6a Text-content-sha1: 46eea07523993ea52606844d309bbde948a06593 Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.95 PROPS-END SVNLd }Uwint passive_telnet Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a4e0c5374e5c837ef8dd6d5d7e51645c Text-delta-base-sha1: e359c41773a73d6ee38d38ba838f1289dd7cd6fd Text-content-length: 103 Text-content-md5: be24645463a2018f930577ad6a74669b Text-content-sha1: b6d55e326e487a2877647e27397d083b48f89cff Content-length: 143 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN01JmML-PassiveTelnet", cfg->passive_telnetPassiveTelnet", 0, &cfg->passive_telnet Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 573fffb2bc1bc8a4d259425da06fb6c7 Text-delta-base-sha1: df67eef876a01a6f6fb285162b3044a85df262b2 Text-content-length: 511 Text-content-md5: 3e85f97dadc6f5bfe554a899fe8596df Text-content-sha1: 8ab8e5cb98894e761efa2c8e9dfd76e869d13de9 Content-length: 551 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN40)H; 8XZ7 _WS5w5 *static int activated = FALS /* Ensure we get the minimum options */ if (!activated) { if (o_echo.state == if (o_we_sga.state == INACTIVE) { o_we_sga.state = REQUESTED; send_opt(o_we_sga.send, o_we_sga.option); } if (o_they_sga.state == INACTIVE) { o_they_sga.state = REQUESTED; send_opt(o_they_sga.send, o_they_sga.option); } activated = TRUE; }if (cfg.passive_telnet)(*o)->state = INACTIVE; } else activated = TRUE Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ce4da481e44e3708b5b9489413f4070b Text-delta-base-sha1: 4a377854816d5cad248a94f2d25c18fc8c079771 Text-content-length: 487 Text-content-md5: 501f5a4e1f60fd1578a9160506a753b2 Text-content-sha1: a44963e81516c8be9bc1978dd64bde11d601b71e Content-length: 528 K 15 cvs2svn:cvs-rev V 5 1.127 PROPS-END SVNK|9 BlU.q"w;) | %QEIDC_ACTSTATIC, IDC_TPASSIVE, IDC_TACTIVE CheckRadioButton(hwnd, IDC_TPASSIVE, IDC_TACTIVE, cfg.passive_telnet ? IDC_TPASSIVE : IDC_TACTIVEtradioline(&cp, "&Telnet negotiation mode:", IDC_ACTSTATIC, 2, "Passive", IDC_TPASSIVE, "Active", IDC_TACTIVETPASSIVE: case IDC_TACTIVE: cfg.passive_telnet = IsDlgButtonChecked(hwnd, IDC_TPASSIVE); break; case IDC_ENVADD Revision-number: 1108 Prop-content-length: 229 Content-length: 229 K 7 svn:log V 128 `realhost', passed back from all the backend init functions, was scoped within those functions. It's now dynamically allocated. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-09T14:01:15.000000Z PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 541b412a3dd3b1ec5bc54bd25930ed77 Text-delta-base-sha1: 516b153da709a3f36c5cdc63662cf0f2f8a127ee Text-content-length: 40 Text-content-md5: 22279de5d4c5ea2264ac15d9ca4ca4f4 Text-content-sha1: b2c3c217211468685c0798b68b902ba6106e52f9 Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNZl L sfree(realhost); Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d128f3989f00642342a49ae2ec81a360 Text-delta-base-sha1: fd653bb94ef6092fcec6d65ba41cf35652cd79c8 Text-content-length: 55 Text-content-md5: c0173f86d2661c5695cc13090944384a Text-content-sha1: 36f7c630d2709cf8a089064677caf14725e24b3f Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNs "B2A It must be * freed by the caller Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8f1e457a6233a4063e27aa70694488c5 Text-delta-base-sha1: abcf39eebac026f43bfa45872ebd2a1160c012a1 Text-content-length: 55 Text-content-md5: 6aa1acdd4cd2a8a62868fb6cfba4ddcb Text-content-sha1: 0d2a3c4f6b1e84cdb33403eb118bcd84dc0684a6 Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNOr "!/ It must be * freed by the caller Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a78cfd413ebb7aa242a8a1fe849d1a39 Text-delta-base-sha1: a3cebcd3066f7bb7ea4426fa7f7aea7273f5c100 Text-content-length: 34 Text-content-md5: 50a490ac4ad2d24875dcaeed83b3772c Text-content-sha1: 5868f73f676a4e7a7cedad4b037ceb560da33195 Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN0E yBn sfree( Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 790dc44507e9fcfbbea1cc6ab6731272 Text-delta-base-sha1: 04d4a320b1066f522c33182e24df67fcce26e230 Text-content-length: 141 Text-content-md5: b3a5b165f360e91a89aa19b477441bd1 Text-content-sha1: 91ffa299011b3e78616767d4012bf2d4a7c22b63 Content-length: 182 K 15 cvs2svn:cvs-rev V 5 1.142 PROPS-END SVN0LdK 5 It must be * freed by the callerstrdup(FWhost)++ exactly the length we want it. The * c Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e85f97dadc6f5bfe554a899fe8596df Text-delta-base-sha1: 8ab8e5cb98894e761efa2c8e9dfd76e869d13de9 Text-content-length: 57 Text-content-md5: 7bb314b900b14a596642c172beeb2518 Text-content-sha1: d57b343f23d727360a67a02da7253904253e17c1 Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN0S " It must be * freed by the caller Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c273efebfd92ffa1fe18cf94b67f07ec Text-delta-base-sha1: b835b4bb1a061320102b17e1bf7e9ea4bd5bda42 Text-content-length: 39 Text-content-md5: e5d99d65618e80fa2a1fd4706770a7b3 Text-content-sha1: 254af275a3cdaa5e00b2b394278dc102b93da453 Content-length: 80 K 15 cvs2svn:cvs-rev V 5 1.130 PROPS-END SVN*   free(realhost); Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0cd69191cdc527da0d5e91c15b9d8c9c Text-delta-base-sha1: 2052a4cb7e17c36c21a70ce8706f90044fcec84b Text-content-length: 408 Text-content-md5: ce0803a42615fbc4adc8c4dbef099d87 Text-content-sha1: e737cd36ef4ef712b7af5e347e39ca9c038ec5df Content-length: 448 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNEw*`#D0?r: TY3P0K7 char realhost[8192]realhost = '\0';alhost, sizeof(realhost), NULL, 0, 0) != 0) { strncpy(realhost, host, sizeof(alhost, h->h_name, sizeof(strncpy(realhost, host, sizeof(realhost)); } ret->address = ntohl(a); realhost[lenof(realhost)-1] = '\0'; *canonicalname = smalloc(1+strlen(realhost)); strcpy(*canonicalname, realhost Revision-number: 1109 Prop-content-length: 574 Content-length: 574 K 8 svn:date V 27 2001-05-09T15:12:26.000000Z K 7 svn:log V 473 From RDB: a patch to allow special keys (^C, ^Z, Delete, Return) to send Telnet special sequences (Interrupt Process, Suspend, Erase Char, End Of Line) instead of their ASCII equivalents. In particular Return -> Telnet End Of Line is _always_ enabled irrespective of the configuration, while the others are optional. Also in this patch, an entertainingly ghastly use of `switch' to allow literal ^M^J to do the same thing as magic-^M (the Return key) when in Raw protocol. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fac1b438e216e690f4b16ad050577a1f Text-delta-base-sha1: cdc282f7bf54ffccea4f390abfd95dd9daa5c0bf Text-content-length: 2411 Text-content-md5: 994249638ac3a994e351ab331327c912 Text-content-sha1: d799ba2f77c554a5fe2995bdb5081260540e1182 Content-length: 2451 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN4?5* ^q3x 6#npEWxvv,#define KCTRL(x) ((x^'@') | 0x100) void ldisc_send(char *buf, int len) { int keyflag = 0;Less than zero means null terminated special string. */ if (len < 0) { len = strlen(buf); keyflag = KCTRL('@'int c; c = *buf++ + keyflagKCTRL('H'): case K /* * This particularly hideous bit of code from RDB * allows ordinary ^M^J to do the same thing as * magic-^M when in Raw protocol. The line `case * KCTRL('M'):' is _inside_ the if block. Thus: * * - receiving regular ^M goes straight to the * default clause and inserts as a literal ^M. * - receiving regular ^J _not_ directly after a * literal ^M (or not in Raw protocol) fails the * if condition, leaps to the bottom of the if, * and falls through into the default clause * again. * - receiving regular ^J just after a literal ^M * in Raw protocol passes the if condition, * deletes the literal ^M, and falls through * into the magic-^M code * - receiving a magic-^M empties the line buffer, * signals end-of-line in one of the various * entertaining ways, and _doesn't_ fall out of * the bottom of the if and through to the * default clause because of the break. */ case CTRL('J'): if (cfg.protocol == PROT_RAW && term_buflen > 0 && term_buf[term_buflen - 1] == '\r' /* FALLTHROUGH */ case KCTRL('M'): /* send with newline */ if (term_buflen > 0) back->send(term_buf, term_buflen); if (cfg.protocol == PROT_RAW) back->send("\r\n", 2); else if (cfg.protocol == PROT_TELNET) back->special(TS_EOL); else back->send("\r", 1); if (ECHOING) c_write("\r\n", 2); term_buflen = 0; break; } /* FALLTHROUGH */(unsigned char) if (keyflag && cfg.protocol == PROT_TELNET && len == 1) { switch (buf[0]) { case CTRL('M'): back->special(TS_EOL); break; case CTRL('?'): case CTRL('H'): if (cfg.telnet_keyboard) { back->special(TS_EC); break; } case CTRL('C'): if (cfg.telnet_keyboard) { back->special(TS_IP); break; } case CTRL('Z'): if (cfg.telnet_keyboard) { back->special(TS_SUSP); break; } default: back->send(buf, len); break; } } else back->send(buf, len); } } } Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 25bddddc8e290288bb4ed3df42689f6a Text-delta-base-sha1: 46eea07523993ea52606844d309bbde948a06593 Text-content-length: 53 Text-content-md5: e080cb013c57a597771f7a4a4d6929d8 Text-content-sha1: 33e952210eec9389e041a67bdf6981003a7b9c9e Content-length: 93 K 15 cvs2svn:cvs-rev V 4 1.96 PROPS-END SVNd ~9~8,, TS_EOLtelnet_keyboar Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: be24645463a2018f930577ad6a74669b Text-delta-base-sha1: b6d55e326e487a2877647e27397d083b48f89cff Text-content-length: 97 Text-content-md5: 9047ec16b5090bfe6181ef21a8ee6ef8 Text-content-sha1: ed86f53e71e8e0ccb90f9a9812bc418336ebb66a Content-length: 137 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN1,D}/\telnet_keyboardTelnetKey", 0, &cfg->telnet_keyboard Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7bb314b900b14a596642c172beeb2518 Text-delta-base-sha1: d57b343f23d727360a67a02da7253904253e17c1 Text-content-length: 122 Text-content-md5: f9421996cc3b042b5b67b581ac313089 Text-content-sha1: aaf0d97496d32f8fba43749ad394c27147793b2d Content-length: 162 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNSSz"&tJ1"#if 0 static unsigned char nl[2] = { CR, LF }; #endifcrEOL: sk_write(s, "\r\n" Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 501f5a4e1f60fd1578a9160506a753b2 Text-delta-base-sha1: a44963e81516c8be9bc1978dd64bde11d601b71e Text-content-length: 491 Text-content-md5: 414351f3280c58e1f68bd242a0ef1d98 Text-content-sha1: a0e1c653e6c7d092c6cc1082be862653332a5c59 Content-length: 532 K 15 cvs2svn:cvs-rev V 5 1.128 PROPS-END SVN|>XMRp#Ml*9TE[Y_Y{IDC_TELNETKEYDlgButton(hwnd, IDC_TELNETKEY, cfg.telnet_keyboard else { beginbox(&cp, "Adjust telnet session.", IDC_BOX_CONNECTION1); checkbox(&cp, "Keyboard sends telnet Backspace and Interrupt", IDC_TELNETKEYkcheckbox(&cp, "&Keyboard sends telnet Backspace and Interrupt", IDC_TELNETKEYTELNETKEYtelnet_keyboard = IsDlgButtonChecked(hwnd, IDC_TELNETKEY); break; case IDC_WRAPMODE Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e5d99d65618e80fa2a1fd4706770a7b3 Text-delta-base-sha1: 254af275a3cdaa5e00b2b394278dc102b93da453 Text-content-length: 111 Text-content-md5: 7832446d94afea895cfcb93e9cae0c5f Text-content-sha1: e3a82a71d1ed9d5a6eba7a2015e912e4285633dc Content-length: 152 K 15 cvs2svn:cvs-rev V 5 1.131 PROPS-END SVN*?H/B@.XR*p++ = 0; return -2*p++ = 0; return -2*p++ = 0; return -2 Revision-number: 1110 Prop-content-length: 485 Content-length: 485 K 8 svn:date V 27 2001-05-10T08:34:20.000000Z K 7 svn:log V 384 RDB's Unicode patch. Fonts are now used in Unicode mode where possible and we have a single unified means of trying to display any Unicode code point. Instead of the various ad-hoc translation modes we had before, we now have a single `codepage' option which allows us to treat the incoming (and outgoing) text as any given character set, and locally we map that to Unicode and back. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2bf8bac7605906470f20d8116179546f Text-delta-base-sha1: 1f06ab81f34e41a38167af9f61310327cfd71e43 Text-content-length: 58 Text-content-md5: ea51c481f00bed2e9561c55d0060d9e5 Text-content-sha1: 3aa19f42d11221102c4a3bc2b0a639558797430f Content-length: 98 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNo %zb sizetip.$(OBJ) wcwidth.$(OBJ) unicode Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 994249638ac3a994e351ab331327c912 Text-delta-base-sha1: d799ba2f77c554a5fe2995bdb5081260540e1182 Text-content-length: 43 Text-content-md5: 8014a6bf1daa745b5983cda3034e04d0 Text-content-sha1: 16f77052186413693fbdc2224c3ff1dd4d7e424d Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN?OPa^ && !utf && !utf Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e080cb013c57a597771f7a4a4d6929d8 Text-delta-base-sha1: 33e952210eec9389e041a67bdf6981003a7b9c9e Text-content-length: 2822 Text-content-md5: bb27703610d458a2d8656d68314be386 Text-content-sha1: 21a2a78a8e4505dd934c83a3f775119a12226353 Content-length: 2862 K 15 cvs2svn:cvs-rev V 4 1.97 PROPS-END SVN )C7++/@OtNkY4`[w;;}TL:p/* Three attribute types: * The ATTRs (normal attributes) are stored with the characters in the main * display arrays * * The TATTRs (temporary attributes) are generated on the fly, they can overlap * with characters but not with normal attributes. * * The LATTRs (line attributes) conflict with no others and only have one * value per line. But on area clears the LATTR cells are set to the erase_char * (or DEFAULT_ATTR + 'E') * * ATTR_INVALID is an illegal colour combination. */ #define TATTR_ACTCURS 0x4UL /* active cursor (block) */ #define TATTR_PASCURS 0x2UL /* passive cursor (box) */ #define TATTR_RIGHTCURS 0x1UL /* cursor-on-RHS#define LATTR_WRAPPED 0x10000000UL #define ATTR_INVALID 0x00FF0000UL /* Like Linux use the F000 page for direct to font. */ #define ATTR_OEMCP 0x0000F000UL /* OEM Codepage DTF */ #define ATTR_ACP 0x0000F100UL /* Ansi Codepage DTF */ /* These are internal use overlapping with the UTF-16 surrogates */ #define ATTR_ASCII 0x0000D800UL /* normal ASCII charset ESC ( B */ #define ATTR_LINEDRW 0x0000D900UL /* line drawing charset ESC ( 0 */ #define ATTR_GBCHR 0x0000DB00UL /* UK variant charset ESC ( A */ #define CSET_MASK 0x0000FF00UL /* Character set mask; MUST be 0xFF00 */ #define DIRECT_CHAR(c) ((c&0xFC00)==0xD800) #define DIRECT_FONT(c) ((c&0xFE00)==0xF000) #define UCSERR (ATTR_LINEDRW|'a') /* UCS Format error character. */ #define UCSWIDE 0x303F #define ATTR_WIDE 0x10000000UL #define ATTR_BOLD 0x01000000UL #define ATTR_UNDER 0x02000000UL #define ATTR_REVERSE 0x04000000UL #define ATTR_BLINK 0x08000000UL #define ATTR_FGMASK 0x000F0000UL #define ATTR_BGMASK 0x00F00000UL #define ATTR_COLOURS 0x00FF0000UL #define ATTR_FGSHIFT 16 #define ATTR_BGSHIFT 20 #define ATTR_DEFAULT 0x00980000UL #define ATTR_DEFFG 0x00080000UL #define ATTR_DEFBG 0x00900 #define ATTR_CUR_AND (~(ATTR_BOLD|ATTR_REVERSE|ATTR_BLINK|ATTR_COLOURS)) #define ATTR_CUR_XOR 0x00BA0000ULGLOBAL int big_cursor; GLOBAL int utf; GLOBAL int dbcs_screenfont; GLOBAL int font_codepage; GLOBAL int kbd_codepage; GLOBAL int line_codepage; GLOBAL WCHAR unitab_line[256]; GLOBAL WCHAR unitab_font[256]; GLOBAL WCHAR unitab_xterm[256]; GLOBAL WCHAR unitab_oemcp[256]; GLOBAL unsigned char unitab_ctrl[256], VT_UNICODEchar line_codepage[32]do_cursoraclip(char *, int, int); void write_clip(wchar_t *, int, int); void get_clip(wchar_tunicode.c. */ #ifndef CP_UTF8 #define CP_UTF8 65001 #endif void init_ucs_tables(void); void lpage_send(int codepage, char *buf, int len); void luni_send(wchar_t * widebuf, int len); int check_compose(int first, int second); int decode_codepage(char *cp_name); char *cp_name(int codepage Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9047ec16b5090bfe6181ef21a8ee6ef8 Text-delta-base-sha1: ed86f53e71e8e0ccb90f9a9812bc418336ebb66a Text-content-length: 154 Text-content-md5: 3b0d4f75d63903af878af39877fd415f Text-content-sha1: 12805dca140224b3c73b2cb6de58e89bc4336133 Content-length: 194 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN,K|y}pOYSs(sesskey, "LineCodePage", cfg->line_codepages(sesskey, "LineCodePage", "", cfg->line_codepage, sizeof(cfg->line_codepage) Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 147ca5bddfe4916c99f713d669c6a9f5 Text-delta-base-sha1: 8abf22a90eff2e97050efbd28161a87a84429c37 Text-content-length: 20716 Text-content-md5: 5090319fc5b1cba30e1dfa0066ec9a66 Text-content-sha1: 172b6056eecfc10735022cb7b4b65121728c27f4 Content-length: 20756 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN%;!(KxqjWv=j:d-!X|^}yv\otEdbVRs4rf2P$!w, [6`(Sd)Sr*_!"0e'-qj.Igw;GlVq.?:\:v1TB +#IMt6nCDZf~[j\:l2A %\?qb#Or;nWOfxi2(G yKhnlId\w=/QVT52_PLUSdispcurs; /* location of cursor on real screen */ static unsigned long curstype; /* type of cursor on realstatic int vt52_bold; /* Force bold on non-bold colours */ static int utf_state; /* Is there a pending UTF-8 character */ static int utf_char; /* and what is it so far. */ static int utf_size; /* The size of the UTF character.SEEN_OSC_P, OSC_STRING, OSC_MAYBE_ST, VT52_ESC, VT52_Y1, VT52_Y2, VT52_FG, VT52_BG#define sel_nl_sz (sizeof(sel_nl)/sizeof(wchar_t)) static wchar_t sel_nl[] = SEL_NL; static wchar_tbig_cursor = 0dispcurs = NULL; tabs dispcurs = NULLLif (vt52_mode) { blink_is_real = FALSE; vt52_bold = FALSE; } else { blink_is_real = cfg.blinktext; } case 34: /* Make cursor BIG */ compatibility2(OTHER, VT220); big_cursor = !state /* First see about all those translations. */ if (termstate == TOPLEVEL) { if (utf) switch (utf_state) { case 0: if (c < 0x80) { /* I know; gotos are evil. This one is really bad! * But before you try removing it follow the path of the * sequence "0x5F 0xC0 0x71" with UTF and VTGraphics on. */ /* if (cfg.no_vt_graph_with_utf8) break; */ goto evil_jump; } else if ((c & 0xe0) == 0xc0) { utf_size = utf_state = 1; utf_char = (c & 0x1f); } else if ((c & 0xf0) == 0xe0) { utf_size = utf_state = 2; utf_char = (c & 0x0f); } else if ((c & 0xf8) == 0xf0) { utf_size = utf_state = 3; utf_char = (c & 0x07); } else if ((c & 0xfc) == 0xf8) { utf_size = utf_state = 4; utf_char = (c & 0x03); } else if ((c & 0xfe) == 0xfc) { utf_size = utf_state = 5; utf_char = (c & 0x01); } else { c = UCSERR; break; } continue; case 1: case 2: case 3: case 4: case 5: if ((c & 0xC0) != 0x80) { inbuf_reap--; /* This causes the faulting character */ c = UCSERR; /* to be logged twice - not really a */ utf_state = 0; /* serious problem. */ break; } utf_char = (utf_char << 6) | (c & 0x3f); if (--utf_state) continue; c = utf_char; /* Is somebody trying to be evil! */ if (c < 0x80 || (c < 0x800 && utf_size >= 2) || (c < 0x10000 && utf_size >= 3) || (c < 0x200000 && utf_size >= 4) || (c < 0x4000000 && utf_size >= 5)) c = UCSERR; /* Unicode line separator and paragraph separator are CR-LF */ if (c == 0x2028 || c == 0x2029) c = 0x85; /* High controls are probably a Baaad idea too. */ if (c < 0xA0) c = 0xFFFD; /* The UTF-16 surrogates are not nice either. */ /* The standard give the option of decoding these: * I don't want to! */ if (c >= 0xD800 && c < 0xE000) c = UCSERR; /* ISO 10646 characters now limited to UTF-16 range. */ if (c > 0x10FFFF) c = UCSERR; /* This is currently a TagPhobic application.. */ if (c >= 0xE0000 && c <= 0xE007F) continue; /* U+FEFF is best seen as a null. */ if (c == 0xFEFF) continue; /* But U+FFFE is an error. */ if (c == 0xFFFE || c == 0xFFFF) c = UCSERR; /* Oops this is a 16bit implementation */ if (c >= 0x10000) c = 0xFFFD; break; } else { evil_jump:; switch (cset_attr[cset]) { /* unitab_ctrl[c] != 0xFF) c = unitab_ctrl[c]; else c = ((unsigned char) c) | ATTR_LINEDRW; break; c = '}' | ATTR_LINEDRW; break; } /*FALLTHROUGH*/ case ATTR_ASCII: if (unitab_ctrl[c] != 0xFF) c = unitab_ctrl[c]; else c = ((unsigned char) c) | ATTR_ASCII; break; } } } /* How about C1 controls ? */ if ((c & -32) == 0x80 && termstate < DO_CTRLS && !vt52_mode && has_compat(VT220)) { termstate = SEEN_ESC; esc_query = FALSE; c = '@' + (c & 0x1F); } /* Or the GL control. */ if (c == '\177' && termstate < DO_CTRLS && has_compat(OTHER)) { if (curs.x && !wrapnext) curs.x--; wrapnext = FALSE; fix_cpos; *cpos = (' ' | curr_attr | ATTR_ASCII); } else /* Or normal C0 controls. */ if ((c & -32) == 0 && termstate < DO_CTRLS*s; } lpage_send(CP_ACP, esc_query = FALSE; }Lif ((c & CSET_MASK) == ATTR_ASCII || (c & CSET_MASK) == 0) logtraffic((unsigned char) c, LGTYP_ASCII); { extern int wcwidth(wchar_t ucs); int width = 0; if (DIRECT_CHAR(c)) width = 1; if (!width) width = wcwidth((wchar_t) c); switch (width) { case 2: if (curs.x + 1 != cols) { *cpos++ = c | ATTR_WIDE | curr_attr; *cpos++ = UCSWIDE | curr_attr; curs.x++; break; } case 1: *cpos++ = c | curr_attr; break; default: continue; } if (wrap && vt52_mode) { cpos[1] |= LATTR_WRAPPED; if (curs.y == marg_b) scroll(marg_t, marg_b, 1, TRUE); else if (curs.y < rows - 1) curs.y++; curs.x = 0; fix_cpos; wrapnext = FALSE; } } seen_disp_event = 1; break; if (c >= ' ' && c <= '/') { if (esc_query) esc_query = -1; else esc_query = c; break; } termstate = TOPLEVEL; switch (ANSI(c, esc_query)) { case ANSI('8', '#'): /* ESC # 8 fills screen with Es :-) */ compatibility(VT100); { unsigned long *ldata; int i, j; pos scrtop, scrbot; } break; case ANSI('3', '#'): case ANSI('4', '#'): case ANSI('5', '#'): case ANSI('6', '#'): compatibility(VT100); { unsigned long nlattr; unsigned long *ldata; switch (ANSI(c, esc_query)) { case ANSI('3', '#'): nlattr = LATTR_TOP; break; case ANSI('4', '#'): nlattr = LATTR_BOT; break; case ANSI('5', '#'): nlattr = LATTR_NORM; break; case ANSI('6', '#'): nlattr = LATTR_WIDE; break; } ldata = lineptr(curs.y); ldata[cols] &= ~LATTR_MODE; ldata[cols] |= nlattr; } break; case ANSI('A', '('): compatibility(VT100); cset_attr[0] = ATTR_GBCHR; break; case ANSI('B', '('): compatibility(VT100); cset_attr[0] = ATTR_ASCII; break; case ANSI('0', '('): compatibility(VT100); cset_attr[0] = ATTR_LINEDRW; break; case ANSI('A', ')'): compatibility(VT100); cset_attr[1] = ATTR_GBCHR; break; case ANSI('B', ')'): compatibility(VT100); cset_attr[1] = ATTR_ASCII; break; case ANSI('0', ')'): compatibility(VT100); cset_attr[1] = ATTR_LINEDRW; break; case ANSI('8', '%'): /* Old Linux code */ case ANSI('G', '%'): compatibility(OTHER); utf = 1; break; case ANSI('@', '%'): compatibility(OTHER); if (line_codepage != CP_UTF8) utf = 0sometimes DIM, eg on the GIGI and Linux * case 8: * This is sometimes INVIS various ANSI.,50 /* * From the VT100 Manual * NOTE: The special graphics characters in the VT100 * are different from those in the VT52 * * From VT102 manual: * 137 _ Blank - Same * 140 ` Reserved - Humm. * 141 a Solid rectangle - Similar * 142 b 1/ - Top half of fraction for the * 143 c 3/ - subscript numbers below. * 144 d 5/ * 145 e 7/ * 146 f Degrees - Same * 147 g Plus or minus - Same * 150 h Right arrow * 151 i Ellipsis (dots) * 152 j Divide by * 153 k Down arrow * 154 l Bar at scan 0 * 155 m Bar at scan 1 * 156 n Bar at scan 2 * 157 o Bar at scan 3 - Similar * 160 p Bar at scan 4 - Similar * 161 q Bar at scan 5 - Similar * 162 r Bar at scan 6 - Same * 163 s Bar at scan 7 - Similar * 164 t Subscript 0 * 165 u Subscript 1 * 166 v Subscript 2 * 167 w Subscript 3 * 170 x Subscript 4 * 171 y Subscript 5 * 172 z Subscript 6 * 173 { Subscript 7 * 174 | Subscript 8 * 175 } Subscript 9 * 176 ~ Paragraph * */#if 0#endiflink_is_real = cfg.blinktext; break; #if 0#endif #ifdef VT52_PLUS case 'E': /* compatibility(ATARI) */ move(0, 0, 0); erase_lots(FALSE, FALSE, TRUE); disptop = 0; break; case 'L': /* compatibility(ATARI) */ if (curs.y <= marg_b) scroll(curs.y, marg_b, -1, FALSE); break; case 'M': /* compatibility(ATARI) */ if (curs.y <= marg_b) scroll(curs.y, marg_b, 1, TRUE); break; case 'b': /* compatibility(ATARI) */ termstate = VT52_FG; break; case 'c': /* compatibility(ATARI) */ termstate = VT52_BG; break; case 'd': /* compatibility(ATARI) */ erase_lots(FALSE, TRUE, FALSE); disptop = 0; break; case 'e': /* compatibility(ATARI) */ cursor_on = TRUE; break; case 'f': /* compatibility(ATARI) */ cursor_on = FALSE; break; /* case 'j': Save cursor position - broken on ST */ /* case 'k': Restore cursor position */ case 'l': /* compatibility(ATARI) */ erase_lots(TRUE, TRUE, TRUE); curs.x = 0; wrapnext = FALSE; fix_cpos; break; case 'o': /* compatibility(ATARI) */ erase_lots(TRUE, TRUE, FALSE); break; case 'p': /* compatibility(ATARI) */ curr_attr |= ATTR_REVERSE; break; case 'q': /* compatibility(ATARI) */ curr_attr &= ~ATTR_REVERSE; break; case 'v': /* wrap Autowrap on - Wyse style */ /* compatibility(ATARI) */ wrap = 1; break; case 'w': /* Autowrap off */ /* compatibility(ATARI) */ wrap = 0; break; case 'R': /* compatibility(OTHER) */ vt52_bold = FALSE; curr_attr = ATTR_DEFAULT; if (use_bce) erase_char = (' ' | (curr_attr & (ATTR_FGMASK | ATTR_BGMASK | ATTR_BLINK))); break; case 'S': /* compatibility(VI50) */ curr_attr |= ATTR_UNDER; break; case 'W': /* compatibility(VI50) */ curr_attr &= ~ATTR_UNDER; break; case 'U': /* compatibility(VI50) */ vt52_bold = TRUE; curr_attr |= ATTR_BOLD; break; case 'T': /* compatibility(VI50) */ vt52_bold = FALSE; curr_attr &= ~ATTR_BOLD; break; #endif #ifdef VT52_PLUS case VT52_FG: termstate = TOPLEVEL; curr_attr &= ~ATTR_FGMASK; curr_attr &= ~ATTR_BOLD; curr_attr |= (c & 0x7) << ATTR_FGSHIFT; if ((c & 0x8) || vt52_bold) curr_attr |= ATTR_BOLD; if (use_bce) erase_char = (' ' | (curr_attr & (ATTR_FGMASK | ATTR_BGMASK | ATTR_BLINK))); break; case VT52_BG: termstate = TOPLEVEL; curr_attr &= ~ATTR_BGMASK; curr_attr &= ~ATTR_BLINK; curr_attr |= (c & 0x7) << ATTR_BGSHIFT; /* Note: bold background */ if (c & 0x8) curr_attr |= ATTR_BLINK; if (use_bce) erase_char = (' ' | (curr_attr & (ATTR_FGMASK | ATTR_BGMASK | ATTR_BLINK))); break; #endif#if 0#endifour_curs_y; unsigned long rv, cursor; pos scrpos; char ch[1024]; long cursor_background = ERASE_CHARrv = (!rvideo ^ !in_vbell ? ATTR_REVERSE : 0);, wrapnext */ /* Has the cursor position or type changed ?TATTR_ACTCURS; else cursor = 0; } else cursor = TATTR_PASCURS; if (wrapnext) cursor |= TATTR_RIGHTCURS; } else cursor = 0; our_curs_y = curs.y - disptop; if (dispcurs && (curstype != cursor || dispcurs != disptext + our_curs_y * (cols + 1) + curs.x)) { if (dispcurs > disptext && (dispcurs[-1] & ATTR_WIDE)) dispcurs[-1] |= ATTR_INVALID; if ((*dispcurs & ATTR_WIDE)) dispcurs[1] |= ATTR_INVALID; *dispcurs |= ATTR_INVALID; curstype = 0; } dispcurs = NULL; /* The normal screen data */ for (i = 0; i < rows; i++) { unsigned long *ldata; int lattr; int idx, dirty_line, dirty_run; unsigned long attr = 0; int updated_line = 0; int start = 0; int ccount = 0; int last_run_dirty = 0; idx = i * (cols + 1); dirty_run = dirty_line = (ldata[cols] != disptext[idx + cols]); disptext[idx + cols] = ldata[cols]; for (j = 0; j < cols; j++, idx++) { unsigned long tattr, tchar; unsigned long *d = ldata + j; int break_run; scrpos.x = j; tchar = (*d & (CHAR_MASK | CSET_MASK)); tattr = (*d & (ATTR_MASK ^ CSET_MASK)); switch (tchar & CSET_MASK) { case ATTR_ASCII: tchar = unitab_line[tchar & 0xFF]; break; case ATTR_LINEDRW: tchar = unitab_xterm[tchar & 0xFF]; break; } tattr |= (tchar & CSET_MASK); tchar &= CHAR_MASK; /* Video reversing things */ tattr = (tattr ^ rv ^ (posle(selstart, scrpos) && poslt(scrpos, selend) ? ATTR_REVERSE : 0)); /* 'Real' blinking ? */ if (blink_is_real && (tattr & ATTR_BLINK)) { if (has_focus && tblinker) { tchar = ' '; tattr &= ~CSET_MASK; tattr |= ATTR_ACP; } tattr &= ~ATTR_BLINK; } /* Cursor here ? Save the 'background' */ if (i == our_curs_y && j == curs.x) { cursor_background = tattr | tchar; dispcurs = disptext + idx; } if ((disptext[idx] ^ tattr) & ATTR_WIDE) dirty_line = TRUE; break_run = (tattr != attr || j - start >= sizeof(ch)); /* Special hack for VT100 Linedraw glyphs */ if ((attr & CSET_MASK) == 0x2300 && tchar >= 0xBA && tchar <= 0xBD) break_run = TRUE; if (!dbcs_screenfont && !dirty_line) { if ((tchar | tattr) == disptext[idx]) break_run = TRUE; else if (!dirty_run && ccount == 1) break_run = TRUE; } if (break_run) { if ((dirty_run || last_run_dirty) && ccount > 0) { do_text(ctx, start, i, ch, ccount, attr, lattr); updated_line = 1; } start = j; ccount = 0; attr = tattr; if (dbcs_screenfont) last_run_dirty = dirty_run; dirty_run = dirty_line; } if ((tchar | tattr) != disptext[idx]) dirty_run = TRUE; ch[ccount++] = (char) tchar; disptext[idx] = tchar | tattr; /* If it's a wide char step along to the next one. */ if (tattr & ATTR_WIDE) { if (++j < cols) { idx++; d++; /* Cursor is here ? Ouch! */ if (i == our_curs_y && j == curs.x) { cursor_background = *d; dispcurs = disptext + idx; } if (disptext[idx] != *d) dirty_run = TRUE; disptext[idx] = *d; } } } if (dirty_run && ccount > 0) { do_text(ctx, start, i, ch, ccount, attr, lattr); updated_line = 1; } /* Cursor on this line ? (and changed) */ if (i == our_curs_y && (curstype != cursor || updated_line)) { ch[0] = (char) (cursor_background & CHAR_MASK); attr = (cursor_background & ATTR_MASK) | cursor; do_cursor(ctx, curs.x, i, ch, 1, attr, lattr); curstype = cursor) { wchar_t *workbuf; wchar_tbuflen = 5120; /* Default size */ workbuf = smalloc(buflen * sizeof(wchar_t)); wbptr = workbuf; /* start filling hereLATTR_WRAPPED)) { while (((ldata[nlpos.x - 1] & 0xFF) == 0x20 || (DIRECT_CHAR(ldata[nlpos.x - 1]) && (ldata[nlpos.x - 1] & CHAR_MASK) == 0x20)) && poslt(top, nlpos)) #if 0 char cbuf[16], *p; sprintf(cbuf, "", (ldata[top.x] & 0xFFFF)); #else wchar_t cbuf[16], *p; int uc = (ldata[top.x] & 0xFFFF); int set, c; if (uc == UCSWIDE) { top.x++; continue; } switch (uc & CSET_MASK) { case ATTR_LINEDRW: if (!cfg.rawcnp) { uc = unitab_xterm[uc & 0xFF]; break; } case ATTR_ASCII: uc = unitab_line[uc & 0xFF]; break; } switch (uc & CSET_MASK) { case ATTR_ACP: uc = unitab_font[uc & 0xFF]; break; case ATTR_OEMCP: uc = unitab_oemcp[uc & 0xFF]; break; } set = (uc & CSET_MASK); c = (uc & CHAR_MASK); cbuf[0] = uc; cbuf[1] = 0; if (DIRECT_FONT(uc)) { if (c >= ' ' && c != 0x7F) { unsigned char buf[4]; WCHAR wbuf[4]; int rv; if (IsDBCSLeadByteEx(font_codepage, (BYTE) c)) { buf[0] = c; buf[1] = (unsigned char) ldata[top.x + 1]; rv = MultiByteToWideChar(font_codepage, 0, buf, 2, wbuf, 4); top.x++; } else { buf[0] = c; rv = MultiByteToWideChar(font_codepage, 0, buf, 1, wbuf, 4); } if (rv > 0) { memcpy(cbuf, wbuf, rv * sizeof(wchar_t)); cbuf[rv] = 0; } } } #endif for (p = cbuf; *p; p++) { /* Enough overhead for trailing NL and nul */ if (wblen >= buflen - 16) { workbuf = srealloc(workbuf, sizeof(wchar_t) * (buflen += 100)); wbptr = workbuf + wblen; } wblen++; *wbptr++ = *p; } top.x++; } if (nl) { int i; for (i = 0; i < sel_nl_sz; i++) {blen++; *wbptr++ = 0;} ); } /* * The wordness array is mainly for deciding the disposition of the US-ASCII * characters. */ static int wordtype(int uc) { static struct { int start, end, ctype; } *wptr, ucs_words[] = { { 128, 160, 0}, { 161, 191, 1}, { 215, 215, 1}, { 247, 247, 1}, { 0x037e, 0x037e, 1}, /* Greek question mark */ { 0x0387, 0x0387, 1}, /* Greek ano teleia */ { 0x055a, 0x055f, 1}, /* Armenian punctuation */ { 0x0589, 0x0589, 1}, /* Armenian full stop */ { 0x0700, 0x070d, 1}, /* Syriac punctuation */ { 0x104a, 0x104f, 1}, /* Myanmar punctuation */ { 0x10fb, 0x10fb, 1}, /* Georgian punctuation */ { 0x1361, 0x1368, 1}, /* Ethiopic punctuation */ { 0x166d, 0x166e, 1}, /* Canadian Syl. punctuation */ { 0x17d4, 0x17dc, 1}, /* Khmer punctuation */ { 0x1800, 0x180a, 1}, /* Mongolian punctuation */ { 0x2000, 0x200a, 0}, /* Various spaces */ { 0x2070, 0x207f, 2}, /* superscript */ { 0x2080, 0x208f, 2}, /* subscript */ { 0x200b, 0x27ff, 1}, /* punctuation and symbols */ { 0x3000, 0x3000, 0}, /* ideographic space */ { 0x3001, 0x3020, 1}, /* ideographic punctuation */ { 0x303f, 0x309f, 3}, /* Hiragana */ { 0x30a0, 0x30ff, 3}, /* Katakana */ { 0x3300, 0x9fff, 3}, /* CJK Ideographs */ { 0xac00, 0xd7a3, 3}, /* Hangul Syllables */ { 0xf900, 0xfaff, 3}, /* CJK Ideographs */ { 0xfe30, 0xfe6b, 1}, /* punctuation forms */ { 0xff00, 0xff0f, 1}, /* half/fullwidth ASCII */ { 0xff1a, 0xff20, 1}, /* half/fullwidth ASCII */ { 0xff3b, 0xff40, 1}, /* half/fullwidth ASCII */ { 0xff5b, 0xff64, 1}, /* half/fullwidth ASCII */ { 0xfff0, 0xffff, 0}, /* half/fullwidth ASCII */ { 0, 0, 0} }; uc &= (CSET_MASK | CHAR_MASK); switch (uc & CSET_MASK) { case ATTR_LINEDRW: uc = unitab_xterm[uc & 0xFF]; break; case ATTR_ASCII: uc = unitab_line[uc & 0xFF]; break; } switch (uc & CSET_MASK) { case ATTR_ACP: uc = unitab_font[uc & 0xFF]; break; case ATTR_OEMCP: uc = unitab_oemcp[uc & 0xFF]; break; } if (uc < 0x80) return wordness[uc]; for (wptr = ucs_words; wptr->start; wptr++) { if (uc >= wptr->start && uc <= wptr->end) return wptr->ctype; } return 2Ltype(ldata[p.x]); if (dir == +1) { while (p.x < cols && wordtype(ldata[p.x + 1]) == wvalue) p.x++; } else { while (p.x > 0 && wordtype(ldata[p.x - 1]) == wvalue) wchar_t *data; int len; get_clip(&data, &len); if (data) { wchar_t * sizeof(wchar_t)el_nl_sz && !memcmp(p, sel_nl, sizeof(sel_nl)))) p++; { int i; for (i = 0; i < p - q; i++) { paste_buffer[paste_len++] = q[i]; } } if (p <= data + len - sel_nl_szel_nl_sz; } q = p; } /* Assume a small paste will be OK in one go. */ if (paste_len < 256) { luniuni Node-path: putty/unicode.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 29116 Text-content-md5: ed5d7406cf3aaf327d5d713078e35c75 Text-content-sha1: 96c4fc2e4e2e068a2f9d363e5602bf4e806a2783 Content-length: 29232 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN+++#include #include #include #include #include #include "putty.h" void init_ucs_tables(void); void lpage_send(int codepage, char *buf, int len); void luni_send(wchar_t * widebuf, int len); static void get_unitab(int codepage, wchar_t * unitab, int ftype); /* Character conversion arrays; they are usually taken from windows, * the xterm one has the four scanlines that have no unicode 2.0 * equlivents mapped into the private area. */ static char **uni_tbl; static WCHAR unitab_xterm_std[32] = { 0x2666, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x23ba, 0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, 0x2534, 0x252c, 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x00b7, 0x0020 }; extern struct cp_list_item { char *name; int codepage; int cp_size; wchar_t *cp_table; } cp_list[]; static void link_font(WCHAR * line_tbl, WCHAR * font_tbl, WCHAR attr); void init_ucs_tables(void) { int i, j; int used_dtf = 0; char tbuf[256]; for (i = 0; i < 256; i++) tbuf[i] = i; /* Decide on the Line and Font codepages */ line_codepage = decode_codepage(cfg.line_codepage); if (cfg.vtmode == VT_OEMONLY) { font_codepage = 437; dbcs_screenfont = 0; if (line_codepage <= 0) line_codepage = GetACP(); } else if (line_codepage <= 0) line_codepage = font_codepage; utf = (line_codepage == CP_UTF8); /* Collect screen font ucs table */ if (dbcs_screenfont) { get_unitab(font_codepage, unitab_font, 2); for (i = 128; i < 256; i++) unitab_font[i] = (WCHAR) (ATTR_ACP + i); } else { get_unitab(font_codepage, unitab_font, 1); /* CP437 fonts are often broken ... */ if (font_codepage == 437) unitab_font[0] = unitab_font[255] = 0xFFFF; } if (cfg.vtmode == VT_XWINDOWS) memcpy(unitab_font + 1, unitab_xterm_std, sizeof(unitab_xterm_std)); /* Collect OEMCP ucs table */ get_unitab(CP_OEMCP, unitab_oemcp, 1); /* Collect line set ucs table */ if (line_codepage == font_codepage && (dbcs_screenfont || cfg.vtmode == VT_POORMAN)) { /* For DBCS and POOR fonts force direct to font */ used_dtf = 1; for (i = 0; i < 32; i++) unitab_line[i] = (WCHAR) i; for (i = 32; i < 256; i++) unitab_line[i] = (WCHAR) (ATTR_ACP + i); unitab_line[127] = (WCHAR) 127; } else { get_unitab(line_codepage, unitab_line, 0); } #if 0 debug( ("Line cp%d, Font cp%d%s\n", line_codepage, font_codepage, dbcs_screenfont ? " DBCS" : "")); for (i = 0; i < 256; i += 16) { for (j = 0; j < 16; j++) { debug(("%04x%s", unitab_line[i + j], j == 15 ? "" : ",")); } debug(("\n")); } #endif /* VT100 graphics - NB: Broken for non-ascii CP's */ memcpy(unitab_xterm, unitab_line, sizeof(unitab_xterm)); memcpy(unitab_xterm + '`', unitab_xterm_std, sizeof(unitab_xterm_std)); unitab_xterm['_'] = ' '; /* Generate UCS ->line page table. */ if (uni_tbl) { for (i = 0; i < 256; i++) if (uni_tbl[i]) sfree(uni_tbl[i]); sfree(uni_tbl); uni_tbl = 0; } if (!used_dtf) { for (i = 0; i < 256; i++) { if (DIRECT_CHAR(unitab_line[i])) continue; if (DIRECT_FONT(unitab_line[i])) continue; if (!uni_tbl) { uni_tbl = smalloc(256 * sizeof(char *)); memset(uni_tbl, 0, 256 * sizeof(char *)); } j = ((unitab_line[i] >> 8) & 0xFF); if (!uni_tbl[j]) { uni_tbl[j] = smalloc(256 * sizeof(char)); memset(uni_tbl[j], 0, 256 * sizeof(char)); } uni_tbl[j][unitab_line[i] & 0xFF] = i; } } /* Find the line control characters. */ for (i = 0; i < 256; i++) if (unitab_line[i] < ' ' || (unitab_line[i] >= 0x7F && unitab_line[i] < 0xA0)) unitab_ctrl[i] = i; else unitab_ctrl[i] = 0xFF; /* Generate line->screen direct conversion links. */ link_font(unitab_line, unitab_font, ATTR_ACP); link_font(unitab_xterm, unitab_font, ATTR_ACP); if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_XWINDOWS) { link_font(unitab_line, unitab_oemcp, ATTR_OEMCP); link_font(unitab_xterm, unitab_oemcp, ATTR_OEMCP); } /* Last chance, if !unicode then try poorman links. */ if (cfg.vtmode != VT_UNICODE) { static char poorman_latin1[] = " !cL.Y|S\"Ca<--R~o+23'u|.,1o>///?AAAAAAACEEEEIIIIDNOOOOOxOUUUUYPBaaaaaaaceeeeiiiionooooo/ouuuuypy"; static char poorman_vt100[] = "*#****o~**+++++-----++++|****L."; for (i = 160; i < 256; i++) if (!DIRECT_FONT(unitab_line[i]) && unitab_line[i] >= 160 && unitab_line[i] < 256) unitab_line[i] = (WCHAR) (ATTR_ACP + poorman_latin1[unitab_line[i] - 160]); for (i = 96; i < 127; i++) if (!DIRECT_FONT(unitab_xterm[i])) unitab_xterm[i] = (WCHAR) (ATTR_ACP + poorman_vt100[i - 96]); } } static void link_font(WCHAR * line_tbl, WCHAR * font_tbl, WCHAR attr) { int i, j, k; for (k = 0; k < 256; k++) { i = ((k + 32) & 0xFF); if (DIRECT_FONT(line_tbl[i])) continue; for (j = 0; j < 256; j++) { if (line_tbl[i] == font_tbl[j]) { line_tbl[i] = (WCHAR) (attr + j); break; } } } } void lpage_send(int codepage, char *buf, int len) { static wchar_t *widebuffer = 0; static int widesize = 0; int wclen; if (codepage < 0) { ldisc_send(buf, len); return; } if (len > widesize) { sfree(widebuffer); widebuffer = smalloc(len * 2 * sizeof(wchar_t)); widesize = len * 2; } wclen = MultiByteToWideChar(codepage, 0, buf, len, widebuffer, widesize); luni_send(widebuffer, wclen); } void luni_send(wchar_t * widebuf, int len) { static char *linebuffer = 0; static int linesize = 0; int ratio = (utf) ? 3 : 1; int i; char *p; if (len * ratio > linesize) { sfree(linebuffer); linebuffer = smalloc(len * ratio * 2 * sizeof(wchar_t)); linesize = len * ratio * 2; } if (utf) { /* UTF is a simple algorithm */ for (p = linebuffer, i = 0; i < len; i++) { wchar_t ch = widebuf[i]; if (ch < 0x80) { *p++ = (char) (ch); } else if (ch < 0x800) { *p++ = (0xC0 | (ch >> 6)); *p++ = (0x80 | (ch & 0x3F)); } else { *p++ = (0xE0 | (ch >> 12)); *p++ = (0x80 | ((ch >> 6) & 0x3F)); *p++ = (0x80 | (ch & 0x3F)); } } } else if (!uni_tbl) { int rv; rv = WideCharToMultiByte(line_codepage, 0, widebuf, len, linebuffer, linesize, NULL, NULL); if (rv >= 0) p = linebuffer + rv; else p = linebuffer; } else { /* Others are a lookup in an array */ for (p = linebuffer, i = 0; i < len; i++) { wchar_t ch = widebuf[i]; int by; char *p1; if (uni_tbl && (p1 = uni_tbl[(ch >> 8) & 0xFF]) && (by = p1[ch & 0xFF])) *p++ = by; else if (ch < 0x80) *p++ = (char) ch; #if 1 else *p++ = '.'; #endif } } if (p > linebuffer) ldisc_send(linebuffer, p - linebuffer); } int check_compose(int first, int second) { static struct { char first, second; wchar_t composed; } composetbl[] = { { 0x2b, 0x2b, 0x0023}, { 0x41, 0x41, 0x0040}, { 0x28, 0x28, 0x005b}, { 0x2f, 0x2f, 0x005c}, { 0x29, 0x29, 0x005d}, { 0x28, 0x2d, 0x007b}, { 0x2d, 0x29, 0x007d}, { 0x2f, 0x5e, 0x007c}, { 0x21, 0x21, 0x00a1}, { 0x43, 0x2f, 0x00a2}, { 0x43, 0x7c, 0x00a2}, { 0x4c, 0x2d, 0x00a3}, { 0x4c, 0x3d, 0x00a3}, { 0x58, 0x4f, 0x00a4}, { 0x58, 0x30, 0x00a4}, { 0x59, 0x2d, 0x00a5}, { 0x59, 0x3d, 0x00a5}, { 0x7c, 0x7c, 0x00a6}, { 0x53, 0x4f, 0x00a7}, { 0x53, 0x21, 0x00a7}, { 0x53, 0x30, 0x00a7}, { 0x22, 0x22, 0x00a8}, { 0x43, 0x4f, 0x00a9}, { 0x43, 0x30, 0x00a9}, { 0x41, 0x5f, 0x00aa}, { 0x3c, 0x3c, 0x00ab}, { 0x2c, 0x2d, 0x00ac}, { 0x2d, 0x2d, 0x00ad}, { 0x52, 0x4f, 0x00ae}, { 0x2d, 0x5e, 0x00af}, { 0x30, 0x5e, 0x00b0}, { 0x2b, 0x2d, 0x00b1}, { 0x32, 0x5e, 0x00b2}, { 0x33, 0x5e, 0x00b3}, { 0x27, 0x27, 0x00b4}, { 0x2f, 0x55, 0x00b5}, { 0x50, 0x21, 0x00b6}, { 0x2e, 0x5e, 0x00b7}, { 0x2c, 0x2c, 0x00b8}, { 0x31, 0x5e, 0x00b9}, { 0x4f, 0x5f, 0x00ba}, { 0x3e, 0x3e, 0x00bb}, { 0x31, 0x34, 0x00bc}, { 0x31, 0x32, 0x00bd}, { 0x33, 0x34, 0x00be}, { 0x3f, 0x3f, 0x00bf}, { 0x60, 0x41, 0x00c0}, { 0x27, 0x41, 0x00c1}, { 0x5e, 0x41, 0x00c2}, { 0x7e, 0x41, 0x00c3}, { 0x22, 0x41, 0x00c4}, { 0x2a, 0x41, 0x00c5}, { 0x41, 0x45, 0x00c6}, { 0x2c, 0x43, 0x00c7}, { 0x60, 0x45, 0x00c8}, { 0x27, 0x45, 0x00c9}, { 0x5e, 0x45, 0x00ca}, { 0x22, 0x45, 0x00cb}, { 0x60, 0x49, 0x00cc}, { 0x27, 0x49, 0x00cd}, { 0x5e, 0x49, 0x00ce}, { 0x22, 0x49, 0x00cf}, { 0x2d, 0x44, 0x00d0}, { 0x7e, 0x4e, 0x00d1}, { 0x60, 0x4f, 0x00d2}, { 0x27, 0x4f, 0x00d3}, { 0x5e, 0x4f, 0x00d4}, { 0x7e, 0x4f, 0x00d5}, { 0x22, 0x4f, 0x00d6}, { 0x58, 0x58, 0x00d7}, { 0x2f, 0x4f, 0x00d8}, { 0x60, 0x55, 0x00d9}, { 0x27, 0x55, 0x00da}, { 0x5e, 0x55, 0x00db}, { 0x22, 0x55, 0x00dc}, { 0x27, 0x59, 0x00dd}, { 0x48, 0x54, 0x00de}, { 0x73, 0x73, 0x00df}, { 0x60, 0x61, 0x00e0}, { 0x27, 0x61, 0x00e1}, { 0x5e, 0x61, 0x00e2}, { 0x7e, 0x61, 0x00e3}, { 0x22, 0x61, 0x00e4}, { 0x2a, 0x61, 0x00e5}, { 0x61, 0x65, 0x00e6}, { 0x2c, 0x63, 0x00e7}, { 0x60, 0x65, 0x00e8}, { 0x27, 0x65, 0x00e9}, { 0x5e, 0x65, 0x00ea}, { 0x22, 0x65, 0x00eb}, { 0x60, 0x69, 0x00ec}, { 0x27, 0x69, 0x00ed}, { 0x5e, 0x69, 0x00ee}, { 0x22, 0x69, 0x00ef}, { 0x2d, 0x64, 0x00f0}, { 0x7e, 0x6e, 0x00f1}, { 0x60, 0x6f, 0x00f2}, { 0x27, 0x6f, 0x00f3}, { 0x5e, 0x6f, 0x00f4}, { 0x7e, 0x6f, 0x00f5}, { 0x22, 0x6f, 0x00f6}, { 0x3a, 0x2d, 0x00f7}, { 0x6f, 0x2f, 0x00f8}, { 0x60, 0x75, 0x00f9}, { 0x27, 0x75, 0x00fa}, { 0x5e, 0x75, 0x00fb}, { 0x22, 0x75, 0x00fc}, { 0x27, 0x79, 0x00fd}, { 0x68, 0x74, 0x00fe}, { 0x22, 0x79, 0x00ff}, /* Unicode extras. */ { 0x6f, 0x65, 0x0153}, { 0x4f, 0x45, 0x0152}, /* Compose pairs from UCS */ { 0x41, 0x2D, 0x0100}, { 0x61, 0x2D, 0x0101}, { 0x43, 0x27, 0x0106}, { 0x63, 0x27, 0x0107}, { 0x43, 0x5E, 0x0108}, { 0x63, 0x5E, 0x0109}, { 0x45, 0x2D, 0x0112}, { 0x65, 0x2D, 0x0113}, { 0x47, 0x5E, 0x011C}, { 0x67, 0x5E, 0x011D}, { 0x47, 0x2C, 0x0122}, { 0x67, 0x2C, 0x0123}, { 0x48, 0x5E, 0x0124}, { 0x68, 0x5E, 0x0125}, { 0x49, 0x7E, 0x0128}, { 0x69, 0x7E, 0x0129}, { 0x49, 0x2D, 0x012A}, { 0x69, 0x2D, 0x012B}, { 0x4A, 0x5E, 0x0134}, { 0x6A, 0x5E, 0x0135}, { 0x4B, 0x2C, 0x0136}, { 0x6B, 0x2C, 0x0137}, { 0x4C, 0x27, 0x0139}, { 0x6C, 0x27, 0x013A}, { 0x4C, 0x2C, 0x013B}, { 0x6C, 0x2C, 0x013C}, { 0x4E, 0x27, 0x0143}, { 0x6E, 0x27, 0x0144}, { 0x4E, 0x2C, 0x0145}, { 0x6E, 0x2C, 0x0146}, { 0x4F, 0x2D, 0x014C}, { 0x6F, 0x2D, 0x014D}, { 0x52, 0x27, 0x0154}, { 0x72, 0x27, 0x0155}, { 0x52, 0x2C, 0x0156}, { 0x72, 0x2C, 0x0157}, { 0x53, 0x27, 0x015A}, { 0x73, 0x27, 0x015B}, { 0x53, 0x5E, 0x015C}, { 0x73, 0x5E, 0x015D}, { 0x53, 0x2C, 0x015E}, { 0x73, 0x2C, 0x015F}, { 0x54, 0x2C, 0x0162}, { 0x74, 0x2C, 0x0163}, { 0x55, 0x7E, 0x0168}, { 0x75, 0x7E, 0x0169}, { 0x55, 0x2D, 0x016A}, { 0x75, 0x2D, 0x016B}, { 0x55, 0x2A, 0x016E}, { 0x75, 0x2A, 0x016F}, { 0x57, 0x5E, 0x0174}, { 0x77, 0x5E, 0x0175}, { 0x59, 0x5E, 0x0176}, { 0x79, 0x5E, 0x0177}, { 0x59, 0x22, 0x0178}, { 0x5A, 0x27, 0x0179}, { 0x7A, 0x27, 0x017A}, { 0x47, 0x27, 0x01F4}, { 0x67, 0x27, 0x01F5}, { 0x4E, 0x60, 0x01F8}, { 0x6E, 0x60, 0x01F9}, { 0x45, 0x2C, 0x0228}, { 0x65, 0x2C, 0x0229}, { 0x59, 0x2D, 0x0232}, { 0x79, 0x2D, 0x0233}, { 0x44, 0x2C, 0x1E10}, { 0x64, 0x2C, 0x1E11}, { 0x47, 0x2D, 0x1E20}, { 0x67, 0x2D, 0x1E21}, { 0x48, 0x22, 0x1E26}, { 0x68, 0x22, 0x1E27}, { 0x48, 0x2C, 0x1E28}, { 0x68, 0x2C, 0x1E29}, { 0x4B, 0x27, 0x1E30}, { 0x6B, 0x27, 0x1E31}, { 0x4D, 0x27, 0x1E3E}, { 0x6D, 0x27, 0x1E3F}, { 0x50, 0x27, 0x1E54}, { 0x70, 0x27, 0x1E55}, { 0x56, 0x7E, 0x1E7C}, { 0x76, 0x7E, 0x1E7D}, { 0x57, 0x60, 0x1E80}, { 0x77, 0x60, 0x1E81}, { 0x57, 0x27, 0x1E82}, { 0x77, 0x27, 0x1E83}, { 0x57, 0x22, 0x1E84}, { 0x77, 0x22, 0x1E85}, { 0x58, 0x22, 0x1E8C}, { 0x78, 0x22, 0x1E8D}, { 0x5A, 0x5E, 0x1E90}, { 0x7A, 0x5E, 0x1E91}, { 0x74, 0x22, 0x1E97}, { 0x77, 0x2A, 0x1E98}, { 0x79, 0x2A, 0x1E99}, { 0x45, 0x7E, 0x1EBC}, { 0x65, 0x7E, 0x1EBD}, { 0x59, 0x60, 0x1EF2}, { 0x79, 0x60, 0x1EF3}, { 0x59, 0x7E, 0x1EF8}, { 0x79, 0x7E, 0x1EF9}, /* Compatible/possibles from UCS */ { 0x49, 0x4A, 0x0132}, { 0x69, 0x6A, 0x0133}, { 0x4C, 0x4A, 0x01C7}, { 0x4C, 0x6A, 0x01C8}, { 0x6C, 0x6A, 0x01C9}, { 0x4E, 0x4A, 0x01CA}, { 0x4E, 0x6A, 0x01CB}, { 0x6E, 0x6A, 0x01CC}, { 0x44, 0x5A, 0x01F1}, { 0x44, 0x7A, 0x01F2}, { 0x64, 0x7A, 0x01F3}, { 0x2E, 0x2E, 0x2025}, { 0x21, 0x21, 0x203C}, { 0x3F, 0x21, 0x2048}, { 0x21, 0x3F, 0x2049}, { 0x52, 0x73, 0x20A8}, { 0x4E, 0x6F, 0x2116}, { 0x53, 0x4D, 0x2120}, { 0x54, 0x4D, 0x2122}, { 0x49, 0x49, 0x2161}, { 0x49, 0x56, 0x2163}, { 0x56, 0x49, 0x2165}, { 0x49, 0x58, 0x2168}, { 0x58, 0x49, 0x216A}, { 0x69, 0x69, 0x2171}, { 0x69, 0x76, 0x2173}, { 0x76, 0x69, 0x2175}, { 0x69, 0x78, 0x2178}, { 0x78, 0x69, 0x217A}, { 0x31, 0x30, 0x2469}, { 0x31, 0x31, 0x246A}, { 0x31, 0x32, 0x246B}, { 0x31, 0x33, 0x246C}, { 0x31, 0x34, 0x246D}, { 0x31, 0x35, 0x246E}, { 0x31, 0x36, 0x246F}, { 0x31, 0x37, 0x2470}, { 0x31, 0x38, 0x2471}, { 0x31, 0x39, 0x2472}, { 0x32, 0x30, 0x2473}, { 0x31, 0x2E, 0x2488}, { 0x32, 0x2E, 0x2489}, { 0x33, 0x2E, 0x248A}, { 0x34, 0x2E, 0x248B}, { 0x35, 0x2E, 0x248C}, { 0x36, 0x2E, 0x248D}, { 0x37, 0x2E, 0x248E}, { 0x38, 0x2E, 0x248F}, { 0x39, 0x2E, 0x2490}, { 0x64, 0x61, 0x3372}, { 0x41, 0x55, 0x3373}, { 0x6F, 0x56, 0x3375}, { 0x70, 0x63, 0x3376}, { 0x70, 0x41, 0x3380}, { 0x6E, 0x41, 0x3381}, { 0x6D, 0x41, 0x3383}, { 0x6B, 0x41, 0x3384}, { 0x4B, 0x42, 0x3385}, { 0x4D, 0x42, 0x3386}, { 0x47, 0x42, 0x3387}, { 0x70, 0x46, 0x338A}, { 0x6E, 0x46, 0x338B}, { 0x6D, 0x67, 0x338E}, { 0x6B, 0x67, 0x338F}, { 0x48, 0x7A, 0x3390}, { 0x66, 0x6D, 0x3399}, { 0x6E, 0x6D, 0x339A}, { 0x6D, 0x6D, 0x339C}, { 0x63, 0x6D, 0x339D}, { 0x6B, 0x6D, 0x339E}, { 0x50, 0x61, 0x33A9}, { 0x70, 0x73, 0x33B0}, { 0x6E, 0x73, 0x33B1}, { 0x6D, 0x73, 0x33B3}, { 0x70, 0x56, 0x33B4}, { 0x6E, 0x56, 0x33B5}, { 0x6D, 0x56, 0x33B7}, { 0x6B, 0x56, 0x33B8}, { 0x4D, 0x56, 0x33B9}, { 0x70, 0x57, 0x33BA}, { 0x6E, 0x57, 0x33BB}, { 0x6D, 0x57, 0x33BD}, { 0x6B, 0x57, 0x33BE}, { 0x4D, 0x57, 0x33BF}, { 0x42, 0x71, 0x33C3}, { 0x63, 0x63, 0x33C4}, { 0x63, 0x64, 0x33C5}, { 0x64, 0x42, 0x33C8}, { 0x47, 0x79, 0x33C9}, { 0x68, 0x61, 0x33CA}, { 0x48, 0x50, 0x33CB}, { 0x69, 0x6E, 0x33CC}, { 0x4B, 0x4B, 0x33CD}, { 0x4B, 0x4D, 0x33CE}, { 0x6B, 0x74, 0x33CF}, { 0x6C, 0x6D, 0x33D0}, { 0x6C, 0x6E, 0x33D1}, { 0x6C, 0x78, 0x33D3}, { 0x6D, 0x62, 0x33D4}, { 0x50, 0x48, 0x33D7}, { 0x50, 0x52, 0x33DA}, { 0x73, 0x72, 0x33DB}, { 0x53, 0x76, 0x33DC}, { 0x57, 0x62, 0x33DD}, { 0x66, 0x66, 0xFB00}, { 0x66, 0x69, 0xFB01}, { 0x66, 0x6C, 0xFB02}, { 0x73, 0x74, 0xFB06}, { 0, 0, 0} }, *c; static int recurse = 0; int nc = -1; for (c = composetbl; c->first; c++) { if (c->first == first && c->second == second) return c->composed; } if (recurse == 0) { recurse = 1; nc = check_compose(second, first); if (nc == -1) nc = check_compose(toupper(first), toupper(second)); if (nc == -1) nc = check_compose(toupper(second), toupper(first)); recurse = 0; } return nc; } int decode_codepage(char *cp_name) { char *s, *d; struct cp_list_item *cpi; int codepage = -1; char ch; CPINFO cpinfo; if (cp_name && *cp_name) for (cpi = cp_list; cpi->name; cpi++) { s = cp_name; d = cpi->name; for (;;) { while (*s && !isalnum(*s) && *s != ':') s++; while (*d && !isalnum(*d) && *d != ':') d++; if (*s == 0) { codepage = cpi->codepage; if (codepage == CP_UTF8) goto break_break; if (codepage == 0) { codepage = 65536 + (cpi - cp_list); goto break_break; } if (GetCPInfo(codepage, &cpinfo) != 0) goto break_break; } if (islower(*s)) ch = toupper(*s++); else ch = *s++; if (ch != *d++) break; } } if (cp_name && *cp_name) { d = cp_name; if (strnicmp(d, "cp", 2) == 0) d += 2; if (strnicmp(d, "ibm", 3) == 0) d += 3; for (s = d; *s >= '0' && *s <= '9'; s++); if (*s == 0 && s != d) codepage = atoi(d); /* CP999 or IBM999 */ if (codepage == CP_ACP) codepage = GetACP(); if (codepage == CP_OEMCP) codepage = GetOEMCP(); if (codepage > 65535) codepage = -2; } break_break:; if (codepage != -1) { if (codepage != CP_UTF8 && codepage < 65536) { if (GetCPInfo(codepage, &cpinfo) == 0) { codepage = -2; } else if (cpinfo.MaxCharSize > 1) codepage = -3; } } if (codepage == -1 && *cp_name) codepage = -2; return codepage; } char *cp_name(int codepage) { struct cp_list_item *cpi, *cpno; static char buf[32]; if (codepage > 0 && codepage < 65536) sprintf(buf, "CP%03d", codepage); else *buf = 0; if (codepage >= 65536) { cpno = 0; for (cpi = cp_list; cpi->name; cpi++) if (cpi == cp_list + (codepage - 65536)) { cpno = cpi; break; } if (cpno) for (cpi = cp_list; cpi->name; cpi++) { if (cpno->cp_table == cpi->cp_table) return cpi->name; } } else { for (cpi = cp_list; cpi->name; cpi++) { if (codepage == cpi->codepage) return cpi->name; } } return buf; } static void get_unitab(int codepage, wchar_t * unitab, int ftype) { char tbuf[4]; int i, max = 256, flg = MB_ERR_INVALID_CHARS; if (ftype) flg |= MB_USEGLYPHCHARS; if (ftype == 2) max = 128; if (codepage == CP_UTF8) codepage = 28591; else if (codepage == CP_ACP) codepage = GetACP(); else if (codepage == CP_OEMCP) codepage = GetOEMCP(); if (codepage > 0 && codepage < 65536) { for (i = 0; i < max; i++) { tbuf[0] = i; if (MultiByteToWideChar(codepage, flg, tbuf, 1, unitab + i, 1) != 1) unitab[i] = 0xFFFD; } } else { int j = 256 - cp_list[codepage & 0xFFFF].cp_size; for (i = 0; i < max; i++) unitab[i] = i; for (i = j; i < max; i++) unitab[i] = cp_list[codepage & 0xFFFF].cp_table[i - j]; } } /* * From here down is the codepage data, if you want to add your own line * codepage do it here. * * If the codepage is non-zero it's a window codepage, zero means use a * local codepage. The name is always converted to the first of any * duplicate definitions. */ extern wchar_t iso_8859_10[]; extern wchar_t iso_8859_11[]; extern wchar_t iso_8859_12[]; extern wchar_t iso_8859_14[]; extern wchar_t iso_8859_15[]; extern wchar_t roman8[]; extern wchar_t koi8_u[]; extern wchar_t vscii[]; extern wchar_t dec_mcs[]; static struct cp_list_item cp_list[] = { {"UTF-8", CP_UTF8}, {"ISO-8859-1:1987", 28591}, {"ISO-8859-2:1987", 28592}, {"ISO-8859-3:1988", 28593}, {"ISO-8859-4:1988", 28594}, {"ISO-8859-5:1988", 28595}, {"ISO-8859-6:1987", 28596}, {"ISO-8859-7:1987", 28597}, {"ISO-8859-8:1988", 28598}, {"ISO-8859-9:1989", 28599}, {"ISO-8859-10:1993", 0, 96, iso_8859_10}, {"ISO-8859-11", 0, 96, iso_8859_11}, {"ISO-8859-12", 0, 96, iso_8859_12}, {"ISO-8859-14", 0, 96, iso_8859_14}, {"ISO-8859-15:1998", 0, 96, iso_8859_15}, {"KOI8-U", 0, 128, koi8_u}, {"KOI8-R", 20866}, {"HP-ROMAN8", 0, 96, roman8}, {"VSCII", 0, 256, vscii}, {"DEC-MCS", 0, 96, dec_mcs}, /* All below here are aliases */ {"ROMAN8", 0, 96, roman8}, {"R8", 0, 96, roman8}, /* Note this is Latin ->> */ {"LATIN0", 0, 96, iso_8859_15}, {"L0", 0, 96, iso_8859_15}, {"CP819", 28591}, {"CP878", 20866}, {"L1", 28591}, {"L2", 28592}, {"L3", 28593}, {"L4", 28594}, {"L5", 28599}, {"LATIN1", 28591}, {"LATIN2", 28592}, {"LATIN3", 28593}, {"LATIN4", 28594}, {"LATIN5", 28599}, {0, 0} }; static wchar_t iso_8859_10[] = { 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A, 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2014, 0x016B, 0x014B, 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138 }; static wchar_t iso_8859_11[] = { 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x0E3F, 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD }; static wchar_t iso_8859_12[] = { 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019 }; static wchar_t iso_8859_14[] = { 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178, 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF }; static wchar_t iso_8859_15[] = { 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff }; static wchar_t roman8[] = { 0x00A0, 0x00C0, 0x00C2, 0x00C8, 0x00CA, 0x00CB, 0x00CE, 0x00CF, 0x00B4, 0x02CB, 0x02C6, 0x00A8, 0x02DC, 0x00D9, 0x00DB, 0x20A4, 0x00AF, 0x00DD, 0x00FD, 0x00B0, 0x00C7, 0x00E7, 0x00D1, 0x00F1, 0x00A1, 0x00BF, 0x00A4, 0x00A3, 0x00A5, 0x00A7, 0x0192, 0x00A2, 0x00E2, 0x00EA, 0x00F4, 0x00FB, 0x00E1, 0x00E9, 0x00F3, 0x00FA, 0x00E0, 0x00E8, 0x00F2, 0x00F9, 0x00E4, 0x00EB, 0x00F6, 0x00FC, 0x00C5, 0x00EE, 0x00D8, 0x00C6, 0x00E5, 0x00ED, 0x00F8, 0x00E6, 0x00C4, 0x00EC, 0x00D6, 0x00DC, 0x00C9, 0x00EF, 0x00DF, 0x00D4, 0x00C1, 0x00C3, 0x00E3, 0x00D0, 0x00F0, 0x00CD, 0x00CC, 0x00D3, 0x00D2, 0x00D5, 0x00F5, 0x0160, 0x0161, 0x00DA, 0x0178, 0x00FF, 0x00DE, 0x00FE, 0x00B7, 0x00B5, 0x00B6, 0x00BE, 0x2014, 0x00BC, 0x00BD, 0x00AA, 0x00BA, 0x00AB, 0x25A0, 0x00BB, 0x00B1, 0xFFFD }; static wchar_t koi8_u[] = { 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2022, 0x221A, 0x2248, 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x0491, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x0490, 0x256C, 0x00A9, 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A }; static wchar_t vscii[] = { 0x0000, 0x0001, 0x1EB2, 0x0003, 0x0004, 0x1EB4, 0x1EAA, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x1EF6, 0x0015, 0x0016, 0x0017, 0x0018, 0x1EF8, 0x001a, 0x001b, 0x001c, 0x001d, 0x1EF4, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007f, 0x1EA0, 0x1EAE, 0x1EB0, 0x1EB6, 0x1EA4, 0x1EA6, 0x1EA8, 0x1EAC, 0x1EBC, 0x1EB8, 0x1EBE, 0x1EC0, 0x1EC2, 0x1EC4, 0x1EC6, 0x1ED0, 0x1ED2, 0x1ED4, 0x1ED6, 0x1ED8, 0x1EE2, 0x1EDA, 0x1EDC, 0x1EDE, 0x1ECA, 0x1ECE, 0x1ECC, 0x1EC8, 0x1EE6, 0x0168, 0x1EE4, 0x1EF2, 0x00D5, 0x1EAF, 0x1EB1, 0x1EB7, 0x1EA5, 0x1EA7, 0x1EA8, 0x1EAD, 0x1EBD, 0x1EB9, 0x1EBF, 0x1EC1, 0x1EC3, 0x1EC5, 0x1EC7, 0x1ED1, 0x1ED3, 0x1ED5, 0x1ED7, 0x1EE0, 0x01A0, 0x1ED9, 0x1EDD, 0x1EDF, 0x1ECB, 0x1EF0, 0x1EE8, 0x1EEA, 0x1EEC, 0x01A1, 0x1EDB, 0x01AF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x1EA2, 0x0102, 0x1EB3, 0x1EB5, 0x00C8, 0x00C9, 0x00CA, 0x1EBA, 0x00CC, 0x00CD, 0x0128, 0x1EF3, 0x0110, 0x1EE9, 0x00D2, 0x00D3, 0x00D4, 0x1EA1, 0x1EF7, 0x1EEB, 0x1EED, 0x00D9, 0x00DA, 0x1EF9, 0x1EF5, 0x00DD, 0x1EE1, 0x01B0, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x1EA3, 0x0103, 0x1EEF, 0x1EAB, 0x00E8, 0x00E9, 0x00EA, 0x1EBB, 0x00EC, 0x00ED, 0x0129, 0x1EC9, 0x0111, 0x1EF1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x1ECF, 0x1ECD, 0x1EE5, 0x00F9, 0x00FA, 0x0169, 0x1EE7, 0x00FD, 0x1EE3, 0x1EEE }; static wchar_t dec_mcs[] = { 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0xFFFD, 0x00A5, 0xFFFD, 0x00A7, 0x00A4, 0x00A9, 0x00AA, 0x00AB, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0xFFFD, 0x00B5, 0x00B6, 0x00B7, 0xFFFD, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0xFFFD, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0xFFFD, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0152, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0178, 0xFFFD, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0xFFFD, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0153, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FF, 0xFFFD, 0xFFFD }; Node-path: putty/wcwidth.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4651 Text-content-md5: aa841cff394276776a291e18bb6252b8 Text-content-sha1: b8e92c9ef5d7d519e8469d810efedd9ecf4d4ff8 Content-length: 4767 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * This is an implementation of wcwidth() and wcswidth() as defined in * "The Single UNIX Specification, Version 2, The Open Group, 1997" * * * Markus Kuhn -- 2000-02-08 -- public domain */ #include /* These functions define the column width of an ISO 10646 character * as follows: * * - The null character (U+0000) has a column width of 0. * * - Other C0/C1 control characters and DEL will lead to a return * value of -1. * * - Non-spacing and enclosing combining characters (general * category code Mn or Me in the Unicode database) have a * column width of 0. * * - Spacing characters in the East Asian Wide (W) or East Asian * FullWidth (F) category as defined in Unicode Technical * Report #11 have a column width of 2. * * - All remaining characters (including all printable * ISO 8859-1 and WGL4 characters, Unicode control characters, * etc.) have a column width of 1. * * This implementation assumes that wchar_t characters are encoded * in ISO 10646. */ int wcwidth(wchar_t ucs) { /* sorted list of non-overlapping intervals of non-spacing characters */ static const struct interval { unsigned short first; unsigned short last; } combining[] = { { 0x0300, 0x034E}, { 0x0360, 0x0362}, { 0x0483, 0x0486}, { 0x0488, 0x0489}, { 0x0591, 0x05A1}, { 0x05A3, 0x05B9}, { 0x05BB, 0x05BD}, { 0x05BF, 0x05BF}, { 0x05C1, 0x05C2}, { 0x05C4, 0x05C4}, { 0x064B, 0x0655}, { 0x0670, 0x0670}, { 0x06D6, 0x06E4}, { 0x06E7, 0x06E8}, { 0x06EA, 0x06ED}, { 0x0711, 0x0711}, { 0x0730, 0x074A}, { 0x07A6, 0x07B0}, { 0x0901, 0x0902}, { 0x093C, 0x093C}, { 0x0941, 0x0948}, { 0x094D, 0x094D}, { 0x0951, 0x0954}, { 0x0962, 0x0963}, { 0x0981, 0x0981}, { 0x09BC, 0x09BC}, { 0x09C1, 0x09C4}, { 0x09CD, 0x09CD}, { 0x09E2, 0x09E3}, { 0x0A02, 0x0A02}, { 0x0A3C, 0x0A3C}, { 0x0A41, 0x0A42}, { 0x0A47, 0x0A48}, { 0x0A4B, 0x0A4D}, { 0x0A70, 0x0A71}, { 0x0A81, 0x0A82}, { 0x0ABC, 0x0ABC}, { 0x0AC1, 0x0AC5}, { 0x0AC7, 0x0AC8}, { 0x0ACD, 0x0ACD}, { 0x0B01, 0x0B01}, { 0x0B3C, 0x0B3C}, { 0x0B3F, 0x0B3F}, { 0x0B41, 0x0B43}, { 0x0B4D, 0x0B4D}, { 0x0B56, 0x0B56}, { 0x0B82, 0x0B82}, { 0x0BC0, 0x0BC0}, { 0x0BCD, 0x0BCD}, { 0x0C3E, 0x0C40}, { 0x0C46, 0x0C48}, { 0x0C4A, 0x0C4D}, { 0x0C55, 0x0C56}, { 0x0CBF, 0x0CBF}, { 0x0CC6, 0x0CC6}, { 0x0CCC, 0x0CCD}, { 0x0D41, 0x0D43}, { 0x0D4D, 0x0D4D}, { 0x0DCA, 0x0DCA}, { 0x0DD2, 0x0DD4}, { 0x0DD6, 0x0DD6}, { 0x0E31, 0x0E31}, { 0x0E34, 0x0E3A}, { 0x0E47, 0x0E4E}, { 0x0EB1, 0x0EB1}, { 0x0EB4, 0x0EB9}, { 0x0EBB, 0x0EBC}, { 0x0EC8, 0x0ECD}, { 0x0F18, 0x0F19}, { 0x0F35, 0x0F35}, { 0x0F37, 0x0F37}, { 0x0F39, 0x0F39}, { 0x0F71, 0x0F7E}, { 0x0F80, 0x0F84}, { 0x0F86, 0x0F87}, { 0x0F90, 0x0F97}, { 0x0F99, 0x0FBC}, { 0x0FC6, 0x0FC6}, { 0x102D, 0x1030}, { 0x1032, 0x1032}, { 0x1036, 0x1037}, { 0x1039, 0x1039}, { 0x1058, 0x1059}, { 0x17B7, 0x17BD}, { 0x17C6, 0x17C6}, { 0x17C9, 0x17D3}, { 0x18A9, 0x18A9}, { 0x20D0, 0x20E3}, { 0x302A, 0x302F}, { 0x3099, 0x309A}, { 0xFB1E, 0xFB1E}, { 0xFE20, 0xFE23} }; int min = 0; int max = sizeof(combining) / sizeof(struct interval) - 1; int mid; /* test for 8-bit control characters */ if (ucs == 0) return 0; if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) return -1; /* first quick check for Latin-1 etc. characters */ if (ucs < combining[0].first) return 1; /* binary search in table of non-spacing characters */ while (max >= min) { mid = (min + max) / 2; if (combining[mid].last < ucs) min = mid + 1; else if (combining[mid].first > ucs) max = mid - 1; else if (combining[mid].first <= ucs && combining[mid].last >= ucs) return 0; } /* if we arrive here, ucs is not a combining or C0/C1 control character */ /* fast test for majority of non-wide scripts */ if (ucs < 0x1100) return 1; return 1 + ((ucs >= 0x1100 && ucs <= 0x115f) || /* Hangul Jamo */ (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a && ucs != 0x303f) || /* CJK ... Yi */ (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ (ucs >= 0xffe0 && ucs <= 0xffe6)); } int wcswidth(const wchar_t * pwcs, size_t n) { int w, width = 0; for (; *pwcs && n-- > 0; pwcs++) if ((w = wcwidth(*pwcs)) < 0) return -1; else width += w; return width; } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 414351f3280c58e1f68bd242a0ef1d98 Text-delta-base-sha1: a0e1c653e6c7d092c6cc1082be862653332a5c59 Text-content-length: 1195 Text-content-md5: 698c50624b42feea9f2931be2ff9f5b1 Text-content-sha1: d52c7501ce99f66c731a117db49163cf0432adf8 Content-length: 1236 K 15 cvs2svn:cvs-rev V 5 1.129 PROPS-END SVNZd9SdSe?&%Go!4KwbvWPyYGUD=&~`4iaCODEPAGESTATIC, IDC_CODEPAGEIDC_VTUNICODE128SetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage); CheckRadioButton(hwnd, IDC_VTXWINDOWS, IDC_VTUNICODEcfg.vtmode == VT_UNICODE ? IDC_VTUNICODE3"&Unicode mode", IDC_VTUNICODEmultiedit(&cp, "Line codepage:", IDC_CODEPAGESTATIC, IDC_CODEPAGE, 100, NULL128CODEPAGECODEPAGE, cfg.line_codepage, sizeof(cfg.line_codepage) - 1); if (HIWORD(wParam) == EN_KILLFOCUS) { int cp = decode_codepage(cfg.line_codepage); char buf[256]; if (cp < -1) { if (cp == -2) sprintf(buf, "Unable to identify character set '%s', " "translation disabled.", cfg.line_codepage); if (cp == -3) sprintf(buf, "Character set '%s' is a DBCS, " "translation is not available.", cfg.line_codepage); MessageBox(hwnd, buf, "PuTTY Error", MB_ICONERROR | MB_OK); } strcpy(cfg.line_codepage, cp_name(cp)); SetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage case IDC_VTUNICODEIsDlgButtonChecked(hwnd, IDC_VTUNICODE) ? VT_UNICODE Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7832446d94afea895cfcb93e9cae0c5f Text-delta-base-sha1: e3a82a71d1ed9d5a6eba7a2015e912e4285633dc Text-content-length: 14604 Text-content-md5: 54bbb904be8329436c5df1be21d9f6cc Text-content-sha1: 3c94182219a82997fd42f43d7d55c3c46e7b160c Content-length: 14645 K 15 cvs2svn:cvs-rev V 5 1.132 PROPS-END SVN?gCP@cl,[0;yU#_-LA@QG-^,[ WGMGP25c: M"@3BMR?nx*ra%]|`A\6Wzl pky6Okg omdRIa2}# .static void another_font(int); static void deinit_fonts(voidWIDE 0x04 #define FONT_HIGH 0x08 #define FONT_NARROW 0x10 #define FONT_OEM 0x20 #define FONT_OEMBOLD 0x21 #define FONT_OEMUND 0x22 #define FONT_OEMBOLDUND 0x23 #define FONT_MSGOTHIC 0x40 #define FONT_MINGLIU 0x60 #define FONT_GULIMCHE 0x80 #define FONT_MAXNO 0x8F #define FONT_SHIFT 5 static HFONT fonts[FONT_MAXNO]; static int fontflag[FONT_MAXNO]deinit_fonts(); initially. There may be as many as * three or as few as one. The other (poentially) twentyone fonts are done * if/when they are needed. * *CPINFO cpinfo; int fontsize[3]; int i; HDC hdc; int fw_dontcare, fw_bold; for (i = 0; i < FONT_MAXNOf(FONT_NORMAL, cfg.fontcharset, fw_dontcare, FALSE); SelectObject(hdc, fonts[FONT_NORMAL]); GetTextMetrics(hdc, &tm); font_height = tm.tmHeight; font_width = tm.tmAveCharWidth; { CHARSETINFO info; DWORD cset = tm.tmCharSet; memset(&info, 0xFF, sizeof(info)); /* !!! Yes the next line is right */ if (cset == OEM_CHARSET) font_codepage = GetOEMCP(); else if (TranslateCharsetInfo ((DWORD *) cset, &info, TCI_SRCCHARSET)) font_codepage = info.ciACP; else font_codepage = -1; GetCPInfo(font_codepage, &cpinfo); dbcs_screenfont = (cpinfo.MaxCharSize > 1); } f(FONT_UNDERLINE, cfg.fontcharset, fw_dontcare, TRUE); /* * Some fonts, e.g. 9-pt Courier, draw their underlines * outside their character cell. We successfully prevent * screen corruption by clipping the text output, but then * we lose the underline completely. Here we try to work * out whether this is such a font, and if it is, we set a * flag that causes underlines to be drawn by hand. * * Having tried other more sophisticated approaches (such * as examining the TEXTMETRIC structure or requesting the * height of a string), I think we'll do this the brute * force way: we create a small bitmap, draw an underlined * space on it, and test to see whether any pixels are * foreground-coloured. (Since we expect the underline to * go all the way across the character cell, we only search * down a single column of the bitmap, half way across.) */ { HDC und_dc; HBITMAP und_bm, und_oldbm; int i, gotit; COLORREF c; und_dc = CreateCompatibleDC(hdc); und_bm = CreateCompatibleBitmap(hdc, font_width, font_height); und_oldbm = SelectObject(und_dc, und_bm); SelectObject(und_dc, fonts[FONT_UNDERLINE]); SetTextAlign(und_dc, TA_TOP | TA_LEFT | TA_NOUPDATECP); SetTextColor(und_dc, RGB(255, 255, 255)); SetBkColor(und_dc, RGB(0, 0, 0)); SetBkMode(und_dc, OPAQUE); ExtTextOut(und_dc, 0, 0, ETO_OPAQUE, NULL, " ", 1, NULL); gotit = FALSE; for (i = 0; i < font_height; i++) { c = GetPixel(und_dc, font_width / 2, i); if (c != RGB(0, 0, 0)) gotit = TRUE; } SelectObject(und_dc, und_oldbm); DeleteObject(und_bm); DeleteDC(und_dc); if (!gotit) { und_mode = UND_LINE; DeleteObject(fonts[FONT_UNDERLINE]); fonts[FONT_UNDERLINE] = 0; } } if (bold_mode == BOLD_FONT) { f(FONT_BOLD, cfg.fontcharset, fw_bold, FALSE); } #undef f descent = tm.tmAscent + 1; if (descent >= font_height) descent = font_height - 1; for (i = 0; i < 3ontsize[i] = tm.tmAveCharWidth + 256 * tm.tmHeight; else fontsize[i] = -i; } else fontsize[i] = -i; } ReleaseDC(hwnd, hdc); if (fontsize[FONT_UNDERLINE] != fontsize[FONT_NORMAL]fonts[FONT_UNDERLINE] = 0; } if (bold_mode == BOLD_FONT && fontsize[FONT_BOLD] != fontsize[FONT_NORMAL]) { bold_mode = BOLD_SHADOW; DeleteObject(fonts[FONT_BOLD]); fonts[FONT_BOLD] = 0; } fontflag[0] = fontflag[1] = fontflag[2] = 1; init_ucs_tables(); } static void another_font(int fontno) { int basefont; int fw_dontcare, fw_bold; int c, u, w, x; char *s; if (fontno < 0 || fontno >= FONT_MAXNO || fontflag[fontno]) return; basefont = (fontno & ~(FONT_BOLDUND)); if (basefont != fontno && !fontflag[basefont]) another_font(basefont)c = cfg.fontcharset; w = fw_dontcare; u = FALSE; s = cfg.font; x = font_width; if (fontno & FONT_WIDE) x *= 2; if (fontno & FONT_NARROW) x /= 2; if (fontno & FONT_OEM) c = OEM_CHARSET; if (fontno & FONT_BOLD) w = fw_bold; if (fontno & FONT_UNDERLINE) u = TRUE; fonts[fontno] = CreateFont(font_height * (1 + !!(fontno & FONT_HIGH)), x, 0, 0, w, FALSE, u, FALSE, c, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_DONTCARE, s); fontflag[fontno] = 1; } static void deinit_fonts(void) { int i; for (i = 0; i < FONT_MAXNO; i++) { if (fonts[i]) DeleteObject(fonts[i]); fonts[i] = 0; fontflag[i] = 0; } if (refont && w != cols && (cols == 80 || cols == 132))deinit_fonts();deinit_fonts();NPUTLANGCHANGE: { /* wParam == Font number */ /* lParam == Locale */ char lbuf[20]; HKL NewInputLocale = (HKL) lParam; // lParam == GetKeyboardLayout(0); GetLocaleInfo(LOWORD(NewInputLocale), LOCALE_IDEFAULTANSICODEPAGE, lbuf, sizeof(lbuf)); kbd_codepage = atoi(lbuf); } break; case WM_IME_CHAR: if (wParam & 0xFF00) { unsigned char buf[2]; buf[1] = wParam; buf[0] = wParam >> 8; lpage_send(kbd_codepage, buf, 2); } else { char c = (unsigned char) wParam; lpage_send(kbd_codepage, &c, 1); } return (0);(unsigned char)wParam; lpage_send(CP_ACP, int char_width = fnt_width; int text_adjust = 0; static int *IpDx = 0, IpDxLEN = 0; if (attr & ATTR_WIDE) char_width *= 2; if (len > IpDxLEN || IpDx[0] != charchar_width; } x *= fnt_width; y *= font_height; if ((attr & TATTR_ACTCURS) && (cfg.cursor_type == 0 || big_cursor)) { attr &= ATTR_CUR_AND | (bold_mode != BOLD_COLOURS ? ATTR_BOLD : 0); attr ^= ATTR_CUR_XOR; } nfont = 0; if (cfg.vtmode == VT_POORMAN && lattr != LATTR_NORM) { /* Assume a poorman font is borken in other ways too. */ lattr = LATTR_WIDE; } else switch (lattr) { case LATTR_NORM: break; case LATTR_WIDE: nfont |= FONT_WIDE; break; default: nfont |= FONT_WIDE + FONT_HIGH; break; } /* Special hack for the VT100 linedraw glyphs. */ if ((attr & CSET_MASK) == 0x2300) { if (!dbcs_screenfont && text[0] >= (char) 0xBA && text[0] <= (char) 0xBD) { switch ((unsigned char) (text[0])) { case 0xBA: text_adjust = -2 * font_height / 5; break; case 0xBB: text_adjust = -1 * font_height / 5; break; case 0xBC: text_adjust = font_height / 5; break; case 0xBD: text_adjust = 2 * font_height / 5; break; } if (lattr == LATTR_TOP || lattr == LATTR_BOT) text_adjust *= 2; attr &= ~CSET_MASK; text[0] = (char) (unitab_xterm['q'] & CHAR_MASK); attr |= (unitab_xterm['q'] & CSET_MASK); if (attr & ATTR_UNDER) { attr &= ~ATTR_UNDER; force_manual_underline = 1; } } } /* Anything left as an original character set is unprintable. */ if (DIRECT_CHAR(attr)) { attr &= ~CSET_MASK; attr |= 0xFF00; memset(text, 0xFF, len); } /* OEM CP */ if ((attr & CSET_MASK) == ATTR_OEMCP) nfont |= FONT_OEM;another_font(nfont)another_font(nfont); if (!fonts[nfont]) nfont = FONT_NORMALchar_width * len; line_box.bottom = y + font_height; /* We're using a private area for direct to font. (512 chars.) */ if (dbcs_screenfont && (attr & CSET_MASK) == ATTR_ACP) { /* Ho Hum, dbcs fonts are a PITA! */ /* To display on W9x I have to convert to UCS */ static wchar_t *uni_buf = 0; static int uni_len = 0; int nlen; if (len > uni_len) { sfree(uni_buf); uni_buf = smalloc((uni_len = len) * sizeof(wchar_t)); } nlen = MultiByteToWideChar(font_codepage, MB_USEGLYPHCHARS, text, len, uni_buf, uni_len); if (nlen <= 0) return; /* Eeek! */ ExtTextOutW(hdc, x, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED | ETO_OPAQUE, &line_box, uni_buf, nlen, 0); if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) { SetBkMode(hdc, TRANSPARENT); ExtTextOutW(hdc, x - 1, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED, &line_box, uni_buf, nlen, 0); } } else if (DIRECT_FONT(attr)) { ExtTextOut(hdc, x, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED | ETO_OPAQUE, &line_box, text, len, IpDx); if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) { SetBkMode(hdc, TRANSPARENT); /* GRR: This draws the character outside it's box and can leave * 'droppings' even with the clip box! I suppose I could loop it * one character at a time ... yuk. * * Or ... I could do a test print with "W", and use +1 or -1 for this * shift depending on if the leftmost column is blank... */ ExtTextOut(hdc, x - 1, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED, &line_box, text, len, IpDx); } } else { /* And 'normal' unicode characters */ static WCHAR *wbuf = NULL; static int wlen = 0; int i; if (wlen < len) { sfree(wbuf); wlen = len; wbuf = smalloc(wlen * sizeof(WCHAR)); } for (i = 0; i < len; i++) wbuf[i] = (WCHAR) ((attr & CSET_MASK) + (text[i] & CHAR_MASK)); ExtTextOutW(hdc, x, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED | ETO_OPAQUE, &line_box, wbuf, len, IpDx); /* And the shadow bold hack. */ if (bold_mode == BOLD_SHADOW) { SetBkMode(hdc, TRANSPARENT); ExtTextOutW(hdc, x - 1, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED, &line_box, wbuf, len, IpDx); } } if (lattr != LATTR_TOP && (force_manual_underline || (und_mode == UND_LINE && (attr & ATTR_UNDER)))) { HPEN oldpen; int dec = descent; if (lattr == LATTR_BOT) dec = dec * 2 - font_height; c, NULL); LineTo(hdc, x + len * char_width, y + dec); oldpen = SelectObject(hdc, oldpen); DeleteObject(oldpen); } } void do_cursor(Context ctx, int x, int y, char *text, int len, unsigned long attr, int lattr) { int fnt_width; int char_width; HDC hdc = ctx; int ctype = cfg.cursor_type; if ((attr & TATTR_ACTCURS) && (ctype == 0 || big_cursor)) { if (((attr & CSET_MASK) | (unsigned char) *text) != UCSWIDE) { do_text(ctx, x, y, text, len, attr, lattr); return; } ctype = 2; attr |= TATTR_RIGHTCURS; } fnt_width = char_width = font_width * (1 + (lattr != LATTR_NORM)); if (attr & ATTR_WIDE) char_width *= 2; x *= fnt_width; y *= font_height; if ((attr & TATTR_PASCURS) && (ctype == 0 || big_cursor)) { POINT pts[5]; HPEN oldpen; pts[0].x = pts[1].x = pts[4].x = x; pts[2].x = pts[3].x = x + char else if ((attr & (TATTR_ACTCURS | TATTR_PASCURS)) && ctype != 0) { int startx, starty, dx, dy, length, i; if (cchar_width; } else { int xadjust = 0; if (attr & TATTR_RIGHTCURS) xadjust = charT static int alt_sum#define SHOW_TOASCII_RESULT if (left_alt && wParam >= VK_NUMPAD0 && wParam <= VK_NUMPAD9) alt_sum = alt_sum * 10 + wParam - VK_NUMPAD0; else alt_sum = 0;r = ToAsciiEx(wParam, scan, keystate, keys, 0, kbd_layout); #ifdef SHOW_TOASCII_RESULT if (r == 1 && !key_down) { if (alt_sum) { if (utf || dbcs_screenfont) debug((", (U+%04x)", alt_sum)); else debug((", LCH(%d)", alt_sum)); } else { debug((", ACH(%d)", keys[0])); } } else if (r > 0) { int r1; debug((", ASC(")); for (r1 = 0; r1 < r; r1++) { debug(("%s%d", r1 ? "," : "", keys[r1])); } debug((")")); } #endif if (r > 0) { WCHAR keybuf;keybuf = nc; luni_send(&keybuf, 1); continue; } compose_state = 0; if (!key_down) { if (alt_sum) { if (utf || dbcs_screenfont) { keybuf = alt_sum; luni_send(&keybuf, 1); } else { ch = (char) alt_sum; ldisc_send(&ch, 1); } alt_sum = 0; } else lpage_send(kbd_codepage, &ch, 1); } else { static char cbuf[] = "\033 "; cbuf[1] = ch; lpage_send(kbd_codepage, cbuf + !left_alt, 1 + !!left_alt /* If we will be using alt_sum fix the 256s */ else if (keys[0] && (utf || dbcs_screenfont)) keys[0] = 1aclip(char/* * Note: unlike write_aclip() this will not append a nul. */ void write_clip(wchar_t * data, int len, int must_deselect) { HGLOBAL clipdata; HGLOBAL clipdata2; int len2; void *lock, *lock2; len2 = WideCharToMultiByte(CP_ACP, 0, data, len, 0, 0, NULL, NULL); clipdata = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, len * sizeof(wchar_t)); clipdata2 = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, len2); if (!clipdata || !clipdata2) { if (clipdata) GlobalFree(clipdata); if (clipdata2) GlobalFree(clipdata2); return; } if (!(lock = GlobalLock(clipdata))) return; if (!(lock2 = GlobalLock(clipdata2))) return; memcpy(lock, data, len * sizeof(wchar_t)); WideCharToMultiByte(CP_ACP, 0, data, len, lock2, len2, NULL, NULL); GlobalUnlock(clipdata); GlobalUnlock(clipdata2UNICODETEXT, clipdata); SetClipboardData(CF_TEXT, clipdata2); CloseClipboard(); } else { GlobalFree(clipdata); GlobalFree(clipdata2); } if (!must_deselect) SendMessage(hwnd, WM_IGNORE_CLIP, FALSE, 0); } void get_clip(wchar_t ** p, int *len) { static HGLOBAL clipdata = NULL; static wchar_t *converted = 0; wchar_t *p2; if (converted) { sfree(converted); converted = 0; }if (OpenClipboard(NULL)) { if (clipdata = GetClipboardData(CF_UNICODETEXT)) { CloseClipboard(); *p = GlobalLock(clipdata); if (*p) { for (p2 = *p; *p2; p2++); *len = p2 - *p; return; } } else if (clipdata = GetClipboardData(CF_TEXT)) { char *s; int i; CloseClipboard(); s = GlobalLock(clipdata); i = MultiByteToWideChar(CP_ACP, 0, s, strlen(s) + 1, 0, 0); *p = converted = smalloc(i * sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, 0, s, strlen(s) + 1, converted, i); *len = i - 1; return; } else CloseClipboard(); } *p = NULL; *len = 0; } #if 0#endif Node-path: putty/xlat.c Node-action: delete Revision-number: 1111 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2001-05-10T10:31:44.000000Z K 7 svn:log V 101 A patch to the new character set stuff to add the Windows code pages themselves (Win1250 - Win1258). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ed5d7406cf3aaf327d5d713078e35c75 Text-delta-base-sha1: 96c4fc2e4e2e068a2f9d363e5602bf4e806a2783 Text-content-length: 742 Text-content-md5: 9376420e2edc8545323aee230bd59e50 Text-content-sha1: e292e49ca4dc8097703839b6fa95c8119db54a1f Content-length: 781 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN+o@(u"n=tolower(*s++) != tolower(*d++) {"Win1250 (Central European)", 1250}, {"Win1251 (Cyrillic)", 1251}, {"Win1252 (Western)", 1252}, {"Win1253 (Greek)", 1253}, {"Win1254 (Turkish)", 1254}, {"Win1255 (Hebrew)", 1255}, {"Win1256 (Arabic)", 1256}, {"Win1257 (Baltic)", 1257}, {"Win1258 (Vietnamese)", 1258}, /* All below here are aliases - First the windows ones. */ {"Central European (Win1250)", 1250}, {"Cyrillic (Win1251)", 1251}, {"Western (Win1252)", 1252}, {"Greek (Win1253)", 1253}, {"Turkish (Win1254)", 1254}, {"Hebrew (Win1255)", 1255}, {"Arabic (Win1256)", 1256}, {"Baltic (Win1257)", 1257}, {"Vietnamese (Win1258)", 1258}, Revision-number: 1112 Prop-content-length: 286 Content-length: 286 K 7 svn:log V 185 Added a new large icon for the PuTTY config box. Doesn't show up in the actual window at all, but appears in the Alt-Tab task switcher box in place of the tedious Windows Default icon. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-13T10:45:56.000000Z PROPS-END Node-path: putty/puttycfg.ico Node-kind: file Node-action: add Prop-content-length: 88 Text-delta: true Text-content-length: 3332 Text-content-md5: 7595dddf6c3bef49e18ba68cddce4437 Text-content-sha1: ebf8073296accd6f1057063131ba8f4ff2289843 Content-length: 3420 K 15 cvs2svn:cvs-rev V 3 1.1 K 13 svn:mime-type V 24 application/octet-stream PROPS-END SVNvvv 6  0 ( @wwwwwwwx0pp;w3w;w3wwwwww;p3̇p;̇p3 ̇p; p3 ;3 ;3wwww;xw3wp; p3p; wwwwpp03w3;3; w; w; w  w w ww;w?0 ?   >( @ʦ @ ` @@ @@@`@@@@`` `@`````` @` @` @` @`@@ @@@`@@@@@ @ @ @@ `@ @ @ @ @@@@ @@@@@`@@@@@@@@@`@` @`@@``@`@`@`@`@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@ @` @ ` @@ @@@`@@@@`` `@`````` @` @` @` @` @` @ ` @@ @@@`@@@@`` `@`````` @` @` @`?0 ?   >( @@@>|@!@ >| /{>}߀?`?03a@?0 ?   > Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d55dc5d7d73fa2d8175914a86c774418 Text-delta-base-sha1: 44032a6d31897c05944882f3d62d42624aa56121 Text-content-length: 47 Text-content-md5: 3af577c85855f2146770d6e0799c1c25 Text-content-sha1: 6ac5c4a9a2488612b1e7e8d4c4d1e4223c32dcd3 Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNN4M#define IDI_CFGICON 201 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3f94d98ed0c89818c1364bd376f454cd Text-delta-base-sha1: d15b36e6f30f868cbc35b7780d2a54c67b2d4f88 Text-content-length: 47 Text-content-md5: d7560ac187c4a05c2c4b8fe9abd37916 Text-content-sha1: 68c60a26835f33221a3e37a85825b82b54d88968 Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNd ` YIDI_CFGICON ICON "puttycfg Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 698c50624b42feea9f2931be2ff9f5b1 Text-delta-base-sha1: d52c7501ce99f66c731a117db49163cf0432adf8 Text-content-length: 136 Text-content-md5: cfc21496344122e888e3c47d5646a9aa Text-content-sha1: dbc581f9f3b189a1d808def0b423af8edeca07e8 Content-length: 177 K 15 cvs2svn:cvs-rev V 5 1.130 PROPS-END SVNZKmm^|SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(IDI_CFGICON)) Revision-number: 1113 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2001-05-13T10:58:51.000000Z K 7 svn:log V 54 Fix the SCO function keys, which weren't quite right. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 54bbb904be8329436c5df1be21d9f6cc Text-delta-base-sha1: 3c94182219a82997fd42f43d7d55c3c46e7b160c Text-content-length: 759 Text-content-md5: 5b99ab9d5172e9be0f28f626e322dc27 Text-content-sha1: dd3b2f3a70acadf95e6d533b1062ccc69fdafc2a Content-length: 800 K 15 cvs2svn:cvs-rev V 5 1.133 PROPS-END SVN,[o[b-34) { char codes[] = "MNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@[\\]^_`{"; int index = 0; switch (wParam) { case VK_F1: index = 0; break; case VK_F2: index = 1; break; case VK_F3: index = 2; break; case VK_F4: index = 3; break; case VK_F5: index = 4; break; case VK_F6: index = 5; break; case VK_F7: index = 6; break; case VK_F8: index = 7; break; case VK_F9: index = 8; break; case VK_F10: index = 9; break; case VK_F11: index = 10; break; case VK_F12: index = 11; break; } if (keystate[VK_SHIFT] & 0x80) index += 12; if (keystate[VK_CONTROL] & 0x80) index += 24; p += sprintf((char *) p, "\x1B[%c", codes[index] Revision-number: 1114 Prop-content-length: 220 Content-length: 220 K 8 svn:date V 27 2001-05-13T11:15:16.000000Z K 7 svn:log V 119 Attempt to report the error condition right when an SCP connection with a pre-supplied password fails to authenticate. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 50a490ac4ad2d24875dcaeed83b3772c Text-delta-base-sha1: 5868f73f676a4e7a7cedad4b037ceb560da33195 Text-content-length: 115 Text-content-md5: aaa123b51373d26c1d2f82f5dd2bdc27 Text-content-sha1: 47404c0424229586211134e8446cddcc83a18368 Content-length: 155 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNE:,\{Pa7"Ka7jmssa7)HBlist = 0; errs++; errs++; errs++; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b3a5b165f360e91a89aa19b477441bd1 Text-delta-base-sha1: 91ffa299011b3e78616767d4012bf2d4a7c22b63 Text-content-length: 824 Text-content-md5: f0f0fedcc752f627888dbe29905f6efb Text-content-sha1: e1db0e8234ea041e5c7df30e003b2bb7a3fbb484 Content-length: 865 K 15 cvs2svn:cvs-rev V 5 1.143 PROPS-END SVN!]>D_send_packet(SSH1_MSG_DISCONNECT, PKT_STR, "No more passwords available to try", PKT_END); connection_fatal("Unable to authenticatessh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring ("No more passwords available to try"); ssh2_pkt_addstring("en"); /* language tag */ ssh2_pkt_send(); connection_fatal("Unable to authenticate+]]+ at all because we gain * nothing by it. */ if (cscipher) { int stringlen, i; stringlen = (256 - deferred_len); stringlen += cscipher->blksize - 1; stringlen -= (stringlen % cscipher->blksize); if (cscomp) { /* * Temporarily disable actual compression, * so we can guarantee to get this string * Revision-number: 1115 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2001-05-13T11:19:20.000000Z K 7 svn:log V 66 Define WM_MOUSEWHEEL (to 0x20A) if it's not defined by windows.h. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5b99ab9d5172e9be0f28f626e322dc27 Text-delta-base-sha1: dd3b2f3a70acadf95e6d533b1062ccc69fdafc2a Text-content-length: 145 Text-content-md5: a5181e0d717160d24ffaf988f05bc297 Text-content-sha1: f9f844ceb0e5b97bf037c2f5a6ed196723787d2e Content-length: 186 K 15 cvs2svn:cvs-rev V 5 1.134 PROPS-END SVN,- xJxkA/* Needed for mouse wheel support and not defined in earlier SDKs. */ #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 0x020A Revision-number: 1116 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2001-05-13T11:44:57.000000Z K 7 svn:log V 140 Control characters are now allowed as part of the password, if they're not special control characters processed by the line input routines. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f0f0fedcc752f627888dbe29905f6efb Text-delta-base-sha1: e1db0e8234ea041e5c7df30e003b2bb7a3fbb484 Text-content-length: 273 Text-content-md5: 0618ea2bd03d2d3ce3fefd3bb4413eb7 Text-content-sha1: 556c028950dc3f8bbc5b67fd4bc0a18511cafb91 Content-length: 314 K 15 cvs2svn:cvs-rev V 5 1.144 PROPS-END SVN)J Ruhb-u uZ && pos < sizeof(username)-1pos < sizeof(password)-1 && pos < sizeof(username)-1pos < sizeof(password)-1 at all because we gain * nothing by it. */ if (cscipher) { int stringlen, i..Z Revision-number: 1117 Prop-content-length: 149 Content-length: 149 K 7 svn:log V 49 Borland and Cygwin makefiles now support XFLAGS. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-13T11:46:00.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f838f03f651c23f005016177b7394552 Text-delta-base-sha1: f241b6f729a965dae72ddb4ef7e328587300cb5f Text-content-length: 61 Text-content-md5: bb2926f55cc0861143f6ca5adce71802 Text-content-sha1: 32c373248ba08649d4278772ed53a54d63b94f81 Content-length: 101 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN>"n )tCOMPAT) \$(FWHACK) \$(XFLAGSXFLAGS Revision-number: 1118 Prop-content-length: 267 Content-length: 267 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-13T11:58:36.000000Z K 7 svn:log V 166 Jacob's patch to make pressing Return on a selected saved session load it and go, and simultaneously allow Alt-L on a selected saved session not to change the focus. PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cfc21496344122e888e3c47d5646a9aa Text-delta-base-sha1: dbc581f9f3b189a1d808def0b423af8edeca07e8 Text-content-length: 2536 Text-content-md5: 588023b1bf50e3cc93077fb3e3711176 Text-content-sha1: 4582f53a1dd8a9430711b191f66695cf91bd6b66 Content-length: 2577 K 15 cvs2svn:cvs-rev V 5 1.131 PROPS-END SVNKFRKIfKr!=9l[7@U X^7@7rJ' ?U>=>H HH! +static int sesslist_has_focus/* 2nd arg: NZ => don't redraw session list (use when loading * a new session) */ static void init_dlg_ctrls(HWND hwnd, int keepsessif (!keepsess) * Helper function to load the session selected in SESSLIST * if any, as this is done in more than one place in * GenericMainDlgProc(). 0 => failure. */ static int load_selected_session(HWND hwnd) { int n = SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_GETCURSEL, 0, 0); int isdef; if (n == LB_ERR) { MessageBeep(0); return 0; } isdef = !strcmp(sessions[n], "Default Settings"); load_settings(sessions[n], !isdef, &cfg); init_dlg_ctrls(hwnd, TRUE); if (!isdef) SetDlgItemText(hwnd, IDC_SESSEDIT, sessions[n]); else SetDlgItemText(hwnd, IDC_SESSEDIT, ""); /* Restore the selection, which will have been clobbered by * SESSEDIT handling. */ SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL, n, 0); return 1;, FALSE/* Behaviour of the "Open" button is different if the * session list has focus, *unless* the user just * double-clicked... */ if (sesslist_has_focus && !readytogo) { if (!load_selected_session(hwnd)) { MessageBeep(0); return 0; } } /* If at this point we have a valid session, go! */WM_SETREDRAW, FALSE, 0 SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW, TRUE, 0); InvalidateRect(GetDlgItem(hwnd, IDC_SESSLIST), NULL, TRUE); } break; case IDC_SESSLIST: case IDC_SESSLOAD: if (LOWORD(wParam) == IDC_SESSLIST) { if (HIWORD(wParam) == LBN_SETFOCUS) sesslist_has_focus = 1; else if (HIWORD(wParam) == LBN_KILLFOCUS) sesslist_has_focus = 0; }/* Load the session selected in SESSLIST. */ if (load_selected_session(hwnd) && WM_SETREDRAW, FALSE, 0 SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW, TRUE, 0); InvalidateRect(GetDlgItem(hwnd, IDC_SESSLIST), NULL, TRUESendDlgItemMessage(hwnd, IDC_COLOURLIST, WM_SETREDRAW, FALSE, 0 SendDlgItemMessage(hwnd, IDC_COLOURLIST, WM_SETREDRAW, TRUE, 0); InvalidateRect(GetDlgItem(hwnd, IDC_COLOURLIST), NULL, TRUE); } break; case IDC_PALETTE SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_GETCURSEL, SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_GETCURSEL, Revision-number: 1119 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2001-05-13T13:11:53.000000Z K 7 svn:log V 38 Oops - initialise sesslist_has_focus. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 588023b1bf50e3cc93077fb3e3711176 Text-delta-base-sha1: 4582f53a1dd8a9430711b191f66695cf91bd6b66 Text-content-length: 48 Text-content-md5: cab669a845d88b3b33e0780b4b6be3bf Text-content-sha1: 96ff1b69ebcae28d79da1147804339ad6695356b Content-length: 89 K 15 cvs2svn:cvs-rev V 5 1.132 PROPS-END SVNF_ \mYsesslist_has_focus = 0 Revision-number: 1120 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 56 Trim leading whitespace off the hostname if it's there. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-13T13:23:12.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a5181e0d717160d24ffaf988f05bc297 Text-delta-base-sha1: f9f844ceb0e5b97bf037c2f5a6ed196723787d2e Text-content-length: 203 Text-content-md5: 716158b7343a78c78463873f79f5e79d Text-content-sha1: 26c6faea4965cbd2af7e3a1c982a8f00dcb3eb6d Content-length: 244 K 15 cvs2svn:cvs-rev V 5 1.135 PROPS-END SVN-e 00 * Trim leading whitespace off the hostname if it's there. */ { int space = strspn(cfg.host, " \t"); memmove(cfg.host, cfg.host+space, 1+strlen(cfg.host)-space); Revision-number: 1121 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2001-05-13T14:02:28.000000Z K 7 svn:log V 32 Placate gcc's `-Wall' warnings. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8131cbed1291ea7994cb6a7a774a204a Text-delta-base-sha1: e8ee2f986a7ff083dd7a7ed2d8fb3932e89f27b6 Text-content-length: 399 Text-content-md5: 2785228baf2e8ac06f28079524512a65 Text-content-sha1: 2f4c57672e1fd6bdc08d0849d46b367be1b469d2 Content-length: 439 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNPE<f-yF0bGE bYm;b< = NULL; struct ssh2_userkey *skey = NULLvoid *vvresponse, &resplen); response = vresponsevoid *vvresponse, &resplen); response = vresponse; #ifndef NO_SECURITY HANDLE proc; PSID mapowner, procowner; PSECURITY_DESCRIPTOR psd1 = NULL, psd2 = NULL; #endif#ifndef NO_SECURITY int rc;(int) Node-path: putty/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 397ac7d15c3c351841af209c9f8a6231 Text-delta-base-sha1: 210e860fdbd0e2c506760e3f3d37b03aa87c8c34 Text-content-length: 31 Text-content-md5: d135064cd206ec2e8617e89f626add1b Text-content-sha1: 166d399840844e335d407a70ed198b6734061cb0 Content-length: 70 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNHR B(unsigned) Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 938c41ec328fac93d4077de0d3b8d594 Text-delta-base-sha1: 1c286a1b4def62184051ab2b4bb22ab72ca83997 Text-content-length: 222 Text-content-md5: b90c1cc8e7610d556a8607ab56465940 Text-content-sha1: 8f2c4eab7d7dfdb300380c43e72a6815c9ef96fa Content-length: 262 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN$f<(5."TP default: /* * Shouldn't happen, but having a default clause placates * gcc -Wall, which would otherwise complain that * `position' might be used uninitialised. */ return = NULL Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c0173f86d2661c5695cc13090944384a Text-delta-base-sha1: 36f7c630d2709cf8a089064677caf14725e24b3f Text-content-length: 20 Text-content-md5: e505dddd867c7665728576d3955003fc Text-content-sha1: a660c36c488be4e71cdb2fd1b628e4f7d24e0a88 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN0 WY= Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6aa1acdd4cd2a8a62868fb6cfba4ddcb Text-delta-base-sha1: 0d2a3c4f6b1e84cdb33403eb118bcd84dc0684a6 Text-content-length: 20 Text-content-md5: b5f501d793e82832c790321b61ef392c Text-content-sha1: 665d9d8ce7483e015196e48fcbd19354a45acfca Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNr mS Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aaa123b51373d26c1d2f82f5dd2bdc27 Text-delta-base-sha1: 47404c0424229586211134e8446cddcc83a18368 Text-content-length: 362 Text-content-md5: 5adbf15c7adb2d72889f26f9d60e9c90 Text-content-sha1: ddfbe04eb0288cb14ea818f4af68a5f5deecad7c Content-length: 402 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNfBi[GbO{?Qstat_bytes = 0; stat_starttime = time(NULL); stat_lasttime = 0;stat_bytes = 0; stat_starttime = time(NULL); stat_lasttime = 0; if ((stat_name = strrchr(namebuf, '/')) == NULL) stat_name = namebuf; else stat_name++; if (strrchr(stat_name, '\\') != NULL) stat_name = strrchr(stat_name, '\\') + 1; Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b0d4f75d63903af878af39877fd415f Text-delta-base-sha1: 12805dca140224b3c73b2cb6de58e89bc4336133 Text-content-length: 143 Text-content-md5: a049db8c4674ebc15a1eb1c471e1e9c3 Text-content-sha1: ee133bb65085189669714d24ba7c624a6b017904 Content-length: 183 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNK ww2/* pedantic compiler tells me I can't use &cfg->beep as an int * :-) */ gppi(sesskey, "Beep", 1, &i); cfg->beep = i Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0618ea2bd03d2d3ce3fefd3bb4413eb7 Text-delta-base-sha1: 556c028950dc3f8bbc5b67fd4bc0a18511cafb91 Text-content-length: 216 Text-content-md5: f3e3b4cbb3acbc7de0fd59beafc871c3 Text-content-sha1: ff88e3f5af8cd6eeefde3f7b79178f8116a8887a Content-length: 257 K 15 cvs2svn:cvs-rev V 5 1.145 PROPS-END SVN=t.2Zv< S ) ./Hint; static int len; staticstaticvoid *vvret, &retlen); ret = vret void *vvret, &retlen); ret = vret.7 .inglen, i Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9e55c10632a444a09d2f01480606e08e Text-delta-base-sha1: 0f9f96f0bb5c92eccc677a4038d12691cc03c7ab Text-content-length: 29 Text-content-md5: 353694165d6787bf1f5529ac4dfc2ccd Text-content-sha1: 77b15003ec47f3216e2d06d9667f18cb117322f5 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNA)6R`ab = Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b459256a046e044dc366a082a1815f3f Text-delta-base-sha1: b1c61f8b3e38d4c4dccfa9dea4a7c9e45454e149 Text-content-length: 138 Text-content-md5: 7b40ee34d442f858bda32de32817b070 Text-content-sha1: d7a6dbc42271b38f38ce22f4843ced740d368168 Content-length: 177 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN%q`{ Zsx:kdeferchr = '\0'1) { assert(j - i >= 2);1) { assert(j - i >= 2); else in_block = TRUE; Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5090319fc5b1cba30e1dfa0066ec9a66 Text-delta-base-sha1: 172b6056eecfc10735022cb7b4b65121728c27f4 Text-content-length: 403 Text-content-md5: a6dab97cf535f88f270e71d1b2243586 Text-content-sha1: d3d1e39fefdd0c768bfbc4bc516c8aa69c5b268b Content-length: 443 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVN%|2SEj`beep_indi(sesskey, "BeepInd", 0, &i); cfg->beep_ind Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a6dab97cf535f88f270e71d1b2243586 Text-delta-base-sha1: d3d1e39fefdd0c768bfbc4bc516c8aa69c5b268b Text-content-length: 112 Text-content-md5: 950dbb815f1115dfc944655de8c27e01 Text-content-sha1: 9884be8dde9c23d41c0f61d6e7ae599dee75c697 Content-length: 152 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVN|QUCU9C!cfg.bellovl || !beep_overloaded) { beep(cfg.beep); if (cfg.beep == BELL_VISUAL Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 47d9bff885658c7ddff1c64ef4d0e3b3 Text-delta-base-sha1: 535d690453d3d02efee030358387f8aab6229e9b Text-content-length: 901 Text-content-md5: 3613d8c061d29dff6b8686ab0465e108 Text-content-sha1: 006db57cde28266691f0ab3a61c463174bb4c835 Content-length: 942 K 15 cvs2svn:cvs-rev V 5 1.134 PROPS-END SVNj-:=.N#0^?5fHQ@mY_IND_STATIC, IDC_B_IND_DISABLED, IDC_B_IND_FLASH, IDC_B_IND_STEADYCheckRadioButton(hwnd, IDC_B_IND_DISABLED, IDC_B_IND_STEADY, cfg.beep_ind == B_IND_DISABLED ? IDC_B_IND_DISABLED : cfg.beep_ind == B_IND_FLASH ? IDC_B_IND_FLASH : cfg.beep_ind == B_IND_STEADY ? IDC_B_IND_STEADY : IDC_B_IND_DISABLEDitradioline(&cp, "Taskbar/caption &indication on bell:", IDC_B_IND_STATIC, 3, "Disabled", IDC_B_IND_DISABLED, "Flashing", IDC_B_IND_FLASH, "Steady", IDC_B_IND_STEADY, NULL_IND_DISABLED: case IDC_B_IND_FLASH: case IDC_B_IND_STEADY { if (LOWORD(wParam) == IDC_B_IND_DISABLED) cfg.beep_ind = B_IND_DISABLED; if (LOWORD(wParam) == IDC_B_IND_FLASH) cfg.beep_ind = B_IND_FLASH; if (LOWORD(wParam) == IDC_B_IND_STEADY) cfg.beep_ind = B_IND_STEADY Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5780548ded9c41b19c4f92c45affef7e Text-delta-base-sha1: b368aa37041e4bae9a0263a50557a390e355fee2 Text-content-length: 1065 Text-content-md5: f3684a9cd8c90dc3e058af4f1e14c7fa Text-content-sha1: 40117b7995286265f0e0e5e60fb291ec7c610ee9 Content-length: 1106 K 15 cvs2svn:cvs-rev V 5 1.137 PROPS-END SVNYS-nF C9Mbhuvastatic void flash_window(int mode flash_window(1); /* maintain */ 5flash_window(0); /* stop */Manage window caption / taskbar flashing, if enabled. * 0 = stop, 1 = maintain, 2 = start */ static void flash_window(int mode) { static long last_flash = 0; static int flashing = 0; if ((mode == 0) || (cfg.beep_ind == B_IND_DISABLED)) { /* stop */ if (flashing) { FlashWindow(hwnd, FALSE); flashing = 0; } } else if (mode == 2) { /* start */ if (!flashing) { last_flash = GetTickCount(); flashing = 1; FlashWindow(hwnd, TRUE); } } else if ((mode == 1) && (cfg.beep_ind == B_IND_FLASH)) { /* maintain */ if (flashing) { long now = GetTickCount(); long fdiff = now - last_flash; if (fdiff < 0 || fdiff > 450) { last_flash = now; FlashWindow(hwnd, TRUE); /* toggle */ } } } /* Otherwise, either visual bell or disabled; do nothing here */ if (!has_focus) { flash_window(2); /* start */ } } Revision-number: 1124 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2001-05-13T15:01:36.000000Z K 7 svn:log V 40 Fix wrong button codes in WM_MOUSEMOVE. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f3684a9cd8c90dc3e058af4f1e14c7fa Text-delta-base-sha1: 40117b7995286265f0e0e5e60fb291ec7c610ee9 Text-content-length: 111 Text-content-md5: d8f4a5e0eede3f08c024f6a4ac4c30a7 Text-content-sha1: 002c33e789bf319394063d9c7e2a673cced2ac0f Content-length: 152 K 15 cvs2svn:cvs-rev V 5 1.138 PROPS-END SVNST8TQLEFT; else if (wParam & MK_MBUTTON) b = MBT_MIDDLE; else b = MBT_RIGHT Revision-number: 1125 Prop-content-length: 195 Content-length: 195 K 8 svn:date V 27 2001-05-13T16:13:39.000000Z K 7 svn:log V 95 Fix the sense of posdiff(), causing the extend-selection mouse action to work correctly again. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 950dbb815f1115dfc944655de8c27e01 Text-delta-base-sha1: 9884be8dde9c23d41c0f61d6e7ae599dee75c697 Text-content-length: 64 Text-content-md5: 8bb776205963046adef1d0dfd4117d69 Text-content-sha1: 23d3725ddbc2ee1218db629df82fc5f3c01d8ebd Content-length: 104 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNQQ (QXy1).y - (p2).y) * (cols+1) + (p1).x - (p2 Revision-number: 1126 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2001-05-14T13:31:14.000000Z K 7 svn:log V 76 Scrollbar was failing to update when no scrollback-reset event had happened K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8bb776205963046adef1d0dfd4117d69 Text-delta-base-sha1: 23d3725ddbc2ee1218db629df82fc5f3c01d8ebd Text-content-length: 65 Text-content-md5: 70b67f82e3d5ef04546e60e3d9d56ba8 Text-content-sha1: 6d7109855790ebc241ee65be7b73f3b152b4a7c8 Content-length: 105 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNQg$pDjBseen_disp_event) update_sbar(); Revision-number: 1127 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2001-05-14T22:20:20.000000Z K 7 svn:log V 44 Specify a few things that were unsepcified. K 10 svn:author V 3 ben PROPS-END Node-path: putty/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1cf7de95ffd64454038cb893f570921e Text-delta-base-sha1: fc65f43ca7258a9977374494fd626cb984094b0c Text-content-length: 173 Text-content-md5: 0520eba5e0f98f6aec2e9e1aa89c3f45 Text-content-sha1: 9611ed0605c11d730cf461037995106dd2fade56 Content-length: 212 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN, m*i * A given key will be written at most once while saving a session. * Keys may be up to 255 characters long. String values have no length * limit Revision-number: 1128 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:49.276525Z PROPS-END Revision-number: 1129 Prop-content-length: 454 Content-length: 454 K 7 svn:log V 353 Fix the line-resizing bug in scroll(). (Thanks to RDB for pointing it out. A line was removed from the scrollback, cleared, and placed at the bottom of the screen. Fine, except that the clearing process assumed the line was the right length already, and thanks to lazy resizing this wasn't necessarily the case. Segfaults and memory corruption ensued.) K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-17T08:53:13.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 70b67f82e3d5ef04546e60e3d9d56ba8 Text-delta-base-sha1: 6d7109855790ebc241ee65be7b73f3b152b4a7c8 Text-content-length: 534 Text-content-md5: d95754dd1c6dbd4389bae3790ed45bca Text-content-sha1: ffd1d8c44a09dcc63f8e68ce7dd868521793afbf Content-length: 574 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNgC6R2>7{&T]((Dx$y1u1Ksize a line to make it `cols' columns wide. */ unsigned long *resizeline(unsigned long *line, int cols) { int i, oldlen; unsigned long lineattrs; if (line[0] != (unsigned long) } return line; }*newline; tree234 *whichtree; int treeindexnewline = resizeline(line, cols); if (newline != line) { delpos234(whichtree, treeindex); addpos234(whichtree, new line = resizeline(line, cols line = resizeline(line, cols Revision-number: 1130 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2001-05-17T10:06:54.000000Z K 7 svn:log V 143 Reinstate the Shift-Ins paste behaviour, which was accidentally broken by the mouse button redesignation that came with xterm mouse reporting. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 788a3d3ce4cb264ad096b95fad45ebf2 Text-delta-base-sha1: a8533df260c563fc8b8b0eccdbc6d45f5c13a18f Text-content-length: 34 Text-content-md5: a96c3105aa106f8ac17a84d0fa3f2663 Text-content-sha1: d27b1738d2886d48bd018ef047a08ee1e82b4986 Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.99 PROPS-END SVNo \ Odo_paste(void Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d95754dd1c6dbd4389bae3790ed45bca Text-delta-base-sha1: ffd1d8c44a09dcc63f8e68ce7dd868521793afbf Text-content-length: 1283 Text-content-md5: d4a7d1ae51fcea8a1d33701a20419c74 Text-content-sha1: 28179d80702b7e35f77176198da71107bd57fcdc Content-length: 1323 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNC`Ju,do_paste(void) { wchar_t *data; int len; get_clip(&data, &len); if (data) { wchar_t *p, *q; if (paste_buffer) sfree(paste_buffer); paste_pos = paste_hold = paste_len = 0; paste_buffer = smalloc(len * sizeof(wchar_t)); p = q = data; while (p < data + len) { while (p < data + len && !(p <= data + len - sel_nl_sz && !memcmp(p, sel_nl, sizeof(sel_nl)))) p++; { int i; for (i = 0; i < p - q; i++) { paste_buffer[paste_len++] = q[i]; } } if (p <= data + len - sel_nl_sz && !memcmp(p, sel_nl, sizeof(sel_nl))) { paste_buffer[paste_len++] = '\r'; p += sel_nl_sz; } q = p; } /* Assume a small paste will be OK in one go. */ if (paste_len < 256) { luni_send(paste_buffer, paste_len); if (paste_buffer) sfree(paste_buffer); paste_buffer = 0; paste_pos = paste_hold = paste_len = 0; } } get_clip(NULL, NULL term_do_paste( Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d8f4a5e0eede3f08c024f6a4ac4c30a7 Text-delta-base-sha1: 002c33e789bf319394063d9c7e2a673cced2ac0f Text-content-length: 35 Text-content-md5: 63969c3640a44e0925f289fb6fef1008 Text-content-sha1: 3bdf2d22ed35fbae318d50a228e89744b4bb8105 Content-length: 76 K 15 cvs2svn:cvs-rev V 5 1.139 PROPS-END SVN> fO?do_paste( Revision-number: 1131 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:49.497403Z PROPS-END Revision-number: 1132 Prop-content-length: 220 Content-length: 220 K 8 svn:date V 27 2001-05-19T11:32:38.000000Z K 7 svn:log V 119 Small terminal fix from RDB: CSI 1 K should erase the cursor position itself, as well as everything to the left of it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d4a7d1ae51fcea8a1d33701a20419c74 Text-delta-base-sha1: 28179d80702b7e35f77176198da71107bd57fcdc Text-content-length: 38 Text-content-md5: b950ac79a9896429b294376a76685a3d Text-content-sha1: 5ed16db7e29b8336cc6ae7896e3e4faf43ddf21e Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVN" y incpos(end) Revision-number: 1133 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2001-05-19T11:33:03.000000Z K 7 svn:log V 86 Terminal fix from RDB: probably didn't mean to compare a Y value with a column count! K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b950ac79a9896429b294376a76685a3d Text-delta-base-sha1: 5ed16db7e29b8336cc6ae7896e3e4faf43ddf21e Text-content-length: 27 Text-content-md5: 9bb02d1d2291f91c2fe652481a8b22c0 Text-content-sha1: 3b0dbb5fd3aad06a56788a10df0315e3b88f5683 Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVN"" /r0x Revision-number: 1134 Prop-content-length: 220 Content-length: 220 K 7 svn:log V 119 Fix from RDB: patch up mis-aimed fallthroughs in a terminal emulation switch. (Bug was introduced in mouse reporting.) K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-19T11:34:20.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9bb02d1d2291f91c2fe652481a8b22c0 Text-delta-base-sha1: 3b0dbb5fd3aad06a56788a10df0315e3b88f5683 Text-content-length: 176 Text-content-md5: ea7d4f9fe8119726ae8a68909ae0a9c5 Text-content-sha1: 2ab1e3391dcb31d110974d8b63d0afea7404d42b Content-length: 216 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVN"L4w1npqUx[G /* FALLTHROUGH */a': /* move right N cols */ compatibility(ANSI); /* FALLTHROUGH */ case 'C': move(curs.x + Revision-number: 1135 Prop-content-length: 244 Content-length: 244 K 7 svn:log V 143 Be prepared to print spaces at the end of a statistics line in case the previously printed line was longer. Avoids multiple trailing percents. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-19T13:41:18.000000Z PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7c6601fdd16079b46370bc18c684f787 Text-delta-base-sha1: 2a60e7338422ef51d77e8708b6364ecb592218a6 Text-content-length: 289 Text-content-md5: c4bf0374312f8de620aa5e750b6b194f Text-content-sha1: 5d97e187fe16855e339b122f7e4994859f610e84 Content-length: 329 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVN8Iz7 y>] /int prev_stats_len int lenlen = printf("\r%-25.25s | %10ld kB | %5.1f kB/s | ETA: %8s | %3d%%", name, done / 1024, ratebs / 1024.0, etastr, pct); if (len < prev_stats_len) printf("%*s", prev_stats_len - len, ""); prev_stats_len = len Revision-number: 1136 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2001-05-19T13:56:39.000000Z K 7 svn:log V 106 Update the two commented-out CFLAGS to include the same _WIN32_WINDOWS definition as the uncommented one. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ea51c481f00bed2e9561c55d0060d9e5 Text-delta-base-sha1: 3aa19f42d11221102c4a3bc2b0a639558797430f Text-content-length: 73 Text-content-md5: a71510993eefcf911e9b7f08048ccb66 Text-content-sha1: 69301bed6d74f2d8941183b577dd86693bca0468 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVN/.G^G\% /D_WIN32_WINDOWS=0x401 /D_WIN32_WINDOWS=0x401 Revision-number: 1137 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2001-05-19T14:12:41.000000Z K 7 svn:log V 76 SCO ACS patch from RDB. Apparently required for the Linux console terminfo. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a96c3105aa106f8ac17a84d0fa3f2663 Text-delta-base-sha1: d27b1738d2886d48bd018ef047a08ee1e82b4986 Text-content-length: 88 Text-content-md5: 758321fba14f83e3191f13455aa3dbad Text-content-sha1: 6ecb457f75b4cc7ec2b4ea95a2216a93c8efd7f0 Content-length: 129 K 15 cvs2svn:cvs-rev V 5 1.100 PROPS-END SVN m=f\UnSCOACS 0x0000DA00UL /* SCO Alternate charsetscoacs[256] Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ea7d4f9fe8119726ae8a68909ae0a9c5 Text-delta-base-sha1: 2ab1e3391dcb31d110974d8b63d0afea7404d42b Text-content-length: 1223 Text-content-md5: 2124938e9810cbab45959e37879c9344 Text-content-sha1: 064f3d7e4ae0f168149b6b3829a1f21b131fbb50 Content-length: 1263 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVNL2jOZjK95 dEj-s+U_HIdX:XoK'p(n bjsco_acs, save_sco_acs; /* CSI 10,11,12m -> OEM charset, alt_sco_acsalt_sco_acs = sco_acs t = sco_acs; sco_acs = alt_sco_acs; alt_sco_acs save_sco_acs = sco_acssco_acs = save_sco_acs /* Are we in the nasty ACS mode? Note: no sco in utf mode. */ else if(sco_acs && (c!='\033' && c!='\n' && c!='\r' && c!='\b')) { if (sco_acs == 2) c ^= 0x80; c |= ATTR_SCOACScase ATTR_SCOACS: if (c>=' ') c = ((unsigned char)c) | ATTR_SCOACS case ANSI('U', '('): compatibility(OTHER); cset_attr[0] = ATTR_SCOACS; case ANSI('U', ')'): compatibility(OTHER); cset_attr[1] = ATTR_SCOACS; 10: /* SCO acs off */ compatibility(SCOANSI); sco_acs = 0; break; case 11: /* SCO acs on */ compatibility(SCOANSI); sco_acs = 1; break; case 12: /* SCO acs on flipped */ compatibility(SCOANSI); sco_acs = 2; case ATTR_SCOACS: tchar = unitab_scoacs[tchar&0xFF]; case ATTR_SCOACS: uc = unitab_scoacs[uc&0xFF]; case ATTR_SCOACS: uc = unitab_scoacs[uc&0xFF]; Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bf07533ac03b74215617154fd66c0b35 Text-delta-base-sha1: b6fb3e5c812ae9e82db7843e4e70d822c4be8141 Text-content-length: 718 Text-content-md5: e7af710adadc401ef300f72551e0fea1 Text-content-sha1: b15bc5a367bbbdce7c4b9c09a04cd24358871193 Content-length: 757 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN1g%BH?r\.8ObCP437 ucs table for SCO acs */ if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_XWINDOWS) memcpy(unitab_scoacs, unitab_oemcp, sizeof(unitab_scoacs)); else get_unitab(437, unitab_scoacsif (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_XWINDOWS) link_font(unitab_scoacs, unitab_oemcp, ATTR_OEMCP); link_font(unitab_line, unitab_font, ATTR_ACP); link_font(unitab_scoacsscoacs[] = "CueaaaaceeeiiiAAE**ooouuyOUc$YPsaiounNao?++**!<>###||||++||++++++--|-+||++--|-+----++++++++##||#aBTPEsyt******EN=+><++-=... n2* "; for(i=128;i<256;i++) if (!DIRECT_FONT(unitab_scoacs[i])) unitab_scoacs[i] = (WCHAR) (ATTR_ACP + poorman_scoacs[i - 128 Revision-number: 1138 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2001-05-19T15:21:05.000000Z K 7 svn:log V 33 RDB: fix various UTF-8 glitches. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8014a6bf1daa745b5983cda3034e04d0 Text-delta-base-sha1: 16f77052186413693fbdc2224c3ff1dd4d7e424d Text-content-length: 33 Text-content-md5: dd84746cb982b56e6c340aeb91fa3c76 Text-content-sha1: 422756016ffe33289d8e435cbc0e3dbf19a40592 Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNOUXdkin_in_ Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 758321fba14f83e3191f13455aa3dbad Text-delta-base-sha1: 6ecb457f75b4cc7ec2b4ea95a2216a93c8efd7f0 Text-content-length: 83 Text-content-md5: 133d60698dc3c40e5b3a61d77292618e Text-content-sha1: 9eb916e196841cc5d1dcf82fd42c054f170701e7 Content-length: 124 K 15 cvs2svn:cvs-rev V 5 1.101 PROPS-END SVNm)8Bg?H%ATTR_ASCII#define in_utf (utf || line_codepage==CP_UTF8) Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2124938e9810cbab45959e37879c9344 Text-delta-base-sha1: 064f3d7e4ae0f168149b6b3829a1f21b131fbb50 Text-content-length: 779 Text-content-md5: cfb233883777d9a2728ac6287f711e45 Text-content-sha1: 4ae964e6ad979b14b54473eb1cf8e349f94e593c Content-length: 819 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVN2MkTi#= 3;l`Dm[Gic E QcF|GHiC!save_utf; , alt_utfutf = utfutf; utf = alt_utf; alt_utfutf = utfutf = save_utfATTR_ASCII | in_utf) switch (utf_state) { case 0: if (c < 0x80) { /* UTF-8 must be stateless so we ignore iso2022. */ if (unitab_ctrl[c] != 0xFF) c = unitab_ctrl[c]; else c = ((unsigned char)c) | ATTR_ASCII; break (' ' | ATTR_ASCII | (curr_attr & (ATTR_FGMASK | ATTR_BGMAS (' ' | ATTR_ASCII | (curr_attr & ATTR_ASCII | (curr_attr & (ATTR_FGMASK | ATTR_BGMAS ATTR_ASCII | (curr_attr & (ATTR_FGMASK | ATTR_BGMAS ATTR_ASCII | (curr_attr & (ATTR_FGMASK | ATTR_BGMAS Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e7af710adadc401ef300f72551e0fea1 Text-delta-base-sha1: b15bc5a367bbbdce7c4b9c09a04cd24358871193 Text-content-length: 276 Text-content-md5: 871c4fea86cef4b9cafb793c1f96ecf0 Text-content-sha1: 0e3a55dae4c438d86e95096b28656075a95daaa4 Content-length: 315 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNga+[T NDMdVC>Z8# [int old_codepage = line_codepagefont_codepage <= 0) { font_codepage=0; dbcs_screenfont=0; } /* Collect screen font ucs table */ if (dbcs_screenfont || font_codepage == 0 || font_codepage==0in_utf)?3:in_ Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 63969c3640a44e0925f289fb6fef1008 Text-delta-base-sha1: 3bdf2d22ed35fbae318d50a228e89744b4bb8105 Text-content-length: 48 Text-content-md5: 1c987b37b3fed839c12cc4f14fefee52 Text-content-sha1: 04982d5b377caf96b21c15a23b7059d554e552f5 Content-length: 89 K 15 cvs2svn:cvs-rev V 5 1.140 PROPS-END SVN>G ;&;aIuin_in_in_ Revision-number: 1139 Prop-content-length: 293 Content-length: 293 K 8 svn:date V 27 2001-05-19T15:23:12.000000Z K 7 svn:log V 192 Add some spare SetForegroundWindow and SetActiveWindow calls to try to improve window behaviour. Also make the About box a subdialog of the config box instead of a separate child of the root. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3613d8c061d29dff6b8686ab0465e108 Text-delta-base-sha1: 006db57cde28266691f0ab3a61c463174bb4c835 Text-content-length: 57 Text-content-md5: b86bd5a79dd0381f38321413b6fef717 Text-content-sha1: ff679712f62b944cd2f2e0552ead8368e7cbbf5c Content-length: 98 K 15 cvs2svn:cvs-rev V 5 1.135 PROPS-END SVN-6qgEh hwndSetActiveWindow(hwnd Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1c987b37b3fed839c12cc4f14fefee52 Text-delta-base-sha1: 04982d5b377caf96b21c15a23b7059d554e552f5 Text-content-length: 52 Text-content-md5: d7deabd4201b12b055af7147d11373f8 Text-content-sha1: fdae7e30b84cedf5ed235340dfe8544e99b12325 Content-length: 93 K 15 cvs2svn:cvs-rev V 5 1.141 PROPS-END SVNGf dfa SetForegroundWindow(hwnd Revision-number: 1140 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2001-05-19T15:59:02.000000Z K 7 svn:log V 71 Make sure the default protocol doesn't ever end up undefined in Plink. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3725a2a5fd94166d7593b84f6f881eee Text-delta-base-sha1: a34dbfcac025049864835cfd07ce5660c92fecd6 Text-content-length: 213 Text-content-md5: c4ae4687e41c030a77fec45a186c4d60 Text-content-sha1: e2e3d883e76bf19e25cd116ae2813e2a626c8820 Content-length: 253 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNS ;z;[x /* * Initialise port and protocol to sensible defaults. (These * will be overridden by more or less anything.) */ default_protocol = PROT_SSH; default_port = 22 Revision-number: 1141 Prop-content-length: 270 Content-length: 270 K 8 svn:date V 27 2001-05-21T13:33:12.000000Z K 7 svn:log V 169 Oops - fixing the line-resizing segfault introduced a new line-resizing segfault! Remind me to test under Minefield next time. Should now be fine, as I've just done so. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cfb233883777d9a2728ac6287f711e45 Text-delta-base-sha1: 4ae964e6ad979b14b54473eb1cf8e349f94e593c Text-content-length: 42 Text-content-md5: 2d68646a494a6c62147a42ab580f4777 Text-content-sha1: 9e3dc1a06f532fa8ba4e4e9b47f870b5d5f6e219 Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNMe NH line = newline Revision-number: 1142 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 71 Disable the most irritating compiler warnings in the Borland makefile. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-05-28T10:26:10.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bb2926f55cc0861143f6ca5adce71802 Text-delta-base-sha1: 32c373248ba08649d4278772ed53a54d63b94f81 Text-content-length: 41 Text-content-md5: 84b1f33c43cfb25a3b841bb550a78747 Text-content-sha1: 1fad29782cf9123aadc81f91f128ed0d41549997 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN>S vIu-w-aus -w-ccc -w-par Revision-number: 1143 Prop-content-length: 181 Content-length: 181 K 7 svn:log V 82 Added mention of rlogin, and a few words on VT100+ and SCO function key settings. K 10 svn:author V 4 owen K 8 svn:date V 27 2001-06-03T11:10:20.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 790fb7fc97e666cd7216174212b2dae6 Text-delta-base-sha1: 1642b6a03bc5ca379dcbf1ada0872db295726bca Text-content-length: 536 Text-content-md5: a214be13a6466651890b08c49b5c3a2d Text-content-sha1: 560d44ee22694bb763e101f75b35201c356e9f07 Content-length: 575 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNOnrJKrj}Vy an rlogin connection or an SSH connection. \#{ FIXME: link to sections on , Rlogin, or SSH, this box will be filled \b In VT100+ mode, the function keys generate \c{ESC OP} through to \c{ESC O[} \b In SCO mode, the function keys F1 to F12 generate \c{ESC [M} through to \c{ESC [X}. Together with shift, they generate \c{ESC [Y} through to \c{ESC [j}. With control they generate \c{ESC [k} through to \c{ESC [v}, and with shift and control together they generate \c{ESC [w} through to \c{ESC [\{ Revision-number: 1144 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2001-06-03T11:46:49.000000Z K 7 svn:log V 17 Bell panel docs. K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a214be13a6466651890b08c49b5c3a2d Text-delta-base-sha1: 560d44ee22694bb763e101f75b35201c356e9f07 Text-content-length: 1586 Text-content-md5: 7df34e5156a1dea413674206a37e8c6d Text-content-sha1: d904308cfb170242cb8467a8c87ed15ee7a6aa29 Content-length: 1625 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNn }~pbell} The Bell panel The Bell configuration panel allows you to control how PuTTY should respond to a terminal bell. \S{config-bellstyle} Set the style of bell When a terminal bell occurs, PuTTY can do one of the following things: \b Nothing. The bell is disabled. Taskbar bell indication still works, however. \b Play Windows Default Sound. The Windows Default Sound (which can be configured from the Sounds control panel) will be played. \b Play a custom sound file. Select a \c{.wav} sound file using the \e{Custom sound file to play as a bell} text box, or browse for the file to play using the \e{Browse...} button. \b Flash the terminal window as a visual bell. No sound will be played. In addition, the PuTTY window's title bar and its entry in the taskbar can be configured to flash or invert to indicate that a terminal bell has occurred. \S{config-belloverload} Control the bell overload behaviour Sometimes mistakes, for example trying to \c{cat} a binary file on a Unix machine, can lead to a large number of terminal bells being received by PuTTY. It might take a long time for PuTTY to catch up with reacting to these bells, and the noise or flashing could be very irritating for the user. PuTTY's bell overload handling is designed to avoid this problem. If turned on using the \e{Bell is temporarily disabled when over-used} tick box, the bell will be disabled if it occurs more than a specified number of times in a specified number of seconds. When no bells have occurred for a number of seconds, PuTTY re-enables the bell Revision-number: 1145 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.406451Z PROPS-END Revision-number: 1146 Prop-content-length: 313 Content-length: 313 K 8 svn:date V 27 2001-06-15T19:31:10.000000Z K 7 svn:log V 212 Add some extra documentation: filled in the Getting Started chapter, added an introduction to public key authentication, and made a couple of changes in intro.but. Transatlantic flights have some uses after all. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 22f8b64c34e9735598182e4f1950174a Text-delta-base-sha1: 6d402ca376e5a347475945652c9a69e4c56f10f8 Text-content-length: 6479 Text-content-md5: 59b3e94e7eaadb49881aef4e8baad69e Text-content-sha1: 793a73bf4a9c7e1acd3efe6fee47b7fdc19504a3 Content-length: 6518 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN_AAA\C{gs} Getting started with PuTTY This chapter gives a quick guide to the simplest types of interactive login session using PuTTY. \H{gs-insecure} Starting a session When you start PuTTY, you will see a dialog box. This dialog box allows you to control everything PuTTY can do. See \k{config} for details of all the things you can control. You don't usually need to change most of the configuration options. To start the simplest kind of session, all you need to do is to enter a few basic parameters. In the \e{Host Name} box, enter the Internet host name of the server you want to connect to. You should have been told this by the provider of your login account. Now select a login protocol to use, from the \e{Protocol} buttons. For a login session, you should select Telnet, Rlogin or SSH. See \k{which-one} for a description of the differences between the three protocols, and advice on which one to use. The fourth protocol, \e{Raw}, is not used for interactive login sessions; you would usually use this for debugging other Internet services. When you change the selected protocol, the number in the \e{Port} box will change. This is normal: it happens because the various login services are usually provided on different network ports by the server machine. Most servers will use the standard port numbers, so you will not need to change the port setting. If your server provides login services on a non-standard port, your system administrator should have told you which one. (For example, many MUDs run Telnet service on a port other than 23.) Once you have filled in the \e{Host Name}, \e{Protocol}, and possibly \e{Port} settings, you are ready to connect. Press the \e{Open} button at the bottom of the dialog box, and PuTTY will begin trying to connect you to the server. \H{gs-hostkey} Verifying the Host Key (SSHonly) If you are not using the SSHprotocol, you can skip this section. If you are using SSH to connect to a server for the first time, you will probably see a message looking something like this: \# FIXME: copy the real message from the host key dialog This is a feature of the SSH protocol. It is designed to protect you against a network attack known as \e{spoofing}: secretly redirecting your connection to a different computer, so that you send your password to the wrong machine. Using this technique, an attacker would be able to learn the password that guards your login account, and could then log in as if they were you and use the account for their own purposes. To prevent this attack, each server has a unique identifying code, called a \e{host key}. These keys are created in a way that prevents one server from forging another server's key. So if you connect to a server and it sends you a different host key from the one you were expecting, PuTTYcan warn you that the server may have been switched and that a spoofing attack might be in progress. PuTTY records the host key for each server you connect to, in the Windows Registry. Every time you connect to a server, it checks that the host key presented by the server is the same host key as it was the last time you connected. If it is not, you will see a warning, and you will have the chance to abandon your connection before you type any private information (such as a password) into it. However, when you connect to a server you have not connected to before, PuTTYhas no way of telling whether the host key is the right one or not. So it gives the warning shown above, and asks you whether you want to trust this host key or not. Whether or not to trust the host key is your choice. If you are connecting within a company network, you might feel that all the network users are on the same side and spoofing attacks are unlikely, so you might choose to trust the key without checking it. If you are connecting across a hostile network (such as the Internet), you should check with your system administrator, perhaps by telephone or in person. (Some modern servers have more than one host key. If the system administrator sends you more than one fingerprint, you should make sure the one PuTTYshows you is on the list, but it doesn't matter which one it is.) \# FIXME: this is all very fine but of course in practice the world doesn't work that way. Ask the team if they have any good ideas for changes to this section! \H{gs-login} Logging In After you have connected, and perhaps verified the server's host key, you will be asked to log in, probably using a username and a password. Your system administrator should have provided you with these. Enter the username and the password, and the server should grant you access and begin your session. If you have mistyped your password, most servers will give you several chances to get it right. If you are using SSH, be careful not to type your username wrongly, because you will not have a chance to correct it after you press Return. This is an unfortunate feature of the SSHprotocol: it does not allow you to make two login attempts using different usernames. If you type your username wrongly, you must close PuTTY and start again. If your password is refused but you are sure you have typed it correctly, check that Caps Lock is not enabled. Many login servers, particularly Unix computers, treat upper case and lower case as different when checking your password; so if Caps Lock is on, your password will probably be refused. \H{gs-session} After Logging In After you log in to the server, what happens next is up to the server! Most servers will print some sort of login message and then present a prompt, at which you can type commands which the server will carry out. Some servers will offer you on-line help; others might not. If you are in doubt about what to do next, consult your system administrator. \H{gs-logout} Logging Out When you have finished your session, you should log out by typing the server's own logout command. This might vary between servers; if in doubt, try \c{logout} or \c{exit}, or consult a manual or your system administrator. When the server processes your logout command, the PuTTYwindow should close itself automatically. You \e{can} close a PuTTYsession using the Close button in the window border, but this might confuse the server - a bit like hanging up a telephone unexpectedly in the middle of a conversation. We recommend you do not do this unless the server has stopped responding to you and you cannot close the window any other way. Node-path: putty/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 06ed6575e479029d9550e02447e44f83 Text-delta-base-sha1: 949c52d7946aa25a83bf95ae15b77e53192574d6 Text-content-length: 127 Text-content-md5: 5f2bd140068a23972df2903db5a1dc38 Text-content-sha1: aad4b1690ad73db0f033b16331d299dd954f4a92 Content-length: 166 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNH)cJ.Qh3. Windows computerbreaking the security requires the attacker to have gained access to your actual Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 42cf31a4d14b0bc8c7eb00c8beb336e5 Text-delta-base-sha1: 3716ba616288984dcf18a542adfebab42e4a6c75 Text-content-length: 3029 Text-content-md5: dd5ce489cbe67eca3527143290f3ed76 Text-content-sha1: 8ce91436ab6e0d2d6f12bd50df8cc00a57eb25ef Content-length: 3068 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNL0y80 <G)!\versionid $Id: pubkey.but,v 1.3 2001/06/15 19:31:10 simoPublic key authentication is an alternative means of identifying yourself to a login server, instead of typing a password. It is more secure and more flexible, but more difficult to set up. In conventional password authentication, you prove you are who you claim to be by proving that you know the correct password. The only way to prove you know the password is to tell the server what you think the password is. This means that if the server has been hacked, or \e{spoofed} (see \k{gs-hostkey}), an attacker can learn your password. Public key authentication solves this problem. You generate a \e{key pair}, consisting of a public key (which everybody is allowed to know) and a private key (which you keep secret and do not give to anybody). The private key is able to generate \e{signatures}. Asignature created using your private key cannot be forged by anybody who does not have that key; but anybody who has your public key can verify that a particular signature is genuine. So you generate a key pair on your own computer, and you copy the public key to the server. Then, when the server asks you to prove who you are, PuTTYcan generate a signature using your private key. The server can verify that signature (since it has your public key) and allow you to log in. Now if the server is hacked or spoofed, the attacker does not gain your private key or password; they only gain one signature. And signatures cannot be re-used, so they have gained nothing. There is a problem with this: if your private key is stored unprotected on your own computer, then anybody who gains access to \e{that} will be able to generate signatures as if they were you. So they will be able to log in to your server under your account. For this reason, your private key is usually \e{encrypted} when it is stored on your local machine, using a passphrase of your choice. In order to generate a signature, PuTTY must decrypt the key, so you have to type your passphrase. This can make public-key authentication less convenient than password authentication: every time you log in to the server, instead of typing a short password, you have to type a longer passphrase. One solution to this is to use an \e{authentication agent}, a separate program which holds decrypted private keys and generates signatures on request. PuTTY's authentication agent is called Pageant. When you begin a Windows session, you start Pageant and load your public key into it (typing your passphrase once). For the rest of your session, you can start PuTTYany number of times and Pageant will automatically generate signatures without you having to do anything. When you close your Windows session, Pageant shuts down, without ever having stored your decrypted private key on disk. Many people feel this is a good compromise between security and convenience. See \k{pageant} for further details may take a little while, especially on slow machines. Once the key is Revision-number: 1147 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.564701Z PROPS-END Revision-number: 1148 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.571869Z PROPS-END Revision-number: 1149 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.580868Z PROPS-END Revision-number: 1150 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.588137Z PROPS-END Revision-number: 1151 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.594807Z PROPS-END Revision-number: 1152 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.601989Z PROPS-END Revision-number: 1153 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.608565Z PROPS-END Revision-number: 1154 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.615573Z PROPS-END Revision-number: 1155 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2001-06-23T16:59:00.000000Z K 7 svn:log V 53 Robert de Bath's implementation of ESC [ Z (backtab) K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2d68646a494a6c62147a42ab580f4777 Text-delta-base-sha1: 9e3dc1a06f532fa8ba4e4e9b47f870b5d5f6e219 Text-content-length: 324 Text-content-md5: 43d19f9d491b9502951c72ba83e08ef5 Text-content-sha1: f2cd08a206030baa9653d5084fc025bc56d4f584 Content-length: 364 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVNe)'m'P'Z': /* BackTab for xterm */ compatibility(OTHER); { int i = def(esc_args[0], 1); pos old_curs = curs; for(;i>0 && curs.x>0; i--) { do { curs.x--; } while (curs.x >0 && !tabs[curs.x]); } fix_cpos; check_selection(old_curs, curs); Revision-number: 1156 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.679725Z PROPS-END Revision-number: 1157 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2001-06-28T13:36:14.000000Z K 7 svn:log V 41 Added = to instructions for setting PATH K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3ef61c40978af5b6f9a4c3545ec99a67 Text-delta-base-sha1: 8e41c610b1041da24ee3e10d6a006dc00e17984e Text-content-length: 74 Text-content-md5: 0f8600fd1c8a15bbebdaa5a9f540dee3 Text-content-sha1: d197f1d046def241af449ba7b49c4b8e009dcc1d Content-length: 113 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNSS 403od\versionid $Id: plink.but,v 1.6 2001/06/28 13:36:14= Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 06aedfdb2abde64641a6f64d59b0ef5e Text-delta-base-sha1: 363518ee5a1c8aea6c14c72d4c0bfc4415115e50 Text-content-length: 78 Text-content-md5: c254befca9da2dea9115f9fdd03d9306 Text-content-sha1: b0756d1ee498c9dcceec2aa7c8d4909fa8603445 Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN}| 88)T\versionid $Id: pscp.but,v 1.11 2001/06/28 13:36:14 owe= Revision-number: 1158 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2001-07-01T09:21:01.000000Z K 7 svn:log V 78 Minor wording clarification: somebody took the word `sessionname:' literally. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c254befca9da2dea9115f9fdd03d9306 Text-delta-base-sha1: b0756d1ee498c9dcceec2aa7c8d4909fa8603445 Text-content-length: 189 Text-content-md5: 34f020988186d43a852ad7a3476285cd Text-content-sha1: 7d205bd5a26abe9bb09161ade1a0cf7049b98ada Content-length: 229 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN|G %a7mA;\versionid $Id: pscp.but,v 1.12 2001/07/01 09:21:01 simotype \c{pscp sessionname:file localfile}, where \c{sessionname} is replaced by the name of your saved session Revision-number: 1159 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.854839Z PROPS-END Revision-number: 1160 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.861110Z PROPS-END Revision-number: 1161 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:50.867308Z PROPS-END Revision-number: 1162 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 2001-07-31T14:23:21.000000Z K 7 svn:log V 161 Yet another possible segfault path in the backends fixed. I don't _believe_ I'm still finding these. I have no idea what I was thinking when I wrote this stuff. K 10 svn:author V 5 simon PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e505dddd867c7665728576d3955003fc Text-delta-base-sha1: a660c36c488be4e71cdb2fd1b628e4f7d24e0a88 Text-content-length: 74 Text-content-md5: a69b436571f99d5c5a8cde76758d9c7e Text-content-sha1: 864a7ace65de3a316eb9ce22d7d23db8ed9be831 Content-length: 114 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN0K 5if (s) { sk_close(s); s = NULL; } Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b5f501d793e82832c790321b61ef392c Text-delta-base-sha1: 665d9d8ce7483e015196e48fcbd19354a45acfca Text-content-length: 74 Text-content-md5: e79b596666f522ab87d4cc6f4e8d66f8 Text-content-sha1: 72d95ee0a03a47d3e8f82403a09c6dc3ac57dc48 Content-length: 114 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN ' 5]/if (s) { sk_close(s); s = NULL; } Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f3e3b4cbb3acbc7de0fd59beafc871c3 Text-delta-base-sha1: ff88e3f5af8cd6eeefde3f7b79178f8116a8887a Text-content-length: 123 Text-content-md5: fe8914e2c978beb96cfb05e54c3167ce Text-content-sha1: 7417319ab04f2f43aae0f1497914f157369c146f Content-length: 164 K 15 cvs2svn:cvs-rev V 5 1.146 PROPS-END SVN 5D!if (s) { sk_close(s); s = NULL; }7R7 (cscipher) { int str Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f9421996cc3b042b5b67b581ac313089 Text-delta-base-sha1: aaf0d97496d32f8fba43749ad394c27147793b2d Text-content-length: 76 Text-content-md5: 4eb544ec32b3bb5c54f559f47503b1e6 Text-content-sha1: f757587aea4951487621d92da379c28b4d0c89fa Content-length: 116 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN/ 5l(if (s) { sk_close(s); s = NULL; } Revision-number: 1163 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:51.022262Z PROPS-END Revision-number: 1164 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:51.029658Z PROPS-END Revision-number: 1165 Prop-content-length: 208 Content-length: 208 K 7 svn:log V 107 Fix segfault if the server maliciously sends the wrong type of key after a different type has been agreed. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-04T12:37:43.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fe8914e2c978beb96cfb05e54c3167ce Text-delta-base-sha1: 7417319ab04f2f43aae0f1497914f157369c146f Text-content-length: 220 Text-content-md5: d799c32689be9777099ff883613b2262 Text-content-sha1: 847e1ae8b49c14c9c83819ba73d843f4612500a0 Content-length: 261 K 15 cvs2svn:cvs-rev V 5 1.147 PROPS-END SVN  fvkey || !hostkey->verifysig(hkey, sigdata, siglen, exchange_hash, 20)) { bombout(("Server's host key did not match the signature suppliedRv$R gain * nothing by it. */ if Revision-number: 1166 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2001-08-04T13:05:54.000000Z K 7 svn:log V 41 Add description of the keepalives option K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7df34e5156a1dea413674206a37e8c6d Text-delta-base-sha1: d904308cfb170242cb8467a8c87ed15ee7a6aa29 Text-content-length: 2244 Text-content-md5: c8f87c6c23982e63e66eb06fb5d5b195 Text-content-sha1: ae3fb85b1587f3473127eb4e04d43bc26ceed862 Content-length: 2283 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN=((If you find your sessions are closing unexpectedly (\q{Connection reset by peer}) after they have been idle for a while, you might want to try using this option. Some network routers and firewalls need keep track of all connections through them. Usually, these firewalls will assume a connection is dead if no data is transferred in either direction after a certain time interval. This can cause PuTTY sessions to be unexpectedly closed by the firewall if no traffic is seen in the session for some time. The keepalive option (\q{Seconds between keepalives}) allows you to configure PuTTY to send data through the session at regular intervals, in a way that does not disrupt the actual terminal session. If you find your firewall is cutting idle connections off, you can try entering a non-zero value in this field. The value is measured in seconds; so, for example, if your firewall cuts connections off after ten minutes then you might want to enter 300 seconds (5 minutes) in the box. Note that keepalives are not always helpful. They help if you have a firewall which drops your connection after an idle period; but if the network between you and the server suffers from breaks in connectivity then keepalives can actually make things worse. If a session is idle, and connectivity is temporarily lost between the endpoints, but the connectivity is restored before either side tries to send anything, then there will be no problem - neither endpoint will notice that anything was wrong. However, if one side does send something during the break, it will repeatedly try to re-send, and eventually give up and abandon the connection. Then when connectivity is restored, the other side will find that the first side doesn't believe there is an open connection any more. Keepalives can make this sort of problem worse, because they increase the probability that PuTTY will attempt to send data during a break in connectivity. Therefore, you might find they help connection loss, or you might find they make it worse, depending on what \e{kind} of network problems you have between you and the server. Keepalives are only supported in Telnet and SSH; the Rlogin and Raw protocols offer no way of implementing them. Revision-number: 1167 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2001-08-04T13:06:08.000000Z K 7 svn:log V 45 Mention PLINK_PROTOCOL in the Plink chapter. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f8600fd1c8a15bbebdaa5a9f540dee3 Text-delta-base-sha1: d197f1d046def241af449ba7b49c4b8e009dcc1d Text-content-length: 218 Text-content-md5: a0f1534413a0e9952519205f86a25980 Text-content-sha1: 4e5c19da2cc4c5e76f3ef3364b9719baae8da607 Content-length: 257 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNSd A7 4\versionid $Id: plink.but,v 1.7 2001/08/04 13:06:08 simoSet the environment variable \cw{PLINK_PROTOCOL} to the string \c{ssh}, to make sure Plink will try to connect using SSH instead of Telne Revision-number: 1168 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2001-08-04T14:19:51.000000Z K 7 svn:log V 116 Patch to PSFTP: implement mkdir, rmdir, rm and scripting. Still to do: wildcards, chmod, mv, probably other things. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8dc6fcf765e4e401746ca93f53a5e433 Text-delta-base-sha1: d9203db6fb9a7c273678081a1d531b93d05bcedc Text-content-length: 2778 Text-content-md5: 8823ee846e97db7ea67eb48abce76368 Text-content-sha1: dc5c7a63e26a5e6b28998893258955501ed16567 Content-length: 2818 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN` sYHN\N w @ OhtjADt?pVO@|Q}jC.p%1/int sftp_cmd_mkdir(struct sftp_command *cmd) { char *dir; int result; if (cmd->nwords < 2) { printf("mkdir: expects a directory\n"); return 0; } dir = canonify(cmd->words[1]);result = fxp_mkdir(dir); if (!result) { printf("mkdir %s: %s\n", dir, fxp_error()); sfree(dir); return 0; } sfree(dir); return 0; } int sftp_cmd_rmdir(struct sftp_command *cmd) { char *dir; int result; if (cmd->nwords < 2) { printf("rmdir: expects a directory\n"); return 0; } dir = canonify(cmd->words[1]);result = fxp_rmdir(dir); if (!result) { printf("rmdir %s: %s\n", dir, fxp_error()); sfree(dir); return 0; } sfree(dir); return 0; } int sftp_cmd_rm(struct sftp_command *cmd) { char *fname; int result; if (cmd->nwords < 2) { printf("rmfname, fxp_error()); return 0; } result = fxp_rm(fname); if (!result) { printf("rm %s: %s\n", fname, fxp_error()); sfree(fname); return 0; } sfree(fname); return 0; } mkdir", sftp_cmd_mkdir}, { "put", sftp_cmd_put}, { "quit", sftp_cmd_quit}, { "rm", sftp_cmd_rm}, { "rmdir", sftp_cmd_rmdir},};Command line reading and parsing. */ struct sftp_command *sftp_getcmd(FILE *fp, int mode, int modeflags if ((mode == 0) || (modeflags & 1)) { printf("psftp> "); }fp); if (modeflags & 1) { printf("%s", ret); }int mode, int modeflags, char *batchfile) { FILE *fp; * Batch mode? */ if (mode == 0) { * Now we're ready to do Real Stuff. */ while (1) { struct sftp_command *cmd; cmd = sftp_getcmd(stdin, 0, 0); if (!cmd) break; if (cmd->obey(cmd) < 0) break; } } else { fp = fopen(batchfile, "r"); if (!fp) { printf("Fatal: unable to open %s\n", batchfile); return; } while (1) { struct sftp_command *cmd; cmd = sftp_getcmd(fp, mode, modeflags); if (!cmd) break; if (cmd->obey(cmd) < 0) break; if (fxp_error() != NULL) { if (!(modeflags & 2)) break; } } fclose(fp); }b file use specified batchfile\n"); printf(" -bc output batchfile commands\n"); printf(" -be don't stop batchfile processing if errors int mode = 0; int modeflags = 0; char *batchfile = NULL } else if (strcmp(argv[i], "-b") == 0 && i + 1 < argc) { mode = 1; batchfile = argv[++i]; } else if (strcmp(argv[i], "-bc") == 0 && i + 1 < argc) { modeflags = modeflags | 1; } else if (strcmp(argv[i], "-be") == 0 && i + 1 < argc) { modeflags = modeflags | 2mode, modeflags, batchfile Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 28cfd7b8f7cfe5b782a89c89e17cbe17 Text-delta-base-sha1: 18c73d24a7d4ac7ccc486e9fada62cf4eddd1b8e Text-content-length: 735 Text-content-md5: 399cb85616e26f8d6d66e5cbdbffb28b Text-content-sha1: 9bdc2e2dfee7d63abecd6dd6147c9bc73398f4e2 Content-length: 774 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN 7\v |k|T&jxK?2G_jxK?g'Gj]~@K?g'GPustatic const char *fxp_error_message; static int fxp_errtypefxp_error_message = NULLint fxp_mkMKDIR); sftp_pkt_adduint32(pktout, 0x234); /* request id */path, strlen(path)234id = fxp_got_status(pktin); if (id != 1) { return 0; } return 1; } int fxp_rmRMDIR); sftp_pkt_adduint32(pktout, 0x345); /* request id */path, strlen(path)345id = fxp_got_status(pktin); if (id != 1) { return 0; } return 1; } int fxp_rm(char *fnamREMOVE); sftp_pkt_adduint32(pktout, 0x678); /* request id */fname, strlen(fname)678id = fxp_got_status(pktin); if (id != 1) { return 0; } return 1 Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2876bb6b4b2a0ece6c2ef9c6f3dd173c Text-delta-base-sha1: f8f0804d6c4cfd92bdab4a9aebc07683705da03b Text-content-length: 178 Text-content-md5: c9d2321a928dc54b85b0516b12b7a1d9 Text-content-sha1: d802de9362e381d9f420bfee196bd9919bc32714 Content-length: 217 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN^ .;#Makes a directory */ int fxp_mkdir(char *path); /* * Removes a directory */ int fxp_rmdir(char *path); /* * Removes a file */ int fxp_rm(char *fnam Revision-number: 1169 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2001-08-04T14:35:58.000000Z K 7 svn:log V 128 SCO function key mode now affects the small keypad (Ins, Del, etc) in accordance with the keymap dump sent by Len Christiansen. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d7deabd4201b12b055af7147d11373f8 Text-delta-base-sha1: fdae7e30b84cedf5ed235340dfe8544e99b12325 Text-content-length: 291 Text-content-md5: 67a6909a117034c369317bb30b763785 Text-content-sha1: 536ce517a28023b85e41a39a4c758e0e736a53cc Content-length: 332 K 15 cvs2svn:cvs-rev V 5 1.142 PROPS-END SVNf~`tr /* SCO function keys */ cfg.funky_type == 5 && /* SCO small keypad */ code >= 1 && code <= 6) { char codes[] = "HL.FIG"; if (code == 3) { *p++ = '\x7F'; } else { p += sprintf((char *) p, "\x1B[%c", codes[code-1]); } Revision-number: 1170 Prop-content-length: 226 Content-length: 226 K 7 svn:log V 125 Prevent recursive weirdnesses happening when the user selects a system-tray menu option while a passphrase prompt is active. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-04T14:59:56.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2785228baf2e8ac06f28079524512a65 Text-delta-base-sha1: 2f4c57672e1fd6bdc08d0849d46b367be1b469d2 Text-content-length: 416 Text-content-md5: 7be3bb175b1d2846898df9df0b4cf32e Text-content-sha1: 9e5f7b410be88e836802a11b1818e952147b6297 Content-length: 456 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNPM/cfdcpqLrD:Bwxigistatic HWND passphrase_box;passphrase_box = hwnd;passphrase_box = NULLif (passphrase_box) { MessageBeep(MB_ICONERROR); SetForegroundWindow(passphrase_box); break; }if (passphrase_box) SendMessage(passphrase_box, WM_CLOSE, 0, 0);if (passphrase_box) { MessageBeep(MB_ICONERROR); SetForegroundWindow(passphrase_box); break; } Revision-number: 1171 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2001-08-04T15:04:10.000000Z K 7 svn:log V 103 Rainer Loritz noticed that the Telnet environment box is not cleared when loading a new session. Oops! K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b86bd5a79dd0381f38321413b6fef717 Text-delta-base-sha1: ff679712f62b944cd2f2e0552ead8368e7cbbf5c Text-content-length: 86 Text-content-md5: 7eb2b5def1d81e48d798d59b7d498e40 Text-content-sha1: 478ffd7cbf8015e9c1e7d7fdc3c49b06b6171b0a Content-length: 127 K 15 cvs2svn:cvs-rev V 5 1.136 PROPS-END SVN6u <(SendDlgItemMessage(hwnd, IDV_ENVLIST, LB_RESETCONTENT, 0, 0) Revision-number: 1172 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2001-08-04T15:15:07.000000Z K 7 svn:log V 26 Glenn Maynard's IME patch K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a71510993eefcf911e9b7f08048ccb66 Text-delta-base-sha1: 69301bed6d74f2d8941183b577dd86693bca0468 Text-content-length: 27 Text-content-md5: bc42157fbc79df371c2f9c5717124eff Text-content-sha1: 1a8defdc91762abf36d8101dbbaa831f67cdbdcc Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVN/9 ]VY imm32 Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 67a6909a117034c369317bb30b763785 Text-delta-base-sha1: 536ce517a28023b85e41a39a4c758e0e736a53cc Text-content-length: 1687 Text-content-md5: d6942dcccd073c6cf8afae28e3689c09 Text-content-sha1: 2b491e18a4e05f6bdec11cbd1a58d28a749243fc Content-length: 1728 K 15 cvs2svn:cvs-rev V 5 1.143 PROPS-END SVNM&cT6>i ~static OSVERSIONINFOEX osVersion{ ZeroMemory(&osVersion, sizeof(osVersion)); osVersion.dwOSVersionInfoSize = sizeof(osVersion); if(!GetVersionEx ((OSVERSIONINFO *) &osVersion)) { // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. osVersion.dwOSVersionInfoSize = sizeof (osVersion); if (!GetVersionEx ( (OSVERSIONINFO *) &osVersion)) return FALSE; } }OMPOSITION: { HIMC hIMC; int n; char *buff; if(osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS || osVersion.dwPlatformId == VER_PLATFORM_WIN32s) break; /* no Unicode */ if ((lParam & GCS_RESULTSTR) == 0) /* Composition unfinished. */ break; /* fall back to DefWindowProc */ hIMC = ImmGetContext(hwnd); n = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0); if (n > 0) { buff = (char*) smalloc(n); ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, buff, n); luni_send((unsigned short *)buff, n / 2); free(buff); } ImmReleaseContext(hwnd, hIMC); return 1; } COMPOSITIONFORM cf; HIMC hIMC; if (!has_focus) return; SetCaretPos(x * font_width, y * font_height); /* IMM calls on Win98 and beyond only */ if(osVersion.dwPlatformId == VER_PLATFORM_WIN32s) return; /* 3.11 */ if(osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && osVersion.dwMinorVersion == 0) return; /* 95 */ /* we should have the IMM functions */ hIMC = ImmGetContext(hwnd); cf.dwStyle = CFS_POINT; cf.ptCurrentPos.x = x * font_width; cf.ptCurrentPos.y = y * font_height; ImmSetCompositionWindow(hIMC, &cf); ImmReleaseContext(hwnd, hIMC Revision-number: 1173 Prop-content-length: 126 Content-length: 126 K 7 svn:log V 26 Oops - IDC not IDV. Typo. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-04T15:22:52.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7eb2b5def1d81e48d798d59b7d498e40 Text-delta-base-sha1: 478ffd7cbf8015e9c1e7d7fdc3c49b06b6171b0a Text-content-length: 27 Text-content-md5: 544ea528c3b1c8ad6ba3d174018d3f57 Text-content-sha1: 85152a04f5563921f0083e666047d3368563fbca Content-length: 68 K 15 cvs2svn:cvs-rev V 5 1.137 PROPS-END SVNuu ,H-C Revision-number: 1174 Prop-content-length: 269 Content-length: 269 K 8 svn:date V 27 2001-08-04T15:45:25.000000Z K 7 svn:log V 168 Glenn Maynard's patch completely disabled PuTTY{,tel} on any system that didn't support OSVERSIONINFOEX. For example, such wildly out of date things as NT4. Now fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d6942dcccd073c6cf8afae28e3689c09 Text-delta-base-sha1: 2b491e18a4e05f6bdec11cbd1a58d28a749243fc Text-content-length: 58 Text-content-md5: 52fa1a9109f8dce5ff587c10be5f5860 Text-content-sha1: a39ebed83f3901a9b2cfdf8d91fe7e8a00962c63 Content-length: 99 K 15 cvs2svn:cvs-rev V 5 1.144 PROPS-END SVNMW$GOSVERSIONINFOEXOSVERSIONINFO Revision-number: 1175 Prop-content-length: 240 Content-length: 240 K 8 svn:date V 27 2001-08-07T08:42:17.000000Z K 7 svn:log V 139 Remove the OSVERSIONINFOEX code because there's no obvious way to determine whether it'll compile before receiving the compile error. Gah. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 52fa1a9109f8dce5ff587c10be5f5860 Text-delta-base-sha1: a39ebed83f3901a9b2cfdf8d91fe7e8a00962c63 Text-content-length: 268 Text-content-md5: f69e66a0c78fbbefa4fc7b0f8446e658 Text-content-sha1: a4b4f4607b75f73edcf65810808b8f55d7e2d29b Content-length: 309 K 15 cvs2svn:cvs-rev V 5 1.145 PROPS-END SVNW?l*n,l; (OSVERSIONINFO); if (!GetVersionEx ( (OSVERSIONINFO *) &osVersion)) { MessageBox(NULL, "Windows refuses to report a version", "PuTTY Fatal Error", MB_OK | MB_ICONEXCLAMATION); return 1; Revision-number: 1176 Prop-content-length: 381 Content-length: 381 K 8 svn:date V 27 2001-08-08T20:44:35.000000Z K 7 svn:log V 280 SSH port forwarding! How cool is that? Only currently works on SSH1; SSH2 should be doable but it's late and I have other things to do tonight. The Cool Guy award for this one goes to Nicolas Barry, for doing most of the work and actually understanding the code he was adding to. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bc42157fbc79df371c2f9c5717124eff Text-delta-base-sha1: 1a8defdc91762abf36d8101dbbaa831f67cdbdcc Text-content-length: 107 Text-content-md5: 0169e9d82d4fdf3a4e49010a59a002ac Text-content-sha1: 577f1c83dee5ff0292e945e319654d42db3a1d03 Content-length: 147 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVN9OO E^[portforwar portforward.$(OBJ): portforward.c network.h puttymem.h ssh.h putty.h Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f2b7d016b66b5050fe6ae3acb3edd04 Text-delta-base-sha1: cae08d869104e20c5135c7b76056fa7de4723c6f Text-content-length: 697 Text-content-md5: 5392638038d18d921562743004891d8f Text-content-sha1: 6a269832d7e6be40c80d769f5d3a127685785013 Content-length: 736 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN.'|VBzEa8Oe2 int (*accepting)(Plug p, struct sockaddr *addr, void *sock); /* * returns 0 if the host at address addr is a valid host for connecting or errorSocket sk_newlistenner(int port, Plug plug); Socket sk_register(void *sock, Plug plugdefine plug_accepting(p, addr, sock) (((*p)->accepting)(p, addr, sock/* * Set the `frozen' flag on a socket. A frozen socket is one in * which all sends are buffered and receives are ignored. This is * so that (for example) a new port-forwarding can sit in limbo * until its associated SSH channel is ready, and then pending data * can be sent on. */ void sk_set_frozen(Socket sock, int is_frozen); Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c4ae4687e41c030a77fec45a186c4d60 Text-delta-base-sha1: e2e3d883e76bf19e25cd116ae2813e2a626c8820 Text-content-length: 146 Text-content-md5: 5b8d6c4e36a2abeb9ff09cf3cc299a55 Text-content-sha1: f8920c0fc275bd1cb4aef92ff148f272fe54ebbf Content-length: 186 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNs , g[5 | FD_ACCEPT if (things.lNetworkEvents & FD_ACCEPT) connopen &= select_result(wp, (LPARAM) FD_ACCEPT); Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 133d60698dc3c40e5b3a61d77292618e Text-delta-base-sha1: 9eb916e196841cc5d1dcf82fd42c054f170701e7 Text-content-length: 222 Text-content-md5: 6ed855674d30fb5bcf2af1449532e085 Text-content-sha1: 82ef904f4c0fe042fafb770351580405db3e06ad Content-length: 263 K 15 cvs2svn:cvs-rev V 5 1.102 PROPS-END SVN)p FjF@i /* port forwarding */ int lport_acceptall; /* accepts connection from hosts other than localhost */ char portfwd[1024]; /* [LR]localport\thost:port\000[LR]localport\thost:port\000\000 */ Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 08a47237268a8cefeabd4f4d07bead8a Text-delta-base-sha1: 87049ebeea63e4c6f22ae2e0cdfb3183984d2f83 Text-content-length: 424 Text-content-md5: 59c0c9be96839c10b1575da57479347b Text-content-sha1: f9ad5e724fe6ebfd8c25770a5f3242ef781871eb Content-length: 464 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNJ{?f L>FUC  write_setting_i(sesskey, "LocalPortAcceptAll", cfg->lport_acceptall); { char buf[2 * sizeof(cfg->portfwd)], *p, *q; p = buf; q = cfg->portfwdPortForwardings", buf); }gppi(sesskey, "LocalPortAcceptAll", 0, &cfg->lport_acceptall); { char buf[2 * sizeof(cfg->portfwd)], *p, *q; gpps(sesskey, "PortForwardings", "", buf, sizeof(buf)); p = buf; q = cfg->portfwd Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d799c32689be9777099ff883613b2262 Text-delta-base-sha1: 847e1ae8b49c14c9c83819ba73d843f4612500a0 Text-content-length: 9910 Text-content-md5: 1bcc700c8eb2ba0c49a2d525e06c3a1b Text-content-sha1: 299d19ff2d677cc60996fd97710a10965d34b82b Content-length: 9951 K 15 cvs2svn:cvs-rev V 5 1.148 PROPS-END SVNjr ;UPfKX :3KGY Mm?3j$ejaextern char *pfd_newconnect(Socket * s, char *hostname, int port, void *c); extern char *pfd_addforward(char *desthost, int destport, int port); extern void pfd_close(Socket s); extern void pfd_send(Socket s, char *data, int len); extern void pfd_confirm(Socket s CHAN_SOCKDATA struct ssh_pfd_channel { Socket s; } pfd; } u; }; /* * 2-3-4 tree storing remote->local port forwardings (so we can * reject any attempt to open a port we didn't explicitly ask to * have forwarded). */ struct ssh_rportfwd { unsigned port; char host[256]tree234 *ssh_rportfwds;ssh_rportcmp(void *av, void *bv) { struct ssh_rportfwd *a = (struct ssh_rportfwd *) av; struct ssh_rportfwd *b = (struct ssh_rportfwd *) bv; int i; if ( (i = strcmp(a->host, b->host)) != 0) return i < 0 ? -1 : +1; if (a->port > b->portForwarded X11 connection terminated"); } else if (c->type == CHAN_SOCKDATA) { c->u.pfd.s = NULL; logevent("Forwarded port clos{ char type, *e; int n; int sport,dport; char sports[256], dports[256], host[256]; char buf[1024]; ssh_rportfwds = newtree234(ssh_rportcmp); /* Add port forwardings. */ e = cfg.portfwd; while (*e) { type = *e++; n = 0; while (*e && *e != '\t') sports[n++] = *e++; sports[n] = 0; if (*e == '\t') e++; n = 0; while (*e && *e != ':') host[n++] = *e++; host[n] = 0; if (*e == ':') e++; n = 0; while (*e) dports[n++] = *e++; dports[n] = 0; e++; dport = atoi(dports); sport = atoi(sports); if (sport && dport) { if (type == 'L') { pfd_addforward(host, dport, sport); sprintf(buf, "Local port %d forwarding to %s:%d", sport, host, dport); logevent(buf); } else { struct ssh_rportfwd *pf; pf = smalloc(sizeof(*pf)); strcpy(pf->host, host); pf->port = dport; if (add234(ssh_rportfwds, pf) != pf) { sprintf(buf, "Duplicate remote port forwarding to %s:%s", host, dport); logevent(buf); } else { sprintf(buf, "Requesting remote port %d forward to %s:%d", sport, host, dport); logevent(buf); send_packet(SSH1_CMSG_PORT_FORWARD_REQUEST, PKT_INT, sport, PKT_STR, host, PKT_INT, dport, PKT_END); } } }PORT_OPEN) { /* Remote side is trying to open a channel to talk to a * forwarded port. Give them back a local channel number. */ struct ssh_channel *c; struct ssh_rportfwd pf; int hostsize, port; char host[256], buf[1024]; char *p, *h, *e; c = smalloc(sizeof(struct ssh_channel)); hostsize = GET_32BIT(pktin.body+4); for(h = host, p = pktin.body+8; hostsize != 0; hostsize--) { if (h+1 < host+sizeof(host)) *h++ = *p; *p++; } *h = 0; port = GET_32BIT(p); strcpy(pf.host, host); pf.port = port; if (find234(ssh_rportfwds, &pf, NULL) == NULL) { sprintf(buf, "Rejected remote port open request for %s:%d", host, port); logevent(buf); send_packet(SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(pktin.body), PKT_END); } else { sprintf(buf, "Received remote port open request for %s:%d", host, port); logevent(buf); e = pfd_newconnect(&c->u.pfd.s, host, port, c); if (e != NULL) { char buf[256]; sprintf(buf, "Port open failed: %s", e); logevent(bufSOCKDATAForwarded port opened successfully"); } } } else if (pktin.type == SSH1_MSG_CHANNEL_OPEN_CONFIRMATION) { unsigned int remoteid = GET_32BIT(pktin.body); unsigned int localid = GET_32BIT(pktin.body+4); struct ssh_channel *c; c = find234(ssh_channels, &remoteid, ssh_channelfind); if (c) { c->remoteid = localid; pfd_confirm(c->u.pfd.s); } else { sshfwd_close(c); } Forwarded X11 connection terminated"); assert(c->u.x11.s != NULL); x11_close(c->u.x11.s); c->u.x11.s = NULL; } if ((c->closes == 0) && (c->type == CHAN_SOCKDATA)) { logevent("Forwarded port closed"); assert(c->u.pfd.s != NULL); pfd_close(c->u.pfd.s); c->u.pfdSOCKDATA: pfd_send(c->u.pfd.s, p, len); vK$5@{C^TKeintf(pwprompt, "%.90s@%.90s's password: ", username, savedhost); need_pw = TRUE; } if (need_pw) { if (ssh_get_line) { if (!ssh_get_line(pwprompt, password, sizeof(password), TRUE)) { /* * get_line failed to get a password (for * example because one was supplied on the * command line which has already failed to * work). Terminate. */ ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring ("No more passwords available to try"); ssh2_pkt_addstring("en"); /* language tag */ ssh2_pkt_send(); connection_fatal("Unable to authenticate"); ssh_state = SSH_STATE_CLOSED; crReturnV; } } else { static int pos = 0; static char c; c_write_str(pwprompt); ssh_send_ok = 1; pos = 0; while (pos >= 0) { crWaitUntilV(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: password[pos] = 0; pos = -1; break; case 8: case 127: if (pos > 0) pos--; break; case 21: case 27: pos = 0; break; case 3: case 4: random_save_seed(); exit(0); break; default: if (pos < sizeof(password)-1) password[pos++] = c; break; } } c_write_str("\r\n"); } } if (method == AUTH_PUBLICKEY_FILE) { /* * We have our passphrase. Now try the actual authentication. */ struct ssh2_userkey *key; key = ssh2_load_userkey(cfg.keyfile, password); if (key == SSH2_WRONG_PASSPHRASE || key == NULL) { if (key == SSH2_WRONG_PASSPHRASE) { c_write_str("Wrong passphrase\r\n"); tried_pubkey_config = FALSE; } else { c_write_str("Unable to load private key\r\n"); tried_pubkey_config = TRUE; } /* Send a spurious AUTH_NONE to return to the top. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("none"); /* method */ ssh2_pkt_send(); type = AUTH_TYPE_NONE; } else { unsigned char *blob, *sigdata; int blob_len, sigdata_len; /* * We have loaded the private key and the server * has announced that it's willing to accept it. * Hallelujah. Generate a signature and send it. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(TRUE); ssh2_pkt_addstring(key->alg->name); blob = key->alg->public_blob(key->data, &blob_len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(blob, blob_len); sfree(blob); /* * The data to be signed is: * * string session-id * * followed by everything so far placed in the * outgoing packet. */ sigdata_len = pktout.length - 5 + 4 + 20; sigdata = smalloc(sigdata_len); PUT_32BIT(sigdata, 20); memcpy(sigdata + 4, ssh2_session_id, 20); memcpy(sigdata + 24, pktout.data + 5, pktout.length - 5); blob = key->alg->sign(key->data, sigdata, sigdata_len, &blob_len); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(blob, blob_len); sfree(blob); sfree(sigdata); ssh2_pkt_send(); type = AUTH_TYPE_PUBLICKEY; } } else if (method == AUTH_PASSWORD) { /* * We send the password packet lumped tightly together with * an SSH_MSG_IGNORE packet. The IGNORE packet contains a * string long enough to make the total length of the two * packets constant. This should ensure that a passive * listener doing traffic analyis can't work out the length * of the password. * * For this to work, we need an assumption about the * maximum length of the password packet. I think 256 is * pretty conservative. Anyone using a password longer than * that probably doesn't have much to worry about from * people who find out how long their password is! */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("password"); ssh2_pkt_addbool(FALSE); ssh2_pkt_addstring(password); ssh2_pkt_defer(); /* * We'll include a string that's an exact multiple of the * cipher block size. If the cipher is NULL for some * reason, we don't do this trick at all because weSOCKDATA: pfd_send(c->u.pfd.s, data, length); else if (c->type == CHAN_SOCKDATA) { pfd_close(c->u.pfd.s); case CHAN_SOCKDATA: void *new_sock_channel(Socket s) { struct ssh_channel *c; c = smalloc(sizeof(struct ssh_channel)); if (c) { c->remoteid = GET_32BIT(pktin.body); c->localid = alloc_channel_id(); c->closes = 0; c->type = CHAN_SOCKDATA; /* identify channel type */ c->u.pfd.s = s; add234(ssh_channels, c); } return c; } void ssh_send_port_open(void *channel, char *hostname, int port, char *org) { struct ssh_channel *c = (struct ssh_channel *)channel; char buf[1024]; sprintf(buf, "Opening forwarded connection to %.512s:%d", hostname, port); logevent(buf); send_packet(SSH1_MSG_PORT_OPEN, PKT_INT, c->localid, PKT_STR, hostname, PKT_INT, port, //PKT_STR, org, PKT_END); } Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 193b5e969ccf8db34253aaa034146543 Text-delta-base-sha1: a5b02e4a0bbaeb54459b7fb337c0d84c13d4c155 Text-content-length: 258 Text-content-md5: 9239733b221d447c9804d711aeed4d42 Text-content-sha1: 9eea048dc219ea80fe1e78d706b97ce4d49c0596 Content-length: 298 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNEd;'(V_P4#include #include "puttymem.h" #include "networkvoid *new_sock_channel(Socket s); // allocates and register a new channel for port forwarding void ssh_send_port_open(void *channel, char *hostname, int port, char *org Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a2d876bc5494f1ad73b6a676a21ae6d9 Text-delta-base-sha1: 505b7433975ea06747e3422c52096c37b68e04be Text-content-length: 1155 Text-content-md5: 53f262e0fc9ef742034fef9d835350f7 Text-content-sha1: c57ab68952ba1498feffb148e6a35f074b649b27 Content-length: 1194 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN]P%t -bk:C$px<]lK'v?z;bgb@static void radioline_common(struct ctlpos *cp, int nacross, va_list ap) { RECT r; int group; int i; char *btext; cp->ypos += r.bottomradioline_common(cp, nacross, ap); va_end(ap); } /* * A set of radio buttons on the same line, without a static above * them. Otherwise just like radioline. */ void bareradioline(struct ctlpos *cp, int nacross, ...) { va_list ap; va_start(ap, nacross); radioline_common(cp, nacross, ap); va_end(ap) /* * Another special control: the forwarding options setter. First a * list box; next a static header line, introducing a pair of edit * boxes with associated statics, another button, and a radio * button pair. */ void fwdsetter(struct ctlpos *cp, int listidchar *btext, int b5, 35, 15, 25 }; int i, j, xpos, percent; const int LISTHEIGHT = 42BETWEEN, WS_EX_CLIENTEDGE, "", listid)statics+edits+buttons. */ for (j = 0; j < 2; j++) { percent = 0; for (i = 0; i < (j ? 2 : 4)if (j==1 && i==1) percent = 100btext, bid); } } cp->ypos += height + GAPWITHIN; } } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 544ea528c3b1c8ad6ba3d174018d3f57 Text-delta-base-sha1: 85152a04f5563921f0083e666047d3368563fbca Text-content-length: 2827 Text-content-md5: d63a80bab5d6a9c8926312c7cac9374c Text-content-sha1: 9f4aabf63fba153075738d21ed6592f32e4e2874 Content-length: 2868 K 15 cvs2svn:cvs-rev V 5 1.138 PROPS-END SVNuboEjbF,F>7ADTY@<|Q@lVp)T6.`oOL)1, IDC_BOX_TUNNELS2, IDC_X11_FORWARD, IDC_X11_DISPSTATIC, IDC_X11_DISPLAY, IDC_LPORT_ALL, IDC_PFWDSTATIC, IDC_PFWDSTATIC2, IDC_PFWDREMOVE, IDC_PFWDLIST, IDC_PFWDADD, IDC_SPORTSTATIC, IDC_SPORTEDIT, IDC_DPORTSTATIC, IDC_DPORTEDIT, IDC_PFWDLOCAL, IDC_PFWDREMOTE, p = cfg.portfwd; while (*p) { SendDlgItemMessage(hwnd, IDC_PFWD CheckDlgButton(hwnd, IDC_LPORT_ALL, cfg.lport_acceptall); CheckRadioButton(hwnd, IDC_PFWDLOCAL, IDC_PFWDREMOTE, IDC_PFWDLOCALdeilmrst", IDC_BOX_TUNNELS1 beginbox(&cp, "Port forwarding", IDC_BOX_TUNNELS2); checkbox(&cp, "Local ports accept connections from o&ther hosts", IDC_LPORT_ALL); staticbtn(&cp, "Forwarded ports:", IDC_PFWDSTATIC, "&Remove", IDC_PFWDREMOVE); fwdsetter(&cp, IDC_PFWDLIST, "Add new forwarded port:", IDC_PFWDSTATIC2, "&Source port", IDC_SPORTSTATIC, IDC_SPORTEDIT, "Dest&ination", IDC_DPORTSTATIC, IDC_DPORTEDIT, "A&dd", IDC_PFWDADD); bareradioline(&cp, 2, "&Local", IDC_PFWDLOCAL, "Re&mote", IDC_PFWDREMOTE, NULL); endbox(&cp); LPORT_ALLlport_acceptall = IsDlgButtonChecked(hwnd, IDC_LPORT_ALL case IDC_PFWDADD { char str[sizeof(cfg.portfwd)]; char *p; if (IsDlgButtonChecked(hwnd, IDC_PFWDLOCAL)) str[0] = 'L'; else str[0] = 'R'; GetDlgItemText(hwnd, IDC_SPORTEDIT, str+1, sizeof(str) - 2); if (!str[1]) { MessageBox(hwnd, "You need to specify a source port number", "PuTTY Error", MB_OK | MB_ICONERROR); break; } p = str + strlen(str); *p++ = '\t'; GetDlgItemText(hwnd, IDC_DPORTEDIT, p, sizeof(str) - 1 - (p - str)); if (!*p || !strchr(p, ':')) { MessageBox(hwnd, "You need to specify a destination address\n" "in the form \"host.name:port\"", "PuTTY Error", MB_OK | MB_ICONERROR); break; } p = cfg.portfwd; while (*p) { while (*p) p++; p++; } if ((p - cfg.portfwd) + strlen(str) + 2 < sizeof(cfg.portfwdPFWDLIST, LB_ADDSTRING, 0, (LPARAM) str); SetDlgItemText(hwnd, IDC_SPORTEDIT, ""); SetDlgItemText(hwnd, IDC_DPORTEDIT, ""); } else { MessageBox(hwnd, "Too many forwardings", "PuTTY Error", MB_OK | MB_ICONERROR); } } break; case IDC_PFWDREMOVE: if ( = SendDlgItemMessage(hwnd, IDC_PFWDLIST, LB_GETCURSEL, 0, 0); if (i == LB_ERR) MessageBeep(0); else { char *p, *q; SendDlgItemMessage(hwnd, IDC_PFWDLIST, LB_DELETESTRING, i, 0); p = cfg.portfwd; while (i > 0) { if (!*p) goto disaster222:; } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f69e66a0c78fbbefa4fc7b0f8446e658 Text-delta-base-sha1: a4b4f4607b75f73edcf65810808b8f55d7e2d29b Text-content-length: 38 Text-content-md5: 81cc16a5901b6192a36e6f09950cc61e Text-content-sha1: f9c3d47c4067db0c47aaee1bee320d259b5e36b4 Content-length: 79 K 15 cvs2svn:cvs-rev V 5 1.146 PROPS-END SVN?K pOp | FD_ACCEPT Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 413784ed551d2753aef8632765c24007 Text-delta-base-sha1: 1ac9fe9c8c526a071a431c86bbe3a2b84e87be29 Text-content-length: 1616 Text-content-md5: b53611e3b88adf501454d7adaf3d0df2 Text-content-sha1: 1209d938c20d58fa74bdf67e69ca2439df0d73f8 Content-length: 1656 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNc2#X+P2Rh,#}E$w3\8ZQ:zO9NX>FM4lZ{aT&Zm:TCfrozen; /* this tells the write stuff not to even bother trying to send at this point */extern char *do_select(SOCKET skt, int startup); Socket sk_register(void *sock,DWORD err; char *errstr; Actual_Socket re ret->frozen = 1; ret->s = (SOCKET)sock; if (ret->s == INVALID_SOCKETret->oobinline = 0;ret-> ret->frozenSocket sk_newlistenner(int port,int retcode; int on = 10; /* to start with */ ret->sending_oob = 0; ret->frozen = 0; /* * Open socket. */ s = socket(AF_INET0; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)); (short)} else { err = WSAGetLastError(); if (listen(s, SOMAXCONN) == SOCKET_ERROR) { closesocket(sif (s->frozen) return; /* In the case the socket is still frozen, we don't even bother */ if (s->frozen) break; case FD_ACCEPT: { struct sockaddr isa; int addrlen = sizeof(struct sockaddr); SOCKET t; /* socket of connection */ memset(&isa, 0, sizeof(struct sockaddr)); err = 0; t = accept(s->s,&isa,&addrlen); if (t == INVALID_SOCKET) { err = WSAGetLastError(); if (err == WSATRY_AGAIN) break; } if (plug_accepting(s->plug, &isa, (void*)t)) { closesocket(t); // denied or error } }void sk_set_frozen(Socket sock, int is_frozen) { Actual_Socket s = (Actual_Socket) sock; s->frozen = is_frozen; if (!is_frozen) { char c; recv(s->s, &c, 1, MSG_PEEK); } Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c4e3342e731528c30ae97ad89cf61b67 Text-delta-base-sha1: 4a62b1d79d654faffea989919c53bb8a51701490 Text-content-length: 125 Text-content-md5: cd495c5fbcdde688e3f20d0fa10fee8c Text-content-sha1: 67b9f308ffa508154b4bd59fde35577cdc3a6293 Content-length: 164 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNXLbe Kxbareradioline(struct ctlpos *cpvoid fwdsetter(struct ctlpos *cp, int listidchar *btext, int bid); Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 56c19ae6553fd1357922be75419fbc66 Text-delta-base-sha1: 5059500a37caa6f7ab51dec3f9b6321fadd4aa8b Text-content-length: 92 Text-content-md5: 72902cca634f4dad1a5656b4eade2c43 Text-content-sha1: 781247b1963fa8393645782ce6421540769dec87 Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN FJF if (!s) return; pr = (struct X11Private *) sk_get_private_ptr(s); Revision-number: 1177 Prop-content-length: 224 Content-length: 224 K 8 svn:date V 27 2001-08-08T20:53:27.000000Z K 7 svn:log V 123 Oops - actually check in portfwd.c itself! (Makefile also modified because it's been renamed to fit in 8.3, just in case.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0169e9d82d4fdf3a4e49010a59a002ac Text-delta-base-sha1: 577f1c83dee5ff0292e945e319654d42db3a1d03 Text-content-length: 45 Text-content-md5: 1ffd3622110f11107be5317139643229 Text-content-sha1: 24e6ade289491bac2ae6fc785740735f50434be2 Content-length: 85 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVNU wwd.$(OBJ): portfw Node-path: putty/portfwd.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5833 Text-content-md5: ad813754641b2c112a7df4c1b052baae Text-content-sha1: 78db741b3d878c2d11fc7e325d81ae72a3fd093c Content-length: 5949 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN;;;#include #include #include #include "putty.h" #include "ssh.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define GET_32BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8) | \ ((unsigned long)(unsigned char)(cp)[2] << 16) | \ ((unsigned long)(unsigned char)(cp)[3] << 24)) #define PUT_32BIT_LSB_FIRST(cp, value) ( \ (cp)[0] = (value), \ (cp)[1] = (value) >> 8, \ (cp)[2] = (value) >> 16, \ (cp)[3] = (value) >> 24 ) #define GET_16BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8)) #define PUT_16BIT_LSB_FIRST(cp, value) ( \ (cp)[0] = (value), \ (cp)[1] = (value) >> 8 ) #define GET_32BIT_MSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) #define PUT_32BIT_MSB_FIRST(cp, value) ( \ (cp)[0] = (value) >> 24, \ (cp)[1] = (value) >> 16, \ (cp)[2] = (value) >> 8, \ (cp)[3] = (value) ) #define GET_16BIT_MSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 8) | \ ((unsigned long)(unsigned char)(cp)[1])) #define PUT_16BIT_MSB_FIRST(cp, value) ( \ (cp)[0] = (value) >> 8, \ (cp)[1] = (value) ) extern void sshfwd_close(void *); extern void sshfwd_write(void *, char *, int); struct pfwd_queue { struct pfwd_queue *next; char *buf; }; struct PFwdPrivate { struct plug_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ void *c; /* (channel) data used by ssh.c */ Socket s; char hostname[128]; int port; int ready; struct pfwd_queue *waiting; }; void pfd_close(Socket s); static int pfd_closing(Plug plug, char *error_msg, int error_code, int calling_back) { struct PFwdPrivate *pr = (struct PFwdPrivate *) plug; /* * We have no way to communicate down the forwarded connection, * so if an error occurred on the socket, we just ignore it * and treat it like a proper close. */ sshfwd_close(pr->c); pfd_close(pr->s); return 1; } static int pfd_receive(Plug plug, int urgent, char *data, int len) { struct PFwdPrivate *pr = (struct PFwdPrivate *) plug; if (pr->ready) sshfwd_write(pr->c, data, len); return 1; } /* * Called when receiving a PORT OPEN from the server */ char *pfd_newconnect(Socket *s, char *hostname, int port, void *c) { static struct plug_function_table fn_table = { pfd_closing, pfd_receive, NULL }; SockAddr addr; char *err, *dummy_realhost; struct PFwdPrivate *pr; /* * Try to find host. */ addr = sk_namelookup(hostname, &dummy_realhost); if ((err = sk_addr_error(addr))) return err; /* * Open socket. */ pr = (struct PFwdPrivate *) smalloc(sizeof(struct PFwdPrivate)); pr->fn = &fn_table; pr->ready = 1; pr->c = c; pr->s = *s = sk_new(addr, port, 0, 1, (Plug) pr); if ((err = sk_socket_error(*s))) { sfree(pr); return err; } sk_set_private_ptr(*s, pr); sk_addr_free(addr); return NULL; } /* called when someone connects to the local port */ static int pfd_accepting(Plug p, struct sockaddr *addr, void *sock) { /* for now always accept this socket */ static struct plug_function_table fn_table = { pfd_closing, pfd_receive, NULL }; struct PFwdPrivate *pr, *org; struct sockaddr_in *sin = (struct sockaddr_in *)addr; Socket s; char *err; if (ntohl(sin->sin_addr.s_addr) != 0x7F000001 && !cfg.lport_acceptall) return 1; /* denied */ org = (struct PFwdPrivate *)p; pr = (struct PFwdPrivate *) smalloc(sizeof(struct PFwdPrivate)); pr->fn = &fn_table; pr->c = NULL; pr->s = s = sk_register(sock, (Plug) pr); if ((err = sk_socket_error(s))) { sfree(pr); return err != NULL; } pr->c = new_sock_channel(s); strcpy(pr->hostname, org->hostname); pr->port = org->port; pr->ready = 0; pr->waiting = NULL; sk_set_private_ptr(s, pr); if (pr->c == NULL) { sfree(pr); return 1; } else { /* asks to forward to the specified host/port for this */ ssh_send_port_open(pr->c, pr->hostname, pr->port, "forwarding"); } return 0; } /* Add a new forwarding from port -> desthost:destport sets up a listenner on the local machine on port */ char *pfd_addforward(char *desthost, int destport, int port) { static struct plug_function_table fn_table = { pfd_closing, pfd_receive, /* should not happen... */ pfd_accepting }; char *err; struct PFwdPrivate *pr; Socket s; /* * Open socket. */ pr = (struct PFwdPrivate *) smalloc(sizeof(struct PFwdPrivate)); pr->fn = &fn_table; pr->c = NULL; strcpy(pr->hostname, desthost); pr->port = destport; pr->ready = 0; pr->waiting = NULL; pr->s = s = sk_newlistenner(port, (Plug) pr); if ((err = sk_socket_error(s))) { sfree(pr); return err; } sk_set_private_ptr(s, pr); return NULL; } void pfd_close(Socket s) { struct PFwdPrivate *pr; if (!s) return; pr = (struct PFwdPrivate *) sk_get_private_ptr(s); sfree(pr); sk_close(s); } /* * Called to send data down the raw connection. */ void pfd_send(Socket s, char *data, int len) { struct PFwdPrivate *pr = (struct PFwdPrivate *) sk_get_private_ptr(s); if (s == NULL) return; sk_write(s, data, len); } void pfd_confirm(Socket s) { struct PFwdPrivate *pr = (struct PFwdPrivate *) sk_get_private_ptr(s); if (s == NULL) return; pr->ready = 1; sk_set_frozen(s, 0); sk_write(s, NULL, 0); } Revision-number: 1178 Prop-content-length: 164 Content-length: 164 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-09T20:13:17.000000Z K 7 svn:log V 64 Keyboard-interactive authentication, thanks to Paul Sokolovsky. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1bcc700c8eb2ba0c49a2d525e06c3a1b Text-delta-base-sha1: 299d19ff2d677cc60996fd97710a10965d34b82b Text-content-length: 3925 Text-content-md5: 10f623cb79129416d2104e08da5f9797 Text-content-sha1: 61f26391a1d34c27ddaaa802f3aeaa3d98913ba8 Content-length: 3966 K 15 cvs2svn:cvs-rev V 5 1.149 PROPS-END SVN-WkljVrHOB.USERAUTH_INFO_REQUEST 60 /* 0x3c */ #define SSH2_MSG_USERAUTH_INFO_RESPONSE 61 /* 0x3d, AUTH_KEYBOARD_INTERACTIVE, AUTH_TYPE_KEYBOARD_INTERACTIVE } type; static int gotit, need_pw, can_pubkey, can_passwd, can_keyb_inter; static int tried_pubkey_config, tried_agent, tried_keyb_inter; static int we_are_in; static int num_prompts, echo can_passwd = in_commasep_string("password", methods, methlen); can_keyb_inter = in_commasep_string("keyboard-interactivekeyb_inter && !tried_keyb_inter) { method = AUTH_KEYBOARD_INTERACTIVE; type = AUTH_TYPE_KEYBOARD_INTERACTIVE; tried_keyb_inter = TRUE; ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("keyboard-interactive"); /* method */ ssh2_pkt_addstring(""); /* lang */ ssh2_pkt_addstring(""); ssh2_pkt_send(); crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_INFO_REQUEST) { if (pktin.type == SSH2_MSG_USERAUTH_FAILURE) gotit = TRUE; logevent("Keyboard-interactive authentication refused"); type = AUTH_TYPE_KEYBOARD_INTERACTIVE; continue; } /* We've got packet with that "interactive" info dump banners, and set its prompt as ours */ { char *name, *inst, *lang, *prompt; int name_len, inst_len, lang_len, prompt_len; ssh2_pkt_getstring(&name, &name_len); ssh2_pkt_getstring(&inst, &inst_len); ssh2_pkt_getstring(&lang, &lang_len); if (name_len > 0) c_write_untrusted(name, name_len); if (inst_len > 0) c_write_untrusted(inst, inst_len); num_prompts = ssh2_pkt_getuint32(); ssh2_pkt_getstring(&prompt, &prompt_len); strncpy(pwprompt, prompt, sizeof(pwprompt)); need_pw = TRUE; echo = ssh2_pkt_getbool(); } }KJHd d~*I1e { logevent ("Pageant failed to answer challenge"); sfree(ret); } } } if (authed) continue; } } if (!method && can_pubkey && *cfg.keyfile && !tried_pubkey_config) { unsigned char *pub_blob; char *algorithm, *comment; int pub_blob_len; tried_pubkey_config = TRUE; /* * Try the public key supplied in the configuration. * * First, offer the public blob to see if the server is * willing to accept it. */ pub_blob = ssh2_userkey_loadpub(cfg.keyfile, &algorithm, &pub_blob_len); if (pub_blob) {FALSE); /* no signature included */ ssh2_pkt_addstring(algorithm); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pub_blob, pub_blob_len); ssh2_pkt_send(); logevent("Offered public key"); /* FIXME */ crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) { gotit = TRUE; type = AUTH_TYPE_PUBLICKEY_OFFER_LOUD; continue; /* key refused; give up on it */ } logevent("Offer of public key accepted"); /* * Actually attempt a serious authentication using * the key. */ if (ssh2_userkey_encrypted(cfg.keyfile, &comment)) { sprintf(pwprompt, "Passphrase for key \"%.100s\": ", comment); need_pw = TRUE; } else { need_pw = FALSE; } c_write_str("Authenticating with public key \""); c_write_str(comment); c_write_str("\"\r\n"); method = AUTH_PUBLICKEY_FILE; } } if (!method && can_passwd) { method = AUTH_PASSWORD; spruntrusted(pwprompt, strlen(pwprompt)if (method == AUTH_KEYBOARD_INTERACTIVE) { ssh2_pkt_init(SSH2_MSG_USERAUTH_INFO_RESPONSE); ssh2_pkt_adduint32(num_prompts); ssh2_pkt_addstring(password); memset(password, 0, sizeof(password)); ssh2_pkt_send(); type = AUTH_TYPE_KEYBOARD_INTERACTIVE Revision-number: 1179 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2001-08-09T21:17:05.000000Z K 7 svn:log V 53 Port forwarding now works in SSH 2 as well as SSH 1. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 10f623cb79129416d2104e08da5f9797 Text-delta-base-sha1: 61f26391a1d34c27ddaaa802f3aeaa3d98913ba8 Text-content-length: 8925 Text-content-md5: 1a636bab9456af5d730ad63e414a2bae Text-content-sha1: a634252e45911507fa096141b0eb64319f3a1416 Content-length: 8966 K 15 cvs2svn:cvs-rev V 5 1.150 PROPS-END SVNVg+H0+gr,Y0YGvXXN#=cZ|O@fY, CHAN_SOCKDATA_DORMANT /* one the remote hasn't confirmed */. SSH 1 and SSH * 2 use this structure in different ways, reflecting SSH 2's * altogether saner approach to port forwarding. * * In SSH 1, you arrange a remote forwarding by sending the server * the remote port number, and the local destination host:port. * When a connection comes in, the server sends you back that * host:port pair, and you connect to it. This is a ready-made * security hole if you're not on the ball: a malicious server * could send you back _any_ host:port pair, so if you trustingly * connect to the address it gives you then you've just opened the * entire inside of your corporate network just by connecting * through it to a dodgy SSH server. Hence, we must store a list of * host:port pairs we _are_ trying to forward to, and reject a * connection request from the server if it's not in the list. * * In SSH 2, each side of the connection minds its own business and * doesn't send unnecessary information to the other. You arrange a * remote forwarding by sending the server just the remote port * number. When a connection comes in, the server tells you which * of its ports was connected to; and _you_ have to remember what * local host:port pair went with that port number. * * Hence: in SSH 1 this structure stores host:port pairs we intend * to allow connections to, and is indexed by those host:port * pairs. In SSH 2 it stores a mapping from source port to * destination host:port pair, and is indexed by source port. */ struct ssh_rportfwd { unsigned sport, dport; char d_ssh1dhost, b->dhost)) != 0) return i < 0 ? -1 : +1; if (a->dport > b->dport) return +1; if (a->dport < b->dport) return -1; return 0; } static int ssh_rportcmp_ssh2a->sport > b->sport) return +1; if (a->sport < b->sport) return -_ssh1dhost, host); pf->d sfree(pdhost, host); pf.dunsigned int remoteid = GET_32BIT(pktin.body); unsigned int localid = GET_32BIT(pktin.body+4); struct ssh_channel *c; c = find234(ssh_channels, &remoteid, ssh_channelfind); if (c && c->type == CHAN_SOCKDATA_DORMANT) { c->remoteid = localid; c->type = CHAN_SOCKDATA; pfd_confirm(c->u.pfd.s); pfd_send(c->u.pfd.s, p, len); JwldBk[ABBve\1whBVB.`7z+gcZ7kt_send(); crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) { logevent("Key refused"); continue; } if (flags & FLAG_VERBOSE) { c_write_str ("Authenticating with public key \""); c_write(commentp, commentlen); c_write_str("\" from agent\r\n"); } /* * Server is willing to accept the key. * Construct a SIGN_REQUEST. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(username); ssh2_pkt_addstring("publickey"); /* method */ ssh2_pkt_addbool(TRUE); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(alg, alglen); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(pkblob, pklen); siglen = pktout.length - 5 + 4 + 20; len = 1; /* message type */ len += 4 + pklen; /* key blob */ len += 4 + siglen; /* data to sign */ len += 4; /* flags */ agentreq = smalloc(4 + len); PUT_32BIT(agentreq, len); q = agentreq + 4; *q++ = SSH2_AGENTC_SIGN_REQUEST; PUT_32BIT(q, pklen); q += 4; memcpy(q, pkblob, pklen); q += pklen; PUT_32BIT(q, siglen); q += 4; /* Now the data to be signed... */ PUT_32BIT(q, 20); q += 4; memcpy(q, ssh2_session_id, 20); q += 20; memcpy(q, pktout.data + 5, pktout.length - 5); q += pktout.length - 5; /* And finally the (zero) flags word. */ PUT_32BIT(q, 0); agent_query(agentreq, len + 4, &vret, &retlen); ret = vret; sfree(agentreq); if (ret) { if (ret[4] == SSH2_AGENT_SIGN_RESPONSE) { logevent("Sending Pageant's response"); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(ret + 9, GET_32BIT(ret + 5)); ssh2_pkt_send(); authed = TRUE; break; } elsEnable port forwardings. */ { static char *e; /* preserve across crReturn */ char type; int n; int sport,dport; char sports[256], dports[256], host[256]; char buf[1024]; ssh_rportfwds = newtree234(ssh_rportcmp_ssh2); /* Add port forwardings. */ e = cfg.portfwd; while (*e) { type = *e++; n = 0; while (*e && *e != '\t') sports[n++] = *e++; sports[n] = 0; if (*e == '\t') e++; n = 0; while (*e && *e != ':') host[n++] = *e++; host[n] = 0; if (*e == ':') e++; n = 0; while (*e) dports[n++] = *e++; dports[n] = 0; e++; dport = atoi(dports); sport = atoi(sports); if (sport && dport) { if (type == 'L') { pfd_addforward(host, dport, sport); sprintf(buf, "Local port %d forwarding to %s:%d", sport, host, dport); logevent(buf); } else { struct ssh_rportfwd *pf; pf = smalloc(sizeof(*pf)); strcpy(pf->dhost, host); pf->dport = dport; pf->sport = sport; if (add234(ssh_rportfwds, pf) != pf) { sprintf(buf, "Duplicate remote port forwarding to %s:%s", host, dport); logevent(buf); sfree(pf); } else { sprintf(buf, "Requesting remote port %d (forwarded to %s:%d)", sport, host, dport); logevent(buf); ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST); ssh2_pkt_addstring("tcpip-forward"); ssh2_pkt_addbool(1);/* want reply */ ssh2_pkt_addstring("127.0.0.1"); ssh2_pkt_adduint32(sport); ssh2_pkt_send(); do { crWaitUntilV(ispkt); if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh2_pkt_getuint32(); struct ssh_channel *c; c = find234(ssh_channels, &i, ssh_channelfind); if (!c) continue;/* nonexistent channel */ c->v2.remwindow += ssh2_pkt_getuint32(); } } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin.type != SSH2_MSG_REQUEST_SUCCESS) { if (pktin.type != SSH2_MSG_REQUEST_FAILURE) { bombout(("Server got confused by port forwarding request")); crReturnV; } logevent("Server refused this port forwarding"); } else { logevent("Remote port forwarding enabled"); } } } }pfd_send(c->u.pfd.s, data, length); pfd_close(c->u.pfd.s); _CONFIRMATIONif (c->type != CHAN_SOCKDATA_DORMANT) continue; /* dunno why they're confirming this */ c->remoteid = ssh2_pkt_getuint32(); c->type = CHAN_SOCKDATA; c->closes = 0; c->v2.remwindow = ssh2_pkt_getuint32(); c->v2.remmaxpkt = ssh2_pkt_getuint32(); c->v2.outbuffer = NULL; c->v2.outbuflen = c->v2.outbufsize = 0; pfd_confirm(c->u.pfd.s)unsigned remid, winsize, pktsize; ssh2_pkt_getstring(&type, &typelen); c = smalloc(sizeof(struct ssh_channel)); remid = ssh2_pkt_getuint32(); winsize = ssh2_pkt_getuint32(); pktsize = ssh2_pkt_getuint32(15 && !memcmp(type, "forwarded-tcpip", 15)) { struct ssh_rportfwd pf, *realpf; char *dummy; int dummylen; ssh2_pkt_getstring(&dummy, &dummylen);/* skip address */ pf.sport = ssh2_pkt_getuint32(); realpf = find234(ssh_rportfwds, &pf, NULL); if (realpf == NULL) { error = "Remote port is not recognised"; } else { char *e = pfd_newconnect(&c->u.pfd.s, realpf->dhost, realpf->dport, c); char buf[1024]; sprintf(buf, "Received remote port open request for %s:%d", realpf->dhost, realpf->dport); logevent(buf); if (e != NULL) { sprintf(buf, "Port open failed: %s", e); logevent(buf); error = "Port open failed"; } else { logevent("Forwarded port opened successfully"); c->type = CHAN_SOCKDATA; }remidwinsize; c->v2.remmaxpkt = pktsize-1; /* to be set when open confirmed */ c->localid = alloc_channel_id(); c->closes = 0; c->type = CHAN_SOCKDATA_DORMANT;if (ssh_version == 1) { send_packet(SSH1_MSG_PORT_OPEN, PKT_INT, c->localid, PKT_STR, hostname, PKT_INT, port, //PKT_STR, , PKT_END); } else { ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring("direct-tcpip"); ssh2_pkt_adduint32(c->localid); ssh2_pkt_adduint32(0x8000UL); /* our window size */ ssh2_pkt_adduint32(0x4000UL); /* our max pkt size */ ssh2_pkt_addstring(hostname); ssh2_pkt_adduint32(port); /* * We make up values for the originator data; partly it's * too much hassle to keep track, and partly I'm not * convinced the server should be told details like that * about my local network configuration. */ ssh2_pkt_addstring("client-side-connection"); ssh2_pkt_adduint32(0); ssh2_pkt_send(); } Revision-number: 1180 Prop-content-length: 411 Content-length: 411 K 7 svn:log V 310 Stop yelling about Access Denied if the server refuses even to attempt keyboard-interactive authentication. We can yell about it if we make a creditable attempt and are rejected, but if the server just refuses to even consider it then the user won't really want to know (and if they do there's the Event Log). K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-09T21:22:38.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1a636bab9456af5d730ad63e414a2bae Text-delta-base-sha1: a634252e45911507fa096141b0eb64319f3a1416 Text-content-length: 231 Text-content-md5: 35468b90950b44f63242c3373770a2fd Text-content-sha1: a2fd37c41bebae52ddd12f0048be25ec6982b804 Content-length: 272 K 15 cvs2svn:cvs-rev V 5 1.151 PROPS-END SVNI;Ii-v9#, AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIETif (type == AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET) { /* server declined keyboard-interactive; ignore */_QUIETw owluded */ ssh2_p Revision-number: 1181 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:52.330323Z PROPS-END Revision-number: 1182 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:52.337042Z PROPS-END Revision-number: 1183 Prop-content-length: 323 Content-length: 323 K 8 svn:date V 27 2001-08-12T19:25:21.000000Z K 7 svn:log V 222 First phase of Unicode polishing: replace the edit box with a combo box. Also default to ISO8859-1 so that CSI works in the default mode; this is ridiculously Western-centric but I can't honestly think of a better option. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6ed855674d30fb5bcf2af1449532e085 Text-delta-base-sha1: 82ef904f4c0fe042fafb770351580405db3e06ad Text-content-length: 41 Text-content-md5: 4c1c48048dbdfb8172706e3d7089c095 Text-content-sha1: f8f8bb0c411f75d9c0954960f3a22199faea1723 Content-length: 82 K 15 cvs2svn:cvs-rev V 5 1.103 PROPS-END SVNp o cenumerate (int index Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 59c0c9be96839c10b1575da57479347b Text-delta-base-sha1: f9ad5e724fe6ebfd8c25770a5f3242ef781871eb Text-content-length: 38 Text-content-md5: a7c7ea153b7a0d283ea207d51f2459a7 Text-content-sha1: 163abc7a02a12d060cb919de851c08c407afacd1 Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVNJY ,ISO-8859-1:1987 Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 871c4fea86cef4b9cafb793c1f96ecf0 Text-delta-base-sha1: 0e3a55dae4c438d86e95096b28656075a95daaa4 Text-content-length: 441 Text-content-md5: 58587012983588434cc861f74f2d5b67 Text-content-sha1: e2995eea34389127a4245b268a86110f80cf0d05 Content-length: 480 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNaU4wvLr,W@! ?u41:L f#include "misc/ struct cp_list_item { char *name; int codepage; int cp_size; wchar_t *cp_table; }; static struct cp_list_item cp_list[] = {UTF-8", CP_UTF8/* * Return the nth code page in the list, for use in the GUI * configurer. */ char *cp_enumerate(int index) { if (index < 0 || index >= lenof(cp_list)) return NULL; return cp_list[index].name Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 53f262e0fc9ef742034fef9d835350f7 Text-delta-base-sha1: c57ab68952ba1498feffb148e6a35f074b649b27 Text-content-length: 639 Text-content-md5: 8c75666086f49343ea78b868e35bd24d Text-content-sha1: d8a8119be76f3cf15cad3eae931eab6ec8584ddf Content-length: 679 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN]]PSg? {bSTATICHEIGHT + GAPWITHIN + EDITHEIGHT + GAPBETWEEN; } /* * A static line, followed by a full-width drop-down list (ie a * non-editing combo box). */ void dropdownlist(struct ctlpos *cp, char *text, int staticid, int listid) { RECT r; va_list ap; r.left = GAPBETWEEN; r.right = cp->width; r.top = cp->ypos; r.bottom = STATICHEIGHT; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid); r.top = cp->ypos + 8 + GAPWITHIN WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", listid); cp->ypos += STATICHEIGHT + GAPWITHIN + COMBOHEIGHT Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d63a80bab5d6a9c8926312c7cac9374c Text-delta-base-sha1: 9f4aabf63fba153075738d21ed6592f32e4e2874 Text-content-length: 797 Text-content-md5: 5165f293abfb73207a713e8c9c1a3997 Text-content-sha1: 7507e7873d4ec637334acba4c885d18bec23b4e1 Content-length: 838 K 15 cvs2svn:cvs-rev V 5 1.139 PROPS-END SVNb, which is not available # with some development environments. This means that Pageant # won't care about the local user ID of processes accessing it; a # version of Pageant built with this option will therefore refuse # to run under NT-series OSes on security grounds (although it # will run fine on Win95-series OSes where there is no access # control anyway) Revision-number: 1188 Prop-content-length: 205 Content-length: 205 K 7 svn:log V 104 Add a comment about Dragon NaturallySpeaking: it apparently requires Alt+Space to work the Windows way. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-16T11:09:25.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c8f87c6c23982e63e66eb06fb5d5b195 Text-delta-base-sha1: ae3fb85b1587f3473127eb4e04d43bc26ceed862 Text-content-length: 295 Text-content-md5: fd10aaa4ffe708de956f64386757270f Text-content-sha1: a81e6bbead802af30ea8790a008b6028f35ccf0f Content-length: 334 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN=K - *Some accessibility programs for Windows may need this option enabling to be able to control PuTTY's window successfully. For instance, Dragon NaturallySpeaking requires it both to open the system menu via voice, and to close, minimise, maximise and restore the window Revision-number: 1189 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:52.806959Z PROPS-END Revision-number: 1190 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:52.814354Z PROPS-END Revision-number: 1191 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:52.821829Z PROPS-END Revision-number: 1192 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:52.829123Z PROPS-END Revision-number: 1193 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:52.836121Z PROPS-END Revision-number: 1194 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:52.843729Z PROPS-END Revision-number: 1195 Prop-content-length: 291 Content-length: 291 K 8 svn:date V 27 2001-08-22T19:47:05.000000Z K 7 svn:log V 190 Fix to allow more than one challenge/response pair during keyboard-interactive authentication. UNTESTED except that I checked it compiles. Will ask for testing from the user who complained. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a819503fe3e6abb414cd2f7a5c650a4a Text-delta-base-sha1: 2213b36ab6674f7a73fe24af95f224ebaf9c876c Text-content-length: 903 Text-content-md5: 60c72805f77e63a5e016902115125b62 Text-content-sha1: 3490c26805da2a8f1055e5567949deb57301f44c Content-length: 944 K 15 cvs2svn:cvs-rev V 5 1.153 PROPS-END SVN1}:zo&m]q<_kbd_inter_running tried_keyb_inter = FALSE; kbd_inter_runningkbd_inter_running && pktin.type == SSH2_MSG_USERAUTH_INFO_REQUEST) { /* * This is a further prompt in keyboard-interactive * authentication. Do nothing. */ } else if (!pktin.type != SSH2_MSG_USERAUTH_FAILURE) { bombout(if (pktin.type == SSH2_MSG_USERAUTH_FAILURE) { char *methods; int methlen; ssh2_pkt_getstring(&methods, &methlen); kbd_inter_running = FALSEkbd_inter_running = TRUE; } if (kbd_inter_running 1U764]; sprintf(buf, "Trying Pageant key #%d", i); logevent(buf); } pklen = GET_32BIT(p); p += 4; pkblob = p; p += pklen; alglen = GET_32BIT(pkblob); alg = pkblob + 4; commentlen = GET_32BIT(p); p += 4; commentp = p; p += commentlen;FALSE); /* no signature incl Revision-number: 1196 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2001-08-22T19:56:41.000000Z K 7 svn:log V 89 Wording change: make it explicit that you can enter an IP address as well as a hostname. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5165f293abfb73207a713e8c9c1a3997 Text-delta-base-sha1: 7507e7873d4ec637334acba4c885d18bec23b4e1 Text-content-length: 135 Text-content-md5: af49dd67011be8b9e26a11e213ec882e Text-content-sha1: 18eb85c4a6857619642a2e76204d2ded7ba69602 Content-length: 176 K 15 cvs2svn:cvs-rev V 5 1.140 PROPS-END SVN #include "putty.h" /* * Generic routines to deal with send buffers: a linked list of * smallish blocks, with the operations * * - add an arbitrary amount of data to the end of the list * - remove the first N bytes from the list * - return a (pointer,length) pair giving some initial data in * the list, suitable for passing to a send or write system * call * - return the current size of the buffer chain in bytes */ #define BUFFER_GRANULE 512 struct bufchain_granule { struct bufchain_granule *next; int buflen, bufpos; char buf[BUFFER_GRANULE]; }; void bufchain_init(bufchain *ch) { ch->head = ch->tail = NULL; ch->buffersize = 0; } void bufchain_clear(bufchain *ch) { struct bufchain_granule *b; while (ch->head) { b = ch->head; ch->head = ch->head->next; sfree(b); } ch->tail = NULL; ch->buffersize = 0; } int bufchain_size(bufchain *ch) { return ch->buffersize; } void bufchain_add(bufchain *ch, void *data, int len) { char *buf = (char *)data; ch->buffersize += len; if (ch->tail && ch->tail->buflen < BUFFER_GRANULE) { int copylen = min(len, BUFFER_GRANULE - ch->tail->buflen); memcpy(ch->tail->buf + ch->tail->buflen, buf, copylen); buf += copylen; len -= copylen; ch->tail->buflen += copylen; } while (len > 0) { int grainlen = min(len, BUFFER_GRANULE); struct bufchain_granule *newbuf; newbuf = smalloc(sizeof(struct bufchain_granule)); newbuf->bufpos = 0; newbuf->buflen = grainlen; memcpy(newbuf->buf, buf, grainlen); buf += grainlen; len -= grainlen; if (ch->tail) ch->tail->next = newbuf; else ch->head = ch->tail = newbuf; newbuf->next = NULL; ch->tail = newbuf; } } void bufchain_consume(bufchain *ch, int len) { assert(ch->buffersize >= len); assert(ch->head != NULL && ch->head->bufpos + len <= ch->head->buflen); ch->head->bufpos += len; ch->buffersize -= len; if (ch->head->bufpos >= ch->head->buflen) { struct bufchain_granule *tmp = ch->head; ch->head = tmp->next; sfree(tmp); if (!ch->head) ch->tail = NULL; } } void bufchain_prefix(bufchain *ch, void **data, int *len) { *len = ch->head->buflen - ch->head->bufpos; *data = ch->head->buf + ch->head->bufpos; } Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1da3a7a0a2bc85dedf31b99155e73320 Text-delta-base-sha1: d6c4e5a6e6d023a7846337b3cb72dd6a2b3044da Text-content-length: 458 Text-content-md5: fdbf9d78b4a2ccca7e2db7dbf8ce26c2 Text-content-sha1: 9ee435cd1eed148a6e19d3ded5bb987a34b7360a Content-length: 497 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN@u 4B4Astruct bufchain_granule; typedef struct bufchain_tag { struct bufchain_granule *head, *tail; int buffersize; /* current amount of buffered data */ } bufchain; void bufchain_init(bufchain *ch); void bufchain_clear(bufchain *ch); int bufchain_size(bufchain *ch); void bufchain_add(bufchain *ch, void *data, int len); void bufchain_prefix(bufchain *ch, void **data, int *len); void bufchain_consume(bufchain *ch, int len); Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5392638038d18d921562743004891d8f Text-delta-base-sha1: 6a269832d7e6be40c80d769f5d3a127685785013 Text-content-length: 1030 Text-content-md5: 90506cee1d5f149fa4b1fde2ddf36270 Text-content-sha1: 662b20f345697150c9fdf9b582d114ce30bb0f02 Content-length: 1069 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN.% ZS bL{z73{int (*write) (Socket s, char *data, int len); intvoid (*sent) (Plug p, int bufsize); /* * The `sent' function is called when the pending send backlog * on a socket is cleared or partially cleared. The new backlog * size is passed in the `bufsize' parametersent(p,bufsize) (((*p)->sent) (p, bufsizeREADABLE notifications are ignored, so that data is * not accepted from the peer until the socket is unfrozen. This * exists for two purposes: * * - Port forwarding: when a local listening port receives a * connection, we do not want to receive data from the new * socket until we have somewhere to send it. Hence, we freeze * the socket until its associated SSH channel is ready; then we * unfreeze it and pending data is delivered. * * - Socket buffering: if an SSH channel (or the whole connection) * backs up or presents a zero window, we must freeze the * associated local socket in order to avoid unbounded buffer * growth Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5b8d6c4e36a2abeb9ff09cf3cc299a55 Text-delta-base-sha1: f8920c0fc275bd1cb4aef92ff148f272fe54ebbf Text-content-length: 3585 Text-content-md5: 886fbcb9068a77d2861ca181c5d43af8 Text-content-sha1: 193707aaa335addc2b687ec4921b5980845086bb Content-length: 3625 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNbDC)4UOdW?/M2BiSOC s6/TtIJ- z#define MAX_STDIN_BACKLOG 4096 void fatalboxruct input_data { DWORD len; char buffer[4096]; HANDLE event, eventback; };struct output_data { DWORD len, lenwritten; int writeret; char *buffer; int is_stderr, done; HANDLE event, eventback; int busy; }; static DWORD WINAPI stdout_write_thread(void *param) { struct output_data *odata = (struct output_data *) param; HANDLE outhandle, errhandle; outhandle = GetStdHandle(STD_OUTPUT_HANDLE); errhandle = GetStdHandle(STD_ERROR_HANDLE); while (1) { WaitForSingleObject(odata->eventback, INFINITE); if (odata->done) break; odata->writeret = WriteFile(odata->is_stderr ? errhandle : outhandle, odata->buffer, odata->len, &odata->lenwritten, NULL); SetEvent(odata->event); } return 0; } bufchain stdout_data, stderr_data; struct output_data odata, edata; void try_output(int is_stderr) { struct output_data *data = (is_stderr ? &edata : &odata); void *senddata; int sendlen; if (!data->busy) { bufchain_prefix(is_stderr ? &stderr_data : &stdout_data, &senddata, &sendlen); data->buffer = senddata; data->len = sendlen; SetEvent(data->eventback); data->busy = 1; } } int void *writedata; int writelen; int osize, esize; if (is_stderr) { bufchain_add(&stderr_data, data, len); try_output(1); } else { bufchain_add(&stdout_data, data, len); try_output(0); } osize = bufchain_size(&stdout_data); esize = bufchain_size(&stderr_data); return osize + esize, stdoutevent, stderrevent; HANDLE handles[4]; DWORD in_threadid, out_threadid, err_threadid; struct input_data idata; int reading stdoutevent = CreateEvent(NULL, FALSE, FALSE, NULL); stderrhandles[2] = stdoutevent; handles[3] = stderrevent; sending = FALSE; /* * Create spare threads to write to stdout and stderr, so we * can arrange asynchronous writes. */ odata.event = stdoutevent; odata.eventback = CreateEvent(NULL, FALSE, FALSE, NULL); odata.is_stderr = 0; odata.busy = odata.done = 0; if (!CreateThread(NULL, 0, stdout_write_thread, &odata, 0, &out_threadid)) { fprintf(stderr, "Unable to create output thread\n"); exit(1); } edata.event = stderrevent; edata.eventback = CreateEvent(NULL, FALSE, FALSE, NULL); edata.is_stderr = 1; edata.busy = edata.done = 0; if (!CreateThread(NULL, 0, stdout_write_thread, &edata, 0, &err_threadid)) { fprintf(stderr, "Unable to create error output thread\n"); exit(1); } in_threadid)) { fprintf(stderr, "Unable to create input4reading = 0;} else if (n == 2) { odata.busy = 0; if (!odata.writeret) { fprintf(stderr, "Unable to write to standard output\n"); exit(0); } bufchain_consume(&stdout_data, odata.lenwritten); if (bufchain_size(&stdout_data) > 0) try_output(0); back->unthrottle(bufchain_size(&stdout_data) + bufchain_size(&stderr_data)); } else if (n == 3) { edata.busy = 0; if (!edata.writeret) { fprintf(stderr, "Unable to write to standard output\n"); exit(0); } bufchain_consume(&stderr_data, edata.lenwritten); if (bufchain_size(&stderr_data) > 0) try_output(1); back->unthrottle(bufchain_size(&stdout_data) + bufchain_size(&stderr_data)); } if (!reading && back->sendbuffer() < MAX_STDIN_BACKLOG) { SetEvent(idata.eventback); reading = 1 Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ae149755cba92b7828ffcf67a2344c75 Text-delta-base-sha1: 5d54503a27cd04e7327d0528bc61de254fb38da8 Text-content-length: 1225 Text-content-md5: 073726ff6502f3472b84557df492af23 Text-content-sha1: c36adb16ecba1919e12d766703a7359399c6ee59 Content-length: 1264 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNwmDyo2AuiVxrh`jE%P,Xzosthrottled, throttle_override if (pr->ready) { if (sshfwd_write(pr->c, data, len) > 0) { pr->throttled = 1; sk_set_frozen(pr->s, 1); } } return 1; } static void pfd_sent(Plug plug, int bufsize) { struct PFwdPrivate *pr = (struct PFwdPrivate *) plug; sshfwd_unthrottle(pr->c, bufsize)pfd_sentthrottled = pr->throttle_override = 0pfd_sentthrottled = pr->throttle_override = 0 /* should not happen... */ pfd_sent, /* also should not happenthrottled = pr->throttle_override = 0void pfd_unthrottle(Socket s) { struct PFwdPrivate *pr; if (!s) return; pr = (struct PFwdPrivate *) sk_get_private_ptr(s); pr->throttled = 0; sk_set_frozen(s, pr->throttled || pr->throttle_override); } void pfd_override_throttle(Socket s, int enable) { struct PFwdPrivate *pr; if (!s) return; pr = (struct PFwdPrivate *) sk_get_private_ptr(s); pr->throttle_override = enable; sk_set_frozen(s, pr->throttled || pr->throttle_override); } /* * Called to send data down the raw connection. */ int pfd_send(Socket s, char *data, int len) { if (s == NULL) return 0; return Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8823ee846e97db7ea67eb48abce76368 Text-delta-base-sha1: dc5c7a63e26a5e6b28998893258955501ed16567 Text-content-length: 301 Text-content-md5: 12eef0a60060f828aeb254a7b831a70e Text-content-sha1: a3b7f66c9d2154f734d03e9ae2580f418166cf44 Content-length: 341 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN ,s ^O'T*o)N;e * Since SFTP is a request-response oriented protocol, it requires * no buffer management: when we send data, we stop and wait for an * acknowledgement _anyway_, and so we can't possibly overfill our * send buffer. */int 0 0 return 0; Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4c1c48048dbdfb8172706e3d7089c095 Text-delta-base-sha1: f8f8bb0c411f75d9c0954960f3a22199faea1723 Text-content-length: 517 Text-content-md5: 3e80713cbbfcb26d928ef3727a8021c0 Text-content-sha1: b0f12e5345c2f337a969049078e770e038046620 Content-length: 558 K 15 cvs2svn:cvs-rev V 5 1.104 PROPS-END SVNFgbdm#/* back->send() returns the current amount of buffered data. */ int (*send) (char *buf, int len); /* back->sendbuffer() does the same thing but without attempting a send */ int (*sendbuffer) (void); void (*size) (void); void (*special) (Telnet_Special code); Socket(*socket) (void); int (*sendok) (void); int (*ldisc) (int); /* * back->unthrottle() tells the back end that the front end * buffer is clearing. */ void (*unthrottleint Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a69b436571f99d5c5a8cde76758d9c7e Text-delta-base-sha1: 864a7ace65de3a316eb9ce22d7d23db8ed9be831 Text-content-length: 649 Text-content-md5: 147c3bdee1ca93c268a0bb324f21b495 Text-content-sha1: 1ecd44a9e29ca8a646f6c506e0ebfdd42015ab99 Content-length: 689 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNKj$YqTR1LTr @#define RAW_MAX_BACKLOG 4096 static Socket s = NULL; static int raw_bufsize; static void raw_size(void); static void c_write(char *buf, int len) { int backlog = from_backend(0, buf, len); sk_set_frozen(s, backlog > RAW_MAX_BACKLOGint raw_send(char *buf, int len) { if (s == NULL) return; raw_bufsize = sk_write(s, buf, len); return raw_bufsize; } /* * Called to query the current socket sendability status. */ static int raw_sendbuffer(void) { return raw_bufsizevoid raw_unthrottle(int backlog) { sk_set_frozen(s, backlog > RAW_MAX_BACKLOG)endbufferraw_unthrottle Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e79b596666f522ab87d4cc6f4e8d66f8 Text-delta-base-sha1: 72d95ee0a03a47d3e8f82403a09c6dc3ac57dc48 Text-content-length: 737 Text-content-md5: b392408d191e89d2b30c545721b5eb7b Text-content-sha1: 6b5055daed760a099c8c3f10f33cffbe5a615397 Content-length: 777 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN' ,)-}O,p{~IFXHc?#define RLOGIN_MAX_BACKLOG 4096 static Socket s = NULL; static int rlogin_bufsize; static void rlogin_size(void); static void c_write(char *buf, int len) { int backlog = from_backend(0, buf, len); sk_set_frozen(s, backlog > RLOGIN_MAX_BACKLOGrlogin_bufsize = int rlogin_send(char *buf, int len) { if (s == NULL) return; rlogin_bufsize = sk_write(s, buf, len); return rlogin_bufsize; } /* * Called to query the current socket sendability status. */ static int rlogin_sendbuffer(void) { return rlogin_bufsizerlogin_bufsize =void rlogin_unthrottle(int backlog) { sk_set_frozen(s, backlog > RLOGIN_MAX_BACKLOG)endbufferrlogin_unthrottle, 1 }; Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c4bf0374312f8de620aa5e750b6b194f Text-delta-base-sha1: 5d97e187fe16855e339b122f7e4994859f610e84 Text-content-length: 993 Text-content-md5: 5466839c786c000aee2d547963dbc5be Text-content-sha1: 8efe2976f6b5a2e1cfd87655da82859c2db8ae4a Content-length: 1033 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNI Dj0h*FNJ,WC@B)p'v6/* * The maximum amount of queued data we accept before we stop and * wait for the server to process some. */ #define MAX_SCP_BUFSIZE 16384int 0 0 return 0; } static int scp_process_network_event(void) { fd_set readfds; FD_ZERO(&readfds); FD_SET(scp_ssh_socket, &readfds); if (select(1, &readfds, NULL, NULL, NULL) < 0) return 0; /* doom */ select_result((WPARAM) scp_ssh_socket, (LPARAM) FD_READ); return 1;if (!scp_process_network_event()) return 0; /* doom */nt bufsize; ufsize = /* * If the network transfer is backing up - that is, the * remote site is not accepting data as fast as we can * produce it - then we must loop on network events until * we have space in the buffer again. */ while (bufsize > MAX_SCP_BUFSIZE) { if (!scp_process_network_event()) bump("%s: Network error occurred", src); bufsize = back->sendbuffer(); Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 69739c1ee97c9e564942b9c1c14471fd Text-delta-base-sha1: 181ae464a25d980a626d32103dde1aa0c488a749 Text-content-length: 13564 Text-content-md5: a2eacc59d4c6ae565c2e4b6fa14d021e Text-content-sha1: 6ae9e3664ca426012e737beadc0ab3aee0bd2f90 Content-length: 13605 K 15 cvs2svn:cvs-rev V 5 1.155 PROPS-END SVNFr,W0\=re@zuxf{V <~/?m@H{RB=jGI5u@D1)[8 JG>ZQc) V^W~intextern void x11_unthrottle(Socket s); extern void x11_override_throttle(Socket s, int enableint pfd_send(Socket s, char *data, int len); extern void pfd_confirm(Socket s); extern void pfd_unthrottle(Socket s); extern void pfd_override_throttle(Socket s, int enable); /* * Buffer management constants. There are several of these for * various different purposes: * * - SSH1_BUFFER_LIMIT is the amount of backlog that must build up * on a local data stream before we throttle the whole SSH * connection (in SSH1 only). Throttling the whole connection is * pretty drastic so we set this high in the hope it won't * happen very often. * * - SSH_MAX_BACKLOG is the amount of backlog that must build up * on the SSH connection itself before we defensively throttle * _all_ local data streams. This is pretty drastic too (though * thankfully unlikely in SSH2 since the window mechanism should * ensure that the server never has any need to throttle its end * of the connection), so we set this high as well. * * - OUR_V2_WINSIZE is the maximum window size we present on SSH2 * channels. */ #define SSH1_BUFFER_LIMIT 32768 #define SSH_MAX_BACKLOG 32768 #define OUR_V2_WINSIZE 16384union { struct ssh1_data_channel { int throttling; } v1; struct ssh2_data_channel { bufchain outbuffer; unsigned remwindow, remmaxpkt; unsigned locwindow; } v2; } vint ssh1_throttle_count; static int ssh_overall_bufsize; static int ssh_throttled_all; static int ssh1_stdout_throttlingintstatic void ssh_throttle_all(int enable, int bufsize); static void ssh2_set_window(struct ssh_channel *c, unsigned newwin); static int (*s_rdpkt) (unsigned char **data, int *datalen); static int ssh_sendbuffer(void, backlog; len = s_wrpkt_prepare(); backlog = sk_write(s, pktout.data, len); if (backlog > SSH_MAX_BACKLOG) ssh_throttle_all(1, backlog; int backlog; len = ssh2_pkt_construct(); backlog = sk_write(s, pktout.data, len); if (backlog > SSH_MAX_BACKLOG) ssh_throttle_all(1, backlogint backlog; backlog = if (backlog > SSH_MAX_BACKLOG) ssh_throttle_all(1, backlog)static void ssh_sent(Plug plug, int bufsize) { /* * If the send backlog on the SSH socket itself clears, we * should unthrottle the whole world if it was throttled. */ if (bufsize < SSH_MAX_BACKLOG) ssh_throttle_all(0, bufsize), ssh_sent, NULLThrottle or unthrottle the SSH connection. */ static void ssh1_throttle(int adjust) { int old_count = ssh1_throttle_count; ssh1_throttle_count += adjust; assert(ssh1_throttle_count >= 0); if (ssh1_throttle_count && !old_count) { sk_set_frozen(s, 1); } else if (!ssh1_throttle_count && old_count) { sk_set_frozen(s, 0); } } /* * Throttle or unthrottle _all_ local data streams (for when sends * on the SSH connection itself back up). */ static void ssh_throttle_all(int enable, int bufsize) { int i; struct ssh_channel *c; if (enable == ssh_throttled_all) return; ssh_throttled_all = enable; ssh_overall_bufsize = bufsize; if (!ssh_channels) return; for (i = 0; NULL != (c = index234(ssh_channels, i)); i++) { switch (c->type) { case CHAN_MAINSESSION: /* * This is treated separately, outside the switch. */ break; case CHAN_X11: x11_override_throttle(c->u.x11.s, enable); break; case CHAN_AGENT: /* Agent channels require no buffer management. */ break; case CHAN_SOCKDATA: pfd_override_throttle(c->u.x11.s, enable); break; } }int /* * In SSH1 we can return 0 here - implying that forwarded * connections are never individually throttled - because * the only circumstance that can cause throttling will be * the whole SSH connection backing up, in which case * _everything_ will be throttled as a whole. */ return 0; } else { ssh2_add_channel_data(c, buf, len); return ssh2_try_send(c); } } void sshfwd_unthrottle(struct ssh_channel *c, int bufsize) { if (ssh_version == 1) { if (c->v.v1.throttling && bufsize < SSH1_BUFFER_LIMIT) { c->v.v1.throttling = 0; ssh1_throttle(-1); } } else { ssh2_set_window(c, OUR_V2_WINSIZE - bufsizeint bufsize = from_backend(pktin.type == SSH1_SMSG_STDERR_DATA, pktin.body + 4, len); if (bufsize > SSH1_BUFFER_LIMIT) { ssh1_stdout_throttling = 1; ssh1_throttle(+1); }v.v1.throttlingv.v1.throttlingv.v1.throttlingint bufsize; switch (c->type) { case CHAN_X11: bufsize = bufsize = ufsize = 0; /* agent channels never back up */ break; } if (bufsize > SSH1_BUFFER_LIMIT) { c->v.v1.throttling = 1; ssh1_throttle(+1)bufchain_add(&c->v.v2.outbuffer, buf, len); } /* * Attempt to send data on an SSH2 channel. */ static int ssh2_try_send(struct ssh_channel *c) { while (c->v.v2.remwindow > 0 && bufchain_size(&c->v.v2.outbuffer) > 0) { int len; void *data; bufchain_prefix(&c->v.v2.outbuffer, &data, &len); if ((unsigned)len > c->v.v2.remwindow) len = c->v.v2.remwindow; if ((unsigned)len > c->v.v2.remmaxpkt) len = c->v.data, len); ssh2_pkt_send(); bufchain_consume(&c->v.v2.outbuffer, len); c->v.v2.remwindow -= len; } /* * After having sent as much data as we can, return the amount * still buffered. */ return bufchain_size(&c->v.v2.outbuffer); } /* * Potentially enlarge the window on an SSH2 channel. */ static void ssh2_set_window(struct ssh_channel *c, unsigned newwin) { if (newwin > c->v.v2.locwindow) { ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_adduint32(newwin - c->v.v2.locwindow); ssh2_pkt_send(); c->v.v2.locwindow = newwi-{-#k[QZElc:d1SdB ld6kK Dwr *methods; int methlen; ssh2_pkt_getstring(&methods, &methlen); kbd_inter_running = FALSE; if (!ssh2_pkt_getbool()) { /* * We have received an unequivocal Access * Denied. This can translate to a variety of * messages: * * - if we'd just tried "none" authentication, * it's not worth printing anything at all * * - if we'd just tried a public key _offer_, * the message should be "Server refused our * key" (or no message at all if the key * came from Pageant) * * - if we'd just tried anything else, the * message really should be "Access denied". * * Additionally, if we'd just tried password * authentication, we should break out of this * whole loop so as to go back to the username * prompt. */ if (type == AUTH_TYPE_NONE) { /* do nothing */ } else if (type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD || type == AUTH_TYPE_PUBLICKEY_OFFER_QUIET) { if (type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD) c_write_str("Server refused our key\r\n"); logevent("Server refused public key"); } else if (type == AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET) { /* server declined keyboard-interactive; ignore */ } else { c_write_str("Access denied\r\n"); logevent("Access denied"); if (type == AUTH_TYPE_PASSWORD) { we_are_in = FALSE; break; } } } else { c_write_str("Further authentication required\r\n"); logevent("Further authentication required"); } can_pubkey = in_commasep_string("publickey", methods, methlen); can_passwd = in_commasep_string("password", methods, methlen); can_passwd = in_commasep_string("password", methods, methlen); can_keyb_inter = in_commasep_string("keyboard-interactive", methods, methlen); } method = 0; if (!method && can_keyb_inter && !tried_keyb_inter) { method = AUTH_KEYBOARD_INTERACTIVE; type = AUTH_TYPE_KEYBOARD_INTERACTIVE; tried_keyb_inter = TRUE; keyboard-interactive"); /* method */ ssh2_pkt_addstring(""); /* lang */ ssh2_pkt_addstring(""); ssh2_pkt_send(); crWaitUntilV(ispkt); if (pktin.type != SSH2_MSG_USERAUTH_INFO_REQUEST) { if (pktin.type == SSH2_MSG_USERAUTH_FAILURE) gotit = TRUE; logevent("Keyboard-interactive authentication refused"); type = AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET; continue; } kbd_inter_running = TRUE; } if (kbd_inter_running) { method = AUTH_KEYBOARD_INTERACTIVE; type = AUTH_TYPE_KEYBOARD_INTERACTIVE; tried_keyb_inter = TRUE; /* We've got packet with that "interactive" info dump banners, and set its prompt as ours */ { char *name, *inst, *lang, *prompt; int name_len, inst_len, lang_len, prompt_len; ssh2_pkt_getstring(&name, &name_len); ssh2_pkt_getstring(&inst, &inst_len); ssh2_pkt_getstring(&lang, &lang_len); if (name_len > 0) c_write_untrusted(name, name_len); if (inst_len > 0) c_write_untrusted(inst, inst_len); num_prompts = ssh2_pkt_getuint32(); ssh2_pkt_getstring(&prompt, &prompt_len); strncpy(pwprompt, prompt, sizeof(pwprompt)); need_pw = TRUE; echo = ssh2_pkt_getbool(); } } if (!method && can_pubkey && agent_exists() && !tried_agent) { /* * Attempt public-key authentication using Pageant. */ static unsigned char request[5], *response, *p; static int responselen; static int i, nkeys; static int authed = FALSE; void *r; tried_agent = TRUE; logevent("Pageant is running. Requesting keys."); /* Request the keys held by the agent. */ PUT_32BIT(request, 1); request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; agent_query(request, 5, &r, &responselen); response = (unsigned char *) r; if (response && responselen >= 5 && response[4] == SSH2_AGENT_IDENTITIES_ANSWER) { p = response + 5; nkeys = GET_32BIT(p); p += 4; { char buf[64]; sprintf(buf, "Pageant has %d SSH2 keys", nkeys); logevent(buf); } for (i = 0; i < nkeys; i++) { static char *pkblob, *alg, *commentp; static int pklen, alglen, commentlen; static int siglen, retlen, len; static char *q, *agentreq, *ret; void *vret; { char buf[6mainchan->v.v2.locwindow = OUR_V2_WINSIZE; ssh2_pkt_adduint32(mainchan->v.v2.locwindow.v2.remwindow = ssh2_pkt_getuint32(); mainchan->v.v2.remmaxpkt = ssh2_pkt_getuint32(); bufchain_init(&mainchan->v.v2.outbuffer).....int bufsize; c->v.v2.locwindow -= length; switch (c->type) { case CHAN_MAINSESSION: bufsize = from_backend(pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA, data, length); break; case CHAN_X11: bufsize = x11_send(c->u.x11.s, data, length); break; case CHAN_SOCKDATA: bufsize = ufsize = 0; break; } /* * If we are not buffering too much data, * enlarge the window again at the remote side. */ if (bufsize < OUR_V2_WINSIZE) ssh2_set_window(c, OUR_V2_WINSIZE - bufsizebufchain_clear(&c->v...v2.remwindow = ssh2_pkt_getuint32(); c->v.v2.remmaxpkt = ssh2_pkt_getuint32(); bufchain_init(&c->v.v2.outbuffer).v2.locwindow = OUR_V2_WINSIZE; c->v.v2.remwindow = winsize; c->v.v2.remmaxpkt = pktsize; bufchain_init(&c->v.v2.outbuffer)c->v.v2.locwindow); { int bufsize = ssh2_try_send(c); if (bufsize == 0) { switch (c->type) { case CHAN_MAINSESSION: /* stdin need not receive an unthrottle * notification since it will be polled */ break; case CHAN_X11: x11_unthrottle(c->u.x11.s); break; case CHAN_AGENT: /* agent sockets are request/response and need no * buffer management */ break; case CHAN_SOCKDATA: pfd_unthrottle(c->u.pfd.s); break; } } } ssh1_throttle_count = 0; ssh_overall_bufsizeint ssh_send(char *buf, int len) { if (s == NULL || ssh_protocol == NULL) return 0; ssh_protocol(buf, len, 0); return ssh_sendbuffer(); } /* * Called to query the current amount of buffered stdin data. */ static int ssh_sendbuffer(void) { int override_value; if (s == NULL || ssh_protocol == NULL) return 0; /* * If the SSH socket itself has backed up, add the total backup * size on that to any individual buffer on the stdin channel. */ override_value = 0; if (ssh_throttled_all) override_value = ssh_overall_bufsize; if (ssh_version == 1) { return override_value; } else if (ssh_version == 2) { if (!mainchan || mainchan->closes > 0) return override_value; else return override_value + bufchain_size(&mainchan->v.v2.outbuffer); } return 0/* * This is called when stdout/stderr (the entity to which * from_backend sends data) manages to clear some backlog. */ void ssh_unthrottle(int bufsize) { if (ssh_version == 1) { if (bufsize < SSH1_BUFFER_LIMIT) { ssh1_stdout_throttling = 0; ssh1_throttle(-1); } } else { if (mainchan && mainchan->closes == 0) ssh2_set_window(mainchan, OUR_V2_WINSIZE - bufsize); }c->v.v2.locwindow = OUR_V2_WINSIZE; ssh2_pkt_adduint32(c->v.v2.locwindow);endbuffer, ssh_size, ssh_special, ssh_socket, ssh_sendok, ssh_ldisc, ssh_unthrottle, 22 }; Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9239733b221d447c9804d711aeed4d42 Text-delta-base-sha1: 9eea048dc219ea80fe1e78d706b97ce4d49c0596 Text-content-length: 198 Text-content-md5: 655433ba1a54cebe5f06524860c81c5e Text-content-sha1: 17e66ce3fbcf1e0d96c3db95062e2ef9b69a16b4 Content-length: 238 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNEw 0A0?extern void sshfwd_close(struct ssh_channel *c); extern int sshfwd_write(struct ssh_channel *c, char *, int); extern void sshfwd_unthrottle(struct ssh_channel *c, int bufsize); Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4eb544ec32b3bb5c54f559f47503b1e6 Text-delta-base-sha1: f757587aea4951487621d92da379c28b4d0c89fa Text-content-length: 2018 Text-content-md5: ccd322c5cda0d464cc81e6f5601174ae Text-content-sha1: 9e4ba0e1cc1437654b1774344077105e1f67ba18 Content-length: 2058 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN/vikY}%4MR#`cjYi| (BiXas #define TELNET_MAX_BACKLOG 4096 static int echoing = TRUE, editing = TRUE; static int activated = FALSE; static int telnet_bufsize;int backlog; char cc = (char) c; backlog = from_backend(0, &cc, 1); sk_set_frozen(s, backlog > TELNET_MAX_BACKLOGtelnet_bufsize =telnet_bufsize =telnet_bufsize =telnet_bufsize =int 0telnet_bufsize = telnet_bufsize = sk_write(s, (unsigned char) *p == IAC ? iac : cr, 2); p++; } } return telnet_bufsize; } /* * Called to query the current socket sendability status. */ static int telnet_sendbuffer(void) { return telnet_bufsize;telnet_bufsize =telnet_bufsize = sk_write(s, b, 2); break; case TS_BRK: b[1] = BREAK; telnet_bufsize = sk_write(s, b, 2); break; case TS_EC: b[1] = EC; telnet_bufsize = sk_write(s, b, 2); break; case TS_EL: b[1] = EL; telnet_bufsize = sk_write(s, b, 2); break; case TS_GA: b[1] = GA; telnet_bufsize = sk_write(s, b, 2); break; case TS_NOP: b[1] = NOP; telnet_bufsize = sk_write(s, b, 2); break; case TS_ABORT: b[1] = ABORT; telnet_bufsize = sk_write(s, b, 2); break; case TS_AO: b[1] = AO; telnet_bufsize = sk_write(s, b, 2); break; case TS_IP: b[1] = IP; telnet_bufsize = sk_write(s, b, 2); break; case TS_SUSP: b[1] = SUSP; telnet_bufsize = sk_write(s, b, 2); break; case TS_EOR: b[1] = EOR; telnet_bufsize = sk_write(s, b, 2); break; case TS_EOF: b[1] = xEOF; telnet_bufsize = sk_write(s, b, 2); break; case TS_EOL: telnet_bufsize = sk_write(s, "\r\n", 2); break; case TS_SYNCH: b[1] = DM; telnet_bufsize = sk_write(s, b, 1); telnet_bufsize = telnet_bufsize =void telnet_unthrottle(int backlog) { sk_set_frozen(s, backlog > TELNET_MAX_BACKLOG)endbuffer, telnet_size, telnet_special, telnet_socket, telnet_sendok, telnet_ldisc, telnet_unthrottle, 23 }; Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 43d19f9d491b9502951c72ba83e08ef5 Text-delta-base-sha1: f2cd08a206030baa9653d5084fc025bc56d4f584 Text-content-length: 937 Text-content-md5: d9959fe3318c8574cdc147006ce48760 Text-content-sha1: 5213e2960f462d697166b7daa732a971fb61555c Content-length: 977 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVN),PT8qint /* * We process all stdout/stderr data immediately we receive it, * and don't return until it's all gone. Therefore, there's no * reason at all to return anything other than zero from this * function. * * This is a slightly suboptimal way to deal with SSH2 - in * principle, the window mechanism would allow us to continue * to accept data on forwarded ports and X connections even * while the terminal processing was going slowly - but we * can't do the 100% right thing without moving the terminal * processing into a separate thread, and that might hurt * portability. So we manage stdout buffering the old SSH1 way: * if the terminal processing goes slowly, the whole SSH * connection stops accepting data until it's ready. * * In practice, I can't imagine this causing serious trouble. */ return 0; Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 81cc16a5901b6192a36e6f09950cc61e Text-delta-base-sha1: f9c3d47c4067db0c47aaee1bee320d259b5e36b4 Text-content-length: 589 Text-content-md5: 52583c88f9acdc24916d468d84bd5c70 Text-content-sha1: 7b0ee7955d0c2e368f6a533196f99dab6ecdb0e1 Content-length: 630 K 15 cvs2svn:cvs-rev V 5 1.147 PROPS-END SVNK{'|Z+hc /* * We need not bother about stdin backlogs here, * because in GUI PuTTY we can't do anything about * it anyway; there's no means of asking Windows to * hold off on KEYDOWN messages. We _have_ to * buffer everything we're sent. *//* * We need not bother about stdin * backlogs here, because in GUI PuTTY * we can't do anything about it * anyway; there's no means of asking * Windows to hold off on KEYDOWN * messages. We _have_ to buffer * everything we're sent. */ Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b53611e3b88adf501454d7adaf3d0df2 Text-delta-base-sha1: 1209d938c20d58fa74bdf67e69ca2439df0d73f8 Text-content-length: 2197 Text-content-md5: d907e504b8068024b6c0dfc4114d1539 Text-content-sha1: d3ca5c633711dcdab1791aa029363225d3d139e1 Content-length: 2237 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNc|qsS|{m=Ga*K yT:d*(J7<*bg)'3n@1<n@w_ 6/V`4T#include #define DEFINE_PLUG_METHOD_MACROS #include "putty.h" #include "network.h" #include "tree234.h"bufchain output_data; int writable; int frozen; /* this causes readability notifications to be ignored */ int frozen_readable; /* this means we missed at least one readability * notification while we were frozen */ char oobdata[1];int sk_tcp_write(Socket s, char *data, int len); static intbufchain_init(&ret->output_data)1; ret->frozen_readable = 0; ret->s = (SOCKET)sock; if (ret->bufchain_init(&ret->output_data) ret->frozen_readablebufchain_init(&ret->output_data); ret->writable = 00; ret->frozen_readablewhile (s->sending_oob || bufchain_size(&s->output_data) > 0) { int nsent; DWORD err; void *data data = &s->oobdata; } else { urgentflag = 0; bufchain_prefix(&s->output_data, &data, &len); } nsent = send(s->s, dataif (s->sending_oob) { if (nsent < len) { memmove(s->oobdata, s->oobdata+nsent, len-nsent); s->sending_oob = len - nsent; } else { s->sending_oob = 0; } } else { bufchain_consume(&s->output_data, nsent); } } } } static intbufchain_add(&s->output_data, buf, len); return bufchain_size(&s->output_data); } static intbufchain_clear(&s->output_data); assert(len <= sizeof(s->oobdata)); memcpy(s->oobdata, buf, len); s->sending_oob = len; return s->sending_oob /* In the case the socket is still frozen, we don't even bother */ if (s->frozen) { s->frozen_readable = 1; break; }{ int bufsize_before, bufsize_after; s->writable = 1; bufsize_before = s->sending_oob + bufchain_size(&s->output_data); try_send(s); bufsize_after = s->sending_oob + bufchain_size(&s->output_data); if (bufsize_after < bufsize_before) plug_sent(s->plug, bufsize_after); }if (s->frozen == is_frozen) return; s->frozen = is_frozen; if (!is_frozen && s->frozen_readable) { char c; recv(s->s, &c, 1, MSG_PEEK); } s->frozen_readable = 0; Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 72902cca634f4dad1a5656b4eade2c43 Text-delta-base-sha1: 781247b1963fa8393645782ce6421540769dec87 Text-content-length: 759 Text-content-md5: 63713b351b93dacc4d4a3c27699441e8 Text-content-sha1: f7e9b8d1878697184d74bddd2926eec1edd8b8f3 Content-length: 798 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNlSHUDi}YWhZ1tj' F@UIi^9Gint throttled, throttle_overrideif (sshfwd_write(pr->c, data, len) > 0) { pr->throttled = 1; sk_set_frozen(pr->s, 1); } return 1; } static void x11_sent(Plug plug, int bufsize) { struct X11Private *pr = (struct X11Private *) plug; sshfwd_unthrottle(pr->c, bufsize), x11_sent, NULLthrottled = pr->throttle_overridevoid x11_unthrottl pr->throttled = 0; sk_set_frozen(s, pr->throttled || pr->throttle_override); } void x11_override_throttle(Socket s, int enable pr->throttle_override = enable; sk_set_frozen(s, pr->throttled || pr->throttle_override); } /* * Called to send data down the raw connection. */ int 0 0 0 0return Revision-number: 1199 Prop-content-length: 294 Content-length: 294 K 7 svn:log V 193 Jacob's patch for a drag-list to select SSH ciphers. Heavily hacked by me to make the drag list behaviour slightly more intuitive. WARNING: DO NOT LOOK AT pl_itemfrompt() IF YOU ARE SQUEAMISH. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-25T19:33:33.000000Z PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 886fbcb9068a77d2861ca181c5d43af8 Text-delta-base-sha1: 193707aaa335addc2b687ec4921b5980845086bb Text-content-length: 732 Text-content-md5: 3d009ac59dd8e2fe5d7d9dfb23d3694a Text-content-sha1: e256dbf97df0f11368b2524fea91e6cd2ce62a0f Content-length: 772 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN8;y#a:/* * Ask whether the selected cipher is acceptable (since it was * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ void askcipher(char *ciphername, int cs) { HANDLE hin; DWORD savemode, i; static const char msg[] = "The first %scipher supported by the server is\n" "%s, which is below the configured warning threshold.\n" "Continue with connection? (y/n) "; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; fprintf(stderr, msg, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); fflush(stderr);== 'y' || line[0] == 'Y') { return Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 12eef0a60060f828aeb254a7b831a70e Text-delta-base-sha1: a3b7f66c9d2154f734d03e9ae2580f418166cf44 Text-content-length: 728 Text-content-md5: 2ba44f5bfe5c0a0c643d4b83f75b93af Text-content-sha1: 0408dd1d3cd08a4c90d7239ac35f7ba34bf96c46 Content-length: 768 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN15k#{n&Ask whether the selected cipher is acceptable (since it was * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ void askcipher(char *ciphername, int cs) { HANDLE hin; DWORD savemode, i; static const char msg[] = "The first %scipher supported by the server is\n" "%s, which is below the configured warning threshold.\n" "Continue with connection? (y/n) "; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; fprintf(stderr, msg, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); fflush(stderr);== 'y' || line[0] == 'Y') { return Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3e80713cbbfcb26d928ef3727a8021c0 Text-delta-base-sha1: b0f12e5345c2f337a969049078e770e038046620 Text-content-length: 469 Text-content-md5: 5f25af94ffaa75639a4996823ca84e76 Text-content-sha1: 75bb0c0bd677c94314421d6233d2fd2bcd490172 Content-length: 510 K 15 cvs2svn:cvs-rev V 5 1.105 PROPS-END SVNF!/^C+ _Vy: #ifndef PUTTY_PUTTY_H #define PUTTY_PUTTY_H #include /* for FILENAME_MAX */SSH ciphers (both SSH1 and SSH2) */ CIPHER_WARN, /* pseudo 'cipher' */ CIPHER_3DES, CIPHER_BLOWFISH, CIPHER_AES, /* (SSH 2 only) */ CIPHER_DES, /* (SSH 1 only) */ CIPHER_MAX /* no. ciphers (inc warn) */ }int ssh_cipherlist[CIPHER_MAX]void askcipher(char *ciphername, int cs Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5466839c786c000aee2d547963dbc5be Text-delta-base-sha1: 8efe2976f6b5a2e1cfd87655da82859c2db8ae4a Text-content-length: 730 Text-content-md5: 87b3feaa54c4db99a7fd174c38993dfc Text-content-sha1: 401d2405c00e8a6ff7649ee6e200784430050f14 Content-length: 770 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN (9y# S8 * Ask whether the selected cipher is acceptable (since it was * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ void askcipher(char *ciphername, int cs) { HANDLE hin; DWORD savemode, i; static const char msg[] = "The first %scipher supported by the server is\n" "%s, which is below the configured warning threshold.\n" "Continue with connection? (y/n) "; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; fprintf(stderr, msg, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); fflush(stderr);== 'y' || line[0] == 'Y') { return Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a7c7ea153b7a0d283ea207d51f2459a7 Text-delta-base-sha1: 163abc7a02a12d060cb919de851c08c407afacd1 Text-content-length: 2812 Text-content-md5: cc593bb606122cec977661500b9dabdb Text-content-sha1: d00276b7c8534da7cf0f77f28e0cd6f3ffdab19d Content-length: 2852 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVNYR#K,& }8PeC:/* * Tables of string <-> enum value mappings */ struct keyval { char *s; int v; }; static const struct keyval ciphernames[] = { { "WARN", CIPHER_WARN }, { "3des", CIPHER_3DES }, { "blowfish", CIPHER_BLOWFISH }, { "aes", CIPHER_AES }, { "des", CIPHER_DES } };static int key2val(const struct keyval *mapping, int nmaps, char *key) { int i; for (i = 0; i < nmaps; i++) if (!strcmp(mapping[i].s, key)) return mapping[i].v; return -1; } static const char *val2key(const struct keyval *mapping, int nmaps, int val) { int i; for (i = 0; i < nmaps; i++) if (mapping[i].v == val) return mapping[i].s; return NULL; } /* * Helper function to parse a comma-separated list of strings into * a preference list array of values. Any missing values are added * to the end and duplicates are weeded. * XXX: assumes vals in 'mapping' are small +ve integers */ static void gprefs(void *sesskey, char *name, char *def, const struct keyval *mapping, int nvals, int *array) { char commalist[80]; int n; unsigned long seen = 0; /* bitmap for weeding dups etc */ gpps(sesskey, name, def, commalist, sizeof(commalist)); /* Grotty parsing of commalist. */ n = 0; do { int v; char *key; key = strtok(n==0 ? commalist : NULL, ","); /* sorry */ if (!key) break; if (((v = key2val(mapping, nvals, key)) != -1) && !(seen & 1< 0 && i < nvals; i++) { const char *s = val2key(mapping, nvals, array[i]); if (s) { int sl = strlen(s); if (i > 0) { strncat(buf, ",", l); l--; } strncat(buf, s, l); l -= sl; } } write_setting_s(sesskey, name, buprefs(sesskey, "SSHCipherList", ciphernames, CIPHER_MAX, cfg->ssh_cipherlist/* Backwards compatibility: recreate old cipher policy. */ char defcipherlist[80]; gpps(sesskey, "Cipher", "3des", defcipherlist, 80); if (strcmp(defcipherlist, "3des") != 0) { int l = strlen(defcipherlist); strncpy(defcipherlist + l, ",3des", 80 - l); defcipherlist[79] = '\0'; } /* Use it as default if no new-style policy. */ gprefs(sesskey, "SSHCipherList", defcipherlist, ciphernames, CIPHER_MAX, cfg->ssh_cipherlist) Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a2eacc59d4c6ae565c2e4b6fa14d021e Text-delta-base-sha1: 6ae9e3664ca426012e737beadc0ab3aee0bd2f90 Text-content-length: 4556 Text-content-md5: 199409dc067a32b18838e18bd1e4d9b0 Text-content-sha1: 0e672eb2ba2b46d9b65dd8c774776392309766b2 Content-length: 4597 K 15 cvs2svn:cvs-rev V 5 1.156 PROPS-END SVNLqh04.qb\0~bV)~bo*ZwboM_bAR{ int cipher_chosen = 0, warn = 0; char *cipher_string = NULL; for (i = 0; !cipher_chosen && i < CIPHER_MAX; i++) { int next_cipher = cfg.ssh_cipherlist[i]; if (next_cipher == CIPHER_WARN) { /* If/when we choose a cipher, warn about it */ warn = 1; } else if (next_cipher == CIPHER_AES) { /* XXX Probably don't need to mention this. */ logevent("AES not supported in SSH1, skipping"); } else { switch (next_cipher) { case CIPHER_3DES: cipher_type = SSH_CIPHER_3DES; cipher_string = "3DES"; break; case CIPHER_BLOWFISH: cipher_type = SSH_CIPHER_BLOWFISH; cipher_string = "Blowfish"; break; case CIPHER_DES: cipher_type = SSH_CIPHER_DES; cipher_string = "single-DES"; break; } if (supported_ciphers_mask & (1 << cipher_type)) cipher_chosen = 1; } } if (!cipher_chosen) { if ((supported_ciphers_mask & (1 << SSH_CIPHER_3DES)) == 0) bombout(("Server violates SSH 1 protocol by not " "supporting 3DES encryption")); else /* shouldn't happen */ bombout(("No supported ciphers found")); crReturn(0); } /* Warn about chosen cipher if necessary. */ if (warn) askcipher(cipher_string, 0); } , warnint n_preferred_ciphers; static const struct ssh2_ciphers *preferred_ciphers[CIPHER_MAX]s. (NULL => warn below here) */ n_preferred_ciphers = 0; for (i = 0; i < CIPHER_MAX; i++) { switch (cfg.ssh_cipherlist[i]) { case CIPHER_BLOWFISH: preferred_ciphers[n_preferred_ciphers] = &ssh2_blowfish; n_preferred_ciphers++; break; case CIPHER_DES: /* Not supported in SSH2; silently drop */ break; case CIPHER_3DES: preferred_ciphers[n_preferred_ciphers] = &ssh2_3des; n_preferred_ciphers++; break; case CIPHER_AES: preferred_ciphers[n_preferred_ciphers] = &ssh2_aes; n_preferred_ciphers++; break; case CIPHER_WARN: /* Flag for later. Don't bother if it's the last in * the list. */ if (i < CIPHER_MAX - 1) { preferred_ciphers[n_preferred_ciphers] = NULL; n_preferred_ciphers++; } break; } } /* * Set up preferred compression. */n_preferred_ciphers; i++) { const struct ssh2_ciphers *c = preferred_ciphers[i]; if (!c) continue; /* warning flag */n_preferred_ciphersn_preferred_ciphers; i++) { const struct ssh2_ciphers *c = preferred_ciphers[i]; if (!c) continue; /* warning flag */n_preferred_cipherswarn = 0; for (i = 0; i < n_preferred_ciphers; i++) { const struct ssh2_ciphers *c = preferred_ciphers[i]; if (!c) { warn = 1; } else { for (j = 0; j < c->nciphers; j++) { if (in_commasep_string(c->list[j]->name, str, len)) { cscipher_tobe = c->list[j]; break; } } } if (cscipher_tobe) { if (warn) askcipher(cscipher_tobe->name, 1); break; } } ssh2_pkt_getstring(&str, &len); /* server->client cipher */ warn = 0; for (i = 0; i < n_preferred_ciphers; i++) { const struct ssh2_ciphers *c = preferred_ciphers[i]; if (!c) { warn = 1; } else { for (j = 0; j < c->nciphers; j++) { if (in_commasep_string(c->list[j]->name, str, len)) { sccipher_tobe = c->list[j]; break; } } } if (sccipher_tobe) { if (warn) askcipher(sccipher_tobe->name, 2); break; }rmm in * non-verbose non-interactive mode. (It's probably * a script, which means nobody will read the * banner _anyway_, and moreover the printing of * the banner will screw up processing on the * output of (say) plink.) */ if (flags & (FLAG_VERBOSE | FLAG_INTERACTIVE)) { ssh2_pkt_getstring(&banner, &size); if (banner) c_write_untrusted(banner, size); } crWaitUntilV(ispkt); } if (pktin.type == SSH2_MSG_USERAUTH_SUCCESS) { logevent("Access granted"); we_are_in = TRUE; break; } if (kbd_inter_running && pktin.type == SSH2_MSG_USERAUTH_INFO_REQUEST) { /* * This is a further prompt in keyboard-interactive * authentication. Do nothing. */ } else if (pktin.type != SSH2_MSG_USERAUTH_FAILURE) { bombout(("Strange packet received during authentication: type %d", pktin.type)); crReturnV; } gotit = FALSE; /* * OK, we're now sitting on a USERAUTH_FAILURE message, so * we can look at the string in it and know what we can * helpfully try next. */ if (pktin.type == SSH2_MSG_USERAUTH_FAILURE) { cha Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8c75666086f49343ea78b868e35bd24d Text-delta-base-sha1: d8a8119be76f3cf15cad3eae931eab6ec8584ddf Text-content-length: 7971 Text-content-md5: 737e8c1e021e9752e42d917d8ac0f731 Text-content-sha1: f440f6731146cd30a9646793c6f139ce4761dc03 Content-length: 8011 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN^,iD}T~C=y3JE#include "puttymem.h" #include "puttyHWND return ctlspecial control for manipulating an ordered preference list * (eg. for cipher selection). * XXX: this is a rough hack and could be improved. */ void prefslist(struct prefslist *hdl, struct ctlpos *cp, char *stext, int sid, int listid, int upbid, int dnbid) { const static int percents[] = { 5, 75, 20 }; RECT r; int xpos, percent = 0, i; const int DEFLISTHEIGHT = 52; /* XXX configurable? */ const int BTNSHEIGHT = 2*PUSHBTNHEIGHT + GAPBETWEEN; int totalheight; /* Squirrel away IDs. */ hdl->listid = listid; hdl->upbid = upbid; hdl->dnbid = dnbid; /* The static labe/* XXX it'd be nice to centre the buttons wrt the listbox * but we'd have to find out how high the latter actually is. */ if (DEFLISTHEIGHT > BTNSHEIGHT) { totalheight = DEFLISTHEIGHT; } else { totalheight = BTNSHEIGHT; } for (i=0; i<3; i++) { int left, wid; xpos = (cp->width + GAPBETWEEN) * percent / 100; left = xpos + GAPBETWEEN; percent += percents[i]; xpos = (cp->width + GAPBETWEEN) * percent / 100; wid = xpos - left; switch (i) { case 1: /* The drag list box. */ r.left = left; r.right = wid; r.top = cp->ypos; r.bottom = totalheight; { HWND ctl; ctl = doctl(cp, r, "LISTBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", listid); MakeDragList(ctl); } break; case 2: /* The "Up" and "Down" buttons. */ /* XXX worry about accelerators if we have more than one * prefslist on a panel */ r.left = left; r.right = wid; r.top = cp->ypos; r.bottom = PUSHBTNHEIGHT; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, "&Up", upbid); r.left = left; r.right = wid; r.top = cp->ypos + PUSHBTNHEIGHT + GAPBETWEEN; r.bottom = PUSHBTNHEIGHT; doctl(cp, r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, "&Down", dnbid); break; } } cp->ypos += totalheight + GAPBETWEEN; } /* * Helper function for prefslist: move item in list box. */ static void pl_moveitem(HWND hwnd, int listid, int src, int dst) { int tlen, val; char *txt; /* Get the item's data. */ tlen = SendDlgItemMessage (hwnd, listid, LB_GETTEXTLEN, src, 0); txt = smalloc(tlen+1); SendDlgItemMessage (hwnd, listid, LB_GETTEXT, src, (LPARAM) txt); val = SendDlgItemMessage (hwnd, listid, LB_GETITEMDATA, src, 0); /* Deselect old location. */ SendDlgItemMessage (hwnd, listid, LB_SETSEL, FALSE, src); /* Delete it at the old location. */ SendDlgItemMessage (hwnd, listid, LB_DELETESTRING, src, 0); /* Insert it at new location. */ SendDlgItemMessage (hwnd, listid, LB_INSERTSTRING, dst, (LPARAM) txt); SendDlgItemMessage (hwnd, listid, LB_SETITEMDATA, dst, (LPARAM) val); /* Set selection. */ SendDlgItemMessage (hwnd, listid, LB_SETCURSEL, dst, 0); sfree (txt); } int pl_itemfrompt(HWND hwnd, POINT cursor, BOOL scroll) { int ret; POINT uppoint, downpoint; int updist, downdist, upitem, downitem, i; /* * Ghastly hackery to try to figure out not which * _item_, but which _gap between items_, the user * is pointing at. We do this by first working out * which list item is under the cursor, and then * working out how far the cursor would have to * move up or down before the answer was different. * Then we put the insertion point _above_ the * current item if the upper edge is closer than * the lower edge, or _below_ it if vice versa. */ ret = LBItemFromPt(hwnd, cursor, scroll); debug(("pl_itemfrompt: initial is %d\n", ret)); if (ret == -1) return ret; ret = LBItemFromPt(hwnd, cursor, FALSE); debug(("pl_itemfrompt: secondary is %d\n", ret)); updist = downdist = 0; for (i = 1; i < 4096 && (!updist || !downdist); i++) { uppoint = downpoint = cursor; uppoint.y -= i; downpoint.y += i; upitem = LBItemFromPt(hwnd, uppoint, FALSE); downitem = LBItemFromPt(hwnd, downpoint, FALSE); if (!updist && upitem != ret) updist = i; if (!downdist && downitem != ret) downdist = i; } if (downdist < updist) ret++; return ret; } /* * Handler for prefslist above. */ int handle_prefslist(struct prefslist *hdl, int *array, int maxmemb, int is_dlmsg, HWND hwnd, WPARAM wParam, LPARAM lParam) { int i; int ret; if (is_dlmsg) { if (wParam == hdl->listid) { DRAGLISTINFO *dlm = (DRAGLISTINFO *)lParam; int dest; switch (dlm->uNotification) { case DL_BEGINDRAG: hdl->dummyitem = SendDlgItemMessage(hwnd, hdl->listid, LB_ADDSTRING, 0, (LPARAM) ""); hdl->srcitem = LBItemFromPt(dlm->hWnd, dlm->ptCursor, TRUE); hdl->dragging = 0; /* XXX hack Q183115 */ SetWindowLong(hwnd, DWL_MSGRESULT, TRUE); ret = 1; break; case DL_CANCELDRAG: DrawInsert(hwnd, dlm->hWnd, -1); /* Clear arrow */ SendDlgItemMessage(hwnd, hdl->listid, LB_DELETESTRING, hdl->dummyitem, 0); hdl->dragging = 0; ret = 1; break; case DL_DRAGGING: hdl->dragging = 1; dest = pl_itemfrompt(dlm->hWnd, dlm->ptCursor, TRUE); if (dest > hdl->dummyitem) dest = hdl->dummyitem; DrawInsert (hwnd, dlm->hWnd, dest); if (dest >= 0) SetWindowLong(hwnd, DWL_MSGRESULT, DL_MOVECURSOR); else SetWindowLong(hwnd, DWL_MSGRESULT, DL_STOPCURSOR); ret = 1; break; case DL_DROPPED: ret = 1; if (!hdl->dragging) break; dest = pl_itemfrompt(dlm->hWnd, dlm->ptCursor, TRUE); if (dest > hdl->dummyitem) dest = hdl->dummyitem; DrawInsert (hwnd, dlm->hWnd, -1); SendDlgItemMessage(hwnd, hdl->listid, LB_DELETESTRING, hdl->dummyitem, 0); hdl->dragging = 0; if (dest >= 0) { /* Correct for "missing" item. This means you can't drag * an item to the end, but that seems to be the way this * control is used. */ if (dest > hdl->srcitem) dest--; pl_moveitem(hwnd, hdl->listid, hdl->srcitem, dest); } ret = 1; break; } } } else { ret = 0; if (((LOWORD(wParam) == hdl->upbid) || (LOWORD(wParam) == hdl->dnbid)) && ((HIWORD(wParam) == BN_CLICKED) || (HIWORD(wParam) == BN_DOUBLECLICKED))) { /* Move an item up or down the list. */ /* Get the current selection, if any. */ int selection = SendDlgItemMessage (hwnd, hdl->listid, LB_GETCURSEL, 0, 0); if (selection == LB_ERR) { MessageBeep(0); } else { int nitems; /* Get the total number of items. */ nitems = SendDlgItemMessage (hwnd, hdl->listid, LB_GETCOUNT, 0, 0); /* Should we do anything? */ if (LOWORD(wParam) == hdl->upbid && (selection > 0)) pl_moveitem(hwnd, hdl->listid, selection, selection - 1); else if (LOWORD(wParam) == hdl->dnbid && (selection < nitems - 1)) pl_moveitem(hwnd, hdl->listid, selection, selection + 1); } } } /* Update array to match the list box. */ for (i=0; i < maxmemb; i++) array[i] = SendDlgItemMessage (hwnd, hdl->listid, LB_GETITEMDATA, i, 0); return ret; Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: af49dd67011be8b9e26a11e213ec882e Text-delta-base-sha1: 18eb85c4a6857619642a2e76204d2ded7ba69602 Text-content-length: 4139 Text-content-md5: ade0cb0725d0a91a375c4404640dd82c Text-content-sha1: a310dd31daa9452d768f883672e9ce9a2edd6cf1 Content-length: 4180 K 15 cvs2svn:cvs-rev V 5 1.141 PROPS-END SVNb'~k/h.?TxAtw6o;0<w6%Z$xz`pfKJ.mNYj>6,static struct prefslist cipherlistBOX_SSHCIPHER, IDC_CIPHERSTATIC2, IDC_CIPHERLIST, IDC_CIPHERUP, IDC_CIPHERDN, IDC_BUGGYMAC, IDC_SSHPROTSTATIC, IDC_SSHPROT1, IDC_SSHPROT2, IDC_CMDSTATIC, IDC_CMDEDIT, IDC_COMPRESS, sshpanelend, sshauthpanelstart, IDC_TITLE_SSHAUTH, IDC_BOX_SSHAUTH1, IDC_BOX_SSHAUTH2, IDC_PKSTATIC, IDC_PKEDIT, IDC_PKBUTTON, IDC_AGENTFWD, IDC_AUTHTIS, sshaut{ int i; static const struct { char *s; int c; } ciphers[] = { { "3DES", CIPHER_3DES }, { "Blowfish", CIPHER_BLOWFISH }, { "DES (SSH 1 only)", CIPHER_DES }, { "AES (SSH 2 only)", CIPHER_AES }, { "-- warn below here --", CIPHER_WARN } }; /* Set up the "selected ciphers" box. */ /* (cipherlist assumed to contain all ciphers) */ SendDlgItemMessage(hwnd, IDC_CIPHERLIST, LB_RESETCONTENT, 0, 0); for (i = 0; i < CIPHER_MAX; i++) { int c = cfg.ssh_cipherlist[i]; int j, pos; char *cstr = NULL; for (j = 0; j < (sizeof ciphers) / (sizeof ciphers[0]); j++) { if (ciphers[j].c == c) { cstr = ciphers[j].s; break; } } pos = SendDlgItemMessage(hwnd, IDC_CIPHERLIST, LB_ADDSTRING, 0, (LPARAM) cstr); SendDlgItemMessage(hwnd, IDC_CIPHERLIST, LB_SETITEMDATA, pos, (LPARAM) c); } SendDlgItemMessage(hwnd, IDC_CIPHERLIST, LB_ADDSTRING, 0, (LPARAM) "FIXME1"); SendDlgItemMessage(hwnd, IDC_CIPHERLIST, LB_ADDSTRING, 0, (LPARAM) "FIXME2"); } pe12i sudProtocol options", IDC_BOX_SSH2checkbox(&cp, "&Imitate SSH 2 MAC bug in commercial <= v2.3.x", IDC_BUGGYMAC); endbox(&cp); beginbox(&cp, "Encryption options", IDC_BOX_SSH3); prefslist(&cipherlist, &cp, "Encryption cipher &selection policy:", IDC_CIPHERSTATIC2, IDC_CIPHERLIST, IDC_CIPHERUP, IDC_CIPHERDN); endbox(&cp); } } if (panel == sshauthpanelstart) { /* The SSH authentication panel. Accelerators used: [acgo] m fkwSSH authentication", IDC_TITLE_SSHAUTH); beginbox(&cp, "Authentication methods", IDC_BOX_SSHAUTH1); checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication", IDC_AUTHTIS); endbox(&cp); beginbox(&cp, "Authentication parameters", IDC_BOX_SSHAUTH2 static UINT draglistmsg = WM_NULL/* XXX long name is ugly */ /* XXX make it closed by default? */ treeview_insert(&tvfaff, 2, "AuthAuth")) create_controls(hwnd, dlgtype, sshautLIST: case IDC_CIPHERUP: case IDC_CIPHERDN: handle_prefslist(&cipherlist, cfg.ssh_cipherlist, CIPHER_MAX, 0, hwnd, wParam, lParam); default: /* * Handle application-defined messages eg. DragListBox */ /* First find out what the number is (once). */ if (draglistmsg == WM_NULL) draglistmsg = RegisterWindowMessage (DRAGLISTMSGSTRING); if (msg == draglistmsg) { /* Only process once dialog is fully formed. */ if (GetWindowLong(hwnd, GWL_USERDATA) == 1) switch (LOWORD(wParam)) { case IDC_CIPHERLIST: return handle_prefslist(&cipherlist, cfg.ssh_cipherlist, CIPHER_MAX, 1, hwnd, wParam, lParam); } } return 0; he selected cipher is acceptable (since it was * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ void askcipher(char *ciphername, int cs) { static const char mbtitle[] = "PuTTY Security Alert"; static const char msg[] = "The first %.35scipher supported by the server\n" "is %.64s, which is below the configured\n" "warning threshold.\n" "Do you want to continue with this connection?\n"; /* guessed cipher name + type max length */ char message[100 + sizeof(msg)]; int mbret; sprintf(message, msg, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNO); if (mbret == IDYES) return; else exit(0); Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6eae26cf675fc7f69ca595147d8c27e7 Text-delta-base-sha1: 58bed7e7215d24fd4bafb5bdbf5a08026dea77ab Text-content-length: 621 Text-content-md5: 87f7fee65acb390fce2d4bddee16b0a6 Text-content-sha1: 4aa62bdc1ebd82b1bcb18cd915089c4c74899c4b Content-length: 660 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN MK;|k-/* * Private structure for prefslist state. Only in the header file * so that we can delegate allocation to callers. */ struct prefslist { int listid, upbid, dnbid; int srcitem; int dummyitem; int dragging; }; void ctlposinit(struct ctlpos *cp, HWND hwnd, int leftborder, int rightborder, int topborder); HWNDefslist(struct prefslist *hdl, struct ctlpos *cp, char *stext, int sid, int listid, int upbid, int dnbid); int handle_prefslist(struct prefslist *hdl, int *array, int maxmemb, int is_dlmsg, HWND hwnd, WPARAM wParam, LPARAM lParam Revision-number: 1200 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2001-08-25T20:01:36.000000Z K 7 svn:log V 102 Fiddle with the registry format so that backwards compatibility is natural and defaults are sensible. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cc593bb606122cec977661500b9dabdb Text-delta-base-sha1: d00276b7c8534da7cf0f77f28e0cd6f3ffdab19d Text-content-length: 251 Text-content-md5: c35b45486b1c69f6eb19380c79948df0 Text-content-sha1: 58eeb658a2fdd25e437f99085ec3eb90c060bb71 Content-length: 291 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNRPU&}c#?R3aes", CIPHER_AES }, { "blowfish", CIPHER_BLOWFISH }, { "3des", CIPHER_3DES }, { "WARN", CIPHER_WARNCiphergprefs(sesskey, "Cipher", "\0", ciphernames, CIPHER_MAX, cfg->ssh_cipherlist); Revision-number: 1201 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2001-08-25T20:02:02.000000Z K 7 svn:log V 88 Remove gratuitous FIXME entries in cipher list. Oops, didn't mean to check those in :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ade0cb0725d0a91a375c4404640dd82c Text-delta-base-sha1: a310dd31daa9452d768f883672e9ce9a2edd6cf1 Text-content-length: 25 Text-content-md5: e7dcac10582ecccf58fdcc5623757c70 Text-content-sha1: bbe410ad182f095e369454c1c15081ae3edc0364 Content-length: 66 K 15 cvs2svn:cvs-rev V 5 1.142 PROPS-END SVN'} r5 Revision-number: 1202 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2001-08-26T10:01:45.000000Z K 7 svn:log V 35 D'oh, remove two rogue diagnostics K 10 svn:author V 5 simon PROPS-END Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 737e8c1e021e9752e42d917d8ac0f731 Text-delta-base-sha1: f440f6731146cd30a9646793c6f139ce4761dc03 Text-content-length: 96 Text-content-md5: 1bb87afb1a6b25c785defd343df72289 Text-content-sha1: b741182052ea59c7c757a5fce326e83b73b1e939 Content-length: 136 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN^t F,F\if (ret == -1) return ret; ret = LBItemFromPt(hwnd, cursor, FALSE Revision-number: 1203 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2001-08-26T11:35:11.000000Z K 7 svn:log V 68 More upgrades to psftp: it now supports mv, chmod, reget and reput. K 10 svn:author V 5 simon PROPS-END Node-path: putty/int64.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8abf48c4e3997ce34a7bcc9a9b670f6a Text-delta-base-sha1: 254e4ac4c959e0b08bbf72bb5ef62df0ca168be2 Text-content-length: 228 Text-content-md5: f3af5e81216349b8e063b0b447d8c821 Text-content-sha1: 67be694abc0bf9a36cb244e0492f7daa458d2ae8 Content-length: 267 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN7F KG4$#include #include "int64.h" int uint64_compare(uint64 x, uint64 y) { if (x.hi != y.hi) return x.hi < y.hi ? -1 : +1; if (x.lo != y.lo) return x.lo < y.lo ? -1 : +1; return 0; } Node-path: putty/int64.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d9ec727d511d2e07add3337c5a954909 Text-delta-base-sha1: d3d7a40d9c8444d017017064097c5ca43ca93797 Text-content-length: 64 Text-content-md5: 5bba3030ec7344cda4a24c2462bcb995 Text-content-sha1: 9f3c4e6a20b360e752217ee27d67ad2f70ed1006 Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN|$0tint uint64_compare(uint64 x, uint64 y); #endif Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2ba44f5bfe5c0a0c643d4b83f75b93af Text-delta-base-sha1: 0408dd1d3cd08a4c90d7239ac35f7ba34bf96c46 Text-content-length: 8938 Text-content-md5: 37b0ec6b11b2cd839d2fc1e28d76945a Text-content-sha1: 5aa544378dbcda32fadbc411aa15e7974862054c Content-length: 8978 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN1SguF m~bv yRi +8&R n&u mXitbzO fCn#include local:%s\n", fname, outfnameint sftp_cmd_get(struct sftp_command *cmd) { return sftp_general_get(cmd, 0); } int sftp_cmd_reget(struct sftp_command *cmd) { return sftp_general_get(cmd, 1); } /* * Send a file and store it at the remote end. We have two very * similar commands here: `put' and `reput', which differ in that * `reput' checks for the existence of the destination file and * starts from where a previous aborted transfer left off. */ int sftp_general_put(struct sftp_command *cmd, int restartif (restart) { fh = fxp_open(outfname, SSH_FXF_WRITE); } else { fh = fxp_open(outfname, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_TRUNC); } if (!fh) { printf("%s: %s\n", outfname, fxp_error()); sfree(outfname); return 0; } if (restart) { char decbuf[30]; struct fxp_attrs attrs; if (!fxp_fstat(fh, &attrs)) { printf("read size of %s: %s\n", outfname, fxp_error()); sfree(outfname); return 0; } if (!(attrs.flags & SSH_FILEXFER_ATTR_SIZE)) { printf("read size of %s: size was not given\n", outfname); sfree(outfname); return 0; } offset = attrs.size; uint64_decimal(offset, decbuf); printf("reput: restarting at file position %s\n", decbuf); if (uint64_compare(offset, uint64_make(0, LONG_MAX)) > 0) { printf("reput: remote file is larger than we can deal with\n"); sfree(outfname); return 0; } if (fseek(fp, offset.lo, SEEK_SET) != 0) fseek(fp, 0, SEEK_END); /* *shrug* */ } else { offset = uint64_make(0, 0); } printf("local:%s => remote:%s\n", fname, outfnameint sftp_cmd_put(struct sftp_command *cmd) { return sftp_general_put(cmd, 0); } int sftp_cmd_reput(struct sftp_command *cmd) { return sftp_general_put(cmd, 1) sfree(dir); return 0; sfree(dir); return 0; } int sftp_cmd_rm(struct sftp_command *cmd) { char *fname; int result;emove sfree(fname); return 0; } int sftp_cmd_mv(struct sftp_command *cmd) { char *srcfname, *dstfname; int result; if (cmd->nwords < 3) { printf("mv: expects two filenames\n"); return 0; } srcfname = canonify(cmd->words[1]); if (!srcfname) { printf("%s: %s\n", srcfname, fxp_error()); return 0; } dstfname = canonify(cmd->words[2]); if (!dstfname) { printf("%s: %s\n", dstfname, fxp_error()); return 0; } result = fxp_rename(srcfname, dstfname); if (!result) { char const *error = fxp_error(); struct fxp_attrs attrs; /* * The move might have failed because dstfname pointed at a * directory. We check this possibility now: if dstfname * _is_ a directory, we re-attempt the move by appending * the basename of srcfname to dstfname. */ result = fxp_stat(dstfname, &attrs); if (result && (attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS) && (attrs.permissions & 0040000)) { char *p; char *newname, *newcanon; printf("(destination %s is a directory)\n", dstfname); p = srcfname + strlen(srcfname); while (p > srcfname && p[-1] != '/') p--; newname = dupcat(dstfname, "/", p, NULL); newcanon = canonify(newname); sfree(newname); if (newcanon) { sfree(dstfname); dstfname = newcanon; result = fxp_rename(srcfname, dstfname); error = result ? NULL : fxp_error(); } } if (error) { printf("mv %s %s: %s\n", srcfname, dstfname, error); sfree(srcfname); sfree(dstfname); return 0; } } printf("%s -> %s\n", srcfname, dstfname); sfree(srcfname); sfree(dstfname); return 0; } int sftp_cmd_chmod(struct sftp_command *cmd) { char *fname, *mode; int result; struct fxp_attrs attrs; unsigned attrs_clr, attrs_xor, oldperms, newperms; if (cmd->nwords < 3) { printf("chmod: expects a mode specifier and a filename\n"); return 0; } /* * Attempt to parse the mode specifier in cmd->words[1]. We * don't support the full horror of Unix chmod; instead we * support a much simpler syntax in which the user can either * specify an octal number, or a comma-separated sequence of * [ugoa]*[-+=][rwxst]+. (The initial [ugoa] sequence may * _only_ be omitted if the only attribute mentioned is t, * since all others require a user/group/other specification. * Additionally, the s attribute may not be specified for any * [ugoa] specifications other than exactly u or exactly g. */ attrs_clr = attrs_xor = 0; mode = cmd->words[1]; if (mode[0] >= '0' && mode[0] <= '9') { if (mode[strspn(mode, "01234567")]) { printf("chmod: numeric file modes should" " contain digits 0-7 only\n"); return 0; } attrs_clr = 07777; sscanf(mode, "%o", &attrs_xor); attrs_xor &= attrs_clr; } else { while (*mode) { char *modebegin = mode; unsigned subset, perms; int action; subset = 0; while (*mode && *mode != ',' && *mode != '+' && *mode != '-' && *mode != '=') { switch (*mode) { case 'u': subset |= 04700; break; /* setuid, user perms */ case 'g': subset |= 02070; break; /* setgid, group perms */ case 'o': subset |= 00007; break; /* just other perms */ case 'a': subset |= 06777; break; /* all of the above */ default: printf("chmod: file mode '%.*s' contains unrecognised" " user/group/other specifier '%c'\n", strcspn(modebegin, ","), modebegin, *mode); return 0; } mode++; } if (!*mode || *mode == ',') { printf("chmod: file mode '%.*s' is incomplete\n", strcspn(modebegin, ","), modebegin); return 0; } action = *mode++; if (!*mode || *mode == ',') { printf("chmod: file mode '%.*s' is incomplete\n", strcspn(modebegin, ","), modebegin); return 0; } perms = 0; while (*mode && *mode != ',') { switch (*mode) { case 'r': perms |= 00444; break; case 'w': perms |= 00222; break; case 'x': perms |= 00111; break; case 't': perms |= 01000; subset |= 01000; break; case 's': if ((subset & 06777) != 04700 && (subset & 06777) != 02070) { printf("chmod: file mode '%.*s': set[ug]id bit should" " be used with exactly one of u or g only\n", strcspn(modebegin, ","), modebegin); return 0; } perms |= 06000; break; default: printf("chmod: file mode '%.*s' contains unrecognised" " permission specifier '%c'\n", strcspn(modebegin, ","), modebegin, *mode); return 0; } mode++; } if (!(subset & 06777) && (perms &~ subset)) { printf("chmod: file mode '%.*s' contains no user/group/other" " specifier and permissions other than 't' \n", strcspn(modebegin, ","), modebegin, *mode); return 0; } perms &= subset; switch (action) { case '+': attrs_clr |= perms; attrs_xor |= perms; break; case '-': attrs_clr |= perms; attrs_xor &= ~perms; break; case '=': attrs_clr |= subset; attrs_xor |= perms; break; } if (*mode) mode++; /* eat comma */ } } fname = canonify(cmd->words[2]); if (!fname) { printf("%s: %s\n", fname, fxp_error()); return 0; } result = fxp_stat(fname, &attrs); if (!result || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS)) { printf("get attrs for %s: %s\n", fname, result ? "file permissions not provided" : fxp_error()); sfree(fname); return 0; } attrs.flags = SSH_FILEXFER_ATTR_PERMISSIONS; /* perms _only_ */ oldperms = attrs.permissions & 07777; attrs.permissions &= ~attrs_clr; attrs.permissions ^= attrs_xor; newperms = attrs.permissions & 07777; result = fxp_setstat(fname, attrs); if (!result) { printf("set attrs for %s: %s\n", fname, fxp_error()); sfree(fname); return 0; } printf("%s: %04o -> %04o\n", fname, oldperms, newperms); sfree(fname); return 0; }chmod", sftp_cmd_chmod}, { "del", sftp_cmd_rm}, { "delete", sftp_cmd_rmmv", sftp_cmd_mv}, { "put", sftp_cmd_put}, { "quit", sftp_cmd_quit}, { "reget", sftp_cmd_reget}, { "ren", sftp_cmd_mv}, { "rename", sftp_cmd_mv}, { "reput", sftp_cmd_reput}, { "rm", sftp_cmd_rm}, { Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 399cb85616e26f8d6d66e5cbdbffb28b Text-delta-base-sha1: 9bdc2e2dfee7d63abecd6dd6147c9bc73398f4e2 Text-content-length: 2335 Text-content-md5: 6fa3458799433097657ef090cc667acf Text-content-sha1: 2240aa297afe2182371472b34f2a0f1efcb5bc04 Content-length: 2374 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN74{xB$>(eu(p]>geu%s]>eus<\?eeu\?^8j>2\?eus&static void sftp_pkt_addattrs(struct sftp_packet *pkt, struct fxp_attrs attrs) { sftp_pkt_adduint32(pkt, attrs.flags); if (attrs.flags & SSH_FILEXFER_ATTR_SIZE) { sftp_pkt_adduint32(pkt, attrs.size.hi); sftp_pkt_adduint32(pkt, attrs.size.lo); } if (attrs.flags & SSH_FILEXFER_ATTR_UIDGID) { sftp_pkt_adduint32(pkt, attrs.uid); sftp_pkt_adduint32(pkt, attrs.gid); } if (attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS) { sftp_pkt_adduint32(pkt, attrs.permissions); } if (attrs.flags & SSH_FILEXFER_ATTR_ACMODTIME) { sftp_pkt_adduint32(pkt, attrs.atime); sftp_pkt_adduint32(pkt, attrs.mtime); } if (attrs.flags & SSH_FILEXFER_ATTR_EXTENDED) { /* * We currently don't support sending any extended * attributes. */ } } /* (pktout, path(pktout, path);emove(char *fnamREMOVE); sftp_pkt_adduint32(pktout, 0x678); /* request id */ sftp_pkt_addstring(pktout, fname);678ename(char *srcfname, char *dstfnamRENAME); sftp_pkt_adduint32(pktout, 0x678); /* request id */ sftp_pkt_addstring(pktout, srcfname); sftp_pkt_addstring(pktout, dstfname);678/* * Retrieve the attributes of a file. We have fxp_stat which works * on filenames, and fxp_fstat which works on open file handles. */ int fxp_stat(char *fname, struct fxp_attrs *attrsSTAT); sftp_pkt_adduint32(pktout, 0x678); /* request id */ sftp_pkt_addstring(pktout, fname);678) { fxp_internal_error("request ID mismatch\n"); return 0; } if (pktin->type == SSH_FXP_ATTRS) { *attrs = sftp_pkt_getattrs(pktin); return 1; } else { fxp_got_status(pktin); return 0; } } int fxp_fstat(struct fxp_handle *handle, struct fxp_attrs *attrsFSTAT); sftp_pkt_adduint32(pktout, 0x678handle->hstring, handle->h678) { fxp_internal_error("request ID mismatch\n"); return 0; } if (pktin->type == SSH_FXP_ATTRS) { *attrs = sftp_pkt_getattrs(pktin); return 1; } else { fxp_got_status(pktin); return 0; } } /* * Set the attributes of a file. */ int fxp_setstat(char *fname, struct fxp_attrs attrsSETSTAT); sftp_pkt_adduint32(pktout, 0x678); /* request id */ sftp_pkt_addstring(pktout, fname); sftp_pkt_addattrs(pktout, attrs);678 Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c9d2321a928dc54b85b0516b12b7a1d9 Text-delta-base-sha1: d802de9362e381d9f420bfee196bd9919bc32714 Text-content-length: 493 Text-content-md5: db8452ee768c73252017218047fe207b Text-content-sha1: 3664133bd130f79617ae16fb4ed833ab6bee7c26 Content-length: 532 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNA U2U:I a directory. */ int fxp_mkdir(char *path); /* * Remove a directory. */ int fxp_rmdir(char *path); /* * Remove a file. */ int fxp_remove(char *fname); /* * Rename a file. */ int fxp_rename(char *srcfname, char *dstfname); /* * Return file attributes. */ int fxp_stat(char *fname, struct fxp_attrs *attrs); int fxp_fstat(struct fxp_handle *handle, struct fxp_attrs *attrs); /* * Set file attributes. */ int fxp_setstat(char *fname, struct fxp_attrs attrs Revision-number: 1204 Prop-content-length: 279 Content-length: 279 K 7 svn:log V 178 Preparatory work for allowing PSCP to work over SFTP as well as old- style scp1. I've built a layer of abstraction covering all the gory details of the old scp network protocol. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-26T14:53:51.000000Z PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 87b3feaa54c4db99a7fd174c38993dfc Text-delta-base-sha1: 401d2405c00e8a6ff7649ee6e200784430050f14 Text-content-length: 5959 Text-content-md5: d874aade1dec1f8a4f2820b400d187c7 Text-content-sha1: 2063a2ef724af654c3379264f6abc5e00b850541 Content-length: 5999 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN(I)m+ygv++z&qY,RG3 70S+!(ZRY$@;dnNIDPJF<j^2efB void connection_fatal(strcpy(str, "Fatal: ---------------------------------------------------------------------- * Helper routines that contain the actual SCP protocol elements, * so they can be switched to use SFTP. */ int scp_send_errmsg(char *str) { back->send("\001", 1); /* scp protocol error prefix */ back->send(str, strlen(str)); return 0; /* can't fail */ } int scp_send_filetimes(unsigned long mtime, unsigned long atime) { char buf[80]; sprintf(buf, "T%lu 0 %lu 0\n", mtime, atime); back->send(buf, strlen(buf)); return response(); } int scp_send_filename(char *name, unsigned long size, int modes) { char buf[40]; sprintf(buf, "C%04o %lu ", modes, size); back->send(buf, strlen(buf)); back->send(name, strlen(name)); back->send("\n", 1); return response(); } int scp_send_filedata(char *data, int len) { int bufsize = back->send(data, len); /* * If the network transfer is backing up - that is, the remote * site is not accepting data as fast as we can produce it - * then we must loop on network events until we have space in * the buffer again. */ while (bufsize > MAX_SCP_BUFSIZE) { if (!scp_process_network_event()) return 1; bufsize = back->sendbuffer(); } return 0; } int scp_send_finish(void) { back->send("", 1); return response(); } int scp_send_dirname(char *name, int modes) { char buf[40]; sprintf(buf, "D%04o 0 ", modes); back->send(buf, strlen(buf)); back->send(name, strlen(name)); back->send("\n", 1); return response(); } int scp_send_enddir(void) { back->send("E\n", 2); return response(); } int scp_sink_init(void) { back->send("", 1); return 0; } #define SCP_SINK_FILE 1 #define SCP_SINK_DIR 2 #define SCP_SINK_ENDDIR 3 struct scp_sink_action { int action; /* FILE, DIR, ENDDIR */ char *buf; /* will need freeing after use */ char *name; /* filename or dirname (not ENDDIR) */ int mode; /* access mode (not ENDDIR) */ unsigned long size; /* file size (not ENDDIR) */ int settime; /* 1 if atime and mtime are filled */ unsigned long atime, mtime; /* access times for the file */ }; int scp_get_sink_action(struct scp_sink_action *act) { int done = 0; int i, bufsize; int action; char ch; act->settime = 0; act->buf = NULL; bufsize = 0; while (!done) { if (ssh_scp_recv(&ch, 1) <= 0) return 1; if (ch == '\n') bump("Protocol error: Unexpected newline"); i = 0; action = ch; do { if (ssh_scp_recv(&ch, 1) <= 0) bump("Lost connection"); if (i >= bufsize) { bufsize = i + 128; act->buf = srealloc(act->buf, bufsize); } act->buf[i++] = ch; } while (ch != '\n'); act->buf[i - 1] = '\0'; switch (action) { case '\01': /* error */ tell_user(stderr, "%s\n", act->buf); errs++; continue; /* go round again */ case '\02': /* fatal error */ bump("%s", act->buf); case 'E': back->send("", 1); act->action = SCP_SINK_ENDDIR; return 0; case 'T': if (sscanf(act->buf, "%ld %*d %ld %*d", &act->mtime, &act->atime) == 2) { act->settime = 1; back->send("", 1); continue; /* go round again */act->action = (action == 'C' ? SCP_SINK_FILE : SCP_SINK_DIR); /* * We will go round this loop only once, unless we hit * `continue' above. */ done = 1; } /* * If we get here, we must have seen SCP_SINK_FILE or * SCP_SINK_DIR. */ if (sscanf(act->buf, "%o %lu %n", &act->mode, &act->size, &i) != 2) bump("Protocol error: Illegal file descriptor format"); act->name = act->buf + i; return 0; } int scp_accept_filexfer(void) { back->send("", 1); return 0; /* can't fail */ } int scp_recv_filedata(char *data, int len) { return ssh_scp_recv(data, len); } int scp_finish_filerecv(void) { back->send("", 1); return response(); } /* ----------------------------------------------------------------------scp_send_errmsg(strif (scp_send_filetimes(mtime, atime)) return; } size = GetFileSize(f, NULL); if (verbose) tell_user(stderr, "Sending file %s, size=%lu", last, size); if (scp_send_filename(last, size, 0644if (scp_send_filedata(transbuf, k)) bump("%s: Network error occurred", src); } CloseHandle(f); (void) scp_send_finishif (verbose) tell_user(stderr, "Entering directory: %s", last); if (scp_send_dirname(last, 0755(void) scp_send_enddirreceivedscp_sink_init(); while (1) { struct scp_sink_action act; if (scp_get_sink_action(&act)) return; if (act.action == SCP_SINK_ENDDIR) returnact.name + strlen(act.name); while (p > act.nameact.action == SCP_SINK_DIRif (scp_accept_filexfer()) returnreceived = 0; while (received < act.size) { char transbuf[4096]; DWORD blksize, read, written; blksize = 4096; if (blksize > act.size - received) blksize = act.size - received; read = scp_recv_filedata(transbuf, blksize); if (read <= 0) bump("Lost connection"); if (wrerror) continue; if (!WriteFile(f, transbuf, read, &written, NULL) || written != read) { wrerror = 1; /* FIXME: in sftp we can actually abort the transfer */read; if (time(NULL) > stat_lasttime || received + read == act.size) { stat_lasttime = time(NULL); print_stats(stat_name, act.size, stat_bytes, stat_starttime, stat_lasttime); } } received += read; } if (act.settime) { FILETIME actime, wrtime; TIME_POSIX_TO_WIN(act.atime, actime); TIME_POSIX_TO_WIN(act.(void) scp_finish_filerecv(); } } /* * Revision-number: 1205 Prop-content-length: 360 Content-length: 360 K 8 svn:date V 27 2001-08-26T15:31:29.000000Z K 7 svn:log V 259 Further tightening up in PSCP. Fixed a couple more holes whereby a malicious SCP server could have written to areas other than the ones the user requested; cleared up buffer overruns everywhere. Hopefully we now do not use arbitrary buffer limits _anywhere_. K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a54ab870dedf41aa9aa08390b173a40e Text-delta-base-sha1: 18c2ce1918599fa95ca568d78b7573cfe093364e Text-content-length: 1040 Text-content-md5: 2900240550d207efb9a7934b2b9476c4 Text-content-sha1: 429bb3fe0d34512840d31be11ff5574e00efa531 Content-length: 1080 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN}klfAsend((unsigned char *) buf, len); return 1; } /* ---------------------------------------------------------------------- * sftp-based replacement for the hacky `pscp -ls'. */ static int sftp_ls_compare(const void *av, const void *bv) { const struct fxp_name *a = (const struct fxp_name *) av; const struct fxp_name *b = (const struct fxp_name *) bv; return strcmp(a->filename, b->filename); } void scp_sftp_listdir(char *dirname) { struct fxp_handle *dirh; struct fxp_names *names; struct fxp_name *ournames; int nnames, namesize; char *dir; int i; printf("Listing directory %s\n", dirname); dirh = fxp_opendir(dirname); if (dirh == NULL) { printf("Unable to open %s: %s\n", dir, fxp_error()); } else { nnames = namesize = 0; ournames = NULL; while (1) { names = fxp_readdir(dirh); if (names == NULL) { if (fxp_error_type() == SSH_FX_EOF) break; printf("Reading directory %s: %s\n", dir, fxp_error()); break; } if (names->nnames == 0) { fxp_free_names(names); break; } if (nnames + names->nnames >= namesize) { namesize += names->nnames + 128; ournames = srealloc(ournames, namesize * sizeof(*ournames)); } for (i = 0; i < names->nnames; i++) ournames[nnames++] = names->names[i]; names->nnames = 0; /* prevent free_names */ fxp_free_names(names); } fxp_close(dirh); /* * Now we have our filenames. Sort them by actual file * name, and then output the longname parts. */ qsort(ournames, nnames, sizeof(*ournames), sftp_ls_compare); /* * And print them. */ for (i = 0; i < nnames; i++) printf("%s\n", ournames[i].longnameimplemented both as SCP1 and SFTP. */ static struct scp_sftp_dirstack { struct scp_sftp_dirstack *next; struct fxp_name *names; int namepos, namelen; char *dirpath; } *scp_sftp_dirstack_head; static char *scp_sftp_remotepath, *scp_sftp_currentname; static int scp_sftp_targetisdir, scp_sftp_donethistarget; static int scp_sftp_preserve, scp_sftp_recursive; static unsigned long scp_sftp_mtime, scp_sftp_atime; static int scp_has_times; static struct fxp_handle *scp_sftp_filehandle; static uint64 scp_sftp_fileoffset; void scp_source_setup(char *target, int shouldbedir) { if (using_sftp) { /* * Find out whether the target filespec is in fact a * directory. */ struct fxp_attrs attrs; if (!fxp_stat(target, &attrs) || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS)) scp_sftp_targetisdir = 0; else scp_sftp_targetisdir = (attrs.permissions & 0040000) != 0; if (shouldbedir && !scp_sftp_targetisdir) { bump("pscp: remote filespec %s: not a directory\n", target); } scp_sftp_remotepath = dupstr(target); scp_has_times = 0; } else { (void) response(); } } int scp_send_errmsg(char *str) { if (using_sftp) { /* do nothing; we never need to send our errors to the server */ } else { back->send("\001", 1); /* scp protocol error prefix */ back->send(str, strlen(str)); }if (using_sftp) { scp_sftp_mtime = mtime; scp_sftp_atime = atime; scp_has_times = 1; return 0; } else { char buf[80]; sprintf(buf, "T%lu 0 %lu 0\n", mtime, atime); back->send(buf, strlen(buf)); return response(); } } int scp_send_filename(char *name, unsigned long size, int modes) { if (using_sftp) { char *fullname; if (scp_sftp_targetisdir) { fullname = dupcat(scp_sftp_remotepath, "/", name, NULL); } else { fullname = dupstr(scp_sftp_remotepath); } scp_sftp_filehandle = fxp_open(fullname, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_TRUNC); if (!scp_sftp_filehandle) { tell_user(stderr, "pscp: unable to open %s: %s", fullname, fxp_error()); errs++; return 1; } scp_sftp_fileoffset = uint64_make(0, 0); sfree(fullname); return 0; } else { char buf[40]; sprintf(buf, "C%04o %lu ", modes, size); back->send(buf, strlen(buf)); back->send(name, strlen(name)); back->send("\n", 1); return response(); } } int scp_send_filedata(char *data, int len) { if (using_sftp) { if (!scp_sftp_filehandle) { return 1; } if (!fxp_write(scp_sftp_filehandle, data, scp_sftp_fileoffset, len)) { tell_user(stderr, "error while writing: %s\n", fxp_error()); errs++; return 1; } scp_sftp_fileoffset = uint64_add32(scp_sftp_fileoffset, len); return 0; } else { int bufsize = back->send(data, len); /* * If the network transfer is backing up - that is, the * remote site is not accepting data as fast as we can * produce it - then we must loop on network events until * we have space in the buffer again. */ while (bufsize > MAX_SCP_BUFSIZE) { if (!scp_process_network_event()) return 1; bufsize = back->sendbuffer(); } return 0; } } int scp_send_finish(void) { if (using_sftp) { struct fxp_attrs attrs; if (!scp_sftp_filehandle) { return 1; } if (scp_has_times) { attrs.flags = SSH_FILEXFER_ATTR_ACMODTIME; attrs.atime = scp_sftp_atime; attrs.mtime = scp_sftp_mtime; if (!fxp_fsetstat(scp_sftp_filehandle, attrs)) { tell_user(stderr, "unable to set file times: %s\n", fxp_error()); errs++; } } fxp_close(scp_sftp_filehandle); scp_has_times = 0; return 0; } else { back->send("", 1); return response(); } } char *scp_save_remotepath(void) { if (using_sftp) return scp_sftp_remotepath; else return NULL; } void scp_restore_remotepath(char *data) { if (using_sftp) scp_sftp_remotepath = data; } int scp_send_dirname(char *name, int modes) { if (using_sftp) { char *fullname; char const *err; struct fxp_attrs attrs; if (scp_sftp_targetisdir) { fullname = dupcat(scp_sftp_remotepath, "/", name, NULL); } else { fullname = dupstr(scp_sftp_remotepath); } /* * We don't worry about whether we managed to create the * directory, because if it exists already it's OK just to * use it. Instead, we will stat it afterwards, and if it * exists and is a directory we will assume we were either * successful or it didn't matter. */ if (!fxp_mkdir(fullname)) err = fxp_error(); else err = "server reported no error"; if (!fxp_stat(fullname, &attrs) || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS) || !(attrs.permissions & 0040000)) { tell_user(stderr, "unable to create directory %s: %s", fullname, err); errs++; return 1; } scp_sftp_remotepath = fullname; return 0; } else { char buf[40]; sprintf(buf, "D%04o 0 ", modes); back->send(buf, strlen(buf)); back->send(name, strlen(name)); back->send("\n", 1); return response(); } } int scp_send_enddir(void) { if (using_sftp) { sfree(scp_sftp_remotepath); return 0; } else { back->send("E\n", 2); return response(); } } /* * Yes, I know; I have an scp_sink_setup _and_ an scp_sink_init. * That's bad. The difference is that scp_sink_setup is called once * right at the start, whereas scp_sink_init is called to * initialise every level of recursion in the protocol. */ void scp_sink_setup(char *source, int preserve, int recursive) { if (using_sftp) { scp_sftp_remotepath = dupstr(source); scp_sftp_preserve = preserve; scp_sftp_recursive = recursive; scp_sftp_donethistarget = 0; scp_sftp_dirstack_head = NULL; } } int scp_sink_init(void) { if (!using_sftp) { back->send("", 1); }f (using_sftp) { char *fname; int must_free_fname; struct fxp_attrs attrs; int ret; if (!scp_sftp_dirstack_head) { if (!scp_sftp_donethistarget) { /* * Simple case: we are only dealing with one file. */ fname = scp_sftp_remotepath; must_free_fname = 0; scp_sftp_donethistarget = 1; } else { /* * Even simpler case: one file _which we've done_. * Return 1 (finished). */ return 1; } } else { /* * We're now in the middle of stepping through a list * of names returned from fxp_readdir(); so let's carry * on. */ struct scp_sftp_dirstack *head = scp_sftp_dirstack_head; while (head->namepos < head->namelen && is_dots(head->names[head->namepos].filename)) head->namepos++; /* skip . and .. */ if (head->namepos < head->namelen) { fname = dupcat(head->dirpath, "/", head->names[head->namepos++].filename, NULL); must_free_fname = 1; } else { /* * We've come to the end of the list; pop it off * the stack and return an ENDDIR action. */ sfree(head->dirpath); sfree(head->names); scp_sftp_dirstack_head = head->next; sfree(head); act->action = SCP_SINK_ENDDIR; return 0; } } /* * Now we have a filename. Stat it, and see if it's a file * or a directory. */ ret = fxp_stat(fname, &attrs); if (!ret || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS)) { tell_user(stderr, "unable to identify %s: %s", fname, ret ? "file type not supplied" : fxp_error()); errs++; return 1; } if (attrs.permissions & 0040000) { struct scp_sftp_dirstack *newitem; struct fxp_handle *dirhandle; int nnames, namesize; struct fxp_name *ournames; struct fxp_names *names; /* * It's a directory. If we're not in recursive * mode, this just merits a complaint. */ if (!scp_sftp_recursive) { tell_user(stderr, "pscp: %s: is a directory", fname); errs++; if (must_free_fname) sfree(fname); return 1; } /* * Otherwise, the fun begins. We must fxp_opendir() the * directory, slurp the filenames into memory, return * SCP_SINK_DIR, and set targetisdir. The next time * we're called, we will run through the list of * filenames one by one. * * If targetisdir is _already_ set (meaning we're * already in the middle of going through another such * list), we must push the other (target,namelist) pair * on a stack. */ dirhandle = fxp_opendir(fname); if (!dirhandle) { tell_user(stderr, "scp: unable to open directory %s: %s", fname, fxp_error()); if (must_free_fname) sfree(fname); errs++; return 1; } nnames = namesize = 0; ournames = NULL; while (1) { int i; names = fxp_readdir(dirhandle); if (names == NULL) { if (fxp_error_type() == SSH_FX_EOF) break; tell_user(stderr, "scp: reading directory %s: %s\n", fname, fxp_error()); if (must_free_fname) sfree(fname); sfree(ournames); errs++; return 1; } if (names->nnames == 0) { fxp_free_names(names); break; } if (nnames + names->nnames >= namesize) { namesize += names->nnames + 128; ournames = srealloc(ournames, namesize * sizeof(*ournames)); } for (i = 0; i < names->nnames; i++) ournames[nnames++] = names->names[i]; names->nnames = 0; /* prevent free_names */ fxp_free_names(names); } fxp_close(dirhandle); newitem = smalloc(sizeof(struct scp_sftp_dirstack)); newitem->next = scp_sftp_dirstack_head; newitem->names = ournames; newitem->namepos = 0; newitem->namelen = nnames; if (must_free_fname) newitem->dirpath = fname; else newitem->dirpath = dupstr(fname); scp_sftp_dirstack_head = newitem; act->action = SCP_SINK_DIR; act->buf = dupstr(stripslashes(fname)); act->name = act->buf; act->size = 0; /* duhh, it's a directory */ act->mode = 07777 & attrs.permissions; if (scp_sftp_preserve && (attrs.flags & SSH_FILEXFER_ATTR_ACMODTIME)) { act->atime = attrs.atime; act->mtime = attrs.mtime; act->settime = 1; } else act->settime = 0; return 0; } else { /* * It's a file. Return SCP_SINK_FILE. */ act->action = SCP_SINK_FILE; act->buf = dupstr(stripslashes(fname)); act->name = act->buf; if (attrs.flags & SSH_FILEXFER_ATTR_SIZE) { if (uint64_compare(attrs.size, uint64_make(0, ULONG_MAX)) > 0) { act->size = ULONG_MAX; /* *boggle* */ } else act->size = attrs.size.lo; } else act->size = ULONG_MAX; /* no idea */ act->mode = 07777 & attrs.permissions; if (scp_sftp_preserve && (attrs.flags & SSH_FILEXFER_ATTR_ACMODTIME)) { act->atime = attrs.atime; act->mtime = attrs.mtime; act->settime = 1; } else act->settime = 0; if (must_free_fname) scp_sftp_currentname = fname; else scp_sftp_currentname = dupstr(fname); return 0; } } else { int done = 0; int i, bufsize; int action; char ch; act->settime = 0; act->buf = NULL; bufsize = 0; while (!done) { if (ssh_scp_recv(&ch, 1) <= 0) return 1; if (ch == '\n') bump("Protocol error: Unexpected newline"); i = 0; action = ch; do { if (ssh_scp_recv(&ch, 1) <= 0) bump("Lost connection"); if (i >= bufsize) { bufsize = i + 128; act->buf = srealloc(act->buf, bufsize); } act->buf[i++] = ch; } while (ch != '\n'); act->buf[i - 1] = '\0'; switch (action) { case '\01': /* error */ tell_user(stderr, "%s\n", act->buf); errs++; continue; /* go round again */ case '\02': /* fatal error */ bump("%s", act->buf); case 'E': back->send("", 1); act->action = SCP_SINK_ENDDIR; return 0; case 'T': if (sscanf(act->buf, "%ld %*d %ld %*d", &act->mtime, &act->atime) == 2) { act->settime = 1; back->send("", 1); continue; /* go round again */ } bump("Protocol error: Illegal time format"); case 'C': case 'D': act->action = (action == 'C' ? SCP_SINK_FILE : SCP_SINK_DIR); break; default: bump("Protocol error: Expected control record"); } /* * We will go round this loop only once, unless we hit * `continue' above. */ done = 1; } /* * If we get here, we must have seen SCP_SINK_FILE or * SCP_SINK_DIR. */ if (sscanf(act->buf, "%o %lu %n", &act->mode, &act->size, &i) != 2) bump("Protocol error: Illegal file descriptor format"); act->name = act->buf + i; return 0; } } int scp_accept_filexfer(void) { if (using_sftp) { scp_sftp_filehandle = fxp_open(scp_sftp_currentname, SSH_FXF_READ); if (!scp_sftp_filehandle) { tell_user(stderr, "pscp: unable to open %s: %s", scp_sftp_currentname, fxp_error()); errs++; return 1; } scp_sftp_fileoffset = uint64_make(0, 0); sfree(scp_sftp_currentname); return 0; } else { back->send("", 1); return 0; /* can't fail */ } } int scp_recv_filedata(char *data, int len) { if (using_sftp) { int actuallen = fxp_read(scp_sftp_filehandle, data, scp_sftp_fileoffset, len); if (actuallen == -1 && fxp_error_type() != SSH_FX_EOF) { tell_user(stderr, "pscp: error while reading: %s", fxp_error()); errs++; return -1; } if (actuallen < 0) actuallen = 0; scp_sftp_fileoffset = uint64_add32(scp_sftp_fileoffset, actuallen); return actuallen; } else { return ssh_scp_recv(data, len); } } int scp_finish_filerecv(void) { if (using_sftp) { fxp_close(scp_sftp_filehandle); return 0; } else { back->send("", 1); return response(); }char *save_targetsave_target = scp_save_remotepath();, NULL scp_restore_remotepath(save_targetis_dots(striptarget)scp_source_setup(targ, targetshouldbedirectorycp_sink_setup(src, preserve, recursiveif (using_sftp) { scp_sftp_listdir(src); } else { while (ssh_scp_recv(&c, 1) > 0) tell_char(stdout, c); } Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c35b45486b1c69f6eb19380c79948df0 Text-delta-base-sha1: 58eeb658a2fdd25e437f99085ec3eb90c060bb71 Text-content-length: 54 Text-content-md5: 3e81a8c0e333a66b0a0a79d287143a2a Text-content-sha1: f53215457dcea8139c4edecdffd0611105e4d862 Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNPq ]u[ cfg->remote_cmd_ptr2 = NULL Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6fa3458799433097657ef090cc667acf Text-delta-base-sha1: 2240aa297afe2182371472b34f2a0f1efcb5bc04 Text-content-length: 144 Text-content-md5: a5ccd63596093ca935eaeaf010d368b1 Text-content-sha1: 53041b9dfe70fa10c91a2828e51e0d4796cc22d1 Content-length: 183 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN4''\"B\@U8d2g>%#int fxp_fsetstat(struct fxp_handle *handle, struct fxp_attrs attrsFSETattrs(pktout, attrs678 Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: db8452ee768c73252017218047fe207b Text-delta-base-sha1: 3664133bd130f79617ae16fb4ed833ab6bee7c26 Text-content-length: 62 Text-content-md5: ec18cde157a8962ede35e0964352c90e Text-content-sha1: 4df187c0bfcd8d17dc497ba702f883bebeecd8e5 Content-length: 101 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNA ) Snint fxp_fsetstat(struct fxp_handle *handl Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 199409dc067a32b18838e18bd1e4d9b0 Text-delta-base-sha1: 0e672eb2ba2b46d9b65dd8c774776392309766b2 Text-content-length: 2716 Text-content-md5: e4276368a3890db99f6eb2f97907e22f Text-content-sha1: b6be145d02dd4bae77a73bc0dfd20d51f6163d86 Content-length: 2757 K 15 cvs2svn:cvs-rev V 5 1.157 PROPS-END SVNoV qV/* * Gross hack: pscp will try to start SFTP but fall back to scp1 if * that fails. This variable is the means by which scp.c can reach * into the SSH code and find out which one it got. */ int ssh_fallback_cmd/* * Start the shell or command. * * Special case: if the first-choice command is an SSH2 * subsystem (hence not usable here) and the second choice * exists, we fall straight back to that. */ { char *cmd = cfg.remote_cmd_ptr; if (cfg.ssh_subsys && cfg.remote_cmd_ptr2) { cmd = cfg.remote_cmd_ptr2; ssh_fallback_cmd = TRUE; } if (*cmd) send_packet(SSH1_CMSG_EXEC_CMD, PKT_STR, cmd, PKT_END); else send_packet(SSH1_CMSG_EXEC_SHELL, PKT_END); logevent("Started session"); }rn/K9Am{{rs|BK+Grname); ssh2_pkt_addstring("ssh-connection"); /* service requested */ ssh2_pkt_addstring("none"); /* method */ ssh2_pkt_send(); type = AUTH_TYPE_NONE; gotit = FALSE; we_are_in = FALSE; tried_pubkey_config = FALSE; tried_agent = FALSE; tried_keyb_inter = FALSE; kbd_inter_running = FALSE; while (1) { /* * Wait for the result of the last authentication request. */ if (!gotit) crWaitUntilV(ispkt); while (pktin.type == SSH2_MSG_USERAUTH_BANNER) { char *banner; int size; /* * Don't show the banner if we're operating We may have to attempt * this twice if the config data has provided a second choice * of command. */ while (1) { int subsys; char *cmd; if (ssh_fallback_cmd) { subsys = cfg.ssh_subsys2; cmd = cfg.remote_cmd_ptr2; } else { subsys = cfg.ssh_subsys; cmd = cfg.remote_cmd_ptr; } if (subsys) { ssh2_pkt_addstring("subsystem"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addstring(cmd); } else if (*cmd) { ssh2_pkt_addstring("exec"); ssh2_pkt_addbool(1); /* want reply */ ssh2_pkt_addstring(cmd); } else { ssh2_pkt_addstring("shell"); ssh2_pkt_addbool(1); /* want reply */ } ssh2_pkt_send();shell/command request")); crReturnV; } /* * We failed to start the command. If this is the * fallback command, we really are finished; if it's * not, and if the fallback command exists, try falling * back to it before complaining. */ if (!ssh_fallback_cmd && cfg.remote_cmd_ptr2 != NULL) { logevent("Primary command failed; attempting fallback"); ssh_fallback_cmd = TRUE; continue; } bombout(("Server refused to start a shell/command")); crReturnV; } else { logevent("Started a shell/command"); } break ssh_fallback_cmd Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 655433ba1a54cebe5f06524860c81c5e Text-delta-base-sha1: 17e66ce3fbcf1e0d96c3db95062e2ef9b69a16b4 Text-content-length: 245 Text-content-md5: 55abb8a33aab484eb91b0c89ad804c7f Text-content-sha1: 60e03d257f0d6467acf6c1743cb3caa28c0fa1ed Content-length: 285 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNwW ]F]4C/* * Gross hack: pscp will try to start SFTP but fall back to scp1 if * that fails. This variable is the means by which scp.c can reach * into the SSH code and find out which one it got. */ extern int ssh_fallback_cmd Revision-number: 1209 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2001-08-27T10:17:41.000000Z K 7 svn:log V 117 Implemented a simple wildcard matching engine, and used it to restore remote wildcard capability in sftp-style PSCP. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79dea815612e5af819206b1aaa47acb9 Text-delta-base-sha1: c0f232f63b6caa4052fcca1f0a47d3cd9da58c1d Text-content-length: 30 Text-content-md5: c5ec259f4aad2f8e36fce8738f531cd6 Text-content-sha1: d799e595d83ae7d864abd99d3d8642cff92caa35 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVNBR YpR wildcard Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c4088b0eb86688a356a6b6839d5f5912 Text-delta-base-sha1: 57eaa30cef083fe8b9f4af057370ae5ba2fbb7de Text-content-length: 203 Text-content-md5: 395ba2433dc707e0ca08fb74c63d15bc Text-content-sha1: be40c29f2a39d3ec3af6c62375d40b3151ae0ff4 Content-length: 244 K 15 cvs2svn:cvs-rev V 5 1.107 PROPS-END SVNLFPH ^|(or backslash, if `local' is TRUE). */ static char *stripslashes(char *str, int local) { char *p; p = strrchr(str, '/'); if (p) str = p+1; if (local) { p = strrchr(str, '\\'); if (p) str = p+1; } char *wildcardchar *scp_sftp_wildcardint scp_sink_setup(char *source, int preserve, int recursive) { if (using_sftp) { char *newsource; /* * It's possible that the source string we've been given * contains a wildcard. If so, we must split the directory * away from the wildcard itself (throwing an error if any * wildcardness comes before the final slash) and arrange * things so that a dirstack entry will be set up. */ newsource = smalloc(1+strlen(source)); if (!wc_unescape(newsource, source)) { /* Yes, here we go; it's a wildcard. Bah. */ char *dupsource, *lastpart, *dirpart, *wildcard; dupsource = dupstr(source); lastpart = stripslashes(dupsource, 0); wildcard = dupstr(lastpart); *lastpart = '\0'; if (*dupsource && dupsource[1]) { /* * The remains of dupsource are at least two * characters long, meaning the pathname wasn't * empty or just `/'. Hence, we remove the trailing * slash. */ lastpart[-1] = '\0'; } /* * Now we have separated our string into dupsource (the * directory part) and wildcard. Both of these will * need freeing at some point. Next step is to remove * wildcard escapes from the directory part, throwing * an error if it contains a real wildcard. */ dirpart = smalloc(1+strlen(dupsource)); if (!wc_unescape(dirpart, dupsource)) { tell_user(stderr, "%s: multiple-level wildcards unsupported", source); errs++; sfree(dirpart); sfree(wildcard); sfree(dupsource); return 1; } /* * Now we have dirpart (unescaped, ie a valid remote * path), and wildcard (a wildcard). This will be * sufficient to arrange a dirstack entry. */ scp_sftp_remotepath = dirpart; scp_sftp_wildcard = wildcard; sfree(dupsource); } else { scp_sftp_remotepath = newsource; scp_sftp_wildcard = NULL; } return 0;#define SCP_SINK_RETRY 4 /* not an action; just try again */(is_dots(head->names[head->namepos].filename) || (head->wildcard && !wc_match(head->wildcard, head->names[head->namepos].filename)) (or RETRY * if this was a wildcard match). */ if (head->wildcard) { act->action = SCP_SINK_RETRY; sfree(head->wildcard); } else { act->action = SCP_SINK_ENDDIR; } mode and * we haven't been passed a wildcard from * scp_sink_setup, this just merits a complaint. */ if (!scp_sftp_recursive && !scp_sftp_wildcard (unless this is a wildcard match), and * set targetisdir. The next time we're called, we will * run through the list of filenames one by one, * matching them against a wildcard if presentif (scp_sftp_wildcard) { newitem->wildcard = scp_sftp_wildcard; scp_sftp_wildcard = NULL; } else { newitem->wildcard = NULL; } scp_sftp_dirstack_head = newitem; if (newitem->wildcard) { act->action = SCP_SINK_RETRY; } else { act->action = SCP_SINK_DIR; act->buf = dupstr(stripslashes(fname, 0)); act->name = act->buf; act->size = 0; /* duhh, it's a directory */ act->mode = 07777 & attrs.permissions; if (scp_sftp_preserve && (attrs.flags & SSH_FILEXFER_ATTR_ACMODTIME)) { act->atime = attrs.atime; act->mtime = attrs.mtime; act->settime = 1; } else act->settime = 0; }, 0act.action == SCP_SINK_RETRY) continue, 1, 1, 1, 1if (scp_sink_setup(src, preserve, recursive)) return Node-path: putty/wildcard.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 13454 Text-content-md5: ee41906445eb3bcad877b793110a4216 Text-content-sha1: b6acfeb918e70f1677923e24551bb99b1fb29d03 Content-length: 13570 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * Wildcard matching engine for use with SFTP-based file transfer * programs (PSFTP, new-look PSCP): since SFTP has no notion of * getting the remote side to do globbing (and rightly so) we have * to do it locally, by retrieving all the filenames in a directory * and checking each against the wildcard pattern. */ #include #include #include /* * Definition of wildcard syntax: * * - * matches any sequence of characters, including zero. * - ? matches exactly one character which can be anything. * - [abc] matches exactly one character which is a, b or c. * - [a-f] matches anything from a through f. * - [^a-f] matches anything _except_ a through f. * - [-_] matches - or _; [^-_] matches anything else. (The - is * non-special if it occurs immediately after the opening * bracket or ^.) * - [a^] matches an a or a ^. (The ^ is non-special if it does * _not_ occur immediately after the opening bracket.) * - \*, \?, \[, \], \\ match the single characters *, ?, [, ], \. * - All other characters are non-special and match themselves. */ /* * The wildcard matching technique we use is very simple and * potentially O(N^2) in running time, but I don't anticipate it * being that bad in reality (particularly since N will be the size * of a filename, which isn't all that much). Perhaps one day, once * PuTTY has grown a regexp matcher for some other reason, I might * come back and reimplement wildcards by translating them into * regexps or directly into NFAs; but for the moment, in the * absence of any other need for the NFA->DFA translation engine, * anything more than the simplest possible wildcard matcher is * vast code-size overkill. * * Essentially, these wildcards are much simpler than regexps in * that they consist of a sequence of rigid fragments (? and [...] * can never match more or less than one character) separated by * asterisks. It is therefore extremely simple to look at a rigid * fragment and determine whether or not it begins at a particular * point in the test string; so we can search along the string * until we find each fragment, then search for the next. As long * as we find each fragment in the _first_ place it occurs, there * will never be a danger of having to backpedal and try to find it * again somewhere else. */ enum { WC_TRAILINGBACKSLASH = 1, WC_UNCLOSEDCLASS, WC_INVALIDRANGE, }; /* * Error reporting is done by returning various negative values * from the wildcard routines. Passing any such value to wc_error * will give a human-readable message. */ const char *wc_error(int value) { value = abs(value); switch (value) { case WC_TRAILINGBACKSLASH: return "'\' occurred at end of string (expected another character)"; case WC_UNCLOSEDCLASS: return "expected ']' to close character class"; case WC_INVALIDRANGE: return "character range was not terminated (']' just after '-')"; } return "INTERNAL ERROR: unrecognised wildcard error number"; } /* * This is the routine that tests a target string to see if an * initial substring of it matches a fragment. If successful, it * returns 1, and advances both `fragment' and `target' past the * fragment and matching substring respectively. If unsuccessful it * returns zero. If the wildcard fragment suffers a syntax error, * it returns <0 and the precise value indexes into wc_error. */ static int wc_match_fragment(const char **fragment, const char **target) { const char *f, *t; f = *fragment; t = *target; /* * The fragment terminates at either the end of the string, or * the first (unescaped) *. */ while (*f && *f != '*' && *t) { /* * Extract one character from t, and one character's worth * of pattern from f, and step along both. Return 0 if they * fail to match. */ if (*f == '\\') { /* * Backslash, which means f[1] is to be treated as a * literal character no matter what it is. It may not * be the end of the string. */ if (!f[1]) return -WC_TRAILINGBACKSLASH; /* error */ if (f[1] != *t) return 0; /* failed to match */ f += 2; } else if (*f == '?') { /* * Question mark matches anything. */ f++; } else if (*f == '[') { int invert = 0; int matched = 0; /* * Open bracket introduces a character class. */ f++; if (*f == '^') { invert = 1; f++; } while (*f != ']') { if (*f == '\\') f++; /* backslashes still work */ if (!*f) return -WC_UNCLOSEDCLASS; /* error again */ if (f[1] == '-') { int lower, upper, ourchr; lower = (unsigned char) *f++; f++; /* eat the minus */ if (*f == ']') return -WC_INVALIDRANGE; /* different error! */ if (*f == '\\') f++; /* backslashes _still_ work */ if (!*f) return -WC_UNCLOSEDCLASS; /* error again */ upper = (unsigned char) *f++; ourchr = (unsigned char) *t; if (lower > upper) { int t = lower; lower = upper; upper = t; } if (ourchr >= lower && ourchr <= upper) matched = 1; } else { matched |= (*t == *f++); } } if (invert == matched) return 0; /* failed to match character class */ f++; /* eat the ] */ } else { /* * Non-special character matches itself. */ if (*f != *t) return 0; f++; } /* * Now we've done that, increment t past the character we * matched. */ t++; } if (!*f || *f == '*') { /* * We have reached the end of f without finding a mismatch; * so we're done. Update the caller pointers and return 1. */ *fragment = f; *target = t; return 1; } /* * Otherwise, we must have reached the end of t before we * reached the end of f; so we've failed. Return 0. */ return 0; } /* * This is the real wildcard matching routine. It returns 1 for a * successful match, 0 for an unsuccessful match, and <0 for a * syntax error in the wildcard. */ int wc_match(const char *wildcard, const char *target) { int ret; /* * Every time we see a '*' _followed_ by a fragment, we just * search along the string for a location at which the fragment * matches. The only special case is when we see a fragment * right at the start, in which case we just call the matching * routine once and give up if it fails. */ if (*wildcard != '*') { ret = wc_match_fragment(&wildcard, &target); if (ret <= 0) return ret; /* pass back failure or error alike */ } while (*wildcard) { assert(*wildcard == '*'); while (*wildcard == '*') wildcard++; /* * It's possible we've just hit the end of the wildcard * after seeing a *, in which case there's no need to * bother searching any more because we've won. */ if (!*wildcard) return 1; /* * Now `wildcard' points at the next fragment. So we * attempt to match it against `target', and if that fails * we increment `target' and try again, and so on. When we * find we're about to try matching against the empty * string, we give up and return 0. */ ret = 0; while (*target) { const char *save_w = wildcard, *save_t = target; ret = wc_match_fragment(&wildcard, &target); if (ret < 0) return ret; /* syntax error */ if (ret > 0 && !*wildcard && *target) { /* * Final special case - literally. * * This situation arises when we are matching a * _terminal_ fragment of the wildcard (that is, * there is nothing after it, e.g. "*a"), and it * has matched _too early_. For example, matching * "*a" against "parka" will match the "a" fragment * against the _first_ a, and then (if it weren't * for this special case) matching would fail * because we're at the end of the wildcard but not * at the end of the target string. * * In this case what we must do is measure the * length of the fragment in the target (which is * why we saved `target'), jump straight to that * distance from the end of the string using * strlen, and match the same fragment again there * (which is why we saved `wildcard'). Then we * return whatever that operation returns. */ target = save_t + strlen(save_t) - (target - save_t); wildcard = save_w; return wc_match_fragment(&wildcard, &target); } if (ret > 0) break; target++; } if (ret > 0) continue; return 0; } /* * If we reach here, it must be because we successfully matched * a fragment and then found ourselves right at the end of the * wildcard. Hence, we return 1 if and only if we are also * right at the end of the target. */ return (*target ? 0 : 1); } /* * Another utility routine that translates a non-wildcard string * into its raw equivalent by removing any escaping backslashes. * Expects a target string buffer of anything up to the length of * the original wildcard. You can also pass NULL as the output * buffer if you're only interested in the return value. * * Returns 1 on success, or 0 if a wildcard character was * encountered. In the latter case the output string MAY not be * zero-terminated and you should not use it for anything! */ int wc_unescape(char *output, const char *wildcard) { while (*wildcard) { if (*wildcard == '\\') { wildcard++; /* We are lenient about trailing backslashes in non-wildcards. */ if (*wildcard) { if (output) *output++ = *wildcard; wildcard++; } } else if (*wildcard == '*' || *wildcard == '?' || *wildcard == '[' || *wildcard == ']') { return 0; /* it's a wildcard! */ } else { if (output) *output++ = *wildcard; wildcard++; } } *output = '\0'; return 1; /* it's clean */ } #ifdef TESTMODE struct test { const char *wildcard; const char *target; int expected_result; }; const struct test fragment_tests[] = { /* * We exhaustively unit-test the fragment matching routine * itself, which should save us the need to test all its * intricacies during the full wildcard tests. */ {"abc", "abc", 1}, {"abc", "abd", 0}, {"abc", "abcd", 1}, {"abcd", "abc", 0}, {"ab[cd]", "abc", 1}, {"ab[cd]", "abd", 1}, {"ab[cd]", "abe", 0}, {"ab[^cd]", "abc", 0}, {"ab[^cd]", "abd", 0}, {"ab[^cd]", "abe", 1}, {"ab\\", "abc", -WC_TRAILINGBACKSLASH}, {"ab\\*", "ab*", 1}, {"ab\\?", "ab*", 0}, {"ab?", "abc", 1}, {"ab?", "ab", 0}, {"ab[", "abc", -WC_UNCLOSEDCLASS}, {"ab[c-", "abb", -WC_UNCLOSEDCLASS}, {"ab[c-]", "abb", -WC_INVALIDRANGE}, {"ab[c-e]", "abb", 0}, {"ab[c-e]", "abc", 1}, {"ab[c-e]", "abd", 1}, {"ab[c-e]", "abe", 1}, {"ab[c-e]", "abf", 0}, {"ab[e-c]", "abb", 0}, {"ab[e-c]", "abc", 1}, {"ab[e-c]", "abd", 1}, {"ab[e-c]", "abe", 1}, {"ab[e-c]", "abf", 0}, {"ab[^c-e]", "abb", 1}, {"ab[^c-e]", "abc", 0}, {"ab[^c-e]", "abd", 0}, {"ab[^c-e]", "abe", 0}, {"ab[^c-e]", "abf", 1}, {"ab[^e-c]", "abb", 1}, {"ab[^e-c]", "abc", 0}, {"ab[^e-c]", "abd", 0}, {"ab[^e-c]", "abe", 0}, {"ab[^e-c]", "abf", 1}, {"ab[a^]", "aba", 1}, {"ab[a^]", "ab^", 1}, {"ab[a^]", "abb", 0}, {"ab[^a^]", "aba", 0}, {"ab[^a^]", "ab^", 0}, {"ab[^a^]", "abb", 1}, {"ab[-c]", "ab-", 1}, {"ab[-c]", "abc", 1}, {"ab[-c]", "abd", 0}, {"ab[^-c]", "ab-", 0}, {"ab[^-c]", "abc", 0}, {"ab[^-c]", "abd", 1}, {"ab[\\[-\\]]", "abZ", 0}, {"ab[\\[-\\]]", "ab[", 1}, {"ab[\\[-\\]]", "ab\\", 1}, {"ab[\\[-\\]]", "ab]", 1}, {"ab[\\[-\\]]", "ab^", 0}, {"ab[^\\[-\\]]", "abZ", 1}, {"ab[^\\[-\\]]", "ab[", 0}, {"ab[^\\[-\\]]", "ab\\", 0}, {"ab[^\\[-\\]]", "ab]", 0}, {"ab[^\\[-\\]]", "ab^", 1}, {"ab[a-fA-F]", "aba", 1}, {"ab[a-fA-F]", "abF", 1}, {"ab[a-fA-F]", "abZ", 0}, }; const struct test full_tests[] = { {"a", "argh", 0}, {"a", "ba", 0}, {"a", "a", 1}, {"a*", "aardvark", 1}, {"a*", "badger", 0}, {"*a", "park", 0}, {"*a", "pArka", 1}, {"*a", "parka", 1}, {"*a*", "park", 1}, {"*a*", "perk", 0}, {"?b*r?", "abracadabra", 1}, {"?b*r?", "abracadabr", 0}, {"?b*r?", "abracadabzr", 0}, }; int main(void) { int i; int fails, passes; fails = passes = 0; for (i = 0; i < sizeof(fragment_tests)/sizeof(*fragment_tests); i++) { const char *f, *t; int eret, aret; f = fragment_tests[i].wildcard; t = fragment_tests[i].target; eret = fragment_tests[i].expected_result; aret = wc_match_fragment(&f, &t); if (aret != eret) { printf("failed test: /%s/ against /%s/ returned %d not %d\n", fragment_tests[i].wildcard, fragment_tests[i].target, aret, eret); fails++; } else passes++; } for (i = 0; i < sizeof(full_tests)/sizeof(*full_tests); i++) { const char *f, *t; int eret, aret; f = full_tests[i].wildcard; t = full_tests[i].target; eret = full_tests[i].expected_result; aret = wc_match(f, t); if (aret != eret) { printf("failed test: /%s/ against /%s/ returned %d not %d\n", full_tests[i].wildcard, full_tests[i].target, aret, eret); fails++; } else passes++; } printf("passed %d, failed %d\n", passes, fails); return 0; } #endif Revision-number: 1210 Prop-content-length: 289 Content-length: 289 K 8 svn:date V 27 2001-08-27T10:24:55.000000Z K 7 svn:log V 188 Minor modification: in remote->local non-recursive mode matching a wildcard, we don't abandon ship completely if the wildcard matches a directory; we just warn and carry on with the rest. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9c91c219358334da5260fef63ac9bf11 Text-delta-base-sha1: 0aff0a0bb2473d4754231c7336221f98dc7eac35 Text-content-length: 547 Text-content-md5: 9cf8469b4ccdff48b0a435658dc2edc1 Text-content-sha1: 8ade5486ab93ed17448818acc2d7bed44007ab9b Content-length: 587 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVN~n*Vp~ , * this merits a complaint (which is fatal if the name * was specified directly, but not if it was matched by * a wildcard). * * We skip this complaint completely if * scp_sftp_wildcard is set, because that's an * indication that we're not actually supposed to * _recursively_ transfer the dir, just scan it for * things matching the wildcardif (scp_sftp_dirstack_head) { act->action = SCP_SINK_RETRY; return 0; } else { return 1; } Revision-number: 1211 Prop-content-length: 251 Content-length: 251 K 8 svn:date V 27 2001-08-27T14:51:31.000000Z K 7 svn:log V 150 Fix tiny bug in new sftp-mode wildcards: when there wasn't a leading path component (just `host:*' rather than `host:directory/*') there was trouble. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9cf8469b4ccdff48b0a435658dc2edc1 Text-delta-base-sha1: 8ade5486ab93ed17448818acc2d7bed44007ab9b Text-content-length: 366 Text-content-md5: 7761bbb5120856147a09e911afa41a65 Text-content-sha1: daf924be17d55f2197b5b651043ce4f39f174e20 Content-length: 406 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNW+5+P# 8CHRz else if (!*dupsource) { /* * The remains of dupsource are _empty_ - the whole * pathname was a wildcard. Hence we need to * replace it with ".". */ sfree(dupsource); dupsource = dupstr(".")printf("oi :%s:\n", fname)printf("ooh\n");printf("got :%s:\n", fnameprintf("filename :%s:\n", fname); Revision-number: 1212 Prop-content-length: 454 Content-length: 454 K 8 svn:date V 27 2001-08-27T15:02:52.000000Z K 7 svn:log V 353 Finally tighten up the server-side wildcard security hole, the _right_ way. (SSWs are disabled by default and can be re-enabled using `-unsafe', meaning that pscp will _never_ do anything unexpected to your local file system unless you explicitly give consent. The sftp-based variant will work fine because the corresponding mechanism is _not_ unsafe.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7761bbb5120856147a09e911afa41a65 Text-delta-base-sha1: daf924be17d55f2197b5b651043ce4f39f174e20 Text-content-length: 1225 Text-content-md5: 8919af94761afd7746544d206366d5ac Text-content-sha1: a444001e7a374b7b4df8e1ccc540c426d0b5a243 Content-length: 1265 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNW6Irl3_ .IEw,] i(u,Qwmjint scp_unsafe_modeIdeally in this case, we would like * to ensure that the returned filename actually * matches the wildcard pattern - but one of SCP's * protocol infelicities is that wildcard matching is * done at the server end _by the server's rules_ and * so in general this is infeasible. Hence, we only * accept filenames that don't correspond to `src' if * unsafe mode is enabled or we are using SFTP (which * resolves remote wildcards on the client side and can * be trusted).strcmp(striptarget, stripsrc) && !using_sftp && !scp_unsafe_mode) { tell_user(stderr, "warning: remote host tried to write " "to a file called '%s'", striptarget); tell_user(stderr, " when we requested a file " "called '%s'.", stripsrc); tell_user(stderr, " If this is a wildcard, " "consider upgrading to SSH 2 or using"); tell_user(stderr, " the '-unsafe' option. Renaming" " of this file has been disallowed. printf(" -unsafe allow server-side wildcards (DANGEROUS)unsafe") == 0) scp_unsafe_mode Revision-number: 1213 Prop-content-length: 577 Content-length: 577 K 8 svn:date V 27 2001-08-27T15:13:14.000000Z K 7 svn:log V 476 Port forwarding bug fix: we were unable to handle receiving CHANNEL_OPEN_FAILURE messages, which occur when the remote side is unable to open a forwarded network connection we have requested. (It seems they _don't_ show up if you get something mundane like Connection Refused - the channel is cheerfully opened and immediately slammed shut - but they do if you try to connect to a host that doesn't even exist. Try forwarding a port to frogwibbler:4800 and see what you get.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e4276368a3890db99f6eb2f97907e22f Text-delta-base-sha1: b6be145d02dd4bae77a73bc0dfd20d51f6163d86 Text-content-length: 786 Text-content-md5: 555d7a00e1c3117802a443ff150dbdfb Text-content-sha1: 998fc19e9165d636b339414b415e3ab81b98fbd6 Content-length: 827 K 15 cvs2svn:cvs-rev V 5 1.158 PROPS-END SVN o}q`OPEN_FAILURElogevent("Forwarded connection refused by server"); pfd_close(c->u.pfd.s); del234(ssh_channels, c); sfree(cnd=/gBAv=1; username[99] = '\0'; if ((flags & FLAG_VERBOSE) || (flags & FLAG_INTERACTIVE)) { sprintf(stuff, "Using username \"%s\".\r\n", username); c_write_str(stuff); } } /* * Send an authentication request using method "none": (a) * just in case it succeeds, and (b) so that we know what * authentication methods we can usefully try next. */ ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(use_FAILUREfailing this */ logevent("Forwarded connection refused by server"); pfd_close(c->u.pfd.s); del234(ssh_channels, c); sfree(c Revision-number: 1214 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2001-08-27T15:55:44.000000Z K 7 svn:log V 38 Add a couple of missing return values K 10 svn:author V 5 simon PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 147c3bdee1ca93c268a0bb324f21b495 Text-delta-base-sha1: 1ecd44a9e29ca8a646f6c506e0ebfdd42015ab99 Text-content-length: 49 Text-content-md5: f5da8efd00a7ac850bc3d61f56da3027 Text-content-sha1: 0f572541128f16fdc25f67d550c7bd882ab44f94 Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNjk A\ if (s == NULL) return 0 Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b392408d191e89d2b30c545721b5eb7b Text-delta-base-sha1: 6b5055daed760a099c8c3f10f33cffbe5a615397 Text-content-length: 49 Text-content-md5: 7034c073ebc82cdb71d0e1517a88f565 Text-content-sha1: a163b9143e1b8c976158ede65d557142cacd3ec6 Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN  N; if (s == NULL) return 0 Revision-number: 1215 Prop-content-length: 369 Content-length: 369 K 8 svn:date V 27 2001-08-27T15:59:37.000000Z K 7 svn:log V 268 Port forwarding update: local-host-only listening sockets are now done properly (by binding to INADDR_LOOPBACK) instead of hackishly (by binding to INADDR_ANY, looking at the peer address when a connection is accepted, and slamming the connection shut at that point). K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 90506cee1d5f149fa4b1fde2ddf36270 Text-delta-base-sha1: 662b20f345697150c9fdf9b582d114ce30bb0f02 Text-content-length: 101 Text-content-md5: 8ea0e9da469d6bb6065c7583542eb4d5 Text-content-sha1: 01f3d8cc9ee8fae6ad6c836e5863f01b0b7775ff Content-length: 141 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN%E}'@;!er(int port, Plug plug, int local_host_onlysock) (((*p)->accepting)(p Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 073726ff6502f3472b84557df492af23 Text-delta-base-sha1: c36adb16ecba1919e12d766703a7359399c6ee59 Text-content-length: 115 Text-content-md5: 8391c8622b607f8e74ee307b4649020c Text-content-sha1: 3bf9406862cbb3d5b01666b31d0e8c95ca6b9bc4 Content-length: 154 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNm Mc '5 dvoid *sock) {Socket s; char *err;er(port, (Plug) pr, !cfg.lport_acceptall Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d907e504b8068024b6c0dfc4114d1539 Text-delta-base-sha1: d3ca5c633711dcdab1791aa029363225d3d139e1 Text-content-length: 701 Text-content-md5: d36012bfbd9eaa7bc5cf2d1ef44c0197 Text-content-sha1: 7c406e9b0e9ea8c85a1620deddd0893bb154bc85 Content-length: 741 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN|.,o(v/dVxO\N%G5er(int port, Plug plug, int local_host_only if (local_host_only) a6.sin6_addr = in6addr_loopback; else a6.sin6_addr = in6addr_any;if (local_host_only) a.sin_addr.s_addr = htonl(INADDR_LOOPBACK); else struct sockaddr isa; int addrlen = sizeof(struct sockaddr); SOCKET t; /* socket of connection */ memset(&isa, 0, sizeof(struct sockaddr)); err = 0; t = accept(s->s,&isa,&addrlen); if (t == INVALID_SOCKET) { err = WSAGetLastError(); if (err == WSATRY_AGAIN) break; } if (plug_accepting(s->plug, (void*)t)) { closesocket(t); /* denied or error */ Revision-number: 1216 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2001-08-27T16:58:47.000000Z K 7 svn:log V 110 Fix handling of SSH2_MSG_CHANNEL_CLOSE, which was breaking in port forwarding talking to ssh.com's ssh-3.0.1. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 555d7a00e1c3117802a443ff150dbdfb Text-delta-base-sha1: 998fc19e9165d636b339414b415e3ab81b98fbd6 Text-content-length: 318 Text-content-md5: 69b89be482c4c4de8e2d5e0acf1055a8 Text-content-sha1: 6ae74f2312288684112b8c81865124e08d82edaf Content-length: 359 K 15 cvs2svn:cvs-rev V 5 1.159 PROPS-END SVNd017 -(u.x11.s != NULL) x11_close(c->u.x11.s); sshfwd_close(c); break; case CHAN_AGENT: sshfwd_close(c); break; case CHAN_SOCKDATA: if (c->u.pfd.s != NULL) pfd_close(c->u.pfd.s); sshfwd_close(c); break; } Revision-number: 1217 Prop-content-length: 545 Content-length: 545 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-27T17:40:03.000000Z K 7 svn:log V 444 PuTTYgen: add an extra button to save a public key into a file (as well as showing it for cut and paste). For SSH1, this feature is largely cosmetic and added for orthogonality; it comes into its own in SSH2, where it saves the Official One True Public Key Format as specified in the draft spec, and more particularly as used by ssh.com's product for authentication. Now that ssh-3.0.1 supports RSA user keys, this is suddenly actually useful. PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b90c1cc8e7610d556a8607ab56465940 Text-delta-base-sha1: 8f2c4eab7d7dfdb300380c43e72a6815c9ef96fa Text-content-length: 2799 Text-content-md5: 38cab8f33857706b1df097ac9864e770 Text-content-sha1: c2ef6ff329d7ece2ac60390041ebbc40bbbd22aa Content-length: 2839 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNf8BkwiXhYR@wZ(E?*)4\h_yY\oLDxIb?4" k`j+BG?s<pVvsUint idstaticSetDlgItemText(hwnd, idstatic, "&Public key for pasting into authorized_keys file:"int idstatic, SetDlgItemText(hwnd, idstatic, "&Public key for pasting into " "OpenSSH authorized_keys2 file:"); sfree(pub_blob); sfree(buffer); } static int save_ssh1_pubkey(char *filename, struct RSAKey *key) { char *dec1, *dec2; FILE *fpfp = fopen(filename, "wb"); if (!fp) return 0; fprintf(fp, "%d %s %s %s\n", bignum_bitcount(key->modulus), dec1, dec2, key->comment); fclose(fp); sfree(dec1); sfree(dec2); return 1; } static int save_ssh2_pubkey(char *filenamep; int pub_len; int i, column; FILE *fp; pub_blob = key->alg->public_blob(key->data, &pub_len); fp = fopen(filename, "wb"); if (!fp) return 0; fprintf(fp, "---- BEGIN SSH2 PUBLIC KEY ----\n"); fprintf(fp, "Comment: \""); for (p = key->comment; *p; p++) { if (*p == '\\' || *p == '\"') fputc('\\', fp); fputc(*p, fp); } fprintf(fp, "\"\n"); i = 0; column = 0; while (i < pub_len) { char buf[5]; int n = (pub_len - i < 3 ? pub_len - i : 3); base64_encode_atom(pub_blob + i, n, buf); i += n; buf[4] = '\0'; fputs(buf, fp); if (++column >= 16) { fputc('\n', fp); column = 0; } } if (column > 0) fputc('\n', fp); fprintf(fp, "---- END SSH2 PUBLIC KEY ----\n"); fclose(fp); sfree(pub_blob); return 1 IDC_SAVEPUB1rb2btn(&cp, "Save the generated key", IDC_SAVESTATIC, "Save p&ublic key", IDC_SAVEPUB, "&Save private keys EnableWindow(GetDlgItem(hwnd, IDC_SAVEPUB IDC_PKSTATIC, &state->ssh2key); } else { setupbigedit1(hwnd, IDC_KEYDISPLAY, IDC_PKSTATIC, EnableWindow(GetDlgItem(hwnd, IDC_SAVEPUB), 0); EnableWindow(GetDlgItem(hwnd, IDC_KEYSSH1), 0); EnableWindow(GetDlgItem(hwnd, IDC_KEYSSH2RSA), 0); EnableWindow(GetDlgItem(hwnd, IDC_BITSSAVEPUBif (prompt_keyfile(hwnd, "Save publicave_ssh2_pubkey(filename, &state->ssh2key); } else { ret = save_ssh1_pubkey(filename, &state->keyEnableWindow(GetDlgItem(hwnd, IDC_SAVEPUB), 1); EnableWindow(GetDlgItem(hwnd, IDC_KEYSSH1), 1); EnableWindow(GetDlgItem(hwnd, IDC_KEYSSH2RSA), 1); EnableWindow(GetDlgItem(hwnd, IDC_BITSIDC_PKSTATIC,IDC_PKSTATIC,EnableWindow(GetDlgItem(hwnd, IDC_SAVEPUB), 1); EnableWindow(GetDlgItem(hwnd, IDC_KEYSSH1), 1); EnableWindow(GetDlgItem(hwnd, IDC_KEYSSH2RSA), 1); EnableWindow(GetDlgItem(hwnd, IDC_BITSr * .ssh/authorized_keys2 IDC_PKSTATIC, &state->ssh2key); } else { setupbigedit1(hwnd, IDC_KEYDISPLAY, IDC_PKSTATIC Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1bb87afb1a6b25c785defd343df72289 Text-delta-base-sha1: b741182052ea59c7c757a5fce326e83b73b1e939 Text-content-length: 559 Text-content-md5: 5734ec8c7a7a288453ad319ba9ac7128 Text-content-sha1: 8edef819904ad2db891cf5b58a2a8e4c9c268448 Content-length: 599 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNt70qy{U'I|_oI|_o-GLike staticbtn, but two buttons. */ void static2btn(struct ctlpos *cp, char *stext, int sid, char *btext1, int bid1, char *btext2, int bid21, rwid2, rpos1, rpos2; rpos1 = GAPBETWEEN + (cp->width + GAPBETWEEN) / 2; rpos2 = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4; lwid = rpos1 - 2 * GAPBETWEEN; rwid1 = rpos2 - rpos1 - GAPBETWEEN; rwid2 = cp->width + GAPBETWEEN - rpos211; r.bottom = PUSHBTNHEIGHT1, bid1); r.left = rpos22; r.bottom = PUSHBTNHEIGHT2, bid2 Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 87f7fee65acb390fce2d4bddee16b0a6 Text-delta-base-sha1: 4aa62bdc1ebd82b1bcb18cd915089c4c74899c4b Text-content-length: 116 Text-content-md5: 9e09aa88aed4f71012b51bac8d75260f Text-content-sha1: ee6be8637ab4fd985a55bc53acc3328b1f985e10 Content-length: 155 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN v ^ ^|2btn(struct ctlpos *cp, char *stext, int sid, char *btext1, int bid1, char *btext2, int bid2 Revision-number: 1218 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 Fix various small compiler warnings, mostly unused local variables K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-28T08:08:43.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7be3bb175b1d2846898df9df0b4cf32e Text-delta-base-sha1: 9e5f7b410be88e836802a11b1818e952147b6297 Text-content-length: 110 Text-content-md5: 01b4978105461e4da489843f2776098b Text-content-sha1: eba496719afc77e2a0657ffa4ef1d171c9893fe6 Content-length: 150 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNM$ UVUyT /* this line can't be reached but it placates MSVC's warnings :-) */ return 0 Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9aae9f813d63ad9626b99e99630f1592 Text-delta-base-sha1: 63826ce9310649c513e93d603354776871c61530 Text-content-length: 69 Text-content-md5: 56ae9738c1ac66b3b1b8da0da79e2b2a Text-content-sha1: e150ac89423dc89b29691c75cc8f59e812411aef Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNV . \zHANDLE h = (is_stderr ? errhandle : outhandle) Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8919af94761afd7746544d206366d5ac Text-delta-base-sha1: a444001e7a374b7b4df8e1ccc540c426d0b5a243 Text-content-length: 77 Text-content-md5: afe0e6ae9648e10dbfb6471fc96202f6 Text-content-sha1: c814f9375b79063d4fecd747edae88c46c9e78a4 Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVN6'Vem|,iOD$namenameint targisdir = 0 Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e81a8c0e333a66b0a0a79d287143a2a Text-delta-base-sha1: f53215457dcea8139c4edecdffd0611105e4d862 Text-content-length: 23 Text-content-md5: a568396e533d15ce1863083f22fa89f5 Text-content-sha1: fe826d8c9a0a8b8c4cd28f619c41260354654aaa Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNqn or Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 69b89be482c4c4de8e2d5e0acf1055a8 Text-delta-base-sha1: 6ae74f2312288684112b8c81865124e08d82edaf Text-content-length: 52 Text-content-md5: be69601e1f5d0772178823c88700e121 Text-content-sha1: 7de50246e9772c42186e0b278263858f688196d1 Content-length: 93 K 15 cvs2svn:cvs-rev V 5 1.160 PROPS-END SVN 6@@; use Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5734ec8c7a7a288453ad319ba9ac7128 Text-delta-base-sha1: 8edef819904ad2db891cf5b58a2a8e4c9c268448 Text-content-length: 35 Text-content-md5: 7300962b031fb803b43b5a48382f63a5 Text-content-sha1: 43d1454f96db5ab124c069b21fb8b679fb8b2036 Content-length: 75 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN7,|W Tc(int) Revision-number: 1219 Prop-content-length: 294 Content-length: 294 K 8 svn:date V 27 2001-08-28T08:36:27.000000Z K 7 svn:log V 193 Fix externally added SSH1 keys in Pageant. I have no idea how this code _ever_ worked before! But it's been like this for four months and nobody has noticed, including me. That's quite spooky. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 01b4978105461e4da489843f2776098b Text-delta-base-sha1: eba496719afc77e2a0657ffa4ef1d171c9893fe6 Text-content-length: 404 Text-content-md5: fc6ee6ea61052a6ad95dc8b10dffc5ff Text-content-sha1: 6d6e4cce1f3b9fb6fdda889103f336a2a3f6bd32 Content-length: 444 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN$k0QC}5o int commentlen&key->iqmp); /* p^-1 mod q */ p += ssh1_read_bignum(p, &key->p); /* p */ p += ssh1_read_bignum(p, &key->q); /* q */ commentlen = GET_32BIT(p); comment = smalloc(commentlen+1); if (comment) { memcpy(comment, p + 4, commentlen); comment[commentlen] = '\0'; key->comment = comment; } Revision-number: 1220 Prop-content-length: 474 Content-length: 474 K 7 svn:log V 373 D'oh! Putting keyboard-interactive authentication _before_ publickey causes password login to occur on a server that supports password- through-k-i. Of course when we use the new preference list mechanism for selecting the order of authentications this will all become much more sane, but for the moment I've put publickey back up to the top and things seem to be happier. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-28T08:43:33.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: be69601e1f5d0772178823c88700e121 Text-delta-base-sha1: 7de50246e9772c42186e0b278263858f688196d1 Text-content-length: 54 Text-content-md5: 6e3a6bdd55182dc314e01222e269a2af Text-content-sha1: a0927e06e18bf09e6d3ae3918ab5143696307b9c Content-length: 95 K 15 cvs2svn:cvs-rev V 5 1.161 PROPS-END SVNH gkx Revision-number: 1221 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2001-08-28T09:53:51.000000Z K 7 svn:log V 87 Add documentation of the new PSCP `-unsafe' option and the associated warning message. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 34f020988186d43a852ad7a3476285cd Text-delta-base-sha1: 7d205bd5a26abe9bb09161ade1a0cf7049b98ada Text-content-length: 2274 Text-content-md5: 584600e9a101e94663ca0f6051922f3c Text-content-sha1: 132511b2195da8f2317ffa0b721632f2dbe05260 Content-length: 2314 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNGu=X2r{nkxG\versionid $Id: pscp.but,v 1.13 2001/08/28 09:53:5You can use wildcards to transfer multiple files in either direction, like this: \c pscp c:\documents\*.doc fred@example.com:docfiles \c pscp fred@example.com:source/*.c c:\source However, in the second case (using a wildcard for multiple remote files) you may see a warning like this: \c warning: remote host tried to write to a file called 'terminal.c' \c when we requested a file called '*.c'. \c If this is a wildcard, consider upgrading to SSH 2 or using \c the '-unsafe' option. Renaming of this file has been disallowed. This is due to a fundamental insecurity in the old-style SCP protocol: the client sends the wildcard string (\c{*.c}) to the server, and the server sends back a sequence of file names that match the wildcard pattern. However, there is nothing to stop the server sending back a \e{different} pattern and writing over one of your other files: if you request \c{*.c}, the server might send back the file name \c{AUTOEXEC.BAT} and install a virus for you. Since the wildcard matching rules are decided by the server, the client cannot reliably verify that the filenames sent back match the pattern. PSCP will attempt to use the newer SFTP protocol (part of SSH 2) where possible, which does not suffer from this security flaw. If you are talking to an SSH 2 server which supports SFTP, you will never see this warning. If you really need to use a server-side wildcard with an SSH 1 server, you can use the \c{-unsafe} command line option with PSCP: \c pscp -unsafe fred@example.com:source/*.c c:\source This will suppress the warning message and the file transfer will happen. However, you should be aware that by using this option you are giving the server the ability to write to \e{any} file in the target directory, so you should only use this option if you trust the server administrator not to be malicious (and not to let the server machine be cracked by malicious people).Return value PSCP returns an \cw{ERRORLEVEL} of zero (success) only if the files were correctly transferred. You can test for this in a batch file, using code such as this: \c pscp file*.* user@hostname: \c if errorlevel 1 echo There was an error Revision-number: 1222 Prop-content-length: 502 Content-length: 502 K 7 svn:log V 401 Semantic fix in the X11 `authentication failed' error packet construction. Doesn't actually affect anything right now, since the bug was a failure to round a length up to the next multiple of 4 and it so happens that our current message was exactly 40 bytes anyway :-) But if we start giving a wider variety of messages one day then it might be handy to be able to do them without gratuitous crashes. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-28T12:24:50.000000Z PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 63713b351b93dacc4d4a3c27699441e8 Text-delta-base-sha1: f7e9b8d1878697184d74bddd2926eec1edd8b8f3 Text-content-length: 32 Text-content-md5: 72bd4a02eb4d2f46b3a2271a98330abc Text-content-sha1: af48e2df0d95b24aaa9012528f10c5d9616ca671 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNll CNsize >> 2); Revision-number: 1223 Prop-content-length: 377 Content-length: 377 K 7 svn:log V 276 stripslashes() should have been dealing with colons as well. I don't _think_ there was an exploit (even if the server sends "c:foobar", the client will not attempt to create "c:foobar"; instead it will try to create ".\c:foobar" which will fail), but it's as well to be sure. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-08-28T12:26:16.000000Z PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: afe0e6ae9648e10dbfb6471fc96202f6 Text-delta-base-sha1: c814f9375b79063d4fecd747edae88c46c9e78a4 Text-content-length: 403 Text-content-md5: bbc9bacc794c73da3d89020c63c1294c Text-content-sha1: 71e8748dec748ed34a5aed99b7df514484eee09c Content-length: 443 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNS+Zd_dJ6=nsB>B or colonif (local) { p = strchr(str, ':'); if (p) str = p+1; }or colons in at all; so * we'll find the last slash, backslash or colon in the * filename and use only the part after that. (And *'%s'", act.name); tell_user(stderr, " renaming local file to '%s'", striptarget Revision-number: 1224 Prop-content-length: 234 Content-length: 234 K 8 svn:date V 27 2001-08-29T08:56:26.000000Z K 7 svn:log V 133 Fix segfault (should free act.buf not act.name, because the latter might not point at the start of the former). Cheers Minefield :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bbc9bacc794c73da3d89020c63c1294c Text-delta-base-sha1: 71e8748dec748ed34a5aed99b7df514484eee09c Text-content-length: 28 Text-content-md5: aaf06b6e2012503ecb196e7b19df0aae Text-content-sha1: 038afaa944190f42a052e1e8b6883f47faf1965e Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVNSR 2!buf Revision-number: 1225 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:56.105614Z PROPS-END Revision-number: 1226 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:56.112338Z PROPS-END Revision-number: 1227 Prop-content-length: 255 Content-length: 255 K 7 svn:log V 154 When pscp in SFTP mode does client-side matching of a server-side wildcard, it's polite to let the user know if the wildcard didn't match any file names. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-05T19:33:12.000000Z PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aaf06b6e2012503ecb196e7b19df0aae Text-delta-base-sha1: 038afaa944190f42a052e1e8b6883f47faf1965e Text-content-length: 348 Text-content-md5: fd77fc06484fb93ef830eda1a54ced57 Text-content-sha1: a124a245f130f2b5187eaa5206447ae431f3a672 Content-length: 388 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVNRm%)vHEuf7'R3Q int matched_something; /* wildcard match set was non-empty */head->matched_something = 1;if (!head->matched_something) { tell_user(stderr, "pscp: wildcard '%s' matched " "no files", head->wildcard); errs++; } sfree(head->wildcard); newitem->matched_something = 0 Revision-number: 1228 Prop-content-length: 329 Content-length: 329 K 8 svn:date V 27 2001-09-05T19:48:52.000000Z K 7 svn:log V 228 PSFTP will now attempt to find /usr/[local]/lib/sftp-server if it can't start the sftp subsystem. This should enable convenient sftp access to SSH1-only systems: all the admin needs is to install sftp-server in the right place. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7eac267c4c6d3cc4cf4d9c7f4214c941 Text-delta-base-sha1: d30256fffb82c234d8777825a09adf3b99841a2a Text-content-length: 927 Text-content-md5: bbc8816cfe5310f2da8bf2ca0d659dc7 Text-content-sha1: 9b7d45da6485b25ccb489c96e8a18c4388f7a91e Content-length: 967 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNYH~](~\}/* * Set up fallback option, for SSH1 servers or servers with the * sftp subsystem not enabled but the server binary installed * in the usual place. We only support fallback on Unix * systems, and we use the kludgy command string * * if test ! -x /usr/lib/sftp-server -a -x /usr/local/lib/sftp-server * then * exec /usr/local/lib/sftp-server * else * exec /usr/lib/sftp-server * fi * * the idea being that this will attempt to use either of the * obvious pathnames and then give up, and when it does give up * it will print the preferred pathname in the error messages. */ cfg.remote_cmd_ptr2 = "if test ! -x /usr/lib/sftp-server -a -x /usr/local/lib/sftp-server\n" "then\n" " exec /usr/local/lib/sftp-server\n" "else\n" " exec /usr/lib/sftp-server\n" "fi"; cfg.ssh_subsys2 = FALS Revision-number: 1229 Prop-content-length: 256 Content-length: 256 K 8 svn:date V 27 2001-09-05T19:58:25.000000Z K 7 svn:log V 155 Better yet, look for sftp-server on the user's PATH as well, which allows individual users with shell access to install it without reference to the admin. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bbc8816cfe5310f2da8bf2ca0d659dc7 Text-delta-base-sha1: 9b7d45da6485b25ccb489c96e8a18c4388f7a91e Text-content-length: 579 Text-content-md5: de44c9a30377417cf8b8ddd2215e5e71 Text-content-sha1: 6092ad6a3687bf95c22c52f1c398082777e22638 Content-length: 619 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNH[Nv3yOa kludgy piece of shellery which should * try to find sftp-server in various places (the obvious * systemwide spots /usr/lib and /usr/local/lib, and then the * user's PATH) and finally give up. * * test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server * test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server * exec sftp-servertest -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" "exec sftp-server Revision-number: 1230 Prop-content-length: 447 Content-length: 447 K 8 svn:date V 27 2001-09-05T21:01:04.000000Z K 7 svn:log V 346 Unicode cleanup phase 2: we now reintroduce the ability to enter a numeric code page, and also reinstate the direct-to-font zero translation mode (but now under an actual _name_ rather than blank). Also add CP437 to the list since at least one expatriate DOS user wanted it; also select a sensible ISO or KOI codepage based on the system locale. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a568396e533d15ce1863083f22fa89f5 Text-delta-base-sha1: fe826d8c9a0a8b8c4cd28f619c41260354654aaa Text-content-length: 188 Text-content-md5: 7e690780d1e0d4eaf18ad1e4a1ff394d Text-content-sha1: 54419dfac0b377dfb9048ebdc3ef8766839ea79a Content-length: 228 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNn`  ,B/* * The empty default for LineCodePage will be converted later * into a plausible default for the locale. */ gpps(sesskey, "LineCodePage", " Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 58587012983588434cc861f74f2d5b67 Text-delta-base-sha1: e2995eea34389127a4245b268a86110f80cf0d05 Text-content-length: 1773 Text-content-md5: fef70bc6627a37ed458e4f6c7cb43d95 Text-content-sha1: c5fc3041cbe056a1b8300f19d92765c9a2986aa4 Content-length: 1812 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNUB+76ocR_v{"Win1258 (Vietnamese)", 1258}, {"CP437", 437}, {"CP819", 28591}, {"CP878", 20866}, {"Use font encoding", -1}, !*cp_name) { /* * Here we select a plausible default code page based on * the locale the user is in. We wish to select an ISO code * page or appropriate local default _rather_ than go with * the Win125* series, because it's more important to have * CSI and friends enabled by default than the ghastly * Windows extra quote characters, and because it's more * likely the user is connecting to a remote server that * does something Unixy or VMSy and hence standards- * compliant than that they're connecting back to a Windows * box using horrible nonstandard charsets. * * Accordingly, Robert de Bath suggests a method for * picking a default character set that runs as follows: * first call GetACP to get the system's ANSI code page * identifier, and translate as follows: * * 1250 -> ISO 8859-2 * 1251 -> KOI8-U * 1252 -> ISO 8859-1 * 1253 -> ISO 8859-7 * 1254 -> ISO 8859-9 * 1255 -> ISO 8859-8 * 1256 -> ISO 8859-6 * 1257 -> ISO 8859-4 * * and for anything else, choose direct-to-font. */ int cp = GetACP(); switch (cp) { case 1250: cp_name = "ISO-8859-2"; break; case 1251: cp_name = "KOI8-U"; break; case 1252: cp_name = "ISO-8859-1"; break; case 1253: cp_name = "ISO-8859-7"; break; case 1254: cp_name = "ISO-8859-9"; break; case 1255: cp_name = "ISO-8859-8"; break; case 1256: cp_name = "ISO-8859-6"; break; case 1257: cp_name = "ISO-8859-4"; break; /* default: leave it blank, which will select -1, direct->font */ } } if (codepage == -1) { sprintf(buf, "Use font encoding"); return buf; } Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7300962b031fb803b43b5a48382f63a5 Text-delta-base-sha1: 43d1454f96db5ab124c069b21fb8b679fb8b2036 Text-content-length: 57 Text-content-md5: 41469585e782c04418603b19c4f7666f Text-content-sha1: d7a02025259c043f2182cc95b2cb72cc6e81c47b Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN,o4WUcombo box. */ void combobox Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e7dcac10582ecccf58fdcc5623757c70 Text-delta-base-sha1: bbe410ad182f095e369454c1c15081ae3edc0364 Text-content-length: 566 Text-content-md5: 3b426d33095065f0a13a1a7fd18c05d5 Text-content-sha1: 2c438d0efd634ac3727033deb68c237a33af90ab Content-length: 607 K 15 cvs2svn:cvs-rev V 5 1.143 PROPS-END SVN}=&FL^GLG>|strcpy(cfg.line_codepage, cp_name(decode_codepage(cfg.line_codepage)))} SetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepagecombobox(&cp, "Received data assumed to be in which character set:", else if (HIWORD(wParam) == CBN_EDITCHANGE) { GetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage, sizeof(cfg.line_codepage) - 1); } else if (HIWORD(wParam) == CBN_KILLFOCUS) { strcpy(cfg.line_codepage, cp_name(decode_codepage(cfg.line_codepage))); SetDlgItemText(hwnd, IDC_CODEPAGE, Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9e09aa88aed4f71012b51bac8d75260f Text-delta-base-sha1: ee6be8637ab4fd985a55bc53acc3328b1f985e10 Text-content-length: 29 Text-content-md5: 7e16133e05ac01e2a1db0900673b40c6 Text-content-sha1: cbd086cfcae1277b65e6d13e0fa3dd2845e17f41 Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNvr F$Rcombobox Revision-number: 1231 Prop-content-length: 231 Content-length: 231 K 8 svn:date V 27 2001-09-05T21:02:27.000000Z K 7 svn:log V 130 Swap round the contents of the Translation panel. The codepage box should be at the top because it's by _far_ the most important. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3b426d33095065f0a13a1a7fd18c05d5 Text-delta-base-sha1: 2c438d0efd634ac3727033deb68c237a33af90ab Text-content-length: 37 Text-content-md5: e6feafed3d4c9487d268e4e7e6ade788 Text-content-sha1: 9deb1d7df47f8e9235f59de7664fe1ebc1aa3ce8 Content-length: 78 K 15 cvs2svn:cvs-rev V 5 1.144 PROPS-END SVN==\A#GLYd Revision-number: 1232 Prop-content-length: 283 Content-length: 283 K 8 svn:date V 27 2001-09-05T22:04:19.000000Z K 7 svn:log V 182 Fix the intermittent fault in the socket layer that was occasionally bombing out X forwarding. It turns out to be a workaround for YET ANOTHER useless WinSock implementation. Arrgh! K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d36012bfbd9eaa7bc5cf2d1ef44c0197 Text-delta-base-sha1: 7c406e9b0e9ea8c85a1620deddd0893bb154bc85 Text-content-length: 253 Text-content-md5: 5c543bd30ac509f08eaacec211f15804 Text-content-sha1: 35189b77ea3cb73180d9c86d08665792007097c5 Content-length: 293 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN.a[3y7OZT< WSABASEERRSome WinSock send() implementations can return * <0 but leave no sensible error indication - * WSAGetLastError() is called but returns zero or * a small number - so we check that case and treat * Revision-number: 1233 Prop-content-length: 240 Content-length: 240 K 7 svn:log V 139 Fix mouse hiding on keypresses, which was failing due to the Unicode patch having done something bizarre to the semantics of TranslateKey. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-07T20:18:55.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 52583c88f9acdc24916d468d84bd5c70 Text-delta-base-sha1: 7b0ee7955d0c2e368f6a533196f99dab6ecdb0e1 Text-content-length: 413 Text-content-md5: 2bf0c56cd2ddf7044cb1b290a691a51d Text-content-sha1: c3d8c5dc7545a12487b691e2dab509dea4de9d70 Content-length: 454 K 15 cvs2svn:cvs-rev V 5 1.148 PROPS-END SVN{=yg 0) { /* * We need not bother about stdin backlogs * here, because in GUI PuTTY we can't do * anything about it anyway; there's no means * of asking Windows to hold off on KEYDOWN * messages. We _have_ to buffer everything * we're sent. */ ldisc_send(buf, len); show_mouseptr(0); } show_mouseptr(0); Revision-number: 1234 Prop-content-length: 246 Content-length: 246 K 8 svn:date V 27 2001-09-07T20:32:33.000000Z K 7 svn:log V 145 Oops, fix that fix. TranslateKey can return <0 and it needs to be dealt with. I don't recall being told that; I should comment it at some stage. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2bf0c56cd2ddf7044cb1b290a691a51d Text-delta-base-sha1: c3d8c5dc7545a12487b691e2dab509dea4de9d70 Text-content-length: 28 Text-content-md5: 7eef4449a7664cbc89389f41c34900bd Text-content-sha1: 85c29e851a1e9aa73756e6fd4e52df79494c2669 Content-length: 69 K 15 cvs2svn:cvs-rev V 5 1.149 PROPS-END SVN=> != Revision-number: 1235 Prop-content-length: 305 Content-length: 305 K 8 svn:date V 27 2001-09-07T20:35:38.000000Z K 7 svn:log V 204 Jacob's patch to cause Shift to return to copy-and-paste when xterm mouse tracking is enabled. (This can be turned off if your app really wants Shift+mouse, but it defaults to on for general usefulness.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 395ba2433dc707e0ca08fb74c63d15bc Text-delta-base-sha1: be40c29f2a39d3ec3af6c62375d40b3151ae0ff4 Text-content-length: 39 Text-content-md5: e2f7b5077a6eb782caf86b932fc39f26 Text-content-sha1: fa79fe968af9540ae3a047cfe12a9f28f71bd694 Content-length: 80 K 15 cvs2svn:cvs-rev V 5 1.108 PROPS-END SVNl H*Bint mouse_override Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7e690780d1e0d4eaf18ad1e4a1ff394d Text-delta-base-sha1: 54419dfac0b377dfb9048ebdc3ef8766839ea79a Text-content-length: 144 Text-content-md5: 2212c59d4475b65bf0a80301e18dcb0f Text-content-sha1: 324a2c5be3c0162324b72746390c3b8ffb132bb2 Content-length: 184 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN`as_ XZwrite_setting_i(sesskey, "MouseOverride", cfg->mouse_overridegppi(sesskey, "MouseOverride", 1, &cfg->mouse_override Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d9959fe3318c8574cdc147006ce48760 Text-delta-base-sha1: 5213e2960f462d697166b7daa732a971fb61555c Text-content-length: 59 Text-content-md5: 33f3194cc62b24abab850aaa6a52d5ac Text-content-sha1: 7285218bac8730ff7d55beedf7fa3f3fb3ad2adb Content-length: 99 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVN,N "KaK && !(cfg.mouse_override && shift) Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e6feafed3d4c9487d268e4e7e6ade788 Text-delta-base-sha1: 9deb1d7df47f8e9235f59de7664fe1ebc1aa3ce8 Text-content-length: 288 Text-content-md5: 236778eb6c23f8e28e403e377a09ca24 Text-content-sha1: d5f6a444ce22c425f91b863681348b1ba09b786a Content-length: 329 K 15 cvs2svn:cvs-rev V 5 1.145 PROPS-END SVN=c5].~$H_7k-T &P&MOUSEOVERRIDEMOUSEOVERRIDE, cfg.mouse_overridep hstcheckbox(&cp, "Shift overrides a&pplication's use of mouse", IDC_MOUSEOVERRIDE breakMOUSEOVERRIDE: cfg.mouse_override = IsDlgButtonChecked(hwnd, IDC_MOUSEOVERRIDE Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7eef4449a7664cbc89389f41c34900bd Text-delta-base-sha1: 85c29e851a1e9aa73756e6fd4e52df79494c2669 Text-content-length: 87 Text-content-md5: e55cd460b79026f05411787176c29eb6 Text-content-sha1: 3b141fb0ca1ca1960060901299fcad7e6012a00e Content-length: 128 K 15 cvs2svn:cvs-rev V 5 1.150 PROPS-END SVN>x =VeY && !(cfg.mouse_override && shift)) { lastbtn = MBT_NOTHING; Revision-number: 1236 Prop-content-length: 232 Content-length: 232 K 7 svn:log V 131 Use WM_SETREDRAW to disable incremental updates while the config box is switching panels. Speeds things up hugely on slow systems. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-07T21:07:15.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 236778eb6c23f8e28e403e377a09ca24 Text-delta-base-sha1: d5f6a444ce22c425f91b863681348b1ba09b786a Text-content-length: 175 Text-content-md5: 1586c08d18f1bd2163f4e2d4d88dfabe Text-content-sha1: c43587eb4a19055251531ff8fcc2ac62d6f3a2f0 Content-length: 216 K 15 cvs2svn:cvs-rev V 5 1.146 PROPS-END SVNct cbW~e SendMessage (hwnd, WM_SETREDRAW, FALSE, 0); SendMessage (hwnd, WM_SETREDRAW, TRUE, 0); InvalidateRect (hwnd, NULL, TRU Revision-number: 1237 Prop-content-length: 297 Content-length: 297 K 8 svn:date V 27 2001-09-07T21:39:03.000000Z K 7 svn:log V 196 Robert de Bath's `Patch.a_alt_key': clean up the handling of Alt-Space, Alt-only and the System menu. It lets Windows do more of the work, and also saves a static variable, so it must be good :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e55cd460b79026f05411787176c29eb6 Text-delta-base-sha1: 3b141fb0ca1ca1960060901299fcad7e6012a00e Text-content-length: 884 Text-content-md5: 651319260f53cc350d68f1b0115d9a61 Text-content-sha1: e0d7dff509a254e9452dfdf2c0b6f086622e9396 Content-length: 925 K 15 cvs2svn:cvs-rev V 5 1.151 PROPS-END SVNx +;C Z4",{ d3E case SC_KEYMENU: /* * We get this if the System menu has been activated. * This might happen from within TranslateKey, in which * case it really wants to be followed by a `space' * character to actually _bring the menu up_ rather * than just sitting there in `ready to appear' state. */ if( lParam == 0 ) PostMessage(hwnd, WM_CHAR, ' ', 0} if ((shift_state&2) == 0) switch (wParam) { * ALT alone may or may not want to bring up the System menu. * If it's not meant to, we return 0 on presses or releases of * ALT, to show that we've swallowed the keystroke. Otherwise * we return -1, which means Windows will give the keystroke * its default handling (i.e. bring up the System menu). */ if (wParam == VK_MENU && !cfg.alt_only) return Revision-number: 1238 Prop-content-length: 207 Content-length: 207 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-07T22:04:44.000000Z K 7 svn:log V 106 Fix gratuitous assertion failure in Plink (ssh1_throttle_count was being decremented far too many times). PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6e3a6bdd55182dc314e01222e269a2af Text-delta-base-sha1: a0927e06e18bf09e6d3ae3918ab5143696307b9c Text-content-length: 183 Text-content-md5: 34e410c347413de49ce47b4b58a0879c Text-content-sha1: a9f83d2b4d27b211f2b69eea0f4cc35c46a1d1f2 Content-length: 224 K 15 cvs2svn:cvs-rev V 5 1.162 PROPS-END SVN2/>!ssh1_stdout_throttling && !c->v.v1.throttling && H LuSu strncpy(username, cfg.username, 99); usessh1_stdout_throttling && Revision-number: 1239 Prop-content-length: 266 Content-length: 266 K 8 svn:date V 27 2001-09-07T22:39:01.000000Z K 7 svn:log V 165 Robert de Bath's asynchronous-connect patch. Helps a lot in port forwarding; improves Event Log; and causes the PuTTY window to appear earlier in the setup process. K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8ea0e9da469d6bb6065c7583542eb4d5 Text-delta-base-sha1: 01f3d8cc9ee8fae6ad6c836e5863f01b0b7775ff Text-content-length: 65 Text-content-md5: cef420633183b4bf66a368f322d31738 Text-content-sha1: 259620bb9d46437bf97c0608181b86d6f1414375 Content-length: 105 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNM , getaddr(SockAddr addr, char *buf, int buflen Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 56ae9738c1ac66b3b1b8da0da79e2b2a Text-delta-base-sha1: e150ac89423dc89b29691c75cc8f59e812411aef Text-content-length: 162 Text-content-md5: 5301d0856d61c8a3dcb3033aefb59933 Text-content-sha1: 1c8b8821ef885552fcd2256fbab214936b39d3bc Content-length: 202 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN OEUe.(FD_CONNECT | FD_READ | FD_WRITE | FD_OOB | FD_CLOSE | FD_ACCEPT)CONNECT) connopen &= select_result(wp, (LPARAM) FD_CONNECT Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f5da8efd00a7ac850bc3d61f56da3027 Text-delta-base-sha1: 0f572541128f16fdc25f67d550c7bd882ab44f94 Text-content-length: 364 Text-content-md5: 2bcd1085b9d76071a79c59748304cfd5 Text-content-sha1: 3ce7dd83fc8fb94cdec06da8f64d7b64a729dbed Content-length: 404 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNk;ARHSMs ZFOstatic void raw_sent(Plug plug, int bufsize) { raw_bufsize = bufsize, raw_sent{ char buf[200]; sprintf(buf, "Looking up host \"%.170s\"", host); logevent(buf); }{ char buf[200], addrbuf[100]; sk_getaddr(addr, addrbuf, 100); sprintf(buf, "Connecting to %.100s port %d", addrbuf, port); logevent(buf); } Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7034c073ebc82cdb71d0e1517a88f565 Text-delta-base-sha1: a163b9143e1b8c976158ede65d557142cacd3ec6 Text-content-length: 373 Text-content-md5: 478a66880b5d96f325dde14eec13343a Text-content-sha1: d5d84a20c49f22f14c02521a40fd12a80ec14820 Content-length: 413 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN cJ7N_2sZGIAstatic void rlogin_sent(Plug plug, int bufsize) { rlogin_bufsize = bufsize, rlogin_sent{ char buf[200]; sprintf(buf, "Looking up host \"%.170s\"", host); logevent(buf); }{ char buf[200], addrbuf[100]; sk_getaddr(addr, addrbuf, 100); sprintf(buf, "Connecting to %.100s port %d", addrbuf, port); logevent(buf); } Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 34e410c347413de49ce47b4b58a0879c Text-delta-base-sha1: a9f83d2b4d27b211f2b69eea0f4cc35c46a1d1f2 Text-content-length: 543 Text-content-md5: de50d76899b94ee79be9b6001641b3ca Text-content-sha1: dde884ce1ae9b8bef538cddfac48acc3f1e84905 Content-length: 584 K 15 cvs2svn:cvs-rev V 5 1.163 PROPS-END SVNnBZ;=s{ char buf[200]; sprintf(buf, "Looking up host \"%.170s\"", host); logevent(buf); }{ char buf[200], addrbuf[100]; sk_getaddr(addr, addrbuf, 100); sprintf(buf, "Connecting to %.100s port %d", addrbuf, port); logevent(buf); } xxgned char) c >= 160)) && pos < sizeof(username)-1) { username[pos++] = c; c_write(&c, 1); } break; } } } c_write_str("\r\n"); username[strcspn(username, "\n\r")] = '\0'; } else { char stuff[200]; Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ccd322c5cda0d464cc81e6f5601174ae Text-delta-base-sha1: 9e4ba0e1cc1437654b1774344077105e1f67ba18 Text-content-length: 375 Text-content-md5: eb5e21361d357a691e9111d26fa50306 Text-content-sha1: 04ebf1e3b125e7823d13ac4c9f2b7748e6c51e70 Content-length: 415 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNvOJeN^`s>ZF, mstatic void telnet_sent(Plug plug, int bufsize) { telnet_bufsize = bufsize, telnet_sent{ char buf[200]; sprintf(buf, "Looking up host \"%.170s\"", host); logevent(buf); }{ char buf[200], addrbuf[100]; sk_getaddr(addr, addrbuf, 100); sprintf(buf, "Connecting to %.100s port %d", addrbuf, port); logevent(buf); } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 651319260f53cc350d68f1b0115d9a61 Text-delta-base-sha1: e0d7dff509a254e9452dfdf2c0b6f086622e9396 Text-content-length: 179 Text-content-md5: 733f84833b91aa2241a475fcd0fc6171 Text-content-sha1: feafe78eab4c3afadd60eaf4df3d60c8507e924f Content-length: 220 K 15 cvs2svn:cvs-rev V 5 1.152 PROPS-END SVN jJET|I>N(FD_CONNECT | FD_READ | FD_WRITE | FD_OOB | FD_CLOSE | FD_ACCEPT)if (WSAGETSELECTEVENT(lParam) != FD_READ) enact_pending_netevent(); Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5c543bd30ac509f08eaacec211f15804 Text-delta-base-sha1: 35189b77ea3cb73180d9c86d08665792007097c5 Text-content-length: 928 Text-content-md5: ad74e9c31da22b7c5a126f5dc6ba9c1c Text-content-sha1: 659e478e40455b13231b795e66457536c748e49b Content-length: 968 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNaBPvx+yb4)8dIds"`5L;>iIconnectedgetaddr(SockAddr addr, char *buf, int buflen) { #ifdef IPV6 if (addr->family == AF_INET) { #endif struct in_addr a; a.s_addr = htonl(addr->address); strncpy(buf, inet_ntoa(a), buflen); #ifdef IPV6 } else { FIXME; /* I don't know how to get a text form of an IPv6 address. */ } #endifconnected = 0; /* to start with */addr->family/* * We expect a potential EWOULDBLOCK here, because the * chances are the front end has done a select for * FD_CONNECT, so that connect() will complete * asynchronously. */ if ( err != WSAEWOULDBLOCK ) { ret->error = winsock_error_string(err); return (Socket) ret; } } else { /* * If we _don't_ get EWOULDBLOCK, the connect has completed * and we should set the socket as writable. */ ret->writable = 1CONNECT: s->connected = s->writable = 1; break; Revision-number: 1240 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2001-09-07T22:41:38.000000Z K 7 svn:log V 126 Patch from RDB: rename ISO-8859-12 to -13, add ISO-8859-16, and update the year specifications on some of the ISO-8859 names. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fef70bc6627a37ed458e4f6c7cb43d95 Text-delta-base-sha1: c5fc3041cbe056a1b8300f19d92765c9a2986aa4 Text-content-length: 930 Text-content-md5: 5d850aae812d1b8955ef5f2e3f6cbb0b Text-content-sha1: 005d5fcbc62c66f6783b016da5558d21756dd82c Content-length: 969 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN(%o?q@d^m~ aF|X?3iso_8859_16[] = { 0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B, 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C, 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A, 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x010711, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, 0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF:1997", 0, 96, iso_8859_11}, {"ISO-8859-13:1998", 0, 96, iso_8859_13}, {"ISO-8859-14:1998 {"ISO-8859-16:2001", 0, 96, iso_8859_16 Revision-number: 1241 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2001-09-07T22:43:31.000000Z K 7 svn:log V 90 Patch from RDB: fix the failure to display window-resize pointers when in raw mouse mode. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 733f84833b91aa2241a475fcd0fc6171 Text-delta-base-sha1: feafe78eab4c3afadd60eaf4df3d60c8507e924f Text-content-length: 56 Text-content-md5: ba7a714cc599568663614179eaadb493 Text-content-sha1: b6eb8ac6dc7d2322b9aab398ff3ab41068dc1a59 Content-length: 97 K 15 cvs2svn:cvs-rev V 5 1.153 PROPS-END SVNj 555 && LOWORD(lParam) == HTCLIENT Revision-number: 1242 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 2001-09-07T22:45:05.000000Z K 7 svn:log V 198 Patch from RDB: in the case where the protocol read from the settings file is unrecognised (i.e. PuTTYtel reading PuTTY's registry), fall back to the default _port_ as well as the default protocol. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2212c59d4475b65bf0a80301e18dcb0f Text-delta-base-sha1: 324a2c5be3c0162324b72746390c3b8ffb132bb2 Text-content-length: 111 Text-content-md5: bad3991acba54649bfc8373cdd761a09 Text-content-sha1: d7ebd81c48f5c449a4bc9966ca8c325e6830aef1 Content-length: 151 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNaM"C _acfg->port = default_portgppi(sesskey, "PortNumber", default_port, &cfg->port) Revision-number: 1243 Prop-content-length: 197 Content-length: 197 K 7 svn:log V 97 Pedantry patch from RDB: sanitise header use, correct one comment and remove an unused variable. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-07T22:49:17.000000Z PROPS-END Node-path: putty/mscrypto.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: efa11b095124ecbfe9b3d3a6b7f04150 Text-delta-base-sha1: 2d9fc607ac0feb052a77fc1885ed248a2788ccba Text-content-length: 85 Text-content-md5: 3f658debbf67b9208290d384e9229d66 Text-content-sha1: 8bfb9e99a1176427714d4ff2fed0f9733f629fe5 Content-length: 124 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN0tDD0#error "This file is no longer part of PuTTY, it will not compile." Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fd77fc06484fb93ef830eda1a54ced57 Text-delta-base-sha1: a124a245f130f2b5187eaa5206447ae431f3a672 Text-content-length: 23 Text-content-md5: 25d32969358f5f064da3ff68044145e5 Text-content-sha1: 703eafd349f24a5a962db9b57ef8db33bc5be6fd Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNm" _ Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 06a854f75d90240fd567db814b6f1c08 Text-delta-base-sha1: 30dcd0e46699a6df3ee9710045b6e8ac23f50894 Text-content-length: 92 Text-content-md5: bad98b59460e46d8803be11d406c5c0d Text-content-sha1: db365012d301971d97f2e6fe0cca6017bbfe914e Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN{gKK_#include #include #include #include struct interval { unsigned short first; unsigned short last; }; /* auxiliary function for binary search in interval table */ static int bisearch(wchar_t ucs, const struct interval *table, int max) { int min = 0; int mid; if (ucs < table[0].first || ucs > table[max].last) return 0; while (max >= min) { mid = (min + max) / 2; if (ucs > table[mid].last) min = mid + 1; else if (ucs < table[mid].first) max = mid - 1; else return 1; } return 0; } /* The following functions define the column width of an ISO 10646 * characterOther format characters (general category code Cf in the Unicode * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. * * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) * have a/* sorted list of non-overlapping intervals of non-spacing characters */ static const struct interval combining[] = { { 0x0300, 0x034E }, { 0x0360, 0x0362 }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, { 0x0591, 0x05A1 }, { 0x05A3, 0x05B9 }, { 0x05BB, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C4 }, { 0x064B, 0x0655 }, { 0x0670, 0x0670 }, { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x0A02, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x180B, 0x180E }, { 0x18A9, 0x18A9 }, { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x206A, 0x206F }, { 0x20D0, 0x20E3 }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, { 0xFB1E, 0xFB1E }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB } }; /* test for 8-bit control characters */ if (ucs == 0) return 0; if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) return -1; /* binary search in table of non-spacing characters */ if (bisearch(ucs, combining, sizeof(combining) / sizeof(struct interval) - 1)) return 0; /* if we arrive here, ucs is not a combining or C0/C1 control character */ return 1 + (ucs >= 0x1100 && (ucs <= 0x115f || /* Hangul Jamo init. consonants */ (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a && ucs != 0x303f) || /* CJK ... Yi */ (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ (ucs >= 0xffe0 && ucs <= 0xffe6) || (ucs >= 0x20000 && ucs <= 0x2ffff))); } int wcswidth(const wchar_t *pwcs, size_t n) { int w, width = 0; for (;*pwcs && n-- > 0; pwcs++) if ((w = wcwidth(*pwcs)) < 0) return -1; else width += w; return width; } /* * The following function is the same as wcwidth(), except that * spacing characters in the East Asian Ambiguous (A) category as * defined in Unicode Technical Report #11 have a column width of 2. * This experimental variant might be useful for users of CJK legacy * encodings who want to migrate to UCS. It is not otherwise * recommended for general use. */ static int wcwidth_cjk(wchar_t ucs) { /* sorted list of non-overlapping intervals of East Asian Ambiguous * characters */ static const struct interval ambiguous[] = { { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, { 0x00AA, 0x00AA }, { 0x00AD, 0x00AD }, { 0x00B0, 0x00B4 }, { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, { 0x0148, 0x014A }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, { 0x02DD, 0x02DD }, { 0x0391, 0x03A1 }, { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, { 0x201C, 0x201D }, { 0x2020, 0x2021 }, { 0x2025, 0x2027 }, { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, { 0x203B, 0x203B }, { 0x2074, 0x2074 }, { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, { 0x2113, 0x2113 }, { 0x2121, 0x2122 }, { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2154, 0x2155 }, { 0x215B, 0x215B }, { 0x215E, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, { 0x2190, 0x2199 }, { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B }, { 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, { 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E }, { 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 }, { 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F }, { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, { 0x2460, 0x24BF }, { 0x24D0, 0x24E9 }, { 0x2500, 0x254B }, { 0x2550, 0x2574 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, { 0x300A, 0x300B }, { 0x301A, 0x301B }, { 0xE000, 0xF8FF }, { 0xFFFD, 0xFFFD } }; /* binary search in table of non-spacing characters */ if (bisearch(ucs, ambiguous, sizeof(ambiguous) / sizeof(struct interval) - 1)) return 2; return wcwidth(ucs); } int wcswidth_cjk(const wchar_t *pwcs, size_t n) { int w, width = 0; for (;*pwcs && n-- > 0; pwcs++) if ((w = wcwidth_cjk(*pwcs)) < 0) return -1; else width += w; return width; } Revision-number: 1248 Prop-content-length: 233 Content-length: 233 K 7 svn:log V 132 RDB also points out we don't need the CJK `not recommended for general use' wcwidth function, so we condition it out to save space. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-07T23:00:37.000000Z PROPS-END Node-path: putty/wcwidth.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 79c32851c4a1bc1267f74d943c7e2249 Text-delta-base-sha1: 3841a806ee981040343f7dc0fd28a4adc149094d Text-content-length: 75 Text-content-md5: 78e645e3d38cfefcff0217bfa82e4986 Text-content-sha1: 3345ccae0d6c1804d92f1e31e9840e03f7be6905 Content-length: 114 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNx- 5^^#if 0 /* RDB: we don't need the cjk version */#endif Revision-number: 1249 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2001-09-07T23:02:07.000000Z K 7 svn:log V 72 Fix to link_font() from RDB. I must get him to comment some of this :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8018c8abc42836b6f69573585587f036 Text-delta-base-sha1: cf75cb148dc002de77258e4bd5583991543b2d2f Text-content-length: 342 Text-content-md5: f7e4a4c381ec81ac4b13edc7a01cfe84 Text-content-sha1: 0c267136130be42b17f7b9287f6c551dcd590147 Content-length: 382 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN]C:l:@font_index, line_index, i; for (line_index = 0; line_index < 256; line_index++) { if (DIRECT_FONT(line_tbl[line_index])) continue; for(i = 0; i < 256; i++) { font_index = ((32 + i) & 0xFF); if (line_tbl[line_index] == font_tbl[font_index]) { line_tbl[line_index] = (WCHAR) (attr + font_index Revision-number: 1250 Prop-content-length: 243 Content-length: 243 K 8 svn:date V 27 2001-09-08T10:33:56.000000Z K 7 svn:log V 142 When we receive SSH_MSG_DISCONNECT, say so in an error box because it's likely to be more helpful than `Strange packet received' or whatever. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: de50d76899b94ee79be9b6001641b3ca Text-delta-base-sha1: dde884ce1ae9b8bef538cddfac48acc3f1e84905 Text-content-length: 593 Text-content-md5: 5e19609002f25f60c283b07b231e0402 Text-content-sha1: aacad67b38a72c669186b86a48a8f9689a447384 Content-length: 634 K 15 cvs2svn:cvs-rev V 5 1.164 PROPS-END SVN R@OI#N bombout(("Server sent disconnect message:\n\"%s\"", buf+nowlen) bombout(("Server sent disconnect message\ntype %d (%s):\n\"%s\"", reason, (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) ? ssh2_disconnect_reasons[reason] : "unknown", buf+nowlen)  break; case 21: case 27: while (pos > 0) { c_write_str("\b \b"); pos--; } break; case 3: case 4: random_save_seed(); exit(0); break; default: if (((c >= ' ' && c <= '~') || ((unsi Revision-number: 1251 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2001-09-08T11:57:00.000000Z K 7 svn:log V 60 Fix error message: couldn't load _private_ key, not public. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5e19609002f25f60c283b07b231e0402 Text-delta-base-sha1: aacad67b38a72c669186b86a48a8f9689a447384 Text-content-length: 50 Text-content-md5: 5341e59b21933bf97276bbc5157fe20e Text-content-sha1: b12481da25b8116391347894cd4238472c42872a Content-length: 91 K 15 cvs2svn:cvs-rev V 5 1.165 PROPS-END SVN A9Frivate Revision-number: 1252 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2001-09-08T12:37:48.000000Z K 7 svn:log V 70 Jan Holmen Holsten's patch for drag-selects to scroll the scrollback. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ca88b1393481a8097813158b840f23f Text-delta-base-sha1: 82798b697ba79985eea8efd9f21f2857eab219b3 Text-content-length: 300 Text-content-md5: 3ed28841c5053de5ce8af05125e4c25c Text-content-sha1: 1cb10d70cd9c5ad5d02c21c39a53c193830440ec Content-length: 340 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVNh  @a int raw_mouse = xterm_mouse && !(cfg.mouse_override && shift); if (y < 0) { y = 0; if (a == MA_DRAG && !raw_mouse) term_scroll(0, -1); } if (y >= rows) { y = rows - 1; if (a == MA_DRAG && !raw_mouse) term_scroll(0, +1); }raw_mouse Revision-number: 1253 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2001-09-08T12:50:15.000000Z K 7 svn:log V 43 Jacob's TIS / CCard authentication tweaks. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5341e59b21933bf97276bbc5157fe20e Text-delta-base-sha1: b12481da25b8116391347894cd4238472c42872a Text-content-length: 1473 Text-content-md5: 6eb7046919d6697cad0815fa49a96b39 Text-content-sha1: 2e146c4c0fedce44a982c555ad465face4853189 Content-length: 1514 K 15 cvs2svn:cvs-rev V 5 1.166 PROPS-END SVN^ZjO]%& `c},'(]PZP|'Ef2KY']int tis_auth_refused, ccard_auth_refused tis_auth_refused = ccard_auth_refusedpwpkt_type = SSH1_CMSG_AUTH_PASSWORD; cfg.try_tis_auth && (supported_auths_mask & (1 << SSH1_AUTH_TIS)) && !tis_auth_refused tis_auth_refused = 1; continueTIS/* Prompt heuristic comes from OpenSSH */ strncpy(prompt + challengelen, memchr(prompt, '\n', challengelen) ? "": "\r\nResponse: ", (sizeof prompt) - challengelen); prompt[(sizeof prompt) - 1] = '\0'; } } if (cfg.try_tis_auth && (supported_auths_mask & (1 << SSH1_AUTH_CCARD)) && !ccard_auth_refused ccard_auth_refused = 1; continue memchr(prompt, '\n', challengelen) ? "" : "\r\nResponse/* Prompt may have come from server. We've munged it a bit, so * we know it to be zero-terminated at least once. */ c_write_untrusted(prompt, strlen(prompt)< ddS5) { /* * get_line failed to get a username. * Terminate. */ logevent("No username provided. Abandoning session."); ssh_state = SSH_STATE_CLOSED; crReturnV; } } else { c_write_str("login as: "); ssh_send_ok = 1; while (pos >= 0) { crWaitUntilV(!ispkt); while (inlen--) switch (c = *in++) { case 10: case 13: username[pos] = 0; pos = -1; break; case 8: case 127: if Revision-number: 1254 Prop-content-length: 317 Content-length: 317 K 8 svn:date V 27 2001-09-08T15:16:30.000000Z K 7 svn:log V 216 Fix potential float screwup in scp percentage indicator. (Don't compute (100*a)/b. Instead compute 100*(a/b), because that way there's no chance that 100*a will become inexact enough to fail to yield 100 when a==b.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 25d32969358f5f064da3ff68044145e5 Text-delta-base-sha1: 703eafd349f24a5a962db9b57ef8db33bc5be6fd Text-content-length: 48 Text-content-md5: ad9c7803d39d63f8e4ada992a0dda473 Text-content-sha1: 23d1aed2576e9340e2acfd01f6447cacc635d3b3 Content-length: 88 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN" v * (done * 1.0 / size) Revision-number: 1255 Prop-content-length: 224 Content-length: 224 K 8 svn:date V 27 2001-09-09T09:58:20.000000Z K 7 svn:log V 123 Roman Pompejus's patch (heavily hacked) for parametric log file names with date, time and hostname automatically embedded. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ed28841c5053de5ce8af05125e4c25c Text-delta-base-sha1: 1cb10d70cd9c5ad5d02c21c39a53c193830440ec Text-content-length: 1994 Text-content-md5: 43b10f8f1364783a4850048c72b8498c Text-content-sha1: cdde804a9ee53f0e6fb50962cdbbc5e71389c9fd Content-length: 2034 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVN ,5KFHMqWwIi>]*Ipstatic void xlatlognam(char *d, char *s, char *hostname, struct tm *tmvoid settimstr(char *ta, int no_sec); char *subslfcode(char *dest, char *src, char *dstrt); char *stpncpy(char *dst, const char *src, size_t maxlen); char timdatbuf[20]; char currlogfilename[FILENAME_MAX]; time(&t); tm = *localtime(&t); /* substitute special codes in file name */ xlatlognam(currlogfilename,cfg.logfilename,cfg.host, &tm); lgfp = fopen(currlogfilename, "r"); /* file already present? */ if (lgfp) { int i; fclose(lgfp); i = askappend(currurrurrlogfilename, 128); buf[strlen(buf)] = '\0'; logevent(buf); /* --- write header line into log file */ fputs("=~=~=~=~=~=~=~=~=~=~=~= PuTTY log ", lgfp); strftime(buf, 24, "%Y.%m.%d %H:%M:%S", & /* * translate format codes into time/date strings * and insert them into log file name * * "&Y":YYYY "&m":MM "&d":DD "&T":hhmm "&h": "&&":& */ static void xlatlognam(char *d, char *s, char *hostname, struct tm *tm) { char buf[10], *bufp; int size; char *ds = d; /* save start pos. */ int len = FILENAME_MAX-1; while (*s) { /* Let (bufp, len) be the string to append. */ bufp = buf; /* don't usually override this */ if (*s == '&') { char c; s++; if (*s) switch (c = *s++, tolower(c)) { case 'y': size = strftime(buf, sizeof(buf), "%Y", tm); break; case 'm': size = strftime(buf, sizeof(buf), "%m", tm); break; case 'd': size = strftime(buf, sizeof(buf), "%d", tm); break; case 't': size = strftime(buf, sizeof(buf), "%H%M%S", tm); break; case 'h': bufp = hostname; size = strlen(bufp); break; default: buf[0] = '&'; size = 1; if (c != '&') buf[size++] = c; } } else { buf[0] = *s++; size = 1; } if (size > len) size = len; memcpy(d, bufp, size); d += size; len -= size; } *d = '\0'; } Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 41469585e782c04418603b19c4f7666f Text-delta-base-sha1: d7a02025259c043f2182cc95b2cb72cc6e81c47b Text-content-length: 54 Text-content-md5: fdf04d2260267415076e8bde349944c8 Text-content-sha1: d39f301b52b1f17b9d63be5f2bd74e61d8b48dae Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNft~^pE:lines, int id * lines Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1586c08d18f1bd2163f4e2d4d88dfabe Text-delta-base-sha1: c43587eb4a19055251531ff8fcc2ac62d6f3a2f0 Text-content-length: 183 Text-content-md5: f038d3cfaa9d43fd073c604d431a5fe0 Text-content-sha1: 6c5d6db2c2b3e81fec5366501ebea23f3f5397e2 Content-length: 224 K 15 cvs2svn:cvs-rev V 5 1.147 PROPS-END SVNt 2i/]GFEXPLAIstatictext(&cp, "(Log file name can contain &&Y, &&M, &&D for date," " &&T for time, and &&H for host name)", 2, IDC_LGFEXPLAI1, Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7e16133e05ac01e2a1db0900673b40c6 Text-delta-base-sha1: cbd086cfcae1277b65e6d13e0fa3dd2845e17f41 Text-content-length: 26 Text-content-md5: c283b0302975bb8982c72e69114d0637 Text-content-sha1: 20580cf428efe0ee0e1b6d953161d594482958ab Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNr} #Ulines Revision-number: 1256 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 70 Oops - changing the prototype of statictext() affected puttygen.c too K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-09T10:35:56.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 38cab8f33857706b1df097ac9864e770 Text-delta-base-sha1: c2ef6ff329d7ece2ac60390041ebbc40bbbd22aa Text-content-length: 80 Text-content-md5: 3d5155c63781726974e407e80846b505 Text-content-sha1: 0062ecb15a70ad46351dbf71db47198c9aa9d468 Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN8> 9h1, IDC_NOKEY); cp2 = cp; statictext(&cp2, "", 1 Revision-number: 1257 Prop-content-length: 250 Content-length: 250 K 7 svn:log V 149 psftp is an interactive program and the ssh.c flags should reflect this (so we get login banners and a little more verbosity during authentication). K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-09T10:41:42.000000Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: de44c9a30377417cf8b8ddd2215e5e71 Text-delta-base-sha1: 6092ad6a3687bf95c22c52f1c398082777e22638 Text-content-length: 44 Text-content-md5: ee75b140717a2e05c1f477d651ffc9c4 Text-content-sha1: a91df943faf0cd236050893ad1487f7a058ff215 Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN[n BB | FLAG_INTERACTIVE Revision-number: 1258 Prop-content-length: 207 Content-length: 207 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-09T13:54:00.000000Z K 7 svn:log V 106 Add the names of major contributors to the copyright statement. I've been meaning to do this for _years_. PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 95b47314318a406ab047403e4eb8350c Text-delta-base-sha1: 001879907f05b6df3e4415260be220121eb36f10 Text-content-length: 192 Text-content-md5: 86e07c5014d95da80f6792f9406f3b63 Text-content-sha1: 73a04b20e1934566548433be3236667636af8422 Content-length: 231 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN--o)PuTTY is copyright 1997-2001 Simon Tatham. Portions copyright Robert de Bath, Joris van Rantwijk, Delian Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry Revision-number: 1259 Prop-content-length: 243 Content-length: 243 K 8 svn:date V 27 2001-09-09T14:47:29.000000Z K 7 svn:log V 142 Be more careful of bombouts at the s_rdpkt level: if these happen (for example SSH_MSG_DISCONNECT) we should avoid even calling ssh_protocol. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6eb7046919d6697cad0815fa49a96b39 Text-delta-base-sha1: 2e146c4c0fedce44a982c555ad465face4853189 Text-content-length: 220 Text-content-md5: b79c81138bd5968c8746a611faca2ed0 Text-content-sha1: 6f46237daefbb3f59f3bfdc5c352c55284963ead Content-length: 261 K 15 cvs2svn:cvs-rev V 5 1.167 PROPS-END SVNLNm]dG crReturn(0 crReturn(0if (ssh_state == SSH_STATE_CLOSED) { return; }<UU<et_line) { if (!ssh_get_line("login as: ", username, sizeof(username), FALSE) Revision-number: 1260 Prop-content-length: 413 Content-length: 413 K 8 svn:date V 27 2001-09-09T15:41:58.000000Z K 7 svn:log V 312 Modify the FIXME into a calculated risk. I don't like this, but I don't like the thought of having to try to fix it either, particularly when I can't tell whether it'll work or not without reproducing the (probably phantom) problem. Gah. I wish WinSock would give better documentation of possible error returns. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ad74e9c31da22b7c5a126f5dc6ba9c1c Text-delta-base-sha1: 659e478e40455b13231b795e66457536c748e49b Text-content-length: 932 Text-content-md5: 2184be9456844919bf217b9a3d7b9e7b Text-content-sha1: 9b22b19a50652ff60c3f12bf71352a5152dd86a1 Content-length: 972 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN4 ASSUMPTION: * * I'm assuming here that if a TCP connection is * reset or aborted once established, we will be * notified by a select event rather than a * CONNABORTED or CONNRESET from send(). In other * words, I'm assuming CONNABORTED and CONNRESET * don't come back from a _nonblocking_ send(), * because the local side doesn't know they've * happened until it waits for a response to its * TCP segment - so the error will arrive * asynchronously. * * If I'm wrong, this will be a really nasty case, * because we can't necessarily call plug_closing() * without having to make half the SSH code * reentrant; so instead we'll have to schedule a * call to plug_closing() for some suitable future * time. */ fatalbox("SERIOUS NETWORK INTERNAL ERROR: %s\n" "Please report this immediately to " ".", Revision-number: 1261 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2001-09-09T16:29:51.000000Z K 7 svn:log V 26 Add online help in PSFTP. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ee75b140717a2e05c1f477d651ffc9c4 Text-delta-base-sha1: a91df943faf0cd236050893ad1487f7a058ff215 Text-content-length: 7575 Text-content-md5: e15fe3ee7ff760c34567ff41e388477e Text-content-sha1: c02938e4b10be51f08b96148d61f952920701914 Content-length: 7615 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNn-\6/]*O{0$*{2 ]\n" " Change the remote working directory for your SFTP session.\n" " If a new working directory is not supplied, you will be\n" " returned to your home directory.\n", sftp_cmd_cd }, { "chmod", "change file permissions and modes", " ( | ) \n" " Change the file permissions on a file or directory.\n" " can be any octal Unix permission specifier.\n" " Alternatively, can include:\n" " u+r make file readable by owning user\n" " u+w make file writable by owning user\n" " u+x make file executable by owning user\n" " u-r make file not readable by owning user\n" " [also u-w, u-x]\n" " g+r make file readable by members of owning group\n" " [also g+w, g+x, g-r, g-w, g-x]\n" " o+r make file readable by all other users\n" " [also o+w, o+x, o-r, o-w, o-x]\n" " a+r make file readable by absolutely everybody\n" " [also a+w, a+x, a-r, a-w, a-x]\n" " u+s enable the Unix set-user-ID bit\n" " u-s disable the Unix set-user-ID bit\n" " g+s enable the Unix set-group-ID bit\n" " g-s disable the Unix set-group-ID bit\n" " +t enable the Unix \"sticky bit\"\n" " You can give more than one modifier for the same user (\"g-rwx\"), and\n" " more than one user for the same modifier (\"ug+w\"). You can\n" " use commas to separate different modifiers (\"u+rwx,g+s\").\n", sftp_cmd_chmod }, { "del", "delete a file", " \n" " Delete a file.\n", sftp_cmd_rm }, { "delete", "delete a file", "\n" " Delete a file.\n", sftp_cmd_rm }, { "dir", "list contents of a remote directory", " [ ]\n" " List the contents of a specified directory on the server.\n" " If is not given, the current working directory\n" " will be listed.\n", sftp_cmd_ls }, { "exit", "bye", NULL, sftp_cmd_quit }, { "get", "download a file from the server to your local machine", " [ ]\n" " Downloads a file on the server and stores it locally under\n" " the same name, or under a different one if you supply the\n" " argument .\n", sftp_cmd_get }, { "help", "give help", " [ [ ... ] ]\n" " Give general help if no commands are specified.\n" " If one or more commands are specified, give specific help on\n" " those particular commands.\n", sftp_cmd_help }, { "ls", "dir", NULL, sftp_cmd_ls }, { "mkdir", "create a directory on the remote server", " \n" " Creates a directory with the given name on the server.\n", sftp_cmd_mkdir }, { "mv", "move or rename a file on the remote server", " \n" " Moves or renames the file on the server,\n" " so that it is accessible under the name .\n", sftp_cmd_mv }, { "put", "upload a file from your local machine to the server", " [ ]\n" " Uploads a file to the server and stores it there under\n" " the same name, or under a different one if you supply the\n" " argument .\n", sftp_cmd_put }, { "quit", "bye", NULL, sftp_cmd_quit }, { "reget", "continue downloading a file", " [ ]\n" " Works exactly like the \"get\" command, but the local file\n" " must already exist. The download will begin at the end of the\n" " file. This is for resuming a download that was interrupted.\n", sftp_cmd_reget }, { "ren", "mv", NULL, sftp_cmd_mv }, { "rename", "mv", NULL, sftp_cmd_mv }, { "reput", "continue uploading a file", " [ ]\n" " Works exactly like the \"put\" command, but the remote file\n" " must already exist. The upload will begin at the end of the\n" " file. This is for resuming an upload that was interrupted.\n", sftp_cmd_reput }, { "rm", "del", NULL, sftp_cmd_rm }, { "rmdir", "remove a directory on the remote server", " \n" " Removes the directory with the given name on the server.\n" " The directory will not be removed unless it is empty.\n", sftp_cmd_rmdir } }; const struct sftp_cmd_lookup *lookup_command(char *name) { int i, j, k, cmp; i = -1; j = sizeof(sftp_lookup) / sizeof(*sftp_lookup); while (j - i > 1) { k = (j + i) / 2; cmp = strcmp(name, sftp_lookup[k].name); if (cmp < 0) j = k; else if (cmp > 0) i = k; else { return &sftp_lookup[k]; } } return NULL; } static int sftp_cmd_help(struct sftp_command *cmd) { int i; if (cmd->nwords == 1) { /* * Give short help on each command. */ int maxlen; maxlen = 0; for (i = 0; i < sizeof(sftp_lookup) / sizeof(*sftp_lookup); i++) { int len = strlen(sftp_lookup[i].name); if (maxlen < len) maxlen = len; } for (i = 0; i < sizeof(sftp_lookup) / sizeof(*sftp_lookup); i++) { const struct sftp_cmd_lookup *lookup; lookup = &sftp_lookup[i]; printf("%-*s", maxlen+2, lookup->name); if (lookup->longhelp == NULL) lookup = lookup_command(lookup->shorthelp); printf("%s\n", lookup->shorthelp); } } else { /* * Give long help on specific commands. */ for (i = 1; i < cmd->nwords; i++) { const struct sftp_cmd_lookup *lookup; lookup = lookup_command(cmd->words[i]); if (!lookup) { printf("help: %s: command not found\n", cmd->words[i]); } else { printf("%s", lookup->name); if (lookup->longhelp == NULL) lookup = lookup_command(lookup->shorthelp); printf("%s", lookup->longhelp); } } } return 0; }const struct sftp_cmd_lookup *lookup; lookup = lookup_command(cmd->words[0]); if (!lookup) cmd->obey = sftp_cmd_unknown; else cmd->obey = lookup->obey;} } else { fp = fopen(batchfile, "r"); if (!fp) { printf("Fatal: unable to open %s\n", batchfile); return; } while (1) { struct sftp_command *cmd; cmd = sftp_getcmd(fp, mode, modeflags); if (!cmd) break; if (cmd->obey(cmd) < 0) break; if (fxp_error() != NULL) { if (!(modeflags & 2)) break; } } Revision-number: 1262 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2001-09-09T16:31:26.000000Z K 7 svn:log V 32 Add the `pwd' command in PSFTP. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e15fe3ee7ff760c34567ff41e388477e Text-delta-base-sha1: c02938e4b10be51f08b96148d61f952920701914 Text-content-length: 318 Text-content-md5: d7845533e91fd6aa012b733dff262435 Text-content-sha1: 01e5a5313762070e1320ac152d54668d4ecfd617 Content-length: 358 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN]Bx* Print current directory. Easy as pie. */ int sftp_cmd_pwd(struct sftp_command *cmd) { printf("Remote directory is %s\n", pwd);pwd", "print your remote working directory", "\n" " Print the current remote working directory for your SFTP session.\n", sftp_cmd_pwd Revision-number: 1263 Prop-content-length: 187 Content-length: 187 K 7 svn:log V 87 Clarify the comment at the top of scp.c to make the licensing situation more explicit. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-10T08:39:37.000000Z PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ad9c7803d39d63f8e4ada992a0dda473 Text-delta-base-sha1: 23d1aed2576e9340e2acfd01f6447cacc635d3b3 Text-content-length: 514 Text-content-md5: 468a38ef771b1946fbfaa2ce2c19c7b6 Text-content-sha1: 5410b1d97c39171751f37b5a8413bd8da0e8416e Content-length: 554 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVN n kk/* * scp.c - Scp (Secure Copy) client for PuTTY. * Joris van Rantwijk, Simon Tatham * * This is mainly based on ssh-1.2.26/scp.c by Timo Rinne & Tatu Ylonen. * They, in turn, used stuff from BSD rcp. * * (SGT, 2001-09-10: Joris van Rantwijk assures me that although * this file as originally submitted was inspired by, and * _structurally_ based on, ssh-1.2.26's scp.c, there wasn't any * actual code duplicated, so the above comment shouldn't give rise * to licensing issues.) Revision-number: 1264 Prop-content-length: 421 Content-length: 421 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-12T20:11:48.000000Z K 7 svn:log V 320 psftp and pscp should disable all forwarding (ports, X, agent). Partly because that's a good idea _anyway_, and partly because it seems to be causing trouble. (Specifically, their pathetic attempt to emulate plink's proper select handling seems to get confused when the back end tries to open a local listening socket.) PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d7845533e91fd6aa012b733dff262435 Text-delta-base-sha1: 01e5a5313762070e1320ac152d54668d4ecfd617 Text-content-length: 281 Text-content-md5: 7ce5bb93422ee77eddfebdb15c076ae0 Text-content-sha1: ba1eb95cae003b6874761295b7d7a5a48a1bb0ab Content-length: 321 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN]c}{}kr * Disable scary things which shouldn't be enabled for simple * things like SCP and SFTP: agent forwarding, port forwarding, * X forwarding. */ cfg.x11_forward = 0; cfg.agentfwd = 0; cfg.portfwd[0] = cfg.portfwd[1] = '\0' Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 468a38ef771b1946fbfaa2ce2c19c7b6 Text-delta-base-sha1: 5410b1d97c39171751f37b5a8413bd8da0e8416e Text-content-length: 272 Text-content-md5: b07f72ecfdc7dcf2bb0a3075e86e3b1c Text-content-sha1: 2d7701caf55fe39a2994f3195ad2c1e71d700707 Content-length: 312 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNnt uWu(FDisable scary things which shouldn't be enabled for simple * things like SCP and SFTP: agent forwarding, port forwarding, * X forwarding. */ cfg.x11_forward = 0; cfg.agentfwd = 0; cfg.portfwd[0] = cfg.portfwd[1] = '\0' Revision-number: 1265 Prop-content-length: 401 Content-length: 401 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-12T20:16:45.000000Z K 7 svn:log V 300 PSFTP: when choosing a default destination filename for `get' and `put', it makes more sense to pick the _basename_ of the source rather than use the whole path - particularly when the latter might cause us to try to use a DOS pathname like `f:\stuff' in a Unix (or worse, such as VMS!) file system. PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7ce5bb93422ee77eddfebdb15c076ae0 Text-delta-base-sha1: ba1eb95cae003b6874761295b7d7a5a48a1bb0ab Text-content-length: 518 Text-content-md5: c7eb4b7902c34f1fe55ea4c5ebded49e Text-content-sha1: 0e351fc1bc468fecf0ef34154fe2f0bd525c0e2c Content-length: 558 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNc'ZQ=ZWkP * Return a pointer to the portion of str that comes after the last * slash (or backslash or colon, if `local' is TRUE). */ static char *stripslashes(char *str, int local) { char *p; if (local) { p = strchr(str, ':'); if (p) str = p+1; } p = strrchr(str, '/'); if (p) str = p+1; if (local) { p = strrchr(str, '\\'); if (p) str = p+1; } return str; stripslashes(cmd->words[1], 0) stripslashes(cmd->words[1], 1) Revision-number: 1266 Prop-content-length: 288 Content-length: 288 K 8 svn:date V 27 2001-09-12T20:38:40.000000Z K 7 svn:log V 187 Scrollback viewing position, and selection endpoints, now keep pace with the scrollback movement. (The former is of course only detectable when reset-scrollback-on-activity is disabled.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 43b10f8f1364783a4850048c72b8498c Text-delta-base-sha1: cdde804a9ee53f0e6fb50962cdbbc5e71389c9fd Text-content-length: 1274 Text-content-md5: af7fb47cd0af6c226831aa99b8f17297 Text-content-sha1: c7584a6a171fa7419cdb6e2db09c32c9f34dc3a5 Content-length: 1314 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVN,cOZ%Zi6}^_M, seltop /* * If the user is currently looking at part of the * scrollback, and they haven't enabled any options * that are going to reset the scrollback as a * result of this movement, then the chances are * they'd like to keep looking at the same line. So * we move their viewpoint at the same rate as the * scroll, at least until their viewpoint hits the * top end of the scrollback buffer, at which point * we don't have the choice any more. * * Thanks to Jan Holmen Holsten for the idea and * initial implementation. */ if (disptop > -savelines && disptop < 0) disptop--/* * If the selection endpoints move into the scrollback, * we keep them moving until they hit the top. However, * of course, if the line _hasn't_ moved into the * scrollback then we don't do this, and cut them off * at the top of the scroll region. */ seltop = sb ? -savelines : 0; if (selstart.y >= seltop && selstart.y <= botline) { selstart.y--; if (selstart.y < seltop) { selstart.y = seltop; selstart.x = 0; } } if (selend.y >= seltop && selend.y <= botline) { selend.y--; if (selend.y < seltop) { selend.y = seltop Revision-number: 1267 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2001-09-13T18:24:51.000000Z K 7 svn:log V 63 Christopher Allene's patch for going full-screen on Alt-Enter. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e2f7b5077a6eb782caf86b932fc39f26 Text-delta-base-sha1: fa79fe968af9540ae3a047cfe12a9f28f71bd694 Text-content-length: 41 Text-content-md5: e21111374893b1e87ca2e514bb8958ea Text-content-sha1: 627ecfae37f5199bbcbc768eec077b358c553c86 Content-length: 82 K 15 cvs2svn:cvs-rev V 5 1.109 PROPS-END SVN" 8V.fullscreenonaltenter Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bad3991acba54649bfc8373cdd761a09 Text-delta-base-sha1: d7ebd81c48f5c449a4bc9966ca8c325e6830aef1 Text-content-length: 129 Text-content-md5: 61fa000ca1bb2c7caff1d9f585c39eb9 Text-content-sha1: 79d20fcf98a3560b78e17bef10f397c73f28b1aa Content-length: 169 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNd*fzFullScreenOnAltEnter", cfg->fullscreenonaltenterFullScreenOnAltEnter", 0, &cfg->fullscreenonaltenter Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f038d3cfaa9d43fd073c604d431a5fe0 Text-delta-base-sha1: 6c5d6db2c2b3e81fec5366501ebea23f3f5397e2 Text-content-length: 336 Text-content-md5: 44830af1811113c8d45109704072c61e Text-content-sha1: bd24bb7fafdd1837e956698352d524a07226641c Content-length: 377 K 15 cvs2svn:cvs-rev V 5 1.148 PROPS-END SVNRpx5rX^? is known # not to be available in Cygwinmisc.h puttymem.h putty.h be_none.$(OBJ): be_none.c network.h misc.h puttymem.h putty.h be_nossh.$(OBJ): be_nossh.c network.h misc.h puttymem.h putty.h ber.$(OBJ): ber.c network.h asn.h misc.h asnerror.h puttymem.h ssh.h putty.h cert.$(OBJ): cert.c asn.h asnerror.h misc.h puttymem.h cert.h crypto.h int64.$(OBJ): int64.c int64.h ldisc.$(OBJ): ldisc.c network.h misc.h puttymem.h putty.h misc.$(OBJ): misc.c network.h misc.h puttymem.h putty.h mscrypto.$(OBJ): mscrypto.c network.h puttymem.h ssh.h no_ssl.$(OBJ): no_ssl.c network.h misc.h puttymem.h putty.h noise.$(OBJ): noise.c network.h misc.h puttymem.h storage.h ssh.h putty.h pageant.$(OBJ): pageant.c network.h puttymem.h ssh.h tree234.h pageantc.$(OBJ): pageantc.c puttymem.h plink.$(OBJ): plink.c network.h misc.h puttymem.h storage.h putty.h tree234.h portfwd.$(OBJ): portfwd.c network.h misc.h puttymem.h ssh.h putty.h psftp.$(OBJ): psftp.c network.h misc.h sftp.h ssh.h storage.h int64.h puttymem.h putty.h puttygen.$(OBJ): puttygen.c network.h misc.h puttymem.h winstuff.h ssh.h putty.h raw.$(OBJ): raw.c network.h misc.h puttymem.h putty.h rlogin.$(OBJ): rlogin.c network.h misc.h puttymem.h putty.h scp.$(OBJ): scp.c network.h misc.h sftp.h ssh.h storage.h puttymem.h int64.h putty.h winstuff.h settings.$(OBJ): settings.c network.h misc.h puttymem.h storage.h putty.h sftp.$(OBJ): sftp.c sftp.h int64.h sizetip.$(OBJ): sizetip.c network.h misc.h puttymem.h winstuff.h putty.h ssh.$(OBJ): ssh.c network.h misc.h puttymem.h ssh.h putty.h tree234.h sshaes.$(OBJ): sshaes.c network.h puttymem.h ssh.h sshblowf.$(OBJ): sshblowf.c network.h puttymem.h ssh.h sshbn.$(OBJ): sshbn.c network.h misc.h puttymem.h ssh.h putty.h sshcrc.$(OBJ): sshcrc.c sshdes.$(OBJ): sshdes.c network.h puttymem.h ssh.h sshdh.$(OBJ): sshdh.c network.h puttymem.h ssh.h sshdss.$(OBJ): sshdss.c network.h puttymem.h ssh.h sshmd5.$(OBJ): sshmd5.c network.h puttymem.h ssh.h sshprime.$(OBJ): sshprime.c network.h puttymem.h ssh.h sshpubk.$(OBJ): sshpubk.c network.h puttymem.h ssh.h sshrand.$(OBJ): sshrand.c network.h puttymem.h ssh.h sshrsa.$(OBJ): sshrsa.c network.h puttymem.h ssh.h sshrsag.$(OBJ): sshrsag.c network.h puttymem.h ssh.h sshsha.$(OBJ): sshsha.c network.h puttymem.h ssh.h sshzlib.$(OBJ): sshzlib.c network.h puttymem.h ssh.h ssl.$(OBJ): ssl.c network.h asnerror.h misc.h cert.h crypto.h ssl.h int64.h puttymem.h telnet.$(OBJ): telnet.c network.h misc.h puttymem.h putty.h terminal.$(OBJ): terminal.c network.h misc.h puttymem.h putty.h tree234.h test.$(OBJ): test.c network.h puttymem.h ssh.h tree234.$(OBJ): tree234.c tree234.h unicode.$(OBJ): unicode.c network.h misc.h puttymem.h putty.h version.$(OBJ): version.c wcwidth.$(OBJ): wcwidth.c wildcard.$(OBJ): wildcard.c winctrls.$(OBJ): winctrls.c network.h misc.h puttymem.h putty.h winstuff.h windlg.$(OBJ): windlg.c network.h misc.h ssh.h storage.h puttymem.h putty.h winstuff.h win_res.h window.$(OBJ): window.c network.h misc.h puttymem.h storage.h winstuff.h putty.h win_res.h winnet.$(OBJ): winnet.c network.h misc.h puttymem.h putty.h tree234.h winstore.$(OBJ): winstore.c network.h misc.h puttymem.h storage.h putty.h x11fwd.$(OBJ): x11fwd.c network.h misc.h puttymem.h ssh Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8d7885929b536be678077f8ad187ea13 Text-delta-base-sha1: 2257ae325482d5354b900ce0014322f526c5e72d Text-content-length: 41 Text-content-md5: ccf5c43c3291c762fb38ad535a52fff9 Text-content-sha1: 2e5356206bc15329309a4efb2ec70695cbbe4158 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN[o <". " -DNO_SECURITY Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 55abb8a33aab484eb91b0c89ad804c7f Text-delta-base-sha1: 60e03d257f0d6467acf6c1743cb3caa28c0fa1ed Text-content-length: 38 Text-content-md5: 2bbae4cdcd50472c28c468b03d7144e5 Text-content-sha1: c0b13011e6300243e18b47c800d9d60cdebd954d Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNWlA?struct ssh_channel; Revision-number: 1269 Prop-content-length: 413 Content-length: 413 K 8 svn:date V 27 2001-09-15T15:54:24.000000Z K 7 svn:log V 312 Three more patches from RDB: one to make Atomica work right, one to fiddle with the widths of characters in DBCS screen fonts, and (the big one) one to enable a mode in which resizing the window locks the terminal size and lets the font change, instead of vice versa. That should shut up a few feature requests! K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e21111374893b1e87ca2e514bb8958ea Text-delta-base-sha1: 627ecfae37f5199bbcbc768eec077b358c553c86 Text-content-length: 155 Text-content-md5: 1e2546357d4d5affa1291ddf6fab95f5 Text-content-sha1: ae4c9b54419fd61742855307d601edfe9948de91 Content-length: 196 K 15 cvs2svn:cvs-rev V 5 1.110 PROPS-END SVN",d6c(B0$p n  NARROW 0x20000000ULGLOBAL int alt_pressedlockfontint window_borderint CharWidth(Context ctx, int uc Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 61fa000ca1bb2c7caff1d9f585c39eb9 Text-delta-base-sha1: 79d20fcf98a3560b78e17bef10f397c73f28b1aa Text-content-length: 200 Text-content-md5: 53b9f2c7ba9e8e6c4157906b5c8c4340 Text-content-sha1: e2e0411eaf9a43773595134681c872c26123c07d Content-length: 240 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVN)X,7[BDK-g~WindowBorder", cfg->window_borderLockFont", cfg->lockfontWindowBorder", 1, &cfg->window_border NewUNICODELockFont", cfg->locksize, &cfg->lockfont Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: af7fb47cd0af6c226831aa99b8f17297 Text-delta-base-sha1: c7584a6a171fa7419cdb6e2db09c32c9f34dc3a5 Text-content-length: 1552 Text-content-md5: 83747768681856867174b28655039d0d Text-content-sha1: 25d74816c06c45a8d9b9c44649f186a7a82fc5ff Content-length: 1592 K 15 cvs2svn:cvs-rev V 4 1.80 PROPS-END SVNcRmk fLt9O >!7'V+^ Nset O;\6aW back->siz*cpos++ = c | curr_attr; if (++curs.x == cols) { *cpos |= LATTR_WRAPPED; if (curs.y == marg_b) scroll(marg_t, marg_b, 1, TRUE); else if (curs.y < rows - 1) curs.y++; curs.x = 0; fix_cpos; } *cpos++ = UCSWIDE | curr_attr; break; def(esc_args[0], cfg.height) rows); else request_resize(80, 24 (*dispcurs & (CHAR_MASK | CSET_MASK)) == UCSWIDE) dispcurs[-1] |= ATTR_INVALID; if ( (dispcurs[1] & (CHAR_MASK | CSET_MASK)) == UCSWIDE if ((d[1] & (CHAR_MASK | CSET_MASK)) == UCSWIDE) tattr |= ATTR_WIDE * Check the font we'll _probably_ be using to see if * the character is wide when we don't want it to be. */ if ((tchar | tattr) != (disptext[idx]& ~ATTR_NARROW)) { if ((tattr & ATTR_WIDE) == 0 && CharWidth(ctx, (tchar | tattr) & 0xFFFF) == 2) tattr |= ATTR_NARROW; } else if (disptext[idx]&ATTR_NARROW) tattr |= ATTR_NARROW;eft, int top, int right, int bottom) { int i, j; if (left < 0) left = 0; if (top < 0) top = 0; if (right >= cols) right = cols-1; if (bottom >= rows) bottom = rows-1; */ if (alt_pressed) do_paint (ctx, FALSE);/* For DBCS font's I can't do anything usefull. Even this will sometimes * fail as there's such a thing as a double width space. :-( */ if (dbcs_screenfont && font_codepage == line_codepage) return (uc != ' '); Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f7e4a4c381ec81ac4b13edc7a01cfe84 Text-delta-base-sha1: 0c267136130be42b17f7b9287f6c551dcd590147 Text-content-length: 312 Text-content-md5: 2d8f8937ffaec63af28726144ca65aed Text-content-sha1: b4bbc463871426fcd4010a177aa720ce7e31e005 Content-length: 352 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNCcWEJ0if (dbcs_screenfont && font_codepage != line_codepage) { /* F***ing Microsoft fonts, Japanese and Korean codepage fonts * have a currency symbol at 0x5C but their unicode value is * still given as U+005C not the correct U+00A5. */ unitab_line['\\'] = ATTR_OEMCP + '\\'20a4 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 44830af1811113c8d45109704072c61e Text-delta-base-sha1: bd24bb7fafdd1837e956698352d524a07226641c Text-content-length: 788 Text-content-md5: 268a4b4aa4416fd9ec9ce953ccb63d07 Text-content-sha1: 75fab6fdf4da0e9a68cecdbcc186e658ed878d3a Content-length: 829 K 15 cvs2svn:cvs-rev V 5 1.149 PROPS-END SVNhS3B86OCpcIWk}Yd.OaZRH|{LOCKFONTIDC_WINBSTATIC, IDC_WINBEDITSetDlgItemInt(hwnd, IDC_WINBEDIT, cfg.window_border, FALSEDlgButton(hwnd, IDC_LOCKFONT, cfg.lockfontterminal size against resi&zing", IDC_LOCKSIZE); checkbox(&cp, "Lock font size against resi&zing", IDC_LOCKFONT/* bartitle(&cp, "Options controlling PuTTY's appearance", IDC_TITLE_APPEARANCE); */staticedit(&cp, "Gap between text and window edge", IDC_WINBSTATIC, IDC_WINBEDIT, 20WINBEDIT: if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt(hwnd, IDC_WINBEDIT, &cfg.window_border); if (cfg.window_border > 32) cfg.window_border = 32LOCKFONlockfont = IsDlgButtonChecked(hwnd, IDC_LOCKFONT); break; case IDC_WIN Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6c09db62a0778bbdaa7941006795fc1b Text-delta-base-sha1: cdf75216c550425d1218ec9f12bcfc870e4786c4 Text-content-length: 16715 Text-content-md5: cad4bbbd808aeb3f6d5a4c08bcc36d24 Text-content-sha1: 29c011194015e84d996b27642db20b3ee4d7776d Content-length: 16756 K 15 cvs2svn:cvs-rev V 5 1.155 PROPS-END SVN}"vF 8F>p:j)L}%dM 6CY8t>22O{X :W\B6Wj j7^IRb`?.[k-/[}5ITV>QKEZN3[4i`BWqCC=9e"% }F9kW%>$`v?rM.?c--q z, /* Window layout information */ static void reset_window(int); static int full_screen = 0, extra_width, extra_height; static int font_width, font_height, font_dualwidth; static int offset_width, offset_height; static int was_zoomed = 0; static int prev_rows, prev_cols; #define FONT_MAXNO 0x2NULL && cfg.lockfontinit_fonts(0,offset_width = offset_height = cfg.window_border; extra_width = wr.right - wr.left - cr.right + cr.left + offset_width*2; extra_height = wr.bottom - wr.top - cr.bottom + cr.top +offset_height*2, int pick_heightbold_mode = cfg.bold_colour ? BOLD_COLOURS : BOLD_FONT; und_mode = UND_FONThdc = GetDC(hwnd); if (pick_height) font_height = pick_height; else { font_height = cfg.fontheight; if (font_height > 0) { font_height = -MulDiv(font_height, GetDeviceCaps(hdc, LOGPIXELSY), 72); } if (pick_width == 0 || pick_height == 0) { font_height = tm.tmHeight; font_width = tm.tmAveCharWidth; } font_dualwidth = (tm.tmAveCharWidth != tm.tmMaxCharWidth); #ifdef RDB_DEBUG_PATCH debug(23, "Primary font H=%d, AW=%d, MW=%d", tm.tmHeight, tm.tmAveCharWidth, tm.tmMaxCharWidth); #endif= (x+1)/) { int width, height; /* If the window is maximized supress resizing attempts */ if (IsZoomed(hwnd)) { if (cfg.lockfont) return; } if (cfg.lockfont && cfg.locksize) return; if (h == rows && w == cols) return; /* Sanity checks ... */ 4; height = (ss.bottom - ss.top - extra_height) / 6; if (w > width || h > height) return; if (w < 15) w = 15; if (h < 1) h = 1; } } term_size(h, w, cfg.savelines); if (cfg.lockfont) { width = extra_width + font_width * w; height = extra_height + font_height * h; SetWindowPos(hwnd, NULL, 0, 0, width, height, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); } else reset_window(0); InvalidateRect(hwnd, NULL, TRUE); } static void reset_window(int reinit) { /* * This function decides how to resize or redraw when the * user changes something. * * This function doesn't like to change the terminal size but if the * font size is locked that may be it's only soluion. */ int win_width, win_height; RECT cr, wr; #ifdef RDB_DEBUG_PATCH debug((27, "reset_window()")); #endif /* Current window sizes ... */ GetWindowRect(hwnd, &wr); GetClientRect(hwnd, &cr); win_width = cr.right - cr.left; win_height = cr.bottom - cr.top; /* Are we being forced to reload the fonts ? */ if (reinit>1) { #ifdef RDB_DEBUG_PATCH debug((27, "reset_window() -- Forced deinit")); #endif deinit_fonts(); init_fonts(0,0); } /* Oh, looks like we're minimised */ if (win_width == 0 || win_height == 0) return; /* Is the window out of position ? */ if ( !reinit && (offset_width != (win_width-font_width*cols)/2 || offset_height != (win_height-font_height*rows)/2) ){ offset_width = (win_width-font_width*cols)/2; offset_height = (win_height-font_height*rows)/2; InvalidateRect(hwnd, NULL, TRUE); #ifdef RDB_DEBUG_PATCH debug((27, "reset_window() -> Reposition terminal")); #endif } if (IsZoomed(hwnd)) { /* We're fullscreen, this means we must not change the size of * the window so it's the font size or the terminal itself. */ extra_width = wr.right - wr.left - cr.right + cr.left; extra_height = wr.bottom - wr.top - cr.bottom + cr.top; if (!cfg.lockfont) { if ( font_width != win_width/cols || font_height != win_height/rows) { deinit_fonts(); init_fonts(win_width/cols, win_height/rows); offset_width = (win_width-font_width*cols)/2; offset_height = (win_height-font_height*rows)/2; InvalidateRect(hwnd, NULL, TRUE); #ifdef RDB_DEBUG_PATCH debug((25, "reset_window() -> Z font resize to (%d, %d)", font_width, font_height)); #endif } } else { if ( font_width != win_width/cols || font_height != win_height/rows) { /* Our only choice at this point is to change the * size of the terminal; Oh well. */ term_size( win_height/font_height, win_width/font_width, cfg.savelines); offset_width = (win_width-font_width*cols)/2; offset_height = (win_height-font_height*rows)/2; InvalidateRect(hwnd, NULL, TRUE); #ifdef RDB_DEBUG_PATCH debug((27, "reset_window() -> Zoomed term_size")); #endif } } return; } /* Hmm, a force re-init means we should ignore the current window * so we resize to the default font size. */ if (reinit>0) { #ifdef RDB_DEBUG_PATCH debug((27, "reset_window() -> Forced re-init")); #endif offset_width = offset_height = cfg.window_border; extra_width = wr.right - wr.left - cr.right + cr.left + offset_width*2; extra_height = wr.bottom - wr.top - cr.bottom + cr.top +offset_height*2; if (win_width != font_width*cols + offset_width*2 || win_height != font_height*rows + offset_height*2) { /* If this is too large windows will resize it to the maximum * allowed window size, we will then be back in here and resize * the font or terminal to fit. */ SetWindowPos(hwnd, NULL, 0, 0, font_width*cols + extra_width, font_height*rows + extra_height, SWP_NOMOVE | SWP_NOZORDER); } return; } /* Okay the user doesn't want us to change the font so we try the * window. But that may be too big for the screen which forces us * to change the terminal. */ if ((cfg.lockfont && reinit==0) || reinit>0) { offset_width = offset_height = cfg.window_border; extra_width = wr.right - wr.left - cr.right + cr.left + offset_width*2; extra_height = wr.bottom - wr.top - cr.bottom + cr.top +offset_height*2; if (win_width != font_width*cols + offset_width*2 || win_height != font_height*rows + offset_height*2) { static RECT ss; int width, height; GetClientRect(GetDesktopWindow(), &ss);/* Grrr too big */ if ( rows > height || cols > width ) { if ( height > rows ) height = rows; if ( width > cols ) width = cols; term_size(height, width, cfg.savelines); #ifdef RDB_DEBUG_PATCH debug((27, "reset_window() -> term resize to (%d,%d)", height, width)); #endif } SetWindowPos(hwnd, NULL, 0, 0, font_width*cols + extra_width, font_height*rows + extra_height, SWP_NOMOVE | SWP_NOZORDER); InvalidateRect(hwnd, NULL, TRUE); #ifdef RDB_DEBUG_PATCH debug((27, "reset_window() -> window resize to (%d,%d)", font_width*cols + extra_width, font_height*rows + extra_height)); #endif } return; } /* We're allowed to or must change the font but do we want to ? */ if (font_width != (win_width-cfg.window_border*2)/cols || font_height != (win_height-cfg.window_border*2)/rows) { deinit_fonts(); init_fonts((win_width-cfg.window_border*2)/cols, (win_height-cfg.window_border*2)/rows); offset_width = (win_width-font_width*cols)/2; offset_height = (win_height-font_height*rows)/2; extra_width = wr.right - wr.left - cr.right + cr.left +offset_width*2; extra_height = wr.bottom - wr.top - cr.bottom + cr.top+offset_height*2; InvalidateRect(hwnd, NULL, TRUE); #ifdef RDB_DEBUG_PATCH debug((25, "reset_window() -> font resize to (%d,%d)", font_width, font_height)); #endif }clip = FALSE; static int resizing = FALSE; static int need_backenConfig prev_cfg; int init_lvl = 1; GetWindowText(hwnd, cfg.wintitle, sizeof(cfg.wintitle)); prev_cfg = cfg; if (!do_reconfig(hwnd)) break; if (strcmp(prev_cfg.logfilename, cfg.logfilename) || prev_cfg.Screen size changed ? */ if (cfg.height != prev_cfg.height || cfg.width != prev_cfg.width || cfg.savelines != prev_cfg.savelines || cfg.locksize ) term_size(cfg.height, cfg.width, cfg.savelinescfg. && cfg.lockfont | SWP_FRAMECHANGED); init_lvl = 2; } } /* Oops */ if (cfg.locksize && cfg.lockfont && IsZoomed(hwnd)) { force_normal(hwnd); init_lvl = 2; } if (strcmp(cfg.font, prev_cfg.font) != 0 || strcmp(cfg.line_codepage, prev_cfg.line_codepage) != 0 || cfg.fontisbold != prev_cfg.fontisbold || cfg.fontheight != prev_cfg.fontheight || cfg.fontcharset != prev_cfg.fontcharset || cfg.vtmode != prev_cfg.vtmode || cfg.bold_colour != prev_cfg.bold_colour || (cfg.lockfont && !prev_cfg.lockfont)) init_lvl = 2; InvalidateRect(hwnd, NULL, TRUE); reset_window(init_lvl);(x)<0 ? (x)-font_width+1 : (x))-offset_width) / font_width) #define TO_CHR_Y(y) ((((y)<0 ? (y)-font_height+1: (y))-offset_height (p.rcPaint.left-offset_width)/font_width, (p.rcPaint.top-offset_height)/font_height, (p.rcPaint.right-offset_width-1)/font_width, (p.rcPaint.bottom-offset_height-1)/font_height); if (p.fErase || p.rcPaint.left < offset_width || p.rcPaint.top < offset_height || p.rcPaint.right >= offset_width + font_width*cols || p.rcPaint.bottom>= offset_height + font_height*rows) { HBRUSH fillcolour, oldbrush; HPEN edge, oldpen; fillcolour = CreateSolidBrush ( colours[(ATTR_DEFBG>>ATTR_BGSHIFT)*2]); oldbrush = SelectObject(hdc, fillcolour); edge = CreatePen(PS_SOLID, 0, colours[(ATTR_DEFBG>>ATTR_BGSHIFT)*2]); oldpen = SelectObject(hdc, edge); ExcludeClipRect(hdc, offset_width, offset_height, offset_width+font_width*cols, offset_height+font_height*rows); Rectangle(hdc, p.rcPaint.left, p.rcPaint.top, p.rcPaint.right, p.rcPaint.bottom); // SelectClipRgn(hdc, NULL); SelectObject(hdc, oldbrush); DeleteObject(fillcolour); SelectObject(hdc, oldpen); DeleteObject(edge); }ENTERSIZEMOVE: #ifdef RDB_DEBUG_PATCH debug((27, "WM_ENTERSIZEMOVE")); #endif#ifdef RDB_DEBUG_PATCH debug((27, "WM_EXITSIZEMOVE")); #endif if (need_backend_resize) { term_size(cfg.height, cfg.width, cfg.savelines); InvalidateRect(hwnd, NULL, TRUE); } break; case WM_SIZING: /* * This does two jobs: * 1) Keep the sizetip uptodate * 2) Make sure the window size is _stepped_ in units of the font size. */ if (!cfg.locksize && !alt_pressed) { int width, height, w, h, ew, eh; LPRECT r = (LPRECT) lParam; if ( !need_backend_resize && (cfg.height != rows || cfg.width != cols )) { /* * Great! It seems the host has been changing the terminal * size, well the user is now grabbing so this is probably * the least confusing solution in the long run even though * it a is suprise. Unfortunatly the only way to prevent * this seems to be to let the host change the window size * and as that's a user option we're still right back here. */ term_size(cfg.height, cfg.width, cfg.savelines); reset_window(2); InvalidateRect(hwnd, NULL, TRUE); need_backend_resize = TRUE; } else { int width, height, w, h, rv = 0; int ex_width = extra_width + (cfg.window_border - offset_width) * 2; int ex_height = extra_height + (cfg.window_border - offset_height) * 2; LPRECT r = (LPRECT) lParam; width = r->right - r->left - ex_width; height = r->bottom - r->top - ex_height; w = (width + cols/2)/cols; h = (height + rows/2)/rows; if ( r->right != r->left + w*cols + ex_width) rv = 1; if (wParam == WMSZ_LEFT || wParam == WMSZ_BOTTOMLEFT || wParam == WMSZ_TOPLEFT) r->left = r->right - w*cols - ex_width; else r->right = r->left + w*cols + ex_width; if (r->bottom != r->top + h*rows + ex_height) rv = 1; if (wParam == WMSZ_TOP || wParam == WMSZ_TOPRIGHT || wParam == WMSZ_TOPLEFT) r->top = r->bottom - h*rows - ex_height; else r->bottom = r->top + h*rows + ex_height; return rv; } break; /* break; (never reached) */ case WM_SIZE: #ifdef RDB_DEBUG_PATCH debug((27, "WM_SIZE %s (%d,%d)", (wParam == SIZE_MINIMIZED) ? "SIZE_MINIMIZED": (wParam == SIZE_MAXIMIZED) ? "SIZE_MAXIMIZED": (wParam == SIZE_RESTORED && resizing) ? "to": (wParam == SIZE_RESTORED) ? "SIZE_RESTORED": "...", LOWORD(lParam), HIWORD(lParam))); #endif if (cfg.lockfont && cfg.locksize) { /* A resize, well it better be a minimize. */ reset_window(-1); } else { int width, height, w, h; width = LOWORD(lParam); height = HIWORD(lParam); if (!resizing) { if (wParam == SIZE_MAXIMIZED) { was_zoomed = 1; prev_rows = rows; prev_cols = cols; if (cfg.lockfont) { w = width / font_width; if (w < 1) w = 1; h = height / font_height; if (h < 1) h = 1; term_size(h, w, cfg.savelines); } reset_window(0); } else if (wParam == SIZE_RESTORED && was_zoomed) { was_zoomed = 0; if (cfg.lockfont) term_size(prev_rows, prev_cols, cfg.savelines); reset_window(0); } /* This is an unexpected resize, these will normally happen * if the window is too large. Probably either the user * selected a huge font or the screen size has changed. * * This is also called with minimize. */ else reset_window(-1); } /* * Don't call back->size in mid-resize. (To prevent * massive numbers of resize events getting sent * down the connection during an NT opaque drag.) */ if (resizing) { if (!cfg.locksize && !alt_pressed) { need_backend_resize = TRUE; w = (width-cfg.window_border*2) / font_width; if (w < 1) w = 1; h = (height-cfg.window_border*2) / font_height; if (h < 1) h = 1; cfg.height = h; cfg.width = w; } else reset_window(0); } } + offset_width, y * font_height + offse/* Only want the left half of double width lines */ if (lattr != LATTR_NORM && x*2 >= cols) return; x *= fnt_width; y *= font_height; x += offset_width; y += offse if (attr & ATTR_NARROW) nfont |= FONT_NARROW;DOnly want the left half of double width lines */ if (line_box.right > font_width*cols+offset_width) line_box.right = font_width*cols+offset_width, mptr for(nlen = mptr = 0; mptr= ' ' && (uc&CHAR_MASK)<= '~') return 1; if ( (uc & CSET_MASK) == ATTR_ACP ) { SelectObject(hdc, fonts[FONT_NORMAL]); } else if ( (uc & CSET_MASK) == ATTR_OEMCP ) { another_font(FONT_OEM); if (!fonts[FONT_OEM]) return 0; SelectObject(hdc, fonts[FONT_OEM]); } else return 0; if ( GetCharWidth32(hdc, uc&CHAR_MASK, uc&CHAR_MASK, &ibuf) != 1 && GetCharWidth(hdc, uc&CHAR_MASK, uc&CHAR_MASK, &ibuf) != 1) return 0; } else { /* Speedup, I know of no font where ascii is the wrong width */ if (uc >= ' ' && uc <= '~') return 1; SelectObject(hdc, fonts[FONT_NORMAL]); if ( GetCharWidth32W(hdc, uc, uc, &ibuf) == 1 ) /* Okay that one worked */ ; else if ( GetCharWidthW(hdc, uc, uc, &ibuf) == 1 ) /* This should work on 9x too, but it's "less accurate" */ ; else return 0; } ibuf += font_width / 2 -1; ibuf /= font_width; return ibuf;alt_pressed = (left_alt && key_down);offset_width; r.right = offset_width + cols * font_width; r.top = offset_height + min * font_height; r.bottom = offset_height + Revision-number: 1270 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:07:59.648492Z PROPS-END Revision-number: 1271 Prop-content-length: 266 Content-length: 266 K 8 svn:date V 27 2001-09-18T18:16:56.000000Z K 7 svn:log V 165 SSH back end should now be tolerant of garbage appearing in the data stream after the actual SSH connection is finished. Some firewalls add this for no good reason. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b79c81138bd5968c8746a611faca2ed0 Text-delta-base-sha1: 6f46237daefbb3f59f3bfdc5c352c55284963ead Text-content-length: 604 Text-content-md5: cf42a9ded80409d2df2b83cf4ec7245b Text-content-sha1: 39a3bc10334e2dc2712ea67612d4ad6a80a10517 Content-length: 645 K 15 cvs2svn:cvs-rev V 5 1.168 PROPS-END SVN8w<K1 /* * In case `helpful' firewalls or proxies tack * extra human-readable text on the end of the * session which we might mistake for another * encrypted packet, we close the session once * we've sent EXIT_CONFIRMATION. */ ssh_state = SSH_STATE_CLOSED; crReturnVint pos; static char c; /* * Get a username. */ pos = 0; if ((flags & FLAG_INTERACTIVE) && !*cfg.username) { if (ssh_g Revision-number: 1272 Prop-content-length: 314 Content-length: 314 K 8 svn:date V 27 2001-09-18T18:40:00.000000Z K 7 svn:log V 213 Fix the licence again. (Despite the copyright holders being more numerous, it still only said _I_ would not be liable rather than _everybody_ not being liable; also the resource file versions weren't up to date.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 86e07c5014d95da80f6792f9406f3b63 Text-delta-base-sha1: 73a04b20e1934566548433be3236667636af8422 Text-content-length: 197 Text-content-md5: aadb7e90dc4e841af18b49f7e14e6c82 Text-content-sha1: 9fe48ccf5f19ede6e33bd60bebbc20b083e34fbf Content-length: 236 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN% /?/7eTHE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0c21234ae0db5c8627135679237d2f31 Text-delta-base-sha1: 4f87ad122996345d6126d09cba7c3256c8e69c23 Text-content-length: 1551 Text-content-md5: 586e614a393075eedb5165d057b1733b Text-content-sha1: 0e49789d2adae3a6125a2eccaf1e7fb7525dd363 Content-length: 1590 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNOC3P^_wT]@cgeiib7J`b6Kv55 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Licence" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK", IDOK, 98, 235ortions copyright Robert de Bath, Joris van Rantwijk, Delian", 1002, 10, 26, 206, 8 LTEXT "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas", 1003, 10, 34, 206, 8 LTEXT "Barry.", 1003, 10, 4258, 206, 8 LTEXT "obtaining a copy of this software and associated documentation", 1003, 10, 667482, 206, 8 LTEXT "publish, distribute, sublicense, and/or sell copies of the Software,", 1006, 10, 9098, 206, 8 LTEXT "subject to the following conditions:", 1008, 10, 106122, 206, 8 LTEXT "included in all copies or substantial portions of the Software.", 1011, 10, 130, 206, 8 LTEXT "THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT", 1013, 10, 14654, 206, 8 LTEXT "INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", 1015, 10, 162, 206, 8 LTEXT "MERCHANTABILITY, FITNESS FOR A PARTICULAR", 1016, 10, 170, 206, 8 LTEXT "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", 1017, 10, 178, 206, 8 LTEXT "COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES", 1018, 10, 186, 206, 8 LTEXT "OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,", 1019, 10, 194, 206, 8 LTEXT "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN", 1020, 10, 202, 206, 8 LTEXT "CONNECTION WITH THE SOFTWARE OR THE USE OR", 1021, 10, 210, 206, 8 LTEXT "OTHER DEALINGS IN THE SOFTWARE.", 1022, 10, 218, 206, 8 END Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ab4029a55ea5c98852156f94c337fc0a Text-delta-base-sha1: 535e05af0fd7974a2d3fb7f8f8e4b5716d4962e8 Text-content-length: 1536 Text-content-md5: 420fdf590f4ba0582f7da70cb4829631 Text-content-sha1: 425c3aeacd8799ee571b69c9d6ce79b1395ba7cb Content-length: 1575 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNB57=P_jT]3cgse\ib*-`7 P67455 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PuTTY Licence" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK", IDOK, 98, 235ortions copyright Robert de Bath, Joris van Rantwijk, Delian", 1002, 10, 26, 206, 8 LTEXT "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas", 1003, 10, 34, 206, 8 LTEXT "Barry.", 1003, 10, 4258, 206, 8 LTEXT "obtaining a copy of this software and associated documentation", 1003, 10, 667482, 206, 8 LTEXT "publish, distribute, sublicense, and/or sell copies of the Software,", 1006, 10, 9098, 206, 8 LTEXT "subject to the following conditions:", 1008, 10, 106, 206, 8 LTEXT "The above copyright notice and this permission notice shall be", 1010, 10, 122130, 206, 8 LTEXT "THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT", 1013, 10, 146, 206, 8 LTEXT "WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,", 1014, 10, 15462, 206, 8 LTEXT "MERCHANTABILITY, FITNESS FOR A PARTICULAR", 1016, 10, 170, 206, 8 LTEXT "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", 1017, 10, 178, 206, 8 LTEXT "COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES", 1018, 10, 186, 206, 8 LTEXT "OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,", 1019, 10, 194, 206, 8 LTEXT "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN", 1020, 10, 202, 206, 8 LTEXT "CONNECTION WITH THE SOFTWARE OR THE USE OR", 1021, 10, 210, 206, 8 LTEXT "OTHER DEALINGS IN THE SOFTWARE.", 1022, 10, 218 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d7560ac187c4a05c2c4b8fe9abd37916 Text-delta-base-sha1: 68c60a26835f33221a3e37a85825b82b54d88968 Text-content-length: 1393 Text-content-md5: 167226452a92f37992276518d0ccfd3b Text-content-sha1: d777806489bb049a3f6b2c0beb0261afd87d2bb7 Content-length: 1433 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN{;*_-T]vcg6eibm-`z Py7w5535ortions copyright Robert de Bath, Joris van Rantwijk, Delian", 1002, 10, 26, 206, 8 LTEXT "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas", 1003, 10, 34, 206, 8 LTEXT "Barry.", 1003, 10, 4258, 206, 8 LTEXT "obtaining a copy of this software and associated documentation", 1003, 10, 667482, 206, 8 LTEXT "publish, distribute, sublicense, and/or sell copies of the Software,", 1006, 10, 9098, 206, 8 LTEXT "subject to the following conditions:", 1008, 10, 106, 206, 8 LTEXT "The above copyright notice and this permission notice shall be", 1010, 10, 122130, 206, 8 LTEXT "THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT", 1013, 10, 146, 206, 8 LTEXT "WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,", 1014, 10, 15462, 206, 8 LTEXT "MERCHANTABILITY, FITNESS FOR A PARTICULAR", 1016, 10, 170, 206, 8 LTEXT "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE", 1017, 10, 178, 206, 8 LTEXT "COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES", 1018, 10, 186, 206, 8 LTEXT "OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,", 1019, 10, 194, 206, 8 LTEXT "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN", 1020, 10, 202, 206, 8 LTEXT "CONNECTION WITH THE SOFTWARE OR THE USE OR", 1021, 10, 210, 206, 8 LTEXT "OTHER DEALINGS IN THE SOFTWARE.", 1022, 10, 218 Revision-number: 1273 Prop-content-length: 336 Content-length: 336 K 8 svn:date V 27 2001-09-18T18:51:10.000000Z K 7 svn:log V 235 Reintroduce Cyrillic Caps Lock mode, which was in 0.51 but got kicked out by the Unicode patch. It's not very good - only works sanely on US keyboards - but it's no worse than it was in 0.51. After 0.52 maybe I should fix it properly. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1e2546357d4d5affa1291ddf6fab95f5 Text-delta-base-sha1: ae4c9b54419fd61742855307d601edfe9948de91 Text-content-length: 80 Text-content-md5: b3362a83f21c613dd1ed1f77ce4f462f Text-content-sha1: 40968126214225505a95bd4dce6d146526e015dc Content-length: 121 K 15 cvs2svn:cvs-rev V 5 1.111 PROPS-END SVN=5A+Tint xlat_capslockcyrwchar_t xlat_uskbd2cyrllic(int ch Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 53b9f2c7ba9e8e6c4157906b5c8c4340 Text-delta-base-sha1: e2e0411eaf9a43773595134681c872c26123c07d Text-content-length: 116 Text-content-md5: 8ead39e3640a79023f604498a656ebd8 Text-content-sha1: 3a9678193ebf5ea22c939c66894354a999dfea4c Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNV-[ 7\CapsLockCyr", cfg->xlat_capslockcyr (sesskey, "CapsLockCyr", 0, &cfg->xlat_capslockcyr Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2d8f8937ffaec63af28726144ca65aed Text-delta-base-sha1: b4bbc463871426fcd4010a177aa720ce7e31e005 Text-content-length: 1284 Text-content-md5: de583f1b2b3d1e7067715497a62d5b33 Text-content-sha1: 2869e72c97e32c05a7edea8a6df352e3fca71aad Content-length: 1324 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNcPh~hjywchar_t xlat_uskbd2cyrllic(int ch) { static wchar_t cyrtab[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0x042d, 35, 36, 37, 38, 0x044d, 40, 41, 42, 0x0406, 0x0431, 0x0454, 0x044e, 0x002e, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 0x0416, 0x0436, 0x0411, 0x0456, 0x042e, 0x002c, 64, 0x0424, 0x0418, 0x0421, 0x0412, 0x0423, 0x0410, 0x041f, 0x0420, 0x0428, 0x041e, 0x041b, 0x0414, 0x042c, 0x0422, 0x0429, 0x0417, 0x0419, 0x041a, 0x042b, 0x0415, 0x0413, 0x041c, 0x0426, 0x0427, 0x041d, 0x042f, 0x0445, 0x0457, 0x044a, 94, 0x0404, 96, 0x0444, 0x0438, 0x0441, 0x0432, 0x0443, 0x0430, 0x043f, 0x0440, 0x0448, 0x043e, 0x043b, 0x0434, 0x044c, 0x0442, 0x0449, 0x0437, 0x0439, 0x043a, 0x044b, 0x0435, 0x0433, 0x043c, 0x0446, 0x0447, 0x043d, 0x044f, 0x0425, 0x0407, 0x042a, 126, 127 }; return cyrtab[ch&0x7F] Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 268a4b4aa4416fd9ec9ce953ccb63d07 Text-delta-base-sha1: 75fab6fdf4da0e9a68cecdbcc186e658ed878d3a Text-content-length: 620 Text-content-md5: d9e39dd013a5f7ebdd6afea6b48e7220 Text-content-sha1: 92c4f36dcef7057e04ed657943c1b6c494d82103 Content-length: 661 K 15 cvs2svn:cvs-rev V 5 1.150 PROPS-END SVNh<"GO8g^} ~ ?yQ@LpxBOX_TRANSLATION3, IDC_CODEPAGESTATIC, IDC_CODEPAGE, IDC_CAPSLOCKCYRCheckDlgButton (hwnd, IDC_CAPSLOCKCYR, cfg.xlat_capslockcyrs1 beginbox(&cp, "Enable character set translation on input data", IDC_BOX_TRANSLATION2); checkbox(&cp, "CAP&S LOCK acts as cyrillic switch", IDC_CAPSLOCKCYR); endbox(&cp); beginbox(&cp, "Adjust how PuTTY displays line drawing characters", IDC_BOX_TRANSLATION3CAPSLOCKCYR { cfg.xlat_capslockcyr = IsDlgButtonChecked (hwnd, IDC_CAPSLOCKCYR Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cad4bbbd808aeb3f6d5a4c08bcc36d24 Text-delta-base-sha1: 29c011194015e84d996b27642db20b3ee4d7776d Text-content-length: 515 Text-content-md5: eb9a9be2becb488987e6e291150d332c Text-content-sha1: 66efa13a5645316db4dbc9b7a4de31a761dc5bb6 Content-length: 556 K 15 cvs2svn:cvs-rev V 5 1.156 PROPS-END SVN"^[HZYr0BOOL capsOn=0; /* helg: clear CAPS LOCK state if caps lock switches to cyrillic */ if(cfg.xlat_capslockcyr && keystate[VK_CAPITAL] != 0) { capsOn= !left_alt; keystate[VK_CAPITAL] = 0; } if(capsOn && ch < 0x80) { WCHAR cbuf[2]; cbuf[0] = 27; cbuf[1] = xlat_uskbd2cyrllic(ch); luni_send(cbuf+!left_alt, 1+!!left_alt); } else { char cbuf[2]; cbuf[0] = '\033'; cbuf[1] = ch; lpage_send(kbd_codepage, cbuf+!left_alt, 1+!!left_alt); } Revision-number: 1274 Prop-content-length: 273 Content-length: 273 K 7 svn:log V 172 Selection point movement on scroll should move selanchor as well as selstart and selend, otherwise all those worthy ideals go *foom* while the mouse buttons are held down. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-18T18:59:37.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 83747768681856867174b28655039d0d Text-delta-base-sha1: 25d74816c06c45a8d9b9c44649f186a7a82fc5ff Text-content-length: 334 Text-content-md5: 981215b86b241b35edf189025fd35a6e Text-content-sha1: 184b658e6be8a63f0cf4c3fb6d3e03e1c4eb9670 Content-length: 374 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVNR(WiN.$ * This applies to selstart and selend (for an existing * selection), and also selanchor (for one being * selected as we speak) if (selanchor.y >= seltop && selanchor.y <= botline) { selanchor.y--; if (selanchor.y < seltop) { selanchor.y = seltop; selanchor Revision-number: 1275 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 Fix flaky scrollbar update when scrollback was reset to bottom. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-18T19:04:21.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 981215b86b241b35edf189025fd35a6e Text-delta-base-sha1: 184b658e6be8a63f0cf4c3fb6d3e03e1c4eb9670 Text-content-length: 142 Text-content-md5: 88b06c626605eec50666fa6308dc7c10 Text-content-sha1: 046bb19c38ada9e20f782ee2636d68749f41c632 Content-length: 182 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVN^o,ERJ~nt need_sbar_update = seen_disp_event need_sbar_update = TRUE; } if (need_sbar_update) update_sbar(); Revision-number: 1276 Prop-content-length: 445 Content-length: 445 K 8 svn:date V 27 2001-09-18T19:41:07.000000Z K 7 svn:log V 344 terminal.c's from_backend() no longer calls term_out(), because term_out() can in turn call ldisc_send() which calls back to from_backend() when local echo is enabled. This was giving rise to crazy re-entrancy stuff and stack overflows. Instead from_backend() deposits its data in a bufchain which term_out() empties the next time it's called. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b3362a83f21c613dd1ed1f77ce4f462f Text-delta-base-sha1: 40968126214225505a95bd4dce6d146526e015dc Text-content-length: 20 Text-content-md5: 9f7f838eb98af2b839865eaef8441c38 Text-content-sha1: 6d611444342e32a942e134c97ea25579323af1c5 Content-length: 61 K 15 cvs2svn:cvs-rev V 5 1.112 PROPS-END SVN=X -+ Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b07f72ecfdc7dcf2bb0a3075e86e3b1c Text-delta-base-sha1: 2d7701caf55fe39a2994f3195ad2c1e71d700707 Text-content-length: 23 Text-content-md5: f5d30bfd20a0f8018e148aa688ccaf00 Text-content-sha1: 74f9ca7c3ede09d706549f550819e45afda7e8b8 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVNt_ xg Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 88b06c626605eec50666fa6308dc7c10 Text-delta-base-sha1: 046bb19c38ada9e20f782ee2636d68749f41c632 Text-content-length: 1187 Text-content-md5: 61ad1d75cb22debdf178567b6458b585 Text-content-sha1: db1501145ad2f4c79767f22d576a3a80aae4c5a4 Content-length: 1227 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVN^>2c!*_U^T?>'HA4hvbufchain inbuf; /* terminal input buffer */unget; unsigned char localbuf[256], *chars; int nchars = 0; unget = -1; while (nchars > 0 || bufchain_size(&inbuf) > 0) { if (unget == -1) { if (nchars == 0) { void *ret; bufchain_prefix(&inbuf, &ret, &nchars); if (nchars > sizeof(localbuf)) nchars = sizeof(localbuf); memcpy(localbuf, ret, nchars); bufchain_consume(&inbuf, nchars); chars = localbuf; assert(chars != NULL); } c = *chars++; nchars--; /* * Optionally log the session traffic to a file. Useful for * debugging and possibly also useful for actual logging. */ if (cfg.logtype == LGTYP_DEBUG) logtraffic((unsigned char) &c, LGTYP_DEBUG); } else { c = unget; unget = -1; }unget = cbufchain_add(&inbuf, data, len); /* * term_out() always completely empties inbuf. Therefore, * there's no reason at all to return anything other than zero * from this function, because there _can't_ be a question of * the remote side needing to wait until term_out() has cleared * a backlog. * Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: eb9a9be2becb488987e6e291150d332c Text-delta-base-sha1: 66efa13a5645316db4dbc9b7a4de31a761dc5bb6 Text-content-length: 36 Text-content-md5: 1c3bf8ec61b748212bb318c97836dd1a Text-content-sha1: 406ba9cd37c91b8cda693596fd47379c0891b59f Content-length: 77 K 15 cvs2svn:cvs-rev V 5 1.157 PROPS-END SVNk n|*|J; Revision-number: 1277 Prop-content-length: 231 Content-length: 231 K 8 svn:date V 27 2001-09-19T20:07:15.000000Z K 7 svn:log V 130 Fix pasting of newlines in local line editing mode. Possibly not a very _good_ fix; something might want doing after the release. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dd84746cb982b56e6c340aeb91fa3c76 Text-delta-base-sha1: 422756016ffe33289d8e435cbc0e3dbf19a40592 Text-content-length: 92 Text-content-md5: 765582124c9e40893718fc3fbc2e727a Text-content-sha1: 984e4f260ec44569aaea3f85282825327648a6a5 Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNUAi'iL , int interactiveif (!interactive && c == '\r') c += KCTRL('@') Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c7eb4b7902c34f1fe55ea4c5ebded49e Text-delta-base-sha1: 0e351fc1bc468fecf0ef34154fe2f0bd525c0e2c Text-content-length: 42 Text-content-md5: 6d3d79a133fbe914fab584a82defc483 Text-content-sha1: a80efde1ec311a7cfaccf59fe43865177afff9bd Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN'8 , int interactive Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9f7f838eb98af2b839865eaef8441c38 Text-delta-base-sha1: 6d611444342e32a942e134c97ea25579323af1c5 Text-content-length: 123 Text-content-md5: 273ecfcc5dc0fa88a675a28c2da0f4b1 Text-content-sha1: 43ef35fc8591fdd5e61911b6db791365e5ea3ea8 Content-length: 164 K 15 cvs2svn:cvs-rev V 5 1.113 PROPS-END SVNX _/./NO , int interactive, int interactive); void luni_send(wchar_t * widebuf, int len, int interactive Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f5d30bfd20a0f8018e148aa688ccaf00 Text-delta-base-sha1: 74f9ca7c3ede09d706549f550819e45afda7e8b8 Text-content-length: 41 Text-content-md5: 9d98803bd4da5308aee3678b3b05bf54 Text-content-sha1: bdda2c673668cbc191c8762b8ef5def4bcc34338 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVN_p 2-2, int interactive Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cf42a9ded80409d2df2b83cf4ec7245b Text-delta-base-sha1: 39a3bc10334e2dc2712ea67612d4ad6a80a10517 Text-content-length: 51 Text-content-md5: 4505ede1adf3eeb6a084e0e258666c04 Text-content-sha1: 23a3a77e81a31900be5d86d5388f5d0e72d1ff71 Content-length: 92 K 15 cvs2svn:cvs-rev V 5 1.169 PROPS-END SVN ro r&oic Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eb5e21361d357a691e9111d26fa50306 Text-delta-base-sha1: 04ebf1e3b125e7823d13ac4c9f2b7748e6c51e70 Text-content-length: 22 Text-content-md5: 12e84f08012f0b01f99eec7ae55c5aa8 Text-content-sha1: b397f5a03a574c1f36d12e7d8d48eba988059bb8 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNOR `r] Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 61ad1d75cb22debdf178567b6458b585 Text-delta-base-sha1: db1501145ad2f4c79767f22d576a3a80aae4c5a4 Text-content-length: 217 Text-content-md5: 761b653d1fc51da7eb509e592fea564f Text-content-sha1: 14fbe13a8df54cfd15cd7cdf5628e3ad25a35eac Content-length: 257 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVN>b_mBy?"=/ds 7WHI{b]\i9"@a], 0);, 0);, 0, 0, 0, 0, 0); } else if (esc_args[0] == 5) { ldisc_send("\033[0n", 4, 0, , 0, 0, 0, 0 Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: de583f1b2b3d1e7067715497a62d5b33 Text-delta-base-sha1: 2869e72c97e32c05a7edea8a6df352e3fca71aad Text-content-length: 172 Text-content-md5: b1d1ce9e3e5d5b0fa21c88fe774afd52 Text-content-sha1: ee0cc3c78d455531e2eecd3676b4a308a092ea3f Content-length: 212 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNP'x }M6BXx, int interactive, interactive, interactive); } void luni_send(wchar_t * widebuf, int len, int interactive, interactive Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1c3bf8ec61b748212bb318c97836dd1a Text-delta-base-sha1: 406ba9cd37c91b8cda693596fd47379c0891b59f Text-content-length: 264 Text-content-md5: 48185998624f144ee2f45b43dc49ebc4 Text-content-sha1: 31144a928f21ad4946f3a364c32ae07758772aaf Content-length: 305 K 15 cvs2svn:cvs-rev V 5 1.158 PROPS-END SVNkK/aRep7YQzH1ayJ"Ln|o, 1, 1, 1); } else { char c = (unsigned char) wParam; lpage_send(kbd_codepage, &c, 1, 1); } alt_sum = 0; } else lpage_send(kbd_codepage, &ch, 1, 1, 1 Revision-number: 1278 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:00.693416Z PROPS-END Revision-number: 1279 Prop-content-length: 845 Content-length: 845 K 8 svn:date V 27 2001-09-21T17:54:29.000000Z K 7 svn:log V 744 Ongoing pastes were being abandoned on any key-down event. Quite apart from the debatable semantic sanity of abandoning mid-paste, this was breaking Shift-paste (theoretically valid in any case, actually necessary with xterm mouse reporting enabled) because when you hold down Shift the window receives a steady stream of KEYDOWN messages as the key auto-repeats. One of those is likely to show up in mid-paste and scupper you. For the moment, this has been changed so that only a key press that actually _generates session data_ aborts a paste. In future I plan to review just why we're doing this anyway (it may be that paste-little-by-little was a response to rubbish socket buffering, in which case we can dispense with it completely now). K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 48185998624f144ee2f45b43dc49ebc4 Text-delta-base-sha1: 31144a928f21ad4946f3a364c32ae07758772aaf Text-content-length: 438 Text-content-md5: 75a1b1923e41a4dd438fabeb4fff285b Text-content-sha1: 50d7af7dc0d1428941494e9d506b4b204bd7afa1 Content-length: 479 K 15 cvs2svn:cvs-rev V 5 1.159 PROPS-END SVNc @C@-c7GvInterrupt an ongoing paste. I'm not sure * this is sensible, but for the moment it's * preferable to having to faff about buffering * things. */ term_nopaste(); /* * Interrupt an ongoing paste. I'm not sure this is * sensible, but for the moment it's preferable to * having to faff about buffering things. */ term_nopaste(); Revision-number: 1280 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2001-09-22T15:19:43.000000Z K 7 svn:log V 66 Correct capitalisation in one config option (Cyrillic Caps Lock). K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d9e39dd013a5f7ebdd6afea6b48e7220 Text-delta-base-sha1: 92c4f36dcef7057e04ed657943c1b6c494d82103 Text-content-length: 45 Text-content-md5: 874af16b4aac1eb1501691a1c3ea5e41 Text-content-sha1: a381473a922a5138d7a4b46f820cc078ddee2215 Content-length: 86 K 15 cvs2svn:cvs-rev V 5 1.151 PROPS-END SVN [(ap&s Lock acts as C Revision-number: 1281 Prop-content-length: 142 Content-length: 142 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-22T15:36:44.000000Z K 7 svn:log V 42 Miscellaneous small documentation tweaks. PROPS-END Node-path: putty/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 59b3e94e7eaadb49881aef4e8baad69e Text-delta-base-sha1: 793a73bf4a9c7e1acd3efe6fee47b7fdc19504a3 Text-content-length: 522 Text-content-md5: e81a8bfb4d0abb2acadb932e05509d0c Text-content-sha1: 7b3d5972ad326e88af58fc02dc6faa82daf9d982 Content-length: 561 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNA| rwr.c The server's host key is not cached in the registry. You \c have no guarantee that the server is the computer you \c think it is. \c The server's key fingerprint is: \c ssh-rsa 1024 7b:e5:6f:a7:f4:f9:81:62:5c:e3:1f:bf:8b:57:6c:5a \c If you trust this host, hit Yes to add the key to \c PuTTY's cache and carry on connecting. \c If you want to carry on connecting just once, without \c adding the key to the cache, hit No. \c If you do not trust this host, hit Cancel to abandon the \c connection. Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 59e5d579f0e1111e01e807483e52fee8 Text-delta-base-sha1: 446dd53b0feb01a342042dffc0286ed649ec98d6 Text-content-length: 20 Text-content-md5: feb5efd4176a3768f8550e1796217e91 Text-content-sha1: 853d349819a2cdd8d04fb9ad97f5a697bd0332b5 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN; S< Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a0f1534413a0e9952519205f86a25980 Text-delta-base-sha1: 4e5c19da2cc4c5e76f3ef3364b9719baae8da607 Text-content-length: 81 Text-content-md5: 4d08c1868e38accd8b6993f5002d2ada Text-content-sha1: 71a41f4b7c201c3b989bd0169005d72815e43035 Content-length: 120 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNdc723pf Z\versionid $Id: plink.but,v 1.8 2001/09/22 15:36:44 an Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 584600e9a101e94663ca0f6051922f3c Text-delta-base-sha1: 132511b2195da8f2317ffa0b721632f2dbe05260 Text-content-length: 224 Text-content-md5: ec2174d57f5bf9a06cf0987d35d4bcab Text-content-sha1: ff321c3940cccdfb3769ba8340c7da0e9deb7a88 Content-length: 264 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNulL 3\versionid $Id: pscp.but,v 1.14 2001/09/22 15:36:44members.surfeu.at/lgunnars/daplay/}{members.surfeu.at}. \# \W{http://www.i-tree.org/}{www.i-tree.org}. \# update this if the original site ever returns. Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dd5ce489cbe67eca3527143290f3ed76 Text-delta-base-sha1: 8ce91436ab6e0d2d6f12bd50df8cc00a57eb25ef Text-content-length: 80 Text-content-md5: f31509d9e432de1723094b2d50f8bf8b Text-content-sha1: 156260f3e2da97b117b767c82095c6556503233f Content-length: 119 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN :u4o(\versionid $Id: pubkey.but,v 1.4 2001/09/22 15:36:44FIXME: Revision-number: 1282 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2001-09-22T15:37:51.000000Z K 7 svn:log V 49 Oops - that tweak had bad Buttress syntax. D'oh! K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ec2174d57f5bf9a06cf0987d35d4bcab Text-delta-base-sha1: ff321c3940cccdfb3769ba8340c7da0e9deb7a88 Text-content-length: 71 Text-content-md5: fe6ac811fb2459f4ee7bcb594658bf9a Text-content-sha1: 87b76f38bb15451b07ad16185b5c922910e2ce83 Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNlm 3X3b \versionid $Id: pscp.but,v 1.15 2001/09/22 15:37:51 Revision-number: 1283 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2001-09-22T17:34:10.000000Z K 7 svn:log V 49 Pretty much finished writing the Config chapter. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fd10aaa4ffe708de956f64386757270f Text-delta-base-sha1: a81e6bbead802af30ea8790a008b6028f35ccf0f Text-content-length: 36472 Text-content-md5: caf76c39da76dfee7887126533a4343b Text-content-sha1: 0d14f40bb1e304f553e0893031f796f4730fd78b Content-length: 36512 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNK9hvT>^oQ8x hjOv_3PQ,cPETb%Q"Bru _ k+/pXs(See \k{which-one} for a summary of the differences between SSH, Telnet and rlogin.)n option labelled \q{Close Window on Exit}. This controls whether the PuTTY session window disappears as soon as the session inside it terminates. If you are likely to want to copy and paste text out of the session after it has terminated, you should arrange this option to be off. \q{Close Window On Exit} has three settings. \q{Always} means always close the window on exit; \q{Never} means never close on exit (always leave the window open). The third setting, and the default one, is \q{Only on clean exit}. In this mode, a session which terminates normally will cause its window to close, but one which is aborted unexpectedly by network trouble or a confusing message from the server will leave the window up. \H{config-logging} The Logging panel The Logging configuration panel allows you to save log files of your PuTTY sessions, for debugging, analysis or future reference. The main option is a radio-button set that specifies whether PuTTY will log anything at all. The options are \b \q{Logging turned off completely}. This is the default option; in this mode PuTTY will not create a log file at all. \b \q{Log printable output only}. In this mode, a log file will be created and written to, but only printable text will be saved into it. The various terminal control codes that are typically sent down an interactive session alongside the printable text will be omitted. This might be a useful mode if you want to read a log file in a text editor and hope to be able to make sense of it. \b \q{Log all session output}. In this mode, \e{everything} sent by the server into your terminal session is logged. If you view the log file in a text editor, therefore, you may well find it full of strange control characters. This is a particularly useful mode if you are experiencing problems with PuTTY's terminal handling: you can record everything that went to the terminal, so that someone else can replay the session later in slow motion and watch to see what went wrong. \S{config-logfilename} \q{Log file name} In this edit box you enter the name of the file you want to log the session to. The \q{Browse} button will let you look around your file system to find the right place to put the file; or if you already know exactly where you want it to go, you can just type a pathname into the edit box. There are a few special features in this box. If you use the \c{&} character in the file name box, PuTTY will insert details of the current session in the name of the file it actually opens. The precise replacements it will do are: \b \c{&Y} will be replaced by the current year, as four digits. \b \c{&M} will be replaced by the current month, as two digits. \b \c{&D} will be replaced by the current day of the month, as two digits. \b \c{&T} will be replaced by the current time, as six digits (HHMMSS) with no punctuation. \b \c{&H} will be replaced by the host name you are connecting to. For example, if you enter the host name \c{c:\\puttylogs\\log-&h-&y&m&d-&t.dat}, you will end up with files looking like \c log-server1.example.com-20010528-110859.dat \c log-unixbox.somewhere.org-20010611-221001.dat \S{config-logfileexists} \q{What to do if the log file already exists} This control allows you to specify what PuTTY should do if it tries to start writing to a log file and it finds the file already exists. You might want to automatically destroy the existing log file and start a new one with the same name. Alternatively, you might want to open the existing log file and add data to the \e{end} of it. Finally (the default option), you might not want to have any automatic behaviour, but to ask the user every time the problem comes upecho} \q{Local echo} With local echo disabled, characters you type into the PuTTY window are not echoed in the window \e{by PuTTY}. They are simply sent to the server. (The \e{server} might choose to echo them back to you; this can't be controlled from the PuTTY control panel.) Some types of session need local echo, and many do not. In its default mode, PuTTY will automatically attempt to deduce whether or not local echo is appropriate for the session you are working in. If you find it has made the wrong decision, you can use this configuration option to override its choice: you can force local echo to be turned on, or force it to be turned off, instead of relying on the automatic detection. \S{config-localedit} \q{Local line editing} Normally, every character you type into the PuTTY window is sent immediately to the server the moment you type it. If you enable local line editing, this changes. PuTTY will let you edit a whole line at a time locally, and the line will only be sent to the server when you press Return. If you make a mistake, you can use the Backspace key to correct it before you press Return, and the server will never see the mistake. Since it is hard to edit a line locally without being able to see it, local line editing is mostly used in conjunction with local echo (\k{config-localecho}). This makes it ideal for use in raw mode \#{FIXME} or when connecting to MUDs or talkers. (Although some more advanced MUDs do occasionally turn local line editing on and turn local echo off, in order to accept a password from the user.) Some types of session need local line editing, and many do not. In its default mode, PuTTY will automatically attempt to deduce whether or not local line editing is appropriate for the session you are working in. If you find it has made the wrong decision, you can use this configuration option to override its choice: you can force local line editing to be turned on, or force it to be turned off, instead of relying on the automatic detection. \H{config-bell} The Bell panel The Bell panel controls the terminal bell feature: the server's ability to cause PuTTY to beep at you. In the default configuration, when the server sends the character with ASCII code 7 (Control-G), PuTTY will play the Windows Default Beep sound. This is not always what you want the terminal bell feature to do; the Bell panel allows you to configure alternative actions. \S{config-bellstyle} \q{Set the style of bell} This control allows you to select various different actions to occur on a terminal bell: \b Selecting \q{None} disables the bell completely. In this mode, the server can send as many Control-G characters as it likes and nothing at all will happen. \b \q{Play Windows Default Sound} is the default setting. It causes the Windows \q{Default Beep} sound to be played. To change what this sound is, or to test it if nothing seems to be happening, use the Sound configurer in the Windows Control Panel. \b \q{Play a custom sound file} allows you to specify a particular sound file to be used by PuTTY alone, or even by a particular individual PuTTY session. This allows you to distinguish your PuTTY beeps from any other beeps on the system. If you select this option, you will also need to enter the name of your sound file in the edit control \q{Custom sound file to play as a bell}. \b \q{Visual bell} is a silent alternative to a beeping computer. In this mode, when the server sends a Control-G, the whole PuTTY window will flash white for a fraction of a second. \S{config-belltaskbar} \q{Taskbar/caption indication on bell} This feature controls what happens to the PuTTY window's entry in the Windows Taskbar if a bell occurs while the window does not have the input focus. In the default state (\q{Disabled}) nothing unusual happens. If you select \q{Steady}, then when a bell occurs and the window is not in focus, the window's Taskbar entry and its title bar will change colour to let you know that PuTTY session is asking for your attention. The change of colour will persist until you select the window, so you can leave several PuTTY windows minimised in your terminal, go away from your keyboard, and be sure not to have missed any important beeps when you get back. \q{Flashing} is even more eye-catching: the Taskbar entry will continuously flash on and off until you select the window. \S{config-bellovl} \q{Control the bell overload behaviour} A common user error in a terminal session is to accidentally run the Unix command \c{cat} (or equivalent) on an inappropriate file type, such as an executable, image file, or ZIP file. This produces a huge stream of non-text characters sent to the terminal, which typically includes a lot of bell characters. As a result of this the terminal often doesn't stop beeping for ten minutes, and everybody else in the office gets annoyed. To try to avoid this behaviour, or any other cause of excessive beeping, PuTTY includes a bell overload management feature. In the default configuration, receiving more than five bell characters in a two-second period will cause the overload feature to activate. Once the overload feature is active, further bells will have no effect at all, so the rest of your binary file will be sent to the screen in silence. After a period of five seconds during which no further bells are received, the overload feature will turn itself off again and bells will be re-enabled. If you want this feature completely disabled, you can turn it off using the checkbox \q{Bell is temporarily disabled when over-used}. Alternatively, if you like the bell overload feature but don't agree with the settings, you can configure the details: how many bells constitute an overload, how short a time period they have to arrive in to do so, and how much silent time is required before the overload feature will deactivate itselfS{config-ctrlalt} \q{Control-Alt is different from AltGr} Some old keyboards do not have an AltGr key, which can make it difficult to type some characters. PuTTY can be configured to treat the key combination Ctrl + Left Alt the same way as the AltGr key. By default, this checkbox is checked, and the key combination Ctrl + Left Alt does something completely different. PuTTY's usual handling of the left Alt key is to prefix the Escape (Control-\cw{[}) character to whatever character sequence the rest of the keypress would generate. For example, Alt-A generates Escape followed by \c{a}. So Alt-Ctrl-A would generate Escape, followed by Control-A. If you uncheck this box, Ctrl-Alt will become a synonym for AltGr, so you can use it to type extra graphic characters if your keyboard has any\S{config-winsizelock} Locking the size of the PuTTY window These options allow you to control what happens when the user tries to resize the PuTTY window. When you resize the PuTTY window, one of three things can happen: \b Nothing (if you have completely disabled resizes). \b The font size can stay the same and the number of rows and columns in the terminal can change. \b The number of rows and columns in the terminal can stay the same, and the font size can change. You can control which of these happens using the \q{Lock terminal size against resizing} and \q{Lock font size against resizing} options. If you lock both, the window will refuse to be resized at all. If you lock just the terminal size, the font size will change when you resize the window. If you lock just the font size, the terminal size will change when you resizeS{config-fullscreen} \q{Full screen on Alt-Enter} If this option is enabled, then pressing Alt-Enter will cause the PuTTY window to become full-screen - that is, it will not only maximise itself, it will expand so that the title bar goes off the top of the screen, and place itself on top of the Windows taskbar, so that \e{nothing} is visible on the screen except PuTTY. Pressing Alt-Enter again will restore the previous window sizeThis option allows you to choose what font, in what size, the PuTTY terminal window uses to display the text in the session. You will be offered a choice from all the fixed-width fonts installed on the system. (VT100-style terminal handling can only deal with fixed- width fonts.) \S{config-title} Controlling the window title The \q{Window title} edit box allows you to set the title of the PuTTY window. By default the window title will contain the host name followed by \q{PuTTY}, for example \c{server1.example.com - PuTTY}. If you want a different window title, this is where to set it. PuTTY allows the server to send \c{xterm} control sequences which modify the title of the window in mid-session. There is also an \c{xterm} sequence to modify the title of the window's \e{icon}. This makes sense in a windowing system where the window becomes an icon when minimised, such as Windows 3.1 or most X Window System setups; but in the Windows 95-like user interface it isn't as applicable. By default PuTTY's window title and Taskbar caption will change into the server-supplied icon title if you minimise the PuTTY window, and change back to the server-supplied window title if you restore it. (If the server has not bothered to supply a window or icon title, none of this will happen.) By checking the box marked \q{Avoid ever using icon title}, you can arrange that PuTTY will always display the window title, and completely ignore any icon titles the server sends it. \S{config-mouseptr} \q{Hide mouse pointer when typing in window} If you enable this option, the mouse pointer will disappear if the PuTTY window is selected and you press a key. This way, it will not obscure any of the text in the window while you work in your session. As soon as you move the mouse, the pointer will reappear. This option is disabled by default, so the mouse pointer remains visible at all times. \S{config-winborder} Controlling the window border PuTTY allows you to configure the appearance of the window border to some extent. The checkbox marked \q{Sunken-edge border} changes the appearance of the window border to something more like a DOS box: the inside edge of the border is highlighted as if it sank down to meet the surface inside the window. This makes the border a little bit thicker as well. It's hard to describe well. Try it and see if you like it. You can also configure a completely blank gap between the text in the window and the border, using the \q{Gap between text and window edge} control. By default this is set at one pixel. You can reduce it to zero, or increase it further.charset} Controlling character set translation During an interactive session, PuTTY receives a stream of 8-bit bytes from the server, and in order to display them on the screen it needs to know what character set to interpret them in. There are a lot of character sets to choose from. The \q{Received data assumed to be in which character set} option lets you select one. By default PuTTY will attempt to choose a character set that is right for your locale as reported by Windows; if it gets it wrong, you can select a different one using this control. A few notable character sets are: \b The ISO-8859 series are all standard character sets that include various accented characters appropriate for different sets of languages. \b The Win125x series are defined by Microsoft, for similar purposes. In particular Win1252 is almost equivalent to ISO-8859-1, but contains a few extra characters such as matched quotes and the Euro symbol. \b If you want the old IBM PC character set with block graphics and line-drawing characters, you can select \q{CP437}. \b PuTTY also supports Unicode mode, in which the data coming from the server is interpreted as being in the UTF-8 encoding of Unicode. If you select \q{UTF-8} as a character set you can use this mode. Not all server-side applications will support it. \S{config-cyr} \q{Caps Lock acts as Cyrillic switch} This feature allows you to switch between a US/UK keyboard layout and a Cyrillic keyboard layout by using the Caps Lock key, if you need to type (for example) Russian and English side by side in the same document. Currently this feature is not expected to work properly if your native keyboard layout is not US or UK. \S{config-linedraw} Controlling display of line drawing characters VT100-series terminals allow the server to send control sequences that shift temporarily into a separate character set for drawing lines and boxes. PuTTY has a variety of ways to support this capability. In general you should probably try lots of options until you find one that your particular font supports. \b \q{Font has XWindows encoding} is for use with fonts that have a special encoding, where the lowest 32 character positions (below the ASCII printable range) contain the line-drawing characters. This is unlikely to be the case with any standard Windows font; it will probably only apply to custom-built fonts or fonts that have been automatically converted from the X Window System. \b \q{Use font in both ANSI and OEM modes} tries to use the same font in two different character sets, to obtain a wider range of characters. This doesn't always work; some fonts claim to be a different size depending on which character set you try to use. \b \q{Use font in OEM mode only} is more reliable than that, but can miss out other characters from the main character set. \b \q{Poor man's line drawing} assumes that the font \e{cannot} generate the line and box characters at all, so it will use the \c{+}, \c{-} and \c{|} characters to draw approximations to boxes. You should use this option if none of the other options works. \b \q{Unicode mode} tries to use the box characters that are present in Unicode. For good Unicode-supporting fonts this is probably the most reliable and functional option.linedrawpaste} Controlling the pasting of line drawing characters By default, when you copy and paste a piece of the PuTTY screen that contains VT100 line and box drawing characters, PuTTY will translate them into the \q{poor man's} line-drawing characters \c{+}, \c{-} and \c{|}. The checkbox \q{Don't translate line drawing chars} disables this feature, so line-drawing characters will be pasted as if they were in the normal character set. This will typically mean they come out mostly as \c{q} and \c{x}, with a scattering of \c{jklmntuvw} at the corners. This might be useful if you were trying to recreate the same box layout in another program, for example. \S{config-mouse} Changing the actions of the mouse buttons PuTTY's copy and paste mechanism is modelled on the Unix \c{xterm} application. The X Window System uses a three-button mouse, and the convention is that the left button selects, the right button extends an existing selection, and the middle button pastes. Windows typically only has two mouse buttons, so in PuTTY's default configuration, the \e{right} button pastes, and the \e{middle} button (if you have one) extends a selection. If you have a three-button mouse and you are already used to the \c{xterm} arrangement, you can select it using the \q{Action of mouse buttons} control. \S{config-mouseshift} \q{Shift overrides application's use of mouse} PuTTY allows the server to send control codes that let it take over the mouse and use it for purposes other than copy and paste. Applications which use this feature include the text-mode web browser \c{links}, the Usenet newsreader \c{trn} version 4, and the file manager \c{mc} (Midnight Commander). When running one of these applications, pressing the mouse buttons no longer performs copy and paste. If you do need to copy and paste, you can still do so if you hold down Shift while you do your mouse clicks. However, it is possible in theory for applications to even detect and make use of Shift + mouse clicks. We don't know of any applications that do this, but in case someone ever writes one, unchecking the \q{Shift overrides application's use of mouse} checkbox will cause Shift + mouse clicks to go to the server as well (so that mouse-driven copy and paste will be completely disabled). \S{config-charclasses} Configuring word-by-word selection PuTTY will select a word at a time in the terminal window if you double-click to begin the drag. This panel allows you to control precisely what is considered to be a word. Each character is given a \e{class}, which is a small number (typically 0, 1 or 2). PuTTY considers a single word to be any number of adjacent characters in the same class. So by modifying the assignment of characters to classes, you can modify the word-by-word selection behaviour. In the default configuration, the character classes are: \b Class 0 contains white space and control characters. \b Class 1 contains most punctuation. \b Class 2 contains letters, numbers and a few pieces of punctuation (the double quote, minus sign, period, forward slash and underscore). So, for example, if you assign the \c{@} symbol into character class 2, you will be able to select an e-mail address with just a double click. In order to adjust these assignments, you start by selecting a group of characters in the list box. Then enter a class number in the edit box below, and press the \q{Set} button. This mechanism currently only covers ASCII characters, because it isn't feasible to expand the list to cover the whole of Unicode.When the server sends a control sequence indicating that some text should be displayed in bold, PuTTY can handle this two ways. It can either change the font for a bold version, or use the same font in a brighter colour. This control lets you choose which. By default the box is checked, so non-bold text is displayed in light grey and bold text is displayed in bright white (and similarly in other colours). If you uncheck the box, bold and non-bold text will be displayed in the same colour, and instead the font will change to indicate the difference. \S{config-logpalette} \q{Attempt to use logical palettes} Logical palettes are a mechanism by which a Windows application running on an 8-bit colour display can select precisely the colours it wants instead of going with the Windows standard defaults. If you are not getting the colours you ask for on an 8-bit display, you can try enabling this option. However, be warned that it's never worked very well. \S{config-colourcfg} Adjusting the colours in the terminal window The main colour control allows you to specify exactly what colours things should be displayed in. To modify one of the PuTTY colours, use the list box to select which colour you want to modify. The RGB values for that colour will appear on the right-hand side of the list box. Now, if you press the \q{Modify} button, you will be presented with a colour selector, in which you can choose a new colour to go in place of the old one. PuTTY allows you to set the cursor colour, the default foreground and background, and the precise shades of all the ANSI configurable colours (black, red, green, yellow, blue, magenta, cyan, and white). In addition, if you have selected \q{Bolded text is a different colour}, you can also modify the precise shades used for the bold versions of these colours.Most servers you might connect to with PuTTY are designed to be connected to from lots of different types of terminal. In order to send the right control sequences to each one, the server will need to know what type of terminal it is dealing with. Therefore, each of the SSH, Telnet and Rlogin protocols allow a text string to be sent down the connection describing the terminal. PuTTY attempts to emulate the Unix \c{xterm} program, and by default it reflects this by sending \c{xterm} as a terminal-type string. If you find this is not doing what you want - perhaps the remote terminal reports \q{Unknown terminal type} - you could try setting this to something different, such as \c{vt220}. If you're not sure whether a problem is due to the terminal type setting or not, you probably need to consult the manual for your application or your server. \S{config-username} \q{Auto-login username} All three of the SSH, Telnet and Rlogin protocols allow you to specify what user name you want to log in as, without having to type it explicitly every time. (Some Telnet servers don't support this.) In this box you can type that user name.toTelnet allows the client to send a text string that describes the terminal speed. PuTTY lets you configure this, in case you find the server is reacting badly to the default value. (I'm not aware of any servers that do have a problem with it.) \S{config-environ} Setting environment variables on the server The Telnet protocol also provides a means for the client to pass environment variables to the server. Many Telnet servers have stopped supporting this feature due to security flaws, but PuTTY still supports it for the benefit of any servers which have found other ways around the security problems than just disabling the whole mechanism. To add an environment variable to the list transmitted down the connection, you enter the variable name in the \q{Variable} box, enter its value in the \q{Value} box, and press the \q{Add} button. To remove one from the list, select it in the list box and press \q{Remove}. \S{config-oldenviron} \q{Handling of OLD_ENVIRON ambiguity} The original Telnet mechanism for passing environment variables was badly specified. At the time the standard (RFC 1408) was written, BSD telnet implementations were already supporting the feature, and the intention of the standard was to describe the behaviour the BSD implementations were already using. Sadly there was a typing error in the standard when it was issued, and two vital function codes were specified the wrong way round. BSD implementations did not change, and the standard was not corrected. Therefore, it's possible you might find either BSD or RFC-compliant implementations out there. This switch allows you to choose which one PuTTY claims to be. The problem was solved by issuing a second standard, defining a new Telnet mechanism called \cw{NEW_ENVIRON}, which behaved exactly like the original \cw{OLD_ENVIRON} but was not encumbered by existing implementations. Most Telnet servers now support this, and it's unambiguous. This feature should only be needed if you have trouble passing environment variables to quite an old server. \S{config-ptelnet} Passive and active Telnet negotiation modes In a Telnet connection, there are two types of data passed between the client and the server: actual text, and \e{negotiations} about which Telnet extra features to use. PuTTY can use two different strategies for negotiation: \b In \e{active} mode, PuTTY starts to send negotiations as soon as the connection is opened. \b In \e{passive} mode, PuTTY will wait to negotiate until it sees a negotiation from the server. The obvious disadvantage of passive mode is that if the server is also operating in a passive mode, then negotiation will never begin at all. For this reason PuTTY defaults to active mode. However, sometimes passive mode is required in order to successfully get through certain types of firewall and Telnet proxy server. If you have confusing trouble with a firewall, you could try enabling passive mode to see if it helps. \S{config-telnetkey} \q{Keyboard sends telnet Backspace and Interrupt} If this box is checked, the Backspace key on the keyboard will send the Telnet special backspace code, and Control-C will send the Telnet special interrupt code. You probably shouldn't enable this unless you know what you're doing. \H{config-rlogin} The Rlogin panel The Rlogin panel allows you to configure options that only apply to Rlogin sessions. \S{config-rlogin-termspeed} \q{Terminal-speed string} Like Telnet, Rlogin allows the client to send a text string that describes the terminal speed. PuTTY lets you configure this, in case you find the server is reacting badly to the default value. (I'm not aware of any servers that do have a problem with it.) \S{config-rlogin-localuser} \q{Local username} Rlogin allows an automated (password-free) form of login by means of a file called \c{.rhosts} on the server. You put a line in your \c{.rhosts} file saying something like \c{jbloggs@pc1.example.com}, and then when you make an Rlogin connection the client transmits the username of the user running the Rlogin client. The server checks the username and hostname against \c{.rhosts}, and if they match it does not ask for a password. This only works because Unix systems contain a safeguard to stop a user from pretending to be another user in an Rlogin connection. Rlogin connections have to come from port numbers below 1024, and Unix systems prohibit this to unprivileged processes; so when the server sees a connection from a low-numbered port, it assumes the client end of the connection is held by a privileged (and therefore trusted) process, so it believes the claim of who the user is. Windows does not have this restriction: \e{any} user can initiate an outgoing connection from a low-numbered port. Hence, the Rlogin \c{.rhosts} mechanism is completely useless for securely distinguishing several different users on a Windows machine. If you have a \c{.rhosts} entry pointing at a Windows PC, you should assume that \e{anyone} using that PC can spoof your username in an Rlogin connection and access your account on the server. The \q{Local username} control allows you to specify what user name PuTTY should claim you have, in case it doesn't match your Windows user name (or in case you didn't bother to set up a Windows user name).In SSH, you don't have to run a general shell session on the server. Instead, you can choose to run a single specific command (such as a mail user agent, for example). If you want to do this, enter the command in the \q{Remote command} box. \S{config-ssh-pty} \q{Don't allocate a pseudo-terminal} When connecting to a Unix system, most interactive shell sessions are run in a \e{pseudo-terminal}, which allows the Unix system to pretend it's talking to a real physical terminal device but allows the SSH server to catch all the data coming from that fake device and send it back to the client. Occasionally you might find you have a need to run a session \e{not} in a pseudo-terminal. In PuTTY, this is generally only useful for very specialist purposes; although in Plink (see \k{plink}) it is the usual way of working. \S{config-ssh-comp} \q{Enable compression} This enables data compression in the SSH connection: data sent by the server is compressed before sending, and decompressed at the client end. Likewise, data sent by PuTTY to the server is compressed first and the server decompresses it at the other end. This can help make the most of a low-bandwidth connection. \S{config-ssh-prot} \q{Preferred SSH protocol version} This allows you to select whether you would like to use SSH protocol version 1 or version 2. \#{FIXME: say something about this elsewhere?} PuTTY will attempt to use protocol 1 if the server you connect to does not offer protocol 2, and vice versa. \S{config-ssh-macbug} \q{Imitate SSH 2 MAC bug} This option \e{should} now be unnecessary. It existed in order to work around a bug in early versions (2.3.0 and below) of the SSH server software from \cw{ssh.com}. The symptom of this problem would be that PuTTY would die unexpectedly at the beginning of the session, saying \q{Incorrect MAC received on packet}. Current versions of PuTTY attempt to detect these faulty servers and enable the bug compatibility automatically, so you should never need to use this option any more. \S{config-ssh-encryption} Encryption algorithm selection PuTTY supports a variety of different encryption algorithms, and allows you to choose which one you prefer to use. You can do this by dragging the algorithms up and down in the list box to specify a preference order. When you make an SSH connection, PuTTY will search down the list from the top until it finds an algorithm supported by the server, and then use that. If the algorithm PuTTY finds is below the \q{warn below here} line, you will see a warning box when you make the connection: \c The first cipher supported by the server \c is single-DES, which is below the configured \c warning threshold. \c Do you want to continue with this connection? This warns you that the first available encryption is not a very secure one. Typically you would put the \q{warn below here} line between the encryptions you consider secure and the ones you consider substandard. By default, PuTTY supplies a preference order intended to reflect a reasonable preference in terms of security and speed. \H{config-ssh-auth} The Auth panel The Auth panel allows you to configure authentication options for SSH sessions. \S{config-ssh-tis} \q{Attempt TIS or CryptoCard authentication} TIS and CryptoCard authentication are simple challenge/response forms of authentication available in SSH protocol version 1 only. You might use them if you were using S/Key one-time passwords, for example, or if you had a physical security token that generated responses to authentication challenges. With this switch enabled, PuTTY will attempt these forms of authentication if the server is willing to try them. You will be presented with a challenge string (which will be different every time) and must supply the correct response in order to log in. If your server supports this, you should talk to your system administrator about precisely what form these challenges and responses take. \S{config-ssh-agentfwd} \q{Allow agent forwarding} This option allows the SSH server to open forwarded connections back to your local copy of Pageant. If you are not running Pageant, this option will do nothing. See \k{pageant} for general information on Pageant, and \k{pageant-forward} for information on agent forwarding. Note that there is a security risk involved with enabling this option; see \k{pageant-security} for details. \S{config-ssh-privkey} \q{Private key file for authentication} This box is where you enter the name of your private key file if you are using public key authentication. See \k{pubkey} for information about public key authentication in SSH. \H{config-ssh-tunnels} The Tunnels panel The Tunnels panel allows you to configure tunnelling of other connection types through an SSH connection. \S{config-ssh-x11} X11 forwarding If your server lets you run X Window System applications, X11 forwarding allows you to securely give those applications access to a local X display on your PC. This feature will only be useful if you have an X server on your PC, such as Exceed or XWin32. To enable X11 forwarding, check the \q{Enable X11 forwarding} box. If your X display is not the primary display on your local machine (which it almost certainly will be unless you have deliberately arranged otherwise), you need to enter its location in the \q{X display location} box. \# FIXME: perhaps link to some more general X forwarding info? \S{config-ssh-portfwd} Port forwarding Port forwarding allows you to tunnel other types of network connection down an SSH connection. To set up a local port forwarding, make sure the \q{Local} radio button is set. Then enter a local port number (on your PC) in the \q{Source port} box, and a hostname and port number (separated by a colon) in the \q{Destination} box, and finally press the \q{Add} button. For example, you might select a source port of 10079, and a destination of \c{server2.example.com:79}. If you do this, and then start the session, you should find that connecting to your local PC on port 10079 gives you a connection to port 79 (the finger server) on \c{server2.example.com}. The connection is actually going to PuTTY itself, which encrypts the connection data and sends it down the secure channel to the SSH server. The connection then proceeds in clear from there to the eventual destination. So you might use this (for example) to forward a connection between two non-hostile network zones that are only connected by a hostile zone such as the open Internet. You can forward ports on the SSH server machine in the other direction, too (so the connection will start at the server end and be sent down the secure connection to PuTTY, which will make the real connection to the destination). To work this way round, just click the \q{Remote} radio button instead of \q{Local}. \# FIXME: perhaps move this to a general port-forwarding section and \# just link to it here? Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4d08c1868e38accd8b6993f5002d2ada Text-delta-base-sha1: 71a41f4b7c201c3b989bd0169005d72815e43035 Text-content-length: 326 Text-content-md5: 334d138104c84ec064005eb92b8a99c8 Text-content-sha1: b8463045e72b3c5344611ae62136259611a3b177 Content-length: 365 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNcj - 3z21\versionid $Id: plink.but,v 1.9 2001/09/22 17:34:10 \k{config-saving}) with the protocol set to SSH (see \k{config-hostname}) and specifies your private key file (see \k{config-ssh-privkey}). You will probably also want to specify a username to log in as (see \k{config-username}). You should then be Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fe6ac811fb2459f4ee7bcb594658bf9a Text-delta-base-sha1: 87b76f38bb15451b07ad16185b5c922910e2ce83 Text-content-length: 139 Text-content-md5: e04ef250c6c83afe35ffb0060ecc9aa9 Text-content-sha1: af99aa2d61f0b087b4abd4e24437ee41906a3fa8 Content-length: 179 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNmt tf3AS\versionid $Id: pscp.but,v 1.16 2001/09/22 17:34:10ssh-privkey}). You will probably also want to specify a username Revision-number: 1284 Prop-content-length: 224 Content-length: 224 K 7 svn:log V 123 Add support for DSA authentication in SSH2, following clever ideas on how to get round the problem of generating a good k. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-22T20:52:21.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eb21033635f05b2517a9ffd2ef966815 Text-delta-base-sha1: c0d2e0d9273358753c87339a78b448b77cc606b1 Text-content-length: 1730 Text-content-md5: 895721ad0968f32f86c1d11260d072d2 Text-content-sha1: 45742f1565e2fa821e7ebf214d3004d0165593d4 Content-length: 1770 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNd*Mi^_W^ I=3m@A+$iY ~\8gH sshsh512 sshdss.$(OBJ) sshsh512.$(OBJ) ##-- objects puttygen GEN1 = puttygen.$(OBJ) sshrsag.$(OBJ) sshdssg.$(OBJ) sshprime.$(OBJ) GEN2 = sshdes.$(OBJ) sshbn.$(OBJ) sshmd5.$(OBJ) version.$(OBJ) sshrand.$(OBJ) GEN3 = noise.$(OBJ) sshsha.$(OBJ) winstore.$(OBJ) misc.$(OBJ) winctrls.$(OBJ) GEN4 = sshrsa.$(OBJ) sshdss.$(OBJ) sshpubk.$(OBJ) sshaes.$(OBJ) sshsh512int64.h puttymem.h ssh.h putty.h cert.$(OBJ): cert.c asn.h asnerror.h misc.h puttymem.h cert.h crypto.h debug.$(OBJ): debug.c debugint64int64.h ssh.h putty.h pageant.$(OBJ): pageant.c network.h int64int64int64int64.h puttymem.h ssh.h putty.h tree234.h sshaes.$(OBJ): sshaes.c network.h int64.h puttymem.h ssh.h sshblowf.$(OBJ): sshblowf.c network.h int64.h puttymem.h ssh.h sshbn.$(OBJ): sshbn.c network.h misc.h int64.h puttymem.h ssh.h putty.h sshcrc.$(OBJ): sshcrc.c sshdes.$(OBJ): sshdes.c network.h int64.h puttymem.h ssh.h sshdh.$(OBJ): sshdh.c network.h int64.h puttymem.h ssh.h sshdss.$(OBJ): sshdss.c network.h misc.h int64.h puttymem.h ssh.h sshdssg.$(OBJ): sshdssg.c network.h misc.h int64.h puttymem.h ssh.h sshmd5.$(OBJ): sshmd5.c network.h int64.h puttymem.h ssh.h sshprime.$(OBJ): sshprime.c network.h int64.h puttymem.h ssh.h sshpubk.$(OBJ): sshpubk.c network.h int64.h puttymem.h ssh.h sshrand.$(OBJ): sshrand.c network.h int64.h puttymem.h ssh.h sshrsa.$(OBJ): sshrsa.c network.h int64.h puttymem.h ssh.h sshrsag.$(OBJ): sshrsag.c network.h int64.h puttymem.h ssh.h sshsh512.$(OBJ): sshsh512.c network.h int64.h puttymem.h ssh.h sshsha.$(OBJ): sshsha.c network.h int64.h puttymem.h ssh.h sshzlib.$(OBJ): sshzlib.c network.h int64int64int64int64 Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f31509d9e432de1723094b2d50f8bf8b Text-delta-base-sha1: 156260f3e2da97b117b767c82095c6556503233f Text-content-length: 3038 Text-content-md5: 4e377af18589800c13376cd47f998e7f Text-content-sha1: 52abb0133ed8045def3a2de2f815834a2a2392f1 Content-length: 3077 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN;24,y-Vb\versionid $Id: pubkey.but,v 1.5 2001/09/22 20:52:21S{pubkey-types} Different types of public key The PuTTY key generator, described in \k{pubkey-puttygen}, offers you the opportunity to generate several types of key pair: \b An RSA key for use with the SSH 1 protocol. \b An RSA key for use with the SSH 2 protocol. \b A DSA key for use with the SSH 2 protocol. The SSH 1 protocol only supports RSA keys; if you will be connecting using the SSH 1 protocol, you must select the first key type or your key will be completely useless. SSH 2 supports more than one key type. The two types supported by PuTTY are RSA and DSA. The PuTTY developers \e{strongly} recommend you use RSA. DSA has an intrinsic weakness which makes it very easy to create a signature which contains enough information to give away the \e{private} key! This would allow an attacker to pretend to be you for any number of future sessions. PuTTY's implementation has taken very careful precautions to avoid this weakness, but we cannot be 100% certain we have managed it, and if you have the choice we strongly recommend using RSA keys instead. If you really need to connect to an SSH server which only supports DSA, then you probably have no choice but to use DSA. If you do use DSA, we recommend you do not use the same key to authenticate with more than one server. \H{pubkey-puttygen} PuTTYgen: K, and the type of the key (see \k{pubkey-types}). With \e{Parameters} you define the strength of the key. The default of , you must configure the server to accept your public key for authentication: \b If your server is using the SSH 1 protocol, you should change into the \c{.ssh} directory and open the file \c{authorized_keys} with your favorite editor. (You may have to create this file if this is the first key you have put in it). Then switch to the PuTTYgen window, select all of the text in the \e{Public key for pasting into authorized_keys file} box, and copy it to the clipboard (\c{Ctrl+C}). Then, switch back to the PuTTY window and insert the data into the open file, making sure it ends up all on one line. Save the file. \b If your server is OpenSSH and is using the SSH 2 protocol, you should follow the same instructions except that the file will be called \c{authorized_keys2}. \b If your server is \cw{ssh.com}'s SSH 2 product, you need to save a \e{public} key file from PuTTYgen, and copy that into the \c{.ssh2} directory on the server. Then you should go into that \c{.ssh2} directory, and edit (or create) a file called \c{authorization}. In this file you should put a line like \c{Key mykey.pub}, with \c{mykey.pub} replaced by the name of your key file. \b For other SSH server software, you should refer to the manual for that server. From now on you should be able to use the private key for authentication to this host. Either select the private key in PuTTY's \e{Connection}, \e{SSH} panel: \e{Private key file for authentication} dialog or use it with Pageant as described in \k{pageant}. Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6a492169ca9b77a7a6fe87924554c73a Text-delta-base-sha1: f1ad6fd8405d088ad9455d164ea78fba37543b65 Text-content-length: 109 Text-content-md5: 4aac4d29f8de9f6faac7ba78a5a39b8f Text-content-sha1: 150816f894f76755d7a11b0e11c57f5d3f88d642 Content-length: 149 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNnH5=6~vD6hSIGNif (alglen == 7 && !memcmp(alg, "ssh-dss", 7)) key->alg = &ssh_dss Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d5155c63781726974e407e80846b505 Text-delta-base-sha1: 0062ecb15a70ad46351dbf71db47198c9aa9d468 Text-content-length: 2749 Text-content-md5: 883a4c3cbd48f52634b4a74fbbb7c85e Text-content-sha1: 35909924dc2074bbd9907441f94cc4f2ce7b9c01 Content-length: 2789 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN>hgH2g %^GfW%|2IEymnOS/K3uqpA84wY+ROGRESSRANGE 65535 #define MAXPHASE 5 struct progress { int nphases; struct { int exponential; unsigned startpoint, total; unsigned param, current, n; /* if exponential */ unsigned mult; /* if linear */ } phases[MAXPHASE]; unsigned total, divisor, range; HWND progbar; }; static void progress_update(void *param, int actionif (action < PROGFN_READY && p->nphases < phase) p->nphases = phase; switch (action) { case PROGFN_LIN_PHASE: p->phases[phase-1].exponential = 0; p->phases[phase-1].mult = p->phases[phase].total / progress; break; case PROGFN_EXP_PHASE: p->phases[phase-1].exponential = 1; p->phases[phase-1].param = 0x10000 + progress; p->phases[phase-1].current = p->phases[phase-1].total; p->phases[phase-1].n = 0; break; case PROGFN_PHASE_EXTENT: p->phases[phase-1].total = progress; break; case PROGFN_READY: { unsigned total = 0; int i; for (i = 0; i < p->nphases; i++) { p->phases[i].startpoint = total; total += p->phases[i].total; } p->total = total; p->divisor = ((p->total + PROGRESSRANGE - 1) / PROGRESSRANGE); p->range = p->total / p->divisor; SendMessage(p->progbar, PBM_SETRANGE, 0, MAKELPARAM(0, p->range)); } break; case PROGFN_PROGRESS: if (p->phases[phase-1].exponential) { while (p->phases[phase-1].n < progress) { p->phases[phase-1].n++; p->phases[phase-1].current *= p->phases[phase-1].param; p->phases[phase-1].current /= 0x10000; } position = (p->phases[phase-1].startpoint + p->phases[phase-1].total - p->phases[phase-1].current); } else { position = (p->phases[phase-1].startpoint + progress * p->phases[phase-1].mult); } SendMessage(p->progbar, PBM_SETPOS, position / p->divisor, 0); break; }int is_dsa; struct RSAKey *key; struct dss_key *dssif (params->is_dsa) dsa_generate(params->dsskey, params->keysize, progress_update, &prog); else , is_dsa struct dss_key dss IDC_KEYSSH2Dd3, "SSH&1 (RSA)", IDC_KEYSSH1, "SSH2 &RSA", IDC_KEYSSH2RSA, "SSH2 &DSA", IDC_KEYSSH2Dis_dsa = state->is_dsa; params->key = &state->key; params->dsskey = &state->dssstate->is_dsa = IsDlgButtonChecked(hwnd, IDC_KEYSSH2DSARANGE, 0, MAKELPARAM(0, PROGRESSRANGE)); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, PROGRESSRANGE,if (state->is_dsa) { state->ssh2key.data = &state->dsskey; state->ssh2key.alg = &ssh_dss; } else { state->ssh2key.data = &state->key; state->ssh2key.alg = &ssh_rsa; }if (state->is_dsa) strftime(*state->commentptr, 30, "dsa-key-%Y%m%d", tm); else Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2bbae4cdcd50472c28c468b03d7144e5 Text-delta-base-sha1: c0b13011e6300243e18b47c800d9d60cdebd954d Text-content-length: 1083 Text-content-md5: 0b6d3479fc08b1b38007ca9a66a464cd Text-content-sha1: 2148f6af4ce98f4db0bdfe2a95f5f8f9d8a2bdc4 Content-length: 1123 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNlT0@(<x^@WIlI^z.Fp|#include "int64struct dss_key { Bignum p, q, g, y, xvoid hmac_sha1_simple(void *key, int keylen, void *data, int datalen, unsigned char *output); typedef struct { uint64 h[8]; unsigned char block[128]; int blkused; uint32 len[4]; } SHA512_State; void SHA512_Init(SHA512_State * s); void SHA512_Bytes(SHA512_State * s, const void *p, int len); void SHA512_Final(SHA512_State * s, unsigned char *output); void SHA512_Simple(const long(unsigned longbigmuladd(Bignum a, Bignum b, Bignum addend); Bignum bigdiv(Bignum a, Bignum b); Bignum bigmod#define PROGFN_LIN_PHASE 1 #define PROGFN_EXP_PHASE 2 #define PROGFN_PHASE_EXTENT 3 #define PROGFN_READY 4 #define PROGFN_PROGRESS 5 typedef void (*progfn_t) (void *param, int action, int phase, int progress); int rsa_generate(struct RSAKey *key, int bits, progfn_t pfn, void *pfnparam); int dsa_generate(struct dss_key *key, int bits, progfn_t pfn, void *pfnparam); Bignum primegen(int bits, int modulus, int residue, Bignum factor, int phase, Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 297520634f15e87fccc028f5373734d3 Text-delta-base-sha1: 9208cb60d06abd2a20f2a8f48ca553ee6da60a29 Text-content-length: 964 Text-content-md5: a6a7935e74c8368ccd53a49f3e42976b Text-content-sha1: 56c6da7efcb89e17b76a2f243ccfbf436219e734 Content-length: 1004 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN-[Imsgu9oO&JFuS `TK|N| #nclude "misc.h" if `quotient' is non-NULL. * We can avoid writing out the result if `result' is NULL. */ void bigdivif (result) { for (i = 1; i <= result[0]; i++) { int j = plen - i; result[i] = j >= 0 ? n[j] : 0; }32-bit) long into a bignum. */ Bignum bignum_from_long(unsigned long n) { Bignum ret; ret = newbn(3); ret[1] = n & 0xFFFF; ret[2] = (n >> 16) & 0xFFFF; ret[3] = 0; ret[0] = (ret[2] (("-")); for (i = nibbles; i--;) debug(("%c", (("\n")); } /* * Simple division. */ Bignum bigdiv(Bignum a, Bignum b) { Bignum q = newbn(a[0]); bigdivmod(a, b, NULL, q); return q; } /* * Simple remainder. */ Bignum bigmod(Bignum a, Bignum b) { Bignum r = newbn(b[0]); bigdivmod(a, b, r, NULL); return rwhile (bignum_cmp(b, Zero) != 0) { Bignum t = newbn(b[0]); bigdivmod(a, b, t, NULLdivmod(a, b, t, q Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6cb12c78050b5976033f3bfe5d083086 Text-delta-base-sha1: 029fe524ace679681e5e1ab02a10ed0df4e362c3 Text-content-length: 8808 Text-content-md5: 27e99b052d3f465a55e227bcc1787b2e Text-content-sha1: f1ad460cc00fc36da5a88fcf337de4bf942d59cd Content-length: 8848 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNzBMFI6YGLk kmmp Sy+UAgt#include "miscstatic void sha_mpint(SHA_State * s, Bignum b) { unsigned char *p; unsigned char lenbuf[4]; int len; len = (bignum_bitcount(b) + 8) / 8; PUT_32BIT(lenbuf, len); SHA_Bytes(s, lenbuf, 4); while (len-- > 0) { lenbuf[0] = bignum_byte(b, len); SHA_Bytes(s, lenbuf, 1); } memset(lenbuf, 0, sizeof(lenbuf)); } static void sha512_mpint(SHA512_State * s, Bignum b) { unsigned char *p; unsigned char lenbuf[4]; int len; len = (bignum_bitcount(b) + 8) / 8; PUT_32BIT(lenbuf, len); SHA512_Bytes(s, lenbuf, 4); while (len-- > 0) { lenbuf[0] = bignum_byte(b, len); SHA512_Bytes(s, lenbuf, 1); } memset(lenbuf, 0, sizeof(lenbuf)); }r = get160(&sig, &siglen); s = get160(&sig, &siglenu1 = modmul(sha, w, dss->q); /* * Step 3. u2 <- r * w mod q. */ u2 = modmul(r, w, dss->qyu2p = modpow(dss->y, u2, dss->p); gu1yu2p = modmul(gu1p, yu2p, dss->p); v = modmul(gu1yu2p, One, dss->qstruct dss_key *dss = (struct dss_key *) key; int xlen, bloblen; int i; unsigned char *blob, *p; SHA_State s; unsigned char digest[20]; xlen = (bignum_bitcount(dss->x) + 8) / 8; /* * mpint x, string[20] the SHA of p||q||g. Total 28 + xlen. * (two length fields and twenty bytes, 20+8=28). */ bloblen = 28 + xlen; blob = smalloc(bloblen); p = blob; PUT_32BIT(p, xlen); p += 4; for (i = xlen; i--;) *p++ = bignum_byte(dss->x, i); PUT_32BIT(p, 20); SHA_Init(&s); sha_mpint(&s, dss->p); sha_mpint(&s, dss->q); sha_mpint(&s, dss->g); SHA_Final(&s, digest); p += 4; for (i = 0; i < 20; i++) *p++ = digest[i]; assert(p == blob + bloblen); *len = bloblen; return blob;struct dss_key *dss; char *pb = (char *) priv_blob; char *hash; int hashlen; SHA_State s; unsigned char digest[20]; Bignum ytest; dss = dss_newkey((char *) pub_blob, pub_len); dss->x = getmp(&pb, &priv_len); getstring(&pb, &priv_len, &hash, &hashlen); /* * Verify details of the key. First check that the hash is * indeed a hash of p||q||g. */ if (hashlen != 20) { dss_freekey(dss); return NULL; } SHA_Init(&s); sha_mpint(&s, dss->p); sha_mpint(&s, dss->q); sha_mpint(&s, dss->g); SHA_Final(&s, digest); if (0 != memcmp(hash, digest, 20)) { dss_freekey(dss); return NULL; } /* * Now ensure g^x mod p really is y. */ ytest = modpow(dss->g, dss->x, dss->p); if (0 != bignum_cmp(ytest, dss->y)) { dss_freekey(dss); return NULL; } freebn(ytest); return dss; } static void *dss_openssh_createkey(unsigned char **blob, int *len) { char **b = (char **) blob; struct dss_key *dss; dss = smalloc(sizeof(struct dss_key)); if (!dss) return NULL; dss->p = getmp(b, len); dss->q = getmp(b, len); dss->g = getmp(b, len); dss->y = getmp(b, len); dss->x = getmp(b, len); if (!dss->p || !dss->q || !dss->g || !dss->y || !dss->x) { sfree(dss->p); sfree(dss->q); sfree(dss->g); sfree(dss->y); sfree(dss->x); sfree(dss); return NULL; } return dss; } static int dss_openssh_fmtkey(void *key, unsigned char *blob, int bloblen, i; bloblen = ssh2_bignum_length(dss->p) + ssh2_bignum_length(dss->q) + ssh2_bignum_length(dss->g) + ssh2_bignum_length(dss->y) + ssh2_bignum_length(dss->x); if (bloblen > len) return bloblen; bloblen = 0; #define ENC(x) \ PUT_32BIT(blob+bloblen, ssh2_bignum_length((x))-4); bloblen += 4; \ for (i = ssh2_bignum_length((x))-4; i-- ;) blob[bloblen++]=bignum_byte((x),i); ENC(dss->p); ENC(dss->q); ENC(dss->g); ENC(dss->y); ENC(dss->x); return bloblen; } unsigned char *dss_sign(void *key, char *data, int datalen, int *siglen) { /* * The basic DSS signing algorithm is: * * - invent a random k between 1 and q-1 (exclusive). * - Compute r = (g^k mod p) mod q. * - Compute s = k^-1 * (hash + x*r) mod q. * * This has the dangerous properties that: * * - if an attacker in possession of the public key _and_ the * signature (for example, the host you just authenticated * to) can guess your k, he can reverse the computation of s * and work out x = r^-1 * (s*k - hash) mod q. That is, he * can deduce the private half of your key, and masquerade * as you for as long as the key is still valid. * * - since r is a function purely of k and the public key, if * the attacker only has a _range of possibilities_ for k * it's easy for him to work through them all and check each * one against r; he'll never be unsure of whether he's got * the right one. * * - if you ever sign two different hashes with the same k, it * will be immediately obvious because the two signatures * will have the same r, and moreover an attacker in * possession of both signatures (and the public key of * course) can compute k = (hash1-hash2) * (s1-s2)^-1 mod q, * and from there deduce x as before. * * - the Bleichenbacher attack on DSA makes use of methods of * generating k which are significantly non-uniformly * distributed; in particular, generating a 160-bit random * number and reducing it mod q is right out. * * For this reason we must be pretty careful about how we * generate our k. Since this code runs on Windows, with no * particularly good system entropy sources, we can't trust our * RNG itself to produce properly unpredictable data. Hence, we * use a totally different scheme instead. * * What we do is to take a SHA-512 (_big_) hash of the private * key x, and then feed this into another SHA-512 hash that * also includes the message hash being signed. That is: * * proto_k = SHA512 ( SHA512(x) || SHA160(message) ) * * This number is 512 bits long, so reducing it mod q won't be * noticeably non-uniform. So * * k = proto_k mod q * * This has the interesting property that it's _deterministic_: * signing the same hash twice with the same key yields the * same signature. * * (It doesn't, _per se_, protect against reuse of k. Reuse of * k is left to chance; all it does is prevent _excessively * high_ chances of reuse of k due to entropy problems.) * * Thanks to Colin Plumb for the general idea of using x to * ensure k is hard to guess, and to the Cambridge University * Computer Security Group for helping to argue out all the * fine details. */ struct dss_key *dss = (struct dss_key *) key; SHA512_State ss; unsigned char digest[20], digest512[64]; Bignum proto_k, k, gkp, hash, kinv, hxr, r, s; unsigned char *bytes; int nbytes, i; SHA_Simple(data, datalen, digest); /* * Hash some identifying text plus x. */ SHA512_Init(&ss); SHA512_Bytes(&ss, "DSA deterministic k generator", 30); sha512_mpint(&ss, dss->x); SHA512_Final(&ss, digest512); /* * Now hash that digest plus the message hash. */ SHA512_Init(&ss); SHA512_Bytes(&ss, digest512, sizeof(digest512)); SHA512_Bytes(&ss, digest, sizeof(digest)); SHA512_Final(&ss, digest512); memset(&ss, 0, sizeof(ss)); /* * Now convert the result into a bignum, and reduce it mod q. */ proto_k = bignum_from_bytes(digest512, 64); k = bigmod(proto_k, dss->q); freebn(proto_k); memset(digest512, 0, sizeof(digest512)); /* * Now we have k, so just go ahead and compute the signature. */ gkp = modpow(dss->g, k, dss->p); /* g^k mod p */ r = bigmod(gkp, dss->q); /* r = (g^k mod p) mod q */ freebn(gkp); hash = bignum_from_bytes(digest, 20); kinv = modinv(k, dss->q); /* k^-1 mod q */ hxr = bigmuladd(dss->x, r, hash); /* hash + x*r */ s = modmul(kinv, hxr, dss->q); /* s = k^-1 * (hash + x*r) mod q */ freebn(hxr); freebn(kinv); freebn(hash); /* * Signature blob is * * string "ssh-dss" * string two 20-byte numbers r and s, end to end * * i.e. 4+7 + 4+40 bytes. */ nbytes = 4 + 7 + 4 + 40; bytes = smalloc(nbytes); PUT_32BIT(bytes, 7); memcpy(bytes + 4, "ssh-dss", 7); PUT_32BIT(bytes + 4 + 7, 40); for (i = 0; i < 20; i++) { bytes[4 + 7 + 4 + i] = bignum_byte(r, 19 - i); bytes[4 + 7 + 4 + 20 + i] = bignum_byte(s, 19 - i); } freebn(r); freebn(s); *siglen = nbytes; return bytes; Node-path: putty/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 24fdfd4950ea308fde3cd257b41c7717 Text-delta-base-sha1: 501803678857484217a3d0ac2e81e9b09263579e Text-content-length: 1526 Text-content-md5: ca446668dabfc8ca0afe0832c5367a31 Text-content-sha1: d7400761d5889231830dac8acb1bed8ee5b84ba3 Content-length: 1565 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNKX%}v]n qhx(pX Ir`YeXwX{-IWt/* * Prime generation. */ #include can deal with various extra properties of * the prime: * * - to speed up use in RSA, we can arrange to select a prime with * the property (prime % modulus) != residue. * * - for use in DSA, we can arrange to select a prime which is one * more than a multiple of a dirty great bignum. In this case * `bits' gives the size of the factor by which we _multiply_ * that bignum, rather than the size of the whole number. */ Bignum primegen(int bits, int modulus, int residue, Bignum factor; unsigned long moduli[NPRIMES + 1]; unsigned long residues[NPRIMES + 1]; unsigned long multiplierPROGFN_PROGRESS Alternatively, if `factor' is nonzero, generate a k-bit * random number with the top bit set and the bottom bit clear, * multiply it by `factor', and add one(i != 0 || !factor) ? 1 : 0 if (factor) { Bignum tmp = p; p = bigmul(tmp, factor); freebn(tmp); assert(bignum_bit(p, 0) == 0); bignum_set_bit(p, 0, 1either 2 or 2*factor to it * if (factor) multipliers[i] = bignum_mod_short(factor, primes[i]); else multipliers[i] = 1 * multipliers[i]> 65536) { freebn(p); goto STARTOVER; } continue; } break; } q = p; if (factor) { Bignum tmp; tmp = bignum_from_long(delta); p = bigmuladd(tmp, factor, q); freebn(tmp); } else { p = bignum_add_long(q, delta); }PROGFN_PROGRESS Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 00dacb3b239c6258d34e1113759502ea Text-delta-base-sha1: 7990bc2d9ec1106e4ee5a826205ee4770a6fec73 Text-content-length: 3784 Text-content-md5: 4f03b605479f15aef2266e9475f2ac5c Text-content-sha1: 3b282d2641eb009b22459988f61f4c8b5c2e04d1 Content-length: 3824 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN4, }n~mm&xEUS)z|!P;KlA;L|gLfl|EzVdq{y[=Uv&o|>NU~aVz`T). * * The next line says "Comment: " plus the comment string. * * string "ssh-rsa" * mpint exponent * mpint modulus * * And for "ssh-dss", it will be composed of * * mpint x (the private key parameter) * string hash (20-byte hash of mpints p || q || g) * * Finally, there is a line saying _either_ * * - "Private-Hash: " plus a hex representation of a SHA-1 hash of * the plaintext version of the private part, including the * final padding. * * or * * - "Private-MAC: " plus a hex representation of a HMAC-SHA-1 of * the plaintext version of the private part, including the * final padding. * * The key to the MAC is itself a SHA-1 hash of: * * data "putty-private-key-file-mac-key" * data passphrase * * Encrypted keys should have a MAC, whereas unencrypted ones must * have a hash. * * uint32 sequence-number * data passphrase * * where the sequence-number increases from zero. As many of these * hashes are used as necessary. * * With RSA, this is easy: verify that n = p*q, and also verify * that e*d == 1 modulo (p-1)(q-1). With DSA, we need to store * extra data in the private section other than just x, namely a * hash of p||q||g. (It's then easy to verify that y is equal to * g^x mod p.)mac, is_mac; int passlen = passphrase ? strlen(passphrase) : 0mac*/ if (!strcmp(b, "ssh-rsa")) alg = &ssh_rsa; else if (!strcmp(b, "ssh-dss")) alg = &ssh_dssMAC or Private-Hash header line. */ if (!read_header(fp, header)) goto error; if (0 == strcmp(header, "Private-MAC")) { if ((mac = read_body(fp)) == NULL) goto error; is_mac = 1; } else if (0 == strcmp(header, "Private-Hash")) { if ((mac = read_body(fp)) == NULL) goto error; is_mac = 0; } else if (!passphrase) goto error; if (private_blob_len % cipherblk) goto errormac[41]; unsigned char binary[20]; if (is_mac) { SHA_State s; unsigned char mackey[20]; char header[] = "putty-private-key-file-mac-key"; if (!passphrase) /* can't have MAC in unencrypted key */ goto error; SHA_Init(&s); SHA_Bytes(&s, header, sizeof(header)-1); SHA_Bytes(&s, passphrase, passlen); SHA_Final(&s, mackey); hmac_sha1_simple(mackey, 20, private_blob, private_blob_len, binary); memset(mackey, 0, sizeof(mackey)); memset(&s, 0, sizeof(s)); } else { SHA_Simple(private_blob, private_blob_len, binary); } for (i = 0; i < 20; i++) sprintf(realmac + 2 * i, "%02x", binary[i]); if (strcmp(mac, realmac)) { /* An incorrect MACmacmac) sfree(macif (!strcmp(b, "ssh-dss")) alg = &ssh_dss, is_mac; char *cipherstr; unsigned char priv_macmac); assert(priv_encrypted_len - priv_blob_len < 20); memcpy(priv_blob_encrypted + priv_blob_len, priv_mac, priv_encrypted_len - priv_blob_len); /* Now create the private MAC. */ if (passphrase) { SHA_State s; unsigned char mackey[20]; char header[] = "putty-private-key-file-mac-key"; passlen = strlen(passphrase); SHA_Init(&s); SHA_Bytes(&s, header, sizeof(header)-1); SHA_Bytes(&s, passphrase, passlen); SHA_Final(&s, mackey); hmac_sha1_simple(mackey, 20, priv_blob_encrypted, priv_encrypted_len, priv_mac); is_mac = 1; memset(mackey, 0, sizeof(mackey)); memset(&s, 0, sizeof(s)); } else { SHA_Simple(priv_blob_encrypted, priv_encrypted_len, priv_mac); is_mac = 0; } memset(key, 0, sizeof(key)); memset(&s, 0, sizeof(s)if (is_mac) fprintf(fp, "Private-MAC: "); else mac Node-path: putty/sshrsag.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: faa477e4f0dd2287ab953db4c08693ff Text-delta-base-sha1: 7c56d5a1e8071e0c4d94f2f27625d6a388320141 Text-content-length: 655 Text-content-md5: e8bf46506f5748777287b4c969f21528 Text-content-sha1: a7c9e29daf2040d8ad3f9bcffba7450b1768c5fc Content-length: 694 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNV*2QkL|_r2 )L5sd 5w@a`vPROGFN_PHASE_EXTENT, 1, 0x10000); pfn(pfnparam, PROGFN_EXP_PHASE, 1, -0x1D57C4 / (bits / 2)); pfn(pfnparam, PROGFN_PHASE_EXTENT, 2, 0x10000); pfn(pfnparam, PROGFN_EXP_PHASE, 2, -0x1D57C4 / (bits - bits / 2)); pfn(pfnparam, PROGFN_PHASE_EXTENT, 3, 0x4000); pfn(pfnparam, PROGFN_LIN_PHASE, 3, 5); pfn(pfnparam, PROGFN_READY, 0, 0longNULL, NULL, PROGFN_PROGRESS, 3, 1); key->modulus = bigmul(key->p, key->q); pfn(pfnparam, PROGFN_PROGRESSPROGFN_PROGRESSPROGFN_PROGRESS, 3, 4); key->iqmp = modinv(key->q, key->p); pfn(pfnparam, PROGFN_PROGRESS Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79d75b5eb1eafc9c867bfc8c6a3f995b Text-delta-base-sha1: e692c7aff01d42cfc0effd4a6835e3a5d667683e Text-content-length: 356 Text-content-md5: 05092292b58f12019963dd7460b06f30 Text-content-sha1: bfc5c80e6b35676d342b5534d4f46a163d04bf44 Content-length: 396 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNT LuLovoid hmac_sha1_simple(void *key, int keylen, void *data, int datalen, unsigned char *output) { SHA_State s1, s2; unsigned char intermediate[20]; sha1_key(&s1, &s2, key, keylen); SHA_Bytes(&s1, data, datalen); SHA_Final(&s1, intermediate); SHA_Bytes(&s2, intermediate, 20); SHA_Final(&s2, output Revision-number: 1285 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2001-09-22T21:00:16.000000Z K 7 svn:log V 58 Add extra explanatory comment about the DSA k generation. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 27e99b052d3f465a55e227bcc1787b2e Text-delta-base-sha1: f1ad460cc00fc36da5a88fcf337de4bf942d59cd Text-content-length: 534 Text-content-md5: e2faa4c9c1769985a5048acc5f20a3d6 Text-content-sha1: 5e6a965a995620dff9b60592777809c5ec709422 Content-length: 574 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNzI ||G3Despite this determinism, it's still not predictable to an * attacker, because in order to repeat the SHA-512 * construction that created it, the attacker would have to * know the private key value x - and by assumption he doesn't, * because if he knew that he wouldn't be attacking k! * * (This trick doesn't, _per se_, protect against reuse of k. * Reuse of k is left to chance; all it does is prevent * _excessively high_ chances of reuse of k due to entropy * Revision-number: 1286 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2001-09-22T21:00:53.000000Z K 7 svn:log V 64 Arrgh, there's always one. Actually check in the extra file :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdssg.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4646 Text-content-md5: 7aa4a54ee538be24967d712ec73cd246 Text-content-sha1: 846f7c2f16641888d67ba9ae28fe155b9990e048 Content-length: 4762 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * DSS key generation. */ #include "misc.h" #include "ssh.h" int dsa_generate(struct dss_key *key, int bits, progfn_t pfn, void *pfnparam) { Bignum qm1, power, g, h, tmp; int progress; /* * Set up the phase limits for the progress report. We do this * by passing minus the phase number. * * For prime generation: our initial filter finds things * coprime to everything below 2^16. Computing the product of * (p-1)/p for all prime p below 2^16 gives about 20.33; so * among B-bit integers, one in every 20.33 will get through * the initial filter to be a candidate prime. * * Meanwhile, we are searching for primes in the region of 2^B; * since pi(x) ~ x/log(x), when x is in the region of 2^B, the * prime density will be d/dx pi(x) ~ 1/log(B), i.e. about * 1/0.6931B. So the chance of any given candidate being prime * is 20.33/0.6931B, which is roughly 29.34 divided by B. * * So now we have this probability P, we're looking at an * exponential distribution with parameter P: we will manage in * one attempt with probability P, in two with probability * P(1-P), in three with probability P(1-P)^2, etc. The * probability that we have still not managed to find a prime * after N attempts is (1-P)^N. * * We therefore inform the progress indicator of the number B * (29.34/B), so that it knows how much to increment by each * time. We do this in 16-bit fixed point, so 29.34 becomes * 0x1D.57C4. */ pfn(pfnparam, PROGFN_PHASE_EXTENT, 1, 0x2800); pfn(pfnparam, PROGFN_EXP_PHASE, 1, -0x1D57C4 / 160); pfn(pfnparam, PROGFN_PHASE_EXTENT, 2, 0x40 * bits); pfn(pfnparam, PROGFN_EXP_PHASE, 2, -0x1D57C4 / bits); /* * In phase three we are finding an order-q element of the * multiplicative group of p, by finding an element whose order * is _divisible_ by q and raising it to the power of (p-1)/q. * _Most_ elements will have order divisible by q, since for a * start phi(p) of them will be primitive roots. So * realistically we don't need to set this much below 1 (64K). * Still, we'll set it to 1/2 (32K) to be on the safe side. */ pfn(pfnparam, PROGFN_PHASE_EXTENT, 3, 0x2000); pfn(pfnparam, PROGFN_EXP_PHASE, 3, -32768); /* * In phase four we are finding an element x between 1 and q-1 * (exclusive), by inventing 160 random bits and hoping they * come out to a plausible number; so assuming q is uniformly * distributed between 2^159 and 2^160, the chance of any given * attempt succeeding is somewhere between 0.5 and 1. Lacking * the energy to arrange to be able to specify this probability * _after_ generating q, we'll just set it to 0.75. */ pfn(pfnparam, PROGFN_PHASE_EXTENT, 4, 0x2000); pfn(pfnparam, PROGFN_EXP_PHASE, 4, -49152); pfn(pfnparam, PROGFN_READY, 0, 0); /* * Generate q: a prime of length 160. */ key->q = primegen(160, 2, 2, NULL, 1, pfn, pfnparam); /* * Now generate p: a prime of length `bits', such that p-1 is * divisible by q. */ key->p = primegen(bits-160, 2, 2, key->q, 2, pfn, pfnparam); /* * Next we need g. Raise 2 to the power (p-1)/q modulo p, and * if that comes out to one then try 3, then 4 and so on. As * soon as we hit a non-unit (and non-zero!) one, that'll do * for g. */ power = bigdiv(key->p, key->q); /* this is floor(p/q) == (p-1)/q */ h = bignum_from_long(1); progress = 0; while (1) { pfn(pfnparam, PROGFN_PROGRESS, 3, ++progress); g = modpow(h, power, key->p); if (bignum_cmp(g, One) > 0) break; /* got one */ tmp = h; h = bignum_add_long(h, 1); freebn(tmp); } key->g = g; freebn(h); /* * Now we're nearly done. All we need now is our private key x, * which should be a number between 1 and q-1 exclusive, and * our public key y = g^x mod p. */ qm1 = copybn(key->q); decbn(qm1); progress = 0; while (1) { int i, v, byte, bitsleft; Bignum x; pfn(pfnparam, PROGFN_PROGRESS, 4, ++progress); x = bn_power_2(159); byte = 0; bitsleft = 0; for (i = 0; i < 160; i++) { if (bitsleft <= 0) bitsleft = 8, byte = random_byte(); v = byte & 1; byte >>= 1; bitsleft--; bignum_set_bit(x, i, v); } if (bignum_cmp(x, One) <= 0 || bignum_cmp(x, qm1) >= 0) { freebn(x); continue; } else { key->x = x; break; } } freebn(qm1); key->y = modpow(key->g, key->x, key->p); return 1; } Revision-number: 1287 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 32 Oops - another missing file :-/ K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-23T11:57:10.000000Z PROPS-END Node-path: putty/sshsh512.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 12051 Text-content-md5: 6c8dbe2f75c4feb75a791440fa2dc7a6 Text-content-sha1: 885e695608a96805814fc322f80dcced869cea5c Content-length: 12167 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * SHA-512 algorithm as described at * * http://csrc.nist.gov/cryptval/shs.html */ #include "ssh.h" #define BLKSIZE 128 typedef unsigned int uint32; /* * Arithmetic implementations. Note that AND, XOR and NOT can * overlap destination with one source, but the others can't. */ #define add(r,x,y) ( r.lo = y.lo + x.lo, \ r.hi = y.hi + x.hi + (r.lo < y.lo) ) #define rorB(r,x,y) ( r.lo = (x.hi >> ((y)-32)) | (x.lo << (64-(y))), \ r.hi = (x.lo >> ((y)-32)) | (x.hi << (64-(y))) ) #define rorL(r,x,y) ( r.lo = (x.lo >> (y)) | (x.hi << (32-(y))), \ r.hi = (x.hi >> (y)) | (x.lo << (32-(y))) ) #define shrB(r,x,y) ( r.lo = x.hi >> ((y)-32), r.hi = 0 ) #define shrL(r,x,y) ( r.lo = (x.lo >> (y)) | (x.hi << (32-(y))), \ r.hi = x.hi >> (y) ) #define and(r,x,y) ( r.lo = x.lo & y.lo, r.hi = x.hi & y.hi ) #define xor(r,x,y) ( r.lo = x.lo ^ y.lo, r.hi = x.hi ^ y.hi ) #define not(r,x) ( r.lo = ~x.lo, r.hi = ~x.hi ) #define INIT(h,l) { h, l } #define BUILD(r,h,l) ( r.hi = h, r.lo = l ) #define EXTRACT(h,l,r) ( h = r.hi, l = r.lo ) /* ---------------------------------------------------------------------- * Core SHA512 algorithm: processes 16-doubleword blocks into a * message digest. */ #define Ch(r,t,x,y,z) ( not(t,x), and(r,t,z), and(t,x,y), xor(r,r,t) ) #define Maj(r,t,x,y,z) ( and(r,x,y), and(t,x,z), xor(r,r,t), \ and(t,y,z), xor(r,r,t) ) #define bigsigma0(r,t,x) ( rorL(r,x,28), rorB(t,x,34), xor(r,r,t), \ rorB(t,x,39), xor(r,r,t) ) #define bigsigma1(r,t,x) ( rorL(r,x,14), rorL(t,x,18), xor(r,r,t), \ rorB(t,x,41), xor(r,r,t) ) #define smallsigma0(r,t,x) ( rorL(r,x,1), rorL(t,x,8), xor(r,r,t), \ shrL(t,x,7), xor(r,r,t) ) #define smallsigma1(r,t,x) ( rorL(r,x,19), rorB(t,x,61), xor(r,r,t), \ shrL(t,x,6), xor(r,r,t) ) void SHA512_Core_Init(SHA512_State *s) { static const uint64 iv[] = { INIT(0x6a09e667, 0xf3bcc908), INIT(0xbb67ae85, 0x84caa73b), INIT(0x3c6ef372, 0xfe94f82b), INIT(0xa54ff53a, 0x5f1d36f1), INIT(0x510e527f, 0xade682d1), INIT(0x9b05688c, 0x2b3e6c1f), INIT(0x1f83d9ab, 0xfb41bd6b), INIT(0x5be0cd19, 0x137e2179), }; int i; for (i = 0; i < 8; i++) s->h[i] = iv[i]; } void SHA512_Block(SHA512_State *s, uint64 *block) { uint64 w[80]; uint64 a,b,c,d,e,f,g,h; static const uint64 k[] = { INIT(0x428a2f98, 0xd728ae22), INIT(0x71374491, 0x23ef65cd), INIT(0xb5c0fbcf, 0xec4d3b2f), INIT(0xe9b5dba5, 0x8189dbbc), INIT(0x3956c25b, 0xf348b538), INIT(0x59f111f1, 0xb605d019), INIT(0x923f82a4, 0xaf194f9b), INIT(0xab1c5ed5, 0xda6d8118), INIT(0xd807aa98, 0xa3030242), INIT(0x12835b01, 0x45706fbe), INIT(0x243185be, 0x4ee4b28c), INIT(0x550c7dc3, 0xd5ffb4e2), INIT(0x72be5d74, 0xf27b896f), INIT(0x80deb1fe, 0x3b1696b1), INIT(0x9bdc06a7, 0x25c71235), INIT(0xc19bf174, 0xcf692694), INIT(0xe49b69c1, 0x9ef14ad2), INIT(0xefbe4786, 0x384f25e3), INIT(0x0fc19dc6, 0x8b8cd5b5), INIT(0x240ca1cc, 0x77ac9c65), INIT(0x2de92c6f, 0x592b0275), INIT(0x4a7484aa, 0x6ea6e483), INIT(0x5cb0a9dc, 0xbd41fbd4), INIT(0x76f988da, 0x831153b5), INIT(0x983e5152, 0xee66dfab), INIT(0xa831c66d, 0x2db43210), INIT(0xb00327c8, 0x98fb213f), INIT(0xbf597fc7, 0xbeef0ee4), INIT(0xc6e00bf3, 0x3da88fc2), INIT(0xd5a79147, 0x930aa725), INIT(0x06ca6351, 0xe003826f), INIT(0x14292967, 0x0a0e6e70), INIT(0x27b70a85, 0x46d22ffc), INIT(0x2e1b2138, 0x5c26c926), INIT(0x4d2c6dfc, 0x5ac42aed), INIT(0x53380d13, 0x9d95b3df), INIT(0x650a7354, 0x8baf63de), INIT(0x766a0abb, 0x3c77b2a8), INIT(0x81c2c92e, 0x47edaee6), INIT(0x92722c85, 0x1482353b), INIT(0xa2bfe8a1, 0x4cf10364), INIT(0xa81a664b, 0xbc423001), INIT(0xc24b8b70, 0xd0f89791), INIT(0xc76c51a3, 0x0654be30), INIT(0xd192e819, 0xd6ef5218), INIT(0xd6990624, 0x5565a910), INIT(0xf40e3585, 0x5771202a), INIT(0x106aa070, 0x32bbd1b8), INIT(0x19a4c116, 0xb8d2d0c8), INIT(0x1e376c08, 0x5141ab53), INIT(0x2748774c, 0xdf8eeb99), INIT(0x34b0bcb5, 0xe19b48a8), INIT(0x391c0cb3, 0xc5c95a63), INIT(0x4ed8aa4a, 0xe3418acb), INIT(0x5b9cca4f, 0x7763e373), INIT(0x682e6ff3, 0xd6b2b8a3), INIT(0x748f82ee, 0x5defb2fc), INIT(0x78a5636f, 0x43172f60), INIT(0x84c87814, 0xa1f0ab72), INIT(0x8cc70208, 0x1a6439ec), INIT(0x90befffa, 0x23631e28), INIT(0xa4506ceb, 0xde82bde9), INIT(0xbef9a3f7, 0xb2c67915), INIT(0xc67178f2, 0xe372532b), INIT(0xca273ece, 0xea26619c), INIT(0xd186b8c7, 0x21c0c207), INIT(0xeada7dd6, 0xcde0eb1e), INIT(0xf57d4f7f, 0xee6ed178), INIT(0x06f067aa, 0x72176fba), INIT(0x0a637dc5, 0xa2c898a6), INIT(0x113f9804, 0xbef90dae), INIT(0x1b710b35, 0x131c471b), INIT(0x28db77f5, 0x23047d84), INIT(0x32caab7b, 0x40c72493), INIT(0x3c9ebe0a, 0x15c9bebc), INIT(0x431d67c4, 0x9c100d4c), INIT(0x4cc5d4be, 0xcb3e42b6), INIT(0x597f299c, 0xfc657e2a), INIT(0x5fcb6fab, 0x3ad6faec), INIT(0x6c44198c, 0x4a475817), }; int t; for (t = 0; t < 16; t++) w[t] = block[t]; for (t = 16; t < 80; t++) { uint64 p, q, r, tmp; smallsigma1(p, tmp, w[t-2]); smallsigma0(q, tmp, w[t-15]); add(r, p, q); add(p, r, w[t-7]); add(w[t], p, w[t-16]); } a = s->h[0]; b = s->h[1]; c = s->h[2]; d = s->h[3]; e = s->h[4]; f = s->h[5]; g = s->h[6]; h = s->h[7]; for (t = 0; t < 80; t+=8) { uint64 tmp, p, q, r; #define ROUND(j,a,b,c,d,e,f,g,h) \ bigsigma1(p, tmp, e); \ Ch(q, tmp, e, f, g); \ add(r, p, q); \ add(p, r, k[j]) ; \ add(q, p, w[j]); \ add(r, q, h); \ bigsigma0(p, tmp, a); \ Maj(tmp, q, a, b, c); \ add(q, tmp, p); \ add(p, r, d); \ d = p; \ add(h, q, r); ROUND(t+0, a,b,c,d,e,f,g,h); ROUND(t+1, h,a,b,c,d,e,f,g); ROUND(t+2, g,h,a,b,c,d,e,f); ROUND(t+3, f,g,h,a,b,c,d,e); ROUND(t+4, e,f,g,h,a,b,c,d); ROUND(t+5, d,e,f,g,h,a,b,c); ROUND(t+6, c,d,e,f,g,h,a,b); ROUND(t+7, b,c,d,e,f,g,h,a); } { uint64 tmp; #define UPDATE(state, local) ( tmp = state, add(state, tmp, local) ) UPDATE(s->h[0], a); UPDATE(s->h[1], b); UPDATE(s->h[2], c); UPDATE(s->h[3], d); UPDATE(s->h[4], e); UPDATE(s->h[5], f); UPDATE(s->h[6], g); UPDATE(s->h[7], h); } } /* ---------------------------------------------------------------------- * Outer SHA512 algorithm: take an arbitrary length byte string, * convert it into 16-doubleword blocks with the prescribed padding * at the end, and pass those blocks to the core SHA512 algorithm. */ void SHA512_Init(SHA512_State *s) { int i; SHA512_Core_Init(s); s->blkused = 0; for (i = 0; i < 4; i++) s->len[i] = 0; } void SHA512_Bytes(SHA512_State *s, const void *p, int len) { unsigned char *q = (unsigned char *)p; uint64 wordblock[16]; uint32 lenw = len; int i; /* * Update the length field. */ for (i = 0; i < 4; i++) { s->len[i] += lenw; lenw = (s->len[i] < lenw); } if (s->blkused && s->blkused+len < BLKSIZE) { /* * Trivial case: just add to the block. */ memcpy(s->block + s->blkused, q, len); s->blkused += len; } else { /* * We must complete and process at least one block. */ while (s->blkused + len >= BLKSIZE) { memcpy(s->block + s->blkused, q, BLKSIZE - s->blkused); q += BLKSIZE - s->blkused; len -= BLKSIZE - s->blkused; /* Now process the block. Gather bytes big-endian into words */ for (i = 0; i < 16; i++) { uint32 h, l; h = ( ((uint32)s->block[i*8+0]) << 24 ) | ( ((uint32)s->block[i*8+1]) << 16 ) | ( ((uint32)s->block[i*8+2]) << 8 ) | ( ((uint32)s->block[i*8+3]) << 0 ); l = ( ((uint32)s->block[i*8+4]) << 24 ) | ( ((uint32)s->block[i*8+5]) << 16 ) | ( ((uint32)s->block[i*8+6]) << 8 ) | ( ((uint32)s->block[i*8+7]) << 0 ); BUILD(wordblock[i], h, l); } SHA512_Block(s, wordblock); s->blkused = 0; } memcpy(s->block, q, len); s->blkused = len; } } void SHA512_Final(SHA512_State *s, unsigned char *digest) { int i; int pad; unsigned char c[BLKSIZE]; uint32 len[4]; if (s->blkused >= BLKSIZE-16) pad = (BLKSIZE-16) + BLKSIZE - s->blkused; else pad = (BLKSIZE-16) - s->blkused; for (i = 4; i-- ;) { uint32 lenhi = s->len[i]; uint32 lenlo = i > 0 ? s->len[i-1] : 0; len[i] = (lenhi << 3) | (lenlo >> (32-3)); } memset(c, 0, pad); c[0] = 0x80; SHA512_Bytes(s, &c, pad); for (i = 0; i < 4; i++) { c[i*4+0] = (len[3-i] >> 24) & 0xFF; c[i*4+1] = (len[3-i] >> 16) & 0xFF; c[i*4+2] = (len[3-i] >> 8) & 0xFF; c[i*4+3] = (len[3-i] >> 0) & 0xFF; } SHA512_Bytes(s, &c, 16); for (i = 0; i < 8; i++) { uint32 h, l; EXTRACT(h, l, s->h[i]); digest[i*8+0] = (h >> 24) & 0xFF; digest[i*8+1] = (h >> 16) & 0xFF; digest[i*8+2] = (h >> 8) & 0xFF; digest[i*8+3] = (h >> 0) & 0xFF; digest[i*8+4] = (l >> 24) & 0xFF; digest[i*8+5] = (l >> 16) & 0xFF; digest[i*8+6] = (l >> 8) & 0xFF; digest[i*8+7] = (l >> 0) & 0xFF; } } void SHA512_Simple(const void *p, int len, unsigned char *output) { SHA512_State s; SHA512_Init(&s); SHA512_Bytes(&s, p, len); SHA512_Final(&s, output); } #ifdef TEST #include #include #include int main(void) { unsigned char digest[64]; int i, j, errors; struct { const char *teststring; unsigned char digest512[64]; } tests[] = { { "abc", { 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2, 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd, 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f, } }, { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", { 0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda, 0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f, 0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1, 0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18, 0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4, 0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a, 0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54, 0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09, } }, { NULL, { 0xe7, 0x18, 0x48, 0x3d, 0x0c, 0xe7, 0x69, 0x64, 0x4e, 0x2e, 0x42, 0xc7, 0xbc, 0x15, 0xb4, 0x63, 0x8e, 0x1f, 0x98, 0xb1, 0x3b, 0x20, 0x44, 0x28, 0x56, 0x32, 0xa8, 0x03, 0xaf, 0xa9, 0x73, 0xeb, 0xde, 0x0f, 0xf2, 0x44, 0x87, 0x7e, 0xa6, 0x0a, 0x4c, 0xb0, 0x43, 0x2c, 0xe5, 0x77, 0xc3, 0x1b, 0xeb, 0x00, 0x9c, 0x5c, 0x2c, 0x49, 0xaa, 0x2e, 0x4e, 0xad, 0xb2, 0x17, 0xad, 0x8c, 0xc0, 0x9b, } }, }; errors = 0; for (i = 0; i < sizeof(tests) / sizeof(*tests); i++) { if (tests[i].teststring) { SHA512_Simple(tests[i].teststring, strlen(tests[i].teststring), digest); } else { SHA512_State s; int n; SHA512_Init(&s); for (n = 0; n < 1000000 / 40; n++) SHA512_Bytes(&s, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 40); SHA512_Final(&s, digest); } for (j = 0; j < 64; j++) { if (digest[j] != tests[i].digest512[j]) { fprintf(stderr, "\"%s\" digest512 byte %d should be 0x%02x, is 0x%02x\n", tests[i].teststring, j, tests[i].digest512[j], digest[j]); errors++; } } } printf("%d errors\n", errors); return 0; } #endif Revision-number: 1288 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:01.400083Z PROPS-END Revision-number: 1289 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2001-09-23T16:45:36.000000Z K 7 svn:log V 65 Destroy DOS line endings and unnecessary redefinition of uint32. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshsh512.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6c8dbe2f75c4feb75a791440fa2dc7a6 Text-delta-base-sha1: 885e695608a96805814fc322f80dcced869cea5c Text-content-length: 11528 Text-content-md5: 0f1e1b3e51a43798913a6558e49ea423 Text-content-sha1: b407f5ac7600c63b192bdcb0e7a32b09e8a8f4c2 Content-length: 11567 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNkJaJy/* * SHA-512 algorithm as described at * * http://csrc.nist.gov/cryptval/shs.html */ #include "ssh.h" #define BLKSIZE 128 /* * Arithmetic implementations. Note that AND, XOR and NOT can * overlap destination with one source, but the others can't. */ #define add(r,x,y) ( r.lo = y.lo + x.lo, \ r.hi = y.hi + x.hi + (r.lo < y.lo) ) #define rorB(r,x,y) ( r.lo = (x.hi >> ((y)-32)) | (x.lo << (64-(y))), \ r.hi = (x.lo >> ((y)-32)) | (x.hi << (64-(y))) ) #define rorL(r,x,y) ( r.lo = (x.lo >> (y)) | (x.hi << (32-(y))), \ r.hi = (x.hi >> (y)) | (x.lo << (32-(y))) ) #define shrB(r,x,y) ( r.lo = x.hi >> ((y)-32), r.hi = 0 ) #define shrL(r,x,y) ( r.lo = (x.lo >> (y)) | (x.hi << (32-(y))), \ r.hi = x.hi >> (y) ) #define and(r,x,y) ( r.lo = x.lo & y.lo, r.hi = x.hi & y.hi ) #define xor(r,x,y) ( r.lo = x.lo ^ y.lo, r.hi = x.hi ^ y.hi ) #define not(r,x) ( r.lo = ~x.lo, r.hi = ~x.hi ) #define INIT(h,l) { h, l } #define BUILD(r,h,l) ( r.hi = h, r.lo = l ) #define EXTRACT(h,l,r) ( h = r.hi, l = r.lo ) * Core SHA512 algorithm: processes 16-doubleword blocks into a * message digest. */ #define Ch(r,t,x,y,z) ( not(t,x), and(r,t,z), and(t,x,y), xor(r,r,t) ) #define Maj(r,t,x,y,z) ( and(r,x,y), and(t,x,z), xor(r,r,t), \ and(t,y,z), xor(r,r,t) ) #define bigsigma0(r,t,x) ( rorL(r,x,28), rorB(t,x,34), xor(r,r,t), \ rorB(t,x,39), xor(r,r,t) ) #define bigsigma1(r,t,x) ( rorL(r,x,14), rorL(t,x,18), xor(r,r,t), \ rorB(t,x,41), xor(r,r,t) ) #define smallsigma0(r,t,x) ( rorL(r,x,1), rorL(t,x,8), xor(r,r,t), \ shrL(t,x,7), xor(r,r,t) ) #define smallsigma1(r,t,x) ( rorL(r,x,19), rorB(t,x,61), xor(r,r,t), \ shrL(t,x,6), xor(r,r,t) ) void SHA512_Core_Init(SHA512_State *s) { static const uint64 iv[] = { INIT(0x6a09e667, 0xf3bcc908), INIT(0xbb67ae85, 0x84caa73b), INIT(0x3c6ef372, 0xfe94f82b), INIT(0xa54ff53a, 0x5f1d36f1), INIT(0x510e527f, 0xade682d1), INIT(0x9b05688c, 0x2b3e6c1f), INIT(0x1f83d9ab, 0xfb41bd6b), INIT(0x5be0cd19, 0x137e2179), }; int i; for (i = 0; i < 8; i++) s->h[i] = iv[i]; } void SHA512_Block(SHA512_State *s, uint64 *block) { uint64 w[80]; uint64 a,b,c,d,e,f,g,h; static const uint64 k[] = { INIT(0x428a2f98, 0xd728ae22), INIT(0x71374491, 0x23ef65cd), INIT(0xb5c0fbcf, 0xec4d3b2f), INIT(0xe9b5dba5, 0x8189dbbc), INIT(0x3956c25b, 0xf348b538), INIT(0x59f111f1, 0xb605d019), INIT(0x923f82a4, 0xaf194f9b), INIT(0xab1c5ed5, 0xda6d8118), INIT(0xd807aa98, 0xa3030242), INIT(0x12835b01, 0x45706fbe), INIT(0x243185be, 0x4ee4b28c), INIT(0x550c7dc3, 0xd5ffb4e2), INIT(0x72be5d74, 0xf27b896f), INIT(0x80deb1fe, 0x3b1696b1), INIT(0x9bdc06a7, 0x25c71235), INIT(0xc19bf174, 0xcf692694), INIT(0xe49b69c1, 0x9ef14ad2), INIT(0xefbe4786, 0x384f25e3), INIT(0x0fc19dc6, 0x8b8cd5b5), INIT(0x240ca1cc, 0x77ac9c65), INIT(0x2de92c6f, 0x592b0275), INIT(0x4a7484aa, 0x6ea6e483), INIT(0x5cb0a9dc, 0xbd41fbd4), INIT(0x76f988da, 0x831153b5), INIT(0x983e5152, 0xee66dfab), INIT(0xa831c66d, 0x2db43210), INIT(0xb00327c8, 0x98fb213f), INIT(0xbf597fc7, 0xbeef0ee4), INIT(0xc6e00bf3, 0x3da88fc2), INIT(0xd5a79147, 0x930aa725), INIT(0x06ca6351, 0xe003826f), INIT(0x14292967, 0x0a0e6e70), INIT(0x27b70a85, 0x46d22ffc), INIT(0x2e1b2138, 0x5c26c926), INIT(0x4d2c6dfc, 0x5ac42aed), INIT(0x53380d13, 0x9d95b3df), INIT(0x650a7354, 0x8baf63de), INIT(0x766a0abb, 0x3c77b2a8), INIT(0x81c2c92e, 0x47edaee6), INIT(0x92722c85, 0x1482353b), INIT(0xa2bfe8a1, 0x4cf10364), INIT(0xa81a664b, 0xbc423001), INIT(0xc24b8b70, 0xd0f89791), INIT(0xc76c51a3, 0x0654be30), INIT(0xd192e819, 0xd6ef5218), INIT(0xd6990624, 0x5565a910), INIT(0xf40e3585, 0x5771202a), INIT(0x106aa070, 0x32bbd1b8), INIT(0x19a4c116, 0xb8d2d0c8), INIT(0x1e376c08, 0x5141ab53), INIT(0x2748774c, 0xdf8eeb99), INIT(0x34b0bcb5, 0xe19b48a8), INIT(0x391c0cb3, 0xc5c95a63), INIT(0x4ed8aa4a, 0xe3418acb), INIT(0x5b9cca4f, 0x7763e373), INIT(0x682e6ff3, 0xd6b2b8a3), INIT(0x748f82ee, 0x5defb2fc), INIT(0x78a5636f, 0x43172f60), INIT(0x84c87814, 0xa1f0ab72), INIT(0x8cc70208, 0x1a6439ec), INIT(0x90befffa, 0x23631e28), INIT(0xa4506ceb, 0xde82bde9), INIT(0xbef9a3f7, 0xb2c67915), INIT(0xc67178f2, 0xe372532b), INIT(0xca273ece, 0xea26619c), INIT(0xd186b8c7, 0x21c0c207), INIT(0xeada7dd6, 0xcde0eb1e), INIT(0xf57d4f7f, 0xee6ed178), INIT(0x06f067aa, 0x72176fba), INIT(0x0a637dc5, 0xa2c898a6), INIT(0x113f9804, 0xbef90dae), INIT(0x1b710b35, 0x131c471b), INIT(0x28db77f5, 0x23047d84), INIT(0x32caab7b, 0x40c72493), INIT(0x3c9ebe0a, 0x15c9bebc), INIT(0x431d67c4, 0x9c100d4c), INIT(0x4cc5d4be, 0xcb3e42b6), INIT(0x597f299c, 0xfc657e2a), INIT(0x5fcb6fab, 0x3ad6faec), INIT(0x6c44198c, 0x4a475817), }; int t; for (t = 0; t < 16; t++) w[t] = block[t]; for (t = 16; t < 80; t++) { uint64 p, q, r, tmp; smallsigma1(p, tmp, w[t-2]); smallsigma0(q, tmp, w[t-15]); add(r, p, q); add(p, r, w[t-7]); add(w[t], p, w[t-16]); } a = s->h[0]; b = s->h[1]; c = s->h[2]; d = s->h[3]; e = s->h[4]; f = s->h[5]; g = s->h[6]; h = s->h[7]; for (t = 0; t < 80; t+=8) { uint64 tmp, p, q, r; #define ROUND(j,a,b,c,d,e,f,g,h) \ bigsigma1(p, tmp, e); \ Ch(q, tmp, e, f, g); \ add(r, p, q); \ add(p, r, k[j]) ; \ add(q, p, w[j]); \ add(r, q, h); \ bigsigma0(p, tmp, a); \ Maj(tmp, q, a, b, c); \ add(q, tmp, p); \ add(p, r, d); \ d = p; \ add(h, q, r); ROUND(t+0, a,b,c,d,e,f,g,h); ROUND(t+1, h,a,b,c,d,e,f,g); ROUND(t+2, g,h,a,b,c,d,e,f); ROUND(t+3, f,g,h,a,b,c,d,e); ROUND(t+4, e,f,g,h,a,b,c,d); ROUND(t+5, d,e,f,g,h,a,b,c); ROUND(t+6, c,d,e,f,g,h,a,b); ROUND(t+7, b,c,d,e,f,g,h,a); } { uint64 tmp; #define UPDATE(state, local) ( tmp = state, add(state, tmp, local) ) UPDATE(s->h[0], a); UPDATE(s->h[1], b); UPDATE(s->h[2], c); UPDATE(s->h[3], d); UPDATE(s->h[4], e); UPDATE(s->h[5], f); UPDATE(s->h[6], g); UPDATE(s->h[7], h); } } * Outer SHA512 algorithm: take an arbitrary length byte string, * convert it into 16-doubleword blocks with the prescribed padding * at the end, and pass those blocks to the core SHA512 algorithm. */ void SHA512_Init(SHA512_State *s) { int i; SHA512_Core_Init(s); s->blkused = 0; for (i = 0; i < 4; i++) s->len[i] = 0; } void SHA512_Bytes(SHA512_State *s, const void *p, int len) { unsigned char *q = (unsigned char *)p; uint64 wordblock[16]; uint32 lenw = len; int i; /* * Update the length field. */ for (i = 0; i < 4; i++) { s->len[i] += lenw; lenw = (s->len[i] < lenw); } if (s->blkused && s->blkused+len < BLKSIZE) { /* * Trivial case: just add to the block. */ memcpy(s->block + s->blkused, q, len); s->blkused += len; } else { /* * We must complete and process at least one block. */ while (s->blkused + len >= BLKSIZE) { memcpy(s->block + s->blkused, q, BLKSIZE - s->blkused); q += BLKSIZE - s->blkused; len -= BLKSIZE - s->blkused; /* Now process the block. Gather bytes big-endian into words */ for (i = 0; i < 16; i++) { uint32 h, l; h = ( ((uint32)s->block[i*8+0]) << 24 ) | ( ((uint32)s->block[i*8+1]) << 16 ) | ( ((uint32)s->block[i*8+2]) << 8 ) | ( ((uint32)s->block[i*8+3]) << 0 ); l = ( ((uint32)s->block[i*8+4]) << 24 ) | ( ((uint32)s->block[i*8+5]) << 16 ) | ( ((uint32)s->block[i*8+6]) << 8 ) | ( ((uint32)s->block[i*8+7]) << 0 ); BUILD(wordblock[i], h, l); } SHA512_Block(s, wordblock); s->blkused = 0; } memcpy(s->block, q, len); s->blkused = len; } } void SHA512_Final(SHA512_State *s, unsigned char *digest) { int i; int pad; unsigned char c[BLKSIZE]; uint32 len[4]; if (s->blkused >= BLKSIZE-16) pad = (BLKSIZE-16) + BLKSIZE - s->blkused; else pad = (BLKSIZE-16) - s->blkused; for (i = 4; i-- ;) { uint32 lenhi = s->len[i]; uint32 lenlo = i > 0 ? s->len[i-1] : 0; len[i] = (lenhi << 3) | (lenlo >> (32-3)); } memset(c, 0, pad); c[0] = 0x80; SHA512_Bytes(s, &c, pad); for (i = 0; i < 4; i++) { c[i*4+0] = (len[3-i] >> 24) & 0xFF; c[i*4+1] = (len[3-i] >> 16) & 0xFF; c[i*4+2] = (len[3-i] >> 8) & 0xFF; c[i*4+3] = (len[3-i] >> 0) & 0xFF; } SHA512_Bytes(s, &c, 16); for (i = 0; i < 8; i++) { uint32 h, l; EXTRACT(h, l, s->h[i]); digest[i*8+0] = (h >> 24) & 0xFF; digest[i*8+1] = (h >> 16) & 0xFF; digest[i*8+2] = (h >> 8) & 0xFF; digest[i*8+3] = (h >> 0) & 0xFF; digest[i*8+4] = (l >> 24) & 0xFF; digest[i*8+5] = (l >> 16) & 0xFF; digest[i*8+6] = (l >> 8) & 0xFF; digest[i*8+7] = (l >> 0) & 0xFF; } } void SHA512_Simple(const void *p, int len, unsigned char *output) { SHA512_State s; SHA512_Init(&s); SHA512_Bytes(&s, p, len); SHA512_Final(&s, output); } #ifdef TEST #include #include #include int main(void) { unsigned char digest[64]; int i, j, errors; struct { const char *teststring; unsigned char digest512[64]; } tests[] = { { "abc", { 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2, 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd, 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f, } }, { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", { 0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda, 0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f, 0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1, 0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18, 0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4, 0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a, 0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54, 0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09, } }, { NULL, { 0xe7, 0x18, 0x48, 0x3d, 0x0c, 0xe7, 0x69, 0x64, 0x4e, 0x2e, 0x42, 0xc7, 0xbc, 0x15, 0xb4, 0x63, 0x8e, 0x1f, 0x98, 0xb1, 0x3b, 0x20, 0x44, 0x28, 0x56, 0x32, 0xa8, 0x03, 0xaf, 0xa9, 0x73, 0xeb, 0xde, 0x0f, 0xf2, 0x44, 0x87, 0x7e, 0xa6, 0x0a, 0x4c, 0xb0, 0x43, 0x2c, 0xe5, 0x77, 0xc3, 0x1b, 0xeb, 0x00, 0x9c, 0x5c, 0x2c, 0x49, 0xaa, 0x2e, 0x4e, 0xad, 0xb2, 0x17, 0xad, 0x8c, 0xc0, 0x9b, } }, }; errors = 0; for (i = 0; i < sizeof(tests) / sizeof(*tests); i++) { if (tests[i].teststring) { SHA512_Simple(tests[i].teststring, strlen(tests[i].teststring), digest); } else { SHA512_State s; int n; SHA512_Init(&s); for (n = 0; n < 1000000 / 40; n++) SHA512_Bytes(&s, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 40); SHA512_Final(&s, digest); } for (j = 0; j < 64; j++) { if (digest[j] != tests[i].digest512[j]) { fprintf(stderr, "\"%s\" digest512 byte %d should be 0x%02x, is 0x%02x\n", tests[i].teststring, j, tests[i].digest512[j], digest[j]); errors++; } } } printf("%d errors\n", errors); return 0; } #endif Revision-number: 1290 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:01.463310Z PROPS-END Revision-number: 1291 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:01.469984Z PROPS-END Revision-number: 1292 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:01.477053Z PROPS-END Revision-number: 1293 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:01.484176Z PROPS-END Revision-number: 1294 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:01.490835Z PROPS-END Revision-number: 1295 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2001-09-24T22:00:46.000000Z K 7 svn:log V 49 Restore Lars Gunnarsson's old link for iXplorer. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e04ef250c6c83afe35ffb0060ecc9aa9 Text-delta-base-sha1: af99aa2d61f0b087b4abd4e24437ee41906a3fa8 Text-content-length: 102 Text-content-md5: 48c22f813239bc302327f06312b29b11 Text-content-sha1: ae92f7f0d9746b1caf451a22e0f57116e0e31e9d Content-length: 142 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNt|U'3\versionid $Id: pscp.but,v 1.17 2001/09/24 22:00:46www.i-tree.org/}{www.i-tree.org}. Revision-number: 1296 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:01.604290Z PROPS-END Revision-number: 1297 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:01.611131Z PROPS-END Revision-number: 1298 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2001-09-25T19:59:14.000000Z K 7 svn:log V 36 Fix various fiddly little warnings. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4e377af18589800c13376cd47f998e7f Text-delta-base-sha1: 52abb0133ed8045def3a2de2f815834a2a2392f1 Text-content-length: 122 Text-content-md5: ae3b35d00310e17fc3d2b36daa024ebe Text-content-sha1: 64082b8b720821699c431d85e5125e4747f830ab Content-length: 161 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN! d4/p\versionid $Id: pubkey.but,v 1.6 2001/09/25 19:59:14 \b An RSA key for use with the SSH 2 protocol. Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 586e614a393075eedb5165d057b1733b Text-delta-base-sha1: 0e49789d2adae3a6125a2eccaf1e7fb7525dd363 Text-content-length: 463 Text-content-md5: a4bb2752fac3eaa5a11f78929ec27b71 Text-content-sha1: ae101861b7f67f22ce8310062407089b40d8d17d Content-length: 502 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNCC-aw`h`hf0eE{eb%;1, 10, 26, 206, 8 LTEXT "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas", 1002456, 10, 74, 206, 8 LTEXT "including without limitation the rights to use, copy, modify, merge,", 10078, 10, 90, 206, 8 LTEXT "and to permit persons to whom the Software is furnished to do so,", 100910, 10, 106, 206, 8 LTEXT "The above copyright notice and this permission notice shall be", 10112 Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 420fdf590f4ba0582f7da70cb4829631 Text-delta-base-sha1: 425c3aeacd8799ee571b69c9d6ce79b1395ba7cb Text-content-length: 530 Text-content-md5: 8c2213f7927558b307ba0f22f54cc4a7 Text-content-sha1: 85b58892587c378b591671b4237d097bd29e7fe1 Content-length: 569 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN55)]ai`qjf;f",b4d;z1, 10, 26, 206, 8 LTEXT "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas", 100245, 10, 66, 206, 8 LTEXT "files (the ""Software""), to deal in the Software without restriction,", 100678, 10, 90, 206, 8 LTEXT "and to permit persons to whom the Software is furnished to do so,", 1009, 10, 98, 206, 8 LTEXT "subject to the following conditions:", 10101, 10, 122, 206, 8 LTEXT "included in all copies or substantial portions of the Software.", 1012 Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a6a7935e74c8368ccd53a49f3e42976b Text-delta-base-sha1: 56c6da7efcb89e17b76a2f243ccfbf436219e734 Text-content-length: 105 Text-content-md5: 7f42466721c5db4cd4064bfb89cafcec Text-content-sha1: 85d2adbcafb8f1f70c4611910868690f6960fb83 Content-length: 145 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN[ OeOK(unsigned short)(n & 0xFFFF); ret[2] = (unsigned short)((n >> 16) & 0xFFFF) Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e2faa4c9c1769985a5048acc5f20a3d6 Text-delta-base-sha1: 5e6a965a995620dff9b60592777809c5ec709422 Text-content-length: 31 Text-content-md5: 0286dfa6293cfba966a90a2f83ce4ce8 Text-content-sha1: 61b91c395939060033cec79712ddaf77737f20a2 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNIdFzcz9 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 167226452a92f37992276518d0ccfd3b Text-delta-base-sha1: d777806489bb049a3f6b2c0beb0261afd87d2bb7 Text-content-length: 528 Text-content-md5: 4d71839009e088325b04561e170159a3 Text-content-sha1: b4aaa03593dcff52c3b4c8c4c68173785ae2dd43 Content-length: 568 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVN{{)[Na/`7hhfh,bzd;@1, 10, 26, 206, 8 LTEXT "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas", 1002456, 10, 74, 206, 8 LTEXT "including without limitation the rights to use, copy, modify, merge,", 10078, 10, 90, 206, 8 LTEXT "and to permit persons to whom the Software is furnished to do so,", 1009, 10, 98, 206, 8 LTEXT "subject to the following conditions:", 10101, 10, 122, 206, 8 LTEXT "included in all copies or substantial portions of the Software.", 1012 Revision-number: 1299 Prop-content-length: 219 Content-length: 219 K 7 svn:log V 118 John Sullivan's patch to recreate the Pageant systray icon if Explorer crashes and restarts while Pageant is running. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-25T20:05:06.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4aac4d29f8de9f6faac7ba78a5a39b8f Text-delta-base-sha1: 150816f894f76755d7a11b0e11c57f5d3f88d642 Text-content-length: 1491 Text-content-md5: 90d301190a1fe729e7817b8d63f09351 Text-content-sha1: e8d41ce8afa7bbc5ae842c9a785d987778c2d389 Content-length: 1531 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNnA %c'^w6uy/* Set up a system tray icon */ static BOOL AddTrayIcon(HWND hwnd) { BOOL res; NOTIFYICONDATA tnid; HICON hicon; #ifdef NIM_SETVERSION tnid.uVersion = 0; res = Shell_NotifyIcon(NIM_SETVERSION, &tnid); #endif tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = 1; /* unique within this systray use */ tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; tnid.uCallbackMessage = WM_SYSTRAY; tnid.hIcon = hicon = LoadIcon(instance, MAKEINTRESOURCE(201)); strcpy(tnid.szTip, "Pageant (PuTTY authentication agent)"); res = Shell_NotifyIcon(NIM_ADD, &tnid); if (hicon) DestroyIcon(hicon); return res static UINT msgTaskbarCreated = 0; switch (message) { case WM_CREATE: msgTaskbarCreated = RegisterWindowMessage(_T("TaskbarCreated")); break; default: if (message==msgTaskbarCreated) { // Explorer has been restarted, so the tray icon will have been lost AddTrayIcon(hwnd); } break; AddTrayIcon(hwnd); systray_menu = CreatePopupMenu(); /* accelerators used: vkxa */ AppendMenu(systray_menu, MF_ENABLED, IDM_VIEWKEYS, "&View Keys"); AppendMenu(systray_menu, MF_ENABLED, IDM_ADDKEY, "Add &Key"); AppendMenu(systray_menu, MF_ENABLED, IDM_ABOUT, "&About"); AppendMenu(systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit"); Revision-number: 1300 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2001-09-25T20:07:12.000000Z K 7 svn:log V 19 Tidy up a comment. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 90d301190a1fe729e7817b8d63f09351 Text-delta-base-sha1: e8d41ce8afa7bbc5ae842c9a785d987778c2d389 Text-content-length: 121 Text-content-md5: 8151dee11610cb1a52b6ccf56f4db5f4 Text-content-sha1: 659ed580c5be7e9a6f38b2941faf07d9f1761fdf Content-length: 161 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNAT _ _jW* * Explorer has been restarted, so the tray icon will * have been lost. */ Revision-number: 1301 Prop-content-length: 149 Content-length: 149 K 7 svn:log V 49 Another potential segfault fixed. Thanks RDB :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-25T20:07:55.000000Z PROPS-END Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 478a66880b5d96f325dde14eec13343a Text-delta-base-sha1: d5d84a20c49f22f14c02521a40fd12a80ec14820 Text-content-length: 49 Text-content-md5: 5ee3a66f1e21ce7ca9c585450afb3144 Text-content-sha1: 5ae94ae7db4356d5285e06de048eff391e6b14eb Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNc dif (s == NULL) return; Revision-number: 1302 Prop-content-length: 253 Content-length: 253 K 7 svn:log V 152 Spelling fix. When the user hits `Browse' next to the `Private key' box, they should see a file chooser labelled Select _Private_ Key File, not Public! K 10 svn:author V 5 simon K 8 svn:date V 27 2001-09-25T20:12:14.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 874af16b4aac1eb1501691a1c3ea5e41 Text-delta-base-sha1: a381473a922a5138d7a4b46f820cc078ddee2215 Text-content-length: 31 Text-content-md5: d237879a70907891be79594803815036 Text-content-sha1: 9c62648b02c937641fd14ceeffb0bbd254d0f4e3 Content-length: 72 K 15 cvs2svn:cvs-rev V 5 1.152 PROPS-END SVN >@Crivate Revision-number: 1303 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2001-09-25T21:08:24.000000Z K 7 svn:log V 35 Fiddly fixes in code page handling K 10 svn:author V 5 simon PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b1d1ce9e3e5d5b0fa21c88fe774afd52 Text-delta-base-sha1: ee0cc3c78d455531e2eecd3676b4a308a092ea3f Text-content-length: 52 Text-content-md5: 2e30197e87bb026a844cd97c006f32d0 Text-content-sha1: 369a03731a8824299e0198cee0601c716ba0b419 Content-length: 92 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN&LJqz#-1) return codepage Revision-number: 1304 Prop-content-length: 224 Content-length: 224 K 8 svn:date V 27 2001-09-26T20:29:03.000000Z K 7 svn:log V 123 `Server got confused by' error messages now quote a packet type, so I can start debugging as soon as I get one sent to me. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4505ede1adf3eeb6a084e0e258666c04 Text-delta-base-sha1: 23a3a77e81a31900be5d86d5388f5d0e72d1ff71 Text-content-length: 481 Text-content-md5: 750bdf501fdb2ed37650244ff76ba3df Text-content-sha1: c801d590d2d8ec476b5179f61298745b5ccd37a9 Content-length: 522 K 15 cvs2svn:cvs-rev V 5 1.170 PROPS-END SVNN-4QbZw(UbUFZPUnexpected response to X11 forwarding request:" " packet type %d", pktin.typeUnexpected response to port " "forwarding request: packet type %d", pktin.type("Unexpected response to agent forwarding request:" " packet type %d", pktin.typeUnexpected response to pty request:" " packet type %d", pktin.typeUnexpected response to shell/command request:" " packet type %d", pktin.type Revision-number: 1305 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2001-09-26T20:31:02.000000Z K 7 svn:log V 90 Extra line in the help text to mention you can use a saved session as well as a hostname. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5301d0856d61c8a3dcb3033aefb59933 Text-delta-base-sha1: 1c8b8821ef885552fcd2256fbab214936b39d3bc Text-content-length: 79 Text-content-md5: 39fda5a85b75ee9325a756a4181e3001 Text-content-sha1: d1a1900ce15b0e20dca526d9fa25e060c91f5abd Content-length: 119 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN U 8?^- (\"host\" can also be a PuTTY saved session name) Revision-number: 1306 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2001-10-12T19:32:13.000000Z K 7 svn:log V 186 Due to fears that an incompetent WinSock might allow localhost- listening sockets to be talked to by non-local hosts, reinstate the explicit peer address check on connection acceptance. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2184be9456844919bf217b9a3d7b9e7b Text-delta-base-sha1: 9b22b19a50652ff60c3f12bf71352a5152dd86a1 Text-content-length: 591 Text-content-md5: 4832449b6d826efdf34399c03331baec Text-content-sha1: 27d6bcb1189aabe7af3b8140eb0368b6b41fab87 Content-length: 631 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN4L1c[FaoFSO; 0d%int localhost_only; /* for listening sockets ret->localhost_only = 0; /* unused, but best init anyway */ ret->localhost_only = 0; /* unused, but best init anyway */ ret->localhost_only = local_host_only_in isa; int addrlen = sizeof(struct sockaddr_in); SOCKET t; /* socket of connection */ memset(&isa, 0, sizeof(struct sockaddr_ins->localhost_only && ntohl(isa.sin_addr.s_addr) != INADDR_LOOPBACK) { closesocket(t); /* dodgy WinSock let nonlocal through */ } else Revision-number: 1307 Prop-content-length: 298 Content-length: 298 K 7 svn:log V 197 Revamp the window-resize behaviour UI so there are only three states rather than four. Should fix all sorts of bugs, since the fourth (and default!) state was behaving weirdly and nobody liked it. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-12T21:10:56.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 273ecfcc5dc0fa88a675a28c2da0f4b1 Text-delta-base-sha1: 43ef35fc8591fdd5e61911b6db791365e5ea3ea8 Text-content-length: 86 Text-content-md5: 870b6b0705341070568fe9a995b48ceb Text-content-sha1: 2749307d0b8b7a289f2c8885cd1f310478e5baa0 Content-length: 127 K 15 cvs2svn:cvs-rev V 5 1.114 PROPS-END SVN - @.@?Lenum { RESIZE_TERM, RESIZE_DISABLED, RESIZE_FONT } resize_action Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8ead39e3640a79023f604498a656ebd8 Text-delta-base-sha1: 3a9678193ebf5ea22c939c66894354a999dfea4c Text-content-length: 56 Text-content-md5: 0365ad8e8aeabcb1e476e6df7589f15b Text-content-sha1: c149bbe45a32b4e569efb3301de79bae3c2c7a45 Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN(@1xresize_actionresize_action Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d237879a70907891be79594803815036 Text-delta-base-sha1: 9c62648b02c937641fd14ceeffb0bbd254d0f4e3 Text-content-length: 761 Text-content-md5: a744cf39cb0fb5d8cf0d0cab623b14e0 Text-content-sha1: 05230984f6da13ea2487fcd83670d2595f26e467 Content-length: 802 K 15 cvs2svn:cvs-rev V 5 1.153 PROPS-END SVNV/<0H:J=BdBH*BZ@3L8RESIZESTATIC, IDC_RESIZETERM, IDC_RESIZEFONT, IDC_RESIZENONERadioButton(hwnd, IDC_RESIZETERM, IDC_RESIZENONE, cfg.resize_action == RESIZE_TERM ? IDC_RESIZETERM : cfg.resize_action == RESIZE_FONT ? IDC_RESIZEFONT : IDC_RESIZENONEradioline(&cp, "Action when the window is resized:", IDC_RESIZESTATIC, 3, "Resi&ze terminal", IDC_RESIZETERM, "Change fo&nt", IDC_RESIZEFONT, "Forb&id resizing", IDC_RESIZENONE, NULLRESIZETERM: case IDC_RESIZEFONT: case IDC_RESIZENONEcfg.resize_action = IsDlgButtonChecked(hwnd, IDC_RESIZETERM) ? RESIZE_TERM : IsDlgButtonChecked(hwnd, IDC_RESIZEFONT) ? RESIZE_FONT : RESIZE_DISABLED; } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 75a1b1923e41a4dd438fabeb4fff285b Text-delta-base-sha1: 50d7af7dc0d1428941494e9d506b4b204bd7afa1 Text-content-length: 689 Text-content-md5: 2c93222128dad9609a629f1eea907aff Text-content-sha1: e003f19b0deaf8a58e84d1eb0561c40f3ffdfad4 Content-length: 730 K 15 cvs2svn:cvs-rev V 5 1.160 PROPS-END SVNcjo4R[j^T0=-0f4~k7LVke@h0(;spresize_action == RESIZE_DISABLEDresize_action != RESIZE_FONT) return; } if (cfg.resize_action == RESIZE_DISABLEDresize_action != RESIZE_FONTcfg.resize_action == RESIZE_FONTresize_action != RESIZE_FONT && reinit==0) || reinit>0) {resize_action != RESIZE_TERMresize_action == RESIZE_DISABLEDresize_action == RESIZE_DISABLEDresize_action != RESIZE_FONT && prev_cfg.resize_action == RESIZE_FONTcfg.resize_action == RESIZE_TERMresize_action == RESIZE_DISABLEDresize_action != RESIZE_FONTresize_action != RESIZE_FONTcfg.resize_action == RESIZE_TERM Revision-number: 1308 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2001-10-12T21:39:16.000000Z K 7 svn:log V 65 D'oh, trivial typo which was completely breaking log-all-output. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 761b653d1fc51da7eb509e592fea564f Text-delta-base-sha1: 14fbe13a8df54cfd15cd7cdf5628e3ad25a35eac Text-content-length: 25 Text-content-md5: b660c84b785e6adcf875fc5747e6a438 Text-content-sha1: c7d5acb240ab475ac335dc837a1d59f861d0d86d Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVNba !@" Revision-number: 1309 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2001-10-17T21:02:39.000000Z K 7 svn:log V 41 Finally remove this pile of obsoleteness K 10 svn:author V 5 simon PROPS-END Node-path: putty/mscrypto.c Node-action: delete Revision-number: 1310 Prop-content-length: 517 Content-length: 517 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-17T21:21:03.000000Z K 7 svn:log V 416 Wez Furlong's patch to tidy up full-screen mode: make it multi-monitor aware and make the scrollbar separately configurable in and out of full-screen mode. Also (not Wez's patch, this bit) fix the case where the user reconfigures _while_ the window is full-screen, and disables full-screening. (In this case the window should return gracefully to normal, rather than losing all its title bars and getting confused.) PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 895721ad0968f32f86c1d11260d072d2 Text-delta-base-sha1: 45742f1565e2fa821e7ebf214d3004d0165593d4 Text-content-length: 30 Text-content-md5: 0a3f5aeaf9b51c760f855ac035c9eef2 Text-content-sha1: ad7195336434731a21da877935d2063337281856 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVN*9 _QY /DWINVER Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ccf5c43c3291c762fb38ad535a52fff9 Text-delta-base-sha1: 2e5356206bc15329309a4efb2ec70695cbbe4158 Text-content-length: 77 Text-content-md5: bc5a24d8d9af2a634cdbbef98701fc10 Text-content-sha1: e750ce443d13657bc5e40237f9baefadeec6d94c Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNo.2 `~_C compilation flags\n". "CFLAGS = -DWINVER=0x04011 Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 870b6b0705341070568fe9a995b48ceb Text-delta-base-sha1: 2749307d0b8b7a289f2c8885cd1f310478e5baa0 Text-content-length: 48 Text-content-md5: 9b42692ecb208e23d057e35d9ccda6c9 Text-content-sha1: deeae9de600fea4bf1a38408e3d6df39b7b2c001 Content-length: 89 K 15 cvs2svn:cvs-rev V 5 1.115 PROPS-END SVN-N .(int scrollbar_in_fullscreen Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0365ad8e8aeabcb1e476e6df7589f15b Text-delta-base-sha1: c149bbe45a32b4e569efb3301de79bae3c2c7a45 Text-content-length: 122 Text-content-md5: efd9a7fff76126a5529d61d18b5348de Text-content-sha1: 9216787f4448d158619cd1d0fef70f2f9cee32e2 Content-length: 162 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN(G\2o J^BarFullScreen", cfg->scrollbar_in_fullscreenBarFullScreen", 0, &cfg->scrollbar_in_fullscreen Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4d71839009e088325b04561e170159a3 Text-delta-base-sha1: b4aaa03593dcff52c3b4c8c4c68173785ae2dd43 Text-content-length: 201 Text-content-md5: c83bc862d9c8bdbf72a0ae3ba4cbaa30 Text-content-sha1: 8a25c7f1b5cc533a94c97841d61f13983fe8effe Content-length: 241 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVN{{!klies!YK0535, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 231, 235, 44, 14 PUSHBUTTON "&About", IDC_ABOUT, 3, 23535, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 231, 23 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a744cf39cb0fb5d8cf0d0cab623b14e0 Text-delta-base-sha1: 05230984f6da13ea2487fcd83670d2595f26e467 Text-content-length: 346 Text-content-md5: 5fb5ab8318eae9411267766d93f599b9 Text-content-sha1: 32b295ab955aa06fd0fa51d119e8c514e1e543fd Content-length: 387 K 15 cvs2svn:cvs-rev V 5 1.154 PROPS-END SVNVr=' DD&^;R@ SZaT@X7SCROLLBARFULLSCREENDlgButton(hwnd, IDC_SCROLLBARFULLSCREEN, cfg.scrollbar_in_fullscreenikp w4ylt fD&isplay scrollbar in full screen mode", IDC_SCROLLBARFULLSCREEN19SCROLLBARFULLSCREEN cfg.scrollbar_in_fullscreen = IsDlgButtonChecked(hwnd, IDC_SCROLLBARFULLSCREEN Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2c93222128dad9609a629f1eea907aff Text-delta-base-sha1: e003f19b0deaf8a58e84d1eb0561c40f3ffdfad4 Text-content-length: 2274 Text-content-md5: 72043e632405146ef110bddae0b095dc Text-content-sha1: 6484710683692766522c60f65ae9b6d7167d5b95 Content-length: 2315 K 15 cvs2svn:cvs-rev V 5 1.161 PROPS-END SVNjmR9Q`8(=TFjtiN]O'Tl6HBiM{ #if WINVER < 0x0500 #define COMPILE_MULTIMON_STUBS #include #endif #define IDM_FULLSCREEN 0x017want_full_screen = 0; static intwas_full_screen = 0; static int prev_rows, prev_cols; static int pre_fs_rows, pre_fsFULLSCREEN, "&Full Screen || full_screen/* If user forcibly disables full-screen, gracefully unzoom */ if (full_screen && !cfg.fullscreenonaltenter) { flip_full_screen(); }case IDM_FULLSCREEN: flip_full_screen(); else if (was_full_screen) { was_full_screen_fs_rows, pre_fs Revised by */ static void flip_full_screen(void) { want_full_screen = !want_full_screen; if (full_screen == want_full_screen) return; full_screen = want_full_screen; old_wind_placement.length = sizeof(old_wind_placement); if (full_screen) { int x, y, cx, cy; #ifdef MONITOR_DEFAULTTONEAREST /* The multi-monitor safe way of doing things */ HMONITOR mon; MONITORINFO mi; mon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); mi.cbSize = sizeof(mi); GetMonitorInfo(mon, &mi); x = mi.rcMonitor.left; y = mi.rcMonitor.top; cx = mi.rcMonitor.right; cy = mi.rcMonitor.bottom; #else /* good old fashioned way of doing it */ x = 0; y = 0; cx = GetSystemMetrics(SM_CXSCREEN); cy = GetSystemMetrics(SM_CYSCREEN); #endif /* save rows for when we "restore" back down again */ pre_fs_rows = rows; pre_fs_cols = cols; GetWindowPlacement(hwnd, &old_wind_placement); SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~((cfg.scrollbar_in_fullscreen ? 0 : WS_VSCROLL) | WS_CAPTION | WS_BORDER | WS_THICKFRAME)); /* become topmost */ SetWindowPos(hwnd, HWND_TOP, x, y, cx, cy, SWP_FRAMECHANGED); } else { was_full_screen = 1; SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | (cfg.scrollbar ? WS_VSCROLL : 0) | WS_CAPTION | WS_BORDER | WS_THICKFRAME); SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED); SetWindowPlacement(hwnd,&old_wind_placement); } CheckMenuItem(GetSystemMenu(hwnd, FALSE), IDM_FULLSCREEN, MF_BYCOMMAND| full_screen ? MF_CHECKED : MF_UNCHECKED); } Revision-number: 1311 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:02.631138Z PROPS-END Revision-number: 1312 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:02.638667Z PROPS-END Revision-number: 1313 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2001-10-23T19:22:01.000000Z K 7 svn:log V 78 Don't quit the plink main loop until the stdout and stderr buffers are empty. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 39fda5a85b75ee9325a756a4181e3001 Text-delta-base-sha1: d1a1900ce15b0e20dca526d9fa25e060c91f5abd Text-content-length: 582 Text-content-md5: a59dba53bce7e238ffbbc0220b7e6025 Text-content-sha1: 2720842b414b6fcc9d61e0e5daf203a3cc7b2347 Content-length: 622 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNU>&7 |y\w]xconnopen && back->socket() != NULL) { if (idata.len > 0) { back->send(idata.buffer, idata.len); } else { back->special(TS_EOF); }if (connopen && back->socket() != NULL) { back->unthrottle(bufchain_size(&stdout_data) + bufchain_size(&stderr_data)); }if (connopen && back->socket() != NULL) { back->unthrottle(bufchain_size(&stdout_data) + bufchain_size(&stderr_data)); }(!connopen || back->socket() == NULL) && bufchain_size(&stdout_data) == 0 && bufchain_size(&stderr_data) == 0 Revision-number: 1314 Prop-content-length: 439 Content-length: 439 K 8 svn:date V 27 2001-10-23T19:51:23.000000Z K 7 svn:log V 338 Better robustness in visual bell timeouts: handling GetTickCount wraparound, not referencing vbell_timeout if in_vbell==FALSE, that sort of thing. I doubt it'll fix the reported problems with screen vbells, since none of the failure modes I've just prevented looked all that probable to me, but it's nice to have extra robustness anyway. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9b42692ecb208e23d057e35d9ccda6c9 Text-delta-base-sha1: deeae9de600fea4bf1a38408e3d6df39b7b2c001 Text-content-length: 50 Text-content-md5: 251755a8f2e9a6fe3066aa75abf21377 Text-content-sha1: 53d73c9689b99955166b2fd5665d2fc9ada1e11d Content-length: 91 K 15 cvs2svn:cvs-rev V 5 1.116 PROPS-END SVNNZ `]qunsigned long vbell_startpoin Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b660c84b785e6adcf875fc5747e6a438 Text-delta-base-sha1: c7d5acb240ab475ac335dc837a1d59f861d0d86d Text-content-length: 843 Text-content-md5: c3338a3746b6d92d11c7337dc0c0b449 Text-content-sha1: 5061ba4234696bf1fc45da84cb7e2a8092d9826f Content-length: 883 K 15 cvs2svn:cvs-rev V 4 1.86 PROPS-END SVNa`Mpxw}#gI:xN*er3$Kunsignedunsigned long rvbell_startpoint;unsigned/* turn off a previous vbell to avoid inconsistencies */ if (ticks - vbell_startpoint >= VBELL_TIMEOUT) in_vbell = FALSE; if (rvideo && !state && /* we're turning it off... */ (ticks - rvbell_startpoint) < VBELL_TIMEOUT) { /* ...soon */ /* If there's no vbell timeout already, or this one lasts * longer, replace vbell_timeout with ours. */ if (!in_vbell || (rvbell_startpoint - vbell_startpoint < VBELL_TIMEOUT)) vbell_startpoint = rvbell_startpoint; } else if (!rvideo && state) { /* This is an ON, so we notice the time and save it. */ rvbell_startpoint = ticksunsigned(unsigned)startpoint = ticksunsignedstartpoint >= VBELL_TIMEOUT) in_vbell = FALSE; Revision-number: 1315 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 52 Add Jacob's patch for compiling without multimon.h. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-23T20:25:34.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0a3f5aeaf9b51c760f855ac035c9eef2 Text-delta-base-sha1: ad7195336434731a21da877935d2063337281856 Text-content-length: 302 Text-content-md5: 32703adfd40079b132b2b33af70ba0d6 Text-content-sha1: f5301fd7d0745374300e76985d14b017d782fa73 Content-length: 342 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVN9X &COMPAT=/DNO_MULTIMON # Disables PuTTY's use of , which is not available # with some development environments. This means that PuTTY's # full-screen mode (configurable to work on Alt-Enter) will # not behave usefully in a multi-monitor environment Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 72043e632405146ef110bddae0b095dc Text-delta-base-sha1: 6484710683692766522c60f65ae9b6d7167d5b95 Text-content-length: 132 Text-content-md5: d4554f10c021f12a7d19619a488a7b18 Text-content-sha1: f927dca9479cff8fd2e065b09a8af66139e20aaf Content-length: 173 K 15 cvs2svn:cvs-rev V 5 1.162 PROPS-END SVNm&e>^M%G(WINVER < 0x0500) && !defined(NO_MULTIMON) !defined(NO_MULTIMON) && defined(MONITOR_DEFAULTTONEAREST) Revision-number: 1316 Prop-content-length: 390 Content-length: 390 K 8 svn:date V 27 2001-10-24T11:50:07.000000Z K 7 svn:log V 289 Now that we can configure whether ^C and friends generate Telnet IP and friends, we should honour the user's choice even in line editing mode. In particular, Telnet talkers don't like us randomly spraying Telnet IP whenever the user accidentally hits ^C, so this is not a helpful default. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 765582124c9e40893718fc3fbc2e727a Text-delta-base-sha1: 984e4f260ec44569aaea3f85282825327648a6a5 Text-content-length: 345 Text-content-md5: c93ca7e60e33db4b50c7bc323033ba38 Text-content-sha1: 8d66f60d37ba616aa1f30a3171a516b2fd78c533 Content-length: 385 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN[;n /* * We don't send IP, SUSP or ABORT if the user has * configured telnet specials off! This breaks * talkers otherwise. */ if (!cfg.telnet_keyboard) goto default_case default_case: Revision-number: 1317 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 27 Add the new-look PuTTY FAQ K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-24T18:56:28.000000Z PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a8773b9996baa327a19da06a6a7ec601 Text-delta-base-sha1: 22f10bf26f6a7b4b61e816301a8c8e5e3eae9daa Text-content-length: 78 Text-content-md5: ddf7a205be7777f70543bf14b14b4f99 Text-content-sha1: f0ad29df2c05466bd4d1f9e30b70c27e543550fa Content-length: 117 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNlh>*BCHAPTERS = blurb intro gs config pscp plink pubkey pageant faq Node-path: putty/doc/trouble.but Node-action: delete Revision-number: 1318 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2001-10-24T18:56:52.000000Z K 7 svn:log V 78 _Actually_ add the new-look PuTTY FAQ. When will I remember to run "cvs add"? K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 26566 Text-content-md5: 386a1ff1181dc25bb909a12ee35de59f Text-content-sha1: da803e20ad119f4e6d3f40e106894947a679893a Content-length: 26682 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN555\A{faq} PuTTY FAQ This FAQ is published on the PuTTY web site, and also provided as an appendix in the manual. \H{faq-support} Features supported in PuTTY In general, if you want to know if PuTTY supports a particular feature, you should look for it on the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/}{PuTTY web site}. In particular: \b try the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/changes.html}{changes page}, and see if you can find the feature on there. If a feature is listed there, it's been implemented. If it's listed as a change made \e{since} the latest version, it should be available in the development snapshots, in which case testing will be very welcome. \b try the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist.html}{Wishlist page}, and see if you can find the feature there. If it's on there, it probably \e{hasn't} been implemented. \S{faq-ssh2} Does PuTTY support SSH v2? Yes. SSH v2 support has been available in PuTTY since version 0.50. However, currently the \e{default} SSH protocol is v1; to select SSH v2 if your server supports both, go to the SSH panel and change the \e{Preferred SSH protocol version} option. Public key authentication (both RSA and DSA) in SSH v2 has been added since version 0.51. \S{faq-ssh2-keyfmt} Does PuTTY support reading OpenSSH or \cw{ssh.com} SSHv2 private key files? Not at present. OpenSSH and \cw{ssh.com} have totally different formats for private key files, and neither one is particularly pleasant, so PuTTY has its own. We do plan to write a converter at some stage. \S{faq-ssh1} Does PuTTY support SSH v1? Yes. SSH 1 support has always been available in PuTTY. \S{faq-localecho} Does PuTTY support local echo? Yes. In version 0.51 and before, local echo cannot be separated from local line editing (where you type a line of text locally, and it is not sent to the server until you press Return, so you have the chance to edit it and correct mistakes \e{before} the server sees it). The two features can be enabled and disabled from the Terminal panel, using the checkbox marked \q{Use local terminal line discipline}. Note that due to a bug in those versions of PuTTY, changing this feature in mid-session will have no effect; you have to enable it \e{before} you open the connection. In later versions, local echo and local line editing are separate options, and by default PuTTY will try to determine automatically whether to enable them or not, based on which protocol you have selected and also based on hints from the server. If you have a problem with PuTTY's default choice, you can force each option to be enabled or disabled as you choose. The controls are in the Terminal panel, in the section marked \q{Line discipline options}. \S{faq-disksettings} Does PuTTY support storing its settings in a disk file? Not at present, although \k{config-file} in the documentation gives a method of achieving the same effect. \S{faq-fullscreen} Does PuTTY support full-screen mode, like a DOS box? Not in the 0.51 release, but it has been added since then. \S{faq-password} Does PuTTY have the ability to remember my password so I don't have to type it every time? No, it doesn't. Remembering your password is a bad plan for obvious security reasons: anyone who gains access to your machine while you're away from your desk can find out the remembered password, and use it, abuse it or change it. In addition, it's not even \e{possible} for PuTTY to automatically send your password in a Telnet session, because Telnet doesn't give the client software any indication of which part of the login process is the password prompt. PuTTY would have to guess, by looking for words like \q{password} in the session data; and if your login program is written in something other than English, this won't work. In SSH, remembering your password would be possible in theory, but there doesn't seem to be much point since SSH supports public key authentication, which is more flexible and more secure. See \k{pubkey} in the documentation for a full discussion of public key authentication. \H{faq-ports} Ports to other operating systems The eventual goal is for PuTTY to be a multi-platform program, able to run on at least Windows, MacOS and Unix. Whether this will actually ever happen I have no idea, but it is the plan. A Mac port has been started, but is only half-finished and currently not moving very fast. Porting will become easier once PuTTY has a generalised porting layer, drawing a clear line between platform-dependent and platform-independent code. The general intention is for this porting layer to evolve naturally as part of the process of doing the first port. One particularly nasty part of this will be separating the many configuration options into platform-dependent and platform-independent ones; for example, the options controlling when the Windows System menu appears will be pretty much meaningless under X11 or perhaps other windowing systems, whereas Telnet Passive Mode is universal and shouldn't need to be specified once for each platform. \S{faq-wince} Will there be a port to Windows CE? Probably not in the particularly near future. Despite sharing large parts of the Windows API, in practice WinCE doesn't appear to be significantly easier to port to than a totally different operating system. However, PuTTY on portable devices would clearly be a useful thing, so in the long term I hope there will be a WinCE port. \S{faq-mac} Will there be a port to the Mac? A Mac port was started once and is half-finished, but development has been static for some time and the main PuTTY code has moved on, so it's not clear how quickly development would resume even if developer effort were available. \S{faq-unix} Will there be a port to Unix? I hope so, if only so that I can have an \cw{xterm}-like program that supports exactly the same terminal emulation as PuTTY. If and when we do do a Unix port, it will have a local-terminal back end so it can be used like an \cw{xterm}, rather than only being usable as a network utility. \S{faq-epoc} Will there be a port to EPOC? I hope so, but given that ports aren't really progressing very fast even on systems the developers \e{do} already know how to program for, it might be a long time before any of us get round to learning a new system and doing the port for that. \H{faq-embedding} Embedding PuTTY in other programs \S{faq-dll} Is the SSH or Telnet code available as a DLL? No, it isn't. It would take a reasonable amount of rewriting for this to be possible, and since the PuTTY project itself doesn't believe in DLLs (they make installation more error-prone) none of us has taken the time to do it. Most of the code cleanup work would be a good thing to happen in general, so if anyone feels like helping, we wouldn't say no. \S{faq-vb} Is the SSH or Telnet code available as a Visual Basic component? No, it isn't. None of the PuTTY team uses Visual Basic, and none of us has any particular need to make SSH connections from a Visual Basic application. In addition, all the preliminary work to turn it into a DLL would be necessary first; and furthermore, we don't even know how to write VB components. If someone offers to do some of this work for us, we might consider it, but unless that happens I can't see VB integration being anywhere other than the very bottom of our priority list. \S{faq-ipc} How can I use PuTTY to make an SSH connection from within another program? Probably your best bet is to use Plink, the command-line connection tool. If you can start Plink as a second Windows process, and arrange for your primary process to be able to send data to the Plink process, and receive data from it, through pipes, then you should be able to make SSH connections from your program. This is what CVS for Windows does, for example. \H{faq-details} Details of PuTTY's operation \S{faq-term} What terminal type does PuTTY use? For most purposes, PuTTY can be considered to be an \cw{xterm} terminal, although full support for some of \cw{xterm}'s features, such as passing mouse actions to the server-side program, is not present in the 0.51 release (but has been added since). PuTTY also supports some terminal control sequences not supported by the real \cw{xterm}: notably the Linux console sequences that reconfigure the colour palette, and the title bar control sequences used by \cw{DECterm} (which are different from the \cw{xterm} ones; PuTTY supports both). By default, PuTTY announces its terminal type to the server as \c{xterm}. If you have a problem with this, you can reconfigure it to say something else; \c{vt220} might help if you have trouble. \S{faq-settings} Where does PuTTY store its data? PuTTY stores most of its data (saved sessions, SSH host keys) in the Registry. The precise location is \c HKEY_CURRENT_USER\Software\SimonTatham\PuTTY and within that area, saved sessions are stored under \c{Sessions} while host keys are stored under \c{SshHostKeys}. PuTTY also requires a random number seed file, to improve the unpredictability of randomly chosen data needed as part of the SSH cryptography. This is stored by default in your Windows home directory (\c{%HOMEDRIVE%\\%HOMEPATH%}), or in the actual Windows directory (such as \c{C:\\WINDOWS}) if the home directory doesn't exist, for example if you're using Win95. If you want to change the location of the random number seed file, you can put your chosen pathname in the Registry, at \c HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\RandSeedFile \H{faq-howto} HOWTO questions \S{faq-startmax} How can I make PuTTY start up maximised? Create a Windows shortcut to start PuTTY from, and set it as \q{Run Maximized}. \S{faq-startsess} How can I create a Windows shortcut to start a particular saved session directly? To run a PuTTY session saved under the name \q{\cw{mysession}}, create a Windows shortcut that invokes PuTTY with a command line like \c \path\name\to\putty.exe @mysession \S{faq-startssh} How can I start an SSH session straight from the command line? Use the command line \c{putty -ssh host.name}. Alternatively, create a saved session that specifies the SSH protocol, and start the saved session as shown in \k{faq-startsess}. \S{faq-cutpaste} How do I copy and paste between PuTTY and other Windows applications? Copy and paste works similarly to the X Window System. You use the left mouse button to select text in the PuTTY window. The act of selection \e{automatically} copies the text to the clipboard: there is no need to press Ctrl-Ins or Ctrl-C or anything else. In fact, pressing Ctrl-C will send a Ctrl-C character to the other end of your connection (just like it does the rest of the time), which may have unpleasant effects. The \e{only} thing you need to do, to copy text to the clipboard, is to select it. To paste the clipboard contents into a PuTTY window, by default you click the right mouse button. If you have a three-button mouse and are used to X applications, you can configure pasting to be done by the middle button instead, but this is not the default because most Windows users don't have a middle button at all. You can also paste by pressing Shift-Ins. \S{faq-pscp} How do I use PSCP.EXE? When I double-click it gives me a command prompt window which then closes instantly. PSCP is a command-line application, not a GUI application. If you run it without arguments, it will simply print a help message and terminate. To use PSCP properly, run it from a Command Prompt window. See \k{pscp} in the documentation for more details. \S{faq-pscp-spaces} How do I use PSCP to copy a file whose name has spaces in? If PSCP is using the traditional SCP protocol, this is confusing. If you're specifying a file at the local end, you just use one set of quotes as you would normally do: \c pscp "local filename with spaces" user@host: \c pscp user@host:myfile "local filename with spaces" But if the filename you're specifying is on the \e{remote} side, you have to use backslashes and two sets of quotes: \c pscp user@host:"\"remote filename with spaces\"" local_filename \c pscp local_filename user@host:"\"remote filename with spaces\"" Worse still, in a remote-to-local copy you have to specify the local file name explicitly, otherwise PSCP will complain that they don't match (unless you specified the \c{-unsafe} option). The following command will give an error message: \c c:\>pscp user@host:"\"oo er\"" . \c warning: remote host tried to write to a file called 'a b' \c when we requested a file called '"a b"'. \c If this is a wildcard, consider upgrading to SSH 2 or using \c the '-unsafe' option. Renaming of this file has been disallowed. If PSCP is using the newer SFTP protocol, none of this is a problem, and all filenames with spaces in are specified using a single pair of quotes in the obvious way: \c pscp "local file" user@host: \c pscp user@host:"remote file" . \H{faq-trouble} Troubleshooting \S{faq-mac} Why do I see \q{Incorrect MAC received on packet}? This is due to a bug in old SSH 2 servers distributed by \cw{ssh.com}. Version 2.3.0 and below of their SSH 2 server constructs Message Authentication Codes in the wrong way, and expects the client to construct them in the same wrong way. PuTTY constructs the MACs correctly by default, and hence these old servers will fail to work with it. If you are using PuTTY version 0.51 or below, go to the SSH panel and check the box labelled \q{Imitate SSH 2 MAC bug}. This will cause PuTTY to construct its MACs in the same incorrect manner as the buggy servers, so it will be able to work with them. Since version 0.51, PuTTY has been enhanced to detect buggy servers automatically (when they announce their version) and enable the workaround without the user needing to ask. Therefore you \e{should} never have to use this option again after 0.52, but it is still provided just in case another buggy server shows up. \S{faq-colours} I clicked on a colour in the Colours panel, and the colour didn't change in my terminal. That isn't how you're supposed to use the Colours panel. During the course of a session, PuTTY potentially uses \e{all} the colours listed in the Colours panel. It's not a question of using only one of them and you choosing which one; PuTTY will use them \e{all}. The purpose of the Colours panel is to let you adjust the appearance of all the colours. So to change the colour of the cursor, for example, you would select \q{Cursor Colour}, press the \q{Modify} button, and select a new colour from the dialog box that appeared. Similarly, if you want your session to appear in green, you should select \q{Default Foreground} and press \q{Modify}. Clicking on \q{ANSI Green} won't turn your session green; it will only allow you to adjust the \e{shade} of green used when PuTTY is instructed by the server to display green text. \S{faq-winsock2} Plink on Windows 95 says it can't find \cw{WS2_32.DLL}. Plink requires the extended Windows network library, WinSock version 2. This is installed as standard on Windows 98 and above, and on Windows NT, and even on later versions of Windows 95; but early Win95 installations don't have it. In order to use Plink on these systems, you will need to download the \W{http://www.microsoft.com/windows95/downloads/contents/wuadmintools/s_wunetworkingtools/w95sockets2/}{WinSock 2 upgrade}: \c http://www.microsoft.com/windows95/downloads/contents/wuadmintools/ \c s_wunetworkingtools/w95sockets2/ \S{faq-rekey} My PuTTY sessions close after an hour and tell me \q{Server failed host key check}. This is a bug in all versions of PuTTY up to and including 0.51. SSH v2 servers from \cw{ssh.com} will require the key exchange to be repeated one hour after the start of the connection, and PuTTY will get this wrong. The bug has been fixed since version 0.51, so upgrading to a later version or snapshot should solve the problem. \S{faq-outofmem} After trying to establish an SSH connection, PuTTY says \q{Out of memory} and dies. If this happens just while the connection is starting up, this often indicates that for some reason the client and server have failed to establish a session encryption key. Somehow, they have performed calculations that should have given each of them the same key, but have ended up with different keys; so data encrypted by one and decrypted by the other looks like random garbage. This causes an \q{out of memory} error because the first encrypted data PuTTY expects to see is the length of an SSH message. Normally this will be something well under 100 bytes. If the decryption has failed, PuTTY will see a completely random length in the region of two \e{gigabytes}, and will try to allocate enough memory to store this non-existent message. This will immediately lead to it thinking it doesn't have enough memory, and panicking. If this happens to you, it is quite likely to still be a PuTTY bug and you should report it (although it might be a bug in your SSH server instead); but it doesn't necessarily mean you've actually run out of memory. \S{faq-altgr} I can't type characters that require the AltGr key. In PuTTY version 0.51, the AltGr key was broken. The bug has been fixed since then. \S{faq-idleout} My PuTTY sessions unexpectedly close after they are idle for a while. Some types of firewall, and almost any router doing Network Address Translation (NAT, also known as IP masquerading), will forget about a connection through them if the connection does nothing for too long. This will cause the connection to be rudely cut off when contact is resumed. You can try to combat this by telling PuTTY to send \e{keepalives}: packets of data which have no effect on the actual session, but which reassure the router or firewall that the network connection is still active and worth remembering about. Keepalives don't solve everything, unfortunately; although they cause greater robustness against this sort of router, they can also cause a \e{loss} of robustness against network dropouts. See \k{config-keepalive} in the documentation for more discussion of this. \S{faq-timeout} PuTTY's network connections time out too quickly when network connectivity is temporarily lost. This is a Windows problem, not a PuTTY problem. The timeout value can't be set on per application or per session basis. To increase the TCP timeout globally, you need to tinker with the Registry. On Windows 95, 98 or ME, the registry key you need to change is \c HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\ \c MSTCP\MaxDataRetries (it must be of type DWORD in Win95, or String in Win98/ME). On Windows NT or 2000, the registry key is \c HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\ \c Parameters\TcpMaxDataRetransmissions and it must be of type DWORD. Set the key's value to something like 10. This will cause Windows to try harder to keep connections alive instead of abandoning them. \S{faq-puttyputty} When I \cw{cat} a binary file, I get `PuTTYPuTTYPuTTY' on my command line. Don't \cw{cat} binary files, then. This is designed behaviour; when PuTTY receives the character Control-E from the remote server, it interprets it as a request to identify itself, and so it sends back the string \q{\cw{PuTTY}} as if that string had been entered at the keyboard. Control-E should only be sent by programs that are prepared to deal with the response. Writing a binary file to your terminal is likely to output many Control-E characters, and cause this behaviour. Don't do it. It's a bad plan. \S{faq-puttyputty} When I \cw{cat} a binary file, my window title changes to a nonsense string. Don't \cw{cat} binary files, then. It is designed behaviour that PuTTY should have the ability to adjust the window title on instructions from the server. Normally the control sequence that does this should only be sent deliberately, by programs that know what they are doing and intend to put meaningful text in the window title. Writing a binary file to your terminal runs the risk of sending the same control sequence by accident, and cause unexpected changes in the window title. Don't do it. \H{faq-secure} Security questions \S{faq-publicpc} Is it safe for me to download PuTTY and use it on a public PC? It depends on whether you trust that PC. If you don't trust the public PC, don't use PuTTY on it, and don't use any other software you plan to type passwords into either. It might be watching your keystrokes, or it might tamper with the PuTTY binary you download. There is \e{no} program safe enough that you can run it on an actively malicious PC and get away with typing passwords into it. If you do trust the PC, then it's probably OK to use PuTTY on it (but if you don't trust the network, then the PuTTY download might be tampered with, so it would be better to carry PuTTY with you on a floppy). \S{faq-cleanup} What does PuTTY leave on a system? How can I clean up after it? PuTTY will leave some Registry entries, and a random seed file, on the PC (see \k{faq-settings}). If you are using PuTTY on a public PC, or somebody else's PC, you might want to clean these up when you leave. You can do that automatically, by running the command \c{putty -cleanup}. \S{faq-dsa} How come PuTTY now supports DSA, when the website used to say how insecure it was? DSA has a major weakness \e{if badly implemented}: it relies on a random number generator to far too great an extent. If the random number generator produces a number an attacker can predict, the DSA private key is exposed - meaning that the attacker can log in as you on all systems that accept that key. The PuTTY policy changed because the developers were informed of ways to implement DSA which do not suffer nearly as badly from this weakness, and indeed which don't need to rely on random numbers at all. For this reason we now believe PuTTY's DSA implementation is probably OK. However, if you have the choice, we still recommend you use RSA instead. \H{faq-admin} Administrative questions \S{faq-domain} Would you like me to register you a nicer domain name? No, thank you. Even if you can find one (most of them seem to have been registered already, by people who didn't ask whether we actually wanted it before they applied), we're happy with the PuTTY web site being exactly where it is. It's not hard to find (just type \q{putty} into \W{http://www.google.com/}{google.com} and we're the first link returned), and we don't believe the administrative hassle of moving the site would be worth the benefit. In addition, if we \e{did} want a custom domain name, we would want to run it ourselves, so we knew for certain that it would continue to point where we wanted it, and wouldn't suddenly change or do strange things. Having it registered for us by a third party who we don't even know is not the best way to achieve this. \S{faq-webhosting} Would you like free web hosting for the PuTTY web site? We already have some, thanks. \S{faq-sourceforge} Why don't you move PuTTY to SourceForge? Partly, because we don't want to move the web site location (see \k{faq-domain}). Also, security reasons. PuTTY is a security product, and as such it is particularly important to guard the code and the web site against unauthorised modifications which might introduce subtle security flaws. Therefore, we prefer that the CVS repository, web site and FTP site remain where they are, under the direct control of system administrators we know and trust personally, rather than being run by a large organisation full of people we've never met and which is known to have had breakins in the past. No offence to SourceForge; I think they do a wonderful job. But they're not ideal for everyone, and in particular they're not ideal for us. \S{faq-mailinglist1} Why can't I subscribe to the putty-bugs mailing list? Because you're not a member of the PuTTY core development team. The putty-bugs mailing list is not a general newsgroup-like discussion forum; it's a contact address for the core developers, and an \e{internal} mailing list for us to discuss things among ourselves. If we opened it up for everybody to subscribe to, it would turn into something more like a newsgroup and we would be completely overwhelmed by the volume of traffic. It's hard enough to keep up with the list as it is. \S{faq-mailinglist2} If putty-bugs isn't a general-subscription mailing list, what is? There isn't one, that we know of. If someone else wants to set up a mailing list for PuTTY users to help each other with common problems, that would be fine with us; but the PuTTY team would almost certainly not have the time to read it, so any questions the list couldn't answer would have to be forwarded on to us by the questioner. In any case, it's probably better to use the established newsgroup \cw{comp.security.ssh} for this purpose. \S{faq-donations} How can I donate to PuTTY development? Please, \e{please} don't feel you have to. PuTTY is completely free software, and not shareware. We think it's very important that \e{everybody} who wants to use PuTTY should be able to, whether they have any money or not; so the last thing we would want is for a PuTTY user to feel guilty because they haven't paid us any money. If you want to keep your money, please do keep it. We wouldn't dream of asking for any. Having said all that, if you still really \e{want} to give us money, we won't argue :-) The easiest way for us to accept donations is if you go to \W{http://www.e-gold.com}\cw{www.e-gold.com}, and deposit your donation in account number 174769. Then send us e-mail to let us know you've done so (otherwise we might not notice for months!). Small donations (tens of dollars or tens of euros) will probably be spent on beer or curry, which helps motivate our volunteer team to continue doing this for the world. Larger donations will be spent on something that actually helps development, if we can find anything (perhaps new hardware, or a copy of Windows 2000), but if we can't find anything then we'll just distribute the money among the developers. If you want to be sure your donation is going towards something worthwhile, ask us first. If you don't like these terms, feel perfectly free not to donate. We don't mind. \S{faq-pronounce} How do I pronounce PuTTY? Exactly like the normal word \q{putty}. Just like the stuff you put on window frames. (One of the reasons it's called PuTTY is because it makes Windows usable. :-) Revision-number: 1319 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2001-10-24T19:05:36.000000Z K 7 svn:log V 101 Condense the docs into fewer HTML files. Particularly useful since the new-look FAQ is now one file. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9d90d2daa5b8fd9dcb6850747082d098 Text-delta-base-sha1: e6cc8769ed29e0002bf361ab8b6669a9f6613da8 Text-content-length: 67 Text-content-md5: f1a47e0167400b176198887845c12c44 Text-content-sha1: fde16ef6c09688679cf278be68dfc8815af5a0a8 Content-length: 106 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN3h\title PuTTY User Manual \cfg{xhtml-leaf-level}{1} Revision-number: 1320 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2001-10-25T08:09:58.000000Z K 7 svn:log V 35 Fix a couple of errors in the FAQ. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 386a1ff1181dc25bb909a12ee35de59f Text-delta-base-sha1: da803e20ad119f4e6d3f40e106894947a679893a Text-content-length: 214 Text-content-md5: cec84af6c885b9c2565f02bcdd4eef34 Text-content-sha1: 8002552a31a722948485cea9ea75bc51e91329a2 Content-length: 253 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN5!1>cQV|9oo er' \c when we requested a file called '"oo ernstead, you need to specify the local file name in full: \c c:\>pscp user@host:"\"oo er\"" "oo er"2 connection, PuTTY Revision-number: 1321 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.085422Z PROPS-END Revision-number: 1322 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.094040Z PROPS-END Revision-number: 1323 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.101773Z PROPS-END Revision-number: 1324 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.108221Z PROPS-END Revision-number: 1325 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.115842Z PROPS-END Revision-number: 1326 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2001-10-25T18:48:54.000000Z K 7 svn:log V 25 Tiny tinkerings with FAQ K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cec84af6c885b9c2565f02bcdd4eef34 Text-delta-base-sha1: 8002552a31a722948485cea9ea75bc51e91329a2 Text-content-length: 200 Text-content-md5: 6311160f84ee133c60067751e36ab36c Text-content-sha1: b501c131372ec591240ecf5187c946d82c8113c5 Content-length: 239 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN!8)FF[)In this context MAC stands for Message Authentication Code. It's a cryptographic term, and it has nothing at all to do with Ethernet MAC (Media Access Control) addresses Revision-number: 1327 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.338682Z PROPS-END Revision-number: 1328 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.345325Z PROPS-END Revision-number: 1329 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.352626Z PROPS-END Revision-number: 1330 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.362979Z PROPS-END Revision-number: 1331 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.370391Z PROPS-END Revision-number: 1332 Prop-content-length: 286 Content-length: 286 K 7 svn:log V 185 Update to password length traffic analysis: one Cisco router can apparently not deal with SSH1_MSG_IGNORE _or_ padded passwords, so we must fall back to sending an undefended password. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-27T10:39:54.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 750bdf501fdb2ed37650244ff76ba3df Text-delta-base-sha1: c801d590d2d8ec476b5179f61298745b5ccd37a9 Text-content-length: 2782 Text-content-md5: c5a3b11d96c33d5d70cdcfdf42998980 Text-content-sha1: ff0b7f1adff071ac9be4de169388090a95c3565d Content-length: 2823 K 15 cvs2svn:cvs-rev V 5 1.171 PROPS-END SVNOb87*n? q*nRWS6]:;#define BUG_NEEDS_SSH1_PLAIN_PASSWORD 4 imp++; imp += strcspn(imp, "-"); if (*imp) || !strcmp(imp, "Cisco-1.25cmp(imp, "Cisco-1.25")) { /* * These versions need a plain password sent; they can't * handle having a null and a random length of data after * the password. */ ssh_remote_bugs |= BUG_NEEDS_SSH1_PLAIN_PASSWORD; logevent("We believe remote version needs a plain SSH1 passwordsize = 16; vstring = smalloc(vstrsize)vstring[strcspn (vstring, "\r\n")] = '\0'; /* remove end-of-line chars */ sprintf(vlog, "Server version: %s", vstring); logevent(vlog); ssh_detect_bugs(vstrin * One server (a Cisco one) can deal with neither * SSH1_MSG_IGNORE _nor_ a padded password string. * For this server we are left with no defences * against password length sniffing. */ if (!(ssh_remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE))logevent("Sending password with camouflage packets"); ssh_pkt_defersend(); } else if (!(ssh_remote_bugs & BUG_NEEDS_SSH1_PLAIN_PASSWORD)logevent("Sending length-padded password"); send_packet(pwpkt_type, PKT_INT, len, PKT_DATA, s, len, PKT_END); } else { /* * The server has _both_ * BUG_CHOKES_ON_SSH1_IGNORE and * BUG_NEEDS_SSH1_PLAIN_PASSWORD. There is * therefore nothing we can do. */ int len; len = strlen(password); logevent("Sending unpadded password"); send_packet(pwpkt_type, PKT_INT, len, PKT_DATA, password, len, PKT_ENDNY NCEPT) { bombout(("Server refused user authentication protocol")); crReturnV; } /* * We repeat this whole loop, including the username prompt, * until we manage a successful authentication. If the user * types the wrong _password_, they are sent back to the * beginning to try another username. (If they specify a * username in the config, they are never asked, even if they * do give a wrong password.) * * I think this best serves the needs of * * - the people who have no configuration, no keys, and just * want to try repeated (username,password) pairs until they * type both correctly * * - people who have keys and configuration but occasionally * need to fall back to passwords * * - people with a key held in Pageant, who might not have * logged in to a particular machine before; so they want to * type a username, and then _either_ their key will be * accepted, _or_ they will type a password. If they mistype * the username they will want to be able to get back and * retype it! */ do { stat Revision-number: 1333 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2001-10-27T11:06:11.000000Z K 7 svn:log V 114 Add remaining comments to the last checkin (gah, remember to hit Save in the editor _before_ running cvs commit). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c5a3b11d96c33d5d70cdcfdf42998980 Text-delta-base-sha1: ff0b7f1adff071ac9be4de169388090a95c3565d Text-content-length: 523 Text-content-md5: bfc761b6192aba2a38c0df70890d258d Text-content-sha1: 6bded563b943cb37c94459d14b827449caa06e2d Content-length: 564 K 15 cvs2svn:cvs-rev V 5 1.172 PROPS-END SVN:km3S/* * The server can deal with SSH1_MSG_IGNORE, so * we can use the primary defence. *//* * The server can't deal with SSH1_MSG_IGNORE * but can deal with padded passwords, so we * can use the secondary defence. */YmF<NvYsword[100]; crBegin; /* * Request userauth protocol, and await a response to it. */ ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST); ssh2_pkt_addstring("ssh-userauth");SERVICE_AC Revision-number: 1334 Prop-content-length: 362 Content-length: 362 K 8 svn:date V 27 2001-10-28T09:38:43.000000Z K 7 svn:log V 261 Fix silly scrolling-vs-selection bug: if you selected text on line 9, then did ANSI Delete Line on line 10, the selection highlight would move up a line even though it wasn't over any text that actually moved. Easy to reproduce in the likes of vi. Trivial fix. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c3338a3746b6d92d11c7337dc0c0b449 Text-delta-base-sha1: 5061ba4234696bf1fc45da84cb7e2a8092d9826f Text-content-length: 33 Text-content-md5: 6901d694e4110acbe9ba4ddc33da59c7 Text-content-sha1: be286fd7f6f070ae40fdeec9468dcd97b5ca980d Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.87 PROPS-END SVN`f (7)topline Revision-number: 1335 Prop-content-length: 223 Content-length: 223 K 7 svn:log V 122 Fix the `SERIOUS NETWORK INTERNAL ERROR' oversight in winnet.c. See the comment in try_send() for details of the problem. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-28T09:57:47.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d4554f10c021f12a7d19619a488a7b18 Text-delta-base-sha1: f927dca9479cff8fd2e065b09a8af66139e20aaf Text-content-length: 1187 Text-content-md5: 40c49dfbf45aa04face04581084923a5 Text-content-sha1: 307512a11279d6b9bc3f045db3295a7174e5dd59 Content-length: 1228 K 15 cvs2svn:cvs-rev V 5 1.163 PROPS-END SVN&K$qcoafL3C_Gnet_pending_errors(); net_pending_errors(net_pending_errors(); break; case IDM_TEL_BRK: back->special(TS_BRK); net_pending_errors(); break; case IDM_TEL_SYNCH: back->special(TS_SYNCH); net_pending_errors(); break; case IDM_TEL_EC: back->special(TS_EC); net_pending_errors(); break; case IDM_TEL_EL: back->special(TS_EL); net_pending_errors(); break; case IDM_TEL_GA: back->special(TS_GA); net_pending_errors(); break; case IDM_TEL_NOP: back->special(TS_NOP); net_pending_errors(); break; case IDM_TEL_ABORT: back->special(TS_ABORT); net_pending_errors(); break; case IDM_TEL_AO: back->special(TS_AO); net_pending_errors(); break; case IDM_TEL_IP: back->special(TS_IP); net_pending_errors(); break; case IDM_TEL_SUSP: back->special(TS_SUSP); net_pending_errors(); break; case IDM_TEL_EOR: back->special(TS_EOR); net_pending_errors(); break; case IDM_TEL_EOF: back->special(TS_EOF); net_pending_errors(net_pending_errors(); Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4832449b6d826efdf34399c03331baec Text-delta-base-sha1: 27d6bcb1189aabe7af3b8140eb0368b6b41fab87 Text-content-length: 1744 Text-content-md5: 524c3a62a445668955d1966116da1473 Text-content-sha1: f1becbaf3e0b50988d7be71e4f347d68b2c2f785 Content-length: 1784 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNLR0XAW(r~8p8I/ int pending_error; /* in case send() returns error */ ret->pending_error = 0; ret->pending_error = 0; ret->pending_error = 0If send() returns CONNABORTED or CONNRESET, we * unfortunately can't just call plug_closing(), * because it's quite likely that we're currently * _in_ a call from the code we'd be calling back * to, so we'd have to make half the SSH code * reentrant. Instead we flag a pending error on * the socket, to be dealt with (by calling * plug_closing()) at some suitable future moment. */ s->pending_error = err; returnDeal with socket errors detected in try_send(). */ void net_pending_errors(void) { int i; Actual_Socket s; /* * This might be a fiddly business, because it's just possible * that handling a pending error on one socket might cause * others to be closed. (I can't think of any reason this might * happen in current SSH implementation, but to maintain * generality of this network layer I'll assume the worst.) * * So what we'll do is search the socket list for _one_ socket * with a pending error, and then handle it, and then search * the list again _from the beginning_. Repeat until we make a * pass with no socket errors present. That way we are * protected against the socket list changing under our feet. */ do { for (i = 0; (s = index234(sktree, i)) != NULL; i++) { if (s->pending_error) { /* * An error has occurred on this socket. Pass it to the * plug. */ plug_closing(s->plug, winsock_error_string(s->pending_error), s->pending_error, 0); break; } } } while (s) Revision-number: 1336 Prop-content-length: 372 Content-length: 372 K 8 svn:date V 27 2001-10-28T10:40:11.000000Z K 7 svn:log V 271 Fix character set problems. Some systems lack the ISO8859 codepages, so we specify them explicitly to avoid this problem. Also in particular get_unitab() no longer depends on querying Windows codepage 28591 (ISO8859-1), so UTF-8 mode should stop failing on such systems. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2e30197e87bb026a844cd97c006f32d0 Text-delta-base-sha1: 369a03731a8824299e0198cee0601c716ba0b419 Text-content-length: 9479 Text-content-md5: 14d1e158d8165cf29dd7202567fe0b31 Text-content-sha1: 268e4ec2c8f3c6b2d39714437bfbdd94cfff7ed7 Content-length: 9519 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN&Nt Ysx?S}7}G8 3 CJsx?dU U_U3U[sx?3/ FIE{+/* * Tables for ISO-8859-{1-9,13-16} derived from those downloaded * 2001-10-02 from -- jtn */ /* XXX: This could be done algorithmically, but I'm not sure it's * worth the hassle -- jtn */ /* ISO/IEC 8859-1:1998 (Latin-1, "Western", "West European") */ static wchar_t iso_8859_1[] = { 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE0F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF }; /* ISO 8859-2:1999 (Latin-2, "Central European", "East European") */ static wchar_t iso_8859_2[] = { 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 }; /* ISO/IEC 8859-3:1999 (Latin-3, "South European", "Maltese & Esperanto") */ static wchar_t iso_8859_3[] = { 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0xFFFD, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0xFFFD, 0x017B, 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0xFFFD, 0x017C, 0x00C0, 0x00C1, 0x00C2, 0xFFFD, 0x00C4, 0x010A, 0x0108120, 0x00D6, 0x00D7, 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0xFFFD, 0x00E4, 0x010B, 0x0109121, 0x00F6, 0x00F7, 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9 }; /* ISO/IEC 8859-4:1998 (Latin-4, "North European") */ static wchar_t iso_8859_4[] = { 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF, 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E12A, 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A12B, 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9 }; /* ISO 8859-5:1999 (Latin/Cyrillic) */ static wchar_t iso_8859_5[] = { 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F }; /* ISO 8859-6:1999 (Latin/Arabic) */ static wchar_t iso_8859_6[] = { 0x00A0, 0xFFFD, 0xFFFD, 0xFFFD, 0x00A4, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x060C, 0x00AD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x061B, 0xFFFD, 0xFFFD, 0xFFFD, 0x061F, 0xFFFD, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD }; /* ISO 8859-7:1987 (Latin/Greek) */ static wchar_t iso_8859_7[] = { 0x00A0, 0x2018, 0x2019, 0x00A3, 0xFFFD, 0xFFFD, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0xFFFD, 0x00AB, 0x00AC, 0x00AD, 0xFFFD, 0x2015, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0xFFFD, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0xFFFD }; /* ISO/IEC 8859-8:1999 (Latin/Hebrew) */ static wchar_t iso_8859_8[] = { 0x00A0, 0xFFFD, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x2017, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0xFFFD, 0xFFFD, 0x200E, 0x200F, 0xFFFD }; /* ISO/IEC 8859-9:1999 (Latin-5, "Turkish") */ static wchar_t iso_8859_9[] = { 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E1F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF }; /* ISO 8859-10:1993? (Latin-6, "Nordic" [Sami, Inuit, Icelandic]) */ /* Translation table from RDB. unicode.org (ISO/IEC 8859-10:1998) has * U+2015 (HORIZONTAL BAR) at codepoint 0xBD instead * (U+2014 is EM DASH). -- jtn *//* "ISO 8859-11:1997" ("Thai", "TIS620") */ /* From RDB -- ISO and unicode.org disclaim all knowledge of this one. * Maybe still in draft. --jtn *//* ISO/IEC 8859-13:1998 (Latin-7, "Baltic Rim") *//* ISO/IEC 8859-14:1998 (Latin-8, "Celtic", "Gaelic/Welsh") *//* ISO/IEC 8859-15:1999 (Latin-9 aka -0, "euro") */ static wchar_t iso_8859_15[] = { 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x017800D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE0F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF }; /* ISO/IEC 8859-16:2001 (Latin-10, "Balkan") */98 (Latin-1, West Europe)", 0, 96, iso_8859_1}, {"ISO-8859-2:1999 (Latin-2, East Europe)", 0, 96, iso_8859_2}, {"ISO-8859-3:1999 (Latin-3, South Europe)", 0, 96, iso_8859_3}, {"ISO-8859-4:1998 (Latin-4, North Europe)", 0, 96, iso_8859_4}, {"ISO-8859-5:1999 (Latin/Cyrillic)", 0, 96, iso_8859_5}, {"ISO-8859-6:1999 (Latin/Arabic)", 0, 96, iso_8859_6}, {"ISO-8859-7:1987 (Latin/Greek)", 0, 96, iso_8859_7}, {"ISO-8859-8:1999 (Latin/Hebrew)", 0, 96, iso_8859_8}, {"ISO-8859-9:1999 (Latin-5, Turkish)", 0, 96, iso_8859_9}, {"ISO-8859-10:1993 (Latin-6, Nordic)", 0, 96, iso_8859_10}, {"ISO-8859-11:1997 (Latin/Thai)", 0, 96, iso_8859_11}, {"ISO-8859-13:1998 (Latin-7, Baltic)", 0, 96, iso_8859_13}, {"ISO-8859-14:1998 (Latin-8, Celtic)", 0, 96, iso_8859_14}, {"ISO-8859-15:1999 (Latin-9, \"euro\")", 0, 96, iso_8859_15}, {"ISO-8859-16:2001 (Latin-10, Balkan) { for (i = 0; i < max; i++) unitab[i] = i; return; } Revision-number: 1337 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Add the FAQ about `nothing happens when I try to type my password'. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-28T15:11:24.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6311160f84ee133c60067751e36ab36c Text-delta-base-sha1: b501c131372ec591240ecf5187c946d82c8113c5 Text-content-length: 468 Text-content-md5: db4c8504eb86ab0d7c8924bd4ef8a571 Text-content-sha1: 0fb3724a54ed552507ff1abbb4323e19518f955a Content-length: 507 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN8t88={S{faq-password} My keyboard stops working once PuTTY displays the password prompt. No, it doesn't. PuTTY just doesn't display the password you type, so that someone looking at your screen can't see what it is. Unlike the Windows login prompts, PuTTY doesn't display the password as a row of asterisks either. This is so that someone looking at your screen can't even tell how \e{long} your password is, which might be valuable information Revision-number: 1338 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2001-10-28T15:32:33.000000Z K 7 svn:log V 51 Fix trivial UI buglets related to DSA key support. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 883a4c3cbd48f52634b4a74fbbb7c85e Text-delta-base-sha1: 35909924dc2074bbd9907441f94cc4f2ce7b9c01 Text-content-length: 69 Text-content-md5: 7ea6cd8015c3cebf77a982334dd58ffa Text-content-sha1: 27ecfacc656102880cd622051023f56ced8a1133 Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNh  tw/=(@DKEYSSH2DKEYSSH2DKEYSSH2D Revision-number: 1339 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.820622Z PROPS-END Revision-number: 1340 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.844027Z PROPS-END Revision-number: 1341 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:03.851131Z PROPS-END Revision-number: 1342 Prop-content-length: 209 Content-length: 209 K 7 svn:log V 108 Increase cfg.line_codepage buffer size to cope with the explanatory text added in a recent unicode.c patch. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-30T09:50:40.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 251755a8f2e9a6fe3066aa75abf21377 Text-delta-base-sha1: 53d73c9689b99955166b2fd5665d2fc9ada1e11d Text-content-length: 24 Text-content-md5: cf7c51ec8b3cae4e899ce2dbe8f8e8ab Text-content-sha1: 6f445129b51cab678b72be7f6185f4746f6edcba Content-length: 65 K 15 cvs2svn:cvs-rev V 5 1.117 PROPS-END SVNZ[ }[128 Revision-number: 1343 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2001-10-30T15:37:09.000000Z K 7 svn:log V 60 Add the `will you write an SSH server' question to the FAQ. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: db4c8504eb86ab0d7c8924bd4ef8a571 Text-delta-base-sha1: 0fb3724a54ed552507ff1abbb4323e19518f955a Text-content-length: 735 Text-content-md5: 2093f886aa1f98bc7d2cfa3940535655 Text-content-sha1: 554dfdfbd05640561bb5f677c3ed6c595acf9aba Content-length: 774 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNt< D DlS{faq-server} Will you write an SSH server for the PuTTY suite, to go with the client? No. The only reason we might want to would be if we could easily re-use existing code and significantly cut down the effort. We don't believe this is the case; there just isn't enough common ground between an SSH client and server to make it worthwhile. If someone else wants to use bits of PuTTY in the process of writing a Windows SSH server, they'd be perfectly welcome to of course, but I really can't see it being a lot less effort for us to do that than it would be for us to write a server from the ground up. We don't have time, and we don't have motivation. The code is available if anyone else wants to try it Revision-number: 1344 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 35 Tidy up SSH packet-level debugging K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-30T20:35:29.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bfc761b6192aba2a38c0df70890d258d Text-delta-base-sha1: 6bded563b943cb37c94459d14b827449caa06e2d Text-content-length: 544 Text-content-md5: f60ce0c914030415bbf7da8f2b0cb49c Text-content-sha1: 69def8a7b8575a94a6f10289adc460f4a7920922 Content-length: 585 K 15 cvs2svn:cvs-rev V 5 1.173 PROPS-END SVN b0;3rbVY'Q if (ssh1_compressing) { unsigned char *compblk; int complen; #ifdef DUMP_PACKETS debug(("Packet payload pre-compression:\n")); dmemdump(pktout.body - 1, pktout.length + 1); #endif { unsigned char *newpayload; int newlen; #ifdef DUMP_PACKETS if (cscomp && cscomp != &ssh_comp_none) { debug(("Pre-compression payload:\n")); dmemdump(pktout.data + 5, pktout.length - 5); } #endifsword[100]; crBegin; /* * Request userauth protocol, and await a rmQ Revision-number: 1345 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 40 Tidy up the SERIOUS NETWORK ERROR fixes K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-30T20:57:22.000000Z PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cef420633183b4bf66a368f322d31738 Text-delta-base-sha1: 259620bb9d46437bf97c0608181b86d6f1414375 Text-content-length: 175 Text-content-md5: e98e64bc2da5d7a58ca2ea95cbe41697 Text-content-sha1: e38d6df3957cf39983a18925c965b13c43c4f2ed Content-length: 215 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNMj SM * Call this after an operation that might have tried to send on a * socket, to clean up any pending network errors. */ void net_pending_errors(void Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f60ce0c914030415bbf7da8f2b0cb49c Text-delta-base-sha1: 69def8a7b8575a94a6f10289adc460f4a7920922 Text-content-length: 1949 Text-content-md5: 3924a80fe19bbbc439e2c4e97846c578 Text-content-sha1: b49cb72af6a81741dc98bfc7b4ba7e094a97c422 Content-length: 1990 K 15 cvs2svn:cvs-rev V 5 1.174 PROPS-END SVN^r"GGi4G'/* * If the channel's remoteid is -1, we have sent * CHANNEL_OPEN for this channel, but it hasn't even been * acknowledged by the server. So we must set a close flag * on it now, and then when the server acks the channel * open, we can close it then. */ if (c->remoteid != -1) { if (ssh_version == 1) { send_packet(SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid, PKT_END); } else { ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_send(); } || c->type == CHAN_SOCKDATA_DORMANT if (c && c->closes) { /* * We have a pending close on this channel, * which we decided on before the server acked * the channel open. So now we know the * remoteid, we can close it again. */ send_packet(SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid, PKT_END'_]znqh1<R2]?_KEYBOARD_INTERACTIVE } method; static enum { AUTH_TYPE_NONE, AUTH_TYPE_PUBLICKEY, AUTH_TYPE_PUBLICKEY_OFFER_LOUD, AUTH_TYPE_PUBLICKEY_OFFER_QUIET, AUTH_TYPE_PASSWORD, AUTH_TYPE_KEYBOARD_INTERACTIVE, AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET } type; static int gotit, need_pw, can_pubkey, can_passwd, can_keyb_inter; static int tried_pubkey_config, tried_agent, tried_keyb_inter; static int kbd_inter_running; static int we_are_in; static int num_prompts, echo; static char username[100]; static char pwprompt[200]; static char password[100]; crBegin; /* * Request userauth protocol, and await a rif (c->u.pfd.s) pfd_confirm(c->u.pfd.s); if (c->closes) { /* * We have a pending close on this channel, * which we decided on before the server acked * the channel open. So now we know the * remoteid, we can close it again. */ } else if (pktin.type == SSH2_MSG_CHANNEL_OPEN_FAILURE Revision-number: 1346 Prop-content-length: 222 Content-length: 222 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-30T21:45:27.000000Z K 7 svn:log V 121 The other utilities should do the same processing of the hostname (parsing `user@' prefixes etc) that PuTTY proper does. PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a59dba53bce7e238ffbbc0220b7e6025 Text-delta-base-sha1: 2720842b414b6fcc9d61e0e5daf203a3cc7b2347 Text-content-length: 742 Text-content-md5: 68639dff71ed6fcb7394fe3e03008d51 Text-content-sha1: c8d8851d0138bd2f87cea755c9e3087f86a08eb3 Content-length: 782 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVN> LFL~@/* * Trim leading whitespace off the hostname if it's there. */ { int space = strspn(cfg.host, " \t"); memmove(cfg.host, cfg.host+space, 1+strlen(cfg.host)-space); } /* See if host is of the form user@host */ if (cfg.host[0] != '\0') { char *atsign = strchr(cfg.host, '@'); /* Make sure we're not overflowing the user field */ if (atsign) { if (atsign - cfg.host < sizeof cfg.username) { strncpy(cfg.username, cfg.host, atsign - cfg.host); cfg.username[atsign - cfg.host] = '\0'; } memmove(cfg.host, atsign + 1, 1 + strlen(atsign + 1)); } } /* * Trim a colon suffix off the hostname if it's there. */ cfg.host[strcspn(cfg.host, ":")] = '\0'; Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6d3d79a133fbe914fab584a82defc483 Text-delta-base-sha1: a80efde1ec311a7cfaccf59fe43865177afff9bd Text-content-length: 742 Text-content-md5: 4e9f5a9b93d0bf0a510c6e3d14abde8b Text-content-sha1: c95fd2bb7810de742bbc06410a31380f8640256a Content-length: 782 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN8 JXJhP * Trim leading whitespace off the hostname if it's there. */ { int space = strspn(cfg.host, " \t"); memmove(cfg.host, cfg.host+space, 1+strlen(cfg.host)-space); } /* See if host is of the form user@host */ if (cfg.host[0] != '\0') { char *atsign = strchr(cfg.host, '@'); /* Make sure we're not overflowing the user field */ if (atsign) { if (atsign - cfg.host < sizeof cfg.username) { strncpy(cfg.username, cfg.host, atsign - cfg.host); cfg.username[atsign - cfg.host] = '\0'; } memmove(cfg.host, atsign + 1, 1 + strlen(atsign + 1)); } } /* * Trim a colon suffix off the hostname if it's there. */ cfg.host[strcspn(cfg.host, ":")] = '\0'; Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d98803bd4da5308aee3678b3b05bf54 Text-delta-base-sha1: bdda2c673668cbc191c8762b8ef5def4bcc34338 Text-content-length: 741 Text-content-md5: 6d846df52f3d66538e695534ee866ba4 Text-content-sha1: d696b51bbac2b9eae758cc96952fe96f1ded2980 Content-length: 781 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVNpB J7JA/ * Trim leading whitespace off the hostname if it's there. */ { int space = strspn(cfg.host, " \t"); memmove(cfg.host, cfg.host+space, 1+strlen(cfg.host)-space); } /* See if host is of the form user@host */ if (cfg.host[0] != '\0') { char *atsign = strchr(cfg.host, '@'); /* Make sure we're not overflowing the user field */ if (atsign) { if (atsign - cfg.host < sizeof cfg.username) { strncpy(cfg.username, cfg.host, atsign - cfg.host); cfg.username[atsign - cfg.host] = '\0'; } memmove(cfg.host, atsign + 1, 1 + strlen(atsign + 1)); } } /* * Trim a colon suffix off the hostname if it's there. */ cfg.host[strcspn(cfg.host, ":")] = '\0'; Revision-number: 1347 Prop-content-length: 340 Content-length: 340 K 8 svn:date V 27 2001-10-30T22:02:15.000000Z K 7 svn:log V 239 Word-by-word (double-click) selection now spans line breaks if the line break was created by wrapping. (Equivalently, if the selection would _paste_ as a single word without a newline in the middle, then it will _select_ in the same way.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6901d694e4110acbe9ba4ddc33da59c7 Text-delta-base-sha1: be286fd7f6f070ae40fdeec9468dcd97b5ca980d Text-content-length: 821 Text-content-md5: de29f5cf56257902e198af1c15777a4f Text-content-sha1: dfa5a18ef69c71ea16c0ba0871a69e178fca4783 Content-length: 861 K 15 cvs2svn:cvs-rev V 4 1.88 PROPS-END SVNfrjhnow int topy = -count234(scrollback)1) { if (p.x < cols-1) { if (wordtype(ldata[p.x + 1]) == wvalue) p.x++; else break; } else { if (ldata[cols] & LATTR_WRAPPED) { unsigned long *ldata2; ldata2 = lineptr(p.y+1); if (wordtype(ldata2[0]) == wvalue) { p.x = 0; p.y++; ldata = ldata2; } else break; } else break; } } } else { while (1) { if (p.x > 0) { if (wordtype(ldata[p.x - 1]) == wvalue) p.x--; else break; } else { unsigned long *ldata2; if (p.y <= topy) break; ldata2 = lineptr(p.y-1); if ((ldata2[cols] & LATTR_WRAPPED) && wordtype(ldata2[cols-1]) == wvalue) { p.x = cols-1; p.y--; ldata = ldata2; } else break; } } Revision-number: 1348 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 Shrink the PuTTYgen window for 640x480 friendliness (thanks Jacob) K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-30T22:12:49.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7ea6cd8015c3cebf77a982334dd58ffa Text-delta-base-sha1: 27ecfacc656102880cd622051023f56ced8a1133 Text-content-length: 37 Text-content-md5: 376e71477095c3d96de1d06227cc455d Text-content-sha1: 9ddc983b19668f6da4d976da97b9c90f92e1ffa4 Content-length: 77 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN[,4, 4, 45 Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8c2213f7927558b307ba0f22f54cc4a7 Text-delta-base-sha1: 85b58892587c378b591671b4237d097bd29e7fe1 Text-content-length: 28 Text-content-md5: 64b586804134068523a2b398b895f580 Text-content-sha1: 2d1f316f63ba7b3915eac1fd544a1342577bb4a8 Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN55 % ,18, 270 Revision-number: 1349 Prop-content-length: 188 Content-length: 188 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-10-30T22:33:35.000000Z K 7 svn:log V 88 Add a couple more FAQs (`where's the Tunnels panel' and `how do I do in Plink'). PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2093f886aa1f98bc7d2cfa3940535655 Text-delta-base-sha1: 554dfdfbd05640561bb5f677c3ed6c595acf9aba Text-content-length: 628 Text-content-md5: 29f1eed730766d48a8d5dcd0a8fc245d Text-content-sha1: 21360b02143233e394047cb102732d8848c353d8 Content-length: 667 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN< Z2Z(tunnels} How do I use X forwarding and port forwarding? I can't find the Tunnels panel. If you're looking in the 0.51 release or earlier, the Tunnels panel isn't there. It was added in the development snapshots after 0.51, and releases 0.52 and onwards will contain it. \S{faq-options} How do I use all PuTTY's features (port forwarding, SSH v2 etc) in Plink? Plink is currently rather short of command line options to enable this sort of thing. You can use these features if you create a PuTTY saved session, and then use the name of the saved session on Plink's command line in place of a hostname Revision-number: 1350 Prop-content-length: 236 Content-length: 236 K 8 svn:date V 27 2001-10-31T18:50:09.000000Z K 7 svn:log V 135 Rectangular-block selection. Enabled by Alt+drag, unless you configure it to be the default in which case it's _dis_abled by Alt+drag. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cf7c51ec8b3cae4e899ce2dbe8f8e8ab Text-delta-base-sha1: 6f445129b51cab678b72be7f6185f4746f6edcba Text-content-length: 36 Text-content-md5: 4c5a0765e12ee5b1289ecf2b5e92e94a Text-content-sha1: 6bdb0e12cc0a1f524dad21854b552583b7c11848 Content-length: 77 K 15 cvs2svn:cvs-rev V 5 1.118 PROPS-END SVN[u xTect_select Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: efd9a7fff76126a5529d61d18b5348de Text-delta-base-sha1: 9216787f4448d158619cd1d0fef70f2f9cee32e2 Text-content-length: 91 Text-content-md5: 5f4d0afb7cb471c97a2f5cd0d8d08e75 Text-content-sha1: 64c4426ab4e2c82911ba65a88e221ccad9bd298e Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVNG<> kRuRectSelect", cfg->rect_selectRectSelect", 0, &cfg->rect_select Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: de29f5cf56257902e198af1c15777a4f Text-delta-base-sha1: dfa5a18ef69c71ea16c0ba0871a69e178fca4783 Text-content-length: 3493 Text-content-md5: 3d1508bd996e9fe3f4679b855f017507 Text-content-sha1: 17e723b402170de13f64f5f476ac4db2801b9e69 Content-length: 3533 K 15 cvs2svn:cvs-rev V 4 1.89 PROPS-END SVNr(#;g?qg0SRhh: m-]\?2mL44shMY" oR MO"P/* Product-order comparisons for rectangular block selection. */ #define posPlt(p1,p2) ( (p1).y <= (p2).y && (p1).x < (p2).x ) #define posPle(p1,p2) ( (p1).y <= (p2).y && (p1).x <= (p2).xLEXICOGRAPHIC, RECTANGULAR } seltyp, selectedif (seltype == LEXICOGRAPHIC) selected = posle(selstart, scrpos) && poslt(scrpos, selend); else selected = posPle(selstart, scrpos) && posPlt(scrpos, selend); tattr = (tattr ^ rv ^ (selected, int rectold_top_x; old_top_x = top.x; /* needed for rect==1/* * nlpos will point at the maximum position on this line we * should copy up to. So we start it at the end of the * line... */ nlpos.y = top.y; nlpos.x = cols; /* * ... move it backwards if there's unused space at the end * of the line (and also set `nl' if this is the case, * because in normal selection mode this means we need a * newline at the end)... */ /* * ... and then clip it to the terminal x coordinate if * we're doing rectangular selection. (In this case we * still did the above, so that copying e.g. the right-hand * column from a table doesn't fill with spaces on the * right.) */ if (rect) { if (nlpos.x > bottom.x) nlpos.x = bottom.x; nl = (top.y < bottom.y); } rect ? old_top_x :, 0if (seltype == LEXICOGRAPHIC) { selstart = sel_spread_half(selstart, -1); decpos(selend); selend = sel_spread_half(selend, +1); incpos(selend); }, int alt int default_seltype/* * Set the selection type (rectangular or normal) at the start * of a selection attempt, from the state of Alt. */ if (!alt ^ !cfg.rect_select) default_seltype = RECTANGULAR; else default_seltype = LEXICOGRAPHIC; if (selstate == NO_SELECTION) { seltype = default_seltype; } if (b == MBT_SELECT && a == MA_CLICK) { deselect(); selstate = ABOUT_TO; seltype = default_seltypeseltype == LEXICOGRAPHIC) { /* * For normal selection, we extend by moving * whichever end of the current selection is closer * to the mouse. */ if (posdiff(selpoint, selstart) < posdiff(selend, selstart) / 2) { selanchor = selend; decpos(selanchor); } else { selanchor = selstart; } } else { /* * For rectangular selection, we have a choice of * _four_ places to put selanchor and selpoint: the * four corners of the selection. */ if (2*selpoint.x < selstart.x + selend.x) selanchor.x = selend.x-1; else selanchor.x = selstart.x; if (2*selpoint.y < selstart.y + selend.y) selanchor.y = selend.y; else selanchor.y = selstart.yseltype == LEXICOGRAPHIC) { /* * For normal selection, we set (selstart,selend) to * (selpoint,selanchor) in some order. */ if (poslt(selpoint, selanchor)) { selstart = selpoint; selend = selanchor; incpos(selend); } else { selstart = selanchor; selend = selpoint; incpos(selend); } } else { /* * For rectangular selection, we may need to * interchange x and y coordinates (if the user has * dragged in the -x and +y directions, or vice versa). */ selstart.x = min(selanchor.x, selpoint.x); selend.x = 1+max(selanchor.x, selpoint.x); selstart.y = min(selanchor.y, selpoint.y); selend.y = max(selanchor.y, selpoint.y, (seltype == RECTANGULAR) Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fdf04d2260267415076e8bde349944c8 Text-delta-base-sha1: d39f301b52b1f17b9d63be5f2bd74e61d8b48dae Text-content-length: 31 Text-content-md5: 8d457ac65bae671e642fcaccfa088ce4 Text-content-sha1: aa7c8279fab2dcc00c653c09c1781bf763de26c8 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNR^u`252 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5fb5ab8318eae9411267766d93f599b9 Text-delta-base-sha1: 32b295ab955aa06fd0fa51d119e8c514e1e543fd Text-content-length: 671 Text-content-md5: d173acf96e1d45dacf4efd2ffba27f69 Text-content-sha1: d00e1c26c5f93be85274037dd11b9429430bbb9b Content-length: 712 K 15 cvs2svn:cvs-rev V 5 1.155 PROPS-END SVNr 1`zpk?o_0B XiKeZSELTYPESTATIC, IDC_SELTYPELEX, IDC_SELTYPERECT CheckRadioButton(hwnd, IDC_MBWINDOWS, IDC_MBXTERM, cfg.mouse_is_xterm ? IDC_MBXTERM : IDC_MBWINDOWS); CheckRadioButton(hwnd, IDC_SELTYPELEX, IDC_SELTYPERECT, cfg.rect_select == 0 ? IDC_SELTYPELEX : IDC_SELTYPERECTnr radioline(&cp, "Default selection mode (Alt+drag does the other one):", IDC_SELTYPESTATIC, 2, "&Normal", IDC_SELTYPELEX, "&Rectangular block", IDC_SELTYPERECT, NULLSELTYPELEX: case IDC_SELTYPERECT: cfg.rect_select = IsDlgButtonChecked(hwnd, IDC_SELTYPERECT Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 40c49dfbf45aa04face04581084923a5 Text-delta-base-sha1: 307512a11279d6b9bc3f045db3295a7174e5dd59 Text-content-length: 445 Text-content-md5: 3a45d3eb8cba517fd4afd33d592bd99a Text-content-sha1: 64530e24c9e43a3bd556be6709ad754c6b22c420 Content-length: 486 K 15 cvs2svn:cvs-rev V 5 1.164 PROPS-END SVNK;S\2(2LZ&gt )C8+z0%U\o, int alt, alt, altint is_alt_pressed(void) { BYTE keystate[256]; int r = GetKeyboardState(keystate); if (!r) return FALSE; if (keystate[VK_MENU] & 0x80) return TRUE; if (keystate[VK_RMENU] & 0x80) return TRUE; return FALSE, is_alt_pressed(), is_alt_pressed(), is_alt_pressed(), is_alt_pressed(), is_alt_pressed() Revision-number: 1351 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2001-10-31T18:51:07.000000Z K 7 svn:log V 33 Fix accelerators in Window panel K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d173acf96e1d45dacf4efd2ffba27f69 Text-delta-base-sha1: d00e1c26c5f93be85274037dd11b9429430bbb9b Text-content-length: 56 Text-content-md5: 46b11c39339e26c79615526714275616 Text-content-sha1: 015f41340c80337a7a9e5434f378877d62ad8cad Content-length: 97 K 15 cvs2svn:cvs-rev V 5 1.156 PROPS-END SVN ^@}|{nb sdikp w4ylt f&b Revision-number: 1352 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.279058Z PROPS-END Revision-number: 1353 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.285728Z PROPS-END Revision-number: 1354 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.294464Z PROPS-END Revision-number: 1355 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.301479Z PROPS-END Revision-number: 1356 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.307901Z PROPS-END Revision-number: 1357 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.315152Z PROPS-END Revision-number: 1358 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.333186Z PROPS-END Revision-number: 1359 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.339596Z PROPS-END Revision-number: 1360 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.346528Z PROPS-END Revision-number: 1361 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.354574Z PROPS-END Revision-number: 1362 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.362120Z PROPS-END Revision-number: 1363 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.370984Z PROPS-END Revision-number: 1364 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.383850Z PROPS-END Revision-number: 1365 Prop-content-length: 434 Content-length: 434 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-04T16:41:26.000000Z K 7 svn:log V 333 RDB's fix to full-screen mode. Apparently sorts out most of the fullscreen/maximised confusions, by treating fullscreen as a special case of maximised (fair enough). Removes dependency on multimon.h, but Wez thinks (though he was unable to test) that this version should naturally do the Right Thing on multi-monitor systems anyway. PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3a45d3eb8cba517fd4afd33d592bd99a Text-delta-base-sha1: 64530e24c9e43a3bd556be6709ad754c6b22c420 Text-content-length: 1313 Text-content-md5: 8f20915ed612868f01fa1a1112a7c2fe Text-content-sha1: 35a45b3377cc916a60bfd7b9fcc043a0d003608f Content-length: 1354 K 15 cvs2svn:cvs-rev V 5 1.165 PROPS-END SVN;l+h<(*],a=SP}>prev_rows, prev_cols; WINDOWPLACEMENT wp; LONG style; wp.length = sizeof(wp); GetWindowPlacement(hwnd, &wp); full_screen = !full_screen; if (full_screen) { if (wp.showCmd == SW_SHOWMAXIMIZED) { /* Ooops it was already 'zoomed' we have to unzoom it before * everything will work right. */ wp.showCmd = SW_SHOWNORMAL; SetWindowPlacement(hwnd, &wp); } style = GetWindowLong(hwnd, GWL_STYLE) & ~WS_CAPTION; style &= ~WS_VSCROLL; if (cfg.scrollbar_in_fullscreen) style |= WS_VSCROLL; SetWindowLong(hwnd, GWL_STYLE, style); /* This seems to be needed otherwize explorer doesn't notice * we want to go fullscreen and it's bar is still visible */ SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); wp.showCmd = SW_SHOWMAXIMIZED; SetWindowPlacement(hwnd, &wp); } else { style = GetWindowLong(hwnd, GWL_STYLE) | WS_CAPTION; style &= ~WS_VSCROLL; if (cfg.scrollbar) style |= WS_VSCROLL; SetWindowLong(hwnd, GWL_STYLE, style); /* Don't need to do a SetWindowPos as the resize will force a * full redraw. */ wp.showCmd = SW_SHOWNORMAL; SetWindowPlacement(hwnd, &wp); } Revision-number: 1366 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.545313Z PROPS-END Revision-number: 1367 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.553502Z PROPS-END Revision-number: 1368 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.560736Z PROPS-END Revision-number: 1369 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.567621Z PROPS-END Revision-number: 1370 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.576482Z PROPS-END Revision-number: 1371 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.583307Z PROPS-END Revision-number: 1372 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2001-11-07T13:39:54.000000Z K 7 svn:log V 143 Makefile fix: we've been compiling ssh.c separately because it needs $(VER) defining, but forgetting that it also needs the rest of the stuff! K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 32703adfd40079b132b2b33af70ba0d6 Text-delta-base-sha1: f5301fd7d0745374300e76985d14b017d782fa73 Text-content-length: 54 Text-content-md5: a82e380781b1cf0658a1e27927e52f6e Text-content-sha1: d742a31e23405b569c802c8b37478e3ba41c5dff Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVNXl !ECOMPAT) $(FWHACK) $(VER) $(XFLAGS Revision-number: 1373 Prop-content-length: 371 Content-length: 371 K 8 svn:date V 27 2001-11-07T22:22:53.000000Z K 7 svn:log V 270 Implement writing RTF to the clipboard (off by default), so that if you enable it text will paste into Word et al in the same font as PuTTY itself is displaying in. In particular, this will be a fixed- pitch font, so tables and `ls' and the like will naturally line up. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4c5a0765e12ee5b1289ecf2b5e92e94a Text-delta-base-sha1: 6bdb0e12cc0a1f524dad21854b552583b7c11848 Text-content-length: 92 Text-content-md5: e4a014549573a56e94340e8b4cfa3b8c Text-content-sha1: 78ed25ced19b841653ba9741737bb394a325bdd0 Content-length: 133 K 15 cvs2svn:cvs-rev V 5 1.119 PROPS-END SVNuDA';!Trtf_pastevoid get_unitab(int codepage, wchar_t * unitab, int ftyp Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5f4d0afb7cb471c97a2f5cd0d8d08e75 Text-delta-base-sha1: 64c4426ab4e2c82911ba65a88e221ccad9bd298e Text-content-length: 83 Text-content-md5: 18ebde69f41905b6feda3823331ffd11 Text-content-sha1: e07a9c3f222e72a1d70c555306ab7f029c053f19 Content-length: 123 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN<)6Ie(EwPasteRTF", cfg->rtf_pastePasteRTF", 0, &cfg->rtf_paste Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 14d1e158d8165cf29dd7202567fe0b31 Text-delta-base-sha1: 268e4ec2c8f3c6b2d39714437bfbdd94cfff7ed7 Text-content-length: 29 Text-content-md5: 7e03a6bfbba54da6d539c8cde365cb42 Text-content-sha1: eba79081144866e839d55d41fdd6eb5fa7090a2c Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNN RM(& Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 46b11c39339e26c79615526714275616 Text-delta-base-sha1: 015f41340c80337a7a9e5434f378877d62ad8cad Text-content-length: 281 Text-content-md5: 0b5eb51ed3475e8026fe67007c454c3e Text-content-sha1: dcd2c7dcc0c3d99b8760700e6e84bd996ef8290b Content-length: 322 K 15 cvs2svn:cvs-rev V 5 1.157 PROPS-END SVN.]E^tOLT>AV9IDC_RTFPASTECheckDlgButton(hwnd, IDC_RTFPASTE, cfg.rtf_pastef wxp hst nrcheckbox(&cp, "Paste to clipboard in RT&F as well as plain text", IDC_RTFPASTERTFPASTE: cfg.rtf_paste = IsDlgButtonChecked(hwnd, IDC_RTFPASTE Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8f20915ed612868f01fa1a1112a7c2fe Text-delta-base-sha1: 35a45b3377cc916a60bfd7b9fcc043a0d003608f Text-content-length: 4156 Text-content-md5: 1d6bd7dd586ea30a9d2a14f600b54435 Text-content-sha1: cec05c47a9289b354fc7ec358defb94aa71f7f90 Content-length: 4197 K 15 cvs2svn:cvs-rev V 5 1.166 PROPS-END SVNl5tFN8/Dn[tsK 7Ok=richedit#include 0x7E || tdata[tindex+i] < 0x20) totallen += 4; else totallen++; } if (rtfsize < rtflen + totallen + 3) { rtfsize = rtflen + totallen + 512; rtf = srealloc(rtf, rtfsize); } strcpy(rtf + rtflen, before); rtflen += blen; for (i = 0; i < multilen; i++) { if (tdata[tindex+i] == '\\' || tdata[tindex+i] == '{' || tdata[tindex+i] == '}') { rtf[rtflen++] = '\\'; rtf[rtflen++] = tdata[tindex+i]; } else if (tdata[tindex+i] == 0x0D || tdata[tindex+i] == 0x0A) { rtflen += sprintf(rtf+rtflen, "\\par\r\n"); } else if (tdata[tindex+i] > 0x7E || tdata[tindex+i] < 0x20) { rtflen += sprintf(rtf+rtflen, "\\'%02x", tdata[tindex+i]); } else { rtf[rtflen++] = tdata[tindex+i]; } } strcpy(rtf + rtflen, after); rtflen += alen; tindex += multilen; uindex++; } strcpy(rtf + rtflen, "}"); rtflen += 2; clipdata3 = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, rtflen); if (clipdata3 && (lock3 = GlobalLock(clipdata3)) != NULL) { strcpy(lock3, rtf); GlobalUnlock(clipdata3); } sfree(rtf); } else clipdata3 = NULLif (clipdata3) SetClipboardData(RegisterClipboardFormat(CF_RTF), clipdata3lD?=@H F D4JO\FpIDmMG!DmE@DQG!EqD D G) } else { style = GetWindowLong(hwnd, GWL_STYLE) | WS_CAPTION;&= ~WS_VSCROLL; if (cfg.scrollbar) |=S,); /* Don't need to do a Pos as the resize will force a * full redraw./ wp.showCmd = SW_SHOWNORMAPlacement&wp); } CheckMenuItem(GetSystemFALSE), IDM_FULLSCREEN, MF_BYCOMMAND|_screen ?CHECKED :UN); } Revision-number: 1374 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 Whoops - missed out a vital bit of RTF Unicode fallback handling K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-08T09:20:36.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1d6bd7dd586ea30a9d2a14f600b54435 Text-delta-base-sha1: cec05c47a9289b354fc7ec358defb94aa71f7f90 Text-content-length: 89 Text-content-md5: 004df5d659cd64b7ce51f3107012fc26 Text-content-sha1: fb66db9b6609516ffceb0d0214965427eca031a1 Content-length: 130 K 15 cvs2svn:cvs-rev V 5 1.167 PROPS-END SVN HLc%d\\u%d", multilen, D[Dlacement(hwnd, &wp); Revision-number: 1375 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.937025Z PROPS-END Revision-number: 1376 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:05.943235Z PROPS-END Revision-number: 1377 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2001-11-10T17:09:17.000000Z K 7 svn:log V 56 Oops - one missing set of the ssh1 throttling indicator K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3924a80fe19bbbc439e2c4e97846c578 Text-delta-base-sha1: b49cb72af6a81741dc98bfc7b4ba7e094a97c422 Text-content-length: 95 Text-content-md5: 36326b84e99b551c5cb6a8c11dbb413e Text-content-sha1: 3e30d975b4d856759f94332b586ebb50fab03c72 Content-length: 136 K 15 cvs2svn:cvs-rev V 5 1.175 PROPS-END SVN f^c->v.v1.throttling = 0%, AUTH_PASSWORD, AUTH Revision-number: 1378 Prop-content-length: 172 Content-length: 172 K 7 svn:log V 72 Remember to initialise p->nphases to zero in progress report structure. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-12T09:19:57.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 376e71477095c3d96de1d06227cc455d Text-delta-base-sha1: 9ddc983b19668f6da4d976da97b9c90f92e1ffa4 Text-content-length: 113 Text-content-md5: f31adf135a94b31ec7c92fca43ebd75a Text-content-sha1: ddea60a05019a71f77632ede3d764b4fb2bf83ee Content-length: 153 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNqSleINITIALISE: p->nphases = 0; break;progress_update(&prog, PROGFN_INITIALISE, 0, 0) Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0b6d3479fc08b1b38007ca9a66a464cd Text-delta-base-sha1: 2148f6af4ce98f4db0bdfe2a95f5f8f9d8a2bdc4 Text-content-length: 169 Text-content-md5: a0b5972ba4f5f0e9b664e0f2f60bf9cf Text-content-sha1: 7c4a7c7c1afc13ea7306b0f1c1ed2c4b2c05c133 Content-length: 209 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVNTp -2"INITIALISE 1 #define PROGFN_LIN_PHASE 2 #define PROGFN_EXP_PHASE 3 #define PROGFN_PHASE_EXTENT 4 #define PROGFN_READY 5 #define PROGFN_PROGRESS 6 Revision-number: 1379 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2001-11-13T10:34:14.000000Z K 7 svn:log V 50 Clarify the how-to-use-features-in-Plink question K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 29f1eed730766d48a8d5dcd0a8fc245d Text-delta-base-sha1: 21360b02143233e394047cb102732d8848c353d8 Text-content-length: 476 Text-content-md5: 58f71d95c04c4c4cbefa7650734012f1 Text-content-sha1: 3d0dd7c1c53fc0ee76fd12f23af60a397c96a75c Content-length: 515 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN L BvB ublic keys, port forwarding, SSH v2, etc.) in PSCP, PSFTP and Plink? The command-line tools are currently rather short of command line options to enable this sort of thing. However, you can use most of PuTTY's features if you create a PuTTY saved session, and then use the name of the saved session on the command line in place of a hostname. This works for PSCP, PSFTP and Plink (but don't expect port forwarding in the file transfer applications!) Revision-number: 1380 Prop-content-length: 290 Content-length: 290 K 7 svn:log V 189 Handle incoming SSH2_MSG_CHANNEL_REQUEST (by refusing all requests). Should have done this ages ago; the OpenSSH 3.0 ClientAliveInterval mechanism requires it so now it's really necessary. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-13T22:06:37.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 36326b84e99b551c5cb6a8c11dbb413e Text-delta-base-sha1: 3e30d975b4d856759f94332b586ebb50fab03c72 Text-content-length: 986 Text-content-md5: 09e4ea6aeafab9abf8df52327819bafc Text-content-sha1: cd4954e5461df724e48e6e1e59ea70b2a78e90e8 Content-length: 1027 K 15 cvs2svn:cvs-rev V 5 1.176 PROPS-END SVN%A*O0xjS?}UPEOFREQUEST) { unsigned localid; char *type; int typelen, want_reply; struct ssh_channel *c; localid = ssh2_pkt_getuint32(); ssh2_pkt_getstring(&type, &typelen); want_reply = ssh2_pkt_getbool(); /* * First, check that the channel exists. Otherwise, * we can instantly disconnect with a rude message. */ c = find234(ssh_channels, &localid, ssh_channelfind); if (!c) { char buf[80]; sprintf(buf, "Received channel request for nonexistent" " channel %d", localid); logevent(bufbufconnection_fatal(buf); ssh_state = SSH_STATE_CLOSED; crReturnV; } /* * We don't recognise any form of channel request, * so we now either ignore the request or respond * with CHANNEL_FAILURE, depending on want_reply. */ if (want_reply) { ssh2_pkt_init(SSH2_MSG_CHANNEL_FAILURE); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_send(); } Revision-number: 1381 Prop-content-length: 253 Content-length: 253 K 8 svn:date V 27 2001-11-13T22:39:46.000000Z K 7 svn:log V 152 Modify a comment to try to remind myself that the &-in-session-names hack (to create accelerators on the System menu) should have some official status. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 18ebde69f41905b6feda3823331ffd11 Text-delta-base-sha1: e07a9c3f222e72a1d70c555306ab7f029c053f19 Text-content-length: 118 Text-content-md5: 135a4a3a9f20e732ca01d1a0e53afa33 Text-content-sha1: 89a289753033e6e0c1883e67280bcdf003b1ecf7 Content-length: 158 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN) \\ /* * FIXME: perhaps we should ignore the first & in determining * sort order. Revision-number: 1382 Prop-content-length: 267 Content-length: 267 K 8 svn:date V 27 2001-11-13T23:13:07.000000Z K 7 svn:log V 166 Add a rant to the FAQ about host key checking. I'm _sick_ of people implementing a command line option to disable it and expecting us to cheerfully accept the patch. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 58f71d95c04c4c4cbefa7650734012f1 Text-delta-base-sha1: 3d0dd7c1c53fc0ee76fd12f23af60a397c96a75c Text-content-length: 1880 Text-content-md5: 9bf70825059c720e2d9729f803b24c58 Text-content-sha1: 0b98ee585be29db5f83d58deeb333aaafa79fffa Content-length: 1919 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNL ==Dhostkeys} Is there an option to turn off the annoying host key prompts? No, there isn't. And there won't be. Even if you write it yourself and send us the patch, we won't accept it. Those annoying host key prompts are the \e{whole point} of SSH. Without them, all the cryptographic technology SSH uses to secure your session is doing nothing more than making an attacker's job slightly harder; instead of sitting between you and the server with a packet sniffer, the attacker must actually subvert a router and start modifying the packets going back and forth. But that's not all that much harder than just sniffing; and without host key checking, it will go completely undetected by client or server. Host key checking is your guarantee that the encryption you put on your data at the client end is the \e{same} encryption taken off the data at the server end; it's your guarantee that it hasn't been removed and replaced somewhere on the way. Host key checking makes the attacker's job \e{astronomically} hard, compared to packet sniffing, and even compared to subverting a router. Instead of applying a little intelligence and keeping an eye on Bugtraq, the attacker must now perform a brute-force attack against at least one military-strength cipher. That insignificant host key prompt really does make \e{that} much difference. If you're having a specific problem with host key checking - perhaps you want an automated batch job to make use of PSCP or Plink, and the interactive host key prompt is hanging the batch process - then the right way to fix it is to add the correct host key to the Registry in advance. That way, you retain the \e{important} feature of host key checking: the right key will be accepted and the wrong ones will not. Adding an option to turn host key checking off completely is the wrong solution and we will not do it Revision-number: 1383 Prop-content-length: 323 Content-length: 323 K 8 svn:date V 27 2001-11-14T12:58:42.000000Z K 7 svn:log V 222 Yikes! sftp.c wasn't using the misc.h wrappered malloc functions, meaning that PSFTP couldn't meaningfully be debugged using Minefield. That's what I get for developing it under Unix and forgetting to port it properly :-/ K 10 svn:author V 5 simon PROPS-END Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a5ccd63596093ca935eaeaf010d368b1 Text-delta-base-sha1: 53041b9dfe70fa10c91a2828e51e0d4796cc22d1 Text-content-length: 68 Text-content-md5: 651fb8353eca49c452aecd28590bc9b0 Text-content-sha1: 24e9c63e06e893d530df8a77e0c992706f0d546b Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN'u ,Bemisc.h" #include "int64.h" #include "sftp.h" Revision-number: 1384 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:06.519474Z PROPS-END Revision-number: 1385 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:06.525882Z PROPS-END Revision-number: 1386 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:06.533304Z PROPS-END Revision-number: 1387 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:06.539884Z PROPS-END Revision-number: 1388 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:06.547327Z PROPS-END Revision-number: 1389 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:06.554293Z PROPS-END Revision-number: 1390 Prop-content-length: 394 Content-length: 394 K 8 svn:date V 27 2001-11-21T22:06:53.000000Z K 7 svn:log V 293 Send SSH2_MSG_NEWKEYS _before_ expecting to receive it, rather than after. Shouldn't make a difference for any server that previously worked, but we should now interoperate sensibly with servers that wait to receive our NEWKEYS before sending their own. Apparently Unisphere produce one such. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 09e4ea6aeafab9abf8df52327819bafc Text-delta-base-sha1: cd4954e5461df724e48e6e1e59ea70b2a78e90e8 Text-content-length: 52 Text-content-md5: f22a1f93e9557e151e70b420e93526fb Text-content-sha1: 23fa55f597f40d0bd169be10ea05c377513c419c Content-length: 93 K 15 cvs2svn:cvs-rev V 5 1.177 PROPS-END SVNgk-FghAAA Revision-number: 1391 Prop-content-length: 271 Content-length: 271 K 7 svn:log V 170 The dummy drag-list item wasn't being removed on a single-click or double-click (DL_BEGINDRAG followed immediately by DL_DROPPED with no intervening DL_DRAGGING). Fixed. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-21T22:16:04.000000Z PROPS-END Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8d457ac65bae671e642fcaccfa088ce4 Text-delta-base-sha1: aa7c8279fab2dcc00c653c09c1781bf763de26c8 Text-content-length: 420 Text-content-md5: b0ae7221e7afc50a0a4d69684a77b983 Text-content-sha1: 73f366db2d8a4fab28df6b33bc782178b3d27862 Content-length: 460 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN<4W{LNDif (hdl->dragging) { dest = pl_itemfrompt(dlm->hWnd, dlm->ptCursor, TRUE); if (dest > hdl->dummyitem) dest = hdl->dummyitem; DrawInsert (hwnd, dlm->hWnd, -1); }if (hdl->dragging) { hdl->dragging = 0; if (dest >= 0) { /* Correct for "missing" item. */ if (dest > hdl->srcitem) dest--; pl_moveitem(hwnd, hdl->listid, hdl->srcitem, dest); } Revision-number: 1392 Prop-content-length: 271 Content-length: 271 K 8 svn:date V 27 2001-11-21T22:23:40.000000Z K 7 svn:log V 170 Ctrl and Alt shouldn't reset the scrollback even if reset-on- keypress is enabled. (Shift already didn't, because that was necessary for Shift-Pg{Up,Dn} to work sanely.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 004df5d659cd64b7ce51f3107012fc26 Text-delta-base-sha1: fb66db9b6609516ffceb0d0214965427eca031a1 Text-content-length: 132 Text-content-md5: 4de7b1d8bd02a4564baa313e4ba26adc Text-content-sha1: 27476849ad4789dfa9ad68fa29286e48f487273c Content-length: 173 K 15 cvs2svn:cvs-rev V 5 1.168 PROPS-END SVN .iii && wParam != VK_MENU && wParam != VK_CONTROL[ .[; wp.showCmd = SW_SHOWMAXIMIZED; SetWindowP Revision-number: 1393 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2001-11-21T22:31:05.000000Z K 7 svn:log V 80 Make sure we always unhide the mouse pointer when the System menu is displayed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4de7b1d8bd02a4564baa313e4ba26adc Text-delta-base-sha1: 27476849ad4789dfa9ad68fa29286e48f487273c Text-content-length: 712 Text-content-md5: ff239f182f595188f8535fab1cffd2c9 Text-content-sha1: d24d926d8487ac5e76adad1897b797ee8ca2414e Content-length: 753 K 15 cvs2svn:cvs-rev V 5 1.169 PROPS-END SVNjGk[NO8 case SC_MOUSE * using the mouse. */ show_mouseptr(1 * using the keyboard. This might happen from within * TranslateKey, in which case it really wants to be * followed by a `space' character to actually _bring * the menu up_ rather than just sitting there in * `ready to appear' state. */ show_mouseptr(1); /* make sure pointer is visible yy otherwize explorer doesn't notice * we want to go fullscreen and it's bar is still visible */ SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED) Revision-number: 1394 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2001-11-21T22:48:20.000000Z K 7 svn:log V 86 Primitive protection against SSH2 not actually agreeing a cipher in either direction. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f22a1f93e9557e151e70b420e93526fb Text-delta-base-sha1: 23fa55f597f40d0bd169be10ea05c377513c419c Text-content-length: 541 Text-content-md5: 57bbda14ad31eece1cef083b27e44794 Text-content-sha1: 529f4ed7914a2f404da77e9d0dc457be48a97063 Content-length: 582 K 15 cvs2svn:cvs-rev V 5 1.178 PROPS-END SVNnw]w1Wif (!cscipher_tobe) { bombout(("Couldn't agree a client-to-server cipher (available: %s)", str)); crReturn(0); } if (!sccipher_tobe) { bombout(("Couldn't agree a server-to-client cipher (available: %s)", str)); crReturn(0); } A9xxAnd(); c->v.v2.locwindow = newwin; } } /* * Handle the SSH2 userauth and connection layers. */ static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt) { static enum { AUTH_INVALID, AUTH_PUBLICKEY_AGENT, AUTH_PUBLICKEY_FILE Revision-number: 1395 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2001-11-21T22:58:01.000000Z K 7 svn:log V 59 Ryan Finnie's extensions to the GUI feedback mode in pscp. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6d846df52f3d66538e695534ee866ba4 Text-delta-base-sha1: d696b51bbac2b9eae758cc96952fe96f1ded2980 Text-content-length: 1309 Text-content-md5: 0ce3e6884b993bb0b98d1f2e5cf7c693 Text-content-sha1: 1528e3ab9308a360f32f84dba4172cc693a9eb01 Content-length: 1349 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVNBO3\ A] ;NR[M-N*1#define WM_STATS_DONE ( WM_APP_BASE+408 ) #define WM_STATS_ETA ( WM_APP_BASE+409 ) #define WM_STATS_RATEBS ( WM_APP_BASE+410unsigned long statdone = 0; static unsigned long stateta = 0; static unsigned long statratebs, unsigned long done, unsigned long eta, unsigned long ratebs, unsigned long done, unsigned long eta, unsigned long ratebsdone != done) { send_msg((HWND) atoi(gui_hwnd), WM_STATS_DONE, (WPARAM) done); statdone = done; } if (stateta != eta) { send_msg((HWND) atoi(gui_hwnd), WM_STATS_ETA, (WPARAM) eta); stateta = eta; } if (statratebs != ratebs) { send_msg((HWND) atoi(gui_hwnd), WM_STATS_RATEBS, (WPARAM) ratebs); statratebs = ratebs int elap; elap = (unsigned long) difftime(now, start); if (now > start) ratebs = (float) done / elap; else ratebs = (float) done; if (ratebs < 1.0) eta = size - done; else eta = (unsigned long) ((size - done) / ratebs); sprintf(etastr, "%02ld:%02ld:%02ld", eta / 3600, (eta % 3600) / 60, eta % 60); pct = (int) (100 * (done * 1.0 / size)); if (gui_mode) /* GUI Adaptation - Sept 2000 */ gui_update_stats(name, size, pct, elap, done, eta, (unsigned long) ratebs); else { Revision-number: 1396 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2001-11-21T23:06:10.000000Z K 7 svn:log V 31 Add single-DES support in SSH2 K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 57bbda14ad31eece1cef083b27e44794 Text-delta-base-sha1: 529f4ed7914a2f404da77e9d0dc457be48a97063 Text-content-length: 305 Text-content-md5: 78f81ec20f39665dff944bef15cf15a2 Text-content-sha1: dc4d40b90501e338d01ec28a0557651436ae8f3d Content-length: 346 K 15 cvs2svn:cvs-rev V 5 1.179 PROPS-END SVNx]h0qOR. &ssh2_preferred_ciphers[n_preferred_ciphers] = &ssh2_des; n_preferred_ciphers++;nd(); c->v.v2.locwindow = newwin; } } /* * Handle the SSH2 userauth and connection layers. */ static void do_ssh2_authconn(unsigned char *in, int inlen9 Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a0b5972ba4f5f0e9b664e0f2f60bf9cf Text-delta-base-sha1: 7c4a7c7c1afc13ea7306b0f1c1ed2c4b2c05c133 Text-content-length: 20 Text-content-md5: b97c812e3f4a520269c6955c6c526026 Text-content-sha1: d1587a5c9b5492f301b3a229b9f73fbd6721354a Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVNp q Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8e3202c162758f090691297dd0eee7d3 Text-delta-base-sha1: a79e3d8594af0a7fbe6ed330e8aee80665e6c93a Text-content-length: 847 Text-content-md5: 4622b5305ab43b497937a6d2c15187fa Text-content-sha1: 8cd4a1cdec7e7bbd36b28262efee72d0116b7db9 Content-length: 887 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNK4D}Yif#||=SkCl%9*%-YB _cscskeys[0]); logevent("Initialised singlogevent("Initialised singstatic void des_ssh2ssh2_decrypt_blk(unsigned char *blk, int len) { des_cbc/* * Single DES in ssh2. It isn't clear that "des-cbc" is an official * cipher name, but ssh.com support it and apparently aren't the * only people to do so, so we sigh and implement it anyway. */ static const struct ssh2_cipher ssh_des_ssh2 = { des3_csiv, des_cskey, /* iv functions shared with 3des */ des3_sciv, des_sckey, des_ssh2_encrypt_blk, des_ssh2_decrypt_blk, "des-cbc", 8, 56static const struct ssh2_cipher *const des_list[] = { &ssh_des_ssh2 }; const struct ssh2_ciphers ssh2_des = { sizeof(des3_list) / sizeof(*des_list), descskey(key); des_sckey(key Revision-number: 1397 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2001-11-21T23:40:46.000000Z K 7 svn:log V 61 Comment/string tweaks to reflect new DES-in-SSH2 capability. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e4a014549573a56e94340e8b4cfa3b8c Text-delta-base-sha1: 78ed25ced19b841653ba9741737bb394a325bdd0 Text-content-length: 20 Text-content-md5: bdcd04e4668994edd5a48231ddadc5fe Text-content-sha1: 8cee677d5fd75699f8df8e7d808e30dba98e0ffe Content-length: 61 K 15 cvs2svn:cvs-rev V 5 1.120 PROPS-END SVND( 2 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0b5eb51ed3475e8026fe67007c454c3e Text-delta-base-sha1: dcd2c7dcc0c3d99b8760700e6e84bd996ef8290b Text-content-length: 30 Text-content-md5: 49f11f20304544c9febdb3616421f849 Text-content-sha1: 586bb156ebe334085d27bfdc58e1d9435f622ac3 Content-length: 71 K 15 cvs2svn:cvs-rev V 5 1.158 PROPS-END SVN s ", Revision-number: 1398 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:07.323088Z PROPS-END Revision-number: 1399 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:07.330432Z PROPS-END Revision-number: 1400 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:07.337716Z PROPS-END Revision-number: 1401 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:07.345123Z PROPS-END Revision-number: 1402 Prop-content-length: 183 Content-length: 183 K 8 svn:date V 27 2001-11-22T22:00:38.000000Z K 7 svn:log V 83 Add background-colour erase and `set this at the start of the session' to the FAQ. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9bf70825059c720e2d9729f803b24c58 Text-delta-base-sha1: 0b98ee585be29db5f83d58deeb333aaafa79fffa Text-content-length: 995 Text-content-md5: 31520d545815bdbd7c050fe3e455bf9f Text-content-sha1: 30e0ab9a13e4d89fd8c4c5e87599774fe9cb11e8 Content-length: 1034 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNdG!G|bce} When I run full-colour applications, I see areas of black space where colour ought to be. You almost certainly need to enable the \q{Use background colour to erase screen} setting in the Terminal panel. Note that if you do this in mid-session, it won't take effect until you reset the terminal (see \k{faq-resetterm}). \S{faq-resetterm} When I change some terminal settings, nothing happens. Some of the terminal options (notably Auto Wrap and background-colour screen erase) actually represent the \e{default} setting, rather than the currently active setting. The server can send sequences that modify these options in mid-session, but when the terminal is reset (by server action, or by you choosing \q{Reset Terminal} from the System menu) the defaults are restored. If you want to change one of these options in the middle of a session, you will find that the change does not immediately take effect. It will only take effect once you reset the terminal Revision-number: 1403 Prop-content-length: 232 Content-length: 232 K 7 svn:log V 131 Make it clear that you can't save a hostname into Default Settings, and also make it clear why not and what you should do instead. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-23T12:48:14.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: caf76c39da76dfee7887126533a4343b Text-delta-base-sha1: 0d14f40bb1e304f553e0893031f796f4730fd78b Text-content-length: 417 Text-content-md5: 8beaba2d8a8f5b24feec1ab0dabc8749 Text-content-sha1: 377af4f2f619950f460fbf57700cda85cffe4448 Content-length: 457 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN9B LpINote that PuTTY does not allow you to save a host name into the Default Settings entry. This ensures that when PuTTY is started up, the host name box is always empty, so a user can always just type in a host name and connect. If there is a specific host you want to store the details of how to connect to, you should create a saved session, which will be separate from the Default Settings Revision-number: 1404 Prop-content-length: 224 Content-length: 224 K 7 svn:log V 123 Ensure we ignore a hostname in Default Settings, if a perverse user has set one up using regedit. It badly confuses Plink. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-23T12:51:23.000000Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 135a4a3a9f20e732ca01d1a0e53afa33 Text-delta-base-sha1: 89a289753033e6e0c1883e67280bcdf003b1ecf7 Text-content-length: 171 Text-content-md5: c54a8573afe71e04ea57f9be74fb0aa5 Text-content-sha1: 6680143d12b188f7abc772791ae8dc3c7f97a66f Content-length: 211 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN b kf'if (do_host) { gpps(sesskey, "HostName", "", cfg->host, sizeof(cfg->host)); } else { cfg->host[0] = '\0'; /* blank hostname */ } Revision-number: 1405 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2001-11-23T19:12:28.000000Z K 7 svn:log V 40 Glenn Maynard's IMM cursor position fix K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ff239f182f595188f8535fab1cffd2c9 Text-delta-base-sha1: d24d926d8487ac5e76adad1897b797ee8ca2414e Text-content-length: 136 Text-content-md5: c35ad1e550809b9ddbddba9d46e501ac Text-content-sha1: ee4e6a970580e8047c811b13778c9758a104a829 Content-length: 177 K 15 cvs2svn:cvs-rev V 5 1.170 PROPS-END SVN@i@W + offset_width; cf.ptCurrentPos.y = y * font_height + offse!; /* This seems to be needed Revision-number: 1406 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2001-11-24T11:56:24.000000Z K 7 svn:log V 30 Glenn Maynard's other IME fix K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c35ad1e550809b9ddbddba9d46e501ac Text-delta-base-sha1: ee4e6a970580e8047c811b13778c9758a104a829 Text-content-length: 1531 Text-content-md5: 721e281e283a03cc7f8cbefc88f9e6a2 Text-content-sha1: 0a1aa97f79d9cd0a56866827de2b4adae2589b31 Content-length: 1572 K 15 cvs2svn:cvs-rev V 5 1.171 PROPS-END SVNF/u& , ~LOGFONT lfontlfont.lfHeight = font_height; lfont.lfWidth = font_width; lfont.lfEscapement = 0; lfont.lfOrientation = 0; lfont.lfWeight = fw_dontcare; lfont.lfItalic = FALSE; lfont.lfUnderline = FALSE; lfont.lfStrikeOut = FALSE; lfont.lfCharSet = cfg.fontcharset; lfont.lfOutPrecision = OUT_DEFAULT_PRECIS; lfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; lfont.lfQuality = DEFAULT_QUALITY; lfont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE; strncpy(lfont.lfFaceName, cfg.font, LF_FACESIZNOTIFY: if(wParam == IMN_SETOPENSTATUS) { HIMC hImc = ImmGetContext(hwnd); ImmSetCompositionFont(hImc, &lfont); ImmReleaseContext(hwnd, hImc); return 0!ww!window(2); /* start */ } } /* * Toggle full screen mode. Thanks to cwis@nerim.fr for the * implementation. * Revised by */ static void flip_full_screen(void) { WINDOWPLACEMENT wp; LONG style; wp.length = sizeof(wp); GetWindowPlacement(hwnd, &wp); full_screen = !full_screen; if (full_screen) { if (wp.showCmd == SW_SHOWMAXIMIZED) { /* Ooops it was already 'zoomed' we have to unzoom it before * everything will work right. */ wp.showCmd = SW_SHOWNORMAL; SetWindowPlacement(hwnd, &wp); } style = GetWindowLong(hwnd, GWL_STYLE) & ~WS_CAPTION; style &= ~WS_VSCROLL; if (cfg.scrollbar_in_fullscreen) style |= WS_VSCROLL; SetWindowLong(hwnd, GWL_STYLE, style) Revision-number: 1407 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2001-11-24T13:11:28.000000Z K 7 svn:log V 40 Jacob's fix to the resize-behaviour GUI K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 49f11f20304544c9febdb3616421f849 Text-delta-base-sha1: 586bb156ebe334085d27bfdc58e1d9435f622ac3 Text-content-length: 201 Text-content-md5: 70b09154853009ae5e0ddb8cf18f9140 Text-content-sha1: 7a049d64c10c592b9167638c38921cc5a2321b81 Content-length: 242 K 15 cvs2svn:cvs-rev V 5 1.159 PROPS-END SVNx N^-o<=F sdikp w4ylt fWhen window is resi&zed, change:", IDC_RESIZESTATIC, 3, "Terminal size", IDC_RESIZETERM, "Font size", IDC_RESIZEFONT, "Forbid resize Revision-number: 1408 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:07.702509Z PROPS-END Revision-number: 1409 Prop-content-length: 261 Content-length: 261 K 7 svn:log V 160 Make use of the new section-relabelling in Buttress to arrange for all the FAQ questions to be cross-referenced as `question A.1.2' instead of `section A.1.2'. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-24T17:51:26.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 31520d545815bdbd7c050fe3e455bf9f Text-delta-base-sha1: 30e0ab9a13e4d89fd8c4c5e87599774fe9cb11e8 Text-content-length: 2611 Text-content-md5: 31c6cfde7b1973e0b36f1dc609039c81 Text-content-sha1: 046c9c6b840c0ec54da25cb2621061b81c219dc2 Content-length: 2651 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNdN;i *g:? LLOM@lNVb7A BCb]Qqse3@@NBIF"@Y u:8%PUZQ'p"@C5_M"\,1w5=Bg*#<hfEz*A#{question{question{question{question{question} Does PuTTY support storing its settings in a {question} Does PuTTY support full-screen mode, like a DOS box? Not in the 0.51 release, but it has been added since then. \S{faq-password}{question} Does PuTTY have the ability to remember my password {question} Is there an option to turn off the annoying host {question} Will you write an SSH server for the PuTTY suite, to {question{question{question{question{question{question} Is the SSH or Telnet code available as a Visual Basic {question} How can I use PuTTY to make an SSH connection from {question{question{question{question} How can I create a Windows shortcut to start a {question} How can I start an SSH session straight from the {question} How do I copy and paste between PuTTY and other {question} How do I use X forwarding and port forwarding? I {question} How do I use all PuTTY's features (public keys, port {question} How do I use PSCP.EXE? When I double-click it gives me {question} How do I use PSCP to copy a file whose name has {question} Why do I see \q{Incorrect MAC received on {question} I clicked on a colour in the Colours panel, and the {question} Plink on Windows 95 says it can't find {question} My PuTTY sessions close after an hour and tell me {question} After trying to establish an SSH 2 connection, {question} When I run full-colour applications, I see areas of {question} When I change some terminal settings, nothing {question} I can't type characters that require the {question} My PuTTY sessions unexpectedly close after they {question} PuTTY's network connections time out too quickly {question{question} When I \cw{cat} a binary file, my window title {question} My keyboard stops working once PuTTY displays the {question} Is it safe for me to download PuTTY and use it on a {question} What does PuTTY leave on a system? How can I clean {question} How come PuTTY now supports DSA, when the website used {question} Would you like me to register you a nicer {question} Would you like free web hosting for the PuTTY web site? We already have some, thanks. \S{faq-sourceforge}{question} Why don't you move PuTTY to {question} Why can't I subscribe to the putty-bugs mailing {question} If putty-bugs isn't a general-subscription {question{question Revision-number: 1410 Prop-content-length: 658 Content-length: 658 K 8 svn:date V 27 2001-11-25T10:24:29.000000Z K 7 svn:log V 557 Jacob's patch to make full-screen mode available even when Alt-Enter isn't configured to do it: we now have a sysmenu option for it. In addition, there's a special case such that clicking the top left pixel on the screen in full-screen mode brings up the sysmenu (so you can still get at the sysmenu in FS mode without Alt-anything configured to bring it up and without ghastly fiddling with the Windows key). Also Change Settings while in full-screen mode now adds/removes the scrollbar in response to scrollbar_in_fullscreen rather than scrollbar (oops). K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 721e281e283a03cc7f8cbefc88f9e6a2 Text-delta-base-sha1: 0a1aa97f79d9cd0a56866827de2b4adae2589b31 Text-content-length: 1763 Text-content-md5: 9273c12662ac4dc4ef756a9856d003a6 Text-content-sha1: 200575044ec4d199edb096d9ad0b78cf6e191937 Content-length: 1804 K 15 cvs2svn:cvs-rev V 5 1.172 PROPS-END SVN- BA|LjM6z@}9=(cfg.resize_action == RESIZE_DISABLED) ? MF_GRAYED :{ /* Disable full-screen if resizing forbidden */ HMENU m = GetSystemMenu (hwnd, FALSE); EnableMenuItem(m, IDM_FULLSCREEN, MF_BYCOMMAND | (cfg.resize_action == RESIZE_DISABLED) ? MF_GRAYED : MF_ENABLED); /* Gracefully unzoom if necessary */ if (full_screen && (cfg.resize_action == RESIZE_DISABLED)) { flip_full_screen(); }full_screen ? cfg.scrollbar_in_fullscreen : /* * Special case: in full-screen mode, if the left * button is clicked in the very top left corner of the * window, we put up the System menu instead of doing * selection. */ if (full_screen && press && button == MBT_LEFT && X_POS(lParam) == 0 && Y_POS(lParam) == 0) { SendMessage(hwnd, WM_SYSCOMMAND, SC_MOUSEMENU, 0); return 0; } && (cfg.resize_action != RESIZE_DISABLED)"  = 0; long beepdiff; beepdiff = GetTickCount() - lastbeep; if (beepdiff >= 0 && beepdiff < 50) return; MessageBeep(MB_OK); /* * The above MessageBeep call takes time, so we record the * time _after_ it finishes rather than before it starts. */ lastbeep = GetTickCount(); } else if (mode == BELL_WAVEFILE) { if (!PlaySound(cfg.bell_wavefile, NULL, SND_ASYNC | SND_FILENAME)) { char buf[sizeof(cfg.bell_wavefile) + 80]; sprintf(buf, "Unable to play sound file\n%s\n" "Using default sound instead", cfg.bell_wavefile); MessageBox(hwnd, buf, "PuTTY Sound Error", MB_OK | MB_ICONEXCLAMATION); cfg.beep = BELL_DEFAULT; } } /* Otherwise, either visual bell or disabled; do nothing here */ if (!has_focus) { flash_ Revision-number: 1411 Prop-content-length: 263 Content-length: 263 K 8 svn:date V 27 2001-11-25T11:36:49.000000Z K 7 svn:log V 162 Rob Wood's patch to provide standard -L and -R options for port forwarding in Plink. Cleaned up a bit to remove segfaults and work correctly with saved sessions. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 68639dff71ed6fcb7394fe3e03008d51 Text-delta-base-sha1: c8d8851d0138bd2f87cea755c9e3087f86a08eb3 Text-content-length: 1416 Text-content-md5: 41dc47a0e69e36e7a46684aaec9ea90a Text-content-sha1: d1eb2becf378b04aedbdea1d1651fefd68b3b1cf Content-length: 1456 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN."X5*!+QJ|u*fprintf(" -L listen-port:host:port Forward local port to " "remote address\n"); printf(" -R listen-port:host:port Forward remote port to" " local address char extra_portfwd[sizeof(cfg.portfwd)](!strcmp(p, "-L") || !strcmp(p, "-R")) && argc > 1) { char *fwd, *ptr; int i=0; --argc, fwd = *++argv; ptr = extra_portfwd; /* if multiple forwards, find end of list */ if (ptr[0]=='R' || ptr[0]=='L') { for (i = 0; i < sizeof(extra_portfwd) - 2; i++) if (ptr[i]=='\000' && ptr[i+1]=='\000') break; ptr = ptr + i + 1; /* point to next forward slot */ } ptr[0] = p[1]; /* insert a 'L' or 'R' at the start */ strncpy(ptr+1, fwd, sizeof(extra_portfwd) - i); ptr[strcspn(ptr, ":")] = '\t'; /* replace first : with \t */ ptr[strlen(ptr)+1] = '\000'; /* append two '\000' */ extra_portfwd[sizeof(extra_portfwdAdd extra port forwardings (accumulated on command line) to * cfg. */ { int i; char *p; p = extra_portfwd; i = 0; while (cfg.portfwd[i]) i += strlen(cfg.portfwd+i) + 1; while (*p) { if (strlen(p)+2 > sizeof(cfg.portfwd)-i) { fprintf(stderr, "Internal fault: not enough space for all" " port forwardings\n"); break; } strncpy(cfg.portfwd+i, p, sizeof(cfg.portfwd)-i-1); i += strlen(cfg.portfwd+i) + 1; cfg.portfwd[i] = '\0'; p += strlen(p)+ Revision-number: 1412 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Oops - fix another segfault in that -L and -R code K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-25T12:23:34.000000Z PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 41dc47a0e69e36e7a46684aaec9ea90a Text-delta-base-sha1: d1eb2becf378b04aedbdea1d1651fefd68b3b1cf Text-content-length: 78 Text-content-md5: c9d559404bed62c73b30ac5ed4eaf486 Text-content-sha1: 49e8b86f56bd5df84c88771a5bafe627f806d8be Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN.A1C+C" , *qq = strchr(ptr, ':'); if (q) *q = '\t'; Revision-number: 1413 Prop-content-length: 729 Content-length: 729 K 8 svn:date V 27 2001-11-25T14:31:46.000000Z K 7 svn:log V 628 INCOMPATIBLE CHANGE to the SSH2 private key file format. There is now a passphrase-keyed MAC covering _all_ important data in the file, including the public blob and the key comment. Should conclusively scupper any attacks based on nobbling the key file in an attempt to sucker the machine that decrypts it. MACing the comment field also protects against a key-substitution attack (if someone's worked out a way past our DSA protections and can extract the private key from a signature, swapping key files and substituting comments might just enable them to get the signature they need to do this. Paranoid, but might as well). K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8151dee11610cb1a52b6ccf56f4db5f4 Text-delta-base-sha1: 659ed580c5be7e9a6f38b2941faf07d9f1761fdf Text-content-length: 643 Text-content-md5: 7c07574df58e7cd6b08062c917d52703 Text-content-sha1: c5e62e032e3acdb37d9518757e821212e452c7c2 Content-length: 683 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNTG hOhDWarn about the obsolescent key file format. */ void old_keyfile_warning(void) { static const char mbtitle[] = "PuTTY Key File Warning"; static const char message[] = "You are loading an SSH 2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "PuTTY may stop supporting this private key format,\n" "so we recommend you convert your key to the new\n" "format.\n" "\n" "You can perform this conversion by loading the key\n" "into PuTTYgen and then saving it again."; MessageBox(NULL, message, mbtitle, MB_OK) Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c9d559404bed62c73b30ac5ed4eaf486 Text-delta-base-sha1: 49e8b86f56bd5df84c88771a5bafe627f806d8be Text-content-length: 579 Text-content-md5: 485ca029d02734e27ebd06b1a599b9a8 Text-content-sha1: 8ccb61276f8169aae04618441cdae4e1a720c835 Content-length: 619 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNAm ((//* * Warn about the obsolescent key file format. */ void old_keyfile_warning(void) { static const char message[] = "You are loading an SSH 2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "PuTTY may stop supporting this private key format,\n" "so we recommend you convert your key to the new\n" "format.\n" "\n" "Once the key is loaded into PuTTYgen, you can perform\n" "this conversion simply by saving it again.\n"; fputs(message, stderr); Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4e9f5a9b93d0bf0a510c6e3d14abde8b Text-delta-base-sha1: c95fd2bb7810de742bbc06410a31380f8640256a Text-content-length: 574 Text-content-md5: 880c149de9bad60fdea4f088184ffed8 Text-content-sha1: cbf8735de69bc7deb656937d46dd8cdbe73a0606 Content-length: 614 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN 6"c"1YWarn about the obsolescent key file format. */ void old_keyfile_warning(void) { static const char message[] = "You are loading an SSH 2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "PuTTY may stop supporting this private key format,\n" "so we recommend you convert your key to the new\n" "format.\n" "\n" "Once the key is loaded into PuTTYgen, you can perform\n" "this conversion simply by saving it again.\n"; fputs(message, stderr); Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f31adf135a94b31ec7c92fca43ebd75a Text-delta-base-sha1: ddea60a05019a71f77632ede3d764b4fb2bf83ee Text-content-length: 655 Text-content-md5: 987d96c161bf0819da5f58080112355d Text-content-sha1: 04fbfbe1f8d8dc2ab9fad6e4065f3d8d811854c9 Content-length: 695 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNqj twtr/* * Warn about the obsolescent key file format. */ void old_keyfile_warning(void) { static const char mbtitle[] = "PuTTY Key File Warning"; static const char message[] = "You are loading an SSH 2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "PuTTY may stop supporting this private key format,\n" "so we recommend you convert your key to the new\n" "format.\n" "\n" "Once the key is loaded into PuTTYgen, you can perform\n" "this conversion simply by saving it again."; MessageBox(NULL, message, mbtitle, MB_OK) Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0ce3e6884b993bb0b98d1f2e5cf7c693 Text-delta-base-sha1: 1528e3ab9308a360f32f84dba4172cc693a9eb01 Text-content-length: 577 Text-content-md5: 971ed4affab62146558c51ac2bc53176 Text-content-sha1: 7bafce30d2e559548937dba63f3264fbf81f15ea Content-length: 617 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVNO{ &[&zU * Warn about the obsolescent key file format. */ void old_keyfile_warning(void) { static const char message[] = "You are loading an SSH 2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "PuTTY may stop supporting this private key format,\n" "so we recommend you convert your key to the new\n" "format.\n" "\n" "Once the key is loaded into PuTTYgen, you can perform\n" "this conversion simply by saving it again.\n"; fputs(message, stderr); Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b97c812e3f4a520269c6955c6c526026 Text-delta-base-sha1: d1587a5c9b5492f301b3a229b9f73fbd6721354a Text-content-length: 133 Text-content-md5: 5c83a4e1d46c28159f4342e1bffff14d Text-content-sha1: c1fbbc80c1759f05fb15ade4a4f72c6318f9d7f4 Content-length: 173 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNtt /* * Need this to warn about support for the original SSH2 keyfile * format. */ void old_keyfile_warning(void); Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0286dfa6293cfba966a90a2f83ce4ce8 Text-delta-base-sha1: 61b91c395939060033cec79712ddaf77737f20a2 Text-content-length: 427 Text-content-md5: 3e4ab6358bf6258070fe962f6fc4c65a Text-content-sha1: a6cb96bf0495fd27890d8c216ca06ab81c4079a8 Content-length: 467 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNS<+zeQL4 + xlen. */ bloblen = 4 /* * Check the obsolete hash in the old DSS key format. */ hashlen = -1; getstring(&pb, &priv_len, &hash, &hashlen); if (hashlen == 20) { SHA_Init(&s); sha_mpint(&s, dss->p); sha_mpint(&s, dss->q); sha_mpint(&s, dss->g); SHA_Final(&s, digest); if (0 != memcmp(hash, digest, 20)) { dss_freekey(dss); return NULL; } Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4f03b605479f15aef2266e9475f2ac5c Text-delta-base-sha1: 3b282d2641eb009b22459988f61f4c8b5c2e04d1 Text-content-length: 4323 Text-content-md5: 53b37499a0bc0906f8fc20770c67546c Text-content-sha1: 7856da3cd448c009730170e8af490d0ec373e715 Content-length: 4363 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN,0$MOIRdEBYNT'{-{:!v[{Sc.l8lAO (bF@Abh!Xs$Sb"z3m{ B]>#include "misc2[ string hash 20-byte hash of mpints p || q || g only in old format ] * * Finally, there is a line saying "Private-MAC: " plus a hex * representation of a HMAC-SHA-1 of: * * string name of algorithm ("ssh-dss", "ssh-rsa") * string encryption type * string comment * string public-blob * string private-plaintext (the plaintext version of the * private part, including the final * padding)For backwards compatibility with snapshots between 0.51 and * 0.52, we also support the older key file format, which begins * with "PuTTY-User-Key-File-1" (version number differs). In this * format the Private-MAC: field only covers the private-plaintext * field and nothing else (and without the 4-byte string length on * the front too). Moreover, for RSA keys the Private-MAC: field * can be replaced with a Private-Hash: field which is a plain * SHA-1 hash instead of an HMAC. This is not allowable in DSA * keys. (Yes, the old format was a mess. Guess why it changed :-encryption, old_fmt) goto error; if (0 == strcmp(header, "PuTTY-User-Key-File-2")) { old_fmt = 0; } else if (0 == strcmp(header, "PuTTY-User-Key-File-1")) { /* this is an old key file; warn and then continue */ old_keyfile_warning(); old_fmt = 1; } elseencryption = read_body(fp)) == NULL) goto error; if (!strcmp(encryption, "aes256-cbc")) { cipher = 1; cipherblk = 16; } else if (!strcmp(encryption, "none")) { cipher = 0; cipherblk = 1; } else { sfree(encryption); goto error; } && alg == &ssh_rsa && old_fmtMAC. */ { char realmac[41]; unsigned char binary[20]; unsigned char *macdata; int maclen; int free_macdata; if (old_fmt) { /* MAC (or hash) only covers the private blob. */ macdata = private_blob; maclen = private_blob_len; free_macdata = 0; } else { unsigned char *p; int namelen = strlen(alg->name); int enclen = strlen(encryption); int commlen = strlen(comment); maclen = (4 + namelen + 4 + enclen + 4 + commlen + 4 + public_blob_len + 4 + private_blob_len); macdata = smalloc(maclen); p = macdata; #define DO_STR(s,len) PUT_32BIT(p,(len));memcpy(p+4,(s),(len));p+=4+(len) DO_STR(alg->name, namelen); DO_STR(encryption, enclen); DO_STR(comment, commlen); DO_STR(public_blob, public_blob_len); DO_STR(private_blob, private_blob_len); free_macdata = 1; }SHA_Init(&s); SHA_Bytes(&s, header, sizeof(header)-1); if (passphrase) macdata, maclen,macdata, maclen, binary); } if (free_macdata) { memset(macdata, 0, maclen); sfree(macdata); } sfree(encryptionencryption) sfree(encryption(0 != strcmp(header, "PuTTY-User-Key-File-2") && 0 != strcmp(header, "PuTTY-User-Key-File-1")(0 != strcmp(header, "PuTTY-User-Key-File-2") && 0 != strcmp(header, "PuTTY-User-Key-File-1")MAC. */ { unsigned char *macdata; int maclen; unsigned char *p; int namelen = strlen(key->alg->name); int enclen = strlen(cipherstr); int commlen = strlen(key->comment); SHA_State s; unsigned char mackey[20]; char header[] = "putty-private-key-file-mac-key"; maclen = (4 + namelen + 4 + enclen + 4 + commlen + 4 + pub_blob_len + 4 + priv_encrypted_len); macdata = smalloc(maclen); p = macdata; #define DO_STR(s,len) PUT_32BIT(p,(len));memcpy(p+4,(s),(len));p+=4+(len) DO_STR(key->alg->name, namelen); DO_STR(cipherstr, enclen); DO_STR(key->comment, commlen); DO_STR(pub_blob, pub_blob_len); DO_STR(priv_blob_encrypted, priv_encrypted_len); SHA_Init(&s); SHA_Bytes(&s, header, sizeof(header)-1); if (passphrase) SHA_Bytes(&s, passphrase, strlen(passphrase)); SHA_Final(&s, mackey); hmac_sha1_simple(mackey, 20, macdata, maclen, priv_mac); memset(macdata, 0, maclen); sfree(macdata); memset(mackey, 0, sizeof(mackey)); memset(&s, 0, sizeof(s))2fprintf(fp, "Private-MAC sfree(pub_blob); memset(priv_blob, 0, priv_blob_len); sfree(priv_blob); sfree(priv_blob_encrypted); return 1; } /* Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 70b09154853009ae5e0ddb8cf18f9140 Text-delta-base-sha1: 7a049d64c10c592b9167638c38921cc5a2321b81 Text-content-length: 649 Text-content-md5: 7f140364180df6b870076ca4e9b22ce7 Text-content-sha1: 13d0b4fbba5f014b13ad0c17dd699a169501c301 Content-length: 690 K 15 cvs2svn:cvs-rev V 5 1.160 PROPS-END SVNxksxs /* * Warn about the obsolescent key file format. */ void old_keyfile_warning(void) { static const char mbtitle[] = "PuTTY Key File Warning"; static const char message[] = "You are loading an SSH 2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "PuTTY may stop supporting this private key format,\n" "so we recommend you convert your key to the new\n" "format.\n" "\n" "You can perform this conversion by loading the key\n" "into PuTTYgen and then saving it again."; MessageBox(NULL, message, mbtitle, MB_OK); } Revision-number: 1414 Prop-content-length: 574 Content-length: 574 K 8 svn:date V 27 2001-11-25T15:21:25.000000Z K 7 svn:log V 473 Add support for most of the ESC[t sequences, which xterm uses to manipulate the window (minimise, maximise, front, back, move, resize) and report things about the window (is it minimised or maximised, how big is it, what's its title). Missing are ESC[4;X;Yt (resize to a specified pixel size; our resize code doesn't like it) and ESC[19;X;Yt (report size of _screen_ in _characters_, which it isn't even obvious how to do when you've got a variable font size). K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bdcd04e4668994edd5a48231ddadc5fe Text-delta-base-sha1: 8cee677d5fd75699f8df8e7d808e30dba98e0ffe Text-content-length: 298 Text-content-md5: d7e3813b2d1e355b2757e30a62d66712 Text-content-sha1: 90ad5c640940c15fb0569e26c0b1a0c7627bc43f Content-length: 339 K 15 cvs2svn:cvs-rev V 5 1.121 PROPS-END SVN(< GcEvoid set_iconic(int iconic); void move_window(int x, int y); void set_zorder(int top); void refresh_window(void); void set_zoomed(int zoomed); int is_iconic(void); void get_window_pos(int *x, int *y); void get_window_pixels(int *x, int *y); char *get_window_title(int icon); Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d1508bd996e9fe3f4679b855f017507 Text-delta-base-sha1: 17e723b402170de13f64f5f476ac4db2801b9e69 Text-content-length: 2535 Text-content-md5: ed727e9a4e8a90fa4094415aee783ec6 Text-content-sha1: f5a70f75b48ac94ed9b6d8966fd14aa4cd4aca55 Content-length: 2575 K 15 cvs2svn:cvs-rev V 4 1.90 PROPS-END SVN(E!N>E^Jcompatibility(VT340TEXT); request_resize(cols, def(esc_args[0], 24)); deselect(); } else if (esc_nargs >= 1 && esc_args[0] >= 1 && esc_args[0] < 24) { compatibility(OTHER); switch (esc_args[0]) { int x, y, len; char buf[80], *p; case 1: set_iconic(FALSE); break; case 2: set_iconic(TRUE); break; case 3: if (esc_nargs >= 3) { move_window(def(esc_args[1], 0), def(esc_args[2], 0)); } break; case 4: /* We should resize the window to a given * size in pixels here, but currently our * resizing code isn't healthy enough to * manage it. */ break; case 5: set_zorder(TRUE); /* move to top */ break; case 6: set_zorder(FALSE); /* move to bottom */ break; case 7: refresh_window(); break; case 8: if (esc_nargs >= 3) { request_resize(def(esc_args[1], cfg.width), def(esc_args[2], cfg.height)); } break; case 9: if (esc_nargs >= 2) set_zoomed(esc_args[1] ? TRUE : FALSE); break; case 11: ldisc_send(is_iconic() ? "\033[1t" : "\033[2t", 4, 0); break; case 13: get_window_pos(&x, &y); len = sprintf(buf, "\033[3;%d;%dt", x, y); ldisc_send(buf, len, 0); break; case 14: get_window_pixels(&x, &y); len = sprintf(buf, "\033[4;%d;%dt", x, y); ldisc_send(buf, len, 0); break; case 18: len = sprintf(buf, "\033[8;%d;%dt", cols, rows); ldisc_send(buf, len, 0); break; case 19: /* * Hmmm. Strictly speaking we * should return `the size of the * screen in characters', but * that's not easy: (a) window * furniture being what it is it's * hard to compute, and (b) in * resize-font mode maximising the * window wouldn't change the * number of characters. *shrug*. I * think we'll ignore it for the * moment and see if anyone * complains, and then ask them * what they would like it to do. */ break; case 20: p = get_window_title(TRUE); len = strlen(p); ldisc_send("\033]L", 3, 0); ldisc_send(p, len, 0); ldisc_send("\033\\", 2, 0); break; case 21: p = get_window_title(FALSE); len = strlen(p); ldisc_send("\033]l", 3, 0); ldisc_send(p, len, 0); ldisc_send("\033\\", 2, 0); break; } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9273c12662ac4dc4ef756a9856d003a6 Text-delta-base-sha1: 200575044ec4d199edb096d9ad0b78cf6e191937 Text-content-length: 1889 Text-content-md5: a6bc8010dc07a2245525d3a545cbbad8 Text-content-sha1: b14d41969f6e868fb18242f412cbf31e05391369 Content-length: 1930 K 15 cvs2svn:cvs-rev V 5 1.173 PROPS-END SVN!(Xint resizing; = 0; long".  /* * Minimise or restore the window in response to a server-side * request. */ void set_iconic(int iconic) { if (IsIconic(hwnd)) { if (!iconic) ShowWindow(hwnd, SW_RESTORE); } else { if (iconic) ShowWindow(hwnd, SW_MINIMIZE); } } /* * Move the window in response to a server-side request. */ void move_window(int x, int y) { SetWindowPos(hwnd, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } /* * Move the window to the top or bottom of the z-order in response * to a server-side request. */ void set_zorder(int top) { if (cfg.alwaysontop || full_screen) return; /* ignore */ SetWindowPos(hwnd, top ? HWND_TOP : HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } /* * Refresh the window in response to a server-side request. */ void refresh_window(void) { InvalidateRect(hwnd, NULL, TRUE); } /* * Maximise or restore the window in response to a server-side * request. */ void set_zoomed(int zoomed) { if (IsZoomed(hwnd) || full_screen) { if (!zoomed) { if (full_screen) flip_full_screen(); else ShowWindow(hwnd, SW_RESTORE); } } else { if (zoomed) ShowWindow(hwnd, SW_MAXIMIZE); } } /* * Report whether the window is iconic, for terminal reports. */ int is_iconic(void) { return IsIconic(hwnd); } /* * Report the window's position, for terminal reports. */ void get_window_pos(int *x, int *y) { RECT r; GetWindowRect(hwnd, &r); *x = r.left; *y = r.top; } /* * Report the window's pixel size, for terminal reports. */ void get_window_pixels(int *x, int *y) { RECT r; GetWindowRect(hwnd, &r); *x = r.right - r.left; *y = r.bottom - r.top; } /* * Return the window or icon title. */ char *get_window_title(int icon) { return icon ? icon_name : window_name; } Revision-number: 1415 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2001-11-25T16:57:45.000000Z K 7 svn:log V 184 Miscellaneous documentation updates. Finished a first draft of the Pageant chapter; wrote something about passphrase lengths; added \versionid to all chapters that didn't have it yet. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8beaba2d8a8f5b24feec1ab0dabc8749 Text-delta-base-sha1: 377af4f2f619950f460fbf57700cda85cffe4448 Text-content-length: 87 Text-content-md5: 666fe9730a9fbe83a8873cbbaf7b51b5 Text-content-sha1: 92497293be529ac79c757924bd8e3bb150a9d47c Content-length: 127 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNBCCB\versionid $Id: config.but,v 1.12 2001/11/25 16:57:45 simon Exp $ Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 31c6cfde7b1973e0b36f1dc609039c81 Text-delta-base-sha1: 046c9c6b840c0ec54da25cb2621061b81c219dc2 Text-content-length: 84 Text-content-md5: 3936b6ad084bb302094da15ad6957390 Text-content-sha1: a5e0ce99b52fdd3725114408316597ae50b72552 Content-length: 124 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNN@@N\versionid $Id: faq.but,v 1.11 2001/11/25 16:57:45 simon Exp $ Node-path: putty/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e81a8bfb4d0abb2acadb932e05509d0c Text-delta-base-sha1: 7b3d5972ad326e88af58fc02dc6faa82daf9d982 Text-content-length: 78 Text-content-md5: eafe9a520c1a0745f370e4625e7441b5 Text-content-sha1: 095f5c59322c2ec6d8a609d90a7da39fce55205c Content-length: 117 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN|:>|\versionid $Id: gs.but,v 1.4 2001/11/25 16:57:45 simon Exp $ Node-path: putty/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5f2bd140068a23972df2903db5a1dc38 Text-delta-base-sha1: aad4b1690ad73db0f033b16331d299dd954f4a92 Text-content-length: 82 Text-content-md5: a0895b4050eb81cbe0137eda38e0b612 Text-content-sha1: 66daaf63307eb7478b3454621e4fa9a045b9931f Content-length: 121 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN)jAA)\versionid $Id: intro.but,v 1.4 2001/11/25 16:57:45 simon Exp $ Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: feb5efd4176a3768f8550e1796217e91 Text-delta-base-sha1: 853d349819a2cdd8d04fb9ad97f5a697bd0332b5 Text-content-length: 5345 Text-content-md5: ca80b14ae5ced773d40fcf58a49bee37 Text-content-sha1: ce44f9e61333c71f597dd630d4ecdca49f94cfaa Content-length: 5384 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNh LC \versionid $Id: pageant.but,v 1.4 2001/11/25 16:57:45 simon Exp $ Agent forwarding is a mechanism that allows applications on your SSH server machine to talk to the agent on your client machine. Note that at present, agent forwarding in SSH2 is only available when your SSH server is OpenSSH. The \cw{ssh.com} server uses a different agent protocol which they have not published. If you would like PuTTY to be able to support agent forwarding to an \cw{ssh.com} server, please write to \cw{ssh.com} and explain to them that they are hurting themselves and their users by keeping their protocol secret. To enable agent forwarding, first start Pageant. Then set up a PuTTY SSH session in which \q{Allow agent forwarding} is enabled (see \k{config-ssh-agentfwd}). Open the session as normal. If this has worked, your applications on the server should now have access to a Unix domain socket which the SSH server will forward back to PuTTY, and PuTTY will forward on to the agent. To check that this has actually happened, you can try this command on Unix server machines: \c unixbox:~$ echo $SSH_AUTH_SOCK \c /tmp/ssh-XXNP18Jz/agent.28794 \c unixbox:~$ If the result line comes up blank, agent forwarding has not been enabled at all. Now if you run \c{ssh} on the server and use it to connect through to another server that accepts one of the keys in Pageant, you should be able to log in without a password: \c unixbox:~$ ssh -v otherunixbox \c [...] \c debug: next auth method to try is publickey \c debug: userauth_pubkey_agent: trying agent key my-putty-key \c debug: ssh-userauth2 successful: method publickey \c [...] If you enable agent forwarding on \e{that} SSH connection as well (see the manual for your server-side SSH client to find out how to do this), your authentication keys will still be available on the next machine you connect to - two SSH connections away from where they're actually stored. In addition, if you have a private key on one of the SSH servers, you can send it all the way back to Pageant using the local \c{ssh-add} command: \c unixbox:~$ ssh-add ~/.ssh/id_rsa \c Need passphrase for /home/fred/.ssh/id_rsa \c Enter passphrase for /home/fred/.ssh/id_rsa: \c Identity added: /home/fred/.ssh/id_rsa (/home/simon/.ssh/id_rsa) \c unixbox:~$ and then it's available to every machine that has agent forwarding available (not just the ones downstream of the place you added it). \H{pageant-security} Security considerations Using Pageant for public-key authentication gives you the convenience of being able to open multiple SSH sessions without having to type a passphrase every time, but also gives you the security benefit of never storing a decrypted private key on disk. Many people feel this is a good compromise between security and convenience. It \e{is} a compromise, however. Holding your decrypted private keys in Pageant is better than storing them in easy-to-find disk files, but still less secure than not storing them anywhere at all. This is for two reasons: \b Windows unfortunately provides no way to protect pieces of memory from being written to the system swap file. So if Pageant is holding your private keys for a long period of time, it's possible that decrypted private key data may be written to the system swap file, and an attacker who gained access to your hard disk later on might be able to recover that data. (However, if you stored an unencrypted key in a disk file they would \e{certainly} be able to recover it.) \b Although, like most modern operating systems, Windows prevents programs from accidentally accessing one another's memory space, it does allow programs to access one another's memory space deliberately, for special purposes such as debugging. This means that if you allow a virus, trojan, or other malicious program on to your Windows system while Pageant is running, it could access the memory of the Pageant process, extract your decrypted authentication keys, and send them back to its master. Similarly, use of agent \e{forwarding} is a security improvement on other methods of one-touch authentication, but not perfect. Holding your keys in Pageant on your Windows box has a security advantage over holding them on the remote server machine itself (either in an agent or just unencrypted on disk), because if the server machine ever sees your unencrypted private key then the sysadmin or anyone who cracks the machine can steal the keys and pretend to be you for as long as they want. However, the sysadmin of the server machine can always pretend to be you \e{on that machine}. So if you forward your agent to a server machine, then the sysadmin of that machine can access the forwarded agent connection and request signatures from your public keys, and can therefore log in to other machines as you. They can only do this to a limited extent - when the agent forwarding disappears they lose the ability - but using Pageant doesn't actually \e{prevent} the sysadmin (or hackers) on the server from doing this. Therefore, if you don't trust the sysadmin of a server machine, you should \e{never} use agent forwarding to that machine. (Of course you also shouldn't store private keys on that machine, type passphrases into it, or log into other machines from it in any way at all; Pageant is hardly unique in this respect.) Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 334d138104c84ec064005eb92b8a99c8 Text-delta-base-sha1: b8463045e72b3c5344611ae62136259611a3b177 Text-content-length: 138 Text-content-md5: d7cab8ef28e20ff6828f7e152272f48d Text-content-sha1: 1c5e301b529fca08faf104a5febf4a12a617b778 Content-length: 178 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNjxxM\versionid $Id: plink.but,v 1.10 2001/11/25 16:57:45 simon Exp $ \C{plink} Using the command-line connection tool Plink Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ae3b35d00310e17fc3d2b36daa024ebe Text-delta-base-sha1: 64082b8b720821699c431d85e5125e4747f830ab Text-content-length: 685 Text-content-md5: 88e48422c9e0d84e1849645b62c2b99a Text-content-sha1: 36c30d6eb9e8d7fd3d783d7eb2224fcd1d8b39e7 Content-length: 724 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN!c .4`!\versionid $Id: pubkey.but,v 1.7 2001/11/25 16:57:45(Choosing a good passphrase is difficult. Just as you shouldn't use a dictionary word as a password because it's easy for an attacker to run through a whole dictionary, you should not use a song lyric, quotation or other well-known sentence as a passphrase. DiceWare (\W{www.diceware.com}\cw{www.diceware.com}) recommends using at least five words each generated randomly by rolling five dice, which gives over 2^64 possible passwords and is probably not a bad scheme. If you want your passphrase to make grammatical sense, this cuts down the possibilities a lot and you should use a longer one as a result.) Revision-number: 1416 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2001-11-25T17:05:01.000000Z K 7 svn:log V 30 Oops - one last versionid :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f1a47e0167400b176198887845c12c44 Text-delta-base-sha1: fde16ef6c09688679cf278be68dfc8815af5a0a8 Text-content-length: 82 Text-content-md5: 641f26cd2bff6a7c9977e73ca74cfb92 Text-content-sha1: 63dfac0e74eec524ee59c9c84b0386a0a4d91551 Content-length: 121 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN\AA \versionid $Id: blurb.but,v 1.4 2001/11/25 17:05:01 simon Exp $ Revision-number: 1417 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:08.671483Z PROPS-END Revision-number: 1418 Prop-content-length: 157 Content-length: 157 K 7 svn:log V 57 Oops - URLs in \W{...} have to be in real URL format :-/ K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-25T17:12:23.000000Z PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 88e48422c9e0d84e1849645b62c2b99a Text-delta-base-sha1: 36c30d6eb9e8d7fd3d783d7eb2224fcd1d8b39e7 Text-content-length: 414 Text-content-md5: 72dd160112ea08a4e7c63feee25745f7 Text-content-sha1: 80b25e4f9ba12235564913eedcec6d0bb9221f91 Content-length: 453 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNck =4Q):\versionid $Id: pubkey.but,v 1.8 2001/11/25 17:12:23http://www.diceware.com/}\cw{www.diceware.com}) recommends using at least five words each generated randomly by rolling five dice, which gives over 2^64 possible passwords and is probably not a bad scheme. If you want your passphrase to make grammatical sense, this cuts down the possibilities a lot and you should use a longer one as a Revision-number: 1419 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2001-11-25T17:14:00.000000Z K 7 svn:log V 54 Arrgh, and "password" should be spelled "passphrase". K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 72dd160112ea08a4e7c63feee25745f7 Text-delta-base-sha1: 80b25e4f9ba12235564913eedcec6d0bb9221f91 Text-content-length: 80 Text-content-md5: 3a44102e5604b944d37b994dd9714bc1 Text-content-sha1: 93ab9939bd579a4feb8e72136227ee47c544cbe0 Content-length: 119 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNkm :c4P\versionid $Id: pubkey.but,v 1.9 2001/11/25 17:14:00phrase Revision-number: 1420 Prop-content-length: 356 Content-length: 356 K 8 svn:date V 27 2001-11-25T17:32:39.000000Z K 7 svn:log V 255 Editorial policy change: I've decided that it's better to use \q than \e when describing button names and menu items: the "Foo" button rather than the _Foo_ button. Certainly consistent use of either is better than the mixed use of both we had before :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 666fe9730a9fbe83a8873cbbaf7b51b5 Text-delta-base-sha1: 92497293be529ac79c757924bd8e3bb150a9d47c Text-content-length: 186 Text-content-md5: 37f13d1b64bc1862fb92224e496b0bc5 Text-content-sha1: 0b0f5412039fe355f40cabef0fe54c751d15aac7 Content-length: 226 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN]P 5bCn&8-QWoW6G~Z.nYaw+Ys\versionid $Id: config.but,v 1.13 2001/11/25 17:32:39qqqqqqqqqqqqqq{Rows} and \q Node-path: putty/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eafe9a520c1a0745f370e4625e7441b5 Text-delta-base-sha1: 095f5c59322c2ec6d8a609d90a7da39fce55205c Text-content-length: 191 Text-content-md5: 27b247e757c361ccb7a01d2b3b323db6 Text-content-sha1: 380991682c3535446e98b88e9bf0991d14616273 Content-length: 230 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN::0IB [bcW\versionid $Id: gs.but,v 1.5 2001/11/25 17:32:39qqqq{Host Name}, \q{Protocol}, and possibly \q{Port} settings, you are ready to connect. Press the \q Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ca80b14ae5ced773d40fcf58a49bee37 Text-delta-base-sha1: ce44f9e61333c71f597dd630d4ecdca49f94cfaa Text-content-length: 97 Text-content-md5: ed14bd806cdef23426feac2ed00199d5 Text-content-sha1: fe2500f688a21b20a35e6005c4f4c77fc0ab44d2 Content-length: 136 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNhh9X5Rafu \\versionid $Id: pageant.but,v 1.5 2001/11/25 17:32:39qqqq Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d7cab8ef28e20ff6828f7e152272f48d Text-delta-base-sha1: 1c5e301b529fca08faf104a5febf4a12a617b778 Text-content-length: 266 Text-content-md5: 79c06a27f98762d83216a6be1bc52551 Text-content-sha1: a46d80730512d6dbd260bb33356cbadfcf0936de Content-length: 306 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNb4G;z.\:2c\versionid $Id: plink.but,v 1.11 2001/11/25 17:32:39qq{Ports} tab. Tick the box there labelled \qq{OK} on the \q{Preferences} dialogue box. Next, select \q{Command Line} from the WinCVS \qq{Change Folder} button, and click \q Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3a44102e5604b944d37b994dd9714bc1 Text-delta-base-sha1: 93ab9939bd579a4feb8e72136227ee47c544cbe0 Text-content-length: 720 Text-content-md5: df2ee3b020cdd85be310410a9d9ee47f Text-content-sha1: e1f8962a25c3df366a674c9e07187ff14ac5c481 Content-length: 760 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNm"A4RMqR D$Vqu,GDx` a \versionid $Id: pubkey.but,v 1.10 2001/11/25 17:32:39q{Generate}, to generate a new public/private key pair, or \q{Load} to load in an qqq{Key} part of the PuTTYgen window. Now you can change the \q{Key comment} field to something more meaningful than the default (which is based on the current date). e.g. add the name of the host you will use it for. When using multiple keys a meaningful comment may help you remember which passphrase to use! You should always enter a passphrase in the \q{Key passphrase} and \q{Confirm passphrase} fields, to protect qload the private key again (as described below)qsaveqq{Connection}, \q{SSH} panel: \q Revision-number: 1421 Prop-content-length: 253 Content-length: 253 K 8 svn:date V 27 2001-11-25T18:39:57.000000Z K 7 svn:log V 152 RDB's general resizing cleanup. He's put his favourite resize mode back in again, but as long as it's not the default it doesn't bother me too much :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d7e3813b2d1e355b2757e30a62d66712 Text-delta-base-sha1: 90ad5c640940c15fb0569e26c0b1a0c7627bc43f Text-content-length: 36 Text-content-md5: f811c0bce571b435e2e56ae0180521cc Text-content-sha1: 5184533dc6d810c5fb26cff4598ac1a9c2730e3f Content-length: 77 K 15 cvs2svn:cvs-rev V 5 1.122 PROPS-END SVN0) {cfg.resize_action == RESIZE_EITHER) { /* Make the font the biggest we can */ if (cols > width) font_width = (ss.right - ss.left - extra_width)/cols; if (rows > height) font_height = (ss.bottom - ss.top - extra_height)/rows; deinit_fonts(); init_fonts(font_width, font_height); width = (ss.right - ss.left - extra_width) / font_width; height = (ss.bottom - ss.top - extra_height) / font_height; } else { if ( height > rows ) height = rows; if ( width > cols ) width = cols; debug((27, "reset_window() -> term resize to (%d,%d)", height, width)); #endif } } == RESIZE_FONT || cfg.resize_action == RESIZE_DISABLEDcfg.resize_action == RESIZE_DISABLED || cfg.resize_action == RESIZE_EITHER || (cfg.resize_action != prev_cfg.resize_actionif (full_screen) flip_full_screen();!= RESIZE_FONTcfg.resize_action == RESIZE_EITHER && (cfg.height != rows || cfg.width != cols )) { /* * Great! It seems that both the terminal size and the * font size have been changed and the user is now dragging. * * It will now be difficult to get back to the configured * font size! * * This would be easier but it seems to be too confusing. */ cfg.height=rows; cfg.width=cols; SetWindowText(hwnd, cfg.win_name_always ? window_name : icon_name); && !was_zoomed== RESIZE_TERM== RESIZE_TERM) term_size(prev_rows, prev_cols, cfg.savelines); if (cfg.resize_action != RESIZE_FONT) reset_window(2); else != RESIZE_FONT if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) != KF_REPEAT) (full_screen && !cfg.scrollbar_in_fullscreen) || (!full_screen && !cfg.scrollbar).#(Pq{f"sEqXV* Manage window caption / taskbar flashing, if enabled. * 0 = stop, 1 = maintain, 2 = start */ static void flash_window(int mode) { static long last_flash = 0; static int flashing = 0; if ((mode == 0) || (cfg.beep_ind == B_IND_DISABLED)) { /* stop */ if (flashing) { FlashWindow(hwnd, FALSE); flashing = 0; } } else if (mode == 2) { /* start */ if (!flashing) { last_flash = GetTickCount(); flashing = 1; FlashWindow(hwnd, TRUE); } } else if ((mode == 1) && (cfg.beep_ind == B_IND_FLASH)) { /* maintain */ if (flashing) { long now = GetTickCount(); long fdiff = now - last_flash; if (fdiff < 0 || fdiff > 450) { last_flash = now; FlashWindow(hwnd, TRUE); /* toggle */ } } } } /* * Beep. */ void beep(int mode) { if (mode == BELL_DEFAULT) { /* * For MessageBeep style bells, we want to be careful of * timing, because they don't have the nice property of * PlaySound bells that each one cancels the previous * active one. So we limit the rate to one per 50ms or so. */ static long lastbeep = 0; long(WS_CAPTION|WS_THICKFRAME)Some versions of explorer get confused and don't take * notice of us going fullscreen, so go topmost too. */ SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOSIZEif (cfg.resize_action != RESIZE_DISABLED) style |= WS_THICKFRAMESetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); Revision-number: 1422 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2001-11-25T18:55:46.000000Z K 7 svn:log V 65 Split the Window panel into two to make room for proper comments K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e0d192604074d81f46e2d0328f605d3f Text-delta-base-sha1: ec76b49437954aa68453d5156708c5769d8e6e70 Text-content-length: 1072 Text-content-md5: 3e59fe3ef8e0d518b71ad94289db975a Text-content-sha1: 5bb3c4c4d28d6b6fbc8353203bbd25fdd61ee16b Content-length: 1113 K 15 cvs2svn:cvs-rev V 5 1.162 PROPS-END SVN:V[GH)P! ]zdg$,EUmHPJyi./R5ecWSAVESTATIC, IDC_SAVEEDIT, IDC_SCROLLKEY, IDC_SCROLLDISP, windowpanelend, behaviourpanelstart, IDC_TITLE_BEHAVIOUR, IDC_BOX_BEHAVIOUR1, IDC_CLOSEWARN, IDC_ALTF4, IDC_ALTSPACE, IDC_ALTONLY, IDC_ALWAYSONTOP, IDC_FULLSCREENONALTENTER, behaviourbartitle(&cp, "Options controlling the effects of keys", IDC_TITLE_KEYBOARD);big(&cp, "When window is resi&zed:", IDC_RESIZESTATIC, "Change the number of rows and columns", IDC_RESIZETERM, "Change the size of the font", IDC_RESIZEFONT, "Change font size only when maximised", IDC_RESIZEEITHER, "Forbid resizing completelybartitle(&cp, "Configure the appearance of PuTTY's window", IDC_TITLE_APPEARANCE);behaviourpanelstart) { /* The Behaviour panel. Accelerators used: [acgo] w4yltfConfigure the behaviour of PuTTY's window", IDC_TITLE_WINDOW); beginbox(&cp, NULL, IDC_BOX_BEHAVIOUR1BehaviourBehaviour")) create_controls(hwnd, dlgtype, behaviour Revision-number: 1423 Prop-content-length: 360 Content-length: 360 K 8 svn:date V 27 2001-11-25T18:59:12.000000Z K 7 svn:log V 259 Add a new chapter full of intermediate-useful-things, somewhere between `Getting Started' (things we can barely believe you don't know) and the Configuration reference chapter (things you already knew and had just forgotten). Only half-written at the moment. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ddf7a205be7777f70543bf14b14b4f99 Text-delta-base-sha1: f0ad29df2c05466bd4d1f9e30b70c27e543550fa Text-content-length: 47 Text-content-md5: 8cd69dfd1de33c4666682af21ee72d8e Text-content-sha1: 67c6a4c55529e86a4cc3a9975cab3401bf1395e4 Content-length: 86 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNhnOCHAPTERS = blurb intro gs using Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 37f13d1b64bc1862fb92224e496b0bc5 Text-delta-base-sha1: 0b0f5412039fe355f40cabef0fe54c751d15aac7 Text-content-length: 207 Text-content-md5: 833e6021195a1559bce0c00e8d96ee45 Text-content-sha1: dba47c65a2a822d7edadf0700be8855d0e491408 Content-length: 247 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN2{5}T1\versionid $Id: config.but,v 1.14 2001/11/25 18:59:12hese options let you configure the way PuTTY keeps text after it scrolls off the top of the screen (see \k{using-scrollback}) Node-path: putty/doc/using.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 9325 Text-content-md5: 24a13e1fafc392e944b9f8ab91f04d39 Text-content-sha1: 8c875e02e64abc17e69ed802e6f2c0a9b4ed94f2 Content-length: 9441 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN___\versionid $Id: using.but,v 1.1 2001/11/25 18:59:12 simon Exp $ \C{using} Using PuTTY This chapter provides a general introduction to some more advanced features of PuTTY. For extreme detail and reference purposes, \k{config} is likely to contain more information. \H{using-session} During your session A lot of PuTTY's complexity and features are in the configuration panel. Once you have worked your way through that and started a session, things should be reasonably simple after that. Nevertheless, there are a few more useful features available. \S{using-selection} Copying and pasting text Often in a PuTTY session you will find text on your terminal screen which you want to type in again. Like most other terminal emulators, PuTTY allows you to copy and paste the text rather than having to type it again. Also, copy and paste uses the Windows clipboard, so that you can paste (for example) URLs into a web browser, or paste from a word processor or spreadsheet into your terminal session. PuTTY's copy and paste works entirely with the mouse. In order to copy text to the clipboard, you just click the left mouse button in the terminal window, and drag to select text. When you let go of the button, the text is \e{automatically} copied to the clipboard. You do not need to press Ctrl-C or Ctrl-Ins; in fact, if you do press Ctrl-C, PuTTY will send a Ctrl-C character down your session to the server where it will probably cause a process to be interrupted. Pasting is done using the right button (or the middle mouse button, if you have a three-button mouse and have set it up; see \k{config-mouse}). When you click the right mouse button, PuTTY will read whatever is in the Windows Clipboard and paste it into your session, \e{exactly} as if it had been typed at the keyboard. (Therefore, be careful of pasting formatted text into an editor that does automatic indenting; you may find that the spaces pasted from the clipboard plus the spaces added by the editor add up to too many spaces and ruin the formatting. There is nothing PuTTY can do about this.) If you double-click the left mouse button, PuTTY will select a whole word. If you double-click, hold down the second click, and drag the mouse, PuTTY will select a sequence of whole words. If you \e{triple}-click, or triple-click and drag, then PuTTY will select a whole line or sequence of lines. If you want to select a rectangular region instead of selecting to the end of each line, you can do this by holding down Alt when you make your selection. (You can also configure rectangular selection to be the default, and then holding down Alt gives the normal behaviour instead. See \#{FIXME} for details.) If you have a middle mouse button, then you can use it to adjust an existing selection if you selected something slightly wrong. (If you have configured the middle mouse button to paste, then the right mouse button does this instead.) Click the button on the screen, and you can pick up the nearest end of the selection and drag it to somewhere else. \S{using-scrollback} Scrolling the screen back PuTTY keeps track of text that has scrolled up off the top of the terminal. So if something appears on the screen that you want to read, but it scrolls too fast and it's gone by the time you try to look for it, you can use the scrollbar on the right side of the window to look back up the session history and find it again. As well as using the scrollbar, you can also page the scrollback up and down by pressing Shift-PgUp and Shift-PgDn. These are still available if you configure the scrollbar to be invisible. By default the last 200 lines scrolled off the top are preserved for you to look at. You can increase (or decrease) this value using the configuration box; see \k{config-scrollback}. \S{using-sysmenu} The System menu If you click the left mouse button on the icon in the top left corner of PuTTY's window, or click the right mouse button on the title bar, you will see the standard Windows system menu containing items like Minimise, Move, Size and Close. PuTTY's system menu contains extra program features in addition to the Windows standard options. These extra menu commands are described below. \S2{using-eventlog} The PuTTY Event Log If you choose \q{Event Log} from the system menu, a small window will pop up in which PuTTY logs significant events during the connection. Most of the events in the log will probably take place during session startup, but a few can occur at any point in the session, and one or two occur right at the end. You can use the mouse to select one or more lines of the Event Log, and hit the Copy button to copy them to the clipboard. If you are reporting a bug, it's often useful to paste the contents of the Event Log into your bug report. \S2{using-newsession} Starting new sessions PuTTY's system menu provides some shortcut ways to start new sessions: \b Selecting \q{New Session} will start a completely new instance of PuTTY, and bring up the configuration box as normal. \b Selecting \q{Duplicate Session} will start a session with precisely the same options as your current one - connecting to the same host using the same protocol, with all the same terminal settings and everything. \b The \q{Saved Sessions} submenu gives you quick access to any sets of stored session details you have previously saved. See \k{config-saving} for details of how to create saved sessions. \S2{using-changesettings} Changing your session settings If you select \q{Change Settings} from the system menu, PuTTY will display a cut-down version of its initial configuration box. This allows you to adjust most properties of your current session. You can change the terminal size, the font, the actions of various keypresses, the colours, and so on. Some of the options that are available in the main configuration box are not shown in the cut-down Change Settings box. These are usually options which don't make sense to change in the middle of a session (for example, you can't switch from SSH to Telnet in mid-session). \S2{using-copyall} Copy All to Clipboard This system menu option provides a convenient way to copy the whole contents of the terminal screen and scrollback to the clipboard in one go. \S2{reset-terminal} Clearing and resetting the terminal The \q{Clear Scrollback} option on the system menu tells PuTTY to discard all the lines of text that have been kept after they scrolled off the top of the screen. This might be useful, for example, if you displayed sensitive information and wanted to make sure nobody could look over your shoulder and see it. (Note that this only prevents a casual user from using the scrollbar to view the information; the text is not guaranteed not to still be in PuTTY's memory.) The \q{Reset Terminal} option causes a full reset of the terminal emulation. A VT-series terminal is a complex piece of software and can easily get into a state where all the text printed becomes unreadable. (This can happen, for example, if you accidentally output a binary file to your terminal.) If this happens, selecting Reset Terminal should sort it out. \S2{using-fullscreen} Full screen mode If you find the title bar on a maximised window to be ugly or distracting, you can select Full Screen mode to maximise PuTTY \q{even more}. When you select this, PuTTY will expand to fill the whole screen and its borders, title bar and scrollbar will disappear. (You can configure the scrollbar not to disappear in full-screen mode if you want to keep it.) \#{FIXME, document how and xref to it from here!} When you are in full-screen mode, you can still access the system menu if you click the left mouse button in the \e{extreme} top left corner of the screen. \H{using-logging} Creating a log file of your session For some purposes you may find you want to log everything that appears on your screen. You can do this using the \q{Logging} panel in the configuration box. To begin a session log, select \q{Change Settings} from the system menu and go to the Logging panel. Enter a log file name, and select a logging mode. (You can log all session output including the terminal control sequences, or you can just log the printable text. It depends what you want the log for.) Click \q{Apply} and your log will be started. Later on, you can go back to the Logging panel and select \q{Logging turned off completely} to stop logging; then PuTTY will close the log file and you can safely read it. See \k{config-logging} for more details and options. \H{using-translation} Altering your character set configuration If you find that special characters (accented characters, for example) are not being displayed correctly in your PuTTY session, it may be that PuTTY is interpreting the characters sent by the server according to the wrong \e{character set}. There are a lot of different character sets available, so it's entirely possible for this to happen. If you click \q{Change Settings} and look at the \q{Translation} panel, you should see a large number of character sets which you can select. Now all you need is to find out which of them you want! \H{using-forwarding} Port forwarding and X forwarding in SSH \# using X forwarding \# using port forwarding \H{using-rawprot} Making raw TCP connections \# Raw protocol Revision-number: 1424 Prop-content-length: 290 Content-length: 290 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-25T19:22:47.000000Z K 7 svn:log V 189 Further documentation work. Tidy up the Config chapter (add a few new features - the code had got ahead of the docs), and propagate a couple of cross-references to other files as a result. PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 833e6021195a1559bce0c00e8d96ee45 Text-delta-base-sha1: dba47c65a2a822d7edadf0700be8855d0e491408 Text-content-length: 2729 Text-content-md5: dc374e65c9e6331403096bdc57330e87 Text-content-sha1: 4194ed0f25a520c803bcfa7222df9bb3a00c8e99 Content-length: 2769 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN_5;})jxC _pA'h.d\om\`-cfmAtry_kii(sesskey, "AuthKI", 1, &cfg->try_ki Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b980fe9cb2f5ae651fd05900523e25da Text-delta-base-sha1: d5ce698870b5b4f2f1e9c387e389307f5ad71d77 Text-content-length: 58 Text-content-md5: 955e68529810e2806b42fc0d4c39572b Text-content-sha1: ec59224abb0a3923a132479821eeb3fe8812fdd9 Content-length: 99 K 15 cvs2svn:cvs-rev V 5 1.181 PROPS-END SVNz :@:cfg.try_ki_auth && Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3e59fe3ef8e0d518b71ad94289db975a Text-delta-base-sha1: 5bb3c4c4d28d6b6fbc8353203bbd25fdd61ee16b Text-content-length: 304 Text-content-md5: 753ec23f988e3afc8afbb56b0a8d0c91 Text-content-sha1: 0fe7ea63329069ae99d47622b11ce326995c7940 Content-length: 345 K 15 cvs2svn:cvs-rev V 5 1.163 PROPS-END SVNV91q# P",r3Y@@IDC_AUTHKICheckDlgButton(hwnd, IDC_AUTHKI, cfg.try_kii (SSH1)", IDC_AUTHTIS); checkbox(&cp, "Attempt \"keyboard-&interactive\" authentication" " (SSH2)", IDC_AUTHKIAUTHKItry_ki_auth = IsDlgButtonChecked(hwnd, IDC_AUTHKI Revision-number: 1427 Prop-content-length: 256 Content-length: 256 K 7 svn:log V 155 Set up kbd_codepage at the start of the program, as well as when the input locale changes. With any luck this should sort out the Polish Unicode problems. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-29T21:30:59.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7dbac8226ee2ce7e02ade32179e00ccb Text-delta-base-sha1: fec4f9ca0257c549e759adcb7ac6ac5cf03c8d6a Text-content-length: 525 Text-content-md5: bf3dc3769bab019842e887fde880438c Text-content-sha1: aaa17603b6f2bb14c965f072c487b9a01fd4013f Content-length: 566 K 15 cvs2svn:cvs-rev V 5 1.175 PROPS-END SVN%i+q(Tx "2qSQMstatic void set_input_locale(HKLSet up the initial input locale. */ set_input_locale(GetKeyboardLayout(0));set_input_locale(HKL kl) { char lbuf[20]; GetLocaleInfo(LOWORD(kl), LOCALE_IDEFAULTANSICODEPAGE, lbuf, sizeof(lbuf)); kbd_codepage = atoi(lbuf);/* wParam == Font number */ /* lParam == Locale */ set_input_locale((HKL)lParam);hbb(ap); MessageBox(hwnd, stuff, "PuTTY Fatal Error", MB_ICONERROR | MB_OK); exit(1); } /* Revision-number: 1428 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2001-11-29T21:47:11.000000Z K 7 svn:log V 55 Configurable TCP_NODELAY option on network connections K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e98e64bc2da5d7a58ca2ea95cbe41697 Text-delta-base-sha1: e38d6df3957cf39983a18925c965b13c43c4f2ed Text-content-length: 33 Text-content-md5: f3b4f50638bc2fc20e2ea285d5b76ec3 Text-content-sha1: da9a07ebe27ce377a24754adf6bda1eebe40cd2f Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNjw 'D&int nodelay, Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 485ca029d02734e27ebd06b1a599b9a8 Text-delta-base-sha1: 8ccb61276f8169aae04618441cdae4e1a720c835 Text-content-length: 262 Text-content-md5: 1ae3e17d95477f3b5b328bde9e1a90bc Text-content-sha1: c6b394d3c34280fd9ef8756a2bf1322cf9becde5 Content-length: 302 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNm%j j1< /* nodelay is only useful if stdin is a character device (console) */ int nodelay = cfg.tcp_nodelay && (GetFileType(GetStdHandle(STD_INPUT_HANDLE)) == FILE_TYPE_CHAR); error = back->init(cfg.host, cfg.port, &realhost, nodelay Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8391c8622b607f8e74ee307b4649020c Text-delta-base-sha1: 3bf9406862cbb3d5b01666b31d0e8c95ca6b9bc4 Text-content-length: 22 Text-content-md5: 1e3c1642a0b30453e76620395bb11c94 Text-content-sha1: 2604a39e9e3cf250274aeb3b69275ee75d5fa137 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN # 0 Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 880c149de9bad60fdea4f088184ffed8 Text-delta-base-sha1: cbf8735de69bc7deb656937d46dd8cdbe73a0606 Text-content-length: 28 Text-content-md5: 1e4b679cafcc3d0992122c6997b1eeba Text-content-sha1: c1b3ada7fa767f1d9025d3fe52b785d05a24a141 Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN69 * *, 0 Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ff465e159cc42d92f922b6ff9b2f9547 Text-delta-base-sha1: 5c071ab1e51295e8453d5b1a40c7d32147afd0d1 Text-content-length: 56 Text-content-md5: 42eccb47f09798d454723bd9c7ffff8d Text-content-sha1: 6e989d9cafbc13a3596528754dc87b93e3190c85 Content-length: 97 K 15 cvs2svn:cvs-rev V 5 1.124 PROPS-END SVN`RRO, int nodelayint tcp_nodelay; Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2bcd1085b9d76071a79c59748304cfd5 Text-delta-base-sha1: 3ce7dd83fc8fb94cdec06da8f64d7b64a729dbed Text-content-length: 47 Text-content-md5: be696439f3b1f870a0070eaf76e6b8ab Text-content-sha1: 2124de08be89c8bfca06c7ec90e834a4d5c0874e Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN;Q%|?, int nodelaynodelay Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5ee3a66f1e21ce7ca9c585450afb3144 Text-delta-base-sha1: 5ae94ae7db4356d5285e06de048eff391e6b14eb Text-content-length: 47 Text-content-md5: d0ba6b17f176ff87911b478951c2a43c Text-content-sha1: 2f26437fea49daf02b9518c37603a7803024143c Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN / J:, int nodelaynodelay Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 971ed4affab62146558c51ac2bc53176 Text-delta-base-sha1: 7bafce30d2e559548937dba63f3264fbf81f15ea Text-content-length: 29 Text-content-md5: f2b90101937955c2acb428cb243ad838 Text-content-sha1: 12aee22ffac68de7df37e0f73b7a4e76cd89bbcf Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVN{~ !Z!, 0 Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d6e80406c0ce0c11767e5cb57ef791c7 Text-delta-base-sha1: 9a0e8218e7f491558de47865c50682c333ed2c48 Text-content-length: 119 Text-content-md5: 6db8c9e9df1dfb2e06dd17a37a3aebcd Text-content-sha1: 2b869db6d841c434005bc2d39b0894a8ecf821f4 Content-length: 159 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNODZ Gx7i(sesskey, "TCPNoDelay", cfg->tcp_nodelay);i(sesskey, "TCPNoDelay", 1, &cfg->tcp_nodelay); Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 955e68529810e2806b42fc0d4c39572b Text-delta-base-sha1: ec59224abb0a3923a132479821eeb3fe8812fdd9 Text-content-length: 128 Text-content-md5: c4c07054bf412985372c8baaa418ee4c Text-content-sha1: 274cce6db2c852f5a40ac1807237ca61bd5efbc1 Content-length: 169 K 15 cvs2svn:cvs-rev V 5 1.182 PROPS-END SVNqqyq, int nodelaynodelay 8,5E5zed char *in, int inlen, int nodelay, nodelay Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 12e84f08012f0b01f99eec7ae55c5aa8 Text-delta-base-sha1: b397f5a03a574c1f36d12e7d8d48eba988059bb8 Text-content-length: 50 Text-content-md5: 25a82a3d0a908e887becf6a64bd2f285 Text-content-sha1: 674d590bdfb7abd8aeaec1d99429495e86880280 Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNRh=.=ii, int nodelaynodelay Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 753ec23f988e3afc8afbb56b0a8d0c91 Text-delta-base-sha1: 0fe7ea63329069ae99d47622b11ce326995c7940 Text-content-length: 428 Text-content-md5: 612f1bf10f1aa3e90593ff5b18723af6 Text-content-sha1: 183a72a06778f3611b85d7c3c01571f94ef5132f Content-length: 469 K 15 cvs2svn:cvs-rev V 5 1.164 PROPS-END SVN9&:d:r0VTo^eZ!X.zY@- BOX_CONNECTION3IDC_NODELAY CheckDlgButton(hwnd, IDC_NODELAY, cfg.tcp_nodelayn if (dlgtype == 0) { beginbox(&cp, "Low-level TCP connection options", IDC_BOX_CONNECTION3); checkbox(&cp, "Disable &Nagle's algorithm (TCP_NODELAY option)", IDC_NODELAY); endbox(&cp); }NODELAYtcp_nodelay = IsDlgButtonChecked(hwnd, IDC_NODELAY Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bf3dc3769bab019842e887fde880438c Text-delta-base-sha1: aaa17603b6f2bb14c965f072c487b9a01fd4013f Text-content-length: 72 Text-content-md5: 1628cbc890965b94c654465d536a9a72 Text-content-sha1: 081a10c1a4f884875b467f8ec8b61a29e6531e9d Content-length: 113 K 15 cvs2svn:cvs-rev V 5 1.176 PROPS-END SVN ^, cfg.tcp_nodelayhyh, ap); va_end Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 524c3a62a445668955d1966116da1473 Text-delta-base-sha1: f1becbaf3e0b50988d7be71e4f347d68b2c2f785 Text-content-length: 122 Text-content-md5: 44053d46e249d5f175aec641bbceefec Text-content-sha1: 423bcf792732407c038492bd88045c6a083ae515 Content-length: 162 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNRKQp3=~f"Fpbint nodelayif (nodelay) { BOOL b = TRUE; setsockopt(s, IPPROTO_TCP, TCP_NODELAY Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 72bd4a02eb4d2f46b3a2271a98330abc Text-delta-base-sha1: af48e2df0d95b24aaa9012528f10c5d9616ca671 Text-content-length: 22 Text-content-md5: 8d45a2bfbb59bdb61d37a826de07f1a8 Text-content-sha1: 6fef24a6472c613a9d192e5b7b82dc7a0aeb4af1 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNlo WU0 Revision-number: 1429 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 58 Make the nonstandard "des-cbc" cipher disabled by default K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-29T22:26:52.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c4c07054bf412985372c8baaa418ee4c Text-delta-base-sha1: 274cce6db2c852f5a40ac1807237ca61bd5efbc1 Text-content-length: 678 Text-content-md5: ce53980dcff8403af4bb78fb8fc9e69f Text-content-sha1: b9c291248f908962b2d2d755a33b6a0dd6a88c15 Content-length: 719 K 15 cvs2svn:cvs-rev V 5 1.183 PROPS-END SVN7QFrX9m[%u>Md9u>F1Ocipherstr_startedif (cfg.ssh2_des_cbc) { preferred_ciphers[n_preferred_ciphers] = &ssh2_des; n_preferred_ciphers++; }cipherstr_startedcontinue; /* warning flag */ for (j = 0; j < c->nciphers; j++) { if (cipherstr_started) ssh2_pkt_addstring_str(","); ssh2_pkt_addstring_str(c->list[j]->name); cipherstr_started = 1cipherstr_startedcontinue; /* warning flag */ for (j = 0; j < c->nciphers; j++) { if (cipherstr_started) ssh2_pkt_addstring_str(","); ssh2_pkt_addstring_str(c->list[j]->name); cipherstr_started = 1ed char *in, int inlen, int is8 Revision-number: 1430 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2001-11-29T22:32:37.000000Z K 7 svn:log V 64 Document the three new configuration options I've added tonight K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dc374e65c9e6331403096bdc57330e87 Text-delta-base-sha1: 4194ed0f25a520c803bcfa7222df9bb3a00c8e99 Text-content-length: 1413 Text-content-md5: a1cc08ef94a6ddff7f4444a81beeb856 Text-content-sha1: 15fa68627432a82bc22b0faece345e3fc1b5fbd8 Content-length: 1453 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNZ!VZ4:: V~@r-\versionid $Id: config.but,v 1.16 2001/11/29 22:32:3S{config-nodelay} \q{Disable Nagle's algorithm} Nagle's algorithm is a detail of TCP/IP implementations that tries to minimise the number of small data packets sent down a network connection. With Nagle's algorithm enabled, PuTTY's bandwidth usage will be slightly more efficient; with it disabled, you may find you get a faster response to your keystrokes when connecting to some types of server. The Nagle algorithm is disabled by defaultSingle-DES is not supported natively in the SSH 2 draft protocol standards. One or two server implementations do support it, by a non-standard name. PuTTY can use single-DES to interoperate with these servers if you enable the \q{Enable non-standard single-DES in SSH 2} option; by default this is disabled and PuTTY will stick to the standartis} \q{Attempt keyboard-interactive authentication} The SSH 2 equivalent of TIS authentication is called \q{keyboard-interactive}. It is a flexible authentication method using an arbitrary sequence of requests and responses; so it is not only useful for challenge/response mechanisms such as S/Key, but it can also be used for (for example) asking the user for a new password when the old one has expired. PuTTY leaves this option enabled by default, but supplies a switch to turn it off in case you should have trouble with it Revision-number: 1431 Prop-content-length: 161 Content-length: 161 K 7 svn:log V 61 Oops - check the _rest_ of the SSH2 DES patch back in. D'oh! K 10 svn:author V 5 simon K 8 svn:date V 27 2001-11-29T23:58:02.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 42eccb47f09798d454723bd9c7ffff8d Text-delta-base-sha1: 6e989d9cafbc13a3596528754dc87b93e3190c85 Text-content-length: 79 Text-content-md5: b3efb79f80b75197f41a5f66f4cb8a2f Text-content-sha1: d6065e09ae7ac134b2b13c23ecade472a911c219 Content-length: 120 K 15 cvs2svn:cvs-rev V 5 1.125 PROPS-END SVNH :pdssh2_des_cbc; /* "des-cbc" nonstandard SSH2 cipher Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6db8c9e9df1dfb2e06dd17a37a3aebcd Text-delta-base-sha1: 2b869db6d841c434005bc2d39b0894a8ecf821f4 Text-content-length: 97 Text-content-md5: 15bbf39a861c99ffa2c243f70425c0b3 Text-content-sha1: 7b365554c807a90a74530abaa52ba6183fd718c7 Content-length: 137 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVND5Du`_(i(sesskey, "SSH2DES", cfg->ssh2_des_cbSSH2DES", 0, &cfg->ssh2_des_cb Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 612f1bf10f1aa3e90593ff5b18723af6 Text-delta-base-sha1: 183a72a06778f3611b85d7c3c01571f94ef5132f Text-content-length: 248 Text-content-md5: e26d39060876c08d28de6ea3e514c7c4 Text-content-sha1: c806047ca1b2c5c51b6a1a117d126ff2e6e94042 Content-length: 289 K 15 cvs2svn:cvs-rev V 5 1.165 PROPS-END SVN&~55Zj:{wYS pQ2t2DESSSH2DES, cfg.ssh2_des_cbdcheckbox(&cp, "Enable non-standard use of single-&DES in SSH 2", IDC_SSH2DESSSH2DES cfg.ssh2_des_cbc = IsDlgButtonChecked(hwnd, IDC_SSH2DES Revision-number: 1432 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.155762Z PROPS-END Revision-number: 1433 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.169198Z PROPS-END Revision-number: 1434 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.366579Z PROPS-END Revision-number: 1435 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.373533Z PROPS-END Revision-number: 1436 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.380031Z PROPS-END Revision-number: 1437 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.386568Z PROPS-END Revision-number: 1438 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.393324Z PROPS-END Revision-number: 1439 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.400254Z PROPS-END Revision-number: 1440 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.407577Z PROPS-END Revision-number: 1441 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.414343Z PROPS-END Revision-number: 1442 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.421771Z PROPS-END Revision-number: 1443 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.428653Z PROPS-END Revision-number: 1444 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.435275Z PROPS-END Revision-number: 1445 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:11.442417Z PROPS-END Revision-number: 1446 Prop-content-length: 155 Content-length: 155 K 7 svn:log V 55 Oops - replacement section types should be capitalised K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-04T19:12:18.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d73a359597fb953bf16d27cf0a6d9ff1 Text-delta-base-sha1: 9c413caa76424d3d1f5f7fe2a6bce5263af51fcc Text-content-length: 433 Text-content-md5: 96183fda5896088136975fd3b8bc2f32 Text-content-sha1: fcdd20fe552c1aff9a82427517ba6f72ff4c368b Content-length: 473 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN``@c2 P2^oGAI N#+r&VF^'|B$g g - IHV @ @\K (36kjK*/=K.2H>0o0HTae3w'K(Bq0YE+1&Ux[,a > KGT7, a]hkB%*\M&>"a^9<8r&(fK/F5`=-M=wv1/$!P#o} Dm] H O\versionid $Id: config.but,v 1.17 2001/12/06 13:28:02\cfg{winhelp-topic}{session.hostname}\cfg{winhelp-topic}{session.saved}\cfg{winhelp-topic}{session.coe\cfg{winhelp-topic}{logging.main}\cfg{winhelp-topic}{logging.file\cfg{winhelp-topic}{logging.\cfg{winhelp-topic}{terminal.autowrap\cfg{winhelp-topic}{terminal.decom\cfg{winhelp-topic}{terminal.lfhascr\cfg{winhelp-topic}{terminal.bce\cfg{winhelp-topic}{terminal.blink\cfg{winhelp-topic}{terminal.answerback\cfg{winhelp-topic}{terminal.local\cfg{winhelp-topic}{terminal.localedit\cfg{winhelp-topic}{keyboard.backspace}\cfg{winhelp-topic}{keyboard.homeend}\cfg{winhelp-topic}{keyboard.funkeys}\cfg{winhelp-topic}{keyboard.appcursor}\cfg{winhelp-topic}{keyboard.appkeypad}\cfg{winhelp-topic}{keyboard.nethack}\cfg{winhelp-topic}{keyboard.compose}\cfg{winhelp-topic}{keyboard.ctrlalt\cfg{winhelp-topic}{bell.style\cfg{winhelp-topic}{bell.taskbar\cfg{winhelp-topic}{bell.overload\cfg{winhelp-topic}{window.size}\cfg{winhelp-topic}{window.resize}\cfg{winhelp-topic}{window.scrollback}\cfg{winhelp-topic}{appearance.cursor}\cfg{winhelp-topic}{appearance.font}\cfg{winhelp-topic}{appearance.title}\cfg{winhelp-topic}{appearance.hidemouse\cfg{winhelp-topic}{appearance.border}\cfg{winhelp-topic}{behaviour.closewarn\cfg{winhelp-topic}{behaviour.altf\cfg{winhelp-topic}{behaviour.alts\cfg{winhelp-topic}{behaviour.altonly\cfg{winhelp-topic}{behaviour.alwayson\cfg{winhelp-topic}{behaviour.alte\cfg{winhelp-topic}{translation.codepage}\cfg{winhelp-topic}{translation.cyrillic\cfg{winhelp-topic}{translation.linedraw}\cfg{winhelp-topic}{selection.linedraw}\cfg{winhelp-topic}{selection.rtf}\cfg{winhelp-topic}{selection.buttons}\cfg{winhelp-topic}{selection.shiftdrag\cfg{winhelp-topic}{selection.rect}\cfg{winhelp-topic}{selection.charclasses}\cfg{winhelp-topic}{colours.bold\cfg{winhelp-topic}{colours.logpal\cfg{winhelp-topic}{colours.config}\cfg{winhelp-topic}{connection.termtype\cfg{winhelp-topic}{connection.\cfg{winhelp-topic}{connection.keepalive}\cfg{winhelp-topic}{connection.nodelay\cfg{winhelp-topic}{telnet.termspeed\cfg{winhelp-topic}{telnet.environ}\cfg{winhelp-topic}{telnet.oldenviron\cfg{winhelp-topic}{telnet.passive}\cfg{winhelp-topic}{telnet.specialkeys\cfg{winhelp-topic}{rlogin.termspeed\cfg{winhelp-topic}{rlogin.localuser\cfg{winhelp-topic}{ssh.command}\cfg{winhelp-topic}{ssh.nopty\cfg{winhelp-topic}{ssh.compress\cfg{winhelp-topic}{ssh.protocol\cfg{winhelp-topic}{ssh.buggymac\cfg{winhelp-topic}{ssh.ciphers}\cfg{winhelp-topic}{ssh.auth.tis\cfg{winhelp-topic}{ssh.auth.ki\cfg{winhelp-topic}{ssh.auth.agentfwd\cfg{winhelp-topic}{ssh.auth.privkey\cfg{winhelp-topic}{ssh.tunnels.x11}\cfg{winhelp-topic}{ssh.tunnels.portfwd} Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b3efb79f80b75197f41a5f66f4cb8a2f Text-delta-base-sha1: d6065e09ae7ac134b2b13c23ecade472a911c219 Text-content-length: 66 Text-content-md5: 8fc6cc1423a547d0e5ed465a46ba9448 Text-content-sha1: 966a5fdcd0bc013a73c5be4ec756b4b1fb3e1824 Content-length: 107 K 15 cvs2svn:cvs-rev V 5 1.126 PROPS-END SVNH -jh`char *help_path; GLOBAL int help_has_contents Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3af577c85855f2146770d6e0799c1c25 Text-delta-base-sha1: 6ac5c4a9a2488612b1e7e8d4c4d1e4223c32dcd3 Text-content-length: 70 Text-content-md5: 398e0c61a5af9f8b92bfdadb527a5d60 Text-content-sha1: 97138145f0991d49cb4eecf66eba9f36851e9ec5 Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN6hHELPBTN 1005 #define IDC_ABOUT 1006 #endif Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c83bc862d9c8bdbf72a0ae3ba4cbaa30 Text-delta-base-sha1: 8a25c7f1b5cc533a94c97841d61f13983fe8effe Text-content-length: 60 Text-content-md5: 91456d3aa832c126b0a402745f6c26a2 Text-content-sha1: 233381974de389e0abc8f0ccdc5ad68affba409c Content-length: 100 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVN{@ ' o PUSHBUTTON "&Help", IDC_HELPBTN, 50 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e26d39060876c08d28de6ea3e514c7c4 Text-delta-base-sha1: c806047ca1b2c5c51b6a1a117d126ff2e6e94042 Text-content-length: 10797 Text-content-md5: 603ad3a7272ab90bdd4030180a04015e Text-content-sha1: 02e75d6d4c36ebe90cfbcb51102a749c89f6c248 Content-length: 10838 K 15 cvs2svn:cvs-rev V 5 1.166 PROPS-END SVN~HB]jIhD1Lx y>(Qq|szstatic int requested_helpIDC_TELNETKEYchar *help_context_cmd(int id) { switch (id) { case IDC_HOSTSTATIC: case IDC_HOST: case IDC_PORTSTATIC: case IDC_PORT: case IDC_PROTSTATIC: case IDC_PROTRAW: case IDC_PROTTELNET: case IDC_PROTRLOGIN: case IDC_PROTSSH: return "JI(`',`session.hostname')"; case IDC_SESSSTATIC: case IDC_SESSEDIT: case IDC_SESSLIST: case IDC_SESSLOAD: case IDC_SESSSAVE: case IDC_SESSDEL: return "JI(`',`session.saved')"; case IDC_CLOSEEXIT: case IDC_COEALWAYS: case IDC_COENEVER: case IDC_COENORMAL: return "JI(`',`session.coe')"; case IDC_LSTATSTATIC: case IDC_LSTATOFF: case IDC_LSTATASCII: case IDC_LSTATRAW: return "JI(`',`logging.main')"; case IDC_LGFSTATIC: case IDC_LGFEDIT: case IDC_LGFBUTTON: case IDC_LGFEXPLAIN: return "JI(`',`logging.filename')"; case IDC_LSTATXIST: case IDC_LSTATXOVR: case IDC_LSTATXAPN: case IDC_LSTATXASK: return "JI(`',`logging.exists')"; case IDC_DELSTATIC: case IDC_DEL008: case IDC_DEL127: return "JI(`',`keyboard.backspace')"; case IDC_HOMESTATIC: case IDC_HOMETILDE: case IDC_HOMERXVT: return "JI(`',`keyboard.homeend')"; case IDC_FUNCSTATIC: case IDC_FUNCTILDE: case IDC_FUNCLINUX: case IDC_FUNCXTERM: case IDC_FUNCVT400: case IDC_FUNCVT100P: case IDC_FUNCSCO: return "JI(`',`keyboard.funkeys')"; case IDC_KPSTATIC: case IDC_KPNORMAL: case IDC_KPAPPLIC: case IDC_NOAPPLICK: return "JI(`',`keyboard.appkeypad')"; case IDC_NOAPPLICC: case IDC_CURSTATIC: case IDC_CURNORMAL: case IDC_CURAPPLIC: return "JI(`',`keyboard.appcursor')"; case IDC_KPNH: return "JI(`',`keyboard.nethack')"; case IDC_COMPOSEKEY: return "JI(`',`keyboard.compose')"; case IDC_CTRLALTKEYS: return "JI(`',`keyboard.ctrlalt')"; case IDC_WRAPMODE: return "JI(`',`terminal.autowrap')"; case IDC_DECOM: return "JI(`',`terminal.decom')"; case IDC_LFHASCR: return "JI(`',`terminal.lfhascr')"; case IDC_BCE: return "JI(`',`terminal.bce')"; case IDC_BLINKTEXT: return "JI(`',`terminal.blink')"; case IDC_ANSWERBACK: case IDC_ANSWEREDIT: return "JI(`',`terminal.answerback')"; case IDC_ECHOSTATIC: case IDC_ECHOBACKEND: case IDC_ECHOYES: case IDC_ECHONO: return "JI(`',`terminal.localecho')"; case IDC_EDITSTATIC: case IDC_EDITBACKEND: case IDC_EDITYES: case IDC_EDITNO: return "JI(`',`terminal.localedit')"; case IDC_BELLSTATIC: case IDC_BELL_DISABLED: case IDC_BELL_DEFAULT: case IDC_BELL_WAVEFILE: case IDC_BELL_VISUAL: case IDC_BELL_WAVESTATIC: case IDC_BELL_WAVEEDIT: case IDC_BELL_WAVEBROWSE: return "JI(`',`bell.style')"; case IDC_B_IND_STATIC: case IDC_B_IND_DISABLED: case IDC_B_IND_FLASH: case IDC_B_IND_STEADY: return "JI(`',`bell.taskbar')"; case IDC_BELLOVL: case IDC_BELLOVLNSTATIC: case IDC_BELLOVLN: case IDC_BELLOVLTSTATIC: case IDC_BELLOVLT: case IDC_BELLOVLEXPLAIN: case IDC_BELLOVLSSTATIC: case IDC_BELLOVLS: return "JI(`',`bell.overload')"; case IDC_ROWSSTATIC: case IDC_ROWSEDIT: case IDC_COLSSTATIC: case IDC_COLSEDIT: return "JI(`',`window.size')"; case IDC_RESIZESTATIC: case IDC_RESIZETERM: case IDC_RESIZEFONT: case IDC_RESIZENONE: case IDC_RESIZEEITHER: return "JI(`',`window.resize')"; case IDC_SCROLLBAR: case IDC_SCROLLBARFULLSCREEN: case IDC_SAVESTATIC: case IDC_SAVEEDIT: case IDC_SCROLLKEY: case IDC_SCROLLDISP: return "JI(`',`window.scrollback')"; case IDC_CLOSEWARN: return "JI(`',`behaviour.closewarn')"; case IDC_ALTF4: return "JI(`',`behaviour.altf4')"; case IDC_ALTSPACE: return "JI(`',`behaviour.altspace')"; case IDC_ALTONLY: return "JI(`',`behaviour.altonly')"; case IDC_ALWAYSONTOP: return "JI(`',`behaviour.alwaysontop')"; case IDC_FULLSCREENONALTENTER: return "JI(`',`behaviour.altenter')"; case IDC_CURSORSTATIC: case IDC_CURBLOCK: case IDC_CURUNDER: case IDC_CURVERT: case IDC_BLINKCUR: return "JI(`',`appearance.cursor')"; case IDC_FONTSTATIC: case IDC_CHOOSEFONT: return "JI(`',`appearance.font')"; case IDC_WINTITLE: case IDC_WINEDIT: case IDC_WINNAME: return "JI(`',`appearance.title')"; case IDC_HIDEMOUSE: return "JI(`',`appearance.hidemouse')"; case IDC_SUNKENEDGE: case IDC_WINBSTATIC: case IDC_WINBEDIT: return "JI(`',`appearance.border')"; case IDC_TTSTATIC: case IDC_TTEDIT: return "JI(`',`connection.termtype')"; case IDC_LOGSTATIC: case IDC_LOGEDIT: return "JI(`',`connection.username')"; case IDC_PINGSTATIC: case IDC_PINGEDIT: return "JI(`',`connection.keepalive')"; case IDC_NODELAY: return "JI(`',`connection.nodelay')"; case IDC_TSSTATIC: case IDC_TSEDIT: return "JI(`',`telnet.termspeed')"; case IDC_ENVSTATIC: case IDC_VARSTATIC: case IDC_VAREDIT: case IDC_VALSTATIC: case IDC_VALEDIT: case IDC_ENVLIST: case IDC_ENVADD: case IDC_ENVREMOVE: return "JI(`',`telnet.environ')"; case IDC_EMSTATIC: case IDC_EMBSD: case IDC_EMRFC: return "JI(`',`telnet.oldenviron')"; case IDC_ACTSTATIC: case IDC_TPASSIVE: case IDC_TACTIVE: return "JI(`',`telnet.passive')"; case IDC_TELNETKEY: return "JI(`',`telnet.specialkeys')"; case IDC_R_TSSTATIC: case IDC_R_TSEDIT: return "JI(`',`rlogin.termspeed')"; case IDC_RLLUSERSTATIC: case IDC_RLLUSEREDIT: return "JI(`',`rlogin.localuser')"; case IDC_NOPTY: return "JI(`',`ssh.nopty')"; case IDC_CIPHERSTATIC2: case IDC_CIPHERLIST: case IDC_CIPHERUP: case IDC_CIPHERDN: case IDC_SSH2DES: return "JI(`',`ssh.ciphers')"; case IDC_BUGGYMAC: return "JI(`',`ssh.buggymac')"; case IDC_SSHPROTSTATIC: case IDC_SSHPROT1: case IDC_SSHPROT2: return "JI(`',`ssh.protocol')"; case IDC_CMDSTATIC: case IDC_CMDEDIT: return "JI(`',`ssh.command')"; case IDC_COMPRESS: return "JI(`',`ssh.compress')"; case IDC_PKSTATIC: case IDC_PKEDIT: case IDC_PKBUTTON: return "JI(`',`ssh.auth.privkey')"; case IDC_AGENTFWD: return "JI(`',`ssh.auth.agentfwd')"; case IDC_AUTHTIS: return "JI(`',`ssh.auth.tis')"; case IDC_AUTHKI: return "JI(`',`ssh.auth.ki')"; case IDC_MBSTATIC: case IDC_MBWINDOWS: case IDC_MBXTERM: return "JI(`',`selection.buttons')"; case IDC_MOUSEOVERRIDE: return "JI(`',`selection.shiftdrag')"; case IDC_SELTYPESTATIC: case IDC_SELTYPELEX: case IDC_SELTYPERECT: return "JI(`',`selection.rect')"; case IDC_CCSTATIC: case IDC_CCLIST: case IDC_CCSET: case IDC_CCSTATIC2: case IDC_CCEDIT: return "JI(`',`selection.charclasses')"; case IDC_RAWCNP: return "JI(`',`selection.linedraw')"; case IDC_RTFPASTE: return "JI(`',`selection.rtf')"; case IDC_BOLDCOLOUR: return "JI(`',`colours.bold')"; case IDC_PALETTE: return "JI(`',`colours.logpal')"; case IDC_COLOURSTATIC: case IDC_COLOURLIST: case IDC_RSTATIC: case IDC_GSTATIC: case IDC_BSTATIC: case IDC_RVALUE: case IDC_GVALUE: case IDC_BVALUE: case IDC_CHANGE: return "JI(`',`colours.config')"; case IDC_CODEPAGESTATIC: case IDC_CODEPAGE: return "JI(`',`translation.codepage')"; case IDC_CAPSLOCKCYR: return "JI(`',`translation.cyrillic')"; case IDC_VTSTATIC: case IDC_VTXWINDOWS: case IDC_VTOEMANSI: case IDC_VTOEMONLY: case IDC_VTPOORMAN: case IDC_VTUNICODE: return "JI(`',`translation.linedraw')"; case IDC_X11_FORWARD: case IDC_X11_DISPSTATIC: case IDC_X11_DISPLAY: return "JI(`',`ssh.tunnels.x11')"; case IDC_LPORT_ALL: case IDC_PFWDSTATIC: case IDC_PFWDSTATIC2: case IDC_PFWDREMOVE: case IDC_PFWDLIST: case IDC_PFWDADD: case IDC_SPORTSTATIC: case IDC_SPORTEDIT: case IDC_DPORTSTATIC: case IDC_DPORTEDIT: case IDC_PFWDLOCAL: case IDC_PFWDREMOTE: return "JI(`',`ssh.tunnels.portfwd')"; default: return NULL; } if (help_path) SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP); else { HWND item = GetDlgItem(hwnd, IDC_HELPBTN); if (item) DestroyWindow(item); } requested_help = FALSE { if (requested_help) { WinHelp(hwnd, help_path, HELP_QUIT, 0); requested_help = FALSE; } EndDialog(hwnd, 1); } else MessageBeep(0); return 0; case IDC_HELPBTN { if (help_path) { WinHelp(hwnd, help_path, help_has_contents ? HELP_FINDER : HELP_CONTENTS, 0); requested_help = TRUE; } } break; case IDCANCEL: if (requested_help) { WinHelp(hwnd, help_path, HELP_QUIT, 0); requested_help = FALSE; }HELP: if (help_path) { int id = ((LPHELPINFO)lParam)->iCtrlId; char *cmd = help_context_cmd(id); if (cmd) { WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); requested_help = TRUE; } else { MessageBeep(0); } } break; case WM_CLOSE: if (requested_help) { WinHelp(hwnd, help_path, HELP_QUIT, 0); requested_help = FALSE; } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1628cbc890965b94c654465d536a9a72 Text-delta-base-sha1: 081a10c1a4f884875b467f8ec8b61a29e6531e9d Text-content-length: 1985 Text-content-md5: c814e44d4e8ee3f8ed3a508a2bd8a14b Text-content-sha1: 03692bbdb29e4b665fe6cb12c479d43a85e45923 Content-length: 2026 K 15 cvs2svn:cvs-rev V 5 1.177 PROPS-END SVN%Zxe_S.N1~nEHELP 0x0140 #define IDM_ABOUT 0x0150 #define IDM_SAVEDSESS 0x0160 #define IDM_COPYALL 0x0170 #define IDM_FULLSCREEN 0x018See if we can find our Help file. */ { char b[2048], *p, *q, *r; FILE *fp; GetModuleFileName(NULL, b, sizeof(b) - 1); r = b; p = strrchr(b, '\\'); if (p && p >= r) r = p+1; q = strrchr(b, ':'); if (q && q >= r) r = q+1; strcpy(r, "putty.hlp"); if ( (fp = fopen(b, "r")) != NULL) { help_path = dupstr(b); fclose(fp); } else help_path = NULL; strcpy(r, "putty.cnt"); if ( (fp = fopen(b, "r")) != NULL) { help_has_contents = TRUE; fclose(fp); } else help_has_contents = FALSE; if (help_path) AppendMenu(m, MF_ENABLED, IDM_HELP, "&Help"IDM_HELP: WinHelp(hwnd, help_path, help_has_contents ? HELP_FINDER : HELP_CONTENTS, 0y##yoWideChar(CP_ACP, 0, s, strlen(s) + 1, 0, 0); *p = converted = smalloc(i * sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, 0, s, strlen(s) + 1, converted, i); *len = i - 1; return; } else CloseClipboard(); } *p = NULL; *len = 0; } #if 0 /* * Move `lines' lines from position `from' to position `to' in the * window. */ void optimised_move(int to, int from, int lines) { RECT r; int min, max; min = (to < from ? to : from); max = to + from - min; r.left = offset_width; r.right = offset_width + cols * font_width; r.top = offset_height + min * font_height; r.bottom = offset_height + (max + lines) * font_height; ScrollWindow(hwnd, 0, (to - from) * font_height, &r, &r); } #endif /* * Print a message box and perform a fatal exit. */ void fatalbox(char *fmt, ...) { va_list ap; char stuff[200]; va_start(ap, fmt); vsprintf(stuff, fmt Revision-number: 1459 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2001-12-06T18:18:46.000000Z K 7 svn:log V 30 Sort out the silly filenames. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8cd69dfd1de33c4666682af21ee72d8e Text-delta-base-sha1: 67c6a4c55529e86a4cc3a9975cab3401bf1395e4 Text-content-length: 135 Text-content-md5: ddf62a52be37d205d8b6f894e17f0d80 Text-content-sha1: 4cd77659167493794d660b921e1a73399868f6f8 Content-length: 174 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNnCvMv mv output.txt puttydoc.txt mv output.hlp putty.hlp mv output.cnt putty.cnt clean: rm -f *.html *.txt *.hlp *.cnt Revision-number: 1460 Prop-content-length: 327 Content-length: 327 K 7 svn:log V 226 Documentation: filled the last few gaps and cleaned a few things up. PuTTY now has a complete manual. Stylistic review, content review and indexing are yet to do, but at least there's some plausible text in every section now. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-06T20:05:39.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ab72668ea15d947e2c728e1ebf91a2ad Text-delta-base-sha1: 654b2d200b3f32db88e2d0e13a1832897cac2259 Text-content-length: 3140 Text-content-md5: 3d7cb56340a458dcf0fa09d995573665 Text-content-sha1: 3689efd6dece56c044758cd7082e361f60e36262 Content-length: 3180 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN;[[5JUo+WWpL8i9#jZuJ^:5OE'*X/\versionid $Id: config.but,v 1.18 2001/12/06 20:05:39 be filled in automatically to the usual value, and you will only need to change it if you have an unusual server. If you select Raw mode (see \k{using-rawprot}), you will almost certainly need to fill (see \k{reset-terminal}) before by the server. This configuration option only controls the \e{default} state. If you modify this option in mid-session using \q{Change Settings}, you will need to reset the terminal (see \k{reset-terminal}) before Background-colour erase can be turned on and off by control sequences sent by the server. This configuration option only controls the \e{default} state. If you modify this option in mid-session using \q{Change Settings}, you will need to reset the terminal (see \k{reset-terminal}) before the change takes effectWhen blinking text is disabled and the server attempts to make some text blink, PuTTY will instead display the text with a bolded background colour. Blinking text(see \k{reset-terminal}) before the change takes effectIf you accidentally write the contents of a binary file to your terminal, you will probably find that it contains more than one ^E character, and as a result your next command line will probably read \q{PuTTYPuTTYPuTTY...} as if you had typed the answerback string multiple times at the keyboard. If you set the answerback string to be empty, this problem should go away, but doing so might cause other problemsPressing Alt-Enter again will restore the previous window size. The full-screen feature is also available from the System menu, even when it is configured not to be available on the Alt-Enter key. See \k{using-fullscreen}See \k{using-x-forwarding} for more information about X11 forwarding.session. See \k{using-port-forwarding} for a general discussion of port forwarding and how it works. The port forwarding section in the Tunnels panel shows a list of all the port forwardings that PuTTY will try to set up when it connects to the server. By default no port forwardings are set up, so this list is empty. To add a port forwarding: \b Set one of the \q{Local} or \q{Remote} radio buttons, depending on whether you want to forward a local port to a remote destination (\q{Local}) or forward a remote port to a local destination (\q{Remote}). \b Enter a source port number into the \q{Source port} box. For local forwardings, PuTTY will listen on this port of your PC. For remote forwardings, your SSH server will listen on this port of the remote machine. Note that most servers will not allow you to listen on port numbers less than 1024. \b Enter a hostname and port number separated by a colon, in the \q{Destination} box. Connections received on the source port will be directed to this destination. For example, to connect to a POP-3 server, you might enter \c{popserver.example.com:110}. \b Click the \q{Add} button. Your forwarding details should appear in the list box. To remove a port forwarding, simply select its details in the list box, and click the \q{Remove} button. Node-path: putty/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 27b247e757c361ccb7a01d2b3b323db6 Text-delta-base-sha1: 380991682c3535446e98b88e9bf0991d14616273 Text-content-length: 210 Text-content-md5: 62ea7ab64058c8b7f02caa78c5fd93ea Text-content-sha1: b6f8ae85378099beec62ce0bd554b6892a578a13 Content-length: 249 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN::*>-^@oX0E }OF(\versionid $Id: gs.but,v 1.6 2001/12/06 20:05 only) If you are not using the SSH window should close itself automatically. You \e{can} close a PuTTY Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79c06a27f98762d83216a6be1bc52551 Text-delta-base-sha1: a46d80730512d6dbd260bb33356cbadfcf0936de Text-content-length: 8076 Text-content-md5: 123cafabf277a5e7ddc96a87079668c8 Text-content-sha1: 89b73e1139b03521725417af3adb4244c3b1ffc5 Content-length: 8116 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNM31dv dt{vz!VMvScc9*B$"eE'\versionid $Id: plink.but,v 1.12 2001/12/06 20:05It is mostly used for automated operations, such as making CVS access a repository on a remote server. Plink is probably not what you want if you want to run an interactive session in a console window. \H{plink-starting} Starting Plink Plink is a command line application. a \i{console window}. In Windows 95, 98, and ME, this is called an \q{MS-DOS Prompt}, and in Windows NT and 2000 it is called a \q{Command Prompt}. It should be available from the Programs section of your Start Menu. In order to use Plink, the file \c{plink.exe} will need either to be on your \i{\c{PATH}} or in your current directory. To add the directory containing Plink to your \c{PATH} environment variable, Using Plink This section describes the basics of how to use Plink for interactive logins and for automated processes.Once this works, you are ready to use Plink. \S{plink-usage-interactive} Using Plink for interactive logins To make a simple interactive connection to a remote server, just type \c{plink} and then the host name: \c Z:\sysosd>plink login.example.com \c \c Debian GNU/Linux 2.2 flunky.example.com \c flunky login: You should then be able to log in as normal and run a session. The output sent by the server will be written straight to your command prompt window, which will most likely not interpret terminal control codes in the way the server expects it to. So if you run any full-screen applications, for example, you can expect to see strange characters appearing in your window. Interactive connections like this are not the main point of Plink. In order to connect with a different protocol, you can give the command line options \c{-ssh}, \c{-telnet}, \c{-rlogin} or \c{-raw}. To make an SSH connection, for example: \c Z:\sysosd>plink -ssh login.example.com \c login as: If you have already set up a PuTTY saved session, then instead of supplying a host name, you can give the saved session name. This allows you to use public-key authentication, specify a user name, and use most of the other features of PuTTY: \c Z:\sysosd>plink my-ssh-session \c Sent username "fred" \c Authenticating with public key "fred@winbox" \c Last login: Thu Dec 6 19:25:33 2001 from :0.0 \c fred@flunky:~$ \S{plink-usage-batch} Using Plink for automated connections More typically Plink is used with the SSH protocol, to enable you to talk directly to a program running on the server. To do this you have to ensure Plink is \e{using} the SSH protocol. You can do this in several ways: \b Use the \c{-ssh} option as described in \k{plink-usage-interactive}. \b Set up a PuTTY saved session that describes the server you are connecting to, and that also specifies the protocol as SSH. \b Set the Windows environment variable \c{PLINK_PROTOCOL} to the word \c{ssh}. Usually Plink is not invoked directly by a user, but run automatically by another process. Therefore you typically do not want Plink to prompt you for a user name or a password. To avoid being prompted for a user name, you can: \b Use the \c{-l} option to specify a user name on the command line. For example, \c{plink login.example.com -l fred}. \b Set up a PuTTY saved session that describes the server you are connecting to, and that also specifies the username to log in as (see \k{config-username}). To avoid being prompted for a password, you should almost certainly set up public-key authentication. (See \k{pubkey} for a general introduction to public-key authentication.) Again, you can do this in two ways: \b Set up a PuTTY saved session that describes the server you are connecting to, and that also specifies a private key file (see \k{config-ssh-privkey}). For this to work without prompting, your private key will need to have no passphrase. \b Store the private key in Pageant. See \k{pageant} for further information. Once you have done all this, you should be able to run a remote command on the SSH server machine and have it execute automatically with no prompting: \c Z:\sysosd>plink login.example.com -l fred echo hello, world \c hello, world \c \c Z:\sysosd> Or, if you have set up a saved session with all the connection details: \c Z:\sysosd>plink mysession echo hello, world \c hello, world \c \c Z:\sysosd> Then you can set up other programs to run this Plink command and talk to it as if it were a process on the server machine. \S{plink-usage-options} Options This section describes Protocol selection options Plink is most useful when using the SSH protocol. However, it allows you to interface to all the protocols supported by PuTTY. You can specify the option \c{-ssh} on the command line to select the SSH protocol; you can also specify \c{-telnet}, \c{-rlogin} or \c{-raw} to select other protocols. \S2{plink-usage-options-P}\c{-P port} connect to specified port If your server machine is running its SSH service on a port other than the standard one, you can specify an alternative port number to connect to using the \c{-P} option, like this: \c plink -ssh login.example.com -P 5022 \S2{plink-usage-options-pw}\c{-pw passw} login with specified password A simple way to automate a remote login is to supply your password on the Plink command line. This is \e{not recommended} for reasons of security. If you possibly can, we recommend you set up public-key authentication instead. See \k{pubkey} for details. \S2{plink-usage-options-user}\c{-l username} login with specified username As described in \k{plink-usage-batch}, you can specify the user name to log in as on the remote server using the \c{-l} option. For example, \c{plink login.example.com -l fred}. \S2{plink-usage-options-cmdfile} \c{-m filename} read command from a file If the command you want to run on the remote server is particularly large, you can read it from a file using the \c{-m} option, instead of putting it directly on Plink's command line. On most Unix systems, you can even put multiple lines in this file and execute more than one command in sequence, or a whole shell script. \S2{plink-usage-options-portfwd} \c{-L} and \c{-R} set up port forwarding Plink allows you to use port forwarding just as PuTTY does; if you have set up a PuTTY saved session that specifies port forwardings, and you connect to that session using Plink, then the same port forwardings will be set up. For convenience, Plink also offers the option to set up port forwarding on the command line. The command-line options work just like the ones in Unix \c{ssh} programs. To forward a local port (say 5110) to a remote destination (say \cw{popserver.example.com} port 110), you can write: \c plink mysession -L 5110:popserver.example.com:110 And to forward a remote port to a local destination, just use the \c{-R} option instead of \c{-L}: \c plink mysession -R 5023:mytelnetserver.myhouse.org:23 For general information on port forwarding, see \k{using-port-forwarding}. \H{plink-batch} Using Plink in \i{batch files} and \i{scripts} Once you have set up Plink to be able to log in to a remote server without any interactive prompting (see \k{plink-usage-batch}), you can use it for lots of scripting and batch purposes. For example, to start a backup on a remote machine, you might use a command like: \c plink root@myserver /etc/backups/do-backup.sh Or perhaps you want to fetch all system log lines relating to a particular web area: \c plink mysession grep /~fjbloggs/ /var/log/httpd/access.log > fredlogs Any non-interactive command you could usefully run on the server command line, you can run in a batch file using Plink in this way.ny interactive prompts, as described in \k{plink-usage-batch}. You should then be don't even need to specify the \q{user} part of this, and you can just say: \c cvs -d :ext:sessionnon-interactively, as described in \k{plink-usage-batch}. Then, i\cw{rsh} name} and in the text entry field to the right enter the full path to \c{plink.exe}. Select # \H{plink-whatelse} Using Plink with... ? Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: df2ee3b020cdd85be310410a9d9ee47f Text-delta-base-sha1: e1f8962a25c3df366a674c9e07187ff14ac5c481 Text-content-length: 87 Text-content-md5: e8fdda751d1e054884c4728843f1b8e7 Text-content-sha1: 63a1650cc3d91735504f5134b851746417dd651f Content-length: 127 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN""5!2OTl$\versionid $Id: pubkey.but,v 1.11 2001/12/06 20:05 Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 524be171590d641ec0906275e132a071 Text-delta-base-sha1: 45b57b78eb449e1659f5c930c74c4ade298bceff Text-content-length: 5645 Text-content-md5: 5d45d940bd6b9e09b1053b0512b6f6a1 Text-content-sha1: 7faad6605d7a3199cb99d9f94ed214252ff3bb95 Content-length: 5684 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN6Xy_3F\versionid $Id: using.but,v 1.3 2001/12/06 20:05:39x-forwarding} Using X11 forwarding in SSH The SSH protocol has the ability to securely forward X Window System applications over your encrypted SSH connection, so that you can run an application on the SSH server machine and have it put its windows up on your local machine without sending any X network traffic in the clear. In order to use this feature, you will need an X display server for your Windows machine, such as X-Win32 or Exceed. This will probably install itself as display number 0 on your local machine; if it doesn't, the manual for the X server should tell you what it does do. You should then tick the \q{Enable X11 forwarding} box in the Tunnels panel (see \k{config-ssh-x11}) before starting your SSH session. The \q{X display location} box reads \c{localhost:0} by default, which is the usual display location where your X server will be installed. If that needs changing, then change it. Now you should be able to log in to the SSH server as normal. To check that X forwarding has been successfully negotiated during connection startup, you can check the PuTTY Event Log (see \k{using-eventlog}). It should say something like this: \c 2001-12-05 17:22:01 Requesting X11 forwarding \c 2001-12-05 17:22:02 X11 forwarding enabled If the remote system is Unix or Unix-like, you should also be able to see that the \c{DISPLAY} environment variable has been set to point at display 10 or above on the SSH server machine itself: \c fred@unixbox:~$ echo $DISPLAY \c unixbox:10.0 If this works, you should then be able to run X applications in the remote session and have them display their windows on your PC. Note that if your PC X server requires authentication to connect, then PuTTY cannot currently support it. If this is a problem for you, you should mail the authors \#{FIXME} and give details. \H{using-port-forwarding} Using port forwarding in SSH The SSH protocol has the ability to forward arbitrary network connections over your encrypted SSH connection, to avoid the network traffic being sent in clear. For example, you could use this to connect from your home computer to a POP-3 server on a remote machine without your POP-3 password being visible to network sniffers. In order to use port forwarding to connect from your local machine to a port on a remote server, you need to: \b Choose a port number on your local machine where PuTTY should listen for incoming connections. There are likely to be plenty of unused port numbers above 3000. \b Now, before you start your SSH connection, go to the Tunnels panel (see \k{config-ssh-portfwd}). Make sure the \q{Local} radio button is set. Enter the local port number into the \q{Source port} box. Enter the destination host name and port number into the \q{Destination} box, separated by a colon (for example, \c{popserver.example.com:110} to connect to a POP-3 server). \b Now click the \q{Add} button. The details of your port forwarding should appear in the list box. Now start your session. To check that PuTTY has set up the port forwarding correctly, you can look at the PuTTY Event Log (see \k{using-eventlog}). It should say something like this: \c 2001-12-05 17:22:10 Local port 3110 forwarding to \c popserver.example.com:110 Now if you connect to the source port number on your local PC, you should find that it answers you exactly as if it were the service running on the destination machine. So in this example, you could then configure an e-mail client to use \c{localhost:3110} as a POP-3 server instead of \c{popserver.example.com:110}. (Of course, the forwarding will stop happening when your PuTTY session closes down.) You can also forward ports in the other direction: arrange for a particular port number on the \e{server} machine to be forwarded back to your PC as a connection to a service on your PC or near it. To do this, just select the \q{Remote} radio button instead of the \q{Local} one. The \q{Source port} box will now specify a port number on the \e{server} (note that most servers will not allow you to use port numbers under 1024 for this purpose). \H{using-rawprot} Making raw TCP connections A lot of Internet protocols are composed of commands and responses in plain text. For example, SMTP (the protocol used to transfer e-mail), NNTP (the protocol used to transfer Usenet news), and HTTP (the protocol used to serve Web pages) all consist of commands in readable plain text. Sometimes it can be useful to connect directly to one of these services and speak the protocol \q{by hand}, by typing protocol commands and watching the responses. On Unix machines, you can do this using the system's \c{telnet} command to connect to the right port number. For example, \c{telnet mailserver.example.com 25} might enable you to talk directly to the SMTP service running on a mail server. Although the Unix \c{telnet} program provides this functionality, the protocol being used is not really Telnet. Really there is no actual protocol at all; the bytes sent down the connection are exactly the ones you type, and the bytes shown on the screen are exactly the ones sent by the server. Unix \c{telnet} will attempt to detect or guess whether the service it is talking to is a real Telnet service or not; PuTTY prefers to be told for certain. In order to make a debugging connection to a service of this type, you simply select the fourth protocol name, \q{Raw}, from the \q{Protocol} buttons in the \q{Session} configuration panel. (See \k{config-hostname}.) You can then enter a host name and a port number, and make the connection. Revision-number: 1461 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:12.278587Z PROPS-END Revision-number: 1462 Prop-content-length: 182 Content-length: 182 K 8 svn:date V 27 2001-12-07T20:36:56.000000Z K 7 svn:log V 82 Add -rlogin to Plink, for orthogonality (and because I documented it yesterday!). K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ae3e17d95477f3b5b328bde9e1a90bc Text-delta-base-sha1: c6b394d3c34280fd9ef8756a2bf1322cf9becde5 Text-content-length: 114 Text-content-md5: 8ed3ec5d08fd644ab43a52c6dabf2eda Text-content-sha1: ef71c9c4da5c9553e52c48723c174c9ebea518d3 Content-length: 154 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVN% ZMZy,login")) { default_protocol = cfg.protocol = PROT_RLOGIN; default_port = cfg.port = 51 Revision-number: 1463 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2001-12-07T20:37:18.000000Z K 7 svn:log V 84 Owen's patch to allow PowerMenu (third-party transparency tool) to not crash PuTTY. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c814e44d4e8ee3f8ed3a508a2bd8a14b Text-delta-base-sha1: 03692bbdb29e4b665fe6cb12c479d43a85e45923 Text-content-length: 520 Text-content-md5: 91534b08df4c96546d04295fd83783b2 Text-content-sha1: c494895ea6ab44521a95f1077730e1e9831c82ed Content-length: 561 K 15 cvs2svn:cvs-rev V 5 1.178 PROPS-END SVNwwm.if ((lParam - IDM_SAVED_MIN) / 16 < nsessions) { char *session = sessions[(lParam - IDM_SAVED_MIN) / 16]; cl = smalloc(16 + strlen(session)); /* 8, but play safe */ if (!cl) cl = NULL; /* not a very important failure mode */ else { sprintf(cl, "putty @%s", session); freecl = TRUE; } } else break;ee{ char *s; int i; CloseClipboard(); s = GlobalLock(clipdata); i = MultiByteT Revision-number: 1464 Prop-content-length: 387 Content-length: 387 K 8 svn:date V 27 2001-12-07T21:21:03.000000Z K 7 svn:log V 286 FIFTH ATTEMPT at getting full-screen mode right. This new attempt (which I'll comment at some stage) should combine the believable semantics of RDB's fullscreen-by-maximise mode with the multi- monitor friendliness of Wez Furlong's approach while also working on Win98. If we're lucky. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 91534b08df4c96546d04295fd83783b2 Text-delta-base-sha1: c494895ea6ab44521a95f1077730e1e9831c82ed Text-content-length: 3512 Text-content-md5: 06344ea5511944f2cace9d67c3626115 Text-content-sha1: 88e802fdc5863896a387a84f3045b74b0fe6fc91 Content-length: 3553 K 15 cvs2svn:cvs-rev V 5 1.179 PROPS-END SVNg:RFEGb LE{k6\]bkqtN~~rAaHj}@4Pf WINVER < 0x0500 #define COMPILE_MULTIMON_STUBS #include #define WM_FULLSCR_ON_MAX (WM_XUSER + 3static int is_full_screen(void); static void make_full_screen(void); static void clear_full_screen(void); static void flip_full_screen(void); /* Window layout information */ static void reset_window(int) static int fullscr_on_maxIsZoomed(hwnd) && (cfg.resize_action == RESIZE_DISABLED)) { ShowWindow(hwnd, SW_RESTOREis_full_screen() flip_full_screen(); is_full_screen()FULLSCR_ON_MAX: fullscr_on_max = TRUE; break;if (fullscr_on_max) make_full_screen(); fullscr_on_max = FALSE;clear_full_screen()is_full_screen() ? !cfg.scrollbar_in_fullscreen : !cfg.scrollbarbb|w>q>8I+~rted = 0; } if (!p) { if (clipdata) GlobalUnlock(clipdata); clipdata = NULL; return; } else if (OpenClipboard(NULL)) { if ((clipdata = GetClipboardData(CF_UNICODETEXT))) { CloseClipboard(); *p = GlobalLock(clipdata); if (*p) { for (p2 = *p; *p2; p2++); *len = p2 - *p; return; } } else if ( (clipdata = GetClipboardData(CF_TEXT)) ) ) { if (!zoomed) ShowWindow(hwnd, SW_RESTORE); /* * See if we're in full-screen mode. */ int is_full_screen() { if (!IsZoomed(hwnd)) return FALSE; if (GetWindowLong(hwnd, GWL_STYLE) & WS_CAPTION) return FALSE; return TRUE; } /* * Go full-screen. This should only be called when we are already * maximised. */ void make_full_screen() { DWORD style; int x, y, w, h; assert(IsZoomed(hwnd)); /* Remove the window furniture. */ style = GetWindowLong(hwnd, GWL_STYLE); style &= ~(WS_CAPTION | WS_BORDER | WS_THICKFRAME); if (cfg.scrollbar_in_fullscreen) style |= WS_VSCROLL; else style &= ~WS_VSCROLL; SetWindowLong(hwnd, GWL_STYLE, style); /* Resize ourselves to exactly cover the nearest monitor. */ #ifdef MONITOR_DEFAULTTONEAREST { HMONITOR mon; MONITORINFO mi; mon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); mi.cbSize = sizeof(mi); GetMonitorInfo(mon, &mi); x = mi.rcMonitor.left; y = mi.rcMonitor.top; w = mi.rcMonitor.right; h = mi.rcMonitor.bottom; } #else x = y = 0; w = GetSystemMetrics(SM_CXSCREEN); h = GetSystemMetrics(SM_CYSCREEN); #endif SetWindowPos(hwnd, HWND_TOP, x, y, w, h, SWP_FRAMECHANGED); /* Tick the menu item in the System menu. */ CheckMenuItem(GetSystemMenu(hwnd, FALSE), IDM_FULLSCREEN, MF_CHECKED); } /* * Clear the full-screen attributes. */ void clear_full_screen() { DWORD oldstyle, style; /* Reinstate the window furniture. */ style = oldstyle = GetWindowLong(hwnd, GWL_STYLE); style |= WS_CAPTION | WS_BORDER | WS_THICKFRAME; if (cfg.scrollbar) style |= WS_VSCROLL; else style &= ~WS_VSCROLL; if (style != oldstyle) { SetWindowLong(hwnd, GWL_STYLE, style); SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); } /* Untick the menu item in the System menu. */ CheckMenuItem(GetSystemMenu(hwnd, FALSE), IDM_FULLSCREEN, MF_UNCHECKED); } /* * Toggle full-screen mode. */ void flip_full_screen() { if (is_full_screen()) { ShowWindow(hwnd, SW_RESTORE); } else if (IsZoomed(hwnd)) { make_full_screen(); } else { SendMessage(hwnd, WM_FULLSCR_ON_MAX, 0, 0); ShowWindow(hwnd, SW_MAXIMIZE); } Revision-number: 1465 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:12.452222Z PROPS-END Revision-number: 1466 Prop-content-length: 386 Content-length: 386 K 7 svn:log V 285 Andrew Francis's Pageant updates: you can now multi-select key files to add and keys to remove (in the open-file dialog and the key list box respectively), and passphrases are cached during the process of adding several keys at once (in case two of the keys have the same passphrase). K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-10T17:40:14.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7c07574df58e7cd6b08062c917d52703 Text-delta-base-sha1: c5e62e032e3acdb37d9518757e821212e452c7c2 Text-content-length: 3861 Text-content-md5: 5c09f4f6acde55b3e5673b15617ad230 Text-content-sha1: 023e6dd9f8e83037d1b6632ad2def55abb0e2c6c Content-length: 3901 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNG<`'1F\/, z:om(J=} =e[ @?_8oa+]`gstatic tree234 *passphrases = NULL; /* * After processing a list of filenames, we want to forget the * passphrases. */ static void forget_passphrases(void) { int i; while (count234(passphrases) > 0) { char *pp = index234(passphrases, 0); memset(pp, 0, strlen(pp)); delpos234(passphrases, 0); free(pp); } } int original_pass; original_pass = 0; do { if (needs_pass) { /* try all the remembered passphrases first */ char *pp = index234(passphrases, attempts); if(pp) { strcpy(passphrase, pp); } else { int dlgret; original_pass = 1; dlgret = DialogBoxParam(instance, MAKEINTRESOURCE(210), NULL, PassphraseProc, (LPARAM) & pps); passphrase_box = NULL; if (!dlgret) { if (comment) sfree(comment); if (ver == 1) sfree(rkey); return; /* operation cancelled */ } /* if they typed in an ok passphrase, remember it */ if(original_pass && ret) { char *pp = dupstr(passphrase); addpos234(passphrases, pp, 0); } char *filelist = smalloc(8192); char *filewalker; int n, dirlen; list; *filelist = '\0'; of.nMaxFile = FILENAME_MAXOFN_ALLOWMULTISELECT | OFN_EXPLORER; if (GetOpenFileName(&of)) { if(strlen(filelist) > of.nFileOffset) /* Only one filename returned? */ add_keyfile(filelist); else { /* we are returned a bunch of strings, end to * end. first string is the directory, the * rest the filenames. terminated with an * empty string. */ filewalker = filelist; dirlen = strlen(filewalker); if(dirlen > FILENAME_MAX - 8) return; memcpy(filename, filewalker, dirlen); filewalker += dirlen + 1; filename[dirlen++] = '\\'; /* then go over names one by one */ for(;;) { n = strlen(filewalker) + 1; /* end of the list */ if(n == 1) break; /* too big, shouldn't happen */ if(n + dirlen > FILENAME_MAX) break; memcpy(filename + dirlen, filewalker, n); filewalker += n; add_keyfile(filename); } } keylist_update(); forget_passphrases(); } sfree(filelist);i; int rCount, sCount; int *selectedArray; /* our counter within the array of selected items */ int itemNum; /* get the number of items selected in the list */ int numSelected = SendDlgItemMessage(hwnd, 100, LB_GETSELCOUNT, 0, 0); /* none selected? that was silly */ if (numSelected == 0) { MessageBeep(0); break; } /* get item indices in an array */ selectedArray = smalloc(numSelected * sizeof(int)); SendDlgItemMessage(hwnd, 100, LB_GETSELITEMS, numSelected, (WPARAM)selectedArray); itemNum = numSelected - 1; rCount = count234(rsakeys); sCount = count234(ssh2keys); /* go through the non-rsakeys until we've covered them all, * and/or we're out of selected items to check. note that * we go *backwards*, to avoid complications from deleting * things hence altering the offset of subsequent items */ for (i = sCount - 1; (itemNum >= 0) && (i >= 0); i--) { skey = index234(ssh2keys, i); if (selectedArray[itemNum] == rCount + i) { del234(ssh2keys, skey); skey->alg->freekey(skey->data); sfree(skey); itemNum--; } } /* do the same for the rsa keys */ for (i = rCount - 1; (itemNum >= 0) && (i >= 0); i--) { rkey = index234(rsakeys, i); if(selectedArray[itemNum] == i) { del234(rsakeys, rkey); freersakey(rkey); sfree(rkey); itemNum--; } } sfree(selectedArray); Initialise storage for short-term passphrase cache. */ passphrases = newtree234(NULL); /* * Forget any passphrase that we retained while going over * command line keyfiles. */ forget_passphrases(); Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a4bb2752fac3eaa5a11f78929ec27b71 Text-delta-base-sha1: ae101861b7f67f22ce8310062407089b40d8d17d Text-content-length: 34 Text-content-md5: d985c97825104bd11ed641d183894340 Text-content-sha1: 4ff69dfdf480a0a1dc8f8711e020a58b1c76af65 Content-length: 73 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNCU BEXTENDEDSEL | Revision-number: 1467 Prop-content-length: 226 Content-length: 226 K 8 svn:date V 27 2001-12-10T17:50:03.000000Z K 7 svn:log V 125 RDB's patch to allow the `-c' option to Pageant to take a command _with arguments_. Duh, should have thought of that myself. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5c09f4f6acde55b3e5673b15617ad230 Text-delta-base-sha1: 023e6dd9f8e83037d1b6632ad2def55abb0e2c6c Text-content-length: 352 Text-content-md5: b1d76e0bf884074c2d84f4d9b45a2480 Text-content-sha1: dd989ccc0f25a2d7cf4d70a070431a249a184a51 Content-length: 392 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN<<pT77h3 char * args, int show) { if (ShellExecute(NULL, _T("open"), cmdline, args { char *args; if (command[0] == '"') args = strchr(++command, '"'); else args = strchr(command, ' '); if (args) { *args++ = 0; while(*args && isspace(*args)) args++; } spawn_cmd(command, args, show); } Revision-number: 1468 Prop-content-length: 288 Content-length: 288 K 8 svn:date V 27 2001-12-10T18:12:51.000000Z K 7 svn:log V 187 Apparently sending DISCONNECT on a normal SSH2 connection close is actually _less_ polite than just closing the connection, rather than more polite as I'd believed. So we now just close. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ce53980dcff8403af4bb78fb8fc9e69f Text-delta-base-sha1: b9c291248f908962b2d2d755a33b6a0dd6a88c15 Text-content-length: 676 Text-content-md5: 7592f5f5304c7a7b81dcaf832734db3b Text-content-sha1: bd0b31d576cbbaf1e92fdb077a3da6e7747362e5 Content-length: 717 K 15 cvs2svn:cvs-rev V 5 1.184 PROPS-END SVN qk}#if 0 /* * We used to send SSH_MSG_DISCONNECT here, * because I'd believed that _every_ conforming * SSH2 connection had to end with a disconnect * being sent by at least one side; apparently * I was wrong and it's perfectly OK to * unceremoniously slam the connection shut * when you're done, and indeed OpenSSH feels * this is more polite than sending a * DISCONNECT. So now we don't. */#endif Revision-number: 1469 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2001-12-11T18:47:35.000000Z K 7 svn:log V 22 Fix compiler warnings K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e4ab6358bf6258070fe962f6fc4c65a Text-delta-base-sha1: a6cb96bf0495fd27890d8c216ca06ab81c4079a8 Text-content-length: 22 Text-content-md5: bea9c9a8014138ce6eea68d309f6f7ef Text-content-sha1: d02a4732c10822bde54dad4f6b9f895f36f93d81 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNS$ !P Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 06344ea5511944f2cace9d67c3626115 Text-delta-base-sha1: 88e802fdc5863896a387a84f3045b74b0fe6fc91 Text-content-length: 101 Text-content-md5: 21f525f33ea286a1ff8fadb05e22a01d Text-content-sha1: 7b7dad816737d5d44ee32e71dc1640dc2f719df0 Content-length: 142 K 15 cvs2svn:cvs-rev V 5 1.180 PROPS-END SVN:([6C=rted = 0; } if (!p) { if (clipdata) GlobalUnb((: Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 44053d46e249d5f175aec641bbceefec Text-delta-base-sha1: 423bcf792732407c038492bd88045c6a083ae515 Text-content-length: 44 Text-content-md5: 38da59a6655054b6533dc192e8afb3cb Text-content-sha1: e45e58087f6d6db44d39d37513b09ea85ba960d9 Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNK^ 44(struct sockaddr *) Revision-number: 1470 Prop-content-length: 410 Content-length: 410 K 8 svn:date V 27 2001-12-11T18:47:55.000000Z K 7 svn:log V 309 Fixes to full-screen mode. There were various problems when you went full-screen, then selected Change Settings and then changed the resize behaviour, ranging from the window staying FS but acquiring borders to the window restoring its previous size and _failing_ to acquire borders. Should now all be fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 21f525f33ea286a1ff8fadb05e22a01d Text-delta-base-sha1: 7b7dad816737d5d44ee32e71dc1640dc2f719df0 Text-content-length: 1089 Text-content-md5: e042a51984a1b3ba1289af8f3cc00fe2 Text-content-sha1: d63c3dfafa8f9914c18ff28003149dfb329be240 Content-length: 1130 K 15 cvs2svn:cvs-rev V 5 1.181 PROPS-END SVN'lbX%tM.[W (cfg.resize_action == RESIZE_EITHER && IsZoomed(hwnd)) if (cfg.resize_action == RESIZE_DISABLED || is_full_screen()) nflg &= ~WS_THICKFRAME; else nflg |= WS_THICKFRAME; if (cfg.resize_action == RESIZE_DISABLED) nflg &= ~WS_MAXIMIZEBOX; else nflg |= WS_MAXIMIZEBOX if (wParam == SIZE_RESTORED) clear_full_screen(); if (wParam == SIZE_MAXIMIZED && fullscr_on_max) { make_full_screen(); fullscr_on_max = FALSE; }reset_window(0); } else if (wParam == SIZE_RESTORED && was_zoomed) { was_zoomed = 0(.vj0xct) SendMessage(hwnd, WM_IGNORE_CLIP, FALSE, 0); } void get_clip(wchar_t ** p, int *len) { static HGLOBAL clipdata = NULL; static wchar_t *converted = 0; wchar_t *p2; if (converted) { sfree(converted); converted = 0; } if (!p) { if (clipdata) GlobalUn; if (cfg.resize_action == RESIZE_DISABLED) style &= ~WS_THICKFRAME; else style |= Revision-number: 1471 Prop-content-length: 384 Content-length: 384 K 8 svn:date V 27 2001-12-11T18:48:29.000000Z K 7 svn:log V 283 Add help support to Pageant. (For the primary - non-context - help, we just invoke the same help file and jump to the Pageant chapter. It would be nice to be able to bring up the contents box with the Pageant chapter expanded, but I don't think WinHelp() allows us to request this.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ed14bd806cdef23426feac2ed00199d5 Text-delta-base-sha1: fe2500f688a21b20a35e6005c4f4c77fc0ab44d2 Text-content-length: 2899 Text-content-md5: f29e6d5840ec8bd58049258e5c53eb0b Text-content-sha1: 8bafa599f3d67f566be4d884a834cd19a112376e Content-length: 2938 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNh3+Co2B9.80\versionid $Id: pageant.but,v 1.6 2001/12/11 18:48:29 simon Exp $ \C{pageant} Using Pageant for authentication \cfg{winhelp-topic}{pageant.general}, until you load a private key into it After you add one or more keys, they will show up in the list boxmainwin} The Pageant main window The Pageant main window appears when you left-click on the Pageant system tray icon, or alternatively right-click and select \q{View Keys} from the menu. You can use it to keep track of what keys are currently loaded into Pageant, and to add new ones or remove the existing keys. \S{pageant-mainwin-keylist} The key list box \cfg{winhelp-topic}{pageant.keylist} The large list box in the Pageant main window lists the private keys that are currently loaded into Pageant. The list might look something like this: \c ssh1 1024 22:c3:68:3b:09:41:36:c3:39:83:91:ae:71:b2:0f:04 key1 \c ssh-rsa 1023 74:63:08:82:95:75:e1:7c:33:31:bb:cb:00:c0:89:8b key2 For each key, the list box will tell you: \b The type of the key. Currently, this can be \c{ssh1} (an RSA key for use with the SSH v1 protocol), \c{ssh-rsa} (an RSA key for use with the SSH v2 protocol), or \c{ssh-dss} (a DSA key for use with the SSH v2 protocol). \b The size (in bits) of the key. \b The fingerprint for the public key. This should be the same fingerprint given by PuTTYgen, and (hopefully) also the same fingerprint shown by remote utilities such as \c{ssh-keygen} when applied to your \c{authorized_keys} file. \b The comment attached to the key. \S{pageant-mainwin-addkey} The \q{Add Key} button \cfg{winhelp-topic}{pageant.addkey} To add a key to Pageant by reading it out of a local disk file, press the \q{Add Key} button in the Pageant main window, or alternatively right-click on the Pageant icon in the system tray and select \q{Add Key} from there. Pageant will bring up a file dialog, labelled \q{Select Private Key File}. Find your private key file in this dialog, and press \q{Open}. If you want to add more than one key at once, you can select multiple files using Shift-click (to select several adjacent files) or Ctrl-click (to select non-adjacent files). Pageant will now load the private key(s). If a key is protected by a passphrase, Pageant will ask you to type the passphrase. (This is not the only way to add a private key to Pageant. You can also add one from a remote system by using agent forwarding; see \k{pageant-forward} for details.) \S{pageant-mainwin-remkey} The \q{Remove Key} button \cfg{winhelp-topic}{pageant.remkey} If you need to remove a key from Pageant, select that key in the list box, and press the \q{Remove Key} button. Pageant will remove the key from its memory. You can apply this to keys you added using the \q{Add Key} button, or to keys you added remotely using agent forwarding (see \k{pageant-forward}); it makes no difference Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b1d76e0bf884074c2d84f4d9b45a2480 Text-delta-base-sha1: dd989ccc0f25a2d7cf4d70a070431a249a184a51 Text-content-length: 3176 Text-content-md5: cced85ac5fc59e7bc52769d42b9eb8f1 Text-content-sha1: 4ffc49ead824e96aff2a2a79136fa4ea487814bd Content-length: 3216 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVNgsa1Shk?QHycc\O3=Wo{ # _fCwiQrxmiscHELP 0x0040 #define IDM_ABOUT 0x0050 #define APPNAME "Pageant" extern char ver[]; static HINSTANCE instance; static HWND main_static int requested_help; static char *help_pathmain_main_ if (help_path) SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP); else { HWND item = GetDlgItem(hwnd, 103); /* the Help button */ if (item) DestroyWindow(item); } requested_help = FALSE; case 103: /* help */ if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (help_path) { WinHelp(main_hwnd, help_path, HELP_COMMAND, (DWORD)"JI(`',`pageant.general')"); requested_help = TRUE; } } return 0; } return 0; case WM_HELP: if (help_path) { int id = ((LPHELPINFO)lParam)->iCtrlId; char *cmd = NULL; switch (id) { case 100: cmd = "JI(`',`pageant.keylist')"; break; case 101: cmd = "JI(`',`pageant.addkey')"; break; case 102: cmd = "JI(`',`pageant.remkey')"; break; } if (cmd) { WinHelp(main_hwnd, help_path, HELP_COMMAND, (DWORD)cmd); requested_help = TRUE; } else { MessageBeep(0); } } break case IDM_HELP: if (help_path) { WinHelp(main_hwnd, help_path, HELP_COMMAND, (DWORD)"JI(`',`pageant.general')"); requested_help = TRUE; } break; } break; case WM_DESTROY: if (requested_help) { WinHelp(main_hwnd, help_path, HELP_QUIT, 0); requested_help = FALSE; }See if we can find our Help file. */ { char b[2048], *p, *q, *r; FILE *fp; GetModuleFileName(NULL, b, sizeof(b) - 1); r = b; p = strrchr(b, '\\'); if (p && p >= r) r = p+1; q = strrchr(b, ':'); if (q && q >= r) r = q+1; strcpy(r, "putty.hlp"); if ( (fp = fopen(b, "r")) != NULL) { help_path = dupstr(b); fclose(fp); } else help_path = NULL; }main_hwnd = keylist = NULL; main_hwnd = CreateWindow(APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, NULL, NULL, inst, NULL); /* Set up a system tray icon */ AddTrayIcon(main_ AppendMenu(systray_menu, MF_SEPARATOR, 0, 0); if (help_path) AppendMenu(systray_menu, MF_ENABLED, IDM_HELP, "&Help"); AppendMenu(systray_menu, MF_ENABLED, IDM_ABOUT, "&About"); AppendMenu(systray_menu, MF_SEPARATOR, 0, 0); AppendMenu(systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit"); ShowWindow(main_main_ Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d985c97825104bd11ed641d183894340 Text-delta-base-sha1: 4ff69dfdf480a0a1dc8f8711e020a58b1c76af65 Text-content-length: 56 Text-content-md5: d04efb6c0e0c71ff858514607293d29f Text-content-sha1: 82bee347d4f193ff44b1944f7e03c29b837c24c4 Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNU #7(-PUSHBUTTON "&Help", 103, 10, 182, 5 Revision-number: 1472 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2001-12-11T20:08:12.000000Z K 7 svn:log V 99 Fix error handling in sftp (the sftp_recv return value was being checked for NULL almost nowhere). K 10 svn:author V 5 simon PROPS-END Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 651fb8353eca49c452aecd28590bc9b0 Text-delta-base-sha1: 24e9c63e06e893d530df8a77e0c992706f0d546b Text-content-length: 1533 Text-content-md5: 43bbc89c032e959a8c81df5849af6654 Text-content-sha1: 17d03158848f6ad0df30a1861c72731586a9f8fb Content-length: 1573 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNu/`n^ h^}o^AfY ![c;[g['y[Ty3n[{y{'[{y [Sy&p[Tyed\bC^[D1f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return NULL; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return NULL; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return NULL; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return 0; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return 0; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return 0; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return 0; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return 0; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return 0; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return 0; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return 0; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return -1; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return NULL; }f (!pktin) { fxp_internal_error("did not receive a valid SFTP packet\n"); return 0; } Revision-number: 1473 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:13.131672Z PROPS-END Revision-number: 1474 Prop-content-length: 362 Content-length: 362 K 8 svn:date V 27 2001-12-11T21:00:01.000000Z K 7 svn:log V 261 Disable username switching between SSH2 auth attempts, and add a configurable option so users can re-enable the feature _if_ they know they have an SSH2 server that isn't going to get shirty about it. Inspired by a spectacular increase in OpenSSH's shirtiness. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d7cb56340a458dcf0fa09d995573665 Text-delta-base-sha1: 3689efd6dece56c044758cd7082e361f60e36262 Text-content-length: 1076 Text-content-md5: 71350c86439969d3a72c6e60727d9e3f Text-content-sha1: 5ff24cea8dd19e94fbc647c5f27aac5354c28a6d Content-length: 1116 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN;.5b)\versionid $Id: config.but,v 1.19 2001/12/11 21:00:01agentfwd} \q{Allow attempted changes of username in SSH2} \cfg{winhelp-topic}{ssh.auth.changeuser} In the SSH 1 protocol, it is impossible to change username after failing to authenticate. So if you mis-type your username at the PuTTY \q{login as:} prompt, you will not be able to change it except by restarting PuTTY. The SSH 2 protocol \e{does} allow changes of username, in principle, but does not make it mandatory for SSH 2 servers to accept them. In particular, OpenSSH does not accept a change of username; once you have sent one username, it will reject attempts to try to authenticate as another user. (Depending on the version of OpenSSH, it may quietly return failure for all login attempts, or it may send an error message.) For this reason, PuTTY will by default not prompt you for your username more than once, in case the server complains. If you know your server can cope with it, you can enable the \q{Allow attempted changes of username} option to modify PuTTY's behaviour Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8fc6cc1423a547d0e5ed465a46ba9448 Text-delta-base-sha1: 966a5fdcd0bc013a73c5be4ec756b4b1fb3e1824 Text-content-length: 83 Text-content-md5: f7d9fd36e4e45f411b2cc00be847f216 Text-content-sha1: 82520793515c29bd3d2aecd1e2d12954843524bd Content-length: 124 K 15 cvs2svn:cvs-rev V 5 1.127 PROPS-END SVNF >a'Xchange_username; /* allow username switching in SSH2 */ Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 15bbf39a861c99ffa2c243f70425c0b3 Text-delta-base-sha1: 7b365554c807a90a74530abaa52ba6183fd718c7 Text-content-length: 145 Text-content-md5: acbe807b4de25820751ddcbda7a454e1 Text-content-sha1: 74d46193342658a23008895e028a9ae031a7932f Content-length: 185 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVN5:t1 ) ,rite_setting_i(sesskey, "ChangeUsername", cfg->change_usernamepi(sesskey, "ChangeUsername", 0, &cfg->change_username Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7592f5f5304c7a7b81dcaf832734db3b Text-delta-base-sha1: bd0b31d576cbbaf1e92fdb077a3da6e7747362e5 Text-content-length: 264 Text-content-md5: 110188a4896a099a1bd5d3aaa9cc73b1 Text-content-sha1: 91e884a6ce80a8abc77cc80a9342c8b586f186e5 Content-length: 305 K 15 cvs2svn:cvs-rev V 5 1.185 PROPS-END SVN nXEX@Eyusername[0] = '\0';*username && !cfg.change_username) { /* * We got a username last time round this loop, and * with change_username turned off we don't try to get * it again. */ } else Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 603ad3a7272ab90bdd4030180a04015e Text-delta-base-sha1: 02e75d6d4c36ebe90cfbcb51102a749c89f6c248 Text-content-length: 334 Text-content-md5: 8b6571771e02d5a6541b80cf152597da Text-content-sha1: c54192b3febb34a359f78c3cb6a2d8213b1788fd Content-length: 375 K 15 cvs2svn:cvs-rev V 5 1.167 PROPS-END SVNH{1Z6Plr/RS}yU@@oYCHANGEUSERCHANGEUSER: return "JI(`',`ssh.auth.changeuserDlgButton(hwnd, IDC_CHANGEUSER, cfg.change_usernamecheckbox(&cp, "Allow attempted changes of &username in SSH2", IDC_CHANGEUSERHANGEUSERcfg.change_username = IsDlgButtonChecked(hwnd, IDC_CHANGEUSER Revision-number: 1475 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:13.327634Z PROPS-END Revision-number: 1476 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:13.340764Z PROPS-END Revision-number: 1477 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:13.349275Z PROPS-END Revision-number: 1478 Prop-content-length: 353 Content-length: 353 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-12T18:45:56.000000Z K 7 svn:log V 252 Updated the PuTTYgen section in pubkey.but so that it gives individual documentation of the various PuTTYgen controls; also implemented context help in PuTTYgen to go with it. Shame there isn't space for a generic `Help' button in the PuTTYgen window. PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e8fdda751d1e054884c4728843f1b8e7 Text-delta-base-sha1: 63a1650cc3d91735504f5134b851746417dd651f Text-content-length: 11583 Text-content-md5: ee5f24aa33786fd01618814eee6306a4 Text-content-sha1: 0eb7e15d33df508356a330ab4a0e0ba41e1f161e Content-length: 11623 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN"8zA(>9+F=Og #c}"U?u$\versionid $Id: pubkey.but,v 1.12 2001/12/12 18:45:56 simon Exp $There is more than one public-key algorithm available. The most common is RSA, but others exist, notably DSA (otherwise known as DSS), the USA's federal Digital Signature Standard. The key types supported by PuTTY are described in \k{puttygen-keytype}. \H{pubkey-puttygen} Using PuTTYgen, the PuTTY key generatorttygen-generating} Generating a new key This is a general outline of the procedure for generating a new key pair. The following sections describe the process in more detail. \b First, you need to select which type of key you want to generate, and also select the strength of the key. This is described in more detail in \k{puttygen-keytype} and \k{puttygen-strength}. \b Then press the \q{Generate} button, to actually generate the key. \K{puttygen-generate} describes this step. \b Once you have generated the key, select a comment field (\k{puttygen-comment}) and a passphrase (\k{puttygen-passphrase}). \b Now you're ready to save the private key to disk; press the \q{Save private key} button. (See \k{puttygen-savepriv}). Your key pair is now ready for use. You may also want to copy the public key to your server, either by copying it out of the \q{Public key for pasting into authorized_keys file} box (see \k{puttygen-pastekey}), or by using the \q{Save public key} button (\k{puttygen-savepub}). However, you don't need to do this immediately; if you want, you can load the private key back into PuTTYgen later (see \k{puttygen-load}) and the public key will be available for copying and pasting again. \k{pubkey-gettingready} describes the typical process of configuring PuTTY to attempt public-key authentication, and configuring your SSH server to accept it. \S{puttygen-keytype} Selecting the type of key \cfg{winhelp-topic}{puttygen.keytype} Before generating a public key using PuTTYgen, you need to select which type of key you need. PuTTYgen currently supports three types of keyThe SSH 2 protocol supports more than one key type. The two types supported by S{puttygen-strength} Selecting the size (strength) of the key \cfg{winhelp-topic}{puttygen.bits} The \q{Number of bits} input box allows you to choose the strength of the key PuTTYgen will generate. Currently 1024 bits should be sufficient for most purposes. \S{puttygen-generate} The \q{Generate} button \cfg{winhelp-topic}{puttygen.generate} Once you have chosen the type of key you want, and the strength of the key, press the \q{Generate} button and PuTTYgen will begin the process of actually generating the key. First, a progress bar will appear and PuTTYgen will ask you to move the mouse around to generate randomness. Wave the mouse in circles over the blank area in the PuTTYgen window, and the progress bar will gradually fill up as PuTTYgen collects enough randomness. You don't need to wave the mouse in particularly imaginative patterns (although it can't hurt); PuTTYgen will collect enough randomness just from the fine detail of \e{exactly} how far the mouse has moved each time Windows samples its position. When the progress bar reaches the end, PuTTYgen will begin creating the key. The progress bar will reset to the start, and gradually move up again to track the progress of the key generation. It will not move evenly, and may occasionally slow down to a stop; this is unfortunately unavoidable, because key generation is a random process and it is impossible to reliably predict how long it will take. When the key generation is complete, a new set of controls will appear in the window to indicate this. \S{puttygen-fingerprint} The \q{Key fingerprint} box \cfg{winhelp-topic}{puttygen.fingerprint} The \q{Key fingerprint} box shows you a fingerprint value for the generated key. This is derived cryptographically from the \e{public} key value, so it doesn't need to be kept secret. The fingerprint value is intended to be cryptographically secure, in the sense that it is computationally infeasible for someone to invent a second key with the same fingerprint, or to find a key with a particular fingerprint. So some utilities, such as the Pageant key list box (see \k{pageant-mainwin-keylist}) and the Unix \c{ssh-add} utility, will list key fingerprints rather than the whole public key. \S{puttygen-comment} Setting a comment for your key \cfg{winhelp-topic}{puttygen.comment} If you have more than one key and use them for different purposes, you don't need to memorise the key fingerprints in order to tell them apart. PuTTY allows you to enter a \e{comment} for your key, which will be displayed whenever PuTTY or Pageant asks you for the passphrase. The default comment format, if you don't specify one, contains the key type and the date of generation, such as \c{rsa-key-20011212}. Another commonly used approach is to use your name and the name of the computer the key will be used on, such as \c{simon@simons-pc}. To alter the key comment, just type your comment text into the \q{Key comment} box before saving the private key. If you want to change the comment later, you can load the private key back into PuTTYgen, change the comment, and save it again. \S{puttygen-passphrase} Setting a passphrase for your key \cfg{winhelp-topic}{puttygen.passphrase} The \q{Key passphrase} and \q{Confirm passphrase} boxes allow you to choose a passphrase for your key. The passphrase will be used to encrypt the key on disk, so you will not be able to use the key without first entering the passphrase. When you save the key, PuTTY will check that the \q{Key passphrase} and \q{Confirm passphrase} boxes both contain exactly the same passphrase, and will refuse to save the key otherwise. If you leave the passphrase fields blank, the key will be saved unencrypted. You should \e{not} do this without good reason; if you do, your private key file on disk will be all an attacker needs to gain access to any machine configured to accept that key. If you want to be able to log in without having to type a passphrase every time, you should consider using Pageant (\k{pageant}) so that your decrypted key is only held in memory rather than on disk. Under special circumstances you may genuinely \e{need} to use a key with no passphrase; for example, if you need to run an automated batch script that needs to make an SSH connection, you can't be there to type the passphrase. In this case we recommend you generate a special key for each specific batch script (or whatever) that needs one, and on the server side you should arrange that each key is \e{restricted} so that it can only be used for that specific purpose. The documentation for your SSH server should explain how to do this (it will probably vary between servers). Choosing a good passphrase is difficult. Just as you shouldn't use a \e{Do not forget your passphrase}. There is no way to recover it. \S{puttygen-savepriv} Saving your private key to a disk file \cfg{winhelp-topic}{puttygen.savepriv} Once you have generated a key, set a comment field and set a passphrase, you are ready to save your private key to disk. Press the \q{Save private key} button. PuTTYgen will put up a dialog box asking you where to save the file. Select a directory, type in a file name, and press \q{Save}. This file is the one you will need to tell PuTTY to use for authentication (see \k{config-ssh-privkey}) or tell Pageant to load (see \k{pageant-mainwin-addkey}). \S{puttygen-savepub} Saving your public key to a disk file \cfg{winhelp-topic}{puttygen.savepub} The SSH 2 protocol drafts specify a standard format for storing public keys on disk. Some SSH servers (such as \cw{ssh.com}'s) require a public key in this format in order to accept authentication with the corresponding private key. (Others, such as OpenSSH, use a different format; see \k{puttygen-pastekey}.) To save your public key in the SSH 2 standard format, press the \q{Save public key} button in PuTTYgen. PuTTYgen will put up a dialog box asking you where to save the file. Select a directory, type in a file name, and press \q{Save}. You will then probably want to copy the public key file to your SSH server machine. See \k{pubkey-gettingready} for general instructions on configuring public-key authentication once you have generated a key. If you use this option with an SSH 1 key, the file PuTTYgen saves will contain exactly the same text that appears in the \q{Public key for pasting} box. This is the only existing standard for SSH 1 public keys. \S{puttygen-pastekey} \q{Public key for pasting into authorized_keys file} \cfg{winhelp-topic}{puttygen.pastekey} All SSH 1 servers require your public key to be given to it in a one-line format before it will accept authentication with your private key. The OpenSSH server also requires this for SSH 2. The \q{Public key for pasting into authorized_keys file} gives the public-key data in the correct one-line format. Typically you will want to select the entire contents of the box using the mouse, press Ctrl+C to copy it to the clipboard, and then paste the data into a PuTTY session which is already connected to the server. See \k{pubkey-gettingready} for general instructions on configuring public-key authentication once you have generated a key. \S{puttygen-load} Reloading a private key \cfg{winhelp-topic}{puttygen.load} PuTTYgen allows you to load an existing private key file into memory. If you do this, you can then change the passphrase and comment before saving it again; you can also make extra copies of the public key. To load an existing key, press the \q{Load} button. PuTTYgen will put up a dialog box where you can browse around the file system and find your key file. Once you select the file, PuTTYgen will ask you for a passphrase (if necessary) and will then display the key details in the same way as if it had just generated the key. \H (see \k{puttygen-pastekey}), and copy it to the clipboard (\c{Ctrl+C}). Then, switch back to the PuTTY window and insert the data into the open file, making sure it ends up all on one line. , except that in earlier versions of OpenSSH 2 the file might be called \c{authorized_keys2}. (In modern versions the same \c{authorized_keys} file is used for both SSH 1 and SSH 2 keys.) \b If your server is \cw{ssh.com}'s SSH 2 product, you need to save a \e{public} key file from PuTTYgen (see \k{puttygen-savepub}), and copy that into the \c{.ssh2} directory on the server. Then you should go into that \c{.ssh2} directory, and edit (or create) a file called \c{authorization}. In this file you should put a line like \c{Key mykey.pub}, with \c{mykey.pub} replaced by the name of your key file. \b For other SSH server software, you should refer to the manual for that server. You may also need to ensure that your home directory, your \c{.ssh} directory, and any other files involved (such as \c{authorized_keys}, \c{authorized_keys2} or \c{authorization}) are not group-writable. You can typically do this by using a command such as \c chmod g-w $HOME $HOME/.ssh $HOME/.ssh/authorized_keys Your server should now be configured to accept authentication using your private key. Now you need to configure PuTTY to \e{attempt} authentication using your private key. You can do this in either of two ways: \b Select the private key in PuTTY's configuration. See \k{config-ssh-privkey} for details. \b Load the private key into Pageant (see \k{pageant}). In this case PuTTY will automatically try to use it for authentication if it can. Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 987d96c161bf0819da5f58080112355d Text-delta-base-sha1: 04fbfbe1f8d8dc2ab9fad6e4065f3d8d811854c9 Text-content-length: 2883 Text-content-md5: 7f2571073a82328acded6aeedd8193c3 Text-content-sha1: 1304ee2a4e39678dcc595e6d2d2b2ed7421544f2 Content-length: 2923 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNj 0&$^zz;:o`2Nokstatic int requested_help; if (help_path) SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP); else { /* * If we add a Help button, this is where we destroy it * if the help file isn't present. */ } requested_help = FALSEHELP: if (help_path) { int id = ((LPHELPINFO)lParam)->iCtrlId; char *cmd = NULL; switch (id) { case IDC_GENERATING: case IDC_PROGRESS: case IDC_GENSTATIC: case IDC_GENERATE: cmd = "JI(`',`puttygen.generate')"; break; case IDC_PKSTATIC: case IDC_KEYDISPLAY: cmd = "JI(`',`puttygen.pastekey')"; break; case IDC_FPSTATIC: case IDC_FINGERPRINT: cmd = "JI(`',`puttygen.fingerprint')"; break; case IDC_COMMENTSTATIC: case IDC_COMMENTEDIT: cmd = "JI(`',`puttygen.comment')"; break; case IDC_PASSPHRASE1STATIC: case IDC_PASSPHRASE1EDIT: case IDC_PASSPHRASE2STATIC: case IDC_PASSPHRASE2EDIT: cmd = "JI(`',`puttygen.passphrase')"; break; case IDC_LOADSTATIC: case IDC_LOAD: cmd = "JI(`',`puttygen.load')"; break; case IDC_SAVESTATIC: case IDC_SAVE: cmd = "JI(`',`puttygen.savepriv')"; break; case IDC_SAVEPUB: cmd = "JI(`',`puttygen.savepub')"; break; case IDC_TYPESTATIC: case IDC_KEYSSH1: case IDC_KEYSSH2RSA: case IDC_KEYSSH2DSA: cmd = "JI(`',`puttygen.keytype')"; break; case IDC_BITSSTATIC: case IDC_BITS: cmd = "JI(`',`puttygen.bits')"; break; } if (cmd) { WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); requested_help = TRUE; } else { MessageBeep(0); } } if (requested_help) { WinHelp(hwnd, help_path, HELP_QUIT, 0); requested_help = FALSE; } /* * See if we can find our Help file. */ { char b[2048], *p, *q, *r; FILE *fp; GetModuleFileName(NULL, b, sizeof(b) - 1); r = b; p = strrchr(b, '\\'); if (p && p >= r) r = p+1; q = strrchr(b, ':'); if (q && q >= r) r = q+1; strcpy(r, "putty.hlp"); if ( (fp = fopen(b, "r")) != NULL) { help_path = dupstr(b); fclose(fp); } else help_path = NULL; } Revision-number: 1479 Prop-content-length: 183 Content-length: 183 K 8 svn:date V 27 2001-12-13T17:38:59.000000Z K 7 svn:log V 83 Clarify that port forwarding will not be enabled until the user has authenticated. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5d45d940bd6b9e09b1053b0512b6f6a1 Text-delta-base-sha1: 7faad6605d7a3199cb99d9f94ed214252ff3bb95 Text-content-length: 390 Text-content-md5: ebdf6f23eb95d7fc527c908eb6ef7e58 Text-content-sha1: 4996b7ca8d4f56ba5691e5b599f2e3e8d39463c0 Content-length: 429 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNX* m 2;1'\versionid $Id: using.but,v 1.4 2001/12/13 17:38:5 and log in. (Port forwarding will not be enabled until after you have logged in; otherwise it would be easy to perform completely anonymous network attacks, and gain access to anyone's virtual private network). To check that PuTTY has set up the port forwarding correctly, you can look at the PuTTY Event Log (see Revision-number: 1480 Prop-content-length: 368 Content-length: 368 K 8 svn:date V 27 2001-12-13T18:42:34.000000Z K 7 svn:log V 267 Allow PSFTP to be run with no arguments, in which case it enters the command-line state but all commands are disallowed except `open host.name'. The idea is to provide marginal extra niceness for people who double-click the icon without realising it's a cmdline app. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1e4b679cafcc3d0992122c6997b1eeba Text-delta-base-sha1: c1b3ada7fa767f1d9025d3fe52b785d05a24a141 Text-content-length: 2685 Text-content-md5: 021f6449ce4e574038e06c52f78b7097 Text-content-sha1: db28a0c2c386747dd0fd39bfca8dd377c627f193 Content-length: 2725 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN9/?}e>{e/e}:j_2e\e0Ym0m77eNde&(e^Dqx lgqiH4?L`-8|e!RAo&)Y`static int psftp_connect(char *userhost, char *user, int portnumber); static void do_sftp_init(void);back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); return 0; }back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); return 0; }if (back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); return 0; } back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); return 0; }back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); return 0; } if (back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); return 0; } if (back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); return 0; }back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); return 0; }back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); return 0; }back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); return 0; }open(struct sftp_command *cmd) { if (back != NULL) { printf("psftp: already connected\n"); return 0; } if (cmd->nwords < 2) { printf("open: expects a host name\n"); return 0; } if (psftp_connect(cmd->words[1], NULL, 0)) { back = NULL; /* connection is already closed */ return -1; /* this is fatal */ } do_sftp_init()open", "connect to a host", " [@]\n" " Establishes an SFTP connection to a given host. Only usable\n" " when you did not already specify a host name on the command\n" " line.\n", sftp_cmd_openstatic void do_sftp_init(void) {} void do_sftp(int mode, int modeflags, char *batchfile) { FILE *fputsutsConnect to a host. */ static int psftp_connect(char *userhost, char *user, int portnumber) { char *host, *realhost; char *err\n return 0host, *use } else if (strcmp(argv[i], "-b") == 0 && i + 1 < argc) { mode = 1; batchfile = argv[++i]; } else if (strcmp(argv[i], "-bc") == 0 && i + 1 < argc) { modeflags = modeflags | 1; /* * If a user@host string has already been provided, connect to * it now. */ if (userhost) { if (psftp_connect(userhost, user, portnumber)) return 1; do_sftp_init(); } else { printf("psftp: no hostname specified; use \"open host.name\"" " to connect\n"); } Revision-number: 1481 Prop-content-length: 399 Content-length: 399 K 7 svn:log V 298 Tidied up PSFTP batch mode. The gross hack using fxp_error_message to report command failures is now gone; instead each sftp_cmd_* routine returns 0 or 1 depending on success, like they should have done right from the start. This fixes problems with `ls' prematurely terminating PSFTP batch files. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-13T19:26:51.000000Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 021f6449ce4e574038e06c52f78b7097 Text-delta-base-sha1: db28a0c2c386747dd0fd39bfca8dd377c627f193 Text-content-length: 782 Text-content-md5: e28750a296272b37f96a4fe3473bee01 Text-content-sha1: 78bef93bfc57b8a66fa8b805570774a0dce79dce Content-length: 822 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN`A>79i9r#  {wibJ'(0{n6X%q{%gFd#:'ab D N.XBJF,> cVj{CBz1; /* success */ /* failure */111 int retgetret = 1;ret = 0ret = 0; break; } wpos += wlen; } if (wpos < len) { /* we had an error */ ret = 0; break; }ret int retret = 1;ret = 0ret = 0ret111;11 return 11 if ((mode == 0) || (modeflags & 1)) { printf("psftp> "); if (modeflags & 1) { printf("%s\n", line); int ret struct sftp_command *cmd; cmd = sftp_getcmd(stdin, 0, 0); if (!cmd) break; if (cmd->obey(cmd) < 0) ret = cmd->obey(cmd); if (ret < 0) break; if (ret == 0 Revision-number: 1482 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 70 Aargh, an Americanism crept in. Now corrected: favorite -> favourite. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-14T09:58:07.000000Z PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ee5f24aa33786fd01618814eee6306a4 Text-delta-base-sha1: 0eb7e15d33df508356a330ab4a0e0ba41e1f161e Text-content-length: 474 Text-content-md5: 285034122f18eed8a1d0b04801b00a19 Text-content-sha1: 9aa14d74bc2c90df3d2ba6a1d7f372d2480eceb5 Content-length: 514 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN ?-5 &k\versionid $Id: pubkey.but,v 1.13 2001/12/14 09:58:07urite editor. (You may have to create this file if this is the first key you have put in it). Then switch to the PuTTYgen window, select all of the text in the \q{Public key for pasting into authorized_keys file} box (see \k{puttygen-pastekey}), and copy it to the clipboard (\c{Ctrl+C}). Then, switch back to the PuTTY window and insert the data into the open file, making sure it ends up all Revision-number: 1483 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2001-12-14T10:06:09.000000Z K 7 svn:log V 43 Fix trivial problems with PSFTP batch mode K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e28750a296272b37f96a4fe3473bee01 Text-delta-base-sha1: 78bef93bfc57b8a66fa8b805570774a0dce79dce Text-content-length: 147 Text-content-md5: f13e007372c9a4c60c91ad7c302cb438 Text-content-sha1: 52f492cebe47905bd59c51c8bbe375e399c14240 Content-length: 187 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN`fq$$K;%if ((mode == 0) || (modeflags & 1)) ) { modeflags = modeflags | 1; } else if (strcmp(argv[i], "-be") == 0 Revision-number: 1484 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2001-12-14T10:12:53.000000Z K 7 svn:log V 49 Remove ghastly hack involving fxp_error_message. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 43bbc89c032e959a8c81df5849af6654 Text-delta-base-sha1: 17d03158848f6ad0df30a1861c72731586a9f8fb Text-content-length: 23 Text-content-md5: 3e466704c370db06a185d09e39bb7a50 Text-content-sha1: 3f3db459597a9616ef9a5be2c9ee68597f5c3073 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN/ - Revision-number: 1485 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2001-12-14T12:15:43.000000Z K 7 svn:log V 46 Add a chapter to the manual describing PSFTP. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ddf62a52be37d205d8b6f894e17f0d80 Text-delta-base-sha1: 4cd77659167493794d660b921e1a73399868f6f8 Text-content-length: 64 Text-content-md5: 2e445269bc1d1ddab07c8e4c7e7033e6 Text-content-sha1: 6f960e95782e50c84702afa4c8e7aa819a46941d Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNCI0*CHAPTERS = blurb intro gs using config pscp psft Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 48c22f813239bc302327f06312b29b11 Text-delta-base-sha1: ae92f7f0d9746b1caf451a22e0f57116e0e31e9d Text-content-length: 223 Text-content-md5: d8a7f2cadb67e29bc27d3f32a284f151 Text-content-sha1: dfd76453c8713e51e169f53c5e0d203900ed8cf8 Content-length: 263 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN| FT3x\versionid $Id: pscp.but,v 1.18 2001/12/14 12:15:43If you have an SSH 2 server, you might prefer PSFTP (see \k{psftp}) for interactive use. PSFTP does not in general work with SSH 1 servers, however Node-path: putty/doc/psftp.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 13298 Text-content-md5: ff9922dc5fcee9ac33ed4272b360676c Text-content-sha1: 0ec8be8064a54738bc1256478e3e1e43e1ac63df Content-length: 13414 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNddd\versionid $Id: psftp.but,v 1.1 2001/12/14 12:15:43 simon Exp $ \C{psftp} Using PSFTP to transfer files securely \i{PSFTP}, the PuTTY SFTP client, is a tool for transferring files securely between computers using an SSH connection. PSFTP differs from PSCP in the following ways: \b PSCP should work on virtually every SSH server. PSFTP uses the new SFTP protocol, which is a feature of SSH 2 only. (PSCP will also use this protocol if it can, but there is an SSH 1 equivalent it can fall back to if it cannot.) \b PSFTP allows you to run an interactive file transfer session, much like the Windows \c{ftp} program. You can list the contents of directories, browse around the file system, issue multiple \c{get} and \c{put} commands, and eventually log out. By contrast, PSCP is designed to do a single file transfer operation and immediately terminate. \H{psftp-starting} Starting PSFTP The usual way to start PSFTP is from a command prompt, much like PSCP. To do this, it will need either to be on your \i{\c{PATH}} or in your current directory. To add the directory containing PSFTP to your \c{PATH} environment variable, type into the console window: \c set PATH=C:\path\to\putty\directory;%PATH% Unlike PSCP, however, PSFTP has no complex command-line syntax; you just specify a host name and perhaps a user name: \c psftp server.example.com or perhaps \c psftp fred@server.example.com Alternatively, if you just type \c{psftp} on its own (or double-click the PSFTP icon in the Windows GUI), you will see the PSFTP prompt, and a message telling you PSFTP has not connected to any server: \c C:\>psftp \c psftp: no hostname specified; use "open host.name" to connect \c psftp> At this point you can type \c{open server.example.com} or \c{open fred@server.example.com} to start a session. The following sections describe PSFTP's command-line options. \S{psftp-option-l} \c{-l}: specify a user name The \c{-l} option is an alternative way to specify the user name to log in as, on the command line. Instead of typing \c{psftp user@host}, you can also type \c{psftp host -l user}. This option does not work in the \c{open} command once PSFTP has started. \S{psftp-option-P} \c{-P}: specify a port number If the \c{host} you specify is a saved session, PSFTP uses any port number specified in that saved session. If not, PSFTP uses the default SSH port, 22. The \c{-P} option allows you specify the port number to connect to for PSFTP's SSH connection. \S{psftp-option-v}\c{-v}: show verbose messages The \c{-v} option to PSFTP makes it print verbose information about the establishing of the SSH connection. The information displayed is equivalent to what is shown in the PuTTY Event Log (\k{using-eventlog}). This information may be useful for debugging problems with PSFTP. \S{psftp-option-pw} \c{-pw}: specify a password If a password is required to connect to the \c{host}, PSFTP will interactively prompt you for it. However, this may not always be appropriate. If you are running PSFTP as part of some automated job, it will not be possible to enter a password by hand. The \c{-pw} option to PSFTP lets you specify the password to use on the command line. Since specifying passwords in scripts is a bad idea for security reasons, you might want instead to consider using public-key authentication; see \k{psftp-pubkey}. \S{psftp-option-b} \c{-b}: specify a file containing batch commands In normal operation, PSFTP is an interactive program which displays a command line and accepts commands from the keyboard. If you need to do automated tasks with PSFTP, you would probably prefer to specify a set of commands in advance and have them executed automatically. The \c{-b} option allows you to do this. You use it with a file name containing batch commands. For example, you might create a file called \c{myscript.scr} containing lines like this: \c cd /home/ftp/users/jeff \c del jam-old.tar.gz \c ren jam.tar.gz jam-old.tar.gz \c put jam.tar.gz \c chmod a+r jam.tar.gz \c quit and then you could run the script by typing \c psftp user@hostname -b myscript.scr When you run a batch script in this way, PSFTP will abort the script if any command fails to complete successfully. To change this behaviour, you can use the \c{-be} option (\k{psftp-option-be}). \S{psftp-option-bc} \c{-bc}: display batch commands as they are run The \c{-bc} option alters what PSFTP displays while processing a batch script. With the \c{-bc} option, PSFTP will display prompts and commands just as if the commands had been typed at the keyboard. So instead of seeing this: \c Sent username "fred" \c Remote working directory is /home/fred \c Listing directory /home/fred/lib \c drwxrwsr-x 4 fred fred 1024 Sep 6 10:42 . \c drwxr-sr-x 25 fred fred 2048 Dec 14 09:36 .. \c drwxrwsr-x 3 fred fred 1024 Apr 17 2000 jed \c lrwxrwxrwx 1 fred fred 24 Apr 17 2000 timber \c drwxrwsr-x 2 fred fred 1024 Mar 13 2000 trn you might see this: \c Sent username "fred" \c Remote working directory is /home/fred \c psftp> dir lib \c Listing directory /home/fred/lib \c drwxrwsr-x 4 fred fred 1024 Sep 6 10:42 . \c drwxr-sr-x 25 fred fred 2048 Dec 14 09:36 .. \c drwxrwsr-x 3 fred fred 1024 Apr 17 2000 jed \c lrwxrwxrwx 1 fred fred 24 Apr 17 2000 timber \c drwxrwsr-x 2 fred fred 1024 Mar 13 2000 trn \c psftp> quit \S{psftp-option-be} \c{-be}: continue batch processing on errors When running a batch file, this option causes PSFTP to continue processing even if a command fails to complete successfully. You might want this to happen if you wanted to delete a file and didn't care if it was already not present, for example. \H{psftp-commands} Running PSFTP Once you have started your PSFTP session, you will see a \c{psftp>} prompt. You can now type commands to perform file-transfer functions. This section lists all the available commands. \S{psftp-cmd-open} The \c{open} command: start a session If you started PSFTP by double-clicking in the GUI, or just by typing \c{psftp} at the command line, you will need to open a connection to an SFTP server before you can issue any other commands (except \c{help} and \c{quit}). To create a connection, type \c{open host.name}, or if you need to specify a user name as well you can type \c{open user@host.name}. Once you have issued this command, you will not be able to issue it again, \e{even} if the command fails (for example, if you mistype the host name or the connection times out). So if the connection is not opened successfully, PSFTP will terminate immediately. \S{psftp-cmd-quit} The \c{quit} command: end your session When you have finished your session, type the command \c{quit} to terminate PSFTP and return to the command line (or just close the PSFTP console window if you started it from the GUI). You can also use the \c{bye} and \c{exit} commands, which have exactly the same effect. \S{psftp-cmd-help} The \c{help} command: get quick online help If you type \c{help}, PSFTP will give a short list of the available commands. If you type \c{help} with a command name - for example, \c{help get} - then PSFTP will give a short piece of help on that particular command. \S{psftp-cmd-cd} The \c{cd} and \c{pwd} commands: changing the remote working directory PSFTP maintains a notion of your \q{working directory} on the server. This is the default directory that other commands will operate on. For example, if you type \c{get filename.dat} then PSFTP will look for \c{filename.dat} in your working directory on the server. To change your working directory, use the \c{cd} command. To display your current working directory, type \c{pwd}. \S{psftp-cmd-get} The \c{get} command: fetch a file from the server To download a file from the server and store it on your local PC, you use the \c{get} command. In its simplest form, you just use this with a file name: \c get myfile.dat If you want to store the file locally under a different name, specify the local file name after the remote one: \c get myfile.dat newname.dat This will fetch the file on the server called \c{myfile.dat}, but will save it to your local machine under the name \c{newname.dat}. \S{psftp-cmd-put} The \c{put} command: send a file to the server To upload a file to the server from your local PC, you use the \c{put} command. In its simplest form, you just use this with a file name: \c put myfile.dat If you want to store the file remotely under a different name, specify the remote file name after the local one: \c put myfile.dat newname.dat This will send the local file called \c{myfile.dat}, but will store it on the server under the name \c{newname.dat}. \S{psftp-cmd-regetput} The \c{reget} and \c{reput} commands: resuming file transfers If a file transfer fails half way through, and you end up with half the file stored on your disk, you can resume the file transfer using the \c{reget} and \c{reput} commands. These work exactly like the \c{get} and \c{put} commands, but they check for the presence of the half-written destination file and start transferring from where the last attempt left off. The syntax of \c{reget} and \c{reput} is exactly the same as the syntax of \c{get} and \c{put}: \c reget myfile.dat \c reget myfile.dat newname.dat \S{psftp-cmd-dir} The \c{dir} command: list remote files To list the files in your remote working directory, just type \c{dir}. You can also list the contents of a different directory by typing \c{dir} followed by the directory name: \c dir /home/fred \c dir sources The \c{ls} command works exactly the same way as \c{dir}. \S{psftp-cmd-chmod} The \c{chmod} command: change permissions on remote files PSFTP allows you to modify the file permissions on files on the server. You do this using the \c{chmod} command, which works very much like the Unix \c{chmod} command. The basic syntax is \c{chmod modes file}, where \c{modes} represents a modification to the file permissions, and \c{file} is the filename to modify. For example: \c chmod go-rwx,u+w privatefile \c chmod a+r publicfile \c chmod 640 groupfile The \c{modes} parameter can be a set of octal digits in the Unix style. (If you don't know what this means, you probably don't want to be using it!) Alternatively, it can be a list of permission modifications, separated by commas. Each modification consists of: \b The people affected by the modification. This can be \c{u} (the owning user), \c{g} (members of the owning group), or \c{o} (everybody else - \q{others}), or some combination of those. It can also be \c{a} (\q{all}) to affect everybody at once. \b A \c{+} or \c{-} sign, indicating whether permissions are to be added or removed. \b The actual permissions being added or removed. These can be \c{r} (permission to read the file), \c{w} (permission to write to the file), and \c{x} (permission to execute the file, or in the case of a directory, permission to access files within the directory). So the above examples would do: \b The first example: \c{go-rwx} removes read, write and execute permissions for members of the owning group and everybody else (so the only permissions left are the ones for the file owner). \c{u+w} adds write permission for the file owner. \b The second example: \c{a+r} adds read permission for everybody. In addition to all this, there are a few extra special cases for Unix systems. On non-Unix systems these are unlikely to be useful: \b You can specify \c{u+s} and \c{u-s} to add or remove the Unix set-user-ID bit. This is typically only useful for special purposes; refer to your Unix documentation if you're not sure about it. \b You can specify \c{g+s} and \c{g-s} to add or remove the Unix set-group-ID bit. On a file, this works similarly to the set-user-ID bit (see your Unix documentation again); on a directory it ensures that files created in the directory are accessible by members of the group that owns the directory. \b You can specify \c{+t} and \c{-t} to add or remove the Unix \q{sticky bit}. When applied to a directory, this means that the owner of a file in that directory can delete the file (whereas normally only the owner of the \e{directory} would be allowed to). \S{psftp-cmd-del} The \c{del} command: delete remote files To delete a file on the server, type \c{del} and then the filename: \c del oldfile.dat The \c{rm} command works exactly the same way as \c{del}. \S{psftp-cmd-mkdir} The \c{mkdir} command: create remote directories To create a directory on the server, type \c{mkdir} and then the directory name: \c mkdir newstuff \S{psftp-cmd-rmdir} The \c{rmdir} command: remove remote directories To remove a directory on the server, type \c{rmdir} and then the directory name: \c rmdir oldstuff Most SFTP servers will probably refuse to remove a directory if the directory has anything in it, so you will need to delete the contents first. \S{psftp-cmd-ren} The \c{ren} command: rename remote files To rename a file on the server, type \c{ren}, then the current file name, and then the new file name: \c ren oldfile newname The \c{rename} and \c{mv} commands work exactly the same way as \c{ren}. Revision-number: 1486 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2001-12-14T12:19:14.000000Z K 7 svn:log V 77 Rename a clashing section keyword (why wasn't Buttress catching this? Oops). K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d8a7f2cadb67e29bc27d3f32a284f151 Text-delta-base-sha1: dfd76453c8713e51e169f53c5e0d203900ed8cf8 Text-content-length: 79 Text-content-md5: b4666f2f5d587d8633f48a8b0d9b50c5 Text-content-sha1: c0d9385f37f6a54ca34858a2b122d2c6e1b812a4 Content-length: 119 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN 9X3\versionid $Id: pscp.but,v 1.19 2001/12/14 12:19:14retval Revision-number: 1487 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2001-12-14T12:22:09.000000Z K 7 svn:log V 110 Add the missing psftp-pubkey section, shamelessly cribbed from the corresponding section in the PSCP chapter. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ff9922dc5fcee9ac33ed4272b360676c Text-delta-base-sha1: 0ec8be8064a54738bc1256478e3e1e43e1ac63df Text-content-length: 1137 Text-content-md5: 10bb73bcaf1f406983fc7881e3c2b1ff Text-content-sha1: effab1dc8168ea4cb7e4e5926a1217b1f3c4cc70 Content-length: 1176 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNd]13*\versionid $Id: psftp.but,v 1.2 2001/12/14 12:22:09 \H{psftp-pubkey} Using public key authentication with PSFTP Like PuTTY, PSFTP can authenticate using a public key instead of a password. There are two ways you can do this. Firstly, PSFTP can use PuTTY saved sessions in place of hostnames. So you might do this: \b Run PuTTY, and create a PuTTY saved session (see \k{config-saving}) which specifies your private key file (see \k{config-ssh-privkey}). You will probably also want to specify a username to log in as (see \k{config-username}). \b In PSFTP, you can now use the name of the session instead of a hostname: type \c{psftp sessionname}, where \c{sessionname} is replaced by the name of your saved session. Secondly, PSFTP will attempt to authenticate using Pageant if Pageant is running (see \k{pageant}). So you would do this: \b Ensure Pageant is running, and has your private key stored in it. \b Specify a user and host name to PSFTP as normal. PSFTP will automatically detect Pageant and try to use the keys within it. For more general information on public-key authentication, see \k{pubkey}. Revision-number: 1488 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:13.916199Z PROPS-END Revision-number: 1489 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:13.925139Z PROPS-END Revision-number: 1490 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:13.932526Z PROPS-END Revision-number: 1491 Prop-content-length: 224 Content-length: 224 K 7 svn:log V 123 Now that Buttress can spot duplicate section keywords, it turns out there are several of them I hadn't noticed! All fixed. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-14T12:48:24.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 71350c86439969d3a72c6e60727d9e3f Text-delta-base-sha1: 5ff24cea8dd19e94fbc647c5f27aac5354c28a6d Text-content-length: 98 Text-content-md5: 240be4026784d37053933e4247a33b35 Text-content-sha1: 7bcf3899d69f3dbe9942af0ed1b9016bf44a1a40 Content-length: 138 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN./Ac5lB\versionid $Id: config.but,v 1.20 2001/12/14 12:48:24kichangeuser Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 96183fda5896088136975fd3b8bc2f32 Text-delta-base-sha1: fcdd20fe552c1aff9a82427517ba6f72ff4c368b Text-content-length: 351 Text-content-md5: dbe443ba655ac1546751258d7f61163d Text-content-sha1: 769aa98823c863dc94468cc02968f46590e6527e Content-length: 391 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN`|'*d1ZI#CX[r$<\versionid $Id: faq.but,v 1.14 2001/12/14 12:48:2-remember}{Question} Does PuTTY have the ability to remember -portincorrect-mac}{Question} Why do I see \q{Incorrect MAC received on wintitle}{Question} When I \cw{cat} a binary file, my window -fails}{Question} My keyboard stops working once PuTTY Revision-number: 1492 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:14.388383Z PROPS-END Revision-number: 1493 Prop-content-length: 751 Content-length: 751 K 7 svn:log V 650 Retired the #ifdef DUMP_PACKETS stuff in ssh.c because I'm utterly sick of recompiling to enable packet dumps. SSH packet dumping is now provided as a logging option, and dumps to putty.log like all the other logging options. While I'm at it I cleaned up the format so that packet types are translated into strings for easy browsing. POSSIBLE SIDE EFFECT: in the course of this work I had to re-enable the SSH1 packet length checks which it turns out hadn't actually been active for some time, so it's possible things might break as a result. If need be I can always disable those checks for the 0.52 release and think about it more carefully later. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-14T14:57:50.000000Z PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a82e380781b1cf0658a1e27927e52f6e Text-delta-base-sha1: d742a31e23405b569c802c8b37478e3ba41c5dff Text-content-length: 114 Text-content-md5: 3a58d37c9281bc1ad359fd1760986fec Text-content-sha1: 5ec10f5063e842692d6e62b4b2d63394403dfa7f Content-length: 154 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVNlMKzxXk'< b logging logging logginglogging.$(OBJ): logging.c misc.h puttymem.h putty.h Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 240be4026784d37053933e4247a33b35 Text-delta-base-sha1: 7bcf3899d69f3dbe9942af0ed1b9016bf44a1a40 Text-content-length: 535 Text-content-md5: 549aafc6a249404659e22788ff8c9d52 Text-content-sha1: e6c10af5da6c676567d2c65c1e7a194761c662c5 Content-length: 575 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN/x{ 5Fq>\versionid $Id: config.but,v 1.21 2001/12/14 14:57:50b \q{Log SSH packet data}. In this mode (which is only used by SSH connections), the SSH message packets sent over the encrypted connection are written to the log file. You might need this to debug a network-level problem, or more likely to send to the PuTTY authors as part of a bug report. \e{BE WARNED} that if you log in using a password, the password will appear in the log file, so be sure to edit it out before sending the log file to anyone else! Node-path: putty/logging.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4055 Text-content-md5: 1c0896449ce29686e493eea23fc4117d Text-content-sha1: 783ac3993cba327aa2efbc4a9b15f43545a4ce4e Content-length: 4171 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNIII#include #include #include #include #include #include #include "putty.h" /* log session to file stuff ... */ static FILE *lgfp = NULL; static char timdatbuf[20]; static char currlogfilename[FILENAME_MAX]; static void xlatlognam(char *d, char *s, char *hostname, struct tm *tm); /* * Log session traffic. */ void logtraffic(unsigned char c, int logmode) { if (cfg.logtype > 0) { if (cfg.logtype == logmode) { /* deferred open file from pgm start? */ if (!lgfp) logfopen(); if (lgfp) fputc(c, lgfp); } } } /* * Log an SSH packet. */ void log_packet(int direction, int type, char *texttype, void *data, int len) { int i, j, c; char dumpdata[80], smalldata[5]; if (cfg.logtype != LGTYP_PACKETS) return; if (!lgfp) logfopen(); if (lgfp) { fprintf(lgfp, "%s packet type %d / 0x%02x (%s)\n", direction == PKT_INCOMING ? "Incoming" : "Outgoing", type, type, texttype); for (i = 0; i < len; i += 16) { sprintf(dumpdata, " %08x%*s\n", i, 1+3*16+2+16, ""); for (j = 0; j < 16 && i+j < len; j++) { int c = ((unsigned char *)data)[i+j]; sprintf(smalldata, "%02x", c); dumpdata[10+2+3*j] = smalldata[0]; dumpdata[10+2+3*j+1] = smalldata[1]; dumpdata[10+1+3*16+2+j] = (isprint(c) ? c : '.'); } strcpy(dumpdata + 10+1+3*16+2+j, "\n"); fputs(dumpdata, lgfp); } } } /* open log file append/overwrite mode */ void logfopen(void) { char buf[256]; time_t t; struct tm tm; char writemod[4]; if (!cfg.logtype) return; sprintf(writemod, "wb"); /* default to rewrite */ time(&t); tm = *localtime(&t); /* substitute special codes in file name */ xlatlognam(currlogfilename,cfg.logfilename,cfg.host, &tm); lgfp = fopen(currlogfilename, "r"); /* file already present? */ if (lgfp) { int i; fclose(lgfp); i = askappend(currlogfilename); if (i == 1) writemod[0] = 'a'; /* set append mode */ else if (i == 0) { /* cancelled */ lgfp = NULL; cfg.logtype = 0; /* disable logging */ return; } } lgfp = fopen(currlogfilename, writemod); if (lgfp) { /* enter into event log */ sprintf(buf, "%s session log (%s mode) to file : ", (writemod[0] == 'a') ? "Appending" : "Writing new", (cfg.logtype == LGTYP_ASCII ? "ASCII" : cfg.logtype == LGTYP_DEBUG ? "raw" : "")); /* Make sure we do not exceed the output buffer size */ strncat(buf, currlogfilename, 128); buf[strlen(buf)] = '\0'; logevent(buf); /* --- write header line into log file */ fputs("=~=~=~=~=~=~=~=~=~=~=~= PuTTY log ", lgfp); strftime(buf, 24, "%Y.%m.%d %H:%M:%S", &tm); fputs(buf, lgfp); fputs(" =~=~=~=~=~=~=~=~=~=~=~=\r\n", lgfp); } } void logfclose(void) { if (lgfp) { fclose(lgfp); lgfp = NULL; } } /* * translate format codes into time/date strings * and insert them into log file name * * "&Y":YYYY "&m":MM "&d":DD "&T":hhmm "&h": "&&":& */ static void xlatlognam(char *d, char *s, char *hostname, struct tm *tm) { char buf[10], *bufp; int size; char *ds = d; /* save start pos. */ int len = FILENAME_MAX-1; while (*s) { /* Let (bufp, len) be the string to append. */ bufp = buf; /* don't usually override this */ if (*s == '&') { char c; s++; if (*s) switch (c = *s++, tolower(c)) { case 'y': size = strftime(buf, sizeof(buf), "%Y", tm); break; case 'm': size = strftime(buf, sizeof(buf), "%m", tm); break; case 'd': size = strftime(buf, sizeof(buf), "%d", tm); break; case 't': size = strftime(buf, sizeof(buf), "%H%M%S", tm); break; case 'h': bufp = hostname; size = strlen(bufp); break; default: buf[0] = '&'; size = 1; if (c != '&') buf[size++] = c; } } else { buf[0] = *s++; size = 1; } if (size > len) size = len; memcpy(d, bufp, size); d += size; len -= size; } *d = '\0'; } Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8ed3ec5d08fd644ab43a52c6dabf2eda Text-delta-base-sha1: ef71c9c4da5c9553e52c48723c174c9ebea518d3 Text-content-length: 789 Text-content-md5: b99551341270e91010794ced0454e6c2 Text-content-sha1: fc71ce5d1f4e4b48ce67a5360b12816f17b9a4da Content-length: 829 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVN ssVwYAsk whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ int askappend(char *filename) { HANDLE hin; DWORD savemode, i; static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n" "You can overwrite it with a new session log,\n" "append your session log to the end of it,\n" "or disable session logging for this session.\n" "Enter \"y\" to wipe the file, \"n\" to append to it,\n" "or just press Return to disable logging.\n" "Wipe the log file? (y/n, Return cancels logging) "; char line[32]; fprintf(stderr, msgtemplate, FILENAME_MAX, file return 2; else if (line[0] == 'n' || line[0] == 'N') return 1; else return 0; Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f13e007372c9a4c60c91ad7c302cb438 Text-delta-base-sha1: 52f492cebe47905bd59c51c8bbe375e399c14240 Text-content-length: 791 Text-content-md5: ed59d6392e60e5a41e685dcc51737b5d Text-content-sha1: 0b632c514407a3bdca81ad8330d0fbe159af7bb2 Content-length: 831 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNf9s;VY51Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ int askappend(char *filename) { HANDLE hin; DWORD savemode, i; static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n" "You can overwrite it with a new session log,\n" "append your session log to the end of it,\n" "or disable session logging for this session.\n" "Enter \"y\" to wipe the file, \"n\" to append to it,\n" "or just press Return to disable logging.\n" "Wipe the log file? (y/n, Return cancels logging) "; char line[32]; fprintf(stderr, msgtemplate, FILENAME_MAX, file return 2; else if (line[0] == 'n' || line[0] == 'N') return 1; else return 0; Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f7d9fd36e4e45f411b2cc00be847f216 Text-delta-base-sha1: 82520793515c29bd3d2aecd1e2d12954843524bd Text-content-length: 276 Text-content-md5: 46437e03c73839f23a0f83f0b9b66575 Text-content-sha1: 2cccac8e8736bd92fe59934d8704bd26bbe380cb Content-length: 317 K 15 cvs2svn:cvs-rev V 5 1.128 PROPS-END SVNFMu_F=d/< raffic */ #define LGTYP_PACKETS 3 /* logmode: SSH data packetslogging.c. */ void logtraffic(unsigned char c, int logmode); enum { PKT_INCOMING, PKT_OUTGOING }; void log_packet(int direction, int type, char *texttype, void *data, int len Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f2b90101937955c2acb428cb243ad838 Text-delta-base-sha1: 12aee22ffac68de7df37e0f73b7a4e76cd89bbcf Text-content-length: 789 Text-content-md5: 69654b5ebf63754efaf73de89cdadaac Text-content-sha1: 8d2c6cc2bd2365beca7572611da4c470f87ddfe8 Content-length: 829 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVN~Qs_V:Y)UAsk whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ int askappend(char *filename) { HANDLE hin; DWORD savemode, i; static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n" "You can overwrite it with a new session log,\n" "append your session log to the end of it,\n" "or disable session logging for this session.\n" "Enter \"y\" to wipe the file, \"n\" to append to it,\n" "or just press Return to disable logging.\n" "Wipe the log file? (y/n, Return cancels logging) "; char line[32]; fprintf(stderr, msgtemplate, FILENAME_MAX, file return 2; else if (line[0] == 'n' || line[0] == 'N') return 1; else return 0; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 110188a4896a099a1bd5d3aaa9cc73b1 Text-delta-base-sha1: 91e884a6ce80a8abc77cc80a9342c8b586f186e5 Text-content-length: 8348 Text-content-md5: 445477c700b10cfd4e5bba03458f3204 Text-content-sha1: cb4bd3495ce7c169abbfcf8d363f5c20936ddcb2 Content-length: 8389 K 15 cvs2svn:cvs-rev V 5 1.186 PROPS-END SVNxh<4}njLi5.b4_7eO*`ksaxm.*[F/* * Packet type contexts, so that ssh2_pkt_type can correctly decode * the ambiguous type numbers back into the correct type strings. */ #define SSH2_PKTCTX_DHGROUP1 0x0001 #define SSH2_PKTCTX_DHGEX 0x0002 #define SSH2_PKTCTX_PUBLICKEY 0x0010 #define SSH2_PKTCTX_PASSWORD 0x0020 #define SSH2_PKTCTX_KBDINTER 0x0040 #define SSH2_PKTCTX_AUTH_MASK 0x00F0static int ssh_pkt_ctx = 0; #define translate(x) if (type == x) return #x #define translatec(x,ctx) if (type == x && (ssh_pkt_ctx & ctx)) return #x char *ssh1_pkt_type(int type) { translate(SSH1_MSG_DISCONNECT); translate(SSH1_SMSG_PUBLIC_KEY); translate(SSH1_CMSG_SESSION_KEY); translate(SSH1_CMSG_USER); translate(SSH1_CMSG_AUTH_RSA); translate(SSH1_SMSG_AUTH_RSA_CHALLENGE); translate(SSH1_CMSG_AUTH_RSA_RESPONSE); translate(SSH1_CMSG_AUTH_PASSWORD); translate(SSH1_CMSG_REQUEST_PTY); translate(SSH1_CMSG_WINDOW_SIZE); translate(SSH1_CMSG_EXEC_SHELL); translate(SSH1_CMSG_EXEC_CMD); translate(SSH1_SMSG_SUCCESS); translate(SSH1_SMSG_FAILURE); translate(SSH1_CMSG_STDIN_DATA); translate(SSH1_SMSG_STDOUT_DATA); translate(SSH1_SMSG_STDERR_DATA); translate(SSH1_CMSG_EOF); translate(SSH1_SMSG_EXIT_STATUS); translate(SSH1_MSG_CHANNEL_OPEN_CONFIRMATION); translate(SSH1_MSG_CHANNEL_OPEN_FAILURE); translate(SSH1_MSG_CHANNEL_DATA); translate(SSH1_MSG_CHANNEL_CLOSE); translate(SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION); translate(SSH1_SMSG_X11_OPEN); translate(SSH1_CMSG_PORT_FORWARD_REQUEST); translate(SSH1_MSG_PORT_OPEN); translate(SSH1_CMSG_AGENT_REQUEST_FORWARDING); translate(SSH1_SMSG_AGENT_OPEN); translate(SSH1_MSG_IGNORE); translate(SSH1_CMSG_EXIT_CONFIRMATION); translate(SSH1_CMSG_X11_REQUEST_FORWARDING); translate(SSH1_CMSG_AUTH_RHOSTS_RSA); translate(SSH1_MSG_DEBUG); translate(SSH1_CMSG_REQUEST_COMPRESSION); translate(SSH1_CMSG_AUTH_TIS); translate(SSH1_SMSG_AUTH_TIS_CHALLENGE); translate(SSH1_CMSG_AUTH_TIS_RESPONSE); translate(SSH1_CMSG_AUTH_CCARD); translate(SSH1_SMSG_AUTH_CCARD_CHALLENGE); translate(SSH1_CMSG_AUTH_CCARD_RESPONSE); return "unknown"; } char *ssh2_pkt_type(int type) { translate(SSH2_MSG_DISCONNECT); translate(SSH2_MSG_IGNORE); translate(SSH2_MSG_UNIMPLEMENTED); translate(SSH2_MSG_DEBUG); translate(SSH2_MSG_SERVICE_REQUEST); translate(SSH2_MSG_SERVICE_ACCEPT); translate(SSH2_MSG_KEXINIT); translate(SSH2_MSG_NEWKEYS); translatec(SSH2_MSG_KEXDH_INIT, SSH2_PKTCTX_DHGROUP1); translatec(SSH2_MSG_KEXDH_REPLY, SSH2_PKTCTX_DHGROUP1); translatec(SSH2_MSG_KEX_DH_GEX_REQUEST, SSH2_PKTCTX_DHGEX); translatec(SSH2_MSG_KEX_DH_GEX_GROUP, SSH2_PKTCTX_DHGEX); translatec(SSH2_MSG_KEX_DH_GEX_INIT, SSH2_PKTCTX_DHGEX); translatec(SSH2_MSG_KEX_DH_GEX_REPLY, SSH2_PKTCTX_DHGEX); translate(SSH2_MSG_USERAUTH_REQUEST); translate(SSH2_MSG_USERAUTH_FAILURE); translate(SSH2_MSG_USERAUTH_SUCCESS); translate(SSH2_MSG_USERAUTH_BANNER); translatec(SSH2_MSG_USERAUTH_PK_OK, SSH2_PKTCTX_PUBLICKEY); translatec(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, SSH2_PKTCTX_PASSWORD); translatec(SSH2_MSG_USERAUTH_INFO_REQUEST, SSH2_PKTCTX_KBDINTER); translatec(SSH2_MSG_USERAUTH_INFO_RESPONSE, SSH2_PKTCTX_KBDINTER); translate(SSH2_MSG_GLOBAL_REQUEST); translate(SSH2_MSG_REQUEST_SUCCESS); translate(SSH2_MSG_REQUEST_FAILURE); translate(SSH2_MSG_CHANNEL_OPEN); translate(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION); translate(SSH2_MSG_CHANNEL_OPEN_FAILURE); translate(SSH2_MSG_CHANNEL_WINDOW_ADJUST); translate(SSH2_MSG_CHANNEL_DATA); translate(SSH2_MSG_CHANNEL_EXTENDED_DATA); translate(SSH2_MSG_CHANNEL_EOF); translate(SSH2_MSG_CHANNEL_CLOSE); translate(SSH2_MSG_CHANNEL_REQUEST); translate(SSH2_MSG_CHANNEL_SUCCESS); translate(SSH2_MSG_CHANNEL_FAILURE); return "unknown"; } #undef translate #undef translatec } pktin.type = pktin.body[-1]; log_packet(PKT_INCOMING, pktin.type, ssh1_pkt_type(pktin.type), pktin.body, pktin.length);log_packet(PKT_INCOMING, pktin.type, ssh2_pkt_type(pktin.type), pktin.data+6, pktin.length-6)log_packet(PKT_OUTGOING, pktout.type, ssh1_pkt_type(pktout.type), pktout.body, pktout.length); if (ssh1_compressing) { unsigned char *compblk; int complen;log_packet(PKT_OUTGOING, pktout.data[5], ssh2_pkt_type(pktout.data[5]), pktout.data + 6, pktout.length - 6)ssh_pkt_ctx |= SSH2_PKTCTX_DHGEXssh_pkt_ctx |= SSH2_PKTCTX_DHGROUP1;nk2Q_M;H~3 d69.@ = cscipher_tobe; sccipher = sccipher_tobe; csmac = csmac_tobe; scmac = scmac_tobe; cscomp = cscomp_tobe; sccomp = sccomp_tobe; cscomp->compress_init(); sccomp->decompress_init(); /* * Set IVs after keys. Here we use the exchange hash from the * _first_ key exchange. */ if (first_kex) memcpy(ssh2_session_id, exchange_hash, sizeof(exchange_hash)); ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'C', keyspace); cscipher->setcskey(keyspace); ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'D', keyspace); sccipher->setsckey(keyspace); ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'A', keyspace); cscipher->setcsiv(keyspace); ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'B', keyspace); sccipher->setsciv(keyspace); ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'E', keyspace); csmac->setcskey(keyspace); ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'F', keyspace); scmac->setsckey(keyspace); /* * If this is the first key exchange phase, we must pass the * SSH2_MSG_NEWKEYS packet to the next layer, not because it * wants to see it but because it will need time to initialise * itself before it sees an actual packet. In subsequent key * exchange phases, we don't pass SSH2_MSG_NEWKEYS on, because * it would only confuse the layer above. */ if (!first_kex) { crReturn(0); } first_kex = 0; /* * Now we're encrypting. Begin returning 1 to the protocol main * function so that other things can run on top of the * transport. If we ever see a KEXINIT, we must go back to the * start. */ while (!(ispkt && pktin.type == SSH2_MSG_KEXINIT)) { crReturn(1); } logevent("Server initiated key re-exchange"); goto begin_key_exchange; crFinish(1); } /* * Add data to an SSH2 channel output buffer. */ static void ssh2_add_channel_data(struct ssh_channel *c, char *buf, int len) { bufchain_add(&c->v.v2.outbuffer, buf, len); } /* * Attempt to send data on an SSH2 channel. */ static int ssh2_try_send(struct ssh_channel *c) { while (c->v.v2.remwindow > 0 && bufchain_size(&c->v.v2.outbuffer) > 0) { int len; void *data; bufchain_prefix(&c->v.v2.outbuffer, &data, &len); if ((unsigned)len > c->v.v2.remwindow) len = c->v.v2.remwindow; if ((unsigned)len > c->v.v2.remmaxpkt) len = c->v.v2.remmaxpkt; ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(data, len); ssh2_pkt_send(); bufchain_consume(&c->v.v2.outbuffer, len); c->v.v2.remwindow -= len; } /* * After having sent as much data as we can, return the amount * still buffered. */ return bufchain_size(&c->v.v2.outbuffer); } /* * Potentially enlarge the window on an SSH2 channel. */ static void ssh2_set_window(struct ssh_channel *c, unsigned newwin) { if (newwin > c->v.v2.locwindow) { ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_adduint32(newwin - c->v.v2.locwindow); ssh2_pkt_send(); c->v.v2.locwindow = newwin; } } /* * Handle the SSH2 userauth and connection layers. */ static void do_ssh2_authconn(unsigned char *in, int inlen, int is_pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh_pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASKssh_pkt_ctx |= SSH2_PKTCTX_PUBLICKEYssh_pkt_ctx |= SSH2_PKTCTX_PUBLICKEY_pkt_ctx |= SSH2_PKTCTX_KBDINTERssh_pkt_ctx |= SSH2_PKTCTX_KBDINTERsh_pkt_ctx |= SSH2_PKTCTX Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ed727e9a4e8a90fa4094415aee783ec6 Text-delta-base-sha1: f5a70f75b48ac94ed9b6d8966fd14aa4cd4aca55 Text-content-length: 23 Text-content-md5: 86e672b042cf2b54c8f00d17f8e6c89d Text-content-sha1: efa3d624511cf88a3ee074611304b581a83cff60 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.91 PROPS-END SVNH 1T Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8b6571771e02d5a6541b80cf152597da Text-delta-base-sha1: c54192b3febb34a359f78c3cb6a2d8213b1788fd Text-content-length: 676 Text-content-md5: 19de3d0f81bc1afdb4eaf593bc49fe00 Text-content-sha1: 0b7c19b3f903c32ae56ed43da3dbd8154d7a675a Content-length: 717 K 15 cvs2svn:cvs-rev V 5 1.168 PROPS-END SVN{>8^rBg;!8yAx:2Z>$WSTATPACKETcase IDC_LSTATPACKETPACKET, cfg.logtype == LGTYP_NONE ? IDC_LSTATOFF : cfg.logtype == LGTYP_ASCII ? IDC_LSTATASCII : cfg.logtype == LGTYP_DEBUG ? IDC_LSTATRAW : IDC_LSTATPACKETs "Log &SSH packet data", IDC_LSTATPACKET, case IDC_LSTATPACKETif (IsDlgButtonChecked(hwnd, IDC_LSTATOFF)) cfg.logtype = LGTYP_NONE; if (IsDlgButtonChecked(hwnd, IDC_LSTATASCII)) cfg.logtype = LGTYP_ASCII; if (IsDlgButtonChecked(hwnd, IDC_LSTATRAW)) cfg.logtype = LGTYP_DEBUG; if (IsDlgButtonChecked(hwnd, IDC_LSTATPACKET)) cfg.logtype = LGTYP_PACKETS Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e042a51984a1b3ba1289af8f3cc00fe2 Text-delta-base-sha1: d63c3dfafa8f9914c18ff28003149dfb329be240 Text-content-length: 109 Text-content-md5: e7ceeaaf4d983f471034bffae82ce2ce Text-content-sha1: db678d5f0cd9901547c88f7b11637ea43885e592 Content-length: 150 K 15 cvs2svn:cvs-rev V 5 1.182 PROPS-END SVN@@}+UOpen the initial log file if there is one. */ logfopen(... Revision-number: 1494 Prop-content-length: 276 Content-length: 276 K 8 svn:date V 27 2001-12-15T11:10:19.000000Z K 7 svn:log V 175 Jaeyoun Chung's mysterious patch that apparently makes Korean input work properly: call luni_send() one character at a time rather than all together after WM_IME_COMPOSITION. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e7ceeaaf4d983f471034bffae82ce2ce Text-delta-base-sha1: db678d5f0cd9901547c88f7b11637ea43885e592 Text-content-length: 685 Text-content-md5: 4b4e5cdccfeb83a8f7bc021e65018327 Text-content-sha1: 119e7631b8e22e336573210fa254234a62440195 Content-length: 726 K 15 cvs2svn:cvs-rev V 5 1.183 PROPS-END SVN}{}qint i; buff = (char*) smalloc(n); ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, buff, n); /* * Jaeyoun Chung reports that Korean character * input doesn't work correctly if we do a single * luni_send() covering the whole of buff. So * instead we luni_send the characters one by one. */ for (i = 0; i < n; i += 2) luni_send((unsigned short *)(buff+i), 1.*||.UNICODETEXT, clipdata); SetClipboardData(CF_TEXT, clipdata2); if (clipdata3) SetClipboardData(RegisterClipboardFormat(CF_RTF), clipdata3); CloseClipboard(); } else { GlobalFree(clipdata); GlobalFree(clipdata2); } if (!must_desele Revision-number: 1495 Prop-content-length: 457 Content-length: 457 K 8 svn:date V 27 2001-12-15T11:49:48.000000Z K 7 svn:log V 356 Reverse part of RDB's pedantic patch from rev 1.129 [r1105]: app cursor and app keypad modes are now once again independently switchable. The VT100 and VT102 manuals may have done it RDB's way as he said, but xterm and rxvt disagree and at least one app depends on the xterm way. It'll have to become a configurable option if anyone has trouble with this. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4b4e5cdccfeb83a8f7bc021e65018327 Text-delta-base-sha1: 119e7631b8e22e336573210fa254234a62440195 Text-content-length: 1030 Text-content-md5: 686c6a033f7d235adfc2526c98d69138 Text-content-sha1: f7daef7c6d5cb4e87c0f4702fec2f60e78dfe5ba Content-length: 1071 K 15 cvs2svn:cvs-rev V 5 1.184 PROPS-END SVN<%<D#if 0 /* * RDB: VT100 & VT102 manuals both state the * app cursor keys only work if the app keypad * is on. * * SGT: That may well be true, but xterm * disagrees and so does at least one * application, so I've #if'ed this out and the * behaviour is back to PuTTY's original: app * cursor and app keypad are independently * switchable modes. If anyone complains about * _this_ I'll have to put in a configurable * option. */ if (!app_keypad_keys) app_flg = 0; #endif*G*lobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, rtflen); if (clipdata3 && (lock3 = GlobalLock(clipdata3)) != NULL) { strcpy(lock3, rtf); GlobalUnlock(clipdata3); } sfree(rtf); } else clipdata3 = NULL; GlobalUnlock(clipdata); GlobalUnlock(clipdata2); if (!must_deselect) SendMessage(hwnd, WM_IGNORE_CLIP, TRUE, 0); if (OpenClipboard(hwnd)) { EmptyClipboard(); SetClipboardData(CF_ Revision-number: 1496 Prop-content-length: 383 Content-length: 383 K 8 svn:date V 27 2001-12-15T12:15:24.000000Z K 7 svn:log V 282 Add the remote counterpart for the `local port forwardings accept connections from outside localhost' switch. Interestingly OpenSSH 3.0 appears to ignore this (though I know it works because ssh.com 3.0 gets it right, and the SSH packet dump agrees that I'm doing the right thing). K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 549aafc6a249404659e22788ff8c9d52 Text-delta-base-sha1: e6c10af5da6c676567d2c65c1e7a194761c662c5 Text-content-length: 996 Text-content-md5: 904dee28f437cad3a038d78b80c1fff7 Text-content-sha1: 4292e64636aed5e1d024b73aee296bfa43bf5e4f Content-length: 1036 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNxGn5Y\versionid $Id: config.but,v 1.22 2001/12/15 12:15:24S{config-ssh-portfwd-localhost} Controlling the visibility of forwarded ports \cfg{winhelp-topic}{ssh.tunnels.portfwd.localhost} The source port for a forwarded connection usually does not accept connections from any machine except the SSH client or server machine itself (for local and remote forwardings respectively). There are controls in the Tunnels panel to change this: \b The \q{Local ports accept connections from other hosts} option allows you to set up local-to-remote port forwardings in such a way that machines other than your client PC can connect to the forwarded port. \b The \q{Remote ports do the same} option does the same thing for remote-to-local port forwardings (so that machines other than the SSH server machine can connect to the forwarded port.) Note that this feature is only available in the SSH 2 protocol, and not all SSH 2 servers support it (OpenSSH 3.0 does not, for example) Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ebdf6f23eb95d7fc527c908eb6ef7e58 Text-delta-base-sha1: 4996b7ca8d4f56ba5691e5b599f2e3e8d39463c0 Text-content-length: 857 Text-content-md5: 5107cc429d28af351d7935b4756c428a Text-content-sha1: ef2db94dd4c91a8c6c445a18b07af9695bd94745 Content-length: 896 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN*< @-3 O[\versionid $Id: using.but,v 1.5 2001/12/15 12:15:24The source port for a forwarded connection usually does not accept connections from any machine except the SSH client or server machine itself (for local and remote forwardings respectively). There are controls in the Tunnels panel to change this: \b The \q{Local ports accept connections from other hosts} option allows you to set up local-to-remote port forwardings in such a way that machines other than your client PC can connect to the forwarded port. \b The \q{Remote ports do the same} option does the same thing for remote-to-local port forwardings (so that machines other than the SSH server machine can connect to the forwarded port.) Note that this feature is only available in the SSH 2 protocol, and not all SSH 2 servers support it (OpenSSH 3.0 does not, for exampl Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 46437e03c73839f23a0f83f0b9b66575 Text-delta-base-sha1: 2cccac8e8736bd92fe59934d8704bd26bbe380cb Text-content-length: 136 Text-content-md5: 252e20a67ef85d5d67693a644c7bb89d Text-content-sha1: e91a556b98baede78a883861d3f602f3c76a7d66 Content-length: 177 K 15 cvs2svn:cvs-rev V 5 1.129 PROPS-END SVNM qyq(% conns from hosts other than localhost */ int rport_acceptall; /* same for remote forwarded ports (SSH2 only) Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: acbe807b4de25820751ddcbda7a454e1 Text-delta-base-sha1: 74d46193342658a23008895e028a9ae031a7932f Text-content-length: 131 Text-content-md5: da8eb87c406efba09268e0c5f52e6338 Text-content-sha1: bd4405767898e56155c1d0e84f50556c2aaf1cb5 Content-length: 171 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVN:IeIA4Z`write_setting_i(sesskey, "RemotePortAcceptAll", cfg->rgppi(sesskey, "RemotePortAcceptAll", 0, &cfg->r Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 445477c700b10cfd4e5bba03458f3204 Text-delta-base-sha1: cb4bd3495ce7c169abbfcf8d363f5c20936ddcb2 Text-content-length: 121 Text-content-md5: db031b9fd58cd8cad2ad747ef80ef57a Text-content-sha1: fbafd07ddfc1f81c1f97356333d328e9187cd44a Content-length: 162 K 15 cvs2svn:cvs-rev V 5 1.187 PROPS-END SVNk9NsNxsif (cfg.rport_acceptall) ssh2_pkt_addstring("0.0.0.0"); else Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 19de3d0f81bc1afdb4eaf593bc49fe00 Text-delta-base-sha1: 0b7c19b3f903c32ae56ed43da3dbd8154d7a675a Text-content-length: 532 Text-content-md5: 0ded28fb7b793de741ff725364fad5d2 Text-content-sha1: a00fb2e1dd056377afec486ff9cbced51332d46e Content-length: 573 K 15 cvs2svn:cvs-rev V 5 1.169 PROPS-END SVN>L:*mD1hp7s*bCfF!BkT#R case IDC_LPORT_ALL: case IDC_RPORT_ALL: return "JI(`',`ssh.tunnels.portfwd.localhostDlgButton(hwnd, IDC_RPORT_ALL, cfg.rh IDC_LPORT_ALL); checkbox(&cp, "Remote ports do t&he same (SSH v2 only)", IDC_R cfg.x11_forward = cfg.lport_acceptall = IsDlgButtonChecked(hwnd, IDC_LPORT_ALL); break; case IDC_RPORT_ALL cfg.rport_acceptall = IsDlgButtonChecked(hwnd, IDC_R Revision-number: 1497 Prop-content-length: 316 Content-length: 316 K 8 svn:date V 27 2001-12-15T14:09:51.000000Z K 7 svn:log V 215 Improvements to the malloc debugging stuff: when MALLOC_LOG is enabled, so that all mallocs and reallocs are tagged with a file name and line number, this information is now shown in the `Out of memory!' panic box. K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2900240550d207efb9a7934b2b9476c4 Text-delta-base-sha1: 429bb3fe0d34512840d31be11ff5574e00efa531 Text-content-length: 538 Text-content-md5: e22c5d56b4db42c57523acf739fbde27 Text-content-sha1: edc5318bb301c28646c0280812ca033b7d3bd604 Content-length: 578 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNku!m* 3Sk3k _static char *mlog_file = NULL; static int mlog_line = 0; void mlog(char *file, int line) { mlog_file = file; mlog_line = line;char str[200]; #ifdef MALLOC_LOG sprintf(str, "Out of memory! (%s:%d, size=%d)", mlog_file, mlog_line, size); #else strcpy(str, "Out of memory!"); #endif MessageBox(NULL, strchar str[200]; #ifdef MALLOC_LOG sprintf(str, "Out of memory! (%s:%d, size=%d)", mlog_file, mlog_line, size); #else strcpy(str, "Out of memory!"); #endif MessageBox(NULL, str Revision-number: 1498 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2001-12-15T14:29:03.000000Z K 7 svn:log V 151 `make clean' in the Borland makefile should ignore error returns from the delete commands in case nothing of a particular type needs to be cleaned up. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bc5a24d8d9af2a634cdbbef98701fc10 Text-delta-base-sha1: e750ce443d13657bc5e40237f9baefadeec6d94c Text-content-length: 185 Text-content-md5: ad47c1d8c7ece1c7c6fdd72ba03ef111 Text-content-sha1: 1fb10f076dd0bac88274930b694f34e537308967 Content-length: 225 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN.8 #d#1}-del *.obj\n". "\t-del *.exe\n". "\t-del *.res\n". "\t-del *.pch\n". "\t-del *.aps\n". "\t-del *.il*\n". "\t-del *.pdb\n". "\t-del *.rsp\n". "\t-del *.tds\n". "\t- Revision-number: 1499 Prop-content-length: 279 Content-length: 279 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-15T14:30:58.000000Z K 7 svn:log V 178 A contributor tells me that WM_MOUSEWHEEL is not supported in Win95, and offers a patch that uses RegisterMessage() to acquire the correct dynamic message number to use instead. PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 686c6a033f7d235adfc2526c98d69138 Text-delta-base-sha1: f7daef7c6d5cb4e87c0f4702fec2f60e78dfe5ba Text-content-length: 2169 Text-content-md5: 9ba69490f539505712c30be22473190e Text-content-sha1: 9bf9953e6eab6a158d39c03f863c5f082b699d95 Content-length: 2210 K 15 cvs2svn:cvs-rev V 5 1.185 PROPS-END SVN@JeHdbgCS6T]Tho"A"b\Tstatic int do_mouse_wheel_msg(UINT message, WPARAM wParam, LPARAM lParamstatic UINT wm_mousewheel = WM_MOUSEWHEELIf we're running a version of Windows that doesn't support * WM_MOUSEWHEEL, find out what message number we should be * using instead. */ if (osVersion.dwMajorVersion < 4 || (osVersion.dwMajorVersion == 4 && osVersion.dwPlatformId != VER_PLATFORM_WIN32_NT)) wm_mousewheel = RegisterWindowMessage("MSWHEEL_ROLLMSG"); default: if (message == wm_mousewheel) { int shift_pressed=0, control_pressed=0, alt_pressed=0; if (message == WM_MOUSEWHEEL) { wheel_accumulator += (short)HIWORD(wParam); shift_pressed=LOWORD(wParam) & MK_SHIFT; control_pressed=LOWORD(wParam) & MK_CONTROL; } else { BYTE keys[256]; wheel_accumulator += (int)wParam; if (GetKeyboardState(keys)!=0) { shift_pressed=keys[VK_SHIFT]&0x80; control_pressed=keys[VK_CONTROL]&0x80; } } && !(cfg.mouse_override && shift_pressed)) { /* send a mouse-down followed by a mouse up */shift_pressed, control_pressed, is_alt_pressed()); term_mouse(b, MA_RELEASE, TO_CHR_X(X_POS(lParam)), TO_CHR_Y(Y_POS(lParam)), shift_pressed, control_pressedGPPGen++; } if (rtfsize < rtflen + totallen + 3) { rtfsize = rtflen + totallen + 512; rtf = srealloc(rtf, rtfsize); } strcpy(rtf + rtflen, before); rtflen += blen; for (i = 0; i < multilen; i++) { if (tdata[tindex+i] == '\\' || tdata[tindex+i] == '{' || tdata[tindex+i] == '}') { rtf[rtflen++] = '\\'; rtf[rtflen++] = tdata[tindex+i]; } else if (tdata[tindex+i] == 0x0D || tdata[tindex+i] == 0x0A) { rtflen += sprintf(rtf+rtflen, "\\par\r\n"); } else if (tdata[tindex+i] > 0x7E || tdata[tindex+i] < 0x20) { rtflen += sprintf(rtf+rtflen, "\\'%02x", tdata[tindex+i]); } else { rtf[rtflen++] = tdata[tindex+i]; } } strcpy(rtf + rtflen, after); rtflen += alen; tindex += multilen; uindex++; } strcpy(rtf + rtflen, "}"); rtflen += 2; clipdata3 = G Revision-number: 1500 Prop-content-length: 284 Content-length: 284 K 8 svn:date V 27 2001-12-16T12:11:56.000000Z K 7 svn:log V 183 Replace the definition of WHEEL_DELTA which was removed in rev 1.185 [r1499]. For some reason Borland builds were working perfectly OK without it, but VC builds were failing. *shrug* K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9ba69490f539505712c30be22473190e Text-delta-base-sha1: 9bf9953e6eab6a158d39c03f863c5f082b699d95 Text-content-length: 256 Text-content-md5: f747c82a093feb69085489fcea2a1eb5 Text-content-sha1: df9e29e0403a349ea2a874e3f979a4a4560252c2 Content-length: 297 K 15 cvs2svn:cvs-rev V 5 1.186 PROPS-END SVN &&S|Mouse wheel support. */ #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 0x020A /* not defined in earlier SDKs */ #endif #ifndef WHEEL_DELTA #define WHEEL_DELTA 120H1 < 0x20) totallen += 4; else totall Revision-number: 1501 Prop-content-length: 183 Content-length: 183 K 7 svn:log V 83 Add the `local' command set to PSFTP: lcd, lpwd, and ! to spawn a Windows command. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-16T13:33:04.000000Z PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 10bb73bcaf1f406983fc7881e3c2b1ff Text-delta-base-sha1: effab1dc8168ea4cb7e4e5926a1217b1f3c4cc70 Text-content-length: 3008 Text-content-md5: 10b06db631018d945bf308c0938f6e91 Text-content-sha1: 7e52890c494a48228f91e5a39244cbc48a0095f4 Content-length: 3047 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNq_3rZrvp,b\versionid $Id: psftp.but,v 1.3 2001/12/16 13:33:04quoting} General quoting rules for PSFTP commands Most PSFTP commands are considered by the PSFTP command interpreter as a sequence of words, separated by spaces. For example, the command \c{ren oldfilename newfilename} splits up into three words: \c{ren} (the command name), \c{oldfilename} (the name of the file to be renamed), and \c{newfilename} (the new name to give the file). Sometimes you will need to specify file names that \e{contain} spaces. In order to do this, you can surround the file name with double quotes. This works equally well for local file names and remote file names: \c psftp> get "spacey file name.txt" "save it under this name.txt" The double quotes themselves will not appear as part of the file names; they are removed by PSFTP and their only effect is to stop the spaces inside them from acting as word separators. If you need to \e{use} a double quote (on some types of remote system, such as Unix, you are allowed to use double quotes in file names), you can do this by doubling it. This works both inside and outside double quotes. For example, this command \c psftp> ren ""this"" "a file with ""quotes"" in it" will take a file whose current name is \c{"this"} (with a double quote character at the beginning and the end) and rename it to a file whose name is \c{a file with "quotes" in it}. (The one exception to the PSFTP quoting rules is the \c{!} command, which passes its command line straight to Windows without splitting it up into words at all. See \k{psftp-cmd-pling}.)remote working directory on the server. To change your remote working directory, use the \c{cd} command. To display your current remote working directory, type \c{pwd}. \S{psftp-cmd-lcd} The \c{lcd} and \c{lpwd} commands: changing the local working directory As well as having a working directory on the remote server, PSFTP also has a working directory on your local machine (just like any other Windows process). This is the default local directory that other commands will operate on. For example, if you type \c{get filename.dat} then PSFTP will save the resulting file as \c{filename.dat} in your local working directory. To change your local working directory, use the \c{lcd} command. To display your current local working directory, type \c{lS{psftp-cmd-pling} The \c{!} command: run a local Windows command You can run local Windows commands using the \c{!} command. This is the only PSFTP command that is not subject to the command quoting rules given in \k{psftp-quoting}. If any command line begins with the \c{!} character, then the rest of the line will be passed straight to Windows without further translation. For example, if you want to move an existing copy of a file out of the way before downloading an updated version, you might type: \c psftp> !ren myfile.dat myfile.bak \c psftp> get myfile.dat using the Windows \c{ren} command to rename files on your local PC Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ed59d6392e60e5a41e685dcc51737b5d Text-delta-base-sha1: 0b632c514407a3bdca81ad8330d0fbe159af7bb2 Text-content-length: 4442 Text-content-md5: c4db98a61c5732e5f0344e3934ba7a3b Text-content-sha1: f180fcc8ad0b40ef8c8b1ed938a38c74646ca7f2 Content-length: 4482 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN990!Qo\o1O.bmly??E.33;L})AK^zGA BGWb3lcd(struct sftp_command *cmd) { char *currdir; int len; if (cmd->nwords < 2) { printf("lcd: expects a local directory name\n"); return 0; } if (!SetCurrentDirectory(cmd->words[1])) { LPVOID message; int i; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&message, 0, NULL); i = strcspn((char *)message, "\n"); printf("lcd: unable to change directory: %.*s\n", i, (LPCTSTR)message); LocalFree(message); return 0; } currdir = smalloc(256); len = GetCurrentDirectory(256, currdir); if (len > 256) currdir = srealloc(currdir, len); GetCurrentDirectory(len, currdir); printf("New local directory is %s\n", currdir); sfree(currdir); return 1; } static int sftp_cmd_lpwd(struct sftp_command *cmd) { char *currdir; int len; currdir = smalloc(256); len = GetCurrentDirectory(256, currdir); if (len > 256) currdir = srealloc(currdir, len); GetCurrentDirectory(len, currdir); printf("Current local directory is %s\n", currdir); sfree(currdir); return 1; } static int sftp_cmd_pling(struct sftp_command *cmd) { int exitcode; exitcode = system(cmd->words[1]); return (exitcode == 0)int listed; /* do we list this in primary help?!", TRUE, "run a local Windows command", "\n" " Runs a local Windows command. For example, \"!del myfile\".\n", sftp_cmd_pling }, { "bye", TRUETRUETRUETRUEFALSE, "del", NULL, sftp_cmd_rm }, { "dir", TRUETRUE, "bye", NULL, sftp_cmd_quit }, { "get", TRUETRUEcd", TRUE, "change local working directory", " \n" " Change the local working directory of the PSFTP program (the\n" " default location where the \"get\" command will save files).\n", sftp_cmd_lcd }, { "lpwd", TRUE, "print local working directory", "\n" " Print the local working directory of the PSFTP program (the\n" " default location where the \"get\" command will save files).\n", sftp_cmd_lpwd }, { "ls", TRUE, "dir", NULL, sftp_cmd_ls }, { "mkdir", TRUETRUETRUETRUETRUETRUE, "bye", NULL, sftp_cmd_quit }, { "reget", TRUETRUE, "mv", NULL, sftp_cmd_mv }, { "rename", FALSE, "mv", NULL, sftp_cmd_mv }, { "reput", TRUETRUE, "del", NULL, sftp_cmd_rm }, { "rmdir", TRUE; if (!sftp_lookup[i].listed) continue; if (!sftp_lookup[i].listed) continuep = line; while (*p && (*p == ' ' || *p == '\t')) p++; if (*p == '!') { /* * Special case: the ! command. This is always parsed as * exactly two words: one containing the !, and the second * containing everything else on the line. */ cmd->nwords = cmd->wordssize = 2; cmd->words = srealloc(cmd->words, cmd->wordssize * sizeof(char *)); cmd->words[0] = "!"; cmd->words[1] = p+1; } else { /* * Parse the command line into words. The syntax is: * - double quotes are removed, but cause spaces within to be * treated as non-separating. * - a double-doublequote pair is a literal double quote, inside * _or_ outside quotes. Like this: * * firstword "second word" "this has ""quotes"" in" and""this"" * * becomes * * >firstword< * >second word< * >this has "quotes" in< * >and"this"< */ while (*p) { /* skip whitespace */ while (*p && (*p == ' ' || *p == '\t')) p++; /* mark start of word */ q = r = p; /* q sits at start, r writes word */ quoting = 0; while (*p) { if (!quoting && (*p == ' ' || *p == '\t')) break; /* reached end of word */ else if (*p == '"' && p[1] == '"') p += 2, *r++ = '"'; /* a literal quote */ else if (*p == '"') p++, quoting = !quoting; else *r++ = *p++; } if (*p) p++; /* skip over the whitespace */ *r = '\0'; if (cmd->nwords >= cmd->wordssize) { cmd->wordssize = cmd->nwords + 16; cmd->words = srealloc(cmd->words, cmd->wordssize * sizeof(char *)); } cmd->words[cmd->nwords++] = q; } Revision-number: 1502 Prop-content-length: 364 Content-length: 364 K 8 svn:date V 27 2001-12-16T14:56:02.000000Z K 7 svn:log V 263 Add two extra appendices giving the licence text and details of how to give feedback. (I think the latter has suddenly become worthwhile now we have the ability to distribute a help file; so people won't have to come to the website for the feedback information.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2e445269bc1d1ddab07c8e4c7e7033e6 Text-delta-base-sha1: 6f960e95782e50c84702afa4c8e7aa819a46941d Text-content-length: 121 Text-content-md5: 17dc65a286527e293918c69a08bcf0ba Text-content-sha1: 79ac62519048831a5bbd954f3884102d6e0a2090 Content-length: 160 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNIghhJCHAPTERS := blurb intro gs using config pscp psftp plink pubkey pageant CHAPTERS += faq feedback licence Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 641f26cd2bff6a7c9977e73ca74cfb92 Text-delta-base-sha1: 63dfac0e74eec524ee59c9c84b0386a0a4d91551 Text-content-length: 256 Text-content-md5: 721406125f20599315bfd8fd427d4133 Text-content-sha1: 991adbd91deab21e5f3e35a45216661213098913 Content-length: 295 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN\m,mThis manual is copyright 2001 Simon Tatham. All rights reserved. You may distribute this documentation under the MIT licence. See \k{licence} for the licence text in full. \versionid $Id: blurb.but,v 1.5 2001/12/16 14:56:02 simon Exp $ Node-path: putty/doc/feedback.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 13229 Text-content-md5: 5b36e029cbfa76f56f8ae579dab77c9b Text-content-sha1: 7e5a51b8b0ccbd74828becccd1068a83692af4d3 Content-length: 13345 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN\versionid $Id: feedback.but,v 1.1 2001/12/16 14:56:02 simon Exp $ \A{feedback} Feedback and bug reporting This section describes what to do if you want to contact the PuTTY development team. \K{feedback-general} gives some general guidelines for sending any kind of e-mail to the development team. Following sections give more specific guidelines for particular types of e-mail, such as bug reports and feature requests. \H{feedback-general} General guidelines The PuTTY development team gets a \e{lot} of mail. If you can possibly solve your own problem by reading the manual, reading the FAQ, reading the web site, asking a fellow user, perhaps posting on the newsgroup \W{news:comp.security.ssh}\c{comp.security.ssh}, or some other means, then it would make our lives much easier. If the volume of e-mail really gets on top of us and we can't find time to answer it all, then the first e-mails we discard will be the ones from people who don't look as if they have made a reasonable effort to solve their own problems. This is not intended to cause offence; it's occasionally a necessary response to a serious problem. We get a \e{lot} of e-mail. Really. Also, the PuTTY contact email address is a mailing list. For this reason, e-mails larger than 40Kb will be held for inspection by the list administrator, and will not be allowed through unless they really appear to be worth their large size. Therefore: \b Don't send your bug report as a Word document. Word documents are roughly fifty times larger than writing the same report in plain text. In addition, most of the PuTTY team read their e-mail on Unix machines, so copying the attachment to a Windows box to run Word is very inconvenient. Not only that, but several of us don't even \e{have} a copy of Word! \b Don't mail large screen shots without checking with us first. Sending a screen shot of an error box is almost certainly unnecessary when you could just tell us in plain text what the error was. Sending a full-screen shot is sometimes useful, but it's probably still wise to check with us before sending it. \b If you want to send us a screen shot, or any other kind of large data file, it is much more convenient for us if you can put the file on a web site and send us the URL. That way (a) we don't have to download it at all if it doesn't look necessary; and (b) only one member of the team needs to download it, instead of it being automatically sent to everyone on the mailing list. \b If you \e{must} mail a screen shot, don't send it as a \cw{.BMP} file. \cw{BMP}s have no compression and they are \e{much} larger than other image formats such as PNG, TIFF and GIF. Convert the file to a properly compressed image format before sending it. \H{feedback-bugs} Reporting bugs If you think you have found a bug in PuTTY, your first steps should be: \b Check the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist.html}{Wishlist page} on the PuTTY website, and see if we already know about the problem. If we do, it is almost certainly not necessary to mail us about it, unless you think you have extra information that might be helpful to us in fixing it. (Of course, if we actually \e{need} specific extra information about a particular bug, the Wishlist page will say so.) \b Check the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/changes.html}{Change Log} on the PuTTY website, and see if we have already fixed the bug in the development snapshots. \b Check the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/faq.html}{FAQ} on the PuTTY website (also provided as \k{faq} in the manual), and see if it answers your question. The FAQ lists the most common things which people think are bugs, but which aren't bugs. \b Download the latest development snapshot and see if the problem still happens with that. This really is worth doing. As a general rule we aren't very interested in bugs that appear in the release version but not in the development version, because that usually means they are bugs we have \e{already fixed}. On the other hand, if you can find a bug in the development version that doesn't appear in the release, that's likely to be a new bug we've introduced since the release and we're definitely interested in it. If none of those options solved your problem, and you still need to report a bug to us, it is useful if you include some general information: \b Tell us what version of PuTTY you are running. To find this out, use the "About PuTTY" option from the System menu. Please \e{do not} just tell us \q{I'm running the latest version}; e-mail can be delayed and it may not be obvious which version was the latest at the time you sent the message. \b Tell us what version of what OS you are running PuTTY on. \b Tell us what protocol you are connecting with: SSH, Telnet, Rlogin or Raw mode. \b Tell us what kind of server you are connecting to; what OS, and if possible what SSH server (if you're using SSH). You can get some of this information from the PuTTY Event Log (see \k{using-eventlog} in the manual). \b Send us the contents of the PuTTY Event Log, unless you have a specific reason not to (for example, if it contains confidential information that you think we should be able to solve your problem without needing to know). \b Try to give us as much information as you can to help us see the problem for ourselves. If possible, give us a step-by-step sequence of \e{precise} instructions for reproducing the fault. \b Don't just tell us that PuTTY \q{does the wrong thing}; tell us exactly and precisely what it did, and also tell us exactly and precisely what you think it should have done instead. Some people tell us PuTTY does the wrong thing, and it turns out that it was doing the right thing and their expectations were wrong. Help to avoid this problem by telling us exactly what you think it should have done, and exactly what it did do. \b If you think you can, you're welcome to try to fix the problem yourself. A patch to the code which fixes a bug is an excellent addition to a bug report. However, a patch is never a \e{substitute} for a good bug report; if your patch is wrong or inappropriate, and you haven't supplied us with full information about the actual bug, then we won't be able to find a better solution. \b \W{http://www.chiark.greenend.org.uk/~sgtatham/bugs.html}\cw{http://www.chiark.greenend.org.uk/~sgtatham/bugs.html} is an article on how to report bugs effectively in general. If your bug report is \e{particularly} unclear, we may ask you to go away, read this article, and then report the bug again. \H{feedback-features} Requesting extra features If you want to request a new feature in PuTTY, the very first things you should do are: \b Check the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist.html}{Wishlist page} on the PuTTY website, and see if your feature is already on the list. If it is, it probably won't achieve very much to repeat the request. (But see \k{feedback-feature-priority} if you want to persuade us to give your particular feature higher priority.) \b Check the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/changes.html}{Change Log} on the PuTTY website, and see if we have already added your feature in the development snapshots. If it isn't clear, download the latest development snapshot and see if the feature is present. If it is, then it will also be in the next release and there is no need to mail us at all. If you can't find your feature in either the development snapshots \e{or} the Wishlist, then you probably do need to submit a feature request. Since the PuTTY authors are very busy, it helps if you try to do some of the work for us: \b Do as much of the design as you can. Think about \q{corner cases}; think about how your feature interacts with other existing features. Think about the user interface; if you can't come up with a simple and intuitive interface to your feature, you shouldn't be surprised if we can't either. Always imagine whether it's possible for there to be more than one, or less than one, of something you'd assumed there would be one of. (For example, if you were to want PuTTY to put an icon in the System tray rather than the Taskbar, you should think about what happens if there's more than one PuTTY active; how would the user tell which was which?) \b If you can program, it may be worth offering to write the feature yourself and send us a patch. However, it is likely to be helpful if you confer with us first; there may be design issues you haven't thought of, or we may be about to make big changes to the code which your patch would clash with, or something. If you check with the maintainers first, there is a better chance of your code actually being usable. \H{feedback-feature-priority} Requesting features that have already been requested If a feature is already listed on the Wishlist, then it usually means we would like to add it to PuTTY at some point. However, this may not be in the near future. If there's a feature on the Wishlist which you would like to see in the \e{near} future, there are several things you can do to try to increase its priority level: \b Mail us and vote for it. (Be sure to mention that you've seen it on the Wishlist, or we might think you haven't even \e{read} the Wishlist). This probably won't have very \e{much} effect; if a huge number of people vote for something then it may make a difference, but one or two extra votes for a particular feature are unlikely to change our priority list immediately. Also, don't expect a reply. \b Offer us money if we do the work sooner rather than later. This sometimes works, but not always. The PuTTY team all have full-time jobs and we're doing all of this work in our free time; we may sometimes be willing to give up some more of our free time in exchange for some money, but if you try to bribe us for a \e{big} feature it's entirely possible that we simply won't have the time to spare - whether you pay us or not. (Also, we don't accept bribes to add \e{bad} features to the Wishlist, because our desire to provide high-quality software to the users comes first.) \b Offer to help us write the code. This is probably the \e{only} way to get a feature implemented quickly, if it's a big one that we don't have time to do ourselves. \H{feedback-webadmin} Web server administration If the PuTTY web site is down (Connection Timed Out), please don't bother mailing us to tell us about it. Most of us read our e-mail on the same machines that host the web site, so if those machines are down then we will notice \e{before} we read our e-mail. So there's no point telling us our servers are down. Of course, if the web site has some other error (Connection Refused, 404 Not Found, 403 Forbidden, or something else) then we might \e{not} have noticed and it might still be worth telling us about it. \H{feedback-permission} Asking permission for things PuTTY is distributed under the MIT Licence (see \k{licence} for details). This means you can do almost \e{anything} you like with our software, our source code, and our documentation. The only things you aren't allowed to do are to remove our copyright notices or the licence text itself, or to hold us legally responsible if something goes wrong. So if you want permission to include PuTTY on a magazine cover disk, or as part of a collection of useful software on a CD or a web site, then \e{permission is already granted}. You don't have to mail us and ask. Just go ahead and do it. We don't mind. If you want to use parts of the PuTTY source code in another program, then it might be worth mailing us to talk about technical details, but if all you want is to ask permission then you don't need to bother. You already have permission. \H{feedback-mirrors} Mirroring the PuTTY web site All mirrors of the PuTTY web site are welcome. Please don't bother asking us for permission before setting up a mirror. You already have permission. We are always happy to have more mirrors. If you mail us \e{after} you have set up the mirror, and remember to let us know which country your mirror is in, then we'll add it to the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/mirrors.html}{Mirrors page} on the PuTTY website. If you have technical questions about the process of mirroring, then you might want to mail us before setting up the mirror; but if you just want to ask for permission, you don't need to. You already have permission. \H{feedback-compliments} Praise and compliments One of the most rewarding things about maintaining free software is getting e-mails that just say \q{thanks}. We are always happy to receive e-mails of this type. Regrettably we don't have time to answer them all in person. If you mail us a compliment and don't receive a reply, \e{please} don't think we've ignored you. We did receive it and we were happy about it; we just didn't have time to tell you so personally. To everyone who's ever sent us praise and compliments, in the past and the future: \e{you're welcome}! \H{feedback-address} E-mail address The actual address to mail is \cw{<\W{mailto:putty@projects.tartarus.org}{putty@projects.tartarus.org}>}. Node-path: putty/doc/licence.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1297 Text-content-md5: 8c12cc65fd8ee89c5a85c8feb64a183e Text-content-sha1: 832fadefa902fb581faaf2cc3040cb70e5062f3d Content-length: 1413 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN\versionid $Id: licence.but,v 1.1 2001/12/16 14:56:02 simon Exp $ \A{licence} PuTTY Licence PuTTY is copyright 1997-2001 Simon Tatham. Portions copyright Robert de Bath, Joris van Rantwijk, Delian Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Revision-number: 1503 Prop-content-length: 240 Content-length: 240 K 8 svn:date V 27 2001-12-16T15:14:36.000000Z K 7 svn:log V 139 Fiddle the header of the new feedback section to make it carefully ambiguous about whether it thinks it's on the website or in the manual. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5b36e029cbfa76f56f8ae579dab77c9b Text-delta-base-sha1: 7e5a51b8b0ccbd74828becccd1068a83692af4d3 Text-content-length: 286 Text-content-md5: 6a05a6ffbc8327d0c145a50c8b0f84b4 Text-content-sha1: e53b723a8797f365e5e441df25c9959058472642 Content-length: 325 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNi _@\versionid $Id: feedback.but,v 1.2 2001/12/16 15:14:36 simon Exp $ \A{feedback} Feedback and bug reporting This is a guide to providing feedback to the PuTTY development team. It is provided as both a web page on the PuTTY site, and an appendix in the PuTTY manual Revision-number: 1504 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2001-12-16T15:30:03.000000Z K 7 svn:log V 55 Add the `can we run under win3.1' question to the FAQ. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dbe443ba655ac1546751258d7f61163d Text-delta-base-sha1: 769aa98823c863dc94468cc02968f46590e6527e Text-content-length: 847 Text-content-md5: acb5b6ce6c9ec17fc45fb21ba170d8d9 Text-content-sha1: b4460527ef288f76669378de1c0c53b1f98a8c1e Content-length: 887 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN|3w2\ \versionid $Id: faq.but,v 1.15 2001/12/16 15:30:03win31}{Question} Is there a port to Windows 3.1? PuTTY is a 32-bit application from the ground up, so it won't run on Windows 3.1 as a native 16-bit program; and it would be \e{very} hard to port it to do so, because of Windows 3.1's vile memory allocation mechanisms. However, it is possible in theory to compile the existing PuTTY source in such a way that it will run under Win32s (an extension to Windows 3.1 to let you run 32-bit programs). In order to do this you'll need the right kind of C compiler - modern versions of Visual C at least have stopped being backwards compatible to Win32s. Also, the last time we tried this it didn't work very well. If you're interested in running PuTTY under Windows 3.1, help and testing in this area would be very welcome! Revision-number: 1505 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:15.933261Z PROPS-END Revision-number: 1506 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:15.943616Z PROPS-END Revision-number: 1507 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:15.951798Z PROPS-END Revision-number: 1508 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 70 The alphabetical ordering in the psftp command list was broken. D'oh! K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-19T18:49:32.000000Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c4db98a61c5732e5f0344e3934ba7a3b Text-delta-base-sha1: f180fcc8ad0b40ef8c8b1ed938a38c74646ca7f2 Text-content-length: 37 Text-content-md5: 19036c7c2a6b0aa2775906de4c8b390f Text-content-sha1: 680f4a95ae0a23f446120d6b3dbe0ab82ca31071 Content-length: 77 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN99]= Z_ Revision-number: 1509 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:16.064578Z PROPS-END Revision-number: 1510 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:16.089390Z PROPS-END Revision-number: 1511 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:16.096748Z PROPS-END Revision-number: 1512 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2001-12-20T14:18:01.000000Z K 7 svn:log V 52 This should fix the busy-wait problem with the IME. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f747c82a093feb69085489fcea2a1eb5 Text-delta-base-sha1: df9e29e0403a349ea2a874e3f979a4a4560252c2 Text-content-length: 1405 Text-content-md5: 89579cd93305a677c97ebf994244f066 Text-content-sha1: 7df3bfbfb84a463df52afe70135e1cea4bd0044f Content-length: 1446 K 15 cvs2svn:cvs-rev V 5 1.187 PROPS-END SVN:H0mUPG#^dm@M,s"8kstatic void sys_cursor_update(void); static time_t last_movement = 0; static int caret_x = -1, caret_y = -1caret_x = caret_y = -1; /* ensure caret is replaced next time */MOVE: sys_cursor_update()sys_cursor_update();sys_cursor_update(int cx, cy; if (!has_focus) return; /* * Avoid gratuitously re-updating the cursor position and IMM * window if there's no actual change required. */ cx = x * font_width + offset_width; cy = y * font_height + offset_height; if (cx == caret_x && cy == caret_y) return; caret_x = cx; caret_y = cy; sys_cursor_update(); } static void sys_cursor_update(void) { COMPOSITIONFORM cf; HIMC hIMC; if (!has_focus) return; if (caret_x < 0 || caret_y < 0) return; SetCaretPos(caret_x, caret_ycaret_x; cf.ptCurrentPos.y = caret_yH%T# f1H) { blen = sprintf(before, "{\\uc%d\\u%d", multilen, udata[uindex]); alen = 1; strcpy(after, "}"); } else { blen = sprintf(before, "\\u%d", udata[uindex]); alen = 0; after[0] = '\0'; } } assert(tindex + multilen <= len2); totallen = blen + a totallen += 2; else if (tdata[tindex+i] == 0x0D || tdata[tindex+i] == 0x0A) totallen += 6; /* \par\r\n */ else if (tdata[tindex+i] > 0x7E || tdata[tindex+i] Revision-number: 1513 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2001-12-20T14:19:10.000000Z K 7 svn:log V 55 Oops - fputs takes the file pointer second, not first! K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 19036c7c2a6b0aa2775906de4c8b390f Text-delta-base-sha1: 680f4a95ae0a23f446120d6b3dbe0ab82ca31071 Text-content-length: 48 Text-content-md5: 1bd2bcc479cb328dacf92f41911af2d0 Text-content-sha1: 188e0f1588415489b90df648fb1ff9ff78e76940 Content-length: 88 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN99ks'r, stderr, stder Revision-number: 1514 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 35 Document the Pageant command line. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-20T15:27:40.000000Z PROPS-END Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f29e6d5840ec8bd58049258e5c53eb0b Text-delta-base-sha1: 8bafa599f3d67f566be4d884a834cd19a112376e Text-content-length: 1225 Text-content-md5: 802880c61d2875b9b916f056de9417a6 Text-content-sha1: 0158d513f8d8fee00a3c1ba452ab1ea2451d9377 Content-length: 1264 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN3; 0T5{7|\versionid $Id: pageant.but,v 1.7 2001/12/20 15:27:40cmdline} The Pageant command line Pageant can be made to do things automatically when it starts up, by specifying instructions on its command line. If you're starting Pageant from the Windows GUI, you can arrange this by editing the properties of the Windows shortcut that it was started from. \S{pageant-cmdline-loadkey} Making Pageant automatically load keys on startup Pageant can automatically load one or more private keys when it starts up, if you provide them on the Pageant command line. Your command line might then look like: \c C:\PuTTY\pageant.exe d:\main.key d:\secondary.key If the keys are stored encrypted, Pageant will request the passphrases on startup. \S{pageant-cmdline-command} Making Pageant run another program You can arrange for Pageant to start another program once it has initialised itself and loaded any keys specified on its command line. This program (perhaps a PuTTY, or a WinCVS making use of Plink, or whatever) will then be able to use the keys Pageant has loaded. You do this by specifying the \c{-c} option followed by the command, like this: \c C:\PuTTY\pageant.exe d:\main.key -c C:\PuTTY\putty.exe Revision-number: 1515 Prop-content-length: 503 Content-length: 503 K 8 svn:date V 27 2001-12-29T14:05:07.000000Z K 7 svn:log V 402 Jordan Russell's patch: only process mouse drags when we have the mouse capture, which in turn will only occur if the initial click was in the PuTTY client area. Prevents mouse drag events without an initiating click, and also prevents selection occurring at unexpected moments such as if you move the mouse before releasing the second click after double-clicking the title bar to maximise the window. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 89579cd93305a677c97ebf994244f066 Text-delta-base-sha1: 7df3bfbfb84a463df52afe70135e1cea4bd0044f Text-content-length: 98 Text-content-md5: ecd3b2dfbab1301eff80db3e85bbba54 Text-content-sha1: b574a97bd6e69b39c48330eb7bcb93fe9803c7ee Content-length: 139 K 15 cvs2svn:cvs-rev V 5 1.188 PROPS-END SVN h{h && GetCapture() == hwnd%B%L, NULL); if (multilen != 1 Revision-number: 1516 Prop-content-length: 425 Content-length: 425 K 7 svn:log V 324 Jordan Russell's patch (again): a couple of registry read operations were using RegCreateKey instead of RegOpenKey by mistake. This also required a fix in settings.c to deal gracefully with a NULL return from enum_settings_start() - since the use of RCK had caused this never to happen, the code path had never been tested. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-29T14:18:51.000000Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: da8eb87c406efba09268e0c5f52e6338 Text-delta-base-sha1: bd4405767898e56155c1d0e84f50556c2aaf1cb5 Text-content-length: 496 Text-content-md5: ca468d800a97fb3a8da1ce8625c37488 Text-content-sha1: ec0d361ef1969d5d5d5526f7d7002c5d6621ea81 Content-length: 536 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNIIT&TOzbuflen = bufsize = 0; buffer = NULL; if ((handle = enum_settings_start())) { do { ret = enum_settings_next(handle, otherbuf, sizeof(otherbuf)); if (ret) { int len = strlen(otherbuf) + 1; if (bufsize < buflen + len) { bufsize = buflen + len + 2048; buffer = srealloc(buffer, bufsize); } strcpy(buffer + buflen, otherbuf); buflen += strlen(buffer + buflen) + 1; } } while (ret); enum_settings_finish(handle); } Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 11ab6b2c3a28b0ce558927573a3ecee3 Text-delta-base-sha1: 678c747905164bf892b86dc4efa6e88a32f1a426 Text-content-length: 91 Text-content-md5: bb8ac853911aadcd7b7c9b9a7a7a2e08 Text-content-sha1: c97144bbf174abd76cdc7d82999c32d5a6316762 Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN @<  OpenOpenKey(HKEY_CURRENT_USER, PUTTY_REG_POS "\\SshHostKeys", Revision-number: 1517 Prop-content-length: 455 Content-length: 455 K 8 svn:date V 27 2001-12-29T14:47:59.000000Z K 7 svn:log V 354 Jordan Russell's patch (3rd of several). We now don't call TermOut() if the PuTTY window has the mouse capture (i.e. a drag-select is in progress). This means you can drag-select at your leisure without the screen contents wandering around providing you with a moving target. Likewise dragging the scrollbar to find a piece of history in the scrollback. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ecd3b2dfbab1301eff80db3e85bbba54 Text-delta-base-sha1: b574a97bd6e69b39c48330eb7bcb93fe9803c7ee Text-content-length: 166 Text-content-md5: 2aef5947fea0a9499f8e4538868b6ed1 Text-content-sha1: 411e170f6b7e351fa6d589d4aa0b94c949c5e8bb Content-length: 207 K 15 cvs2svn:cvs-rev V 5 1.189 PROPS-END SVN;3if (GetCapture() != hwnd) if (GetCapture() != hwnd) B};BiByte(CP_ACP, 0, unitab+uindex, 1, NULL, 0, NUL Revision-number: 1518 Prop-content-length: 431 Content-length: 431 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-29T15:31:42.000000Z K 7 svn:log V 330 Add a new back-end function to return the exit code of the remote process. This is functional in SSH, and vestigial (just returns 0) in the other three protocols. Plink's Windows exit code is now determined by the remote process exit code, which should make it more usable in scripting applications. Tested in both SSH1 and SSH2. PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b99551341270e91010794ced0454e6c2 Text-delta-base-sha1: fc71ce5d1f4e4b48ce67a5360b12816f17b9a4da Text-content-length: 237 Text-content-md5: bbf63fd8495a0c46a34d295db81c2f1c Text-content-sha1: 7b2a646d88e6183b25b1f714922f05e2f8b5d081 Content-length: 277 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNs? Rj}Fint exitcodeexitcode = back->exitcode(); if (exitcode < 0) { fprintf(stderr, "Remote process exit code unavailable\n"); exitcode = 1; /* this is an error condition */ } return exitcode; } Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 252e20a67ef85d5d67693a644c7bb89d Text-delta-base-sha1: e91a556b98baede78a883861d3f602f3c76a7d66 Text-content-length: 31 Text-content-md5: 48e8b3e87655eb3e826c8dce32b1cd32 Text-content-sha1: 90ebe7ffb93824107649eaaa889c7be8d12fe215 Content-length: 72 K 15 cvs2svn:cvs-rev V 5 1.130 PROPS-END SVN.  exitcode Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: be696439f3b1f870a0070eaf76e6b8ab Text-delta-base-sha1: 2124de08be89c8bfca06c7ec90e834a4d5c0874e Text-content-length: 132 Text-content-md5: 76d7c7b48b60d55ae669101a53913541 Text-content-sha1: 71a1b98eeb3601d44bb7507fc4c15783fbc90176 Content-length: 172 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNQWjb >static int raw_exitcode(void) { /* Exit codes are a meaningless concept in the Raw protocol */exitcode Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d0ba6b17f176ff87911b478951c2a43c Text-delta-base-sha1: 2f26437fea49daf02b9518c37603a7803024143c Text-content-length: 145 Text-content-md5: 0753c43c93909baa982577f8e2a80669 Text-content-sha1: 32aa8675b2eb233f30229b92d9579cbf5a701fd6 Content-length: 185 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN/vIn)7GSstatic int rlogin_exitcode(void) { /* If we ever implement RSH, we'll probably need to do this properly */exitcode Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: db031b9fd58cd8cad2ad747ef80ef57a Text-delta-base-sha1: fbafd07ddfc1f81c1f97356333d328e9187cd44a Text-content-length: 1404 Text-content-md5: 8b5f72d50e08a1cd9a05c5379e5a4fc6 Text-content-sha1: 4077ab0bb000bd10a05c2d40e2ad0e4d4532a5e0 Content-length: 1445 K 15 cvs2svn:cvs-rev V 5 1.188 PROPS-END SVN+8remoteid); ssh2_pkt_send(); } } else { /* * This is a channel request we don't know * about, so we now either ignore the request * or respond with CHANNEL_FAILURE, depending * on want_reply. */ if (want_reply) { ssh2_pkt_init(SSH2_MSG_CHANNEL_FAILURE); ssh2_pkt_adduint32(c->remoteid); ssh2_pkt_send(); }static int ssh_return_exitcode(void) { return ssh_exitcodereturn_exitcode Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 25a82a3d0a908e887becf6a64bd2f285 Text-delta-base-sha1: 674d590bdfb7abd8aeaec1d99429495e86880280 Text-content-length: 151 Text-content-md5: c8c90db5df2bdb87f907a6ee8627760e Text-content-sha1: 62e0ba83cfeab69a7a00c9b2bc306ce57dbf41ff Content-length: 191 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNhqwoH static int telnet_exitcode(void) { /* Telnet doesn't transmit exit codes back to the client */ return 0exitcode Revision-number: 1519 Prop-content-length: 325 Content-length: 325 K 8 svn:date V 27 2001-12-29T17:00:06.000000Z K 7 svn:log V 224 Add a FAQ about keyboard mapping problems: basically explaining that we really need to know what character sequence you were _expecting_ your function key to generate before we can even think about making PuTTY generate it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: acb5b6ce6c9ec17fc45fb21ba170d8d9 Text-delta-base-sha1: b4460527ef288f76669378de1c0c53b1f98a8c1e Text-content-length: 1825 Text-content-md5: 1179e87c62bf6a9b26aae6b0034cb9dd Text-content-sha1: 2a6c236da019d27957945b1e0043b7584f74c5a8 Content-length: 1865 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN\72R!e\versionid $Id: faq.but,v 1.16 2001/12/29 17:00:06S{faq-keyboard}{Question} One or more function keys don't do what I expected in a server-side application. If you've already tried all the relevant options in the PuTTY Keyboard panel, you may need to mail the PuTTY maintainers and ask. It is \e{not} usually helpful just to tell us which application, which server operating system, and which key isn't working; in order to replicate the problem we would need to have a copy of every operating system, and every application, that anyone has ever complained about. PuTTY responds to function key presses by sending a sequence of control characters to the server. If a function key isn't doing what you expect, it's likely that the character sequence your application is expecting to receive is not the same as the one PuTTY is sending. Therefore what we really need to know is \e{what} sequence the application is expecting. The simplest way to investigate this is to find some other terminal environment, in which that function key \e{does} work; and then investigate what sequence the function key is sending in that situation. One reasonably easy way to do this on a Unix system is to type the command \c{cat}, and then press the function key. This is likely to produce output of the form \c{^[[11~}. You can also do this in PuTTY, to find out what sequence the function key is producing in that. Then you can mail the PuTTY maintainers and tell us \q{I wanted the F1 key to send \c{^[[11~}, but instead it's sending \c{^[OP}, can this be done?}, or something similar. You should still read the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/feedback.html}{Feedback page} on the PuTTY website (also provided as \k{feedback} in the manual), and follow the guidelines contained in that Revision-number: 1520 Prop-content-length: 387 Content-length: 387 K 7 svn:log V 286 Add a configurable option to make Return in Telnet send an ordinary ^M instead of the Telnet New Line code. Unix-type telnetds don't care one way or the other; RDB claims some telnetds prefer Telnet NL; and now someone has found one that can't deal with Telnet NL and prefers ^M. Sigh. K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-29T17:21:26.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 904dee28f437cad3a038d78b80c1fff7 Text-delta-base-sha1: 4292e64636aed5e1d024b73aee296bfa43bf5e4f Text-content-length: 796 Text-content-md5: da888cf80d49b9fb64a648b18d4753b7 Text-content-sha1: e546b61076cd2f422f48edca310ca0e4c7b44895 Content-length: 836 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN\K5J|\versionid $Id: config.but,v 1.23 2001/12/29 17:21:26S{config-telnetkey} \q{Return key sends telnet New Line instead of ^M} \cfg{winhelp-topic}{telnet.newline} Unlike most other remote login protocols, the Telnet protocol has a special \Q{new line} code that is not the same as the usual line endings of Control-M or Control-J. By default, PuTTY sends the Telnet New Line code when you press Return, instead of sending Control-M as it does in most other protocols. Most Unix-style Telnet servers don't mind whether they receive Telnet New Line or Control-M; some servers do expect New Line, and some servers prefer to see ^M. If you are seeing surprising behaviour when you press Return in a Telnet session, you might try turning this option off to see if it helps Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c93ca7e60e33db4b50c7bc323033ba38 Text-delta-base-sha1: 8d66f60d37ba616aa1f30a3171a516b2fd78c533 Text-content-length: 106 Text-content-md5: a1183d2a1da09e22bd0aa8b130cb87a8 Text-content-sha1: f9cacd8c020b31873bb17582e7107dea09c36f79 Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN[NK@W@E@'4 && cfg.telnet_newlineif (cfg.protocol == PROT_TELNET && cfg.telnet_newline Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 48e8b3e87655eb3e826c8dce32b1cd32 Text-delta-base-sha1: 90ebe7ffb93824107649eaaa889c7be8d12fe215 Text-content-length: 37 Text-content-md5: d658db080b828b36268e59a58d714ff2 Text-content-sha1: 6d15f31649e2d4308cb8a696e82ef341604bb3d7 Content-length: 78 K 15 cvs2svn:cvs-rev V 5 1.131 PROPS-END SVN.F hP^telnet_newline Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ca468d800a97fb3a8da1ce8625c37488 Text-delta-base-sha1: ec0d361ef1969d5d5d5526f7d7002c5d6621ea81 Text-content-length: 95 Text-content-md5: 7b9db72dc9110c198c84a06ac74241e5 Text-content-sha1: 696d299ac7d8f82fd30da671a06472811b9b3474 Content-length: 135 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNIBB9n8TelnetRet", cfg->telnet_newlineTelnetRet", 1, &cfg->telnet_newline Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0ded28fb7b793de741ff725364fad5d2 Text-delta-base-sha1: a00fb2e1dd056377afec486ff9cbced51332d46e Text-content-length: 639 Text-content-md5: bd4e81cc275d018a9d8ceedd60fb2ae5 Text-content-sha1: bd3530c0c1ac932eeb256ee6a3d96155c12c1f67 Content-length: 680 K 15 cvs2svn:cvs-rev V 5 1.170 PROPS-END SVN>^o| cpdT-LT2qY]Z"IDC_TELNETRETcase IDC_TELNETRETDlgButton(hwnd, IDC_TELNETRET, cfg.telnet_newlinecheckbox(&cp, "Return key sends telnet New Line instead of ^M", IDC_TELNETRETcheckbox(&cp, "Return key sends telnet New Line instead of ^M", IDC_TELNETRETTELNETRETtelnet_newline = IsDlgButtonChecked(hwnd, IDC_TELNETRET); break; case IDC_WRAPMODi'%DFFFFDDG E4FD4D|F=format,\n" "so we recommend you convertr key to the new.Yan per thission by loadingkeyinto PuTTYgen andn savit again."; MessageBox(NULL, m, mbtitle, MB_OK); } Revision-number: 1521 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2001-12-29T17:25:07.000000Z K 7 svn:log V 65 Oops - the help for the new Telnet NL option wasn't quite there. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: da888cf80d49b9fb64a648b18d4753b7 Text-delta-base-sha1: e546b61076cd2f422f48edca310ca0e4c7b44895 Text-content-length: 89 Text-content-md5: 6664201bcebb4cdd664e8a0423fbcc9e Text-content-sha1: ea693ef2a2ae9c5f3a87ea36728f56467852252f Content-length: 129 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN\[8Z5(!;\versionid $Id: config.but,v 1.24 2001/12/29 17:25:07nlq Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bd4e81cc275d018a9d8ceedd60fb2ae5 Text-delta-base-sha1: bd3530c0c1ac932eeb256ee6a3d96155c12c1f67 Text-content-length: 186 Text-content-md5: 6d2757bb0d2ed63361363460ad3b5c51 Text-content-sha1: 6b971b22f615c9033bb59364a8da2268cb81f609 Content-length: 227 K 15 cvs2svn:cvs-rev V 5 1.171 PROPS-END SVNg~g; return "JI(`',`telnet.specialkeys')"; case IDC_TELNETRET: return "JI(`',`telnet.newlinei*iuTTY may stop supporting this private key Revision-number: 1522 Prop-content-length: 298 Content-length: 298 K 8 svn:date V 27 2001-12-30T15:58:17.000000Z K 7 svn:log V 197 Pageant is now able to avoid asking for the passphrase when asked to load a key that is already loaded. This makes command lines such as `pageant mykey -c mycommand' almost infinitely more useful. K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9ccf7cb8fb30da12d257286f5a3c7bbc Text-delta-base-sha1: 008301a75c78c0f9595d7abcdcd42e3b0886d246 Text-content-length: 91 Text-content-md5: 020af9303f4173691aac0027af2dc92f Text-content-sha1: d11b8484d22101795ed1bf8e31be4eb471342118 Content-length: 130 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN*s GBGj@#ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cced85ac5fc59e7bc52769d42b9eb8f1 Text-delta-base-sha1: 4ffc49ead824e96aff2a2a79136fa4ea487814bd Text-content-length: 5744 Text-content-md5: 87261b88a89168b2dc3aae6ae079ae7a Text-content-sha1: 1ed6c44630f21adf7b256e2167207e3f3d0ca71e Content-length: 5784 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNb>$<.#;4;b5u0'BMu~AUassertForward references */ static void *make_keylist1(int *length); static void *make_keylist2(int *length); static void *get_keylist1(void); static void *get_keylist2/* * See if the key is already loaded (in the primary Pageant, * which may or may not be us). */ { void *blob; unsigned char *keylist, *p; int i, nkeys, bloblen; if (ver == 1) { if (!rsakey_pubblob(filename, &blob, &bloblen)) { MessageBox(NULL, "Couldn't load private key.", APPNAME, MB_OK | MB_ICONERROR); return; } keylist = get_keylist1(); } else { unsigned char *blob2; blob = ssh2_userkey_loadpub(filename, NULL, &bloblen); if (!blob) { MessageBox(NULL, "Couldn't load private key.", APPNAME, MB_OK | MB_ICONERROR); return; } /* For our purposes we want the blob prefixed with its length */ blob2 = smalloc(bloblen+4); PUT_32BIT(blob2, bloblen); memcpy(blob2 + 4, blob, bloblen); sfree(blob); blob = blob2; keylist = get_keylist2(); } if (keylist) { nkeys = GET_32BIT(keylist); p = keylist + 4; for (i = 0; i < nkeys; i++) { if (!memcmp(blob, p, bloblen)) { /* Key is already present; we can now leave. */ sfree(keylist); sfree(blob); return; } /* Now skip over public blob */ if (ver == 1) p += rsa_public_blob_len(p); else p += 4 + GET_32BIT(p); /* Now skip over comment field */ p += 4 + GET_32BIT(p); } sfree(keylist); } sfree(blob) sfree(request); sfree(response sfree(request); sfree(responseCreate an SSH1 key list in a malloc'ed buffer; return its * length. */ static void *make_keylist1(int *length) { int i, nkeys, len; struct RSAKey *key; unsigned char *blob, *p, *ret; int bloblen; /* * Count up the number and length of keys we hold. */ len = 4; nkeys = 0; for (i = 0; NULL != (key = index234(rsakeys, i)); i++) { nkeys++; blob = rsa_public_blob(key, &bloblen); len += bloblen; sfree(blob); len += 4 + strlen(key->comment); } /* Allocate the buffer. */ p = ret = smalloc(len); if (length) *length = len; PUT_32BIT(p, nkeys); p += 4; for (i = 0; NULL != (key = index234(rsakeys, i)); i++) { blob = rsa_public_blob(key, &bloblen); memcpy(p, blob, bloblen); p += bloblen; sfree(blob); PUT_32BIT(p, strlen(key->comment)); memcpy(p + 4, key->comment, strlen(key->comment)); p += 4 + strlen(key->comment); } assert(p - ret == len); return ret; } /* * Create an SSH2 key list in a malloc'ed buffer; return its * length. */ static void *make_keylist2(int *length) { struct ssh2_userkey *key; int i, len, nkeys; unsigned char *blob, *p, *ret; int bloblen; /* * Count up the number and length of keys we hold. */ len = 4; nkeys = 0; for (i = 0; NULL != (key = index234(ssh2keys, i)); i++) { nkeys++; len += 4; /* length field */ blob = key->alg->public_blob(key->data, &bloblen); len += bloblen; sfree(blob); len += 4 + strlen(key->comment); } /* Allocate the buffer. */ p = ret = smalloc(len); if (length) *length = len; /* * Packet header is the obvious five bytes, plus four * bytes for the key count. */ PUT_32BIT(p, nkeys); p += 4; for (i = 0; NULL != (key = index234(ssh2keys, i)); i++) { blob = key->alg->public_blob(key->data, &bloblen); PUT_32BIT(p, bloblen); p += 4; memcpy(p, blob, bloblen); p += bloblen; sfree(blob); PUT_32BIT(p, strlen(key->comment)); memcpy(p + 4, key->comment, strlen(key->comment)); p += 4 + strlen(key->comment); } assert(p - ret == len); return ret; } /* * Acquire a keylist1 from the primary Pageant; this means either * calling make_keylist1 (if that's us) or sending a message to the * primary Pageant (if it's not). */ static void *get_keylist1(void) { void *ret; if (already_running) { unsigned char request[5], *response; void *vresponse; int resplen; request[4] = SSH1_AGENTC_REQUEST_RSA_IDENTITIES; PUT_32BIT(request, 4); agent_query(request, 5, &vresponse, &resplen); response = vresponse; if (resplen < 5 || response[4] != SSH1_AGENT_RSA_IDENTITIES_ANSWER) return NULL; ret = smalloc(resplen-5); memcpy(ret, response+5, resplen-5); sfree(response); } else { ret = make_keylist1(NULL); } return ret; } /* * Acquire a keylist2 from the primary Pageant; this means either * calling make_keylist2 (if that's us) or sending a message to the * primary Pageant (if it's not). */ static void *get_keylist2(void) { void *ret; if (already_running) { unsigned char request[5], *response; void *vresponse; int resplen; request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; PUT_32BIT(request, 4); agent_query(request, 5, &vresponse, &resplen); response = vresponse; if (resplen < 5 || response[4] != SSH2_AGENT_IDENTITIES_ANSWER) return NULL; ret = smalloc(resplen-5); memcpy(ret, response+5, resplen-5); sfree(response); } else { ret = make_keylist2(NULL); } return ret;int len; void *keylist; ret[4] = SSH1_AGENT_RSA_IDENTITIES_ANSWER; keylist = make_keylist1(&len); if (len + 5 > AGENT_MAX_MSGLEN) { sfree(keylist); goto failure; } PUT_32BIT(ret, len + 1); memcpy(ret + 5, keylist, len); sfree(keylist);int len; void *keylist; ret[4] = SSH2_AGENT_IDENTITIES_ANSWER; keylist = make_keylist2(&len); if (len + 5 > AGENT_MAX_MSGLEN) { sfree(keylist); goto failure; } PUT_32BIT(ret, len + 1); memcpy(ret + 5, keylist, len); sfree(keylist); Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5c83a4e1d46c28159f4342e1bffff14d Text-delta-base-sha1: c1fbbc80c1759f05fb15ade4a4f72c6318f9d7f4 Text-content-length: 185 Text-content-md5: 5139a934811f9b3077fffe7fce740b8d Text-content-sha1: 330b9826ada6161df027dd2cc5a0df8df209cc83 Content-length: 225 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVN1^`m[JEunsigned char *rsa_public_blob(struct RSAKey *key, int *len); int rsa_public_blob_len(void *dataint rsakey_pubblob(char *filename, void **blob, int *bloblen Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 53b37499a0bc0906f8fc20770c67546c Text-delta-base-sha1: 7856da3cd448c009730170e8af490d0ec373e715 Text-content-length: 784 Text-content-md5: 6cc937f6654dd4917910790d59491969 Text-content-sha1: 4aa0005ebe726f58a4fc9de4719ade0c6e6497fb Content-length: 824 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN,t3OQOI_^l;{8L9H1{ int pub_onlif (pub_only) { ret = 1; goto end; }FALSEFALSEReturn a malloc'ed chunk of memory containing the public blob of * an RSA key, as given in the agent protocol (modulus bits, * exponent, modulus). */ int rsakey_pubblob(char *filename, void **blob, int *bloblen) { FILE *fp; unsigned char buf[64]; struct RSAKey key; int ret; /* Default return if we fail. */ *blob = NULL; *bloblen = 0; ret = 0memset(&key, 0, sizeof(key)); if (loadrsakey_main(fp, &key, TRUE, NULL, NULL)) { *blob = rsa_public_blob(&key, bloblen); freersakey(&key); ret = 1; } } fclose(fp); return ret;if (pub_blob_len) *pub_blob_len = public_blob_len; if (algorithm) Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2b6fae866d4519920d95f33c8290a363 Text-delta-base-sha1: 29d20b38fd8e82e3383589a9298b0db88b67a1ec Text-content-length: 884 Text-content-md5: c23d79d0b068be35fd4e6a0df33ddf8e Text-content-sha1: 3608311f6d9b2b5018adcd0b722651004bf51360 Content-length: 924 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNLL{Aq|Lxy2/* Public key blob as used by Pageant: exponent before modulus. */ unsigned char *rsa_public_blob(struct RSAKey *key, int *len) { int length, pos; unsigned char *ret; length = (ssh1_bignum_length(key->modulus) + ssh1_bignum_length(key->exponent) + 4); ret = smalloc(length); PUT_32BIT(ret, bignum_bitcount(key->modulus)); pos = 4; pos += ssh1_write_bignum(ret + pos, key->exponent); pos += ssh1_write_bignum(ret + pos, key->modulus); *len = length; return ret; } /* Given a public blob, determine its length. */ int rsa_public_blob_len(void *data) { unsigned char *p = (unsigned char *)data; int ret; p += 4; /* length word */ p += ssh1_read_bignum(p, NULL); /* exponent */ p += ssh1_read_bignum(p, NULL); /* modulus */ return p - (unsigned char *)data Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8d45a2bfbb59bdb61d37a826de07f1a8 Text-delta-base-sha1: 6fef24a6472c613a9d192e5b7b82dc7a0aeb4af1 Text-content-length: 37 Text-content-md5: 7da2444b1e4cc448f100362ac9ee48b1 Text-content-sha1: de86fadcb9154d5edc175db2b2e6c746debce6c8 Content-length: 77 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNo& cq;E*define GET_32 Revision-number: 1523 Prop-content-length: 363 Content-length: 363 K 8 svn:date V 27 2001-12-30T16:20:31.000000Z K 7 svn:log V 262 PuTTY can now detect when one of the Pageant keys it tries matches the private key file given in the config; if it spots this then it avoids trying it again (and in particular avoids needing to ask for the passphrase when it knows perfectly well it won't work). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8b5f72d50e08a1cd9a05c5379e5a4fc6 Text-delta-base-sha1: 4077ab0bb000bd10a05c2d40e2ad0e4d4532a5e0 Text-content-length: 1483 Text-content-md5: ea4435e0b894e79b219cdfa933fbff44 Text-content-sha1: 48e806aec047505ee927acb9e600f71e53b43ffe Content-length: 1524 K 15 cvs2svn:cvs-rev V 5 1.189 PROPS-END SVN:kH]U static void *publickey_blob; int publickey_bloblen /* Load the public half of cfg.keyfile so we notice if it's in Pageant */ if (*cfg.keyfile) { if (!rsakey_pubblob(cfg.keyfile, &publickey_blob, &publickey_bloblen)) publickey_blob = NULL; } else publickey_blob = NULLif (publickey_blob && !memcmp(p, publickey_blob, publickey_bloblen)) { logevent("This key matches configured key file"); tried_publickey = 1.o9NJA(HZ!nP# avedport, hostkey->keytype, keystr, fingerprint); if (first_kex) { /* don't bother logging this in rekeys */ logevent("Host key fingerprint is:"); logevent(fingerprint); } sfree(fingerprint); sfree(keystr); hostkey->freekey(hkey); /* * Send SSH2_MSG_NEWKEYS. */ ssh2_pkt_init(SSH2_MSG_NEWKEYS); ssh2_pkt_send(); /* * Expect SSH2_MSG_NEWKEYS from server. */ crWaitUntil(ispkt); if (pk static void *publickey_blob; static int publickey_bloblen /* Load the pub half of cfg.keyfile so we notice if it's in Pageant */ if (*cfg.keyfile) { publickey_blob = ssh2_userkey_loadpub(cfg.keyfile, NULL, &publickey_bloblen); } else publickey_blob = NULLif (publickey_blob && pklen == publickey_bloblen && !memcmp(p, publickey_blob, publickey_bloblen)) { logevent("This key matches configured key file"); tried_pubkey_config = 1; } Revision-number: 1524 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2001-12-30T16:27:07.000000Z K 7 svn:log V 211 I have no brain at all. The SSH1 auth loop was trying all Pageant keys before _every_ other authentication; so if you tried a local pubkey _and_ a password, for example, you'd also try Pageant twice. Now fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ea4435e0b894e79b219cdfa933fbff44 Text-delta-base-sha1: 48e806aec047505ee927acb9e600f71e53b43ffe Text-content-length: 186 Text-content-md5: 090da72c08e447b1640daaa6401a42a4 Text-content-sha1: 4e815be4d914502c9dfc20c417ebabf00be73b09 Content-length: 227 K 15 cvs2svn:cvs-rev V 5 1.190 PROPS-END SVN"8l=l{&g!=, tried_agenttried_agent && !tried_agenttried_agent = 1;o0AAo hostkey->fingerprint(hkey); verify_ssh_host_key(savedhost, s Revision-number: 1525 Prop-content-length: 595 Content-length: 595 K 10 svn:author V 5 simon K 8 svn:date V 27 2001-12-31T16:15:19.000000Z K 7 svn:log V 494 Create the long-awaited console.c, and move the common routines out of scp.c, psftp.c and plink.c into it. Additionally, add `batch mode', in which all the interactive prompts (bad host key, log file exists, insecure cipher, password prompt) are disabled and safe responses are assumed. (The idea being that if you run PSCP, for example, in a cron job then you'd probably rather it failed and exited instead of leaving the cron job wedged while it waits for user input that will never arrive.) PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3a58d37c9281bc1ad359fd1760986fec Text-delta-base-sha1: 5ec10f5063e842692d6e62b4b2d63394403dfa7f Text-content-length: 94 Text-content-md5: 3ef48b354a11efd736e486e7e313a470 Text-content-sha1: 968d1759b70ab0f3a34ce5ad6f53c4fd7dfc4972 Content-length: 134 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVNMp.%hp&P4n3$3L<`mscp psftp plink COBJS = consoleCCCCCC Node-path: putty/console.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 8185 Text-content-md5: 4edafc818395b566391cc096ee8796e2 Text-content-sha1: c87229c4b40569b8d1388f4d7e1333ea8444f303 Content-length: 8301 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNkkk/* * console.c: various interactive-prompt routines shared between * the console PuTTY tools */ #include #include #include #include #include "putty.h" #include "storage.h" #include "ssh.h" int console_batch_mode = FALSE; void verify_ssh_host_key(char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; HANDLE hin; DWORD savemode, i; static const char absentmsg_batch[] = "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "Connection abandoned.\n"; static const char absentmsg[] = "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, enter \"y\" to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you want to carry on connecting just once, without\n" "adding the key to the cache, enter \"n\".\n" "If you do not trust this host, press Return to abandon the\n" "connection.\n" "Store key in cache? (y/n) "; static const char wrongmsg_batch[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "Connection abandoned.\n"; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "enter \"y\" to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, enter \"n\".\n" "If you want to abandon the connection completely, press\n" "Return to cancel. Pressing Return is the ONLY guaranteed\n" "safe choice.\n" "Update cached key? (y/n, Return cancels connection) "; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; /* * Verify the key against the registry. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; if (ret == 2) { /* key was different */ if (console_batch_mode) { fprintf(stderr, wrongmsg_batch, fingerprint); exit(1); } fprintf(stderr, wrongmsg, fingerprint); fflush(stderr); } if (ret == 1) { /* key was absent */ if (console_batch_mode) { fprintf(stderr, absentmsg_batch, fingerprint); exit(1); } fprintf(stderr, absentmsg, fingerprint); fflush(stderr); } hin = GetStdHandle(STD_INPUT_HANDLE); GetConsoleMode(hin, &savemode); SetConsoleMode(hin, (savemode | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT)); ReadFile(hin, line, sizeof(line) - 1, &i, NULL); SetConsoleMode(hin, savemode); if (line[0] != '\0' && line[0] != '\r' && line[0] != '\n') { if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); } else { fprintf(stderr, abandoned); exit(0); } } /* * Ask whether the selected cipher is acceptable (since it was * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ void askcipher(char *ciphername, int cs) { HANDLE hin; DWORD savemode, i; static const char msg[] = "The first %scipher supported by the server is\n" "%s, which is below the configured warning threshold.\n" "Continue with connection? (y/n) "; static const char msg_batch[] = "The first %scipher supported by the server is\n" "%s, which is below the configured warning threshold.\n" "Connection abandoned.\n"; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; if (console_batch_mode) { fprintf(stderr, msg_batch, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); exit(1); } fprintf(stderr, msg, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); fflush(stderr); hin = GetStdHandle(STD_INPUT_HANDLE); GetConsoleMode(hin, &savemode); SetConsoleMode(hin, (savemode | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT)); ReadFile(hin, line, sizeof(line) - 1, &i, NULL); SetConsoleMode(hin, savemode); if (line[0] == 'y' || line[0] == 'Y') { return; } else { fprintf(stderr, abandoned); exit(0); } } /* * Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ int askappend(char *filename) { HANDLE hin; DWORD savemode, i; static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n" "You can overwrite it with a new session log,\n" "append your session log to the end of it,\n" "or disable session logging for this session.\n" "Enter \"y\" to wipe the file, \"n\" to append to it,\n" "or just press Return to disable logging.\n" "Wipe the log file? (y/n, Return cancels logging) "; static const char msgtemplate_batch[] = "The session log file \"%.*s\" already exists.\n" "Logging will not be enabled.\n"; char line[32]; if (console_batch_mode) { fprintf(stderr, msgtemplate_batch, FILENAME_MAX, filename); fflush(stderr); return 0; } fprintf(stderr, msgtemplate, FILENAME_MAX, filename); fflush(stderr); hin = GetStdHandle(STD_INPUT_HANDLE); GetConsoleMode(hin, &savemode); SetConsoleMode(hin, (savemode | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT)); ReadFile(hin, line, sizeof(line) - 1, &i, NULL); SetConsoleMode(hin, savemode); if (line[0] == 'y' || line[0] == 'Y') return 2; else if (line[0] == 'n' || line[0] == 'N') return 1; else return 0; } /* * Warn about the obsolescent key file format. */ void old_keyfile_warning(void) { static const char message[] = "You are loading an SSH 2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "PuTTY may stop supporting this private key format,\n" "so we recommend you convert your key to the new\n" "format.\n" "\n" "Once the key is loaded into PuTTYgen, you can perform\n" "this conversion simply by saving it again.\n"; fputs(message, stderr); } void logevent(char *string) { } char *console_password = NULL; int console_get_line(const char *prompt, char *str, int maxlen, int is_pw) { HANDLE hin, hout; DWORD savemode, newmode, i; if (is_pw && console_password) { static int tried_once = 0; if (tried_once) { return 0; } else { strncpy(str, console_password, maxlen); str[maxlen - 1] = '\0'; tried_once = 1; return 1; } } if (console_batch_mode) { if (maxlen > 0) str[0] = '\0'; } else { hin = GetStdHandle(STD_INPUT_HANDLE); hout = GetStdHandle(STD_OUTPUT_HANDLE); if (hin == INVALID_HANDLE_VALUE || hout == INVALID_HANDLE_VALUE) { fprintf(stderr, "Cannot get standard input/output handles\n"); exit(1); } GetConsoleMode(hin, &savemode); newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT; if (is_pw) newmode &= ~ENABLE_ECHO_INPUT; else newmode |= ENABLE_ECHO_INPUT; SetConsoleMode(hin, newmode); WriteFile(hout, prompt, strlen(prompt), &i, NULL); ReadFile(hin, str, maxlen - 1, &i, NULL); SetConsoleMode(hin, savemode); if ((int) i > maxlen) i = maxlen - 1; else i = i - 2; str[i] = '\0'; if (is_pw) WriteFile(hout, "\r\n", 2, &i, NULL); } return 1; } Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 123cafabf277a5e7ddc96a87079668c8 Text-delta-base-sha1: 89b73e1139b03521725417af3adb4244c3b1ffc5 Text-content-length: 672 Text-content-md5: 3fe8b092d6872da8f55f137f265626df Text-content-sha1: 83de3b166c1ef609698b494fb2dc0124cc2d0cda Content-length: 712 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN 3h! SSH authentication agent for PuTTY. Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d04efb6c0e0c71ff858514607293d29f Text-delta-base-sha1: 82bee347d4f193ff44b1944f7e03c29b837c24c4 Text-content-length: 162 Text-content-md5: c88d3fd5260a62e8d91324f937a23abf Text-content-sha1: 6d1c49aabe0f85eeab3722582cff65db673af471 Content-length: 202 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN noe/* Some systems don't define this, so I do it myself if necessary */ #ifndef RT_MANIFEST #define RT_MANIFEST 24 1 RT_MANIFEST "pageant.mft" Node-path: putty/putty.mft Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 644 Text-content-md5: 8ea12570bb4fc3fc06c11c1a4ef711ce Text-content-sha1: 7c4594810bd2c5358e4a6b1e7934dd1e8e6a96a0 Content-length: 760 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNvvv A free SSH and Telnet client. Node-path: putty/puttygen.mft Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 646 Text-content-md5: f1099eab95560f5eef7c6d72afc01165 Text-content-sha1: 24bbcc27c26c9cd9f6235d9d5178dbb249b7b9d7 Content-length: 762 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNxxx SSH key generator for PuTTY. Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 64b586804134068523a2b398b895f580 Text-delta-base-sha1: 2d1f316f63ba7b3915eac1fd544a1342577bb4a8 Text-content-length: 163 Text-content-md5: 4da4ed9f12ee9b68ee80185394e459e3 Text-content-sha1: 4b34a37b79762bec8494ee14fe67ecf92eed92ae Content-length: 203 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN5K noPe/* Some systems don't define this, so I do it myself if necessary */ #ifndef RT_MANIFEST #define RT_MANIFEST 24 1 RT_MANIFEST "puttygen.mft" Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 91456d3aa832c126b0a402745f6c26a2 Text-delta-base-sha1: 233381974de389e0abc8f0ccdc5ad68affba409c Text-content-length: 106 Text-content-md5: 8dacbdc57bdf7a4c3d421d31a414e67d Text-content-sha1: 3234429cea7fb29788ee7619b341017b96956406 Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVN@ Tn[e/* Likewise */ #ifndef RT_MANIFEST #define RT_MANIFEST 24 1 RT_MANIFEST "putty.mft" Revision-number: 1531 Prop-content-length: 223 Content-length: 223 K 7 svn:log V 122 Patch from RDB: make /DNO_MULTIMON (mentioned as a possible compile-time definition in the Makefile) actually work. D'oh. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-01-08T09:44:23.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2aef5947fea0a9499f8e4538868b6ed1 Text-delta-base-sha1: 411e170f6b7e351fa6d589d4aa0b94c949c5e8bb Text-content-length: 162 Text-content-md5: 371c1bcfc57af6f0379dc545d41cf13d Text-content-sha1: 1479cffddafe685911d4ca26ad1ec03ee37b0490 Content-length: 203 K 15 cvs2svn:cvs-rev V 5 1.190 PROPS-END SVN `S`Mndef NO_MULTIMON #if WINVER < 0x0500 #define COMPILE_MULTIMON_STUBS #include #endif}} multilen = WideCharToMult Revision-number: 1532 Prop-content-length: 296 Content-length: 296 K 8 svn:date V 27 2002-01-08T09:45:10.000000Z K 7 svn:log V 195 Patch from RDB: invent a /DMSVC4 compile-time definition which renames header files and symbols etc. Now if I could only _find_ my copy of MSVC4 we might even be able to build Win32s binaries... K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ef48b354a11efd736e486e7e313a470 Text-delta-base-sha1: 968d1759b70ab0f3a34ce5ad6f53c4fd7dfc4972 Text-content-length: 190 Text-content-md5: ae4d9b29936107e0b3045ade50e7700a Text-content-sha1: a9cb368dd67607c912bd81df0aece3db9aec8f38 Content-length: 230 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVNp &;&>2COMPAT=/DMSVC4 # - RCFL=/DMSVC4 # Makes a couple of minor changes so that PuTTY compiles using # MSVC 4. You will also need /DNO_SECURITY and /DNO_MULTIMON Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c88d3fd5260a62e8d91324f937a23abf Text-delta-base-sha1: 6d1c49aabe0f85eeab3722582cff65db673af471 Text-content-length: 86 Text-content-md5: f147768e7588719e49408d7931bda38c Text-content-sha1: b6c863eaa0aad1360a816874f14dd40f6f27e5c4 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNF BRB2efndef MSVC4 #include #else #include #endif Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4da4ed9f12ee9b68ee80185394e459e3 Text-delta-base-sha1: 4b34a37b79762bec8494ee14fe67ecf92eed92ae Text-content-length: 86 Text-content-md5: e5ca3ac2082be5be8dcddd688146ac2a Text-content-sha1: 0f932e748d309ce66df1226aac3de7182933ffb9 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNKz BRBfefndef MSVC4 #include #else #include #endif Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8dacbdc57bdf7a4c3d421d31a414e67d Text-delta-base-sha1: 3234429cea7fb29788ee7619b341017b96956406 Text-content-length: 86 Text-content-md5: dff8732cb0dc14f70859a3b26c88b6a3 Text-content-sha1: e51ff3651a635843cdcc0faff9f6287c3a60f0b8 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNL BRB8efndef MSVC4 #include #else #include #endif Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6d2757bb0d2ed63361363460ad3b5c51 Text-delta-base-sha1: 6b971b22f615c9033bb59364a8da2268cb81f609 Text-content-length: 276 Text-content-md5: 639052104430bf785078996d4e17af6c Text-content-sha1: ede6daf534d7e22ad3f03fa6a17c082227ea5bd8 Content-length: 317 K 15 cvs2svn:cvs-rev V 5 1.172 PROPS-END SVN urup#ifdef MSVC4 #define TVINSERTSTRUCT TV_INSERTSTRUCT #define TVITEM TV_ITEM #define ICON_BIG 1 #endif ww\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "P Revision-number: 1533 Prop-content-length: 203 Content-length: 203 K 7 svn:log V 102 Patch from RDB: the xterm move-window sequences now don't screw up when the window is e.g. maximised. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-01-08T09:56:06.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 371c1bcfc57af6f0379dc545d41cf13d Text-delta-base-sha1: 1479cffddafe685911d4ca26ad1ec03ee37b0490 Text-content-length: 159 Text-content-md5: b4ac8a005ae694d92da7efc62435d5f8 Text-content-sha1: 0fc777979abba7e6e07bedd836e6a9d57aaddd82 Content-length: 200 K 15 cvs2svn:cvs-rev V 5 1.191 PROPS-END SVN y"y{if (cfg.resize_action == RESIZE_DISABLED || cfg.resize_action == RESIZE_FONT || IsZoomed(hwnd)) return; Revision-number: 1534 Prop-content-length: 230 Content-length: 230 K 7 svn:log V 129 Patch from RDB: the ESC[8...t resize sequence and the ESC[18t size report should both quote rows before columns, not vice versa. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-01-08T09:56:31.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 86e672b042cf2b54c8f00d17f8e6c89d Text-delta-base-sha1: efa3d624511cf88a3ee074611304b581a83cff60 Text-content-length: 81 Text-content-md5: 608c737e06be16abc8adab186b947720 Text-content-sha1: 95f5acfc647d5b634d5b230099b04a9780eb03fe Content-length: 121 K 15 cvs2svn:cvs-rev V 4 1.92 PROPS-END SVNHH0}8$ce2], cfg.width), def(esc_args[1rows, col Revision-number: 1535 Prop-content-length: 272 Content-length: 272 K 8 svn:date V 27 2002-01-08T11:57:32.000000Z K 7 svn:log V 171 Add the CRC32 compensation attack detector that all other SSH clients have had for ages and I forgot about. Of course I've got the version with the buffer overflow fixed! K 10 svn:author V 5 simon PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aadb7e90dc4e841af18b49f7e14e6c82 Text-delta-base-sha1: 9fe48ccf5f19ede6e33bd60bebbc20b083e34fbf Text-content-length: 39 Text-content-md5: 270b1f76b20f4a14a48244e3b8f16dc5 Text-content-sha1: 5f242926643936afa43313fb1ba3963657356223 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN%7 -x-, and CORE SDI S.A Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ae4d9b29936107e0b3045ade50e7700a Text-delta-base-sha1: a9cb368dd67607c912bd81df0aece3db9aec8f38 Text-content-length: 188 Text-content-md5: 5fdca3e2e28fd4edcb62e497822ba5d4 Text-content-sha1: acc09de8d5276c7379caa2a2de98f608da4f1baf Content-length: 228 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVN/ $$y&crcda.$(OBJ) OBJS3 = sshpubk.$(OBJ) ssh.$(OBJ) pageantc.$(OBJ) sshzlib.$(OBJ) sshdss.$(OBJ) OBJS4 = x11fwd.$(OBJ) portfwd.$(OBJ) sshaes.$(OBJ) sshsh512.$(OBJ) sshbn Node-path: putty/doc/licence.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8c12cc65fd8ee89c5a85c8feb64a183e Text-delta-base-sha1: 832fadefa902fb581faaf2cc3040cb70e5062f3d Text-content-length: 92 Text-content-md5: 4d9c979a1632b2ca253bf7c52968d2e0 Text-content-sha1: 0568daeb87f98c53912671f2ca962425f009edd0 Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN FW4x \versionid $Id: licence.but,v 1.2 2002/01/08 11:57:3, and CORE SDI S.A Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f147768e7588719e49408d7931bda38c Text-delta-base-sha1: b6c863eaa0aad1360a816874f14dd40f6f27e5c4 Text-content-length: 39 Text-content-md5: faed8c5faafe1a0e17c8c47403840210 Text-content-sha1: 5684aa54fa03ff8af68935dddad6957024c6450c Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNFX ~H~, and CORE SDI S.A Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e5ca3ac2082be5be8dcddd688146ac2a Text-delta-base-sha1: 0f932e748d309ce66df1226aac3de7182933ffb9 Text-content-length: 39 Text-content-md5: a8a87e70d48baa43f23af64abb1d0e97 Text-content-sha1: bcc4440968a4fdf2d1c195a9dca0e7627956ab65 Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNz 1I1, and CORE SDI S.A Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 090da72c08e447b1640daaa6401a42a4 Text-delta-base-sha1: 4e815be4d914502c9dfc20c417ebabf00be73b09 Text-content-length: 344 Text-content-md5: 4b30f765876ac3c4a68a8a34810590c4 Text-content-sha1: e1ed729eb08442d836f2dc1024340410b4784b34 Content-length: 385 K 15 cvs2svn:cvs-rev V 5 1.191 PROPS-END SVNF2/ && detect_attack(pktin.data, st->biglen, NULL)) { bombout(("Network attack (CRC compensation) detected!")); crReturn(0)0O0 remote host: verify host key. (We've already * checked the signature of the exchange hash.) */ keystr = hostkey->fmtkey(hkey); fingerprint = Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5139a934811f9b3077fffe7fce740b8d Text-delta-base-sha1: 330b9826ada6161df027dd2cc5a0df8df209cc83 Text-content-length: 215 Text-content-md5: 942370a0158fef14b4eba15672a9c672 Text-content-sha1: 889bc839a0b6e8fadd27596b2a2f045971c5f8bd Content-length: 255 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVN1s ?R?bOunsigned long crc32_update(unsigned long crc_input, const void *s, size_t len); /* SSH CRC compensation attack detector */ int detect_attack(unsigned char *buf, uint32 len, unsigned char *IV Node-path: putty/sshcrc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 626ffead7767ace62c03a035eaa4f417 Text-delta-base-sha1: 97c4221d50df4290ee31423fa7c76132cdd9d346 Text-content-length: 178 Text-content-md5: eee7ecb9dac69e2bfbd13bc8decc4edf Text-content-sha1: 60fb6ea4490b823ab80526e454c3250142a31c7a Content-length: 217 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN4 Y[]_update(unsigned long crcword, const void *buf, size_t len) { unsigned long crc32(const void *buf, size_t len) { return crc32_update(0L, buf, len); } Node-path: putty/sshcrcda.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4560 Text-content-md5: cb2117806242305338c896bb7dc85b29 Text-content-sha1: a4c4bb63db7bf3741f1c8baac4071c34b5ff8c8e Content-length: 4676 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNBBB/* $OpenBSD: deattack.c,v 1.14 2001/06/23 15:12:18 itojun Exp $ */ /* * Cryptographic attack detector for ssh - source code * * Copyright (c) 1998 CORE SDI S.A., Buenos Aires, Argentina. * * All rights reserved. Redistribution and use in source and binary * forms, with or without modification, are permitted provided that * this copyright notice is retained. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES ARE DISCLAIMED. IN NO EVENT SHALL CORE SDI S.A. BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR * CONSEQUENTIAL DAMAGES RESULTING FROM THE USE OR MISUSE OF THIS * SOFTWARE. * * Ariel Futoransky * * * Modified for use in PuTTY by Simon Tatham */ #include #include "misc.h" #include "ssh.h" typedef unsigned char uchar; typedef unsigned short uint16; /* SSH Constants */ #define SSH_MAXBLOCKS (32 * 1024) #define SSH_BLOCKSIZE (8) /* Hashing constants */ #define HASH_MINSIZE (8 * 1024) #define HASH_ENTRYSIZE (sizeof(uint16)) #define HASH_FACTOR(x) ((x)*3/2) #define HASH_UNUSEDCHAR (0xff) #define HASH_UNUSED (0xffff) #define HASH_IV (0xfffe) #define HASH_MINBLOCKS (7*SSH_BLOCKSIZE) #define GET_32BIT_MSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) /* Hash function (Input keys are cipher results) */ #define HASH(x) GET_32BIT_MSB_FIRST(x) #define CMP(a, b) (memcmp(a, b, SSH_BLOCKSIZE)) uchar ONE[4] = { 1, 0, 0, 0 }; uchar ZERO[4] = { 0, 0, 0, 0 }; static void crc_update(uint32 *a, void *b) { *a = crc32_update(*a, b, 4); } /* detect if a block is used in a particular pattern */ static int check_crc(uchar *S, uchar *buf, uint32 len, uchar *IV) { uint32 crc; uchar *c; crc = 0; if (IV && !CMP(S, IV)) { crc_update(&crc, ONE); crc_update(&crc, ZERO); } for (c = buf; c < buf + len; c += SSH_BLOCKSIZE) { if (!CMP(S, c)) { crc_update(&crc, ONE); crc_update(&crc, ZERO); } else { crc_update(&crc, ZERO); crc_update(&crc, ZERO); } } return (crc == 0); } /* Detect a crc32 compensation attack on a packet */ int detect_attack(uchar *buf, uint32 len, uchar *IV) { static uint16 *h = (uint16 *) NULL; static uint32 n = HASH_MINSIZE / HASH_ENTRYSIZE; register uint32 i, j; uint32 l; register uchar *c; uchar *d; assert(!(len > (SSH_MAXBLOCKS * SSH_BLOCKSIZE) || len % SSH_BLOCKSIZE != 0)); for (l = n; l < HASH_FACTOR(len / SSH_BLOCKSIZE); l = l << 2) ; if (h == NULL) { logevent("Installing CRC compensation attack detector"); n = l; h = (uint16 *) smalloc(n * HASH_ENTRYSIZE); } else { if (l > n) { n = l; h = (uint16 *) srealloc(h, n * HASH_ENTRYSIZE); } } if (len <= HASH_MINBLOCKS) { for (c = buf; c < buf + len; c += SSH_BLOCKSIZE) { if (IV && (!CMP(c, IV))) { if ((check_crc(c, buf, len, IV))) return 1; /* attack detected */ else break; } for (d = buf; d < c; d += SSH_BLOCKSIZE) { if (!CMP(c, d)) { if ((check_crc(c, buf, len, IV))) return 1; /* attack detected */ else break; } } } return 0; /* ok */ } memset(h, HASH_UNUSEDCHAR, n * HASH_ENTRYSIZE); if (IV) h[HASH(IV) & (n - 1)] = HASH_IV; for (c = buf, j = 0; c < (buf + len); c += SSH_BLOCKSIZE, j++) { for (i = HASH(c) & (n - 1); h[i] != HASH_UNUSED; i = (i + 1) & (n - 1)) { if (h[i] == HASH_IV) { if (!CMP(c, IV)) { if (check_crc(c, buf, len, IV)) return 1; /* attack detected */ else break; } } else if (!CMP(c, buf + h[i] * SSH_BLOCKSIZE)) { if (check_crc(c, buf, len, IV)) return 1; /* attack detected */ else break; } } h[i] = j; } return 0; /* ok */ } Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dff8732cb0dc14f70859a3b26c88b6a3 Text-delta-base-sha1: e51ff3651a635843cdcc0faff9f6287c3a60f0b8 Text-content-length: 39 Text-content-md5: e8c064b59bfea46374ebad31bc57e7ee Text-content-sha1: b371ba3e78f0feac2947a038743259984f362e4a Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVNL^ F, and CORE SDI S.A Revision-number: 1536 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:18.605600Z PROPS-END Revision-number: 1537 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:18.612488Z PROPS-END Revision-number: 1538 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:18.620191Z PROPS-END Revision-number: 1539 Prop-content-length: 331 Content-length: 331 K 8 svn:date V 27 2002-01-10T13:06:26.000000Z K 7 svn:log V 230 Plink's front-end select loop was failing to send error messages to winnet.c. The result was that complete failures to make an SSH connection (connection refused, for example) were causing a hang instead of a proper error report. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 02dbbbcc088794249faea00188834e77 Text-delta-base-sha1: 8daae1e6862839ca8b1c4f3b10e6a6254ed47322 Text-content-length: 950 Text-content-md5: ae05e7ee60dedfe404c4e6a36a7c5a9b Text-content-sha1: 4d636eb131fda6a9100fa2373edf927b47db1463 Content-length: 990 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVN\]# < static const struct { int bit, mask; } eventtypes[] = { {FD_CONNECT_BIT, FD_CONNECT}, {FD_READ_BIT, FD_READ}, {FD_CLOSE_BIT, FD_CLOSE}, {FD_OOB_BIT, FD_OOB}, {FD_WRITE_BIT, FD_WRITE}, {FD_ACCEPT_BIT, FD_ACCEPT}, }; int e; noise_ultralight(socket); noise_ultralight(things.lNetworkEvents); for (e = 0; e < lenof(eventtypes); e++) if (things.lNetworkEvents & eventtypes[e].mask) { LPARAM lp; int err = things.iErrorCode[eventtypes[e].bit]; lp = WSAMAKESELECTREPLY(eventtypes[e].mask, err); connopen &= select_result(wp, lp); } Revision-number: 1540 Prop-content-length: 273 Content-length: 273 K 8 svn:date V 27 2002-01-10T13:29:43.000000Z K 7 svn:log V 172 Extra safety feature to avoid sending SSH2_MSG_WINDOW_ADJUST on a nonexistent channel. I don't quite know why this was happening, but whatever it was this ought to fix it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4b30f765876ac3c4a68a8a34810590c4 Text-delta-base-sha1: e1ed729eb08442d836f2dc1024340410b4784b34 Text-content-length: 262 Text-content-md5: 52c03e4dccc64be8307d45f8f0d7db81 Text-content-sha1: df1075ba835c312b6ecd70fc540b6a1b1c0806e4 Content-length: 303 K 15 cvs2svn:cvs-rev V 5 1.192 PROPS-END SVNO/ [d[p_/* * Never send WINDOW_ADJUST for a channel that the remote side * already thinks it's closed; there's no point, since it won't * be sending any more data anyway. */ if (c->closes != 0) return; Revision-number: 1541 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:18.833856Z PROPS-END Revision-number: 1542 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 54 Support SSH2_MSG_GLOBAL_REQUEST (just return failure) K 10 svn:author V 5 simon K 8 svn:date V 27 2002-01-10T16:42:17.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 52c03e4dccc64be8307d45f8f0d7db81 Text-delta-base-sha1: df1075ba835c312b6ecd70fc540b6a1b1c0806e4 Text-content-length: 570 Text-content-md5: fa28d570b8a09629563ef747604d38a8 Text-content-sha1: df81f42175ce10b21b810b6e9f7eefdf62fc2231 Content-length: 611 K 15 cvs2svn:cvs-rev V 5 1.193 PROPS-END SVN/iKdGLOBAL_REQUEST) { char *type; int typelen, want_reply; ssh2_pkt_getstring(&type, &typelen); want_reply = ssh2_pkt_getbool(); /* * We currently don't support any global requests * at all, so we either ignore the request or * respond with REQUEST_FAILURE, depending on * want_reply. */ if (want_reply) { ssh2_pkt_init(SSH2_MSG_REQUEST_FAILURE); ssh2_pkt_send(); Revision-number: 1543 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2002-01-10T19:50:07.000000Z K 7 svn:log V 146 Flush the log file after logging each packet (so that if we're going to crash, we get an up-to-the-minute log of what happened just before then). K 10 svn:author V 5 simon PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1c0896449ce29686e493eea23fc4117d Text-delta-base-sha1: 783ac3993cba327aa2efbc4a9b15f43545a4ce4e Text-content-length: 35 Text-content-md5: 30e5f9dbcd07c4c5ade1eb911f5e91fe Text-content-sha1: ac23eab42d01593257cbcebfe3fa787831239ca5 Content-length: 74 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNIX E fflush(lgfp); Revision-number: 1544 Prop-content-length: 245 Content-length: 245 K 8 svn:date V 27 2002-01-10T19:50:53.000000Z K 7 svn:log V 144 Add support for sending SSH2_MSG_UNIMPLEMENTED for unrecognised messages; also do something with the debugging messages sent as SSH2_MSG_DEBUG. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fa28d570b8a09629563ef747604d38a8 Text-delta-base-sha1: df81f42175ce10b21b810b6e9f7eefdf62fc2231 Text-content-length: 7459 Text-content-md5: 90e8b947e1f89091a2f39c27d3e8b882 Text-content-sha1: 352d83ba67d1c9e486c4d840ad25d8a259e2747f Content-length: 7500 K 15 cvs2svn:cvs-rev V 5 1.194 PROPS-END SVN&[kmgP) ! #,Tstatic void ssh2_pkt_init(int pkt_type); static void ssh2_pkt_addbool(unsigned char value); static void ssh2_pkt_adduint32(unsigned long value); static void ssh2_pkt_addstring_start(void); static void ssh2_pkt_addstring_str(char *data); static void ssh2_pkt_addstring_data(char *data, int len); static void ssh2_pkt_addstring(char *data); static char *ssh2_mpint_fmt(Bignum b, int *len); static void ssh2_pkt_addmp(Bignum b); static int ssh2_pkt_construct(void); static void ssh2_pkt_send(voidinglen = GET_32BIT(pktin.body); if (stringinglen = GET_32BIT(pktin.body); strcpy(buf, "Remote: "); if (stringlen > 70) stringlen = 70; memcpy(buf + 8, pktin.body + 4, stringlen); buf[8 + stringswitch (pktin.type) { /* * These packets we must handle instantly. */ case SSH2_MSG_DISCONNECT: { /* log reason code in disconnect message */ char buf[256]; int reason = GET_32BIT(pktin.data + 6); unsigned msglen = GET_32BIT(pktin.data + 10); unsigned nowlen; if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) { sprintf(buf, "Received disconnect message (%s)", ssh2_disconnect_reasons[reason]); } else { sprintf(buf, "Received disconnect message (unknown type %d)", reason); } logevent(buf); strcpy(buf, "Disconnection message text: "); nowlen = strlen(buf); if (msglen > sizeof(buf) - nowlen - 1) msglen = sizeof(buf) - nowlen - 1; memcpy(buf + nowlen, pktin.data + 14, msglen); buf[nowlen + msglen] = '\0'; logevent(buf); bombout(("Server sent disconnect message\ntype %d (%s):\n\"%s\"", reason, (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) ? ssh2_disconnect_reasons[reason] : "unknown", buf+nowlen)); crReturn(0); } break; case SSH2_MSG_IGNORE: goto next_packet; case SSH2_MSG_DEBUG: { /* log the debug message */ char buf[512]; /* int display = pktin.body[6]; */ int stringlen = GET_32BIT(pktin.data+7); int prefix; strcpy(buf, "Remote debug message: "); prefix = strlen(buf); if (stringlen > sizeof(buf)-prefix-1) stringlen = sizeof(buf)-prefix-1; memcpy(buf + prefix, pktin.data + 11, stringlen); buf[prefix + stringlen] = '\0'; logevent(buf); } goto next_packet; /* FIXME: print the debug message */ /* * These packets we need do nothing about here. */ case SSH2_MSG_UNIMPLEMENTED: case SSH2_MSG_SERVICE_REQUEST: case SSH2_MSG_SERVICE_ACCEPT: case SSH2_MSG_KEXINIT: case SSH2_MSG_NEWKEYS: case SSH2_MSG_KEXDH_INIT: case SSH2_MSG_KEXDH_REPLY: /* case SSH2_MSG_KEX_DH_GEX_REQUEST: duplicate case value */ /* case SSH2_MSG_KEX_DH_GEX_GROUP: duplicate case value */ case SSH2_MSG_KEX_DH_GEX_INIT: case SSH2_MSG_KEX_DH_GEX_REPLY: case SSH2_MSG_USERAUTH_REQUEST: case SSH2_MSG_USERAUTH_FAILURE: case SSH2_MSG_USERAUTH_SUCCESS: case SSH2_MSG_USERAUTH_BANNER: case SSH2_MSG_USERAUTH_PK_OK: /* case SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: duplicate case value */ /* case SSH2_MSG_USERAUTH_INFO_REQUEST: duplicate case value */ case SSH2_MSG_USERAUTH_INFO_RESPONSE: case SSH2_MSG_GLOBAL_REQUEST: case SSH2_MSG_REQUEST_SUCCESS: case SSH2_MSG_REQUEST_FAILURE: case SSH2_MSG_CHANNEL_OPEN: case SSH2_MSG_CHANNEL_OPEN_CONFIRMATION: case SSH2_MSG_CHANNEL_OPEN_FAILURE: case SSH2_MSG_CHANNEL_WINDOW_ADJUST: case SSH2_MSG_CHANNEL_DATA: case SSH2_MSG_CHANNEL_EXTENDED_DATA: case SSH2_MSG_CHANNEL_EOF: case SSH2_MSG_CHANNEL_CLOSE: case SSH2_MSG_CHANNEL_REQUEST: case SSH2_MSG_CHANNEL_SUCCESS: case SSH2_MSG_CHANNEL_FAILURE: break; /* * For anything else we send SSH2_MSG_UNIMPLEMENTED. */ default: ssh2_pkt_init(SSH2_MSG_UNIMPLEMENTED); ssh2_pkt_adduint32(st->incoming_sequence - 1); ssh2_pkt_send(); breakiiifor (i = 0; i < lenof(compressions) + 1; i++) { const struct ssh_compress *c = i == 0 ? preferred_comp : compressions[i - 1]; if (in_commasep_string(c->name, str, len)) { cscomp_tobe = c; break; } } ssh2_pkt_getstring(&str, &len); /* server->client compression */ for (i = 0; i < lenof(compressions) + 1; i++) { const struct ssh_compress *c = i == 0 ? preferred_comp : compressions[i - 1]; if (in_commasep_string(c->name, str, len)) { sccomp_tobe = c; break; } } /* * Work out the number of bits of key we will need from the key * exchange. We start with the maximum key length of either * cipher... */ { int csbits, scbits; csbits = cscipher_tobe->keylen; scbits = sccipher_tobe->keylen; nbits = (csbits > scbits ? csbits : scbits); } /* The keys only have 160-bit entropy, since they're based on * a SHA-1 hash. So cap the key size at 160 bits. */ if (nbits > 160) nbits = 160; /* * If we're doing Diffie-Hellman group exchange, start by * requesting a group. */ if (kex == &ssh_diffiehellman_gex) { logevent("Doing Diffie-Hellman group exchange"); ssh_pkt_ctx |= SSH2_PKTCTX_DHGEX; /* * Work out how big a DH group we will need to allow that * much data. */ pbits = 512 << ((nbits - 1) / 64); ssh2_pkt_init(SSH2_MSG_KEX_DH_GEX_REQUEST); ssh2_pkt_adduint32(pbits); ssh2_pkt_send(); crWaitUntil(ispkt); if (pktin.type != SSH2_MSG_KEX_DH_GEX_GROUP) { bombout(("expected key exchange group packet from server")); crReturn(0); } p = ssh2_pkt_getmp(); g = ssh2_pkt_getmp(); dh_setup_group(p, g); kex_init_value = SSH2_MSG_KEX_DH_GEX_INIT; kex_reply_value = SSH2_MSG_KEX_DH_GEX_REPLY; } else { ssh_pkt_ctx |= SSH2_PKTCTX_DHGROUP1; dh_setup_group1(); kex_init_value = SSH2_MSG_KEXDH_INIT; kex_reply_value = SSH2_MSG_KEXDH_REPLY; } logevent("Doing Diffie-Hellman key exchange"); /* * Now generate and send e for Diffie-Hellman. */ e = dh_create_e(nbits * 2); ssh2_pkt_init(kex_init_value); ssh2_pkt_addmp(e); ssh2_pkt_send(); crWaitUntil(ispkt); if (pktin.type != kex_reply_value) { bombout(("expected key exchange reply packet from server")); crReturn(0); } ssh2_pkt_getstring(&hostkeydata, &hostkeylen); f = ssh2_pkt_getmp(); ssh2_pkt_getstring(&sigdata, &siglen); K = dh_find_K(f); sha_string(&exhash, hostkeydata, hostkeylen); if (kex == &ssh_diffiehellman_gex) { sha_uint32(&exhash, pbits); sha_mpint(&exhash, p); sha_mpint(&exhash, g); } sha_mpint(&exhash, e); sha_mpint(&exhash, f); sha_mpint(&exhash, K); SHA_Final(&exhash, exchange_hash); dh_cleanup(); #if 0 debug(("Exchange hash is:\n")); dmemdump(exchange_hash, 20); #endif hkey = hostkey->newkey(hostkeydata, hostkeylen); if (!hkey || !hostkey->verifysig(hkey, sigdata, siglen, exchange_hash, 20)) { bombout(("Server's host key did not match the signature supplied")); crReturn(0); } /* * Authenticate Revision-number: 1545 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:19.422940Z PROPS-END Revision-number: 1546 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2002-01-12T16:02:50.000000Z K 7 svn:log V 31 Update an accelerator comment. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 639052104430bf785078996d4e17af6c Text-delta-base-sha1: ede6daf534d7e22ad3f03fa6a17c082227ea5bd8 Text-content-length: 48 Text-content-md5: 533345bdb77a46d8d9df31fd5ed4cc4e Text-content-sha1: 18ca5b0e3773094c10b1108e12587a261ce3a143 Content-length: 89 K 15 cvs2svn:cvs-rev V 5 1.173 PROPS-END SVNk{>guw  n Revision-number: 1547 Prop-content-length: 309 Content-length: 309 K 8 svn:date V 27 2002-01-14T12:16:58.000000Z K 7 svn:log V 208 Update the FAQ to reflect 0.52 as being a current release rather than a future prospect. I'm going to move the beta-0-52 tag on this file, but that won't affect release binaries that have already been built. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fb47a66c99a188db92c784f9b24b4eff Text-delta-base-sha1: 580b36383f01d254ae63bdba4e262b7c09785eed Text-content-length: 1395 Text-content-md5: 5dd1a045ff16465ad36e1af679b87f71 Text-content-sha1: e33a313151f5bd2a88d37f05be516c41e05fdbbe Content-length: 1435 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNfVB#s2hF_aZ?"(pk%&> || message == WM_MOUSEWHEEL2n = alen = 0; } else { Revision-number: 1550 Prop-content-length: 220 Content-length: 220 K 7 svn:log V 119 Various accelerator clashes (due to the addition of the global Help button, which accel.pl wasn't prepared for) fixed. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-01-17T13:47:29.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 533345bdb77a46d8d9df31fd5ed4cc4e Text-delta-base-sha1: 18ca5b0e3773094c10b1108e12587a261ce3a143 Text-content-length: 546 Text-content-md5: aa455d038c8374db7be1bc03f4f93674 Text-content-sha1: dbc0a1b8558a4dcad4ca5f343e39b83458e9e079 Content-length: 587 K 15 cvs2svn:cvs-rev V 5 1.174 PROPS-END SVN{yo<{R}kJ~;J~/FWl&J~mfJ~)2MJ~enVJ~c;J~(qJ~rVxJ~cJ~}Qw>UQw>!22{> h{>J dh] nprtis elv&SSH/hack", #else "&SSSa&h] tplsfweh] wdren lts&R in every &Local ech] bdsm with] bef ruyntdHome and &hh] luvb n ti p sha&h] w4yltfh] rxbepush] df wxp est nrharact&h] blumh] tuknh] svldr bftkh] slhh] m fkiuwh] deilmrstxp&ports do t  e key which has a Revision-number: 1551 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2002-01-23T09:43:10.000000Z K 7 svn:log V 52 Add `can PSCP and PSFTP do ASCII mode?' to the FAQ. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5dd1a045ff16465ad36e1af679b87f71 Text-delta-base-sha1: e33a313151f5bd2a88d37f05be516c41e05fdbbe Text-content-length: 1298 Text-content-md5: dba19d6aef8259fd4d4a6928060ec117 Text-content-sha1: ca6978000bad6c3aefd0b04967592bfda3411f58 Content-length: 1338 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNVmw2F\%u_w\versionid $Id: faq.but,v 1.19 2002/01/23 09:43:10S{faq-pscp-ascii}{Question} Can PSCP or PSFTP transfer files in ASCII mode? Unfortunately not. This is a limitation of the file transfer protocols: the SCP and SFTP protocols have no notion of transferring a file in anything other than binary mode. SFTP is designed to be extensible, so it's possible that an extension might be proposed at some later date that implements ASCII transfer. But the PuTTY team can't do anything about it until that happenspscp-protocol}{Question} Why do I see \q{Fatal: Protocol error: Expected control record} in PSCP? This happens because PSCP was expecting to see data from the server that was part of the PSCP protocol exchange, and instead it saw data that it couldn't make any sense of at all. This almost always happens because the startup scripts in your account on the server machine are generating output. This is impossible for PSCP, or any other SCP client, to work around. You should never use startup files (\c{.bashrc}, \c{.cshrc} and so on) which generate output in non-interactive sessions. This is not actually a PuTTY problem. If PSCP fails in this way, then all other SCP clients are likely to fail in exactly the same way. The problem is at the server end Revision-number: 1552 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:20.425607Z PROPS-END Revision-number: 1553 Prop-content-length: 231 Content-length: 231 K 8 svn:date V 27 2002-02-04T13:18:54.000000Z K 7 svn:log V 130 Make the section on terminal answerback mention that this is _not_ the same thing as sending the terminal type in the proper way. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6664201bcebb4cdd664e8a0423fbcc9e Text-delta-base-sha1: ea693ef2a2ae9c5f3a87ea36728f56467852252f Text-content-length: 301 Text-content-md5: 6f636b95440045164f1c28041831c174 Text-content-sha1: c3791b182e89e23a251220aa3bba70c1072a27f2 Content-length: 341 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN[;z5\0+\versionid $Id: config.but,v 1.25 2002/02/04 13:18:54Note that this is \e{not} the feature of PuTTY which the server will typically use to determine your terminal type. That feature is the \q{Terminal-type string} in the Connection panel; see \k{config-termtype} for detail Revision-number: 1554 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 -pw in Plink doesn't work in Telnet. Mention this. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-02-04T13:29:04.000000Z PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3fe8b092d6872da8f55f137f265626df Text-delta-base-sha1: 83de3b166c1ef609698b494fb2dc0124cc2d0cda Text-content-length: 271 Text-content-md5: 1e634196b7dd496df7fea5322217e1b4 Text-content-sha1: 6dd313c91bbd1734db00d47d57ece7a88a78e896 Content-length: 311 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNG v}4BT.\versionid $Id: plink.but,v 1.14 2002/02/04 13:29:04Note that the \c{-pw} option only works when you are using the SSH protocol. Due to fundamental limitations of Telnet and Rlogin, these protocols do not support automated password authentication Revision-number: 1555 Prop-content-length: 284 Content-length: 284 K 8 svn:date V 27 2002-02-04T13:52:05.000000Z K 7 svn:log V 183 Add a general `what ports exist?' question to the FAQ, so that the next person who asks us whether we have a port for ${random_palmtop} can be treated with the contempt they deserve. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dba19d6aef8259fd4d4a6928060ec117 Text-delta-base-sha1: ca6978000bad6c3aefd0b04967592bfda3411f58 Text-content-length: 602 Text-content-md5: 79c474ce6c37d608ee8ecdbde794ca22 Text-content-sha1: aa1ca78e1160ab8e04ffe09b484f3bd856076dc1 Content-length: 642 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN5>"2 UJ\versionid $Id: faq.but,v 1.20 2002/02/04 13:52:05ports-general}{Question} What ports of PuTTY exist? Currently, PuTTY only runs on full Win32 systems. This includes Windows 95, 98, and ME, and it includes Windows NT, Windows 2000 and Windows XP. It does \e{not} include Windows CE (see \k{faq-wince}), and it does not quite include the Win32s environment under Windows 3.1 (see \k{faq-win31}). We do not have ports for any other systems at the present time. If anyone told you we had a Unix port, or an iPaq port, or any other port of PuTTY, they were mistaken. We don't Revision-number: 1556 Prop-content-length: 266 Content-length: 266 K 8 svn:date V 27 2002-02-12T11:07:07.000000Z K 7 svn:log V 165 Modify the donations bit in the FAQ. (We now don't need a copy of Win2k since we already have two, but XP might be nice; also added PayPal to the donation methods.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79c474ce6c37d608ee8ecdbde794ca22 Text-delta-base-sha1: aa1ca78e1160ab8e04ffe09b484f3bd856076dc1 Text-content-length: 240 Text-content-md5: c8650b3a9f55c2637e726d647e5e7fb0 Text-content-sha1: 615b166590c515a206b6cc97960521aba7e44204 Content-length: 280 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN5NLV2?mH\versionid $Id: faq.but,v 1.21 2002/02/12 11:07:07Alternatively, if e-gold isn't convenient for you, you can donate to \cw{} using PayPal (\W{http://www.paypal.com/}\cw{www.paypal.com}XP Revision-number: 1557 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:20.648779Z PROPS-END Revision-number: 1558 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 2002-02-20T22:28:11.000000Z K 7 svn:log V 161 Work around surreal use of WM_COMMAND in radio button sets. Prevents port number field resetting unnecessarily when protocol is set to Raw using the arrow keys. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: aa455d038c8374db7be1bc03f4f93674 Text-delta-base-sha1: dbc0a1b8558a4dcad4ca5f343e39b83458e9e079 Text-content-length: 1189 Text-content-md5: c099217eed9e792759af584531770f9f Text-content-sha1: 1b6b02a0fadf6ce19bba65b741a954543a758451 Content-length: 1230 K 15 cvs2svn:cvs-rev V 5 1.175 PROPS-END SVN H +k/* * When switching using the arrow keys, we * appear to get two of these messages, both * mentioning the target button in * LOWORD(wParam), but one of them called while * the previous button is still checked. This * causes an unnecessary reset of the port * number field, which we fix by ensuring here * that the button selected is indeed the one * checked. */ if (IsDlgButtonChecked(hwnd, LOWORD(wParam)) && ((cfg.protocol == PROT_SSH && cfg.port != 22) || (cfg.protocol == PROT_TELNET && cfg.port != 23) || (cfg.protocol == PROT_RLOGIN && cfg.port != 513)jj= LGXF_OVR) ? 2 : 1); } sprintf(message, msgtemplate, FILENAME_MAX, filename); mbret = MessageBox(NULL, message, mbtitle, MB_ICONQUESTION | MB_YESNOCANCEL); if (mbret == IDYES) return 2; else if (mbret == IDNO) return 1; else return 0; } /* * Warn about the obsolescent key file format. */ void old_keyfile_warning(void) { static const char mbtitle[] = "PuTTY Key File Warning"; static const char message[] = "You are loading an SSH 2 privat Revision-number: 1559 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 It's 2002. Update copyright statements :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2002-02-24T15:17:10.000000Z PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 721406125f20599315bfd8fd427d4133 Text-delta-base-sha1: 991adbd91deab21e5f3e35a45216661213098913 Text-content-length: 87 Text-content-md5: 515691441b6e1db70e19d9bf1bb5c2c7 Text-content-sha1: d7e50e2e6eaf774870ca4f1ad01d8e156612b841 Content-length: 126 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN AIc-2002 Simon Tatham. All rights 6 2002/02/24 15:17:10 simon Exp $ Node-path: putty/doc/licence.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4d9c979a1632b2ca253bf7c52968d2e0 Text-delta-base-sha1: 0568daeb87f98c53912671f2ca962425f009edd0 Text-content-length: 139 Text-content-md5: 15b52157f6b7ee6d0833e3b11bce28cd Text-content-sha1: 927c166cff9bc1825dec5fe26816fb7dd10ce5e8 Content-length: 178 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNzzz\versionid $Id: licence.but,v 1.3 2002/02/24 15:17:10 simon Exp $ \A{licence} PuTTY Licence PuTTY is copyright 1997-2002 Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: faed8c5faafe1a0e17c8c47403840210 Text-delta-base-sha1: 5684aa54fa03ff8af68935dddad6957024c6450c Text-content-length: 29 Text-content-md5: 639d5351f85ef626d89aa3cd5f857fc2 Text-content-sha1: 0d77a3cfb07b92aab25e4a4179611dd6ad75dc1f Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNXX9M:P22 Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a8a87e70d48baa43f23af64abb1d0e97 Text-delta-base-sha1: bcc4440968a4fdf2d1c195a9dca0e7627956ab65 Text-content-length: 29 Text-content-md5: 7a5ca2fafbaa7151fd8f3b815b4f7230 Text-content-sha1: de61f898956830c6e46a6df9e6532b367d1fd434 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN lMmQ;22 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e8c064b59bfea46374ebad31bc57e7ee Text-delta-base-sha1: b371ba3e78f0feac2947a038743259984f362e4a Text-content-length: 29 Text-content-md5: 7a0e15cda1ec4ff3785541d5ef84046a Text-content-sha1: 85430d7ec23ac4fb5901af7c857936d432a70a61 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN^^CKDN22 Revision-number: 1560 Prop-content-length: 254 Content-length: 254 K 7 svn:log V 153 Document the fact that character classes are a default-only configuration option (and so you must reset the terminal if you change them in mid-session). K 10 svn:author V 5 simon K 8 svn:date V 27 2002-02-24T15:25:19.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6f636b95440045164f1c28041831c174 Text-delta-base-sha1: c3791b182e89e23a251220aa3bba70c1072a27f2 Text-content-length: 156 Text-content-md5: b6ae3fe3e9c17fd26f7b0e5af24f80a8 Text-content-sha1: 9cec611f3c338b7a340843e3daf2edd7804bc68f Content-length: 196 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN;q{C5FqqBy\versionid $Id: config.but,v 1.26 2002/02/24 15:25:19Character class definitions can be modified by control sequences sent Revision-number: 1561 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:20.930829Z PROPS-END Revision-number: 1562 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:20.937530Z PROPS-END Revision-number: 1563 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:20.944105Z PROPS-END Revision-number: 1564 Prop-content-length: 184 Content-length: 184 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-02-27T22:20:03.000000Z K 7 svn:log V 84 Make sure out-of-memory errors are logged to malloc.log when we're logging mallocs. PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e22c5d56b4db42c57523acf739fbde27 Text-delta-base-sha1: edc5318bb301c28646c0280812ca033b7d3bd604 Text-content-length: 114 Text-content-md5: b7a1e51751316517b2ad4267084ed498 Text-content-sha1: 879fb1ba926a2174ac553b0c72b32b21a1ef2ebd Content-length: 154 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNuMR!E$DcQ$ fprintf(fp, "*** %s\n", str); fclose(fp fprintf(fp, "*** %s\n", str); fclose(fp Revision-number: 1565 Prop-content-length: 209 Content-length: 209 K 7 svn:log V 108 Fix silly segfault due to PSFTP thinking connection is fine even if fxp_init() fails to get initial packet. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-02-27T22:20:30.000000Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2bfc9f22cb47095bd18d697172c393fb Text-delta-base-sha1: 8519f471db23df4f0b6c3eecdc74eea839988969 Text-content-length: 119 Text-content-md5: 380af365eead4b2229a6af10af636325 Text-content-sha1: e9ce9fec773f75ebaf53ca135d6952aa4de324f1 Content-length: 159 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNI!I 2KAn Cint 1; /* failure */ return 0if (do_sftp_init()) return 1 Revision-number: 1566 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2002-02-27T22:30:57.000000Z K 7 svn:log V 54 Oops - get the forward declaration right in that hack K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 380af365eead4b2229a6af10af636325 Text-delta-base-sha1: e9ce9fec773f75ebaf53ca135d6952aa4de324f1 Text-content-length: 52 Text-content-md5: bdc129ef9b3f21105314c5119a8ed551 Text-content-sha1: bc5553fe38ab22c62f25a58e27700629dfa55cf6 Content-length: 92 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNJOP1int do_sftp_init(void); Revision-number: 1567 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2002-02-27T22:31:23.000000Z K 7 svn:log V 72 Patch to enable >512-character command lines. Thanks to Thomas Halling. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ae05e7ee60dedfe404c4e6a36a7c5a9b Text-delta-base-sha1: 4d636eb131fda6a9100fa2373edf927b47db1463 Text-content-length: 454 Text-content-md5: 33af2769f77d3a223ac9d454258fe42c Text-content-sha1: 9dd9a0f05e25b5a14b3aed0eb7600516550cc79b Content-length: 494 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVN]_ xu3*char *command; int cmdlen, cmdsize; cmdlen = cmdsize = 0; command = NULL; while (argc) { while (*p) { if (cmdlen >= cmdsize) { cmdsize = cmdlen + 512; command = srealloc(command, cmdsize); } command[cmdlen++]=*p++; }=' '; /* always add trailing space */ if (--argc) p = *++argv; } if (cmdlen) command[--cmdlen]='\0'; /* change trailing blank to NUL */ Revision-number: 1568 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2002-02-27T22:41:31.000000Z K 7 svn:log V 143 Cisco routers apparently have yet another bug: they can't handle RSA auth attempts at all without panicking and bombing out. Workaround added. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 90e8b947e1f89091a2f39c27d3e8b882 Text-delta-base-sha1: 352d83ba67d1c9e486c4d840ad25d8a259e2747f Text-content-length: 1102 Text-content-md5: cea6286e62d5c4374d26de1bbf590794 Text-content-sha1: 06d174a81ddc43821aa44daa0a78ab58c00f06d2 Content-length: 1143 K 15 cvs2svn:cvs-rev V 5 1.195 PROPS-END SVN 4!3=Ke#define BUG_CHOKES_ON_RSA 8cmp(imp, "Cisco-1.25")) { /* * These versions apparently have no clue whatever about * RSA authentication and will panic and die if they see * an AUTH_RSA message. */ ssh_remote_bugs |= BUG_CHOKES_ON_RSA; logevent("We believe remote version can't handle RSA authenticationif ((ssh_remote_bugs & BUG_CHOKES_ON_RSA)) { /* We must not attempt PK auth. Pretend we've already tried it. */ tried_publickey = tried_agent = 1; } else { tried_publickey = tried_agent = 0; }iki, str)); crReturn(0); } ssh2_pkt_getstring(&str, &len); /* client->server mac */ for (i = 0; i < nmacs; i++) { if (in_commasep_string(maclist[i]->name, str, len)) { csmac_tobe = maclist[i]; break; } } ssh2_pkt_getstring(&str, &len); /* server->client mac */ for (i = 0; i < nmacs; i++) { if (in_commasep_string(maclist[i]->name, str, len)) { scmac_tobe = maclist[i]; break; } } ssh2_pkt_getstring(&str, &len); /* client->server compression */ Revision-number: 1569 Prop-content-length: 246 Content-length: 246 K 8 svn:date V 27 2002-02-27T22:45:52.000000Z K 7 svn:log V 145 Set SSH socket variable to NULL if connect() fails. Failure to do this was causing PSCP to hang indefinitely after reporting Connection Refused. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cea6286e62d5c4374d26de1bbf590794 Text-delta-base-sha1: 06d174a81ddc43821aa44daa0a78ab58c00f06d2 Text-content-length: 94 Text-content-md5: 1bac0473964a38706153a6c74f865bcb Text-content-sha1: af46dc2971cfba2398387244954784a6e133a8d9 Content-length: 135 K 15 cvs2svn:cvs-rev V 5 1.196 PROPS-END SVN V c { s = NULL; return err; }k~ker (available: %s)" Revision-number: 1570 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2002-03-01T13:16:25.000000Z K 7 svn:log V 65 Memory leak fix: repair endemic failure to call sftp_pkt_free(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e466704c370db06a185d09e39bb7a50 Text-delta-base-sha1: 3f3db459597a9616ef9a5be2c9ee68597f5c3073 Text-content-length: 1916 Text-content-md5: fa64fef8412fda667d8abc79365fe450 Text-content-sha1: 0dd768e3ea214cfacfe59b0ef9149dcc7f26a291 Content-length: 1956 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNDA,8c5Yk|zmuOr&8QFOrbYZ``Y`Z`:a6c]\a6c]>`,C`ka8{I!Ae, [7Z sftp_pkt_free(pktin sftp_pkt_free(pktin sftp_pkt_free(pktin sftp_pkt_free(pktin sftp_pkt_free(pktin sftp_pkt_free sftp_pkt_free(pktin sftp_pkt_free(pktin sftp_pkt_free sftp_pkt_free(pktinDIR returned malformed FXP_HANDLE\n"); sftp_pkt_free(pktin sftp_pkt_free sftp_pkt_free(pktin); return; } fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin sftp_pkt_free(pktin); return 1; } else { fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin sftp_pkt_free(pktin); return 1; } else { fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin sftp_pkt_free(pktin); return -1; } memcpy(buffer, str, rlen); sftp_pkt_free(pktin); return rlen; } else { fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin sftp_pkt_free(pktin); return ret; } else { fxp_got_status(pktin); sftp_pkt_free sftp_pkt_free(pktin); return 0; } fxp_got_status(pktin); sftp_pkt_free Revision-number: 1571 Prop-content-length: 441 Content-length: 441 K 8 svn:date V 27 2002-03-01T13:17:45.000000Z K 7 svn:log V 340 from_backend() should always be called with len > 0. Only rlogin mode ever failed to do this, and only Plink actually had a problem with it, so this didn't become obvious for a while. rlogin mode is fixed, and all implementations of from_backend() now contain an assertion so that we should spot errors of this type more quickly in future. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 33af2769f77d3a223ac9d454258fe42c Text-delta-base-sha1: 9dd9a0f05e25b5a14b3aed0eb7600516550cc79b Text-content-length: 51 Text-content-md5: 3b17a896ac8061a4c584e264f98e4087 Text-content-sha1: bc50d08005b5f0b940e91c5e0b3230c8143dd9f2 Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVN_ ;n-Kassertassert(len > 0) Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bdc129ef9b3f21105314c5119a8ed551 Text-delta-base-sha1: bc5553fe38ab22c62f25a58e27700629dfa55cf6 Text-content-length: 40 Text-content-md5: 290d8fa97ddb2776ff77e0e1b58881f7 Text-content-sha1: 2da164b241db8c21a9fd5915d8b3ef24048604a7 Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN  }assert(len > 0) Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0753c43c93909baa982577f8e2a80669 Text-delta-base-sha1: 32aa8675b2eb233f30229b92d9579cbf5a701fd6 Text-content-length: 46 Text-content-md5: 4084015723d893ab0fbf962e001ae5c8 Text-content-sha1: b980454168c2190bacde5f26bf51c94021e7c09d Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN/H  # if (len > 0) Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 45f2e511a7dc4ba3d928684b17a6cc20 Text-delta-base-sha1: 8f58ac36e4d34ca6b1b02bff185d1d5e6f863940 Text-content-length: 39 Text-content-md5: ff61afd49821d2e3e549fea4094d6205 Text-content-sha1: b6c4acd4d167f73d05702d6bb8131f0cbf8b2613 Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVNRh gr`assert(len > 0) Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 608c737e06be16abc8adab186b947720 Text-delta-base-sha1: 95f5acfc647d5b634d5b230099b04a9780eb03fe Text-content-length: 42 Text-content-md5: 4704eed1c93e51c2016062e6a00995f1 Text-content-sha1: 0095e73d8d9eaf446b186d600e473e9b390fca72 Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.93 PROPS-END SVNH^ di_assert(len > 0); Revision-number: 1572 Prop-content-length: 269 Content-length: 269 K 7 svn:log V 168 The `wrapnext' flag should be saved and restored with the cursor position. Failure to do this can give wrapnext==TRUE even with the cursor not in the rightmost column. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-03-02T17:37:48.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4704eed1c93e51c2016062e6a00995f1 Text-delta-base-sha1: 0095e73d8d9eaf446b186d600e473e9b390fca72 Text-content-length: 249 Text-content-md5: dc578179f91b5aabdc7183fe76157844 Text-content-sha1: b650faac3622b4aace5b98e579bf5250e4f82d19 Content-length: 289 K 15 cvs2svn:cvs-rev V 4 1.94 PROPS-END SVN^2P_Lf+*3 R, save_wnext;wnext = wrapnextwrapnext = save_wnext; /* * wrapnext might reset to False if the x position is no * longer at the rightmost edge. */ if (wrapnext && curs.x < cols-1) wrapnext = FALSE Revision-number: 1573 Prop-content-length: 155 Content-length: 155 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-03-05T20:39:27.000000Z K 7 svn:log V 55 Add an extra example to the Plink-with-WinCVS section. PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1e634196b7dd496df7fea5322217e1b4 Text-delta-base-sha1: 6dd313c91bbd1734db00d47d57ece7a88a78e896 Text-content-length: 141 Text-content-md5: 0c6a5beac7a291427954b3326ba9dc88 Text-content-sha1: fa8b409ac885ac518b94ba9d23cb08874820c292 Content-length: 181 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNG- v4B2\versionid $Id: plink.but,v 1.15 2002/03/05 20:39:27or (if you're using a saved session): \c cvs -d :ext:user@session Revision-number: 1574 Prop-content-length: 360 Content-length: 360 K 8 svn:date V 27 2002-03-06T20:13:22.000000Z K 7 svn:log V 259 Ensure our network layer is properly cleaned up before PuTTY exits. Specifically, we explicitly closesocket() all open sockets, which appears to be necessary since otherwise Windows sends RST rather than FIN. I'm _sure_ that's a Windows bug, but there we go. K 10 svn:author V 5 simon PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4edafc818395b566391cc096ee8796e2 Text-delta-base-sha1: c87229c4b40569b8d1388f4d7e1333ea8444f303 Text-content-length: 361 Text-content-md5: 91cfaa9b1d3f13b3bdba133ea7055b60 Text-content-sha1: 2aec188ab6dea94a8c96639cf940f33de8fe2006 Content-length: 400 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNk0-}Q$_Z]pp `/* * Clean up and exit. */ void cleanup_exit(int code) { /* * Clean up. */ sk_cleanup(); WSACleanup(); if (cfg.protocol == PROT_SSH) { random_save_seed(); #ifdef MSCRYPTOAPI crypto_wrapup(); #endif } exit(code); }cleanup_cleanup_cleanup_cleanup_cleanup_cleanup_ Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b7a1e51751316517b2ad4267084ed498 Text-delta-base-sha1: 879fb1ba926a2174ac553b0c72b32b21a1ef2ebd Text-content-length: 43 Text-content-md5: 9f8e2bec04575e14341810ff9b465da2 Text-content-sha1: c4624368882302ddde3f761f522776a259d511b0 Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNM]T2TGcleanup_cleanup_ Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f3b4f50638bc2fc20e2ea285d5b76ec3 Text-delta-base-sha1: da9a07ebe27ce377a24754adf6bda1eebe40cd2f Text-content-length: 87 Text-content-md5: 066a2d41a92c4805225811e90115e63b Text-content-sha1: 6138a09f3b697e2654682b95b87704d8502bca14 Content-length: 127 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNw< AGA4Cvoid sk_cleanup(void); /* called just before program exit Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1bc08e512ab25f503de325c674eef7b9 Text-delta-base-sha1: 64c11fd0d4bbe440f42662190ee490cd160749dd Text-content-length: 114 Text-content-md5: bb61971ebc56faa04d624c5212ae89b0 Text-content-sha1: 9702b8dea319b2991010a44cfda9aa67c1761f19 Content-length: 154 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNTm \u\8if (random_active) { random_get_savedata(&data, &len); write_random_seed(data, len); } Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 87261b88a89168b2dc3aae6ae079ae7a Text-delta-base-sha1: 1ed6c44630f21adf7b256e2167207e3f3d0ca71e Text-content-length: 67 Text-content-md5: 75efc8ed58b87748bc73c6f6e0a1218b Text-content-sha1: 1c13002041cc98a4c63b4080374ebd93a95f926f Content-length: 107 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNb *WTvoid cleanup_exit(int code) { exit(code); Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b17a896ac8061a4c584e264f98e4087 Text-delta-base-sha1: bc50d08005b5f0b940e91c5e0b3230c8143dd9f2 Text-content-length: 118 Text-content-md5: 83683440494b40c374f97f2d2d151af0 Text-content-sha1: 15489cd985080e89adfd73f989de620e35ff864f Content-length: 158 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN A18=X=;W ]gwcleanup_cleanup_cleanup_cleanup_cleanup_cleanup_cleanup_ Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 290d8fa97ddb2776ff77e0e1b58881f7 Text-delta-base-sha1: 2da164b241db8c21a9fd5915d8b3ef24048604a7 Text-content-length: 108 Text-content-md5: ea4113602463b46c9202aeb46a421c20 Text-content-sha1: 79ec723dac58161a67862bafdf2ce7759e013c29 Content-length: 148 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNF/0XXKwBSZ}-l*cleanup_cleanup_cleanup_cleanup_cleanup_cleanup_ Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1b47efb6f2d3a61c13868dd295ac08c7 Text-delta-base-sha1: 29cafc65112a031bda74d0d21ad294a120f7d02c Text-content-length: 74 Text-content-md5: cdac6c384c41751c085922fa9f7908f0 Text-content-sha1: 53173c5ef3d7eca0eae265ab96a379e0a6127ef2 Content-length: 115 K 15 cvs2svn:cvs-rev V 5 1.133 PROPS-END SVN&Y-[2tvoid cleanup_exit(intextern int random_active Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7f2571073a82328acded6aeedd8193c3 Text-delta-base-sha1: 1304ee2a4e39678dcc595e6d2d2b2ed7421544f2 Text-content-length: 67 Text-content-md5: 5c669f474c463805e6009cc0f4da8e41 Text-content-sha1: 08787cab3f82fbe4b275c267c521e8c71e939e0c Content-length: 107 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN 8 *7W4void cleanup_exit(int code) { exit(code); Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ff61afd49821d2e3e549fea4094d6205 Text-delta-base-sha1: b6c4acd4d167f73d05702d6bb8131f0cbf8b2613 Text-content-length: 75 Text-content-md5: 12098b868d8dfbf8e69379e8589d0015 Text-content-sha1: 3735afdf2bfef0f65f0040c20605daab5ffd9f83 Content-length: 115 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVNh  c'^ cleanup_cleanup_cleanup_cleanup_ Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1bac0473964a38706153a6c74f865bcb Text-delta-base-sha1: af46dc2971cfba2398387244954784a6e133a8d9 Text-content-length: 129 Text-content-md5: 172b50a84747a0c40fbe814d412e9b44 Text-content-sha1: 2b8085bd64aab4120ce2f677bd485920c8c91ca3 Content-length: 170 K 15 cvs2svn:cvs-rev V 5 1.197 PROPS-END SVN2"/=}cleanup_cleanup_er (available: %s)", str)); crRet~9" Z|cleanup_cleanup_ Node-path: putty/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9a6cec468bf7561140f3e55ee7196b0f Text-delta-base-sha1: b7b13960d5b67e81e70b7048d16b735b9fce10df Text-content-length: 20 Text-content-md5: cbc5ab51c26c372a1e4ffe78bc3bde88 Text-content-sha1: aa4ca5555948e78e9ce32f4b2e5567804f517a8e Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNoh T[ Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c099217eed9e792759af584531770f9f Text-delta-base-sha1: 1b6b02a0fadf6ce19bba65b741a954543a758451 Text-content-length: 101 Text-content-md5: 8a46513328027100151199b3cd310cf3 Text-content-sha1: bf3d16d1fb219093e91488b98204fcf614b6de12 Content-length: 142 K 15 cvs2svn:cvs-rev V 5 1.176 PROPS-END SVNK/K[zUcleanup_cleanup_cleanup_ return ((cfg.logxfovr = Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6df2d958bd7f8cb161b61d8c20339d58 Text-delta-base-sha1: ac8c89a4d94c0b6880e742d3bc7fba5db27120d0 Text-content-length: 521 Text-content-md5: 4a463dd026020d9f1ea7297ada216e0c Text-content-sha1: 70924594a1020d48723efecc89282cb5e2bf6a6c Content-length: 562 K 15 cvs2svn:cvs-rev V 5 1.193 PROPS-END SVN vshzK int wsa_startedwsa_started = 1;cleanup_exit(msg.wParam); } /* * Clean up and exit. */ void cleanup_exit(int code) { /* * Clean up. */ deinit_fonts(); sfree(logpal); if (pal) DeleteObject(pal); sk_cleanup(); if (wsa_started) exit(code)2e 3+QaQ tdata[tindex+1] == '\n') { tindex++; uindex++; } if (unitab[tdata[tindex]] == udata[uindex]) { multilen = 1; before[0] = '\0'; after[0] = '\0'; blecleanup_ Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 38da59a6655054b6533dc192e8afb3cb Text-delta-base-sha1: e45e58087f6d6db44d39d37513b09ea85ba960d9 Text-content-length: 189 Text-content-md5: 42771f7eca4b0239d2bce82f3fb271f7 Text-content-sha1: 0906b654f05b5e735f3a8c76b61f8f65f8372475 Content-length: 229 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN^ ">"$:void sk_cleanup(void) { Actual_Socket s; int i; if (sktree) { for (i = 0; (s = index234(sktree, i)) != NULL; i++) { closesocket(s->s); } } Revision-number: 1575 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:22.306055Z PROPS-END Revision-number: 1576 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2002-03-06T23:04:20.000000Z K 7 svn:log V 101 Add the Features panel, allowing you to disable a bunch of the more controversial terminal features. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b6ae3fe3e9c17fd26f7b0e5af24f80a8 Text-delta-base-sha1: 9cec611f3c338b7a340843e3daf2edd7804bc68f Text-content-length: 3672 Text-content-md5: 0759d1a7dc5fc19a12762f9a6d89250a Text-content-sha1: 88d694009a29f24cd5bfd9ea5487b026e2ac792b Content-length: 3712 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNqy"( 5%z i[X:7\versionid $Id: config.but,v 1.27 2002/03/06 23:04:20. You can also disable application cursor keys mode completely, using the \q{Features} configuration panel; see \k{config-features-application}. You can also disable application keypad mode completely, using the \q{Features} configuration panel; see \k{config-features-application}features} The Features panel PuTTY's terminal emulation is very highly featured, and can do a lot of things under remote server control. Some of these features can cause problems due to buggy or strangely configured server applications. The Features configuration panel allows you to disable some of PuTTY's more advanced terminal features, in case they cause trouble. \S{config-features-application} Disabling application keypad and cursor keys \cfg{winhelp-topic}{features.application} Application keypad mode (see \k{config-appkeypad}) and application cursor keys mode (see \k{config-appcursor}) alter the behaviour of the keypad and cursor keys. Some applications enable these modes but then do not deal correctly with the modified keys. You can force these modes to be permanently disabled no matter what the server tries to do. \S{config-features-resize} Disabling remote terminal resizing \cfg{winhelp-topic}{features.resize} PuTTY has the ability to change the terminal's size and position in response to commands from the server. If you find PuTTY is doing this unexpectedly or inconveniently, you can tell PuTTY not to respond to those server commands. \S{config-features-altscreen} Disabling switching to the alternate screen \cfg{winhelp-topic}{features.altscreen} Many terminals, including PuTTY, support an \q{alternate screen}. This is the same size as the ordinary terminal screen, but separate. Typically a screen-based program such as a text editor might switch the terminal to the alternate screen before starting up. Then at the end of the run, it switches back to the primary screen, and you see the screen contents just as they were before starting the editor. Some people prefer this not to happen. If you want your editor to run in the same screen as the rest of your terminal activity, you can disable the alternate screen feature completely. \S{config-features-retitle} Disabling remote window title changing \cfg{winhelp-topic}{features.retitle} PuTTY has the ability to change the window title in response to commands from the server. If you find PuTTY is doing this unexpectedly or inconveniently, you can tell PuTTY not to respond to those server commands. \S{config-features-dbackspace} Disabling destructive backspace \cfg{winhelp-topic}{features.dbackspace} Normally, when PuTTY receives character 127 (^?) from the server, it will perform a \q{destructive backspace}: move the cursor one space left and delete the character under it. This can apparently cause problems in some applications, so PuTTY provides the ability to configure character 127 to perform a normal backspace (without deleting a character) instead. \S{config-features-charset} Disabling remote character set configuration \cfg{winhelp-topic}{features.charset} PuTTY has the ability to change its character set configuration in response to commands from the server. Some programs send these commands unexpectedly or inconveniently. In particular, BitchX (an IRC client) seems to have a habit of reconfiguring the character set to something other than the user intended. If you find that accented characters are not showing up the way you expect them to, particularly if you're running BitchX, you could try disabling the remote character set configuration commands Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cdac6c384c41751c085922fa9f7908f0 Text-delta-base-sha1: 53173c5ef3d7eca0eae265ab96a379e0a6127ef2 Text-content-length: 366 Text-content-md5: a7557116437bd4b27810fb53ef6d54cb Text-content-sha1: a0fad605911d0f7dbf26ab7fc314007f5c4f7127 Content-length: 407 K 15 cvs2svn:cvs-rev V 5 1.134 PROPS-END SVNY;N<]Xno_remote_resize; /* disable remote resizing */ int no_alt_screen; /* disable alternate screen */ int no_remote_wintitle; /* disable remote retitling */ int no_dbackspace; /* disable destructive backspace */ int no_remote_charset; /* disable remote charset configvoid term_reconfig Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7b9db72dc9110c198c84a06ac74241e5 Text-delta-base-sha1: 696d299ac7d8f82fd30da671a06472811b9b3474 Text-content-length: 644 Text-content-md5: 35a2a64aa33fa8f4a08cecbc16ccaa5c Text-content-sha1: 2ac3afcbafb0359672701c6b143188e3c6f23bd9 Content-length: 684 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVNB[b[=8:%f\NoRemoteResize", cfg->no_remote_resize); write_setting_i(sesskey, "NoAltScreen", cfg->no_alt_screen); write_setting_i(sesskey, "NoRemoteWinTitle", cfg->no_remote_wintitle); write_setting_i(sesskey, "NoDBackspace", cfg->no_dbackspace); write_setting_i(sesskey, "NoRemoteCharset", cfg->no_remote_charsetNoRemoteResize", 0, &cfg->no_remote_resize); gppi(sesskey, "NoAltScreen", 0, &cfg->no_alt_screen); gppi(sesskey, "NoRemoteWinTitle", 0, &cfg->no_remote_wintitle); gppi(sesskey, "NoDBackspace", 0, &cfg->no_dbackspace); gppi(sesskey, "NoRemoteCharset", 0, &cfg->no_remote_charset Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dc578179f91b5aabdc7183fe76157844 Text-delta-base-sha1: b650faac3622b4aace5b98e579bf5250e4f82d19 Text-content-length: 1879 Text-content-md5: 8491ac75e5c7ad6cca6db57dc795b580 Text-content-sha1: cd8314c56dfbeea57c38aaebc88e1235b268dc9d Content-length: 1919 K 15 cvs2svn:cvs-rev V 4 1.95 PROPS-END SVN2.n$odSe x@FTB!cyf\$c(!fnTT9+sdZM'Vyg=`5~!When the user reconfigures us, we need to check the forbidden- * alternate-screen config option. */ void term_reconfig(void) { if (cfg.no_alt_screen) swap_screen(0); if (cfg.no_remote_charset) { cset_attr[0] = cset_attr[1] = ATTR_ASCII; sco_acs = alt_sco_acs = 0; utf = 0; }if (!cfg.no_remote_resize) cfg.no_alt_screen ? 0 : if (!cfg.no_remote_wintitle) if (!cfg.no_remote_wintitle) if (!cfg.no_dbackspace) /* destructive bksp might be disabled */ if (!cfg.no_remote_resize) if (!cfg.no_remote_charset) cset_attr[0] = ATTR_GBCHR; break; case ANSI('B', '('): compatibility(VT100); if (!cfg.no_remote_charset) if (!cfg.no_remote_charset) if (!cfg.no_remote_charset) cset_attr[0] = ATTR_SCOACS; break; case ANSI('A', ')'): compatibility(VT100); if (!cfg.no_remote_charset) if (!cfg.no_remote_charset) cset_attr[1] = ATTR_ASCII; break; case ANSI('0', ')'): compatibility(VT100); if (!cfg.no_remote_charset) if (!cfg.no_remote_charset) if (!cfg.no_remote_charset) utf = 1; break; case ANSI('@', '%'): compatibility(OTHER); if (!cfg.no_remote_charset) if (cfg.no_remote_charset) break; sco_acs = 0; break; case 11: /* SCO acs on */ compatibility(SCOANSI); if (cfg.no_remote_charset) breakif (cfg.no_remote_charset) breakif (!cfg.no_remote_resize) if (!cfg.no_remote_resize) request_resize(def(esc_args[2], cfg.width), if (!cfg.no_remote_resize) if (!cfg.no_remote_resize) !cfg.no_remote_resize) { if (reset_132) request_resize(132, 24); else request_resize(80, 24); } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8a46513328027100151199b3cd310cf3 Text-delta-base-sha1: bf3d16d1fb219093e91488b98204fcf614b6de12 Text-content-length: 5332 Text-content-md5: 9e730d479050265a5af774f7219190eb Text-content-sha1: 7831c348557e9d60bddfade2577eb222fb520050 Content-length: 5373 K 15 cvs2svn:cvs-rev V 5 1.177 PROPS-END SVN~VTxzYc]=6g1x_QJ5A. A`AQU>uT?sU>uY:tT?P)vfeaturespanelstart, IDC_TITLE_FEATURES, IDC_BOX_FEATURES1, IDC_NOAPPLICK, IDC_NOAPPLICC, IDC_NORESIZE, IDC_NOALTSCREEN, IDC_NOWINTITLE, IDC_NODBACKSPACE, IDC_NOCHARSET, features return "JI(`',`keyboard.appkeypad')";NOAPPLICK: case IDC_NOAPPLICC: return "JI(`',`features.application')"; case IDC_NORESIZE: return "JI(`',`features.resize')"; case IDC_NOALTSCREEN: return "JI(`',`features.altscreen')"; case IDC_NOWINTITLE: return "JI(`',`features.retitle')"; case IDC_NODBACKSPACE: return "JI(`',`features.dbackspace')"; case IDC_NOCHARSET: return "JI(`',`features.charseDlgButton(hwnd, IDC_NORESIZE, cfg.no_remote_resize); CheckDlgButton(hwnd, IDC_NOALTSCREEN, cfg.no_alt_screen); CheckDlgButton(hwnd, IDC_NOWINTITLE, cfg.no_remote_wintitle); CheckDlgButton(hwnd, IDC_NODBACKSPACE, cfg.no_dbackspace); CheckDlgButton(hwnd, IDC_NOCHARSET, cfg.no_remote_charsetfeaturespanelstart) { /* The Features panel. Accelerators used: [acgoh] uksvatbrEnabling and disabling advanced terminal features ", IDC_TITLE_FEATURES); beginbox(&cp, NULL, IDC_BOX_FEATURES1); checkbox(&cp, "Disable application c&ursor keys mode", IDC_NOAPPLICC); checkbox(&cp, "Disable application &keypad mode", IDC_NOAPPLICK); checkbox(&cp, "Disable remote-controlled terminal re&sizing", IDC_NORESIZE); checkbox(&cp, "Disable switching to &alternate terminal screen", IDC_NOALTSCREEN); checkbox(&cp, "Disable remote-controlled window &title changing", IDC_NOWINTITLE); checkbox(&cp, "Disable destructive &backspace on server sending ^?", IDC_NODBACKSPACE); checkbox(&cp, "Disable remote-controlled cha&racter set configuration", IDC_NOCHARSET1, "FeaturesFeatures")) create_controls(hwnd, dlgtype, featuresNORESIZ cfg.no_remote_resize = IsDlgButtonChecked(hwnd, IDC_NORESIZE); break; case IDC_NOALTSCREEN cfg.no_alt_screen = IsDlgButtonChecked(hwnd, IDC_NOALTSCREEN); break; case IDC_NOWINTITL cfg.no_remote_wintitle = IsDlgButtonChecked(hwnd, IDC_NOWINTITLE); break; case IDC_NODBACK cfg.no_dbackspace = IsDlgButtonChecked(hwnd, IDC_NODBACKSPACE); break; case IDC_NOCHARSET cfg.no_remote_charset = IsDlgButtonChecked(hwnd, IDC_NOCHARSETaao update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, hit No.\n" "If you want to abandon the connection completely, hit\n" "Cancel. Hitting Cancel is the ONLY guaranteed safe\n" "choice.\n"; static const char mbtitle[] = "PuTTY Security Alert"; char message[160 + /* sensible fingerprint max size */ (sizeof(absentmsg) > sizeof(wrongmsg) ? sizeof(absentmsg) : sizeof(wrongmsg))]; /* * Verify the key against the registry. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; if (ret == 2) { /* key was different */ int mbret; sprintf(message, wrongmsg, fingerprint); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNOCANCEL); if (mbret == IDYES) store_host_key(host, port, keytype, keystr); if (mbret == IDCANCEL) cleanup_exit(0); } if (ret == 1) { /* key was absent */ int mbret; sprintf(message, absentmsg, fingerprint); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNOCANCEL); if (mbret == IDYES) store_host_key(host, port, keytype, keystr); if (mbret == IDCANCEL) cleanup_exit(0); } } /* * Ask whether the selected cipher is acceptable (since it was * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ void askcipher(char *ciphername, int cs) { static const char mbtitle[] = "PuTTY Security Alert"; static const char msg[] = "The first %.35scipher supported by the server\n" "is %.64s, which is below the configured\n" "warning threshold.\n" "Do you want to continue with this connection?\n"; /* guessed cipher name + type max length */ char message[100 + sizeof(msg)]; int mbret; sprintf(message, msg, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNO); if (mbret == IDYES) return; else cleanup_exit(0); } /* * Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ int askappend(char *filename) { static const char mbtitle[] = "PuTTY Log to File"; static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n" "You can overwrite it with a new session log,\n" "append your session log to the end of it,\n" "or disable session logging for this session.\n" "Hit Yes to wipe the file, No to append to it,\n" "or Cancel to disable logging."; char message[sizeof(msgtemplate) + FILENAME_MAX]; int mbret; if (cfg.logxfovr != LGXF_ASK) { Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4a463dd026020d9f1ea7297ada216e0c Text-delta-base-sha1: 70924594a1020d48723efecc89282cb5e2bf6a6c Text-content-length: 184 Text-content-md5: 48f9a459497e6d1ca7914bf0c6838ca7 Text-content-sha1: abf28abfbc2181f86f5ec73d8fc0af26c3fdadc4 Content-length: 225 K 15 cvs2svn:cvs-rev V 5 1.194 PROPS-END SVNByBEoGive terminal a heads-up on miscellaneous stuff */ term_reconfige1LLe& udata[uindex]) { if (tindex + 1 < len2 && tdata[tindex] == '\r' && Revision-number: 1577 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2002-03-06T23:06:07.000000Z K 7 svn:log V 118 Oops. I wrote in the docs that no-remote-resize also included no-remote-move-window, so I'd better live up to that... K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8491ac75e5c7ad6cca6db57dc795b580 Text-delta-base-sha1: cd8314c56dfbeea57c38aaebc88e1235b268dc9d Text-content-length: 102 Text-content-md5: e3f1b69c21dcab25199e208fbf4587f1 Text-content-sha1: 94360eba49d738da23980e76f6b0df3a29b6c797 Content-length: 142 K 15 cvs2svn:cvs-rev V 4 1.96 PROPS-END SVNCKKcno_mouse_repMouseReporting", 0, &cfg->no_mouse_rep Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e3f1b69c21dcab25199e208fbf4587f1 Text-delta-base-sha1: 94360eba49d738da23980e76f6b0df3a29b6c797 Text-content-length: 345 Text-content-md5: f27b1133144d6e3bed3a0a47dcc85abf Text-content-sha1: 4b4d371b7ca1f456fdb7bd44ae82f46813156866 Content-length: 385 K 15 cvs2svn:cvs-rev V 4 1.97 PROPS-END SVNC6NetQ :, and also disable raw mouse mode * if the user has disabled mouse reporting. */ void term_reconfig(void) { if (cfg.no_alt_screen) swap_screen(0); if (cfg.no_mouse_rep) { xterm_mouse = 0; set_raw_mouse_mode(0); }(xterm_mouse && !cfg.no_mouse_rep && !(cfg.mouse_override && shift) Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 80d44d70d2fe7c2e64869079c2950cea Text-delta-base-sha1: 32982930e037392b991e57dcaed0c2d6ba91c247 Text-content-length: 686 Text-content-md5: 1052cdb578e61511fa0e0517beb06fb0 Text-content-sha1: 661fae690d8fe5c93d12263d5b85678db43e640e Content-length: 727 K 15 cvs2svn:cvs-rev V 5 1.179 PROPS-END SVN9@?[3cx9J}YeMOUSEREPMOUSEREP: return "JI(`',`features.mouseMOUSEREP, cfg.no_mouse_repx&xterm-style mouse reporting", IDC_NOMOUSEREPMOUSEREPno_mouse_rep = IsDlgButtonChecked(hwnd, IDC_NOMOUSEREP||TIAL SECURITY BREACH!\n" "\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "hit Yes to u Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 48f9a459497e6d1ca7914bf0c6838ca7 Text-delta-base-sha1: abf28abfbc2181f86f5ec73d8fc0af26c3fdadc4 Text-content-length: 347 Text-content-md5: f7a361cd8cbe34a55efe0694bc6eec15 Text-content-sha1: 48461ba0842f9c019bde5dbaeffdfeed4c3b13ef Content-length: 388 K 15 cvs2svn:cvs-rev V 5 1.195 PROPS-END SVN]h]h /* this doesn't return... */ return msg.wParam; /* ... but optimiser doesn't know */activate = activate && !cfg.no_mouse_rep;1G1work. If it screws up badly we can always revert to * the simple and slow way. */ while (tindex < len2 && uindex < len && tdata[tindex] & Revision-number: 1580 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2002-03-09T12:03:49.000000Z K 7 svn:log V 27 Fix Makefile dependencies. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5fdca3e2e28fd4edcb62e497822ba5d4 Text-delta-base-sha1: acc09de8d5276c7379caa2a2de98f608da4f1baf Text-content-length: 1407 Text-content-md5: 05a420a15d953314d04874162848e691 Text-content-sha1: 26aab3a6257c3a35fcf69c4f07b3318063cb488f Content-length: 1447 K 15 cvs2svn:cvs-rev V 4 1.80 PROPS-END SVN/-P#MHa<{IgKvk~`J|M4T f<^8*=rconsole.$(OBJ): console.c network.h misc.h puttymem.h int64.h storage.h ssh.h putty.h int64.$(OBJ): int64.c int64.h ldisc.$(OBJ): ldisc.c network.h misc.h puttymem.h putty.h logging.$(OBJ): loggingnoise.$(OBJ): noise.c network.h misc.h puttymem.h int64.h storage.h ssh.h putty.h pageant.$(OBJ): pageant.c network.h miscputtymem.h int64puttymem.h int64int64.h puttymemmisc.h puttymem.hputtymem.h int64.h ssh.h putty.h tree234.h sshaes.$(OBJ): sshaes.c network.h puttymem.h int64.h ssh.h sshblowf.$(OBJ): sshblowf.c network.h puttymem.h int64 sshcrc.$(OBJ): sshcrc.c sshcrcda.$(OBJ): sshcrcda.c network.h misc.h int64.h puttymem.h ssh.h sshdes.$(OBJ): sshdes.c network.h puttymem.h int64.h ssh.h sshdh.$(OBJ): sshdh.c network.h puttymem.h int64puttymem.h int64.h ssh.h sshprime.$(OBJ): sshprime.c network.h puttymem.h int64.h ssh.h sshpubk.$(OBJ): sshpubk.c network.h misc.h int64.h puttymem.h ssh.h sshrand.$(OBJ): sshrand.c network.h puttymem.h int64.h ssh.h sshrsa.$(OBJ): sshrsa.c network.h misc.h int64.h puttymem.h ssh.h sshrsag.$(OBJ): sshrsag.c network.h puttymem.h int64.h ssh.h sshsh512.$(OBJ): sshsh512.c network.h puttymem.h int64.h ssh.h sshsha.$(OBJ): sshsha.c network.h puttymem.h int64.h ssh.h sshzlib.$(OBJ): sshzlib.c network.h puttymem.h int64.h sshint64.h puttymemputtymem.h int64 Revision-number: 1581 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2002-03-09T17:59:15.000000Z K 7 svn:log V 44 ANSI remote printer support. Raw mode only. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 05a420a15d953314d04874162848e691 Text-delta-base-sha1: 26aab3a6257c3a35fcf69c4f07b3318063cb488f Text-content-length: 35 Text-content-md5: fe7df8ebdcc5479e56c8cb88ab20072b Text-content-sha1: 6ae45ba0c6c37c282909032774f89504d147e464 Content-length: 75 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVN-F >z3GOBJS3 = print Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 43ad433fe9cb907c651980a1fa5ffeaf Text-delta-base-sha1: 4fe8eceb0f0d6410cc7b7463b62c86baa26128a5 Text-content-length: 1467 Text-content-md5: 2647c21c751d1f93f7fbe949b279dd41 Text-content-sha1: 4aec3c359e31fdbcb098a772591fb4470563398d Content-length: 1507 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNjX5jN\versionid $Id: config.but,v 1.29 2002/03/09 17:59:15S{config-printing} Remote-controlled printing \cfg{winhelp-topic}{terminal.printing} A lot of VT100-compatible terminals support printing under control of the remote server. PuTTY supports this feature as well, but it is turned off by default. To enable remote-controlled printing, choose a printer from the \q{Printer to send ANSI printer output to} drop-down list box. This should allow you to select from all the printers you have installed drivers for on your computer. Alternatively, you can type the network name of a networked printer (for example, \c{\\\\printserver\\printer1}) even if you haven't already installed a driver for it on your own machine. When the remote server attempts to print some data, PuTTY will send that data to the printer \e{raw} - without translating it, attempting to format it, or doing anything else to it. It is up to you to ensure your remote server knows what type of printer it is talking to. Since PuTTY sends data to the printer raw, it cannot offer options such as portrait versus landscape, print quality, or paper tray selection. All these things would be done by your PC printer driver (which PuTTY bypasses); if you need them done, you will have to find a way to configure your remote server to do them. To disable remote printing again, choose \q{None (printing disabled)} from the printer selection list. This is the default state Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 22364da04c671807d11cd3f5fbc91b0b Text-delta-base-sha1: 5640e6c8eacd9dc4e1b6d54fbe98706e8fe54ef3 Text-content-length: 451 Text-content-md5: 386e0b92fcb44807c344258fbbc70f5e Text-content-sha1: 3057149a4d49ce482951e19e5c1c8f9401180e6d Content-length: 492 K 15 cvs2svn:cvs-rev V 5 1.136 PROPS-END SVN' (T+Mchar printer[128/* * Exports from printing.c. */ typedef struct printer_enum_tag printer_enum; typedef struct printer_job_tag printer_job; printer_enum *printer_start_enum(int *nprinters); char *printer_get_name(printer_enum *, int); void printer_finish_enum(printer_enum *); printer_job *printer_start_job(char *printer); void printer_job_data(printer_job *, void *, int); void printer_finish_job(printer_job *); #endif Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 577348c62707ceb65b3405e713ec9f36 Text-delta-base-sha1: a50738c1d5f6384bcfc8e01b31c5a932c385870c Text-content-length: 123 Text-content-md5: 19c38ac40a1fa2507bf0190475fc553d Text-content-sha1: 77c4bc7f184fa527ae3f83267558d4579c0e6b4f Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVN^[]vWa1-s(sesskey, "Printer", cfg->printers(sesskey, "Printer", "", cfg->printer, sizeof(cfg->printer Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f27b1133144d6e3bed3a0a47dcc85abf Text-delta-base-sha1: 4b4d371b7ca1f456fdb7bd44ae82f46813156866 Text-content-length: 2730 Text-content-md5: 6d474bd00aa528a9f4c4b30b5f682433 Text-content-sha1: 199abd58394e9185a50845613af9db9b91c42ead Content-length: 2770 K 15 cvs2svn:cvs-rev V 4 1.98 PROPS-END SVNBJRor/nf[u|M$HIg+~:J7static int printing, only_printing; /* Are we doing ANSI printing? */ static int print_state; /* state of print-end-sequence scan */ static bufchain printer_buf; /* buffered data for printer */ static printer_job *print_job;static void term_print_finishterm_print_finish()disable raw mouse mode if the * user has disabled mouse reporting, and abandon a print job if * the user has disabled prin if (!*cfg.printer) { term_print_finish()ANSI printing routines. */ static void term_print_setup(void) { bufchain_clear(&printer_buf); print_job = printer_start_job(cfg.printer); } static void term_print_flush(void) { void *data; int len; int size; while ((size = bufchain_size(&printer_buf)) > 5) { bufchain_prefix(&printer_buf, &data, &len); if (len > size-5) len = size-5; printer_job_data(print_job, data, len); bufchain_consume(&printer_buf, len); } } static void term_print_finish(void) { void *data; int len, size; char c; term_print_flush(); while ((size = bufchain_size(&printer_buf)) > 0) { bufchain_prefix(&printer_buf, &data, &len); c = *(char *)data; if (c == '\033' || c == '\233') { bufchain_consume(&printer_buf, size); break; } else { printer_job_data(print_job, &c, 1); bufchain_consume(&printer_buf, 1); } } printer_finish_job(print_job); print_job = NULL; printing = only_printing = FALSE; * If we're printing, add the character to the printer * buffer. */ if (printing) { char cc = c; bufchain_add(&printer_buf, &c, 1); /* * If we're in print-only mode, we use a much simpler * state machine designed only to recognise the ESC[4i * termination sequence. */ if (only_printing) { if (c == '\033') print_state = 1; else if (c == (unsigned char)'\233') print_state = 2; else if (c == '[' && print_state == 1) print_state = 2; else if (c == '4' && print_state == 2) print_state = 3; else if (c == 'i' && print_state == 3) print_state = 4; else print_state = 0; if (print_state == 4) { printing = only_printing = FALSE; term_print_finish(); } continue; } }i': case ANSI_QUE('i'): compatibility(VT100); { int i; if (esc_nargs != 1) break; if (esc_args[0] == 5 && *cfg.printer) { printing = TRUE; only_printing = !esc_query; print_state = 0; term_print_setup(); } else if (esc_args[0] == 4 && printing) { printing = FALSE; only_printing = FALSE; term_print_finish(); } } break; term_print_flush(); Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1052cdb578e61511fa0e0517beb06fb0 Text-delta-base-sha1: 661fae690d8fe5c93d12263d5b85678db43e640e Text-content-length: 2932 Text-content-md5: 060112a91a217db74c384a1117e345ff Text-content-sha1: 0c6c4b4e854d46a474f9757971904aec54d72ae0 Content-length: 2973 K 15 cvs2svn:cvs-rev V 5 1.180 PROPS-END SVNM0" !f/W9Qi5<HMJ@ ^]ZD #define PRINTER_DISABLED_STRING "None (printing disabled)"BOX_TERMINAL3IDC_PRINTERSTATIC, IDC_PRINTER case IDC_PRINTERSTATIC: case IDC_PRINTER: return "JI(`',`terminal.printing { int i, nprinters; printer_enum *pe; pe = printer_start_enum(&nprinters)PRINTER, CB_RESETCONTENT, 0, 0); SendDlgItemMessage(hwnd, IDC_PRINTER, CB_ADDSTRING, 0, (LPARAM) PRINTER_DISABLED_STRING); for (i = 0; i < nprinters; i++) { char *printer_name = printer_get_name(pe, i); SendDlgItemMessage(hwnd, IDC_PRINTER, CB_ADDSTRING, 0, (LPARAM) printer_name); } printer_finish_enum(pe); SetDlgItemText(hwnd, IDC_PRINTER, *cfg.printer ? cfg.printer : PRINTER_DISABLED_STRING); } p beginbox(&cp, "Remote-controlled printing", IDC_BOX_TERMINAL3); combobox(&cp, "&Printer to send ANSI printer output to:", IDC_PRINTERSTATIC, IDC_PRINTERPRINTER: if (HIWORD(wParam) == CBN_SELCHANGE) { int index = SendDlgItemMessage(hwnd, IDC_PRINTER, CB_GETCURSEL, 0, 0); SendDlgItemMessage(hwnd, IDC_PRINTER, CB_GETLBTEXT, index, (LPARAM)cfg.printer); } else if (HIWORD(wParam) == CBN_EDITCHANGE) { GetDlgItemText(hwnd, IDC_PRINTER, cfg.printer, sizeof(cfg.printer) - 1); } if (!strcmp(cfg.printer, PRINTER_DISABLED_STRING)) *cfg.printer = '\0';jXX time(&t); strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t", localtime(&t)); events[nevents] = smalloc(strlen(timebuf) + strlen(string) + 1); strcpy(events[nevents], timebuf); strcat(events[nevents], string); if (logbox) { int count; SendDlgItemMessage(logbox, IDN_LIST, LB_ADDSTRING, 0, (LPARAM) events[nevents]); count = SendDlgItemMessage(logbox, IDN_LIST, LB_GETCOUNT, 0, 0); SendDlgItemMessage(logbox, IDN_LIST, LB_SETTOPINDEX, count - 1, 0); } nevents++; } void showeventlog(HWND hwnd) { if (!logbox) { logbox = CreateDialog(hinst, MAKEINTRESOURCE(IDD_LOGBOX), hwnd, LogProc); ShowWindow(logbox, SW_SHOWNORMAL); } SetActiveWindow(logbox); } void showabout(HWND hwnd) { DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc); } void verify_ssh_host_key(char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; static const char absentmsg[] = "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, hit Yes to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you want to carry on connecting just once, without\n" "adding the key to the cache, hit No.\n" "If you do not trust this host, hit Cancel to abandon the\n" "connection.\n"; static const char wrongmsg[] = "WARNING - POTEN Revision-number: 1582 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2002-03-09T19:06:58.000000Z K 7 svn:log V 69 As ever, There's Always One. Check in the extra source file. *blush* K 10 svn:author V 5 simon PROPS-END Node-path: putty/printing.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2313 Text-content-md5: 5eeb4fd2323bac6b59712a0e07a74407 Text-content-sha1: 37ce150d19b646e75e98e0b1c46051858ab25605 Content-length: 2429 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN{{{/* * Printing interface for PuTTY. */ #include #include "putty.h" struct printer_enum_tag { int nprinters; LPPRINTER_INFO_5 info; }; struct printer_job_tag { HANDLE hprinter; }; printer_enum *printer_start_enum(int *nprinters_ptr) { printer_enum *ret = smalloc(sizeof(printer_enum)); char *buffer = NULL; DWORD needed, nprinters; *nprinters_ptr = 0; /* default return value */ buffer = smalloc(512); if (EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 5, buffer, 512, &needed, &nprinters) == 0) goto error; buffer = srealloc(buffer, needed); if (EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 5, (LPBYTE)buffer, needed, &needed, &nprinters) == 0) goto error; ret->info = (LPPRINTER_INFO_5)buffer; ret->nprinters = *nprinters_ptr = nprinters; return ret; error: sfree(buffer); sfree(ret); return NULL; } char *printer_get_name(printer_enum *pe, int i) { if (!pe) return NULL; if (i < 0 || i >= pe->nprinters) return NULL; return pe->info[i].pPrinterName; } void printer_finish_enum(printer_enum *pe) { if (!pe) return; sfree(pe->info); sfree(pe); } printer_job *printer_start_job(char *printer) { printer_job *ret = smalloc(sizeof(printer_job)); DOC_INFO_1 docinfo; int jobstarted = 0, pagestarted = 0; ret->hprinter = NULL; if (!OpenPrinter(printer, &ret->hprinter, NULL)) goto error; docinfo.pDocName = "PuTTY remote printer output"; docinfo.pOutputFile = NULL; docinfo.pDatatype = "RAW"; if (!StartDocPrinter(ret->hprinter, 1, (LPSTR)&docinfo)) goto error; jobstarted = 1; if (!StartPagePrinter(ret->hprinter)) goto error; pagestarted = 1; return ret; error: if (pagestarted) EndPagePrinter(ret->hprinter); if (jobstarted) EndDocPrinter(ret->hprinter); if (ret->hprinter) ClosePrinter(ret->hprinter); sfree(ret); return NULL; } void printer_job_data(printer_job *pj, void *data, int len) { DWORD written; if (!pj) return; WritePrinter(pj->hprinter, data, len, &written); } void printer_finish_job(printer_job *pj) { if (!pj) return; EndPagePrinter(pj->hprinter); EndDocPrinter(pj->hprinter); ClosePrinter(pj->hprinter); sfree(pj); } Revision-number: 1583 Prop-content-length: 150 Content-length: 150 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-03-09T19:07:21.000000Z K 7 svn:log V 50 ... and add its dependencies to the Makefile too. PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fe7df8ebdcc5479e56c8cb88ab20072b Text-delta-base-sha1: 6ae45ba0c6c37c282909032774f89504d147e464 Text-content-length: 73 Text-content-md5: 7079f7db5eea375832e87d6b882b9441 Text-content-sha1: 07c1536bd23aed367a238ecd5ec9aabbb6e1d13d Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVNF 4v]irinting.$(OBJ): printing.c network.h misc.h puttymem Revision-number: 1584 Prop-content-length: 220 Content-length: 220 K 8 svn:date V 27 2002-03-10T09:28:32.000000Z K 7 svn:log V 119 Arrgh! Forgot yet another fiddly Makefile bit. Perhaps it's really time I did something about my Makefile generator... K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7079f7db5eea375832e87d6b882b9441 Text-delta-base-sha1: 07c1536bd23aed367a238ecd5ec9aabbb6e1d13d Text-content-length: 63 Text-content-md5: 37259bee21a0386f20deaae2e82c7d76 Text-content-sha1: f087c4a41127a98d3f2ff9b151c73819046dcd59 Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVNX =Z@ vGOBJS3GOBJS3GOBJS3GOBJS3 Revision-number: 1585 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2002-03-10T21:56:55.000000Z K 7 svn:log V 86 Grotty script to sanity-check the accelerator keys in windlg.c. (private RCS rev 1.4) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/contrib Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: putty/contrib/accel.pl Node-kind: file Node-action: add Prop-content-length: 142 Text-delta: true Text-content-length: 4848 Text-content-md5: f093ee8cea4f95208972b590d30a37cd Text-content-sha1: 60d3b9876c00586894864b8e9af7337cb543132e Content-length: 4990 K 14 svn:executable V 1 * K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNbbb#! /usr/bin/perl -w # $Id: accel.pl,v 1.1 2002/03/10 21:56:55 jacob Exp $ # Grotty script to check for clashes in the PuTTY config dialog keyboard # accelerators in windlg.c, and to check the comments are still up to # date. Based on windlg.c:1.177 & win_res.rc:1.56. # usage: accel.pl [-q] [-v] [-f windlg-alt.c] use strict; use English; use Getopt::Std; # Accelerators that nothing in create_controls() must use # (see win_res.rc, windlg.c:GenericMainDlgProc()) my $GLOBAL_ACCEL = "acgoh"; my $all_ok = 1; my %opts = (); # Sort a string of characters. sub sortstr { my ($str) = @_; return join("",sort(split(//,$str))); } # Return duplicates in a sorted string of characters. sub dups { my ($str) = @_; my %dups = (); my $chr = undef; for (my $i=0; $i < length($str); $i++) { if (defined($chr) && $chr eq substr($str,$i,1)) { $dups{$chr} = 1; } $chr = substr($str,$i,1); } return keys(%dups); } sub mumble { print @_ unless exists($opts{q}); } sub whinge { mumble(@_); $all_ok = 0; return 0; } # Having worked out stuff about a particular panel, check it for # plausibility. sub process_panel { my ($panel, $cmtkeys, $realkeys) = @_; my ($scmt, $sreal); my $ok = 1; $scmt = sortstr ($cmtkeys); $sreal = sortstr ($GLOBAL_ACCEL . $realkeys); my @dups = dups($sreal); if (@dups) { $ok = whinge("$panel: accelerator clash(es): ", join(", ", @dups), "\n") && $ok; } if ($scmt ne $sreal) { $ok = whinge("$panel: comment doesn't match reality ", "([$GLOBAL_ACCEL] $realkeys)\n") && $ok; } if ($ok && exists($opts{v})) { mumble("$panel: ok\n"); } } getopts("qvf:", \%opts); my $windlg_c_name = "windlg.c"; $windlg_c_name = $opts{f} if exists($opts{f}); open WINDLG, "<$windlg_c_name"; # Grotty ad-hoc parser (tm) state my $in_ctrl_fn = 0; my $seen_ctrl_fn = 0; my $panel; my $cmt_accel; my $real_accel; while () { chomp; if (!$in_ctrl_fn) { # Look for the start of the function we're interested in. if (m/create_controls\s*\(.*\)\s*$/) { $in_ctrl_fn = 1; $seen_ctrl_fn = 1; $panel = undef; next; } } else { if (m/^}\s*$/) { # We've run out of function. (Probably.) # We should process any pending panel. if (defined($panel)) { process_panel($panel, $cmt_accel, $real_accel); } $in_ctrl_fn = 0; last; } if (m/^\s*if\s*\(panel\s*==\s*(\w+)panelstart\)/) { # New panel. Now seems like a good time to process the previous # one (if any). process_panel ($panel, $cmt_accel, $real_accel) if defined($panel); $panel = $1; $cmt_accel = $real_accel = ""; next; } next unless defined($panel); # Some nasty hacks to get round the conditionalised stuff # in the Session panel. This is probably the bit most likely # to break. if ($panel eq "session") { my $munch; if (m/if\s*\(backends\[\w+\].backend\s*==\s*NULL\)/) { do { $munch = } until ($munch =~ m/}\s*else\s*{/); } elsif (m/^#ifdef\s+FWHACK/) { do { $munch = } until ($munch =~ m/^#else/); } } # Look for accelerator comment. if (m#/\* .* Accelerators used: (.*) \*/#) { die "aiee, multiple comments in panel" if ($cmt_accel); $cmt_accel = lc $1; $cmt_accel =~ tr/[] //d; # strip ws etc next; } # Now try to find double-quoted strings. { my $line = $ARG; # Opening quote. while ($line =~ m/"/) { $line = $POSTMATCH; my $str = $line; # Be paranoid about \", since it does get used. while ($line =~ m/(?:(\\)?"|(&)(.))/) { $line = $POSTMATCH; if (defined($2)) { if ($3 ne "&") { # Found an accelerator. (Probably.) $real_accel .= lc($3); } # Otherwise, found && -- ignore. } else { # It's an end quote. last unless defined($1); # Otherwise, it's a \" quote. # Yum. } } } } } } close WINDLG; die "That didn't look anything like windlg.c to me" if (!$seen_ctrl_fn); exit (!$all_ok); Revision-number: 1586 Prop-content-length: 276 Content-length: 276 K 7 svn:log V 175 Slightly less grotty script to convert OpenSSH known_hosts and known_hosts2 host key files to .REG files for Windows. (renamed from 'hosts2reg' because of 8.3 considerations) K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-03-10T22:00:06.000000Z PROPS-END Node-path: putty/contrib/kh2reg.py Node-kind: file Node-action: add Prop-content-length: 142 Text-delta: true Text-content-length: 4658 Text-content-md5: bbb672986465f8b757e3224dfbeb8dd1 Text-content-sha1: 8fb2741fc743613f7da4db8d81fd0439b5ad56ca Content-length: 4800 K 14 svn:executable V 1 * K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN$$$#! /usr/bin/env python # $Id: kh2reg.py,v 1.1 2002/03/10 22:00:06 jacob Exp $ # Convert OpenSSH known_hosts and known_hosts2 files to "new format" PuTTY # host keys in a Windows .REG file (double-click to install). # usage: hosts2reg.py known_hosts1 2 3 4 ... > hosts.reg # Line endings are someone else's problem as is traditional. # Developed for Python 1.5.2. import fileinput import base64 import struct import string import re import sys def mungestr(s): "Duplicate of PuTTY's mungestr() in winstore.c:1.10 for Registry keys" candot = 0 r = "" for c in s: if c in ' \*?%~' or ord(c)%luB" % len(s), s) return reduce ((lambda a, b: (long(a) << 8) + long(b)), bytes) def longtohex(n): """Convert long int to lower-case hex. Ick, Python (at least in 1.5.2) doesn't appear to have a way to turn a long int into an unadorned hex string -- % gets upset if the number is too big, and raw hex() uses uppercase (sometimes), and adds unwanted "0x...L" around it.""" plain=string.lower(re.match(r"0x([0-9A-Fa-f]*)l?$", hex(n), re.I).group(1)) return "0x" + plain # Output REG file header. sys.stdout.write("""REGEDIT4 [HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys] """) # Now process all known_hosts input. for line in fileinput.input(): try: # Remove leading/trailing whitespace (should zap CR and LF) line = string.strip (line) # Skip blanks and comments if line == '' or line[0] == '#': raise "Skipping input line" # Split line on spaces. fields = string.split (line, ' ') # Common fields hostpat = fields[0] magicnumbers = [] # placeholder keytype = "" # placeholder # Grotty heuristic to distinguish known_hosts from known_hosts2: # is second field entirely decimal digits? if re.match (r"\d*$", fields[1]): # Treat as SSH1-type host key. # Format: hostpat bits10 exp10 mod10 comment... # (PuTTY doesn't store the number of bits.) magicnumbers = map (long, fields[2:4]) keytype = "rsa" else: # Treat as SSH2-type host key. # Format: hostpat keytype keyblob64 comment... sshkeytype, blob = fields[1], base64.decodestring (fields[2]) # 'blob' consists of a number of # uint32 N (big-endian) # uint8[N] field_data subfields = [] while blob: sizefmt = ">L" (size,) = struct.unpack (sizefmt, blob[0:4]) size = int(size) # req'd for slicage (data,) = struct.unpack (">%lus" % size, blob[4:size+4]) subfields.append(data) blob = blob [struct.calcsize(sizefmt) + size : ] # The first field is keytype again, and the rest we can treat as # an opaque list of bignums (same numbers and order as stored # by PuTTY). (currently embedded keytype is ignored entirely) magicnumbers = map (strtolong, subfields[1:]) # Translate key type into something PuTTY can use. if sshkeytype == "ssh-rsa": keytype = "rsa2" elif sshkeytype == "ssh-dss": keytype = "dss" else: raise "Unknown SSH key type", sshkeytype # Now print out one line per host pattern, discarding wildcards. for host in string.split (hostpat, ','): if re.search (r"[*?!]", host): sys.stderr.write("Skipping wildcard host pattern '%s'\n" % host) continue else: # Slightly bizarre registry key format: 'type@port:hostname' # As far as I know, the input never specifies a port. port = 22 # XXX: does PuTTY do anything useful with literal IP[v4]s? key = keytype + ("@%d:%s" % (port, host)) value = string.join (map (longtohex, magicnumbers), ',') # XXX: worry about double quotes? sys.stdout.write("\"%s\"=\"%s\"\n" % (mungestr(key), value)) except "Unknown SSH key type", k: sys.stderr.write("Unknown SSH key type '%s', skipping\n" % k) except "Skipping input line": pass Revision-number: 1587 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2002-03-11T10:38:30.000000Z K 7 svn:log V 101 Bah. Add winspool.lib to libraries list. Maybe _now_ the nightly builds will start working again :-/ K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 37259bee21a0386f20deaae2e82c7d76 Text-delta-base-sha1: f087c4a41127a98d3f2ff9b151c73819046dcd59 Text-content-length: 30 Text-content-md5: 58f702f27db2fc3724d52b43d8a64ca7 Text-content-sha1: 8a88c4db83c237c863f7b1c3be06031a84856b05 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVNXe guc winspool Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ad47c1d8c7ece1c7c6fdd72ba03ef111 Text-delta-base-sha1: 1fb10f076dd0bac88274930b694f34e537308967 Text-content-length: 32 Text-content-md5: c2ad69682ae777e88b71968b9a1ed50c Text-content-sha1: 97bccb66bd21f81b0abb92e5041bcae04da38894 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN8C && -lwinspool Revision-number: 1588 Prop-content-length: 176 Content-length: 176 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-03-12T09:55:02.000000Z K 7 svn:log V 76 Avoid needless memory management error if EnumPrinters returns no printers. PROPS-END Node-path: putty/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5eeb4fd2323bac6b59712a0e07a74407 Text-delta-base-sha1: 37ce150d19b646e75e98e0b1c46051858ab25605 Text-content-length: 303 Text-content-md5: 374ae2973cb2b731ac438aaec33dc22e Text-content-sha1: 873e94c6e79aed7a83e84b7ff85fc821faf92166 Content-length: 342 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN{v >!Zif (needed) { buffer = srealloc(buffer, needed); if (EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 5, (LPBYTE)buffer, needed, &needed, &nprinters) == 0) goto error; } else { nprinters = 0; ret->info = NULL; } Revision-number: 1589 Prop-content-length: 243 Content-length: 243 K 8 svn:date V 27 2002-03-12T18:27:10.000000Z K 7 svn:log V 142 Network printers weren't showing up on at least NT4. This version appears to be better, but Jacob has found that it still isn't perfect. Bah. K 10 svn:author V 5 simon PROPS-END Node-path: putty/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 374ae2973cb2b731ac438aaec33dc22e Text-delta-base-sha1: 873e94c6e79aed7a83e84b7ff85fc821faf92166 Text-content-length: 1832 Text-content-md5: d538bc22d337eb4b38d71d6a7f1afe9e Text-content-sha1: 02447a50cc9d294022418ca96b55a82258142fc7 Content-length: 1871 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNv&~R<NYr.-tI-/* * Boggle. Flipping between the two branches of this #if appears to * make all the difference as to whether network printers show up * under PRINTER_ENUM_CONNECTIONS on NT 4. I don't pretend to * understand this... */ #if 0 #define ENUM_LEVEL 5 #define ENUM_PTR LPPRINTER_INFO_5 #define ENUM_TYPE PRINTER_INFO_5 #define ENUM_MEMBER pPrinterName #else #define ENUM_LEVEL 1 #define ENUM_PTR LPPRINTER_INFO_1 #define ENUM_TYPE PRINTER_INFO_1 #define ENUM_MEMBER pName #endif struct printer_enum_tag { int nprinters; ENUM_PTR info; }; struct printer_job_tag { HANDLE hprinter; }; static char *printer_add_enum(int param, char *buffer, int offset, int *nprinters_ptr) { DWORD needed, nprinters; buffer = srealloc(buffer, offset+512); if (EnumPrinters(param, NULL, ENUM_LEVEL, buffer+offset, 512, &needed, &nprinters) == 0) return NULL; if (needed < 512) needed = 512; buffer = srealloc(buffer, offset+needed); if (EnumPrinters(param, NULL, ENUM_LEVEL, buffer+offset, needed, &needed, &nprinters) == 0) return NULL; *nprinters_ptr += nprinters; return buffer; }, *retval retval = printer_add_enum(PRINTER_ENUM_LOCAL, buffer, 0, nprinters_ptr); if (!retval) goto error; else buffer = retval; retval = printer_add_enum(PRINTER_ENUM_CONNECTIONS, buffer, sizeof(ENUM_TYPE) * *nprinters_ptr, nprinters_ptr); if (!retval) goto error; else buffer = retval; ret->info = (ENUM_PTR)buffer; ret->nprinters = *nprinters_ptr; return ret; error: sfree(buffer); sfree(ret); *nprinters_ptr = 0ENUM_MEMBER Revision-number: 1590 Prop-content-length: 440 Content-length: 440 K 8 svn:date V 27 2002-03-13T19:55:01.000000Z K 7 svn:log V 339 Rev 1.189 [r1517] of this file introduced a bug. While it is correct to avoid calling term_out() during a drag-select, it's false to assume that all drags are selects - some are xterm mouse-reported drags, and term_out absolutely _should_ be called in those so that the application can show the dragged object moving. Should now be fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f7a361cd8cbe34a55efe0694bc6eec15 Text-delta-base-sha1: 48461ba0842f9c019bde5dbaeffdfeed4c3b13ef Text-content-length: 563 Text-content-md5: 1dd7e232a86f077eca5b3f9cb27b6871 Text-content-sha1: e37c2fe5c31f9773f3f43f2eab9d307ef64d0aa0 Content-length: 604 K 15 cvs2svn:cvs-rev V 5 1.196 PROPS-END SVN%wFCwL I " || (send_raw_mouse && !(cfg.mouse_override && is_shift_pressed()))is_shifSHIFT || (send_raw_mouse && !(cfg.mouse_override && is_shift_pressed()))GTTGe a \u escape sequence. * * It would probably be more robust to just bite the bullet * and WCToMB each individual Unicode character one by one, * then MBToWC each one back to see if it was an accurate * translation; but that strikes me as a horrifying number * of Windows API calls so I want to see if this faster way * will Revision-number: 1591 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2002-03-13T22:15:14.000000Z K 7 svn:log V 110 Fix multi-monitor / full-screen problems and clean up the code a little. Thanks to Wez Furlong for the patch. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1dd7e232a86f077eca5b3f9cb27b6871 Text-delta-base-sha1: e37c2fe5c31f9773f3f43f2eab9d307ef64d0aa0 Text-content-length: 995 Text-content-md5: 48ef2fc386fcde86eb04171341b58d7e Text-content-sha1: 4da7346716d96303e088c3c0cada85ebc4b96242 Content-length: 1036 K 15 cvs2svn:cvs-rev V 5 1.197 PROPS-END SVN)1p m;(%1t static int get_fullscreen_rect(RECT * ss get_fullscreen_rect(get_fullscreen_rect( get_fullscreen_rect(&ss); fullscr_on_max = FALSE; make_full_screen()e a \u esca"O@ vuGJT|~ Get the rect/size of a full screen window using the nearest available * monitor in multimon systems; default to something sensible if only * one monitor is present. */ static int get_fullscreen_rect(RECT * ss) { #ifdef MONITOR_DEFAULTTONEAREST /* structure copy */ *ss = mi.rcMonitor; return TRUE; #else /* could also use code like this: ss->left = ss->top = 0; ss->right = GetSystemMetrics(SM_CXSCREEN); ss->bottom = GetSystemMetrics(SM_CYSCREEN); */ return GetClientRect(GetDesktopWindow(), &ss); #endif } RECT ss; assert(IsZoomed(hwnd)); if (is_full_screen()) return; get_fullscreen_rect(&ss); SetWindowPos(hwnd, HWND_TOP, ss.left, ss.top, ss.right - ss.left, ss.bottom - ss.top, Revision-number: 1592 Prop-content-length: 473 Content-length: 473 K 8 svn:date V 27 2002-03-16T15:49:28.000000Z K 7 svn:log V 372 Completely revamped mkfiles.pl which incorporates dependency analysis (for both .c and .rc files). Generates the VC++ makefile as well as the other two; the authoritative source is now the new file `Recipe' rather than any particular Makefile. Note that `Makefile' is still here as a relic of the old way until we stop the nightly builds using it, but it'll be gone soon. K 10 svn:author V 5 simon PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 16875ccfb314f1fbaa57c67925e3c403 Text-delta-base-sha1: 89fd9593c3a2e561cdef7ae9b873fc83f03e600e Text-content-length: 1275 Text-content-md5: c893e7f97ff246e9da295fa286562e2e Text-content-sha1: 12b838ff7e555cd567a9cd1387d89846dc9c847d Content-length: 1314 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN7L\C+[5If you want to rebuild PuTTY from source, we provide three Makefiles: - Makefile.vc is for MS Visual C++ systems. Type `nmake -f Makefile.vc' to build all the PuTTY binaries. - Makefile.bor is for the Borland C compiler. Type `make -f Makefile.bor' to build all the PuTTY binaries. - Makefile.cyg is for Cygwin / mingw32 installations. Type `make -f Makefile.cyg' to build all the PuTTY binaries. Note that by default the Pageant WinNT security features and the multiple monitor support are excluded from the Cygwin build, since at the time of writing this Cygwin doesn't include the necessary headers. If you have MS Visual Studio version 6 and you want to build a DevStudio project for GUI editing and debugging, you should be aware that the default GUI configuration of the compiler falls over on the nasty macros in ssh.c. This is a bug in Visual Studio. The culprit is the /ZI compiler option (debug info generation: Edit and Continue). To avoid this problem while compiling PuTTY under VS6, All of the Makefiles are generated automatically from the file `Recipe' by the Perl script `mkfiles.pl'. Additions and corrections to Recipe and the mkfiles.pl are much more useful than additions and corrections to the Node-path: putty/Recipe Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5288 Text-content-md5: f456508ef01d49b4dcef27db663f15da Text-content-sha1: b07410023043c3536c0f3f9dce9a8038f58796fd Content-length: 5404 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN# -*- makefile -*- # # This file describes which PuTTY programs are made up from which # object and resource files. It is processed into the various # Makefiles by means of a Perl script. Makefile changes should # really be made by editing this file and/or the Perl script, not # by editing the actual Makefiles. # Help text added to the top of each Makefile, with /D converted # into -D as appropriate for the particular Makefile. !begin help # # Extra options you can set: # # - FWHACK=/DFWHACK # Enables a hack that tunnels through some firewall proxies. # # - VER=/DSNAPSHOT=1999-01-25 # Generates executables whose About box report them as being a # development snapshot. # # - VER=/DRELEASE=0.43 # Generates executables whose About box report them as being a # release version. # # - COMPAT=/DAUTO_WINSOCK # Causes PuTTY to assume that includes its own WinSock # header file, so that it won't try to include . # # - COMPAT=/DWINSOCK_TWO # Causes the PuTTY utilities to include instead of # , except Plink which _needs_ WinSock 2 so it already # does this. # # - COMPAT=/DNO_SECURITY # Disables Pageant's use of , which is not available # with some development environments. This means that Pageant # won't care about the local user ID of processes accessing it; a # version of Pageant built with this option will therefore refuse # to run under NT-series OSes on security grounds (although it # will run fine on Win95-series OSes where there is no access # control anyway). # # Note that this definition is always enabled in the Cygwin # build, since at the time of writing this is known # not to be available in Cygwin. # # - COMPAT=/DNO_MULTIMON # Disables PuTTY's use of , which is not available # with some development environments. This means that PuTTY's # full-screen mode (configurable to work on Alt-Enter) will # not behave usefully in a multi-monitor environment. # # Note that this definition is always enabled in the Cygwin # build, since at the time of writing this is # known not to be available in Cygwin. # # - COMPAT=/DMSVC4 # - RCFL=/DMSVC4 # Makes a couple of minor changes so that PuTTY compiles using # MSVC 4. You will also need /DNO_SECURITY and /DNO_MULTIMON. # # - RCFL=/DASCIICTLS # Uses ASCII rather than Unicode to specify the tab control in # the resource file. Probably most useful when compiling with # Cygnus/mingw32, whose resource compiler may have less of a # problem with it. # # - XFLAGS=/DDEBUG # Causes PuTTY to enable internal debugging. # # - XFLAGS=/DMALLOC_LOG # Causes PuTTY to emit a file called putty_mem.log, logging every # memory allocation and free, so you can track memory leaks. # # - XFLAGS=/DMINEFIELD # Causes PuTTY to use a custom memory allocator, similar in # concept to Electric Fence, in place of regular malloc(). Wastes # huge amounts of RAM, but should cause heap-corruption bugs to # show up as GPFs at the point of failure rather than appearing # later on as second-level damage. # !end # Definitions of object groups. A group name, followed by an =, # followed by any number of objects or other already-defined group # names. A line beginning `+' is assumed to continue the previous # line. # GUI front end and terminal emulator (putty, puttytel). GUITERM = window windlg winctrls terminal sizetip wcwidth unicode + logging printing # Non-SSH back ends (putty, puttytel, plink). NONSSH = telnet raw rlogin ldisc # SSH back end (putty, plink, pscp, psftp). SSH = ssh sshcrc sshdes sshmd5 sshrsa sshrand sshsha sshblowf noise + sshdh sshcrcda sshpubk pageantc sshzlib sshdss x11fwd portfwd + sshaes sshsh512 sshbn # SFTP implementation (pscp, psftp). SFTP = sftp int64 logging # Miscellaneous objects appearing in all the network utilities (not # Pageant or PuTTYgen). MISC = misc version winstore settings tree234 winnet # Standard libraries, and the same with WinSocks 1 and 2. LIBS = advapi32.lib user32.lib gdi32.lib comctl32.lib comdlg32.lib + shell32.lib winmm.lib imm32.lib winspool.lib LIBS1 = LIBS wsock32.lib LIBS2 = LIBS ws2_32.lib # Definitions of actual programs. The program name, followed by a # colon, followed by a list of objects. Also in the list may be the # keywords [G] for GUI or [C] for Console application. putty : [G] GUITERM NONSSH SSH be_all MISC win_res.res LIBS1 puttytel : [G] GUITERM NONSSH be_nossh MISC win_res.res LIBS1 plink : [C] plink console NONSSH SSH be_all logging MISC plink.res LIBS2 pscp : [C] scp console SSH be_none SFTP wildcard MISC scp.res LIBS1 psftp : [C] psftp console SSH be_none SFTP MISC scp.res LIBS1 pageant : [G] pageant sshrsa sshpubk sshdes sshbn sshmd5 version tree234 + misc sshaes sshsha pageantc sshdss sshsh512 pageant.res LIBS puttygen : [G] puttygen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version + sshrand noise sshsha winstore misc winctrls sshrsa sshdss + sshpubk sshaes sshsh512 puttygen.res LIBS Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c2ad69682ae777e88b71968b9a1ed50c Text-delta-base-sha1: 97bccb66bd21f81b0abb92e5041bcae04da38894 Text-content-length: 11053 Text-content-md5: 63ef71dadb721ed20594ff16a80a48f1 Text-content-sha1: 10a67fe09cb905cc207395982efc5e7802ae8d92 Content-length: 11093 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNCA`3,1g]5Ht9r!C8\]B 2Tk$#!/usr/bin/env perl # # Makefile generator for PuTTY. # # Reads the file `Recipe' to determine the list of generated # executables and their component objects. Then reads the source # files to compute #include dependencies. Finally, writes out the # various target Makefiles. open IN, "Recipe" or die "unable to open Recipe file\n"; $help = ""; # list of newline-free lines of help text %programs = (); # maps program name to listref of objects/resources %types = (); # maps program name to "G" or "C" %groups = (); # maps group name to listref of objects/resources while () { # Skip comments (unless the comments belong, for example because # they're part of the help text). next if /^\s*#/ and !$in_help; chomp; split; if ($_[0] eq "!begin" and $_[1] eq "help") { $in_help = 1; next; } if ($_[0] eq "!end" and $in_help) { $in_help = 0; next; } # If we're gathering help text, keep doing so. if ($in_help) { $help .= "$_\n"; next; } # Ignore blank lines. next if scalar @_ == 0; # Now we have an ordinary line. See if it's an = line, a : line # or a + line. @objs = @_; if ($_[0] eq "+") { $listref = $lastlistref; $prog = undef; die "$.: unexpected + line\n" if !defined $lastlistref; } elsif ($_[1] eq "=") { $groups{$_[0]} = [] if !defined $groups{$_[0]}; $listref = $groups{$_[0]}; $prog = undef; shift @objs; # eat the group name } elsif ($_[1] eq ":") { $programs{$_[0]} = [] if !defined $programs{$_[0]}; $listref = $programs{$_[0]}; $prog = $_[0]; shift @objs; # eat the program name } else { die "$.: unrecognised line type\n"; } shift @objs; # eat the +, the = or the : while (scalar @objs > 0) { $i = shift @objs; if ($groups{$i}) { foreach $j (@{$groups{$i}}) { unshift @objs, $j; } } elsif (($i eq "[G]" or $i eq "[C]") and defined $prog) { $types{$prog} = substr($i,1,1); } else { push @$listref, $i; } } $lastlistref = $listref; } close IN; # Now retrieve the complete list of objects and resource files, and # construct dependency data for them. While we're here, expand the # object list for each program, and complain if its type isn't set. @prognames = sort keys %programs; %depends = (); @scanlist = (); foreach $i (@prognames) { if (!defined $types{$i}) { die "type not set for program $i\n"; } # Strip duplicate object names. $prev = undef; @list = grep { $status = ($prev ne $_); $prev=$_; $status } sort @{$programs{$i}}; $programs{$i} = [@list]; foreach $j (@list) { # Dependencies for "x" start with "x.c". # Dependencies for "x.res" start with "x.rc". # Both types of file are pushed on the list of files to scan. # Libraries (.lib) don't have dependencies at all. if ($j =~ /^(.*)\.res$/) { $file = "$1.rc"; $depends{$j} = [$file]; push @scanlist, $file; } elsif ($j =~ /\.lib$/) { # libraries don't have dependencies } else { $file = "$j.c"; $depends{$j} = [$file]; push @scanlist, $file; } } } # Scan each file on @scanlist and find further inclusions. # Inclusions are given by lines of the form `#include "otherfile"' # (system headers are automatically ignored by this because they'll # be given in angle brackets). Files included by this method are # added back on to @scanlist to be scanned in turn (if not already # done). # # Resource scripts (.rc) can also include a file by means of a line # ending `ICON "filename"'. Files included by this method are not # added to @scanlist because they can never include further files. # # In this pass we write out a hash %further which maps a source # file name into a listref containing further source file names. %further = (); while (scalar @scanlist > 0) { $file = shift @scanlist; next if defined $further{$file}; # skip if we've already done it $resource = ($file =~ /\.rc$/ ? 1 : 0); $further{$file} = []; open IN, $file or die "unable to open source file $file\n"; while () { chomp; /^\s*#include\s+\"([^\"]+)\"/ and do { push @{$further{$file}}, $1; push @scanlist, $1; next; }; /ICON\s+\"([^\"]+)\"\s*$/ and do { push @{$further{$file}}, $1; next; } } close IN; } # Now we're ready to generate the final dependencies section. For # each key in %depends, we must expand the dependencies list by # iteratively adding entries from %further. foreach $i (keys %depends) { %dep = (); @scanlist = @{$depends{$i}}; foreach $i (@scanlist) { $dep{$i} = 1; } while (scalar @scanlist > 0) { $file = shift @scanlist; foreach $j (@{$further{$file}}) { if ($dep{$j} != 1) { $dep{$j} = 1; push @{$depends{$i}}, $j; push @scanlist, $j; } } } # printf "%s: %s\n", $i, join ' ',@{$depends{$i}}; } # Utility routines while writing out the Makefiles. sub objects { my ($prog, $otmpl, $rtmpl, $ltmpl) = @_; my @ret; my ($i, $x, $y); @ret = (); foreach $i (@{$programs{$prog}}) { if ($i =~ /^(.*)\.res/) { $y = $1; ($x = $rtmpl) =~ s/X/$y/; push @ret, $x if $x ne ""; } elsif ($i =~ /^(.*)\.lib/) { $y = $1; ($x = $ltmpl) =~ s/X/$y/; push @ret, $x if $x ne ""; } else { ($x = $otmpl) =~ s/X/$i/; push @ret, $x if $x ne ""; } } return join " ", @ret; } sub splitline { my ($line, $width) = @_; my ($result, $len); $len = (defined $width ? $width : 76); while (length $line > $len) { $line =~ /^(.{0,$len})\s(.*)$/ or $line =~ /^(.{$len,}?\s(.*)$/; $result .= $1 . " \\\n\t\t"; $line = $2; $len = 60; } return $result . $line; } sub deps { my ($otmpl, $rtmpl) = @_; my ($i, $x, $y); foreach $i (sort keys %depends) { if ($i =~ /^(.*)\.res/) { $y = $1; ($x = $rtmpl) =~ s/X/$y/; } else { ($x = $otmpl) =~ s/X/$i/; } print &splitline(sprintf "%s: %s", $x, join " ", @{$depends{$i}}), "\n"; } } # Now we're ready to output the actual Makefiles. ##-- CygWin makefile open OUT, ">Makefile.cyg"; select OUT; print "# Makefile for PuTTY under cygwin.\n". "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n"; # gcc command line option is -D not /D ($_ = $help&splitline(DNO_MULTIMON -I.")."\n". "LDFLAGS = -mno-cygwin -s\n". &splitline("RCFLAGS = \$(RCINC) --define WIN32=1 --define _WIN32=1". " --define WINVER=0x0400 --define MINGW32_FIX=1")."\n".&splitline("all:" . join "", map { " $_.exe" } @prognames); print "\n\n"; foreach $p (@prognames) { $objstr = &objects($p, "X.o", "X.res.o", undef); print &splitline($p . ".exe: " . $objstr), "\n"; my $mw = $types{$p} eq "G" ? " -mwindows" : ""; $libstr = &objects($p, undef, undef, "-lX"); print &splitline("\t\$(CC)" . $mw . " \$(LDFLAGS) -o \$@ " . $objstr . " $libstr", 69), "\n\n"; } &deps("X.o", "X.res.o")COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) \$(VER) -c version.c\n". "clean:\n". "\trm -f *.o *.exe *.res.o\n". "\n"; select STDOUT; close OUT; ##-- Borland makefile %stdlibs = ( # Borland provides many Win32 API libraries intrinsically "advapi32" => 1, "comctl32" => 1, "comdlg32" => 1, "gdi32" => 1, "imm32" => 1, "shell32" => 1, "user32" => 1, "winmm" => 1, "winspool" => 1, "wsock32" => 1, ); open OUT, ">Makefile.bor"; select OUT; print "# Makefile for PuTTY under Borland C.\n". "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n"; # bcc32 command line option is -D not /D ($_ = $help&splitline("\tbcc32 -w-aus -w-ccc -w-par \$(COMPAT) \$(FWHACK)". " \$(XFLAGS) \$(CFLAGS) /c \$*.c",69)."\n". ".rc.res:\n". &splitline("\tbrcc32 \$(FWHACK) \$(RCFL) -i \$(BCB)\\include -r". " -DNO_WINRESRC_H -DWIN32 -D_WIN32 -DWINVER=0x0401 \$*.rc",69)."\n". "\n"; print &splitline("all:" . join "", map { " $_.exe" } @prognames); print "\n\n"; foreach $p (@prognames) { $objstr = &objects($p, "X.obj", "X.res", undef); print &splitline("$p.exe: " . $objstr . " $p.rsp"), "\n"; my $ap = ($types{$p} eq "G") ? "-aa" : "-ap"; print "\tilink32 $ap -Gn -L\$(BCB)\\lib \@$p.rsp\n\n"; } foreach $p (@prognames) { print $p, ".rsp: \$(MAKEFILE)\n"; $objstr = &objects($p, "X.obj", undef, undef); @objlist = split " ", $objstr; @objlines = (""); foreach $i (@objlist) { if (length($objlines[$#objlines] . " $i") > 50) { push @objlines, ""; } $objlines[$#objlines] .= " $i"; } $c0w = ($types{$p} eq "G") ? "c0w32" : "c0x32"; print "\techo $c0w + > $p.rsp\n"; for ($i=0; $i<=$#objlines; $i++) { $plus = ($i < $#objlines ? " +" : ""); print "\techo$objlines[$i]$plus >> $p.rsp\n"; } print "\techo $p.exe >> $p.rsp\n"; $objstr = &objects($p, "X.obj", "X.res", undef); @libs = split " ", &objects($p, undef, undef, "X"); @libs = grep { !$stdlibs{$_} } @libs&objects($p, undef, "X.res", undef) . " >> $p.rsp\n"; print "\n"; } &deps("X.obj", "X.res") ##-- Visual C++ makefile open OUT, ">Makefile.vc"; select OUT; print "# Makefile for PuTTY under Visual C.\n". "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". "# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.\n"; print $helpvc\n". "\n". "# C compilation flags\n". "CFLAGS = /nologo /W3 /O1 /D_WINDOWS /D_WIN32_WINDOWS=0x401 /DWINVER=0x401\n". "LFLAGS = /incremental:no /fixed\n". "\n". ".c.obj:\n". "\tcl \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) /c \$*.c\n". ".rc.res:\n". "\trc \$(FWHACK) \$(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 \$*.rc\n". "\n"; print &splitline("all:" . join "", map { " $_.exe" } @prognames); print "\n\n"; foreach $p (@prognames) { $objstr = &objects($p, "X.obj", "X.res", undef); print &splitline("$p.exe: " . $objstr . " $p.rsp"), "\n"; print "\tlink \$(LFLAGS) -out:$p.exe -map:$p.map \@$p.rsp\n\n"; } foreach $p (@prognames) { print $p, ".rsp: \$(MAKEFILE)\n"; $objstr = &objects($p, "X.obj", "X.res", "X.lib"); @objlist = split " ", $objstr; @objlines = (""); foreach $i (@objlist) { if (length($objlines[$#objlines] . " $i") > 50) { push @objlines, ""; } $objlines[$#objlines] .= " $i"; } $subsys = ($types{$p} eq "G") ? "windows" : "console"; print "\techo /nologo /subsystem:$subsys > $p.rsp\n"; for ($i=0; $i<=$#objlines; $i++) { print "\techo$objlines[$i] >> $p.rsp\n"; } print "\n"; } &deps("X.obj", "X.res"); print "\n". "# Hack to force version.o to be rebuilt always\n". "version.obj: *.c *.h *.rc\n". "\tcl \$(FWHACK) \$(VER) \$(CFLAGS) /c version.c\n\n". "clean: tidy\n". "\t-del *.exe\n\n". "tidy:\n". "\t-del *.obj\n". "\t-del *.res\n". "\t-del *.pch\n". "\t-del *.aps\n". "\t-del *.ilk\n". "\t-del *.pdb\n". "\t-del *.rsp\n". "\t-del *.dsp\n". "\t-del *.dsw\n". "\t-del *.ncb\n". "\t-del *.opt\n". "\t-del *.plg\n". "\t-del *.map\n". "\t-del *.idb\n". "\t-del debug.log Revision-number: 1593 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2002-03-16T18:19:31.000000Z K 7 svn:log V 36 Add new 'Makefile.vc' to .cvsignore K 10 svn:author V 5 jacob PROPS-END Node-path: putty Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 160 Content-length: 160 K 10 svn:ignore V 127 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp *.tds *.map Makefile.bor Makefile.cyg Makefile.vc PROPS-END Node-path: putty/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fbfee0bf1543d1d3a68e4d1efe87efc3 Text-delta-base-sha1: 4112aac537e482248d71b80880391e0d71f84d90 Text-content-length: 27 Text-content-md5: 921403865647acbeb9642a48ed702df1 Text-content-sha1: 9ae4f143f5bbc954fc39bf4bc75a8308f5924a42 Content-length: 66 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNt s Makefile.vc Revision-number: 1594 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2002-03-16T18:23:27.000000Z K 7 svn:log V 55 Fixed reference to putty-bugs@lists to putty@projects. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c893e7f97ff246e9da295fa286562e2e Text-delta-base-sha1: 12b838ff7e555cd567a9cd1387d89846dc9c847d Text-content-length: 28 Text-content-md5: caa43c5312516bce57a0f50aaa56bac8 Text-content-sha1: cfe6feea21a9b2b2507fe14e289d1dff067c5110 Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNLJ zI@projec Revision-number: 1595 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2002-03-20T22:16:00.000000Z K 7 svn:log V 79 Fix bug in the alternative code for -DNO_MULTIMON (was breaking Cygwin build). K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 48ef2fc386fcde86eb04171341b58d7e Text-delta-base-sha1: 4da7346716d96303e088c3c0cada85ebc4b96242 Text-content-length: 36 Text-content-md5: 8406b1eddef0d2966a284d4dcbc5f111 Text-content-sha1: 3b6c2cefec3943b9db43e4d1da0e9b86002eb6bf Content-length: 77 K 15 cvs2svn:cvs-rev V 5 1.198 PROPS-END SVN GFH Revision-number: 1596 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2002-03-20T22:34:00.000000Z K 7 svn:log V 113 Pedantic little patch to ensure blank usernames work vaguely as expected, in case anyone really wants to use one K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 172b50a84747a0c40fbe814d412e9b44 Text-delta-base-sha1: 2b8085bd64aab4120ce2f677bd485920c8c91ca3 Text-content-length: 118 Text-content-md5: 01ca16268f22f419dd455ffa809c7249 Text-content-sha1: 6fe816043233f1b4f097648fcb5d60fe1cdd2af3 Content-length: 159 K 15 cvs2svn:cvs-rev V 5 1.198 PROPS-END SVN9 =$ Y)OhQint got_usernamegot_username = FALSEgot_ got_username = TRUE; Revision-number: 1597 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:24.071119Z PROPS-END Revision-number: 1598 Prop-content-length: 456 Content-length: 456 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-03-23T17:47:21.000000Z K 7 svn:log V 355 Justin Bradford's proxy support patch. Currently supports only HTTP CONNECT, but contains an extensible framework to allow other proxies. Apparently SOCKS and ad-hoc-telnet-proxy are already planned (the GUI mentions them already even though they don't work yet). GUI includes full configurability and allows definition of exclusion zones. Rock and roll. PROPS-END Node-path: putty/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 58f702f27db2fc3724d52b43d8a64ca7 Text-delta-base-sha1: 8a88c4db83c237c863f7b1c3be06031a84856b05 Text-content-length: 274 Text-content-md5: a20618459d00f029ecab6811ead37748 Text-content-sha1: f90b3fd900d8ef6862c069d7ebb3eb459d195840 Content-length: 314 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVNe4mCPset_private_ptr) (s, ptr)) #define sk_get_private_ptr(s) (((*s)->get_private_ptr) (s))#define sk_set_frozen(s, is_frozen) (((*s)->set_frozen) (s, is_frozen)) Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1e3c1642a0b30453e76620395bb11c94 Text-delta-base-sha1: 2604a39e9e3cf250274aeb3b69275ee75d5fa137 Text-content-length: 66 Text-content-md5: 733984fbebed3846375b114cd16f7d0d Text-content-sha1: 62e6c078c4e5be2f4e25997edc8940945af78b31 Content-length: 105 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN#9'Y 7lnew_connection(addr, dummy_realhostnew_ Node-path: putty/proxy.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 15469 Text-content-md5: 544d2a82907344e633cf34d47cd7f875 Text-content-sha1: 12cb065a8915f520e2af31e2a97c060c6a8ff654 Content-length: 15585 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN___/* * Network proxy abstraction in PuTTY * * A proxy layer, if necessary, wedges itself between the network * code and the higher level backend. */ #include #define DEFINE_PLUG_METHOD_MACROS #include "putty.h" #include "network.h" #include "proxy.h" /* * Call this when proxy negotiation is complete, so that this * socket can begin working normally. */ void proxy_activate (Proxy_Socket p) { void *data; int len; p->lock_close = p->lock_write = p->lock_write_oob = p->lock_receive = p->lock_flush = p->lock_closing = p->lock_sent = p->lock_accepting = p->lock_freeze = 1; p->state = PROXY_STATE_ACTIVE; /* let's try to keep extra receive events from coming through */ sk_set_frozen(p->sub_socket, 1); while (bufchain_size(&p->pending_oob_output_data) > 0) { bufchain_prefix(&p->pending_oob_output_data, &data, &len); sk_write_oob(p->sub_socket, data, len); bufchain_consume(&p->pending_oob_output_data, len); } bufchain_clear(&p->pending_oob_output_data); while (bufchain_size(&p->pending_output_data) > 0) { bufchain_prefix(&p->pending_output_data, &data, &len); sk_write(p->sub_socket, data, len); bufchain_consume(&p->pending_output_data, len); } bufchain_clear(&p->pending_output_data); p->lock_write_oob = 0; p->lock_write = 0; if (p->pending_flush) sk_flush(p->sub_socket); p->lock_flush = 0; while (bufchain_size(&p->pending_input_data) > 0) { bufchain_prefix(&p->pending_input_data, &data, &len); plug_receive(p->plug, 0, data, len); bufchain_consume(&p->pending_input_data, len); } bufchain_clear(&p->pending_input_data); p->lock_receive = 0; /* now set the underlying socket to whatever freeze state they wanted */ sk_set_frozen(p->sub_socket, p->freeze); p->lock_freeze = 0; p->lock_sent = 0; p->lock_accepting = 0; p->lock_closing = 0; p->lock_close = 0; } /* basic proxy socket functions */ static Plug sk_proxy_plug (Socket s, Plug p) { Proxy_Socket ps = (Proxy_Socket) s; Plug ret = ps->plug; if (p) ps->plug = p; return ret; } static void sk_proxy_close (Socket s) { Proxy_Socket ps = (Proxy_Socket) s; while (ps->lock_close) ; sk_close(ps->sub_socket); sfree(ps); } static int sk_proxy_write (Socket s, char *data, int len) { Proxy_Socket ps = (Proxy_Socket) s; while (ps->lock_write) ; if (ps->state != PROXY_STATE_ACTIVE) { bufchain_add(&ps->pending_output_data, data, len); return bufchain_size(&ps->pending_output_data); } return sk_write(ps->sub_socket, data, len); } static int sk_proxy_write_oob (Socket s, char *data, int len) { Proxy_Socket ps = (Proxy_Socket) s; while (ps->lock_write_oob) ; if (ps->state != PROXY_STATE_ACTIVE) { bufchain_clear(&ps->pending_output_data); bufchain_clear(&ps->pending_oob_output_data); bufchain_add(&ps->pending_oob_output_data, data, len); return len; } return sk_write_oob(ps->sub_socket, data, len); } static void sk_proxy_flush (Socket s) { Proxy_Socket ps = (Proxy_Socket) s; while (ps->lock_flush) ; if (ps->state != PROXY_STATE_ACTIVE) { ps->pending_flush = 1; return; } sk_flush(ps->sub_socket); } static void sk_proxy_set_private_ptr (Socket s, void *ptr) { Proxy_Socket ps = (Proxy_Socket) s; sk_set_private_ptr(ps->sub_socket, ptr); } static void * sk_proxy_get_private_ptr (Socket s) { Proxy_Socket ps = (Proxy_Socket) s; return sk_get_private_ptr(ps->sub_socket); } static void sk_proxy_set_frozen (Socket s, int is_frozen) { Proxy_Socket ps = (Proxy_Socket) s; while (ps->lock_freeze) ; if (ps->state != PROXY_STATE_ACTIVE) { ps->freeze = is_frozen; return; } sk_set_frozen(ps->sub_socket, is_frozen); } static char * sk_proxy_socket_error (Socket s) { Proxy_Socket ps = (Proxy_Socket) s; if (ps->error != NULL || ps->sub_socket == NULL) { return ps->error; } return sk_socket_error(ps->sub_socket); } /* basic proxy plug functions */ static int plug_proxy_closing (Plug p, char *error_msg, int error_code, int calling_back) { Proxy_Plug pp = (Proxy_Plug) p; Proxy_Socket ps = pp->proxy_socket; while (ps->lock_closing) ; if (ps->state != PROXY_STATE_ACTIVE) { ps->closing_error_msg = error_msg; ps->closing_error_code = error_code; ps->closing_calling_back = calling_back; return ps->negotiate(ps, PROXY_CHANGE_CLOSING); } return plug_closing(ps->plug, error_msg, error_code, calling_back); } static int plug_proxy_receive (Plug p, int urgent, char *data, int len) { Proxy_Plug pp = (Proxy_Plug) p; Proxy_Socket ps = pp->proxy_socket; while (ps->lock_receive) ; if (ps->state != PROXY_STATE_ACTIVE) { /* we will lose the urgentness of this data, but since most, * if not all, of this data will be consumed by the negotiation * process, hopefully it won't affect the protocol above us */ bufchain_add(&ps->pending_input_data, data, len); ps->receive_urgent = urgent; ps->receive_data = data; ps->receive_len = len; return ps->negotiate(ps, PROXY_CHANGE_RECEIVE); } return plug_receive(ps->plug, urgent, data, len); } static void plug_proxy_sent (Plug p, int bufsize) { Proxy_Plug pp = (Proxy_Plug) p; Proxy_Socket ps = pp->proxy_socket; while (ps->lock_sent) ; if (ps->state != PROXY_STATE_ACTIVE) { ps->sent_bufsize = bufsize; ps->negotiate(ps, PROXY_CHANGE_SENT); return; } plug_sent(ps->plug, bufsize); } static int plug_proxy_accepting (Plug p, void *sock) { Proxy_Plug pp = (Proxy_Plug) p; Proxy_Socket ps = pp->proxy_socket; while (ps->lock_accepting) ; if (ps->state != PROXY_STATE_ACTIVE) { ps->accepting_sock = sock; return ps->negotiate(ps, PROXY_CHANGE_ACCEPTING); } return plug_accepting(ps->plug, sock); } static int proxy_for_destination (SockAddr addr, char * hostname, int port) { int s = 0, e = 0; char hostip[64]; int hostip_len, hostname_len; char * exclude_list; /* we want a string representation of the IP address for comparisons */ sk_getaddr(addr, hostip, 64); hostip_len = strlen(hostip); hostname_len = strlen(hostname); exclude_list = cfg.proxy_exclude_list; /* now parse the exclude list, and see if either our IP * or hostname matches anything in it. */ while (exclude_list[s]) { while (exclude_list[s] && (isspace(exclude_list[s]) || exclude_list[s] == ',')) s++; if (!exclude_list[s]) break; e = s; while (exclude_list[e] && (isalnum(exclude_list[e]) || exclude_list[e] == '-' || exclude_list[e] == '.' || exclude_list[e] == '*')) e++; if (exclude_list[s] == '*') { /* wildcard at beginning of entry */ if (strnicmp(hostip + hostip_len - (e - s - 1), exclude_list + s + 1, e - s - 1) == 0 || strnicmp(hostname + hostname_len - (e - s - 1), exclude_list + s + 1, e - s - 1) == 0) return 0; /* IP/hostname range excluded. do not use proxy. */ } else if (exclude_list[e-1] == '*') { /* wildcard at end of entry */ if (strnicmp(hostip, exclude_list + s, e - s - 1) == 0 || strnicmp(hostname, exclude_list + s, e - s - 1) == 0) return 0; /* IP/hostname range excluded. do not use proxy. */ } else { /* no wildcard at either end, so let's try an absolute * match (ie. a specific IP) */ if (stricmp(hostip, exclude_list + s) == 0) return 0; /* IP/hostname excluded. do not use proxy. */ if (stricmp(hostname, exclude_list + s) == 0) return 0; /* IP/hostname excluded. do not use proxy. */ } s = e; } /* no matches in the exclude list, so use the proxy */ return 1; } Socket new_connection(SockAddr addr, char *hostname, int port, int privport, int oobinline, int nodelay, Plug plug) { static struct socket_function_table socket_fn_table = { sk_proxy_plug, sk_proxy_close, sk_proxy_write, sk_proxy_write_oob, sk_proxy_flush, sk_proxy_set_private_ptr, sk_proxy_get_private_ptr, sk_proxy_set_frozen, sk_proxy_socket_error }; static struct plug_function_table plug_fn_table = { plug_proxy_closing, plug_proxy_receive, plug_proxy_sent, plug_proxy_accepting }; if (cfg.proxy_type != PROXY_NONE && proxy_for_destination(addr, hostname, port)) { Proxy_Socket ret; Proxy_Plug pplug; SockAddr proxy_addr; char * proxy_canonical_name; ret = smalloc(sizeof(struct Socket_proxy_tag)); ret->fn = &socket_fn_table; ret->plug = plug; ret->remote_addr = addr; ret->remote_port = port; bufchain_init(&ret->pending_input_data); bufchain_init(&ret->pending_output_data); bufchain_init(&ret->pending_oob_output_data); ret->lock_close = ret->lock_write = ret->lock_write_oob = ret->lock_receive = ret->lock_flush = ret->lock_closing = ret->lock_sent = ret->lock_accepting = 0; ret->sub_socket = NULL; ret->state = PROXY_STATE_NEW; if (cfg.proxy_type == PROXY_HTTP) { ret->negotiate = proxy_http_negotiate; } else if (cfg.proxy_type == PROXY_SOCKS) { ret->negotiate = proxy_socks_negotiate; } else if (cfg.proxy_type == PROXY_TELNET) { ret->negotiate = proxy_telnet_negotiate; } else { ret->error = "Network error: Unknown proxy method"; return (Socket) ret; } /* create the proxy plug to map calls from the actual * socket into our proxy socket layer */ pplug = smalloc(sizeof(struct Plug_proxy_tag)); pplug->fn = &plug_fn_table; pplug->proxy_socket = ret; /* look-up proxy */ proxy_addr = sk_namelookup(cfg.proxy_host, &proxy_canonical_name); sfree(proxy_canonical_name); /* create the actual socket we will be using, * connected to our proxy server and port. */ ret->sub_socket = sk_new(proxy_addr, cfg.proxy_port, privport, oobinline, nodelay, (Plug) pplug); if (sk_socket_error(ret->sub_socket) != NULL) return (Socket) ret; sk_addr_free(proxy_addr); /* start the proxy negotiation process... */ sk_set_frozen(ret->sub_socket, 0); ret->negotiate(ret, PROXY_CHANGE_NEW); return (Socket) ret; } /* no proxy, so just return the direct socket */ return sk_new(addr, port, privport, oobinline, nodelay, plug); } Socket new_listener(int port, Plug plug, int local_host_only) { /* TODO: SOCKS (and potentially others) support inbound * TODO: connections via the proxy. support them. */ return sk_newlistener(port, plug, local_host_only); } /* ---------------------------------------------------------------------- * HTTP CONNECT proxy type. */ static int get_line_end (char * data, int len) { int off = 0; while (off < len) { if (data[off] == '\n') { /* we have a newline */ off++; /* is that the only thing on this line? */ if (off <= 2) return off; /* if not, then there is the possibility that this header * continues onto the next line, if it starts with a space * or a tab. */ if (off + 1 < len && data[off+1] != ' ' && data[off+1] != '\t') return off; /* the line does continue, so we have to keep going * until we see an the header's "real" end of line. */ off++; } off++; } return -1; } int proxy_http_negotiate (Proxy_Socket p, int change) { if (p->state == PROXY_STATE_NEW) { /* we are just beginning the proxy negotiate process, * so we'll send off the initial bits of the request. * for this proxy method, it's just a simple HTTP * request */ char buf[1024], dest[21]; sk_getaddr(p->remote_addr, dest, 20); sprintf(buf, "CONNECT %s:%i HTTP/1.1\r\nHost: %s:%i\r\n\r\n", dest, p->remote_port, dest, p->remote_port); sk_write(p->sub_socket, buf, strlen(buf)); p->state = 1; return 0; } if (change == PROXY_CHANGE_CLOSING) { /* if our proxy negotiation process involves closing and opening * new sockets, then we would want to intercept this closing * callback when we were expecting it. if we aren't anticipating * a socket close, then some error must have occurred. we'll * just pass those errors up to the backend. */ return plug_closing(p->plug, p->closing_error_msg, p->closing_error_code, p->closing_calling_back); } if (change == PROXY_CHANGE_SENT) { /* some (or all) of what we wrote to the proxy was sent. * we don't do anything new, however, until we receive the * proxy's response. we might want to set a timer so we can * timeout the proxy negotiation after a while... */ return 0; } if (change == PROXY_CHANGE_ACCEPTING) { /* we should _never_ see this, as we are using our socket to * connect to a proxy, not accepting inbound connections. * what should we do? close the socket with an appropriate * error message? */ return plug_accepting(p->plug, p->accepting_sock); } if (change == PROXY_CHANGE_RECEIVE) { /* we have received data from the underlying socket, which * we'll need to parse, process, and respond to appropriately. */ void *data; int len; int eol; if (p->state == 1) { int min_ver, maj_ver, status; /* get the status line */ bufchain_prefix(&p->pending_input_data, &data, &len); eol = get_line_end(data, len); if (eol < 0) return 1; sscanf((char *)data, "HTTP/%i.%i %i", &maj_ver, &min_ver, &status); /* remove the status line from the input buffer. */ bufchain_consume(&p->pending_input_data, eol); /* TODO: we need to support Proxy-Auth headers */ if (status < 200 || status > 299) { /* error */ /* TODO: return a more specific error message, * TODO: based on the status code. */ plug_closing(p->plug, "Network error: Error while communicating with proxy", PROXY_ERROR_GENERAL, 0); return 1; } p->state = 2; } if (p->state == 2) { /* get headers. we're done when we get a * header of length 2, (ie. just "\r\n") */ bufchain_prefix(&p->pending_input_data, &data, &len); eol = get_line_end(data, len); while (eol > 2) { /* TODO: Proxy-Auth stuff. in some cases, we will * TODO: need to extract information from headers. */ bufchain_consume(&p->pending_input_data, eol); bufchain_prefix(&p->pending_input_data, &data, &len); eol = get_line_end(data, len); } if (eol == 2) { /* we're done */ bufchain_consume(&p->pending_input_data, 2); proxy_activate(p); /* proxy activate will have dealt with * whatever is left of the buffer */ return 1; } return 1; } } plug_closing(p->plug, "Network error: Unexpected proxy error", PROXY_ERROR_UNEXPECTED, 0); return 0; } /* ---------------------------------------------------------------------- * SOCKS proxy type (as yet unimplemented). */ int proxy_socks_negotiate (Proxy_Socket p, int change) { p->error = "Network error: SOCKS proxy implementation is incomplete"; return 0; } /* ---------------------------------------------------------------------- * `Telnet' proxy type (as yet unimplemented). * * (This is for ad-hoc proxies where you connect to the proxy's * telnet port and send a command such as `connect host port'. The * command is configurable, since this proxy type is typically not * standardised or at all well-defined.) */ int proxy_telnet_negotiate (Proxy_Socket p, int change) { p->error = "Network error: Telnet proxy implementation is incomplete"; return 0; } Node-path: putty/proxy.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3120 Text-content-md5: 530952f9c58ee69d0147d804d6b8923f Text-content-sha1: cc52f63f2bafd9e2bc43e20abf9bd9c234c72a93 Content-length: 3236 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN"""/* * Network proxy abstraction in PuTTY * * A proxy layer, if necessary, wedges itself between the * network code and the higher level backend. * * Supported proxies: HTTP CONNECT, generic telnet * In progress: SOCKS */ #ifndef PUTTY_PROXY_H #define PUTTY_PROXY_H #define PROXY_ERROR_GENERAL 8000 #define PROXY_ERROR_UNEXPECTED 8001 typedef struct Socket_proxy_tag * Proxy_Socket; struct Socket_proxy_tag { struct socket_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ char * error; Socket sub_socket; Plug plug; SockAddr remote_addr; int remote_port; bufchain pending_output_data; bufchain pending_oob_output_data; int pending_flush; bufchain pending_input_data; #define PROXY_STATE_NEW -1 #define PROXY_STATE_ACTIVE 0 int state; /* proxy states greater than 0 are implementation * dependent, but represent various stages/states * of the initialization/setup/negotiation with the * proxy server. */ int freeze; /* should we freeze the underlying socket when * we are done with the proxy negotiation? this * simply caches the value of sk_set_frozen calls. */ #define PROXY_CHANGE_NEW -1 #define PROXY_CHANGE_CLOSING 0 #define PROXY_CHANGE_SENT 1 #define PROXY_CHANGE_RECEIVE 2 #define PROXY_CHANGE_ACCEPTING 3 /* something has changed (a call from the sub socket * layer into our Proxy Plug layer, or we were just * created, etc), so the proxy layer needs to handle * this change (the type of which is the second argument) * and further the proxy negotiation process. */ int (*negotiate) (Proxy_Socket /* this */, int /* change type */); /* current arguments of plug handlers * (for use by proxy's negotiate function) */ /* closing */ char *closing_error_msg; int closing_error_code; int closing_calling_back; /* receive */ int receive_urgent; char *receive_data; int receive_len; /* sent */ int sent_bufsize; /* accepting */ void *accepting_sock; /* spin locks, for the critical switch from negotiating * to active state. we have to dump all of our pending * buffers without new events (read, writes, etc) corrupting * things. we should not have built up a large amount of * pending data during negotiation, so hopefully this will * not have a large effect on performance. */ char lock_close; char lock_write; char lock_write_oob; char lock_receive; char lock_flush; char lock_closing; char lock_sent; char lock_accepting; char lock_freeze; }; typedef struct Plug_proxy_tag * Proxy_Plug; struct Plug_proxy_tag { struct plug_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ Proxy_Socket proxy_socket; }; extern void proxy_activate (Proxy_Socket); extern int proxy_http_negotiate (Proxy_Socket, int); extern int proxy_telnet_negotiate (Proxy_Socket, int); extern int proxy_socks_negotiate (Proxy_Socket, int); #endif Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 386e0b92fcb44807c344258fbbc70f5e Text-delta-base-sha1: 3057149a4d49ce482951e19e5c1c8f9401180e6d Text-content-length: 319 Text-content-md5: 281ed1c54e652f3895ecb4dd27e3d23b Text-content-sha1: 1c9b2f0ba47cb0d20ec7353f7e678ac4237649b6 Content-length: 360 K 15 cvs2svn:cvs-rev V 5 1.137 PROPS-END SVN'U % %#Proxy options */ char proxy_exclude_list[512]; enum { PROXY_NONE, PROXY_HTTP, PROXY_SOCKS, PROXY_TELNET } proxy_type; char proxy_host[512]; int proxy_port; char proxy_username[32]; char proxy_password[32]; char proxy_telnet_command[512]; int proxy_socks_version Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 76d7c7b48b60d55ae669101a53913541 Text-delta-base-sha1: 71a1b98eeb3601d44bb7507fc4c15783fbc90176 Text-content-length: 51 Text-content-md5: 1a1901b96084b57c105610a34f2339fb Text-content-sha1: 5368dcbd15f091e13dfcb1c1d26b0d10a247097e Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNWj 5@new_connection(addr, *realhost Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4084015723d893ab0fbf962e001ae5c8 Text-delta-base-sha1: b980454168c2190bacde5f26bf51c94021e7c09d Text-content-length: 51 Text-content-md5: 1d6a5981c5eb3da2c9e065919d7be9fe Text-content-sha1: 1274a23218a5203464fc5061d173730a723d47d2 Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNH[ ItTnew_connection(addr, *realhost Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 19c38ac40a1fa2507bf0190475fc553d Text-delta-base-sha1: 77c4bc7f184fa527ae3f83267558d4579c0e6b4f Text-content-length: 1319 Text-content-md5: 3ace78e1ead30439e4e47b833fbbf67d Text-content-sha1: 4f11dd4dcbf20a3b39a5090d815ef77c95a68d5e Content-length: 1359 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN[b3=2HD /* proxy settings */ write_setting_s(sesskey, "ProxyExcludeList", cfg->proxy_exclude_list); write_setting_i(sesskey, "ProxyType", cfg->proxy_type); write_setting_s(sesskey, "ProxyHost", cfg->proxy_host); write_setting_i(sesskey, "ProxyPort", cfg->proxy_port); write_setting_s(sesskey, "ProxyUsername", cfg->proxy_username); write_setting_s(sesskey, "ProxyPassword", cfg->proxy_password); write_setting_s(sesskey, "ProxyTelnetCommand", cfg->proxy_telnet_command); write_setting_i(sesskey, "ProxySOCKSVersion", cfg->proxy_socks_version); /* proxy settings */ gpps(sesskey, "ProxyExcludeList", "", cfg->proxy_exclude_list, sizeof(cfg->proxy_exclude_list)); gppi(sesskey, "ProxyType", PROXY_NONE, &cfg->proxy_type); gpps(sesskey, "ProxyHost", "proxy", cfg->proxy_host, sizeof(cfg->proxy_host)); gppi(sesskey, "ProxyPort", 80, &cfg->proxy_port); gpps(sesskey, "ProxyUsername", "", cfg->proxy_username, sizeof(cfg->proxy_username)); gpps(sesskey, "ProxyPassword", "", cfg->proxy_password, sizeof(cfg->proxy_password)); gpps(sesskey, "ProxyTelnetCommand", "connect %host %port", cfg->proxy_telnet_command, sizeof(cfg->proxy_telnet_command)); gppi(sesskey, "ProxySOCKSVersion", 5, &cfg->proxy_socks_version); Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 01ca16268f22f419dd455ffa809c7249 Text-delta-base-sha1: 6fe816043233f1b4f097648fcb5d60fe1cdd2af3 Text-content-length: 92 Text-content-md5: 1b2e28b5d5e4fae1a31fa87e909ce71f Text-content-sha1: 8f63298116781fbc6538e5fb069d7036858a5c0d Content-length: 133 K 15 cvs2svn:cvs-rev V 5 1.199 PROPS-END SVN a new_connection(addr, *realhost  %s)", str)); crRet Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c8c90db5df2bdb87f907a6ee8627760e Text-delta-base-sha1: 62e0ba83cfeab69a7a00c9b2bc306ce57dbf41ff Text-content-length: 55 Text-content-md5: 3fea38ff72210e09c8acb3f7a5716991 Text-content-sha1: 4503e50f6ff7f7ef7157d13171af12696b70b683 Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNq _jnew_connection(addr, *realhost Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 060112a91a217db74c384a1117e345ff Text-delta-base-sha1: 0c6c4b4e854d46a474f9757971904aec54d72ae0 Text-content-length: 9331 Text-content-md5: abeb17e8c40972fe03c923096fa7965c Text-content-sha1: 53e1db927215e27e4ee866eb447fa5c396de3293 Content-length: 9372 K 15 cvs2svn:cvs-rev V 5 1.181 PROPS-END SVN~EJL7;IjoNw>MA)HG_hH<PzmHHuHzH*Q@dS> IL#proxypanelstart, IDC_TITLE_PROXY, IDC_BOX_PROXY1, IDC_PROXYTYPESTATIC, IDC_PROXYTYPENONE, IDC_PROXYTYPEHTTP, IDC_PROXYTYPESOCKS, IDC_PROXYTYPETELNET, IDC_PROXYHOSTSTATIC, IDC_PROXYHOSTEDIT, IDC_PROXYPORTSTATIC, IDC_PROXYPORTEDIT, IDC_PROXYEXCLUDESTATIC, IDC_PROXYEXCLUDEEDIT, IDC_PROXYUSERSTATIC, IDC_PROXYUSEREDIT, IDC_PROXYPASSSTATIC, IDC_PROXYPASSEDIT, IDC_BOX_PROXY2, IDC_PROXYTELNETCMDSTATIC, IDC_PROXYTELNETCMDEDIT, IDC_PROXYSOCKSVERSTATIC, IDC_PROXYSOCKSVER5, IDC_PROXYSOCKSVER4, proxy /* proxy config */ CheckRadioButton(hwnd, IDC_PROXYTYPENONE, IDC_PROXYTYPETELNET, cfg.proxy_type == PROXY_HTTP ? IDC_PROXYTYPEHTTP : cfg.proxy_type == PROXY_SOCKS ? IDC_PROXYTYPESOCKS : cfg.proxy_type == PROXY_TELNET ? IDC_PROXYTYPETELNET : IDC_PROXYTYPENONE); SetDlgItemText(hwnd, IDC_PROXYHOSTEDIT, cfg.proxy_host); SetDlgItemInt(hwnd, IDC_PROXYPORTEDIT, cfg.proxy_port, FALSE); SetDlgItemText(hwnd, IDC_PROXYEXCLUDEEDIT, cfg.proxy_exclude_list); SetDlgItemText(hwnd, IDC_PROXYTELNETCMDEDIT, cfg.proxy_telnet_command); SetDlgItemText(hwnd, IDC_PROXYUSEREDIT, cfg.proxy_username); SetDlgItemText(hwnd, IDC_PROXYPASSEDIT, cfg.proxy_password); CheckRadioButton(hwnd, IDC_PROXYSOCKSVER5, IDC_PROXYSOCKSVER4, cfg.proxy_socks_version == 4 ? IDC_PROXYSOCKSVER4 : IDC_PROXYSOCKSVER5proxypanelstart) { /* The Proxy panel. Accelerators used: [acgoh] ntslypeuwmvproxy usage", IDC_TITLE_PROXY); beginbox(&cp, "Proxy basics", IDC_BOX_PROXY1); radioline(&cp, "Proxy type:", IDC_PROXYTYPESTATIC, 4, "&None", IDC_PROXYTYPENONE, "H&TTP", IDC_PROXYTYPEHTTP, "&SOCKS", IDC_PROXYTYPESOCKS, "Te&lnet", IDC_PROXYTYPETELNET, NULL); multiedit(&cp, "Prox&y Host", IDC_PROXYHOSTSTATIC, IDC_PROXYHOSTEDIT, 80, "&Port", IDC_PROXYPORTSTATIC, IDC_PROXYPORTEDIT, 20, NULL); multiedit(&cp, "&Exclude Hosts/IPs", IDC_PROXYEXCLUDESTATIC, IDC_PROXYEXCLUDEEDIT, 100, NULL); staticedit(&cp, "&Username", IDC_PROXYUSERSTATIC, IDC_PROXYUSEREDIT, 60); staticedit(&cp, "Pass&word", IDC_PROXYPASSSTATIC, IDC_PROXYPASSEDIT, 60); endbox(&cp); beginbox(&cp, "Misc. proxy settings", IDC_BOX_PROXY2); multiedit(&cp, "Telnet co&mmand", IDC_PROXYTELNETCMDSTATIC, IDC_PROXYTELNETCMDEDIT, 100, NULL); radioline(&cp, "SOCKS &Version", IDC_PROXYSOCKSVERSTATIC, 2, "Version 5", IDC_PROXYSOCKSVER5, "Version 4", IDC_PROXYSOCKSVER4, NULLProxy");Proxy")) create_controls(hwnd, dlgtype, proxy /* proxy config */ case IDC_PROXYHOSTPROXYHOSTEDIT, cfg.proxy_host, sizeof(cfg.proxy_host) - 1); break; case IDC_PROXYPORTEDIT: if (HIWORD(wParam) == EN_CHANGE) { GetDlgItemText(hwnd, IDC_PROXYPORTEDIROXYPORTEDIT, &cfg.proxy_port); else { service = getservbyname(portname, NULL); if (service) cfg.proxy_port = ntohs(service->s_port); else cfg.proxy_port = 0; } } break; case IDC_PROXYEXCLUDEPROXYEXCLUDEEDIT, cfg.proxy_exclude_list, sizeof(cfg.proxy_exclude_list) - 1); break; case IDC_PROXYUSERPROXYUSEREDIT, cfg.proxy_username, sizeof(cfg.proxy_username) - 1); break; case IDC_PROXYPASSPROXYPASSEDIT, cfg.proxy_password, sizeof(cfg.proxy_password) - 1); break; case IDC_PROXYTELNETCMDPROXYTELNETCMDEDIT, cfg.proxy_telnet_command, sizeof(cfg.proxy_telnet_command) - 1); break; case IDC_PROXYSOCKSVER5: case IDC_PROXYSOCKSVER4 { cfg.proxy_socks_version = IsDlgButtonChecked(hwnd, IDC_PROXYSOCKSVER4) ? 4 : 5; } break; case IDC_PROXYTYPENONE: case IDC_PROXYTYPEHTTP: case IDC_PROXYTYPESOCKS: case IDC_PROXYTYPETELN { cfg.proxy_type = IsDlgButtonChecked(hwnd, IDC_PROXYTYPEHTTP) ? PROXY_HTTP : IsDlgButtonChecked(hwnd, IDC_PROXYTYPESOCKS) ? PROXY_SOCKS : IsDlgButtonChecked(hwnd, IDC_PROXYTYPETELNET) ? PROXY_TELNET : PROXY_NONE; } break; case IDC_LGFj{jaram) == EN_CHANGE) GetDlgItemText(hwnd, IDC_X11_DISPLAY, cfg.x11_display, sizeof(cfg.x11_display) - 1); break; case IDC_PFWDADD: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { char str[sizeof(cfg.portfwd)]; char *p; if (IsDlgButtonChecked(hwnd, IDC_PFWDLOCAL)) str[0] = 'L'; else str[0] = 'R'; GetDlgItemText(hwnd, IDC_SPORTEDIT, str+1, sizeof(str) - 2); if (!str[1]) { MessageBox(hwnd, "You need to specify a source port number", "PuTTY Error", MB_OK | MB_ICONERROR); break; } p = str + strlen(str); *p++ = '\t'; GetDlgItemText(hwnd, IDC_DPORTEDIT, p, sizeof(str) - 1 - (p - str)); if (!*p || !strchr(p, ':')) { MessageBox(hwnd, "You need to specify a destination address\n" "in the form \"host.name:port\"", "PuTTY Error", MB_OK | MB_ICONERROR); break; } p = cfg.portfwd; while (*p) { while (*p) p++; p++; } if ((p - cfg.portfwd) + strlen(str) + 2 < sizeof(cfg.portfwd)) { strcpy(p, str); p[strlen(str) + 1] = '\0'; SendDlgItemMessage(hwnd, IDC_PFWDLIST, LB_ADDSTRING, 0, (LPARAM) str); SetDlgItemText(hwnd, IDC_SPORTEDIT, ""); SetDlgItemText(hwnd, IDC_DPORTEDIT, ""); } else { MessageBox(hwnd, "Too many forwardings", "PuTTY Error", MB_OK | MB_ICONERROR); } } break; case IDC_PFWDREMOVE: if (HIWORD(wParam) != BN_CLICKED && HIWORD(wParam) != BN_DOUBLECLICKED) break; i = SendDlgItemMessage(hwnd, IDC_PFWDLIST, LB_GETCURSEL, 0, 0); if (i == LB_ERR) MessageBeep(0); else { char *p, *q; SendDlgItemMessage(hwnd, IDC_PFWDLIST, LB_DELETESTRING, i, 0); p = cfg.portfwd; while (i > 0) { if (!*p) goto disaster2; while (*p) p++; p++; i--; } q = p; if (!*p) goto disaster2; while (*p) p++; p++; while (*p) { while (*p) *q++ = *p++; *q++ = *p++; } *q = '\0'; disaster2:; } break; } return 0; case WM_HELP: if (help_path) { int id = ((LPHELPINFO)lParam)->iCtrlId; char *cmd = help_context_cmd(id); if (cmd) { WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); requested_help = TRUE; } else { MessageBeep(0); } } break; case WM_CLOSE: if (requested_help) { WinHelp(hwnd, help_path, HELP_QUIT, 0); requested_help = FALSE; } EndDialog(hwnd, 0); return 0; /* Grrr Explorer will maximize Dialogs! */ case WM_SIZE: if (wParam == SIZE_MAXIMIZED) force_normal(hwnd); return 0; default: /* * Handle application-defined messages eg. DragListBox */ /* First find out what the number is (once). */ if (draglistmsg == WM_NULL) draglistmsg = RegisterWindowMessage (DRAGLISTMSGSTRING); if (msg == draglistmsg) { /* Only process once dialog is fully formed. */ if (GetWindowLong(hwnd, GWL_USERDATA) == 1) switch (LOWORD(wParam)) { case IDC_CIPHERLIST: return handle_prefslist(&cipherlist, cfg.ssh_cipherlist, CIPHER_MAX, 1, hwnd, wParam, lParam); } } return 0; } return 0; } static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (msg == WM_COMMAND && LOWORD(wParam) == IDOK) { } if (msg == WM_COMMAND && LOWORD(wParam) == IDCX_ABOUT) { EnableWindow(hwnd, 0); DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc); EnableWindow(hwnd, 1); SetActiveWindow(hwnd); } return GenericMainDlgProc(hwnd, msg, wParam, lParam, 0); } static int CALLBACK ReconfDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { return GenericMainDlgProc(hwnd, msg, wParam, lParam, 1); } void defuse_showwindow(void) { /* * Work around the fact that the app's first call to ShowWindow * will ignore the default in favour of the shell-provided * setting. */ { HWND hwnd; hwnd = CreateDialog(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, NullDlgProc); ShowWindow(hwnd, SW_HIDE); SetActiveWindow(hwnd); DestroyWindow(hwnd); } } int do_config(void) { int ret; get_sesslist(TRUE); savedsession[0] = '\0'; ret = DialogBox(hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL, MainDlgProc); get_sesslist(FALSE); return ret; } int do_reconfig(HWND hwnd) { Config backup_cfg; int ret; backup_cfg = cfg; /* structure copy */ ret = DialogBox(hinst, MAKEINTRESOURCE(IDD_RECONF), hwnd, ReconfDlgProc); if (!ret) cfg = backup_cfg; /* structure copy */ return ret; } void logevent(char *string) { char timebuf[40]; time_t t; if (nevents >= negsize) { negsize += 64; events = srealloc(events, negsize * sizeof(*events)); } Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 42771f7eca4b0239d2bce82f3fb271f7 Text-delta-base-sha1: 0906b654f05b5e735f3a8c76b61f8f65f8372475 Text-content-length: 473 Text-content-md5: a6bdda25b14b6cc4459714894085cfe3 Text-content-sha1: 3e75736f1f6ded7d19d82b8998732b3dc60fb1dd Content-length: 513 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN@ nbIs$zU9L9KztLSHb"void sk_tcp_set_private_ptr(Socket s, void *ptr); static void *sk_tcp_get_private_ptr(Socket s); static void sk_tcp_set_frozen(Socket s, int is_frozet_private_ptr, sk_tcp_get_private_ptr, sk_tcp_set_frozenet_private_ptr, sk_tcp_get_private_ptr, sk_tcp_set_frozenshort localportet_private_ptr, sk_tcp_get_private_ptr, sk_tcp_set_frozenstatic void sk_tcpstatic void *sk_tcpstatic void sk_tcp Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7da2444b1e4cc448f100362ac9ee48b1 Text-delta-base-sha1: de86fadcb9154d5edc175db2b2e6c746debce6c8 Text-content-length: 56 Text-content-md5: a8cad6f714f53105f841aa361d30dc36 Text-content-sha1: fb453bd200d9ff56b068bbd06b4362b7fd262c4a Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN&> #u&new_connection(addr, dummy_realhost Revision-number: 1599 Prop-content-length: 262 Content-length: 262 K 7 svn:log V 161 Attempt to ensure that everything passed to connection_fatal() is also logged to the Event Log, so that it's easy to cut-and-paste the error message afterwards. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-03-23T18:04:27.000000Z PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1a1901b96084b57c105610a34f2339fb Text-delta-base-sha1: 5368dcbd15f091e13dfcb1c1d26b0d10a247097e Text-content-length: 66 Text-content-md5: 8a5c1a70c07ffb4963f7fe2370ef8563 Text-content-sha1: 0500e70bf97064a67155afdb30c6c671599ce4e5 Content-length: 106 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNj -etvlogevent(error_msg); connection_fatal("%s", Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1d6a5981c5eb3da2c9e065919d7be9fe Text-delta-base-sha1: 1274a23218a5203464fc5061d173730a723d47d2 Text-content-length: 66 Text-content-md5: 27f12fcfbd79a6cc16202cd599b47ca5 Text-content-sha1: 61fb2db810aaca3ad172b0f173a74396796b3404 Content-length: 106 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN[w -Glogevent(error_msg); connection_fatal("%s", Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1b2e28b5d5e4fae1a31fa87e909ce71f Text-delta-base-sha1: 8f63298116781fbc6538e5fb069d7036858a5c0d Text-content-length: 791 Text-content-md5: a24d0110e463e05fc2a751b99361e547 Text-content-sha1: 4c06c44f0ef00791c96b292cd4eb19712eae4796 Content-length: 832 K 15 cvs2svn:cvs-rev V 5 1.200 PROPS-END SVN,K#H 0@\V-0`X/* logevent, only printf-formatted. */ void logeventf(char *fmt, ...) { va_list ap; char stuff[200]; va_start(ap, fmt); vsprintf(stuff, fmt, ap); va_end(ap); logevent(stuff); logeventf msg,/* logevent(buf); (this is now done within the bombout macro) */logevent(error_msg);logevent("Unable to authenticate"oH2,WE; j < c->nciphers; j++) { if (in_commasep_string(c->list[j]->name, str, len)) { sccipher_tobe = c->list[j]; break; } } } if (sccipher_tobe) { if (warn) askcipher(sccipher_tobe->name, 2); break; } } if (!sccipher_tobe) { bombout(("Couldn't agree a server-to-client cipher (available: logevent("Unable to authenticate""%s", Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3fea38ff72210e09c8acb3f7a5716991 Text-delta-base-sha1: 4503e50f6ff7f7ef7157d13171af12696b70b683 Text-content-length: 68 Text-content-md5: 1ca124ed3f152e551824a5746e9b1922 Text-content-sha1: 1efebc77cb92c2229f2325c4587b8e9765886562 Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN -O$`logevent(error_msg); connection_fatal("%s", Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a6bdda25b14b6cc4459714894085cfe3 Text-delta-base-sha1: 3e75736f1f6ded7d19d82b8998732b3dc60fb1dd Text-content-length: 234 Text-content-md5: 7cb6f581db88cf30384d2fa5fab8a813 Text-content-sha1: 8786e26e88774297c2888245a6ee8639db169fd9 Content-length: 274 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNsG o0glogevent(winsock_error_string(err)); fatalbox("%s", char *str = (ret == 0 ? "Internal networking trouble" : winsock_error_string(WSAGetLastError())); logevent(str); fatalbox("%s", str Revision-number: 1600 Prop-content-length: 209 Content-length: 209 K 8 svn:date V 27 2002-03-23T18:59:46.000000Z K 7 svn:log V 108 Mention on the Feedback page that the mailing list archives are private, just in case anyone was concerned. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6a05a6ffbc8327d0c145a50c8b0f84b4 Text-delta-base-sha1: e53b723a8797f365e5e441df25c9959058472642 Text-content-length: 256 Text-content-md5: 37da8ba1f6db3a970825d1ab95838bc4 Text-content-sha1: c93287f72d724ef9517fb1b12c3182edcf2a69cb Content-length: 295 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNi gA52ut\versionid $Id: feedback.but,v 1.3 2002/03/23 18:59:4(Note that although the PuTTY contact address is a mailing list, the archives aren't publicly available, so you shouldn't be letting yourself in for any spam by sending us mail.) Revision-number: 1601 Prop-content-length: 198 Content-length: 198 K 7 svn:log V 98 Fix apparent cut'n'paste error in new printing code. (Wasn't breaking anything, to my knowledge.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-03-24T11:47:41.000000Z PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: abeb17e8c40972fe03c923096fa7965c Text-delta-base-sha1: 53e1db927215e27e4ee866eb447fa5c396de3293 Text-content-length: 113 Text-content-md5: 5de563285fa23058b03e9521b684a140 Text-content-sha1: 048025acb05c671715eb5e5f17eabfde5198d457 Content-length: 154 K 15 cvs2svn:cvs-rev V 5 1.182 PROPS-END SVNIOhIaram) == EN_CHANGE) GetDlgItemText(hwnd, IDC_X11_DISPLAY, cfg.x11_d{22I Revision-number: 1602 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2002-03-24T13:42:30.000000Z K 7 svn:log V 73 Added an entry for the "OpenSSH 3.1p1 built with wrong OpenSSL" problem. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c8650b3a9f55c2637e726d647e5e7fb0 Text-delta-base-sha1: 615b166590c515a206b6cc97960521aba7e44204 Text-content-length: 903 Text-content-md5: 46369d56c3c2ccbe38d79d51216e82f1 Text-content-sha1: c5a533f9b5c209f357b3a19c869139cf2a72e439 Content-length: 943 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNNjV82D \versionid $Id: faq.but,v 1.22 2002/03/24 13:42:30 jacobS{faq-broken-openssh31}{Question} Since my SSH server was upgraded to OpenSSH 3.1p1, I can no longer connect with PuTTY. There is a known problem when OpenSSH has been built against an incorrect version of OpenSSL; the quick workaround is to configure PuTTY to use SSH protocol 2 and the Blowfish cipher. This is not a PuTTY-specific problem; if you try to connect with another client you'll likely have similar problems. Configurations known to be broken and symptoms: \b SSH 2 with AES cipher (PuTTY says "Assertion failed! Expression: (len & 15) == 0" in sshaes.c, or "Out of memory", or crashes) \b SSH 1 with Blowfish (PuTTY says "Incorrect CRC received on packet") \b SSH 1 with 3DES For more details and OpenSSH patches, see \W{http://bugzilla.mindrot.org/show_bug.cgi?id=138}{bug 138} in the OpenSSH BTS Revision-number: 1603 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2002-03-24T14:08:13.000000Z K 7 svn:log V 40 OpenSSH 3.1p1 SSH2 3DES is also broken. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 46369d56c3c2ccbe38d79d51216e82f1 Text-delta-base-sha1: c5a533f9b5c209f357b3a19c869139cf2a72e439 Text-content-length: 155 Text-content-md5: 48feff255311bcc741ede6fbc93279a4 Text-content-sha1: d33e4cdd0d402ad8dcb5becc81f6bb13544a4210 Content-length: 195 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNJz'2 eh\versionid $Id: faq.but,v 1.23 2002/03/24 14:08:13(and symptoms)2 with 3DES (PuTTY says "Incorrect MAC received on packet" Revision-number: 1604 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:24.735216Z PROPS-END Revision-number: 1605 Prop-content-length: 206 Content-length: 206 K 8 svn:date V 27 2002-03-27T20:08:12.000000Z K 7 svn:log V 105 Add -w-pia to the Borland makefile (suppress warnings about assignment statements used as truth values). K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 63ef71dadb721ed20594ff16a80a48f1 Text-delta-base-sha1: 10a67fe09cb905cc207395982efc5e7802ae8d92 Text-content-length: 27 Text-content-md5: 68a07c1e78ce286c9a629bd7c417cb0b Text-content-sha1: 72390649588c1c7a679e48074c26bc151b6b9493 Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN$ -w-pia Revision-number: 1606 Prop-content-length: 329 Content-length: 329 K 7 svn:log V 228 Dominique Faure's patch (slightly modified) to implement the PuTTY saved-sessions menu in Pageant. Disabled if it can't find the PuTTY binary on startup (just like the help features are disabled if it can't find the help file). K 10 svn:author V 5 simon K 8 svn:date V 27 2002-03-27T20:30:57.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 75efc8ed58b87748bc73c6f6e0a1218b Text-delta-base-sha1: 1c13002041cc98a4c63b4080374ebd93a95f926f Text-content-length: 3677 Text-content-md5: b015fd85b39138b0b0cba01c61bcf163 Text-content-sha1: 83bd2292ccd45c555251d0afb8b2a219926e1cf6 Content-length: 3717 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVN"Vy|WwV M1!RSlGo2zwY6Lba_u*Q, sessionstatic char *putty_path; #define IDM_PUTTY 0x0060 #define IDM_SESSIONS_BASE 0x1000 #define IDM_SESSIONS_MAX 0x2000 #define PUTTY_REGKEY "Software\\SimonTatham\\PuTTY\\Sessions" #define PUTTY_DEFAULT "Default%20Settings" static int initial_menuitems_count; /* Un-munge session names out of the registry. */ static void unmungestr(char *in, char *out, int outlen) { while (*in) { if (*in == '%' && in[1] && in[2]) { int i, j; i = in[1] - '0'; i -= (i > 9 ? 7 : 0); j = in[2] - '0'; j -= (j > 9 ? 7 : 0); *out++ = (i << 4) + j; if (!--outlen) return; in += 3; } else { *out++ = *in++; if (!--outlen) return; } } *out = '\0'; return; }/* Update the saved-sessions menu. */ static void update_sessions(void) { int num_entries; HKEY hkey; TCHAR buf[MAX_PATH + 1]; MENUITEMINFO mii; int index_key, index_menu; if (!putty_path) return; if(ERROR_SUCCESS != RegOpenKey(HKEY_CURRENT_USER, PUTTY_REGKEY, &hkey)) return; for(num_entries = GetMenuItemCount(session_menu); num_entries > initial_menuitems_count; num_entries--) RemoveMenu(session_menu, 0, MF_BYPOSITION); index_key = 0; index_menu = 0; while(ERROR_SUCCESS == RegEnumKey(hkey, index_key, buf, MAX_PATH)) { TCHAR session_name[MAX_PATH + 1]; unmungestr(buf, session_name, MAX_PATH); if(strcmp(buf, PUTTY_DEFAULT) != 0) { memset(&mii, 0, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID; mii.fType = MFT_STRING; mii.fState = MFS_ENABLED; mii.wID = (index_menu * 16) + IDM_SESSIONS_BASE; mii.dwTypeData = session_name; InsertMenuItem(session_menu, index_menu, TRUE, &mii); index_menu++; } index_key++; } RegCloseKey(hkey); if(index_menu == 0) { mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE | MIIM_STATE; mii.fType = MFT_STRING; mii.fState = MFS_GRAYED; mii.dwTypeData = _T("(No sessions)"); InsertMenuItem(session_menu, index_menu, TRUE, &mii); }update_sessions()PUTTY: if((int)ShellExecute(hwnd, NULL, putty_path, _T(""), _T(""), SW_SHOW) <= 32) { MessageBox(NULL, "Unable to execute PuTTY!", "Error", MB_OK | MB_ICONERROR); } break; default: { if(wParam >= IDM_SESSIONS_BASE && wParam <= IDM_SESSIONS_MAX) { MENUITEMINFO mii; TCHAR buf[MAX_PATH + 1]; TCHAR param[MAX_PATH + 1]; memset(&mii, 0, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE; mii.cch = MAX_PATH; mii.dwTypeData = buf; GetMenuItemInfo(session_menu, wParam, FALSE, &mii); strcpy(param, "@"); strcat(param, mii.dwTypeData); if((int)ShellExecute(hwnd, NULL, putty_path, param, _T(""), SW_SHOW) <= 32) { MessageBox(NULL, "Unable to execute PuTTY!", "Error", MB_OK | MB_ICONERROR); } } Look for the PuTTY binary (we will enable the saved session * submenu if we find it)exe"); if ( (fp = fopen(b, "r")) != NULL) { putty_path = dupstr(b); fclose(fp); } else putty/* Accelerators used: nsvkxa */ systray_menu = CreatePopupMenu(); if (putty_path) { session_menu = CreateMenu(); AppendMenu(systray_menu, MF_ENABLED, IDM_PUTTY, "&New Session"); AppendMenu(systray_menu, MF_POPUP | MF_ENABLED, (UINT) session_menu, "&Saved Sessions"); AppendMenu(systray_menu, MF_SEPARATOR, 0, 0); } initial_menuitems_count = GetMenuItemCount(session_menureturn msg.wParam; } Revision-number: 1607 Prop-content-length: 289 Content-length: 289 K 8 svn:date V 27 2002-03-27T21:09:16.000000Z K 7 svn:log V 188 Updates to proxy support, both from me and from Justin Bradford. Removed unnecessary spin locks, added a few comments, added support for Telnet-type proxies, and wrote some documentation. K 10 svn:author V 5 simon PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 270b1f76b20f4a14a48244e3b8f16dc5 Text-delta-base-sha1: 5f242926643936afa43313fb1ba3963657356223 Text-content-length: 38 Text-content-md5: 93b1c11df40c9d34fa6b0da3e036738c Text-content-sha1: 91a7bfc43a20c240f84b45fca3add3388c7a80eb Content-length: 77 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN7H //Justin Bradford, Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2647c21c751d1f93f7fbe949b279dd41 Text-delta-base-sha1: 4aec3c359e31fdbcb098a772591fb4470563398d Text-content-length: 3575 Text-content-md5: 55b328501f3b4f7ae142b193273df858 Text-content-sha1: 85b38ab2507afecb91e816132b4b599998c41b0a Content-length: 3615 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNX Y(5$P\versionid $Id: config.but,v 1.30 2002/03/27 21:09:16proxy} The Proxy panel The Proxy panel allows you to configure PuTTY to use various types of proxy in order to make its network connections. The settings in this panel affect the primary network connection forming your PuTTY session, but also any extra connections made as a result of SSH port forwarding (see \k{using-port-forwarding}). \S{config-proxy-type} Setting the proxy type The \q{Proxy type} radio buttons allow you to configure what type of proxy you want PuTTY to use for its network connections. The default setting is \q{None}; in this mode no proxy is used for any connection. \b Selecting \q{HTTP} allows you to proxy your connections through a web server supporting the HTTP \cw{CONNECT} command, as documented in \W{http://www.ietf.org/rfc/rfc2817.txt}{RFC 2817}. \b Selecting \q{SOCKS} allows you to proxy your connections through a SOCKS server. \b Many firewalls implement a less formal type of proxy in which a user can make a Telnet connection directly to the firewall machine and enter a command such as \c{connect myhost.com 22} to connect through to an external host. Selecting \q{Telnet} allows you to tell PuTTY to use this type of proxy. Note [FIXME] that SOCKS is not yet supported, although it should be by the time we make our next release. \S{config-proxy-exclude} Excluding parts of the network from proxying Typically you will only need to use a proxy to connect to non-local parts of your network; for example, your proxy might be required for connections outside your company's internal network. In the \q{Exclude Hosts/IPs} box you can enter ranges of IP addresses, or ranges of DNS names, for which PuTTY will avoid using the proxy and make a direct connection instead. The \q{Exclude Hosts/IPs} box may contain more than one exclusion range, separated by commas. Each range can be an IP address or a DNS name, with a \c{*} character allowing wildcards. For example: \c *.example.com This excludes any host with a name ending in \c{.example.com} from proxying. \c 192.168.88.* This excludes any host with an IP address starting with 192.168.88 from proxying. \c 192.168.88.*,*.example.com This excludes both of the above ranges at once. \S{config-proxy-auth} Username and password If your proxy requires authentication, you can enter a username and a password in the \q{Username} and \q{Password} boxes. Currently these boxes have no effect ( [FIXME] presumably they're for SOCKS only). \S{config-proxy-command} Specifying the Telnet proxy command If you are using the Telnet proxy type, the usual command required by the firewall's Telnet server is \c{connect}, followed by a host name and a port number. If your proxy needs a different command, you can enter an alternative here. In this string, you can use \c{\\n} to represent a new-line, \c{\\r} to represent a carriage return, \c{\\t} to represent a tab character, and \c{\\x} followed by two hex digits to represent any other character. \c{\\\\} is used to encode the \c{\\} character itself. Also, the special strings \c{%host} and \c{%port} will be replaced by the host name and port number you want to connect to. To get a literal \c{%} sign, enter \c{%%}. \S{config-proxy-socksver} Selecting the version of the SOCKS protocol SOCKS servers exist in two versions: version 5 (\W{http://www.ietf.org/rfc/rfc1928.txt}{RFC 1928}) and the earlier version 4. The \q{SOCKS Version} radio buttons allow you to select which one to use, if you have selected the SOCKS proxy type Node-path: putty/doc/licence.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 15b52157f6b7ee6d0833e3b11bce28cd Text-delta-base-sha1: 927c166cff9bc1825dec5fe26816fb7dd10ce5e8 Text-content-length: 92 Text-content-md5: 92e67c8fb773602fa2f45c67731ca102 Text-content-sha1: 9fcf5e3fcd8696a90e36bc2287a65c1ed26cf3b7 Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN& FX5 \versionid $Id: licence.but,v 1.4 2002/03/27 21:09:16Justin Bradford, Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 639d5351f85ef626d89aa3cd5f857fc2 Text-delta-base-sha1: 0d77a3cfb07b92aab25e4a4179611dd6ad75dc1f Text-content-length: 36 Text-content-md5: 81322bc268dcc1d66c6487b624645836 Text-content-sha1: aad834ba1cb7e4e34ca9535ee084e04639cbf064 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNXi Z~Justin Bradford Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 544d2a82907344e633cf34d47cd7f875 Text-delta-base-sha1: 12cb065a8915f520e2af31e2a97c060c6a8ff654 Text-content-length: 4311 Text-content-md5: fdfb089aa42e74d4cb2534686fcbd177 Text-content-sha1: 1fc04412f295a88646754984c6bb0f395c5b4285 Content-length: 4350 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN_ qYD pwOx{;2mX@{51N;`x'tX<8WuE7Qb}zP/* send buffered OOB writes *//* send buffered normal writes *//* if we were asked to flush the output during * the proxy negotiation process, do so now. */ if (p->pending_flush) sk_flush(p->sub_socket); /* forward buffered recv data to the backend */256], dest[64]; sk_getaddr(p->remote_addr, dest, 64if (p->state == PROXY_CHANGE_NEW) { int so = 0, eo = 0; /* we need to escape \\, \%, \r, \n, \t, \x??, \0???, * %%, %host, and %port */ while (cfg.proxy_telnet_command[eo] != 0) { /* scan forward until we hit end-of-line, * or an escape character (\ or %) */ while (cfg.proxy_telnet_command[eo] != 0 && cfg.proxy_telnet_command[eo] != '%' && cfg.proxy_telnet_command[eo] != '\\') eo++; /* if we hit eol, break out of our escaping loop */ if (cfg.proxy_telnet_command[eo] == 0) break; /* if there was any unescaped text before the escape * character, send that now */ if (eo != so) { sk_write(p->sub_socket, cfg.proxy_telnet_command + so, eo - so); } so = eo++; /* if the escape character was the last character of * the line, we'll just stop and send it. */ if (cfg.proxy_telnet_command[eo] == 0) break; if (cfg.proxy_telnet_command[so] == '\\') { /* we recognize \\, \%, \r, \n, \t, \x??. * anything else, we just send unescaped (including the \). */ switch (cfg.proxy_telnet_command[eo]) { case '\\': sk_write(p->sub_socket, "\\", 1); eo++; break; case '%': sk_write(p->sub_socket, "%%", 1); eo++; break; case 'r': sk_write(p->sub_socket, "\r", 1); eo++; break; case 'n': sk_write(p->sub_socket, "\n", 1); eo++; break; case 't': sk_write(p->sub_socket, "\t", 1); eo++; break; case 'x': case 'X': { /* escaped hexadecimal value (ie. \xff) */ unsigned char v = 0; int i = 0; for (;;) { eo++; if (cfg.proxy_telnet_command[eo] >= '0' && cfg.proxy_telnet_command[eo] <= '9') v += cfg.proxy_telnet_command[eo] - '0'; else if (cfg.proxy_telnet_command[eo] >= 'a' && cfg.proxy_telnet_command[eo] <= 'f') v += cfg.proxy_telnet_command[eo] - 'a' + 10; else if (cfg.proxy_telnet_command[eo] >= 'A' && cfg.proxy_telnet_command[eo] <= 'F') v += cfg.proxy_telnet_command[eo] - 'A' + 10; else { /* non hex character, so we abort and just * send the whole thing unescaped (including \x) */ sk_write(p->sub_socket, "\\", 1); eo = so + 1; break; } /* we only extract two hex characters */ if (i == 1) { sk_write(p->sub_socket, &v, 1); eo++; break; } i++; v <<= 4; } } break; default: sk_write(p->sub_socket, cfg.proxy_telnet_command + so, 2); eo++; break; } } else { /* % escape. we recognize %%, %host, %port. anything else, * we just send unescaped (including the %). */ if (cfg.proxy_telnet_command[eo] == '%') { sk_write(p->sub_socket, "%", 1); eo++; } else if (strnicmp(cfg.proxy_telnet_command + eo, "host", 4) == 0) { char dest[64]; sk_getaddr(p->remote_addr, dest, 64); sk_write(p->sub_socket, dest, strlen(dest)); eo += 4; } else if (strnicmp(cfg.proxy_telnet_command + eo, "port", 4) == 0) { char port[8]; sprintf(port, "%i", p->remote_port); sk_write(p->sub_socket, port, strlen(port)); eo += 4; } else { /* we don't escape this, so send the % now, and * don't advance eo, so that we'll consider the * text immediately following the % as unescaped. */ sk_write(p->sub_socket, "%", 1); } } /* resume scanning for additional escapes after this one. */ so = eo; } /* if there is any unescaped text at the end of the line, send it */ if (eo != so) { sk_write(p->sub_socket, cfg.proxy_telnet_command + so, eo - so); }/* we're done */ proxy_activate(p); /* proxy activate will have dealt with * whatever is left of the buffer */ return 1; Node-path: putty/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 530952f9c58ee69d0147d804d6b8923f Text-delta-base-sha1: cc52f63f2bafd9e2bc43e20abf9bd9c234c72a93 Text-content-length: 20 Text-content-md5: 5e1af6e983d2876a581f549cb8dce76d Text-content-sha1: 776e71eb2cc96c395a55f9302a42cfaaaf687c48 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN"l 66l Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7a5ca2fafbaa7151fd8f3b815b4f7230 Text-delta-base-sha1: de61f898956830c6e46a6df9e6532b367d1fd434 Text-content-length: 36 Text-content-md5: 5d3320bedf5be385dd7aaa261a123d4f Text-content-sha1: 5385ea3232c841117236ca4239020a7475694416 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN  3[1Justin Bradford Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ace78e1ead30439e4e47b833fbbf67d Text-delta-base-sha1: 4f11dd4dcbf20a3b39a5090d815ef77c95a68d5e Text-content-length: 26 Text-content-md5: ea0fbd9d90014e56483c06d6ca2c5b6d Text-content-sha1: 8ec8c494fed7d6c7141502585b8ca63cef7c10cc Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVNbe A!A\\n Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7a0e15cda1ec4ff3785541d5ef84046a Text-delta-base-sha1: 85430d7ec23ac4fb5901af7c857936d432a70a61 Text-content-length: 36 Text-content-md5: 0dd5bcc1a982cc0200201c145777575b Text-content-sha1: 92283e2d0926345147017920ca1b8784de05c5d9 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN^o XJustin Bradford Revision-number: 1608 Prop-content-length: 195 Content-length: 195 K 8 svn:date V 27 2002-03-27T21:43:37.000000Z K 7 svn:log V 95 Matt Harden's (modified) patch to do getservbyname() lookups on port- forwarding port numbers. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a24d0110e463e05fc2a751b99361e547 Text-delta-base-sha1: 4c06c44f0ef00791c96b292cd4eb19712eae4796 Text-content-length: 3134 Text-content-md5: 79189b88667201db7fd9ea6a5198db51 Text-content-sha1: c6085fbb792b44a610b34446a7410dcfacd48bdc Content-length: 3175 K 15 cvs2svn:cvs-rev V 5 1.201 PROPS-END SVN(ct]S0>{gtDagc,sserv,dserv; char sports[256], dports[256], host[256]; char buf[1024]; struct servent *sedserv = 0; if (dport == 0) { dserv = 1; se = getservbyname(dports, NULL); if (se != NULL) { dport = ntohs(se->s_port); } else { sprintf(buf, "Service lookup failed for destination port \"%s\"", dports); logevent(buf); } } sport = atoi(sports); sserv = 0; if (sport == 0) { sserv = 1; se = getservbyname(sports, NULL); if (se != NULL) { sport = ntohs(se->s_port); } else { sprintf(buf, "Service lookup failed for source port \"%s\"", sports); logevent(buf); } }.*s%.*s%d%.*s forwarding to" " %s:%.*s%.*s%d%.*s", sserv ? strlen(sports) : 0, sports, sserv, "(", sport, sserv, ")", host, dserv ? strlen(dports) : 0, dports, dserv, "(", dport, dserv, ")".*s%.*s%d%.*s" " forward to %s:%.*s%.*s%d%.*s", sserv ? strlen(sports) : 0, sports, sserv, "(", sport, sserv, ")", host, dserv ? strlen(dports) : 0, dports, dserv, "(", dport, dserv, ")"y8abX\`4@&]Sb>{Jg va_2i++) { if (in_commasep_string(hostkey_algs[i]->name, str, len)) { hostkey = hostkey_algs[i]; break; } } ssh2_pkt_getstring(&str, &len); /* client->server cipher */ warn = 0; for (i = 0; i < n_preferred_ciphers; i++) { const struct ssh2_ciphers *c = preferred_ciphers[i]; if (!c) { warn = 1; } else { for (j = 0cscipher_tobe = c->list[j]; break; } } } if (cscipher_tobe) { if (warn) askcipher(cscipher_tobe->name, 1); break; } } if (!cscipher_tobe) { bombout(("Couldn't agree a client-to-serverserver->client cipher */ warn = 0; for (i = 0; i < n_preferred_ciphers; i++) { const struct ssh2_ciphers *c = preferred_ciphers[i]; if (!c) { warn = 1; } else { for (j = 0,sserv,dserv; char sports[256], dports[256], host[256]; char buf[1024]; struct servent *sedserv = 0; if (dport == 0) { dserv = 1; se = getservbyname(dports, NULL); if (se != NULL) { dport = ntohs(se->s_port); } else { sprintf(buf, "Service lookup failed for destination port \"%s\"", dports); logevent(buf); } } sport = atoi(sports); sserv = 0; if (sport == 0) { sserv = 1; se = getservbyname(sports, NULL); if (se != NULL) { sport = ntohs(se->s_port); } else { sprintf(buf, "Service lookup failed for source port \"%s\"", sports); logevent(buf); } }.*s%.*s%d%.*s forwarding to" " %s:%.*s%.*s%d%.*s", sserv ? strlen(sports) : 0, sports, sserv, "(", sport, sserv, ")", host, dserv ? strlen(dports) : 0, dports, dserv, "(", dport, dserv, ")".*s%.*s%d%.*s" " forward to %s:%.*s%.*s%d%.*s", sserv ? strlen(sports) : 0, sports, sserv, "(", sport, sserv, ")", host, dserv ? strlen(dports) : 0, dports, dserv, "(", dport, dserv, ")" Revision-number: 1609 Prop-content-length: 434 Content-length: 434 K 8 svn:date V 27 2002-03-27T21:58:11.000000Z K 7 svn:log V 333 Remember to wait for SSH1_MSG_SUCCESS after enabling remote port forwardings in SSH1. Was causing several MSG_SUCCESS to be queued up unread, which was wrong-but-benign in most cases but caused a hard crash with compression enabled (one of those uncompressed MSG_SUCCESSes was fed to the zlib decompressor with spectacular results). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 79189b88667201db7fd9ea6a5198db51 Text-delta-base-sha1: c6085fbb792b44a610b34446a7410dcfacd48bdc Text-content-length: 850 Text-content-md5: 2fb6077c26ab9340f07f04e080523e93 Text-content-sha1: ea0ac36c2f2e682b35a3e0693ec6c6b79888edde Content-length: 891 K 15 cvs2svn:cvs-rev V 5 1.202 PROPS-END SVN VaW}>3; static char do { crReturnV; } while (!ispkt); if (pktin.type != SSH1_SMSG_SUCCESS && pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crReturnV; } else if (pktin.type == SSH1_SMSG_FAILURE) { c_write_str("Server refused port forwarding\r\n"); ssh_editing = ssh_echoing = 1; } logevent("Remote port forwarding enabled"yysccomp_tobe = NULL; pktin.savedpos += 16; /* skip garbage cookie */ ssh2_pkt_getstring(&str, &len); /* key exchange algorithms */ for (i = 0; i < lenof(kex_algs); i++) { if (in_commasep_string(kex_algs[i]->name, str, len)) { kex = kex_algs[i]; break; } } ssh2_pkt_getstring(&str, &len); /* host key algorithms */ for (i = 0; i < lenof(hostkey_algs); Revision-number: 1610 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:25.451486Z PROPS-END Revision-number: 1611 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2002-03-31T16:23:32.000000Z K 7 svn:log V 96 Fix bug in Minefield's realloc() which was throwing away most of any block > 4096 bytes. Arrgh. K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9f8e2bec04575e14341810ff9b465da2 Text-delta-base-sha1: c4624368882302ddde3f761f522776a259d511b0 Text-content-length: 22 Text-content-md5: 1e7798bcd44c88de3da8509b279aff1a Text-content-sha1: 4a823470ccf4800e7f10f562a1c9ab7687583333 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN]] '5(+ Revision-number: 1612 Prop-content-length: 191 Content-length: 191 K 7 svn:log V 91 Fix major memory leak in sftp_cmd_ls (thanks to Hans-Juergen Petrich for pointing it out). K 10 svn:author V 5 simon K 8 svn:date V 27 2002-03-31T16:26:13.000000Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ea4113602463b46c9202aeb46a421c20 Text-delta-base-sha1: 79ec723dac58161a67862bafdf2ce7759e013c29 Text-content-length: 336 Text-content-md5: fe6f2af31456f15c660f2e802f0df7f7 Text-content-sha1: 708bb0b6a56f11f60b7336426b71bb6b6d1c974b Content-length: 376 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNFy#v! u~db(const *a = (const struct fxp_name *const *) av; const struct fxp_name *const *b = (const struct fxp_name *const *) bv; return strcmp((*a)->filename, (*b)fxp_dup_name(&names->names[i]); { printf("%s\n", ournames[i]->longname); fxp_free_name(ournames[i]); } sfree(ournames Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fa64fef8412fda667d8abc79365fe450 Text-delta-base-sha1: 0dd768e3ea214cfacfe59b0ef9149dcc7f26a291 Text-content-length: 525 Text-content-md5: 3f6c064be95fbd18b8ae50d55d1d43ab Text-content-sha1: aebe7b3dfbc731f8f7ede008ad4bf3999d1fbb0f Content-length: 565 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVND< sDs? /* * Duplicate an fxp_name structure. */ struct fxp_name *fxp_dup_name(struct fxp_name *name) { struct fxp_name *ret; ret = smalloc(sizeof(struct fxp_name)); ret->filename = dupstr(name->filename); ret->longname = dupstr(name->longname); ret->attrs = name->attrs; /* structure copy */ return ret; } /* * Free up an fxp_name structure. */ void fxp_free_name(struct fxp_name *name) { int i; sfree(name->filename); sfree(name->longname); sfree(name Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ec18cde157a8962ede35e0964352c90e Text-delta-base-sha1: 4df187c0bfcd8d17dc497ba702f883bebeecd8e5 Text-content-length: 167 Text-content-md5: 4319c23960fcd34a3bf57953b153d625 Text-content-sha1: 5ec95d05f961c71ab1d9b91a84c8804c28a44ae9 Content-length: 206 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN /* * Duplicate and free fxp_name structures. */ struct fxp_name *fxp_dup_name(struct fxp_name *name); void fxp_free_name(struct fxp_name *name); Revision-number: 1613 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 2002-03-31T16:28:06.000000Z K 7 svn:log V 161 The console version of askappend() completely forgot to check cfg.logxfovr to see whether the user had already specified what should happen to log files. Fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 91cfaa9b1d3f13b3bdba133ea7055b60 Text-delta-base-sha1: 2aec188ab6dea94a8c96639cf940f33de8fe2006 Text-content-length: 100 Text-content-md5: eaa006f1004cce1684764be162bf06e4 Text-content-sha1: 0041024d5916155b5bb43f25f89641e30f5e04a5 Content-length: 139 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNr N"Nfg.logxfovr != LGXF_ASK) { return ((cfg.logxfovr == LGXF_OVR) ? 2 : 1); } Revision-number: 1614 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2002-04-01T15:18:29.000000Z K 7 svn:log V 35 Add a couple of extra FAQ entries. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 48feff255311bcc741ede6fbc93279a4 Text-delta-base-sha1: d33e4cdd0d402ad8dcb5becc81f6bb13544a4210 Text-content-length: 1583 Text-content-md5: 9c19696a33334f9e485aa67bed5e695d Text-content-sha1: aee8fc7639cddf498f42afa6616c2877b0b40b9a Content-length: 1623 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNJ.Z8ZB\versionid $Id: faq.but,v 1.24 2002/04/01 15:18:29 simonoutofmem2}{Question} When attempting a file transfer, either PSCP or PSFTP says \q{Out of memory} and dies. This is almost always caused by your login scripts on the server generating output. PSCP or PSFTP will receive that output when they were expecting to see the start of a file transfer protocol, and they will attempt to interpret the output as file-transfer protocol. This will usually lead to an \q{out of memory} error for much the same reasons as given in \k{faq-outofmem}. This is a setup problem in your account on your server, \e{not} a PSCP/PSFTP bug. Your login scripts should \e{never} generate output during non-interactive sessions; secure file transfer is not the only form of remote access that will break if they do. On Unix, a simple fix is to ensure that all the parts of your login script that might generate output are in \c{.profile} (if you use a Bourne shell derivative) or \c{.login} (if you use a C shell). Putting them in more general files such as \c{.bashrc} or \c{.cshrc} is liable to lead to problems. \S{faq-psftp-slow} PSFTP transfers files much slower than PSCP. We believe this is because the SFTP and SSH2 protocols are less efficient at bulk data transfer than SCP and SSH1, because every block of data transferred requires an acknowledgment from the far end. It would in theory be possible to queue several blocks of data to get round this speed problem, but as yet we haven't done the coding. If you really want this fixed, feel free to offer to help Revision-number: 1615 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2002-04-03T18:24:59.000000Z K 7 svn:log V 80 Mention that numeric code pages can be entered manually in the Translation box. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 55b328501f3b4f7ae142b193273df858 Text-delta-base-sha1: 85b38ab2507afecb91e816132b4b599998c41b0a Text-content-length: 307 Text-content-md5: 940965428204647a7c10cbb2670160a5 Text-content-sha1: 96344005f4217c4930a437e4459ef3ce04a2782d Content-length: 347 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN m}5`[.\versionid $Id: config.but,v 1.31 2002/04/03 18:24:59If you need support for a numeric code page which is not listed in the drop-down list, such as code page 866, then you should be able to enter its name manually (\c{CP866} for example) in the list box and get the right resul Revision-number: 1616 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2002-04-10T19:54:42.000000Z K 7 svn:log V 62 The SFTP form of PSCP should remember to send FXP_INIT! Oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 12098b868d8dfbf8e69379e8589d0015 Text-delta-base-sha1: 3735afdf2bfef0f65f0040c20605daab5ffd9f83 Text-content-length: 267 Text-content-md5: 00c3d0371cbc598ab899b77246d8dd52 Text-content-sha1: 41521e49132f4db932a71263c96f4ea9afd22299 Content-length: 307 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVN|gnya'init()) { tell_user(stderr, "unable to initialise SFTP: %s", fxp_error()); errs++; return 1; } if (!fxp_init()) { tell_user(stderr, "unable to initialise SFTP: %s", fxp_error()); errs++; return 1; } Revision-number: 1617 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:25.818987Z PROPS-END Revision-number: 1618 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:25.832809Z PROPS-END Revision-number: 1619 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2002-04-18T20:45:01.000000Z K 7 svn:log V 76 Added documentation of PuTTY command-line options (derived from the source) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5107cc429d28af351d7935b4756c428a Text-delta-base-sha1: ef2db94dd4c91a8c6c445a18b07af9695bd94745 Text-content-length: 1272 Text-content-md5: 452c73072afdb31f2e249c160f9f3413 Text-content-sha1: d8d3cb66cda89eb29f91d78255ce49aba8964ddd Content-length: 1311 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN (except for Ryan Finnie's extra messages). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 00c3d0371cbc598ab899b77246d8dd52 Text-delta-base-sha1: 41521e49132f4db932a71263c96f4ea9afd22299 Text-content-length: 1263 Text-content-md5: 7ff84f943ddadcacd1025ed8b3cf78e4 Text-content-sha1: 63a153e589b9741220f5438a36e129f51a06d25c Content-length: 1303 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVN|JE{g9t^^,s /* This is just a base value from which the main message numbers are * derived. */ #define WM_APP_BASE 0x8000 /* These two pass a single character value in wParam. They represent * the visible output from PSCP. */ #define WM_STD_OUT_CHAR ( WM_APP_BASE+400 ) #define WM_STD_ERR_CHAR ( WM_APP_BASE+401 ) /* These pass a transfer status update. WM_STATS_CHAR passes a single * character in wParam, and is called repeatedly to pass the name of * the file, terminated with "\n". WM_STATS_SIZE passes the size of * the file being transferred in wParam. WM_STATS_ELAPSED is called * to pass the elapsed time (in seconds) in wParam, and * WM_STATS_PERCENT passes the percentage of the transfer which is * complete, also in wParam. */ /* These are used at the end of a run to pass an error code in * wParam: zero means success, nonzero means failure. WM_RET_ERR_CNT * is used after a copy, and WM_LS_RET_ERR_CNT is used after a file * list operation. */ /* More transfer status update messages. WM_STATS_DONE passes the * number of bytes sent so far in wParam. WM_STATS_ETA passes the * estimated time to completion (in seconds). WM_STATS_RATEBS passes * the average transfer rate (in bytes per second). */ Revision-number: 1621 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:25.959284Z PROPS-END Revision-number: 1622 Prop-content-length: 238 Content-length: 238 K 7 svn:log V 137 SOCKS proxy support added (next instalment of Justin Bradford's proxy work). SOCKS 5 username/password authentication still unsupported. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-04-27T15:01:18.000000Z PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f48dcaf1fe9ed35510aa4602a448b5d8 Text-delta-base-sha1: 063563b16273992b589d03f4f48fd6f0f1a97c5b Text-content-length: 95 Text-content-md5: e97a92a7111286a95e1765175f7436da Text-content-sha1: ff65f4c55939c6e0e955cd85f6d3d11f74541b5a Content-length: 135 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN X II int sk_addrtype(SockAddr addr); void sk_addrcopy(SockAddr addr, char *buf Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fdfb089aa42e74d4cb2534686fcbd177 Text-delta-base-sha1: 1fc04412f295a88646754984c6bb0f395c5b4285 Text-content-length: 7449 Text-content-md5: 39bded47a5eb8c49f09eedf6f74835f5 Text-content-sha1: f86d4143a68b0d9061214c53fe01b2d75ed4c1b2 Content-length: 7488 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN WK@vI5QR o~mIo~.IRt2nrif (cfg.proxy_socks_version == 4) ret->negotiate = proxy_socks4_negotiate; else ret->negotiate = proxy_socks51SOCKS proxy type. */ /* SOCKS version 4 */ int proxy_socks4_negotiate (Proxy_Socket p, int change) { if (p->state == PROXY_CHANGE_NEW) { /* request format: * version number (1 byte) = 4 * command code (1 byte) * 1 = CONNECT * 2 = BIND * dest. port (2 bytes) [network order] * dest. address (4 bytes) * user ID (variable length, null terminated string) */ int length; char * command; if (sk_addrtype(p->remote_addr) != AF_INET) { plug_closing(p->plug, "Network error: SOCKS version 4 does not support IPv6", PROXY_ERROR_GENERAL, 0); return 1; } length = strlen(cfg.proxy_username) + 9; command = (char*) malloc(length); strcpy(command + 8, cfg.proxy_username); command[0] = 4; /* version 4 */ command[1] = 1; /* CONNECT command */ /* port */ command[2] = (char) (p->remote_port >> 8) & 0xff; command[3] = (char) p->remote_port & 0xff; /* address */ sk_addrcopy(p->remote_addr, command + 4); sk_write(p->sub_socket, command, length); free(command); p->state = 1;if (p->state == 1) { /* response format: * version number (1 byte) = 4 * reply code (1 byte) * 90 = request granted * 91 = request rejected or failed * 92 = request rejected due to lack of IDENTD on client * 93 = request rejected due to difference in user ID * (what we sent vs. what IDENTD said) * dest. port (2 bytes) * dest. address (4 bytes) */ char *data; int len; /* get the response */ bufchain_prefix(&p->pending_input_data, &data, &len); if (data[0] != 0) { plug_closing(p->plug, "Network error: SOCKS proxy responded with " "unexpected reply code version", PROXY_ERROR_GENERAL, 0); return 1; } if (data[1] != 90) { switch (data[1]) { case 92: plug_closing(p->plug, "Network error: SOCKS server wanted IDENTD on client", PROXY_ERROR_GENERAL, 0); break; case 93: plug_closing(p->plug, "Network error: Username and IDENTD on client don't agree", PROXY_ERROR_GENERAL, 0); break; case 91: default: plug_closing(p->plug, "Network error: Error while communicating with proxy", PROXY_ERROR_GENERAL, 0); break; } return 1; } /* we're done */ proxy_activate(p); /* proxy activate will have dealt with * whatever is left of the buffer */1; } /* SOCKS version 5 */ int proxy_socks5_negotiate (Proxy_Socket p, int change) { if (p->state == PROXY_CHANGE_NEW) { /* initial command: * version number (1 byte) = 5 * number of available authentication methods (1 byte) * available authentication methods (1 byte * previous value) * authentication methods: * 0x00 = no authentication * 0x01 = GSSAPI * 0x02 = username/password * 0x03 = CHAP */ char command[3]; command[0] = 5; /* version 5 */ command[1] = 1; /* TODO: we don't currently support any auth methods */ command[2] = 0x00; /* no authentication */ sk_write(p->sub_socket, command, 3); p->state = 1;char *data; int len; if (p->state == 1) { /* initial response: * version number (1 byte) = 5 * authentication method (1 byte) * authentication methods: * 0x00 = no authentication * 0x01 = GSSAPI * 0x02 = username/password * 0x03 = CHAP * 0xff = no acceptable methods */ /* get the response */ bufchain_prefix(&p->pending_input_data, &data, &len); if (data[0] != 5) { plug_closing(p->plug, "Network error: Error while communicating with proxy", PROXY_ERROR_GENERAL, 0); return 1; } if (data[1] == 0x00) p->state = 2; /* no authentication needed */ else if (data[1] == 0x01) p->state = 4; /* GSSAPI authentication */ else if (data[1] == 0x02) p->state = 5; /* username/password authentication */ else if (data[1] == 0x03) p->state = 6; /* CHAP authentication */ else { plug_closing(p->plug, "Network error: We don't support any of the SOCKS " "server's authentication methods", PROXY_ERROR_GENERAL, 0); return 1; } } if (p->state == 2) { /* request format: * version number (1 byte) = 5 * command code (1 byte) * 1 = CONNECT * 2 = BIND * 3 = UDP ASSOCIATE * reserved (1 byte) = 0x00 * address type (1 byte) * 1 = IPv4 * 3 = domainname (first byte has length, no terminating null) * 4 = IPv6 * dest. address (variable) * dest. port (2 bytes) [network order] */ char command[22]; int len; if (sk_addrtype(p->remote_addr) == AF_INET) { len = 10; command[3] = 1; /* IPv4 */ } else { len = 22; command[3] = 4; /* IPv6 */ } command[0] = 5; /* version 5 */ command[1] = 1; /* CONNECT command */ command[2] = 0x00; /* address */ sk_addrcopy(p->remote_addr, command+4); /* port */ command[len-2] = (char) (p->remote_port >> 8) & 0xff; command[len-1] = (char) p->remote_port & 0xff; sk_write(p->sub_socket, command, len); p->state = 3; return 1; } if (p->state == 3) { /* reply format: * version number (1 bytes) = 5 * reply code (1 byte) * 0 = succeeded * 1 = general SOCKS server failure * 2 = connection not allowed by ruleset * 3 = network unreachable * 4 = host unreachable * 5 = connection refused * 6 = TTL expired * 7 = command not supported * 8 = address type not supported * reserved (1 byte) = x00 * address type (1 byte) * 1 = IPv4 * 3 = domainname (first byte has length, no terminating null) * 4 = IPv6 * server bound address (variable) * server bound port (2 bytes) [network order] */ /* get the response */ bufchain_prefix(&p->pending_input_data, &data, &len); if (data[0] != 5) { plug_closing(p->plug, "Network error: Error while communicating with proxy", PROXY_ERROR_GENERAL, 0); return 1; } if (data[1] != 0) { switch (data[1]) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: default: plug_closing(p->plug, "Network error: Error while communicating with proxy", PROXY_ERROR_GENERAL, 0); break; } return 1; } /* we're done */ proxy_activate(p); /* proxy activate will have dealt with * whatever is left of the buffer */ return 1; } if (p->state == 4) { /* TODO: Handle GSSAPI authentication */ plug_closing(p->plug, "Network error: We don't support GSSAPI authentication", PROXY_ERROR_GENERAL, 0); return 1; } if (p->state == 5) { /* TODO: Handle username/password authentication */ plug_closing(p->plug, "Network error: We don't support username/password " "authentication", PROXY_ERROR_GENERAL, 0); return 1; } if (p->state == 6) { /* TODO: Handle CHAP authentication */ plug_closing(p->plug, "Network error: We don't support CHAP authentication", PROXY_ERROR_GENERAL, 0);11; } Node-path: putty/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5e1af6e983d2876a581f549cb8dce76d Text-delta-base-sha1: 776e71eb2cc96c395a55f9302a42cfaaaf687c48 Text-content-length: 113 Text-content-md5: 61dca1484daf2da030b7757de1df2144 Text-content-sha1: a9562f104aaade3c2e8e395486ad38975281c71f Content-length: 152 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNl$`D`4_negotiate (Proxy_Socket, int); extern int proxy_socks5_negotiate (Proxy_Socket, int); #endif Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7cb6f581db88cf30384d2fa5fab8a813 Text-delta-base-sha1: 8786e26e88774297c2888245a6ee8639db169fd9 Text-content-length: 218 Text-content-md5: b2da5490b2e4bb94d0e02f6c4a7ff41a Text-content-sha1: 7fc1b3ce48dd2465f53c8f05c7b9802994a8099b Content-length: 258 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNs;:Tf}QT0Cint sk_addrtype(SockAddr addr) { return addr->family; } void sk_addrcopy(SockAddr addr, char *buf(char*) &a.s_addr, 4); #ifdef IPV6 } else { strncpy(buf, (char*) addr->ai, 16); Revision-number: 1623 Prop-content-length: 264 Content-length: 264 K 8 svn:date V 27 2002-04-27T16:20:16.000000Z K 7 svn:log V 163 Additions to the Feedback page to emphasise that we can't answer all our mail any more, and to encourage support questions to be sent elsewhere as a first resort. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 37da8ba1f6db3a970825d1ab95838bc4 Text-delta-base-sha1: c93287f72d724ef9517fb1b12c3182edcf2a69cb Text-content-length: 2998 Text-content-md5: 1c37bc7bc4c78940691f4ff6b7ef1417 Text-content-sha1: 4dbf0b6d03cef2e071b4a0bbc75f34952c309a84 Content-length: 3037 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNC ,5P$%n!FEX\versionid $Id: feedback.but,v 1.4 2002/04/27 16:20:1We get so much e-mail that we literally do not have time to answer it all. We regret this, but there's nothing we can do about it. So if you can \e{possibly} avoid sending mail to the PuTTY team, we recommend you do so. In particular, support requests (\k{feedback-support}) are probably better sent to \W{news:comp.security.ssh}\c{comp.security.ssh} or passed to a local expert if possible. The PuTTY contact email address is a mailing list. For this reason, e-mails larger than 40Kb will be held for inspection by the list administrator, and will not be allowed through unless they really It is reasonable to report bugs in PuTTY's documentation, if you think the documentation is unclear or unhelpful. But we do need to be given exact details of \e{what} you think the documentation has failed to tell you, or \e{how} you think it could be made clearer. If your problem is simply that you don't \e{understand} the documentation, we suggest posting to the newsgroup \W{news:comp.security.ssh}\c{comp.security.ssh} and see if someone will explain what you need to know. \e{Then}, if you think the documentation could usefully have told you that, send us a bug report and explain how you think we should change itsupport} Support requests If you're trying to make PuTTY do something for you and it isn't working, but you're not sure whether it's a bug or not, then \e{please} consider looking for help somewhere else. This is one of the most common types of mail the PuTTY team receives, and we simply don't have time to answer all the questions. Questions of this type include: \b If you want to do something with PuTTY but have no idea where to start, and reading the manual hasn't helped, try posting to the newsgroup \W{news:comp.security.ssh}\c{comp.security.ssh} and see if someone can explain it to you. \b If you have tried to do something with PuTTY but it hasn't worked, and you aren't sure whether it's a bug in PuTTY or a bug in your SSH server or simply that you're not doing it right, then try posting to \W{news:comp.security.ssh}\c{comp.security.ssh} and see if someone can solve your problem. Or try doing the same thing with a different SSH client and see if it works with that. Please do not report it as a PuTTY bug unless you are really sure it \e{is} a bug in PuTTY. \b If you have successfully made a connection to your server and now need to know what to type at the server's command prompt, or other details of how to use the server-end software, talk to your server's system administrator. This is not the PuTTY team's problem. PuTTY is only a communications tool, like a telephone; if you can't speak the same language as the person at the other end of the phone, it isn't the telephone company's job to teach it to you. If you absolutely cannot get a support question answered any other way, you can try mailing it to us, but we can't guarantee to have time to answer it Revision-number: 1624 Prop-content-length: 220 Content-length: 220 K 8 svn:date V 27 2002-04-27T16:30:15.000000Z K 7 svn:log V 119 Removed the old Visual C++ master makefile, since it has now been superseded by the new Recipe / mkfiles.pl mechanism. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Makefile Node-action: delete Revision-number: 1625 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:26.129243Z PROPS-END Revision-number: 1626 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:26.135660Z PROPS-END Revision-number: 1627 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:26.143176Z PROPS-END Revision-number: 1628 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2002-05-06T13:22:06.000000Z K 7 svn:log V 106 Initial version of bugs2html. Far from finished: I'm not even sure if its written in the right language. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: putty-wishlist/control Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4082 Text-content-md5: 2d98fbb49bd4d141be93fe65eda7716a Text-content-sha1: 2e125f12f70e42914d912ab055996694ad677c68 Content-length: 4198 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNddd#! /usr/bin/perl # $Id: bugs2html,v 1.1 2002/05/06 13:22:06 ben Exp $ use FileHandle; use POSIX; $bugdir = "../data"; $htmldir = "/u2/bjharris/public-html/putty-wishlist"; open(INDEX, "> $htmldir/index.html") or die "$htmldir/index.html: $!"; print INDEX < PuTTY Known Bugs and Wish List

PuTTY Known Bugs and Wish List

Home | Licence | FAQ | Docs | Download | Keys
Mirrors | Updates | Feedback | Changes | Wishlist

This is the list of bugs that need fixing, and features that want adding, to PuTTY. This list represents things that have not been done to the current development code. If you do not see a feature here, it's worth checking the Changes page before mailing us to ask for the feature; we might have already added it since the last release. EOH foreach $bugfile (glob("$bugdir/*")) { next unless -f $bugfile; open(BF, "< $bugfile") or die "$bugfile: $!"; input_record_separator BF undef; $data = ; close BF; ($bugname) = $bugfile =~ m{([^/]*)$}; ($hdr, $body) = $data =~ /^(.*?\n)\n(.*)$/s; $hdr =~ s/\n\s+/ /g; @hdrs = split /\n/, $hdr; %hdrs = map { /^(\S*?):\s*(.*)$/; (lc $1, $2) } @hdrs; bug2html($bugname, \%hdrs, $body); $index{$hdrs{class}} .= qq[

  • $bugname: $hdrs{summary}\n]; } print INDEX <

    Bugs

    These items are clearly actual problems and I want them fixed.

      $index{'bug'}
    EOF print INDEX <Semi-bugs

    These are things which might be bugs or might not, depending on your precise definition of what a bug is.

      $index{'semi-bug'}
    EOF print INDEX <Wishlist

    These are things that have been requested by users or which seem to me like a good idea. Not all of these are likely to be implemented without outside help, and some of them will positively never be implemented.

      $index{'wish'}
    EOF print INDEX <


    Comments to putty\@projects.tartarus.org
    (generated by bugs2html at @{[POSIX::strftime("%a, %d %b %Y, %H:%M:%S %Z", gmtime)]}) EOF close INDEX; sub bug2html { my($bugname, $hdrs, $body) = @_; open(HTML, "> $htmldir/$bugname.html") or die "$htmldir/$bugname.html: $!"; print HTML < PuTTY @{[$hdrs->{class}]} $bugname

    PuTTY @{[$hdrs->{class}]} $bugname

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    EOH foreach $h (keys %$hdrs) { print HTML qq[$h: @{[$hdrs->{$h}]}
    \n]; } if ($hdrs->{'content-type'} =~ "^text/x-html-body") { print HTML $body; } else { $body =~ s/&/&/g; $body =~ s//>/g; print HTML qq[

    $body
    ]; } print HTML <
    Comments to putty\@projects.tartarus.org
    (generated by bugs2html at @{[POSIX::strftime("%a, %d %b %Y, %H:%M:%S %Z", gmtime)]}) EOF close(HTML); } Revision-number: 1629 Prop-content-length: 195 Content-length: 195 K 8 svn:date V 27 2002-05-06T13:23:12.000000Z K 7 svn:log V 97 Initial round of bugs. This covers everything in the "bug" class, and several semibugs as well. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: putty-wishlist/data/async-dns Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 710 Text-content-md5: 975159d89152adf591f40fb1759103da Text-content-sha1: 86570a7d7788f45ca213f7bfae2acf96dbeef2b5 Content-length: 826 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN888Summary: DNS lookups are synchronous. Class: bug Priority: medium Difficulty: fun Content-type: text/x-html-body

    DNS lookups are synchronous. We could make them async quite easily, which would stop the last potential delay before the PuTTY window appears and would also prevent an absent DNS server from hanging PuTTY while a remote-to-local port forwarding times out on DNS; but ideally I'd like an abstraction of DNS so that we can still port later (since the socket API only has synchronous DNS). Porting to Unix will be fine (we can use adns), and any thread-capable OS won't have a problem. Everything else will just have to degrade gracefully to synchronous DNS, which will be fun. :-( Node-path: putty-wishlist/data/disconnect Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 616 Text-content-md5: 14cfe41c2d117c0cdf97e1916a60fa14 Text-content-sha1: 053a18693849e78a7b159a8b4a3bb72b9510ff37 Content-length: 732 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNZZZSummary: Better handling of the connection closing Class: semi-bug Priority: medium Difficulty: tricky Content-type: text/x-html-body

    Better handling of the connection closing, and of SSH_MSG_DISCONNECT being received. Ideally we should maintain our own idea of when and whether we expect to see a closure, and only signal clean exit when a closure or disconnect arrives that we were expecting. If one arrives unexpectedly it should count as an ungraceful closure, display a dialog box containing the text out of MSG_DISCONNECT, and not close the window unless the user selected "Always". Node-path: putty-wishlist/data/fatal-errors Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 657 Text-content-md5: df68acef2d98ed71329b41a2965f0667 Text-content-sha1: 315a5b55e0b047fa16e2b150435e448682c0dff9 Content-length: 773 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Fatal error handling is patchy and flaky. Class: bug Priority: medium Difficulty: tricky Content-type: text/x-html-body

    Fatal error handling is patchy and flaky. It's very easy to throw a fatal error, put up a message box, and then receive a Windows message containing yet more socket data. The MessageBox message loop then dispatches that message automatically and the back end is called reentrantly. Chaos ensues. Solution: the fatal error behaviour should be much more robust. Close all sockets the instant a fatal error occurs; also set some global flags that prevent action messages from having any back end effect. Node-path: putty-wishlist/data/font-overflow Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1335 Text-content-md5: 7ae7345be7c8579e5d1bcc73eb1d06bc Text-content-sha1: ba54e232259d06fe6abf6a4c203019bc94959dfc Content-length: 1451 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN)))Summary: Fonts that overflow their character cells cause problems Class: bug Priority: medium Difficulty: tricky Content-type: text/x-html-body

    There's a two-pronged problem with fonts whose characters overlap outside their designated rectangular cell.

    • Firstly, we don't deal well with this. Each string passed to do_text() is clipped to the rectangle it should be in; but within that string there's still scope for overlap between character cells. If half the string is then updated then there will be artefacts left on the screen; I can't see any obvious fix except to always draw one character at a time, which is just ghastly.
    • Secondly, the resize-by-changing-font code has a tendency to choose fonts that cause this problem a lot. For bitmap fonts I think this is just a hazard of the job - if you ask PuTTY to resize a non- resizeable font, you can expect it to do a shoddy job at best - but it even happens slightly in Courier New (the very RH edge of the lower case m sometimes protrudes into the next character cell), which really isn't on. Sadly I have no idea how we can fix this in general - if we ask for a smaller width than we really want, then (a) we penalise well-behaved fonts, and (b) the spacing when drawing a large string will come out wrong.
    Node-path: putty-wishlist/data/keyboard-problems Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 945 Text-content-md5: a217ac14cc329b7db2e56e18d15fd3b8 Text-content-sha1: b1b3d46a1e97a86c1ee63c306744a0f65ddad18b Content-length: 1061 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN###Summary: Problems with various keyboard layouts. Class: bug Priority: medium Difficulty: taxing Content-type: text/x-html-body

    Problems with various keyboard layouts. It would be hard for me to debug these myself because I'd have to be able to work in the same keymap as I was testing PuTTY in! If anybody can debug these problems it would be greatly appreciated.

    • The svorak (Swedish Dvorak) layout apparently gets a few control combinations wrong: ^W, ^V and ^Z.
    • On the Danish keyboard, apparently the tilde (~) is acting as a dead key and generating a code in itself; so if you hit ~ and then n, you get a ~ followed by a ñ.
    • There's been a report from a Korean user that Korean multi-byte input doesn't work.
    • A German user has reported that Caps Lock is more like Shift Lock - it affects a lot of keys other than alphabetics.
    Node-path: putty-wishlist/data/large-files Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 388 Text-content-md5: d5fa7368ec72dbf29ad4835862a26ba3 Text-content-sha1: dc1c7cc60b4f9f0d292cfce5b411f3bc52e42f90 Content-length: 504 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNvvvSummary: PSFTP and PSCP can't handle > 2 GB files Class: semi-bug Priority: medium Difficulty: fun Content-type: text/x-html-body

    PSCP ought to handle really really big (>2Gb) files. There's been a report that it doesn't do so properly. (Apparently this will only be meaningful under an NT-series OS; the 95 series inherently can't handle more than 2Gb in any case.) Node-path: putty-wishlist/data/null-opaque-resize Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 493 Text-content-md5: 1553ad2476d51e6e9af836859578b26a Text-content-sha1: ca018443839f2743f01acdbd784cf81d980437a6 Content-length: 609 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN___Summary: Opaque resizes under NT cause trouble Class: semi-bug Priority: medium Difficulty: tricky Content-type: text/x-html-body

    Opaque resizes under NT cause trouble when the user changes their mind and carefully drags the window back to the way it started out: the contents of the screen have been trashed and no resize event is sent to the server. Perhaps redisplay during resizing should be reimplemented in a way that doesn't change the terminal buffer's size at all. Node-path: putty-wishlist/data/resize Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 892 Text-content-md5: 6939ec3144cd48c121cf8ff29740b4c2 Text-content-sha1: 9c32fb88736778aac552485c46f541682f5d57f2 Content-length: 1008 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNnnnSummary: Resizing the window is still pretty flaky. Class: bug Priority: medium Difficulty: tricky Content-type: text/x-html-body

    Resizing the window is still pretty flaky. One particular current problem is: if you choose a font that fits 80 columns on your screen but not 132, then sending ESC[?3h to switch to 132-column mode will squish the font just enough to fit 132 columns in a full-width window. So far so good; but when you send ESC[?3l to return to 80 columns, really it would be nice if the window was put back the way it started out. Also there's some indication that the squishing doesn't work quite right; first PuTTY expands the window to full width, then it chooses a font size, and then it leaves a big border down each side of the window when that font size fails to fit quite right. Really it should recompute the window size once it knows the font size. Node-path: putty-wishlist/data/ssh2-kex-data Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 816 Text-content-md5: 09e011f90ca9c7bfde1aec5d20656aef Text-content-sha1: ce9f9ac14be9571d4a8109fbf6472de6f7b543ab Content-length: 932 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN"""Summary: Data transfer during SSH2 KEX causes confusion Class: bug Priority: medium Difficulty: tricky Content-type: text/x-html-body

    If there is data being transferred through PuTTY while the SSH2 repeat key exchange is taking place, it can confuse some servers. As far as I'm aware nobody has properly standardised this aspect of the SSH2 protocol (what happens to the connection layer while the transport layer is in a key exchange phase?) so it isn't clear what PuTTY should do in this situation, but a good conservative/liberal option would be to accept incoming connection-layer packets provided we can decrypt them, and to queue outgoing connection-layer packets until the key exchange is completed. I can't easily imagine a standards decision that would invalidate that behaviour. Node-path: putty-wishlist/data/startup-unselected Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 318 Text-content-md5: 0f9baedb60da2f0c18436c327993ab44 Text-content-sha1: 5dfaa79600d91d0c480a86d9718f4825ffc207aa Content-length: 434 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN000Summary: If PuTTY starts without focus, the cursor does odd things. Class: bug Priority: medium Difficulty: tricky Content-type: text/plain If PuTTY starts up with its window unselected, something slightly odd can happen with the cursor: it doesn't revert from box to block when the window gains focus. Revision-number: 1630 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 53 Don't include the content-type header in the output. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-05-06T13:34:01.000000Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2d98fbb49bd4d141be93fe65eda7716a Text-delta-base-sha1: 2e125f12f70e42914d912ab055996694ad677c68 Text-content-length: 110 Text-content-md5: 945ae6934b7dcc2cef841bb47becb56e Text-content-sha1: 0d4be61226ac4baee190297b70afd9776f542f09 Content-length: 149 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNd X-;~f#! /usr/bin/perl # $Id: bugs2html,v 1.2 2002/05/06 13:34:01next if $h eq "content-type"; Revision-number: 1631 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2002-05-06T13:37:29.000000Z K 7 svn:log V 49 Add a link to each bug's CVSweb log to its page. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 945ae6934b7dcc2cef841bb47becb56e Text-delta-base-sha1: 0d4be61226ac4baee190297b70afd9776f542f09 Text-content-length: 195 Text-content-md5: 15fb4a3552ac6864e563e3df68ecdca8 Text-content-sha1: 1ec33df928f120f1112e085c29f64771a7a1713f Content-length: 234 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNq(h;mN1p#! /usr/bin/perl # $Id: bugs2html,v 1.3 2002/05/06 13:37:29a href="http://cvs.tartarus.org/putty-wishlist/data/$bugname"> Audit trail for this @{[$hdrs->{class}]}. Revision-number: 1632 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2002-05-06T13:41:34.000000Z K 7 svn:log V 35 Fix up URLs to be correct for now. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 15fb4a3552ac6864e563e3df68ecdca8 Text-delta-base-sha1: 1ec33df928f120f1112e085c29f64771a7a1713f Text-content-length: 975 Text-content-md5: b434a213400d18260a21114260123116 Text-content-sha1: 2d8eb2e69efa3089278ef5997ade5d867d87bc6b Content-length: 1014 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNq' #s;R+ *0JZ8K&#! /usr/bin/perl # $Id: bugs2html,v 1.4 2002/05/06 13:41:34$baseurl = "/~sgtatham/putty$baseurl/">Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Perhaps, for people who don't like dialog boxes, messages like "connection closed" and fatal errors should be configurable to appear inside the window instead of popping up sudden message boxes.

    If we do this, we should probably include a means of distinguishing that sort of error output from anything the remote site can possibly send. This is potentially a hard problem, so it requires some design work. Node-path: putty-wishlist/data/command-line Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 797 Text-content-md5: 778b2012b5ab5d2deb3a2cba062da6b8 Text-content-sha1: 96dfb6c58b73d4763fc15889b77f5de9b645b87a Content-length: 913 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Better command line options Class: wish Priority: high Difficulty: tricky Content-type: text/x-html-body

    The PuTTY tools have a pathetic set of command-line options. Among the things we should support but don't are:

    Node-path: putty-wishlist/data/ctrl-pgupdn Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 356 Text-content-md5: f9eb376404cf88583f128f73c15aa3bd Text-content-sha1: 5e217d2ecc3cdb4c1c23485abf9aa7eeb96ecaf4 Content-length: 472 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNVVVSummary: Ctrl-PgUp and Ctrl-PgDn to scroll by one line at a time. Class: wish Priority: medium Difficulty: Content-Type: text/x-html-body

    Ctrl-PgUp and Ctrl-PgDn to scroll by one line at a time. Despite PuTTY's usual policy about keystroke usage, this is a reasonably safe change because we don't currently do anything with those keys. Node-path: putty-wishlist/data/font-quality Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 319 Text-content-md5: cbf171b98b660c43e93db58e2c70bd09 Text-content-sha1: 2498081498d773325068fd726bc668f2dcccd722 Content-length: 435 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN111Summary: Ability to configure font quality (and support ClearType) Class: wish Priority: medium Difficulty: fun Content-Type: text/x-html-body

    Ability to configure font quality (the fdwQuality parameter to CreateFont). Choices should include "antialiased", "non-antialiased", "ClearType", "default". Node-path: putty-wishlist/data/fore-back Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 277 Text-content-md5: bc05eb2d8cfff7b8522e668e267ec4f6 Text-content-sha1: 5855377c7717208cb9e135a97888c188dc6f20fe Content-length: 393 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Specify foreground and background colours separately Class: wish Priority: low Difficulty: fun Content-Type: text/x-html-body

    Allow the "ANSI Green" used for foregrounds to be different from the one used for backgrounds (for all values of "Green"). Node-path: putty-wishlist/data/hostname-whitespace Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 251 Text-content-md5: 0b0155614f922be224d1cdb50929e648 Text-content-sha1: 052fd3be4b11a15a4bb86cc239e17914b9fa8597 Content-length: 367 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNmmmSummary: Ignore whitespace in the Host Name box Class: wish Priority: medium Difficulty: fun Content-Type: text/x-html-body

    It might be generous if we skipped whitespace when parsing IP addresses or host names in the Host Name box. Node-path: putty-wishlist/data/multi-font Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 380 Text-content-md5: 0c056ea8649cad1b28fe0df0855b78fe Text-content-sha1: 7f11448ca596c0fa242e9c25054fd16f05295c68 Content-length: 496 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNnnnSummary: Multiple font selections Class: wish Priority: medium Difficulty: fun Content-Type: text/x-html-body

    It would be nice to be able to select a second font to be used for 132-column mode.

    More generally, perhaps, it might be nice to be able to select multiple fonts and switch between them quickly on a hotkey or similar? rxvt already supports this. Node-path: putty-wishlist/data/offer-to-reset Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 612 Text-content-md5: 24795178f8b7e349881fa148bcc01a5f Text-content-sha1: bc74a30cd740a04b3652c7bc1577758e95230d9e Content-length: 728 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNVVVSummary: Offer to reset initial-terminal-state settings Class: wish Priority: medium Difficulty: fun Content-Type: text/x-html-body

    Terminal settings that are modifiable from "Change Settings" but which only control an initial state should be handled better. Perhaps a sensible procedure would be that if the user changes such a setting, then when they hit Apply they get a message box: "You have modified the initial state of the Foo setting. This change will take effect the next time your terminal is reset. Do you want to force it to take effect immediately as well? [yes] [no]". Node-path: putty-wishlist/data/pageant-async Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 455 Text-content-md5: 1a9cd1ed6c1833ba290bd203f635a69a Text-content-sha1: d29dd4b2dadf0f28d569a86bea6bc0ef8ffaec82 Content-length: 571 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN999Summary: Requests to Pageant should be asynchronous Class: wish Priority: medium Difficulty: tricky Content-type: text/plain Currently, when PuTTY makes a request to Pageant, it waits in a tight loop for the answer. Really it should be able to answer Windows messages and do other housekeeping tasks while it's waiting for the answer. This would enable Pageant to do a variety of time-consuming things in the course of answering a request. Node-path: putty-wishlist/data/pageant-key-mgmt Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1135 Text-content-md5: a73f759aa9dbfc8590430ba65e2f300c Text-content-sha1: 0ea8997c66ff582ee7d4e7a1dc3525c1d9e8b484 Content-length: 1251 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNaaaSummary: Better key management in Pageant Class: wish Priority: medium Difficulty: tricky Depends: pageant-async Content-type: text/plain Pageant should offer a wider range of key management options. For a start, it should be possible to load a key but defer decrypting it. Pageant would report the existence of the key, but only when it was first actually used would it bother asking for the passphrase. Then the key would be decrypted, and subsequent requests could be fulfilled immediately. Once that's possible, it would also allow a key to expire after being present for a certain time (or perhaps after being unused for a certain time). It might be useful for Pageant to be able to remember which keys it has loaded and reload them automatically on restart (though, again, this is probably only useful once we can defer decryption). It might be handy to have special command-line options for Pageant which would cause to start up, send commands to the primary Pageant, and shut down again. We can already add keys to the primary Pageant, but it might be good to be able to delete keys or shut it down as well. Node-path: putty-wishlist/data/pc-speaker Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 556 Text-content-md5: 063f7aec4bf92d388207438f54eb3026 Text-content-sha1: cabff3098e73e67be11b85719c42c953147dcbce Content-length: 672 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Beep using the PC speaker Class: wish Priority: medium Difficulty: taxing Content-type: text/plain Among the many bell options we already support, it would be nice to support the built-in PC speaker. Unfortunately this seems to be non-trivial: on Win95-series systems this can apparently be done using MessageBeep(0xFFFFFFFF), but on NT-series systems this doesn't do anything different from MessageBeep(MB_OK) and there's some other system call that will do it. So we'd need to auto-detect which kind of system we were running on. Node-path: putty-wishlist/data/pscp-check-first Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 382 Text-content-md5: 454c07c523e7377b08330c5cc3669079 Text-content-sha1: d2e481fe6e7984328d49fb11f2f0653c3238653f Content-length: 498 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNpppSummary: PSCP could check source filespec before connecting Class: wish Priority: medium Difficulty: fun Content-Type: text/x-html-body

    When doing a local-to-remote copy using PSCP, perhaps it could check the source filespec before attempting to connect to the host. That would save time and effort by notifying the user of a typo sooner than otherwise. Node-path: putty-wishlist/data/pscp-filemodes Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 522 Text-content-md5: cd87146bc1852258d133aabadbb39885 Text-content-sha1: fc1731374396d028a018b05f473e3a9b2dd4c342 Content-length: 638 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN|||Summary: Control of file permissions in PSCP Class: wish Priority: medium Difficulty: fun Content-type: text/plain It would be nice if PSCP could allow user control of the file permissions it sends to the remote side when uploading files. I'm not entirely sure what the user interface for this should be, but whatever it is I think it would have to be a blanket option covering all files transferred in a single connection - it would just be too fiddly to give fine-grained control when copying many files. Node-path: putty-wishlist/data/pscp-restart Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 645 Text-content-md5: 8f043b8dd8a3364847241f5f7773b0f6 Text-content-sha1: db5ece3900a805dcf4581e2ba7ea0e70424bae90 Content-length: 761 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNwwwSummary: Restart capability in PSCP Class: wish Priority: low Difficulty: tricky Content-type: text/plain Now that PSCP supports SFTP as a back end, it might be quite nice to implement the restart capability when retrying a half-finished file transfer ("reget" / "reput" in PSFTP). It's relatively obvious how this should work for single-file transfer (it would have to be explicitly enabled using a command-line option), but the design will need some thought for multi-file and recursive transfers. Also the whole thing will have to fail, or degrade gracefully, if PSCP ends up using the original SCP1 protocol instead of SFTP. Node-path: putty-wishlist/data/pscp-stdout Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 294 Text-content-md5: f71180502b4964e5899276fdd2d60998 Text-content-sha1: 47efa038095e1a9c3a4d549201fc8933d1550724 Content-length: 410 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Make PSCP optionally log to stdout instead of stderr Class: wish Priority: medium Difficulty: fun Content-Type: text/x-html-body

    PSCP should be able to send its log messages to stdout instead of stderr, since Windows doesn't provide any easy way to redirect stderr. Node-path: putty-wishlist/data/reuse-windows Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 420 Text-content-md5: 2f530f64fb75cad38ab36fdea10c3f04 Text-content-sha1: f62ff9c4fa5da12b72f8e5f4c6f8ed8a222803bf Content-length: 536 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Ability to re-use dead session windows Class: wish Priority: medium Difficulty: tricky Content-Type: text/x-html-body

    Perhaps an inactive window should have a menu option to reactivate the session (like Duplicate Session but in the same window).

    This is a non-trivial amount of work, because it would involve ensuring all the static data was correctly reset to plausible initial values. Node-path: putty-wishlist/data/right-alt Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 563 Text-content-md5: a21ae688f65b35d3229cc2a8f1e6d6c5 Text-content-sha1: 0bca7caa759da61eda7513dddd2bd787484d501a Content-length: 679 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN%%%Summary: Support for Right Alt on keyboards which don't call it AltGr Class: wish Priority: medium Difficulty: tricky Content-Type: text/x-html-body

    Users from countries (is it only the US?) that don't need the AltGr key might like to have an option that makes it work the same way as the left Alt key.

    This would be easy to implement by means of a configuration option, but it would be nicer if we could somehow detect this property of the active keymap and automatically switch between that key being Right Alt and being AltGr. Node-path: putty-wishlist/data/save-mid-session Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1420 Text-content-md5: 5ca6fe809e2d9042c98de23a6909f235 Text-content-sha1: 9ea1e08cf5a155224f4253479537f3f5f562fb13 Content-length: 1536 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN~~~Summary: Saving session preferences after starting the session Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    When you adjust the properties of a running session using the "Change Settings" menu option, it might be nice to be able to save the adjusted settings back to the saved-session slot you loaded from, or to a new session slot.

    This feature is one of our most requested, but is currently pending some design work:

    • If you load an existing saved session exactly "as is", by double-clicking or by running "putty @sessionname" or whatever, it's reasonably obvious that hitting the Save button in mid-session should write the changed details back to the same slot you loaded from.
    • What if you loaded the session, modified a setting or two, and then started it? Should a mid-session Save still write back to the original slot by default? It sounds as if it obviously should ... but what if the one setting you changed was the hostname? Suddenly I think it's no longer completely obvious that you should be conveniently able to overwrite your previous saved session with the new one.
    • So the user interface for this feature needs some serious thought; we have to have a means for working out precisely when it does and does not make sense to have an automatic save-to-where-we-loaded-from button available.
    Node-path: putty-wishlist/data/save-scrollback Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 227 Text-content-md5: ee1ba2c32af89570becd10d6cf303d27 Text-content-sha1: f81806e28d5b39c0f5513443556433a18cc51737 Content-length: 343 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNUUUSummary: Allow saving scrollback to a file Class: wish Priority: medium Difficulty: fun Content-Type: text/x-html-body

    Allow saving of the current screen+scrollback state to a file. Or printing it, possibly. Node-path: putty-wishlist/data/search-scrollback Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 402 Text-content-md5: 3dce445f181f58ced986387c6bf14008 Text-content-sha1: 2604e9c4bc38db23d725d97a2fee25482a3c9289 Content-length: 518 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Searching facilities in the scrollback Class: wish Priority: medium Difficulty: tricky Content-Type: text/x-html-body

    One user suggested a search facility for finding text in the scrollback. Full-blown regexp-style grep is probably overkill, but a Notepad-esque search box (select up/down search direction, select case sensitivity, type your text and go) might be feasible. Node-path: putty-wishlist/data/selection-pause Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 395 Text-content-md5: a769d66304c3a8e2a44de17de80c011a Text-content-sha1: 92d23c2da244495f0bea3febbf084ae8cffc3dcb Content-length: 511 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN}}}Summary: Terminal output to pause while mouse selection in progress Class: wish Priority: low Difficulty: tricky Content-Type: text/x-html-body

    When selecting with the mouse, it might make sense for further incoming data to be buffered until the user lets go, so that they aren't trying to work with a moving target. This might also be nice when scrolling with the scrollbar. Node-path: putty-wishlist/data/shift-backspace Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 502 Text-content-md5: 354fac4f0e1bb29d4baa769749457cfa Text-content-sha1: 56840c95db24ff7175c5cc939780af2c2e890f99 Content-length: 618 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNhhhSummary: Shift-Backspace should do the other of ^H and ^? Class: wish Priority: medium Difficulty: fun Content-Type: text/x-html-body

    Perhaps Shift-Backspace could do whichever of ^H and ^? normal Backspace isn't doing. Apart from anything else this would make documentation of the Backspace functionality switch easier (we could invite users to try Shift-Backspace if just Backspace doesn't work, and this would be a clear indication that they needed to frob that switch). Node-path: putty-wishlist/data/ssh2-only Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 611 Text-content-md5: 26b28af71d4c5c9863e16f9b5bf76df5 Text-content-sha1: 9515d8624840ae14c07877616dd9b6f33d012492 Content-length: 727 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNUUUSummary: Ability to prevent fallback to SSH 1 Class: wish Priority: medium Difficulty: fun Content-type: text/plain Currently, PuTTY's choice of SSH protocol can only be expressed as a preference. If you ask for an SSH2 connection and only SSH1 is available, or vice versa, PuTTY will fall back to whatever it can use. For security reasons we should also allow the user to specify "SSH2 or nothing", so that if PuTTY couldn't make an SSH2 connection it would give up rather than fall back to SSH1. For symmetry, we should also support "SSH1 or nothing", though that seems less obviously useful. Node-path: putty-wishlist/data/system-menu Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 545 Text-content-md5: a2a810cb7911cc5c9e606b5caa4bff56 Text-content-sha1: cf79f51bb77b6b9ad5258e95fc9a6eac8b26721b Content-length: 661 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Expansions to the System menu Class: wish Priority: medium Difficulty: tricky Content-Type: text/x-html-body

    There have been various requests to have various config options available conveniently in the System menu instead of having to go all the way to Change Settings. A particularly common request is the ability to turn logging on and off quickly.

    Probably this should be done to some extent, but careful thought will need to be given to just which features should be available from the System menu. Revision-number: 1636 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2002-05-06T17:48:55.000000Z K 7 svn:log V 153 Add descriptions for the enumerated headers. These are taken straight from the spec, and could perhaps be made more appropriate for public consumption. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b434a213400d18260a21114260123116 Text-delta-base-sha1: 2d8eb2e69efa3089278ef5997ade5d867d87bc6b Text-content-length: 1227 Text-content-md5: 2fed4f22030d57a343cb06bc252c7ca8 Text-content-sha1: 3e5077ed5bc00a360729edca8bcd13c4f14ffa2d Content-length: 1266 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN'J*;rSK}:m#! /usr/bin/perl # $Id: bugs2html,v 1.5 2002/05/06 17:48:55%classdesc = ('bug' => "This is clearly an actual problem we want fixed.", 'semi-bug' => "This might or might not be a bug, depending on your " . "precise definition of what a bug is.", 'wish' => "This is a request for an enhancement."); %prioritydesc = ('high' => "This should be fixed in the next release.", 'medium' => "This should be fixed one day.", 'low' => "We aren't sure whether to fix this or not.", 'never' => "We don't ever intend to fix this."); %difficultydesc = ('fun' => "Just needs tuits, and not many of them.", 'tricky' => "Needs many tuits.", 'taxing' => "Needs external things we don't have (standards, users " . "etc)", 'mayhem' => "Probably impossible")my($desc); $h eq "content-type" && next; $h eq "class" && ($desc = $classdesc{$hdrs->{$h}}); $h eq "priority" && ($desc = $prioritydesc{$hdrs->{$h}}); $h eq "difficulty" && ($desc = $difficultydesc{$hdrs->{$h}}); print HTML "$h: "; if (defined($desc)) { print HTML "@{[$hdrs->{$h}]}: $desc"; } else { print HTML $hdrs->{$h}; } print HTML qq"
    \n" Revision-number: 1637 Prop-content-length: 315 Content-length: 315 K 8 svn:date V 27 2002-05-07T20:14:44.000000Z K 7 svn:log V 214 Two more wishes: DLL front end and VB magic control thing. The DLL one contains quite a lot of design writeup about how I'd like it to be implemented, for the benefit of anyone who might feel like doing it for us. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/dll-frontend Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4222 Text-content-md5: ca952998b190bf52b0ff1355137eac7d Text-content-sha1: 20755224e1e98d9a1e1b972bfa9ad8f1a119d98e Content-length: 4338 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNpppSummary: SSH client packaged as a DLL for use in other programs Class: wish Difficulty: tricky Priority: low Content-type: text/plain A lot of people ask for a DLL that implements an SSH client, so that they can include it in their own programs and automatically get securely in touch with other systems and issue commands. I'm not entirely sure when (or whether) we'll have the energy to get round to this, but I've thought about the design aspects a fair bit, and this is what I've come up with. When I hear `DLL for PuTTY' I tend to think of something very much like Plink, but using a very simple sort of function-call interface rather than reading from stdin and writing to stdout. Something like this: SSH_Session mysess; SSH_Channel mychan; mysess = puttydll_open("myhost.example.com", 22); mychan = puttydll_start_command(mysess, "cvs server"); puttydll_send_data(mychan, cvs_auth_data, len); len = puttydll_read_data(mychan, buffer, sizeof(buffer)); ... and so on. So you'd end up with `SSH_Channel' handles which worked a little like file handles - you could do a blocking read on a particular one of them, for example, or wait until one of a selection of them became ready. (If you wanted to wait for data from either an SSH channel or a Windows-side object, interfacing between this sort of select() and the Windows equivalents might be fun, but I'm sure it could be worked out. Perhaps an API function which would hand you a Windows event object that would get set when one of the channels was active.) The biggest immediate problems I see with it are: - PuTTY isn't currently able to manage more than one connection at a time (although it can manage multiple channels within a connection). This is because most of its variables are global, rather than allocated dynamically per session. A decent DLL would need to have this fixed; fortunately it's a source cleanup I plan to do in any case. - PuTTY needs its own event loop, so that it can respond to server- side requests (such as repeat key exchange and server-side pings) in the SSH connection it's managing. This might not be easy to integrate with whatever kind of event loop the calling program is using - if indeed it's using an event loop at all; the kind of code I quote above would probably much rather stay sequential than become event-driven with explicit state. Hence I think the simplest way to arrange this is to have the DLL spawn a thread to manage PuTTY's own network event loop, which can then run without interfering with what the rest of the program is doing. That way, the calling program could call the send-data function, go off and do its own thing for a while, and then come back and see if data had come back for it to read yet. (On the other hand, if the caller _did_ want to integrate PuTTY into their own event loop so that they received immediate notification when data came in, that would be another thing we'd want to allow them to do. Perhaps allowing them to provide an event object which we could set when particular things happened might be a useful approach.) - The DLL interface would need careful design. In particular, what should happen about interactive prompts - passwords, passphrases, host key verification, and so on? Should all of those things be fatal errors (limiting the DLL to being used in a context where unattended login is possible), or what? I think it would be a mistake to have this sort of prompt go directly to the user; it would probably be better to notify the calling program in some way, and leave it to decide how to handle it. (Although perhaps providing helper routines that gave standard dialog boxes for these prompts might also be an interesting option.) However, none of those issues is insurmountable - the nastiest of them is the code cleanup to make variables non-global, and this will have to be done at some point in any case - and once these issues are taken care of I don't see why a DLL providing an API like the one above shouldn't be perfectly possible to write just by implementing a single front-end module to replace (say) plink.c. Node-path: putty-wishlist/data/vb-control Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 749 Text-content-md5: 5afe6e81d754e32821c17143c6bee450 Text-content-sha1: 3323bbe59bc28c0264b5aff1cc8f0efe5c69d1fd Content-length: 865 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN___Summary: SSH client packaged as a Visual Basic component Class: wish Difficulty: taxing Priority: low Depends: dll-frontend Content-type: text/plain A lot of people ask for a Visual Basic component that implements an SSH client, so that they can include it in their VB programs and automatically get securely in touch with other systems and issue commands. I think the simplest way to do this would be to implement it as a thin veneer on top of the DLL front end (once we've done _that_). The major direct difficulty in this work is that I know nothing about VB components and how to create one, and so I can't even think about beginning this without some outside help. But also, it can't be done unless the DLL work is done first. Revision-number: 1638 Prop-content-length: 242 Content-length: 242 K 7 svn:log V 141 Add the wishlist item about OpenSSH and ssh.com key formats. Includes links to the two existing programs that do OpenSSH->PuTTY conversions. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-05-08T08:41:43.000000Z PROPS-END Node-path: putty-wishlist/data/key-formats Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2148 Text-content-md5: 0e40f37ae22ae7f37cd6631b7a91faac Text-content-sha1: 55add8475d67b22e92f905109b604fcdb10c9da2 Content-length: 2264 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNVVVSummary: Support for OpenSSH and ssh.com SSH2 private key formats Class: wish Difficulty: fun Priority: medium Content-type: text/x-html-body

    Although PuTTY shares the same SSH1 private key file format as OpenSSH and ssh.com's product, all the SSH2 formats are different. Of course, we believe PuTTY's is the best, because it shows the public key unencrypted (so it's easy to check by eye that a particular private key matches a particular public key) and because it's fully tamperproofed to protect against any attacks that involve tampering with the key to reveal information about it.

    However, a lot of people want to be able to use their OpenSSH or ssh.com private keys (usually OpenSSH) with PuTTY. So we probably need at least PuTTYgen to be able to load and save those formats. (I think if we build the conversion capability into PuTTYgen, there will be no need to bloat PuTTY itself with the same code.)

    In the meantime, other people have written separate programs to convert OpenSSH format to PuTTY. These programs read OpenSSH keys by using the existing OpenSSL key management library, which means we can't conveniently make use of them when we do the same work ourselves. However, in case they're useful, they are:

    • The one at www.thule.no will only write out unencrypted keys, and recommends you immediately load the resulting key into PuTTYgen and re-save it with a passphrase. It is supplied in C source form only.
    • The one at anchor.net.au will only write out encrypted keys (ones stored with a passphrase), though a comment in the code suggests it would be easy to extend to deal with unencrypted keys too. A binary is supplied as well as source (though of course you should be wary of trusting somebody else's binary with your private key - as the web page itself warns you!).

    Note that we are not responsible for these programs and cannot guarantee their correct functionality or even their trustworthiness. You use them at your own risk. Check the source code. Revision-number: 1639 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:26.661367Z PROPS-END Revision-number: 1640 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:26.669988Z PROPS-END Revision-number: 1641 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:26.677082Z PROPS-END Revision-number: 1642 Prop-content-length: 259 Content-length: 259 K 7 svn:log V 158 Add feature descriptions for the MDPI, a scripting language, and URL launching. The latter mentions WinURL, now that I've just put it up in my own web space. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-05-09T09:27:42.000000Z PROPS-END Node-path: putty-wishlist/data/mdpi Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1125 Text-content-md5: f7c73a45233901228650a76e7ff58be0 Text-content-sha1: 996fd29538771f145271010087446b64988bb129 Content-length: 1241 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNWWWSummary: The mythical DLL Plugin Interface Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body

    Since we know a lot of people really appreciate PuTTY's small size, we try to preserve that small size. Unfortunately, there are some features which simply can't be implemented without a lot of code.

    Therefore, we would like PuTTY to have an interface that allows plugins in the form of DLLs. These plugins would be completely optional; if PuTTY didn't find any plugins when it started up, it would go ahead and run without them, and you just wouldn't get any of the features supported in the plugins. If you needed to fit PuTTY into a small space (such as a floppy), you could include only those plugins you really needed - or none at all.

    Quite how this plugin interface should fit together is unclear. In particular, since methods of DLL linkage and dynamic loading tend to be very platform-specific, it would be hard to design a plugin interface which would allow us to port the plugins bodily to other platforms (when we eventually get round to doing any ports). Node-path: putty-wishlist/data/scripting Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1433 Text-content-md5: 1d42e774ae67c5f1560601a2709dc5de Text-content-sha1: c7d0b1d4459c4ed2234c9b727e75a1453dfd2299 Content-length: 1549 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  Summary: Scripting support in PuTTY Class: wish Difficulty: tricky Priority: low Depends: mdpi Content-type: text/x-html-body

    Many people would find it useful for PuTTY to have a general scripting mechanism. There are a lot of uses for something like this:

    • Automating movement through menu systems on servers.
    • Assigning common commands to function keys.
    • For MUD users: being able to set up triggers so that PuTTY automatically sends commands when particular events happen on the server.
    • Chaining connections. For example, the recommended way to connect to Monochrome BBS is to make a preliminary Telnet connection to a central server which will tell you which of the usable machines has the lowest load, and then to make a Telnet or SSH connection to that machine. A scripting facility would allow PuTTY to do things like this automatically.
    • Remembering your password for you. (Obviously we don't recommend you do this, on security grounds; but in one or two situations it might be helpful.)

    We do have a scripting language half-way written for this purpose, though it's unclear when (if) it will ever be finished.

    A scripting language is liable to be a fairly big piece of code, so the language interpreter might end up having to be implemented as a DLL plugin. Hence this feature is dependent on us creating a DLL plugin interface first. Node-path: putty-wishlist/data/url-launching Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1206 Text-content-md5: b54d4471a63f85783d49e0c619d0f08c Text-content-sha1: 90241f23bb977b7be8f6d9ef9da4a21b41ad7cdd Content-length: 1322 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN(((Summary: Launch URLs in the PuTTY window by clicking on them Class: wish Difficulty: tricky Priority: low Depends: scripting Content-type: text/x-html-body

    One of the most common features we are asked for is the ability for PuTTY to recognise URLs displayed in its terminal window, and pass them to the configured default web browser when you click on them.

    This is not a very well-specified feature, since it can be hard to determine exactly where a URL ends and the following text begins. Therefore, it would seem sensible to implement this as a script, after we get a scripting language written. That way, the regular expressions used for URL recognition would be available to the user so that if they didn't quite work right they could easily be tweaked.

    In the meantime, you might find An option to automatically accept all SSH host keys. For some reason lots of people seem to think this would be a really useful feature. I'm sure it would be very convenient, but at the expense of security! The whole point of host keys is that they're the only guarantee you have that your connection hasn't been hijacked by an active attacker between you and the server, and that your data isn't being decrypted by the attacker and re-encrypted. If you want to schedule an automated batch job to use PSCP or Plink, and the interactive host key prompt is making this difficult, add the correct host key to the registry ahead of time. That way you still get the convenience, but without losing the security. We will not accept a command line option to turn off host key checking, no matter how many people have already done the work and send us polished production-quality patches. Node-path: putty-wishlist/data/auth-pref Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 231 Text-content-md5: dd07dba5f2028effc34346e05a2ca29c Text-content-sha1: 2cd8749543b5e3e14f2c9c06eece6b21e2a51c30 Content-length: 347 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNYYYSummary: Preference order for authentications Class: wish Priority: medium Difficulty: Content-type: text/x-html-body

    Ability to select a preference order of authentications, like we can already do for ciphers. Node-path: putty-wishlist/data/cmdline-environ Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 518 Text-content-md5: d900bbe33f9f7a931b425720bb7fb2f7 Text-content-sha1: 7744394b85b6c1248016c02857572db93e1a7d4c Content-length: 634 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNxxxSummary: Command line stored in environment variable Class: wish Priority: low Difficulty: fun Content-type: text/x-html-body

    Perhaps PSCP (and possibly Plink and PSFTP and other potential command-line type tools) should be able to read some default command-line options from an environment variable? Note that if we did this we would also need to supply a negative form of every option, so that a user could always choose to turn off an option that the environment variable had turned on. Node-path: putty-wishlist/data/config-inheritance Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1118 Text-content-md5: 95f1969e24ccba3267b94a23487c11bd Text-content-sha1: 65555c72bc70685d83d03438e08fd3e4a08f20ff Content-length: 1234 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNPPPSummary: Inheritance between saved sessions Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    Inheritable saved sessions. The way I see this working is that you'd have a button marked "Inherit" next to the "Load" button. Selecting an existing saved session and clicking this would give you a weird-looking config box in which all the features had an indicator beside them saying they were inherited from the parent session. Modifying any setting would clear this indicator; clicking the indicator would set it and revert the setting to the way it is in the parent. You could then save and launch this session in the usual way - but if you modified a setting in the parent session which was inherited rather than locally modified in the child, then the child's setting would change. So, for example, you could have most of your day-to-day sessions _inherit_ from Default Settings rather than copying it, so if you found a nicer font you could change them all in one go. Of course there'd be no reason an inherited session couldn't inherit from another inherited session. Node-path: putty-wishlist/data/config-locations Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2384 Text-content-md5: 680b1a06f45a7f8ed88f2a6db05f6986 Text-content-sha1: 923172288017bd70afa1b956c902ad84336791d1 Content-length: 2500 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNBBBSummary: Store configuration in disk file, HKEY_ALL_USERS, other locations Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    PuTTY stores its configuration and host keys in the registry under HKEY_CURRENT_USER, because we think that by and large that is the best single location for the job. However, not everybody agrees, and often for good reason. People carrying PuTTY around on a floppy tend to want to store their configuration in a disk file on the same floppy, so they can take absolutely everything with them from place to place. Sysadmins could very well want to store system-wide configuration in HKEY_ALL_USERS or HKEY_LOCAL_MACHINE.

    The major difficulty with this work is one of design: if there are contradictory things stored in several of these locations, which one should take priority? It seems fairly obvious that HKEY_CURRENT_USER or a disk file represent the choices of an individual user, and therefore they should override HKEY_ALL_USERS or HKEY_LOCAL_MACHINE which merely set defaults over a large number of users. But which of CURRENT_USER and a disk file takes priority? Which of ALL_USERS and LOCAL_MACHINE? You can make a case for either one either way.

    After some consideration, I think that probably the simplest thing would be for each config location (CURRENT_USER, ALL_USERS, LOCAL_MACHINE and disk files) to contain a single "Priority" field - so that a sysadmin could arrange for either of ALL and LOCAL to have higher priority than the other, depending on local needs. PuTTY should scan all config locations and use the priority order it finds. Priorities should be unbounded, so that the local user can always ensure they have a setup which supersedes the systemwide one.

    Another question is how to tell PuTTY about a disk file. Specifying it on the command line is one obvious way, but not a particularly convenient one to set up. Alternatively it could be stored in the Registry somewhere - but where? Within one of these interchangeable config locations (in which case, what happens if a disk file specifies another disk file? Should that be allowed?), or in one single place?

    Finally, although the above design makes it obvious how PuTTY should read its configuration, how should it write it? When the user wants to save a config change, where should it be saved to? Node-path: putty-wishlist/data/control-window-pos Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 918 Text-content-md5: 32bd0d3f75a4d56892252b7014603f00 Text-content-sha1: e9287e81e9e0534cd6b345b3f029753e9a1b02dc Content-length: 1034 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: Remember window position, or allow it to be configured Class: wish Priority: never Difficulty: fun Content-type: text/x-html-body

    The ability to specify the precise position on the screen you want your PuTTY window to open at. This is clearly a very useful thing to have, but it would be just as useful for all the other Windows apps anyone uses. It shouldn't be the responsibility of every single program to include a configuration option to specify window position. Instead, it should be the responsibility of the Windows system itself, or a third-party program, to remember where you like individual programs to go.
    One such program is
    ZMover (shareware); another is HandyThing (free as in beer). If anyone knows of a free (as in speech) one, I'd like to hear about it. Node-path: putty-wishlist/data/cooked-printer Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1217 Text-content-md5: 2a26c4aa044168da6ef9c8b472a544d3 Text-content-sha1: 195401bfbccf9d1bef7d06b5dd01464812e01cac Content-length: 1333 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN333Summary: Feature-rich printer support with formatting control Class: wish Priority: low Difficulty: tricky Depends: mdpi Content-type: text/x-html-body

    Improved ANSI printer control support. Squirting raw data out to a random printer is all very well for people who already have their remote application configured with a driver for their specific printer, but not ideal if you just want to send a text file and have it print in a sensible sort of way. I'd like an alternative printing mode using the Windows graphical printing API (where the printing application has to draw on the page like a canvas), doing the layout myself. Advantages include being able to guarantee the right number of columns and rows per page, being able to let the user select portrait/landscape, and possibly also doing some escape-sequence parsing on the input data stream to handle a variety of simple control codes (DEC/ANSI and PCL both spring to mind, and I think the simple ones of these could both be supported at once without clashes requiring user-level configuration).

    This is certainly going to be a large piece of code, so if it happens at all it will want to be a plugin DLL using the plugin interface. Node-path: putty-wishlist/data/default-colours Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 593 Text-content-md5: e7cdec1009c3e4ad9184ebf4783d56d9 Text-content-sha1: 48802d1ebb891afa2635f6eaf689f3fc8bf0e175 Content-length: 709 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNCCCSummary: Be able to use the Windows default colour scheme Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body

    Windows allows you to globally configure the foreground and background colour for text in application windows, across all applications. Since PuTTY's own foreground and background colour are configurable anyway, it currently ignores this global configuration.

    We should have a checkbox in the Colours panel which allows you to specify that PuTTY's foreground and background colours should follow the Windows default settings. Node-path: putty-wishlist/data/dll-frontend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ca952998b190bf52b0ff1355137eac7d Text-delta-base-sha1: 20755224e1e98d9a1e1b972bfa9ad8f1a119d98e Text-content-length: 177 Text-content-md5: b7d4edec708a0f3379fbf455d50eacf3 Text-content-sha1: cb716243d6d431fcded9779073967e0e9d1951fe Content-length: 216 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNp*mMlZDepends: remove-staticsRemoval of static variables will have to have already happened, so that the DLL can handle more than one connection at a tim Node-path: putty-wishlist/data/drag-drop Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1475 Text-content-md5: cdd65f5933373c3c7097270c0881e8e2 Text-content-sha1: a9ac4e3d6aad1ea9a8510a195a002221f62ed611 Content-length: 1591 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN555Summary: Drag and drop support Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body

    It might be handy if PuTTY supported drag and drop. Applications like Word let you select some text and drag that text around the document; if you drag it into PuTTY it would be nice if PuTTY would interpret that like a paste operation. Possibly allowing users to drag the PuTTY selection out into other windows might be nice too, although this would require some careful thought to work out how it would interact with the existing mouse behaviour. (Perhaps there is no way to make them compatible. Perhaps being able to drag the PuTTY selection would have to be something you have to configure on.)

    Similarly, dragging a URL from a web browser should paste that URL into PuTTY. And perhaps other sorts of drag-and-drop should do plausible things as well.

    (A lot of people ask to be able to drag and drop a file out of Windows Explorer into PuTTY, and have it automatically start up an SCP process to copy that file into the current directory of the remote shell. This is not even feasible in theory - there's no reliable way for PuTTY to determine what the currect directory of the remote shell is. It could be done in principle if you didn't mind the files ending up in your home directory rather than your current one, but that's a lot less useful and I doubt we'd consider it worth the rather complex modifications to PuTTY.) Node-path: putty-wishlist/data/emulate-3-buttons Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 345 Text-content-md5: 3e3184306565ad470ec934afd80104d0 Text-content-sha1: 29a969e87d232bb95bfd4c6471976a33014b3ee9 Content-length: 461 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNKKKSummary: Make left+right click emulate middle-click, like XFree86 Class: wish Priority: low Difficulty: fun Content-type: text/x-html-body

    Perhaps (configurably) we could do the X trick of emulating the middle button when both buttons are pressed, like XFree86 does, to improve X exiles' experience of PuTTY's mouse handling. Node-path: putty-wishlist/data/gui-sftp Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 315 Text-content-md5: 8a1b0d0e98c8e9635982b0c815e9e0c4 Text-content-sha1: fdcb3fbdb8537f2cfa4923197fb16c7804c8292d Content-length: 431 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN---Summary: A GUI client for SFTP Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body

    A GUI SFTP client. (Possibly it should also be able to use SCP but with massively reduced functionality.) Writing big complex GUIs is hard work and I simply don't have the effort to spare. Node-path: putty-wishlist/data/hostkey-policy Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1371 Text-content-md5: f0c3b4de8bd18fe62ca1626674204618 Text-content-sha1: 27b5e3b4fadccaa4b2f2509e2509318b5aa0493f Content-length: 1487 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNMMMSummary: Enhanced flexibility in SSH host key policy Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    PuTTY's host key policy is extremely simple at the moment. The name under which a host key is filed in the Registry is exactly the name you typed into the Hostname box. This avoids ever trusting the DNS for anything.

    Recent versions of OpenSSH appear to file keys under IP addresses as well, although I've never stopped to work out what the semantics of this is. (Is a key considered valid only if it appears from the same host name _and_ IP address, or if it appears from either, or what?) It might be good to sit down and work out what OpenSSH's policy actually is, and wonder whether we want to implement it in PuTTY.

    For the benefit of really weird network setups, it would be nice to be able to explicitly specify what name to store a host key under. (For example, if you're connecting through an SSH port forwarding to the SSH port of another machine, and you've previously connected directly to the same machine, then really you want to be looking the host key up under the same name as it was already stored. You almost certainly don't want to permanently associate that host key with the temporary port number on your local machine which you've chosen for the forwarding.) Node-path: putty-wishlist/data/i18n Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 484 Text-content-md5: b351d343660a2482bf60a31b4e58aab5 Text-content-sha1: efbcad11b59a336950e337e5864dedc1f66367a0 Content-length: 600 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNVVVSummary: Framework for internationalisation Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    Extract all the user-visible text to a single location, so it can be easily replaced with a set of translations into other languages. It's not yet clear whether we want to do this at compile time, post-compile time, or using a Windows string resource (probably not the latter since we will eventually be porting to non-Windows environments). Node-path: putty-wishlist/data/input-methods Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 609 Text-content-md5: fb0adba275a40ce9179679905c6efbd7 Text-content-sha1: 7c64743877f9726e167e4cce264d415680ef838c Content-length: 725 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSSSSummary: Support for international input methods Class: wish Priority: low Difficulty: taxing Content-type: text/x-html-body

    Support for various international input methods. There's been a report from the Netherlands of an "international keyboard driver" which allows you to enter, for example, an "Ë" just by typing a double quote and then an E. I believe there are also Eastern input mechanisms we don't handle sensibly. Somebody who knows about this stuff will have to do it for me and probably explain it to me as well, because I just don't know enough about internationalisation. Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 588 Text-content-md5: f20d4a81bc10974fd16c46690b4fbcf3 Text-content-sha1: 773c75f0c0c24f4bb2aef125ae371e73a8240694 Content-length: 704 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN>>>Summary: Support for Kerberos and GSSAPI Class: wish Priority: low Difficulty: taxing Content-type: text/x-html-body

    Somebody requested "Kerberos 5 credential forwarding". I don't know anything about Kerberos, so if this gets done it will have to be done by somebody who does.

    The SSH 2 drafts also go on about GSSAPI a lot. I'm not sure whether GSSAPI is the same thing as Kerberos, or a similar thing, or if one is an implementation of the other, or what; but it sounds as if it covers roughly the same ground, and we probably ought to support it at some point. Node-path: putty-wishlist/data/key-mapping Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1162 Text-content-md5: a0c0d08a5ef1a5c18a80407ef9d9f064 Text-content-sha1: 78b9d88ceea8fb21e1d824b58f63659f387d5bab Content-length: 1278 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN|||Summary: Generic key mapping facility Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    We've resisted introducing generalised key remapping for some time, on the grounds that it's just too horrible, and also on the grounds that if we introduce a scripting language then key remapping could appear as a side benefit of that.

    However, since scripting now looks likely to be a DLL plugin if it even happens at all, and since more and more people have written to tell us that there are more configurations in use for the function keys than we could possibly have dreamed of, I think we're eventually going to have to get round to doing a proper key remapping facility.

    The major difficulty in this is that we want PuTTY to end up portable to other operating systems. So we're somehow going to have to split the keyboard processing down the middle, so that we have a platform-dependent half which converts Windows keyboard messages into a set of PuTTY standard key and modifier names, and then a platform-generic half which maps our standard key names into actual character sequences to be sent to the host. Node-path: putty-wishlist/data/line-endings Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 518 Text-content-md5: 444d9a10f90362b2d5bd890c1f5aa725 Text-content-sha1: 860a3199b925f624383216c4a01657a0abd5d033 Content-length: 634 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNxxxSummary: Line ending conversion in PSCP and PSFTP Class: wish Priority: medium Difficulty: Content-type: text/x-html-body

    Possibly line-end conversion in PSCP and PSFTP. An option to turn it on, an option (enabled by default) to turn it off, and perhaps an option to try to auto-detect whether to turn it on or not. (Anyone know a good heuristic for distinguishing text from binary files? infozip has one, as does less; anyone want to comment on which is better or whether there are better still?) Node-path: putty-wishlist/data/many-sessions Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1316 Text-content-md5: e75db42f118ffa1a2ec271e55b40f629 Text-content-sha1: 3e926f009b85b1686bc5b29292c0a2518f4c1f43 Content-length: 1432 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Make life easier for people with lots of saved sessions Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    PuTTY's saved sessions list box is fine for people with only a few saved sessions, but some people (such as sysadmins) might plausibly have a much larger number of them and might find the list box unwieldy.

    One solution to this is to invent a means of categorising saved sessions, perhaps by introducing a hierarchical directory structure within the saved-sessions list. (Some list entries would be directories, which you could click on to go down a level; in any non-root directory there would be a `back up a level' item you could click on to go back up.)

    A smaller and simpler alternative would be simply to allow the PuTTY config box to be resized - and grow the saved sessions list box as the window grows. We've been deliberately keeping the config box small for the benefit of people with 640x480 screens, but if a particular user were to want to expand their own config box there'd be no reason to prevent them. For this to be really useful I suppose PuTTY would have to remember the size of its config box...

    It's not impossible that we might want to do both of these things, or something else entirely. Some design is required. Node-path: putty-wishlist/data/menu-bar Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 524 Text-content-md5: 7401fbc19704113b6d24ec9833315ee6 Text-content-sha1: 8fe77512e7ad19bff34f482c200a9d2940e0ce1b Content-length: 640 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN~~~Summary: Menu bar in the PuTTY window Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body

    It might be useful for the PuTTY window to have a menu bar. This would provide an easier way to get at the contents of the System menu, and would have room for much more stuff (such as logging on/off).

    This would certainly be a configurable feature, if we do it at all. PuTTY's minimalist use of screen space is valuable to a number of its users. But other people might find it useful. Node-path: putty-wishlist/data/multiple-connections Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1197 Text-content-md5: 105b39c74c2edf7a4dffecf4771f90e6 Text-content-sha1: 44e752b0bcd82cb0e4acfe599acdc5cbb2efd7ce Content-length: 1313 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Managing multiple connections in one PuTTY Class: wish Priority: low Difficulty: tricky Depends: remove-statics Content-type: text/x-html-body

    A lot of people seem to want a single PuTTY to be able to manage multiple connections. Some want an MDI-style application, with one large main window containing several session windows; other people want the window to stay the same size and the multiple sessions to be selected by Alt-F1, Alt-F2 etc., or by selecting tabs on the window.

    For a start, this can't be done until we've ceased using static variables in the PuTTY back end code. But even assuming that, it would involve a fair amount of reorganisation to set up. In addition I'd want a strong guarantee of reliability (if one session crashes, can it avoid taking the other nine down?). Also I'd want to be able to configure PuTTY to be just the way it is now, because not everybody likes the idea of all their sessions being bound together in a single window; and finally I'd want to be convinced that the code size increase wouldn't be excessive. This is close to having priority "never", in fact, unless someone can convince me it's really worth its while. Node-path: putty-wishlist/data/paste-fidelity Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 668 Text-content-md5: 868c35a6c217ad3dc778cd3e2e6fe2d0 Text-content-sha1: bdf3c28c813646b5cb3b89e210813f025bd7ce19 Content-length: 784 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Extra fidelity in copy and paste operations Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body

    Extra features in pasting. Perhaps PuTTY could somehow remember which on-screen spaces had been output as the result of a tab character, and which were genuine spaces, and reproduce that when copying to the clipboard. Likewise, perhaps, trailing spaces. Also, since we now allow RTF pasting, perhaps it could paste style information (bold, italic etc) alongside the actual text.

    Probably at least some of these features will want to be configurable off, since I can imagine them causing trouble in some situations. Node-path: putty-wishlist/data/paste-semantics Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1999 Text-content-md5: 3b4a577743f7ce1cb2b78e35e003f4f5 Text-content-sha1: 71441f9119da32a8c98913c97e31b368c16db21e Content-length: 2115 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNAAASummary: Alternative semantics for copy and paste Class: wish Priority: low Difficulty: fun Content-type: text/x-html-body

    Some people don't like the X-style copy/paste semantics in which selecting text automatically copies it to the clipboard and clicking a mouse button is enough to perform a paste. These semantics make copy and paste something of a hair-trigger operation - a misplaced click and drag can destroy valuable data from another application which you'd had in the clipboard, and equally a misplaced mouse action can paste all sorts of weird text into an unsuspecting PuTTY.

    An alternative would be to adopt conventional Windows-style copy and paste keys: selecting text has no direct effect, Ctrl-Ins copies it to the clipboard, and Shift-Ins pastes it. (We actually already support Shift-Ins to paste.) We could also support ^C and ^V to do the same things, although this would be unlikely to be very useful since those key combinations are almost always needed to perform server-side actions.

    Another possibility is that perhaps the mouse-clicks-only copy and paste could still work within a single PuTTY window, but Shift-Ins and Ctrl-Ins would be required in order to interact with the main Windows clipboard. This might strike a balance between convenience and safety (although it requires the user to keep in mind that there are two separate clipboards, so it wouldn't make a good default configuration).

    Other options would be to introduce Copy and Paste entries in the System menu (like DOS boxes), or in the toolbar (if we ever add one). And if the current mouse-driven pasting is disabled, then that would leave the right mouse button free to bring up a context menu which could contain Copy and Paste as menu items.

    These would certainly be configurable options if we do them at all - enough people, including the developers, like the copy and paste the way it is that we would never consider removing the current behaviour. Node-path: putty-wishlist/data/ports Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 812 Text-content-md5: 7f019743ff8520b4d211aeb8ead1d373 Text-content-sha1: 0a12c351a519ec92ae9ee26d1529d1d59ef003f7 Content-length: 928 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Ports to other operating systems Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    Ports to other OSes. Among the OSes we'd like to see PuTTY running on are:

    • Unix/X. As well as being a pure network application, it would be particularly nice if a Unix PuTTY could have an extra back end which ran a local shell or command in a pseudo-terminal (or indeed not in a pseudo-terminal), making it an alternative to xterm.
    • MacOS. We had a port half-finished at one point, but it isn't clear how applicable that code would be to the current state of PuTTY.
    • Windows CE, and/or EPOC or other PDA operating systems. Decent SSH clients for PDAs seem to be in short supply (unless you install a Java virtual machine and MindTerm).
    Node-path: putty-wishlist/data/psftp-multi Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 349 Text-content-md5: 77b5c3fc8266c377cb95e7fa143a1045 Text-content-sha1: 79b58851078dc197b1234a07091641e831dc36b9 Content-length: 465 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNOOOSummary: Multiple file transfers (wildcards, recursion) in PSFTP Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body

    PSFTP could do with more features: options and wildcards to ls (-l etc), and perhaps recursive transfer of whole directories like scp. (After all, we can do this in SFTP already!) Node-path: putty-wishlist/data/remove-statics Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 469 Text-content-md5: 6d97ed06c36f9ea9f9d0c0f1a66480fb Text-content-sha1: eaec91244f4d0a86724c5d887fe66b09eee2244e Content-length: 585 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNGGGSummary: Remove static variables to allow multiple or sequential connections Class: wish Difficulty: tricky Priority: low Content-type: text/plain For several reasons it would be handy to be able to run multiple connections in a single process. This will require removing most (or all) of PuTTY's static and global variables, and replacing them with fields in dynamically allocated structures. This is a code cleanup which we should probably do anyway. Node-path: putty-wishlist/data/reorder-sessions Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1191 Text-content-md5: ffb861e8a7a249049d01ed911d21139a Text-content-sha1: 0bea44ed03f738dcbd3e1aba3e401938e23fe02c Content-length: 1307 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Allow frequently used saved sessions to be easy to access Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    PuTTY's inflexible alphabetical ordering of saved sessions is not necessarily ideal if you have more than one screenful of them. You might find that all the ones you use most often are on the second page and you have to scroll down for them, whereas the infrequently accessed ones are available to a single click.

    You can currently fix this by renaming the sessions - I sometimes deliberately start a session name with a zero in order to make it appear at the top of the list - but this is far from ideal.

    One possibility would simply be to allow the user to determine the order of the saved sessions, perhaps by dragging them about or by using some sort of Up and Down buttons.

    Alternatively, someone suggested using adaptive ordering: a new session is placed in the exact middle of the list, and whenever you use a session it moves up the list by one place, so the commonly-used ones gradually bubble up towards the top of the list. I'm not convinced about this, but it's worth at least considering. Node-path: putty-wishlist/data/reuse-windows Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2f530f64fb75cad38ab36fdea10c3f04 Text-delta-base-sha1: f62ff9c4fa5da12b72f8e5f4c6f8ed8a222803bf Text-content-length: 46 Text-content-md5: 97e7a31d0ced9b6ac3d0d559959ede36 Text-content-sha1: c9ad8c9cb0996c7f5570de8df9b2df82f6213ee4 Content-length: 85 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNY%_fun Depends: remove-statics Node-path: putty-wishlist/data/screen-clear Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 292 Text-content-md5: 4033589dd5a8d1cdb9e034f6aeaceae0 Text-content-sha1: 3db3b4ac5248bb4424df00e171de499779a71826 Content-length: 408 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Screen clears should interact with scrollback differently Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body

    It's possible that a screen-clear should push the previous screen contents into the scrollback, rather than losing it completely. Node-path: putty-wishlist/data/sel-colours Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 327 Text-content-md5: 68a764f8dd17585d2b3c81a6bc6bd510 Text-content-sha1: 87ec13fdabdb38c995be9a528b5cb57e688b19cf Content-length: 443 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN999Summary: Make selection colours configurable Class: wish Priority: low Difficulty: fun Content-type: text/x-html-body

    Make selection colours configurable rather than forcing them to be inverse-of-current. But still need inverse-of-current as an option. Come up with a sane UI for this and then implement it. Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 247 Text-content-md5: 4a63b114cf94e9a70a3de2b2846961e2 Text-content-sha1: 8a231fd830c0786b7e6f8ea7cb03728f772a2abc Content-length: 363 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNiiiSummary: Back end that talks to a serial port instead of a network Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    Extra back end to connect to a serial port instead of a Telnet or SSH connection. Node-path: putty-wishlist/data/sgr-as-colours Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 507 Text-content-md5: 05438190ed8f2db91746be4f9740fca3 Text-content-sha1: 157fb27d6a48f1a47d96ed4faafe1616a3406b7a Content-length: 623 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNmmmSummary: Be able to change text colour or font in response to SGR Bold, Underline etc Class: wish Priority: low Difficulty: fun Content-type: text/x-html-body

    Allow the user to select a different default colour for underlined text, and a different default background colour for bold text, and so on. Not everybody wants true WYSIWYG in attribute rendering. Also, consider the possibility of changing fonts for some of these criteria (might be useful for people with low vision). Node-path: putty-wishlist/data/srp-auth Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1021 Text-content-md5: 17d654ddb27f4edc181de6ddd8d716b6 Text-content-sha1: e152752cc740216a80f9d478bf1d528b3f6cd136 Content-length: 1137 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNoooSummary: SRP authentication (in SSH and perhaps also Telnet) Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    SRP support, as an alternative to pure password authentication. Possibly also in Telnet.

    This would be really useful in SSH, because it removes a lot of the danger of accepting a host key you're uncertain about. The SRP exchange convinces each side that the other side knows the same password, without requiring either side to give the password away to the other - so if you use SRP authentication, you can safely type your password in even if you don't know the remote host key is correct. Moreover, the current drafts of SRP authentication in SSH then use the SRP shared secret to authenticate the SSH host key - so that even if you aren't sure the host key belongs to the host you think it does, you can at least be sure that it does belong to a machine which knows your password. This would be a massive improvement in the SSH host key model. Node-path: putty-wishlist/data/ssh2-generality Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1072 Text-content-md5: 51c4522d6905f278ea9947d2c1ecb25f Text-content-sha1: 7a1581f32f43b9a99f924a6e2da5888b7577954d Content-length: 1188 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN"""Summary: Support for SSH2: zero, or more than one, terminal per session Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    SSH 2 is a much more flexible protocol than SSH 1. It doesn't require exactly one terminal session per SSH connection; you can have more than one, or indeed none at all.

    It would be nice if PuTTY could make use of this. For example, there could be a System menu option to start an extra terminal window inside the same SSH connection as the existing one(s). This would be more efficient than the existing Duplicate Session command, and also wouldn't require repeated authentication (which you don't care that much about if you're using public keys, but you might care a lot if you don't want to have to type your password in again).

    Going in the other direction, several people have asked if it could be possible to start PuTTY without starting a terminal window and a shell - just have PuTTY sit in the background and do port forwarding only. This would also be possible in theory. Node-path: putty-wishlist/data/ssl Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 568 Text-content-md5: a18a197179b57ab6a580d12d13ae9d61 Text-content-sha1: 7255f021fc52328f8738064c24ed61e74f397cde Content-length: 684 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN***Summary: Support for SSL Class: wish Priority: low Difficulty: taxing Content-type: text/x-html-body

    There's been one request for SSL. (SSL/Telnet in particular; possibly also raw-SSL in order to talk directly to HTTPS?) Most of the SSL protocol looks reasonably sane, except for the certificates (ASN.1 and X509 and other buzzwords). If the certificate processing turns out to take too much code, SSL might not make it into the PuTTY core for size reasons - it would have to be compiled in specially, or perhaps shipped as a separate DLL. Node-path: putty-wishlist/data/status-bar Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 731 Text-content-md5: 53f7c5836d851aa9fc718dd224c07299 Text-content-sha1: 8b8e090aed87a5cbee23157efd7fe64f963781da Content-length: 847 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNMMMSummary: Status bar on the PuTTY window Class: wish Priority: medium Difficulty: Content-type: text/x-html-body

    The PuTTY window could have a status bar with various information on it. A visible indicator of whether the connection is secured or not (for the paranoids who aren't sure whether they remembered to hit the SSH radio button); a display of the cursor coordinates; whether the terminal bell is currently overloaded; some sort of visual representation of the host key perhaps. Anything else that springs to mind.

    This would certainly be a configurable feature, if we do it at all. PuTTY's minimalist use of screen space is valuable to a number of its users. But other people might find it useful. Node-path: putty-wishlist/data/system-tray Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 707 Text-content-md5: 3a4f2b683e857ca2a9c22ce0470b0bfe Text-content-sha1: a4de08afccb20e6c981e456ededd9f860024b2bd Content-length: 823 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN555Summary: Use of the System tray Class: wish Priority: never Difficulty: tricky Content-type: text/x-html-body

    Use of the System tray. So many people have requested this that I think it's a genuine desirable feature, but I don't want it to bloat the core of PuTTY. Therefore, it should be implemented using a separate program. There are a variety of programs out there already that do this. Here are some links to them.

    Node-path: putty-wishlist/data/terminfo Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 355 Text-content-md5: 2bcc461ea34d2d251c8722f3d1485cd0 Text-content-sha1: 323a101bc5449f998fee94091da92503d106b2f7 Content-length: 471 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNUUUSummary: Maintain a terminfo for PuTTY's terminal emulator Class: wish Priority: medium Difficulty: Content-type: text/x-html-body

    It would be nice to maintain our own terminfo/termcap description of the terminal emulated by PuTTY, as an alternative to having PuTTY claim to be an xterm and hoping everybody's xterms behave similarly. Node-path: putty-wishlist/data/toolbar Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 532 Text-content-md5: 69639a31a28d2fd690965c7ea6906347 Text-content-sha1: 986af1159c49909f67b9cf0a6d920732dfa694f9 Content-length: 648 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Toolbar on the PuTTY window Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body

    The PuTTY window could have a toolbar, containing copy and paste buttons, a close button, new-session and duplicate-session, start and stop logging, perhaps a drop-down list to select and start a saved session.

    This would certainly be a configurable feature, if we do it at all. PuTTY's minimalist use of screen space is valuable to a number of its users. But other people might find it useful. Node-path: putty-wishlist/data/transparency Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 567 Text-content-md5: 5cfbdb9ef35bce5270379e934ba217f3 Text-content-sha1: 8676ba046a39828f0b51fdf6f68167b815306eca Content-length: 683 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN)))Summary: Transparent or translucent PuTTY window Class: wish Priority: never Difficulty: fun Content-type: text/x-html-body

    A transparent, semi-transparent or alpha-blended PuTTY window. We think this is pointless frippery and would bloat the binary to no useful purpose. Furthermore, there are third-party utilities which will do this for you without us needing to modify PuTTY; have a look at PowerMenu and also Glass2k. Node-path: putty-wishlist/data/x11-auth Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 642 Text-content-md5: 4eba96a51472d895622b565ede80305d Text-content-sha1: ed09bb60e072c2ce0577f3338c0710577207d411 Content-length: 758 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNtttSummary: Authenticate with local X servers Class: wish Priority: low Difficulty: taxing Content-type: text/x-html-body

    X11 forwarding currently doesn't even attempt to authenticate with the local X server. In order for it to do so, PuTTY would have to know where to look for authentication data. It would be nice if this were to happen.

    It isn't obvious that this is even necessary; we've had X forwarding in PuTTY for some months now, including in a major release, and nobody has ever complained at the lack of this feature. It may simply be that Windows X servers can't be bothered with local authentication at all. Node-path: putty-wishlist/data/zmodem Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 466 Text-content-md5: d1f72318f6d4944d7930a341195937c3 Text-content-sha1: 125c6ba1438a416fc879ddafe0f5d0386cc7c157 Content-length: 582 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNDDDSummary: File transfers using Zmodem Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body

    Lots of people seem to want Zmodem file transfers. We don't see that this is a vital requirement because we already supply two file transfer mechanisms in the PuTTY suite; but if someone were to do the work for us we might accept it.

    Then again, it might be better if it went in as a DLL plugin. Depends how big it is, I think. Revision-number: 1645 Prop-content-length: 288 Content-length: 288 K 7 svn:log V 187 Initial thoughts on an authentication preference list: It would be nice to have some way for the user to say "skip to next authentication method" at run-time. (Control-C? Control-D?) K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-05-09T21:53:37.000000Z PROPS-END Node-path: putty-wishlist/data/auth-pref Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dd07dba5f2028effc34346e05a2ca29c Text-delta-base-sha1: 2cd8749543b5e3e14f2c9c06eece6b21e2a51c30 Text-content-length: 152 Text-content-md5: 3e0556498f15cdbb41ffc7e35c1e9934 Text-content-sha1: 65d8b0a7fc5265db656c77f6ca19c13d748bd42a Content-length: 191 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNY^Y

    It would be nice to have some way for the user to say "skip to next authentication method" at run-time. (Control-C? Control-D?) Revision-number: 1646 Prop-content-length: 228 Content-length: 228 K 7 svn:log V 127 I think `-o Name=Value' type options would be good and ought to be addable at little cost if `config-locations' is done right. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-05-09T22:00:19.000000Z PROPS-END Node-path: putty-wishlist/data/command-line Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 778b2012b5ab5d2deb3a2cba062da6b8 Text-delta-base-sha1: 96dfb6c58b73d4763fc15889b77f5de9b645b87a Text-content-length: 369 Text-content-md5: d14d28cfd2b968849d1d9f40d74ee2ab Text-content-sha1: a5f2bd16043893f7fee0e57892a27a9ee9899d25 Content-length: 408 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNh^ ^li> As a final fallback, ability to tweak any option via something like OpenSSH's `-o Name=Value' option. Need to think about how to deal with complex options like colour selection. Also, some of the existing names for options in the Registry are inappropriate - e.g., `LinuxFunctionKeys'. Seems dependent on wishlist item `config-locations'. Revision-number: 1647 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2002-05-09T22:26:57.000000Z K 7 svn:log V 56 Thoughts that have occurred to me re mget/mput in psftp K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-multi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 77b5c3fc8266c377cb95e7fa143a1045 Text-delta-base-sha1: 79b58851078dc197b1234a07091641e831dc36b9 Text-content-length: 186 Text-content-md5: c1668d6136aa674e95857795a27659f9 Text-content-sha1: 51910aa3e4ec463afc42acffe7ac3548313d81c3 Content-length: 225 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNOv'O'

    If we implement the recursion stuff, could do with pulling it out from scp.c into something more common.

    Need to think about reget-type operation with mget? Revision-number: 1648 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2002-05-09T22:33:11.000000Z K 7 svn:log V 90 Add Owen's commentary on binary compression from <83665v1h10.fsf@chiark.greenend.org.uk>. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/compress-binaries Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 912 Text-content-md5: 1777368fa869f1be3041bceb2526e24d Text-content-sha1: 96d7c4f850a9c77d33beca5ddb62f084873f3c85 Content-length: 1028 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Compress shipped PuTTY binaries with a tool such as UPX Class: wish Priority: never Content-type: text/x-html-body

    Occasionally it's suggested that we compress the PuTTY binaries on our website with tools such as UPX.

    While it's an interesting idea, it's not currently for us.

    • Firstly, PuTTY is already quite small and you can comfortably carry around the PuTTY tools you're likely to use frequently on a floppy disk.
    • Secondly, and more importantly, we provide cryptographic signatures of the binaries we've generated with our compilers. We're as confident as we can be that they've not been tampered with between being built and being signed; UPXing the binaries would make us a lot less confident of this.

    In short, if you want to UPX the binaries, fine, but at the moment we're not planning to. Revision-number: 1649 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2002-05-09T23:41:24.000000Z K 7 svn:log V 93 Coo, an actual bug. The "nonexistent channel -1" thing that's been cropping up occasionally. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/nonexistent-channel Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 650 Text-content-md5: c7ea1070170a7e04069450ba27db6aea Text-content-sha1: 18dc1f054c1d5d4481a14649f1833ace76525179 Content-length: 766 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN|||Summary: `nonexistent channel -1' crashes Class: bug Content-type: text/x-html-body Present-in: 0.52 2002-03-14

    We're getting occasional reports of PuTTY sessions dying with messages like "Server sent disconnect message: received data for nonexistent channel -1". Reports so far:

    • OpenSSH-1.2.3 on Debian potato, 0.52 on W2K, port forwarding "mapping port 993 to 3993" (don't know which way)
      "Server sent disconnect message: received data for nonexistent channel -1"
    • "SSH-1.99-OpenSSH_2.9.9p2", 2002-03-14 on XP Pro
      "Server sent disconnect message. Received ieof for nonexistent channel -1"
    Revision-number: 1650 Prop-content-length: 211 Content-length: 211 K 7 svn:log V 110 Added Alexander Hall's suggestions for Pageant behaviour on hibernation tempered with my and Owen's comments. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-05-10T00:00:41.000000Z PROPS-END Node-path: putty-wishlist/data/pageant-hibernate Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1006 Text-content-md5: d88a646e795e14cb3cb5efaec9451b95 Text-content-sha1: c9c4002d6ddb3c4e84fe03122accefa659a0285c Content-length: 1122 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN```Summary: Discard sensitive material in Pageant on hibernation Class: wish Priority: low Content-type: text/x-html-body

    It's been suggested that Pageant (and anything else storing private key material long-term) should forget (wipe) all its unencrypted keys when a system hibernates, to avoid them being stored to disk; it should at least reload the keys and ask for passphrases again after a hibernation. Apparently the windows messages BT_APMQUERYSUSPEND and PBT_APMSUSPEND would be useful here.

    Low priority because:

    • If you have physical access to the machine, then you've compromised its security anway; you can just install a trojan pageant which will happily snarf the passphrases from keys for you, or perpetrate any one of a number of other attacks.
    • Pageant doesn't currently attempt to prevent key material being written to disk. (We don't for instance use VirtualLock(); see Peter Gutmann's comments on its deficiencies in various places.)
    Revision-number: 1651 Prop-content-length: 262 Content-length: 262 K 7 svn:log V 161 Added skeletal description of the broken printer list in the ANSI printing support introduced since 0.52. XXX: should include more details from the mailing list K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-05-10T00:05:06.000000Z PROPS-END Node-path: putty-wishlist/data/printer-list Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 459 Text-content-md5: 5c15874482376a0071a5d7865d66c0b6 Text-content-sha1: 13997e321b36142baacd557ed5100e7c6b14bef6 Content-length: 575 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN===Summary: Printer list not working properly Class: bug Difficulty: taxing Content-type: text/x-html-body Absent-in: 0.52 Present-in: 2002-05-09

    The magic we use to get a drop-down list of printers for our raw ANSI printing support doesn't work too well on all systems. You can still type a printer name into the combo box and expect it to work. We've received various suggested fixes, but we haven't understood / tested them thoroughly yet. Revision-number: 1652 Prop-content-length: 232 Content-length: 232 K 8 svn:date V 27 2002-05-10T00:09:06.000000Z K 7 svn:log V 131 "PSFTP seems slower than PSCP" copied verbatim from FAQ A.6.8. (People may wish to change my priority/difficulty classifications.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sftp-slow Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 516 Text-content-md5: c0462399b20cbe9ac039924e0d424fd4 Text-content-sha1: 5001e4d663c2aeb3b676db28d5dc4cc67495b6be Content-length: 632 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNvvvSummary: PSFTP transfers files much slower than PSCP. Difficulty: taxing Priority: low Class: semi-bug

    We believe this is because the SFTP and SSH2 protocols are less efficient at bulk data transfer than SCP and SSH1, because every block of data transferred requires an acknowledgment from the far end. It would in theory be possible to queue several blocks of data to get round this speed problem, but as yet we haven't done the coding. If you really want this fixed, feel free to offer to help. Revision-number: 1653 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2002-05-10T00:29:22.000000Z K 7 svn:log V 113 Add Adam Johnson's suggestion of using RedMon for cooked printer support in the absence of any work on our part. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/cooked-printer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2a26c4aa044168da6ef9c8b472a544d3 Text-delta-base-sha1: 195401bfbccf9d1bef7d06b5dd01464812e01cac Text-content-length: 264 Text-content-md5: 75ce6ba5877e399ab7a3e7ac4d215ab7 Text-content-sha1: 86b0e995e291109dbef6239393c02d5e84ea00d5 Content-length: 303 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN3(u3u

    In the meantime, if you have something which will emulate your favourite printer language (e.g. Ghostscript for Postscript), you can try bolting it on to PuTTY with something like RedMon. Revision-number: 1654 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2002-05-10T00:33:59.000000Z K 7 svn:log V 17 Add content-type K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sftp-slow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c0462399b20cbe9ac039924e0d424fd4 Text-delta-base-sha1: 5001e4d663c2aeb3b676db28d5dc4cc67495b6be Text-content-length: 49 Text-content-md5: df91be8ac74f69c193a5b9fbc385dce2 Text-content-sha1: d53a0f07562b54acb49fa18f7ae66cd3be08f25a Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNvgfContent-Type: text/x-html-body Revision-number: 1655 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 60 text/html --> text/x-html-body (to match current bugs2html) K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-05-10T00:38:40.000000Z PROPS-END Node-path: putty-wishlist/control/spec Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b3f31d8663779af8d88431e53581264c Text-delta-base-sha1: 9c663687443beafc6a86c7aaa8dc5f68ab005381 Text-content-length: 39 Text-content-md5: 54b728a33026d067005a2912fa2944d5 Text-content-sha1: 8ce2463ac5b925400887c1bbf1d096001194053b Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN=D FkR text/x-html-body Revision-number: 1656 Prop-content-length: 306 Content-length: 306 K 8 svn:date V 27 2002-05-10T20:29:44.000000Z K 7 svn:log V 205 Add the "Plink running under Cygwin can't talk to Pageant" problem that several people have reported, along with some very helpful-looking stuff from Angus Duggan and rampant speculation from yours truly. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/cygwin-clobbers-pageant Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2075 Text-content-md5: 0f8d2085b8be103995814a0b1144bfa7 Text-content-sha1: 89a1be16d76afd2d4b3ed92de34fc7e42e4cfe7d Content-length: 2191 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  Summary: Plink (etc) run under Cygwin cannot talk to Pageant Class: bug Content-type: text/x-html-body Present-in: 0.52 Absent-in: 0.51 Priority: medium Difficulty: taxing

    We've had several reports that when utilities such as Plink are run under Cygwin, requesting keys from a running Pageant fails.

    Useful stuff from Angus Duggan:

    Problem does not occur with Pageant 0.51, but does occur with 0.52 (version of Plink/PSCP is unimportant)

    BTW, I'm still having bizarre problems with plink not communicating with
    Pageant. I have no idea what is going wrong, but Pageant repeatably passes
    the key when plink is invoked from an NT command shell, and repeatably
    doesn't pass the key when invoked from a cygwin bash shell. (Versions 0.51
    and 0.52.) UPDATE: I've just run the debugger on plink; the SendMessage in
    agent_query (pageantc.c) is returning 0 in the bash shell and 1 in the cmd
    shell. On the pageant side, it's the EqualSid() call that is failing when run
    under cygwin. Starting pageant from a cygwin shell, and it works...(BTW, the
    same is true for running under cvs in emacs, but I may have my shell set to
    cygwin bash for that too.) I have not yet worked out why the SID is
    different; I have run mkpasswd and checked the results in cygwin, and tried
    messing with it a bit, but to no avail.

    Here's a followup to the SID differences I reported yesterday, which are
    causing failures under cygwin. I instrumented Pageant to show me the accounts
    for the SIDs, and when Pageant or another application is started directly, it
    runs as BUILTIN\Administrators. When an application is run under cygwin, it
    runs as MACHINE\user. The SID I am using is a member of the Administrators
    group for this machine (Win2K is almost impossible to use for development if
    this is not the case).

    Simon was unable to reproduce this. I'm going to speculate that it might involve having an /etc/passwd that's been populated with SIDs by make-passwd, and/or be something to do with Cygwin's ntsec option. Revision-number: 1657 Prop-content-length: 317 Content-length: 317 K 8 svn:date V 27 2002-05-10T20:51:47.000000Z K 7 svn:log V 216 Message from "G. Albert Mietus" reminds me of something I've had in mind for a while -- Pageant should provide better user oversight, so that users have a chance of spotting if agent forwarding is being abused, etc. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pageant-logging Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 411 Text-content-md5: 0718fbd43ed8b321fa718e4ea555f8c6 Text-content-sha1: 22f5b1419ec72b6b869a0093472d373a84db882c Content-length: 527 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN  Summary: Logging for Pageant Class: wish Priority: medium Difficulty: tricky Depends: pageant-key-mgmt Content-type: text/x-html-body

    It would be good if Pageant could provide a log of requests that have been made of it (who, what, when) - particularly useful if agent forwarding is in use. Perhaps something in the style of PuTTY's Event Log?

    Probably depends on better key management. Revision-number: 1658 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2002-05-10T22:29:36.000000Z K 7 svn:log V 128 The 'Access denied' / 'RSA_verify failed' bug that's been kicking around for a while, plus Simon's plan for further work on it. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rsa-verify-failed Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1019 Text-content-md5: d4544a8268900fc1d1c207136ec7a042 Text-content-sha1: e5cd14d2f14d51ed2ab3669b9a4d67e002ff43c9 Content-length: 1135 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNmmmSummary: Occasional `Access denied' / `RSA_verify failed' Class: bug Difficulty: tricky Content-type: text/x-html-body

    With SSH2, OpenSSH (various versions), RSA public key, key authentication has been reported to occasionally and randomly fail with an `Access denied' message. A message like the following is written in the server's log:

    error: ssh_rsa_verify: RSA_verify failed:
        error:04077077:lib(4):func(119):reason(119)

    A report of this problem can be found here.

    We occasionally see this. We think there's some sort of latent intermittent problem in the PuTTY bignum library, and we do plan to fix it at some point; what we really need to do is to prepare a trick PuTTY with a tweaked random number generator so that once we see the bug occur once we can then fix the random seed and replicate it consistently for debugging. This is more work than we've had time to do as yet. Revision-number: 1659 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2002-05-10T22:40:08.000000Z K 7 svn:log V 103 Added note about PuTTY reading a disk file from the directory it was invoked from, if it can find one. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/config-locations Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 680b1a06f45a7f8ed88f2a6db05f6986 Text-delta-base-sha1: 923172288017bd70afa1b956c902ad84336791d1 Text-content-length: 190 Text-content-md5: 27e77b5904be4632748458880c5a7d96 Text-content-sha1: b841f47a50a871443112a01547f50d68cb3b3939 Content-length: 229 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNBn &z&NtShould PuTTY look for a disk file in the directory it was run from, and if found, use that in the first instance? (Supports convenient `run from a floppy' operation.) Revision-number: 1660 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2002-05-10T22:54:31.000000Z K 7 svn:log V 34 Hyperlinks for "Depends:" headers K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2fed4f22030d57a343cb06bc252c7ca8 Text-delta-base-sha1: 3e5077ed5bc00a360729edca8bcd13c4f14ffa2d Text-content-length: 210 Text-content-md5: d91db1c20bdb6611b0eea7bd169695be Text-content-sha1: fb00c6d36b44aa503ed46ca28fcffe7b5f085890 Content-length: 249 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNJC 9AH?xB#! /usr/bin/perl # $Id: bugs2html,v 1.6 2002/05/10 22:54:31 jacob if ($h eq "depends") { print HTML map "$_", (split ' ', $hdrs->{$h}); } els Revision-number: 1661 Prop-content-length: 235 Content-length: 235 K 8 svn:date V 27 2002-05-11T08:55:56.000000Z K 7 svn:log V 134 Added wishlist item for GUI authentication option after a bit of on-list discussion. (Removed the bit about making it Pageant's job.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/gui-auth Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1033 Text-content-md5: 98f1d24c0a89a87e9179dc521e1ea450 Text-content-sha1: 148d35923067822ca02906059be5cf39ce6bee25 Content-length: 1149 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN{{{Summary: Option to use GUI dialogs for authentication Class: wish Priority: low Content-Type: text/x-html-body

    Several people have asked for password/passphrase prompts etc to appear in dialogue boxes in Plink and/or PuTTY, rather than inlined into the terminal output. There are a couple of good reasons you might want to do this.

    For instance, if you're using Plink with CVS but not using passphraseless keys or Pageant, the interface for typing your password is less than ideal (you have to find the relevant command window and type blind into it, apparently).

    Similarly if we ever get a Plink/PuTTY mode where no terminal session is required (e.g. it's used for forwarding only).

    Also, GUI popups provide some degree of assurance against spoofing attacks; with password/passphrase prompts in the same terminal window as everything else, it's not always easy to be sure that your password is going where you expect, whereas a dialog box is somewhat harder to spoof.

    All optional, of course. Revision-number: 1662 Prop-content-length: 303 Content-length: 303 K 7 svn:log V 202 Improved error messages if you use the wrong key type: you should now be told that the key is the wrong type, _and_ what type it is, rather than being given a blanket `unable to read key file' message. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-05-11T12:13:42.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b015fd85b39138b0b0cba01c61bcf163 Text-delta-base-sha1: 83bd2292ccd45c555251d0afb8b2a219926e1cf6 Text-content-length: 539 Text-content-md5: 7c34f20d7760acec2938226138fcb5b5 Text-content-sha1: 533942624ef74e3c47cf15d6cc35336806d0f5ad Content-length: 579 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVN"7VZrjn;_E!mt5Z type; int original_pass; type = key_type(filename); if (type != SSH_KEYTYPE_SSH1 && type != SSH_KEYTYPE_SSH2) { char msg[256]; sprintf(msg, "Couldn't load this key (%s)", key_type_to_str(type)); MessageBox(NULL, msg, APPNAME,type == SSH_KEYTYPE_SSHtype == SSH_KEYTYPE_SSHtype == SSH_KEYTYPE_SSHtype == SSH_KEYTYPE_SSHtype == SSH_KEYTYPE_SSHtype == SSH_KEYTYPE_SSHtype == SSH_KEYTYPE_SSH1) sfree(rkey); return; } if (type == SSH_KEYTYPE_SSH Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5c669f474c463805e6009cc0f4da8e41 Text-delta-base-sha1: 08787cab3f82fbe4b275c267c521e8c71e939e0c Text-content-length: 340 Text-content-md5: 09a4bc3e0e421f975c535732b6382ac5 Text-content-sha1: d9513050beb1f55a0c3cbf74119f6c400d6be0f9 Content-length: 380 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN8V)uxTe{_g\M0typetype = key_type(filename); if (type != SSH_KEYTYPE_SSH1 && type != SSH_KEYTYPE_SSH2) { char msg[256]; sprintf(msg, "Couldn't load private key (%s)", key_type_to_str(type)); MessageBox(NULL, msgtype == SSH_KEYTYPE_SSHtype == SSH_KEYTYPE_SSHtype == SSH_KEYTYPE_SSH Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2fb6077c26ab9340f07f04e080523e93 Text-delta-base-sha1: ea0ac36c2f2e682b35a3e0693ec6c6b79888edde Text-content-length: 1354 Text-content-md5: 80f87924df692cf43dc6187dca94e7c8 Text-content-sha1: cfedb67ecca4ea8394ab59972507b46ee26170ce Content-length: 1395 K 15 cvs2svn:cvs-rev V 5 1.203 PROPS-END SVNp:^2Rx nt type; char msgbuf[256]sprintf(msgbuf, "Trying public key \"%.200s\"", cfg.keyfile); logevent(msgbuf); type = key_type(cfg.keyfile); if (type != SSH_KEYTYPE_SSH1) { sprintf(msgbuf, "Key is of wrong type (%s)", key_type_to_str(type)); logevent(msgbuf); c_write_str(msgbuf); c_write_str("\r\n"); tried_publickey = 1; continue; };~s H'agth - 5); /* * Now examine the other side's KEXINIT to see what we're up * to. */ if (pktin.type != SSH2_MSG_KEXINIT) { bombout(("expected key exchange packet from server")); crReturn(0); } kex = NULL; hostkey = NULL; cscipher_tobe = NULL; sccipher_tobe = NULL; csmac_tobe = NULL; scmac_tobe = NULL; cscomp_tobe = NULL; int keytype; logeventf("Reading private key file \"%.150s\"", cfg.keyfile); keytype = key_type(cfg.keyfile); if (keytype == SSH_KEYTYPE_SSH2) publickey_blob = ssh2_userkey_loadpub(cfg.keyfile, NULL, &publickey_bloblen); else { char msgbuf[256]; logeventf("Unable to use this key file (%s)", key_type_to_str(keytype)); sprintf(msgbuf, "Unable to use key file \"%.150s\" (%s)\r\n", cfg.keyfile, key_type_to_str(keytype)); c_write_str(msgbuf); publickey_blob = NULL; }publickey_blob Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 942370a0158fef14b4eba15672a9c672 Text-delta-base-sha1: 889bc839a0b6e8fadd27596b2a2f045971c5f8bd Text-content-length: 230 Text-content-md5: ff4d5f8a9db9682c57264a8c3daa3a53 Text-content-sha1: 759f1adf8fa8db87fed7e34e12ae199fb05e48db Content-length: 270 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNs N NF-enum { SSH_KEYTYPE_UNOPENABLE, SSH_KEYTYPE_UNKNOWN, SSH_KEYTYPE_SSH1, SSH_KEYTYPE_SSH2, SSH_KEYTYPE_OPENSSH, SSH_KEYTYPE_SSHCOM }; int key_type(char *filename); char *key_type_to_str(int typ Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6cc937f6654dd4917910790d59491969 Text-delta-base-sha1: 4aa0005ebe726f58a4fc9de4719ade0c6e6497fb Text-content-length: 1584 Text-content-md5: b45c52dbfa8399c08cf38f4b5e3a8a0d Text-content-sha1: 1a496c29cdfb805521be83665a8761b7211b39d2 Content-length: 1624 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNtQ7the type of a private key file. Returns * 0 on failure, 1 or 2 on success. */ int key_type(char *filename) { FILE *fp; char buf[32]; const char putty2_sig[] = "PuTTY-User-Key-File-"; const char sshcom_sig[] = "---- BEGIN SSH2 ENCRYPTED PRIVAT"; const char openssh_sig[] = "-----BEGIN "; int i; fp = fopen(filename, "r"); if (!fp) return SSH_KEYTYPE_UNOPENABLE; i = fread(buf, 1, sizeof(buf), fp); fclose(fp); if (i < 0) return SSH_KEYTYPE_UNOPENABLE; if (i < 32) return SSH_KEYTYPE_UNKNOWN; if (!memcmp(buf, rsa_signature, sizeof(rsa_signature)-1)) return SSH_KEYTYPE_SSH1; if (!memcmp(buf, putty2_sig, sizeof(putty2_sig)-1)) return SSH_KEYTYPE_SSH2; if (!memcmp(buf, openssh_sig, sizeof(openssh_sig)-1)) return SSH_KEYTYPE_OPENSSH; if (!memcmp(buf, sshcom_sig, sizeof(sshcom_sig)-1)) return SSH_KEYTYPE_SSHCOM; return SSH_KEYTYPE_UNKNOWN; /* unrecognised or EOF */ } /* * Convert the type word to a string, for `wrong type' error * messages. */ char *key_type_to_str(int type) { switch (type) { case SSH_KEYTYPE_UNOPENABLE: return "unable to open file"; break; case SSH_KEYTYPE_UNKNOWN: return "not a private key"; break; case SSH_KEYTYPE_SSH1: return "SSH1 private key"; break; case SSH_KEYTYPE_SSH2: return "PuTTY SSH2 private key"; break; case SSH_KEYTYPE_OPENSSH: return "OpenSSH SSH2 private key"; break; case SSH_KEYTYPE_SSHCOM: return "ssh.com SSH2 private key"; break; default: return "INTERNAL ERROR"; break; } } Revision-number: 1663 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2002-05-11T13:03:47.000000Z K 7 svn:log V 25 Added SSH2 only support. K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 940965428204647a7c10cbb2670160a5 Text-delta-base-sha1: 96344005f4217c4930a437e4459ef3ce04a2782d Text-content-length: 198 Text-content-md5: 60fe369299ee02d8a33a33697f8e62e3 Text-content-sha1: 5d34a616d07ccd96e0eab42f7a5ed0b564795bbf Content-length: 238 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNm`*j:qL!\versionid $Id: config.but,v 1.32 2002/05/11 13:03:47 oweIf you select \q{2 only} here, PuTTY will only connect if the server you connect to offers SSH protocol version 2 Revision-number: 1664 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2002-05-11T13:08:37.000000Z K 7 svn:log V 18 SSH2 only support K 10 svn:author V 4 owen PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 80f87924df692cf43dc6187dca94e7c8 Text-delta-base-sha1: cfedb67ecca4ea8394ab59972507b46ee26170ce Text-content-length: 317 Text-content-md5: aa2bb8dacd0844befe157ab0e6223dad Text-content-sha1: daea1ea429ab4a5ee44b7f18dd53e497ac31d178 Content-length: 358 K 15 cvs2svn:cvs-rev V 5 1.204 PROPS-END SVN0K. if (cfg.sshprot == 3) { bombout(("SSH protocol version 2 required by user but not provided by server")); crReturn(0); } ;B; + 5, pktout.length - 5); ssh2_pkt_send(); if (!ispkt) crWaitUntil(ispkt); sha_string(&exhash, pktin.data + 5, pktin.len Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5de563285fa23058b03e9521b684a140 Text-delta-base-sha1: 048025acb05c671715eb5e5f17eabfde5198d457 Text-content-length: 849 Text-content-md5: 8611914c7e07ba77ea661572ce622433 Text-content-sha1: e83773c1c717501b30699461dd3fcfcdbc4b58aa Content-length: 890 K 15 cvs2svn:cvs-rev V 5 1.183 PROPS-END SVN?"=W3x>w3[*VI6R@NKO`SSHPROT2ONLYcase IDC_SSHPROT2ONLYONLY, cfg.sshprot == 1 ? IDC_SSHPROT1 : cfg.sshprot == 2 ? IDC_SSHPROT2 : cfg.sshprot == 3 ? IDC_SSHPROT2ONLY : IDC_SSHPROT1); /* Should we make the default 2? */n3, "&1", IDC_SSHPROT1, "&2", IDC_SSHPROT2, "2 o&nly", IDC_SSHPROT2ONLY case IDC_SSHPROT2ONL else if (IsDlgButtonChecked(hwnd, IDC_SSHPROT2ONLY)) cfg.sshprot = 32QQ2nd, IDC_LPORT_ALL); break; case IDC_RPORT_ALL: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.rport_acceptall = IsDlgButtonChecked(hwnd, IDC_RPORT_ALL); break; case IDC_X11_DISPLAY: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_X11_DISPLAY, cfg.x11_d Revision-number: 1665 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2002-05-11T13:12:19.000000Z K 7 svn:log V 52 Remove tiny unnecessary faff in new SSH-2-only code K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8611914c7e07ba77ea661572ce622433 Text-delta-base-sha1: e83773c1c717501b30699461dd3fcfcdbc4b58aa Text-content-length: 144 Text-content-md5: 33103512ba7260508f32dba2d4fb8914 Text-content-sha1: 2786e567b8278210afb4155e2dd79e00b0db34e0 Content-length: 185 K 15 cvs2svn:cvs-rev V 5 1.184 PROPS-END SVNgkT IDC_SSHPROT2ONLY);nd, IDC_LPORT_ALL); break; case IDC_RPORT_ALL: if (HIWORD(wParam) == BN_C//T Revision-number: 1666 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2002-05-11T13:24:58.000000Z K 7 svn:log V 36 SSH2 only support, but no SSH1 only K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/ssh2-only Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 26b28af71d4c5c9863e16f9b5bf76df5 Text-delta-base-sha1: 9515d8624840ae14c07877616dd9b6f33d012492 Text-content-length: 153 Text-content-md5: 8d3484379f46c1d663afd9c3d13d5416 Text-content-sha1: a4c17b6b69d14f1eb4b05c9822e84d2a80877886 Content-length: 192 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNU[U (I really can't see a great need or use for SSH1 only, so I've not implemented it. It would be trivial to do so if it were needed.) Revision-number: 1667 Prop-content-length: 115 Content-length: 115 K 7 svn:log V 16 Fixed-in: added K 10 svn:author V 4 owen K 8 svn:date V 27 2002-05-11T13:26:34.000000Z PROPS-END Node-path: putty-wishlist/data/ssh2-only Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8d3484379f46c1d663afd9c3d13d5416 Text-delta-base-sha1: a4c17b6b69d14f1eb4b05c9822e84d2a80877886 Text-content-length: 39 Text-content-md5: 846b232a76dd1fbc0fc986093acb6161 Text-content-sha1: 86889282df8bd76097898357a3859d453ff00cb7 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN[pthsFixed-in: 2002-05-12 Revision-number: 1668 Prop-content-length: 268 Content-length: 268 K 7 svn:log V 167 Added a framework for importing foreign key formats, and implemented importing of OpenSSH SSH2 private key files (both encrypted and unencrypted). Seems to work fine. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-05-11T16:45:29.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fa681ae0394e7ed94a5156b3f93cb256 Text-delta-base-sha1: 308d789535c1630d6ea7d217bf35c6608006e925 Text-content-length: 41 Text-content-md5: f2d5c6eb4cfcb0386b8229d124081bd8 Text-content-sha1: 655b35eafaf0063f1883e492ae15ab7cb7b7d081 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN 'import puttygen.res LIBS Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9c19696a33334f9e485aa67bed5e695d Text-delta-base-sha1: aee8fc7639cddf498f42afa6616c2877b0b40b9a Text-content-length: 299 Text-content-md5: b67eab2fe60c95b3d9ddce55c48861b5 Text-content-sha1: 6ce97fa44091b3074dba589ca817d295441ca29a Content-length: 339 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN.Bz/`9u\versionid $Id: faq.but,v 1.25 2002/05/11 16:45Version 0.52 doesn't, but in the latest development snapshots PuTTYgen can load OpenSSH private keys. We plan to add an export feature so that it can save them as well, and we also plan to support the \cw{ssh.com} key format Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 285034122f18eed8a1d0b04801b00a19 Text-delta-base-sha1: 9aa14d74bc2c90df3d2ba6a1d7f372d2480eceb5 Text-content-length: 114 Text-content-md5: 645ebfbfd68b28e291fd7dde88105d62 Text-content-sha1: 382fde1ccb742faebaaf9c61a20f767008307a58 Content-length: 154 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN9 Zo5p"\versionid $Id: pubkey.but,v 1.14 2002/05/11 16:45:29\cfg{winhelp-topic}{puttygen.general} Node-path: putty/import.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 12401 Text-content-md5: 049d2e6f914b19b335e236305da2ea3b Text-content-sha1: 861432c6a32f2baa131f9efd3539fa5c6b2208aa Content-length: 12517 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNccc/* * Code for PuTTY to import and export private key files in other * SSH clients' formats. */ #include #include #include #include #include "ssh.h" #include "misc.h" #define PUT_32BIT(cp, value) do { \ (cp)[3] = (value); \ (cp)[2] = (value) >> 8; \ (cp)[1] = (value) >> 16; \ (cp)[0] = (value) >> 24; } while (0) #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) int openssh_encrypted(char *filename); struct ssh2_userkey *openssh_read(char *filename, char *passphrase); /* * Given a key type, determine whether we know how to import it. */ int import_possible(int type) { if (type == SSH_KEYTYPE_OPENSSH) return 1; return 0; } /* * Given a key type, determine what native key type * (SSH_KEYTYPE_SSH1 or SSH_KEYTYPE_SSH2) it will come out as once * we've imported it. */ int import_target_type(int type) { /* * There are no known foreign SSH1 key formats. */ return SSH_KEYTYPE_SSH2; } /* * Determine whether a foreign key is encrypted. */ int import_encrypted(char *filename, int type, char **comment) { if (type == SSH_KEYTYPE_OPENSSH) { *comment = filename; /* OpenSSH doesn't do key comments */ return openssh_encrypted(filename); } return 0; } /* * Import an SSH1 key. */ int import_ssh1(char *filename, int type, struct RSAKey *key, char *passphrase) { return 0; } /* * Import an SSH2 key. */ struct ssh2_userkey *import_ssh2(char *filename, int type, char *passphrase) { if (type == SSH_KEYTYPE_OPENSSH) return openssh_read(filename, passphrase); return NULL; } /* ---------------------------------------------------------------------- * Helper routines. (The base64 ones are defined in sshpubk.c.) */ #define isbase64(c) ( ((c) >= 'A' && (c) <= 'Z') || \ ((c) >= 'a' && (c) <= 'z') || \ ((c) >= '0' && (c) <= '9') || \ (c) == '+' || (c) == '/' || (c) == '=' \ ) extern int base64_decode_atom(char *atom, unsigned char *out); extern int base64_lines(int datalen); extern void base64_encode_atom(unsigned char *data, int n, char *out); extern void base64_encode(FILE * fp, unsigned char *data, int datalen); /* * Read an ASN.1/BER identifier and length pair. * * Flags are a combination of the #defines listed below. * * Returns -1 if unsuccessful; otherwise returns the number of * bytes used out of the source data. */ /* ASN.1 tag classes. */ #define ASN1_CLASS_UNIVERSAL (0 << 6) #define ASN1_CLASS_APPLICATION (1 << 6) #define ASN1_CLASS_CONTEXT_SPECIFIC (2 << 6) #define ASN1_CLASS_PRIVATE (3 << 6) #define ASN1_CLASS_MASK (3 << 6) /* Primitive versus constructed bit. */ #define ASN1_CONSTRUCTED (1 << 5) int ber_read_id_len(void *source, int sourcelen, int *id, int *length, int *flags) { unsigned char *p = (unsigned char *) source; if (sourcelen == 0) return -1; *flags = (*p & 0xE0); if ((*p & 0x1F) == 0x1F) { *id = 0; while (*p & 0x80) { *id = (*id << 7) | (*p & 0x7F); p++, sourcelen--; if (sourcelen == 0) return -1; } *id = (*id << 7) | (*p & 0x7F); p++, sourcelen--; } else { *id = *p & 0x1F; p++, sourcelen--; } if (sourcelen == 0) return -1; if (*p & 0x80) { int n = *p & 0x7F; p++, sourcelen--; if (sourcelen < n) return -1; *length = 0; while (n--) *length = (*length << 8) | (*p++); sourcelen -= n; } else { *length = *p; p++, sourcelen--; } return p - (unsigned char *) source; } /* ---------------------------------------------------------------------- * Code to read OpenSSH private keys. */ enum { OSSH_DSA, OSSH_RSA }; struct openssh_key { int type; int encrypted; char iv[32]; unsigned char *keyblob; int keyblob_len, keyblob_size; }; struct openssh_key *load_openssh_key(char *filename) { struct openssh_key *ret; FILE *fp; char buffer[256]; char *errmsg, *p; int headers_done; ret = smalloc(sizeof(*ret)); ret->keyblob = NULL; ret->keyblob_len = ret->keyblob_size = 0; ret->encrypted = 0; memset(ret->iv, 0, sizeof(ret->iv)); fp = fopen(filename, "r"); if (!fp) { errmsg = "Unable to open key file"; goto error; } if (!fgets(buffer, sizeof(buffer), fp) || 0 != strncmp(buffer, "-----BEGIN ", 11) || 0 != strcmp(buffer+strlen(buffer)-17, "PRIVATE KEY-----\n")) { errmsg = "File does not begin with OpenSSH key header"; goto error; } if (!strcmp(buffer, "-----BEGIN RSA PRIVATE KEY-----\n")) ret->type = OSSH_RSA; else if (!strcmp(buffer, "-----BEGIN DSA PRIVATE KEY-----\n")) ret->type = OSSH_DSA; else { errmsg = "Unrecognised key type"; goto error; } headers_done = 0; while (1) { if (!fgets(buffer, sizeof(buffer), fp)) { errmsg = "Unexpected end of file"; goto error; } if (0 == strncmp(buffer, "-----END ", 9) && 0 == strcmp(buffer+strlen(buffer)-17, "PRIVATE KEY-----\n")) break; /* done */ if ((p = strchr(buffer, ':')) != NULL) { if (headers_done) { errmsg = "Header found in body of key data"; goto error; } *p++ = '\0'; while (*p && isspace((unsigned char)*p)) p++; if (!strcmp(buffer, "Proc-Type")) { if (p[0] != '4' || p[1] != ',') { errmsg = "Proc-Type is not 4 (only 4 is supported)"; goto error; } p += 2; if (!strcmp(p, "ENCRYPTED\n")) ret->encrypted = 1; } else if (!strcmp(buffer, "DEK-Info")) { int i, j; if (strncmp(p, "DES-EDE3-CBC,", 13)) { errmsg = "Ciphers other than DES-EDE3-CBC not supported"; goto error; } p += 13; for (i = 0; i < 8; i++) { if (1 != sscanf(p, "%2x", &j)) break; ret->iv[i] = j; p += 2; } if (i < 8) { errmsg = "Expected 16-digit iv in DEK-Info"; goto error; } } } else { headers_done = 1; p = buffer; while (isbase64(p[0]) && isbase64(p[1]) && isbase64(p[2]) && isbase64(p[3])) { int len; unsigned char out[3]; len = base64_decode_atom(p, out); if (len <= 0) { errmsg = "Invalid base64 encoding"; goto error; } if (ret->keyblob_len + len > ret->keyblob_size) { ret->keyblob_size = ret->keyblob_len + len + 256; ret->keyblob = srealloc(ret->keyblob, ret->keyblob_size); } memcpy(ret->keyblob + ret->keyblob_len, out, len); ret->keyblob_len += len; p += 4; } if (isbase64(*p)) { errmsg = "base64 characters left at end of line"; goto error; } } } if (ret->keyblob_len == 0 || !ret->keyblob) { errmsg = "Key body not present"; goto error; } if (ret->encrypted && ret->keyblob_len % 8 != 0) { errmsg = "Encrypted key blob is not a multiple of cipher block size"; goto error; } return ret; error: if (ret) { if (ret->keyblob) sfree(ret->keyblob); sfree(ret); } return NULL; } int openssh_encrypted(char *filename) { struct openssh_key *key = load_openssh_key(filename); int ret; if (!key) return 0; ret = key->encrypted; sfree(key->keyblob); sfree(key); return ret; } struct ssh2_userkey *openssh_read(char *filename, char *passphrase) { struct openssh_key *key = load_openssh_key(filename); struct ssh2_userkey *retkey; unsigned char *p; int ret, id, len, flags; int i, num_integers; struct ssh2_userkey *retval = NULL; char *errmsg; unsigned char *blob; int blobptr, privptr; char *modptr; int modlen; if (!key) return NULL; if (key->encrypted) { /* * Derive encryption key from passphrase and iv/salt: * * - let block A equal MD5(passphrase || iv) * - let block B equal MD5(A || passphrase || iv) * - block C would be MD5(B || passphrase || iv) and so on * - encryption key is the first N bytes of A || B */ struct MD5Context md5c; unsigned char keybuf[32]; MD5Init(&md5c); MD5Update(&md5c, passphrase, strlen(passphrase)); MD5Update(&md5c, key->iv, 8); MD5Final(keybuf, &md5c); MD5Init(&md5c); MD5Update(&md5c, keybuf, 16); MD5Update(&md5c, passphrase, strlen(passphrase)); MD5Update(&md5c, key->iv, 8); MD5Final(keybuf+16, &md5c); /* * Now decrypt the key blob. */ des3_decrypt_pubkey_ossh(keybuf, key->iv, key->keyblob, key->keyblob_len); } /* * Now we have a decrypted key blob, which contains an ASN.1 * encoded private key. We must now untangle the ASN.1. * * We expect the whole key blob to be formatted as a SEQUENCE * (0x30 followed by a length code indicating that the rest of * the blob is part of the sequence). Within that SEQUENCE we * expect to see a bunch of INTEGERs. What those integers mean * depends on the key type: * * - For RSA, we expect the integers to be 0, n, e, d, p, q, * dmp1, dmq1, iqmp in that order. (The last three are d mod * (p-1), d mod (q-1), inverse of q mod p respectively.) * * - For DSA, we expect them to be 0, p, q, g, y, x in that * order. */ p = key->keyblob; /* Expect the SEQUENCE header. Take its absence as a failure to decrypt. */ ret = ber_read_id_len(p, key->keyblob_len, &id, &len, &flags); p += ret; if (ret < 0 || id != 16) { errmsg = "ASN.1 decoding failure"; retval = SSH2_WRONG_PASSPHRASE; goto error; } /* Expect a load of INTEGERs. */ if (key->type == OSSH_RSA) num_integers = 9; else if (key->type == OSSH_DSA) num_integers = 6; /* * Space to create key blob in. */ blob = smalloc(256+key->keyblob_len); PUT_32BIT(blob, 7); if (key->type == OSSH_DSA) memcpy(blob+4, "ssh-dss", 7); else if (key->type == OSSH_RSA) memcpy(blob+4, "ssh-rsa", 7); blobptr = 4+7; privptr = -1; for (i = 0; i < num_integers; i++) { ret = ber_read_id_len(p, key->keyblob+key->keyblob_len-p, &id, &len, &flags); p += ret; if (ret < 0 || id != 2 || key->keyblob+key->keyblob_len-p < len) { errmsg = "ASN.1 decoding failure"; goto error; } if (i == 0) { /* * The first integer should be zero always (I think * this is some sort of version indication). */ if (len != 1 || p[0] != 0) { errmsg = "Version number mismatch"; goto error; } } else if (key->type == OSSH_RSA) { /* * Integers 1 and 2 go into the public blob but in the * opposite order; integers 3, 4, 5 and 8 go into the * private blob. The other two (6 and 7) are ignored. */ if (i == 1) { /* Save the details for after we deal with number 2. */ modptr = p; modlen = len; } else if (i != 6 && i != 7) { PUT_32BIT(blob+blobptr, len); memcpy(blob+blobptr+4, p, len); blobptr += 4+len; if (i == 2) { PUT_32BIT(blob+blobptr, modlen); memcpy(blob+blobptr+4, modptr, modlen); blobptr += 4+modlen; privptr = blobptr; } } } else if (key->type == OSSH_DSA) { /* * Integers 1-4 go into the public blob; integer 5 goes * into the private blob. */ PUT_32BIT(blob+blobptr, len); memcpy(blob+blobptr+4, p, len); blobptr += 4+len; if (i == 4) privptr = blobptr; } /* Skip past the number. */ p += len; } /* * Now put together the actual key. Simplest way to do this is * to assemble our own key blobs and feed them to the createkey * functions; this is a bit faffy but it does mean we get all * the sanity checks for free. */ assert(privptr > 0); /* should have bombed by now if not */ retkey = smalloc(sizeof(struct ssh2_userkey)); retkey->alg = (key->type == OSSH_RSA ? &ssh_rsa : &ssh_dss); retkey->data = retkey->alg->createkey(blob, privptr, blob+privptr, blobptr-privptr); if (!retkey->data) { sfree(retkey); errmsg = "unable to create key data structure"; goto error; } retkey->comment = dupstr("imported-openssh-key"); if (blob) sfree(blob); sfree(key->keyblob); sfree(key); return retkey; error: if (blob) sfree(blob); sfree(key->keyblob); sfree(key); return retval; } Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 09a4bc3e0e421f975c535732b6382ac5 Text-delta-base-sha1: d9513050beb1f55a0c3cbf74119f6c400d6be0f9 Text-content-length: 2503 Text-content-md5: 7a586bcc3372068323774d75984f07ba Text-content-sha1: 2dcc155bc585ced136847c19693f6fb29a7609bb Content-length: 2543 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNV'BwRApQLD>\WVc'u}Fn/}`bU IDC_GIVEHELP, IDC_IMPORT, IDC_EXPORT_OPENSSH, IDC_EXPORT_SSHCOM{ HMENU menu, menu1; menu = CreateMenu(); menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_GENERATE, "&Generate key pair"); AppendMenu(menu1, MF_ENABLED, IDC_LOAD, "&Load private key"); AppendMenu(menu1, MF_ENABLED, IDC_SAVEPUB, "Save p&ublic key"); AppendMenu(menu1, MF_ENABLED, IDC_SAVE, "&Save private key"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&File"); #if 0 /* * Exporting not yet supported, but when we do it we * should just put this lot back in. */ menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_EXPORT_OPENSSH, "Export &OpenSSH key"); AppendMenu(menu1, MF_ENABLED, IDC_EXPORT_SSHCOM, "Export &ssh.com key"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Export"); #endif menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_ABOUT, "&About"); if (help_path) AppendMenu(menu1, MF_ENABLED, IDC_GIVEHELP, "&Help"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Help"); SetMenu(hwnd, menu); }IVEHELP: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (help_path) { WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)"JI(`',`puttygen.general')"); requested_help = TRUE; } }, realrealtype = key_type(filename); if (type != SSH_KEYTYPE_SSH1 && type != SSH_KEYTYPE_SSH2 && !import_possible(type)if (type != SSH_KEYTYPE_SSH1 && type != SSH_KEYTYPE_SSH2) { realtype = type; type = import_target_type(type); } comment = NULL; if (realtype == SSH_KEYTYPE_SSH1) needs_pass = rsakey_encrypted(filename, &comment); else if (realtype == SSH_KEYTYPE_SSH2) needs_pass = ssh2_userkey_encrypted(filename, &comment); else needs_pass = import_encrypted(filename, realtype, { if (realtype == type) ret = loadrsakey(filename, &newkey1, passphrase); else ret = import_ssh1(filename, realtype, &newkey1, passphrase); } else { if (realtype == type) newkey2 = ssh2_load_userkey(filename, passphrase); else newkey2 = import_ssh2(filename, realtype, Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ff4d5f8a9db9682c57264a8c3daa3a53 Text-delta-base-sha1: 759f1adf8fa8db87fed7e34e12ae199fb05e48db Text-content-length: 495 Text-content-md5: 1567c412c796aca0f9d85e4377cadbbf Text-content-sha1: c4d5a7134fae02555e35f65eee9eeb881050c21d Content-length: 535 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN O_ Z4JVint import_possible(int type); int import_target_type(int type); int import_encrypted(char *filename, int type, char **comment); int import_ssh1(char *filename, int type, struct RSAKey *key,char *passphrase); struct ssh2_userkey *import_ssh2(char *filename, int type, char *passphrasdes3_decrypt_pubkey_ossh(unsigned char *key, unsigned char *iv, unsigned char *blk, int len); void des3_encrypt_pubkey_ossh(unsigned char *key, unsigned char *iv, Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4622b5305ab43b497937a6d2c15187fa Text-delta-base-sha1: 8cd4a1cdec7e7bbd36b28262efee72d0116b7db9 Text-content-length: 566 Text-content-md5: bd34584a6b34d6e6612078befb50c9fc Text-content-sha1: baaeac3b2d5b19670e586298262af9189736dc8b Content-length: 606 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN4$ hM!2!2%qCvoid des3_decrypt_pubkey_ossh(unsigned char *key, unsigned char *iv, + 16), GET_32BIT_MSB_FIRST(key + 20), &ourkeys[2]); ourkeys[0].div0 = GET_32BIT_MSB_FIRST(iv); ourkeys[0].div1 = GET_32BIT_MSB_FIRST(iv+4); des_cbc3_decrypt(blk, blk, len, ourkeys); } void des3_encrypt_pubkey_ossh(unsigned char *key, unsigned char *iv, + 16), GET_32BIT_MSB_FIRST(key + 20), &ourkeys[2]); ourkeys[0].eiv0 = GET_32BIT_MSB_FIRST(iv); ourkeys[0].eiv1 = GET_32BIT_MSB_FIRST(iv+4); des_cbc3 Revision-number: 1669 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2002-05-12T09:39:19.000000Z K 7 svn:log V 132 Since the snapshot PuTTYgen now supports OpenSSH key import, I've removed the links to third-party programs that do the same thing. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/key-formats Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0e40f37ae22ae7f37cd6631b7a91faac Text-delta-base-sha1: 55add8475d67b22e92f905109b604fcdb10c9da2 Text-content-length: 163 Text-content-md5: 2b632d450c1b30ac983ee95b88b1257f Text-content-sha1: 6c735c9fb19565f09e8b14b456ace7f4aac50225 Content-length: 202 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNV/As of 2002-05-12, PuTTYgen now supports importing of OpenSSH's key format. We don't yet support exporting, or ssh.com's format, but we plan to. Revision-number: 1670 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:28.410576Z PROPS-END Revision-number: 1671 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:28.418575Z PROPS-END Revision-number: 1672 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2002-05-13T16:32:42.000000Z K 7 svn:log V 36 Add import of ssh.com private keys. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 049d2e6f914b19b335e236305da2ea3b Text-delta-base-sha1: 861432c6a32f2baa131f9efd3539fa5c6b2208aa Text-content-length: 13984 Text-content-md5: 682df3013b21138aee35418719d1cc58 Text-content-sha1: 12c24bc015f97745089d5564619a4ec581542666 Content-length: 14023 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNc[p#GQFJRL]bE D.EKE` 8u$ak^|ozt|`x]XpXguint sshcom_encrypted(char *filename, char **comment); struct ssh2_userkey *sshcomif (type == SSH_KEYTYPE_SSHCOMif (type == SSH_KEYTYPE_SSHCOM) { return sshcom_encrypted(filename, commentif (type == SSH_KEYTYPE_SSHCOM) return sshcom_read(filename, passphrase); return NULL; } /* static int put_string(void *target, void *data, int len) { unsigned char *d = (unsigned char *)target; PUT_32BIT(d, len); memcpy(d+4, data, len); return len+4; } static int put_mp(void *target, void *data, int len) { unsigned char *d = (unsigned char *)target; unsigned char *i = (unsigned char *)data; if (*i & 0x80) { PUT_32BIT(d, len+1); d[4] = 0; memcpy(d+5, data, len); return len+5; } else { PUT_32BIT(d, len); memcpy(d+4, data, len); return len+4; } } /* /* - * Code to read ssh.com private keys. */ /* * The format of the base64 blob is largely ssh2-packet-formatted, * except that mpints are a bit different: they're more like the * old ssh1 mpint. You have a 32-bit bit count N, followed by * (N+7)/8 bytes of data. * * So. The blob contains: * * - uint32 0x3f6ff9eb (magic number) * - uint32 size (total blob size) * - string key-type (see below) * - string cipher-type (tells you if key is encrypted) * - string encrypted-blob * * (The first size field includes the size field itself and the * magic number before it. All other size fields are ordinary ssh2 * strings, so the size field indicates how much data is to * _follow_.) * * The encrypted blob, once decrypted, contains a single string * which in turn contains the payload. (This allows padding to be * added after that string while still making it clear where the * real payload ends. Also it probably makes for a reasonable * decryption check.) * * The payload blob, for an RSA key, contains: * - mpint e * - mpint d * - mpint n (yes, the public and private stuff is intermixed) * - mpint u (presumably inverse of p mod q) * - mpint p (p is the smaller prime) * - mpint q (q is the larger) * * For a DSA key, the payload blob contains: * - uint32 0 * - mpint p * - mpint g * - mpint q * - mpint y * - mpint x * * Alternatively, if the parameters are `predefined', that * (0,p,g,q) sequence can be replaced by a uint32 1 and a string * containing some predefined parameter specification. *shudder*, * but I doubt we'll encounter this in real life. * * The key type strings are ghastly. The RSA key I looked at had a * type string of * * `if-modn{sign{rsa-pkcs1-sha1},encrypt{rsa-pkcs1v2-oaep}}' * * and the DSA key wasn't much better: * * `dl-modp{sign{dsa-nist-sha1},dh{plain}}' * * It isn't clear that these will always be the same. I think it * might be wise just to look at the `if-modn{sign{rsa' and * `dl-modp{sign{dsa' prefixes. * * Finally, the encryption. The cipher-type string appears to be * either `none' or `3des-cbc'. Looks as if this is SSH2-style * 3des-cbc (i.e. outer cbc rather than inner). The key is created * from the passphrase by means of yet another hashing faff: * * - first 16 bytes are MD5(passphrase) * - next 16 bytes are MD5(passphrase || first 16 bytes) * - if there were more, they'd be MD5(passphrase || first 32), * and so on. */ struct sshcom_key { char comment[256]; /* allowing any length is overkill */ unsigned char *keyblob; int keyblob_len, keyblob_size; }; struct sshcom_key *load_sshcom_key(char *filename) { struct sshcom_key *ret; FILE *fp; char buffer[256]; int len; char *errmsg, *p; int headers_done; char base64_bit[4]; int base64_chars = 0; ret = smalloc(sizeof(*ret)); ret->comment[0] = '\0'; ret->keyblob = NULL; ret->keyblob_len = ret->keyblob_size = 0cmp(buffer, "---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----\n")) { errmsg = "File does not begin with ssh.com key header if (!strcmp(buffer, "---- END SSH2 ENCRYPTED PRIVATE KEY ----\n")) break; /* * Header lines can end in a trailing backslash for * continuation. */ while ((len = strlen(p)) > sizeof(buffer) - (p-buffer) -1 || p[len-1] != '\n' || p[len-2] == '\\') { if (len > (p-buffer) + sizeof(buffer)-2) { errmsg = "Header line too long to deal with"; goto error; } if (!fgets(p+len-2, sizeof(buffer)-(p-buffer)-(len-2), fp)) { errmsg = "Unexpected end of file"; goto error; } } p[strcspn(p, "\n")] = '\0'; if (!strcmp(buffer, "Comment")) { /* Strip quotes in comment if present. */ if (p[0] == '"' && p[strlen(p)-1] == '"') { p++; p[strlen(p)-1] = '\0'; } strncpy(ret->comment, p, sizeof(ret->comment)); ret->comment[sizeof(ret->comment)-1] = '\0'; } } else { headers_done = 1; p = buffer; while (isbase64(*p)) { base64_bit[base64_chars++] = *p; if (base64_chars == 4) { unsigned char out[3]; base64_chars = 0; len = base64_decode_atom(base64_bit, out); if (len <= 0) { errmsg = "Invalid base64 encoding"; goto error; } if (ret->keyblob_len + len > ret->keyblob_size) { ret->keyblob_size = ret->keyblob_len + len + 256; ret->keyblob = srealloc(ret->keyblob, ret->keyblob_size); } memcpy(ret->keyblob + ret->keyblob_len, out, len); ret->keyblob_len += len; } p++sshcom_encrypted(char *filename, char **comment) { struct sshcom_key *key = load_sshcom_key(filename); int pos, len, answer; *comment = NULL; if (!key) return 0; /* * Check magic number. */ if (GET_32BIT(key->keyblob) != 0x3f6ff9eb) return 0; /* key is invalid */ /* * Find the cipher-type string. */ answer = 0; pos = 8; if (key->keyblob_len < pos+4) goto done; /* key is far too short */ pos += 4 + GET_32BIT(key->keyblob + pos); /* skip key type */ if (key->keyblob_len < pos+4) goto done; /* key is far too short */ len = GET_32BIT(key->keyblob + pos); /* find cipher-type length */ if (key->keyblob_len < pos+4+len) goto done; /* cipher type string is incomplete */ if (len != 4 || 0 != memcmp(key->keyblob + pos + 4, "none", 4)) answer = 1; done: *comment = dupstr(key->comment); sfree(key->keyblob); sfree(key); return answer; } struct mpint_pos { void *start; int bytes; }; int sshcom_read_mpint(void *data, int len, struct mpint_pos *ret) { int bits; int bytes; unsigned char *d = (unsigned char *) data; if (len < 4) goto error; bits = GET_32BIT(d); bytes = (bits + 7) / 8; if (len < 4+bytes) goto error; ret->start = d + 4; ret->bytes = bytes; return bytes+4; error: ret->start = NULL; ret->bytes = -1; return len; /* ensure further calls fail as well */ } struct ssh2_userkey *sshcom_read(char *filename, char *passphrase) { struct sshcom_key *key = load_sshcom_key(filename); char *errmsg; int pos, len; const char prefix_rsa[] = "if-modn{sign{rsa"; const char prefix_dsa[] = "dl-modp{sign{dsa"; enum { RSA, DSA } type; int encrypted; char *ciphertext; int cipherlen; struct ssh2_userkey *ret = NULL, *retkey; const struct ssh_signkey *alg; unsigned char *blob = NULL; int publen, privlen; if (!key) return NULL; /* * Check magic number. */ if (GET_32BIT(key->keyblob) != 0x3f6ff9eb) { errmsg = "Key does not begin with magic number"; goto error; } /* * Determine the key type. */ pos = 8; if (key->keyblob_len < pos+4 || (len = GET_32BIT(key->keyblob + pos)) > key->keyblob_len - pos - 4) { errmsg = "Key blob does not contain a key type string"; goto error; } if (len > sizeof(prefix_rsa) - 1 && !memcmp(key->keyblob+pos+4, prefix_rsa, sizeof(prefix_rsa) - 1)) { type = RSA; } else if (len > sizeof(prefix_dsa) - 1 && !memcmp(key->keyblob+pos+4, prefix_dsa, sizeof(prefix_dsa) - 1)) { type = DSA; } else { errmsg = "Key is of unknown type"; goto error; } pos += 4+len; /* * Determine the cipher type. */ if (key->keyblob_len < pos+4 || (len = GET_32BIT(key->keyblob + pos)) > key->keyblob_len - pos - 4) { errmsg = "Key blob does not contain a cipher type string"; goto error; } if (len == 4 && !memcmp(key->keyblob+pos+4, "none", 4)) encrypted = 0; else if (len == 8 && !memcmp(key->keyblob+pos+4, "3des-cbc", 8)) encrypted = 1; else { errmsg = "Key encryption is of unknown type"; goto error; } pos += 4+len; /* * Get hold of the encrypted part of the key. */ if (key->keyblob_len < pos+4 || (len = GET_32BIT(key->keyblob + pos)) > key->keyblob_len - pos - 4) { errmsg = "Key blob does not contain actual key data"; goto error; } ciphertext = key->keyblob + pos + 4; cipherlen = len; if (cipherlen == 0) { errmsg = "Length of key data is zero"; goto error; } /* * Decrypt it if necessary. */ if () * - let block B equal MD5(passphrase || A) * - block C would be MD5(passphrase || A || B, iv[8]; if (cipherlen % 8 != 0) { errmsg = "Encrypted part of key is not a multiple of cipher block" " size"; goto error; } MD5Init(&md5c); MD5Update(&md5c, passphrase, strlen(passphrase)); MD5Final(keybuf, &md5c); MD5Init(&md5c); MD5Update(&md5c, passphrase, strlen(passphrase)); MD5Update(&md5c, keybuf, 16); MD5Final(keybuf+16, &md5c); /* * Now decrypt the key blob. */ memset(iv, 0, 8); des3_decrypt_pubkey_ossh(keybuf, iv, ciphertext, cipherlen); /* * Hereafter we return WRONG_PASSPHRASE for any parsing * error. (But not if we haven't just tried to decrypt it!) */ if (encrypted) ret = SSH2_WRONG_PASSPHRASE; } /* * Strip away the containing string to get to the real meat. */ len = GET_32BIT(ciphertext); if (len > cipherlen-4) { errmsg = "containing string was ill-formed"; goto error; } ciphertext += 4; cipherlen = len; /* * Now we break down into RSA versus DSA. In either case we'll * construct public and private blobs in our own format, and * end up feeding them to alg->createkey(). */ blob = smalloc(cipherlen + 256); privlen = 0; if (type == RSA) { struct mpint_pos n, e, d, u, p, q; int pos = 0; pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &e); pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &d); pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &n); pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &u); pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &p); pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &q); if (!q.start) { errmsg = "key data did not contain six integers"; goto error; } alg = &ssh_rsa; pos = 0; pos += put_string(blob+pos, "ssh-rsa", 7); pos += put_mp(blob+pos, e.start, e.bytes); pos += put_mp(blob+pos, n.start, n.bytes); publen = pos; pos += put_string(blob+pos, d.start, d.bytes); pos += put_mp(blob+pos, q.start, q.bytes); pos += put_mp(blob+pos, p.start, p.bytes); pos += put_mp(blob+pos, u.start, u.bytes); privlen = pos - publen; } else if (type == DSA) { struct mpint_pos p, q, g, x, y; int pos = 4; if (GET_32BIT(ciphertext) != 0) { errmsg = "predefined DSA parameters not supported"; goto error; } pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &p); pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &g); pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &q); pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &y); pos += sshcom_read_mpint(ciphertext+pos, cipherlen-pos, &x); if (!x.start) { errmsg = "key data did not contain five integers"; goto error; } alg = &ssh_dss; pos = 0; pos += put_string(blob+pos, "ssh-dss", 7); pos += put_mp(blob+pos, p.start, p.bytes); pos += put_mp(blob+pos, q.start, q.bytes); pos += put_mp(blob+pos, g.start, g.bytes); pos += put_mp(blob+pos, y.start, y.bytes); publen = pos; pos += put_mp(blob+pos, x.start, x.bytes); privlen = pos - publen; } assert(privlen > 0); /* should have bombed by now if not */ retkey = smalloc(sizeof(struct ssh2_userkey)); retkey->alg = alg; retkey->data = alg->createkey(blob, publen, blob+publen, privlen retkey->comment = dupstr(key->comment); errmsg = NULL; /* no error */ ret =; } Revision-number: 1673 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2002-05-13T16:37:11.000000Z K 7 svn:log V 96 Be more careful about destroying sensitive data after private key load/store/import operations. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 682df3013b21138aee35418719d1cc58 Text-delta-base-sha1: 12c24bc015f97745089d5564619a4ec581542666 Text-content-length: 1893 Text-content-md5: 4e94d33916004fc973623bd28d61ebbd Text-content-sha1: f82efa7bea2d886fd76354c8e3df982855b771f4 Content-length: 1932 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN[*R  tr}mknQIdr,RQlh5s 8%Rd fc(t]6(%6 char base64_bit[4]; int base64_chars = 0 int len memset(out, 0, sizeof(out))memset(buffer, 0, sizeof(buffer)); memset(base64_bit, 0, sizeof(base64_bit)); return ret; error: memset(buffer, 0, sizeof(buffer)); memset(base64_bit, 0, sizeof(base64_bit)); if (ret) { if (ret->keyblob) { memset(ret->keyblob, 0, ret->keyblob_size); sfree(ret->keyblob); } memset(&ret, 0, sizeof(ret)memset(key->keyblob, 0, key->keyblob_size); sfree(key->keyblob); memset(&key, 0, sizeof(key)size, memset(&md5c, 0, sizeof(md5c)); memset(keybuf, 0, sizeof(keybuf)size = 256+key->keyblob_len; blob = smalloc(blobsizeerrmsg = NULL; /* no error */ retval = retkey; error: if (blob) { memset(blob, 0, blobsize); sfree(blob); } memset(key->keyblob, 0, key->keyblob_size); sfree(key->keyblob); memset(&key, 0, sizeof(key){ memset(ret->keyblob, 0, ret->keyblob_size); sfree(ret->keyblob); } memset(&ret, 0, sizeof(ret)memset(key->keyblob, 0, key->keyblob_size); sfree(key->keyblob); memset(&key, 0, sizeof(key)blobsize,sizeof(iv)); des3_decrypt_pubkey_ossh(keybuf, iv, ciphertext, cipherlen); memset(&md5c, 0, sizeof(md5c)); memset(keybuf, 0, sizeof(keybuf)only if we've just tried to decrypt it! * Returning WRONG_PASSPHRASE for an unencrypted key is * automatic doom.size = cipherlen + 256; blob = smalloc(blobsize{ memset(blob, 0, blobsize); sfree(blob); } memset(key->keyblob, 0, key->keyblob_size); sfree(key->keyblob); memset(&key, 0, sizeof(key) Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4cbaf9c4ec3d0eaacc5c495b0362409e Text-delta-base-sha1: 2817d9fa8bbfb688a5117536358954737c0518b7 Text-content-length: 94 Text-content-md5: b97829de57ccbe2b4e2cd9d62561aa01 Text-content-sha1: e49fdc6b7fdf222950c7d81aed89b8bab3342f6d Content-length: 133 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNr6> V ] memset(&ctx, 0, sizeof(ctx) memset(&ctx, 0, sizeof(ctx) Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd34584a6b34d6e6612078befb50c9fc Text-delta-base-sha1: baaeac3b2d5b19670e586298262af9189736dc8b Text-content-length: 222 Text-content-md5: ef170b678b2c969d089c862f3c6ba3ea Text-content-sha1: 46e2230bd111d3c4bea66eaf279dec57d8d5938e Content-length: 262 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN$H&*441;b*tVRR memset(ourkeys, 0, sizeof(ourkeys) memset(ourkeys, 0, sizeof(ourkeys) memset(ourkeys, 0, sizeof(ourkeys)); } void des3_en memset(ourkeys, 0, sizeof(ourkeys) Revision-number: 1674 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 44 Update FAQ to mention ssh.com key importing K 10 svn:author V 5 simon K 8 svn:date V 27 2002-05-13T16:48:31.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b67eab2fe60c95b3d9ddce55c48861b5 Text-delta-base-sha1: 6ce97fa44091b3074dba589ca817d295441ca29a Text-content-length: 173 Text-content-md5: 9d40e95c521740c64bb110669ca94604 Text-content-sha1: a57566a8cb7ec7834bea5c8b7f6f2f9c898f544f Content-length: 213 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNB O2`9 \versionid $Id: faq.but,v 1.26 2002/05/13 16:48:31and \cw{ssh.com} private keys. We plan to add an export feature so that it can save them as well Revision-number: 1675 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2002-05-13T16:56:11.000000Z K 7 svn:log V 64 Add some basic framework code preparatory to adding key export. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4e94d33916004fc973623bd28d61ebbd Text-delta-base-sha1: f82efa7bea2d886fd76354c8e3df982855b771f4 Text-content-length: 485 Text-content-md5: 030be0619c2b0a44da7819e12ff8d7a5 Text-content-sha1: 3b1302e5863e7e4f01db3baab6da0646c04edf08 Content-length: 524 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN*{ JPJaI * Export an SSH1 key. */ int export_ssh1(char *filename, int type, struct RSAKey *key, char *passphrase) { return 0; } /* * Export an SSH2 key. */ int export_ssh2(char *filename, int type, struct ssh2_userkey *key, char *passphrase) { #if 0 if (type == SSH_KEYTYPE_OPENSSH) return openssh_write(filename, key, passphrase); if (type == SSH_KEYTYPE_SSHCOM) return sshcom_write(filename, key, passphrase); #endif return 0 Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7a586bcc3372068323774d75984f07ba Text-delta-base-sha1: 2dcc155bc585ced136847c19693f6fb29a7609bb Text-content-length: 1864 Text-content-md5: c0c726b7f9ffbe8ba0b63541ce48ddc8 Text-content-sha1: b0e875a373490fd2e01c3616df71d1f735966e04 Content-length: 1904 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN' 7CV5 BRU case IDC_EXPORT_OPENSSH: case IDC_EXPORT_SSHCOM int type, realtype; if (state->ssh2) realtype = SSH_KEYTYPE_SSH2; else realtype = SSH_KEYTYPE_SSH1; if (LOWORD(wParam) == IDC_EXPORT_OPENSSH) type = SSH_KEYTYPE_OPENSSH; else if (LOWORD(wParam) == IDC_EXPORT_SSHCOM) type = SSH_KEYTYPE_SSHCOM; else type = realtype; if (type != realtype && import_target_type(type) != realtype) { char msg[256]; sprintf(msg, "Cannot export an SSH%d key in an SSH%d" " format", (state->ssh2 ? 2 : 1), (state->ssh2 ? 1 : 2)); MessageBox(hwnd, msg, "PuTTYgen Error", MB_OK | MB_ICONERROR); break; } if (state->ssh2) { if (type != realtype) ret = export_ssh2(filename, type, &state->ssh2key, *passphrase ? passphrase : NULL); else ret = ssh2_save_userkey(filename, &state->ssh2key, *passphrase ? passphrase : NULL); } else { if (type != realtype) ret = export_ssh1(filename, type, &state->key, *passphrase ? passphrase : NULL); else ret = saversakey(filename, &state->key, Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1567c412c796aca0f9d85e4377cadbbf Text-delta-base-sha1: c4d5a7134fae02555e35f65eee9eeb881050c21d Text-content-length: 186 Text-content-md5: 80389702a767ffd536dc970d6989365c Text-content-sha1: 10aeeb5977638840d796ba0e9cfbaa246dbc4c55 Content-length: 226 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNO "~"/iint export_ssh1(char *filename, int type, struct RSAKey *key,char *passphrase); int export_ssh2(char *filename, int type, struct ssh2_userkey *key Revision-number: 1676 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 52 One day, we should ship binaries with IPv6 support. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-05-13T19:38:51.000000Z PROPS-END Node-path: putty-wishlist/data/ipv6-build Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 655 Text-content-md5: b592a71b2af3b192e24da3180124eb18 Text-content-sha1: d893fcbef9c9e4fccb37a75dded17d1c2f518685 Content-length: 771 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: We should provide IPv6-enabled binaries. Class: wish Priority: medium Difficulty: taxing Content-type: text/x-html-body

    PuTTY has IPv6 support in the codebase, but it's not compiled in to the binaries we release. We don't currently have the headers and libraries needed to compile with IPv6 support, and haven't yet got round to getting hold of them. (Therefore, we don't test the IPv6 support, either.)

    In the meantime, unfix.org makes available some binaries compiled with -DIPV6. But note that we haven't personally checked them, and can't vouch for their trustworthiness. Revision-number: 1677 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2002-05-14T18:11:15.000000Z K 7 svn:log V 36 Implemented export of OpenSSH keys. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d40e95c521740c64bb110669ca94604 Text-delta-base-sha1: a57566a8cb7ec7834bea5c8b7f6f2f9c898f544f Text-content-length: 156 Text-content-md5: 3c9f6ba8f8569d02e858df449df20dc4 Text-content-sha1: 29e5b1f9a8dc145d12badbddec19362e42884ff8 Content-length: 196 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN- l2O@Z\versionid $Id: faq.but,v 1.27 2002/05/14 18:11:15, and save OpenSSH private keys. We plan to add exporting of \cw{ssh.com} keys Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 030be0619c2b0a44da7819e12ff8d7a5 Text-delta-base-sha1: 3b1302e5863e7e4f01db3baab6da0646c04edf08 Text-content-length: 7705 Text-content-md5: b3782005c65ead5da1ae01797bb5c8b9 Text-content-sha1: 867f844c983cd990930c68c494355eac1b3d7471 Content-length: 7744 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN{R[0F$1\R1ov3n)jv|cfwm#IZ0Fo{mXV%int openssh_write(char *filename, struct ssh2_userkey *key if (type == SSH_KEYTYPE_OPENSSH) return openssh_write(filename, key, passphrase); #if 0/* * Write an ASN.1/BER identifier and length pair. Returns the * number of bytes consumed. Assumes dest contains enough space. * Will avoid writing anything if dest is NULL, but still return * amount of space required. */ int ber_write_id_len(void *dest, int id, int length, int flags) { unsigned char *d = (unsigned char *)dest; int len = 0; if (id <= 30) { /* * Identifier is one byte. */ len++; if (d) *d++ = id | flags; } else { int n; /* * Identifier is multiple bytes: the first byte is 11111 * plus the flags, and subsequent bytes encode the value of * the identifier, 7 bits at a time, with the top bit of * each byte 1 except the last one which is 0. */ len++; if (d) *d++ = 0x1F | flags; for (n = 1; (id >> (7*n)) > 0; n++) continue; /* count the bytes */ while (n--) { len++; if (d) *d++ = (n ? 0x80 : 0) | ((id >> (7*n)) & 0x7F); } } if (length < 128) { /* * Length is one byte. */ len++; if (d) *d++ = length; } else { int n; /* * Length is multiple bytes. The first is 0x80 plus the * number of subsequent bytes, and the subsequent bytes * encode the actual length. */ for (n = 1; (length >> (8*n)) > 0; n++) continue; /* count the bytes */ len++; if (d) *d++ = 0x80 | n; while (n--) { len++; if (d) *d++ = (length >> (8*n)) & 0xFF; } } return lenSimple structure to point to an mp-int within a blob. */ struct mpint_pos { void *start; int bytes; }; int ssh2_read_mpint(void *data, int len, struct mpint_pos *ret) {ytes = GET_32BIT(d)/* ---------------------------------------------------------------------- * Code to read and writeint openssh_write(char *filename, struct ssh2_userkey *key, char *passphrase) { unsigned char *pubblob, *privblob, *spareblob; int publen, privlen, sparelen; unsigned char *outblob; int outlen; struct mpint_pos numbers[9]; int nnumbers, pos, len, seqlen, i; char *header, *footer; char zero[1]; unsigned char iv[8]; int ret = 0; FILE *fp; /* * Fetch the key blobs. */ pubblob = key->alg->public_blob(key->data, &publen); privblob = key->alg->private_blob(key->data, &privlen); spareblob = outblob = NULL; /* * Find the sequence of integers to be encoded into the OpenSSH * key blob, and also decide on the header line. */ if (key->alg == &ssh_rsa) { int pos; struct mpint_pos n, e, d, p, q, iqmp, dmp1, dmq1; Bignum bd, bp, bq, bdmp1, bdmq1; pos = 4 + GET_32BIT(pubblob); pos += ssh2_read_mpint(pubblob+pos, publen-pos, &e); pos += ssh2_read_mpint(pubblob+pos, publen-pos, &n); pos = 0; pos += ssh2_read_mpint(privblob+pos, privlen-pos, &d); pos += ssh2_read_mpint(privblob+pos, privlen-pos, &p); pos += ssh2_read_mpint(privblob+pos, privlen-pos, &q); pos += ssh2_read_mpint(privblob+pos, privlen-pos, &iqmp); assert(e.start && iqmp.start); /* can't go wrong */ /* We also need d mod (p-1) and d mod (q-1). */ bd = bignum_from_bytes(d.start, d.bytes); bp = bignum_from_bytes(p.start, p.bytes); bq = bignum_from_bytes(q.start, q.bytes); decbn(bp); decbn(bq); bdmp1 = bigmod(bd, bp); bdmq1 = bigmod(bd, bq); freebn(bd); freebn(bp); freebn(bq); dmp1.bytes = (bignum_bitcount(bdmp1)+8)/8; dmq1.bytes = (bignum_bitcount(bdmq1)+8)/8; sparelen = dmp1.bytes + dmq1.bytes; spareblob = smalloc(sparelen); dmp1.start = spareblob; dmq1.start = spareblob + dmp1.bytes; for (i = 0; i < dmp1.bytes; i++) spareblob[i] = bignum_byte(bdmp1, dmp1.bytes-1 - i); for (i = 0; i < dmq1.bytes; i++) spareblob[i+dmp1.bytes] = bignum_byte(bdmq1, dmq1.bytes-1 - i); freebn(bdmp1); freebn(bdmq1); numbers[0].start = zero; numbers[0].bytes = 1; zero[0] = '\0'; numbers[1] = n; numbers[2] = e; numbers[3] = d; numbers[4] = p; numbers[5] = q; numbers[6] = dmp1; numbers[7] = dmq1; numbers[8] = iqmp; nnumbers = 9; header = "-----BEGIN RSA PRIVATE KEY-----\n"; footer = "-----END RSA PRIVATE KEY-----\n"; } else if (key->alg == &ssh_dss) { int pos; struct mpint_pos p, q, g, y, x; pos = 4 + GET_32BIT(pubblob); pos += ssh2_read_mpint(pubblob+pos, publen-pos, &p); pos += ssh2_read_mpint(pubblob+pos, publen-pos, &q); pos += ssh2_read_mpint(pubblob+pos, publen-pos, &g); pos += ssh2_read_mpint(pubblob+pos, publen-pos, &y); pos = 0; pos += ssh2_read_mpint(privblob+pos, privlen-pos, &x); assert(y.start && x.start); /* can't go wrong */ numbers[0].start = zero; numbers[0].bytes = 1; zero[0] = '\0'; numbers[1] = p; numbers[2] = q; numbers[3] = g; numbers[4] = y; numbers[5] = x; nnumbers = 6; header = "-----BEGIN DSA PRIVATE KEY-----\n"; footer = "-----END DSA PRIVATE KEY-----\n"; } else { assert(0); /* zoinks! */ } /* * Now count up the total size of the ASN.1 encoded integers, * so as to determine the length of the containing SEQUENCE. */ len = 0; for (i = 0; i < nnumbers; i++) { len += ber_write_id_len(NULL, 2, numbers[i].bytes, 0); len += numbers[i].bytes; } seqlen = len; /* Now add on the SEQUENCE header. */ len += ber_write_id_len(NULL, 16, seqlen, ASN1_CONSTRUCTED); /* And round up to the cipher block size. */ if (passphrase) len = (len+7) &~ 7; /* * Now we know how big outblob needs to be. Allocate it. */ outlen = len; outblob = smalloc(outlen); /* * And write the data into it. */ pos = 0; pos += ber_write_id_len(outblob+pos, 16, seqlen, ASN1_CONSTRUCTED); for (i = 0; i < nnumbers; i++) { pos += ber_write_id_len(outblob+pos, 2, numbers[i].bytes, 0); memcpy(outblob+pos, numbers[i].start, numbers[i].bytes); pos += numbers[i].bytes; } while (pos < outlen) { outblob[pos++] = random_byte(); } /* * Encrypt the key. */ if (passphrase) { /* * Invent an iv. Then derive encryption key from passphrase *for (i = 0; i < 8; i++) iv[i] = random_byte(iv, 8); MD5Final(keybuf+16, &md5c); /* * Now encrypt the key blob. */ des3_encrypt_pubkey_ossh(keybuf, iv, outblob, outAnd save it. We'll use Unix line endings just in case it's * subsequently transferred in binary mode. */ fp = fopen(filename, "wb"); /* ensure Unix line endings */ if (!fp) goto error; fputs(header, fp); if (passphrase) { fprintf(fp, "Proc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,"); for (i = 0; i < 8; i++) fprintf(fp, "%02X", iv[i]); fprintf(fp, "\n\n"); } base64_encode(fp, outblob, outlen); fputs(footer, fp); fclose(fp); ret = 1; error: if (outblob) { memset(outblob, 0, outlen); sfree(outblob); } if (spareblob) { memset(spareblob, 0, sparelen); sfree(spareblob); } if (privblob) { memset(privblob, 0, privlen); sfree(privblob); } if (pubblob) { memset(pubblob, 0, publen); sfree(pubblob); } return ret Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c0c726b7f9ffbe8ba0b63541ce48ddc8 Text-delta-base-sha1: b0e875a373490fd2e01c3616df71d1f735966e04 Text-content-length: 132 Text-content-md5: 3d09285fd5ebc4ca5934e0c56e75bf4e Text-content-sha1: f86e1179b4af4d0baab6c7944c4c80c0ab1eba32 Content-length: 172 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN c.s)cRr>K#if 0 AppendMenu(menu1, MF_ENABLED, IDC_EXPORT_SSHCOM, "Export &ssh.com key"); #endif Revision-number: 1678 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2002-05-14T22:32:41.000000Z K 7 svn:log V 25 Added plug for kh2reg.py K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/accept-host-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 10dd17ea1015f86fccfc578d2efaa25f Text-delta-base-sha1: b75fef9d77503e87f32d51f192df6e3ca1b0eabf Text-content-length: 267 Text-content-md5: 0422d10be6896151e1bb5b0df5ba249b Text-content-sha1: 84115f0edfe0d0d9b43ed5b0e81a8a223a0ba9ae Content-length: 306 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN x x

    If you have host keys available in the common `known_hosts' format, we have a script to convert them to a Windows .REG file which can be installed ahead of time by double-clicking. Revision-number: 1679 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:28.907832Z PROPS-END Revision-number: 1680 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:28.915949Z PROPS-END Revision-number: 1681 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:28.924343Z PROPS-END Revision-number: 1682 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2002-05-15T19:16:45.000000Z K 7 svn:log V 35 Added export of ssh.com key files. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3c9f6ba8f8569d02e858df449df20dc4 Text-delta-base-sha1: 29e5b1f9a8dc145d12badbddec19362e42884ff8 Text-content-length: 130 Text-content-md5: 9e9579383d2e7081c798fcf6765a545f Text-content-sha1: 3cbf3e6d539bc3318be1977f109fe32e163c1d7b Content-length: 170 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN-j iH19t\versionid $Id: faq.but,v 1.28 2002/05/15 19:16:4and save both OpenSSH and \cw{ssh.com} private key files Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b3782005c65ead5da1ae01797bb5c8b9 Text-delta-base-sha1: 867f844c983cd990930c68c494355eac1b3d7471 Text-content-length: 3660 Text-content-md5: 7f11a2f016654de8d210841fe7c353b4 Text-content-sha1: fd6e8801ea1547d7d7e3dfb888e0ebbff8577d26 Content-length: 3699 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNR%-c{T\7vW-bMg^Oj`NvkF3vy0u4?Z{>G?A>0, ^r\A @8*unsigned char)(value); \ (cp)[2] = (unsigned char)((value) >> 8); \ (cp)[1] = (unsigned char)((value) >> 16); \ (cp)[0] = (unsigned char)((value) >> 24)int sshcom_write(char *filename, struct ssh2_userkey *key if (type == SSH_KEYTYPE_SSHCOM) return sshcom_write(filename, key, passphrase);, int cpl, 64#define SSHCOM_MAGIC_NUMBER 0x3f6ff9ebatic int sshcom_put_mpint int bits = len * 8 - 1; while (bits > 0) { if (*i & (1 << (bits & 7))) break; if (!(bits-- & 7)) i++, len--; } PUT_32BIT(d, bits+1); memcpy(d+4, i, len); return len+4;SSHCOM_MAGIC_NUMBER int sshcom; int publen, priv6]; int nnumbers, initial_zero, pos, lenpos, i; char *type; char *ciphertext; int cipherlennumbers[0] = e; numbers[1] = d; numbers[2] = n; numbers[3] = iqmp; numbers[4] = q; numbers[5] = p; nnumbers = 6; initial_zero = 0; type = "if-modn{sign{rsa-pkcs1-sha1},encrypt{rsa-pkcs1v2-oaep}} = p; numbers[1] = g; numbers[2] = q; numbers[3] = y; numbers[4] = x; nnumbers = 5; initial_zero = 1; type = "dl-modp{sign{dsa-nist-sha1},dh{plain}}Total size of key blob will be somewhere under 512 plus * combined length of integers. We'll calculate the more * precise size as we construct the blob. */ outlen = 512; for (i = 0; i < nnumbers; i++) outlen += 4 + numbers[i].bytes; outblob = smalloc(outlen); /* * Create the unencrypted key blob. */ pos = 0; PUT_32BIT(outblob+pos, SSHCOM_MAGIC_NUMBER); pos += 4; pos += 4; /* length field, fill in later */ pos += put_string(outblob+pos, type, strlen(type)); { char *ciphertype = passphrase ? "3des-cbc" : "none"; pos += put_string(outblob+pos, ciphertype, strlen(ciphertype)); } lenpos = pos; /* remember this position */ pos += 4; /* encrypted-blob size */ pos += 4; /* encrypted-payload size */ if (initial_zero) { PUT_32BIT(outblob+pos, 0); pos += 4; } for (i = 0; i < nnumbers; i++) pos += sshcom_put_mpint(outblob+pos, numbers[i].start, numbers[i].bytes); /* Now wrap up the encrypted payload. */ PUT_32BIT(outblob+lenpos+4, pos - (lenpos+8)); /* Pad encrypted blob to a multiple of cipher block size. */ if (passphrase) { int padding = -(pos - (lenpos+4)) & 7; while (padding--) outblob[pos++] = random_byte(); } ciphertext = outblob+lenpos+4; cipherlen = pos - (lenpos+4); assert(!passphrase || cipherlen % 8 == 0); /* Wrap up the encrypted blob string. */ PUT_32BIT(outblob+lenpos, cipherlen); /* And finally fill in the total length field. */ PUT_32BIT(outblob+4, pos); assert(pos < outlen);en"---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----\n", fp); fprintf(fp, "Comment: \""); /* * Comment header is broken with backslash-newline if it goes * over 70 chars. Although it's surrounded by quotes, it * _doesn't_ escape backslashes or quotes within the string. * Don't ask me, I didn't design it. */ { int slen = 60; /* starts at 60 due to "Comment: " */ char *c = key->comment; while (strlen(c) > slen) { fprintf(fp, "%.*s\\\n", slen, c); c += slen; slen = 70; /* allow 70 chars on subsequent lines */ } fprintf(fp, "%s\"\n", c); } base64_encode(fp, outblob, pos, 70); fputs("---- END SSH2 ENCRYPTED PRIVATE KEY ----\n" Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d09285fd5ebc4ca5934e0c56e75bf4e Text-delta-base-sha1: f86e1179b4af4d0baab6c7944c4c80c0ab1eba32 Text-content-length: 111 Text-content-md5: e67f4208d3ea314a4f4aa94743b62ba1 Text-content-sha1: 6ebc7ebb0d47908e6a280e314cfe67476f46eb20 Content-length: 151 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN V!V AppendMenu(menu1, MF_ENABLED, IDC_EXPORT_SSHCOM, "Export &ssh.com key"); Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b45c52dbfa8399c08cf38f4b5e3a8a0d Text-delta-base-sha1: 1a496c29cdfb805521be83665a8761b7211b39d2 Text-content-length: 283 Text-content-md5: 07f707dcc60a14d16c11d437225f55b3 Text-content-sha1: 9827a2535e0c4e02616e0d9372fedb139619656a Content-length: 323 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNQ#j_[co@v 6@, int cpl) { int linelen = 0; char out[4]; int n, i; while (datalen > 0) {or (i = 0; i < 4; i++) { if (linelen >= cpl) { linelen = 0; fputc('\n', fp); } fputc(out[i], fp); linelen++; }, 64, 64 Revision-number: 1683 Prop-content-length: 236 Content-length: 236 K 7 svn:log V 135 Final cleanups on key import/export work. Rationalised the UI (so that menu options are greyed out helpfully) and added documentation. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-05-15T20:07:11.000000Z PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 645ebfbfd68b28e291fd7dde88105d62 Text-delta-base-sha1: 382fde1ccb742faebaaf9c61a20f767008307a58 Text-content-length: 1562 Text-content-md5: a9802d47832e0046c80d9ac635bc454c Text-content-sha1: eb6afc4afefd6c0f0b5d92434b4fd8b46c504960 Content-length: 1602 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN9 5J5\versionid $Id: pubkey.but,v 1.15 2002/05/15 20:07:11PuTTYgen can also load SSH2 private keys in OpenSSH's format and \cw{ssh.com}'s format. Once you have loaded one of these key types, you can then save it back out as a PuTTY-format key so that you can use it with PuTTY. The passphrase will be unchanged by this process. You may want to change the key comment before you save the key, since OpenSSH's SSH2 key format contains no space for a comment and \cw{ssh.com}'s default comment format is long and verbose. \S{puttygen-export} Exporting your private key in an alternative format \cfg{winhelp-topic}{puttygen.export} Most SSH1 clients use a standard format for storing private keys on disk. PuTTY uses this format as well; so if you have generated an SSH1 private key using OpenSSH or \cw{ssh.com}'s client, you can use it with PuTTY, and vice versa. However, SSH2 private keys have no standard format. OpenSSH and \cw{ssh.com} have different formats, and PuTTY's is different again. So a key generated with one client cannot immediately be used with another. PuTTYgen has the ability to export private keys in OpenSSH format, or in \cw{ssh.com} format. To do so, select an option from the \q{Export} menu at the top of the PuTTYgen window. Exporting a key works exactly like saving it (see \k{puttygen-savepriv}) - you need to have typed your passphrase in beforehand, and you will be warned if you are about to save a key without a passphrase. Note that the export options are only available if you have generated an SSH2 Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e67f4208d3ea314a4f4aa94743b62ba1 Text-delta-base-sha1: 6ebc7ebb0d47908e6a280e314cfe67476f46eb20 Text-content-length: 5813 Text-content-md5: e7b4c1d01f68d71a2adfb0e3547aff33 Text-content-sha1: 148a5cb64fd8456017ac05b1d5cacf0271e27b0e Content-length: 5853 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNO:lt8r,gbK{SF:Jvo=@K!&t]FGND6?M+Py#G[k_~3,vP`n,A=-yF_(no HMENU filemenu, keymenu, exportmenuenum { controlidstart = 100, IDC_QUIT, IDC_TITLE, IDC_BOX_KEY, IDC_NOKEY, IDC_GENERATING, IDC_PROGRESS, IDC_PKSTATIC, IDC_KEYDISPLAY, IDC_FPSTATIC, IDC_FINGERPRINT, IDC_COMMENTSTATIC, IDC_COMMENTEDIT, IDC_PASSPHRASE1STATIC, IDC_PASSPHRASE1EDIT, IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2EDIT, IDC_BOX_ACTIONS, IDC_GENSTATIC, IDC_GENERATE, IDC_LOADSTATIC, IDC_LOAD, IDC_SAVESTATIC, IDC_SAVE, IDC_SAVEPUB, IDC_BOX_PARAMS, IDC_TYPESTATIC, IDC_KEYSSH1, IDC_KEYSSH2RSA, IDC_KEYSSH2DSA, IDC_BITSSTATIC, IDC_BITS, IDC_ABOUT, IDC_GIVEHELP, IDC_IMPORT, IDC_EXPORT_OPENSSH, IDC_EXPORT_SSHCOM }; static const int nokey_ids[] = { IDC_NOKEY, 0 }; static const int generating_ids[] = { IDC_GENERATING, IDC_PROGRESS, 0 }; static const int gotkey_ids[] = { IDC_PKSTATIC, IDC_KEYDISPLAY, IDC_FPSTATIC, IDC_FINGERPRINT, IDC_COMMENTSTATIC, IDC_COMMENTEDIT, IDC_PASSPHRASE1STATIC, IDC_PASSPHRASE1EDIT, IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2EDIT, 0 }; /* * Small UI helper function to switch the state of the main dialog * by enabling and disabling controls and menu items. */ void ui_set_state(HWND hwnd, struct MainDlgState *state, int status) { int type; switch (status) { case 0: /* no key0); EnableWindow(GetDlgItem(hwnd, IDC_SAVEPUB), 0EnableMenuItem(state->filemenu, IDC_LOAD, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->filemenu, IDC_SAVE, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->filemenu, IDC_SAVEPUB, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_GENERATE, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_KEYSSH1, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_KEYSSH2RSA, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_KEYSSH2DSA, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->exportmenu, IDC_EXPORT_OPENSSH, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->exportmenu, IDC_EXPORT_SSHCOM, MF_GRAYED|MF_BYCOMMAND); break; case 1: /* generating keyFALSGENERATE), 0); EnableWindow(GetDlgItem(hwnd, IDC_LOAD), 0); EnableWindow(GetDlgItem(hwnd, IDC_SAVE), 0); EnableWindow(GetDlgItem(hwnd, IDC_SAVEPUB), 0); EnableWindow(GetDlgItem(hwnd, IDC_KEYSSH1), 0); EnableWindow(GetDlgItem(hwnd, IDC_KEYSSH2RSA), 0); EnableWindow(GetDlgItem(hwnd, IDC_KEYSSH2DSA), 0); EnableWindow(GetDlgItem(hwnd, IDC_BITS), 0); EnableMenuItem(state->filemenu, IDC_LOAD, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->filemenu, IDC_SAVE, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->filemenu, IDC_SAVEPUB, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_GENERATE, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_KEYSSH1, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_KEYSSH2RSA, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_KEYSSH2DSA, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->exportmenu, IDC_EXPORT_OPENSSH, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->exportmenu, IDC_EXPORT_SSHCOM, MF_GRAYED|MF_BYCOMMAND); break; case 2:EnableMenuItem(state->filemenu, IDC_LOAD, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->filemenu, IDC_SAVE, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->filemenu, IDC_SAVEPUB, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_GENERATE, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_KEYSSH1, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_KEYSSH2RSA,MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->keymenu, IDC_KEYSSH2DSA,MF_ENABLED|MF_BYCOMMAND); /* * Enable export menu items if and only if the key type * supports this kind of export. */ type = state->ssh2 ? SSH_KEYTYPE_SSH2 : SSH_KEYTYPE_SSH1; #define do_export_menuitem(x,y) \ EnableMenuItem(state->exportmenu, x, MF_BYCOMMAND | \ (import_target_type(y)==type?MF_ENABLED:MF_GRAYED)) do_export_menuitem(IDC_EXPORT_OPENSSH, SSH_KEYTYPE_OPENSSH); do_export_menuitem(IDC_EXPORT_SSHCOM, SSH_KEYTYPE_SSHCOM); #undef do_export_menuitem break; }HMENU menu, menu1; menu = CreateMenu(); menu1 = CreateMenu( AppendMenu(menu1, MF_SEPARATOR, 0, 0); AppendMenu(menu1, MF_ENABLED, IDC_QUIT, "E&xit"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&File"); state->filemenu = menu1SEPARATOR, 0, 0); AppendMenu(menu1, MF_ENABLED, IDC_KEYSSH1, "SSH&1 key (RSA)"); AppendMenu(menu1, MF_ENABLED, IDC_KEYSSH2RSA, "SSH2 &RSA key"); AppendMenu(menu1, MF_ENABLED, IDC_KEYSSH2DSA, "SSH2 &DSA key"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Key"); state->keymenu = menu1 state->exportmenu = menu1CheckMenuRadioItem(state->keymenu, IDC_KEYSSH1, IDC_KEYSSH2DSA, IDC_KEYSSH1, MF_BYCOMMANDui_set_state(hwnd, stateKEYSSH1: case IDC_KEYSSH2RSA: case IDC_KEYSSH2DSA: { state = (struct MainDlgState *) GetWindowLong(hwnd, GWL_USERDATA); if (!IsDlgButtonChecked(hwnd, LOWORD(wParam))) CheckRadioButton(hwnd, IDC_KEYSSH1, IDC_KEYSSH2DSA, LOWORD(wParam)); CheckMenuRadioItem(state->keymenu, IDC_KEYSSH1, IDC_KEYSSH2DSA, LOWORD(wParam), MF_BYCOMMAND); } break; case IDC_QUIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break;ui_set_state(hwnd, state, 1); SetDlgItemText(hwnd, IDC_GENERATING, entropy_msg); state->key_exists = FALSEui_set_state(hwnd, state, 2ui_set_state(hwnd, state, 2 case IDC_EXPORT_OPENSSH: case IDC_EXPORT_SSHCOM: cmd = "JI(`',`puttygen.export Revision-number: 1684 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:29.136202Z PROPS-END Revision-number: 1685 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2002-05-16T22:36:36.000000Z K 7 svn:log V 46 Nit: PuTTYgen can generate RSA _and DSA_ keys K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a9802d47832e0046c80d9ac635bc454c Text-delta-base-sha1: eb6afc4afefd6c0f0b5d92434b4fd8b46c504960 Text-content-length: 88 Text-content-md5: d6f0e269609ea8b11fc159d10a063be7 Text-content-sha1: e41f84cfddb81df1b07e74695df03ba1ae72b8a5 Content-length: 128 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN  @a;q\versionid $Id: pubkey.but,v 1.16 2002/05/16 22:36:36 jacoband D Revision-number: 1686 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2002-05-17T12:33:20.000000Z K 7 svn:log V 74 ieof-for-nonexistent-channel problem: avoid comparing an unsigned with -1 K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: aa2bb8dacd0844befe157ab0e6223dad Text-delta-base-sha1: daea1ea429ab4a5ee44b7f18dd53e497ac31d178 Text-content-length: 68 Text-content-md5: d5edb9c6201c5d1d1c3c85b08a2b17bd Text-content-sha1: 5c39fabf9fe13a5b534ff8c34bce57020d1ecca6 Content-length: 109 K 15 cvs2svn:cvs-rev V 5 1.205 PROPS-END SVN vx((int)c->remoteid)BIBut.data Revision-number: 1687 Prop-content-length: 361 Content-length: 361 K 8 svn:date V 27 2002-05-18T09:20:41.000000Z K 7 svn:log V 260 UI changes for key imports. We now have a separate Load command and Import command; the former warns you if you load a foreign key, whereas the latter doesn't. So the user should always be aware, one way or the other, that a format conversion is taking place. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d6f0e269609ea8b11fc159d10a063be7 Text-delta-base-sha1: e41f84cfddb81df1b07e74695df03ba1ae72b8a5 Text-content-length: 1503 Text-content-md5: b559b5f38705a21ae507491dcbe003b5 Text-content-sha1: f85395116e3ec12857046df315dda72c98f172ec Content-length: 1543 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN; ;k@~\versionid $Id: pubkey.but,v 1.17 2002/05/18 09:20:41 simonIf you use the Load command to load a foreign key format, it will work, but you will see a message box warning you that the key you have loaded is not a PuTTY native key. See \k{puttygen-conversions} for information about importing foreign key formats. \S{puttygen-conversions} Dealing with private keys in other formats \cfg{winhelp-topic}{puttygen.conversionsUsing the \q{Import} command from the \q{Conversions} menu, PuTTYgen can load SSH2 private keys in OpenSSH's format and \cw{ssh.com}'s format. Once you have loaded one of these key types, you can then save it back out as a PuTTY-format key so that you can use it with PuTTY. The passphrase will be unchanged by this process (unless you deliberately change it). You may want to change the key comment before you save the key, since OpenSSH's SSH2 key format contains no space for a comment and \cw{ssh.com}'s default comment format is long and verbose. PuTTYgen can also export private keys in OpenSSH format and in \cw{ssh.com} format. To do so, select one of the \q{Export} options from the \q{Conversions} menu. Exporting a key works exactly like saving it (see \k{puttygen-savepriv}) - you need to have typed your passphrase in beforehand, and you will be warned if you are about to save a key without a passphrase. Note that since only SSH2 keys come in different formats, the export options are not available if you have generated an SSH1 Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e7b4c1d01f68d71a2adfb0e3547aff33 Text-delta-base-sha1: 148a5cb64fd8456017ac05b1d5cacf0271e27b0e Text-content-length: 1041 Text-content-md5: 1d769e402ab6e0ff0e85af14621148db Text-content-sha1: 069e3c2f5835913c03e3117e9a4a246d45c8d9e8 Content-length: 1081 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNOeWHT8hKGT89u/H)AxGE@9,Uv.5Prbu<7cvcvtmenu, IDC_IMPORT, MF_ENABLED|MF_BYCOMMAND); EnableMenuItem(state->cvcvcvtmenu, IDC_IMPORT, MF_GRAYED|MF_BYCOMMAND); EnableMenuItem(state->cvcvEnableMenuItem(state->cvtmenu, IDC_IMPORT, cvIMPORT, "&Import key"); AppendMenu(menu1, MF_SEPARATOR, 0, 0Conversions"); state->cvtmenu = menu1case IDC_IMPORT /* * If the user has imported a foreign key * using the Load command, let them know. * If they've used the Import command, be * silent. */ if (realtype != type && LOWORD(wParam) == IDC_LOAD) { char msg[512]; sprintf(msg, "Successfully imported foreign key\n" "(%s).\n" "To use this key with PuTTY, you need to\n" "use the \"Save private key\" command to\n" "save it in PuTTY's own format.", key_type_to_str(realtype)); MessageBox(NULL, msg, "PuTTYgen Notice", MB_OK | MB_ICONINFORMATION); }IMPORT:conversions Revision-number: 1688 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2002-05-21T08:17:02.000000Z K 7 svn:log V 49 Possibly useful extra information from Al Smith. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rsa-verify-failed Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d4544a8268900fc1d1c207136ec7a042 Text-delta-base-sha1: e5cd14d2f14d51ed2ab3669b9a4d67e002ff43c9 Text-content-length: 146 Text-content-md5: ed963c0fc0a8265ecc8f08bf829993cc Text-content-sha1: 891730ce5e18f9bb7f9d223183b1a1bf4b04d4e6 Content-length: 185 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNmo |C|0=which apparently resolves to "the RSA_verify() function in SSL telling [us] RSA_R_WRONG_SIGNATURE_LENGTH". Revision-number: 1689 Prop-content-length: 120 Content-length: 120 K 10 svn:author V 4 owen K 8 svn:date V 27 2002-05-21T08:25:33.000000Z K 7 svn:log V 21 Wish: disable colour PROPS-END Node-path: putty-wishlist/data/disable-colour Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 295 Text-content-md5: 40d207bb3e6108eedd9671cce4d86e15 Text-content-sha1: 0ee01876861f14efe320d82ebe0c5dc37f0c6fd7 Content-length: 411 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Features panel -- disable ANSI colour escape sequences Class: wish Priority: low Difficulty: fun Content-Type: text/plain Make it possible to disable ANSI colour escape sequences, so that the terminal becomes just two colour (Default Foreground and Default Background). Revision-number: 1690 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:29.481603Z PROPS-END Revision-number: 1691 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2002-05-22T11:38:20.000000Z K 7 svn:log V 113 Neal Tucker's report of resizing flakiness after Alt-Space+N minimise. (Perhaps should be merged with 'resize'?) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/resize-minimise Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 751 Text-content-md5: 456159c80d72a1bee2b9817d614db580 Text-content-sha1: c47647c100ab5e1202d4be362ee766d875df25f3 Content-length: 867 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNaaaSummary: Resize after Alt-Space, N minimise doesn't work Class: bug Priority: medium Present-in: 0.52 2002-05-20 Content-type: text/x-html-body

    Another bit of resize flakiness that's been reported :

    • Open a connection somewhere.
    • Resize the window (to verify that it can be resized).
    • Type alt-space, then 'n' to minimize the window.
    • Alt-tab (or click it on the taskbar) to bring it back up.
    • Attempt to resize the window. There'll be a lot of flickering, and if you chose a left/top handle the window will move around, but it won't resize.
    • Type something into the window.
    • Resizing now works.

    (This may be something to look at when fixing the other resize flakiness.) Revision-number: 1692 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:29.512329Z PROPS-END Revision-number: 1693 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2002-05-22T21:18:06.000000Z K 7 svn:log V 132 Note that answerback string can contain control characters with ^C notation, and the ^~ escape, but don't go into the gory details. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 60fe369299ee02d8a33a33697f8e62e3 Text-delta-base-sha1: 5d34a616d07ccd96e0eab42f7a5ed0b564795bbf Text-content-length: 205 Text-content-md5: 2aacc52ea6c38bd599a58e9202f1c542 Text-content-sha1: b6fdfa595c4d9c6e4749a2b59f5a6fcb932daf10 Content-length: 245 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN`Z 2T:wT \versionid $Id: config.but,v 1.33 2002/05/22 21:18:06 jacobYou can include control characters in the answerback string using \c{^C} notation. (Use \c{^~} to get a literal \c{^}.) Revision-number: 1694 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2002-05-22T21:57:22.000000Z K 7 svn:log V 51 Added the already-fixed Win98 mouse wheel problem. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win98-wheel Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 257 Text-content-md5: ba68d7026937ea5dbac0f32c67190e38 Text-content-sha1: a6f358e30d4ea02aff42765545ee3b3931a33443 Content-length: 373 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNsssSummary: Wheel mouse support broken under Win98 Class: bug Priority: high Present-in: 0.52 Fixed-in: 2002-01-19 Content-type: text/x-html-body

    The mouse wheel support was broken under Windows 98 in the 0.52 release. It's been fixed since. Revision-number: 1695 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2002-05-23T21:27:55.000000Z K 7 svn:log V 36 Option to leave DNS lookup to proxy K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy-lookup Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 463 Text-content-md5: 499c7dc43ec9c90e784ca938ea11bb43 Text-content-sha1: 22b172771d85f2504dc66a7fe700376d2f4f69b0 Content-length: 579 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNAAASummary: Option to leave DNS lookup to proxies Class: wish Priority: low Content-type: text/x-html-body

    When connecting through a proxy, there should be an option to leave looking up the hostname to the proxy, to cope with setups where the client's and proxy's views of the DNS are different (search paths, client has no DNS configured, etc).

    It should be optional; I can imagine wanting to perform the lookup locally (for similar reasons). Revision-number: 1696 Prop-content-length: 206 Content-length: 206 K 7 svn:log V 105 Perhaps the default for background-colour-erase should change. cf K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-05-23T21:47:22.000000Z PROPS-END Node-path: putty-wishlist/data/bce-default-change Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 303 Text-content-md5: 342b226ccf187663b3de7236f9d9ba4b Text-content-sha1: dc7f3e86d67a51faa1a96c77febdf872cc0e4bc6 Content-length: 419 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN!!!Summary: Perhaps the default for BCE should change Priority: low Class: wish Content-type: text/x-html-body

    Perhaps the default for the `Use background colour to erase screen' setting should change. Applications that rely on the current default seem a lot rarer than the alternative. Revision-number: 1697 Prop-content-length: 197 Content-length: 197 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-05-23T22:02:53.000000Z K 7 svn:log V 97 Trying to use an SSH2 key with an SSH1 connection seems to be quite common, so I've added a FAQ. PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9e9579383d2e7081c798fcf6765a545f Text-delta-base-sha1: 3cbf3e6d539bc3318be1977f109fe32e163c1d7b Text-content-length: 603 Text-content-md5: 7ddbc1b63235d5d056cc9d6627305a9a Text-content-sha1: b39365f08dac789a9138fe57bc6613c29a616775 Content-length: 643 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNjt>r8D&\versionid $Id: faq.but,v 1.29 2002/05/23 22:02:53 jacobS{faq-ssh2key-ssh1conn}{Question} Why do I see "Couldn't load private key from ..."? Why can PuTTYgen load my key but not PuTTY? It's likely that you've generated an SSH protocol 2 key with PuTTYgen, but you're trying to use it in an SSH 1 connection. SSH1 and SSH2 keys have different formats, and (at least in 0.52) PuTTY's reporting of a key in the wrong format isn't optimal. To connect using SSH 2 to a server that supports both versions, you need to change the configuration from the default (see \k{faq-ssh2}) Revision-number: 1698 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2002-05-23T22:06:05.000000Z K 7 svn:log V 15 Add Difficulty K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/bce-default-change Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 342b226ccf187663b3de7236f9d9ba4b Text-delta-base-sha1: dc7f3e86d67a51faa1a96c77febdf872cc0e4bc6 Text-content-length: 34 Text-content-md5: dd7f47e7fdf8a4d2a385d9e120b33d4f Text-content-sha1: 0f55c76a821940da9f59fa6f3385caa26a0085ac Content-length: 73 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN!1MULDifficulty: fun Node-path: putty-wishlist/data/proxy-lookup Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 499c7dc43ec9c90e784ca938ea11bb43 Text-delta-base-sha1: 22b172771d85f2504dc66a7fe700376d2f4f69b0 Text-content-length: 34 Text-content-md5: cddb12d7077b795fd3d72ac7d5a15525 Text-content-sha1: 0dcfa77ec62f39808a683f365825e48d6bb92322 Content-length: 73 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNAQIyHDifficulty: fun Revision-number: 1699 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2002-05-23T22:08:23.000000Z K 7 svn:log V 28 Option to start full-screen K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/startup-fullscreen Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 278 Text-content-md5: a97b27996efffa75d9b9a8e263038146 Text-content-sha1: e13697485b12e02fd504407d8c8940033806be97 Content-length: 394 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Option to start up in full screen mode Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body

    While you can start a PuTTY window maximised by Windows mechanisms, currently there's no way to start it full-screen. There should be. Revision-number: 1700 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2002-05-23T23:23:48.000000Z K 7 svn:log V 43 ssh.com SecurID support (and why we can't) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/securid Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 587 Text-content-md5: e707386551508219b95d6e4cea98c64a Text-content-sha1: 69767e8c6eeac6b4a75356db89943d3c896fdf9c Content-length: 703 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN===Summary: ssh.com SecurID authentication Priority: low Class: wish Difficulty: taxing Content-Type: text/x-html-body

    Several people have asked for support for the implementation of SecurID in ssh.com's server.

    Unfortunately, for reasons best known to themselves, ssh.com have chosen to define this as a private authentication method `securid-1@ssh.com' (rather than using for instance keyboard-interactive authentication). We haven't seen a spec for this method, so can't implement it in PuTTY. Revision-number: 1701 Prop-content-length: 283 Content-length: 283 K 7 svn:log V 182 Someone asked for the cursor blink rate to match Windows' configuration. (I'm _sure_ I remember playing round with this, but there's nothing in the code to support that hypothesis.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-05-23T23:24:35.000000Z PROPS-END Node-path: putty-wishlist/data/blinkrate Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 262 Text-content-md5: 00b2999c924c05eacd6450fe783fbe33 Text-content-sha1: 95166e079877940db4d50d4798368d9feb7fd5be Content-length: 378 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNxxxSummary: Make PuTTY's blinking cursor use the system-wide blink rate Priority: low Difficulty: fun Class: wish Content-type: text/x-html-body

    It's been suggested that PuTTY's blinking cursor should match the configured system-wide blink rate. Revision-number: 1702 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:29.849487Z PROPS-END Revision-number: 1703 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:29.858541Z PROPS-END Revision-number: 1704 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:29.867629Z PROPS-END Revision-number: 1705 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:29.875716Z PROPS-END Revision-number: 1706 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2002-05-30T08:54:54.000000Z K 7 svn:log V 71 Reclassify rsa-verify-failed as an OpenSSH bug requiring a workaround. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/rsa-verify-failed Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ed963c0fc0a8265ecc8f08bf829993cc Text-delta-base-sha1: 891730ce5e18f9bb7f9d223183b1a1bf4b04d4e6 Text-content-length: 658 Text-content-md5: a014b2f8e9e35f990d4d6daa9eb43021 Text-content-sha1: 866bb31860ffae5ab84abe0573e991b6386342b9 Content-length: 697 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNo* {AnWgwish Difficulty: funSGT, 2002-05-30: This is in fact not a complex bignum bug in PuTTY, but is a simple disagreement between PuTTY and OpenSSH about the correct way to pad RSA signatures in SSH2. It appears that the draft RFC is on our side, so this is a bug in OpenSSH, apparently caused by their RSA-for-SSH2 implementation being done before the specification was finalised. They will hopefully fix it for OpenSSH 3.3. However, PuTTY should detect OpenSSH versions which have the bug and pad its signatures appropriately for those versions; hence I've reclassified this as a nice easy feature addition rather than a hard bug. Revision-number: 1707 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2002-05-30T12:41:07.000000Z K 7 svn:log V 122 Fix AltGr/Application/Compose/CtrlAlt discrepancies introduced in windlg.c rev 1.118 [r1033] (pointed out by Rob Pitman). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2aacc52ea6c38bd599a58e9202f1c542 Text-delta-base-sha1: b6fdfa595c4d9c6e4749a2b59f5a6fcb932daf10 Text-content-length: 423 Text-content-md5: 4bf033a815d7ef1cc337afff14c2466e Text-content-sha1: 01162f841d1d8601e8c9ce4175da4655d3b0e5b1 Content-length: 463 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNZ65;Kw@\versionid $Id: config.but,v 1.34 2002/05/30 12:41:07r keyboard has a Windows Application key, it acts as a Compose key in PuTTY. Alternatively, if you enable the \q{AltGr acts as Compose key} option, the AltGr key will become a Compose key(However, Ctrl-Alt will never act as a Compose key, regardless of the setting of \q{AltGr acts as Compose key} described in \k{config-compose}.) Revision-number: 1708 Prop-content-length: 453 Content-length: 453 K 8 svn:date V 27 2002-05-31T17:39:16.000000Z K 7 svn:log V 352 Workaround for the SSH2 RSA padding bug in OpenSSH 2.5 - 3.2 inclusive. Padding is accomplished by rewriting the signature blob rather than at the point of generation, in order to avoid having to move part of the workaround into Pageant (and having to corrupt the agent wire protocol to allow PuTTY to specify whether it wants its signatures padded!). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d5edb9c6201c5d1d1c3c85b08a2b17bd Text-delta-base-sha1: 5c39fabf9fe13a5b534ff8c34bce57020d1ecca6 Text-content-length: 4910 Text-content-md5: e9e8a3d04b0f76fcd2ce7b5d6a2fe4cf Text-content-sha1: 38700e222105e94f19cfd6047155678a10b95426 Content-length: 4951 K 15 cvs2svn:cvs-rev V 5 1.206 PROPS-END SVN 541/)2J#define BUG_SSH2_RSA_PADDING 16Helper function to add an SSH2 signature blob to a packet. * Expects to be shown the public key blob as well as the signature * blob. Normally works just like ssh2_pkt_addstring, but will * fiddle with the signature packet if necessary for * BUG_SSH2_RSA_PADDING. */ static void ssh2_add_sigblob(void *pkblob_v, int pkblob_len, void *sigblob_v, int sigblob_len) { unsigned char *pkblob = (unsigned char *)pkblob_v; unsigned char *sigblob = (unsigned char *)sigblob_v; /* dmemdump(pkblob, pkblob_len); */ /* dmemdump(sigblob, sigblob_len); */ /* * See if this is in fact an ssh-rsa signature and a buggy * server; otherwise we can just do this the easy way. */ if ((ssh_remote_bugs & BUG_SSH2_RSA_PADDING) && (GET_32BIT(pkblob) == 7 && !memcmp(pkblob+4, "ssh-rsa", 7))) { int pos, len, siglen; /* * Find the byte length of the modulus. */ pos = 4+7; /* skip over "ssh-rsa" */ pos += 4 + GET_32BIT(pkblob+pos); /* skip over exponent */ len = GET_32BIT(pkblob+pos); /* find length of modulus */ pos += 4; /* find modulus itself */ while (len > 0 && pkblob[pos] == 0) len--, pos++; /* debug(("modulus length is %d\n", len)); */ /* * Now find the signature integer. */ pos = 4+7; /* skip over "ssh-rsa" */ siglen = GET_32BIT(sigblob+pos); /* debug(("signature length is %d\n", siglen)); */ if (len != siglen) { unsigned char newlen[4]; ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(sigblob, pos); /* dmemdump(sigblob, pos); */ pos += 4; /* point to start of actual sig */ PUT_32BIT(newlen, len); ssh2_pkt_addstring_data(newlen, 4); /* dmemdump(newlen, 4); */ newlen[0] = 0; while (len-- > siglen) { ssh2_pkt_addstring_data(newlen, 1); /* dmemdump(newlen, 1); */ } ssh2_pkt_addstring_data(sigblob+pos, siglen); /* dmemdump(sigblob+pos, siglen); */ return; } /* Otherwise fall through and do it the easy way. */ } ssh2_pkt_addstring_start(); ssh2_pkt_addstring_data(sigblob, sigblob_len) if ((!strncmp(imp, "OpenSSH_2.", 10) && imp[10]>='5' && imp[10]<='9') || (!strncmp(imp, "OpenSSH_3.", 10) && imp[10]>='0' && imp[10]<='2')) { /* * These versions have the SSH2 RSA padding bug. */ ssh_remote_bugs |= BUG_SSH2_RSA_PADDING; logevent("We believe remote version has SSH2 RSA paddingIqKwu2Bu2T < _?Fj{D})zBxQtkey_algs); i++) { ssh2_pkt_addstring_str(hostkey_algs[i]->name); if (i < lenof(hostkey_algs) - 1) ssh2_pkt_addstring_str(","); } /* List client->server encryption algorithms. */ ssh2_pkt_addstring_start(); cipherstr_startedcontinue; /* warning flag */ for (j = 0; j < c->nciphers; j++) { if (cipherstr_started) ssh2_pkt_addstring_str(","); ssh2_pkt_addstring_str(c->list[j]->name); cipherstr_started = 1; } } /* List server->client encryption algorithms. */ ssh2_pkt_addstring_start(); cipherstr_startedcontinue; /* warning flag */ for (j = 0; j < c->nciphers; j++) { if (cipherstr_started) ssh2_pkt_addstring_str(","); ssh2_pkt_addstring_str(c->list[j]->name); cipherstr_started = 1; } } /* List client->server MAC algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < nmacs; i++) { ssh2_pkt_addstring_str(maclist[i]->name); if (i < nmacs - 1) ssh2_pkt_addstring_str(","); } /* List server->client MAC algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < nmacs; i++) { ssh2_pkt_addstring_str(maclist[i]->name); if (i < nmacs - 1) ssh2_pkt_addstring_str(","); } /* List client->server compression algorithms. */ ssh2_pkt_addstring_start();ssh2_pkt_addstring_str(c->name); if (i < lenof(compressions)) ssh2_pkt_addstring_str(","); } /* List server->client compression algorithms. */ ssh2_pkt_addstring_start();ssh2_pkt_addstring_str(c->name); if (i < lenof(compressions)) ssh2_pkt_addstring_str(","); } /* List client->server languages. Empty list. */ ssh2_pkt_addstring_start(); /* List server->client languages. Empty list. */ ssh2_pkt_addstring_start(); /* First KEX packet does _not_ follow, because we're not that brave. */ ssh2_pkt_addbool(FALSE); /* Reserved. */ ssh2_pkt_adduint32(0); exhash = exhashbase; sha_string(&exhash, pktoadd_sigblob(pkblob, pklen, ret + 9, GET_32BIT(ret +pkblob, *sigblob, *sigdata; int pkblob_len, sigpkblob = key->alg->public_blob(key->data, &pkblob_lenkblob, pkblob_lensigblob = key->alg->sign(key->data, sigdata, sigdata_len, &sigblob_len); ssh2_add_sigblob(pkblob, pkblob_len, sigblob, sigblob_len); sfree(pkblob); sfree(sig Revision-number: 1709 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2002-06-01T21:09:07.000000Z K 7 svn:log V 32 Wish for default-printer option K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/printer-list Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5c15874482376a0071a5d7865d66c0b6 Text-delta-base-sha1: 13997e321b36142baacd557ed5100e7c6b14bef6 Text-content-length: 153 Text-content-md5: 57c58af3ce0831853dda570c747ca5b0 Text-content-sha1: df877ffc28f1d327f832d22c6d44c4ec1330dea9 Content-length: 192 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN=C=

    (While we're looking at this, it's been pointed out that having an option to go with the Windows default printer would be nice.) Revision-number: 1710 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:30.112138Z PROPS-END Revision-number: 1711 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2002-06-06T22:38:37.000000Z K 7 svn:log V 59 Port forwarding should cope better with already-used ports K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-multi Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 861 Text-content-md5: db7a970841fa6f01265028e86db87632 Text-content-sha1: a7fd39a0af5adaf0ee76a010882ff4993f44a96b Content-length: 977 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNOOOSummary: Port forwarding should cope better with already-used ports Difficulty: mayhem Priority: medium Class: semi-bug Content-type: text/x-html/body

    When attempting to open a forwarded port that's already bound (e.g. running multiple sessions with the same port forwarding settings), PuTTY should warn that it was unable to open the port (perhaps a line in the Event Log). (Currently it just acts as though both instances successfully opened the port.)

    Worryingly, this doesn't look like a PuTTY problem; it seems that Windows is happy to let the second PuTTY process open the port for listening, and report success, and never thinks to tell it that the port is already in use by the first PuTTY. Running the Windows 2000 `netstat' utility even lists the same port twice.

    Therefore, there's probably nothing we can do about this. Revision-number: 1712 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2002-06-06T22:39:18.000000Z K 7 svn:log V 59 Bug compatibility modes accidentally triggered for VShell. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vshell-no-bug-compat Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 667 Text-content-md5: a4b2e75287fea2755c5b7fcb54f6bbcf Text-content-sha1: 1c99fe99d062b090082501024edb3c7407b962b0 Content-length: 783 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  Summary: Bug compatibility modes accidentally triggered for VShell. Class: bug Priority: medium Difficulty: fun Content-type: text/x-html-body

    It appears that the triggers for bug compatibility modes in ssh_detect_bugs() are too lax. For instance, the following version string (presented by VShell):

    SSH-2.0-2.0.1 (official) VShell

    is mistakenly triggering the HMAC bug compatibility mode.

    (It might also be nice if users could force particular bug compatibility modes on or off in the configuration, as well as having them automatically detected.) Revision-number: 1713 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2002-06-06T22:41:15.000000Z K 7 svn:log V 13 Content-Type K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-multi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: db7a970841fa6f01265028e86db87632 Text-delta-base-sha1: a7fd39a0af5adaf0ee76a010882ff4993f44a96b Text-content-length: 22 Text-content-md5: e96ef4708ecdc1df1cd78f372ab82f37 Text-content-sha1: 1df4d773fed3c67605e8045ffe3dd3ae6051fa30 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNOO =- Revision-number: 1714 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2002-06-07T17:19:05.000000Z K 7 svn:log V 35 Add refs to ECMA-48 and ECMA TR/53 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/bidi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6457df633a523bf19b964357826a8c65 Text-delta-base-sha1: 73d1a078135c391ee46be33c30525b04c2907d11 Text-content-length: 574 Text-content-md5: 940b778e27b2d4624392c1bdf425af2b Text-content-sha1: 182652f462f315196107577fdf24b02043d33001 Content-length: 613 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN:Qkq. 9x-html-body

    JTN, 2002-06-07: Some time ago, we came to the conclusion that ECMA-48, in the course of defining VT-series-ish terminals, defines how such terminals should support bi-directional text, while ECMA TR/53 nicely encapsulates all the bidi-specific bits in a (more) understandable format, gives examples, etc. Of course, we don't know whether anyone really implements it this way. Revision-number: 1715 Prop-content-length: 334 Content-length: 334 K 8 svn:date V 27 2002-06-08T09:00:00.000000Z K 7 svn:log V 233 Modify the Feedback page / Appendix B to expand the section about not sending us large attachments, and in particular remove the emphasis on screen shots in the hope of also decreasing the number of _other_ large attachments we get. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1c37bc7bc4c78940691f4ff6b7ef1417 Text-delta-base-sha1: 4dbf0b6d03cef2e071b4a0bbc75f34952c309a84 Text-content-length: 2623 Text-content-md5: 01bc1011ac79cb40334439294b8b66c9 Text-content-sha1: 3e4e6bc3098f8921b53546ef295c5918ddb89f09 Content-length: 2662 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNC$Y6'%fS4\versionid $Id: feedback.but,v 1.5 2002/06/08 09:00:00private mailing list containing four or five core developers. Don't be put off by it being a mailing list: if you need to send confidential data as part of a bug report, you can trust the people on the list to respect that confidence. Also, the archives aren't publicly available, so you shouldn't be letting yourself in for any spam by sending us mail. \S{feedback-largefiles} Sending large attachments Since the PuTTY contact address is a mailing list, e-mails larger than 40Kb will be held for inspection by the list administrator, and will not be allowed through unless they really appear to be worth their large size. If you are considering sending any kind of large data file to the PuTTY team, it's almost always a bad idea, or at the very least it would be better to ask us first whether we actually need the file. Alternatively, you could put the file on a web site and just send us the URL; that way, we don't have to download it unless we decide we actually need it, and only one of us needs to download it instead of it being automatically copied to all the developers. Some people like to send mail in MS Word format. Please \e{don't} send us bug reports, or any other mail, as a Word document. Word documents are roughly fifty times larger than writing the same report in plain text. In addition, most of the PuTTY team read their e-mail on Unix machines, so copying the file to a Windows box to run Word is very inconvenient. Not only that, but several of us don't even \e{have} a copy of Word! Some people like to send us screen shots when demonstrating a problem. Please don't do this without checking with us first - we almost never actually need the information in the screen sho\e{occasionally} useful, but it's probably still wise to check whether we need it before sending it. Please don't mail us executables, at all. For security reasons, it would be really unwise of us to run executables we receive from unknown people by e-mail, so there's no point sending them to us. At some point, indeed, we hope to block all incoming e-mail containing executables, as a defence against the vast numbers of e-mail viruses we receive every day. If you have made a tiny modification to the PuTTY code, please send us a \e{patch} to the source code if possible, rather than sending us a huge \cw{.ZIP} file containing the complete sources plus your modification. If you've only changed 10 lines, we'd prefer to receive a mail that's 30 lines long than one containing multiple megabytes of data we already have. Revision-number: 1716 Prop-content-length: 245 Content-length: 245 K 7 svn:log V 144 The taskbar bell indication needs cleaning up. It works nicely on Win95/NT4 but is quite ugly on more recent versions of Windows such as Win2K. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-06-09T16:01:09.000000Z PROPS-END Node-path: putty-wishlist/data/beepind-win2k Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 659 Text-content-md5: e15e368775dca5e755436995d4340928 Text-content-sha1: fe1a77f6fac395d9a67a2d380c4bd9afe9de5eae Content-length: 775 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Clean up taskbar bell indication Priority: medium Class: semi-bug Difficulty: fun Content-type: text/x-html-body

    The taskbar bell indication needs cleaning up. It works nicely on Win95/NT4 but is quite ugly on more recent versions of Windows such as Win2K.

    We should use FlashWindowEx() if it's available at run-time (IIRC this just needs calling once, and will flash the window as necessary), and fall back to the current FlashWindow() manual flashing implementation if not.

    This requires compiler support that I (JTN) don't have currently.

    Quite where this leaves the `steady' mode I'm not sure. Revision-number: 1717 Prop-content-length: 326 Content-length: 326 K 8 svn:date V 27 2002-06-09T18:04:25.000000Z K 7 svn:log V 225 Port forwarding things: - portfwd-open-crash (bug): Crashes with heavy open/close activity in port-forwarding - portfwd-range (wish): Allow port ranges in tunnel UI - portfwd-ftp (non?-wish): Support for tunnelling FTP K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-ftp Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 817 Text-content-md5: de2b2e8fe4f2428953fc8a656d43007e Text-content-sha1: b3c0d3240a1f30cdd9863420d1f0de624f8f5f69 Content-length: 933 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN###Summary: Support for tunnelling FTP Class: wish Priority: low Difficulty: tricky Depends: mdpi Content-type: text/x-html-body

    FTP is inherently difficult to tunnel over SSH, because it uses multiple network connections, so the `obvious' approach of just forwarding port 21 doesn't work.

    To support this, PuTTY would need to grovel inside inside the application-layer protocol and rewrite PORT commands and such, or alternatively, provide an FTP proxy.

    Either of these would be quite a large and fiddly feature, and given that we already support alternative secure file-transfer solutions (scp, sftp), we're unlikely to implement this ourselves. In fact, in order not to bloat the core of PuTTY, we probably wouldn't contemplate it at all unless it could be implemented as a separate DLL. Node-path: putty-wishlist/data/portfwd-open-crash Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1055 Text-content-md5: f9fa4b367cc6405dd59e84665d3b01ae Text-content-sha1: 3b2a94ec82373e0150274b158e74901d31c3d08e Content-length: 1171 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Crashes with heavy open/close activity in port-forwarding Content-type: text/x-html-body Class: bug Present-in: 0.52 2002-06-06

    Apparently, if working in a terminal session at the moment a tunnel is opened, there is a chance of causing a crash (either `Out of memory!', or `Windows has closed PuTTY due to errors').

    This tends to be noticeable when lots of port-forwarded connections are being opened and closed (tunnelling HTTP or POP/SMTP for example).

    All reports so far that have mentioned the protocol version have been against SSH2, with local-to-remote tunnelling. There are suggestions that this is correlated specifically with user input rather than just any terminal activity.

    Individual reports (first is 2002 May 4):

    • 5.1.0.14.2.20020523234715.01b4cbf8@127.0.0.1
    • Pine.LNX.4.44.0205211753330.6418-100000@bbs.intern (contains an SSH packet log)
    • Pine.LNX.4.44.0206071159080.15544-100000@stum.gink.org
    • 000701c1f3cd$b0b87b50$070ca8c0@FITZLT
    Node-path: putty-wishlist/data/portfwd-range Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 266 Text-content-md5: af138923165626b6244a0da27f54eb9f Text-content-sha1: b7132734326af92433648b31ce7aa3a5b168ce52 Content-length: 382 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN|||Summary: Allow port ranges in tunnel UI Priority: low Class: wish Content-type: text/x-html-body

    We've had a couple of requests for the port forwarding UI to allow ranges of ports (e.g., source port 5000-5030, destination 192.168.0.10:5000-5030). Revision-number: 1718 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 60 Optimistic Fixed-in header: Simon checked in a fix for this K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-06-09T22:54:48.000000Z PROPS-END Node-path: putty-wishlist/data/nonexistent-channel Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c7ea1070170a7e04069450ba27db6aea Text-delta-base-sha1: 18dc1f054c1d5d4481a14649f1833ace76525179 Text-content-length: 141 Text-content-md5: 0cebe6c0d48ac7666eef4d8f901214c2 Text-content-sha1: af879fe535541949e4eadff055780adfe2779baa Content-length: 180 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN|u xp odFixed-in: 2002-05-18

    Update: We believe this is fixed as of 2002 May 18 (but haven't received confirmation). Revision-number: 1719 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 add link to ArabEyes K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-06-09T22:59:41.000000Z PROPS-END Node-path: putty-wishlist/data/bidi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 940b778e27b2d4624392c1bdf425af2b Text-delta-base-sha1: 182652f462f315196107577fdf24b02043d33001 Text-content-length: 207 Text-content-md5: 94850cfec959d00a7e00a2f2be5d0e37 Text-content-sha1: 9f0278885076c69c0e36986df08c40d02f688266 Content-length: 246 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNQ <Q<

    ArabEyes currently has a project to add bidi support and Arabic shaping to PuTTY. Revision-number: 1720 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2002-06-10T09:51:08.000000Z K 7 svn:log V 28 Added note about workaround K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rsa-verify-failed Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a014b2f8e9e35f990d4d6daa9eb43021 Text-delta-base-sha1: 866bb31860ffae5ab84abe0573e991b6386342b9 Text-content-length: 213 Text-content-md5: 87f1f28360b2b51a0d78c94bfdfa0c70 Text-content-sha1: 50b04b2a9f35a2f9119d780cadda921350ac16b7 Content-length: 252 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN*s >u@t*Fixed-in: 2002-06-01say they'll fix it for OpenSSH 3.3.

    As of 2002 Jun 1, PuTTY will detect OpenSSH versions which have the bug and pad its signatures appropriately for those versions. Revision-number: 1721 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.136506Z PROPS-END Revision-number: 1722 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.146478Z PROPS-END Revision-number: 1723 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.154855Z PROPS-END Revision-number: 1724 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.164388Z PROPS-END Revision-number: 1725 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.172895Z PROPS-END Revision-number: 1726 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.181345Z PROPS-END Revision-number: 1727 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.188994Z PROPS-END Revision-number: 1728 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2002-06-11T20:08:19.000000Z K 7 svn:log V 53 Add a wishlist item for Unicode combining characters K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/unicode-combining Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2173 Text-content-md5: 70da371d9fe7035b403a908c07a29568 Text-content-sha1: 2ffebc94b8202dbd77eec994af6804936c476029 Content-length: 2289 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNoooSummary: Support Unicode combining characters Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    Unicode contains a number of combining characters (typically diacritics) which can in principle be combined with _any_ character appearing before them. For example, you can display CE 9B (U+039B GREEK CAPITAL LETTER LAMBDA) followed by CC 8A (U+030A COMBINING RING ABOVE) and get a lambda with a ring above it, as used in a well-known sci-fi TV series logo.

    PuTTY in UTF-8 mode currently does not support these combining characters at all. It should.

    At a minimum, it should support the use of combining characters to create composite characters that actually exist as their own code points in Unicode. Hence, displaying U+030A when the cursor is just to the right of a capital A should yield U+00C5 (LATIN CAPITAL LETTER A WITH RING ABOVE).

    Ideally - and this is where it gets hard - PuTTY should support an arbitrary sequence of diacritics in any character cell, so that the above logo can be displayed in full and copied and pasted sensibly. So rather than having exactly one Unicode code point per character cell, we would need to make the terminal data structures flexible so that more than one code point could be stored in a single char cell. That sequence of code points would be transmitted to the Windows text display function as a single string, causing the display of the correct composition of glyphs; and anyone copying and pasting that character cell would get the same sequence of code points too. Overwriting that cell would, of course, take out the whole lot in one go.

    Experimentation with xterm in UTF-8 mode suggests that if the resulting character does have a Unicode representation then it should be used in cut-and-paste: hence sending A (U+0041) followed by U+030A should yield a character cell which pastes back as U+00C5. More formally, I think what's required is for the sequence of code points occupying a character cell to be maintained in Normalisation Form C (see UAX #15). Revision-number: 1729 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2002-06-12T09:57:02.000000Z K 7 svn:log V 70 Update status of foreign key support + add references to bug reports. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/key-formats Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2b632d450c1b30ac983ee95b88b1257f Text-delta-base-sha1: 6c735c9fb19565f09e8b14b456ace7f4aac50225 Text-content-length: 471 Text-content-md5: 4fb97d8163433f831d825671c5f31190 Text-content-sha1: 38bef33ad7d3097ad6d4bda98be57b148ec20380 Content-length: 510 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN/rD.D9, PuTTYgen supports import/export of both OpenSSH and ssh.com key formats. We've still got a couple of outstanding problem reports, though:

    • Exporting OpenSSH key (RSA), passphrase appears to be exported incorrectly.
      15605.12548.474812.778142@yakisoba.forte-intl.com
    • 2002-06-05, importing OpenSSH DSA key, crash after entering passphrase (includes offending key and crash dump).
      uit4ooqxe.fsf@MtDiablo.com
    Revision-number: 1730 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2002-06-12T17:06:06.000000Z K 7 svn:log V 32 Another report + priority: high K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-open-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f9fa4b367cc6405dd59e84665d3b01ae Text-delta-base-sha1: 3b2a94ec82373e0150274b158e74901d31c3d08e Text-content-length: 142 Text-content-md5: e998ccb44d9fa5613e76761723bc708a Text-content-sha1: 3c13eec0fbda553243d74af465365a7f5e6c9da3 Content-length: 181 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN w iPriority: highli>Pine.LNX.4.40.0206120938460.10271-100000@squishy.ameth.org (contains full event log) Revision-number: 1731 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.274232Z PROPS-END Revision-number: 1732 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 58 Small memory allocation bug in openssh_encrypted() fixed. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-06-15T15:37:15.000000Z PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7f11a2f016654de8d210841fe7c353b4 Text-delta-base-sha1: fd6e8801ea1547d7d7e3dfb888e0ebbff8577d26 Text-content-length: 41 Text-content-md5: ca3f0a2ae54d8056a9618b2c3db09cf7 Text-content-sha1: a6295403ca58d8ce2db100e7843a1ec1af2c3ce6 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN" ?RMdupstr(filename); Revision-number: 1733 Prop-content-length: 501 Content-length: 501 K 7 svn:log V 400 Padding on the end of the encrypted data in OpenSSH key format was broken: the OpenSSL EVP layer specifies a very particular form of padding, which I wasn't generating because it hadn't occurred to me that it might be mandatory. Irritatingly this was causing our exported OpenSSH keys to load perfectly happily back in through our OpenSSH import routines, but to be rejected by OpenSSH proper. Sigh. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-06-15T16:31:22.000000Z PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ca3f0a2ae54d8056a9618b2c3db09cf7 Text-delta-base-sha1: a6295403ca58d8ce2db100e7843a1ec1af2c3ce6 Text-content-length: 1234 Text-content-md5: c61390a46c5cdeda3cc08cf5e9987b25 Text-content-sha1: 93cb28772562e494a1a08c810c8646a96b83e415 Content-length: 1273 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN"c,vuf'7[GRound up to the cipher block size, ensuring we have at least one * byte of padding (see below). */ outlen = len; if (passphrase) outlen = (outlen+8) &~ 7; /* * Now we know how big outblob needs to be. Allocate it. */ /* * Padding on OpenSSH keys is deterministic. The number of * padding bytes is always more than zero, and always at most * the cipher block length. The value of each padding byte is * equal to the number of padding bytes. So a plaintext that's * an exact multiple of the block size will be padded with 08 * 08 08 08 08 08 08 08 (assuming a 64-bit block cipher); a * plaintext one byte less than a multiple of the block size * will be padded with just 01. * * This enables the OpenSSL key decryption function to strip * off the padding algorithmically and return the unpadded * plaintext to the next layer: it looks at the final byte, and * then expects to find that many bytes at the end of the data * with the same value. Those are all removed and the rest is * returned. */ assert(pos == len); while (pos < outlen) { outblob[pos++] = outlen - len Revision-number: 1734 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2002-06-15T16:33:34.000000Z K 7 svn:log V 52 I believe the fiddly key format bugs are now fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/key-formats Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4fb97d8163433f831d825671c5f31190 Text-delta-base-sha1: 38bef33ad7d3097ad6d4bda98be57b148ec20380 Text-content-length: 141 Text-content-md5: a4a3fbeff13ce495cc604c13ad32684e Text-content-sha1: db41d33286e6d434ec54ae6401b3da8838f43caa Content-length: 180 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNrn|r|

    SGT, 2002-06-15: both those problems believed identified and fixed. Fixes not yet confirmed by original bug reporters. Revision-number: 1735 Prop-content-length: 634 Content-length: 634 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-06-15T16:52:35.000000Z K 7 svn:log V 533 One of the recent port forwarding crash reports contained details which suggested bufchain_prefix() was finding an improperly initialised bufchain structure. Looking at the code, this may indeed have been able to happen, since the bufchain in a SOCKDATA_DORMANT channel was not initialised until CHANNEL_OPEN_CONFIRMATION was received. This seems utterly daft, so I now call bufchain_init() when the channel structure is actually created. With any luck the crash will mystically disappear now (I wasn't able to reproduce it myself). PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e9e8a3d04b0f76fcd2ce7b5d6a2fe4cf Text-delta-base-sha1: 38700e222105e94f19cfd6047155678a10b95426 Text-content-length: 80 Text-content-md5: c28e8a23151751788c6f3623924849a2 Text-content-sha1: a0e59f0caebf4775786ca888377e69555285effa Content-length: 121 K 15 cvs2svn:cvs-rev V 5 1.207 PROPS-END SVNqp!%<5bufchain_init(&c->v.v2.outbuffer) Revision-number: 1736 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.521447Z PROPS-END Revision-number: 1737 Prop-content-length: 229 Content-length: 229 K 7 svn:log V 128 Failure to initialise a local variable was leading to free(garbage) on loading an OpenSSH key and getting the wrong passphrase. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-06-17T16:45:41.000000Z PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c61390a46c5cdeda3cc08cf5e9987b25 Text-delta-base-sha1: 93cb28772562e494a1a08c810c8646a96b83e415 Text-content-length: 35 Text-content-md5: 8be7d45a9691655779107f0b17db64ce Text-content-sha1: eef781f4ae4adebdba45bc681770ecd5c36b5e3b Content-length: 74 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNcu pziblob = NULL Revision-number: 1738 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2002-06-21T13:07:19.000000Z K 7 svn:log V 89 Add a wish for bold-as-font and bold-as-colour to be able to be selected in conjunction. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/bold-font-colour Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 855 Text-content-md5: d4a6dc6497a8bf6ad265f481c8f33c60 Text-content-sha1: 9eae1375cf5d420ef850c65d66d6f9948595c340 Content-length: 971 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNIIISummary: Ability to change font *and* change colour for bold text Class: wish Priority: medium Difficulty: fun Content-type: text/plain PuTTY allows bold text to be displayed by either emboldening the font, or by changing the colour of the text. xterm allows these two options to be configured independently, so you can have both at once if you want it. Some users have highly xterm-specific application configurations which depend on this to look sensible. It would be trivially easy to replace PuTTY's single checkbox with a pair of checkboxes, allowing bold-as-colour and bold-as-font to be selected in any combination. If we do that then we should probably warn the user if they disable both at once, though it's not clear what form that warning should take (a message box is probably overkill for what's basically a cosmetic issue). Revision-number: 1739 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.816253Z PROPS-END Revision-number: 1740 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.825215Z PROPS-END Revision-number: 1741 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.832308Z PROPS-END Revision-number: 1742 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.842261Z PROPS-END Revision-number: 1743 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.850443Z PROPS-END Revision-number: 1744 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.857440Z PROPS-END Revision-number: 1745 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.864745Z PROPS-END Revision-number: 1746 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.872707Z PROPS-END Revision-number: 1747 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:31.882207Z PROPS-END Revision-number: 1748 Prop-content-length: 157 Content-length: 157 K 7 svn:log V 57 Forgot to call fxp_init() in `pscp -ls' mode under SFTP. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-06-25T18:51:06.000000Z PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7ff84f943ddadcacd1025ed8b3cf78e4 Text-delta-base-sha1: 63a153e589b9741220f5438a36e129f51a06d25c Text-content-length: 135 Text-content-md5: bdecb4b64aadf29251f9d286e9d582fe Text-content-sha1: 3f362dcadd1d85a9c56f94b8ae136f665a3e860f Content-length: 175 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVNJ<l%l+if (!fxp_init()) { tell_user(stderr, "unable to initialise SFTP: %s", fxp_error()); errs++; return; } Revision-number: 1749 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.215380Z PROPS-END Revision-number: 1750 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.248125Z PROPS-END Revision-number: 1751 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.259069Z PROPS-END Revision-number: 1752 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.269340Z PROPS-END Revision-number: 1753 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.277362Z PROPS-END Revision-number: 1754 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.284541Z PROPS-END Revision-number: 1755 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.291337Z PROPS-END Revision-number: 1756 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.299066Z PROPS-END Revision-number: 1757 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.306333Z PROPS-END Revision-number: 1758 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.313419Z PROPS-END Revision-number: 1759 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.354294Z PROPS-END Revision-number: 1760 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.373742Z PROPS-END Revision-number: 1761 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.380777Z PROPS-END Revision-number: 1762 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.388564Z PROPS-END Revision-number: 1763 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.395951Z PROPS-END Revision-number: 1764 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.403666Z PROPS-END Revision-number: 1765 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.412052Z PROPS-END Revision-number: 1766 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.419053Z PROPS-END Revision-number: 1767 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.426241Z PROPS-END Revision-number: 1768 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.433763Z PROPS-END Revision-number: 1769 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.440608Z PROPS-END Revision-number: 1770 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.448049Z PROPS-END Revision-number: 1771 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.456033Z PROPS-END Revision-number: 1772 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.463673Z PROPS-END Revision-number: 1773 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.471538Z PROPS-END Revision-number: 1774 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.479538Z PROPS-END Revision-number: 1775 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.488504Z PROPS-END Revision-number: 1776 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.496244Z PROPS-END Revision-number: 1777 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2002-07-09T10:27:45.000000Z K 7 svn:log V 73 Added a note about the annoyance with XP shortcuts and PuTTY's @ syntax. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-shortcut Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 768 Text-content-md5: 2b2ab39398d798f7e98e748154fa0472 Text-content-sha1: df94a5845422c93c019467757002d07dcd13411d Content-length: 884 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNrrrSummary: Trouble creating PuTTY shortcuts in WinXP Class: wish Priority: low Content-type: text/x-html-body

    Many people have reported that bad things happen to @ signs in shortcut (.LNK) files under Windows XP. No-one has been able to find a way of quoting them yet. This makes use of shortcuts with PuTTY problematic.

    This obviously isn't a bug in PuTTY per se, but it might be nice if we could characterise the problem, and publish a workaround in the FAQ (possibly by extending PuTTY's command-line syntax).

    Examples of reports received so far:

    • NDBBKAOEAFAMLKEAFJIOOEHNGDAA.guy@SiliconStrat.com
    • 5.1.0.14.0.20020615214407.023a33a0@amusive.com
    • 000501c2263d$190195b0$0200a8c0@quadzone.net
    Revision-number: 1778 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2002-07-09T10:40:02.000000Z K 7 svn:log V 38 Still not entirely fixed, apparently. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/nonexistent-channel Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0cebe6c0d48ac7666eef4d8f901214c2 Text-delta-base-sha1: af879fe535541949e4eadff055780adfe2779baa Text-content-length: 223 Text-content-md5: 49bc28ca6a7ad2b4f2732d25e38b71e2 Text-content-sha1: 9901ca1d9235123ac2e222bfb047250422fc43a5 Content-length: 262 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNua Go+< 2002-07-04d this fixed as of 2002 May 18, but we've received one report that the 'ieof' variant is still out there (in 2002-07-04).
    OAEBLEDJOCNMIAODAMHBOEHIFDAA.ewang@collectivebid.com Revision-number: 1779 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2002-07-09T10:44:28.000000Z K 7 svn:log V 46 ...but we've also had some positive feedback. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/nonexistent-channel Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 49bc28ca6a7ad2b4f2732d25e38b71e2 Text-delta-base-sha1: 9901ca1d9235123ac2e222bfb047250422fc43a5 Text-content-length: 184 Text-content-md5: ee3a21b20376dd8ce5b198c62ed85717 Text-content-sha1: ad0cd2d1996b2eb2767c4ed426deea1b5119008b Content-length: 223 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNa3 !C!O (and have had one person report that our fix made their problem go away), but we've received one report that the `ieof' variant at least is still out there (in Revision-number: 1780 Prop-content-length: 148 Content-length: 148 K 7 svn:log V 48 Increase space allocated to auto-login username K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-07-09T11:17:38.000000Z PROPS-END Node-path: putty-wishlist/data/long-usernames Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 375 Text-content-md5: 0dc28331bca76bc0f796b1255bc38795 Text-content-sha1: 6e097f99c8516c6072ee7ed52ba7b8ef8ffc8f54 Content-length: 491 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNiiiSummary: Increase space allocated to auto-login username Class: semi-bug Difficulty: fun Content-type: text/x-html-body

    Trivial fix: PuTTY truncates the `auto-login username' field to about 32 characters. Some sites have taken to allocating usernames of the form username@verrylongdomainname.org, so we've received some requests to increase this. Revision-number: 1781 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2002-07-09T11:34:10.000000Z K 7 svn:log V 85 OpenSSH/OpenSSL versioning problems: as of 3.4p1 this is _still_ not entirely fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7ddbc1b63235d5d056cc9d6627305a9a Text-delta-base-sha1: b39365f08dac789a9138fe57bc6613c29a616775 Text-content-length: 237 Text-content-md5: 88f936257148d0d2b20089ebb3732c33 Text-content-sha1: 4ecc079dfddd5814bde3bda5287951115b505fd0 Content-length: 277 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNtPx2N&\versionid $Id: faq.but,v 1.30 2002/07/09 11:34:10e{Update:} As of OpenSSH 3.4p1 the problem with SSH 1 and Blowfish remains. Apply the patch linked to from bug 138, or use another cipher (e.g., 3DES) instead Revision-number: 1782 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.704950Z PROPS-END Revision-number: 1783 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.712117Z PROPS-END Revision-number: 1784 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.720613Z PROPS-END Revision-number: 1785 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2002-07-16T12:01:25.000000Z K 7 svn:log V 34 People want a URL scheme for SSH. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 727 Text-content-md5: ef0031c3f9379ec221a4430cb12138f7 Text-content-sha1: 874b1901e57376040971299556f447af17956a59 Content-length: 843 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNIIISummary: Support for an "ssh" URL scheme Class: wish Priority: low Difficulty: taxing Content-type: text/x-html-body

    Some people would like PuTTY to be able to accept "ssh" (and "raw") URLs on the command-line, in the same way as it accepts "telnet" ones.

    At present, though, there is no URL scheme for SSH registered with IANA, and the PuTTY developers don't have the time to go through the regsistration procedure for a new one. If someone specifies and registers such a URL scheme, support for it will almost certainly be added to PuTTY. Revision-number: 1786 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 29 Priority should be "medium". K 10 svn:author V 3 ben K 8 svn:date V 27 2002-07-16T12:05:26.000000Z PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ef0031c3f9379ec221a4430cb12138f7 Text-delta-base-sha1: 874b1901e57376040971299556f447af17956a59 Text-content-length: 86 Text-content-md5: 32492b9eff5a231760b8a14e707f0dc6 Text-content-sha1: edc176d4ed736e036449fab6c6f7f5ece1d15aea Content-length: 125 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNILEEBSummary: Support for an "ssh" URL scheme Class: wish Priority: medium Revision-number: 1787 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 34 Add $baseurl to stylesheet hrefs. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-07-18T13:18:12.000000Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d91db1c20bdb6611b0eea7bd169695be Text-delta-base-sha1: fb00c6d36b44aa503ed46ca28fcffe7b5f085890 Text-content-length: 109 Text-content-md5: 5700de5118acd4421e1d972677d0f27d Text-content-sha1: 303644b7604697ec2d8d145566e0aea9fba110b9 Content-length: 148 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNCSQNA0#! /usr/bin/perl # $Id: bugs2html,v 1.7 2002/07/18 13:18:12 ben$baseurl/$baseurl/ Revision-number: 1788 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:32.968041Z PROPS-END Revision-number: 1789 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:33.002034Z PROPS-END Revision-number: 1790 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:33.009281Z PROPS-END Revision-number: 1791 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:33.019028Z PROPS-END Revision-number: 1792 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:33.027708Z PROPS-END Revision-number: 1793 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:33.036581Z PROPS-END Revision-number: 1794 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:33.044236Z PROPS-END Revision-number: 1795 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:33.052296Z PROPS-END Revision-number: 1796 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2002-08-03T15:22:57.000000Z K 7 svn:log V 68 Summary: SSH-2 keyboard-interactive crashes with FreeBSD 4.6-STABLE K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/freebsd-4.6-ki-crash Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1059 Text-content-md5: 668c6d6ebe7df91da7653ded68c05b92 Text-content-sha1: 23492130f58e5d6baad1db516277b1be032884a7 Content-length: 1175 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: SSH-2 keyboard-interactive crashes with FreeBSD 4.6-STABLE Class: bug Content-type: text/x-html-body Present-in: 0.52 2002-07-31 2002-08-01 Absent-in: 0.51

    Various people have reported PuTTY crashing when connecting to recent FreeBSD OpenSSH servers. Most commonly after upgrading to FreeBSD 4.6-STABLE (server version "OpenSSH_3.4p1 FreeBSD-20020702"), although there are minor variations. Use of keyboard-interactive authentication (e.g., PAM, OPIE) with SSH-2 appears to be a common factor.

    A workaround is to disable use of keyboard-interactive auth (either in PuTTY, or on the server with "ChallengeResponseAuthentication no").

    Reports:

    • CGEKLJJONFGKJGAKLKPFMEHDCEAA.wak@xtweb.de
      Includes SSH packet log.
    • 5.1.1.6.2.20020731075139.022604e8@194.184.65.7 et seq
    • 3D489E95.4090506@alaska.net
    • 3D497FA8.7010802@cerint.pl
      Crash on connecting and entering valid OPIE one-time password.
      Includes Dr Watson log, server debug log, registry
    Revision-number: 1797 Prop-content-length: 609 Content-length: 609 K 8 svn:date V 27 2002-08-03T16:22:55.000000Z K 7 svn:log V 508 Fix culpable lack of generality in keyboard-interactive authentication: a k-i request packet can contain any number of auth prompts (including zero!) and we must ask the user all of them and send back a packet containing the same number of responses. FreeBSD systems were sending a zero-prompts packet which was crashing us; this now appears fixed (we correctly return a zero-responses packet) but I haven't tested a multiple-prompts packet because I can't immediately think of a server that generates them. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c28e8a23151751788c6f3623924849a2 Text-delta-base-sha1: a0e59f0caebf4775786ca888377e69555285effa Text-content-length: 2098 Text-content-md5: c7be795fedea53adbf75baef21b46468 Text-content-sha1: 7406d73ecf8d43a667e463318dcba3d65e09e9bc Content-length: 2139 K 15 cvs2svn:cvs-rev V 5 1.208 PROPS-END SVN *K$*length = 0p*7J:#8Q*=xqw !B. 0; i < lenof(hoscurr_prompteither a further set-of-prompts packet * in keyboard-interactive authentication, or it's * the same one and we came back here with `gotit' * set. In the former case, we must reset the * curr_prompt variable. */ if (!gotit) curr_prompt = 0; curr_prompt = 0if (curr_prompt == 0) { /* * We've got a fresh USERAUTH_INFO_REQUEST. * Display header data, and start going through * the prompts. */ char *name, *inst, *lang; int name_len, inst_len, lang_len; { c_write_untrusted(name, name_len); c_write_str("\n"); } if (inst_len > 0) { c_write_untrusted(inst, inst_len); c_write_str("\n"); } num_prompts = ssh2_pkt_getuint32(); } /* * If there are prompts remaining in the packet, * display one and get a response. */ if (curr_prompt < num_prompts) { char *prompt; int prompt_len; ssh2_pkt_getstring(&prompt, &prompt_len); if (prompt_len > 0) { strncpy(pwprompt, prompt, sizeof(pwprompt)); pwprompt[prompt_len < sizeof(pwprompt) ? prompt_len : sizeof(pwprompt)-1] = '\0'; } else { strcpy(pwprompt, ": "); } echo = ssh2_pkt_getbool(); need_pw = TRUE; } else need_pw = FALSE; if (curr_prompt == 0) { ssh2_pkt_init(SSH2_MSG_USERAUTH_INFO_RESPONSE); ssh2_pkt_adduint32(num_prompts); } if (need_pw) { /* only add pw if we just got one! */ ssh2_pkt_addstring(password); memset(password, 0, sizeof(password)); curr_prompt++; } if (curr_prompt >= num_prompts) { ssh2_pkt_send(); } else { /* * If there are prompts remaining, we set * `gotit' so that we won't attempt to get * another packet. Then we go back round the * loop and will end up retrieving another * prompt out of the existing packet. Funky or * what? */ gotit = TRUE; } Revision-number: 1798 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2002-08-03T19:11:54.000000Z K 7 svn:log V 21 Cor, that was quick. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/freebsd-4.6-ki-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 668c6d6ebe7df91da7653ded68c05b92 Text-delta-base-sha1: 23492130f58e5d6baad1db516277b1be032884a7 Text-content-length: 102 Text-content-md5: e397596999c2406ec7557751d2b9a095 Text-content-sha1: 720aa02d735adbf9a90c3b3787a814831c9e05c6 Content-length: 141 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNjUU

    Update: we believe that this will be fixed in the 2002-08-04 snapshot. Revision-number: 1799 Prop-content-length: 495 Content-length: 495 K 8 svn:date V 27 2002-08-04T21:18:56.000000Z K 7 svn:log V 394 Revamp of command-line handling. Most command line options should now be processed in cmdline.c, which is called from all utilities (well, not Pageant or PuTTYgen). This should mean we get to standardise almost all options across almost all tools. Also one major change: `-load' is now the preferred option for loading a saved session in PuTTY proper. `@session' still works but is deprecated. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f2d5c6eb4cfcb0386b8229d124081bd8 Text-delta-base-sha1: 655b35eafaf0063f1883e492ae15ab7cb7b7d081 Text-content-length: 44 Text-content-md5: a9841c983be7aa7c356c8057a6d67c52 Text-content-sha1: f381885ff96ce5e833e5383309f34781a758f7ea Content-length: 83 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN'8//fA winutils cmdline Node-path: putty/cmdline.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 6916 Text-content-md5: 81eb1f1ef1d99abea0468130d06fecd0 Text-content-sha1: 75de9e7cfeb7ec99ab3595dcc4f9aca3f55fe255 Content-length: 7032 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNvvv#include #include #include #include #include "putty.h" /* * Some command-line parameters need to be saved up until after * we've loaded the saved session which will form the basis of our * eventual running configuration. For this we use the macro * SAVEABLE, which notices if the `need_save' parameter is set and * saves the parameter and value on a list. * * We also assign priorities to saved parameters, just to slightly * ameliorate silly ordering problems. For example, if you specify * a saved session to load, it will be loaded _before_ all your * local modifications such as -L are evaluated; and if you specify * a protocol and a port, the protocol is set up first so that the * port can override its choice of port number. */ #define NPRIORITIES 3 struct cmdline_saved_param { char *p, *value; }; struct cmdline_saved_param_set { struct cmdline_saved_param *params; int nsaved, savesize; }; /* * C guarantees this structure will be initialised to all zero at * program start, which is exactly what we want. */ static struct cmdline_saved_param_set saves[NPRIORITIES]; static void cmdline_save_param(char *p, char *value, int pri) { if (saves[pri].nsaved >= saves[pri].savesize) { saves[pri].savesize = saves[pri].nsaved + 32; saves[pri].params = srealloc(saves[pri].params, saves[pri].savesize*sizeof(*saves[pri].params)); } saves[pri].params[saves[pri].nsaved].p = p; saves[pri].params[saves[pri].nsaved].value = value; saves[pri].nsaved++; } #define SAVEABLE(pri) do { \ if (need_save) { cmdline_save_param(p, value, pri); return ret; } \ } while (0) char *cmdline_password = NULL; static int cmdline_get_line(const char *prompt, char *str, int maxlen, int is_pw) { static int tried_once = 0; assert(is_pw && cmdline_password); if (tried_once) { return 0; } else { strncpy(str, cmdline_password, maxlen); str[maxlen - 1] = '\0'; tried_once = 1; return 1; } } /* * Here we have a flags word which describes the capabilities of * the particular tool on whose behalf we're running. We will * refuse certain command-line options if a particular tool * inherently can't do anything sensible. For example, the file * transfer tools (psftp, pscp) can't do a great deal with protocol * selections (ever tried running scp over telnet?) or with port * forwarding (even if it wasn't a hideously bad idea, they don't * have the select() infrastructure to make them work). */ int cmdline_tooltype = 0; static int cmdline_check_unavailable(int flag, char *p) { if (cmdline_tooltype & flag) { cmdline_error("option \"%s\" not available in this tool", p); return 1; } return 0; } #define UNAVAILABLE_IN(flag) do { \ if (cmdline_check_unavailable(flag, p)) return ret; \ } while (0) /* * Process a standard command-line parameter. `p' is the parameter * in question; `value' is the subsequent element of argv, which * may or may not be required as an operand to the parameter. * Return value is 2 if both arguments were used; 1 if only p was * used; 0 if the parameter wasn't one we recognised; -2 if it * should have been 2 but value was NULL. */ #define RETURN(x) do { \ if ((x) == 2 && !value) return -2; \ ret = x; \ } while (0) int cmdline_process_param(char *p, char *value, int need_save) { int ret = 0; if (!strcmp(p, "-load")) { RETURN(2); SAVEABLE(0); /* very high priority */ do_defaults(value, &cfg); return 2; } if (!strcmp(p, "-ssh")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); default_protocol = cfg.protocol = PROT_SSH; default_port = cfg.port = 22; return 1; } if (!strcmp(p, "-telnet")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); default_protocol = cfg.protocol = PROT_TELNET; default_port = cfg.port = 23; return 1; } if (!strcmp(p, "-rlogin")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); default_protocol = cfg.protocol = PROT_RLOGIN; default_port = cfg.port = 513; return 1; } if (!strcmp(p, "-raw")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); default_protocol = cfg.protocol = PROT_RAW; } if (!strcmp(p, "-v")) { RETURN(1); flags |= FLAG_VERBOSE; } if (!strcmp(p, "-l")) { RETURN(2); SAVEABLE(1); strncpy(cfg.username, value, sizeof(cfg.username)); cfg.username[sizeof(cfg.username) - 1] = '\0'; } if ((!strcmp(p, "-L") || !strcmp(p, "-R"))) { char *fwd, *ptr, *q; int i=0; RETURN(2); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); fwd = value; ptr = cfg.portfwd; /* if multiple forwards, find end of list */ if (ptr[0]=='R' || ptr[0]=='L') { for (i = 0; i < sizeof(cfg.portfwd) - 2; i++) if (ptr[i]=='\000' && ptr[i+1]=='\000') break; ptr = ptr + i + 1; /* point to next forward slot */ } ptr[0] = p[1]; /* insert a 'L' or 'R' at the start */ if (strlen(fwd) > sizeof(cfg.portfwd) - i - 2) { cmdline_error("out of space for port forwardings"); return ret; } strncpy(ptr+1, fwd, sizeof(cfg.portfwd) - i); q = strchr(ptr, ':'); if (q) *q = '\t'; /* replace first : with \t */ cfg.portfwd[sizeof(cfg.portfwd) - 1] = '\0'; cfg.portfwd[sizeof(cfg.portfwd) - 2] = '\0'; ptr[strlen(ptr)+1] = '\000'; /* append two '\000' */ } if (!strcmp(p, "-m")) { char *filename, *command; int cmdlen, cmdsize; FILE *fp; int c, d; RETURN(2); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); filename = value; cmdlen = cmdsize = 0; command = NULL; fp = fopen(filename, "r"); if (!fp) { cmdline_error("unable to open command " "file \"%s\"", filename); return ret; } do { c = fgetc(fp); d = c; if (c == EOF) d = 0; if (cmdlen >= cmdsize) { cmdsize = cmdlen + 512; command = srealloc(command, cmdsize); } command[cmdlen++] = d; } while (c != EOF); cfg.remote_cmd_ptr = command; cfg.remote_cmd_ptr2 = NULL; cfg.nopty = TRUE; /* command => no terminal */ } if (!strcmp(p, "-P")) { RETURN(2); SAVEABLE(2); /* lower priority than -ssh,-telnet */ cfg.port = atoi(value); } if (!strcmp(p, "-pw")) { RETURN(2); cmdline_password = value; ssh_get_line = cmdline_get_line; ssh_getline_pw_only = TRUE; } return ret; /* unrecognised */ } void cmdline_run_saved(void) { int pri, i; for (pri = 0; pri < NPRIORITIES; pri++) for (i = 0; i < saves[pri].nsaved; i++) cmdline_process_param(saves[pri].params[i].p, saves[pri].params[i].value, 0); } Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eaa006f1004cce1684764be162bf06e4 Text-delta-base-sha1: 0041024d5916155b5bb43f25f89641e30f5e04a5 Text-content-length: 25 Text-content-md5: 243511423e1181ecf97a5fcc0daa09b5 Text-content-sha1: e5ecbba74bba8171e448abdb5a9e8a987b50736c Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNrl!A8: Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 83683440494b40c374f97f2d2d151af0 Text-delta-base-sha1: 15489cd985080e89adfd73f989de620e35ff864f Text-content-length: 594 Text-content-md5: 5dcce958af600cdb6ae67a4ef8e101c2 Text-content-sha1: 66e2b8ccb8fe01d6a1e252ab62a94ca44fff03bb Content-length: 634 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVNAD(0Me&n%}@vYg *void cmdline_error(char *p, ...) { va_list ap; fprintf(stderr, "plinknt ret = cmdline_process_param(p, (argc > 1 ? argv[1] : NULL), 1); if (ret == -2) { fprintf(stderr, "plink: option \"%s\" requires an argument\n", p); } else if (ret == 2) { --argc, ++argv; } else if (ret == 1) { continue; } else if (!strcmp(p, "-batch")) { console_batch_mode = 1; } else if (!strcmp(p, "-log")) { logfile = "putty.log"Perform command-line overrides on session configuration. */ cmdline_run_saved(); Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fe6f2af31456f15c660f2e802f0df7f7 Text-delta-base-sha1: 708bb0b6a56f11f60b7336426b71bb6b6d1c974b Text-content-length: 904 Text-content-md5: 23f6ddefe71a03c2bc74e59f88476b0c Text-content-sha1: 8675219b00b0b5a597f14db1d514f48e97ea8dc8 Content-length: 944 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNyD2Htd8 _ bLQV#Enact command-line overrides. */ cmdline_run_saved();void cmdline_error(char *p, ...) { va_list ap; fprintf(stderr, "pscp: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1)cmdline_tooltype = TOOLTYPE_FILETRANSFERnt ret; if (argv[i][0] != '-') { if (userhost) usage(); else userhost = dupstr(argv[i]); continue; } ret = cmdline_process_param(argv[i], i+1 #include #define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) #ifdef TESTMODE /* Definitions to allow this module to be compiled standalone for testing. */ #define smalloc malloc #endif /* * Split a complete command line into argc/argv, attempting to do * it exactly the same way Windows itself would do it (so that * console utilities, which receive argc and argv from Windows, * will have their command lines processed in the same way as GUI * utilities which get a whole command line and must break it * themselves). * * Does not modify the input command line (just in case). */ void split_into_argv(const char *cmdline, int *argc, char ***argv) { const char *p; char *outputline, *q; char **outputargv; int outputargc; /* * At first glance the rules appeared to be: * * - Single quotes are not special characters. * * - Double quotes are removed, but within them spaces cease * to be special. * * - Backslashes are _only_ special when a sequence of them * appear just before a double quote. In this situation, * they are treated like C backslashes: so \" just gives a * literal quote, \\" gives a literal backslash and then * opens or closes a double-quoted segment, \\\" gives a * literal backslash and then a literal quote, \\\\" gives * two literal backslashes and then opens/closes a * double-quoted segment, and so forth. Note that this * behaviour is identical inside and outside double quotes. * * - Two successive double quotes become one literal double * quote, but only _inside_ a double-quoted segment. * Outside, they just form an empty double-quoted segment * (which may cause an empty argument word). * * - That only leaves the interesting question of what happens * when one or more backslashes precedes two or more double * quotes, starting inside a double-quoted string. And the * answer to that appears somewhat bizarre. Here I tabulate * number of backslashes (across the top) against number of * quotes (down the left), and indicate how many backslashes * are output, how many quotes are output, and whether a * quoted segment is open at the end of the sequence: * * backslashes * * 0 1 2 3 4 * * 0 0,0,y | 1,0,y 2,0,y 3,0,y 4,0,y * --------+----------------------------- * 1 0,0,n | 0,1,y 1,0,n 1,1,y 2,0,n * q 2 0,1,n | 0,1,n 1,1,n 1,1,n 2,1,n * u 3 0,1,y | 0,2,n 1,1,y 1,2,n 2,1,y * o 4 0,1,n | 0,2,y 1,1,n 1,2,y 2,1,n * t 5 0,2,n | 0,2,n 1,2,n 1,2,n 2,2,n * e 6 0,2,y | 0,3,n 1,2,y 1,3,n 2,2,y * s 7 0,2,n | 0,3,y 1,2,n 1,3,y 2,2,n * 8 0,3,n | 0,3,n 1,3,n 1,3,n 2,3,n * 9 0,3,y | 0,4,n 1,3,y 1,4,n 2,3,y * 10 0,3,n | 0,4,y 1,3,n 1,4,y 2,3,n * 11 0,4,n | 0,4,n 1,4,n 1,4,n 2,4,n * * * [Test fragment was of the form "a\\\"""b c" d.] * * There is very weird mod-3 behaviour going on here in the * number of quotes, and it even applies when there aren't any * backslashes! How ghastly. * * With a bit of thought, this extremely odd diagram suddenly * coalesced itself into a coherent, if still ghastly, model of * how things work: * * - As before, backslashes are only special when one or more * of them appear contiguously before at least one double * quote. In this situation the backslashes do exactly what * you'd expect: each one quotes the next thing in front of * it, so you end up with n/2 literal backslashes (if n is * even) or (n-1)/2 literal backslashes and a literal quote * (if n is odd). In the latter case the double quote * character right after the backslashes is used up. * * - After that, any remaining double quotes are processed. A * string of contiguous unescaped double quotes has a mod-3 * behaviour: * * * inside a quoted segment, a quote ends the segment. * * _immediately_ after ending a quoted segment, a quote * simply produces a literal quote. * * otherwise, outside a quoted segment, a quote begins a * quoted segment. * * So, for example, if we started inside a quoted segment * then two contiguous quotes would close the segment and * produce a literal quote; three would close the segment, * produce a literal quote, and open a new segment. If we * started outside a quoted segment, then two contiguous * quotes would open and then close a segment, producing no * output (but potentially creating a zero-length argument); * but three quotes would open and close a segment and then * produce a literal quote. */ /* * This will guaranteeably be big enough; we can realloc it * down later. */ outputline = malloc(1+strlen(cmdline)); outputargv = malloc(sizeof(char *) * (strlen(cmdline)+1 / 2)); p = cmdline; q = outputline; outputargc = 0; while (*p) { int quote; /* Skip whitespace searching for start of argument. */ while (*p && isspace(*p)) p++; if (!*p) break; /* We have an argument; start it. */ outputargv[outputargc++] = q; quote = 0; /* Copy data into the argument until it's finished. */ while (*p) { if (!quote && isspace(*p)) break; /* argument is finished */ if (*p == '"' || *p == '\\') { /* * We have a sequence of zero or more backslashes * followed by a sequence of zero or more quotes. * Count up how many of each, and then deal with * them as appropriate. */ int i, slashes = 0, quotes = 0; while (*p == '\\') slashes++, p++; while (*p == '"') quotes++, p++; if (!quotes) { /* * Special case: if there are no quotes, * slashes are not special at all, so just copy * n slashes to the output string. */ while (slashes--) *q++ = '\\'; } else { /* Slashes annihilate in pairs. */ while (slashes >= 2) slashes -= 2, *q++ = '\\'; /* One remaining slash takes out the first quote. */ if (slashes) quotes--, *q++ = '"'; if (quotes > 0) { /* Outside a quote segment, a quote starts one. */ if (!quote) quotes--, quote = 1; /* Now we produce (n+1)/3 literal quotes... */ for (i = 3; i <= quotes+1; i += 3) *q++ = '"'; /* ... and end in a quote segment iff 3 divides n. */ quote = (quotes % 3 == 0); } } } else { *q++ = *p++; } } /* At the end of an argument, just append a trailing NUL. */ *q++ = '\0'; } outputargv = realloc(outputargv, sizeof(char *) * outputargc); if (argc) *argc = outputargc; if (argv) *argv = outputargv; } #ifdef TESTMODE const struct argv_test { const char *cmdline; const char *argv[10]; } argv_tests[] = { /* * We generate this set of tests by invoking ourself with * `-generate'. */ {"ab c\" d", {"ab", "c d", NULL}}, {"a\"b c\" d", {"ab c", "d", NULL}}, {"a\"\"b c\" d", {"ab", "c d", NULL}}, {"a\"\"\"b c\" d", {"a\"b", "c d", NULL}}, {"a\"\"\"\"b c\" d", {"a\"b c", "d", NULL}}, {"a\"\"\"\"\"b c\" d", {"a\"b", "c d", NULL}}, {"a\"\"\"\"\"\"b c\" d", {"a\"\"b", "c d", NULL}}, {"a\"\"\"\"\"\"\"b c\" d", {"a\"\"b c", "d", NULL}}, {"a\"\"\"\"\"\"\"\"b c\" d", {"a\"\"b", "c d", NULL}}, {"a\\b c\" d", {"a\\b", "c d", NULL}}, {"a\\\"b c\" d", {"a\"b", "c d", NULL}}, {"a\\\"\"b c\" d", {"a\"b c", "d", NULL}}, {"a\\\"\"\"b c\" d", {"a\"b", "c d", NULL}}, {"a\\\"\"\"\"b c\" d", {"a\"\"b", "c d", NULL}}, {"a\\\"\"\"\"\"b c\" d", {"a\"\"b c", "d", NULL}}, {"a\\\"\"\"\"\"\"b c\" d", {"a\"\"b", "c d", NULL}}, {"a\\\"\"\"\"\"\"\"b c\" d", {"a\"\"\"b", "c d", NULL}}, {"a\\\"\"\"\"\"\"\"\"b c\" d", {"a\"\"\"b c", "d", NULL}}, {"a\\\\b c\" d", {"a\\\\b", "c d", NULL}}, {"a\\\\\"b c\" d", {"a\\b c", "d", NULL}}, {"a\\\\\"\"b c\" d", {"a\\b", "c d", NULL}}, {"a\\\\\"\"\"b c\" d", {"a\\\"b", "c d", NULL}}, {"a\\\\\"\"\"\"b c\" d", {"a\\\"b c", "d", NULL}}, {"a\\\\\"\"\"\"\"b c\" d", {"a\\\"b", "c d", NULL}}, {"a\\\\\"\"\"\"\"\"b c\" d", {"a\\\"\"b", "c d", NULL}}, {"a\\\\\"\"\"\"\"\"\"b c\" d", {"a\\\"\"b c", "d", NULL}}, {"a\\\\\"\"\"\"\"\"\"\"b c\" d", {"a\\\"\"b", "c d", NULL}}, {"a\\\\\\b c\" d", {"a\\\\\\b", "c d", NULL}}, {"a\\\\\\\"b c\" d", {"a\\\"b", "c d", NULL}}, {"a\\\\\\\"\"b c\" d", {"a\\\"b c", "d", NULL}}, {"a\\\\\\\"\"\"b c\" d", {"a\\\"b", "c d", NULL}}, {"a\\\\\\\"\"\"\"b c\" d", {"a\\\"\"b", "c d", NULL}}, {"a\\\\\\\"\"\"\"\"b c\" d", {"a\\\"\"b c", "d", NULL}}, {"a\\\\\\\"\"\"\"\"\"b c\" d", {"a\\\"\"b", "c d", NULL}}, {"a\\\\\\\"\"\"\"\"\"\"b c\" d", {"a\\\"\"\"b", "c d", NULL}}, {"a\\\\\\\"\"\"\"\"\"\"\"b c\" d", {"a\\\"\"\"b c", "d", NULL}}, {"a\\\\\\\\b c\" d", {"a\\\\\\\\b", "c d", NULL}}, {"a\\\\\\\\\"b c\" d", {"a\\\\b c", "d", NULL}}, {"a\\\\\\\\\"\"b c\" d", {"a\\\\b", "c d", NULL}}, {"a\\\\\\\\\"\"\"b c\" d", {"a\\\\\"b", "c d", NULL}}, {"a\\\\\\\\\"\"\"\"b c\" d", {"a\\\\\"b c", "d", NULL}}, {"a\\\\\\\\\"\"\"\"\"b c\" d", {"a\\\\\"b", "c d", NULL}}, {"a\\\\\\\\\"\"\"\"\"\"b c\" d", {"a\\\\\"\"b", "c d", NULL}}, {"a\\\\\\\\\"\"\"\"\"\"\"b c\" d", {"a\\\\\"\"b c", "d", NULL}}, {"a\\\\\\\\\"\"\"\"\"\"\"\"b c\" d", {"a\\\\\"\"b", "c d", NULL}}, {"\"ab c\" d", {"ab c", "d", NULL}}, {"\"a\"b c\" d", {"ab", "c d", NULL}}, {"\"a\"\"b c\" d", {"a\"b", "c d", NULL}}, {"\"a\"\"\"b c\" d", {"a\"b c", "d", NULL}}, {"\"a\"\"\"\"b c\" d", {"a\"b", "c d", NULL}}, {"\"a\"\"\"\"\"b c\" d", {"a\"\"b", "c d", NULL}}, {"\"a\"\"\"\"\"\"b c\" d", {"a\"\"b c", "d", NULL}}, {"\"a\"\"\"\"\"\"\"b c\" d", {"a\"\"b", "c d", NULL}}, {"\"a\"\"\"\"\"\"\"\"b c\" d", {"a\"\"\"b", "c d", NULL}}, {"\"a\\b c\" d", {"a\\b c", "d", NULL}}, {"\"a\\\"b c\" d", {"a\"b c", "d", NULL}}, {"\"a\\\"\"b c\" d", {"a\"b", "c d", NULL}}, {"\"a\\\"\"\"b c\" d", {"a\"\"b", "c d", NULL}}, {"\"a\\\"\"\"\"b c\" d", {"a\"\"b c", "d", NULL}}, {"\"a\\\"\"\"\"\"b c\" d", {"a\"\"b", "c d", NULL}}, {"\"a\\\"\"\"\"\"\"b c\" d", {"a\"\"\"b", "c d", NULL}}, {"\"a\\\"\"\"\"\"\"\"b c\" d", {"a\"\"\"b c", "d", NULL}}, {"\"a\\\"\"\"\"\"\"\"\"b c\" d", {"a\"\"\"b", "c d", NULL}}, {"\"a\\\\b c\" d", {"a\\\\b c", "d", NULL}}, {"\"a\\\\\"b c\" d", {"a\\b", "c d", NULL}}, {"\"a\\\\\"\"b c\" d", {"a\\\"b", "c d", NULL}}, {"\"a\\\\\"\"\"b c\" d", {"a\\\"b c", "d", NULL}}, {"\"a\\\\\"\"\"\"b c\" d", {"a\\\"b", "c d", NULL}}, {"\"a\\\\\"\"\"\"\"b c\" d", {"a\\\"\"b", "c d", NULL}}, {"\"a\\\\\"\"\"\"\"\"b c\" d", {"a\\\"\"b c", "d", NULL}}, {"\"a\\\\\"\"\"\"\"\"\"b c\" d", {"a\\\"\"b", "c d", NULL}}, {"\"a\\\\\"\"\"\"\"\"\"\"b c\" d", {"a\\\"\"\"b", "c d", NULL}}, {"\"a\\\\\\b c\" d", {"a\\\\\\b c", "d", NULL}}, {"\"a\\\\\\\"b c\" d", {"a\\\"b c", "d", NULL}}, {"\"a\\\\\\\"\"b c\" d", {"a\\\"b", "c d", NULL}}, {"\"a\\\\\\\"\"\"b c\" d", {"a\\\"\"b", "c d", NULL}}, {"\"a\\\\\\\"\"\"\"b c\" d", {"a\\\"\"b c", "d", NULL}}, {"\"a\\\\\\\"\"\"\"\"b c\" d", {"a\\\"\"b", "c d", NULL}}, {"\"a\\\\\\\"\"\"\"\"\"b c\" d", {"a\\\"\"\"b", "c d", NULL}}, {"\"a\\\\\\\"\"\"\"\"\"\"b c\" d", {"a\\\"\"\"b c", "d", NULL}}, {"\"a\\\\\\\"\"\"\"\"\"\"\"b c\" d", {"a\\\"\"\"b", "c d", NULL}}, {"\"a\\\\\\\\b c\" d", {"a\\\\\\\\b c", "d", NULL}}, {"\"a\\\\\\\\\"b c\" d", {"a\\\\b", "c d", NULL}}, {"\"a\\\\\\\\\"\"b c\" d", {"a\\\\\"b", "c d", NULL}}, {"\"a\\\\\\\\\"\"\"b c\" d", {"a\\\\\"b c", "d", NULL}}, {"\"a\\\\\\\\\"\"\"\"b c\" d", {"a\\\\\"b", "c d", NULL}}, {"\"a\\\\\\\\\"\"\"\"\"b c\" d", {"a\\\\\"\"b", "c d", NULL}}, {"\"a\\\\\\\\\"\"\"\"\"\"b c\" d", {"a\\\\\"\"b c", "d", NULL}}, {"\"a\\\\\\\\\"\"\"\"\"\"\"b c\" d", {"a\\\\\"\"b", "c d", NULL}}, {"\"a\\\\\\\\\"\"\"\"\"\"\"\"b c\" d", {"a\\\\\"\"\"b", "c d", NULL}}, }; int main(int argc, char **argv) { int i, j; if (argc > 1) { /* * Generation of tests. * * Given `-splat ', we print out a C-style * representation of each argument (in the form "a", "b", * NULL), backslash-escaping each backslash and double * quote. * * Given `-split ', we first doctor `string' by * turning forward slashes into backslashes, single quotes * into double quotes and underscores into spaces; and then * we feed the resulting string to ourself with `-splat'. * * Given `-generate', we concoct a variety of fun test * cases, encode them in quote-safe form (mapping \, " and * space to /, ' and _ respectively) and feed each one to * `-split'. */ if (!strcmp(argv[1], "-splat")) { int i; char *p; for (i = 2; i < argc; i++) { putchar('"'); for (p = argv[i]; *p; p++) { if (*p == '\\' || *p == '"') putchar('\\'); putchar(*p); } printf("\", "); } printf("NULL"); return 0; } if (!strcmp(argv[1], "-split") && argc > 2) { char *str = malloc(20 + strlen(argv[0]) + strlen(argv[2])); char *p, *q; q = str + sprintf(str, "%s -splat ", argv[0]); printf(" {\""); for (p = argv[2]; *p; p++, q++) { switch (*p) { case '/': printf("\\\\"); *q = '\\'; break; case '\'': printf("\\\""); *q = '"'; break; case '_': printf(" "); *q = ' '; break; default: putchar(*p); *q = *p; break; } } *p = '\0'; printf("\", {"); fflush(stdout); system(str); printf("}},\n"); return 0; } if (!strcmp(argv[1], "-generate")) { char *teststr, *p; int i, initialquote, backslashes, quotes; teststr = malloc(200 + strlen(argv[0])); for (initialquote = 0; initialquote <= 1; initialquote++) { for (backslashes = 0; backslashes < 5; backslashes++) { for (quotes = 0; quotes < 9; quotes++) { p = teststr + sprintf(teststr, "%s -split ", argv[0]); if (initialquote) *p++ = '\''; *p++ = 'a'; for (i = 0; i < backslashes; i++) *p++ = '/'; for (i = 0; i < quotes; i++) *p++ = '\''; *p++ = 'b'; *p++ = '_'; *p++ = 'c'; *p++ = '\''; *p++ = '_'; *p++ = 'd'; *p = '\0'; system(teststr); } } } return 0; } fprintf(stderr, "unrecognised option: \"%s\"\n", argv[1]); return 1; } /* * If we get here, we were invoked with no arguments, so just * run the tests. */ for (i = 0; i < lenof(argv_tests); i++) { int ac; char **av; split_into_argv(argv_tests[i].cmdline, &ac, &av); for (j = 0; j < ac && argv_tests[i].argv[j]; j++) { if (strcmp(av[j], argv_tests[i].argv[j])) { printf("failed test %d (|%s|) arg %d: |%s| should be |%s|\n", i, argv_tests[i].cmdline, j, av[j], argv_tests[i].argv[j]); } #ifdef VERBOSE else { printf("test %d (|%s|) arg %d: |%s| == |%s|\n", i, argv_tests[i].cmdline, j, av[j], argv_tests[i].argv[j]); } #endif } if (j < ac) printf("failed test %d (|%s|): %d args returned, should be %d\n", i, argv_tests[i].cmdline, ac, j); if (argv_tests[i].argv[j]) printf("failed test %d (|%s|): %d args returned, should be more\n", i, argv_tests[i].cmdline, ac); } return 0; } #endif Revision-number: 1800 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:33.761607Z PROPS-END Revision-number: 1801 Prop-content-length: 232 Content-length: 232 K 8 svn:date V 27 2002-08-05T10:35:23.000000Z K 7 svn:log V 131 Make it clear that we're only responsible for our own web site, and people should contact mirror admins for problems with mirrors. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 01bc1011ac79cb40334439294b8b66c9 Text-delta-base-sha1: 3e4e6bc3098f8921b53546ef295c5918ddb89f09 Text-content-length: 643 Text-content-md5: 9a4a2ea91e36c0f2b8e979c1925ec2a1 Text-content-sha1: 1a186a46ca8242d5e56b5c986d89b5286fc3a059 Content-length: 682 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN$Y ha62\versionid $Id: feedback.but,v 1.6 2002/08/05 10:35:23If you want to report a problem with our web site, check that you're looking at our \e{real} web site and not a mirror. The real web site is at \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/}; if that's not where you're reading this, then don't report the problem to us until you've checked that it's really a problem with the main site. If it's only a problem with the mirror, you should try to contact the administrator of that mirror site first, and only contact us if that doesn't solve the problem (in case we need to remove the mirror from our list) Revision-number: 1802 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2002-08-05T10:35:35.000000Z K 7 svn:log V 51 Buttress is now Halibut: change the docs makefile. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 17dc65a286527e293918c69a08bcf0ba Text-delta-base-sha1: 79ac62519048831a5bbd954f3884102d6e0a2090 Text-content-length: 126 Text-content-md5: e206a2e0d53b00d09dd6dcd70f4f0be6 Text-content-sha1: 9084aa701dfe798df796d3f6a29b0c34a0b9f82c Content-length: 165 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNgb hGh34HALIBUT = $(HOME)/src/halibut/build/halibut Contents.html: $(INPUTS) $(HOME)/src/halibut/build/halibut Revision-number: 1803 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:33.877210Z PROPS-END Revision-number: 1804 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:33.884960Z PROPS-END Revision-number: 1805 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2002-08-05T17:46:23.000000Z K 7 svn:log V 91 Summary: userauth refused when compression enabled with ssh.com 3.2.0 Class: not sure yet. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh.com-userauth-refused Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 965 Text-content-md5: d92eec8f181777cdc43f4f93922b94e7 Text-content-sha1: 44a011d8e89d2ba7595f7ee59b7b39ac42e92d10 Content-length: 1081 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN777Summary: userauth refused when compression enabled with ssh.com 3.2.0 Present-in: 2002-07-02 2002-08-04 Content-type: text/x-html-body

    We've received reports of the message "Server refused user authentication protocol" when attempting to connect to an ssh.com server (version string "SSH-2.0-3.2.0 SSH Secure Shell (non-commercial)") with compression enabled. Connection is fine when compression is disabled.

    In the code, this message corresponds to not receiving the right response to a "ssh-userauth" service request in SSH-2.

    Reports:

    Revision-number: 1806 Prop-content-length: 212 Content-length: 212 K 8 svn:date V 27 2002-08-05T17:49:56.000000Z K 7 svn:log V 111 Add "Class: bug" so that it shows up in the report. Obviously we don't know whether it's a real PuTTY bug yet. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh.com-userauth-refused Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d92eec8f181777cdc43f4f93922b94e7 Text-delta-base-sha1: 44a011d8e89d2ba7595f7ee59b7b39ac42e92d10 Text-content-length: 124 Text-content-md5: 210041489ee20e59046a1334b0c8fd27 Text-content-sha1: 5e327acbfaf1b3b0561680dd600ee0aab35355df Content-length: 163 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN7`IVnIClass: bug(Classification as bug is provisional; we've not determined where the problem is yet.) Revision-number: 1807 Prop-content-length: 175 Content-length: 175 K 7 svn:log V 75 Update to reflect confirmed fix + removed Message-IDs etc to reduce noise. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-08-05T18:33:14.000000Z PROPS-END Node-path: putty-wishlist/data/freebsd-4.6-ki-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e397596999c2406ec7557751d2b9a095 Text-delta-base-sha1: 720aa02d735adbf9a90c3b3787a814831c9e05c6 Text-content-length: 187 Text-content-md5: c7fa493504e348450c2a089362b768db Text-content-sha1: 6bfe9b4d9c22262c99f9ec885b42d8d94fb8bee0 Content-length: 226 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNj4 "%m$Fixed-in: 2002-08-04Update: we believe that this is fixed as of the 2002-08-04 snapshot (and we've had confirmation from one of the original reporters). Revision-number: 1808 Prop-content-length: 231 Content-length: 231 K 8 svn:date V 27 2002-08-06T17:27:18.000000Z K 7 svn:log V 130 Now that we've decided on a file extension for private key files (.PPK), make it the default in all the private-key file dialogs. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7c34f20d7760acec2938226138fcb5b5 Text-delta-base-sha1: 533942624ef74e3c47cf15d6cc35336806d0f5ad Text-content-length: 61 Text-content-md5: 2a90affa94f9f7a3c76928b72db07c2b Text-content-sha1: 91f731e51a065383b927fe2c33182c5b23971540 Content-length: 101 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN #mqPuTTY Private Key Files\0*.PPK\0All Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1d769e402ab6e0ff0e85af14621148db Text-delta-base-sha1: 069e3c2f5835913c03e3117e9a4a246d45c8d9e8 Text-content-length: 80 Text-content-md5: 200c61d2ddde708a5bec449a054c8eb1 Text-content-sha1: a17ab744ec66be1645335806d70e59567e92eb79 Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN@2g ePuTTY Private Key Files\0*.PPK\0AllDefExt = ".ppk" Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 33103512ba7260508f32dba2d4fb8914 Text-delta-base-sha1: 2786e567b8278210afb4155e2dd79e00b0db34e0 Text-content-length: 134 Text-content-md5: ac65f373a92b6076b0645cdf581bb5ea Text-content-sha1: cc9fa157c2ea7b7814334a554bc975328e4e5ef1 Content-length: 175 K 15 cvs2svn:cvs-rev V 5 1.185 PROPS-END SVN,m|v|{oiPuTTY Private Key Files\0*.PPK\0" "key/W(/_RPORT_ALL: if (HIWORD(wParam) == BN_C Revision-number: 1809 Prop-content-length: 290 Content-length: 290 K 7 svn:log V 189 Oops. That is to say, only loading and saving of PuTTY private keys should default to .PPK - loading and saving of public keys and of foreign key formats still defaults to All Files. Ahem. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-08-06T17:35:34.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 200c61d2ddde708a5bec449a054c8eb1 Text-delta-base-sha1: a17ab744ec66be1645335806d70e59567e92eb79 Text-content-length: 309 Text-content-md5: 531c15ece6c2ed8a84ed9ebf86f11af5 Text-content-sha1: cb9d112f9400ba59aab06a4f6e8cbeff697aab9a Content-length: 349 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVN@F3t]'W;X/R:aYi:/, int ppkif (ppk) { of.lpstrFilter = "PuTTY Private Key Files\0*.PPK\0All Files\0*\0\0\0"; of.lpstrDefExt = ".ppk"; } else { of.lpstrFilter = "All Files\0*\0\0\0"; }, (type == realtype), 0 filename, 0, LOWORD(wParam)==IDC_LOAD Revision-number: 1810 Prop-content-length: 194 Content-length: 194 K 7 svn:log V 94 PuTTYgen will now start by loading a private key file if one is provided on its command line. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-08-06T17:48:14.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a9841c983be7aa7c356c8057a6d67c52 Text-delta-base-sha1: f381885ff96ce5e833e5383309f34781a758f7ea Text-content-length: 68 Text-content-md5: 25fe144fc8beafd4522ede237296017a Text-content-sha1: 471435df4a97b421c5a141878ad8f109f605942f Content-length: 107 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN8U .XOWwinutils +winutils puttygen.res LIBS Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 531c15ece6c2ed8a84ed9ebf86f11af5 Text-delta-base-sha1: cb9d112f9400ba59aab06a4f6e8cbeff697aab9a Text-content-length: 4643 Text-content-md5: 5b27233273fccf720465c8bd653fc22a Text-content-sha1: 61b75809c58afba1d0684e8acfdb1ca76bd5d2e4 Content-length: 4683 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNFOssh2 = FALSE; state->commentptr = &state->key.comment; state->key = newkey1; /* * Set the key fingerprint. */ savecomment = state->key.comment; state->key.comment = NULL; rsa_fingerprint(buf, sizeof(buf), &state->key); state->key.comment = savecomment; SetDlgItemText(hwnd, IDC_FINGERPRINT, buf); /* * Construct a decimal representation * of the key, for pasting into * .ssh/authorized_keys on a Unix box. */ setupbigedit1(hwnd, IDC_KEYDISPLAY, IDC_PKSTATIC, &state->key); } else { char *fp; char *savecomment; state->ssh2 = TRUE; state->commentptr = &state->ssh2key.comment; state->ssh2key = *newkey2; /* structure copy */ sfree(newkey2); savecomment = state->ssh2key.comment; state->ssh2key.comment = NULL; fp = state->ssh2key.alg-> fingerprint(state->ssh2key.data); state->ssh2key.comment = savecomment; SetDlgItemText(hwnd, IDC_FINGERPRINT, fp); sfree(fp); SetDlgItemText(hwnd, IDC_COMMENTEDIT, *state->commentptr); } /* * Finally, hide the progress bar and show * the key data. */ ui_set_state(hwnd, state, 2); state->key_exists = TRUE; /* * If the user has imported a foreign key * using the Load command, let them know. * If they've used the Import command, be * silent. */ if (realtype != type && !was_import_cmd) { char msg[512]; sprintf(msg, "Successfully imported foreign key\n" "(%s).\n" "To use this key with PuTTY, you need to\n" "use the \"Save private key\" command to\n" "save it in PuTTY's own format.", key_type_to_str(realtype)); MessageBox(NULL, msg, "PuTTYgen Notice", MB_OK | MB_ICONINFORMATION); }/* * Load a key file if one was provided on the command line. */ if (cmdline_keyfile) load_key_file(hwnd, state, cmdline_keyfil load_key_file(hwnd, state, filename, LOWORD(wParam) != IDC_LOAD); } break; } return 0; case WM_DONEKEYint argc; char **argv; split_into_argv(cmdline, &argc, &argv); if (argc > 0) { /* * Assume the first argument to be a private key file, and * attempt to load it. */ cmdline_keyfile = argv[0]; } Revision-number: 1811 Prop-content-length: 310 Content-length: 310 K 8 svn:date V 27 2002-08-06T17:57:37.000000Z K 7 svn:log V 209 Pageant's command line handling now uses my new split_into_argv() function, because it's silly to have two (and because the old one was not the same as the new one, violating the Principle of Least Surprise). K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2a90affa94f9f7a3c76928b72db07c2b Text-delta-base-sha1: 91f731e51a065383b927fe2c33182c5b23971540 Text-content-length: 507 Text-content-md5: c5a1111e07da3afe7c087ecb6abc37ac Text-content-sha1: 4703e906d624d54b095ea215433eac1435ded7a9 Content-length: 547 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVN[RU_aC\#include "winstuff int argc, i; char **argv, **argstart/ split_into_argv(cmdline, &argc, &argv, &argstart); for (i = 0; i < argc; i++) { if (!strcmp(argv[i], "-c")) { /* * If we see `-c', then the rest of the * command line should be treated as a * command to be spawned. */ if (i < argc-1) command = argstart[i+1]; else command = ""; break; } else { add_keyfile(argv[i]); added_keys = TRUE; Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5b27233273fccf720465c8bd653fc22a Text-delta-base-sha1: 61b75809c58afba1d0684e8acfdb1ca76bd5d2e4 Text-content-length: 31 Text-content-md5: 0710af2b5e4775e610c876fcb2e0010b Text-content-sha1: 72ef9bb8125fdb3fe29d54ea0f691302faf77cfc Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVNOU 11, NULL Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1a668f703ee28ec5f8ee6b64de498dc6 Text-delta-base-sha1: 3f964e05121fd46a373fce997f193f44216b5cd9 Text-content-length: 50 Text-content-md5: 028faca5eafcc59c62ad6f1f48fe5068 Text-content-sha1: 433c70ada568d6e93a8bec9675eb21db85bd7662 Content-length: 91 K 15 cvs2svn:cvs-rev V 5 1.200 PROPS-END SVN bb, NULLeke= NULL Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0e9a44c2608a410ebf42f5839336da91 Text-delta-base-sha1: 01a0fa9f539d7e826353291f8a7e2f5560f33541 Text-content-length: 20 Text-content-md5: e2596a3129a0ef7feba0116c31f36917 Text-content-sha1: a156b1664497cc62ae4d631af7a22d1f78a3a8ef Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNPZ ft\ Node-path: putty/winutils.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 80f62dfc299aed4d2a2235ee714ef896 Text-delta-base-sha1: 9621228d8971282e7fc5f9f5032d3db11e13b62d Text-content-length: 1065 Text-content-md5: 93c43b8fbe6d4290f61bf975a862b25d Text-content-sha1: 76a06416bf0c215efcd6d4df1f35b41aa20a1644 Content-length: 1104 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN7+q^a1*v)_7_d(a, #include #include "misc.h". * * The final parameter (argstart) is used to return a second array * of char * pointers, the same length as argv, each one pointing * at the start of the corresponding element of argv in the * original command line. So if you get half way through processing * your command line in argc/argv form and then decide you want to * treat the rest as a raw string, you can. If you don't want to, * `argstart' can be safely left NULL. */ void split_into_argv(char *cmdline, int *argc, char ***argv, char ***argstart) { char *p; char *outputline, *q; char **outputargv, **outputargstartsmalloc(1+strlen(cmdline)); outputargv = smalloc(sizeof(char *) * (strlen(cmdline)+1 / 2)); outputargstart = s] = q; outputargstart[outputargc] = p; outputargc++srealloc(outputargv, sizeof(char *) * outputargc); outputargstart = srealloc(outputargstart else sfree(outputargv); if (argstart) *argstart = outputargstart; else sfree(outputargstart) Revision-number: 1812 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:34.429900Z PROPS-END Revision-number: 1813 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:34.437912Z PROPS-END Revision-number: 1814 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:34.445612Z PROPS-END Revision-number: 1815 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2002-08-07T17:29:28.000000Z K 7 svn:log V 113 Clean up the argv splitter, and in particular stop it from bombing out ignominiously when given no arguments :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/winutils.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 93c43b8fbe6d4290f61bf975a862b25d Text-delta-base-sha1: 76a06416bf0c215efcd6d4df1f35b41aa20a1644 Text-content-length: 361 Text-content-md5: 03661dcf552d827f5242e81d1cdf2825 Text-content-sha1: 1c8eaa860c0069ca9a89172b54f3ec6dbf55c5f3 Content-length: 400 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNrH{7yx define srealloc realloc #define sfree freeFirst deal with the simplest of all special cases: if there * aren't any arguments, return 0,NULL,NULL. */ while (*cmdline && isspace(*cmdline)) cmdline++; if (!*cmdline) { if (argc) *argc = 0; if (argv) *argv = NULL; if (argstart) *argstart = NULL; return; } Revision-number: 1816 Prop-content-length: 233 Content-length: 233 K 7 svn:log V 132 Add an option to force SSH1 protocol only. Partly for symmetry; mostly because I'm about to want it for the -1 command line option. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-08-07T17:48:26.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d0ff85d9430b423b7b4b8bcbd7f12760 Text-delta-base-sha1: e7ed5104c96e8ba1b7c5a1e3d3218aeadb69ce8a Text-content-length: 1039 Text-content-md5: f77a9889c5f37724ac9215cbb37b2caf Text-content-sha1: 14c737bfe0e926a8f611b7146c7b1f752c8d7869 Content-length: 1080 K 15 cvs2svn:cvs-rev V 5 1.210 PROPS-END SVN#(qgo<>xL static int proto1, proto2Decide which SSH protocol version to support. */ /* Anything strictly below "2.0" means protocol 1 is supported. */ proto1 = ssh_versioncmp(version, "2.0") < 0; /* Anything greater or equal to "1.99" means protocol 2 is supported. */ proto2 = ssh_versioncmp(version, "1.99") > 0; if (cfg.sshprot == 0 && !proto1) { bombout(("SSH protocol version 1 required by user but not provided by server")); crReturn(0); } if (cfg.sshprot == 3 && !proto2) { bombout(("SSH protocol version 2 required by user but not provided by server")); crReturn(0); } if (proto2 && (cfg.sshprot == 2 || !proto1)) { /* * UseUseMo""Menof(kex_algs); i++) { ssh2_pkt_addstring_str(kex_algs[i]->name); if (i < lenof(kex_algs) - 1) ssh2_pkt_addstring_str(","); } /* List server host key algorithms. */ ssh2_pkt_addstring_start(); for (i = 0; i < lenof(hostkey_algs); i++) { ssh2_pkt_addstring_str(hostke Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ac65f373a92b6076b0645cdf581bb5ea Text-delta-base-sha1: cc9fa157c2ea7b7814334a554bc975328e4e5ef1 Text-content-length: 387 Text-content-md5: 0dab8a84409b2aeecf229d52ee6a22db Text-content-sha1: dfcb796e0ed52810b8498cfe8fc2f7ad8599d67d Content-length: 428 K 15 cvs2svn:cvs-rev V 5 1.186 PROPS-END SVN5 !p9feYkZT~ONLYONLYONLY cfg.sshprot == 3 ? IDC_SSHPROT2ONLY : IDC_SSHPROT14, "1 on&ly", IDC_SSHPROT1ONLYONLY:ONLY)) cfg.sshprot = 0;WH QrdWd(hwnd, IDC_X11_FORWARD); break; case IDC_LPORT_ALL cfg.lport_acceptall = IsDlgButtonChecked(hwnd, IDC_LPORT_ALL); break; case IDC Revision-number: 1817 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2002-08-07T17:55:06.000000Z K 7 svn:log V 124 Add a load of new command-line options pilfered from OpenSSH. Full list is: -A, -a, -X, -x, -T, -t, -C, -1, -2, -i keyfile. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 81eb1f1ef1d99abea0468130d06fecd0 Text-delta-base-sha1: 75de9e7cfeb7ec99ab3595dcc4f9aca3f55fe255 Text-content-length: 1044 Text-content-md5: 6e20a26072c7544ef699b65a022db517 Text-content-sha1: 0d21930cd189f30e362c0ef7c241e292a098aedf Content-length: 1083 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNvpv][d[ || !strcmp(p, "-p if (!strcmp(p, "-A")) { RETURN(1); SAVEABLE(1); cfg.agentfwd = 1; } if (!strcmp(p, "-a")) { RETURN(1); SAVEABLE(1); cfg.agentfwd = 0; } if (!strcmp(p, "-X")) { RETURN(1); SAVEABLE(1); cfg.x11_forward = 1; } if (!strcmp(p, "-x")) { RETURN(1); SAVEABLE(1); cfg.x11_forward = 0; } if (!strcmp(p, "-t")) { RETURN(1); SAVEABLE(1); cfg.nopty = 0; } if (!strcmp(p, "-T")) { RETURN(1); SAVEABLE(1); cfg.nopty = 1; } if (!strcmp(p, "-C")) { RETURN(1); SAVEABLE(1); cfg.compression = 1; } if (!strcmp(p, "-1")) { RETURN(1); SAVEABLE(1); cfg.sshprot = 0; /* ssh protocol 1 only */ } if (!strcmp(p, "-2")) { RETURN(1); SAVEABLE(1); cfg.sshprot = 3; /* ssh protocol 2 only */ } if (!strcmp(p, "-i")) { RETURN(2); SAVEABLE(1); strncpy(cfg.keyfile, value, sizeof(cfg.keyfile)); cfg.keyfile[sizeof(cfg.keyfile)-1] = '\0'; } Revision-number: 1818 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2002-08-07T17:57:06.000000Z K 7 svn:log V 74 Oops. Didn't quite get the new SSH protocol selection code right. *blush* K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f77a9889c5f37724ac9215cbb37b2caf Text-delta-base-sha1: 14c737bfe0e926a8f611b7146c7b1f752c8d7869 Text-content-length: 53 Text-content-md5: 5de9f93271bea76311528efa757b5158 Text-content-sha1: f70129687c53db5cdf14d3af38b69d7edd70933f Content-length: 94 K 15 cvs2svn:cvs-rev V 5 1.211 PROPS-END SVN? _=>opol Revision-number: 1819 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2002-08-07T18:08:29.000000Z K 7 svn:log V 33 Fix Halibut syntax error (oops). K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9a4a2ea91e36c0f2b8e979c1925ec2a1 Text-delta-base-sha1: 1a186a46ca8242d5e56b5c986d89b5286fc3a059 Text-content-length: 395 Text-content-md5: ae8ddcf1c08d71fda3f86f099f6286f9 Text-content-sha1: 4e53bbed2dfee1014f977e66a1635a1742750e51 Content-length: 434 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNY pp6:/*\versionid $Id: feedback.but,v 1.7 2002/08/07 18:08:29 \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/}\c{http://www.chiark.greenend.org.uk/~sgtatham/putty/}; if that's not where you're reading this, then don't report the problem to us until you've checked that it's really a problem with the main site. If it's only a problem with the mirror, you should try to Revision-number: 1820 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2002-08-07T18:43:40.000000Z K 7 svn:log V 75 Some of the new options shouldn't be available in the file transfer tools. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6e20a26072c7544ef699b65a022db517 Text-delta-base-sha1: 0d21930cd189f30e362c0ef7c241e292a098aedf Text-content-length: 527 Text-content-md5: 08ec7106a18550bf8916fc44ecdc6594 Text-content-sha1: 644344ed030511c1d13df508f0b709218ef338d2 Content-length: 566 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNpfk![m&Vs,DUNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); cfg.agentfwd = 1; } if (!strcmp(p, "-a")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFERUNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); cfg.x11_forward = 1; } if (!strcmp(p, "-x")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); cfg.x11_forward = 0; } if (!strcmp(p, "-t")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFERUNAVAILABLE_IN(TOOLTYPE_FILETRANSFER Revision-number: 1821 Prop-content-length: 294 Content-length: 294 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-08-07T19:09:33.000000Z K 7 svn:log V 193 Arrgh, we can't have -p for port number because we're already using it for preserving file attributes in PSCP! Ah well; looks as if that's one where we'll have to agree to differ with OpenSSH. PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 08ec7106a18550bf8916fc44ecdc6594 Text-delta-base-sha1: 644344ed030511c1d13df508f0b709218ef338d2 Text-content-length: 20 Text-content-md5: f430bffe12b75ad8b1d99f9565074166 Text-content-sha1: f28038e8bec05529e65b1f463c45dc56e2cf890c Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNfR ]uq Revision-number: 1822 Prop-content-length: 141 Content-length: 141 K 7 svn:log V 41 Document all the new command-line stuff. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-08-07T19:20:06.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4bf033a815d7ef1cc337afff14c2466e Text-delta-base-sha1: 01162f841d1d8601e8c9ce4175da4655d3b0e5b1 Text-content-length: 219 Text-content-md5: dff3418b944fb9f129c50b5f123f85a1 Text-content-sha1: 0a8e503959ad9b532ed88b59056618c8b064220f Content-length: 259 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN>>4;LO\versionid $Id: config.but,v 1.35 2002/08/07 19:20:06 simon1 only} or \q{2 only} here, PuTTY will only connect if the server you connect to offers the SSH protocol version you have specified Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0c6a5beac7a291427954b3326ba9dc88 Text-delta-base-sha1: fa8b409ac885ac518b94ba9d23cb08874820c292 Text-content-length: 349 Text-content-md5: 4e5d1e5c47dbe80b3a592e663a25559f Text-content-sha1: 40203b79146ef180319e9202a8f5df532da65e54 Content-length: 389 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN-B? 4 =9;r\versionid $Id: plink.but,v 1.16 2002/08/07 19:20:06\S{plink-options} Plink command line options Plink accepts all the general command line options supported by the PuTTY tools. See \k{using-general-opts} for a description of these options. In addition to this, Plink accepts one other option: the \c{-batch} option. Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dcb88a7e6b505b928a3e3c2d7adc5643 Text-delta-base-sha1: ead03939ddda0cb41425b64723ed00e5b32484aa Text-content-length: 455 Text-content-md5: c031e7230f76fcca0ba1932a41280f08 Text-content-sha1: 44e69e30f68fc25eb8ccca54add02c699df0ede3 Content-length: 495 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN~)_3vu\versionid $Id: pscp.but,v 1.21 2002/08/07 19:20:06PSCP accepts all the general command line options supported by the PuTTY tools, except the ones which make no sense in a file transfer utility. See \k{using-general-opts} for a description of these options. (The ones not supported by PSCP are clearly marked.) PSCP also supports some of its own options. The following sections describe PSCP's specific command-line options. Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9a19d837711c63fe9ec76772ba6049db Text-delta-base-sha1: daadd7df42c7d46a23d41f7e2e0dd3ce72b6b803 Text-content-length: 455 Text-content-md5: ed426665e43ac2d8ffc86bd3302085a3 Text-content-sha1: 16eab048b212d6f910bfc6110a1dd2e9cf0953df Content-length: 494 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNq] ,]3yT\versionid $Id: psftp.but,v 1.5 2002/08/07 19:20:06PSFTP accepts all the general command line options supported by the PuTTY tools, except the ones which make no sense in a file transfer utility. See \k{using-general-opts} for a description of these options. (The ones not supported by PSFTP are clearly marked.) PSFTP also supports some of its own options. The following sections describe PSFTP's specific command-line options Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 452c73072afdb31f2e249c160f9f3413 Text-delta-base-sha1: d8d3cb66cda89eb29f91d78255ce49aba8964ddd Text-content-length: 8356 Text-content-md5: 867f24c56f83d436065460ae596412a5 Text-content-sha1: 45b83a7c33497380c0d836e3a66cfd7a0297e09d Content-length: 8395 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNfh,j9HE5Hd NdUy\versionid $Id: using.but,v 1.7 2002/08/07 19:20:06 simonusingusinga server called \c{host}: \c putty.exe [-ssh | -telnet | -rlogin | -raw settings if supplied. Also, you can specify a protocol, which will override the default protocol (see \k{using-cmdline-protocol})\c{-load} option (described in \k{using-cmdline-load}). \c putty.exe -load "session name" \S{using \S{using-general-opts} Standard command-line options PuTTY and its associated tools support a range of command-line options, most of which are consistent across all the tools. This section lists the available options in all tools. Options which are specific to a particular tool are covered in the chapter about that tool. \S2{using-cmdline-load} \c{-load}: load a saved session The \c{-load} option causes PuTTY to load configuration details out of a saved session. If these details include a host name, then this option is all you need to make PuTTY start a session (although Plink still requires an explicitly specified host name). You need double quotes around the session name if it contains spaces. If you want to create a Windows shortcut to start a PuTTY saved session, this is the option you should use: your shortcut should call something like \c d:\path\to\putty.exe -load "my session" (Note that PuTTY itself supports an alternative form of this option, for backwards compatibility. If you execute \c{putty @sessionname} it will have the same effect as \c{putty -load "sessionname"}. With the \c{@} form, no double quotes are required, and the \c{@} sign must be the very first thing on the command line. This form of the option is deprecated.) \S2{using-cmdline-protocol} Selecting a protocol: \c{-ssh}, \c{-telnet}, \c{-rlogin}, \c{-raw} To choose which protocol you want to connect with, you can use one of these options: \b \c{-ssh} selects the SSH protocol. \b \c{-telnet} selects the Telnet protocol. \b \c{-rlogin} selects the Rlogin protocol. \b \c{-raw} selects the raw protocol. These options are not available in the file transfer tools PSCP and PSFTP (which only work with the SSH protocol). These options are equivalent to the protocol selection buttons in the Session panel of the PuTTY configuration box (see \k{config-hostname}). \S2{using-cmdline-v} \c{-v}: increase verbosity Most of the PuTTY tools can be made to tell you more about what they are doing by supplying the \c{-v} option. If you are having trouble when making a connection, or you're simply curious, you can turn this switch on and hope to find out more about what is happening. \S2{using-cmdline-l} \c{-l}: specify a login name You can specify the user name to log in as on the remote server using the \c{-l} option. For example, \c{plink login.example.com -l fred}. These options are equivalent to the username selection box in the Connection panel of the PuTTY configuration box (see \k{config-username}). \S2{using-cmdline-portfwd} \c{-L} and \c{-R}: set up port forwardings As well as setting up port forwardings in the PuTTY configuration (see \k{config-ssh-portfwd}), you can also set up forwardings on the command line. The command-line options work just like the ones in Unix \c{ssh} programs. To forward a local port (say 5110) to a remote destination (say \cw{popserver.example.com} port 110), you can write something like one of these: \c putty -L 5110:popserver.example.com:110 -load mysession \c plink mysession -L 5110:popserver.example.com:110 And to forward a remote port to a local destination, just use the \c{-R} option instead of \c{-L}: \c putty -R 5023:mytelnetserver.myhouse.org:23 -load mysession \c plink mysession -R 5023:mytelnetserver.myhouse.org:23 For general information on port forwarding, see \k{using-port-forwarding}. These options are not available in the file transfer tools PSCP and PSFTP. \S2{using-cmdline-m} \c{-m}: read a remote command or script from a file The \c{-m} option performs a similar function to the \q{Remote command} box in the SSH panel of the PuTTY configuration box (see \k{config-command}). However, the \c{-m} option expects to be given a file name, and it will read a command from that file. On most Unix systems, you can even put multiple lines in this file and execute more than one command in sequence, or a whole shell script. This option is not available in the file transfer tools PSCP and PSFTP. \S2{using-cmdline-p} \c{-p} or \c{-P}: specify a port number The \c{-p} option (you can also write it as \c{-P}) is used to specify the port number to connect to. If you have a Telnet server running on port 9696 of a machine instead of port 23, for example: \c putty -telnet -p 9696 host.name \c plink -telnet -p 9696 host.name (Note that this option is more useful in Plink than in PuTTY, because in PuTTY you can write \c{putty -telnet host.name 9696} in any case.) These options are equivalent to the protocol selection buttons in the Session panel of the PuTTY configuration box (see \k{config-hostname}). \S2{using-cmdline-pw} \c{-pw}: specify a password A simple way to automate a remote login is to supply your password on the command line. This is \e{not recommended} for reasons of security. If you possibly can, we recommend you set up public-key authentication instead. See \k{pubkey} for details. Note that the \c{-pw} option only works when you are using the SSH protocol. Due to fundamental limitations of Telnet and Rlogin, these protocols do not support automated password authentication. \S2{using-cmdline-agent} \c{-A} and \c{-a}: control agent forwarding The \c{-A} option turns on SSH agent forwarding, and \c{-a} turns it off. These options are only meaningful if you are using SSH. See \k{pageant} for general information on Pageant, and \k{pageant-forward} for information on agent forwarding. Note that there is a security risk involved with enabling this option; see \k{pageant-security} for details. These options are equivalent to the agent forwarding checkbox in the Auth panel of the PuTTY configuration box (see \k{config-ssh-agentfwd}). These options are not available in the file transfer tools PSCP and PSFTP. \S2{using-cmdline-x11} \c{-X} and \c{-x}: control X11 forwarding The \c{-X} option turns on X11 forwarding in SSH, and \c{-x} turns it off. These options are only meaningful if you are using SSH. For information on X11 forwarding, see \k{using-x-forwarding}. These options are equivalent to the X11 forwarding checkbox in the Tunnels panel of the PuTTY configuration box (see \k{config-ssh-x11}). These options are not available in the file transfer tools PSCP and PSFTP. \S2{using-cmdline-pty} \c{-t} and \c{-T}: control pseudo-terminal allocation The \c{-t} option ensures PuTTY attempts to allocate a pseudo-terminal at the server, and \c{-T} stops it from allocating one. These options are only meaningful if you are using SSH. These options are equivalent to the \q{Don't allocate a pseudo-terminal} checkbox in the SSH panel of the PuTTY configuration box (see \k{config-ssh-pty}). These options are not available in the file transfer tools PSCP and PSFTP. \S2{using-cmdline-compress} \c{-C}: enable compression The \c{-C} option enables compression of the data sent across the network. This option is only meaningful if you are using SSH. This option is equivalent to the \q{Enable compression} checkbox in the SSH panel of the PuTTY configuration box (see \k{config-ssh-comp}). \S2{using-cmdline-sshprot} \c{-1} and \c{-2}: specify an SSH protocol version The \c{-1} and \c{-2} options force PuTTY to use version 1 or version 2 of the SSH protocol. These options are only meaningful if you are using SSH. These options are equivalent to selecting your preferred SSH protocol version as \q{1 only} or \q{2 only} in the SSH panel of the PuTTY configuration box (see \k{config-ssh-prot}). \S2{using-cmdline-identity} \c{-i}: specify an SSH private key The \c{-i} option allows you to specify the name of a private key file which PuTTY will use to authenticate with the server. This option is only meaningful if you are using SSH. For general information on public-key authentication, see \k{pubkey}. This option is equivalent to the \q{Private key file for authentication} box in the Auth panel of the PuTTY configuration box (see \k{config-ssh-privkey}). Revision-number: 1823 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:35.113817Z PROPS-END Revision-number: 1824 Prop-content-length: 462 Content-length: 462 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-08-08T17:03:58.000000Z K 7 svn:log V 361 ssh.com 3.2.0 uses zlib sync flush (start and close an empty uncompressed block at the end of each compressed packet) which we were embarrassingly unable to deal with because we assumed every uncompressed block contained at least one byte. Particularly silly because I _knew_ about the existence of sync flush when I coded this module. Arrgh. Still, now fixed. PROPS-END Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 49c079779abb9a23db82d16c9419e4ea Text-delta-base-sha1: fea943d43f8571d4139de227228e52627b0d3d78 Text-content-length: 111 Text-content-md5: b84b6545e1e72126d91ddffdc6118b3e Text-content-sha1: e13f9cad2173c2d8393b11de78142be53de5a643 Content-length: 151 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNe: UHUHif (dctx.uncomplen == 0) dctx.state = OUTSIDEBLK; /* block is empty */ else Revision-number: 1825 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2002-08-09T09:11:09.000000Z K 7 svn:log V 85 Add two more FAQs: `why don't you use VirtualLock()' and `are you based on OpenSSH'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 88f936257148d0d2b20089ebb3732c33 Text-delta-base-sha1: 4ecc079dfddd5814bde3bda5287951115b505fd0 Text-content-length: 897 Text-content-md5: 8acc79441f53268c4a957a89e71d81d3 Text-content-sha1: e12d533c0f630758a946c8b8dad4d3d61ca81138 Content-length: 937 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNA[m8j!9h.\versionid $Id: faq.but,v 1.31 2002/08/09 09:11:09 simonS{faq-virtuallock}{Question} Couldn't Pageant use \c{VirtualLock()} to stop private keys being written to disk? Unfortunately not. The \c{VirtualLock()} function in the Windows API doesn't do a proper job: it may prevent small pieces of a process's memory from being paged to disk while the process is running, but it doesn't stop the process's memory as a whole from being swapped completely out to disk when the process is long-term inactive. And Pageant spends most of its time inactiveH{faq-misc} Miscellaneous questions \S{faq-openssh}{Question} Is PuTTY a port of OpenSSH, or based on OpenSSH? No, it isn't. PuTTY is almost completely composed of code written from scratch for PuTTY. The only code we share with OpenSSH is the detector for SSH1 CRC compensation attacks, written by CORE SDI S.A Revision-number: 1826 Prop-content-length: 156 Content-length: 156 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-08-09T09:14:04.000000Z K 7 svn:log V 56 Actually, VirtualLock() looks better as \cw{} not \c{}. PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8acc79441f53268c4a957a89e71d81d3 Text-delta-base-sha1: e12d533c0f630758a946c8b8dad4d3d61ca81138 Text-content-length: 482 Text-content-md5: 02884713a9fe89c6bc6ac6498e72849c Text-content-sha1: c811bb1cf49f6448f9108b4ac9803ad1355afc50 Content-length: 522 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNACE$2Zg\versionid $Id: faq.but,v 1.32 2002/08/09 09:14:04 \cw{VirtualLock()} to stop private keys being written to disk? Unfortunately not. The \cw{VirtualLock()} function in the Windows API doesn't do a proper job: it may prevent small pieces of a process's memory from being paged to disk while the process is running, but it doesn't stop the process's memory as a whole from being swapped completely out to disk when the process is long-term inactive. And Revision-number: 1827 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:35.243253Z PROPS-END Revision-number: 1828 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:35.251217Z PROPS-END Revision-number: 1829 Prop-content-length: 502 Content-length: 502 K 8 svn:date V 27 2002-08-11T12:17:25.000000Z K 7 svn:log V 401 Anecdotal evidence suggests that a single EnumPrinters() call specifying both PRINTER_ENUM_LOCAL and PRINTER_ENUM_CONNECTIONS catches more printers in some circumstances than two EnumPrinters() calls each specifying just one of them. We'll try it for a bit; if it goes wrong I might have to put back the two original calls as well and sort out some means of removing duplicate printers from the list. K 10 svn:author V 5 simon PROPS-END Node-path: putty/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d538bc22d337eb4b38d71d6a7f1afe9e Text-delta-base-sha1: 02447a50cc9d294022418ca96b55a82258142fc7 Text-content-length: 62 Text-content-md5: f8629415d1b87a33779e0e6894fa0c16 Text-content-sha1: c06a6813404de9bda4a0da3c0a1de52caaee0684 Content-length: 101 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN&S%(c)# | PRINTER_ENUM_CONNECTIONS, Revision-number: 1830 Prop-content-length: 512 Content-length: 512 K 8 svn:date V 27 2002-08-11T13:02:01.000000Z K 7 svn:log V 411 Final fixes to keyboard-interactive so it now works with packets containing more than one prompt instead of less than one, and also correctly enables echo on prompts that the server requests it for. In the process I've moved the whole username/password input routine out into its own function, where it's called independently of which SSH protocol we're using, so this should even have _saved_ code size. Rock! K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5de9f93271bea76311528efa757b5158 Text-delta-base-sha1: f70129687c53db5cdf14d3af38b69d7edd70933f Text-content-length: 4273 Text-content-md5: 7a3de2a30e6a62c793f4458d66a7c4e3 Text-content-sha1: 02a433305b756af8b0345e072eaa26798087cab7 Content-length: 4314 K 15 cvs2svn:cvs-rev V 5 1.212 PROPS-END SVN'CS.RUsername and password input, abstracted off into reusable * routines (hopefully even reusable between SSH1 and SSH2!). */ static char *ssh_userpass_input_buffer; static int ssh_userpass_input_buflen; static int ssh_userpass_input_bufpos; static int ssh_userpass_input_echo; /* Set up a username or password input loop on a given buffer. */ void setup_userpass_input(char *buffer, int buflen, int echo) { ssh_userpass_input_buffer = buffer; ssh_userpass_input_buflen = buflen; ssh_userpass_input_bufpos = 0; ssh_userpass_input_echo = echo; } /* * Process some terminal data in the course of username/password * input. Returns >0 for success (line of input returned in * buffer), <0 for failure (user hit ^C/^D, bomb out and exit), 0 * for inconclusive (keep waiting for more input please). */ int process_userpass_input(unsigned char *in, int inlen) { char c; while (inlen--) { switch (c = *in++) { case 10: case 13: ssh_userpass_input_buffer[ssh_userpass_input_bufpos] = 0; ssh_userpass_input_buffer[ssh_userpass_input_buflen-1] = 0; return +1; break; case 8: case 127: if (ssh_userpass_input_bufpos > 0) { if (ssh_userpass_input_echo) c_write_str("\b \b"); ssh_userpass_input_bufpos--; } break; case 21: case 27: while (ssh_userpass_input_bufpos > 0) { if (ssh_userpass_input_echo) c_write_str("\b \b"); ssh_userpass_input_bufpos--; } break; case 3: case 4: return -1; break; default: if (((c >= ' ' && c <= '~') || ((unsigned char) c >= 160)) && ssh_userpass_input_bufpos < ssh_userpass_input_buflen-1) { ssh_userpass_input_buffer[ssh_userpass_input_bufpos++] = c; if (ssh_userpass_input_echo) c_write(&c, 1); } break; } } return 0;static int ret; c_write_str("login as: "); ssh_send_ok = 1; setup_userpass_input(username, sizeof(username), 1); do { crWaitUntil(!ispkt); ret = process_userpass_input(in, inlen); } while (ret == 0); if (ret < 0) cleanup_exit(0); c_write_str("\r\n")static int ret; c_write_untrusted(prompt, strlen(prompt)); pos = 0; setup_userpass_input(password, sizeof(password), 0); do { crWaitUntil(!ispkt); ret = process_userpass_input(in, inlen); } while (ret == 0); if (ret < 0) cleanup_exit(0);p<:s<J7Zy#vm_&^ m case CIPHER_AES: preferred_ciphers[n_preferred_ciphers] = &ssh2_aes; n_preferred_ciphers++; break; case CIPHER_WARN: /* Flag for later. Don't bother if it's the last in * the list. */ if (i < CIPHER_MAX - 1) { preferred_ciphers[n_preferred_ciphers] = NULL; n_preferred_ciphers++; } break; } } /* * Set up preferred compression. */ if (cfg.compression) preferred_comp = &ssh_zlib; else preferred_comp = &ssh_comp_none; /* * Be prepared to work around the buggy MAC problem. */ if (cfg.buggymac || (ssh_remote_bugs & BUG_SSH2_HMAC)) maclist = buggymacs, nmacs = lenof(buggymacs); else maclist = macs, nmacs = lenof(macs); begin_key_exchange: /* * Construct and send our key exchange packet. */ ssh2_pkt_init(SSH2_MSG_KEXINIT); for (i = 0; i < 16; i++) ssh2_pkt_addbyte((unsigned char) random_byte()); /* List key exchange/* * Get a username. */static int ret; c_write_str("login as: "); ssh_send_ok = 1; setup_userpass_input(username, sizeof(username), 1); do { crWaitUntilV(!ispkt); ret = process_userpass_input(in, inlen); } while (ret == 0); if (ret < 0) cleanup_exit(0);/* * Most password/passphrase prompts will be * non-echoing, so we set this to 0 by default. * Exception is that some keyboard-interactive prompts * can be echoing, in which case we'll set this to 1. */ echo = 0rrret; c_write_untrusted(pwprompt, strlen(pwprompt)); ssh_send_ok = 1; setup_userpass_input(password, sizeof(password), echo); do { crWaitUntilV(!ispkt); ret = process_userpass_input(in, inlen); } while (ret == 0); if (ret < 0) cleanup_exit(0); Revision-number: 1831 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:35.552836Z PROPS-END Revision-number: 1832 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:35.561464Z PROPS-END Revision-number: 1833 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:35.990106Z PROPS-END Revision-number: 1834 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.082240Z PROPS-END Revision-number: 1835 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.089991Z PROPS-END Revision-number: 1836 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.104310Z PROPS-END Revision-number: 1837 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.112552Z PROPS-END Revision-number: 1838 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.120186Z PROPS-END Revision-number: 1839 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.127726Z PROPS-END Revision-number: 1840 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.137669Z PROPS-END Revision-number: 1841 Prop-content-length: 271 Content-length: 271 K 8 svn:date V 27 2002-08-12T14:08:55.000000Z K 7 svn:log V 170 Alter the Feedback page, so that instead of saying `at some point we plan to start blocking executable attachments' it now says we _do_ block executable attachments. :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ae8ddcf1c08d71fda3f86f099f6286f9 Text-delta-base-sha1: 4e53bbed2dfee1014f977e66a1635a1742750e51 Text-content-length: 275 Text-content-md5: f253d7075234e9d86d683b0907fb6bc1 Text-content-sha1: 633b9a063ef21d293c5a0b2d1f87b56893948ac7 Content-length: 314 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN x66Bh'\versionid $Id: feedback.but,v 1.8 2002/08/12 14:08:55Our mail server blocks all incoming e-mail containing executables, as a defence against the vast numbers of e-mail viruses we receive every day. If you mail us an executable, it will just bounce Revision-number: 1842 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.291505Z PROPS-END Revision-number: 1843 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.299075Z PROPS-END Revision-number: 1844 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.306800Z PROPS-END Revision-number: 1845 Prop-content-length: 214 Content-length: 214 K 7 svn:log V 113 We believe this one is fixed. Remove message-IDs to reduce noise. Modify Summary: to reflect underlying problem. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-08-13T23:55:01.000000Z PROPS-END Node-path: putty-wishlist/data/ssh.com-userauth-refused Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 210041489ee20e59046a1334b0c8fd27 Text-delta-base-sha1: 5e327acbfaf1b3b0561680dd600ee0aab35355df Text-content-length: 411 Text-content-md5: 5cbec9a068b08748831fa7731882a2c1 Text-content-sha1: fda5938424ac70bc4faa4a857093d5aec95ca4c0 Content-length: 450 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNX TjSummary: Breakage when compression enabled with ssh.com 3.2.0 server Present-in: 2002-07-02 2002-08-04 Content-type: text/x-html-body Fixed-in: 2002-08-09We've also heard of problems with port-forwarding with compression enabled.

    Update: We believe that the bug in talking to ssh.com 3.2 with compression enabled has been fixed as of 2002-08-09. We've had one confirmation. Revision-number: 1846 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.341454Z PROPS-END Revision-number: 1847 Prop-content-length: 193 Content-length: 193 K 7 svn:log V 93 Changed wording of OpenSSH vs bad OpenSSL FAQ so that it's more obvious it applies to 3.4p1. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-08-15T14:59:48.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 02884713a9fe89c6bc6ac6498e72849c Text-delta-base-sha1: c811bb1cf49f6448f9108b4ac9803ad1355afc50 Text-content-length: 455 Text-content-md5: 3cc673715c182154af8a6d836f0c895c Text-content-sha1: 09e086d3cb569904a55d7d2a1fdb5c93e59b9fc0 Content-length: 495 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNCB)|8Tb|-taYUX+4\versionid $Id: faq.but,v 1.33 2002/08/15 14:59:48 jacobopenssh-bad-openssl}{Question} Since my SSH server was upgraded to OpenSSH 3.1p1/3.4 (Although PuTTY's default cipher differs from many other clients.) \e{OpenSSH 3.1p1:} c\e{OpenSSH 3.4p1:} as of 3.4p1, only the problem with SSH 1 and Blowfish remains. Rebuild your server, apply the patch linked to from bug 138 above, or use another cipher Revision-number: 1848 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.439963Z PROPS-END Revision-number: 1849 Prop-content-length: 104 Content-length: 104 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-08-17T10:04:45.000000Z K 7 svn:log V 5 typo PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 32492b9eff5a231760b8a14e707f0dc6 Text-delta-base-sha1: edc176d4ed736e036449fab6c6f7f5ece1d15aea Text-content-length: 20 Text-content-md5: 79fdcaeab7293e5bec7c542a540de52f Text-content-sha1: c7256d521f1a1e6fa7ea1579ab60c7378a1c7d84 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNLK 01 Revision-number: 1850 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2002-08-17T11:44:07.000000Z K 7 svn:log V 35 Add message-IDs of proposed fixes. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/printer-list Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 57c58af3ce0831853dda570c747ca5b0 Text-delta-base-sha1: df877ffc28f1d327f832d22c6d44c4ec1330dea9 Text-content-length: 481 Text-content-md5: edaa8f6ecb4ec9fe91fc49549edc895b Text-content-sha1: acaeeea24da68e7f9641cdfc2a32539b19520747 Content-length: 520 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNC I<I< (The behaviour seems to depend on the version of Windows, so we need to test any proposed fix on a range of versions.)

    Suggested fixes on the mailing list (that we've not already tried):

    • 007101c1d3ef$bcb24a10$32b0a8c0@eolo
    • C705668A7052D411BB310000F803745D43673C@wendy.tarragon-et.co.uk (referenced link)
    • 38386625.1019686694@[192.168.0.100]
    Revision-number: 1851 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2002-08-17T11:47:19.000000Z K 7 svn:log V 20 Add another report. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-open-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e998ccb44d9fa5613e76761723bc708a Text-delta-base-sha1: 3c13eec0fbda553243d74af465365a7f5e6c9da3 Text-content-length: 82 Text-content-md5: ecec7ba81be0774ccfb9a4f2c08f2935 Text-content-sha1: 8595f537eb4caf2ac3b3abdbd56c0b05467b207e Content-length: 121 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNJ? xli>3D578BB2.10439.7BC05B@localhost (contains Dr Watson Revision-number: 1852 Prop-content-length: 362 Content-length: 362 K 8 svn:date V 27 2002-08-18T09:10:17.000000Z K 7 svn:log V 261 In SSH2, if decrypting the packet length gave us a negative value, subsequent packet-receiver code would fail to notice anything was wrong and segfault. Since this is clearly a silly packet length anyway, we now explicitly reject it as a daft encryption error. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7a3de2a30e6a62c793f4458d66a7c4e3 Text-delta-base-sha1: 02a433305b756af8b0345e072eaa26798087cab7 Text-content-length: 539 Text-content-md5: 4ba7d17d8f0aba9d24b086769d774013 Text-content-sha1: 5a7465859e4e6ddfc02c1f6494e78be84ed5cedc Content-length: 580 K 15 cvs2svn:cvs-rev V 5 1.213 PROPS-END SVNmymi_Completely_ silly lengths should be stomped on before they * do us any more damage. */ if (st->len < 0 || st->pad < 0 || st->len + st->pad < 0) { bombout(("Incoming packet was garbled on decryption")); crReturn(0); }<9}}<ER_DES: if (cfg.ssh2_des_cbc) { preferred_ciphers[n_preferred_ciphers] = &ssh2_des; n_preferred_ciphers++; } break; case CIPHER_3DES: preferred_ciphers[n_preferred_ciphers] = &ssh2_3des; n_preferred_ciphers++; break; Revision-number: 1853 Prop-content-length: 388 Content-length: 388 K 8 svn:date V 27 2002-08-18T09:27:15.000000Z K 7 svn:log V 287 Add BUG_SSH2_DERIVEKEY, present (according to OpenSSH) in ssh.com versions 2.0.*, and causing the shared secret not to be included in key derivation hashes. (This doesn't quite cause a blatant security hole because the session ID - _derived_ from the shared secret - is still included.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4ba7d17d8f0aba9d24b086769d774013 Text-delta-base-sha1: 5a7465859e4e6ddfc02c1f6494e78be84ed5cedc Text-content-length: 933 Text-content-md5: b207956c0e246f475ebab4f1e5d2ad0c Text-content-sha1: c2b2b031da38aac24dadb46c86bab2f2a6f9ca75 Content-length: 974 K 15 cvs2svn:cvs-rev V 5 1.214 PROPS-END SVN#$_^#d3 :#define BUG_SSH2_DERIVEKEY 32!strncmp(imp, "2.0.", 4)) { /* * These versions have the key-derivation bug (failing to * include the literal shared secret in the hashes that * generate the keys). */ ssh_remote_bugs |= BUG_SSH2_DERIVEKEY; logevent("We believe remote version has SSH2 key-derivationif (!(ssh_remote_bugs & BUG_SSH2_DERIVEKEY)) if (!(ssh_remote_bugs & BUG_SSH2_DERIVEKEY)) 9u<<9erred_comp; static int cipherstr_started; static int first_kex; crBegin; random_init(); first_kex = 1; /* * Set up the preferred ciphers. (NULL => warn below here) */ n_preferred_ciphers = 0; for (i = 0; i < CIPHER_MAX; i++) { switch (cfg.ssh_cipherlist[i]) { case CIPHER_BLOWFISH: preferred_ciphers[n_preferred_ciphers] = &ssh2_blowfish; n_preferred_ciphers++; break; case CIPH Revision-number: 1854 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.773216Z PROPS-END Revision-number: 1855 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:36.787724Z PROPS-END Revision-number: 1856 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2002-08-22T18:18:54.000000Z K 7 svn:log V 62 Someone would like Ctrl+/ to be the same as Ctrl+_. I agree. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/control-slash Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 312 Text-content-md5: 7e874bc6ccd89e2526c6988493426c14 Text-content-sha1: 4e96324862f832c17545f975445e6cea9ed1f6bd Content-length: 428 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN***Summary: Ctrl+/ should send the same as Ctrl+_ Class: wish Content-type: text/x-html-body Priority: medium Difficulty: fun

    The Emacs Tutorial claims

    On some terminals, you can type C-_ by typing / while holding down CONTROL.
    It would be good if PuTTY supported this. Revision-number: 1857 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2002-08-22T18:33:56.000000Z K 7 svn:log V 59 Add a couple of terminfos that people have sent us lately. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/terminfo Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2bcc461ea34d2d251c8722f3d1485cd0 Text-delta-base-sha1: 323a101bc5449f998fee94091da92503d106b2f7 Text-content-length: 4958 Text-content-md5: a5600a089bf2c9201497ce4ac8457064 Text-content-sha1: 73771b528ead35e927bbb2579685b0e3564d1e7f Content-length: 4997 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNU KUK

    A couple of people have submitted possible ones:

    NB that this forces on background erase, which people may not want.

    putty, 
    	am, bce, km, mir, msgr, npc, xenl, 
    	colors#8, cols#80, it#8, lines#24, pairs#64, 
    	acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, 
    	bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, 
    	clear=\E[H\E[2J, cnorm=\E[?25h, cr=^M, 
    	csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, 
    	cub1=\E[Dhpa=\E[%i%p1%dG, cud=\E[%p1%dB, 
    	cud1=\E[Bcuf=\E[%p1%dC, cuf1=\E[C, 
    	cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, 
    	dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, 
    	ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, 
    	enacs=\E(B\E)0\E[=L, flash=\E[?5h$<100/>\E[?5l, 
    	home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, 
    	il=\E[%p1%dL, il1=\E[L, ind=^J, invis=\E[8m, 
    	is2=\E[?3l\E[4l\E>\E[=L, kbs=\177, kcbt=\E[Zkcuu1=\EOA, 
    	kclr=\EOG, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kdch1=\E[3~, 
    	kend=\E[4~, kent=\EOM, kf1=\E[11~, kf10=\E[21~, 
    	kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, 
    	kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, 
    	kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, kf3=\E[13~, 
    	kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, 
    	kf9=\E[20~, khome=\E[1~, kich1=\E[2~, kmous=\E[M, 
    	knp=\E[6~, kpp=\E[5~, op=\E[39;49m, rc=\E8, rev=\E[7m, 
    	ri=\EM, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, 
    	rmso=\E[27m, rmul=\E[24m, rs1=\Ec, 
    	rs2=\E[?3l\E[4l\E>\E[=L, sc=\E7, setab=\E[4%p1%dm, 
    	setaf=\E[3%p1%dm, 
    	setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, 
    	setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, 
    	sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, 
    	sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, 
    	smkx=\E[?1h\E=\E[=L, smso=\E[7m, smul=\E[4m, tbc=\E[3g, 
    	u7=\E[6n, u9=\E[c, vpa=\E[%i%p1%dd, 
    

    This one deliberately follows the default settings, on the other hand:

    #  Run tic putty.ti to install putty terminfo file in ~/.terminfo/p/putty
    #
    #  Reconstructed via infocmp from file: /home/usel/.terminfo/x/xterm-color
    #
    # NOTES:
    #   not sure if key_a1, key_a3, key_b2, key_c1, key_c3 are correct
    #
    putty|PuTTY (a free Win32 telnet/ssh client), 
    	auto_right_margin,
    #	back_color_erase, 
    	eat_newline_glitch,
    	erase_overstrike, has_meta_key, 
    	move_insert_mode, move_standout_mode, xon_xoff, 
    	columns#80, init_tabs#8, lines#24, max_colors#8, 
    	max_pairs#64, 
    	acs_chars=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, 
    	bell=^G, carriage_return=^M, 
    	change_scroll_region=\E[%i%p1%d;%p2%dr, 
    	clear_all_tabs=\E[3g, clear_screen=\E[H\E[2J, 
    	clr_bol=\E[1K, clr_eol=\E[K, clr_eos=\E[J, 
    	column_address=\E[%i%p1%dG, 
    	cursor_address=\E[%i%p1%d;%p2%dH, cursor_down=^J, 
    	cursor_home=\E[H, cursor_invisible=\E[?25l, 
    	cursor_left=^H, cursor_normal=\E[?25h, 
    	cursor_right=\E[C, cursor_up=\E[A, 
    	delete_character=\E[P, delete_line=\E[M, 
    	ena_acs=\E(B\E)0, enter_alt_charset_mode=^N, 
    	enter_blink_mode=\E[5m, enter_bold_mode=\E[1m, 
    	enter_ca_mode=\E7\E[?47h, enter_insert_mode=\E[4h, 
    	enter_reverse_mode=\E[7m, enter_standout_mode=\E[7m, 
    	enter_underline_mode=\E[4m, exit_alt_charset_mode=^O, 
    	exit_attribute_mode=\E[m\017, 
    	exit_ca_mode=\E[2J\E[?47l\E8, exit_insert_mode=\E[4l, 
    	exit_standout_mode=\E[27m, 
    	exit_underline_mode=\E[24m, 
    	flash_screen=\E[?5h\E[?5l, 
    	init_1string=\E[?47l\E=\E[?1l, 
    	init_2string=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, 
    	insert_character=\E[@, insert_line=\E[L,
    
    	key_a1=\EOw, key_a3=\EOy,
    	key_b2=\EOu,
    	key_c1=\EOq, key_c3=\EOs,
    
    	key_backspace=\177,
    	key_btab=\E[Z, key_dc=\E[3~, 
    	key_down=\E[B, key_end=\E[4~, key_enter=\EOM, 
    	key_eol=\E[8\136, key_f1=\E[11~, key_f10=\E[21~, 
    	key_f11=\E[23~, key_f12=\E[24~, key_f13=\E[25~, 
    	key_f14=\E[26~, key_f15=\E[28~, key_f16=\E[29~, 
    	key_f17=\E[31~, key_f18=\E[32~, key_f19=\E[33~, 
    	key_f2=\E[12~, key_f20=\E[34~, key_f3=\E[13~, 
    	key_f4=\E[14~, key_f5=\E[15~, key_f6=\E[17~, 
    	key_f7=\E[18~, key_f8=\E[19~, key_f9=\E[20~, 
    #	key_find=\E[1~,
    	key_home=\E[1~, key_ic=\E[2~, 
    	key_left=\E[D, key_mouse=\E[M, key_npage=\E[6~, 
    	key_ppage=\E[5~, key_right=\E[C, key_sdc=\E[3$, 
    #	key_select=\E[4~, 
    	key_send=\E[8$, key_shome=\E[7$, 
    	key_sleft=\E[d, key_snext=\E[6$, key_sprevious=\E[5$, 
    	key_sright=\E[c, key_up=\E[A, keypad_local=\E>, 
    	keypad_xmit=\E=, orig_pair=\E[39;49m, 
    	parm_dch=\E[%p1%dP, parm_delete_line=\E[%p1%dM, 
    	parm_down_cursor=\E[%p1%dB, parm_ich=\E[%p1%d@, 
    	parm_insert_line=\E[%p1%dL, 
    	parm_left_cursor=\E[%p1%dD, 
    	parm_right_cursor=\E[%p1%dC, 
    	parm_up_cursor=\E[%p1%dA, 
    	reset_1string=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, 
    	reset_2string=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>, 
    	restore_cursor=\E8, row_address=\E[%i%p1%dd, 
    	save_cursor=\E7, scroll_forward=^J, scroll_reverse=\EM, 
    	set0_des_seq=\E(B, set1_des_seq=\E(0, 
    	set_a_background=\E[4%p1%dm, 
    	set_a_foreground=\E[3%p1%dm, set_tab=\EH, tab=^I, 
    
    Revision-number: 1858 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2002-08-22T18:51:16.000000Z K 7 svn:log V 39 Summary: Per-session configurable icon K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/session-icon Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 814 Text-content-md5: 1bf56e9f76d08295ad55958034f60f19 Text-content-sha1: 0a469d8b52d2ba2c654f454ffb6161927e1ef385 Content-length: 930 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  Summary: Per-session configurable icon Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body

    Yet another means of distinguishing multiple PuTTY sessions: replacing the normal PuTTY icon with a different one, on a per-session basis.

    Technically, the hardest bit of this I see is implementing an icon chooser. As far as I know there's no convenient icon chooser in Common Controls or Common Dialogs that we could use. Implementing one ourselves seems like a lot of work and would also bloat PuTTY.

    An alternative would be to only allow a file to be picked, and take the first icon in the file, but that's a bit naff.

    Also, we already have various means of distinguishing sessions, and we keep getting asked for more. If we added them all, PuTTY would balloon. Revision-number: 1859 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2002-08-22T19:01:17.000000Z K 7 svn:log V 47 A user suggests the idea of per-session icons. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/custom-icons Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 236 Text-content-md5: dedc525339d160fd304e588f3095ef63 Text-content-sha1: 1482952a7f49196b9ff3937be9c05f32f3590fde Content-length: 352 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN^^^Summary: Custom, per-session icons Content-type: text/plain Class: wish Priority: low It might be nice if users could specify a custom icon to go with each session, to be used as the window/taskbar icon for that session. Revision-number: 1860 Prop-content-length: 151 Content-length: 151 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-08-22T19:31:39.000000Z K 7 svn:log V 51 After discussion yesterday -- we think it's fixed. PROPS-END Node-path: putty-wishlist/data/portfwd-open-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ecec7ba81be0774ccfb9a4f2c08f2935 Text-delta-base-sha1: 8595f537eb4caf2ac3b3abdbd56c0b05467b207e Text-content-length: 197 Text-content-md5: e445a117131d8beb5e3a9e4fff1a0ade Text-content-sha1: 4ce702b8dc1ecc6437d9b4304d022e8a733601a9 Content-length: 236 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNJ ,T 5 2002-06-06 Fixed-in: 2002-06-1Update: We believe this is fixed. I (JTN) can consistently reproduce the problem in 2002-06-05 but not 2002-06-18 (or 2002-08-19). Revision-number: 1861 Prop-content-length: 148 Content-length: 148 K 7 svn:log V 50 Make high-priority items bold, so I can see them. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-08-22T19:31:40.000000Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5700de5118acd4421e1d972677d0f27d Text-delta-base-sha1: 303644b7604697ec2d8d145566e0aea9fba110b9 Text-content-length: 342 Text-content-md5: d82409c27d163897e3568670a4128951 Text-content-sha1: b27872177e6ac52c36d79c967c014b489ae78cca Content-length: 381 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNS} =U;kh#! /usr/bin/perl # $Id: bugs2html,v 1.8 2002/08/22 19:31:40if ($hdrs{priority} eq 'high') { $index{$hdrs{class}} .= qq[

  • $bugname: $hdrs{summary}] . qq[\n]; } else { $index{$hdrs{class}} .= qq[
  • $bugname: $hdrs{summary}\n]; } Revision-number: 1862 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2002-08-22T19:37:28.000000Z K 7 svn:log V 72 Take over Ben's simultaneously-committed 'custom-icons' wish. Muhahaha. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/session-icon Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1bf56e9f76d08295ad55958034f60f19 Text-delta-base-sha1: 0a469d8b52d2ba2c654f454ffb6161927e1ef385 Text-content-length: 116 Text-content-md5: cdb6c018c0818088cd39653c6fb1fe78 Text-content-sha1: f4975ce433ab099733f0fde649783dc4bccd1507 Content-length: 155 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN 8 ^*&0pSummary: Custom, per-session configurable iconswindow/taskbar icon with a different one, on a Node-path: putty-wishlist/data/custom-icons Node-action: delete Revision-number: 1863 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:37.933694Z PROPS-END Revision-number: 1864 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:37.941249Z PROPS-END Revision-number: 1865 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:37.951796Z PROPS-END Revision-number: 1866 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:37.962496Z PROPS-END Revision-number: 1867 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:37.973278Z PROPS-END Revision-number: 1868 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:37.984316Z PROPS-END Revision-number: 1869 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:37.994726Z PROPS-END Revision-number: 1870 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.005486Z PROPS-END Revision-number: 1871 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.016049Z PROPS-END Revision-number: 1872 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.028109Z PROPS-END Revision-number: 1873 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.038427Z PROPS-END Revision-number: 1874 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.047878Z PROPS-END Revision-number: 1875 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.057501Z PROPS-END Revision-number: 1876 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.067429Z PROPS-END Revision-number: 1877 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.077540Z PROPS-END Revision-number: 1878 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.087208Z PROPS-END Revision-number: 1879 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.110157Z PROPS-END Revision-number: 1880 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.120054Z PROPS-END Revision-number: 1881 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.130852Z PROPS-END Revision-number: 1882 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2002-08-27T10:45:09.000000Z K 7 svn:log V 61 Mention Beep(), which apparently works on NT, but not on 95. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/pc-speaker Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 063f7aec4bf92d388207438f54eb3026 Text-delta-base-sha1: cabff3098e73e67be11b85719c42c953147dcbce Text-content-length: 124 Text-content-md5: a4a679bbcd5697603a51604d7ae22d09 Text-content-sha1: be717f7b8ecd77e905cc79dc8e6a2ed1985c0983 Content-length: 163 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNR g$gGW. Meanwhile on NT, Beep(Freq, Duration) uses the PC speaker, but that plays the default sound on Win95 Revision-number: 1883 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.173191Z PROPS-END Revision-number: 1884 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.198198Z PROPS-END Revision-number: 1885 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.214947Z PROPS-END Revision-number: 1886 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.221877Z PROPS-END Revision-number: 1887 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.252042Z PROPS-END Revision-number: 1888 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.260929Z PROPS-END Revision-number: 1889 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.295541Z PROPS-END Revision-number: 1890 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.302248Z PROPS-END Revision-number: 1891 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.316011Z PROPS-END Revision-number: 1892 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.323702Z PROPS-END Revision-number: 1893 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.330823Z PROPS-END Revision-number: 1894 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.348745Z PROPS-END Revision-number: 1895 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.355581Z PROPS-END Revision-number: 1896 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.365407Z PROPS-END Revision-number: 1897 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.372448Z PROPS-END Revision-number: 1898 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.379200Z PROPS-END Revision-number: 1899 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.386671Z PROPS-END Revision-number: 1900 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.393994Z PROPS-END Revision-number: 1901 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.401092Z PROPS-END Revision-number: 1902 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.430343Z PROPS-END Revision-number: 1903 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.460055Z PROPS-END Revision-number: 1904 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.468977Z PROPS-END Revision-number: 1905 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.475946Z PROPS-END Revision-number: 1906 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.483566Z PROPS-END Revision-number: 1907 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.512270Z PROPS-END Revision-number: 1908 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.519205Z PROPS-END Revision-number: 1909 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.528167Z PROPS-END Revision-number: 1910 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.538073Z PROPS-END Revision-number: 1911 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.544877Z PROPS-END Revision-number: 1912 Prop-content-length: 282 Content-length: 282 K 8 svn:date V 27 2002-09-01T13:12:51.000000Z K 7 svn:log V 181 I'm rapidly running out of patience for trying all possible combinations of options to EnumPrinters() to see which one works, but here's another one tried at random for now. *sigh* K 10 svn:author V 5 simon PROPS-END Node-path: putty/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f8629415d1b87a33779e0e6894fa0c16 Text-delta-base-sha1: c06a6813404de9bda4a0da3c0a1de52caaee0684 Text-content-length: 22 Text-content-md5: 345f4f32a1178d9432474893eb8b04d1 Text-content-sha1: 0b209ec93fa95cbf8bce9ccb4c748d8c2e2b86a5 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNSS 781 Revision-number: 1913 Prop-content-length: 296 Content-length: 296 K 8 svn:date V 27 2002-09-02T13:04:46.000000Z K 7 svn:log V 195 Mention PocketPC in the WinCE question. I'm not sure how similar WinCE and PocketPC are, though -- perhaps it merits its own question. (Although I don't know of anyone who's looked into it yet.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3cc673715c182154af8a6d836f0c895c Text-delta-base-sha1: 09e086d3cb569904a55d7d2a1fdb5c93e59b9fc0 Text-content-length: 87 Text-content-md5: 27ab33adf4458c1fdd38a915b07f5def Text-content-sha1: aade0bd342af49dc6d9d61fb0462eb1204a244bc Content-length: 127 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNBN >'2iY\versionid $Id: faq.but,v 1.34 2002/09/02 13:04:46 or PocketPC Revision-number: 1914 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2002-09-02T13:32:37.000000Z K 7 svn:log V 58 Convert from CRLF to Unix line endings -- no other change K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f430bffe12b75ad8b1d99f9565074166 Text-delta-base-sha1: f28038e8bec05529e65b1f463c45dc56e2cf890c Text-content-length: 7851 Text-content-md5: 87a0871317284d8c3d22f79895f138d2 Text-content-sha1: 3219b4ef28faebfa8e949d6779278eeed2ab4f9c Content-length: 7890 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNR#include #include #include #include #include "putty.h" /* * Some command-line parameters need to be saved up until after * we've loaded the saved session which will form the basis of our * eventual running configuration. For this we use the macro * SAVEABLE, which notices if the `need_save' parameter is set and * saves the parameter and value on a list. * * We also assign priorities to saved parameters, just to slightly * ameliorate silly ordering problems. For example, if you specify * a saved session to load, it will be loaded _before_ all your * local modifications such as -L are evaluated; and if you specify * a protocol and a port, the protocol is set up first so that the * port can override its choice of port number. */ #define NPRIORITIES 3 struct cmdline_saved_param { char *p, *value; }; struct cmdline_saved_param_set { struct cmdline_saved_param *params; int nsaved, savesize; }; /* * C guarantees this structure will be initialised to all zero at * program start, which is exactly what we want. */ static struct cmdline_saved_param_set saves[NPRIORITIES]; static void cmdline_save_param(char *p, char *value, int pri) { if (saves[pri].nsaved >= saves[pri].savesize) { saves[pri].savesize = saves[pri].nsaved + 32; saves[pri].params = srealloc(saves[pri].params, saves[pri].savesize*sizeof(*saves[pri].params)); } saves[pri].params[saves[pri].nsaved].p = p; saves[pri].params[saves[pri].nsaved].value = value; saves[pri].nsaved++; } #define SAVEABLE(pri) do { \ if (need_save) { cmdline_save_param(p, value, pri); return ret; } \ } while (0) char *cmdline_password = NULL; static int cmdline_get_line(const char *prompt, char *str, int maxlen, int is_pw) { static int tried_once = 0; assert(is_pw && cmdline_password); if (tried_once) { return 0; } else { strncpy(str, cmdline_password, maxlen); str[maxlen - 1] = '\0'; tried_once = 1; return 1; } } /* * Here we have a flags word which describes the capabilities of * the particular tool on whose behalf we're running. We will * refuse certain command-line options if a particular tool * inherently can't do anything sensible. For example, the file * transfer tools (psftp, pscp) can't do a great deal with protocol * selections (ever tried running scp over telnet?) or with port * forwarding (even if it wasn't a hideously bad idea, they don't * have the select() infrastructure to make them work). */ int cmdline_tooltype = 0; static int cmdline_check_unavailable(int flag, char *p) { if (cmdline_tooltype & flag) { cmdline_error("option \"%s\" not available in this tool", p); return 1; } return 0; } #define UNAVAILABLE_IN(flag) do { \ if (cmdline_check_unavailable(flag, p)) return ret; \ } while (0) /* * Process a standard command-line parameter. `p' is the parameter * in question; `value' is the subsequent element of argv, which * may or may not be required as an operand to the parameter. * Return value is 2 if both arguments were used; 1 if only p was * used; 0 if the parameter wasn't one we recognised; -2 if it * should have been 2 but value was NULL. */ #define RETURN(x) do { \ if ((x) == 2 && !value) return -2; \ ret = x; \ } while (0) int cmdline_process_param(char *p, char *value, int need_save) { int ret = 0; if (!strcmp(p, "-load")) { RETURN(2); SAVEABLE(0); /* very high priority */ do_defaults(value, &cfg); return 2; } if (!strcmp(p, "-ssh")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); default_protocol = cfg.protocol = PROT_SSH; default_port = cfg.port = 22; return 1; } if (!strcmp(p, "-telnet")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); default_protocol = cfg.protocol = PROT_TELNET; default_port = cfg.port = 23; return 1; } if (!strcmp(p, "-rlogin")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); default_protocol = cfg.protocol = PROT_RLOGIN; default_port = cfg.port = 513; return 1; } if (!strcmp(p, "-raw")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); default_protocol = cfg.protocol = PROT_RAW; } if (!strcmp(p, "-v")) { RETURN(1); flags |= FLAG_VERBOSE; } if (!strcmp(p, "-l")) { RETURN(2); SAVEABLE(1); strncpy(cfg.username, value, sizeof(cfg.username)); cfg.username[sizeof(cfg.username) - 1] = '\0'; } if ((!strcmp(p, "-L") || !strcmp(p, "-R"))) { char *fwd, *ptr, *q; int i=0; RETURN(2); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); fwd = value; ptr = cfg.portfwd; /* if multiple forwards, find end of list */ if (ptr[0]=='R' || ptr[0]=='L') { for (i = 0; i < sizeof(cfg.portfwd) - 2; i++) if (ptr[i]=='\000' && ptr[i+1]=='\000') break; ptr = ptr + i + 1; /* point to next forward slot */ } ptr[0] = p[1]; /* insert a 'L' or 'R' at the start */ if (strlen(fwd) > sizeof(cfg.portfwd) - i - 2) { cmdline_error("out of space for port forwardings"); return ret; } strncpy(ptr+1, fwd, sizeof(cfg.portfwd) - i); q = strchr(ptr, ':'); if (q) *q = '\t'; /* replace first : with \t */ cfg.portfwd[sizeof(cfg.portfwd) - 1] = '\0'; cfg.portfwd[sizeof(cfg.portfwd) - 2] = '\0'; ptr[strlen(ptr)+1] = '\000'; /* append two '\000' */ } if (!strcmp(p, "-m")) { char *filename, *command; int cmdlen, cmdsize; FILE *fp; int c, d; RETURN(2); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); filename = value; cmdlen = cmdsize = 0; command = NULL; fp = fopen(filename, "r"); if (!fp) { cmdline_error("unable to open command " "file \"%s\"", filename); return ret; } do { c = fgetc(fp); d = c; if (c == EOF) d = 0; if (cmdlen >= cmdsize) { cmdsize = cmdlen + 512; command = srealloc(command, cmdsize); } command[cmdlen++] = d; } while (c != EOF); cfg.remote_cmd_ptr = command; cfg.remote_cmd_ptr2 = NULL; cfg.nopty = TRUE; /* command => no terminal */ } if (!strcmp(p, "-P")) { RETURN(2); SAVEABLE(2); /* lower priority than -ssh,-telnet */ cfg.port = atoi(value); } if (!strcmp(p, "-pw")) { RETURN(2); cmdline_password = value; ssh_get_line = cmdline_get_line; ssh_getline_pw_only = TRUE; } if (!strcmp(p, "-A")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); cfg.agentfwd = 1; } if (!strcmp(p, "-a")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); cfg.agentfwd = 0; } if (!strcmp(p, "-X")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); cfg.x11_forward = 1; } if (!strcmp(p, "-x")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); cfg.x11_forward = 0; } if (!strcmp(p, "-t")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); cfg.nopty = 0; } if (!strcmp(p, "-T")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER); SAVEABLE(1); cfg.nopty = 1; } if (!strcmp(p, "-C")) { RETURN(1); SAVEABLE(1); cfg.compression = 1; } if (!strcmp(p, "-1")) { RETURN(1); SAVEABLE(1); cfg.sshprot = 0; /* ssh protocol 1 only */ } if (!strcmp(p, "-2")) { RETURN(1); SAVEABLE(1); cfg.sshprot = 3; /* ssh protocol 2 only */ } if (!strcmp(p, "-i")) { RETURN(2); SAVEABLE(1); strncpy(cfg.keyfile, value, sizeof(cfg.keyfile)); cfg.keyfile[sizeof(cfg.keyfile)-1] = '\0'; } return ret; /* unrecognised */ } void cmdline_run_saved(void) { int pri, i; for (pri = 0; pri < NPRIORITIES; pri++) for (i = 0; i < saves[pri].nsaved; i++) cmdline_process_param(saves[pri].params[i].p, saves[pri].params[i].value, 0); } Revision-number: 1915 Prop-content-length: 620 Content-length: 620 K 8 svn:date V 27 2002-09-02T13:47:50.000000Z K 7 svn:log V 519 After trying a succession of tests on Jacob's machine, I think I've finally isolated the _important_ difference between Romano Trampus's working printing.c and my failing one: he ignores the error return from the first exploratory how-big-does-my-buffer-need-to-be call to EnumPrinters(), because not having enough buffer space counts as an error condition. Hence I am officially a klutz, but this should now work. (Also reverted ENUM_LEVEL to 1, again, because that seems to be the choice of people whose code works.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 345f4f32a1178d9432474893eb8b04d1 Text-delta-base-sha1: 0b209ec93fa95cbf8bce9ccb4c748d8c2e2b86a5 Text-content-length: 327 Text-content-md5: 5a5f0194d83b07933a6f949d726e68a7 Text-content-sha1: f37026fd512fc17349aeee372bb3b267ec028b01 Content-length: 366 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNSz)758(en0/* * Exploratory call to EnumPrinters to determine how much space * we'll need for the output. Discard the return value since it * will almost certainly be a failure due to lack of space. */ EnumPrinters(param, NULL, ENUM_LEVEL, buffer+offset, 512, &needed, &nprinters) Revision-number: 1916 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:38.691771Z PROPS-END Revision-number: 1917 Prop-content-length: 196 Content-length: 196 K 7 svn:log V 96 Closed "printer list not working properly". Moved "Windows default printer" to a separate wish. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-09-03T10:06:26.000000Z PROPS-END Node-path: putty-wishlist/data/passthru-default-printer Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 311 Text-content-md5: ac7832997321c92086d544b4f9251bd2 Text-content-sha1: ff2dc5b95e09edd7db49fbf6813f63fc916610fe Content-length: 427 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN)))Summary: Pass-through printing: option to go with Windows default printer Class: wish Difficulty: fun Priority: medium Content-type: text/x-html-body

    It's been pointed out that having an option to go with the Windows default printer in Terminal > Remote-controlled printing would be nice. Node-path: putty-wishlist/data/printer-list Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: edaa8f6ecb4ec9fe91fc49549edc895b Text-delta-base-sha1: acaeeea24da68e7f9641cdfc2a32539b19520747 Text-content-length: 83 Text-content-md5: 79fcdd7bd6b097599d24aa6d3aaf7562 Text-content-sha1: fe7a44daf72c0a19cb693a3f9329fa569d70dfe7 Content-length: 122 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN w =+Fixed-in: 2002-09-03Update: fixed as of 2002-09-03. Revision-number: 1918 Prop-content-length: 157 Content-length: 157 K 7 svn:log V 57 This was fixed some time ago but I forgot to mention it. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-09-03T11:55:24.000000Z PROPS-END Node-path: putty-wishlist/data/command-line Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d14d28cfd2b968849d1d9f40d74ee2ab Text-delta-base-sha1: a5f2bd16043893f7fee0e57892a27a9ee9899d25 Text-content-length: 217 Text-content-md5: 1d436501ca844c8f67ada0862330bf1e Text-content-sha1: d516bbb7e48d2ecadff49878dd134b2a1d0c7e28 Content-length: 256 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNh'=rRq)&BFixed-in: 2002-08-10 Interestingly shell32.dll provides a function called CommandLineToArgvW() which does this for Unicode strings, but appears to provide no equivalent for ordinary strings Revision-number: 1919 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.133526Z PROPS-END Revision-number: 1920 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.149085Z PROPS-END Revision-number: 1921 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.157302Z PROPS-END Revision-number: 1922 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.166498Z PROPS-END Revision-number: 1923 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.176367Z PROPS-END Revision-number: 1924 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.188357Z PROPS-END Revision-number: 1925 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.195896Z PROPS-END Revision-number: 1926 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.203508Z PROPS-END Revision-number: 1927 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.211411Z PROPS-END Revision-number: 1928 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.219471Z PROPS-END Revision-number: 1929 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.226608Z PROPS-END Revision-number: 1930 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.233717Z PROPS-END Revision-number: 1931 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:39.240875Z PROPS-END Revision-number: 1932 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2002-09-07T12:27:13.000000Z K 7 svn:log V 128 Increase length limit on SSH1_MSG_DEBUG; 70 chars is short enough to lose vital information in some existing servers' messages. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b207956c0e246f475ebab4f1e5d2ad0c Text-delta-base-sha1: c2b2b031da38aac24dadb46c86bab2f2a6f9ca75 Text-content-length: 188 Text-content-md5: b14aacf898f4c99c3a722b31603a43ab Text-content-sha1: fa33b8a5120604aa4974d796d3c6f5bbf0ad180f Content-length: 229 K 15 cvs2svn:cvs-rev V 5 1.215 PROPS-END SVNhV512]; int stringlen = GET_32BIT(pktin.body); strcpy(buf, "Remote debug message: "); if (stringlen > 480) stringlen = 48uush_compress *pref Revision-number: 1933 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2002-09-08T12:21:59.000000Z K 7 svn:log V 59 Summary: Honour the http_proxy et al environment variables K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/http-proxy-env Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 709 Text-content-md5: 4e884cff488e79812c5cbbbe71a5d1b9 Text-content-sha1: 3a904e0ef1a3ec3f47add69b4b91561abbe92abd Content-length: 825 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN777Summary: Honour the http_proxy et al environment variables Class: wish Difficulty: fun Content-type: text/x-html-body

    It might be nice if at least the command-line tools (plink et al) could honour the commonly used environment variables http_proxy, ftp_proxy, no_proxy (etc?), using them to automatically configure use of PuTTY's HTTP proxy features.

    Of course, there would have to be some obvious and easy way to override this, because in many circumstances it wouldn't be The Right Thing to do.

    I'm not sure whether there are written standards for the names and contents of these variables anywhere or whether they're just defined by common practice. Revision-number: 1934 Prop-content-length: 301 Content-length: 301 K 8 svn:date V 27 2002-09-08T13:09:24.000000Z K 7 svn:log V 200 Add a 'fixed' wish for proxy support. Mainly here to document (my understanding of) the current state of proxy support, because the web site doesn't (except implicitly in the snapshot documentation). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 909 Text-content-md5: 99f1449526233f88b4cfebfe64af822a Text-content-sha1: a6b72600c9bbb7fc4e33e5931f124d77bb066e2d Content-length: 1025 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Support for proxying of connections Class: wish Difficulty: taxing Present-in: 0.52 Fixed-in: 2002-04-28 Content-type: text/x-html-body

    Support for proxies. There are several types of proxy to consider:

    • SOCKS.
    • HTTP CONNECT style proxying (connect to the HTTP port and send something like "CONNECT hostname.example.com:22 HTTP/1.0", then parse the HTTP return headers and go)
    • Simple by-hand proxy: the kind where you telnet to the firewall and type "connect hostname.example.com 22", and then expect a connection to begin.
    We would also want the ability to define non-proxy zones (probably give the user the choice of DNS or IP address space).

    This has all been implemented as of 2002-04-28. The only things left that might be nice to implement are username/password authentication for SOCKS 5 and for HTTP CONNECT proxying. Revision-number: 1935 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2002-09-08T13:25:58.000000Z K 7 svn:log V 77 Update to reflect the last batch of proxy stuff we got from Justin Bradford. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dff3418b944fb9f129c50b5f123f85a1 Text-delta-base-sha1: 0a8e503959ad9b532ed88b59056618c8b064220f Text-content-length: 249 Text-content-md5: c4ca8c05e70271ae0fa63626c772c52e Text-content-sha1: acad1b1bd0d21b2168beba34d3f964233c6a9f75 Content-length: 289 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN>%UV;C|7\versionid $Id: config.but,v 1.36 2002/09/08 13:25:58 jacobonly the \q{Username} box has any effect, and that only for SOCKS 4 proxies. ( [FIXME] No forms of authentication are supported for other types of proxy.) Revision-number: 1936 Prop-content-length: 240 Content-length: 240 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-09-08T13:28:38.000000Z K 7 svn:log V 139 Introduce the Bugs control panel, for overriding PuTTY's server version number checks to determine the presence or absence of server bugs. PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c4ca8c05e70271ae0fa63626c772c52e Text-delta-base-sha1: acad1b1bd0d21b2168beba34d3f964233c6a9f75 Text-content-length: 6228 Text-content-md5: 6a5af2cda5ffc53be452d16663852563 Text-content-sha1: 3f2b01900f3ab6c6ddd4723881795638ea9e7366 Content-length: 6268 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN%j(O;9c7"4YL\versionid $Id: config.but,v 1.37 2002/09/08 13:28:38 simonNote that if you are using SSH1 and the server has a bug that makes it unable to deal with SSH1 ignore messages (see \k{config-ssh-bug-ignore1}), enabling keepalives will have no effectssh-bugs} The Bugs panel Not all SSH servers work properly. Various existing servers have bugs in them, which can make it impossible for a client to talk to them unless it knows about the bug and works around it. Since most servers announce their software version number at the beginning of the SSH connection, PuTTY will attempt to detect which bugs it can expect to see in the server and automatically enable workarounds. However, sometimes it will make mistakes; if the server has been deliberately configured to conceal its version number, or if the server is a version which PuTTY's bug database does not know about, then PuTTY will not know what bugs to expect. The Bugs panel allows you to manually configure the bugs PuTTY expects to see in the server. Each bug can be configured in three states: \b \q{Off}: PuTTY will assume the server does not have the bug. \b \q{On}: PuTTY will assume the server \e{does} have the bug. \b \q{Auto}: PuTTY will use the server's version number announcement to try to guess whether or not the server has the bug. \S{config-ssh-bug-ignore1} \q{Chokes on SSH1 ignore messages} \cfg{winhelp-topic}{ssh.bugs.ignore1} An ignore message (SSH_MSG_IGNORE) is a message in the SSH protocol which can be sent from the client to the server, or from the server to the client, at any time. Either side is required to ignore the message whenever it receives it. PuTTY uses ignore messages to hide the password packet in SSH1, so that a listener cannot tell the length of the user's password; it also uses ignore messages for connection keepalives (see \k{config-keepalive}). If this bug is detected, PuTTY will stop using ignore messages. This means that keepalives will stop working, and PuTTY will have to fall back to a secondary defence against SSH1 password-length eavesdropping. See \k{config-ssh-bug-plainpw1}. If this bug is enabled when talking to a correct server, the session will succeed, but keepalives will not work and the session might be more vulnerable to eavesdroppers than it could be. This is an SSH1-specific bug. No known SSH2 server fails to deal with SSH2 ignore messages. \S{config-ssh-bug-plainpw1} \q{Refuses all SSH1 password camouflage} \cfg{winhelp-topic}{ssh.bugs.plainpw1} When talking to an SSH1 server which cannot deal with ignore messages (see \k{config-ssh-bug-ignore1}), PuTTY will attempt to disguise the length of the user's password by sending additional padding \e{within} the password packet. This is technically a violation of the SSH1 specification, and so PuTTY will only do it when it cannot use standards-compliant ignore messages as camouflage. In this sense, for a server to refuse to accept a padded password packet is not really a bug, but it does make life inconvenient if the server can also not handle ignore messages. If this \q{bug} is detected, PuTTY will have no choice but to send the user's password with no form of camouflage, so that an eavesdropping user will be easily able to find out the exact length of the password. If this bug is enabled when talking to a correct server, the session will succeed, but will be more vulnerable to eavesdroppers than it could be. This is an SSH1-specific bug. SSH2 is secure against this type of attack. \S{config-ssh-bug-rsa1} \q{Chokes on SSH1 RSA authentication} \cfg{winhelp-topic}{ssh.bugs.rsa1} Some SSH1 servers cannot deal with RSA authentication messages at all. If Pageant is running and contains any SSH1 keys, PuTTY will normally automatically try RSA authentication before falling back to passwords, so these servers will crash when they see the RSA attempt. If this bug is detected, PuTTY will go straight to password authentication. If this bug is enabled when talking to a correct server, the session will succeed, but of course RSA authentication will be impossible. This is an SSH1-specific bug. \S{config-ssh-bug-hmac2} \q{Miscomputes SSH2 HMAC keys} \cfg{winhelp-topic}{ssh.bugs.hmac2} Versions 2.3.0 and below of the SSH server software from \cw{ssh.com} compute the keys for their HMAC message authentication codes incorrectly. A typical symptom of this problem is that PuTTY dies unexpectedly at the beginning of the session, saying \q{Incorrect MAC received on packet}. If this bug is detected, PuTTY will compute its HMAC keys in the same way as the buggy server, so that communication will still be possible. If this bug is enabled when talking to a correct server, communication will fail. This is an SSH2-specific bug. \S{config-ssh-bug-derivekey2} \q{Miscomputes SSH2 encryption keys} \cfg{winhelp-topic}{ssh.bugs.derivekey2} Versions below 2.1.0 of the SSH server software from \cw{ssh.com} compute the keys for the session encryption incorrectly. This problem can cause various error messages, such as \q{Incoming packet was garbled on decryption}, or possibly even \q{Out of memory}. If this bug is detected, PuTTY will compute its encryption keys in the same way as the buggy server, so that communication will still be possible. If this bug is enabled when talking to a correct server, communication will fail. This is an SSH2-specific bug. \S{config-ssh-bug-ssh} \q{Requires padding on SSH2 RSA signatures} \cfg{winhelp-topic}{ssh.bugs.rsapad2} Versions below 3.3 of OpenSSH require SSH2 RSA signatures to be padded with zero bytes to the same length as the RSA key modulus. The SSH2 draft specification says that an unpadded signature MUST be accepted, so this is a bug. A typical symptom of this problem is that PuTTY mysteriously fails RSA authentication once in every few hundred attempts, and falls back to passwords. If this bug is detected, PuTTY will pad its signatures in the way OpenSSH expects. If this bug is enabled when talking to a correct server, it is likely that no damage will be done, since correct servers usually still accept padded signatures because they're used to talking to OpenSSH. This is an SSH2-specific bug Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7a084e94653bfeda44bedc42bcb6a0a5 Text-delta-base-sha1: 6b860f0df95a8ef31240fa2c0851911622857b11 Text-content-length: 203 Text-content-md5: 8dda75872d3ceda34b58f538f50619af Text-content-sha1: c347a0104889b8a0f07e931e5c332e0722afc511 Content-length: 244 K 15 cvs2svn:cvs-rev V 5 1.139 PROPS-END SVN/a 1N1bM /* SSH bug compatibility modes */ enum { BUG_AUTO, BUG_OFF, BUG_ON } sshbug_ignore1, sshbug_plainpw1, sshbug_rsa1, sshbug_hmac2, sshbug_derivekey2, sshbug_rsapad2; Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ea0fbd9d90014e56483c06d6ca2c5b6d Text-delta-base-sha1: 8ec8c494fed7d6c7141502585b8ca63cef7c10cc Text-content-length: 963 Text-content-md5: 633a9385df0481b595377b50bde43ba6 Text-content-sha1: df19b8cb8ffacc836bca06544c37ed0a46c2e84e Content-length: 1003 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNeL5: onw write_setting_i(sesskey, "BugIgnore1", cfg->sshbug_ignore1); write_setting_i(sesskey, "BugPlainPW1", cfg->sshbug_plainpw1); write_setting_i(sesskey, "BugRSA1", cfg->sshbug_rsa1); write_setting_i(sesskey, "BugHMAC2", cfg->sshbug_hmac2); write_setting_i(sesskey, "BugDeriveKey2", cfg->sshbug_derivekey2); write_setting_i(sesskey, "BugRSAPad2", cfg->sshbug_rsapad2); gppi(sesskey, "BugIgnore1", BUG_AUTO, &cfg->sshbug_ignore1); gppi(sesskey, "BugPlainPW1", BUG_AUTO, &cfg->sshbug_plainpw1); gppi(sesskey, "BugRSA1", BUG_AUTO, &cfg->sshbug_rsa1); { int i; gppi(sesskey, "BugHMAC2", BUG_AUTO, &cfg->sshbug_hmac2); if (cfg->sshbug_hmac2 == BUG_AUTO) { gppi(sesskey, "BuggyMAC", 0, &i); if (i == 1) cfg->sshbug_hmac2 = BUG_ON; } } gppi(sesskey, "BugDeriveKey2", BUG_AUTO, &cfg->sshbug_derivekey2); gppi(sesskey, "BugRSAPad2", BUG_AUTO, &cfg->sshbug_rsapad2); Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b14aacf898f4c99c3a722b31603a43ab Text-delta-base-sha1: fa33b8a5120604aa4974d796d3c6f5bbf0ad180f Text-content-length: 1549 Text-content-md5: 8ff54c5aabb7a3b1b619ada65fdabef4 Text-content-sha1: fb69f1b453f627e632b9af1b2829b398e2458b09 Content-length: 1590 K 15 cvs2svn:cvs-rev V 5 1.216 PROPS-END SVN98j $dG\{U fWSNucfg.sshbug_ignore1 == BUG_ON || (cfg.sshbug_ignore1 == BUG_AUTO && (!strcmp(imp, "1.2.18") || !strcmp(imp, "1.2.19") || !strcmp(imp, "1.2.20") || !strcmp(imp, "1.2.21") || !strcmp(imp, "1.2.22") || !strcmp(imp, "Cisco-1.25"))cfg.sshbug_plainpw1 == BUG_ON || (cfg.sshbug_plainpw1 == BUG_AUTO && (!strcmp(imp, "Cisco-1.25"))cfg.sshbug_rsa1 == BUG_ON || (cfg.sshbug_rsa1 == BUG_AUTO && (!strcmp(imp, "Cisco-1.25"))cfg.sshbug_hmac2 == BUG_ON || (cfg.sshbug_hmac2 == BUG_AUTO && (!strncmp(imp, "2.1.0", 5) || !strncmp(imp, "2.0.", 4) || !strncmp(imp, "2.2.0", 5) || !strncmp(imp, "2.3.0", 5) || !strncmp(imp, "2.1 ", 4))cfg.sshbug_derivekey2 == BUG_ON || (cfg.sshbug_derivekey2 == BUG_AUTO && (!strncmp(imp, "2.0.", 4))cfg.sshbug_rsapad2 == BUG_ON || (cfg.sshbug_rsapad2 == BUG_AUTO && ((!strncmp(imp, "OpenSSH_2.", 10) && imp[10]>='5' && imp[10]<='9') || (!strncmp(imp, "OpenSSH_3.", 10) && imp[10]>='0' && imp[10]<='2'))))ys=,Z,s *cscomp_tobe = NULL; static const struct ssh_compress *sccomp_tobe = NULL; static char *hostkeydata, *sigdata, *keystr, *fingerprint; static int hostkeylen, siglen; static void *hkey; /* actual host key */ static unsigned char exchange_hash[20]; static unsigned char keyspace[40]; static int n_preferred_ciphers; static const struct ssh2_ciphers *preferred_ciphers[CIPHER_MAX]; static const struct sif (!(ssh_remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b0ae7221e7afc50a0a4d69684a77b983 Text-delta-base-sha1: 73f366db2d8a4fab28df6b33bc782178b3d27862 Text-content-length: 293 Text-content-md5: 3267c8db2c49d6e855e0c787a6d0fc10 Text-content-sha1: 70e75cbad5a32b1e0a8b2e9f97895b0d044a5ed3 Content-length: 333 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN 0;) SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_DELETESTRING, i, 0); for (i = 0; i < 22; i++) if (cfg.bold_colour || permcolour[i]) SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_ADDSTRING, 0, (LPARAM) colours[i]); } SendDlgItemMessage(hwnd, IDC_COLOURLIST, WM_SETREDRAW, TRUE, 0); InvalidateRect(GetDlgItem(hwnd, IDC_COLOURLIST), NULL, TRUE); } break; case IDC_PALETTE cfg.try_palette = IsDlgButtonChecked(hwnd, IDC_PALETTE); break; case IDC_COLOURLIST: if (HIWORD(wParam) == LBN_DBLCLK || HIWORD(wParam) == LBN_SELCHANGE) { int i = SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_GETCURSEL, 0, 0); if (!cfg.bold_colour) i = (i < 3 ? i * 2 : i == 3 ? 5 : i * 2 - 2); SetDlgItemInt(hwnd, IDC_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt(hwnd, IDC_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt(hwnd, IDC_BVALUE, cfg.colours[i][2], FALSE); } break; case IDC_CHANGE { static CHOOSECOLOR cc; static DWORD custom[16] = { 0 }; /* zero initialisers */ int i = SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_GETCURSEL, 0, 0); if (!cfg.bold_colour) i = (i < 3 ? i * 2 : i == 3 ? 5 : i * 2 - 2); cc.lStructSize = sizeof(cc); cc.hwndOwner = hwnd; cc.hInstance = (HWND) hinst; cc.lpCustColors = custom; cc.rgbResult = RGB(cfg.colours[i][0], cfg.colours[i][1], cfg.colours[i][2]); cc.Flags = CC_FULLOPEN | CC_RGBINIT; if (ChooseColor(&cc)) { cfg.colours[i][0] = (unsigned char) (cc.rgbResult & 0xFF); cfg.colours[i][1] = (unsigned char) (cc.rgbResult >> 8) & 0xFF; cfg.colours[i][2] = (unsigned char) (cc.rgbResult >> 16) & 0xFF; SetDlgItemInt(hwnd, IDC_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt(hwnd, IDC_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt(hwnd, IDC_BVALUE, cfg.colours[i][2], FALSE); } } break; case IDC_CODEPAGE: if (HIWORD(wParam) == CBN_SELCHANGE) { int index = SendDlgItemMessage(hwnd, IDC_CODEPAGE, CB_GETCURSEL, 0, 0); SendDlgItemMessage(hwnd, IDC_CODEPAGE, CB_GETLBTEXT, index, (LPARAM)cfg.line_codepage); } else if (HIWORD(wParam) == CBN_EDITCHANGE) { GetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage, sizeof(cfg.line_codepage) - 1); } else if (HIWORD(wParam) == CBN_KILLFOCUS) { strcpy(cfg.line_codepage, cp_name(decode_codepage(cfg.line_codepage))); SetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage); } break; case IDC_PRINTER: if (HIWORD(wParam) == CBN_SELCHANGE) { int index = SendDlgItemMessage(hwnd, IDC_PRINTER, CB_GETCURSEL, 0, 0); SendDlgItemMessage(hwnd, IDC_PRINTER, CB_GETLBTEXT, index, (LPARAM)cfg.printer); } else if (HIWORD(wParam) == CBN_EDITCHANGE) { GetDlgItemText(hwnd, IDC_PRINTER, cfg.printer, sizeof(cfg.printer) - 1); } if (!strcmp(cfg.printer, PRINTER_DISABLED_STRING)) *cfg.printer = '\0'; break; case IDC_CAPSLOCKCYR { cfg.xlat_capslockcyr = IsDlgButtonChecked (hwnd, IDC_CAPSLOCKCYR); } break; case IDC_VTXWINDOWS: case IDC_VTOEMANSI: case IDC_VTOEMONLY: case IDC_VTPOORMAN: case IDC_VTUNICODE: cfg.vtmode = (IsDlgButtonChecked(hwnd, IDC_VTXWINDOWS) ? VT_XWINDOWS : IsDlgButtonChecked(hwnd, IDC_VTOEMANSI) ? VT_OEMANSI : IsDlgButtonChecked(hwnd, IDC_VTOEMONLY) ? VT_OEMONLY : IsDlgButtonChecked(hwnd, IDC_VTUNICODE) ? VT_UNICODE : VT_POORMAN); break; case IDC_X11_FORWARDx11_forward = IsDlgButtonChecke case IDC_BUGD_IGNORE1: if (HIWORD(wParam) == CBN_SELCHANGE) { int index = SendDlgItemMessage(hwnd, IDC_BUGD_IGNORE1, CB_GETCURSEL, 0, 0); cfg.sshbug_ignore1 = (index == 0 ? BUG_AUTO : index == 1 ? BUG_OFF : BUG_ON); } break; case IDC_BUGD_PLAINPW1: if (HIWORD(wParam) == CBN_SELCHANGE) { int index = SendDlgItemMessage(hwnd, IDC_BUGD_PLAINPW1, CB_GETCURSEL, 0, 0); cfg.sshbug_plainpw1 = (index == 0 ? BUG_AUTO : index == 1 ? BUG_OFF : BUG_ON); } break; case IDC_BUGD_RSA1: if (HIWORD(wParam) == CBN_SELCHANGE) { int index = SendDlgItemMessage(hwnd, IDC_BUGD_RSA1, CB_GETCURSEL, 0, 0); cfg.sshbug_rsa1 = (index == 0 ? BUG_AUTO : index == 1 ? BUG_OFF : BUG_ON); } break; case IDC_BUGD_HMAC2: if (HIWORD(wParam) == CBN_SELCHANGE) { int index = SendDlgItemMessage(hwnd, IDC_BUGD_HMAC2, CB_GETCURSEL, 0, 0); cfg.sshbug_hmac2 = (index == 0 ? BUG_AUTO : index == 1 ? BUG_OFF : BUG_ON); } break; case IDC_BUGD_DERIVEKEY2: if (HIWORD(wParam) == CBN_SELCHANGE) { int index = SendDlgItemMessage(hwnd, IDC_BUGD_DERIVEKEY2, CB_GETCURSEL, 0, 0); cfg.sshbug_derivekey2 = (index == 0 ? BUG_AUTO : index == 1 ? BUG_OFF : BUG_ON); } break; case IDC_BUGD_RSAPAD2: if (HIWORD(wParam) == CBN_SELCHANGE) { int index = SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2, CB_GETCURSEL, 0, 0); cfg.sshbug_rsapad2 = (index == 0 ? BUG_AUTO : index == 1 ? BUG_OFF : BUG_ON) Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e2596a3129a0ef7feba0116c31f36917 Text-delta-base-sha1: a156b1664497cc62ae4d631af7a22d1f78a3a8ef Text-content-length: 104 Text-content-md5: 680d5dca8036ea19d944f515298366ab Text-content-sha1: 4d95162a6ac198be8a1896f5f7eaf321722ebc26 Content-length: 144 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNZ5 R.R5%staticddl(struct ctlpos *cp, char *stext, int sid, int lid, int percentlis Revision-number: 1937 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2002-09-08T14:04:49.000000Z K 7 svn:log V 39 Add reference to IETF SECSH discussion K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-kex-data Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 09e011f90ca9c7bfde1aec5d20656aef Text-delta-base-sha1: ce9f9ac14be9571d4a8109fbf6472de6f7b543ab Text-content-length: 260 Text-content-md5: 90348988ee33d1aa6079f0ab462ca611 Text-content-sha1: 5e6969f99f086c59e030e52a093ff349b5cc7a01 Content-length: 299 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN"q"q

    There has been some discussion of this issue on IETF SECSH (see for instance the thread "Key Re-Exchange" starting on 4 Apr 2001), but no consensus appears to have been reached. Revision-number: 1938 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2002-09-08T14:07:44.000000Z K 7 svn:log V 26 *** empty log message *** K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 99f1449526233f88b4cfebfe64af822a Text-delta-base-sha1: a6b72600c9bbb7fc4e33e5931f124d77bb066e2d Text-content-length: 24 Text-content-md5: 8f59ac8e352a0386c4b8cdcb138f4b2f Text-content-sha1: 85fd888eb7c2e0d6a43ad53c252f6d1b30bf7a55 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNF4Kricky Revision-number: 1939 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 40 I think we can claim this is fixed now. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-09-08T14:24:52.000000Z PROPS-END Node-path: putty-wishlist/data/key-formats Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a4a3fbeff13ce495cc604c13ad32684e Text-delta-base-sha1: db41d33286e6d434ec54ae6401b3da8838f43caa Text-content-length: 150 Text-content-md5: 28f7a11be00dacafc89c6d0e97af2299 Text-content-sha1: 6c9baed457e4c5baa37397c48b9f8efac08c5591 Content-length: 189 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNn o1nlFixed-in: 2002-06-15Update: As of 2002-06-15, PuTTYgen supports import/export of both OpenSSH and ssh.com key formats. Revision-number: 1940 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2002-09-08T14:29:48.000000Z K 7 svn:log V 32 Add note about protocol support K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/line-endings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 444d9a10f90362b2d5bd890c1f5aa725 Text-delta-base-sha1: 860a3199b925f624383216c4a01657a0abd5d033 Text-content-length: 216 Text-content-md5: 909624bbdff5897fde24ef9fc5fc26b7 Text-content-sha1: 8699d15e06598d95cf76038af0603307dd5a9f0f Content-length: 255 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNx- BO\B

    Of course, it would be good to have protocol support rather than having to rely on heuristics, but the last discussion on IETF SECSH about adding this to SFTP didn't come to any consensus. Revision-number: 1941 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 Typos, add ref to FAQ K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-09-08T14:39:46.000000Z PROPS-END Node-path: putty-wishlist/data/pageant-hibernate Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d88a646e795e14cb3cb5efaec9451b95 Text-delta-base-sha1: c9c4002d6ddb3c4e84fe03122accefa659a0285c Text-content-length: 138 Text-content-md5: f6122249f5f0a6c35e2d266c40f515ed Text-content-sha1: 75598e5b815993ae7b5812a8b6f84f03d2381f31 Content-length: 177 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN` sl"qdanywaythe FAQ.

  • Revision-number: 1942 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2002-09-08T14:44:28.000000Z K 7 svn:log V 17 Mention PocketPC K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ports Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7f019743ff8520b4d211aeb8ead1d373 Text-delta-base-sha1: 0a12c351a519ec92ae9ee26d1529d1d59ef003f7 Text-content-length: 160 Text-content-md5: 661dd76733f64608461b419f8f380751 Text-content-sha1: 528dbd1b3774370b55504cb2d4d8dad7a5c4db1e Content-length: 199 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN- y *t (aka PocketPC), and/or EPOC or other PDA operating systems. Decent SSH clients for PDAs seem to be in short supply (unless you install a Revision-number: 1943 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2002-09-08T15:29:03.000000Z K 7 svn:log V 41 Add link from Mac port to remove-statics K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ports Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 661dd76733f64608461b419f8f380751 Text-delta-base-sha1: 528dbd1b3774370b55504cb2d4d8dad7a5c4db1e Text-content-length: 138 Text-content-md5: 73f538371542b2aa08facfc9ee8b4649 Text-content-sha1: 586c75198232ad7782350832189ac4bc15637f50 Content-length: 177 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN-# titFgIt would probably benefit from removal of global storage (see wish remove-statics) Revision-number: 1944 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2002-09-08T15:30:07.000000Z K 7 svn:log V 16 Clarify summary K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rsa-verify-failed Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 87f1f28360b2b51a0d78c94bfdfa0c70 Text-delta-base-sha1: 50b04b2a9f35a2f9119d780cadda921350ac16b7 Text-content-length: 88 Text-content-md5: 220bab07fbedd0abfc09f799b737e107 Text-content-sha1: ca07ede0f5e4f0bcceb15b919c1250b4ad70400f Content-length: 127 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNsGG:9Summary: Occasional `Access denied' / `RSA_verify failed' (OpenSSH bug) Revision-number: 1945 Prop-content-length: 129 Content-length: 129 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-09-08T15:42:09.000000Z K 7 svn:log V 29 "1 only" is now implemented. PROPS-END Node-path: putty-wishlist/data/ssh2-only Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 846b232a76dd1fbc0fc986093acb6161 Text-delta-base-sha1: 86889282df8bd76097898357a3859d453ff00cb7 Text-content-length: 25 Text-content-md5: fd544e89a4a1f1e0e913fc32947468d2 Text-content-sha1: 1059ae471e1ebb0aee2d2b1105ef2511c578ad53 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNpj b8-08 Revision-number: 1946 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:40.072366Z PROPS-END Revision-number: 1947 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 ...still out there... K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-09-09T10:45:19.000000Z PROPS-END Node-path: putty-wishlist/data/nonexistent-channel Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ee3a21b20376dd8ce5b198c62ed85717 Text-delta-base-sha1: ad0cd2d1996b2eb2767c4ed426deea1b5119008b Text-content-length: 410 Text-content-md5: 1ba2fa0dc055202aaad3ce41510ddfb1 Text-content-sha1: 42a0d6f26d2bf943f4ba8e8446d929df66df804f Content-length: 449 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN3+ 'zpSummary: `nonexistent channel -1' crashes Class: bug Priority: high Content-type: text/x-html-body Present-in: 0.52 2002-03-14 2002-07-04 2002-09-07reports that the `ieof' variant at least is still out there (in 2002-07-04 and 2002-09-07).
    • OAEBLEDJOCNMIAODAMHBOEHIFDAA.ewang@collectivebid.com
    • 015601c2567e$edff1320$ef00000a@rop (with SSH packet dump)
    Revision-number: 1948 Prop-content-length: 250 Content-length: 250 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-09-09T14:44:10.000000Z K 7 svn:log V 149 Modified in light of new "bugs" panel. (OK, so there isn't _currently_ a snapshot with this functionality, but hopefully there will be by tomorrow.) PROPS-END Node-path: putty-wishlist/data/vshell-no-bug-compat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a4b2e75287fea2755c5b7fcb54f6bbcf Text-delta-base-sha1: 1c99fe99d062b090082501024edb3c7407b962b0 Text-content-length: 385 Text-content-md5: f618319636c1efab75c92fefa5bbe739 Text-content-sha1: 175e2d1f8ae98c7d0db45f4f3ef38f9995623460 Content-length: 424 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN \nnnA workaround in the current snapshots is to manually turn off detection of the bug (SSH / Bugs panel, "Miscomputes SSH2 HMAC keys").

    A better solution would be to use the wildcard engine we already have for PS*P internally to match version strings. (This depends on our being able to reconstruct exactly which version strings we should be matching, of course!) Revision-number: 1949 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2002-09-10T12:30:45.000000Z K 7 svn:log V 72 Note about separate client-server and server-client encryption in SSH-2 K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6a5af2cda5ffc53be452d16663852563 Text-delta-base-sha1: 3f2b01900f3ab6c6ddd4723881795638ea9e7366 Text-content-length: 368 Text-content-md5: 40f57a003dae9cc64604a4585641f8be Text-content-sha1: 4c67aa6fd809a5c2c971037ba81164a1170481cc Content-length: 408 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNjSJ;h\versionid $Id: config.but,v 1.38 2002/09/10 12:30:45 jacobIn SSH-2, the encryption algorithm is negotiated independently for each direction of the connection, although PuTTY does not support separate configuration of the preference orders. As a result you may get two warnings similar to the one above, possibly with different encryptions Revision-number: 1950 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:40.291872Z PROPS-END Revision-number: 1951 Prop-content-length: 531 Content-length: 531 K 8 svn:date V 27 2002-09-11T17:30:36.000000Z K 7 svn:log V 430 Updated usage messages for command-line utilities to reflect new options. Updated manual to reflect reality (e.g. usage messages, '-p port' not actually implemented, sprinkle references to '-i keyfile'). (I've put "Release 0.53" in the messages; let's hope this doesn't cause a flood of "where is 0.53?" email.) I don't guarantee that the result is entirely sane and sensible in all respects, but it is at least consistent. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 802880c61d2875b9b916f056de9417a6 Text-delta-base-sha1: 0158d513f8d8fee00a3c1ba452ab1ea2451d9377 Text-content-length: 185 Text-content-md5: 6c01cd8283d9bc70b698317f035ee7d3 Text-content-sha1: 7668bc5af620336d8f143b641e63b9c2cf9df3fa Content-length: 224 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN;! !K;f5\versionid $Id: pageant.but,v 1.8 2002/09/11 17:30:36 jacob (Alternatively, you can use the \c{-A} command line option; see \k{using-cmdline-agent} for details.) Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4e5d1e5c47dbe80b3a592e663a25559f Text-delta-base-sha1: 40203b79146ef180319e9202a8f5df532da65e54 Text-content-length: 1094 Text-content-md5: 12064a6ea1e43d8de92d7117f2aaff83 Text-content-sha1: a92b8e2ee0d4b3e6f3e3cf7c9a6edbdbe70e5e7b Content-length: 1134 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNBT -U:sRp\versionid $Id: plink.but,v 1.17 2002/09/11 17:30:36 jacob3 \c Usage: plink [options] [user@]host [command] \c ("host" can also be a PuTTY saved session name) \c Options: \c -v show verbose messages \c -load sessname Load settings from saved session \c -ssh -telnet -rlogin -raw \c force use of a particular protocol (default SSH) \c -P port connect to specified port \c -l user connect with specified username \c -m file read remote command(s) from file \c -batch disable all interactive prompts \c The following options only apply to SSH connections: \c -pw passw login with specified password \c -L listen-port:host:port Forward local port to remote address \c -R listen-port:host:port Forward remote port to local address \c -X -x enable / disable X11 forwarding \c -A -a enable / disable agent forwarding \c -t -T enable / disable pty allocation \c -1 -2 force use of particular protocol version \c -C enable compression \c -i key private key file for authentication Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c031e7230f76fcca0ba1932a41280f08 Text-delta-base-sha1: 44e69e30f68fc25eb8ccca54add02c699df0ede3 Text-content-length: 802 Text-content-md5: 6bfb1023651801a1b8db6fdead0f0410 Text-content-sha1: 69a5a7a58d256f45d0a21fb519a59405f6cbb462 Content-length: 842 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN~x"tB9wdp+h#= 9E\versionid $Id: pscp.but,v 1.22 2002/09/11 17:30:36 jacob3 \c Usage: pscp [options] [user@]host:source target \c pscp [options] source [source...] [user@]host:target \c load sessname Load settings from saved session \c -P port connect to specified port \c -l user connect with specified username \c -pw passw login with specified password \c -1 -2 force use of particular SSH protocol version \c -C enable compression \c -i key private key file for authentication \c -batch disable all interactive prompts \c -unsafe allow server-side wildcards (DANGEROUS)hreeyou can supply the name of a private key file on the command line, with the \c{-i} option. See \k{using-cmdline-identity} for more information. Thir Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b559b5f38705a21ae507491dcbe003b5 Text-delta-base-sha1: f85395116e3ec12857046df315dda72c98f172ec Text-content-length: 198 Text-content-md5: d4b2d8207fb68f66e01fe28bf52a8fdc Text-content-sha1: 283ad51a304ddce897318c24f5eb28e290ec7251 Content-length: 238 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNx$Q;h]m\versionid $Id: pubkey.but,v 1.18 2002/09/11 17:30:36 jacobany of threeSpecify the key file on the command line with the \c{-i} option. See \k{using-cmdline-identit Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 867f24c56f83d436065460ae596412a5 Text-delta-base-sha1: 45b83a7c33497380c0d836e3a66cfd7a0297e09d Text-content-length: 438 Text-content-md5: 70cf421f27cca80a6bbd9db69155f452 Text-content-sha1: 09e4c94ec2741cd572f44cd1ef15a8d2d3844ca1 Content-length: 477 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNh)c9i#`*xu%C\versionid $Id: using.but,v 1.8 2002/09/11 17:30:36 jacoboverrides these settings if supplied. Also, you can specify a protocol, which will override the P}: specify a port number The \c{-P} option is used to specify the port number to connect to. If you have a Telnet server running on port 9696 of a machine instead of port 23, for example: \c putty -telnet -P 9696 host.name \c plink -telnet -P Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5dcce958af600cdb6ae67a4ef8e101c2 Text-delta-base-sha1: 66e2b8ccb8fe01d6a1e252ab62a94ca44fff03bb Text-content-length: 806 Text-content-md5: 672ceb34a8005e327ecdeccc400ee568 Text-content-sha1: 2b6485f9feadbd44523ec035984cd92722847b91 Content-length: 846 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVND|y*L9iPp)~f'load sessname Load settings from saved session\n"); printf(" -ssh -telnet -rlogin -raw\n"); printf(" force use of a particular protocol (default SSH)l user connect with specified username\n"); printf(" -m file read remote command(s) from file\n"); printf(" -batch disable all interactive prompts\n"); printf("The following options only apply to SSH connections:printf(" -X -x enable / disable X11 forwarding\n"); printf(" -A -a enable / disable agent forwarding\n"); printf(" -t -T enable / disable pty allocation\n"); printf(" -1 -2 force use of particular protocol version\n"); printf(" -C enable compression\n"); printf(" -i key private key file for authentication Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 23f6ddefe71a03c2bc74e59f88476b0c Text-delta-base-sha1: 8675219b00b0b5a597f14db1d514f48e97ea8dc8 Text-content-length: 381 Text-content-md5: fd049b71faff54549e47e79aa6aaaced Text-content-sha1: d43d5e442c29ff2450b6088994171c0ca40f99ef Content-length: 421 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVND=Zl|nNvload sessname Load settings from saved session\n"); printf(" -l user connect with specified usernameprintf(" -1 -2 force use of particular SSH protocol version\n"); printf(" -C enable compression\n"); printf(" -i key private key file for authentication\n"); printf(" -batch disable all interactive prompts Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 37f8a228044d6bb864adb49df38c9295 Text-delta-base-sha1: c1107723d5efa7001c1251cd7804d3da1f535ead Text-content-length: 498 Text-content-md5: 4944068ef579b675a43949e8329fb32d Text-content-sha1: deabd8bd642b70296972996f139cf071ddcafc28 Content-length: 538 K 15 cvs2svn:cvs-rev V 4 1.87 PROPS-END SVN}VDVc!load sessname Load settings from saved session\n"); printf(" -P port connect to specified port\n"); printf(" -l user connect with specified username\n"); printf(" -pw passw login with specified password\n"); printf(" -1 -2 force use of particular SSH protocol version\n"); printf(" -C enable compression\n"); printf(" -i key private key file for authentication\n"); printf(" -batch disable all interactive prompts Revision-number: 1952 Prop-content-length: 309 Content-length: 309 K 8 svn:date V 27 2002-09-12T16:05:05.000000Z K 7 svn:log V 208 Semi-bug "long-usernames": Bump username storage from 32 to 100 chars. Also replaced a couple of magic numbers with sizeof in ssh.c. I don't believe this is going to startle any of the protocols PuTTY talks. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8dda75872d3ceda34b58f538f50619af Text-delta-base-sha1: c347a0104889b8a0f07e931e5c332e0722afc511 Text-content-length: 55 Text-content-md5: f72eaf384196e9df01f5da8d6c962a48 Text-content-sha1: dd6b51cfc794e8ae3ce701a988e19444cabb5978 Content-length: 96 K 15 cvs2svn:cvs-rev V 5 1.140 PROPS-END SVNac :'100]; char localusername[100 Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8ff54c5aabb7a3b1b619ada65fdabef4 Text-delta-base-sha1: fb69f1b453f627e632b9af1b2829b398e2458b09 Text-content-length: 183 Text-content-md5: 34be4ebe180c3500bdeac1dd12914940 Text-content-sha1: 7c24e534f203cff11c9d1fb32353b2787aa1260f Content-length: 224 K 15 cvs2svn:cvs-rev V 5 1.217 PROPS-END SVN 3?#sizeof(username)); username[sizeof(username)-1y5QUjtatic const struct ssh_compressizeof(username)); username[sizeof(username)-1 Revision-number: 1953 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2002-09-12T16:08:48.000000Z K 7 svn:log V 35 Just checked in a fix for this one K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/long-usernames Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0dc28331bca76bc0f796b1255bc38795 Text-delta-base-sha1: 6e097f99c8516c6072ee7ed52ba7b8ef8ffc8f54 Text-content-length: 74 Text-content-md5: 5789d04dd715f6bf5cdfbe0bee3ef3c4 Text-content-sha1: 761a1cbd650b32f2ed17fb50ae50e13d9eb74b79 Content-length: 113 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNi 6xrwFixed-in: 2002-09-13

    Now increased to ~100 chars. Revision-number: 1954 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2002-09-12T22:53:57.000000Z K 7 svn:log V 31 may as well give it a priority K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/http-proxy-env Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4e884cff488e79812c5cbbbe71a5d1b9 Text-delta-base-sha1: 3a904e0ef1a3ec3f47add69b4b91561abbe92abd Text-content-length: 32 Text-content-md5: 855d687e4abc7b08f68fce321b46b7da Text-content-sha1: a298503aeeac4e11465bd5d814433565ef502ef9 Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN7E WaVPriority: low Revision-number: 1955 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2002-09-12T22:56:53.000000Z K 7 svn:log V 35 Note about new command line syntax K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-shortcut Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2b2ab39398d798f7e98e748154fa0472 Text-delta-base-sha1: df94a5845422c93c019467757002d07dcd13411d Text-content-length: 177 Text-content-md5: fbf8085e5fe450f8298d8a3267e02ed0 Text-content-sha1: 05897bd1d7fbc917d139d374891d6ade2fe6526e Content-length: 216 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNrr

    Workaround: the current development snapshots support an alternative syntax putty -load session (and indeed deprecate the old @ syntax). Revision-number: 1956 Prop-content-length: 141 Content-length: 141 K 7 svn:log V 41 Summary: Use of IP type-of-service field K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-09-12T23:13:18.000000Z PROPS-END Node-path: putty-wishlist/data/ip-tos Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1025 Text-content-md5: cbb5d27359aa0e7c66774934f0ce5a2d Text-content-sha1: 37d4432613d1e576bbb86321e663ef6edda2ab77 Content-length: 1141 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNsssSummary: Use of IP type-of-service field Priority: low Class: wish Difficulty: tricky Content-type: text/x-html-body

    We've had a very few requests for the PuTTY suite to make use of the IP type-of-service (ToS) field - apparently it does make a practical difference to a few people using traffic shapers to sort interactive/bulk traffic.

    Some thought needs to be given to this: PuTTY terminal sessions are obviously `interactive' traffic, PSCP/PSFTP are `bulk', but Plink could be either depending on usage, as could random port-forwardings, so it would probably need to be configurable.

    Useful references: MS KB Q196358 and Q248611 (which indicates that on Win2K, a registry entry needs to be set to allow user programs to set the ToS).

    This probably can't be set on Windows <2000. Also, not sure how this interacts with DiffServ. Revision-number: 1957 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2002-09-13T14:37:49.000000Z K 7 svn:log V 52 Summary: PSCP ballooning on large files (fixed bug) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pscp-memory-leak Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 436 Text-content-md5: 9d43a73ef4cb3d53e31efd1ab8f75bd4 Text-content-sha1: 4ae0a608a2db63c94247fc4a8339f24ae976824c Content-length: 552 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN&&&Summary: PSCP ballooning on large files Class: bug Present-in: 0.52 Fixed-in: 2002-03-02 Content-type: text/x-html-body

    We've had numerous reports of a memory leak in PSCP 0.52 such that its memory consumption would grow with the quantity of data transferred.

    A big memory leak in sftp.c was fixed 2002-03-01. This would show up in PSCP when it chose to use the SFTP backend (most often with SSH-2 connections). Revision-number: 1958 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2002-09-14T10:24:27.000000Z K 7 svn:log V 53 OpenSSH vs OpenSSL Q: mention older OpenSSH versions K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 27ab33adf4458c1fdd38a915b07f5def Text-delta-base-sha1: aade0bd342af49dc6d9d61fb0462eb1204a244bc Text-content-length: 250 Text-content-md5: a83e605060f14198ae5cbfa5cd92f8af Text-content-sha1: c5e429e7e297a066aa2b7c21c81871fbb4519ffd Content-length: 290 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNN}]%2+{S\versionid $Id: faq.but,v 1.35 2002/09/14 10:24:27e{Other versions:} we occasionally get reports of the same symptom and workarounds with older versions of OpenSSH, although it's not clear the underlying cause is the same Revision-number: 1959 Prop-content-length: 229 Content-length: 229 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-09-14T10:33:17.000000Z K 7 svn:log V 128 Rework to make sub-categorisation easier + categories separating out fixed bugs and further dividing up the ponderous Wishlist. PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d82409c27d163897e3568670a4128951 Text-delta-base-sha1: b27872177e6ac52c36d79c967c014b489ae78cca Text-content-length: 4203 Text-content-md5: 0422cb332325dfc0f4cefb00c27c5738 Text-content-sha1: 722b8f651ea77f3ab66600dbd7cf9e8072908869 Content-length: 4242 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN}Coc`_{\\J@?el8 do/\NJ3}#! /usr/bin/perl # $Id: bugs2html,v 1.9 2002/09/14 10:33:17 jacob Exp $ use FileHandle; use POSIX; use Englishmy @headers = (); my $prlevel = my $level = 0; my %bugs = (); $INPUT_RECORD_SEPARATOR = undef;my $data = ; close BF; my ($bugname) = $bugfile =~ m{([^/]*)$}; my ($hdr, $body) = $data =~ /^(.*?\n)\n(.*)$/s; $hdr =~ s/\n\s+/ /g; my @hdrs = split /\n/, $hdr; my %hdrs = map { /^(\S*?):\s*(.*)$/; (lc $1, $2) } @hdrs; $bugs{$bugname} = \%hdrs; bug2html($bugname, \%hdrs, $body); } my @fullbuglist = keys %bugs nest(<

    Fixed things

    These are items we believe to be already fixed in the development snapshots. EOF my @fixed = grep(exists($bugs{$_}->{"fixed-in"}), @fullbuglist); nest(<Bugs (and semi-bugs)

      EOF my @tmp = grep(($bugs{$_}->{class} eq 'bug' || $bugs{$_}->{class} eq 'semi-bug'), @fixed); subtractbugs(\@fullbuglist, printbugs(\@tmp)); unnest("
    \n"); nest(<Wishes
      EOF my @tmp = grep(($bugs{$_}->{class} eq 'wish'), @fixed); subtractbugs(\@fullbuglist, printbugs(\@tmp)); unnest("
    \n"); nest(<{class} eq 'bug'), @fullbuglist); subtractbugs(\@fullbuglist, \@buglist); my @tmp = grep(($bugs{$_}->{priority} eq 'high'), @buglist); subtractbugs(\@buglist, printbugs(\@tmp, 1)); printbugs(\@buglist); unnest("\n"); nest(<{class} eq 'semi-bug'), @fullbuglist); subtractbugs(\@fullbuglist, printbugs(\@tmp)); unnest("\n"); nest(<{class} eq 'wish'), @fullbuglist); nest(< Features we'd like to include in the next release:
      EOF my @tmp = grep(($bugs{$_}->{priority} eq 'high'),@wishlist); subtractbugs(\@fullbuglist, printbugs(\@tmp)); unnest("
    \n"); nest(< Plausible features we hope to get round to adding at some point:
      EOF my @tmp = grep(($bugs{$_}->{priority} eq 'medium'),@wishlist); subtractbugs(\@fullbuglist, printbugs(\@tmp)); unnest("
    \n"); nest(< Features we're not sure about, or which probably won't get added unless someone else does the hard work:
      EOF my @tmp = grep(($bugs{$_}->{priority} eq 'low'),@wishlist); subtractbugs(\@fullbuglist, printbugs(\@tmp)); unnest("
    \n"); nest(<Non-wish list

    These are features we are actively opposed to seeing in PuTTY. Don't bother writing them and sending them to us! If you think you have a good argument why they would be good, feel free to plead for them, but generally I'll already have a good reason not to do them.

      EOF my @tmp = grep(($bugs{$_}->{priority} eq 'never'),@wishlist); subtractbugs(\@fullbuglist, printbugs(\@tmp)); unnest("
    \n"); unnest(""); nest(<Miscellaneous

    Miscategorised bugs/wishes.

      EOF printbugs(\@fullbuglist); unnest("
    \n"); unnest(<close INDEX; sub nest { my($header) = @_; push @headers, $header; $level++; } sub print_hdrs { for (my $i = $prlevel; $i < $level; $i++) { print INDEX $headers[$i]; } $prlevel = $level; } sub unnest { my($trailer) = @_; $level--; if ($prlevel > $level) { print INDEX $trailer; $prlevel = $level; } pop @headers; } sub printbugs { my ($buglist, $bold) = @_; $bold = 0 unless defined($bold); return unless @$buglist; print_hdrs(); foreach $bug (sort @$buglist) { print INDEX bugdesc($bug, $bold); } return $buglist; } sub subtractbugs { my ($from, $buglist) = @_; my %del = (); map { $del{$_}=1 } @$buglist; @$from = grep ((!exists($del{$_})), @$from); return $from; } sub bugdesc { my ($bugname, $bold) = @_; $bold = 0 unless defined($bold); if ($bold) { return qq[
  • $bugname: ] . qq[$bugs{$bugname}->{summary}\n]; } else { return qq[
  • $bugname: ] . qq[$bugs{$bugname}->{summary}\n]; } } Revision-number: 1960 Prop-content-length: 267 Content-length: 267 K 8 svn:date V 27 2002-09-15T13:21:32.000000Z K 7 svn:log V 166 Log file tinkering: copy Event Log entries into the SSH packet log, so that when people send us a packet log they never forget to send the Event Log alongside it :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 30e5f9dbcd07c4c5ade1eb911f5e91fe Text-delta-base-sha1: ac23eab42d01593257cbcebfe3fa787831239ca5 Text-content-length: 332 Text-content-md5: e7a47e60429682242389e6caa9a790ff Text-content-sha1: fc38498b6bd5b665c0800f5e86b0dcf100999b6e Content-length: 371 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNX(0jWY}YRY/$M%  frEvent Log entry (used in SSH packet logging mode). */ void log_eventlog(char *event) { fprintf(lgfp, "Event Log: %s\n", event);/* Prevent repeat calls */ if (lgfp) return sprintf(buf, "%s session log (%s mode) to file cfg.logtype == LGTYP_PACKETS ? "SSH packets Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f72eaf384196e9df01f5da8d6c962a48 Text-delta-base-sha1: dd6b51cfc794e8ae3ce701a988e19444cabb5978 Text-content-length: 45 Text-content-md5: aff5e97a61f716d0b74cecb7c57717a1 Text-content-sha1: d4408274e3996fd6a00b53e71bc830b249c391bd Content-length: 86 K 15 cvs2svn:cvs-rev V 5 1.141 PROPS-END SVNc oteventlog(char *string) Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4ed4907a3f59e1068c7c5fff87900108 Text-delta-base-sha1: 72879623e112030bcfb6a05f912240d0b0f53a98 Text-content-length: 59 Text-content-md5: 34ed5000a3ecd3bdb29c622f2b60ba20 Text-content-sha1: bc904645ec6ce0fe6187853240ac1a97ae708167 Content-length: 100 K 15 cvs2svn:cvs-rev V 5 1.188 PROPS-END SVN 1[*log_eventlog(string) Revision-number: 1961 Prop-content-length: 577 Content-length: 577 K 7 svn:log V 476 Improvements to SSH1 channel close handling: track sending and receiving of CLOSE and CLOSE_CONFIRMATION separately rather than taking short cuts. I believe ssh-1.2.33 sending CLOSE_CONFIRMATION before CLOSE was causing the remaining incidences of bug `nonexistent-channel'. (ssh-1.2.33 appears to have unilaterally decreed that CLOSE and CLOSE_CONFIRMATION are respectively renamed INPUT_EOF and OUTPUT_CLOSING, hence there is no longer an ordering constraint on them. Bah.) K 10 svn:author V 5 simon K 8 svn:date V 27 2002-09-15T13:24:00.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 34be4ebe180c3500bdeac1dd12914940 Text-delta-base-sha1: 7c24e534f203cff11c9d1fb32353b2787aa1260f Text-content-length: 1244 Text-content-md5: c536c2577f94f30bc1af2f07ecaf1b83 Text-content-sha1: 5520497782517b9d0a1694dc2b1dcdeb218e3e1e Content-length: 1285 K 15 cvs2svn:cvs-rev V 5 1.218 PROPS-END SVN%||lw?c|}G:/* * In SSH1, this value contains four bits: * * 1 We have sent SSH1_MSG_CHANNEL_CLOSE. * 2 We have sent SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION. * 4 We have received SSH1_MSG_CHANNEL_CLOSE. * 8 We have received SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION. * * A channel is completely finished with when all four bits are set. */ /* sent MSG_CLOSE */ c->closes |= (closetype << 2); /* seen this message */ if (!(c->closes & closetype)) { send_packet(pktin.type, PKT_INT, c->remoteid, PKT_END); c->closes |= closetype; /* sent it too */ } if (c->closes == 15545atic int do_ssh2_transport(unsigned char *in, int inlen, int ispkt) { static int i, j, len, nbits, pbits, warn; static char *str; static Bignum p, g, e, f, K; static int kex_init_value, kex_reply_value; static const struct ssh_mac **maclist; static int nmacs; static const struct ssh2_cipher *cscipher_tobe = NULL; static const struct ssh2_cipher *sccipher_tobe = NULL; static const struct ssh_mac *csmac_tobe = NULL; static const struct ssh_mac *scmac_tobe = NULL; s Revision-number: 1962 Prop-content-length: 362 Content-length: 362 K 7 svn:log V 261 Be proactively pedantic about channel-close irregularities: we no longer just sit there like a lemon if we can't find the channel in question, we bomb out and complain. With any luck, remaining problems of this type should be easier to catch under this policy. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-09-15T13:31:11.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c536c2577f94f30bc1af2f07ecaf1b83 Text-delta-base-sha1: 5520497782517b9d0a1694dc2b1dcdeb218e3e1e Text-content-length: 652 Text-content-md5: 5efdc545cacb27396eb09817ac1e0232 Text-content-sha1: c9374d6544fb5c299d246a0265cb38ef4df78876 Content-length: 693 K 15 cvs2svn:cvs-rev V 5 1.219 PROPS-END SVN]bbA2m && ((int)c->remoteid) != -1 else { bombout(("Received CHANNEL_CLOSE%s for %s channel %d\n", pktin.type == SSH1_MSG_CHANNEL_CLOSE ? "" : "_CONFIRMATION", c ? "half-open" : "nonexistent", i));4qoaM5 SHA_Init(&s); if (!(ssh_remote_bugs & BUG_SSH2_DERIVEKEY)) sha_mpint(&s, K); SHA_Bytes(&s, H, 20); SHA_Bytes(&s, keyspace, 20); SHA_Final(&s, keyspace + 20); } /* * Handle the SSH2 transport layer. */ st || ((int)c->remoteid) == -1) { bombout(("Received CHANNEL_CLOSE for %s channel %d\n", c ? "half-open" : "nonexistent", i)); } Revision-number: 1963 Prop-content-length: 272 Content-length: 272 K 8 svn:date V 27 2002-09-15T22:18:02.000000Z K 7 svn:log V 171 Jordan Russell's mysterious workaround for an almost equally mysterious Windows GDI bug. Looks unlikely to cause any other trouble and it's pretty small, so it can go in. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 028faca5eafcc59c62ad6f1f48fe5068 Text-delta-base-sha1: 433c70ada568d6e93a8bec9675eb21db85bd7662 Text-content-length: 762 Text-content-md5: 9533b5d5c695e6dc7de641d1c3c58306 Text-content-sha1: 4ee5b3fb30832b8dab1d7564046451501cac01ed Content-length: 803 K 15 cvs2svn:cvs-rev V 5 1.201 PROPS-END SVNcc/* * Jordan Russell reports that this apparently * ineffectual IntersectClipRect() call masks a * Windows NT/2K bug causing strange display * problems when the PuTTY window is taller than * the primary monitor. It seems harmless enough... */ IntersectClipRect(hdc, p.rcPaint.left, p.rcPaint.top, p.rcPaint.right, p.rcPaint.bottomkTiik GlobalFree(clipdata); if (clipdata2) GlobalFree(clipdata2); return; } if (!(lock = GlobalLock(clipdata))) return; if (!(lock2 = GlobalLock(clipdata2))) return; memcpy(lock, data, len * sizeof(wchar_t)); WideCharToMultiByte(CP_ACP, 0, data, len, lock2, len2, NULL, NULL); if (cfg.rtf_paste) { wchar_t unitab[256]; char *rtf Revision-number: 1964 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:42.542726Z PROPS-END Revision-number: 1965 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:42.549556Z PROPS-END Revision-number: 1966 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:42.556480Z PROPS-END Revision-number: 1967 Prop-content-length: 357 Content-length: 357 K 8 svn:date V 27 2002-09-18T12:41:43.000000Z K 7 svn:log V 256 Added "terminal emulation in Plink" since it's not mentioned anywhere currently. On the original wishlist, this was effectively "Priority: low", but given that we've since added full-screen mode, I've taken the liberty of changing it to "Priority: never". K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/plink-terminal Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 723 Text-content-md5: 653f54031dce4ae918a8d98dffb73ee3 Text-content-sha1: c250e9693b87900bac9d150859891fec183bc2af Content-length: 839 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNEEESummary: Terminal emulation in Plink Class: wish Difficulty: tricky Priority: never Content-type: text/x-html-body

    Plink is designed as a data transport tool, and is not intended for interactive use; as such it performs no interpretation on the data it transfers.

    However, people occasionally ask for an option in Plink to handle terminal escape codes, so that you get `PuTTY in a console window'.

    Unless there's some good reason why running PuTTY full-screen isn't enough to address this wish, we're unlikely to consider it worth the extra effort and code bloat.

    Perhaps it's possible to augment the Windows console with terminal emulation capabilities à la ANSI.SYS? Revision-number: 1968 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Use memcpy rather than strncpy in sk_addrcopy! How did that happen? K 10 svn:author V 5 simon K 8 svn:date V 27 2002-09-20T17:54:17.000000Z PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b2da5490b2e4bb94d0e02f6c4a7ff41a Text-delta-base-sha1: 7fc1b3ce48dd2465f53c8f05c7b9802994a8099b Text-content-length: 89 Text-content-md5: e191df990e55436c9194e994cc6598ae Text-content-sha1: 48f0a9c9b760c8ada2da3bfdb1505817fdcf5205 Content-length: 129 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN;9 @*@Olmemcpy(buf, (char*) &a.s_addr, 4); #ifdef IPV6 } else { mem Revision-number: 1969 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 Initial checkin of PuTTY installer script and associated files. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-09-20T18:57:05.000000Z PROPS-END Node-path: putty/README.txt Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1305 Text-content-md5: 3f02c6364c742e9ea2429230a6ff7bb9 Text-content-sha1: 815ecf75745bc4ebcb03b7d3bc4d61593e0484c9 Content-length: 1421 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  PuTTY README ============ This is the README file for the PuTTY installer distribution. If you're reading this, you've probably just run our installer and installed PuTTY on your system. What should I do next? ---------------------- If you want to use PuTTY to connect to other computers, or use PSFTP to transfer files, you should just be able to run them from the Start menu. If you want to use the command-line-only file transfer utility PSCP, you will probably want to put the PuTTY installation directory to be on your PATH. How you do this depends on your version of Windows. On Windows NT and 2000, you can set it using Control Panel > System; on Windows 95 you will need to edit AUTOEXEC.BAT. Consult your Windows manuals for details. What do I do if it doesn't work? -------------------------------- The PuTTY home web site is http://www.chiark.greenend.org.uk/~sgtatham/putty/ Here you will find our list of known bugs and pending feature requests. If your problem is not listed in there, or in the FAQ, or in the manuals, read the Feedback page to find out how to report bugs to us. PLEASE read the Feedback page carefully: it is there to save you time as well as us. Do not send us one-line bug reports telling us `it doesn't work'. Node-path: putty/putty.iss Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3110 Text-content-md5: 2a6d3a04d228e0e9179eaab98d7ab713 Text-content-sha1: fa38402205f917655b395c9f760875b5093b8dca Content-length: 3226 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN; -*- no -*- ; putty.iss ; ; -- Inno Setup installer script for PuTTY and its related tools. ; ; TODO for future releases: ; ; - It would be neighbourly to set up an [UninstallRun] entry that ran ; some close cousin of `putty -cleanup', only it should prompt first ; in case the user wants to keep stuff. And make the `leave it alone' ; button the DEFAULT. And perhaps warn that on NT-style systems not ; everything will be caught by this. ; ; - The Quick Launch bar is an interesting thought. Certainly a fair ; number of people actually _believe_ my silly joke about how PuTTY ; is the only thing that makes Windows usable, so perhaps they'd like ; that. Unchecked by default, though, I think. ; * does this need to be conditional on the Windows version? [Setup] AppName=PuTTY AppVerName=PuTTY prerelease 0.53p DefaultDirName={pf}\PuTTY DefaultGroupName=PuTTY UninstallDisplayIcon={app}\putty.exe ChangesAssociations=yes Compression=zip/9 [Files] Source: "putty.exe"; DestDir: "{app}" Source: "pageant.exe"; DestDir: "{app}" Source: "puttygen.exe"; DestDir: "{app}" Source: "pscp.exe"; DestDir: "{app}" Source: "psftp.exe"; DestDir: "{app}" Source: "plink.exe"; DestDir: "{app}" Source: "website.url"; DestDir: "{app}" Source: "doc\putty.hlp"; DestDir: "{app}" Source: "doc\putty.cnt"; DestDir: "{app}" Source: "LICENCE"; DestDir: "{app}" Source: "README.txt"; DestDir: "{app}"; Flags: isreadme [Icons] Name: "{group}\PuTTY"; Filename: "{app}\putty.exe"; Tasks: startmenu Name: "{group}\PuTTY Manual"; Filename: "{app}\putty.hlp"; Tasks: startmenu Name: "{group}\PuTTY Web Site"; Filename: "{app}\website.url"; Tasks: startmenu Name: "{group}\PSFTP"; Filename: "{app}\psftp.exe"; Tasks: startmenu Name: "{group}\PuTTYgen"; Filename: "{app}\puttygen.exe"; Tasks: startmenu Name: "{group}\Pageant"; Filename: "{app}\pageant.exe"; Tasks: startmenu Name: "{userdesktop}\PuTTY"; Filename: "{app}\putty.exe"; Tasks: desktopicon [Tasks] Name: startmenu; Description: "Create a &Start Menu group" Name: desktopicon; Description: "Create a &desktop icon for PuTTY" Name: associate; Description: "&Associate .PPK files (PuTTY Private Key) with Pageant" [Registry] Root: HKCR; Subkey: ".ppk"; ValueType: string; ValueName: ""; ValueData: "PuTTYPrivateKey"; Flags: uninsdeletevalue; Tasks: associate Root: HKCR; Subkey: "PuTTYPrivateKey"; ValueType: string; ValueName: ""; ValueData: "PuTTY Private Key File"; Flags: uninsdeletekey; Tasks: associate Root: HKCR; Subkey: "PuTTYPrivateKey\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\pageant.exe,0"; Tasks: associate Root: HKCR; Subkey: "PuTTYPrivateKey\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\pageant.exe"" ""%1"""; Tasks: associate Root: HKCR; Subkey: "PuTTYPrivateKey\shell\edit"; ValueType: string; ValueName: ""; ValueData: "&Edit"; Tasks: associate Root: HKCR; Subkey: "PuTTYPrivateKey\shell\edit\command"; ValueType: string; ValueName: ""; ValueData: """{app}\puttygen.exe"" ""%1"""; Tasks: associate Node-path: putty/website.url Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 116 Text-content-md5: bf666ba92bddcb14d76c8e1c722bd773 Text-content-sha1: af99cd3aff44e7776226c97ba5be6bdeecb2d7e1 Content-length: 232 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNiii[InternetShortcut] URL=http://www.chiark.greenend.org.uk/~sgtatham/putty/ Revision-number: 1970 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2002-09-20T18:57:05.000000Z K 7 svn:log V 55 Update README to make it clear it's a _source_ README. K 10 svn:author V 5 simon PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: caa43c5312516bce57a0f50aaa56bac8 Text-delta-base-sha1: cfe6feea21a9b2b2507fe14e289d1dff067c5110 Text-content-length: 295 Text-content-md5: 9d4baebff875695418e0c32742c44b75 Text-content-sha1: 946abf7a757f0dbb5576b415bbcaa16f25e57883 Content-length: 334 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNJX A+N3This is the README for the source archive of PuTTY, a free Win32 If you want to send bug reports or feature requests, please read the Feedback section of the web site before doing so. Sending one-line reports saying `it doesn't work' will waste your time as much as ours. Revision-number: 1971 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2002-09-21T14:03:05.000000Z K 7 svn:log V 75 Support username and password authentication when talking to HTTP proxies. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 40f57a003dae9cc64604a4585641f8be Text-delta-base-sha1: 4c67aa6fd809a5c2c971037ba81164a1170481cc Text-content-length: 417 Text-content-md5: 23c436b47686df3e58ef5f45f437ee00 Text-content-sha1: 43a7d91eea81ee670aea821932af87bb358d83e5 Content-length: 457 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN)K;H[*\versionid $Id: config.but,v 1.39 2002/09/21 14:03:05 simonAuthentication is not supported for all forms of proxy. Currently: \b Username and password authentication is supported for HTTP proxies. \b SOCKS 4 can use the \q{Username} field, but does not support passwords. \b PuTTY does not support authentication in SOCKS 5 at all. \b Authentication is meaningless in Telnet proxies. Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1e7798bcd44c88de3da8509b279aff1a Text-delta-base-sha1: 4a823470ccf4800e7f10f562a1c9ab7687583333 Text-content-length: 704 Text-content-md5: b82cc97516236934d95120d330c89892 Text-content-sha1: 794d6babb957a807b0d4cfe9db4856b6be583824 Content-length: 744 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN]R$+$Q22+Base64 encoding routine. This is required in public-key writing * but also in HTTP proxy handling, so it's centralised here. */ void base64_encode_atom(unsigned char *data, int n, char *out) { static const char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; unsigned word; word = data[0] << 16; if (n > 1) word |= data[1] << 8; if (n > 2) word |= data[2]; out[0] = base64_chars[(word >> 18) & 0x3F]; out[1] = base64_chars[(word >> 12) & 0x3F]; if (n > 1) out[2] = base64_chars[(word >> 6) & 0x3F]; else out[2] = '='; if (n > 2) out[3] = base64_chars[word & 0x3F]; else out[3] = '='; Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 020af9303f4173691aac0027af2dc92f Text-delta-base-sha1: d11b8484d22101795ed1bf8e31be4eb471342118 Text-content-length: 82 Text-content-md5: d1cd3103516fc5f3d623ea6403ca9fc5 Text-content-sha1: 8f5a1726ef12826fe794cb448cdd4e4d012c6618 Content-length: 121 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNs4 =@7if (cfg.proxy_username[0] || cfg.proxy_password[0]) { char buf[sizeof(cfg.proxy_username)+sizeof(cfg.proxy_password)]; char buf2[sizeof(buf)*4/3 + 100]; int i, j, len; sprintf(buf, "%s:%s", cfg.proxy_username, cfg.proxy_password); len = strlen(buf); sprintf(buf2, "Proxy-Authorization: basic "); for (i = 0, j = strlen(buf2); i < len; i += 3, j += 4) base64_encode_atom(buf+i, (len-i > 3 ? 3 : len-i), buf2+j); strcpy(buf2+j, "\r\n"); sk_write(p->sub_socket, buf2, strlen(buf2)); } sprintf(buf, "\r\n" Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 07f707dcc60a14d16c11d437225f55b3 Text-delta-base-sha1: 9827a2535e0c4e02616e0d9372fedb139619656a Text-content-length: 24 Text-content-md5: 216a19931ee47eac4d53e21ba9bf6dd4 Text-content-sha1: 8d038175b177a408843cb0327537f6b488a55b87 Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNb T3 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 34ed5000a3ecd3bdb29c622f2b60ba20 Text-delta-base-sha1: bc904645ec6ce0fe6187853240ac1a97ae708167 Text-content-length: 95 Text-content-md5: ff6e0fd3affac4a8e912f6fb5c48a4f2 Text-content-sha1: 5e8c7255143b6ebb42630f848d1187379abe2b77 Content-length: 136 K 15 cvs2svn:cvs-rev V 5 1.189 PROPS-END SVN 3I6passedit(&cp, "Pass&word", IDC_PROXYPASSSTATIC, ! a Revision-number: 1972 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2002-09-21T16:07:43.000000Z K 7 svn:log V 53 Support username/password authentication in SOCKS 5. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 23c436b47686df3e58ef5f45f437ee00 Text-delta-base-sha1: 43a7d91eea81ee670aea821932af87bb358d83e5 Text-content-length: 251 Text-content-md5: 903e04409a79b45fdf6514f5f43ef073 Text-content-sha1: c3f2c8a7de1abe1c27a01d35002b4098667ffcb6 Content-length: 291 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN)u]5(\versionid $Id: config.but,v 1.40 2002/09/21 16:07:43: \b Username and password authentication is supported for HTTP proxies and SOCKS 5 proxies. \b SOCKS 4 can use the \q{Username} field, but does not support passwords Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4a2ddef169cf4f54fc141219ed18c014 Text-delta-base-sha1: 15f292f0cc35386d7c99edbeed2b806e4b474038 Text-content-length: 1915 Text-content-md5: 5af3537f22084d627ec8a9200df040a2 Text-content-sha1: 4774342eab09aa625515de04df73d6e42dce0bc8 Content-length: 1954 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN+ W2y2TnM=O5BJlw'Pq6r Fvz1' bufchain_consume(&p->pending_input_data, 2); /* SOCKS version 5 */ int proxy_socks54]; int len; command[0] = 5; /* version 5 */ if (cfg.proxy_username[0] || cfg.proxy_password[0]) { command[1] = 2; /* two methods supported: */ command[2] = 0x00; /* no authentication */ command[3] = 0x02; /* username/password */ len = 4; } else { command[1] = 1; /* one methods supported: */ command[2] = 0x00; /* no authentication */ len = 3; } sk_write(p->sub_socket, command, len); bufchain_consume(&p->pending_input_data, 2); } if (p->state == 7) { /* password authentication reply format: * version number (1 bytes) = 1 * reply code (1 byte) * 0 = succeeded * >0 = failed1) { PROXY_ERROR_GENERAL, 0); return 1; } if (data[1] != 0) { plug_closing(p->plug, "Network error: Proxy refused authentication", PROXY_ERROR_GENERAL, 0); return 1; } bufchain_consume(&p->pending_input_data, 2); p->state = 2; /* now proceed as authenticated */if (cfg.proxy_username[0] || cfg.proxy_password[0]) { char userpwbuf[514]; int ulen, plen; ulen = strlen(cfg.proxy_username); if (ulen > 255) ulen = 255; if (ulen < 1) ulen = 1; plen = strlen(cfg.proxy_password); if (plen > 255) plen = 255; if (plen < 1) plen = 1; userpwbuf[0] = 1; /* version number of subnegotiation */ userpwbuf[1] = ulen; memcpy(userpwbuf+2, cfg.proxy_username, ulen); userpwbuf[ulen+2] = plen; memcpy(userpwbuf+ulen+3, cfg.proxy_password, plen); sk_write(p->sub_socket, userpwbuf, ulen + plen + 3); p->state = 7; } else plug_closing(p->plug, "Network error: Server chose " "username/password authentication but we " "didn't offer it! Revision-number: 1973 Prop-content-length: 222 Content-length: 222 K 7 svn:log V 121 Cleanups to proxy code: greater robustness in receiving proxy data, better error reporting for SOCKS 5 and HTTP proxies. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-09-21T16:52:21.000000Z PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b82cc97516236934d95120d330c89892 Text-delta-base-sha1: 794d6babb957a807b0d4cfe9db4856b6be583824 Text-content-length: 950 Text-content-md5: 178cdf0120f3cefd211784f5aa4f441f Text-content-sha1: ba3d9d6e5634589c0343bbd8e168e00a8ee0dd1d Content-length: 990 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNR+l})(.4Rrieve a larger amount of initial data from the liststruct bufchain_granule *tmp; assert(ch->buffersize >= len); while (len > 0) { int remlen = len; assert(ch->head != NULL); if (remlen >= ch->head->buflen - ch->head->bufpos) { remlen = ch->head->buflen - ch->head->bufpos; tmp = ch->head; ch->head = tmp->next; sfree(tmp); if (!ch->head) ch->tail = NULL; } else ch->head->bufpos += remlen; ch->buffersize -= remlen; len -= remlenvoid bufchain_fetch(bufchain *ch, void *data, int len) { struct bufchain_granule *tmp; char *data_c = (char *)data; tmp = ch->head; assert(ch->buffersize >= len); while (len > 0) { int remlen = len; assert(tmp != NULL); if (remlen >= tmp->buflen - tmp->bufpos) remlen = tmp->buflen - tmp->bufpos; memcpy(data_c, tmp->buf + tmp->bufpos, remlen); tmp = tmp->next; len -= remlen; data_c += remlen; } Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d1cd3103516fc5f3d623ea6403ca9fc5 Text-delta-base-sha1: 8f5a1726ef12826fe794cb448cdd4e4d012c6618 Text-content-length: 65 Text-content-md5: 75d687b8ac88aa091be9ea4f8f41131b Text-content-sha1: 5d1fdbc5d28fafbc6c0afaefbb92bfd8a6c3683e Content-length: 104 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN4l ,6 *void bufchain_fetch(bufchain *ch, void *data Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5af3537f22084d627ec8a9200df040a2 Text-delta-base-sha1: 4774342eab09aa625515de04df73d6e42dce0bc8 Text-content-length: 4617 Text-content-md5: ea34a0d9e6b3431648a55228d3ca5817 Text-content-sha1: 13447271f25f6583c9f5813b39c73f4957e20dde Content-length: 4656 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN {$V0j*v$_oY_Nu;{|_2# @2K;xO"0I?x.PkQuT7include pending_input_data); assert(len > 0); /* or we wouldn't be here */ data = smalloc(len); bufchain_fetch(&p->pending_input_data, data, len); eol = get_line_end(data, len); if (eol < 0) { sfree(data); return 1; } status = -1; /* We can't rely on whether the %n incremented the sscanf return */ if (sscanf((char *)data, "HTTP/%i.%i %n", &maj_ver, &min_ver, &status) < 2 || status == -1) { plug_closing(p->plug, "Proxy error: HTTP response was absent", PROXY_ERROR_GENERAL, 0); sfree(data); return 1; } if (data[status] != '2') { /* error */ char buf[1024]; data[eol] = '\0'; while (eol > status && (data[eol-1] == '\r' || data[eol-1] == '\n')) data[--eol] = '\0'; sprintf(buf, "Proxy error: %.900s", data+status); plug_closing(p->plug, buf, PROXY_ERROR_GENERAL, 0); sfree(data); return 1; } sfree(data);len = bufchain_size(&p->pending_input_data); assert(len > 0); /* or we wouldn't be here */ data = smalloc(len); datap = data; bufchain_fetch(&p->pending_input_data, data, len); eol = get_line_end(datap, len); if (eol < 0) { sfree(data); return 1; } while (eol > 2) { bufchain_consume(&p->pending_input_data, eol); datap += eol; eol = get_line_end(datapsfree(data); return 1; } sfree(data); return 1; } } plug_closing(p->plug, "Proxy error: uProxy error: SOCKS version 4 does" " not support IPv6",data[8]; if (bufchain_size(&p->pending_input_data) < 8) return 1; /* not got anything yet */ /* get the response */ bufchain_fetch(&p->pending_input_data, data, 8); if (data[0] != 0) { plug_closing(p->plug, "ProxyProxyProxyProxy8); } plug_closing(p->plug, "Proxy error: u char data[2]; if (bufchain_size(&p->pending_input_data) < 2) return 1; /* not got anything yet */ /* get the response */ bufchain_fetch(&p->pending_input_data, data, 2); if (data[0] != 5) { plug_closing(p->plug, "Proxy error: SOCKS proxy returned unexpected versionProxy error: SOCKS proxy did not accept our authentication char data[2]; if (bufchain_size(&p->pending_input_data) < 2) return 1; /* not got anything yet */ /* get the response */ bufchain_fetch(&p->pending_input_data, data, 2); if (data[0] != 1) { plug_closing(p->plug, "Proxy error: SOCKS password " "subnegotiation contained wrong version numberProxy error: SOCKS proxy refused" " passwor char data[5]; int len; /* First 5 bytes of packet are enough to tell its length. */ if (bufchain_size(&p->pending_input_data) < 5) return 1; /* not got anything yet */ /* get the response */ bufchain_fetch(&p->pending_input_data, data, 5); if (data[0] != 5) { plug_closing(p->plug, "Proxy error: SOCKS proxy returned wrong version number char buf[256]; strcpy(buf, "Proxy error: "); switch (data[1]) { case 1: strcat(buf, "General SOCKS server failure"); break; case 2: strcat(buf, "Connection not allowed by ruleset"); break; case 3: strcat(buf, "Network unreachable"); break; case 4: strcat(buf, "Host unreachable"); break; case 5: strcat(buf, "Connection refused"); break; case 6: strcat(buf, "TTL expired"); break; case 7: strcat(buf, "Command not supported"); break; case 8: strcat(buf, "Address type not supported"); break; default: sprintf(buf+strlen(buf), "Unrecognised SOCKS error code %d", data[1]); break; } plug_closing(p->plug, buf, PROXY_ERROR_GENERAL, 0); return 1; } /* * Eat the rest of the reply packet. */ len = 6; /* first 4 bytes, last 2 */ switch (data[3]) { case 1: len += 4; break; /* IPv4 address */ case 4: len += 16; break;/* IPv6 address */ case 3: len += (unsigned char)data[4]; break; /* domain name */ default: plug_closing(p->plug, "Proxy error: SOCKS proxy returned " "unrecognised address format", PROXY_ERROR_GENERAL, 0); return 1; } if (bufchain_size(&p->pending_input_data) < len) return 1; /* not got whole reply yet */ bufchain_consume(&p->pending_input_data, len); /* we're done */ proxy_activate(p); Revision-number: 1974 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2002-09-23T09:55:11.000000Z K 7 svn:log V 41 Add context help support for Proxy panel K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 903e04409a79b45fdf6514f5f43ef073 Text-delta-base-sha1: c3f2c8a7de1abe1c27a01d35002b4098667ffcb6 Text-content-length: 318 Text-content-md5: ff43dfeb0bab38606e982bd2158d18f6 Text-content-sha1: cee5ad9e6ad32b90d386a3ed42f3ef816451600d Content-length: 358 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNuE1;lM]7xRiX6?\versionid $Id: config.but,v 1.41 2002/09/23 09:55:11 jacob\cfg{winhelp-topic}{proxy.main}\cfg{winhelp-topic}{proxy.type}\cfg{winhelp-topic}{proxy.exclude}\cfg{winhelp-topic}{proxy.auth}\cfg{winhelp-topic}{proxy.command}\cfg{winhelp-topic}{proxy.socksver} Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ff6e0fd3affac4a8e912f6fb5c48a4f2 Text-delta-base-sha1: 5e8c7255143b6ebb42630f848d1187379abe2b77 Text-content-length: 1735 Text-content-md5: a254c8dc56ce38d574b3e1174a112481 Text-content-sha1: 5047a70df2b4e15d1ce041598e1001445eee674a Content-length: 1776 K 15 cvs2svn:cvs-rev V 5 1.190 PROPS-END SVN[[zPROXYTYPESTATIC: case IDC_PROXYTYPENONE: case IDC_PROXYTYPEHTTP: case IDC_PROXYTYPESOCKS: case IDC_PROXYTYPETELNET: return "JI(`',`proxy.type')"; case IDC_PROXYHOSTSTATIC: case IDC_PROXYHOSTEDIT: case IDC_PROXYPORTSTATIC: case IDC_PROXYPORTEDIT: return "JI(`',`proxy.main')"; case IDC_PROXYEXCLUDESTATIC: case IDC_PROXYEXCLUDEEDIT: return "JI(`',`proxy.exclude')"; case IDC_PROXYUSERSTATIC: case IDC_PROXYUSEREDIT: case IDC_PROXYPASSSTATIC: case IDC_PROXYPASSEDIT: return "JI(`',`proxy.auth')"; case IDC_PROXYTELNETCMDSTATIC: case IDC_PROXYTELNETCMDEDIT: return "JI(`',`proxy.command')"; case IDC_PROXYSOCKSVERSTATIC: case IDC_PROXYSOCKSVER5: case IDC_PROXYSOCKSVER4: return "JI(`',`proxy.socksver! 77Q~  cfg.rect_select = IsDlgButtonChecked(hwnd, IDC_SELTYPERECT); break; case IDC_MOUSEOVERRIDE: cfg.mouse_override = IsDlgButtonChecked(hwnd, IDC_MOUSEOVERRIDE); break; case IDC_CCSET: { BOOL ok; int i; int n = GetDlgItemInt(hwnd, IDC_CCEDIT, &ok, FALSE); if (!ok) MessageBeep(0); else { for (i = 0; i < 128; i++) if (SendDlgItemMessage (hwnd, IDC_CCLIST, LB_GETSEL, i, 0)) { char str[100]; cfg.wordness[i] = n; SendDlgItemMessage(hwnd, IDC_CCLIST, LB_DELETESTRING, i, 0); sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i, (i >= 0x21 && i != 0x7F) ? i : ' ', cfg.wordness[i]); SendDlgItemMessage(hwnd, IDC_CCLIST, LB_INSERTSTRING, i, (LPARAM) str); } } } break; case IDC_BOLDCOLOUR Revision-number: 1975 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2002-09-24T18:44:29.000000Z K 7 svn:log V 41 Add a missing space in an error message. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c5a1111e07da3afe7c087ecb6abc37ac Text-delta-base-sha1: 4703e906d624d54b095ea215433eac1435ded7a9 Text-content-length: 25 Text-content-md5: 4e8c01d5a71bf6433bbd5a749819664f Text-content-sha1: 157426fc80629783c76804a3e9a733302eae9759 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVN[\ tgt Revision-number: 1976 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2002-09-24T19:27:58.000000Z K 7 svn:log V 75 Finish replacing `Network error' with `Proxy error' throughout proxy code. K 10 svn:author V 5 simon PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ea34a0d9e6b3431648a55228d3ca5817 Text-delta-base-sha1: 13447271f25f6583c9f5813b39c73f4957e20dde Text-content-length: 91 Text-content-md5: f202690f1338ff6907f54c85b5b30f72 Text-content-sha1: 26d17e8dd653ad5d628afeb89529ac45ec7b282d Content-length: 130 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN{q,"X"t|_"P+ProxyProxyProxyProxy error: UProxy Revision-number: 1977 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:43.369686Z PROPS-END Revision-number: 1978 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:43.394912Z PROPS-END Revision-number: 1979 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:43.404039Z PROPS-END Revision-number: 1980 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2002-09-26T17:57:44.000000Z K 7 svn:log V 98 If the user asks for the Pageant key list window and it's already present, bring it to the front. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4e8c01d5a71bf6433bbd5a749819664f Text-delta-base-sha1: 157426fc80629783c76804a3e9a733302eae9759 Text-content-length: 435 Text-content-md5: 3314f2eaeabc776d73a831f6c372c431 Text-content-sha1: 0042ab01ad7928e7e00b35adecbcca5dd55d0cda Content-length: 475 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVN\dx } /* * Sometimes the window comes up minimised / hidden for * no obvious reason. Prevent this. This also brings it * to the front if it's already present (the user * selected View Keys because they wanted to _see_ the * thing). */ SetForegroundWindow(keylist); SetWindowPos(keylist, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); Revision-number: 1981 Prop-content-length: 284 Content-length: 284 K 7 svn:log V 183 Any application using non-modal dialogs must use IsDialogMessage in its main message loop, otherwise keyboard accelerators will not work in the dialogs. I MUST NOT FORGET THIS AGAIN. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-09-26T18:01:21.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3314f2eaeabc776d73a831f6c372c431 Text-delta-base-sha1: 0042ab01ad7928e7e00b35adecbcca5dd55d0cda Text-content-length: 214 Text-content-md5: 80abdb11eff7eaaac534f76e68a0d263 Text-content-sha1: 7fa5efc5dcc8d5a516d24218ee53d4b5be1bc405 Content-length: 254 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVN :-:%\if (!(IsWindow(keylist) && IsDialogMessage(keylist, &msg)) && !(IsWindow(aboutbox) && IsDialogMessage(aboutbox, &msg))) { TranslateMessage(&msg); DispatchMessage(&msg); } Revision-number: 1982 Prop-content-length: 273 Content-length: 273 K 8 svn:date V 27 2002-09-26T18:37:33.000000Z K 7 svn:log V 172 Add a new SSH2 bug: some servers apparently claim to be able to do DH group exchange, but choke when you actually try it. Never automatically enabled; manual control only. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ff43dfeb0bab38606e982bd2158d18f6 Text-delta-base-sha1: cee5ad9e6ad32b90d386a3ed42f3ef816451600d Text-content-length: 753 Text-content-md5: ee663058b574c178558724b5d886b82b Text-content-sha1: cc1f42f87f0334e5b83b45d514a1fad96a03f179 Content-length: 793 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNExM";_xM\versionid $Id: config.but,v 1.42 2002/09/26 18:37:33 simonigS{config-ssh-bug-dhgex} \q{Chokes on Diffie-Hellman group exchange} \cfg{winhelp-topic}{ssh.bugs.dhgex2} We have anecdotal evidence that some SSH servers claim to be able to perform Diffie-Hellman group exchange, but fail to actually do so when PuTTY tries to. If your SSH2 sessions spontaneously close immediately after opening the PuTTY window, it might be worth enabling the workaround for this bug to see if it helps. We have no hard evidence that any specific version of specific server software reliably demonstrates this bug. Therefore, PuTTY will never \e{assume} a server has this bug; if you want the workaround, you need to enable it manually Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: aff5e97a61f716d0b74cecb7c57717a1 Text-delta-base-sha1: d4408274e3996fd6a00b53e71bc830b249c391bd Text-content-length: 38 Text-content-md5: 13feee7bba39e7e44421f178313f50cc Text-content-sha1: 2c4aab5e7c2efae301a1014b46ba401fcfa59568 Content-length: 79 K 15 cvs2svn:cvs-rev V 5 1.142 PROPS-END SVN , sshbug_dhgex Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 633a9385df0481b595377b50bde43ba6 Text-delta-base-sha1: df19b8cb8ffacc836bca06544c37ed0a46c2e84e Text-content-length: 144 Text-content-md5: 3e8e12eabd822a3f474cb80c33a87922 Text-content-sha1: c2637f1fbf90247412468829f83797b617c0daf7 Content-length: 184 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVNr #q write_setting_i(sesskey, "BugDHGEx2", cfg->sshbug_dhgex gppi(sesskey, "BugDHGEx2", BUG_AUTO, &cfg->sshbug_dhgex Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5efdc545cacb27396eb09817ac1e0232 Text-delta-base-sha1: c9374d6544fb5c299d246a0265cb38ef4df78876 Text-content-length: 648 Text-content-md5: 8d937fbb03b041c7aa73b403ea4e010c Text-content-sha1: f59941e9476e1768cbe92e83dfb6c869147092a1 Content-length: 689 K 15 cvs2svn:cvs-rev V 5 1.220 PROPS-END SVNuOB)S#define BUG_SSH2_DH_GEX 64 if (cfg.sshbug_dhgex2 == BUG_ON) { /* * These versions have the SSH2 DH GEX bug. */ ssh_remote_bugs |= BUG_SSH2_DH_GEX; logevent("We believe remote version has SSH2 DH group exchangeqCJaeRa hate s; /* First 20 bytes. */ &chr, 1); SHA_Bytes(&s, sessid, 20); SHA_Final(&s, keyspace); /* Next 20 bytes. */ if (kex_algs[i] == &ssh_diffiehellman_gex && (ssh_remote_bugs & BUG_SSH2_DH_GEX)) continue;kex_algs[i] == &ssh_diffiehellman_gex && (ssh_remote_bugs & BUG_SSH2_DH_GEX)) continue; Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a254c8dc56ce38d574b3e1174a112481 Text-delta-base-sha1: 5047a70df2b4e15d1ce041598e1001445eee674a Text-content-length: 1424 Text-content-md5: 1116ffc6cec583ac8d6bb321ccfedc1f Text-content-sha1: 3d4397f0b6adc99bb4e8cddd8d7700d49ae79237 Content-length: 1465 K 15 cvs2svn:cvs-rev V 5 1.191 PROPS-END SVN2{P`IV#rJ|Iw(8 b 4IDC_BUGS_DHGEX2, IDC_BUGD_DHGEX case IDC_BUGS_DHGEX2: case IDC_BUGD_DHGEX2: return "JI(`',`ssh.bugs.dhgex SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_RESETCONTENT, 0, 0); SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2DHGEX2DHGEX2, CB_ADDSTRING, 0, (LPARAM)"On"); SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_SETCURSEL, cfg.sshbug_dhgex2 == BUG_ON ? 2 : cfg.sshbug_dhgexstaticddl(&cp, "Chokes on &Diffie-Hellman group exchange", IDC_BUGS_DHGEX2, IDC_BUGD_DHGEXY6BV_9^n#; of.lpstrFile = filename; strcpy(filename, cfg.keyfile); of.nMaxFile = sizeof(filename); of.lpstrFileTitle = NULL; of.lpstrInitialDir = NULL; of.lpstrTitle = "Select Private Key File"; of.Flags = 0; if (GetOpenFileName(&of)) { strcpy(cfg.keyfile, filename); SetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile); } break; case IDC_RAWCNP: cfg.rawcnp = IsDlgButtonChecked(hwnd, IDC_RAWCNP); break; case IDC_RTFPASTE: cfg.rtf_paste = IsDlgButtonChecked(hwnd, IDC_RTFPASTE); break; case IDC_MBWINDOWS: case IDC_MBXTERM: cfg.mouse_is_xterm = IsDlgButtonChecked(hwnd, IDC_MBXTERM); break; case IDC_SELTYPELEX: case IDC_SELTYPERECT: case IDC_BUGD_DHGEX2DHGEX2, CB_GETCURSEL, 0, 0); cfg.sshbug_dhgex2 = (index == 0 ? BUG_AUTO : Revision-number: 1983 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:43.855522Z PROPS-END Revision-number: 1984 Prop-content-length: 147 Content-length: 147 K 7 svn:log V 47 Add a chapter explaining common error messages K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-01T16:27:36.000000Z PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e206a2e0d53b00d09dd6dcd70f4f0be6 Text-delta-base-sha1: 9084aa701dfe798df796d3f6a29b0c34a0b9f82c Text-content-length: 25 Text-content-md5: b197592204f1fd585bbdcdb085f3ad88 Text-content-sha1: 9d9debb318036201934e240c4cf95c7414f659b5 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNbiTSerrors Node-path: putty/doc/errors.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 10341 Text-content-md5: ce26cd04d5cd1c336ce88c79e72a9274 Text-content-sha1: 66f87bea29cabff7e14fa7b2e598bb455bd089e5 Content-length: 10457 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNWWW\versionid $Id: errors.but,v 1.1 2002/10/01 16:27:36 simon Exp $ \C{errors} Common error messages This chapter lists a number of common error messages which PuTTY and its associated tools can produce, and explains what they mean in more detail. We do not attempt to list \e{all} error messages here: there are many which should never occur, and some which should be self-explanatory. If you get an error message which is not listed in this chapter and which you don't understand, report it to us as a bug (see \k{feedback}) and we will add documentation for it. \H{errors-hostkey-absent} \q{The server's host key is not cached in the registry} This error message occurs when PuTTY connects to a new SSH server. Every server identifies itself by means of a host key; once PuTTY knows the host key for a server, it will be able to detect if a malicious attacker redirects your connection to another machine. If you see this message, it means that PuTTY has not seen this host key before, and has no way of knowing whether it is correct or not. You should attempt to verify the host key by other means, such as asking the machine's administrator. If you see this message and you know that your installation of PuTTY \e{has} connected to the same server before, it may have been recently upgraded to SSH protocol version 2. SSH protocols 1 and 2 use separate host keys, so when you first use SSH 2 with a server you have only used SSH 1 with before, you will see this message again. You should verify the correctness of the key as before. See \k{gs-hostkey} for more information on host keys. \H{errors-hostkey-wrong} \q{WARNING - POTENTIAL SECURITY BREACH!} This message, followed by \q{The server's host key does not match the one PuTTY has cached in the registry}, means that PuTTY has connected to the SSH server before, knows what its host key \e{should} be, but has found a different one. This may mean that a malicious attacker has replaced your server with a different one, or has redirected your network connection to their own machine. On the other hand, it may simply mean that the administrator of your server has accidentally changed the key while upgrading the SSH software; this \e{shouldn't} happen but it is unfortunately possible. You should contact your server's administrator and see whether they expect the host key to have changed. If so, verify the new host key in the same way as you would if it was new. See \k{gs-hostkey} for more information on host keys. \H{errors-portfwd-space} \q{Out of space for port forwardings} PuTTY has a fixed-size buffer which it uses to store the details of all port forwardings you have set up in an SSH session. If you specify too many port forwardings on the PuTTY or Plink command line and this buffer becomes full, you will see this error message. We need to fix this (fixed-size buffers are almost always a mistake) but we haven't got round to it. If you actually have trouble with this, let us know and we'll move it up our priority list. \H{errors-cipher-warning} \q{The first cipher supported by the server is ... below the configured warning threshold} This occurs when the SSH server does not offer any ciphers which you have configured PuTTY to consider strong enough. See \k{config-ssh-encryption} for more information on this message. \H{errors-memory} \q{Out of memory} This occurs when PuTTY tries to allocate more memory than the system can give it. This \e{may} happen for genuine reasons: if the computer really has run out of memory, or if you have configured an extremely large number of lines of scrollback in your terminal. PuTTY is not able to recover from running out of memory; it will terminate immediately after giving this error. However, this error can also occur when memory is not running out at all, because PuTTY receives data in the wrong format. In SSH 2 and also in SFTP, the server sends the length of each message before the message itself; so PuTTY will receive the length, try to allocate space for the message, and then receive the rest of the message. If the length PuTTY receives is garbage, it will try to allocate a ridiculous amount of memory, and will terminate with an \q{Out of memory} error. This can happen in SSH 2, if PuTTY and the server have not enabled encryption in the same way (see \k{faq-outofmem} in the FAQ). Some versions of OpenSSH have a knownq problem with this: see \k{faq-openssh-bad-openssl}. This can also happen in PSCP or PSFTP, if your login scripts on the server generate output: the client program will be expecting an SFTP message starting with a length, and if it receives some text from your login scripts instead it will try to interpret them as a message length. See \k{faq-outofmem2} for details of this. \H{errors-internal} \q{Internal error}, \q{Internal fault}, \q{Assertion failed} Any error beginning with the word \q{Internal} should \e{never} occur. If it does, there is a bug in PuTTY by definition; please see \k{feedback} and report it to us. Similarly, any error message starting with \q{Assertion failed} is a bug in PuTTY. Please report it to us, and include the exact text from the error message box. \H{errors-refused} \q{Server refused our public key} or \q{Key refused} Various forms of this error are printed in the PuTTY window, or written to the PuTTY Event Log (see \k{using-eventlog}) when trying public-key authentication. If you see one of these messages, it means that PuTTY has sent a public key to the server and offered to authenticate with it, and the server has refused to accept authentication. This usually means that the server is not configured to accept this key to authenticate this user. This is almost certainly not a problem with PuTTY. If you see this type of message, the first thing you should do is check your \e{server} configuration carefully. Also, read the PuTTY Event Log; the server may have sent diagnostic messages explaining exactly what problem it had with your setup. \H{errors-crc} \q{Incorrect CRC received on packet} or \q{Incorrect MAC received on packet} This error occurs when PuTTY decrypts an SSH packet and its checksum is not correct. This probably means something has gone wrong in the encryption or decryption process. It's difficult to tell from this error message whether the problem is in the client or in the server. A known server problem which can cause this error is described in \k{faq-openssh-bad-openssl} in the FAQ. \H{errors-garbled} \q{Incoming packet was garbled on decryption} This error occurs when PuTTY decrypts an SSH packet and the decrypted data makes no sense. This probably means something has gone wrong in the encryption or decryption process. It's difficult to tell from this error message whether the problem is in the client or in the server. A known server problem which can cause this error is described in \k{faq-openssh-bad-openssl} in the FAQ. \H{errors-x11-proxy} \q{Authentication failed at PuTTY X11 proxy} This error is reported when PuTTY is doing X forwarding. It is sent back to the X application running on the SSH server, which will usually report the error to the user. When PuTTY enables X forwarding (see \k{using-x-forwarding}) it creates a virtual X display running on the SSH server. This display requires authentication to connect to it (this is how PuTTY prevents other users on your server machine from connecting through the PuTTY proxy to your real X display). PuTTY also sends the server the details it needs to enable clients to connect, and the server should put this mechanism in place automatically, so your X applications should just work. A common reason why people see this message is because they used SSH to log in as one user (let's say \q{fred}), and then used the Unix \c{su} command to become another user (typically \q{root}). The original user, \q{fred}, has access to the X authentication data provided by the SSH server, and can run X applications which are forwarded over the SSH connection. However, the second user (\q{root}) does not automatically have the authentication data passed on to it, so attempting to run an X application as that user often fails with this error. If this happens, \e{it is not a problem with PuTTY}. You need to arrange for your X authentication data to be passed from the user you logged in as to the user you used \c{su} to become. How you do this depends on your particular system; in fact many modern versions of \c{su} do it automatically. \H{errors-connaborted} \q{Network error: Software caused connection abort} In modern versions of PuTTY, you should not see this error. Windows's documentation about this error condition is not very good, but as far as we can tell, this error occurs when PuTTY is listening on a port, another program makes a connection to that port, but closes the connection so fast that PuTTY has no time to answer it. PuTTY only ever listens on a port when it is doing local-to-remote port forwarding (see \k{using-port-forwarding}); and if an incoming connection on that port receives this error, PuTTY should simply close the connection and continue without error. If you see this error in PuTTY 0.53 or above, we would welcome a report of the circumstances. \H{errors-connreset} \q{Network error: Connection reset by peer} This error occurs when the machines at each end of a network connection lose track of the state of the connection between them. For example, you might see it if your SSH server crashes, and manages to reboot fully before you next attempt to send data to it. However, the most common reason to see this message is if you are connecting through a firewall or a NAT router which has timed the connection out. See \k{faq-idleout} in the FAQ for more details. You may be able to improve the situation by using keepalives; see \k{config-keepalive} for details on this. \H{errors-connrefused} \q{Network error: Connection refused} This error means that the network connection PuTTY tried to make to your server was rejected by the server. Usually this happens because the server does not provide the service which PuTTY is trying to access. Check that you are connecting with the correct protocol (SSH, Telnet or Rlogin), and check that the port number is correct. If that fails, consult the administrator of your server. Revision-number: 1985 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2002-10-01T17:27:54.000000Z K 7 svn:log V 49 Bump the version number on the installer script. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2a6d3a04d228e0e9179eaab98d7ab713 Text-delta-base-sha1: fa38402205f917655b395c9f760875b5093b8dca Text-content-length: 33 Text-content-md5: 1094492434c41636af72a10e31c42d34 Text-content-sha1: 5ab779a37d723251b13b6667879ad833336aa099 Content-length: 72 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN M;]version 0.53 Revision-number: 1986 Prop-content-length: 234 Content-length: 234 K 8 svn:date V 27 2002-10-01T18:30:15.000000Z K 7 svn:log V 133 Remove last vestiges of `buggymac' in the Config structure. Might have been cause of a Plink bug since it no longer got initialised. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 13feee7bba39e7e44421f178313f50cc Text-delta-base-sha1: 2c4aab5e7c2efae301a1014b46ba401fcfa59568 Text-content-length: 22 Text-content-md5: 4a59a32c47285eae7f3fdbaab33a42ed Text-content-sha1: f85fa318a7938c94c177eb0b98cf02d98d48913b Content-length: 63 K 15 cvs2svn:cvs-rev V 5 1.143 PROPS-END SVNR 7y Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8d937fbb03b041c7aa73b403ea4e010c Text-delta-base-sha1: f59941e9476e1768cbe92e83dfb6c869147092a1 Text-content-length: 71 Text-content-md5: 19fecc110ec5a9178fb6a0c93507ffda Text-content-sha1: abe635daf2e38b5afbd7eedeb86e567eb4d1b4b4 Content-length: 112 K 15 cvs2svn:cvs-rev V 5 1.221 PROPS-END SVNC1 NDssh_remote_bugs & BUG_SSH2_HMAC Revision-number: 1987 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2002-10-01T18:30:15.000000Z K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-53'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-0.53 Node-kind: dir Node-action: add Node-copyfrom-rev: 1986 Node-copyfrom-path: putty Node-path: putty-0.53/contrib Node-action: delete Revision-number: 1988 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2002-10-01T18:30:15.000000Z K 7 svn:log V 71 This commit was manufactured by cvs2svn to create branch 'branch-0-53'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-branch-0.53 Node-kind: dir Node-action: add Node-copyfrom-rev: 1986 Node-copyfrom-path: putty Node-path: putty-branch-0.53/contrib Node-action: delete Revision-number: 1989 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2002-10-03T16:37:36.000000Z K 7 svn:log V 30 Added some useful references. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/srp-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 17d654ddb27f4edc181de6ddd8d716b6 Text-delta-base-sha1: e152752cc740216a80f9d478bf1d528b3f6cd136 Text-content-length: 312 Text-content-md5: 83782285156f70b743432302dee06b2c Text-content-sha1: 1ccde16c5cf8542d1566d3035804a51e9bcd1d7c Content-length: 351 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNo@2OPgG'SRP support in SSH, as an alternative to pure password authentication. (As implemented by LSH.) drafts Revision-number: 1990 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2002-10-05T10:24:55.000000Z K 7 svn:log V 21 Add more references. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/srp-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 83782285156f70b743432302dee06b2c Text-delta-base-sha1: 1ccde16c5cf8542d1566d3035804a51e9bcd1d7c Text-content-length: 888 Text-content-md5: 7adfa4460a65ac765480fbcd4733016a Text-content-sha1: 55207d439710c047d7d2bc29049f973fe368a423 Content-length: 927 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN@XFOCGy SRP support in SSH, as an alternative to pure password authentication. drafts

    Resources:

    • Stanford SRP page and RFC2945
    • draft-nisse-secsh-srp-01 (expired) describing how LSH implements SRP (as a key exchange method)
    • draft-tomh-secsh-srp-00 (expired) describes how Tom Holroyd's OpenSSH patch implements SRP (as a userauth method)
    • A statement on the IPR issues around SRP
    • The IETF SECSH mail archive has discussions of the above drafts.
    • RFC2944 describes Telnet SRP authentication.
    Revision-number: 1991 Prop-content-length: 115 Content-length: 115 K 10 svn:author V 3 ben K 8 svn:date V 27 2002-10-07T15:44:11.000000Z K 7 svn:log V 17 User bug report. PROPS-END Node-path: putty-wishlist/data/pageant-spurious-error Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 672 Text-content-md5: e8cdba67c8d3083854cab643835139a7 Text-content-sha1: 755eb1dcee5c38b1374d8f391c256c3abbbee258 Content-length: 788 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: Spurious pageant error message with -i switch Content-type: text/plain Class: bug Priority: medium Present-in: 0.53 2002-10-07 pageant can be invoked as pageant -i to have it automatically load a key on start up. When this is done, a message box with the text "Couldn't load this key (unable to open file)" appears. When this message box is dismissed, a dialog prompts for the passphrase for the key. Pageant then starts normally with the specified key loaded. Expected behavior: Since there seems to be no problem loading the key, there should be no error message. <4.2.0.58.20021007004352.00b67b90@rescomp.stanford.edu> Revision-number: 1992 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2002-10-07T15:50:49.000000Z K 7 svn:log V 39 A few people seem to have needed this. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/emacs-keys Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 498 Text-content-md5: f54bb63c8b1fb375e80b292a9bde59fc Text-content-sha1: 27d91cd3774d5c6199b9547313f0a7234e4650a9 Content-length: 614 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNdddSummary: Emacs cursor-key etc mappings Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body

    Quite a few applications which don't understand VT100 cursor-key sequences do understand Emacs-style ones. It might thus be a good idea to have an option to emit them. Sensible ones include:
    Up ^P
    Down ^N
    Left ^B
    Right ^F
    Home ^A
    End ^E
    Delete^D
    Revision-number: 1993 Prop-content-length: 457 Content-length: 457 K 8 svn:date V 27 2002-10-07T16:45:23.000000Z K 7 svn:log V 356 Begin destabilisation in the wake of 0.53! This checkin contains the beginning of a Unix port. It's nowhere near done, and currently it won't even compile on Unix. But this represents the start of the process of separating out platform-specific code, and also contains the mkfiles.pl changes required to support a Unix makefile and a non-flat source tree. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 25fe144fc8beafd4522ede237296017a Text-delta-base-sha1: 471435df4a97b421c5a141878ad8f109f605942f Text-content-length: 138 Text-content-md5: 93c0a8dfc73f6da3e8e92736feb508cc Text-content-sha1: bc643e477d3c47c17f2b68bd1e8075c0f4c35c9a Content-length: 177 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNU' t^UWindows GUI app, [C] for Console app, [X] for # X/GTK Unix app pterm : [X] pterm terminal wcwidth unicode uxmisc Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 68a07c1e78ce286c9a629bd7c417cb0b Text-delta-base-sha1: 72390649588c1c7a679e48074c26bc151b6b9493 Text-content-length: 2276 Text-content-md5: bf67672b332351c9d81cd692444eec8d Text-content-sha1: 9a471eb0d279992e4c8efdb9dd6cea475ab04593 Content-length: 2316 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN$U JcoL29yW}J9pOgu/NX.Hy0ojPDBXuPN@v.vp.X6GHyjouse FileHandle; open IN, "Recipe" or die "unable to open Recipe file\n"; @incdirs = ("", "unix/") or $i eq "[X$dirfile = &findfile($file); open IN, "$dirfile"findfile { my ($name) = @_; my $dir, $i, $outdir = ""; $i = 0; foreach $dir (@incdirs) { $outdir = $dir, $i++ if -f "$dir$name"; } die "multiple instances of source file $name\n" if $i > 1; return "$outdir$name"; } sub objects { my ($prog, $otmpl, $rtmpl, $ltmpl, $prefix, $dirsep) = @_; my @ret; my ($i, $x, $y); @ret = (); foreach $i (@{$programs{$prog}}) { $x = "";if ($i =~ /^(.*)\.lib/) { $y = $1; ($x = $lush @ret, $x if $x ne "";, $prefix, $dirsep) = @_; my ($i, $x, $y); my @deps; foreach $i (sort keys %depends) { if ($i =~ /^(.*)\.res/) { next if !defined $rtmpl;@deps = @{$depends{$i}}; @deps = map { $_ = &findfile($_); s/\//$dirsep/g; $_ = $prefix . $_; } @deps; print &splitline(sprintf "%s: %s", $x, join " ", @deps), "\n"; } } sub prognames { my ($types) = @_; my ($n); my @ret; @ret = (); foreach $n (@prognames) { push @ret, $n if index($types, $types{$n}) >= 0; } return @ret;&prognames("GC")); print "\n\n"; foreach $p (&prognames("GC"), "", "\\"); print "\n". "version.o: FORCE;&prognames("GC")); print "\n\n"; foreach $p (&prognames("GC")&prognames("GC"), "", "\\&prognames("GC")); print "\n\n"; foreach $p (&prognames("GC")&prognames("GC"), "", "\\ ##-- X/GTK/Unix makefile open OUT, ">unix/Makefile.gtk"; select OUT; print "# Makefile for PuTTY under X/GTK and Unix/opt/gcc/bin\n". "CC = \$(TOOLPATH)cc\n". "\n". &splitline("CFLAGS = -Wall -O2 -I. -I.. `gtk-config --cflags`")."\n". "LDFLAGS = -s `gtk-config --libs`\n". "\n". ".SUFFIXES:\n". "\n". "%.o: %.c\n". "\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c \$<\n". "\n"; print &splitline("all:" . join "", map { " $_" } &prognames("X")); print "\n\n"; foreach $p (&prognames("X")) { $objstr = &objects($p, "X.o", undef, undef); print &splitline($p . ": " . $objstr), "\nundef, "../", "/"); print "\n". "version.o: FORCE;\n". "\n"; select STDOUT; close OUT; Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bb61971ebc56faa04d624c5212ae89b0 Text-delta-base-sha1: 9702b8dea319b2991010a44cfda9aa67c1761f19 Text-content-length: 34 Text-content-md5: 88eca11acc311f465e399435abb1c438 Text-content-sha1: 6a85d00f1e2c282edc7b995bab076a5230397849 Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNmu V[unsigned long Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4a59a32c47285eae7f3fdbaab33a42ed Text-delta-base-sha1: f85fa318a7938c94c177eb0b98cf02d98d48913b Text-content-length: 480 Text-content-md5: 18f9f841a00d1421712eda89d32de62b Text-content-sha1: 0ae440a099bd8f7f93911973a8f97e3138240cb1 Content-length: 521 K 15 cvs2svn:cvs-rev V 5 1.144 PROPS-END SVNRP:`?W)T+o"4P?gXP]tCndef GLOBAL #ifdef PUTTY_DO_GLOBALS #define GLOBAL #else #define GLOBAL extern #endif #endif typedef struct config_tag Config; #include "puttyps.h" #include "network.hwchar_t unitab_scoacs[256]; GLOBAL wchar_t unitab_line[256]; GLOBAL wchar_t unitab_font[256]; GLOBAL wchar_t unitab_xterm[256]; GLOBAL wchar_tstruct config_tagunsigned long data); void random_save_seed(void); void random_destroy_seed(void) Node-path: putty/puttyps.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 165 Text-content-md5: 727a86ef2a577c4cdca8983fdb6bccf5 Text-content-sha1: f75298911d0f7ade1e9412fc25d4e976987aa6ad Content-length: 281 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN#ifndef PUTTY_PUTTYPS_H #define PUTTY_PUTTYPS_H #ifdef _WINDOWS #include #include "winstuff.h" #else #include "unix.h" #endif #endif Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6d474bd00aa528a9f4c4b30b5f682433 Text-delta-base-sha1: 199abd58394e9185a50845613af9db9b91c42ead Text-content-length: 284 Text-content-md5: 37350cd2973076e409153d92d0f11ca7 Text-content-sha1: 53babfb5f724b7fc919924a0b776ae953cd1ac4f Content-length: 324 K 15 cvs2svn:cvs-rev V 4 1.99 PROPS-END SVNBJDB"[i~;!VgTHO(u((TICKSPERSEC/10) /* visual bell lasts 1/10 secETTICKCOUNTDEFAULT_CODEPAGEETTICKCOUNTETTICKCOUNTETTICKCOUNTsystem blink rate */ if (blink_diff >= 0 && blink_diff < (long) CURSORBLINKETTICKCOUNT Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7e03a6bfbba54da6d539c8cde365cb42 Text-delta-base-sha1: eba79081144866e839d55d41fdd6eb5fa7090a2c Text-content-length: 61 Text-content-md5: 03ae04ae84ad584613460a8abcf0687b Text-content-sha1: 91da8677e75b48025610fe63f7dcc77bcf42a5cf Content-length: 101 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN*o#ifdef WINDOWS #include #endif Node-path: putty/unix Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4908 Text-content-md5: c9e2d592e6b44f86f652432c12baaa11 Text-content-sha1: acb347e7ef98223a20f3ab0f0af2324206c66763 Content-length: 5024 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * pterm - a fusion of the PuTTY terminal emulator with a Unix pty * back end, all running as a GTK application. Wish me luck. */ #include #include #include #include #define CAT2(x,y) x ## y #define CAT(x,y) CAT2(x,y) #define ASSERT(x) enum {CAT(assertion_,__LINE__) = 1 / (x)} #define lenof(x) (sizeof((x))/sizeof(*(x))) struct gui_data { GtkWidget *area; GdkFont *fonts[2]; /* normal and bold (for now!) */ GdkGC *black_gc, *white_gc; }; gint delete_window(GtkWidget *widget, GdkEvent *event, gpointer data) { /* * FIXME: warn on close? */ return FALSE; } gint configure_area(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { struct gui_data *inst = (struct gui_data *)data; inst->fonts[0] = gdk_font_load("9x15t"); /* XXCONFIG */ inst->fonts[1] = NULL; /* XXCONFIG */ inst->black_gc = widget->style->black_gc; inst->white_gc = widget->style->white_gc; #if 0 /* FIXME: get cmap from settings */ /* * Set up the colour map. */ inst->colmap = gdk_colormap_get_system(); { char *colours[] = { "#cc0000", "#880000", "#ff0000", "#cc6600", "#884400", "#ff7f00", "#cc9900", "#886600", "#ffbf00", "#cccc00", "#888800", "#ffff00", "#00cc00", "#008800", "#00ff00", "#008400", "#005800", "#00b000", "#008484", "#005858", "#00b0b0", "#00cccc", "#008888", "#00ffff", "#0066cc", "#004488", "#007fff", "#9900cc", "#660088", "#bf00ff", "#cc00cc", "#880088", "#ff00ff", "#cc9999", "#886666", "#ffbfbf", "#cccc99", "#888866", "#ffffbf", "#99cc99", "#668866", "#bfffbf", "#9999cc", "#666688", "#bfbfff", "#757575", "#4e4e4e", "#9c9c9c", "#999999", "#666666", "#bfbfbf", "#cccccc", "#888888", "#ffffff", }; ASSERT(sizeof(colours)/sizeof(*colours)==3*NCOLOURS); gboolean success[3*NCOLOURS]; int i; for (i = 0; i < 3*NCOLOURS; i++) { if (!gdk_color_parse(colours[i], &inst->cols[i])) g_error("4tris: couldn't parse colour \"%s\"\n", colours[i]); } gdk_colormap_alloc_colors(inst->colmap, inst->cols, 3*NCOLOURS, FALSE, FALSE, success); for (i = 0; i < 3*NCOLOURS; i++) { if (!success[i]) g_error("4tris: couldn't allocate colour \"%s\"\n", colours[i]); } } #endif return TRUE; } gint expose_area(GtkWidget *widget, GdkEventExpose *event, gpointer data) { struct gui_data *inst = (struct gui_data *)data; /* * FIXME: pass the exposed rect to terminal.c which will call * us back to do the actual painting. */ return FALSE; } #define KEY_PRESSED(k) \ (inst->keystate[(k) / 32] & (1 << ((k) % 32))) gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) { struct gui_data *inst = (struct gui_data *)data; /* * FIXME: all sorts of fun keyboard handling required here. */ } gint timer_func(gpointer data) { struct gui_data *inst = (struct gui_data *)data; /* * FIXME: we're bound to need this sooner or later! */ return TRUE; } void destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } gint focus_event(GtkWidget *widget, GdkEventFocus *event, gpointer data) { /* * FIXME: need to faff with the cursor shape. */ } int main(int argc, char **argv) { GtkWidget *window; struct gui_data the_inst; struct gui_data *inst = &the_inst; /* so we always write `inst->' */ gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); inst->area = gtk_drawing_area_new(); gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area), 9*80, 15*24);/* FIXME: proper resizing stuff */ gtk_container_add(GTK_CONTAINER(window), inst->area); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(destroy), inst); gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(delete_window), inst); gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(key_event), inst); gtk_signal_connect(GTK_OBJECT(window), "key_release_event", GTK_SIGNAL_FUNC(key_event), inst); gtk_signal_connect(GTK_OBJECT(window), "focus_in_event", GTK_SIGNAL_FUNC(focus_event), inst); gtk_signal_connect(GTK_OBJECT(window), "focus_out_event", GTK_SIGNAL_FUNC(focus_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "configure_event", GTK_SIGNAL_FUNC(configure_area), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "expose_event", GTK_SIGNAL_FUNC(expose_area), inst); gtk_timeout_add(20, timer_func, inst); gtk_widget_add_events(GTK_WIDGET(inst->area), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); gtk_widget_show(inst->area); gtk_widget_show(window); gtk_main(); return 0; } Node-path: putty/unix/unix.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 550 Text-content-md5: abb71b94ab6c176507a28da837af3c97 Text-content-sha1: 192edcffda86d88d6d454f9e5af804b56697df55 Content-length: 666 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN#ifndef PUTTY_UNIX_H #define PUTTY_UNIX_H typedef void *Context; /* FIXME: probably needs changing */ /* Simple wraparound timer function */ unsigned long getticks(void); /* based on gettimeofday(2) */ #define GETTICKCOUNT getticks #define TICKSPERSEC 1000000 /* gettimeofday returns microseconds */ #define CURSORBLINK 400000 /* FIXME: need right way to do this */ #define WCHAR wchar_t #define BYTE unsigned char #define DEFAULT_CODEPAGE 0 /* FIXME: no idea how to do this */ #endif Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 364 Text-content-md5: 13d4c7005eb122ba6b07ad1d1ca70c20 Text-content-sha1: 33c89eafe149890afa1fe1f5a69aca5ae844b9bc Content-length: 480 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN^^^/* * PuTTY miscellaneous Unix stuff */ #include #include unsigned long getticks(void) { struct timeval tv; gettimeofday(&tv, NULL); /* * This will wrap around approximately every 4000 seconds, i.e. * just over an hour, which is more than enough. */ return tv.tv_sec * 1000000 + tv.tv_usec; } Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 680d5dca8036ea19d944f515298366ab Text-delta-base-sha1: 4d95162a6ac198be8a1896f5f7eaf321722ebc26 Text-content-length: 1782 Text-content-md5: 2bb9c06689db4d792a7bf975b45f276d Text-content-sha1: 0644d57bf5b91aae235b9a1caa91a0ed44c194c0 Content-length: 1822 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN56NmA:KwMZ\Yg/* * winstuff.h: Windows-specific inter-module stuff. */ #ifndef PUTTY_WINSTUFF_H #define PUTTY_WINSTUFF_Hndef GLOBAL#endif typedef struct config_tag Config; /* duplicated from putty.h */ #define PUTTY_REG_POS "Software\\SimonTatham\\PuTTY" #define PUTTY_REG_PARENT "Software\\SimonTatham" #define PUTTY_REG_PARENT_CHILD "PuTTY" #define PUTTY_REG_GPARENT "Software" #define PUTTY_REG_GPARENT_CHILD "SimonTatham" #define GETTICKCOUNT GetTickCount #define CURSORBLINK GetCaretBlinkTime() #define TICKSPERSEC 1000 /* GetTickCount returns milliseconds */ #define DEFAULT_CODEPAGE CP_ACP typedef HDC Context; /* * Window handles for the dialog boxes that can be running during a * PuTTY session. */ GLOBAL HWND logbox; /* * The all-important instance handle. */ GLOBAL HINSTANCE hinst; /* * I've just looked in the windows standard headr files for WM_USER, there * are hundreds of flags defined using the form WM_USER+123 so I've * renumbered this NETEVENT value and the two in window.c */ #define WM_XUSER (WM_USER + 0x2000) #define WM_NETEVENT (WM_XUSER + 5)/* * Exports from winctrls.c. */ /* * Exports from windlg.c. */ void defuse_showwindow(void); int do_config(void); int do_reconfig(HWND); void do_defaults(char *, Config *); void logevent(char *); void showeventlog(HWND); void showabout(HWND); void verify_ssh_host_key(char *host, int port, char *keytype, char *keystr, char *fingerprint); void askcipher(char *ciphername, int cs); int askappend(char *filename); void registry_cleanup(void); void force_normal(HWND hwnd); GLOBAL int nsessions; GLOBAL char **sessions; /* * Exports from sizetip.c. */ void UpdateSizeTip(HWND src, int cx, int cy); void EnableSizeTip(int bEnable); #endif Revision-number: 1994 Prop-content-length: 263 Content-length: 263 K 8 svn:date V 27 2002-10-07T16:52:55.000000Z K 7 svn:log V 162 Fix code which was clobbering people's -P arguments in PSCP (moved it to before the deferred command line processing). Also removed a couple of unused variables. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4944068ef579b675a43949e8329fb32d Text-delta-base-sha1: deabd8bd642b70296972996f139cf071ddcafc28 Text-content-length: 286 Text-content-md5: 1eea0f3c459430ff27a01286abfb0684 Text-content-sha1: d2fc58341f9dd171c66251293f181cb95e17c8b5 Content-length: 326 K 15 cvs2svn:cvs-rev V 4 1.88 PROPS-END SVN}*xyGn!\rev_stats_len = 0; static int scp_unsafe_mode = 0 } /* * Force use of SSH. (If they got the protocol wrong we assume the * port is useless too.) */ if (cfg.protocol != PROT_SSH) { cfg.protocol = PROT_SSH; Revision-number: 1995 Prop-content-length: 328 Content-length: 328 K 8 svn:date V 27 2002-10-07T17:14:41.000000Z K 7 svn:log V 227 From trunk: cvs up -j1.87 -j1.88 scp.c [svn merge -r1993:1994] Fix code which was clobbering people's -P arguments in PSCP (moved it to before the deferred command line processing). Also removed a couple of unused variables. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.53/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 4944068ef579b675a43949e8329fb32d Text-delta-base-sha1: deabd8bd642b70296972996f139cf071ddcafc28 Text-content-length: 286 Text-content-md5: 1eea0f3c459430ff27a01286abfb0684 Text-content-sha1: d2fc58341f9dd171c66251293f181cb95e17c8b5 Content-length: 330 K 15 cvs2svn:cvs-rev V 8 1.87.2.1 PROPS-END SVN}*xyGn!\rev_stats_len = 0; static int scp_unsafe_mode = 0 } /* * Force use of SSH. (If they got the protocol wrong we assume the * port is useless too.) */ if (cfg.protocol != PROT_SSH) { cfg.protocol = PROT_SSH; Revision-number: 1996 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2002-10-07T17:22:47.000000Z K 7 svn:log V 67 Summary: -P option sometimes ignored by PSCP (should now be fixed) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pscp-cmdline-port-bug Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 836 Text-content-md5: 837bc75a2b31b6bafbb4de9a51ca5a0a Text-content-sha1: 96fb38971fe396da8363a933d584464c0a53a549 Content-length: 952 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN666Summary: -P option sometimes ignored by PSCP Class: bug Difficulty: fun Priority: high Absent-in: 0.52 Present-in: 0.53 Fixed-in: 2002-10-08 Content-type: text/x-html-body

    There have been a lot of reports that the -P port command-line argument is ignored in PSCP 0.53 (with it instead using port 22 regardless).

    This occurs whenever the protocol is not explicitly set to SSH in a saved session. For most people, the likely cause is use of a hostname which doesn't correspond to a saved session; PSCP picks up the Default Settings, which currently have a factory default protocol of Telnet.

    Workarounds are therefore to either create a saved session for the relevant host or to set up SSH as the default protocol in Default Settings. Additionally, this should be fixed in the development snapshots. Revision-number: 1997 Prop-content-length: 232 Content-length: 232 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-10-07T17:31:52.000000Z K 7 svn:log V 131 Fix pscp-cmdline-port-bug for PSFTP too. (Also removes what appears to be a gratuitous re-implementation of the "-l user" option.) PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fd049b71faff54549e47e79aa6aaaced Text-delta-base-sha1: d43d5e442c29ff2450b6088994171c0ca40f99ef Text-content-length: 239 Text-content-md5: fd139e97a67e3c86e9c2ac133a7a59b0 Text-content-sha1: c3a3af0c308cb4c37ee0e0eb23974751a2856295 Content-length: 279 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVN=GHGIRk } /* * Force use of SSH. (If they got the protocol wrong we assume the * port is useless too.) */ if (cfg.protocol != PROT_SSH) { cfg.protocol = PROT_SSH; Revision-number: 1998 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 2002-10-07T17:33:01.000000Z K 7 svn:log V 198 From trunk: cvs up -j1.40 -j1.41 psftp.c [svn merge -r1996:1997] Fix pscp-cmdline-port-bug for PSFTP too. (Also removes what appears to be a gratuitous re-implementation of the "-l user" option.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.53/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: fd049b71faff54549e47e79aa6aaaced Text-delta-base-sha1: d43d5e442c29ff2450b6088994171c0ca40f99ef Text-content-length: 239 Text-content-md5: fd139e97a67e3c86e9c2ac133a7a59b0 Text-content-sha1: c3a3af0c308cb4c37ee0e0eb23974751a2856295 Content-length: 283 K 15 cvs2svn:cvs-rev V 8 1.40.2.1 PROPS-END SVN=GHGIRk } /* * Force use of SSH. (If they got the protocol wrong we assume the * port is useless too.) */ if (cfg.protocol != PROT_SSH) { cfg.protocol = PROT_SSH; Revision-number: 1999 Prop-content-length: 243 Content-length: 243 K 8 svn:date V 27 2002-10-07T17:34:31.000000Z K 7 svn:log V 142 PSFTP had the same source code problem. (Didn't try to reproduce the bug, but applied the fix and verified that it didn't have the bug then.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pscp-cmdline-port-bug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 837bc75a2b31b6bafbb4de9a51ca5a0a Text-delta-base-sha1: 96fb38971fe396da8363a933d584464c0a53a549 Text-content-length: 61 Text-content-md5: 915e2877d9e95e2bd7edd5399dd79ff2 Text-content-sha1: b52e2d066f60ca76d60fcdead30b1873a8a7e42c Content-length: 100 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN6B (1(and PSFTP) 0.53 (with it instead using Revision-number: 2000 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2002-10-07T17:43:07.000000Z K 7 svn:log V 115 Remove "-log" option from Plink. AFAICT this code has been dead since Roman Pompejus' improved logging (Jan 2001). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 672ceb34a8005e327ecdeccc400ee568 Text-delta-base-sha1: 2b6485f9feadbd44523ec035984cd92722847b91 Text-content-length: 22 Text-content-md5: 23889bdc6295123c8290f2f3d3205330 Text-content-sha1: 4d35fc5d0e9634264806b762e9653756f700a27e Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN|= Dy Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 18f9f841a00d1421712eda89d32de62b Text-delta-base-sha1: 0ae440a099bd8f7f93911973a8f97e3138240cb1 Text-content-length: 22 Text-content-md5: 804a551e8161eddd2f18de413b50e02f Text-content-sha1: c0914ff3ceddfcaea9d6f3f8943cbc8388379e49 Content-length: 63 K 15 cvs2svn:cvs-rev V 5 1.145 PROPS-END SVNP: (( Revision-number: 2001 Prop-content-length: 322 Content-length: 322 K 8 svn:date V 27 2002-10-07T17:44:25.000000Z K 7 svn:log V 221 Ported from trunk: cvs up -j1.56 -j1.57 plink.c cvs up -j1.144 -j1.145 putty.h [svn diff -r1999:2000] Remove "-log" option from Plink. AFAICT this code has been dead since Roman Pompejus' improved logging (Jan 2001). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.53/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 672ceb34a8005e327ecdeccc400ee568 Text-delta-base-sha1: 2b6485f9feadbd44523ec035984cd92722847b91 Text-content-length: 22 Text-content-md5: 23889bdc6295123c8290f2f3d3205330 Text-content-sha1: 4d35fc5d0e9634264806b762e9653756f700a27e Content-length: 66 K 15 cvs2svn:cvs-rev V 8 1.56.2.1 PROPS-END SVN|= Dy Node-path: putty-branch-0.53/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 4a59a32c47285eae7f3fdbaab33a42ed Text-delta-base-sha1: f85fa318a7938c94c177eb0b98cf02d98d48913b Text-content-length: 22 Text-content-md5: 54d455736af60d03ebedb4fd3b40282c Text-content-sha1: e826a937d9c1841fd83b48443a8e91f404b639dd Content-length: 67 K 15 cvs2svn:cvs-rev V 9 1.143.2.1 PROPS-END SVNR< )? Revision-number: 2002 Prop-content-length: 255 Content-length: 255 K 8 svn:date V 27 2002-10-07T18:08:05.000000Z K 7 svn:log V 154 Summary: Bug in Putty's handling of SSH_MSG_CHANNEL_WINDOW_ADJUST Peter Gutmann's bug report, I haven't even attempted to classify it as a bug or a wish. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh-window-adjust Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1045 Text-content-md5: d86172d59dc1386b98e46829f0c15e2a Text-content-sha1: 0bc32a45c202ff0953dced709d91c014cdffb2ae Content-length: 1161 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Bug in Putty's handling of SSH_MSG_CHANNEL_WINDOW_ADJUST Content-type: text/plain From Peter Gutmann: Actually this isn't so much a bug as (apparently) a conceptual error in the way this is implemented. The problem is that Putty (any version up to 0.53) waits for a window adjust after everything it does past the initial handshake. If my server sends a SSH_MSG_CHANNEL_OPEN_CONFIRMATION advertising a window size equal to my max packet size of 32K (heck, if I advertise a 4GB window), Putty waits for a window adjust before reading anything. Given that the window is already at INT_MAX, I'm not sure how much more window it expects to get before it can start. The fact that it appears to work OK otherwise seems to be an artifact of OpenSSH, which sends window adjusts like mad during a connection. OTOH using OpenSSH to connect to a server which just uses one big window isn't a problem, while Putty can't get past the initial handshake talking to the same server. <200210040834.UAA08658@ruru.cs.auckland.ac.nz> Revision-number: 2003 Prop-content-length: 162 Content-length: 162 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-10-07T18:14:04.000000Z K 7 svn:log V 62 Summary: PuTTY doesn't correctly encode 255x255 NAWS messages PROPS-END Node-path: putty-wishlist/data/telnet-resize-iac Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 486 Text-content-md5: 7bd3423f90fe54408ba10d272b226c87 Text-content-sha1: 02103c572ae127da57f771f872ea5f46dbb5bb0e Content-length: 602 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNXXXSummary: PuTTY doesn't correctly encode 255x255 NAWS messages Class: bug Difficulty: fun Present-in: 0.53 From Thomas Thurman: | When the telnet option NAWS is enabled, and the width or height of the | screen is exactly 255 characters, PuTTY fails to double up the 0xFF | byte in the subnegotiation, as required by RFC1073. (in telnet.c:telnet_size()) | Linux telnet servers don't seem to be fazed by this, but it crashed a | Python telnet server I was testing it on. Revision-number: 2004 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2002-10-07T22:21:28.000000Z K 7 svn:log V 48 Oops. Dirsep in Makefile.cyg should be / not \. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bf67672b332351c9d81cd692444eec8d Text-delta-base-sha1: 9a471eb0d279992e4c8efdb9dd6cea475ab04593 Text-content-length: 22 Text-content-md5: 86176f82e7c93b8dff58202febde18b4 Text-content-sha1: c18d737881e78d63b4994066b0034fed747d520c Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNUT ',)/ Revision-number: 2005 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2002-10-07T23:03:06.000000Z K 7 svn:log V 213 I don't know if error messages _should_ end in full stops (and I bet Windows doesn't have a style guide to tell us), but it's worth recording the suggestion. The priority should be changed if we make a decision. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/errmsg-full-stops Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 281 Text-content-md5: 72f981a642b4f634e0d6100a232216a9 Text-content-sha1: d2729d856c9a318ae76b05064aef1e17d65a43d7 Content-length: 397 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN  Summary: Full stops on error messages Class: wish Priority: low Difficulty: fun Content-type: texh/x-html-body

    It's been suggested that PuTTY's error messages should end in full stops, which they currently don't.

    Patch: <20020927034005.GA2983@mailhaven.com> Revision-number: 2006 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2002-10-08T16:49:25.000000Z K 7 svn:log V 41 The error turned out not to be spurious. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/pageant-spurious-error Node-action: delete Revision-number: 2007 Prop-content-length: 202 Content-length: 202 K 7 svn:log V 103 Someone's requested this, so stop claiming they haven't. Also mention their suggested way of doing it. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-10-09T11:37:10.000000Z PROPS-END Node-path: putty-wishlist/data/x11-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4eba96a51472d895622b565ede80305d Text-delta-base-sha1: ed09bb60e072c2ce0577f3338c0710577207d411 Text-content-length: 437 Text-content-md5: cff64e7e852a38b3b5cf845507f12a42 Text-content-sha1: 90e0defab905de0030cd6252f9ffb32f34508c58 Content-length: 476 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNt}"["A simple approach might be for PuTTY just to pass on authentication data supplied by the X11 client if it has no better ideas. The X Protocol Manual suggests that servers should ignore any authentication they aren't expecting, so this shouldn't break anything that currently works, and it would allow the user to copy back PuTTY's cookie to their real X server.
    Ref: <web-71356@meredevice.com> Revision-number: 2008 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 42 This has been observed by two people now. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-10-09T12:15:47.000000Z PROPS-END Node-path: putty-wishlist/data/x11-socks-crash Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 538 Text-content-md5: 2b5a8f91691e3e93ac648f7337802375 Text-content-sha1: 1b71b6df1ade97b3ca366e3c568a5101e524961a Content-length: 654 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  Summary: Opening X11 connections with SOCK5 proxying turns on causes crash Class: bug Priority: high Content-type: text/x-html-body Present-in: 0.53 2002-09-29

    Opening a forwarded X11 connection over an SSH connection that's using a SOCKS proxy causes PuTTY to crash. Observered with SSHv2 against F-SECURE 2.3.1, and against OpenSSH 2.9.9p2 (unspecified protocol).

    Ref: <3D9B9963.3000006@metaprogramming.org>
    Ref: <OF9A6AB8C9.8F040CB9-ON85256C4B.00750701@boulder.ibm.com> Revision-number: 2009 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2002-10-09T12:53:53.000000Z K 7 svn:log V 67 Looks like the SSH2 key-derivation bug is rarer than PuTTY thinks. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-keyderive-nonbug Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 552 Text-content-md5: 1a60999b6d6682eef4d943b24f5b9e94 Text-content-sha1: dc08bdf94aa16f62a8acc8dfda4386d40f175624 Content-length: 668 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: SSH 2.0.13 apparently doesn't have key-derivation bug Status: bug Priority: medium Difficulty: fun Content-type: text/x-html-body Present-in: 0.53 2002-10-07

    Apparently, while PuTTY believes that SSH 2.0.* have the SSH2 key-derivation bug, 2.0.13 (host OS/hardware not specified) doesn't, and this causes the expected decryption failures. The current OpenSSH code suggests that the bug is only present in versions before SSH 2.0.11.

    Ref: <Pine.SGI.3.96.1021008003747.69817B-100000@serdis.dis.ulpgc.es> Revision-number: 2010 Prop-content-length: 650 Content-length: 650 K 8 svn:date V 27 2002-10-09T18:09:42.000000Z K 7 svn:log V 549 First phase of porting. pterm now compiles and runs under Linux+gtk. The current pty.c backend is temporarily a loopback device for terminal emulator testing, the display handling is only just enough to show that terminal.c is functioning, the keyboard handling is laughable, and most features are absent. Next step: bring output and input up to a plausibly working state, and put a real pty on the back to create a vaguely usable prototype. Oh, and a scrollbar would be nice too. In _theory_ the Windows builds should still work fine after this... K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 93c0a8dfc73f6da3e8e92736feb508cc Text-delta-base-sha1: bc643e477d3c47c17f2b68bd1e8075c0f4c35c9a Text-content-length: 104 Text-content-md5: 3cfb3d7918591f54694a8f771a355c87 Text-content-sha1: 45d51a551b1e6d063099152230d491faa78ecc68 Content-length: 143 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN'pWWxucs uxmisc tree234 misc ldisc + logging uxprint settings pty be_none uxstore Node-path: putty/be_none.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f0f4fb81b56fd141915c531a08d2763e Text-delta-base-sha1: 0302b69097400485e1a94d093c85c3ac05182fe8 Text-content-length: 20 Text-content-md5: f78e93473d379dbb1c74cd22748eb7d7 Text-content-sha1: bf9dd4df0d77adfd9765b32755015fb341387d29 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN}h Q, Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a1183d2a1da09e22bd0aa8b130cb87a8 Text-delta-base-sha1: f9cacd8c020b31873bb17582e7107dea09c36f79 Text-content-length: 20 Text-content-md5: 093741994b66e004988383c3883ea8a6 Text-content-sha1: e06a1df4ddfd9ecdb676c486c2b34681168c6ce9 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNN9 9 Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e7a47e60429682242389e6caa9a790ff Text-delta-base-sha1: fc38498b6bd5b665c0800f5e86b0dcf100999b6e Text-content-length: 39 Text-content-md5: e3a49a8ec324e4f4a65e5de23d1459c8 Text-content-sha1: 93a69bfb61a9285652dc4db0534e258a8a493434 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN(^@EqA^size = 0 Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 178cdf0120f3cefd211784f5aa4f441f Text-delta-base-sha1: ba3d9d6e5634589c0343bbd8e168e00a8ee0dd1d Text-content-length: 117 Text-content-md5: 3633b6f2f0889d9c72275b6a7391770a Text-content-sha1: 1d4dfffe4d7064b9949059fa65c6e98512883172 Content-length: 157 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN+~Y8S0Aj#include #include #include fontcharset); #endif gppi(sesskey, "FontHeight", 10, &cfg->fontheight); #ifdef _WINDOWS#endif Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 37350cd2973076e409153d92d0f11ca7 Text-delta-base-sha1: 53babfb5f724b7fc919924a0b776ae953cd1ac4f Text-content-length: 404 Text-content-md5: d18c515ea48361fff1b8f351300511e4 Text-content-sha1: a3d2e8216a6930bd22e6b123a1e78a563cc3182d Content-length: 445 K 15 cvs2svn:cvs-rev V 5 1.100 PROPS-END SVNuhKQ`^hDJif (!printing && !only_printing) return; /* we need do nothing */chars = NULL; /* placate compiler warnings */is_dbcs_leadbyte(font_codepage, (BYTE) c)) { buf[0] = c; buf[1] = (unsigned char) ldata[top.x + 1]; rv = mb_to_wc(font_codepage, 0, buf, 2, wbuf, 4); top.x++; } else { buf[0] = c; rv = mb_to_wc(font_codepage, Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 03ae04ae84ad584613460a8abcf0687b Text-delta-base-sha1: 91da8677e75b48025610fe63f7dcc77bcf42a5cf Text-content-length: 104 Text-content-md5: 438b449b08bf56887fec6dfdd8dd135c Text-content-sha1: 9ff3b6e24efa292ee9bc7b7c384a479394b39d3d Content-length: 144 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNzA~!l mb_to_wcwc_to_mb(line_codepage, 0, widebuf, len, mb_to_wc Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c9e2d592e6b44f86f652432c12baaa11 Text-delta-base-sha1: acb347e7ef98223a20f3ab0f0af2324206c66763 Text-content-length: 6146 Text-content-md5: e16daf350d1743bf5e00bfd617488861 Text-content-sha1: 92513883b7a55d7de4e551f823bdab6d3941710c Content-length: 6185 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN6@:sVDtn$rg0j&B2O%ystdio.h> #include #include #define PUTTY_DO_GLOBALS /* actually _define_ globals */ #include "putty.h"void ldisc_update(int echo, int edit) { /* * This is a stub in pterm. If I ever produce a Unix * command-line ssh/telnet/rlogin client (i.e. a port of plink) * then it will require some termios manoeuvring analogous to * that in the Windows plink.c, but here it's meaningless. */ } int askappend(char *filename) { /* * FIXME: for the moment we just wipe the log file. Since I * haven't yet enabled logging, this shouldn't matter yet! */ return 2; } void logevent(char *string) { /* * FIXME: event log entries are currently ignored. */ } /* * Translate a raw mouse button designation (LEFT, MIDDLE, RIGHT) * into a cooked one (SELECT, EXTEND, PASTE). * * In Unix, this is not configurable; the X button arrangement is * rock-solid across all applications, everyone has a three-button * mouse or a means of faking it, and there is no need to switch * buttons around at all. */ Mouse_Button translate_button(Mouse_Button button) { if (button == MBT_LEFT) return MBT_SELECT; if (button == MBT_MIDDLE) return MBT_PASTE; if (button == MBT_RIGHT) return MBT_EXTEND; return 0; /* shouldn't happen */ } /* * Minimise or restore the window in response to a server-side * request. */ void set_iconic(int iconic) { /* FIXME: currently ignored */ } /* * Move the window in response to a server-side request. */ void move_window(int x, int y) { /* FIXME: currently ignored */ } /* * Move the window to the top or bottom of the z-order in response * to a server-side request. */ void set_zorder(int top) { /* FIXME: currently ignored */ } /* * Refresh the window in response to a server-side request. */ void refresh_window(void) { /* FIXME: currently ignored */ } /* * Maximise or restore the window in response to a server-side * request. */ void set_zoomed(int zoomed) { /* FIXME: currently ignored */ } /* * Report whether the window is iconic, for terminal reports. */ int is_iconic(void) { return 0; /* FIXME */ } /* * Report the window's position, for terminal reports. */ void get_window_pos(int *x, int *y) { *x = 3; *y = 4; /* FIXME */ } /* * Report the window's pixel size, for terminal reports. */ void get_window_pixels(int *x, int *y) { *x = 1; *y = 2; /* FIXME */ } /* * Return the window or icon title. */ char *get_window_title(int icon) { return "FIXME: window title retrieval not yet implemented"; }static struct gui_data the_inst; static struct gui_data *inst = &the_inst; /* so we always write `inst->' *//* struct gui_data *inst = (struct gui_data *)data; */ /* * Pass the exposed rectangle to terminal.c, which will call us * back to do the actual painting. */ term_paint(NULL, event->area.x / 9, event->area.y / 15, (event->area.x + event->area.width - 1) / 9, (event->area.y + event->area.height - 1) / 15); return TRU/* struct gui_data *inst = (struct gui_data *)data; */ if (event->type == GDK_KEY_PRESS) { char c[1]; c[0] = event->keyval; ldisc_send(c, 1, 1); term_out(); } return TRUE; } gint timer_func(gpointer data) { /* struct gui_data *inst = (struct gui_data *)data; */ term_update(); return FALSE; } /* * set or clear the "raw mouse message" mode */ void set_raw_mouse_mode(int activate) { /* FIXME: currently ignored */ } void request_resize(int w, int h) { /* FIXME: currently ignored */ } void palette_set(int n, int r, int g, int b) { /* FIXME: currently ignored */ } void palette_reset(void) { /* FIXME: currently ignored */ } void write_clip(wchar_t * data, int len, int must_deselect) { /* FIXME: currently ignored */ } void get_clip(wchar_t ** p, int *len) { if (p) { /* FIXME: currently nonfunctional */ *p = NULL; *len = 0; } } void set_title(char *title) { /* FIXME: currently ignored */ } void set_icon(char *title) { /* FIXME: currently ignored */ } void set_sbar(int total, int start, int page) { /* FIXME: currently ignored */ } void sys_cursor(int x, int y) { /* * This is meaningless under X. */ } void beep(int mode) { gdk_beep(); } int CharWidth(Context ctx, int uc) { /* * Under X, any fixed-width font really _is_ fixed-width. * Double-width characters will be dealt with using a separate * font. For the moment we can simply return 1. */ return 1; } Context get_ctx(void) { GdkGC *gc = gdk_gc_new(inst->area->window); return gc; } void free_ctx(Context ctx) { GdkGC *gc = (GdkGC *)ctx; gdk_gc_unref(gc); } /* * Draw a line of text in the window, at given character * coordinates, in given attributes. * * We are allowed to fiddle with the contents of `text'. */ void do_text(Context ctx, int x, int y, char *text, int len, unsigned long attr, int lattr) { GdkColor fg, bg; GdkGC *gc = (GdkGC *)ctx; fg.red = fg.green = fg.blue = 65535; bg.red = bg.green = bg.blue = 65535; gdk_gc_set_foreground(gc, &fg); gdk_gc_set_background(gc, &bg); gdk_draw_text(inst->area->window, inst->fonts[0], inst->white_gc, x*9, y*15 + inst->fonts[0]->ascent, text, len); } void do_cursor(Context ctx, int x, int y, char *text, int len, unsigned long attr, int lattr) { /* FIXME: passive cursor NYI */ if (attr & TATTR_PASCURS) { attr &= ~TATTR_PASCURS; attr |= TATTR_ACTCURS; } do_text(ctx, x, y, text, len, attr, lattr); } void modalfatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } int main(int argc, char **argv) { GtkWidget *window; gtk_init(&argc, &argv); do_defaults(NULL, &cfg); init_ucs(); back = &pty_backend; back->init(NULL, 0, NULL, 0term_init(); term_size(24, 80, 2000 Node-path: putty/unix/pty.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1693 Text-content-md5: 32f51b711150fabe92cf5647c2a6fd90 Text-content-sha1: 99b42950799f1dad0618c3bc632d78c921ba3a96 Content-length: 1809 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN#include #include #include "putty.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif static void pty_size(void); static void c_write(char *buf, int len) { from_backend(0, buf, len); } /* * Called to set up the pty. * * Returns an error message, or NULL on success. * * Also places the canonical host name into `realhost'. It must be * freed by the caller. */ static char *pty_init(char *host, int port, char **realhost, int nodelay) { /* FIXME: do nothing for now */ return NULL; } /* * Called to send data down the pty. */ static int pty_send(char *buf, int len) { c_write(buf, len); /* FIXME: diagnostic thingy */ return 0; } /* * Called to query the current socket sendability status. */ static int pty_sendbuffer(void) { return 0; } /* * Called to set the size of the window */ static void pty_size(void) { /* FIXME: will need to do TIOCSWINSZ or whatever. */ return; } /* * Send special codes. */ static void pty_special(Telnet_Special code) { /* Do nothing! */ return; } static Socket pty_socket(void) { return NULL; /* shouldn't ever be needed */ } static int pty_sendok(void) { return 1; } static void pty_unthrottle(int backlog) { /* do nothing */ } static int pty_ldisc(int option) { return 0; /* neither editing nor echoing */ } static int pty_exitcode(void) { /* Shouldn't ever be required */ return 0; } Backend pty_backend = { pty_init, pty_send, pty_sendbuffer, pty_size, pty_special, pty_socket, pty_exitcode, pty_sendok, pty_ldisc, pty_unthrottle, 1 }; Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: abb71b94ab6c176507a28da837af3c97 Text-delta-base-sha1: 192edcffda86d88d6d454f9e5af804b56697df55 Text-content-length: 217 Text-content-md5: 6a6c43b8945deee6b146465d985a3950 Text-content-sha1: 47432912e3081a92945dddd456f799f3a7827372 Content-length: 256 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNY>xSv#PHextern Backend pty_backend;int is_dbcs_leadbyte(int codepage, char byte); int mb_to_wc(int codepage, int flags, char *mbstr, int mblen, wchar_t *wcstr, int wclen); void init_ucs(void); Node-path: putty/unix/uxprint.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 498 Text-content-md5: b3e4bc953629118753676fcf6a361a0f Text-content-sha1: 3d2a3658f3ea313938a54837f589a310a9dad9cd Content-length: 614 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNddd/* * Printing interface for PuTTY. */ #include #include "putty.h" printer_job *printer_start_job(char *printer) { /* FIXME: open pipe to lpr */ return NULL; } void printer_job_data(printer_job *pj, void *data, int len) { /* FIXME: receive a pipe to lpr, write things to it */ assert(!"We shouldn't get here"); } void printer_finish_job(printer_job *pj) { /* FIXME: receive a pipe to lpr, close it */ assert(!"We shouldn't get here either"); } Node-path: putty/unix/uxstore.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1328 Text-content-md5: f2ccd388d464f2f3f46d9a5d5cf94381 Text-content-sha1: 7a8680b3afa509b1746995bd2d971b013dc71cde Content-length: 1444 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN"""/* * uxstore.c: Unix-specific implementation of the interface defined * in storage.h. */ #include #include #include "putty.h" #include "storage.h" /* FIXME. For the moment, we do nothing at all here. */ void *open_settings_w(char *sessionname) { return NULL; } void write_setting_s(void *handle, char *key, char *value) { } void write_setting_i(void *handle, char *key, int value) { } void close_settings_w(void *handle) { } void *open_settings_r(char *sessionname) { return NULL; } char *read_setting_s(void *handle, char *key, char *buffer, int buflen) { return NULL; } int read_setting_i(void *handle, char *key, int defvalue) { return defvalue; } void close_settings_r(void *handle) { } void del_settings(char *sessionname) { } void *enum_settings_start(void) { return NULL; } char *enum_settings_next(void *handle, char *buffer, int buflen) { return NULL; } void enum_settings_finish(void *handle) { } int verify_host_key(char *hostname, int port, char *keytype, char *key) { return 1; /* key does not exist in registry */ } void store_host_key(char *hostname, int port, char *keytype, char *key) { } void read_random_seed(noise_consumer_t consumer) { } void write_random_seed(void *data, int len) { } void cleanup_all(void) { } Node-path: putty/unix/uxucs.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2699 Text-content-md5: 590fe569247de6c97aee9be671ebb67e Text-content-sha1: 5c05cd0d774bbeb298fa02413cea2ae19a10b28d Content-length: 2815 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN}}}#include #include #include #include #include "putty.h" #include "misc.h" /* * Unix Unicode-handling routines. * * FIXME: currently trivial stub versions assuming all codepages * are ISO8859-1. */ void lpage_send(int codepage, char *buf, int len, int interactive) { ldisc_send(buf, len, interactive); } void luni_send(wchar_t * widebuf, int len, int interactive) { static char *linebuffer = 0; static int linesize = 0; int ratio = (in_utf)?6:1; int i; char *p; if (len * ratio > linesize) { sfree(linebuffer); linebuffer = smalloc(len * ratio * 2 * sizeof(wchar_t)); linesize = len * ratio * 2; } if (in_utf) { /* UTF is a simple algorithm */ for (p = linebuffer, i = 0; i < len; i++) { wchar_t ch = widebuf[i]; if ((ch&0xF800) == 0xD800) ch = '.'; if (ch < 0x80) { *p++ = (char) (ch); } else if (ch < 0x800) { *p++ = (0xC0 | (ch >> 6)); *p++ = (0x80 | (ch & 0x3F)); } else if (ch < 0x10000) { *p++ = (0xE0 | (ch >> 12)); *p++ = (0x80 | ((ch >> 6) & 0x3F)); *p++ = (0x80 | (ch & 0x3F)); } else if (ch < 0x200000) { *p++ = (0xF0 | (ch >> 18)); *p++ = (0x80 | ((ch >> 12) & 0x3F)); *p++ = (0x80 | ((ch >> 6) & 0x3F)); *p++ = (0x80 | (ch & 0x3F)); } else if (ch < 0x4000000) { *p++ = (0xF8 | (ch >> 24)); *p++ = (0x80 | ((ch >> 18) & 0x3F)); *p++ = (0x80 | ((ch >> 12) & 0x3F)); *p++ = (0x80 | ((ch >> 6) & 0x3F)); *p++ = (0x80 | (ch & 0x3F)); } else { *p++ = (0xFC | (ch >> 30)); *p++ = (0x80 | ((ch >> 24) & 0x3F)); *p++ = (0x80 | ((ch >> 18) & 0x3F)); *p++ = (0x80 | ((ch >> 12) & 0x3F)); *p++ = (0x80 | ((ch >> 6) & 0x3F)); *p++ = (0x80 | (ch & 0x3F)); } } } else { for (p = linebuffer, i = 0; i < len; i++) { wchar_t ch = widebuf[i]; if (ch < 0x100) *p++ = (char) ch; else *p++ = '.'; } } if (p > linebuffer) ldisc_send(linebuffer, p - linebuffer, interactive); } int is_dbcs_leadbyte(int codepage, char byte) { return 0; /* we don't do DBCS */ } int mb_to_wc(int codepage, int flags, char *mbstr, int mblen, wchar_t *wcstr, int wclen) { int ret = 0; while (mblen > 0 && wclen > 0) { *wcstr++ = (unsigned char) *mbstr++; ret++; } return ret; /* FIXME: check error codes! */ } void init_ucs(void) { int i; /* Find the line control characters. FIXME: this is not right. */ for (i = 0; i < 256; i++) if (i < ' ' || (i >= 0x7F && i < 0xA0)) unitab_ctrl[i] = i; else unitab_ctrl[i] = 0xFF; for (i = 0; i < 256; i++) { unitab_line[i] = unitab_scoacs[i] = i; unitab_xterm[i] = i & 0x1F; } } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9533b5d5c695e6dc7de641d1c3c58306 Text-delta-base-sha1: 4ee5b3fb30832b8dab1d7564046451501cac01ed Text-content-length: 148 Text-content-md5: 7e8714dc21716a9dfbb9020f8783f6f6 Text-content-sha1: 1191c0c986cd27fbc170ab7b4551e1f3342391cb Content-length: 189 K 15 cvs2svn:cvs-rev V 5 1.202 PROPS-END SVNT(hO6RPrint a modal (Really Bad) message box and perform a fatal exit. */ void modal MB_SYSTEMMODAL | Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2bb9c06689db4d792a7bf975b45f276d Text-delta-base-sha1: 0644d57bf5b91aae235b9a1caa91a0ed44c194c0 Text-content-length: 481 Text-content-md5: cc8fa5d7618f9445daab6ae2b2aedec1 Text-content-sha1: 77b0966ef2cd80093298abd7bf9a0f9378198b09 Content-length: 521 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN6} H@Fu:showeventlog(HWND); void showabout(HWND); void force_normal(HWND hwnd)/* * Unicode and multi-byte character handling stuff. */ #define is_dbcs_leadbyte(cp, c) IsDBCSLeadByteEx(cp, c) #define mb_to_wc(cp, flags, mbstr, mblen, wcstr, wclen) \ MultiByteToWideChar(cp, flags, mbstr, mblen, wcstr, wclen) #define wc_to_mb(cp, flags, wcstr, wclen, mbstr, mblen, def, defused) \ WideCharToMultiByte(cp, flags, mbstr, mblen, wcstr, wclen, def,defused) #endif Revision-number: 2011 Prop-content-length: 346 Content-length: 346 K 8 svn:date V 27 2002-10-10T10:40:30.000000Z K 7 svn:log V 245 A sensible minimum of do_text() and do_cursor() is now implemented. This means pterm actually _looks_ like the PuTTY terminal emulator engine, instead of merely giving evidence to the expert eye that said engine is hidden in there somewhere :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e16daf350d1743bf5e00bfd617488861 Text-delta-base-sha1: 92513883b7a55d7de4e551f823bdab6d3941710c Text-content-length: 3649 Text-content-md5: f0b88b9d8f3a3e46152cb1aa66df5514 Text-content-sha1: 26b488fd9668b2f97a8adb6af68cb671da3ed6ff Content-length: 3688 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN@_V&dH.yuTb&4W5J>=Xrico]\T1assert#define NCOLOURS (lenof(((Config *)0)->colours)) struct gui_data { GtkWidget *area; GdkPixmap *pixmap; GdkFont *fonts[2]; /* normal and bold (for now!) */ GdkCursor *rawcursor, *textcursor; GdkColor cols[NCOLOURS]; GdkColormap *colmap;static int send_raw_mouse;f (inst->pixmap) gdk_pixmap_unref(inst->pixmap); inst->pixmap = gdk_pixmap_new(widget->window, 9*80, 15*24, -1)static const int ww[] = { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, 1, 2, 3, 4, 5 }; gboolean success[NCOLOURS]; int i; assert(lenof(ww) == NCOLOURS); for (i = 0; i < NCOLOURS; i++) { inst->cols[i].red = cfg.colours[ww[i]][0] * 0x0101; inst->cols[i].green = cfg.colours[ww[i]][1] * 0x0101; inst->cols[i].blue = cfg.colours[ww[i]][2] * 0x0101; } gdk_colormap_alloc_colors(inst->colmap, inst->cols, NCOLOURS, FALSE, FALSE, success); for (i = 0; i < NCOLOURS; i++) { if (!success[i]) g_error("pterm: couldn't allocate colour %d (#%02x%02x%02x)\n", i, cfg.colours[i][0], cfg.colours[i][1], cfg.colours[i][2]); } }ldisc_send(event->string, strlen(event->string)has_focus = event->in; term_out(); term_update(); return FALSE; } /* * set or clear the "raw mouse message" mode */ void set_raw_mouse_mode(int activate) { activate = activate && !cfg.no_mouse_rep; send_raw_mouse = activate; if (send_raw_mouse) gdk_window_set_cursor(inst->area->window, inst->rawcursor); else gdk_window_set_cursor(inst->area->window, inst->textcursor);; if (!inst->area->window) return NULL; int nfg, nbg, t; GdkGC *gc = (GdkGC *)ctx; /* * NYI: * - ATTR_WIDE (is this for Unicode CJK? I hope so) * - LATTR_* (ESC # 4 double-width and double-height stuff) * - cursor shapes other than block * - VT100 line drawing stuff; code pages in general! * - shadow bolding * - underline */ nfg = 2 * ((attr & ATTR_FGMASK) >> ATTR_FGSHIFT); nbg = 2 * ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT); if (attr & ATTR_REVERSE) { t = nfg; nfg = nbg; nbg = t; } if (cfg.bold_colour && (attr & ATTR_BOLD)) nfg++; if (cfg.bold_colour && (attr & ATTR_BLINK)) nbg++; if (attr & TATTR_ACTCURS) { nfg = NCOLOURS-2; nbg = NCOLOURS-1; } gdk_gc_set_foreground(gc, &inst->cols[nbg]); gdk_draw_rectangle(inst->pixmap, gc, 1, x*9, y*15, len*9, 15); gdk_gc_set_foreground(gc, &inst->cols[nfg]); gdk_draw_text(inst->pixmap, inst->fonts[0], gc, x*9, y*15 + inst->fonts[0]->ascent, text, len); if (attr & ATTR_UNDER) { int uheight = inst->fonts[0]->ascent + 1; if (uheight >= 15) uheight = 14; gdk_draw_line(inst->pixmap, gc, x*9, y*15 + uheight, (x+len)*9-1, y*15+uheight); } gdk_draw_pixmap(inst->area->window, gc, inst->pixmap, x*9, y*15, x*9, y*15, len*9, 15int passive; GdkGC *gc = (GdkGC *)ctx; /* * NYI: cursor shapes other than block */ if (attr & TATTR_PASCURS) { attr &= ~TATTR_PASCURS; passive = 1; } else passive = 0; do_text(ctx, x, y, text, len, attr, lattr); if (passive) { gdk_gc_set_foreground(gc, &inst->cols[NCOLOURS-1]); gdk_draw_rectangle(inst->pixmap, gc, 0, x*9, y*15, len*9-1, 15-1); gdk_draw_pixmap(inst->area->window, gc, inst->pixmap, x*9, y*15, x*9, y*15, len*9, 15); }inst->textcursor = gdk_cursor_new(GDK_XTERM); inst->rawcursor = gdk_cursor_new(GDK_ARROW); gdk_window_set_cursor(inst->area->window, inst->textcursor Revision-number: 2012 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2002-10-10T11:33:46.000000Z K 7 svn:log V 75 Temporary hack which makes vt100 line drawing work in the prototype pterm. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 590fe569247de6c97aee9be671ebb67e Text-delta-base-sha1: 5c05cd0d774bbeb298fa02413cea2ae19a10b28d Text-content-length: 37 Text-content-md5: 6989503d2bdf3328aa2418f744d84d19 Text-content-sha1: 690a4029a739990a448158fc619d7cf586dd533d Content-length: 76 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN}l(i+1) & 0x1F; } } Revision-number: 2013 Prop-content-length: 435 Content-length: 435 K 8 svn:date V 27 2002-10-10T12:14:05.000000Z K 7 svn:log V 334 Half-decent keyboard handling for pterm. Not very well done - it would have been better to abstract the general key-handling rules away from the platform-specific keysyms rather than doing clone- and-hack as I've done - but it'll serve for now. Now all I need is a real pty back end and pterm should be a just-about-usable prototype. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f0b88b9d8f3a3e46152cb1aa66df5514 Text-delta-base-sha1: 26b488fd9668b2f97a8adb6af68cb671da3ed6ff Text-content-length: 9549 Text-content-md5: b465eece415f6ae24600fc84554d9027 Text-content-sha1: d54b8eb3a9b492ff08367adb041dff3ce883b5fb Content-length: 9588 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN@.~vzwI#include type == GDK_KEY_PRESS) { #ifdef KEY_DEBUGGING { int i; printf("keypress: keyval = %04x, state = %08x; string =", event->keyval, event->state); for (i = 0; event->string[i]; i++) printf(" %02x", (unsigned char) event->string[i]); printf("\n"); } #endif /* * NYI: * - Shift-PgUp/PgDn for scrollbar * - nethack mode * - alt+numpad * - Compose key (!!! requires Unicode faff before even trying) * - Shift-Ins for paste (need to deal with pasting first) */ /* ALT+things gives leading Escape. */ output[0] = '\033'; strncpy(output+1, event->string, 31); output[31] = '\0'; end = strlen(output); if (event->state & GDK_MOD1_MASK) start = 0; else start = 1; /* Control-` is the same as Control-\ (unless gtk has a better idea) */ if (!event->string[0] && event->keyval == '`' && (event->state & GDK_CONTROL_MASK)) { output[1] = '\x1C'; end = 2; } /* Control-Break is the same as Control-C */ if (event->keyval == GDK_Break && (event->state & GDK_CONTROL_MASK)) { output[1] = '\003'; end = 2; } /* Control-2, Control-Space and Control-@ are NUL */ if (!event->string[0] && (event->keyval == ' ' || event->keyval == '2' || event->keyval == '@') && (event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) == GDK_CONTROL_MASK) { output[1] = '\0'; end = 2; } /* Control-Shift-Space is 160 (ISO8859 nonbreaking space) */ if (!event->string[0] && event->keyval == ' ' && (event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) == (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) { output[1] = '\240'; end = 2; } /* We don't let GTK tell us what Backspace is! We know better. */ if (event->keyval == GDK_BackSpace && !(event->state & GDK_SHIFT_MASK)) { output[1] = cfg.bksp_is_delete ? '\x7F' : '\x08'; end = 2; } /* Shift-Tab is ESC [ Z */ if (event->keyval == GDK_ISO_Left_Tab || (event->keyval == GDK_Tab && (event->state & GDK_SHIFT_MASK))) { end = 1 + sprintf(output+1, "\033[Z"); } /* * Application keypad mode. */ if (app_keypad_keys && !cfg.no_applic_k) { int xkey = 0; switch (event->keyval) { case GDK_Num_Lock: xkey = 'P'; break; case GDK_KP_Divide: xkey = 'Q'; break; case GDK_KP_Multiply: xkey = 'R'; break; case GDK_KP_Subtract: xkey = 'S'; break; /* * Keypad + is tricky. It covers a space that would * be taken up on the VT100 by _two_ keys; so we * let Shift select between the two. Worse still, * in xterm function key mode we change which two... */ case GDK_KP_Add: if (cfg.funky_type == 2) { if (event->state & GDK_SHIFT_MASK) xkey = 'l'; else xkey = 'k'; } else if (event->state & GDK_SHIFT_MASK) xkey = 'm'; else xkey = 'l'; break; case GDK_KP_Enter: xkey = 'M'; break; case GDK_KP_0: case GDK_KP_Insert: xkey = 'p'; break; case GDK_KP_1: case GDK_KP_End: xkey = 'q'; break; case GDK_KP_2: case GDK_KP_Down: xkey = 'r'; break; case GDK_KP_3: case GDK_KP_Page_Down: xkey = 's'; break; case GDK_KP_4: case GDK_KP_Left: xkey = 't'; break; case GDK_KP_5: case GDK_KP_Begin: xkey = 'u'; break; case GDK_KP_6: case GDK_KP_Right: xkey = 'v'; break; case GDK_KP_7: case GDK_KP_Home: xkey = 'w'; break; case GDK_KP_8: case GDK_KP_Up: xkey = 'x'; break; case GDK_KP_9: case GDK_KP_Page_Up: xkey = 'y'; break; case GDK_KP_Decimal: case GDK_KP_Delete: xkey = 'n'; break; } if (xkey) { if (vt52_mode) { if (xkey >= 'P' && xkey <= 'S') end = 1 + sprintf(output+1, "\033%c", xkey); else end = 1 + sprintf(output+1, "\033?%c", xkey); } else end = 1 + sprintf(output+1, "\033O%c", xkey); goto done; } } /* * Next, all the keys that do tilde codes. (ESC '[' nn '~', * for integer decimal nn.) * * We also deal with the weird ones here. Linux VCs replace F1 * to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but * does replace Home and End (1~ and 4~) by ESC [ H and ESC O w * respectively. */ { int code = 0; switch (event->keyval) { case GDK_F1: code = (event->state & GDK_SHIFT_MASK ? 23 : 11); break; case GDK_F2: code = (event->state & GDK_SHIFT_MASK ? 24 : 12); break; case GDK_F3: code = (event->state & GDK_SHIFT_MASK ? 25 : 13); break; case GDK_F4: code = (event->state & GDK_SHIFT_MASK ? 26 : 14); break; case GDK_F5: code = (event->state & GDK_SHIFT_MASK ? 28 : 15); break; case GDK_F6: code = (event->state & GDK_SHIFT_MASK ? 29 : 17); break; case GDK_F7: code = (event->state & GDK_SHIFT_MASK ? 31 : 18); break; case GDK_F8: code = (event->state & GDK_SHIFT_MASK ? 32 : 19); break; case GDK_F9: code = (event->state & GDK_SHIFT_MASK ? 33 : 20); break; case GDK_F10: code = (event->state & GDK_SHIFT_MASK ? 34 : 21); break; case GDK_F11: code = 23; break; case GDK_F12: code = 24; break; case GDK_F13: code = 25; break; case GDK_F14: code = 26; break; case GDK_F15: code = 28; break; case GDK_F16: code = 29; break; case GDK_F17: code = 31; break; case GDK_F18: code = 32; break; case GDK_F19: code = 33; break; case GDK_F20: code = 34; break; } if (!(event->state & GDK_CONTROL_MASK)) switch (event->keyval) { case GDK_Home: case GDK_KP_Home: code = 1; break; case GDK_Insert: case GDK_KP_Insert: code = 2; break; case GDK_Delete: case GDK_KP_Delete: code = 3; break; case GDK_End: case GDK_KP_End: code = 4; break; case GDK_Page_Up: case GDK_KP_Page_Up: code = 5; break; case GDK_Page_Down: case GDK_KP_Page_Down: code = 6; break; } /* Reorder edit keys to physical order */ if (cfg.funky_type == 3 && code <= 6) code = "\0\2\1\4\5\3\6"[code]; if (vt52_mode && code > 0 && code <= 6) { end = 1 + sprintf(output+1, "\x1B%c", " HLMEIG"[code]); goto done; } if (cfg.funky_type == 5 && /* SCO function keys */ code >= 11 && code <= 34) { char codes[] = "MNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@[\\]^_`{"; int index = 0; switch (event->keyval) { case GDK_F1: index = 0; break; case GDK_F2: index = 1; break; case GDK_F3: index = 2; break; case GDK_F4: index = 3; break; case GDK_F5: index = 4; break; case GDK_F6: index = 5; break; case GDK_F7: index = 6; break; case GDK_F8: index = 7; break; case GDK_F9: index = 8; break; case GDK_F10: index = 9; break; case GDK_F11: index = 10; break; case GDK_F12: index = 11; break; } if (event->state & GDK_SHIFT_MASK) index += 12; if (event->state & GDK_CONTROL_MASK) index += 24; end = 1 + sprintf(output+1, "\x1B[%c", codes[index]); goto done; } if (cfg.funky_type == 5 && /* SCO small keypad */ code >= 1 && code <= 6) { char codes[] = "HL.FIG"; if (code == 3) { output[1] = '\x7F'; end = 2; } else { end = 1 + sprintf(output+1, "\x1B[%c", codes[code-1]); } goto done; } if ((vt52_mode || cfg.funky_type == 4) && code >= 11 && code <= 24) { int offt = 0; if (code > 15) offt++; if (code > 21) offt++; if (vt52_mode) end = 1 + sprintf(output+1, "\x1B%c", code + 'P' - 11 - offt); else end = 1 + sprintf(output+1, "\x1BO%c", code + 'P' - 11 - offt); goto done; } if (cfg.funky_type == 1 && code >= 11 && code <= 15) { end = 1 + sprintf(output+1, "\x1B[[%c", code + 'A' - 11); goto done; } if (cfg.funky_type == 2 && code >= 11 && code <= 14) { if (vt52_mode) end = 1 + sprintf(output+1, "\x1B%c", code + 'P' - 11); else end = 1 + sprintf(output+1, "\x1BO%c", code + 'P' - 11); goto done; } if (cfg.rxvt_homeend && (code == 1 || code == 4)) { end = 1 + sprintf(output+1, code == 1 ? "\x1B[H" : "\x1BOw"); goto done; } if (code) { end = 1 + sprintf(output+1, "\x1B[%d~", code); goto done; } } /* * Cursor keys. (This includes the numberpad cursor keys, * if we haven't already done them due to app keypad mode.) * * Here we also process un-numlocked un-appkeypadded KP5, * which sends ESC [ G. */ { int xkey = 0; switch (event->keyval) { case GDK_Up: case GDK_KP_Up: xkey = 'A'; break; case GDK_Down: case GDK_KP_Down: xkey = 'B'; break; case GDK_Right: case GDK_KP_Right: xkey = 'C'; break; case GDK_Left: case GDK_KP_Left: xkey = 'D'; break; case GDK_Begin: case GDK_KP_Begin: xkey = 'G'; break; } if (xkey) { /* * The arrow keys normally do ESC [ A and so on. In * app cursor keys mode they do ESC O A instead. * Ctrl toggles the two modes. */ if (vt52_mode) { end = 1 + sprintf(output+1, "\033%c", xkey); } else if (!app_cursor_keys ^ !(event->state & GDK_CONTROL_MASK)) { end = 1 + sprintf(output+1, "\033O%c", xkey); } else { end = 1 + sprintf(output+1, "\033[%c", xkey); } goto done; } } done: #ifdef KEY_DEBUGGING { int i; printf("generating sequence:"); for (i = start; i < end; i++) printf(" %02x", (unsigned char) output[i]); printf("\n"); } #endif ldisc_send(output+start, end-start Revision-number: 2014 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:45.739513Z PROPS-END Revision-number: 2015 Prop-content-length: 302 Content-length: 302 K 8 svn:date V 27 2002-10-10T12:40:05.000000Z K 7 svn:log V 201 And that's it! pty.c is now a real pty backend rather than a loopback interface; pterm now runs $SHELL and gives every impression of being not a bad terminal emulator. I'm quite pleased with that. :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b465eece415f6ae24600fc84554d9027 Text-delta-base-sha1: d54b8eb3a9b492ff08367adb041dff3ce883b5fb Text-content-length: 777 Text-content-md5: 66c8da99414ece69b40a8d6d31f5a783 Text-content-sha1: fc6b234790316a05519d5b7f3fa16253cac0125c Content-length: 816 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN [ste>O*\&serrno.h> #include #include 0) from_backend(0, buf, ret); term_out() extern int pty_master_fd; /* declared in pty.c */dk_input_add(pty_master_fd, GDK_INPUT_READ, pty_input Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 32f51b711150fabe92cf5647c2a6fd90 Text-delta-base-sha1: 99b42950799f1dad0618c3bc632d78c921ba3a96 Text-content-length: 1545 Text-content-md5: cc4a0c9c14db13d389759bf9ad5162fc Text-content-sha1: 7675decb45117d15c3d2c2cc687ba13fa1d9119a Content-length: 1584 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNxb b#r'oS<#define _XOPEN_SOURCE #include #include #include #include #include #include 0) { int ret = write(pty_master_fd, buf, len); if (ret < 0) { perror("write pty master"); exit(1); } buf += ret; len -= ret; } Revision-number: 2016 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 New report, with HTTP proxying this time. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-10-10T12:49:30.000000Z PROPS-END Node-path: putty-wishlist/data/x11-socks-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2b5a8f91691e3e93ac648f7337802375 Text-delta-base-sha1: 1b71b6df1ade97b3ca366e3c568a5101e524961a Text-content-length: 487 Text-content-md5: 1aa82faaec3f42e5518d67ffc7d54a9b Text-content-sha1: 843539c786b5a9c7515a824973c0fba386bff9a5 Content-length: 526 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN aLB+:S9mSummary: Opening X11 connections withproxy causes PuTTY to crash. Reports so far:

    • Ref: <3D9B9963.3000006@metaprogramming.org>
      Against OpenSSH 2.9.9p2 (unspecified protocol), SOCKS5 proxy With SSHv2 against F-SECURE 2.3.1, SOCKS5 proxy
    • Ref: <20021010114830.53187.qmail@web20909.mail.yahoo.com>
      With SSHv2 against OpenSSH 3.1p1, HTTP proxy
      Report has SSH packet log and Dr Watson log.
    Revision-number: 2017 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2002-10-10T12:50:11.000000Z K 7 svn:log V 47 Renamed `x11-socks-crash' to `x11-proxy-crash' K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/x11-proxy-crash Node-kind: file Node-action: add Node-copyfrom-rev: 2016 Node-copyfrom-path: putty-wishlist/data/x11-socks-crash Text-copy-source-md5: 1aa82faaec3f42e5518d67ffc7d54a9b Text-copy-source-sha1: 843539c786b5a9c7515a824973c0fba386bff9a5 Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1aa82faaec3f42e5518d67ffc7d54a9b Text-delta-base-sha1: 843539c786b5a9c7515a824973c0fba386bff9a5 Text-content-length: 15 Text-content-md5: 1aa82faaec3f42e5518d67ffc7d54a9b Text-content-sha1: 843539c786b5a9c7515a824973c0fba386bff9a5 Content-length: 54 K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNaaa Node-path: putty-wishlist/data/x11-socks-crash Node-action: delete Revision-number: 2018 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2002-10-10T13:05:40.000000Z K 7 svn:log V 147 Modified closed wish 'command-line' to reflect what was actually done. Moved some of the outstanding stuff into its own wish 'cmdline-any-option'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/cmdline-any-option Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 500 Text-content-md5: aec0ed9274da6d2c2aa78d9fe5a48f12 Text-content-sha1: 33ff8fa0f28d4f0b4f2ac547e02e46eeb1ba5429 Content-length: 616 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNfffSummary: Command-line general `-o Name=Value' type option Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body Depends: config-locations

    Ability to tweak any option via something like OpenSSH's `-o Name=Value' option. Need to think about how to deal with complex options like colour selection. Also, some of the existing names for options in the Registry are inappropriate - e.g., `LinuxFunctionKeys'. Seems dependent on wishlist item `config-locations'. Node-path: putty-wishlist/data/command-line Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1d436501ca844c8f67ada0862330bf1e Text-delta-base-sha1: d516bbb7e48d2ecadff49878dd134b2a1d0c7e28 Text-content-length: 26 Text-content-md5: 24bfd7b21439bcc8d7988068eb70242e Text-content-sha1: 57f1ee5e3f16834c5af9f96eb01b8f1a14ba8d00 Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN'E *3/ul> Revision-number: 2019 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2002-10-10T13:08:15.000000Z K 7 svn:log V 80 Simon implemented SOCKS5 and HTTP proxy authentication before the 0.53 release. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8f59ac8e352a0386c4b8cdcb138f4b2f Text-delta-base-sha1: 85fd888eb7c2e0d6a43ad53c252f6d1b30bf7a55 Text-content-length: 33 Text-content-md5: 303e5d0b83a12ade61b4e061afe261f6 Text-content-sha1: 543e0bca0770cd07a76d767fdf58de4d8b0db57e Content-length: 72 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNk gwq0.53in 0.53. Revision-number: 2020 Prop-content-length: 136 Content-length: 136 K 7 svn:log V 36 Hopefully this one is now squashed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-10-10T13:14:20.000000Z PROPS-END Node-path: putty-wishlist/data/nonexistent-channel Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1ba2fa0dc055202aaad3ce41510ddfb1 Text-delta-base-sha1: 42a0d6f26d2bf943f4ba8e8446d929df66df804f Text-content-length: 300 Text-content-md5: 42641993ecf6374f6026e0484981250e Text-content-sha1: 3650908199e3c6add640f87092a21a22e36d3652 Content-length: 339 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN+? zFixed-in: 2002-09-16 0.53

    Update 2002-09-15: We believe the last bug of this kind has been squashed as of 2002-09-16; no-one's confirmed this, but no-one's complained either. We've also put code in which will hopefully make catching any remaining problems easier. Revision-number: 2021 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2002-10-10T13:17:27.000000Z K 7 svn:log V 46 Probably depends on 'config-inheritance' too. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/cmdline-any-option Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aec0ed9274da6d2c2aa78d9fe5a48f12 Text-delta-base-sha1: 33ff8fa0f28d4f0b4f2ac547e02e46eeb1ba5429 Text-content-length: 188 Text-content-md5: 5180315687eab39698f19fbe5788cac1 Text-content-sha1: 81c5f87fc95fec1192d9399adccc4f494e0e5dcb Content-length: 227 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNfZ)1)Definitely dependent on wishlist item `config-locations' - possibly also `config-inheritance'? Revision-number: 2022 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2002-10-10T13:20:30.000000Z K 7 svn:log V 33 Considering this closed by 0.53. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-shortcut Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fbf8085e5fe450f8298d8a3267e02ed0 Text-delta-base-sha1: 05897bd1d7fbc917d139d374891d6ade2fe6526e Text-content-length: 204 Text-content-md5: a28e49c0bd6bed10a6496f2b7229c9d3 Text-content-sha1: 5a8aac1e48ca9e7aad81449a4db82d0f20c8edeb Content-length: 243 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN- 5M+L'Fixed-in: 0.53As of 0.53, the @session syntax is deprecated in favour of -load session. There should be no reason to use an @ sign in a shortcut any more. Revision-number: 2023 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2002-10-10T13:33:16.000000Z K 7 svn:log V 102 Summary: Ability to backend onto a Windows command interpreter (this should have been added ages ago) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-command-prompt Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 426 Text-content-md5: 4c1953b87ce6841c9a2853b298570282 Text-content-sha1: 7e2befcd30f205173c9d401d4ec8e657a53ce266 Content-length: 542 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Ability to backend onto a Windows command interpreter Class: wish Difficulty: taxing Priority: medium Content-type: text/x-html-body

    It would clearly be desirable for PuTTY to be able to act as a front end for Windows command interpreters (Command Prompt, bash, etc).

    In a pipe? Probably only for NT-class systems?

    Workaround for now is to set up a local SSH or telnet server, of course. Revision-number: 2024 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2002-10-10T13:47:02.000000Z K 7 svn:log V 68 Summary: Support for SSH-2 password expiry mechanisms Priority: low K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 498 Text-content-md5: 7f3d5f013e55f7934e58a46f7a0ea995 Text-content-sha1: f48cd08bfe2e5f923ba53eddddd3ecc1cd477090 Content-length: 614 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNdddSummary: Support for SSH-2 password expiry mechanisms Class: semi-bug Priority: low Difficulty: fun Content-type: text/x-html-body

    PuTTY doesn't currently support the password expiry mechanisms represented in draft-ietf-secsh-userauth-16 by SSH_MSG_USERAUTH_PASSWD_CHANGEREQ et al.

    But then again, no-one's complained. Most servers seem to use keyboard-interactive to implement this, so maybe it would just be code bloat serving no useful purpose. Revision-number: 2025 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 37 May as well add "start up maximised" K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-10-10T13:52:03.000000Z PROPS-END Node-path: putty-wishlist/data/startup-fullscreen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a97b27996efffa75d9b9a8e263038146 Text-delta-base-sha1: e13697485b12e02fd504407d8c8940033806be97 Text-content-length: 216 Text-content-md5: 72a37869b14a80277e710775bee5b144 Text-content-sha1: 0edfc8159b025d7b43e9820e98f0cf2e73d1507b Content-length: 255 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNMEE

    While we're at it, we may as well an option for `maximised', even though you can already do that by other means. Revision-number: 2026 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2002-10-10T14:39:35.000000Z K 7 svn:log V 32 Update to reflect 0.53 release. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a83e605060f14198ae5cbfa5cd92f8af Text-delta-base-sha1: c5e429e7e297a066aa2b7c21c81871fbb4519ffd Text-content-length: 681 Text-content-md5: 087d726528c29427ab56f20e91022d60 Text-content-sha1: c812aac3d97d1204b3e70615dba2d38116feff33 Content-length: 721 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN}*qw2 s1}J.# "L1\versionid $Id: faq.but,v 1.36 2002/10/10 14:39:35PuTTY doesn't support this natively, but as of 0.53 PuTTYgen can convert both OpenSSH and \cw{ssh.com} private key files into PuTTY's format-load mysession (Note: prior to 0.53, the syntax was \c{@session}. This is now deprecated and may be removed at some point.)roxying, cipher selection, etc.) in PSCP, PSFTP and Plink? Most major features (e.g., public keys, port forwarding) are available through command line options. See the documentation. Not all features are accessible from the command line yet, although we'd like to fix this. In the meantimeor better or better Revision-number: 2027 Prop-content-length: 346 Content-length: 346 K 7 svn:log V 245 Stop hard-coding a nonstandard font. We now default to `fixed', and pick up the font's real width and height. This means I now _can't_ use my font of choice until I implement some command-line options; I wonder what feature will appear next :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-10T14:42:56.000000Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cf5fb5fed3ae5688defd15ddad62be8e Text-delta-base-sha1: 0b7706145f30ec6ef10a3c623b7bc17ce1af9399 Text-content-length: 194 Text-content-md5: f3da128957579e8a4fa99308bddeb8f1 Text-content-sha1: 2f7d264f6d46e71ec8cc68b09f3f6acb885bd89a Content-length: 234 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVN(&J&#ifdef _WINDOWS gpps(sesskey, "Font", "Courier New", cfg->font, sizeof(cfg->font)); #else gpps(sesskey, "Font", "fixed", cfg->font, sizeof(cfg->font)); #endif Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 66c8da99414ece69b40a8d6d31f5a783 Text-delta-base-sha1: fc6b234790316a05519d5b7f3fa16253cac0125c Text-content-length: 1556 Text-content-md5: 260f9d98a770e21a99e4e686aaac6356 Text-content-sha1: 1dd2ecb1bc0413e50e9579c6a9a9adf245bed945 Content-length: 1595 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN AJ<OQMP:%EC`cl82#X VvhUC4l int font_width, font_height cfg.width * inst->font_width, cfg.height * inst->font_height, -1); inst->font_width, event->area.y / inst->font_height, (event->area.x + event->area.width - 1) / inst->font_width, (event->area.y + event->area.height - 1) / inst->font_height x*inst->font_width, y*inst->font_height, len*inst->font_width, inst->font_height x*inst->font_width, y*inst->font_heightinst->font_height) uheight = inst->font_height - 1; gdk_draw_line(inst->pixmap, gc, x*inst->font_width, y*inst->font_height + uheight, (x+len)*inst->font_width-1, y*inst->font_height+uheight); } gdk_draw_pixmap(inst->area->window, gc, inst->pixmap, x*inst->font_width, y*inst->font_height, x*inst->font_width, y*inst->font_height, len*inst->font_width, inst->font_height x*inst->font_width, y*inst->font_height, len*inst->font_width-1, inst->font_height-1); gdk_draw_pixmap(inst->area->window, gc, inst->pixmap, x*inst->font_width, y*inst->font_height, x*inst->font_width, y*inst->font_height, len*inst->font_width, inst->font_heightst->fonts[0] = gdk_font_load(cfg.font); inst->fonts[1] = NULL; /* FIXME: what about bold font? */ inst->font_width = gdk_char_width(inst->fonts[0], ' '); inst->font_height = inst->fonts[0]->ascent + inst->fonts[0]->descentinst->font_width * cfg.width, inst->font_height * cfg.height); Revision-number: 2028 Prop-content-length: 122 Content-length: 122 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-10-10T18:23:13.000000Z K 7 svn:log V 22 I can reproduce this. PROPS-END Node-path: putty-wishlist/data/x11-proxy-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1aa82faaec3f42e5518d67ffc7d54a9b Text-delta-base-sha1: 843539c786b5a9c7515a824973c0fba386bff9a5 Text-content-length: 124 Text-content-md5: b37568b280f756398bb30a6a39e3a535 Text-content-sha1: cdab71cd10619165992bcdf8974018be3199b056 Content-length: 163 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNaGk\kli>I (JTN) can reproduce this with 0.53 SSH-1 (OpenSSH 1.2.3) and SSH-2 (3.4p1), with HTTP proxying. Revision-number: 2029 Prop-content-length: 553 Content-length: 553 K 7 svn:log V 452 Initialise some members of the Proxy_Socket structure that were left uninitialised. This problem only showed up with mingw builds of PuTTY (maybe MSVCRT is more forgiving with malloc initialisation than CRTDLL?). The 'error' field was causing me most trouble, and I think the other two were necessary too before things started working. Note however that I don't fully understand the code, and that there are more uninitialised fields in the structure. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-10-11T12:29:27.000000Z PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f202690f1338ff6907f54c85b5b30f72 Text-delta-base-sha1: 26d17e8dd653ad5d628afeb89529ac45ec7b282d Text-content-length: 186 Text-content-md5: f8cd9b98f1aff279aa7a4b5b0404a9fe Text-content-sha1: 016d1a176c00fc38b8440c505cc4bdcb1f8b6c50 Content-length: 225 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNq nj/* XXX review these initialisations, and initialise other fields * in Proxy_Socket structure */ ret->error = NULL; ret->pending_flush = 0; ret->freeze = 0 Revision-number: 2030 Prop-content-length: 229 Content-length: 229 K 7 svn:log V 128 The Great Defaults Change (and about time too)! SSH now defaults to protocol 2, and background-colour erase now defaults to on. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-13T08:56:58.000000Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f3da128957579e8a4fa99308bddeb8f1 Text-delta-base-sha1: 2f7d264f6d46e71ec8cc68b09f3f6acb885bd89a Text-content-length: 32 Text-content-md5: 247f197c0ba20c28fab72cc43af3dee6 Text-content-sha1: 8bc311934af04b60812f1d534e699e91b7a6bb24 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVN  { 21 Revision-number: 2031 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2002-10-13T09:54:36.000000Z K 7 svn:log V 67 Scrollbar now exists and functions; so do Shift-PgUp / Shift-PgDn. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 260f9d98a770e21a99e4e686aaac6356 Text-delta-base-sha1: 1dd2ecb1bc0413e50e9579c6a9a9adf245bed945 Text-content-length: 3754 Text-content-md5: 550680fe58ddaf42281f7863bcf7115d Text-content-sha1: b63d6bd39b4f2f0d8aa57b3b46c92731aa1f7c9d Content-length: 3793 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNAx$qBqsSF4kkR "~#Jwe;pRfM_ @u.82vHg,+, *sbar; GtkBox *hbox; GtkAdjustment *sbar_adjust(cfg.width * inst->font_width + 2*cfg.window_border), (cfg.height * inst->font_height + 2*cfg.window_border), -1); { GdkGC *gc; gc = gdk_gc_new(inst->area->window); gdk_gc_set_foreground(gc, &inst->cols[18]); /* default background */ gdk_draw_rectangle(inst->pixmap, gc, 1, 0, 0, cfg.width * inst->font_width + 2*cfg.window_border, cfg.height * inst->font_height + 2*cfg.window_border); gdk_gc_unref(gc); }if (inst->pixmap) { gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], inst->pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); } * Shift-PgUp and Shift-PgDn don't even generate keystrokes * at all. */ if (event->keyval == GDK_Page_Up && (event->state & GDK_SHIFT_MASK)) { term_scroll(0, -cfg.height/2); return TRUE; } if (event->keyval == GDK_Page_Down && (event->state & GDK_SHIFT_MASK)) { term_scroll(0, +cfg.height/2); return TRUE; }inst->sbar_adjust->lower = 0; inst->sbar_adjust->upper = total; inst->sbar_adjust->value = start; inst->sbar_adjust->page_size = page; inst->sbar_adjust->step_increment = 1; inst->sbar_adjust->page_increment = page/2; gtk_adjustment_changed(inst->sbar_adjust); } void scrollbar_moved(GtkAdjustment *adj, gpointer data) { term_scroll(1, (int)adj->value);+cfg.window_border, y*inst->font_height+cfg.window_border, len*inst->font_width, inst->font_height); x*inst->font_width+cfg.window_border, y*inst->font_height+cfg.window_border+inst->fonts[0]->ascent, +cfg.window_border, y*inst->font_height + uheight + cfg.window_border+cfg.window_border, y*inst->font_height+cfg.window_border, x*inst->font_width+cfg.window_border, y*inst->font_height+cfg.window_border+cfg.window_border, y*inst->font_height+cfg.window_border+cfg.window_border, y*inst->font_height+cfg.window_border, x*inst->font_width+cfg.window_border, y*inst->font_height+cfg.window_border + 2*cfg.window_border, inst->font_height * cfg.height + 2*cfg.window_border); inst->sbar_adjust = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 0, 0, 0)); inst->sbar = gtk_vscrollbar_new(inst->sbar_adjust); inst->hbox = GTK_BOX(gtk_hbox_new(FALSE, 0)); gtk_box_pack_start(inst->hbox, inst->area, FALSE, FALSE, 0); gtk_box_pack_start(inst->hbox, inst->sbar, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(inst->hbox)); // gtk_container_add(GTK_CONTAINER(window), inst->sbar); { GdkGeometry geom; geom.min_width = inst->font_width + 2*cfg.window_border; geom.min_height = inst->font_height + 2*cfg.window_border; geom.max_width = geom.max_height = -1; geom.base_width = 2*cfg.window_border; geom.base_height = 2*cfg.window_border; geom.width_inc = inst->font_width; geom.height_inc = inst->font_height; geom.min_aspect = geom.max_aspect = 0; gtk_window_set_geometry_hints(GTK_WINDOW(window), inst->area, &geom, GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE | GDK_HINT_RESIZE_INC); // FIXME: base_width and base_height don't seem to work properly. // Wonder if this is because base of _zero_ is deprecated, and we // need a nonzero base size? Will it help if I put in the scrollbar? // FIXME also: the scrollbar is not working, find out why. }signal_connect(GTK_OBJECT(inst->sbar_adjust), "value_changed", GTK_SIGNAL_FUNC(scrollbar_movedinst->sbar); gtk_widget_show(GTK_WIDGET(inst->hbox) Revision-number: 2032 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2002-10-13T09:57:07.000000Z K 7 svn:log V 88 Fix underline, which I cleverly broke while adding support for the window border. Oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 550680fe58ddaf42281f7863bcf7115d Text-delta-base-sha1: b63d6bd39b4f2f0d8aa57b3b46c92731aa1f7c9d Text-content-length: 29 Text-content-md5: 5367aa68756da909cb373df138eb6064 Text-content-sha1: 2d179aa3d4bc165a3cb5de69276b8adf2404e553 Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN8gMv Revision-number: 2033 Prop-content-length: 248 Content-length: 248 K 7 svn:log V 147 Selection now supported in pterm. Required small modifications outside the unix subdir, owing to more things needing to become platform-dependent. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-13T11:24:25.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 454fc2f07dc813687c161a2834f3b383 Text-delta-base-sha1: 138b2f43cddbbf6c6026c88b6b16c02705bc627c Text-content-length: 46 Text-content-md5: e350b891e48e2d967a7fdae9f6e99400 Text-content-sha1: 146571c1fd5881b636879a354af34ce849e19f65 Content-length: 87 K 15 cvs2svn:cvs-rev V 5 1.147 PROPS-END SVNPj odlvoid request_paste(void Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d18c515ea48361fff1b8f351300511e4 Text-delta-base-sha1: a3d2e8216a6930bd22e6b123a1e78a563cc3182d Text-content-length: 190 Text-content-md5: ec652a17fbc31a5e1f3b7d148b4d3ed6 Text-content-sha1: e34fa4f68c320e0b7c9b3aaa660f19364d3edda8 Content-length: 231 K 15 cvs2svn:cvs-rev V 5 1.101 PROPS-END SVNu>iB=Y}x#if SELECTION_NUL_TERMINATED wblen++; *wbptr++ = 0; #endif #if MULTICLICK_ONLY_EVENT || a == MA_2CLK || a == MA_3CLK #endif )) { request Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5367aa68756da909cb373df138eb6064 Text-delta-base-sha1: 2d179aa3d4bc165a3cb5de69276b8adf2404e553 Text-content-length: 4715 Text-content-md5: 23529e2ac7b2ac3861c05ad8f98975a0 Text-content-sha1: 405ec8eed15114b60435501c2e01f994b156cacc Content-length: 4754 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN8^9$lcbf 2-T*qWsV\P -wchar_t *pastein_data; int pastein_data_len; char *pasteout_data; int pasteout_data_lenbutton_event(GtkWidget *widget, GdkEventButton *event, gpointer data) { struct gui_data *inst = (struct gui_data *)data; int shift, ctrl, alt, x, y, button, act; shift = event->state & GDK_SHIFT_MASK; ctrl = event->state & GDK_CONTROL_MASK; alt = event->state & GDK_MOD1_MASK; if (event->button == 1) button = MBT_LEFT; else if (event->button == 2) button = MBT_MIDDLE; else if (event->button == 3) button = MBT_RIGHT; else return FALSE; /* don't even know what button! */ switch (event->type) { case GDK_BUTTON_PRESS: act = MA_CLICK; break; case GDK_BUTTON_RELEASE: act = MA_RELEASE; break; case GDK_2BUTTON_PRESS: act = MA_2CLK; break; case GDK_3BUTTON_PRESS: act = MA_3CLK; break; default: return FALSE; /* don't know this event type */ } if (send_raw_mouse && !(cfg.mouse_override && shift) && act != MA_CLICK && act != MA_RELEASE) return TRUE; /* we ignore these in raw mouse mode */ x = (event->x - cfg.window_border) / inst->font_width; y = (event->y - cfg.window_border) / inst->font_height; term_mouse(button, act, x, y, shift, ctrl, alt); return TRUE; } gint motion_event(GtkWidget *widget, GdkEventMotion *event, gpointer data) { struct gui_data *inst = (struct gui_data *)data; int shift, ctrl, alt, x, y, button; shift = event->state & GDK_SHIFT_MASK; ctrl = event->state & GDK_CONTROL_MASK; alt = event->state & GDK_MOD1_MASK; if (event->state & GDK_BUTTON1_MASK) button = MBT_LEFT; else if (event->state & GDK_BUTTON2_MASK) button = MBT_MIDDLE; else if (event->state & GDK_BUTTON3_MASK) button = MBT_RIGHT; else return FALSE; /* don't even know what button! */ x = (event->x - cfg.window_border) / inst->font_width; y = (event->y - cfg.window_border) / inst->font_height; term_mouse(button, MA_DRAG, x, y, shift, ctrl, alt);if (inst->pasteout_data) sfree(inst->pasteout_data); inst->pasteout_data = smalloc(len); inst->pasteout_data_len = len; wc_to_mb(0, 0, data, len, inst->pasteout_data, inst->pasteout_data_len, NULL, NULL); if (gtk_selection_owner_set(inst->area, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME)) { gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, 1); } } void selection_get(GtkWidget *widget, GtkSelectionData *seldata, guint info, guint time_stamp, gpointer data) { gtk_selection_data_set(seldata, GDK_SELECTION_TYPE_STRING, 8, inst->pasteout_data, inst->pasteout_data_len); } gint selection_clear(GtkWidget *widget, GdkEventSelection *seldata, gpointer data) { term_deselect(); if (inst->pasteout_data) sfree(inst->pasteout_data); inst->pasteout_data = NULL; inst->pasteout_data_len = 0; return TRUE; } void request_paste(void) { /* * In Unix, pasting is asynchronous: all we can do at the * moment is to call gtk_selection_convert(), and when the data * comes back _then_ we can call term_do_paste(). */ gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, GDK_CURRENT_TIME); } void selection_received(GtkWidget *widget, GtkSelectionData *seldata, gpointer data) { if (seldata->length <= 0 || seldata->type != GDK_SELECTION_TYPE_STRING) return; /* Nothing happens. */ if (inst->pastein_data) sfree(inst->pastein_data); inst->pastein_data = smalloc(seldata->length * sizeof(wchar_t)); inst->pastein_data_len = seldata->length; mb_to_wc(0, 0, seldata->data, seldata->length, inst->pastein_data, inst->pastein_data_len); term_do_paste(); } void get_clip(wchar_t ** p, int *len) { if (p) { *p = inst->pastein_data; *len = inst->pastein_data_lenarea), "button_press_event", GTK_SIGNAL_FUNC(button_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "button_release_event", GTK_SIGNAL_FUNC(button_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "motion_notify_event", GTK_SIGNAL_FUNC(motion_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_received", GTK_SIGNAL_FUNC(selection_received), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_get", GTK_SIGNAL_FUNC(selection_get), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_clear_event", GTK_SIGNAL_FUNC(selection_clear | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6a6c43b8945deee6b146465d985a3950 Text-delta-base-sha1: 47432912e3081a92945dddd456f799f3a7827372 Text-content-length: 416 Text-content-md5: c61d5020e92835cf85d52eb9d6f081e8 Text-content-sha1: 0c6912ae9e723388e49feb12e207cf026c81a204 Content-length: 455 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNYb bygr * Under GTK, we send MA_CLICK _and_ MA_2CLK, or MA_CLICK _and_ * MA_3CLK, when a button is pressed for the second or third time. */ #define MULTICLICK_ONLY_EVENT 0 /* * Under X, selection data must not be NUL-terminated. */ #define SELECTION_NUL_TERMINATED 0int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen, char *mbstr, int mblen, char *defchr, int *defused Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6989503d2bdf3328aa2418f744d84d19 Text-delta-base-sha1: 690a4029a739990a448158fc619d7cf586dd533d Text-content-length: 531 Text-content-md5: c94e322917b5a0807445936994d41676 Text-content-sha1: 5bf6174e89871b11937081a0a49574a3046ed10b Content-length: 570 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN| {^{#^mblen--, wclen--, ret++; } return ret; /* FIXME: check error codes! */ } int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen, char *mbstr, int mblen, char *defchr, int *defused) { int ret = 0; if (defused) *defused = 0; while (mblen > 0 && wclen > 0) { if (*wcstr >= 0x100) { if (defchr) *mbstr++ = *defchr; else *mbstr++ = '\xBF'; if (defused) *defused = 1; } else *mbstr++ = (unsigned char) *wcstr; wcstr++; mblen--, wclen--, Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7e8714dc21716a9dfbb9020f8783f6f6 Text-delta-base-sha1: 1191c0c986cd27fbc170ab7b4551e1f3342391cb Text-content-length: 469 Text-content-md5: 4193cabcc02b45719d52ad9e11b8463e Text-content-sha1: 488c11bf7ab82e6ce198cbb40acad12f7f82385e Content-length: 510 K 15 cvs2svn:cvs-rev V 5 1.203 PROPS-END SVNOeOL[request_paste(void) { /* * In Windows, pasting is synchronous: we can read the * clipboard with no difficulty, so request_paste() can just go * ahead and paste. */ term_do_paste()(YY(NULL); clipdata = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, len * sizeof(wchar_t)); clipdata2 = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, len2); if (!clipdata || !clipdata2) { if (clipdata) Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cc8fa5d7618f9445daab6ae2b2aedec1 Text-delta-base-sha1: 77b0966ef2cd80093298abd7bf9a0f9378198b09 Text-content-length: 280 Text-content-md5: e3702dc36da179148cbc49acc0aa34cf Text-content-sha1: d6fb1e52bb0089e2d9acd858c4f786a11f6aaa12 Content-length: 320 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN} Y,QOn Windows, we send MA_2CLK as the only event marking the second * press of a mouse button. Compare unix.h. */ #define MULTICLICK_ONLY_EVENT 1 /* * On Windows, data written to the clipboard must be NUL-terminated. */ #define SELECTION_NUL_TERMINATED 1 Revision-number: 2034 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2002-10-13T11:27:39.000000Z K 7 svn:log V 18 Shift-Ins pastes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 23529e2ac7b2ac3861c05ad8f98975a0 Text-delta-base-sha1: 405ec8eed15114b60435501c2e01f994b156cacc Text-content-length: 154 Text-content-md5: c6947597bdc57688c92fc846f0fb7bff Text-content-sha1: 4d72d9c2eaa57c2f670445fa5c85aeb2955bfe3b Content-length: 194 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN^9|]>|_ * Neither does Shift-Ins. */ if (event->keyval == GDK_Insert && (event->state & GDK_SHIFT_MASK)) { request_paste( Revision-number: 2035 Prop-content-length: 303 Content-length: 303 K 8 svn:date V 27 2002-10-13T12:17:03.000000Z K 7 svn:log V 202 Deal with the appalling mouse pointer colours. (Why doesn't GTK let us select our own mouse pointer fg and bg for standard pointers? It's ludicrous that we can only do it for pixmap-derived ones. :-( ) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c6947597bdc57688c92fc846f0fb7bff Text-delta-base-sha1: 4d72d9c2eaa57c2f670445fa5c85aeb2955bfe3b Text-content-length: 2666 Text-content-md5: a45277c43fa009fee5e575e1083a7c2c Text-content-sha1: d740d1df6a203f5cf0b53513c93850fcf613d89d Content-length: 2706 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN9s":xl`1by &GdkCursor *make_mouse_ptr(int cursor_val) { /* * Truly hideous hack: GTK doesn't allow us to set the mouse * cursor foreground and background colours unless we've _also_ * created our own cursor from bitmaps. Therefore, I need to * load the `cursor' font and draw glyphs from it on to * pixmaps, in order to construct my cursors with the fg and bg * I want. This is a gross hack, but it's more self-contained * than linking in Xlib to find the X window handle to * inst->area and calling XRecolorCursor, and it's more * futureproof than hard-coding the shapes as bitmap arrays. */ static GdkFont *cursor_font = NULL; GdkPixmap *source, *mask; GdkGC *gc; GdkColor cfg = { 0, 65535, 65535, 65535 }; GdkColor cbg = { 0, 0, 0, 0 }; GdkColor dfg = { 1, 65535, 65535, 65535 }; GdkColor dbg = { 0, 0, 0, 0 }; GdkCursor *ret; gchar text[2]; gint lb, rb, wid, asc, desc, w, h, x, y; if (cursor_val < 0) { gdk_font_unref(cursor_font); return NULL; } if (!cursor_font) cursor_font = gdk_font_load("cursor"); /* * Get the text extent of the cursor in question. We use the * mask character for this, because it's typically slightly * bigger than the main character. */ text[1] = '\0'; text[0] = (char)cursor_val + 1; gdk_string_extents(cursor_font, text, &lb, &rb, &wid, &asc, &desc); w = rb-lb; h = asc+desc; x = -lb; y = asc; source = gdk_pixmap_new(NULL, w, h, 1); mask = gdk_pixmap_new(NULL, w, h, 1); /* * Draw the mask character on the mask pixmap. */ text[1] = '\0'; text[0] = (char)cursor_val + 1; gc = gdk_gc_new(mask); gdk_gc_set_foreground(gc, &dbg); gdk_draw_rectangle(mask, gc, 1, 0, 0, w, h); gdk_gc_set_foreground(gc, &dfg); gdk_draw_text(mask, cursor_font, gc, x, y, text, 1); gdk_gc_unref(gc); /* * Draw the main character on the source pixmap. */ text[1] = '\0'; text[0] = (char)cursor_val; gc = gdk_gc_new(source); gdk_gc_set_foreground(gc, &dbg); gdk_draw_rectangle(source, gc, 1, 0, 0, w, h); gdk_gc_set_foreground(gc, &dfg); gdk_draw_text(source, cursor_font, gc, x, y, text, 1); gdk_gc_unref(gc); /* * Create the cursor. */ ret = gdk_cursor_new_from_pixmap(source, mask, &cfg, &cbg, x, y); /* * Clean up. */ gdk_pixmap_unref(source); gdk_pixmap_unref(mask); return ret;make_mouse_ptr(GDK_XTERM); inst->rawcursor = make_mouse_ptr(GDK_LEFT_PTR); make_mouse_ptr(-1); /* clean up cursor font */ Revision-number: 2036 Prop-content-length: 187 Content-length: 187 K 7 svn:log V 87 Resizing of pterm now works, and the size information is correctly sent on to the pty. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-13T12:44:01.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a45277c43fa009fee5e575e1083a7c2c Text-delta-base-sha1: d740d1df6a203f5cf0b53513c93850fcf613d89d Text-content-length: 1067 Text-content-md5: 746ddb049de59b154a610ae85274c344 Text-content-sha1: 7869b9a948332f66d442273298c7b4452594a898 Content-length: 1107 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNsn0mrgpP3a|%n"B !R int ignore_sbar int w, h, need_size = 0; w = (event->width - 2*cfg.window_border) / inst->font_width; h = (event->height - 2*cfg.window_border) / inst->font_height; if (w != cfg.width || h != cfg.height) { if (inst->pixmap) { gdk_pixmap_unref(inst->pixmap); inst->pixmap = NULL; } cfg.width = w; cfg.height = h; need_size = 1; } if (!inst->pixmap) { GdkGC *gc; inst->pixmap = gdk_pixmap_new(widget->window, (cfg.width * inst->font_width + 2*cfg.window_border), (cfg.height * inst->font_height + 2*cfg.window_border), -1); if (need_size) { term_size(h, w, cfg.savelines); } /* * Set up the colour map. */ if (!inst->colmap)inst->colmap = gdk_colormap_get_system()inst->ignore_sbar = TRUE; gtk_adjustment_changed(inst->sbar_adjust); inst->ignore_sbar = FALSE; } void scrollbar_moved(GtkAdjustment *adj, gpointer data) { if (!inst->ignore_sbar) TRUE, TRUE, 0); gtk_box_pack_end Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cc4a0c9c14db13d389759bf9ad5162fc Text-delta-base-sha1: 7675decb45117d15c3d2c2cc687ba13fa1d9119a Text-content-length: 304 Text-content-md5: be1331401a9ee54365d90ba38b986476 Text-content-sha1: 7bb2d18722b838af643d130f83a135c0e27dc7aa Content-length: 343 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNx["z jt|xI/#define _XOPEN_SOURCE #define _XOPEN_SOURCE_EXTENDED#include #include 0) { char *p = *++argv; if (!strcmp(p, "-fn")) { if (--argc > 0) { strncpy(cfg.font, *++argv, sizeof(cfg.font)); cfg.font[sizeof(cfg.font)-1] = '\0'; } else err = 1, fprintf(stderr, "pterm: -fn expects an argument\n"); } if (!strcmp(p, "-e")) { if (--argc > 0) { int i; pty_argv = smalloc((argc+1) * sizeof(char *)); ++argv; for (i = 0; i < argc; i++) pty_argv[i] = argv[i]; pty_argv[argc] = NULL; break; /* finished command-line processing */ } else err = 1, fprintf(stderr, "pterm: -e expects an argument\n"); } } Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: be1331401a9ee54365d90ba38b986476 Text-delta-base-sha1: 7bb2d18722b838af643d130f83a135c0e27dc7aa Text-content-length: 217 Text-content-md5: 85daf0a2cb6332cb604b1884745fa295 Text-content-sha1: f19288a40068fa035391fa64ecfae7a18c0fa620 Content-length: 256 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN[/;K=I,lochar **pty_argvslavefd, getpgrp()); /* Close everything _else_, for tidiness. */ for (i = 3; i < 1024; i++) close(i); if (pty_argv) execvp(pty_argv[0], pty_argv); else Revision-number: 2038 Prop-content-length: 281 Content-length: 281 K 8 svn:date V 27 2002-10-13T23:48:31.000000Z K 7 svn:log V 180 gnome-terminal insists on receiving the selection as COMPOUND_TEXT rather than STRING, so we can now supply that too. Pasting both ways between pterm and gnome-terminal now works. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8f2597d1b99f8d6bd9abe1f8d524d182 Text-delta-base-sha1: c3823f104cb7ff776929b5b36e1783c90bafa66f Text-content-length: 225 Text-content-md5: 43d989c64b48e629e58b1ab3eb688315 Text-content-sha1: ccfac1f0a156d15fe9fa6571a217fc206a7a6d41 Content-length: 265 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN[8gZ1f@ GdkAtom compound_text_atom gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY, inst->compound_text_atomst->compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE) Revision-number: 2039 Prop-content-length: 256 Content-length: 256 K 7 svn:log V 155 Don't forget to set $TERM when we spawn the pty. Of course I haven't noticed this until now because I've always been spawning it _from_ another xterm! :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-13T23:57:40.000000Z PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 85daf0a2cb6332cb604b1884745fa295 Text-delta-base-sha1: f19288a40068fa035391fa64ecfae7a18c0fa620 Text-content-length: 159 Text-content-md5: 124842f424a678b05e04cc0750fa85b2 Text-content-sha1: ec71a869216d59ca44b602acdd57358b9130cef5 Content-length: 198 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN/8 +{ char term_env_var[10 + sizeof(cfg.termtype)]; sprintf(term_env_var, "TERM=%s", cfg.termtype); putenv(term_env_var); } Revision-number: 2040 Prop-content-length: 272 Content-length: 272 K 7 svn:log V 171 Window title configurability: -T to set it from the command line, support for the xterm escape sequences to set it, and support for the xterm escape sequence to query it. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-14T00:05:37.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 43d989c64b48e629e58b1ab3eb688315 Text-delta-base-sha1: ccfac1f0a156d15fe9fa6571a217fc206a7a6d41 Text-content-length: 875 Text-content-md5: 4539c44e483812740fc718bb7fc81d8f Text-content-sha1: 7a590065672c11c8e1924b340acbd6f4cd663f7f Content-length: 915 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN[Zlqmwintitle)]inst->wintitlestrncpy(inst->wintitle, title, lenof(inst->wintitle)); inst->wintitle[lenof(inst->wintitle)-1] = '\0'; gtk_window_set_title(GTK_WINDOW(inst->window), inst->wintitle); if (!strcmp(p, "-T")) { if (--argc > 0) { strncpy(cfg.wintitle, *++argv, sizeof(cfg.wintitle)); cfg.wintitle[sizeof(cfg.wintitle)-1] = '\0'; } else err = 1, fprintf(stderr, "pterm: -Tinst->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); if (cfg.wintitle[0]) set_title(cfg.wintitle); else set_title("pterm"); inst->inst->inst->inst->window), "delete_event", GTK_SIGNAL_FUNC(delete_window), inst); gtk_signal_connect(GTK_OBJECT(inst->inst->inst->window), "focus_outinst-> Revision-number: 2041 Prop-content-length: 311 Content-length: 311 K 8 svn:date V 27 2002-10-14T08:56:55.000000Z K 7 svn:log V 210 Various faffs in the pty allocation process to get controlling terminals right. Irritatingly this was working when run from another [xsp]term but not when run from my GNOME panel. I think it's now more robust. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 124842f424a678b05e04cc0750fa85b2 Text-delta-base-sha1: ec71a869216d59ca44b602acdd57358b9130cef5 Text-content-length: 278 Text-content-md5: f0a91e1d5274f69b27e1c9923e4905f7 Text-content-sha1: f6a0a628809088f9ed76f16b0c8cd027b1b15a4a Content-length: 317 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN8l8z82e8I), pgrp slavefd = open(name, O_RDWR); if (slavefd < 0) { perror("slave pty: open"); exit(1); } ioctl(slavefd, TIOCSCTTY, 1); pgrp = getpid(); tcsetpgrp(slavefd, pgrp); setpgrp(); close(open(name, O_WRONLY, 0)); setpgrp( Revision-number: 2042 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2002-10-14T09:04:23.000000Z K 7 svn:log V 67 Oops. Defining max() the wrong way round was breaking rect select. K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 71f983ce4b0bc273a28285905162477d Text-delta-base-sha1: 0e36c923df3f9165e39ce3b896b99e7e24b38ff3 Text-content-length: 51 Text-content-md5: 3a125fbd6ebead369a6cf4f2fb1c424d Text-content-sha1: c2abbb6e8f547f783aac17e34ce2e2724f2aa373 Content-length: 90 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNgg#D> (y) ? (x) : (y) ) #endif #endif Revision-number: 2043 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2002-10-14T09:06:31.000000Z K 7 svn:log V 99 SEL_NL is different between Windows and Unix; move it out into the platform-specific header files. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e350b891e48e2d967a7fdae9f6e99400 Text-delta-base-sha1: 146571c1fd5881b636879a354af34ce849e19f65 Text-content-length: 22 Text-content-md5: 7bc54f013aa9761db553630d390bb32e Text-content-sha1: bddc71f75830bf2dcd79c5da301949bedf58e378 Content-length: 63 K 15 cvs2svn:cvs-rev V 5 1.148 PROPS-END SVNjO r] Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c61d5020e92835cf85d52eb9d6f081e8 Text-delta-base-sha1: 0c6912ae9e723388e49feb12e207cf026c81a204 Text-content-length: 116 Text-content-md5: 2575688d554e054ff6cf7804bc16aede Text-content-sha1: ac15157ff56c1d80a301701c60fd6e63c5837b44 Content-length: 155 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNbD ^$^B * Under X, copying to the clipboard terminates lines with just LF. */ #define SEL_NL { 10 } Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e3702dc36da179148cbc49acc0aa34cf Text-delta-base-sha1: d6fb1e52bb0089e2d9acd858c4f786a11f6aaa12 Text-content-length: 116 Text-content-md5: 4362aa0c104b3d29474066add33fc79c Text-content-sha1: df663eb23b2debc63084177121ce28d208a7a576 Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNk ^a^,YOn Windows, copying to the clipboard terminates lines with CRLF. */ #define SEL_NL { 13, 10 } Revision-number: 2044 Prop-content-length: 246 Content-length: 246 K 8 svn:date V 27 2002-10-14T09:18:34.000000Z K 7 svn:log V 145 xterm-class programs should exit when their primary child process dies, rather than waiting around until the last open handle on the pty closes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4539c44e483812740fc718bb7fc81d8f Text-delta-base-sha1: 7a590065672c11c8e1924b340acbd6f4cd663f7f Text-content-length: 451 Text-content-md5: 7329cb4a2305f67cb987bfe364138f07 Text-content-sha1: f8f9e93f8191619065bb810527d233f7bdcbbb9c Content-length: 491 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNZ'F'E extern int pty_child_is_dead(); /* declared in pty.c */ if (pty_child_is_dead()) { /* * The primary child process died. We could keep the * terminal open for remaining subprocesses to output to, * but conventional wisdom seems to feel that that's the * Wrong Thing for an xterm-alike, so we bail out now. This * would be easy enough to change or make configurable if * necessary. */ exit(0); } Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f0a91e1d5274f69b27e1c9923e4905f7 Text-delta-base-sha1: f6a0a628809088f9ed76f16b0c8cd027b1b15a4a Text-content-length: 593 Text-content-md5: 642433d92d883edbb9a9d85d79e9afba Text-content-sha1: ba3da51d172c383c8653526b9d94c804db868bbe Content-length: 632 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN~+%[ ?SxOOHsignal.h> #include #include #include #include area->window, inst->currcursor); else gdk_window_set_cursor(inst->area->window, inst->blankcursor)if (end-start > 0) { ldisc_send(output+start, end-start, 1); show_mouseptr(0); term_out(); }ow_mouseptr(1)ow_mouseptr(1)show_mouseptr(1inst->currcursor = inst->rawcursor; else inst->currcursor = inst->textcursor; show_mouseptr(1Unicode, code pages, and ATTR_WIDE for CJK support.== -2) { gdk_font_unref(cursor_font); return NULL; } if (cursor_val >= 0 && if (cursor_val >= 0) { text[1] = '\0'; text[0] = (char)cursor_val + 1; gdk_string_extents(cursor_font, text, &lb, &rb, &wid, &asc, &desc); w = rb-lb; h = asc+desc; x = -lb; y = asc; } else { w = h = 1; x = y = 0; }if (cursor_val >= 0) { text[1] = '\0'; text[0] = (char)cursor_val + 1; gdk_gc_set_foreground(gc, &dfg); gdk_draw_text(mask, cursor_font, gc, x, y, text, 1); }gc = gdk_gc_new(source); gdk_gc_set_foreground(gc, &dbg); gdk_draw_rectangle(source, gc, 1, 0, 0, w, h); if (cursor_val >= 0) { text[1] = '\0'; text[0] = (char)cursor_val; gdk_gc_set_foreground(gc, &dfg); gdk_draw_text(source, cursor_font, gc, x, y, text, 1); } if (!strcmp(p, "-hide")) { cfg.hide_mouseptr = 1POINTER_MOTION_MASK |inst->blankcursor = make_mouse_ptr(-1); make_mouse_ptr(-2); /* clean up cursor font */ inst->currcursor = inst->textcursor; show_mouseptr(1 Revision-number: 2046 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2002-10-14T10:06:07.000000Z K 7 svn:log V 33 Support NetHack keypad mode. :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79834c57cfddc36098fbd3091a98549c Text-delta-base-sha1: 06ef5d36dea474406a7c7a4f8e88e4e0294566f1 Text-content-length: 894 Text-content-md5: 28adb8b1c0d8130907ff7df83de7ea63 Text-content-sha1: 077d1a874429fbb11af6a616e705b496cf26f968 Content-length: 934 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNJ<\m&M`&$NetHack keypad mode. */ if (cfg.nethack_keypad) { char *keys = NULL; switch (event->keyval) { case GDK_KP_1: case GDK_KP_End: keys = "bB"; break; case GDK_KP_2: case GDK_KP_Down: keys = "jJ"; break; case GDK_KP_3: case GDK_KP_Page_Down: keys = "nN"; break; case GDK_KP_4: case GDK_KP_Left: keys = "hH"; break; case GDK_KP_5: case GDK_KP_Begin: keys = ".."; break; case GDK_KP_6: case GDK_KP_Right: keys = "lL"; break; case GDK_KP_7: case GDK_KP_Home: keys = "yY"; break; case GDK_KP_8: case GDK_KP_Up: keys = "kK"; break; case GDK_KP_9: case GDK_KP_Page_Up: keys = "uU"; break; } if (keys) { end = 2; if (event->state & GDK_SHIFT_MASK) output[1] = keys[1]; else output[1] = keys[0]; goto done; } if (!strcmp(p, "-nethack")) { cfg.nethack_keypad Revision-number: 2047 Prop-content-length: 289 Content-length: 289 K 8 svn:date V 27 2002-10-14T10:14:12.000000Z K 7 svn:log V 188 Don't forget to call term_paste() when we get the chance, or big pastes won't go through. (Not sure whether I should remove this weird behaviour completely for pterm. It's a bit bizarre.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 28adb8b1c0d8130907ff7df83de7ea63 Text-delta-base-sha1: 077d1a874429fbb11af6a616e705b496cf26f968 Text-content-length: 82 Text-content-md5: 61b609d1fcac7027312487ac0fb7100b Text-content-sha1: e0321f65cbcf419157926cbc112dee58ce38e4a9 Content-length: 122 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN<`-SL|U9?}gint idle_func( term_pasidle_add(idle_func Revision-number: 2048 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2002-10-14T10:21:35.000000Z K 7 svn:log V 52 Support server requests for colour palette changes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 61b609d1fcac7027312487ac0fb7100b Text-delta-base-sha1: e0321f65cbcf419157926cbc112dee58ce38e4a9 Text-content-length: 1663 Text-content-md5: 1006e8258547f8a3abd69f8fb99d3454 Text-content-sha1: 078456417cccd960fd9fa35dadb6c98379c35969 Content-length: 1703 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN`<^5k+N>"palette_reset();real_palette_set(int n, int r, int g, int b) { gboolean success[1]; inst->cols[n].red = r * 0x0101; inst->cols[n].green = g * 0x0101; inst->cols[n].blue = b * 0x0101; gdk_colormap_alloc_colors(inst->colmap, inst->cols + n, 1, FALSE, FALSE, success); if (!success[0]) g_error("pterm: couldn't allocate colour %d (#%02x%02x%02x)\n", n, r, g, b); } void palette_set(int n, int r, int g, int b) { static const int first[21] = { 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15, 16, 17, 18, 20, 22 }; real_palette_set(first[n], r, g, b); if (first[n] >= 18) real_palette_set(first[n] + 1, r, g, b); } void palette_reset(void) { /* This maps colour indices in cfg to those used in inst->cols. */ static const int ww[] = { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, 1, 2, 3, 4, 5 }; gboolean success[NCOLOURS]; int i; assert(lenof(ww) == NCOLOURS); if (!inst->colmap) { inst->colmap = gdk_colormap_get_system(); } else { gdk_colormap_free_colors(inst->colmap, inst->cols, NCOLOURS); } for (i = 0; i < NCOLOURS; i++) { inst->cols[i].red = cfg.colours[ww[i]][0] * 0x0101; inst->cols[i].green = cfg.colours[ww[i]][1] * 0x0101; inst->cols[i].blue = cfg.colours[ww[i]][2] * 0x0101; } gdk_colormap_alloc_colors(inst->colmap, inst->cols, NCOLOURS, FALSE, FALSE, success); for (i = 0; i < NCOLOURS; i++) { if (!success[i]) g_error("pterm: couldn't allocate colour %d (#%02x%02x%02x)\n", i, cfg.colours[i][0], cfg.colours[i][1], cfg.colours[i][2]); } Revision-number: 2049 Prop-content-length: 199 Content-length: 199 K 7 svn:log V 99 Bell overload was working in principle, but wasn't scaled to Unix's greater time resolution. Oops. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-14T10:29:50.000000Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 247f197c0ba20c28fab72cc43af3dee6 Text-delta-base-sha1: 8bc311934af04b60812f1d534e699e91b7a6bb24 Text-content-length: 106 Text-content-md5: 9dfae1c0aef511aa3e425a152afbd0be Text-content-sha1: ed6397b5f152654d29a6abea490ce8e55205219a Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVN P1Po*TICKSPERSEC, &cfg->bellovl_t); gppi(sesskey, "BellOverloadS", 5*TICKSPERSEC Revision-number: 2050 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2002-10-14T10:33:34.000000Z K 7 svn:log V 132 Add the -log option, which activates full session logging. Should be handy next time I need to debug any weird terminal problems... K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1006e8258547f8a3abd69f8fb99d3454 Text-delta-base-sha1: 078456417cccd960fd9fa35dadb6c98379c35969 Text-content-length: 524 Text-content-md5: fda5f9f728daf80caa14c8b416b92f01 Text-content-sha1: 7b267c25bf7b97d6726317ca9eca74e7a4955eae Content-length: 564 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN<\ht)kcWeLogging in an xterm-alike is liable to be something you only * do at serious diagnostic need. Hence, I'm going to take the * easy option for now and assume we always want to overwrite * log files. I can always make it properly configurable later.log")) { if (--argc > 0) { strncpy(cfg.logfilename, *++argv, sizeof(cfg.logfilename)); cfg.logfilename[sizeof(cfg.logfilename)-1] = '\0'; cfg.logtype = LGTYP_DEBUG; } else err = 1, fprintf(stderr, "pterm: -log Revision-number: 2051 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2002-10-14T22:14:54.000000Z K 7 svn:log V 62 Set up the palette _before_ trying to paint the window black. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fda5f9f728daf80caa14c8b416b92f01 Text-delta-base-sha1: 7b267c25bf7b97d6726317ca9eca74e7a4955eae Text-content-length: 89 Text-content-md5: 4bbeecd2e8f3d7dcb5fa89c8045bb834 Text-content-sha1: 7f58d96f5ba308f864e6777e8ec7dfe506f6d789 Content-length: 129 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN\\<x%qY/* * Set up the colour map. */ palette_reset() Revision-number: 2052 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2002-10-14T23:32:00.000000Z K 7 svn:log V 126 Only engage a GTK idle function when absolutely necessary, otherwise the whole app spins on it and takes up CPU all the time. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7bc54f013aa9761db553630d390bb32e Text-delta-base-sha1: bddc71f75830bf2dcd79c5da301949bedf58e378 Text-content-length: 45 Text-content-md5: 0144149454dbf14df70d9728755d9e67 Text-content-sha1: b4b428f515abac90831c1a7f3f7b0d6263da8941 Content-length: 86 K 15 cvs2svn:cvs-rev V 5 1.149 PROPS-END SVNOm w`oint term_paste_pending Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ec652a17fbc31a5e1f3b7d148b4d3ed6 Text-delta-base-sha1: e34fa4f68c320e0b7c9b3aaa660f19364d3edda8 Text-content-length: 78 Text-content-md5: f8e3885107c96f26f55422df066f3e29 Text-content-sha1: 56b010e2c5caf5f0192a675f912428848f6fd56a Content-length: 119 K 15 cvs2svn:cvs-rev V 5 1.102 PROPS-END SVN>{ 5db\int term_paste_pending(void) { return paste_len ! Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4bbeecd2e8f3d7dcb5fa89c8045bb834 Text-delta-base-sha1: 7f58d96f5ba308f864e6777e8ec7dfe506f6d789 Text-content-length: 378 Text-content-md5: b7bdee6b6be3ad91a1ed37bba29c404e Text-content-sha1: 3fda32b15fd345db43ae74801b93d73921777550 Content-length: 418 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN\D-?/R)!|{xF|wt..guint term_paste_idle_idgint idle_paste_func(gpointer data); /* forward ref */ if (term_paste_pending()) inst->term_paste_idle_id = gtk_idle_add(idle_paste_func, inst); } gint idle_paste_func( if (term_paste_pending()) term_paste(); else gtk_idle_remove(inst->term_paste_idle_id); return TRUE; } Revision-number: 2053 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2002-10-14T23:39:07.000000Z K 7 svn:log V 75 Don't cause the mouse pointer to reappear just because it's changed shape. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b7bdee6b6be3ad91a1ed37bba29c404e Text-delta-base-sha1: 3fda32b15fd345db43ae74801b93d73921777550 Text-content-length: 113 Text-content-md5: e2c16baca5d02a2cb064d1de1678bd91 Text-content-sha1: a5eb4cdff5773d3ad06e08da61ecf98b8b7c70e8 Content-length: 153 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNDK/A)h>int mouseptr_visible inst->mouseptr_visible = showinst->mouseptr_visible Revision-number: 2054 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2002-10-15T00:22:48.000000Z K 7 svn:log V 88 Support for line attributes: ESC #3, #4 and #6 for double-width and double-height text. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e2c16baca5d02a2cb064d1de1678bd91 Text-delta-base-sha1: a5eb4cdff5773d3ad06e08da61ecf98b8b7c70e8 Text-content-length: 1371 Text-content-md5: 9f550e2d9d2d12adb2244d3c919cafe2 Text-content-sha1: ea580d11a9ffb383c0b5a894526a2e6c5038627d Content-length: 1411 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN!,k2@AkekSCif (lattr != LATTR_NORM) { if (x*2 >= cols) return; x *= 2if (lattr != LATTR_NORM) { /* * I can't find any plausible StretchBlt equivalent in the * X server, so I'm going to do this the slow and painful * way. This will involve repeated calls to * gdk_draw_pixmap() to stretch the text horizontally. It's * O(N^2) in time and O(N) in network bandwidth, but you * try thinking of a better way. :-( */ int i; for (i = 0; i < len * inst->font_width; i++) { gdk_draw_pixmap(inst->pixmap, gc, inst->pixmap, x*inst->font_width+cfg.window_border + 2*i, y*inst->font_height+cfg.window_border, x*inst->font_width+cfg.window_border + 2*i+1, y*inst->font_height+cfg.window_border, len * inst->font_width - i, inst->font_height); } len *= 2; if (lattr != LATTR_WIDE) { int dt, db; /* Now stretch vertically, in the same way. */ if (lattr == LATTR_BOT) dt = 0, db = 1; else dt = 1, db = 0; for (i = 0; i < inst->font_height; i+=2) { gdk_draw_pixmap(inst->pixmap, gc, inst->pixmap, x*inst->font_width+cfg.window_border, y*inst->font_height+cfg.window_border+dt*i+db, x*inst->font_width+cfg.window_border, y*inst->font_height+cfg.window_border+dt*(i+1), len * inst->font_width, inst->font_height-i-1); } } len *= 2 Revision-number: 2055 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2002-10-15T09:30:16.000000Z K 7 svn:log V 54 Trim wide text properly at the RH edge of the screen. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9f550e2d9d2d12adb2244d3c919cafe2 Text-delta-base-sha1: ea580d11a9ffb383c0b5a894526a2e6c5038627d Text-content-length: 137 Text-content-md5: dca193f3d882a0b75cd633c994634f5c Text-content-sha1: 512e25db6241490f936f59d085148470c719b117 Content-length: 177 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNP o9o(_x *= 2; if (x >= cols) return; if (x + len*2 > cols) len = (cols-x)/2; /* trim to LH half */ Revision-number: 2056 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2002-10-15T10:49:38.000000Z K 7 svn:log V 114 Support for BSD-style pty devices. Tested under Linux; might need minor tweaks to run under other BSD-style OSes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 642433d92d883edbb9a9d85d79e9afba Text-delta-base-sha1: ba3da51d172c383c8653526b9d94c804db868bbe Text-content-length: 1061 Text-content-md5: 69d58c7689661a241480688d7f95b500 Text-content-sha1: 83f84a530b793a3870c84e3864112919f92d1c0d Content-length: 1100 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN~ 'raS?sUGLAc^agrp#ifdef BSD_PTYS { const char chars1[] = "pqrstuvwxyz"; const char chars2[] = "0123456789abcdef"; const char *p1, *p2; char master_name[20]; for (p1 = chars1; *p1; p1++) for (p2 = chars2; *p2; p2++) { sprintf(master_name, "/dev/pty%c%c", *p1, *p2); pty_master_fd = open(master_name, O_RDWR); if (pty_master_fd >= 0) { if (geteuid() == 0 || access(master_name, R_OK | W_OK) == 0) goto got_one; close(pty_master_fd); } } /* If we get here, we couldn't get a tty at all. */ fprintf(stderr, "pterm: unable to open a pseudo-terminal device\n"); exit(1); got_one: strcpy(name, master_name); name[5] = 't'; /* /dev/ptyXX -> /dev/ttyXX */ } #else#endif#ifdef BSD_PTYS /* We need to chown/chmod the /dev/ttyXX device. */ { struct group *gp = getgrnam("tty"); fchown(slavefd, getuid(), gp ? gp->gr_gid : -1); fchmod(slavefd, 0600); } #endifIn case we were setgid-utmp or setuid-root, drop privs. */ setgid(getgid()); setuid(getuid() Revision-number: 2057 Prop-content-length: 193 Content-length: 193 K 7 svn:log V 93 Deal with the warnings generated when passing a pointer-to-enum to gppi as a pointer-to-int. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-15T10:52:13.000000Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9dfae1c0aef511aa3e425a152afbd0be Text-delta-base-sha1: ed6397b5f152654d29a6abea490ce8e55205219a Text-content-length: 516 Text-content-md5: a3c8aa6dc3b6a1e4037d476b0d528df1 Text-content-sha1: fb30877878d55d0de9692d17729d739cd204bde1 Content-length: 556 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVNX#S$;4v5^,o*i); cfg->proxy_type = ii); cfg->resize_action = ii); cfg->sshbug_ignore1 = i; gppi(sesskey, "BugPlainPW1", BUG_AUTO, &i); cfg->sshbug_plainpw1 = i; gppi(sesskey, "BugRSA1", BUG_AUTO, &i); cfg->sshbug_rsa1 = i; { int i; gppi(sesskey, "BugHMAC2", BUG_AUTO, &i); cfg->sshbug_hmac2 = ii); cfg->sshbug_derivekey2 = i; gppi(sesskey, "BugRSAPad2", BUG_AUTO, &i); cfg->sshbug_rsapad2 = i; gppi(sesskey, "BugDHGEx2", BUG_AUTO, &i); cfg->sshbug_dhgex2 = i Revision-number: 2058 Prop-content-length: 214 Content-length: 214 K 7 svn:log V 113 Support for utmp, wtmp and lastlog. Probably not terribly portable as yet, but seems to work plausibly on Linux. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-15T12:29:52.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dca193f3d882a0b75cd633c994634f5c Text-delta-base-sha1: 512e25db6241490f936f59d085148470c719b117 Text-content-length: 225 Text-content-md5: 54a5e855803bbec13b17c3cbfd8857b6 Text-content-sha1: 8efd663abc77ac3d57fb1a4a1a9a3524dfa78b6c Content-length: 265 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNP4 wSr}T|char *get_x_display(void) { return gdk_get_display(back = &pty_backend; back->init(NULL, 0, NULL, 0); gdk_input_add(pty_master_fd, GDK_INPUT_READ, pty_input_func, inst Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 69d58c7689661a241480688d7f95b500 Text-delta-base-sha1: 83f84a530b793a3870c84e3864112919f92d1c0d Text-content-length: 3799 Text-content-md5: e13f103e5b34bb675d3fc2a7932f325d Text-content-sha1: 4511574823f36337dc8b5251f35dd6c60f1dd0ce Content-length: 3838 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN )"r&dyZ \Dajutmp.h> #include #include pw_name, lenof(utmp_entry.ut_user)); strncpy(utmp_entry.ut_host, location, lenof(utmp_entry.ut_host)); time(&utmp_entry.ut_time); #if defined HAVE_PUTUTLINE utmpname(UTMP_FILE); setutent(); pututline(&utmp_entry); endutent(); #endif if ((wtmp = fopen(WTMP_FILE, "a")) != NULL) { fwrite(&utmp_entry, 1, sizeof(utmp_entry), wtmp); fclose(wtmp); } #ifdef HAVE_LASTLOG memset(&lastlog_entry, 0, sizeof(lastlog_entry)); strncpy(lastlog_entry.ll_line, ttyname+5, lenof(lastlog_entry.ll_line)); strncpy(lastlog_entry.ll_host, location, lenof(lastlog_entry.ll_host)); time(&lastlog_entry.ll_time); if ((lastlog = fopen(LASTLOG_FILE, "r+")) != NULL) { fseek(lastlog, sizeof(lastlog_entry) * getuid(), SEEK_SET); fwrite(&lastlog_entry, 1, sizeof(lastlog_entry), lastlog); fclose(lastlog); } #endif #endif } static void cleanup_utmp(void) { #ifndef OMIT_UTMP FILE *wtmp; utmp_entry.ut_type = DEAD_PROCESS; memset(utmp_entry.ut_user, 0, lenof(utmp_entry.ut_user)); time(&utmp_entry.ut_time); if ((wtmp = fopen(WTMP_FILE, "a")) != NULL) { fwrite(&utmp_entry, 1, sizeof(utmp_entry), wtmp); fclose(wtmp); } memset(utmp_entry.ut_line, 0, lenof(utmp_entry.ut_line)); utmp_entry.ut_time = 0; #if defined HAVE_PUTUTLINE utmpname(UTMP_FILE); setutent(); pututline(&utmp_entry); endutent(); #endif #endif }static void fatal_sig_handler(int signum) { signal(signum, SIG_DFL); cleanup_utmp(); setuid(getuid()); raise(signum);Trap as many fatal signals as we can in the hope of having * the best chance to clean up utmp before termination. */ signal(SIGHUP, fatal_sig_handler); signal(SIGINT, fatal_sig_handler); signal(SIGQUIT, fatal_sig_handler); signal(SIGILL, fatal_sig_handler); signal(SIGABRT, fatal_sig_handler); signal(SIGFPE, fatal_sig_handler); signal(SIGPIPE, fatal_sig_handler); signal(SIGALRM, fatal_sig_handler); signal(SIGTERM, fatal_sig_handler); signal(SIGSEGV, fatal_sig_handler); signal(SIGUSR1, fatal_sig_handler); signal(SIGUSR2, fatal_sig_handler); #ifdef SIGBUS signal(SIGBUS, fatal_sig_handler); #endif #ifdef SIGPOLL signal(SIGPOLL, fatal_sig_handler); #endif #ifdef SIGPROF signal(SIGPROF, fatal_sig_handler); #endif #ifdef SIGSYS signal(SIGSYS, fatal_sig_handler); #endif #ifdef SIGTRAP signal(SIGTRAP, fatal_sig_handler); #endif #ifdef SIGVTALRM signal(SIGVTALRM, fatal_sig_handler); #endif #ifdef SIGXCPU signal(SIGXCPU, fatal_sig_handler); #endif #ifdef SIGXFSZ signal(SIGXFSZ, fatal_sig_handler); #endif #ifdef SIGIO signal(SIGIO, fatal_sig_handler); #endif /* Also clean up utmp on normal exit. */ atexit(cleanup_utmp); setup_utmp(name); Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2575688d554e054ff6cf7804bc16aede Text-delta-base-sha1: ac15157ff56c1d80a301701c60fd6e63c5837b44 Text-content-length: 39 Text-content-md5: f995aa2e823982c0abfaf6a0535857cc Text-content-sha1: a783cdc57837fd76d000bd7d1991da0731b081ac Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVND` vWmchar *get_x_display Revision-number: 2059 Prop-content-length: 256 Content-length: 256 K 8 svn:date V 27 2002-10-15T12:42:58.000000Z K 7 svn:log V 155 Finish up utmp processing: add the -ut- command-line option to suppress stamping it at all. (I suppose this ought to be part of the cfg structure really.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 54a5e855803bbec13b17c3cbfd8857b6 Text-delta-base-sha1: 8efd663abc77ac3d57fb1a4a1a9a3524dfa78b6c Text-content-length: 82 Text-content-md5: 82472d0c94da36ec2771e4d147733852 Text-content-sha1: bf5de224898fb6e0c86046a7e691ad5267674ab4 Content-length: 122 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN21>b,int pty_stamp_utmput-")) { pty_stamp_utmp = 0 Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e13f103e5b34bb675d3fc2a7932f325d Text-delta-base-sha1: 4511574823f36337dc8b5251f35dd6c60f1dd0ce Text-content-length: 905 Text-content-md5: a8eb8a95c2bc8da878a00f14671073e6 Text-content-sha1: 9135d47ea2a09fc27eae7e42d827003a22d06d99 Content-length: 945 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN M"[?Pp%VoEHD/* * Set up a default for vaguely sane systems. The idea is that if * OMIT_UTMP is not defined, then at least one of the symbols which * enable particular forms of utmp processing should be, if only so * that a link error can warn you that you should have defined * OMIT_UTMP if you didn't want any. Currently HAVE_PUTUTLINE is * the only such symbol. */ #ifndef OMIT_UTMP #if !defined HAVE_PUTUTLINE #define HAVE_PUTUTLINE #endif #endif int pty_master_fd; int pty_stamp_utmp = 1; static int pty_stamped_utmp = 0; FILE *wtmp; if (!pty_stamp_utmp) return; pw = getpwuid(getuid()); location = get_x_display( pty_stamped_utmp = 1; #endif } static void cleanup_utmp(void) { #ifndef OMIT_UTMP FILE *wtmp; if (!pty_stamp_utmp || !pty_stamped_utmp) return pty_stamped_utmp = 0; /* ensure we never double-cleanup */ Revision-number: 2060 Prop-content-length: 368 Content-length: 368 K 7 svn:log V 267 Introduce the ability to control whether the shell run in pterm is a login shell or not. Also moved these new pieces of configuration into the Config structure, though they won't stay there forever since they will need to be moved out into platform-dependent config. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-15T13:07:18.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0144149454dbf14df70d9728755d9e67 Text-delta-base-sha1: b4b428f515abac90831c1a7f3f7b0d6263da8941 Text-content-length: 139 Text-content-md5: dd2698ee3436ce60d2a0cdd75fa2fe1e Text-content-sha1: bf2191ed513ac15916181782aea71c7de9e9aacf Content-length: 180 K 15 cvs2svn:cvs-rev V 5 1.150 PROPS-END SVNmb sJs%H /* Options for pterm. Should split out into platform-dependent part. */ int stamp_utmp; int login_shell Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a3c8aa6dc3b6a1e4037d476b0d528df1 Text-delta-base-sha1: fb30877878d55d0de9692d17729d739cd204bde1 Text-content-length: 254 Text-content-md5: 7d9b1a232fec3ee0f7b9acefc2bdc71a Text-content-sha1: 5446ac69cbfdd7f7abc62bd117a094e1f92a61a9 Content-length: 294 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVNX>]3s?,joiwrite_setting_i(sesskey, "StampUtmp", cfg->stamp_utmp); write_setting_i(sesskey, "LoginShell", cfg->login_shell gppi(sesskey, "StampUtmp", 1, &cfg->stamp_utmp); gppi(sesskey, "LoginShell", 1, &cfg->login_shell) Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 82472d0c94da36ec2771e4d147733852 Text-delta-base-sha1: bf5de224898fb6e0c86046a7e691ad5267674ab4 Text-content-length: 102 Text-content-md5: b3c0328682871ceb22909f477c732678 Text-content-sha1: c23c3f56963900eeb738c9fa158d5217c14a48e3 Content-length: 142 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN}F1 oFfcfg.stamp_utmp = 0; } if (!strcmp(p, "-ls-")) { cfg.login_shell Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a8eb8a95c2bc8da878a00f14671073e6 Text-delta-base-sha1: 9135d47ea2a09fc27eae7e42d827003a22d06d99 Text-content-length: 348 Text-content-md5: 1e3cd21f4c9f9f3dfdddefb1da7a5f1a Text-content-sha1: a4f47e01365373f0fcec6f892e012c65624b36c2 Content-length: 388 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNM,3Q(A}GB+=cfg.cfg. { char *shell = getenv("SHELL"); char *shellname; if (cfg.login_shell) { char *p = strrchr(shell, '/'); shellname = smalloc(2+strlen(shell)); p = p ? p+1 : shell; sprintf(shellname, "-%s", p); } else shellname = shell; execl(getenv("SHELL"), shellname, NULL); } Revision-number: 2061 Prop-content-length: 382 Content-length: 382 K 7 svn:log V 281 Support for all the server-side window configuration requests, including server-controlled resizing. Irritatingly I've had to use a deprecated option to gtk_window_set_policy() to make this work, resulting in me raising GNOME bug #95818 to ask for it to be un- deprecated again... K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-15T14:31:06.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3c0328682871ceb22909f477c732678 Text-delta-base-sha1: c23c3f56963900eeb738c9fa158d5217c14a48e3 Text-content-length: 2549 Text-content-md5: 513e79aca0e07d0934c759526e7ebdd0 Text-content-sha1: af2b956e864121051333f291d620fbbc148fd450 Content-length: 2589 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN}2l{7jj \zHSj^l_@qn6hg8(JLwK?3amFySI char ico * GTK 1.2 doesn't know how to do this. */ #if GTK_CHECK_VERSION(2,0,0) if (iconic) gtk_window_iconify(GTK_WINDOW(inst->window)); else gtk_window_deiconify(GTK_WINDOW(inst->window)); #endif } /* * Move the window in response to a server-side request. */ void move_window(int x, int y) { /* * I assume that when the GTK version of this call is available * we should use it. Not sure how it differs from the GDK one, * though. */ #if GTK_CHECK_VERSION(2,0,0) gtk_window_move(GTK_WINDOW(inst->window), x, y); #else gdk_window_move(inst->window->window, x, y); #endifif (top) gdk_window_raise(inst->window->window); else gdk_window_lower(inst->window->window); } /* * Refresh the window in response to a server-side request. */ void refresh_window(void) { term_invalidate(); * GTK 1.2 doesn't know how to do this. */ #if GTK_CHECK_VERSION(2,0,0) if (iconic) gtk_window_maximize(GTK_WINDOW(inst->window)); else gtk_window_unmaximize(GTK_WINDOW(inst->window)); #endif!gdk_window_is_viewable(inst->window->window);/* * I assume that when the GTK version of this call is available * we should use it. Not sure how it differs from the GDK one, * though. */ #if GTK_CHECK_VERSION(2,0,0) gtk_window_get_position(GTK_WINDOW(inst->window), x, y); #else gdk_window_get_position(inst->window->window, x, y); #endif/* * I assume that when the GTK version of this call is available * we should use it. Not sure how it differs from the GDK one, * though. */ #if GTK_CHECK_VERSION(2,0,0) gtk_window_get_size(GTK_WINDOW(inst->window), x, y); #else gdk_window_get_size(inst->window->window, x, y); #endif } /* * Return the window or icon title. */ char *get_window_title(int icon) { return icon ? inst->wintitle : inst->icoprintf("configure %d x %d\n", event->width, event->height);printf(" = %d x %d\n", w, h)printf("need size\n")w + 2*cfg.window_border, inst->font_height * h + 2*cfg.window_border);strncpy(inst->icontitle, title, lenof(inst->icontitle)); inst->icontitle[lenof(inst->icontitle)-1] = '\0'; gdk_window_set_icon_name(inst->window->window, inst->icontitle);/* * Set up the colour map. */ palette_reset(window_set_policy(GTK_WINDOW(inst->window), FALSE, TRUE, TRUEcfg.height, cfg.width, cfg.savelines); gtk_main(); return 0; } Revision-number: 2062 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 2002-10-15T14:55:19.000000Z K 7 svn:log V 198 Richard's patch to make the scrollbar configurably absent. (Still want a new option to configure it to be on the LHS though. And some lunatic is bound to ask for an xterm-style scrollbar too... :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 513e79aca0e07d0934c759526e7ebdd0 Text-delta-base-sha1: af2b956e864121051333f291d620fbbc148fd450 Text-content-length: 465 Text-content-md5: 578d6fb62f22a1896f1c669e26951d1c Text-content-sha1: d7acb44fa3577669ddeb2e4ad2f1c300bb63c48e Content-length: 505 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN2y8 7%1$Lkvy3ZO{hJf (!cfg.scrollbar) return;cfg.scrollbar) return; if (!strcmp(p, "-sb-")) { cfg.scrollbar = 0f (cfg.scrollbar) { inst->sbar_adjust = GTK_ADJUSTMENT(gtk_adjustment_new(0,0,0,0,0,0)); inst->sbar = gtk_vscrollbar_new(inst->sbar_adjust); }if (cfg.scrollbar) gtk_box_pack_startif (cfg.scrollbar) gtk_signal_connect(GTK_OBJECT(inst->sbar_adjust), "value_changed", if (cfg.scrollbar) Revision-number: 2063 Prop-content-length: 148 Content-length: 148 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-15T14:58:02.000000Z K 7 svn:log V 48 Richard's patch to fix `make clean' under Unix. PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cff0b85530db34df637b1b726be0411b Text-delta-base-sha1: ed216c3152c52d50ac2a86a20b9934f41750ab88 Text-content-length: 66 Text-content-md5: 7c65c202836f02b7f26f4ff578041d39 Text-content-sha1: fbf67cf7f9cf947d97fdcc3ab8567b45cbc00cc7 Content-length: 106 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNLu/!%'". (join "", map { " $_" } &prognames("X")) . " Revision-number: 2064 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2002-10-15T15:16:21.000000Z K 7 svn:log V 91 Don't forget to initialise the pixel size parameters of the window as passed to the pty... K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 578d6fb62f22a1896f1c669e26951d1c Text-delta-base-sha1: d7acb44fa3577669ddeb2e4ad2f1c300bb63c48e Text-content-length: 174 Text-content-md5: 62f7d33dad17578923f6f1d8b0b2d46b Text-content-sha1: 794018a75d30b68d56147332d0141e64e60277d5 Content-length: 214 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNy d`int font_dimension(int which) /* 0 for width, 1 for height */ { if (which) return inst->font_height; else return inst->font_width; Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1e3cd21f4c9f9f3dfdddefb1da7a5f1a Text-delta-base-sha1: a4f47e01365373f0fcec6f892e012c65624b36c2 Text-content-length: 144 Text-content-md5: df81d49f9f698100938459483efa3f74 Text-content-sha1: 6f26c1a3c84fa8ccdcb8c6afa038fb4d7ddfa59a Content-length: 184 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN,, z3z-size.ws_xpixel = (unsigned short) cols * font_dimension(0); size.ws_ypixel = (unsigned short) rows * font_dimension(1) Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f995aa2e823982c0abfaf6a0535857cc Text-delta-base-sha1: a783cdc57837fd76d000bd7d1991da0731b081ac Text-content-length: 157 Text-content-md5: df1c54c87af9a740d3a775574a985516 Text-content-sha1: 5c9a836dd5843cb250dcdd50e5acb8d26005c968 Content-length: 196 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN`L vP/* Things pty.c needs from pterm.c */ char *get_x_display(void); int font_dimension(int which); /* 0 for width, 1 for height */ Revision-number: 2065 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2002-10-15T15:44:23.000000Z K 7 svn:log V 31 Remove some rogue diagnostics. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 62f7d33dad17578923f6f1d8b0b2d46b Text-delta-base-sha1: 794018a75d30b68d56147332d0141e64e60277d5 Text-content-length: 33 Text-content-md5: b1dbc0ed080c250a959599128b128911 Text-content-sha1: b919b39b526b26c7a3d484782d58a283ec4c7643 Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN4p6*f Revision-number: 2066 Prop-content-length: 325 Content-length: 325 K 8 svn:date V 27 2002-10-15T16:24:42.000000Z K 7 svn:log V 224 Use the appalling gnome-terminal hack for server-controlled resizes rather than the gtk_window_set_policy approach; the GNOME people say that the former is the Right Thing in spite of the latter looking obviously plausible. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b1dbc0ed080c250a959599128b128911 Text-delta-base-sha1: b919b39b526b26c7a3d484782d58a283ec4c7643 Text-content-length: 2263 Text-content-md5: d3004306567d8fd6fe4c3507291ed32b Text-content-sha1: c9a6032e348ddac223eb15e2e6e8a65d5afe7e41 Content-length: 2303 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNm55I+[=int large_x, large_y; int offset_x, offset_y; int area_x, area_y; GtkRequisition inner, outer; /* * This is a heinous hack dreamed up by the gnome-terminal * people to get around a limitation in gtk. The problem is * that in order to set the size correctly we really need to be * calling gtk_window_resize - but that needs to know the size * of the _whole window_, not the drawing area. So what we do * is to set an artificially huge size request on the drawing * area, recompute the resulting size request on the window, * and look at the difference between the two. That gives us * the x and y offsets we need to translate drawing area size * into window size for real, and then we call * gtk_window_resize. */ /* * We start by retrieving the current size of the whole window. * Adding a bit to _that_ will give us a value we can use as a * bogus size request which guarantees to be bigger than the * current size of the drawing area. */ get_window_pixels(&large_x, &large_y); large_x += 32; large_y += 32; #if GTK_CHECK_VERSION(2,0,0) gtk_widget_set_size_request(inst->area, large_x, large_y); #else gtk_widget_set_usize(inst->area, large_x, large_y); #endif gtk_widget_size_request(inst->area, &inner); gtk_widget_size_request(inst->window, &outer); offset_x = outer.width - inner.width; offset_y = outer.height - inner.height; area_x = inst->font_width * w + 2*cfg.window_border; area_y = inst->font_height * h + 2*cfg.window_border; /* * Now we must set the size request on the drawing area back to * something sensible before we commit the real resize. Best * way to do this, I think, is to set it to what the size is * really going to end up being. */ #if GTK_CHECK_VERSION(2,0,0) gtk_widget_set_size_request(inst->area, area_x, area_y); #else gtk_widget_set_usize(inst->area, area_x, area_y); #endif #if GTK_CHECK_VERSION(2,0,0) gtk_window_resize(GTK_WINDOW(inst->window), area_x + offset_x, area_y + offset_y); #else gdk_window_resize(inst->window->window, area_x + offset_x, area_y + offset_y); #endif Revision-number: 2067 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2002-10-15T16:38:10.000000Z K 7 svn:log V 140 Support for blinking text and blinking cursor. Won't actually be accessible until there's a way to configure it on, but it worked in tests. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3004306567d8fd6fe4c3507291ed32b Text-delta-base-sha1: c9a6032e348ddac223eb15e2e6e8a65d5afe7e41 Text-content-length: 52 Text-content-md5: a7a64b9ad0b73409f7f75473ff3f5119 Text-content-sha1: 857721da1bf1c52b31094e3d29b83e6c34e92099 Content-length: 92 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNmTUMWterm_blink(0blink(1 Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: df1c54c87af9a740d3a775574a985516 Text-delta-base-sha1: 5c9a836dd5843cb250dcdd50e5acb8d26005c968 Text-content-length: 59 Text-content-md5: dc93bfdf2df69a378ff5d6bd0c9d120b Text-content-sha1: 9611ea2eb75ada7dee29c2257d7373bc5c7905d1 Content-length: 98 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNLG &n350000 /* no standard way to set Revision-number: 2068 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2002-10-15T16:40:22.000000Z K 7 svn:log V 69 Fixes to terminal.c to support blinking and visual bells under Unix. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f8e3885107c96f26f55422df066f3e29 Text-delta-base-sha1: 56b010e2c5caf5f0192a675f912428848f6fd56a Text-content-length: 271 Text-content-md5: 6157bac1ff8f2bf5f74a0c2558ef5ad1 Text-content-sha1: 91b097f3fcda5155a0948559260cf13d43e5b6b9 Content-length: 312 K 15 cvs2svn:cvs-rev V 5 1.103 PROPS-END SVN{1i8F=[J1if (cfg.beep == BELL_VISUAL) { in_vbell = TRUE; vbell_startpoint = ticks; term_update(); } else beep(cfg.beep);; we'll use 0.45 s period. */ if (blink_diff < 0 || blink_diff > (TICKSPERSEC * 9 / 20) Revision-number: 2069 Prop-content-length: 383 Content-length: 383 K 8 svn:date V 27 2002-10-15T16:50:42.000000Z K 7 svn:log V 282 Support scrolling with the mouse wheel (X servers apparently usually send a button 4 press for an upward wheel movement and a button 5 press for a downward one). Untested since my own trackball's button 4 does nothing obvious. Someone with a mouse wheel should give this a workout. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a7a64b9ad0b73409f7f75473ff3f5119 Text-delta-base-sha1: 857721da1bf1c52b31094e3d29b83e6c34e92099 Text-content-length: 242 Text-content-md5: 8ec00cba2b294fb6ee56b3b510890c92 Text-content-sha1: d7c1b8e194a56abe6ffd68c7a50d9298254563de Content-length: 282 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNhO.Oi[8if (event->button == 4 && event->type == GDK_BUTTON_PRESS) { term_scroll(0, -5); return TRUE; } if (event->button == 5 && event->type == GDK_BUTTON_PRESS) { term_scroll(0, +5); return TRUE; } Revision-number: 2070 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Add newline at EOF in uxucs.c. Thanks Richard. :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-15T16:52:45.000000Z PROPS-END Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c94e322917b5a0807445936994d41676 Text-delta-base-sha1: 5bf6174e89871b11937081a0a49574a3046ed10b Text-content-length: 17 Text-content-md5: 87d9aa529e8f34c8bc6441a166e76692 Text-content-sha1: ece9a9535d2f7916122cf935957a58ae07fe4557 Content-length: 56 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN|}| Revision-number: 2071 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2002-10-15T17:18:24.000000Z K 7 svn:log V 68 Support ALT + numeric keypad for typing in strange character codes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8ec00cba2b294fb6ee56b3b510890c92 Text-delta-base-sha1: d7c1b8e194a56abe6ffd68c7a50d9298254563de Text-content-length: 2835 Text-content-md5: c3ec96ebdbc04f0b25a931f4e2b15f76 Text-content-sha1: c7d56efe8baa238638f78b316b10d4972d3c5f02 Content-length: 2875 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNh/+Zh7c's$$Gdint alt_keycode/* By default, nothing is generated. */ end = start = 0; /* * If Alt is being released after typing an Alt+numberpad * sequence, we should generate the code that was typed. */ if (event->type == GDK_KEY_RELEASE && (event->keyval == GDK_Meta_L || event->keyval == GDK_Alt_L || event->keyval == GDK_Meta_R || event->keyval == GDK_Alt_R) && inst->alt_keycode >= 0) { #ifdef KEY_DEBUGGING printf("Alt key up, keycode = %d\n", inst->alt_keycode); #endif output[0] = inst->alt_keycode; end = 1; goto done; } Compose key (!!! requires Unicode faff before even trying) */ /* * If Alt has just been pressed, we start potentially * accumulating an Alt+numberpad code. We do this by * setting alt_keycode to -1 (nothing yet but plausible). */ if ((event->keyval == GDK_Meta_L || event->keyval == GDK_Alt_L || event->keyval == GDK_Meta_R || event->keyval == GDK_Alt_R)) { inst->alt_keycode = -1; goto done; /* this generates nothing else */ } /* * If we're seeing a numberpad key press with Mod1 down, * consider adding it to alt_keycode if that's sensible. * Anything _else_ with Mod1 down cancels any possibility * of an ALT keycode: we set alt_keycode to -2. */ if ((event->state & GDK_MOD1_MASK) && inst->alt_keycode != -2) { int digit = -1; switch (event->keyval) { case GDK_KP_0: case GDK_KP_Insert: digit = 0; break; case GDK_KP_1: case GDK_KP_End: digit = 1; break; case GDK_KP_2: case GDK_KP_Down: digit = 2; break; case GDK_KP_3: case GDK_KP_Page_Down: digit = 3; break; case GDK_KP_4: case GDK_KP_Left: digit = 4; break; case GDK_KP_5: case GDK_KP_Begin: digit = 5; break; case GDK_KP_6: case GDK_KP_Right: digit = 6; break; case GDK_KP_7: case GDK_KP_Home: digit = 7; break; case GDK_KP_8: case GDK_KP_Up: digit = 8; break; case GDK_KP_9: case GDK_KP_Page_Up: digit = 9; break; } if (digit < 0) inst->alt_keycode = -2; /* it's invalid */ else { #ifdef KEY_DEBUGGING printf("Adding digit %d to keycode %d", digit, inst->alt_keycode); #endif if (inst->alt_keycode == -1) inst->alt_keycode = digit; /* one-digit code */ else inst->alt_keycode = inst->alt_keycode * 10 + digit; #ifdef KEY_DEBUGGING printf(" gives new code %d\n", inst->alt_keycode); #endif /* Having used this digit, we now do nothing more with it. */ goto done; } } goto done; } done: if (end-start > 0) { #ifdef KEY_DEBUGGING int i; printf("generating sequence:"); for (i = start; i < end; i++) printf(" %02x", (unsigned char) output[i]); printf("\n"); #endif ldisc_send(output+start, end-start, 1); show_mouseptr(0); term_out();key_release Revision-number: 2072 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2002-10-15T17:24:13.000000Z K 7 svn:log V 117 Scrollbar can now be configured to go on the left (although the current configuration mechanism doesn't support it). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c3ec96ebdbc04f0b25a931f4e2b15f76 Text-delta-base-sha1: c7d56efe8baa238638f78b316b10d4972d3c5f02 Text-content-length: 275 Text-content-md5: 436c50a7c5fafbc43dab5db543df8ad6 Text-content-sha1: 2c4aec932674be0eb7c6cd128d1775857ff69a31 Content-length: 315 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN/wIw]Rif (cfg.scrollbar) { if (cfg.scrollbar_on_left) gtk_box_pack_start(inst->hbox, inst->sbar, FALSE, FALSE, 0); else gtk_box_pack_end(inst->hbox, inst->sbar, FALSE, FALSE, 0); } gtk_box_pack_start(inst->hbox, inst->area, TRUE, TRU Revision-number: 2073 Prop-content-length: 315 Content-length: 315 K 7 svn:log V 214 Printer support: cfg.printer is assumed to be a Unix command through which to pipe printed data. Of course by default printing is disabled; typically cfg.printer would be set to `lpr', perhaps with some arguments. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-15T17:38:04.000000Z PROPS-END Node-path: putty/unix/uxprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b3e4bc953629118753676fcf6a361a0f Text-delta-base-sha1: 3d2a3658f3ea313938a54837f589a310a9dad9cd Text-content-length: 650 Text-content-md5: 62809aafebe4f1edf00490eaaa7f6255 Text-content-sha1: 83243550856ec811e51470740e7abc488fccc318 Content-length: 689 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNd>xFx #include "putty.h" struct printer_job_tag { FILE *fp; }; printer_job *printer_start_job(char *printer) { printer_job *ret = smalloc(sizeof(printer_job)); /* * On Unix, we treat cfg.printer as the name of a command to * pipe to - typically lpr, of course. */ ret->fp = popen(cfg.printer, "w"); if (!ret->fp) { sfree(ret); ret = NULL; } return ret; } void printer_job_data(printer_job *pj, void *data, int len) { if (!pj) return; fwrite(data, 1, len, pj->fp); } void printer_finish_job(printer_job *pj) { if (!pj) return; pclose(pj->fp); sfree(pj); } Revision-number: 2074 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2002-10-15T17:41:22.000000Z K 7 svn:log V 84 If we can't load the specified font, give an error message rather than segfaulting. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 436c50a7c5fafbc43dab5db543df8ad6 Text-delta-base-sha1: 2c4aec932674be0eb7c6cd128d1775857ff69a31 Text-content-length: 130 Text-content-md5: fae0aaee539951aa42725a0f8f5ffd70 Text-content-sha1: 6d7860c7bd3754c51848c3a5f3bb3fd86a7632e9 Content-length: 170 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN h/ht)f (!inst->fonts[0]) { fprintf(stderr, "pterm: unable to load font \"%s\"\n", cfg.font); exit(1); } Revision-number: 2075 Prop-content-length: 162 Content-length: 162 K 7 svn:log V 62 Support underline and vertical-line cursors as well as block. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-15T18:18:25.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fae0aaee539951aa42725a0f8f5ffd70 Text-delta-base-sha1: 6d7860c7bd3754c51848c3a5f3bb3fd86a7632e9 Text-content-length: 2105 Text-content-md5: b46f18f192ca01b66287681ca76ce633 Text-content-sha1: 709faa9722f378487463d2a2cc54e1b548d23936 Content-length: 2145 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN z>md5`tiWSwMTmwh'^x_internal(Context ctx, int x, int y, char *text, int len, } } GdkGC *gc = (GdkGC *)ctx; do_text_internal(ctx, x, y, text, len, attr, lattr);if (attr & TATTR_PASCURS) { attr &= ~TATTR_PASCURS; passive = 1; } else passive = 0; if ((attr & TATTR_ACTCURS) && cfg.cursor_type != 0) { attr &= ~TATTR_ACTCURS; } do_text_internal(ctx, x, y, text, len, attr, lattr); len *= 2; } if (cfg.cursor_type == 0) { /* * An active block cursor will already have been done by * the above do_text call, so we only need to do anything * if it's passive. */ if (passive) { gdk_gc_set_foreground(gc, &inst->cols[NCOLOURS-1]); gdk_draw_rectangle(inst->pixmap, gc, 0, x*inst->font_width+cfg.window_border, y*inst->font_height+cfg.window_border, len*inst->font_width-1, inst->font_height-1); } } else { int uheight; int startx, starty, dx, dy, length, i; int char_width; if ((attr & ATTR_WIDE) || lattr != LATTR_NORM) char_width = 2*inst->font_width; else char_width = inst->font_width; if (cfg.cursor_type == 1) { uheight = inst->fonts[0]->ascent + 1; if (uheight >= inst->font_height) uheight = inst->font_height - 1; startx = x * inst->font_width + cfg.window_border; starty = y * inst->font_height + cfg.window_border + uheight; dx = 1; dy = 0; length = len * char_width; } else { int xadjust = 0; if (attr & TATTR_RIGHTCURS) xadjust = char_width - 1; startx = x * inst->font_width + cfg.window_border + xadjust; starty = y * inst->font_height + cfg.window_border; dx = 0; dy = 1; length = inst->font_height; } gdk_gc_set_foreground(gc, &inst->cols[NCOLOURS-1]); if (passive) { for (i = 0; i < length; i++) { if (i % 2 == 0) { gdk_draw_point(inst->pixmap, gc, startx, starty); } startx += dx; starty += dy; } } else { gdk_draw_line(inst->pixmap, gc, startx, starty, startx + (length-1) * dx, starty + (length-1) * dy); } Revision-number: 2076 Prop-content-length: 187 Content-length: 187 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-15T18:36:18.000000Z K 7 svn:log V 87 Configure the pty so that it agrees with our idea of whether Backspace sends ^H or ^?. PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: df81d49f9f698100938459483efa3f74 Text-delta-base-sha1: 6f26c1a3c84fa8ccdcb8c6afa038fb4d7ddfa59a Text-content-length: 301 Text-content-md5: 0f65e324d4a3642afc60a007ad7c9ac1 Text-content-sha1: 325188697da1332d824fee0c3f1598580a898758 Content-length: 341 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN,Q jRZSet the backspace character to be whichever of ^H and ^? is * specified by bksp_is_delete. */ { struct termios attrs; tcgetattr(pty_master_fd, &attrs); attrs.c_cc[VERASE] = cfg.bksp_is_delete ? '\177' : '\010'; tcsetattr(pty_master_fd, TCSANOW, &attrs); } Revision-number: 2077 Prop-content-length: 260 Content-length: 260 K 8 svn:date V 27 2002-10-15T18:42:48.000000Z K 7 svn:log V 159 Support bold-as-font, by means of a separate bold font (if one was supplied) or shadow bolding (if not). As usual, can't yet be turned on without a recompile. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b46f18f192ca01b66287681ca76ce633 Text-delta-base-sha1: 709faa9722f378487463d2a2cc54e1b548d23936 Text-content-length: 1170 Text-content-md5: 9dea841b2c712ed90c8505facbdfbabe Text-content-sha1: 13030e5d7c8d179a9dbbd5a95aebea52498f9d49 Content-length: 1210 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNzBBZxZtk zTk@QB8(dg*P, fontid, shadowfontid = shadow = 0; if ((attr & ATTR_BOLD) && !cfg.bold_colour) { if (inst->fonts[1]) fontid = 1; else shadow = 1; }fontid/* * X fonts seem to be pretty consistent about leaving the * _left_ pixel of the cell blank rather than the right. Hence * I'm going to hard-code shadow bolding as displaying one * pixel to the left rather than try to work out whether it * should be left or right. */ if (shadow) { gdk_draw_text(inst->pixmap, inst->fonts[fontid], gc, x*inst->font_width+cfg.window_border - 1, y*inst->font_height+cfg.window_border+inst->fonts[0]->ascent, text, len); }fb")) { if (--argc > 0) { strncpy(cfg.boldfont, *++argv, sizeof(cfg.boldfont)); cfg.boldfont[sizeof(cfg.boldfont)-1] = '\0'; } else err = 1, fprintf(stderr, "pterm: -fbf (cfg.boldfont[0]) { inst->fonts[1] = gdk_font_load(cfg.boldfont); if (!inst->fonts[1]) { fprintf(stderr, "pterm: unable to load bold font \"%s\"\n", cfg.boldfont); exit(1); } } else inst->fonts[1] = NULL; Revision-number: 2078 Prop-content-length: 234 Content-length: 234 K 8 svn:date V 27 2002-10-16T09:28:17.000000Z K 7 svn:log V 133 Oops - check in leftovers from yesterday's development. That's what I get for running most of my cvs commands in the unix subdir :-/ K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: dd2698ee3436ce60d2a0cdd75fa2fe1e Text-delta-base-sha1: bf2191ed513ac15916181782aea71c7de9e9aacf Text-content-length: 71 Text-content-md5: 812df29c68cdc6ee7d08639eb73367d5 Text-content-sha1: 8be3b713178354b472a89a0bb0aa34ffa5982939 Content-length: 112 K 15 cvs2svn:cvs-rev V 5 1.151 PROPS-END SVNb 0?%= int scrollbar_on_left; char boldfont[64] Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7d9b1a232fec3ee0f7b9acefc2bdc71a Text-delta-base-sha1: 5446ac69cbfdd7f7abc62bd117a094e1f92a61a9 Text-content-length: 161 Text-content-md5: 03073451ccf7332fe758f8749899da9f Text-content-sha1: 08fda516ae8bc81fb2890c225aa3a5b8100562ab Content-length: 201 K 15 cvs2svn:cvs-rev V 4 1.80 PROPS-END SVN>I-B+&pNwrite_setting_i(sesskey, "ScrollbarOnLeft", cfg->scrollbar_on_left gppi(sesskey, "ScrollbarOnLeft", 0, &cfg->scrollbar_on_left Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6157bac1ff8f2bf5f74a0c2558ef5ad1 Text-delta-base-sha1: 91b097f3fcda5155a0948559260cf13d43e5b6b9 Text-content-length: 32 Text-content-md5: 8f78de8112d98d4d5ddc0586a8d4663e Text-content-sha1: 359513f01859caa25efb87a05ad739ffde9e880e Content-length: 73 K 15 cvs2svn:cvs-rev V 5 1.104 PROPS-END SVN1X>f Revision-number: 2079 Prop-content-length: 246 Content-length: 246 K 8 svn:date V 27 2002-10-16T09:40:36.000000Z K 7 svn:log V 145 Bug `shift-backspace': whichever of ^H and ^? is configured for Backspace, Shift-Backspace should do the _other_ one. Thanks to Justin Bradford. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9dea841b2c712ed90c8505facbdfbabe Text-delta-base-sha1: 13030e5d7c8d179a9dbbd5a95aebea52498f9d49 Text-content-length: 221 Text-content-md5: 2ad0bcad1920103674b263dbc26a4d48 Text-content-sha1: bd0263c058ad7b45e6b982904a313f56001a5f90 Content-length: 261 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNo BB /* For Shift Backspace, do opposite of what is configured. */ if (event->keyval == GDK_BackSpace && (event->state & GDK_SHIFT_MASK)) { output[1] = cfg.bksp_is_delete ? '\x08' : '\x7F Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4193cabcc02b45719d52ad9e11b8463e Text-delta-base-sha1: 488c11bf7ab82e6ce198cbb40acad12f7f82385e Text-content-length: 394 Text-content-md5: 4cca4776326b62c8b2dc3b3fbbd319c4 Text-content-sha1: 3e917d31f52f19da86abaa2b6fa438321977ce49 Content-length: 435 K 15 cvs2svn:cvs-rev V 5 1.204 PROPS-END SVN'FpBACK && shift_state == 1) { /* Shift Backspace */ /* We do the opposite of what is configured */ *p++ = (cfg.bksp_is_delete ? 0x08 : 0x7FKJJwchar_t * data, int len, int must_deselect) { HGLOBAL clipdata, clipdata2, clipdata3; int len2; void *lock, *lock2, *lock3; len2 = WideCharToMultiByte(CP_ACP, 0, data, len, 0, 0, NULL, Revision-number: 2080 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2002-10-16T11:35:13.000000Z K 7 svn:log V 58 Fix for `hostname-whitespace'; thanks to Justin Bradford. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 90584a76d102790d3d42f3105007bfd1 Text-delta-base-sha1: a9567915421dfa2e584a765b45e3d5449b78303f Text-content-length: 297 Text-content-md5: b43f989ef4277391da7457bef5873dc6 Text-content-sha1: 0d3871cefc018406ff972a72983e1cb7e408becd Content-length: 337 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN/ /* * Remove any remaining whitespace from the hostname. */ { int p1 = 0, p2 = 0; while (cfg.host[p2] != '\0') { if (cfg.host[p2] != ' ' && cfg.host[p2] != '\t') { cfg.host[p1] = cfg.host[p2]; p1++; } p2++; } cfg.host[p1] = '\0'; } Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b6fe80a20ff936886e4047579865bbcb Text-delta-base-sha1: 7ee76c3b4d79b9921591d6c779a34c27332cc016 Text-content-length: 297 Text-content-md5: bfd12c0d9dc080844864d62203e25de6 Text-content-sha1: bfaab6e816d1c86f532a81aaf33eb1120f77e039 Content-length: 337 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN#8 o = 0) { if (geteuid() == 0 || access(master_name, R_OK | W_OK) == 0) goto got_one; close(pty_master_fd); } } /* If we get here, we couldn't get a tty at all. */ fprintf(stderr, "pterm: unable to open a pseudo-terminal device\n"); exit(1); got_one: strcpy(pty_name, master_name); pty_name[5] = 't'; /* /dev/ptyXX -> /dev/ttyXX */ /* We need to chown/chmod the /dev/ttyXX device. */ gp = getgrnam("tty"); chown(pty_name, getuid(), gp ? gp->gr_gid : -1); chmod(pty_name, 0600);pty_name[FILENAME_MAX-1] = '\0'; strncpy(pty_name, ptsname(pty_master_fd), FILENAME_MAX-1); #endif } /* * Pre-initialisation. This is here to get around the fact that GTK * doesn't like being run in setuid/setgid programs (probably * sensibly). So before we initialise GTK - and therefore before we * even process the command line - we check to see if we're running * set[ug]id. If so, we open our pty master _now_, chown it as * necessary, and drop privileges. We can always close it again * later. If we're potentially going to be doing utmp as well, we * also fork off a utmp helper process and communicate with it by * means of a pipe; the utmp helper will keep privileges in order * to clean up utmp when we exit (i.e. when its end of our pipe * closes). */ void pty_pre_init(void) { pid_t pid; int pipefd[2]; pty_master_fd = -1; if (geteuid() != getuid() || getegid() != getgid()) { pty_open_master(); } #ifndef OMIT_UTMP /* * Fork off the utmp helper. */ if (pipe(pipefd) < 0) { perror("pterm: pipe"); exit(1); } pid = fork(); if (pid < 0) { perror("pterm: fork"); exit(1); } else if (pid == 0) { char display[128], buffer[128]; int dlen, ret; close(pipefd[1]); /* * Now sit here until we receive a display name from the * other end of the pipe, and then stamp utmp. Unstamp utmp * again, and exit, when the pipe closes. */ dlen = 0; while (1) { ret = read(pipefd[0], buffer, lenof(buffer)); if (ret <= 0) { cleanup_utmp(); exit(0); } else if (!pty_stamped_utmp) { if (dlen < lenof(display)) memcpy(display+dlen, buffer, min(ret, lenof(display)-dlen)); if (buffer[ret-1] == '\0') { /* * Now we have a display name. NUL-terminate * it, and stamp utmp. */ display[lenof(display)-1] = '\0'; /* * Trap as many fatal signals as we can in the * hope of having the best possible chance to * clean up utmp before termination. We are * unfortunately unprotected against SIGKILL, * but that's life. */ signal(SIGHUP, fatal_sig_handler); signal(SIGINT, fatal_sig_handler); signal(SIGQUIT, fatal_sig_handler); signal(SIGILL, fatal_sig_handler); signal(SIGABRT, fatal_sig_handler); signal(SIGFPE, fatal_sig_handler); signal(SIGPIPE, fatal_sig_handler); signal(SIGALRM, fatal_sig_handler); signal(SIGTERM, fatal_sig_handler); signal(SIGSEGV, fatal_sig_handler); signal(SIGUSR1, fatal_sig_handler); signal(SIGUSR2, fatal_sig_handler); #ifdef SIGBUS signal(SIGBUS, fatal_sig_handler); #endif #ifdef SIGPOLL signal(SIGPOLL, fatal_sig_handler); #endif #ifdef SIGPROF signal(SIGPROF, fatal_sig_handler); #endif #ifdef SIGSYS signal(SIGSYS, fatal_sig_handler); #endif #ifdef SIGTRAP signal(SIGTRAP, fatal_sig_handler); #endif #ifdef SIGVTALRM signal(SIGVTALRM, fatal_sig_handler); #endif #ifdef SIGXCPU signal(SIGXCPU, fatal_sig_handler); #endif #ifdef SIGXFSZ signal(SIGXFSZ, fatal_sig_handler); #endif #ifdef SIGIO signal(SIGIO, fatal_sig_handler); #endif /* Also clean up utmp on normal exit. */ atexit(cleanup_utmp); setup_utmp(pty_name, display); } } } } else { close(pipefd[0]); pty_utmp_helper_pid = pid; pty_utmp_helper_pipe = pipefd[1]; } #endif /* Drop privs. */ { int gid = getgid(), uid = getuid(); #ifndef HAVE_NO_SETRESUID int setresgid(gid_t, gid_t, gid_t); int setresuid(uid_t, uid_t, uid_t); setresgid(gid, gid, gid); setresuid(uid, uid, uid); #else setgid(getgid()); setuid(getuid()); #endif }pid_t pid, pgrp; if (pty_master_fd < 0) pty_open_master();Stamp utmp (that is, tell the utmp helper process to do so), * or not. */ if (!cfg.stamp_utmp) close(pty_utmp_helper_pipe); /* just let the child process die */ else { char *location = get_x_display(); int len = strlen(location)+1, pos = 0; /* +1 to include NUL */ while (pos < len) { int ret = write(pty_utmp_helper_pipe, location+pos, len - pos); if (ret < 0) { perror("pterm: writing to utmp helper process"); close(pty_utmp_helper_pipe); /* arrgh, just give up */ break; } pos += ret; } }pty_pty_name, O_WRONLY, 0)); setpgrp( Revision-number: 2083 Prop-content-length: 381 Content-length: 381 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-16T12:30:51.000000Z K 7 svn:log V 280 Add a file to the source archive mentioning the version number of the latest release. This is so that .tar.gz snapshots for the Unix port can be versioned as `0.53-20021016' or similar, meaning that (e.g.) Debian version numbering can be monotonic between releases and snapshots. PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 15 Text-content-md5: 842ec5d3dc70bcdfa9b5e02d231f5f04 Text-content-sha1: 9ee1630c2df57a32622bf0f97316ad5ac8e45275 Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN0.53 Revision-number: 2084 Prop-content-length: 192 Content-length: 192 K 8 svn:date V 27 2002-10-16T14:32:06.000000Z K 7 svn:log V 92 Implement reading of X resources, and -name to change the name under which to look them up. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 19958b7b6a8abf63b9ee9409117dfffd Text-delta-base-sha1: 321d6db4476826d41772ec5456877894c50a3096 Text-content-length: 2198 Text-content-md5: fde0f8373a88532b22c1474edbb238da Text-content-sha1: a799fe028a30da04a2767c78e92677ef970cc26c Content-length: 2238 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVNC'afM;+2?"o|.4char *app_name = "pterm"; int do_cmdline(int argc, char **argv, int do_everything) { int err = 0; extern char **pty_argv; /* declared in pty.c */ /* * Macros to make argument handling easier. */ #define EXPECTS_ARG do { \ if (--argc <= 0) { \ err = 1; \ fprintf(stderr, "pterm: %s expects an argument\n", p); \ } else \ val = *++argv; \ } while (0) #define SECOND_PASS_ONLY do { \ if (!do_everything) continue; \ } while (0) char *val;EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(cfg.font, val, sizeof(cfg.font)); cfg.font[sizeof(cfg.font)-1] = '\0'; } else if (!strcmp(p, "-fb")) { EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(cfg.boldfont, val, sizeof(cfg.boldfont)); cfg.boldfont[sizeof(cfg.boldfont)-1] = '\0'; } else if (!strcmp(p, "-e")) { /* This option swallows all further arguments. */ if (!do_everything) break; } else if (!strcmp(p, "-T")) { EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(cfg.wintitle, val, sizeof(cfg.wintitle)); cfg.wintitle[sizeof(cfg.wintitle)-1] = '\0'; } else if (!strcmp(p, "-log")) { EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(cfg.logfilename, val, sizeof(cfg.logfilename)); cfg.logfilename[sizeof(cfg.logfilename)-1] = '\0'; cfg.logtype = LGTYP_DEBUG; } else if (!strcmp(p, "-hide")) { SECOND_PASS_ONLY; cfg.hide_mouseptr = 1; } else if (!strcmp(p, "-ut-")) { SECOND_PASS_ONLY; cfg.stamp_utmp = 0; } else if (!strcmp(p, "-ls-")) { SECOND_PASS_ONLY; cfg.login_shell = 0; } else if (!strcmp(p, "-nethack")) { SECOND_PASS_ONLY; cfg.nethack_keypad = 1; } else if (!strcmp(p, "-sb-")) { SECOND_PASS_ONLY; cfg.scrollbar = 0; } else if (!strcmp(p, "-name")) { EXPECTS_ARG; app_name = val; } } return errvoid pty_pre_init(void); /* declared in pty.c */ pty_pre_init(); gtk_init(&argc, &argv); if (do_cmdline(argc, argv, 0)) /* pre-defaults pass to get -class */ exit(1); do_defaults(NULL, &cfg); if (do_cmdline(argc, argv, 1)) /* post-defaults, do everything */ exit(1); Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dc93bfdf2df69a378ff5d6bd0c9d120b Text-delta-base-sha1: 9611ea2eb75ada7dee29c2257d7373bc5c7905d1 Text-content-length: 117 Text-content-md5: aee867b314a46aa4f545bf6fb07012f4 Text-content-sha1: e2034972f61caaf42df063005efa52108998c06a Content-length: 156 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNG, `y`St/* Things uxstore.c needs from pterm.c */ char *app_name; /* for doing resource lookups Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f2ccd388d464f2f3f46d9a5d5cf94381 Text-delta-base-sha1: 7a8680b3afa509b1746995bd2d971b013dc71cde Text-content-length: 1393 Text-content-md5: 6ce193291541fc387ea1979b4065788c Text-content-sha1: fc88bdfd5ec2a4b2757e0fbcca4b266dd30e9efb Content-length: 1432 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN"3Q Gka j8 #include #include #include "putty.h" #include "storage.h" /* * For the moment, the only existing Unix utility is pterm and that * has no GUI configuration at all, so our write routines need do * nothing. Eventually I suppose these will read and write an rc * file somewhere or other. /* * Reading settings, for the moment, is done by retrieving X * resources from the X display. When we introduce disk files, I * think what will happen is that the X resources will override * PuTTY's inbuilt defaults, but that the disk files will then * override those. This isn't optimal, but it's the best I can * immediately work out. */ static Display *display; void *open_settings_r(char *sessionname) { static int thing_to_return_an_arbitrary_non_null_pointer_to; display = GDK_DISPLAY(); if (!display) return NULL; else return &thing_to_return_an_arbitrary_non_null_pointer_to; } char *read_setting_s(void *handle, char *key, char *buffer, int buflen) { char *val = XGetDefault(display, app_name, key); if (!val) return NULL; else { strncpy(buffer, val, buflen); buffer[buflen-1] = '\0'; return buffer; } } int read_setting_i(void *handle, char *key, int defvalue) { char *val = XGetDefault(display, app_name, key); if (!val) return defvalue; else return atoi(val) Revision-number: 2085 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2002-10-16T14:32:21.000000Z K 7 svn:log V 53 Oops, forgot to add BoldFont to the settings module. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 03073451ccf7332fe758f8749899da9f Text-delta-base-sha1: 08fda516ae8bc81fb2890c225aa3a5b8100562ab Text-content-length: 150 Text-content-md5: 6d4da125dabfdb09a0f5f1739332da75 Text-content-sha1: 96594e7cabd3556343ac5c16ceddb4a85b610554 Content-length: 190 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVNIKwvnnFpYwrite_setting_s(sesskey, "BoldFont", cfg->boldfon gpps(sesskey, "BoldFont", "", cfg->boldfont, sizeof(cfg->boldfont) Revision-number: 2086 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2002-10-16T16:00:38.000000Z K 7 svn:log V 33 A few more command-line options. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fde0f8373a88532b22c1474edbb238da Text-delta-base-sha1: a799fe028a30da04a2767c78e92677ef970cc26c Text-content-length: 2008 Text-content-md5: 2cc5be384a5a11472168fdb5a3b10929 Text-content-sha1: 8aa322120a4223c5b3e4f79cb249d76f7e471b46 Content-length: 2048 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVN--> V) [dZ|!diX11/Xlib.h> #include 0) { char *p = *++argv; if (!strcmp(p, "-fn") || !strcmp(p, "-fontgeometry")) { int flags, x, y, w, h; EXPECTS_ARG; SECOND_PASS_ONLY; flags = XParseGeometry(val, &x, &y, &w, &h); if (flags & WidthValue) cfg.width = w; if (flags & HeightValue) cfg.height = h; /* * Apparently setting the initial window position is * difficult in GTK 1.2. Not entirely sure why this * should be. 2.0 has gtk_window_parse_geometry(), * which would help... For the moment, though, I can't * be bothered with this. */ } else if (!strcmp(p, "-sl")) { EXPECTS_ARG; SECOND_PASS_ONLY; cfg.savelines = atoi(val); } else if (!strcmp(p, "-fg") || !strcmp(p, "-bg") || !strcmp(p, "-bfg") || !strcmp(p, "-bbg") || !strcmp(p, "-cfg") || !strcmp(p, "-cbg")) { GdkColor col; EXPECTS_ARG; SECOND_PASS_ONLY; if (!gdk_color_parse(val, &col)) { err = 1; fprintf(stderr, "pterm: unable to parse colour \"%s\"\n", val); } else { int index; index = (!strcmp(p, "-fg") ? 0 : !strcmp(p, "-bg") ? 2 : !strcmp(p, "-bfg") ? 1 : !strcmp(p, "-bbg") ? 3 : !strcmp(p, "-cfg") ? 4 : !strcmp(p, "-cbg") ? 5 : -1); assert(index != -1); cfg.colours[index][0] = col.red / 256; cfg.colours[index][1] = col.green / 256; cfg.colours[index][2] = col.blue / 256; }ut-") || !strcmp(p, "+ut")) { SECOND_PASS_ONLY; cfg.stamp_utmp = 0; } else if (!strcmp(p, "-ut")) { SECOND_PASS_ONLY; cfg.stamp_utmp = 0; } else if (!strcmp(p, "-ls-") || !strcmp(p, "+ls")) { SECOND_PASS_ONLY; cfg.login_shell = 0; } else if (!strcmp(p, "-ls")) { SECOND_PASS_ONLY; cfg.login_shell = 1 || !strcmp(p, "+sb")) { SECOND_PASS_ONLY; cfg.scrollbar = 0; } else if (!strcmp(p, "-sb Revision-number: 2087 Prop-content-length: 278 Content-length: 278 K 8 svn:date V 27 2002-10-16T16:32:17.000000Z K 7 svn:log V 177 Temporarily change the default for cut-and-paste of line drawing characters, under Unix only, because the stub Unicode layer makes the usual default break moderately painfully. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6d4da125dabfdb09a0f5f1739332da75 Text-delta-base-sha1: 96594e7cabd3556343ac5c16ceddb4a85b610554 Text-content-length: 475 Text-content-md5: b1c6deab730f881aa1b8876dc6170229 Text-content-sha1: 6f23460557fc4bfb3e13f7155ad1d98efb143e76 Content-length: 515 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVNK]?8?fe#ifndef _WINDOWS /* Non-raw cut and paste of line-drawing chars works badly on the * current Unix stub implementation of the Unicode functions. * So I'm going to temporarily set the default to raw mode so * that the failure mode isn't quite so drastically horrid. * When Unicode comes in, this can all be put right. */ gppi(sesskey, "RawCNP", 1, &cfg->rawcnp); #else gppi(sesskey, "RawCNP", 0, &cfg->rawcnp); #endif Revision-number: 2088 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2002-10-16T22:43:35.000000Z K 7 svn:log V 16 Add a man page. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 18357 Text-content-md5: cda2ed07f4618cb65a5ca2c6497c518f Text-content-sha1: 4b0f25413a4f03e1813621198081d657741b75aa Content-length: 18473 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN$$$.TH pterm 1 .UC .SH NAME pterm \- yet another X terminal emulator .SH SYNOPSIS \fBpterm\fP [ \fIoptions\fP ] .SH DESCRIPTION \fIpterm\fP is a terminal emulator for X. It is based on a port of the terminal emulation engine in the Windows SSH client PuTTY. .SH OPTIONS The command-line options supported by \fIpterm\fP are: .IP "\fB-e\fP \fIcommand\fP [ \fIarguments\fP ]" Specify a command to be executed in the new terminal. Everything on the command line after this option will be passed straight to the \fIexecvp\fP system call; so if you need the command to redirect its input or output, you will have to use \fIsh\fP: pterm -e sh -c 'mycommand < inputfile' .IP "\fB--display\fP \fIdisplay-name\fP" Specify the X display on which to open \fIpterm\fP. (Note this option has a double minus sign, even though none of the others do. This is because this option is supplied automatically by GTK. Sorry.) .IP "\fB-name\fP \fIfont-name\fP" Specify the name under which \fIpterm\fP looks up X resources. Normally it will look them up as (for example) \fBpterm.Font\fP. If you specify "-name xyz", it will look them up as \fBxyz.Font\fP instead. This allows you to set up several different sets of defaults and choose between them. .IP "\fB-fn\fP \fIfont-name\fP" Specify the font to use for normal text displayed in the terminal. .IP "\fB-fb\fP \fIfont-name\fP" Specify the font to use for bold text displayed in the terminal. If the \fIBoldAsColour\fP resource is set to 1 (the default), bold text will be displayed in different colours instead of a different font, so this option will be ignored. If \fIBoldAsColour\fP is set to 0 and you do not specify a bold font, \fIpterm\fP will overprint the normal font to make it look bolder. .IP "\fB-geometry\fP \fIwidth\fPx\fIheight\fP" Specify the size of the terminal, in rows and columns of text. Unfortunately \fIpterm\fP does not currently support specifying the initial position of the window. .IP "\fB-sl\fP \fIlines\fP" Specify the number of lines of scrollback to save off the top of the terminal. .IP "\fB-fg\fP \fIcolour\fP" Specify the foreground colour to use for normal text. .IP "\fB-bg\fP \fIcolour\fP" Specify the background colour to use for normal text. .IP "\fB-bfg\fP \fIcolour\fP" Specify the foreground colour to use for bold text, if the \fIBoldAsColour\fP resource is set to 1 (the default). .IP "\fB-bbg\fP \fIcolour\fP" Specify the foreground colour to use for bold reverse-video text, if the \fIBoldAsColour\fP resource is set to 1 (the default). (This colour is best thought of as the bold version of the background colour; so it only appears when text is displayed \fIin\fP the background colour.) .IP "\fB-cfg\fP \fIcolour\fP" Specify the foreground colour to use for text covered by the cursor. .IP "\fB-cbg\fP \fIcolour\fP" Specify the background colour to use for text covered by the cursor. In other words, this is the main colour of the cursor. .IP "\fB-T\fP \fItitle\fP" Specify the initial title of the terminal window. (This can be changed under control of the server.) .IP "\fB-ut-\fP or \fB+ut\fP" Tells \fIpterm\fP not to record your login in the \fIutmp\fP, \fIwtmp\fP and \fIlastlog\fP system log files; so you will not show up on \fIfinger\fP or \fIwho\fP listings, for example. .IP "\fB-ut\fP" Tells \fIpterm\fP to record your login in \fIutmp\fP, \fIwtmp\fP and \fIlastlog\fP: this is the opposite of \fI-ut-\fP. This is the default option: you will probably only need to specify it explicitly if you have changed the default using the \fIStampUtmp\fP resource. .IP "\fB-ls-\fP or \fB+ls\fP" Tells \fIpterm\fP not to execute your shell as a login shell. .IP "\fB-ls\fP" Tells \fIpterm\fP to execute your shell as a login shell: this is the opposite of \fI-ls-\fP. This is the default option: you will probably only need to specify it explicitly if you have changed the default using the \fILoginShell\fP resource. .IP "\fB-sb-\fP or \fB+sb\fP" Tells \fIpterm\fP not to display a scroll bar. .IP "\fB-sb\fP" Tells \fIpterm\fP to display a scroll bar: this is the opposite of \fI-ls-\fP. This is the default option: you will probably only need to specify it explicitly if you have changed the default using the \fIScrollBar\fP resource. .IP "\fB-log\fP \fIfilename\fP" This option makes \fIpterm\fP log all the terminal output to a file as well as displaying it in the terminal. .IP "\fB-nethack\fP" Tells \fIpterm\fP to enable NetHack keypad mode, in which the numeric keypad generates the NetHack "hjklyubn" direction keys. This enables you to play NetHack with the numeric keypad without having to use the NetHack "number_pad" option (which requires you to press "n" before any repeat count). So you can move with the numeric keypad, and enter repeat counts with the normal number keys. .SH X RESOURCES \fIpterm\fP can be more completely configured by means of X resources. All of these resources are of the form \fIpterm.FOO\fP for some FOO; you can make \fIpterm\fP look them up under another name, such as \fIxyz.FOO\fP, by specifying the command-line option "-name xyz". .IP "\fBpterm.TerminalType\fP" This controls the value set in the TERM environment variable inside the new terminal. The default is "xterm". .IP "\fBpterm.BackspaceIsDelete\fP" This option should be set to either 0 or 1; the default is 1. When set to 0, the ordinary Backspace key generates the Backspace character (^H); when set to 1, it generates the Delete character (^?). Whichever one you set, the terminal device inside \fIpterm\fP will be set up to expect it. .IP "\fBpterm.RXVTHomeEnd\fP" This option should be set to either 0 or 1; the default is 0. When it is set to 1, the Home and End keys generate the control sequences they would generate in the \fIrxvt\fP terminal emulator, instead of the more usual ones generated by other emulators. .IP "\fBpterm.LinuxFunctionKeys\fP" This option can be set to any number between 0 and 5 inclusive; the default is 0. The modes vary the control sequences sent by the function keys; for more complete documentation, it is probably simplest to try each option in "pterm -e cat", and press the keys to see what they generate. .IP "\fBpterm.NoApplicationKeys\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from ever switching the numeric keypad into application mode (where the keys send function-key-like sequences instead of numbers or arrow keys). You probably only need this if some application is making a nuisance of itself. .IP "\fBpterm.NoApplicationCursors\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from ever switching the cursor keys into application mode (where the keys send slightly different sequences). You probably only need this if some application is making a nuisance of itself. .IP "\fBpterm.NoMouseReporting\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from ever enabling mouse reporting mode (where mouse clicks are sent to the application instead of controlling cut and paste). .IP "\fBpterm.NoRemoteResize\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from being able to remotely control the size of the \fIpterm\fP window. .IP "\fBpterm.NoAltScreen\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from using the "alternate screen" terminal feature, which lets full-screen applications leave the screen exactly the way they found it. .IP "\fBpterm.NoRemoteWinTitle\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from remotely controlling the title of the \fIpterm\fP window. .IP "\fBpterm.NoDBackspace\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, it disables the normal action of the Delete (^?) character when sent from the server to the terminal, which is to move the cursor left by one space and erase the character now under it. .IP "\fBpterm.ApplicationCursorKeys\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, the default initial state of the cursor keys are application mode (where the keys send function-key-like sequences instead of numbers or arrow keys). When set to 0, the default state is the normal one. .IP "\fBpterm.ApplicationKeypad\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, the default initial state of the numeric keypad is application mode (where the keys send function-key-like sequences instead of numbers or arrow keys). When set to 0, the default state is the normal one. .IP "\fBpterm.NetHackKeypad\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, the numeric keypad operates in NetHack mode. This is equivalent to the \fI-nethack\fP command-line option. .IP "\fBpterm.Answerback\fP" This option controls the string which the terminal sends in response to receiving the ^E character ("tell me about yourself"). By default this string is "PuTTY". .IP "\fBpterm.HideMousePtr\fP" This option should be set to either 0 or 1; the default is 0. When it is set to 1, the mouse pointer will disappear if it is over the \fIpterm\fP window and you press a key. It will reappear as soon as you move it. .IP "\fBpterm.WindowBorder\fP" This option controls the number of pixels of space between the text in the \fIpterm\fP window and the window frame. The default is 1. You can increase this value, but decreasing it to 0 is not recommended because it can cause the window manager's size hints to work incorrectly. .IP "\fBpterm.CurType\fP" This option should be set to either 0, 1 or 2; the default is 0. When set to 0, the text cursor displayed in the window is a rectangular block. When set to 1, the cursor is an underline; when set to 2, it is a vertical line. .IP "\fBpterm.BlinkCur\fP" This option should be set to either 0 or 1; the default is 0. When it is set to 1, the text cursor will blink when the window is active. .IP "\fBpterm.Beep\fP" This option should be set to either 0 or 2 (yes, 2); the default is 0. When it is set to 2, \fIpterm\fP will respond to a bell character (^G) by flashing the window instead of beeping. .IP "\fBpterm.BellOverload\fP" This option should be set to either 0 or 1; the default is 0. When it is set to 1, \fIpterm\fP will watch out for large numbers of bells arriving in a short time and will temporarily disable the bell until they stop. The idea is that if you \fIcat\fP a binary file, the frantic beeping will mostly be silenced by this feature and will not drive you crazy. The bell overload mode is activated by receiving N bells in time T; after a further time S without any bells, overload mode will turn itself off again. .IP "\fBpterm.BellOverloadN\fP" This option counts the number of bell characters which will activate bell overload if they are received within a length of time T. The default is 5. .IP "\fBpterm.BellOverloadT\fP" This option specifies the time period in which receiving N or more bells will activate bell overload mode. It is measured in microseconds, so (for example) set it to 1000000 for one second. The default is 2000000 (two seconds). .IP "\fBpterm.BellOverloadS\fP" This option specifies the time period of silence required to turn off bell overload mode. It is measured in microseconds, so (for example) set it to 1000000 for one second. The default is 5000000 (five seconds of silence). .IP "\fBpterm.ScrollbackLines\fP" This option specifies how many lines of scrollback to save above the visible terminal screen. The default is 200. This resource is equivalent to the \fI-sl\fP command-line option. .IP "\fBpterm.DECOriginMode\fP" This option should be set to either 0 or 1; the default is 0. It specifies the default state of DEC Origin Mode. (If you don't know what that means, you probably don't need to mess with it.) .IP "\fBpterm.AutoWrapMode\fP" This option should be set to either 0 or 1; the default is 1. It specifies the default state of auto wrap mode. When set to 1, very long lines will wrap over to the next line on the terminal; when set to 0, long lines will be squashed against the right-hand edge of the screen. .IP "\fBpterm.LFImpliesCR\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, the terminal will return the cursor to the left side of the screen when it receives a line feed character. .IP "\fBpterm.WinTitle\fP" This resource is the same as the \fI-T\fP command-line option: it controls the initial title of the window. The default is "pterm". .IP "\fBpterm.TermWidth\fP" This resource is the same as the width part of the \fI-geometry\fP command-line option: it controls the number of columns of text in the window. The default is 80. .IP "\fBpterm.TermHeight\fP" This resource is the same as the width part of the \fI-geometry\fP command-line option: it controls the number of columns of text in the window. The defaults is 24. .IP "\fBpterm.Font\fP" This resource is the same as the \fI-fn\fP command-line option: it controls the font used to display normal text. The default is "fixed". .IP "\fBpterm.BoldFont\fP" This resource is the same as the \fI-fb\fP command-line option: it controls the font used to display bold text when \fIBoldAsColour\fP is turned off. The default is unset (the font will be bolded by printing it twice at a one-pixel offset). .IP "\fBpterm.BoldAsColour\fP" This option should be set to either 0 or 1; the default is 1. It specifies the default state of auto wrap mode. When set to 1, bold text is shown by displaying it in a brighter colour; when set to 0, bold text is shown by displaying it in a heavier font. .IP "\fBpterm.Colour0\fP, \fBpterm.Colour1\fP, ..., \fBpterm.Colour21\fP" These options control the various colours used to display text in the \fIpterm\fP window. Each one should be specified as a triple of decimal numbers giving red, green and blue values: so that black is "0,0,0", white is "255,255,255", red is "255,0,0" and so on. Colours 0 and 1 specify the foreground colour and its bold equivalent (the \fI-fg\fP and \fI-bfg\fP command-line options). Colours 2 and 3 specify the background colour and its bold equivalent (the \fI-bg\fP and \fI-bbg\fP command-line options). Colours 4 and 5 specify the text and block colours used for the cursor (the \fI-cfg\fP and \fI-cbg\fP command-line options). Each even number from 6 to 20 inclusive specifies the colour to be used for one of the ANSI primary colour specifications (black, red, green, yellow, blue, magenta, cyan, white, in that order); the odd numbers from 7 to 21 inclusive specify the bold version of each colour, in the same order. The defaults are: .nf pterm.Colour0: 187,187,187 pterm.Colour1: 255,255,255 pterm.Colour2: 0,0,0 pterm.Colour3: 85,85,85 pterm.Colour4: 0,0,0 pterm.Colour5: 0,255,0 pterm.Colour6: 0,0,0 pterm.Colour7: 85,85,85 pterm.Colour8: 187,0,0 pterm.Colour9: 255,85,85 pterm.Colour10: 0,187,0 pterm.Colour11: 85,255,85 pterm.Colour12: 187,187,0 pterm.Colour13: 255,255,85 pterm.Colour14: 0,0,187 pterm.Colour15: 85,85,255 pterm.Colour16: 187,0,187 pterm.Colour17: 255,85,255 pterm.Colour18: 0,187,187 pterm.Colour19: 85,255,255 pterm.Colour20: 187,187,187 pterm.Colour21: 255,255,255 .fi .IP "\fBpterm.RectSelect\fP" This option should be set to either 0 or 1; the default is 0. When set to 0, dragging the mouse over several lines selects to the end of each line and from the beginning of the next; when set to 1, dragging the mouse over several lines selects a rectangular region. In each case, holding down Alt while dragging gives the other behaviour. .IP "\fBpterm.MouseOverride\fP" This option should be set to either 0 or 1; the default is 1. When set to 1, if the application requests mouse tracking (so that mouse clicks are sent to it instead of doing selection), holding down Shift will revert the mouse to normal selection. When set to 0, mouse tracking completely disables selection. .IP "\fBpterm.Printer\fP" This option is unset by default. If you set it, then server-controlled printing is enabled: the server can send control sequences to request data to be sent to a printer. That data will be piped into the command you specify here; so you might want to set it to "lpr", for example, or "lpr -Pmyprinter". .IP "\fBpterm.ScrollBar\fP" This option should be set to either 0 or 1; the default is 1. When set to 0, the scrollbar is hidden (although Shift-PageUp and Shift-PageDown still work). This is the same as the \fI-sb\fP command-line option. .IP "\fBpterm.ScrollbarOnLeft\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, the scrollbar will be displayed on the left of the terminal instead of on the right. .IP "\fBpterm.ScrollOnKey\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, any keypress causes the position of the scrollback to be reset to the very bottom. .IP "\fBpterm.ScrollOnDisp\fP" This option should be set to either 0 or 1; the default is 1. When set to 1, any activity in the display causes the position of the scrollback to be reset to the very bottom. .IP "\fBpterm.BCE\fP" This option should be set to either 0 or 1; the default is 1. When set to 1, the various control sequences that erase parts of the terminal display will erase in whatever the current background colour is; when set to 0, they will erase in black always. .IP "\fBpterm.BlinkText\fP" This option should be set to either 0 or 1; the default is 0. When set to 1, text specified as blinking by the server will actually blink on and off; when set to 0, \fIpterm\fP will use the less distracting approach of making the text's background colour bold. .IP "\fBpterm.StampUtmp\fP" This option should be set to either 0 or 1; the default is 1. When set to 1, \fIpterm\fP will log the login in the various system log files. This resource is equivalent to the \fI-ut\fP command-line option. .IP "\fBpterm.LoginShell\fP" This option should be set to either 0 or 1; the default is 1. When set to 1, \fIpterm\fP will execute your shell as a login shell. This resource is equivalent to the \fI-ls\fP command-line option. .SH BUGS Most of the X resources have silly names. (Historical reasons from PuTTY, mostly.) Character-set switching and Unicode are not yet supported. Revision-number: 2089 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2002-10-16T22:54:58.000000Z K 7 svn:log V 136 Add the -xrm command-line option, to allow specification of an arbitrary X resource which doesn't have a dedicated command-line option. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cda2ed07f4618cb65a5ca2c6497c518f Text-delta-base-sha1: 4b0f25413a4f03e1813621198081d657741b75aa Text-content-length: 232 Text-content-md5: 406b8efccee9ffafe144151a962f2ba5 Text-content-sha1: e56e734af43434a4ed58fdb75c1374830dd16fb4 Content-length: 271 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN$t N*N|(IP "\fB-xrm\fP \fIresource-string\fP" This option specifies an X resource string. Useful for setting resources which do not have their own command-line options. For example: pterm -xrm 'ScrollbarOnLeft: 1' Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2cc5be384a5a11472168fdb5a3b10929 Text-delta-base-sha1: 8aa322120a4223c5b3e4f79cb249d76f7e471b46 Text-content-length: 109 Text-content-md5: 30485c3425c942195bf26f305c809678 Text-content-sha1: 5fde656eb92c3c3899a4651ed910983bfed2c1ef Content-length: 149 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNr S5Sj4 } else if (!strcmp(p, "-xrm")) { EXPECTS_ARG; provide_xrm_string(val); Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aee867b314a46aa4f545bf6fb07012f4 Text-delta-base-sha1: e2034972f61caaf42df063005efa52108998c06a Text-content-length: 102 Text-content-md5: 83b76ca7d40099062c63312b02c8af8e Text-content-sha1: 75ade5ec223c7a885f0cd52a15426e07b51b79e1 Content-length: 141 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN, Q^QP\/* Things uxstore.c provides to pterm.c */ void provide_xrm_string(char *string); Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6ce193291541fc387ea1979b4065788c Text-delta-base-sha1: fc88bdfd5ec2a4b2757e0fbcca4b266dd30e9efb Text-content-length: 1289 Text-content-md5: a1790be9bf024eb139bd023f5b773b4d Text-content-sha1: c40d570f86fc11cc530ee474bcd6134c8f5401f2 Content-length: 1328 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN3c#ZmMi,L4K* ctype#include "tree234struct xrm_string { char *key; char *value; }; static tree234 *xrmtree = NULL; int xrmcmp(void *av, void *bv) { struct xrm_string *a = (struct xrm_string *)av; struct xrm_string *b = (struct xrm_string *)bv; return strcmp(a->key, b->key); } void provide_xrm_string(char *string) { char *p, *q; struct xrm_string *xrms, *ret; p = q = strchr(string, ':'); if (!q) { fprintf(stderr, "pterm: expected a colon in resource string" " \"%s\"\n", string); return; } q++; while (p > string && p[-1] != '.' && p[-1] != '*') p--; xrms = smalloc(sizeof(struct xrm_string)); xrms->key = smalloc(q-p); memcpy(xrms->key, p, q-p); xrms->key[q-p-1] = '\0'; while (*q && isspace(*q)) q++; xrms->value = dupstr(q); if (!xrmtree) xrmtree = newtree234(xrmcmp); ret = add234(xrmtree, xrms); if (ret) { /* Override an existing string. */ del234(xrmtree, ret); add234(xrmtree, xrms); } } char *get_setting(char *key) { struct xrm_string tmp, *ret; tmp.key = key; if (xrmtree) { ret = find234(xrmtree, &tmp, NULL); if (ret) return ret->value; } return XGetDefault(display, app_name, key); }get_setting(get_setting( Revision-number: 2090 Prop-content-length: 503 Content-length: 503 K 7 svn:log V 402 What it says on the tin. From Simon July 2001: | ... although I don't see why we shouldn't support rsh at some future | point. The major thing holding us back is that rsh requires two | network connections, so we would have to do a proper job of the | infrastructure required to support multiple connections. This is | also required for SSH port forwarding, so I hope it will be done | soonish anyway. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-10-16T23:07:55.000000Z PROPS-END Node-path: putty-wishlist/data/rsh-backend Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 150 Text-content-md5: 77da0579e9f8bcb592cc8b04d2c0812a Text-content-sha1: 9bdab273a4935a88af7d793d997a03448483a85a Content-length: 266 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: rsh backend Class: wish Difficulty: tricky Priority: low Content-type: text/plain There's no reason we shouldn't support rsh. Revision-number: 2091 Prop-content-length: 113 Content-length: 113 K 7 svn:log V 13 ITYM "class" K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-10-17T09:35:42.000000Z PROPS-END Node-path: putty-wishlist/data/ssh2-keyderive-nonbug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1a60999b6d6682eef4d943b24f5b9e94 Text-delta-base-sha1: dc08bdf94aa16f62a8acc8dfda4386d40f175624 Text-content-length: 84 Text-content-md5: fe2d2d83f58a5abc8e85313843186d9b Text-content-sha1: fc4a7caf4076863807ae821550d689676039fac3 Content-length: 123 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNCCVDSummary: SSH 2.0.13 apparently doesn't have key-derivation bug Clas Revision-number: 2092 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2002-10-17T10:10:22.000000Z K 7 svn:log V 112 Add `0.53' to a load of `Fixed-in' headers, so that we can support further classification of fixed bugs/wishes. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/command-line Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 24bfd7b21439bcc8d7988068eb70242e Text-delta-base-sha1: 57f1ee5e3f16834c5af9f96eb01b8f1a14ba8d00 Text-content-length: 26 Text-content-md5: ba0f414f5bea19c0a5a86f8aba67efae Text-content-sha1: d69c5a18b3d50a2dd31be5d71f2bd382e9339cc5 Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNEJ ? 0.53 Node-path: putty-wishlist/data/freebsd-4.6-ki-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c7fa493504e348450c2a089362b768db Text-delta-base-sha1: 6bfe9b4d9c22262c99f9ec885b42d8d94fb8bee0 Text-content-length: 26 Text-content-md5: e5154e631edf13f19f7e37c8ad555cd9 Text-content-sha1: 4de986d9acd2d922fbaac3fd79cb5d702b858741 Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN49 9{9 0.53 Node-path: putty-wishlist/data/key-formats Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 28f7a11be00dacafc89c6d0e97af2299 Text-delta-base-sha1: 6c9baed457e4c5baa37397c48b9f8efac08c5591 Text-content-length: 26 Text-content-md5: 78f3a70720821858d6b890e924d89930 Text-content-sha1: af18958c0f857bed9f3fb7b3b95c23e0568225a3 Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN %  0.53 Node-path: putty-wishlist/data/long-usernames Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5789d04dd715f6bf5cdfbe0bee3ef3c4 Text-delta-base-sha1: 761a1cbd650b32f2ed17fb50ae50e13d9eb74b79 Text-content-length: 25 Text-content-md5: 0afceb999fe425de441860487883b042 Text-content-sha1: 6fbdb1e0ca2cbd8e4c658b6b22dea2990ebcd823 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN %   0.5 Node-path: putty-wishlist/data/portfwd-open-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e445a117131d8beb5e3a9e4fff1a0ade Text-delta-base-sha1: 4ce702b8dc1ecc6437d9b4304d022e8a733601a9 Text-content-length: 26 Text-content-md5: bfe9a001633e8583709dcf92bf6a41c6 Text-content-sha1: 16890b5a00a695f2d26914a3cca2b74b1a45bcbe Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN (_( 0.53 Node-path: putty-wishlist/data/printer-list Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 79fcdd7bd6b097599d24aa6d3aaf7562 Text-delta-base-sha1: fe7a44daf72c0a19cb693a3f9329fa569d70dfe7 Text-content-length: 25 Text-content-md5: 1416a46f974adabaae189198a1238c29 Text-content-sha1: 2b4ba36310ef2813523da1bcfd9df3f586a17a76 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNw| #U" 0.5 Node-path: putty-wishlist/data/pscp-memory-leak Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9d43a73ef4cb3d53e31efd1ab8f75bd4 Text-delta-base-sha1: 4ae0a608a2db63c94247fc4a8339f24ae976824c Text-content-length: 24 Text-content-md5: 793818d101eb18a74e95881118098c17 Text-content-sha1: 21a9f4052c3708c237a772f0e7e4873612a79dba Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN&+XNX 0.53 Node-path: putty-wishlist/data/rsa-verify-failed Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 220bab07fbedd0abfc09f799b737e107 Text-delta-base-sha1: ca07ede0f5e4f0bcceb15b919c1250b4ad70400f Text-content-length: 26 Text-content-md5: 632f20aa4d41014f14dbdcd279d7798a Text-content-sha1: 828f17694ba502c01127b4e083cc957779122cb3 Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN j 0.53 Node-path: putty-wishlist/data/ssh.com-userauth-refused Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5cbec9a068b08748831fa7731882a2c1 Text-delta-base-sha1: fda5938424ac70bc4faa4a857093d5aec95ca4c0 Text-content-length: 26 Text-content-md5: dd4360a599a65f081b2ee38a91635dee Text-content-sha1: a5151a4d5a0844fd8f601513590124f051113afe Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNX] > 0.53 Node-path: putty-wishlist/data/ssh2-only Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fd544e89a4a1f1e0e913fc32947468d2 Text-delta-base-sha1: 1059ae471e1ebb0aee2d2b1105ef2511c578ad53 Text-content-length: 26 Text-content-md5: 69a33a1faf1826f480e495b056b7d04f Text-content-sha1: 4346443258a0a8a994505e1858a0498b60d372b5 Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNjo b 0.53 Node-path: putty-wishlist/data/win98-wheel Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ba68d7026937ea5dbac0f32c67190e38 Text-delta-base-sha1: a6f358e30d4ea02aff42765545ee3b3931a33443 Text-content-length: 24 Text-content-md5: 1a5af859ccb9e0c6990d1274d89a5cee Text-content-sha1: 5f0b4000b493ee5d7a2cdaca3118553beaeb5e23 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNsxoo 0.53 Revision-number: 2093 Prop-content-length: 162 Content-length: 162 K 7 svn:log V 62 This should fix the bug causing Alt-Shift to generate Escape. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-17T16:45:17.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 30485c3425c942195bf26f305c809678 Text-delta-base-sha1: 5fde656eb92c3c3899a4651ed910983bfed2c1ef Text-content-length: 55 Text-content-md5: abbc57ddd114bef6c7ca90f71bc26db5 Text-content-sha1: c27adbbcfd38b72fe4bbb6727f399d41c3c14f1c Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNr~ .1Aend = 0; else start = end Revision-number: 2094 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Results from trawling my archive of dev snapshots. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-10-17T16:49:25.000000Z PROPS-END Node-path: putty-wishlist/data/x11-proxy-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b37568b280f756398bb30a6a39e3a535 Text-delta-base-sha1: cdab71cd10619165992bcdf8974018be3199b056 Text-content-length: 107 Text-content-md5: 23cc21a5bcc57bb375c5e94060e1ebe9 Text-content-sha1: 0915a70afad8b78bf1d66c64138124c439dbf61a Content-length: 146 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNG T.I 2002-03-25

    This bug has been present more or less since proxy support was added. Revision-number: 2095 Prop-content-length: 236 Content-length: 236 K 8 svn:date V 27 2002-10-17T16:51:01.000000Z K 7 svn:log V 135 Make the shadow bold offset configurable, after discovering that 7x13 goes the other way to all other X fonts I've ever seen. (Arrgh.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 812df29c68cdc6ee7d08639eb73367d5 Text-delta-base-sha1: 8be3b713178354b472a89a0bb0aa34ffa5982939 Text-content-length: 47 Text-content-md5: 9d6514b822830082eba50fabcbd5c96f Text-content-sha1: dda8669d6cca3e4b976ecfd13eb5b6f7e802599b Content-length: 88 K 15 cvs2svn:cvs-rev V 5 1.152 PROPS-END SVN. q%o int shadowboldoffset Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b1c6deab730f881aa1b8876dc6170229 Text-delta-base-sha1: 6f23460557fc4bfb3e13f7155ad1d98efb143e76 Text-content-length: 162 Text-content-md5: 5b648fd1a8f981780118cd4d79358383 Text-content-sha1: 0a5d690a64c4e3fe32c1a3c4a0a4bfa6b9a7b704 Content-length: 202 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVN]i/AI'@pmwrite_setting_i(sesskey, "ShadowBoldOffset", cfg->shadowboldoffse gppi(sesskey, "ShadowBoldOffset", -1, &cfg->shadowboldoffset Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 406b8efccee9ffafe144151a962f2ba5 Text-delta-base-sha1: e56e734af43434a4ed58fdb75c1374830dd16fb4 Text-content-length: 570 Text-content-md5: c36e570d378c6a968efeccbc2de6503f Text-content-sha1: cd1a8e09a5ca37b57db7d20bf760d30ca3c8c71f Content-length: 609 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNt$ R 2BShadowBoldOffset\fP" This resource can be set to an integer; the default is -1. It specifies the offset at which text is overprinted when using "shadow bold" mode. The default (-1) means that the text will be printed in the normal place, and also one character to the left; this seems to work well for most X bitmap fonts, which have a blank line of pixels down the left-hand side. For some fonts, you may need to set this to +1, so that the text is overprinted one pixel to the right; for really large fonts, you may want to set it even higher Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: abbc57ddd114bef6c7ca90f71bc26db5 Text-delta-base-sha1: c27adbbcfd38b72fe4bbb6727f399d41c3c14f1c Text-content-length: 53 Text-content-md5: fc03867580a2c5e7390dcca36a9fa723 Text-content-sha1: 17dced76d14c03b4cb7d00185f6455206246225f Content-length: 93 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVN~bbqy+ cfg.shadowboldoffset Revision-number: 2096 Prop-content-length: 191 Content-length: 191 K 7 svn:log V 91 Oops - that fix wasn't _quite_ right, since it killed all non-function keys completely :-/ K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-17T16:58:24.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fc03867580a2c5e7390dcca36a9fa723 Text-delta-base-sha1: 17dced76d14c03b4cb7d00185f6455206246225f Text-content-length: 90 Text-content-md5: 21f2afdbf4dda6f3dd6ebc81348a267c Text-content-sha1: de59dc4017365c80e88cb8ce7ddded064359ac97 Content-length: 130 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNbv A AM { start = 0; if (end == 1) end = 0; } else start Revision-number: 2097 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2002-10-17T17:12:32.000000Z K 7 svn:log V 43 A bit more investigation -- link maps next K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/x11-proxy-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 23cc21a5bcc57bb375c5e94060e1ebe9 Text-delta-base-sha1: 0915a70afad8b78bf1d66c64138124c439dbf61a Text-content-length: 606 Text-content-md5: 093c799190d1739ea9f43deeb50a1748 Text-content-sha1: c685616ae26f3f9dc5d6d2852392ec988c52b359 Content-length: 645 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNfKK

    Appears intermittent. If PuTTY doesn't crash, I get the following reported in my terminal session:

    X connection to chiark:27.0 broken (explicit kill or server shutdown)

    If it does crash, I get something like:

    XIO:  fatal IO Error 104 (Connect reset by peer) on X server "chiark:27.0"
          after 0 requests (0 known processed) with 0 events remaining.

    Appears to be occur regardless of whether there's an X server to connect to. When I do have an X server running, it doesn't appear to see any traffic when attempting X forwarding through a proxy. Revision-number: 2098 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2002-10-17T17:15:30.000000Z K 7 svn:log V 26 *** empty log message *** K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/x11-proxy-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 093c799190d1739ea9f43deeb50a1748 Text-delta-base-sha1: c685616ae26f3f9dc5d6d2852392ec988c52b359 Text-content-length: 342 Text-content-md5: 931af16b15294f7398506ebd72f700ff Text-content-sha1: b50c769d932f1e80c00dc6ccd6df8d93b39fffd9 Content-length: 381 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNf)CfC

    PuTTY behaves as though the X connection is being opened then slammed shut:

    2002-10-17 18:07:24     Received X11 connect request
    2002-10-17 18:07:24     opening X11 forward connection succeeded
    2002-10-17 18:07:24     Opened X11 forward channel
    2002-10-17 18:07:24     Forwarded X11 connection terminated
    Revision-number: 2099 Prop-content-length: 309 Content-length: 309 K 8 svn:date V 27 2002-10-17T18:15:02.000000Z K 7 svn:log V 208 Hmm, looks like my proxy socket initialisation patch may have had some effect on this behaviour in the snapshot builds -- I can't get snapshots more recent than it to crash. The basic problem remains though. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/x11-proxy-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 931af16b15294f7398506ebd72f700ff Text-delta-base-sha1: b50c769d932f1e80c00dc6ccd6df8d93b39fffd9 Text-content-length: 168 Text-content-md5: fe1b21ca87b5c8a06b1988a013f040e8 Text-content-sha1: 34804a7bb87e3c20f5e5f21774be5038e8c200c0 Content-length: 207 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN)>)

    It looks like an unrelated checkin I made to the proxy code on 2002-10-11 may have cured the crashing, but the X forwarding still doesn't work. Revision-number: 2100 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:52.001599Z PROPS-END Revision-number: 2101 Prop-content-length: 138 Content-length: 138 K 7 svn:log V 38 Fix typo in man page. Thanks Richard. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-18T10:38:22.000000Z PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c36e570d378c6a968efeccbc2de6503f Text-delta-base-sha1: cd1a8e09a5ca37b57db7d20bf760d30ca3c8c71f Text-content-length: 25 Text-content-md5: 9daac159b1469bcfa1fb15e4eee74202 Text-content-sha1: ff743ea963f51b87ac76afbf109d5bbffbbe214f Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN$$ c?esb Revision-number: 2102 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2002-10-18T15:26:54.000000Z K 7 svn:log V 54 Reject unrecognised command-line options; thanks rjk. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 21f2afdbf4dda6f3dd6ebc81348a267c Text-delta-base-sha1: de59dc4017365c80e88cb8ce7ddded064359ac97 Text-content-length: 109 Text-content-md5: 5a57a0a82da25d11c6da45ee3bbb00a5 Text-content-sha1: 6b1a5314effb3472b0b93cea157db9b0516d52b2 Content-length: 149 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNvL SSj else { err = 1; fprintf(stderr, "pterm: unrecognized option '%s'\n", p); Revision-number: 2103 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2002-10-18T16:21:50.000000Z K 7 svn:log V 93 Add Glenn Maynard's contribution about Korean applications <20021018091958.GC13196@zewt.org> K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unicode-combining Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 70da371d9fe7035b403a908c07a29568 Text-delta-base-sha1: 2ffebc94b8202dbd77eec994af6804936c476029 Text-content-length: 349 Text-content-md5: d9e99772eba9f0c784130acdfd2763ac Text-content-sha1: 142034c6cf8d9fca1eb88c8bcaefa6320607aaf5 Content-length: 388 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNo9JoJ

    Glenn Maynard suggests that all this has a practical application:

    Somewhat more usefully, full combining support is needed for Korean. As I understand it, while there are a lot of precomposed Korean characters available, they don't *all* exist, so real Korean support needs real combining support.
    Revision-number: 2104 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:52.152642Z PROPS-END Revision-number: 2105 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:08:52.160731Z PROPS-END Revision-number: 2106 Prop-content-length: 178 Content-length: 178 K 7 svn:log V 78 ScrollOnKey wasn't working because I failed to set seen_key_event in pterm.c. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-20T12:44:29.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a57a0a82da25d11c6da45ee3bbb00a5 Text-delta-base-sha1: 6b1a5314effb3472b0b93cea157db9b0516d52b2 Text-content-length: 44 Text-content-md5: 616de2dfd30d74432d68452c29457240 Text-content-sha1: 0ce3da22e38088fc0c66c8d9e611ea346ee7e03b Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNLa 41seen_key_event = 1 Revision-number: 2107 Prop-content-length: 398 Content-length: 398 K 7 svn:log V 297 Implement Richard's really clever idea about bell overload mode: it's automatically deactivated by any keypress, so that command-line beeps from (e.g.) filename completion don't suddenly stop occurring, but it still provides a rapid response to an accidental spewing of a binary to your terminal. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-20T13:23:30.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ee663058b574c178558724b5d886b82b Text-delta-base-sha1: cc1f42f87f0334e5b83b45d514a1fad96a03f179 Text-content-length: 330 Text-content-md5: f35021653c1caf290f8adf41d921d2bd Text-content-sha1: 7f86148740a5b0145abd3d451986b659e0bc9bfb Content-length: 370 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVNxr,P5wv\versionid $Id: config.but,v 1.43 2002/10/20 13:23:30Bell overload mode is always deactivated by any keypress in the terminal. This means it can respond to large unexpected streams of data, but does not interfere with ordinary command-line activities that generate beeps (such as filename completion) Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9d6514b822830082eba50fabcbd5c96f Text-delta-base-sha1: dda8669d6cca3e4b976ecfd13eb5b6f7e802599b Text-content-length: 52 Text-content-md5: 89d2add5a74591845e51deb355af44c5 Text-content-sha1: 56e3e83f43cc8e4ccfaa8ac70474a3d25645ae96 Content-length: 93 K 15 cvs2svn:cvs-rev V 5 1.153 PROPS-END SVN.3WDr.void term_seen_key_event Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8f78de8112d98d4d5ddc0586a8d4663e Text-delta-base-sha1: 359513f01859caa25efb87a05ad739ffde9e880e Text-content-length: 1016 Text-content-md5: a14add756987fbd6ff65b15b9b63e97f Text-content-sha1: 894795139562b221d065050c0b9314f09ada970f Content-length: 1057 K 15 cvs2svn:cvs-rev V 5 1.105 PROPS-END SVNXkNl42-U_;seen_disp_event && cfg.scroll_on_disp) { disptop = 0; /* return to main screen */ seen_dispCalled from front end when a keypress occurs, to trigger * anything magical that needs to happen in that situation. */ void term_seen_key_event(void) { /* * On any keypress, clear the bell overload mechanism * completely, on the grounds that large numbers of * beeps coming from deliberate key action are likely * to be intended (e.g. beeps from filename completion * blocking repeatedly). */ beep_overloaded = FALSE; while (beephead) { struct beeptime *tmp = beephead; beephead = tmp->next; sfree(tmp); } beeptail = NULL; nbeeps = 0; /* * Reset the scrollback on keypress, if we're doing that. */ if (cfg.scroll_on_key) { disptop = 0; /* return to main screen */ seen_disp_event = 1 && len > 0) { wchar_t *p, *q; term_seen_key_event(); /* pasted data counts */ Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9daac159b1469bcfa1fb15e4eee74202 Text-delta-base-sha1: ff743ea963f51b87ac76afbf109d5bbffbbe214f Text-content-length: 274 Text-content-md5: 32b9a1464b838b25e638e945c261a5a6 Text-content-sha1: 446e3cfd3b92cec09c8aa8a0532e7fb19d1e22dc Content-length: 313 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN$ x~x(| Bell overload mode is always deactivated by any keypress in the terminal. This means it can respond to large unexpected streams of data, but does not interfere with ordinary command-line activities that generate beeps (such as filename completion) Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 616de2dfd30d74432d68452c29457240 Text-delta-base-sha1: 0ce3da22e38088fc0c66c8d9e611ea346ee7e03b Text-content-length: 47 Text-content-md5: 2e3b21a6b1d77c0548c02fdb5366ec13 Text-content-sha1: 0e5c8b6e4487d8dae0bc72135cfb26728a11d168 Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNad 4Fterm_seen_key_event() Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 928a420a5df9a335836fc70e4a94f9cd Text-delta-base-sha1: 44688628e662642ce2a8f98c1baba0eb4ca8c295 Text-content-length: 625 Text-content-md5: 38a714cac2b9cb76892e49e28d82ad59 Text-content-sha1: cc0961bf201b55c651da07af9b51dff8055179d8 Content-length: 666 K 15 cvs2svn:cvs-rev V 5 1.206 PROPS-END SVNNe~DwlO ^*F+9ipV{oyeterm_seen_key_event();term_seen_key_event(); for (i = 0; i < n; i += 2) { luni_send((unsigned short *)(buff+i), 1, 1); }term_seen_key_event(); lpage_send(kbd_codepage, buf, 2, 1); } else { char c = (unsigned char) wParam; term_seen_key_event()term_seen_key_event()term_seen_key_event()term_seen_key_event()term_seen_key_event(); ldisc_send(&ch, 1, 1); } alt_sum = 0; } else term_seen_key_event();term_seen_key_event(term_seen_key_event()`"`IP, TRUE, 0); if (OpenClipboa Revision-number: 2108 Prop-content-length: 253 Content-length: 253 K 8 svn:date V 27 2002-10-21T22:59:14.000000Z K 7 svn:log V 152 VT100 line drawing characters should only happen between 0x5F and 0x7E, not everywhere else. Silly me thought nobody would bother to depend on this :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 87d9aa529e8f34c8bc6441a166e76692 Text-delta-base-sha1: ece9a9535d2f7916122cf935957a58ae07fe4557 Text-content-length: 68 Text-content-md5: f0dcd68ae0ed1882c64765e06b616e85 Text-content-sha1: 142c5a3359372e5afc8f412279af44d150d5381c Content-length: 107 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN}4i >= 0x5F && i < 0x7F) ? ((i+1) & 0x1F) : i; } } Revision-number: 2109 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2002-10-21T23:00:18.000000Z K 7 svn:log V 121 Don't bother closing fds 0-2 before dup2ing over them; there's no need, and it means we always have a valid open stderr. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d178394cdff64b2c2c6b138a8ae14a9a Text-delta-base-sha1: 7068ffe502b99736ed6ad8ecbd2944d4c5fdcc47 Text-content-length: 20 Text-content-md5: 339e2ba073fee84bfdd9bb542e41ddb7 Text-content-sha1: 1a2f5bd0145cafcc2ab631f7f35f5c3af9c5e677 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNp [6 Revision-number: 2110 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2002-10-21T23:01:34.000000Z K 7 svn:log V 112 Make sure SIGINT and SIGQUIT haven't been nobbled in our child process by weird POSIX-required shell behaviour. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 339e2ba073fee84bfdd9bb542e41ddb7 Text-delta-base-sha1: 1a2f5bd0145cafcc2ab631f7f35f5c3af9c5e677 Text-content-length: 265 Text-content-md5: 0a644fd7469279e7850fa3e30b43fd8b Text-content-sha1: a7c62ec031e7e44e06be0f36e988c2075d68aa26 Content-length: 305 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNpc q~qt|/* * SIGINT and SIGQUIT may have been set to ignored by our * parent, particularly by things like sh -c 'pterm &' and * some window managers. Reverse this for our child process. */ signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); Revision-number: 2111 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2002-10-22T09:40:38.000000Z K 7 svn:log V 56 Justin Bradford's patch for increased proxy robustness. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f35021653c1caf290f8adf41d921d2bd Text-delta-base-sha1: 7f86148740a5b0145abd3d451986b659e0bc9bfb Text-content-length: 826 Text-content-md5: bac1d629ca9d756658d8f50d2b63e257 Text-content-sha1: 2141fed1aec06e2e83373354b630cde7841dc2ab Content-length: 866 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVNrz65sZlV\versionid $Id: config.but,v 1.44 2002/10/22 09:40:38You can specify a way to include a username and password in the Telnet proxy command (see \k{config-proxy-command})he strings \c{%user} and \c{%pass} will be replaced by the proxy username and password you specify. To get a literal \c{%} sign, enter \c{%%}. If the Telnet proxy server prompts for a username and password before commands can be sent, you can use a command such as: \c %user\\n%pass\\nconnect %host %port\\n This will send your username and password as the first two lines to the proxy, followed by a command to connect to the desired host and port. Note that if you do not include the \c{%user} or \c{%pass} tokens in the Telnet command, then the \q{Username} and \q{Password} configuration fields will be ignored Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f8cd9b98f1aff279aa7a4b5b0404a9fe Text-delta-base-sha1: 016d1a176c00fc38b8440c505cc4bdcb1f8b6c50 Text-content-length: 2264 Text-content-md5: 78f9291ede28040f8186fce79aaccf05 Text-content-sha1: e629d5338655fde5f733288f9e6d1725ff5be741 Content-length: 2303 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNLbhQZ`c~[+ +0i ws{|Qstate = PROXY_STATE_ACTIVE; /* we want to ignore new receive events until we have sent * all of our buffered receive data. */ sk_set_frozen(p->sub_socket, 1); /* how many bytes of output have we buffered? */ output_before = bufchain_size(&p->pending_oob_output_data) + bufchain_size(&p->pending_output_data); /* and keep track of how many bytes do not get sent. */ output_after = 0; output_after += output_after += /* if we managed to send any data, let the higher levels know. */ if (output_after < output_before) plug_sent(p->plug, output_afterif the backend wanted the socket unfrozen, try to unfreeze. * our set_frozen handler will flush buffered receive data before * unfreezing the actual underlying socket. */ if (!p->freeze) sk_set_frozen((Socket)p, 0 /* handle any remaining buffered recv data first */ if (bufchain_size(&ps->pending_input_data) > 0) { ps->freeze = is_frozen; /* loop while we still have buffered data, and while we are * unfrozen. the plug_receive call in the loop could result * in a call back into this function refreezing the socket, * so we have to check each time. */ while (!ps->freeze && bufchain_size(&ps->pending_input_data) > 0) { char * data; int len; bufchain_prefix(&ps->pending_input_data, &data, &len); plug_receive(ps->plug, 0, data, len); bufchain_consume(&ps->pending_input_data, len); } /* if we're still frozen, we'll have to wait for another * call from the backend to finish unbuffering the data. */ if (ps->freeze) return; } ret->negotiate = NULL; %port, %user, and %pass, %user, %pass. * anything else, we just send unescaped (including the %). else if (strnicmp(cfg.proxy_telnet_command + eo, "user", 4) == 0) { sk_write(p->sub_socket, cfg.proxy_username, strlen(cfg.proxy_username)); eo += 4; } else if (strnicmp(cfg.proxy_telnet_command + eo, "pass", 4) == 0) { sk_write(p->sub_socket, cfg.proxy_password, strlen(cfg.proxy_password)); eo += 4; } Node-path: putty/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 61dca1484daf2da030b7757de1df2144 Text-delta-base-sha1: a9562f104aaade3c2e8e395486ad38975281c71f Text-content-length: 34 Text-content-md5: ac773abd7bdb090758c5793bf9405e29 Text-content-sha1: 5986caff82458c4c47dac26555142682b5388f46 Content-length: 73 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN$ IE_, SOCKS 4 & 5 Revision-number: 2112 Prop-content-length: 404 Content-length: 404 K 8 svn:date V 27 2002-10-22T10:31:23.000000Z K 7 svn:log V 303 Thanks to Richard B for pointing out that xterm has its own variants of the alternate-screen and save-cursor control sequences, with subtly different semantics and entertaining interactions with the usual ones. No thanks to xterm for doing so in the first place :-( This checkin should sort it all out. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a14add756987fbd6ff65b15b9b63e97f Text-delta-base-sha1: 894795139562b221d065050c0b9314f09ada970f Text-content-length: 2328 Text-content-md5: 3b399d09d96728dee26c86a36e55abfa Text-content-sha1: 0e311c4d0acca66983a4803a5015f975a4572eb6 Content-length: 2369 K 15 cvs2svn:cvs-rev V 5 1.106 PROPS-END SVNkzL;MN8,R2L#cols >> 8; b[7] = term->cols & 0xFF; b[4] = term->rows >> 8; b[5] = term-> Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9a5bcd239d49e57a11a39d5292b50d67 Text-delta-base-sha1: d21096007496f14cd38eed2b94c0da20344ad0d2 Text-content-length: 52 Text-content-md5: 1e53c713c06369ff794619310aaab0c4 Text-content-sha1: c1baa849cbf9f021494159b57713b8c91c57dfff Content-length: 92 K 15 cvs2svn:cvs-rev V 4 1.91 PROPS-END SVNTjfRvoid *frontend, NULL, Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 19fecc110ec5a9178fb6a0c93507ffda Text-delta-base-sha1: abe635daf2e38b5afbd7eedeb86e567eb4d1b4b4 Text-content-length: 626 Text-content-md5: 734d02c333ff76afbbbd6167b6a08fd0 Text-content-sha1: b006cb9ab06ce3281984b20b78c47f2f2220eb1a Content-length: 667 K 15 cvs2svn:cvs-rev V 5 1.222 PROPS-END SVN'fBt(,T.j|erminalvoid *frontendfrontend, term ? term->rows : 24, PKT_INT, term ? term->cols : 80frontend, 1=3ltC J;i~e, */ static void ssh2_mkkey(Bignum K, char *H, char *sessid, char chr, char *keyspace) { SHA_Stterm ? term->cols : 80); ssh2_pkt_adduint32(term ? term->rows : 24frontend, void *frontend_handle, frontend = frontend_handle;!term) return; if (ssh_version == 1) { send_packet(SSH1_CMSG_WINDOW_SIZE, PKT_INT, term->rows, PKT_INT, term->term->cols); ssh2_pkt_adduint32(term-> Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ca124ed3f152e551824a5746e9b1922 Text-delta-base-sha1: 1efebc77cb92c2229f2325c4587b8e9765886562 Text-content-length: 691 Text-content-md5: 0501f517188035136578472d46db1b4c Text-content-sha1: 6b6f65c937ff6ed5a027303c8c23b24871b34f57 Content-length: 731 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN HaDPB0yrsk^Xr_J_)aXn/dr^Vb4Zo]\#include "terminal.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif static Socket s = NULL; static void *frontendfrontend, _______LEVEL; } break; case SEENWILL: proc_rec_opt(WILL, c); telnet_state = TOP__LEVEL; break; case SEENDO: proc_rec_opt(DO, c); telnet_state = TOP_LEVEL; break; case SEENDONT: proc_rec_opt(DONT, c); telnet_state = TOP__void *frontend_handle, frontend = frontend_handletermterm->cols >> 8; b[4] = term->cols & 0xFF; b[5] = term->rows >> 8; b[6] = term-> Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3b399d09d96728dee26c86a36e55abfa Text-delta-base-sha1: 0e311c4d0acca66983a4803a5015f975a4572eb6 Text-content-length: 49288 Text-content-md5: 91d9d33829c2f14bebbb5aba75f6e7b5 Text-content-sha1: 05ac16559020c015ea31361a67de0725dc04aa54 Content-length: 49329 K 15 cvs2svn:cvs-rev V 5 1.107 PROPS-END SVNz+BC %JFo(jIrA;gQ@A;]9x f7:t,D=pZ,2dpD De0R)*{D^7f3Ur'Z^}Mc<[Zh9_]nQ=SRv )Qz`*9+ :Y36Yh}b/7Fw>:x%x)Ud}zi~CU t!plR/d+DK=di$vLYG)ZpJiXE`OV.B4oSL}m_K=Ktd9vmu^pzJ~D*EQ]Zcols+1) + (p1).x - (p2).x#define incpos(p) ( (p).x == term->cols ? ((p).x = 0, (p).y++, 1) : ((p).x++, 0) ) #define decpos(p) ( (p).x == 0 ? ((p).x = term->cols, (p).y--, 1) : ((p).x--, 0) )term->compatibility_level) == 0 ) { \ term->termstate=TOPLEVEL; \ break; \ } #define compatibility2(x,y) \ if ( ((CL_##x|CL_##y)&term->compatibility_level) == 0 ) { \ term->termstate=TOPLEVEL; \ break; \ } #define has_compat(x) ( ((CL_##x)&term->compatibility_level) != 0 ) #define sel_nl_sz (sizeof(sel_nl)/sizeof(wchar_t)) const wchar_t sel_nl[] = SEL_NL; /* * Internal prototypes. */ static void do_paint(Terminal *, Context, int); static void erase_lots(Terminal *, int, int, int); static void swap_screen(Terminal *, int, int, int); static void update_sbar(Terminal *); static void deselect(Terminal *); static void term_print_finish(Terminal *Terminal *term, term->screen; treeindex = y; } else { whichtree = term->scrollback; treeindex = y + count234(term->term->term,x,__LINE__) /* * Set up power-on settings for the terminal. */ static void power_on(Terminal *term) { term->curs.x = term->curs.y = 0; term->alt_x = term->alt_y = 0; term->savecurs.x = term->savecurs.y = 0; term->alt_t = term->marg_t = 0; if (term->rows != -1) term->alt_b = term->marg_b = term->rows - 1; else term->alt_b = term->marg_b = 0; if (term->cols != -1) { int i; for (i = 0; i < term->cols; i++) term->tabs[i] = (i % 8 == 0 ? TRUE : FALSE); } term->alt_om = term->dec_om = cfg.dec_om; term->alt_wnext = term->wrapnext = term->alt_ins = term->insert = FALSE; term->alt_wrap = term->wrap = cfg.wrap_mode; term->alt_cset = term->cset = 0; term->alt_utf = term->utf = 0; term->alt_sco_acs = term->sco_acs = 0; term->cset_attr[0] = term->cset_attr[1] = ATTR_ASCII; term->rvideo = 0; term->in_vbell = FALSE; term->cursor_on = 1; term->big_cursor = 0; term->save_attr = term->curr_attr = ATTR_DEFAULT; term->term_editing = term->term_echoing = FALSE; term->app_cursor_keys = cfg.app_cursor; term->app_keypad_keys = cfg.app_keypad; term->use_bce = cfg.bce; term->blink_is_real = cfg.blinktext; term->erase_char = ERASE_CHAR; term->alt_which = 0; term_print_finish(term); { int i; for (i = 0; i < 256; i++) term->wordness[i] = cfg.wordness[i]; } if (term->screen) { swap_screen(term, 1, FALSE, FALSE); erase_lots(term, FALSE, TRUE, TRUE); swap_screen(term, 0, FALSE, FALSE); erase_lots(term, FALSE, TRUE, TRUE); } } /* * Force a screen update. */ void term_update(Terminal *termterm->seen_disp_event; if (term->seen_disp_event && cfg.scroll_on_disp) { term->disptop = 0; /* return to main screen */ term->seen_disp_event = 0; need_sbar_update = TRUE; } if (need_sbar_update) update_sbar(term); do_paint(term, ctx, TRUE); sys_cursor(term->curs.x, term->curs.y - term->Terminal *termterm->beep_overloaded = FALSE; while (term->beephead) { struct beeptime *tmp = term->beephead; term->beephead = tmp->next; sfree(tmp); } term->beeptail = NULL; term->term->disptop = 0; /* return to main screen */ term->Terminal *term) { power_on(term); ldisc_send(NULL, 0, 0); /* cause ldisc to notice changes */ fix_cpos; term->disptop = 0; deselect(term); term_update(termTerminal *term) { if (cfg.no_alt_screen) swap_screen(term, 0, FALSE, FALSE); if (cfg.no_mouse_rep) { term->xterm_mouse = 0; set_raw_mouse_mode(0); } if (cfg.no_remote_charset) { term->cset_attr[0] = term->cset_attr[1] = ATTR_ASCII; term->sco_acs = term->alt_sco_acs = 0; term->utf = 0; } if (!*cfg.printer) { term_print_finish(term); } } /* * Clear the scrollback. */ void term_clrsb(Terminal *term) { unsigned long *line; term->disptop = 0; while ((line = delpos234(term->scrollback, 0)) != NULL) { sfree(line); } update_sbar(term); } /* * Initialise the terminal. */ Terminal *term_init(void) { Terminal *term; /* * Allocate a new Terminal structure and initialise the fields * that need it. */ term = smalloc(sizeof(Terminal)); term->compatibility_level = TM_PUTTY; strcpy(term->id_string, "\033[?6c"); term->last_blink = term->last_tblink = 0; term->paste_buffer = NULL; term->last_paste = 0; bufchain_init(&term->inbuf); bufchain_init(&term->printer_buf); term->screen = term->alt_screen = term->scrollback = NULL; term->disptop = 0; term->disptext = term->dispcurs = NULL; term->tabs = NULL; deselect(term); term->rows = term->cols = -1; power_on(term); term->beephead = term->beeptail = NULL; term->nbeeps = 0; term->lastbeep = FALSE; term->beep_overloaded = FALSE; return termTerminal *term, term->alt_which; if (newrows == term->rows && newcols == term->cols && newsavelines == term->savelines) return; /* nothing to do */ deselect(term); swap_screen(term, 0, FALSE, FALSE); term->alt_t = term->marg_t = 0; term->alt_b = term->marg_b = newrows - 1; if (term->rows == -1) { term->scrollback = newtree234(NULL); term->screen = newtree234(NULL); term->term->scrollback); /* Do this loop to expand the screen if newrows > rows */ for (i = term->rows; i < newrows; i++) { if (sblen > 0) { line = delpos234(term->term->term->rows; i++) { line = delpos234(term->screen, 0); addpos234(term->scrollback, line, sblen++); } assert(count234(term->screen) == newrows); while (sblen > newsavelines) { line = delpos234(term->scrollback, 0); sfree(line); sblen--; } assert(count234(term->scrollback) <= newsavelines); term->term->disptext); term->disptext = newdisp; term->term->erase_char; addpos234(newalt, line, i); } if (term->alt_screen) { while (NULL != (line = delpos234(term->alt_screen, 0))) sfree(line); freetree234(term->alt_screen); } term->alt_screen = newalt; term->tabs = srealloc(term->tabs, newcols * sizeof(*term->tabs)); { int i; for (i = (term->cols > 0 ? term->cols : 0); i < newcols; i++) term->tabs[i] = (i % 8 == 0 ? TRUE : FALSE); } if (term->rows > 0) term->curs.y += newrows - term->rows; if (term->curs.y < 0) term->curs.y = 0; if (term->curs.y >= newrows) term->curs.y = newrows - 1; if (term->curs.x >= newcols) term->curs.x = newcols - 1; term->alt_x = term->alt_y = 0; term->wrapnext = term->alt_wnext = FALSE; term->rows = newrows; term->cols = newcols; term->savelines = newsavelines; fix_cpos; swap_screen(term, save_alt_which, FALSE, FALSE); update_sbar(term); term_update(termTerminal *term, term->alt_which) { term->alt_which = which; ttr = term->alt_screen; term->alt_screen = term->screen; term->screen = ttr; t = term->curs.x; if (!reset && !keep_cur_pos) term->curs.x = term->alt_x; term->alt_x = t; t = term->curs.y; if (!reset && !keep_cur_pos) term->curs.y = term->alt_y; term->alt_y = t; t = term->marg_t; if (!reset) term->marg_t = term->alt_t; term->alt_t = t; t = term->marg_b; if (!reset) term->marg_b = term->alt_b; term->alt_b = t; t = term->dec_om; if (!reset) term->dec_om = term->alt_om; term->alt_om = t; t = term->wrap; if (!reset) term->wrap = term->alt_wrap; term->alt_wrap = t; t = term->wrapnext; if (!reset) term->wrapnext = term->alt_wnext; term->alt_wnext = t; t = term->insert; if (!reset) term->insert = term->alt_ins; term->alt_ins = t; t = term->cset; if (!reset) term->cset = term->alt_cset; term->alt_cset = t; t = term->utf; if (!reset) term->utf = term->alt_utf; term->alt_utf = t; t = term->sco_acs; if (!reset) term->sco_acs = term->alt_sco_acs; term->alt_sco_acs = t; } if (reset && term->term, term->screen) fix_cpos; } /* * Update the scroll bar. */ static void update_sbar(Terminal *term) { int nscroll; nscroll = count234(term->scrollback); set_sbar(nscroll + term->rows, nscroll + term->disptop, term->Terminal *term, pos from, pos to) { if (poslt(from, term->selend) && poslt(term->selstart, to)) deselect(termTerminal *term, int topline, int botline, int lines, int sb) { unsigned long *line, *line2; int i, seltop; if (topline != 0 || term->term->screen, botline); line = resizeline(line, term->cols); for (i = 0; i < term->cols; i++) line[i + 1] = term->erase_char; line[term->cols + 1] = 0; addpos234(term->screen, line, topline); if (term->selstart.y >= topline && term->selstart.y <= botline) { term->selstart.y++; if (term->selstart.y > botline) { term->selstart.y = botline; term->selstart.x = 0; } } if (term->selend.y >= topline && term->selend.y <= botline) { term->selend.y++; if (term->selend.y > botline) { term->selend.y = botline; term->term->screen, topline); if (sb && term->savelines > 0) { int sblen = count234(term->term->savelines) { sblen--, line2 = delpos234(term->scrollback, 0); } else { line2 = smalloc(TSIZE * (term->cols + 2)); line2[0] = term->cols; } addpos234(term->term->disptop > -term->savelines && term->disptop < 0) term->disptop--; } line = resizeline(line, term->cols); for (i = 0; i < term->cols; i++) line[i + 1] = term->erase_char; line[term->cols + 1] = 0; addpos234(term->term->savelines : topline; if (term->selstart.y >= seltop && term->selstart.y <= botline) { term->selstart.y--; if (term->selstart.y < seltop) { term->selstart.y = seltop; term->selstart.x = 0; } } if (term->selend.y >= seltop && term->selend.y <= botline) { term->selend.y--; if (term->selend.y < seltop) { term->selend.y = seltop; term->selend.x = 0; } } if (term->selanchor.y >= seltop && term->selanchor.y <= botline) { term->selanchor.y--; if (term->selanchor.y < seltop) { term->selanchor.y = seltop; term->Terminal *term, int x, int y, int marg_clip) { if (x < 0) x = 0; if (x >= term->cols) x = term->cols - 1; if (marg_clip) { if ((term->curs.y >= term->marg_t || marg_clip == 2) && y < term->marg_t) y = term->marg_t; if ((term->curs.y <= term->marg_b || marg_clip == 2) && y > term->marg_b) y = term->marg_b; } if (y < 0) y = 0; if (y >= term->rows) y = term->rows - 1; term->curs.x = x; term->curs.y = y; fix_cpos; term->wrapnext = FALSE; } /* * Save or restore the cursor and SGR mode. */ static void save_cursor(Terminal *term, int save) { if (save) { term->savecurs = term->curs; term->save_attr = term->curr_attr; term->save_cset = term->cset; term->save_utf = term->utf; term->save_wnext = term->wrapnext; term->save_csattr = term->cset_attr[term->cset]; term->save_sco_acs = term->sco_acs; } else { term->curs = term->savecurs; /* Make sure the window hasn't shrunk since the save */ if (term->curs.x >= term->cols) term->curs.x = term->cols - 1; if (term->curs.y >= term->rows) term->curs.y = term->rows - 1; term->curr_attr = term->save_attr; term->cset = term->save_cset; term->utf = term->save_utf; term->wrapnext = term->term->wrapnext && term->curs.x < term->cols-1) term->wrapnext = FALSE; term->cset_attr[term->cset] = term->save_csattr; term->sco_acs = term->save_sco_acs; fix_cpos; if (term->use_bce) term->erase_char = (' ' | ATTR_ASCII | (term->curr_attr & Terminal *term, term->curs.y; start.x = 0; end.y = term->term->rows; end.x = 0; erase_lattr = TRUE; } if (!from_begin) { start = term->curs; } if (!to_end) { end = term->curs; incpos(end); } check_selection(term, term->rows) term_invalidate(term); ldata = lineptr(start.y); while (poslt(start, end)) { if (start.x == term->cols && !erase_lattr) ldata[start.x] &= ~LATTR_WRAPPED; else ldata[start.x] = term->erase_char; if (incpos(start) && start.y < term->Terminal *term, term->cols - term->curs.x) n = term->cols - term->curs.x; m = term->cols - term->curs.x - n; cursplus.y = term->curs.y; cursplus.x = term->curs.x + n; check_selection(term, term->curs, cursplus); ldata = lineptr(term->curs.y); if (dir < 0) { memmove(ldata + term->curs.x, ldata + term->curs.x + n, m * TSIZE); while (n--) ldata[term->curs.x + m++] = term->erase_char; } else { memmove(ldata + term->curs.x + n, ldata + term->curs.x, m * TSIZE); while (n--) ldata[term->curs.x + n] = term->Terminal *term, term->app_cursor_keys = state; break; case 2: /* VT52 mode */ term->vt52_mode = !state; if (term->vt52_mode) { term->blink_is_real = FALSE; term->vt52_bold = FALSE; } else { term->term); if (!cfg.no_remote_resize) request_resize(state ? 132 : 80, term->rows); term->term->vbell_startpoint >= VBELL_TIMEOUT) term->in_vbell = FALSE; if (term->rvideo && !state && /* we're turning it off... */ (ticks - term->rvbell_startpoint) < VBELL_TIMEOUT) {/*...soonterm->in_vbell || (term->rvbell_startpoint - term->vbell_startpoint < VBELL_TIMEOUT)) term->vbell_startpoint = term->rvbell_startpoint; term->in_vbell = TRUE; /* may clear rvideo but set in_vbell */ } else if (!term->rvideo && state) { /* This is an ON, so we notice the time and save it. */ term->rvbell_startpoint = ticks; } term->rvideo = state; term->seen_disp_event = TRUE; if (state) term_update(term); break; case 6: /* DEC origin mode */ term->dec_om = state; break; case 7: /* auto wrap */ term->wrap = state; break; case 8: /* auto key repeat */ term->repeat_off = !state; break; case 10: /* set local edit mode */ term->term->cursor_on = state; term->term); swap_screen(term, cfg.no_alt_screen ? 0 : state, FALSE, FALSE); term->disptop = 0; break; case 1000: /* xterm mouse 1 */ term->term->term); swap_screen(term, cfg.no_alt_screen ? 0 : state, TRUE, TRUE); term->term, state); if (!state) term->term, state); if (!state) term->seen_disp_event = TRUE; compatibility(OTHER); deselect(term); swap_screen(term, cfg.no_alt_screen ? 0 : state, TRUE, FALSE); if (!state) save_cursor(term, state); term->term->insert = state; break; case 12: /* set echo mode */ term->term->term->Terminal *term) { if (term->osc_w) { while (term->osc_strlen--) term->wordness[(unsigned char) term->osc_string[term->osc_strlen]] = term->esc_args[0]; } else { term->osc_string[term->osc_strlen] = '\0'; switch (term->term->osc_string); if (term->term->Terminal *term) { bufchain_clear(&term->printer_buf); term->Terminal *term) { void *data; int len; int size; while ((size = bufchain_size(&term->printer_buf)) > 5) { bufchain_prefix(&term->printer_buf, &data, &len); if (len > size-5) len = size-5; printer_job_data(term->print_job, data, len); bufchain_consume(&term->printer_buf, len); } } static void term_print_finish(Terminal *term) { void *data; int len, size; char c; if (!term->printing && !term->only_printing) return; /* we need do nothing */ term_print_flush(term); while ((size = bufchain_size(&term->printer_buf)) > 0) { bufchain_prefix(&term->term->printer_buf, size); break; } else { printer_job_data(term->print_job, &c, 1); bufchain_consume(&term->printer_buf, 1); } } printer_finish_job(term->print_job); term->print_job = NULL; term->printing = term->Terminal *termterm->term->term->term->printing) { bufchain_add(&term->term->only_printing) { if (c == '\033') term->print_state = 1; else if (c == (unsigned char)'\233') term->print_state = 2; else if (c == '[' && term->print_state == 1) term->print_state = 2; else if (c == '4' && term->print_state == 2) term->print_state = 3; else if (c == 'i' && term->print_state == 3) term->print_state = 4; else term->print_state = 0; if (term->print_state == 4) { term_print_finish(term->termstate == TOPLEVEL) { if (in_utf(term)) switch (term->term->utf_size = term->utf_state = 1; term->utf_char = (c & 0x1f); } else if ((c & 0xf0) == 0xe0) { term->utf_size = term->utf_state = 2; term->utf_char = (c & 0x0f); } else if ((c & 0xf8) == 0xf0) { term->utf_size = term->utf_state = 3; term->utf_char = (c & 0x07); } else if ((c & 0xfc) == 0xf8) { term->utf_size = term->utf_state = 4; term->utf_char = (c & 0x03); } else if ((c & 0xfe) == 0xfc) { term->utf_size = term->utf_state = 5; term->term->utf_state = 0; break; } term->utf_char = (term->utf_char << 6) | (c & 0x3f); if (--term->utf_state) continue; c = term->utf_char; /* Is somebody trying to be evil! */ if (c < 0x80 || (c < 0x800 && term->utf_size >= 2) || (c < 0x10000 && term->utf_size >= 3) || (c < 0x200000 && term->utf_size >= 4) || (c < 0x4000000 && term->term->sco_acs && (c!='\033' && c!='\n' && c!='\r' && c!='\b')) { if (term->term->cset_attr[term->->termstate < DO_CTRLS && !term->vt52_mode && has_compat(VT220)) { term->termstate = SEEN_ESC; term->->termstate < DO_CTRLS && has_compat(OTHER)) { if (term->curs.x && !term->wrapnext) term->curs.x--; term->term->cpos = (' ' | term->->term->term->beephead) term->beephead = newbeep; else term->beeptail->next = newbeep; term->beeptail = newbeep; term->term->beephead && term->term->beephead; term->beephead = tmp->next; sfree(tmp); if (!term->beephead) term->beeptail = NULL; term->nbeeps--; } if (cfg.bellovl && term->beep_overloaded && ticks - term->term->beep_overloaded = FALSE; } else if (cfg.bellovl && !term->beep_overloaded && term->term->beep_overloaded = TRUE; } term->term->beep_overloaded) { if (cfg.beep == BELL_VISUAL) { term->in_vbell = TRUE; term->vbell_startpoint = ticks; term_update(term); } else beep(cfg.beep); } term->disptop = 0; } break; case '\b': if (term->curs.x == 0 && (term->curs.y == 0 || term->wrap == 0)) /* do nothing */ ; else if (term->curs.x == 0 && term->curs.y > 0) term->curs.x = term->cols - 1, term->curs.y--; else if (term->wrapnext) term->wrapnext = FALSE; else term->curs.x--; fix_cpos; term->seen_disp_event = TRUE; break; case '\016': compatibility(VT100); term->cset = 1; break; case '\017': compatibility(VT100); term->cset = 0; break; case '\033': if (term->vt52_mode) term->termstate = VT52_ESC; else { compatibility(ANSIMIN); term->termstate = SEEN_ESC; term->esc_query = FALSE; } break; case '\r': term->curs.x = 0; term->wrapnext = FALSE; fix_cpos; term->seen_disp_event = TRUE; term->014': if (has_compat(SCOANSI)) { move(term, 0, 0, 0); erase_lots(term, FALSE, FALSE, TRUE); term->disptop = 0; term->wrapnext = FALSE; term->seen_disp_event = 1; break; } case '\013': compatibility(VT100); case '\n': if (term->curs.y == term->marg_b) scroll(term, term->marg_t, term->marg_b, 1, TRUE); else if (term->curs.y < term->rows - 1) term->curs.y++; if (cfg.lfhascr) term->curs.x = 0; fix_cpos; term->wrapnext = FALSE; term->seen_disp_event = 1; term->term->curs; unsigned long *ldata = lineptr(term->curs.y); do { term->curs.x++; } while (term->curs.x < term->cols - 1 && !term->tabs[term->curs.x]); if ((ldata[term->cols] & LATTR_MODE) != LATTR_NORM) { if (term->curs.x >= term->cols / 2) term->curs.x = term->cols / 2 - 1; } else { if (term->curs.x >= term->cols) term->curs.x = term->cols - 1; } fix_cpos; check_selection(term, old_curs, term->curs); } term->seen_disp_event = TRUE; break; } } else switch (term->termstate) { case TOPLEVEL: /* Only graphic characters get this far; * ctrls are stripped above */ if (term->wrapnext && term->wrap) { term->cpos[1] |= LATTR_WRAPPED; if (term->curs.y == term->marg_b) scroll(term, term->marg_t, term->marg_b, 1, TRUE); else if (term->curs.y < term->rows - 1) term->curs.y++; term->curs.x = 0; fix_cpos; term->wrapnext = FALSE; } if (term->insert) insch(term, 1); if (term->selstate != NO_SELECTION) { pos cursplus = term->curs; incpos(cursplus); check_selection(term, term->term->cpos++ = c | term->curr_attr; if (++term->curs.x == term->cols) { *term->cpos |= LATTR_WRAPPED; if (term->curs.y == term->marg_b) scroll(term, term->marg_t, term->marg_b, 1, TRUE); else if (term->curs.y < term->rows - 1) term->curs.y++; term->curs.x = 0; fix_cpos; } *term->cpos++ = UCSWIDE | term->curr_attr; break; case 1: *term->cpos++ = c | term->curr_attr; break; default: continue; } } term->curs.x++; if (term->curs.x == term->cols) { term->cpos--; term->curs.x--; term->wrapnext = TRUE; if (term->wrap && term->vt52_mode) { term->cpos[1] |= LATTR_WRAPPED; if (term->curs.y == term->marg_b) scroll(term, term->marg_t, term->marg_b, 1, TRUE); else if (term->curs.y < term->rows - 1) term->curs.y++; term->curs.x = 0; fix_cpos; term->wrapnext = FALSE; } } term->term); term->term->esc_query) term->esc_query = -1; else term->esc_query = c; break; } term->termstate = TOPLEVEL; switch (ANSI(c, term->esc_query)) { case '[': /* enter CSI mode */ term->termstate = SEEN_CSI; term->esc_nargs = 1; term->esc_args[0] = ARG_DEFAULT; term->->termstate = SEEN_OSC; term->term, term, FALSE); term->seen_disp_event = TRUE; break; case '=': compatibility(VT100); term->term->term->curs.y == term->marg_b) scroll(term, term->marg_t, term->marg_b, 1, TRUE); else if (term->curs.y < term->rows - 1) term->curs.y++; fix_cpos; term->wrapnext = FALSE; term->term->curs.x = 0; if (term->curs.y == term->marg_b) scroll(term, term->marg_t, term->marg_b, 1, TRUE); else if (term->curs.y < term->rows - 1) term->curs.y++; fix_cpos; term->wrapnext = FALSE; term->term->curs.y == term->marg_t) scroll(term, term->marg_t, term->marg_b, -1, TRUE); else if (term->curs.y > 0) term->curs.y--; fix_cpos; term->wrapnext = FALSE; term->term->id_string, strlen(term->term); ldisc_send(NULL, 0, 0);/* cause ldisc to notice changes */ if (term->reset_132) { if (!cfg.no_remote_resize) request_resize(80, term->rows); term->reset_132 = 0; } fix_cpos; term->disptop = 0; term->seen_disp_event = TRUE; break; case 'H': /* set a tab */ compatibility(VT100); term->tabs[term->term->rows; i++) { ldata = lineptr(i); for (j = 0; j < term->cols; j++) ldata[j] = ATTR_DEFAULT | 'E'; ldata[term->cols] = 0; } term->disptop = 0; term->seen_disp_event = TRUE; scrtop.x = scrtop.y = 0; scrbot.x = 0; scrbot.y = term->rows; check_selection(term, term->term->curs.y); ldata[term->cols] &= ~LATTR_MODE; ldata[term->term->term->term->term->term->term->term->term->term->term->utf = 0; break; } break; case SEEN_CSI: term->term->esc_nargs <= ARGS_MAX) { if (term->esc_args[term->esc_nargs - 1] == ARG_DEFAULT) term->esc_args[term->esc_nargs - 1] = 0; term->esc_args[term->esc_nargs - 1] = 10 * term->esc_args[term->esc_nargs - 1] + c - '0'; } term->termstate = SEEN_CSI; } else if (c == ';') { if (++term->esc_nargs <= ARGS_MAX) term->esc_args[term->esc_nargs - 1] = ARG_DEFAULT; term->termstate = SEEN_CSI; } else if (c < '@') { if (term->esc_query) term->esc_query = -1; else if (c == '?') term->esc_query = TRUE; else term->esc_query = c; term->termstate = SEEN_CSI; } else switch (ANSI(c, term->esc_query)) { case 'A': /* move up N lines */ move(term, term->curs.x, term->curs.y - def(term->esc_args[0], 1), 1); term->term, term->curs.x, term->curs.y + def(term->esc_args[0], 1), 1); term->term, term->curs.x + def(term->esc_args[0], 1), term->curs.y, 1); term->seen_disp_event = TRUE; break; case 'D': /* move left N cols */ move(term, term->curs.x - def(term->esc_args[0], 1), term->curs.y, 1); term->term, 0, term->curs.y + def(term->esc_args[0], 1), 1); term->term, 0, term->curs.y - def(term->esc_args[0], 1), 1); term->term, def(term->esc_args[0], 1) - 1, term->curs.y, 0); term->seen_disp_event = TRUE; break; case 'd': /* set vertical posn */ compatibility(ANSI); move(term, term->curs.x, ((term->dec_om ? term->marg_t : 0) + def(term->esc_args[0], 1) - 1), (term->dec_om ? 2 : 0)); term->term->esc_nargs < 2) term->esc_args[1] = ARG_DEFAULT; move(term, def(term->esc_args[1], 1) - 1, ((term->dec_om ? term->marg_t : 0) + def(term->esc_args[0], 1) - 1), (term->dec_om ? 2 : 0)); term->term->esc_args[0], 0) + 1; if (i > 3) i = 0; erase_lots(term, FALSE, !!(i & 2), !!(i & 1)); } term->disptop = 0; term->term->esc_args[0], 0) + 1; if (i > 3) i = 0; erase_lots(term, TRUE, !!(i & 2), !!(i & 1)); } term->term->curs.y <= term->marg_b) scroll(term, term->curs.y, term->marg_b, -def(term->esc_args[0], 1), FALSE); fix_cpos; term->term->curs.y <= term->marg_b) scroll(term, term->curs.y, term->marg_b, def(term->esc_args[0], 1), TRUE); fix_cpos; term->term, def(term->esc_args[0], 1)); term->seen_disp_event = TRUE; break; case 'P': /* delete chars */ compatibility(VT102); insch(term, -def(term->esc_args[0], 1)); term->term->id_string, strlen(term->id_string), 0); break; case 'n': /* cursor position query */ if (term->esc_args[0] == 6) { char buf[32]; sprintf(buf, "\033[%d;%dR", term->curs.y + 1, term->curs.x + 1); ldisc_send(buf, strlen(buf), 0); } else if (term->term->esc_nargs; i++) toggle_mode(term, term->esc_args[i], term->term->esc_nargs != 1) break; if (term->esc_args[0] == 5 && *cfg.printer) { term->printing = TRUE; term->only_printing = !term->esc_query; term->print_state = 0; term_print_setup(term); } else if (term->esc_args[0] == 4 && term->printing) { term_print_finish(termterm->esc_nargs; i++) toggle_mode(term, term->esc_args[i], term->esc_query, FALSE); } break; case 'g': /* clear tabs */ compatibility(VT100); if (term->esc_nargs == 1) { if (term->esc_args[0] == 0) { term->tabs[term->curs.x] = FALSE; } else if (term->esc_args[0] == 3) { int i; for (i = 0; i < term->cols; i++) term->term->esc_nargs <= 2) { int top, bot; top = def(term->esc_args[0], 1) - 1; bot = (term->esc_nargs <= 1 || term->esc_args[1] == 0 ? term->rows : def(term->esc_args[1], term->rows)) - 1; if (bot >= term->rows) bot = term->term->marg_t = top; term->marg_b = bot; term-> * Origin mode - RDB */ term->curs.y = (term->dec_om ? term->marg_t : 0); fix_cpos; term-> * attribute, either underline or * reverse video depending on the * cursor type, this was selected by * CSI 7m. * * case 2: * This is sometimes DIM, eg on the * * terminal that has colour (obviously) * but the interaction between sgr0 and * the colours varies but is usually * related to the background colour * erase item. The interaction between * colour attributes and the mono ones * is also very implementation * dependent. * * The 39 and 49 attributes are likely * to be unimplemented. */ int i; for (i = 0; i < term->esc_nargs; i++) { switch (def(term->esc_args[i], 0)) { case 0: /* restore defaults */ term->curr_attr = ATTR_DEFAULT; break; case 1: /* enable bold */ compatibility(VT100AVO); term->term->term->term->term->term->term->sco_acs = 2; break; case 22: /* disable bold */ compatibility2(OTHER, VT220); term->term->term->term->term->curr_attr &= ~ATTR_FGMASK; term->curr_attr |= (term->esc_args[i] - 30)<curr_attr &= ~ATTR_FGMASK; term->term->curr_attr &= ~ATTR_BGMASK; term->curr_attr |= (term->esc_args[i] - 40)<curr_attr &= ~ATTR_BGMASK; term->curr_attr |= ATTR_DEFBG; break; } } if (term->use_bce) term->erase_char = (' ' | ATTR_ASCII | (term->curr_attr & (ATTR_FGMASK | term, TRUE); break; case 'u': /* restore cursor */ save_cursor(term, FALSE); term->term->esc_nargs <= 1 && (term->esc_args[0] < 1 || term->term->cols, def(term->esc_args[0], 24)); deselect(term); } else if (term->esc_nargs >= 1 && term->esc_args[0] >= 1 && term->esc_args[0] < 24) { compatibility(OTHER); switch (term->term->esc_nargs >= 3) { if (!cfg.no_remote_resize) move_window(def(term->esc_args[1], 0), def(term->term->esc_nargs >= 3) { if (!cfg.no_remote_resize) request_resize(def(term->esc_args[2], cfg.width), def(term->esc_args[1], cfg.height)); } break; case 9: if (term->esc_nargs >= 2) set_zoomed(term->esc_args[1] ? term->rows, term->term, term->marg_t, term->marg_b, def(term->esc_args[0], 1), TRUE); fix_cpos; term->wrapnext = FALSE; term->term, term->marg_t, term->marg_b, -def(term->esc_args[0], 1), TRUE); fix_cpos; term->wrapnext = FALSE; term->term->esc_nargs == 1 && term->esc_args[0] > 0) { if (!cfg.no_remote_resize) request_resize(term->cols, def(term->esc_args[0], cfg.height)); deselect(termterm->term->esc_args[0], cfg.width), term->rows); deselect(termterm->esc_args[0], 1); pos cursplus; unsigned long *p = term->cpos; if (n > term->cols - term->curs.x) n = term->cols - term->curs.x; cursplus = term->curs; cursplus.x += n; check_selection(term, term->curs, cursplus); while (n--) *p++ = term->erase_char; term->term->term->esc_args[0], 1); pos old_curs = term->curs; for(;i>0 && term->curs.x>0; i--) { do { term->curs.x--; } while (term->curs.x >0 && !term->tabs[term->curs.x]); } fix_cpos; check_selection(term, old_curs, term->term->use_bce = (term->esc_args[0] <= 0); term->erase_char = ERASE_CHAR; if (term->use_bce) term->erase_char = (' ' | ATTR_ASCII | (term->curr_attr & (ATTR_FGMASK | ATTR_BGMASK))); break; case ANSI('E', '='): compatibility(OTHER); term->blink_is_real = (term->esc_args[0] >= 1); break; case ANSI('p', '"'): /* * Allow the host to make this emulator a * 'perfect' VT102. This first appeared in * the VT220, but we do need to get back to * * the Fkeys to generate PF* codes as a * real VT102 has no Fkeys. The VT220 does * this, F11..F13 become ESC,BS,LF other * Fkeys send nothing. * * Note ESC c will NOT change this! */ switch (term->esc_args[0]) { case 61: term->compatibility_level &= ~TM_VTXXX; term->compatibility_level |= TM_VT102; break; case 62: term->compatibility_level &= ~TM_VTXXX; term->compatibility_level |= TM_VT220; break; default: if (term->esc_args[0] > 60 && term->esc_args[0] < 70) term->compatibility_level |= TM_VTXXX; break; case 40: term->compatibility_level &= TM_VTXXX; break; case 41: term->compatibility_level = TM_PUTTY; break; case 42: term->compatibility_level = TM_SCOANSI; break; case ARG_DEFAULT: term->term->esc_args[0] == 50) { int i; char lbuf[64]; strcpy(term->id_string, "\033[?"); for (i = 1; i < term->esc_nargs; i++) { if (i != 1) strcat(term->id_string, ";"); sprintf(lbuf, "%d", term->esc_args[i]); strcat(term->id_string, lbuf); } strcat(term->term->term->osc_w = FALSE; switch (c) { case 'P': /* Linux palette sequence */ term->termstate = SEEN_OSC_P; term->term); term->termstate = TOPLEVEL; break; case 'W': /* word-set */ term->termstate = SEEN_OSC_W; term->term->esc_args[0] = 10 * term->term->esc_args[0] == 2) { term->esc_args[0] = 1; break; } /* else fall through */ default: term->termstate = OSC_STRING; term->->term); term->termstate = TOPLEVEL; } else if (c == '\033') term->termstate = OSC_MAYBE_ST; else if (term->osc_strlen < OSC_STR_MAX) term->osc_string[term->osc_strlen++] = c; break; case SEEN_OSC_P: { int max = (term->->termstate = TOPLEVEL; break; } term->osc_string[term->osc_strlen++] = val; if (term->osc_strlen >= 7) { palette_set(term->osc_string[0], term->osc_string[1] * 16 + term->osc_string[2], term->osc_string[3] * 16 + term->osc_string[4], term->osc_string[5] * 16 + term->osc_string[6]); term_invalidate(term); term->term->esc_args[0] = 10 * term->esc_args[0] + c - '0'; break; default: term->termstate = OSC_STRING; term->osc_strlen = 0; } break; case VT52_ESC: term->termstate = TOPLEVEL; term->seen_disp_event = TRUE; switch (c) { case 'A': move(term, term->curs.x, term->curs.y - 1, 1); break; case 'B': move(term, term->curs.x, term->curs.y + 1, 1); break; case 'C': move(term, term->curs.x + 1, term->curs.y, 1); break; case 'D': move(term, term->curs.x - 1, term->term->cset_attr[term->cset = 0] = ATTR_LINEDRW; break; case 'G': term->cset_attr[term->cset = 0] = ATTR_ASCII; break; case 'H': move(term, 0, 0, 0); break; case 'I': if (term->curs.y == 0) scroll(term, 0, term->rows - 1, -1, TRUE); else if (term->curs.y > 0) term->curs.y--; fix_cpos; term->wrapnext = FALSE; break; case 'J': erase_lots(term, FALSE, FALSE, TRUE); term->disptop = 0; break; case 'K': erase_lots(term, ->term->app_keypad_keys = TRUE; break; case '>': term->term->vt52_mode = FALSE; term->term, 0, 0, 0); erase_lots(term, FALSE, FALSE, TRUE); term->disptop = 0; break; case 'L': /* compatibility(ATARI) */ if (term->curs.y <= term->marg_b) scroll(term, term->curs.y, term->term->curs.y <= term->marg_b) scroll(term, term->curs.y, term->->termstate = VT52_FG; break; case 'c': /* compatibility(ATARI) */ term->term, FALSE, TRUE, FALSE); term->disptop = 0; break; case 'e': /* compatibility(ATARI) */ term->term->term, TRUE, TRUE, TRUE); term->curs.x = 0; term->term, TRUE, TRUE, FALSE); break; case 'p': /* compatibility(ATARI) */ term->term->term->term->wrap = 0; break; case 'R': /* compatibility(OTHER) */ term->vt52_bold = FALSE; term->curr_attr = ATTR_DEFAULT; if (term->use_bce) term->erase_char = (' ' | ATTR_ASCII | (term->curr_attr & term->curr_attr |= ATTR_UNDER; break; case 'W': /* compatibility(VI50) */ term->curr_attr &= ~ATTR_UNDER; break; case 'U': /* compatibility(VI50) */ term->vt52_bold = TRUE; term->curr_attr |= ATTR_BOLD; break; case 'T': /* compatibility(VI50) */ term->vt52_bold = FALSE; term->->termstate = VT52_Y2; move(term, term->curs.x, c - ' ', 0); break; case VT52_Y2: term->termstate = TOPLEVEL; move(term, c - ' ', term->curs.y, 0); break; #ifdef VT52_PLUS case VT52_FG: term->termstate = TOPLEVEL; term->curr_attr &= ~ATTR_FGMASK; term->curr_attr &= ~ATTR_BOLD; term->curr_attr |= (c & 0x7) << ATTR_FGSHIFT; if ((c & 0x8) || term->vt52_bold) term->curr_attr |= ATTR_BOLD; if (term->use_bce) term->erase_char = (' ' | ATTR_ASCII | (term->curr_attr & (ATTR_FGMASK | ATTR_BGMASK))); break; case VT52_BG: term->termstate = TOPLEVEL; term->curr_attr &= ~ATTR_BGMASK; term->curr_attr &= ~ATTR_BLINK; term->curr_attr |= (c & 0x7) << ATTR_BGSHIFT; /* Note: bold background */ if (c & 0x8) term->curr_attr |= ATTR_BLINK; if (term->use_bce) term->erase_char = (' ' | ATTR_ASCII | (term->curr_attr & term->selstate != NO_SELECTION) { pos cursplus = term->curs; incpos(cursplus); check_selection(term, term->curs, cursplus); } } term_print_flush(termTerminal *term, unsigned long *a, unsigned long *b) { int i, n; for (i = n = 0; i < term->Terminal *term, term->in_vbell) { ticks = GETTICKCOUNT(); if (ticks - term->vbell_startpoint >= VBELL_TIMEOUT) term->in_vbell = FALSE; } rv = (!term->rvideo ^ !term->term->cursor_on) { if (term->has_focus) { if (term->term->wrapnext) cursor |= TATTR_RIGHTCURS; } else cursor = 0; our_curs_y = term->curs.y - term->disptop; if (term->dispcurs && (term->curstype != cursor || term->dispcurs != term->disptext + our_curs_y * (term->cols + 1) + term->curs.x)) { if (term->dispcurs > term->disptext && (*term->dispcurs & (CHAR_MASK | CSET_MASK)) == UCSWIDE) term->dispcurs[-1] |= ATTR_INVALID; if ( (term->dispcurs[1] & (CHAR_MASK | CSET_MASK)) == UCSWIDE) term->dispcurs[1] |= ATTR_INVALID; *term->dispcurs |= ATTR_INVALID; term->curstype = 0; } term->dispcurs = NULL; /* The normal screen data */ for (i = 0; i < term->term->disptop; ldata = lineptr(scrpos.y); lattr = (ldata[term->cols] & LATTR_MODE); idx = i * (term->cols + 1); dirty_run = dirty_line = (ldata[term->cols] != term->disptext[idx + term->cols]); term->disptext[idx + term->cols] = ldata[term->cols]; for (j = 0; j < term->term->seltype == LEXICOGRAPHIC) selected = (posle(term->selstart, scrpos) && poslt(scrpos, term->selend)); else selected = (posPle(term->selstart, scrpos) && posPlt(scrpos, term->selend)term->blink_is_real && (tattr & ATTR_BLINK)) { if (term->has_focus && term->term->term->term->curs.x) { cursor_background = tattr | tchar; term->dispcurs = term->disptext + idx; } if ((term->term->term->disptext[idx]) dirty_run = TRUE; ch[ccount++] = (char) tchar; term->term->term->curs.x) { cursor_background = *d; term->dispcurs = term->disptext + idx; } if (term->disptext[idx] != *d) dirty_run = TRUE; term->term->term->curs.x, i, ch, 1, attr, lattr); term->Terminal *term, int flg) { long now, blink_diff; now = GETTICKCOUNT(); blink_diff = now - term->term->last_tblink = now; term->tblinker = !term->tblinker; } if (flg) { term->blinker = 1; term->last_blink = now; return; } blink_diff = now - term->term->last_blink = now; term->blinker = !term->Terminal *term) { int i; for (i = 0; i < term->rows * (term->cols + 1); i++) term->Terminal *term, Context ctx, term->cols) right = term->cols-1; if (bottom >= term->rows) bottom = term->rows-1; for (i = top; i <= bottom && i < term->rows; i++) { if ((term->disptext[i * (term->cols + 1) + term->cols] & LATTR_MODE) == LATTR_NORM) for (j = left; j <= right && j < term->cols; j++) term->disptext[i * (term->cols + 1) + j] = ATTR_INVALID; else for (j = left / 2; j <= right / 2 + 1 && j < term->cols; j++) term->disptext[i * (term->term, Terminal *term, int rel, int where) { int sbtop = -count234(term->scrollback); term->disptop = (rel < 0 ? 0 : rel > 0 ? sbtop : term->disptop) + where; if (term->disptop < sbtop) term->disptop = sbtop; if (term->disptop > 0) term->disptop = 0; update_sbar(term); term_update(term); } static void clipme(Terminal *term, term->term->Terminal *term) { pos top; top.y = -count234(term->scrollback); top.x = 0; clipme(term, top, term->curs, 0); } /* * The wordness array is mainly for deciding the disposition of the * US-ASCII characters. */ static int wordtype(Terminal *term, term->Terminal *term, pos p, int dir) { unsigned long *ldata; short wvalue; int topy = -count234(term->scrollback); ldata = lineptr(p.y); switch (term->term->cols] & LATTR_WRAPPED)) { unsigned long *q = ldata + term->cols; while (q > ldata && (q[-1] & CHAR_MASK) == 0x20) q--; if (q == ldata + term->cols) q--; if (p.x >= q - ldata) p.x = (dir == -1 ? q - ldata : term->term, ldata[p.x]); if (dir == +1) { while (1) { if (p.x < term->cols-1) { if (wordtype(term, ldata[p.x + 1]) == wvalue) p.x++; else break; } else { if (ldata[term->term, term, term->cols] & LATTR_WRAPPED) && wordtype(term, ldata2[term->cols-1]) == wvalue) { p.x = term->term->cols - 1); break; } return p; } static void sel_spread(Terminal *term) { if (term->seltype == LEXICOGRAPHIC) { term->selstart = sel_spread_half(term, term->selstart, -1); decpos(term->selend); term->selend = sel_spread_half(term, term->selend, +1); incpos(term->selend); } } void term_do_paste(Terminal *termterm); /* pasted data counts */ if (term->paste_buffer) sfree(term->paste_buffer); term->paste_pos = term->paste_hold = term->paste_len = 0; term->term->paste_buffer[term->term->paste_buffer[term->term->paste_len < 256) { luni_send(term->paste_buffer, term->paste_len, 0); if (term->paste_buffer) sfree(term->paste_buffer); term->paste_buffer = 0; term->paste_pos = term->paste_hold = term->paste_len = 0; } } get_clip(NULL, NULL); } void term_mouse(Terminal *term, term->term, 0, -1); } if (y >= term->rows) { y = term->rows - 1; if (a == MA_DRAG && !raw_mouse) term_scroll(term, 0, +1); } if (x < 0) { if (y > 0) { x = term->cols - 1; y--; } else x = 0; } if (x >= term->cols) x = term->cols - 1; selpoint.y = y + term->term->term->term->selstate == NO_SELECTION) { term->seltype = default_seltype; } if (b == MBT_SELECT && a == MA_CLICK) { deselect(term); term->selstate = ABOUT_TO; term->seltype = default_seltype; term->selanchor = selpoint; term->term); term->selmode = (a == MA_2CLK ? SM_WORD : SM_LINE); term->selstate = DRAGGING; term->selstart = term->selanchor = selpoint; term->selend = term->selstart; incpos(term->selend); sel_spread(termterm->selstate == ABOUT_TO && poseq(term->term->selstate == SELECTED) { if (term->term->selstart) < posdiff(term->selend, term->selstart) / 2) { term->selanchor = term->selend; decpos(term->selanchor); } else { term->selanchor = term->term->selstart.x + term->selend.x) term->selanchor.x = term->selend.x-1; else term->selanchor.x = term->selstart.x; if (2*selpoint.y < term->selstart.y + term->selend.y) term->selanchor.y = term->selend.y; else term->selanchor.y = term->selstart.y; } term->selstate = DRAGGING; } if (term->selstate != ABOUT_TO && term->selstate != DRAGGING) term->selanchor = selpoint; term->selstate = DRAGGING; if (term->term->selanchor)) { term->selstart = selpoint; term->selend = term->selanchor; incpos(term->selend); } else { term->selstart = term->selanchor; term->selend = selpoint; incpos(term->term->selstart.x = min(term->selanchor.x, selpoint.x); term->selend.x = 1+max(term->selanchor.x, selpoint.x); term->selstart.y = min(term->selanchor.y, selpoint.y); term->selend.y = max(term->selanchor.y, selpoint.y); } sel_spread(term); } else if ((b == MBT_SELECT || b == MBT_EXTEND) && a == MA_RELEASE) { if (term->term, term->selstart, term->selend, (term->seltype == RECTANGULAR)); term->selstate = SELECTED; } else term->term); } void term_nopaste(Terminal *term) { if (term->paste_len == 0) return; sfree(term->paste_buffer); term->paste_buffer = 0; term->paste_len = 0; } int term_paste_pending(Terminal *term) { return term->paste_len != 0; } void term_paste(Terminal *term) { long now, paste_diff; if (term->paste_len == 0) return; /* Don't wait forever to paste */ if (term->paste_hold) { now = GETTICKCOUNT(); paste_diff = now - term->term->paste_hold = 0; while (term->paste_pos < term->paste_len) { int n = 0; while (n + term->paste_pos < term->paste_len) { if (term->paste_buffer[term->paste_pos + n++] == '\r') break; } luni_send(term->paste_buffer + term->paste_pos, n, 0); term->paste_pos += n; if (term->paste_pos < term->paste_len) { term->paste_hold = 1; return; } } sfree(term->paste_buffer); term->paste_buffer = NULL; term->paste_len = 0; } static void deselect(Terminal *term) { term->selstate = NO_SELECTION; term->selstart.x = term->selstart.y = term->selend.x = term->selend.y = 0; } void term_deselect(Terminal *term) { deselect(term); term_update(term); } int term_ldisc(Terminal *term, int option) { if (option == LD_ECHO) return term->term_echoing; if (option == LD_EDIT) return term->void *vterm, int is_stderr, char *data, int len) { Terminal *term = (Terminal *)vterm; assert(len > 0); bufchain_add(&term->z)))lowly - but we * can't do the 100% right thing without moving the terminal * processing into a separate thread, and that might hurt * portability. So we manage stdout buffering the old SSH1 way: * if the terminal processing goes slowly, the whole SSH * connection stops accepting data until it's ready. * * In practice, I can't imagine this causing serious trouble. */ return 0; } Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 438b449b08bf56887fec6dfdd8dd135c Text-delta-base-sha1: 9ff3b6e24efa292ee9bc7b7c384a479394b39d3d Text-content-length: 58 Text-content-md5: 2b7de9651b0b39ec4c214cae882a7ba9 Text-content-sha1: 3316167241b823a74e9d7926f156ccc9d89eea4c Content-length: 98 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNzsB{==terminal(term)(term) Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4081e7c72ab9bc398fe5e75d8d02e496 Text-delta-base-sha1: 8af4c47ba24c4fde4c29a8a817c12896210396e4 Text-content-length: 1336 Text-content-md5: be415fb1f7b58aeac35aa4d6e8756436 Text-content-sha1: dfed1790b1c2f7e376dac37aa63b1b5b1a19a3af Content-length: 1376 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNd1GbUQ#T4w+'.;U8)#vr N{I3Uvar ST^?D1EOUl@,> (XNRPR&R r`O1#include "terminaltermterm, term, term, term->term->term->term->vt52_mode || cfg.funky_type == 4) && code >= 11 && code <= 24) { int offt = 0; if (code > 15) offt++; if (code > 21) offt++; if (term->term->term->term->term); term_out(termterm, 0, -5); return TRUE; } if (event->button == 5 && event->type == GDK_BUTTON_PRESS) { term_scroll(term, term, term, term); term_blink(term, term, 0, buf, ret); term_blink(term, 1); term_out(termterm->has_focus = event->in; term_out(term); term_update(termterm);term); if (term_paste_pending(termterm)) term_paste(termterm, term->cols) return; if (x + len*2 > term->cols) len = (term->cols-x)/2;term->cols) return; if (x + len*2 > term->cols) len = (term->cols-x)/2;term->cols) return; if (x + len*2 > term->cols) len = (term->cols-x)/2;term = term_init(); back = &pty_backend; back->init((void *)term, NULL, 0, NULL, 0); term_size(term, cfg.height, cfg.width, cfg.savelines); ldisc_send(NULL, 0, 0); /* cause ldisc to notice changes */gtk_main(); return 0; } Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d37edeb3a5991f4a6a3868d20b8dd9ce Text-delta-base-sha1: 827bbbe4fb2280e4c0cf940f68bacd23cb3bfa44 Text-content-length: 250 Text-content-md5: 747e7cf21b9c9fef227c070827296ce3 Text-content-sha1: 5af59ddf84e0df2b57bc4a5a57b42190a85ee59a Content-length: 290 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNLVu&qD,o#include "terminalvoid *frontend, term->rows; size.ws_col = (unsigned short)term->cols; size.ws_xpixel = (unsigned short) term->cols * font_dimension(0); size.ws_ypixel = (unsigned short) term-> Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f0dcd68ae0ed1882c64765e06b616e85 Text-delta-base-sha1: 142c5a3359372e5afc8f412279af44d150d5381c Text-content-length: 51 Text-content-md5: 551f8873b5d9df31f519a52a9a1e7b46 Text-content-sha1: b2d67fef709fc654fc9246dc9197a66fd77984f6 Content-length: 90 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN?j\Bwd9terminal(term)(term) Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 38a714cac2b9cb76892e49e28d82ad59 Text-delta-base-sha1: cc0961bf201b55c651da07af9b51dff8055179d8 Text-content-length: 5649 Text-content-md5: 98f7102c72f11ecefd41206a16c042f6 Text-content-sha1: 1385854de4898e97a61403fb169c5bcc9d1c7ec6 Content-length: 5690 K 15 cvs2svn:cvs-rev V 5 1.207 PROPS-END SVN1z8l B=UBZHO8#*R;S `Y6C"*7ha6cgnYs/_&D = nD 2tM?iVma@0w0G3Rz"Ll"AnO Y!QzKfesKEsw Vwr_yXX(ETm~Q|1y AcS$N:r&,TYvO?SZ;lv'sJ+Z|zuzn4hhq8P)`); bDd8*P.~Mh$~%")GOp?X/[e;cT.r` UNZh5Bw !4terminalterm =term, cfg.height, cfg.width, cfg.savelines); guess_width = extra_width + font_width * term->cols; guess_height = extra_height + font_height * term->term->cols; guess_height = extra_height + font_height * term->term->rows - 1; si.nPage = term->(void *)term, term->term, termterm, !(cfg.mouse_override && is_shift_pressed()))) term_out(term); term_update(termterm->has_focus = (GetForegroundWindow() == hwnd); if (term->term->term->rows && w == term->term, term->cols)/2 || offset_height != (win_height-font_height*term->rows)/2) ){ offset_width = (win_width-font_width*term->cols)/2; offset_height = (win_height-font_height*term->term->cols || font_height != win_height/term->rows) { deinit_fonts(); init_fonts(win_width/term->cols, win_height/term->rows); offset_width = (win_width-font_width*term->cols)/2; offset_height = (win_height-font_height*term->term->cols || font_height != win_height/term->term, win_height/font_height, win_width/font_width, cfg.savelines); offset_width = (win_width-font_width*term->cols)/2; offset_height = (win_height-font_height*term->term->cols + offset_width*2 || win_height != font_height*term->term->cols + extra_width, font_height*term->term->cols + offset_width*2 || win_height != font_height*term->term->rows > height || term->term->cols > width) font_width = (ss.right - ss.left - extra_width) / term->cols; if (term->rows > height) font_height = (ss.bottom - ss.top - extra_height) / term->term->rows ) height = term->rows; if ( width > term->cols ) width = term->cols; term_size(term, term->cols + extra_width, font_height*term->term->cols + extra_width, font_height*term->term->cols || font_height != (win_height-cfg.window_border*2)/term->rows) { deinit_fonts(); init_fonts((win_width-cfg.window_border*2)/term->cols, (win_height-cfg.window_border*2)/term->rows); offset_width = (win_width-font_width*term->cols)/2; offset_height = (win_height-font_height*term->term, term, term); noise_regular(); HideCaret(hwnd); term_update(termtermterm, term); break; case IDM_CLRSB: term_clrsb(term); break; case IDM_RESET: term_pwron(term); ldisc_send(NULL, 0, 0term, term, termterm, term->cols || p.rcPaint.bottom>= offset_height + font_height*term->term->cols, offset_height+font_height*term->term->term); term_update(term); break; case WM_KILLFOCUS: show_mouseptr(1); term->term); term_update(termterm, term->rows || cfg.width != term->term, term->rows; cfg.width=term->term->cols/2)/term->cols; h = (height + term->rows/2)/term->rows; if ( r->right != r->left + w*term->cols + ex_width)term->cols - ex_width; else r->right = r->left + w*term->cols + ex_width; if (r->bottom != r->top + h*term->term->rows - ex_height; else r->bottom = r->top + h*term->term->rows; prev_cols = term->term, term, term, -1, 0); break; case SB_TOP: term_scroll(term, +1, 0); break; case SB_LINEDOWN: term_scroll(term, 0, +1); break; case SB_LINEUP: term_scroll(term, 0, -1); break; case SB_PAGEDOWN: term_scroll(term, 0, +term->rows / 2); break; case SB_PAGEUP: term_scroll(term, 0, -term->term, termtermtermtermtermtermterm, term, b, MA_RELEASE,} else { /* trigger a scroll */ term_scroll(term, 0, b == MBT_WHEEL_UP ? -term->rows / 2 : term->term->term->term->cols) return; ACTCURS) && (cfg.cursor_type == 0 || term->term->cols+offset_width) line_box.right = font_width*term->term->term->term->app_keypad_keys && term->repeat_off && term->termterm->term->term->term->term->term->term->term->term->term->vt52_mode) p += sprintf((char *) p, "\x1B%c", xkey); else { int app_flg = (term->term->(term)termterm(term) || dbcs_screenfont) { keybuf = alt_sum; term_seen_key_event(termtermtermtermterm(term)term[pV|so logpal->palPalEntry[i].peRed = defpal[i].rgbtRed; logpal->palPalEntry[i].peGreen = defpal[i].rgbtGreen; logpal->palPalEntry[i].peBlue = defpal[i].rgbtBlue; logpal->palPalEntry[i].peFlags = 0; colours[i] = PALETTERGB(defpal[i].rgbtRed, defpal[i].rgbtGreen, defpal[i].rgbtBlue); } else colours[i] = RGB(defpal[i].rgbtRed, defpal[i].rgbtGreen, defpal[i].rgbtBlue); } if (pal) { HDC hdc; SetPaletteEntries(pal, 0, NCOLOURS, logpal->palPalEntry); hdc = get_ctx(); RealizePalette(hdc); free_ctx(hdc); } } void write_aclip(char *data, int len, int must_deselect) { HGLOBAL clipdata; void *lock; clipdata = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, len + 1); if (!clipdata) return; lock = GlobalLock(clipdata); if (!lock) return; memcpy(lock, data, len); ((unsigned char *) lock)[len] = 0; GlobalUnlock(clipdataterm->term-> Revision-number: 2116 Prop-content-length: 182 Content-length: 182 K 8 svn:date V 27 2002-10-23T09:11:36.000000Z K 7 svn:log V 82 Oops. Forgot to check in terminal.h from yesterday's work. There's always one :-/ K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4952 Text-content-md5: 127e943ac7e12f457017db42e749b598 Text-content-sha1: bd3bd5d9b503b339ea205f69dbd3439c70d3f358 Content-length: 5068 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNJJJ/* * Internals of the Terminal structure, for those other modules * which need to look inside it. It would be nice if this could be * folded back into terminal.c in future, with an abstraction layer * to handle everything that other modules need to know about it; * but for the moment, this will do. */ #ifndef PUTTY_TERMINAL_H #define PUTTY_TERMINAL_H #include "tree234.h" struct beeptime { struct beeptime *next; unsigned long ticks; }; typedef struct { int y, x; } pos; struct terminal_tag { int compatibility_level; tree234 *scrollback; /* lines scrolled off top of screen */ tree234 *screen; /* lines on primary screen */ tree234 *alt_screen; /* lines on alternate screen */ int disptop; /* distance scrolled back (0 or -ve) */ unsigned long *cpos; /* cursor position (convenience) */ unsigned long *disptext; /* buffer of text on real screen */ unsigned long *dispcurs; /* location of cursor on real screen */ unsigned long curstype; /* type of cursor on real screen */ #define VBELL_TIMEOUT (TICKSPERSEC/10) /* visual bell lasts 1/10 sec */ struct beeptime *beephead, *beeptail; int nbeeps; int beep_overloaded; long lastbeep; #define TSIZE (sizeof(unsigned long)) #define fix_cpos do { \ term->cpos = lineptr(term->curs.y) + term->curs.x; \ } while(0) unsigned long curr_attr, save_attr; unsigned long erase_char; bufchain inbuf; /* terminal input buffer */ pos curs; /* cursor */ pos savecurs; /* saved cursor position */ int marg_t, marg_b; /* scroll margins */ int dec_om; /* DEC origin mode flag */ int wrap, wrapnext; /* wrap flags */ int insert; /* insert-mode flag */ int cset; /* 0 or 1: which char set */ int save_cset, save_csattr; /* saved with cursor position */ int save_utf, save_wnext; /* saved with cursor position */ int rvideo; /* global reverse video flag */ unsigned long rvbell_startpoint; /* for ESC[?5hESC[?5l vbell */ int cursor_on; /* cursor enabled flag */ int reset_132; /* Flag ESC c resets to 80 cols */ int use_bce; /* Use Background coloured erase */ int blinker; /* When blinking is the cursor on ? */ int tblinker; /* When the blinking text is on */ int blink_is_real; /* Actually blink blinking text */ int term_echoing; /* Does terminal want local echo? */ int term_editing; /* Does terminal want local edit? */ int sco_acs, save_sco_acs; /* CSI 10,11,12m -> OEM charset */ int vt52_bold; /* Force bold on non-bold colours */ int utf; /* Are we in toggleable UTF-8 mode? */ int utf_state; /* Is there a pending UTF-8 character */ int utf_char; /* and what is it so far. */ int utf_size; /* The size of the UTF character. */ int printing, only_printing; /* Are we doing ANSI printing? */ int print_state; /* state of print-end-sequence scan */ bufchain printer_buf; /* buffered data for printer */ printer_job *print_job; int rows, cols, savelines; int has_focus; int in_vbell; unsigned long vbell_startpoint; int app_cursor_keys, app_keypad_keys, vt52_mode; int repeat_off, cr_lf_return; int seen_disp_event; int big_cursor; long last_blink; /* used for real blinking control */ long last_tblink; int xterm_mouse; /* send mouse messages to app */ unsigned long cset_attr[2]; /* * Saved settings on the alternate screen. */ int alt_x, alt_y, alt_om, alt_wrap, alt_wnext, alt_ins; int alt_cset, alt_sco_acs, alt_utf; int alt_t, alt_b; int alt_which; #define ARGS_MAX 32 /* max # of esc sequence arguments */ #define ARG_DEFAULT 0 /* if an arg isn't specified */ #define def(a,d) ( (a) == ARG_DEFAULT ? (d) : (a) ) int esc_args[ARGS_MAX]; int esc_nargs; int esc_query; #define ANSI(x,y) ((x)+((y)<<8)) #define ANSI_QUE(x) ANSI(x,TRUE) #define OSC_STR_MAX 2048 int osc_strlen; char osc_string[OSC_STR_MAX + 1]; int osc_w; char id_string[1024]; unsigned char *tabs; enum { TOPLEVEL, SEEN_ESC, SEEN_CSI, SEEN_OSC, SEEN_OSC_W, DO_CTRLS, SEEN_OSC_P, OSC_STRING, OSC_MAYBE_ST, VT52_ESC, VT52_Y1, VT52_Y2, VT52_FG, VT52_BG } termstate; enum { NO_SELECTION, ABOUT_TO, DRAGGING, SELECTED } selstate; enum { LEXICOGRAPHIC, RECTANGULAR } seltype; enum { SM_CHAR, SM_WORD, SM_LINE } selmode; pos selstart, selend, selanchor; short wordness[256]; wchar_t *paste_buffer; int paste_len, paste_pos, paste_hold; long last_paste; }; #define in_utf(term) ((term)->utf || line_codepage==CP_UTF8) #endif Revision-number: 2117 Prop-content-length: 355 Content-length: 355 K 8 svn:date V 27 2002-10-23T12:41:35.000000Z K 7 svn:log V 254 Cleanups from yesterday's destabilisation: lots of stuff in terminal.c was apparently relying on implicit initialisation to zero, and also I've removed the backends' dependency on terminal.h by having terminal sizes explicitly passed in to back->size(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f394b50d0710ca3a8955976250297548 Text-delta-base-sha1: 4e945c7332b97f10b1014f3f3f7fe7378a2e8e93 Text-content-length: 44 Text-content-md5: b4b9eb993f6e21106e29b124fb76f28c Text-content-sha1: 567920e9be2dfe2a32f6fc11b245f771a94f9e02 Content-length: 85 K 15 cvs2svn:cvs-rev V 5 1.155 PROPS-END SVN- 1g5int width, int height Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e9af02a7efd6c9f724b5d1a1d86f806c Text-delta-base-sha1: c67241a0d5ae642ca31307b38fbfde56059d54a5 Text-content-length: 481 Text-content-md5: 1380ba30efcfde85d922a2b8a063819b Text-content-sha1: 241bf3f1f5d55164d276cba33a66c67df0c2ac79 Content-length: 521 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNR9c%yXFkJ%mint rlogin_term_width, rlogin_term_height rlogin_term_width = cfg.width; rlogin_term_height = cfg.heightint width, int height) { char b[12] = { '\xFF', '\xFF', 0x73, 0x73, 0, 0, 0, 0, 0, 0, 0, 0 }; rlogin_term_width = width; rlogin_term_height = height; if (s == NULL) return; b[6] = rlogin_term_width >> 8; b[7] = rlogin_term_width & 0xFF; b[4] = rlogin_term_height >> 8; b[5] = rlogin_term_height Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 734d02c333ff76afbbbd6167b6a08fd0 Text-delta-base-sha1: b006cb9ab06ce3281984b20b78c47f2f2220eb1a Text-content-length: 475 Text-content-md5: 8d5b7e6288441a7979182e494934aa18 Text-content-sha1: 9a0b28597a0f17e18f5de386983d4049bd2afbc0 Content-length: 516 K 15 cvs2svn:cvs-rev V 5 1.223 PROPS-END SVNQK5Z,Lint ssh_term_width, ssh_term_heightssh_term_height, PKT_INT, ssh_term_width=V,,`V#@YwSWa( method.ssh_term_width); ssh2_pkt_adduint32(ssh_term_height ssh_term_width = cfg.width; ssh_term_height = cfg.heightint width, int height) { ssh_term_width = width; ssh_term_height = height; ssh_term_height, PKT_INT, ssh_term_widthssh_term_width); ssh2_pkt_adduint32(ssh_term_height Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0501f517188035136578472d46db1b4c Text-delta-base-sha1: 6b6f65c937ff6ed5a027303c8c23b24871b34f57 Text-content-length: 437 Text-content-md5: 42c7df20437a7bde471ac7a54f312d1d Text-content-sha1: 2e7be4e700614121a2210632626476d2d4b84124 Content-length: 477 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNH #Pzf3^Fqm| > 8; b[4] = telnet_term_width & 0xFF; b[5] = telnet_term_height >> 8; b[6] = telnet_term_height Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 91d9d33829c2f14bebbb5aba75f6e7b5 Text-delta-base-sha1: 05ac16559020c015ea31361a67de0725dc04aa54 Text-content-length: 1843 Text-content-md5: 8198e84e5fc180ce0d09e19ac2cbf14e Text-content-sha1: f7b2b103284531f3530531c20211468bb95f8a8d Content-length: 1884 K 15 cvs2svn:cvs-rev V 5 1.108 PROPS-END SVN,_fht \ZH6*'Goins = term->insert = FALSE; term->alt_wnext = term->wrapnext = term->save_wnext = FALSE; term->alt_wrap = term->wrap = cfg.wrap_mode; term->alt_cset = term->cset = term->save_cset = 0; term->alt_utf = term->utf = term->save_utf = 0; term->utf_state = 0; term->alt_sco_acs = term->sco_acs = term->save_sco_acs = 0; term->cset_attr[0] = term->cset_attr[1] = term->save_csattr term->printing = term->only_printing = FALSE; term->print_job = NULL; term->vt52_mode = FALSE; term->cr_lf_return = FALSE; term->seen_disp_event = FALSE; term->xterm_mouse = FALSE; term->reset_132 = FALSE; term->blinker = term->tblinker = 0; term->has_focus = 1; term->repeat_off = FALSE; term->termstate = TOPLEVEL; term->selstate = NO_SELECTIONterm->cols, term->rowsstate == DRAGGING || term->selstate == SELECTED) { if (term->seltype == LEXICOGRAPHIC) selected = (posle(term->selstart, scrpos) && poslt(scrpos, term->selend)); else selected = (posPle(term->selstart, scrpos) && posPlt(scrpos, term->selend)); } else selected = FALSENULL)2 )n) { Terminal *term = (Terminal *)vterm; assert(len > 0); bufchain_add(&term->inbuf, data, len); /* * term_out() always completely empties inbuf. Therefore, * there's no reason at all to return anything other than zero * from this function, because there _can't_ be a question of * the remote side needing to wait until term_out() has cleared * a backlog. * * This is a slightly suboptimal way to deal with SSH2 - in * principle, the window mechanism would allow us to continue * to accept data on forwarded ports and X connections even * while the terminal processing was going s Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 747e7cf21b9c9fef227c070827296ce3 Text-delta-base-sha1: 5af59ddf84e0df2b57bc4a5a57b42190a85ee59a Text-content-length: 479 Text-content-md5: 9dcd3499c6c684dcfadc70e61b6496fb Text-content-sha1: 3b3c176f0b9c0e0bacb035a6cfbac026c743f5a2 Content-length: 519 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNLf"1u7 89&R9int pty_term_width, pty_term_heightpty_term_width = cfg.width; pty_term_height = cfg.heightint width, int height) { struct winsize size; pty_term_width = width; pty_term_height = height; size.ws_row = (unsigned short)pty_term_height; size.ws_col = (unsigned short)pty_term_width; size.ws_xpixel = (unsigned short) pty_term_width * font_dimension(0); size.ws_ypixel = (unsigned short) pty_term_height Revision-number: 2118 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2002-10-23T13:46:59.000000Z K 7 svn:log V 146 Remove apparently unnecessary declaration of typedef Config from winstuff.h -- it was breaking mingw builds (gcc being more picky than Visual C). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4362aa0c104b3d29474066add33fc79c Text-delta-base-sha1: df663eb23b2debc63084177121ce28d208a7a576 Text-content-length: 20 Text-content-md5: e73c1b46b1d72828113cf57256cdf0b8 Text-content-sha1: 4e22bd62ef5a78ae35d8ce82a1441721478a0f85 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNk% R Revision-number: 2119 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2002-10-23T14:03:11.000000Z K 7 svn:log V 122 Fixes for (Backend)->size() changes -- internal declarations didn't include new arguments and neither did internal calls. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c93a1036736ed7607903be6292d264b9 Text-delta-base-sha1: d07581d4efa8aa6879aacc5a076a2d4cc291173f Text-content-length: 69 Text-content-md5: 70b5983bee792eb83b2d560e4ce7ad7f Text-content-sha1: 05ad112aa5e8192267c9a10dcd1e422fb1693caa Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNg *Daint width, int heightint width, int height Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1380ba30efcfde85d922a2b8a063819b Text-delta-base-sha1: 241bf3f1f5d55164d276cba33a66c67df0c2ac79 Text-content-length: 85 Text-content-md5: 756ac5017119bbc35883b38771a68297 Text-content-sha1: 6b07f1e4a57f2461b58b3696c2b11e2110112e4a Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNR:c,g?int width, int heightrlogin_term_width, rlogin_term_height Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8d5b7e6288441a7979182e494934aa18 Text-delta-base-sha1: 9a0b28597a0f17e18f5de386983d4049bd2afbc0 Text-content-length: 189 Text-content-md5: 6939b351f66330607d7ad29cbe644dee Text-content-sha1: 3121c074d5a148779f97edaa9e40088adb174de3 Content-length: 230 K 15 cvs2svn:cvs-rev V 5 1.224 PROPS-END SVN4?iPG#.o_\o:wdefine _GNU_SOURCE #include #include #include #include #include master_fd >= 0) { pty_close(); inst->master_fd = -1; gtk_input_remove(inst->master_func_id); } if (!inst->exited && back->exitcode() >= 0) { int exitcode = back->exitcode(); int clean; clean = WIFEXITED(exitcode) && (WEXITSTATUS(exitcode) == 0); /* * Terminate now, if the Close On Exit setting is * appropriate. */ if (cfg.close_on_exit == COE_ALWAYS || (cfg.close_on_exit == COE_NORMAL && clean)) exit(0); /* * Otherwise, output an indication that the session has * closed. */ { char message[512]; if (WIFEXITED(exitcode)) sprintf(message, "\r\n[pterm: process terminated with exit" " code %d]\r\n", WEXITSTATUS(exitcode)); else if (WIFSIGNALED(exitcode)) #ifdef HAVE_NO_STRSIGNAL sprintf(message, "\r\n[pterm: process terminated on signal" " %d]\r\n", WTERMSIG(exitcode)); #else sprintf(message, "\r\n[pterm: process terminated on signal" " %d (%.400s)]\r\n", WTERMSIG(exitcode), strsignal(WTERMSIG(exitcode))); #endif from_backend((void *)term, 0, message, strlen(message)); } inst->exited = 1; } } void frontend_keypress(void) { /* * If our child process has exited but not closed, terminate on * any keypress. */ if (inst->exited) exit(0); } gint timer_func(gpointer data) { struct gui_data *inst = (struct gui_data *)data; if (back->exitcode() >= 0 * (though we don't necessarily _close_ the window, * depending on the state of Close On Exit). This would be * easy enough to change or make configurable if necessary. */ done_with_pty(inststruct gui_data *inst = (struct gui_data *)data;done_with_pty(inst); } else if (ret < 0) { perror("read pty master"); exit(1); } elseinst->master_fd = pty_master_fd; inst->exited = FALSE; inst->master_func_id = gdk_input_add(pty_master_fd, GDK_INPUT_READ, Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9dcd3499c6c684dcfadc70e61b6496fb Text-delta-base-sha1: 3b3c176f0b9c0e0bacb035a6cfbac026c743f5a2 Text-content-length: 556 Text-content-md5: 383e2361415b36bae558a24b34eea413 Text-content-sha1: 86e255c2ee3d944343773b7cf14149f3157e9f9f Content-length: 596 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNf'yubKy<]O55*EZJstatic int pty_exit_code; #ifndef OMIT_UTMP static struct utmp utmp_entry; #endif char **pty_argv; { pty_exit_code = status; pty_child_dead = TRUE; }if (pty_master_fd < 0) return 0; /* ignore all writes if fd closed */ void pty_close(void) { if (pty_master_fd >= 0) { close(pty_master_fd); pty_master_fd = -1; } close(pty_utmp_helper_pipe); /* this causes utmp to be cleaned up */if (!pty_child_dead) return -1; /* not dead yet */ else return pty_exit_code Revision-number: 2121 Prop-content-length: 283 Content-length: 283 K 8 svn:date V 27 2002-10-23T14:24:40.000000Z K 7 svn:log V 182 Minor compiler nits: - use smalloc/sfree, not malloc/free - include - include (although this doesn't shut the compiler up about non-ANSI stricmp/strnicmp) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 78f9291ede28040f8186fce79aaccf05 Text-delta-base-sha1: e629d5338655fde5f733288f9e6d1725ff5be741 Text-content-length: 76 Text-content-md5: e600c1b670516aee746f59982c85d2e5 Text-content-sha1: 007d67289179681f8d0e2e7041d0a961ef892bfe Content-length: 116 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNLu%C%?Wd;#include #include Currently, the `character classes' configuration on the Selection panel for word-at-a-time selection only covers the first 128 characters. It did not change when PuTTY was upgraded to Unicode.

    It should probably support configurable selection for Unicode somehow, but clearly the UI will need major changes.

    Currently there is some hard-coded wordness for Unicode that tries to do the right thing for particular Unicode ranges, in terminal.c:wordtype(). Perhaps the data structure here could be used as the basis of a simple UI. (Will need to translate existing configurations, of course.)

    Possibly relevant references:

    Revision-number: 2124 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 2002-10-24T11:58:13.000000Z K 7 svn:log V 9 s/15/14/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unicode-select Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 577a498f2760061cb9e9df0ee6bfbb84 Text-delta-base-sha1: f2e23e6b843c95d57b16913731cbdfa2ab6370a7 Text-content-length: 29 Text-content-md5: b92032dc6415bf28a224544fd8e3d0f0 Text-content-sha1: a3caee0c38a8032697e3945e18c98bf2e56e82db Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNXX K4) Revision-number: 2125 Prop-content-length: 235 Content-length: 235 K 7 svn:log V 134 Oops - repercussions of the close-on-exit stuff which I forgot to check in. I must stop doing my Unix checkins in the Unix subdir :-( K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-24T14:12:55.000000Z PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 01dd9952c12f7594a3f1d482eb5ec322 Text-delta-base-sha1: 6efb0e6b2ff4a4a10a82b2d18ca254a5a5e698a8 Text-content-length: 205 Text-content-md5: 598d2eddb4bc5bdfc5b50652a6c96c70 Text-content-sha1: 43ad7821aa187aba4768e3eac5b658ed0f93c0f1 Content-length: 245 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNv: 5+5ZNotify the front end that something was pressed, in case * it's depending on finding out (e.g. keypress termination for * Close On Exit). */ frontend_keypress(); Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b4b9eb993f6e21106e29b124fb76f28c Text-delta-base-sha1: 567920e9be2dfe2a32f6fc11b245f771a94f9e02 Text-content-length: 45 Text-content-md5: 436fa662febd8e65af6d15deda378b93 Text-content-sha1: 05b54f1c6859d650ea8b818c133790ed5e5ffdcd Content-length: 86 K 15 cvs2svn:cvs-rev V 5 1.156 PROPS-END SVN-K v?nvoid frontend_keypress Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 98f7102c72f11ecefd41206a16c042f6 Text-delta-base-sha1: 1385854de4898e97a61403fb169c5bcc9d1c7ec6 Text-content-length: 306 Text-content-md5: 68508d22d1171919ae28514fb569df5d Text-content-sha1: 458fe66a251054f9e97bc0ab878d29868f7ef58f Content-length: 347 K 15 cvs2svn:cvs-rev V 5 1.208 PROPS-END SVN[j[ void frontend_keypress(void) { /* * Keypress termination in non-Close-On-Exit mode is not * currently supported in PuTTY proper, because the window * always has a perfectly good Close button anyway. So we do * nothing here. */ return; } Revision-number: 2126 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2002-10-24T14:48:08.000000Z K 7 svn:log V 67 Need to stub frontend_keypress() in console.c as well as window.c. K 10 svn:author V 5 simon PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 243511423e1181ecf97a5fcc0daa09b5 Text-delta-base-sha1: e5ecbba74bba8171e448abdb5a9e8a987b50736c Text-content-length: 130 Text-content-md5: 24c529bbb2f33990909861640e220005 Text-content-sha1: d0cf060d793588ad1e4ccf6c330a9ef1457513a0 Content-length: 169 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNl]qlq void frontend_keypress(void) { /* * This is nothing but a stub, in console code. */ return; } Revision-number: 2127 Prop-content-length: 651 Content-length: 651 K 8 svn:date V 27 2002-10-25T11:30:33.000000Z K 7 svn:log V 550 Major destabilisation, phase 2. This time it's the backends' turn: each backend now stores all its internal variables in a big struct, and each backend function gets a pointer to this struct passed to it. This still isn't the end of the work - lots of subsidiary things still use globals, notably all the cipher and compressor modules and the X11 forwarding authentication stuff. But ssh.c itself has now been transformed, and that was the really painful bit, so from here on it all ought to be a sequence of much smaller and simpler pieces of work. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 598d2eddb4bc5bdfc5b50652a6c96c70 Text-delta-base-sha1: 43ad7821aa187aba4768e3eac5b658ed0f93c0f1 Text-content-length: 979 Text-content-md5: 46726740b3fe8f2806e79961317b7d2f Text-content-sha1: 75293e236b2b3186c25a6de828594625552eca5a Content-length: 1019 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN::@K"VzR} 6O]b_vwf{7`tbackhandle, LD_ECHO) || \ backhandle, LD_EDIT) || \ backhandle, backhandle, TS_IP); if (c == CTRL('Z')) back->special(backhandle, TS_SUSP); if (c == CTRL('\\')) back->special(backhandle, backhandle, TS_EOF); } else { back->send(backhandle, backhandle, term_buf, term_buflen); if (cfg.protocol == PROT_RAW) back->send(backhandle, backhandle, TS_EOL); else back->send(backhandle, backhandle, backhandle, TS_EOL); else back->send(backhandle, "\r", 1); break; case CTRL('?'): case CTRL('H'): if (cfg.telnet_keyboard) { back->special(backhandle, backhandle, TS_IP); break; } case CTRL('Z'): if (cfg.telnet_keyboard) { back->special(backhandle, TS_SUSP); break; } default: back->send(backhandle, buf, len); break; } } else back->send(backhandle, buf, len); } } } Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d6c09e29e0846b5bcf3614a736a3f436 Text-delta-base-sha1: b398cb847d5606a3b3a5c4ed45eac5b52e9cfee4 Text-content-length: 437 Text-content-md5: 11bf4ca621f2b511b614c176a1335231 Text-content-sha1: 6bf4f55c51f1b9c129245933e0e8c14424e5f379 Content-length: 477 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVN\e:m"$5KYDxvJvn{Gi,0&backhandle, cfg.host, cfg.port, backhandlebackhandle) != NULL) { if (idata.len > 0) { back->send(backhandle, idata.buffer, idata.len); } else { back->special(backhandle, backhandle) != NULL) { back->unthrottle(backhandle, backhandle) != NULL) { back->unthrottle(backhandle, if (!reading && back->sendbuffer(backhandlebackhandlebackhandle Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 733984fbebed3846375b114cd16f7d0d Text-delta-base-sha1: 62e6c078c4e5be2f4e25997edc8940945af78b31 Text-content-length: 77 Text-content-md5: d21af83fc71fea1358790fe913f53307 Text-content-sha1: d1254ba465e58a42af7c99a9ab382b7ea477c53c Content-length: 116 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN9W2OFsbackhandle, backhandle, pr->c, pr->hostname, Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5642a986685d38c18b2d45533b7c97da Text-delta-base-sha1: bd3d93aa7674169e784df62fe7d3ee07b351ad97 Text-content-length: 138 Text-content-md5: 60a7ccf004f9d62315b685e8c2a62405 Text-content-sha1: a7e8b8fea1750f83d807c287ae317ecddae97d6c Content-length: 178 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNN ]zczI]"$blbackhandle, backhandle&backhandlebackhandle) != NULL) { char ch; back->special(backhandle, Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 436fa662febd8e65af6d15deda378b93 Text-delta-base-sha1: 05b54f1c6859d650ea8b818c133790ed5e5ffdcd Text-content-length: 541 Text-content-md5: def1118b72cd4a1887ee0d9d9a5e56f6 Text-content-sha1: ed114b29c262f4787fc84fcc759b3bedc8dcc562 Content-length: 582 K 15 cvs2svn:cvs-rev V 5 1.157 PROPS-END SVNKS%j X[o- void **backvoid *handle, *handle); void (*size) (void *handle, int width, int height); void (*special) (void *handle, Telnet_Special code); Socket(*socket) (void *handle); int (*exitcode) (void *handle); int (*sendok) (void *handle); int (*ldisc) (void *handle, void *handle, int); int default_port; }; GLOBAL Backend *back; GLOBAL void *backhandlevoid term_provide_resize_fn(Terminal *term, void (*resize_fn)(void *, int, int), void *resize_ctx Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 70b5983bee792eb83b2d560e4ce7ad7f Text-delta-base-sha1: 05ad112aa5e8192267c9a10dcd1e422fb1693caa Text-content-length: 1880 Text-content-md5: 3ad4b203629c77eb7fa8a92a48507166 Text-content-sha1: 69a45c9fa9b988a9331803cfbd558b96c000570a Content-length: 1920 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN {E8!P.MW]=o '%k xn vvltypedef struct raw_backend_data { const struct plug_function_table *fn; /* the above field _must_ be first in the structure */ Socket s; int bufsize; void *frontend; } *Raw; static void raw_size(void *handle, int width, int height); static void c_write(Raw raw, char *buf, int len) { int backlog = from_backend(raw->frontend, 0, buf, len); sk_set_frozen(raw->Raw raw = (Raw) plug; if (raw->s) { sk_close(raw->s); raw->Raw raw = (Raw) plug; c_write(raw, data, len); return 1; } static void raw_sent(Plug plug, int bufsize) { Raw raw = (Raw) plug; raw->void **backend_handle, char *host, int port, char **realhost, int nodelay) { static const struct plug_function_table fn_table = { raw_closing, raw_receive, raw_sent }; SockAddr addr; char *err; Raw raw; raw = smalloc(sizeof(*raw)); raw->fn = &fn_table; raw->s = NULL; *backend_handle = raw; raw->raw->s = new_connection(addr, *realhost, port, 0, 1, nodelay, (Plug) raw); if ((err = sk_socket_error(raw->void *handle, char *buf, int len) { Raw raw = (Raw) handle; if (raw->s == NULL) return 0; raw->bufsize = sk_write(raw->s, buf, len); return raw-> *handle) { Raw raw = (Raw) handle; return raw->bufsize; } /* * Called to set the size of the window */ static void raw_size(void *handle, void *handle, Telnet_Special code) { /* Do nothing! */ return; } static Socket raw_socket(void *handle) { Raw raw = (Raw) handle; return raw->s; } static int raw_sendok(void *handle) { return 1; } static void raw_unthrottle(void *handle, int backlog) { Raw raw = (Raw) handle; sk_set_frozen(raw->s, backlog > RAW_MAX_BACKLOG); } static int raw_ldisc(void *handle, *handle Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 756ac5017119bbc35883b38771a68297 Text-delta-base-sha1: 6b07f1e4a57f2461b58b3696c2b11e2110112e4a Text-content-length: 3302 Text-content-md5: 316fc83bce7886a695d4b9336af0c96a Text-content-sha1: 7ad3e20643dbe3ce295df530e1a0700b75212bc4 Content-length: 3342 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNoUN3oa1> 2Q1iV+wW U1\dDDtypedef struct rlogin_tag { const struct plug_function_table *fn; /* the above field _must_ be first in the structure */ Socket s; int bufsize; int term_width, term_height; void *frontend; } *Rlogin; static void rlogin_size(void *handle, int width, int height); static void c_write(Rlogin rlogin, char *buf, int len) { int backlog = from_backend(rlogin->frontend, 0, buf, len); sk_set_frozen(rlogin->Rlogin rlogin = (Rlogin) plug; if (rlogin->s) { sk_close(rlogin->s); rlogin->Rlogin rlogin = (Rlogin) plug; if (urgent == 2) { char c; c = *data++; len--; if (c == '\x80') rlogin_size(rlogin, rlogin->term_width, rlogin->rlogin, data, len); } return 1; } static void rlogin_sent(Plug plug, int bufsize) { Rlogin rlogin = (Rlogin) plug; rlogin-> void **backconst struct plug_function_table fn_table = { rlogin_closing, rlogin_receive, rlogin_sent }; SockAddr addr; char *err; Rlogin rlogin; rlogin = smalloc(sizeof(*rlogin)); rlogin->fn = &fn_table; rlogin->s = NULL; rlogin->frontend = frontend_handle; rlogin->term_width = cfg.width; rlogin->term_height = cfg.height; *backend_handle = rloginrlogin->s = new_connection(addr, *realhost, port, 1, 0, nodelay, (Plug) rlogin); if ((err = sk_socket_error(rlogin->rlogin->s, &z, 1); sk_write(rlogin->s, cfg.localusername, strlen(cfg.localusername)); sk_write(rlogin->s, &z, 1); sk_write(rlogin->s, cfg.username, strlen(cfg.username)); sk_write(rlogin->s, &z, 1); sk_write(rlogin->s, cfg.termtype, strlen(cfg.termtype)); sk_write(rlogin->s, "/", 1); for (p = cfg.termspeed; isdigit(*p); p++); sk_write(rlogin->s, cfg.termspeed, p - cfg.termspeed); rlogin->bufsize = sk_write(rlogin->void *handle, char *buf, int len) { Rlogin rlogin = (Rlogin) handle; if (rlogin->s == NULL) return 0; rlogin->bufsize = sk_write(rlogin->s, buf, len); return rlogin->bufsize; } /* * Called to query the current socket sendability status. */ static int rlogin_sendbuffer(void *handle) { Rlogin rlogin = (Rlogin) handle; return rlogin->bufsize; } /* * Called to set the size of the window */ static void rlogin_size(void *handle, int width, int height) { Rlogin rlogin = (Rlogin) handle;->term_width = width; rlogin->term_height = height; if (rlogin->s == NULL) return; b[6] = rlogin->term_width >> 8; b[7] = rlogin->term_width & 0xFF; b[4] = rlogin->term_height >> 8; b[5] = rlogin->term_height & 0xFF; rlogin->bufsize = sk_write(rlogin->s, b, 12); return; } /* * Send rlogin special codes. */ static void rlogin_special(void *handle, *handle) { Rlogin rlogin = (Rlogin) handle; return rlogin->s; } static int rlogin_sendok(void *handle) { Rlogin rlogin = (Rlogin) handle; return 1; } static void rlogin_unthrottle(void *handle, int backlog) { Rlogin rlogin = (Rlogin) handle; sk_set_frozen(rlogin->s, backlog > RLOGIN_MAX_BACKLOG); } static int rlogin_ldisc(void *handle, int option) { Rlogin rlogin = (Rlogin) handle; return 0; } static int rlogin_exitcode(void *handle) { Rlogin rlogin = (Rlogin) handle; Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1e53c713c06369ff794619310aaab0c4 Text-delta-base-sha1: c1baa849cbf9f021494159b57713b8c91c57dfff Text-content-length: 717 Text-content-md5: 733190f9fdd5cda7705bc918a2666279 Text-content-sha1: d47c38f008459b9a604fd2df7667072938753aab Content-length: 757 K 15 cvs2svn:cvs-rev V 4 1.92 PROPS-END SVNj/33 33e _ .OFn:3c3,a_@nHcu,A;#|!@ebackhandle(backhandle)backhandle) != NULL) { char ch; back->special(backhandle, &backhandlebackhandle, backhandle, "\001", 1);/* scp protocol error prefix */ back->send(backhandle, ackhandle, ackhandle, buf, strlen(buf)); back->send(backhandle, name, strlen(name)); back->send(backhandle, backhandle, backhandlebackhandle, ackhandle, buf, strlen(buf)); back->send(backhandle, name, strlen(name)); back->send(backhandle, backhandle, backhandle, backhandle, backhandle, backhandle, backhandle, backhandle) != NULL) { char ch; back->special(backhandle, Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6939b351f66330607d7ad29cbe644dee Text-delta-base-sha1: 3121c074d5a148779f97edaa9e40088adb174de3 Text-content-length: 82624 Text-content-md5: 842e58983d2bd46a057fca38f2468cde Text-content-sha1: a5ff560ba39131d27b2e8c3ad9458999d038eb40 Content-length: 82665 K 15 cvs2svn:cvs-rev V 5 1.225 PROPS-END SVN8YwQZJC/ ~vskY}D<oj"f +r) s*uu,~Gcc'cUI8mFhA c m#d:rtUzOFN{s @os'54"lUZ n xCDGF|>`88hKz%TM@G~;bIx:o!(xRwPw{?],;6XW,$I>BxL/WU NmxL=zlX yEP8rEe2;[6ay %t?&SxyW+>*O2r| k ~N X"7hPrfV Ry_xYwe'%_a5q! zAr, Bvg87fZAv0e|(!g VG^<.:;yu]57-@e H# / m|r]#`Oa# =Z5tE[.1E+IGi5sWrd$N4 U!`nz6&&,?aj@ @ pvIP8b 0[730K=|kVU= C%LlrS^BUvF{/oMJ<Px/|T[,B'Tg}E ~e} pE|NCe} UIs|Ip/9 v~1e} cre} /b}b6g  D Xpv:lN$7uqDfULe,2\F0Cu'9:XsvP6$\6aqpt7rc UuuUv->state = SSH_STATE_CLOSED, \ (ssh->s ? sk_close(ssh->s), ssh->#define translate(x) if (type == x) return #x #define translatec(x,ctx) if (type == x && (pkt_ctx, (v) { int *crLine = &v; switch(v) { case 0:; #define crState(t) \ struct t *s; \ if (!ssh->t) ssh->t = smalloc(sizeof(struct t)); \ s = ssh->t; #define crFinish(z) } *crLine = 0; return (z); } #define crFinishV } *crLine = 0; return; } #define crReturn(z) \ do {\ *crLine =__LINE__; return (z); case __LINE__:;\ } while (0) #define crReturnV \ do {\ *crLine=__LINE__; return; case __LINE__:;\ } while (0) #define crStop(z) do{ *crLine = 0; return (z); }while(0) #define crStopV do{ *typedef struct ssh_tag *Ssh;Ssh, int pkt_type); static void ssh2_pkt_addbool(Ssh, unsigned char value); static void ssh2_pkt_adduint32(Ssh, unsigned long value); static void ssh2_pkt_addstring_start(Ssh); static void ssh2_pkt_addstring_str(Ssh, char *data); static void ssh2_pkt_addstring_data(Ssh, char *data, int len); static void ssh2_pkt_addstring(Ssh, char *data); static char *ssh2_mpint_fmt(Bignum b, int *len); static void ssh2_pkt_addmp(Ssh, Bignum b); static int ssh2_pkt_construct(Ssh); static void ssh2_pkt_send(SshSsh ssh; /* pointer back to main context */void ssh1_protocol(Ssh ssh, Ssh ssh, unsigned char *in, int inlen, int ispkt); static void ssh_size(void *handle, int width, int height); static void ssh_special(void *handle, int len); static void ssh_throttle_all(Ssh ssh, ssh_sendbuffer(void *handle); ; ; struct ssh_tag { const struct plug_function_table *fn; /* the above field _must_ be first in the structure */ SHA_State exhash, exhashbase; Socket s; unsigned char session_key[32]; int v1_compressing; int v1_remote_protoflags; int v1_local_protoflags; int agentfwd_enabled; int X11_fwd_enabled; int remote_bugs; const struct ssh_cipher *cipher; const struct ssh2_cipher *cscipher, *sccipher; const struct ssh_mac *csmac, *scmac; const struct ssh_compress *cscomp, *sccomp; const struct ssh_kex *kex; const struct ssh_signkey *hostkey; unsigned char v2_session_id[20]; char *savedhost; int savedport; int send_ok; int echoing, editing; void *frontend; int term_width, term_height; tree234 *channels; /* indexed by local id */ struct ssh_channel *mainchan; /* primary session channel */ int exitcode; tree234 *rportfwds; enum { SSH_STATE_PREPACKET, SSH_STATE_BEFORE_SIZE, SSH_STATE_INTERMED, SSH_STATE_SESSION, SSH_STATE_CLOSED } state; int size_needed, eof_needed; struct Packet pktin; struct Packet pktout; unsigned char *deferred_send_data; int deferred_len, deferred_size; /* * Gross hack: pscp will try to start SFTP but fall back to * scp1 if that fails. This variable is the means by which * scp.c can reach into the SSH code and find out which one it * got. */ int fallback_cmd; /* * Used for username and password input. */ char *userpass_input_buffer; int userpass_input_buflen; int userpass_input_bufpos; int userpass_input_echo; char *portfwd_strptr; int pkt_ctx; int version; int v1_throttle_count; int overall_bufsize; int throttled_all; int v1_stdout_throttling; int v2_outgoing_sequence; int ssh1_rdpkt_crstate; int ssh2_rdpkt_crstate; int do_ssh_init_crstate; int ssh_gotdata_crstate; int ssh1_protocol_crstate; int do_ssh1_login_crstate; int do_ssh2_transport_crstate; int do_ssh2_authconn_crstate; void *do_ssh_init_state; void *do_ssh1_login_state; void *do_ssh2_transport_state; void *do_ssh2_authconn_state; struct rdpkt1_state_tag rdpkt1_state; struct rdpkt2_state_tag rdpkt2_state; void (*protocol) (Ssh ssh, unsigned char *in, int inlen, int ispkt); int (*s_rdpkt) (Ssh ssh, unsigned char **data, int *datalen); }Ssh ssh->->->channels, &i, ssh_channelfind)); } return low + 1 + CHANNEL_NUMBER_OFFSET; } static void c_write(Ssh ssh, ssh->frontend, 1, buf, len); } static void c_write_untrusted(Ssh ssh, ssh, "\r\n", 2); else if ((buf[i] & 0x60) || (buf[i] == '\r')) c_write(ssh, buf + i, 1); } } static void c_write_str(Ssh ssh, char *buf) { c_write(ssh, Ssh ssh, ssh->rdpkt1_state; crBegin(ssh->ssh1_rdpkt_crstate); next_packet: ssh->pktin.type = 0; ssh->ssh->pktin.length = st->len - 5; if (ssh->pktin.maxlen < st->biglen) { ssh->pktin.maxlen = st->biglen; ssh->pktin.data = srealloc(ssh->pktin.data, st->biglen + APIEXTRA); } st->to_read = st->biglen; st->p = ssh->ssh->cipher && detect_attack(ssh->ssh->cipher) ssh->cipher->decrypt(ssh->pktin.data, st->biglen); st->realcrc = crc32(ssh->pktin.data, st->biglen - 4); st->gotcrc = GET_32BIT(ssh->ssh->pktin.body = ssh->pktin.data + st->pad + 1; if (ssh->v1_compressing) { unsigned char *decompblk; int decomplen; zlib_decompress_block(ssh->pktin.body - 1, ssh->pktin.length + 1, &decompblk, &decomplen); if (ssh->pktin.maxlen < st->pad + decomplen) { ssh->pktin.maxlen = st->pad + decomplen; ssh->pktin.data = srealloc(ssh->pktin.data, ssh->pktin.maxlen + APIEXTRA); ssh->pktin.body = ssh->pktin.data + st->pad + 1; } memcpy(ssh->pktin.body - 1, decompblk, decomplen); sfree(decompblk); ssh->pktin.length = decomplen - 1; } ssh->pktin.type = ssh->pktin.body[-1]; log_packet(PKT_INCOMING, ssh->pktin.type, ssh1_pkt_type(ssh->pktin.type), ssh->pktin.body, ssh->pktin.length); if (ssh->pktin.type == SSH1_SMSG_STDOUT_DATA || ssh->pktin.type == SSH1_SMSG_STDERR_DATA || ssh->pktin.type == SSH1_MSG_DEBUG || ssh->pktin.type == SSH1_SMSG_AUTH_TIS_CHALLENGE || ssh->pktin.type == SSH1_SMSG_AUTH_CCARD_CHALLENGE) { long stringlen = GET_32BIT(ssh->pktin.body); if (stringlen + 4 != ssh->pktin.length) { bombout(("Received data packet with bogus string length")); crReturn(0); } } if (ssh->ssh->ssh->pktin.body + 4, stringlen); buf[8 + stringlen] = '\0'; logevent(buf); goto next_packet; } else if (ssh->ssh->ssh->ssh->Ssh ssh, unsigned char **data, int *datalen) { struct rdpkt2_state_tag *st = &ssh->rdpkt2_state; crBegin(ssh->ssh2_rdpkt_crstate); next_packet: ssh->pktin.type = 0; ssh->pktin.length = 0; if (ssh->sccipher) st->cipherblk = ssh->sccipher->blksize; else st->cipherblk = 8; if (st->cipherblk < 8) st->cipherblk = 8; if (ssh->pktin.maxlen < st->cipherblk) { ssh->pktin.maxlen = st->cipherblk; ssh->pktin.data = srealloc(ssh->pktin.data, st->cipherblk + APIEXTRAssh->pktin.data[st->i] = *(*data)++; (*datalen)--; } if (ssh->sccipher) ssh->sccipher->decrypt(ssh->ssh->pktin.data); st->pad = ssh->ssh->sh->scmac ? ssh->scmac->len : 0; /* * Adjust memory allocation if packet is too big. */ if (ssh->pktin.maxlen < st->packetlen + st->maclen) { ssh->pktin.maxlen = st->packetlen + st->maclen; ssh->pktin.data = srealloc(ssh->pktin.data, ssh->pktin.maxlen + APIEXTRAssh->pktin.data[st->i] = *(*data)++; (*datalen)--; } /* Decrypt everything _except_ the MAC. */ if (ssh->sccipher) ssh->sccipher->decrypt(ssh->pktin.data + st->cipherblk, st->packetlen - st->cipherblk); /* * Check the MAC. */ if (ssh->scmac && !ssh->scmac->verify(ssh->pktin.data, st->len + 4, sh->sccomp && ssh->sccomp->decompress(ssh->pktin.data + 5, ssh->pktin.length - 5, &newpayload, &newlen)) { if (ssh->pktin.maxlen < newlen + 5) { ssh->pktin.maxlen = newlen + 5; ssh->pktin.data = srealloc(ssh->pktin.data, ssh->pktin.maxlen + APIEXTRA); } ssh->pktin.length = 5 + newlen; memcpy(ssh->pktin.data + 5, newpayload, newlen); sfree(newpayload); } } ssh->pktin.savedpos = 6; ssh->pktin.type = ssh->pktin.data[5]; log_packet(PKT_INCOMING, ssh->pktin.type, ssh2_pkt_type(ssh->pkt_ctx, ssh->pktin.type), ssh->pktin.data+6, ssh->pktin.length-6); switch (ssh->ssh->pktin.data + 6); unsigned msglen = GET_32BIT(ssh->ssh->ssh->pktin.body[6]; */ int stringlen = GET_32BIT(ssh->(int)(sizeof(buf)-prefix-1)) stringlen = sizeof(buf)-prefix-1; memcpy(buf + prefix, ssh->ssh, SSH2_MSG_UNIMPLEMENTED); ssh2_pkt_adduint32(ssh, st->incoming_sequence - 1); ssh2_pkt_send(ssh); break; } crFinish(0); } static void ssh1_pktout_size(Ssh ssh, ssh->pktout.length = len - 5; if (ssh->pktout.maxlen < biglen) { ssh->ssh->pktout.data = srealloc(ssh->pktout.data, biglen + 12); #else ssh->pktout.data = srealloc(ssh->pktout.data, biglen + 4); #endif } ssh->pktout.body = ssh->pktout.data + 4 + pad + 1; } static void s_wrpkt_start(Ssh ssh, int type, int len) { ssh1_pktout_size(ssh, len); ssh->pktout.type = type; } static int s_wrpkt_prepare(Ssh ssh) { int pad, len, biglen, i; unsigned long crc; ssh->pktout.body[-1] = ssh->pktout.type; log_packet(PKT_OUTGOING, ssh->pktout.type, ssh1_pkt_type(ssh->pktout.type), ssh->pktout.body, ssh->pktout.length); if (ssh->vssh->pktout.body - 1, ssh->pktout.length + 1, &compblk, &complen); ssh1_pktout_size(ssh, complen - 1); memcpy(ssh->pktout.body - 1, compblk, complen); sfree(compblk); } len = ssh->ssh->pktout.data[i + 4] = random_byte(); crc = crc32(ssh->pktout.data + 4, biglen - 4); PUT_32BIT(ssh->pktout.data + biglen, crc); PUT_32BIT(ssh->pktout.data, len); if (ssh->cipher) ssh->cipher->encrypt(ssh->Ssh ssh) { int len, backlog; len = s_wrpkt_prepare(ssh); backlog = sk_write(ssh->s, ssh->pktout.data, len); if (backlog > SSH_MAX_BACKLOG) ssh_throttle_all(ssh, 1, backlog); } static void s_wrpkt_defer(Ssh ssh) { int len; len = s_wrpkt_prepare(ssh); if (ssh->deferred_len + len > ssh->deferred_size) { ssh->deferred_size = ssh->deferred_len + len + 128; ssh->deferred_send_data = srealloc(ssh->deferred_send_data, ssh->deferred_size); } memcpy(ssh->deferred_send_data + ssh->deferred_len, ssh->pktout.data, len); ssh->Ssh ssh, ssh, pkttype, pktlen); p = ssh->Ssh ssh, ssh, pkttype, ap1, ap2); s_wrpkt(ssh); } static void defer_packet(Ssh ssh, ssh, pkttype, ap1, ap2); s_wrpkt_defer(sshSsh ssh, int length) { if (ssh->pktout.maxlen < length) { ssh->pktout.maxlen = length + 256; ssh->pktout.data = srealloc(ssh->pktout.data, ssh->pktout.maxlen + APIEXTRA); if (!ssh->pktout.data) fatalbox("Out of memory"); } } static void ssh2_pkt_adddata(Ssh ssh, void *data, int len) { ssh->pktout.length += len; ssh2_pkt_ensure(ssh, ssh->pktout.length); memcpy(ssh->pktout.data + ssh->pktout.length - len, data, len); } static void ssh2_pkt_addbyte(Ssh ssh, unsigned char byte) { ssh2_pkt_adddata(ssh, &byte, 1); } static void ssh2_pkt_init(Ssh ssh, int pkt_type) { ssh->pktout.length = 5; ssh2_pkt_addbyte(ssh, (unsigned char) pkt_type); } static void ssh2_pkt_addbool(Ssh ssh, unsigned char value) { ssh2_pkt_adddata(ssh, &value, 1); } static void ssh2_pkt_adduint32(Ssh ssh, ssh, x, 4); } static void ssh2_pkt_addstring_start(Ssh ssh) { ssh2_pkt_adduint32(ssh, 0); ssh->pktout.savedpos = ssh->pktout.length; } static void ssh2_pkt_addstring_str(Ssh ssh, char *data) { ssh2_pkt_adddata(ssh, data, strlen(data)); PUT_32BIT(ssh->pktout.data + ssh->pktout.savedpos - 4, ssh->pktout.length - ssh->pktout.savedpos); } static void ssh2_pkt_addstring_data(Ssh ssh, char *data, int len) { ssh2_pkt_adddata(ssh, data, len); PUT_32BIT(ssh->pktout.data + ssh->pktout.savedpos - 4, ssh->pktout.length - ssh->pktout.savedpos); } static void ssh2_pkt_addstring(Ssh ssh, char *data) { ssh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_str(ssh, Ssh sshsh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_data(ssh, ssh->Ssh ssh) { int cipherblk, maclen, padding, i; log_packet(PKT_OUTGOING, ssh->pktout.data[5], ssh2_pkt_type(ssh->pkt_ctx, ssh->pktout.data[5]), ssh->pktout.data + 6, ssh->ssh->cscomp && ssh->cscomp->compress(ssh->pktout.data + 5, ssh->pktout.length - 5, &newpayload, &newlen)) { ssh->pktout.length = 5; ssh2_pkt_adddata(ssh, ssh->cscipher ? ssh->cscipher->blksize : 8; ssh->pktout.length + padding) % cipherblk) % cipherblk; maclen = ssh->csmac ? ssh->csmac->len : 0; ssh2_pkt_ensure(ssh, ssh->pktout.length + padding + maclen); ssh->pktout.data[4] = padding; for (i = 0; i < padding; i++) ssh->pktout.data[ssh->pktout.length + i] = random_byte(); PUT_32BIT(ssh->pktout.data, ssh->pktout.length + padding - 4); if (ssh->csmac) ssh->csmac->generate(ssh->pktout.data, ssh->pktout.length + padding, ssh->v2_outgoing_sequence); ssh->v2_outgoing_sequence++; /* whether or not we MACed */ if (ssh->cscipher) ssh->cscipher->encrypt(ssh->pktout.data, ssh->pktout.length + padding); /* Ready-to-send packet starts at ssh->pktout.data. We return length. */ return ssh->Ssh ssh) { int len; int backlog; len = ssh2_pkt_construct(ssh); backlog = sk_write(ssh->s, ssh->pktout.data, len); if (backlog > SSH_MAX_BACKLOG) ssh_throttle_all(ssh, Ssh ssh) { int len = ssh2_pkt_construct(ssh); if (ssh->deferred_len + len > ssh->deferred_size) { ssh->deferred_size = ssh->deferred_len + len + 128; ssh->deferred_send_data = srealloc(ssh->deferred_send_data, ssh->deferred_size); } memcpy(ssh->deferred_send_data + ssh->deferred_len, ssh->pktout.data, len); ssh->Ssh ssh) { int backlog; backlog = sk_write(ssh->s, ssh->deferred_send_data, ssh->deferred_len); ssh->deferred_len = ssh->deferred_size = 0; sfree(ssh->deferred_send_data); ssh->ssh, Ssh ssh) { unsigned long value; if (ssh->pktin.length - ssh->ssh->pktin.data + ssh->pktin.savedpos); ssh->pktin.savedpos += 4; return value; } static int ssh2_pkt_getbool(Ssh ssh) { unsigned long value; if (ssh->pktin.length - ssh->ssh->pktin.data[ssh->pktin.savedpos] != 0; ssh->pktin.savedpos++; return value; } static void ssh2_pkt_getstring(Ssh ssh, char **p, int *length) { *p = NULL; *length = 0; if (ssh->pktin.length - ssh->pktin.savedpos < 4) return; *length = GET_32BIT(ssh->pktin.data + ssh->pktin.savedpos); ssh->pktin.savedpos += 4; if (ssh->pktin.length - ssh->pktin.savedpos < *length) return; *p = ssh->pktin.data + ssh->pktin.savedpos; ssh->pktin.savedpos += *length; } static Bignum ssh2_pkt_getmp(Ssh ssh) { char *p; int length; Bignum b; ssh2_pkt_getstring(ssh, Ssh ssh, ->ssh); ssh2_pkt_addstring_data(ssh, ssh, ssh, newlen, 1); /* dmemdump(newlen, 1); */ } ssh2_pkt_addstring_data(ssh, ssh); ssh2_pkt_addstring_data(ssh, Ssh ssh, ->->->->->->->->Ssh ssh, unsigned char c) { struct do_ssh_init_state { int vslen; char version[10]; char *vstring; int vstrsize; int i; int proto1, proto2; }; crState(do_ssh_init_state); crBegin(ssh->do_ssh_init_crstate); /* Search for the string "SSH-" in the input. */ s->s->i = transS[s->i]; else if (c == 'H') s->i = transH[s->i]; else if (c == '-') s->i = transminus[s->i]; else s->i = 0; if (s->i < 0) break; crReturn(1); /* get another character */ } s->vstrsize = 16; s->vstring = smalloc(s->vstrsize); strcpy(s->vstring, "SSH-"); s->vslen = 4; s->i = 0; while (1) { crReturn(1); /* get another char */ if (s->vslen >= s->vstrsize - 1) { s->vstrsize += 16; s->vstring = srealloc(s->vstring, s->vstrsize); } s->vstring[s->vslen++] = c; if (s->i >= 0) { if (c == '-') { s->version[s->i] = '\0'; s->i = -1; } else if (s->i < sizeof(s->version) - 1) s->version[s->i++] = c; } else if (c == '\n') break; } ssh->agentfwd_enabled = FALSE; ssh->rdpkt2_state.incoming_sequence = 0; s->vstring[s->vslen] = 0; s->vstring[strcspn(s->vstring, "\r\n")] = '\0';/* remove EOL chars */ { char *vlog; vlog = smalloc(20 + s->vslen); sprintf(vlog, "Server version: %s", s->vstring); logevent(vlog); sfree(vlog); } ssh_detect_bugs(ssh, s->vstrins->proto1 = ssh_versioncmp(s->s->proto2 = ssh_versioncmp(s->version, "1.99") >= 0; if (cfg.sshprot == 0 && !s->s->s->proto2 && (cfg.sshprot >= 2 || !s->ssh->ssh->exhashbase, verstring, strlen(verstring)); sha_string(&ssh->exhashbase, s->vstring, strcspn(s->sh->s, verstring, strlen(verstring)); ssh->protocol = ssh2_protocol; ssh->version = 2; ssh->s->version, "1.5") <= 0 ? s->version : "1.5"), sshver logevent("Using SSH protocol version 1"); sk_write(ssh->s, verstring, strlen(verstring)); ssh->protocol = ssh1_protocol; ssh->version = 1; ssh->s_rdpkt = ssh1_rdpkt; } ssh->state = SSH_STATE_BEFORE_SIZE; sfree(s->vstring); crFinish(0); } static void ssh_gotdata(Ssh ssh, unsigned char *data, int datalen) { crBegin(ssh->ssh_gotdata_crstate) /* need not be kept across crReturn */ if (datalen == 0) crReturnV; /* more data please */ ret = do_ssh_init(ssh, sh->s_rdpkt(ssh, &data, &datalen) == 0) { if (ssh->state == SSH_STATE_CLOSED) { return; } ssh->protocol(ssh, NULL, 0, 1); if (ssh->Ssh ssh = (Ssh) plug; ssh->state = SSH_STATE_CLOSED; if (ssh->s) { sk_close(ssh->s); ssh->Ssh ssh = (Ssh) plug; ssh_gotdata(ssh, data, len); if (ssh->state == SSH_STATE_CLOSED) { if (ssh->s) { sk_close(ssh->s); ssh->s = NULL; } return 0; } return 1; } static void ssh_sent(Plug plug, int bufsize) { Ssh ssh = (Ssh) plug;ssh, Ssh ssh, char *host, int port, char **realhost, int nodelay) { static const struct plug_function_table fn_table = { ssh_closing, ssh_receive, ssh_sent, NULL }; SockAddr addr; char *err; ssh->savedhost = smalloc(1 + strlen(host)); if (!ssh->savedhost) fatalbox("Out of memory"); strcpy(ssh->savedhost, host); if (port < 0) port = 22; /* default ssh port */ ssh->savedport = port;sh->fn = &fn_table; ssh->s = new_connection(addr, *realhost, port, 0, 1, nodelay, (Plug) ssh); if ((err = sk_socket_error(ssh->s))) { ssh->s = NULL; return err; }Ssh ssh, int adjust) { int old_count = ssh->v1_throttle_count; ssh->v1_throttle_count += adjust; assert(ssh->v1_throttle_count >= 0); if (ssh->v1_throttle_count && !old_count) { sk_set_frozen(ssh->s, 1); } else if (!ssh->v1_throttle_count && old_count) { sk_set_frozen(ssh->Ssh ssh, int enable, int bufsize) { int i; struct ssh_channel *c; if (enable == ssh->throttled_all) return; ssh->throttled_all = enable; ssh->overall_bufsize = bufsize; if (!ssh->channels) return; for (i = 0; NULL != (c = index234(ssh->outines * reusable in several places - even between SSH1 and SSH2. */Ssh ssh, char *buffer, int buflen, int echo) { ssh->userpass_input_buffer = buffer; ssh->userpass_input_buflen = buflen; ssh->userpass_input_bufpos = 0; ssh->Ssh ssh, ->userpass_input_buffer[ssh->userpass_input_bufpos] = 0; ssh->userpass_input_buffer[ssh->userpass_input_buflen-1] = 0; return +1; break; case 8: case 127: if (ssh->userpass_input_bufpos > 0) { if (ssh->userpass_input_echo) c_write_str(ssh, "\b \b"); ssh->userpass_input_bufpos--; } break; case 21: case 27: while (ssh->userpass_input_bufpos > 0) { if (ssh->userpass_input_echo) c_write_str(ssh, "\b \b"); ssh->->userpass_input_bufpos < ssh->userpass_input_buflen-1) { ssh->userpass_input_buffer[ssh->userpass_input_bufpos++] = c; if (ssh->userpass_input_echo) c_write(ssh, Ssh ssh, unsigned char *in, int inlen, int ispkt) { int i, jruct do_ssh1_login_state { int len; unsigned char *rsabuf, *keystr1, *keystr2; unsigned long supported_ciphers_mask, supported_auths_mask; int tried_publickey, tried_agent; int tis_auth_refused, ccard_auth_refused; unsigned char session_id[16]; int cipher_type; char username[100]; void *publickey_blob; int publickey_bloblen; char password[100]; char prompt[200]; int pos; char c; int pwpkt_type; unsigned char request[5], *response, *p; int responselen; int keyi, nkeys; int authed; struct RSAKey key; Bignum challenge; char *commentp; int commentlen; }; crState(do_ssh1_login_state); crBegin(ssh->do_ssh1_login_crstate); if (!ispkt) crWaitUntil(ispkt); if (ssh->ssh->pktin.body, 8); i = makekey(ssh->pktin.body + 8, &servkey, &s->keystr1, 0); j = makekey(ssh->pktin.body + 8 + i, &hostkey, &s->->v1_remote_protoflags = GET_32BIT(ssh->pktin.body + 8 + i + j); s->supported_ciphers_mask = GET_32BIT(ssh->pktin.body + 12 + i + j); s->supported_auths_mask = GET_32BIT(ssh->pktin.body + 16 + i + j); ssh->v1_local_protoflags = ssh->v1_remote_protoflags & SSH1_PROTOFLAGS_SUPPORTED; ssh->v1_local_protoflags |= SSH1_PROTOFLAG_SCREEN_NUMBER; MD5Init(&md5c); MD5Update(&md5c, s->keystr2, hostkey.bytes); MD5Update(&md5c, s->keystr1, servkey.bytes); MD5Update(&md5c, ssh->pktin.body, 8); MD5Final(s->session_id, &md5c); for (i = 0; i < 32; i++) ssh->session_key[i] = random_byte(); s->len = (hostkey.bytes > servkey.bytes ? hostkey.bytes : servkey.bytes); s->rsabuf = smalloc(s->len); if (!s->sh->savedhost, ssh->savedport, "rsa", keystr, fingerprint); sfree(keystr); } for (i = 0; i < 32; i++) { s->rsabuf[i] = ssh->session_key[i]; if (i < 16) s->rsabuf[i] ^= s->session_id[i]; } if (hostkey.bytes > servkey.bytes) { rsaencrypt(s->rsabuf, 32, &servkey); rsaencrypt(s->rsabuf, servkey.bytes, &hostkey); } else { rsaencrypt(s->rsabuf, 32, &hostkey); rsaencrypt(s->int is->s->s->cipher_type = SSH_CIPHER_DES; cipher_string = "single-DES"; break; } if (s->supported_ciphers_mask & (1 << s->cipher_type)) cipher_chosen = 1; } } if (!cipher_chosen) { if ((s->s->ssh, SSH1_CMSG_SESSION_KEY, PKT_CHAR, s->cipher_type, PKT_DATA, cookie, 8, PKT_CHAR, (s->len * 8) >> 8, PKT_CHAR, (s->len * 8) & 0xFF, PKT_DATA, s->rsabuf, s->len, PKT_INT, ssh->vs->rsabuf); ssh->cipher = (s->cipher_type == SSH_CIPHER_BLOWFISH ? &ssh_blowfish_ssh1 : s->cipher_type == SSH_CIPHER_DES ? &ssh_des : &ssh_3des); ssh->cipher->sesskey(ssh->session_key); crWaitUntil(ispkt); if (ssh->s->username, sizeof(s->->state = SSH_STATE_CLOSED; crReturn(1); } } else { int ret; /* need not be kept over crReturn */ c_write_str(ssh, "login as: "); ssh->send_ok = 1; setup_userpass_input(ssh, s->username, sizeof(s->username), 1); do { crWaitUntil(!ispkt); ret = process_userpass_input(ssh, in, inlen); } while (ret == 0); if (ret < 0) cleanup_exit(0); c_write_str(ssh, "\r\n"); } } else { strncpy(s->username, cfg.username, sizeof(s->username)); s->username[sizeof(s->username)-1] = '\0'; } send_packet(ssh, SSH1_CMSG_USER, PKT_STR, s->username, PKT_END); { char userlog[22 + sizeof(s->username)]; sprintf(userlog, "Sent username \"%s\"", s->ssh, userlog); } } } crWaitUntil(ispkt); if ((ssh->s->tried_publickey = s->tried_agent = 1; } else { s->tried_publickey = s->tried_agent = 0; } s->tis_auth_refused = s-> &s->publickey_blob, &s->publickey_bloblen)) s->publickey_blob = NULL; } else s->publickey_blob = NULL; while (ssh->pktin.type == SSH1_SMSG_FAILURE) { s->pwpkt_type = SSH1_CMSG_AUTH_PASSWORD; if (agent_exists() && !s->void *r; s->authed = FALSE; s->s->request, 1); s->request[4] = SSH1_AGENTC_REQUEST_RSA_IDENTITIES; agent_query(s->request, 5, &r, &s->responselen); s->response = (unsigned char *) r; if (s->response && s->responselen >= 5 && s->response[4] == SSH1_AGENT_RSA_IDENTITIES_ANSWER) { s->p = s->response + 5; s->nkeys = GET_32BIT(s->p); s->p += 4; { char buf[64]; sprintf(buf, "Pageant has %d SSH1 keys", s->nkeys); logevent(buf); } for (s->keyi = 0; s->keyi < s->nkeys; s->keyi++) { { char buf[64]; sprintf(buf, "Trying Pageant key #%d", s->keyi); logevent(buf); } if (s->publickey_blob && !memcmp(s->p, s->publickey_blob, s->s->tried_publickey = 1; } s->p += 4; s->p += ssh1_read_bignum(s->p, &s->key.exponent); s->p += ssh1_read_bignum(s->p, &s->key.modulus); s->commentlen = GET_32BIT(s->p); s->p += 4; s->commentp = s->p; s->p += s->commentlen; send_packet(ssh, SSH1_CMSG_AUTH_RSA, PKT_BIGNUM, s->key.modulus, PKT_END); crWaitUntil(ispkt); if (ssh->ssh->pktin.body, &s->s->key.exponent); len += ssh1_bignum_length(s->key.modulus); len += ssh1_bignum_length(s->s->key.modulus)); q += 4; q += ssh1_write_bignum(q, s->key.exponent); q += ssh1_write_bignum(q, s->key.modulus); q += ssh1_write_bignum(q, s->challenge); memcpy(q, s->ssh, ssh->(ssh, "Authenticated using" " RSA key \""); c_write(ssh, s->commentp, s->commentlen); c_write_str(ssh, "\" from agent\r\n"); } s->s->key.exponent); freebn(s->key.modulus); freebn(s->challenge); if (s->authed) break; } } if (s->authed) break; } if (*cfg.keyfile && !s->tried_publickey) s->pwpkt_type = SSH1_CMSG_AUTH_RSA; if (cfg.try_tis_auth && (s->supported_auths_mask & (1 << SSH1_AUTH_TIS)) && !s->tis_auth_refused) { s->ssh, ssh->ssh, "TIS authentication refused.\r\n"); s->tis_auth_refused = 1; continue; } else { int challengelen = GET_32BIT(ssh->pktin.body); logevent("Received TIS challenge"); if (challengelen > sizeof(s->prompt) - 1) challengelen = sizeof(s->prompt) - 1;/* prevent overrun */ memcpy(s->prompt, ssh->pktin.body + 4, challengelen); /* Prompt heuristic comes from OpenSSH */ strncpy(s->prompt + challengelen, memchr(s->prompt, '\n', challengelen) ? "": "\r\nResponse: ", (sizeof s->prompt) - challengelen); s->prompt[(sizeof s->prompt) - 1] = '\0'; } } if (cfg.try_tis_auth && (s->supported_auths_mask & (1 << SSH1_AUTH_CCARD)) && !s->ccard_auth_refused) { s->pwpkt_type = SSH1_CMSG_AUTH_CCARD_RESPONSE; logevent("Requested CryptoCard authentication"); send_packet(ssh, SSH1_CMSG_AUTH_CCARD, PKT_END); crWaitUntil(ispkt); if (ssh->ssh, "CryptoCard authentication refused.\r\n"); s->ccard_auth_refused = 1; continue; } else { int challengelen = GET_32BIT(ssh->pktin.body); logevent("Received CryptoCard challenge"); if (challengelen > sizeof(s->prompt) - 1) challengelen = sizeof(s->prompt) - 1;/* prevent overrun */ memcpy(s->prompt, ssh->pktin.body + 4, challengelen); strncpy(s->prompt + challengelen, memchr(s->prompt, '\n', challengelen) ? "" : "\r\nResponse: ", sizeof(s->prompt) - challengelen); s->prompt[sizeof(s->prompt) - 1] = '\0'; } } if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { sprintf(s->prompt, "%.90s@%.90s's password: ", s->username, ssh->savedhost); } if (s->ssh, ssh, msgbuf); c_write_str(ssh, "\r\n"); s->ssh, "No passphrase required.\r\n"); goto tryauth; } sprintf(s->s->prompt, s->password, sizeof(s->ssh, ->int ret; /* need not be saved over crReturn */ c_write_untrusted(ssh, s->prompt, strlen(s->prompt)); s->pos = 0; setup_userpass_input(ssh, s->password, sizeof(s->password), 0); do { crWaitUntil(!ispkt); ret = process_userpass_input(ssh, ssh, "\r\n"); } tryauth: if (s->->tried_publickey = 1; { int ret = loadrsakey(cfg.keyfile, &s->key, s->password); if (ret == 0) { c_write_str(ssh, "Couldn't load private key from "); c_write_str(ssh, cfg.keyfile); c_write_str(ssh, ".\r\n"); continue; /* go and try password */ } if (ret == -1) { c_write_str(ssh, "Wrong passphrase.\r\n"); s->tried_publickey = 0; continue; /* try again */ } } /* * Send a public key attempt. */ send_packet(ssh, SSH1_CMSG_AUTH_RSA, PKT_BIGNUM, s->key.modulus, PKT_END); crWaitUntil(ispkt); if (ssh->pktin.type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused if (ssh-> { int i; unsigned char buffer[32]; Bignum challenge, response; ssh1_read_bignum(ssh->pktin.body, &challenge); response = rsadecrypt(challenge, &s->key); freebn(s->key.private_exponent);/* burn the evidence */ for (i = 0; i < 32; i++) { buffer[i] = bignum_byte(response, 31 - i); } MD5Init(&md5c); MD5Update(&md5c, buffer, 32); MD5Update(&md5c, s->session_id, 16); MD5Final(buffer, &md5c); send_packet(ssh, SSH1_CMSG_AUTH_RSA_RESPONSE, PKT_DATA, buffer, 16, PKT_END); freebn(challenge); freebn(response); } crWaitUntil(ispkt); if (ssh->pktin.type == SSH1_SMSG_FAILURE) { if (flags & FLAG_VERBOSE) c_write_str(ssh, "Failed to authenticate with" "ssh->pktin.type != SSH1_SMSG_SUCCESS) { bombout(s->->s->ssh, s->pwpkt_type, PKT_STR, s->password,ssh, ssh); } else if (!(ssh->s; int len; len = strlen(s->password); if (len < sizeof(string)) { ss = string; strcpy(string, s->s = s->password; } logevent("Sending length-padded password"); send_packet(ssh, s->pwpkt_type, PKT_INT, len, PKT_DATA, ss->ssh, s->pwpkt_type, PKT_INT, len, PKT_DATA, s->password, len, PKT_END); } } else { send_packet(ssh, s->pwpkt_type, PKT_STR, s->password, PKT_END); } } logevent("Sent password"); memset(s->password, 0, strlen(s->password)); crWaitUntil(ispkt); if (ssh->ssh, "Access denied\r\n"); logevent("Authentication refused"); } else if (ssh->pktin.type != SSH1_SMSG_SUCCESS) { bombout(("Strange packet received, type %d", ssh->Ssh ssh = c->ssh; ->version == 1) { send_packet(ssh, SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid, PKT_END); } else { ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_send(sshSsh ssh = c->ssh; if (ssh->version == 1) { send_packet(ssh, Ssh ssh = c->ssh; if (ssh->version == 1) { if (c->v.v1.throttling && bufsize < SSH1_BUFFER_LIMIT) { c->v.v1.throttling = 0; ssh1_throttle(ssh, Ssh ssh, unsigned char *in, int inlen, int ispkt) { crBegin(ssh->ssh1_protocol_crstate); random_init(); while (!do_ssh1_login(ssh, in, inlen, ispkt)) { crReturnV; } if (ssh->ssh, SSH1_CMSG_AGENT_REQUEST_FORWARDING, PKT_END); do { crReturnV; } while (!ispkt); if (ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->ssh->->->v1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) { send_packet(ssh, PKT_INT, 0, PKT_END); } else { send_packet(ssh, ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->ssh->->X11_fwd_enabled = TRUE; } } { char typ->rportfwds = newtree234(ssh_rportcmp_ssh1); /* Add port forwardings. */ ssh->portfwd_strptr = cfg.portfwd; while (*ssh->portfwd_strptr) { type = *ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != '\t') sports[n++] = *ssh->portfwd_strptr++; sports[n] = 0; if (*ssh->portfwd_strptr == '\t') ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != ':') host[n++] = *ssh->portfwd_strptr++; host[n] = 0; if (*ssh->portfwd_strptr == ':') ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr) dports[n++] = *ssh->portfwd_strptr++; dports[n] = 0; ssh->portfwd_strptr->ssh, ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crReturnV; } else if (ssh->pktin.type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused port" " forwarding\r\n")ssh, SSH1_CMSG_REQUEST_PTY, PKT_STR, cfg.termtype, PKT_INT, ssh->term_height, PKT_INT, ssh->term_width, PKT_INT, 0, PKT_INT, 0, PKT_CHAR, 0, PKT_END); ssh->state = SSH_STATE_INTERMED; do { crReturnV; } while (!ispkt); if (ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->ssh->pktin.type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused to allocate pty\r\n"); ssh->editing = ssh->echoing = 1; } logevent("Allocated pty"); } else { ssh->editing = ssh->echoing = 1; } if (cfg.compression) { send_packet(ssh, ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->ssh->pktin.type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused to compress\r\n"); } logevent("Started compression"); ssh->v->fallback_cmd = TRUE; } if (*cmd) send_packet(ssh, SSH1_CMSG_EXEC_CMD, PKT_STR, cmd, PKT_END); else send_packet(ssh, SSH1_CMSG_EXEC_SHELL, PKT_END); logevent("Started session"); } ssh->state = SSH_STATE_SESSION; if (ssh->size_needed) ssh_size(ssh, ssh->term_width, ssh->term_height); if (ssh->eof_needed) ssh_special(ssh, TS_EOF); ldisc_send(NULL, 0, 0); /* cause ldisc to notice changes */ ssh->send_ok = 1; ssh->channels = newtree234(ssh_channelcmp); while (1) { crReturnV; if (ispkt) { if (ssh->pktin.type == SSH1_SMSG_STDOUT_DATA || ssh->pktin.type == SSH1_SMSG_STDERR_DATA) { long len = GET_32BIT(ssh->pktin.body); int bufsize = from_backend(ssh->frontend, ssh->pktin.type == SSH1_SMSG_STDERR_DATA, ssh->pktin.body + 4, len); if (!ssh->v1_stdout_throttling && bufsize > SSH1_BUFFER_LIMIT) { ssh->v1_stdout_throttling = 1; ssh1_throttle(ssh, +1); } } else if (ssh->pktin.type == SSH1_MSG_DISCONNECT) { ssh->ssh->->X11_fwd_enabled) { send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(ssh-> c->ssh = sshssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(ssh->ssh->pktin.body); c->localid = alloc_channel_id(ssh->channels, c); send_packet(ssh, Opened X11 forward channel"); } } } else if (ssh->->agentfwd_enabled) { send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(ssh->pktin.body), PKT_END); } else { c = smalloc(sizeof(struct ssh_channel)); c->ssh = ssh; c->remoteid = GET_32BIT(ssh->pktin.body); c->localid = alloc_channel_id(ssh->channels, c); send_packet(ssh, ssh-> c->ssh = ssh; hostsize = GET_32BIT(ssh->pktin.body+4); for(h = host, p = ssh->->ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(ssh->ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(ssh->pktin.body), PKT_END); } else { c->remoteid = GET_32BIT(ssh->pktin.body); c->localid = alloc_channel_id(ssh->channels, c); send_packet(ssh, ssh->ssh->pktin.body); unsigned int localid = GET_32BIT(ssh->pktin.body+4); struct ssh_channel *c; c = find234(ssh->ssh, SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid, PKT_END); } } else if (ssh->pktin.type == SSH1_MSG_CHANNEL_OPEN_FAILURE) { unsigned int remoteid = GET_32BIT(ssh->pktin.body); unsigned int localid = GET_32BIT(ssh->pktin.body+4); struct ssh_channel *c; c = find234(ssh->->channels, c); sfree(c); } } else if (ssh->pktin.type == SSH1_MSG_CHANNEL_CLOSE || ssh->ssh->pktin.body); struct ssh_channel *c; c = find234(ssh->ssh->ssh, ssh->->ssh->ssh->pktin.type == SSH1_MSG_CHANNEL_DATA) { /* Data sent down one of our channels. */ int i = GET_32BIT(ssh->pktin.body); int len = GET_32BIT(ssh->pktin.body + 4); unsigned char *p = ssh->pktin.body + 8; struct ssh_channel *c; c = find234(ssh->%\at/> xhTT`ebe|(7u_s*UB6*~nWl(O,(_;|!y[,8y]p=Y_m)Lw 2 ]A3T r1bq 'L7a bUG.-Z_O)YkcSAl4K"FGl`Ji!Rt]6MumXtI 3K@nOVk^Rt]6Mu *5Rt]6ruYk2)Tv/Rt]5MuEo[@K} naQj_.I<|Y[{4(v-H=y{fRt]a/2-h}Q!GU 2M?~}riokI>]W#Lca,q (DAm.D?#IXm!@az+!0PiXoWw8ok+>}| QBf4Memyf5w\?)sQyJgRS > 0) { int l = min(c->u.a.totallen - c->u.a.lensofar, len); memcpy(c->u.a.message + c->u.a.lensofar, p, l); p += l; lenend_packet(ssh, SSH1_MSG_CHANNEL_DATA, PKT_INT, c->remoteid, PKT_INT, replylen, PKT_DATA, sentreply, replylen, PKT_END) /* agent channels never back up */ break; } if (!c->v.v1.throttling && bufsize > SSH1_BUFFER_LIMIT) { c->v.v1.throttling = 1; ssh1_throttle(ssh, +1); } } } else if (ssh->pktin.type == SSH1_SMSG_SUCCESS) { /* may be from EXEC_SHELL on some servers */ } else if (ssh->pktin.type == SSH1_SMSG_FAILURE) { /* may be from EXEC_SHELL on some servers * if no pty is available or in other odd cases. Ignore */ } else if (ssh->pktin.type == SSH1_SMSG_EXIT_STATUS) { char buf[100]; ssh->exitcode = GET_32BIT(ssh->pktin.body); sprintf(buf, "Server sent command exit status %d", ssh->exitcode); logevent(buf); send_packet(ssh, SSH1_CMSG_EXIT_CONFIRMATION, PKT_END); /* * In case `helpful' firewalls or proxies tack * extra human-readable text on the end of the * session which we might mistake for another * encrypted packet, we close the session once * we've sent EXIT_CONFIRMATION. */ ssh->state = SSH_STATE_CLOSED; crReturnV; } else { bombout(("Strange packet received: type %d", ssh->pktin.type)); crReturnV; } } else { while (inlen > 0) { int len = min(inlen, 512); send_packet(ssh, SSH1_CMSG_STDIN_DATA, PKT_INT, len, PKT_DATA, in, len, PKT_END); in += len; inlen -= len; } } } crFinishV; } /* * Utility routine for decoding comma-separated strings in KEXINIT. */ static int in_commasep_string(char *needle, char *haystack, int haylen) { int needlen = strlen(needle); while (1) { /* * Is it at the start of the string? */ if (haylen >= needlen && /* haystack is long enough */ !memcmp(needle, haystack, needlen) && /* initial match */ (haylen == needlen || haystack[needlen] == ',') /* either , or EOS follows */ ) return 1; /* * If not, search for the next comma and resume after that. * If no comma found, terminate. */ while (haylen > 0 && *haystack != ',') haylen--, haystack++; if (haylen == 0) return 0; haylen--, haystack++; /* skip over Ssh ssh, ->->Ssh ssh, unsigned char *in, int inlen, int ispkt) { struct do_ssh2_transport_state { int nbits, pbits, warn; Bignum p, g, e, f, K; int kex_init_value, kex_reply_value; const struct ssh_mac **maclist; int nmacs; const struct ssh2_cipher *cscipher_tobe; const struct ssh2_cipher *sccipher_tobe; const struct ssh_mac *csmac_tobe; const struct ssh_mac *scmac_tobe; const struct ssh_compress *cscomp_tobe; const struct ssh_compress *sccomp_tobe; char *hostkeydata, *sigdata, *keystr, *fingerprint; int hostkeylen, siglen; void *hkey; /* actual host key */ unsigned char exchange_hash[20]; int n_preferred_ciphers; const struct ssh2_ciphers *preferred_ciphers[CIPHER_MAX]; const struct ssh_compress *preferred_comp; int first_kex; }; crState(do_ssh2_transport_state); crBegin(ssh->do_ssh2_transport_crstate); s->cscipher_tobe = s->sccipher_tobe = NULL; s->csmac_tobe = s->scmac_tobe = NULL; s->cscomp_tobe = s->sccomp_tobe = NULL; random_init(); s->first_kex = 1; { int i; /* * Set up the preferred ciphers. (NULL => warn below here) */ s->n_preferred_ciphers = 0; for (i = 0; i < CIPHER_MAX; i++) { switch (cfg.ssh_cipherlist[i]) { case CIPHER_BLOWFISH: s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_blowfish; break; case CIPHER_DES: if (cfg.ssh2_des_cbc) { s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_des; } break; case CIPHER_3DES: s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_3des; break; case CIPHER_AES: s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_aes; break; case CIPHER_WARN: /* Flag for later. Don't bother if it's the last in * the list. */ if (i < CIPHER_MAX - 1) { s->preferred_ciphers[s->n_preferred_ciphers++] = NULL; } break; } } } /* * Set up preferred compression. */ if (cfg.compression) s->preferred_comp = &ssh_zlib; else s->->remote_bugs & BUG_SSH2_HMAC) s->maclist = buggymacs, s->nmacs = lenof(buggymacs); else s->maclist = macs, s->nmacs = lenof(macs); begin_key_exchange: { int i, j, cipherstr_started; /* * Construct and send our key exchange packet. */ ssh2_pkt_init(ssh, SSH2_MSG_KEXINIT); for (i = 0; i < 16; i++) ssh2_pkt_addbyte(ssh, (unsigned char) random_byte()); /* List key exchange algorithms. */ ssh2_pkt_addstring_start(ssh); for (i = 0; i < lenof(kex_algs); i++) { if (kex_algs[i] == &ssh_diffiehellman_gex && (ssh->remote_bugs & BUG_SSH2_DH_GEX)) continue; ssh2_pkt_addstring_str(ssh, kex_algs[i]->name); if (i < lenof(kex_algs) - 1) ssh2_pkt_addstring_str(ssh, ","); } /* List server host key algorithms. */ ssh2_pkt_addstring_start(ssh); for (i = 0; i < lenof(hostkey_algs); i++) { ssh2_pkt_addstring_str(ssh, hostkey_algs[i]->name); if (i < lenof(hostkey_algs) - 1) ssh2_pkt_addstring_str(ssh, ","); } /* List client->server encryption algorithms. */ ssh2_pkt_addstring_start(ssh); cipherstr_started = 0; for (i = 0; i < s->n_preferred_ciphers; i++) { const struct ssh2_ciphers *c = s->preferred_ciphers[i]; if (!c) continue; /* warning flag */ for (j = 0; j < c->nciphers; j++) { if (cipherstr_started) ssh2_pkt_addstring_str(ssh, ","); ssh2_pkt_addstring_str(ssh, c->list[j]->name); cipherstr_started = 1; } } /* List server->client encryption algorithms. */ ssh2_pkt_addstring_start(ssh); cipherstr_started = 0; for (i = 0; i < s->n_preferred_ciphers; i++) { const struct ssh2_ciphers *c = s->preferred_ciphers[i]; if (!c) continue; /* warning flag */ for (j = 0; j < c->nciphers; j++) { if (cipherstr_started) ssh2_pkt_addstring_str(ssh, ","); ssh2_pkt_addstring_str(ssh, c->list[j]->name); cipherstr_started = 1; } } /* List client->server MAC algorithms. */ ssh2_pkt_addstring_start(ssh); for (i = 0; i < s->nmacs; i++) { ssh2_pkt_addstring_str(ssh, s->maclist[i]->name); if (i < s->nmacs - 1) ssh2_pkt_addstring_str(ssh, ","); } /* List server->client MAC algorithms. */ ssh2_pkt_addstring_start(ssh); for (i = 0; i < s->nmacs; i++) { ssh2_pkt_addstring_str(ssh, s->maclist[i]->name); if (i < s->nmacs - 1) ssh2_pkt_addstring_str(ssh, ","); } /* List client->server compression algorithms. */ ssh2_pkt_addstring_start(ssh); for (i = 0; i < lenof(compressions) + 1; i++) { const struct ssh_compress *c = i == 0 ? s->preferred_comp : compressions[i - 1]; ssh2_pkt_addstring_str(ssh, c->name); if (i < lenof(compressions)) ssh2_pkt_addstring_str(ssh, ","); } /* List server->client compression algorithms. */ ssh2_pkt_addstring_start(ssh); for (i = 0; i < lenof(compressions) + 1; i++) { const struct ssh_compress *c = i == 0 ? s->preferred_comp : compressions[i - 1]; ssh2_pkt_addstring_str(ssh, c->name); if (i < lenof(compressions)) ssh2_pkt_addstring_str(ssh, ","); } /* List client->server languages. Empty list. */ ssh2_pkt_addstring_start(ssh); /* List server->client languages. Empty list. */ ssh2_pkt_addstring_start(ssh); /* First KEX packet does _not_ follow, because we're not that brave. */ ssh2_pkt_addbool(ssh, FALSE); /* Reserved. */ ssh2_pkt_adduint32(ssh, 0); } ssh->exhash = ssh->exhashbase; sha_string(&ssh->exhash, ssh->pktout.data + 5, ssh->pktout.length - 5); ssh2_pkt_send(ssh); if (!ispkt) crWaitUntil(ispkt); sha_string(&ssh->exhash, ssh->pktin.data + 5, ssh->{ char *str; int i, j, len; if (ssh->pktin.type != SSH2_MSG_KEXINIT) { bombout(("expected key exchange packet from server")); crReturn(0); } ssh->kex = NULL; ssh->hostkey = NULL; s->cscipher_tobe = NULL; s->sccipher_tobe = NULL; s->csmac_tobe = NULL; s->scmac_tobe = NULL; s->cscomp_tobe = NULL; s->sccomp_tobe = NULL; ssh->pktin.savedpos += 16; /* skip garbage cookie */ ssh2_pkt_getstring(ssh, &str, &len); /* key exchange algorithms */ for (i = 0; i < lenof(kex_algs); i++) { if (kex_algs[i] == &ssh_diffiehellman_gex && (ssh->remote_bugs & BUG_SSH2_DH_GEX)) continue; if (in_commasep_string(kex_algs[i]->name, str, len)) { ssh->kex = kex_algs[i]; break; } } ssh2_pkt_getstring(ssh, &str, &len); /* host key algorithms */ for (i = 0; i < lenof(hostkey_algs); i++) { if (in_commasep_string(hostkey_algs[i]->name, str, len)) { ssh->hostkey = hostkey_algs[i]; break; } } ssh2_pkt_getstring(ssh, &str, &len); /* client->server cipher */ s->warn = 0; for (i = 0; i < s->n_preferred_ciphers; i++) { const struct ssh2_ciphers *c = s->preferred_ciphers[i]; if (!c) { s->warn = 1; } else { for (j = 0; j < c->nciphers; j++) { if (in_commasep_string(c->list[j]->name, str, len)) { s->cscipher_tobe = c->list[j]; break; } } } if (s->cscipher_tobe) { if (s->warn) askcipher(s->cscipher_tobe->name, 1); break; } } if (!s->cscipher_tobe) { bombout(("Couldn't agree a client-to-server cipher (available: %s)", str)); crReturn(0); } ssh2_pkt_getstring(ssh, &str, &len); /* server->client cipher */ s->warn = 0; for (i = 0; i < s->n_preferred_ciphers; i++) { const struct ssh2_ciphers *c = s->preferred_ciphers[i]; if (!c) { s->warn = 1; } else { for (j = 0; j < c->nciphers; j++) { if (in_commasep_string(c->list[j]->name, str, len)) { s->sccipher_tobe = c->list[j]; break; } } } if (s->sccipher_tobe) { if (s->warn) askcipher(s->sccipher_tobe->name, 2); break; } } if (!s->sccipher_tobe) { bombout(("Couldn't agree a server-to-client cipher (available: %s)", str)); crReturn(0); } ssh2_pkt_getstring(ssh, &str, &len); /* client->server mac */ for (i = 0; i < s->nmacs; i++) { if (in_commasep_string(s->maclist[i]->name, str, len)) { s->csmac_tobe = s->maclist[i]; break; } } ssh2_pkt_getstring(ssh, &str, &len); /* server->client mac */ for (i = 0; i < s->nmacs; i++) { if (in_commasep_string(s->maclist[i]->name, str, len)) { s->scmac_tobe = s->maclist[i]; break; } } ssh2_pkt_getstring(ssh, &str, &len); /* client->server compression */ for (i = 0; i < lenof(compressions) + 1; i++) { const struct ssh_compress *c = i == 0 ? s->preferred_comp : compressions[i - 1]; if (in_commasep_string(c->name, str, len)) { s->cscomp_tobe = c; break; } } ssh2_pkt_getstring(ssh, &str, &len); /* server->client compression */ for (i = 0; i < lenof(compressions) + 1; i++) { const struct ssh_compress *c = i == 0 ? s->preferred_comp : compressions[i - 1]; if (in_commasep_string(c->name, str, len)) { s->sccomp_tobe = c; break; }s->cscipher_tobe->keylen; scbits = s->sccipher_tobe->keylen; s->s->nbits > 160) s->ssh->->pkt_ctx |= SSH2_PKTCTX_DHGEX; /* * Work out how big a DH group we will need to allow that * much data. */ s->pbits = 512 << ((s->nbits - 1) / 64); ssh2_pkt_init(ssh, SSH2_MSG_KEX_DH_GEX_REQUEST); ssh2_pkt_adduint32(ssh, s->pbits); ssh2_pkt_send(ssh); crWaitUntil(ispkt); if (ssh->s->p = ssh2_pkt_getmp(ssh); s->g = ssh2_pkt_getmp(ssh); dh_setup_group(s->p, s->g); s->kex_init_value = SSH2_MSG_KEX_DH_GEX_INIT; s->kex_reply_value = SSH2_MSG_KEX_DH_GEX_REPLY; } else { ssh->pkt_ctx |= SSH2_PKTCTX_DHGROUP1; dh_setup_group1(); s->kex_init_value = SSH2_MSG_KEXDH_INIT; s->s->e = dh_create_e(s->nbits * 2); ssh2_pkt_init(ssh, s->kex_init_value); ssh2_pkt_addmp(ssh, s->e); ssh2_pkt_send(ssh); crWaitUntil(ispkt); if (ssh->pktin.type != s->ssh, &s->hostkeydata, &s->hostkeylen); s->f = ssh2_pkt_getmp(ssh); ssh2_pkt_getstring(ssh, &s->sigdata, &s->siglen); s->K = dh_find_K(s->f); sha_string(&ssh->exhash, s->hostkeydata, s->hostkeylen); if (ssh->kex == &ssh_diffiehellman_gex) { sha_uint32(&ssh->exhash, s->pbits); sha_mpint(&ssh->exhash, s->p); sha_mpint(&ssh->exhash, s->g); } sha_mpint(&ssh->exhash, s->e); sha_mpint(&ssh->exhash, s->f); sha_mpint(&ssh->exhash, s->K); SHA_Final(&ssh->exhash, s->s->exchange_hash, 20); #endif s->hkey = ssh->hostkey->newkey(s->hostkeydata, s->hostkeylen); if (!s->hkey || !ssh->hostkey->verifysig(s->hkey, s->sigdata, s->siglen, s->s->keystr = ssh->hostkey->fmtkey(s->hkey); s->fingerprint = ssh->hostkey->fingerprint(s->hkey); verify_ssh_host_key(ssh->savedhost, ssh->savedport, ssh->hostkey->keytype, s->keystr, s->fingerprint); if (s->s->fingerprint); } sfree(s->fingerprint); sfree(s->keystr); ssh->hostkey->freekey(s->hkey); /* * Send SSH2_MSG_NEWKEYS. */ ssh2_pkt_init(ssh, SSH2_MSG_NEWKEYS); ssh2_pkt_send(sshssh->ssh->cscipher = s->cscipher_tobe; ssh->sccipher = s->sccipher_tobe; ssh->csmac = s->csmac_tobe; ssh->scmac = s->scmac_tobe; ssh->cscomp = s->cscomp_tobe; ssh->sccomp = s->sccomp_tobe; ssh->cscomp->compress_init(); ssh->{ unsigned char keyspace[40]; if (s->first_kex) memcpy(ssh->v2_session_id, s->exchange_hash, sizeof(s->exchange_hash)); ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'C',keyspace); ssh->cscipher->setcskey(keyspace); ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'D',keyspace); ssh->sccipher->setsckey(keyspace); ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'A',keyspace); ssh->cscipher->setcsiv(keyspace); ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'B',keyspace); ssh->sccipher->setsciv(keyspace); ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'E',keyspace); ssh->csmac->setcskey(keyspace); ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'F',keyspace); ssh->scmac->setsckey(keyspace); }s->first_kex) { crReturn(0); } s->ssh->Ssh ssh = c->ssh; ssh, SSH2_MSG_CHANNEL_DATA); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_data(ssh, data, len); ssh2_pkt_send(sshSsh ssh = c->ssh; ssh, SSH2_MSG_CHANNEL_WINDOW_ADJUST); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_adduint32(ssh, newwin - c->v.v2.locwindow); ssh2_pkt_send(sshSsh ssh, unsigned char *in, int inlen, int ispkt) { struct do_ssh2_authconn_state { enum { AUTH_INVALID, AUTH_PUBLICKEY_AGENT, AUTH_PUBLICKEY_FILE, AUTH_PASSWORD, AUTH_KEYBOARD_INTERACTIVE } method; enum { AUTH_TYPE_NONE, AUTH_TYPE_PUBLICKEY, AUTH_TYPE_PUBLICKEY_OFFER_LOUD, AUTH_TYPE_PUBLICKEY_OFFER_QUIET, AUTH_TYPE_PASSWORD, AUTH_TYPE_KEYBOARD_INTERACTIVE, AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET } type; int gotit, need_pw, can_pubkey, can_passwd, can_keyb_inter; int tried_pubkey_config, tried_agent, tried_keyb_inter; int kbd_inter_running; int we_are_in; int num_prompts, curr_prompt, echo; char username[100]; int got_username; char pwprompt[200]; char password[100]; void *publickey_blob; int publickey_bloblen; unsigned char request[5], *response, *p; int responselen; int keyi, nkeys; int authed; char *pkblob, *alg, *commentp; int pklen, alglen, commentlen; int siglen, retlen, len; char *q, *agentreq, *ret; int try_send; }; crState(do_ssh2_authconn_state); crBegin(ssh->do_ssh2_authconn_crstate)ssh, SSH2_MSG_SERVICE_REQUEST); ssh2_pkt_addstring(ssh, "ssh-userauth"); ssh2_pkt_send(ssh); crWaitUntilV(ispkt); if (ssh->can be sent back to the * beginning to try another username, if this is configured on. * (If they specify a username in the config, they are never * asked, even if theys->username[0] = '\0'; s->got_username = FALSE; do { /* * Get a username. */ if (s->s->username, sizeof(s->->state = SSH_STATE_CLOSED; crReturnV; } } else { int ret; /* need not be saved across crReturn */ c_write_str(ssh, "login as: "); ssh->send_ok = 1; setup_userpass_input(ssh, s->username, sizeof(s->username), 1); do { crWaitUntilV(!ispkt); ret = process_userpass_input(ssh, in, inlen); } while (ret == 0); if (ret < 0) cleanup_exit(0); } c_write_str(ssh, "\r\n"); s->username[strcspn(s->username, "\n\r")] = '\0'; } else { char stuff[200]; strncpy(s->username, cfg.username, sizeof(s->username)); s->username[sizeof(s->s->username); c_write_str(ssh, stuff); } } s->->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh2_pkt_init(ssh, SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(ssh, s->username); ssh2_pkt_addstring(ssh, "ssh-connection");/* service requested */ ssh2_pkt_addstring(ssh, "none"); /* method */ ssh2_pkt_send(ssh); s->type = AUTH_TYPE_NONE; s->gotit = FALSE; s->we_are_in = FALSE; s->tried_pubkey_config = FALSE; s->tried_agent = FALSE; s->tried_keyb_inter = FALSE; s-> { s->publickey_blob = ssh2_userkey_loadpub(cfg.keyfile, NULL, &s->publickey_bloblen); }ssh, msgbuf); s->publickey_blob = NULL; } } else s->s->gotit) crWaitUntilV(ispkt); while (ssh->ssh, &banner, &size); if (banner) c_write_untrusted(ssh, banner, size); } crWaitUntilV(ispkt); } if (ssh->s->we_are_in = TRUE; break; } if (s->kbd_inter_running && ssh->s->gotit) s->curr_prompt = 0; } else if (ssh->ssh->pktin.type)); crReturnV; } s->ssh->pktin.type == SSH2_MSG_USERAUTH_FAILURE) { char *methods; int methlen; ssh2_pkt_getstring(ssh, &methods, &methlen); s->kbd_inter_running = FALSE; if (!ssh2_pkt_getbool(sshs->type == AUTH_TYPE_NONE) { /* do nothing */ } else if (s->type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD || s->type == AUTH_TYPE_PUBLICKEY_OFFER_QUIET) { if (s->type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD) c_write_str(ssh, "Server refused our key\r\n"); logevent("Server refused public key"); } else if (s->type==ssh, "Access denied\r\n"); logevent("Access denied"); if (s->type == AUTH_TYPE_PASSWORD) { s->we_are_in = FALSE; break; } } } else { c_write_str(ssh, "Further authentication required\r\n"); logevent("Further authentication required"); } s->can_pubkey = in_commasep_string("publickey", methods, methlen); s->s->can_keyb_inter = cfg.try_ki_auth && in_commasep_string("keyboard-interactive", methods, methlen); } s->method = 0; ssh->s->echo = 0; if (!s->method && s->can_pubkey && agent_exists() && !s->tried_agent) { /* * Attempt public-key authentication using Pageant. */ void *r; s->authed = FALSE; ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh->pkt_ctx |= SSH2_PKTCTX_PUBLICKEY; s->s->request, 1); s->request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; agent_query(s->request, 5, &r, &s->responselen); s->response = (unsigned char *) r; if (s->response && s->responselen >= 5 && s->response[4] == SSH2_AGENT_IDENTITIES_ANSWER) { s->p = s->response + 5; s->nkeys = GET_32BIT(s->p); s->s->nkeys); logevent(buf); } for (s->keyi = 0; s->keyi < s->nkeys; s->keyi++) { void *vret; { char buf[64]; sprintf(buf, "Trying Pageant key #%d", s->keyi); logevent(buf); } s->pklen = GET_32BIT(s->p); s->p += 4; if (s->publickey_blob && s->pklen == s->publickey_bloblen && !memcmp(s->p, s->publickey_blob, s->publickey_bloblen)) { logevent("This key matches configured key file"); s->tried_pubkey_config = 1; } s->pkblob = s->p; s->p += s->pklen; s->alglen = GET_32BIT(s->pkblob); s->alg = s->pkblob + 4; s->commentlen = GET_32BIT(s->p); s->p += 4; s->commentp = s->p; s->p += s->commentlen; ssh2_pkt_init(ssh, SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(ssh, s->username); ssh2_pkt_addstring(ssh, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(ssh, "publickey"); /* method */ ssh2_pkt_addbool(ssh, FALSE); /* no signature included */ ssh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_data(ssh, s->alg, s->alglen); ssh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_data(ssh, s->pkblob, s->pklen); ssh2_pkt_send(ssh); crWaitUntilV(ispkt); if (ssh->(ssh, "Authenticating with " "public key \""); c_write(ssh, s->commentp, s->commentlen); c_write_str(ssh, ssh, SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(ssh, s->username); ssh2_pkt_addstring(ssh, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(ssh, "publickey"); /* method */ ssh2_pkt_addbool(ssh, TRUE); ssh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_data(ssh, s->alg, s->alglen); ssh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_data(ssh, s->pkblob, s->pklen); s->siglen = ssh->pktout.length - 5 + 4 + 20; s->len = 1; /* message type */ s->len += 4 + s->pklen; /* key blob */ s->len += 4 + s->siglen; /* data to sign */ s->len += 4; /* flags */ s->agentreq = smalloc(4 + s->len); PUT_32BIT(s->agentreq, s->len); s->q = s->agentreq + 4; *s->q++ = SSH2_AGENTC_SIGN_REQUEST; PUT_32BIT(s->q, s->pklen); s->q += 4; memcpy(s->q, s->pkblob, s->pklen); s->q += s->pklen; PUT_32BIT(s->q, s->siglen); s->q += 4; /* Now the data to be signed... */ PUT_32BIT(s->q, 20); s->q += 4; memcpy(s->q, ssh->v2_session_id, 20); s->q += 20; memcpy(s->q, ssh->pktout.data + 5, ssh->pktout.length - 5); s->q += ssh->pktout.length - 5; /* And finally the (zero) flags word. */ PUT_32BIT(s->q, 0); agent_query(s->agentreq, s->len + 4, &vret, &s->retlen); s->ret = vret; sfree(s->agentreq); if (s->ret) { if (s->ssh, s->pkblob, s->pklen, s->ret + 9, GET_32BIT(s->ret + 5)); ssh2_pkt_send(ssh); s->authed = TRUE; break; } else { logevent ("Pageant failed to answer challenge"); sfree(s->ret); } } } if (s->authed) continue; } } if (!s->method && s->can_pubkey && s->publickey_blob && !s->s->tried_pubkey_config = TRUE; ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh->ssh, SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(ssh, s->username); ssh2_pkt_addstring(ssh, ssh, "publickey"); /* method */ ssh2_pkt_addbool(ssh, FALSE); /* no signature included */ ssh2_pkt_addstring(ssh, algorithm); ssh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_data(ssh, pub_blob, pub_blob_len); ssh2_pkt_send(sshssh->pktin.type != SSH2_MSG_USERAUTH_PK_OK) { s->gotit = TRUE; s->s->pwprompt, "Passphrase for key \"%.100s\": ", comment); s->need_pw = TRUE; } else { s->need_pw = FALSE; } c_write_str(ssh, "Authenticating with public key \""); c_write_str(ssh, comment); c_write_str(ssh, "\"\r\n"); s->method = AUTH_PUBLICKEY_FILE; } } if (!s->method && s->can_keyb_inter && !s->tried_keyb_inter) { s->method = AUTH_KEYBOARD_INTERACTIVE; s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE; s->tried_keyb_inter = TRUE; ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh->pkt_ctx |= SSH2_PKTCTX_KBDINTER; ssh2_pkt_init(ssh, SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(ssh, s->username); ssh2_pkt_addstring(ssh, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(ssh, "keyboard-interactive"); /* method */ ssh2_pkt_addstring(ssh, ""); /* lang */ ssh2_pkt_addstring(ssh, ""); ssh2_pkt_send(ssh); crWaitUntilV(ispkt); if (ssh->pktin.type != SSH2_MSG_USERAUTH_INFO_REQUEST) { if (ssh->pktin.type == SSH2_MSG_USERAUTH_FAILURE) s->gotit = TRUE; logevent("Keyboard-interactive authentication refused"); s->s->kbd_inter_running = TRUE; s->curr_prompt = 0; } if (s->kbd_inter_running) { s->method = AUTH_KEYBOARD_INTERACTIVE; s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE; s->tried_keyb_inter = TRUE; ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh->pkt_ctx |= SSH2_PKTCTX_KBDINTER; if (s->ssh, &name, &name_len); ssh2_pkt_getstring(ssh, &inst, &inst_len); ssh2_pkt_getstring(ssh, &lang, &lang_len); if (name_len > 0) { c_write_untrusted(ssh, name, name_len); c_write_str(ssh, "\r\n"); } if (inst_len > 0) { c_write_untrusted(ssh, inst, inst_len); c_write_str(ssh, "\r\n"); } s->num_prompts = ssh2_pkt_getuint32(sshs->curr_prompt < s->ssh, &prompt, &prompt_len); if (prompt_len > 0) { strncpy(s->pwprompt, prompt, sizeof(s->pwprompt)); s->pwprompt[prompt_len < sizeof(s->pwprompt) ? prompt_len : sizeof(s->pwprompt)-1] = '\0'; } else { strcpy(s->pwprompt, ": "); } s->echo = ssh2_pkt_getbool(ssh); s->need_pw = TRUE; } else s->need_pw = FALSE; } if (!s->method && s->can_passwd) { s->method = AUTH_PASSWORD; ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh->pkt_ctx |= SSH2_PKTCTX_PASSWORD; sprintf(s->pwprompt, "%.90s@%.90s's password: ", s->username, ssh->savedhost); s->need_pw = TRUE; } if (s->need_pw) { if (ssh_get_line) { if (!ssh_get_line(s->pwprompt, s->password, sizeof(s->ssh, SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(ssh,SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(ssh, "No more passwords available" " to try"); ssh2_pkt_addstring(ssh, "en"); /* language tag */ ssh2_pkt_send(ssh->state = SSH_STATE_CLOSED; crReturnV; } } else { int ret; /* need not be saved across crReturn */ c_write_untrusted(ssh, s->pwprompt, strlen(s->pwprompt)); ssh->send_ok = 1; setup_userpass_input(ssh, s->password, sizeof(s->password), s->echo); do { crWaitUntilV(!ispkt); ret = process_userpass_input(ssh, ssh, "\r\n"); } } if (s->s->ssh, "Wrong passphrase\r\n"); s->tried_pubkey_config = FALSE; } else { c_write_str(ssh, "Unable to load private key\r\n"); s->ssh, SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(ssh, s->username); ssh2_pkt_addstring(ssh, ssh, "none"); /* method */ ssh2_pkt_send(ssh); s->ssh, SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(ssh, s->username); ssh2_pkt_addstring(ssh, ssh, "publickey"); /* method */ ssh2_pkt_addbool(ssh, TRUE); ssh2_pkt_addstring(ssh, ssh); ssh2_pkt_addstring_data(ssh, ssh->->v2_session_id, 20); memcpy(sigdata + 24, ssh->pktout.data + 5, ssh->ssh, ssh); s->type = AUTH_TYPE_PUBLICKEY; } } else if (s->ssh, SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(ssh, s->username); ssh2_pkt_addstring(ssh, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(ssh, "password"); ssh2_pkt_addbool(ssh, FALSE); ssh2_pkt_addstring(ssh, s->password); ssh2_pkt_defer(sshssh->cscipher) { int stringlen, i; stringlen = (256 - ssh->deferred_len); stringlen += ssh->cscipher->blksize - 1; stringlen -= (stringlen % ssh->cscipher->blksize); if (ssh->ssh->cscomp->disable_compression(); } ssh2_pkt_init(ssh, SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(ssh); for (i = 0; i < stringlen; i++) { char c = (char) random_byte(); ssh2_pkt_addstring_data(ssh, &c, 1); } ssh2_pkt_defer(ssh); } ssh_pkt_defersend(ssh); logevent("Sent password"); s->type = AUTH_TYPE_PASSWORD; } else if (s->method == AUTH_KEYBOARD_INTERACTIVE) { if (s->curr_prompt == 0) { ssh2_pkt_init(ssh, SSH2_MSG_USERAUTH_INFO_RESPONSE); ssh2_pkt_adduint32(ssh, s->num_prompts); } if (s->need_pw) { /* only add pw if we just got one! */ ssh2_pkt_addstring(ssh, s->password); memset(s->password, 0, sizeof(s->password)); s->curr_prompt++; } if (s->curr_prompt >= s->num_prompts) { ssh2_pkt_send(sshs->gotit = TRUE; } s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE; } else { c_write_str(ssh, "No supported authentication methods" " left to try!\r\n"); logevent("No supported authentications offered." " Disconnecting"); ssh2_pkt_init(ssh, SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(ssh, SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(ssh, "No supported authentication" " methods available"); ssh2_pkt_addstring(ssh, "en"); /* language tag */ ssh2_pkt_send(ssh); ssh->state = SSH_STATE_CLOSED; crReturnV; } } } while (!s->->channels = newtree234(ssh_channelcmp); ssh->mainchan = smalloc(sizeof(struct ssh_channel)); ssh->mainchan->ssh = ssh; ssh->mainchan->localid = alloc_channel_id(ssh); ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring(ssh, "session"); ssh2_pkt_adduint32(ssh, ssh->mainchan->localid); ssh->mainchan->v.v2.locwindow = OUR_V2_WINSIZE; ssh2_pkt_adduint32(ssh, ssh->mainchan->v.v2.locwindow);/* our window size */ ssh2_pkt_adduint32(ssh, 0x4000UL); /* our max pkt size */ ssh2_pkt_send(ssh); crWaitUntilV(ispkt); if (ssh->ssh) != ssh->ssh->mainchan->remoteid = ssh2_pkt_getuint32(ssh); ssh->mainchan->type = CHAN_MAINSESSION; ssh->mainchan->closes = 0; ssh->mainchan->v.v2.remwindow = ssh2_pkt_getuint32(ssh); ssh->mainchan->v.v2.remmaxpkt = ssh2_pkt_getuint32(ssh); bufchain_init(&ssh->mainchan->v.v2.outbuffer); add234(ssh->channels, ssh->ssh, SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_addstring(ssh, "x11-req"); ssh2_pkt_addbool(ssh, 1); /* want reply */ ssh2_pkt_addbool(ssh, 0); /* many connections */ ssh2_pkt_addstring(ssh, proto); ssh2_pkt_addstring(ssh, data); ssh2_pkt_adduint32(ssh, 0); /* screen number */ ssh2_pkt_send(ssh); do { crWaitUntilV(ispkt); if (ssh->ssh); struct ssh_channel *c; c = find234(ssh->c->v.v2.remwindow += ssh2_pkt_getuint32(ssh); } } while (ssh->pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (ssh->pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (ssh->X11 forwarding request:" " packet type %d", ssh->->->rportfwds = newtree234(ssh_rportcmp_ssh2); /* Add port forwardings. */ ssh->portfwd_strptr = cfg.portfwd; while (*ssh->portfwd_strptr) { type = *ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != '\t') sports[n++] = *ssh->portfwd_strptr++; sports[n] = 0; if (*ssh->portfwd_strptr == '\t') ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != ':') host[n++] = *ssh->portfwd_strptr++; host[n] = 0; if (*ssh->portfwd_strptr == ':') ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr) dports[n++] = *ssh->portfwd_strptr++; dports[n] = 0; ssh->portfwd_strptr->ssh, SSH2_MSG_GLOBAL_REQUEST); ssh2_pkt_addstring(ssh, "tcpip-forward"); ssh2_pkt_addbool(ssh, 1);/* want reply */ if (cfg.rport_acceptall) ssh2_pkt_addstring(ssh, "0.0.0.0"); else ssh2_pkt_addstring(ssh, "127.0.0.1"); ssh2_pkt_adduint32(ssh, sport); ssh2_pkt_send(ssh); do { crWaitUntilV(ispkt); if (ssh->pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh2_pkt_getuint32(ssh); struct ssh_channel *c; c = find234(ssh->ssh); } } while (ssh->pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (ssh->pktin.type != SSH2_MSG_REQUEST_SUCCESS) { if (ssh->ssh->ssh, SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_addstring(ssh, "auth-agent-req@openssh.com"); ssh2_pkt_addbool(ssh, 1); /* want reply */ ssh2_pkt_send(ssh); do { crWaitUntilV(ispkt); if (ssh->ssh); struct ssh_channel *c; c = find234(ssh->c->v.v2.remwindow += ssh2_pkt_getuint32(ssh); } } while (ssh->pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (ssh->pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (ssh->agent forwarding request:" " packet type %d", ssh->->ssh, SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); /* recipient channel */ ssh2_pkt_addstring(ssh, "pty-req"); ssh2_pkt_addbool(ssh, 1); /* want reply */ ssh2_pkt_addstring(ssh, cfg.termtype); ssh2_pkt_adduint32(ssh, ssh->term_width); ssh2_pkt_adduint32(ssh, ssh->term_height); ssh2_pkt_adduint32(ssh, 0); /* pixel width */ ssh2_pkt_adduint32(ssh, 0); /* pixel height */ ssh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_data(ssh, "\0", 1); /* TTY_OP_END, no special options */ ssh2_pkt_send(ssh); ssh->state = SSH_STATE_INTERMED; do { crWaitUntilV(ispkt); if (ssh->ssh); struct ssh_channel *c; c = find234(ssh->c->v.v2.remwindow += ssh2_pkt_getuint32(ssh); } } while (ssh->pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (ssh->pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (ssh->ssh->pktin.type)); crReturnV; } c_write_str(ssh, "Server refused to allocate pty\r\n"); ssh->editing = ssh->echoing = 1; } else { logevent("Allocated pty"); } } else { ssh->editing = ssh->->ssh, SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(ssh, ssh->ssh, "subsystem"); ssh2_pkt_addbool(ssh, 1); /* want reply */ ssh2_pkt_addstring(ssh, cmd); } else if (*cmd) { ssh2_pkt_addstring(ssh, "exec"); ssh2_pkt_addbool(ssh, 1); /* want reply */ ssh2_pkt_addstring(ssh, cmd); } else { ssh2_pkt_addstring(ssh, "shell"); ssh2_pkt_addbool(ssh, 1); /* want reply */ } ssh2_pkt_send(ssh); do { crWaitUntilV(ispkt); if (ssh->ssh); struct ssh_channel *c; c = find234(ssh->c->v.v2.remwindow += ssh2_pkt_getuint32(ssh); } } while (ssh->pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (ssh->pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (ssh->shell/command request:" " packet type %d", ssh->->->->state = SSH_STATE_SESSION; if (ssh->size_needed) ssh_size(ssh, ssh->term_width, ssh->term_height); if (ssh->eof_needed) ssh_special(ssh, ->send_ok = 1; while (1) { crReturnV; s->try_send = FALSE; if (ispkt) { if (ssh->pktin.type == SSH2_MSG_CHANNEL_DATA || ssh->ssh); struct ssh_channel *c; c = find234(ssh->ssh->pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA && ssh2_pkt_getuint32(sshssh, ssh->frontend, ssh-> replylen); s->ssh->pktin.type == SSH2_MSG_CHANNEL_EOF) { unsigned i = ssh2_pkt_getuint32(ssh); struct ssh_channel *c; c = find234(ssh->ssh->pktin.type == SSH2_MSG_CHANNEL_CLOSE) { unsigned i = ssh2_pkt_getuint32(ssh); struct ssh_channel *c; c = find234(ssh->ssh, SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_send(ssh); } del234(ssh->->ssh, SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(ssh, SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(ssh, "All open channels closed"); ssh2_pkt_addstring(ssh, "en"); /* language tag */ ssh2_pkt_send(ssh); #endif ssh->ssh->ssh); struct ssh_channel *c; c = find234(ssh->c->v.v2.remwindow += ssh2_pkt_getuint32(ssh); s->try_send = TRUE; } else if (ssh->pktin.type == SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) { unsigned i = ssh2_pkt_getuint32(ssh); struct ssh_channel *c; c = find234(ssh->confirming this */ c->remoteid = ssh2_pkt_getuint32(ssh); c->type = CHAN_SOCKDATA; c->v.v2.remwindow = ssh2_pkt_getuint32(ssh); c->v.v2.remmaxpkt = ssh2_pkt_getuint32(sshssh, SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_send(ssh); } } else if (ssh->ssh); struct ssh_channel *c; c = find234(ssh->->channels, c); sfree(c); } else if (ssh->ssh); ssh2_pkt_getstring(ssh, &type, &typelen); want_reply = ssh2_pkt_getbool(ssh->ssh, SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(ssh, SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(ssh, buf); ssh2_pkt_addstring(ssh, "en"); /* language tag */ ssh2_pkt_send(ssh); connection_fatal("%s", buf); ssh->ssh->->exitcode = ssh2_pkt_getuint32(ssh); sprintf(buf, "Server sent command exit status %d", ssh->ssh, SSH2_MSG_CHANNEL_SUCCESS); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_send(sshssh, SSH2_MSG_CHANNEL_FAILURE); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_send(ssh); } } } else if (ssh->pktin.type == SSH2_MSG_GLOBAL_REQUEST) { char *type; int typelen, want_reply; ssh2_pkt_getstring(ssh, &type, &typelen); want_reply = ssh2_pkt_getbool(sshssh, SSH2_MSG_REQUEST_FAILURE); ssh2_pkt_send(ssh); } } else if (ssh->ssh, &type, &typelen); c = smalloc(sizeof(struct ssh_channel)); c->ssh = ssh; remid = ssh2_pkt_getuint32(ssh); winsize = ssh2_pkt_getuint32(ssh); pktsize = ssh2_pkt_getuint32(ssh); if (typelen == 3 && !memcmp(type, "x11", 3)) { if (!ssh->ssh, &dummy, &dummylen);/* skip address */ pf.sport = ssh2_pkt_getuint32(ssh); realpf = find234(ssh->->ssh, SSH2_MSG_CHANNEL_OPEN_FAILURE); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_adduint32(ssh, SSH2_OPEN_CONNECT_FAILED); ssh2_pkt_addstring(ssh, error); ssh2_pkt_addstring(ssh, "en"); /* language tag */ ssh2_pkt_send(ssh); sfree(c); } else { c->localid = alloc_channel_id(ssh->channels, c); ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_OPEN_CONFIRMATION); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_adduint32(ssh, c->localid); ssh2_pkt_adduint32(ssh, c->v.v2.locwindow); ssh2_pkt_adduint32(ssh, 0x4000UL); /* our max pkt size */ ssh2_pkt_send(sshssh->ssh->mainchan, in, inlen); s->try_send = TRUE; } if (s->->Ssh ssh, unsigned char *in, int inlen, int ispkt) { if (do_ssh2_transport(ssh, in, inlen, ispkt) == 0) return; do_ssh2_authconn(ssh, void **backend_handle, char *host, int port, char **realhost, int nodelay) { char *p; Ssh ssh; ssh = smalloc(sizeof(*ssh)); ssh->s = NULL; ssh->cipher = NULL; ssh->cscipher = NULL; ssh->sccipher = NULL; ssh->csmac = NULL; ssh->scmac = NULL; ssh->cscomp = NULL; ssh->sccomp = NULL; ssh->kex = NULL; ssh->hostkey = NULL; ssh->exitcode = -1; ssh->state = SSH_STATE_PREPACKET; ssh->size_needed = FALSE; ssh->eof_needed = FALSE; { static const struct Packet empty = { 0, 0, NULL, NULL, 0 }; ssh->pktin = ssh->pktout = empty; } ssh->deferred_send_data = NULL; ssh->deferred_len = 0; ssh->deferred_size = 0; ssh->fallback_cmd = 0; ssh->pkt_ctx = 0; ssh->v2_outgoing_sequence = 0; ssh->ssh1_rdpkt_crstate = 0; ssh->ssh2_rdpkt_crstate = 0; ssh->do_ssh_init_crstate = 0; ssh->ssh_gotdata_crstate = 0; ssh->ssh1_protocol_crstate = 0; ssh->do_ssh1_login_crstate = 0; ssh->do_ssh2_transport_crstate = 0; ssh->do_ssh2_authconn_crstate = 0; ssh->do_ssh_init_state = NULL; ssh->do_ssh1_login_state = NULL; ssh->do_ssh2_transport_state = NULL; ssh->do_ssh2_authconn_state = NULL; *backend_handle = sshssh->frontend = frontend_handle; ssh->term_width = cfg.width; ssh->term_height = cfg.height; ssh->send_ok = 0; ssh->editing = 0; ssh->echoing = 0; ssh->v1_throttle_count = 0; ssh->overall_bufsize = 0; ssh->fallback_cmd = 0; p = connect_to_host(ssh, void *handle, char *buf, int len) { Ssh ssh = (Ssh) handle; if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL) return 0; ssh->protocol(ssh, buf, len, 0); return ssh_sendbuffer(ssh *handle) { Ssh ssh = (Ssh) handle; int override_value; if (ssh == NULL || ssh->s == NULL || ssh->->throttled_all) override_value = ssh->overall_bufsize; if (ssh->version == 1) { return override_value; } else if (ssh->version == 2) { if (!ssh->mainchan || ssh->mainchan->closes > 0) return override_value; else return (override_value + bufchain_size(&ssh->mainchan->v.v2.outbuffer)void *handle, int width, int height) { Ssh ssh = (Ssh) handle; ssh->term_width = width; ssh->term_height = height; switch (ssh->sh->size_needed = TRUE;->version == 1) { send_packet(ssh, SSH1_CMSG_WINDOW_SIZE, PKT_INT, ssh->term_height, PKT_INT, ssh->term_width, PKT_INT, 0, PKT_INT, 0, PKT_END); } else { ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_addstring(ssh, "window-change"); ssh2_pkt_addbool(ssh, 0); ssh2_pkt_adduint32(ssh, ssh->term_width); ssh2_pkt_adduint32(ssh, ssh->term_height); ssh2_pkt_adduint32(ssh, 0); ssh2_pkt_adduint32(ssh, 0); ssh2_pkt_send(sshvoid *handle, Telnet_Special code) { Ssh ssh = (Ssh) handle; if (code == TS_EOF) { if (ssh->ssh->eof_needed = TRUE; return; } if (ssh->version == 1) { send_packet(ssh, SSH1_CMSG_EOF, PKT_END); } else { ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_EOF); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_send(ssh); } logevent("Sent EOF message"); } else if (code == TS_PING) { if (ssh->state == SSH_STATE_CLOSED || ssh->state == SSH_STATE_PREPACKET) return; if (ssh->version == 1) { if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) send_packet(ssh, SSH1_MSG_IGNORE, PKT_STR, "", PKT_END); } else { ssh2_pkt_init(ssh, SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(ssh); ssh2_pkt_send(ssh); } } else { /* do nothing */ } } void *new_sock_channel(void *handle, Socket s) { Ssh ssh = (Ssh) handle; struct ssh_channel *c; c = smalloc(sizeof(struct ssh_channel)); c->ssh = sshssh->void *handle, int bufsize) { Ssh ssh = (Ssh) handle; if (ssh->version == 1) { if (ssh->v1_stdout_throttling && bufsize < SSH1_BUFFER_LIMIT) { ssh->v1_stdout_throttling = 0; ssh1_throttle(ssh, -1); } } else { if (ssh->mainchan && ssh->mainchan->closes == 0) ssh2_set_window(ssh->mainchan, OUR_V2_WINSIZE - bufsize); } } void ssh_send_port_open(void *handle, void *channel, char *hostname, int port, char *org) { Ssh ssh = (Ssh) handle;->version == 1) { send_packet(ssh, ssh, SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring(ssh, "direct-tcpip"); ssh2_pkt_adduint32(ssh, c->localid); c->v.v2.locwindow = OUR_V2_WINSIZE; ssh2_pkt_adduint32(ssh, c->v.v2.locwindow);/* our window size */ ssh2_pkt_adduint32(ssh, 0x4000UL); /* our max pkt size */ ssh2_pkt_addstring(ssh, hostname); ssh2_pkt_adduint32(ssh, ssh, "client-side-connection"); ssh2_pkt_adduint32(ssh, 0); ssh2_pkt_send(ssh); } } static Socket ssh_socket(void *handle) { Ssh ssh = (Ssh) handle; return ssh->s; } static int ssh_sendok(void *handle) { Ssh ssh = (Ssh) handle; return ssh->send_ok; } static int ssh_ldisc(void *handle, int option) { Ssh ssh = (Ssh) handle; if (option == LD_ECHO) return ssh->echoing; if (option == LD_EDIT) return ssh->editing; return FALSE; } static int ssh_return_exitcode(void *handle) { Ssh ssh = (Ssh) handle; return ssh->exitcode; } /* * Gross hack: pscp will try to start SFTP but fall back to scp1 if * that fails. This variable is the means by which scp.c can reach * into the SSH code and find out which one it got. */ extern int ssh_fallback_cmd(void *handle) { Ssh ssh = (Ssh) handle; return ssh->fallback_cmd Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 80389702a767ffd536dc970d6989365c Text-delta-base-sha1: 10aeeb5977638840d796ba0e9cfbaa246dbc4c55 Text-content-length: 211 Text-content-md5: fb26730e6b02faf9f1981d63f768c5eb Text-content-sha1: 2b32f2f72957ad0d7fc1bdb526d307b342a22d9e Content-length: 251 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNO5f'_p(void *handle) /* Allocate and register a new channel for port forwarding */ void *new_sock_channel(void *handle, Socket s); void ssh_send_port_open(void *handle, void *channel, Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 203733aff352c1b65bdf03e6569b594d Text-delta-base-sha1: ee2fdfbecb8590fd7fc5d129092326257f620816 Text-content-length: 11910 Text-content-md5: 67e4efaaaa0d7bfda862548b4769e40b Text-content-sha1: cc47230a2360d0a72b26cb4dcea05fab06e5de16 Content-length: 11950 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNBz j} |C}<m~XMHum=R>\R}\SmCY0) Bmz]sfu~&&]M^S.=Mw .K `b1dS} Wb]%Hi({y)x$H/1`Rz=|s`89 void *handle, int index; /* index into telnet->opt_states[]initial_state; }; enum { OPTINDEX_NAWS, OPTINDEX_TSPEED, OPTINDEX_TTYPE, OPTINDEX_OENV, OPTINDEX_NENV, OPTINDEX_ECHO, OPTINDEX_WE_SGA, OPTINDEX_THEY_SGA, NUM_OPTS }; static const struct Opt o_naws = { WILL, WONT, DO, DONT, TELOPT_NAWS, OPTINDEX_NAWS, REQUESTED }; static const struct Opt o_tspeed = { WILL, WONT, DO, DONT, TELOPT_TSPEED, OPTINDEX_TSPEED, REQUESTED }; static const struct Opt o_ttype = { WILL, WONT, DO, DONT, TELOPT_TTYPE, OPTINDEX_TTYPE, REQUESTED }; static const struct Opt o_oenv = { WILL, WONT, DO, DONT, TELOPT_OLD_ENVIRON, OPTINDEX_OENV, INACTIVE }; static const struct Opt o_nenv = { WILL, WONT, DO, DONT, TELOPT_NEW_ENVIRON, OPTINDEX_NENV, REQUESTED }; static const struct Opt o_echo = { DO, DONT, WILL, WONT, TELOPT_ECHO, OPTINDEX_ECHO, REQUESTED }; static const struct Opt o_we_sga = { WILL, WONT, DO, DONT, TELOPT_SGA, OPTINDEX_WE_SGA, REQUESTED }; static const struct Opt o_they_sga = { DO, DONT, WILL, WONT, TELOPT_SGA, OPTINDEX_THEY_SGA, REQUESTED }; static const struct Opt *const typedef struct telnet_tag { const struct plug_function_table *fn; /* the above field _must_ be first in the structure */ Socket s; void *frontend; int term_width, term_height; int opt_states[NUM_OPTS]; int echoing, editing; int activated; int bufsize; int in_synch; int sb_opt, sb_len; char *sb_buf; int sb_size; enum { TOP_LEVEL, SEENIAC, SEENWILL, SEENWONT, SEENDO, SEENDONT, SEENSB, SUBNEGOT, SUBNEG_IAC, SEENCR } state; } *Telnet; #define TELNET_MAX_BACKLOG 4096 #define SB_DELTA 1024 static void c_write1(Telnet telnet, telnet->frontend, 0, &cc, 1); sk_set_frozen(telnet->Telnet telnet, ->bufsize = sk_write(telnet->Telnet telnet, const struct Opt *o) { if (telnet->opt_states[o->index] == REQUESTED || telnet->opt_states[o->index] == ACTIVE) send_opt(telnet, o->nsend, o->option); telnet->opt_states[o->index] = REALLY_INACTIVE; } /* * Generate side effects of enabling or disabling an option. */ static void option_side_effects(Telnet telnet, const telnet->echoing = !enabled; else if (o->option == TELOPT_SGA && o->send == DO) telnet->telnet->activated) { if (telnet->opt_states[o_echo.index] == INACTIVE) { telnet->opt_states[o_echo.index] = REQUESTED; send_opt(telnet, o_echo.send, o_echo.option); } if (telnet->opt_states[o_we_sga.index] == INACTIVE) { telnet->opt_states[o_we_sga.index] = REQUESTED; send_opt(telnet, o_we_sga.send, o_we_sga.option); } if (telnet->opt_states[o_they_sga.index] == INACTIVE) { telnet->opt_states[o_they_sga.index] = REQUESTED; send_opt(telnet, o_they_sga.send, o_they_sga.option); } telnet->activated = TRUE; } } static void activate_option(Telnet telnet, const struct Opt *o) { if (o->send == WILL && o->option == TELOPT_NAWS) telnet_size(telnet, telnet->term_width, telnet->telnet, telnet, o, 1); } static void refused_option(Telnet telnet, const struct Opt *o) { if (o->send == WILL && o->option == TELOPT_NEW_ENVIRON && telnet->opt_states[o_oenv.index] == INACTIVE) { send_opt(telnet, WILL, TELOPT_OLD_ENVIRON); telnet->opt_states[o_oenv.index] = REQUESTED; } option_side_effects(telnet, o, 0); } static void proc_rec_opt(Telnet telnet, int cmd, int option) { const struct Opt *const telnet->opt_states[(*o)->index]) { case REQUESTED: telnet->opt_states[(*o)->index] = ACTIVE; activate_option(telnet, *o); break; case ACTIVE: break; case INACTIVE: telnet->opt_states[(*o)->index] = ACTIVE; send_opt(telnet, (*o)->send, option); activate_option(telnet, *o); break; case REALLY_INACTIVE: send_opt(telnet, telnet->opt_states[(*o)->index]) { case REQUESTED: telnet->opt_states[(*o)->index] = INACTIVE; refused_option(telnet, *o); break; case ACTIVE: telnet->opt_states[(*o)->index] = INACTIVE; send_opt(telnet, (*o)->nsend, option); option_side_effects(telnet, telnet, (cmd == WILL ? DONT : WONT), option); } static void process_subneg(Telnet telnet) { unsigned char b[2048], *p, *q; int var, value, n; char *e; switch (telnet->sb_opt) { case TELOPT_TSPEED: if (telnet->sb_len == 1 && telnet->->bufsize = sk_write(telnet->telnet->sb_len == 1 && telnet->->bufsize = sk_write(telnet->telnet->sb_buf; q = p + telnet->telnet->sb_opt)); logevent(logbuf); if (telnet->telnet->->bufsize = sk_write(telnet->s, b, n); sprintf(logbuf, "client:\tSB %s IS %s", telopt(telnet->sb_opt), n == 6 ? "" : ""); logevent(logbuf); } break; } } static void do_telnet_read(Telnet telnet, char *buf, int len) { while (len--) { int c = (unsigned char) *buf++; switch (telnet->state) { case TOP_LEVEL: case SEENCR: if (c == NUL && telnet->state == SEENCR) telnet->state = TOP_LEVEL; else if (c == IAC) telnet->state = SEENIAC; else { if (!telnet->in_synch) c_write1(telnet, telnet->in_synch = 0; #endif if (c == CR) telnet->state = SEENCR; else telnet->state = TOP_LEVEL; } break; case SEENIAC: if (c == DO) telnet->state = SEENDO; else if (c == DONT) telnet->state = SEENDONT; else if (c == WILL) telnet->state = SEENWILL; else if (c == WONT) telnet->state = SEENWONT; else if (c == SB) telnet->state = SEENSB; else if (c == DM) { telnet->in_synch = 0; telnet->telnet, c); } telnet->state = TOP_LEVEL; } break; case SEENWILL: proc_rec_opt(telnet, WILL, c); telnet->state = TOP_LEVEL; break; case SEENWONT: proc_rec_opt(telnet, WONT, c); telnet->state = TOP_LEVEL; break; case SEENDO: proc_rec_opt(telnet, DO, c); telnet->state = TOP_LEVEL; break; case SEENDONT: proc_rec_opt(telnet, DONT, c); telnet->state = TOP_LEVEL; break; case SEENSB: telnet->sb_opt = c; telnet->sb_len = 0; telnet->state = SUBNEGOT; break; case SUBNEGOT: if (c == IAC) telnet->state = SUBNEG_IAC; else { subneg_addchar: if (telnet->sb_len >= telnet->sb_size) { char *newbuf; telnet->sb_size += SB_DELTA; newbuf = (telnet->sb_buf ? srealloc(telnet->sb_buf, telnet->sb_size) : smalloc(telnet->sb_size)); if (newbuf) telnet->sb_buf = newbuf; else telnet->sb_size -= SB_DELTA; } if (telnet->sb_len < telnet->sb_size) telnet->sb_buf[telnet->sb_len++] = c; telnet->telnet); telnet->Telnet telnet = (Telnet) plug; if (telnet->s) { sk_close(telnet->s); telnet->Telnet telnet = (Telnet) plug; if (urgent) telnet->in_synch = TRUE; do_telnet_read(telnet, Telnet telnet = (Telnet) plug; telnet-> void **backend_handle, char *host, int port, char **realhost, int nodelay) { static const; SockAddr addr; char *err; Telnet telnet; telnet = smalloc(sizeof(*telnet)); telnet->fn = &fn_table; telnet->s = NULL; telnet->echoing = TRUE; telnet->editing = TRUE; telnet->activated = FALSE; telnet->sb_buf = NULL; telnet->sb_size = 0; telnet->frontend = frontend_handle; telnet->term_width = cfg.width; telnet->term_height = cfg.height; telnet->state = TOP_LEVEL; *backend_handle = telnetelnet->s = new_connection(addr, *realhost, port, 0, 1, nodelay, (Plug) telnet); if ((err = sk_socket_error(telnet->const struct Opt *const *o; for (o = opts; *o; o++) telnet->opt_states[(*o)->index] = INACTIVE; } else { const struct Opt *const *o; for (o = opts; *o; o++) { telnet->opt_states[(*o)->index] = (*o)->initial_state; if (telnet->opt_states[(*o)->index] == REQUESTED) send_opt(telnet, (*o)->send, (*o)->option); } telnet->activated = TRUE; } /* * Set up SYNCH state. */ telnet->void *handle, char *buf, int len) { Telnet telnet = (Telnet) handle;telnet->->bufsize = sk_write(telnet->s, q, p - q); while (p < buf + len && !iswritable((unsigned char) *p)) { telnet->bufsize = sk_write(telnet->->bufsize; } /* * Called to query the current socket sendability status. */ static int telnet_sendbuffer(void *handle) { Telnet telnet = (Telnet) handle; return telnet->bufsize; } /* * Called to set the size of the window from Telnet's POV. */ static void telnet_size(void *handle, int width, int height) { Telnet telnet = (Telnet) handle; unsigned char b[16]; char logbuf[50]; telnet->term_width = width; telnet->term_height = height; if (telnet->s == NULL || telnet->opt_states[o_naws.index] != ACTIVE) return; b[0] = IAC; b[1] = SB; b[2] = TELOPT_NAWS; b[3] = telnet->term_width >> 8; b[4] = telnet->term_width & 0xFF; b[5] = telnet->term_height >> 8; b[6] = telnet->term_height & 0xFF; b[7] = IAC; b[8] = SE; telnet->bufsize = sk_write(telnet->void *handle, Telnet_Special code) { Telnet telnet = (Telnet) handle; unsigned char b[2]; if (telnet->->bufsize = sk_write(telnet->s, b, 2); break; case TS_BRK: b[1] = BREAK; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_EC: b[1] = EC; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_EL: b[1] = EL; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_GA: b[1] = GA; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_NOP: b[1] = NOP; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_ABORT: b[1] = ABORT; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_AO: b[1] = AO; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_IP: b[1] = IP; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_SUSP: b[1] = SUSP; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_EOR: b[1] = EOR; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_EOF: b[1] = xEOF; telnet->bufsize = sk_write(telnet->s, b, 2); break; case TS_EOL: telnet->bufsize = sk_write(telnet->s, "\r\n", 2); break; case TS_SYNCH: b[1] = DM; telnet->bufsize = sk_write(telnet->s, b, 1); telnet->bufsize = sk_write_oob(telnet->s, b + 1, 1); break; case TS_RECHO: if (telnet->opt_states[o_echo.index] == INACTIVE || telnet->opt_states[o_echo.index] == REALLY_INACTIVE) { telnet->opt_states[o_echo.index] = REQUESTED; send_opt(telnet, o_echo.send, o_echo.option); } break; case TS_LECHO: if (telnet->opt_states[o_echo.index] == ACTIVE) { telnet->opt_states[o_echo.index] = REQUESTED; send_opt(telnet, o_echo.nsend, o_echo.option); } break; case TS_PING: if (telnet->opt_states[o_they_sga.index] == ACTIVE) { b[1] = NOP; telnet->bufsize = sk_write(telnet->s, b, 2); } break; } } static Socket telnet_socket(void *handle) { Telnet telnet = (Telnet) handle; return telnet->s; } static int telnet_sendok(void *handle) { Telnet telnet = (Telnet) handle; return 1; } static void telnet_unthrottle(void *handle, int backlog) { Telnet telnet = (Telnet) handle; sk_set_frozen(telnet->s, backlog > TELNET_MAX_BACKLOG); } static int telnet_ldisc(void *handle, int option) { Telnet telnet = (Telnet) handle; if (option == LD_ECHO) return telnet->echoing; if (option == LD_EDIT) return telnet->editing; return FALSE; } static int telnet_exitcode(void *handle) { Telnet telnet = (Telnet) handle; Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8198e84e5fc180ce0d09e19ac2cbf14e Text-delta-base-sha1: f7b2b103284531f3530531c20211468bb95f8a8d Text-content-length: 1045 Text-content-md5: 827b1f5618e15eedb1039d0b6dc6e85f Text-content-sha1: f14b446e2827cdf6f427a365f1f918b330f80644 Content-length: 1086 K 15 cvs2svn:cvs-rev V 5 1.109 PROPS-END SVNvPlN?NE term->resize_fn = NULL; term->resize_ctx = NULLif (term->resize_fn) term->resize_fn(term->resize_ctx, term->cols, term->rows); } /* * Hand a function and context pointer to the terminal which it can * use to notify a back end of resizes. */ void term_provide_resize_fn(Terminal *term, void (*resize_fn)(void *, int, int), void *resize_ctx) { term->resize_fn = resize_fn; term->resize_ctx = resize_ctx; if (term->cols > 0 && term->rows > 0) resize_fn(resize_ctx, 2mm2= NO_SELECTION; term->selstart.x = term->selstart.y = term->selend.x = term->selend.y = 0; } void term_deselect(Terminal *term) { deselect(term); term_update(term); } int term_ldisc(Terminal *term, int option) { if (option == LD_ECHO) return term->term_echoing; if (option == LD_EDIT) return term->term_editing; return FALSE; } /* * from_backend(), to get data from the backend for the terminal. */ int from_backend(void *vterm, int is_stderr, char *data, int le Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 127e943ac7e12f457017db42e749b598 Text-delta-base-sha1: bd3bd5d9b503b339ea205f69dbd3439c70d3f358 Text-content-length: 82 Text-content-md5: 7512254aada8221f3d33370f3aae9953 Text-content-sha1: 3b7f0a9527a5fcd52cd074c43ecdb374a577528e Content-length: 121 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNJ >K void (*resize_fn)(void *, int, int); void *resize_ctx Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 68508d22d1171919ae28514fb569df5d Text-delta-base-sha1: 458fe66a251054f9e97bc0ab878d29868f7ef58f Text-content-length: 1351 Text-content-md5: 385a5719a4b1e6a9ab4a6348e26e995f Text-content-sha1: 409d038c6f7029b7c518f69b8f90d3f3fb35e4ee Content-length: 1392 K 15 cvs2svn:cvs-rev V 5 1.209 PROPS-END SVNG"<T;S P\X,WV7QZ:qVmUXtuL &backhandle/* * Connect the terminal to the backend for resize purposes. */ term_provide_resize_fn(term, back->size, backhandle);backhandle, backhandle, backhandle, TS_BRK); net_pending_errors(); break; case IDM_TEL_SYNCH: back->special(backhandle, TS_SYNCH); net_pending_errors(); break; case IDM_TEL_EC: back->special(backhandle, backhandle, TS_EL); net_pending_errors(); break; case IDM_TEL_GA: back->special(backhandle, TS_GA); net_pending_errors(); break; case IDM_TEL_NOP: back->special(backhandle, backhandle, TS_ABORT); net_pending_errors(); break; case IDM_TEL_AO: back->special(backhandle, backhandle, TS_IP); net_pending_errors(); break; case IDM_TEL_SUSP: back->special(backhandle, TS_SUSP); net_pending_errors(); break; case IDM_TEL_EOR: back->special(backhandle, backhandle, j)??j20, 22 }; real_palette_set(first[n], r, g, b); if (first[n] >= 18) real_palette_set(first[n] + 1, r, g, b); if (pal) { HDC hdc = get_ctx(); UnrealizeObject(pal); RealizePalette(hdc); free_ctx(hdc); } } void palette_reset(void) { int i; for (i = 0; i < NCOLOURS; i++) { if (pal) { Revision-number: 2128 Prop-content-length: 602 Content-length: 602 K 8 svn:date V 27 2002-10-25T11:50:51.000000Z K 7 svn:log V 501 pty backend now supports the changed function interface, so pterm now compiles and runs again after the major destabilisation. Unfortunately it wasn't feasible to actually encapsulate all of the pty backend's data, since the utmp helper and the need to fork and drop privileges before doing anything else at all rather confuses matters. So the data handle passed around to the pty backend is a null pointer, and the pty backend is just as global-ridden as it always has been. Shame, but such is life. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 28a7c33da0d9695e210e5846cc7556e4 Text-delta-base-sha1: 7594e783c2210eefcb705d4f638531dcf8b3f1b1 Text-content-length: 122 Text-content-md5: c48a1bb981228a2789fedc545ed6ef3d Text-content-sha1: 2204e7becdf7db5071fef4fe6f0b0bc88c580db8 Content-length: 162 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN3R$0WT_)backhandle) >= 0) { int exitcode = back->exitcode(backhandlebackhandle&backhandle Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 383e2361415b36bae558a24b34eea413 Text-delta-base-sha1: 86e255c2ee3d944343773b7cf14149f3157e9f9f Text-content-length: 1096 Text-content-md5: 7474b0bc634d07dacd7bbd924b6cf870 Text-content-sha1: e62e5d4c67f8d9d8f2d99748326dcdece5a30475 Content-length: 1136 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN1 3k2Ff6}Y3b Yn_,r/* * Pseudo-tty backend for pterm. * * Unlike the other backends, data for this one is not neatly * encapsulated into a data structure, because it wouldn't make * sense to do so - the utmp stuff has to be done before a backend * is initialised, and starting a second pterm from the same * process would therefore be infeasible because privileges would * already have been dropped. Hence, I haven't bothered to keep the * data dynamically allocated: instead, the backend handle is just * a null pointer and ignored everywhere. */ void **backend_handle*backend_handle = NULL; /* we can't sensibly use this, sadly */void *handle, *handlevoid *handle, void *handle, *handle) { return NULL; /* shouldn't ever be needed */ } static int pty_sendok(void *handle) { return 1; } static void pty_unthrottle(void *handle, int backlog) { /* do nothing */ } static int pty_ldisc(void *handle, int option) { return 0; /* neither editing nor echoing */ } static int pty_exitcode(void *handle Revision-number: 2129 Prop-content-length: 234 Content-length: 234 K 8 svn:date V 27 2002-10-25T11:58:59.000000Z K 7 svn:log V 133 Fix the nasty flashing-light-grey-on-resize problem, after MCV helpfully alerted me to the existence of gdk_window_set_background(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c48a1bb981228a2789fedc545ed6ef3d Text-delta-base-sha1: 2204e7becdf7db5071fef4fe6f0b0bc88c580db8 Text-content-length: 504 Text-content-md5: 0f3d8b597e72f12d7addc67da539a72f Text-content-sha1: 4f1282d0526960f9b7a69203e934afa5b18ae536 Content-length: 544 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN3,>"wA*Oje@1Jiset_window_background(void) { if (inst->area && inst->area->window) gdk_window_set_background(inst->area->window, &inst->cols[18]); if (inst->window && inst->window->window) gdk_window_set_background(inst->window->window, &inst->cols[18] if (first[n] == 18) set_window_background( set_window_background();/* * Initialise the whole instance structure to zeroes */ memset(inst, 0, sizeof(*inst)set_window_background( Revision-number: 2130 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2002-10-25T12:35:22.000000Z K 7 svn:log V 52 SSH ciphers now use dynamically allocated contexts. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 842e58983d2bd46a057fca38f2468cde Text-delta-base-sha1: a5ff560ba39131d27b2e8c3ad9458999d038eb40 Text-content-length: 1747 Text-content-md5: e2a0e210b0adb5cb168d14bc7fccd417 Text-content-sha1: 235ccc10ea16ad0696b0b0342f1e8e7318265708 Content-length: 1788 K 15 cvs2svn:cvs-rev V 5 1.226 PROPS-END SVN;8qop f vn*_+`-Qvoid *v1_cipher_ctx; const struct ssh2_cipher *cscipher, *sccipher; void *cs_cipher_ctx, *sc_cipher_ctxv1_cipher_ctx, sc_cipher_ctx, sc_cipher_ctx, v1_cipher_ctx, cs_cipher_ctx, v1_cipher_ctx = ssh->cipher->make_context(); ssh->cipher->sesskey(ssh->v1_cipher_ctx, ssh->session_key); { char buf[256]; sprintf(buf, "Initialised %.200s encryption", ssh->cipher->text_name); logevent(buf); }\>ceR+f:f%cr"r&6d(c->u.pfd.s, p, len); break; case CHAN_AGENT: /* Data for an agent message. Buffer it. */ while (len > 0) { if (c->u.a.lensofar < 4) { int l = min(4 - c->u.a.lensofar, len); memcpy(c->u.a.msglen4) { c->u.a.totallen = if (ssh->cs_cipher_ctx) ssh->cscipher->free_context(ssh->cs_cipher_ctx); ssh->cscipher = s->cscipher_tobe; ssh->cs_cipher_ctx = ssh->cscipher->make_context(); if (ssh->sc_cipher_ctx) ssh->sccipher->free_context(ssh->sc_cipher_ctx); ssh->sccipher = s->sccipher_tobe; ssh->sc_cipher_ctx = ssh->sccipher->make_context()key(ssh->cs_cipher_ctx, keyspace); ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'D',keyspace); ssh->sccipher->setkey(ssh->sc_cipher_ctx, iv(ssh->cs_cipher_ctx, iv(ssh->sc_cipher_ctx, { char buf[256]; sprintf(buf, "Initialised %.200s client->server encryption", ssh->cscipher->text_name); logevent(buf); sprintf(buf, "Initialised %.200s server->client encryption", ssh->sccipher->text_name); logevent(buf); } v1_cipher_ctx = NULL; ssh->cscipher = NULL; ssh->cs_cipher_ctx = NULL; ssh->sccipher = NULL; ssh->sc_cipher_ctx Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fb26730e6b02faf9f1981d63f768c5eb Text-delta-base-sha1: 2b32f2f72957ad0d7fc1bdb526d307b342a22d9e Text-content-length: 710 Text-content-md5: 7f891f7fbdb6e748953f9091b1558049 Text-content-sha1: 252cf5b86313eb3a3590ff7bc7cff649a7868cf5 Content-length: 750 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNm .V.i*(*make_context)(void); void (*free_context)(void *); void (*sesskey) (void *, unsigned char *key); /* for ssh 1 */ void (*encrypt) (void *, unsigned char *blk, int len); void (*decrypt) (void *, unsigned char *blk, int len); int blksize; char *text_name; }; struct ssh2_cipher { void *(*make_context)(void); void (*free_context)(void *); void (*setiv) (void *, unsigned char *key); /* for ssh 2 */ void (*setkey) (void *, unsigned char *key);/* for ssh 2 */ void (*encrypt) (void *, unsigned char *blk, int len); void (*decrypt) (void *, unsigned char *blk, int len); char *name; int blksize; int keylen; char *text_name Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b97829de57ccbe2b4e2cd9d62561aa01 Text-delta-base-sha1: e49fdc6b7fdf222950c7d81aed89b8bab3342f6d Text-content-length: 2423 Text-content-md5: 6cd47d3e2c3cc2a895483ac5f59e92ce Text-content-sha1: 8c8bcc8c2c19168c5e003209e67562a0695a87a0 Content-length: 2462 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN6:JI=M=*4u0void *aes_make_context(void) { return smalloc(sizeof(AESContext)); } static void aes_free_context(void *handle) { sfree(handle); } static void aes128_key(void *handle, unsigned char *key) { AESContext *ctx = (AESContext *)handle; aes_setup(ctx, 16, key, 16); } static void aes192_key(void *handle, unsigned char *key) { AESContext *ctx = (AESContext *)handle; aes_setup(ctx, 16, key, 24); } static void aes256_key(void *handle, unsigned char *key) { AESContext *ctx = (AESContext *)handle; aes_setup(ctx, 16, key, 32); } static void aes_iv(void *handle, unsigned char *iv) { AESContext *ctx = (AESContext *)handle; int i; for (i = 0; i < 4; i++) ctx->void *handle, unsigned char *blk, int len) { AESContext *ctx = (AESContext *)handle; aes_encrypt_cbc(blk, len, ctx); } static void aes_ssh2_decrypt_blk(void *handle, unsigned char *blk, int len) { AESContext *ctx = (AESContext *)handle; aes_decrypt_cbc(blk, len, make_context, aes_free_context, aes_iv, aes128_key, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "aes128-cbc", 16, 128, "AES-128" }; static const struct ssh2_cipher ssh_aes192 = { aes_make_context, aes_free_context, aes_iv, aes192_key, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "aes192-cbc", 16, 192, "AES-192" }; static const struct ssh2_cipher ssh_aes256 = { aes_make_context, aes_free_context, aes_iv, aes256_key, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "aes256-cbc", 16, 256, "AES-256" }; static const struct ssh2_cipher ssh_rijndael128 = { aes_make_context, aes_free_context, aes_iv, aes128_key, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "rijndael128-cbc", 16, 128, "AES-128" }; static const struct ssh2_cipher ssh_rijndael192 = { aes_make_context, aes_free_context, aes_iv, aes192_key, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "rijndael192-cbc", 16, 192, "AES-192" }; static const struct ssh2_cipher ssh_rijndael256 = { aes_make_context, aes_free_context, aes_iv, aes256_key, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "rijndael256-cbc", 16, 256, "AES-256" }; static const struct ssh2_cipher ssh_rijndael_lysator = { aes_make_context, aes_free_context, aes_iv, aes256_key, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, "rijndael-cbc@lysator.liu.se", 16, 256, "AES-256" Node-path: putty/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 577378972659b45bf3bb690e2256b785 Text-delta-base-sha1: 5ffdc8f02b03147da64bdbcbb2893b758ddef545 Text-content-length: 2172 Text-content-md5: 4739934381e4ee8aebcd99295e9dfabb Text-content-sha1: 8a8581ef5180419c41552d63d36cbd6bbff0ef94 Content-length: 2212 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNsV`&`P# static void *blowfish_make_context(void) { return smalloc(sizeof(BlowfishContext)); } static void *blowfish_ssh1_make_context(void) { /* In SSH1, need one key for each direction */ return smalloc(2*sizeof(BlowfishContext)); } static void blowfish_free_context(void *handle) { sfree(handle); } static void blowfish_key(void *handle, unsigned char *key) { BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_setkey(ctx, key, 16); } static void blowfish_iv(void *handle, unsigned char *key) { BlowfishContext *ctx = (BlowfishContext *)handle; ctx->iv0 = GET_32BIT_MSB_FIRST(key); ctx->iv1 = GET_32BIT_MSB_FIRST(key + 4); } static void blowfish_sesskey(void *handle, unsigned char *key) { BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_setkey(ctx, key, SSH_SESSION_KEY_LENGTH); ctx->iv0 = 0; ctx->iv1 = 0; ctx[1] = ctx[0]; /* structure copy */ } static void blowfish_ssh1_encrypt_blk(void *handle, unsigned char *blk, int len) { BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_lsb_encrypt_cbc(blk, len, ctx); } static void blowfish_ssh1_decrypt_blk(void *handle, unsigned char *blk, int len) { BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_lsb_decrypt_cbc(blk, len, ctx+1); } static void blowfish_ssh2_encrypt_blk(void *handle, unsigned char *blk, int len) { BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_msb_encrypt_cbc(blk, len, ctx); } static void blowfish_ssh2_decrypt_blk(void *handle, unsigned char *blk, int len) { BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_msb_decrypt_cbc(blk, len, ctx); } const struct ssh_cipher ssh_blowfish_ssh1 = { blowfish_ssh1_make_context, blowfish_free_context, blowfish_sesskey, blowfish_ssh1_encrypt_blk, blowfish_ssh1_decrypt_blk, 8, "Blowfish" }; static const struct ssh2_cipher ssh_blowfish_ssh2 = { blowfish_make_context, blowfish_free_context, blowfish_iv, blowfish_key, blowfish_ssh2_encrypt_blk, blowfish_ssh2_decrypt_blk, "blowfish-cbc", 8, 128, "Blowfish" Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef170b678b2c969d089c862f3c6ba3ea Text-delta-base-sha1: 46e2230bd111d3c4bea66eaf279dec57d8d5938e Text-content-length: 3657 Text-content-md5: 84e20d9a38e899856d71bb3316ccbffe Text-content-sha1: efba07ccb6ab0170b4b25995a1dbab4ecc0b2169 Content-length: 3697 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNHF&19O>]u ~p{D)]u$(D,Q@^?_u6Q@t|1 64 ^xiv0, iv0 = sched->iv1 = 0;iv0; iv1 = sched->sched->iv0 = iv0; sched->iv0; iv1 = sched->iv0 = iv0; sched->iv0; iv1 = scheds->iv0 = iv0; scheds->iv0; iv1 = scheds->iv0 = iv0; scheds->iv1 = iv1; } static void *des3_make_context(void) { return smalloc(3*sizeof(DESContext)); } static void *des3_ssh1_make_context(void) { /* Need 3 keys for each direction, in SSH1 */ return smalloc(6*sizeof(DESContext)); } static void *des_make_context(void) { return smalloc(sizeof(DESContext)); } static void *des_ssh1_make_context(void) { /* Need one key for each direction, in SSH1 */ return smalloc(2*sizeof(DESContext)); } static void des3_free_context(void *handle) /* used for both 3DES and DES */ { sfree(handle); } static void des3_key(void *handle, unsigned char *key) { DESContext *keys = (DESContext *) handlekeys[2]); } static void des3_iv(void *handle, unsigned char *key) { DESContext *keys = (DESContext *) handle; keys[0].iv0 = GET_32BIT_MSB_FIRST(key); keys[0].iv1 = GET_32BIT_MSB_FIRST(key + 4); } static void des_key(void *handle, unsigned char *key) { DESContext *keys = (DESContext *) handlekeys[0]); } static void des3_sesskey(void *handle, unsigned char *key) { DESContext *keys = (DESContext *) handle; des3_key(keys, key); des3_key(keys+3, key); } static void des3_encrypt_blk(void *handle, unsigned char *blk, int len) { DESContext *keys = (DESContext *) handle; des_3cbc_encrypt(blk, blk, len, keys); } static void des3_decrypt_blk(void *handle, unsigned char *blk, int len) { DESContext *keys = (DESContext *) handle; des_3cbc_decrypt(blk, blk, len, keys+3); } static void des3_ssh2_encrypt_blk(void *handle, unsigned char *blk, int len) { DESContext *keys = (DESContext *) handle; des_cbc3_encrypt(blk, blk, len, keys); } static void des3_ssh2_decrypt_blk(void *handle, unsigned char *blk, int len) { DESContext *keys = (DESContext *) handle; des_cbc3_decrypt(blk, blk, len, keys); } static void des_ssh2_encrypt_blk(void *handle, unsigned char *blk, int len) { DESContext *keys = (DESContext *) handle; des_cbc_encrypt(blk, blk, len, keys); } static void des_ssh2_decrypt_blk(void *handle, unsigned char *blk, int len) { DESContext *keys = (DESContext *) handle; des_cbc_decrypt(blk, blk, len, iv0 = GET_32BIT_MSB_FIRST(iv); ourkeys[0].iv0 = GET_32BIT_MSB_FIRST(iv); ourkeys[0].make_context, des3_free_context, des3_iv, des3_key, des3_ssh2_encrypt_blk, des3_ssh2_decrypt_blk, "3des-cbc", 8, 168, "triple-DES"make_context, des3_free_context, des3_iv, des_key, des_ssh2_encrypt_blk, des_ssh2_decrypt_blk, "des-cbc", 8, 56, "single-DES"sh1_make_context, des3_free_context, des3_sesskey, des3_encrypt_blk, des3_decrypt_blk, 8, "triple-DES" }; static void des_sesskey(void *handle, unsigned char *key) { DESContext *keys = (DESContext *) handle; des_key(keys, key); des_key(keys+1, key); } static void des_encrypt_blk(void *handle, unsigned char *blk, int len) { DESContext *keys = (DESContext *) handle; des_cbc_encrypt(blk, blk, len, keys); } static void des_decrypt_blk(void *handle, unsigned char *blk, int len) { DESContext *keys = (DESContext *) handle; des_cbc_decrypt(blk, blk, len, keys+1); } const struct ssh_cipher ssh_des = { des_ssh1_make_context, des3_free_context, des_sesskey, des_encrypt_blk, des_decrypt_blk, 8, "single-DES" }; Revision-number: 2131 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2002-10-25T12:51:28.000000Z K 7 svn:log V 50 SSH2 MACs now use dynamically allocated contexts. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e2a0e210b0adb5cb168d14bc7fccd417 Text-delta-base-sha1: 235ccc10ea16ad0696b0b0342f1e8e7318265708 Text-content-length: 1360 Text-content-md5: cb3d5c7958d1bdedead53de9c208984d Text-content-sha1: 00bc903f2c14451dcbd2ecd63c8e32b426280b2f Content-length: 1401 K 15 cvs2svn:cvs-rev V 5 1.227 PROPS-END SVN"3ge  Jr*nullmac_make_context(void) { return NULL; } static void nullmac_free_context(void *handle) { } static void nullmac_key(void *handle, unsigned char *key) { } static void nullmac_generate(void *handle, unsigned char *blk, int len, unsigned long seq) { } static int nullmac_verify(void *handle, unsigned char *blk, int len, unsigned long seq) { return 1; } const static struct ssh_mac ssh_mac_none = { nullmac_make_context, nullmac_free_context, nullmac_key, void *cs_mac_ctx, *sc_mac_ctxsc_mac_ctx, cs_mac_ctx, ssh->pktout.data, Y.3T<--0Oz O8x pktin.body + 8c) { int bufsize; switch (c->type) { case CHAN_X11: bufsize = x11_send(c->u.x11.s, p, len); break; case CHAN_SOCKDATA: bufsize = pfd_sen if (ssh->cs_mac_ctx) ssh->csmac->free_context(ssh->cs_mac_ctx); ssh->csmac = s->csmac_tobe; ssh->cs_mac_ctx = ssh->csmac->make_context(); if (ssh->sc_mac_ctx) ssh->scmac->free_context(ssh->sc_mac_ctx); ssh->scmac = s->scmac_tobe; ssh->sc_mac_ctx = ssh->scmac->make_context(); key(ssh->cs_mac_ctx, keyspace); ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'F',keyspace); ssh->scmac->setkey(ssh->sc_mac_ctx, _mac_ctx = NULL; ssh->scmac = NULL; ssh->sc_mac_ctx Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7f891f7fbdb6e748953f9091b1558049 Text-delta-base-sha1: 252cf5b86313eb3a3590ff7bc7cff649a7868cf5 Text-content-length: 237 Text-content-md5: 3cb7e52ae9caac9310979cc9c441b067 Text-content-sha1: 4f6c25fdda4021252a27c96d1ffdd086e5c12460 Content-length: 277 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNm U{UK"*(*make_context)(void); void (*free_context)(void *); void (*setkey) (void *, unsigned char *key); void (*generate) (void *, unsigned char *blk, int len, unsigned long seq); int (*verify) (void *, Node-path: putty/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 59c5daa25fb6029e706f04c00e11b031 Text-delta-base-sha1: 24f28dad03a9852870465a1bd088b5c8d61a2963 Text-content-length: 1306 Text-content-md5: ca940d6e99d5dc7d7f5973262586d95f Text-content-sha1: 70e461fb65ed00ae5ec665ee149652ab3c912f70 Content-length: 1345 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN+%ib 01w-w9:'_void *md5_make_context(void) { return smalloc(2*sizeof(struct MD5Context)); } static void md5_free_context(void *handle) { sfree(handle); } static void md5_key_internal(void *handle, unsigned char *key, int len) { struct MD5Context *keys = (struct MD5Context *)handle;&keys[0]); MD5Update(&keys[0], foo, 64); memset(foo, 0x5C, 64); for (i = 0; i < len && i < 64; i++) foo[i] ^= key[i]; MD5Init(&keys[0]); MD5Update(&keys[0], foo, 64); memset(foo, 0, 64); /* burn the evidence */ } static void md5_key(void *handle, unsigned char *key) { md5_key_internal(handle, key, 16); } static void md5_do_hmac(void *handle, unsigned char *blk, int len, unsigned long seq, unsigned char *hmac) { struct MD5Context *keys = (struct MD5Context *)handle;keys[0];keys[1];void *handle, unsigned char *blk, int len, unsigned long seq) { md5_do_hmac(handle, blk, len, seq, blk + len); } static int md5_verify(void *handle, unsigned char *blk, int len, unsigned long seq) { unsigned char correct[16]; md5_do_hmac(handle, blk, len, seq, correct); return !memcmp(correct, blk + len, 16); } const struct ssh_mac ssh_md5 = { md5_make_context, md5_free_context, md5_key, md5_generate, Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 05092292b58f12019963dd7460b06f30 Text-delta-base-sha1: bfc5c80e6b35676d342b5534d4f46a163d04bf44 Text-content-length: 1633 Text-content-md5: 1b7de625ac808c4ece74fc89d55f6da0 Text-content-sha1: 7b6a49551c640fc48698c88d52c2d1968e221e19 Content-length: 1673 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNT/2#~ 4pTS)Xy@+)+void *sha1_make_context(void) { return smalloc(2*sizeof(SHA_State)); } static void sha1_free_context(void *handle) { sfree(handle); } static void sha1_key_internal(void *handle, unsigned char *key, int len) { SHA_State *keys = (SHA_State *)handle;&keys[0]); SHA_Bytes(&keys[0]&keys[1]); SHA_Bytes(&keys[1], foo, 64); memset(foo, 0, 64); /* burn the evidence */ } static void sha1_key(void *handle, unsigned char *key) { sha1_key_internal(handle, key, 20); } static void sha1_key_buggy(void *handle, unsigned char *key) { sha1_key_internal(handle, key, 16); } static void sha1_do_hmac(void *handle, unsigned char *blk, int len, unsigned long seq, unsigned char *hmac) { SHA_State *keys = (SHA_State *)handle;keys[0];keys[1];void *handle, unsigned char *blk, int len, unsigned long seq) { sha1_do_hmac(handle, blk, len, seq, blk + len); } static int sha1_verify(void *handle, unsigned char *blk, int len, unsigned long seq) { unsigned char correct[20]; sha1_do_hmac(handletates[2]; unsigned char intermediate[20]; sha1_key_internal(states, key, keylen); SHA_Bytes(&states[0], data, datalen); SHA_Final(&states[0], intermediate); SHA_Bytes(&states[1], intermediate, 20); SHA_Final(&states[1], output); } const struct ssh_mac ssh_sha1 = { sha1_make_context, sha1_free_context, sha1_key, sha1_generate, sha1_verify, "hmac-sha1", 20 }; const struct ssh_mac ssh_sha1_buggy = { sha1_make_context, sha1_free_context, sha1_key_buggy, sha1_generate, Revision-number: 2132 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2002-10-25T12:58:21.000000Z K 7 svn:log V 66 SSH CRC attack detector now uses a dynamically allocated context. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cb3d5c7958d1bdedead53de9c208984d Text-delta-base-sha1: 00bc903f2c14451dcbd2ecd63c8e32b426280b2f Text-content-length: 371 Text-content-md5: 6322d1070339ccbba7edb9a6d0ea8d6e Text-content-sha1: e295b2922833a400a2c6c351bf6cd5c9a6e0019a Content-length: 412 K 15 cvs2svn:cvs-rev V 5 1.228 PROPS-END SVNLDBWcbvoid *crcdacrcda_ctx, ssh->pktin.data, ssh->crcda_ctx = crcda_make_context(); logevent("Installing CRC compensation attack detector");Y T /* Data sent down one of our channels. */ int i = GET_32BIT(ssh->pktin.body); int len = GET_32BIT(ssh->pktin.body + 4); unsigned char *p = ssh->rcda Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3cb7e52ae9caac9310979cc9c441b067 Text-delta-base-sha1: 4f6c25fdda4021252a27c96d1ffdd086e5c12460 Text-content-length: 162 Text-content-md5: d1d71445fe50d7f405e9be13250a45a6 Text-content-sha1: 757a5b73c0e5dbed76f3a6804dbc3057dd83bb65 Content-length: 202 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNt N void *crcda_make_context(void); void crcda_free_context(void *handle); int detect_attack(void *handle, unsigned char *buf, uint32 len, Node-path: putty/sshcrcda.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cb2117806242305338c896bb7dc85b29 Text-delta-base-sha1: a4c4bb63db7bf3741f1c8baac4071c34b5ff8c8e Text-content-length: 959 Text-content-md5: 0f52c02e2fe989d8b0961889e7e8c3f7 Text-content-sha1: 5c7f863642ab90ab275d7798b1d61331ba57a286 Content-length: 998 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNBr3 ? ih = NULL; ret->n = HASH_MINSIZE / HASH_ENTRYSIZE; return ret; } void crcda_free_context(void *handle) { sfree(handle); }void *handle, uchar *buf, uint32 len, uchar *IV) { struct crcda_ctx *ctx = (struct crcda_ctx *)handlectx->n; l < HASH_FACTOR(len / SSH_BLOCKSIZE); l = l << 2) ; if (ctx->h == NULL) { ctx->n = l; ctx->h = (uint16 *) smalloc(ctx->n * HASH_ENTRYSIZE); } else { if (l > ctx->n) { ctx->n = l; ctx->h = (uint16 *) srealloc(ctx->h, ctx->ctx->h, HASH_UNUSEDCHAR, ctx->n * HASH_ENTRYSIZE); if (IV) ctx->h[HASH(IV) & (ctx->ctx->n - 1); ctx->h[i] != HASH_UNUSED; i = (i + 1) & (ctx->n - 1)) { if (ctx->ctx->ctx-> Revision-number: 2133 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2002-10-25T12:59:57.000000Z K 7 svn:log V 36 Tidy up and fix a compiler warning. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b00030891ae67cf571a5a2aa610beef9 Text-delta-base-sha1: 39395ab7b0adfdac2f118c833cb8c610f5b77135 Text-content-length: 33 Text-content-md5: 2a3c98a3e96632252ab1be0fdf42913e Text-content-sha1: 36328cf79e9d53ba25c2dcb01c713b81a33507a7 Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN.'W!d*const Revision-number: 2134 Prop-content-length: 128 Content-length: 128 K 7 svn:log V 28 Fix some compiler warnings. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-25T13:00:45.000000Z PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8be7d45a9691655779107f0b17db64ce Text-delta-base-sha1: eef781f4ae4adebdba45bc681770ecd5c36b5e3b Text-content-length: 203 Text-content-md5: 6e052018e185130441b4b3b9651cffda Text-content-sha1: 0a4eeab4460a192789d0027dfe2734e73a25590e Content-length: 243 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNu'>"ORT!(int)(sizeof(buffer) - (p-buffer) -1) || p[len-1] != '\n' || p[len-2] == '\\') { if (len > (int)((p-buffer) + sizeof(buffer)-2)(int) Revision-number: 2135 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2002-10-25T13:08:01.000000Z K 7 svn:log V 70 Diffie-Hellman key exchange now uses a dynamically allocated context. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6322d1070339ccbba7edb9a6d0ea8d6e Text-delta-base-sha1: e295b2922833a400a2c6c351bf6cd5c9a6e0019a Text-content-length: 177 Text-content-md5: 249e4647ff9e5b81aa98e263533d1c76 Text-content-sha1: 3d83034a0714bd46a7539a9be2aebf14b712d97e Content-length: 218 K 15 cvs2svn:cvs-rev V 5 1.229 PROPS-END SVN  O void *kex_ctx d$W1}581hnG_CHANNEL_DATA) { ssh->kex_ctx = ssh->kex_ctx = sh->kex_ctx, sh->kex_ctx, ssh->kex_ctx Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d1d71445fe50d7f405e9be13250a45a6 Text-delta-base-sha1: 757a5b73c0e5dbed76f3a6804dbc3057dd83bb65 Text-content-length: 259 Text-content-md5: 01b2a8911cece7bc166b58ae1cd5c87f Text-content-sha1: c821324c7a7db0983478bad8cd4a8c65c921bbb9 Content-length: 299 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVNtdCF7!j const unsigned char *data, int nbytes); int ssh1_read_bignum(const *dh_setup_group1(void); void *dh_setup_group(Bignum pval, Bignum gval); void dh_cleanup(void *); Bignum dh_create_e(void *, int nbits); Bignum dh_find_K(void *, Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7f42466721c5db4cd4064bfb89cafcec Text-delta-base-sha1: 85d2adbcafb8f1f70c4611910868690f6960fb83 Text-content-length: 90 Text-content-md5: ddaac357339cddae0f82ba61e639dd04 Text-content-sha1: cb8bfa8fa9710a16aba847fbefacacb235e39ac1 Content-length: 130 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN="(" uconst const unsigned char *data, Bignum * result) { const Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 353694165d6787bf1f5529ac4dfc2ccd Text-delta-base-sha1: 77b15003ec47f3216e2d06d9667f18cb117322f5 Text-content-length: 1935 Text-content-md5: 56e3e55427b770a921dd9eca69878578 Text-content-sha1: a488184a495593e0190746dc0576435e7b4b2bc4 Content-length: 1975 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN)$)Zvlu+gq':xa&*^constconst unsigned char G[] = { 2 }; /* * Variables. */ struct dh_ctx { Bignum x, e, p, q, qmask, g; }; /* * Common DH initialisation. */ static void dh_init(struct dh_ctx *ctx) { ctx->q = bignum_rshift(ctx->p, 1); ctx->qmask = bignum_bitmask(ctx->q); ctx->x = ctx->e = NULL; } /* * Initialise DH for the standard group1. */ void *dh_setup_group1(void) { struct dh_ctx *ctx = smalloc(sizeof(struct dh_ctx)); ctx->p = bignum_from_bytes(P, sizeof(P)); ctx->g = bignum_from_bytes(G, sizeof(G)); dh_init(ctx); return ctx; } /* * Initialise DH for an alternative group. */ void *dh_setup_group(Bignum pval, Bignum gval) { struct dh_ctx *ctx = smalloc(sizeof(struct dh_ctx)); ctx->p = copybn(pval); ctx->g = copybn(gval); dh_init(ctx); return ctx; } /* * Clean up and free a context. */ void dh_cleanup(void *handle) { struct dh_ctx *ctx = (struct dh_ctx *)handle; freebn(ctx->x); freebn(ctx->e); freebn(ctx->p); freebn(ctx->g); freebn(ctx->q); freebn(ctx->qmask); sfree(ctxvoid *handle, int nbits) { struct dh_ctx *ctx = (struct dh_ctx *)handle; int i; int nbytes; unsigned char *buf; nbytes = ssh1_bignum_length(ctx->ctx->x) freebn(ctx->x); if (nbits == 0 || nbits > bignum_bitcount(ctx->qmask)) { ssh1_write_bignum(buf, ctx->ctx->x); } else { int b, nb; ctx->ctx->x, i, b & 1); b >>= 1; nb--; } } } while (bignum_cmp(ctx->x, One) <= 0 || bignum_cmp(ctx->x, ctx->q) >= 0); /* * Done. Now compute e = g^x mod p. */ ctx->e = modpow(ctx->g, ctx->x, ctx->p); return ctx->e; } /* * DH stage 2: given a number f, compute K = f^x mod p. */ Bignum dh_find_K(void *handle, Bignum f) { struct dh_ctx *ctx = (struct dh_ctx *)handle; Bignum ret; ret = modpow(f, ctx->x, ctx->p); return ret; } Revision-number: 2136 Prop-content-length: 228 Content-length: 228 K 7 svn:log V 127 The Zlib module now uses dynamically allocated contexts. I think that completes the static-removal in the crypto library. Ooh. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-25T13:26:33.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 249e4647ff9e5b81aa98e263533d1c76 Text-delta-base-sha1: 3d83034a0714bd46a7539a9be2aebf14b712d97e Text-content-length: 1900 Text-content-md5: 2361cbb626aa47971e08dde92cbd3067 Text-content-sha1: 87754146b920ac971d7b64c75316feb338a6509a Content-length: 1941 K 15 cvs2svn:cvs-rev V 5 1.230 PROPS-END SVNJ]8ty{xAo3^-p{>&-*ssh_comp_none_init(void) { return NULL; } static void ssh_comp_none_cleanup(void *handle) { } static int ssh_comp_none_block(void *handle, *handlecleanup, ssh_comp_none_block, ssh_comp_none_init, ssh_comp_none_cleanup, ssh_comp_none_block, ssh_comp_none_disable, NULLvoid *cs_comp_ctx, *sc_comp_ctxsc_comp_ctx, sc_comp_ctx, cs_comp_ctx, cs_comp_ctx, ssh->pktout.data + 5, ssh->cs_comp_ctx = zlib_compress_init(); logevent("Initialised zlib (RFC1950) compression"); ssh->sc_comp_ctx = zlib_decompress_init(); logevent("Initialised zlib (RFC1950) decompression"d9+-pGOukCGO@He, PKT_INT, c->remoteid, PKT_END); c->closes |= closetype; /* sent it too */ } if (c->closes == 15) { del234(ssh->channels, c); sfree(c); } } else { bombout(("Received CHANNEL_CLOSE%s for %s channel %d\n", ssh->pktin.type == SSH1_MSG_CHANNEL_CLOSE ? "" : "_CONFIRMATION", c ? "half-open" : "nonexistent", i)); } } else if (ssh->pktin.type == SSH1_MSif (ssh->cs_comp_ctx) ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx); ssh->cscomp = s->cscomp_tobe; ssh->cs_comp_ctx = ssh->cscomp->compress_init(); if (ssh->sc_comp_ctx) ssh->sccomp->decompress_cleanup(ssh->sc_comp_ctx); ssh->sccomp = s->sccomp_tobe; ssh->sc_comp_ctx = ssh->sccomp->decompress_init(); if (ssh->cscomp->text_name) { sprintf(buf, "Initialised %.200s compression", ssh->cscomp->text_name); logevent(buf); } if (ssh->sccomp->text_name) { sprintf(buf, "Initialised %.200s decompression", ssh->sccomp->text_name); logevent(buf); } ssh->cscomp->disable_compression(ssh->cs_comp_ctxcs_comp_ctx = NULL; ssh->sccomp = NULL; ssh->sc_comp_ctx Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 01b2a8911cece7bc166b58ae1cd5c87f Text-delta-base-sha1: c821324c7a7db0983478bad8cd4a8c65c921bbb9 Text-content-length: 617 Text-content-md5: 9a79ed21323bfd4097889e59f3e36874 Text-content-sha1: acd8b5631f3647496c611daf954082cf6223e995 Content-length: 657 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVNiDyt0M%k)*(*compress_init) (void); void (*compress_cleanup) (void *); int (*compress) (void *, unsigned char *block, int len, unsigned char **outblock, int *outlen); void *(*decompress_init) (void); void (*decompress_cleanup) (void *); int (*decompress) (void *, *); char *text_name*zlib_compress_init(void); void zlib_compress_cleanup(void *); void *zlib_decompress_init(void); void zlib_decompress_cleanup(void *); int zlib_compress_block(void *, unsigned char *block, int len, unsigned char **outblock, int *outlen); int zlib_decompress_block(void *, Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b84b6545e1e72126d91ddffdc6118b3e Text-delta-base-sha1: e13f9cad2173c2d8393b11de78142be53de5a643 Text-content-length: 6823 Text-content-md5: ae998ced540fd55e0c26d079b7014cf0 Text-content-sha1: 01a117b8a22ff9420b310af6a9df52d8ea092620 Content-length: 6863 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN:-k8:&J'7z0V1c,CBAwN!Q0!} :E7km^Yg"B.AL>zL>l )hZ}jawg**zlib_compress_init(void) { struct Outbuf *out; struct LZ77Context *ectx = smalloc(sizeof(struct LZ77Context)); lz77_init(ectx); ectx->literal = zlib_literal; ectx->->userdata = out; return ectx; } void zlib_compress_cleanup(void *handle) { struct LZ77Context *ectx = (struct LZ77Context *)handle; sfree(ectx->userdata *handle) { struct LZ77Context *ectx = (struct LZ77Context *)handle; struct Outbuf *out = (struct Outbuf *) ectx->void *handle, LZ77Context *ectx = (struct LZ77Context *)handle; struct Outbuf *out = (struct Outbuf *) ectx->; void *zlib_decompress_init(void) { struct zlib_decompress_ctx *dctx = smalloc(sizeof(struct zlib_decompress_ctx)); unsigned char lengths[288]; ->->staticdisttable = zlib_mktable(lengths, 32); dctx->state = START; /* even before header */ dctx->currlentable = dctx->currdisttable = dctx->lenlentable = NULL; dctx->bits = 0; dctx->nbits = 0; return dctx; } void zlib_decompress_cleanup(void *handle) { struct zlib_decompress_ctx *dctx = (struct zlib_decompress_ctx *)handle; if (dctx->currlentable && dctx->currlentable != dctx->staticlentable) zlib_freetable(&dctx->currlentable); if (dctx->currdisttable && dctx->currdisttable != dctx->staticdisttable) zlib_freetable(&dctx->currdisttable); if (dctx->lenlentable) zlib_freetable(&dctx->lenlentable); sfree(dctxstruct zlib_decompress_ctx *dctx, int c) { dctx->window[dctx->winpos] = c; dctx->winpos = (dctx->winpos + 1) & (WINSIZE - 1); if (dctx->outlen >= dctx->outsize) { dctx->outsize = dctx->outlen + 512; dctx->outblk = srealloc(dctx->outblk, dctx->outsize); } dctx->outblk[dctx->outlen++] = c; } #define EATBITS(n) ( dctx->nbits -= (n), dctx->bits >>= (n) ) int zlib_decompress_block(void *handle, unsigned char *block, int len, unsigned char **outblock, int *outlen) { struct zlib_decompress_ctx *dctx = (struct zlib_decompress_ctx *)handle;->outblk = NULL; dctx->outsize = dctx->outlen = 0; while (len > 0 || dctx->nbits > 0) { while (dctx->nbits < 24 && len > 0) { dctx->bits |= (*block++) << dctx->nbits; dctx->nbits += 8; len--; } switch (dctx->->nbits < 16) goto finished; /* done all we can */ EATBITS(16); dctx->->nbits < 3) goto finished; /* done all we can */ EATBITS(1); blktype = dctx->bits & 3; EATBITS(2); if (blktype == 0) { int to_eat = dctx->nbits & 7; dctx->state = UNCOMP_LEN; EATBITS(to_eat); /* align to byte boundary */ } else if (blktype == 1) { dctx->currlentable = dctx->staticlentable; dctx->currdisttable = dctx->staticdisttable; dctx->state = INBLK; } else if (blktype == 2) { dctx->->nbits < 5 + 5 + 4) goto finished; /* done all we can */ dctx->hlit = 257 + (dctx->bits & 31); EATBITS(5); dctx->hdist = 1 + (dctx->bits & 31); EATBITS(5); dctx->hclen = 4 + (dctx->bits & 15); EATBITS(4); dctx->lenptr = 0; dctx->state = TREES_LENLEN; memset(dctx->lenlen, 0, sizeof(dctx->lenlen)); break; case TREES_LENLEN: if (dctx->nbits < 3) goto finished; while (dctx->lenptr < dctx->hclen && dctx->nbits >= 3) { dctx->lenlen[lenlenmap[dctx->lenptr++]] = (unsigned char) (dctx->bits & 7); EATBITS(3); } if (dctx->lenptr == dctx->hclen) { dctx->lenlentable = zlib_mktable(dctx->lenlen, 19); dctx->state = TREES_LEN; dctx->lenptr = 0; } break; case TREES_LEN: if (dctx->lenptr >= dctx->hlit + dctx->hdist) { dctx->currlentable = zlib_mktable(dctx->lengths, dctx->hlit); dctx->currdisttable = zlib_mktable(dctx->lengths + dctx->hlit, dctx->hdist); zlib_freetable(&dctx->lenlentable); dctx->lenlentable = NULL; dctx->state = INBLK; break; } code = zlib_huflookup(&dctx->bits, &dctx->nbits, dctx->lenlentable); if (code == -1) goto finished; if (code < 16) dctx->lengths[dctx->lenptr++] = code; else { dctx->lenextrabits = (code == 16 ? 2 : code == 17 ? 3 : 7); dctx->lenaddon = (code == 18 ? 11 : 3); dctx->lenrep = (code == 16 && dctx->lenptr > 0 ? dctx->lengths[dctx->lenptr - 1] : 0); dctx->state = TREES_LENREP; } break; case TREES_LENREP: if (dctx->nbits < dctx->lenextrabits) goto finished; rep = dctx->lenaddon + (dctx->bits & ((1 << dctx->lenextrabits) - 1)); EATBITS(dctx->lenextrabits); while (rep > 0 && dctx->lenptr < dctx->hlit + dctx->hdist) { dctx->lengths[dctx->lenptr] = dctx->lenrep; dctx->lenptr++; rep--; } dctx->state = TREES_LEN; break; case INBLK: code = zlib_huflookup(&dctx->bits, &dctx->nbits, dctx->currlentable); if (code == -1) goto finished; if (code < 256) zlib_emit_char(dctx, code); else if (code == 256) { dctx->state = OUTSIDEBLK; if (dctx->currlentable != dctx->staticlentable) { zlib_freetable(&dctx->currlentable); dctx->currlentable = NULL; } if (dctx->currdisttable != dctx->staticdisttable) { zlib_freetable(&dctx->currdisttable); dctx->currdisttable = NULL; } } else if (code < 286) { /* static tree can give >285; ignore */ dctx->state = GOTLENSYM; dctx->sym = code; } break; case GOTLENSYM: rec = &lencodes[dctx->sym - 257]; if (dctx->nbits < rec->extrabits) goto finished; dctx->len = rec->min + (dctx->->state = GOTLEN; break; case GOTLEN: code = zlib_huflookup(&dctx->bits, &dctx->nbits, dctx->currdisttable); if (code == -1) goto finished; dctx->state = GOTDISTSYM; dctx->sym = code; break; case GOTDISTSYM: rec = &distcodes[dctx->sym]; if (dctx->nbits < rec->extrabits) goto finished; dist = rec->min + (dctx->->state = INBLK; while (dctx->len--) zlib_emit_char(dctx, dctx->window[(dctx->winpos - dist) & ->nbits < 16) goto finished; dctx->uncomplen = dctx->bits & 0xFFFF; EATBITS(16); dctx->->nbits < 16) goto finished; nlen = dctx->bits & 0xFFFF; EATBITS(16); if (dctx->uncomplen == 0) dctx->state = OUTSIDEBLK; /* block is empty */ else dctx->state = UNCOMP_DATA; break; case UNCOMP_DATA: if (dctx->nbits < 8) goto finished; zlib_emit_char(dctx, dctx->bits & 0xFF); EATBITS(8); if (--dctx->uncomplen == 0) dctx->->outblk; *outlen = dctx->cleanup, zlib_compress_block, zlib_decompress_init, zlib_decompress_cleanup, zlib_decompress_block, zlib_disable_compression, "zlib (RFC1950)" }; Revision-number: 2137 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2002-10-25T15:18:21.000000Z K 7 svn:log V 96 Distinguish bugs fixed in releases and in snapshots. (XXX version comparison is a bit dubious.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0422cb332325dfc0f4cefb00c27c5738 Text-delta-base-sha1: 722b8f651ea77f3ab66600dbd7cf9e8072908869 Text-content-length: 2249 Text-content-md5: 50719cf1809fc667805db1ba07d34dbe Text-content-sha1: 6c2462e3753da15f66acadbcb0749c303dbdda85 Content-length: 2289 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNx(<;}ro~#! /usr/bin/perl # $Id: bugs2html,v 1.10 2002/10/25 15:18:21we have already addressed. EOF # Classify fixed bugs by when they were fixed my %fixedvers = (); foreach my $bug (grep(exists($bugs{$_}->{"fixed-in"}), @fullbuglist)) { my $class; foreach my $ver (split(' ', $bugs{$bug}->{"fixed-in"})) { $newclass = classifyver($ver); $class = $newclass if (!defined($class) || compareverclass($class, $newclass) > 0); } $fixedvers{$class} = [] unless defined($fixedvers{$class}); push @{$fixedvers{$class}}, $bug; } # Now spit them out in order. foreach my $class (sort compareverclass_s (keys %fixedvers)) { nest(<Fixed in $class
      EOF nest(<Bugs (and semi-bugs)
        EOF my @tmp = grep(($bugs{$_}->{class} eq 'bug' || $bugs{$_}->{class} eq 'semi-bug'), @{$fixedvers{$class}}); subtractbugs(\@fullbuglist, printbugs(\@tmp)); unnest("
      \n"); nest(<Wishes
        EOF my @tmp = grep(($bugs{$_}->{class} eq 'wish'), @{$fixedvers{$class}}); subtractbugs(\@fullbuglist, printbugs(\@tmp)); unnest("
      \n"); unnest("
    \n"); } unnest("# Given a version string, return a canonical textual name # describing it (equivalence class). sub classifyver { my ($ver) = @_; my $name; if ($ver =~ m/^\d{4}-\d{2}-\d{2}$/) { $name = "current snapshots"; } else { $name = "release " . $ver; } return $name; } # Compare function for equivalence classes as returned by classifyver # (version for use with sort) sub compareverclass_s { if ($a eq $b) { return 0; } elsif ($a eq "current snapshots") { return 1; } elsif ($b eq "current snapshots") { return -1; } else { my ($aver, $bver) = ($a, $b); map s/^release //, ($aver, $bver); # Should probably be based on Debian version-compare algorithm. # Hacked for now (would break with 0.5, 0.100, 0.53a etc) return ($aver <=> $bver); } } # Wrapper for compareverclass_s with sensible argument passing sub compareverclass { ($a, $b) = @_; return compareverclass_s( Revision-number: 2138 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2002-10-25T16:28:43.000000Z K 7 svn:log V 58 Add/complete "Difficulty:" headers for a bunch of wishes. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/auth-pref Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3e0556498f15cdbb41ffc7e35c1e9934 Text-delta-base-sha1: 65d8b0a7fc5265db656c77f6ca19c13d748bd42a Text-content-length: 22 Text-content-md5: 46a3fd63cdf911ed3c4192c055f934a2 Text-content-sha1: a4533e22029a6bd132be14fe95c6bece979ff855 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN^aWWfun Node-path: putty-wishlist/data/ctrl-pgupdn Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f9eb376404cf88583f128f73c15aa3bd Text-delta-base-sha1: 5e217d2ecc3cdb4c1c23485abf9aa7eeb96ecaf4 Text-content-length: 22 Text-content-md5: 911855c5dbde5a40d894008e996669d8 Text-content-sha1: f65d203dc04a9fe8d6cd72554ef817050deb7d89 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNVYkkkfun Node-path: putty-wishlist/data/gui-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 98f1d24c0a89a87e9179dc521e1ea450 Text-delta-base-sha1: 148d35923067822ca02906059be5cf39ce6bee25 Text-content-length: 37 Text-content-md5: 45129e7b11be333d2b6b7c228e3fa070 Text-content-sha1: a85bc470222ebe266513dcc14833a0a704bef132 Content-length: 76 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN{B:ADifficulty: tricky Node-path: putty-wishlist/data/line-endings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 909624bbdff5897fde24ef9fc5fc26b7 Text-delta-base-sha1: 8699d15e06598d95cf76038af0603307dd5a9f0f Text-content-length: 85 Text-content-md5: 8c07ebe7242dca4dce8498c76454a824 Text-content-sha1: c5505d4e09dc503f81d2938d1ead6b5d682375d2 Content-length: 124 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN-@DD|1Summary: Line ending conversion in PSCP and PSFTP Difficulty: taxing Node-path: putty-wishlist/data/pageant-hibernate Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f6122249f5f0a6c35e2d266c40f515ed Text-delta-base-sha1: 75598e5b815993ae7b5812a8b6f84f03d2381f31 Text-content-length: 98 Text-content-md5: 1d9b4b7087e959e50cbc56d98cfdba0e Text-content-sha1: 8680ff0573498670bd71b8445c174f58d2c1ab83 Content-length: 137 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN ML8< tSummary: Discard sensitive material in Pageant on hibernation Difficulty: fu) Node-path: putty-wishlist/data/portfwd-range Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: af138923165626b6244a0da27f54eb9f Text-delta-base-sha1: b7132734326af92433648b31ce7aa3a5b168ce52 Text-content-length: 71 Text-content-md5: d4c5a5804c5a1710c21a76afd0084e27 Text-content-sha1: 418e2dd47165497ae289dc52d2765b0bf1030eea Content-length: 110 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN| 7U'Summary: Allow port ranges in tunnel UI Difficulty: fun Node-path: putty-wishlist/data/status-bar Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 53f7c5836d851aa9fc718dd224c07299 Text-delta-base-sha1: 8b8e090aed87a5cbee23157efd7fe64f963781da Text-content-length: 25 Text-content-md5: bd529068ccd7d3236bcbcd5de4d02afc Text-content-sha1: b9f13a5daeee7910debbb2bfbcf4a2b2d73a35cd Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNMSQ|Qtricky Node-path: putty-wishlist/data/terminfo Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a5600a089bf2c9201497ce4ac8457064 Text-delta-base-sha1: 73771b528ead35e927bbb2579685b0e3564d1e7f Text-content-length: 22 Text-content-md5: ccb4f8af4a5800d06252279e15b552ab Text-content-sha1: 6e8ad6146554cd276188f328ae9c0c16bdd5cb3e Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN #d"$difficulty": $difficultydesc{$difficulty}
      EOF my @tmp2 = grep(($bugs{$_}->{difficulty} eq $difficulty),@tmp); subtractbugs(\@fullbuglist, printbugs(\@tmp2)); unnest("
    \n"); } foreach my $difficulty ("fun", "tricky", "taxing", "mayhem") { nest(<"$difficulty": $difficultydesc{$difficulty}
      EOF my @tmp2 = grep(($bugs{$_}->{difficulty} eq $difficulty),@tmp); subtractbugs(\@fullbuglist, printbugs(\@tmp2)); unnest("
    \n"); } Revision-number: 2140 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2002-10-25T22:00:22.000000Z K 7 svn:log V 106 Oops; remembering to call term_provide_resize_fn in the Unix front end would probably help. Thanks Colin. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0f3d8b597e72f12d7addc67da539a72f Text-delta-base-sha1: 4f1282d0526960f9b7a69203e934afa5b18ae536 Text-content-length: 71 Text-content-md5: ff4ba3715981d0a802d41b28e2996652 Text-content-sha1: 2b7713625805b3c5c4bd8420a279b895bfda08de Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVNK .PMCprovide_resize_fn(term, back->size, backhandle Revision-number: 2141 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2002-10-26T10:16:19.000000Z K 7 svn:log V 104 Line discipline module now uses dynamically allocated data. Also fixed one or two other minor problems. K 10 svn:author V 5 simon PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 24c529bbb2f33990909861640e220005 Text-delta-base-sha1: d0cf060d793588ad1e4ccf6c330a9ef1457513a0 Text-content-length: 28 Text-content-md5: d4a00998b2fd974925c410ebf6f7cc27 Text-content-sha1: 613c16179e60db350260730bf66326d50a2628c1 Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN]e U *handle Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 46726740b3fe8f2806e79961317b7d2f Text-delta-base-sha1: 75293e236b2b3186c25a6de828594625552eca5a Text-content-length: 4613 Text-content-md5: 5a53bf6bf41d1d82b643a5be15f0b77b Text-content-sha1: f96d51eb9038e85cdfe5c41dc728206ef58e6b14 Content-length: 4653 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN:}|Gn v2UU>n*Dc#ljypP=d\QP%]+p]r,V+2MXo;^8^$btypedef struct ldisc_tag { Terminal *term; Backend *back; void *backhandle; void *frontend; char *buf; int buflen, bufsiz, quotenext; } *Ldisc; #define ECHOING (cfg.localecho == LD_YES || \ (cfg.localecho == LD_BACKEND && \ (ldisc->back->ldisc(ldisc->backhandle, LD_ECHO) || \ term_ldisc(ldisc->ldisc->back->ldisc(ldisc->backhandle, LD_EDIT) || \ term_ldisc(ldisc->term, LD_EDIT)))) static void c_write(Ldisc ldisc, char *buf, int len) { from_backend(ldisc->term, 0, buf, len); } static int plen(Ldisc ldisc, unsigned char c) { if ((c >= 32 && c <= 126) || (c >= 160 && !in_utf(ldisc->Ldisc ldisc, unsigned char c) { if ((c >= 32 && c <= 126) || (c >= 160 && !in_utf(ldisc->term))) { c_write(ldisc, &c, 1); } else if (c < 128) { char cc[2]; cc[1] = (c == 127 ? '?' : c + 0x40); cc[0] = '^'; c_write(ldisc, cc, 2); } else { char cc[5]; sprintf(cc, "<%02X>", c); c_write(ldisc, cc, 4); } } static void bsb(Ldisc ldisc, int n) { while (n--) c_write(ldisc, *ldisc_create(Terminal *term, Backend *back, void *backhandle, void *frontend) { Ldisc ldisc = smalloc(sizeof(*ldisc)); ldisc->buf = NULL; ldisc->buflen = 0; ldisc->bufsiz = 0; ldisc->quotenext = 0; ldisc->back = back; ldisc->backhandle = backhandle; ldisc->term = term; ldisc->frontend = frontend; /* Link ourselves into the backend and the terminal */ if (term) term->ldisc = ldisc; if (back) back->provide_ldisc(backhandle, ldisc); return ldisc; } void ldisc_send(void *handle, char *buf, int len, int interactive) { Ldisc ldisc = (Ldisc) handle;ldisc_update(ldisc->frontend, ldisc->frontend); ldisc->ldisc->buflen > 0) { if (ECHOING) bsb(ldisc, plen(ldisc, ldisc->buf[ldisc->buflen - 1])); ldisc->ldisc->buflen > 0) { if (ECHOING) bsb(ldisc, plen(ldisc, ldisc->buf[ldisc->buflen - 1])); ldisc->buflen--; if (ldisc->buflen > 0 && isspace(ldisc->buf[ldisc->buflen - 1]) && !isspace(ldisc->buf[ldisc->ldisc->buflen > 0) { if (ECHOING) bsb(ldisc, plen(ldisc, ldisc->buf[ldisc->buflen - 1])); ldisc->buflen--; } ldisc->back->special(ldisc->ldisc->back->special(ldisc->backhandle, TS_IP); if (c == CTRL('Z')) ldisc->back->special(ldisc->backhandle, TS_SUSP); if (c == CTRL('\\')) ldisc->back->special(ldisc->backhandle, TS_ABORT); break; case CTRL('R'): /* redraw line */ if (ECHOING) { int i; c_write(ldisc, "^R\r\n", 4); for (i = 0; i < ldisc->buflen; i++) pwrite(ldisc, ldisc->buf[i]); } break; case CTRL('V'): /* quote next char */ ldisc->quotenext = TRUE; break; case CTRL('D'): /* logout or send */ if (ldisc->buflen == 0) { ldisc->back->special(ldisc->backhandle, TS_EOF); } else { ldisc->back->send(ldisc->backhandle, ldisc->buf, ldisc->buflen); ldisc->ldisc->buflen > 0 && ldisc->buf[ldisc->buflen - 1] == '\r') { if (ECHOING) bsb(ldisc, plen(ldisc, ldisc->buf[ldisc->buflen - 1])); ldisc->buflen--; /* FALLTHROUGH */ case KCTRL('M'): /* send with newline */ if (ldisc->buflen > 0) ldisc->back->send(ldisc->backhandle, ldisc->buf, ldisc->buflen); if (cfg.protocol == PROT_RAW) ldisc->back->send(ldisc->ldisc->back->special(ldisc->backhandle, TS_EOL); else ldisc->back->send(ldisc->backhandle, "\r", 1); if (ECHOING) c_write(ldisc, "\r\n", 2); ldisc->ldisc->buflen >= ldisc->bufsiz) { ldisc->bufsiz = ldisc->buflen + 256; ldisc->buf = srealloc(ldisc->buf, ldisc->bufsiz); } ldisc->buf[ldisc->buflen++] = c; if (ECHOING) pwrite(ldisc, (unsigned char) c); ldisc->quotenext = FALSE; break; } } } else { if (ldisc->buflen != 0) { ldisc->back->send(ldisc->backhandle, ldisc->buf, ldisc->buflen); while (ldisc->buflen > 0) { bsb(ldisc, plen(ldisc, ldisc->buf[ldisc->buflen - 1])); ldisc->buflen--; } } if (len > 0) { if (ECHOING) c_write(ldisc, ldisc->back->special(ldisc->backhandle, TS_EOL); else ldisc->back->send(ldisc->ldisc->back->special(ldisc->ldisc->back->special(ldisc->ldisc->back->special(ldisc->backhandle, TS_SUSP); break; } default: ldisc->back->send(ldisc->backhandle, buf, len); break; } } else ldisc->back->send(ldisc->backhandle, buf, len); } } } Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 11bf4ca621f2b511b614c176a1335231 Text-delta-base-sha1: 6bf4f55c51f1b9c129245933e0e8c14424e5f379 Text-content-length: 40 Text-content-md5: 59f9af96b6661fbb5d66b16519a61bef Text-content-sha1: b5bf2928fec3a6c3fe69fd885aa7873eec0cd98e Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVNeu Uvoid *frontend, Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: def1118b72cd4a1887ee0d9d9a5e56f6 Text-delta-base-sha1: ed114b29c262f4787fc84fcc759b3bedc8dcc562 Text-content-length: 331 Text-content-md5: 72f5e398ac65cace8b8bede867280f38 Text-content-sha1: ff2af0e90e4e28ff97d635784937391c61aa62f3 Content-length: 372 K 15 cvs2svn:cvs-rev V 5 1.158 PROPS-END SVNS Q]JA0'YYnSI void (*provide_ldisc) (void *handle, void *ldisc *frontend); void ldisc_update(void *frontend, int echo, int editvoid *ldisc_create(Terminal *, Backend *, void *, void *); void ldisc_send(void *handle, void *, int codepage, char *buf, int len, int interactive); void luni_send(void *, Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ad4b203629c77eb7fa8a92a48507166 Text-delta-base-sha1: 69a45c9fa9b988a9331803cfbd558b96c000570a Text-content-length: 144 Text-content-md5: b7ffcab87241647447a8fa9a70c6312a Text-content-sha1: 441be6502c43ade4045a35bd408c85d5eef9eb13 Content-length: 184 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN{j yAM06void raw_provide_ldisc(void *handle, void *ldisc) { /* This is a stub. */provide_ldisc, raw_unthrottle, 1 }; Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 316fc83bce7886a695d4b9336af0c96a Text-delta-base-sha1: 7ad3e20643dbe3ce295df530e1a0700b75212bc4 Text-content-length: 150 Text-content-md5: 8782bdaffd26fa6f2ea04953d899681f Text-content-sha1: aace2a5296153e7a251be9a4ff4a97a1a451b276 Content-length: 190 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNod cPXvoid rlogin_provide_ldisc(void *handle, void *ldisc) { /* This is a stub. */provide_ldisc, rlogin_unthrottle, 1 }; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2361cbb626aa47971e08dde92cbd3067 Text-delta-base-sha1: 87754146b920ac971d7b64c75316feb338a6509a Text-content-length: 392 Text-content-md5: 26270950e8c9e149d9b17de6f4931645 Text-content-sha1: 29c7da3305c244c8d83345eea1be6c2d8a791897 Content-length: 433 K 15 cvs2svn:cvs-rev V 5 1.231 PROPS-END SVN?`_YWvoid *ldiscif (ssh->ldisc) ldisc_send(ssh->ldisc, NULL, 0, 0);9>H]AfOT)) { send_packet(ssh, ssh->pktin.typif (ssh->ldisc) ldisc_send(ssh->ldisc, NULL, 0, 0);ssh->ldisc = NULLvoid ssh_provide_ldisc(void *handle, void *ldisc) { Ssh ssh = (Ssh) handle; ssh->ldisc = ldiscprovide_ldisc, ssh_unthrottle, 22 }; Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 67e4efaaaa0d7bfda862548b4769e40b Text-delta-base-sha1: cc47230a2360d0a72b26cb4dcea05fab06e5de16 Text-content-length: 321 Text-content-md5: 3925da54b019fc2116655f54cdef4158 Text-content-sha1: 54d1d04cd91e14cda395e835ae558617549bbbf3 Content-length: 361 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNzJ{ui0Iuwmvoid *ldiscif (telnet->ldisc) /* cause ldisc to notice the change */ ldisc_send(telnet->ldisc, NULL, 0, 0);void telnet_provide_ldisc(void *handle, void *ldisc) { Telnet telnet = (Telnet) handle; telnet->ldisc = ldiscprovide_ldisc, telnet_unthrottle, 23 }; Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 827b1f5618e15eedb1039d0b6dc6e85f Text-delta-base-sha1: f14b446e2827cdf6f427a365f1f918b330f80644 Text-content-length: 4619 Text-content-md5: 3b99923beb0f598797f4d6db9561b8d0 Text-content-sha1: d150c621dcd044821a4e130115cfb14caf6cebe7 Content-length: 4660 K 15 cvs2svn:cvs-rev V 5 1.110 PROPS-END SVNZbRSC"b#bIf>/ ~C&^DxbGS "%if,0?Mxtju Zif (term->ldisc) /* cause ldisc to notice changes */ ldisc_send(term->ldisc, NULL, 0, 0);term->mouse_is_downif (term->ldisc) /* cause ldisc to notice changes */ ldisc_send(term->ldisc, NULL, 0, 0);if (term->ldisc) /* cause ldisc to notice changes */ ldisc_send(term->ldisc, NULL, 0, 0);if (term->ldisc) term->ldisc, DEFAULT_CODEPAGE, if (term->ldisc) ldisc_send(term->ldisc, term->id_string, if (term->ldisc) /* cause ldisc to notice changes */ ldisc_send(term->ldisc, NULL, 0, 0);if (term->ldisc) ldisc_send(term->ldisc, if (term->ldisc) ldisc_send(term->ldisc, term->id_string, strlen(term->id_string), 0); break; case 'n': /* cursor position query */ if (term->ldisc) { if (term->esc_args[0] == 6) { char buf[32]; sprintf(buf, "\033[%d;%dR", term->curs.y + 1, term->curs.x + 1); ldisc_send(term->ldisc, buf, strlen(buf), 0); } else if (term->esc_args[0] == 5) { ldisc_send(term->ldisc, "\033[0n", 4, 0); }if (term->ldisc) ldisc_send(term->ldisc, is_iconic() ? "\033[1t" : "\033[2t", 4, 0); break; case 13: if (term->ldisc) { get_window_pos(&x, &y); len = sprintf(buf, "\033[3;%d;%dt", x, y); ldisc_send(term->ldisc, buf, len, 0); } break; case 14: if (term->ldisc) { get_window_pixels(&x, &y); len = sprintf(buf, "\033[4;%d;%dt", x, y); ldisc_send(term->ldisc, buf, len, 0); } break; case 18: if (term->ldisc) { len = sprintf(buf, "\033[8;%d;%dt", term->rows, term->cols); ldisc_send(term->ldisc, buf, len, 0); }if (term->ldisc) { p = get_window_title(TRUE); len = strlen(p); ldisc_send(term->ldisc, "\033]L", 3, 0); ldisc_send(term->ldisc, p, len, 0); ldisc_send(term->ldisc, "\033\\", 2, 0); } break; case 21: if (term->ldisc) { p = get_window_title(FALSE); len = strlen(p); ldisc_send(term->ldisc, "\033]l", 3, 0); ldisc_send(term->ldisc, p, len, 0); ldisc_send(term->ldisc, "\033\\", 2, 0); }if (term->ldisc) term->ldisc, if (term->ldisc) ldisc_send(term->ldisc, ruct ucsword { int start, end, ctype; }; static const struct ucsword const struct ucsword *wptrif (term->ldisc) luni_send(term->ldisc, if (term->ldisc) { switch (b) { case MBT_LEFT: encstate = 0x20; /* left button down */ break; case MBT_MIDDLE: encstate = 0x21; break; case MBT_RIGHT: encstate = 0x22; break; case MBT_WHEEL_UP: encstate = 0x60; break; case MBT_WHEEL_DOWN: encstate = 0x61; break; default: break; /* placate gcc warning about enum use */ } switch (a) { case MA_DRAG: if (term->xterm_mouse == 1) return; encstate += 0x20; break; case MA_RELEASE: encstate = 0x23; term->mouse_is_down = 0; break; case MA_CLICK: if (term->mouse_is_down == b) return; term->mouse_is_down = b; break; default: break; /* placate gcc warning about enum use */ } if (shift) encstate += 0x04; if (ctrl) encstate += 0x10; r = y + 33; c = x + 33; sprintf(abuf, "\033[M%c%c%c", encstate, c, r); ldisc_send(term->ldisc, abuf, 6, 0); }zz sfree(term->paste_buffer); term->paste_buffer = NULL; term->paste_len = 0; } int term_paste_pending(Terminal *term) { return term->paste_len != 0; } void term_paste(Terminal *term) { long now, paste_diff; if (term->paste_len == 0) return; /* Don't wait forever to paste */ if (term->paste_hold) { now = GETTICKCOUNT(); paste_diff = now - term->last_paste; if (paste_diff >= 0 && paste_diff < 450) return; } term->paste_hold = 0; while (term->paste_pos < term->paste_len) { int n = 0; while (n + term->paste_pos < term->paste_len) { if (term->paste_buffer[term->paste_pos + n++] == '\r') break; } if (term->ldisc) luni_send(term->ldisc, term->paste_buffer + term->paste_pos, n, 0); term->paste_pos += n; if (term->paste_pos < term->paste_len) { term->paste_hold = 1; return; } } sfree(term->paste_buffer); term->paste_buffer = NULL; term->paste_len = 0; } static void deselect(Terminal *term) { term->selstate Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7512254aada8221f3d33370f3aae9953 Text-delta-base-sha1: 3b7f0a9527a5fcd52cd074c43ecdb374a577528e Text-content-length: 110 Text-content-md5: 91e3ce2879fbe629cefacb5de6279dae Text-content-sha1: 46b98c56ac36c13f22e33a765c7c4e96a5e5a7d6 Content-length: 149 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN cSECAK? int mouse_is_down; /* used while tracking mouse buttons void *ldisc Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2b7de9651b0b39ec4c214cae882a7ba9 Text-delta-base-sha1: 3316167241b823a74e9d7926f156ccc9d89eea4c Text-content-length: 144 Text-content-md5: 33a0b9ad33a73a138ae19ba2b7da6fbe Text-content-sha1: 07b3bc51187e592993bb529eeb8d83cf57c1ae61 Content-length: 184 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNK"a;*;ueGL DXvoid *ldisc, ldisc, ldisc, widebuffer, wclen, interactive); } void luni_send(void *ldisc, disc, Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ff4ba3715981d0a802d41b28e2996652 Text-delta-base-sha1: 2b7713625805b3c5c4bd8420a279b895bfda08de Text-content-length: 269 Text-content-md5: b69dbb06848e192e0e40b0c7c5b856ec Text-content-sha1: 3625fcf32ddc2c4d453e665867acf33708d64ae4 Content-length: 309 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVNK})VE#C|f bCOngk` void *ldiscvoid *frontend, inst->ldisc, *handle) { struct gui_data *inst = (struct gui_data *)handle; inst->ldisc = ldisc_create(term, back, backhandle, inst); ldisc_send(inst->ldisc, NULL, 0, 0); Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7474b0bc634d07dacd7bbd924b6cf870 Text-delta-base-sha1: e62e5d4c67f8d9d8f2d99748326dcdece5a30475 Text-content-length: 107 Text-content-md5: 8d13cfc5bef17c7b03f95f4cd9a375a0 Text-content-sha1: fcae57a961deb58d4813958c0c81efdfad7fbe2f Content-length: 147 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNtQ<JB.%`void pty_provide_ldisc(void *handle, void *ldisc) { /* This is a stub.provide Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 551f8873b5d9df31f519a52a9a1e7b46 Text-delta-base-sha1: b2d67fef709fc654fc9246dc9197a66fd77984f6 Text-content-length: 179 Text-content-md5: 00300526339f2665f423453db2cdb0bc Text-content-sha1: e731633afd97af86bdad3ed8f488e45d7a7827a6 Content-length: 218 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN?g, 4void *ldisc, int codepage, char *buf, int len, int interactive) { ldisc_send(ldisc, buf, len, interactive); } void luni_send(void *ldisc, disc, Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 385a5719a4b1e6a9ab4a6348e26e995f Text-delta-base-sha1: 409d038c6f7029b7c518f69b8f90d3f3fb35e4ee Text-content-length: 697 Text-content-md5: baeb80c9f49c918b8da85b93faf309d2 Text-content-sha1: 07ef4586fdbd9ccd95c9610d2225826bd2fec1b8 Content-length: 738 K 15 cvs2svn:cvs-rev V 5 1.210 PROPS-END SVNw~~zy3sawy*|8 4zTwN6EY{TZs8MG&is_shift_pressedstatic void *ldiscvoid *frontend, /* * Set up a line discipline. */ ldisc = ldisc_create(term, back, backhandle, NULLldisc, ldisc, ldisc, ldisc, ldisc, ldisc, ldisc, ldisc, ldisc, ldisc, ldisc, ldisc, ldisc, kbd_codepage, )D 6s6= PALETTERGB(r, g, b); SetPaletteEntries(pal, 0, NCOLOURS, logpal->palPalEntry); } else colours[n] = RGB(r, g, b); } void palette_set(int n, int r, int g, int b) { static const int first[21] = { 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15, 16, 17, 18, *handle Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e73c1b46b1d72828113cf57256cdf0b8 Text-delta-base-sha1: 4e22bd62ef5a78ae35d8ce82a1441721478a0f85 Text-content-length: 65 Text-content-md5: 6b2b0c6763f12c83c7426f0aa4d39544 Text-content-sha1: 5fb90736f43ded8fed4458e8e1096858df87f522 Content-length: 105 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN%%1twcstr, wclen, mbstr, mblen, def,defused) #endif Revision-number: 2142 Prop-content-length: 331 Content-length: 331 K 7 svn:log V 230 Port forwarding module now passes backend handles around properly. As a result I've now been able to turn the global variables `back' and `backhandle' into module-level statics in the individual front ends. Now _that's_ progress! K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-26T10:33:59.000000Z PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 59f9af96b6661fbb5d66b16519a61bef Text-delta-base-sha1: b5bf2928fec3a6c3fe69fd885aa7873eec0cd98e Text-content-length: 69 Text-content-md5: 44ee34f6e4af3796a680414883a3b587 Text-content-sha1: 01c01a621fb49efdbc1e7d2eb9c3e9ee397a10c2 Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNu% -?9backhandle = NULL; /* we shouldn't need this */ pr->backhandle = org->backhandleorg->pr->c, pr->hostname,, void *backhandle pr->backhandle = backhandle Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 60a7ccf004f9d62315b685e8c2a62405 Text-delta-base-sha1: a7e8b8fea1750f83d807c287ae317ecddae97d6c Text-content-length: 96 Text-content-md5: 6bbccef01a47c3e29c0c7e75eed1b0ff Text-content-sha1: 4d16eca85e8d515db905f63623ff9201d27927e4 Content-length: 136 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVND<]O?O+ zstatic Backend *back; static void *backhandle;void *handle, Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 72f5e398ac65cace8b8bede867280f38 Text-delta-base-sha1: ff2af0e90e4e28ff97d635784937391c61aa62f3 Text-content-length: 32 Text-content-md5: 037070f340b2d2fa308e6dd53a35f2d7 Text-content-sha1: 6a795b635bf4a117d69c3988667d5391b3577aa7 Content-length: 73 K 15 cvs2svn:cvs-rev V 5 1.159 PROPS-END SVN/6) 9d Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 733190f9fdd5cda7705bc918a2666279 Text-delta-base-sha1: d47c38f008459b9a604fd2df7667072938753aab Text-content-length: 82 Text-content-md5: 98ef0598cd912eeac778daaaed09ba9b Text-content-sha1: 06d8ea4e157b861a9d8cac03c186ce4507a8531a Content-length: 122 K 15 cvs2svn:cvs-rev V 4 1.93 PROPS-END SVNO4a|W>SBackend *back; static void *backhandlevoid *handle, Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 26270950e8c9e149d9b17de6f4931645 Text-delta-base-sha1: 29c7da3305c244c8d83345eea1be6c2d8a791897 Text-content-length: 257 Text-content-md5: d9c08a5bd4d5011577c8d30868a8b3ce Text-content-sha1: a04fe5a32841f6af2ac96dd0549e47d3ec117b36 Content-length: 298 K 15 cvs2svn:cvs-rev V 5 1.232 PROPS-END SVN}6}/3, void *backhandle, ssh!":g:^7 if (!(c->closes & closetype, sshchannel, char *hostname, int port, char *org) { struct ssh_channel *c = (struct ssh_channel *)channel; Ssh ssh = c->ssh Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9a79ed21323bfd4097889e59f3e36874 Text-delta-base-sha1: acd8b5631f3647496c611daf954082cf6223e995 Text-content-length: 30 Text-content-md5: 74f844c5dc121a0a6444f1d547a638c6 Text-content-sha1: 95e14b6fabdaaffc7f8b1abb7fce2edfd97d2f2b Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVNiX t[channel, Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b69dbb06848e192e0e40b0c7c5b856ec Text-delta-base-sha1: 3625fcf32ddc2c4d453e665867acf33708d64ae4 Text-content-length: 388 Text-content-md5: a837b9a1c7c0c764184f9bbc025959be Text-content-sha1: f375dc0bf0eed0ce427197e3478339b706ce9565 Content-length: 428 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN}t*LVRTZ_h Vob&W Backend *back; void *backhandleinst->back->exitcode(inst->backhandle) >= 0) { int exitcode = inst->back->exitcode(inst->inst->back->exitcode(inst->inst->back = &pty_backend; inst->back->init((void *)term, &inst->backhandle, NULL, 0, NULL, 0); term_provide_resize_fn(term, inst->back->size, inst->inst->back, inst-> Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: baeb80c9f49c918b8da85b93faf309d2 Text-delta-base-sha1: 07ef4586fdbd9ccd95c9610d2225826bd2fec1b8 Text-content-length: 130 Text-content-md5: f6c84aed4c7d29c9258a4dda21475125 Text-content-sha1: 4581eb0652afe2608a4f103452f29e73088a00b9 Content-length: 171 K 15 cvs2svn:cvs-rev V 5 1.211 PROPS-END SVN -3 1static Backend *back; static void *backhandleDs/DlEntry[n].peFlags = PC_NOCOLLAPSE; colours[n] Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6b2b0c6763f12c83c7426f0aa4d39544 Text-delta-base-sha1: 5fb90736f43ded8fed4458e8e1096858df87f522 Text-content-length: 104 Text-content-md5: 3e5eb8d715820905f9de28c45127560d Text-content-sha1: 10ce2e81a4c4e5e7a37f409757cd647bb683d28f Content-length: 144 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN% RuR9lDetails of the help file. */ GLOBAL char *help_path; GLOBAL int help_has_contents Revision-number: 2143 Prop-content-length: 420 Content-length: 420 K 7 svn:log V 319 Reorganised the Unicode layer somewhat: moved luni_send and lpage_send out into the line discipline, making them _clients_ of the Unicode layer rather than part of it. This means they can access ldisc->term, which in turn means I've been able to remove the temporary global variable `term'. We're slowly getting there. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-26T11:08:59.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3cfb3d7918591f54694a8f771a355c87 Text-delta-base-sha1: 45d51a551b1e6d063099152230d491faa78ecc68 Text-content-length: 43 Text-content-md5: 51af4a47f1a624832f7504987dd0ad56 Text-content-sha1: 2af0e53087ce1f5541bfb9b9dcb80ecace17d534 Content-length: 82 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNp$97 ldiscucs ldiscucs Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a53bf6bf41d1d82b643a5be15f0b77b Text-delta-base-sha1: f96d51eb9038e85cdfe5c41dc728206ef58e6b14 Text-content-length: 39 Text-content-md5: f6b8dd1dd44bd3e20da36e02b8cdd5fa Text-content-sha1: 1d6ecf11bf8aeb6a4567a2e6b3d028f19ee85a41 Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN| F$o#include "ldisc.h" Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 037070f340b2d2fa308e6dd53a35f2d7 Text-delta-base-sha1: 6a795b635bf4a117d69c3988667d5391b3577aa7 Text-content-length: 336 Text-content-md5: 030668e54a9a580cbcbfa37d5f226f99 Text-content-sha1: 5f80454b2f42ed346dc48bcedf963276f16fda7b Content-length: 377 K 15 cvs2svn:cvs-rev V 5 1.160 PROPS-END SVN/# Ra`ldiscucs.c. */(void); int is_dbcs_leadbyte(int codepage, char byte); int mb_to_wc(int codepage, int flags, char *mbstr, int mblen, wchar_t *wcstr, int wclen); int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen, char *mbstr, int mblen, char *defchr, int *defused Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d9c08a5bd4d5011577c8d30868a8b3ce Text-delta-base-sha1: a04fe5a32841f6af2ac96dd0549e47d3ec117b36 Text-content-length: 40 Text-content-md5: 77c915a0c8533589a009d25e7920876b Text-content-sha1: 91c039c4f9adbb0395d8d1b26c37e859525100e1 Content-length: 81 K 15 cvs2svn:cvs-rev V 5 1.233 PROPS-END SVN! q0 Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 33a0b9ad33a73a138ae19ba2b7da6fbe Text-delta-base-sha1: 07b3bc51187e592993bb529eeb8d83cf57c1ae61 Text-content-length: 1078 Text-content-md5: a4f612d38d5e686760b69a302c6d4902 Text-content-sha1: 401490bb0ffab15dc3d4d265b59b52e6cad29f4e Content-length: 1118 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNK[!fzx2y4 +V#include #include int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen, char *mbstr, int mblen, char *defchr, int *defused) { char *p; int i; if (codepage == line_codepage && uni_tbl) { /* Do this by array lookup if we can. */ if (wclen < 0) { for (wclen = 0; wcstr[wclen++] ;); /* will include the NUL */ } for (p = mbstr, i = 0; i < wclen; i++) { wchar_t ch = wcstr else if (defchr) { int j; for (j = 0; defchr[j]; j++) *p++ = defchr[j]; if (defused) *defused = 1; } #if 1 else *p++ = '.'; #endif assert(p - mbstr < mblen); } return p - mbstr; } else return WideCharToMultiByte(codepage, flags, wcstr, wclen, mbstr, mblen, defchr, defused); } int mb_to_wc(int codepage, int flags, char *mbstr, int mblen, wchar_t *wcstr, int wclen) { return MultiByteToWideChar(codepage, flags, mbstr, mblen, wcstr, wclen); } int is_dbcs_leadbyte(int codepage, char byte) { return IsDBCSLeadByteEx(codepage, byte); } Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a837b9a1c7c0c764184f9bbc025959be Text-delta-base-sha1: f375dc0bf0eed0ce427197e3478339b706ce9565 Text-content-length: 1426 Text-content-md5: 3d48e4518ccbd7ffa3f7978cc837a495 Text-content-sha1: de05b0f4f65e8b799cddf9364ff4d1401282ff16 Content-length: 1466 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNt"O48}'5:\ -AL >,jx `l7|g6N.|LL"S%|U8@|B_,4T`T`vTT$r>>6 Terminal *terminst->inst->inst->inst->inst->inst->inst->inst->inst->inst->inst->term->vt52_mode) { end = 1 + sprintf(output+1, "\033%c", xkey); } else if (!inst->inst->term); term_out(inst->inst->term, 0, -5); return TRUE; } if (event->button == 5 && event->type == GDK_BUTTON_PRESS) { term_scroll(inst->inst->inst->inst->inst->term); term_blink(inst->inst->term, 0, buf, ret); term_blink(inst->term, 1); term_out(inst->inst->term->has_focus = event->in; term_out(inst->term); term_update(inst->inst->term);inst->term); if (term_paste_pending(inst->inst->term)) term_paste(inst->inst->inst->term->cols) return; if (x + len*2 > inst->term->cols) len = (inst->inst->term->cols) return; if (x + len*2 > inst->term->cols) len = (inst->inst->term->cols) return; if (x + len*2 > inst->term->cols) len = (inst->inst->term = term_init(); inst->back = &pty_backend; inst->back->init((void *)inst->term, &inst->backhandle, NULL, 0, NULL, 0); term_provide_resize_fn(inst->term, inst->back->size, inst->backhandle); term_size(inst->term, cfg.height, cfg.width, cfg.savelines); inst->ldisc = ldisc_create(inst-> Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 83b76ca7d40099062c63312b02c8af8e Text-delta-base-sha1: 75ade5ec223c7a885f0cd52a15426e07b51b79e1 Text-content-length: 20 Text-content-md5: ee84936139307ee5b92a9df67c10629a Text-content-sha1: 99b69395e58de269cd7f2a82ccaa8661740fe6be Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN^ Pq Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 00300526339f2665f423453db2cdb0bc Text-delta-base-sha1: e731633afd97af86bdad3ed8f488e45d7a7827a6 Text-content-length: 27 Text-content-md5: 282ceb8d6254af83369e9750ff3d38d2 Text-content-sha1: e8143a698d1051f7186dd65c092438a04b46e36b Content-length: 66 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNgf $ 61. Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f6c84aed4c7d29c9258a4dda21475125 Text-delta-base-sha1: 4581eb0652afe2608a4f103452f29e73088a00b9 Text-content-length: 82 Text-content-md5: 07bbe2f12f476ee9f1a7a2027c803a98 Text-content-sha1: 2ca4de8fab24909d29a08e3e9b2f04d230f9e574 Content-length: 123 K 15 cvs2svn:cvs-rev V 5 1.212 PROPS-END SVNbu`\static Terminal *termss; logpal->palPa Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e5eb8d715820905f9de28c45127560d Text-delta-base-sha1: 10ce2e81a4c4e5e7a37f409757cd647bb683d28f Text-content-length: 23 Text-content-md5: 0b7a71ab2373d44131e2399bdcae2318 Text-content-sha1: bfadf95ab7c4acc824326056f235cdf2b52588ff Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN~#endif Revision-number: 2144 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2002-10-26T11:12:24.000000Z K 7 svn:log V 55 Fix proxy.c so that the static variables become const. K 10 svn:author V 5 simon PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e600c1b670516aee746f59982c85d2e5 Text-delta-base-sha1: 007d67289179681f8d0e2e7041d0a961ef892bfe Text-content-length: 40 Text-content-md5: 9c2586e604cf85860e346d7286eb36b9 Text-content-sha1: 1ea238bbac0b40384fa74203e452f1bd6928f756 Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNu BA5@constconst Node-path: putty/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ac773abd7bdb090758c5793bf9405e29 Text-delta-base-sha1: 5986caff82458c4c47dac26555142682b5388f46 Text-content-length: 37 Text-content-md5: 2d8722e1ffd2ce19948c4eb297176ad4 Text-content-sha1: 79fa37776239bd42e1d89d206c3944972f90a790 Content-length: 76 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN' ]"yconstconst Revision-number: 2145 Prop-content-length: 215 Content-length: 215 K 7 svn:log V 114 X forwarding authentication is now invented on a per-SSH-connection basis, so the statics are gone from x11fwd.c. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-26T11:23:15.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 77c915a0c8533589a009d25e7920876b Text-delta-base-sha1: 91c039c4f9adbb0395d8d1b26c37e859525100e1 Text-content-length: 484 Text-content-md5: ca3d51f7771f44faa549c5e1cd498beb Text-content-sha1: 9af6fbf7e78b4dae6faf69870207df0c0e72bcf4 Content-length: 525 K 15 cvs2svn:cvs-rev V 5 1.234 PROPS-END SVN!@ afd$C) 5, void *); extern void x11_close(Socket); extern int x11_send(Socket, char *, int); extern void *void *x11authssh->x11auth = x11_invent_auth(proto, sizeof(proto), , ssh->x11auth#FJjRi:!1gz } c->closes |= (closetype << 2); /* seen this message */ ssh->x11auth = x11_invent_auth(proto, sizeof(proto), data, sizeof(data), ssh->x11auth) !=x11auth = NULL Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a8cad6f714f53105f841aa361d30dc36 Text-delta-base-sha1: fb453bd200d9ff56b068bbd06b4362b7fd262c4a Text-content-length: 732 Text-content-md5: 9d8f14d052fbd9e6126ce1037d580eb6 Text-content-sha1: 9124bceaae4fdafb03e41bb9ff8364b64a4ff5cb Content-length: 772 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN>t? Q4 Eim$="KQ-FFvxFAuth { unsigned char data[64]; int len; }; struct X11Private { conststruct X11Auth *auth;void *x11_invent_auth(char *proto, int protomaxlen, char *data, int datamaxlen) { struct X11Auth *auth = smalloc(sizeof(struct X11Auth));auth->len = 16; for (i = 0; i < 16; i++) auth->auth->len; i++) sprintf(ourdata + strlen(ourdata), "%02x", auth->data[i]); strncpy(data, ourdata, datamaxlen); return auth; } static int x11_verify(struct X11Auth *auth, auth->len) return 0; /* cookie was wrong length */ if (memcmp(auth->, void *auth) { static constauth = (struct X11Auth *)auth, pr->auth_protocol, Revision-number: 2146 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2002-10-26T12:42:07.000000Z K 7 svn:log V 80 Richard points out that it would probably help if I committed ldisc.h. Bah. :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 501 Text-content-md5: 4713a582996d44f443f523763a40b075 Text-content-sha1: 902c3873970637c6dbff53ea99d7cf34c1969014 Content-length: 617 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNggg/* * ldisc.h: defines the Ldisc data structure used by ldisc.c and * ldiscucs.c. (Unfortunately it was necessary to split the ldisc * module in two, to avoid unnecessarily linking in the Unicode * stuff in tools that don't require it.) */ #ifndef PUTTY_LDISC_H #define PUTTY_LDISC_H typedef struct ldisc_tag { Terminal *term; Backend *back; void *backhandle; void *frontend; char *buf; int buflen, bufsiz, quotenext; } *Ldisc; #endif /* PUTTY_LDISC_H */ Revision-number: 2147 Prop-content-length: 434 Content-length: 434 K 7 svn:log V 333 Yet more global-removal. The static variables in logging.c are now absent, and also (I think) all the frontend request functions (such as request_resize) take a context pointer, so that multiple windows can be handled sensibly. I wouldn't swear to this, but I _think_ that only leaves the Unicode stuff as the last stubborn holdout. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-26T12:58:13.000000Z PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d4a00998b2fd974925c410ebf6f7cc27 Text-delta-base-sha1: 613c16179e60db350260730bf66326d50a2628c1 Text-content-length: 464 Text-content-md5: 5abe731a298ee1d6de04d31673eff5f9 Text-content-sha1: 5d892a3907ea4baa409c02ad2ec9746b2ba6b458 Content-length: 503 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNe $ )@)TiK=` Wvoid *frontend, void *frontend, void *frontend, * Uniquely among these functions, this one does _not_ expect a * frontend handle. This means that if PuTTY is ported to a * platform which requires frontend handles, this function will be * an anomaly. Fortunately, the problem it addresses will not have * been present on that platform, so it can plausibly be * implemented as an empty functionvoid *frontend, Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e3a49a8ec324e4f4a65e5de23d1459c8 Text-delta-base-sha1: 93a69bfb61a9285652dc4db0534e258a8a493434 Text-content-length: 1963 Text-content-md5: 7a7fcf6d211d683c178f3493030f0af3 Text-content-sha1: 718b1e384a153acaa52c68e2a2414e14e51b769b Content-length: 2002 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN^=QN_|]gsx@iKQs4-rUY ~J {cruct LogContext { FILE *lgfp; char currlogfilename[FILENAME_MAX]; void *frontend; }void *handle, unsigned char c, int logmode) { struct LogContext *ctx = (struct LogContext *)handle;ctx->lgfp) logfopen(ctx); if (ctx->lgfp) fputc(c, ctx->void *handle, char *event) { struct LogContext *ctx = (struct LogContext *)handle; if (cfg.logtype != LGTYP_PACKETS) return; if (!ctx->lgfp) logfopen(ctx); if (ctx->lgfp) fprintf(ctx->void *handle, int direction, int type, char *texttype, void *data, int len) { struct LogContext *ctx = (struct LogContext *)handle; int i, j; char dumpdata[80], smalldata[5]; if (cfg.logtype != LGTYP_PACKETS) return; if (!ctx->lgfp) logfopen(ctx); if (ctx->lgfp) { fprintf(ctx->ctx->lgfp); } fflush(ctx->lgfp); } } /* open log file append/overwrite mode */ void logfopen(void *handle) { struct LogContext *ctx = (struct LogContext *)handle;ctx->tx->currlogfilename, cfg.logfilename,cfg.host, &tm); ctx->lgfp = fopen(ctx->currlogfilename, "r"); /* file already present? */ if (ctx->lgfp) { int i; fclose(ctx->lgfp); i = askappend(ctx->frontend, ctx->ctx->lgfp = NULL; cfg.logtype = 0; /* disable logging */ return; } } ctx->lgfp = fopen(ctx->currlogfilename, writemod); if (ctx->ctx->lgfp); strftime(buf, 24, "%Y.%m.%d %H:%M:%S", &tm); fputs(buf, ctx->lgfp); fputs(" =~=~=~=~=~=~=~=~=~=~=~=\r\n", ctx->tx->currlogfilename, 128); buf[strlen(buf)] = '\0'; logevent(ctx->frontend, buf); } } void logfclose(void *handle) { struct LogContext *ctx = (struct LogContext *)handle; if (ctx->lgfp) { fclose(ctx->lgfp); ctx->lgfp = NULL; } } void *log_init(void *frontend) { struct LogContext *ctx = smalloc(sizeof(struct LogContext)); ctx->lgfp = NULL; ctx->frontend = frontend; return ctx; Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d02d9c53c3d2904e0cae3a701d6c6fef Text-delta-base-sha1: 57082dd003d2ca97967fcca7242aa54c2f5464e0 Text-content-length: 23 Text-content-md5: aec54348a8e2f78e97f2747a471898d8 Text-content-sha1: 1dc122422594310189ce62f9dc0b3ca9e3b30601 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN_Y Y Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 44ee34f6e4af3796a680414883a3b587 Text-delta-base-sha1: 01c01a621fb49efdbc1e7d2eb9c3e9ee397a10c2 Text-content-length: 118 Text-content-md5: 2482df503923a392290f5bebf02d8d5d Text-content-sha1: d769cb28fde70bab9440aeb8a7a7d7568f589edf Content-length: 158 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVN%zSCPckC)|void *frontend, logctx = log_init(NULL); back->provide_logctx(backhandle, logctx); Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6bbccef01a47c3e29c0c7e75eed1b0ff Text-delta-base-sha1: 4d16eca85e8d515db905f63623ff9201d27927e4 Text-content-length: 125 Text-content-md5: 15e12d378d53b663745a64cd161a3e28 Text-content-sha1: 1ad57b67180748e64f688c5fbc80005bff27c05f Content-length: 165 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNDV<fFKyvoid *frontend, logctx = log_init(NULL); back->provide_logctx(backhandle, logctx); Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 030668e54a9a580cbcbfa37d5f226f99 Text-delta-base-sha1: 5f80454b2f42ed346dc48bcedf963276f16fda7b Text-content-length: 2031 Text-content-md5: 1ef42216da87e068ff7f8ef214fe0376 Text-content-sha1: 8ecfea2882e2f5ea7b8aa89ce1b121cf399dd56c Content-length: 2072 K 15 cvs2svn:cvs-rev V 5 1.161 PROPS-END SVNmB}m|bh9CD|B |j|D_eGH#ifndef DONE_TYPEDEFS #define DONE_TYPEDEFS#endifvoid (*provide_logctx) (void *handle, void *logctxvoid *frontend, void *frontend, char *); void set_icon(void *frontend, char *); void set_sbar(void *frontend, int, int, int); Context get_ctx(void *frontend); void free_ctx(Context); void palette_set(void *frontend, int, int, int, int); void palette_reset(void *frontend); void write_aclip(void *frontend, char *, int, int); void write_clip(void *frontend, wchar_t *, int, int); void get_clip(void *frontend, wchar_t **, int *); void optimised_move(void *frontend, int, int, int); void set_raw_mouse_mode(void *frontend, int); Mouse_Button translate_button(void *frontend, Mouse_Button b); void connection_fatal(void *frontend, char *, ...); void fatalbox(char *, ...); void modalfatalbox(char *, ...); void beep(void *frontend, int); void begin_session(void *frontend); void sys_cursor(void *frontend, int x, int y); void request_paste(void *frontenvoid *frontend, int iconic); void move_window(void *frontend, int x, int y); void set_zorder(void *frontend, int top); void refresh_window(void *frontend); void set_zoomed(void *frontend, int zoomed); int is_iconic(void *frontend); void get_window_pos(void *frontend, int *x, int *y); void get_window_pixels(void *frontend, int *x, int *y); char *get_window_title(void *frontend, *frontenvoid term_provide_logctx(Terminal *term, void *logctx); /* * Exports from logging.c. */ void *log_init(void *frontend); void logfopen(void *logctx); void logfclose(void *logctx); void logtraffic(void *logctx, unsigned char c, int logmode); void log_eventlog(void *logctx, char *string); enum { PKT_INCOMING, PKT_OUTGOING }; void log_packet(void *logctx, int direction, int type, void *frontend, 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); int askappend(void *frontend, Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b8ab433be9b660d8a7a2c3110e01cbf Text-delta-base-sha1: 598e8be5225ee057635d692c397c4cb21898b959 Text-content-length: 23 Text-content-md5: f89bca5ce9b9eec5fb0d8b59a5e199c3 Text-content-sha1: 0943d65c73f8b9f83e1c6c6be68c5dbaa2182427 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVN$ r,x Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b7ffcab87241647447a8fa9a70c6312a Text-delta-base-sha1: 441be6502c43ade4045a35bd408c85d5eef9eb13 Text-content-length: 181 Text-content-md5: 64b1e9ab0df575b8eb44aad83646e4fe Text-content-sha1: 2dbad17101b42c396d602fab83db09ac4975c694 Content-length: 221 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNj  gkgZRm,dqraw->frontend, raw->frontend, raw->frontend, void raw_provide_logctx(void *handle, void *logctxprovide_logctx, raw_unthrottle, 1 }; Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8782bdaffd26fa6f2ea04953d899681f Text-delta-base-sha1: aace2a5296153e7a251be9a4ff4a97a1a451b276 Text-content-length: 196 Text-content-md5: 5e8a1c07b0a6645909ee6cd5fac5cda3 Text-content-sha1: 8df959949c0699a9b8ef808efdc0adace955f946 Content-length: 236 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNd==[>%9rlogin->frontend, rlogin->frontend, rlogin->frontend, void rlogin_provide_logctx(void *handle, void *logctxprovide_logctx, rlogin_unthrottle, 1 }; Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 98ef0598cd912eeac778daaaed09ba9b Text-delta-base-sha1: 06d8ea4e157b861a9d8cac03c186ce4507a8531a Text-content-length: 120 Text-content-md5: d28196d5f23c6737598335880632eec5 Text-content-sha1: fba416b9484201ef0ced298c18e07a9a54a444e6 Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.94 PROPS-END SVNO*TmKDo`void *frontend, logctx = log_init(NULL); back->provide_logctx(backhandle, logctx Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3f6c064be95fbd18b8ae50d55d1d43ab Text-delta-base-sha1: aebe7b3dfbc731f8f7ede008ad4bf3999d1fbb0f Text-content-length: 23 Text-content-md5: cc99d1c0912ea9a0db01cf6aeb1d7b1e Text-content-sha1: a77ec9ed250164f5c5c2378c298402b019775fca Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN<0 kEw Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ca3d51f7771f44faa549c5e1cd498beb Text-delta-base-sha1: 9af6fbf7e78b4dae6faf69870207df0c0e72bcf4 Text-content-length: 2142 Text-content-md5: 05e4bbe082586623a4393f132f7151f1 Text-content-sha1: 9d84fa36b63f0af09d517b06ff50744451ddda78 Content-length: 2183 K 15 cvs2svn:cvs-rev V 5 1.235 PROPS-END SVNHpT;K RZYXRvQHuhWie@%g7~skvr]2+|\'Y lu){8~317D;{!6^W5R<k<.y}'a<&a<6 void *logctx#define logevent(s) { logevent(ssh->frontend, Ssh ssh, ssh,ssh,if (ssh->logctx) log_packet(ssh->logctx, PKT_INCOMING, ssh->pktin.type, ssh1_pkt_type(ssh->pktin.type), ssh,ssh,ssh,ssh,if (ssh->logctx) log_packet(ssh->logctx, PKT_INCOMING, ssh->pktin.type, ssh2_pkt_type(ssh->pkt_ctx, ssh->pktin.type), ssh,if (ssh->logctx) log_packet(ssh->logctx, PKT_OUTGOING, ssh->pktout.type, ssh1_pkt_type(ssh->pktout.type), if (ssh->logctx) log_packet(ssh->logctx, PKT_OUTGOING, ssh->pktout.data[5], ssh2_pkt_type(ssh->pkt_ctx, ssh->pktout.data[5]), ssh,ssh,ssh,ssh->frontend, ssh,frontend, ssh,ssh,ssh->frontend, ssh,ssh->frontend, ssh,ssh,ssh,ssh,ssh,ssh,ssh,ssh,>[>^^Zn*8)bi#aiuZ"O%qZ:k#%/Hwo1f 58MN5%y+-N5OA 9S/np"jf t logevent("Forwarded X11 connection terminated"); assert(c->u.x11.s != NULL); x11_close(c->u.x11.s); c->u.x11.s = NULL; } if ((c->closes == 0) && (c->type == CHAN_SOCKDATA)) { logevent("Forwarded port closed"); assert(c->u.pfd.s != NULL); pfd_close(c->u.pfd.s); c->u.pfd.s = NULL; ssh,ssh,ssh,sh->frontend, s->cscipher_tobe->name, 1); break; } } if (!s->cscipher_tobe) { bombout((ssh,sh->frontend, s->sccipher_tobe->name, 2); break; } } if (!s->sccipher_tobe) { bombout((ssh,ssh,ssh,ssh,frontend, ssh,ssh,ssh->frontend, ssh->frontend, "Unable to use this key file (%s)", ssh,ssh->frontend, ssh,ssh,ssh,"Unexpected response to X11 forwardingssh,ssh,ssh,"Unexpected response to ptyssh,ssh,ssh,ssh,csssh->logctxvoid ssh_provide_logctx(void *handle, void *logctx) { Ssh ssh = (Ssh) handle; ssh->logctx = logctxprovide_logctx Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 74f844c5dc121a0a6444f1d547a638c6 Text-delta-base-sha1: 95e14b6fabdaaffc7f8b1abb7fce2edfd97d2f2b Text-content-length: 29 Text-content-md5: 38dec2b8189a1238aea2683422661631 Text-content-sha1: a3370467c3dec8d86b92d3e552d53305fc021a2e Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVNX` ^z^void *, Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ae998ced540fd55e0c26d079b7014cf0 Text-delta-base-sha1: 01a117b8a22ff9420b310af6a9df52d8ea092620 Text-content-length: 40 Text-content-md5: 85d8b408f826b04f6b855746597ac9f0 Text-content-sha1: f48ec442ed800fbd7e0143c336958f5115557a50 Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN =Q6 dctx->winpo Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3925da54b019fc2116655f54cdef4158 Text-delta-base-sha1: 54d1d04cd91e14cda395e835ae558617549bbbf3 Text-content-length: 738 Text-content-md5: da7e2a5d3d280bc1e4f1c8f173d4baf7 Text-content-sha1: d8a028bb856473eec67b453edb672344b663ea22 Content-length: 778 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNJKas|n|PjY:8@8U67 pD?4OsZB sfrontend, telnet, telnet, telnet->frontend, "server:\tSB TSPEED SEND"); sprintf(logbuf, "client:\tSB TSPEED IS %s", cfg.termspeed); logevent(telnet->frontend, logbuf); } else logevent(telnet->frontend, telnet->frontend, "server:\tSB TTYPE SEND"); sprintf(logbuf, "client:\tSB TTYPE IS %s", b + 4); logevent(telnet->frontend, logbuf); } else logevent(telnet->frontend, telnet->frontend, telnet->frontend, telnet->frontend, telnet->frontend, telnet->frontend, telnet->frontend, void telnet_provide_logctx(void *handle, void *logctx) { /* This is a stub. */provide_logctx Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3b99923beb0f598797f4d6db9561b8d0 Text-delta-base-sha1: d150c621dcd044821a4e130115cfb14caf6cebe7 Text-content-length: 2515 Text-content-md5: 4bf74d35e3ce536e5608ca971469db6c Text-content-sha1: b2d33f0cef7db4d0ad13616be4ae16851d1f5faa Content-length: 2556 K 15 cvs2svn:cvs-rev V 5 1.111 PROPS-END SVNrJDNDV ub1VX{hmk~XVjy(!y&B +b8Mn[;z`term->frontendfrontend, term->frontend, *frontenfrontend = frontend; term->logctx = NULLterm->frontend, nscroll + term->rows, term->frontend, term->frontend, term->frontend, frontend, frontend, && term->logctx) logtraffic(term->logctx, term->frontend, if (term->logctx) logtraffic(term->logctx, if (term->logctx) logtraffic(term->logctx, (c & CSET_MASK) == ATTR_ASCII || (c & CSET_MASK) == 0) && term->logctx) logtraffic(term->logctx, term->frontend, frontend, term->frontend, FALSE); break; case 2: set_iconic(term->frontend, TRUE); break; case 3: if (term->esc_nargs >= 3) { if (!cfg.no_remote_resize) move_window(term->frontend, /* move to top */ set_zorder(term->frontend, TRUE); break; case 6: /* move to bottom */ set_zorder(term->frontend, FALSE); break; case 7: refresh_window(term->frontendterm->frontend, frontend, term->frontend) ? "\033[1t" : "\033[2t", 4, 0); break; case 13: if (term->ldisc) { get_window_pos(term->frontend, term->frontend, term->frontend, term->frontend,frontend, term->frontend, term->frontendfrontend, term->frontend, workbuf, wblen, FALSE); /* transfer to clipbterm->frontend, term->frontend, term->frontend,  uWx); term->selstart.y = min(term->selanchor.y, selpoint.y); term->selend.y = max(term->selanchor.y, selpoint.y); } sel_spread(term); } else if ((b == MBT_SELECT || b == MBT_EXTEND) && a == MA_RELEASE) { if (term->selstate == DRAGGING) { /* * We've completed a selection. We now transfer the * data to the clipboard. */ clipme(term, term->selstart, term->selend, (term->seltype == RECTANGULAR)); term->selstate = SELECTED; } else term->selstate = NO_SELECTION; } else if (b == MBT_PASTE && (a == MA_CLICK #if MULTICLICK_ONLY_EVENT || a == MA_2CLK || a == MA_3CLK #endif )) { request_paste(term->frontend); } term_update(term); } void term_nopaste(Terminal *term) { if (term->paste_len == 0) return; void term_provide_logctx(Terminal *term, void *logctx) { term->logctx = logctx; } Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 91e3ce2879fbe629cefacb5de6279dae Text-delta-base-sha1: 46b98c56ac36c13f22e33a765c7c4e96a5e5a7d6 Text-content-length: 58 Text-content-md5: 6fe1f1a6c63dde36ea70aa691908dada Text-content-sha1: 91b5639c1bad2ffceffa7952dcb419115d9ba707 Content-length: 97 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNc &K void *frontend; void *logctx Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d48e4518ccbd7ffa3f7978cc837a495 Text-delta-base-sha1: de05b0f4f65e8b799cddf9364ff4d1401282ff16 Text-content-length: 4985 Text-content-md5: 93e8e520b1f604985cae6276760da25c Text-content-sha1: 29b3ce572b52215daa21e6c5698096049172a8a2 Content-length: 5025 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVN"mXUsMxiEuJaf&AjgULX00SGjF4j;] FZR0NsZR01$Tp` c9rHyA:[JqZCP? 2J | t-f >xmouseptr_visible); } void request_resize(void *frontend, int w, int h) { struct gui_data *inst = (struct gui_data *)frontend;inst, static void real_palette_set(struct gui_data *inst, struct gui_data *instvoid *frontend, int n, int r, int g, int b) { struct gui_data *inst = (struct gui_data *)frontend;inst, first[n], r, g, b); if (first[n] >= 18) real_palette_set(inst, first[n] + 1, r, g, b); if (first[n] == 18) set_window_background(inst); } void palette_reset(void *frontend) { struct gui_data *inst = (struct gui_data *)frontend;inst); } void write_clip(void *frontend, wchar_t * data, int len, int must_deselect) { struct gui_data *inst = (struct gui_data *)frontend;struct gui_data *inst = (struct gui_data *)data;struct gui_data *inst = (struct gui_data *)data; term_deselect(inst->term); *frontend) { struct gui_data *inst = (struct gui_data *)frontend;struct gui_data *inst = (struct gui_data *)data; void *frontend, wchar_t ** p, int *len) { struct gui_data *inst = (struct gui_data *)frontend; if (p) { *p = inst->pastein_data; *len = inst->pastein_data_len; } } void set_title(void *frontend, char *title) { struct gui_data *inst = (struct gui_data *)frontend;void *frontend, char *title) { struct gui_data *inst = (struct gui_data *)frontend;void *frontend, int total, int start, int page) { struct gui_data *inst = (struct gui_data *)frontend;struct gui_data *inst = (struct gui_data *)data; void *frontend, int x, int y) { /* * This is meaningless under X. */ } void beep(void *frontend, *frontend) { struct gui_data *inst = (struct gui_data *)frontend; struct draw_ctx *dctx; if (!inst->area->window) return NULL; dctx = smalloc(sizeof(*dctx)); dctx->inst = inst; dctx->gc = gdk_gc_new(inst->area->window); return dctx; } void free_ctx(Context ctx) { struct draw_ctx *dctx = (struct draw_ctx *)ctx; /* struct gui_data *inst = dctx->inst; */ GdkGC *gc = dctx->gc; gdk_gc_unref(gc); sfree(dctxstruct draw_ctx *dctx = (struct draw_ctx *)ctx; struct gui_data *inst = dctx->inst; GdkGC *gc = dctx->gc; int nfg, nbg, t, fontid, shadowstruct draw_ctx *dctx = (struct draw_ctx *)ctx; struct gui_data *inst = dctx->inst; GdkGC *gc = dctx->gcstruct draw_ctx *dctx = (struct draw_ctx *)ctx; struct gui_data *inst = dctx->inst; GdkGC *gc = dctx->gc; int passivestruct gui_data *inst, *fronten struct gui_data *inst;Create an instance structure and initialise to zeroes */ inst = smalloc(sizeof(*inst));inst, cfg.wintitle); else set_title(inst, "pterm"); /* * Set up the colour map. */ palette_reset(instinst); inst->textcursor = make_mouse_ptr(inst, GDK_XTERM); inst->rawcursor = make_mouse_ptr(inst, GDK_LEFT_PTR); inst->blankcursor = make_mouse_ptr(inst, -1); make_mouse_ptr(inst, -2);inst, 1); inst->term = term_init(inst); inst->logctx = log_init(inst); term_provide_logctx(inst->term, inst->logctx inst->back->provide_logctx(inst->backhandle, inst->logctx Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8d13cfc5bef17c7b03f95f4cd9a375a0 Text-delta-base-sha1: fcae57a961deb58d4813958c0c81efdfad7fbe2f Text-content-length: 317 Text-content-md5: 10d85080a41e6d3d7d9a157d55e30661 Text-content-sha1: 371397351ae3ecdc9dc26283a64a284d274ac629 Content-length: 357 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNtH$ 5'+PMyslvoid *pty_frontenpty_frontend = frontend;pty_frontend font_dimension(pty_frontend, 0); size.ws_ypixel = (unsigned short) pty_term_height * font_dimension(pty_frontend, void pty_provide_logctx(void *handle, void *logctxprovide_logctx, pty_unthrottle, 1 }; Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ee84936139307ee5b92a9df67c10629a Text-delta-base-sha1: 99b69395e58de269cd7f2a82ccaa8661740fe6be Text-content-length: 80 Text-content-md5: a12bdca51e796a81cbce40f7ce0d1a5c Text-content-sha1: c0d235fa10a9da9de134e9deec317dfb5df8c09e Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN^p ;'7 *frontend); int font_dimension(void *frontend, int which); Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1116ffc6cec583ac8d6bb321ccfedc1f Text-delta-base-sha1: 3d4397f0b6adc99bb4e8cddd8d7700d49ae79237 Text-content-length: 583 Text-content-md5: c33f43859ed139837dd79942e4d810e9 Text-content-sha1: 1182a4431b7ddc6f436d232d127b316bc5d29d42 Content-length: 624 K 15 cvs2svn:cvs-rev V 5 1.192 PROPS-END SVN kkNULL, Y )t1^LwQC4SH`Bex = 1void *frontend, char *string) { char timebuf[40]; time_t t; log_eventlog(logctx, void *frontend, void *frontend, void *frontend, * Uniquely among these functions, this one does _not_ expect a * frontend handle. This means that if PuTTY is ported to a * platform which requires frontend handles, this function will be * an anomaly. Fortunately, the problem it addresses will not have * been present on that platform, so it can plausibly be * implemented as an empty function Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 07bbe2f12f476ee9f1a7a2027c803a98 Text-delta-base-sha1: 2ca4de8fab24909d29a08e3e9b2f04d230f9e574 Text-content-length: 1231 Text-content-md5: 9a9bf00d403734eede2efe25b89f5832 Text-content-sha1: 152b793e23862b47d88964a021814e0b2c9d102e Content-length: 1272 K 15 cvs2svn:cvs-rev V 5 1.213 PROPS-END SVNeb`yH7Yy =q\ v4m!!|B jmw8d]d*y/#VQS'MzwG-=NULL); logctx = log_init(NULL); term_provide_logctx(term, logctxback->provide_logctx(backhandle, logctxNULL, title); set_icon(NULL, logctxvoid *frontend, void *frontend, void *frontend, void *frontend, logctx); /* reset logging */ logfopen(logctxNULL, NULLNULLvoid *frontend, *frontenvoid *frontend, void *frontend, void *frontend, *frontenlTL!L`mML[9\ ~I-qvMg42~Bu?646jc x) { SelectPalette(ctx, GetStockObject(DEFAULT_PALETTE), FALSE); ReleaseDC(hwnd, ctx); } static void real_palette_set(int n, int r, int g, int b) { if (pal) { logpal->palPalEntry[n].peRed = r; logpal->palPalEntry[n].peGreen = g; logpal->palPalEntry[n].peBlue = bvoid *frontend, frontend *frontenfrontend); RealizePalette(hdc); free_ctx(hdc); } } void write_aclip(void *frontend, void *frontend, void *frontend, void *frontend, void *frontend, void *frontend, void *frontend, void *frontend, *frontenvoid *frontend, *frontenvoid *frontend, void *frontend, void *frontend, Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e191df990e55436c9194e994cc6598ae Text-delta-base-sha1: 48f0a9c9b760c8ada2da3bfdb1505817fdcf5205 Text-content-length: 281 Text-content-md5: 9a8e87935d7bc9a03eb87cc9cee7caf5 Text-content-sha1: 8f393b8aa382897e383a17b0f70043ff89995b9b Content-length: 321 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN9vSx\~Ml/* We're inside the Windows frontend here, so we know * that the frontend handle is unnecessary. */ logevent(NULL, /* We're inside the Windows frontend here, so we know * that the frontend handle is unnecessary. */ logevent(NULL, Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0b7a71ab2373d44131e2399bdcae2318 Text-delta-base-sha1: bfadf95ab7c4acc824326056f235cdf2b52588ff Text-content-length: 369 Text-content-md5: b8f0d7538c70a5cb190b40cb060bbbe9 Text-content-sha1: 262b05acd8da336f1c01a641883594a57d598719 Content-length: 409 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNiQ M;>Gifndef DONE_TYPEDEFS #define DONE_TYPEDEFS typedef struct config_tag Config; typedef struct backend_tag Backend; typedef struct terminal_tag Terminal;The terminal and logging context are notionally local to the * Windows front end, but they must be shared between window.c and * windlg.c. */ GLOBAL Terminal *term; GLOBAL void *logctx Revision-number: 2148 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2002-10-26T14:06:52.000000Z K 7 svn:log V 81 Retire another global in favour of adding a feature to the terminal.c interface. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1ef42216da87e068ff7f8ef214fe0376 Text-delta-base-sha1: 8ecfea2882e2f5ea7b8aa89ce1b121cf399dd56c Text-content-length: 27 Text-content-md5: 893fe1e2d16aca4b03c1afb6ecd65295 Text-content-sha1: b3d33396d5958ca9e055bce7e2f1a0c709b550f9 Content-length: 68 K 15 cvs2svn:cvs-rev V 5 1.162 PROPS-END SVNmYOhsz Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4bf74d35e3ce536e5608ca971469db6c Text-delta-base-sha1: b2d33f0cef7db4d0ad13616be4ae16851d1f5faa Text-content-length: 91 Text-content-md5: 534fb173ad05a2efc299d046650a1d19 Text-content-sha1: ff9b5a8e956b75c9cff2dcab35dd695489d921ce Content-length: 132 K 15 cvs2svn:cvs-rev V 5 1.112 PROPS-END SVNa~aj, int immediatelyimmediatelychor.x, selpoint. Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9a9bf00d403734eede2efe25b89f5832 Text-delta-base-sha1: 152b793e23862b47d88964a021814e0b2c9d102e Text-content-length: 147 Text-content-md5: d815f9475b8ecd53397447632f08e6a3 Text-content-sha1: 6ce52ccd6fc6048d1d8ddc795a3cc6859810f8ad Content-length: 188 K 15 cvs2svn:cvs-rev V 5 1.214 PROPS-END SVN)P"I_d, is_alt_pressed()is_alt_pressed()is_alt_pressed()x) { SelectPalett Revision-number: 2149 Prop-content-length: 192 Content-length: 192 K 8 svn:date V 27 2002-10-27T09:24:47.000000Z K 7 svn:log V 92 Arrgh! _Another_ missed commit. I really must do something about this bad habit of mine :-/ K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldiscucs.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1941 Text-content-md5: ad9643d16c40123d5c5bb74bef2f13e5 Text-content-sha1: c95e451c95b911c080cb79da9834d22a147fde95 Content-length: 2057 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN/* * ldisc.c: PuTTY line discipline. Sits between the input coming * from keypresses in the window, and the output channel leading to * the back end. Implements echo and/or local line editing, * depending on what's currently configured. */ #include #include #include "putty.h" #include "terminal.h" #include "ldisc.h" void lpage_send(void *handle, int codepage, char *buf, int len, int interactive) { Ldisc ldisc = (Ldisc)handle; wchar_t *widebuffer = 0; int widesize = 0; int wclen; if (codepage < 0) { ldisc_send(ldisc, buf, len, interactive); return; } widesize = len * 2; widebuffer = smalloc(widesize * sizeof(wchar_t)); wclen = mb_to_wc(codepage, 0, buf, len, widebuffer, widesize); luni_send(ldisc, widebuffer, wclen, interactive); sfree(widebuffer); } void luni_send(void *handle, wchar_t * widebuf, int len, int interactive) { Ldisc ldisc = (Ldisc)handle; int ratio = (in_utf(ldisc->term))?3:1; char *linebuffer; int linesize; int i; char *p; linesize = len * ratio * 2; linebuffer = smalloc(linesize * sizeof(wchar_t)); if (in_utf(ldisc->term)) { /* UTF is a simple algorithm */ for (p = linebuffer, i = 0; i < len; i++) { wchar_t ch = widebuf[i]; /* We only deal with 16-bit wide chars */ if ((ch&0xF800) == 0xD800) ch = '.'; if (ch < 0x80) { *p++ = (char) (ch); } else if (ch < 0x800) { *p++ = (0xC0 | (ch >> 6)); *p++ = (0x80 | (ch & 0x3F)); } else { *p++ = (0xE0 | (ch >> 12)); *p++ = (0x80 | ((ch >> 6) & 0x3F)); *p++ = (0x80 | (ch & 0x3F)); } } } else { int rv; rv = wc_to_mb(line_codepage, 0, widebuf, len, linebuffer, linesize, NULL, NULL); if (rv >= 0) p = linebuffer + rv; else p = linebuffer; } if (p > linebuffer) ldisc_send(ldisc, linebuffer, p - linebuffer, interactive); sfree(linebuffer); } Revision-number: 2150 Prop-content-length: 280 Content-length: 280 K 8 svn:date V 27 2002-10-28T09:38:28.000000Z K 7 svn:log V 179 First bug discovered as a result of global-removal: pasting into pterm caused a crash because I had the wrong prototype for the selection_received event handler. Should be fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 93e8e520b1f604985cae6276760da25c Text-delta-base-sha1: 29b3ce572b52215daa21e6c5698096049172a8a2 Text-content-length: 37 Text-content-md5: 4cfd87b390a51709e8a6ae603ef6f99b Text-content-sha1: d909f537eb52f56f1daf8e07e9e9b4633bae14fe Content-length: 77 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNmy ,B+uint time, Revision-number: 2151 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2002-10-28T16:38:33.000000Z K 7 svn:log V 65 Add link to an implementation which actually uses this mechanism K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7f3d5f013e55f7934e58a46f7a0ea995 Text-delta-base-sha1: f48cd08bfe2e5f923ba53eddddd3ecc1cd477090 Text-content-length: 142 Text-content-md5: 5d0cbf6b8c0953ccdac28b447ccdd859 Text-content-sha1: 6f0cd7ad8b29a20e784a5cbfb32750517b57dfea Content-length: 181 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNda}d}

    There are unofficial patches to OpenSSH which use this mechanism. Revision-number: 2152 Prop-content-length: 270 Content-length: 270 K 8 svn:date V 27 2002-10-28T17:30:47.000000Z K 7 svn:log V 169 Another deglobalisation bug: failed to initialise term->curstype. Thanks to valgrind for finding this one (aha! I knew there would be benefits from doing a Unix port!). K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 534fb173ad05a2efc299d046650a1d19 Text-delta-base-sha1: ff9b5a8e956b75c9cff2dcab35dd695489d921ce Text-content-length: 84 Text-content-md5: ae042c9e625765bc523a1653d0e32331 Text-content-sha1: 460071603a33278ac6a83b334f53392000406737 Content-length: 125 K 15 cvs2svn:cvs-rev V 5 1.113 PROPS-END SVN Y term->curstype = 07nd.x = 1+max(term->selan Revision-number: 2153 Prop-content-length: 604 Content-length: 604 K 8 svn:date V 27 2002-10-28T17:34:45.000000Z K 7 svn:log V 503 Fix Alt+numberpad in pterm. For a start, there was a bug whereby if a pterm came up while Alt was down, then releasing it would cause a ^@ to be generated. Also, though, I've decided that Alt plus a single numberpad key should not generate a low-numbered control code, because that's too easy to do by mistake and the codes are too powerful. Anyone who really _wants_ to create a ^C or ^D from the numberpad can do Alt-03 or Alt-04 easily enough; two-digit codes and more such as Alt-65 are unaffected. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4cfd87b390a51709e8a6ae603ef6f99b Text-delta-base-sha1: d909f537eb52f56f1daf8e07e9e9b4633bae14fe Text-content-length: 526 Text-content-md5: e16a94b60c132a6c4ac1db13ee0250ca Text-content-sha1: 4f7a087ac826291fb0210b72e5a13e465d22182d Content-length: 566 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNy_-S5y/J cjCK> L0Iint alt_digits * Note that we only do this if more than one key was actually * pressed - I don't think Alt+NumPad4 should be ^D or that * Alt+NumPad3 should be ^C, for example. There's no serious * inconvenience in having to type a zero before a single-digit * character code && inst->alt_digits > 1 inst->alt_digits = 0 inst->alt_digits++ inst->alt_keycode = -1; /* this one needs _not_ to be zero */ Revision-number: 2154 Prop-content-length: 618 Content-length: 618 K 8 svn:date V 27 2002-10-28T17:39:21.000000Z K 7 svn:log V 517 CloseOnExit now defaults to COE_ALWAYS for pterm, bringing it back into line with most other xtermalikes. On Unix, the exit code of a shell is the last exit code of one of its child processes, even if it's an interactive shell - so some pterms will close and some will not for no particularly good reason. Power-detaching a screen session is especially bad for this. COE_NORMAL is still useful for specialist purposes (running a single command in its own pterm), but I don't think it's a sane default, unfortunately. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5b648fd1a8f981780118cd4d79358383 Text-delta-base-sha1: 0a5d690a64c4e3fe32c1a3c4a0a4bfa6b9a7b704 Text-content-length: 647 Text-content-md5: cc73c561551f47bf5d1e29c09d8b8e84 Text-content-sha1: 182482c91e4396c5ddf1e498883d5650a8ece1d2 Content-length: 687 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVNi. mhmY/* * CloseOnExit defaults to closing only on a clean exit - but * unfortunately not on Unix (pterm). On Unix, the exit code of * a shell is the last exit code of one of its child processes, * even if it's an interactive shell - so some pterms will * close and some will not for no particularly good reason. The * mode is still useful for specialist purposes (running a * single command in its own pterm), but I don't think it's a * sane default, unfortunately. */ gppi(sesskey, "CloseOnExit", #ifdef _WINDOWS COE_NORMAL, #else COE_ALWAYS, #endif Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 051b05730fd5fe6eb096cdb41661179b Text-delta-base-sha1: bf90a6bc03e9aca0afa23a40fe2f42b094865ea5 Text-content-length: 357 Text-content-md5: 52b8c565fbe21cb44c13303427f89f02 Text-content-sha1: 7b69e91104057fb9e742930153cd1e9d4de63b79 Content-length: 396 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNccFn`oEO2 (the default), \fIpterm\fP will close its window as soon as the process inside it terminates. When set to 0, \fIpterm\fP will print the process's exit status, and the window will remain present until a key is pressed (allowing you to inspect the scrollback, and copy and paste text out of it). When this setting is set to 1 Revision-number: 2155 Prop-content-length: 318 Content-length: 318 K 8 svn:date V 27 2002-10-28T21:58:07.000000Z K 7 svn:log V 217 terminal.c should call the frontend beep() routine even with mode==BELL_VISUAL, otherwise taskbar flashing won't happen on visual bells. It's up to the frontend routine to spot BELL_VISUAL and avoid making any noise. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ae042c9e625765bc523a1653d0e32331 Text-delta-base-sha1: 460071603a33278ac6a83b334f53392000406737 Text-content-length: 86 Text-content-md5: 2c50b2a5dae49e83ae3ee4eb7612e931 Text-content-sha1: 59328c6f38941d84539caeb4c85b2ef533ca93e4 Content-length: 127 K 15 cvs2svn:cvs-rev V 5 1.114 PROPS-END SVN(xtZ&beep(term->frontend, cfg.beep);nd.x = 1+7.. Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e16a94b60c132a6c4ac1db13ee0250ca Text-delta-base-sha1: 4f7a087ac826291fb0210b72e5a13e465d22182d Text-content-length: 342 Text-content-md5: 672bd3bf4fcc228e4af8b77d212ccfbe Text-content-sha1: a36ea0a59133886e5c9b80caf3183f1e50289fba Content-length: 382 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVN_n9T9a~/* * This is still called when mode==BELL_VISUAL, even though the * visual bell is handled entirely within terminal.c, because we * may want to perform additional actions on any kind of bell (for * example, taskbar flashing in Windows). */ void beep(void *frontend, int mode) { if (mode != BELL_VISUAL) Revision-number: 2156 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2002-10-29T13:05:20.000000Z K 7 svn:log V 118 Try actually initialising ssh->v1_compressing. With any luck this will be what was causing Owen's crash report today. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 05e4bbe082586623a4393f132f7151f1 Text-delta-base-sha1: 9d84fa36b63f0af09d517b06ff50744451ddda78 Text-content-length: 84 Text-content-md5: c4586ae88b09eca251e53ca2b68d28b3 Text-content-sha1: db3ed97625a3ef3590d449319693f645783c78ad Content-length: 125 K 15 cvs2svn:cvs-rev V 5 1.236 PROPS-END SVNk logevent("Forward>J -61_compressing = FALSE Revision-number: 2157 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 54 Hmm. Probably best initialise mainchan as well; oops. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-29T14:41:10.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c4586ae88b09eca251e53ca2b68d28b3 Text-delta-base-sha1: db3ed97625a3ef3590d449319693f645783c78ad Text-content-length: 58 Text-content-md5: 3106bf5208f098414d1ac6de111762d1 Text-content-sha1: 9fe9f895dfb8c4694dd432e4680601f5f7f618e0 Content-length: 99 K 15 cvs2svn:cvs-rev V 5 1.237 PROPS-END SVNJd 6 ssh->mainchan Revision-number: 2158 Prop-content-length: 294 Content-length: 294 K 7 svn:log V 193 Yikes - put back a #include I accidentally removed two revs ago! That'd have been embarrassing. Mind you I'd like to remove this particular #include for good anyway, but the time is not now... K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-29T16:54:09.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3106bf5208f098414d1ac6de111762d1 Text-delta-base-sha1: 9fe9f895dfb8c4694dd432e4680601f5f7f618e0 Text-content-length: 78 Text-content-md5: ee488463b00d35754502b12b59feea08 Text-content-sha1: e42a4959db42085d4e641a635d163fb8d0cf8db2 Content-length: 119 K 15 cvs2svn:cvs-rev V 5 1.238 PROPS-END SVNk#include dyd logevent("Forward Revision-number: 2159 Prop-content-length: 330 Content-length: 330 K 8 svn:date V 27 2002-10-30T17:56:05.000000Z K 7 svn:log V 229 Preparatory work before attempting a Unix port of plink: mkfiles.pl needs to be able to handle separate Recipe entries for the same program with different types (plink [C] and plink [X] for example, with different object lists). K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7c65c202836f02b7f26f4ff578041d39 Text-delta-base-sha1: fbf67cf7f9cf947d97fdcc3ab8567b45cbc00cc7 Text-content-length: 2314 Text-content-md5: fa77fe2314a32b10479c4930022c945f Text-content-sha1: eaf67f1f3ad38e3c7c45298658a82bd87adf08c0 Content-length: 2354 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNu*kL'#|nV_hvsNB[G'l~P_s.wTR{+M'vF{ name + type letter to listref of objects/resourceslistref = [] = substr($i,1,1); } else { push @$listref, $i; } } if ($prog and $type) { die "multiple program entries for $prog [$type]\n" if defined $programs{$prog . "," . $type}; $programs{$prog . "," . $type} = $listref;($prog, $type) = split ",", $i;, $prog, $type); my @ret; @ret = (); foreach $n (@prognames) { ($prog, $type) = split ",", $n; push @ret, $n if index($types, $type) >= 0; } return @ret; } sub progrealnames { my ($types) = @_; my ($n, $prog, $type); my @ret; @ret = (); foreach $n (@prognames) { ($prog, $type) = split ",", $n; push @ret, $prog if index($types, $typerealnames("GC")); print "\n\n"; foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.o", "X.res.o", undef); print &splitline($prog . ".exe: " . $objstr), "\n"; my $mw = $typerealnames("GC")); print "\n\n"; foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.obj", "X.res", undef); print &splitline("$prog.exe: " . $objstr . " $prog.rsp"), "\n"; my $ap = ($type eq "G") ? "-aa" : "-ap"; print "\tilink32 $ap -Gn -L\$(BCB)\\lib \@$prog.rsp\n\n"; } foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; print $prog eq "G") ? "c0w32" : "c0x32"; print "\techo $c0w + > $progrog.rsp\n"; } print "\techo $prog.exe >> $progrog.rsp\n"; print "\techo " . &objects($p, undef, "X.res", undef) . " >> $progrealnames("GC")); print "\n\n"; foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.obj", "X.res", undef); print &splitline("$prog.exe: " . $objstr . " $prog.rsp"), "\n"; print "\tlink \$(LFLAGS) -out:$prog.exe -map:$prog.map \@$prog.rsp\n\n"; } foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; print $prog eq "G") ? "windows" : "console"; print "\techo /nologo /subsystem:$subsys > $progrogrealnames("X")); print "\n\n"; foreach $p (&prognames("X")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.o", undef, undef); print &splitline($prog../realnames("X")) . "\n". "\n"; select STDOUT; close OUT; Revision-number: 2160 Prop-content-length: 423 Content-length: 423 K 7 svn:log V 322 More preparatory work: remove the include from lots of source files in which it's no longer required (it was previously required in anything that included , but not any more). Also moved a couple of stray bits of exposed WinSock back into winnet.c (getservbyname from ssh.c and AF_INET from proxy.c). K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-30T17:57:31.000000Z PROPS-END Node-path: putty/be_all.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 32e8a1524c6461472450adc25e06903a Text-delta-base-sha1: 5d16372b6c502806974a375be40b78f634988af9 Text-content-length: 18 Text-content-md5: e53e3ed809f829161057e8d5792f5eb1 Text-content-sha1: bc5cf52b4bec9facc62ae4fb46edbfa30c1e566e Content-length: 57 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNp[dwy Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 87a0871317284d8c3d22f79895f138d2 Text-delta-base-sha1: 3219b4ef28faebfa8e949d6779278eeed2ab4f9c Text-content-length: 15 Text-content-md5: 111fe3fcd22a7de8fa0db61f74a07acc Text-content-sha1: c50f4be528f0e7cba04b22b1d4eef5521126ca35 Content-length: 54 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e97a92a7111286a95e1765175f7436da Text-delta-base-sha1: ff65f4c55939c6e0e955cd85f6d3d11f74541b5a Text-content-length: 405 Text-content-md5: fda3db94f1d81162b1bf56c31aeec3b7 Text-content-sha1: 43e43dd32bd2ca3c00477ca1c4a4f69b1c930e7f Content-length: 445 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNXWwZRXenum { ADDRTYPE_IPV4, ADDRTYPE_IPV6 } * Simple wrapper on getservbyname(), needed by ssh.c. Returns the * port number, in host byte order (suitable for printf and so on). * Returns 0 on failure. Any platform not supporting getservbyname * can just return 0 - this function is not required to handle * numeric port specifications. */ int net_service_lookup(char *service Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1acee3120b62624b2b0a450cd11c518e Text-delta-base-sha1: cec83555aec12fdfe352747ca660c80014511d3c Text-content-length: 15 Text-content-md5: bf976d024d105961a14ac7da0372ec56 Text-content-sha1: c6da79d9d0aa1f7a422a4856b4af41d3fce4a0a7 Content-length: 54 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNkVV Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9c2586e604cf85860e346d7286eb36b9 Text-delta-base-sha1: 1ea238bbac0b40384fa74203e452f1bd6928f756 Text-content-length: 72 Text-content-md5: 8205703c7d2529d42f8db1ff191788bc Text-content-sha1: f86b313a8cffe46cea17d118efb5aea817c91476 Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNv#9ySeRD=void *DDRTYPE_IPV4DDRTYPE_IPV6 Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 64b1e9ab0df575b8eb44aad83646e4fe Text-delta-base-sha1: 2dbad17101b42c396d602fab83db09ac4975c694 Text-content-length: 15 Text-content-md5: d1f57e4307a722534592d1556f11c3e5 Text-content-sha1: 4ee8036b49691d188b6d0e63d0d97db356d7be1e Content-length: 55 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN tt Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5e8a1c07b0a6645909ee6cd5fac5cda3 Text-delta-base-sha1: 8df959949c0699a9b8ef808efdc0adace955f946 Text-content-length: 147 Text-content-md5: c27ce32788093f0da225e534557bac39 Text-content-sha1: 0d12ec6d6eb2071c87729f7e199c1c1a17ec3f53 Content-length: 187 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNrBiwyy/* Rlogin rlogin = (Rlogin) handle; *//* Rlogin rlogin = (Rlogin) handle; *//* Rlogin rlogin = (Rlogin) handle; */ Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ee488463b00d35754502b12b59feea08 Text-delta-base-sha1: e42a4959db42085d4e641a635d163fb8d0cf8db2 Text-content-length: 1020 Text-content-md5: 02ed692ac5827740b5d1d593149159c1 Text-content-sha1: 12049fa328adb6bb4a8ede121e60e991fdbbaf81 Content-length: 1061 K 15 cvs2svn:cvs-rev V 5 1.239 PROPS-END SVN:#-T/=a^vl%` !dport = net_service_lookup(dports); if (!dport)port = net_service_lookup(sports); if (!sport)(int)(sserv ? strlen(sports) : 0), sports, sserv, "(", sport, sserv, ")", host, (int)(dserv ? strlen(dports) : 0)(int)(sserv ? strlen(sports) : 0), sports, sserv, "(", sport, sserv, ")", host, (int)(dserv ? strlen(dports) : 0) logevent("Forwarded X11 connection terminated"); assert(c->u.x11.s != NULL); x11_close(c->u.x11.s); c->u.x11.s = NULL; } if ((c->closes y-mf!#T=Pwtdport = net_service_lookup(dports); if (!dport)port = net_service_lookup(sports); if (!sport)(int)(sserv ? strlen(sports) : 0), sports, sserv, "(", sport, sserv, ")", host, (int)(dserv ? strlen(dports) : 0)(int)(sserv ? strlen(sports) : 0), sports, sserv, "(", sport, sserv, ")", host, (int)(dserv ? strlen(dports) : 0) Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ddaac357339cddae0f82ba61e639dd04 Text-delta-base-sha1: cb8bfa8fa9710a16aba847fbefacacb235e39ac1 Text-content-length: 50 Text-content-md5: aa5ca278eadf150c4ff865f20d46251f Text-content-sha1: 6b4dcf503a8a40162cd6f90ec0ba042e6cac826f Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN%685%l#ifdef DEBUG#endif Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 84e20d9a38e899856d71bb3316ccbffe Text-delta-base-sha1: efba07ccb6ab0170b4b25995a1dbab4ecc0b2169 Text-content-length: 24 Text-content-md5: 1709a6546c0687fc53b9302cddd0d0ed Text-content-sha1: f1526979166a2c60e31c16de75779cf300ce6570 Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNFE ,- Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: da7e2a5d3d280bc1e4f1c8f173d4baf7 Text-delta-base-sha1: d8a028bb856473eec67b453edb672344b663ea22 Text-content-length: 108 Text-content-md5: b58915d713680192a90c133afecac246 Text-content-sha1: c35645351b2e36333105855b3ddde7aeecf9b898 Content-length: 148 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNKBLt)n]/* Telnet telnet = (Telnet) handle; *//* Telnet telnet = (Telnet) handle; */ Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a12bdca51e796a81cbce40f7ce0d1a5c Text-delta-base-sha1: c0d235fa10a9da9de134e9deec317dfb5df8c09e Text-content-length: 79 Text-content-md5: f66f22203b484cbfae0ae6dd93b0bd56 Text-content-sha1: b75a94ce8ea0ba798911cec3b73a8e26d9ee7c99 Content-length: 119 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNp)?jdefine strnicmp strncasecmp #define stricmp strcasecmp #endif Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9a8e87935d7bc9a03eb87cc9cee7caf5 Text-delta-base-sha1: 8f393b8aa382897e383a17b0f70043ff89995b9b Text-content-length: 258 Text-content-md5: 14fb178e9be564fd4e3e5af43ac56a9c Text-content-sha1: 7463e648423b4cfcb81a497d84a8a5b8c2a099a6 Content-length: 298 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNwf -(addr->family == AF_INET ? ADDRTYPE_IPV4 : ADDRTYPE_IPV6) int net_service_lookup(char *service) { struct servent *se; se = getservbyname(service, NULL); if (se != NULL) return ntohs(se->s_port); else return 0; } Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d8f14d052fbd9e6126ce1037d580eb6 Text-delta-base-sha1: 9124bceaae4fdafb03e41bb9ff8364b64a4ff5cb Text-content-length: 15 Text-content-md5: e5fa5c15706d012858cb5d15b190e73b Text-content-sha1: 4ec0dee43764d9c8406af02b3aa86adc6bfbbbf1 Content-length: 55 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNt__ Revision-number: 2161 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 17 Fix some consts. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-30T18:12:22.000000Z PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a4f612d38d5e686760b69a302c6d4902 Text-delta-base-sha1: 401490bb0ffab15dc3d4d265b59b52e6cad29f4e Text-content-length: 338 Text-content-md5: 8d513511a691dc43fe1213713a4c37c0 Text-content-sha1: a13508861e24e2681efaebf87096f69c7f47f7cf Content-length: 378 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN[k*('&|`z!Y y{y|xt}kg6ij !)U-P`P/MELconstconst wchar_t iso_8859_1constconstconstconstconstconstconstconstconstconstconstconstconstconstconstconstconstconstconst wchar_t *cp_table; }; static constconstconst Revision-number: 2162 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2002-10-30T18:12:46.000000Z K 7 svn:log V 71 Further deglobalisation: settings.c now has a more sensible interface. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 893fe1e2d16aca4b03c1afb6ecd65295 Text-delta-base-sha1: b3d33396d5958ca9e055bce7e2f1a0c709b550f9 Text-content-length: 671 Text-content-md5: 7ac0735a2759383e781488cb1bb79eaf Text-content-sha1: 9ac73d0c108c862a7540d121b3c854a4e73d0554 Content-length: 712 K 15 cvs2svn:cvs-rev V 5 1.163 PROPS-END SVNYg!pD&list->buffer = srealloc(list->buffer, bufsize); } strcpy(list->buffer + buflen, otherbuf); buflen += strlen(list->buffer + buflen) + 1; } } while (ret); enum_settings_finish(handle); } list->buffer = srealloc(list->buffer, buflen + 1); list->list->buffer; list->nsessions = 1; /* "Default Settings" counts as one */ while (*p) { if (strcmp(p, "Default Settings")) list->nsessions++; while (*p) p++; p++; } list->sessions = smalloc((list->nsessions + 1) * sizeof(char *)); list->sessions[0] = "Default Settings"; p = list->buffer; i = 1; while (*p) { if (strcmp(p, "Default Settings")) list->sessions[i++] = p; while (*p) p++; p++; } qsort(list->sessions, i, sizeof(char *), sessioncmp); } else { sfree(list->buffer); sfree(list->sessions); } } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c33f43859ed139837dd79942e4d810e9 Text-delta-base-sha1: 1182a4431b7ddc6f436d232d127b316bc5d29d42 Text-content-length: 773 Text-content-md5: 835aed6ac19f280d45af50f749076c6b Text-content-sha1: 326b158f98506ecf9ae60f50872ecc51bf011a5d Content-length: 814 K 15 cvs2svn:cvs-rev V 5 1.193 PROPS-END SVNX"" s#Btp`rs>i>#W>i>#struct sesslist sesslist; /* exported to window.c */sesslist.nsessions; i++) SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_ADDSTRING, 0, (LPARAM) (sesslist.list.sessions[n], "Default Settings"); load_settings(sesslist.list.list.&sesslist, FALSE); get_sesslist(&sesslist, sesslist.list.list.sessions[n]); get_sesslist(&sesslist, FALSE); get_sesslist(&sesslist, sesslist.list. mbLvvxSION_400; #else of.lStructSize = sizeof(of); #endif of.hwndOwner = hwnd; of.lpstrFilter = "PuTTY Private Key Files\0*.PPK\0" "AllFiles\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterInd&sesslist, &sesslist, Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d815f9475b8ecd53397447632f08e6a3 Text-delta-base-sha1: 6ce52ccd6fc6048d1d8ddc795a3cc6859810f8ad Text-content-length: 675 Text-content-md5: 4eb800e2144af9d172e2a55f5087f594 Text-content-sha1: 82fdf2aa2cc451540612d10fc527da2f364341de Content-length: 716 K 15 cvs2svn:cvs-rev V 5 1.215 PROPS-END SVN'&63a8#]dint kbd_codepage; static void *ldisc; static Backend *back; static void *backhandle; static int session_closed; extern struct sesslist sesslist; /* imported from windlg.c */&sesslist, TRUE); for (i = 1; i < ((sesslist.nsessions < 256) ? sesslist.nsessions : 256); i++) AppendMenu(s, MF_ENABLED, IDM_SAVED_MIN + (16 * i), sesslist.sesslist.nsessions) { char *session = sesslist.A??{ HDC hdc; if (hwnd) { hdc = GetDC(hwnd); if (hdc && pal) SelectPalette(hdc, pal, FALSE); return hdc; } else return NULL; } void free_ctx(Context ctx) { SelectPalett Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b8f0d7538c70a5cb190b40cb060bbbe9 Text-delta-base-sha1: 262b05acd8da336f1c01a641883594a57d598719 Text-content-length: 54 Text-content-md5: e85ac1bbd602e4f7f0aea88e6f8b7159 Text-content-sha1: 6fa847ca6c7f000ff7d0c3c5f975b69636aca4fd Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNi !|n{ Likewise the saved-sessions list Revision-number: 2163 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2002-10-30T18:17:56.000000Z K 7 svn:log V 50 RJK's `make install' patch for the Unix makefile. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fa77fe2314a32b10479c4930022c945f Text-delta-base-sha1: eaf67f1f3ad38e3c7c45298658a82bd87adf08c0 Text-content-length: 746 Text-content-md5: 231969a228b26b3123a4fb895474e5d6 Text-content-sha1: 62971fea7c121343234919fbd56b40bf36f96e55 Content-length: 786 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN*\G EV]5Y%sub manpages { my ($types,$suffix) = @_; # assume that all UNIX programs have a man page if($suffix eq "1" && $types =~ /X/) { return map("$_.1", &progrealnames($types)); } return ()INSTALL=install\n", "INSTALL_PROGRAM=\$(INSTALL)\n", "INSTALL_DATA=\$(INSTALL)\n", "prefix=/usr/local\n", "exec_prefix=\$(prefix)\n", "bindir=\$(exec_prefix)/bin\n", "mandir=\$(prefix)/man\n", "man1dir=\$(mandir)/man1\n",, "install:\n", map("\t\$(INSTALL_PROGRAM) -m 755 $_ \$(bindir)/$_\n", &progrealnames("X")), map("\t\$(INSTALL_DATA) -m 644 $_ \$(man1dir)/$_\n", &manpages("X", "1")), "\n", "install-strip:\n", "\t\$(MAKE) install INSTALL_PROGRAM=\"\$(INSTALL_PROGRAM) -s\"\n", "\n"; select STDOUT; close OUT; Revision-number: 2164 Prop-content-length: 317 Content-length: 317 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-10-30T18:22:37.000000Z K 7 svn:log V 216 RJK's `pterm --help' patch. I _must_ find a better alternative to this init sequence - it surely can't be right that `pterm --help' with no DISPLAY complains at the lack of DISPLAY rather than giving a help message! PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 52b8c565fbe21cb44c13303427f89f02 Text-delta-base-sha1: 7b69e91104057fb9e742930153cd1e9d4de63b79 Text-content-length: 106 Text-content-md5: b537c708b1da4098f832a6d2c06b7ff7 Text-content-sha1: 242112946e79b602d1b4e27e51fdc77a49ccfa50 Content-length: 145 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNc7 RzRkxIP "\fB-help\fP, \fB--help\fP" Display a message summarizing the available options Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 672bd3bf4fcc228e4af8b77d212ccfbe Text-delta-base-sha1: a36ea0a59133886e5c9b80caf3183f1e50289fba Text-content-length: 1368 Text-content-md5: 8695a149a86ae1d4487c0c9da2e0a7aa Text-content-sha1: 62dbe3e394fd597b27f9981d18764e9d7ff86159 Content-length: 1408 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNn-4w\JuX86static void help(FILE *fp) { if(fprintf(fp, "pterm option summary:\n" "\n" " --display DISPLAY Specify X display to use (note '--')\n" " -name PREFIX Prefix when looking up resources (default: pterm)\n" " -fn FONT Normal text font\n" " -fb FONT Bold text font\n" " -geometry WIDTHxHEIGHT Size of terminal in characters\n" " -sl LINES Number of lines of scrollback\n" " -fg COLOUR, -bg COLOUR Foreground/background colour\n" " -bfg COLOUR, -bbg COLOUR Foreground/background bold colour\n" " -cfg COLOUR, -bfg COLOUR Foreground/background cursor colour\n" " -T TITLE Window title\n" " -ut, +ut Do(default) or do not update utmp\n" " -ls, +ls Do(default) or do not make shell a login shell\n" " -sb, +sb Do(default) or do not display a scrollbar\n" " -log PATH Log all output to a file\n" " -nethack Map numeric keypad to hjklyubn direction keys\n" " -xrm RESOURCE-STRING Set an X resource\n" " -e COMMAND [ARGS...] Execute command (consumes all remaining args)\n" ) < 0 || fflush(fp) < 0) { perror("output error"); exit(1); } }if(!strcmp(p, "-help") || !strcmp(p, "--help")) { help(stdout); exit(0); Revision-number: 2165 Prop-content-length: 418 Content-length: 418 K 8 svn:date V 27 2002-10-31T19:49:52.000000Z K 7 svn:log V 317 First attempt at a Unix port of Plink. Seems to basically work; doesn't yet use the SSH agent, no way to specify arbitrary config options, no manpage yet, couple of other fiddly things need doing, but it makes SSH connections and doesn't fall over horribly so I say it's a good start. Now to run it under valgrind... K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 51af4a47f1a624832f7504987dd0ad56 Text-delta-base-sha1: 2af0e53087ce1f5541bfb9b9dcb80ecace17d534 Text-content-length: 716 Text-content-md5: fe3fac416c89a808a26e2b08a7b40ec3 Text-content-sha1: 690b3845edbe60c0e47b85c6e31d4a80b528dcc8 Content-length: 755 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN^#"sz|JHhB + sshdh sshcrcda sshpubk sshzlib sshdss x11fwd portfwd + sshaes sshsh512 sshbn WINSSH = SSH noise pageantc UXSSH = SSH uxnoise uxagentcWINMISC = misc version winstore settings tree234 winnet proxy cmdline UXMISC = misc version uxstore settings tree234 uxWINSSH be_all WINMISC win_res.res LIBS1 puttytel : [G] GUITERM NONSSH be_nossh WINMISC win_res.res LIBS1 plink : [C] plink console NONSSH WINSSH be_all logging WINMISC + plink.res LIBS2 pscp : [C] scp console WINSSH be_none SFTP wildcard WINMISC scp.res LIBS1 psftp : [C] psftp console WINSSH be_none SFTP WIN plink : [X] uxplink uxcons NONSSH UXSSH be_all logging UXMISC Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8695a149a86ae1d4487c0c9da2e0a7aa Text-delta-base-sha1: 62dbe3e394fd597b27f9981d18764e9d7ff86159 Text-content-length: 263 Text-content-md5: a8ef0be48474b18e828ccc5e812ed80e Text-content-sha1: 0987cdabb5d73fb87ce683e23f621099509b0e04 Content-length: 303 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVN-$`fFSzE6wgtk/gtk.h> #include #include #include #include #include #include "misc.h" #include "puttymem.h" #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) int agent_exists(void) { return FALSE; /* FIXME */ } void agent_query(void *in, int inlen, void **out, int *outlen) { /* FIXME */ } Node-path: putty/unix/uxcons.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 8152 Text-content-md5: 47c8e0a8af2dbcde0a48acfffdac3151 Text-content-sha1: 4e6f84c82a3d77bfb79835e0522612c200face84 Content-length: 8268 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNJJJ/* * uxcons.c: various interactive-prompt routines shared between the * Unix console PuTTY tools */ #include #include #include #include #include #include #include "putty.h" #include "storage.h" #include "ssh.h" int console_batch_mode = FALSE; /* * Clean up and exit. */ void cleanup_exit(int code) { /* * Clean up. */ sk_cleanup(); exit(code); } void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; static const char absentmsg_batch[] = "The server's host key is not cached. You have no guarantee\n" "that the server is the computer you think it is.\n" "The server's key fingerprint is:\n" "%s\n" "Connection abandoned.\n"; static const char absentmsg[] = "The server's host key is not cached. You have no guarantee\n" "that the server is the computer you think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, enter \"y\" to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you want to carry on connecting just once, without\n" "adding the key to the cache, enter \"n\".\n" "If you do not trust this host, press Return to abandon the\n" "connection.\n" "Store key in cache? (y/n) "; static const char wrongmsg_batch[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has\n" "cached. This means that either the server administrator\n" "has changed the host key, or you have actually connected\n" "to another computer pretending to be the server.\n" "The new key fingerprint is:\n" "%s\n" "Connection abandoned.\n"; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has\n" "cached. This means that either the server administrator\n" "has changed the host key, or you have actually connected\n" "to another computer pretending to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "enter \"y\" to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, enter \"n\".\n" "If you want to abandon the connection completely, press\n" "Return to cancel. Pressing Return is the ONLY guaranteed\n" "safe choice.\n" "Update cached key? (y/n, Return cancels connection) "; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; /* * Verify the key. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; if (ret == 2) { /* key was different */ if (console_batch_mode) { fprintf(stderr, wrongmsg_batch, fingerprint); cleanup_exit(1); } fprintf(stderr, wrongmsg, fingerprint); fflush(stderr); } if (ret == 1) { /* key was absent */ if (console_batch_mode) { fprintf(stderr, absentmsg_batch, fingerprint); cleanup_exit(1); } fprintf(stderr, absentmsg, fingerprint); fflush(stderr); } { struct termios oldmode, newmode; tcgetattr(0, &oldmode); newmode = oldmode; newmode.c_lflag |= ECHO | ISIG | ICANON; tcsetattr(0, TCSANOW, &newmode); line[0] = '\0'; read(0, line, sizeof(line) - 1); tcsetattr(0, TCSANOW, &oldmode); } if (line[0] != '\0' && line[0] != '\r' && line[0] != '\n') { if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); } else { fprintf(stderr, abandoned); cleanup_exit(0); } } /* * Ask whether the selected cipher is acceptable (since it was * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ void askcipher(void *frontend, char *ciphername, int cs) { static const char msg[] = "The first %scipher supported by the server is\n" "%s, which is below the configured warning threshold.\n" "Continue with connection? (y/n) "; static const char msg_batch[] = "The first %scipher supported by the server is\n" "%s, which is below the configured warning threshold.\n" "Connection abandoned.\n"; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; if (console_batch_mode) { fprintf(stderr, msg_batch, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); cleanup_exit(1); } fprintf(stderr, msg, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); fflush(stderr); { struct termios oldmode, newmode; tcgetattr(0, &oldmode); newmode = oldmode; newmode.c_lflag |= ECHO | ISIG | ICANON; tcsetattr(0, TCSANOW, &newmode); line[0] = '\0'; read(0, line, sizeof(line) - 1); tcsetattr(0, TCSANOW, &oldmode); } if (line[0] == 'y' || line[0] == 'Y') { return; } else { fprintf(stderr, abandoned); cleanup_exit(0); } } /* * Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ int askappend(void *frontend, char *filename) { static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n" "You can overwrite it with a new session log,\n" "append your session log to the end of it,\n" "or disable session logging for this session.\n" "Enter \"y\" to wipe the file, \"n\" to append to it,\n" "or just press Return to disable logging.\n" "Wipe the log file? (y/n, Return cancels logging) "; static const char msgtemplate_batch[] = "The session log file \"%.*s\" already exists.\n" "Logging will not be enabled.\n"; char line[32]; if (cfg.logxfovr != LGXF_ASK) { return ((cfg.logxfovr == LGXF_OVR) ? 2 : 1); } if (console_batch_mode) { fprintf(stderr, msgtemplate_batch, FILENAME_MAX, filename); fflush(stderr); return 0; } fprintf(stderr, msgtemplate, FILENAME_MAX, filename); fflush(stderr); { struct termios oldmode, newmode; tcgetattr(0, &oldmode); newmode = oldmode; newmode.c_lflag |= ECHO | ISIG | ICANON; tcsetattr(0, TCSANOW, &newmode); line[0] = '\0'; read(0, line, sizeof(line) - 1); tcsetattr(0, TCSANOW, &oldmode); } if (line[0] == 'y' || line[0] == 'Y') return 2; else if (line[0] == 'n' || line[0] == 'N') return 1; else return 0; } /* * Warn about the obsolescent key file format. * * Uniquely among these functions, this one does _not_ expect a * frontend handle. This means that if PuTTY is ported to a * platform which requires frontend handles, this function will be * an anomaly. Fortunately, the problem it addresses will not have * been present on that platform, so it can plausibly be * implemented as an empty function. */ void old_keyfile_warning(void) { static const char message[] = "You are loading an SSH 2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "PuTTY may stop supporting this private key format,\n" "so we recommend you convert your key to the new\n" "format.\n" "\n" "Once the key is loaded into PuTTYgen, you can perform\n" "this conversion simply by saving it again.\n"; fputs(message, stderr); } void logevent(void *frontend, char *string) { } int console_get_line(const char *prompt, char *str, int maxlen, int is_pw) { struct termios oldmode, newmode; int i; if (console_batch_mode) { if (maxlen > 0) str[0] = '\0'; } else { tcgetattr(0, &oldmode); newmode = oldmode; newmode.c_lflag |= ISIG | ICANON; if (is_pw) newmode.c_lflag &= ~ECHO; else newmode.c_lflag |= ECHO; tcsetattr(0, TCSANOW, &newmode); fputs(prompt, stdout); fflush(stdout); i = read(0, str, maxlen - 1); tcsetattr(0, TCSANOW, &oldmode); if (i > 0 && str[i-1] == '\n') i--; str[i] = '\0'; if (is_pw) fputs("\r\n", stdout); } return 1; } void frontend_keypress(void *handle) { /* * This is nothing but a stub, in console code. */ return; } Node-path: putty/unix/uxnet.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 25173 Text-content-md5: f606bc1e7432022f7fb7a073fc8cd1d7 Text-content-sha1: b7601aa05bfb4f7fe940d25073a83b41b4afa904 Content-length: 25289 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNDDD/* * Unix networking abstraction. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFINE_PLUG_METHOD_MACROS #include "putty.h" #include "network.h" #include "tree234.h" struct Socket_tag { struct socket_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ char *error; int s; Plug plug; void *private_ptr; bufchain output_data; int connected; int writable; int frozen; /* this causes readability notifications to be ignored */ int frozen_readable; /* this means we missed at least one readability * notification while we were frozen */ int localhost_only; /* for listening sockets */ char oobdata[1]; int sending_oob; int oobpending; /* is there OOB data available to read? */ int oobinline; int pending_error; /* in case send() returns error */ int listener; }; /* * We used to typedef struct Socket_tag *Socket. * * Since we have made the networking abstraction slightly more * abstract, Socket no longer means a tcp socket (it could mean * an ssl socket). So now we must use Actual_Socket when we know * we are talking about a tcp socket. */ typedef struct Socket_tag *Actual_Socket; struct SockAddr_tag { char *error; /* address family this belongs to, AF_INET for IPv4, AF_INET6 for IPv6. */ int family; unsigned long address; /* Address IPv4 style. */ #ifdef IPV6 struct addrinfo *ai; /* Address IPv6 style. */ #endif }; static tree234 *sktree; static int cmpfortree(void *av, void *bv) { Actual_Socket a = (Actual_Socket) av, b = (Actual_Socket) bv; int as = a->s, bs = b->s; if (as < bs) return -1; if (as > bs) return +1; return 0; } static int cmpforsearch(void *av, void *bv) { Actual_Socket b = (Actual_Socket) bv; int as = (int) av, bs = b->s; if (as < bs) return -1; if (as > bs) return +1; return 0; } void sk_init(void) { sktree = newtree234(cmpfortree); } void sk_cleanup(void) { Actual_Socket s; int i; if (sktree) { for (i = 0; (s = index234(sktree, i)) != NULL; i++) { close(s->s); } } } char *error_string(int error) { switch (error) { case EACCES: return "Network error: Permission denied"; case EADDRINUSE: return "Network error: Address already in use"; case EADDRNOTAVAIL: return "Network error: Cannot assign requested address"; case EAFNOSUPPORT: return "Network error: Address family not supported by protocol family"; case EALREADY: return "Network error: Operation already in progress"; case ECONNABORTED: return "Network error: Software caused connection abort"; case ECONNREFUSED: return "Network error: Connection refused"; case ECONNRESET: return "Network error: Connection reset by peer"; case EDESTADDRREQ: return "Network error: Destination address required"; case EFAULT: return "Network error: Bad address"; case EHOSTDOWN: return "Network error: Host is down"; case EHOSTUNREACH: return "Network error: No route to host"; case EINPROGRESS: return "Network error: Operation now in progress"; case EINTR: return "Network error: Interrupted function call"; case EINVAL: return "Network error: Invalid argument"; case EISCONN: return "Network error: Socket is already connected"; case EMFILE: return "Network error: Too many open files"; case EMSGSIZE: return "Network error: Message too long"; case ENETDOWN: return "Network error: Network is down"; case ENETRESET: return "Network error: Network dropped connection on reset"; case ENETUNREACH: return "Network error: Network is unreachable"; case ENOBUFS: return "Network error: No buffer space available"; case ENOPROTOOPT: return "Network error: Bad protocol option"; case ENOTCONN: return "Network error: Socket is not connected"; case ENOTSOCK: return "Network error: Socket operation on non-socket"; case EOPNOTSUPP: return "Network error: Operation not supported"; case EPFNOSUPPORT: return "Network error: Protocol family not supported"; case EPROTONOSUPPORT: return "Network error: Protocol not supported"; case EPROTOTYPE: return "Network error: Protocol wrong type for socket"; case ESHUTDOWN: return "Network error: Cannot send after socket shutdown"; case ESOCKTNOSUPPORT: return "Network error: Socket type not supported"; case ETIMEDOUT: return "Network error: Connection timed out"; case EWOULDBLOCK: return "Network error: Resource temporarily unavailable"; default: return "Unknown network error"; } } SockAddr sk_namelookup(char *host, char **canonicalname) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); unsigned long a; struct hostent *h = NULL; char realhost[8192]; /* Clear the structure and default to IPv4. */ memset(ret, 0, sizeof(struct SockAddr_tag)); ret->family = 0; /* We set this one when we have resolved the host. */ *realhost = '\0'; ret->error = NULL; if ((a = inet_addr(host)) == (unsigned long) INADDR_NONE) { #ifdef IPV6 if (getaddrinfo(host, NULL, NULL, &ret->ai) == 0) { ret->family = ret->ai->ai_family; } else #endif { /* * Otherwise use the IPv4-only gethostbyname... (NOTE: * we don't use gethostbyname as a fallback!) */ if (ret->family == 0) { /*debug(("Resolving \"%s\" with gethostbyname() (IPv4 only)...\n", host)); */ if ( (h = gethostbyname(host)) ) ret->family = AF_INET; } if (ret->family == 0) ret->error = (h_errno == HOST_NOT_FOUND || h_errno == NO_DATA || h_errno == NO_ADDRESS ? "Host does not exist" : h_errno == TRY_AGAIN ? "Temporary name service failure" : "gethostbyname: unknown error"); } #ifdef IPV6 /* If we got an address info use that... */ if (ret->ai) { /* Are we in IPv4 fallback mode? */ /* We put the IPv4 address into the a variable so we can further-on use the IPv4 code... */ if (ret->family == AF_INET) memcpy(&a, (char *) &((struct sockaddr_in *) ret->ai-> ai_addr)->sin_addr, sizeof(a)); /* Now let's find that canonicalname... */ if (getnameinfo((struct sockaddr *) ret->ai->ai_addr, ret->family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), realhost, sizeof(realhost), NULL, 0, 0) != 0) { strncpy(realhost, host, sizeof(realhost)); } } /* We used the IPv4-only gethostbyname()... */ else #endif { memcpy(&a, h->h_addr, sizeof(a)); /* This way we are always sure the h->h_name is valid :) */ strncpy(realhost, h->h_name, sizeof(realhost)); } } else { /* * This must be a numeric IPv4 address because it caused a * success return from inet_addr. */ ret->family = AF_INET; strncpy(realhost, host, sizeof(realhost)); } ret->address = ntohl(a); realhost[lenof(realhost)-1] = '\0'; *canonicalname = smalloc(1+strlen(realhost)); strcpy(*canonicalname, realhost); return ret; } void sk_getaddr(SockAddr addr, char *buf, int buflen) { #ifdef IPV6 if (addr->family == AF_INET) { #endif struct in_addr a; a.s_addr = htonl(addr->address); strncpy(buf, inet_ntoa(a), buflen); #ifdef IPV6 } else { FIXME; /* I don't know how to get a text form of an IPv6 address. */ } #endif } int sk_addrtype(SockAddr addr) { return (addr->family == AF_INET ? ADDRTYPE_IPV4 : ADDRTYPE_IPV6); } void sk_addrcopy(SockAddr addr, char *buf) { #ifdef IPV6 if (addr->family == AF_INET) { #endif struct in_addr a; a.s_addr = htonl(addr->address); memcpy(buf, (char*) &a.s_addr, 4); #ifdef IPV6 } else { memcpy(buf, (char*) addr->ai, 16); } #endif } void sk_addr_free(SockAddr addr) { sfree(addr); } static Plug sk_tcp_plug(Socket sock, Plug p) { Actual_Socket s = (Actual_Socket) sock; Plug ret = s->plug; if (p) s->plug = p; return ret; } static void sk_tcp_flush(Socket s) { /* * We send data to the socket as soon as we can anyway, * so we don't need to do anything here. :-) */ } static void sk_tcp_close(Socket s); static int sk_tcp_write(Socket s, char *data, int len); static int sk_tcp_write_oob(Socket s, char *data, int len); static void sk_tcp_set_private_ptr(Socket s, void *ptr); static void *sk_tcp_get_private_ptr(Socket s); static void sk_tcp_set_frozen(Socket s, int is_frozen); static char *sk_tcp_socket_error(Socket s); Socket sk_register(void *sock, Plug plug) { static struct socket_function_table fn_table = { sk_tcp_plug, sk_tcp_close, sk_tcp_write, sk_tcp_write_oob, sk_tcp_flush, sk_tcp_set_private_ptr, sk_tcp_get_private_ptr, sk_tcp_set_frozen, sk_tcp_socket_error }; Actual_Socket ret; /* * Create Socket structure. */ ret = smalloc(sizeof(struct Socket_tag)); ret->fn = &fn_table; ret->error = NULL; ret->plug = plug; bufchain_init(&ret->output_data); ret->writable = 1; /* to start with */ ret->sending_oob = 0; ret->frozen = 1; ret->frozen_readable = 0; ret->localhost_only = 0; /* unused, but best init anyway */ ret->pending_error = 0; ret->oobpending = FALSE; ret->listener = 0; ret->s = (int)sock; if (ret->s < 0) { ret->error = error_string(errno); return (Socket) ret; } ret->oobinline = 0; add234(sktree, ret); return (Socket) ret; } Socket sk_new(SockAddr addr, int port, int privport, int oobinline, int nodelay, Plug plug) { static struct socket_function_table fn_table = { sk_tcp_plug, sk_tcp_close, sk_tcp_write, sk_tcp_write_oob, sk_tcp_flush, sk_tcp_set_private_ptr, sk_tcp_get_private_ptr, sk_tcp_set_frozen, sk_tcp_socket_error }; int s; #ifdef IPV6 struct sockaddr_in6 a6; #endif struct sockaddr_in a; int err; Actual_Socket ret; short localport; /* * Create Socket structure. */ ret = smalloc(sizeof(struct Socket_tag)); ret->fn = &fn_table; ret->error = NULL; ret->plug = plug; bufchain_init(&ret->output_data); ret->connected = 0; /* to start with */ ret->writable = 0; /* to start with */ ret->sending_oob = 0; ret->frozen = 0; ret->frozen_readable = 0; ret->localhost_only = 0; /* unused, but best init anyway */ ret->pending_error = 0; ret->oobpending = FALSE; ret->listener = 0; /* * Open socket. */ s = socket(addr->family, SOCK_STREAM, 0); ret->s = s; if (s < 0) { ret->error = error_string(errno); return (Socket) ret; } ret->oobinline = oobinline; if (oobinline) { int b = TRUE; setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (void *) &b, sizeof(b)); } if (nodelay) { int b = TRUE; setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *) &b, sizeof(b)); } /* * Bind to local address. */ if (privport) localport = 1023; /* count from 1023 downwards */ else localport = 0; /* just use port 0 (ie kernel picks) */ /* Loop round trying to bind */ while (1) { int retcode; #ifdef IPV6 if (addr->family == AF_INET6) { memset(&a6, 0, sizeof(a6)); a6.sin6_family = AF_INET6; /*a6.sin6_addr = in6addr_any; *//* == 0 */ a6.sin6_port = htons(localport); } else #endif { a.sin_family = AF_INET; a.sin_addr.s_addr = htonl(INADDR_ANY); a.sin_port = htons(localport); } #ifdef IPV6 retcode = bind(s, (addr->family == AF_INET6 ? (struct sockaddr *) &a6 : (struct sockaddr *) &a), (addr->family == AF_INET6 ? sizeof(a6) : sizeof(a))); #else retcode = bind(s, (struct sockaddr *) &a, sizeof(a)); #endif if (retcode >= 0) { err = 0; break; /* done */ } else { err = errno; if (err != EADDRINUSE) /* failed, for a bad reason */ break; } if (localport == 0) break; /* we're only looping once */ localport--; if (localport == 0) break; /* we might have got to the end */ } if (err) { ret->error = error_string(err); return (Socket) ret; } /* * Connect to remote address. */ #ifdef IPV6 if (addr->family == AF_INET6) { memset(&a, 0, sizeof(a)); a6.sin6_family = AF_INET6; a6.sin6_port = htons((short) port); a6.sin6_addr = ((struct sockaddr_in6 *) addr->ai->ai_addr)->sin6_addr; } else #endif { a.sin_family = AF_INET; a.sin_addr.s_addr = htonl(addr->address); a.sin_port = htons((short) port); } if (( #ifdef IPV6 connect(s, ((addr->family == AF_INET6) ? (struct sockaddr *) &a6 : (struct sockaddr *) &a), (addr->family == AF_INET6) ? sizeof(a6) : sizeof(a)) #else connect(s, (struct sockaddr *) &a, sizeof(a)) #endif ) < 0) { /* * FIXME: We are prepared to receive EWOULDBLOCK here, * because we might want the connection to be made * asynchronously; but how do we actually arrange this in * Unix? I forget. */ if ( errno != EWOULDBLOCK ) { ret->error = error_string(errno); return (Socket) ret; } } else { /* * If we _don't_ get EWOULDBLOCK, the connect has completed * and we should set the socket as connected and writable. */ ret->connected = 1; ret->writable = 1; } add234(sktree, ret); return (Socket) ret; } Socket sk_newlistener(int port, Plug plug, int local_host_only) { static struct socket_function_table fn_table = { sk_tcp_plug, sk_tcp_close, sk_tcp_write, sk_tcp_write_oob, sk_tcp_flush, sk_tcp_set_private_ptr, sk_tcp_get_private_ptr, sk_tcp_set_frozen, sk_tcp_socket_error }; int s; #ifdef IPV6 struct sockaddr_in6 a6; #endif struct sockaddr_in a; int err; Actual_Socket ret; int retcode; int on = 1; /* * Create Socket structure. */ ret = smalloc(sizeof(struct Socket_tag)); ret->fn = &fn_table; ret->error = NULL; ret->plug = plug; bufchain_init(&ret->output_data); ret->writable = 0; /* to start with */ ret->sending_oob = 0; ret->frozen = 0; ret->frozen_readable = 0; ret->localhost_only = local_host_only; ret->pending_error = 0; ret->oobpending = FALSE; ret->listener = 1; /* * Open socket. */ s = socket(AF_INET, SOCK_STREAM, 0); ret->s = s; if (s < 0) { ret->error = error_string(errno); return (Socket) ret; } ret->oobinline = 0; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)); #ifdef IPV6 if (addr->family == AF_INET6) { memset(&a6, 0, sizeof(a6)); a6.sin6_family = AF_INET6; if (local_host_only) a6.sin6_addr = in6addr_loopback; else a6.sin6_addr = in6addr_any; a6.sin6_port = htons(port); } else #endif { a.sin_family = AF_INET; if (local_host_only) a.sin_addr.s_addr = htonl(INADDR_LOOPBACK); else a.sin_addr.s_addr = htonl(INADDR_ANY); a.sin_port = htons((short)port); } #ifdef IPV6 retcode = bind(s, (addr->family == AF_INET6 ? (struct sockaddr *) &a6 : (struct sockaddr *) &a), (addr->family == AF_INET6 ? sizeof(a6) : sizeof(a))); #else retcode = bind(s, (struct sockaddr *) &a, sizeof(a)); #endif if (retcode >= 0) { err = 0; } else { err = errno; } if (err) { ret->error = error_string(err); return (Socket) ret; } if (listen(s, SOMAXCONN) < 0) { close(s); ret->error = error_string(errno); return (Socket) ret; } add234(sktree, ret); return (Socket) ret; } static void sk_tcp_close(Socket sock) { Actual_Socket s = (Actual_Socket) sock; del234(sktree, s); close(s->s); sfree(s); } /* * The function which tries to send on a socket once it's deemed * writable. */ void try_send(Actual_Socket s) { while (s->sending_oob || bufchain_size(&s->output_data) > 0) { int nsent; int err; void *data; int len, urgentflag; if (s->sending_oob) { urgentflag = MSG_OOB; len = s->sending_oob; data = &s->oobdata; } else { urgentflag = 0; bufchain_prefix(&s->output_data, &data, &len); } nsent = send(s->s, data, len, urgentflag); noise_ultralight(nsent); if (nsent <= 0) { err = (nsent < 0 ? errno : 0); if (err == EWOULDBLOCK) { /* * Perfectly normal: we've sent all we can for the moment. */ s->writable = FALSE; return; } else if (nsent == 0 || err == ECONNABORTED || err == ECONNRESET) { /* * If send() returns CONNABORTED or CONNRESET, we * unfortunately can't just call plug_closing(), * because it's quite likely that we're currently * _in_ a call from the code we'd be calling back * to, so we'd have to make half the SSH code * reentrant. Instead we flag a pending error on * the socket, to be dealt with (by calling * plug_closing()) at some suitable future moment. */ s->pending_error = err; return; } else { /* We're inside the Unix frontend here, so we know * that the frontend handle is unnecessary. */ logevent(NULL, error_string(err)); fatalbox("%s", error_string(err)); } } else { if (s->sending_oob) { if (nsent < len) { memmove(s->oobdata, s->oobdata+nsent, len-nsent); s->sending_oob = len - nsent; } else { s->sending_oob = 0; } } else { bufchain_consume(&s->output_data, nsent); } } } } static int sk_tcp_write(Socket sock, char *buf, int len) { Actual_Socket s = (Actual_Socket) sock; /* * Add the data to the buffer list on the socket. */ bufchain_add(&s->output_data, buf, len); /* * Now try sending from the start of the buffer list. */ if (s->writable) try_send(s); return bufchain_size(&s->output_data); } static int sk_tcp_write_oob(Socket sock, char *buf, int len) { Actual_Socket s = (Actual_Socket) sock; /* * Replace the buffer list on the socket with the data. */ bufchain_clear(&s->output_data); assert(len <= sizeof(s->oobdata)); memcpy(s->oobdata, buf, len); s->sending_oob = len; /* * Now try sending from the start of the buffer list. */ if (s->writable) try_send(s); return s->sending_oob; } int select_result(int fd, int event) { int ret; int err; char buf[20480]; /* nice big buffer for plenty of speed */ Actual_Socket s; u_long atmark; /* Find the Socket structure */ s = find234(sktree, (void *) fd, cmpforsearch); if (!s) return 1; /* boggle */ noise_ultralight(event); switch (event) { #ifdef FIXME_NONBLOCKING_CONNECTIONS case FIXME: /* connected */ s->connected = s->writable = 1; break; #endif case 4: /* exceptional */ if (!s->oobinline) { /* * On a non-oobinline socket, this indicates that we * can immediately perform an OOB read and get back OOB * data, which we will send to the back end with * type==2 (urgent data). */ ret = recv(s->s, buf, sizeof(buf), MSG_OOB); noise_ultralight(ret); if (ret <= 0) { char *str = (ret == 0 ? "Internal networking trouble" : error_string(errno)); /* We're inside the Unix frontend here, so we know * that the frontend handle is unnecessary. */ logevent(NULL, str); fatalbox("%s", str); } else { return plug_receive(s->plug, 2, buf, ret); } break; } /* * If we reach here, this is an oobinline socket, which * means we should set s->oobpending and then fall through * to the read case. */ s->oobpending = TRUE; case 1: /* readable; also acceptance */ if (s->listener) { /* * On a listening socket, the readability event means a * connection is ready to be accepted. */ struct sockaddr_in isa; int addrlen = sizeof(struct sockaddr_in); int t; /* socket of connection */ memset(&isa, 0, sizeof(struct sockaddr_in)); err = 0; t = accept(s->s,(struct sockaddr *)&isa,&addrlen); if (t < 0) { break; } if (s->localhost_only && ntohl(isa.sin_addr.s_addr) != INADDR_LOOPBACK) { close(t); /* someone let nonlocal through?! */ } else if (plug_accepting(s->plug, (void*)t)) { close(t); /* denied or error */ } break; } /* * If we reach here, this is not a listening socket, so * readability really means readability. */ /* In the case the socket is still frozen, we don't even bother */ if (s->frozen) { s->frozen_readable = 1; break; } /* * We have received data on the socket. For an oobinline * socket, this might be data _before_ an urgent pointer, * in which case we send it to the back end with type==1 * (data prior to urgent). */ if (s->oobinline && s->oobpending) { atmark = 1; if (ioctl(s->s, SIOCATMARK, &atmark) == 0 && atmark) s->oobpending = FALSE; /* clear this indicator */ } else atmark = 1; ret = recv(s->s, buf, sizeof(buf), 0); noise_ultralight(ret); if (ret < 0) { if (errno == EWOULDBLOCK) { break; } } if (ret < 0) { return plug_closing(s->plug, error_string(errno), errno, 0); } else if (0 == ret) { return plug_closing(s->plug, NULL, 0, 0); } else { return plug_receive(s->plug, atmark ? 0 : 1, buf, ret); } break; case 2: /* writable */ { int bufsize_before, bufsize_after; s->writable = 1; bufsize_before = s->sending_oob + bufchain_size(&s->output_data); try_send(s); bufsize_after = s->sending_oob + bufchain_size(&s->output_data); if (bufsize_after < bufsize_before) plug_sent(s->plug, bufsize_after); } break; } return 1; } /* * Deal with socket errors detected in try_send(). */ void net_pending_errors(void) { int i; Actual_Socket s; /* * This might be a fiddly business, because it's just possible * that handling a pending error on one socket might cause * others to be closed. (I can't think of any reason this might * happen in current SSH implementation, but to maintain * generality of this network layer I'll assume the worst.) * * So what we'll do is search the socket list for _one_ socket * with a pending error, and then handle it, and then search * the list again _from the beginning_. Repeat until we make a * pass with no socket errors present. That way we are * protected against the socket list changing under our feet. */ do { for (i = 0; (s = index234(sktree, i)) != NULL; i++) { if (s->pending_error) { /* * An error has occurred on this socket. Pass it to the * plug. */ plug_closing(s->plug, error_string(s->pending_error), s->pending_error, 0); break; } } } while (s); } /* * Each socket abstraction contains a `void *' private field in * which the client can keep state. */ static void sk_tcp_set_private_ptr(Socket sock, void *ptr) { Actual_Socket s = (Actual_Socket) sock; s->private_ptr = ptr; } static void *sk_tcp_get_private_ptr(Socket sock) { Actual_Socket s = (Actual_Socket) sock; return s->private_ptr; } /* * Special error values are returned from sk_namelookup and sk_new * if there's a problem. These functions extract an error message, * or return NULL if there's no problem. */ char *sk_addr_error(SockAddr addr) { return addr->error; } static char *sk_tcp_socket_error(Socket sock) { Actual_Socket s = (Actual_Socket) sock; return s->error; } static void sk_tcp_set_frozen(Socket sock, int is_frozen) { Actual_Socket s = (Actual_Socket) sock; if (s->frozen == is_frozen) return; s->frozen = is_frozen; if (!is_frozen && s->frozen_readable) { char c; recv(s->s, &c, 1, MSG_PEEK); } s->frozen_readable = 0; } /* * For Unix select()-based frontends: enumerate all sockets * currently active, and state whether we currently wish to receive * select events on them for reading, writing and exceptional * status. */ static void set_rwx(Actual_Socket s, int *rwx) { int val = 0; if (s->connected && !s->frozen) val |= 1 | 4; /* read, except */ if (bufchain_size(&s->output_data)) val |= 2; /* write */ if (s->listener) val |= 1; /* read == accept */ *rwx = val; } int first_socket(int *state, int *rwx) { Actual_Socket s; *state = 0; s = index234(sktree, (*state)++); if (s) set_rwx(s, rwx); return s ? s->s : -1; } int next_socket(int *state, int *rwx) { Actual_Socket s = index234(sktree, (*state)++); if (s) set_rwx(s, rwx); return s ? s->s : -1; } int net_service_lookup(char *service) { struct servent *se; se = getservbyname(service, NULL); if (se != NULL) return ntohs(se->s_port); else return 0; } Node-path: putty/unix/uxnoise.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2081 Text-content-md5: 04588e03451006cc4610aa1a6fe85e64 Text-content-sha1: 5fb2a33deef5b7ad6cda4c886b64e50d12264fee Content-length: 2197 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN/* * Noise generation for PuTTY's cryptographic random number * generator. */ #include #include #include #include #include "putty.h" #include "ssh.h" #include "storage.h" /* * FIXME. This module currently depends critically on /dev/urandom, * because it has no fallback mechanism for doing anything else. */ static void read_dev_urandom(char *buf, int len) { int fd; int ngot, ret; fd = open("/dev/urandom", O_RDONLY); if (fd < 0) { perror("/dev/urandom: open"); exit(1); } ngot = 0; while (ngot < len) { ret = read(fd, buf+ngot, len-ngot); if (ret < 0) { perror("/dev/urandom: read"); exit(1); } ngot += ret; } } /* * This function is called once, at PuTTY startup. Currently it * will read 32 bytes out of /dev/urandom and seed the internal * generator with them. */ void noise_get_heavy(void (*func) (void *, int)) { char buf[32]; read_dev_urandom(buf, sizeof(buf)); func(buf, sizeof(buf)); } void random_save_seed(void) { /* Currently we do nothing here. FIXME? */ } /* * This function is called every time the urandom pool needs * stirring, and will acquire the system time. */ void noise_get_light(void (*func) (void *, int)) { struct timeval tv; gettimeofday(&tv, NULL); func(&tv, sizeof(tv)); } /* * This function is called on a timer, and it will just pull some * stuff out of /dev/urandom. FIXME: really I suspect we ought not * to deplete /dev/urandom like this. Better to grab something more * harmless. */ void noise_regular(void) { char buf[4]; read_dev_urandom(buf, sizeof(buf)); random_add_noise(buf, sizeof(buf)); } /* * This function is called on every keypress or mouse move, and * will add the current time to the noise pool. It gets the scan * code or mouse position passed in, and adds that too. */ void noise_ultralight(unsigned long data) { struct timeval tv; gettimeofday(&tv, NULL); random_add_noise(&tv, sizeof(tv)); random_add_noise(&data, sizeof(data)); } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 14110 Text-content-md5: fa034c588b35c4e7e7be1a54ac72f449 Text-content-sha1: 3e5dc21df6b80ab64cd0634787f5a95cc21b1457 Content-length: 14226 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN/* * PLink - a command-line (stdin/stdout) variant of PuTTY. */ #include #include #include #include #include #include #include /* More helpful version of the FD_SET macro, to also handle maxfd. */ #define FD_SET_MAX(fd, max, set) do { \ FD_SET(fd, &set); \ if (max < fd + 1) max = fd + 1; \ } while (0) #define PUTTY_DO_GLOBALS /* actually _define_ globals */ #include "putty.h" #include "storage.h" #include "tree234.h" #define MAX_STDIN_BACKLOG 4096 void fatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); cleanup_exit(1); } void modalfatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); cleanup_exit(1); } void connection_fatal(void *frontend, char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); cleanup_exit(1); } void cmdline_error(char *p, ...) { va_list ap; fprintf(stderr, "plink: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } struct termios orig_termios; static Backend *back; static void *backhandle; char *x_get_default(char *key) { return NULL; /* this is a stub */ } int term_ldisc(Terminal *term, int mode) { return FALSE; } void ldisc_update(void *frontend, int echo, int edit) { /* Update stdin read mode to reflect changes in line discipline. */ struct termios mode; mode = orig_termios; if (echo) mode.c_lflag |= ECHO; else mode.c_lflag &= ~ECHO; if (edit) mode.c_lflag |= ISIG | ICANON; else mode.c_lflag &= ~(ISIG | ICANON); tcsetattr(0, TCSANOW, &mode); } void cleanup_termios(void) { tcsetattr(0, TCSANOW, &orig_termios); } bufchain stdout_data, stderr_data; void try_output(int is_stderr) { bufchain *chain = (is_stderr ? &stderr_data : &stdout_data); int fd = (is_stderr ? 2 : 1); void *senddata; int sendlen, ret; bufchain_prefix(chain, &senddata, &sendlen); ret = write(fd, senddata, sendlen); if (ret > 0) bufchain_consume(chain, ret); else if (ret < 0) { perror(is_stderr ? "stderr: write" : "stdout: write"); exit(1); } } int from_backend(void *frontend_handle, int is_stderr, char *data, int len) { int osize, esize; assert(len > 0); if (is_stderr) { bufchain_add(&stderr_data, data, len); try_output(1); } else { bufchain_add(&stdout_data, data, len); try_output(0); } osize = bufchain_size(&stdout_data); esize = bufchain_size(&stderr_data); return osize + esize; } /* * Short description of parameters. */ static void usage(void) { printf("PuTTY Link: command-line connection utility\n"); printf("%s\n", ver); printf("Usage: plink [options] [user@]host [command]\n"); printf(" (\"host\" can also be a PuTTY saved session name)\n"); printf("Options:\n"); printf(" -v show verbose messages\n"); printf(" -load sessname Load settings from saved session\n"); printf(" -ssh -telnet -rlogin -raw\n"); printf(" force use of a particular protocol (default SSH)\n"); printf(" -P port connect to specified port\n"); printf(" -l user connect with specified username\n"); printf(" -m file read remote command(s) from file\n"); printf(" -batch disable all interactive prompts\n"); printf("The following options only apply to SSH connections:\n"); printf(" -pw passw login with specified password\n"); printf(" -L listen-port:host:port Forward local port to " "remote address\n"); printf(" -R listen-port:host:port Forward remote port to" " local address\n"); printf(" -X -x enable / disable X11 forwarding\n"); printf(" -A -a enable / disable agent forwarding\n"); printf(" -t -T enable / disable pty allocation\n"); printf(" -1 -2 force use of particular protocol version\n"); printf(" -C enable compression\n"); printf(" -i key private key file for authentication\n"); exit(1); } int main(int argc, char **argv) { int sending; int portnumber = -1; int *sklist; int socket; int i, skcount, sksize, socketstate; int connopen; int exitcode; void *logctx; void *ldisc; ssh_get_line = console_get_line; sklist = NULL; skcount = sksize = 0; /* * Initialise port and protocol to sensible defaults. (These * will be overridden by more or less anything.) */ default_protocol = PROT_SSH; default_port = 22; flags = FLAG_STDERR; /* * Process the command line. */ do_defaults(NULL, &cfg); default_protocol = cfg.protocol; default_port = cfg.port; { /* * Override the default protocol if PLINK_PROTOCOL is set. */ char *p = getenv("PLINK_PROTOCOL"); int i; if (p) { for (i = 0; backends[i].backend != NULL; i++) { if (!strcmp(backends[i].name, p)) { default_protocol = cfg.protocol = backends[i].protocol; default_port = cfg.port = backends[i].backend->default_port; break; } } } } while (--argc) { char *p = *++argv; if (*p == '-') { int ret = cmdline_process_param(p, (argc > 1 ? argv[1] : NULL), 1); if (ret == -2) { fprintf(stderr, "plink: option \"%s\" requires an argument\n", p); } else if (ret == 2) { --argc, ++argv; } else if (ret == 1) { continue; } else if (!strcmp(p, "-batch")) { console_batch_mode = 1; } } else if (*p) { if (!*cfg.host) { char *q = p; /* * If the hostname starts with "telnet:", set the * protocol to Telnet and process the string as a * Telnet URL. */ if (!strncmp(q, "telnet:", 7)) { char c; q += 7; if (q[0] == '/' && q[1] == '/') q += 2; cfg.protocol = PROT_TELNET; p = q; while (*p && *p != ':' && *p != '/') p++; c = *p; if (*p) *p++ = '\0'; if (c == ':') cfg.port = atoi(p); else cfg.port = -1; strncpy(cfg.host, q, sizeof(cfg.host) - 1); cfg.host[sizeof(cfg.host) - 1] = '\0'; } else { char *r; /* * Before we process the [user@]host string, we * first check for the presence of a protocol * prefix (a protocol name followed by ","). */ r = strchr(p, ','); if (r) { int i, j; for (i = 0; backends[i].backend != NULL; i++) { j = strlen(backends[i].name); if (j == r - p && !memcmp(backends[i].name, p, j)) { default_protocol = cfg.protocol = backends[i].protocol; portnumber = backends[i].backend->default_port; p = r + 1; break; } } } /* * Three cases. Either (a) there's a nonzero * length string followed by an @, in which * case that's user and the remainder is host. * Or (b) there's only one string, not counting * a potential initial @, and it exists in the * saved-sessions database. Or (c) only one * string and it _doesn't_ exist in the * database. */ r = strrchr(p, '@'); if (r == p) p++, r = NULL; /* discount initial @ */ if (r == NULL) { /* * One string. */ Config cfg2; do_defaults(p, &cfg2); if (cfg2.host[0] == '\0') { /* No settings for this host; use defaults */ strncpy(cfg.host, p, sizeof(cfg.host) - 1); cfg.host[sizeof(cfg.host) - 1] = '\0'; cfg.port = default_port; } else { cfg = cfg2; cfg.remote_cmd_ptr = cfg.remote_cmd; } } else { *r++ = '\0'; strncpy(cfg.username, p, sizeof(cfg.username) - 1); cfg.username[sizeof(cfg.username) - 1] = '\0'; strncpy(cfg.host, r, sizeof(cfg.host) - 1); cfg.host[sizeof(cfg.host) - 1] = '\0'; cfg.port = default_port; } } } else { char *command; int cmdlen, cmdsize; cmdlen = cmdsize = 0; command = NULL; while (argc) { while (*p) { if (cmdlen >= cmdsize) { cmdsize = cmdlen + 512; command = srealloc(command, cmdsize); } command[cmdlen++]=*p++; } if (cmdlen >= cmdsize) { cmdsize = cmdlen + 512; command = srealloc(command, cmdsize); } command[cmdlen++]=' '; /* always add trailing space */ if (--argc) p = *++argv; } if (cmdlen) command[--cmdlen]='\0'; /* change trailing blank to NUL */ cfg.remote_cmd_ptr = command; cfg.remote_cmd_ptr2 = NULL; cfg.nopty = TRUE; /* command => no terminal */ break; /* done with cmdline */ } } } if (!*cfg.host) { usage(); } /* * Trim leading whitespace off the hostname if it's there. */ { int space = strspn(cfg.host, " \t"); memmove(cfg.host, cfg.host+space, 1+strlen(cfg.host)-space); } /* See if host is of the form user@host */ if (cfg.host[0] != '\0') { char *atsign = strchr(cfg.host, '@'); /* Make sure we're not overflowing the user field */ if (atsign) { if (atsign - cfg.host < sizeof cfg.username) { strncpy(cfg.username, cfg.host, atsign - cfg.host); cfg.username[atsign - cfg.host] = '\0'; } memmove(cfg.host, atsign + 1, 1 + strlen(atsign + 1)); } } /* * Perform command-line overrides on session configuration. */ cmdline_run_saved(); /* * Trim a colon suffix off the hostname if it's there. */ cfg.host[strcspn(cfg.host, ":")] = '\0'; /* * Remove any remaining whitespace from the hostname. */ { int p1 = 0, p2 = 0; while (cfg.host[p2] != '\0') { if (cfg.host[p2] != ' ' && cfg.host[p2] != '\t') { cfg.host[p1] = cfg.host[p2]; p1++; } p2++; } cfg.host[p1] = '\0'; } if (!*cfg.remote_cmd_ptr) flags |= FLAG_INTERACTIVE; /* * Select protocol. This is farmed out into a table in a * separate file to enable an ssh-free variant. */ { int i; back = NULL; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == cfg.protocol) { back = backends[i].backend; break; } if (back == NULL) { fprintf(stderr, "Internal fault: Unsupported protocol found\n"); return 1; } } /* * Select port. */ if (portnumber != -1) cfg.port = portnumber; sk_init(); /* * Start up the connection. */ { char *error; char *realhost; /* nodelay is only useful if stdin is a terminal device */ int nodelay = cfg.tcp_nodelay && isatty(0); error = back->init(NULL, &backhandle, cfg.host, cfg.port, &realhost, nodelay); if (error) { fprintf(stderr, "Unable to open connection:\n%s", error); return 1; } logctx = log_init(NULL); back->provide_logctx(backhandle, logctx); ldisc = ldisc_create(NULL, back, backhandle, NULL); sfree(realhost); } connopen = 1; /* * Set up the initial console mode. We don't care if this call * fails, because we know we aren't necessarily running in a * console. */ tcgetattr(0, &orig_termios); atexit(cleanup_termios); ldisc_update(NULL, 1, 1); sending = FALSE; while (1) { fd_set rset, wset, xset; int maxfd; int rwx; int ret; FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&xset); maxfd = 0; if (connopen && !sending && back->socket(backhandle) != NULL && back->sendok(backhandle) && back->sendbuffer(backhandle) < MAX_STDIN_BACKLOG) { /* If we're OK to send, then try to read from stdin. */ FD_SET_MAX(0, maxfd, rset); } if (bufchain_size(&stdout_data) > 0) { /* If we have data for stdout, try to write to stdout. */ FD_SET_MAX(1, maxfd, wset); } if (bufchain_size(&stderr_data) > 0) { /* If we have data for stderr, try to write to stderr. */ FD_SET_MAX(2, maxfd, wset); } /* Count the currently active sockets. */ i = 0; for (socket = first_socket(&socketstate, &rwx); socket >= 0; socket = next_socket(&socketstate, &rwx)) i++; /* Expand the sklist buffer if necessary. */ if (i > sksize) { sksize = i + 16; sklist = srealloc(sklist, sksize * sizeof(*sklist)); } /* * Add all currently open sockets to the select sets, and * store them in sklist as well. */ skcount = 0; for (socket = first_socket(&socketstate, &rwx); socket >= 0; socket = next_socket(&socketstate, &rwx)) { sklist[skcount++] = socket; if (rwx & 1) FD_SET_MAX(socket, maxfd, rset); if (rwx & 2) FD_SET_MAX(socket, maxfd, wset); if (rwx & 4) FD_SET_MAX(socket, maxfd, xset); } ret = select(maxfd, &rset, &wset, &xset, NULL); if (ret < 0) { perror("select"); exit(1); } for (i = 0; i < skcount; i++) { socket = sklist[i]; if (FD_ISSET(socket, &rset)) select_result(socket, 1); if (FD_ISSET(socket, &wset)) select_result(socket, 2); if (FD_ISSET(socket, &xset)) select_result(socket, 4); } if (FD_ISSET(0, &rset)) { char buf[4096]; int ret; if (connopen && back->socket(backhandle) != NULL) { ret = read(0, buf, sizeof(buf)); if (ret < 0) { perror("stdin: read"); exit(1); } else if (ret == 0) { back->special(backhandle, TS_EOF); sending = FALSE; /* send nothing further after this */ } else { back->send(backhandle, buf, ret); } } } if (FD_ISSET(1, &wset)) { try_output(0); } if (FD_ISSET(2, &wset)) { try_output(1); } if ((!connopen || back->socket(backhandle) == NULL) && bufchain_size(&stdout_data) == 0 && bufchain_size(&stderr_data) == 0) break; /* we closed the connection */ } exitcode = back->exitcode(backhandle); if (exitcode < 0) { fprintf(stderr, "Remote process exit code unavailable\n"); exitcode = 1; /* this is an error condition */ } return exitcode; } Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a1790be9bf024eb139bd023f5b773b4d Text-delta-base-sha1: c40d570f86fc11cc530ee474bcd6134c8f5401f2 Text-content-length: 3062 Text-content-md5: 206a68f991dfdb1e5e208763d3239a37 Text-content-sha1: 94a569b1b4e3e0105be6d74aceb87415bb411670 Content-length: 3101 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNc3 J!FrT`L?}]unistd.h> #include #include #include " below is there to avoid a * trigraph - a double question mark followed by > maps to a * closing brace character! */"" Revision-number: 2167 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2002-11-01T12:53:10.000000Z K 7 svn:log V 64 Pass int rather than char to va_arg (the latter gets promoted). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 02ed692ac5827740b5d1d593149159c1 Text-delta-base-sha1: 12049fa328adb6bb4a8ede121e60e991fdbbaf81 Text-content-length: 89 Text-content-md5: 6583bd674040fe42234c9c19ebe8a4c0 Text-content-sha1: 1b86bbdac6314a43f03828a0c0e1cee812bc8365 Content-length: 130 K 15 cvs2svn:cvs-rev V 5 1.240 PROPS-END SVN"; [int(unsigned char) va_arg(ap2, intoses Revision-number: 2168 Prop-content-length: 180 Content-length: 180 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-11-01T12:53:45.000000Z K 7 svn:log V 80 Move an output newline to make username entry in Plink/SSH2 look more sensible. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6583bd674040fe42234c9c19ebe8a4c0 Text-delta-base-sha1: 1b86bbdac6314a43f03828a0c0e1cee812bc8365 Text-content-length: 75 Text-content-md5: 87cebcd0884a87f3a902a526287cf07f Text-content-sha1: a74c89e12cac2ba437ff00d3448fe8b78b03fafa Content-length: 116 K 15 cvs2svn:cvs-rev V 5 1.241 PROPS-END SVN !Os c_write_str(ssh, "\r\n"); } Revision-number: 2169 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2002-11-01T12:54:03.000000Z K 7 svn:log V 48 Add a \n at the end of an error message - oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fa034c588b35c4e7e7be1a54ac72f449 Text-delta-base-sha1: 3e5dc21df6b80ab64cd0634787f5a95cc21b1457 Text-content-length: 23 Text-content-md5: 0efef505af48d0bcc4e27572c29380c7 Text-content-sha1: 53deb38543c21b5142b1e2c501cb194ec6e5d72e Content-length: 62 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN 7Y7\n Revision-number: 2170 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2002-11-01T12:54:22.000000Z K 7 svn:log V 53 Stop the segfault on failure to resolve a host name. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f606bc1e7432022f7fb7a073fc8cd1d7 Text-delta-base-sha1: b7601aa05bfb4f7fe940d25073a83b41b4afa904 Text-content-length: 51 Text-content-md5: 43ef1b1c55aa4a33a778ca1aea057c06 Text-content-sha1: a31e7d2f031b0bdc82fd497034f178b64191b26d Content-length: 90 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVND[}2 { return ret; } Revision-number: 2171 Prop-content-length: 157 Content-length: 157 K 7 svn:log V 57 Replace a \r\n with an ordinary \n - this isn't Windows! K 10 svn:author V 5 simon K 8 svn:date V 27 2002-11-01T12:54:51.000000Z PROPS-END Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 47c8e0a8af2dbcde0a48acfffdac3151 Text-delta-base-sha1: 4e6f84c82a3d77bfb79835e0522612c200face84 Text-content-length: 20 Text-content-md5: fb9b69331cf0fc53a94e5bf515fb78d5 Text-content-sha1: 123a3320d54dc4eafd3474ef425f72ebbcdc3732 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNJH ,. Revision-number: 2172 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2002-11-01T12:55:13.000000Z K 7 svn:log V 96 Implement access to the SSH agent. This ought to make agent forwarding work as well, of course. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxagentc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 60f6bc0163f042fcff57fe5762658ad6 Text-delta-base-sha1: 5b18b7e2707d1c4bdef98f38dd93c288c0b6d1d6 Text-content-length: 1565 Text-content-md5: a6ad9a5d7b9cff27e7342ee6dd146ae9 Text-content-sha1: c5536de4576b5f9ce2358fb1af571f85a5c81124 Content-length: 1604 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNp IP3E5#include #include #include #include throttled_all = 0; ssh->v1_stdout_throttling = 0 Revision-number: 2174 Prop-content-length: 369 Content-length: 369 K 7 svn:log V 268 Another valgrind-caught error. This one has apparently been there since the Dawn O' Time, and consisted of me putting the two halves of a short-circuiting bounds check the wrong way round: instead of `p_in_range && *p', I had `*p && p_in_range'. Oops. valgrind rocks. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-11-01T13:01:14.000000Z PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b15d7d8dada732e95d090dc93a111269 Text-delta-base-sha1: 9cb7c2290c036499c4e51bec1bd4a5ac9781fc49 Text-content-length: 72 Text-content-md5: 65db8fdbbd059a507ee163b7efa6e60f Text-content-sha1: 16e5ea50063f5130cb14f22a2fd54013f650fce1 Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNrr /2ap < buf + len && iswritable((unsigned char) *p) Revision-number: 2175 Prop-content-length: 357 Content-length: 357 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-11-01T13:36:48.000000Z K 7 svn:log V 256 Improve handling of oobinline sockets; Plink in telnet mode now doesn't hang when you hit ^C, which is nice. I think a better solution would involve nonblocking sockets; as it stands it's a little dependent on what may be quirks of the Linux socket layer. PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 43ef1b1c55aa4a33a778ca1aea057c06 Text-delta-base-sha1: a31e7d2f031b0bdc82fd497034f178b64191b26d Text-content-length: 187 Text-content-md5: 3177d852c0493659864a3c84ba13d396 Text-content-sha1: 53116fe69fb66f6b7687540cd9eb2c90314ca5b4 Content-length: 226 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN[89qvvedeal with it * when we get called for the readability event (which * should also occur). */ s->oobpending = TRUE; break->oobpending ? 1 : Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0efef505af48d0bcc4e27572c29380c7 Text-delta-base-sha1: 53deb38543c21b5142b1e2c501cb194ec6e5d72e Text-content-length: 286 Text-content-md5: 4f4a0dbbb4bbe9ff0dd5814319d50503 Text-content-sha1: ec071d533d12421d4c228ddd7d1604781d6c4bda Content-length: 325 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNX><y /* * We must process exceptional notifications before * ordinary readability ones, or we may go straight * past the urgent marker. */ if (FD_ISSET(socket, &xset)) select_result(socket, 4) Revision-number: 2176 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 37 Add a .cvsignore for the Unix subdir K 10 svn:author V 5 simon K 8 svn:date V 27 2002-11-01T13:37:39.000000Z PROPS-END Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 56 Content-length: 56 K 10 svn:ignore V 24 Makefile.gtk plink pterm PROPS-END Node-path: putty/unix/.cvsignore Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 35 Text-content-md5: 74f3248dc402b8bca9df1fac91ebca03 Text-content-sha1: 021fa8f28c3eac53d8105ff3fb0ba5099ee3f647 Content-length: 151 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNMakefile.gtk plink pterm Revision-number: 2177 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2002-11-01T13:49:25.000000Z K 7 svn:log V 44 .HLP files should be ignored as well. Oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 56 Content-length: 56 K 10 svn:ignore V 24 *.html *.txt *.cnt *.hlp PROPS-END Node-path: putty/doc/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b00932915a821fde81d934c075485431 Text-delta-base-sha1: 401551da083e0ca5c300617a77fae5a173ef6b68 Text-content-length: 35 Text-content-md5: 1e3970f166f6e4af2a42b8a8d79a25bf Text-content-sha1: ae4ff2c2902ae4f8ab8c7ec70bc5a4f11455ded7 Content-length: 74 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN *.html *.txt *.cnt *.hlp Revision-number: 2178 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2002-11-01T18:51:22.000000Z K 7 svn:log V 32 Prevent another segfault. Oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4f4a0dbbb4bbe9ff0dd5814319d50503 Text-delta-base-sha1: ec071d533d12421d4c228ddd7d1604781d6c4bda Text-content-length: 66 Text-content-md5: 83dd8954d77c4fc568d0b679e0f00cfe Text-content-sha1: 517ec6c5eb7801bc34d27fd4d7702a696714aca6 Content-length: 105 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNX -MFif (bufchain_size(chain) == 0) return Revision-number: 2179 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2002-11-01T18:51:55.000000Z K 7 svn:log V 128 Introduce program category U, for non-GTK-requiring Unix apps. Plink doesn't need to be linked with libgtk, libgdk, libX11 etc! K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fe3fac416c89a808a26e2b08a7b40ec3 Text-delta-base-sha1: 690b3845edbe60c0e47b85c6e31d4a80b528dcc8 Text-content-length: 48 Text-content-md5: 318b21cc2ae5a2514f1f74b6d3eea33e Text-content-sha1: c940d810f4162e31210d6b39914430c60c587f4c Content-length: 88 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN^}4*, [U] for command-lineU Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 231969a228b26b3123a4fb895474e5d6 Text-delta-base-sha1: 62971fea7c121343234919fbd56b40bf36f96e55 Text-content-length: 262 Text-content-md5: f41dec1561547b6b6093b38d771d9b44 Text-content-sha1: cc486773a99b3c7ea071694e587525dcc0eab1fe Content-length: 302 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN\,Mx H>&fAh'HU $i eq "[X]" or $i eq "[UXLDFLAGS = `gtk-config --libs`\n". "ULDFLAGS =#U")); print "\n\n"; foreach $p (&prognames("XU${type}UU")), map("\t\$(INSTALL_DATA) -m 644 $_ \$(man1dir)/$_\n", &manpages("XU Revision-number: 2180 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2002-11-01T21:50:35.000000Z K 7 svn:log V 86 s/public/private/ spotted by Clint Hastings; also change a "public key" to "key pair" K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d4b2d8207fb68f66e01fe28bf52a8fdc Text-delta-base-sha1: 283ad51a304ddce897318c24f5eb28e290ec7251 Text-content-length: 97 Text-content-md5: 3d2f10aaa45545f83d4c82816a15aa42 Text-content-sha1: 93fed5c046f42be033e45e06574a61dc24fcc65b Content-length: 137 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNxwC|5z6>:\versionid $Id: pubkey.but,v 1.19 2002/11/01 21:50:35rivatekey pair Revision-number: 2181 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2002-11-02T14:35:57.000000Z K 7 svn:log V 136 RJK's general signal-handling robustness patch. Should fix the weird spin behaviour occasionally seen after pterm's child process dies. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 318b21cc2ae5a2514f1f74b6d3eea33e Text-delta-base-sha1: c940d810f4162e31210d6b39914430c60c587f4c Text-content-length: 27 Text-content-md5: ecb110a58751f7e2a1c91601caa463be Text-content-sha1: 6a8744c8eeba3b626a8498f420971cc4c431c0cb Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN} :C: signal Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a8ef0be48474b18e828ccc5e812ed80e Text-delta-base-sha1: 0987cdabb5d73fb87ce683e23f621099509b0e04 Text-content-length: 510 Text-content-md5: f25e17eb2d9b66606daccbc0dd5ab750 Text-content-sha1: 9d5072545684c3d753b9e097dc872380320755d9 Content-length: 550 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVN$iW`\B\ipstatic void block_signal(int sig, int block_it) { sigset_t ss; sigemptyset(&ss); sigaddset(&ss, sig); if(sigprocmask(block_it ? SIG_BLOCK : SIG_UNBLOCK, &ss, 0) < 0) { perror("sigprocmask"); exit(1); }/* defer any child exit handling until we're ready to deal with * it */ block_signal(SIGCHLD, 1)/* now we're reday to deal with the child exit handler being * called */ block_signal(SIGCHLD, 0); gtk_main(); return 0; } Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 10d85080a41e6d3d7d9a157d55e30661 Text-delta-base-sha1: 371397351ae3ecdc9dc26283a64a284d274ac629 Text-content-length: 1686 Text-content-md5: 295aa0d6204830d37a4521b0de3884b9 Text-content-sha1: 0d20ecce4171c9a5f58ebc91a77193f57db7078c Content-length: 1726 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNH*R8{4/fQ|H B?@eB@5UkL@F&S\l#include /* * Calling signal() is a non-portable, as it varies in meaning between * platforms and depending on feature macros, and has stupid semantics * at least some of the time. * * This function provides the same interface as the libc function, but * provides consistent semantics. It assumes POSIX semantics for * sigaction() (so you might need to do some more work if you port to * something ancient like SunOS 4) */ void (*putty_signal(int sig, void (*func)(int)))(int) { struct sigaction sa; struct sigaction old; sa.sa_handler = func; if(sigemptyset(&sa.sa_mask) < 0) return SIG_ERR; sa.sa_flags = SA_RESTART; if(sigaction(sig, &sa, &old) < 0) return SIG_ERR; return old.sa_handler; } /* Local Variables: c-basic-offset:4 comment-column:40 End: */ Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 14de8e1e0c31f066908e0c80fa9ed7a1 Text-delta-base-sha1: aa728f35030ec34f756d1e4b9a39d9a9fadaae02 Text-content-length: 120 Text-content-md5: 0e18e03f4f01f408dfcdcfd2396e5102 Text-content-sha1: 9d0a1ab9150e4966bc00d63bb54b1df8e14e0cff Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN4g-g/* BSD-semantics version of signal() */ void (*putty_signal(int sig, void (*func)(int)))(int); #endif Revision-number: 2182 Prop-content-length: 159 Content-length: 159 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-11-02T15:23:20.000000Z K 7 svn:log V 59 Improve the noise collection for the internal random pool. PROPS-END Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fb9b69331cf0fc53a94e5bf515fb78d5 Text-delta-base-sha1: 123a3320d54dc4eafd3474ef425f72ebbcdc3732 Text-content-length: 77 Text-content-md5: dde414b4b426c26ba0c9fe3f75f8b2ac Text-content-sha1: 9d79da719fcf05d1c92449e382037715e3433907 Content-length: 116 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNH 8) ( if (cfg.protocol == PROT_SSH) random_save_seed(); Node-path: putty/unix/uxnoise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 04588e03451006cc4610aa1a6fe85e64 Text-delta-base-sha1: 5fb2a33deef5b7ad6cda4c886b64e50d12264fee Text-content-length: 1690 Text-content-md5: 7b559d4f3635bddc5e384f0217e7714c Text-content-sha1: f2e98ee78532be5fe606ba926c2de8f62eb322b5 Content-length: 1729 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNf n"_uc&Oxy5{#include #include "putty.h" #include "ssh.h" #include "storage.h" static int return 0;close(fd); return 0; } ngot += ret; } return 1; } /* * This function is called once, at PuTTY startup. It will do some * slightly silly things such as fetching an entire process listing * and scanning /tmp, load the saved random seed from disk, and * also read 32 bytes out of /dev/urandom. */ void noise_get_heavy(void (*func) (void *, int)) { char buf[512]; FILE *fp; int ret; if (read_dev_urandom(buf, 32)) func(buf, 32); fp = popen("ps -axu 2>/dev/null", "r"); while ( (ret = fread(buf, 1, sizeof(buf), fp)) > 0) func(buf, ret); pclose(fp); fp = popen("ls -al /tmp 2>/dev/null", "r"); while ( (ret = fread(buf, 1, sizeof(buf), fp)) > 0) func(buf, ret); pclose(fp); read_random_seed(func); } void random_save_seed(void) { int len; void *data; if (random_active) { random_get_savedata(&data, &len); write_random_seed(data, len); } } /* * This function is called every time the grabs as much changeable * system data as it can quickly get its hands on. */ void noise_regular(void) { int fd; int ret; char buf[512]; struct rusage rusage; if ((fd = open("/proc/meminfo", O_RDONLY)) >= 0) { while ( (ret = read(fd, buf, sizeof(buf))) > 0) random_add_noise(buf, ret); close(fd); } if ((fd = open("/proc/stat", O_RDONLY)) >= 0) { while ( (ret = read(fd, buf, sizeof(buf))) > 0) random_add_noise(buf, ret); close(fd); } getrusage(RUSAGE_SELF, &rusage); random_add_noise(&rusage, sizeof(rusage Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 83dd8954d77c4fc568d0b679e0f00cfe Text-delta-base-sha1: 517ec6c5eb7801bc34d27fd4d7702a696714aca6 Text-content-length: 113 Text-content-md5: 0bf8758064bc351e80133c95fd5d61b1 Text-content-sha1: 819a1df589ac2dfcb133eadc75086184f8246e65 Content-length: 152 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN Y`y`cleanup_exit(exitcode); return exitcode; /* shouldn't happen, but placates gcc */ } Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 206a68f991dfdb1e5e208763d3239a37 Text-delta-base-sha1: 94a569b1b4e3e0105be6d74aceb87415bb411670 Text-content-length: 751 Text-content-md5: e3ae940b4d29ffcb5ac92bf558a39e03 Text-content-sha1: c5be53f4d39e8e2cdfc9528a8da9be0b878017d0 Content-length: 790 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN3*IT9T`0th\, INDEX_RANDSEEDindex == INDEX_RANDSEED ? "/.putty/randomseed int fd; char fname[FILENAME_MAX]; make_filename(fname, INDEX_RANDSEED); fd = open(fname, O_RDONLY); if (fd) { char buf[512]; int ret; while ( (ret = read(fd, buf, sizeof(buf))) > 0) consumer(buf, ret); close(fd); } } void write_random_seed(void *data, int len) { int fd; char fname[FILENAME_MAX]; make_filename(fname, INDEX_RANDSEED); fd = open(fname, O_CREAT | O_TRUNC | O_WRONLYname, O_CREAT | O_TRUNC | O_WRONLY, 0600); } while (len > 0) { int ret = write(fd, data, len); if (ret <= 0) break; len -= ret; data = (char *)data + len; } close(fd); } void cleanup_all(void) { } Revision-number: 2183 Prop-content-length: 274 Content-length: 274 K 8 svn:date V 27 2002-11-02T16:05:26.000000Z K 7 svn:log V 173 Another signal-handling refinement from RJK: the SIGCHLD handler should be prepared to reap more than one child per invocation if necessary, since we do after all have two. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 295aa0d6204830d37a4521b0de3884b9 Text-delta-base-sha1: 0d20ecce4171c9a5f58ebc91a77193f57db7078c Text-content-length: 223 Text-content-md5: 7faac554c9b899d6c1415c8d8f69f1e6 Text-content-sha1: 7fa93fca98582a93e23e83ced0e79dfbdf2b10b6 Content-length: 263 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN*H G-GTVdo { pid = waitpid(-1, &status, WNOHANG); if (pid == pty_child_pid && (WIFEXITED(status) || WIFSIGNALED(status))) { pty_exit_code = status; pty_child_dead = TRUE; } } while(pid > 0); Revision-number: 2184 Prop-content-length: 752 Content-length: 752 K 8 svn:date V 27 2002-11-02T16:16:35.000000Z K 7 svn:log V 651 Improve shadow bold mode: set the default shadow bold offset to +1 not -1 (it turns out _most_ X fonts prefer the former, though irritatingly my favourite real X font used to prefer the latter which was why I made the X version of my Font Of Choice do so too), and also clip to the boundaries of the rectangle we should be drawing text in. This still doesn't completely prevent display corruption in the case where text drawn in one sweep is partially overwritten in a future one, but gnome-terminal has this problem too, and now we've got the right default SB offset _and_ offer the opportunity to reconfigure it I think this is pretty good for now. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7d61a805d7cc6376553bc9e7601bf9b4 Text-delta-base-sha1: 5437416fcb025c2ddd11985d817e0c14b8afe527 Text-content-length: 24 Text-content-md5: 664b0565a7528f69c14aea1d7b5c97af Text-content-sha1: 4a5850c188d140b4cbbd0cf93f2db665dd433def Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.86 PROPS-END SVN $q% Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b537c708b1da4098f832a6d2c06b7ff7 Text-delta-base-sha1: 242112946e79b602d1b4e27e51fdc77a49ccfa50 Text-content-length: 338 Text-content-md5: 2643a96852e988d07074be0d13e55150 Text-content-sha1: 30adc65738669bac37f01bb49aa7d70ddd88fba2 Content-length: 377 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN7Y2^_tT21) means that the text will be printed in the normal place, and also one character to the righright-hand side. For some fonts, you may need to set this to -1, so that the text is overprinted one pixel to the left; for really large fonts, you may want to set it higher than 1 (in one direction or the other) Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f25e17eb2d9b66606daccbc0dd5ab750 Text-delta-base-sha1: 9d5072545684c3d753b9e097dc872380320755d9 Text-content-length: 307 Text-content-md5: 10677e947d863baca456c4681507385a Text-content-sha1: 821e500cf305e250e2e54ee8d9d81d964cfc6a24 Content-length: 347 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNir5 5M=_ , rlen rlen = len * 2; } else rlen = len; { GdkRectangle r; r.x = x*inst->font_width+cfg.window_border; r.y = y*inst->font_height+cfg.window_border; r.width = rlen*inst->font_width; r.height = inst->font_height; gdk_gc_set_clip_rectangle(gc, &r);r Revision-number: 2185 Prop-content-length: 333 Content-length: 333 K 8 svn:date V 27 2002-11-02T16:27:17.000000Z K 7 svn:log V 232 Probably about time we mentioned the nascent Unix port in the FAQ. Not that I desperately want to shout about it just yet, but I feel a bit bad about the FAQ saying `we don't have a Unix port, anyone who told you so was wrong'. :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 087d726528c29427ab56f20e91022d60 Text-delta-base-sha1: c812aac3d97d1204b3e70615dba2d38116feff33 Text-content-length: 1615 Text-content-md5: f2d14bfdd9bb461e6976aa2aa122106e Text-content-sha1: 07dedb5b7feafe6b7888592cdcaacf0eb6704d67 Content-length: 1655 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN{)8.wqM!>E\versionid $Id: faq.but,v 1.37 2002/11/02 16:27:17 simonwas for this porting layer to evolve naturally as part of the process of doing the first port; a Unix port is now under way and the plan seems to be working so far. \S{faq-ports-general}{Question} What ports of PuTTY exist? Currently, release versions of PuTTY only run on full Win32 systems. This includes Windows 95, 98, and ME, and it includes Windows NT, Windows 2000 and Windows XP. In the development code, a partial port to Unix is under way (see \k{faq-unix}). Currently PuTTY does \e{not} run on Windows CE (see \k{faq-wince}), and it does not quite run on the Win32s environment under Windows 3.1 (see \k{faq-win31}). We do not have release-quality ports for any other systems at the present time. If anyone told you we had a Mac port, or an iPaq port, or any other port of PuTTY, they were mistaken. We don't. \S{faq-unix}{Question} Will there be a port to Unix? It's currently being worked on. If you look at the nightly source snapshots, you should find a \c{unix} subdirectory, which should build you a Unix port of Plink, and also \c{pterm} - an \cw{xterm}-type program which supports the same terminal emulation as PuTTY. It isn't yet clear whether we will bother combining the terminal emulator and network back end into the same process, to provide a Unix port of the full GUI form of PuTTY. It wouldn't be as useful a thing on Unix as it would be on Windows; its major value would probably be as a pathfinding effort for other ports. If anyone really wants it, we'd be interested to know why :-) Revision-number: 2186 Prop-content-length: 292 Content-length: 292 K 8 svn:date V 27 2002-11-03T08:46:35.000000Z K 7 svn:log V 191 Half of Lars Gunnarsson's iXplorer compatibility patch: the PSFTP login prompt should be fflushed (presumably fgets fails to implicitly do this when stdin and stdout are redirected weirdly). K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 15e12d378d53b663745a64cd161a3e28 Text-delta-base-sha1: 1ad57b67180748e64f688c5fbc80005bff27c05f Text-content-length: 38 Text-content-md5: 580cfc3fb14432aca8b0da701f264038 Text-content-sha1: 181cfd4080f61cb8ce099626ba74f3eeeab83ba8 Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVN0 UNQfflush(stdout Revision-number: 2187 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2002-11-03T22:05:10.000000Z K 7 svn:log V 14 Fix hyperlink K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/scripting Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1d42e774ae67c5f1560601a2709dc5de Text-delta-base-sha1: c7d0b1d4459c4ed2234c9b727e75a1453dfd2299 Text-content-length: 41 Text-content-md5: 5bbb324d5f042ee3ff1c114bb20c2376 Text-content-sha1: 7c188fa8b2549e990550ed2b7e5f634979ed970a Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN  T+`http://www.mono.org/ Revision-number: 2188 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:02.683622Z PROPS-END Revision-number: 2189 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:02.700175Z PROPS-END Revision-number: 2190 Prop-content-length: 203 Content-length: 203 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-11-05T09:37:31.000000Z K 7 svn:log V 102 Substitute `-' (magical hyphen) for `\-' (inert minus sign) in the manpage. Fixes Debian bug #167761. PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2643a96852e988d07074be0d13e55150 Text-delta-base-sha1: 30adc65738669bac37f01bb49aa7d70ddd88fba2 Text-content-length: 1302 Text-content-md5: abfa3fbf8dac274c26963b6602a1a244 Text-content-sha1: ed144b87a6a25c6ac0eb2844e8760ad227897042 Content-length: 1342 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNY} J+JEZ5*9e6RLk)/7?cvYsTvwJ#DYjc$###e.1RLaS-D@K}2Hf;\*;%e' _1WmunpmasoTR~]4%\\-e sh \-c 'mycommand < inputfile' .IP "\fB\-\-display\fP \fIdisplay\\\\-fn\fP \fIfont-name\fP" Specify the font to use for normal text displayed in the terminal. .IP "\fB\\\\-fg\fP \fIcolour\fP" Specify the foreground colour to use for normal text. .IP "\fB\-bg\fP \fIcolour\fP" Specify the background colour to use for normal text. .IP "\fB\\\\\\-ut\\\-ut\\-ls\\-ls\fP" Tells \fIpterm\fP to execute your shell as a login shell: this is the opposite of \fI\-ls\\-sb\-\fP or \fB+sb\fP" Tells \fIpterm\fP not to display a scroll bar. .IP "\fB\-sb\fP" Tells \fIpterm\fP to display a scroll bar: this is the opposite of \fI\-sb\\\\\-xrm 'ScrollbarOnLeft: 1' .IP "\fB\-help\fP, \fB\-\\\\\-sl\fP command-line option. .IP "\fBpterm.DECOriginMod\\ is 80. .IP "\fBpterm.TermHeight\fP" This resource is the same as the width part of the \fI\\\\\\-fg\fP and \fI\\-bg\fP and \fI\\-cfg\fP and \fI\\\\-ut\fP command-line option. .IP "\fBpterm.LoginShell\fIpterm\fP will execute your shell as a login shell. This resource is equivalent to the \fI\ Revision-number: 2191 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2002-11-05T13:15:30.000000Z K 7 svn:log V 35 This default change has been made. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/bce-default-change Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dd7f47e7fdf8a4d2a385d9e120b33d4f Text-delta-base-sha1: 0f55c76a821940da9f59fa6f3385caa26a0085ac Text-content-length: 39 Text-content-md5: 6273926169ed52ac64f2bb55f05c4d35 Text-content-sha1: 5d6ee1a2c18151967e9cd8cd41b7f3909aac2221 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN1F|6{Fixed-in: 2002-10-14 Revision-number: 2192 Prop-content-length: 272 Content-length: 272 K 8 svn:date V 27 2002-11-05T13:20:42.000000Z K 7 svn:log V 171 Fix command-line error handling in pterm. (Hint: wrapping a multi- statement macro in `do ... while (0)' and putting a `continue' within it don't go well together. Oops.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 10677e947d863baca456c4681507385a Text-delta-base-sha1: 821e500cf305e250e2e54ee8d9d81d964cfc6a24 Text-content-length: 463 Text-content-md5: 302c348c4950a38d6a8f50e090e20fd1 Text-content-sha1: 94340f21e86f377a84c6a9bb12bbcc56a1b00fef Content-length: 503 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVNr ,Ah2kb Note that because * they need to call `continue', they cannot be contained in * the usual do {...} while (0) wrapper to make them * syntactically single statements; hence it is not legal to * use one of these macros as an unbraced statement between * `if' and `else'. */ #define EXPECTS_ARG continue; \ } else \ val = *++argv; \ } #define SECOND_PASS_ONLY { if (!do_everything) continue; } Revision-number: 2193 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2002-11-05T13:21:03.000000Z K 7 svn:log V 61 Packet-level logging should now work properly in Unix Plink. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0e18e03f4f01f408dfcdcfd2396e5102 Text-delta-base-sha1: 9d0a1ab9150e4966bc00d63bb54b1df8e14e0cff Text-content-length: 41 Text-content-md5: 1b693e98afd0130a712c0b2ffd40747b Text-content-sha1: 4390f99d429341cf163b1cf6640b2af428df6901 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN* PFNGLOBAL void *logctx; Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dde414b4b426c26ba0c9fe3f75f8b2ac Text-delta-base-sha1: 9d79da719fcf05d1c92449e382037715e3433907 Text-content-length: 54 Text-content-md5: 675f9d2e1452202751dea7e5b9890f65 Text-content-sha1: e62b9d6ced6941922ccb2656b2d9d337eb2c296f Content-length: 93 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN# ! w log_eventlog(logctx, string); Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0bf8758064bc351e80133c95fd5d61b1 Text-delta-base-sha1: 819a1df589ac2dfcb133eadc75086184f8246e65 Text-content-length: 420 Text-content-md5: c24637cdeb48f1dcbda457b35482e885 Text-content-sha1: 85f781c757b3b74f13d1eb9b13e11a71f2e5322b Content-length: 459 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNYv|Bd7HC4% else if (!strcmp(p, "-o")) { if (argc <= 1) fprintf(stderr, "plink: option \"-o\" requires an argument\n"); else --argc, provide_xrm_string(*++argv); } } else if (*p) { if (!*cfg.host) { char *q = p; do_defaults(NULL, &cfg); logctx = log_init(NULL); Revision-number: 2194 Prop-content-length: 197 Content-length: 197 K 8 svn:date V 27 2002-11-05T14:20:23.000000Z K 7 svn:log V 97 Now that the default has changed to SSH-2, check in a summary of our discussions on the subject. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/hostkey-policy Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f0c3b4de8bd18fe62ca1626674204618 Text-delta-base-sha1: 27b5e3b4fadccaa4b2f2509e2509318b5aa0493f Text-content-length: 888 Text-content-md5: 1b896be58b4c6a2cdb77ec98e2852e54 Text-content-sha1: b7191d3b7e69ef705910f224d03751078026b196 Content-length: 927 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNM7]m-<m`mSummary: Enhanced flexibility in SSH host key lookuplookup policy is extremely simple at the moment. The name under which a host key is filed in the Registry is exactly the name you typed into the Hostname box. This avoids ever trusting the DNS for anything. The choice of which key to use is also very simple - we have a fixed preference order of RSA, DSS (for SSH-2)

    When there's a choice of host keys available for a host, perhaps PuTTY should adjust its stated preferences so that the ones it has cached come first. Need to think about that a bit. At the very least, when a new host key prompt is given, PuTTY should mention if it already has host keys for a host in other formats - particularly important when the default protocol changes to SSH-2, or a server that previously offered DSS keys starts supporting RSA too. Node-path: putty-wishlist/data/ssh2-default Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1264 Text-content-md5: bd06669287e931aaf95cfba85e1dfc47 Text-content-sha1: 4708024f6856949fc46f151ffef7b8376e332a1d Content-length: 1380 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNbbbSummary: Default to SSH-2 protocol instead of SSH-1 Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body Fixed-in: 2002-10-14

    Version 2 of the SSH protocol has various security and other enhancements over SSH1. We should encourage its use.

    One way of doing this is to make SSH-2 the default protocol (currently it's SSH-1). Note that while PuTTY will fall back to SSH-1 if necessary, this is potentially a user-visible change, as if SSH-2 is chosen users will be prompted about new host keys. (Perhaps the host key dialogue should indicate which keys we do have? See also `hostkey-policy'.)

    Conversely, many upgrading users won't see this change, as it's only the `factory default' that changes; if they've got saved settings with SSH-1 selected then that won't change.

    In future we might consider `turning off' SSH-1 by default (i.e., making `2 only' the default). Can't reasonably do this until SSH-2 is practically ubiquitous.

    Our documentation should probably discuss the security implications of using SSH-1, too.

    Update: Even Debian stable includes SSH-2 support now, so we can reasonably get away with this. Fixed in snapshots. Revision-number: 2195 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:03.012544Z PROPS-END Revision-number: 2196 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2002-11-07T10:40:56.000000Z K 7 svn:log V 51 Change PuTTY's default protocol from Telnet to SSH K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh-default Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 341 Text-content-md5: df6f4e4569c3d71f363cd2799bc2ca9b Text-content-sha1: 0654ce40ecf56e8fe30a4df9ae83a24c8ba529b9 Content-length: 457 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNGGGSummary: Change PuTTY's default protocol from Telnet to SSH Class: wish Difficulty: fun Priority: low Content-type: text/x-html-body

    SSH is much more common than it was when this default was originally chosen.

    As usual with default changes, this won't affect saved sessions, nor people who've saved Default Settings. Revision-number: 2197 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2002-11-07T18:44:04.000000Z K 7 svn:log V 39 Robustness fixes for KEXINIT handling. K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.53/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 19fecc110ec5a9178fb6a0c93507ffda Text-delta-base-sha1: abe635daf2e38b5afbd7eedeb86e567eb4d1b4b4 Text-content-length: 477 Text-content-md5: 32edb3a1c54c30337775a76d1be43ddd Text-content-sha1: 01ef3397a8baff17946eb0f73e4655799d60ac0c Content-length: 522 K 15 cvs2svn:cvs-rev V 9 1.221.2.1 PROPS-END SVN"> + Y3Yl 5) .450s)", .450s)", Revision-number: 2198 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2002-11-07T19:37:36.000000Z K 7 svn:log V 147 Borland makefile needs to define _WINDOWS; apparently this makefile hasn't worked since the Unix port started and nobody has noticed until now :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f41dec1561547b6b6093b38d771d9b44 Text-delta-base-sha1: cc486773a99b3c7ea071694e587525dcc0eab1fe Text-content-length: 31 Text-content-md5: 5a354cdca6adbe1331c2bca67a1d8d65 Text-content-sha1: 0a1dd7c3a8fd1aedaf0fa2d184925ef40b84a9a2 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN  _WINDOWS Revision-number: 2199 Prop-content-length: 293 Content-length: 293 K 8 svn:date V 27 2002-11-07T19:49:03.000000Z K 7 svn:log V 192 Robustness fixes for KEXINIT handling and others. In particular, I've created a self-mallocing variant of sprintf, to obviate any future need for paranoid %.100s type stuff in format strings. K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3633b6f2f0889d9c72275b6a7391770a Text-delta-base-sha1: 1d4dfffe4d7064b9949059fa65c6e98512883172 Text-content-length: 1557 Text-content-md5: e20a26c5675b5e24534564f531da83f5 Text-content-sha1: cb9ddfdca445672eedc17a2dcf33e85ec11f0a16 Content-length: 1597 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN~"#fE&7B\BqYf/Octypeonst onst * Do an sprintf(), but into a custom-allocated buffer. * * Irritatingly, we don't seem to be able to do this portably using * vsnprintf(), because there appear to be issues with re-using the * same va_list for two calls, and the excellent C99 va_copy is not * yet widespread. Bah. Instead I'm going to do a horrid, horrid * hack, in which I trawl the format string myself, work out the * maximum length of each format component, and resize the buffer * before printing it. */ char *dupprintf(const char *fmt, ...) { char *ret; va_list ap; va_start(ap, fmt); ret = dupvprintf(fmt, ap); va_end(ap); return ret; } char *dupvprintf(const char *fmt, va_list ap) { char *buf; int len, size; buf = smalloc(512); size = 512; while (1) { #ifdef _WINDOWS #define vsnprintf _vsnprintf #endif len = vsnprintf(buf, size, fmt, ap); if (len >= 0 && len < size) { /* This is the C99-specified criterion for snprintf to have * been completely successful. */ return buf; } else if (len > 0) { /* This is the C99 error condition: the returned length is * the required buffer size not counting the NUL. */ size = len + 1; } else { /* This is the pre-C99 glibc error condition: <0 means the * buffer wasn't big enough, so we enlarge it a bit and hope. */ size += 512; } buf = srealloc(buf, size); }*buf; va_list ap; va_start(ap, fmt); buf = dupvprintf(fmt, ap); dputs(buf); sfree Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3a125fbd6ebead369a6cf4f2fb1c424d Text-delta-base-sha1: c2abbb6e8f547f783aac17e34ce2e2724f2aa373 Text-content-length: 203 Text-content-md5: 0813594e70bd172045fd43dc5bf6e81e Text-content-sha1: 5e564ddd1235efdf4147212356ec57056da6d12a Content-length: 243 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNgx0DY@+ /* for va_list */onst char *s); char *dupcat(const char *s1, ...); char *dupprintf(const char *fmt, ...); char *dupvprintf(const char *fmt, va_list ap Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aec54348a8e2f78e97f2747a471898d8 Text-delta-base-sha1: 1dc122422594310189ce62f9dc0b3ca9e3b30601 Text-content-length: 326 Text-content-md5: cfa677edc60949f5b04b47e505af519d Text-content-sha1: c255aef7f3b7a583b2fb2b57d3c798b28c27a43c Content-length: 366 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVNYgiNwF,ud*buf; va_start(ap, fmt); buf = dupvprintf(fmt, ap); va_end(ap); MessageBox(main_hwnd, busfree(bufchar *msg; msg = dupprintf("Failed to run \"%.100s\", Error: %d", cmdline, (int)GetLastError()); MessageBox(NULL, msg, APPNAME, MB_OK | MB_ICONEXCLAMATION); sfree(msg Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8205703c7d2529d42f8db1ff191788bc Text-delta-base-sha1: f86b313a8cffe46cea17d118efb5aea817c91476 Text-content-length: 292 Text-content-md5: 61629d2c3039d3d962ca61e626e5bd31 Text-content-sha1: d79167bc85cdcf43d3eb21e795fde3d64294cbaf Content-length: 332 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNvxzx[rdJ7rU!*buf, dest[64]; sk_getaddr(p->remote_addr, dest, 64); buf = dupprintf("CONNECT %s:%i HTTP/1.1\r\nHost: %s:%i\r\n", sfree(buf*bufbuf = dupprintf("Proxy error: %s", data+status); plug_closing(p->plug, buf, PROXY_ERROR_GENERAL, 0); sfree(buf Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 580cfc3fb14432aca8b0da701f264038 Text-delta-base-sha1: 181cfd4080f61cb8ce099626ba74f3eeeab83ba8 Text-content-length: 796 Text-content-md5: 5f7ed1c22f29f1ad6afe4ecd65e27799 Text-content-sha1: 7b60f36e0d40e9f1176bd82d745b0f5b0ba9fa4d Content-length: 836 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN0zW# *str, *str2; va_list ap; va_start(ap, fmt); str = dupvprintf(fmt, ap); str2 = dupcat("Fatal: ", str, "\n", NULL); sfree(str); va_end(ap); fputs(str2, stderr); sfree(str2); cleanup_exit(1); } void modalfatalbox(char *fmt, ...) { char *str, *str2; va_list ap; va_start(ap, fmt); str = dupvprintf(fmt, ap); str2 = dupcat("Fatal: ", str, "\n", NULL); sfree(str); va_end(ap); fputs(str2, stderr); sfree(str2); cleanup_exit(1); } void connection_fatal(void *frontend, char *fmt, ...) { char *str, *str2; va_list ap; va_start(ap, fmt); str = dupvprintf(fmt, ap); str2 = dupcat("Fatal: ", str, "\n", NULL); sfree(str); va_end(ap); fputs(str2, stderr); sfree(str2 Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f89bca5ce9b9eec5fb0d8b59a5e199c3 Text-delta-base-sha1: 0943d65c73f8b9f83e1c6c6be68c5dbaa2182427 Text-content-length: 416 Text-content-md5: cd19d41fd05c1e69da7b59dbf1523966 Text-content-sha1: 74e717789ba18065c80e6ffad7af4dd6cf323d40 Content-length: 456 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNN8Zq)@@z@I UgYe:UgY.p*stuff; va_start(ap, fmt); stuff = dupvprintf(sfree(stuff); exit(1); } /* dupprintf("%d %s %s %s", bignum_bitcount(key->modulus), *buffer; fclose(fp); buffer = dupprintf("Overwrite existing file\n%s?", sfree(buffer*buffer; fclose(fp); buffer = dupprintf("Overwrite existing file\n%s?", sfree(buffer Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d1f57e4307a722534592d1556f11c3e5 Text-delta-base-sha1: 4ee8036b49691d188b6d0e63d0d97db356d7be1e Text-content-length: 277 Text-content-md5: efacbce6b8e64a10f008d7bbb3409dbf Text-content-sha1: f4c68e644984ed19c86e827bb1886e9baeb6121a Content-length: 317 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNtv^Y[0D*buf; buf = dupprintf("Looking up host \"%s\"", host); logevent(raw->frontend, buf); sfree(*buf, addrbuf[100]; sk_getaddr(addr, addrbuf, 100); buf = dupprintf("Connecting to %s port %d", addrbuf, port); logevent(raw->frontend, buf); sfree( Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c27ce32788093f0da225e534557bac39 Text-delta-base-sha1: 0d12ec6d6eb2071c87729f7e199c1c1a17ec3f53 Text-content-length: 283 Text-content-md5: 9ff70fb03abe5e5bc81e1f79e8f815b7 Text-content-sha1: 16411810560420133a72b7b119e2ed57a699a45c Content-length: 323 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN|taZMU:*buf; buf = dupprintf("Looking up host \"%s\"", host); logevent(rlogin->frontend, buf); sfree(*buf, addrbuf[100]; sk_getaddr(addr, addrbuf, 100); buf = dupprintf("Connecting to %s port %d", addrbuf, port); logevent(rlogin->frontend, buf); sfree( Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d28196d5f23c6737598335880632eec5 Text-delta-base-sha1: fba416b9484201ef0ced298c18e07a9a54a444e6 Text-content-length: 1614 Text-content-md5: aec6212d6015013fab84012feecd4722 Text-content-sha1: 0b9b7102aa0653fda8b60a8a4563e4d9870d8970 Content-length: 1654 K 15 cvs2svn:cvs-rev V 4 1.95 PROPS-END SVN*6Ku0A#eL |uI|L|c,AnxPwuyw&*str, *str2; va_list ap; va_start(ap, fmt); str = dupvprintf(fmt, ap); va_end(ap); str2 = dupcat(str, "\n", NULL); sfree(str); tell_str(stream, str2); sfree(str2*str, *str2; va_list ap; va_start(ap, fmt); str = dupvprintf(fmt, ap); str2 = dupcat("Fatal: ", str, "\n", NULL); sfree(str); va_end(ap); tell_str(stderr, str2); sfree(str2modalfatalbox(char *fmt, ...) { char *str, *str2; va_list ap; va_start(ap, fmt); str = dupvprintf(fmt, ap); str2 = dupcat("Fatal: ", str, "\n", NULL); sfree(str); va_end(ap); tell_str(stderr, str2); sfree(str2*str, *str2; va_list ap; va_start(ap, fmt); str = dupvprintf(fmt, ap); str2 = dupcat("Fatal: ", str, "\n", NULL); sfree(str); va_end(ap); tell_str(stderr, str2); sfree(str2*str, *str2; va_list ap; va_start(ap, fmt); str = dupvprintf(fmt, ap); va_end(ap); str2 = dupcat(str, "\n", NULL); sfree(str); tell_str(stderr, str2); sfree(str2*str, *str2; va_list ap; va_start(ap, fmt); errs++; str = dupvprintf(fmt, ap); str2 = dupcat("scp: ", str, "\n", NULL); sfree(str); scp_send_errmsg(str2); tell_user(stderr, "%s", str2); va_end(ap); sfree(str2dupprintf("scp%s%s%s%s -t %s", verbose ? " -v" : "", recursive ? " -r" : "", preserve ? " -p" : "", dupprintf("scp%s%s%s%s -f %s", verbose ? " -v" : "", recursive ? " -r" : "", preserve ? " -p" : "", Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3de349a51c29a4a0dac45ea5aea0d9a3 Text-delta-base-sha1: 3bc8fb2ecc492faa923f1134f37b6c94feed1682 Text-content-length: 4842 Text-content-md5: 3636fd892bf8b0e39de6322cbf24c689 Text-content-sha1: da8ac6dffdd6f55e5147d7f831a927e7dbb7f0b4 Content-length: 4883 K 15 cvs2svn:cvs-rev V 5 1.243 PROPS-END SVN}^tW!zG9z@0^mN)c fhwDOU"]VPQsO7f 9G do { \ logevent(ssh->frontend, s); \ if ((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)) { \ fprintf(stderr, "%s\n", s); \ fflush(stderr); \ } \ } while (0) /* logevent, only printf-formatted. */ void logeventf(Ssh ssh, char *fmt, ...) { va_list ap; char *buf; va_start(ap, fmt); buf = dupvprintf(fmt, ap); va_end(ap); logevent(buf); if ((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)) { fprintf(stderr, "%s\n", buf); fflush(stderr); } sfree(bu*buf; int nowlen if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) { buf = dupprintf("Received disconnect message (%s)", buf = dupprintf("Received disconnect message (unknown" " type %d)", reason); } logevent(buf); sfree(buf); buf = dupprintf("Disconnection message text: %n%.*s", msglen, &nowlen, ssh->pktin.data + 14) sfree(bufint len; *p = NULL; *length = 0; if (ssh->pktin.length - ssh->pktin.savedpos < 4) return; len = GET_32BIT(ssh->pktin.data + ssh->pktin.savedpos); if (len < 0) return; *length = lenlogeventf(ssh, "Looking up host \"%s\"", host);addrbuf[100]; sk_getaddr(addr, addrbuf, 100); logeventf(ssh, "Connecting to %s port %d", addrbuf, portlogeventf(ssh, "Initialised %s encryption", ssh->cipher->text_name);logeventf(ssh, "Trying public key \"%s\"", cfg.keyfilelogeventf(ssh, "Service lookup failed for" " destination port \"%s\"", dportslogeventf(ssh, "Service lookup failed for source" " port \"%s\"", sportslogeventf(ssh, "Local port %.*s%.*s%d%.*s forwarding to" " %s:%.*s%.*s%d%.*s", (int)(sserv ? strlen(sports) : 0), sports, sserv, "(", sport, sserv, ")", host, (int)(dserv ? strlen(dports) : 0), dports, dserv, "(", dport, dserv, ")"logeventf(ssh, "Duplicate remote port forwarding to %s:%d", host, dport); sfree(pf); } else { logeventf(ssh, "Requesting remote port %.*s%.*s%d%.*s" " forward to %s:%.*s%.*s%d%.*s", (int)(sserv ? strlen(sports) : 0), sports, sserv, "(", sport, sserv, ")", host, (int)(dserv ? strlen(dports) : 0), dports, dserv, "(", dport, dserv, ")"oses == 0) && (c->type == CHAN_SOCKDATA)) { logevent("Forwarded port closed"); assert(c->u.pfd.s != NULL); pfd_close(c->u.pfd.s); c->u.pfd.s = NULL; } c->closes |= (closetype << 2); /* seen this message */ if (!(c->closes & closetype)) Dly|E YCJP acmjR4F`8G in]hV0Qs/PFt@)KKvN; if (!needle || !haystack) /* protect against null pointers */ return 0; if (ssh->pktin.length > 5) str ? str : "(null)" str ? str : "(null)"logeventf(ssh, "Initialised %.200s client->server encryption", ssh->cscipher->text_name); logeventf(ssh, "Initialised %.200s server->client encryption", ssh->sccipher->text_name); if (ssh->cscomp->text_name) logeventf(ssh, "Initialised %s compression", ssh->cscomp->text_name); if (ssh->sccomp->text_name) logeventf(ssh, "Initialised %s decompression", ssh->sccomp->text_name);*stufftuff = dupprintf("Using username \"%s\".\r\n", s->username); c_write_str(ssh, stuff); sfree(*msgbuf; logeventf(ssh->frontend, "Unable to use this key file (%s)", key_type_to_str(keytype)); msgbuf = dupprintf("Unable to use key file \"%.150s\"" " (%s)\r\n", cfg.keyfile, key_type_to_str(keytype)); c_write_str(ssh, msgbuf); sfree(logeventf(ssh, "Service lookup failed for destination" " port \"%s\"", dportslogeventf(ssh, "Service lookup failed for source" " port \"%s\"", sportslogeventf(ssh, "Local port %.*s%.*s%d%.*s forwarding to" " %s:%.*s%.*s%d%.*s", (int)(sserv ? strlen(sports) : 0), sports, sserv, "(", sport, sserv, ")", host, (int)(dserv ? strlen(dports) : 0), dports, dserv, "(", dport, dserv, ")"logeventf(ssh, "Duplicate remote port forwarding" " to %s:%d", host, dport); sfree(pf); } else { logeventf(ssh, "Requesting remote port %.*s%.*s%d%.*s" " forward to %s:%.*s%.*s%d%.*s", (int)(sserv ? strlen(sports) : 0), sports, sserv, "(", sport, sserv, ")", host, (int)(dserv ? strlen(dports) : 0), dports, dserv, "(", dport, dserv, ")"logeventf(ssh, "Received remote port open request" " for %s:%d", realpf->dhost, realpf->dport); if (e != NULL) { logeventf(ssh, "Port open failed: %s", e logeventf(ssh, "Opening forwarded connection to %s:%d", hostname, port Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 65db8fdbbd059a507ee163b7efa6e60f Text-delta-base-sha1: 16e5ea50063f5130cb14f22a2fd54013f650fce1 Text-content-length: 1260 Text-content-md5: c3021ba912513c614a59a6dc52a52e49 Text-content-sha1: 056f594fb234d0649ea3625164670c3887145ee3 Content-length: 1300 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNrX`~$4+]I&9sF&4 j^>y$YaYB3.9kZ`*bufbuf = dupprintf("%s:\t%s %s", sender, (cmd == WILL ? "WILL" : cmd == WONT ? "WONT" : cmd == DO ? "DO" : cmd == DONT ? "DONT" : ""), telopt(option)); logevent(telnet->frontend, buf); sfree(*logbuflogbuf = dupprintf("client:\tSB TSPEED IS %s", cfg.termspeed); logevent(telnet->frontend, logbuf); sfree(*logbuflogbuf = dupprintf("client:\tSB TTYPE IS %s", b + 4); logevent(telnet->frontend, logbuf); sfree(*logbuf; p++; logbuf = dupprintf(sfree(logbuf = dupprintf("client:\tSB %s IS %s", telopt(telnet->sb_opt), n == 6 ? "" : ""); logevent(telnet->frontend, logbuf); sfree(*buf; buf = dupprintf("Looking up host \"%s\"", host); logevent(telnet->frontend, buf); sfree(*buf, addrbuf[100]; sk_getaddr(addr, addrbuf, 100); buf = dupprintf("Connecting to %s port %d", addrbuf, port); logevent(telnet->frontend, buf); sfree(*logbuflogbuf = dupprintf("client:\tSB NAWS %d,%d", ((unsigned char) b[3] << 8) + (unsigned char) b[4], ((unsigned char) b[5] << 8) + (unsigned char) b[6]); logevent(telnet->frontend, logbuf); sfree( Revision-number: 2200 Prop-content-length: 149 Content-length: 149 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-11-07T20:01:04.000000Z K 7 svn:log V 49 Improve robustness in random seed file handling. PROPS-END Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 88eca11acc311f465e399435abb1c438 Text-delta-base-sha1: 6a85d00f1e2c282edc7b995bab076a5230397849 Text-content-length: 133 Text-content-md5: 159cb230f1265783e10c76435f801186 Text-content-sha1: 1473b7d1a24e47be37425e006f33041acf2e39db Content-length: 173 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNudi&^)#,I /* Update the seed immediately, in case another instance uses it. */ random_save_seed( sfree(data Node-path: putty/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cbc5ab51c26c372a1e4ffe78bc3bde88 Text-delta-base-sha1: aa4ca5555948e78e9ce32f4b2e5567804f517a8e Text-content-length: 193 Text-content-md5: 56f6fd8187500faf57c67c35d928ae5f Text-content-sha1: 2a3ff311968c20cf1b0e702784d01ad417dff200 Content-length: 232 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNhF..void *buf = smalloc(POOLSIZE / 2); random_stir(); memcpy(buf, pool.pool + pool.poolpos, POOLSIZE / 2); *len = POOLSIZE / 2; *data = buf; random_stir(); } Node-path: putty/unix/uxnoise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7b559d4f3635bddc5e384f0217e7714c Text-delta-base-sha1: f2e98ee78532be5fe606ba926c2de8f62eb322b5 Text-content-length: 59 Text-content-md5: 5952cf99d009e4ec0ec756938e592293 Text-content-sha1: 4016b23facc86597cc284890373cbe3661daf1a3 Content-length: 98 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNf  nka random_save_seed( sfree(data Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e3ae940b4d29ffcb5ac92bf558a39e03 Text-delta-base-sha1: c5be53f4d39e8e2cdfc9528a8da9be0b878017d0 Text-content-length: 295 Text-content-md5: 985896bfacd394bc575ef1d89f9fa556 Text-content-sha1: 543e1bf139a9b726a86c13bdd4323fc66eb46a31 Content-length: 334 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN*p -}t.Ee/* * Don't truncate the random seed file if it already exists; if * something goes wrong half way through writing it, it would * be better to leave the old data there than to leave it empty. */ fd = open(fname, O_CREAT | O_WRONLYname, O_CREAT Revision-number: 2201 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2002-11-07T20:02:00.000000Z K 7 svn:log V 50 Improved robustness in random seed file handling. K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.53/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: bb61971ebc56faa04d624c5212ae89b0 Text-delta-base-sha1: 9702b8dea319b2991010a44cfda9aa67c1761f19 Text-content-length: 133 Text-content-md5: 7d61f0645147ae2bab908ae00c4f4409 Text-content-sha1: c2585e92a1514bbb732ecc616c21c974c7b4cf26 Content-length: 177 K 15 cvs2svn:cvs-rev V 8 1.13.2.1 PROPS-END SVNm\i&^)#$I /* Update the seed immediately, in case another instance uses it. */ random_save_seed( sfree(data Node-path: putty-branch-0.53/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: cbc5ab51c26c372a1e4ffe78bc3bde88 Text-delta-base-sha1: aa4ca5555948e78e9ce32f4b2e5567804f517a8e Text-content-length: 193 Text-content-md5: 56f6fd8187500faf57c67c35d928ae5f Text-content-sha1: 2a3ff311968c20cf1b0e702784d01ad417dff200 Content-length: 236 K 15 cvs2svn:cvs-rev V 7 1.8.2.1 PROPS-END SVNhF..void *buf = smalloc(POOLSIZE / 2); random_stir(); memcpy(buf, pool.pool + pool.poolpos, POOLSIZE / 2); *len = POOLSIZE / 2; *data = buf; random_stir(); } Revision-number: 2202 Prop-content-length: 159 Content-length: 159 K 10 svn:author V 5 simon K 8 svn:date V 27 2002-11-08T09:19:47.000000Z K 7 svn:log V 59 Oops - try increasing some more buffer sizes as well. Bah. PROPS-END Node-path: putty-branch-0.53/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 9533b5d5c695e6dc7de641d1c3c58306 Text-delta-base-sha1: 4ee5b3fb30832b8dab1d7564046451501cac01ed Text-content-length: 66 Text-content-md5: 827fc2ce07ade5ff46a9b7b877616e30 Text-content-sha1: e6a392ee6bbfbd2c561fbc1f151d01f379083f4c Content-length: 111 K 15 cvs2svn:cvs-rev V 9 1.201.2.1 PROPS-END SVNl&olo|512512TT V{Y512 Revision-number: 2203 Prop-content-length: 195 Content-length: 195 K 8 svn:date V 27 2002-11-08T19:14:25.000000Z K 7 svn:log V 95 Couple more precautionary buffer-size increases, while we're screwing down this sort of thing. K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.53/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: fd139e97a67e3c86e9c2ac133a7a59b0 Text-delta-base-sha1: c3a3af0c308cb4c37ee0e0eb23974751a2856295 Text-content-length: 44 Text-content-md5: 1757dd774113c6f1940a89b1414f8ad2 Text-content-sha1: bf17274c3ed8a5f95b09c69c70961e715c295e9c Content-length: 88 K 15 cvs2svn:cvs-rev V 8 1.40.2.2 PROPS-END SVN{,"1m1:E512512 Node-path: putty-branch-0.53/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 1eea0f3c459430ff27a01286abfb0684 Text-delta-base-sha1: d2fc58341f9dd171c66251293f181cb95e17c8b5 Text-content-length: 124 Text-content-md5: ef889844ad1323e51d0f8c84b06fbc58 Text-content-sha1: 656272372906646734e93536e5c01a3392787a25 Content-length: 168 K 15 cvs2svn:cvs-rev V 8 1.87.2.2 PROPS-END SVN*".AvS{U{ @U{J@U{@-}512512void connection_fatal(char *fmt, ...) { char str[512512 Revision-number: 2204 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2002-11-09T08:47:46.000000Z K 7 svn:log V 71 Add a wish for better ANSI.SYS compatibility as a configurable option. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/ansisys-compat Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 744 Text-content-md5: 25311b3d46a2a5a45c813e5f4e89a27c Text-content-sha1: 369aaee5ef97169f097c4bd4e9e639de5e387b13 Content-length: 860 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNZZZSummary: Better compatibility with DOS's ANSI.SYS Class: wish Difficulty: fun Priority: low Content-type: text/x-html-body

    I've had a report that MS-DOS's old ANSI.SYS behaves differently from PuTTY in two important respects: firstly, ESC[2J homes the cursor as well as clearing the screen, and secondly, auto-wrap wraps immediately when a character is displayed in the rightmost column, whereas PuTTY delays the wrapping until the next character is printed. More importantly, apparently old ANSI.SYS-using applications depend on both of these behaviours.

    Neither of these should be PuTTY's default - they would break plenty of more modern applications - but setting them as configurable options would be nice. Revision-number: 2205 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2002-11-09T21:46:21.000000Z K 7 svn:log V 93 Rename CharWidth() to char_width(). The former name clashes with an API function in Mac OS. K 10 svn:author V 3 ben PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7ac0735a2759383e781488cb1bb79eaf Text-delta-base-sha1: 9ac73d0c108c862a7540d121b3c854a4e73d0554 Text-content-length: 29 Text-content-md5: 0b46e5cc785e91f00bbbc53566712b5d Text-content-sha1: 9df7e2fa149886255e884c5dedd1269bea1def1e Content-length: 70 K 15 cvs2svn:cvs-rev V 5 1.164 PROPS-END SVNgh ostchar_w Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2c50b2a5dae49e83ae3ee4eb7612e931 Text-delta-base-sha1: 59328c6f38941d84539caeb4c85b2ef533ca93e4 Text-content-length: 47 Text-content-md5: de7d056da228bac424206bbba2962873 Text-content-sha1: f4c35e86e66b369ed8b58f56b509737f6bfa36fe Content-length: 88 K 15 cvs2svn:cvs-rev V 5 1.115 PROPS-END SVN sxchar_w./.+ Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 302c348c4950a38d6a8f50e090e20fd1 Text-delta-base-sha1: 94340f21e86f377a84c6a9bb12bbcc56a1b00fef Text-content-length: 32 Text-content-md5: e776896fd2f18f6ba419109367fe2f3d Text-content-sha1: 201fcf78543315c87d9575b8aae8b13c05049393 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVN 2R7char_w Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4eb800e2144af9d172e2a55f5087f594 Text-delta-base-sha1: 82fdf2aa2cc451540612d10fc527da2f364341de Text-content-length: 47 Text-content-md5: 33dc5ef37aaeb58145a6dca27d55b671 Text-content-sha1: 8098a61ed7cd9862774cbff3928ea689f99383ea Content-length: 88 K 15 cvs2svn:cvs-rev V 5 1.216 PROPS-END SVN (R-char_wABA Revision-number: 2206 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2002-11-10T00:03:55.000000Z K 7 svn:log V 186 Use to get wchar_t, rather than (or nothing, in putty.h). Both are required to contain wchar_t in C99, but only does in the version of MPW I've got here. K 10 svn:author V 3 ben PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0b46e5cc785e91f00bbbc53566712b5d Text-delta-base-sha1: 9df7e2fa149886255e884c5dedd1269bea1def1e Text-content-length: 64 Text-content-md5: 0750138b6e9a0263bee9df7e5af04a1a Text-content-sha1: a3045ef780661ad319adebdc4ceef457530338ce Content-length: 105 K 15 cvs2svn:cvs-rev V 5 1.165 PROPS-END SVNh *_ [#include /* for wchar_t Node-path: putty/wcwidth.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 78e645e3d38cfefcff0217bfa82e4986 Text-delta-base-sha1: 3345ccae0d6c1804d92f1e31e9840e03f7be6905 Text-content-length: 27 Text-content-md5: bdc9a7f29f1c95aac9d8cee3017d38dd Text-content-sha1: e67c701f5f45a7b4fc99619e55f4f184db54c613 Content-length: 66 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN-. {-stddef Revision-number: 2207 Prop-content-length: 104 Content-length: 104 K 8 svn:date V 27 2002-11-10T21:04:46.000000Z K 7 svn:log V 5 typo K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/startup-fullscreen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 72a37869b14a80277e710775bee5b144 Text-delta-base-sha1: 0edfc8159b025d7b43e9820e98f0cf2e73d1507b Text-content-length: 25 Text-content-md5: 99f20fc4db4c1af0f94d6097b88af648 Text-content-sha1: f0c0cd645db229a9591396ffccdca4fa36fe450d Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNMR *$)have Revision-number: 2208 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:04.351552Z PROPS-END Revision-number: 2209 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:04.361336Z PROPS-END Revision-number: 2210 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2002-11-12T18:55:41.000000Z K 7 svn:log V 42 Bump latest version to 0.53b for release! K 10 svn:author V 5 simon PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 842ec5d3dc70bcdfa9b5e02d231f5f04 Text-delta-base-sha1: 9ee1630c2df57a32622bf0f97316ad5ac8e45275 Text-content-length: 16 Text-content-md5: df9e0ae00fb8fe4db80f1ff690a2546c Text-content-sha1: 03335086beefdf8a0545ca8c9d5ea025e42a0c7e Content-length: 55 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN0.53b Revision-number: 2211 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2002-11-12T19:21:21.000000Z K 7 svn:log V 30 Bump version number for 0.53b K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.53/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 1094492434c41636af72a10e31c42d34 Text-delta-base-sha1: 5ab779a37d723251b13b6667879ad833336aa099 Text-content-length: 22 Text-content-md5: d54a93ed82823a267dcf68bc9116d28f Text-content-sha1: 9cc0d87fb303f97f908a3ef143c643373ec4858c Content-length: 65 K 15 cvs2svn:cvs-rev V 7 1.2.2.1 PROPS-END SVN Y;Yb Revision-number: 2212 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2002-11-12T19:21:21.000000Z K 7 svn:log V 67 This commit was manufactured by cvs2svn to create tag 'beta-0-53b'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-0.53b Node-kind: dir Node-action: add Node-copyfrom-rev: 1984 Node-copyfrom-path: putty Node-path: putty-0.53b/LATEST.VER Node-kind: file Node-action: add Node-copyfrom-rev: 2210 Node-copyfrom-path: putty/LATEST.VER Text-copy-source-md5: df9e0ae00fb8fe4db80f1ff690a2546c Text-copy-source-sha1: 03335086beefdf8a0545ca8c9d5ea025e42a0c7e Node-path: putty-0.53b/noise.c Node-kind: file Node-action: delete Node-path: putty-0.53b/noise.c Node-kind: file Node-action: add Node-copyfrom-rev: 2201 Node-copyfrom-path: putty-branch-0.53/noise.c Text-copy-source-md5: 7d61f0645147ae2bab908ae00c4f4409 Text-copy-source-sha1: c2585e92a1514bbb732ecc616c21c974c7b4cf26 Node-path: putty-0.53b/plink.c Node-kind: file Node-action: delete Node-path: putty-0.53b/plink.c Node-kind: file Node-action: add Node-copyfrom-rev: 2001 Node-copyfrom-path: putty-branch-0.53/plink.c Text-copy-source-md5: 23889bdc6295123c8290f2f3d3205330 Text-copy-source-sha1: 4d35fc5d0e9634264806b762e9653756f700a27e Node-path: putty-0.53b/psftp.c Node-kind: file Node-action: delete Node-path: putty-0.53b/psftp.c Node-kind: file Node-action: add Node-copyfrom-rev: 2203 Node-copyfrom-path: putty-branch-0.53/psftp.c Text-copy-source-md5: 1757dd774113c6f1940a89b1414f8ad2 Text-copy-source-sha1: bf17274c3ed8a5f95b09c69c70961e715c295e9c Node-path: putty-0.53b/putty.h Node-kind: file Node-action: delete Node-path: putty-0.53b/putty.h Node-kind: file Node-action: add Node-copyfrom-rev: 2001 Node-copyfrom-path: putty-branch-0.53/putty.h Text-copy-source-md5: 54d455736af60d03ebedb4fd3b40282c Text-copy-source-sha1: e826a937d9c1841fd83b48443a8e91f404b639dd Node-path: putty-0.53b/putty.iss Node-kind: file Node-action: delete Node-path: putty-0.53b/putty.iss Node-kind: file Node-action: add Node-copyfrom-rev: 2211 Node-copyfrom-path: putty-branch-0.53/putty.iss Text-copy-source-md5: d54a93ed82823a267dcf68bc9116d28f Text-copy-source-sha1: 9cc0d87fb303f97f908a3ef143c643373ec4858c Node-path: putty-0.53b/scp.c Node-kind: file Node-action: delete Node-path: putty-0.53b/scp.c Node-kind: file Node-action: add Node-copyfrom-rev: 2203 Node-copyfrom-path: putty-branch-0.53/scp.c Text-copy-source-md5: ef889844ad1323e51d0f8c84b06fbc58 Text-copy-source-sha1: 656272372906646734e93536e5c01a3392787a25 Node-path: putty-0.53b/ssh.c Node-kind: file Node-action: delete Node-path: putty-0.53b/ssh.c Node-kind: file Node-action: add Node-copyfrom-rev: 2197 Node-copyfrom-path: putty-branch-0.53/ssh.c Text-copy-source-md5: 32edb3a1c54c30337775a76d1be43ddd Text-copy-source-sha1: 01ef3397a8baff17946eb0f73e4655799d60ac0c Node-path: putty-0.53b/sshrand.c Node-kind: file Node-action: delete Node-path: putty-0.53b/sshrand.c Node-kind: file Node-action: add Node-copyfrom-rev: 2201 Node-copyfrom-path: putty-branch-0.53/sshrand.c Text-copy-source-md5: 56f6fd8187500faf57c67c35d928ae5f Text-copy-source-sha1: 2a3ff311968c20cf1b0e702784d01ad417dff200 Node-path: putty-0.53b/window.c Node-kind: file Node-action: delete Node-path: putty-0.53b/window.c Node-kind: file Node-action: add Node-copyfrom-rev: 2202 Node-copyfrom-path: putty-branch-0.53/window.c Text-copy-source-md5: 827fc2ce07ade5ff46a9b7b877616e30 Text-copy-source-sha1: e6a392ee6bbfbd2c561fbc1f151d01f379083f4c Node-path: putty-0.53b/contrib Node-action: delete Revision-number: 2213 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:04.561548Z PROPS-END Revision-number: 2214 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:04.569460Z PROPS-END Revision-number: 2215 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2002-11-17T01:56:01.000000Z K 7 svn:log V 89 Change a temporary buffer from unsigned chars to chars, avoiding a pointer-cast warning. K 10 svn:author V 3 ben PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: de7d056da228bac424206bbba2962873 Text-delta-base-sha1: f4c35e86e66b369ed8b58f56b509737f6bfa36fe Text-content-length: 69 Text-content-md5: 6637d296fcbbe5efe02faec4a3483999 Text-content-sha1: 40fbe5e4cf785d9d6f8eddb56b6dae7991cb14b0 Content-length: 110 K 15 cvs2svn:cvs-rev V 5 1.116 PROPS-END SVN~g+max(term->selanchor.x, s/ Revision-number: 2216 Prop-content-length: 253 Content-length: 253 K 8 svn:date V 27 2002-11-17T02:00:06.000000Z K 7 svn:log V 154 Apple's C compilers don't think that putting parentheses around assignments in "if" conditions is enough. Use an actual comparison against NULL instead. K 10 svn:author V 3 ben PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 664b0565a7528f69c14aea1d7b5c97af Text-delta-base-sha1: 4a5850c188d140b4cbbd0cf93f2db665dd433def Text-content-length: 33 Text-content-md5: 9fe3916d80192b5862b2b1558ab5ca92 Text-content-sha1: 6138b36e770e8c3515ba041c1a8cb4964c79eddc Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.87 PROPS-END SVN RCR != NULL Revision-number: 2217 Prop-content-length: 506 Content-length: 506 K 8 svn:date V 27 2002-11-17T15:06:16.000000Z K 7 svn:log V 405 Thanks to Hans-Juergen Petrich for spotting this tiny memory leak: `otherbuf' should still be freed even if the RegEnumKey function that was supposed to fill it with data failed. While I'm at it, also remove the redundant check for its non-NULL-ness (what's the point of having a malloc wrapper that dies rather than return NULL if you then waste effort checking its return value for NULL _anyway_, eh?). K 10 svn:author V 5 simon PROPS-END Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bb8ac853911aadcd7b7c9b9a7a7a2e08 Text-delta-base-sha1: c97144bbf174abd76cdc7d82999c32d5a6316762 Text-content-length: 102 Text-content-md5: 512441a12651775994b61eff06ceceed Text-content-sha1: 3dc1b3c96d468b6335e7c9af5e6631a5e4442e03 Content-length: 142 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN L{t5O8RegEnumKey(e->key, e->i++, otherbuf, { sfree(otherbuf); return NULL; } Revision-number: 2218 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2002-11-17T17:45:16.000000Z K 7 svn:log V 15 Fixed in 0.53b K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pscp-cmdline-port-bug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 915e2877d9e95e2bd7edd5399dd79ff2 Text-delta-base-sha1: b52e2d066f60ca76d60fcdead30b1873a8a7e42c Text-content-length: 27 Text-content-md5: 8ede2c2a4fa444a3b3624d20814e0a40 Text-content-sha1: 691255315cf18b6ee262219e1759f9cd84b122ce Content-length: 66 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNBH  6 0.53b Revision-number: 2219 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2002-11-17T18:21:39.000000Z K 7 svn:log V 76 Implement a slightly cleverer version-compare algorithm to cope with 0.53b. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8063349e20bd4cc0ff8f5388d93a8bc1 Text-delta-base-sha1: c363a749156a24adcdf169837237c5fd75142c98 Text-content-length: 643 Text-content-md5: 8ab173312b47ec721aced5b8659d1e8c Text-content-sha1: b8c9bf349e9b9ff021c69975e9a787131b83fd15 Content-length: 683 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNR` jd<.@#! /usr/bin/perl # $Id: bugs2html,v 1.12 2002/11/17 18:21:39Debian version compare algorithm (packaging manual 3.1.1.1) my $cmp = 0; while ($cmp == 0) { my ($apre, $bpre); ($apre, $aver) = ($aver =~ m/^(\D*)(.*)$/); ($bpre, $bver) = ($bver =~ m/^(\D*)(.*)$/); # Not quite the right collating order... $cmp = ($apre cmp $bpre); last if ($cmp != 0); ($apre, $aver) = ($aver =~ m/^(\d*)(.*)$/); ($bpre, $bver) = ($bver =~ m/^(\d*)(.*)$/); $cmp = ($apre <=> $bpre); } return $cmp Revision-number: 2220 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2002-11-17T18:43:55.000000Z K 7 svn:log V 67 Wibble about running SFTP sessions over existing SSH-2 connections K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-generality Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 51c4522d6905f278ea9947d2c1ecb25f Text-delta-base-sha1: 7a1581f32f43b9a99f924a6e2da5888b7577954d Text-content-length: 300 Text-content-md5: 591ca1007b0129788d5991b4a2e6ea5e Text-content-sha1: 6c908d10f5dd8320ffa0ae9b16833748244c849d Content-length: 339 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN";"

    Similarly, perhaps we should also support running (e.g.) psftp sessions over an existing connection rather than forcing a new TCP/SSH connection, using the same sort of inter-process communication as with Pageant. Needs careful implementation to avoid opening security holes. Revision-number: 2221 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2002-11-18T18:14:18.000000Z K 7 svn:log V 148 Both ISO and unicode.org now admit the existence of 8859-11 (:2001, FWIW), and unicode.org agrees with our mapping table. Update text accordingly. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8d513511a691dc43fe1213713a4c37c0 Text-delta-base-sha1: a13508861e24e2681efaebf87096f69c7f47f7cf Text-content-length: 70 Text-content-md5: 51969fd8a60666648cb262d8240d4abd Text-content-sha1: fff5c54bf83595014b8f88fb6c98058df2841a01 Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNk'1u?38ISO 8859-11:2001 ("Thai", "TIS620")2001 Revision-number: 2222 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2002-11-18T18:24:35.000000Z K 7 svn:log V 22 Don't forget the IEC! K 10 svn:author V 3 ben PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 51969fd8a60666648cb262d8240d4abd Text-delta-base-sha1: fff5c54bf83595014b8f88fb6c98058df2841a01 Text-content-length: 28 Text-content-md5: f8f04e5842f243d94dbe04fffc2b65f4 Text-content-sha1: 6eeabfbcf7458acac980c8e6e3489349410ffb6e Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN 4L4/IEC Revision-number: 2223 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2002-11-18T20:06:46.000000Z K 7 svn:log V 22 More comment cleanup. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f8f04e5842f243d94dbe04fffc2b65f4 Text-delta-base-sha1: 6eeabfbcf7458acac980c8e6e3489349410ffb6e Text-content-length: 119 Text-content-md5: a4220829b40c371a8fd285efe04214f9 Text-content-sha1: c0aabc63afd340e3014e0cbb55f40c65c00451ad Content-length: 159 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNSL@ S ss Table for ISO-8859-11 derived from same on 2002-11-18. -- bjh21/IEC/IEC/IEC Revision-number: 2224 Prop-content-length: 387 Content-length: 387 K 8 svn:date V 27 2002-11-18T22:27:25.000000Z K 7 svn:log V 288 ISO-IR entry 157 appears to correspond to ISO/IEC 8859-10, and lists code point 3/13 as HORIZONTAL BAR, which agrees with unicode.org's mapping table. Change ours to match (it used to have EM DASH, courtesy of RDB). This brings all our 8859-to-Unicode tables into line with unicode.org. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a4220829b40c371a8fd285efe04214f9 Text-delta-base-sha1: c0aabc63afd340e3014e0cbb55f40c65c00451ad Text-content-length: 109 Text-content-md5: 0ee35480476a66431a377a92bf60687d Text-content-sha1: db5affffe45a1c8ec6a035336c119af959ebeb27 Content-length: 149 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNS:B,-(Hs`10/IEC 8859-10:1998 (Latin-6, "Nordic" [Sami, Inuit, Icelandic])58 Revision-number: 2225 Prop-content-length: 254 Content-length: 254 K 7 svn:log V 155 When processing input, refer to CR and LF as \015 and \012 respectively, rather than \r and \n. The latter tend to get swapped around by Mac C compilers. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-18T23:49:30.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6637d296fcbbe5efe02faec4a3483999 Text-delta-base-sha1: 40fbe5e4cf785d9d6f8eddb56b6dae7991cb14b0 Text-content-length: 135 Text-content-md5: cf51b5cc3cdbd0d27316fe54e0bf2311 Text-content-sha1: 245a47d1c0196373820e99c8bea2a2c067b7e5a8 Content-length: 176 K 15 cvs2svn:cvs-rev V 5 1.117 PROPS-END SVN*+k%m5iBF,012' && c!='\015015012012' || c == '\015015& .g/selanchor.x, s015 Revision-number: 2226 Prop-content-length: 380 Content-length: 380 K 8 svn:date V 27 2002-11-19T02:13:46.000000Z K 7 svn:log V 281 Tentative merge of ben-mac-port (only dead for three years!) into the trunk. This doesn't include any mkfiles.pl glue, and is missing one or two other fixes. The terminal emulator is kind of working, though, as, I believe, is the store module. Everything else is yet to be done. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 13745 Text-content-md5: dea712a64fffbb73244ac7e8b7b1cf73 Text-content-sha1: 2f84e19c92e8b857abdae741669da1231b21f77b Content-length: 13861 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN###/* $Id: mac.c,v 1.1 2002/11/19 02:13:46 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * mac.c -- miscellaneous Mac-specific routines */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* putty.h needs size_t */ #include /* for vsprintf */ #define PUTTY_DO_GLOBALS #include "macresid.h" #include "putty.h" #include "mac.h" QDGlobals qd; static int cold = 1; struct mac_gestalts mac_gestalts; static void mac_startup(void); static void mac_eventloop(void); #pragma noreturn (mac_eventloop) static void mac_event(EventRecord *); static void mac_contentclick(WindowPtr, EventRecord *); static void mac_growwindow(WindowPtr, EventRecord *); static void mac_activatewindow(WindowPtr, EventRecord *); static void mac_activateabout(WindowPtr, EventRecord *); static void mac_updatewindow(WindowPtr); static void mac_keypress(EventRecord *); static int mac_windowtype(WindowPtr); static void mac_menucommand(long); static void mac_openabout(void); static void mac_adjustcursor(RgnHandle); static void mac_adjustmenus(void); static void mac_closewindow(WindowPtr); static void mac_zoomwindow(WindowPtr, short); static void mac_shutdown(void); #pragma noreturn (mac_shutdown) struct mac_windows { WindowPtr about; WindowPtr licence; }; struct mac_windows windows; int main (int argc, char **argv) { mac_startup(); mac_eventloop(); } #pragma noreturn (main) static void mac_startup(void) { Handle menuBar; /* Init Memory Manager */ MaxApplZone(); /* Init QuickDraw */ InitGraf(&qd.thePort); /* Init Font Manager */ InitFonts(); /* Init Window Manager */ InitWindows(); /* Init Menu Manager */ InitMenus(); /* Init TextEdit */ TEInit(); /* Init Dialog Manager */ InitDialogs(nil); cold = 0; /* Check for the Thread Manager. Bail out if it's not there. */ if (Gestalt(gestaltThreadMgrAttr, &mac_gestalts.thdsattr) != noErr || !(mac_gestalts.thdsattr & (1 << gestaltThreadMgrPresent)) || &NewThread == kUnresolvedCFragSymbolAddress) fatalbox("PuTTY requires the Thread Manager in order to operate. " "The Thread Manager can be obtained from Apple Software " "Updates."); /* Find out if we've got Color Quickdraw */ if (Gestalt(gestaltQuickdrawVersion, &mac_gestalts.qdvers) != noErr) mac_gestalts.qdvers = gestaltOriginalQD; /* ... and the Appearance Manager? */ if (Gestalt(gestaltAppearanceVersion, &mac_gestalts.apprvers) != noErr) if (Gestalt(gestaltAppearanceAttr, NULL) == noErr) mac_gestalts.apprvers = 0x0100; else mac_gestalts.apprvers = 0; #if TARGET_RT_MAC_CFM /* Paranoia: Did we manage to pull in AppearanceLib? */ if (&RegisterAppearanceClient == kUnresolvedCFragSymbolAddress) mac_gestalts.apprvers = 0; #endif /* Mac OS 8.5 Control Manager (proportional scrollbars)? */ if (Gestalt(gestaltControlMgrAttr, &mac_gestalts.cntlattr) != noErr) mac_gestalts.cntlattr = 0; /* Mac OS 8.5 Window Manager? */ if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr) mac_gestalts.windattr = 0; /* We've been tested with the Appearance Manager */ if (mac_gestalts.apprvers != 0) RegisterAppearanceClient(); menuBar = GetNewMBar(128); if (menuBar == NULL) fatalbox("Unable to create menu bar."); SetMenuBar(menuBar); AppendResMenu(GetMenuHandle(mApple), 'DRVR'); mac_adjustmenus(); DrawMenuBar(); InitCursor(); windows.about = NULL; windows.licence = NULL; init_ucs(); } static void mac_eventloop(void) { Boolean gotevent; EventRecord event; RgnHandle cursrgn; cursrgn = NewRgn(); for (;;) { mac_adjustcursor(cursrgn); gotevent = WaitNextEvent(everyEvent, &event, LONG_MAX, cursrgn); mac_adjustcursor(cursrgn); if (gotevent) mac_event(&event); YieldToAnyThread(); } DisposeRgn(cursrgn); } static void mac_event(EventRecord *event) { short part; WindowPtr window; Point pt; switch (event->what) { case mouseDown: part = FindWindow(event->where, &window); switch (part) { case inMenuBar: mac_adjustmenus(); mac_menucommand(MenuSelect(event->where)); break; case inSysWindow: SystemClick(event, window); break; case inContent: if (window != FrontWindow()) /* XXX: check for movable modal dboxes? */ SelectWindow(window); else mac_contentclick(window, event); break; case inGoAway: if (TrackGoAway(window, event->where)) mac_closewindow(window); break; case inDrag: /* XXX: moveable modal check? */ DragWindow(window, event->where, &qd.screenBits.bounds); break; case inGrow: mac_growwindow(window, event); break; case inZoomIn: case inZoomOut: if (TrackBox(window, event->where, part)) mac_zoomwindow(window, part); break; } break; case keyDown: case autoKey: mac_keypress(event); break; case activateEvt: mac_activatewindow((WindowPtr)event->message, event); break; case updateEvt: mac_updatewindow((WindowPtr)event->message); break; case diskEvt: if (HiWord(event->message) != noErr) { SetPt(&pt, 120, 120); DIBadMount(pt, event->message); } break; } } static void mac_contentclick(WindowPtr window, EventRecord *event) { short item; switch (mac_windowtype(window)) { case wTerminal: mac_clickterm(window, event); break; case wAbout: if (DialogSelect(event, &(DialogPtr)window, &item)) switch (item) { case wiAboutLicence: /* XXX: Do something */ break; } break; } } static void mac_growwindow(WindowPtr window, EventRecord *event) { switch (mac_windowtype(window)) { case wTerminal: mac_growterm(window, event); } } static void mac_activatewindow(WindowPtr window, EventRecord *event) { int active; active = (event->modifiers & activeFlag) != 0; mac_adjustmenus(); switch (mac_windowtype(window)) { case wTerminal: mac_activateterm(window, active); break; case wAbout: mac_activateabout(window, event); break; } } static void mac_activateabout(WindowPtr window, EventRecord *event) { DialogItemType itemtype; Handle itemhandle; short item; Rect itemrect; int active; active = (event->modifiers & activeFlag) != 0; GetDialogItem(window, wiAboutLicence, &itemtype, &itemhandle, &itemrect); HiliteControl((ControlHandle)itemhandle, active ? 0 : 255); DialogSelect(event, &window, &item); } static void mac_updatewindow(WindowPtr window) { switch (mac_windowtype(window)) { case wTerminal: mac_updateterm(window); break; case wAbout: BeginUpdate(window); UpdateDialog(window, window->visRgn); EndUpdate(window); break; case wLicence: /* Do something */ break; } } /* * Work out what kind of window we're dealing with. * Concept shamelessly nicked from SurfWriter. */ static int mac_windowtype(WindowPtr window) { int kind; if (window == NULL) return wNone; kind = ((WindowPeek)window)->windowKind; if (kind < 0) return wDA; if (GetWVariant(window) == zoomDocProc) return wTerminal; return GetWRefCon(window); } /* * Handle a key press */ static void mac_keypress(EventRecord *event) { WindowPtr window; window = FrontWindow(); /* * Check for a command-key combination, but ignore it if it counts * as a meta-key combination and we're in a terminal window. */ if (event->what == keyDown && (event->modifiers & cmdKey) /*&& !((event->modifiers & cfg.meta_modifiers) == cfg.meta_modifiers && mac_windowtype(window) == wTerminal)*/) { mac_adjustmenus(); mac_menucommand(MenuKey(event->message & charCodeMask)); } else { switch (mac_windowtype(window)) { case wTerminal: mac_keyterm(window, event); break; } } } static void mac_menucommand(long result) { short menu, item; Str255 da; WindowPtr window; menu = HiWord(result); item = LoWord(result); window = FrontWindow(); /* Things which do the same whatever window we're in. */ switch (menu) { case mApple: switch (item) { case iAbout: mac_openabout(); goto done; default: GetMenuItemText(GetMenuHandle(mApple), item, da); OpenDeskAcc(da); goto done; } break; case mFile: switch (item) { case iNew: mac_newsession(); goto done; case iClose: mac_closewindow(window); goto done; case iQuit: mac_shutdown(); goto done; } break; } /* If we get here, handling is up to window-specific code. */ switch (mac_windowtype(window)) { case wTerminal: mac_menuterm(window, menu, item); break; } done: HiliteMenu(0); } static void mac_openabout(void) { DialogItemType itemtype; Handle item; VersRecHndl vers; Rect box; StringPtr longvers; if (windows.about) SelectWindow(windows.about); else { windows.about = GetNewDialog(wAbout, NULL, (WindowPtr)-1); /* XXX check we're using the right resource file? */ vers = (VersRecHndl)GetResource('vers', 1); assert(vers != NULL && *vers != NULL); longvers = (*vers)->shortVersion + (*vers)->shortVersion[0] + 1; GetDialogItem(windows.about, wiAboutVersion, &itemtype, &item, &box); assert(itemtype & kStaticTextDialogItem); SetDialogItemText(item, longvers); ShowWindow(windows.about); } } static void mac_closewindow(WindowPtr window) { switch (mac_windowtype(window)) { case wDA: CloseDeskAcc(((WindowPeek)window)->windowKind); break; case wTerminal: /* FIXME: end session and stuff */ break; case wAbout: windows.about = NULL; CloseWindow(window); break; default: CloseWindow(window); break; } } static void mac_zoomwindow(WindowPtr window, short part) { /* FIXME: do something */ } /* * Make the menus look right before the user gets to see them. */ static void mac_adjustmenus(void) { WindowPtr window; MenuHandle menu; window = FrontWindow(); menu = GetMenuHandle(mApple); EnableItem(menu, 0); EnableItem(menu, iAbout); menu = GetMenuHandle(mFile); EnableItem(menu, 0); EnableItem(menu, iNew); if (window != NULL) EnableItem(menu, iClose); else DisableItem(menu, iClose); EnableItem(menu, iQuit); switch (mac_windowtype(window)) { case wTerminal: mac_adjusttermmenus(window); break; default: menu = GetMenuHandle(mEdit); DisableItem(menu, 0); break; } DrawMenuBar(); } /* * Make sure the right cursor's being displayed. */ static void mac_adjustcursor(RgnHandle cursrgn) { Point mouse; WindowPtr window, front; short part; GetMouse(&mouse); LocalToGlobal(&mouse); part = FindWindow(mouse, &window); front = FrontWindow(); if (part != inContent || window == NULL || window != front) { /* Cursor isn't in the front window, so switch to arrow */ SetCursor(&qd.arrow); SetRectRgn(cursrgn, SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX); if (front != NULL) DiffRgn(cursrgn, front->visRgn, cursrgn); } else { switch (mac_windowtype(window)) { case wTerminal: mac_adjusttermcursor(window, mouse, cursrgn); break; default: SetCursor(&qd.arrow); CopyRgn(window->visRgn, cursrgn); break; } } } static void mac_shutdown(void) { exit(0); } void fatalbox(char *fmt, ...) { va_list ap; Str255 stuff; va_start(ap, fmt); /* We'd like stuff to be a Pascal string */ stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); va_end(ap); ParamText(stuff, NULL, NULL, NULL); StopAlert(128, nil); exit(1); } void modalfatalbox(char *fmt, ...) { va_list ap; Str255 stuff; va_start(ap, fmt); /* We'd like stuff to be a Pascal string */ stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); va_end(ap); ParamText(stuff, NULL, NULL, NULL); StopAlert(128, nil); exit(1); } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/mac.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1834 Text-content-md5: 670dd4dec4f697e0c59d6cfe766dbb98 Text-content-sha1: 1680a8de0596901f95ad1cb89fcd67986f8195e1 Content-length: 1950 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN/* * mac.h -- macintosh-specific declarations */ #ifndef PUTTY_MAC_H #define PUTTY_MAC_H #include #include #include #include #include struct mac_gestalts { long qdvers; long apprvers; long cntlattr; long windattr; long thdsattr; }; extern struct mac_gestalts mac_gestalts; #define HAVE_COLOR_QD() (mac_gestalts.qdvers > gestaltOriginalQD) /* from macterm.c */ extern void mac_newsession(void); extern void mac_activateterm(WindowPtr, Boolean); extern void mac_adjusttermcursor(WindowPtr, Point, RgnHandle); extern void mac_adjusttermmenus(WindowPtr); extern void mac_updateterm(WindowPtr); extern void mac_clickterm(WindowPtr, EventRecord *); extern void mac_growterm(WindowPtr, EventRecord *); extern void mac_keyterm(WindowPtr, EventRecord *); extern void mac_menuterm(WindowPtr, short, short); /* from maccfg.c */ extern void mac_loadconfig(Config *); /* from macnet.c */ extern void macnet_eventcheck(void); typedef struct { /* Config that created this session */ Config cfg; /* Terminal emulator internal state */ Terminal *term; /* Display state */ int font_width, font_height; int has_focus; /* Line discipline */ void *ldisc; /* Backend */ Backend *back; void *backhandle; char *realhost; /* Logging */ void *logctx; /* Conveniences */ unsigned long attr_mask; /* Mask of attributes to display */ /* Mac-specific elements */ short fontnum; int font_ascent; int font_leading; int font_boldadjust; WindowPtr window; PaletteHandle palette; ControlHandle scrollbar; WCTabHandle wctab; ThreadID thread; int raw_mouse; } Session; #endif /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/macresid.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 920 Text-content-md5: 129ea3c310e018683eeb3e989fe9285c Text-content-sha1: e53c3a96070fda618b88ed2f977ce8173cda0323 Content-length: 1036 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN  /* $Id: macresid.h,v 1.1 2002/11/19 02:13:46 ben Exp $ */ /* * macresid.h -- Mac resource IDs * * This file is shared by C and Rez source files */ /* Menu bar IDs */ #define MBAR_Main 128 /* Menu IDs */ #define mApple 128 #define mFile 129 #define mEdit 130 /* Menu Items */ /* Apple menu */ #define iAbout 1 /* File menu */ #define iNew 1 #define iClose 2 #define iQuit 4 /* Edit menu */ #define iUndo 1 #define iCut 3 #define iCopy 4 #define iPaste 5 #define iClear 6 #define iSelectAll 7 /* Window types (and resource IDs) */ #define wNone 0 /* Dummy value for no window */ #define wDA 1 /* Dummy value for desk accessory */ #define wFatal 128 #define wAbout 129 #define wiAboutLicence 1 #define wiAboutVersion 3 #define wTerminal 130 #define wLicence 131 /* Controls */ #define cVScroll 128 /* Preferences */ #define PREF_wordness_type 'wORD' #define PREF_settings 1024 Node-path: putty/mac/macstore.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 9065 Text-content-md5: 65c66679aae3998b7f7348e0bfb3eaee Text-content-sha1: a4c71f942565f8ed39aa5fdae117eb16c24ecbe2 Content-length: 9181 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN[[[/* $Id: macstore.c,v 1.1 2002/11/19 02:13:46 ben Exp $ */ /* * macstore.c: Macintosh-specific impementation of the interface * defined in storage.h */ #include #include #include #include #include #include #include "putty.h" #include "storage.h" #define PUTTY_CREATOR FOUR_CHAR_CODE('pTTY') #define SESS_TYPE FOUR_CHAR_CODE('Sess') OSErr get_session_dir(Boolean makeit, short *pVRefNum, long *pDirID); OSErr FSpGetDirID(FSSpec *f, long *idp, Boolean makeit); /* * We store each session as a file in the "PuTTY" sub-directory of the * preferences folder. Each (key,value) pair is stored as a resource. */ OSErr get_session_dir(Boolean makeit, short *pVRefNum, long *pDirID) { OSErr error = noErr; short prefVRefNum; FSSpec puttydir, sessdir; long prefDirID, puttyDirID, sessDirID; error = FindFolder(kOnSystemDisk, kPreferencesFolderType, makeit, &prefVRefNum, &prefDirID); if (error != noErr) goto out; error = FSMakeFSSpec(prefVRefNum, prefDirID, "\pPuTTY", &puttydir); if (error != noErr && error != fnfErr) goto out; error = FSpGetDirID(&puttydir, &puttyDirID, makeit); if (error != noErr) goto out; error = FSMakeFSSpec(prefVRefNum, puttyDirID, "\pSaved Sessions", &sessdir); if (error != noErr && error != fnfErr) goto out; error = FSpGetDirID(&sessdir, &sessDirID, makeit); if (error != noErr) goto out; *pVRefNum = prefVRefNum; *pDirID = sessDirID; out: return error; } OSErr FSpGetDirID(FSSpec *f, long *idp, Boolean makeit) { CInfoPBRec pb; OSErr error = noErr; pb.dirInfo.ioNamePtr = f->name; pb.dirInfo.ioVRefNum = f->vRefNum; pb.dirInfo.ioDrDirID = f->parID; pb.dirInfo.ioFDirIndex = 0; error = PBGetCatInfoSync(&pb); if (error == fnfErr && makeit) return FSpDirCreate(f, smSystemScript, idp); if (error != noErr) goto out; if ((pb.dirInfo.ioFlAttrib & ioDirMask) == 0) { error = dirNFErr; goto out; } *idp = pb.dirInfo.ioDrDirID; out: return error; } struct write_settings { int fd; FSSpec tmpfile; FSSpec dstfile; }; void *open_settings_w(char *sessionname) { short sessVRefNum, tmpVRefNum; long sessDirID, tmpDirID; FSSpec sessfile; OSErr error; Str255 psessionname; struct write_settings *ws; ws = safemalloc(sizeof *ws); error = get_session_dir(kCreateFolder, &sessVRefNum, &sessDirID); if (error != noErr) goto out; c2pstrcpy(psessionname, sessionname); error = FSMakeFSSpec(sessVRefNum, sessDirID, psessionname, &ws->dstfile); if (error != noErr && error != fnfErr) goto out; if (error == fnfErr) { FSpCreateResFile(&ws->dstfile, PUTTY_CREATOR, SESS_TYPE, smSystemScript); if ((error = ResError()) != noErr) goto out; } /* Create a temporary file to save to first. */ error = FindFolder(sessVRefNum, kTemporaryFolderType, kCreateFolder, &tmpVRefNum, &tmpDirID); if (error != noErr) goto out; error = FSMakeFSSpec(tmpVRefNum, tmpDirID, psessionname, &ws->tmpfile); if (error != noErr && error != fnfErr) goto out; if (error == noErr) { error = FSpDelete(&ws->tmpfile); if (error != noErr) goto out; } FSpCreateResFile(&ws->tmpfile, PUTTY_CREATOR, SESS_TYPE, smSystemScript); if ((error = ResError()) != noErr) goto out; ws->fd = FSpOpenResFile(&ws->tmpfile, fsWrPerm); if (ws->fd == -1) {error = ResError(); goto out;} return ws; out: safefree(ws); fatalbox("Failed to open session for write (%d)", error); } void write_setting_s(void *handle, char *key, char *value) { int fd = *(int *)handle; Handle h; int id; OSErr error; UseResFile(fd); if (ResError() != noErr) fatalbox("Failed to open saved session (%d)", ResError()); error = PtrToHand(value, &h, strlen(value)); if (error != noErr) fatalbox("Failed to allocate memory"); /* Put the data in a resource. */ id = Unique1ID(FOUR_CHAR_CODE('TEXT')); if (ResError() != noErr) fatalbox("Failed to get ID for resource %s (%d)", key, ResError()); addresource(h, FOUR_CHAR_CODE('TEXT'), id, key); if (ResError() != noErr) fatalbox("Failed to add resource %s (%d)", key, ResError()); } void write_setting_i(void *handle, char *key, int value) { int fd = *(int *)handle; Handle h; int id; OSErr error; UseResFile(fd); if (ResError() != noErr) fatalbox("Failed to open saved session (%d)", ResError()); /* XXX assume all systems have the same "int" format */ error = PtrToHand(&value, &h, sizeof(int)); if (error != noErr) fatalbox("Failed to allocate memory (%d)", error); /* Put the data in a resource. */ id = Unique1ID(FOUR_CHAR_CODE('Int ')); if (ResError() != noErr) fatalbox("Failed to get ID for resource %s (%d)", key, ResError()); addresource(h, FOUR_CHAR_CODE('Int '), id, key); if (ResError() != noErr) fatalbox("Failed to add resource %s (%d)", key, ResError()); } void close_settings_w(void *handle) { struct write_settings *ws = handle; OSErr error; CloseResFile(ws->fd); if ((error = ResError()) != noErr) goto out; error = FSpExchangeFiles(&ws->tmpfile, &ws->dstfile); if (error != noErr) goto out; error = FSpDelete(&ws->tmpfile); if (error != noErr) goto out; return; out: fatalbox("Close of saved session failed (%d)", error); safefree(handle); } void *open_settings_r(char *sessionname) { short sessVRefNum; long sessDirID; FSSpec sessfile; OSErr error; Str255 psessionname; int fd; int *handle; error = get_session_dir(kDontCreateFolder, &sessVRefNum, &sessDirID); c2pstrcpy(psessionname, sessionname); error = FSMakeFSSpec(sessVRefNum, sessDirID, psessionname, &sessfile); if (error != noErr) goto out; fd = FSpOpenResFile(&sessfile, fsRdPerm); if (fd == 0) {error = ResError(); goto out;} handle = safemalloc(sizeof *handle); *handle = fd; return handle; out: return NULL; } char *read_setting_s(void *handle, char *key, char *buffer, int buflen) { int fd; Handle h; OSErr error; if (handle == NULL) goto out; fd = *(int *)handle; UseResFile(fd); if (ResError() != noErr) goto out; h = get1namedresource(FOUR_CHAR_CODE('TEXT'), key); if (h == NULL) goto out; if (GetHandleSize(h) > buflen) goto out; p2cstrcpy(buffer, (StringPtr)*h); ReleaseResource(h); if (ResError() != noErr) goto out; return buffer; out: return NULL; } int read_setting_i(void *handle, char *key, int defvalue) { int fd; Handle h; OSErr error; int value; if (handle == NULL) goto out; fd = *(int *)handle; UseResFile(fd); if (ResError() != noErr) goto out; h = get1namedresource(FOUR_CHAR_CODE('Int '), key); if (h == NULL) goto out; value = *(int *)*h; ReleaseResource(h); if (ResError() != noErr) goto out; return value; out: return defvalue; } void close_settings_r(void *handle) { int fd; if (handle == NULL) return; fd = *(int *)handle; CloseResFile(fd); if (ResError() != noErr) fatalbox("Close of saved session failed (%d)", ResError()); safefree(handle); } void del_settings(char *sessionname) { OSErr error; FSSpec sessfile; short sessVRefNum; long sessDirID; Str255 psessionname; error = get_session_dir(kDontCreateFolder, &sessVRefNum, &sessDirID); c2pstrcpy(psessionname, sessionname); error = FSMakeFSSpec(sessVRefNum, sessDirID, psessionname, &sessfile); if (error != noErr) goto out; error = FSpDelete(&sessfile); return; out: fatalbox("Delete session failed (%d)", error); } struct enum_settings_state { short vRefNum; long dirID; int index; }; void *enum_settings_start(void) { OSErr error; struct enum_settings_state *state; state = safemalloc(sizeof(*state)); error = get_session_dir(kDontCreateFolder, &state->vRefNum, &state->dirID); if (error != noErr) { safefree(state); return NULL; } state->index = 1; return state; } char *enum_settings_next(void *handle, char *buffer, int buflen) { struct enum_settings_state *e = handle; CInfoPBRec pb; OSErr error = noErr; Str255 name; if (e == NULL) return NULL; do { pb.hFileInfo.ioNamePtr = name; pb.hFileInfo.ioVRefNum = e->vRefNum; pb.hFileInfo.ioDirID = e->dirID; pb.hFileInfo.ioFDirIndex = e->index++; error = PBGetCatInfoSync(&pb); if (error != noErr) return NULL; } while (!((pb.hFileInfo.ioFlAttrib & ioDirMask) == 0 && pb.hFileInfo.ioFlFndrInfo.fdCreator == PUTTY_CREATOR && pb.hFileInfo.ioFlFndrInfo.fdType == SESS_TYPE && name[0] < buflen)); p2cstrcpy(buffer, name); return buffer; } void enum_settings_finish(void *handle) { safefree(handle); } /* * Emacs magic: * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/macstuff.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 700 Text-content-md5: 157f2dc610bbedf1098e6fdb9effebbd Text-content-sha1: fbdcd6fc890c911232dfc8fef0b30933b1a0aab4 Content-length: 816 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN.../* * macstuff.h -- Mac-specific definitions visible to the rest of PuTTY. */ typedef void *Context; /* FIXME */ /* * On the Mac, Unicode text copied to the clipboard has U+2028 line separators. * Non-Unicode text will have these converted to CR along with the rest of the * content. */ #define SEL_NL { 0x2028 } #include /* Timing related goo */ #define GETTICKCOUNT TickCount #define CURSORBLINK GetCaretTime() #define TICKSPERSEC 60 #define DEFAULT_CODEPAGE 0 /* FIXME: no idea how to do this */ #define WCHAR wchar_t #define BYTE unsigned char /* To make it compile */ #include extern int vsnprintf(char *, size_t, char const *, va_list); Node-path: putty/mac/macterm.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 36406 Text-content-md5: 7c1fdc5fb0d71fcb75338d0467447dbd Text-content-sha1: aea5e4a40546b97e7ba1613bd4aec9a950616374 Content-length: 36522 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN%%%/* $Id: macterm.c,v 1.1 2002/11/19 02:13:46 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * macterm.c -- Macintosh terminal front-end */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "macresid.h" #include "putty.h" #include "mac.h" #include "terminal.h" #define NCOLOURS (lenof(((Config *)0)->colours)) #define DEFAULT_FG 16 #define DEFAULT_FG_BOLD 17 #define DEFAULT_BG 18 #define DEFAULT_BG_BOLD 19 #define CURSOR_FG 20 #define CURSOR_FG_BOLD 21 #define CURSOR_BG 22 #define CURSOR_BG_BOLD 23 #define PTOCC(x) ((x) < 0 ? -(-(x - s->font_width - 1) / s->font_width) : \ (x) / s->font_width) #define PTOCR(y) ((y) < 0 ? -(-(y - s->font_height - 1) / s->font_height) : \ (y) / s->font_height) static void mac_initfont(Session *); static void mac_initpalette(Session *); static void mac_adjustwinbg(Session *); static void mac_adjustsize(Session *, int, int); static void mac_drawgrowicon(Session *s); static pascal void mac_scrolltracker(ControlHandle, short); static pascal void do_text_for_device(short, short, GDHandle, long); static pascal void mac_set_attr_mask(short, short, GDHandle, long); static int mac_keytrans(Session *, EventRecord *, unsigned char *); static void text_click(Session *, EventRecord *); void pre_paint(Session *s); void post_paint(Session *s); #if TARGET_RT_MAC_CFM static RoutineDescriptor mac_scrolltracker_upp = BUILD_ROUTINE_DESCRIPTOR(uppControlActionProcInfo, (ProcPtr)mac_scrolltracker); static RoutineDescriptor do_text_for_device_upp = BUILD_ROUTINE_DESCRIPTOR(uppDeviceLoopDrawingProcInfo, (ProcPtr)do_text_for_device); static RoutineDescriptor mac_set_attr_mask_upp = BUILD_ROUTINE_DESCRIPTOR(uppDeviceLoopDrawingProcInfo, (ProcPtr)mac_set_attr_mask); #else /* not TARGET_RT_MAC_CFM */ #define mac_scrolltracker_upp mac_scrolltracker #define do_text_for_device_upp do_text_for_device #define mac_set_attr_mask_upp mac_set_attr_mask #endif /* not TARGET_RT_MAC_CFM */ static void inbuf_putc(Session *s, int c) { char ch = c; from_backend(s->term, 0, &ch, 1); } static void inbuf_putstr(Session *s, const char *c) { from_backend(s->term, 0, (char *)c, strlen(c)); } static void display_resource(Session *s, unsigned long type, short id) { Handle h; int len, i; char *t; h = GetResource(type, id); if (h == NULL) fatalbox("Can't get test resource"); len = GetResourceSizeOnDisk(h); DetachResource(h); HNoPurge(h); HLock(h); t = *h; from_backend(s->term, 0, t, len); term_out(s->term); DisposeHandle(h); } void mac_newsession(void) { Session *s; UInt32 starttime; char msg[128]; OSErr err; /* This should obviously be initialised by other means */ s = smalloc(sizeof(*s)); memset(s, 0, sizeof(*s)); do_defaults(NULL, &s->cfg); s->back = &loop_backend; /* XXX: Own storage management? */ if (HAVE_COLOR_QD()) s->window = GetNewCWindow(wTerminal, NULL, (WindowPtr)-1); else s->window = GetNewWindow(wTerminal, NULL, (WindowPtr)-1); SetWRefCon(s->window, (long)s); s->scrollbar = GetNewControl(cVScroll, s->window); s->term = term_init(s); s->logctx = log_init(s); term_provide_logctx(s->term, s->logctx); s->back->init(s->term, &s->backhandle, "localhost", 23, &s->realhost, 0); s->back->provide_logctx(s->backhandle, s->logctx); term_provide_resize_fn(s->term, s->back->size, s->backhandle); mac_adjustsize(s, s->cfg.height, s->cfg.width); term_size(s->term, s->cfg.height, s->cfg.width, s->cfg.savelines); s->ldisc = ldisc_create(s->term, s->back, s->backhandle, s); ldisc_send(s->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */ mac_initfont(s); mac_initpalette(s); s->attr_mask = ATTR_MASK; if (HAVE_COLOR_QD()) { /* Set to FALSE to not get palette updates in the background. */ SetPalette(s->window, s->palette, TRUE); ActivatePalette(s->window); } ShowWindow(s->window); starttime = TickCount(); display_resource(s, 'pTST', 128); sprintf(msg, "Elapsed ticks: %d\015\012", TickCount() - starttime); inbuf_putstr(s, msg); term_out(s->term); } static void mac_initfont(Session *s) { Str255 macfont; FontInfo fi; SetPort(s->window); macfont[0] = sprintf((char *)&macfont[1], "%s", s->cfg.font); GetFNum(macfont, &s->fontnum); TextFont(s->fontnum); TextFace(s->cfg.fontisbold ? bold : 0); TextSize(s->cfg.fontheight); GetFontInfo(&fi); s->font_width = CharWidth('W'); /* Well, it's what NCSA uses. */ s->font_ascent = fi.ascent; s->font_leading = fi.leading; s->font_height = s->font_ascent + fi.descent + s->font_leading; if (!s->cfg.bold_colour) { TextFace(bold); s->font_boldadjust = s->font_width - CharWidth('W'); } else s->font_boldadjust = 0; mac_adjustsize(s, s->term->rows, s->term->cols); } /* * To be called whenever the window size changes. * rows and cols should be desired values. * It's assumed the terminal emulator will be informed, and will set rows * and cols for us. */ static void mac_adjustsize(Session *s, int newrows, int newcols) { int winwidth, winheight; winwidth = newcols * s->font_width + 15; winheight = newrows * s->font_height; SizeWindow(s->window, winwidth, winheight, true); HideControl(s->scrollbar); MoveControl(s->scrollbar, winwidth - 15, -1); SizeControl(s->scrollbar, 16, winheight - 13); ShowControl(s->scrollbar); } static void mac_initpalette(Session *s) { int i; /* * Most colours should be inhibited on 2bpp displays. * Palette manager documentation suggests inhibiting all tolerant colours * on greyscale displays. */ #define PM_NORMAL pmTolerant | pmInhibitC2 | \ pmInhibitG2 | pmInhibitG4 | pmInhibitG8 | pmInhibitC2 #define PM_TOLERANCE 0x2000 s->palette = NewPalette(22, NULL, PM_NORMAL, PM_TOLERANCE); if (s->palette == NULL) fatalbox("Unable to create palette"); /* In 2bpp, these are the colours we want most. */ SetEntryUsage(s->palette, DEFAULT_BG, PM_NORMAL &~ pmInhibitC2, PM_TOLERANCE); SetEntryUsage(s->palette, DEFAULT_FG, PM_NORMAL &~ pmInhibitC2, PM_TOLERANCE); SetEntryUsage(s->palette, DEFAULT_FG_BOLD, PM_NORMAL &~ pmInhibitC2, PM_TOLERANCE); SetEntryUsage(s->palette, CURSOR_FG, PM_NORMAL &~ pmInhibitC2, PM_TOLERANCE); palette_reset(s); } /* * Set the background colour of the window correctly. Should be * called whenever the default background changes. */ static void mac_adjustwinbg(Session *s) { if (!HAVE_COLOR_QD()) return; #if TARGET_RT_CFM /* XXX doesn't link (at least for 68k) */ if (mac_gestalts.windattr & gestaltWindowMgrPresent) SetWindowContentColor(s->window, &(*s->palette)->pmInfo[DEFAULT_BG].ciRGB); else #endif { if (s->wctab == NULL) s->wctab = (WCTabHandle)NewHandle(sizeof(**s->wctab)); if (s->wctab == NULL) return; /* do without */ (*s->wctab)->wCSeed = 0; (*s->wctab)->wCReserved = 0; (*s->wctab)->ctSize = 0; (*s->wctab)->ctTable[0].value = wContentColor; (*s->wctab)->ctTable[0].rgb = (*s->palette)->pmInfo[DEFAULT_BG].ciRGB; SetWinColor(s->window, s->wctab); } } /* * Set the cursor shape correctly */ void mac_adjusttermcursor(WindowPtr window, Point mouse, RgnHandle cursrgn) { Session *s; ControlHandle control; short part; int x, y; SetPort(window); s = (Session *)GetWRefCon(window); GlobalToLocal(&mouse); part = FindControl(mouse, window, &control); if (control == s->scrollbar) { SetCursor(&qd.arrow); RectRgn(cursrgn, &(*s->scrollbar)->contrlRect); SectRgn(cursrgn, window->visRgn, cursrgn); } else { x = mouse.h / s->font_width; y = mouse.v / s->font_height; if (s->raw_mouse) SetCursor(&qd.arrow); else SetCursor(*GetCursor(iBeamCursor)); /* Ask for shape changes if we leave this character cell. */ SetRectRgn(cursrgn, x * s->font_width, y * s->font_height, (x + 1) * s->font_width, (y + 1) * s->font_height); SectRgn(cursrgn, window->visRgn, cursrgn); } } /* * Enable/disable menu items based on the active terminal window. */ void mac_adjusttermmenus(WindowPtr window) { Session *s; MenuHandle menu; long offset; s = (Session *)GetWRefCon(window); menu = GetMenuHandle(mEdit); EnableItem(menu, 0); DisableItem(menu, iUndo); DisableItem(menu, iCut); if (1/*s->term->selstate == SELECTED*/) EnableItem(menu, iCopy); else DisableItem(menu, iCopy); if (GetScrap(NULL, 'TEXT', &offset) == noTypeErr) DisableItem(menu, iPaste); else EnableItem(menu, iPaste); DisableItem(menu, iClear); EnableItem(menu, iSelectAll); } void mac_menuterm(WindowPtr window, short menu, short item) { Session *s; s = (Session *)GetWRefCon(window); switch (menu) { case mEdit: switch (item) { case iCopy: /* term_copy(s); */ break; case iPaste: term_do_paste(s->term); break; } } } void mac_clickterm(WindowPtr window, EventRecord *event) { Session *s; Point mouse; ControlHandle control; int part; s = (Session *)GetWRefCon(window); SetPort(window); mouse = event->where; GlobalToLocal(&mouse); part = FindControl(mouse, window, &control); if (control == s->scrollbar) { switch (part) { case kControlIndicatorPart: if (TrackControl(control, mouse, NULL) == kControlIndicatorPart) term_scroll(s->term, +1, GetControlValue(control)); break; case kControlUpButtonPart: case kControlDownButtonPart: case kControlPageUpPart: case kControlPageDownPart: TrackControl(control, mouse, &mac_scrolltracker_upp); break; } } else { text_click(s, event); } } static void text_click(Session *s, EventRecord *event) { Point localwhere; int row, col; static UInt32 lastwhen = 0; static Session *lastsess = NULL; static int lastrow = -1, lastcol = -1; static Mouse_Action lastact = MA_NOTHING; SetPort(s->window); localwhere = event->where; GlobalToLocal(&localwhere); col = PTOCC(localwhere.h); row = PTOCR(localwhere.v); if (event->when - lastwhen < GetDblTime() && row == lastrow && col == lastcol && s == lastsess) lastact = (lastact == MA_CLICK ? MA_2CLK : lastact == MA_2CLK ? MA_3CLK : lastact == MA_3CLK ? MA_CLICK : MA_NOTHING); else lastact = MA_CLICK; /* Fake right button with shift key */ term_mouse(s->term, event->modifiers & shiftKey ? MBT_RIGHT : MBT_LEFT, lastact, col, row, event->modifiers & shiftKey, event->modifiers & controlKey, event->modifiers & optionKey); lastsess = s; lastrow = row; lastcol = col; while (StillDown()) { GetMouse(&localwhere); col = PTOCC(localwhere.h); row = PTOCR(localwhere.v); term_mouse(s->term, event->modifiers & shiftKey ? MBT_RIGHT : MBT_LEFT, MA_DRAG, col, row, event->modifiers & shiftKey, event->modifiers & controlKey, event->modifiers & optionKey); if (row > s->term->rows - 1) term_scroll(s->term, 0, row - (s->term->rows - 1)); else if (row < 0) term_scroll(s->term, 0, row); } term_mouse(s->term, event->modifiers & shiftKey ? MBT_RIGHT : MBT_LEFT, MA_RELEASE, col, row, event->modifiers & shiftKey, event->modifiers & controlKey, event->modifiers & optionKey); lastwhen = TickCount(); } Mouse_Button translate_button(void *frontend, Mouse_Button button) { switch (button) { case MBT_LEFT: return MBT_SELECT; case MBT_RIGHT: return MBT_EXTEND; default: return 0; } } void write_clip(void *cookie, wchar_t *data, int len, int must_deselect) { /* * See "Programming with the Text Encoding Conversion Manager" * Appendix E for Unicode scrap conventions. * * XXX Need to support TEXT/styl scrap as well. * See STScrpRec in TextEdit (Inside Macintosh: Text) for styl details. * XXX Maybe PICT scrap too. */ if (ZeroScrap() != noErr) return; PutScrap(len * sizeof(*data), 'utxt', data); } void get_clip(void *frontend, wchar_t **p, int *lenp) { Session *s = frontend; static Handle h = NULL; long offset; if (p == NULL) { /* release memory */ if (h != NULL) DisposeHandle(h); h = NULL; } else /* XXX Support TEXT-format scrap as well. */ if (GetScrap(NULL, 'utxt', &offset) > 0) { h = NewHandle(0); *lenp = GetScrap(h, 'utxt', &offset) / sizeof(**p); HLock(h); *p = (wchar_t *)*h; if (*p == NULL || *lenp <= 0) fatalbox("Empty scrap"); } else { *p = NULL; *lenp = 0; } } static pascal void mac_scrolltracker(ControlHandle control, short part) { Session *s; s = (Session *)GetWRefCon((*control)->contrlOwner); switch (part) { case kControlUpButtonPart: term_scroll(s->term, 0, -1); break; case kControlDownButtonPart: term_scroll(s->term, 0, +1); break; case kControlPageUpPart: term_scroll(s->term, 0, -(s->term->rows - 1)); break; case kControlPageDownPart: term_scroll(s->term, 0, +(s->term->rows - 1)); break; } } #define K_BS 0x3300 #define K_F1 0x7a00 #define K_F2 0x7800 #define K_F3 0x6300 #define K_F4 0x7600 #define K_F5 0x6000 #define K_F6 0x6100 #define K_F7 0x6200 #define K_F8 0x6400 #define K_F9 0x6500 #define K_F10 0x6d00 #define K_F11 0x6700 #define K_F12 0x6f00 #define K_F13 0x6900 #define K_F14 0x6b00 #define K_F15 0x7100 #define K_INSERT 0x7200 #define K_HOME 0x7300 #define K_PRIOR 0x7400 #define K_DELETE 0x7500 #define K_END 0x7700 #define K_NEXT 0x7900 #define K_LEFT 0x7b00 #define K_RIGHT 0x7c00 #define K_DOWN 0x7d00 #define K_UP 0x7e00 #define KP_0 0x5200 #define KP_1 0x5300 #define KP_2 0x5400 #define KP_3 0x5500 #define KP_4 0x5600 #define KP_5 0x5700 #define KP_6 0x5800 #define KP_7 0x5900 #define KP_8 0x5b00 #define KP_9 0x5c00 #define KP_CLEAR 0x4700 #define KP_EQUAL 0x5100 #define KP_SLASH 0x4b00 #define KP_STAR 0x4300 #define KP_PLUS 0x4500 #define KP_MINUS 0x4e00 #define KP_DOT 0x4100 #define KP_ENTER 0x4c00 void mac_keyterm(WindowPtr window, EventRecord *event) { unsigned char buf[20]; int len; Session *s; s = (Session *)GetWRefCon(window); len = mac_keytrans(s, event, buf); s->back->send(s, (char *)buf, len); } static int mac_keytrans(Session *s, EventRecord *event, unsigned char *output) { unsigned char *p = output; int code; /* No meta key yet -- that'll be rather fun. */ /* Keys that we handle locally */ if (event->modifiers & shiftKey) { switch (event->message & keyCodeMask) { case K_PRIOR: /* shift-pageup */ term_scroll(s->term, 0, -(s->term->rows - 1)); return 0; case K_NEXT: /* shift-pagedown */ term_scroll(s->term, 0, +(s->term->rows - 1)); return 0; } } /* * Control-2 should return ^@ (0x00), Control-6 should return * ^^ (0x1E), and Control-Minus should return ^_ (0x1F). Since * the DOS keyboard handling did it, and we have nothing better * to do with the key combo in question, we'll also map * Control-Backquote to ^\ (0x1C). */ if (event->modifiers & controlKey) { switch (event->message & charCodeMask) { case ' ': case '2': *p++ = 0x00; return p - output; case '`': *p++ = 0x1c; return p - output; case '6': *p++ = 0x1e; return p - output; case '/': *p++ = 0x1f; return p - output; } } /* * First, all the keys that do tilde codes. (ESC '[' nn '~', * for integer decimal nn.) * * We also deal with the weird ones here. Linux VCs replace F1 * to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but * does replace Home and End (1~ and 4~) by ESC [ H and ESC O w * respectively. */ code = 0; switch (event->message & keyCodeMask) { case K_F1: code = (event->modifiers & shiftKey ? 23 : 11); break; case K_F2: code = (event->modifiers & shiftKey ? 24 : 12); break; case K_F3: code = (event->modifiers & shiftKey ? 25 : 13); break; case K_F4: code = (event->modifiers & shiftKey ? 26 : 14); break; case K_F5: code = (event->modifiers & shiftKey ? 28 : 15); break; case K_F6: code = (event->modifiers & shiftKey ? 29 : 17); break; case K_F7: code = (event->modifiers & shiftKey ? 31 : 18); break; case K_F8: code = (event->modifiers & shiftKey ? 32 : 19); break; case K_F9: code = (event->modifiers & shiftKey ? 33 : 20); break; case K_F10: code = (event->modifiers & shiftKey ? 34 : 21); break; case K_F11: code = 23; break; case K_F12: code = 24; break; case K_HOME: code = 1; break; case K_INSERT: code = 2; break; case K_DELETE: code = 3; break; case K_END: code = 4; break; case K_PRIOR: code = 5; break; case K_NEXT: code = 6; break; } if (s->cfg.funky_type == 1 && code >= 11 && code <= 15) { p += sprintf((char *)p, "\x1B[[%c", code + 'A' - 11); return p - output; } if (s->cfg.rxvt_homeend && (code == 1 || code == 4)) { p += sprintf((char *)p, code == 1 ? "\x1B[H" : "\x1BOw"); return p - output; } if (code) { p += sprintf((char *)p, "\x1B[%d~", code); return p - output; } if (s->term->app_keypad_keys) { switch (event->message & keyCodeMask) { case KP_ENTER: p += sprintf((char *)p, "\x1BOM"); return p - output; case KP_CLEAR: p += sprintf((char *)p, "\x1BOP"); return p - output; case KP_EQUAL: p += sprintf((char *)p, "\x1BOQ"); return p - output; case KP_SLASH: p += sprintf((char *)p, "\x1BOR"); return p - output; case KP_STAR: p += sprintf((char *)p, "\x1BOS"); return p - output; case KP_PLUS: p += sprintf((char *)p, "\x1BOl"); return p - output; case KP_MINUS: p += sprintf((char *)p, "\x1BOm"); return p - output; case KP_DOT: p += sprintf((char *)p, "\x1BOn"); return p - output; case KP_0: p += sprintf((char *)p, "\x1BOp"); return p - output; case KP_1: p += sprintf((char *)p, "\x1BOq"); return p - output; case KP_2: p += sprintf((char *)p, "\x1BOr"); return p - output; case KP_3: p += sprintf((char *)p, "\x1BOs"); return p - output; case KP_4: p += sprintf((char *)p, "\x1BOt"); return p - output; case KP_5: p += sprintf((char *)p, "\x1BOu"); return p - output; case KP_6: p += sprintf((char *)p, "\x1BOv"); return p - output; case KP_7: p += sprintf((char *)p, "\x1BOw"); return p - output; case KP_8: p += sprintf((char *)p, "\x1BOx"); return p - output; case KP_9: p += sprintf((char *)p, "\x1BOy"); return p - output; } } switch (event->message & keyCodeMask) { case K_UP: p += sprintf((char *)p, s->term->app_cursor_keys ? "\x1BOA" : "\x1B[A"); return p - output; case K_DOWN: p += sprintf((char *)p, s->term->app_cursor_keys ? "\x1BOB" : "\x1B[B"); return p - output; case K_RIGHT: p += sprintf((char *)p, s->term->app_cursor_keys ? "\x1BOC" : "\x1B[C"); return p - output; case K_LEFT: p += sprintf((char *)p, s->term->app_cursor_keys ? "\x1BOD" : "\x1B[D"); return p - output; case KP_ENTER: *p++ = 0x0d; return p - output; case K_BS: *p++ = (s->cfg.bksp_is_delete ? 0x7f : 0x08); return p - output; default: *p++ = event->message & charCodeMask; return p - output; } } void request_paste(void *frontend) { Session *s = frontend; /* * In the Mac OS, pasting is synchronous: we can read the * clipboard with no difficulty, so request_paste() can just go * ahead and paste. */ term_do_paste(s->term); } void mac_growterm(WindowPtr window, EventRecord *event) { Rect limits; long grow_result; int newrows, newcols; Session *s; s = (Session *)GetWRefCon(window); SetRect(&limits, s->font_width + 15, s->font_height, SHRT_MAX, SHRT_MAX); grow_result = GrowWindow(window, event->where, &limits); if (grow_result != 0) { newrows = HiWord(grow_result) / s->font_height; newcols = (LoWord(grow_result) - 15) / s->font_width; mac_adjustsize(s, newrows, newcols); term_size(s->term, newrows, newcols, s->cfg.savelines); } } void mac_activateterm(WindowPtr window, Boolean active) { Session *s; s = (Session *)GetWRefCon(window); s->has_focus = active; term_update(s->term); if (active) ShowControl(s->scrollbar); else { if (HAVE_COLOR_QD()) PmBackColor(DEFAULT_BG);/* HideControl clears behind the control */ else BackColor(blackColor); HideControl(s->scrollbar); } mac_drawgrowicon(s); } void mac_updateterm(WindowPtr window) { Session *s; s = (Session *)GetWRefCon(window); SetPort(window); BeginUpdate(window); pre_paint(s); term_paint(s->term, s, (*window->visRgn)->rgnBBox.left, (*window->visRgn)->rgnBBox.top, (*window->visRgn)->rgnBBox.right, (*window->visRgn)->rgnBBox.bottom, 1); /* Restore default colours in case the Window Manager uses them */ if (HAVE_COLOR_QD()) { PmForeColor(DEFAULT_FG); PmBackColor(DEFAULT_BG); } else { ForeColor(whiteColor); BackColor(blackColor); } if (FrontWindow() != window) EraseRect(&(*s->scrollbar)->contrlRect); UpdateControls(window, window->visRgn); mac_drawgrowicon(s); post_paint(s); EndUpdate(window); } static void mac_drawgrowicon(Session *s) { Rect clip; SetPort(s->window); /* Stop DrawGrowIcon giving us space for a horizontal scrollbar */ SetRect(&clip, s->window->portRect.right - 15, SHRT_MIN, SHRT_MAX, SHRT_MAX); ClipRect(&clip); DrawGrowIcon(s->window); clip.left = SHRT_MIN; ClipRect(&clip); } struct do_text_args { Session *s; Rect textrect; Rect leadrect; char *text; int len; unsigned long attr; int lattr; }; /* * Call from the terminal emulator to draw a bit of text * * x and y are text row and column (zero-based) */ void do_text(Context ctx, int x, int y, char *text, int len, unsigned long attr, int lattr) { Session *s = ctx; int style = 0; struct do_text_args a; RgnHandle textrgn; #if 0 int i; #endif SetPort(s->window); #if 0 fprintf(stderr, "printing at (%d,%d) %d chars (attr=%x, lattr=%x):\n", x, y, len, attr, lattr); for (i = 0; i < len; i++) fprintf(stderr, "%c", text[i]); fprintf(stderr, "\n"); #endif /* First check this text is relevant */ a.textrect.top = y * s->font_height; a.textrect.bottom = (y + 1) * s->font_height; a.textrect.left = x * s->font_width; a.textrect.right = (x + len) * s->font_width; if (!RectInRgn(&a.textrect, s->window->visRgn)) return; a.s = s; a.text = text; a.len = len; a.attr = attr; a.lattr = lattr; if (s->font_leading > 0) SetRect(&a.leadrect, a.textrect.left, a.textrect.bottom - s->font_leading, a.textrect.right, a.textrect.bottom); else SetRect(&a.leadrect, 0, 0, 0, 0); SetPort(s->window); TextFont(s->fontnum); if (s->cfg.fontisbold || (attr & ATTR_BOLD) && !s->cfg.bold_colour) style |= bold; if (attr & ATTR_UNDER) style |= underline; TextFace(style); TextSize(s->cfg.fontheight); SetFractEnable(FALSE); /* We want characters on pixel boundaries */ if (HAVE_COLOR_QD()) if (style & bold) { SpaceExtra(s->font_boldadjust << 16); CharExtra(s->font_boldadjust << 16); } else { SpaceExtra(0); CharExtra(0); } textrgn = NewRgn(); RectRgn(textrgn, &a.textrect); if (HAVE_COLOR_QD()) DeviceLoop(textrgn, &do_text_for_device_upp, (long)&a, 0); else do_text_for_device(1, 0, NULL, (long)&a); DisposeRgn(textrgn); /* Tell the window manager about it in case this isn't an update */ ValidRect(&a.textrect); } static pascal void do_text_for_device(short depth, short devflags, GDHandle device, long cookie) { struct do_text_args *a; int bgcolour, fgcolour, bright; a = (struct do_text_args *)cookie; bright = (a->attr & ATTR_BOLD) && a->s->cfg.bold_colour; TextMode(a->attr & ATTR_REVERSE ? notSrcCopy : srcCopy); switch (depth) { case 1: /* XXX This should be done with a _little_ more configurability */ ForeColor(whiteColor); BackColor(blackColor); if (a->attr & TATTR_ACTCURS) TextMode(a->attr & ATTR_REVERSE ? srcCopy : notSrcCopy); break; case 2: if (a->attr & TATTR_ACTCURS) { PmForeColor(bright ? CURSOR_FG_BOLD : CURSOR_FG); PmBackColor(CURSOR_BG); TextMode(srcCopy); } else { PmForeColor(bright ? DEFAULT_FG_BOLD : DEFAULT_FG); PmBackColor(DEFAULT_BG); } break; default: if (a->attr & TATTR_ACTCURS) { fgcolour = bright ? CURSOR_FG_BOLD : CURSOR_FG; bgcolour = CURSOR_BG; TextMode(srcCopy); } else { fgcolour = ((a->attr & ATTR_FGMASK) >> ATTR_FGSHIFT) * 2; bgcolour = ((a->attr & ATTR_BGMASK) >> ATTR_BGSHIFT) * 2; if (bright) if (a->attr & ATTR_REVERSE) bgcolour++; else fgcolour++; } PmForeColor(fgcolour); PmBackColor(bgcolour); break; } if (a->attr & ATTR_REVERSE) PaintRect(&a->leadrect); else EraseRect(&a->leadrect); MoveTo(a->textrect.left, a->textrect.top + a->s->font_ascent); /* FIXME: Sort out bold width adjustments on Original QuickDraw. */ DrawText(a->text, 0, a->len); if (a->attr & TATTR_PASCURS) { PenNormal(); switch (depth) { case 1: PenMode(patXor); break; default: PmForeColor(CURSOR_BG); break; } FrameRect(&a->textrect); } } void do_cursor(Context ctx, int x, int y, char *text, int len, unsigned long attr, int lattr) { /* FIXME: Should do something here! */ } /* * Call from the terminal emulator to get its graphics context. * Should probably be called start_redraw or something. */ void pre_paint(Session *s) { s->attr_mask = ATTR_INVALID; if (HAVE_COLOR_QD()) DeviceLoop(s->window->visRgn, &mac_set_attr_mask_upp, (long)s, 0); else mac_set_attr_mask(1, 0, NULL, (long)s); } Context get_ctx(void *frontend) { Session *s = frontend; pre_paint(s); return s; } void free_ctx(Context ctx) { } static pascal void mac_set_attr_mask(short depth, short devflags, GDHandle device, long cookie) { Session *s = (Session *)cookie; switch (depth) { default: s->attr_mask |= ATTR_FGMASK | ATTR_BGMASK; /* FALLTHROUGH */ case 2: s->attr_mask |= ATTR_BOLD; /* FALLTHROUGH */ case 1: s->attr_mask |= ATTR_UNDER | ATTR_REVERSE | TATTR_ACTCURS | TATTR_PASCURS | ATTR_ASCII | ATTR_GBCHR | ATTR_LINEDRW | (s->cfg.bold_colour ? 0 : ATTR_BOLD); break; } } /* * Presumably this does something in Windows */ void post_paint(Session *s) { } /* * Set the scroll bar position * * total is the line number of the bottom of the working screen * start is the line number of the top of the display * page is the length of the displayed page */ void set_sbar(void *frontend, int total, int start, int page) { Session *s = frontend; /* We don't redraw until we've set everything up, to avoid glitches */ (*s->scrollbar)->contrlMin = 0; (*s->scrollbar)->contrlMax = total - page; SetControlValue(s->scrollbar, start); #if TARGET_RT_CFM /* XXX: This doesn't link for me. */ if (mac_gestalts.cntlattr & gestaltControlMgrPresent) SetControlViewSize(s->scrollbar, page); #endif } void sys_cursor(void *frontend, int x, int y) { /* * I think his is meaningless under Mac OS. */ } /* * This is still called when mode==BELL_VISUAL, even though the * visual bell is handled entirely within terminal.c, because we * may want to perform additional actions on any kind of bell (for * example, taskbar flashing in Windows). */ void beep(void *frontend, int mode) { if (mode != BELL_VISUAL) SysBeep(30); /* * XXX We should indicate the relevant window and/or use the * Notification Manager */ } int char_width(Context ctx, int uc) { /* * Until we support exciting character-set stuff, assume all chars are * single-width. */ return 1; } /* * Set icon string -- a no-op here (Windowshade?) */ void set_icon(void *frontend, char *icon) { Session *s = frontend; } /* * Set the window title */ void set_title(void *frontend, char *title) { Session *s = frontend; Str255 mactitle; mactitle[0] = sprintf((char *)&mactitle[1], "%s", title); SetWTitle(s->window, mactitle); } /* * set or clear the "raw mouse message" mode */ void set_raw_mouse_mode(void *frontend, int activate) { Session *s = frontend; s->raw_mouse = activate; /* FIXME: Should call mac_updatetermcursor as appropriate. */ } /* * Resize the window at the emulator's request */ void request_resize(void *frontend, int w, int h) { Session *s = frontend; s->term->cols = w; s->term->rows = h; mac_initfont(s); } /* * Iconify (actually collapse) the window at the emulator's request. */ void set_iconic(void *frontend, int iconic) { Session *s = frontend; UInt32 features; if (mac_gestalts.apprvers >= 0x0100 && GetWindowFeatures(s->window, &features) == noErr && (features & kWindowCanCollapse)) CollapseWindow(s->window, iconic); } /* * Move the window in response to a server-side request. */ void move_window(void *frontend, int x, int y) { Session *s = frontend; MoveWindow(s->window, x, y, FALSE); } /* * Move the window to the top or bottom of the z-order in response * to a server-side request. */ void set_zorder(void *frontend, int top) { Session *s = frontend; /* * We also change the input focus to point to the topmost window, * since that's probably what the Human Interface Guidelines would * like us to do. */ if (top) SelectWindow(s->window); else SendBehind(s->window, NULL); } /* * Refresh the window in response to a server-side request. */ void refresh_window(void *frontend) { Session *s = frontend; term_invalidate(s->term); } /* * Maximise or restore the window in response to a server-side * request. */ void set_zoomed(void *frontend, int zoomed) { Session *s = frontend; ZoomWindow(s->window, zoomed ? inZoomOut : inZoomIn, FALSE); } /* * Report whether the window is iconic, for terminal reports. */ int is_iconic(void *frontend) { Session *s = frontend; UInt32 features; if (mac_gestalts.apprvers >= 0x0100 && GetWindowFeatures(s->window, &features) == noErr && (features & kWindowCanCollapse)) return IsWindowCollapsed(s->window); return FALSE; } /* * Report the window's position, for terminal reports. */ void get_window_pos(void *frontend, int *x, int *y) { Session *s = frontend; *x = s->window->portRect.left; *y = s->window->portRect.top; } /* * Report the window's pixel size, for terminal reports. */ void get_window_pixels(void *frontend, int *x, int *y) { Session *s = frontend; *x = s->window->portRect.right - s->window->portRect.left; *y = s->window->portRect.bottom - s->window->portRect.top; } /* * Return the window or icon title. */ char *get_window_title(void *frontend, int icon) { Session *s = frontend; /* Erm, we don't save this at the moment */ return ""; } /* * real_palette_set(): This does the actual palette-changing work on behalf * of palette_set(). Does _not_ call ActivatePalette() in case the caller * is doing a batch of updates. */ static void real_palette_set(Session *s, int n, int r, int g, int b) { RGBColor col; if (!HAVE_COLOR_QD()) return; col.red = r * 0x0101; col.green = g * 0x0101; col.blue = b * 0x0101; fprintf(stderr, "p%d <- (0x%x, 0x%x, 0x%x)\n", n, col.red, col.green, col.blue); SetEntryColor(s->palette, n, &col); } /* * Set the logical palette. Called by the terminal emulator. */ void palette_set(void *frontend, int n, int r, int g, int b) { Session *s = frontend; static const int first[21] = { 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15, 16, 17, 18, 20, 22 }; if (!HAVE_COLOR_QD()) return; real_palette_set(s, first[n], r, g, b); if (first[n] >= 18) real_palette_set(s, first[n]+1, r, g, b); if (first[n] == DEFAULT_BG) mac_adjustwinbg(s); ActivatePalette(s->window); } /* * Reset to the default palette */ void palette_reset(void *frontend) { Session *s = frontend; /* This maps colour indices in cfg to those used in our palette. */ static const int ww[] = { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, 1, 2, 3, 4, 5 }; int i; if (!HAVE_COLOR_QD()) return; assert(lenof(ww) == NCOLOURS); for (i = 0; i < NCOLOURS; i++) { real_palette_set(s, i, s->cfg.colours[ww[i]][0], s->cfg.colours[ww[i]][1], s->cfg.colours[ww[i]][2]); } mac_adjustwinbg(s); ActivatePalette(s->window); /* Palette Manager will generate update events as required. */ } /* * Scroll the screen. (`lines' is +ve for scrolling forward, -ve * for backward.) */ void do_scroll(void *frontend, int topline, int botline, int lines) { Session *s = frontend; Rect r; RgnHandle update; /* FIXME: This is seriously broken on Original QuickDraw. No idea why. */ SetPort(s->window); if (HAVE_COLOR_QD()) PmBackColor(DEFAULT_BG); else BackColor(blackColor); update = NewRgn(); SetRect(&r, 0, topline * s->font_height, s->term->cols * s->font_width, (botline + 1) * s->font_height); ScrollRect(&r, 0, - lines * s->font_height, update); /* XXX: move update region? */ InvalRgn(update); DisposeRgn(update); } void logevent(void *frontend, char *str) { /* XXX Do something */ } /* Dummy routine, only required in plink. */ void ldisc_update(void *frontend, int echo, int edit) { } /* * Mac PuTTY doesn't support printing yet. */ printer_job *printer_start_job(char *printer) { return NULL; } void printer_job_data(printer_job *pj, void *data, int len) { } void printer_finish_job(printer_job *pj) { } void frontend_keypress(void *handle) { /* * Keypress termination in non-Close-On-Exit mode is not * currently supported in PuTTY proper, because the window * always has a perfectly good Close button anyway. So we do * nothing here. */ return; } /* * Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ int askappend(void *frontend, char *filename) { /* FIXME: not implemented yet. */ return 2; } /* * Emacs magic: * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/macucs.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1805 Text-content-md5: 9e16c57849a3d6763eddc2d01ba58dc1 Text-content-sha1: b3e6b966ccf19383d7d3a067603b32afe22338b7 Content-length: 1921 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN/* $Id: macucs.c,v 1.1 2002/11/19 02:13:46 ben Exp $ */ #include #include #include #include #include "putty.h" #include "terminal.h" #include "misc.h" /* * Mac Unicode-handling routines. * * FIXME: currently trivial stub versions assuming all codepages * are ISO8859-1. * * What we _should_ do is to use the Text Encoding Conversion Manager * when it's available, and have our own routines for converting to * standard Mac OS scripts when it's not. Support for ATSUI might be * nice, too. */ int is_dbcs_leadbyte(int codepage, char byte) { return 0; /* we don't do DBCS */ } int mb_to_wc(int codepage, int flags, char *mbstr, int mblen, wchar_t *wcstr, int wclen) { int ret = 0; while (mblen > 0 && wclen > 0) { *wcstr++ = (unsigned char) *mbstr++; mblen--, wclen--, ret++; } return ret; /* FIXME: check error codes! */ } int wc_to_mb(int codepage, int flags, wchar_t *wcstr, int wclen, char *mbstr, int mblen, char *defchr, int *defused) { int ret = 0; if (defused) *defused = 0; while (mblen > 0 && wclen > 0) { if (*wcstr >= 0x100) { if (defchr) *mbstr++ = *defchr; else *mbstr++ = '.'; if (defused) *defused = 1; } else *mbstr++ = (unsigned char) *wcstr; wcstr++; mblen--, wclen--, ret++; } return ret; /* FIXME: check error codes! */ } void init_ucs(void) { int i; /* Find the line control characters. FIXME: this is not right. */ for (i = 0; i < 256; i++) if (i < ' ' || (i >= 0x7F && i < 0xA0)) unitab_ctrl[i] = i; else unitab_ctrl[i] = 0xFF; for (i = 0; i < 256; i++) { unitab_line[i] = unitab_scoacs[i] = i; unitab_xterm[i] = (i >= 0x5F && i < 0x7F) ? ((i+1) & 0x1F) : i; } } Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0750138b6e9a0263bee9df7e5af04a1a Text-delta-base-sha1: a3045ef780661ad319adebdc4ceef457530338ce Text-content-length: 96 Text-content-md5: 57738e41a70a3fb27d2c3cdeb87902f6 Text-content-sha1: a6540529aa1c3289ebd792c771437b3595e08a90 Content-length: 137 K 15 cvs2svn:cvs-rev V 5 1.166 PROPS-END SVNt H`HLJtestback.c */ extern Backend null_backend; extern Backend loop_backend Node-path: putty/puttyps.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 727a86ef2a577c4cdca8983fdb6bccf5 Text-delta-base-sha1: f75298911d0f7ade1e9412fc25d4e976987aa6ad Text-content-length: 53 Text-content-md5: f3e1fd6bd5d5ec53744631e1406a9cd7 Text-content-sha1: 0c2938309ecbde148eb7e153a0b9733533b5fde0 Content-length: 92 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNH$q3dif defined(macintosh) #include "mac Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9fe3916d80192b5862b2b1558ab5ca92 Text-delta-base-sha1: 6138b36e770e8c3515ba041c1a8cb4964c79eddc Text-content-length: 80 Text-content-md5: ba375c6750bbb281a28175f67e7fd69e Text-content-sha1: 1cee9d4dee785bb934b47ec6574b34e517d6c8f0 Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.88 PROPS-END SVNy 7Hz#if defined(macintosh) gpps(sesskey, "Font", "Monaco Revision-number: 2227 Prop-content-length: 147 Content-length: 147 K 7 svn:log V 49 Mac resource source file, missed in last commit. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-19T02:14:35.000000Z PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 16140 Text-content-md5: f45690ab94a05caeef8bbd0fe3ed488d Text-content-sha1: 2fa4ff00460bb0711550a99170380cefb42f7cc9 Content-length: 16256 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN~~~/* $Id: mac_res.r,v 1.1 2002/11/19 02:14:35 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* PuTTY resources */ #include "Types.r" #include "Dialogs.r" #include "Palettes.r" /* Get resource IDs we share with C code */ #include "macresid.h" /* * Finder-related resources */ /* 'pTTY' is now registered with Apple as PuTTY's signature */ type 'pTTY' as 'STR '; resource 'pTTY' (0, purgeable) { "PuTTY experimental Mac port" }; resource 'SIZE' (-1) { reserved, ignoreSuspendResumeEvents, reserved, cannotBackground, needsActivateOnFGSwitch, backgroundAndForeground, dontGetFrontClicks, ignoreAppDiedEvents, is32BitCompatible, notHighLevelEventAware, onlyLocalHLEvents, notStationeryAware, useTextEditServices, reserved, reserved, reserved, 1024 * 1024, /* Minimum size */ 1024 * 1024, /* Preferred size */ }; resource 'FREF' (128, purgeable) { /* The application itself */ 'APPL', 128, "" }; resource 'FREF' (129, purgeable) { /* Saved session */ 'Sess', 129, "" }; resource 'FREF' (130, purgeable) { /* SSH host keys database */ 'HKey', 130, "" }; resource 'BNDL' (128, purgeable) { 'pTTY', 0, { 'ICN#', { 128, 128, 129, 129, 130, 130 }, 'FREF', { 128, 128, 129, 129, 130, 130 }; }; }; /* Icons, courtesy of DeRez */ /* Application icon */ resource 'ICN#' (128, purgeable) { { /* array: 2 elements */ /* [1] */ $"00003FFE 00004001 00004FF9 00005005" $"00005355 00004505 00005A05 00002405" $"00004A85 00019005 000223F9 00047C01" $"00180201 7FA00C7D 801F1001 9FE22001" $"A00CDFFE AA892002 A0123FFE A82C0000" $"A0520000 AA6A0000 A00A0000 9FF20000" $"80020000 80020000 90FA0000 80020000" $"80020000 7FFC0000 40040000 7FFC", /* [2] */ $"00003FFE 00007FFF 00007FFF 00007FFF" $"00007FFF 00007FFF 00007FFF 00007FFF" $"00007FFF 0001FFFF 0003FFFF 0007FFFF" $"001FFFFF 7FFFFFFF FFFFFFFF FFFFFFFF" $"FFFFFFFE FFFF3FFE FFFE3FFE FFFE0000" $"FFFE0000 FFFE0000 FFFE0000 FFFE0000" $"FFFE0000 FFFE0000 FFFE0000 FFFE0000" $"FFFE0000 7FFC0000 7FFC0000 7FFC" } }; resource 'icl4' (128, purgeable) { $"000000000000000000FFFFFFFFFFFFF0" $"00000000000000000FCCCCCCCCCCCCCF" $"00000000000000000FCEEEEEEEEEEECF" $"00000000000000000FCE0D0D0D0D0CCF" $"00000000000000000FCED0FFD0D0D0CF" $"00000000000000000FCE0F1F0D0D0CCF" $"00000000000000000FCFF1F0D0D0D0CF" $"00000000000000000FF11F0D0D0D0CCF" $"00000000000000000F11F0D0D0D0D0CF" $"000000000000000FF11F0D0D0D0D0CCF" $"00000000000000F111FEC0C0C0C0C0CF" $"0000000000000F111FFFFFCCCCCCCCCF" $"00000000000FF111111111FCCCCCCCCF" $"0FFFFFFFFFF111111111FFCCCFFFFFCF" $"FCCCCCCCCCCFFFFF111F3CCCCCCCCCCF" $"FCEEEEEEEEEEECF111FCCCCCCCCCCCCF" $"FCE0D0D0D0D0FF11FFFFFFFFFFFFFFF0" $"FCED0D0D0D0DF11F00FCCCDDDEEEEAF0" $"FCE0D0D0D0DF11F000FFFFFFFFFFFFF0" $"FCED0D0D0DF1FFF00000000000000000" $"FCE0D0D0DF1FCCF00000000000000000" $"FCED0D0D0FFD0CF00000000000000000" $"FCE0D0D0D0D0CCF00000000000000000" $"FCEC0C0C0C0C0CF00000000000000000" $"FCCCCCCCCCCCCCF00000000000000000" $"FCCCCCCCCCCCCCF00000000000000000" $"FC88CCCCFFFFFCF00000000000000000" $"FC33CCCCCCCCCCF00000000000000000" $"FCCCCCCCCCCCCCF00000000000000000" $"0FFFFFFFFFFFFF000000000000000000" $"0FCCCDDDEEEEAF000000000000000000" $"0FFFFFFFFFFFFF" }; resource 'icl8' (128, purgeable) { $"000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF00" $"0000000000000000000000000000000000FF2B2B2B2B2B2B2B2B2B2B2B2B2BFF" $"0000000000000000000000000000000000FF2BFCFCFCFCFCFCFCFCFCFCFC2BFF" $"0000000000000000000000000000000000FF2BFC2A2A2A2A2A2A2A2A2A002BFF" $"0000000000000000000000000000000000FF2BFC2A2AFFFF2A2A2A2A2A002BFF" $"0000000000000000000000000000000000FF2BFC2AFF05FF2A2A2A2A2A002BFF" $"0000000000000000000000000000000000FF2BFFFF05FF2A2A2A2A2A2A002BFF" $"0000000000000000000000000000000000FFFF0505FF2A2A2A2A2A2A2A002BFF" $"0000000000000000000000000000000000FF0505FF2A2A2A2A2A2A2A2A002BFF" $"000000000000000000000000000000FFFF0505FF2A2A2A2A2A2A2A2A2A002BFF" $"0000000000000000000000000000FF050505FFFC000000000000000000002BFF" $"00000000000000000000000000FF050505FFFFFFFFFF2B2B2B2B2B2B2B2B2BFF" $"0000000000000000000000FFFF050505050505050505FF2B2B2B2B2B2B2B2BFF" $"00FFFFFFFFFFFFFFFFFFFF050505050505050505FFFF2B2B2BFFFFFFFFFF2BFF" $"FF2B2B2B2B2B2B2B2B2B2BFFFFFFFFFF050505FFD82B2B2B2B2B2B2B2B2B2BFF" $"FF2BFCFCFCFCFCFCFCFCFCFCFC2BFF050505FF2B2B2B2B2B2B2B2B2B2B2B2BFF" $"FF2BFC2A2A2A2A2A2A2A2A2AFFFF0505FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00" $"FF2BFC2A2A2A2A2A2A2A2A2AFF0505FF0000FF2BF7F8F9FAFAFBFBFCFCFDFF00" $"FF2BFC2A2A2A2A2A2A2A2AFF0505FF000000FFFFFFFFFFFFFFFFFFFFFFFFFF00" $"FF2BFC2A2A2A2A2A2A2AFF05FFFFFF0000000000000000000000000000000000" $"FF2BFC2A2A2A2A2A2AFF05FF002BFF0000000000000000000000000000000000" $"FF2BFC2A2A2A2A2A2AFFFF2A002BFF0000000000000000000000000000000000" $"FF2BFC2A2A2A2A2A2A2A2A2A002BFF0000000000000000000000000000000000" $"FF2BFC000000000000000000002BFF0000000000000000000000000000000000" $"FF2B2B2B2B2B2B2B2B2B2B2B2B2BFF0000000000000000000000000000000000" $"FF2B2B2B2B2B2B2B2B2B2B2B2B2BFF0000000000000000000000000000000000" $"FF2BE3E32B2B2B2BFFFFFFFFFF2BFF0000000000000000000000000000000000" $"FF2BD8D82B2B2B2B2B2B2B2B2B2BFF0000000000000000000000000000000000" $"FF2B2B2B2B2B2B2B2B2B2B2B2B2BFF0000000000000000000000000000000000" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000" $"00FF2BF7F8F9FAFAFBFBFCFCFDFF000000000000000000000000000000000000" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" }; resource 'ics#' (128, purgeable) { { /* array: 2 elements */ /* [1] */ $"00FF 0081 00BD 00A5 00A5 00BD FF81 818D" $"BD81 A57E A500 BD00 8100 8D00 8100 7E", /* [2] */ $"00FF 00FF 00FF 00FF 00FF 00FF FFFF FFFF" $"FFFF FF7E FF00 FF00 FF00 FF00 FF00 7E" } }; /* Known hosts icon */ resource 'ICN#' (130, purgeable) { { /* array: 2 elements */ /* [1] */ $"1FFFFC00 10000600 10000500 1FFFFC80" $"10000440 10000420 1FFFFFF0 10000010" $"13FC0F90 1C03F0F0 15FA8090 150A8090" $"1D0B80F0 150A8050 15FA8050 1C038070" $"143A8050 14028050 1FFFABF0 12048110" $"13FCFF10 1AAAAAB0 10000010 17FFFFD0" $"14000050 15252250 15555550 15252250" $"14000050 17FFFFD0 10000010 1FFFFFF0", /* [2] */ $"1FFFFC00 1FFFFE00 1FFFFF00 1FFFFF80" $"1FFFFFC0 1FFFFFE0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" } }; resource 'icl4' (130, purgeable) { $"000FFFFFFFFFFFFFFFFFFF0000000000" $"000F00000000000000000FF000000000" $"000F00000000000000000FCF00000000" $"000FFFFFFFFFFFFFFFFFFFCCF0000000" $"000F00000000000000000FCCCF000000" $"000F00000000000000000FCCCCF00000" $"000FFFFFFFFFFFFFFFFFFFFFFFFF0000" $"000F00000000000000000000000F0000" $"000F00FFFFFFFF000000FFFFF00F0000" $"000FFFCCCCCCCCFFFFFFCCCCFFFF0000" $"000F0FCEEEEECCF0FCCCCCCCF00F0000" $"000F0FCE0D0D0CF0FCCCCCCCF00F0000" $"000FFFCED0D0CCFFFCCCCCCCFFFF0000" $"000F0FCE0D0D0CF0FCCCCCCCCF0F0000" $"000F0FCCC0C0CCF0FCCCCCCCCF0F0000" $"000FFFCCCCCCCCFFFCCCCCCCCFFF0000" $"000F0FCCCCFFFCF0FCCCCCCCCF0F0000" $"000F0FCCCCCCCCF0FCCCCCCCCF0F0000" $"000FFFFFFFFFFFFFFDDDDDDFFFFF0000" $"000F00FCCDDEEF00FDDDDDDF000F0000" $"000F00FFFFFFFF00FFFFFFFF000F0000" $"000F0C0C0C0C0C0C0C0C0C0C0C0F0000" $"000FC0C0C0C0C0C0C0C0C0C0C0CF0000" $"000F0FFFFFFFFFFFFFFFFFFFFF0F0000" $"000FCF0000000000000000000FCF0000" $"000F0F0F00F00F0F00F000F00F0F0000" $"000FCF0F0F0F0F0F0F0F0F0F0FCF0000" $"000F0F0F00F00F0F00F000F00F0F0000" $"000FCF0000000000000000000FCF0000" $"000F0FFFFFFFFFFFFFFFFFFFFF0F0000" $"000FC0C0C0C0C0C0C0C0C0C0C0CF0000" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" }; resource 'icl8' (130, purgeable) { $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000" $"000000FF0000000000000000000000000000000000FFFF000000000000000000" $"000000FF0000000000000000000000000000000000FFF6FF0000000000000000" $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6FF00000000000000" $"000000FF0000000000000000000000000000000000FFF6F6F6FF000000000000" $"000000FF0000000000000000000000000000000000FFF6F6F6F6FF0000000000" $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000" $"000000FF0000000000000000000000000000000000000000000000FF00000000" $"000000FF0000FFFFFFFFFFFFFFFF000000000000FFFFFFFFFF0000FF00000000" $"000000FFFFFF2B2B2B2B2B2B2B2BFFFFFFFFFFFF2B2B2B2BFFFFFFFF00000000" $"000000FF00FF2BFCFCFCFCFCF82BFF00FF2B2B2B2B2B2B2BFF0000FF00000000" $"000000FF00FF2BFC2A2A2A2A002BFF00FF2B2B2B2B2B2B2BFF0000FF00000000" $"000000FFFFFF2BFC2A2A2A2A002BFFFFFF2B2B2B2B2B2B2BFFFFFFFF00000000" $"000000FF00FF2BFC2A2A2A2A002BFF00FF2B2B2B2B2B2B2B2BFF00FF00000000" $"000000FF00FF2BF800000000002BFF00FF2B2B2B2B2B2B2B2BFF00FF00000000" $"000000FFFFFF2B2B2B2B2B2B2B2BFFFFFF2B2B2B2B2B2B2B2BFFFFFF00000000" $"000000FF00FF2B2B2B2BFFFFFF2BFF00FF2B2B2B2B2B2B2B2BFF00FF00000000" $"000000FF00FF2B2B2B2B2B2B2B2BFF00FF2B2B2B2B2B2B2B2BFF00FF00000000" $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F9F9F9FFFFFFFFFF00000000" $"000000FF0000FFF7F8F9FAFBFCFF0000FFF9F9F9F9F9F9FF000000FF00000000" $"000000FF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000000FF00000000" $"000000FFF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FF00000000" $"000000FFF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FF00000000" $"000000FFF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FF00000000" $"000000FFF5FF00000000000000000000000000000000000000FFF5FF00000000" $"000000FFF5FF00FF0000FF0000FF00FF0000FF000000FF0000FFF5FF00000000" $"000000FFF5FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FFF5FF00000000" $"000000FFF5FF00FF0000FF0000FF00FF0000FF000000FF0000FFF5FF00000000" $"000000FFF5FF00000000000000000000000000000000000000FFF5FF00000000" $"000000FFF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FF00000000" $"000000FFF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FF00000000" $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }; /* * Internal resources */ /* Menu bar */ resource 'MBAR' (MBAR_Main, preload) { { mApple, mFile, mEdit } }; resource 'MENU' (mApple, preload) { mApple, textMenuProc, 0b11111111111111111111111111111101, enabled, apple, { "About PuTTY", noicon, nokey, nomark, plain, "-", noicon, nokey, nomark, plain, } }; resource 'MENU' (mFile, preload) { mFile, textMenuProc, 0b11111111111111111111111111111011, enabled, "File", { "New Session", noicon, "N", nomark, plain, "Close", noicon, "W", nomark, plain, "-", noicon, nokey, nomark, plain, "Quit", noicon, "Q", nomark, plain, } }; resource 'MENU' (mEdit, preload) { mEdit, textMenuProc, 0b11111111111111111111111111111101, enabled, "Edit", { "Undo", noicon, "Z", nomark, plain, "-", noicon, nokey, nomark, plain, "Cut", noicon, "X", nomark, plain, "Copy", noicon, "C", nomark, plain, "Paste", noicon, "V", nomark, plain, "Clear", noicon, nokey, nomark, plain, "Select All", noicon, "A", nomark, plain, } }; /* Fatal error box. Stolen from the Finder. */ resource 'ALRT' (wFatal, "fatalbox", purgeable) { {54, 67, 152, 435}, wFatal, beepStages, alertPositionMainScreen }; resource 'DITL' (wFatal, "fatalbox", purgeable) { { /* array DITLarray: 3 elements */ /* [1] */ {68, 299, 88, 358}, Button { enabled, "OK" }, /* [2] */ {68, 227, 88, 286}, StaticText { disabled, "" }, /* [3] */ {7, 74, 55, 358}, StaticText { disabled, "^0" } } }; /* Terminal window */ resource 'WIND' (wTerminal, "terminal", purgeable) { { 0, 0, 200, 200 }, zoomDocProc, invisible, goAway, 0x0, "untitled", staggerParentWindowScreen }; resource 'CNTL' (cVScroll, "vscroll", purgeable) { { 0, 0, 48, 16 }, 0, invisible, 0, 0, scrollBarProc, 0, "" }; /* "About" box */ resource 'DLOG' (wAbout, "about", purgeable) { { 0, 0, 120, 240 }, noGrowDocProc, invisible, goAway, wAbout, /* RefCon -- identifies the window to PuTTY */ wAbout, /* DITL ID */ "About PuTTY", alertPositionMainScreen }; resource 'dlgx' (wAbout, "about", purgeable) { versionZero { kDialogFlagsUseThemeBackground | kDialogFlagsUseThemeControls } }; resource 'DITL' (wAbout, "about", purgeable) { { { 87, 13, 107, 227 }, Button { enabled, "View Licence" }, { 13, 13, 29, 227 }, StaticText { disabled, "PuTTY"}, { 42, 13, 74, 227 }, StaticText { disabled, "Some version or other\n" "Copyright 1997-9 Simon Tatham"}, } }; /* Licence box */ resource 'WIND' (wLicence, "licence", purgeable) { { 0, 0, 300, 300 }, noGrowDocProc, visible, goAway, wLicence, "PuTTY Licence", alertPositionParentWindowScreen }; type 'TEXT' { string; }; resource 'TEXT' (wLicence, "licence", purgeable) { "PuTTY is copyright 1997-2001 Simon Tatham.\n" "\n" "Portions copyright Robert de Bath, Joris van Rantwijk, Delian\n" "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry,\n" "Justin Bradford, and CORE SDI S.A.\n" "\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy of this software and associated documentation " "files (the \"Software\"), to deal in the Software without " "restriction, including without limitation the rights to use, " "copy, modify, merge, publish, distribute, sublicense, and/or " "sell copies of the Software, and to permit persons to whom the " "Software is furnished to do so, subject to the following " "conditions:\n\n" "The above copyright notice and this permission notice shall be " "included in all copies or substantial portions of the Software.\n\n" "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, " "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF " "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND " "NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR " "ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF " "CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN " "CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE " "SOFTWARE." }; read 'pTST' (128, "test data", purgeable) "fragment"; type 'pMAP' { hex string; }; resource 'pMAP' (128, "Latin-1 G1 -> Mac OS Roman") { $"20 c1 a2 a3 db b4 00 a4 ac a9 bb c7 c2 00 a8 f8" $"a1 b1 00 00 ab b5 a6 e1 fc 00 bc c8 00 00 00 c0" $"cb e7 e5 cc 80 81 ae 82 e9 83 e6 e8 ed ea eb ec" $"00 84 f1 ee ef cd 85 00 af f4 f2 f3 86 00 00 a7" $"88 87 89 8b 8a 8c be 8d 8f 8e 90 91 93 92 94 95" $"00 96 98 97 99 9b 9a d6 bf 9d 9c 9e 9f 00 00 D8" }; resource 'pMAP' (129, "DEC line drawing -> Mac OS VT100") { $"d7 bd 09 0c 0d 0a a1 b1 00 0b d2 d3 d4 d5 da e2" $"e3 e4 f5 f6 f7 f8 f9 fa fb b2 b3 b9 ad a3 e1" }; Revision-number: 2228 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2002-11-19T12:29:45.000000Z K 7 svn:log V 34 A couple of useful test backends. K 10 svn:author V 3 ben PROPS-END Node-path: putty/testback.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3752 Text-content-md5: 4de8aa9f30f0e21582af6da07f1e7a08 Text-content-sha1: cdec02d5fbe3d54e5439f63b68b7bf25e3504471 Content-length: 3868 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.2 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN/* $Id: testback.c,v 1.2 2002/11/19 12:29:45 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* PuTTY test backends */ #include #include #include "putty.h" static char *null_init(void *, void **, char *, int, char **, int); static char *loop_init(void *, void **, char *, int, char **, int); static int null_send(void *, char *, int); static int loop_send(void *, char *, int); static int null_sendbuffer(void *); static void null_size(void *, int, int); static void null_special(void *, Telnet_Special); static Socket null_socket(void *); static int null_exitcode(void *); static int null_sendok(void *); static int null_ldisc(void *, int); static void null_provide_ldisc(void *, void *); static void null_provide_logctx(void *, void *); static void null_unthrottle(void *, int); Backend null_backend = { null_init, null_send, null_sendbuffer, null_size, null_special, null_socket, null_exitcode, null_sendok, null_ldisc, null_provide_ldisc, null_provide_logctx, null_unthrottle, 0 }; Backend loop_backend = { loop_init, loop_send, null_sendbuffer, null_size, null_special, null_socket, null_exitcode, null_sendok, null_ldisc, null_provide_ldisc, null_provide_logctx, null_unthrottle, 0 }; struct loop_state { Terminal *term; }; static char *null_init(void *frontend_handle, void **backend_handle, char *host, int port, char **realhost, int nodelay) { return NULL; } static char *loop_init(void *frontend_handle, void **backend_handle, char *host, int port, char **realhost, int nodelay) { struct loop_state *st = smalloc(sizeof(*st)); st->term = frontend_handle; return (char *)st; } static int null_send(void *handle, char *buf, int len) { return 0; } static int loop_send(void *handle, char *buf, int len) { struct loop_state *st = handle; return from_backend(st->term, 0, buf, len); } static int null_sendbuffer(void *handle) { return 0; } static void null_size(void *handle, int width, int height) { } static void null_special(void *handle, Telnet_Special code) { } static Socket null_socket(void *handle) { return NULL; } static int null_exitcode(void *handle) { return 0; } static int null_sendok(void *handle) { return 1; } static void null_unthrottle(void *handle, int backlog) { } static int null_ldisc(void *handle, int option) { return 0; } static void null_provide_ldisc (void *handle, void *ldisc) { } static void null_provide_logctx(void *handle, void *logctx) { } /* * Emacs magic: * Local Variables: * c-file-style: "simon" * End: */ Revision-number: 2229 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2002-11-19T19:36:14.000000Z K 7 svn:log V 54 Add mac/ to include paths after discussion with bjh21 K 10 svn:author V 5 jacob PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a354cdca6adbe1331c2bca67a1d8d65 Text-delta-base-sha1: 0a1dd7c3a8fd1aedaf0fa2d184925ef40b84a9a2 Text-content-length: 29 Text-content-md5: d5f5126e27c9ed9d2125367f03bd39b3 Text-content-sha1: 0d083aa263393b7f49c36a781295b568d19a8099 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN# w&u, "mac Revision-number: 2230 Prop-content-length: 208 Content-length: 208 K 8 svn:date V 27 2002-11-19T22:05:48.000000Z K 7 svn:log V 109 Pass co-ordinates to term_paint() in characters rather than pixels. Partial redraws now work rather better. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7c1fdc5fb0d71fcb75338d0467447dbd Text-delta-base-sha1: aea5e4a40546b97e7ba1613bd4aec9a950616374 Text-content-length: 256 Text-content-md5: f24d6105c47049c5029aeda2a39906f3 Text-content-sha1: 5b19e0a74bb169d9f35d5cfa3beb1f156934ca54 Content-length: 295 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN%Ac+8WN/* $Id: macterm.c,v 1.2 2002/11/19 22:05:48PTOCC((*window->visRgn)->rgnBBox.left), PTOCR((*window->visRgn)->rgnBBox.top), PTOCC((*window->visRgn)->rgnBBox.right), PTOCR((*window->visRgn)->rgnBBox.bottom) Revision-number: 2231 Prop-content-length: 210 Content-length: 210 K 8 svn:date V 27 2002-11-19T23:59:27.000000Z K 7 svn:log V 111 Remove CURSOR_FG_BOLD and CURSOR_BG_BOLD, and hence bring reality in line with palette_reset()'s expectations. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f24d6105c47049c5029aeda2a39906f3 Text-delta-base-sha1: 5b19e0a74bb169d9f35d5cfa3beb1f156934ca54 Text-content-length: 186 Text-content-md5: 20f0c5013354e45416f2ffbc048ebe47 Text-content-sha1: 782b35c940430b5dcae00e0c7aedec2c42842532 Content-length: 225 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNAu3zD+}(|+lA#Gm=/* $Id: macterm.c,v 1.3 2002/11/19 23:59:27BG 21 SetPort(s->window); do_text(ctx, x, y, text, len, attr, lattr);1= Revision-number: 2232 Prop-content-length: 207 Content-length: 207 K 7 svn:log V 108 Remove has_focus from Session and use the one in Terminal. Active vs passive cursor now behaves correctly. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-20T00:11:05.000000Z PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 670dd4dec4f697e0c59d6cfe766dbb98 Text-delta-base-sha1: 1680a8de0596901f95ad1cb89fcd67986f8195e1 Text-content-length: 20 Text-content-md5: c80780769680677504dbfadd2a6af5db Text-content-sha1: 7685d03935911db00d539ff46bbfe2b26af22824 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN 5TH Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 20f0c5013354e45416f2ffbc048ebe47 Text-delta-base-sha1: 782b35c940430b5dcae00e0c7aedec2c42842532 Text-content-length: 73 Text-content-md5: e2ea71b6e4bd15e09975b09a1aae01b3 Text-content-sha1: 6ae6c0ef13e2f890bf3fa7de83b833459a6198da Content-length: 112 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNu{ /l+`/* $Id: macterm.c,v 1.4 2002/11/20 00:11:05term Revision-number: 2233 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2002-11-20T00:33:44.000000Z K 7 svn:log V 78 Fiddle with mac_initpalette() so that the cursor works in 2bpp modes as well. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e2ea71b6e4bd15e09975b09a1aae01b3 Text-delta-base-sha1: 6ae6c0ef13e2f890bf3fa7de83b833459a6198da Text-content-length: 155 Text-content-md5: 2664814f45c7120e4a7e6e19b069b876 Text-content-sha1: 98edfc4d300b90e737d55af983e45ccd3e70b8f3 Content-length: 194 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN{s{N+OP$W/* $Id: macterm.c,v 1.5 2002/11/20 00:33:44( pmTolerant | pmInhibitC2 | \ pmInhibitG2 | pmInhibitG4 | pmInhibitG8 )B Revision-number: 2234 Prop-content-length: 207 Content-length: 207 K 7 svn:log V 106 Largely-placeholder man page for Plink, for the sake of not irritating `make install'. Thanks RJK, again. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-11-20T19:49:59.000000Z PROPS-END Node-path: putty/unix/plink.1 Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1597 Text-content-md5: b2748b6e369dca583d6953e26aa673e6 Text-content-sha1: 6e6e0b08acc134ab3e57e6b134b74402ff5f98a6 Content-length: 1713 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN///.TH plink 1 .SH NAME plink \- mumble .SH SYNOPSIS \fBplink\fR [\fIoptions\fR] [\fIuser\fB@\fR]\fIhost\fR [\fIcommand\fR] .SH DESCRIPTION \fBplink\fR is a network connection tool supporting several protocols. .SH OPTIONS The command-line options supported by \fIplink\fP are: .IP "\fB-v\fR" Show verbose messages. .IP "\fB-load\fR \fIsession\fR" Load settings from saved session. .IP "\fB-ssh\fR" Force use of SSH protocol (default). .IP "\fB-telnet\fR" Force use of Telnet protocol. .IP "\fB-rlogin\fR" Force use of rlogin protocol. .IP "\fB-raw\fR" Force raw mode. .IP "\fB-P\fR \fIport\fR" Connect to port \fIport\fR. .IP "\fB-l\fR \fIuser\fR" Set remote username to \fIuser\fR. .IP "\fB-m\fR \fIpath\fR" Read remote command(s) from file \fIpath\fR. .IP "\fB-batch\fR" Disable interactive prompts. .IP "\fB-pw\fR \fIpassword\fR" Set remote password to \fIpassword\fR. .IP "\fB-L\fR \fIlisten\fB:\fIhost\fB:\fIport\fR" Forward the local port to a remote address. .IP "\fB-L\fR \fIlisten\fB:\fIhost\fB:\fIport\fR" Forward the a remote port to a local address. .IP "\fB-X\fR" Enable X11 forwarding. .IP "\fB-x\fR" Disable X11 forwarding (default). .IP "\fB-A\fR" Enable agent forwarding. .IP "\fB-x\fR" Disable agent forwarding. .IP "\fB-T\fR" Enable pty allocation (default if a command is NOT specified). .IP "\fB-t\fR" Disable pty allocation (default if a command is specified). .IP "\fB-1\fR" Force use of SSH protocol version 1. .IP "\fB-2\fR" Force use of SSH protocol version 2. .IP "\fB-C\fR" Enable compression. .IP "\fB-i\fR \fIpath\fR" Private key file for authentication. Revision-number: 2235 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2002-11-20T19:56:10.000000Z K 7 svn:log V 69 Interchange two parameters in a printf, to prevent a silly segfault. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3636fd892bf8b0e39de6322cbf24c689 Text-delta-base-sha1: da8ac6dffdd6f55e5147d7f831a927e7dbb7f0b4 Text-content-length: 54 Text-content-md5: 0d283138079afab8b2a49bf39fba8754 Text-content-sha1: 027326959142a2292d0141a45bf9fdbbe6ef66a0 Content-length: 95 K 15 cvs2svn:cvs-rev V 5 1.244 PROPS-END SVN %O1&nowlen, msglll Revision-number: 2236 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2002-11-20T20:09:02.000000Z K 7 svn:log V 61 Fixes for more robust handling of command-line parse errors. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2482df503923a392290f5bebf02d8d5d Text-delta-base-sha1: d769cb28fde70bab9440aeb8a7a7d7568f589edf Text-content-length: 173 Text-content-md5: 597d9fd348fe393d99217082085243bc Text-content-sha1: 48d0974350b4d88ba8d779912b3b99f0aac9089b Content-length: 213 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNz#}\@Zg xH d int errorserrors = 0 errors = 1 else { fprintf(stderr, "plink: unknown option \"%s\"\n", p); errorserrors) return 1; Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5f7ed1c22f29f1ad6afe4ecd65e27799 Text-delta-base-sha1: 7b60f36e0d40e9f1176bd82d745b0f5b0ba9fa4d Text-content-length: 264 Text-content-md5: 1b3779619795fef0c5e44a29a991029e Text-content-sha1: 9ced94da0904fded054c6be91fe638c27b3f1da1 Content-length: 304 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNzr#Wm fMH1tkftp: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fprintf(stderr, "\n try typing \"psftp -h\" for help\n" int errors = 0errors = 0;cmdline_error("unknown option \"%s\"", argv[i] Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aec6212d6015013fab84012feecd4722 Text-delta-base-sha1: 0b9b7102aa0653fda8b60a8a4563e4d9870d8970 Text-content-length: 150 Text-content-md5: b06d5798db625f6a794e007e688b757e Text-content-sha1: 124d1393d9cb9a31b1b072d75c1ea90b6655f5b0 Content-length: 190 K 15 cvs2svn:cvs-rev V 4 1.96 PROPS-END SVN6vn~* rintf(stderr, "\n try typing just \"pscp\" for help\n" { cmdline_error("unknown option \"%s\"", argv[i]); } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c24637cdeb48f1dcbda457b35482e885 Text-delta-base-sha1: 85f781c757b3b74f13d1eb9b13e11a71f2e5322b Text-content-length: 390 Text-content-md5: e39e98b09ab897814af382a38fec009e Text-content-sha1: a371bfe57997be3f2bdf7ad7b86aa6eed67ce644 Content-length: 429 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNv($V~QxgC\'%;@qint errorserrors = 0 errors = 1 { fprintf(stderr, "plink: option \"-o\" requires an argument\n"); errors = 1; } else { --argc; provide_xrm_string(*++argv); } } else { fprintf(stderr, "plink: unknown option \"%s\"\n", p); errors = 1errors) return 1; Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 33dc5ef37aaeb58145a6dca27d55b671 Text-delta-base-sha1: 8098a61ed7cd9862774cbff3928ea689f99383ea Text-content-length: 154 Text-content-md5: c27aa67a028494157989f23eebae4a2e Text-content-sha1: c9f882f7605a0913149a065d913829fa0931bdd0 Content-length: 195 K 15 cvs2svn:cvs-rev V 5 1.217 PROPS-END SVN 8A else { cmdline_error("unknown option \"%s\"", p);B~<Bwnd, SB_VERT, &si, TRUE); } Context get_ctx(void *frontend) Revision-number: 2237 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2002-11-20T20:32:03.000000Z K 7 svn:log V 45 I think this is definitely a wanted feature. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy-lookup Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cddb12d7077b795fd3d72ac7d5a15525 Text-delta-base-sha1: 0dcfa77ec62f39808a683f365825e48d6bb92322 Text-content-length: 25 Text-content-md5: ed324b26b8666587b2cbcffc89d4211b Text-content-sha1: dc58fe46055735abaa0fefeadbf4abeda77e4e25 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNQTUyXmedium Revision-number: 2238 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 52 Note that default will change to SSH-2 next release K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-11-21T00:15:52.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f2d14bfdd9bb461e6976aa2aa122106e Text-delta-base-sha1: 07dedb5b7feafe6b7888592cdcaacf0eb6704d67 Text-content-length: 232 Text-content-md5: a8505921bcd64ad61010bfbf54ee408c Text-content-sha1: 07386e2b7607dbae584578f815c2b9ba90b22d14 Content-length: 272 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN{L48l\versionid $Id: faq.but,v 1.38 2002/11/21 00:15:52 jacob (The factory default will \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/ssh2-default.html}{change to v2} in the next full release.) Revision-number: 2239 Prop-content-length: 133 Content-length: 133 K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-22T00:07:31.000000Z K 7 svn:log V 35 Update the status of the Mac port. PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a8505921bcd64ad61010bfbf54ee408c Text-delta-base-sha1: 07386e2b7607dbae584578f815c2b9ba90b22d14 Text-content-length: 383 Text-content-md5: ef4b5e39f57095ecdbcec7a132a6f502 Text-content-sha1: 491d17a93231aa5e81264fa1699aa1349ee5f590 Content-length: 423 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNV!8YY]{hBIF\versionid $Id: faq.but,v 1.39 2002/11/22 00:07:31 ben partial ports to Unix (see \k{faq-unix}) and the Mac OS (see \k{faq-mac-port}). are under wayEventually. The terminal emulation code has been ported, as has the saved-settings infrastructure, but networking and a configuration GUI still need to be done before the port will be of any us Revision-number: 2240 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 58 Note about CTRL-C trick for copying text of error dialogs K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-11-23T11:22:57.000000Z PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f253d7075234e9d86d683b0907fb6bc1 Text-delta-base-sha1: 633b9a063ef21d293c5a0b2d1f87b56893948ac7 Text-content-length: 218 Text-content-md5: 2032f6221c2b02a2bffff6588cb94213 Text-content-sha1: 00ef930c1f16454783694a787366e4a88122f0b8 Content-length: 257 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN ?<Y=\versionid $Id: feedback.but,v 1.9 2002/11/23 11:22:57 jacob(On some versions of Windows, pressing Ctrl-C when the error box is displayed will copy the text of the message to the clipboard.) Revision-number: 2241 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2002-11-23T11:35:36.000000Z K 7 svn:log V 88 Oops, actually bump priority rather than difficulty :-) Also document some workarounds. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy-lookup Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ed324b26b8666587b2cbcffc89d4211b Text-delta-base-sha1: dc58fe46055735abaa0fefeadbf4abeda77e4e25 Text-content-length: 168 Text-content-md5: 117b5782a16009c470a32a4dcd1cb278 Text-content-sha1: ffe27119e1db4e89fc1d7db16c568bd3e9734a24 Content-length: 207 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNTP Ey[|medium Difficulty: fun

    Workarounds:

    • Type IP address into hostname box
    • Hack the telnet proxy type to send the HTTP commands?
    Revision-number: 2242 Prop-content-length: 754 Content-length: 754 K 8 svn:date V 27 2002-11-23T13:07:29.000000Z K 7 svn:log V 655 Bring in some of my scroll-optimisation stuff from the old Mac port. This introduces a new front-end function, do_scroll(), which is expected to scroll a part of the physical display and cause repaint events for any areas that couldn't be scrolled (e.g. because they were hidden). scroll_display() is a wrapper around this which also updates disptext to match. Currently, scroll_display is only used in response to user scrollback requests (via term_scroll()), but extending scroll() to use it as well should be easy. All of this is conditional on the front end's defining OPTIMISE_SCROLL, since only the Mac front end currently implements do_scroll(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 157f2dc610bbedf1098e6fdb9effebbd Text-delta-base-sha1: fbdcd6fc890c911232dfc8fef0b30933b1a0aab4 Text-content-length: 43 Text-content-md5: 19489d93307546f3c850fd22945a916e Text-content-sha1: eb3ff2d91b4f21f5a8c8610d2f303a86cb3704ce Content-length: 82 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN.G CmA#define OPTIMISE_SCROLL Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 57738e41a70a3fb27d2c3cdeb87902f6 Text-delta-base-sha1: a6540529aa1c3289ebd792c771437b3595e08a90 Text-content-length: 92 Text-content-md5: 991a24da95b54aec1864dd9e1d0dd938 Text-content-sha1: e0c9c431402fd19329ec6f15556ecef8a3aac930 Content-length: 133 K 15 cvs2svn:cvs-rev V 5 1.167 PROPS-END SVNt9 D>D7=#ifdef OPTIMISE_SCROLL void do_scroll(void *, int, int, int); #endif Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cf51b5cc3cdbd0d27316fe54e0bf2311 Text-delta-base-sha1: 245a47d1c0196373820e99c8bea2a2c067b7e5a8 Text-content-length: 2513 Text-content-md5: 69f8a751625f79bd9cdb50d191609791 Text-content-sha1: cd8e4b1741c33fb070532898986d93cc12d7e0e5 Content-length: 2554 K 15 cvs2svn:cvs-rev V 5 1.118 PROPS-END SVN'C:j92UfL\A'#ifdef OPTIMISE_SCROLL static void scroll_display(Terminal *, int, int, int); #endif /* OPTIMISE_SCROLL */#ifdef OPTIMISE_SCROLL /* * Scroll the physical display, and our conception of it in disptext. */ static void scroll_display(Terminal *term, int topline, int botline, int lines) { unsigned long *start, *end; int distance, size, i; start = term->disptext + topline * (term->cols + 1); end = term->disptext + (botline + 1) * (term->cols + 1); distance = (lines > 0 ? lines : -lines) * (term->cols + 1); size = end - start - distance; if (lines > 0) { memmove(start, start + distance, size * TSIZE); for (i = 0; i < distance; i++) (start + size)[i] |= ATTR_INVALID; } else { memmove(start + distance, start, size * TSIZE); for (i = 0; i < distance; i++) start[i] |= ATTR_INVALID; } do_scroll(term->frontend, topline, botline, lines); } #endif /* OPTIMISE_SCROLL */#ifdef OPTIMISE_SCROLL int olddisptop = term->disptop; int shift; #endif /* OPTIMISE_SCROLL */#ifdef OPTIMISE_SCROLL shift = (term->disptop - olddisptop); if (shift < term->rows && shift > -term->rows) scroll_display(term, 0, term->rows - 1, shift); #endif /* OPTIMISE_SCROLL */&nHH&selanchor and selpoint: the * four corners of the selection. */ if (2*selpoint.x < term->selstart.x + term->selend.x) term->selanchor.x = term->selend.x-1; else term->selanchor.x = term->selstart.x; if (2*selpoint.y < term->selstart.y + term->selend.y) term->selanchor.y = term->selend.y; else term->selanchor.y = term->selstart.y; } term->selstate = DRAGGING; } if (term->selstate != ABOUT_TO && term->selstate != DRAGGING) term->selanchor = selpoint; term->selstate = DRAGGING; if (term->seltype == LEXICOGRAPHIC) { /* * For normal selection, we set (selstart,selend) to * (selpoint,selanchor) in some order. */ if (poslt(selpoint, term->selanchor)) { term->selstart = selpoint; term->selend = term->selanchor; incpos(term->selend); } else { term->selstart = term->selanchor; term->selend = selpoint; incpos(term->selend); } } else { /* * For rectangular selection, we may need to * interchange x and y coordinates (if the user has * dragged in the -x and +y directions, or vice versa). */ term->selstart.x = min(term->selanchor.x, selpoint.x); term->selend.x = 1+max(term-> Revision-number: 2243 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2002-11-23T13:16:36.000000Z K 7 svn:log V 27 Remove a debugging printf. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2664814f45c7120e4a7e6e19b069b876 Text-delta-base-sha1: 98edfc4d300b90e737d55af983e45ccd3e70b8f3 Text-content-length: 68 Text-content-md5: c2393662db780365583d1201314ad7ed Text-content-sha1: 4f66620e941f6f74f94b8b38187973a76921e974 Content-length: 107 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNs ++_/* $Id: macterm.c,v 1.6 2002/11/23 13:16:36 Revision-number: 2244 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2002-11-23T13:55:57.000000Z K 7 svn:log V 60 Add hypothesis that localhost connections are being proxy'd K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/x11-proxy-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fe1b21ca87b5c8a06b1988a013f040e8 Text-delta-base-sha1: 34804a7bb87e3c20f5e5f21774be5038e8c200c0 Text-content-length: 188 Text-content-md5: 749da473f2ec1d750d14a2c99918b0b0 Text-content-sha1: afbb8bb1951a5f875e78c68d823e2823c1131d46 Content-length: 227 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN>g)>)

    One hypothesis we have is that proxying is too general and is being applied to the X connection. If so, adding `localhost' to the proxy exclusions should fix this. Revision-number: 2245 Prop-content-length: 300 Content-length: 300 K 7 svn:log V 201 On a keypress, hide the mouse cursor, send the key to the line discipline (rather than straight to the backend), and then prod the terminal. I think this is closer to the correct set of things to do. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-23T14:22:11.000000Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c2393662db780365583d1201314ad7ed Text-delta-base-sha1: 4f66620e941f6f74f94b8b38187973a76921e974 Text-content-length: 215 Text-content-md5: 40f89bb84bae2464407cc15f3af057b3 Text-content-sha1: 20f06146b872f8943ddc0cddcb3d50cf7007a4a0 Content-length: 254 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN;9+/* $Id: macterm.c,v 1.7 2002/11/23 14:22:11ldisc_send(s->ldisc, (char *)buf, len, 1); ObscureCursor(); term_seen_key_event(s->term); term_out(s->term); term_update(s->term Revision-number: 2246 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2002-11-23T15:11:13.000000Z K 7 svn:log V 104 We don't currently need the Thread Manager (and all being well we never will), so stop checking for it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dea712a64fffbb73244ac7e8b7b1cf73 Text-delta-base-sha1: 2f84e19c92e8b857abdae741669da1231b21f77b Text-content-length: 70 Text-content-md5: e8e27603b75d78066a74582a170b0758 Text-content-sha1: fa939cc9dd5869973dbe60744e3fb63412692595 Content-length: 109 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN#l'[''\Kga( Revision-number: 2247 Prop-content-length: 342 Content-length: 342 K 7 svn:log V 243 Only try to retrieve a 'vers' resource from the current resource file (the application), rather from the entire chain. This prevents us displaying the System version if PuTTY doesn't have one. Also cope with not finding any 'vers' resource. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-23T18:22:47.000000Z PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e8e27603b75d78066a74582a170b0758 Text-delta-base-sha1: fa939cc9dd5869973dbe60744e3fb63412692595 Text-content-length: 386 Text-content-md5: 497af2d50f189d8bf57ec8cdb03ad29c Text-content-sha1: d63fa5bd734104bb217704b4525f0b65cd652859 Content-length: 425 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNlM i'B^/* $Id: mac.c,v 1.3 2002/11/23 18:22:47vers = (VersRecHndl)Get1Resource('vers', 1); if (vers != NULL && *vers != NULL) { longvers = (*vers)->shortVersion + (*vers)->shortVersion[0] + 1; GetDialogItem(windows.about, wiAboutVersion, &itemtype, &item, &box); assert(itemtype & kStaticTextDialogItem); SetDialogItemText(item, longvers); } Revision-number: 2248 Prop-content-length: 274 Content-length: 274 K 8 svn:date V 27 2002-11-23T19:01:01.000000Z K 7 svn:log V 175 Add a "Config *" argument to term_init(), and use that instead of the global cfg throughout the terminal emulator. Not tested in PuTTY and pterm, but they just pass in &cfg. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 40f89bb84bae2464407cc15f3af057b3 Text-delta-base-sha1: 20f06146b872f8943ddc0cddcb3d50cf7007a4a0 Text-content-length: 76 Text-content-md5: b11d724c6ccb2877c134e060fc5fda97 Text-content-sha1: 38dcf8959be241862deeea4861d0e3eeb2ec3b16 Content-length: 115 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN 35*)_/* $Id: macterm.c,v 1.8 2002/11/23 19:01:0&s->cfg, Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 991a24da95b54aec1864dd9e1d0dd938 Text-delta-base-sha1: e0c9c431402fd19329ec6f15556ecef8a3aac930 Text-content-length: 39 Text-content-md5: 7fe679c2ef1887018f47a241816cbd69 Text-content-sha1: edfb9bd7c3582a15fe2e923a39cb6b72efafcf96 Content-length: 80 K 15 cvs2svn:cvs-rev V 5 1.168 PROPS-END SVN9; ZQhConfig *, void * Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 69f8a751625f79bd9cdb50d191609791 Text-delta-base-sha1: cd8e4b1741c33fb070532898986d93cc12d7e0e5 Text-content-length: 2192 Text-content-md5: fd725f7534fc09ba4067b8ff1b2a0194 Text-content-sha1: 0d59c1833e98a93d02154e9bb95159eac80aa16f Content-length: 2233 K 15 cvs2svn:cvs-rev V 5 1.119 PROPS-END SVN7; T&T~ 0;R^/C)]l[=edhmBYzA|bb'n5A9K~AMUUlFlP@X`hs~5rR2Hh~ j{c34{F'\Sm3"$wu/e((=C(s{term->cfg->term->cfg->term->cfg->app_cursor; term->app_keypad_keys = term->cfg->app_keypad; term->use_bce = term->cfg->bce; term->blink_is_real = term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->no_alt_screen) swap_screen(term, 0, FALSE, FALSE); if (term->cfg->term->cfg->term->cfg->Config *mycfg, cfg = mycfgterm->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->bellovl && !term->beep_overloaded && term->nbeeps >= term->cfg->term->cfg->bellovl || !term->beep_overloaded) { beep(term->frontend, term->cfg->beep); if (term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->no_remote_resize) request_resize(term->frontend, def(term->esc_args[2], term->cfg->width), def(term->esc_args[1], term->cfg->term->cfg->term->cfg->term->cfg->no_remote_resize) request_resize(term->frontend, def(term->esc_args[0], term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->term->cfg->no_mouse_rep && !(term->cfg->term->cfg->nTffn if (term->seltype == LEXICOGRAPHIC) { /* * For normal selection, we extend by moving * whichever end of the current selection is closer * to the mouse. */ if (posdiff(selpoint, term->selstart) < posdiff(term->selend, term->selstart) / 2) { term->selanchor = term->selend; decpos(term->selanchor); } else { term->selanchor = term->selstart; } } else { /* * For rectangular selection, we have a choice of * _four_ places to put Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6fe1f1a6c63dde36ea70aa691908dada Text-delta-base-sha1: 91b5639c1bad2ffceffa7952dcb419115d9ba707 Text-content-length: 36 Text-content-md5: aeee51dfc45dbe850e9d291905ffcfc1 Text-content-sha1: 46c9cbdc8da7fa8b8499c568853495543430cdf2 Content-length: 75 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN  BK@ Config *cfg Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e776896fd2f18f6ba419109367fe2f3d Text-delta-base-sha1: 201fcf78543315c87d9575b8aae8b13c05049393 Text-content-length: 31 Text-content-md5: ac934d49e0cf6a5096c81abafc4dab2e Text-content-sha1: f75c79d9f3861ed561c2c4d68343c769e94fd78b Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVN  t&cfg, Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c27aa67a028494157989f23eebae4a2e Text-delta-base-sha1: c9f882f7605a0913149a065d913829fa0931bdd0 Text-content-length: 50 Text-content-md5: 1f0f7614c0bd955b177f51c24838189d Text-content-sha1: c2d619219f0133ac97ab90054e1f239a0d04dbf0 Content-length: 91 K 15 cvs2svn:cvs-rev V 5 1.218 PROPS-END SVN yy&cfg, ~~Info(h Revision-number: 2249 Prop-content-length: 209 Content-length: 209 K 8 svn:date V 27 2002-11-23T19:58:55.000000Z K 7 svn:log V 110 Return the state information from loop_init() in the correct way. This means the backend actually works now. K 10 svn:author V 3 ben PROPS-END Node-path: putty/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4de8aa9f30f0e21582af6da07f1e7a08 Text-delta-base-sha1: cdec02d5fbe3d54e5439f63b68b7bf25e3504471 Text-content-length: 254 Text-content-md5: 7915c1e873dfd040d1d969aeac66ac58 Text-content-sha1: 0ce8bf6d1571bd3d992a825e2ae78a1260ff072b Content-length: 293 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN=_:+-vw#/* $Id: testback.c,v 1.3 2002/11/23 19:58:5*backend_handle = st; return NULL int i; fprintf(stderr, "%d chars: ", len); for (i = 0; i < len; i++) fprintf(stderr, " 0x%x", buf[i]); fprintf(stderr, "\n"); Revision-number: 2250 Prop-content-length: 292 Content-length: 292 K 7 svn:log V 193 Add a Config * argument to ldisc_create(), and use it in place of the global cfg throughout ldisc.c. Not tested other than on Mac, but all other ports just pass &cfg as this argument for now. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-23T20:02:38.000000Z PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f6b8dd1dd44bd3e20da36e02b8cdd5fa Text-delta-base-sha1: 1d6ecf11bf8aeb6a4567a2e6b3d028f19ee85a41 Text-content-length: 609 Text-content-md5: f4c19737785d111cffe826c7ece67da3 Text-content-sha1: ff9255a158e4527b50bbf8e75bc32e1ce7814304 Content-length: 649 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN|#W~kLU}E|Cutzidc6;:u{3Y2..Evv xldisc->cfg->localecho == LD_YES || \ (ldisc->cfg->localecholdisc->cfg->localedit == LD_YES || \ (ldisc->cfg->(char *)Config *mycfg, cfg = mycfg;ldisc->cfg->ldisc->cfg->ldisc->cfg->ldisc->cfg->protocol == PROT_TELNET && ldisc->cfg->ldisc->cfg->protocol == PROT_TELNET && len == 1) { switch (buf[0]) { case CTRL('M'): if (ldisc->cfg->protocol == PROT_TELNET && ldisc->cfg->break; case CTRL('?'): case CTRL('H'): if (ldisc->cfg->ldisc->cfg->ldisc->cfg-> Node-path: putty/ldisc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4713a582996d44f443f523763a40b075 Text-delta-base-sha1: 902c3873970637c6dbff53ea99d7cf34c1969014 Text-content-length: 32 Text-content-md5: 358bcb5060ef588974307c0204a31749 Text-content-sha1: 3664752fd0bb7192584abbc75f0510b3b1be4751 Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNgx hbConfig *cfg Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b11d724c6ccb2877c134e060fc5fda97 Text-delta-base-sha1: 38dcf8959be241862deeea4861d0e3eeb2ec3b16 Text-content-length: 77 Text-content-md5: 5f69c08ecb2316e3c8786116163ae13f Text-content-sha1: 137e57355bffae43786e0b1e8119b9172d9c82c8 Content-length: 116 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN 4o+w/* $Id: macterm.c,v 1.9 2002/11/23 20:02:38&s->cfg, Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7fe679c2ef1887018f47a241816cbd69 Text-delta-base-sha1: edfb9bd7c3582a15fe2e923a39cb6b72efafcf96 Text-content-length: 35 Text-content-md5: 91abcf7072b8537ef20fff4852c395fd Text-content-sha1: eb36a5e29adcde749620164828724218f5d858c8 Content-length: 76 K 15 cvs2svn:cvs-rev V 5 1.169 PROPS-END SVN;E #Config *, Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ac934d49e0cf6a5096c81abafc4dab2e Text-delta-base-sha1: f75c79d9f3861ed561c2c4d68343c769e94fd78b Text-content-length: 46 Text-content-md5: 3f5551ce80f0221edf457fa20e945899 Text-content-sha1: a0f0403a07c48f61f11ff1d70ef1a5d184cfeacb Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVN I9W ldisc_create(&cfg, Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e39e98b09ab897814af382a38fec009e Text-delta-base-sha1: a371bfe57997be3f2bdf7ad7b86aa6eed67ce644 Text-content-length: 27 Text-content-md5: 22dfc2541d077617809a4eb6bd696c7e Text-content-sha1: 7ed4d202f65639ea21f25b2b291923692cb06583 Content-length: 66 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN(. 4t4&cfg, Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1f0f7614c0bd955b177f51c24838189d Text-delta-base-sha1: c2d619219f0133ac97ab90054e1f239a0d04dbf0 Text-content-length: 52 Text-content-md5: d632e09759a1f5c6405049d93e0e1f30 Text-content-sha1: 6df7d681be01fe2836102559d1b645b26005edcd Content-length: 93 K 15 cvs2svn:cvs-rev V 5 1.219 PROPS-END SVN \&cfg,  Scroll Revision-number: 2251 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 32 Remove stray debugging printfs. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-23T20:40:22.000000Z PROPS-END Node-path: putty/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7915c1e873dfd040d1d969aeac66ac58 Text-delta-base-sha1: 0ce8bf6d1571bd3d992a825e2ae78a1260ff072b Text-content-length: 65 Text-content-md5: b63f6af778559cfbea510d712d66f461 Text-content-sha1: d7c8c2dd6d34032efa6fe955ca5ce4719ff5126c Content-length: 104 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN=. , ,wF/* $Id: testback.c,v 1.4 2002/11/23 20:40:22 Revision-number: 2252 Prop-content-length: 500 Content-length: 500 K 7 svn:log V 401 Fix a bug in scroll_display(): when the scrolled region contains the cursor we need to update dispcurs as well as disptext. Add scroll optimisation to scroll(). This makes it rather obvious that scroll optimisation is breaking with PuTTY's usual policy of lazy updates, since scrolling is done eagerly. Fixing this so that all the scrolling is saved up for do_paint would be nice, but non-trivial. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-23T21:42:46.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fd725f7534fc09ba4067b8ff1b2a0194 Text-delta-base-sha1: 0d59c1833e98a93d02154e9bb95159eac80aa16f Text-content-length: 1120 Text-content-md5: dc902bff8015b753a5a46d3034c39429 Text-content-sha1: 5dfd5522f1cdfd546cd39e3fa265e8ad7bc916ff Content-length: 1161 K 15 cvs2svn:cvs-rev V 5 1.120 PROPS-END SVN((O3 M?y R^7X, olddisptop, shift; if (topline != 0 || term->alt_which != 0) sb = FALSE; olddisptop = term->disptop; shift = lines;#ifdef OPTIMISE_SCROLL shift += term->disptop - olddisptop; if (shift < term->rows && shift > -term->rows && shift != 0) scroll_display(term, topline, botline, shift); #endif /* OPTIMISE_SCROLL */if (term->dispcurs >= start + distance && term->dispcurs <= start + distance + size) term->dispcurs -= distanceif (term->dispcurs >= start && term->dispcurs <= start + size) term->dispcurs += distanceTEqqT2CLK || a == MA_3CLK)) { deselect(term); term->selmode = (a == MA_2CLK ? SM_WORD : SM_LINE); term->selstate = DRAGGING; term->selstart = term->selanchor = selpoint; term->selend = term->selstart; incpos(term->selend); sel_spread(term); } else if ((b == MBT_SELECT && a == MA_DRAG) || (b == MBT_EXTEND && a != MA_RELEASE)) { if (term->selstate == ABOUT_TO && poseq(term->selanchor, selpoint)) return; if (b == MBT_EXTEND && a != MA_DRAG && term->selstate == SELECTED) { Revision-number: 2253 Prop-content-length: 285 Content-length: 285 K 7 svn:log V 186 Don't try to initialise the palette unless we have Color QuickDraw. This gets PuTTY running on my Mac SE again (albeit very slowly and with scroll optimisation broken for some reason). K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-23T22:36:56.000000Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5f69c08ecb2316e3c8786116163ae13f Text-delta-base-sha1: 137e57355bffae43786e0b1e8119b9172d9c82c8 Text-content-length: 99 Text-content-md5: 2648c3fe44dc12a8931806dca04e5139 Text-content-sha1: 62798157ae474818656c25ae81b2def28e272abd Content-length: 139 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN> J+XB/* $Id: macterm.c,v 1.10 2002/11/23 22:36:56if (!HAVE_COLOR_QD()) return; Revision-number: 2254 Prop-content-length: 300 Content-length: 300 K 8 svn:date V 27 2002-11-24T00:38:44.000000Z K 7 svn:log V 201 Fix scrolling on systems without Color QuickDraw. It seems that the current background colour and pen mode have some silly effects on ScrollRect, so set them back to their defaults before calling it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2648c3fe44dc12a8931806dca04e5139 Text-delta-base-sha1: 62798157ae474818656c25ae81b2def28e272abd Text-content-length: 131 Text-content-md5: 652fda2aff445de26f6e9c2b588739b4 Text-content-sha1: c53c06d8fdedc00cdfb0e0f1396154e206fddf50 Content-length: 171 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN>. iB,;/* $Id: macterm.c,v 1.11 2002/11/24 00:38:44PenNormal(); if (HAVE_COLOR_QD()) PmBackColor(DEFAULT_BG Revision-number: 2255 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2002-11-24T15:08:52.000000Z K 7 svn:log V 47 Add support for displaying the licence window. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 497af2d50f189d8bf57ec8cdb03ad29c Text-delta-base-sha1: d63fa5bd734104bb217704b4525f0b65cd652859 Text-content-length: 745 Text-content-md5: a00bf93227954942fe4eb5bfa0be0f0d Text-content-sha1: 9d01622a829c23ff469b59dd1862a6dcd4844d87 Content-length: 784 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNM3*9'0C[D1t<< 5/* $Id: mac.c,v 1.4 2002/11/24 15:08:52updatelicenceopenlicence mac_openlicence(); mac_updatelicence(window); break; } } static void mac_updatelicence(WindowPtr window) { Handle h; int len; SetPort(window); BeginUpdate(window); TextFont(applFont); TextSize(9); h = Get1Resource('TEXT', wLicence); len = GetResourceSizeOnDisk(h); if (h != NULL) { HLock(h); TETextBox(*h, len, &window->portRect, teFlushDefault); HUnlock(h); } EndUpdate(window);openlicencelicence) SelectWindow(windows.licence); else { windows.licence = GetNewWindow(wLicence, NULL, (WindowPtr)-1); ShowWindow(windows.licencecase wLicence: windows.licence Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f45690ab94a05caeef8bbd0fe3ed488d Text-delta-base-sha1: 2fa4ff00460bb0711550a99170380cefb42f7cc9 Text-content-length: 153 Text-content-md5: ff24dee059d2b2f2ad09e595a32d51db Text-content-sha1: f18ec962f04cc9797b5f3637e9681c863025bdab Content-length: 192 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN~z|s+L$K??/* $Id: mac_res.r,v 1.2 2002/11/24 15:08:52250, 4" "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry, Revision-number: 2256 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2002-11-25T18:31:02.000000Z K 7 svn:log V 65 Quick acknowledgement that yes, smartcard support would be nice. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 369 Text-content-md5: 6fc4fe9f2aaaf6669c902c903282be3b Text-content-sha1: 22f5361e2ac6cf2347d4fed5ecbc6b2322784b5f Content-length: 485 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNcccSummary: PuTTY could use RSA keys held on smartcards Class: wish Priority: low Difficulty: taxing Content-type: text/x-html-body

    It's been suggested that PuTTY could use RSA keys held on a smartcard for authentication. This would require interfacing with smartcard APIs and suchlike, and might be an application for the MDPI. Revision-number: 2257 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2002-11-25T19:02:23.000000Z K 7 svn:log V 23 Remove a spurious 'q'. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ce26cd04d5cd1c336ce88c79e72a9274 Text-delta-base-sha1: 66f87bea29cabff7e14fa7b2e598bb455bd089e5 Text-content-length: 76 Text-content-md5: 71627662ff1bb30db052dcd378dda663 Text-content-sha1: 6754f7718fd0ffa3e75e3fdda2ef3308182a6591 Content-length: 115 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNWT 7g96!\versionid $Id: errors.but,v 1.2 2002/11/25 19:02:23 be Revision-number: 2258 Prop-content-length: 209 Content-length: 209 K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-25T23:34:59.000000Z K 7 svn:log V 110 Make the default font on Mac OS be Monaco 9 rather than Monaco 10, since the former is available as a bitmap. PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ba375c6750bbb281a28175f67e7fd69e Text-delta-base-sha1: 1cee9d4dee785bb934b47ec6574b34e517d6c8f0 Text-content-length: 166 Text-content-md5: 44eadf72f2587e22aefe20a001b522ea Text-content-sha1: d419a5835a3ab410138f21469018876d868776d3 Content-length: 206 K 15 cvs2svn:cvs-rev V 4 1.89 PROPS-END SVNyM C6#ifdef macintosh gppi(sesskey, "FontHeight", 9, &cfg->fontheight); #else gppi(sesskey, "FontHeight", 10, &cfg->fontheight); #endif Revision-number: 2259 Prop-content-length: 663 Content-length: 663 K 8 svn:date V 27 2002-11-26T01:32:51.000000Z K 7 svn:log V 564 Substantial overhaul of colour handling in do_text(). Highlights include: * No more mucking about with transfer modes. We always set up the foreground and background sensibly, EraseRect the whole lot and use srcOr. Apple Tech Note QD505 suggests that this should be faster than srcCopy. * Always use the Palette Manager if we've got Color QuickDraw, even in 1bpp modes. * Apply the cursor colours _after_ all the other stuff, rather than trying to get them through everything else intact. Unfortunately, this doesn't make much difference to the speed. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 652fda2aff445de26f6e9c2b588739b4 Text-delta-base-sha1: c53c06d8fdedc00cdfb0e0f1396154e206fddf50 Text-content-length: 1188 Text-content-md5: fb01d64e1c739f879b021854d075c792 Text-content-sha1: 1f697cb2b6476e7d4393e352b96838b5a1d3caea Content-length: 1228 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN.+k_,tnq[^#]Q/* $Id: macterm.c,v 1.12 2002/11/26 01:32:51TextMode(srcOr, reverse, tmp; a = (struct do_text_args *)cookie; bright = (a->attr & ATTR_BOLD) && a->s->cfg.bold_colour; reverse = a->attr & ATTR_REVERSE; if (depth == 1 && (a->attr & TATTR_ACTCURS)) reverse = !reverse; if (HAVE_COLOR_QD()) { if (depth > 2)} else { /* * NB: bold reverse in 2bpp breaks with the usual PuTTY model and * boldens the background, because that's all we can do. */ fgcolour = bright ? DEFAULT_FG_BOLD : DEFAULT_FG; bgcolour = DEFAULT_BG; } if (reverse) { tmp = fgcolour; fgcolour = bgcolour; bgcolour = tmp; } if (bright && depth > 2) fgcolour++; if ((a->attr & TATTR_ACTCURS) && depth > 1) { fgcolour = CURSOR_FG; bgcolour = CURSOR_BG; } PmForeColor(fgcolour); PmBackColor(bgcolour); } else { /* No Color Quickdraw */ /* XXX This should be done with a _little_ more configurability */ if (reverse) { ForeColor(blackColor); BackColor(whiteColor); } else { ForeColor(whiteColor); BackColor(blackColor); } } EraseRect(&a->text Revision-number: 2260 Prop-content-length: 354 Content-length: 354 K 8 svn:date V 27 2002-11-26T19:35:40.000000Z K 7 svn:log V 253 Increase the size of the `font' buffer in the Config structure, for the benefit of X font names which are rather more verbose than Windows. One day I want to replace all these fixed-size buffers with sensible dynamically allocated stuff, but not today. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 91abcf7072b8537ef20fff4852c395fd Text-delta-base-sha1: eb36a5e29adcde749620164828724218f5d858c8 Text-content-length: 26 Text-content-md5: cf7a60bfc2182c59c5232dd9ab3adfd8 Text-content-sha1: ffb7651d90ea5b8209e15888b3a24b18b2491571 Content-length: 67 K 15 cvs2svn:cvs-rev V 5 1.170 PROPS-END SVNEF 9 ;256 Revision-number: 2261 Prop-content-length: 270 Content-length: 270 K 7 svn:log V 171 Use StdText() rather than DrawText, so that (later) we can support scaling of text to get double-width etc. Also set the background when scrolling in Original Quickdraw. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-28T00:25:09.000000Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fb01d64e1c739f879b021854d075c792 Text-delta-base-sha1: 1f697cb2b6476e7d4393e352b96838b5a1d3caea Text-content-length: 498 Text-content-md5: 888d4f88e9814402a742c1953b01382c Text-content-sha1: 3870522a949baab9f5b1fb93a2881dea16ace1f8 Content-length: 538 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNx&>,SIB7s/* $Id: macterm.c,v 1.13 2002/11/28 00:25:09 Point numer, denoma.numer.h = a.numer.v = a.denom.h = a.denom.v = 1if (a->s->window->grafProcs != NULL) InvokeQDTextUPP(a->len, a->text, a->numer, a->denom, a->s->window->grafProcs->textProc); else StdText(a->len, a->text, a->numer, a->denomSetPort(s->window); PenNormal(); if (HAVE_COLOR_QD()) PmBackColor(DEFAULT_BG); else BackColor(blackColor); /* XXX make configurable */ Revision-number: 2262 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2002-11-28T21:02:07.000000Z K 7 svn:log V 130 Follow the recommendations in Tech Note TB575 for clipping off the space for the horizontal scroll bar when drawing the grow box. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 888d4f88e9814402a742c1953b01382c Text-delta-base-sha1: 3870522a949baab9f5b1fb93a2881dea16ace1f8 Text-content-length: 449 Text-content-md5: bbcd5664ef46bbbb1e69a7aa0a2ba06e Text-content-sha1: 7bc2d3098c914d7d196a3447bb95955a4d85f9b0 Content-length: 489 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNx[$,x4D/* $Id: macterm.c,v 1.14 2002/11/28 21:02:07 RgnHandle savergn; SetPort(s->window); /* * Stop DrawGrowIcon giving us space for a horizontal scrollbar * See Tech Note TB575 for details. */ clip = s->window->portRect; clip.left = clip.right - 15; savergn = NewRgn(); GetClip(savergn); ClipRect(&clip); DrawGrowIcon(s->window); SetClip(savergn); DisposeRgn(savergn Revision-number: 2263 Prop-content-length: 361 Content-length: 361 K 7 svn:log V 262 Don't call SetFractEnable every time we draw some text, since SetFractEnable unconditionally flushes the Font Manager's width cache, and the default is fine for us anyway. This more or less doubles redraw speed, which is nice, but still not really fast enough. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-28T21:10:55.000000Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bbcd5664ef46bbbb1e69a7aa0a2ba06e Text-delta-base-sha1: 7bc2d3098c914d7d196a3447bb95955a4d85f9b0 Text-content-length: 69 Text-content-md5: 0ad4c5299e4886043d8d00d9dc8af5a4 Text-content-sha1: 56cbc2454e24d7a3af2e5251018550a70877c540 Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN[ ,+,</* $Id: macterm.c,v 1.15 2002/11/28 21:10:55 Revision-number: 2264 Prop-content-length: 474 Content-length: 474 K 10 svn:author V 3 ben K 8 svn:date V 27 2002-11-29T00:32:03.000000Z K 7 svn:log V 375 Improve support for non-colour displays by adding a mask of attributes to ignore when breaking text into runs for display, and implement setting this on Mac (other ports just use 0xffffffff). We don't use DeviceLoop for this any more because Apple Technical Q&A QA1024 says we shouldn't. Unlike their example, we don't depend on the Display Manager's being present either. PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 630f4c62212e50f05cc46bc65635cff2 Text-delta-base-sha1: 35a9296853714d881a46fa4d878811be9f3c707d Text-content-length: 20 Text-content-md5: 953b76fde84249479d12c3db458937a1 Text-content-sha1: 4c2a99073e82dddf8be60fd392aa251f2008b2bd Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN` <K Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0ad4c5299e4886043d8d00d9dc8af5a4 Text-delta-base-sha1: 56cbc2454e24d7a3af2e5251018550a70877c540 Text-content-length: 883 Text-content-md5: 4b32a2e3c3964d55fd34f88f26995898 Text-content-sha1: bcf9b0661d1ec0f5f64d987254ff9ecc12eee26b Content-length: 923 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN$$A,X7 b,h+/* $Id: macterm.c,v 1.16 2002/11/29 00:32:03 GDHandle gdh; Rect myrect, tmprect; s->term->attr_mask = 0xffffffff; if (HAVE_COLOR_QD()) { SetPort(s->window); myrect = (*s->window->visRgn)->rgnBBox; LocalToGlobal((Point *)&myrect.top); LocalToGlobal((Point *)&myrect.bottom); for (gdh = GetDeviceList(); gdh != NULL; gdh = GetNextDevice(gdh)) { if (TestDeviceAttribute(gdh, screenDevice) && TestDeviceAttribute(gdh, screenActive) && SectRect(&(*gdh)->gdRect, &myrect, &tmprect)) { switch ((*(*gdh)->gdPMap)->pixelSize) { case 1: if (s->cfg.bold_colour) s->term->attr_mask &= ~ATTR_BOLD; /* FALLTHROUGH */ case 2: s->term->attr_mask &= ~ATTR_COLOURS; } } } } else s->term->attr_mask &= ~(ATTR_COLOURS | (s->cfg.bold_colour ? ATTR_BOLD : 0) Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: dc902bff8015b753a5a46d3034c39429 Text-delta-base-sha1: 5dfd5522f1cdfd546cd39e3fa265e8ad7bc916ff Text-content-length: 165 Text-content-md5: 43b9f855d96ac4d42bb0bc2dce90818c Text-content-sha1: 34d59f497363f55e1dfb83ed76a07d958821245f Content-length: 206 K 15 cvs2svn:cvs-rev V 5 1.121 PROPS-END SVN> x5attr_mask = 0xffffffff((tattr ^ attr) & term->attr_mask) || E~9Ede = SM_CHAR; } else if (b == MBT_SELECT && (a == MA_ Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aeee51dfc45dbe850e9d291905ffcfc1 Text-delta-base-sha1: 46c9cbdc8da7fa8b8499c568853495543430cdf2 Text-content-length: 109 Text-content-md5: 5a2c1e13672dd8830492828064f65b55 Text-content-sha1: bd4162ac5c4e6b22a3a2bc2b8dfde44bf480e16c Content-length: 148 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN{ WrW2k/* Mask of attributes to pay attention to when painting. */ unsigned long attr_mask Revision-number: 2265 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:07.917972Z PROPS-END Revision-number: 2266 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:07.927305Z PROPS-END Revision-number: 2267 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:07.936120Z PROPS-END Revision-number: 2268 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2002-12-01T22:36:05.000000Z K 7 svn:log V 27 Add inactive title bar bug K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/inactive-title Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 382 Text-content-md5: 85cdd4fe88220941286dd31bf24f81b4 Text-content-sha1: 0332bbb21ecee7de1d40d6fb640c3cb165a83093 Content-length: 498 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNpppSummary: Minimising / restoring inactive windows loses (Inactive) in title Class: bug Difficulty: fun Priority: low Content-type: text/plain If a PuTTY session ends and the window sticks around, the titlebar is changed to PuTTY (Inactive). When the window is minimised and restored, the titlebar is changed back to the title the window had before the session ended. Revision-number: 2269 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:07.972067Z PROPS-END Revision-number: 2270 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 HandyThing is no longer free-as-in-beer. Bah. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-12-02T15:59:23.000000Z PROPS-END Node-path: putty-wishlist/data/control-window-pos Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 32bd0d3f75a4d56892252b7014603f00 Text-delta-base-sha1: e9287e81e9e0534cd6b345b3f029753e9a1b02dc Text-content-length: 34 Text-content-md5: aed0e2bcafc1d8e1d0de6552a80e700c Text-content-sha1: 2d68173e5183a423a4accf5f02c33583c8e66cd2 Content-length: 73 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN -L $x, deps => [@deps]}; } return @ret;foreach $d (&deps("X.o", "X.res.o", "", "/")) { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; }foreach $d (&deps("X.obj", "X.res", "", "\\")) { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; }foreach $d (&deps("X.obj", "X.res", "", "\\")) { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; }foreach $d (&deps("X.o", undef, "../", "/")) { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; } ##-- MPW Makefile open OUT, ">mac/Makefile.mpw"; select OUT; print <{obj}, join " ", @{$d->{deps}}), undef, "\xb6"), "\n"; print "\t{C} ", $d->{deps}->[0], " -o {Targ} {COptions_68K}\n\n"; } foreach $d (&deps("X.c.x", undef, "::", ":")) { print &splitline(sprintf("%s \xc4 %s", $d->{obj}, join " ", @{$d->{deps}}), undef, "\xb6"), "\n"; # The odd stuff here seems to stop afpd getting confused. print "\techo -n > {Targ}\n"; print "\tsetfile -t XCOF {Targ}\n"; print "\t{PPCC} ", $d->{deps}->[0], " -o {Targ} {COptions_PPC}\n\n"; } select STDOUT; close OUT; Revision-number: 2273 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2002-12-02T21:03:14.000000Z K 7 svn:log V 43 Add an entry for the Mac version of PuTTY. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ecb110a58751f7e2a1c91601caa463be Text-delta-base-sha1: 6a8744c8eeba3b626a8498f420971cc4c431c0cb Text-content-length: 153 Text-content-md5: e56225680549aebded82f30ade31d07d Text-content-sha1: b9884215fc2c44885befafd7784e9c66e668a484 Content-length: 193 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN  PuTTY : [M] terminal wcwidth tree234 misc ldisc ldiscucs + logging settings be_none mac macstore macterm macucs testback Revision-number: 2274 Prop-content-length: 298 Content-length: 298 K 8 svn:date V 27 2002-12-02T21:06:12.000000Z K 7 svn:log V 199 Driver script for building PuTTY under MPW. MPW isn't multi-tasking, so its "make" program just emits a script for us to run. This script wraps all that horribleness up so we don't have to see it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mkputty.mpw Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1001 Text-content-md5: 546154e27452c41daacf64949074b679 Text-content-sha1: 46d1c55b0382b8b0c3c046cc4406d3f18a10323c Content-length: 1117 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN[[[# $Id: mkputty.mpw,v 1.1 2002/12/02 21:06:12 ben Exp $ set program "{1}" shift if "{program}" == "68k" set program PuTTY.68k end if "{program}" == "ppc" set program PuTTY.ppc end if "{program}" == "" || "{program}" == "fat" set program PuTTY end Set makefile Makefile.mpw # Run Make, then execute its output. Echo "# `Date -t` ----- Build of {program}." #if (`exists "#""#"`) # echo "# `Date -t` ----- Warning: auto-save file present." #end Echo "# `Date -t` ----- Analyzing dependencies." Begin Echo "Set Echo 1" Make "{program}" {"Parameters"} -f "{makefile}" End > "{program}".makeout Echo "# `Date -t` ----- Executing build commands." "{program}".makeout Delete "{program}".makeout Echo "# `Date -t` ----- Done." Set type "`files -i -n -x t "{program}" Dev:Null || Set Status 0`" Set CaseSensitive True #filetype check for DA must be case sensitive If "{type}" =~ / APPL/ OR "{type}" =~ / MPST/ # application or tool Echo -n t; Quote -n "{program}"; Echo -n " " End Revision-number: 2275 Prop-content-length: 152 Content-length: 152 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-03T13:23:22.000000Z K 7 svn:log V 52 Summary: Printer enumeration may cause slow startup PROPS-END Node-path: putty-wishlist/data/slow-startup-printer Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1465 Text-content-md5: 1b5e92d0af67f28a302cb0a71c9c696c Text-content-sha1: d36bf58f0f0df970c418c5a086d9836bf4371681 Content-length: 1581 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN+++Summary: Printer enumeration may cause slow startup Class: semi-bug Difficulty: tricky Priority: low Content-type: text/x-html-body Present-in: 0.53 Absent-in: 0.52

    There's been a suggestion (ref: 000c01c282b0$c6ae6c90$6e01a8c0@int.psross.net) that the ANSI printer support added in 0.53 can cause PuTTY to take a long time to start (~30 seconds) if a printer is configured in Windows that is not reachable (e.g. shared from a machine that is currently switched off). This may be intermittent rather than reliable. (Win2K Pro SP3)

    PuTTY calls Windows functions to enumerate all suitable printers (regardless of whether any attempt is made to use the ANSI printing functionality):

    • when a saved session is loaded into the configuration dialog;
    • when a new panel is selected via the treeview control;
    • when the config dialog is initially drawn (side effect of above).
    This means that this is not done if the configuration dialog is bypassed (e.g., by loading a saved session directly).

    PuTTY is a bit unusual in doing this; we use EnumPrinters (etc) directly in order to avoid UI issues associated with the concept of `raw' printing.

    I've not been able to reproduce this on Win2K Pro.

    This is to some extent not our problem, but perhaps we could do something to mitigate the problem (e.g. enumerate printers less often / only if the user requests the ANSI printing functionality). Revision-number: 2276 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2002-12-04T12:39:32.000000Z K 7 svn:log V 26 Changed to use strerror() K 10 svn:author V 4 owen PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3177d852c0493659864a3c84ba13d396 Text-delta-base-sha1: 53116fe69fb66f6b7687540cd9eb2c90314ca5b4 Text-content-length: 174 Text-content-md5: a039a964fc17df3ab859fc0734af9985 Text-content-sha1: 9d57da457e5b807eb6752859c65422c0328dcc2f Content-length: 213 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN8| Sechar *ret = smalloc(strlen(strerror(error)) + strlen("Network error: ")); sprintf(ret, "Network error: %s",strerror(error)); return ret; Revision-number: 2277 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2002-12-04T12:40:36.000000Z K 7 svn:log V 98 #include . Compiled fine without it on Debian 3.0, but not on 2.2. Wonder what changed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3f5551ce80f0221edf457fa20e945899 Text-delta-base-sha1: a0f0403a07c48f61f11ff1d70ef1a5d184cfeacb Text-content-length: 29 Text-content-md5: 1d4a49a4cac43c246fc264071c64eec9 Text-content-sha1: 3cdc2c8f338425abc93bdaa370ced912a89f8c57 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVN+ x.iignal Revision-number: 2278 Prop-content-length: 128 Content-length: 128 K 7 svn:log V 29 Avoid potential memory leak. K 10 svn:author V 4 owen K 8 svn:date V 27 2002-12-04T12:53:42.000000Z PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a039a964fc17df3ab859fc0734af9985 Text-delta-base-sha1: 9d57da457e5b807eb6752859c65422c0328dcc2f Text-content-length: 46 Text-content-md5: 11cf1f6ec3de78c985e63ad8551cc2cb Text-content-sha1: 9467791449bb0dd755a6998a45bdac54ff3365c1 Content-length: 85 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN| T(return strerror(error) Revision-number: 2279 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 44 Add some notes on symptoms and workarounds. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-04T15:10:32.000000Z PROPS-END Node-path: putty-wishlist/data/ssh2-kex-data Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 90348988ee33d1aa6079f0ab462ca611 Text-delta-base-sha1: 5e6969f99f086c59e030e52a093ff349b5cc7a01 Text-content-length: 508 Text-content-md5: 00bcf20a9e677a913e83aa40d38e08bf Text-content-sha1: 6116547b1e9a6cb27dc55a8f47202bd2f170c9aa Content-length: 547 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN|ii

    Symptoms of this: ssh.com's server, which does repeat key exchange every hour or so, will sometimes throw you off - a common disconnect message seems to be "Protocol error: Received 94 as newkeys". (We've also had a report of "packet too long" from F-Secure.) This will seem intermittent.

    There aren't any really satisfactory workarounds - either using SSH-1 or disabling key re-exchange will both work, but have obvious drawbacks. Revision-number: 2280 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2002-12-04T19:44:57.000000Z K 7 svn:log V 71 Add some comments explaining what each of these functions is used for. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9e16c57849a3d6763eddc2d01ba58dc1 Text-delta-base-sha1: b3e6b966ccf19383d7d3a067603b32afe22338b7 Text-content-length: 637 Text-content-md5: 314993a16e95063e353941456bbe5a86 Text-content-sha1: c1ea65224ef693a269db8a926d32cd10f9bd68b3 Content-length: 676 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN.Vz*?b#nb/* $Id: macucs.c,v 1.2 2002/12/04 19:44:57/* * Determine whether a byte is the first byte of a double-byte * character in a system character set. Only MI use is by clipme() * when copying direct-to-font text to the clipboard. *//* * Convert from Unicode to a system character set. MI uses are: * (1) by lpage_send(), whose only MI use is to convert the answerback * string to Unicode, and * (2) by clipme() when copying direct-to-font text to the clipboard. *//* * Convert from a system character set to Unicode. Used by luni_send * to convert Unicode into the line character set. */ Revision-number: 2281 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:09.039035Z PROPS-END Revision-number: 2282 Prop-content-length: 289 Content-length: 289 K 8 svn:date V 27 2002-12-06T00:09:34.000000Z K 7 svn:log V 190 Use the Script Manager to find a small Roman font for the licence box rather than assuming that the application font at 9pt will be useful (which it probably won't be on non-Roman systems). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a00bf93227954942fe4eb5bfa0be0f0d Text-delta-base-sha1: 9d01622a829c23ff469b59dd1862a6dcd4844d87 Text-content-length: 269 Text-content-md5: 42992422fc7540781ff1f8c13c68daf0 Text-content-sha1: 861ddaa5cdf0e41ab474d9450f73e9b99f8688de Content-length: 308 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNnZ' sA/U/* $Id: mac.c,v 1.5 2002/12/06 00:09:34Script long fondsize; SetPort(window); BeginUpdate(window); fondsize = GetScriptVariable(smRoman, smScriptSmallFondSize); TextFont(HiWord(fondsize)); TextSize(LoWord(fondsize) Revision-number: 2283 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2002-12-07T12:03:33.000000Z K 7 svn:log V 30 Ignore generated Mac Makefile K 10 svn:author V 5 jacob PROPS-END Node-path: putty/mac Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 44 Content-length: 44 K 10 svn:ignore V 12 Makefile.mpw PROPS-END Node-path: putty/mac/.cvsignore Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 23 Text-content-md5: f89bbf22dcbf021a2d2869f12cd6c9e1 Text-content-sha1: f71d7c48336e163dbd597d5c33cd7595f9e63653 Content-length: 139 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  Makefile.mpw Revision-number: 2284 Prop-content-length: 413 Content-length: 413 K 8 svn:date V 27 2002-12-07T15:21:56.000000Z K 7 svn:log V 314 When scrolling part of the window, scroll the update region as well so that parts that haven't been painted yet still get an update event in their new location. This code seems far too complicated, and I suspect there's a better way. Still, scrolling continuously with the window partially off-screen now works. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b32a2e3c3964d55fd34f88f26995898 Text-delta-base-sha1: bcf9b0661d1ec0f5f64d987254ff9ecc12eee26b Text-content-length: 1074 Text-content-md5: f60eedf39398b3f96adcaf22eadabdef Text-content-sha1: 7e4258373968f1f22e19e298ee499d464c941146 Content-length: 1114 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN$V,y"'?b/* $Id: macterm.c,v 1.17 2002/12/07 15:21:56scrollrgn = NewRgn(); RgnHandle movedupdate = NewRgn(); RgnHandle update = NewRgn(); Point g2l = { 0, 0 }; SetPort(s->window); /* * Work out the part of the update region that will scrolled by * this operation. */ if (lines > 0) SetRectRgn(scrollrgn, 0, (topline + lines) * s->font_height, s->term->cols * s->font_width, (botline + 1) * s->font_height); else SetRectRgn(scrollrgn, 0, topline * s->font_height, s->term->cols * s->font_width, (botline - lines + 1) * s->font_height); CopyRgn(((WindowPeek)s->window)->updateRgn, movedupdate); GlobalToLocal(&g2l); OffsetRgn(movedupdate, g2l.h, g2l.v); /* Convert to local co-ords. */ SectRgn(scrollrgn, movedupdate, movedupdate); /* Clip scrolled section. */ ValidRgn(movedupdate); OffsetRgn(movedupdate, 0, -lines * s->font_height); /* Scroll it. */ InvalRgn(update); InvalRgn(movedupdate); DisposeRgn(scrollrgn); DisposeRgn(moved Revision-number: 2285 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2002-12-07T21:15:49.000000Z K 7 svn:log V 86 Fix write to freed memory in HTTP proxying. Things aren't entirely happy yet, though. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 61629d2c3039d3d962ca61e626e5bd31 Text-delta-base-sha1: d79167bc85cdcf43d3eb21e795fde3d64294cbaf Text-content-length: 72 Text-content-md5: 21aeb112a4c453415ec9d597f168822b Text-content-sha1: afe930dcdf35a4f3e0db792df5cc5838d5629e48 Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNt*q}X0k_write(p->sub_socket, "\r\n", strlen(buf) Revision-number: 2286 Prop-content-length: 296 Content-length: 296 K 7 svn:log V 195 For some reason Roman Pompejus' original logging patch opened the log in "wb" mode. Since we were mostly writing "\n" rather than "\r\n", I've changed it to just "w" and refunded the difference. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-07T21:35:05.000000Z PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7a7fcf6d211d683c178f3493030f0af3 Text-delta-base-sha1: 718b1e384a153acaa52c68e2a2414e14e51b769b Text-content-length: 25 Text-content-md5: f7133b897229e31ab3818a4c6aeb8f5b Text-content-sha1: c5147caf939718b394e8e5eef11df7376d999e9f Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN=:KLnO Revision-number: 2287 Prop-content-length: 482 Content-length: 482 K 8 svn:date V 27 2002-12-08T01:17:31.000000Z K 7 svn:log V 383 Slightly cheesy size-tip implementation. This is suboptimal in two ways: * It paints over the top-left corner of the terminal window. A little floating window would be rather nicer and not much harder to do. * It uses the low-memory global, DragHook, which is unavailable in Carbon and broken in some versions of Mac OS 8 (8.5?). I suspect this is unavoidable, though. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f60eedf39398b3f96adcaf22eadabdef Text-delta-base-sha1: 7e4258373968f1f22e19e298ee499d464c941146 Text-content-length: 1906 Text-content-md5: f9a17f5b770d27cfaa4ea911cb98a59c Text-content-sha1: 741383cf3d158d33d494026dbdb626dd99d49a84 Content-length: 1946 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN"6.U,?s 0 dmo8@X/* $Id: macterm.c,v 1.18 2002/12/08 01:17:31LowMemgrowtermdraghook(voidstatic struct { Rect msgrect; Point msgorigin; Point startmouse; Session *s; char oldmsg[20]; } growterm_state; DragGrayRgnUPP draghooksave; GrafPtr portsave; FontInfo fi; s = (Session *)GetWRefCon(window); draghooksave = LMGetDragHook(); growterm_state.oldmsg[0] = '\0'; growterm_state.startmouse = event->where; growterm_state.s = s; GetPort(&portsave); SetPort(s->window); BackColor(whiteColor); ForeColor(blackColor); TextFont(systemFont); TextFace(0); TextSize(12); GetFontInfo(&fi); SetRect(&growterm_state.msgrect, 0, 0, StringWidth("\p99999x99999") + 4, fi.ascent + fi.descent + 4); SetPt(&growterm_state.msgorigin, 2, fi.ascent + 2); LMSetDragHook(NewDragGrayRgnUPP(mac_growtermdraghook)); DisposeDragGrayRgnUPP(LMGetDragHook()); LMSetDragHook(draghooksave); InvalRect(&growterm_state.msgrect); SetPort(portsave); static pascal void mac_growtermdraghook(void) { Session *s = growterm_state.s; GrafPtr portsave; Point mouse; char buf[20]; int newrows, newcols; GetMouse(&mouse); newrows = (mouse.v - growterm_state.startmouse.v) / s->font_height + s->term->rows; if (newrows < 1) newrows = 1; newcols = (mouse.h - growterm_state.startmouse.h) / s->font_width + s->term->cols; if (newcols < 1) newcols = 1; sprintf(buf, "%dx%d", newcols, newrows); if (strcmp(buf, growterm_state.oldmsg) == 0) return; strcpy(growterm_state.oldmsg, buf); c2pstr(buf); GetPort(&portsave); SetPort(growterm_state.s->window); EraseRect(&growterm_state.msgrect); MoveTo(growterm_state.msgorigin.h, growterm_state.msgorigin.v); DrawString((StringPtr)buf); SetPort(portsave); Revision-number: 2288 Prop-content-length: 232 Content-length: 232 K 7 svn:log V 131 Add a new diagnostic in winnet.c, to attempt to pinpoint the reason for the tree234 assertion failure we've had reported recently. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-12-08T11:00:47.000000Z PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 14fb178e9be564fd4e3e5af43ac56a9c Text-delta-base-sha1: 7463e648423b4cfcb81a497d84a8a5b8c2a099a6 Text-content-length: 689 Text-content-md5: 95ca3a59dddbc0f9bb1014474e984beb Text-content-sha1: 39f5608f345abd9ffa7bc589357c431a33112eaa Content-length: 729 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNw y~ /* * One user has reported an assertion failure in tree234 which * indicates a null element pointer has been passed to a * find*234 function. The following find234 is the only one in * the whole program that I can see being capable of doing * this, hence I'm forced to conclude that WinSock is capable * of sending me netevent messages with wParam==0. I want to * know what the rest of the message is if it does so! */ if (wParam == 0) { char *str; str = dupprintf("Strange WinSock message: wp=%08x lp=%08x", (int)wParam, (int)lParam); logevent(NULL, str); connection_fatal(NULL, str); sfree(str); } Revision-number: 2289 Prop-content-length: 282 Content-length: 282 K 7 svn:log V 181 Doofus Award: logfopen is shared between SSH-packet and session-logging modes, so of _course_ it has to be mode "wb". Restored, and added \r to all of the SSH packet logging stuff. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-08T12:10:58.000000Z PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f7133b897229e31ab3818a4c6aeb8f5b Text-delta-base-sha1: c5147caf939718b394e8e5eef11df7376d999e9f Text-content-length: 57 Text-content-md5: e27dc8b6e606420d60314a3722a54a0c Text-content-sha1: 4984fd6b4e75856a0ab7d4f9b94729c2e5386315 Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN:E(ZYp?EKoKrrrrbr Revision-number: 2290 Prop-content-length: 110 Content-length: 110 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-08T12:53:07.000000Z K 7 svn:log V 10 Add 0.53b PROPS-END Node-path: putty-wishlist/data/slow-startup-printer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1b5e92d0af67f28a302cb0a71c9c696c Text-delta-base-sha1: d36bf58f0f0df970c418c5a086d9836bf4371681 Text-content-length: 27 Text-content-md5: 105c8bacf25fa5fac81af515dbd6c6f6 Text-content-sha1: 480b88774f66ddc323c537e344de5c159dc33cdf Content-length: 66 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN+1  0.53b Revision-number: 2291 Prop-content-length: 409 Content-length: 409 K 8 svn:date V 27 2002-12-08T14:44:42.000000Z K 7 svn:log V 308 Argh. With DEBUG and MALLOC_LOG enabled, I found output intended for the console was ending up in one or other of debug.log or putty_mem.log. I don't really understand why, but I've put some extra paranoia and caching in debug(()) and that seems to have fixed it (tm). Perhaps I can get back to debugging... K 10 svn:author V 5 jacob PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e20a26c5675b5e24534564f531da83f5 Text-delta-base-sha1: cb9ddfdca445672eedc17a2dcf33e85ec11f0a16 Text-content-length: 344 Text-content-md5: a94f5a69d22dd83364bd00b8719b5be8 Text-content-sha1: 389b916682d4a5508f6760e343ded69ddc13b003 Content-length: 384 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN"$;r|r0HANDLE debug_hdl = INVALID_HANDLE_VALUEif (AllocConsole()) { debug_got_console = 1; debug_hdl = GetStdHandle(STD_OUTPUT_HANDLE); } } if (!debug_fp) { debug_fp = fopen("debug.log", "w"); } if (debug_hdl != INVALID_HANDLE_VALUE) { WriteFile(debug_hdl, buf, strlen(buf), &dw, NULL); } Revision-number: 2292 Prop-content-length: 327 Content-length: 327 K 8 svn:date V 27 2002-12-08T15:32:40.000000Z K 7 svn:log V 226 Wrong length was causing spurious \0 to be sent during SSH negotiation with HTTP proxy -- fixed. (Also added a "len -= eol" to HTTP header munching, although it has no practical effect.) HTTP proxying now works again, hurrah. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 21aeb112a4c453415ec9d597f168822b Text-delta-base-sha1: afe930dcdf35a4f3e0db792df5cc5838d5629e48 Text-content-length: 46 Text-content-md5: 515048df3757cc0ec3446901215c5a76 Text-content-sha1: fc6079f0c3cf87e2299941a41cd28cbe6a6f03f8 Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNtz \o2);len - Revision-number: 2293 Prop-content-length: 394 Content-length: 394 K 8 svn:date V 27 2002-12-08T16:54:31.000000Z K 7 svn:log V 293 Modify bug-compatibility checks to use wildcards. Should have exactly the same behaviour as before (tested a little bit), but should be easier to expand. (This is the easy bit -- work still needs to be done to fix ssh2-keyderive-nonbug, vshell-no-bug-compat, etc -- but should be easier now.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e56225680549aebded82f30ade31d07d Text-delta-base-sha1: b9884215fc2c44885befafd7784e9c66e668a484 Text-content-length: 30 Text-content-md5: f3ecdb163c296a9fe9643deb401fa517 Text-content-sha1: ab6687e591a4de87223612687377e3894277355e Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN  d&d wildcard Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0d283138079afab8b2a49bf39fba8754 Text-delta-base-sha1: 027326959142a2292d0141a45bf9fdbbe6ef66a0 Text-content-length: 395 Text-content-md5: 095db0fc00541a5bbf14051428cbe3f4 Text-content-sha1: aae0556a18d03230013c32680af8724304cac211 Content-length: 436 K 15 cvs2svn:cvs-rev V 5 1.245 PROPS-END SVN'FPp`_gM_Rpktin.type, PKT_INT, c->remoteid, PKT_END); lP Revision-number: 2294 Prop-content-length: 147 Content-length: 147 K 7 svn:log V 47 Need to think about how this fits into our UI. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-08T17:04:35.000000Z PROPS-END Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4a63b114cf94e9a70a3de2b2846961e2 Text-delta-base-sha1: 8a231fd830c0786b7e6f8ea7cb03728f772a2abc Text-content-length: 68 Text-content-md5: 7fa33b033ec39f412967c1106ec78ad0 Text-content-sha1: 4fab266b52aaf4edc9fdb146b4dede00e18924fb Content-length: 107 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNi4i

    Need to think about how this fits into our UI. Revision-number: 2295 Prop-content-length: 124 Content-length: 124 K 7 svn:log V 26 Remove some unused cruft. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-08T22:09:47.000000Z PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ff24dee059d2b2f2ad09e595a32d51db Text-delta-base-sha1: f18ec962f04cc9797b5f3637e9681c863025bdab Text-content-length: 59 Text-content-md5: 0f4f3c13503d16ea667b6af7dc8efa69 Text-content-sha1: f2957c47ed94682f911995334ab3a5e1cc277ae3 Content-length: 98 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNz*++/* $Id: mac_res.r,v 1.3 2002/12/08 22:09:47 Revision-number: 2296 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2002-12-08T22:15:10.000000Z K 7 svn:log V 50 Remove a stray prototype for mac_set_attr_mask(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f9a17f5b770d27cfaa4ea911cb98a59c Text-delta-base-sha1: 741383cf3d158d33d494026dbdb626dd99d49a84 Text-content-length: 68 Text-content-md5: 4794f7515c9edb2b0394ff09a940ec81 Text-content-sha1: 2254e28a8419448e0b2c7ead01987a463304fb2d Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN"^ ,:,x*/* $Id: macterm.c,v 1.19 2002/12/08 22:15:10 Revision-number: 2297 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2002-12-08T22:23:08.000000Z K 7 svn:log V 128 Oops. When deciding which attributes are interesting, we want the union of all the screens' capabilites, not the intersection. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4794f7515c9edb2b0394ff09a940ec81 Text-delta-base-sha1: 2254e28a8419448e0b2c7ead01987a463304fb2d Text-content-length: 287 Text-content-md5: c29b5243a9f368bedd980ebc87de7bf3 Text-content-sha1: 96b70c27c2347576c4ec7addec829e87e6617cfd Content-length: 327 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN^H|,w5PU /* $Id: macterm.c,v 1.20 2002/12/08 22:23:08|= ~(ATTR_BOLD | ATTR_COLOURS); break; case 2: s->term->attr_mask |= ~ATTR_COLOURS; break; default: s->term->attr_mask = ~0; return; /* No point checking more screens. */ Revision-number: 2298 Prop-content-length: 255 Content-length: 255 K 8 svn:date V 27 2002-12-09T22:49:56.000000Z K 7 svn:log V 156 Update the non-Color Quickdraw code in pre_paint() to match recent changes to the Color Quickdraw code. This makes redraw work properly on old Macs again. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c29b5243a9f368bedd980ebc87de7bf3 Text-delta-base-sha1: 96b70c27c2347576c4ec7addec829e87e6617cfd Text-content-length: 184 Text-content-md5: 8f1f6c6f77442711d8a835fb7d0733b3 Text-content-sha1: 771c3fa9408bf10a3a489d4be06274a0e7c8a9e0 Content-length: 224 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNHfj,eHa@&"/* $Id: macterm.c,v 1.21 2002/12/09 22:49:56if (HAVE_COLOR_QD()) { s->term->attr_mask = 0;COLOURS | (s->cfg.bold_colour ? ATTR_BOLD : 0) Revision-number: 2299 Prop-content-length: 288 Content-length: 288 K 8 svn:date V 27 2002-12-09T23:26:52.000000Z K 7 svn:log V 189 When resizing the window, redraw the grow box as well as the scroll bar. I wasn't noticing the bug on my system, since the Appearance Manager handles the grow box itself when it's present. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8f1f6c6f77442711d8a835fb7d0733b3 Text-delta-base-sha1: 771c3fa9408bf10a3a489d4be06274a0e7c8a9e0 Text-content-length: 91 Text-content-md5: 68217f35905bb6b202267ea3132e1575 Text-content-sha1: f56566e1a0298ed823b17830847e6c6598edc69a Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNf B,>(/* $Id: macterm.c,v 1.22 2002/12/09 23:26:52 mac_drawgrowicon(s Revision-number: 2300 Prop-content-length: 289 Content-length: 289 K 8 svn:date V 27 2002-12-10T01:11:40.000000Z K 7 svn:log V 190 Since PuTTY depends on lots of features of System 7, have it bale out if it finds itself running on anything older. This is better than killing the whole system with an umimplemented trap. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 42992422fc7540781ff1f8c13c68daf0 Text-delta-base-sha1: 861ddaa5cdf0e41ab474d9450f73e9b99f8688de Text-content-length: 330 Text-content-md5: 5da2df709b374265c26251991244d7c4 Text-content-sha1: 5f918da8d5eec30e60b14aeb4b1ca74cd52c3353 Content-length: 369 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN 1c' /* $Id: mac.c,v 1.6 2002/12/10 01:11:40Get base system version (only used if there's no better selector) */ if (Gestalt(gestaltSystemVersion, &mac_gestalts.sysvers) != noErr || (mac_gestalts.sysvers & 0xffff) < 0x700) fatalbox("PuTTY requires System 7 or newer"); mac_gestalts.sysvers &= 0xffff; Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 953b76fde84249479d12c3db458937a1 Text-delta-base-sha1: 4c2a99073e82dddf8be60fd392aa251f2008b2bd Text-content-length: 29 Text-content-md5: 545cbef457e124f495fef495ce2f6fc5 Text-content-sha1: 726657fe884d12afdc8bdf5795b74ad60cca6442 Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN j'`sysvers; Revision-number: 2301 Prop-content-length: 189 Content-length: 189 K 7 svn:log V 89 IPv4/IPv6 sense problem in SOCKS5 proxying spotted by Andrey Borzenkov -- recent change. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-10T10:19:51.000000Z PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 515048df3757cc0ec3446901215c5a76 Text-delta-base-sha1: fc6079f0c3cf87e2299941a41cd28cbe6a6f03f8 Text-content-length: 26 Text-content-md5: b6c744c23686fc1dec2c39606d881847 Text-content-sha1: 0feabd483fac35acc6d945b7ff94dd2204fa8ecf Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNzz 5D64 Revision-number: 2302 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:10.032293Z PROPS-END Revision-number: 2303 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:10.039738Z PROPS-END Revision-number: 2304 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2002-12-11T11:55:15.000000Z K 7 svn:log V 53 Add a wish for ppp-over-putty that we just received. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/virtual-serial Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 570 Text-content-md5: 88609e572a65ea83285a24bc4f408f9b Text-content-sha1: b00be5dd975736e9649124577f17d443db7c3fb2 Content-length: 686 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN,,,Summary: Virtual serial port over SSH Class: wish Priority: never Difficulty: tricky Content-type: text/x-html-body

    >What would be really great would be for a way of running a VPN over a
    >PuTTY link.
    >My current thinking is that a virtual modem driver that runs plink to
    >establish an asci link with the target server. Then ppp can be ran on
    >the remote machine just like modem dialups.
    

    My (bjh) feeling is that this shouldn't need any work on our part, since the driver ought to be able to invoke Plink itself, like CVS et al do. Revision-number: 2305 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2002-12-11T18:34:49.000000Z K 7 svn:log V 41 Add some documentation for the Mac port. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1423 Text-content-md5: e8bbfddd2fda6e28117fea70ca61df15 Text-content-sha1: ac973823d746df5336c8d8ecb91b0a50276b65f8 Content-length: 1539 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN$Id: README.mac,v 1.1 2002/12/11 18:34:49 ben Exp $ Information about PuTTY for the Mac OS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Compiling it: See ../README for generic information. I compile PuTTY using MPW, with Universal Headers 3.4.2. The "mkputty.mpw" script does most of the work, but currently needs you to run "Rez -append -o PuTTY mac_res.r {Includes}" to get the resources compiled in. The Makefile currently only generates a Classic 68K application. Other architectures will come later. Runtime requirements: PuTTY should run on any Macintosh running System 7.0 or later. The Classic 68K build seems not to run under Mac OS X (even with Classic.app). Known bugs: * PowerPC and fat versions fail to start on systems without AppearanceLib (ie most System 7 ones). The 68k version works fine. [MAYBE FIXED] * Display is far too slow. * Real bold doesn't compensate for changing character widths without Color QuickDraw. [MAYBE FIXED] * sshsha.c and sshmd5.c cause a stack overflow in Apple's PowerPC C compiler unless optimisation is entirely disabled. Features we need (and aren't entirely obvious): * Scroll-conflation -- scroll_display should change the in-memory display and remember the scroll, then do_scroll should be called only when scroll_display gets called for a different rectangle or term_paint happens. Local Variables: mode: text End: Revision-number: 2306 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2002-12-12T15:36:23.000000Z K 7 svn:log V 73 One of my many complaints about do_text() (and probably easiest to fix). K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/do-text-unicode Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 601 Text-content-md5: 7b11b02345b55c549f0a1d205278c6bf Text-content-sha1: 6f86518775e7e8a9867a60535f12be24722df543 Content-length: 717 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNKKKSummary: do_text() is mad in a Unicode world Class: wish Priority: medium Difficulty: tricky Content-type: text/h-html-body

    The current internal interface used to draw text on screen, do_text() , dates from the pre-Unicode days of PuTTY, and takes a string of eight-bit characters in one argument, and an attribute word (including the high-order eight bits of the Unicode characters) in another. This is clearly mad, and do_text() should be passed a UCS-2 string. This would also allow for longer strings to be passed to do_text() at a time. Revision-number: 2307 Prop-content-length: 155 Content-length: 155 K 7 svn:log V 57 Explain Simon's Really Cunning Idea(TM) for fixing this. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-12T15:49:16.000000Z PROPS-END Node-path: putty-wishlist/data/font-overflow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7ae7345be7c8579e5d1bcc73eb1d06bc Text-delta-base-sha1: ba54e232259d06fe6abf6a4c203019bc94959dfc Text-content-length: 549 Text-content-md5: 7368d6961fa59424005e95d1a1da4b52 Text-content-sha1: 8569361b7e8d8a035b219684b670a7b970e581e2 Content-length: 588 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN)T @"

    Simon has a cunning idea for dealing with this. The plan is that whenever we paint a string on the screen, we clip it to its bounding rectangle (this should happen already), and then whenever we change the contents of the rectangle, we always re-paint the whole thing, splitting it into smaller rectangles, or joining rectangles together as appropriate. This way, we never leave droppings behind, because whenever a character is erased, the entire clipping box that was in force when it was painted is cleared as well. Revision-number: 2308 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2002-12-12T16:01:57.000000Z K 7 svn:log V 59 Tweak the generated HTML to make it closer to being valid. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8ab173312b47ec721aced5b8659d1e8c Text-delta-base-sha1: b8c9bf349e9b9ff021c69975e9a787131b83fd15 Text-content-length: 639 Text-content-md5: a10f46f36f041defde3e3c7d9b269659 Text-content-sha1: f976dbcca78b9ae4aece8353a74e88956cfafdf8 Content-length: 679 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN``"Q@ Bd*2V&h[#! /usr/bin/perl # $Id: bugs2html,v 1.13 2002/12/12 16:01:57 ben!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> PuTTY Known Bugs and Wish List Fixed thingsBugs PuTTY @{[$hdrs->{class}]} $bugname Opening a forwarded X11 connection over an SSH connection that's using a proxy fails to work. (Versions of PuTTY before 2002-10-11 may also crash.)

    I (JTN) can reproduce this with HTTP proxying. Symptom is something like the followingA workaround is to add `localhost,127.0.0.1' to the proxy exclusions. This implies that our proxying code is being over-enthusiastic and needs reining in. Revision-number: 2311 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2002-12-12T18:28:35.000000Z K 7 svn:log V 60 We've been asked for a horizontal scroll bar several times. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/horiz-scroll Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 592 Text-content-md5: c06c7a7c043f00d9207951f3c1987214 Text-content-sha1: 0e4cc407d81a2046d905274fe51d27cf62ba8fac Content-length: 708 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNBBBSummary: Horizontal scrollbar Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body

    Some people would like a horizonal scrollbar, because they want to be able to look at things wider than the screen. This wouldn't be analagous to the vertical scrollbar, since that allows viewing of the (read-only) scrollback, whereas a horizontal scrollbar would adjust which part of a larger terminal was visible.

    A simple workaround for users of Unix systems is to install less and use less -S to view their files and command output. Revision-number: 2312 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2002-12-12T18:46:09.000000Z K 7 svn:log V 17 Suggest MRU too. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/many-sessions Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e75db42f118ffa1a2ec271e55b40f629 Text-delta-base-sha1: 3e926f009b85b1686bc5b29292c0a2518f4c1f43 Text-content-length: 253 Text-content-md5: c497df4148798c0301f885bc38f17369 Text-content-sha1: 9414412dd5283e8ba551c04122494fbfe4c37fec Content-length: 292 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNK ffGOAnother possibility would be to sort the sessions based on most recent access time. I'm not sure how users would cope with their sessions' being shuffled all the time, though.

    It's not impossible that we might want to do all Revision-number: 2313 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2002-12-12T19:11:46.000000Z K 7 svn:log V 35 Add a suggested source of headers. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ipv6-build Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b592a71b2af3b192e24da3180124eb18 Text-delta-base-sha1: d893fcbef9c9e4fccb37a75dded17d1c2f518685 Text-content-length: 131 Text-content-md5: 6c56db2a4ce53a101d8a5046aeeec599 Text-content-sha1: bd5dbdde2100cda1ea1e77754a1fc691b57fc839 Content-length: 170 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNn m!m`! It's suggested that we could get them here. Revision-number: 2314 Prop-content-length: 212 Content-length: 212 K 8 svn:date V 27 2002-12-12T23:55:51.000000Z K 7 svn:log V 113 When loading a string setting, expect in the same form we would have saved (raw text rather than Pascal string). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 65c66679aae3998b7f7348e0bfb3eaee Text-delta-base-sha1: a4c71f942565f8ed39aa5fdae117eb16c24ecbe2 Text-content-length: 250 Text-content-md5: 0310fba6ea404bfdfec1046a90c17900 Text-content-sha1: dcb4e2d6e64984b241b4c756758ed0dace60dba2 Content-length: 289 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN[[1,#_!_|/* $Id: macstore.c,v 1.2 2002/12/12 23:55:51 size_t lenTEXT'), key); if (h == NULL) goto out; len = GetHandleSize(h); if (len + 1 > buflen) goto out; memcpy(buffer, *h, len); buffer[len] = '\0'; Revision-number: 2315 Prop-content-length: 496 Content-length: 496 K 8 svn:date V 27 2002-12-13T00:02:48.000000Z K 7 svn:log V 397 Use the Unicode Converter to convert from Unicode to the display encoding if it's available. Linking against the static Unicode Converter library costs us about 30k on Classic 68K, which I can live with. Because the default fallback converter can generate multiple output characters for a single input character, we provide our own fallback that doesn't. It converts everything to '?' instead. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e8bbfddd2fda6e28117fea70ca61df15 Text-delta-base-sha1: ac973823d746df5336c8d8ecb91b0a50276b65f8 Text-content-length: 716 Text-content-md5: dc56016f0d169f800d9220631cb0ab82 Text-content-sha1: 89b3c864c691d549f09cf857dc04c1e4af95b0b9 Content-length: 755 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN 3) A@$Id: README.mac,v 1.2 2002/12/13 00:02:48To compile PuTTY for Mac OS you will need: MPW Universal Headers (optional) Text Encoding Converter SDK Install MPW, install the new Universal Headers (optional), then put the contents of the "68K Static Libraries" directory of the Text Encoding Converter SDK into "Interfaces&Libraries:Libraries:Libraries". The "mkputty.mpw" script does most of the work, but currently needs you Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5da2df709b374265c26251991244d7c4 Text-delta-base-sha1: 5f918da8d5eec30e60b14aeb4b1ca74cd52c3353 Text-content-length: 551 Text-content-md5: 105a3d21940ba77d7474c568cebc4134 Text-content-sha1: 0bc37f01cd5e1f15cac731642a29dd30eae6c8d7 Content-length: 590 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNk|o'u#Ffx/* $Id: mac.c,v 1.7 2002/12/13 00:02:48extCommon.h> #include #include tecVersion; DisposeHandle((Handle)ti); }if (mac_gestalts.encvvers != 0) TerminateUnicodeConverter(); Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 545cbef457e124f495fef495ce2f6fc5 Text-delta-base-sha1: 726657fe884d12afdc8bdf5795b74ad60cca6442 Text-content-length: 224 Text-content-md5: 129a73679786d0baf14d24f6fff094a6 Text-content-sha1: b78e3acb847a94468b16e34e4eb7d7fc106886fe Content-length: 263 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNmCJ";RG#include struct mac_gestalts { long sysvers; long qdvers; long apprvers; long cntlattr; long windattr; long encvvers UnicodeToTextInfo uni_to_font Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 68217f35905bb6b202267ea3132e1575 Text-delta-base-sha1: f56566e1a0298ed823b17830847e6c6598edc69a Text-content-length: 2217 Text-content-md5: 1e72baf94f541a24f9599afc2708d1a4 Text-content-sha1: c44fcee024eda8481ce87dc36461608b48deb5b5 Content-length: 2257 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN16eI,Sy, (PPp&V\DzFG8/* $Id: macterm.c,v 1.23 2002/12/13 00:02:48extCommon.h> #include #include #include uni_to_font != NULL) DisposeUnicodeToTextInfo(&s->uni_to_font); if (mac_gestalts.encvvers == 0 || UpgradeScriptInfoToTextEncoding(kTextScriptDontCare, kTextLanguageDontCare, kTextRegionDontCare, macfont, &enc) != noErr || CreateUnicodeToTextInfoByEncoding(enc, &s->uni_to_font) != noErr) { s->uni_to_font = NULL; } else { if (uni_to_font_fallback_upp == NULL) uni_to_font_fallback_upp = NewUnicodeToTextFallbackProc(&uni_to_font_fallback); if (SetFallbackUnicodeToText(s->uni_to_font, uni_to_font_fallback_upp, kUnicodeFallbackCustomOnly | kUnicodeFallbackInterruptSafeMask, NULL) != noErr) { DisposeUnicodeToTextInfo(&s->uni_to_font); s->uni_to_font = NULL; } } mac_adjustsize(s, s->term->rows, s->term->cols); } static pascal OSStatus uni_to_font_fallback(UniChar *ucp, ByteCount ilen, ByteCount *iusedp, TextPtr obuf, ByteCount olen, ByteCount *ousedp, LogicalAddress *cookie, ConstUnicodeMappingPtr mapping) { if (olen < 1) return kTECOutputBufferFullStatus; *obuf = '?'; *iusedp = ilen; *ousedp = 1; return noErr; } char mactextbuf[1024]; UniChar unitextbuf[1024]; int i; assert(len <= 1024)if (s->uni_to_font != NULL) { ByteCount iread, olen; OSStatus err; for (i = 0; i < len; i++) unitextbuf[i] = (unsigned char)text[i] | (attr & CSET_MASK); err = ConvertFromUnicodeToText(s->uni_to_font, len * sizeof(UniChar), unitextbuf, kUnicodeUseFallbacksMask, 0, NULL, NULL, NULL, 1024, &iread, &olen, mactextbuf); if (err == noErr || err == kTECUsedFallbacksStatus) text = mactextbuf; len = olen; } Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 492021066597d1c48842fc2a91d1cd46 Text-delta-base-sha1: adaebb45f6990064284beb66df6fce5860c6f410 Text-content-length: 68 Text-content-md5: 53ed7bb1057d9da0b0918863a776ac1a Text-content-sha1: 69aa44a5eb0f612fc788a32bfd46929926e0022a Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNS +~X{ \xb6 "{Libraries}UnicodeConverterLib.far Revision-number: 2316 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2002-12-13T00:45:08.000000Z K 7 svn:log V 104 Provide a full set of small application icons for PuTTY, now equipped with small lightning flashes too. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f4f3c13503d16ea667b6af7dc8efa69 Text-delta-base-sha1: f2957c47ed94682f911995334ab3a5e1cc277ae3 Text-content-length: 1293 Text-content-md5: 5094d8f4a11aee813ca808458677153b Text-content-sha1: caa95d832077fc067d66aed491701b90c1679bba Content-length: 1332 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN*i sW+H /* $Id: mac_res.r,v 1.4 2002/12/13 00:45:08 resource 'ics#' (128, purgeable) { { /* array: 2 elements */ /* [1] */ $"00FF 0081 008D 0035 00D5 0325 F441 822D" $"B4C1 AB3E AC00 B100 8100 8D00 8100 7E", /* [2] */ $"00FF 00FF 00FF 00FF 00FF 03FF FFFF FFFF" $"FFFF FF7E FF00 FF00 FF00 FF00 FF00 7E" } }; resource 'ics4' (128) { $"00000000FFFFFFFF" $"00000000FCCCCCCF" $"00000000FCEEEECF" $"00000000FCFFC0CF" $"00000000FF1FC0CF" $"000000FF11F000CF" $"FFFFFF111FCCCCCF" $"FCCCCCF111FCFFCF" $"FCEEEF11FFCCCCCF" $"FCECF1FF0FFFFFF0" $"FCECFFCF00000000" $"FCE000CF00000000" $"FCCCCCCF00000000" $"FCCCFFCF00000000" $"FCCCCCCF00000000" $"0FFFFFF0" }; resource 'ics8' (128) { $"0000000000000000FFFFFFFFFFFFFFFF" $"0000000000000000FF2B2B2B2B2B2BFF" $"0000000000000000FF2BFCFCFCFC2BFF" $"0000000000000000FF2BFFFF2A002BFF" $"0000000000000000FFFF05FF2A002BFF" $"000000000000FFFF0505FF0000002BFF" $"FFFFFFFFFFFF050505FF2B2B2B2B2BFF" $"FF2B2B2B2B2BFF050505FF2BFFFF2BFF" $"FF2BFCFCFCFF0505FFFF2B2B2B2B2BFF" $"FF2BFC2AFF05FFFF00FFFFFFFFFFFF00" $"FF2BFC2AFFFF2BFF0000000000000000" $"FF2BFC0000002BFF0000000000000000" $"FF2B2B2B2B2B2BFF0000000000000000" $"FF2B2B2BFFFF2BFF0000000000000000" $"FF2B2B2B2B2B2BFF0000000000000000" $"00FFFFFFFFFFFF" Revision-number: 2317 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2002-12-13T00:50:53.000000Z K 7 svn:log V 65 Remove an unnecessary "{Includes}" from the example Rez command. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dc56016f0d169f800d9220631cb0ab82 Text-delta-base-sha1: 89b3c864c691d549f09cf857dc04c1e4af95b0b9 Text-content-length: 62 Text-content-md5: 12dbacf6734e097d8e059018636dd60b Text-content-sha1: 57f0bb2fd7abd1620b5084c6c857267aebe5ca5d Content-length: 101 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN} )E)y$Id: README.mac,v 1.3 2002/12/13 00:50:53 Revision-number: 2318 Prop-content-length: 110 Content-length: 110 K 7 svn:log V 10 Classify. K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-13T13:37:00.000000Z PROPS-END Node-path: putty-wishlist/data/ssh-window-adjust Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ad5f1726367e990b740fbbb47f5ef6f4 Text-delta-base-sha1: 9aae0886538d533cabcd7f2f6439fd8ef13f7898 Text-content-length: 23 Text-content-md5: a32128a16a71625b940a5f98bee32c06 Text-content-sha1: 61d38e96e6416535e2225e43469bc54ac6f889d7 Content-length: 62 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN&#\Cclass Revision-number: 2319 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2002-12-13T13:38:49.000000Z K 7 svn:log V 22 Correct content type. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/do-text-unicode Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7b11b02345b55c549f0a1d205278c6bf Text-delta-base-sha1: 6f86518775e7e8a9867a60535f12be24722df543 Text-content-length: 20 Text-content-md5: 7ad0a754bd08d380151ea7c51d03fee4 Text-content-sha1: 92a384be2dabd2300a745931928598b4bb83add8 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNKKpZqx Revision-number: 2320 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:10.719533Z PROPS-END Revision-number: 2321 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:10.727288Z PROPS-END Revision-number: 2322 Prop-content-length: 248 Content-length: 248 K 7 svn:log V 149 Some wittering about how do_paint() and do_text() should be able to co-operate over splitting the screen into text runs. Sadly not very conclusive. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-13T15:12:57.000000Z PROPS-END Node-path: putty-wishlist/data/do-text-splitting Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 928 Text-content-md5: 56ffb7a268e15898b65dadce736a8ed6 Text-content-sha1: a1992f49ba1e16398a58456df9e288bf63e97bf3 Content-length: 1044 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Frontends need control over where do_paint() splits runs Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    Currently, the way that do_paint() decides where to split the text runs it passes to do_text() is rather ad hoc and messy. It splits whenever there is a change to the "attributes" of the characters (subject to term->attr_mask), which includes any changes to the high-order byte of the character codes. It also splits around characters in the U+23BA–U+23BD range because the Windows front-end needs this.

    It seems to me (BJH) that we could do with some way for the front end to inform the run-splitting code, so that do_paint() could put in splits where the front end needs them, and not put in spurious splits where it doesn't. I don't yet have any clear idea how this should work, though. Revision-number: 2323 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2002-12-13T17:03:56.000000Z K 7 svn:log V 142 A few thoughts on what resizing the screen _should_ do to the scroll position and the scrollback. Well, what _I_ think it should do. Today. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/resize-scroll-effects Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1418 Text-content-md5: 920046f43f9d0c626992a9c171653bec Text-content-sha1: 06c327342822fa4ebc92bbb0d2abdae6449a5ad1 Content-length: 1534 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN|||Summary: Resizing the window does the Wrong Thing to its contents Class: semi-bug Difficulty: tricky Priority: low Content-type: text/x-html-body

    I (BJH) think that PuTTY's behaviour when the number of lines on the screen is changed is currently wrong. What it currently does is to keep the bottom line of the screen in a fixed position relative to the text. This means that if the window is enlarged, lines get pulled out of the scrollback and added to the screen, and if the window is shrunk, lines get pushed from the screen to the scrollback. A particularly nasty aspect of this is that if you have a large window with a shell prompt at the top and you reduce its size, the prompt disappears off the top of the window. Pulling lines out of the scrollback might also get awkward if we start storing the scrollback in a compressed format.

    So what should we do? xterm's fix to the disappearing-prompt problem seems to be to delete lines from the bottom of the window when it's shrunk unless that would delete the line containing the cursor, in which case lines are deleted from the top instead. When enlarging the window, xterm pulls lines out of the scrollback just like PuTTY. I still haven't decided whether or not this is evil. In any case, it should probably be inhibited in alternate screen mode, just like copying data into the scrollback is (xterm gets this bit wrong). Revision-number: 2324 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2002-12-13T17:48:56.000000Z K 7 svn:log V 18 Fix content type. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/errmsg-full-stops Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 72f981a642b4f634e0d6100a232216a9 Text-delta-base-sha1: d2729d856c9a318ae76b05064aef1e17d65a43d7 Text-content-length: 20 Text-content-md5: 607d8a62128babae134bbb47497a5ab6 Text-content-sha1: 8b8a92d2607417f6f05c6579411e3704f6ea29b7 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN a)bt Revision-number: 2325 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2002-12-13T17:49:32.000000Z K 7 svn:log V 24 Correct angle brackets. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/errmsg-full-stops Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 607d8a62128babae134bbb47497a5ab6 Text-delta-base-sha1: 8b8a92d2607417f6f05c6579411e3704f6ea29b7 Text-content-length: 60 Text-content-md5: 213abb21bf022bf92058739aa9015d9f Text-content-sha1: 8f9f184391c7ad8e946964eb4dbc18e2e4c741b5 Content-length: 99 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN ,e<20020927034005.GA2983@mailhaven.com> Revision-number: 2326 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2002-12-13T18:13:09.000000Z K 7 svn:log V 45 Looks like this was actually fixed long ago. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/blinkrate Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 00b2999c924c05eacd6450fe783fbe33 Text-delta-base-sha1: 95166e079877940db4d50d4798368d9feb7fd5be Text-content-length: 207 Text-content-md5: b84fa19ebc489694b5da6b21dfd6860f Text-content-sha1: db8e1dd7b89d0cf99da0087ef6a0bb3606884869 Content-length: 246 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNxJ< It's been suggested that PuTTY's blinking cursor should match the configured system-wide blink rate.

    This appears to have been fixed long ago, in terminal.c 1.43. Revision-number: 2327 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2002-12-15T11:51:21.000000Z K 7 svn:log V 50 faq-rh8-utf8: Problems with Red Hat 8.0 and UTF-8 K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef4b5e39f57095ecdbcec7a132a6f502 Text-delta-base-sha1: 491d17a93231aa5e81264fa1699aa1349ee5f590 Text-content-length: 888 Text-content-md5: 7b98731d9905f8910bbbef3ed2eecc9e Text-content-sha1: 907cfba3f19392586b54e2c4948fe3d325fd9f17 Content-length: 928 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN=[q6#q#\versionid $Id: faq.but,v 1.40 2002/12/15 11:51:21 jacobS{faq-rh8-utf8}{Question} When I'm connected to a Red Hat Linux 8.0 system, some characters don't display properly. A common complaint is that hyphens in man pages show up as a-acute. With release 8.0, Red Hat appear to have made UTF-8 the default character set. There appears to be no way for terminal emulators such as PuTTY to know this (as far as we know, the appropriate escape sequence to switch into UTF-8 mode isn't sent). A fix is to configure sessions to RH8 systems to use UTF-8 translation - see \k{config-charset} in the documentation. (Note that if you use \q{Change Settings}, changes may not take place immediately - see \k{faq-resetterm}.) If you really want to change the character set used by the server, the right place is \c{/etc/sysconfig/i18n}, but this shouldn't be necessary Revision-number: 2328 Prop-content-length: 195 Content-length: 195 K 7 svn:log V 95 Summary: Reducing window width shouldn't lose information (companion to resize-scroll-effects) K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-15T12:22:51.000000Z PROPS-END Node-path: putty-wishlist/data/resize-no-truncate Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 417 Text-content-md5: f09fd195c0206beced00bbf5db964412 Text-content-sha1: 262dada9ecddc38fd72959636cfdc675d5505d6f Content-length: 533 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Reducing window width shouldn't lose information Class: wish Difficulty: fun Priority: low Content-type: text/x-html-body

    It might be nice if reducing the width of a terminal window, then restoring it, didn't gratuitously lose information from the right-hand ends of lines. (Like NiftyTelnet-SSH on the Mac.)

    This should be relatively easy (it's already the case for the scrollback). Revision-number: 2329 Prop-content-length: 339 Content-length: 339 K 8 svn:date V 27 2002-12-15T12:44:21.000000Z K 7 svn:log V 238 From Greg Prosser: Apparently using "MS Shell Dlg" instead of "MS Sans Serif" in resource files interoperates better with WinXP (enabling font smoothing and improving display of password boxes). I've verified that it's harmless on Win95. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 81322bc268dcc1d66c6487b624645836 Text-delta-base-sha1: aad834ba1cb7e4e34ca9535ee084e04639cbf064 Text-content-length: 71 Text-content-md5: 0cc0bf805e336c235755a433b08e61ff Text-content-sha1: 76142e23059c4b95766e69a06cf737bf4498d972 Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNie T]kv;j;.hell Dlghell Dlghell Dlghell Dlg Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5d3320bedf5be385dd7aaa261a123d4f Text-delta-base-sha1: 5385ea3232c841117236ca4239020a7475694416 Text-content-length: 155 Text-content-md5: b06acbf3a0ed3d2b817a7056962f6b10 Text-content-sha1: 45c79ac890a784d9ff75f40059830409dc22069d Content-length: 195 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNu8Hy,g< Someone's already created a patch to build a GUI Plink for TortoiseCVS. Revision-number: 2331 Prop-content-length: 269 Content-length: 269 K 8 svn:date V 27 2002-12-15T13:19:59.000000Z K 7 svn:log V 168 Fixing trivial warnings spotted by Mingw-2.0.0/gcc-3.2: plink.c: In function `from_backend': plink.c:172: warning: unused variable `h' (introduced in 1.35 [r1198]) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 597d9fd348fe393d99217082085243bc Text-delta-base-sha1: 48d0974350b4d88ba8d779912b3b99f0aac9089b Text-content-length: 22 Text-content-md5: bb3c748d6413da4c9983b52458c219f0 Text-content-sha1: aa8cc780f22794c8c31c596488050775bb9c8ab7 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNd _9 Revision-number: 2332 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2002-12-15T13:23:13.000000Z K 7 svn:log V 140 Fixing trivial warnings spotted by Mingw-2.0.0/gcc-3.2: plink.c:65: warning: `password' defined but not used (introduced in 1.50 [r1525]) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bb3c748d6413da4c9983b52458c219f0 Text-delta-base-sha1: aa8cc780f22794c8c31c596488050775bb9c8ab7 Text-content-length: 23 Text-content-md5: 0f2a55a61d1808a6ed0b146c11299962 Text-content-sha1: 2e9f09e3932d0681a3f9dd20ffaddc58447ed1c0 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVNdE [jz Revision-number: 2333 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2002-12-15T13:25:24.000000Z K 7 svn:log V 151 Fixing trivial warnings spotted by Mingw-2.0.0/gcc-3.2: psftp.c: In function `sftp_cmd_chmod': psftp.c:835: warning: too many arguments for format K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1b3779619795fef0c5e44a29a991029e Text-delta-base-sha1: 9ced94da0904fded054c6be91fe638c27b3f1da1 Text-content-length: 25 Text-content-md5: 711b26f38f199ceac451d95f4f1ebd9a Text-content-sha1: 03fede6d3f17ce2c3f91ed366f8c0e5376781343 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNrk 74> Revision-number: 2334 Prop-content-length: 318 Content-length: 318 K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-15T13:31:58.000000Z K 7 svn:log V 217 Fixing trivial warnings spotted by Mingw-2.0.0/gcc-3.2: window.c:90: warning: `do_mouse_wheel_msg' declared `static' but never defined Introduced in 1.185 [r1499]. This function doesn't appear to ever have existed. PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d632e09759a1f5c6405049d93e0e1f30 Text-delta-base-sha1: 6df7d681be01fe2836102559d1b645b26005edcd Text-content-length: 113 Text-content-md5: 6349179674829964f2e78e5cc2cacb2e Text-content-sha1: 49b70a56d385ad2b792af3fd21e375bc27c39375 Content-length: 154 K 15 cvs2svn:cvs-rev V 5 1.220 PROPS-END SVN KGnKScrollInfo(hwnd, SB_VERT, &si, TRUE); } Context get_ctx(void *frontend) { ??K Revision-number: 2335 Prop-content-length: 228 Content-length: 228 K 8 svn:date V 27 2002-12-16T21:02:15.000000Z K 7 svn:log V 127 Summary: Pageant + explicit keyfile gives non-optimal behaviour Bit sketchy on details -- needs filling out when time permits K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pubkeyfile-and-pageant Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 625 Text-content-md5: 4249e5a119f6a1f4d6fc3f815b03587a Text-content-sha1: cd8b5bd1590de535f31bc56073dc247b03c4c8e4 Content-length: 741 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNcccSummary: Pageant + explicit keyfile gives non-optimal behaviour Class: bug Difficulty: fun Priority: medium Present-in: 0.53b Content-type: text/x-html-body

    The behaviour of the PuTTY tools when Pageant is running and a keypair is explicitly specified (via -i, configuration or whatever) isn't ideal.

    This is particularly obvious when several keys are valid for a given connection (e.g., if one is trying to use a particular key to run a particular forced command). However, I suspect the issues aren't limited to this case.

    FIXME: write up suggested fix for above problem Revision-number: 2336 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2002-12-16T21:24:17.000000Z K 7 svn:log V 40 Summarise (sorta) the arguments so far. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pubkeyfile-and-pageant Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4249e5a119f6a1f4d6fc3f815b03587a Text-delta-base-sha1: cd8b5bd1590de535f31bc56073dc247b03c4c8e4 Text-content-length: 1073 Text-content-md5: 434ecf3171140ee59f2e9e6bcf58da3c Text-content-sha1: a8dc8ff6817663dc786a5529aaf6e893c251df22 Content-length: 1112 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNcH*Here is my (JTN) suggested algorithm for fixing the immediate problem (assuming that all the primitives mentioned are always available):

    array_t pageant_ids[];
    
      if (Pageant is running) {
        pageant_ids := (Pageant's list of key IDs)
      } else {
        pageant_ids := {}
      }
    
      if (key k configured in PuTTY exists) {
        if (server would accept k.id) {
          bool success
          if (k.id in pageant_ids[]) {
            success = do_pageant_auth (k.id)
          } else {
            success = do_putty_auth (k)
          }
          if (success) goto auth_success
        }
      } else {
        foreach id in pageant_ids[] {
          if (server would accept id) {
            goto auth_success if (do_pageant_auth (id))
          }
        }
      }
      /* give up on public key auth */

    An alternative and perhaps cleaner solution is to separate `public key auth with specified file' and `public key auth with Pageant' and allow them to be individual disabled; this ties nicely into auth-pref. FIXME: characterise any problems other than this one Revision-number: 2337 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:11.415809Z PROPS-END Revision-number: 2338 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:11.423566Z PROPS-END Revision-number: 2339 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:11.457904Z PROPS-END Revision-number: 2340 Prop-content-length: 291 Content-length: 291 K 8 svn:date V 27 2002-12-18T09:47:20.000000Z K 7 svn:log V 190 logeventf()'s first argument is ssh, not ssh->frontend! This is what I get for making the latter a `void *' - type checking deserts me in my hour of need. Should fix Andrey Borzenkov's bug. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 095db0fc00541a5bbf14051428cbe3f4 Text-delta-base-sha1: aae0556a18d03230013c32680af8724304cac211 Text-content-length: 51 Text-content-md5: 2a59c6fdf380c39b46d52703dc50741d Text-content-sha1: f33d1286ce23a0bc2a958e26b938aee5f00994b2 Content-length: 92 K 15 cvs2svn:cvs-rev V 5 1.246 PROPS-END SVN{k~{!,, Revision-number: 2341 Prop-content-length: 230 Content-length: 230 K 7 svn:log V 129 `Leonid' points out a stupid mistake in MD5 HMAC initialisation: we should initialise _both_ MD5 states, not the same one twice. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-12-18T09:54:55.000000Z PROPS-END Node-path: putty/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ca940d6e99d5dc7d7f5973262586d95f Text-delta-base-sha1: 70e461fb65ed00ae5ec665ee149652ab3c912f70 Text-content-length: 47 Text-content-md5: 98ec91035b31c7bd956472946233eb97 Text-content-sha1: 1bf6b77a5165e749e7f68e33fe7a55be312331ec Content-length: 86 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN++ u61]); MD5Update(&keys[1 Revision-number: 2342 Prop-content-length: 254 Content-length: 254 K 8 svn:date V 27 2002-12-18T10:06:38.000000Z K 7 svn:log V 153 BUG_SSH2_DERIVEKEY is apparently only present in SSH 2.0.11 and before, not in 2.0.13. Verified on at least one host. Fixes bug `ssh2-keyderive-nonbug'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2a59c6fdf380c39b46d52703dc50741d Text-delta-base-sha1: f33d1286ce23a0bc2a958e26b938aee5f00994b2 Text-content-length: 117 Text-content-md5: f7afa9134a37dd511c3644badd2b765e Text-content-sha1: fcbded294e2175e26f055e857fd7abdf277341fd Content-length: 158 K 15 cvs2svn:cvs-rev V 5 1.247 PROPS-END SVN )T\0*", imp) || wc_match("2.0.1[01]*", imp) {!{ c->remoteid, PKT_END); Revision-number: 2343 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2002-12-18T10:07:32.000000Z K 7 svn:log V 47 This should be fixed in snapshots after today. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/ssh2-keyderive-nonbug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fe2d2d83f58a5abc8e85313843186d9b Text-delta-base-sha1: fc4a7caf4076863807ae821550d689676039fac3 Text-content-length: 41 Text-content-md5: 5fef56e0cac753bbe8076cc1f7efafa5 Text-content-sha1: c67345ae3692c080e2d1d0eaa0d8f3316ed659e9 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN. &t%Fixed-in: 2002-12-19 Revision-number: 2344 Prop-content-length: 393 Content-length: 393 K 8 svn:date V 27 2002-12-18T11:39:25.000000Z K 7 svn:log V 292 Implement `portfwd-loopback-choice'. Works on local side in Unix as well, though it's a lot less useful since you still can't bind to low-numbered ports of odd loopback IPs. Should work in principle for SSH2 remote forwardings as well as local ones, but OpenSSH seems unwilling to cooperate. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 111fe3fcd22a7de8fa0db61f74a07acc Text-delta-base-sha1: c50f4be528f0e7cba04b22b1d4eef5521126ca35 Text-content-length: 570 Text-content-md5: cb46bce524087bf3e6cf5e0cc3f48b67 Text-content-sha1: 3f4cd75ede81a6a1febd3a91fa19c3e48e7cda8a Content-length: 609 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNd^P]m, *q/* * We expect _at least_ two colons in this string. The * possible formats are `sourceport:desthost:destport', or * `sourceip:sourceport:desthost:destport' if you're * specifying a particular loopback address. We need to * replace the one between source and dest with a \t; this * means we must find the second-to-last colon in the * string. */ q = qq = strchr(ptr, ':'); while (qq) { char *qqq = strchr(qq+1, ':'); if (qqq) q = qq; qq = qqq; } if (q) *q = '\t'; /* replace second-last colon Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bac1d629ca9d756658d8f50d2b63e257 Text-delta-base-sha1: 2141fed1aec06e2e83373354b630cde7841dc2ab Text-content-length: 831 Text-content-md5: 8a4227e12ef602cdadaec6bf28a1d253 Text-content-sha1: 28d8c9f6b5b7e57b3ee4e58cf621c799696cc75c Content-length: 871 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNzj"e5mc\versionid $Id: config.but,v 1.45 2002/12/18 11:39:25In the \q{Source port} box, you can also optionally enter an IP address to listen on. Typically a Windows machine can be asked to listen on any single IP address in the \cw{127.*.*.*} range, and all of these are loopback addresses available only to the local machine. So if you forward (for example) \c{127.0.0.5:79} to a remote machine's \cw{finger} port, then you should be able to run commands such as \c{finger fred@127.0.0.5}. This can be useful if the program connecting to the forwarded port doesn't allow you to change the port number it uses. This feature is available for local-to-remote forwarded ports; SSH1 is unable to support it for remote-to-local ports, while SSH2 can support it in theory but servers will not necessarily cooperate Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 70cf421f27cca80a6bbd9db69155f452 Text-delta-base-sha1: 09e4c94ec2741cd572f44cd1ef15a8d2d3844ca1 Text-content-length: 178 Text-content-md5: 9af76e4dd91c71da9e5e5a3e39be21c8 Text-content-sha1: cab24dccc463b2fc0f64efc16fe22207774764cc Content-length: 217 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN) 9_bG\versionid $Id: using.but,v 1.9 2002/12/18 11:39:25 simon (You can also use a local loopback address here; see \k{config-ssh-portfwd} for more details.) Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fda3db94f1d81162b1bf56c31aeec3b7 Text-delta-base-sha1: 43e43dd32bd2ca3c00477ca1c4a4f69b1c930e7f Text-content-length: 57 Text-content-md5: 00fa9355aa242c8f41ad613cca71b5ca Text-content-sha1: f5e90870449d6c627aca667e5195fe0e1285459a Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNWuJJJCchar *srcaddr, char *srcaddr, Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bf976d024d105961a14ac7da0372ec56 Text-delta-base-sha1: c6da79d9d0aa1f7a422a4856b4af41d3fce4a0a7 Text-content-length: 138 Text-content-md5: c13b20b7676a8a66bf398e0220c57d78 Text-content-sha1: 2143ab53e758729b3081312b0ba2df5e2be33792 Content-length: 178 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNVnsep8.((srcaddr:)port */ char *pfd_addforward(char *desthost, int destport, char *srcaddr, int port, srcaddr, Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b6c744c23686fc1dec2c39606d881847 Text-delta-base-sha1: 0feabd483fac35acc6d945b7ff94dd2204fa8ecf Text-content-length: 54 Text-content-md5: 0d425cdf73685543fc8a9bbb0a5464f1 Text-content-sha1: cbb9fceac9862110f04e41545fe1c596c147c4b7 Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNzA3Gchar *srcaddr, srcaddr, Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f7afa9134a37dd511c3644badd2b765e Text-delta-base-sha1: fcbded294e2175e26f055e857fd7abdf277341fd Text-content-length: 3011 Text-content-md5: e416c59e257b6899e15a451fc5406d44 Text-content-sha1: 0b4ba5824ca443355393c7dd9f7506e65e01960a Content-length: 3052 K 15 cvs2svn:cvs-rev V 5 1.248 PROPS-END SVN9<c.U 9!O\=jX{Nchar *srcaddr, int port,saddrsaddr[0] = '\0'; n = 0; while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != '\t') { if (*ssh->portfwd_strptr == ':') { /* * We've seen a colon in the middle of the * source port number. This means that * everything we've seen until now is the * source _address_, so we'll move it into * saddr and start sports from the beginning * again. */ ssh->portfwd_strptr++; sports[n] = '\0'; strcpy(saddr, sports); n = 0; } if (n < 255) sports[n++] = *ssh->portfwd_strptr++; } { if (n < 255) host[n++] = *ssh->portfwd_strptr++; } { if (n < 255) dports[n++] = *ssh->portfwd_strptr++; }*saddr ? saddr : NULL, sport, ssh); logeventf(ssh, "Local port %.*s%.*s%.*s%.*s%d%.*s" " forwarding to %s:%.*s%.*s%d%.*s", (int)(*saddr?strlen(saddr):0), *saddr?saddr:NULL, (int)(*saddr?1:0), ":saddr) { logeventf(ssh, "SSH1 cannot handle source address spec \"%s:%d\"; ignoring", saddr, sport); }ZKiUudU]Ku_!"i\j2T!M:channel. */ unsigned i = GET_32BIT(ssh->pktin.bodyc && ((int)c->remoteid) != -1) { int closetype; closetype = (ssh->pktin.type == SSH1_MSG_CHANNEL_CLOSE ? 1 : 2); if ((c->closes == 0) && (c->type == CHAN_X11)) { logevent("Forwarded X11 connection terminated"); assert(c->u.x11.s != NULL); x11_close(c->u.x11.s); c->u.x11.s = NULL; } if ((c->closes == 0) && (c->type == CHAN_SOCKDATA)) { logevent("Forwarded port closed"); assert(c->u.pfd.s != NULL); pfd_close(c->u.pfd.s); c->u.pfd.s = NULL; } c->closes |= (closetype << 2); /* seen this message */ if (!(c->closes & closetype)) { send_packet(ssh, ssh->pktin.type, PKT_INT,saddrsaddr[0] = '\0'\t') { if (*ssh->portfwd_strptr == ':') { /* * We've seen a colon in the middle of the * source port number. This means that * everything we've seen until now is the * source _address_, so we'll move it into * saddr and start sports from the beginning * again. */ ssh->portfwd_strptr++; sports[n] = '\0'; strcpy(saddr, sports); n = 0; } if (n < 255) sports[n++] = *ssh->portfwd_strptr++; } { if (n < 255) host[n++] = *ssh->portfwd_strptr++; } { if (n < 255) dports[n++] = *ssh->portfwd_strptr++; }*saddr ? saddr : NULL, sport, ssh); logeventf(ssh, "Local port %.*s%.*s%.*s%.*s%d%.*s" " forwarding to %s:%.*s%.*s%d%.*s", (int)(*saddr?strlen(saddr):0), *saddr?saddr:NULL, (int)(*saddr?1:0), ":" "%.*s%.*s%.*s%.*s%d%.*s" " forward to %s:%.*s%.*s%d%.*s", (int)(*saddr?strlen(saddr):0), *saddr?saddr:NULL, (int)(*saddr?1:0), ":*saddr) ssh2_pkt_addstring(ssh, saddr); Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 11cf1f6ec3de78c985e63ad8551cc2cb Text-delta-base-sha1: 9467791449bb0dd755a6998a45bdac54ff3365c1 Text-content-length: 843 Text-content-md5: d1f3e4c149ff6ac14910c33ad2cd1756 Text-content-sha1: 8587100119ba53c9c17083c57c89cc07ae8cfd94 Content-length: 882 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNZ'C_o|ZiJiT,#define ipv4_is_loopback(addr) (inet_netof(addr) == IN_LOOPBACKNET)char *srcaddr, /* FIXME: srcaddr is ignored for IPv6, because I (SGT) don't * know how to do it. :-) */int got_addr = 0; a.sin_family = AF_INET; /* * Bind to source address. First try an explicitly * specified one... */ if (srcaddr) { a.sin_addr.s_addr = inet_addr(srcaddr); if (a.sin_addr.s_addr != INADDR_NONE) { /* Override localhost_only with specified listen addr. */ ret->localhost_only = ipv4_is_loopback(a.sin_addr); got_addr = 1; } } /* * ... and failing that, go with one of the standard ones. */ if (!got_addr) { if (local_host_only) a.sin_addr.s_addr = htonl(INADDR_LOOPBACK); else a.sin_addr.s_addr = htonl(INADDR_ANY); } !ipv4_is_loopback(isa.sin_addr) Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 95ca3a59dddbc0f9bb1014474e984beb Text-delta-base-sha1: 39f5608f345abd9ffa7bc589357c431a33112eaa Text-content-length: 921 Text-content-md5: f945c696fa4f34081d61cb73a3cf2ef8 Text-content-sha1: 0f35210d752d3aebea9eb90cbfc4b0434bca3248 Content-length: 961 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN 4*aU[}l^c2u#define ipv4_is_loopback(addr) \ ((ntohl(addr.s_addr) & 0xFF000000L) == 0x7F000000L)char *srcaddr, /* FIXME: srcaddr is ignored for IPv6, because I (SGT) don't * know how to do it. :-) */int got_addr = 0; a.sin_family = AF_INET; /* * Bind to source address. First try an explicitly * specified one... */ if (srcaddr) { a.sin_addr.s_addr = inet_addr(srcaddr); if (a.sin_addr.s_addr != INADDR_NONE) { /* Override localhost_only with specified listen addr. */ ret->localhost_only = ipv4_is_loopback(a.sin_addr); got_addr = 1; } } /* * ... and failing that, go with one of the standard ones. */ if (!got_addr) { if (local_host_only) a.sin_addr.s_addr = htonl(INADDR_LOOPBACK); else a.sin_addr.s_addr = htonl(INADDR_ANY); } !ipv4_is_loopback(isa.sin_addr) Revision-number: 2345 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 25 This should now be done. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-12-18T11:39:43.000000Z PROPS-END Node-path: putty-wishlist/data/portfwd-loopback-choice Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 43bb9732baf337d9032cd9e5e2fff972 Text-delta-base-sha1: 196879fc2ca51373c23f06c21860d13ca2ace0c6 Text-content-length: 41 Text-content-md5: 0be25301792ea4e076f2f2bd010283e7 Text-content-sha1: f434662ff5cff37853dc454349f0137776ab0e4e Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN yFixed-in: 2002-12-19 Revision-number: 2346 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2002-12-18T11:49:14.000000Z K 7 svn:log V 184 Improve the tab order in the Tunnels box: the `Add' button should happen _after_ all the controls that set up the forwarding, since that's the obvious order you'd want to use them in. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3267c8db2c49d6e855e0c787a6d0fc10 Text-delta-base-sha1: 70e75cbad5a32b1e0a8b2e9f97895b0d044a5ed3 Text-content-length: 694 Text-content-md5: 36512056b2683dfb6c8689326e04a404 Text-content-sha1: c5234322ec1ba1426204075dcba7548830b60be4 Content-length: 734 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNmM ? OMs)&3 Then we have a bareradioline, which is included in * this control group because it belongs before the `Add' button in * the tab orde, char *r1text, int r1id, char *r2text, int r2id) { RECT r, button_/* * We postpone creation of the button until we've * done everything else, since it belongs last in * the tab order. */ button_r = r; /* structure copy */ } } cp->ypos += height + GAPWITHIN; } bareradioline(cp, 2, r1text, r1id, r2text, r2id, NULL); /* Create the postponed button. */ doctl(cp, button_r, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 0, btext, bid); } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 835aed6ac19f280d45af50f749076c6b Text-delta-base-sha1: 326b158f98506ecf9ae60f50872ecc51bf011a5d Text-content-length: 140 Text-content-md5: a220c6cd365836c163973a025caf3752 Text-content-sha1: f460417732b4b70d5c98a2daea969e586896d60c Content-length: 181 K 15 cvs2svn:cvs-rev V 5 1.194 PROPS-END SVN` Dm, "&Local", IDC_PFWDLOCAL, "Re&mote", IDC_PFWDREMOTESION_400; #else of.lStructmQQ Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e85ac1bbd602e4f7f0aea88e6f8b7159 Text-delta-base-sha1: 6fa847ca6c7f000ff7d0c3c5f975b69636aca4fd Text-content-length: 75 Text-content-md5: 5049d9790279f68137c79eace6d9210d Text-content-sha1: 9eccf1b536725c2605e33c4c2b48243bbc59ed22 Content-length: 115 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN C 6U8S, char *r1text, int r1id, char *r2text, int r2 Revision-number: 2347 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2002-12-18T11:51:09.000000Z K 7 svn:log V 36 Placate a trivial compiler warning. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 43b9f855d96ac4d42bb0bc2dce90818c Text-delta-base-sha1: 34d59f497363f55e1dfb83ed76a07d958821245f Text-content-length: 87 Text-content-md5: eb7ea50b23b61ac7a49a6a4d3053ffe1 Text-content-sha1: 1bf389f4cee105c846fc1509d8b1431cf198fc16 Content-length: 128 K 15 cvs2svn:cvs-rev V 5 1.122 PROPS-END SVN O_(char) (0xFF & ldata[top.x + 1])~~nt; term->selmo Revision-number: 2348 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2002-12-18T12:18:54.000000Z K 7 svn:log V 81 Stop proxying connections to localhost by default; should fix `x11-proxy-crash'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8a4227e12ef602cdadaec6bf28a1d253 Text-delta-base-sha1: 28d8c9f6b5b7e57b3ee4e58cf621c799696cc75c Text-content-length: 412 Text-content-md5: b0d35ad97b3b6dc04d1bfb3a703b253e Text-content-sha1: 61814084e84c1e4365220f7e17887f8f91952277 Content-length: 452 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNj6~5I0:\versionid $Id: config.but,v 1.46 2002/12/18 12:18:54Connections to the local host (the host name \c{localhost}, and any loopback IP address) are never proxied, even if the proxy exclude list does not explicitly contain them. It is very unlikely that this behaviour would ever cause problems, but if it does you can change it by enabling \q{Consider proxying local host connections} Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 00fa9355aa242c8f41ad613cca71b5ca Text-delta-base-sha1: f5e90870449d6c627aca667e5195fe0e1285459a Text-content-length: 97 Text-content-md5: 7bd2f020aa00b28bc6abadafb6509168 Text-content-sha1: a979a751ff9594bf8618ecab0f64f0a06b176bec Content-length: 137 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNuC KKcint sk_hostname_is_local(char *name); int sk_address_is_local(SockAddr addr Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0d425cdf73685543fc8a9bbb0a5464f1 Text-delta-base-sha1: cbb9fceac9862110f04e41545fe1c596c147c4b7 Text-content-length: 270 Text-content-md5: acc7939f84b3efc33404613a35270b96 Text-content-sha1: 79e407cb6790f7f2953f632d8f584388b46a9566 Content-length: 310 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN ss * Check the host name and IP against the hard-coded * representations of `localhost'. */ if (!cfg.even_proxy_localhost && (sk_hostname_is_local(hostname) || sk_address_is_local(addr))) return 0; /* do not proxy */ Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cf7a60bfc2182c59c5232dd9ab3adfd8 Text-delta-base-sha1: ffb7651d90ea5b8209e15888b3a24b18b2491571 Text-content-length: 47 Text-content-md5: fed0820508c6d31ae5307561eea69381 Text-content-sha1: 5d4af693b49ea60cc5606a21ab84587d67dd93a2 Content-length: 88 K 15 cvs2svn:cvs-rev V 5 1.171 PROPS-END SVNFd %'int even_proxy_localhost Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 44eadf72f2587e22aefe20a001b522ea Text-delta-base-sha1: d419a5835a3ab410138f21469018876d868776d3 Text-content-length: 105 Text-content-md5: f3eb366deaecbb0f5e5683eccb0f1f27 Text-content-sha1: 8339797212ff3c2841bb32bb38a102caff9ea9a1 Content-length: 145 K 15 cvs2svn:cvs-rev V 4 1.90 PROPS-END SVNM\L&~NLocalhost", cfg->even_proxy_localhoLocalhost", 0, &cfg->even_proxy_localhost Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d1f3e4c149ff6ac14910c33ad2cd1756 Text-delta-base-sha1: 8587100119ba53c9c17083c57c89cc07ae8cfd94 Text-content-length: 263 Text-content-md5: 764b2488f3112a1ff1b938f73406228b Text-content-sha1: 1548aaad5a8d7ec3bd2f872c5c2192cf95e8a7a0 Content-length: 302 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNZLggopsxLhostname_is_local(char *name) { return !strcmp(name, "localhost"); } int sk_address_is_local(SockAddr addrreturn ipv4_is_loopback(a); #ifdef IPV6 } else { FIXME; /* someone who can compile for IPV6 had better do this bit Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a220c6cd365836c163973a025caf3752 Text-delta-base-sha1: f460417732b4b70d5c98a2daea969e586896d60c Text-content-length: 776 Text-content-md5: 92bb9eecba57bb41e7f511bb6f52223c Text-content-sha1: b2fdcc5f7a1881cd771522beee99efe8c07e51f5 Content-length: 817 K 15 cvs2svn:cvs-rev V 5 1.195 PROPS-END SVN1 bHR2 TS6TRmjLOCALHOScase IDC_PROXYLOCALHOSCheckDlgButton(hwnd, IDC_PROXYLOCALHOST, cfg.even_proxy_localhocheckbox(&cp, "Consider pro&xying local host connections", IDC_PROXYLOCALHOSTLOCALHOST cfg.even_proxy_localhost = IsDlgButtonChecked(hwnd, IDC_PROXYLOCALHOST);Qz))Q_CHANGE) GetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile, sizeof(cfg.keyfile) - 1); break; case IDC_CMDEDIT: if (HIWORD(wParam) == EN_CHANGE) GetDlgItemText(hwnd, IDC_CMDEDIT, cfg.remote_cmd, sizeof(cfg.remote_cmd) - 1); break; case IDC_PKBUTTON: memset(&of, 0, sizeof(of)); #ifdef OPENFILENAME_SIZE_VERSION_400 of.lStructSize = OPENFILENAME_SIZE_VERSION_400; #else of.lStruct Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f945c696fa4f34081d61cb73a3cf2ef8 Text-delta-base-sha1: 0f35210d752d3aebea9eb90cbfc4b0434bca3248 Text-content-length: 263 Text-content-md5: b36db26773f72965310a092cf35bf857 Text-content-sha1: f59e556a232703f4fb15f27d15b7d83ff0c603b0 Content-length: 303 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN4&g2op>xhostname_is_local(char *name) { return !strcmp(name, "localhost"); } int sk_address_is_local(SockAddr addrreturn ipv4_is_loopback(a); #ifdef IPV6 } else { FIXME; /* someone who can compile for IPV6 had better do this bit Revision-number: 2349 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 This should be fixed now (phew!). K 10 svn:author V 5 simon K 8 svn:date V 27 2002-12-18T12:19:13.000000Z PROPS-END Node-path: putty-wishlist/data/x11-proxy-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 076dd51fb966cd049968c6d240c81943 Text-delta-base-sha1: f7eadcd8721cb8059f1ce49a992e7f979c941430 Text-content-length: 41 Text-content-md5: cd4cb9469cfecb49b2675a2a432df45d Text-content-sha1: f4c151df4bb2bbd61223c190f7c70ec3720cbffc Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN$9 ,y+Fixed-in: 2002-12-19 Revision-number: 2350 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2002-12-18T12:32:18.000000Z K 7 svn:log V 70 Better reporting of DNS errors while trying to find the proxy server. K 10 svn:author V 5 simon PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: acc7939f84b3efc33404613a35270b96 Text-delta-base-sha1: 79e407cb6790f7f2953f632d8f584388b46a9566 Text-content-length: 195 Text-content-md5: 09243f1b70fa63b49b84ce482847b421 Text-content-sha1: aca42da5866501d337b3f169afe856a26bfb236d Content-length: 235 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN "Wlproxy_canonical_name, *errif ((err = sk_addr_error(proxy_addr))) { ret->error = "Proxy error: Unable to resolve proxy host name"; return (Socket)ret; } Revision-number: 2351 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2002-12-18T13:35:03.000000Z K 7 svn:log V 36 Silly suggestion that just came in. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/regexp-logging Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 535 Text-content-md5: 5ba9a44043aff44d81dc206c5baa6468 Text-content-sha1: 56a0a3133264b409d375a24f6dd9030ad586cd26 Content-length: 651 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN  Summary: Selective logging based on regular expressions Class: wish Priority: low Difficulty: tricky Content-type: x-html-body

    >Regex logging
    >   Actually if I had any sense, I'd just grep putty's log instead, I
    >   guess.  It'd still be nice to grab matching text and save to a   
    >   separate file directly though, maybe with a timestamp or something.  I
    >   want the moon on a stick, me.
    

    If we were to do this, we'd need to be able to handle having arbitrarily many such logs and similar fun things. Revision-number: 2352 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2002-12-18T13:46:47.000000Z K 7 svn:log V 98 We get asked for this (or its moral equivalent) often enough that it ought to be on the wishlist. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/moon-on-stick Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 164 Text-content-md5: d32cb9c619f62fd372d7c581debd02bd Text-content-sha1: 358716f35cf8f31abebed5fa816606e08536df81 Content-length: 280 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: The Moon, on a stick Class: wish Priority: low Difficulty: mayhem Content-type: text/x-html-body

    Several users want the moon on a stick. Revision-number: 2353 Prop-content-length: 678 Content-length: 678 K 8 svn:date V 27 2002-12-18T16:23:11.000000Z K 7 svn:log V 577 Support for doing DNS at the proxy end. I've invented a new type of SockAddr, which just contains an unresolved hostname and is created by a stub function in *net.c. It's an error to pass this to most of the real-meat functions in *net.c; these fake addresses should have been dealt with by the time they get down that far. proxy.c now contains name_lookup(), a wrapper on sk_namelookup() which decides whether or not to do real DNS, and the individual proxy implementations each deal sensibly with being handed an unresolved address and avoid ever passing one down to *net.c. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b0d35ad97b3b6dc04d1bfb3a703b253e Text-delta-base-sha1: 61814084e84c1e4365220f7e17887f8f91952277 Text-content-length: 1805 Text-content-md5: 15975e0ec2f2050f2d4f3788215a76d3 Text-content-sha1: a6c8877c830bcb1aa9036e978bb0896b81cfc3a6 Content-length: 1845 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVN6soT5:0\versionid $Id: config.but,v 1.47 2002/12/18 16:23:10Note that if you are doing DNS at the proxy (see \k{config-proxy-dns}), you should make sure that your proxy exclusion settings do not depend on knowing the IP address of a host. If the name is passed on to the proxy without PuTTY looking it up, it will never know the IP address and cannot check it against your list. \S{config-proxy-dns} Name resolution when using a proxy \cfg{winhelp-topic}{proxy.dns} If you are using a proxy to access a private network, it can make a difference whether DNS name resolution is performed by PuTTY itself (on the client machine) or performed by the proxy. The \q{Do DNS name lookup at proxy end} configuration option allows you to control this. If you set it to \q{No}, PuTTY will always do its own DNS, and will always pass an IP address to the proxy. If you set it to \q{Yes}, PuTTY will always pass host names straight to the proxy without trying to look them up first. If you set this option to \q{Auto} (the default), PuTTY will do something it considers appropriate for each type of proxy. Telnet and HTTP proxies will have host names passed straight to them; SOCKS proxies will not. Note that if you are doing DNS at the proxy, you should make sure that your proxy exclusion settings (see \k{config-proxy-exclude}) do not depend on knowing the IP address of a host. If the name is passed on to the proxy without PuTTY looking it up, it will never know the IP address and cannot check it against your list. The original SOCKS 4 protocol does not support proxy-side DNS. There is a protocol extension (SOCKS 4A) which does support it, but not all SOCKS 4 servers provide this extension. If you enable proxy DNS and your SOCKS 4 server cannot deal with it, this might be why Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7bd2f020aa00b28bc6abadafb6509168 Text-delta-base-sha1: a979a751ff9594bf8618ecab0f64f0a06b176bec Text-content-length: 146 Text-content-md5: 0f87ba590c3c5cd4e473bb2efac0f7f7 Text-content-sha1: b9541e80bc7902286bfaa8d2c4937dc764bdfa47 Content-length: 186 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNC:q]+[=SockAddr name_lookup(char *host, int port, char **canonicalnameSockAddr sk_nonamelookup(char *host, ADDRTYPE_NAME Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c13b20b7676a8a66bf398e0220c57d78 Text-delta-base-sha1: 2143ab53e758729b3081312b0ba2df5e2be33792 Text-content-length: 47 Text-content-md5: e4383dddcbdb1a380121c9542cb6f2f3 Text-content-sha1: f7fca172c0dc7648baa735a1e9c64ce9c6e13944 Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN 63Lname_lookup(hostname, port Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 09243f1b70fa63b49b84ce482847b421 Text-delta-base-sha1: aca42da5866501d337b3f169afe856a26bfb236d Text-content-length: 2219 Text-content-md5: dc8c6f3ff1c778abb08792825e7a0399 Text-content-sha1: 238d9760f94ba4f0899e1025ff899dccc5cabcdf Content-length: 2259 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN%m03l*1omZ{`OVaxExo2gQQygn~;TU}8)vOM#define do_proxy_dns \ (cfg.proxy_dns == 2 || \ (cfg.proxy_dns == 1 && cfg.proxy_type != PROXY_SOCKS))/* * This function can accept a NULL pointer as `addr', in which case * it will only check the host name. */ (addr && sk_address_is_local(addr)if (addr) { sk_getaddr(addr, hostip, 64); hostip_len = strlen(hostip); } (addr && strnicmp(hostip + hostip_len - (e - s - 1), exclude_list + s + 1, e - s - 1) == 0)(addr && strnicmp(hostip, exclude_list + s, e - s - 1) == 0)addr && Addr name_lookup(char *host, int port, char **canonicalname) { if (cfg.proxy_type != PROXY_NONE && do_proxy_dns && proxy_for_destination(NULL, host, port)) { *canonicalname = dupstr(host); return sk_nonamelookup(host); } return sk_namelookup(host, canonicalname)512]; sk_getaddr(p->remote_addr, dest, lenof(dest), type, namelen; char *command, addr[4], hostname[512]; type = sk_addrtype(p->remote_addr); if (type == ADDRTYPE_IPV6 else if (type == ADDRTYPE_IPV4) { namelen = 0; sk_addrcopy(p->remote_addr, addr); } else { /* type == ADDRTYPE_NAME */ sk_getaddr(p->remote_addr, hostname, lenof(hostname)); namelen = strlen(hostname) + 1; /* include the NUL */ addr[0] = addr[1] = addr[2] = 0; addr[3] = 1; } length = strlen(cfg.proxy_username) + namelenmemcpy(command + 4, addr, 4); /* hostname */ memcpy(command + 8 + strlen(cfg.proxy_username) + 1, hostname, namelen512]; int len; int type; type = sk_addrtype(p->remote_addr); if (type == ADDRTYPE_IPV4) { len = 10; /* 4 hdr + 4 addr + 2 trailer */ command[3] = 1; /* IPv4 */ sk_addrcopy(p->remote_addr, command+4); } else if (type == ADDRTYPE_IPV6) { len = 22; /* 4 hdr + 16 addr + 2 trailer */ command[3] = 4; /* IPv6 */ sk_addrcopy(p->remote_addr, command+4); } else if (type == ADDRTYPE_NAME) { command[3] = 3; sk_getaddr(p->remote_addr, command+5, 256); command[4] = strlen(command+5); len = 7 + command[4]; /* 4 hdr, 1 len, N addr, 2 trailer512]; sk_getaddr(p->remote_addr, dest, lenof(dest) Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fed0820508c6d31ae5307561eea69381 Text-delta-base-sha1: 5d4af693b49ea60cc5606a21ab84587d67dd93a2 Text-content-length: 82 Text-content-md5: 458281fdfc1b62628842c725b0b5ca97 Text-content-sha1: 9be2b69dcb528b19fe52781fbfd8aa1485852b14 Content-length: 123 K 15 cvs2svn:cvs-rev V 5 1.172 PROPS-END SVNd% ;%Eenum { PROXYDNS_NO, PROXYDNS_AUTO, PROXYDNS_YES } proxy_dns Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: efacbce6b8e64a10f008d7bbb3409dbf Text-delta-base-sha1: f4c68e644984ed19c86e827bb1886e9baeb6121a Text-content-length: 42 Text-content-md5: 1a290eea1fbcf9b15f90aab7aed07702 Text-content-sha1: 91a591a7b29054b5ea60024776e11e641b269e5c Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN zy name_lookup(host, por Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9ff70fb03abe5e5bc81e1f79e8f815b7 Text-delta-base-sha1: 16411810560420133a72b7b119e2ed57a699a45c Text-content-length: 42 Text-content-md5: b85a97b50bbf759da04e3cb1c3e2ce58 Text-content-sha1: 055aa31100b36773017f213b82dde79ecf89e7ee Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN# l"}name_lookup(host, por Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f3eb366deaecbb0f5e5683eccb0f1f27 Text-delta-base-sha1: 8339797212ff3c2841bb32bb38a102caff9ea9a1 Text-content-length: 93 Text-content-md5: e9babca5b15df2170f94f7a5ae2c1ee0 Text-content-sha1: a1bb29740e9fe2090123f1ac431b7d959647ac80 Content-length: 133 K 15 cvs2svn:cvs-rev V 4 1.91 PROPS-END SVN\\@&eKDNS", cfg->proxy_dnsDNS", PROXYDNS_AUTO, &i); cfg->proxy_dns = i Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e416c59e257b6899e15a451fc5406d44 Text-delta-base-sha1: 0b4ba5824ca443355393c7dd9f7506e65e01960a Text-content-length: 68 Text-content-md5: cd0c729cf3069153b13be8ac6c5c20cb Text-content-sha1: dd26e8d644cdc3e6eb9081ff5045fcb921d73b11 Content-length: 109 K 15 cvs2svn:cvs-rev V 5 1.249 PROPS-END SVN  bname_lookup(host, porZ^Zs a Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c3021ba912513c614a59a6dc52a52e49 Text-delta-base-sha1: 056f594fb234d0649ea3625164670c3887145ee3 Text-content-length: 46 Text-content-md5: 36232298ec8332072b57d32daefdc6f1 Text-content-sha1: 5309215f1325601964ac6c67097fe678998f9940 Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNX\ +-name_lookup(host, por Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 764b2488f3112a1ff1b938f73406228b Text-delta-base-sha1: 1548aaad5a8d7ec3bd2f872c5c2192cf95e8a7a0 Text-content-length: 1736 Text-content-md5: 3c5476214f9ea0c596cdde304153d34c Text-content-sha1: 605a2290e8576e0c20d43375badc5221db709fb5 Content-length: 1775 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNLj5?jD exe)\OxiBAN~ * Which address family this address belongs to. AF_INET for * IPv4; AF_INET6 for IPv6; AF_UNSPEC indicates that name * resolution has not been done and a simple host name is held * in this SockAddr structure. char hostname[512]; /* Store an unresolved host name. */SockAddr sk_nonamelookup(char *host) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); ret->family = AF_UNSPEC; strncpy(ret->hostname, host, lenof(ret->hostname)); ret->hostname[lenof(ret->hostname)-1] = '\0'6) { FIXME; /* I don't know how to get a text form of an IPv6 address. */ } else #endif if (addr->family == AF_INET) { struct in_addr a; a.s_addr = htonl(addr->address); strncpy(buf, inet_ntoa(a), buflen); buf[buflen-1] = '\0'; } else { assert(addr->family == AF_UNSPEC); strncpy(buf, addr->hostname, buflen); buf[buflen-1] = '\0'; }6) else #endif if (addr->family == AF_INET) { struct in_addr a; a.s_addr = htonl(addr->address); return ipv4_is_loopback(a); } else { assert(addr->family == AF_UNSPEC); return 0; /* we don't know; assume not */ } } int sk_addrtype(SockAddr addr) { return (addr->family == AF_INET ? ADDRTYPE_IPV4 : #ifdef IPV6 addr->family == AF_INET6 ? ADDRTYPE_IPV6 : #endif ADDRTYPE_NAME); } void sk_addrcopy(SockAddr addr, char *buf) { assert(addr->family != AF_UNSPEC); #ifdef IPV6 if (addr->family == AF_INET6) { memcpy(buf, (char*) addr->ai, 16); } else #endif if (addr->family == AF_INET) { struct in_addr a; a.s_addr = htonl(addr->address); memcpy(buf, (char*) &a.s_addr, 4); }assert(addr->family != AF_UNSPEC); Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 92bb9eecba57bb41e7f511bb6f52223c Text-delta-base-sha1: b2fdcc5f7a1881cd771522beee99efe8c07e51f5 Text-content-length: 1578 Text-content-md5: 89e88fe9d5163803ca84130230cf8391 Text-content-sha1: f0de73a713df92ffcfd55b0d000e238172a46779 Content-length: 1619 K 15 cvs2svn:cvs-rev V 5 1.196 PROPS-END SVN?zHkx%o?r 7!@Z@&DNSSTATIC, IDC_PROXYDNSNO, IDC_PROXYDNSAUTO, IDC_PROXYDNSYESDNSSTATIC: case IDC_PROXYDNSNO: case IDC_PROXYDNSAUTO: case IDC_PROXYDNSYES: return "JI(`',`proxy.dnsCheckRadioButton(hwnd, IDC_PROXYDNSNO, IDC_PROXYDNSYES, cfg.proxy_dns == PROXYDNS_NO ? IDC_PROXYDNSNO : cfg.proxy_dns == PROXYDNS_YES ? IDC_PROXYDNSYES : IDC_PROXYDNSAUTOxdradioline(&cp, "Do &DNS name lookup at proxy end:", IDC_PROXYDNSSTATIC, 3, "No", IDC_PROXYDNSNO, "Auto", IDC_PROXYDNSAUTO, "Yes", IDC_PROXYDNSYES, NULLDNSNO: case IDC_PROXYDNSAUTO: case IDC_PROXYDNSYEScfg.proxy_dns = IsDlgButtonChecked(hwnd, IDC_PROXYDNSNO) ? PROXYDNS_NO : IsDlgButtonChecked(hwnd, IDC_PROXYDNSYES) ? PROXYDNS_YES : PROXYDNS_AUTO; }zA)Q7Q]7T]7NHzR( CIPHER_MAX, 0, hwnd, wParam, lParam); break; case IDC_SSHPROT1ONLY: case IDC_SSHPROT1: case IDC_SSHPROT2: case IDC_SSHPROT2ONLY { if (IsDlgButtonChecked(hwnd, IDC_SSHPROT1ONLY)) cfg.sshprot = 0; if (IsDlgButtonChecked(hwnd, IDC_SSHPROT1)) cfg.sshprot = 1; else if (IsDlgButtonChecked(hwnd, IDC_SSHPROT2)) cfg.sshprot = 2; else if (IsDlgButtonChecked(hwnd, IDC_SSHPROT2ONLY)) cfg.sshprot = 3; } break; case IDC_AUTHTIStis_auth = IsDlgButtonChecked(hwnd, IDC_AUTHTIS); break; case IDC_AUTHKIki_auth = IsDlgButtonChecked(hwnd, IDC_AUTHKI); break; case IDC_PK Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b36db26773f72965310a092cf35bf857 Text-delta-base-sha1: f59e556a232703f4fb15f27d15b7d83ff0c603b0 Text-content-length: 1727 Text-content-md5: a73ee1746986ed1fabb7e6932c82d15a Text-content-sha1: edc4c2c72b561044163ebe5f27fdc9c49ecf57fe Content-length: 1767 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVN&6Dmpj4D$Pex_e)'NZiK -RMnj< * Which address family this address belongs to. AF_INET for * IPv4; AF_INET6 for IPv6; AF_UNSPEC indicates that name * resolution has not been done and a simple host name is held * in this SockAddr structure. char hostname[512]; /* Store an unresolved host name. */SockAddr sk_nonamelookup(char *host) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); ret->family = AF_UNSPEC; strncpy(ret->hostname, host, lenof(ret->hostname)); ret->hostname[lenof(ret->hostname)-1] = '\0'6) { FIXME; /* I don't know how to get a text form of an IPv6 address. */ } else #endif if (addr->family == AF_INET) { struct in_addr a; a.s_addr = htonl(addr->address); strncpy(buf, inet_ntoa(a), buflen); buf[buflen-1] = '\0'; } else { assert(addr->family == AF_UNSPEC); strncpy(buf, addr->hostname, buflen); buf[buflen-1] = '\0'; }6) { FIXME; /* someone who can compile for IPV6 had better do this bit */ } else #endif if (addr->family == AF_INET) { struct in_addr a; a.s_addr = htonl(addr->address); return ipv4_is_loopback(a); } else { assert(addr->family == AF_UNSPEC); return 0; /* we don't know; assume not */ } } int sk_addrtype(SockAddr addr) { return (addr->family == AF_INET ? ADDRTYPE_IPV4 : #ifdef IPV6 addr->family == AF_INET6 ? ADDRTYPE_IPV6 : #endif ADDRTYPE_NAME); } void sk_addrcopy(SockAddr addr, char *buf) { assert(addr->family != AF_UNSPEC); #ifdef IPV6 if (addr->family == AF_INET6) { memcpy(buf, (char*) addr->ai, 16); } else #endif if (addr->family == AF_INET) { }assert(addr->family != AF_UNSPEC); Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e5fa5c15706d012858cb5d15b190e73b Text-delta-base-sha1: 4ec0dee43764d9c8406af02b3aa86adc6bfbbbf1 Text-content-length: 42 Text-content-md5: edec83c09b09a47fe9959738d43bfeee Text-content-sha1: 0729147fa0884555b084fca663969d8ee34f0e47 Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN_c P~aname_lookup(host, por Revision-number: 2354 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2002-12-18T16:24:18.000000Z K 7 svn:log V 25 This should now be done. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/proxy-lookup Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 117b5782a16009c470a32a4dcd1cb278 Text-delta-base-sha1: ffe27119e1db4e89fc1d7db16c568bd3e9734a24 Text-content-length: 148 Text-content-md5: a700c85ae7c78b6efbf525f843627f82 Text-content-sha1: b40b32846355e398615ed2be82fcbae2fdda34ff Content-length: 187 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNPP {VzkFixed-in: 2002-12-19

    SGT, 2002-12-18: Should now be fixed, although it will want some testing. Roll on tomorrow's snapshot. Revision-number: 2355 Prop-content-length: 155 Content-length: 155 K 7 svn:log V 55 Always good to know about existing implementations :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2002-12-19T11:01:25.000000Z PROPS-END Node-path: putty-wishlist/data/moon-on-stick Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d32cb9c619f62fd372d7c581debd02bd Text-delta-base-sha1: 358716f35cf8f31abebed5fa816606e08536df81 Text-content-length: 201 Text-content-md5: 48100ba34e1a68d0b3d50ec4a82ccec7 Text-content-sha1: dc000d8ea22a9c121ac1daf0ffdc483db05f287b Content-length: 240 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNL66

    SGT: Details of an existing implementation (may be useful for compatibility testing) are available here. Revision-number: 2356 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2002-12-19T11:51:42.000000Z K 7 svn:log V 122 logeventf() shouldn't throw stuff at stderr, since it invokes the ssh.c logevent _macro_ which has already done so! Duhh. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cd0c729cf3069153b13be8ac6c5c20cb Text-delta-base-sha1: dd26e8d644cdc3e6eb9081ff5045fcb921d73b11 Text-content-length: 156 Text-content-md5: e78782a9469da8996b727a5db2e42548 Text-content-sha1: 2343d3d3fc12b820c99a006d8852e9493597ccf4 Content-length: 197 K 15 cvs2svn:cvs-rev V 5 1.250 PROPS-END SVNq(gqs a channel. */ unsigned i = GET_32BIT(ssh->pktin.body); struct ssh_channel *c; c = find234(ssh->channels, ^mmq Revision-number: 2357 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2002-12-19T12:18:46.000000Z K 7 svn:log V 56 PuTTY doesn't support BINARY mode, which is compulsory. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/telnet-binary Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 441 Text-content-md5: e5a74179c455a1a8c62cb8a54825790b Text-content-sha1: 2f8ef5c72327c6fdeba453543f581f4d3140497e Content-length: 557 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN+++Summary: PuTTY doesn't support the BINARY option Class: bug Priority: medium Difficulty: fun Present-in: 0.53b 2002-12-29 Content-type: text/x-html-body

    PuTTY doesn't support the TELNET BINARY option. RFC 1123 (section 3.3.3) states that TELNET implementations MUST support it, so its absence is a bug. Revision-number: 2358 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2002-12-19T14:22:16.000000Z K 7 svn:log V 117 First crack at an implementation of TELOPT_BINARY, which apparently RFC 1123 (host requirements) says is compulsory. K 10 svn:author V 5 simon PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 36232298ec8332072b57d32daefdc6f1 Text-delta-base-sha1: 5309215f1325601964ac6c67097fe678998f9940 Text-content-length: 631 Text-content-md5: 838ebcdf4615694944c11dad8266526c Text-content-sha1: 4758890fe09ac9e5fd4643105fd0238b60f4e56e Content-length: 671 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN\ .; W-&cMV,h2C ]\ ( (x) != IAC && \ (telnet->opt_states[o_we_bin.index] == ACTIVE || (x) != CR)OPTINDEX_WE_BIN, OPTINDEX_THEY_BINstatic const struct Opt o_we_bin = { WILL, WONT, DO, DONT, TELOPT_BINARY, OPTINDEX_WE_BIN, INACTIVE }; static const struct Opt o_they_bin = { DO, DONT, WILL, WONT, TELOPT_BINARY, OPTINDEX_THEY_BIN, INACTIVE&o_we_bin, &o_they_bin && telnet->opt_states[o_they_bin.index] != ACTIVE/* In BINARY mode, CR-LF becomes just CR. */ if (telnet->opt_states[o_we_bin.index] == ACTIVE) telnet->bufsize = sk_write(telnet->s, "\r", 2); else Revision-number: 2359 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2002-12-19T14:23:26.000000Z K 7 svn:log V 101 Record that an implementation now exists. Since it's untested, however, I haven't marked this fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/telnet-binary Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e5a74179c455a1a8c62cb8a54825790b Text-delta-base-sha1: 2f8ef5c72327c6fdeba453543f581f4d3140497e Text-content-length: 194 Text-content-md5: 53ab58244798a3ee5d146525d0047607 Text-content-sha1: e1682ed6b7cbb606d04f7273cd59c7c671b96148 Content-length: 233 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN+U +w3x*1

    SGT, 2002-12-19: I've checked in an implementation which should appear in 2002-12-20 and beyond, but it's untested as yet so I won't mark this fixed for the moment. Revision-number: 2360 Prop-content-length: 361 Content-length: 361 K 8 svn:date V 27 2002-12-19T14:24:28.000000Z K 7 svn:log V 260 Move the stderr output of event log messages in verbose mode to the general logging module rather than localising it in ssh.c. This means it should work in other protocols as well (notably Telnet, where it might actually be useful for debugging negotiations). K 10 svn:author V 5 simon PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e27dc8b6e606420d60314a3722a54a0c Text-delta-base-sha1: 4984fd6b4e75856a0ab7d4f9b94729c2e5386315 Text-content-length: 535 Text-content-md5: f858bfbba99b20990f6de90c532e9c45 Text-content-sha1: f781289caa90aafc5850160b8fc90a875ff968be Content-length: 574 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNE%y@wbjuP. Used in SSH packet logging mode; this is * also as convenient a place as any to put the output of Event Log * entries to stderr when a command-line tool is in verbose mode. * (In particular, this is a better place to put it than in the * front ends, because it only has to be done once for all * platforms. Platforms which don't have a meaningful stderr can * just avoid defining FLAG_STDERR(flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)) { fprintf(stderr, "%s\n", event); fflush(stderr); } Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e78782a9469da8996b727a5db2e42548 Text-delta-base-sha1: 2343d3d3fc12b820c99a006d8852e9493597ccf4 Text-content-length: 217 Text-content-md5: dc9f4c1dc2ce81231de34b2bf654db7f Text-content-sha1: 603b7b5500a4f837d0086d3295dd95bd59eea6f4 Content-length: 258 K 15 cvs2svn:cvs-rev V 5 1.251 PROPS-END SVN*-)Wlogevent(ssh->frontend, s&i, ssh_channelfind); if (c && ((int)c->remoteid) != -1) { int closetype; closetype = (ssh->pktin.type == SSH1_MSG_CHANNEL_CLOSEm\\ Revision-number: 2361 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2002-12-19T17:35:58.000000Z K 7 svn:log V 91 PuTTY doesn't correctly handle user names and passwords supplied as part of a telnet: URL. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/telnet-url-userinfo Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 504 Text-content-md5: 5e19ebed05c58903210787490731f0c5 Text-content-sha1: cb39253933557f2ad96e23047c2b7f4b030706e0 Content-length: 620 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNjjjSummary: PuTTY should support the full telnet: URL syntax Class: bug Priority: medium Difficulty: fun Present-in: 0.53b 2002-12-19 Content-type: text/x-html-body

    The telnet: URL scheme allows for specifying a user name and password to log in with. PuTTY doesn't currently support these. PuTTY should at least be capable of ignoring them if they're present, and should preferably do something useful with them. Revision-number: 2362 Prop-content-length: 196 Content-length: 196 K 7 svn:log V 98 Someone's observed that you can't override the hostname from a saved session on the command line. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-19T18:34:22.000000Z PROPS-END Node-path: putty-wishlist/data/cmdline-host-override Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 529 Text-content-md5: 722f0ee767e8618536e0ee34c1bf3db5 Text-content-sha1: b6c0f40071afe41ea8d7f54fd3d5d147ee3d9c51 Content-length: 645 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: -load overrides a host name specified on the command line Class: bug Priority: medium Difficulty: fun Content-type: text/x-html-body

    If both -load and a hostname are specified on PuTTY's command line, the hostname from the saved session takes precedence, which it shouldn't. This is because bare hostnames aren't passed through cmdline_process_param() in the same way that (e.g.) bare port numbers are, so they end up being trampled by cmdline_process_saved(). Revision-number: 2363 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:14.240891Z PROPS-END Revision-number: 2364 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Summary: Host key prompt doesn't state type of key K 10 svn:author V 5 jacob K 8 svn:date V 27 2002-12-20T15:28:31.000000Z PROPS-END Node-path: putty-wishlist/data/hostkey-prompt-type Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 258 Text-content-md5: 5c23448abcbb15b0e37bb61a09429058 Text-content-sha1: 50729839cfb0d006c99791f5d0ee97b8881ebc7c Content-length: 374 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNtttSummary: Host key prompt doesn't state type of key Class: semi-bug Priority: medium Difficulty: fun Content-type: text/x-html-body

    The host key prompt doesn't state the type of the host key (SSH-1 RSA, SSH-2 RSA, or SSH-2 DSA). It should. Revision-number: 2365 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2002-12-20T20:41:12.000000Z K 7 svn:log V 79 Summary: Escape sequence to execute command on the client side Priority: never K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/osc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2366 Text-content-md5: aa2ea6fbe2e8001d8eb0a3ab82cdacc4 Text-content-sha1: 86cd7e577ae5f503ad28b57731ae7974ea56ca26 Content-length: 2482 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN000Summary: Escape sequence to execute command on the client side Class: wish Difficulty: fun Priority: never Content-type: text/x-html-body

    People occasionally ask for an escape sequence which will execute an arbitrary local command, à la ECMA-48 OSC (Operating system command).

    This feature is horrendously insecure, and PuTTY will not be implementing unless someone comes up with some plausible way of dealing with the security issues outlined below.

    If your terminal is willing to receive an escape sequence which directs it to run a local program, and will uncomplainingly do it, then for a start you've just put your client machine completely at the mercy of your server - so I do hope you never make a connection to a machine whose sysadmin is less than a close and trusted friend of yours! What would stop the server sending a remote-command escape such as del *.*, or (perhaps even worse) one which read sensitive files on your disk and sent them out to somewhere the malicious server admin could recover them? And even if your server admin is trustworthy, his machine could be cracked, and then your client box is at the mercy of the cracker.

    Furthermore, applications such as Unix `write' often don't filter escape sequences out of their output, so if you ever have messages enabled then you've handed control of your local machine to any user of the same server who might want it.

    In general, your terminal stream should be considered untrusted for these purposes. Users don't normally feel nervous about running `cat' on unknown files just to see what's in them; they tend to feel that the worst that can happen as a result is that they screw up their terminal state and have to reset it - and many users don't even expect that, and come and complain to us when it happens (see the FAQ). If your terminal is willing to run arbitrary local commands when told to by an escape sequence, then you have to adopt a whole new level of paranoia, where (for example) any file not trusted by you is viewed using `cat -v' rather than `cat', and only when you're certain that it's clean of malicious escape sequences do you progress to `cat'.

    An alternative remote-execution solution with authentication is DoIt. Revision-number: 2366 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2002-12-21T13:58:58.000000Z K 7 svn:log V 47 Summary: OpenSSH-style dynamic port forwarding K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-dynamic Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1076 Text-content-md5: 167a5a40fd038af2f2af1313cc3fc127 Text-content-sha1: e5a29063defa1287d943d0e2eba5cbe34c80ecab Content-length: 1192 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN&&&Summary: OpenSSH-style dynamic port forwarding Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body

    We're occasionally asked to implement dynamic port forwarding, where PuTTY acts as a proxy for connection requests (using a protocol such as SOCKS) and creates tunnels on the fly. This is akin to OpenSSH's -D option. From the 3.5p1 ssh(1) man page:

    -D port
            Specifies a local ``dynamic'' application-level port forwarding.
            This works by allocating a socket to listen to port on the local
            side, and whenever a connection is made to this port, the connec
            tion is forwarded over the secure channel, and the application
            protocol is then used to determine where to connect to from the
            remote machine.  Currently the SOCKS4 protocol is supported, and
            ssh will act as a SOCKS4 server.  Only root can forward privi
            leged ports.  Dynamic port forwardings can also be specified in
            the configuration file.
    Revision-number: 2367 Prop-content-length: 104 Content-length: 104 K 8 svn:date V 27 2002-12-24T19:28:51.000000Z K 7 svn:log V 5 typo K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/osc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aa2ea6fbe2e8001d8eb0a3ab82cdacc4 Text-delta-base-sha1: 86cd7e577ae5f503ad28b57731ae7974ea56ca26 Text-content-length: 23 Text-content-md5: 5df81ccf9e1bc5e4c018cd4a1c32e57a Text-content-sha1: 0d97fb26f8baf1342ae5ab7920216c489771dd61 Content-length: 62 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN03 pAoit Revision-number: 2368 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2002-12-26T19:01:55.000000Z K 7 svn:log V 136 Possible solution to a secondary UTF-8 problem on Red Hat 8, with other applications which make it worth considering the work involved. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/unicode-mappings Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2611 Text-content-md5: 9d5fdbfb68813a02b692e51b465bfac5 Text-content-sha1: 2dd78ec66d62b7cd60019b08153d5b9d7eea0cc2 Content-length: 2727 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN%%%Summary: Compatibility mappings for Unicode characters unsupported by a font Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    It's well known that Red Hat 8 boxes start up in UTF-8 by default, and hence that PuTTY must be set into UTF-8 mode or else commands such as man(1) will Do The Wrong Thing.

    I (SGT) have just had a chance to actually play with PuTTY connecting to a RH8 box, and discovered that even with UTF-8 enabled, you don't always get the right results. man(1) handles hyphen/minus characters inconsistently: in some situations it produces U+2212 MINUS SIGN, but in others it produces U+2010 HYPHEN. ("man rm" is a good way to show up both types.) Many Windows fonts (Lucida Console, Courier New) support the former but not the latter, so that even in UTF-8 mode there are nasty "unknown character" rectangles appearing in the man page.

    I think a neat solution to this would be to have a list of compatibility character translations, mapping a single Unicode code point to a different single Unicode code point, so that U+2010 could be displayed as U+2212 (or even U+002D!). This feature would also be useful for displaying U+0060 and U+0027 as U+2018 and U+2019, to ease the conflict between TeX-era Unix users who quote `like this' and pedantic fonts in which those quotes utterly fail to match).

    Points to consider:

    • In its raw form this feature could be more pain than it was worth: anyone switching between fonts would have to add or remove compatibility mappings to reflect the available characters in the new font. I believe it should be possible (Character Map can certainly do it) for PuTTY to query the font at run time and determine which characters are unsupported, and to enable only those mappings necessary. That way, we can ship with a large number of default mappings which should Just Work for almost all fonts.
    • Of course, this will stop the feature being useful for the TeX quotes problem! To preserve this aspect, we would have to be able to configure each individual mapping to be unconditional (applied no matter what), or conditional (applied only if the current font does not contain the source character).
    • It seems clear to me that these mappings should be applied at the display level, not the terminal input level: the terminal data structures should store the original untransformed characters, so that cut and paste doesn't depend on the selected font. (But, aargh, what about RTF pasting which specifies the font?! Perhaps I'll choose to ignore that for the moment...)
    Revision-number: 2369 Prop-content-length: 340 Content-length: 340 K 8 svn:date V 27 2002-12-27T16:54:14.000000Z K 7 svn:log V 239 Mention in the documentation that the method of generating RSA keys might give a bit count one less than the one the user asked for. Two people have been worried by this now, and it's probably worth documenting that it's perfectly normal. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d2f10aaa45545f83d4c82816a15aa42 Text-delta-base-sha1: 93fed5c046f42be033e45e06574a61dc24fcc65b Text-content-length: 734 Text-content-md5: 1ed9848160b45b18e48b35186d621960 Text-content-sha1: e6f2b0981d883320ccf8a387b5a10a6c9e3f4801 Content-length: 774 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNw Cf;Y\versionid $Id: pubkey.but,v 1.20 2002/12/27 16:54:14 simonNote that an RSA key is generated by finding two primes of half the length requested, and then multiplying them together. For example, if you ask PuTTYgen for a 1024-bit RSA key, it will create two 512-bit primes and multiply them. The result of this multiplication might be 1024 bits long, or it might be only 1023; so you may not get the exact length of key you asked for. This is perfectly normal, and you do not need to worry. The lengths should only ever differ by one, and there is no perceptible drop in security as a result. DSA keys are not created by multiplying primes together, so they should always be exactly the length you asked for Revision-number: 2370 Prop-content-length: 226 Content-length: 226 K 8 svn:date V 27 2002-12-28T22:17:51.000000Z K 7 svn:log V 127 The current version of SC generates warnings for unused parameters just like MrC. Turn them off, since they're clearly silly. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 53ed7bb1057d9da0b0918863a776ac1a Text-delta-base-sha1: 69aa44a5eb0f612fc788a32bfd46929926e0022a Text-content-length: 181 Text-content-md5: 2032903606d2ccd66042605c28729bd0 Text-content-sha1: 077fdf628d6ebf8d7731f91a9ffe64ae0d8c9b57 Content-length: 221 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN$K6# -w 53 disables "unused parameter" warnings COptions = -i : -i :: -w 35 COptions_68K = {COptions} -proto strict -model far COptions_PPC = {COptions} Revision-number: 2371 Prop-content-length: 138 Content-length: 138 K 7 svn:log V 40 Dispose of some unused local variables. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-28T22:22:43.000000Z PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 105a3d21940ba77d7474c568cebc4134 Text-delta-base-sha1: 0bc37f01cd5e1f15cac731642a29dd30eae6c8d7 Text-content-length: 60 Text-content-md5: b684f7f3d6c531229aeb3ae9fe3fc560 Text-content-sha1: 69c0be0951e1e5380c8e4ecf22c3a2006e462f18 Content-length: 99 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNk 'h'ry/* $Id: mac.c,v 1.8 2002/12/28 22:22:43 Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0310fba6ea404bfdfec1046a90c17900 Text-delta-base-sha1: dcb4e2d6e64984b241b4c756758ed0dace60dba2 Text-content-length: 85 Text-content-md5: d57134fae2e90b22b870b047119dced8 Text-content-sha1: 207351827f07b27a207d701e4c6fc0ca80e785a1 Content-length: 124 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNh5K,l #kY5/* $Id: macstore.c,v 1.3 2002/12/28 22:22:43int value Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1e72baf94f541a24f9599afc2708d1a4 Text-delta-base-sha1: c44fcee024eda8481ce87dc36461608b48deb5b5 Text-content-length: 78 Text-content-md5: 4b673cbf581450c4965bb645d8bbf313 Text-content-sha1: d4d847699a8137ae49aefb40f92a9d24ac91deb5 Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN1,e,{[-/* $Id: macterm.c,v 1.24 2002/12/28 22:22:43 Revision-number: 2372 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2002-12-28T22:25:31.000000Z K 7 svn:log V 30 Remove more unused variables. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d57134fae2e90b22b870b047119dced8 Text-delta-base-sha1: 207351827f07b27a207d701e4c6fc0ca80e785a1 Text-content-length: 65 Text-content-md5: 1e43f86b513979434721c4f42c1c9cc0 Text-content-sha1: 35997840e11f6b3274d0cdbebfe7f9badc5aadf3 Content-length: 104 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNhW ,X,S/* $Id: macstore.c,v 1.4 2002/12/28 22:25:31 Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b673cbf581450c4965bb645d8bbf313 Text-delta-base-sha1: d4d847699a8137ae49aefb40f92a9d24ac91deb5 Text-content-length: 68 Text-content-md5: 9dee16a0b83d8bafb11e937bee6dfccb Text-content-sha1: 48551603476dfdf6facd00ec90e366791a341d79 Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN ,N, /* $Id: macterm.c,v 1.25 2002/12/28 22:25:31 Revision-number: 2373 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2002-12-28T22:44:27.000000Z K 7 svn:log V 79 It would be better if I deleted the unused variable from the correct function. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1e43f86b513979434721c4f42c1c9cc0 Text-delta-base-sha1: 35997840e11f6b3274d0cdbebfe7f9badc5aadf3 Text-content-length: 75 Text-content-md5: a26b773ffb8b8a22d72559241d42c5b0 Text-content-sha1: 84929d1a4736eaa04372d46c67b1e2ccd572514d Content-length: 114 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNWW,X, $,~;/* $Id: macstore.c,v 1.5 2002/12/28 22:44:27 Revision-number: 2374 Prop-content-length: 192 Content-length: 192 K 7 svn:log V 94 Add some pragmas so that Mac compilers know that fatalbox() and modalfatalbox() don't return. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-29T13:21:12.000000Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 458281fdfc1b62628842c725b0b5ca97 Text-delta-base-sha1: 9be2b69dcb528b19fe52781fbfd8aa1485852b14 Text-content-length: 106 Text-content-md5: 46f2b7d7cadfbc62a6ac73b262fe8ee9 Text-content-sha1: 4a74f029aba1f25f0c37273e2971d48fb002c0ea Content-length: 147 K 15 cvs2svn:cvs-rev V 5 1.173 PROPS-END SVN%x R!R #ifdef macintosh #pragma noreturn(fatalbox) #pragma noreturn(modalfatalbox) #endif Revision-number: 2375 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2002-12-29T13:41:38.000000Z K 7 svn:log V 140 Use the "far" versions of all libraries for which they seem to exist. This should make things less likely to break as the code gets bigger. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2032903606d2ccd66042605c28729bd0 Text-delta-base-sha1: 077fdf628d6ebf8d7731f91a9ffe64ae0d8c9b57 Text-content-length: 150 Text-content-md5: 17bb97db62ffbf2e10356c265008eac6 Text-content-sha1: 30fa2b1bc19cada3efad474c02af6c6cb55d9fb9 Content-length: 190 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN ||u"{CLibraries}StdCLib.far.o" \xb6 "{Libraries}MacRuntime.o" \xb6 "{Libraries}MathLib.far.o" \xb6 "{Libraries}IntEnv.far Revision-number: 2376 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2002-12-29T14:47:01.000000Z K 7 svn:log V 65 Make resizeline() and lineptr() static and give them prototypes. K 10 svn:author V 3 ben PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: eb7ea50b23b61ac7a49a6a4d3053ffe1 Text-delta-base-sha1: 1bf389f4cee105c846fc1509d8b1431cf198fc16 Text-content-length: 290 Text-content-md5: d1eb6fd0e47cb367ef321eb82c79cff8 Text-content-sha1: 325a2950601070e71b4347411c505942ff480224 Content-length: 331 K 15 cvs2svn:cvs-rev V 5 1.123 PROPS-END SVNs8e.0^ zunsigned long *resizeline(unsigned long *, int); static unsigned long *lineptr(Terminal *, int, int);static static  {{& a == MA_CLICK) { deselect(term); term->selstate = ABOUT_TO; term->seltype = default_seltype; term->selanchor = selpoi Revision-number: 2377 Prop-content-length: 253 Content-length: 253 K 8 svn:date V 27 2002-12-29T15:08:27.000000Z K 7 svn:log V 154 Put prototypes for the functions exported by wcwidth.c in putty.h, and remove one from terminal.c. Have wcwidth.c include putty.h to get its prototypes. K 10 svn:author V 3 ben PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 46f2b7d7cadfbc62a6ac73b262fe8ee9 Text-delta-base-sha1: 4a74f029aba1f25f0c37273e2971d48fb002c0ea Text-content-length: 108 Text-content-md5: c1b044860cff67ad9a70217b2c23e263 Text-content-sha1: 721d1c31fe3943dc6938e48cbe4a80bc4823773e Content-length: 149 K 15 cvs2svn:cvs-rev V 5 1.174 PROPS-END SVNxa RRswcwidth.c */ int wcwidth(wchar_t ucs); int wcswidth(const wchar_t *pwcs, size_t n Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d1eb6fd0e47cb367ef321eb82c79cff8 Text-delta-base-sha1: 325a2950601070e71b4347411c505942ff480224 Text-content-length: 78 Text-content-md5: 0894769f3cbd54be3d3cea509945c04b Text-content-sha1: 8af08ef8d84d0c8ad05711a0193a0b1f78180c6a Content-length: 119 K 15 cvs2svn:cvs-rev V 5 1.124 PROPS-END SVN '(1O& a == MA_CLICK) { deselect(term); te bb' Node-path: putty/wcwidth.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bdc9a7f29f1c95aac9d8cee3017d38dd Text-delta-base-sha1: e67c701f5f45a7b4fc99619e55f4f184db54c613 Text-content-length: 39 Text-content-md5: e06cdd56c7eac9b0d581a1e7941ad45e Text-content-sha1: 2c7b9fd889a623c978d02b2038a453b5f9422a76 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN.B *#include "putty.h" Revision-number: 2378 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2002-12-29T15:44:15.000000Z K 7 svn:log V 116 Substantial overhaul of Mac build system. We now have working PowerPC builds, and optimisation (for size) enabled. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 12dbacf6734e097d8e059018636dd60b Text-delta-base-sha1: 57f0bb2fd7abd1620b5084c6c857267aebe5ca5d Text-content-length: 276 Text-content-md5: acc472d1c0760849755eb61c56d421bf Text-content-sha1: 9a56aa2dfbf7a309052b63214a43eb0e7dc724c3 Content-length: 315 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN}9 {;)Rz$Id: README.mac,v 1.4 2002/12/29 15:44:15.68k mac_res.r", and the same for PuTTY.ppc to get the resources compiled in. The current Makefile producess a Classic 68K build of PuTTY called "PuTTY.68k" and a non-Carbon PowerPC build called "PuTTY.ppc" Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 17bb97db62ffbf2e10356c265008eac6 Text-delta-base-sha1: 30fa2b1bc19cada3efad474c02af6c6cb55d9fb9 Text-content-length: 1312 Text-content-md5: 67748e6bc74f154648517bdd82f53e44 Text-content-sha1: 114d117c07920c797b89b98b9135fee1b3d08c88 Content-length: 1352 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN6\)%NsBDa|g$T)^f)35 disables "unused parameter" warnings COptions = -i : -i :: -w 35 -w err -proto strict COptions_68K = {COptions} -model far -opt space COptions_PPC = {COptions} -opt size LinkOptions = -c 'pTTY' LinkOptions_68K = {LinkOptions} -br 68k -model far -compact LinkOptions_PPC = {LinkOptions}CFMSharedLibraries}TextCommon" \xb6 -weaklib TextCommon \xb6 "{SharedLibraries}UnicodeConverter" \xb6 -weaklib UnicodeConverter Libs_PPC = {Libs_CFM}CarbonAccessors.o" \xb6 "{PPCLibraries}OpenTransportAppPPC.o" \xb6 "{PPCLibraries}OpenTptInetPPC.o" print &splitline("$prog \xc4 $prog.68k $prog.ppc", undef, "\xb6"), "\n\n"; $objstr = &objects($p, "X.68k.o", undef, undef); print &splitline("$prog.68k \xc4 $objstr", undef, "\xb6"), "\n"; print &splitline("\tILink -o {Targ} {LinkOptions_68K} " . $objstr . " {Libs_68K}", 69, "\xb6"), "\n\n"; $objstr = &objects($p, "X.ppc.o", undef, undef); print &splitline("$prog.ppc \xc4 $objstr", undef, "\xb6"), "\n"; print &splitline("\tPPCLink -o {Targ} {LinkOptions_PPC} " . $objstr . " {Libs_PPC}", 69, "\xb6"), "\n\n"; } foreach $d (&deps("X.68k.oprint "\t{C} ", $d->{deps}->[0], " -o {Targ} {COptions_68K}\n\n"; } foreach $d (&deps("X.ppc.o Revision-number: 2379 Prop-content-length: 459 Content-length: 459 K 8 svn:date V 27 2002-12-29T19:01:33.000000Z K 7 svn:log V 360 Add support for building a CFM-68K version of PuTTY, which is rather smaller than the Classic 68K version. This requires installing more bits of the Text Encoding Converter SDK, since Apple seem to have forgotten to put _any_ 68k bits for it, either CFM or Classic, in Universal Interfaces. Also don't bother linking against libraries we don't seem to need. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: acc472d1c0760849755eb61c56d421bf Text-delta-base-sha1: 9a56aa2dfbf7a309052b63214a43eb0e7dc724c3 Text-content-length: 227 Text-content-md5: df5b1cea1ea20465ca6c44cbeb713ffc Text-content-sha1: 253dca9be9dc4932602c92f2d1ac1492f65677e3 Content-length: 266 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN9NER)bq$$Id: README.mac,v 1.5 2002/12/29 19:01:33, and the contents of the "Stub Libraries" directory into "Interfaces&Libraries:Libraries:Shared, a CFM-68K build called "PuTTY.cfm68k", and a non-Carbon Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 67748e6bc74f154648517bdd82f53e44 Text-delta-base-sha1: 114d117c07920c797b89b98b9135fee1b3d08c88 Text-content-length: 647 Text-content-md5: 07bdd78ce05e118ec81feecd3e7d8c09 Text-content-sha1: b46555a29e1d25786cc63afb01b8dda3709d807d Content-length: 687 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNIN+64i%{Tb eTD*G ?7 v# Enabling "-opt space" for CFM-68K gives me undefined references to # _$LDIVT and _$LMODT. COptions_CFM68K = {COptions} -model cfmSeg -opt timCFM68K = {LinkOptions} -br 020 -model cfmsegAppearanceLib" \xb6 -weaklib AppearanceCFM68K = {Libs_CFM} \xb6 "{CFM68KLibraries}NuMacRuntime.o" \xb6 "{CFM68KLibraries}NuMathLib.o"cfm68k $prog.ppc", cfm68k.o", undef, undef); print &splitline("$prog.cfm68k \xc4 $objstr", undef, "\xb6"), "\n"; print &splitline("\tILink -o {Targ} {LinkOptions_CFM68K} " . $objstr . " {Libs_CFMcfmCFM Revision-number: 2380 Prop-content-length: 183 Content-length: 183 K 7 svn:log V 85 Brutally simplify out all the junk that MPW left here when it first wrote this file. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-29T19:11:40.000000Z PROPS-END Node-path: putty/mac/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 546154e27452c41daacf64949074b679 Text-delta-base-sha1: 46d1c55b0382b8b0c3c046cc4406d3f18a10323c Text-content-length: 193 Text-content-md5: 9b2829ae2f470c9d52962e168b1c32a8 Text-content-sha1: beaffd44f7078eb5613934b4fe5e88613a3cb644 Content-length: 232 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN[n *[yiYt# $Id: mkputty.mpw,v 1.2 2002/12/29 19:11:40 ben Exp $make.out Echo "# `Date -t` ----- Executing build commands." make.out Delete make.out Echo "# `Date -t` ----- Done." Revision-number: 2381 Prop-content-length: 178 Content-length: 178 K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-29T19:14:56.000000Z K 7 svn:log V 80 Don't try to call TerminateUnicodeConverter() in the CFM world: it isn't there. PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b684f7f3d6c531229aeb3ae9fe3fc560 Text-delta-base-sha1: 69c0be0951e1e5380c8e4ecf22c3a2006e462f18 Text-content-length: 158 Text-content-md5: a79bc0cfe86297b77ff188e063823efe Text-content-sha1: 85b89171fc2db176cf3f98c398374a6a02a21bf9 Content-length: 197 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN {'_c/* $Id: mac.c,v 1.9 2002/12/29 19:14:56#if !TARGET_RT_MAC_CFM if (mac_gestalts.encvvers != 0) TerminateUnicodeConverter(); #endif Revision-number: 2382 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2002-12-29T19:19:10.000000Z K 7 svn:log V 48 Add various files produced by the build system. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 91 Content-length: 91 K 10 svn:ignore V 59 make.out *.NJ Makefile.mpw PuTTY.68k PuTTY.cfm68k PuTTY.ppc PROPS-END Node-path: putty/mac/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f89bbf22dcbf021a2d2869f12cd6c9e1 Text-delta-base-sha1: f71d7c48336e163dbd597d5c33cd7595f9e63653 Text-content-length: 70 Text-content-md5: fdccdca94ac7d67f0ddfc3f1489e7cb6 Text-content-sha1: 963481f66cfa9f164c889e85c53e8a5cf4089124 Content-length: 109 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN <{obj};Rez ", $d->{deps}->[0], " -o {Targ} {ROptions}\n\n"; } foreach $d (&deps("X.68k.o", "", "::", ":")) { next unless $d->{obj};68K}\n\n"; } foreach $d (&deps("X.cfm68k.o", "", "::", ":")) { next unless $d->{obj};"", "::", ":")) { next unless $d->{obj}; Revision-number: 2386 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 56 Remove a spurious reference to a variable I've removed. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-30T15:41:52.000000Z PROPS-END Node-path: putty/mac/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9b2829ae2f470c9d52962e168b1c32a8 Text-delta-base-sha1: beaffd44f7078eb5613934b4fe5e88613a3cb644 Text-content-length: 65 Text-content-md5: 04ea0902e8ef19ce57609300dd024458 Text-content-sha1: d352a324666bb7593a0082e86b1100dbb23eb48f Content-length: 104 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNnb ,,U# $Id: mkputty.mpw,v 1.3 2002/12/30 15:41:52 Revision-number: 2387 Prop-content-length: 306 Content-length: 306 K 8 svn:date V 27 2002-12-30T18:21:17.000000Z K 7 svn:log V 207 Add an "open" command to the "file" (now "session") menu on the Mac to open an existing saved session. This has entailed adding an extra hook to settings.c to allow for loading settings other than by name. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a79bc0cfe86297b77ff188e063823efe Text-delta-base-sha1: 85b89171fc2db176cf3f98c398374a6a02a21bf9 Text-content-length: 102 Text-content-md5: 7b0169e2d78296c6003a89fd9e8c89e1 Text-content-sha1: d20f47e4ba807c94ce1eb58c030f3138c58a2402 Content-length: 142 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNW PJ'=b/* $Id: mac.c,v 1.10 2002/12/30 18:21:17 case iOpen: mac_opensession(); Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 129a73679786d0baf14d24f6fff094a6 Text-delta-base-sha1: b78e3acb847a94468b16e34e4eb7d7fc106886fe Text-content-length: 300 Text-content-md5: 270b314ce700ce434a2b3c0f718e81f7 Text-content-sha1: f2a659c041bd45827b46d4aa31a1b482a95d220c Content-length: 339 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNmW}qn !zw&D)Control/* from macterm.c */ extern void mac_newsession(void); extern void mac_opensession(void); extern void mac_startsession(Session *store.c */ OSErr get_session_dir(Boolean makeit, short *pVRefNum, long *pDirID); extern void *open_settings_r_fsp(FSSpec * Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 696e6ff197ac2c31e197899575037b3f Text-delta-base-sha1: 5f3f6ae58e4bd05ffa7ccb07cdd8d6bab6f7c775 Text-content-length: 187 Text-content-md5: d9c6c549b573ac18fea916d9c466fc34 Text-content-sha1: a4f4b0a15b9fcdc2bc576536edfa93d18db62543 Content-length: 226 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN.O+1~io/* $Id: mac_res.r,v 1.6 2002/12/30 18:21:17\0xc9",0111, enabled, "Session", { "New", noicon, "N", nomark, plain, "Open\0xc9", noicon, "O Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 129ea3c310e018683eeb3e989fe9285c Text-delta-base-sha1: e53c3a96070fda618b88ed2f977ce8173cda0323 Text-content-length: 108 Text-content-md5: 3fbb1c19ee394e64b47be7453cccf3f5 Text-content-sha1: fa08fe14e8ce4564425068d1d9ed77b0ee86ace5 Content-length: 147 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN  V?,/* $Id: macresid.h,v 1.2 2002/12/30 18:21:17Open 2 #define iClose 3 #define iQuit 5 Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a26b773ffb8b8a22d72559241d42c5b0 Text-delta-base-sha1: 84929d1a4736eaa04372d46c67b1e2ccd572514d Text-content-length: 384 Text-content-md5: 629184b46866ec7becd7a390c1459750 Text-content-sha1: ebc365507871d0d384fcf9e13a6a2731c211cc15 Content-length: 423 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNW'#Q+i6elc8<1!S/* $Id: macstore.c,v 1.6 2002/12/30 18:21:1#include "mac.h" #define PUTTY_CREATOR FOUR_CHAR_CODE('pTTY') #define SESS_TYPE FOUR_CHAR_CODE('Sess') return open_settings_r_fsp(&sessfile); out: return NULL; } void *open_settings_r_fsp(FSSpec *sessfile) { OSErr error; int fd; int *handle; fd = FSpOpenResFile( Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9dee16a0b83d8bafb11e937bee6dfccb Text-delta-base-sha1: 48551603476dfdf6facd00ec90e366791a341d79 Text-content-length: 782 Text-content-md5: f08f38f761fa21646d5dbd7e9bb26e88 Text-content-sha1: a48fe04f316279dcfe2ffffb16b0424201d46dd4 Content-length: 822 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN)aH,f|g7 ">D/* $Id: macterm.c,v 1.26 2002/12/30 18:21:17StandardFilestorage mac_startsession(s); } void mac_opensession(void) { Session *s; StandardFileReply sfr; static const OSType sftypes[] = { 'Sess', 0, 0, 0 }; void *sesshandle; s = smalloc(sizeof(*s)); memset(s, 0, sizeof(*s)); StandardGetFile(NULL, 1, sftypes, &sfr); if (!sfr.sfGood) goto fail; sesshandle = open_settings_r_fsp(&sfr.sfFile); if (sesshandle == NULL) goto fail; load_open_settings(sesshandle, TRUE, &s->cfg); close_settings_r(sesshandle); s->back = &loop_backend; mac_startsession(s); return; fail: sfree(s); return; } void mac_startsession(Session *s) { UInt32 starttime; char msg[128]; Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c1b044860cff67ad9a70217b2c23e263 Text-delta-base-sha1: 721d1c31fe3943dc6938e48cbe4a80bc4823773e Text-content-length: 78 Text-content-md5: fbbfe456206fa3237cb280ba2a4e8763 Text-content-sha1: 7ca916fe70ca50e693aa43491bb0c6de4f4115b3 Content-length: 119 K 15 cvs2svn:cvs-rev V 5 1.175 PROPS-END SVNa# 7dYload_open_settings(void *sesskey, int do_host, Config * Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e9babca5b15df2170f94f7a5ae2c1ee0 Text-delta-base-sha1: a1bb29740e9fe2090123f1ac431b7d959647ac80 Text-content-length: 264 Text-content-md5: ad2c8bae844eff22a9d5ffd8b120c391 Text-content-sha1: 582ed3b3d99710ddd86f0fe370adbd48398ea3d5 Content-length: 304 K 15 cvs2svn:cvs-rev V 4 1.92 PROPS-END SVN\Ph^hM2=void *sesskey; sesskey = open_settings_r(section); load_open_settings(sesskey, do_host, cfg); close_settings_r(sesskey); } void load_open_settings(void *sesskey, int do_host, Config *cfg) { int i; char prot[10] Revision-number: 2388 Prop-content-length: 196 Content-length: 196 K 7 svn:log V 98 Set the default directory to somewhere useful (the PuTTY saved sessions folder) when we start up. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-30T19:01:44.000000Z PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7b0169e2d78296c6003a89fd9e8c89e1 Text-delta-base-sha1: d20f47e4ba807c94ce1eb58c030f3138c58a2402 Text-content-length: 323 Text-content-md5: 0917154f5743bd72da85ebe02ab5aac3 Text-content-sha1: 2426384e188ba920f189fc9c0f59d75b2e91fc1a Content-length: 363 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNWf$C(m]vE/* $Id: mac.c,v 1.11 2002/12/30 19:01:44LowMem{ short vol; long dirid; /* Set the default directory for loading and saving settings. */ /* XXX Should we create it? */ if (get_session_dir(FALSE, &vol, &dirid) == noErr) { LMSetSFSaveDisk(-vol); LMSetCurDirStore(dirid); } } Revision-number: 2389 Prop-content-length: 402 Content-length: 402 K 8 svn:date V 27 2002-12-30T23:14:11.000000Z K 7 svn:log V 303 Add support for compiling 'vers' resources into Mac applications. This is needlessly complex because Rez's preprocessor doesn't do either ANSI or K&R stringification, and the MPW Shell isn't much good as shells go. Also make _all_ the Mac executables depend on reources, not just the Classic 68K one. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d9c6c549b573ac18fea916d9c466fc34 Text-delta-base-sha1: a4f4b0a15b9fcdc2bc576536edfa93d18db62543 Text-content-length: 947 Text-content-md5: 7d12e5200fc219b6a50398e660ad84e2 Text-content-sha1: bae881c3cf0ae84c85aa57fd27cddf79e603cf28 Content-length: 986 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN. C+mAm/* $Id: mac_res.r,v 1.7 2002/12/30 23:14:11resource 'vers' (1, purgeable) { /* XXX This needs to be updated for each new version */ 0x00, 0x53, #ifdef RELEASE beta, #else development, #endif 0, /* No prerelease version */ 2, /* Region code 2 = UK */ #ifdef RELEASESTR RELEASESTR, "Release " RELEASESTR, #else #ifdef SNAPSHOTSTR SNAPSHOTSTR, "Development snapshot " SNAPSHOTSTR, #else "unknown", "Unidentified build, " $$Date " " $$Time, #endif #endif }; resource 'vers' (2, purgeable) { /* XXX This needs to be updated for each new version */ 0x00, 0x53, #ifdef RELEASE beta, #else development, #endif 0, /* No prerelease version */ 2, /* Region code 2 = UK */ #ifdef RELEASESTR RELEASESTR, "PuTTY " RELEASESTR, #else #ifdef SNAPSHOTSTR SNAPSHOTSTR, "PuTTY snapshot " SNAPSHOTSTR, #else "unknown", "PuTTY", #endif #endif }; Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c7bb5a6298427980ffa724a86dde5f1b Text-delta-base-sha1: 1efdc3ada27df0cdaf01bd44d3dda7288186c7ea Text-content-length: 188 Text-content-md5: 0510b5e81a2d8800ad636d1643c59653 Text-content-sha1: f27f9e038bc93d80bb6d1e6b5120f7b889ff26d8 Content-length: 228 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNXo% Z hX>kQz>(0ROptions = `Echo "{VER}" | StreamEdit -e "1,\$ replace /=(\xc5)\xa81\xb0/ 'STR=\xb6\xb6\xb6\xb6\xb6"' \xa81 '\xb6\xb6\xb6\xb6\xb6"'"` Revision-number: 2390 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2002-12-30T23:15:46.000000Z K 7 svn:log V 43 No need to compile resources manually now. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: df5b1cea1ea20465ca6c44cbeb713ffc Text-delta-base-sha1: 253dca9be9dc4932602c92f2d1ac1492f65677e3 Text-content-length: 210 Text-content-md5: aeb1d3468d233cae43f4445d5785fe6d Text-content-sha1: 3253ca9dbbc317f0a0f816d0c6e3d9a41f223497 Content-length: 249 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNN= 9`)$*$Id: README.mac,v 1.6 2002/12/30 23:15:46all the work, and currently producess a Classic 68K build of PuTTY called "PuTTY.68k", a CFM-68K build called "PuTTY.cfm68k", and a non-Carbon Revision-number: 2391 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2002-12-30T23:33:13.000000Z K 7 svn:log V 61 Remove mentions of files and functions that no longer exist. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 270b314ce700ce434a2b3c0f718e81f7 Text-delta-base-sha1: f2a659c041bd45827b46d4aa31a1b482a95d220c Text-content-length: 19 Text-content-md5: 00e081140f29259f9e038d09e4b117a6 Text-content-sha1: 8a4f8cc3a41ed29117fe5954643e227d903bd27b Content-length: 58 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNWdE Revision-number: 2392 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2002-12-31T01:40:14.000000Z K 7 svn:log V 108 Add a minimalist settings dialogue, which contains a single button marked "open". Still, it seems to work. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 66f8e419733ac465bad6dd267c9b25dc Text-delta-base-sha1: 594c37e6356be3e8b8177160dce42da6aaea0451 Text-content-length: 77 Text-content-md5: d94677fc590d5aa01f48d91b2d326aa6 Text-content-sha1: 69473aff9c378f96458146bd663ea03b9e36fd46 Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN$2=udlg macstore macterm macucs + mac_res.rsrc testback Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0917154f5743bd72da85ebe02ab5aac3 Text-delta-base-sha1: 2426384e188ba920f189fc9c0f59d75b2e91fc1a Text-content-length: 301 Text-content-md5: 3c1e9ed038431af377f2c9ecf3f1aa73 Text-content-sha1: 0196aa37e8a7cef158e3104ff4ada671cfd3e348 Content-length: 341 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNfM$}'NR%_;\T/* $Id: mac.c,v 1.12 2002/12/31 01:40:1 case wSettings: mac_clickdlg(window, event);Settings: mac_activatedlg(window, event case wSettings long refconfcon = GetWRefCon(window); if (refcon < 1024) return refcon; else return wSettings Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 00e081140f29259f9e038d09e4b117a6 Text-delta-base-sha1: 8a4f8cc3a41ed29117fe5954643e227d903bd27b Text-content-length: 220 Text-content-md5: e3fb7e9e9b2567132d9ef6182577566c Text-content-sha1: e281782e01c4361f56a7f433a4bb71c2c41b321c Content-length: 259 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNd>q'e*-7WindowPtr settings_dlg.c */ extern void mac_newsession(void); extern void mac_clickdlg(WindowPtr, EventRecord *); extern void mac_activatedlg(WindowPtr, EventRecord *); /* from macterm.c */ Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7d12e5200fc219b6a50398e660ad84e2 Text-delta-base-sha1: bae881c3cf0ae84c85aa57fd27cddf79e603cf28 Text-content-length: 490 Text-content-md5: 67e6cb1c0368cc4714ebb5d36d5e7d5f Text-content-sha1: 7e5f6b7dd271d0e241da6db8dedce0ff64db0c38 Content-length: 529 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNHW+Q}*l%w/* $Id: mac_res.r,v 1.8 2002/12/31 01:40:14 ben Exp $ */ /* * Copyright (c) 1999, 2002Settings dialogue */ resource 'DLOG' (wSettings, "settings", purgeable) { { 0, 0, 46, 240 }, noGrowDocProc, invisible, goAway, wSettings, wSettings, "Settings", staggerParentWindowScreen }; resource 'dlgx' (wSettings, "settingsSettings, "settings", purgeable) { { { 13, 13, 33, 227 }, Button { enabled, "Open" }, } }; Node-path: putty/mac/macdlg.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2538 Text-content-md5: cfe13989b67008439c1771b7c7cde290 Text-content-sha1: 9fdbbc7466f2067d1090f921a479d54bd33ebf73 Content-length: 2654 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN\\\/* $Id: macdlg.c,v 1.1 2002/12/31 01:40:14 ben Exp $ */ /* * Copyright (c) 2002 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * macdlg.c - settings dialogue box for Mac OS. */ #include #include #include #include #include "putty.h" #include "mac.h" #include "macresid.h" void mac_newsession(void) { Session *s; /* This should obviously be initialised by other means */ s = smalloc(sizeof(*s)); memset(s, 0, sizeof(*s)); do_defaults(NULL, &s->cfg); s->back = &loop_backend; s->settings_window = GetNewDialog(wSettings, NULL, (WindowPtr)-1); SetWRefCon(s->settings_window, (long)s); ShowWindow(s->settings_window); } void mac_activatedlg(WindowPtr window, EventRecord *event) { DialogItemType itemtype; Handle itemhandle; short item; Rect itemrect; int active; active = (event->modifiers & activeFlag) != 0; GetDialogItem(window, wiSettingsOpen, &itemtype, &itemhandle, &itemrect); HiliteControl((ControlHandle)itemhandle, active ? 0 : 255); DialogSelect(event, &window, &item); } void mac_clickdlg(WindowPtr window, EventRecord *event) { short item; Session *s = (Session *)GetWRefCon(window); if (DialogSelect(event, &(DialogPtr)window, &item)) switch (item) { case wiSettingsOpen: CloseWindow(window); mac_startsession(s); break; } } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3fbb1c19ee394e64b47be7453cccf3f5 Text-delta-base-sha1: fa08fe14e8ce4564425068d1d9ed77b0ee86ace5 Text-content-length: 111 Text-content-md5: 0bf68af49dce14bdc50c6cfea1b24aa6 Text-content-sha1: f87b427a71d2a1b40ec517068af8917648d44860 Content-length: 150 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNK Zx,y"/* $Id: macresid.h,v 1.3 2002/12/31 01:40:14#define wSettings 132 #define wiSettingsOpen Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f08f38f761fa21646d5dbd7e9bb26e88 Text-delta-base-sha1: a48fe04f316279dcfe2ffffb16b0424201d46dd4 Text-content-length: 68 Text-content-md5: 2808624b699f3cd12f3dcffa82e70e08 Text-content-sha1: 2f5f01d048849065ec57e7aa1ed6dd6c3926f403 Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN)) ,9,De/* $Id: macterm.c,v 1.27 2002/12/31 01:40:14 Revision-number: 2393 Prop-content-length: 286 Content-length: 286 K 8 svn:date V 27 2002-12-31T10:04:35.000000Z K 7 svn:log V 185 Dimitrie Paun's patch for Winelib support. Actually does nothing except add a couple of commented-out lines to Makefile.cyg; the Winelib user must uncomment them to do the compilation. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0510b5e81a2d8800ad636d1643c59653 Text-delta-base-sha1: f27f9e038bc93d80bb6d1e6b5120f7b889ff26d8 Text-content-length: 118 Text-content-md5: 4e960d2eb9a439c4919e0eda6efe72b6 Text-content-sha1: bfd06fabc2b3ee0d1184a3cdc7daae497ba343ad Content-length: 158 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNoU ^M^*EUncomment the following two lines to compile under Winelib\n". "# CC = winegcc\n". "# RC = wrc Revision-number: 2394 Prop-content-length: 294 Content-length: 294 K 8 svn:date V 27 2002-12-31T11:03:23.000000Z K 7 svn:log V 193 SCO ACS part 2 (ESC[12m) apparently puts the top half of CP437 into _both_ halves of the character set, rather than flipping the two halves. My source for this is linux/drivers/char/console.c. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0894769f3cbd54be3d3cea509945c04b Text-delta-base-sha1: 8af08ef8d84d0c8ad05711a0193a0b1f78180c6a Text-content-length: 62 Text-content-md5: 1c3d13374113bacedcf9c8583bd42063 Text-content-sha1: b123278b364d48f5432b08e88a0449d5364f6383 Content-length: 103 K 15 cvs2svn:cvs-rev V 5 1.125 PROPS-END SVN N_Om~]#|, |0x80rbaa Revision-number: 2395 Prop-content-length: 550 Content-length: 550 K 8 svn:date V 27 2002-12-31T12:20:34.000000Z K 7 svn:log V 449 First draft of Unicode support in pterm. It's pretty complete: it does UTF-8 copy and paste (falling back to normal strings if necessary), it understands X font encodings and translates things accordingly so that if you have a Unicode font you can ask for virtually any single-byte encoding and get it (Mac-Roman pterm, anyone?), and so on. There's work left to be done (wide fonts for CJK spring to mind), but I reckon this is a pretty good start. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d94677fc590d5aa01f48d91b2d326aa6 Text-delta-base-sha1: 69473aff9c378f96458146bd663ea03b9e36fd46 Text-content-length: 140 Text-content-md5: 0daaf7aca02529f4c3c1fd2211a1a21c Text-content-sha1: 2ca691d68c03efeea868b666ae1dffd004496d1f Content-length: 180 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN2&p\hrXhJCharacter set library, for use in pterm. CHARSET = sbcsdat slookup sbcs utf8 toucs fromucs xenc mimeenc CHARSET Node-path: putty/charset Node-kind: dir Node-action: add Prop-content-length: 40 Content-length: 40 K 10 svn:ignore V 9 sbcsdat.c PROPS-END Node-path: putty/charset/.cvsignore Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 20 Text-content-md5: 1d85387157853dba40a7160245c6db6c Text-content-sha1: 0e179e18fcef0902b9ebbb04e1540c71daa400d9 Content-length: 136 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  sbcsdat.c Node-path: putty/charset/README Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 624 Text-content-md5: 69a31f5f2c2799e7ebe865fb3431d644 Text-content-sha1: c3cdbc61b11960a8016e0ee00e7ec3802c2d252c Content-length: 740 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNbbbThis subdirectory contains a general character-set conversion library, used in the Unix port of PuTTY, and available for use in other ports if it should happen to be useful. I intend to use this same library in other programs at some future date. It is therefore a _strong_ design goal that this library should remain perfectly general, and not tied to particulars of PuTTY. It must not reference any code outside its own subdirectory; it should not have PuTTY-specific helper routines added to it unless they can be documented in a general manner which might make them useful in other circumstances as well. Node-path: putty/charset/charset.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3589 Text-content-md5: e5b6c21ab9f9b203b0b9180401272fee Text-content-sha1: f34a2f571ebd44d175a20f9776f42db3db43d336 Content-length: 3705 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNwww/* * charset.h - header file for general character set conversion * routines. */ #ifndef charset_charset_h #define charset_charset_h #include /* * Enumeration that lists all the multibyte or single-byte * character sets known to this library. */ typedef enum { CS_NONE, /* used for reporting errors, etc */ CS_ISO8859_1, CS_ISO8859_1_X11, /* X font encoding with VT100 glyphs */ CS_ISO8859_2, CS_ISO8859_3, CS_ISO8859_4, CS_ISO8859_5, CS_ISO8859_6, CS_ISO8859_7, CS_ISO8859_8, CS_ISO8859_9, CS_ISO8859_10, CS_ISO8859_11, CS_ISO8859_13, CS_ISO8859_14, CS_ISO8859_15, CS_ISO8859_16, CS_CP437, CS_CP850, CS_CP1250, CS_CP1251, CS_CP1252, CS_CP1253, CS_CP1254, CS_CP1255, CS_CP1256, CS_CP1257, CS_CP1258, CS_KOI8_R, CS_KOI8_U, CS_MAC_ROMAN, CS_VISCII, CS_HP_ROMAN8, CS_DEC_MCS, CS_UTF8 } charset_t; typedef struct { unsigned long s0; } charset_state; /* * Routine to convert a MB/SB character set to Unicode. * * This routine accepts some number of bytes, updates a state * variable, and outputs some number of Unicode characters. There * are no guarantees. You can't even guarantee that at most one * Unicode character will be output per byte you feed in; for * example, suppose you're reading UTF-8, you've seen E1 80, and * then you suddenly see FE. Now you need to output _two_ error * characters - one for the incomplete sequence E1 80, and one for * the completely invalid UTF-8 byte FE. * * Returns the number of wide characters output; will never output * more than the size of the buffer (as specified on input). * Advances the `input' pointer and decrements `inlen', to indicate * how far along the input string it got. * * The sequence of `errlen' wide characters pointed to by `errstr' * will be used to indicate a conversion error. If `errstr' is * NULL, `errlen' will be ignored, and the library will choose * something sensible to do on its own. For Unicode, this will be * U+FFFD (REPLACEMENT CHARACTER). */ int charset_to_unicode(char **input, int *inlen, wchar_t *output, int outlen, int charset, charset_state *state, const wchar_t *errstr, int errlen); /* * Routine to convert Unicode to an MB/SB character set. * * This routine accepts some number of Unicode characters, updates * a state variable, and outputs some number of bytes. * * Returns the number of bytes characters output; will never output * more than the size of the buffer (as specified on input), and * will never output a partial MB character. Advances the `input' * pointer and decrements `inlen', to indicate how far along the * input string it got. * * The sequence of `errlen' characters pointed to by `errstr' will * be used to indicate a conversion error. If `errstr' is NULL, * `errlen' will be ignored, and the library will choose something * sensible to do on its own (which will vary depending on the * output charset). */ int charset_from_unicode(wchar_t **input, int *inlen, char *output, int outlen, int charset, charset_state *state, const char *errstr, int errlen); /* * Convert X11 encoding names to and from our charset identifiers. */ const char *charset_to_xenc(int charset); int charset_from_xenc(const char *name); /* * Convert MIME encoding names to and from our charset identifiers. */ const char *charset_to_mimeenc(int charset); int charset_from_mimeenc(const char *name); #endif /* charset_charset_h */ Node-path: putty/charset/enum.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 699 Text-content-md5: 8cf79693791adce97200e531fe2cfb5d Text-content-sha1: d4ad98fb632f4471f9d86b12e5dc1d66a14895aa Content-length: 815 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN---/* * enum.c - enumerate all charsets defined by the library. * * This file maintains a list of every other source file which * contains ENUM_CHARSET definitions. It #includes each one with * ENUM_CHARSETS defined, which causes those source files to do * nothing at all except call the ENUM_CHARSET macro on each * charset they define. * * This file in turn is included from various other places, with * the ENUM_CHARSET macro defined to various different things. This * allows us to have multiple implementations of the master charset * lookup table (a static one and a dynamic one). */ #define ENUM_CHARSETS #include "sbcsdat.c" #include "utf8.c" #undef ENUM_CHARSETS Node-path: putty/charset/fromucs.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2030 Text-content-md5: 4ed7bb4af4f69225aca07207b799e46a Text-content-sha1: 7340a0e1c8a885914b27dce1af36c720073d4341 Content-length: 2146 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN```/* * fromucs.c - convert Unicode to other character sets. */ #include "charset.h" #include "internal.h" struct charset_emit_param { char *output; int outlen; const char *errstr; int errlen; int stopped; }; static void charset_emit(void *ctx, long int output) { struct charset_emit_param *param = (struct charset_emit_param *)ctx; char outval; char const *p; int outlen; if (output == ERROR) { p = param->errstr; outlen = param->errlen; } else { outval = output; p = &outval; outlen = 1; } if (param->outlen >= outlen) { while (outlen > 0) { *param->output++ = *p++; param->outlen--; outlen--; } } else { param->stopped = 1; } } int charset_from_unicode(wchar_t **input, int *inlen, char *output, int outlen, int charset, charset_state *state, const char *errstr, int errlen) { charset_spec const *spec = charset_find_spec(charset); charset_state localstate; struct charset_emit_param param; param.output = output; param.outlen = outlen; param.stopped = 0; /* * charset_emit will expect a valid errstr. */ if (!errstr) { /* *shrug* this is good enough, and consistent across all SBCS... */ param.errstr = "."; param.errlen = 1; } param.errstr = errstr; param.errlen = errlen; if (!state) { localstate.s0 = 0; } else { localstate = *state; /* structure copy */ } state = &localstate; while (*inlen > 0) { int lenbefore = param.output - output; spec->write(spec, **input, &localstate, charset_emit, ¶m); if (param.stopped) { /* * The emit function has _tried_ to output some * characters, but ran up against the end of the * buffer. Leave immediately, and return what happened * _before_ attempting to process this character. */ return lenbefore; } if (state) *state = localstate; /* structure copy */ (*input)++; (*inlen)--; } return param.output - output; } Node-path: putty/charset/internal.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3097 Text-content-md5: 6869392f338db009faf7b6188b5be6c4 Text-content-sha1: d7660e40fd683bf08bc35a85275dfee9f370b5af Content-length: 3213 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  /* * internal.h - internal header stuff for the charset library. */ #ifndef charset_internal_h #define charset_internal_h /* This invariably comes in handy */ #define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) /* This is an invalid Unicode value used to indicate an error. */ #define ERROR 0xFFFFL /* Unicode value representing error */ typedef struct charset_spec charset_spec; typedef struct sbcs_data sbcs_data; struct charset_spec { int charset; /* numeric identifier */ /* * A function to read the character set and output Unicode * characters. The `emit' function expects to get Unicode chars * passed to it; it should be sent ERROR for any encoding error * on the input. */ void (*read)(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx); /* * A function to read Unicode characters and output in this * character set. The `emit' function expects to get byte * values passed to it; it should be sent ERROR for any * non-representable characters on the input. */ void (*write)(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx); void const *data; }; /* * This is the format of `data' used by the SBCS read and write * functions; so it's the format used in all SBCS definitions. */ struct sbcs_data { /* * This is a simple mapping table converting each SBCS position * to a Unicode code point. Some positions may contain ERROR, * indicating that that byte value is not defined in the SBCS * in question and its occurrence in input is an error. */ unsigned long sbcs2ucs[256]; /* * This lookup table is used to convert Unicode back to the * SBCS. It consists of the valid byte values in the SBCS, * sorted in order of their Unicode translation. So given a * Unicode value U, you can do a binary search on this table * using the above table as a lookup: when testing the Xth * position in this table, you branch according to whether * sbcs2ucs[ucs2sbcs[X]] is less than, greater than, or equal * to U. * * Note that since there may be fewer than 256 valid byte * values in a particular SBCS, we must supply the length of * this table as well as the contents. */ unsigned char ucs2sbcs[256]; int nvalid; }; /* * Prototypes for internal library functions. */ charset_spec const *charset_find_spec(int charset); void read_sbcs(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx); void write_sbcs(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx); /* * Placate compiler warning about unused parameters, of which we * expect to have some in this library. */ #define UNUSEDARG(x) ( (x) = (x) ) #endif /* charset_internal_h */ Node-path: putty/charset/mimeenc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5468 Text-content-md5: 4a70aa32d38dece4c9f27974c604321d Text-content-sha1: 49bbce4addb02730dc800745443914194145188d Content-length: 5584 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNNNN/* * mimeenc.c - translate our internal character set codes to and * from MIME standard character-set names. * */ #include #include "charset.h" #include "internal.h" static const struct { const char *name; int charset; } mimeencs[] = { /* * These names are taken from * * http://www.iana.org/assignments/character-sets * * Where multiple encoding names map to the same encoding id * (such as the variety of aliases for ISO-8859-1), the first * is considered canonical and will be returned when * translating the id to a string. */ { "ISO-8859-1", CS_ISO8859_1 }, { "iso-ir-100", CS_ISO8859_1 }, { "ISO_8859-1", CS_ISO8859_1 }, { "ISO_8859-1:1987", CS_ISO8859_1 }, { "latin1", CS_ISO8859_1 }, { "l1", CS_ISO8859_1 }, { "IBM819", CS_ISO8859_1 }, { "CP819", CS_ISO8859_1 }, { "csISOLatin1", CS_ISO8859_1 }, { "ISO-8859-2", CS_ISO8859_2 }, { "ISO_8859-2:1987", CS_ISO8859_2 }, { "iso-ir-101", CS_ISO8859_2 }, { "ISO_8859-2", CS_ISO8859_2 }, { "latin2", CS_ISO8859_2 }, { "l2", CS_ISO8859_2 }, { "csISOLatin2", CS_ISO8859_2 }, { "ISO-8859-3", CS_ISO8859_3 }, { "ISO_8859-3:1988", CS_ISO8859_3 }, { "iso-ir-109", CS_ISO8859_3 }, { "ISO_8859-3", CS_ISO8859_3 }, { "latin3", CS_ISO8859_3 }, { "l3", CS_ISO8859_3 }, { "csISOLatin3", CS_ISO8859_3 }, { "ISO-8859-4", CS_ISO8859_4 }, { "ISO_8859-4:1988", CS_ISO8859_4 }, { "iso-ir-110", CS_ISO8859_4 }, { "ISO_8859-4", CS_ISO8859_4 }, { "latin4", CS_ISO8859_4 }, { "l4", CS_ISO8859_4 }, { "csISOLatin4", CS_ISO8859_4 }, { "ISO-8859-5", CS_ISO8859_5 }, { "ISO_8859-5:1988", CS_ISO8859_5 }, { "iso-ir-144", CS_ISO8859_5 }, { "ISO_8859-5", CS_ISO8859_5 }, { "cyrillic", CS_ISO8859_5 }, { "csISOLatinCyrillic", CS_ISO8859_5 }, { "ISO-8859-6", CS_ISO8859_6 }, { "ISO_8859-6:1987", CS_ISO8859_6 }, { "iso-ir-127", CS_ISO8859_6 }, { "ISO_8859-6", CS_ISO8859_6 }, { "ECMA-114", CS_ISO8859_6 }, { "ASMO-708", CS_ISO8859_6 }, { "arabic", CS_ISO8859_6 }, { "csISOLatinArabic", CS_ISO8859_6 }, { "ISO-8859-7", CS_ISO8859_7 }, { "ISO_8859-7:1987", CS_ISO8859_7 }, { "iso-ir-126", CS_ISO8859_7 }, { "ISO_8859-7", CS_ISO8859_7 }, { "ELOT_928", CS_ISO8859_7 }, { "ECMA-118", CS_ISO8859_7 }, { "greek", CS_ISO8859_7 }, { "greek8", CS_ISO8859_7 }, { "csISOLatinGreek", CS_ISO8859_7 }, { "ISO-8859-8", CS_ISO8859_8 }, { "ISO_8859-8:1988", CS_ISO8859_8 }, { "iso-ir-138", CS_ISO8859_8 }, { "ISO_8859-8", CS_ISO8859_8 }, { "hebrew", CS_ISO8859_8 }, { "csISOLatinHebrew", CS_ISO8859_8 }, { "ISO-8859-9", CS_ISO8859_9 }, { "ISO_8859-9:1989", CS_ISO8859_9 }, { "iso-ir-148", CS_ISO8859_9 }, { "ISO_8859-9", CS_ISO8859_9 }, { "latin5", CS_ISO8859_9 }, { "l5", CS_ISO8859_9 }, { "csISOLatin5", CS_ISO8859_9 }, { "ISO-8859-10", CS_ISO8859_10 }, { "iso-ir-157", CS_ISO8859_10 }, { "l6", CS_ISO8859_10 }, { "ISO_8859-10:1992", CS_ISO8859_10 }, { "csISOLatin6", CS_ISO8859_10 }, { "latin6", CS_ISO8859_10 }, { "ISO-8859-13", CS_ISO8859_13 }, { "ISO-8859-14", CS_ISO8859_14 }, { "iso-ir-199", CS_ISO8859_14 }, { "ISO_8859-14:1998", CS_ISO8859_14 }, { "ISO_8859-14", CS_ISO8859_14 }, { "latin8", CS_ISO8859_14 }, { "iso-celtic", CS_ISO8859_14 }, { "l8", CS_ISO8859_14 }, { "ISO-8859-15", CS_ISO8859_15 }, { "ISO_8859-15", CS_ISO8859_15 }, { "Latin-9", CS_ISO8859_15 }, { "ISO-8859-16", CS_ISO8859_16 }, { "iso-ir-226", CS_ISO8859_16 }, { "ISO_8859-16", CS_ISO8859_16 }, { "ISO_8859-16:2001", CS_ISO8859_16 }, { "latin10", CS_ISO8859_16 }, { "l10", CS_ISO8859_16 }, { "IBM437", CS_CP437 }, { "cp437", CS_CP437 }, { "437", CS_CP437 }, { "csPC8CodePage437", CS_CP437 }, { "IBM850", CS_CP850 }, { "cp850", CS_CP850 }, { "850", CS_CP850 }, { "csPC850Multilingual", CS_CP850 }, { "windows-1250", CS_CP1250 }, { "windows-1251", CS_CP1251 }, { "windows-1252", CS_CP1252 }, { "windows-1253", CS_CP1253 }, { "windows-1254", CS_CP1254 }, { "windows-1255", CS_CP1255 }, { "windows-1256", CS_CP1256 }, { "windows-1257", CS_CP1257 }, { "windows-1258", CS_CP1258 }, { "KOI8-R", CS_KOI8_R }, { "csKOI8R", CS_KOI8_R }, { "KOI8-U", CS_KOI8_U }, { "macintosh", CS_MAC_ROMAN }, { "mac", CS_MAC_ROMAN }, { "csMacintosh", CS_MAC_ROMAN }, { "VISCII", CS_VISCII }, { "csVISCII", CS_VISCII }, { "hp-roman8", CS_HP_ROMAN8 }, { "roman8", CS_HP_ROMAN8 }, { "r8", CS_HP_ROMAN8 }, { "csHPRoman8", CS_HP_ROMAN8 }, { "DEC-MCS", CS_DEC_MCS }, { "dec", CS_DEC_MCS }, { "csDECMCS", CS_DEC_MCS }, { "UTF-8", CS_UTF8 }, }; const char *charset_to_mimeenc(int charset) { int i; for (i = 0; i < (int)lenof(mimeencs); i++) if (charset == mimeencs[i].charset) return mimeencs[i].name; return NULL; /* not found */ } int charset_from_mimeenc(const char *name) { int i; for (i = 0; i < (int)lenof(mimeencs); i++) { const char *p, *q; p = name; q = mimeencs[i].name; while (*p || *q) { if (tolower(*p) != tolower(*q)) break; p++; q++; } if (!*p && !*q) return mimeencs[i].charset; } return CS_NONE; /* not found */ } Node-path: putty/charset/sbcs.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1137 Text-content-md5: fdcf3965f306a8708076101f1c963f29 Text-content-sha1: a3f61cf569cef38dc44954989c8496279ed21ffe Content-length: 1253 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNccc/* * sbcs.c - routines to handle single-byte character sets. */ #include "charset.h" #include "internal.h" /* * The charset_spec for any single-byte character set should * provide read_sbcs() as its read function, and its `data' field * should be a wchar_t string constant containing the 256 entries * of the translation table. */ void read_sbcs(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { wchar_t const *table = (wchar_t const *)charset->data; UNUSEDARG(state); emit(emitctx, table[input_chr]); } void write_sbcs(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { wchar_t const *table = (wchar_t const *)charset->data; int i; UNUSEDARG(state); /* * FIXME: this should work, but it's ludicrously inefficient. * We should be using the ucs2sbcs table. */ for (i = 0; i < 256; i++) if (table[i] == input_chr) { emit(emitctx, i); return; } emit(emitctx, ERROR); } Node-path: putty/charset/sbcs.dat Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 47108 Text-content-md5: c1fbdb11d8447b7b3257a57a2b97680a Text-content-sha1: 92a03d2c84eb96b967d4bbf5178cf3db7cde987a Content-length: 47224 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNsss Data file defining single-byte character sets. All lines which begin with whitespace are considered comments. To generate an SBCS table from a unicode.org mapping table: gensbcs() { wget -q -O - "$1" | tr '\r' '\n' | \ perl -ne '/^(0x.*)\s+(0x.*)\s+/ and $a[hex $1]=sprintf "%04x", hex $2;' \ -e 'BEGIN{for($i=0;$i<256;$i++){$a[$i]="XXXX";' \ -e ' if ($i < 32 or $i == 127) {$a[$i]=sprintf "%04x", $i}}}' \ -e 'END{for($i=0;$i<256;$i++){printf"%s%s",$a[$i],$i%16==15?"\n":" "}}' } (A couple of noteworthy ickinesses here. For a start, any undefined characters in the control-code regions (00-1F and 7F) are assumed to be the Unicode code point corresponding to their index, since the Mac Roman mapping table declines to define them but realistically you don't want to be messing with that sort of thing. Secondly, the Mac mapping tables are shipped with Mac line endings, so note the `tr' to turn them into something legible to Perl...) Here are the ISO-8859-x tables, generated by this piece of Bourne shell: for i in 1 2 3 4 5 6 7 8 9 10 11 13 14 15 16; do echo charset CS_ISO8859_$i gensbcs http://www.unicode.org/Public/MAPPINGS/ISO8859/8859-$i.TXT echo done charset CS_ISO8859_1 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 00d0 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 00dd 00de 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 00f0 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 00fd 00fe 00ff charset CS_ISO8859_2 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0104 02d8 0141 00a4 013d 015a 00a7 00a8 0160 015e 0164 0179 00ad 017d 017b 00b0 0105 02db 0142 00b4 013e 015b 02c7 00b8 0161 015f 0165 017a 02dd 017e 017c 0154 00c1 00c2 0102 00c4 0139 0106 00c7 010c 00c9 0118 00cb 011a 00cd 00ce 010e 0110 0143 0147 00d3 00d4 0150 00d6 00d7 0158 016e 00da 0170 00dc 00dd 0162 00df 0155 00e1 00e2 0103 00e4 013a 0107 00e7 010d 00e9 0119 00eb 011b 00ed 00ee 010f 0111 0144 0148 00f3 00f4 0151 00f6 00f7 0159 016f 00fa 0171 00fc 00fd 0163 02d9 charset CS_ISO8859_3 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0126 02d8 00a3 00a4 XXXX 0124 00a7 00a8 0130 015e 011e 0134 00ad XXXX 017b 00b0 0127 00b2 00b3 00b4 00b5 0125 00b7 00b8 0131 015f 011f 0135 00bd XXXX 017c 00c0 00c1 00c2 XXXX 00c4 010a 0108 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf XXXX 00d1 00d2 00d3 00d4 0120 00d6 00d7 011c 00d9 00da 00db 00dc 016c 015c 00df 00e0 00e1 00e2 XXXX 00e4 010b 0109 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef XXXX 00f1 00f2 00f3 00f4 0121 00f6 00f7 011d 00f9 00fa 00fb 00fc 016d 015d 02d9 charset CS_ISO8859_4 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0104 0138 0156 00a4 0128 013b 00a7 00a8 0160 0112 0122 0166 00ad 017d 00af 00b0 0105 02db 0157 00b4 0129 013c 02c7 00b8 0161 0113 0123 0167 014a 017e 014b 0100 00c1 00c2 00c3 00c4 00c5 00c6 012e 010c 00c9 0118 00cb 0116 00cd 00ce 012a 0110 0145 014c 0136 00d4 00d5 00d6 00d7 00d8 0172 00da 00db 00dc 0168 016a 00df 0101 00e1 00e2 00e3 00e4 00e5 00e6 012f 010d 00e9 0119 00eb 0117 00ed 00ee 012b 0111 0146 014d 0137 00f4 00f5 00f6 00f7 00f8 0173 00fa 00fb 00fc 0169 016b 02d9 charset CS_ISO8859_5 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0401 0402 0403 0404 0405 0406 0407 0408 0409 040a 040b 040c 00ad 040e 040f 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041a 041b 041c 041d 041e 041f 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042a 042b 042c 042d 042e 042f 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043a 043b 043c 043d 043e 043f 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044a 044b 044c 044d 044e 044f 2116 0451 0452 0453 0454 0455 0456 0457 0458 0459 045a 045b 045c 00a7 045e 045f charset CS_ISO8859_6 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 XXXX XXXX XXXX 00a4 XXXX XXXX XXXX XXXX XXXX XXXX XXXX 060c 00ad XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 061b XXXX XXXX XXXX 061f XXXX 0621 0622 0623 0624 0625 0626 0627 0628 0629 062a 062b 062c 062d 062e 062f 0630 0631 0632 0633 0634 0635 0636 0637 0638 0639 063a XXXX XXXX XXXX XXXX XXXX 0640 0641 0642 0643 0644 0645 0646 0647 0648 0649 064a 064b 064c 064d 064e 064f 0650 0651 0652 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX charset CS_ISO8859_7 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 2018 2019 00a3 XXXX XXXX 00a6 00a7 00a8 00a9 XXXX 00ab 00ac 00ad XXXX 2015 00b0 00b1 00b2 00b3 0384 0385 0386 00b7 0388 0389 038a 00bb 038c 00bd 038e 038f 0390 0391 0392 0393 0394 0395 0396 0397 0398 0399 039a 039b 039c 039d 039e 039f 03a0 03a1 XXXX 03a3 03a4 03a5 03a6 03a7 03a8 03a9 03aa 03ab 03ac 03ad 03ae 03af 03b0 03b1 03b2 03b3 03b4 03b5 03b6 03b7 03b8 03b9 03ba 03bb 03bc 03bd 03be 03bf 03c0 03c1 03c2 03c3 03c4 03c5 03c6 03c7 03c8 03c9 03ca 03cb 03cc 03cd 03ce XXXX charset CS_ISO8859_8 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 XXXX 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00d7 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00f7 00bb 00bc 00bd 00be XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX 2017 05d0 05d1 05d2 05d3 05d4 05d5 05d6 05d7 05d8 05d9 05da 05db 05dc 05dd 05de 05df 05e0 05e1 05e2 05e3 05e4 05e5 05e6 05e7 05e8 05e9 05ea XXXX XXXX 200e 200f XXXX charset CS_ISO8859_9 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 011e 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 0130 015e 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 011f 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 0131 015f 00ff charset CS_ISO8859_10 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0104 0112 0122 012a 0128 0136 00a7 013b 0110 0160 0166 017d 00ad 016a 014a 00b0 0105 0113 0123 012b 0129 0137 00b7 013c 0111 0161 0167 017e 2015 016b 014b 0100 00c1 00c2 00c3 00c4 00c5 00c6 012e 010c 00c9 0118 00cb 0116 00cd 00ce 00cf 00d0 0145 014c 00d3 00d4 00d5 00d6 0168 00d8 0172 00da 00db 00dc 00dd 00de 00df 0101 00e1 00e2 00e3 00e4 00e5 00e6 012f 010d 00e9 0119 00eb 0117 00ed 00ee 00ef 00f0 0146 014d 00f3 00f4 00f5 00f6 0169 00f8 0173 00fa 00fb 00fc 00fd 00fe 0138 charset CS_ISO8859_11 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0e01 0e02 0e03 0e04 0e05 0e06 0e07 0e08 0e09 0e0a 0e0b 0e0c 0e0d 0e0e 0e0f 0e10 0e11 0e12 0e13 0e14 0e15 0e16 0e17 0e18 0e19 0e1a 0e1b 0e1c 0e1d 0e1e 0e1f 0e20 0e21 0e22 0e23 0e24 0e25 0e26 0e27 0e28 0e29 0e2a 0e2b 0e2c 0e2d 0e2e 0e2f 0e30 0e31 0e32 0e33 0e34 0e35 0e36 0e37 0e38 0e39 0e3a XXXX XXXX XXXX XXXX 0e3f 0e40 0e41 0e42 0e43 0e44 0e45 0e46 0e47 0e48 0e49 0e4a 0e4b 0e4c 0e4d 0e4e 0e4f 0e50 0e51 0e52 0e53 0e54 0e55 0e56 0e57 0e58 0e59 0e5a 0e5b XXXX XXXX XXXX XXXX charset CS_ISO8859_13 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 201d 00a2 00a3 00a4 201e 00a6 00a7 00d8 00a9 0156 00ab 00ac 00ad 00ae 00c6 00b0 00b1 00b2 00b3 201c 00b5 00b6 00b7 00f8 00b9 0157 00bb 00bc 00bd 00be 00e6 0104 012e 0100 0106 00c4 00c5 0118 0112 010c 00c9 0179 0116 0122 0136 012a 013b 0160 0143 0145 00d3 014c 00d5 00d6 00d7 0172 0141 015a 016a 00dc 017b 017d 00df 0105 012f 0101 0107 00e4 00e5 0119 0113 010d 00e9 017a 0117 0123 0137 012b 013c 0161 0144 0146 00f3 014d 00f5 00f6 00f7 0173 0142 015b 016b 00fc 017c 017e 2019 charset CS_ISO8859_14 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 1e02 1e03 00a3 010a 010b 1e0a 00a7 1e80 00a9 1e82 1e0b 1ef2 00ad 00ae 0178 1e1e 1e1f 0120 0121 1e40 1e41 00b6 1e56 1e81 1e57 1e83 1e60 1ef3 1e84 1e85 1e61 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 0174 00d1 00d2 00d3 00d4 00d5 00d6 1e6a 00d8 00d9 00da 00db 00dc 00dd 0176 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 0175 00f1 00f2 00f3 00f4 00f5 00f6 1e6b 00f8 00f9 00fa 00fb 00fc 00fd 0177 00ff charset CS_ISO8859_15 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 00a1 00a2 00a3 20ac 00a5 0160 00a7 0161 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 017d 00b5 00b6 00b7 017e 00b9 00ba 00bb 0152 0153 0178 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 00d0 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 00dd 00de 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 00f0 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 00fd 00fe 00ff charset CS_ISO8859_16 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 0104 0105 0141 20ac 201e 0160 00a7 0161 00a9 0218 00ab 0179 00ad 017a 017b 00b0 00b1 010c 0142 017d 201d 00b6 00b7 017e 010d 0219 00bb 0152 0153 0178 017c 00c0 00c1 00c2 0102 00c4 0106 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 0110 0143 00d2 00d3 00d4 0150 00d6 015a 0170 00d9 00da 00db 00dc 0118 021a 00df 00e0 00e1 00e2 0103 00e4 0107 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 0111 0144 00f2 00f3 00f4 0151 00f6 015b 0171 00f9 00fa 00fb 00fc 0119 021b 00ff Some X fonts are encoded in a variant form of ISO8859-1: everything above 0x20 (space) is as normal, but the first 32 characters contain the VT100 line drawing glyphs as they would appear from positions 0x5F to 0x7E inclusive. Here is the modified ISO8859-1 code table. charset CS_ISO8859_1_X11 0020 2666 2592 2409 240c 240d 240a 00b0 00b1 2424 240b 2518 2510 250c 2514 253c 23ba 23bb 2500 23bc 23bd 251c 2524 2534 252c 2502 2264 2265 03c0 2260 00a3 00b7 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 00d0 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 00dd 00de 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 00f0 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 00fd 00fe 00ff Here are some PC (old DOS) code pages, generated by this piece of Bourne shell: for i in 437 850; do echo charset CS_CP$i gensbcs http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP$i.TXT echo done charset CS_CP437 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c7 00fc 00e9 00e2 00e4 00e0 00e5 00e7 00ea 00eb 00e8 00ef 00ee 00ec 00c4 00c5 00c9 00e6 00c6 00f4 00f6 00f2 00fb 00f9 00ff 00d6 00dc 00a2 00a3 00a5 20a7 0192 00e1 00ed 00f3 00fa 00f1 00d1 00aa 00ba 00bf 2310 00ac 00bd 00bc 00a1 00ab 00bb 2591 2592 2593 2502 2524 2561 2562 2556 2555 2563 2551 2557 255d 255c 255b 2510 2514 2534 252c 251c 2500 253c 255e 255f 255a 2554 2569 2566 2560 2550 256c 2567 2568 2564 2565 2559 2558 2552 2553 256b 256a 2518 250c 2588 2584 258c 2590 2580 03b1 00df 0393 03c0 03a3 03c3 00b5 03c4 03a6 0398 03a9 03b4 221e 03c6 03b5 2229 2261 00b1 2265 2264 2320 2321 00f7 2248 00b0 2219 00b7 221a 207f 00b2 25a0 00a0 charset CS_CP850 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c7 00fc 00e9 00e2 00e4 00e0 00e5 00e7 00ea 00eb 00e8 00ef 00ee 00ec 00c4 00c5 00c9 00e6 00c6 00f4 00f6 00f2 00fb 00f9 00ff 00d6 00dc 00f8 00a3 00d8 00d7 0192 00e1 00ed 00f3 00fa 00f1 00d1 00aa 00ba 00bf 00ae 00ac 00bd 00bc 00a1 00ab 00bb 2591 2592 2593 2502 2524 00c1 00c2 00c0 00a9 2563 2551 2557 255d 00a2 00a5 2510 2514 2534 252c 251c 2500 253c 00e3 00c3 255a 2554 2569 2566 2560 2550 256c 00a4 00f0 00d0 00ca 00cb 00c8 0131 00cd 00ce 00cf 2518 250c 2588 2584 00a6 00cc 2580 00d3 00df 00d4 00d2 00f5 00d5 00b5 00fe 00de 00da 00db 00d9 00fd 00dd 00af 00b4 00ad 00b1 2017 00be 00b6 00a7 00f7 00b8 00b0 00a8 00b7 00b9 00b3 00b2 25a0 00a0 Here are some Windows code pages, generated by this piece of Bourne shell: for i in 1250 1251 1252 1253 1254 1255 1256 1257 1258; do echo charset CS_CP$i gensbcs http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP$i.TXT echo done charset CS_CP1250 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a XXXX 201e 2026 2020 2021 XXXX 2030 0160 2039 015a 0164 017d 0179 XXXX 2018 2019 201c 201d 2022 2013 2014 XXXX 2122 0161 203a 015b 0165 017e 017a 00a0 02c7 02d8 0141 00a4 0104 00a6 00a7 00a8 00a9 015e 00ab 00ac 00ad 00ae 017b 00b0 00b1 02db 0142 00b4 00b5 00b6 00b7 00b8 0105 015f 00bb 013d 02dd 013e 017c 0154 00c1 00c2 0102 00c4 0139 0106 00c7 010c 00c9 0118 00cb 011a 00cd 00ce 010e 0110 0143 0147 00d3 00d4 0150 00d6 00d7 0158 016e 00da 0170 00dc 00dd 0162 00df 0155 00e1 00e2 0103 00e4 013a 0107 00e7 010d 00e9 0119 00eb 011b 00ed 00ee 010f 0111 0144 0148 00f3 00f4 0151 00f6 00f7 0159 016f 00fa 0171 00fc 00fd 0163 02d9 charset CS_CP1251 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0402 0403 201a 0453 201e 2026 2020 2021 20ac 2030 0409 2039 040a 040c 040b 040f 0452 2018 2019 201c 201d 2022 2013 2014 XXXX 2122 0459 203a 045a 045c 045b 045f 00a0 040e 045e 0408 00a4 0490 00a6 00a7 0401 00a9 0404 00ab 00ac 00ad 00ae 0407 00b0 00b1 0406 0456 0491 00b5 00b6 00b7 0451 2116 0454 00bb 0458 0405 0455 0457 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041a 041b 041c 041d 041e 041f 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042a 042b 042c 042d 042e 042f 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043a 043b 043c 043d 043e 043f 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044a 044b 044c 044d 044e 044f charset CS_CP1252 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a 0192 201e 2026 2020 2021 02c6 2030 0160 2039 0152 XXXX 017d XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 02dc 2122 0161 203a 0153 XXXX 017e 0178 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 00d0 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 00dd 00de 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 00f0 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 00fd 00fe 00ff charset CS_CP1253 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a 0192 201e 2026 2020 2021 XXXX 2030 XXXX 2039 XXXX XXXX XXXX XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 XXXX 2122 XXXX 203a XXXX XXXX XXXX XXXX 00a0 0385 0386 00a3 00a4 00a5 00a6 00a7 00a8 00a9 XXXX 00ab 00ac 00ad 00ae 2015 00b0 00b1 00b2 00b3 0384 00b5 00b6 00b7 0388 0389 038a 00bb 038c 00bd 038e 038f 0390 0391 0392 0393 0394 0395 0396 0397 0398 0399 039a 039b 039c 039d 039e 039f 03a0 03a1 XXXX 03a3 03a4 03a5 03a6 03a7 03a8 03a9 03aa 03ab 03ac 03ad 03ae 03af 03b0 03b1 03b2 03b3 03b4 03b5 03b6 03b7 03b8 03b9 03ba 03bb 03bc 03bd 03be 03bf 03c0 03c1 03c2 03c3 03c4 03c5 03c6 03c7 03c8 03c9 03ca 03cb 03cc 03cd 03ce XXXX charset CS_CP1254 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a 0192 201e 2026 2020 2021 02c6 2030 0160 2039 0152 XXXX XXXX XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 02dc 2122 0161 203a 0153 XXXX XXXX 0178 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf 011e 00d1 00d2 00d3 00d4 00d5 00d6 00d7 00d8 00d9 00da 00db 00dc 0130 015e 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef 011f 00f1 00f2 00f3 00f4 00f5 00f6 00f7 00f8 00f9 00fa 00fb 00fc 0131 015f 00ff charset CS_CP1255 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a 0192 201e 2026 2020 2021 02c6 2030 XXXX 2039 XXXX XXXX XXXX XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 02dc 2122 XXXX 203a XXXX XXXX XXXX XXXX 00a0 00a1 00a2 00a3 20aa 00a5 00a6 00a7 00a8 00a9 00d7 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00f7 00bb 00bc 00bd 00be 00bf 05b0 05b1 05b2 05b3 05b4 05b5 05b6 05b7 05b8 05b9 XXXX 05bb 05bc 05bd 05be 05bf 05c0 05c1 05c2 05c3 05f0 05f1 05f2 05f3 05f4 XXXX XXXX XXXX XXXX XXXX XXXX XXXX 05d0 05d1 05d2 05d3 05d4 05d5 05d6 05d7 05d8 05d9 05da 05db 05dc 05dd 05de 05df 05e0 05e1 05e2 05e3 05e4 05e5 05e6 05e7 05e8 05e9 05ea XXXX XXXX 200e 200f XXXX charset CS_CP1256 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac 067e 201a 0192 201e 2026 2020 2021 02c6 2030 0679 2039 0152 0686 0698 0688 06af 2018 2019 201c 201d 2022 2013 2014 06a9 2122 0691 203a 0153 200c 200d 06ba 00a0 060c 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 06be 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 061b 00bb 00bc 00bd 00be 061f 06c1 0621 0622 0623 0624 0625 0626 0627 0628 0629 062a 062b 062c 062d 062e 062f 0630 0631 0632 0633 0634 0635 0636 00d7 0637 0638 0639 063a 0640 0641 0642 0643 00e0 0644 00e2 0645 0646 0647 0648 00e7 00e8 00e9 00ea 00eb 0649 064a 00ee 00ef 064b 064c 064d 064e 00f4 064f 0650 00f7 0651 00f9 0652 00fb 00fc 200e 200f 06d2 charset CS_CP1257 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a XXXX 201e 2026 2020 2021 XXXX 2030 XXXX 2039 XXXX 00a8 02c7 00b8 XXXX 2018 2019 201c 201d 2022 2013 2014 XXXX 2122 XXXX 203a XXXX 00af 02db XXXX 00a0 XXXX 00a2 00a3 00a4 XXXX 00a6 00a7 00d8 00a9 0156 00ab 00ac 00ad 00ae 00c6 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00f8 00b9 0157 00bb 00bc 00bd 00be 00e6 0104 012e 0100 0106 00c4 00c5 0118 0112 010c 00c9 0179 0116 0122 0136 012a 013b 0160 0143 0145 00d3 014c 00d5 00d6 00d7 0172 0141 015a 016a 00dc 017b 017d 00df 0105 012f 0101 0107 00e4 00e5 0119 0113 010d 00e9 017a 0117 0123 0137 012b 013c 0161 0144 0146 00f3 014d 00f5 00f6 00f7 0173 0142 015b 016b 00fc 017c 017e 02d9 charset CS_CP1258 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 20ac XXXX 201a 0192 201e 2026 2020 2021 02c6 2030 XXXX 2039 0152 XXXX XXXX XXXX XXXX 2018 2019 201c 201d 2022 2013 2014 02dc 2122 XXXX 203a 0153 XXXX XXXX 0178 00a0 00a1 00a2 00a3 00a4 00a5 00a6 00a7 00a8 00a9 00aa 00ab 00ac 00ad 00ae 00af 00b0 00b1 00b2 00b3 00b4 00b5 00b6 00b7 00b8 00b9 00ba 00bb 00bc 00bd 00be 00bf 00c0 00c1 00c2 0102 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 0300 00cd 00ce 00cf 0110 00d1 0309 00d3 00d4 01a0 00d6 00d7 00d8 00d9 00da 00db 00dc 01af 0303 00df 00e0 00e1 00e2 0103 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 0301 00ed 00ee 00ef 0111 00f1 0323 00f3 00f4 01a1 00f6 00f7 00f8 00f9 00fa 00fb 00fc 01b0 20ab 00ff KOI8-R, generated by this code: { echo charset CS_KOI8_R; gensbcs http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT; } charset CS_KOI8_R 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 2500 2502 250c 2510 2514 2518 251c 2524 252c 2534 253c 2580 2584 2588 258c 2590 2591 2592 2593 2320 25a0 2219 221a 2248 2264 2265 00a0 2321 00b0 00b2 00b7 00f7 2550 2551 2552 0451 2553 2554 2555 2556 2557 2558 2559 255a 255b 255c 255d 255e 255f 2560 2561 0401 2562 2563 2564 2565 2566 2567 2568 2569 256a 256b 256c 00a9 044e 0430 0431 0446 0434 0435 0444 0433 0445 0438 0439 043a 043b 043c 043d 043e 043f 044f 0440 0441 0442 0443 0436 0432 044c 044b 0437 0448 044d 0449 0447 044a 042e 0410 0411 0426 0414 0415 0424 0413 0425 0418 0419 041a 041b 041c 041d 041e 041f 042f 0420 0421 0422 0423 0416 0412 042c 042b 0417 0428 042d 0429 0427 042a KOI8-U: I can't find an easily machine-processable mapping table for this one, so I've created it by hand-editing the KOI8-R mapping table in accordance with the list of differences specified in RFC2319. Note that RFC2319 has an apparent error: position B4 is listed as U+0404 in the main character set list, but as U+0403 in Appendix A (differences from KOI8-R). Both agree that it should be CYRILLIC CAPITAL LETTER UKRAINIAN IE, however, and the Unicode character database says that therefore U+0404 is the correct value. charset CS_KOI8_U 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 2500 2502 250c 2510 2514 2518 251c 2524 252c 2534 253c 2580 2584 2588 258c 2590 2591 2592 2593 2320 25a0 2219 221a 2248 2264 2265 00a0 2321 00b0 00b2 00b7 00f7 2550 2551 2552 0451 0454 2554 0456 0457 2557 2558 2559 255a 255b 0491 255d 255e 255f 2560 2561 0401 0404 2563 0406 0407 2566 2567 2568 2569 256a 0490 256c 00a9 044e 0430 0431 0446 0434 0435 0444 0433 0445 0438 0439 043a 043b 043c 043d 043e 043f 044f 0440 0441 0442 0443 0436 0432 044c 044b 0437 0448 044d 0449 0447 044a 042e 0410 0411 0426 0414 0415 0424 0413 0425 0418 0419 041a 041b 041c 041d 041e 041f 042f 0420 0421 0422 0423 0416 0412 042c 042b 0417 0428 042d 0429 0427 042a Mac Roman, generated by this code: { echo charset CS_MAC_ROMAN; gensbcs http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/ROMAN.TXT; } The code point F8FF at position F0 is an interesting one. In Unicode, it's the last of the Private Use section. The mapping table states that it should be an Apple logo. I suppose we should just leave it as it is; there's bound to be some software out there that understands U+F8FF to be an Apple logo! charset CS_MAC_ROMAN 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 00c4 00c5 00c7 00c9 00d1 00d6 00dc 00e1 00e0 00e2 00e4 00e3 00e5 00e7 00e9 00e8 00ea 00eb 00ed 00ec 00ee 00ef 00f1 00f3 00f2 00f4 00f6 00f5 00fa 00f9 00fb 00fc 2020 00b0 00a2 00a3 00a7 2022 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 00c6 00d8 221e 00b1 2264 2265 00a5 00b5 2202 2211 220f 03c0 222b 00aa 00ba 03a9 00e6 00f8 00bf 00a1 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 00c0 00c3 00d5 0152 0153 2013 2014 201c 201d 2018 2019 00f7 25ca 00ff 0178 2044 20ac 2039 203a fb01 fb02 2021 00b7 201a 201e 2030 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 f8ff 00d2 00da 00db 00d9 0131 02c6 02dc 00af 02d8 02d9 02da 00b8 02dd 02db 02c7 Roman Czyborra's web site (http://czyborra.com/) has a variety of other useful mapping tables, in a slightly different format (and gzipped). Here's a shell/Perl function to generate an SBCS table from a Czyborra mapping table: gensbcs_c() { wget -q -O - "$1" | gzip -d | \ perl -ne '/^=(.*)\s+U\+(.*)\s+/ and $a[hex $1]=sprintf "%04x", hex $2;' \ -e 'BEGIN{for($i=0;$i<256;$i++){$a[$i]="XXXX";' \ -e 'if ($i < 32 or ($i >=127 and $i < 160)) {$a[$i]=sprintf "%04x", $i}}}' \ -e 'END{for($i=0;$i<256;$i++){printf"%s%s",$a[$i],$i%16==15?"\n":" "}}' } So here we have some character sets generated from Czyborra mapping tables: VISCII, HP-Roman8, and the DEC Multinational Character Set. { echo charset CS_VISCII; gensbcs_c http://czyborra.com/charsets/viscii.txt.gz; echo; echo charset CS_HP_ROMAN8; gensbcs_c http://czyborra.com/charsets/hp-roman8.txt.gz; echo; echo charset CS_DEC_MCS; gensbcs_c http://czyborra.com/charsets/dec-mcs.txt.gz; echo; } charset CS_VISCII 0000 0001 1eb2 0003 0004 1eb4 1eaa 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 1ef6 0015 0016 0017 0018 1ef8 001a 001b 001c 001d 1ef4 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 1ea0 1eae 1eb0 1eb6 1ea4 1ea6 1ea8 1eac 1ebc 1eb8 1ebe 1ec0 1ec2 1ec4 1ec6 1ed0 1ed2 1ed4 1ed6 1ed8 1ee2 1eda 1edc 1ede 1eca 1ece 1ecc 1ec8 1ee6 0168 1ee4 1ef2 00d5 1eaf 1eb1 1eb7 1ea5 1ea7 1ea8 1ead 1ebd 1eb9 1ebf 1ec1 1ec3 1ec5 1ec7 1ed1 1ed3 1ed5 1ed7 1ee0 01a0 1ed9 1edd 1edf 1ecb 1ef0 1ee8 1eea 1eec 01a1 1edb 01af 00c0 00c1 00c2 00c3 1ea2 0102 1eb3 1eb5 00c8 00c9 00ca 1eba 00cc 00cd 0128 1ef3 0110 1ee9 00d2 00d3 00d4 1ea1 1ef7 1eeb 1eed 00d9 00da 1ef9 1ef5 00dd 1ee1 01b0 00e0 00e1 00e2 00e3 1ea3 0103 1eef 1eab 00e8 00e9 00ea 1ebb 00ec 00ed 0129 1ec9 0111 1ef1 00f2 00f3 00f4 00f5 1ecf 1ecd 1ee5 00f9 00fa 0169 1ee7 00fd 1ee3 1eee charset CS_HP_ROMAN8 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f 00a0 00c0 00c2 00c8 00ca 00cb 00ce 00cf 00b4 02cb 02c6 00a8 02dc 00d9 00db 20a4 00af 00dd 00fd 00b0 00c7 00e7 00d1 00f1 00a1 00bf 00a4 00a3 00a5 00a7 0192 00a2 00e2 00ea 00f4 00fb 00e1 00e9 00f3 00fa 00e0 00e8 00f2 00f9 00e4 00eb 00f6 00fc 00c5 00ee 00d8 00c6 00e5 00ed 00f8 00e6 00c4 00ec 00d6 00dc 00c9 00ef 00df 00d4 00c1 00c3 00e3 00d0 00f0 00cd 00cc 00d3 00d2 00d5 00f5 0160 0161 00da 0178 00ff 00de 00fe 00b7 00b5 00b6 00be 2014 00bc 00bd 00aa 00ba 00ab 25a0 00bb 00b1 XXXX charset CS_DEC_MCS 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 000c 000d 000e 000f 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001a 001b 001c 001d 001e 001f 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002a 002b 002c 002d 002e 002f 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003a 003b 003c 003d 003e 003f 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004a 004b 004c 004d 004e 004f 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005a 005b 005c 005d 005e 005f 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006a 006b 006c 006d 006e 006f 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007a 007b 007c 007d 007e 007f 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008a 008b 008c 008d 008e 008f 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009a 009b 009c 009d 009e 009f XXXX 00a1 00a2 00a3 XXXX 00a5 XXXX 00a7 00a4 00a9 00aa 00ab XXXX XXXX XXXX XXXX 00b0 00b1 00b2 00b3 XXXX 00b5 00b6 00b7 XXXX 00b9 00ba 00bb 00bc 00bd XXXX 00bf 00c0 00c1 00c2 00c3 00c4 00c5 00c6 00c7 00c8 00c9 00ca 00cb 00cc 00cd 00ce 00cf XXXX 00d1 00d2 00d3 00d4 00d5 00d6 0152 00d8 00d9 00da 00db 00dc 0178 XXXX 00df 00e0 00e1 00e2 00e3 00e4 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ec 00ed 00ee 00ef XXXX 00f1 00f2 00f3 00f4 00f5 00f6 0153 00f8 00f9 00fa 00fb 00fc 00ff XXXX XXXX Node-path: putty/charset/sbcsgen.pl Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2237 Text-content-md5: f60a11227504d73432c230cc0bae70b7 Text-content-sha1: 792f03e4b716f3d1458a486bddd10070a4f99928 Content-length: 2353 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN///#!/usr/bin/env perl -w # This script generates sbcsdat.c (the data for all the SBCSes) from its # source form sbcs.dat. $infile = "sbcs.dat"; $outfile = "sbcsdat.c"; open FOO, $infile; open BAR, ">$outfile"; select BAR; print "/*\n"; print " * sbcsdat.c - data definitions for single-byte character sets.\n"; print " *\n"; print " * Generated by sbcsgen.pl from sbcs.dat.\n"; print " * You should edit those files rather than editing this one.\n"; print " */\n"; print "\n"; print "#ifndef ENUM_CHARSETS\n"; print "\n"; print "#include \"charset.h\"\n"; print "#include \"internal.h\"\n"; print "\n"; my $charsetname = undef; my @vals = (); my @charsetnames = (); while () { chomp; if (/^charset (.*)$/) { $charsetname = $1; @vals = (); } elsif (/^[0-9a-fA-FX]/) { push @vals, map { $_ eq "XXXX" ? -1 : hex $_ } split / +/, $_; if (scalar @vals > 256) { die "$infile:$.: charset $charsetname has more than 256 values\n"; } elsif (scalar @vals == 256) { &outcharset($charsetname, @vals); push @charsetnames, $charsetname; $charsetname = undef; @vals = (); } } } print "#else /* ENUM_CHARSETS */\n"; print "\n"; foreach $i (@charsetnames) { print "ENUM_CHARSET($i)\n"; } print "\n"; print "#endif /* ENUM_CHARSETS */\n"; sub outcharset($@) { my ($name, @vals) = @_; my ($prefix, $i, @sorted); print "static const sbcs_data data_$name = {\n"; print " {\n"; $prefix = " "; @sorted = (); for ($i = 0; $i < 256; $i++) { if ($vals[$i] < 0) { printf "%sERROR ", $prefix; } else { printf "%s0x%04x", $prefix, $vals[$i]; push @sorted, [$i, $vals[$i]]; } if ($i % 8 == 7) { $prefix = ",\n "; } else { $prefix = ", "; } } print "\n },\n {\n"; @sorted = sort { $a->[1] <=> $b->[1] } @sorted; $prefix = " "; for ($i = 0; $i < scalar @sorted; $i++) { printf "%s0x%02x", $prefix, $sorted[$i]->[0]; if ($i % 8 == 7) { $prefix = ",\n "; } else { $prefix = ", "; } } printf "\n },\n %d\n", scalar @sorted; print "};\n"; print "const charset_spec charset_$name = {\n" . " $name, read_sbcs, write_sbcs, &data_$name\n};\n\n"; } Node-path: putty/charset/slookup.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 541 Text-content-md5: e5ebd45124482605aa3aca8073b48411 Text-content-sha1: b1adbdaa614e279041834ccbd4bc37076e7e6547 Content-length: 657 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN/* * slookup.c - static lookup of character sets. */ #include "charset.h" #include "internal.h" #define ENUM_CHARSET(x) extern charset_spec const charset_##x; #include "enum.c" #undef ENUM_CHARSET static charset_spec const *const cs_table[] = { #define ENUM_CHARSET(x) &charset_##x, #include "enum.c" #undef ENUM_CHARSET }; charset_spec const *charset_find_spec(int charset) { int i; for (i = 0; i < (int)lenof(cs_table); i++) if (cs_table[i]->charset == charset) return cs_table[i]; return NULL; } Node-path: putty/charset/toucs.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1973 Text-content-md5: 6f0a85c60f40b459c1f69005a1b99175 Text-content-sha1: 46d5e09f8d7d0e0179900700a3fb1d2d45437ae9 Content-length: 2089 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN'''/* * toucs.c - convert charsets to Unicode. */ #include "charset.h" #include "internal.h" struct unicode_emit_param { wchar_t *output; int outlen; const wchar_t *errstr; int errlen; int stopped; }; static void unicode_emit(void *ctx, long int output) { struct unicode_emit_param *param = (struct unicode_emit_param *)ctx; wchar_t outval; wchar_t const *p; int outlen; if (output == ERROR) { if (param->errstr) { p = param->errstr; outlen = param->errlen; } else { outval = 0xFFFD; /* U+FFFD REPLACEMENT CHARACTER */ p = &outval; outlen = 1; } } else { outval = output; p = &outval; outlen = 1; } if (param->outlen >= outlen) { while (outlen > 0) { *param->output++ = *p++; param->outlen--; outlen--; } } else { param->stopped = 1; } } int charset_to_unicode(char **input, int *inlen, wchar_t *output, int outlen, int charset, charset_state *state, const wchar_t *errstr, int errlen) { charset_spec const *spec = charset_find_spec(charset); charset_state localstate; struct unicode_emit_param param; param.output = output; param.outlen = outlen; param.errstr = errstr; param.errlen = errlen; param.stopped = 0; if (!state) { localstate.s0 = 0; } else { localstate = *state; /* structure copy */ } while (*inlen > 0) { int lenbefore = param.output - output; spec->read(spec, (unsigned char)**input, &localstate, unicode_emit, ¶m); if (param.stopped) { /* * The emit function has _tried_ to output some * characters, but ran up against the end of the * buffer. Leave immediately, and return what happened * _before_ attempting to process this character. */ return lenbefore; } if (state) *state = localstate; /* structure copy */ (*input)++; (*inlen)--; } return param.output - output; } Node-path: putty/charset/utf8.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 30035 Text-content-md5: 269a135bb7a613413a84b6b6c921dd48 Text-content-sha1: 7191ac2e4896e4f0c6eb357879bc90716488f8ca Content-length: 30151 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNBBB/* * utf8.c - routines to handle UTF-8. */ #ifndef ENUM_CHARSETS #include "charset.h" #include "internal.h" /* * UTF-8 has no associated data, so `charset' may be ignored. */ void read_utf8(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { UNUSEDARG(charset); /* * For reading UTF-8, the `state' word contains: * * - in bits 29-31, the number of bytes expected to be in the * current multibyte character (which we can tell instantly * from the first byte, of course). * * - in bits 26-28, the number of bytes _seen so far_ in the * current multibyte character. * * - in the remainder of the word, the current value of the * character, which is shifted upwards by 6 bits to * accommodate each new byte. * * As required, the state is zero when we are not in the middle * of a multibyte character at all. * * For example, when reading E9 8D 8B, starting at state=0: * * - after E9, the state is 0x64000009 * - after 8D, the state is 0x6800024d * - after 8B, the state conceptually becomes 0x6c00934b, at * which point we notice we've got as many characters as we * were expecting, output U+934B, and reset the state to * zero. * * Note that the maximum number of bits we might need to store * in the character value field is 25 (U+7FFFFFFF contains 31 * bits, but we will never actually store its full value * because when we receive the last 6 bits in the final * continuation byte we will output it and revert the state to * zero). Hence the character value field never collides with * the byte counts. */ if (input_chr < 0x80) { /* * Single-byte character. If the state is nonzero before * coming here, output an error for an incomplete sequence. * Then output the character. */ if (state->s0 != 0) { emit(emitctx, ERROR); state->s0 = 0; } emit(emitctx, input_chr); } else if (input_chr == 0xFE || input_chr == 0xFF) { /* * FE and FF bytes should _never_ occur in UTF-8. They are * automatic errors; if the state was nonzero to start * with, output a further error for an incomplete sequence. */ if (state->s0 != 0) { emit(emitctx, ERROR); state->s0 = 0; } emit(emitctx, ERROR); } else if (input_chr >= 0x80 && input_chr < 0xC0) { /* * Continuation byte. Output an error for an unexpected * continuation byte, if the state is zero. */ if (state->s0 == 0) { emit(emitctx, ERROR); } else { unsigned long charval; unsigned long topstuff; int bytes; /* * Otherwise, accumulate more of the character value. */ charval = state->s0 & 0x03ffffffL; charval = (charval << 6) | (input_chr & 0x3F); /* * Check the byte counts; if we have not reached the * end of the character, update the state and return. */ topstuff = state->s0 & 0xfc000000L; topstuff += 0x04000000L; /* add one to the byte count */ if (((topstuff << 3) ^ topstuff) & 0xe0000000L) { state->s0 = topstuff | charval; return; } /* * Now we know we've reached the end of the character. * `charval' is the Unicode value. We should check for * various invalid things, and then either output * charval or an error. In all cases we reset the state * to zero. */ bytes = topstuff >> 29; state->s0 = 0; if (charval >= 0xD800 && charval < 0xE000) { /* * Surrogates (0xD800-0xDFFF) may never be encoded * in UTF-8. A surrogate pair in Unicode should * have been encoded as a single UTF-8 character * occupying more than three bytes. */ emit(emitctx, ERROR); } else if (charval == 0xFFFE || charval == 0xFFFF) { /* * U+FFFE and U+FFFF are invalid Unicode characters * and may never be encoded in UTF-8. (This is one * reason why U+FFFF is our way of signalling an * error to our `emit' function :-) */ emit(emitctx, ERROR); } else if ((charval <= 0x7FL /* && bytes > 1 */) || (charval <= 0x7FFL && bytes > 2) || (charval <= 0xFFFFL && bytes > 3) || (charval <= 0x1FFFFFL && bytes > 4) || (charval <= 0x3FFFFFFL && bytes > 5)) { /* * Overlong sequences are not to be tolerated, * under any circumstances. */ emit(emitctx, ERROR); } else { /* * Oh, all right. We'll let this one off. */ emit(emitctx, charval); } } } else { /* * Lead byte. First output an error for an incomplete * sequence, if the state is nonzero. */ if (state->s0 != 0) emit(emitctx, ERROR); /* * Now deal with the lead byte: work out the number of * bytes we expect to see in this character, and extract * the initial bits of it too. */ if (input_chr >= 0xC0 && input_chr < 0xE0) { state->s0 = 0x44000000L | (input_chr & 0x1F); } else if (input_chr >= 0xE0 && input_chr < 0xF0) { state->s0 = 0x64000000L | (input_chr & 0x0F); } else if (input_chr >= 0xF0 && input_chr < 0xF8) { state->s0 = 0x84000000L | (input_chr & 0x07); } else if (input_chr >= 0xF8 && input_chr < 0xFC) { state->s0 = 0xa4000000L | (input_chr & 0x03); } else if (input_chr >= 0xFC && input_chr < 0xFE) { state->s0 = 0xc4000000L | (input_chr & 0x01); } } } /* * UTF-8 is a stateless multi-byte encoding (in the sense that just * after any character has been completed, the state is always the * same); hence when writing it, there is no need to use the * charset_state. */ void write_utf8(charset_spec const *charset, long int input_chr, charset_state *state, void (*emit)(void *ctx, long int output), void *emitctx) { UNUSEDARG(charset); UNUSEDARG(state); /* * Refuse to output any illegal code points. */ if (input_chr == 0xFFFE || input_chr == 0xFFFF || (input_chr >= 0xD800 && input_chr < 0xE000)) { emit(emitctx, ERROR); } else if (input_chr < 0x80) { /* one-byte character */ emit(emitctx, input_chr); } else if (input_chr < 0x800) { /* two-byte character */ emit(emitctx, 0xC0 | (0x1F & (input_chr >> 6))); emit(emitctx, 0x80 | (0x3F & (input_chr ))); } else if (input_chr < 0x10000) { /* three-byte character */ emit(emitctx, 0xE0 | (0x0F & (input_chr >> 12))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 6))); emit(emitctx, 0x80 | (0x3F & (input_chr ))); } else if (input_chr < 0x200000) { /* four-byte character */ emit(emitctx, 0xF0 | (0x07 & (input_chr >> 18))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 12))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 6))); emit(emitctx, 0x80 | (0x3F & (input_chr ))); } else if (input_chr < 0x4000000) {/* five-byte character */ emit(emitctx, 0xF8 | (0x03 & (input_chr >> 24))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 18))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 12))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 6))); emit(emitctx, 0x80 | (0x3F & (input_chr ))); } else { /* six-byte character */ emit(emitctx, 0xFC | (0x01 & (input_chr >> 30))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 24))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 18))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 12))); emit(emitctx, 0x80 | (0x3F & (input_chr >> 6))); emit(emitctx, 0x80 | (0x3F & (input_chr ))); } } #ifdef TESTMODE #include #include int total_errs = 0; void utf8_emit(void *ctx, long output) { wchar_t **p = (wchar_t **)ctx; *(*p)++ = output; } void utf8_read_test(int line, char *input, int inlen, ...) { va_list ap; wchar_t *p, str[512]; int i; charset_state state; unsigned long l; state.s0 = 0; p = str; for (i = 0; i < inlen; i++) read_utf8(NULL, input[i] & 0xFF, &state, utf8_emit, &p); va_start(ap, inlen); l = 0; for (i = 0; i < p - str; i++) { l = va_arg(ap, long int); if (l == -1) { printf("%d: correct string shorter than output\n", line); total_errs++; break; } if (l != str[i]) { printf("%d: char %d came out as %08x, should be %08x\n", line, i, str[i], l); total_errs++; } } if (l != -1) { l = va_arg(ap, long int); if (l != -1) { printf("%d: correct string longer than output\n", line); total_errs++; } } va_end(ap); } void utf8_write_test(int line, const long *input, int inlen, ...) { va_list ap; wchar_t *p, str[512]; int i; charset_state state; unsigned long l; state.s0 = 0; p = str; for (i = 0; i < inlen; i++) write_utf8(NULL, input[i], &state, utf8_emit, &p); va_start(ap, inlen); l = 0; for (i = 0; i < p - str; i++) { l = va_arg(ap, long int); if (l == -1) { printf("%d: correct string shorter than output\n", line); total_errs++; break; } if (l != str[i]) { printf("%d: char %d came out as %08x, should be %08x\n", line, i, str[i], l); total_errs++; } } if (l != -1) { l = va_arg(ap, long int); if (l != -1) { printf("%d: correct string longer than output\n", line); total_errs++; } } va_end(ap); } /* Macro to concoct the first three parameters of utf8_read_test. */ #define TESTSTR(x) __LINE__, x, lenof(x) int main(void) { printf("read tests beginning\n"); utf8_read_test(TESTSTR("\xCE\xBA\xE1\xBD\xB9\xCF\x83\xCE\xBC\xCE\xB5"), 0x000003BA, /* GREEK SMALL LETTER KAPPA */ 0x00001F79, /* GREEK SMALL LETTER OMICRON WITH OXIA */ 0x000003C3, /* GREEK SMALL LETTER SIGMA */ 0x000003BC, /* GREEK SMALL LETTER MU */ 0x000003B5, /* GREEK SMALL LETTER EPSILON */ 0, -1); utf8_read_test(TESTSTR("\x00"), 0x00000000, /* */ 0, -1); utf8_read_test(TESTSTR("\xC2\x80"), 0x00000080, /* */ 0, -1); utf8_read_test(TESTSTR("\xE0\xA0\x80"), 0x00000800, /* */ 0, -1); utf8_read_test(TESTSTR("\xF0\x90\x80\x80"), 0x00010000, /* */ 0, -1); utf8_read_test(TESTSTR("\xF8\x88\x80\x80\x80"), 0x00200000, /* */ 0, -1); utf8_read_test(TESTSTR("\xFC\x84\x80\x80\x80\x80"), 0x04000000, /* */ 0, -1); utf8_read_test(TESTSTR("\x7F"), 0x0000007F, /* */ 0, -1); utf8_read_test(TESTSTR("\xDF\xBF"), 0x000007FF, /* */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF\xBD"), 0x0000FFFD, /* REPLACEMENT CHARACTER */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF\xBF"), ERROR, /* (invalid char) */ 0, -1); utf8_read_test(TESTSTR("\xF7\xBF\xBF\xBF"), 0x001FFFFF, /* */ 0, -1); utf8_read_test(TESTSTR("\xFB\xBF\xBF\xBF\xBF"), 0x03FFFFFF, /* */ 0, -1); utf8_read_test(TESTSTR("\xFD\xBF\xBF\xBF\xBF\xBF"), 0x7FFFFFFF, /* */ 0, -1); utf8_read_test(TESTSTR("\xED\x9F\xBF"), 0x0000D7FF, /* */ 0, -1); utf8_read_test(TESTSTR("\xEE\x80\x80"), 0x0000E000, /* */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF\xBD"), 0x0000FFFD, /* REPLACEMENT CHARACTER */ 0, -1); utf8_read_test(TESTSTR("\xF4\x8F\xBF\xBF"), 0x0010FFFF, /* */ 0, -1); utf8_read_test(TESTSTR("\xF4\x90\x80\x80"), 0x00110000, /* */ 0, -1); utf8_read_test(TESTSTR("\x80"), ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\xBF"), ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF\x80"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF\x80\xBF"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF\x80\xBF\x80"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF\x80\xBF\x80\xBF"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\xBF\x80\xBF\x80\xBF\x80"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF"), ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ ERROR, /* (unexpected continuation byte) */ 0, -1); utf8_read_test(TESTSTR("\xC0\x20\xC1\x20\xC2\x20\xC3\x20\xC4\x20\xC5\x20\xC6\x20\xC7\x20"), ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ 0, -1); utf8_read_test(TESTSTR("\xE0\x20\xE1\x20\xE2\x20\xE3\x20\xE4\x20\xE5\x20\xE6\x20\xE7\x20\xE8\x20\xE9\x20\xEA\x20\xEB\x20\xEC\x20\xED\x20\xEE\x20\xEF\x20"), ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ 0, -1); utf8_read_test(TESTSTR("\xF0\x20\xF1\x20\xF2\x20\xF3\x20\xF4\x20\xF5\x20\xF6\x20\xF7\x20"), ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ 0, -1); utf8_read_test(TESTSTR("\xF8\x20\xF9\x20\xFA\x20\xFB\x20"), ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ 0, -1); utf8_read_test(TESTSTR("\xFC\x20\xFD\x20"), ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ ERROR, /* (incomplete sequence) */ 0x00000020, /* SPACE */ 0, -1); utf8_read_test(TESTSTR("\xC0"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xE0\x80"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xF0\x80\x80"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xF8\x80\x80\x80"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xFC\x80\x80\x80\x80"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xDF"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xF7\xBF\xBF"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xFB\xBF\xBF\xBF"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xFD\xBF\xBF\xBF\xBF"), ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xC0\xE0\x80\xF0\x80\x80\xF8\x80\x80\x80\xFC\x80\x80\x80\x80\xDF\xEF\xBF\xF7\xBF\xBF\xFB\xBF\xBF\xBF\xFD\xBF\xBF\xBF\xBF"), ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ ERROR, /* (incomplete sequence) */ 0, -1); utf8_read_test(TESTSTR("\xFE"), ERROR, /* (invalid UTF-8 byte) */ 0, -1); utf8_read_test(TESTSTR("\xFF"), ERROR, /* (invalid UTF-8 byte) */ 0, -1); utf8_read_test(TESTSTR("\xFE\xFE\xFF\xFF"), ERROR, /* (invalid UTF-8 byte) */ ERROR, /* (invalid UTF-8 byte) */ ERROR, /* (invalid UTF-8 byte) */ ERROR, /* (invalid UTF-8 byte) */ 0, -1); utf8_read_test(TESTSTR("\xC0\xAF"), ERROR, /* SOLIDUS (overlong form of 2F) */ 0, -1); utf8_read_test(TESTSTR("\xE0\x80\xAF"), ERROR, /* SOLIDUS (overlong form of 2F) */ 0, -1); utf8_read_test(TESTSTR("\xF0\x80\x80\xAF"), ERROR, /* SOLIDUS (overlong form of 2F) */ 0, -1); utf8_read_test(TESTSTR("\xF8\x80\x80\x80\xAF"), ERROR, /* SOLIDUS (overlong form of 2F) */ 0, -1); utf8_read_test(TESTSTR("\xFC\x80\x80\x80\x80\xAF"), ERROR, /* SOLIDUS (overlong form of 2F) */ 0, -1); utf8_read_test(TESTSTR("\xC1\xBF"), ERROR, /* (overlong form of 7F) */ 0, -1); utf8_read_test(TESTSTR("\xE0\x9F\xBF"), ERROR, /* (overlong form of DF BF) */ 0, -1); utf8_read_test(TESTSTR("\xF0\x8F\xBF\xBF"), ERROR, /* (overlong form of EF BF BF) (invalid char) */ 0, -1); utf8_read_test(TESTSTR("\xF8\x87\xBF\xBF\xBF"), ERROR, /* (overlong form of F7 BF BF BF) */ 0, -1); utf8_read_test(TESTSTR("\xFC\x83\xBF\xBF\xBF\xBF"), ERROR, /* (overlong form of FB BF BF BF BF) */ 0, -1); utf8_read_test(TESTSTR("\xC0\x80"), ERROR, /* (overlong form of 00) */ 0, -1); utf8_read_test(TESTSTR("\xE0\x80\x80"), ERROR, /* (overlong form of 00) */ 0, -1); utf8_read_test(TESTSTR("\xF0\x80\x80\x80"), ERROR, /* (overlong form of 00) */ 0, -1); utf8_read_test(TESTSTR("\xF8\x80\x80\x80\x80"), ERROR, /* (overlong form of 00) */ 0, -1); utf8_read_test(TESTSTR("\xFC\x80\x80\x80\x80\x80"), ERROR, /* (overlong form of 00) */ 0, -1); utf8_read_test(TESTSTR("\xED\xA0\x80"), ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAD\xBF"), ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAE\x80"), ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAF\xBF"), ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xB0\x80"), ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xBE\x80"), ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xBF\xBF"), ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xA0\x80\xED\xB0\x80"), ERROR, /* (surrogate) */ ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xA0\x80\xED\xBF\xBF"), ERROR, /* (surrogate) */ ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAD\xBF\xED\xB0\x80"), ERROR, /* (surrogate) */ ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAD\xBF\xED\xBF\xBF"), ERROR, /* (surrogate) */ ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAE\x80\xED\xB0\x80"), ERROR, /* (surrogate) */ ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAE\x80\xED\xBF\xBF"), ERROR, /* (surrogate) */ ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAF\xBF\xED\xB0\x80"), ERROR, /* (surrogate) */ ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xED\xAF\xBF\xED\xBF\xBF"), ERROR, /* (surrogate) */ ERROR, /* (surrogate) */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF\xBE"), ERROR, /* (invalid char) */ 0, -1); utf8_read_test(TESTSTR("\xEF\xBF\xBF"), ERROR, /* (invalid char) */ 0, -1); printf("read tests completed\n"); printf("write tests beginning\n"); { const static long str[] = {0x03BAL, 0x1F79L, 0x03C3L, 0x03BCL, 0x03B5L, 0}; utf8_write_test(TESTSTR(str), 0xCE, 0xBA, 0xE1, 0xBD, 0xB9, 0xCF, 0x83, 0xCE, 0xBC, 0xCE, 0xB5, 0, -1); } { const static long str[] = {0x0000L, 0}; utf8_write_test(TESTSTR(str), 0x00, 0, -1); } { const static long str[] = {0x0080L, 0}; utf8_write_test(TESTSTR(str), 0xC2, 0x80, 0, -1); } { const static long str[] = {0x0800L, 0}; utf8_write_test(TESTSTR(str), 0xE0, 0xA0, 0x80, 0, -1); } { const static long str[] = {0x00010000L, 0}; utf8_write_test(TESTSTR(str), 0xF0, 0x90, 0x80, 0x80, 0, -1); } { const static long str[] = {0x00200000L, 0}; utf8_write_test(TESTSTR(str), 0xF8, 0x88, 0x80, 0x80, 0x80, 0, -1); } { const static long str[] = {0x04000000L, 0}; utf8_write_test(TESTSTR(str), 0xFC, 0x84, 0x80, 0x80, 0x80, 0x80, 0, -1); } { const static long str[] = {0x007FL, 0}; utf8_write_test(TESTSTR(str), 0x7F, 0, -1); } { const static long str[] = {0x07FFL, 0}; utf8_write_test(TESTSTR(str), 0xDF, 0xBF, 0, -1); } { const static long str[] = {0xFFFDL, 0}; utf8_write_test(TESTSTR(str), 0xEF, 0xBF, 0xBD, 0, -1); } { const static long str[] = {0xFFFFL, 0}; utf8_write_test(TESTSTR(str), ERROR, 0, -1); } { const static long str[] = {0x001FFFFFL, 0}; utf8_write_test(TESTSTR(str), 0xF7, 0xBF, 0xBF, 0xBF, 0, -1); } { const static long str[] = {0x03FFFFFFL, 0}; utf8_write_test(TESTSTR(str), 0xFB, 0xBF, 0xBF, 0xBF, 0xBF, 0, -1); } { const static long str[] = {0x7FFFFFFFL, 0}; utf8_write_test(TESTSTR(str), 0xFD, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0, -1); } { const static long str[] = {0xD7FFL, 0}; utf8_write_test(TESTSTR(str), 0xED, 0x9F, 0xBF, 0, -1); } { const static long str[] = {0xD800L, 0}; utf8_write_test(TESTSTR(str), ERROR, 0, -1); } { const static long str[] = {0xD800L, 0xDC00L, 0}; utf8_write_test(TESTSTR(str), ERROR, ERROR, 0, -1); } { const static long str[] = {0xDFFFL, 0}; utf8_write_test(TESTSTR(str), ERROR, 0, -1); } { const static long str[] = {0xE000L, 0}; utf8_write_test(TESTSTR(str), 0xEE, 0x80, 0x80, 0, -1); } printf("write tests completed\n"); printf("total: %d errors\n", total_errs); return (total_errs != 0); } #endif /* TESTMODE */ const charset_spec charset_CS_UTF8 = { CS_UTF8, read_utf8, write_utf8, NULL }; #else /* ENUM_CHARSETS */ ENUM_CHARSET(CS_UTF8) #endif /* ENUM_CHARSETS */ Node-path: putty/charset/xenc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2417 Text-content-md5: 7a31f3f641627b46b33f582d88d24393 Text-content-sha1: 3c1d64a3b33254d8521c57e3db06318c22d264cc Content-length: 2533 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNccc/* * xenc.c - translate our internal character set codes to and from * X11 character encoding names. * */ #include #include "charset.h" #include "internal.h" static const struct { const char *name; int charset; } xencs[] = { /* * Officially registered encoding names. This list is derived * from the font encodings section of * * http://ftp.x.org/pub/DOCS/registry * * Where multiple encoding names map to the same encoding id * (such as iso8859-15 and fcd8859-15), the first is considered * canonical and will be returned when translating the id to a * string. */ { "iso8859-1", CS_ISO8859_1 }, { "iso8859-2", CS_ISO8859_2 }, { "iso8859-3", CS_ISO8859_3 }, { "iso8859-4", CS_ISO8859_4 }, { "iso8859-5", CS_ISO8859_5 }, { "iso8859-6", CS_ISO8859_6 }, { "iso8859-7", CS_ISO8859_7 }, { "iso8859-8", CS_ISO8859_8 }, { "iso8859-9", CS_ISO8859_9 }, { "iso8859-10", CS_ISO8859_10 }, { "iso8859-13", CS_ISO8859_13 }, { "iso8859-14", CS_ISO8859_14 }, { "iso8859-15", CS_ISO8859_15 }, { "fcd8859-15", CS_ISO8859_15 }, { "hp-roman8", CS_HP_ROMAN8 }, { "koi8-r", CS_KOI8_R }, /* * Unofficial encoding names found in the wild. */ { "iso8859-16", CS_ISO8859_16 }, { "koi8-u", CS_KOI8_U }, { "ibm-cp437", CS_CP437 }, { "ibm-cp850", CS_CP850 }, { "microsoft-cp1250", CS_CP1250 }, { "microsoft-cp1251", CS_CP1251 }, { "microsoft-cp1252", CS_CP1252 }, { "microsoft-cp1253", CS_CP1253 }, { "microsoft-cp1254", CS_CP1254 }, { "microsoft-cp1255", CS_CP1255 }, { "microsoft-cp1256", CS_CP1256 }, { "microsoft-cp1257", CS_CP1257 }, { "microsoft-cp1258", CS_CP1258 }, { "mac-roman", CS_MAC_ROMAN }, { "viscii1.1-1", CS_VISCII }, { "viscii1-1", CS_VISCII }, }; const char *charset_to_xenc(int charset) { int i; for (i = 0; i < (int)lenof(xencs); i++) if (charset == xencs[i].charset) return xencs[i].name; return NULL; /* not found */ } int charset_from_xenc(const char *name) { int i; for (i = 0; i < (int)lenof(xencs); i++) { const char *p, *q; p = name; q = xencs[i].name; while (*p || *q) { if (tolower(*p) != tolower(*q)) break; p++; q++; } if (!*p && !*q) return xencs[i].charset; } return CS_NONE; /* not found */ } Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4e960d2eb9a439c4919e0eda6efe72b6 Text-delta-base-sha1: bfd06fabc2b3ee0d1184a3cdc7daae497ba343ad Text-content-length: 281 Text-content-md5: 3f036d6fb05bc32fd2814250c3e24b01 Text-content-sha1: 7ab868d16e518241b8cc892f9a5eee6e62704cbb Content-length: 321 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNUBy`mmil# HACK: One of the source files in `charset' is auto-generated by # sbcsgen.pl. We need to generate that _now_, before attempting # dependency analysis. eval 'chdir "charset"; require "sbcsgen.pl"; chdir ".."'; @incdirs = ("", "charset/-I../charset Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: abfa3fbf8dac274c26963b6602a1a244 Text-delta-base-sha1: ed144b87a6a25c6ac0eb2844e8760ad227897042 Text-content-length: 1123 Text-content-md5: 4eef22693a01e02da0aafb5cf6c17fe7 Text-content-sha1: 5c1f6634338b2ab50c3a1dc827ea3ae6778a7f0c Content-length: 1163 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNs@;[/.zcs\fP \fIcharset\fP" This option specifies the character set in which \fIpterm\fP should assume the session is operating. This character set will be used to interpret all the data received from the session, and all input you type or paste into \fIpterm\fP will be converted into this character set before being sent to the session. Any character set name which is valid in a MIME header (and supported by \fIpterm\fP) should be valid here (examples are "ISO-8859-1", "windows-1252" or "UTF-8"). Also, any character encoding which is valid in an X logical font description should be valid ("ibm-cp437", for example). Character set names are case-insensitiveLineCodePage\fP" This option specifies the character set to be used for the session. This is the same as the \fI\-cs\fP command-line option. .IP "\fBpterm.NoRemoteCharset\fP" This option disables the terminal's ability to change its character set when it receives escape sequences telling it to. You might need to do this to interoperate with programs which incorrectly change the character set to something they think is sensible Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1d4a49a4cac43c246fc264071c64eec9 Text-delta-base-sha1: 3cdc2c8f338425abc93bdaa370ced912a89f8c57 Text-content-length: 6575 Text-content-md5: 174eaa5b20dfd5a9b1f5c5fc187bd65c Text-content-sha1: a12ebdd4b114a50b1d3b36d7b074f2b206e181e0 Content-length: 6615 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVN+r BAEVD2-?0 P`SBXv$[AC1OE\p^8!d8-nJt_cHstruct { int charset; int is_wide; } fontinfo[2];, *pasteout_data_utf8; int pasteout_data_len, pasteout_data_utf8, utf8_string/* * The stuff we've just generated is assumed to be * ISO-8859-1! This sounds insane, but `man XLookupString' * agrees: strings of this type returned from the X server * are hardcoded to 8859-1. Strictly speaking we should be * doing this using some sort of GtkIMContext, which (if * we're lucky) would give us our data directly in Unicode; * but that's not supported in GTK 1.2 as far as I can * tell, and it's poorly documented even in 2.0, so it'll * have to wait. */ lpage_send(inst->ldisc, CS_ISO8859_1, output+start, end-start, 1); f (inst->pasteout_data_utf8) sfree(inst->pasteout_data_utf8); inst->pasteout_data_utf8 = smalloc(len*6); inst->pasteout_data_utf8_len = len*6; { wchar_t *tmp = data; int tmplen = len; inst->pasteout_data_utf8_len = charset_from_unicode(&tmp, &tmplen, inst->pasteout_data_utf8, inst->pasteout_data_utf8_len, CS_UTF8, NULL, NULL, 0); inst->pasteout_data_utf8 = srealloc(inst->pasteout_data_utf8, inst->pasteout_data_utf8_len); } inst->pasteout_data = smalloc(len); inst->pasteout_data_len = len; wc_to_mb(line_codepage, 0, data, len, gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY, inst->utf8_stringif (seldata->target == inst->utf8_string_atom) gtk_selection_data_set(seldata, seldata->target, 8, inst->pasteout_data_utf8, inst->pasteout_data_utf8_len); else gtk_selection_data_set(seldata, seldata->target, 8, f (inst->pasteout_data_utf8) sfree(inst->pasteout_data_utf8); inst->pasteout_data = NULL; inst->pasteout_data_len = 0; inst->pasteout_data_utf8 = NULL; inst->pasteout_data_utf8 /* * First we attempt to retrieve the selection as a UTF-8 string * (which we will convert to the correct code page before * sending to the session, of course). If that fails, * selection_received() will be informed and will fall back to * an ordinary string. */ gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY, inst->utf8_string_atomtarget == inst->utf8_string_atom && seldata->length <= 0) { /* * Failed to get a UTF-8 selection string. Try an ordinary * string. */ gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, GDK_CURRENT_TIME); return; } /* * Any other failure should just go foom. */ if (seldata->length <= 0 || (seldata->type != GDK_SELECTION_TYPE_STRING && seldata->type != inst->utf8_string_atom)inst->pastein_data_len = mb_to_wc((seldata->type == inst->utf8_string_atom ? CS_UTF8 : line_codepage), 0, seldata->data, seldata->length, { GdkWChar *gwcs; gchar *gcs; wchar_t *wcs; int i; wcs = smalloc(sizeof(wchar_t) * (len+1)); for (i = 0; i < len; i++) { wcs[i] = (wchar_t) ((attr & CSET_MASK) + (text[i] & CHAR_MASK)); } if (inst->fontinfo[fontid].is_wide) { gwcs = smalloc(sizeof(GdkWChar) * (len+1)); /* * FIXME: when we have a wide-char equivalent of * from_unicode, use it instead of this. */ for (i = 0; i <= len; i++) gwcs[i] = wcs[i]; gdk_draw_text_wc(inst->pixmap, inst->fonts[fontid], gc, x*inst->font_width+cfg.window_border, y*inst->font_height+cfg.window_border+inst->fonts[0]->ascent, gwcs, len*2); sfree(gwcs); } else { wchar_t *wcstmp = wcs; int lentmp = len; gcs = smalloc(sizeof(GdkWChar) * (len+1)); charset_from_unicode(&wcstmp, &lentmp, gcs, len, inst->fontinfo[fontid].charset, NULL, ".", 1); gdk_draw_text(inst->pixmap, inst->fonts[fontid], gc, x*inst->font_width+cfg.window_border, y*inst->font_height+cfg.window_border+inst->fonts[0]->ascent, gcs, len); sfree(gcs); } sfree(wcs); }cs")) { EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(cfg.line_codepage, val, sizeof(cfg.line_codepage)); cfg.line_codepage[sizeof(cfg.line_codepagestatic void set_font_info(struct gui_data *inst, int fontid) { GdkFont *font = inst->fonts[fontid]; XFontStruct *xfs = GDK_FONT_XFONT(font); Display *disp = GDK_FONT_XDISPLAY(font); Atom charset_registry, charset_encoding; unsigned long registry_ret, encoding_ret; charset_registry = XInternAtom(disp, "CHARSET_REGISTRY", False); charset_encoding = XInternAtom(disp, "CHARSET_ENCODING", False); inst->fontinfo[fontid].charset = CS_NONE; inst->fontinfo[fontid].is_wide = 0; if (XGetFontProperty(xfs, charset_registry, ®istry_ret) && XGetFontProperty(xfs, charset_encoding, &encoding_ret)) { char *reg, *enc; reg = XGetAtomName(disp, (Atom)registry_ret); enc = XGetAtomName(disp, (Atom)encoding_ret); if (reg && enc) { char *encoding = dupcat(reg, "-", enc, NULL); inst->fontinfo[fontid].charset = charset_from_xenc(encoding); /* FIXME: when libcharset supports wide encodings fix this. */ if (!strcasecmp(encoding, "iso10646-1")) inst->fontinfo[fontid].is_wide = 1; /* * Hack for X line-drawing characters: if the primary * font is encoded as ISO-8859-anything, and has valid * glyphs in the first 32 char positions, it is assumed * that those glyphs are the VT100 line-drawing * character set. * * Actually, we'll hack even harder by only checking * position 0x19 (vertical line, VT100 linedrawing * `x'). Then we can check it easily by seeing if the * ascent and descent differ. */ if (inst->fontinfo[fontid].charset == CS_ISO8859_1) { int lb, rb, wid, asc, desc; gchar text[2]; text[1] = '\0'; text[0] = '\x12'; gdk_string_extents(inst->fonts[fontid], text, &lb, &rb, &wid, &asc, &desc); if (asc != desc) inst->fontinfo[fontid].charset = CS_ISO8859_1_X11; } /* * FIXME: this is a hack. Currently fonts with * incomprehensible encodings are dealt with by * pretending they're 8859-1. It's ugly, but it's good * enough to stop things crashing. Should do something * better here. */ if (inst->fontinfo[fontid].charset == CS_NONE) inst->fontinfo[fontid].charset = CS_ISO8859_1; sfree(encoding); } set_font_info(inst, 0); set_font_info(inst, 1); inst->utf8_string_atom = gdk_atom_intern("UTF8_STRING Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1b693e98afd0130a712c0b2ffd40747b Text-delta-base-sha1: 4390f99d429341cf163b1cf6640b2af428df6901 Text-content-length: 570 Text-content-md5: e1c08c31057005d3c491e077a6cd5c23 Text-content-sha1: 3fd00d3d4c95bf2452bf9d47b472183c39f3490e Content-length: 610 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN*` !)b%#ifndef PUTTY_UNIX_H #define PUTTY_UNIX_H #include "charset.h"/* * In the Unix Unicode layer, DEFAULT_CODEPAGE is a special value * which causes mb_to_wc and wc_to_mb to call _libc_ rather than * libcharset. That way, we can interface the various charsets * supported by libcharset with the one supported by mbstowcs and * wcstombs (which will be the character set in which stuff read * from the command line or config files is assumed to be encoded). */ #define DEFAULT_CODEPAGE 0xFFFF #define CP_UTF8 CS_UTF8 /* from libcharset Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 282ceb8d6254af83369e9750ff3d38d2 Text-delta-base-sha1: e8143a698d1051f7186dd65c092438a04b46e36b Text-content-length: 4012 Text-content-md5: b3e1eb5ae66719c75134e6743b9c7329 Text-content-sha1: 205e81a2f5f671bba50183c87a789d7dc6a8eee3 Content-length: 4051 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNf` iN*z#include #include #include #include #include #include #include #include "putty.h" #include "terminal.h" #include "misc.h" /* * Unix Unicode-handling routinesf (codepage == DEFAULT_CODEPAGE) { int n = 0; mbstate_t state = { 0 }; setlocale(LC_CTYPE, ""); while (mblen > 0) { size_t i = mbrtowc(wcstr+n, mbstr, (size_t)mblen, &state); if (i == (size_t)-1 || i == (size_t)-2) break; n++; mbstr += i; mblen -= i; } setlocale(LC_CTYPE, "C"); return n; } else return charset_to_unicode(&mbstr, &mblen, wcstr, wclen, codepage, NULL, NULL, 0);/* FIXME: we should remove the defused param completely... */ if (defused) *defused = 0; if (codepage == DEFAULT_CODEPAGE) { char output[MB_LEN_MAX]; mbstate_t state = { 0 }; int n = 0; setlocale(LC_CTYPE, ""); while (wclen > 0) { int i = wcrtomb(output, wcstr[0], &state); if (i == (size_t)-1 || i > n - mblen) break; memcpy(mbstr+n, output, i); n += i; wcstr++; wclen--; } setlocale(LC_CTYPE, "C"); return n; } else return charset_from_unicode(&wcstr, &wclen, mbstr, mblen, codepage, NULL, NULL, 0); } void init_ucs(void) { int i; /* * In the platform-independent parts of the code, font_codepage * is used only for system DBCS support - which we don't * support at all. So we set this to something which will never * be used. */ font_codepage = -1; /* * line_codepage should be decoded from the specification in * cfg. */ line_codepage = charset_from_mimeenc(cfg.line_codepage); if (line_codepage == CS_NONE) line_codepage = charset_from_xenc(cfg.line_codepage); /* If it's still CS_NONE, we should assume direct-to-font. */ /* FIXME: this is a hack. Currently fonts with incomprehensible * encodings are dealt with by pretending they're 8859-1. It's * ugly, but it's good enough to stop things crashing. Should do * something better here. */ if (line_codepage == CS_NONE) line_codepage = CS_ISO8859_1; /* * Set up unitab_line, by translating each individual character * in the line codepage into Unicode. */ for (i = 0; i < 256; i++) { char c[1], *p; wchar_t wc[1]; int len; c[0] = i; p = c; len = 1; if (1 == charset_to_unicode(&p,&len,wc,1,line_codepage,NULL,L"",0)) unitab_line[i] = wc[0]; else unitab_line[i] = 0xFFFD; } /* * Set up unitab_xterm. This is the same as unitab_line except * in the line-drawing regions, where it follows the Unicode * encoding. * * (Note that the strange X encoding of line-drawing characters * in the bottom 32 glyphs of ISO8859-1 fonts is taken care of * by the font encoding, which will spot such a font and act as * if it were in a variant encoding of ISO8859-1.) */ for (i = 0; i < 256; i++) { static const wchar_t unitab_xterm_std[32] = { 0x2666, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x23ba, 0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, 0x2534, 0x252c, 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x00b7, 0x0020 }; if (i >= 0x5F && i < 0x7F) unitab_xterm[i] = unitab_xterm_std[i & 0x1F]; else unitab_xterm[i] = unitab_line[i]; } /* * Set up unitab_scoacs. The SCO Alternate Character Set is * simply CP437. */ for (i = 0; i < 256; i++) { char c[1], *p; wchar_t wc[1]; int len; c[0] = i; p = c; len = 1; if (1 == charset_to_unicode(&p,&len,wc,1,CS_CP437,NULL,L"",0)) unitab_scoacs[i] = wc[0]; else unitab_scoacs[i] = 0xFFFD; } /* Find the line control characters. */ for (i = 0; i < 256; i++) if (unitab_line[i] < ' ' || (unitab_line[i] >= 0x7F && unitab_line[i] < 0xA0)) unitab_ctrl[i] = i; else unitab_ctrl[i] = 0xFF; } Revision-number: 2396 Prop-content-length: 245 Content-length: 245 K 7 svn:log V 144 Better, I think, to avoid mapping 0x00 -> U+0020 in the X11 nonstandard font encoding. 0x20 maps to it, so it's not as if it's in short supply. K 10 svn:author V 5 simon K 8 svn:date V 27 2002-12-31T15:42:07.000000Z PROPS-END Node-path: putty/charset/sbcs.dat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c1fbdb11d8447b7b3257a57a2b97680a Text-delta-base-sha1: 92a03d2c84eb96b967d4bbf5178cf3db7cde987a Text-content-length: 329 Text-content-md5: af80552000ff8ebe588b8f9009e53c5f Text-content-sha1: c11e201452160529c01a856f0964c312187a9516 Content-length: 368 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNs,<,X Note that position 0 is still 0000, not 0020 as it might plausibly be, because I didn't like the idea that converting several words in Unicode through this table would produce NULs in place of all the spaces! In principle that works fine, but it makes me uneasy. charset CS_ISO8859_1_X11 000 Revision-number: 2397 Prop-content-length: 348 Content-length: 348 K 8 svn:date V 27 2002-12-31T20:11:38.000000Z K 7 svn:log V 249 Add a small comment explaining my failure to find any way to get QuickDraw to give me the missing-character glyph for a font. While I'm here, change the character we substitute for unmappable ones to '.', since that's what the charset library uses. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2808624b699f3cd12f3dcffa82e70e08 Text-delta-base-sha1: 2f5f01d048849065ec57e7aa1ed6dd6c3926f403 Text-content-length: 345 Text-content-md5: 6f38ad3f40bdab8ab19b36595d5e1cbe Text-content-sha1: 5b89f86d217b563b2372adae66737b90d2396c70 Content-length: 385 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN)0=o,%/* $Id: macterm.c,v 1.28 2002/12/31 20:11:38/* * What I'd _like_ to do here is to somehow generate the * missing-character glyph that every font is required to have. * Unfortunately (and somewhat surprisingly), I can't find any way * to actually ask for it explicitly. Bah. */ *obuf = '. Revision-number: 2398 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 62 Add internal prototypes to keep my compiler from complaining. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-31T21:12:29.000000Z PROPS-END Node-path: putty/charset/utf8.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 269a135bb7a613413a84b6b6c921dd48 Text-delta-base-sha1: 7191ac2e4896e4f0c6eb357879bc90716488f8ca Text-content-length: 237 Text-content-md5: 8b2608fd00aebf23c6affed69fd4ca80 Text-content-sha1: 768ed6ef165eb4e2383a46c9530366dee3eed150 Content-length: 276 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNB TqTSovoid read_utf8(charset_spec const *, long int, charset_state *, void (*)(void *, long int), void *); void write_utf8(charset_spec const *, long int, charset_state *, void (*)(void *, long int), void *); Revision-number: 2399 Prop-content-length: 315 Content-length: 315 K 8 svn:date V 27 2002-12-31T22:37:27.000000Z K 7 svn:log V 216 I have no idea what Simon thought he was doing casting what was once a struct sbcs_data * (first element an array of unsigned long) into a wchar_t *, but I think it's reasonably safe to assume that it was a mistake. K 10 svn:author V 3 ben PROPS-END Node-path: putty/charset/sbcs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fdcf3965f306a8708076101f1c963f29 Text-delta-base-sha1: a3f61cf569cef38dc44954989c8496279ed21ffe Text-content-length: 173 Text-content-md5: cf21e92db5ab67ffa0a208207fcd31d1 Text-content-sha1: 7c40b7fcdfee963289e4ee17fe492ede451f4c8a Content-length: 212 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNc[ zb+`T3W const struct sbcs_data *sd = charset->data; UNUSEDARG(state); emit(emitctx, sd->sbcs2ucsconst struct sbcs_data *sd = sd->sbcs2ucs Revision-number: 2400 Prop-content-length: 341 Content-length: 341 K 7 svn:log V 242 Add "-notOnce" to the compiler options on the Mac to stop the compiler assuming that duplicate #includes of the same file are idempotent. I mean, it's not even true for the standard headers (think ), and certainly isn't true here. K 10 svn:author V 3 ben K 8 svn:date V 27 2002-12-31T22:40:38.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3f036d6fb05bc32fd2814250c3e24b01 Text-delta-base-sha1: 7ab868d16e518241b8cc892f9a5eee6e62704cbb Text-content-length: 95 Text-content-md5: 835ed72e4a345007438965b9889ca63b Text-content-sha1: 841a38b4ce8cf9361d5d0128582e60b14a1c9d34 Content-length: 135 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNBn EE)i ::charset -w 35 -w err -proto strict -ansi on \xb6 -notOnce Revision-number: 2401 Prop-content-length: 354 Content-length: 354 K 8 svn:date V 27 2002-12-31T22:49:03.000000Z K 7 svn:log V 255 Use the shiny new character-set library to handle conversion from Unicode to Mac OS Roman for display if the Unicode Converter isn't around. Support for Mac character sets other than Roman (e.g. the variant used by the Apple VT100 font) is still absent. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0daaf7aca02529f4c3c1fd2211a1a21c Text-delta-base-sha1: 2ca691d68c03efeea868b666ae1dffd004496d1f Text-content-length: 25 Text-content-md5: 45dd2e550d1a1deadece8148d75e399f Text-content-sha1: 9c0f484403f20a4b9a53239433c40e686bed0826 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN&. % CHARSET Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6f38ad3f40bdab8ab19b36595d5e1cbe Text-delta-base-sha1: 5b89f86d217b563b2372adae66737b90d2396c70 Text-content-length: 804 Text-content-md5: 5f8f747dd7f602d5b9b0a6dd4950c6b3 Text-content-sha1: 5e92b02cd75bbc0df9022edf3fb5cb6e592adc34 Content-length: 844 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN0X&pR,PpK^E5OE=/* $Id: macterm.c,v 1.29 2002/12/31 22:49:03charsetwchar_t *unitextptr; int i; ByteCount iread, olen; OSStatus err/* Unpack Unicode from the mad format we get passed */ for (i = 0; i < len; i++) unitextbuf[i] = (unsigned char)text[i] | (attr & CSET_MASK); if (s->uni_to_font != NULL) {!= noErr && err != kTECUsedFallbacksStatus) /* XXX Should handle this more sensibly */ return; } else { /* XXX this is bogus if wchar_t and UniChar are different sizes. */ unitextptr = (wchar_t *)unitextbuf; /* XXX Should choose charset based on script, font etc. */ olen = charset_from_unicode(&unitextptr, &len, mactextbuf, 1024, CS_MAC_ROMAN, NULL, ".", 1); } a.s = s; a.text = mactextbuf; a.len = o Revision-number: 2402 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2003-01-01T11:45:43.000000Z K 7 svn:log V 88 Remove a couple of unnecessary casts that my compiler seems to have taken exception to. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3c1e9ed038431af377f2c9ecf3f1aa73 Text-delta-base-sha1: 0196aa37e8a7cef158e3104ff4ada671cfd3e348 Text-content-length: 61 Text-content-md5: 62a36635e46783f175fe6bb9e4a92f37 Text-content-sha1: 362c7775c31bbe53fb50258c65ca98391ba7e19b Content-length: 101 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNMB ((6/* $Id: mac.c,v 1.13 2003/01/01 11:45:43 Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cfe13989b67008439c1771b7c7cde290 Text-delta-base-sha1: 9fdbbc7466f2067d1090f921a479d54bd33ebf73 Text-content-length: 63 Text-content-md5: 6835c9a358aa894ebb91c248dcb5b091 Text-content-sha1: 97981b381a264fdc83106f0d5f3bbba02469c417 Content-length: 102 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN\Q *l*;!/* $Id: macdlg.c,v 1.2 2003/01/01 11:45:43 Revision-number: 2403 Prop-content-length: 399 Content-length: 399 K 7 svn:log V 300 Add all the Mac OS simple single-byte character sets from ftp.unicode.org. Also add the older variants described there, and the character set used by the "VT100" font (old and new). Since RFC 1345 defines "macintosh" to refer to the currency-sign variant of Mac OS Roman, update our table to match. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-01T16:24:01.000000Z PROPS-END Node-path: putty/charset/charset.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e5b6c21ab9f9b203b0b9180401272fee Text-delta-base-sha1: f34a2f571ebd44d175a20f9776f42db3db43d336 Text-content-length: 417 Text-content-md5: c2ab78eb7c675c0748904d14cc3deca4 Text-content-sha1: 0ebf93b049ac0c908d8620238f91c9dfbfe1deb5 Content-length: 456 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNw  xMAC_TURKISH, CS_MAC_CROATIAN, CS_MAC_ICELAND, CS_MAC_ROMANIAN, CS_MAC_GREEK, CS_MAC_CYRILLIC, CS_MAC_THAI, CS_MAC_CENTEURO, CS_MAC_SYMBOL, CS_MAC_DINGBATS, CS_MAC_ROMAN_OLD, CS_MAC_CROATIAN_OLD, CS_MAC_ICELAND_OLD, CS_MAC_ROMANIAN_OLD, CS_MAC_GREEK_OLD, CS_MAC_CYRILLIC_OLD, CS_MAC_UKRAINE, CS_MAC_VT100, CS_MAC_VT100_OLD Node-path: putty/charset/mimeenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4a70aa32d38dece4c9f27974c604321d Text-delta-base-sha1: 49bbce4addb02730dc800745443914194145188d Text-content-length: 100 Text-content-md5: 8d9c19fa70f2905065933bd0b809a8cd Text-content-sha1: a1af791f8fd7f78fc6c2c0a97b9f235a34c2e620 Content-length: 139 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNNZ NNs[_OLD }, { "mac", CS_MAC_ROMAN_OLD }, { "csMacintosh", CS_MAC_ROMAN_OLD Node-path: putty/charset/sbcs.dat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: af80552000ff8ebe588b8f9009e53c5f Text-delta-base-sha1: c11e201452160529c01a856f0964c312187a9516 Text-content-length: 10490 Text-content-md5: 2d21699503b612873ddcbee3283abcb5 Text-content-sha1: f635092f1e0a1408443040e907bfaa9a95091415 Content-length: 10529 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN\|ow|sN?[?@[j8O?L[I?[(}=?e[X"8??1>z?(eQ?+?[@?A}&?%[<{?E[6$?L[M?[#}=?e[X$8?p?1>zx?1>z^?!Xy^?!X_+XVarious Mac character sets, generated by: for i in ROMAN TURKISH CROATIAN ICELAND ROMANIAN GREEK CYRILLIC THAI \ CENTEURO SYMBOL DINGBATS; do echo charset CS_MAC_$i gensbcs http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/$i.TXT | \ sed s/f8a0/XXXX/ echo done The code point F8FF at position F0 in Mac OS Roman an interesting one. In Unicode, it's the last of the Private Use section. The mapping table states that it should be an Apple logo. I suppose we should Code point F8A0 at position F5 in Mac OS Turkish is actually just an undefined character, so we make it properly undefined. charset CS_MAC_ROMANcharset CS_MAC_TURKISH011e 011f 0130 0131 015e 015fXXXX 02c6 02dc 00af 02d8 02d9 02da 00b8 02dd 02db 02c7 charset CS_MAC_CROATIAN160 2122 00b4 00a8 2260 017d 00d8 221e 00b1 2264 2265 2206 00b5 2202 2211 220f 0161 222b 00aa 00ba 03a9 017e 00f8 00bf 00a1 00ac 221a 0192 2248 0106 00ab 010c 2026 00a0 00c0 00c3 00d5 0152 0153 0110 2014 201c 201d 2018 2019 00f7 25ca f8ff 00a9 2044 20ac 2039 203a 00c6 00bb 2013 00b7 201a 201e 2030 00c2 0107 00c1 010d 00c8 00cd 00ce 00cf 00cc 00d3 00d4 0111 00d2 00da 00db 00d9 0131 02c6 02dc 00af 03c0 00cb 02da 00b8 00ca 00e6 02c7 charset CS_MAC_ICELAND00dd00d0 00f0 00de 00fe 00fdcharset CS_MAC_ROMANIAN102 0218 221e 00b1 2264 2265 00a5 00b5 2202 2211 220f 03c0 222b 00aa 00ba 03a9 0103 0219021a 021bcharset CS_MAC_GREEKc4 00b9 00b2 00c9 00b3 00d6 00dc 0385 00e0 00e2 00e4 0384 00a8 00e7 00e9 00e8 00ea 00eb 00a3 2122 00ee 00ef 2022 00bd 2030 00f4 00f6 00a6 20ac 00f9 00fb 00fc 2020 0393 0394 0398 039b 039e 03a0 00df 00ae 00a9 03a3 03aa 00a7 2260 00b0 00b7 0391 00b1 2264 2265 00a5 0392 0395 0396 0397 0399 039a 039c 03a6 03ab 03a8 03a9 03ac 039d 00ac 039f 03a1 2248 03a4 00ab 00bb 2026 00a0 03a5 03a7 0386 0388 0153 2013 2015 201c 201d 2018 2019 00f7 0389 038a 038c 038e 03ad 03ae 03af 03cc 038f 03cd 03b1 03b2 03c8 03b4 03b5 03c6 03b3 03b7 03b9 03be 03ba 03bb 03bc 03bd 03bf 03c0 03ce 03c1 03c3 03c4 03b8 03c9 03c2 03c7 03c5 03b6 03ca 03cb 0390 03b0 00ad charset CS_MAC_CYRILLIC2020 00b0 0490 00a3 00a7 2022 00b6 0406 00ae 00a9 2122 0402 0452 2260 0403 0453 221e 00b1 2264 2265 0456 00b5 0491 0408 0404 0454 0407 0457 0409 0459 040a 045a 0458 0405 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 040b 045b 040c 045c 0455 2013 2014 201c 201d 2018 2019 00f7 201e 040e 045e 040f 045f 2116 0401 0451 04420ac charset CS_MAC_THAIab 00bb 2026 0e48 0e49 0e4a 0e4b 0e4c 0e48 0e49 0e4a 0e4b 0e4c 201c 201d 0e4d XXXX 2022 0e31 0e47 0e34 0e35 0e36 0e37 0e48 0e49 0e4a 0e4b 0e4c 2018 2019 XXXX2060 200b 2013 2014 0e3f 0e40 0e41 0e42 0e43 0e44 0e45 0e46 0e47 0e48 0e49 0e4a 0e4b 0e4c 0e4d 2122 0e4f 0e50 0e51 0e52 0e53 0e54 0e55 0e56 0e57 0e58 0e59 00ae 00a9 XXXX XXXX XXXX XXXX charset CS_MAC_CENTEUROc4 0100 0101 00c9 0104 00d6 00dc 00e1 0105 010c 00e4 010d 0106 0107 00e9 0179 017a 010e 00ed 010f 0112 0113 0116 00f3 0117 00f4 00f6 00f5 00fa 011a 011b 00fc 2020 00b0 0118 00a3 00a7 2022 00b6 00df 00ae 00a9 2122 0119 00a8 2260 0123 012e 012f 012a 2264 2265 012b 0136 2202 2211 0142 013b 013c 013d 013e 0139 013a 0145 0146 0143 00ac 221a 0144 0147 2206 00ab 00bb 2026 00a0 0148 0150 00d5 0151 014c 2013 2014 201c 201d 2018 2019 00f7 25ca 014d 0154 0155 0158 2039 203a 0159 0156 0157 0160 201a 201e 0161 015a 015b 00c1 0164 0165 00cd 017d 017e 016a 00d3 00d4 016b 016e 00da 016f 0170 0171 0172 0173 00dd 00fd 0137 017b 0141 017c 0122 02c7 charset CS_MAC_SYMBOL2200 0023 2203 0025 0026 220d 0028 0029 2217 002b 002c 22122245 0391 0392 03a7 0394 0395 03a6 0393 0397 0399 03d1 039a 039b 039c 039d 039f 03a0 0398 03a1 03a3 03a4 03a5 03c2 03a9 039e 03a8 0396 005b 2234 005d 22a5 005f f8e5 03b1 03b2 03c7 03b4 03b5 03c6 03b3 03b7 03b9 03d5 03ba 03bb 03bc 03bd 03bf 03c0 03b8 03c1 03c3 03c4 03c5 03d6 03c9 03be 03c8 03b6 007b 007c 007d 223c 007fXXXX 20ac 03d2 2032 2264 2044 221e 0192 2663 2666 2665 2660 2194 2190 2191 2192 2193 00b0 00b1 2033 2265 00d7 221d 2202 2022 00f7 2260 2261 2248 2026 f8e6 23af 21b5 2135 2111 211c 2118 2297 2295 2205 2229 222a 2283 2287 2284 2282 2286 2208 2209 2220 2207 00ae 00a9 2122 220f 221a 22c5 00ac 2227 2228 21d4 21d0 21d1 21d2 21d3 22c4 3008 00ae 00a9 2122 2211 239b 239c 239d 23a1 23a2 23a3 23a7 23a8 23a9 23aa f8ff 3009 222b 2320 23ae 2321 239e 239f 23a0 23a4 23a5 23a6 23ab 23ac 23ad XXXX charset CS_MAC_DINGBATS2701 2702 2703 2704 260e 2706 2707 2708 2709 261b 261e 270c 270d 270e 270f 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 271a 271b 271c 271d 271e 271f 2720 2721 2722 2723 2724 2725 2726 2727 2605 2729 272a 272b 272c 272d 272e 272f 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 273a 273b 273c 273d 273e 273f 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 274a 274b 25cf 274d 25a0 274f 2750 2751 2752 25b2 25bc 25c6 2756 25d7 2758 2759 275a 275b 275c 275d 275e 007f 2768 2769 276a 276b 276c 276d 276e 276f 2770 2771 2772 2773 2774 2775 XXXX2761 2762 2763 2764 2765 2766 2767 2663 2666 2665 2660 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2776 2777 2778 2779 277a 277b 277c 277d 277e 277f 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 278a 278b 278c 278d 278e 278f 2790 2791 2792 2793 2794 2192 2194 2195 2798 2799 279a 279b 279c 279d 279e 279f 27a0 27a1 27a2 27a3 27a4 27a5 27a6 27a7 27a8 27a9 27aa 27ab 27ac 27ad 27ae 27af XXXX 27b1 27b2 27b3 27b4 27b5 27b6 27b7 27b8 27b9 27ba 27bb 27bc 27bd 27be XXXX Various Mac character sets have older (usually pre-Euro) variants which are documented in the comments in their mapping tables. I've manually applied these changes below. Mac OS Roman variants before Mac OS 8.5 (CURRENCY SIGN rather than EURO SIGN): charset CS_MAC_ROMAN_OLD00a4charset CS_MAC_CROATIAN_OLD160 2122 00b4 00a8 2260 017d 00d8 221e 00b1 2264 2265 2206 00b5 2202 2211 220f 0161 222b 00aa 00ba 03a9 017e 00f8 00bf 00a1 00ac 221a 0192 2248 0106 00ab 010c 2026 00a0 00c0 00c3 00d5 0152 0153 0110 2014 201c 201d 2018 2019 00f7 25ca f8ff 00a9 2044 00a4 2039 203a 00c6 00bb 2013 00b7 201a 201e 2030 00c2 0107 00c1 010d 00c8 00cd 00ce 00cf 00cc 00d3 00d4 0111 00d2 00da 00db 00d9 0131 02c6 02dc 00af 03c0 00cb 02da 00b8 00ca 00e6 02c7 charset CS_MAC_ICELAND_OLD00dd00a4 00d0 00f0 00de 00fe 00fdcharset CS_MAC_ROMANIAN_OLD102 0218 221e 00b1 2264 2265 00a5 00b5 2202 2211 220f 03c0 222b 00aa 00ba 03a9 0103 021900a4 2039 203a 021a 021bMac OS Greek before Mac OS 9.2.2 (SOFT HYPHEN instead of EURO SIGN, and undefined instead of SOFT HYPHEN). charset CS_MAC_GREEK_OLDc4 00b9 00b2 00c9 00b3 00d6 00dc 0385 00e0 00e2 00e4 0384 00a8 00e7 00e9 00e8 00ea 00eb 00a3 2122 00ee 00ef 2022 00bd 2030 00f4 00f6 00a6 00ad 00f9 00fb 00fc 2020 0393 0394 0398 039b 039e 03a0 00df 00ae 00a9 03a3 03aa 00a7 2260 00b0 00b7 0391 00b1 2264 2265 00a5 0392 0395 0396 0397 0399 039a 039c 03a6 03ab 03a8 03a9 03ac 039d 00ac 039f 03a1 2248 03a4 00ab 00bb 2026 00a0 03a5 03a7 0386 0388 0153 2013 2015 201c 201d 2018 2019 00f7 0389 038a 038c 038e 03ad 03ae 03af 03cc 038f 03cd 03b1 03b2 03c8 03b4 03b5 03c6 03b3 03b7 03b9 03be 03ba 03bb 03bc 03bd 03bf 03c0 03ce 03c1 03c3 03c4 03b8 03c9 03c2 03c7 03c5 03b6 03ca 03cb 0390 03b0 XXXX Mac OS Cyrillic before Mac OS 9.0 (CENT SIGN instead of CYRILLIC CAPITAL LETTER GHE WITH UPTURN, PARTIAL DIFFERENTIAL instead of CYRILLIC SMALL LETTER GHE WITH UPTURN, CURRENCY SIGN instead of EURO SIGN): charset CS_MAC_CYRILLIC_OLD2020 00b0 00a2 00a3 00a7 2022 00b6 0406 00ae 00a9 2122 0402 0452 2260 0403 0453 221e 00b1 2264 2265 0456 00b5 2022 0408 0404 0454 0407 0457 0409 0459 040a 045a 0458 0405 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 040b 045b 040c 045c 0455 2013 2014 201c 201d 2018 2019 00f7 201e 040e 045e 040f 045f 2116 0401 0451 0440a4 Mac OS Ukrainian (now Cyrillic) before Mac OS 9.0 (CURRENCY SIGN instead of EURO SIGN): charset CS_MAC_UKRAINE2020 00b0 0490 00a3 00a7 2022 00b6 0406 00ae 00a9 2122 0402 0452 2260 0403 0453 221e 00b1 2264 2265 0456 00b5 0491 0408 0404 0454 0407 0457 0409 0459 040a 045a 0458 0405 00ac 221a 0192 2248 2206 00ab 00bb 2026 00a0 040b 045b 040c 045c 0455 2013 2014 201c 201d 2018 2019 00f7 201e 040e 045e 040f 045f 2116 0401 0451 0440a4 Mac OS VT100 character set, as used by the "VT100" font. Basically Mac OS Roman hacked about to give it an almost-Latin1 repertoire and most of the VT100 line-drawing set too. Point CA is the backward question-mark used for silo overflows. This table was derived by pasting the relevant part of 'utom' 140 from the "Western Language Encodings" file shipped with TEC 1.5 and then manually fixing up the scan line characters to use the Unicode 3.2 HORIZONTAL SCAN LINE characters rather than UPPER ONE EIGHTH BLOCK and LOWER ONE EIGHTH BLOCK with transcoding hints. charset CS_MAC_VT100 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 240a 240b 240c 240d 240e 240f 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 241a 241b 241c 241d 241e 24242100dd 00b0 00a2 00a3 00a7 00b8 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 00c6 00d8 00d7 00b1 2264 2265 00a5 00b5 00b9 00b2 00b3 03c0 00a6 00aa 00ba 2592 00e6 00f8 00bf 00a1 00ac 00bd 0192 00bc 00be 00ab 00bb 2026 XXXX 00c0 00c3 00d5 0152 0153 2013 2014 2518 2510 250c 2514 00f7 2022 00ff 0178 253c 20ac 00d0 00f0 00fe 00de 00fd 00b7 23ba 23bb 2500 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 XXXX 00d2 00da 00db 00d9 23bc 23bd 251c 2524 2534 252c 2502 XXXX XXXX XXXX XXXX As with so many others, before Mac OS 8.5 this font had CURRENCY SIGN rather than EURO SIGN. charset CS_MAC_VT100_OLD 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 240a 240b 240c 240d 240e 240f 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 241a 241b 241c 241d 241e 24242100dd 00b0 00a2 00a3 00a7 00b8 00b6 00df 00ae 00a9 2122 00b4 00a8 2260 00c6 00d8 00d7 00b1 2264 2265 00a5 00b5 00b9 00b2 00b3 03c0 00a6 00aa 00ba 2592 00e6 00f8 00bf 00a1 00ac 00bd 0192 00bc 00be 00ab 00bb 2026 XXXX 00c0 00c3 00d5 0152 0153 2013 2014 2518 2510 250c 2514 00f7 2022 00ff 0178 253c 00a4 00d0 00f0 00fe 00de 00fd 00b7 23ba 23bb 2500 00c2 00ca 00c1 00cb 00c8 00cd 00ce 00cf 00cc 00d3 00d4 XXXX 00d2 00da 00db 00d9 23bc 23bd 251c 2524 2534 252c 2502 XXXX XXXX XXXX XXXX Revision-number: 2404 Prop-content-length: 313 Content-length: 313 K 8 svn:date V 27 2003-01-01T17:03:27.000000Z K 7 svn:log V 212 Having painstakingly generated those reverse mapping tables in sbcsdat.c, it would seem a shame not to actually use them. Ahem. Thanks to Ben, without whose checkin in this area I'd have forgotten completely :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/charset/sbcs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cf21e92db5ab67ffa0a208207fcd31d1 Text-delta-base-sha1: 7c40b7fcdfee963289e4ee17fe492ede451f4c8a Text-content-length: 354 Text-content-md5: 07dcb26372f54c93eaad8dee0b8be4e1 Text-content-sha1: e53a59209fbc66badde89e5e95d1d33ee7a48506 Content-length: 393 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN[& L<L=, j, k, c; UNUSEDARG(state); /* * Binary-search in the ucs2sbcs table. */ i = -1; j = sd->nvalid; while (i+1 < j) { k = (i+j)/2; c = sd->ucs2sbcs[k]; if (input_chr < sd->sbcs2ucs[c]) j = k; else if (input_chr > sd->sbcs2ucs[c]) i = k; else { emit(emitctx, c); return; } Revision-number: 2405 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2003-01-01T19:13:36.000000Z K 7 svn:log V 78 If the user wants a different default screen than 0, PuTTY should provide it. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/x11-default-screen Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 493 Text-content-md5: 668c5f44a6a4697f4e9a05423cd0a1d0 Text-content-sha1: 2fd4f40ed84eeb7541efba66ff2e914552252b4a Content-length: 609 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN___Summary: PuTTY doesn't pass on the screen number in X11 forwarding Class: wish Priority: medium Difficulty: fun Present-in: 2002-12-31 Content-type: text/x-html-body

    When requesting X11 forwarding from an SSH server, PuTTY currently always requests a default screen number of 0. This is less than optimal for users of multiple-screen X servers, who might prefer a different default. PuTTY should probably pull the screen number off the end of cfg.x11_display and use that. Revision-number: 2406 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2003-01-01T19:20:43.000000Z K 7 svn:log V 53 On second thoughts, I think this qualifies as a bug. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/x11-default-screen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 668c5f44a6a4697f4e9a05423cd0a1d0 Text-delta-base-sha1: 2fd4f40ed84eeb7541efba66ff2e914552252b4a Text-content-length: 22 Text-content-md5: 46b6b3e9f6776e91eeff822e2fa546f3 Text-content-sha1: 44fadec22230ee3301a422823107ceb04920e459 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN_^JNbug Revision-number: 2407 Prop-content-length: 172 Content-length: 172 K 7 svn:log V 74 Summary: Connections through MS Proxy Server (HTTP) are spuriously denied K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-01T19:33:39.000000Z PROPS-END Node-path: putty-wishlist/data/msproxy-denied Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2048 Text-content-md5: 8147bcd7d40134115d6ca07f0bbb1310 Text-content-sha1: a6533c3f499c9246277c054a79f846c80dfeb643 Content-length: 2164 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNrrrSummary: Connections through MS Proxy Server (HTTP) are spuriously denied Class: semi-bug Priority: medium Difficulty: taxing Present-in: 0.53b 2002-12-30 Content-type: text/x-html-body

    Original report (<007801c2b108$5ad5a200$33db8ad8@alexin.ca>):

    I believe I have found a bug in Win32 putty .53b. (found in Win2000,
    also tested current dev binary).  I am connection to a NetBSD server 1.6
    running OpenSSH 3.4 on port 443, but had the same problem on an OpenBSD
    server with OpenSSH 3.4.
    
    I am connecting through an authenticated Microsoft Proxy server v2 on
    Windows 2000, using HTTP proxy services.
    
    
    Using Putty, the connection conversation is: 
    
     CONNECT 216.138.219.54:443 HTTP/1.1
     Host: 216.138.219.54:443
     Proxy-Authorization: basic YW1leeljYXNcc3RldmVfYmFya2V5OmluZXNzMTA=
    
     HTTP/1.1 407 Proxy Access Denied
     Server: Microsoft-IIS/5.0
     Date: Tue, 31 Dec 2002 19:32:43 GMT
     Connection: close
     Proxy-Authenticate: Negotiate
     Proxy-Authenticate: NTLM
     Proxy-Authenticate: Basic realm="53.244.73.245"
    
    And the connection fails with putty event log: 
    "2002-12-31 14:48:08    Connecting to 216.138.219.54 port 443
    2002-12-31 14:48:08     Proxy error: 407 Proxy Access Denied"
    
    
    Using MindTerm 2.0 (an inferior java ssh client), the connection
    conversation is:
    
     CONNECT 216.138.219.54:443 HTTP/1.0
     proxy-connection: Keep-Alive
     pragma: No-Cache
     user-agent: MindTerm/$Name:  $
    
     HTTP/1.1 407 Proxy Access Denied
     Server: Microsoft-IIS/5.0
     Date: Tue, 31 Dec 2002 19:33:05 GMT
     Proxy-Authenticate: Negotiate
     Proxy-Authenticate: NTLM
     Proxy-Authenticate: Basic realm="53.244.73.245"
    
    ----------- and then -----------
    
     CONNECT 216.138.219.54:443 HTTP/1.0
     proxy-authorization: Basic YW1leeljYXNcc3RldmVfYmFya2V5OmluZXNzMTA=
    
     proxy-connection: Keep-Alive
     pragma: No-Cache user-agent: MindTerm/$Name:  $
    
     HTTP/1.1  200 Connection established
     Via: 1.1 YYZXPROXY01
    
     SSH-1.99-OpenSSH_3.4 NetBSD_Secure_Shell-20020626
     SSH-2.0-MindTerm_2.0 2.0 (non-commercial)
     
    ... encrypted, successful connection ....
    
    Revision-number: 2408 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2003-01-01T19:42:56.000000Z K 7 svn:log V 50 Summary: Option to have meta key set the meta bit K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/meta-bit Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 712 Text-content-md5: a054cf2a318807949f4dc13cb9c4f325 Text-content-sha1: 4409596fa8d658f35d25f4eef04bc84168e45e19 Content-length: 828 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN:::Summary: Option to have Alt key set the meta bit Class: wish Priority: medium Content-type: text/x-html-body

    At present, the Alt key causes keys it's combined with to be sent preceded by ESC. This is interpreted as a "meta" key by GNUish programs like Emacs, but some others (notably NetHack) don't understand this convention, and expect "meta" to set the top bit of the character instead. There should probably be an option to enable this behaviour.

    When I (BJH) last mentioned this to Simon, he asked what should be done about keys that transmit multiple characters (e.g. function keys). I think the best move is probably to have them entirely unaffected by Alt in this mode. Revision-number: 2409 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2003-01-01T19:51:13.000000Z K 7 svn:log V 90 Add a mechanism for determining which charset to use for a given Mac OS font, and use it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 45dd2e550d1a1deadece8148d75e399f Text-delta-base-sha1: 9c0f484403f20a4b9a53239433c40e686bed0826 Text-content-length: 25 Text-content-md5: a860fd6ff661eb4e2a2fceed7ccfa920 Text-content-sha1: c058b8441dec43dd3e9aa4f34b0402ed68e466e9 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN.5 DmA mac Node-path: putty/charset/charset.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c2ab78eb7c675c0748904d14cc3deca4 Text-delta-base-sha1: 0ebf93b049ac0c908d8620238f91c9dfbfe1deb5 Text-content-length: 174 Text-content-md5: b58ddbe826b06bb13edc4b81c07ae448 Text-content-sha1: 5a96a6853473126ad5e759af4327405ff7d15b15 Content-length: 213 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN ) j'b/* * Convert Mac OS script/region/font to our charset identifiers. */ int charset_from_macenc(int script, int region, int sysvers, const char *font Node-path: putty/charset/macenc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 7123 Text-content-md5: 7e1be7c16059ac8d85c909ef785d0576 Text-content-sha1: 66a5787a7bc7bc4d7e8eb206836ff521e00fa83b Content-length: 7239 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNEEE/* $Id: macenc.c,v 1.1 2003/01/01 19:51:12 ben Exp $ */ /* * Copyright (c) 2003 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * macenc.c -- Convert a Mac OS script/region/font combination to our * internal charset code. */ #include #include "charset.h" #include "internal.h" /* * These are defined by Mac OS's , but we'd like to be * independent of that. */ #define smRoman 0 #define smJapanese 1 #define smTradChinese 2 #define smKorean 3 #define smArabic 4 #define smHebrew 5 #define smCyrillic 7 #define smDevenagari 9 #define smGurmukhi 10 #define smGujurati 11 #define smThai 21 #define smSimpChinese 25 #define smTibetan 26 #define smEthiopic 28 #define smCentralEuroRoman 29 #define verGreece 20 #define verIceland 21 #define verTurkey 24 #define verYugoCroatian 25 #define verRomania 39 #define verFaroeIsl 47 #define verIran 48 #define verRussia 49 #define verSlovenian 66 #define verCroatia 68 #define verBulgaria 72 #define verScottishGaelic 75 #define verManxGaelic 76 #define verBreton 77 #define verNunavut 78 #define verWelsh 79 #define verIrishGaelicScript 81 static const struct { int script; int region; int sysvermin; char const *fontname; int charset; } macencs[] = { { smRoman, -1, 0x850, "VT100", CS_MAC_VT100 }, { smRoman, -1, 0, "VT100", CS_MAC_VT100_OLD }, /* * From here on, this table is largely derived from * , * with _OLD version added based on the comments in individual * mapping files. */ { smRoman, -1, 0, "Symbol", CS_MAC_SYMBOL }, { smRoman, -1, 0, "Zapf Dingbats", CS_MAC_DINGBATS }, { smRoman, verTurkey, 0, NULL, CS_MAC_TURKISH }, { smRoman, verYugoCroatian, 0x850, NULL, CS_MAC_CROATIAN }, { smRoman, verYugoCroatian, 0, NULL, CS_MAC_CROATIAN_OLD }, { smRoman, verSlovenian, 0x850, NULL, CS_MAC_CROATIAN }, { smRoman, verSlovenian, 0, NULL, CS_MAC_CROATIAN_OLD }, { smRoman, verCroatia, 0x850, NULL, CS_MAC_CROATIAN }, { smRoman, verCroatia, 0, NULL, CS_MAC_CROATIAN_OLD }, { smRoman, verIceland, 0x850, NULL, CS_MAC_ICELAND }, { smRoman, verIceland, 0, NULL, CS_MAC_ICELAND_OLD }, { smRoman, verFaroeIsl, 0x850, NULL, CS_MAC_ICELAND }, { smRoman, verFaroeIsl, 0, NULL, CS_MAC_ICELAND_OLD }, { smRoman, verRomania, 0x850, NULL, CS_MAC_ROMANIAN }, { smRoman, verRomania, 0, NULL, CS_MAC_ROMANIAN_OLD }, #if 0 /* No mapping table on ftp.unicode.org */ { smRoman, verIreland, 0x850, NULL, CS_MAC_CELTIC }, { smRoman, verIreland, 0, NULL, CS_MAC_CELTIC_OLD }, { smRoman, verScottishGaelic, 0x850, NULL, CS_MAC_CELTIC }, { smRoman, verScottishGaelic, 0, NULL, CS_MAC_CELTIC_OLD }, { smRoman, verManxGaelic, 0x850, NULL, CS_MAC_CELTIC }, { smRoman, verManxGaelic, 0, NULL, CS_MAC_CELTIC_OLD }, { smRoman, verBreton, 0x850, NULL, CS_MAC_CELTIC }, { smRoman, verBreton, 0, NULL, CS_MAC_CELTIC_OLD }, { smRoman, verWelsh, 0x850, NULL, CS_MAC_CELTIC }, { smRoman, verWelsh, 0, NULL, CS_MAC_CELTIC_OLD }, { smRoman, verIrishGaelicScript, 0x850, NULL, CS_MAC_GAELIC }, { smRoman, verIrishGaelicScript, 0, NULL, CS_MAC_GAELIC_OLD }, #endif { smRoman, verGreece, 0x922, NULL, CS_MAC_GREEK }, { smRoman, verGreece, 0, NULL, CS_MAC_GREEK_OLD }, { smRoman, -1, 0x850, NULL, CS_MAC_ROMAN }, { smRoman, -1, 0, NULL, CS_MAC_ROMAN_OLD }, #if 0 /* Multi-byte encodings, not yet supported */ { smJapanese, -1, 0, NULL, CS_MAC_JAPANESE }, { smTradChinese, -1, 0, NULL, CS_MAC_CHINTRAD }, { smKorean, -1, 0, NULL, CS_MAC_KOREAN }, #endif #if 0 /* Bidirectional encodings, not yet supported */ { smArabic, verIran, 0, NULL, CS_MAC_FARSI }, { smArabic, -1, 0, NULL, CS_MAC_ARABIC }, { smHebrew, -1, 0, NULL, CS_MAC_HEBREW }, #endif { smCyrillic, -1, 0x900, NULL, CS_MAC_CYRILLIC }, { smCyrillic, verRussia, 0, NULL, CS_MAC_CYRILLIC_OLD }, { smCyrillic, verBulgaria, 0, NULL, CS_MAC_CYRILLIC_OLD }, { smCyrillic, -1, 0, NULL, CS_MAC_UKRAINE }, #if 0 /* Complex Indic scripts, not yet supported */ { smDevanagari, -1, 0, NULL, CS_MAC_DEVENAGA }, { smGurmukhi, -1, 0, NULL, CS_MAC_GURMUKHI }, { smGujurati, -1, 0, NULL, CS_MAC_GUJURATI }, #endif { smThai, -1, 0, NULL, CS_MAC_THAI }, #if 0 /* Multi-byte encoding, not yet supported */ { smSimpChinese, -1, 0, NULL, CS_MAC_CHINSIMP }, #endif #if 0 /* No mapping table on ftp.unicode.org */ { smTibetan, -1, 0, NULL, CS_MAC_TIBETAN }, { smEthiopic, -1, 0, NULL, CS_MAC_ETHIOPIC }, { smEthiopic, verNanavut, 0, NULL, CS_MAC_INUIT }, #endif { smCentralEuroRoman, -1, 0, NULL, CS_MAC_CENTEURO }, }; int charset_from_macenc(int script, int region, int sysvers, char const *fontname) { int i; for (i = 0; i < (int)lenof(macencs); i++) if ((macencs[i].script == script) && (macencs[i].region < 0 || macencs[i].region == region) && (macencs[i].sysvermin <= sysvers) && (macencs[i].fontname == NULL || strcmp(macencs[i].fontname, fontname) == 0)) return macencs[i].charset; return CS_NONE; } Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e3fb7e9e9b2567132d9ef6182577566c Text-delta-base-sha1: e281782e01c4361f56a7f433a4bb71c2c41b321c Text-content-length: 151 Text-content-md5: fc9c363e133aaa933bf1fea189fc40ac Text-content-sha1: b7b62b5bf99ab3c14947956e57d1e1090b8abd07 Content-length: 191 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN{}go#include "charset.h" /* Only one of uni_to_font and */ charset_t font_charset; /* font_charset is used at a time. */ Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5f8f747dd7f602d5b9b0a6dd4950c6b3 Text-delta-base-sha1: 5e92b02cd75bbc0df9022edf3fb5cb6e592adc34 Text-content-length: 524 Text-content-md5: b3867aef296c7a0a56cb49cab8fb0a9e Text-content-sha1: eb11a6dbc8f0c436cdae39a69063097632e6da8d Content-length: 564 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNXh)UF+xNl9enu|N /* $Id: macterm.c,v 1.30 2003/01/01 19:51:1!= 0 &&== noErr && CreateUnicodeToTextInfoByEncoding(enc, &s->uni_to_font) == noErr) else { s->uni_to_font = NULL; s->font_charset = charset_from_macenc(FontToScript(s->fontnum), GetScriptManagerVariable(smRegionCode), mac_gestalts.sysvers, s->cfg.font); if (s->font_charset != CS_NONE)olen = charset_from_unicode(&unitextptr, &len, mactextbuf, 1024, s->font_charset, NULL, ".", 1); } else return; Revision-number: 2410 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2003-01-01T20:26:55.000000Z K 7 svn:log V 20 Ignore .rsrc files. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 37 Content-length: 37 K 10 svn:ignore V 6 *.rsrc PROPS-END Node-path: putty/mac/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fdccdca94ac7d67f0ddfc3f1489e7cb6 Text-delta-base-sha1: 963481f66cfa9f164c889e85c53e8a5cf4089124 Text-content-length: 17 Text-content-md5: d952ae61b48ae12eebeb2d961279677e Text-content-sha1: 4e1a0f2ac214db486af4f0fd5a0de93e41741719 Content-length: 56 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN<*.rsrc Revision-number: 2411 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2003-01-01T20:28:52.000000Z K 7 svn:log V 49 The redirection operator I wanted was >>, not >. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 98 Content-length: 98 K 10 svn:ignore V 66 make.out *.NJ Makefile.mpw PuTTY.68k PuTTY.cfm68k PuTTY.ppc *.rsrc PROPS-END Node-path: putty/mac/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d952ae61b48ae12eebeb2d961279677e Text-delta-base-sha1: 4e1a0f2ac214db486af4f0fd5a0de93e41741719 Text-content-length: 72 Text-content-md5: ae49336687e5e78f90bbe05e51e93aef Text-content-sha1: f11350e6f2cee04fdeedafa580ed4b1f52635772 Content-length: 111 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNC<make.out *.NJ Makefile.mpw PuTTY.68k PuTTY.cfm68k PuTTY.ppc Revision-number: 2412 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2003-01-01T21:53:22.000000Z K 7 svn:log V 122 Support for double-width (CJK) characters, using the xterm-like options -fw and -fwb to specify wide and wide-bold fonts. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fbbfe456206fa3237cb280ba2a4e8763 Text-delta-base-sha1: 7ca916fe70ca50e693aa43491bb0c6de4f4115b3 Text-content-length: 78 Text-content-md5: e4b8bf9f30e8eef6b2202fb2cf2f7a65 Text-content-sha1: 77c5c463fa1b2302fad0e7ae34d3ea7046a906a0 Content-length: 119 K 15 cvs2svn:cvs-rev V 5 1.176 PROPS-END SVN#X 73n5256]; char widefont[256]; char wideboldfont[256 Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4eef22693a01e02da0aafb5cf6c17fe7 Text-delta-base-sha1: 5c1f6634338b2ab50c3a1dc827ea3ae6778a7f0c Text-content-length: 905 Text-content-md5: e68d805d261259a40c02e497e22dec37 Text-content-sha1: 3ccc52a6087d21d4d4d3d7e0f67f12cc58b8d5ef Content-length: 945 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNsgXtiLsj fw\fP \fIfont-name\fP" Specify the font to use for double-width characters (typically Chinese, Japanese and Korean text) displayed in the terminal. .IP "\fB\-fwb\fP \fIfont-name\fP" Specify the font to use for bold double-width characters (typically Chinese, Japanese and Korean text) Like \fI-fb\fP, this will be ignored unless the \fIBoldAsColour\fP resource is set to 0WideFont\fP" This resource is the same as the \fI\-fw\fP command-line option: it controls the font used to display double-width characters. The default is unset (double-width characters cannot be displayed). .IP "\fBpterm.WideBoldFont\fP" This resource is the same as the \fI\-fwb\fP command-line option: it controls the font used to display double-width characters in bold, when \fIBoldAsColour\fP is turned off. The default is unset (double-width characters are displayed in bold by printing them Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 174eaa5b20dfd5a9b1f5c5fc187bd65c Text-delta-base-sha1: a12ebdd4b114a50b1d3b36d7b074f2b206e181e0 Text-content-length: 2129 Text-content-md5: 6b86243d619ce250fb08dafd23a8b6e0 Text-content-sha1: 466c04fd1a4ab8bcc309e74890ce1b2ba5097532 Content-length: 2169 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVNrq(#pXD>MC\'6Dy&lM3qKzJl5M6~Nl5M|^&YJ6P v|4]; /* normal, bold, wide, widebold */ struct { int charset; int is_wide; } fontinfo[4, widefactor; if (attr & ATTR_WIDE) { widefactor = 2; fontid |= 2; } else { widefactor = 1; } if ((attr & ATTR_BOLD) && !cfg.bold_colour) { if (inst->fonts[fontid | 1]) fontid |*widefactor > inst->term->cols) len = (inst->term->cols-x)/2/widefactor;widefactorwidefactors[fontid] == NULL) { /* * The font for this contingency does not exist. * Typically this means we've been given ATTR_WIDE * character and have no wide font. So we display * nothing at all; such is life. */ } else widefactor*inst->font_width-1widefactorwidefactor int widefactor; do_text_internal(ctx, x, y, text, len, attr, lattr); if (attr & ATTR_WIDE) { widefactor = 2; } else { widefactor*widefactor > inst->term->cols) len = (inst->term->cols-x)/2/widefactor;widefactor, widefactorattr & ATTR_WIDE) { widefactor = 2; } else { widefactor*widefactor > inst->term->cols) len = (inst->term->cols-x)/2/widefactor;widefactorfw")) { EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(cfg.widefont, val, sizeof(cfg.widefont)); cfg.widefont[sizeof(cfg.widefont)-1] = '\0'; } else if (!strcmp(p, "-fwb")) { EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(cfg.wideboldfont, val, sizeof(cfg.wideboldfont)); cfg.wideboldfont[sizeof(cfg.wide if (cfg.widefont[0]) { inst->fonts[2] = gdk_font_load(cfg.widefont); if (!inst->fonts[2]) { fprintf(stderr, "pterm: unable to load wide font \"%s\"\n", cfg.boldfont); exit(1); } set_font_info(inst, 2); } else inst->fonts[2] = NULL; if (cfg.wideboldfont[0]) { inst->fonts[3] = gdk_font_load(cfg.wideboldfont); if (!inst->fonts[3]) { fprintf(stderr, "pterm: unable to load wide/bold font \"%s\"\n", cfg.boldfont); exit(1); } set_font_info(inst, 3); } else inst->fonts[3 Revision-number: 2413 Prop-content-length: 457 Content-length: 457 K 8 svn:date V 27 2003-01-01T22:25:25.000000Z K 7 svn:log V 356 Proper support for using the font's own character encoding. If we know what that encoding actually is, we can do our best to support additional charsets (VT100 linedrawing, SCO ACS, UTF-8 mode) using the available characters; if we don't, we fall back to a mode where we disable all Unicode cut-and-paste and assume any Unicode character is undisplayable. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e4b8bf9f30e8eef6b2202fb2cf2f7a65 Text-delta-base-sha1: 77c5c463fa1b2302fad0e7ae34d3ea7046a906a0 Text-content-length: 96 Text-content-md5: df1ff4088be13064464e08dc94c53fd1 Text-content-sha1: 63bda517155c5fc59604a14ff5ac179fedf090cb Content-length: 137 K 15 cvs2svn:cvs-rev V 5 1.177 PROPS-END SVNX FtFP/* void init_ucs(void); -- this is now in platform-specific headers */ Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e68d805d261259a40c02e497e22dec37 Text-delta-base-sha1: 3ccc52a6087d21d4d4d3d7e0f67f12cc58b8d5ef Text-content-length: 203 Text-content-md5: b02d6d650dbc8ed1f62c37ea9e9cba0c Text-content-sha1: e19864fa5831b86704049f4d8c40ad848716838f Content-length: 243 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNE 0%0p"\fIpterm\fP's default behaviour is to use the same character encoding as its primary font. If you supply a Unicode (iso10646-1) font, it will default to the UTF-8 character set Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6b86243d619ce250fb08dafd23a8b6e0 Text-delta-base-sha1: 466c04fd1a4ab8bcc309e74890ce1b2ba5097532 Text-content-length: 2593 Text-content-md5: d3c674a59f40490333fe2fc1dc1765b1 Text-content-sha1: 6a406f9d414e5898f456bbb0ee2e47ad6f4bb520 Content-length: 2633 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVNqE|jGE(`Kdggw 2Q}#lBwBC+v='paWPJ'if (inst->fontinfo[0].charset != CS_NONE) { /* * The stuff we've just generated is assumed to be * ISO-8859-1! This sounds insane, but `man * XLookupString' agrees: strings of this type returned * from the X server are hardcoded to 8859-1. Strictly * speaking we should be doing this using some sort of * GtkIMContext, which (if we're lucky) would give us * our data directly in Unicode; but that's not * supported in GTK 1.2 as far as I can tell, and it's * poorly documented even in 2.0, so it'll have to * wait. */ lpage_send(inst->ldisc, CS_ISO8859_1, output+start, end-start, 1); } else { /* * In direct-to-font mode, we just send the string * exactly as we received it. */ ldisc_send(inst->ldisc, output+start, end-start, 1); }/* * Set up UTF-8 paste data. This only happens if we aren't in * direct-to-font mode using the D800 hack. */ if (inst->fontinfo[0].charset != CS_NONE) { wchar_t *tmp = data; int tmplen = len; inst->pasteout_data_utf8 = smalloc(len*6); inst->pasteout_data_utf8_len = len*6 else { inst->pasteout_data_utf8 = NULL; inst->pasteout_data_utf8_len = 0if (inst->pasteout_data_utf8) gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY, if (inst->fontinfo[0].charset != CS_NONE) { /* * First we attempt to retrieve the selection as a UTF-8 * string (which we will convert to the correct code page * before sending to the session, of course). If that * fails, selection_received() will be informed and will * fall back to an ordinaryinst->utf8_string_atom, GDK_CURRENT_TIME); } else { /* * If we're in direct-to-font mode, we disable UTF-8 * pasting, and go straight to ordinary string data. */ gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, GDK_CURRENT_TIME); }gcs = smalloc(sizeof(GdkWChar) * (len+1)); wc_to_mb(inst->fontinfo[fontid].charset, 0, wcs, len, gcs, len, ".", NULL/* * This function retrieves the character set encoding of a font. It * returns the character set without the X11 hack (in case the user * asks to use the font's own encoding). */ static intint retval = CS_NONE; retval = inst->fontinfo[fontid].charset = { inst->fontinfo[fontid].is_wide = 1; retval = CS_UTF8; }sfree(encoding); } } return retval; int font_charsefont_charset =font_charset Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e1c08c31057005d3c491e077a6cd5c23 Text-delta-base-sha1: 3fd00d3d4c95bf2452bf9d47b472183c39f3490e Text-content-length: 92 Text-content-md5: 3493f2039094b1b2bc82b80730bb3b66 Text-content-sha1: d533cc099c49aefbe8088b1f9c7c4798a0cc744b Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN`$KYK/* * Exports from unicode.c. */ void init_ucs(int font_charset); #endif Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3e1eb5ae66719c75134e6743b9c7329 Text-delta-base-sha1: 205e81a2f5f671bba50183c87a789d7dc6a8eee3 Text-content-length: 1742 Text-content-md5: ea921f31a1267a83e8b493667ba23e4c Text-content-sha1: a5ef5e66e68e54cbdca63cf923905ec1cd875e52 Content-length: 1782 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN`},Pq4l"NJV4O if (codepage == CS_NONE) { int n = 0; while (mblen > 0) { wcstr[n] = 0xD800 | (mbstr[0] & 0xFF); n++; mbstr++; mblen--; } if (codepage == CS_NONE) { int n = 0; while (wclen > 0 && n < mblen) { if (*wcstr >= 0xD800 && *wcstr < 0xD900) mbstr[n++] = (*wcstr & 0xFF); else if (defchr) mbstr[n++] = *defchr; wcstr++; wclen--; } return n; } else { return charset_from_unicode(&wcstr, &wclen, mbstr, mblen, codepage, NULL, NULL, 0); } } void init_ucs(int font_charset /* * If line_codepage is _still_ CS_NONE, we assume we're using * the font's own encoding. This has been passed in to us, so * we use that. If it's still CS_NONE after _that_ - i.e. the * font we were given had an incomprehensible charset - then we * fall back to using the D800 page. */ if (line_codepage == CS_NONE) line_codepage = font_charsetline_codepage == CS_NONE) unitab_line[i] = 0xD800 | i; else if (1 == charset_to_unicode(&p, &len, wc, 1, line_codepage, NULL, L"", &len, wc, 1, CS_CP437, NULL, L"", * Find the control characters in the line codepage. For * direct-to-font mode using the D800 hack, we assume 00-1F and * 7F are controls, but allow 80-9F through. (It's as good a * guess as anything; and my bet is that half the weird fonts * used in this way will be IBM or MS code pages anyway.) */ for (i = 0; i < 256; i++) { int lineval = unitab_line[i]; if (lineval < ' ' || (lineval >= 0x7F && lineval < 0xA0) || (lineval >= 0xD800 && lineval < 0xD820) || (lineval == 0xD87F)) unitab_ctrl[i] = i; else unitab_ctrl[i] = 0xFF; } } Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5049d9790279f68137c79eace6d9210d Text-delta-base-sha1: 9eccf1b536725c2605e33c4c2b48243bbc59ed22 Text-content-length: 71 Text-content-md5: de5e64902d7c6e1ffd7e389803a8eac2 Text-content-sha1: 73d3789682693608afb23ba3621088a68828458f Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNC{4< 8/* * Exports from unicode.c. */ void init_ucs(void Revision-number: 2414 Prop-content-length: 681 Content-length: 681 K 8 svn:date V 27 2003-01-02T00:33:40.000000Z K 7 svn:log V 582 If for some reason do_text() fails to translate from Unicode to the font encoding, have it go through the rest of its motions with an empty string anyway, so as to at least give a sensible empty box of the right colour. If SetFallbackUnicodeToText() fails, switch over to using the charset library, hence avoiding problems in do_text(). If the version of the Unicode Converter we're using doesn't understand about interrupt-safe fallback functions, don't try to tell it we've got one. This prevents SetFallbackUnicodeToText() from failing on systems with old Unicode Converters. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 62a36635e46783f175fe6bb9e4a92f37 Text-delta-base-sha1: 362c7775c31bbe53fb50258c65ca98391ba7e19b Text-content-length: 120 Text-content-md5: 6377e1539f190ad7379378218f6a2d13 Text-content-sha1: 5f910e0d439a944be4caea7c1833c7b9448db3ec Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNB bw(&/* $Id: mac.c,v 1.14 2003/01/02 00:33:40mac_gestalts.uncvattr = (*ti)->tecUnicodeConverterFeatures Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fc9c363e133aaa933bf1fea189fc40ac Text-delta-base-sha1: b7b62b5bf99ab3c14947956e57d1e1090b8abd07 Text-content-length: 134 Text-content-md5: f7d5a40cde96b71c2134dcd96a2148e1 Text-content-sha1: 61fa2c6122c580c1f9c06deadb38a9d79d361e4b Content-length: 174 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNp ppg /* TEC version (from TECGetInfo()) */ long uncvattr; /* Unicode Converter attributes (frem TECGetInfo()) */ Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3867aef296c7a0a56cb49cab8fb0a9e Text-delta-base-sha1: eb11a6dbc8f0c436cdae39a69063097632e6da8d Text-content-length: 479 Text-content-md5: 5caf8ee280e9f220c9538d2ea36f36d1 Text-content-sha1: 529bdb4b8926649c6269f1a63469b54c8144a66f Content-length: 519 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNh-"/ ,4]MO/* $Id: macterm.c,v 1.31 2003/01/02 00:33:40 OptionBits fbflagsfbflags = kUnicodeFallbackCustomOnly; if (mac_gestalts.uncvattr & kTECAddFallbackInterruptMask) fbflags |= kUnicodeFallbackInterruptSafeMask; if (SetFallbackUnicodeToText(s->uni_to_font, uni_to_font_fallback_upp, fbflags, NULL) != noErr) { DisposeUnicodeToTextInfo(&s->uni_to_font); goto no_encv; } } else { no_encv:olen = 0olen = 0 Revision-number: 2415 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2003-01-02T10:07:17.000000Z K 7 svn:log V 115 Presence of unexpected characters in the proxy exclude list causes a tight loop in proxy_for_destination(). Fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dc8c6f3ff1c778abb08792825e7a0399 Text-delta-base-sha1: 238d9760f94ba4f0899e1025ff899dccc5cabcdf Text-content-length: 199 Text-content-md5: 92a8debaba2f9fa7c59a54282c0fa478 Text-content-sha1: cf9bd98ced594d48c41f4e8650c4be4477775ec6 Content-length: 239 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN%S ,Z,MX /* Make sure we really have reached the next comma or end-of-string */ while (exclude_list[s] && !isspace(exclude_list[s]) && exclude_list[s] != ',') s++ Revision-number: 2416 Prop-content-length: 238 Content-length: 238 K 7 svn:log V 137 sk_nonamelookup() should ensure the sockaddr it returns has `error' set to NULL. Otherwise it'll be random uninitialised goop. Not good. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-02T10:07:50.000000Z PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3c5476214f9ea0c596cdde304153d34c Text-delta-base-sha1: 605a2290e8576e0c20d43375badc5221db709fb5 Text-content-length: 36 Text-content-md5: 97889b6c504f8e72180e51c02231a5e9 Text-content-sha1: fe4897885dbe397e0031aac99be1cb891cbc0b41 Content-length: 75 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNj |yqerror = NULL Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a73ee1746986ed1fabb7e6932c82d15a Text-delta-base-sha1: edc4c2c72b561044163ebe5f27fdc9c49ecf57fe Text-content-length: 36 Text-content-md5: b43a69075b1944ac1cbb4a7a8f5fc533 Text-content-sha1: 6a1514f5351be35156e4d1be97f017d0a3cfe2f7 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVN6M Hy=error = NULL Revision-number: 2417 Prop-content-length: 182 Content-length: 182 K 7 svn:log V 82 We should support notation such as 192.168.33/24 in the proxy exclude list. D'oh. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-02T10:12:11.000000Z PROPS-END Node-path: putty-wishlist/data/proxy-iprange Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 756 Text-content-md5: 906cd99d3cd86feea01cee8aae0721e7 Text-content-sha1: d8d08d66927f107d5cd4a633d795958ef83d6353 Content-length: 872 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNfffSummary: Support for IP address ranges (x.x.x.x/y) in proxy exclude list Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body

    Our proxy exclude list accepts filename-style wildcards (192.168.33.* and similar) on IP addresses, because I had the wildcard matching engine to spare anyway (having just used it for hostnames).

    Of course I completely forgot that there's already a well-established way to specify ranges of IP addresses, that being the number-of-leading-bits notation (192.168.33.0/24). Same thing applies in IPv6.

    The proxy exclude list clearly ought to support this notation. It's standard, it doesn't clash with any existing behaviour, and it's not too hard to do. No reason at all why not. Revision-number: 2418 Prop-content-length: 209 Content-length: 209 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-02T10:41:22.000000Z K 7 svn:log V 108 Propagate the screen number from a local X display to the remote forwarded one. Fixes `x11-default-screen'. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: dc9f4c1dc2ce81231de34b2bf654db7f Text-delta-base-sha1: 603b7b5500a4f837d0086d3295dd95bd59eea6f4 Text-content-length: 318 Text-content-md5: 2b9d478936f130199ab673b891cd3b17 Text-content-sha1: 2252139a272c286672ea3a667a081b56619e97de Content-length: 359 K 15 cvs2svn:cvs-rev V 5 1.252 PROPS-END SVNw?\jzVQextern int x11_get_screen_number(char *displayx11_get_screen_number(cfg.x11_display), PKT_END); } else PKT_END); }\?YMqk1) { int closetype; closetype = (ssh->pktin.type == SSH1_MSG_CHANNEL_CLOSEx11_get_screen_number(cfg.x11_display)); Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: edec83c09b09a47fe9959738d43bfeee Text-delta-base-sha1: 0729147fa0884555b084fca663969d8ee34f0e47 Text-content-length: 394 Text-content-md5: 8e271b94f16007a538e70d6f73a46367 Text-content-sha1: 895582d0c70117269fdec82174f5266b5f8ee607 Content-length: 434 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNca rrUWhen setting up X forwarding, we should send the screen number * from the specified local display. This function extracts it from * the display string. */ int x11_get_screen_number(char *display) { int n; n = strcspn(display, ":"); if (!display[n]) return 0; n = strcspn(display, "."); if (!display[n]) return 0; return atoi(display + n + 1 Revision-number: 2419 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2003-01-02T10:41:28.000000Z K 7 svn:log V 21 Should now be fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/x11-default-screen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 46b6b3e9f6776e91eeff822e2fa546f3 Text-delta-base-sha1: 44fadec22230ee3301a422823107ceb04920e459 Text-content-length: 93 Text-content-md5: 3bda70c17f33e4d4d0ad8566f4a3c525 Text-content-sha1: 1d1dcaeb315c374838cd6217a64fc0180516db97 Content-length: 132 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN^& G%:$Fixed-in: 2003-01-03

    SGT, 2003-01-02: I think I've fixed this now. Revision-number: 2420 Prop-content-length: 538 Content-length: 538 K 8 svn:date V 27 2003-01-02T10:45:56.000000Z K 7 svn:log V 437 A couple of X forwarding fixes for Unix Plink. Firstly, under Unix the default X display should be whatever comes out of $DISPLAY, rather than Windows's hardwired `localhost:0'. Secondly, this may give rise to a display name without a hostname (`:0' or similar), which we now need to be able to deal with. Of course, we still don't _properly_ support X forwarding in Unix Plink, since we still can't authenticate with the local display. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ad2c8bae844eff22a9d5ffd8b120c391 Text-delta-base-sha1: 582ed3b3d99710ddd86f0fe370adbd48398ea3d5 Text-content-length: 346 Text-content-md5: 5a56a0d19c1f89b710422a52d72d8638 Text-content-sha1: d068bcbe31ee72778322270fa83639c4bb8adeca Content-length: 386 K 15 cvs2svn:cvs-rev V 4 1.93 PROPS-END SVNP1>>_q#ifdef _WINDOWS gpps(sesskey, "X11Display", "localhost:0", cfg->x11_display, sizeof(cfg->x11_display)); #else { /* On Unix, the default X display should simply be $DISPLAY. */ char *disp = getenv("DISPLAY"); gpps(sesskey, "X11Display", disp, cfg->x11_display, sizeof(cfg->x11_display)); } #endif Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8e271b94f16007a538e70d6f73a46367 Text-delta-base-sha1: 895582d0c70117269fdec82174f5266b5f8ee607 Text-content-length: 230 Text-content-md5: d3f8a9e76951ce5138a6d3a0bc397225 Text-content-sha1: 0c2ca69b7e0f43a117d715750b599fbaa95808e0 Content-length: 270 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNa NkNHif (n > 0) { strncpy(host, display, n); host[n] = '\0'; } else { /* * Local display numbers, particularly on Unix, often omit * the display part completely. */ strcpy(host, "localhost"); } Revision-number: 2421 Prop-content-length: 289 Content-length: 289 K 7 svn:log V 188 Fix `telnet-resize-iac'. (IAC bytes were not duplicated when they occurred in a NAWS subnegotiation. Result: a terminal width or height of 255 was not being correctly sent to the server.) K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-02T11:14:35.000000Z PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 838ebcdf4615694944c11dad8266526c Text-delta-base-sha1: 4758890fe09ac9e5fd4643105fd0238b60f4e56e Text-content-length: 756 Text-content-md5: 9151336b17fe1c03af76600d7737c053 Text-content-sha1: 4f0197c7adde4ade5148acf3bf0a2e4e11814e0d Content-length: 796 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN Q/.2Cg"24]; int nn = 0; b[n++] = IAC; b[n++] = SB; b[n++] = TELOPT_NAWS; b[n++] = telnet->term_width >> 8; if (b[n-1] == IAC) b[n++] = IAC; /* duplicate any IAC byte occurs */ b[n++] = telnet->term_width & 0xFF; if (b[n-1] == IAC) b[n++] = IAC; /* duplicate any IAC byte occurs */ b[n++] = telnet->term_height >> 8; if (b[n-1] == IAC) b[n++] = IAC; /* duplicate any IAC byte occurs */ b[n++] = telnet->term_height & 0xFF; if (b[n-1] == IAC) b[n++] = IAC; /* duplicate any IAC byte occurs */ b[n++] = IAC; b[n++] = SE; telnet->bufsize = sk_write(telnet->s, b, n); logbuf = dupprintf("client:\tSB NAWS %d,%d", telnet->term_width, telnet->term_height Revision-number: 2422 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2003-01-02T11:15:57.000000Z K 7 svn:log V 22 This should be fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/telnet-resize-iac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7bd3423f90fe54408ba10d272b226c87 Text-delta-base-sha1: 02103c572ae127da57f771f872ea5f46dbb5bb0e Text-content-length: 209 Text-content-md5: 65a562f2cac18061ebb94b12b8ac4df6 Text-content-sha1: e9ab226842b4103d0f98d8abd1283ec7a4a12e68 Content-length: 248 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNX :jph'Fixed-in: 2003-01-0 SGT, 2003-01-02: Should now be fixed. And I disagree that Linux telnet servers aren't fazed by it - the Debian 3.0 machine on my desk certainly doesn't like it much! Revision-number: 2423 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2003-01-02T14:20:32.000000Z K 7 svn:log V 62 Summary: PuTTY should paste when the paste button is released K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/paste-on-release Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 619 Text-content-md5: 81ebd35bdf366620fd22d7feb4aa9dc6 Text-content-sha1: f75dc70957b65a7ba1f19dea5a8f0c9055f92bca Content-length: 735 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN]]]Summary: PuTTY should paste when the paste button is released Class: wish Priority: low Difficulty: fun Content-type: text/x-html-body

    At present, PuTTY pastes text when it receives a button-down event for whichever button is configured for paste. Normally in Windows, actions that are triggered by a click happen on the button-up event instead, and moving the pointer out of the control being clicked on before the button-up causes the action not to occur. xterm does something slightly different, in that it pastes on button-up, but doesn't seem to cancel if the pointer moves outside the window. Revision-number: 2424 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2003-01-02T14:23:36.000000Z K 7 svn:log V 35 Mention that Shift-Ins works here. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9af76e4dd91c71da9e5e5a3e39be21c8 Text-delta-base-sha1: cab24dccc463b2fc0f64efc16fe22207774764cc Text-content-length: 120 Text-content-md5: a59038f26964b85f3aa31fe0448fcda0 Text-content-sha1: 27009bf724f6f488121d5023c770259ba08e5b86 Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN/ _85S\versionid $Id: using.but,v 1.10 2003/01/02 14:23:36 bePressing Shift-Ins has the same effect. Revision-number: 2425 Prop-content-length: 498 Content-length: 498 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-02T16:17:56.000000Z K 7 svn:log V 397 Fixes to direct-to-font mode: I'd inadvertently enabled it for any font whose encoding comes up as CS_NONE - but this is also true for iso10646-1 fonts, since libcharset doesn't support wide-character encodings! Hence UTF-8 cut and paste was enabled in ordinary modes, but disabled in UTF-8 mode, which was a bit embarrassing. Now we have a dedicated flag variable indicating direct-to-font mode. PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3c674a59f40490333fe2fc1dc1765b1 Text-delta-base-sha1: 6a406f9d414e5898f456bbb0ee2e47ad6f4bb520 Text-content-length: 791 Text-content-md5: 2faa48e493795a8e18f78ede9669405e Text-content-sha1: 6833f40618a9dc167dd45ad7099a716220a8e03c Content-length: 831 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVNE@9P1G'i'h&;a`edirect_to_font!inst->direct_to_font!inst->direct_to_fontf (inst->pasteout_data_utf8_len == 0) { sfree(inst->pasteout_data_utf8); inst->pasteout_data_utf8 = NULL; } else { inst->pasteout_data_utf8 = srealloc(inst->pasteout_data_utf8, inst->pasteout_data_utf8_len); }*6); inst->pasteout_data_len = len*6; inst->pasteout_data_len = wc_to_mb(line_codepage, 0, data, len, inst->pasteout_data, inst->pasteout_data_len, NULL, NULL); if (inst->pasteout_data_len == 0) { sfree(inst->pasteout_data); inst->pasteout_data = NULL; } else { inst->pasteout_data = srealloc(inst->pasteout_data, inst->pasteout_data_len); }!inst->direct_to_fontst->direct_to_font = Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3493f2039094b1b2bc82b80730bb3b66 Text-delta-base-sha1: d533cc099c49aefbe8088b1f9c7c4798a0cc744b Text-content-length: 22 Text-content-md5: 4496873b717e213a01f52921f0b9b674 Text-content-sha1: 7c4301897b17cd7b0a485c3226dfc9eebea45e16 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN$#{%int Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ea921f31a1267a83e8b493667ba23e4c Text-delta-base-sha1: a5ef5e66e68e54cbdca63cf923905ec1cd875e52 Text-content-length: 212 Text-content-md5: 2ac32eb3a427c0d5b2b2e242b27df2fd Text-content-sha1: 92a8757b0c812eefc7d8ea3ffe7ef2d7a1a8ba80 Content-length: 252 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN} 6M}{xl/* * Return value is TRUE if pterm is to run in direct-to-font mode. */ int init_ucs(int font_charset) { int i, ret = 0if (line_codepage == CS_NONE) ret = 1 return ret; } Revision-number: 2426 Prop-content-length: 832 Content-length: 832 K 8 svn:date V 27 2003-01-02T16:20:29.000000Z K 7 svn:log V 731 CJK cleanups. Correct handling when the cursor is covering the right-hand half of a CJK wide character; correct handling of cut and paste when CJK text wraps between lines _irrespective of the parity of the starting column_; correct handling of wordness values irrespective of which half of a CJK character the user double-clicked on; correct handling when any terminal activity overwrites only one half of a CJK wide character. I think we now behave marginally better than xterm in this respect (it has a redraw problem when you overwrite the RH half of a CJK char), so I'm happy. Also redefined the internal UCSWIDE marker to something in the surrogate range, while I'm here, so that U+303F is available for use by actual users. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: df1ff4088be13064464e08dc94c53fd1 Text-delta-base-sha1: 63bda517155c5fc59604a14ff5ac179fedf090cb Text-content-length: 442 Text-content-md5: fde41eba2c4fdcf958d60c5ea3dd8f21 Text-content-sha1: 2b50b9c4bd46803a980467b884d3686d365fd402 Content-length: 483 K 15 cvs2svn:cvs-rev V 5 1.178 PROPS-END SVN s;iL>#define LATTR_WRAPPED2 0x2/* * UCSWIDE is a special value used in the terminal data to signify * the character cell containing the right-hand half of a CJK wide * character. We use 0xDFFF because it's part of the surrogate * range and hence won't be used for anything else (it's impossible * to input it via UTF-8 because our UTF-8 decoder correctly * rejects surrogates). */ #define UCSWIDE 0xDFF Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1c3d13374113bacedcf9c8583bd42063 Text-delta-base-sha1: b123278b364d48f5432b08e88a0449d5364f6383 Text-content-length: 9388 Text-content-md5: ce4606c28c9807edc6b8cf0353ae81e0 Text-content-sha1: 3bea05c50fd04d902bef9295959be2ba0365c593 Content-length: 9429 K 15 cvs2svn:cvs-rev V 5 1.126 PROPS-END SVNk{b{NHX-w'h]+HQe{ F`J  ?:Jc8TF\2 CH2UsFetch the character at a particular position in a line array, * for purposes of `wordtype'. The reason this isn't just a simple * array reference is that if the character we find is UCSWIDE, * then we must look one space further to the left. */ #define UCSGET(a, x) \ ( (x)>0 && ((a)[(x)] & (CHAR_MASK | CSET_MASK)) == UCSWIDE ? \ (a)[(x)-1] : (a)[(x)] )This function is called before doing _anything_ which affects * only part of a line of text. It is used to mark the boundary * between two character positions, and it indicates that some sort * of effect is going to happen on only one side of that boundary. * * The effect of this function is to check whether a CJK * double-width character is straddling the boundary, and to remove * it and replace it with two spaces if so. (Of course, one or * other of those spaces is then likely to be replaced with * something else again, as a result of whatever happens next.) * * Also, if the boundary is at the right-hand _edge_ of the screen, * it implies something deliberate is being done to the rightmost * column position; hence we must clear LATTR_WRAPPED2. * * The input to the function is the coordinates of the _second_ * character of the pair. */ static void check_boundary(Terminal *term, int x, int y) { unsigned long *ldata; /* Validate input coordinates, just in case. */ if (x == 0 || x > term->cols) return; ldata = lineptr(y); if (x == term->cols) { ldata[x] &= ~LATTR_WRAPPED2; } else { if ((ldata[x] & (CHAR_MASK | CSET_MASK)) == UCSWIDE) { ldata[x-1] = ldata[x] = (ldata[x-1] &~ (CHAR_MASK | CSET_MASK)) | ATTR_ASCII | ' '; }if (!from_begin || !to_end) check_boundary(term, term->curs.x, term->curs.y);(LATTR_WRAPPED | LATTR_WRAPPED2)check_boundary(term, term->curs.x, term->curs.y); if (dir < 0) check_boundary(term, term->curs.x + n, term->curs.y/* * If we're about to display a double-width * character starting in the rightmost * column, then we do something special * instead. We must print a space in the * last column of the screen, then wrap; * and we also set LATTR_WRAPPED2 which * instructs subsequent cut-and-pasting not * only to splice this line to the one * after it, but to ignore the space in the * last character position as well. * (Because what was actually output to the * terminal was presumably just a sequence * of CJK characters, and we don't want a * space to be pasted in the middle of * those just because they had the * misfortune to start in the wrong parity * column. xterm concurs.) */ check_boundary(term, term->curs.x, term->curs.y); check_boundary(term, term->curs.x+2, term->curs.y); if (term->curs.x == term->cols-1) { *term->cpos++ = ATTR_ASCII | ' ' | term->curr_attr; *term->cpos |= LATTR_WRAPPED | LATTR_WRAPPED2 /* Now we must check_boundary again, of course. */ check_boundary(term, term->curs.x, term->curs.y); check_boundary(term, term->curs.x+2, term->curs.y); } *term->cpos++ = c | term->curr_attr; *term->cpos++ = UCSWIDE | term->curr_attr; term->curs.x++; break; case 1: check_boundary(term, term->curs.x, term->curs.y); check_boundary(term, term->curs.x+1, term->curs.y);boundary(term, term->curs.x, term->curs.y); check_boundary(term, term->curs.x+n, term->curs.y), our_curs_x { /* * Adjust the cursor position in the case where it's * resting on the right-hand half of a CJK wide character. * xterm's behaviour here, which seems adequate to me, is * to display the cursor covering the _whole_ character, * exactly as if it were one space to the left. */ unsigned long *ldata = lineptr(term->curs.y); our_curs_x = term->curs.x; if (our_curs_x > 0 && (ldata[our_curs_x] & (CHAR_MASK | CSET_MASK)) == UCSWIDE) our_curs_x--; }our_curs_x)) { if (term->dispcurs > term->disptext && our_curs_ * By construction above, the cursor should not * be on the right-hand half of this character. * Ever. */ assert(!(i == our_curs_y && j == our_curs_x));our_curs_ else if (ldata[term->cols] & LATTR_WRAPPED2) { /* Ignore the last char on the line in a WRAPPED2 line. */ decpos(nlpos)UCSGET(ldata, p.x)); if (dir == +1) { while (1) { int maxcols = (ldata[term->cols] & LATTR_WRAPPED2 ? term->cols-1 : term->cols); if (p.x < maxcols-1) { if (wordtype(term, UCSGET(ldata, p.x + 1)UCSGET(ldata2, 0)UCSGET(ldata, p.x - 1)) == wvalue) p.x--; else break; } else { unsigned long *ldata2; int maxcols; if (p.y <= topy) break; ldata2 = lineptr(p.y-1); maxcols = (ldata2[term->cols] & LATTR_WRAPPED2 ? term->cols-1 : term->cols); if (ldata2[term->cols] & LATTR_WRAPPED) { if (wordtype(term, UCSGET(ldata2, maxcols-1)) == wvalue) { p.x = maxcols-1; p.y-- break; case SM_LINE: /* * In this mode, eva@__aery line is a unit. */ p.x = (dir == -1 ? 0 : term->cols - 1); break; } return p; } static void sel_spread(Terminal *term) { if (term->seltype == LEXICOGRAPHIC) { term->selstart = sel_spread_half(term, term->selstart, -1); decpos(term->selend); term->selend = sel_spread_half(term, term->selend, +1); incpos(term->selend); } } void term_do_paste(Terminal *term) { wchar_t *data; int len; get_clip(term->frontend, &data, &len); if (data && len > 0) { wchar_t *p, *q; term_seen_key_event(term); /* pasted data counts */ if (term->paste_buffer) sfree(term->paste_buffer); term->paste_pos = term->paste_hold = term->paste_len = 0; term->paste_buffer = smalloc(len * sizeof(wchar_t)); p = q = data; while (p < data + len) { while (p < data + len && !(p <= data + len - sel_nl_sz && !memcmp(p, sel_nl, sizeof(sel_nl)))) p++; { int i; for (i = 0; i < p - q; i++) { term->paste_buffer[term->paste_len++] = q[i]; } } if (p <= data + len - sel_nl_sz && !memcmp(p, sel_nl, sizeof(sel_nl))) { term->paste_buffer[term->paste_len++] = '\015'; p += sel_nl_sz; } q = p; } /* Assume a small paste will be OK in one go. */ if (term->paste_len < 256) { if (term->ldisc) luni_send(term->ldisc, term->paste_buffer, term->paste_len, 0); if (term->paste_buffer) sfree(term->paste_buffer); term->paste_buffer = 0; term->paste_pos = term->paste_hold = term->paste_len = 0; } } get_clip(term->frontend, NULL, NULL); } void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y, int shift, int ctrl, int alt) { pos selpoint; unsigned long *ldata; int raw_mouse = (term->xterm_mouse && !term->cfg->no_mouse_rep && !(term->cfg->mouse_override && shift)); int default_seltype; if (y < 0) { y = 0; if (a == MA_DRAG && !raw_mouse) term_scroll(term, 0, -1); } if (y >= term->rows) { y = term->rows - 1; if (a == MA_DRAG && !raw_mouse) term_scroll(term, 0, +1); } if (x < 0) { if (y > 0) { x = term->cols - 1; y--; } else x = 0; } if (x >= term->cols) x = term->cols - 1; selpoint.y = y + term->disptop; selpoint.x = x; ldata = lineptr(selpoint.y); if ((ldata[term->cols] & LATTR_MODE) != LATTR_NORM) selpoint.x /= 2; if (raw_mouse) { int encstate = 0, r, c; char abuf[16]; if (term->ldisc) { switch (b) { case MBT_LEFT: encstate = 0x20; /* left button down */ break; case MBT_MIDDLE: encstate = 0x21; break; case MBT_RIGHT: encstate = 0x22; break; case MBT_WHEEL_UP: encstate = 0x60; break; case MBT_WHEEL_DOWN: encstate = 0x61; break; default: break; /* placate gcc warning about enum use */ } switch (a) { case MA_DRAG: if (term->xterm_mouse == 1) return; encstate += 0x20; break; case MA_RELEASE: encstate = 0x23; term->mouse_is_down = 0; break; case MA_CLICK: if (term->mouse_is_down == b) return; term->mouse_is_down = b; break; default: break; /* placate gcc warning about enum use */ } if (shift) encstate += 0x04; if (ctrl) encstate += 0x10; r = y + 33; c = x + 33; sprintf(abuf, "\033[M%c%c%c", encstate, c, r); ldisc_send(term->ldisc, abuf, 6, 0); } return; } b = translate_button(term->frontend, b); /* * Set the selection type (rectangular or normal) at the start * of a selection attempt, from the state of Alt. */ if (!alt ^ !term->cfg->rect_select) default_seltype = RECTANGULAR; else default_seltype = LEXICOGRAPHIC; if (term->selstate == NO_SELECTION) { term->seltype = default_seltype; } if (b == MBT_SELECT && a == MA_CLICK) { deselect(term); ter Revision-number: 2427 Prop-content-length: 374 Content-length: 374 K 8 svn:date V 27 2003-01-02T16:56:29.000000Z K 7 svn:log V 273 A better solution to the problem of duplicated positions in CS_ISO8859_1_X11: where two SBCS positions map to the same Unicode code point, we now have a `sortpriority' hint which can tell sbcsgen.pl which one it should preferentially generate when converting back to SBCS. K 10 svn:author V 5 simon PROPS-END Node-path: putty/charset/sbcs.dat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2d21699503b612873ddcbee3283abcb5 Text-delta-base-sha1: f635092f1e0a1408443040e907bfaa9a95091415 Text-content-length: 373 Text-content-md5: 249b38e167bb3e00a3268da148322a0b Text-content-sha1: afac556daf392b33a8485434a3fb280c6f6f5dbc Content-length: 412 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN\ X>XthSince this table contains a few duplicated positions, we use the `sortpriority' hint to indicate that things in the main part of the code table (0x20-0xFF) should be generated preferentially when converting _from_ Unicode. Hence, U+00b0 (for example) will yield 0xb0 rather than 0x07. charset CS_ISO8859_1_X11 sortpriority 00-1F -1 002 Node-path: putty/charset/sbcsgen.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f60a11227504d73432c230cc0bae70b7 Text-delta-base-sha1: 792f03e4b716f3d1458a486bddd10070a4f99928 Text-content-length: 963 Text-content-md5: d01966d3278722c9fdc44394c90cbcfd Text-content-sha1: cdb5a43f0794589681baf97b30e4f38e4f0a1e9c Content-length: 1002 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN/F1vWCSG/]vwvDkmy @sortpriority = (); while () { chomp; if (/^charset (.*)$/) { $charsetname = $1; @vals = (); @sortpriority = map { 0 } 0..255; } elsif (/^sortpriority ([^-]*)-([^-]*) (.*)$/) { for ($i = hex $1; $i <= hex $2; $i++) { $sortpriority[$i] += $3; }\@vals, \@sortpriority @sortpriority = map { 0 } 0..255$$) { my ($name, $vals, $sortpriority->->[$i]; die "ooh? $i\n" unless defined $sortpriority->[$i]; push @sorted, [$i, $vals->[$i], 0+$sortpriority->== $b->[1] ? $b->[2] <=> $a->[2] : $a->[1] <=> $b->[1] } @sorted; $prefix = " "; $uval = -1; for ($i = $j = 0; $i < scalar @sorted; $i++) { next if ($uval == $sorted[$i]->[1]); # low-priority alternative $uval = $sorted[$i]->[1]; printf "%s0x%02x", $prefix, $sorted[$i]->[0]; if ($j % 8 == 7) { $prefix = ",\n "; } else { $prefix = ", "; } $j++; Revision-number: 2428 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2003-01-02T17:07:24.000000Z K 7 svn:log V 84 ... of course, that would be better still if I remembered to update `nvalid'. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/charset/sbcsgen.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d01966d3278722c9fdc44394c90cbcfd Text-delta-base-sha1: cdb5a43f0794589681baf97b30e4f38e4f0a1e9c Text-content-length: 23 Text-content-md5: 220109a7c6307fb40f635c5a988c7c7b Text-content-sha1: a5765c94cd57036368e0574f895546cbba1f2436 Content-length: 62 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNF: *8$j Revision-number: 2429 Prop-content-length: 235 Content-length: 235 K 8 svn:date V 27 2003-01-02T18:09:21.000000Z K 7 svn:log V 136 Having tested it, note that the Classic 68K build seems to work on Mac OS X now. Also describe more generally which builds work where. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aeb1d3468d233cae43f4445d5785fe6d Text-delta-base-sha1: 3253ca9dbbc317f0a0f816d0c6e3d9a41f223497 Text-content-length: 497 Text-content-md5: 064c839ed00dc7abd3af308e87cc2caa Text-content-sha1: 00502369bba28aabe3885e835441d9b3472eba09 Content-length: 536 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN=] X,)/Yd$Id: README.mac,v 1.7 2003/01/02 18:09:21The Classic 68K build of PuTTY should work on any Macintosh running System 7.0 or later. It runs in the Classic environment in Mac OS X. The CFM-68K build of PuTTY should work on any Macintosh with a 68020, 68030 or 68040 processor and with either the CFM-68K Runtime Enabler or Mac OS 7.6.1 or later installed. The PowerPC build of PuTTY should work on any Power Macintosh. It runs in the Classic environment in Mac OS X Revision-number: 2430 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2003-01-02T23:39:53.000000Z K 7 svn:log V 32 Add a prototype for init_ucs(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f7d5a40cde96b71c2134dcd96a2148e1 Text-delta-base-sha1: 61fa2c6122c580c1f9c06deadb38a9d79d361e4b Text-content-length: 77 Text-content-md5: 829f4f43c8495b69aa4f42b97df8b12c Text-content-sha1: 6ef94f988780aeebd01b2864ac16e023b8a79557 Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNp'49r9H(extern /* from macucs.c */ extern void init_ucs(void Node-path: putty/mac/macucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 314993a16e95063e353941456bbe5a86 Text-delta-base-sha1: c1ea65224ef693a269db8a926d32cd10f9bd68b3 Text-content-length: 76 Text-content-md5: d72bfb903bb05b87624945bd81b7768b Text-content-sha1: a3d574c6333e3513d32ca8cecb5b3907cd176a94 Content-length: 115 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN.? 6*r gestaltOriginalQD) #endif Revision-number: 2432 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2003-01-03T00:40:52.000000Z K 7 svn:log V 92 Pull in Script.r so we can use verBritain in the 'vers' resources rather than hardcoding 2. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 67e6cb1c0368cc4714ebb5d36d5e7d5f Text-delta-base-sha1: 7e5f6b7dd271d0e241da6db8dedce0ff64db0c38 Text-content-length: 118 Text-content-md5: 1b4d75456849e80fd4d9f0161659e210 Text-content-sha1: 95cdc7c7921cd9ba064138f9bfe06e4928446876 Content-length: 157 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN Rm++1Zo&/* $Id: mac_res.r,v 1.9 2003/01/03 00:40:52# include "ScriptverBritain,verBritain, Revision-number: 2433 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2003-01-03T09:49:04.000000Z K 7 svn:log V 23 Update copyright dates K 10 svn:author V 4 owen PROPS-END Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0cc0bf805e336c235755a433b08e61ff Text-delta-base-sha1: 76142e23059c4b95766e69a06cf737bf4498d972 Text-content-length: 29 Text-content-md5: e734fdf0d59e2804e517019f225a1643 Text-content-sha1: 0a1efcdbabd3a88f53b1d45b2536b80373aec648 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNee6L7a33 Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b06acbf3a0ed3d2b817a7056962f6b10 Text-delta-base-sha1: 45c79ac890a784d9ff75f40059830409dc22069d Text-content-length: 29 Text-content-md5: bb1ef741e5360523cab3250369db1f11 Text-content-sha1: d01035191118591f74c6516876c54f89784b4f61 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNiLjb733 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ae40855f4fdd7b473150a33aece96da2 Text-delta-base-sha1: 994768def2e7fe9b73efa61a0edc1a7032eed6c3 Text-content-length: 29 Text-content-md5: 27336fd0aa54c1d51bd6e9836157f202 Text-content-sha1: 0009c2d8ad927b5ac649983014185377609b9b71 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVNjjBGC_ 33 Revision-number: 2434 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2003-01-03T10:59:53.000000Z K 7 svn:log V 112 Update more copyright dates. Sometimes I think we ought to have an automated means of doing this every year :-( K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 515691441b6e1db70e19d9bf1bb5c2c7 Text-delta-base-sha1: d7e50e2e6eaf774870ca4f1ad01d8e156612b841 Text-content-length: 57 Text-content-md5: 104234d7bbb92d9c0c2473f92e14b2f4 Text-content-sha1: 55e86a2f9981b0b3f88f24c9fdaa1b14c3741408 Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN #M.N37 2003/01/03 10:59:53 simon Exp $ Node-path: putty/doc/licence.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 92e67c8fb773602fa2f45c67731ca102 Text-delta-base-sha1: 9fcf5e3fcd8696a90e36bc2287a65c1ed26cf3b7 Text-content-length: 139 Text-content-md5: 4ecd7c05cf584ad3b646fd88dd606cf1 Text-content-sha1: b56d4ddb448650ed28c1f9b7ae2cf57d53140ad2 Content-length: 178 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN&&zz,z\versionid $Id: licence.but,v 1.5 2003/01/03 10:59:53 simon Exp $ \A{licence} PuTTY Licence PuTTY is copyright 1997-2003 Revision-number: 2435 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2003-01-03T12:20:14.000000Z K 7 svn:log V 119 Update copyright notices that both Owen and Simon managed to miss. _How_ many copies of the licence do we need? *grin* K 10 svn:author V 3 ben PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 93b1c11df40c9d34fa6b0da3e036738c Text-delta-base-sha1: 91a7bfc43a20c240f84b45fca3add3388c7a80eb Text-content-length: 44 Text-content-md5: be0a0d9135bf368b7996b759649f58df Text-content-sha1: 2cb05b828a0ebc17df578414e181a3478100b58c Content-length: 83 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNHH,PuTTY is copyright 1997-2003 Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1b4d75456849e80fd4d9f0161659e210 Text-delta-base-sha1: 95cdc7c7921cd9ba064138f9bfe06e4928446876 Text-content-length: 71 Text-content-md5: 8f3a1085f1e13f7801e35cfb46e75d34 Text-content-sha1: f702ce00833d1af900c4206bc9826a5b77a19dc1 Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN -G+s/* $Id: mac_res.r,v 1.10 2003/01/03 12:20:143 Revision-number: 2436 Prop-content-length: 209 Content-length: 209 K 8 svn:date V 27 2003-01-03T17:38:47.000000Z K 7 svn:log V 110 Like the rest of the PuTTY site, refer to the feedback page rather than providing an explicit e-mail address. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a10f46f36f041defde3e3c7d9b269659 Text-delta-base-sha1: f976dbcca78b9ae4aece8353a74e88956cfafdf8 Text-content-length: 282 Text-content-md5: b2b31e804862f7a79fb74392cf3d28a6 Text-content-sha1: af6897eaf548206081f4e5724131582ff0a69084 Content-length: 322 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN`ewO;[dapdM#! /usr/bin/perl # $Id: bugs2html,v 1.14 2003/01/03 17:38:4If you want to comment on this web site, see the Feedback page.p>


    If you want to comment on this web site, see the Feedback page. Revision-number: 2437 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2003-01-03T17:52:51.000000Z K 7 svn:log V 47 Work around a weird bug in gdk_draw_text_wc(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2faa48e493795a8e18f78ede9669405e Text-delta-base-sha1: 6833f40618a9dc167dd45ad7099a716220a8e03c Text-content-length: 805 Text-content-md5: 5a76c93d2f58e59e601d9876efe40712 Text-content-sha1: d0a52927f49b62fb3b9b7701f66500a8119f0eb5 Content-length: 845 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVN@";/* * At least one version of gdk_draw_text_wc() has a * weird bug whereby it reads `len' elements of the * input string, but only draws `len/2'. Hence I'm * going to make its input array twice as long as it * theoretically needs to be, and pass in twice the * actual number of characters. If a fixed gdk actually * takes the doubled length seriously, then (a) the * array will stand scrutiny up to the full length, (b) * the spare elements of the array are full of zeroes * which will probably be an empty glyph in the font, * and (c) the clip rectangle should prevent it causing * trouble anyway. */ gwcs = smalloc(sizeof(GdkWChar) * (len*2+1)); memset(gwcs, 0, sizeof(GdkWChar) * (len*2 Revision-number: 2438 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2003-01-03T19:31:07.000000Z K 7 svn:log V 70 Summary: Strange WinSock messages cause failed assertion in tree234.c K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/strange-winsock-msg Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1220 Text-content-md5: 8ef87fa6d33defdd4e723e8afd68c01d Text-content-sha1: a5c8de1d95c23687c94cebc420c5bcb5870e50cb Content-length: 1336 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN666Summary: Strange WinSock messages cause failed assertion in tree234.c Class: semi-bug Priority: medium Present-in: 0.53 0.53b 2002-12-09 Content-type: text/x-html-body

    A few people have reported seeing the following assertion failure:

    Assertion failed!
    
    Program: C:\Program Files\Putty\putty.exe
    File: tree234.c
    Line: 536
    
    Expression: relation == REL234_LT || relation == REL234_GT

    Appears to be dependent on use of port forwarding. Also, "It was working fine until a few days ago", "funnily enough this started happening in the last couple of weeks", so may be something to do with a Windows hotfix or update. One report indicates that it happens on WinXP but not Win2000; another report is against WinME.

    Reports:

    • 200211231214.AA3343320060@nextgen.net.mt
    • 00c801c29c20$5bce79e0$0301a8c0@jefflap3

    As far as we can tell this implies that WinSock is sending us unexpected messages. As of 2002-12-09, diagnostics have been added of the form "Strange WinSock message: wp=00000000 lp=00000002"; the numbers will help us to debug the problem. Revision-number: 2439 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2003-01-03T20:43:00.000000Z K 7 svn:log V 88 This looks like it might be a real problem, albeit perhaps not actually a bug in PuTTY. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/black-pointer Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 987 Text-content-md5: e80c06f15fdf2fbed5f6971fd7ee8061 Text-content-sha1: bac57efeb42c1a7b47de6fed654e0f4fe77f55ce Content-length: 1103 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNMMMSummary: Mouse pointer appears black on some systems Class: semi-bug Priority: low Difficulty: taxing Present-in: 0.52 Content-type: text/x-html-body

    Some people have reported that PuTTY's default mouse pointer (the Windows I-beam) appears black-on-black, and is hence invisible. It usually consists entirely of inverted pixels, and hence should appear white on PuTTY's default black background. Reports so far:

    • <Pine.OSF.4.50.0212281329190.12205-100000@kosh.hut.fi>:
      Windows 98. No other details
    • <5.2.0.9.2.20030101131051.00a1b8f0@pop.telekabel.at> et seq.:
      PuTTY 0.52. No other details

    I (BJH) have some memory of Simon mentioning having seen this problem before, and it having turned out to be a bug in the video card/driver. At present, I think we need more information on systems where this problem occurs, and in particular what operating system, video card, driver version and colour depth are being used. Revision-number: 2440 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2003-01-03T23:51:49.000000Z K 7 svn:log V 44 Summary: Paging on PSFTP directory listings K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-paging Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 208 Text-content-md5: 06d668cce8b30e5c93ae20264f9c7b45 Text-content-sha1: a8333ff049d110e4a3418eca27126123976902c2 Content-length: 324 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNBBBSummary: Paging on PSFTP directory listings Class: wish Difficulty: fun Priority: low It's been suggested that it would be nice for there to be some sort of paging on PSFTP directory listings. Revision-number: 2441 Prop-content-length: 339 Content-length: 339 K 8 svn:date V 27 2003-01-04T00:13:18.000000Z K 7 svn:log V 240 Correct handling of Mac OS 8.5 Window Manager and Control Manager. The new functions turn out to be available only to PowerPC applications, through WindowsLib and ControlsLib respectively, so we weak-link against those in the obvious way. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6377e1539f190ad7379378218f6a2d13 Text-delta-base-sha1: 5f910e0d439a944be4caea7c1833c7b9448db3ec Text-content-length: 316 Text-content-md5: 9361fd9c08180dd57152196eba904551 Text-content-sha1: a98e265b3fc5173cd907643f54f4d781263db10a Content-length: 356 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNR#(VJ R`x/* $Id: mac.c,v 1.15 2003/01/04 00:13:18#if TARGET_CPU_68K mac_gestalts.cntlattr = 0; mac_gestalts.windattr = 0; #else || &SetControlViewSize == kUnresolvedCFragSymbolAddress || &SetWindowContentColor == kUnresolvedCFragSymbolAddress) mac_gestalts.windattr = 0; #endif Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5caf8ee280e9f220c9538d2ea36f36d1 Text-delta-base-sha1: 529bdb4b8926649c6269f1a63469b54c8144a66f Text-content-length: 106 Text-content-md5: 62ba37ddd2cfe9c83908331696b720f4 Text-content-sha1: dd11f54dea9ae5b78710c543341c95f988ee322a Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN-^JO,h2]P/* $Id: macterm.c,v 1.32 2003/01/04 00:13:18!TARGET_CPU_68K!TARGET_CPU_68K Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 835ed72e4a345007438965b9889ca63b Text-delta-base-sha1: 841a38b4ce8cf9361d5d0128582e60b14a1c9d34 Text-content-length: 148 Text-content-md5: 622850960adf6c7dc2895e22d6ca855b Text-content-sha1: ab02284bcf29f384d714131127752b7e6f6970a6 Content-length: 188 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNnr zRz&HSharedLibraries}ControlsLib" \xb6 -weaklib ControlsLib \xb6 "{SharedLibraries}WindowsLib" \xb6 -weaklib WindowsLib Revision-number: 2442 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2003-01-04T00:31:04.000000Z K 7 svn:log V 36 Small simplification in mac_init(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9361fd9c08180dd57152196eba904551 Text-delta-base-sha1: a98e265b3fc5173cd907643f54f4d781263db10a Text-content-length: 127 Text-content-md5: 38ef28bfc406c791ba372572148713e9 Text-content-sha1: ed0a00f368f8e5ed95d3673964a3abc66affd518 Content-length: 167 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNR/ hi(@^t/* $Id: mac.c,v 1.16 2003/01/04 00:31:04= 0xffff) < 0x700) fatalbox("PuTTY requires System 7 or newer") Revision-number: 2443 Prop-content-length: 291 Content-length: 291 K 8 svn:date V 27 2003-01-04T00:48:13.000000Z K 7 svn:log V 192 Re-arrange the sums in the size tip code so as to ensure that we're always do division on positive numbers, hence avoiding nasty problems of rounding towards zero when I wanted rounding down. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 62ba37ddd2cfe9c83908331696b720f4 Text-delta-base-sha1: dd11f54dea9ae5b78710c543341c95f988ee322a Text-content-length: 382 Text-content-md5: 31448b56a6f175467f686ec8a69de229 Text-content-sha1: a0565e98c077efb53c05005eed87d1997d744595 Content-length: 422 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN^; P^,(?N/* $Id: macterm.c,v 1.33 2003/01/04 00:48:13zerozeromouse = event->where; growterm_state.zeromouse.h -= s->term->cols * s->font_width; growterm_state.zeromouse.v -= s->term->rows * s->font_heightzeromouse.v) / s->font_height; if (newrows < 1) newrows = 1; newcols = (mouse.h - growterm_state.zeromouse.h) / s->font_width Revision-number: 2444 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2003-01-04T12:45:11.000000Z K 7 svn:log V 71 says we should use NULL rather than nil in C, so do that. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 38ef28bfc406c791ba372572148713e9 Text-delta-base-sha1: ed0a00f368f8e5ed95d3673964a3abc66affd518 Text-content-length: 85 Text-content-md5: 98bda1811f9cd694480df062bfcdcdea Text-content-sha1: 777462ce1522f0915a4ed108fc16ea5cb25bf690 Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN/24#(dN(5O`/* $Id: mac.c,v 1.17 2003/01/04 12:45:11NULLNULLNULL Revision-number: 2445 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2003-01-04T16:03:16.000000Z K 7 svn:log V 71 Add some comments from Simon, and more news from one of the reporters. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/black-pointer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e80c06f15fdf2fbed5f6971fd7ee8061 Text-delta-base-sha1: bac57efeb42c1a7b47de6fed654e0f4fe77f55ce Text-content-length: 1221 Text-content-md5: 1a48a83861b51b82764da67c85d9a858 Text-content-sha1: bafa9898ecd404c997eef0d6468e44bb8204ba00 Content-length: 1260 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNM .rxv 0.51 0.52 2002-12-28 et seq.:

    • Windows 98SE
    • PuTTY 0.51 through 2002-12-28
    • "WinFast?" GeForce2 MX 400, BIOS ver. 06.13.2001
    • GDI(Mini) Driver 4.13.01.3100
    • WinFast 2000 Driver 5.13.01.2002-1.07
    • All colour depths
  • <5.2.0.9.2.20030101131051.00a1b8f0@pop.telekabel.at> et seq.:
    PuTTY 0.52. No other details

    From SGT:

    I've seen this same problem personally on a GeForce2MX, and I investigated it carefully. I believe it is a bug in the GeForce2MX video driver. The I-beam cursor is supposed to invert whatever colour is underneath it, but it mistakenly inverts black to black. (My suspicion is that each RGB value x is mapped to 256-x instead of 255-x, or some equally easy typo.)

    Perhaps complaining to the video card manufacturer (assuming it's them who wrote the driver) might be a good first step? I haven't heard of anyone else who's had this problem doing so...

    What I did to solve this myself was to design my own replacement I-beam mouse pointer, which was white with a black outline so as to show up on any kind of background. The video driver was quite happy with that one.

    Revision-number: 2446 Prop-content-length: 153 Content-length: 153 K 7 svn:log V 55 Fix a few stylistic warnings from Apple's C compilers. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-04T16:21:17.000000Z PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1a290eea1fbcf9b15f90aab7aed07702 Text-delta-base-sha1: 91a591a7b29054b5ea60024776e11e641b269e5c Text-content-length: 43 Text-content-md5: c189018bd277d2bbe3883f62c4f2cc0e Text-content-sha1: 59bc468645ac1ae0d008fe841c8bf20ed10cf2d5 Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN@@.Z != NULL != NULL Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b85a97b50bbf759da04e3cb1c3e2ce58 Text-delta-base-sha1: 055aa31100b36773017f213b82dde79ecf89e7ee Text-content-length: 58 Text-content-md5: 5c58d5473327023fdbc113b4e2f1825d Text-content-sha1: b24323c0c3bb12265ba2719ce3355dc1b85d503d Content-length: 98 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN#<212icWL != NULL != NULL continue Revision-number: 2447 Prop-content-length: 447 Content-length: 447 K 7 svn:log V 348 Hammer out some char * vs unsigned char * problems. In general, I've kept any buffers used internally by telnet.c as unsigned char, and cast to/from char * when interacting with the rest of PuTTY. Not actually tested, since I'm some way from actually being able to link this yet. Also clean up a couple of style warnings from Apple's compilers. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-04T16:42:53.000000Z PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9151336b17fe1c03af76600d7737c053 Text-delta-base-sha1: 4f0197c7adde4ade5148acf3bf0a2e4e11814e0d Text-content-length: 1368 Text-content-md5: e9aeddd716f0ff6368eb5ffb6740cf22 Text-content-sha1: db589ddb44e4cf62609043d539617c486313a902 Content-length: 1408 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN @{TzxNKbQC3vg0ofJ F< \FhTz@VvFTzFW|ESIFOunsigned(char *)(char *)(b + 4)(char *)(char *)(char *)unsigned != NULL != NULLunsigned char *p, *end(unsigned char *)buf; end = (unsigned char *)(buf + len); while (p < end) { unsigned char *q = p; while (p < end && iswritable(*p)) p++; telnet->bufsize = sk_write(telnet->s, (char *)q, p - q); while (p < end && !iswritable(*p)) { telnet->bufsize = sk_write(telnet->s, (char *)(*p == IAC ? iac : cr)(char *)(char *)b, 2); break; case TS_BRK: b[1] = BREAK; telnet->bufsize = sk_write(telnet->s, (char *)(char *)b, 2); break; case TS_EL: b[1] = EL; telnet->bufsize = sk_write(telnet->s, (char *)b, 2); break; case TS_GA: b[1] = GA; telnet->bufsize = sk_write(telnet->s, (char *)(char *)b, 2); break; case TS_ABORT: b[1] = ABORT; telnet->bufsize = sk_write(telnet->s, (char *)b, 2); break; case TS_AO: b[1] = AO; telnet->bufsize = sk_write(telnet->s, (char *)(char *)b, 2); break; case TS_SUSP: b[1] = SUSP; telnet->bufsize = sk_write(telnet->s, (char *)b, 2); break; case TS_EOR: b[1] = EOR; telnet->bufsize = sk_write(telnet->s, (char *)(char *)(char *)b, 1); telnet->bufsize = sk_write_oob(telnet->s, (char *)(b + 1)(char *) Revision-number: 2448 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2003-01-04T16:56:33.000000Z K 7 svn:log V 106 Fix some char * vs unsigned char * conversions, plus a stylistic nit, both courtesy of Apple's compilers. K 10 svn:author V 3 ben PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 92a8debaba2f9fa7c59a54282c0fa478 Text-delta-base-sha1: cf9bd98ced594d48c41f4e8650c4be4477775ec6 Text-content-length: 85 Text-content-md5: d9487aed6c174e8b1a96b330467e71d4 Text-content-sha1: 5dd88a47c785105fb279191fc8f46db6d9710f48 Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNS}0l! (+ != NULL(unsigned char *)(buf+i), (char *) Revision-number: 2449 Prop-content-length: 338 Content-length: 338 K 8 svn:date V 27 2003-01-04T17:24:49.000000Z K 7 svn:log V 239 Provide a version of stricmp() and strnicmp() for Mac OS, which doesn't have its own. These are from NetBSD's libc, and have a standard (now 3-clause) Berkeley licence. Also provide a definition of DWORD and a better definition of BYTE. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4e930be92acceaea7f613bf7333d8656 Text-delta-base-sha1: e7044e95d916ddad57359e8c137329273c045073 Text-content-length: 101 Text-content-md5: dce8a8ad944f42ceefd04a1d3c55d251 Text-content-sha1: ef9a6ea24da6b799853fde1fea0381c097d885be Content-length: 141 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNt PWPMO/* from mtcpnet.c */ extern OSErr mactcp_init(void); extern void mactcp_shutdown Node-path: putty/mac/stricmp.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2561 Text-content-md5: 77b2ad7ca911f38f0b507818f279be3b Text-content-sha1: 521396fb12fdeba985ca90292dcac32f9652a1b1 Content-length: 2677 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNsss #include "putty.h" #define strcasecmp stricmp #define strncasecmp strnicmp #define _DIAGASSERT(e) /* nothing */ /* * Copyright (c) 1987, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * From NetBSD: strcasecmp.c,v 1.12 2000/01/22 22:19:20 mycroft Exp */ #include typedef unsigned char u_char; int strcasecmp(s1, s2) const char *s1, *s2; { const u_char *us1 = (const u_char *)s1, *us2 = (const u_char *)s2; _DIAGASSERT(s1 != NULL); _DIAGASSERT(s2 != NULL); while (tolower(*us1) == tolower(*us2++)) if (*us1++ == '\0') return (0); return (tolower(*us1) - tolower(*--us2)); } int strncasecmp(s1, s2, n) const char *s1, *s2; size_t n; { _DIAGASSERT(s1 != NULL); _DIAGASSERT(s2 != NULL); if (s1 == NULL || s2 == NULL) return (0); if (n != 0) { const u_char *us1 = (const u_char *)s1, *us2 = (const u_char *)s2; do { if (tolower(*us1) != tolower(*us2++)) return (tolower(*us1) - tolower(*--us2)); if (*us1++ == '\0') break; } while (--n != 0); } return (0); } Revision-number: 2450 Prop-content-length: 251 Content-length: 251 K 8 svn:date V 27 2003-01-04T18:54:15.000000Z K 7 svn:log V 150 Summary: Vulnerabilities discovered by SSHredder test suite (CERT CA-2002-36) Includes links to advisories, test suite, and proof-of-concept exploit. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-sshredder Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 989 Text-content-md5: 87fcc6c9039ef57ba96f5349d0487812 Text-content-sha1: bd69fccdcad7b1717af1f7985afda18e2fd19987 Content-length: 1105 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNOOOSummary: Vulnerabilities discovered by SSHredder test suite (CERT CA-2002-36) Class: bug Difficulty: fun Priority: high Present-in: 0.53 Fixed-in: 0.53b Content-type: text/x-html-body

    PuTTY 0.53 and earlier are vulnerable to the attack described in CERT advisory CA-2002-36 "Multiple Vulnerabilities in SSH Implementations" (also VU#389665). This vulnerability is believed to be fixed in 0.53b (released Nov 12, 2002).

    Certain well-chosen malformed or unusual packets can lead to remote code execution attacks. See the Rapid7 advisorory and their SSHredder test suite for details.

    I-Proyectos has released a proof-of-concept exploit to BugTraq. Revision-number: 2451 Prop-content-length: 511 Content-length: 511 K 8 svn:date V 27 2003-01-04T19:01:45.000000Z K 7 svn:log V 412 Add a vsnprintf() for the Mac, which doesn't have one of its own. This is the NetBSD kernel printf, which is integer-only and under a Berkeley-style (now 3-clause) copyright owned by UCB. This has only been compile-tested, but almost all of my changes were in the definitions at the top (the exception being to remove tty output). This lacks 64-bit support because the Apple 68K C compiler, SC, lacks it too. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/vsnprint.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 13808 Text-content-md5: 89e5df98839d4e80b163ea00685bd05a Text-content-sha1: 0bb69341548725fb3aef44a920fc71071610f6ba Content-length: 13924 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNbbb #include #include #include "putty.h" #define __P(decl) decl /* XXX */ typedef unsigned long u_quad_t; typedef long quad_t; typedef unsigned long u_long; typedef unsigned int u_int; typedef unsigned short u_short; typedef long intmax_t; typedef unsigned long uintmax_t; typedef long intptr_t; typedef unsigned long uintptr_t; typedef int ssize_t; #define NBBY CHAR_BIT /*- * Copyright (c) 1986, 1988, 1991, 1993 * The Regents of the University of California. All rights reserved. * (c) UNIX System Laboratories, Inc. * All or some portions of this file are derived from material licensed * to the University of California by American Telephone and Telegraph * Co. or Unix System Laboratories, Inc. and are reproduced herein with * the permission of UNIX System Laboratories, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * From NetBSD: subr_prf.c,v 1.86 2002/11/02 07:25:22 perry Exp * @(#)subr_prf.c 8.4 (Berkeley) 5/4/95 */ /* flags for kprintf */ #define TOCONS 0x01 /* to the console */ #define TOTTY 0x02 /* to the process' tty */ #define TOLOG 0x04 /* to the kernel message buffer */ #define TOBUFONLY 0x08 /* to the buffer (only) [for snprintf] */ #define TODDB 0x10 /* to ddb console */ /* max size buffer kprintf needs to print quad_t [size in base 8 + \0] */ #define KPRINTF_BUFSIZE (sizeof(quad_t) * NBBY / 3 + 2) /* * local prototypes */ static int kprintf __P((const char *, int, void *, char *, va_list)); /* * vsnprintf: print a message to a buffer [already have va_alist] */ int vsnprintf(buf, size, fmt, ap) char *buf; size_t size; const char *fmt; va_list ap; { int retval; char *p; if (size < 1) return (-1); p = buf + size - 1; retval = kprintf(fmt, TOBUFONLY, &p, buf, ap); *(p) = 0; /* null terminate */ return(retval); } /* * kprintf: scaled down version of printf(3). * * this version based on vfprintf() from libc which was derived from * software contributed to Berkeley by Chris Torek. * * NOTE: The kprintf mutex must be held if we're going TOBUF or TOCONS! */ /* * macros for converting digits to letters and vice versa */ #define to_digit(c) ((c) - '0') #define is_digit(c) ((unsigned)to_digit(c) <= 9) #define to_char(n) ((n) + '0') /* * flags used during conversion. */ #define ALT 0x001 /* alternate form */ #define HEXPREFIX 0x002 /* add 0x or 0X prefix */ #define LADJUST 0x004 /* left adjustment */ #define LONGDBL 0x008 /* long double; unimplemented */ #define LONGINT 0x010 /* long integer */ #define QUADINT 0x020 /* quad integer */ #define SHORTINT 0x040 /* short integer */ #define MAXINT 0x080 /* intmax_t */ #define PTRINT 0x100 /* intptr_t */ #define SIZEINT 0x200 /* size_t */ #define ZEROPAD 0x400 /* zero (as opposed to blank) pad */ #define FPT 0x800 /* Floating point number */ /* * To extend shorts properly, we need both signed and unsigned * argument extraction methods. */ #define SARG() \ (flags&MAXINT ? va_arg(ap, intmax_t) : \ flags&PTRINT ? va_arg(ap, intptr_t) : \ flags&SIZEINT ? va_arg(ap, ssize_t) : /* XXX */ \ flags&QUADINT ? va_arg(ap, quad_t) : \ flags&LONGINT ? va_arg(ap, long) : \ flags&SHORTINT ? (long)(short)va_arg(ap, int) : \ (long)va_arg(ap, int)) #define UARG() \ (flags&MAXINT ? va_arg(ap, uintmax_t) : \ flags&PTRINT ? va_arg(ap, uintptr_t) : \ flags&SIZEINT ? va_arg(ap, size_t) : \ flags&QUADINT ? va_arg(ap, u_quad_t) : \ flags&LONGINT ? va_arg(ap, u_long) : \ flags&SHORTINT ? (u_long)(u_short)va_arg(ap, int) : \ (u_long)va_arg(ap, u_int)) #define KPRINTF_PUTCHAR(C) { \ if (oflags == TOBUFONLY) { \ if ((vp != NULL) && (sbuf == tailp)) { \ ret += 1; /* indicate error */ \ goto overflow; \ } \ *sbuf++ = (C); \ } \ } /* * Guts of kernel printf. Note, we already expect to be in a mutex! */ static int kprintf(fmt0, oflags, vp, sbuf, ap) const char *fmt0; int oflags; void *vp; char *sbuf; va_list ap; { char *fmt; /* format string */ int ch; /* character from fmt */ int n; /* handy integer (short term usage) */ char *cp; /* handy char pointer (short term usage) */ int flags; /* flags as above */ int ret; /* return value accumulator */ int width; /* width from format (%8d), or 0 */ int prec; /* precision from format (%.3d), or -1 */ char sign; /* sign prefix (' ', '+', '-', or \0) */ u_quad_t _uquad; /* integer arguments %[diouxX] */ enum { OCT, DEC, HEX } base;/* base for [diouxX] conversion */ int dprec; /* a copy of prec if [diouxX], 0 otherwise */ int realsz; /* field size expanded by dprec */ int size; /* size of converted field or string */ char *xdigs; /* digits for [xX] conversion */ char buf[KPRINTF_BUFSIZE]; /* space for %c, %[diouxX] */ char *tailp; /* tail pointer for snprintf */ tailp = NULL; /* XXX: shutup gcc */ if (oflags == TOBUFONLY && (vp != NULL)) tailp = *(char **)vp; cp = NULL; /* XXX: shutup gcc */ size = 0; /* XXX: shutup gcc */ fmt = (char *)fmt0; ret = 0; xdigs = NULL; /* XXX: shut up gcc warning */ /* * Scan the format for conversions (`%' character). */ for (;;) { while (*fmt != '%' && *fmt) { ret++; KPRINTF_PUTCHAR(*fmt++); } if (*fmt == 0) goto done; fmt++; /* skip over '%' */ flags = 0; dprec = 0; width = 0; prec = -1; sign = '\0'; rflag: ch = *fmt++; reswitch: switch (ch) { case ' ': /* * ``If the space and + flags both appear, the space * flag will be ignored.'' * -- ANSI X3J11 */ if (!sign) sign = ' '; goto rflag; case '#': flags |= ALT; goto rflag; case '*': /* * ``A negative field width argument is taken as a * - flag followed by a positive field width.'' * -- ANSI X3J11 * They don't exclude field widths read from args. */ if ((width = va_arg(ap, int)) >= 0) goto rflag; width = -width; /* FALLTHROUGH */ case '-': flags |= LADJUST; goto rflag; case '+': sign = '+'; goto rflag; case '.': if ((ch = *fmt++) == '*') { n = va_arg(ap, int); prec = n < 0 ? -1 : n; goto rflag; } n = 0; while (is_digit(ch)) { n = 10 * n + to_digit(ch); ch = *fmt++; } prec = n < 0 ? -1 : n; goto reswitch; case '0': /* * ``Note that 0 is taken as a flag, not as the * beginning of a field width.'' * -- ANSI X3J11 */ flags |= ZEROPAD; goto rflag; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n = 0; do { n = 10 * n + to_digit(ch); ch = *fmt++; } while (is_digit(ch)); width = n; goto reswitch; case 'h': flags |= SHORTINT; goto rflag; case 'j': flags |= MAXINT; goto rflag; case 'l': if (*fmt == 'l') { fmt++; flags |= QUADINT; } else { flags |= LONGINT; } goto rflag; case 'q': flags |= QUADINT; goto rflag; case 't': flags |= PTRINT; goto rflag; case 'z': flags |= SIZEINT; goto rflag; case 'c': *(cp = buf) = va_arg(ap, int); size = 1; sign = '\0'; break; case 'D': flags |= LONGINT; /*FALLTHROUGH*/ case 'd': case 'i': _uquad = SARG(); if ((quad_t)_uquad < 0) { _uquad = -_uquad; sign = '-'; } base = DEC; goto number; case 'n': if (flags & MAXINT) *va_arg(ap, intmax_t *) = ret; else if (flags & PTRINT) *va_arg(ap, intptr_t *) = ret; else if (flags & SIZEINT) *va_arg(ap, ssize_t *) = ret; else if (flags & QUADINT) *va_arg(ap, quad_t *) = ret; else if (flags & LONGINT) *va_arg(ap, long *) = ret; else if (flags & SHORTINT) *va_arg(ap, short *) = ret; else *va_arg(ap, int *) = ret; continue; /* no output */ case 'O': flags |= LONGINT; /*FALLTHROUGH*/ case 'o': _uquad = UARG(); base = OCT; goto nosign; case 'p': /* * ``The argument shall be a pointer to void. The * value of the pointer is converted to a sequence * of printable characters, in an implementation- * defined manner.'' * -- ANSI X3J11 */ /* NOSTRICT */ _uquad = (u_long)va_arg(ap, void *); base = HEX; xdigs = "0123456789abcdef"; flags |= HEXPREFIX; ch = 'x'; goto nosign; case 's': if ((cp = va_arg(ap, char *)) == NULL) cp = "(null)"; if (prec >= 0) { /* * can't use strlen; can only look for the * NUL in the first `prec' characters, and * strlen() will go further. */ char *p = memchr(cp, 0, prec); if (p != NULL) { size = p - cp; if (size > prec) size = prec; } else size = prec; } else size = strlen(cp); sign = '\0'; break; case 'U': flags |= LONGINT; /*FALLTHROUGH*/ case 'u': _uquad = UARG(); base = DEC; goto nosign; case 'X': xdigs = "0123456789ABCDEF"; goto hex; case 'x': xdigs = "0123456789abcdef"; hex: _uquad = UARG(); base = HEX; /* leading 0x/X only if non-zero */ if (flags & ALT && _uquad != 0) flags |= HEXPREFIX; /* unsigned conversions */ nosign: sign = '\0'; /* * ``... diouXx conversions ... if a precision is * specified, the 0 flag will be ignored.'' * -- ANSI X3J11 */ number: if ((dprec = prec) >= 0) flags &= ~ZEROPAD; /* * ``The result of converting a zero value with an * explicit precision of zero is no characters.'' * -- ANSI X3J11 */ cp = buf + KPRINTF_BUFSIZE; if (_uquad != 0 || prec != 0) { /* * Unsigned mod is hard, and unsigned mod * by a constant is easier than that by * a variable; hence this switch. */ switch (base) { case OCT: do { *--cp = to_char(_uquad & 7); _uquad >>= 3; } while (_uquad); /* handle octal leading 0 */ if (flags & ALT && *cp != '0') *--cp = '0'; break; case DEC: /* many numbers are 1 digit */ while (_uquad >= 10) { *--cp = to_char(_uquad % 10); _uquad /= 10; } *--cp = to_char(_uquad); break; case HEX: do { *--cp = xdigs[_uquad & 15]; _uquad >>= 4; } while (_uquad); break; default: cp = "bug in kprintf: bad base"; size = strlen(cp); goto skipsize; } } size = buf + KPRINTF_BUFSIZE - cp; skipsize: break; default: /* "%?" prints ?, unless ? is NUL */ if (ch == '\0') goto done; /* pretend it was %c with argument ch */ cp = buf; *cp = ch; size = 1; sign = '\0'; break; } /* * All reasonable formats wind up here. At this point, `cp' * points to a string which (if not flags&LADJUST) should be * padded out to `width' places. If flags&ZEROPAD, it should * first be prefixed by any sign or other prefix; otherwise, * it should be blank padded before the prefix is emitted. * After any left-hand padding and prefixing, emit zeroes * required by a decimal [diouxX] precision, then print the * string proper, then emit zeroes required by any leftover * floating precision; finally, if LADJUST, pad with blanks. * * Compute actual size, so we know how much to pad. * size excludes decimal prec; realsz includes it. */ realsz = dprec > size ? dprec : size; if (sign) realsz++; else if (flags & HEXPREFIX) realsz+= 2; /* adjust ret */ ret += width > realsz ? width : realsz; /* right-adjusting blank padding */ if ((flags & (LADJUST|ZEROPAD)) == 0) { n = width - realsz; while (n-- > 0) KPRINTF_PUTCHAR(' '); } /* prefix */ if (sign) { KPRINTF_PUTCHAR(sign); } else if (flags & HEXPREFIX) { KPRINTF_PUTCHAR('0'); KPRINTF_PUTCHAR(ch); } /* right-adjusting zero padding */ if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) { n = width - realsz; while (n-- > 0) KPRINTF_PUTCHAR('0'); } /* leading zeroes from decimal precision */ n = dprec - size; while (n-- > 0) KPRINTF_PUTCHAR('0'); /* the string or number proper */ while (size--) KPRINTF_PUTCHAR(*cp++); /* left-adjusting padding (always blank) */ if (flags & LADJUST) { n = width - realsz; while (n-- > 0) KPRINTF_PUTCHAR(' '); } } done: if ((oflags == TOBUFONLY) && (vp != NULL)) *(char **)vp = sbuf; overflow: return (ret); /* NOTREACHED */ } Revision-number: 2452 Prop-content-length: 333 Content-length: 333 K 8 svn:date V 27 2003-01-04T19:51:20.000000Z K 7 svn:log V 234 Beginnings of a MacTCP network layer. This has all of the DNS interface present, including stuff to find and load the MacTCP DNR. Actually making a TCP connection is still unimplemented, though, and much testing remains to be done. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 11979 Text-content-md5: 3f1bae8d6185dd4b28fcff4640840eb2 Text-content-sha1: 1467cfbd76441cf702ec3dfce67aaabb80dab1d0 Content-length: 12095 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN===/* * Copyright (c) 2003 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * mtcpnet.c - MacTCP interface */ #include #include #include #include #include #include #include #include #include "putty.h" #include "network.h" #include "mac.h" /* * The following structures are documented as being in * , but that isn't shipped with Universal * Interfaces, and it's easier to define them here than to require * people to download yet another SDK. */ static OSErr OpenResolver(char *); static OSErr CloseResolver(void); enum { OPENRESOLVER = 1, CLOSERESOLVER, STRTOADDR, ADDRTOSTR, ENUMCACHE, ADDRTONAME, HXINFO, MXINFO }; #define NUM_ALT_ADDRS 4 typedef struct hostInfo { int rtnCode; char cname[255]; unsigned long addr[NUM_ALT_ADDRS]; }; typedef CALLBACK_API(void, ResultProcPtr)(struct hostInfo *, char *); typedef STACK_UPP_TYPE(ResultProcPtr) ResultUPP; enum { uppResultProcInfo = kPascalStackBased | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(struct hostInfo*))) | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *))) }; #define NewResultUPP(userRoutine) \ (ResultUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), \ uppResultProcInfo, \ GetCurrentArchitecture()) #define DisposeResultUPP(userUPP) DisposeRoutineDescriptor(userUPP) static OSErr StrToAddr(char *, struct hostInfo *, ResultUPP *, char *); typedef CALLBACK_API_C(OSErr, OpenResolverProcPtr)(UInt32, char *); typedef STACK_UPP_TYPE(OpenResolverProcPtr) OpenResolverUPP; enum { uppOpenResolverProcInfo = kCStackBased | RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(UInt32))) | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char*))) }; #define InvokeOpenResolverUPP(selector, fileName, userUPP) \ CALL_TWO_PARAMETER_UPP((userUPP), uppOpenResolverProcInfo, \ (selector), (fileName)) typedef CALLBACK_API_C(OSErr, CloseResolverProcPtr)(UInt32); typedef STACK_UPP_TYPE(CloseResolverProcPtr) CloseResolverUPP; enum { uppCloseResolverProcInfo = kCStackBased | RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(UInt32))) }; #define InvokeCloseResolverUPP(selector, userUPP) \ CALL_ONE_PARAMETER_UPP((userUPP), uppCloseResolverProcInfo, (selector)) typedef CALLBACK_API_C(OSErr, StrToAddrProcPtr)(UInt32, char *, struct hostInfo *, ResultUPP, char *); typedef STACK_UPP_TYPE(StrToAddrProcPtr) StrToAddrUPP; enum { uppStrToAddrProcInfo = kCStackBased | RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(UInt32))) | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *))) | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(struct hostInfo *))) | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof(ResultUPP))) | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof(char *))) }; #define InvokeStrToAddrUPP(selector, hostName, hostInfoPtr, ResultProc, \ userDataPtr, userUPP) \ CALL_FIVE_PARAMETER_UPP((userUPP), uppStrToAddrProcInfo, (selector),\ (hostName), (hostInfoPtr), (ResultProc), \ (userDataPtr)) #define StrToAddr(hostName, hostInfoPtr, ResultProc, userDataPtr) \ InvokeStrToAddrUPP(STRTOADDR, hostName, hostInfoPtr, ResultProc, \ userDataPtr, (StrToAddrUPP)*mactcp.dnr_handle) typedef CALLBACK_API_C(OSErr, AddrToStrProcPtr)(UInt32, unsigned long, char *); typedef STACK_UPP_TYPE(AddrToStrProcPtr) AddrToStrUPP; enum { uppAddrToStrProcInfo = kCStackBased | RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(unsigned long))) | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(char *))) }; #define InvokeAddrToStrUPP(selector, addr, addrStr, userUPP) \ CALL_THREE_PARAMETER_UPP((userUPP), uppAddrToStrProcInfo, (selector),\ (addr), (addrStr)) #define AddrToStr(addr, addrStr) \ InvokeAddrToStrUPP(ADDRTOSTR, addr, addrStr, \ (AddrToStrUPP)*mactcp.dnr_handle) /* End of AddressXlation.h bits */ struct Socket_tag { struct socket_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ }; /* * We used to typedef struct Socket_tag *Socket. * * Since we have made the networking abstraction slightly more * abstract, Socket no longer means a tcp socket (it could mean * an ssl socket). So now we must use Actual_Socket when we know * we are talking about a tcp socket. */ typedef struct Socket_tag *Actual_Socket; struct SockAddr_tag { int resolved; struct hostInfo hostinfo; char hostname[512]; }; /* Global variables */ static struct { Handle dnr_handle; int initialised; short refnum; } mactcp; static pascal void mactcp_lookupdone(struct hostInfo *hi, char *cookie); /* * Initialise MacTCP. * This should be called once before any TCP connection is opened. */ OSErr mactcp_init(void) { OSErr err; /* * IM:Devices describes a convoluted way of finding a spare unit * number to open a driver on before calling OpenDriver. Happily, * I think the MacTCP INIT ensures that .IPP is already open (and * hence has a valid unit number already) so we don't need to go * through all that. */ err = OpenDriver("\p.IPP", &mactcp.refnum); if (err != noErr) return err; err = OpenResolver(NULL); if (err != noErr) return err; mactcp.initialised = TRUE; return noErr; } void mactcp_shutdown(void) { CloseResolver(); mactcp.initialised = FALSE; } static ResultUPP mactcp_lookupdone_upp; SockAddr sk_namelookup(char *host, char **canonicalname) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); OSErr err; volatile int done = FALSE; char *realhost; /* Clear the structure. */ memset(ret, 0, sizeof(struct SockAddr_tag)); if (mactcp_lookupdone_upp == NULL) mactcp_lookupdone_upp = NewResultUPP(&mactcp_lookupdone); err = StrToAddr(host, &ret->hostinfo, mactcp_lookupdone_upp, (char *)&done); /* * PuTTY expects DNS lookups to be synchronous (see bug * "async-dns"), so we pretend they are. */ if (err == cacheFault) while (!done) continue; ret->resolved = TRUE; if (ret->hostinfo.rtnCode == noErr) realhost = ret->hostinfo.cname; else realhost = ""; *canonicalname = smalloc(1+strlen(realhost)); strcpy(*canonicalname, realhost); return ret; } static pascal void mactcp_lookupdone(struct hostInfo *hi, char *cookie) { volatile int *donep = (int *)cookie; *donep = TRUE; } SockAddr sk_nonamelookup(char *host) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); ret->resolved = FALSE; ret->hostinfo.rtnCode = noErr; ret->hostname[0] = '\0'; strncat(ret->hostname, host, lenof(ret->hostname) - 1); return ret; } void sk_getaddr(SockAddr addr, char *buf, int buflen) { char mybuf[16]; OSErr err; /* XXX only return first address */ err = AddrToStr(addr->hostinfo.addr[0], mybuf); buf[0] = '\0'; if (err != noErr) strncat(buf, mybuf, buflen - 1); } /* I think "local" here really means "loopback" */ int sk_hostname_is_local(char *name) { return !strcmp(name, "localhost"); } int sk_address_is_local(SockAddr addr) { int i; if (addr->resolved) for (i = 0; i < NUM_ALT_ADDRS; i++) if (addr->hostinfo.addr[i] & 0xff000000 == 0x7f000000) return TRUE; return FALSE; } int sk_addrtype(SockAddr addr) { if (addr->resolved) return ADDRTYPE_IPV4; return ADDRTYPE_NAME; } void sk_addrcopy(SockAddr addr, char *buf) { /* XXX only return first address */ memcpy(buf, &addr->hostinfo.addr[0], 4); } void sk_addr_free(SockAddr addr) { sfree(addr); } Socket sk_new(SockAddr addr, int port, int privport, int oobinline, int nodelay, Plug plug) { fatalbox("sk_new"); } /* * Special error values are returned from sk_namelookup and sk_new * if there's a problem. These functions extract an error message, * or return NULL if there's no problem. */ char *sk_addr_error(SockAddr addr) { static char buf[64]; switch (addr->hostinfo.rtnCode) { case noErr: return NULL; case nameSyntaxErr: return "Name syntax error"; case noNameServer: return "No name server found"; case authNameErr: return "Domain name does not exist"; case noAnsErr: return "No answer from domain name server"; case dnrErr: return "Domain name server returned an error"; case outOfMemory: return "Out of memory"; default: sprintf(buf, "Unknown DNR error %d", addr->hostinfo.rtnCode); return buf; } } /* * Bits below here would usually be in dnr.c, shipped with the MacTCP * SDK, but its convenient not to require that, and since we assume * System 7 we can actually simplify things a lot. */ static OSErr OpenResolver(char *hosts_file) { short vrefnum; long dirid; HParamBlockRec pb; Str255 filename; OSErr err; int fd; Handle dnr_handle; if (mactcp.dnr_handle != NULL) return noErr; err = FindFolder(kOnSystemDisk, kControlPanelFolderType, FALSE, &vrefnum, &dirid); if (err != noErr) return err; /* * Might be better to use PBCatSearch here, but it's not always * available. */ pb.fileParam.ioCompletion = NULL; pb.fileParam.ioNamePtr = filename; pb.fileParam.ioVRefNum = vrefnum; pb.fileParam.ioFDirIndex = 1; pb.fileParam.ioDirID = dirid; fd = -1; while (PBHGetFInfo(&pb, FALSE) == noErr) { if (pb.fileParam.ioFlFndrInfo.fdType == 'cdev' && pb.fileParam.ioFlFndrInfo.fdCreator == 'ztcp') { fd = HOpenResFile(vrefnum, dirid, filename, fsRdPerm); if (fd == -1) continue; dnr_handle = Get1IndResource('dnrp', 1); if (dnr_handle != NULL) break; CloseResFile(fd); fd = -1; } pb.fileParam.ioDirID = dirid; pb.fileParam.ioFDirIndex++; } if (fd == -1) return fnfErr; DetachResource(dnr_handle); CloseResFile(fd); MoveHHi(dnr_handle); HLock(dnr_handle); err = InvokeOpenResolverUPP(OPENRESOLVER, hosts_file, (OpenResolverUPP)*dnr_handle); if (err != noErr) { HUnlock(dnr_handle); DisposeHandle(dnr_handle); return err; } mactcp.dnr_handle = dnr_handle; return noErr; } OSErr CloseResolver(void) { Handle dnr_handle = mactcp.dnr_handle; OSErr err; if (mactcp.dnr_handle == NULL) return notOpenErr; err = InvokeCloseResolverUPP(CLOSERESOLVER, (CloseResolverUPP)*mactcp.dnr_handle); if (err != noErr) return err; mactcp.dnr_handle = NULL; HUnlock(dnr_handle); DisposeHandle(dnr_handle); return noErr; } /* * Local Variables: * c-file-style: "simon" * End: */ Revision-number: 2453 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2003-01-05T00:06:25.000000Z K 7 svn:log V 82 Add some backends, a network interface and some library routines to the Mac port. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a860fd6ff661eb4e2a2fceed7ccfa920 Text-delta-base-sha1: c058b8441dec43dd3e9aa4f34b0402ed68e466e9 Text-content-length: 222 Text-content-md5: 581a755228fe981bdf1b8964227959ef Text-content-sha1: 5879206ca975c5a75f396e4ee62c94b323bf0d96 Content-length: 262 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN5o EYQXMACMISC = misc macstore settings tree234 mtcpnet proxyldisc ldiscucs logging be_nossh mac macdlg + macterm macucs mac_res.rsrc testback NONSSH MACMISC CHARSET + stricmp vsnprint Revision-number: 2454 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2003-01-05T03:41:04.000000Z K 7 svn:log V 45 Summary: Trouble with empty PPK key comments K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ppk-empty-comment Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 528 Text-content-md5: 93d53b591b4e393b212b9c6cb25cb6a4 Text-content-sha1: a9b1b90c3736a49e30dab86e2ef868ea099a7bed Content-length: 644 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: Trouble with empty PPK key comments Class: bug Difficulty: fun Priority: medium Present-in: 0.53b Content-type: text/x-html-body

    Certain forms of empty key comment in PPK files can cause PuTTY to throw an assertion failure (terminal.c, line 3769, len > 0 for 0.53b) (and possibly crash?). Apparently such files can be generated by PuTTYgen.

    For more details:

    • 000801c2a3bf$a6b5ab80$5f00a8c0@gabba.world
    • 20030105014246.6485.2902@hm-web2.solinus.com
    Revision-number: 2455 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2003-01-05T04:50:18.000000Z K 7 svn:log V 26 Fix typo, improve summary K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-sshredder Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 87fcc6c9039ef57ba96f5349d0487812 Text-delta-base-sha1: bd69fccdcad7b1717af1f7985afda18e2fd19987 Text-content-length: 66 Text-content-md5: 14381a5d87f7c18c81a29131f6edacb6 Text-content-sha1: 0b90f4101576b39a2b9080a6743d5fbf3f3fc637 Content-length: 105 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNO? - ;JSummary: SSHredder test suite vulnerabilities Revision-number: 2456 Prop-content-length: 206 Content-length: 206 K 8 svn:date V 27 2003-01-05T10:52:56.000000Z K 7 svn:log V 107 Second work-in-progress MacTCP commit. We can now open a connection, but not transfer any data across it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 98bda1811f9cd694480df062bfcdcdea Text-delta-base-sha1: 777462ce1522f0915a4ed108fc16ea5cb25bf690 Text-content-length: 297 Text-content-md5: c4320ca373112de51912161e62d57240 Text-content-sha1: b09de01737d5a34de4d9a099f2296cca5e589daa Content-length: 337 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN22"{ (-DREfo1UInt8 #define DWORD UInt32 extern int stricmp(char const *, char const *); extern int strnicmp(char const *, char const *, size_t); Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 31448b56a6f175467f686ec8a69de229 Text-delta-base-sha1: a0565e98c077efb53c05005eed87d1997d744595 Text-content-length: 778 Text-content-md5: 512463079a48293525783f5928bdee67 Text-content-sha1: 709dfb6b342ffe4c76c109c0702e1f18218d2893 Content-length: 818 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN;3Ie,<wgH~TkpX>C$/* $Id: macterm.c,v 1.34 2003/01/05 10:52:56 int i /* * Select protocol. This is farmed out into a table in a * separate file to enable an ssh-free variant. */ s->back = NULL; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == cfg.protocol) { s->back = backends[i].backend; break; } if (s->back == NULL) { fatalbox("Unsupported protocol number found"); } char *errmsg s->logctx = log_init(s); term_provide_logctx(s->term, s->logctx); errmsg = s->back->init(s->term, &s->backhandle, s->cfg.host, s->cfg.port, &s->realhost, s->cfg.tcp_nodelay); if (errmsg != NULL) inbuf_putstr(s, errmsgfprintf(stderr, "%s\n", str); Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3f1bae8d6185dd4b28fcff4640840eb2 Text-delta-base-sha1: 1467cfbd76441cf702ec3dfce67aaabb80dab1d0 Text-content-length: 7352 Text-content-md5: 9d6855977259d579140e93b401a3f7e1 Text-content-sha1: be090697e364374b5449407553f4a2621bc5c282 Content-length: 7391 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN=EfXm)m4 27?>akwky5kGv StreamPtr s; OSErr err; Plug plug; void *private_ptr; bufchain output_data; int connected; int writable; int frozen; /* this causes readability notifications to be ignored */ int frozen_readable; /* this means we missed at least one readability * notification while we were frozen */ int localhost_only; /* for listening sockets */ char oobdata[1]; int sending_oob; int oobpending; /* is there OOB data available to read? */ int oobinline; int pending_error; /* in case send() returns error */ int listener;static Plug mactcp_plug(Socket, Plug); static void mactcp_flush(Socket); static void mactcp_close(Socket); static int mactcp_write(Socket, char *, int); static int mactcp_write_oob(Socket, char *, int); static void mactcp_set_private_ptr(Socket, void *); static void *mactcp_get_private_ptr(Socket); static char *mactcp_socket_error(Socket); static void mactcp_set_frozen(Socket, intthe MacTCP INIT ensures that .IPP is already open (and hence * has a valid unit number already) so we don't need to go through * all that. (MacTCP Programmer's Guide p6)fprintf(stderr, "Resolving %s...\n", host);fprintf(stderr, "canonical name = %s\n"static Plug mactcp_plug(Socket sock, Plug p) { Actual_Socket s = (Actual_Socket) sock; Plug ret = s->plug; if (p) s->plug = p; return ret; } static void mactcp_flush(Socket s) { fatalbox("sk_tcp_flush" static struct socket_function_table fn_table = { mactcp_plug, mactcp_close, mactcp_write, mactcp_write_oob, mactcp_flush, mactcp_set_private_ptr, mactcp_get_private_ptr, mactcp_set_frozen, mactcp_socket_error }; TCPiopb pb; UDPiopb upb; Actual_Socket ret; ip_addr dstaddr; size_t buflen; fprintf(stderr, "Opening socket, port = %d\n", port); /* * Create Socket structure. */ ret = smalloc(sizeof(struct Socket_tag)); ret->s = 0; ret->fn = &fn_table; ret->err = noErr; ret->plug = plug; bufchain_init(&ret->output_data); ret->connected = 0; /* to start with */ ret->writable = 0; /* to start with */ ret->sending_oob = 0; ret->frozen = 0; ret->frozen_readable = 0; ret->localhost_only = 0; /* unused, but best init anyway */ ret->pending_error = 0; ret->oobpending = FALSE; ret->listener = 0; dstaddr = addr->hostinfo.addr[0]; /* XXX should try all of them */ /* * Create a TCP stream. * * MacTCP requires us to provide it with some buffer memory. Page * 31 of the Programmer's Guide says it should be a minimum of * 4*MTU+1024. Page 36 says a minimum of 4096 bytes. Assume * they're both correct. */ assert(addr->resolved); upb.ioCRefNum = mactcp.refnum; upb.csCode = UDPMaxMTUSize; upb.csParam.mtu.remoteHost = dstaddr; upb.csParam.mtu.userDataPtr = NULL; ret->err = PBControlSync((ParmBlkPtr)&upb); fprintf(stderr, "getting mtu, err = %d\n", ret->err); if (ret->err != noErr) return (Socket)ret; fprintf(stderr, "Got MTU = %d\n", upb.csParam.mtu.mtuSize); buflen = upb.csParam.mtu.mtuSize * 4 + 1024; if (buflen < 4096) buflen = 4096; pb.ioCRefNum = mactcp.refnum; pb.csCode = TCPCreate; pb.csParam.create.rcvBuff = smalloc(buflen); pb.csParam.create.rcvBuffLen = buflen; pb.csParam.create.notifyProc = NULL; pb.csParam.create.userDataPtr = (Ptr)ret; ret->err = PBControlSync((ParmBlkPtr)&pb); if (ret->err != noErr) return (Socket)ret; ret->s = pb.tcpStream; fprintf(stderr, "stream opened\n"); /* * Open the connection. */ pb.ioCRefNum = mactcp.refnum; pb.csCode = TCPActiveOpen; pb.tcpStream = ret->s; pb.csParam.open.validityFlags = 0; pb.csParam.open.remoteHost = dstaddr; pb.csParam.open.remotePort = port; pb.csParam.open.localPort = privport ? 1023 : 0; pb.csParam.open.dontFrag = FALSE; pb.csParam.open.timeToLive = 0; pb.csParam.open.security = 0; pb.csParam.open.optionCnt = 0; pb.csParam.open.userDataPtr = (Ptr)ret; while (1) { ret->err = PBControlSync((ParmBlkPtr)&pb); if (!privport || ret->err != duplicateSocket) break; pb.csParam.open.localPort--; if (pb.csParam.open.localPort == 0) break; } if (ret->err != noErr) return (Socket)ret; ret->connected = TRUE; ret->writable = TRUE; fprintf(stderr, "Socket connected\n"); return (Socket)ret; } static void mactcp_close(Socket sock) { Actual_Socket s = (Actual_Socket)sock; TCPiopb pb; /* * TCPClose is equivalent to shutdown(fd, SHUT_WR), and hence * leaves the Rx side open, while TCPAbort seems rather vicious, * throwing away Tx data that haven't been ACKed yet. We do both * in succession. */ pb.ioCRefNum = mactcp.refnum; pb.csCode = TCPClose; pb.tcpStream = s->s; pb.csParam.close.validityFlags = 0; pb.csParam.close.userDataPtr = (Ptr)s; s->err = PBControlSync((ParmBlkPtr)&pb); /* Not much we can do about an error anyway. */ pb.ioCRefNum = mactcp.refnum; pb.csCode = TCPAbort; pb.tcpStream = s->s; pb.csParam.abort.userDataPtr = (Ptr)s; s->err = PBControlSync((ParmBlkPtr)&pb); /* Even less we can do about an error here. */ pb.ioCRefNum = mactcp.refnum; pb.csCode = TCPRelease; pb.tcpStream = s->s; pb.csParam.create.userDataPtr = (Ptr)s; s->err = PBControlSync((ParmBlkPtr)&pb); if (s->err == noErr) sfree(pb.csParam.create.rcvBuff); sfree(s); } static int mactcp_write(Socket sock, char *buf, int len) { Actual_Socket s = (Actual_Socket) sock; wdsEntry wds[2]; TCPiopb pb; fprintf(stderr, "Write data, %d bytes\n", len); wds[0].length = len; wds[0].ptr = buf; wds[1].length = 0; pb.ioCRefNum = mactcp.refnum; pb.csCode = TCPSend; pb.tcpStream = s->s; pb.csParam.send.validityFlags = 0; pb.csParam.send.pushFlag = TRUE; /* XXX we want it to return. */ pb.csParam.send.urgentFlag = 0; pb.csParam.send.wdsPtr = (Ptr)wds; pb.csParam.send.userDataPtr = (Ptr)s; s->err = PBControlSync((ParmBlkPtr)&pb); return 0; } static int mactcp_write_oob(Socket sock, char *buf, int len) { fatalbox("mactcp_write_oob"); } /* * Each socket abstraction contains a `void *' private field in * which the client can keep state. */ static void mactcp_set_private_ptr(Socket sock, void *ptr) { Actual_Socket s = (Actual_Socket) sock; s->private_ptr = ptr; } static void *mactcp_get_private_ptr(Socket sock) { Actual_Socket s = (Actual_Socket) sock; return s->private_ptrstatic char *mactcp_socket_error(Socket sock) { static char buf[64]; Actual_Socket s = (Actual_Socket) sock; switch (s->err) { case noErr: return NULL; case insufficientResources: return "Insufficient resources to open TCP stream"; case duplicateSocket: return "Duplicate socket"; case openFailed: return "Connection failed while opening"; default: sprintf(buf, "Unknown MacTCP error %d", s->err); return buf; } } static void mactcp_set_frozen(Socket sock, int is_frozen) { fatalbox("mactcp_set_frozen"); }Sync(&pb Revision-number: 2457 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2003-01-05T11:31:51.000000Z K 7 svn:log V 130 When looking for the correct backend to use, look in the configuration structure for the session, not the almost-dead global cfg. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 512463079a48293525783f5928bdee67 Text-delta-base-sha1: 709dfb6b342ffe4c76c109c0702e1f18218d2893 Text-content-length: 72 Text-content-md5: 34371096ead267f98e2142580033cf82 Text-content-sha1: 19d789258bf8bc5cf9407276a590ded5f626e407 Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN /,Z:/* $Id: macterm.c,v 1.35 2003/01/05 11:31:51s-> Revision-number: 2458 Prop-content-length: 335 Content-length: 335 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-05T12:53:38.000000Z K 7 svn:log V 236 Add reception support for MacTCP. Now I can log in over TELNET, just about. There are still lots of things to fix, like urgent data or the fact that everything seems to happen one keypress too late, but this is an important milestone. PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 064c839ed00dc7abd3af308e87cc2caa Text-delta-base-sha1: 00502369bba28aabe3885e835441d9b3472eba09 Text-content-length: 79 Text-content-md5: cef45128204727f33c7c9911e63d83e0 Text-content-sha1: 94b5e00657f104c365d71d65f35994ce43c101c0 Content-length: 118 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN]q 92)W$Id: README.mac,v 1.8 2003/01/05 12:53:38TCP urgent data. Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c4320ca373112de51912161e62d57240 Text-delta-base-sha1: b09de01737d5a34de4d9a099f2296cca5e589daa Text-content-length: 75 Text-content-md5: 1313d1a56846886a2b8d32bc7f6a6e52 Text-content-sha1: d479898305a868624e1bd350bc06afb59fdccfe5 Content-length: 115 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN2B 5@(Me/* $Id: mac.c,v 1.19 2003/01/05 12:53:38 mactcp_poll( Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dce8a8ad944f42ceefd04a1d3c55d251 Text-delta-base-sha1: ef9a6ea24da6b799853fde1fea0381c097d885be Text-content-length: 43 Text-content-md5: 46eb8f68d559445b75e2462c0475fd2f Text-content-sha1: 792c798f0d74344fbe1c77e8f7d7d0ff7af7d8d3 Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNt /M'extern void mactcp_poll Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9d6855977259d579140e93b401a3f7e1 Text-delta-base-sha1: be090697e364374b5449407553f4a2621bc5c282 Text-content-length: 2148 Text-content-md5: e98524d202653e52f3cc7fc632ecadbe Text-content-sha1: b5f5bf88db9ee0deac85f82adcdfc34b43055a0b Content-length: 2187 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN?N? =[YsfHOP4v>s#3! f"o=Idefine DEFINE_PLUG_METHOD_MACROS struct Socket_tag *next; struct Socket_tag **prev Actual_Socket sockliststatic void mactcp_recv(Actual_Socket s, size_t lenif (addr->resolved) { /* XXX only return first address */ err = AddrToStr(addr->hostinfo.addr[0], mybuf); buf[0] = '\0'; if (err != noErr) strncat(buf, mybuf, buflen - 1); } else { buf[0] = '\0'; strncat(buf, addr->hostname, buflen - 1); }inline = oobinline/* Add this to the list of all sockets */ ret->next = mactcp.socklist; ret->prev = &mactcp.socklist; mactcp.socklist = ret /* Unhitch from list of sockets */ *s->prev = s->next; if (s->next != NULL) s->next->prev = s->prev; Called from our event loop if there's work to do. */ void mactcp_poll(void) { Actual_Socket s; TCPiopb pb; for (s = mactcp.socklist; s != NULL; s = s->next) { /* XXX above can't handle sockets being deleted. */ pb.ioCRefNum = mactcp.refnum; pb.csCode = TCPStatus; pb.tcpStream = s->s; pb.csParam.status.userDataPtr = (Ptr)s; s->err = PBControlSync((ParmBlkPtr)&pb); if (s->err != noErr) continue; if (pb.csParam.status.amtUnreadData > 0) mactcp_recv(s, pb.csParam.status.amtUnreadData); /* Should check connectionState in case remote has closed */ } } static void mactcp_recv(Actual_Socket s, size_t len) { rdsEntry rds[2]; TCPiopb pb; if (s->frozen) return; while (len > 0) { pb.ioCRefNum = mactcp.refnum; pb.csCode = TCPNoCopyRcv; pb.tcpStream = s->s; pb.csParam.receive.commandTimeoutValue = 0; pb.csParam.receive.rdsPtr = (Ptr)rds; pb.csParam.receive.rdsLength = lenof(rds) - 1; pb.csParam.receive.userDataPtr = (Ptr)s; s->err = PBControlSync((ParmBlkPtr)&pb); if (s->err != noErr) return; plug_receive(s->plug, 0, rds[0].ptr, rds[0].length); len -= rds[0].length; pb.csCode = TCPRcvBfrReturn; s->err = PBControlSync((ParmBlkPtr)&pb); if (s->err != noErr) return; } Actual_Socket s = (Actual_Socket) sock; if (s->frozen == is_frozen) return; s->frozen = is_frozen Revision-number: 2459 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2003-01-05T13:04:04.000000Z K 7 svn:log V 52 Fix more "possible unintended assignment" warnings. K 10 svn:author V 3 ben PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e4383dddcbdb1a380121c9542cb6f2f3 Text-delta-base-sha1: f7fca172c0dc7648baa735a1e9c64ce9c6e13944 Text-content-length: 89 Text-content-md5: e0ad84d0f9c26f6d3f5c0acfe6f621f5 Text-content-sha1: d94cee00d90ed438ca4bc306c2bacb3c887692c1 Content-length: 129 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN#!- a}{$d != NULL) return err != NULL != NULL != NULL Revision-number: 2460 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2003-01-05T13:43:02.000000Z K 7 svn:log V 213 Attack char * vs unsigned char * conversions. In most cases, I've just gone for replacing the implicit casts with explicit ones. Where there was something obviously better that I could do, I've done it, though. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2b9d478936f130199ab673b891cd3b17 Text-delta-base-sha1: 2252139a272c286672ea3a667a081b56619e97de Text-content-length: 1083 Text-content-md5: ecd74b03d46f762757ef3d5183970d68 Text-content-sha1: 1a7301e6c18c818bbc6377f2598c0097ea2550ef Content-length: 1124 K 15 cvs2svn:cvs-rev V 5 1.253 PROPS-END SVN fQ`P-0]E^D" fb0hSD(2Z+v}!oG{KB1 +>x+unsigned(char *)(char *)(char *)unsigned(char *)(char *)(char *)ssh->deferred_send_data, (char *)(unsigned char *)(char *)(char *)(char *)newlen, 1); /* dmemdump(newlen, 1); */ } ssh2_pkt_addstring_data(ssh, (char *)(sigblob+pos)(char *)(unsigned char *)(char *)(char *)(ssh->pktin.body) (h = host, p = (char *)(ssh->pktin.body+8); ?-\QTU3a%`M.h3C9X71qqteGl 3ON) { /* Remote side closes a channel. */ unsigned i = GET_32BIT(ssh->pktin.bodyc && ((int)c->remoteid) != -(char *)p, len); break; case CHAN_SOCKDATA: bufsize = pfd_send(c->u.pfd.s, (char *)unsigned char *H, unsigned char *sessid, char chr, unsigned(char *)(char *)(char *) (unsigned char *)ssh2_userkey_loadpub(cfg.keyfile, &algorithm, (char *)pub_blob, (char *)(char *)(char *)(unsigned char *) Revision-number: 2461 Prop-content-length: 151 Content-length: 151 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-05T13:46:13.000000Z K 7 svn:log V 53 Deal with "possible unintended assignment" warnings. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ecd74b03d46f762757ef3d5183970d68 Text-delta-base-sha1: 1a7301e6c18c818bbc6377f2598c0097ea2550ef Text-content-length: 82 Text-content-md5: b56325883d54c2c469ce12141015956a Text-content-sha1: 3b494ce9cd403cecc79baf50a0f8e5a1fe92531d Content-length: 123 K 15 cvs2svn:cvs-rev V 5 1.254 PROPS-END SVN?^ != NULL != NULL-=-CLOSE_CONFIRMATI Revision-number: 2462 Prop-content-length: 394 Content-length: 394 K 7 svn:log V 295 SC (Apple's 68K C compiler) seems to treat tentative definitions of complete arrya as full definitions, and hence gets upset when it finds a full definition later. This is a bug (see K&R2 A10.2), but an easy one to work around by making the tentative definitions incomplete, so I've done that. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-05T13:57:09.000000Z PROPS-END Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6cd47d3e2c3cc2a895483ac5f59e92ce Text-delta-base-sha1: 8c8bcc8c2c19168c5e003209e67562a0695a87a0 Text-content-length: 124 Text-content-md5: 64ad45f91f1a55ce4f21c06f1fb32d75 Text-content-sha1: fa5edac209469b8c781ca2ce6bf1838f8b956844 Content-length: 163 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN: cc5], Sboxinv[]; static const word32 E0[], E1[], E2[], E3[]; static const word32 D0[], D1[], D2[], D3[ Revision-number: 2463 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2003-01-05T14:00:16.000000Z K 7 svn:log V 68 Replace implict char-*-to-unsigned-char-* casts with explicit ones. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bea9c9a8014138ce6eea68d309f6f7ef Text-delta-base-sha1: d02a4732c10822bde54dad4f6b9f895f36f93d81 Text-content-length: 226 Text-content-md5: 7a14dc32244524af5be09085b8beb0e2 Text-content-sha1: 87899808aa778b1ca9f04654291ef48248386203 Content-length: 266 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN$h<G?4S(unsigned char *)p, length); return b; } static Bignum get160(char **data, int *datalen) { Bignum b; b = bignum_from_bytes((unsigned char *)(unsigned char *)(unsigned char *) Revision-number: 2464 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2003-01-05T14:11:14.000000Z K 7 svn:log V 88 Fix more unsigned char * vs char * warnings, usually by making implicit casts explicit. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 216a19931ee47eac4d53e21ba9bf6dd4 Text-delta-base-sha1: 8d038175b177a408843cb0327537f6b488a55b87 Text-content-length: 144 Text-content-md5: 248e06a38a5e7798c582943b8b919f16 Text-content-sha1: a7a93830e6a1f9be16a079a3004224eb3460b25c Content-length: 184 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNb=FW WZj/jb|}gndQU: FS(unsigned char *)(unsigned char *)unsigned(char *)public_blobunsigned Revision-number: 2465 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 70 Eliminate more unsigned char * vs char * errors using explicit casts. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-05T14:14:51.000000Z PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2a3c98a3e96632252ab1be0fdf42913e Text-delta-base-sha1: 36328cf79e9d53ba25c2dcb01c713b81a33507a7 Text-content-length: 63 Text-content-md5: b1a4eacc22b0c279050acfc56d5baa12 Text-content-sha1: 119ac53ff58fc7747c338c666a40ed0949cd538a Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN'I"d#d (unsigned char *)(unsigned char *) Revision-number: 2466 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2003-01-05T14:18:00.000000Z K 7 svn:log V 54 Commas at the end of enumerator lists aren't allowed. K 10 svn:author V 3 ben PROPS-END Node-path: putty/wildcard.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ee41906445eb3bcad877b793110a4216 Text-delta-base-sha1: b6acfeb918e70f1677923e24551bb99b1fb29d03 Text-content-length: 20 Text-content-md5: 3b679967e33406e704c67f64eb1b880c Text-content-sha1: b1699a6fb9016f2203745817b4f7cfa7e6ae8c93 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN z Revision-number: 2467 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2003-01-05T14:20:49.000000Z K 7 svn:log V 46 char * vs unsigned char * (by explicit cast). K 10 svn:author V 3 ben PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3f8a9e76951ce5138a6d3a0bc397225 Text-delta-base-sha1: 0c2ca69b7e0f43a117d715750b599fbaa95808e0 Text-content-length: 58 Text-content-md5: 26ec3d7486bdcb31b4fd9fa771343d48 Text-content-sha1: 5180c15ebbadde5ce3f00f689630ca7742cd82f5 Content-length: 98 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNUUXkunsigned (char *)(char *) Revision-number: 2468 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 48 "possible unintended assignment"? I think not. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-05T14:23:30.000000Z PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 26ec3d7486bdcb31b4fd9fa771343d48 Text-delta-base-sha1: 5180c15ebbadde5ce3f00f689630ca7742cd82f5 Text-content-length: 43 Text-content-md5: f4e71bb1266bd542d8a3ba289521280b Text-content-sha1: b13eadd38cba29d7035b3bf6c7500799c9fb830c Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN*;R; != NULL != NULL Revision-number: 2469 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2003-01-05T15:29:22.000000Z K 7 svn:log V 77 Make MD5_Core_Init and MD5_Block (both only referenced in this file) static. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 98ec91035b31c7bd956472946233eb97 Text-delta-base-sha1: 1bf6b77a5165e749e7f68e33fe7a55be312331ec Text-content-length: 41 Text-content-md5: 29b0896da8049dc8b57ebbc09d940a72 Text-content-sha1: 65b1fa6211e08c4bb720ce8c6c98739531440915 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN+9OOHcstatic static Revision-number: 2470 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2003-01-05T15:31:09.000000Z K 7 svn:log V 54 Make SHA_Core_Init() (only used in this file) static. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1b7de625ac808c4ece74fc89d55f6da0 Text-delta-base-sha1: 7b6a49551c640fc48698c88d52c2d1968e221e19 Text-content-length: 28 Text-content-md5: 9d119beaeb44c1311fc3f00695d8b69b Text-content-sha1: 0251d423ef390c9ea279991b7a453f2c285395dd Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN/6 <s People occasionally ask us for project/workspace (.DSP/.DSW) files to compile PuTTY with Visual C++, or offer to contribute them.

    All of our Makefiles are derived from a single upstream source (Recipe) by a script (mkfiles.pl), so that we don't have to maintain N slightly different Makefiles. Therefore, any contribution would have to take the form of an update to mkfiles.pl and/or Recipe. We won't be able to make use of a .DSP/.DSW file per se, because that brings with it precisely the maintenance burden we're trying to avoid.

    Also, we already supply a Visual C Makefile (Makefile.vc), for use with nmake. We're unlikely to add .DSP/.DSW support ourselves because we don't have much use for it. Revision-number: 2473 Prop-content-length: 194 Content-length: 194 K 8 svn:date V 27 2003-01-05T22:52:11.000000Z K 7 svn:log V 96 SC in "finding an actual bug" shocker! Set the port number before passing it to name_lookup(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f4e71bb1266bd542d8a3ba289521280b Text-delta-base-sha1: b13eadd38cba29d7035b3bf6c7500799c9fb830c Text-content-length: 51 Text-content-md5: 0271de8cef094c5641f947222ae233a4 Text-content-sha1: 4e8ba5f2c5afb12ebb35a9583e36f6810d91e8e5 Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN**?94vport = 6000 + displaynum; Revision-number: 2474 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2003-01-05T22:53:23.000000Z K 7 svn:log V 119 Move x11fwd and portfwd prototypes from ssh.c into ssh.h so they can be seen by (and checked against) the definitions. K 10 svn:author V 3 ben PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e0ad84d0f9c26f6d3f5c0acfe6f621f5 Text-delta-base-sha1: d94cee00d90ed438ca4bc306c2bacb3c887692c1 Text-content-length: 20 Text-content-md5: 803c5a240cc7165546ba5f1a173844e9 Text-content-sha1: 8b1e33cab1e3108b8624ebc9bf90c34f2908e3ae Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN# t Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b56325883d54c2c469ce12141015956a Text-delta-base-sha1: 3b494ce9cd403cecc79baf50a0f8e5a1fe92531d Text-content-length: 776 Text-content-md5: ea3a57b3700875c5bdec0538a68f351e Text-content-sha1: 5ec2a7c1e35fe5b401879887e8fbfc54725761f3 Content-length: 817 K 15 cvs2svn:cvs-rev V 5 1.255 PROPS-END SVN \~&Z\CLOSE_CONFIRMATION) { /* Remote side closes a channel. */ unsigned i = GET_32BIT(ssh->pktin.body); struct ssh_channel *c; c = find234(ssh->channels, &i, ssh_channelfind); if (c && ((int)c->remoteid) != -1) { int closetype; closetype = (ssh->pktin.type == SSH1_MSG_CHANNEL_CLOSE ? 1 : 2); if ((c->closes == 0) && (c->type == CHAN_X11)) { logevent("Forwarded X11 connection terminated"); assert(c->u.x11.s != NULL); x11_close(c->u.x11.s); c->u.x11.s = NULL; } if ((c->closes == 0) && (c->type == CHAN_SOCKDATA)) { logevent("Forwarded port closed"); assert(c->u.pfd.s != NULL); pfd_close(c->u.pfd.s); c->u.pfd.s = NULL; } c->closes |= (closetype << 2); =aa\ Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 38dec2b8189a1238aea2683422661631 Text-delta-base-sha1: a3370467c3dec8d86b92d3e552d53305fc021a2e Text-content-length: 809 Text-content-md5: e840dccd6d8f6da1a871a01631b73603 Text-content-sha1: d5ea46994803821d8f3130486c7cf68b34b40f67 Content-length: 849 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN`u ,8(/* Exports from portfwd.c */ extern char *pfd_newconnect(Socket * s, char *hostname, int port, void *c); extern char *pfd_addforward(char *desthost, int destport, char *srcaddr, int port, void *backhandle); extern void pfd_close(Socket s); extern int pfd_send(Socket s, char *data, int len); extern void pfd_confirm(Socket s); extern void pfd_unthrottle(Socket s); extern void pfd_override_throttle(Socket s, int enable); /* Exports from x11fwd.c */ extern char *x11_init(Socket *, char *, void *, void *); extern void x11_close(Socket); extern int x11_send(Socket, char *, int); extern void *x11_invent_auth(char *, int, char *, int); extern void x11_unthrottle(Socket s); extern void x11_override_throttle(Socket s, int enable); extern int x11_get_screen_number(char *display Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0271de8cef094c5641f947222ae233a4 Text-delta-base-sha1: 4e8ba5f2c5afb12ebb35a9583e36f6810d91e8e5 Text-content-length: 20 Text-content-md5: bb235e6cb1909638e9d6cd9175322b15 Text-content-sha1: d468757490ff566bf8d0fe597f1d14cf201e8ca3 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN*  Revision-number: 2475 Prop-content-length: 276 Content-length: 276 K 8 svn:date V 27 2003-01-05T23:01:43.000000Z K 7 svn:log V 177 Make ssh1_pkt_type(), ssh2_pkt_type, logeventf(), setup_userpass_input(), process_userpass_input(), and ssh_unthrottle() static, since they're not referenced outside this file. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ea3a57b3700875c5bdec0538a68f351e Text-delta-base-sha1: 5ec2a7c1e35fe5b401879887e8fbfc54725761f3 Text-content-length: 153 Text-content-md5: 1e33ee5177e67e57119d54820935ff74 Text-content-sha1: 5063b16830efd83a2be3bdc0d491375cff4e8a15 Content-length: 194 K 15 cvs2svn:cvs-rev V 5 1.256 PROPS-END SVN'#llJNgR$9static static static static static a * V c->closes |= (closetype << 2); static Revision-number: 2476 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2003-01-05T23:03:02.000000Z K 7 svn:log V 58 aes_setup() is unused outside this file. Make it static. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 64ad45f91f1a55ce4f21c06f1fb32d75 Text-delta-base-sha1: fa5edac209469b8c781ca2ce6bf1838f8b956844 Text-content-length: 32 Text-content-md5: c351570b1838e23e90cfc1de632c19d8 Text-content-sha1: 665a7ad28ec324a05e0f0abd4c5b58d5c8b90ded Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN# static Revision-number: 2477 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2003-01-05T23:05:49.000000Z K 7 svn:log V 103 bigdivmod() is unreferenced outside this file. Make it static. diagbn() is unreferenced. #if it out. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aa5ca278eadf150c4ff865f20d46251f Text-delta-base-sha1: 6b4dcf503a8a40162cd6f90ec0ba042e6cac826f Text-content-length: 55 Text-content-md5: d8c0f1e93274cd55fa04bd59e437a0f3 Text-content-sha1: 74717fadbf3b39bd9f1a5b35c0ada949c0265684 Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN%9ssu#static #if 0#endif Revision-number: 2478 Prop-content-length: 159 Content-length: 159 K 7 svn:log V 61 Include ssh.h for the crc32() and crc32_update() prototypes. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-05T23:09:53.000000Z PROPS-END Node-path: putty/sshcrc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eee7ecb9dac69e2bfbd13bc8decc4edf Text-delta-base-sha1: 60fb6ea4490b823ab80526e454c3250142a31c7a Text-content-length: 37 Text-content-md5: 20a62e7d388909f6141c6a0df5d064a1 Text-content-sha1: 4dfd9b4fcfec1719c5250bfe85d80c0e83ba2e37 Content-length: 76 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN! 'j%#include "ssh.c" Revision-number: 2479 Prop-content-length: 206 Content-length: 206 K 8 svn:date V 27 2003-01-05T23:12:58.000000Z K 7 svn:log V 107 des_key_setup(), des_encipher(), and des_decipher() are unreferenced outside this file. Make them static. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1709a6546c0687fc53b9302cddd0d0ed Text-delta-base-sha1: f1526979166a2c60e31c16de75779cf300ce6570 Text-content-length: 183 Text-content-md5: ac6e175e8bc860027ced2e1f68325fee Text-content-sha1: 10a28096d43c0d154d397233823b3dbb9dfb8108 Content-length: 223 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNEb 3 3AtA tzKstatic static void des_encipher(word32 * output, word32 L, word32 R, static void des_decipher(word32 * output, word32 L, word32 R, Revision-number: 2480 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2003-01-05T23:14:04.000000Z K 7 svn:log V 57 dss_sign() is unused outside this file. Make it static. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7a14dc32244524af5be09085b8beb0e2 Text-delta-base-sha1: 87899808aa778b1ca9f04654291ef48248386203 Text-content-length: 30 Text-content-md5: 3e2da117b8eb249aa7589f24a1d9fec8 Text-content-sha1: 84c4b9aef76104f8a0c7df4053cd07a49e14482f Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNho Ostatic Revision-number: 2481 Prop-content-length: 360 Content-length: 360 K 8 svn:date V 27 2003-01-05T23:28:02.000000Z K 7 svn:log V 261 Move prototypes for base64_decode_atom(), base64_lines(), and base64_encode() from import.c to ssh.h, so that the implementation can see them. This necessitates ssh.h's including . Also remove a spare prototype for base64_encode_atom() from import.c. K 10 svn:author V 3 ben PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6e052018e185130441b4b3b9651cffda Text-delta-base-sha1: 0a4eeab4460a192789d0027dfe2734e73a25590e Text-content-length: 23 Text-content-md5: c1d135665099f26f5096c13ab94b24a5 Text-content-sha1: cf7bd41012d871f398eeed01be6d5fe21779f28b Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN  Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e840dccd6d8f6da1a871a01631b73603 Text-delta-base-sha1: d5ea46994803821d8f3130486c7cf68b34b40f67 Text-content-length: 293 Text-content-md5: f94a9562e10d8ff2fe428edc0a668ee9 Text-content-sha1: 76283c53993fab3a8cc4a6e90df1bb59a58a2a67 Content-length: 333 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVNuD >yz{#include extern int base64_decode_atom(char *atom, unsigned char *out); extern int base64_lines(int datalen); extern void base64_encode_atom(unsigned char *data, int n, char *out); extern void base64_encode(FILE *fp, unsigned char *data, int datalen, int cpl Revision-number: 2482 Prop-content-length: 238 Content-length: 238 K 8 svn:date V 27 2003-01-05T23:30:48.000000Z K 7 svn:log V 139 random_stir() is unused outside this file. Make it static. Include putty.h to get prototypes for random_init() and random_get_savedata(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 56f6fd8187500faf57c67c35d928ae5f Text-delta-base-sha1: 2a3ff311968c20cf1b0e702784d01ad417dff200 Text-content-length: 40 Text-content-md5: cfee1e94f7d2a3a43f089b984610f189 Text-content-sha1: 4b0b7bc073f2437180367906fed4b1782b4d12b5 Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNF`R%GZlputty.h"static Revision-number: 2483 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2003-01-05T23:32:19.000000Z K 7 svn:log V 58 rsa2_sign() is unused outside this file. Make it static. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b1a4eacc22b0c279050acfc56d5baa12 Text-delta-base-sha1: 119ac53ff58fc7747c338c666a40ed0949cd538a Text-content-length: 96 Text-content-md5: 7487234d79ab4815c1eab4586bfcc26c Text-content-sha1: b2f3e083b8fc2e3c73b7855e8b9ebfd8ee901f9c Content-length: 136 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNIT HSH9static unsigned char *rsa2_sign(void *key, char *data, int datalen, Revision-number: 2484 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2003-01-05T23:34:00.000000Z K 7 svn:log V 87 SHA512_Core_Init() and SHA512_Block() are unused outside this file. Make them static. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshsh512.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f1e1b3e51a43798913a6558e49ea423 Text-delta-base-sha1: b407f5ac7600c63b192bdcb0e7a32b09e8a8f4c2 Text-content-length: 41 Text-content-md5: b73c7bd1d25d3e2428b8aaa60d1fdfea Text-content-sha1: 01397b55528c595f0ace03e34cd8ab5dcf3cfcbc Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN ttystatic static Revision-number: 2485 Prop-content-length: 194 Content-length: 194 K 8 svn:date V 27 2003-01-05T23:36:53.000000Z K 7 svn:log V 96 zlib_disable_compression() and zlib_huflookup() are unused outside this file. Make them static. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 85d8b408f826b04f6b855746597ac9f0 Text-delta-base-sha1: f48ec442ed800fbd7e0143c336958f5115557a50 Text-content-length: 46 Text-content-md5: 8114be900e1915f962b5994e44a56db4 Text-content-sha1: ff9d97cc1231a5bdad78e0d78c1cc7ffe80b47ae Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN+1n1~static static Revision-number: 2486 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2003-01-05T23:38:11.000000Z K 7 svn:log V 58 Include putty.h to get prototypes for exported functions. K 10 svn:author V 3 ben PROPS-END Node-path: putty/wildcard.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3b679967e33406e704c67f64eb1b880c Text-delta-base-sha1: b1699a6fb9016f2203745817b4f7cfa7e6ae8c93 Text-content-length: 39 Text-content-md5: e7b2c3afeb1130e2441cb707edd775fa Text-content-sha1: e9866aead3193b9299c4de852d538298977f5f80 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN #include "putty.h" Revision-number: 2487 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2003-01-05T23:48:10.000000Z K 7 svn:log V 98 One usually includes .h files, not .c files. That explains why it was taking so long to compile! K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshcrc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 20a62e7d388909f6141c6a0df5d064a1 Text-delta-base-sha1: 4dfd9b4fcfec1719c5250bfe85d80c0e83ba2e37 Text-content-length: 32 Text-content-md5: 2ef783aa7df0d870ad628c9dccc723d6 Text-content-sha1: bc892f655c3649a46704035099d2d67ca4b0a7e9 Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN!!5B@#~h" /* Revision-number: 2488 Prop-content-length: 337 Content-length: 337 K 8 svn:date V 27 2003-01-06T21:46:56.000000Z K 7 svn:log V 238 It looks like Visual C (or whatever the Windows snapshots are built with) objects to incomplete static array declarations, which I introduced to work around a bug in SC/MrC. Use #ifdefs to decide whether to enable the workaround or not. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c351570b1838e23e90cfc1de632c19d8 Text-delta-base-sha1: 665a7ad28ec324a05e0f0abd4c5b58d5c8b90ded Text-content-length: 543 Text-content-md5: af7ab304c61af74102b2dec7522d3c91 Text-content-sha1: a77cd4084ea5fcb327751fb5514bd013e48fcd49 Content-length: 583 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN#!|dLc0:i/* * Apple's SC 8.8.4f1 and MrC 4.1.0f1c1 refuse to handle these if * they've got dimensions (they claim "already defined" when the * arrays are actually defined). Microsoft Visual C refuses to handle * them without ("unknown size"). Bah. * * K&R2 A10.2 says both are OK, of course. */ #if defined __SC__ || defined __MRC__#else static const unsigned char Sbox[256], Sboxinv[256]; static const word32 E0[256], E1[256], E2[256], E3[256]; static const word32 D0[256], D1[256], D2[256], D3[256]; #endif Revision-number: 2489 Prop-content-length: 274 Content-length: 274 K 8 svn:date V 27 2003-01-06T22:24:05.000000Z K 7 svn:log V 173 Summary: Failed assertion in sshcrcda.c File: sshcrcda.c Line: 98 Expression: !(len > (SSH_MAXBLOCKS * SSH_BLOCKSIZE) || len % SSH_BLOCKSIZE != 0) No attempt to classify. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sshcrcda-assertion-failed Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 774 Text-content-md5: dc262ea6e9330835d68d50289a12f5b3 Text-content-sha1: 41be312a94a98446516d926d617a34043341f4cf Content-length: 890 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNxxxSummary: Failed assertion in sshcrcda.c Present-in: 0.52 0.53 0.53b Content-type: text/x-html-body

    From comp.security.ssh:

    I was running putty.exe version 52 and then I tried version 53 using a
    local L119 to news.host.com:119 tunnel to pull news across with Forte
    Agent.  I ended up getting this assert from putty.exe (this is version
    53):
    
    Microsoft Visual C++ Runtime Library
    ========================================
    Assertion failed!
    
    Program: ...Users\Documents\Downloads\SSH\Putty\putty.exe
    File: sshcrcda.c
    Line: 98
    
    Expression: !(len > (SSH_MAXBLOCKS * SSH_BLOCKSIZE) || len % SSH_BLOCKSIZE != 0)
    
    Just thought I'd let you know.
    Revision-number: 2490 Prop-content-length: 281 Content-length: 281 K 8 svn:date V 27 2003-01-07T13:09:56.000000Z K 7 svn:log V 180 Ahem. Now pterm actually uses wc_to_mb in a situation where it needs to pass in a default character, it would help if wc_to_mb actually _honoured_ the default-character parameter. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2ac32eb3a427c0d5b2b2e242b27df2fd Text-delta-base-sha1: 92a8757b0c812eefc7d8ea3ffe7ef2d7a1a8ba80 Text-content-length: 50 Text-content-md5: c25af28bf5cc4d3fbb5f3ac023807c29 Text-content-sha1: 697198e769b1905e7fbf1eeba4f00099a9120ac5 Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN $ :M@defchr?defchr:NULL, defchr?1: Revision-number: 2491 Prop-content-length: 210 Content-length: 210 K 8 svn:date V 27 2003-01-07T20:47:53.000000Z K 7 svn:log V 111 Move the various big tables to the start of the file to save mucking about with ifdefs for specific compilers. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: af7ab304c61af74102b2dec7522d3c91 Text-delta-base-sha1: a77cd4084ea5fcb327751fb5514bd013e48fcd49 Text-content-length: 34 Text-content-md5: 190caf002b56a5166a472c2670ce6f5e Text-content-sha1: 89b9946ee0e8bfdaa2b476da0a723032192352c5 Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN!dzy o5l Revision-number: 2492 Prop-content-length: 249 Content-length: 249 K 8 svn:date V 27 2003-01-07T22:45:12.000000Z K 7 svn:log V 150 Initialise the "protocol" field of a new ssh_tag to NULL so Bad Things don't happen if we try to type things before the SSH banner has been received. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1e33ee5177e67e57119d54820935ff74 Text-delta-base-sha1: 5063b16830efd83a2be3bdc0d491375cff4e8a15 Text-content-length: 61 Text-content-md5: 045a9fcd377f063aa170c2ff0670a999 Text-content-sha1: 8f818c8c3ecce729a181890ea24109a018008555 Content-length: 102 K 15 cvs2svn:cvs-rev V 5 1.257 PROPS-END SVN &  ssh->protocol = NULL Revision-number: 2493 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2003-01-07T23:05:12.000000Z K 7 svn:log V 104 Use '\012' as the end of the SSH banner line, not '\n'. Mac compilers default to making '\n' == '\015'. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 045a9fcd377f063aa170c2ff0670a999 Text-delta-base-sha1: 8f818c8c3ecce729a181890ea24109a018008555 Text-content-length: 72 Text-content-md5: 76d33a073d0dc06ff689b6ac0204092e Text-content-sha1: 90fdc019b70756afd09043d4b82ba6eb8aefafaf Content-length: 113 K 15 cvs2svn:cvs-rev V 5 1.258 PROPS-END SVN qOr@Bw012012012&,&} Revision-number: 2494 Prop-content-length: 364 Content-length: 364 K 7 svn:log V 263 We just got mailed a Dr Watson log which suggests I failed to initialise term->paste_len during initialisation, and indeed looking at the code confirms this. I'm puzzled as to why valgrind didn't spot this in pterm, though, since it's all in cross-platform code! K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-08T09:15:56.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ce4606c28c9807edc6b8cf0353ae81e0 Text-delta-base-sha1: 3bea05c50fd04d902bef9295959be2ba0365c593 Text-content-length: 76 Text-content-md5: 67770b51ac47e7404630edf0b9ccda35 Text-content-sha1: f3a745bff09637d19ce32887076cacc32518c7fa Content-length: 117 K 15 cvs2svn:cvs-rev V 5 1.127 PROPS-END SVN qepaste_len = 0@Y@ /* * In this mode, ev Revision-number: 2495 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2003-01-08T12:09:25.000000Z K 7 svn:log V 48 PuTTY should try multiple addresses for a host. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/multiple-addresses Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 585 Text-content-md5: 8d84c717a6e44f1025e1df1bcb5ede11 Text-content-sha1: e820f592a75ca75eb6006e7b5ba75d8719b56251 Content-length: 701 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN;;;Summary: PuTTY mishandles machines with multiple addresses Class: bug Priority: medium Difficulty: tricky Content-type: text/x-html-body

    At present, if a host has multiple addresses, PuTTY merely connects to the first one it gets. This is arguably incorrect behaviour, and PuTTY should try each address in turn until it gets one that works. My feeling is that a Socket_Addr should be able to contain multiple addresses, and sk_new should handle the retries, but I haven't thought out how proxying would work.

    Ref: <3E1AE612.6060308@magdalen.oxford.ac.uk> Revision-number: 2496 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2003-01-08T13:23:47.000000Z K 7 svn:log V 56 Initial checkin to bring the PuTTY web pages under CVS. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website Node-kind: dir Node-action: add Prop-content-length: 40 Content-length: 40 K 10 svn:ignore V 9 old*.html PROPS-END Node-path: putty-website/.cvsignore Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 20 Text-content-md5: 8a619fb646c5b2a593f485efa1bd8847 Text-content-sha1: 44fd870555116350acb56ed3f1a5d0ac855703bc Content-length: 136 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN  old*.html Node-path: putty-website/.htaccess Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2581 Text-content-md5: 87c9d7a52d842aceb865d0b380d31258 Text-content-sha1: 498348099c54a26f36daa50a8669248b65f103e6 Content-length: 2697 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNRedirect permanent /~sgtatham/putty/latest/putty.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/x86/putty.exe Redirect permanent /~sgtatham/putty/latest/puttytel.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/x86/puttytel.exe Redirect permanent /~sgtatham/putty/latest/psftp.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/x86/psftp.exe Redirect permanent /~sgtatham/putty/latest/plink.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/x86/plink.exe Redirect permanent /~sgtatham/putty/latest/pscp.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/x86/pscp.exe Redirect permanent /~sgtatham/putty/latest/pageant.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/x86/pageant.exe Redirect permanent /~sgtatham/putty/latest/puttygen.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/x86/puttygen.exe Redirect permanent /~sgtatham/putty/latest/putty-alpha.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/alpha/putty.exe Redirect permanent /~sgtatham/putty/latest/puttytel-alpha.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/alpha/puttytel.exe Redirect permanent /~sgtatham/putty/latest/psftp-alpha.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/alpha/psftp.exe Redirect permanent /~sgtatham/putty/latest/plink-alpha.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/alpha/plink.exe Redirect permanent /~sgtatham/putty/latest/pscp-alpha.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/alpha/pscp.exe Redirect permanent /~sgtatham/putty/latest/pageant-alpha.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/alpha/pageant.exe Redirect permanent /~sgtatham/putty/latest/puttygen-alpha.exe http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/alpha/puttygen.exe Redirect permanent /~sgtatham/putty/latest/putty.zip http://www.chiark.greenend.org.uk/~sgtatham/putty/latest/putty-src.zip Redirect permanent /~sgtatham/putty/latest/ http://the.earth.li/~sgtatham/putty/latest/ Redirect temp /~sgtatham/putty/0.52/ http://the.earth.li/~sgtatham/putty/0.52/ Redirect temp /~sgtatham/putty/0.53/ http://the.earth.li/~sgtatham/putty/0.53/ Redirect temp /~sgtatham/putty/0.53b/ http://the.earth.li/~sgtatham/putty/0.53b/ Redirect permanent /~sgtatham/putty/bugs.html http://www.chiark.greenend.org.uk/~sgtatham/putty/feedback.html Redirect permanent /~sgtatham/putty/wishlist.html http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/ AddType application/octet-stream .hlp AddType application/octet-stream .cnt Node-path: putty-website/changes.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 31711 Text-content-md5: e376251cda15b927e20de96549cdb667 Text-content-sha1: b8281f955efcfc7dc0f2209b2f21a09aa8008a67 Content-length: 31827 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNNNN PuTTY Change Log

    PuTTY Change Log

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    These features are new in beta 0.53b (released 2002-11-12):

    • Fixed an embarrassing command-line bug: the -P option didn't work at all.
    • Security fix: the vulnerability found by the Rapid7 SSHredder test suite is now believed fixed. See CERT advisory CA-2002-36.
    • Security fix: an improvement in random number policy when running more than one PuTTY at the same time.

    These features are new in beta 0.53 (released 2002-10-01):

    • The feature everyone's been asking for: ANSI printer support. Currently this sends data to the printer in completely raw mode, without benefit of Windows GDI or the printer driver; so it will be fine for anyone whose server already knows what type of printer it expects to be talking to, but probably not ideal for someone who wants to print a text file and have it look nice. A less raw mode of printer access is still on the Wishlist, but is quite a big piece of coding work so it's in the Implausible section.
    • The other feature everyone's been asking for: PuTTYgen can now import OpenSSH SSH2 private keys, and save them back out in PuTTY's own format. We also plan to add an export feature (so you can convert the other way), and similar support for ssh.com keys, but OpenSSH imports seem to have been the most popular request.
    • We now ship the PuTTY tool set as an installer, created using Jordan Russell's excellent and easy-to-use Inno Setup. (For the other half of our users, who felt the best thing about PuTTY was that they didn't have to mess around with installers, we still ship the single executables and the zip file, so nobody has to use the installer if they don't want to.)
    • PuTTY now has a default file extension for private key files: .PPK (PuTTY Private Key). The installer associates this file extension with Pageant and PuTTYgen.
    • PuTTY now natively supports making its connection through various types of proxy. We support SOCKS 4 and 5, HTTP CONNECT (RFC 2817), and the common ad-hoc type of proxy where you telnet to the proxy and then send text of the form "connect host.name 22". Basic password authentication is supported in SOCKS and HTTP proxies. Many thanks to Justin Bradford for doing most of the work here.
    • PuTTY now supports a standard set of command-line options across all tools. Most of these options are ones that Plink has always supported; however, we also support a number of new options similar to the OpenSSH ones (-A and -a, -X and -x, and similar things; also the -i option to specify a private key file).
    • The right-button menu on Pageant's System tray icon now offers the option to start PuTTY (New Session plus the Saved Sessions submenu). This feature is disabled if Pageant can't find the PuTTY binary on startup. Thanks to Dominique Faure.
    • Added the Features control panel, allowing the user to disable some of the more controversial terminal capabilities.
    • Added the Bugs control panel, allowing the user to manually control PuTTY's various workarounds for SSH server bugs.
    • Various bug fixes, including (with luck) much greater stability in high-traffic port forwarding situations.

    These features were new in beta 0.52 (released 2002-01-14):

    • A full manual has been written, and is supplied as a Windows Help file alongside the program executables.
    • Support for public keys in SSH2, both RSA and DSA. Agent forwarding is supported, but only to OpenSSH servers, because ssh.com have a different agent protocol which they haven't published.
      • (Yes, I know I've been claiming DSA is horrifically insecure for ages, but now I've been told about a clever way to get round the insecurity. Details are in sshdss.c for anyone who's interested; credit mostly goes to Colin Plumb for letting me know about it. We still think RSA is better, and recommend you use it if you have the choice.)
    • PSCP now uses the new SFTP protocol if possible, and only falls back to the old scp1 form if SFTP can't be found (for example, if your connection is SSH1). This should allow it to interoperate cleanly with ssh.com's product, and is a security improvement besides.
    • PSCP, in old-style scp1 mode, is now much tighter on security. It will refuse to let the remote host write to a file that doesn't have the same name as the file that was requested. NOTE WELL that this disallows remote-to-local wildcards such as "pscp server:*.c .". scp1's implementation of server-side wildcards is inherently unsafe. If you are sure you trust your scp server not to be malicious, you can use the "-unsafe" command line option to re-enable this behaviour. When using the new SFTP-based back end none of this is a problem, because SFTP is better designed.
    • Generic port forwarding support is now supported, thanks to a very comprehensive contribution from Nicolas Barry.
    • X11 forwarding support. Thanks to Andreas Schultz for doing a large part of the coding for this. Authentication munging is supported. However, PuTTY does not currently attempt to authenticate connections to the local X server, because finding the authentication data to do so is server-dependent and complex and I thought I'd wait to see what servers people actually want to use this with.
    • Added an SFTP client, for the improved file transfer protocol that comes with SSH2.
    • Full-screen mode, "like a DOS box". Not really like a DOS box, since it works within the current graphics mode rather than shifting into text mode, but it seems to work.
    • Support for resizing the font rather than the terminal when the user changes the window size. Also supports a hybrid mode, in which window resizes change the terminal size but maximising or going full-screen changes the font size. Patch due to Robert de Bath.
    • Unicode support in the terminal emulator. In the first place this allows us to support servers which actually send UTF-8 down their terminal sessions; but the architecture changes also mean that instead of specifying the local and remote character sets in the Translation panel, you simply specify what character set you expect the server to be talking, and PuTTY handles the rest automatically. Many thanks to Robert de Bath.
    • Experimental rlogin support. Thanks to Delian Delchev for the patch. Note that this may fail because the rlogin protocol relies on TCP Urgent data, which not all operating systems get right, and which not all firewalls pass through correctly. Also, local flow control is unsupported as yet, and the "flush" command is not handled correctly. Despite all this, it worked fine for me!
    • Improved support for local echo and local line editing. These are now separate options, controllable independently. PuTTY will make sensible guesses at the right settings, but those guesses can always be overridden by the user.
    • Improved bell support. There's now a whole configuration panel; you can choose a bell that plays the Windows default sound, or plays a sound of your choice, or flashes the window, or does nothing. In addition the window's Taskbar entry can be made to flash if a bell goes off when the window is minimised, and also there's an option that disables all bells if it receives them too fast (so that if you cat a binary file into your terminal it won't bleep for a week).
    • Support for AES in SSH 2.
    • Default Settings can now be used to save a default protocol and port number.
    • Scrollback should now automatically scroll if you try to drag-select off the top of the window (or off the bottom of the window when it's scrolled back), so you can easily select more than a screenful.
    • We now support rectangular-block selection, triggered by holding Alt while you drag the mouse. (You can also configure rectangular selection to be the default and Alt-drag to be conventional line-by-line selection.)
    • The mouse pointer can now be configured to disappear when the PuTTY window is active and text is typed, and reappear when the mouse is moved, à la MS Word. Particularly useful for those of us using focus-follows-mouse, where the pointer is quite likely to be inside the window and obscuring the view.
    • The cursor can now be displayed as an underline or as a vertical line, as well as a block. When it's a vertical line, it does something useful when not-quite-wrapping in the rightmost column.
    • Keepalive timeouts can now be specified in seconds rather than minutes.
    • Support for Diffie-Hellman group exchange in SSH2.
    • If you don't supply a username, PSCP now guesses your remote username to be the same as your local username. (On Win95/98, this might not be useful to everybody, but it's at least no worse than bombing out with a complaint. On WinNT, it might be seriously useful.) Patch due to Christian Biesinger.
    • You can now enter a service name such as "finger", in place of a port number. Patch due to Christian Biesinger.
    • It's now possible to invoke a second Pageant with some key files on the command line and have it feed those key files to the first Pageant. Also, you can make Pageant start another command once it's initialised itself; for example, "pageant -c wincvs.exe" to start Pageant and then start WinCVS.
    • Scrollback on the terminal is no longer implemented by physically copying a huge array. It should now be safe to use very large scrollback buffers without suffering noticeable slowdown.
    • Patch due to Roman Pompejus: the "-log" command line option on PuTTY is gone, replaced by a proper GUI-configurable logging facility.
    • Implemented a selection option to paste line drawing as the underlying characters or as poor-man's. Thanks to to Robert de Bath.
    • Ctrl+Alt can be configured to either have the traditional PuTTY behaviour (Ctrl+Alt+X is equivalent to ESC then Ctrl+X), or to behave like AltGr. Thanks to Robert de Bath.
    • Added SCO ANSI function key support (F1 is ESC [ M and F12 is ESC [ X, with all obvious points in between).
    • Font changes when the window is maximised now keep it maximised. Thanks to Robert de Bath.
    • The Application key on Windows keyboards now behaves like a Compose key all the time. Compose behaviour on AltGr can still be configured on and off. Thanks to Robert de Bath.
    • The terminal driver now returns a configurable string when it sees ^E. Thanks to Robert de Bath.
    • The About box now has a button that brings up a browser pointing at the PuTTY web site. Thanks to Eric Theriault.
    • Bug fix: the long-standing socket buffering bug should now be gone forever. If PuTTY is receiving data faster than it can send it out, it will attempt to slow down the entity it's receiving from rather than continuing to grow its buffers without bound.
    • Bug fix: AltGr should now be fixed. It was broken in 0.51.
    • Bug fix: repeat key exchange in SSH2 is now handled correctly. You should no longer see "Server failed host key check" after your session has been running for an hour.
    • Bug fix: various socket-handling problems should be corrected. Crashes on network errors, bad handling of TCP Urgent data in telnet and rlogin, and truncation of output when the remote server sends a lot of data and then immediately closes the connection. Thanks to Robert de Bath for the TCP Urgent stuff.
    • Bug fix: the cascading-error-boxes bug should be fixed. (This occurred when you had keepalives enabled and got Connection Aborted.)
    • Bug fix in the configuration box: controls in panels other than the visible one should now not be able to get keyboard focus.
    • Bug fix: Tab and accelerator keys now work in the Event Log and in the About box while a session is running. Thanks to Roman Pompejus for the fix.

    These features were new in beta 0.51 (released 2000-12-14):

    • Addition of PuTTYgen, an RSA key generation utility. Since PuTTY uses the same RSA key file format as SSH 1, keys generated by PuTTYgen are usable with SSH 1 as well.
    • SSH compression is now implemented.
    • Security improvement: better collection of randomness for the cryptographic random number generator. Thanks to Peter Gutmann of cryptlib for ideas.
    • Security improvement: PSCP should now not be vulnerable to malicious servers sending deliberately incorrect and harmful filenames down the SCP connection. (The problem was reported in Bugtraq #1742.)
    • Security improvement: the ssh client will not open agent forwarding channels unless agent forwarding has genuinely been enabled, by the user and the server. This allows a user to disable agent forwarding if they suspect the server might abuse the agent. (The problem was reported in Bugtraq #1949.)
    • New configurable option: the Compose key support is now off by default and configurable on.
    • New configurable option: whether or not Alt on its own brings up the System menu.
    • New configurable option: whether or not scrollback resets to the bottom when the display changes. (Previously you could control whether it reset on a keypress.)
    • New configurable options: application keypad mode and application cursor keys mode can be completely disabled. (Independently.)
    • New configurable options: Always On Top for the PuTTY window, so you can use it to keep system logs on-screen the whole time. (Might work particularly well with a really small font.)
    • Better network error handling. All errors are now translated into plain text: "Unexpected network error 10053" is a thing of the past.
    • Added a small patch to improve Chinese support. Thanks to Zhong Ming-Xun.
    • Bug fix: ISO8859-2 to Win1250 translation accidentally got broken in the 0.50 release. It should be back to normal now.
    • Bug fix: restore the SSH back end's ability to distinguish stderr output from stdout output. This was breaking PSCP and potentially also Plink.
    • Bug fix: correct the "Lost connection while sending" problem when pasting large amounts of data into PuTTY. This should also have fixed random connection loss in Plink. Note: some of my experiments suggest that some SSH servers are not entirely happy with very large (80Kb or so) pastes, so if you still have problems, they may not be PuTTY's fault.
    • Bug fix: PuTTY proper now ignores trailing whitespace on the command line (this was causing problems with "putty @sessionname " and similar.
    • Bug fix: the scrollbar is now reset to the bottom whenever the scrollback is, so they don't end up out of sync any more.
    • Bug fix: both PuTTY and Pageant, when trying to load a private key file that turned out to be the wrong format, failed to close the file, so you couldn't delete it until the app had shut down.
    • Bug fix: some SSH2 connections were reporting "Server failed host key check" on session startup. This was a bug in PuTTY's DSA implementation.
    • Bug fix: the "Default Settings" pseudo-saved-session was often missing from the saved session list. This was causing chaos, as the rest of the code assumed it was there and so treated the first item in the list specially. It's now back.
    • Bug fix: Plink and PSCP didn't load the Default Settings when presented with a simple hostname. (So a default username, default private key, etc, didn't get used.) Now they do.
    • Bug fix: terminal resize events weren't being sent in SSH2. Now they are.
    • Bug fix: although local terminal line discipline was being turned off correctly on receipt of IAC WILL ECHO, it wasn't being turned on again on receipt of IAC WONT ECHO. This was breaking some BBS/MUD connections. Now fixed.
    • Bug fix: pscp's GUI interface was computing wrong percentages for very large files (within a factor of 100 of 2^32).
    • Bug fix: the Compose key now doesn't randomly trigger and cause keystroke loss on switching back into the PuTTY window.
    • Bug fix: the Colours panel now works again. (The RGB values weren't updating when the selection changed in the list box.)
    • Bug fix: if you tried to use a local wildcard with PSCP (for example, "pscp * remotehost:", that wildcard would match the special directories "." and "..". It now doesn't; "." and ".." can only be specified explicitly.

    These features were new in beta 0.50 (released 2000-10-16):

    • Keep-alives to prevent overzealous idle detectors in firewalls from closing connections down. Done by sending Telnet NOP or SSH_MSG_IGNORE, so as to avoid affecting the actual data stream.
    • In PuTTY proper, in SSH mode, you can now specify a command to be run at the remote end. (The SSH functionality was already there, because it was required for PSCP and Plink. All it took was a bit of GUI work to make it accessible from PuTTY itself.)
    • You can now configure the initial window title.
    • Running "putty -cleanup" will now remove all files and registry entries created by PuTTY. If you've used PuTTY on somebody else's machine and don't want to leave any mess behind, you can run this before deleting the PuTTY executable.
    • The Event Log now scrolls down when new events appear on it, so that if you leave it up all the time you can watch things happen. Also, you can select items from the Event Log and copy them to the clipboard (should help for debugging).
    • When using NT's opaque resize feature, resizing the window doesn't send resize events at every step of the process, but instead sends a single one at the end. (I'd have quite liked it to do a resize event if the drag paused for maybe a second, but WM_TIMER doesn't seem to get through in the middle of a resize. Oh well, this is good enough.)
    • Everyone's favourite trivial change: Shift+Ins pastes. (No configurable option to control this: it wasn't doing anything interesting anyway.)
    • Included two extra Makefile options: /DAUTO_WINSOCK makes the build process assume that <windows.h> implicitly includes a WinSock header file, and /DWINSOCK_TWO makes PuTTY include <winsock2.h> instead of <winsock.h>.
    • Bug fix for a bug nobody had ever noticed: if you hit About twice, you only get one About box (as designed), except that if you open and close the Licence box then PuTTY forgets about the About box, so it will then let you open another. Now the behaviour is sane, and you can never open more than one About box.
    • Bug fix: choosing local-terminal line discipline together with SSH password authentication now doesn't cause the password to be echoed to the screen.
    • Bug fix: network errors now do not close the window if Close On Exit isn't set.
    • Bug fix: fonts such as 9-point (12-pixel) Courier New, which previously failed to display underlines, now do so.
    • Bug fix: stopped the saved-configuration-name box getting blanked when you swap away from and back to the Connection panel.
    • Bug fix: closing the About box returns focus to the config box, and closing the View Licence box returns focus to the About box.
    • The moment you've all been waiting for: RSA public key authentication is here! You can enter a public-key file name in the SSH configuration panel, and PuTTY will attempt to authenticate with that before falling back to passwords or TIS. Key file format is the same as "regular" ssh. Decryption of the key using a passphrase is supported. No key generation utility is provided, yet.
    • Created Pageant, a PuTTY authentication agent. PuTTY can use RSA keys from this for authentication, and can also forward agent communications to the remote end. Keys can be added and removed either locally or remotely.
    • Created Plink, a command-line version of PuTTY suitable for use as a component of a pipe assembly (for example, Windows NT CVS can use it as a transport).
    • SSH protocol version 2 support. This is disabled by default unless you connect to a v2-only server. Public key authentication isn't supported (this places PuTTY technically in violation of the SSH 2 specification).
    • Enable handling of telnet://hostname:port/ URLs on the command line. With this feature, you can now set PuTTY as the default handler for Telnet URLs. If you run the Registry Editor and set the value in HKEY_CLASSES_ROOT\telnet\shell\open\command to be "\path\to\putty.exe %1" (with the full pathname of your PuTTY executable), you should find that clicking on telnet links in your web browser now runs PuTTY.
    • Re-merge the two separate forks of the ssh protocol code. PuTTY and PSCP now use the same protocol module, meaning that further SSH developments will be easily able to affect both.

    These features were new in beta 0.49 (released 2000-06-28):

    • Stop the SSH protocol code from sending zero-length SSH_CMSG_STDIN_DATA packets when Shift is pressed. These appear to be harmless to Unix sshd, but cause VMS sshd to generate an Exit signal.
    • Fix a small bug about using special port numbers in pscp; thanks to Joris van Rantwijk.
    • Three security improvements. PuTTY now checks the CRC on incoming packets, checks that the packet length and string length fields on incoming SSH_SMSG_*_DATA packets are consistent, and outlaws attempts to set the terminal size too big by escape sequences (countering the xterm DoS attack shown in bugtraq #1298).
    • High-half characters (160 and above) are now supported in username and password input.
    • Bug fix: RSA keys whose storage format used an odd number of bytes (i.e. the bit length of the key, mod 16, was between 1 and 8 inclusive) were being handled incorrectly. An sshd with an 850-bit server key wasn't able to accept connections from PuTTY as a result.
    • pscp now has the "-ls" option to get a directory listing of a remote host. It does this by sending the command "ls -la <dirspec>", so it might well not work on non-Unix ssh servers. It's mainly there to allow a useful directory listing facility for potential GUI front ends.
    • Local line discipline is now invoked in more sensible circumstances, and understands Telnet Erase Line. Thanks to Robert de Bath.
    • Blinking cursor support (off by default). Thanks to Robert de Bath.
    • xterm mouse tracking support, thanks to Wez Furlong.
    • Hopefully vastly improved PuTTY's behaviour under load; also we can process incoming data even during a window move/resize. Thanks to Robert de Bath.
    • Better handling of the bug in which underlines are drawn outside the character cell. Now they don't get drawn at _all_, which is still non-ideal but it's better than rampaging screen corruption. Thanks to Robert de Bath.
    • Various terminal emulation upgrades. Thanks to Robert de Bath.
    • By popular demand, Shift-Tab now sends ESC [ Z instead of being indistinguishable from ordinary Tab.
    • ^C, ^Z and ^D now instruct the local-terminal line discipline to send Telnet special control codes. The local line discipline can also be enabled and disabled in mid-session without dropping data, and it's also linked to the Telnet ECHO option. Patch due to Robert de Bath.
    • Telnet SYNCH is now preceded by IAC, which it wasn't previously. Patch due to Robert de Bath.
    • Fixed the long-standing bug in which CSI ? Q and CSI Q were treated identically for most values of Q. Patch due to Robert de Bath.
    • Pressing Return in a Telnet session now sends Telnet NL instead of Telnet CR (in raw data, that's CR-LF not CR-NUL; ^J continues to send just LF). Unix telnetds should not notice any difference; others might suddenly start working. Patch due to Robert de Bath.
    • Much patchery in font selection code; with any luck, mixed OEM+ANSI line drawing mode will now be more reliable. Patch due to Robert de Bath.
    • An attempt has been made to deal with the dropping of incoming data between decoding and display.
    • Replaced all the algorithms that weren't already my own code. The DES, MD5, SHA, and CRC32 implementations used in PuTTY are now all written by me and distributable under the PuTTY licence, instead of being borrowed from a variety of other places. Better still, there are comments: the DES implementation contains a careful description of how the algorithm given in the spec was transformed into the optimised algorithm in the code, and the CRC32 implementation explains what a CRC is and how the table lookup algorithm works.
    • Scrollback behaviour has changed. ANSI Delete Line at the top of the screen now inserts the lines into the scrollback (previously, only genuine scroll-up would do this). However, the scrollback is never touched by scroll operations in the alternate screen.
    • The response to Ctrl-E is now "PuTTY" instead of the xtermalike sequence it was previously.
    • The command line option -log will now cause all data received from the remote host to be logged to a file putty.log.
    • PSCP now doesn't try to "recurse" into the directories . and .. like it did before.
    • Add keyboard accelerators on the System menu.
    • "Warn On Close" no longer applies to inactive windows: you can close one of those without complaint.
    • There is now a system to generate Borland and Cygnus makefiles from the master makefile, so that people can build PuTTY with other compilers but I still only have to maintain one makefile.

    These features were new in beta 0.48 (released 1999-11-18):

    • Cyrillic support: optional KOI8 to Win1251 translation, an internal version of the Cyrillic key map for machines that don't have it installed systemwide, and support for selecting a character set in the font configuration. All thanks to Oleg Panashchenko.
    • Support for the TIS authentication option (to the client, this looks much like a form of password authentication, so there's no local state involved).
    • SSH mode now shows an Event Log of all the initial protocol setup, to match the Telnet negotiation log.
    • Alt-F4 as "close window" can be configured off. Alt-Space as System menu is now an option and can be configured on, although it doesn't work very well (you have to press Down after hitting Alt-Space).
    • NetHack keypad mode mapping (shift-with-)numeric-keypad to (shift-with-)hjklyubn. Unfortunately Shift only works when NumLock is off, which is a bit odd.
    • An implementation of the scp client, as a separate binary. Many thanks to Joris van Rantwijk.
    • Change the default title bar format to "host.name - PuTTY" rather than "PuTTY: host.name", so as to be more useful in the taskbar.
    • Warning box "are you sure you want to disconnect?" on hitting the Close button or Alt-F4 or whatever.
    • Telnet mode was reported to drop char-255, presumably due to mishandling IAC IAC. Fix due to Robert de Bath.
    • Add some keyboard accelerators in the configuration box.
    • A raw-TCP connection option, alongside Telnet and SSH. Thanks to Mark Baker.
    • A local line-editing line discipline, which can be layered over any of the back end connection options. Most usefully, this can be used to make the raw-TCP back end suitable for talking to finger, SMTP, POP, NNTP etc. servers.
    • A small tool-tip that shows the size of the terminal window in character cells while it's being resized, so you can drag it out to a precise size. Many thanks to John Sullivan, who achieved this despite other people supporting my belief that it was impossible.
    • Single DES as an SSH encryption option, as well as triple DES. Thanks to Murphy Lam.
    • Support for using ssh by default: a -ssh command line option, a compile-time definition SSH_DEFAULT, and the ability to honour port and protocol (and host!) settings in the "Default Settings" part of the registry if they've been manually inserted.
    • Made stored sessions available as a submenu from the system menu. Thanks to Owen Dunn.
    • Minimal Win32s compatibility, as a compile-time option (so it's not in the snapshot binaries but is in the snapshot source releases). The configuration box apparently doesn't work, but the actual sessions will run OK. Thanks to Owen Dunn.

    This feature was new in beta 0.47 (released 1999-08-27):

    • Fixed a potential security flaw in the random number generator.

    These features were new in beta 0.46 (released 1999-07-09):

    • Fixed a bug causing hangs when an SSH window was resized after the connection was closed. I'd never spotted it, because I never use Close Window On Exit...
    • Default mouse pointer inside the PuTTY window is now an I-beam.
    • Support for AltGr. As it turns out, it is possible to do this without also changing the behaviour of Ctrl/LeftAlt. Many thanks to <andre@via.ecp.fr> for inventing a way to achieve this.
    • Resource/memory leaks are apparently fixed. I'm going to assume they are completely fixed, unless someone mails me to suggest otherwise.
    • Fixed the bug in the configuration box whereby double-clicking on a saved session leaked the double click through to the window below.
    • ESC[?9r was being interpreted just like ESC[9r, with disastrous results (the former turns off mouse click reporting, which PuTTY doesn't support yet anyway; the latter munges the scroll region horribly). Fixed, in a temporary sort of way.
    • Added Blowfish encryption as an alternative to triple-DES.

    These features were new in beta 0.45 (released 1999-01-22):

    • Fix the GPF on maximise-then-restore.
    • Fix the delayed update of the window title when in always-use-window-title mode and iconic.
    • Employ SetCapture() to allow drag-selects to continue to work when the pointer drifts out of the window.
    • Some platforms apparently define the identifier "environ" as a macro; stop using it inside PuTTY.
    • Add an option to ask SSH not to allocate a pty.
    • Add a terminal setting to cause LF to imply CR (useful with the above).


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Node-path: putty-website/docs.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2112 Text-content-md5: 6eaa0186de2d1798226fed248459b6da Text-content-sha1: 24f0644842a80d10196e2fb043570a6d17bf263b Content-length: 2228 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN222 PuTTY Documentation Page

    PuTTY Documentation Page

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    This page links to the documentation for PuTTY.

    Here are links to the documentation for the latest release:

    And here are links to the documentation for the development snapshots:


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Node-path: putty-website/download.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 21935 Text-content-md5: 7607f14c55b178a71f7c411a2755fc25 Text-content-sha1: 651beb3a3a4ccb7bebf3d817d09c51638a557744 Content-length: 22051 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN PuTTY Download Page

    PuTTY Download Page

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    Here are the PuTTY files themselves:

    • PuTTY (the Telnet and SSH client itself)
    • PSCP (an SCP client, i.e. command-line secure file copy)
    • PSFTP (an SFTP client, i.e. general file transfer sessions much like FTP)
    • PuTTYtel (a Telnet-only client)
    • Plink (a command-line interface to the PuTTY back ends)
    • Pageant (an SSH authentication agent for PuTTY, PSCP and Plink)
    • PuTTYgen (an RSA key generation utility).

    LEGAL WARNING: Use of PuTTY, PSCP, PSFTP and Plink is illegal in countries where encryption is outlawed. I believe it is legal to use PuTTY, PSCP, PSFTP and Plink in England and many other countries, but I am not a lawyer and so if in doubt you should seek legal advice before downloading it. You may find this site useful (it's a survey of cryptography laws in many countries) but I can't vouch for its correctness.

    Use of the Telnet-only binary (PuTTYtel) is unrestricted by any cryptography laws.

    The files we offer below are cryptographically signed. We also supply cryptographically signed lists of MD5 checksums. To download our public keys and find out more about our signature policy, visit the Keys page. If you need a Windows program to compute MD5 checksums, you could try the one at this site, or this site (although beware that those programs themselves are not signed, so if you're really paranoid you still can't be 100% sure!).

    The latest release version. This will generally be a version I think is reasonably likely to work well. If you have a problem with the release version, it might be worth trying out the latest development snapshot (below) to see if I've already fixed the bug, before reporting it to me.
    For Windows 95, 98, ME, NT, 2000 and XP on Intel x86
    PuTTY: putty.exe (or by FTP) (RSA sig) (DSA sig)
    PuTTYtel: puttytel.exe (or by FTP) (RSA sig) (DSA sig)
    PSCP: pscp.exe (or by FTP) (RSA sig) (DSA sig)
    PSFTP: psftp.exe (or by FTP) (RSA sig) (DSA sig)
    Plink: plink.exe (or by FTP) (RSA sig) (DSA sig)
    Pageant: pageant.exe (or by FTP) (RSA sig) (DSA sig)
    PuTTYgen: puttygen.exe (or by FTP) (RSA sig) (DSA sig)
    For Windows NT on Alpha
    PuTTY: putty.exe (or by FTP) (RSA sig) (DSA sig)
    PuTTYtel: puttytel.exe (or by FTP) (RSA sig) (DSA sig)
    PSCP: pscp.exe (or by FTP) (RSA sig) (DSA sig)
    PSFTP: psftp.exe (or by FTP) (RSA sig) (DSA sig)
    Plink: plink.exe (or by FTP) (RSA sig) (DSA sig)
    Pageant: pageant.exe (or by FTP) (RSA sig) (DSA sig)
    PuTTYgen: puttygen.exe (or by FTP) (RSA sig) (DSA sig)
    A .ZIP file containing all the binaries (except PuTTYtel), and also the help files
    For Intel x86: putty.zip (or by FTP) (RSA sig) (DSA sig)
    For Alpha: putty.zip (or by FTP) (RSA sig) (DSA sig)
    A Windows-style installer (x86 only) for everything except PuTTYtel
    For Intel x86: putty-0.53b-installer.exe (or by FTP) (RSA sig) (DSA sig)
    Source code for all platforms
    Source: putty-src.zip (or by FTP) (RSA sig) (DSA sig)
    MD5 checksums for all the above files
    MD5sums: md5sums (or by FTP) (RSA sig) (DSA sig)

    The latest development snapshot. This will be built every day, automatically, from the current development code - in whatever state it's currently in. If you need a fix for a particularly crippling bug, you may well be able to find a fixed PuTTY here well before the fix makes it into the release version above. On the other hand, these snapshots might sometimes be unstable.
    For Windows 95, 98, ME, NT, 2000 and XP on Intel x86
    PuTTY: putty.exe (or by FTP) (RSA sig) (DSA sig)
    PuTTYtel: puttytel.exe (or by FTP) (RSA sig) (DSA sig)
    PSCP: pscp.exe (or by FTP) (RSA sig) (DSA sig)
    PSFTP: psftp.exe (or by FTP) (RSA sig) (DSA sig)
    Plink: plink.exe (or by FTP) (RSA sig) (DSA sig)
    Pageant: pageant.exe (or by FTP) (RSA sig) (DSA sig)
    PuTTYgen: puttygen.exe (or by FTP) (RSA sig) (DSA sig)
    For Windows NT on Alpha
    PuTTY: putty.exe (or by FTP) (RSA sig) (DSA sig)
    PuTTYtel: puttytel.exe (or by FTP) (RSA sig) (DSA sig)
    PSCP: pscp.exe (or by FTP) (RSA sig) (DSA sig)
    PSFTP: psftp.exe (or by FTP) (RSA sig) (DSA sig)
    Plink: plink.exe (or by FTP) (RSA sig) (DSA sig)
    Pageant: pageant.exe (or by FTP) (RSA sig) (DSA sig)
    PuTTYgen: puttygen.exe (or by FTP) (RSA sig) (DSA sig)
    A .ZIP file containing all the binaries (except PuTTYtel), and also the help files
    For Intel x86: putty.zip (or by FTP) (RSA sig) (DSA sig)
    For Alpha: putty.zip (or by FTP) (RSA sig) (DSA sig)
    Source code for all platforms
    Source: putty-src.zip (or by FTP) (RSA sig) (DSA sig)
    MD5 checksums for all the above files
    MD5sums: md5sums (or by FTP) (RSA sig) (DSA sig)

    Access via CVS

    If you want to keep track of the PuTTY development right up to the minute, or view the change logs for each of the files in the source base, you can access the PuTTY master CVS repository directly.

    You can access the repository by means of CVS pserver. The CVSROOT variable you need is ":pserver:cvsuser@cvs.tartarus.org:/home/cvs". Password is "anonymous"; check out module "putty". In other words, on a typical Unix CVS setup, you can check out a copy of the PuTTY development code using the commands

    cvs -d :pserver:cvsuser@cvs.tartarus.org:/home/cvs login
    (enter the password "anonymous" when prompted)
    cvs -d :pserver:cvsuser@cvs.tartarus.org:/home/cvs co putty
    (PuTTY should now be checked out for you. You will not need to enter the password again.)

    In case you aren't able to access the real PuTTY repository using pserver, we also provide a tar.gz archive of the CVS repository, updated every night. So if you want to browse PuTTY's CVS history, you could download that, unpack it, and point a local CVS client at it. Click here to download the CVS archive: putty-cvs.tar.gz.

    Alternatively, you can browse the CVS repository on the WWW, here.

    Contributions

    Lars Gunnarsson has written a graphical front end for PSCP, in Delphi. You can get it from his web site, at www.i-tree.org.

    Olivier Deckmyn has written a small utility called "QuickPutty", which puts up a small window containing a list of your saved sessions for quick and easy launching. It can also appear as an icon in the PuTTY System tray. You can get it from his web site, here.


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Node-path: putty-website/faq.pl Node-kind: file Node-action: add Prop-content-length: 142 Text-delta: true Text-content-length: 1413 Text-content-md5: b6b3c6566f6735e03b2fdfcc5b9fe28d Text-content-sha1: 6d22d407ae5dac3a7467fda2636d3aabc89853e0 Content-length: 1555 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 14 svn:executable V 1 * K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNwww#!/usr/bin/perl print << 'EOF'; PuTTY FAQ

    PuTTY FAQ

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    EOF open FAQ, $ENV{"HOME"} . "/pub/putty/doc/AppendixA.html"; while () { last if //i; } # The line after is the navigation links within the Halibut output ; while () { # The bottom navigation links terminate the FAQ material; # conveniently, they use single quotes in the hrefs instead of # double. last if /^

    '/eg; print; } print << 'EOF';


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) EOF sub fix_href { local ($_) = @_; s/^AppendixA.html// or s/^/http:\/\/www.tartarus.org\/~simon\/puttydoc\//; $_; } Node-path: putty-website/feedback.pl Node-kind: file Node-action: add Prop-content-length: 142 Text-delta: true Text-content-length: 1517 Text-content-md5: 072dce9e50d05a1fd2dfd1273356a916 Text-content-sha1: 543d3250a5f038be20193993f8e0660368e61899 Content-length: 1659 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 14 svn:executable V 1 * K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN___#!/usr/bin/perl print << 'EOF'; PuTTY Feedback and Bug Reporting

    PuTTY Feedback and Bug Reporting

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    EOF open FILE, $ENV{"HOME"} . "/pub/putty/doc/AppendixB.html"; while () { last if //i; } # The line after is the navigation links within the Halibut output ; while () { # The bottom navigation links terminate the file material; # conveniently, they use single quotes in the hrefs instead of # double. last if /^

    '/eg; print; } print << 'EOF';


    If you want to comment on this web site, see the above guidelines.
    (last modified on [insert date here]) EOF sub fix_href { local ($_) = @_; /^news:/ or /^mailto:/ or s/^AppendixB.html// or s/^/http:\/\/www.tartarus.org\/~simon\/puttydoc\//; $_; } Node-path: putty-website/index.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3196 Text-content-md5: d74048d9c169a96197f0721ee02cbd44 Text-content-sha1: aa0cfa4bb3a8f12e0d40eb29b7f88929bd233585 Content-length: 3312 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNnnn PuTTY: a free Win32 telnet/ssh client

    PuTTY: A Free Win32 Telnet/SSH Client

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    PuTTY is a free implementation of Telnet and SSH for Win32 platforms, along with an xterm terminal emulator. It is written and maintained primarily by Simon Tatham.

    The latest version is beta 0.53b.

    LEGAL WARNING: Use of PuTTY, PSCP, PSFTP and Plink is illegal in countries where encryption is outlawed. I believe it is legal to use PuTTY, PSCP, PSFTP and Plink in England and many other countries, but I am not a lawyer and so if in doubt you should seek legal advice before downloading it. You may find this site useful (it's a survey of cryptography laws in many countries) but I can't vouch for its correctness.

    Use of the Telnet-only binary (PuTTYtel) is unrestricted by any cryptography laws.

    Latest news

    2002-04-27 Too much e-mail to answer

    The volume of e-mail from PuTTY users has finally overwhelmed the development team. There is now literally more mail coming in than we can answer. Even with four of us, and even with the FAQ fielding all the most common questions. There's just too much.

    We will still try to reply to questions, feature suggestions and bug reports we receive, but we can't promise to do so. We simply don't have enough time to reply to them all, and if we did we'd never manage to do any actual coding. Please try to be thoughtful, and don't send us mail unless you really can't find anyone else to answer your question. The newsgroup comp.security.ssh might be a good place to try with support questions.

    Site map


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Node-path: putty-website/keys.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5967 Text-content-md5: a011e0f6053e41e26ae26a1294eb8e7e Text-content-sha1: 61b7bb5c9663fb55f5fb6b0cdb3d4e71e0f09c85 Content-length: 6083 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNAAA PuTTY Download Keys and Signatures

    PuTTY Download Keys and Signatures

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    We are currently in the process of setting up GnuPG signatures for all the PuTTY files distributed from this web site, so that users can be confident that the files have not been tampered with. On this page we provide our public keys, and explain our signature policy so you can have an accurate idea of what each signature guarantees.

    Public keys

    We supply two complete sets of keys. We supply a set of RSA keys, compatible with both GnuPG and PGP2, and also a set of DSA keys compatible with GnuPG.

    In each format, we have three keys:

    • A Development Snapshots key, used to sign the nightly builds.
    • A Releases key, used to sign actual releases.
    • A Master Key. The Master Key is used to sign the other two keys, and they sign it in return.

    Therefore, we have six public keys in total. They are provided for download here:
    RSA: Master Key Release Key Snapshot Key
    DSA: Master Key Release Key Snapshot Key

    Security details

    The various keys have various different security levels. This section explains what those security levels are, and how far you can expect to trust each key.

    The Development Snapshots keys

    These keys are stored without passphrases. This is necessary, because the snapshots are generated every night without human intervention, so nobody would be able to type a passphrase.

    The actual snapshots are built on systems running on a company network (because that company happens to have a trusted member of the PuTTY core team working for it, and also has both Intel and Alpha NT machines capable of running scheduled batch builds).

    To avoid having to trust that company with passphraseless keys, the keys themselves are stored on an independently run Unix box outside that company. After being built, the binaries are uploaded to this Unix box and then signed automatically.

    Therefore, a signature from one of the Development Snapshots keys DOES protect you against:

    • People tampering with the PuTTY binaries between the PuTTY web site and you.

    But it DOES NOT protect you against:

    • People within the company tampering with the build process, or tampering with the binaries before they are uploaded to the independent Unix box.
    • The sysadmin of the independent Unix box using his root privilege to steal the private keys and abuse them, or tampering with the binaries before they are signed.
    • Somebody getting root on the Unix box.

    Of course, we don't believe any of those things is very likely. We know our sysadmin personally and trust him (both to be competent and to be non-malicious), and we are reasonably confident that anybody inside the company wanting to cause damage would be far more likely to choose other targets. But when you see a signature, you should always be certain of precisely what it guarantees and precisely what it does not.

    The Releases keys

    The Release keys have passphrases and we can be more careful about how we use them.

    The Release keys are kept safe on the developers' own local machines, and only used to sign releases that have been built by hand. A signature from a Release key protects you from almost any plausible attack.

    (Some of the developers' machines have cable modem connections and might in theory be crackable, but of course the private keys are still encrypted, so the crack would have to go unnoticed for long enough to steal a passphrase.)

    Note that none of the PuTTY developers has an Alpha NT machine locally - the only one we have access to is the company-owned one used to build the nightly snapshots. Therefore, we cannot build Alpha releases with the same level of confidence we build Intel releases with. So the Alpha releases will be signed using the Development Snapshots keys. Only the Intel releases will be signed using the Releases keys.

    The Master Keys

    The Master Keys sign almost nothing. Their purpose is to bind the other keys together and certify that they are all owned by the same people and part of the same integrated setup. The only signatures produced by the Master Keys, ever, should be the signatures on the other keys.

    We intend to arrange for the Master Keys to sign each other, to certify that the DSA keys and RSA keys are part of the same setup. We have not yet got round to this.

    We intend to collect third-party signatures on the Master Keys. We have not yet got round to this.

    We intend to upload our various keys to public keyservers, so that even if you don't know any of the people who we get to sign our keys, you can still be reasonably confident that an attacker would find it hard to substitute fake keys on all the public keyservers at once. We have not yet got round to this either.


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Node-path: putty-website/licence.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3220 Text-content-md5: e2fb93dd58ece4885e8d25368d8182aa Text-content-sha1: c429faba288e84480dea4ef70d6423f69f2efa83 Content-length: 3336 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN PuTTY Licence

    PuTTY Licence

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    The PuTTY executables and source code are distributed under the MIT licence, which is similar in effect to the BSD licence. (This licence is Open Source certified and complies with the Debian Free Software Guidelines.)

    The precise licence text, as given in the About box and in the file LICENCE in the source distribution, is as follows:

    PuTTY is copyright 1997-2003 Simon Tatham.

    Portions copyright Robert de Bath, Joris van Rantwijk, Delian Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry, and CORE SDI S.A.

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    In particular, anybody (even companies) can use PuTTY without restriction (even for commercial purposes) and owe nothing to me or anybody else. Also, apart from having to maintain the copyright notice and the licence text in derivative products, anybody (even companies) can adapt the PuTTY source code into their own programs and products (even commercial products) and owe nothing to me or anybody else. And, of course, there is no warranty and if PuTTY causes you damage you're on your own, so don't use it if you're unhappy with that.

    In particular, note that the MIT licence is compatible with the GNU GPL. So if you want to incorporate PuTTY or pieces of PuTTY into a GPL program, there's no problem with that.


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Node-path: putty-website/maillist.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1717 Text-content-md5: 1fffec4ee93bee3d2c00740e79679840 Text-content-sha1: 0e6aa47cf99aad3c2a64449455c9049eae15aad6 Content-length: 1833 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN''' PuTTY Updates

    PuTTY Updates

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    If you would like to be told when new releases of PuTTY come out, you can subscribe to the PuTTY-announce mailing list. Do this by going to the list information and subscription page, here. Please do not request a subscription by mailing the PuTTY authors.

    Please do not send mail to PuTTY-announce! It is not a discussion list. It is not a place to report bugs to. It is a list of people who want to receive one e-mail, from the PuTTY developers, every time there is a new release. All posts from other people, even list members, will be rejected. Bugs and comments should be sent to putty@projects.tartarus.org.

    If you want to modify or cancel your subscription, you can do all of this from the mailing list information page, here.


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Node-path: putty-website/mirrors.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 10069 Text-content-md5: 8a86088a71a923725633a5f7743a5468 Text-content-sha1: 814de3cc456b27bd579d7a5d9727f66d1a14a1ae Content-length: 10185 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNGGG PuTTY Web Site Mirrors

    PuTTY Web Site Mirrors

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    Here is a list of PuTTY web site mirrors. I add to this list when people tell me mirrors exist: I don't go out looking for them. If you want to mirror the PuTTY site, you're welcome to - tell me about it and I'll put it on the list. Be sure to read the mirroring guidelines below.

    The official PuTTY home site, in case that isn't where you're reading this, is

    HTTP mirrors of the whole site:

    Be aware that the mirrors are not updated instantly. Also, none of the FTP links on the Download page have been mirrored - they still point to the same places as on the original web site. (The HTTP links on the Download page have been mirrored.)

    FTP mirrors of the PuTTY releases:

    HTTP mirrors of the PuTTY development snapshots:

    FTP mirrors of the PuTTY development snapshots:

    Mirroring guidelines

    The PuTTY web site is not available through rsync or any organised mirroring mechanism. If you want to mirror the web site, we recommend you do it using GNU wget.

    When mirroring our web site, you will need to be careful of the binary downloads. They are hosted on a different server, for bandwidth reasons, so a conventional "wget -r" will not fetch them at all. Instead, you will need at least two invocations of wget. Also, the release binaries are stored under a directory called "latest", but this actually returns an HTTP temporary redirect to a numbered directory such as "0.53". Ideally a mirror should reproduce this behaviour as well.

    Here is a sample shell script to create a working PuTTY mirror site with the binaries in the right place and the HTTP redirect set up correctly. This script requires sed, perl and GNU wget, and it also assumes your web server is Apache (you'll need to replace the ".htaccess" file with your server's equivalent if not).

    #!/bin/sh 
    
    # Fetch the main web site.
    wget --no-parent -l0 -r --cut-dirs=1 -nH \
    	http://www.chiark.greenend.org.uk/~sgtatham/putty/
    
    # Fetch the .htaccess file from the download site, in order to find the
    # version number of the latest release.
    cd putty
    wget http://the.earth.li/~sgtatham/putty/htaccess
    version=`sed 's!.*http://the.earth.li/~sgtatham/putty/!!; s!/!!g' htaccess`
    echo Latest version is $version
    
    # Retrieve the binaries directory for that version from the binaries
    # server.
    wget --no-parent -l0 -r --cut-dirs=3 -P $version -nH \
    	http://the.earth.li/~sgtatham/putty/$version/
    
    # Fix the hyperlinks in the download and docs pages so that they point
    # to the local mirror of the binaries instead of the primary binaries
    # server. Without this there's barely any point in doing the mirror at
    # all.
    perl -i~ -pe 's!http://the.earth.li/~sgtatham/putty/!!' download.html docs.html
    
    # Create a .htaccess file that supplies the redirection from "latest"
    # to a numbered version directory. Note that you will need to replace
    # MY_PATH and MY_URL with appropriate values for your own mirror site.
    echo "Redirect temp /MY_PATH/latest/ http://MY_URL/$version/" > .htaccess
    
    # The .htaccess file should also ensure the Windows Help files are not
    # given any strange MIME types by the web server.
    echo "AddType application/octet-stream .hlp" >> .htaccess
    echo "AddType application/octet-stream .cnt" >> .htaccess
    


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Node-path: putty-website/sitestyle.css Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 153 Text-content-md5: b9525627d389463219a0791b995d2d92 Text-content-sha1: aff11c9c1d5bb434de70fe4ffa16d7547ce1e7f0 Content-length: 269 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  BODY {background: white; color: black;} H1, H2, H3 {font-weight: bold;} H1 {font-size: 134%;} H2 {font-size: 117%;} H3 {font-size: 100%;} Node-path: putty-website/wishlist.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 32477 Text-content-md5: 9564b73f4957db7bd0afc0b70293e1b2 Text-content-sha1: 608a9cad35e21fa19f262d515c5737a2d1fdc959 Content-length: 32593 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNLLL PuTTY Known Bugs and Wish List

    PuTTY Known Bugs and Wish List

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist

    This is the list of bugs that need fixing, and features that want adding, to PuTTY. This list represents things that have not been done to the current development code. If you do not see a feature here, it's worth checking the Changes page before mailing us to ask for the feature; we might have already added it since the last release.

    Bugs

    These items are clearly actual problems and I want them fixed.

    • Fatal error handling is patchy and flaky. It's very easy to throw a fatal error, put up a message box, and then receive a Windows message containing yet more socket data. The MessageBox message loop then dispatches that message automatically and the back end is called reentrantly. Chaos ensues. Solution: the fatal error behaviour should be much more robust. Close all sockets the instant a fatal error occurs; also set some global flags that prevent action messages from having any back end effect.
    • If there is data being transferred through PuTTY while the SSH2 repeat key exchange is taking place, it can confuse some servers. As far as I'm aware nobody has properly standardised this aspect of the SSH2 protocol (what happens to the connection layer while the transport layer is in a key exchange phase?) so it isn't clear what PuTTY should do in this situation, but a good conservative/liberal option would be to accept incoming connection-layer packets provided we can decrypt them, and to queue outgoing connection-layer packets until the key exchange is completed. I can't easily imagine a standards decision that would invalidate that behaviour.
    • Problems with various keyboard layouts. It would be hard for me to debug these myself because I'd have to be able to work in the same keymap as I was testing PuTTY in! If anybody can debug these problems it would be greatly appreciated.
      • The svorak (Swedish Dvorak) layout apparently gets a few control combinations wrong: ^W, ^V and ^Z.
      • On the Danish keyboard, apparently the tilde (~) is acting as a dead key and generating a code in itself; so if you hit ~ and then n, you get a ~ followed by a ñ.
      • There's been a report from a Korean user that Korean multi-byte input doesn't work.
      • A German user has reported that Caps Lock is more like Shift Lock - it affects a lot of keys other than alphabetics.
    • If PuTTY starts up with its window unselected, something slightly odd can happen with the cursor: it doesn't revert from box to block when the window gains focus.
    • DNS lookups are synchronous. We could make them async quite easily, which would stop the last potential delay before the PuTTY window appears and would also prevent an absent DNS server from hanging PuTTY while a remote-to-local port forwarding times out on DNS; but ideally I'd like an abstraction of DNS so that we can still port later (since the socket API only has synchronous DNS). Porting to Unix will be fine (we can use adns), and any thread-capable OS won't have a problem. Everything else will just have to degrade gracefully to synchronous DNS, which will be fun. :-(
    • There's a two-pronged problem with fonts whose characters overlap outside their designated rectangular cell.
      • Firstly, we don't deal well with this. Each string passed to do_text() is clipped to the rectangle it should be in; but within that string there's still scope for overlap between character cells. If half the string is then updated then there will be artefacts left on the screen; I can't see any obvious fix except to always draw one character at a time, which is just ghastly.
      • Secondly, the resize-by-changing-font code has a tendency to choose fonts that cause this problem a lot. For bitmap fonts I think this is just a hazard of the job - if you ask PuTTY to resize a non- resizeable font, you can expect it to do a shoddy job at best - but it even happens slightly in Courier New (the very RH edge of the lower case m sometimes protrudes into the next character cell), which really isn't on. Sadly I have no idea how we can fix this in general - if we ask for a smaller width than we really want, then (a) we penalise well-behaved fonts, and (b) the spacing when drawing a large string will come out wrong.
    • Resizing the window is still pretty flaky. One particular current problem is: if you choose a font that fits 80 columns on your screen but not 132, then sending ESC[?3h to switch to 132-column mode will squish the font just enough to fit 132 columns in a full-width window. So far so good; but when you send ESC[?3l to return to 80 columns, really it would be nice if the window was put back the way it started out. Also there's some indication that the squishing doesn't work quite right; first PuTTY expands the window to full width, then it chooses a font size, and then it leaves a big border down each side of the window when that font size fails to fit quite right. Really it should recompute the window size once it knows the font size.

    Semi-bugs

    These are things which might be bugs or might not, depending on your precise definition of what a bug is.

    • PSCP ought to handle really really big (>2Gb) files. There's been a report that it doesn't do so properly. (Apparently this will only be meaningful under an NT-series OS; the 95 series inherently can't handle more than 2Gb in any case.)
    • Better handling of the connection closing, and of SSH_MSG_DISCONNECT being received. Ideally we should maintain our own idea of when and whether we expect to see a closure, and only signal clean exit when a closure or disconnect arrives that we were expecting. If one arrives unexpectedly it should count as an ungraceful closure, display a dialog box containing the text out of MSG_DISCONNECT, and not close the window unless the user selected "Always".
    • Opaque resizes under NT cause trouble when the user changes their mind and carefully drags the window back to the way it started out: the contents of the screen have been trashed and no resize event is sent to the server. Perhaps redisplay during resizing should be reimplemented in a way that doesn't change the terminal buffer's size at all.
    • Port forwarding upgrade: it would be nice to be able to (at least try to) reconfigure forwardings in Change Settings.
    • Interesting port forwarding feature: someone suggested that being able to choose which loopback address to bind to might be a useful feature (so that you could have separate forwardings listening on the same port of 127.0.0.1, 127.0.0.2, 127.0.0.3 and so on). The UI for this would probably work by specifying the address alongside the port number (bind local port 127.0.0.2:3456 instead of just 3456).
    • Apparently PuTTY doesn't correctly handle switching Windows keymaps in mid-session: the keymap in force when PuTTY starts up remains in force throughout. I have no idea what you have to do to fix this, so someone else will have to help me if it's ever going to be fixed.
    • Window placement is non-ideal. PuTTY creates a "guess" window of arbitrary size and then measures the difference between its full and client-area sizes; this allows it to precisely calculate the correct real size, and resize the window. Sadly this scuppers Windows's default-placement scheme. Unsure what should be done about this, but clearly something should.
    • It is claimed that MapVirtualKeyEx and ToAsciiEx don't work in Korean Win98 (although they're fine in other Korean Windows products); MapVirtualKey and ToAscii work fine. If anyone can reproduce this problem and work out a way for PuTTY to determine which pair of functions to use on any given system, that would be useful.
    • I have no idea whatsoever what the Unicode handling does about Hebrew and other right-to-left scripts. I have equally little idea what it should do. If someone who knows about these things could at least let me know of the answers to those questions, that would be a good start.

    Plausible feature wish list

    This list contains features I hope to get round to adding at some stage.

    • When you adjust the properties of a running session using the "Change Settings" menu option, it might be nice to be able to save the adjusted settings back to the saved-session slot you loaded from, or to a new session slot. This feature is one of the most requested, but is currently pending some design work:
      • If you load an existing saved session exactly "as is", by double-clicking or by running "putty @sessionname" or whatever, it's reasonably obvious that hitting the Save button in mid-session should write the changed details back to the same slot you loaded from.
      • What if you loaded the session, modified a setting or two, and then started it? Should a mid-session Save still write back to the original slot by default? It sounds as if it obviously should ... but what if the one setting you changed was the hostname? Suddenly I think it's no longer completely obvious that you should be conveniently able to overwrite your previous saved session with the new one.
      • So the user interface for this feature needs some serious thought; we have to have a means for working out precisely when it does and does not make sense to have an automatic save-to-where-we-loaded-from button available.
    • You should be able to specify only the SSH 2 protocol, i.e. have a mode in which PuTTY will refuse to connect rather than degrade to SSH 1. (For symmetry, perhaps vice versa as well, although I can't see an obvious use for it.)
    • An extra bell option that uses the PC speaker. I'm sure I remember reading once that you could access this using MessageBeep(0xFFFFFFFF), but when I tried that on Win2k it played the Windows Default Sound just like MB_OK. Anyone who knows how this is really done is welcome to let me know...
    • PSCP should allow cipher selection by other means than loading a PuTTY saved session.
    • PSCP should allow a user option to specify the Unix file permissions on files created at the remote end.
    • Now that PSCP supports SFTP as a back end, perhaps we should implement the reget/reput functionality with an extra command line option. Of course it would fail in an SCP1-type connection.
    • Pageant should offer a wider range of passphrase and key management options.
      • It should be possible to expire the passphrase on a key after a specified time, and also to load a key but defer requesting the passphrase until the key is first used.
      • Perhaps it should be possible for Pageant to remember the keys it has loaded and automatically reload them on restart.
      • It would also be nice to be able to invoke a second Pageant with a special command line, and have it delete keys from the main one or shut it down.
      • When loading more than one key in immediate succession, it might be nice to cache passphrases at least for the duration of that run, in case two keys have the same one.
    • Perhaps, for people who don't like dialog boxes, messages like "connection closed" and fatal errors should be configurable to appear inside the window instead of popping up sudden message boxes. If we do this, we should probably include a means of distinguishing that sort of error output from anything the remote site can possibly send.
    • Perhaps Shift-Backspace could do whichever of ^H and ^? normal Backspace isn't doing. Apart from anything else this would make documentation of the Backspace functionality switch easier (we could invite users to try Shift-Backspace if just Backspace doesn't work, and this would be a clear indication that they needed to frob that switch).
    • PuTTY should do something sensible if the user key it's given in the configuration matches one of the ones in Pageant. (In particular, if it tries the one in Pageant and the server refuses it, it shouldn't then try it again.)
    • When doing a local-to-remote copy using PSCP, perhaps it could check the source filespec before attempting to connect to the host. That would save time and effort by notifying the user of a typo sooner than otherwise.
    • When selecting with the mouse, it might make sense for further incoming data to be buffered until the user lets go, so that they aren't trying to work with a moving target. This might also be nice when scrolling with the scrollbar.
    • Allow the "ANSI Green" used for foregrounds to be different from the one used for backgrounds (for all values of "Green").
    • Terminal settings that are modifiable from "Change Settings" but which only control an initial state should be handled better. Perhaps a sensible procedure would be that if the user changes such a setting, then when they hit Apply they get a message box: "You have modified the initial state of the Foo setting. This change will take effect the next time your terminal is reset. Do you want to force it to take effect immediately as well? [yes] [no]".
    • Perhaps an inactive window should have a menu option to reactivate the session (like Duplicate Session but in the same window).
    • A second font selection for 132-column mode. Perhaps, in general, the ability to select multiple fonts and switch between them quickly?
    • Ability to configure font quality (the fdwQuality parameter to CreateFont). Choices should include "antialiased", "non-antialiased", "ClearType", "default".
    • There have been various requests to have various config options available conveniently in the System menu instead of having to go all the way to Change Settings. A particularly common request is the ability to turn logging on and off quickly.
    • PSCP should be able to send its log messages to stdout instead of stderr, since Windows doesn't provide any easy way to redirect stderr.
    • Ctrl-PgUp and Ctrl-PgDn to scroll by one line at a time.
    • Command line options, in general. In particular, SSH protocol, cipher and compression selection in the auxiliary utilities (PSCP etc). The command-line utilities should also be able to specify an identity file using the standard option, because this might enable the WinCVS GUI identity-file chooser to work with Plink.
    • Users from countries (is it only the US?) that don't need the AltGr key might like to have an option that makes it work the same way as the left Alt key.
    • Allow saving of the current screen+scrollback state to a file. Or printing it, possibly.
    • One user suggested a search facility for finding text in the scrollback. Full-blown regexp-style grep is probably overkill, but a Notepad-esque search box (select up/down search direction, select case sensitivity, type your text and go) might be feasible.
    • It might be generous if we skipped whitespace when parsing IP addresses in the Host Name box.
    • Possibly copy/paste should be implicit in the mouse only within one window. Not convinced. Certainly the current behaviour would be available by configuration (and probably still the default too).
    • Extra features in pasting. Perhaps PuTTY could somehow remember which on-screen spaces had been output as the result of a tab character, and which were genuine spaces, and reproduce that when copying to the clipboard. Likewise, perhaps, trailing spaces. Also, since we now allow RTF pasting, perhaps it could paste style information (bold, italic etc) alongside. Probably at least some of these features will want to be configurable off, since I can imagine them causing trouble in some situations.
    • Perhaps (configurably) we could do the X trick of emulating the middle button when both buttons are pressed, to improve X exiles' experience of PuTTY's mouse handling.
    • Some means of categorising saved sessions, for people who have lots.
    • Someone suggested adaptive ordering in the saved session box (a new session is placed in the middle of the list, and whenever you use a session it moves up by one, so the commonly-used ones end up at the top of the list). Not sure about this one at all, but it's worth at least considering.
    • WM_PASTE and drag&drop support.
    • Possibly support OpenSSH's host key policy: file each host key under a (hostname,IP) pair, so as to be able to deal with one hostname mapping to a cluster of several IPs with different host keys. First think through all the implications and work out whether we really want to do this. Also, for the benefit of really weird network setups, be able to explicitly specify what name to store a host key under.
    • Remapping of keypad-Delete to ^? as an option. Also, optional remapping of Home/End to ^A/^E. And one user wanted a user-definable F5 sequence. And several users want the block above the arrow keys to be mapped in the LK450 layout. Maybe a generic key remapping facility, though that would probably be horrible to implement...
    • Perhaps copy and paste in the Windows style: ^C/^V or ShiftIns/CtrlIns. (Note that we already have ShiftIns as paste, so this would have to be a configurable option that disabled the existing copy-on-selection.) Also, perhaps, (copy) and paste options on the System menu, and/or the toolbar (if we add one). And, in fact, if the user selects Windows-style copy/paste instead of the X style, then the right mouse button will be free to bring up a context menu that can have "Copy" and "Paste" options.
    • Make selection colours configurable rather than forcing them to be inverse-of-current. But still need inverse-of-current as an option. Come up with a sane UI for this and then implement it.
    • Allow the user to select a different default colour for underlined text, and a different default background colour for bold text, and so on. Not everybody wants true WYSIWYG in attribute rendering. Also, consider the possibility of changing fonts for some of these criteria (might be useful for people with low vision).
    • Some support for the generality of SSH 2, in the sense that it's not necessary to start a shell; you can make a connection and just do port forwarding, for example.
    • Think about pre-building a bitmap for better scrolling, or possibly just doing the old scroll optimisations over again and getting them right.
    • Possibly line-end conversion in pscp. An option to turn it on, an option (enabled by default) to turn it off, and perhaps an option to try to auto-detect whether to turn it on or not. (Anyone know a good heuristic for distinguishing text from binary files? infozip has one, as does less; anyone want to comment on which is better or whether there are better still?)
    • Port to other OSes: Unix/X (need a local-xterm back end), BeOS (likewise).
    • Perhaps a screen-clear should push the previous screen contents into the scrollback?
    • Toolbar, maybe. Certainly optional, if so.
    • Optional status bar with various information on it. A visible indicator of whether the connection is secured or not (for the paranoids who aren't sure whether they remembered to hit the SSH button); a display of the cursor coordinates; whether the terminal bell is currently overloaded; some sort of visual representation of the host key perhaps. Anything else that springs to mind.
    • Menu bar, to go with the toolbar. Definitely optional. Option for cut and paste to be in the Windows style and/or via the menu/tool bars.
    • The default-foreground and default-background colour selection should have an option to go with the Windows colour scheme.
    • It would be nice to maintain our own terminfo/termcap description of the terminal emulated by PuTTY, as an alternative to having PuTTY claim to be an xterm and hoping everybody's xterms behave similarly.
    • Possibly more encryptions? IDEA is out due to the patent restrictions being incompatible with the PuTTY licence; RC4 would probably be doable if anyone actually wants it; Twofish and Serpent would both be feasible.
    • Ability to select a preference order of authentications.
    • Ability to connect to a serial port as well as a Telnet or SSH connection. Also, ability to run a local command interpreter in a pipe (probably an NT-only feature).
    • Support for proxies. There are several types of proxy to consider:
      • SOCKS.
      • HTTP CONNECT style proxying (connect to the HTTP port and send something like "CONNECT hostname.example.com:22 HTTP/1.0", then parse the HTTP return headers and go)
      • Simple by-hand proxy: the kind where you telnet to the firewall and type "connect hostname.example.com 22", and then expect a connection to begin.
      We would also want the ability to define non-proxy zones (probably give the user the choice of DNS or IP address space).
    • Ability to cache host keys and settings in a file as well as the registry, so that people can (for example) easily carry a complete PuTTY setup around on a floppy.
    • Ability to store PuTTY host keys and settings in HKEY_ALL_USERS as well as HKEY_CURRENT_USER, so that sysadmins can set up a default set of host keys (for example, all the servers in a company) to spare some classes of user the constant "new host key" messages. Also so that sysadmins can provide a default set of saved sessions or local Default Settings (sensible local proxy support springs to mind once it's implemented) but this MUST be a default only and the user MUST be able to override all of it using settings in HKEY_CURRENT_USER.
    • Inheritable saved sessions. The way I see this working is that you'd have a button marked "Inherit" next to the "Load" button. Selecting an existing saved session and clicking this would give you a weird-looking config box in which all the features had an indicator beside them saying they were inherited from the parent session. Modifying any setting would clear this indicator; clicking the indicator would set it and revert the setting to the way it is in the parent. You could then save and launch this session in the usual way - but if you modified a setting in the parent session which was inherited rather than locally modified in the child, then the child's setting would change. So, for example, you could have most of your day-to-day sessions _inherit_ from Default Settings rather than copying it, so if you found a nicer font you could change them all in one go. Of course there'd be no reason an inherited session couldn't inherit from another inherited session.
    • PSFTP could do with more features: options and wildcards to ls (-l etc), and perhaps recursive transfer of whole directories like scp. (After all, we can do this in SFTP already!)
    • Perhaps PSCP (and possibly Plink and PSFTP and other potential command-line type tools) should be able to read some default command-line options from an environment variable? Note that if we did this we would also need to supply a negative form of every option, so that a user could always choose to turn off an option that the environment variable had turned on.
    • Scripting support, so you can have PuTTY perform automatic tasks. (Such as remembering your password for you, although I don't recommend this on grounds of security!)
    • Extract all the user-visible text to a single location, so it can be easily replaced with a set of translations into other languages. It's not yet clear whether we want to do this at compile time, post-compile time, or using a Windows string resource (probably not the latter since we will eventually be porting to non-Windows environments).

    Implausible feature wish list

    These are features I will probably never get round to adding myself. I wouldn't be opposed to seeing them written, but if it happens somebody else will have to do it, because they're big and complicated and I wouldn't use them enough myself to justify spending all that effort.

    • Improved ANSI printer control support. Squirting raw data out to a random printer is all very well for people who already have their remote application configured with a driver for their specific printer, but not ideal if you just want to send a text file and have it print in a sensible sort of way. I'd like an alternative printing mode using the Windows graphical printing API (where the printing application has to draw on the page like a canvas), doing the layout myself. Advantages include being able to guarantee the right number of columns and rows per page, being able to let the user select portrait/landscape, and possibly also doing some escape-sequence parsing on the input data stream to handle a variety of simple control codes (DEC/ANSI and PCL both spring to mind, and I think the simple ones of these could both be supported at once without clashes requiring user-level configuration).
    • X11 forwarding currently doesn't even attempt to authenticate with the local X server. In order for it to do so, PuTTY would have to know where to look for authentication data. It would be nice if this were to happen.
    • A GUI SFTP client. (Possibly it should also be able to use SCP but with massively reduced functionality.) Writing big complex GUIs is hard work and I simply don't have the effort to spare.
    • SRP support, as an alternative to pure password authentication. Possibly also in Telnet.
    • Zmodem file transfers.
    • An option in Plink to handle terminal escape codes, so that you get "PuTTY in a console window", and so you can run it full-screen.
    • Somebody requested "Kerberos 5 credential forwarding". I don't know anything about Kerberos, so if this gets done it will have to be done by somebody who does.
    • Support for various international input methods. There's been a report from the Netherlands of an "international keyboard driver" which allows you to enter, for example, an "Ë" just by typing a double quote and then an E. I believe there are also Eastern input mechanisms we don't handle sensibly. Somebody who knows about this stuff will have to do it for me and probably explain it to me as well, because I just don't know enough about internationalisation.
    • There's been one request for SSL. (SSL/Telnet in particular; possibly also raw-SSL in order to talk directly to HTTPS?) Most of the SSL protocol looks reasonably sane, except for the certificates (ASN.1 and X509 and other buzzwords). If the certificate processing turns out to take too much code, SSL might not make it into the PuTTY core for size reasons - it would have to be compiled in specially, or perhaps shipped as a separate DLL.
    • A lot of people seem to want a single PuTTY to be able to manage multiple connections. Some want an MDI-style application, with one large main window containing several session windows; other people want the window to stay the same size and the multiple sessions to be selected by Alt-F1, Alt-F2 etc., or by selecting tabs on the window. This is a huge amount of work, because for a start it would need most of the code reworking to be able to deal with more than one instance of an SSH connection or a terminal (currently, each PuTTY connection is an entirely separate process). In addition I'd want a strong guarantee of reliability (if one session crashes, can it avoid taking the other nine down?). Also I'd want to be able to configure PuTTY to be just the way it is now, because not everybody likes the idea of all their sessions being bound together in a single window; and finally I'd want to be convinced that the code size increase wouldn't be excessive. This is close to being a non-wish, in fact, unless someone can convince me it's really worth its while.

    Non-wish list

    These are features I am actively opposed to seeing in PuTTY. Don't bother writing them and sending them to me! If you think you have a good argument why they would be good, feel free to plead for them, but generally I'll already have a good reason not to do them.

    • Use of the System tray. So many people have requested this that I think it's a genuine desirable feature, but I don't want it to bloat the core of PuTTY. Therefore, it should be implemented using a separate program. There are a variety of programs out there already that do this. Here are some links to them.
    • The ability to specify the precise position on the screen you want your PuTTY window to open at. This is clearly a very useful thing to have, but it would be just as useful for all the other Windows apps anyone uses. It shouldn't be the responsibility of every single program to include a configuration option to specify window position. Instead, it should be the responsibility of the Windows system itself, or a third-party program, to remember where you like individual programs to go.
      One such program is ZMover (shareware); another is HandyThing (free as in beer). If anyone knows of a free (as in speech) one, I'd like to hear about it.
    • An option to automatically accept all SSH host keys. For some reason lots of people seem to think this would be a really useful feature. I'm sure it would be very convenient, but at the expense of security! The whole point of host keys is that they're the only guarantee you have that your connection hasn't been hijacked by an active attacker between you and the server, and that your data isn't being decrypted by the attacker and re-encrypted. If you want to schedule an automated batch job to use PSCP or Plink, and the interactive host key prompt is making this difficult, add the correct host key to the registry ahead of time. That way you still get the convenience, but without losing the security. We will not accept a command line option to turn off host key checking, no matter how many people have already done the work and send us polished production-quality patches.
    • A transparent, semi-transparent or alpha-blended PuTTY window. We think this is pointless frippery and would bloat the binary to no useful purpose. Furthermore, there are third-party utilities which will do this for you without us needing to modify PuTTY; have a look at PowerMenu and also Glass2k.


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Revision-number: 2497 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2003-01-08T13:27:49.000000Z K 7 svn:log V 42 Add other necessary things to .cvsignore. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 94 Content-length: 94 K 10 svn:ignore V 62 old*.html 0.* wishlist faq.html feedback.html putty-cvs.tar.gz PROPS-END Node-path: putty-website/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8a619fb646c5b2a593f485efa1bd8847 Text-delta-base-sha1: 44fd870555116350acb56ed3f1a5d0ac855703bc Text-content-length: 73 Text-content-md5: 21fe1e6000f4e0b13dcce99a6c325dd3 Text-content-sha1: 95eac8b7c2fa7b42c690f07dcf924967ebe809de Content-length: 112 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN ??old*.html 0.* wishlist faq.html feedback.html putty-cvs.tar.gz Revision-number: 2498 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2003-01-08T13:27:58.000000Z K 7 svn:log V 28 Add the public-keys subdir. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/keys Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: putty-website/keys/master-dsa.asc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1133 Text-content-md5: 87dc4c6bc06cf4c647ca3c61720d751b Text-content-sha1: fc326444a2247a94855010afb52e37be8f5be9b0 Content-length: 1249 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN___-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.4 (GNU/Linux) Comment: For info see http://www.gnupg.org mQGiBDpA3DMRBADD6No+1jBP50VEjXR1EpvNBZAsl1kPTuc1zDE/0a3a+8FuQHCA O0ewcKPqoqKGxXq6qWE7Yn904Jyhd+BUIOwrQZ5Bb/phvVMKn5VVXlYEkaT4SQLK xWyP+GUkQIWi9VgG9oi+0m47vmjtD124sNhliZZjnSKzw2ZcMI7SgR8QbwCghN0H QCN3bR50KrobacmFubhv/kEEALymrb606Ko6kvIYgs1vol84qdgBE0EU7md9xglB UXEVoBbwT614TUPGiQcemA1OS503zJuyl4/sFrRQJwjmFXmb1UaL5/20OEJbeE8l 23CUoQtvuwGqgcT8PS0soDW0S1UTGCYQbr9gcLr9853hxaJT4sB16i2USk7+bc4x ys1ZBACqhII3Bz0Zb+m7lmJPXPT2u3N6UpeMfQYVjG37Kf+XFdQXT2aZSJqf5hZ7 yj5uv3FPMu6TZGd68svgJLT46jiexkUTzLUbyMAWIEXUd/3v8Pe3fAImHIotgX5D uQwtBzeLJ+LEi2tsaHtJVPAotb96uTOVp4IkzaAwNw9bh2S81LQ2UHVUVFkgTWFz dGVyIEtleSAoRFNBKSA8cHV0dHktYnVnc0BsaXN0cy50YXJ0YXJ1cy5vcmc+iFcE ExECABcFAjpA3DMFCwcKAwQDFQMCAxYCAQIXgAAKCRBPXm31apOzToO1AJ4hHE5B KI3Y3diaCoRGie7qbQ4sbACeOVDfmsk/czRfYbKf5TjvlKP0MdCIRgQQEQIABgUC OkDdxgAKCRD+zW8/CLCpC4XPAKDvukujVb1lGqiMPN6eX0KRoEY5AACgqJq5oVgl YsfSyQEx9l6UQ1pINeuIRgQQEQIABgUCOkDd0gAKCRAWXlb3fT5KAByjAJ0R4bvl KgzCOwmVY1qEL6Sszad1WgCeOqSodzYKAQZJuEGxjJCDGvppTZ0= =4IHC -----END PGP PUBLIC KEY BLOCK----- Node-path: putty-website/keys/master-rsa.asc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1060 Text-content-md5: aa53a5245e3a80f8656aca26cdf40f9d Text-content-sha1: ca208696fea3efa8eae2dce0d35cf642737753f0 Content-length: 1176 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.4 (GNU/Linux) Comment: For info see http://www.gnupg.org mQCNAzpA2dAAAAEEAOJbNCRVjkHbwMTxKMastY3kFY/gVP37Q/yVSjtSEVuHk/0s F9AQOg/AbvEuEdVQQUicKgU6YM3l/9eIF0D+M1uIhNNoz3z9ac1LbV6B94O0UGXv Y2ycLzCdr/5MmlyJEqX8Kqea5tdedWo3n7g5Goo+UquBdTJMJZ1Yd78eNKxBAAUR tDZQdVRUWSBNYXN0ZXIgS2V5IChSU0EpIDxwdXR0eS1idWdzQGxpc3RzLnRhcnRh cnVzLm9yZz6JAJUDBRA6QNnQnVh3vx40rEEBARJsBADF4ucNP4lFRiAoWSMxOO/j qHbyhJxyjm6DV7WcI0MGKVVEbFl8LZiwjPz5xgHzGoALAc3KYojsr279hr8GF+S6 CNYn35+7BlaUl69pC4fifnRmrZ4HjO1EHX3RBsKr0E67eSWbISqERgCZcWJTN1r/ v8JdceWMaB2EGx1uUwsFIYkAlQMFEDpA2zDvOczAtByuKQEBMc8D/in3wASHJ8uR mnqZqeUG1smmmogBqRHDem5o/FK/hXrIy4ZXmbKd0PRTHW0y+31NrOOGuOdwvKRq h+J9rd4m0Idglfg6GnTUW2xVngahMXI4opn//l9A2WD8I7ZmKbX+24K5M/d6b+aJ uj1JkilPgLmo9jiCAqxE6Nr0tEpMnKHCiQCVAwUQOkDbIPqu0hUyuQOpAQGRAQP/ XRUkHo4KQUgVXo1zCX21qRtYDBUFFXsEi4l6256Jt6cadBDamh2igA/cvj5Mw/65 2wzsrMZ+lp/N/7qxR2iSK+2IGNd5PNrSindCxy/IHflNXWko2faXLRst1xKKyWgm CLYRP8pN9i+NiFUk2pQ4prgwVzt3SsHRPttb5Gbr4YI= =JVTM -----END PGP PUBLIC KEY BLOCK----- Node-path: putty-website/keys/release-dsa.asc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1032 Text-content-md5: 89f7fd552c05e67e0bf6f1c5493c3fbd Text-content-sha1: 5c27b1ebc3d5eee333f88dec127cb0e52cb2c7ea Content-length: 1148 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNzzz-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.4 (GNU/Linux) Comment: For info see http://www.gnupg.org mQGiBDpA3RQRBADyLI//HvAdfuSf6squ3EbgBy3trQXMPZWY/j4TBzcbRr7VosCg RIy5LiYHoKj7Agxe23i6qMrrqav0TMkjETVSDtT3e5EKs5EH8T3YeSxNrV4Fnom+ kOKwLAw4e+d+586jbCVHBvPIn1PLT000RyJsZrF9tafTWTFvkndSULfntwCg//SP VKnD5eYLWeYNnNRlmSkqta0EAPDNP46+OxmDYqf6rpel2KTC21QVXVm47sVKqh2F Q8lmNjaT+vcBkFyECFcYXFqUTJLdIdPF22mV4Z75910mk7e2FkqOn41nKr3CIaqC VohC1gb6KwlKcpJOStv4a5Uwovy2o9QsZj2QxT1l4+GMaqgEnDzrjbE29Tw18rbE EeOKA/4649VzuwjR9MZM2FQFXw/BOUiD09cyzHIqmJ7mqKtdSz6J7nQy2gp3XyFS 0lzAnCasQBQBNce9zOsw5MLmG1QSLpP7uwSADPWJNulkC7U3pjGCZScsRWMdmlyL c5Y0Hyk3Y7/lb0GHTx0DrZi6QtEH6xb5g0tMTB3wGETzAthtxbQ0UHVUVFkgUmVs ZWFzZXMgKERTQSkgPHB1dHR5LWJ1Z3NAbGlzdHMudGFydGFydXMub3JnPohXBBMR AgAXBQI6QN0UBQsHCgMEAxUDAgMWAgECF4AACgkQ/s1vPwiwqQvZjgCdHNrFfaNk 6fVxRig0eYc5bE81DJkAnRlMySN7JGPX6HXRcRnU57J2tfjtiEYEEBECAAYFAjpA 3WYACgkQT15t9WqTs06btwCfXXFX8bQfxo0PnKeIGG3Wq0vvC34AnirQtYhNVS/v 4q8p8E5tu/aux3nC =UQ7G -----END PGP PUBLIC KEY BLOCK----- Node-path: putty-website/keys/release-rsa.asc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 853 Text-content-md5: fad3cc9d09e91d4976321e1694550aac Text-content-sha1: 40d4b10be8bf0d379f32eb03c69d8290fc3cd737 Content-length: 969 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNGGG-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.4 (GNU/Linux) Comment: For info see http://www.gnupg.org mQCNAzpA2ZYAAAEEAKxRyqIqZxKktdbrPo/OUj/4ij+yNIC8oBTVNgt3+NcAgFKI lPxjRKkrNFMrmXPaKRLp8/TS5Z46nSgG44d58G/5clu7IVge2YlCpvoIfo3ute2U UbBvXCJFVK5ePhNzQX8nGibmejxo8wF5CShyifhmoyfd96cf9u85zMC0HK4pAAUR tDRQdVRUWSBSZWxlYXNlcyAoUlNBKSA8cHV0dHktYnVnc0BsaXN0cy50YXJ0YXJ1 cy5vcmc+iQCVAwUQOkDZlu85zMC0HK4pAQG7XQP6AlJiPCmN7PMz92LhqNbK4B1Y WtNCcDKz1wZZow2OrQW79SZ+I6RqWC/z/1YKIgYY30aE2UtY9OMUYlQ+I08rsYC4 hNxNY4JvyyP9AT7wiJlpvdWtD590Z5DYwdSTeZg8w0N3NvCJ6m3ivFHiEZuJcZjd cfPQziUxGjQi6HzG+seJAJUDBRA6QNrinVh3vx40rEEBAfM0A/9vCcf0Kj5ebQ6d 1oJmvOvp85jCy0Kwq4laatx8u9EhuKr0cSIFYLs64u3nwvTH2kRrlKRTqbdglA/D yYBSdHwSzJ1LoQFARMVD7rxc8VIwNhZSwze3Tafp3iToiG/wTb6GE8rnPS+ExAja LcrXlt1MbO1jFunrxKc3bwqez6ahvw== =t5QN -----END PGP PUBLIC KEY BLOCK----- Node-path: putty-website/keys/snapshot-dsa.asc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1052 Text-content-md5: 564a4f0f6c15b2fe423b312e443c8f42 Text-content-sha1: 5b7bc6369cda1d42f11fe8bc37cde57dcf46e6cd Content-length: 1168 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.4 (GNU/Linux) Comment: For info see http://www.gnupg.org mQGiBDpA3JIRBADinMNE/ShdHrlyj8FlEvnfOpFz40hWUp8RzDBguT14OjOLBXZG kwC0sqzjNITaKuC+lFFL0335qHoItkDUX7phz9/oVC7BkeTQ0fn1pOVvnTu3TOlV 8EGstK7V0PhYcCxGMQlZf5po56OQFbeib0a8b6AIaoCYEZjqPQOLsWrUywCgouk2 Wt6CjDUhnOPKF3hMdkZF5DcEAJQjIzzmFyT4/l/L2+hLDWtIp3kocJ/Q5Dm9l6uM e1AXNqGccOzMrqX9qyBeGG2WXkwx8/wnVYsPnQ5P1rcYNnw7UzE9x2wRUmnFmzRi TnssxPDN7lcHZ0CIvodQYB+YtyIwIeyn9DD6KQ4dh3ifXsfxxCfshTTzdBSyeimm c9cLBACPaP1yceo+mqkn1t+I47b2c0xwaqoHdIWBQyWmG9Umj+pwi6XJ/7VvbY/g 0K6NH+6fbxkEt81u3r9SRz+7rSPqg7rJxvFc3kPctXMxYf+/w/nyFGevb0CZ5Bl6 rly9/mSw7B1mRGK5zOL9Dtw4+1HRZt4esHzcizRBX16XlLLdCrRBUHVUVFkgRGV2 ZWxvcG1lbnQgU25hcHNob3RzIChEU0EpIDxwdXR0eS1idWdzQGxpc3RzLnRhcnRh cnVzLm9yZz6IVwQTEQIAFwUCOkDckgULBwoDBAMVAwIDFgIBAheAAAoJEBZeVvd9 PkoANUgAoIM3eWq4k6wj1W8Pt9KSd5fj6r8NAJ4vqJEWFpi49P5w+b90x3cU6Z6X x4hGBBARAgAGBQI6QN2ZAAoJEE9ebfVqk7NOZwEAn1vedkLiPA1Mlfe9jqCVjLQj Abd0AJ9TTjziPq2VdKE8xOOdnDcGXI5xxQ== =xjIk -----END PGP PUBLIC KEY BLOCK----- Node-path: putty-website/keys/snapshot-rsa.asc Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 869 Text-content-md5: b53b492ac612b8f485101556cc7be4e3 Text-content-sha1: 907eb77083c17f5a50d1656f063b568c6602c1ec Content-length: 985 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNWWW-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.4 (GNU/Linux) Comment: For info see http://www.gnupg.org mQCNAzpA2UkAAAEEALgNOtBuFxcjh4uFUGK9I6dTKcAJopqb5DHkmSzdANNihlRy wOBqeOPz6Zku4oO0P3gP8/krbAgc4vrB4FWaeKQttflaeIvPUDyNMljRVz4D5HAq hVTaCSbOdOV8uzaN0NtNilszwWbXYzoli+ThsVDU4yAh366ccPqu0hUyuQOpAAUR tEFQdVRUWSBEZXZlbG9wbWVudCBTbmFwc2hvdHMgKFJTQSkgPHB1dHR5LWJ1Z3NA bGlzdHMudGFydGFydXMub3JnPokAlQMFEDpA2Un6rtIVMrkDqQEBhTwD/2waxJ2h RbcUZ9qtDX4PASZ5h+IJXPDhgLUgk+xO7LW+qGUGbM+x11BH75rCORw7C1GWT2rw iTzPpoVfqt2xptWjEYamAoopnTrYtx3EzbqfKHSnBOMISeYD8PXbRMKjTPNeN5PS KJJXuefla25WnmsyvH+DXbpwDouuRsM1OSALiQCVAwUQOkDa8p1Yd78eNKxBAQGo cAP/RJl+I9uMnbqrRdGho6HyHRyU+FDCbuVi0HGFpHaPVyKJ8TTX6zAWLCAbyB+x ezP58zNc77MbYvOnYveQ/oAVFeeARObZYg2YrRDJ80bh5MV6KAUux2IadCw6qIr0 0bu9P8/5TAinuRBXzEcQUECc2xVaXm2uAu98mtl4bbBnpRA= =4Z8l -----END PGP PUBLIC KEY BLOCK----- Revision-number: 2499 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2003-01-08T16:21:28.000000Z K 7 svn:log V 72 Actually, it looks like PuTTY does support the "user" part of userinfo. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/telnet-url-userinfo Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5e19ebed05c58903210787490731f0c5 Text-delta-base-sha1: cb39253933557f2ad96e23047c2b7f4b030706e0 Text-content-length: 149 Text-content-md5: d3f18bb60a10c5494d7247a6b9647f67 Text-content-sha1: 3157e23cfabe07d9a217b9963a203b9050f8bc38 Content-length: 188 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNj! password to log in with. PuTTY doesn't currently support this. PuTTY should at least be capable of ignoring it if it's present. Revision-number: 2500 Prop-content-length: 310 Content-length: 310 K 8 svn:date V 27 2003-01-08T22:46:12.000000Z K 7 svn:log V 211 Fairly major hackery to get SSH going on the Mac. Half the support functions are only dummy stubs, but it's still minimally usable. At least, as long as you don't want to do anything complex like logging out. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 581a755228fe981bdf1b8964227959ef Text-delta-base-sha1: 5879206ca975c5a75f396e4ee62c94b323bf0d96 Text-content-length: 191 Text-content-md5: b2a879bead3a43cc56143bf57b496316 Text-content-sha1: 72c95a054c16680bc39d7e9d3c4f5cfd5b93a464 Content-length: 231 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNo5,>+~hFhoMACSSH = SSH macnoiseversionucs logging be_allSSH MACMISC CHARSET + stricmp vsnprint PuTTYtel : [M] terminal wcwidth ldiscucs logging be_none Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1313d1a56846886a2b8d32bc7f6a6e52 Text-delta-base-sha1: d479898305a868624e1bd350bc06afb59fdccfe5 Text-content-length: 1008 Text-content-md5: c9b11cf7c895fa05011878c5abc360a7 Text-content-sha1: e3d92e6a8fe59a3932bda5f165b7498c214cda25 Content-length: 1048 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNB8+'(c7o0T$rt se#O@/* $Id: mac.c,v 1.20 2003/01/08 22:46:12ssh.h" #include "mac.h" QDGlobals qd; Session *sesslistcleanup_exit flags = FLAG_INTERACTIVE; /* * Really grotty hack to ensure that anything that looks at the * global "cfg" variable gets something vaguely sensible. * Obviously, nothing should actually be using it, but that will * take a while to arrange. */ do_defaults(NULL, &cfg) mac_polltermcleanup_exit(0void cleanup_exit(int status) status Null SSH agent client -- never finds an agent. */ int agent_exists(void) { return FALSE; } void agent_query(void *in, int inlen, void **out, int *outlen) { *out = NULL; *outlen = 0; } /* Temporary null routines for testing. */ 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 old_keyfile_warning(void) { Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 46eb8f68d559445b75e2462c0475fd2f Text-delta-base-sha1: 792c798f0d74344fbe1c77e8f7d7d0ff7af7d8d3 Text-content-length: 196 Text-content-md5: b0a5cc22729aeb30c6dc6bfe8d7b2c40 Text-content-sha1: 52978131c1523cfc7997a368ac6f09ba7b8bc975 Content-length: 236 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNV=f-Session { struct Session *next; struct Session **prev;extern Session *sesslistpollterm(voidputty_dir(Boolean makeit, short *pVRefNum, long *pDirID); Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 629184b46866ec7becd7a390c1459750 Text-delta-base-sha1: ebc365507871d0d384fcf9e13a6a2731c211cc15 Text-content-length: 2333 Text-content-md5: 3a284626a099184a0af972f0a80074e9 Text-content-sha1: ff6ccbb62d7eb866c91993ab3072a5a8a55a4aa0 Content-length: 2372 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN'e5\,_,r:NmAXE: h1ANY/* $Id: macstore.c,v 1.7 2003/01/08 22:46:12#define SEED_TYPE FOUR_CHAR_CODE('Seedputty_dir(Boolean makeit, short *pVRefNum, long *pDirID) { OSErr error = noErr; short prefVRefNum; FSSpec puttydir; long prefDirID, putty*pVRefNum = prefVRefNum; *pDirID = puttyDirID; out: return error; }uttyVRefNum; FSSpec sessdir; long puttyDirID, sessDirID; error = get_putty_dir(makeit, &puttyVRefNum, &puttyDirID); if (error != noErr) goto out; error = FSMakeFSSpec(puttyutty#define SEED_SIZE 512 void read_random_seed(noise_consumer_t consumer) { short puttyVRefNum; long puttyDirID; OSErr error; char buf[SEED_SIZE]; short refnum; long count = SEED_SIZE; if (get_putty_dir(kDontCreateFolder, &puttyVRefNum, &puttyDirID) != noErr) return; if (HOpenDF(puttyVRefNum, puttyDirID, "\pPuTTY Random Seed", fsRdPerm, &refnum) != noErr) return; error = FSRead(refnum, &count, buf); if (error != noErr && error != eofErr) return; (*consumer)(buf, count); FSClose(refnum); } void write_random_seed(void *data, int len) { short puttyVRefNum, tmpVRefNum; long puttyDirID, tmpDirID; OSErr error; FSSpec dstfile, tmpfile; short refnum; long count = len; if (get_putty_dir(kCreateFolder, &puttyVRefNum, &puttyDirID) != noErr) return; error = FSMakeFSSpec(puttyVRefNum, puttyDirID, "\pPuTTY Random Seed", &dstfile); if (error != noErr && error != fnfErr) return; /* Create a temporary file to save to first. */ error = FindFolder(puttyreturn; error = FSMakeFSSpec(tmpVRefNum, tmpDirID, "\pPuTTY Random Seed", &tmpfile); if (error != noErr && error != fnfErr) return; if (error == noErr) { error = FSpDelete(&tmpfile); if (error != noErr) return; } error = FSpCreate(&tmpfile, PUTTY_CREATOR, SEED_TYPE, smRoman); if (error != noErr) return; if (FSpOpenDF(&tmpfile, fsWrPerm, &refnum) != noErr) goto fail; if (FSWrite(refnum, &count, data) != noErr) goto fail2; if (FSClose(refnum) != noErr) goto fail; if (FSpExchangeFiles(&tmpfile, &dstfile) != noErr) goto fail; if (FSpDelete(&tmpfile) != noErr) return; return; fail2: FSClose(refnum); fail: FSpDelete(&tmpfile); } Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 34371096ead267f98e2142580033cf82 Text-delta-base-sha1: 19d789258bf8bc5cf9407276a590ded5f626e407 Text-content-length: 370 Text-content-md5: 3acbc98364f1e0f5878e67285dcbe8c3 Text-content-sha1: 24743531c9048f6cc2dfa8ec3be69d816cba4465 Content-length: 410 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN=O?,cui@:]/* $Id: macterm.c,v 1.36 2003/01/08 22:46:12 s->next = sesslist; s->prev = s->next->prev; s->next->prev = &s->next; sesslist = s/* * Called every time round the event loop. */ void mac_pollterm(void) { Session *s; for (s = sesslist; s != NULL; s = s->next) { term_out(s->term); term_update(s->term); } } Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e98524d202653e52f3cc7fc632ecadbe Text-delta-base-sha1: b5f5bf88db9ee0deac85f82adcdfc34b43055a0b Text-content-length: 541 Text-content-md5: 8eaa50717002cc49ec5baa1576186569 Text-content-sha1: 1674085cec79087138c4367c8f6efea6d9ee7d2d Content-length: 580 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN?4[_Iw)06H8CcNEF?$return ret; }register(void *sock, Plug plug) { fatalbox("sk_registerif (ret->err != noErr) return (Socket)retret->next->prev = &ret->next; mactcp.socklist = ret; return (Socket)ret; } Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only) { fatalbox("sk_newlistener") MacTCP doesn't have a services database. */ int net_service_lookup(char *service) { return 0; } /* * Local Variables: * c-file-style: "simon" * End: */ Revision-number: 2501 Prop-content-length: 255 Content-length: 255 K 8 svn:date V 27 2003-01-08T22:48:57.000000Z K 7 svn:log V 156 The CFM-68K build isn't working at the moment (we blow past its global data limit what with libcharset and the crypto stuff), so don't include it in "all". K 10 svn:author V 3 ben PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 622850960adf6c7dc2895e22d6ca855b Text-delta-base-sha1: ab02284bcf29f384d714131127752b7e6f6970a6 Text-content-length: 24 Text-content-md5: d0c68a88e5929e2c9268d64078daca7e Text-content-sha1: 33bc429264bc02d505230765bb3fc5278198ad37 Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVNre R Revision-number: 2502 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2003-01-08T23:56:48.000000Z K 7 svn:log V 74 Rather useless entropy-collection functions for Mac OS. These need work. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macnoise.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1403 Text-content-md5: 098c7a6fa719d4ea4e924646c95ecd40 Text-content-sha1: 3016ae13030f6ecddbea38f8ce992f55cc751272 Content-length: 1519 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNmmm/* * Noise generation for PuTTY's cryptographic random number * generator. */ #include #include #include "putty.h" #include "ssh.h" #include "storage.h" /* * This function is called once, at PuTTY startup, and will do some * seriously silly things like listing directories and getting disk * free space and a process snapshot. */ void noise_get_heavy(void (*func) (void *, int)) { read_random_seed(func); /* Update the seed immediately, in case another instance uses it. */ random_save_seed(); } void random_save_seed(void) { int len; void *data; if (random_active) { random_get_savedata(&data, &len); write_random_seed(data, len); sfree(data); } } /* * This function is called every time the random pool needs * stirring, and will acquire the system time. */ void noise_get_light(void (*func) (void *, int)) { UnsignedWide utc; Microseconds(&utc); func(&utc, sizeof(utc)); } /* * This function is called on every keypress or mouse move, and * will add the current time to the noise pool. It gets the scan * code or mouse position passed in, and adds that too. */ void noise_ultralight(unsigned long data) { UnsignedWide utc; Microseconds(&utc); random_add_noise(&utc, sizeof(utc)); random_add_noise(&data, sizeof(data)); } /* * Local Variables: * c-file-style: "simon" * End: */ Revision-number: 2503 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2003-01-08T23:58:50.000000Z K 7 svn:log V 23 Add PuTTYtel binaries. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 141 Content-length: 141 K 10 svn:ignore V 108 make.out *.NJ Makefile.mpw PuTTY.68k PuTTY.cfm68k PuTTY.ppc PuTTYtel.68k PuTTYtel.cfm68k PuTTYtel.ppc *.rsrc PROPS-END Node-path: putty/mac/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ae49336687e5e78f90bbe05e51e93aef Text-delta-base-sha1: f11350e6f2cee04fdeedafa580ed4b1f52635772 Text-content-length: 110 Text-content-md5: b3fe77f2e551bcff0e1dc483f8d0aa22 Text-content-sha1: 706417c8ef6a06afa59e99096f1ce30a74655419 Content-length: 149 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNCmaa 7make.out *.NJ Makefile.mpw PuTTY.68k PuTTY.cfm68k PuTTY.ppc PuTTYtel.68k PuTTYtel.cfm68k PuTTYtel Revision-number: 2504 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2003-01-09T11:11:10.000000Z K 7 svn:log V 132 Added the first draft of a page about the individual team members. Said team members should now add their bits before I link it in. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/team.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1596 Text-content-md5: b62d92dcac646be0278010eb80e4c0b0 Text-content-sha1: 5df5f6793b81975606f577de506e975d7e40d8a8 Content-length: 1712 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN... PuTTY Team Members

    PuTTY Team Members

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist | Team

    This page lists the people behind the PuTTY project, and gives some idea of what we each do. These are the people who will receive any mail you send to us.

    Simon Tatham
    Project originator, main developer and benevolent dictator. Wrote the majority of the code; does the majority of new development and features. Also maintains Halibut, the documentation system used to produce the Windows Help file and the HTML manual.


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Revision-number: 2505 Prop-content-length: 110 Content-length: 110 K 7 svn:log V 11 Added Owen K 10 svn:author V 4 owen K 8 svn:date V 27 2003-01-09T11:50:06.000000Z PROPS-END Node-path: putty-website/team.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b62d92dcac646be0278010eb80e4c0b0 Text-delta-base-sha1: 5df5f6793b81975606f577de506e975d7e40d8a8 Text-content-length: 194 Text-content-md5: 6a566d2e086b727a4f58587427967f56 Text-content-sha1: 6da435157f5d3cd815f2361bb0da9787c26b0f75 Content-length: 233 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN.c **6xdt style="font-stle: italic">Owen Dunn
    Looks after the nightly snapshot builds, answers mail. Provider of common sense. Programmer, cardboard and sometimes re Revision-number: 2506 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 22 Learn to spell style. K 10 svn:author V 4 owen K 8 svn:date V 27 2003-01-09T11:51:58.000000Z PROPS-END Node-path: putty-website/team.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6a566d2e086b727a4f58587427967f56 Text-delta-base-sha1: 6da435157f5d3cd815f2361bb0da9787c26b0f75 Text-content-length: 22 Text-content-md5: 5f4b2b32ee566c3a072f1b5ab9c57e60 Text-content-sha1: c53c2f6c19ab40148f9947c429c01b970b23f98e Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNcd Oy Revision-number: 2507 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:22.908816Z PROPS-END Revision-number: 2508 Prop-content-length: 240 Content-length: 240 K 8 svn:date V 27 2003-01-09T12:07:23.000000Z K 7 svn:log V 141 Add a paragraph describing my role. Change the initial paragraph to describe the team directly, rather than stating the purpose of the page. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/team.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5f4b2b32ee566c3a072f1b5ab9c57e60 Text-delta-base-sha1: c53c2f6c19ab40148f9947c429c01b970b23f98e Text-content-length: 783 Text-content-md5: 7d99f83592e15230cfc7da8deccd1e09 Text-content-sha1: c004d3d6f3f9e28754225e36074a10eef9b1337c Content-length: 822 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNd< ccn~70s;)PuTTY is maintained by a small team based in Cambridge, England. Between us, we handle writing PuTTY, updating its Web site, recording its bugs, and reading (and often responding to) messages to the PuTTY contact e-mail address. We are:
    Ben Harris
    Ben is primarily responsible for the nascent Macintosh port and is reputed to understand ISO 2022. He's also the maintainer of an enormous concordance of escape sequences and of NetBSD/acorn26!-- I (BJH) think that this would be a bad idea. The style of the PuTTY site doesn't really lend itself to photos. Revision-number: 2509 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 70 Valid HTML 4.01 Transitional (not actually checked for Perl scripts). K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-09T13:18:33.000000Z PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e376251cda15b927e20de96549cdb667 Text-delta-base-sha1: b8281f955efcfc7dc0f2209b2f21a09aa8008a67 Text-content-length: 229 Text-content-md5: 4711905c92538df50252b7bca82e37d3 Text-content-sha1: b08feec2d8e487b1456d2e2fb2a7c540447f6bf5 Content-length: 268 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNN NNA PuTTY Change Log PuTTY Documentation Page PuTTY Download Page PuTTY FAQ #!/usr/bin/perl print << 'EOF'; PuTTY Feedback and Bug Reporting link rel="stylesheet" type="text/css" href="sitestyle.css" title="PuTTY Home Page Style"> link rel="stylesheet" type="text/css" href="sitestyle.css" title="PuTTY Home Page Style"> PuTTY Licence PuTTY Updates PuTTY Web Site Mirrors Mirroring guidelines PuTTY Team Members Feedback page Revision-number: 2511 Prop-content-length: 142 Content-length: 142 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-09T16:04:49.000000Z K 7 svn:log V 44 Update second report. Another Geforce2 MX. PROPS-END Node-path: putty-wishlist/data/black-pointer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1a48a83861b51b82764da67c85d9a858 Text-delta-base-sha1: bafa9898ecd404c997eef0d6468e44bb8204ba00 Text-content-length: 124 Text-content-md5: 536d2c98cf71f357b2c1f12ba6a28c0b Text-content-sha1: 3fe0d07e8d93b442da85f35cedb3dc10085faa9f Content-length: 163 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNa fAf:^
    • Windows 98SE
    • PuTTY 0.52
    • 16-bit colour
    • Gforce 2 MX compatible MSI video card
    Revision-number: 2512 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2003-01-09T17:33:49.000000Z K 7 svn:log V 65 Yikes! Forgot to zero the password after SSH2 PW authentication. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 76d33a073d0dc06ff689b6ac0204092e Text-delta-base-sha1: 90fdc019b70756afd09043d4b82ba6eb8aefafaf Text-content-length: 84 Text-content-md5: 9f081699a14cfda129e2c22ddb845770 Text-content-sha1: a0e61afe0d469e693109243818e1093a7a779a4e Content-length: 125 K 15 cvs2svn:cvs-rev V 5 1.259 PROPS-END SVN,[ *IhDmemset(s->password, 0, sizeof(s->password) Revision-number: 2513 Prop-content-length: 554 Content-length: 554 K 8 svn:date V 27 2003-01-09T18:06:29.000000Z K 7 svn:log V 453 I'm sick of all those #ifdefs in settings.c, and in any case plink and pterm need at least one default setting to be _different_ (pterm needs the default term type to be `xterm', while plink needs it to be taken from $TERM). So here's a completely new alternative mechanism for platform- and app-specific default settings. Ben will probably want to check the integrity of the Mac port, since I've fiddled with it without testing that it still compiles. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b2a879bead3a43cc56143bf57b496316 Text-delta-base-sha1: 72c95a054c16680bc39d7e9d3c4f5cfd5b93a464 Text-content-length: 39 Text-content-md5: e92dff9634e8200a75bd795c9b08ca50 Text-content-sha1: a08aa876d53fff192410c69cfd41bc743bdfe441 Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN5H , + + windefs Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c9b11cf7c895fa05011878c5abc360a7 Text-delta-base-sha1: e3d92e6a8fe59a3932bda5f165b7498c214cda25 Text-content-length: 660 Text-content-md5: a2dcf6d35aa61c9d1232bef1e9bbb37c Text-content-sha1: ab30595b9b96c1bf62dd119e97f380e4a1601aab Content-length: 700 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNUx+K@D/* $Id: mac.c,v 1.21 2003/01/09 18:06:29 simochar *platform_default_s(char *name) { if (!strcmp(name, "Font")) return "Monaco"; return NULL; } int platform_default_i(char *name, int def) { if (!strcmp(name, "FontHeight")) return 9; /* Non-raw cut and paste of line-drawing chars works badly on the * current Unix stub implementation of the Unicode functions. * So I'm going to temporarily set the default to raw mode so * that the failure mode isn't quite so drastically horrid. * When Unicode comes in, this can all be put right. */ if (!strcmp(name, "RawCNP")) return 1; return def; Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fde41eba2c4fdcf958d60c5ea3dd8f21 Text-delta-base-sha1: 2b50b9c4bd46803a980467b884d3686d365fd402 Text-content-length: 451 Text-content-md5: 50e2b4561484ff17b4a1afbce9f73272 Text-content-sha1: 178937547caf75cfb4026e73a27146e41bfc5695 Content-length: 492 K 15 cvs2svn:cvs-rev V 5 1.179 PROPS-END SVNF )[)BQFunctions used by settings.c to provide platform-specific * default settings. * * (The integer one is expected to return `def' if it has no clear * opinion of its own. This is because there's no integer value * which I can reliably set aside to indicate `nil'. The string * function is perfectly all right returning NULL, of course.) */ char *platform_default_s(char *name); int platform_default_i(char *name, int def Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a56a0d19c1f89b710422a52d72d8638 Text-delta-base-sha1: d068bcbe31ee72778322270fa83639c4bb8adeca Text-content-length: 610 Text-content-md5: 13b38adac14104b9799ebd4b564fc849 Text-content-sha1: 0c11c4a03102eb9891104a3cf4889186782c1ad3 Content-length: 650 K 15 cvs2svn:cvs-rev V 4 1.94 PROPS-END SVN1W-'4 v("ndl-font, sizeof(cfg->font)); gppi(sesskey, "FontIsBold", 0, &cfg->fontisbold); gppi(sesskey, "FontCharSet", 0, &cfg->fontcharset); gppi(sesskey, "FontHeight", 10, &cfg->fontheight); gppi(sesskey, "RawCNP", 0, &cfg->rawcnp); Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a76c93d2f58e59e601d9876efe40712 Text-delta-base-sha1: d0a52927f49b62fb3b9b7701f66500a8119f0eb5 Text-content-length: 403 Text-content-md5: 1ebcb73e5f766b78bee88d56606a4b9f Text-content-sha1: 0748b46336c64cd02b654507c53d70c57609dfb0 Content-length: 443 K 15 cvs2svn:cvs-rev V 4 1.80 PROPS-END SVN" xUxRP/* * Default settings that are specific to pterm. */ char *platform_default_s(char *name) { if (!strcmp(name, "Font")) return "fixed"; /* COE_NORMAL works badly in an xterm */ return NULL; } int platform_default_i(char *name, int def) { if (!strcmp(name, "CloseOnExit")) return COE_ALWAYS; /* COE_NORMAL works badly in an xterm */ return def Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 22dfc2541d077617809a4eb6bd696c7e Text-delta-base-sha1: 7ed4d202f65639ea21f25b2b291923692cb06583 Text-content-length: 1508 Text-content-md5: 1281854efe1a67101df88823ce654ed5 Text-content-sha1: a7c113cfb2e3e3e0b13ce0690ad9f8f173e8aba2 Content-length: 1547 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN.zFNWJ"#include #include pw_uid == uid) { /* * The result of getlogin() really does correspond to * our uid. Fine. */ ret = user; } else { /* * If that didn't work, for whatever reason, we'll do * the simpler version: look up our uid in the password * file and map it straight to a name. */ p = getpwuid(uid); ret = p->pw_name; } endpwent(); return ret; } return NULL; } int platform_default_i(char *name, int def) { if (!strcmp(name, "TermWidth") || !strcmp(name, "TermHeight")) { struct winsize size; if (ioctl(0, TIOCGWINSZ, (void *)&size) >= 0) return (!strcmp(name, "TermWidth") ? size.ws_col : size.ws_row); } return def; } Node-path: putty/windefs.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 429 Text-content-md5: e7b3a01458709ac4c58ce0e4e4066642 Text-content-sha1: 0ec4111685a0ec9de51fb9e54e3c5e59fbeae1e6 Content-length: 545 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN/* * windefs.c: default settings that are specific to Windows. */ #include #include #include "winstuff.h" #include "puttymem.h" #include "putty.h" char *platform_default_s(char *name) { if (!strcmp(name, "Font")) return "Courier New"; return NULL; } int platform_default_i(char *name, int def) { if (!strcmp(name, "FontCharSet")) return ANSI_CHARSET; return def; } Revision-number: 2514 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2003-01-09T18:14:24.000000Z K 7 svn:log V 138 Support asynchronous connect() in Unix networking. Now a port forwarding to a nonexistent host shouldn't hold up the rest of the program. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 97889b6c504f8e72180e51c02231a5e9 Text-delta-base-sha1: fe4897885dbe397e0031aac99be1cb891cbc0b41 Text-content-length: 365 Text-content-md5: b92fd49400c08c460a715f75d01c88ec Text-content-sha1: c283cc2f0f7c98c20de872b4b149906ae347bf32 Content-length: 405 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNu&9; -V"iE) V+{ int i = 1; ioctl(s, FIONBIO, &iif ( errno != EINPROGRESSif (!s->connected) { /* * select() reports a socket as _writable_ when an * asynchronous connection is completed. */ s->connected = s->writable = 1; break; } else !s->connected) val |= 2; /* write == connect */ Revision-number: 2515 Prop-content-length: 189 Content-length: 189 K 7 svn:log V 89 Unix plink now catches SIGWINCH and propagates local terminal resizes to the remote end. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-09T18:28:01.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e92dff9634e8200a75bd795c9b08ca50 Text-delta-base-sha1: a08aa876d53fff192410c69cfd41bc743bdfe441 Text-content-length: 28 Text-content-md5: 4b36989d0babdb6f905a2956b86262c6 Text-content-sha1: a523d9bde3cbb65e11f6e162f200d1c4e868409c Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNHO rVr signal Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1281854efe1a67101df88823ce654ed5 Text-delta-base-sha1: a7c113cfb2e3e3e0b13ce0690ad9f8f173e8aba2 Text-content-length: 743 Text-content-md5: 911674db4591c66985086eb209a652e4 Text-content-sha1: 65eebb427ae90b0f581dbc06e300637a8c118c5f Content-length: 783 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNz.,tA+Pm4,Wm] ljerrno.h> #include #include #include = 0) back->size(backhandle, size.ws_col, size.ws_row Revision-number: 2516 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2003-01-09T19:20:25.000000Z K 7 svn:log V 29 More info from Jeffrey Price K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/strange-winsock-msg Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8ef87fa6d33defdd4e723e8afd68c01d Text-delta-base-sha1: a5c8de1d95c23687c94cebc420c5bcb5870e50cb Text-content-length: 273 Text-content-md5: cdab86d67d161540f8aa02b195187522 Text-content-sha1: 14487ae90934bf3bfa418c204ce16bad157f8810 Content-length: 312 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN6- x-m 2003-01-07 Further info from an original reporter (005801c2b80e$b6a3b470$1f69010a@jefflap3):
    I have noticed that the lp=1 correlates to the rule for port 3000 and lp=2 correlates to the rule for port 110.
    Revision-number: 2517 Prop-content-length: 238 Content-length: 238 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-09T19:24:02.000000Z K 7 svn:log V 139 Switching from -opt space to -opt time on 68K Macs only loses us about 2K of disc space, and we need all the speed we can get, so do that. PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d0c68a88e5929e2c9268d64078daca7e Text-delta-base-sha1: 33bc429264bc02d505230765bb3fc5278198ad37 Text-content-length: 28 Text-content-md5: 71668667edc645c01e68d904105f78af Text-content-sha1: c4b45c0fe0fbff184047d4cf86d1f12a1b43d34a Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVNed pqttim Revision-number: 2518 Prop-content-length: 293 Content-length: 293 K 8 svn:date V 27 2003-01-09T19:26:12.000000Z K 7 svn:log V 192 Remove the diagnostic added in rev 1.42 [r2288]; apparently it's all true and WinSock _does_ occasionally send us netevent messages with no socket for no reason. Ignore them when they appear. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b43a69075b1944ac1cbb4a7a8f5fc533 Text-delta-base-sha1: 6a1514f5351be35156e4d1be97f017d0a3cfe2f7 Text-content-length: 73 Text-content-md5: 81d7964d2edd2aec31ac391989aeb802 Text-content-sha1: b35030d8b3f9f4abf4cc30bb99ba27c9361b0e51 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNMn 0Tjcif (wParam == 0) return 1; /* boggle */ Revision-number: 2519 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2003-01-09T19:26:39.000000Z K 7 svn:log V 188 Install a notification procedure (ASR) on each TCP connection that wakes PuTTY up when something happens. This should allow it to receive data without having to poll for it continuously. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8eaa50717002cc49ec5baa1576186569 Text-delta-base-sha1: 1674085cec79087138c4367c8f6efea6d9ee7d2d Text-content-length: 588 Text-content-md5: 43b8bebfdd1d361ace0cec15237de1b6 Text-content-sha1: 7f219cce3c90bc8197743fffdce8409d28fe7822 Content-length: 627 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN+VIlu?@2o>li.HProcessSerialNumber self; Actual_Socket socklist; } mactcp;; static pascal void mactcp_asr(StreamPtr, unsigned short, Ptr, unsigned short, struct ICMPReport *static TCPNotifyUPP mactcp_asr_upp;if (mactcp_asr_upp == NULL) mactcp_asr_upp = NewTCPNotifyUPP(&mactcp_asr); GetCurrentProcess(&mactcp.self)mactcp_asr_uppstatic pascal void mactcp_asr(StreamPtr str, unsigned short event, Ptr cookie, unsigned short termin_reason, struct ICMPReport *icmp) { WakeUpProcess(&mactcp.self); } Revision-number: 2520 Prop-content-length: 211 Content-length: 211 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-09T19:27:29.000000Z K 7 svn:log V 112 Set PuTTY's canBackground flag so that it receives CPU time (to process incoming data) while in the background. PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8f3a1085f1e13f7801e35cfb46e75d34 Text-delta-base-sha1: f702ce00833d1af900c4206bc9826a5b77a19dc1 Text-content-length: 67 Text-content-md5: 702fdacc8261bd076dcee5aeffd990f7 Text-content-sha1: 44e547bf6106c5146f2f220732d01d315ae25c23 Content-length: 107 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN  ,b,z/* $Id: mac_res.r,v 1.11 2003/01/09 19:27:29 Revision-number: 2521 Prop-content-length: 353 Content-length: 353 K 8 svn:date V 27 2003-01-09T22:39:47.000000Z K 7 svn:log V 254 Take advantage of having control over the default font to do the job properly: ask the system script what it's preferred monospaced font is, and use that if possible. Failing, that, try the Roman script system, and if that fails, fall back to Monaco 9. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a2dcf6d35aa61c9d1232bef1e9bbb37c Text-delta-base-sha1: ab30595b9b96c1bf62dd119e97f380e4a1601aab Text-content-length: 824 Text-content-md5: b4330030bce1af3b330a67a4c00c7c8a Text-content-sha1: 3e9bd3a171a25be081d9f7bc3c88d96233d43cf5 Content-length: 864 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNU%H-pB/* $Id: mac.c,v 1.22 2003/01/09 22:39:47 belong smfs; Str255 pname; static char cname[256]; if (!strcmp(name, "Font")) { smfs = GetScriptVariable(smSystemScript, smScriptMonoFondSize); if (smfs == 0) smfs = GetScriptVariable(smRoman, smScriptMonoFondSize); if (smfs != 0) { GetFontName(HiWord(smfs), pname); if (pname[0] == 0) return "Monaco"; p2cstrcpy(cname, pname); return cname; } else return "Monaco"; } return NULL; } int platform_default_i(char *name, int def) { long smfs; if (!strcmp(name, "FontHeight")) { smfs = GetScriptVariable(smSystemScript, smScriptMonoFondSize); if (smfs == 0) smfs = GetScriptVariable(smRoman, smScriptMonoFondSize); if (smfs != 0) return LoWord(smfs); else return 9; } Revision-number: 2522 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2003-01-09T22:45:48.000000Z K 7 svn:log V 50 c2pstr() is deprecated. Use c2pstrcpy() instead. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3acbc98364f1e0f5878e67285dcbe8c3 Text-delta-base-sha1: 24743531c9048f6cc2dfa8ec3be69d816cba4465 Text-content-length: 110 Text-content-md5: d5eb685488b6d6de9a1930f73b2324ed Text-content-sha1: 1c4cff541a873e721a620c42b943c7b2a07120f9 Content-length: 150 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN=XF^,(}A&Kr/* $Id: macterm.c,v 1.37 2003/01/09 22:45:48unsigned char pcpy(pbuf, p Revision-number: 2523 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2003-01-09T22:51:41.000000Z K 7 svn:log V 52 Use c2pstrcpy() rather than silly sprintf() tricks. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d5eb685488b6d6de9a1930f73b2324ed Text-delta-base-sha1: 1c4cff541a873e721a620c42b943c7b2a07120f9 Text-content-length: 111 Text-content-md5: d9d154c6fcbbddac9d22711fcf376613 Text-content-sha1: a4c0a0577596a8210699bd0de4d0eeda37670b0d Content-length: 151 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNXOy,bSse/* $Id: macterm.c,v 1.38 2003/01/09 22:51:41c2pstrcpy(macfontc2pstrcpy(mactitle Revision-number: 2524 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2003-01-09T23:04:34.000000Z K 7 svn:log V 138 Forcibly close any TCP connections that are still open when PuTTY exits. This saves leaving them lying around to crash the machine later. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 43b8bebfdd1d361ace0cec15237de1b6 Text-delta-base-sha1: 7f219cce3c90bc8197743fffdce8409d28fe7822 Text-content-length: 1019 Text-content-md5: 8bb854d81acded60311afd5abedb9896 Text-content-sha1: 64d6f35a421964f3b6d7b49544ca525e2905e9b1 Content-length: 1058 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN XM+M==Y Actual_Socket s, next; /* * Eventually, PuTTY should close down each session as it exits, * so there should be no sockets left when we get here. Still, * better safe than sorry. * * XXX What about in-flight aync I/O (when we support that)? */ for (s = mactcp.socklist; s != NULL; s = next) { next = s->next; /* s is about to vanish */ mactcp_close(&s->fn); } /* * When we get async DNS, we have to wait for any outstanding * requests to complete here before exiting. */do { pb.ioCRefNum = mactcp.refnum; pb.csCode = TCPStatus; pb.tcpStream = s->s; pb.csParam.status.userDataPtr = (Ptr)s; s->err = PBControlSync((ParmBlkPtr)&pb); if (s->err != noErr) goto next_socket; if (pb.csParam.status.amtUnreadData == 0) break; mactcp_recv(s, pb.csParam.status.amtUnreadData); /* Should check connectionState in case remote has closed */ } while (TRUE); next_socket: ; Revision-number: 2525 Prop-content-length: 128 Content-length: 128 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-09T23:29:22.000000Z K 7 svn:log V 30 Implement get_window_title(). PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d9d154c6fcbbddac9d22711fcf376613 Text-delta-base-sha1: a4c0a0577596a8210699bd0de4d0eeda37670b0d Text-content-length: 201 Text-content-md5: 67bedc57479215cc61d6e94c87b4325e Text-content-sha1: 45ec23a0b7248fe0fd283bf593d49507a420d2c0 Content-length: 241 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN_,c,PM/* $Id: macterm.c,v 1.39 2003/01/09 23:29:22 Str255 ptitle; static char title[256]; GetWTitle(s->window, ptitle); p2cstrcpy(title, ptitle); return title Revision-number: 2526 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2003-01-10T10:31:02.000000Z K 7 svn:log V 34 Added shortcut icon to all pages. K 10 svn:author V 4 owen PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4711905c92538df50252b7bca82e37d3 Text-delta-base-sha1: b08feec2d8e487b1456d2e2fb2a7c540447f6bf5 Text-content-length: 64 Text-content-md5: e81e344d3466a48f0b332006ab1a1011 Text-content-sha1: 919b76abacbffcd62ab35583b6f0d77a00c10c74 Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN; (IJElink rel="shortcut icon" href="putty.ico Node-path: putty-website/docs.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 14f22011c1ab72f8596d85e8d16f9a09 Text-delta-base-sha1: 7f4d15f4cebe47a67d3a4592b1d4813e537b4526 Text-content-length: 61 Text-content-md5: 4a5f9071efcef1d878c896d055c6d17c Text-content-sha1: 6a671c7856ad31b83d663d120ce56722951eee59 Content-length: 100 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNs (Q&Mlink rel="shortcut icon" href="putty.ico Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cfad848c1e0e9dc560f97d6085aa801f Text-delta-base-sha1: 99fdb65c0941f391755ff4c7ff8039274e8562fb Text-content-length: 64 Text-content-md5: b211cc9d5200958586790ba6c41f9bf9 Text-content-sha1: f9b54a805490fe01f1a32f7ac00885bf8f44fe5c Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNd (LHlink rel="shortcut icon" href="putty.ico Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6baaf7e3b201fecf48f2c348ea91e5a0 Text-delta-base-sha1: d927b0e8b3af56981b7c04a5c3917a26712178d1 Text-content-length: 61 Text-content-md5: 8c5c65c3972b3c09c979189a198b4e7b Text-content-sha1: 99bfa3d6bc99804c10e1d133149c371171fd52f4 Content-length: 100 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN/[ (^UZlink rel="shortcut icon" href="putty.ico Node-path: putty-website/keys.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 424937a1cd7fd2fa904fe16d2575c1ca Text-delta-base-sha1: a59f49010f1a39484b3bf4cbf104aec80bad6610 Text-content-length: 61 Text-content-md5: d2ab2c8faef82fedcff7ea8189c840e0 Text-content-sha1: 72fa0f0b1ea70d5fb998b252a079fdd5a01ebb3f Content-length: 100 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN. ([+Wlink rel="shortcut icon" href="putty.ico Node-path: putty-website/licence.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 65a3b7ee542b9b5d0ff218ec75527438 Text-delta-base-sha1: fd6ae7f941b13144849dab8d56ed10d1d69328a7 Text-content-length: 61 Text-content-md5: 1cb8fcf2f2458978f5a444ea77d88953 Text-content-sha1: a6d0874b2144ca7327c20d74f59c6ca2df8e6701 Content-length: 100 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNGs (FBlink rel="shortcut icon" href="putty.ico Node-path: putty-website/maillist.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c731a1ba80e80235e26f7d96fe2d65b6 Text-delta-base-sha1: 27404a89e43f20b76a416086241dff9144b6fd79 Text-content-length: 61 Text-content-md5: 5c01477f53764065272b82d745690c45 Text-content-sha1: 2fb1d00e6c3825874fa37093fb2805b75e2e63a7 Content-length: 100 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNQ} (FBlink rel="shortcut icon" href="putty.ico Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 336dfb912ba9bf5c390184533a023a30 Text-delta-base-sha1: 32f368dfdd9a98e79dce77d03a0b12dbb8a2ac75 Text-content-length: 61 Text-content-md5: abfc14d5f3316555a96e3fa5854b6f05 Text-content-sha1: 4b7039a765ad243d68ce0acaa1793cbdcddd6be6 Content-length: 100 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN{' (O0Klink rel="shortcut icon" href="putty.ico Node-path: putty-website/putty.ico Node-kind: file Node-action: add Prop-content-length: 88 Text-delta: true Text-content-length: 332 Text-content-md5: b249f1cfd526b9c1e72b311cc11cc57b Text-content-sha1: fcde31e4d64473e9f2fa48250d6029d8984bea42 Content-length: 420 K 13 svn:mime-type V 24 application/octet-stream K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN>>>(( wwpwwwLGKx pw KGGx??? Node-path: putty-website/team.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3f4f59e7807a17390809c27f38ad1bc6 Text-delta-base-sha1: 3739b0a7f2977756378e28150e4d4e55184e5ad4 Text-content-length: 61 Text-content-md5: 9852a3092112dd56002ee4731d3fe85f Text-content-sha1: 8ad2720484e4471fb82af359c5734f6551071c86 Content-length: 100 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNy% (K2Glink rel="shortcut icon" href="putty.ico Node-path: putty-website/wishlist.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9564b73f4957db7bd0afc0b70293e1b2 Text-delta-base-sha1: 608a9cad35e21fa19f262d515c5737a2d1fdc959 Text-content-length: 222 Text-content-md5: ee64ff628cc3853c5737445c6199eb78 Text-content-sha1: 5456bea31f40ea41d6528db132b610553ac2e4b5 Content-length: 261 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNLx GG1 PuTTY Known Bugs and Wish List Jacob Nevins
    Answers mail, herds wishlist, occasionally writes code, looks after Win95 to some extent.
    Team Node-path: putty-website/docs.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4a5f9071efcef1d878c896d055c6d17c Text-delta-base-sha1: 6a671c7856ad31b83d663d120ce56722951eee59 Text-content-length: 48 Text-content-md5: 17151c6cf2b4b350d20b9c5afed77804 Text-content-sha1: 9fa840c0cfa46ad59edeefb4a92054346f13d598 Content-length: 87 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN> 3p/ | Team Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b211cc9d5200958586790ba6c41f9bf9 Text-delta-base-sha1: f9b54a805490fe01f1a32f7ac00885bf8f44fe5c Text-content-length: 51 Text-content-md5: 507730755bd2ddf84feea694f871a0c8 Text-content-sha1: f0c7c0b5ab8f56c2cdcfaab09b7cb73d977e851b Content-length: 90 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN/ f.b | Team Node-path: putty-website/faq.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 760bab59425e26ca573b204dd1931ffd Text-delta-base-sha1: 90ffb902672324216be8fbe2fa5c09ba498814a2 Text-content-length: 48 Text-content-md5: f4d1342cfcf951b1ed84a895eb55503d Text-content-sha1: e7f9494cab273ba8cae4d5755c8f038f266c3fcb Content-length: 87 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN8W - | Team Node-path: putty-website/feedback.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3bdd0008d838119df8f38aa521958ddc Text-delta-base-sha1: 6ba11a3c35298f26c4554c06f9fcb6f8978209ca Text-content-length: 48 Text-content-md5: aa5f98dea8fe1272b6d973d15b104050 Text-content-sha1: 1c623b8c1bca4084acea1394fe40ac6b523049ee Content-length: 87 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN ? 8l4 | Team Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8c5c65c3972b3c09c979189a198b4e7b Text-delta-base-sha1: 99bfa3d6bc99804c10e1d133149c371171fd52f4 Text-content-length: 117 Text-content-md5: a992aeb15f9bd8c3d4ffd933044e8e2b Text-content-sha1: 6046d560bdbb6f7ac35fc237c4b3933e8a4d46ff Content-length: 156 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN[<ZTPP> | Teamli> A page about the PuTTY team members Node-path: putty-website/keys.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d2ab2c8faef82fedcff7ea8189c840e0 Text-delta-base-sha1: 72fa0f0b1ea70d5fb998b252a079fdd5a01ebb3f Text-content-length: 48 Text-content-md5: 4017414421b089db2f2adb9786ab9ce5 Text-content-sha1: 572d1a3f664a388468dc57cdd5ea5988c3405784 Content-length: 87 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN.M GkC | Team Node-path: putty-website/licence.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1cb8fcf2f2458978f5a444ea77d88953 Text-delta-base-sha1: a6d0874b2144ca7327c20d74f59c6ca2df8e6701 Text-content-length: 48 Text-content-md5: b867b39baad7531b7af3748bd701622c Text-content-sha1: bc00c1b0d0803c77361823a0cc39d2cc0a9ec957 Content-length: 87 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNs ] | Team Node-path: putty-website/maillist.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5c01477f53764065272b82d745690c45 Text-delta-base-sha1: 2fb1d00e6c3825874fa37093fb2805b75e2e63a7 Text-content-length: 48 Text-content-md5: 2551bbddd4eae8d08ab83faf6338ef84 Text-content-sha1: 9913aadd6319a04cd7578dc38f3229cd8e184905 Content-length: 87 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN} h | Team Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: abfc14d5f3316555a96e3fa5854b6f05 Text-delta-base-sha1: 4b7039a765ad243d68ce0acaa1793cbdcddd6be6 Text-content-length: 48 Text-content-md5: 73688cc360bf552c893d23680c363e6b Text-content-sha1: 5c13bef8081f7ea9ad1b8fb3aabda24821600bc3 Content-length: 87 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN'F ,( | Team Node-path: putty-website/team.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2c2538f54deec4bfc677fa7bac7f3f0b Text-delta-base-sha1: 0cbbd4c85a648a943fe8730851ff22f32e8a972e Text-content-length: 92 Text-content-md5: fbf82efcc0fd42d28c267b63aef7ad30 Text-content-sha1: e362d029bf6d6fe4d4bda8f52a3ca47051450145 Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNy6`7`4E; padding-top: 1em; padding-top: 1em; padding-top: 1em Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b2b31e804862f7a79fb74392cf3d28a6 Text-delta-base-sha1: af6897eaf548206081f4e5724131582ff0a69084 Text-content-length: 127 Text-content-md5: 14b2f3474ae978e23a4f215b34bbd6f1 Text-content-sha1: 6426875fbdab32d4f85f787bab4dfd3eeea43b9e Content-length: 167 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNe hA?R#! /usr/bin/perl # $Id: bugs2html,v 1.15 2003/01/10 12:14:36 simo | Team SSH (both v1 and v2) allows the client to specify the mode it wants server-side pseudo-terminals to be opened in.

    I've always thought it would be nice to be able to configure this sort of thing locally, so that (for example) users connecting to the mono.org BBS could stop a single press of Ctrl-\ from sending a SIGQUIT and unexpectedly terminating their session.

    Recently it was suggested to me that if the user has configured non-`auto' settings for local echo and/or local line editing, then perhaps PuTTY should deliberately send terminal modes which compensate for this on the server side? For example, if the user turns line editing off at the client end, we could send ICANON so that it's turned on at the server end; or conversely if the user enables local line editing we could send ~ICANON. It isn't remotely clear to me that this would be the right thing in all circumstances, though, so perhaps it would be better to leave it as a user-configurable option.

    (This wish applies minimally to Telnet as well, since we can send WILL ECHO / WONT ECHO to announce an intention to do any echoing locally, and the server is expected to stop doing its own echoing if it thinks we're doing it ourselves. Configurable options in this area might also be directly usable by the pty back end in pterm.) Revision-number: 2531 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2003-01-10T14:33:42.000000Z K 7 svn:log V 24 This is reported fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/strange-winsock-msg Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cdab86d67d161540f8aa02b195187522 Text-delta-base-sha1: 14487ae90934bf3bfa418c204ce16bad157f8810 Text-content-length: 580 Text-content-md5: 2de7fc8a20baaebb431e666a10f5507b Text-content-sha1: 1321be8707149545e6fc56adc7aeb446c0f1291e Content-length: 619 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN-Y +Fixed-in: 2003-01-10

    SGT: Reported as fixed in 2003-01-10. (The diagnostics confirmed that WinSock was occasionally sending netevent messages with wParam==0, hence relevant to no socket. If the lParam had contained an error notification for an error which wasn't socket-specific, I might have believed they were meaningful and paid them some attention; but the lParam was actually an ordinary FD_READ/FD_WRITE sort of thing which makes no sense on a non-socket. So I've just put in code to ignore such messages, and that seems to have worked.) Revision-number: 2532 Prop-content-length: 145 Content-length: 145 K 7 svn:log V 47 Ask for a meaningful subject line on messages. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-10T15:23:01.000000Z PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2032f6221c2b02a2bffff6588cb94213 Text-delta-base-sha1: 00ef930c1f16454783694a787366e4a88122f0b8 Text-content-length: 264 Text-content-md5: 5ffca80a23a9c91ab49e59c2ba865fab Text-content-sha1: a18eddd39c9661069d495cb404892455f643ec85 Content-length: 304 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNM m6<2*o\versionid $Id: feedback.but,v 1.10 2003/01/10 15:23:01 benPlease use a meaningful subject line on your message. We get a lot of mail, and it's hard to find the message we're looking for if they all have subject lines like \q{PuTTY bug} Revision-number: 2533 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 58 Split the "ports" wish up a bit and sync it with reality. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-10T15:41:17.000000Z PROPS-END Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 282 Text-content-md5: 3c495f4a2f8e3da6d19b1234f1a573a0 Text-content-sha1: 9b813cea056fcbf84bb64d8572ea77f476770c49 Content-length: 398 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  Summary: Port to the Mac OS Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    There is a port to the Mac OS in progress. It's just about usable, but has an awful lot of gaps and rough edges that will need cleaning up before release. Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 792 Text-content-md5: ccafffc028c132d813a9ec7791606600 Text-content-sha1: 254411168619bf1aad85cf9fcf0a4b12693a5890 Content-length: 908 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN  Summary: Port to Unix Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    It's currently being worked on. If you look at the nightly source snapshots, you should find a unix subdirectory, which should build you a Unix port of Plink, and also pterm - an xterm-type program which supports the same terminal emulation as PuTTY.

    It isn't yet clear whether we will bother combining the terminal emulator and network back end into the same process, to provide a Unix port of the full GUI form of PuTTY. It wouldn't be as useful a thing on Unix as it would be on Windows; its major value would probably be as a pathfinding effort for other ports. If anyone really wants it, we'd be interested to know why :-) Node-path: putty-wishlist/data/port-wince Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 503 Text-content-md5: 446fba611ebe1462b8ad2f71f23d3065 Text-content-sha1: fb2fba25abd09c5958c72f45b7c4d0eeeec0d0f4 Content-length: 619 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNiiiSummary: Port to Windows CE (alias PocketPC) Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body There will Probably not be a Windows CE port in the particularly near future. Despite sharing large parts of the Windows API, in practice WinCE doesn't appear to be significantly easier to port to than a totally different operating system. However, PuTTY on portable devices would clearly be a useful thing, so in the long term I hope there will be a WinCE port. Node-path: putty-wishlist/data/ports Node-action: delete Revision-number: 2534 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 24 Add a difficulty field. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-10T15:58:19.000000Z PROPS-END Node-path: putty-wishlist/data/meta-bit Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a054cf2a318807949f4dc13cb9c4f325 Text-delta-base-sha1: 4409596fa8d658f35d25f4eef04bc84168e45e19 Text-content-length: 34 Text-content-md5: 50b71aeceb9db26d7c5f16733894fe9f Text-content-sha1: 498d9d6aadf31a05178cb8fd00b404aa37d4708f Content-length: 73 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN:JNmMDifficulty: fun Revision-number: 2535 Prop-content-length: 115 Content-length: 115 K 7 svn:log V 15 Priority: high K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-10T18:20:00.000000Z PROPS-END Node-path: putty-wishlist/data/ssh-default Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: df6f4e4569c3d71f363cd2799bc2ca9b Text-delta-base-sha1: 0654ce40ecf56e8fe30a4df9ae83a24c8ba529b9 Text-content-length: 23 Text-content-md5: 84ca31570f16c65b7c03a1827ef86a01 Text-content-sha1: 3c929b479953aaad26ccae04e7390acbbc430f83 Content-length: 62 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNGHbbehigh Revision-number: 2536 Prop-content-length: 480 Content-length: 480 K 7 svn:log V 379 Introduce framework for authenticating with the local X server. Windows and Mac backends have acquired auth-finding functions which do nothing; Unix backend has acquired one which actually works, so Plink can now do X forwarding believably. (This checkin stretches into some unlikely parts of the code because there have been one or two knock-on effects involving `const'. Bah.) K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-10T18:33:35.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b36989d0babdb6f905a2956b86262c6 Text-delta-base-sha1: a523d9bde3cbb65e11f6e162f200d1c4e868409c Text-content-length: 42 Text-content-md5: 4a2898e2942ac3d46fb585e588a9978f Text-content-sha1: 840a0c49b017dd883a0739e9d801466d36b8872b Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNO^>;>Vy winmisc ux_x11 Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b4330030bce1af3b330a67a4c00c7c8a Text-delta-base-sha1: 3e9bd3a171a25be081d9f7bc3c88d96233d43cf5 Text-content-length: 262 Text-content-md5: 34a7e7486a88acc07a47d9f22b84bf28 Text-content-sha1: bd66b861c5d4a3c6fecfb7c06ccb188c85074690 Content-length: 302 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN%hj>+=@e/* $Id: mac.c,v 1.23 2003/01/10 18:33:35 simovoid platform_get_x11_auth(char *display, int *proto, unsigned char *data, int *datalen) { /* SGT: I have no idea whether Mac X servers need anything here. */ Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a94f5a69d22dd83364bd00b8719b5be8 Text-delta-base-sha1: 389b916682d4a5508f6760e343ded69ddc13b003 Text-content-length: 79 Text-content-md5: 77c7300afa5db5f61535413d78b6a9da Text-content-sha1: 4f17b6a47148f6c26b54d6e68caddb1c9bb97674 Content-length: 119 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN$6 :)SQconst void *data, int len) { const char *buf = (const Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0813594e70bd172045fd43dc5bf6e81e Text-delta-base-sha1: 5e564ddd1235efdf4147212356ec57056da6d12a Text-content-length: 26 Text-content-md5: a3cae2cd811d1a17b2d37eca9d5e1d3a Text-content-sha1: 875e032d0577d5ea83e3c656ec00b8c4e2de2bb1 Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNx~ H1Gconst Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0f87ba590c3c5cd4e473bb2efac0f7f7 Text-delta-base-sha1: b9541e80bc7902286bfaa8d2c4937dc764bdfa47 Text-content-length: 86 Text-content-md5: 37cb1e2f352cc557ebb7dcf8f0fef0bd Text-content-sha1: 80a2cd177da6b390ef9cd7d40c53a91759dbe225 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN:F @l@ onst char *data, int len); int (*write_oob) (Socket s, const Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d9487aed6c174e8b1a96b330467e71d4 Text-delta-base-sha1: 5dd88a47c785105fb279191fc8f46db6d9710f48 Text-content-length: 42 Text-content-md5: 33832f7bfdc86e470cbd7b3e6d55285d Text-content-sha1: ded26f70ebddf35407377ce6107611054e8e069d Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN} Nv~>B~onstonst Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 50e2b4561484ff17b4a1afbce9f73272 Text-delta-base-sha1: 178937547caf75cfb4026e73a27146e41bfc5695 Text-content-length: 246 Text-content-md5: 455fef07dde6d25e5baf1fe6e6a82260 Text-content-sha1: d23bf034acb2178cddc29dfca4de27ff67f16ec6 Content-length: 287 K 15 cvs2svn:cvs-rev V 5 1.180 PROPS-END SVNF$ \?\ =/* * X11 auth mechanisms we know about. */ enum { X11_NO_AUTH, X11_MIT, /* MIT-MAGIC-COOKIE-1 */ X11_NAUTHS }; extern const char *const x11_authnames[]; /* declared in x11fwd.c */ Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9f081699a14cfda129e2c22ddb845770 Text-delta-base-sha1: a0e61afe0d469e693109243818e1093a7a779a4e Text-content-length: 223 Text-content-md5: 4e1c0d3344ef81778219902cdb2efee5 Text-content-sha1: a51d8a82e70854d823b4e23ff601fe038dcb6e2f Content-length: 264 K 15 cvs2svn:cvs-rev V 5 1.260 PROPS-END SVN 7dea x11_get_real_auth(ssh->x11auth, cfg.x11_display[Oq:|%6L); pfd_close(c->u.pfd.s); c->u.pfd.s = NULL; x11_get_real_auth(ssh->x11auth, cfg.x11_display Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f94a9562e10d8ff2fe428edc0a668ee9 Text-delta-base-sha1: 76283c53993fab3a8cc4a6e90df1bb59a58a2a67 Text-content-length: 57 Text-content-md5: ff3e5ad79fef958c447557179eba98af Text-content-sha1: d4f07f4e082d47c838ff370a9c35996af1843299 Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNDx $SCvoid x11_get_real_auth(void *authv, Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3005 Text-content-md5: 70837597e35f395d8262497f5dbed5c7 Text-content-sha1: 1c0ada125844d5cb8995058d710eebb85d19e0be Content-length: 3121 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN////* * ux_x11.c: fetch local auth data for X forwarding. */ #include #include #include "putty.h" void platform_get_x11_auth(char *display, int *protocol, unsigned char *data, int *datalen) { FILE *fp; char *command; int maxsize = *datalen; char *localbuf; command = dupprintf("xauth list %s 2>/dev/null", display); fp = popen(command, "r"); sfree(command); if (!fp) return; /* assume no auth */ localbuf = smalloc(maxsize); while (1) { /* * Read a line from stdin, and attempt to parse it into a * display name (ignored), auth protocol, and auth string. */ int c, i, hexdigit, proto; char protoname[64]; /* Skip the display name. */ while (c = getc(fp), c != EOF && c != '\n' && !isspace(c)); if (c == EOF) break; if (c == '\n') continue; /* Skip white space. */ while (c != EOF && c != '\n' && isspace(c)) c = getc(fp); if (c == EOF) break; if (c == '\n') continue; /* Read the auth protocol name, and see if it matches any we * know about. */ i = 0; while (c != EOF && c != '\n' && !isspace(c)) { if (i < lenof(protoname)-1) protoname[i++] = c; c = getc(fp); } protoname[i] = '\0'; for (i = X11_NO_AUTH; ++i < X11_NAUTHS ;) { if (!strcmp(protoname, x11_authnames[i])) break; } if (i >= X11_NAUTHS || i <= proto) { /* Unrecognised protocol name, or a worse one than we already have. * Skip this line. */ while (c != EOF && c != '\n') c = getc(fp); if (c == EOF) break; } proto = i; /* Skip white space. */ while (c != EOF && c != '\n' && isspace(c)) c = getc(fp); if (c == EOF) break; if (c == '\n') continue; /* * Now grab pairs of hex digits and shove them into `data'. */ i = 0; hexdigit = -1; while (c != EOF && c != '\n') { int hexval = -1; if (c >= 'A' && c <= 'F') hexval = c + 10 - 'A'; if (c >= 'a' && c <= 'f') hexval = c + 10 - 'a'; if (c >= '0' && c <= '9') hexval = c - '0'; if (hexval >= 0) { if (hexdigit >= 0) { hexdigit = (hexdigit << 4) + hexval; if (i < maxsize) localbuf[i++] = hexdigit; hexdigit = -1; } else hexdigit = hexval; } c = getc(fp); } *datalen = i; *protocol = proto; memcpy(data, localbuf, i); /* Nonetheless, continue looping round; we might find a better one. */ } pclose(fp); sfree(localbuf); } Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b92fd49400c08c460a715f75d01c88ec Text-delta-base-sha1: c283cc2f0f7c98c20de872b4b149906ae347bf32 Text-content-length: 116 Text-content-md5: 96495df7b5ae6cabc6012070f3ba7e75 Text-content-sha1: 349660783fa94b811cd9b82c135759e2d42ead0a Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNu NFO|Q*Konst char *data, int len); static int sk_tcp_write_oob(Socket s, constonstonst Node-path: putty/winmisc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 329 Text-content-md5: 64127c00d2341198ca3ddb2b02f2f907 Text-content-sha1: d9eeacc828d26932d0ad3b398d84fc228463d493 Content-length: 445 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN;;;/* * winmisc.c: miscellaneous Windows-specific things. */ #include #include #include #include "putty.h" void platform_get_x11_auth(char *display, int *proto, unsigned char *data, int *datalen) { /* We don't support this at all under Windows. */ } Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 81d7964d2edd2aec31ac391989aeb802 Text-delta-base-sha1: b35030d8b3f9f4abf4cc30bb99ba27c9361b0e51 Text-content-length: 116 Text-content-md5: 243d62efd6e26ea195d08e8103d97a40 Text-content-sha1: 470cbdcb0f4f04f02951211f6115fddaa886f8d2 Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNnNTF<|H,Bonst char *data, int len); static int sk_tcp_write_oob(Socket s, constonstonst Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bb235e6cb1909638e9d6cd9175322b15 Text-delta-base-sha1: d468757490ff566bf8d0fe597f1d14cf201e8ca3 Text-content-length: 2772 Text-content-md5: 650883bb56646420d992d1b66558437b Text-content-sha1: 6e281a0005949752c8dcc02ada16f2f73ad7b76e Content-length: 2812 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNL.G#C%O4U1S}Y 0Ks #include #include #include fakeproto = X11_MITfakelen = 16; for (i = 0; i < 16; i++) auth->fakex11_authnames[auth->fakeproto], protomaxlen); ourdata[0] = '\0'; for (i = 0; i < auth->fakelen; i++) sprintf(ourdata + strlen(ourdata), "%02x", auth->fakedata[i]); strncpy(data, ourdata, datamaxlen); return auth; } /* * Fetch the real auth data for a given display string, and store * it in an X11Auth structure. Returns NULL on success, or an error * string. */ void x11_get_real_auth(void *authv, char *display) { struct X11Auth *auth = (struct X11Auth *)authv; auth->realproto = X11_NO_AUTH; /* in case next call does nothing */ auth->reallen = sizeof(auth->realdata); platform_get_x11_auth(display, &auth->realproto, auth->realdata, &auth->reallen)x11_authnames[auth->fakeproto]) != 0) return 0; /* wrong protocol attempted */ if (auth->fakeproto == X11_MIT) { if (dlen != auth->fakelen) return 0; /* cookie was wrong length */ if (memcmp(auth->fakedata, data, dlen) != 0) return 0; /* cookie was wrong cookie! */ } /* implement other protocols here if ever requiredfake auth data, and optionally put real auth data in * instead. */ { char realauthdata[64]; int realauthlen = 0; int authstrlen = strlen(x11_authnames[pr->auth->realproto]); static const char zeroes[4] = { 0,0,0,0 }; if (pr->auth->realproto == X11_MIT) { assert(pr->auth->reallen <= lenof(realauthdata)); realauthlen = pr->auth->reallen; memcpy(realauthdata, pr->auth->realdata, realauthlen); } /* implement other auth methods here if required */ PUT_16BIT(pr->firstpkt[0], pr->firstpkt + 6, authstrlen); PUT_16BIT(pr->firstpkt[0], pr->firstpkt + 8, realauthlen); sk_write(s, (char *)pr->firstpkt, 12); if (authstrlen) { sk_write(s, x11_authnames[pr->auth->realproto], authstrlen); sk_write(s, zeroes, 3 & (-authstrlen)); } if (realauthlen) { sk_write(s, realauthdata, realauthlen); sk_write(s, zeroes, 3 & (-realauthlen)); } } Revision-number: 2537 Prop-content-length: 370 Content-length: 370 K 8 svn:date V 27 2003-01-11T09:31:54.000000Z K 7 svn:log V 269 Support XDM-AUTHORIZATION-1 for connecting to local X servers. If we're going to be a security program, we can at least make a token effort to use the most secure local X auth available! And I'm still half-tempted to see if I can support it for remote X servers too... K 10 svn:author V 5 simon PROPS-END Node-path: putty/mac/macstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 229b383dfdc2033eda597d37b4b47c4e Text-delta-base-sha1: a23ca8897702da47dd4d5617c7609196a99568ab Text-content-length: 268 Text-content-md5: 30265c088180111884e01ff91b5f2630 Text-content-sha1: 047afe65f441b16efbfd235eb4061ddd53108415 Content-length: 307 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNSK ttW| * sk_getxdmdata() does not exist under the Mac (SGT: I have no * idea whatsoever how to write it, and furthermore I'm unconvinced * it's necessary), so it's a macro which always returns FALSE. */ #define sk_getxdmdata(socket, ip, port) (0) Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 455fef07dde6d25e5baf1fe6e6a82260 Text-delta-base-sha1: d23bf034acb2178cddc29dfca4de27ff67f16ec6 Text-content-length: 58 Text-content-md5: 43d766587fdb457321749041841ed9eb Text-content-sha1: 02cb485273f9b3e9df0d11871cf2bfd7b099c4ed Content-length: 99 K 15 cvs2svn:cvs-rev V 5 1.181 PROPS-END SVN$T "Lf>XDM, /* XDM-AUTHORIZATION Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ff3e5ad79fef958c447557179eba98af Text-delta-base-sha1: d4f07f4e082d47c838ff370a9c35996af1843299 Text-content-length: 86 Text-content-md5: 15b9c8ba77dcc35ed6d90ad876d18c8d Text-content-sha1: 31632ffde28687007feeac72a371838f7e628f51 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVNxD @@l void des_encrypt_xdmauth(unsigned char *key, unsigned char *blk, Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ac6e175e8bc860027ced2e1f68325fee Text-delta-base-sha1: 10a28096d43c0d154d397233823b3dbb9dfb8108 Text-content-length: 566 Text-content-md5: bab80fb631ba732f43cf262cb01f3199 Text-content-sha1: 7eb59e4eacac5ba0e6c18b18e516ae22b346a1df Content-length: 606 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNbzntvoid des_encrypt_xdmauth(unsigned char *keydata, unsigned char *blk, int len) { unsigned char key[8]; DESContext dc; int i, nbits, j; unsigned int bits; bits = 0; nbits = 0; j = 0; for (i = 0; i < 8; i++) { if (nbits < 7) { bits = (bits << 8) | keydata[j]; nbits += 8; j++; } key[i] = (bits >> (nbits - 7)) << 1; bits &= ~(0x7F << (nbits - 7)); nbits -= 7; } des_key_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key + 4), &dc); des_cbc_encrypt(blk, blk, 24, &dc Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4496873b717e213a01f52921f0b9b674 Text-delta-base-sha1: 7c4301897b17cd7b0a485c3226dfc9eebea45e16 Text-content-length: 143 Text-content-md5: 8e5e910c6a8c0c010e602c2a1c784026 Text-content-sha1: 245c595b37f8d892541126a243bb44b5ae7e35df Content-length: 183 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN#~~/* * Spare function exported directly from uxnet.c. */ int sk_getxdmdata(void *sock, unsigned long *ip, int *port); #endif Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 96495df7b5ae6cabc6012070f3ba7e75 Text-delta-base-sha1: 349660783fa94b811cd9b82c135759e2d42ead0a Text-content-length: 1123 Text-content-md5: 8b6bcd835e327ed002e4d0a2770c4ed2 Text-content-sha1: b5f93084db3e73d15b932c02f019588702701982 Content-length: 1163 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN R8?(PUvWSMxW ~qU$yiustatic struct socket_function_table tcp_fn_table = { sk_tcp_plug, sk_tcp_close, sk_tcp_write, sk_tcp_write_oob, sk_tcp_flush, sk_tcp_set_private_ptr, sk_tcp_get_private_ptr, sk_tcp_set_frozen, sk_tcp_socket_error }; Socket sk_register(void *sock, Plug plug) {tcp_tcp_tcp_int sk_getxdmdata(void *sock, unsigned long *ip, int *port) { Actual_Socket s = (Actual_Socket) sock; struct sockaddr_in addr; socklen_t addrlen; /* * We must check that this socket really _is_ an Actual_Socket. */ if (s->fn != &tcp_fn_table) return 0; /* failure */ /* * If we ever implement connecting to a local X server through * a Unix socket, we return 0xFFFFFFFF for the IP address and * our current pid for the port. Bizarre, but such is life. */ addrlen = sizeof(addr); if (getsockname(s->s, (struct sockaddr *)&addr, &addrlen) < 0 || addr.sin_family != AF_INET) return 0; *ip = ntohl(addr.sin_addr.s_addr); *port = ntohs(addr.sin_port); return 1 Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: de5e64902d7c6e1ffd7e389803a8eac2 Text-delta-base-sha1: 73d3789682693608afb23ba3621088a68828458f Text-content-length: 375 Text-content-md5: bbd20afab6f20c6bc073f6f831cb795c Text-content-sha1: 497ed9ab9688d137f4e7b08ff5b361ca968cbf7b Content-length: 415 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN{b _b_!Zsk_getxdmdata() does not exist under Windows (not that I * couldn't write it if I wanted to, but I haven't bothered), so * it's a macro which always returns FALSE. With any luck this will * cause the compiler to notice it can optimise away the * implementation of XDM-AUTHORIZATION-1 in x11fwd.c :-) */ #define sk_getxdmdata(socket, ip, port) (0) Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 650883bb56646420d992d1b66558437b Text-delta-base-sha1: 6e281a0005949752c8dcc02ada16f2f73ad7b76e Text-content-length: 626 Text-content-md5: b9a84953b95dc03a09701e850a3d6874 Text-content-sha1: 303fdced77a8d2acc94cd2ed4a3bc43a61643fd2 Content-length: 666 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNLkLI 7v=31Km_#include #include #include #include auth->realproto == X11_XDM && pr->auth->reallen == 16 && sk_getxdmdata(s, &ip, &port)) { time_t t; realauthlen = 24; memset(realauthdata, 0, 24); memcpy(realauthdata, pr->auth->realdata, 8); PUT_32BIT_MSB_FIRST(realauthdata+8, ip); PUT_16BIT_MSB_FIRST(realauthdata+12, port); t = time(NULL); PUT_32BIT_MSB_FIRST(realauthdata+14, t); des_encrypt_xdmauth(pr->auth->realdata+9, realauthdata, 24); Revision-number: 2538 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2003-01-11T09:46:50.000000Z K 7 svn:log V 52 Hack around an oddity in X display names and xauth. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 70837597e35f395d8262497f5dbed5c7 Text-delta-base-sha1: 1c0ada125844d5cb8995058d710eebb85d19e0be Text-content-length: 337 Text-content-md5: effd2c4edb047ea7789edb07c64e0ab0 Text-content-sha1: cdb5f38d7a46d4517f11232c507b89fcd00c035f Content-length: 376 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN/h 9G9hG/* * Normally we should run `xauth list DISPLAYNAME'. However, * there's an oddity when the display is local: the display * `localhost:0' (or `:0') should become just `:0'. */ if (!strncmp(display, "localhost:", 10)) command = dupprintf("xauth list %s 2>/dev/null", display+9); else Revision-number: 2539 Prop-content-length: 350 Content-length: 350 K 8 svn:date V 27 2003-01-11T10:05:29.000000Z K 7 svn:log V 249 Yet _another_ `received data for nonexistent channel' bug. This time it was because we received WINDOW_ADJUST on a channel we'd already sent CLOSE on, and reflexively attempted to continue sending the buffered data in response. Should now be fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4e1c0d3344ef81778219902cdb2efee5 Text-delta-base-sha1: a51d8a82e70854d823b4e23ff601fe038dcb6e2f Text-content-length: 194 Text-content-md5: d54a8eb6ec5e322083772913cf68d6a1 Text-content-sha1: 3c59b87928b9ae0bd77ff3be434d9c71a7573bd6 Content-length: 235 K 15 cvs2svn:cvs-rev V 5 1.261 PROPS-END SVNO?DVkQ: || c->closes) continue; /* nonexistent or closing; if (c->closes) continue; /* don't send on closing channels */ Revision-number: 2540 Prop-content-length: 147 Content-length: 147 K 7 svn:log V 49 const fallout from Simon's X forwarding changes. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-11T14:08:07.000000Z PROPS-END Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8bb854d81acded60311afd5abedb9896 Text-delta-base-sha1: 64d6f35a421964f3b6d7b49544ca525e2905e9b1 Text-content-length: 263 Text-content-md5: de8cf28b1d5a5c85d749f83c81b5ecee Text-content-sha1: b7e6d23d323d91d66b026e646d5b7eec835da4c1 Content-length: 302 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN []Ph^>ld)const *, int); static int mactcp_write_oob(Socket, char constconst/* * Casting away const from buf should be safe -- MacTCP won't * write to it. */ wds[0].length = len; wds[0].ptr = (char *)const Revision-number: 2541 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2003-01-11T14:08:46.000000Z K 7 svn:log V 53 Add a cast for a char * vs unsigned char * conflict. K 10 svn:author V 3 ben PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b9a84953b95dc03a09701e850a3d6874 Text-delta-base-sha1: 303fdced77a8d2acc94cd2ed4a3bc43a61643fd2 Text-content-length: 47 Text-content-md5: 3959294a81c28f46d8c6086ac1bc1cf7 Text-content-sha1: d48a27d941ad9b6a6f6fc214bd8f35b196c54fa6 Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNk ij (unsigned char *) Revision-number: 2542 Prop-content-length: 223 Content-length: 223 K 7 svn:log V 124 Move the prototype for platform_get_x11_auth() from x11fwd.c to ssh.h so that it can be checked against the implementation. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-11T14:20:00.000000Z PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 15b9c8ba77dcc35ed6d90ad876d18c8d Text-delta-base-sha1: 31632ffde28687007feeac72a371838f7e628f51 Text-content-length: 191 Text-content-md5: d753b2c3526716466d4fbb8681859215 Text-content-sha1: a62fb6ec8267590c2b63b7b057599dc94707952e Content-length: 231 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNDo ''@/* Platfdorm-dependent X11 function */ extern void platform_get_x11_auth(char *display, int *proto, unsigned char *data, int *datalen Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3959294a81c28f46d8c6086ac1bc1cf7 Text-delta-base-sha1: d48a27d941ad9b6a6f6fc214bd8f35b196c54fa6 Text-content-length: 20 Text-content-md5: c001565d16bf5fd4b2f4cacf0c613f7e Text-content-sha1: bb26026e79f6bb3c935b923195f0c708c00d09a4 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN im Revision-number: 2543 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2003-01-11T16:37:02.000000Z K 7 svn:log V 53 Add link to Team page from individual wishlist items K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 14b2f3474ae978e23a4f215b34bbd6f1 Text-delta-base-sha1: 6426875fbdab32d4f85f787bab4dfd3eeea43b9e Text-content-length: 128 Text-content-md5: 8e5a90828a19be313ff0cb89602d9f15 Text-content-sha1: 2488412202de67646e3af328eaa1491b52fce930 Content-length: 168 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN7 iBpB^1#! /usr/bin/perl # $Id: bugs2html,v 1.16 2003/01/11 16:37:02 jacob | Team */ #define TCPS_CLOSED 0 #define TCPS_LISTEN 2 #define TCPS_SYN_RECEIVED 4 #define TCPS_SYN_SENT 6 #define TCPS_ESTABLISHED 8 #define TCPS_FIN_WAIT_1 10 #define TCPS_FIN_WAIT_2 12 #define TCPS_CLOSE_WAIT 14 #define TCPS_CLOSING 16 #define TCPS_LAST_ACK 18 #define TCPS_TIME_WAIT 20} while (TRUE); switch (pb.csParam.status.connectionState) { case TCPS_CLOSE_WAIT: /* Remote end has sent us a FIN */ plug_closing(s->plug, NULL, 0, 0); } Revision-number: 2545 Prop-content-length: 268 Content-length: 268 K 8 svn:date V 27 2003-01-11T17:36:24.000000Z K 7 svn:log V 169 Calling plug_closing() is highly likely to result in a call to sk_close(), so arrange that mactcp_poll() can cope with that and not access freed memory when it happens. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f7bbf03b5118e23eebef863628bf43df Text-delta-base-sha1: c55c9d457be96126db1865d975e8c3adfd4d5096 Text-content-length: 120 Text-content-md5: aea5e4ad4fcdecd5f9a79083ac71a8f6 Text-content-sha1: ff4b24880126147f3a82b9b249b7714c68b5c867 Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNM, ^z^Ty, next; TCPiopb pb; for (s = mactcp.socklist; s != NULL; s = next) { next = s->next; Revision-number: 2546 Prop-content-length: 356 Content-length: 356 K 7 svn:log V 257 Add an indirection layer between mtcpnet.c and the rest of PuTTY so that we can have runtime switching between MacTCP and OpenTransport, and so that we can cope if there's no TCP/IP stack available at all (albeit with very little functionality at present). K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-11T19:43:59.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4a2898e2942ac3d46fb585e588a9978f Text-delta-base-sha1: 840a0c49b017dd883a0739e9d801466d36b8872b Text-content-length: 26 Text-content-md5: 001f67a628ba2b4ca074277017a59e6f Text-content-sha1: 7c494817d38bdd04568403232688243a699ee4b1 Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN^e ?!=acnet Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 34a7e7486a88acc07a47d9f22b84bf28 Text-delta-base-sha1: bd66b861c5d4a3c6fecfb7c06ccb188c85074690 Text-content-length: 375 Text-content-md5: 1f895f324e11893834c0c2d796b3e377 Text-content-sha1: 676cfed959280df2fe7e7d518a9617c62bf62ed6 Content-length: 415 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNhxP(-_Zh.Bxp/* $Id: mac.c,v 1.24 2003/01/11 19:43:59 be /* MacTCP? */ if (Gestalt(FOUR_CHAR_CODE('mtcp'), &mac_gestalts.mtcpvers) != noErr) mac_gestalts.mtcpvers = 0; if (mac_gestalts.mtcpvers > 0) { if (mactcp_init() != noErr) mac_gestalts.mtcpvers = 0; }if (mac_gestalts.mtcpvers != 0) if (mac_gestalts.mtcpvers != 0) Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b0a5cc22729aeb30c6dc6bfe8d7b2c40 Text-delta-base-sha1: 52978131c1523cfc7997a368ac6f09ba7b8bc975 Text-content-length: 620 Text-content-md5: 5e3ad8970bba46d1d98aa1e77331054c Text-content-sha1: ef3aa3c95b4f86e28f4da2faa779e37f1b8abef0 Content-length: 660 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNV)O  =H long mtcpvers;extern SockAddr mactcp_namelookup(char *, char **); extern SockAddr mactcp_nonamelookup(char *); extern void mactcp_getaddr(SockAddr, char *, int); extern int mactcp_hostname_is_local(char *); extern int mactcp_address_is_local(SockAddr); extern int mactcp_addrtype(SockAddr); extern void mactcp_addrcopy(SockAddr, char *); extern void mactcp_addr_free(SockAddr); extern Socket mactcp_register(void *, Plug); extern Socket mactcp_new(SockAddr addr, int, int, int, int, Plug); extern Socket mactcp_newlistener(char *, int, Plug, int); extern char *mactcp_addr_error(SockAddr Node-path: putty/mac/macnet.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2086 Text-content-md5: 548bc80fa378175e6636f159264db948 Text-content-sha1: eae39cd92c629a9bd3aae401c3ba470b9573a259 Content-length: 2202 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN#include "putty.h" #include "network.h" #include "mac.h" /* * Network functions exported to the world. These choose whether to call * MacTCP or OpenTransport and behave accordingly. */ SockAddr sk_namelookup(char *host, char **canonicalname) { if (mac_gestalts.mtcpvers != 0) return mactcp_namelookup(host, canonicalname); else return NULL; } SockAddr sk_nonamelookup(char *host) { if (mac_gestalts.mtcpvers != 0) return mactcp_nonamelookup(host); else return NULL; } void sk_getaddr(SockAddr addr, char *buf, int buflen) { if (mac_gestalts.mtcpvers != 0) mactcp_getaddr(addr, buf, buflen); else *buf = '\0'; } int sk_hostname_is_local(char *name) { if (mac_gestalts.mtcpvers != 0) return mactcp_hostname_is_local(name); else return 0; } int sk_address_is_local(SockAddr addr) { if (mac_gestalts.mtcpvers != 0) return mactcp_address_is_local(addr); else return 0; } int sk_addrtype(SockAddr addr) { if (mac_gestalts.mtcpvers != 0) return mactcp_addrtype(addr); else return 0; } void sk_addrcopy(SockAddr addr, char *buf) { if (mac_gestalts.mtcpvers != 0) mactcp_addrcopy(addr, buf); } void sk_addr_free(SockAddr addr) { if (mac_gestalts.mtcpvers != 0) mactcp_addr_free(addr); } Socket sk_register(void *sock, Plug plug) { if (mac_gestalts.mtcpvers != 0) return mactcp_register(sock, plug); else return NULL; } Socket sk_new(SockAddr addr, int port, int privport, int oobinline, int nodelay, Plug plug) { if (mac_gestalts.mtcpvers != 0) return mactcp_new(addr, port, privport, oobinline, nodelay, plug); else return NULL; } Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only) { if (mac_gestalts.mtcpvers != 0) return mactcp_newlistener(srcaddr, port, plug, local_host_only); else return NULL; } char *sk_addr_error(SockAddr addr) { if (mac_gestalts.mtcpvers != 0) return mactcp_addr_error(addr); else return "No TCP/IP stack installed"; } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aea5e4ad4fcdecd5f9a79083ac71a8f6 Text-delta-base-sha1: ff4b24880126147f3a82b9b249b7714c68b5c867 Text-content-length: 627 Text-content-md5: a071f5fdd1358b47df9d6bc27ddfb0aa Text-content-sha1: 528e841b2a6824a81b55c6d378bf5e4e0c8f4bf6 Content-length: 667 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN,qFAeC*1\Pmn]c vhR^kAmactcpmactcpmactcpmactcp_hostname_is_local(char *name) { return !strcmp(name, "localhost"); } int mactcpmactcpmactcpmactcpmactcp_flush"); } Socket mactcp_register(void *sock, Plug plug) { fatalbox("mactcp_register"); } static TCPNotifyUPP mactcp_asr_upp; Socket mactcpmactcp_newlistener(char *srcaddr, int port, Plug plug, int local_host_only) { fatalbox("mactcpmactcp_namelookup and * mactcp_new if there's a problem. These functions extract an error * message, or return NULL if there's no problem. */ char *mactcp Revision-number: 2547 Prop-content-length: 201 Content-length: 201 K 8 svn:date V 27 2003-01-11T23:33:57.000000Z K 7 svn:log V 102 Initial import of Owen's OpenTransport interface. It doesn't work yet, but it does compile and link. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 001f67a628ba2b4ca074277017a59e6f Text-delta-base-sha1: 7c494817d38bdd04568403232688243a699ee4b1 Text-content-length: 23 Text-content-md5: 7989ca8604c71bbf423480a6745d08e7 Text-content-sha1: d74c9c58b58414996c2c5c336d560771597a9940 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNek MIot Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1f895f324e11893834c0c2d796b3e377 Text-delta-base-sha1: 676cfed959280df2fe7e7d518a9617c62bf62ed6 Text-content-length: 575 Text-content-md5: 397868cfcf31cdf3653a9fef94057aae Text-content-sha1: 645979171f564b543a9de3ca3590919afde6016e Content-length: 615 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNxf2(l-2i/* $Id: mac.c,v 1.25 2003/01/11 23:33:57OpenTransport? */ if (Gestalt(gestaltOpenTpt, &mac_gestalts.otptattr) != noErr || (mac_gestalts.otptattr & gestaltOpenTptTCPPresentMask) == 0 || ot_init() != noErr) mac_gestalts.otptattr = 0; if (mac_gestalts.otptattr == 0) { /* MacTCP? */ if (Gestalt(FOUR_CHAR_CODE('mtcp'), &mac_gestalts.mtcpvers) != noErr) mac_gestalts.mtcpvers = 0; if (mac_gestalts.mtcpvers > 0) { if (mactcp_init() != noErr) mac_gestalts.mtcpvers = 0; } } else mac_gestalts.mtcpvers = 0;sk_cleanup Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5e3ad8970bba46d1d98aa1e77331054c Text-delta-base-sha1: ef3aa3c95b4f86e28f4da2faa779e37f1b8abef0 Text-content-length: 668 Text-content-md5: 00db543800595fcd72defaf473f8b95e Text-content-sha1: b8ceda34e1e1c8e84a800e8e4ebe08fa82aa8318 Content-length: 708 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN)3yZg}a\M long otptattrcleanup/* from otnet.c */ extern OSErr ot_init(void); extern void ot_cleanup(void); extern void ot_poll(void); extern SockAddr ot_namelookup(char *, char **); extern SockAddr ot_nonamelookup(char *); extern void ot_getaddr(SockAddr, char *, int); extern int ot_hostname_is_local(char *); extern int ot_address_is_local(SockAddr); extern int ot_addrtype(SockAddr); extern void ot_addrcopy(SockAddr, char *); extern void ot_addr_free(SockAddr); extern Socket ot_register(void *, Plug); extern Socket ot_new(SockAddr addr, int, int, int, int, Plug); extern Socket ot_newlistener(char *, int, Plug, int); extern char *ot Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 548bc80fa378175e6636f159264db948 Text-delta-base-sha1: eae39cd92c629a9bd3aae401c3ba470b9573a259 Text-content-length: 944 Text-content-md5: c6890770886a50a8404485a8aaff6901 Text-content-sha1: 0767a161f17152a37183631925c5371876a600ef Content-length: 983 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNFSQC(},-7DHzP8[%WfnU8BshBVotptattr != 0) return ot_namelookup(host, canonicalname); elseotptattr != 0) return ot_nonamelookup(host); elseotptattr != 0) ot_getaddr(addr, buf, buflen); elseotptattr != 0) return ot_hostname_is_local(name); elseotptattr != 0) return ot_address_is_local(addr); elseotptattr != 0) return ot_addrtype(addr); elseotptattr != 0) ot_addrcopy(addr, buf); elseotptattr != 0) ot_addr_free(addr); elseotptattr != 0) return ot_register(sock, plug); elseotptattr != 0) return ot_new(addr, port, privport, oobinline, nodelay, plug); elseotptattr != 0) return ot_newlistener(srcaddr, port, plug, local_host_only); elseotptattr != 0) return ot_addr_error(addr); elsevoid sk_cleanup(void) { if (mac_gestalts.otptattr != 0) ot_cleanup(); else if (mac_gestalts.mtcpvers != 0) mactcp_cleanup() Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a071f5fdd1358b47df9d6bc27ddfb0aa Text-delta-base-sha1: 528e841b2a6824a81b55c6d378bf5e4e0c8f4bf6 Text-content-length: 30 Text-content-md5: 010b781630db98879d874fc586da09a8 Text-content-sha1: 4735d38f5c953195761e11669fdcbe77aace5965 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNqp *?2cleanup Node-path: putty/mac/otnet.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 9018 Text-content-md5: 46fb4d16bfc680442cb44999a5b94ed0 Text-content-sha1: 7abed27a7df8d3966571712774c67cf3c15f016d Content-length: 9134 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN,,,/* * Macintosh OpenTransport networking abstraction */ #include #include #define DEFINE_PLUG_METHOD_MACROS #include "putty.h" #include "network.h" #include "mac.h" struct Socket_tag { struct socket_function_table *fn; /* other stuff... */ char *error; EndpointRef ep; Plug plug; void *private_ptr; bufchain output_data; int connected; int writable; int frozen; /* this causes readability notifications to be ignored */ int frozen_readable; /* this means we missed at least one readability * notification while we were frozen */ int localhost_only; /* for listening sockets */ char oobdata[1]; int sending_oob; int oobpending; /* is there OOB data available to read?*/ int oobinline; int pending_error; /* in case send() returns error */ int listener; struct Socket_tag *next; struct Socket_tag **prev; }; typedef struct Socket_tag *Actual_Socket; struct SockAddr_tag { char *error; DNSAddress address; }; /* Globals */ static struct { Actual_Socket socklist; } ot; OSErr ot_init(void) { return InitOpenTransport(); } void ot_cleanup(void) { Actual_Socket s; for (s = ot.socklist; s !=NULL; s = s->next) { OTUnbind(s->ep); OTCloseProvider(s->ep); } CloseOpenTransport(); } static char *error_string(int error) { return "An error..."; } SockAddr ot_namelookup(char *host, char **canonicalname) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); OTInitDNSAddress(&(ret->address), host); /* for now we'll pretend canonicalname is always just host */ *canonicalname = smalloc(1+strlen(host)); strcpy(*canonicalname, host); return ret; } SockAddr ot_nonamelookup(char *host) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); OTInitDNSAddress(&(ret->address), host); return ret; } void ot_getaddr(SockAddr addr, char *buf, int buflen) { strncpy(buf, (addr->address).fName, buflen); } /* I think "local" here really means "loopback" */ int ot_hostname_is_local(char *name) { return !strcmp(name, "localhost"); } int ot_address_is_local(SockAddr addr) { /* FIXME */ return FALSE; } int ot_addrtype(SockAddr addr) { return ADDRTYPE_IPV4; } void ot_addrcopy(SockAddr addr, char *buf) { } void ot_addr_free(SockAddr addr) { sfree(addr); } static Plug ot_tcp_plug(Socket sock, Plug p) { Actual_Socket s = (Actual_Socket) sock; Plug ret = s->plug; if (p) s->plug = p; return ret; } static void ot_tcp_flush(Socket s) { /* * We send data to the socket as soon as we can anyway, * so we don't need to do anything here. :-) */ } static void ot_tcp_close(Socket s); static int ot_tcp_write(Socket s, char const *data, int len); static int ot_tcp_write_oob(Socket s, char const *data, int len); static void ot_tcp_set_private_ptr(Socket s, void *ptr); static void *ot_tcp_get_private_ptr(Socket s); static void ot_tcp_set_frozen(Socket s, int is_frozen); static char *ot_tcp_socket_error(Socket s); static void ot_recv(Actual_Socket s); void ot_poll(void); Socket ot_register(void *sock, Plug plug) { static struct socket_function_table fn_table = { ot_tcp_plug, ot_tcp_close, ot_tcp_write, ot_tcp_write_oob, ot_tcp_flush, ot_tcp_set_private_ptr, ot_tcp_get_private_ptr, ot_tcp_set_frozen, ot_tcp_socket_error }; Actual_Socket ret; ret = smalloc(sizeof(struct Socket_tag)); ret->fn = &fn_table; ret->error = NULL; ret->plug = plug; bufchain_init(&ret->output_data); ret->writable = 1; /* to start with */ ret->sending_oob = 0; ret->frozen = 1; ret->frozen_readable = 0; ret->localhost_only = 0; /* unused, but best init anyway */ ret->pending_error = 0; ret->oobpending = FALSE; ret->listener = 0; ret->ep = (EndpointRef)sock; /* some sort of error checking */ ret->oobinline = 0; /* Add this to the list of all sockets */ ret->next = ot.socklist; ret->prev = &ot.socklist; ot.socklist = ret; return (Socket) ret; } Socket ot_new(SockAddr addr, int port, int privport, int oobinline, int nodelay, Plug plug) { static struct socket_function_table fn_table = { ot_tcp_plug, ot_tcp_close, ot_tcp_write, ot_tcp_write_oob, ot_tcp_flush, ot_tcp_set_private_ptr, ot_tcp_get_private_ptr, ot_tcp_set_frozen, ot_tcp_socket_error }; Actual_Socket ret; EndpointRef ep; OSStatus err; TCall connectCall; ret = smalloc(sizeof(struct Socket_tag)); ret->fn = &fn_table; ret->error = NULL; ret->plug = plug; bufchain_init(&ret->output_data); ret->connected = 0; /* to start with */ ret->writable = 0; /* to start with */ ret->sending_oob = 0; ret->frozen = 0; ret->frozen_readable = 0; ret->localhost_only = 0; /* unused, but best init anyway */ ret->pending_error = 0; ret->oobinline = oobinline; ret->oobpending = FALSE; ret->listener = 0; /* Open Endpoint, configure it for TCP over anything */ ep = OTOpenEndpoint(OTCreateConfiguration("tcp"), 0, NULL, &err); ret->ep = ep; if (err) { ret->error = error_string(err); return (Socket) ret; } /* TODO: oobinline, nodelay */ /* * Bind to local address. */ /* FIXME: pay attention to privport */ err = OTBind(ep, NULL, NULL); /* OpenTransport always picks our address */ if (err) { ret->error = error_string(err); return (Socket) ret; } /* * Connect to remote address. */ /* FIXME: bolt the port onto the end */ OTMemzero(&connectCall, sizeof(TCall)); connectCall.addr.buf = (UInt8 *) &(addr->address); connectCall.addr.len = sizeof(DNSAddress); err = OTConnect(ep, &connectCall, nil); if (err) { ret->error = error_string(err); return (Socket) ret; } else { ret->connected = 1; ret->writable = 1; } /* Add this to the list of all sockets */ ret->next = ot.socklist; ret->prev = &ot.socklist; ot.socklist = ret; return (Socket) ret; } Socket ot_newlistener(char *foobar, int port, Plug plug, int local_host_only) { Actual_Socket s; return (Socket) s; } static void ot_tcp_close(Socket sock) { Actual_Socket s = (Actual_Socket) sock; OTCloseProvider(s->ep); /* Unhitch from list of sockets */ *s->prev = s->next; if (s->next != NULL) s->next->prev = s->prev; sfree(s); } static void try_send(Actual_Socket s) { while (bufchain_size(&s->output_data) > 0) { int nsent; void *data; int len; /* Don't care about oob right now */ bufchain_prefix(&s->output_data, &data, &len); nsent = OTSnd(s->ep, data, len, 0); noise_ultralight(nsent); if (nsent <= 0) { /* something bad happened, hey ho */ } else { /* still don't care about oob */ bufchain_consume(&s->output_data, nsent); } } } static int ot_tcp_write(Socket sock, char const *buf, int len) { Actual_Socket s = (Actual_Socket) sock; bufchain_add(&s->output_data, buf, len); if (s->writable) try_send(s); return bufchain_size(&s->output_data); } static int ot_tcp_write_oob(Socket sock, char const *buf, int len) { /* Don't care about oob */ return 0; } /* * Each socket abstraction contains a `void *' private field in * which the client can keep state. */ static void ot_tcp_set_private_ptr(Socket sock, void *ptr) { Actual_Socket s = (Actual_Socket) sock; s->private_ptr = ptr; } static void *ot_tcp_get_private_ptr(Socket sock) { Actual_Socket s = (Actual_Socket) sock; return s->private_ptr; } /* * Special error values are returned from ot_namelookup and ot_new * if there's a problem. These functions extract an error message, * or return NULL if there's no problem. */ char *ot_addr_error(SockAddr addr) { return addr->error; } static char *ot_tcp_socket_error(Socket sock) { Actual_Socket s = (Actual_Socket) sock; return s->error; } static void ot_tcp_set_frozen(Socket sock, int is_frozen) { Actual_Socket s = (Actual_Socket) sock; if (s->frozen == is_frozen) return; s->frozen = is_frozen; } /* * Poll all our sockets from an event loop */ void ot_poll(void) { Actual_Socket s; OTResult o; for (s = ot.socklist; s != NULL; s = s->next) { o = OTLook(s->ep); switch(o) { case T_DATA: /* Normal Data */ ot_recv(s); break; case T_EXDATA: /* Expedited Data (urgent?) */ ot_recv(s); break; } } } void ot_recv(Actual_Socket s) { OTResult o; char buf[20480]; OTFlags flags; if (s->frozen) return; while ((o = OTRcv(s->ep, buf, sizeof(buf), &flags)) != kOTNoDataErr) { plug_receive(s->plug, 0, buf, sizeof(buf)); } } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 71668667edc645c01e68d904105f78af Text-delta-base-sha1: c4b45c0fe0fbff184047d4cf86d1f12a1b43d34a Text-content-length: 522 Text-content-md5: 391e0cda5037c39ea17798544050ddaa Text-content-sha1: c0e24c4e21e7e70b9fce8dfce6d5517ca9f71dca Content-length: 562 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNd{f0V<);OpenTransport.o" \xb6 "{Libraries}OpenTransportApp.o" \xb6 "{Libraries}OpenTptInetSharedLibraries}OpenTransportLib" \xb6 -weaklib OTClientLib \xb6 -weaklib OTClientUtilLib \xb6 -weaklib OTUtilityLib \xb6 "{SharedLibraries}OpenTptInternetLib" \xb6 -weaklib OTInetClientLib \xb6 "{PPCLibraries}StdCRuntime.o" \xb6 "{PPCLibraries}PPCCRuntime.o" \xb6 "{PPCLibraries}CarbonAccessors.o" \xb6 "{PPCLibraries}OpenTransportAppPPC.o" \xb6 "{PPCLibraries}OpenTptInetPPC Revision-number: 2548 Prop-content-length: 308 Content-length: 308 K 8 svn:date V 27 2003-01-12T01:24:03.000000Z K 7 svn:log V 209 Change error handling to store the error number rather than the string, and to convert to a string only on demand. This makes it possible to have the string contain the error number if we don't recognise it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 46fb4d16bfc680442cb44999a5b94ed0 Text-delta-base-sha1: 7abed27a7df8d3966571712774c67cf3c15f016d Text-content-length: 393 Text-content-md5: 9d49fd860b7e7ee03a057ff703d48cc8 Text-content-sha1: 03e26f8006c0ad19478c797932179e4b1f620b49 Content-length: 432 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN,HC:&z,N,}>^6\sxy`^dt{EgOSStatus OSStatus ret->error = kOTNoError;kOTNoErrorkOTNoErrorstatic char buf[128]; if (addr->error == kOTNoError) return NULL; sprintf(buf, "error %d", addr->error); return bufstatic char buf[128]; if (s->error == kOTNoError) return NULL; sprintf(buf, "error %d", s->error); return buf Revision-number: 2549 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2003-01-12T01:25:34.000000Z K 7 svn:log V 112 Remove code for splatting test data into new terminals, since we can do that over real network connections now. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 702fdacc8261bd076dcee5aeffd990f7 Text-delta-base-sha1: 44e547bf6106c5146f2f220732d01d315ae25c23 Text-content-length: 63 Text-content-md5: aeb25fa365934e28c15b84d309b39121 Text-content-sha1: 4ccb836dd15a2130f6c56954f0d69b5bd996941f Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNQ,%,/* $Id: mac_res.r,v 1.12 2003/01/12 01:25:34 Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 67bedc57479215cc61d6e94c87b4325e Text-delta-base-sha1: 45ec23a0b7248fe0fd283bf593d49507a420d2c0 Text-content-length: 97 Text-content-md5: 33d780b0291346f962c866cf5b2ebe29 Text-content-sha1: e6859902caf40ebc97e2729dc0129de68f410e02 Content-length: 137 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN_9r,Jzmm7}op/* $Id: macterm.c,v 1.40 2003/01/12 01:25:34fatalbox("%s" Revision-number: 2550 Prop-content-length: 197 Content-length: 197 K 8 svn:date V 27 2003-01-12T01:37:24.000000Z K 7 svn:log V 99 Use memset() rather than OTMemzero(), and hence remove the need to weak link against OTUtilityLib. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9d49fd860b7e7ee03a057ff703d48cc8 Text-delta-base-sha1: 03e26f8006c0ad19478c797932179e4b1f620b49 Text-content-length: 62 Text-content-md5: 64b21d2b702d387a0f2b0eb61aafd504 Text-content-sha1: 5aeec5503919628bd8d1c474484c81a498f6608d Content-length: 101 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNH]%tynK}include -`&gI5+WV|]TvVint resolved; OSStatus error; InetHostInfo hostinfo; char hostname[512]; }; /* Globals */ static struct { Actual_Socket socklist; InetSvcRef inetsvc; } ot; OSErr ot_init(void) { OSStatus err; err = InitOpenTransport(); if (err != kOTNoError) return err; ot.inetsvc = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err); return errchar *realhost; ret->error = OTInetStringToAddress(ot.inetsvc, host, &ret->hostinfo); ret->resolved = TRUE; if (ret->error == kOTNoError) realhost = ret->hostinfo.name; else realhost = ""; *canonicalname = smalloc(1+strlen(realhost)); strcpy(*canonicalname, realret->resolved = FALSE; ret->error = kOTNoError; ret->hostname[0] = '\0'; strncat(ret->hostname, host, lenof(ret->hostname) - 1); return ret; } void ot_getaddr(SockAddr addr, char *buf, int buflen) { char mybuf[16]; buf[0] = '\0'; if (addr->resolved) { /* XXX only return first address */ OTInetHostToString(addr->hostinfo.addrs[0], mybuf); strncat(buf, mybuf, buflen - 1); } else strncat(buf, addr->hostname, buflen - 1 int i; if (addr->resolved) for (i = 0; i < kMaxHostAddrs; i++) if (addr->hostinfo.addrs[i] & 0xff000000 == 0x7f000000) return TRUE; return FALSE; } int ot_addrtype(SockAddr addr) { if (addr->resolved) return ADDRTYPE_IPV4; return ADDRTYPE_NAME; } void ot_addrcopy(SockAddr addr, char *buf) { /* XXX only return first address */ memcpy(buf, &addr->hostinfo.addrs[0], 4);InetAddress destXXX Try non-primary addresses */ OTInitInetAddress(&dest, port, addr->hostinfo.addrs[0]);dest; connectCall.addr.len = sizeof(dest Revision-number: 2552 Prop-content-length: 525 Content-length: 525 K 8 svn:date V 27 2003-01-12T13:44:35.000000Z K 7 svn:log V 424 Each platform's implementation of askappend() is no longer required to consult cfg.logxfovr, because it gets done once in logging.c. askappend() is now called only when a question _really_ needs to be asked of the user. Also in this checkin, cleanup_exit() in console.c no longer consults cfg.protocol to decide whether to save the random seed, because random_save_seed() can make that decision for itself and do it better. K 10 svn:author V 5 simon PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5abe731a298ee1d6de04d31673eff5f9 Text-delta-base-sha1: 5d892a3907ea4baa409c02ad2ec9746b2ba6b458 Text-content-length: 93 Text-content-md5: addb75b61575e608689ce322eef29247 Text-content-sha1: 8f2e902cd90999b7125d209aca58b6cc5de15e11 Content-length: 132 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN BBW{_*random_save_seed(); #ifdef MSCRYPTOAPI crypto_wrapup(); #endif Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f858bfbba99b20990f6de90c532e9c45 Text-delta-base-sha1: f781289caa90aafc5850160b8fc90a875ff968be Text-content-length: 113 Text-content-md5: 10b68098c2432cff8641c7fb1fb225ff Text-content-sha1: d8e103b0877228a7693d912ccef346f472213579 Content-length: 152 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN% [y[-xf (cfg.logxfovr != LGXF_ASK) { i = ((cfg.logxfovr == LGXF_OVR) ? 2 : 1); } else Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 675f9d2e1452202751dea7e5b9890f65 Text-delta-base-sha1: e62b9d6ced6941922ccb2656b2d9d337eb2c296f Text-content-length: 20 Text-content-md5: d0916d1e19b9b525f734466137bb192b Text-content-sha1: 1d6d10fa4f45b51a844e7140b732aef49b56b592 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN#K / Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 89e88fe9d5163803ca84130230cf8391 Text-delta-base-sha1: f0de73a713df92ffcfd55b0d000e238172a46779 Text-content-length: 40 Text-content-md5: 204bafdc1303281c6de47a72c0f3d159 Text-content-sha1: 313d11761f9793d717d5efd6a2e8598591ee418d Content-length: 81 K 15 cvs2svn:cvs-rev V 5 1.197 PROPS-END SVNAj Or Revision-number: 2553 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2003-01-12T13:50:04.000000Z K 7 svn:log V 50 Correct code to insert into a doubly-linked list. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 33d780b0291346f962c866cf5b2ebe29 Text-delta-base-sha1: e6859902caf40ebc97e2729dc0129de68f410e02 Text-content-length: 92 Text-content-md5: f7c617fd0c7d323dd197b254ef8f489f Text-content-sha1: fca33faa03d3465d9bf1348b0aaaf0f963dea71f Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVN C"+;M/* $Id: macterm.c,v 1.41 2003/01/12 13:50:0if (ret->next != NULL) Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 010b781630db98879d874fc586da09a8 Text-delta-base-sha1: 4735d38f5c953195761e11669fdcbe77aace5965 Text-content-length: 47 Text-content-md5: 30c3701dc359ab85c868784dbcc3b659 Text-content-sha1: 2cf5bba7c6ac9521d86a5c92bd103bc1e075fc0a Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNp RRif (ret->next != NULL) Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 31e7b6ea546a54b05964d6976780aa99 Text-delta-base-sha1: bd1497ccd33163cc193916f5a4d9eec88b60390f Text-content-length: 304 Text-content-md5: 3b68be38075c1628e9243c3a908ae976 Text-content-sha1: 2d99ce578b4cc7568cfcc930f426c8df207b724d Content-length: 343 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNq0)`A0if (ret->next != NULL) ret->next->prev = &ret->nexdo { o = OTRcv(s->ep, buf, sizeof(buf), &flags); if (o > 0) plug_receive(s->plug, 0, buf, sizeof(buf)); if (o < 0 && o != kOTNoDataErr) plug_closing(s->plug, NULL, 0, 0); /* XXX Error msg */ } while (o > 0); Revision-number: 2554 Prop-content-length: 397 Content-length: 397 K 8 svn:date V 27 2003-01-12T14:11:38.000000Z K 7 svn:log V 296 Support for XDM-AUTHORIZATION-1 at the SSH server end, making use of the remote IP/port data provided by the server for forwarded connections. Disabled by default, since it's incompatible with SSH2, probably incompatible with some X clients, and tickles a bug in at least one version of OpenSSH. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 15975e0ec2f2050f2d4f3788215a76d3 Text-delta-base-sha1: a6c8877c830bcb1aa9036e978bb0896b81cfc3a6 Text-content-length: 2194 Text-content-md5: e92173065033dbe029334dff0ff58379 Text-content-sha1: dfb80692d63844926a15c7a8766484bd6044af79 Content-length: 2234 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNs;u45@a\versionid $Id: config.but,v 1.48 2003/01/12 14:11:382{config-ssh-x11auth} Remote X11 authentication \cfg{winhelp-topic}{ssh.tunnels.x11auth} If you are using X11 forwarding, the virtual X server created on the SSH server machine will be protected by authorisation data. This data is invented, and checked, by PuTTY. The usual authorisation method used for this is called \cw{MIT-MAGIC-COOKIE-1}. This is a simple password-style protocol: the X client sends some cookie data to the server, and the server checks that it matches the real cookie. The cookie data is sent over an unencrypted X11 connection; so if you allow a client on a third machine to access the virtual X server, then the cookie will be sent in the clear. PuTTY offers the alternative protocol \cw{XDM-AUTHORIZATION-1}. This is a cryptographically authenticated protocol: the data sent by the X client is different every time, and it depends on the IP address and port of the client's end of the connection and is also stamped with the current time. So an eavesdropper who captures an \cw{XDM-AUTHORIZATION-1} string cannot immediately re-use it for their own X connection. PuTTY's support for \cw{XDM-AUTHORIZATION-1} is a somewhat experimental feature, and may encounter several problems: \b Some X clients probably do not even support \cw{XDM-AUTHORIZATION-1}, so they will not know what to do with the data PuTTY has provided. \b This authentication mechanism will only work in SSH v2. In SSH v1, the SSH server does not tell the client the source address of a forwarded connection in a machine-readable format, so it's impossible to verify the \cw{XDM-AUTHORIZATION-1} data. \b You may find this feature causes problems with some SSH servers, which will not clean up \cw{XDM-AUTHORIZATION-1} data after a session, so that if you then connect to the same server using a client which only does \cw{MIT-MAGIC-COOKIE-1} and are allocated the same remote display number, you might find that out-of-date authentication data is still present on your server and your X connections fail. PuTTY's default is \cw{MIT-MAGIC-COOKIE-1}. If you change it, you should be sure you know what you're do Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 43d766587fdb457321749041841ed9eb Text-delta-base-sha1: 02cb485273f9b3e9df0d11871cf2bfd7b099c4ed Text-content-length: 35 Text-content-md5: 38813e9d1bb72efcf704a38cfa891ec4 Text-content-sha1: f642658305e2b066768a1f0f99925fd7966b610b Content-length: 76 K 15 cvs2svn:cvs-rev V 5 1.182 PROPS-END SVNTf P Jint x11_auth Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 13b38adac14104b9799ebd4b564fc849 Text-delta-base-sha1: 0c11c4a03102eb9891104a3cf4889186782c1ad3 Text-content-length: 113 Text-content-md5: c674de9556b296b93bfa696140baa96b Text-content-sha1: c84ce7216cb2d7229be13c0cd9ee66a60949e08c Content-length: 153 K 15 cvs2svn:cvs-rev V 4 1.95 PROPS-END SVNWNS>\avX11AuthType", cfg->x11_auth gppi(sesskey, "X11AuthType", X11_MIT, &cfg->x11_auth Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d54a8eb6ec5e322083772913cf68d6a1 Text-delta-base-sha1: 3c59b87928b9ae0bd77ff3be434d9c71a7573bd6 Text-content-length: 410 Text-content-md5: 3c99ad948690b553fd923570c4185885 Text-content-sha1: 99765c2e91d169c8f337b4076e8d4a5a8ed6ccdf Content-length: 451 K 15 cvs2svn:cvs-rev V 5 1.262 PROPS-END SVNaxaY, cfg.x11_auth, NULL, -1?0&qGq*.Tu.pfd.s != NUL, cfg.x11_authpeeraddr; int peeraddrlen; int port ssh2_pkt_getstring(ssh, &peeraddr, &peeraddrlen); portchar *addrstr = smalloc(peeraddrlen+1); memcpy(addrstr, peeraddr, peeraddrlen); peeraddr[peeraddrlen] = '\0'; , addrstr, port sfree(addrstr); Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d753b2c3526716466d4fbb8681859215 Text-delta-base-sha1: a62fb6ec8267590c2b63b7b057599dc94707952e Text-content-length: 62 Text-content-md5: b62215ace4490018aba0d17292934cee Text-content-sha1: e03ddc94e5c5b606c6feaa71dafa9477b5fe07ca Content-length: 102 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNoR??S;!N, const char *, intvoid des_de Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bab80fb631ba732f43cf262cb01f3199 Text-delta-base-sha1: 7eb59e4eacac5ba0e6c18b18e516ae22b346a1df Text-content-length: 395 Text-content-md5: 7f33d8c13988b7fdb09d383d6d733869 Text-content-sha1: af4d2f1f64f197a5bedd894f70575d29ed6abbcb Content-length: 435 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN)azcouZt{}static void des_keysetup_xdmauth(unsigned char *keydata, DESContext *dc) { unsigned char key[8] dcDESContext dc; des_keysetup_xdmauth(keydata, &dc); des_cbc_encrypt(blk, blk, 24, &dc); } void des_decrypt_xdmauth(unsigned char *keydata, unsigned char *blk, int len) { DESContext dc; des_keysetup_xdmauth(keydata, &dc); des_cbc_de Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 204bafdc1303281c6de47a72c0f3d159 Text-delta-base-sha1: 313d11761f9793d717d5efd6a2e8598591ee418d Text-content-length: 1121 Text-content-md5: 345cb82161bbc6b8441b4c44529036d7 Text-content-sha1: 4c4123250b0da57e9a9c5f3c03da8cf37c6b061a Content-length: 1162 K 15 cvs2svn:cvs-rev V 5 1.198 PROPS-END SVN+-x^n`F8k?{P?/(X11AUTHSTATIC, IDC_X11MIT, IDC_X11XDMX11AUTHSTATIC: case IDC_X11MIT: case IDC_X11XDM: return "JI(`',`ssh.tunnels.x11auth CheckRadioButton(hwnd, IDC_X11MIT, IDC_X11XDM, cfg.x11_auth == X11_MIT ? IDC_X11MIT : IDC_X11XDMstatic); radioline(&cp, "Remote X11 a&uthentication protocol", IDC_X11AUTHSTATIC, 2, "MIT-Magic-Cookie-1", IDC_X11MIT, "XDM-Authorization-1", IDC_X11XDMj]P Y~P3Q~BQ~_ ram) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.agentfwd = IsDlgButtonChecked(hwnd, IDC_AGENTFWD); break; case IDC_CHANGEUSERchange_username = IsDlgButtonChecked(hwnd, IDC_CHANGEUSER); break; case IDC_CIPHERLIST: case IDC_CIPHERUP: case IDC_CIPHERDN: handle_prefslist(&cipherlist, cfg.ssh_cipherlist,X11MIT: case IDC_X11XDM { if (IsDlgButtonChecked(hwnd, IDC_X11MIT)) cfg.x11_auth = X11_MIT; else if (IsDlgButtonChecked(hwnd, IDC_X11XDM)) cfg.x11_auth = X11_XDM; } break; case IDC_PFWDADD Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c001565d16bf5fd4b2f4cacf0c613f7e Text-delta-base-sha1: bb26026e79f6bb3c935b923195f0c708c00d09a4 Text-content-length: 3420 Text-content-md5: c0147760f179bac2310ea930ea80500e Text-content-sha1: 09f4765058b166227cef1134dc1a6dfad8431a06 Content-length: 3460 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNQVzz>q&QsELX,~~U2;aZn;Pwt4flI[dchar)(value), \ (cp)[1] = (char)((value) >> 8), \ (cp)[2] = (char)((value) >> 16), \ (cp)[3] = (char)((value) >> 24)char)(value), \ (cp)[1] = (char)((value) >> 8)char)((value) >> 24), \ (cp)[1] = (char)((value) >> 16), \ (cp)[2] = (char)((value) >> 8), \ (cp)[3] = (char)char)((value) >> 8), \ (cp)[1] = (char)unsigned long peer_ip; int peer_port char *data, int datamaxlen, int proto_id) { struct X11Auth *auth = smalloc(sizeof(struct X11Auth)); char ourdata[64]; int i; if (proto_id == X11_MIT) { auth->fakeproto = X11_MIT; /* MIT-MAGIC-COOKIE-1. Cookie size is 128 bits (16 bytes). */ auth->fakelen = 16; for (i = 0; i < 16; i++) auth->fakedata[i] = random_byte(); } else { assert(proto_id == X11_XDM); auth->fakeproto = X11_XDM; /* XDM-AUTHORIZATION-1. Cookie size is 16 bytes; byte 8 is zero. */ auth->fakelen = 16; for (i = 0; i < 16; i++) auth->fakedata[i] = (i == 8 ? 0 : random_byte()); }char *x11_verify(unsigned long peer_ip, int peer_port, struct X11Auth *auth, char *proto, unsigned char *data, int dlen) { if (strcmp(proto, x11_authnames[auth->fakeproto]) != 0) return "wrong authentication protocol attempted"; if (auth->fakeproto == X11_MIT) { if (dlen != auth->fakelen) return "MIT-MAGIC-COOKIE-1 data was wrong length"; if (memcmp(auth->fakedata, data, dlen) != 0) return "MIT-MAGIC-COOKIE-1 data did not match"; } if (auth->fakeproto == X11_XDM) { unsigned long t; time_t tim; int i; if (dlen != 24) return "XDM-AUTHORIZATION-1 data was wrong length"; if (peer_port == -1) return "cannot do XDM-AUTHORIZATION-1 without remote address data"; des_decrypt_xdmauth(auth->fakedata+9, data, 24); if (memcmp(auth->fakedata, data, 8) != 0) return "XDM-AUTHORIZATION-1 data failed check"; /* cookie wrong */ if (GET_32BIT_MSB_FIRST(data+8) != peer_ip) return "XDM-AUTHORIZATION-1 data failed check"; /* IP wrong */ if ((int)GET_16BIT_MSB_FIRST(data+12) != peer_port) return "XDM-AUTHORIZATION-1 data failed check"; /* port wrong */ t = GET_32BIT_MSB_FIRST(data+14); for (i = 18; i < 24; i++) if (data[i] != 0) /* zero padding wrong */ return "XDM-AUTHORIZATION-1 data failed check"; tim = time(NULL); if (abs(t - tim) > 20*60) /* 20 minute clock skew should be OK */ return "XDM-AUTHORIZATION-1 time stamp was too far out"; } /* implement other protocols here if ever required */ return NULL, const char *peeraddr, int peerport/* * See if we can make sense of the peer address we were given. */ { int i[4]; if (peeraddr && 4 == sscanf(peeraddr, "%d.%d.%d.%d", i+0, i+1, i+2, i+3)) { pr->peer_ip = (i[0] << 24) | (i[1] << 16) | (i[2] << 8) | i[3]; pr->peer_port = peerport; } else { pr->peer_ip = 0; pr->peer_port = -1; }char *err; pr->auth_protocol[pr->auth_plen] = '\0'; /* ASCIZ */ err = x11_verify(pr->peer_ip, pr->peer_port, err) { char *message; int msglen, msgsize; unsigned char *reply; message = dupprintf("PuTTY X11 proxy: %s", err); msglen = strlen(message); reply = smalloc(8 + msglen+1 + 4); /* include zero byte */ sfree(reply); sfree(message Revision-number: 2555 Prop-content-length: 223 Content-length: 223 K 7 svn:log V 122 The command-line routines now take a pointer to `cfg' as an argument, so they don't depend on it being a global any more. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-12T14:17:03.000000Z PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cb46bce524087bf3e6cf5e0cc3f48b67 Text-delta-base-sha1: 3f4cd75ede81a6a1febd3a91fa19c3e48e7cda8a Text-content-length: 1101 Text-content-md5: a0c095b3a04b13834019103557ee92a5 Text-content-sha1: 0825c7159453ca0fad9420b6746195b2aa5627cf Content-length: 1140 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNd 4>>I@B{>dI@#FN{yJ\D!8"F@wvwL@L@L@LvVn<a;? , Config *cfgcfg); return 2; } if (!strcmp(p, "-sshdefault_protocol = cfg->protocol = PROT_SSH; default_port = cfg->->protocol = PROT_TELNET; default_port = cfg->->protocol = PROT_RLOGIN; default_port = cfg->port = 513; return 1; } if (!strcmp(p, "-rawdefault_protocol = cfg->->username, value, sizeof(cfg->username)); cfg->username[sizeof(cfg->->->->->->portfwd[sizeof(cfg->portfwd) - 1] = '\0'; cfg->portfwd[sizeof(cfg->->remote_cmd_ptr = command; cfg->remote_cmd_ptr2 = NULL; cfg->->->->->x11_forward = 1; } if (!strcmp(p, "-x->x11_forward = 0; } if (!strcmp(p, "-t->nopty = 0; } if (!strcmp(p, "-T->->compression = 1; } if (!strcmp(p, "-1")) { RETURN(1); SAVEABLE(1); cfg->->sshprot = 3; /* ssh protocol 2 only */ } if (!strcmp(p, "-i")) { RETURN(2); SAVEABLE(1); strncpy(cfg->keyfile, value, sizeof(cfg->keyfile)); cfg->keyfile[sizeof(cfg->Config *cfg, cfg); } Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0f2a55a61d1808a6ed0b146c11299962 Text-delta-base-sha1: 2e9f09e3932d0681a3f9dd20ffaddc58447ed1c0 Text-content-length: 50 Text-content-md5: d1a0eda9430c9d2cddd412c5b4f043c7 Text-content-sha1: dd9cf74c0397e45a354622d7d358f350a5d3d95b Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVNEXdcf|I 1, &cfg&cfg Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 711b26f38f199ceac451d95f4f1ebd9a Text-delta-base-sha1: 03fede6d3f17ce2c3f91ed366f8c0e5376781343 Text-content-length: 42 Text-content-md5: f9a304a7120e5a39a5b38d9b21162eea Text-content-sha1: fb9b9240999703d3e77a8ce9b3cc7644a773bbcd Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNku I|I&E&cfg, &cfg Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 38813e9d1bb72efcf704a38cfa891ec4 Text-delta-base-sha1: f642658305e2b066768a1f0f99925fd7966b610b Text-content-length: 69 Text-content-md5: fe4f9015d6dc6bd6e008d2f46272910c Text-content-sha1: a51cc04441415d9bcfeacfe3a5593eec4922ad7c Content-length: 110 K 15 cvs2svn:cvs-rev V 5 1.183 PROPS-END SVNft ,1O, Config *); void cmdline_run_saved(Config * Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b06d5798db625f6a794e007e688b757e Text-delta-base-sha1: 124d1393d9cb9a31b1b072d75c1ea90b6655f5b0 Text-content-length: 41 Text-content-md5: 337cf097dff641b0a6bfa65bceaeff37 Text-content-sha1: 4efa57e55e960bb2735359da9dada5ba3ab3b6e4 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.97 PROPS-END SVN OO8V&cfg, &cfg Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6349179674829964f2e78e5cc2cacb2e Text-delta-base-sha1: 49b70a56d385ad2b792af3fd21e375bc27c39375 Text-content-length: 102 Text-content-md5: 3d64dfde499b26eda2087813e267a9da Text-content-sha1: 6102a45f242305e5ba6da88ca906683222ae7da5 Content-length: 143 K 15 cvs2svn:cvs-rev V 5 1.221 PROPS-END SVN%-'CTP 1, &cfg, &cfg&cfg?X?et_ctx(void *frontend) { Revision-number: 2556 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2003-01-12T14:23:00.000000Z K 7 svn:log V 54 COmpiling _before_ committing is usually a good idea. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f7c617fd0c7d323dd197b254ef8f489f Text-delta-base-sha1: fca33faa03d3465d9bf1348b0aaaf0f963dea71f Text-content-length: 70 Text-content-md5: 03beb41e76830d40b71a2e7e0c6db7ea Text-content-sha1: 001c540b2c0cb876282af7ed4a45fb7e144e20be Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVN  -%,LT/* $Id: macterm.c,v 1.42 2003/01/12 14:23:00s Revision-number: 2557 Prop-content-length: 515 Content-length: 515 K 7 svn:log V 414 term->cfg is now a full copy of the Config structure, not a pointer; and term_reconfig() now passes in a new structure which is copied over the top. This means that the old and new structures can be compared, and the _current_ as well as default states of auto wrap mode, DEC origin mode, BCE, blinking text and character classes can be conveniently reconfigured in mid-session without requiring a terminal reset. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-12T14:30:02.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e92173065033dbe029334dff0ff58379 Text-delta-base-sha1: dfb80692d63844926a15c7a8766484bd6044af79 Text-content-length: 1200 Text-content-md5: e969d8cb60147ebbfb1490b53a05ac9b Text-content-sha1: 64c03e6ea66750bccc96eaa43166ba6c009b3f86 Content-length: 1240 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN;$0rc5Y>\YM^YioYJY*\versionid $Id: config.but,v 1.49 2003/01/12 14:30:02controls the \e{default} state, which will be restored when you reset the terminal (see \k{reset-terminal}). However, if you modify this option in mid-session using \q{Change Settings}, it will take effect immediatelycontrols the \e{default} state, which will be restored when you reset the terminal (see \k{reset-terminal}). However, if you modify this option in mid-session using \q{Change Settings}, it will take effect immediatelycontrols the \e{default} state, which will be restored when you reset the terminal (see \k{reset-terminal}). However, if you modify this option in mid-session using \q{Change Settings}, it will take effect immediatelycontrols the \e{default} state, which will be restored when you reset the terminal (see \k{reset-terminal}). However, if you modify this option in mid-session using \q{Change Settings}, it will take effect immediatelycontrols the \e{default} state, which will be restored when you reset the terminal (see \k{reset-terminal}). However, if you modify this option in mid-session using \q{Change Settings}, it will take effect immediately Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fe4f9015d6dc6bd6e008d2f46272910c Text-delta-base-sha1: a51cc04441415d9bcfeacfe3a5593eec4922ad7c Text-content-length: 33 Text-content-md5: 2dcf44a38dd8021036a726b685f555a7 Text-content-sha1: 4642c192ddc699b4faa3a25ed3cf64b6173defcf Content-length: 74 K 15 cvs2svn:cvs-rev V 5 1.184 PROPS-END SVNt~  k , Config Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 67770b51ac47e7404630edf0b9ccda35 Text-delta-base-sha1: f3a745bff09637d19ce32887076cacc32518c7fa Text-content-length: 3473 Text-content-md5: 619423b4542ab142bccf1cf1cd708da9 Text-content-sha1: 7374970fc0686410b76143ae21a233c44a539b40 Content-length: 3514 K 15 cvs2svn:cvs-rev V 5 1.128 PROPS-END SVNp>.0P/l' F$h gjS5r-n@m0qK_Jd070J!| J*TvJLJ#b`hy 6 ETf x >({h;eq"-L j e.cj+ j:r&n= 'I|r...app_cursor; term->app_keypad_keys = term->cfg.app_keypad; term->use_bce = term->cfg.bce; term->blink_is_real = term->cfg...., Config *cfg) { /* * Before adopting the new config, check all those terminal * settings which control power-on defaults; and if they've * changed, we will modify the current state as well as the * default one. The full list is: Auto wrap mode, DEC Origin * Mode, BCE, blinking text, character classes. */ int reset_wrap, reset_decom, reset_bce, reset_blink, reset_charclass; int i; reset_wrap = (term->cfg.wrap_mode != cfg->wrap_mode); reset_decom = (term->cfg.dec_om != cfg->dec_om); reset_bce = (term->cfg.bce != cfg->bce); reset_blink = (term->cfg.blinktext != cfg->blinktext); reset_charclass = 0; for (i = 0; i < lenof(term->cfg.wordness); i++) if (term->cfg.wordness[i] != cfg->wordness[i]) reset_charclass = 1; term->cfg = *cfg; /* STRUCTURE COPY */ if (reset_wrap) term->alt_wrap = term->wrap = term->cfg.wrap_mode; if (reset_decom) term->alt_om = term->dec_om = term->cfg.dec_om; if (reset_bce) term->use_bce = term->cfg.bce; if (reset_blink) term->blink_is_real = term->cfg.blinktext; if (reset_charclass) for (i = 0; i < 256; i++) term->wordness[i] = term->cfg.wordness[i]; if (term->cfg.no_alt_screen) swap_screen(term, 0, FALSE, FALSE); if (term->cfg...*mycfg; /* STRUCTURE COPY */...............bellovl && !term->beep_overloaded && term->nbeeps >= term->cfg..bellovl || !term->beep_overloaded) { beep(term->frontend, term->cfg.beep); if (term->cfg....................no_remote_resize) request_resize(term->frontend, def(term->esc_args[2], term->cfg.width), def(term->esc_args[1], term->cfg.. term->cfg.......Yh711WO rdtype(term, UCSGET(ldata, p.x)); if (dir == +1) { while (1) { int maxcols = (ldata[term->cols] & LATTR_WRAPPED2 ? term->cols-1 : term->cols); if (p.x < maxcols-1) { if (wordtype(term, UCSGET(ldata, p.x + 1)) == wvalue) p.x++; else break; } else { if (ldata[term->cols] & LATTR_WRAPPED) { unsigned long *ldata2; ldata2 = lineptr(p.y+1); if (wordtype(term, UCSGET(ldata2, 0)) == wvalue) { p.x = 0; p.y++; ldata = ldata2; } else break; } else break; } } } else { while (1) { if (p.x > 0) { if (wordtype(term, UCSGET(ldata, p.x - 1)) == wvalue) p.x--; else break; } else { unsigned long *ldata2; int maxcols; if (p.y <= topy) break; ldata2 = lineptr(p.y-1); maxcols = (ldata2[term->cols] & LATTR_WRAPPED2 ? term->cols-1 : term->cols); if (ldata2[term->cols] & LATTR_WRAPPED) { if (wordtype(term, UCSGET(ldata2, maxcols-1)) == wvalue) { p.x = maxcols-1; p.y--; ldata = ldata2; } else break; } else break; } } } break; case SM_LINE:.no_mouse_rep && !(term->cfg.. Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5a2c1e13672dd8830492828064f65b55 Text-delta-base-sha1: bd4162ac5c4e6b22a3a2bc2b8dfde44bf480e16c Text-content-length: 338 Text-content-md5: baa6566a75fd80ec746740a867d3cc23 Text-content-sha1: 2b4a936dc6e8f8109d30aee5b6791d12206bbef9 Content-length: 377 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN{. ;%;N-/* * We maintain a full _copy_ of a Config structure here, not * merely a pointer to it. That way, when we're passed a new * one for reconfiguration, we can check the differences and * adjust the _current_ setting of (e.g.) auto wrap mode rather * than only the default. */ Config Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3d64dfde499b26eda2087813e267a9da Text-delta-base-sha1: 6102a45f242305e5ba6da88ca906683222ae7da5 Text-content-length: 112 Text-content-md5: 4d56b732c58dd51d7f9492fd122f3aa5 Text-content-sha1: d1ff0d428a76011a22a071d3e51dbf9a32c7fffd Content-length: 153 K 15 cvs2svn:cvs-rev V 5 1.222 PROPS-END SVNGB*VPass new config data to the terminal */ term_reconfig(term, &cfget_ctXSS Revision-number: 2558 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2003-01-12T14:37:26.000000Z K 7 svn:log V 54 Forgot to match the cmdline changes in the Unix port. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 911674db4591c66985086eb209a652e4 Text-delta-base-sha1: 65eebb427ae90b0f581dbc06e300637a8c118c5f Text-content-length: 50 Text-content-md5: 364801f78e1a67babfb3a628a7f15a67 Text-content-sha1: 91bb373de3882db26a1a30f63939fb1bf99b3a6a Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN.#01S 1, &cfg&cfg Revision-number: 2559 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2003-01-12T14:44:12.000000Z K 7 svn:log V 115 Don't fatalbox() unconditionally when opening a connection, since that makes it a little difficult to do anything. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 03beb41e76830d40b71a2e7e0c6db7ea Text-delta-base-sha1: 001c540b2c0cb876282af7ed4a45fb7e144e20be Text-content-length: 90 Text-content-md5: 03ebf16a1fd1593517717db338e159a4 Text-content-sha1: 09d16fc139dce22d7be5cf4e465e58ad20e8aba9 Content-length: 130 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN3 A),IU/* $Id: macterm.c,v 1.43 2003/01/12 14:44:12if (errmsg != NULL) Revision-number: 2560 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2003-01-12T14:45:33.000000Z K 7 svn:log V 130 Call ot_poll as appropriate. Also use cleanup_exit() in preference to exit() so that MacTCP gets shut down even on unclean exits. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 397868cfcf31cdf3653a9fef94057aae Text-delta-base-sha1: 645979171f564b543a9de3ca3590919afde6016e Text-content-length: 147 Text-content-md5: e26c5c0493f1bef4344a88b034284a01 Text-content-sha1: 01ec928263a3fc497efd1aea65be7b432b9a3ea0 Content-length: 187 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNf/g-(fK,1 ]g/* $Id: mac.c,v 1.26 2003/01/12 14:45:33if (mac_gestalts.otptattr != 0) otcleanup_cleanup_cleanup_ Revision-number: 2561 Prop-content-length: 384 Content-length: 384 K 7 svn:log V 283 The back ends now contain their own copies of the Config structure, and have a function to pass in a new one. (Well, actually several back ends don't actually bother to do this because they need nothing out of Config after the initial setup phase, but they could if they wanted to.) K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-12T14:48:29.000000Z PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d1a0eda9430c9d2cddd412c5b4f043c7 Text-delta-base-sha1: dd9cf74c0397e45a354622d7d358f350a5d3d95b Text-content-length: 27 Text-content-md5: 60828280abc22264e59646e386c0e1b0 Text-content-sha1: d037816fecccfb7546c9c5089614ff958c53273d Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNX^ ]}[&cfg Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f9a304a7120e5a39a5b38d9b21162eea Text-delta-base-sha1: fb9b9240999703d3e77a8ce9b3cc7644a773bbcd Text-content-length: 61 Text-content-md5: 23a205c0a60e415287cdb26b194df6d6 Text-content-sha1: 0a53cf51f5929432c129cf85f2d5d58c71f88f9b Content-length: 101 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNuz $nh &cfg, cfg.host, cfg.port, &realhost, Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2dcf44a38dd8021036a726b685f555a7 Text-delta-base-sha1: 4642c192ddc699b4faa3a25ed3cf64b6173defcf Text-content-length: 141 Text-content-md5: cb4c60b1d05d908117ae09686396a351 Text-content-sha1: 1fd4e782e51f172aba3a891a326a86feddcc4361 Content-length: 182 K 15 cvs2svn:cvs-rev V 5 1.185 PROPS-END SVN~p>I=dv Config *cfgreconfig() passes in a replacement configuration. */ void (*reconfig) (void *handle, Config *cfg Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c189018bd277d2bbe3883f62c4f2cc0e Text-delta-base-sha1: 59bc468645ac1ae0d008fe841c8bf20ed10cf2d5 Text-content-length: 178 Text-content-md5: 7a5239768168e512d2b51684af9a9c3a Text-content-sha1: ce80e4fc7e14f35f8d53e415933e30150b19b292 Content-length: 218 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNEvAl|/#PHConfig *cfgStub routine (we don't have any need to reconfigure this backend). */ static void raw_reconfig(void *handle, Config *cfg) {reconfig Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5c58d5473327023fdbc113b4e2f1825d Text-delta-base-sha1: b24323c0c3bb12265ba2719ce3355dc1b85d503d Text-content-length: 683 Text-content-md5: c9efa91948ada023940e427e2db09a77 Text-content-sha1: 386ae6b98f62033d44cce664dcfb4348fd40e584 Content-length: 723 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN<{~u!FseqKConfig *cfg->width; rlogin->term_height = cfg->->localusername, strlen(cfg->localusername)); sk_write(rlogin->s, &z, 1); sk_write(rlogin->s, cfg->username, strlen(cfg->username)); sk_write(rlogin->s, &z, 1); sk_write(rlogin->s, cfg->termtype, strlen(cfg->termtype)); sk_write(rlogin->s, "/", 1); for (p = cfg->termspeed; isdigit(*p); p++) continue; sk_write(rlogin->s, cfg->termspeed, p - cfg->termspeed); rlogin->bufsize = sk_write(rlogin->s, &z, 1); } return NULL; } /* * Stub routine (we don't have any need to reconfigure this backend). */ static void rlogin_reconfig(void *handle, Config *cfg) {reconfig Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 337cf097dff641b0a6bfa65bceaeff37 Text-delta-base-sha1: 4efa57e55e960bb2735359da9dada5ba3ab3b6e4 Text-content-length: 60 Text-content-md5: 6b1add7dd614ebd33c7350786acb54a6 Text-content-sha1: 03a7c06d1b8001d9be977505e2d4960a33f71070 Content-length: 100 K 15 cvs2svn:cvs-rev V 4 1.98 PROPS-END SVN $X!w&cfg, cfg.host, cfg.port, &realhost, Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3c99ad948690b553fd923570c4185885 Text-delta-base-sha1: 99765c2e91d169c8f337b4076e8d4a5a8ed6ccdf Text-content-length: 2991 Text-content-md5: da79bd91e373c9c6a3b832583a0e086d Text-content-sha1: cf613500267b7e87fc9f9a7c99f795a38518f683 Content-length: 3032 K 15 cvs2svn:cvs-rev V 5 1.263 PROPS-END SVNd$%*SK]AW=L4v%*=_gF#Z)}M&xskksW]_%'q8)u1&+8ANeh1ME~WCcTn;B /* * We maintain a full _copy_ of a Config structure here, not * merely a pointer to it. That way, when we're passed a new * one for reconfiguration, we can check the differences and * potentially reconfigure port forwardings etc in mid-session. */ Config cfgssh->cfg.sshbug_ignore1 == BUG_ON || (ssh->ssh->cfg.sshbug_plainpw1 == BUG_ON || (ssh->ssh->cfg.sshbug_rsa1 == BUG_ON || (ssh->ssh->cfg.sshbug_hmac2 == BUG_ON || (ssh->ssh->cfg.sshbug_derivekey2 == BUG_ON || (ssh->ssh->cfg.sshbug_rsapad2 == BUG_ON || (ssh->ssh->ssh->ssh->ssh->ssh->ssh->ssh->ssh->cfg.keyfile so we notice if it's in Pageant */ if (*ssh->cfg.keyfile) { if (!rsakey_pubblob(ssh->ssh->cfg.keyfile && !s->tried_publickey) s->pwpkt_type = SSH1_CMSG_AUTH_RSA; if (ssh->ssh->ssh->cfg.keyfile); type = key_type(ssh->ssh->ssh->ssh->ssh->ssh->ssh->cfg.x11_auth); x11_get_real_auth(ssh->x11auth, ssh->ssh->ssh->ssh->ssh->ssh->ssh->cfg.remote_cmd_ptr; if (ssh->cfg.ssh_subsys && ssh->cfg.remote_cmd_ptr2) { cmd = ssh->ssh-> k U( 77n[pBK: \|g~qe+VhXi9Afz+`PgP)7E`%|?x;3x*.RX_*-z:If'y% X;n.bodyc && ((int)c->remoteid) != -1) { int closetype; closetype = (ssh->pktin.type == SSH1_MSG_CHANNEL_CLOSE ? 1 : 2); if ((c->closes == 0) && (c->type == CHAN_X11)) { logevent("Forwarded X11 connection terminated"); assert(c->u.x11.s != NULL); x11_close(c->u.x11.s); c->u.x11.s = NULL; } if ((c->closes == 0) && (c->type == CHAN_SOCKDATA)) { logevent("Forwarded port closed"); ssh->ssh->ssh->ssh->ssh->ssh->ssh->cfg.keyfile so we notice if it's in Pageant */ if (*ssh->ssh->cfg.keyfile); keytype = key_type(ssh->ssh->ssh->ssh->ssh->ssh->ssh->ssh->ssh->cfg.x11_auth); x11_get_real_auth(ssh->x11auth, ssh->cfg.x11_displayssh->ssh->ssh->ssh->ssh->ssh->ssh->cfg.ssh_subsys2; cmd = ssh->cfg.remote_cmd_ptr2; } else { subsys = ssh->cfg.ssh_subsys; cmd = ssh->ssh->ssh->Config *cfgcfg = *cfg; /* STRUCTURE COPY */ssh->cfg.width; ssh->term_height = ssh->Reconfigure the SSH backend. * * Currently, this function does nothing very useful. In future, * however, we could do some handy things with it. For example, we * could make the port forwarding configurer active in the Change * Settings box, and this routine could close down existing * forwardings and open up new ones in response to changes. */ static void ssh_reconfig(void *handle, Config *cfg) { Ssh ssh = (Ssh) handle; ssh->cfg = *cfg; /* STRUCTURE COPY */ssh->reconfig Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e9aeddd716f0ff6368eb5ffb6740cf22 Text-delta-base-sha1: db589ddb44e4cf62609043d539617c486313a902 Text-content-length: 823 Text-content-md5: d932a5cd8d52db6fdfa1d6ee1fa69612 Text-content-sha1: c9fbb6c8d2d48a39eed7c538cc6ed2df790a2c69 Content-length: 863 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN$aH"G!c wo2pdtJXx"00Dcg]omL3p/r Config cfg;telnet->cfg.termspeed); n = 4 + strlen(telnet->telnet->telnet->cfg.termtype[n]; n++) b[n + 4] = (telnet->cfg.termtype[n] >= 'a' && telnet->cfg.termtype[n] <= 'z' ? telnet->cfg.termtype[n] + 'A' - 'a' : telnet->telnet->telnet->telnet->telnet->Config *cfgcfg = *cfg; /* STRUCTURE COPY */telnet->cfg.width; telnet->term_height = telnet->telnet->Reconfigure the Telnet backend. There's no immediate action * necessary, in this backend: we just save the fresh config for * any subsequent negotiations. */ static void telnet_reconfig(void *handle, Config *cfg) { Telnet telnet = (Telnet) handle; telnet->cfg = *cfg; /* STRUCTURE COPY */reconfig Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ebcb73e5f766b78bee88d56606a4b9f Text-delta-base-sha1: 0748b46336c64cd02b654507c53d70c57609dfb0 Text-content-length: 37 Text-content-md5: 38ba98d2aa0839c09fdf41fa3cb514db Text-content-sha1: 97e0e2bf32c9fa6254f7b7167f5b8407e0d95cdc Content-length: 77 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVN, ]C\&cfg, Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7faac554c9b899d6c1415c8d8f69f1e6 Text-delta-base-sha1: 7fa93fca98582a93e23e83ced0e79dfbdf2b10b6 Text-content-length: 308 Text-content-md5: b7dfe83bd41cfbfc4268430f54c9d103 Text-content-sha1: 84250b646861470f11151ea1deda5c6594eed64d Content-length: 348 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNHt5s#h",C5y)Eo|~Px Config *cfg->width; pty_term_height = cfg->->->->termtype)]; sprintf(term_env_var, "TERM=%s", cfg->->Stub routine (we don't have any need to reconfigure this backend). */ static void pty_reconfig(void *handle, Config *cfg) {reconfig Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 364801f78e1a67babfb3a628a7f15a67 Text-delta-base-sha1: 91bb373de3882db26a1a30f63939fb1bf99b3a6a Text-content-length: 27 Text-content-md5: ed50bd8b3f363d6e7d77d80d842438c3 Text-content-sha1: bc1a2509635244d378c092b959aedc7e99b62a8c Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN q(o&cfg Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4d56b732c58dd51d7f9492fd122f3aa5 Text-delta-base-sha1: d1ff0d428a76011a22a071d3e51dbf9a32c7fffd Text-content-length: 195 Text-content-md5: aba2b60590bb5e588ff7a6d0ac5dc716 Text-content-sha1: c113e759ec07dff53e646b539a66afbc6a19c72b Content-length: 236 K 15 cvs2svn:cvs-rev V 5 1.223 PROPS-END SVNBHcK &cfgPass new config data to the back end */ back->reconfig(backS%RRS= start; if (hwnd) SetScrollInfo(hwnd, SB_VERT, &si, TRUE); } Context get_ct Revision-number: 2562 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2003-01-12T14:49:44.000000Z K 7 svn:log V 99 Just like under Windows, cleanup_exit() shouldn't need to check before calling random_save_seed(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d0916d1e19b9b525f734466137bb192b Text-delta-base-sha1: 1d6d10fa4f45b51a844e7140b732aef49b56b592 Text-content-length: 44 Text-content-md5: 19567cf0de77eed1e0b44b1976c26b66 Text-content-sha1: 06ce4da1914489934f621aea158741c3a6ec207d Content-length: 83 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNK* )ja random_save_seed(); Revision-number: 2563 Prop-content-length: 219 Content-length: 219 K 7 svn:log V 118 printer_start_job shouldn't need to refer to cfg.printer, since it's getting the printer name passed in anyway! Oops. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-12T14:50:34.000000Z PROPS-END Node-path: putty/unix/uxprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 62809aafebe4f1edf00490eaaa7f6255 Text-delta-base-sha1: 83243550856ec811e51470740e7abc488fccc318 Text-content-length: 140 Text-content-md5: fc528c35f276eda035e0d320b1048e27 Text-content-sha1: 8cdda8d3784b335f55edb00e73efc9f4821b6aa3 Content-length: 179 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN>A vv7the printer string as the name of a * command to pipe to - typically lpr, of course. */ ret->fp = popen( Revision-number: 2564 Prop-content-length: 263 Content-length: 263 K 7 svn:log V 162 There's no real need for portfwd.c to reference `cfg' directly, when it only needs one item from it and that can easily be passed in from the call site in ssh.c. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-12T14:56:19.000000Z PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 803c5a240cc7165546ba5f1a173844e9 Text-delta-base-sha1: 8b1e33cab1e3108b8624ebc9bf90c34f2908e3ae Text-content-length: 41 Text-content-md5: 8b94f02f513b301d74b05723623e6db6 Text-content-sha1: bf960e5bab766a446bd7b820ac94ec2dd18723a2 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN jzjn, int acceptall Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: da79bd91e373c9c6a3b832583a0e086d Text-delta-base-sha1: cf613500267b7e87fc9f9a7c99f795a38518f683 Text-content-length: 128 Text-content-md5: 4fa24a644a9b3796a57af8f73f976f40 Text-content-sha1: 10a12a5f74b965a86c026a6225fa6bb7fc9c2f01 Content-length: 169 K 15 cvs2svn:cvs-rev V 5 1.264 PROPS-END SVN UU, ssh->cfg.lport_acceptall =4yyed i = GET_32BIT(ssh->pkti, ssh->cfg.lport_acceptall Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b62215ace4490018aba0d17292934cee Text-delta-base-sha1: e03ddc94e5c5b606c6feaa71dafa9477b5fe07ca Text-content-length: 36 Text-content-md5: e6e1355585036dae816164c6e1cfc777 Text-content-sha1: d4c59d2b94d6ffa7583d15db26eed0c5119d636a Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNRa @, int acceptall Revision-number: 2565 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 2003-01-12T14:59:54.000000Z K 7 svn:log V 198 The Unicode module no longer depends on `cfg', since it gets the relevant bits of it passed in to init_ucs(). (Actually I pass in all of it in the Windows version, since it's a bit hairy in there.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0ee35480476a66431a377a92bf60687d Text-delta-base-sha1: db5affffe45a1c8ec6a035336c119af959ebeb27 Text-content-length: 195 Text-content-md5: 0f26507d77952c14a802ffecde0a467d Text-content-sha1: a91f5ab98874cce018a8ce6d2762798d7879f6e7 Content-length: 235 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN:LDrZA^j O m[ietOu`mrZ`Config *cfg->->->->vtmode == VT_OEMANSI || cfg->->->vtmode == VT_OEMANSI || cfg->->vtmode == VT_OEMANSI || cfg->-> Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 38ba98d2aa0839c09fdf41fa3cb514db Text-delta-base-sha1: 97e0e2bf32c9fa6254f7b7167f5b8407e0d95cdc Text-content-length: 44 Text-content-md5: 8252ddf55486b25110f16050cfd7dca9 Text-content-sha1: 4fee469b05e6b8009219e5222ca7d4c8712356d6 Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVN,? IcIcfg.line_codepage, Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8e5e910c6a8c0c010e602c2a1c784026 Text-delta-base-sha1: 245c595b37f8d892541126a243bb44b5ae7e35df Text-content-length: 42 Text-content-md5: c99242c713130bb8f0af7dd57e290fcd Text-content-sha1: ad0fbadde904ae4857a8a39660533bdf607052a3 Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN/ char *line_codepage, Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c25af28bf5cc4d3fbb5f3ac023807c29 Text-delta-base-sha1: 697198e769b1905e7fbf1eeba4f00099a9120ac5 Text-content-length: 141 Text-content-md5: c0ddeb575394fa85a5cea23dd818f7d2 Text-content-sha1: fecd434ab41285e2e1697247f77e030c8838461d Content-length: 181 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN$+q;+;^TPchar *linecharset, linecharset); if (line_codepage == CS_NONE) line_codepage = charset_from_xenc(linecharset Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: aba2b60590bb5e588ff7a6d0ac5dc716 Text-delta-base-sha1: c113e759ec07dff53e646b539a66afbc6a19c72b Text-content-length: 48 Text-content-md5: 422a6c5b0a0b12d9505592ca4718e490 Text-content-sha1: 9668a806b25110ed923070c980f098b1467bcd6a Content-length: 89 K 15 cvs2svn:cvs-rev V 5 1.224 PROPS-END SVN D8D&cfg%)%Pos Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bbd20afab6f20c6bc073f6f831cb795c Text-delta-base-sha1: 497ed9ab9688d137f4e7b08ff5b361ca968cbf7b Text-content-length: 35 Text-content-md5: 1c55b9b1487854f4f307bd1cd98c4052 Text-content-sha1: 9af558aac9b8cc3c09fce3ff110ea81ce58f0505 Content-length: 75 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNbfSConfig *); #endif Revision-number: 2566 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2003-01-12T15:10:27.000000Z K 7 svn:log V 57 The logging module now contains a local copy of cfg too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 10b68098c2432cff8641c7fb1fb225ff Text-delta-base-sha1: d8e103b0877228a7693d912ccef346f472213579 Text-content-length: 751 Text-content-md5: ebee85a67b79cc08105209eabaa4c0ce Text-content-sha1: 5c1449abce2d6fbc8d0432868af2a6f1fccf0e21 Content-length: 791 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN4Rzpx;]>)H>Rfo#`c}~lC0| Config cfgtx->cfg.logtype > 0) { if (ctx->tx->tx->tx->tx->cfg.logfilename,ctx->tx->cfg.logxfovr != LGXF_ASK) { i = ((ctx->tx->tx->cfg.logtype == LGTYP_ASCII ? "ASCII" : ctx->cfg.logtype == LGTYP_DEBUG ? "raw" : ctx->, Config *cfgctx->cfg = *cfg; /* STRUCTURE COPY */ return ctx; } void log_reconfig(void *handle, Config *cfgnt reset_logging; if (strcmp(ctx->cfg.logfilename, cfg->logfilename) || ctx->cfg.logtype != cfg->logtype) reset_logging = TRUE; else reset_logging = FALSE; if (reset_logging) logfclose(logctx); ctx->cfg = *cfg; /* STRUCTURE COPY */ if (reset_logging) logfopen(logctx) Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 60828280abc22264e59646e386c0e1b0 Text-delta-base-sha1: d037816fecccfb7546c9c5089614ff958c53273d Text-content-length: 29 Text-content-md5: 1203af36ece580c9f0a6d55416424913 Text-content-sha1: 89fcdb1c709e89c6d4182281b41151b642141891 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN^d V, &cfg Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 23a205c0a60e415287cdb26b194df6d6 Text-delta-base-sha1: 0a53cf51f5929432c129cf85f2d5d58c71f88f9b Text-content-length: 31 Text-content-md5: 2f49e783fbb89bff7885d1ff2696fd43 Text-content-sha1: 286bcaa2b71ab06ac18cb0af9126d72e0264b778 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNz y, &cfg Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cb4c60b1d05d908117ae09686396a351 Text-delta-base-sha1: 1fd4e782e51f172aba3a891a326a86feddcc4361 Text-content-length: 84 Text-content-md5: 9bf9d571ca1a52aad9419a53678d5138 Text-content-sha1: 5daa4325a83c50ca5ee801b6ff8fcd73a1e06262 Content-length: 125 K 15 cvs2svn:cvs-rev V 5 1.186 PROPS-END SVN: ;hh, Config *cfg); void log_reconfig(void *logctx, Config *cfg Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6b1add7dd614ebd33c7350786acb54a6 Text-delta-base-sha1: 03a7c06d1b8001d9be977505e2d4960a33f71070 Text-content-length: 30 Text-content-md5: ca2108c5fdefdf6e2a25af6501338670 Text-content-sha1: d03cf8e7f570d4c98e0e31167c629de37b2d9fc6 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.99 PROPS-END SVN# KRK, &cfg Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8252ddf55486b25110f16050cfd7dca9 Text-delta-base-sha1: 4fee469b05e6b8009219e5222ca7d4c8712356d6 Text-content-length: 31 Text-content-md5: fd88c3ab60ad60d99fda4abcb4ee0449 Text-content-sha1: c0d8fc86cd0578c9d61716c807505159dda11bb9 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVN?E ^a^, &cfg Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ed50bd8b3f363d6e7d77d80d842438c3 Text-delta-base-sha1: bc1a2509635244d378c092b959aedc7e99b62a8c Text-content-length: 29 Text-content-md5: fb73a8c15e564237dd20c4dffe1e45de Text-content-sha1: 8e56dccc7bff394f9d0b7fd533333e27fe605b9c Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN# 8e8, &cfg Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 422a6c5b0a0b12d9505592ca4718e490 Text-delta-base-sha1: 9668a806b25110ed923070c980f098b1467bcd6a Text-content-length: 215 Text-content-md5: 93551b1638b81bbf5ddc12313a7332b1 Text-content-sha1: b86a08dc47311f5e27048b2a077bde7263b2db1b Content-length: 256 K 15 cvs2svn:cvs-rev V 5 1.225 PROPS-END SVN&nonN}R, &cfg/* Pass new config data to the logging module */ log_reconfig(logctx, &cfg);Pos = start; if (hwnd) SetScrollInfo(hwnd, SB_VERT, &si, TRUE); } Context ge)WWR Revision-number: 2567 Prop-content-length: 500 Content-length: 500 K 8 svn:date V 27 2003-01-12T15:26:10.000000Z K 7 svn:log V 399 proxy.c now no longer refers to `cfg'. Instead, each of the three proxy-indirection network functions (name_lookup, new_connection, new_listener) takes a `const Config *' as an argument, and extracts enough information from it before returning to handle that particular network operation in accordance with the proxy settings it specifies. This involved {win,ux}net.c due to a `const' repercussion. K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 37cb1e2f352cc557ebb7dcf8f0fef0bd Text-delta-base-sha1: 80a2cd177da6b390ef9cd7d40c53a91759dbe225 Text-content-length: 415 Text-content-md5: 02d758b901abe7a7be75e3986451dc33 Text-content-sha1: 8d031d35ed1cbc1f84dcaac933c8daad391065a8 Content-length: 455 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNF@t(&O>u;OGE#ifndef DONE_TYPEDEFS #define DONE_TYPEDEFS typedef struct config_tag Config; typedef struct backend_tag Backend; typedef struct terminal_tag Terminal; #endif, const Config *cf, const Config *cfg); SockAddr name_lookup(char *host, int port, char **canonicalname, const Config *cfgonst char *host, char **canonicalname); SockAddr sk_nonamelookup(const Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8b94f02f513b301d74b05723623e6db6 Text-delta-base-sha1: bf960e5bab766a446bd7b820ac94ec2dd18723a2 Text-content-length: 160 Text-content-md5: f18f4c89d09970aa65ad7d59a947ac7f Text-content-sha1: 12a49a6990f0b5ae994aa01212a7c37250aa650e Content-length: 200 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN Q&o,RyH~ F cxy|, const Config *cfg, cfg 0, 1, 0, (Plug) pr, cfgconst Config *cfg !cfg->lport_acceptall, cfg Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 33832f7bfdc86e470cbd7b3e6d55285d Text-delta-base-sha1: ded26f70ebddf35407377ce6107611054e8e069d Text-content-length: 2408 Text-content-md5: b8281875c3ca8d122953cb2b9baf7237 Text-content-sha1: 04080333555456152bc3161cbca8a567e95c5e69 Content-length: 2448 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN NknGEx kgvH^  -N=|h2 +'eS9E@nlg(gb'keR>a8kXu _ot=c7 & U1lXpx]:Q9[j(cfg) \ (cfg->proxy_dns == 2 || \ (cfg->proxy_dns == 1 && cfg->hostname, int port, const Config *cfg) { int s = 0, e = 0; char hostip[64]; int hostip_len, hostname_len; const char *->->, const Config *cfg) { if (cfg->proxy_type != PROXY_NONE && do_proxy_dns(cfg) && proxy_for_destination(NULL, host, port, cfg, const Config *cf->proxy_type != PROXY_NONE && proxy_for_destination(addr, hostname, port, cfgcfg = *cfg; /* STRUCTURE COPY */->proxy_type == PROXY_HTTP) { ret->negotiate = proxy_http_negotiate; } else if (cfg->proxy_type == PROXY_SOCKS) { if (cfg->->->->, const Config *cfgp->cfg.proxy_username[0] || p->cfg.proxy_password[0]) { char buf[sizeof(p->cfg.proxy_username)+sizeof(p->p->cfg.proxy_username, p->p->cfg.proxy_username) + namelen + 9; command = (char*) smalloc(length); strcpy(command + 8, p->p->p->cfg.proxy_username[0] || p->p->cfg.proxy_username[0] || p->p->cfg.proxy_username); if (ulen > 255) ulen = 255; if (ulen < 1) ulen = 1; plen = strlen(p->p->cfg.proxy_username, ulen); userpwbuf[ulen+2] = plen; memcpy(userpwbuf+ulen+3, p->p->p->cfg.proxy_telnet_command[eo] != 0 && p->cfg.proxy_telnet_command[eo] != '%' && p->p->p->p->cfg.proxy_telnet_command[eo] == 0) break; if (p->p->p->cfg.proxy_telnet_command[eo] >= '0' && p->cfg.proxy_telnet_command[eo] <= '9') v += p->cfg.proxy_telnet_command[eo] - '0'; else if (p->cfg.proxy_telnet_command[eo] >= 'a' && p->cfg.proxy_telnet_command[eo] <= 'f') v += p->cfg.proxy_telnet_command[eo] - 'a' + 10; else if (p->cfg.proxy_telnet_command[eo] >= 'A' && p->cfg.proxy_telnet_command[eo] <= 'F') v += p->p->p->cfg.proxy_telnet_command[eo] == '%') { sk_write(p->sub_socket, "%", 1); eo++; } else if (strnicmp(p->p->p->cfg.proxy_telnet_command + eo, "user", 4) == 0) { sk_write(p->sub_socket, p->cfg.proxy_username, strlen(p->cfg.proxy_username)); eo += 4; } else if (strnicmp(p->cfg.proxy_telnet_command + eo, "pass", 4) == 0) { sk_write(p->sub_socket, p->cfg.proxy_password, strlen(p->p-> Node-path: putty/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2d8722e1ffd2ce19948c4eb297176ad4 Text-delta-base-sha1: 79fa37776239bd42e1d89d206c3944972f90a790 Text-content-length: 93 Text-content-md5: 40b43f22d16acd346119739d7e688d39 Text-content-sha1: 5c575352bf41c525c9c8d338b94c983e9deaa939 Content-length: 132 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN'o G3Gu2 /* configuration, used to look up proxy settings */ Config cfg; Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7a5239768168e512d2b51684af9a9c3a Text-delta-base-sha1: ce80e4fc7e14f35f8d53e415933e30150b19b292 Text-content-length: 55 Text-content-md5: 38cddb5d4c3529ec2a08e761de955944 Text-content-sha1: 7095cd9f37b2fef13c12853bc87500d4eaf6fde2 Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNEV//xM, cfg (Plug) raw, cfg Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c9efa91948ada023940e427e2db09a77 Text-delta-base-sha1: 386ae6b98f62033d44cce664dcfb4348fd40e584 Text-content-length: 37 Text-content-md5: f6b0c0d6b91bc5e94fedf53602a199ca Text-content-sha1: 2e321e88af0c88eac8c90c9b79711086bb9c47d1 Content-length: 77 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN  2.Q, cfg, cfg Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4fa24a644a9b3796a57af8f73f976f40 Text-delta-base-sha1: 10a12a5f74b965a86c026a6225fa6bb7fc9c2f01 Text-content-length: 256 Text-content-md5: 6660e42228da3ab282a85b4b4c833a70 Text-content-sha1: 10dff3188d847bb5f1d60e2dc962b3d54aa268fc Content-length: 297 K 15 cvs2svn:cvs-rev V 5 1.265 PROPS-END SVN)V/)/ero7E, &ssh->cfg 0, 1, nodelay, (Plug) ssh, &ssh->cfg&ssh->cfg, &ssh->cfg, &ssh->cfg=rM-b5&e side closes a channel. */ unsign&ssh->cfg, &ssh->cfg, &ssh->cfg Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e6e1355585036dae816164c6e1cfc777 Text-delta-base-sha1: d4c59d2b94d6ffa7583d15db26eed0c5119d636a Text-content-length: 99 Text-content-md5: 1ca6ac972df0ac5f1ccebd766a858851 Text-content-sha1: 93c690c9441af579e2e87afcb2cc8bb461e3fa3a Content-length: 139 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNaC%o%@!a, const Config *cfgconst Config *cfg, const Config * Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d932a5cd8d52db6fdfa1d6ee1fa69612 Text-delta-base-sha1: c9fbb6c8d2d48a39eed7c538cc6ed2df790a2c69 Text-content-length: 60 Text-content-md5: c39748cbf44d7f7127d1229cb9407b2d Text-content-sha1: 8b67423b8b051b4f6240ef6a8e14c63cecdf6461 Content-length: 100 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN$@K1K(|, &telnet->cfg, &telnet->cfg Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8b6bcd835e327ed002e4d0a2770c4ed2 Text-delta-base-sha1: b5f93084db3e73d15b932c02f019588702701982 Text-content-length: 40 Text-content-md5: 1d4021d62e4673572ac40d80c4055563 Text-content-sha1: 92b22ea399d534b8067e7e315fe72613af6fd396 Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNR^ x6w&,onst onst Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 243d62efd6e26ea195d08e8103d97a40 Text-delta-base-sha1: 470cbdcb0f4f04f02951211f6115fddaa886f8d2 Text-content-length: 40 Text-content-md5: c96bd77456689584a13bfbc3c719953c Text-content-sha1: 5fc6b2a8eee06563c180b94fbf6c173bcb86e7ee Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN 4F3xonst onst Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c0147760f179bac2310ea930ea80500e Text-delta-base-sha1: 09f4765058b166227cef1134dc1a6dfad8431a06 Text-content-length: 85 Text-content-md5: 2bd868e282b55a9d74ebfaa43e38b070 Text-content-sha1: fd0d4cad32646f96b493c3f1950642c0f6f0203e Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNQr4;];(~S, const Config *cfg, cfg 0, 1, 0, (Plug) pr, cfg Revision-number: 2568 Prop-content-length: 597 Content-length: 597 K 8 svn:date V 27 2003-01-12T15:32:31.000000Z K 7 svn:log V 496 Having laid all the groundwork, we can now remove the global `cfg' completely from putty.h. It's now static in each of the command-line front ends, shared only between window.c and windlg.c in PuTTY proper (I've tested this by doing #define cfg cfgsillyname in those two files only, and it still links so nobody else is using that symbol!), and part of the `inst' structure in pterm. I think that only leaves the Unicode module as the last stubborn holdout in the anti-global-variables campaign. K 10 svn:author V 5 simon PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1203af36ece580c9f0a6d55416424913 Text-delta-base-sha1: 89fcdb1c709e89c6d4182281b41151b642141891 Text-content-length: 41 Text-content-md5: 8d77b560b8a2029b4f3c46358d429609 Text-content-sha1: 8d83135279687a874f2f8cd7c95e768231d16673 Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVNdw _]static Config cfg Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2f49e783fbb89bff7885d1ff2696fd43 Text-delta-base-sha1: 286bcaa2b71ab06ac18cb0af9126d72e0264b778 Text-content-length: 51 Text-content-md5: 34eddf2520bb1eccc6e7bfa8553191c8 Text-content-sha1: e8662973491f3535ec706a2228e906df893a8b43 Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN E@+Ustatic Config cfg; /* Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9bf9d571ca1a52aad9419a53678d5138 Text-delta-base-sha1: 5daa4325a83c50ca5ee801b6ff8fcd73a1e06262 Text-content-length: 22 Text-content-md5: 350064d69b49bad7b16005fe95cc343f Text-content-sha1: 82148a53323af260acb05e196151431e3cc7f755 Content-length: 63 K 15 cvs2svn:cvs-rev V 5 1.187 PROPS-END SVN:b `8 Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ca2108c5fdefdf6e2a25af6501338670 Text-delta-base-sha1: d03cf8e7f570d4c98e0e31167c629de37b2d9fc6 Text-content-length: 41 Text-content-md5: a0a1ccbe45ee6408ae3fdf07099438d6 Text-content-sha1: 56391eb382e6084b7e07378cf02260f46fa77f70 Content-length: 82 K 15 cvs2svn:cvs-rev V 5 1.100 PROPS-END SVN#6  static Config cfg Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fd88c3ab60ad60d99fda4abcb4ee0449 Text-delta-base-sha1: c0d8fc86cd0578c9d61716c807505159dda11bb9 Text-content-length: 5551 Text-content-md5: c1ab5bb2088206dba0972218ae50b620 Text-content-sha1: 3aca7effcf0d2d0ae882a125c92ff5469c99b0f9 Content-length: 5591 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVNE2RNyw}"f=u`-7 DSVR(WC|W+p(dC 'q3s$GblGd c4yFigAP~R3riwC-Z 6PE2X =O~/}-+=PH>7*&3PEYUgVW:oP~TOMJwn/dn4d"Cw=4tOL(r HP8r1)#fLaGwa> Config cfginst->inst->cfg.window_border) / inst->font_width; h = (event->height - 2*inst->cfg.window_border) / inst->font_height; if (w != inst->cfg.width || h != inst->inst->cfg.width = w; inst->inst->cfg.width * inst->font_width + 2*inst->cfg.window_border), (inst->cfg.height * inst->font_height + 2*inst->inst->cfg.width * inst->font_width + 2*inst->cfg.window_border, inst->cfg.height * inst->font_height + 2*inst->inst->inst->inst->inst->inst->inst->inst->inst->inst->inst->inst->inst->inst->inst->inst->inst->inst->cfg.window_border) / inst->font_width; y = (event->y - inst->inst->cfg.window_border) / inst->font_width; y = (event->y - inst->inst->cfg.close_on_exit == COE_ALWAYS || (inst->inst->inst->cfg.window_border; area_y = inst->font_height * h + 2*inst->inst->inst->cfg.colours[ww[i]][0] * 0x0101; inst->cols[i].green = inst->cfg.colours[ww[i]][1] * 0x0101; inst->cols[i].blue = inst->inst->cfg.colours[i][0], inst->cfg.colours[i][1], inst->inst->inst->inst->cfg.bold_colour && (attr & ATTR_BOLD)) nfg++; if (inst->inst->inst->cfg.window_border; r.y = y*inst->font_height+inst->inst->cfg.window_border, y*inst->font_height+inst->inst->cfg.window_border, y*inst->font_height+inst->inst->cfg.window_border, y*inst->font_height+inst->inst->cfg.window_border + inst->cfg.shadowboldoffset, y*inst->font_height+inst->inst->cfg.window_border, y*inst->font_height + uheight + inst->cfg.window_border, (x+len)*widefactor*inst->font_width-1+inst->cfg.window_border, y*inst->font_height + uheight + inst->inst->cfg.window_border + 2*i, y*inst->font_height+inst->cfg.window_border, x*inst->font_width+inst->cfg.window_border + 2*i+1, y*inst->font_height+inst->inst->cfg.window_border, y*inst->font_height+inst->cfg.window_border+dt*i+db, x*widefactor*inst->font_width+inst->cfg.window_border, y*inst->font_height+inst->inst->cfg.window_border, y*inst->font_height+inst->cfg.window_border, x*inst->font_width+inst->cfg.window_border, y*inst->font_height+inst->inst->inst->inst->cfg.window_border, y*inst->font_height+inst->inst->inst->cfg.window_border; starty = y * inst->font_height + inst->inst->cfg.window_border + xadjust; starty = y * inst->font_height + inst->inst->cfg.window_border, y*inst->font_height+inst->cfg.window_border, x*inst->font_width+inst->cfg.window_border, y*inst->font_height+inst->, Config *cf->font, val, sizeof(cfg->font)); cfg->font[sizeof(cfg->->boldfont, val, sizeof(cfg->boldfont)); cfg->boldfont[sizeof(cfg->boldfont)-1] = '\0'; } else if (!strcmp(p, "-fw")) { EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(cfg->widefont, val, sizeof(cfg->widefont)); cfg->widefont[sizeof(cfg->->wideboldfont, val, sizeof(cfg->wideboldfont)); cfg->wideboldfont[sizeof(cfg->->line_codepage, val, sizeof(cfg->line_codepage)); cfg->line_codepage[sizeof(cfg->->width = w; if (flags & HeightValue) cfg->->inst->inst->cfg") ? 4 : !strcmp(p, "-cbg") ? 5 : -1); assert(index != -1); cfg->colours[index][0] = col.red / 256; cfg->colours[index][1] = col.green / 256; cfg->->wintitle, val, sizeof(cfg->wintitle)); cfg->wintitle[sizeof(cfg->->logfilename, val, sizeof(cfg->logfilename)); cfg->logfilename[sizeof(cfg->logfilename)-1] = '\0'; cfg->->stamp_utmp = 0; } else if (!strcmp(p, "-ut")) { SECOND_PASS_ONLY; cfg->->login_shell = 0; } else if (!strcmp(p, "-ls")) { SECOND_PASS_ONLY; cfg->->nethack_keypad = 1; } else if (!strcmp(p, "-sb-") || !strcmp(p, "+sb")) { SECOND_PASS_ONLY; cfg->->, &inst->cfg)) exit(1); /* pre-defaults pass to get -class */ do_defaults(NULL, &inst->cfg); if (do_cmdline(argc, argv, 1, &inst->cfg)) exit(1); /* post-defaults, do everything */inst->cfg.font); if (!inst->fonts[0]) { fprintf(stderr, "pterm: unable to load font \"%s\"\n", inst->cfg.font); exit(1); } font_charset = set_font_info(inst, 0); if (inst->cfg.boldfont[0]) { inst->fonts[1] = gdk_font_load(inst->inst->inst->cfg.widefont[0]) { inst->fonts[2] = gdk_font_load(inst->inst->inst->cfg.wideboldfont[0]) { inst->fonts[3] = gdk_font_load(inst->inst->inst->cfg.line_codepage, font_charset); inst->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); if (inst->cfg.wintitle[0]) set_title(inst, inst->inst->cfg.width + 2*inst->cfg.window_border, inst->font_height * inst->cfg.height + 2*inst->cfg.window_border); if (inst->inst->cfg.scrollbar) { if (inst->inst->cfg.window_border; geom.min_height = inst->font_height + 2*inst->inst->cfg.window_border; geom.base_height = 2*inst->inst->inst->inst->cfg, inst); inst->logctx = log_init(inst, &inst->inst->inst->cfg.height, inst->cfg.width, inst->cfg.savelines); inst->ldisc = ldisc_create(&inst-> Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fb73a8c15e564237dd20c4dffe1e45de Text-delta-base-sha1: 8e56dccc7bff394f9d0b7fd533333e27fe605b9c Text-content-length: 40 Text-content-md5: 548a0c898a14df01519ce7ad82b77708 Text-content-sha1: ad97829aeb7b02612ee2a3200ad96ecb080055ab Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN#6 o6mstatic Config cfg Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 345cb82161bbc6b8441b4c44529036d7 Text-delta-base-sha1: 4c4123250b0da57e9a9c5f3c03da8cf37c6b061a Text-content-length: 133 Text-content-md5: 4fd7dd2d32cf8840e9e305a7f60c0faa Text-content-sha1: 522c69cb79560723ae0740948695426f57028b08 Content-length: 174 K 15 cvs2svn:cvs-rev V 5 1.199 PROPS-END SVN 4"* extern Config cfg; /* defined in window.c */] $Qr?); break; case IDC_AGENTFWD Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 93551b1638b81bbf5ddc12313a7332b1 Text-delta-base-sha1: b86a08dc47311f5e27048b2a077bde7263b2db1b Text-content-length: 134 Text-content-md5: b45bacf1403fad34822bc0410db047c1 Text-content-sha1: 12b8ca7dc29b01c56a6b6afec9090e4e7ab6c681 Content-length: 175 K 15 cvs2svn:cvs-rev V 5 1.226 PROPS-END SVN /NLConfig cfg; /* exported to windlg.c */W1WrollInfo(hwnd, SB_VERT, &si, TRUE); } Context ge Revision-number: 2569 Prop-content-length: 311 Content-length: 311 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-12T15:36:05.000000Z K 7 svn:log V 210 Ahem. Global replace of `cfg' with `inst->cfg' is all very well, but let's try to make sure it doesn't happen inside any strings! The -cfg option for cursor foreground colour nearly had a nasty accident there. PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c1ab5bb2088206dba0972218ae50b620 Text-delta-base-sha1: 3aca7effcf0d2d0ae882a125c92ff5469c99b0f9 Text-content-length: 30 Text-content-md5: 23bbab54ebebcc0ac2f1576b3c99b5e1 Text-content-sha1: c84d06e6efc3b1ea4360efcc528a22472045f0e5 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVN2&1v73 Revision-number: 2570 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2003-01-12T15:42:24.000000Z K 7 svn:log V 25 Make this compile again. K 10 svn:author V 3 ben PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ebee85a67b79cc08105209eabaa4c0ce Text-delta-base-sha1: 5c1449abce2d6fbc8d0432868af2a6f1fccf0e21 Text-content-length: 113 Text-content-md5: 5ce9e6cca01fa342ecb9ecb3d5865aa6 Text-content-sha1: a850d1077e64d62a3c0aafd4b0231cd2ed76d0a6 Content-length: 153 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN4. [S[4ctx); ctx->cfg = *cfg; /* STRUCTURE COPY */ if (reset_logging) logfopen( Revision-number: 2571 Prop-content-length: 199 Content-length: 199 K 7 svn:log V 99 Ahem. Doing loads of stuff to inst->cfg would probably be best done _after_ allocating inst. Oops. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-12T15:45:29.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 23bbab54ebebcc0ac2f1576b3c99b5e1 Text-delta-base-sha1: c84d06e6efc3b1ea4360efcc528a22472045f0e5 Text-content-length: 36 Text-content-md5: 2905612b946e1d7e797fddd1a35f3ae1 Text-content-sha1: be21e1c44e1c9477fd8393583a9795d36c9af277 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.86 PROPS-END SVN&&vbenw`F Revision-number: 2572 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2003-01-12T15:46:33.000000Z K 7 svn:log V 73 When receiving data, only pass up to the backend as much as we received. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3b68be38075c1628e9243c3a908ae976 Text-delta-base-sha1: 2d99ce578b4cc7568cfcc930f426c8df207b724d Text-content-length: 22 Text-content-md5: 4a9c1877444a1d89d93e717da56b712d Text-content-sha1: 82469717dc1a599b84127529e7c964eb5f353ba5 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN R5]o Revision-number: 2573 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2003-01-12T16:11:27.000000Z K 7 svn:log V 56 Consequences of Simon's recent deglobalisation changes. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e26c5c0493f1bef4344a88b034284a01 Text-delta-base-sha1: 01ec928263a3fc497efd1aea65be7b432b9a3ea0 Text-content-length: 63 Text-content-md5: 358bdb9c25c497c78bd34399c85789bc Text-content-sha1: 73098cc052222b6ec4a3177198c4c08a2398b17f Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN/ (&(Mb/* $Id: mac.c,v 1.27 2003/01/12 16:11:27 Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 00db543800595fcd72defaf473f8b95e Text-delta-base-sha1: b8ceda34e1e1c8e84a800e8e4ebe08fa82aa8318 Text-content-length: 154 Text-content-md5: 602f7418398a6c760560a1cbb9e3e8da Text-content-sha1: d7c36621ea35ea01e898515d513741f5f5f30509 Content-length: 194 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN3K~]Ao2const *, char **); extern SockAddr mactcp_nonamelookup(char constconst *, char **); extern SockAddr ot_nonamelookup(char const Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c6890770886a50a8404485a8aaff6901 Text-delta-base-sha1: 0767a161f17152a37183631925c5371876a600ef Text-content-length: 37 Text-content-md5: b98c210bbd7233b4f0805ef3b98b1dab Text-content-sha1: 6524d41345fcdff6fc0c85212a113c51b88b6ddf Content-length: 76 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNFR ZYlZconstconst Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 03ebf16a1fd1593517717db338e159a4 Text-delta-base-sha1: 09d16fc139dce22d7be5cf4e465e58ad20e8aba9 Text-content-length: 123 Text-content-md5: cc48ea2597bf8a1bf3d4a7ccaf26a8ed Text-content-sha1: 6a405e1e294fc1a1592fa43fbf8b6e76ec496fd8 Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN3G],e+-/* $Id: macterm.c,v 1.44 2003/01/12 16:11:27, &s->cfg&s->cfg, s->cfg.host, s->cfg.port, Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 30c3701dc359ab85c868784dbcc3b659 Text-delta-base-sha1: 2cf5bba7c6ac9521d86a5c92bd103bc1e075fc0a Text-content-length: 129 Text-content-md5: 7eb18714fe1acbdef232a089d3f50052 Text-content-sha1: 47699fd29d283864f269ae1c012c6191a325e43c Content-length: 169 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNW]WRVS 8ECconst/* Casting away const -- hope StrToAddr is sensible */ err = StrToAddr((char *)const Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4a9c1877444a1d89d93e717da56b712d Text-delta-base-sha1: 82469717dc1a599b84127529e7c964eb5f353ba5 Text-content-length: 296 Text-content-md5: c836b1d7aa05ee9f900e20ec4fd77dd8 Text-content-sha1: 5738ebeb71278a32061794bae373e5599018bd00 Content-length: 335 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNj 8@Hconst *host, char **canonicalname) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); char *realhost; /* Casting away const -- hope OTInetStringToAddress is sensible */ ret->error = OTInetStringToAddress(ot.inetsvc, (char *)host, const Node-path: putty/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b63f6af778559cfbea510d712d66f461 Text-delta-base-sha1: d7c8c2dd6d34032efa6fe955ca5ce4719ff5126c Text-content-length: 718 Text-content-md5: 37920cde9fcd2a7f75da2b9959e6af11 Text-content-sha1: 8e838606b26b9d30c3d3dbb92c814fa9283accf0 Content-length: 757 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN.t-,$U>'se~# /* $Id: testback.c,v 1.5 2003/01/12 16:11:27Config *, char *, int, char **, int); static char *loop_init(void *, void **, Config *, char *, int, char **, int); static void null_reconfig(void *, Config *reconfig, null_send, null_sendbuffer, null_size, null_special, null_socket, null_exitcode, null_sendok, null_ldisc, null_provide_ldisc,null_reconfig, loop_send, null_sendbuffer, null_size, null_special, null_socket, null_exitcode, null_sendok, null_ldisc, null_provide_ldisc,Config *cfg, char *host, int port, char **realhost, Config *cfg, char *host, int port, char **realhost, void null_reconfig(void *handle, Config *cfg) { Revision-number: 2574 Prop-content-length: 163 Content-length: 163 K 7 svn:log V 65 Set the window title to the canonical host name when we connect. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-12T16:25:58.000000Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cc48ea2597bf8a1bf3d4a7ccaf26a8ed Text-delta-base-sha1: 6a405e1e294fc1a1592fa43fbf8b6e76ec496fd8 Text-content-length: 97 Text-content-md5: 25cf659017e9a70a3d5952f487833554 Text-content-sha1: 042936a93f8eb9367ea308e4487d960e9aceafda Content-length: 137 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNGf H!,}J/* $Id: macterm.c,v 1.45 2003/01/12 16:25:58 set_title(s, s->realhost Revision-number: 2575 Prop-content-length: 138 Content-length: 138 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-13T12:59:06.000000Z K 7 svn:log V 38 Fix references to new-style wishlist. PROPS-END Node-path: putty-website/faq.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f4d1342cfcf951b1ed84a895eb55503d Text-delta-base-sha1: e7f9494cab273ba8cae4d5755c8f038f266c3fcb Text-content-length: 22 Text-content-md5: 47633bb5a1f52c0503db023560279d98 Text-content-sha1: b010f90f9236d09bccb0238b1ee14a9202d1cab1 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNWS |V/ Node-path: putty-website/feedback.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aa5f98dea8fe1272b6d973d15b104050 Text-delta-base-sha1: 1c623b8c1bca4084acea1394fe40ac6b523049ee Text-content-length: 22 Text-content-md5: b84ce9956c9d77823efd8ea3cb2464aa Text-content-sha1: b420607b2fc12cacd0a90faed25305bb394a981f Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN?; %*/ Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a992aeb15f9bd8c3d4ffd933044e8e2b Text-delta-base-sha1: 6046d560bdbb6f7ac35fc237c4b3933e8a4d46ff Text-content-length: 22 Text-content-md5: ebdc7c8036b8072978c4eb304ee85b9c Text-content-sha1: ca7859b671acd0b049911148b9b38b1a8e6015ec Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN<8 &/ Revision-number: 2576 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 47 Make ^/ do the same as ^_ (wish control-slash) K 10 svn:author V 4 owen K 8 svn:date V 27 2003-01-13T15:06:56.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b45bacf1403fad34822bc0410db047c1 Text-delta-base-sha1: 12b8ca7dc29b01c56a6b6afec9090e4e7ab6c681 Text-content-length: 93 Text-content-md5: afefa15974a7a66e57e408dba5562228 Text-content-sha1: 2399f1cda8959ae0f4472169d3c544512bba7c86 Content-length: 134 K 15 cvs2svn:cvs-rev V 5 1.227 PROPS-END SVN "P(wParam == 0xBD || wParam == 0xBF) if (hwnd) SetSc Revision-number: 2577 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2003-01-13T15:08:37.000000Z K 7 svn:log V 20 window.c ^/ does ^_ K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/control-slash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7e874bc6ccd89e2526c6988493426c14 Text-delta-base-sha1: 4e96324862f832c17545f975445e6cea9ed1f6bd Text-content-length: 78 Text-content-md5: 570d4ff6a2b6e5f1c8d3c1935eabff3d Text-content-sha1: 6f662892348de5c504c590d473768f46c655d41f Content-length: 117 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN*h>*

    OSD: Done in window.c but not for any of the other ports. Revision-number: 2578 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2003-01-13T17:36:02.000000Z K 7 svn:log V 103 Summary: Blank known passwords by default in SSH packet log (I've had this one lying around for ages.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh-log-pw-blank Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1407 Text-content-md5: df6a46ff366106ebf283fded246dd909 Text-content-sha1: 492a512f705d80e0ca53b81686c150f6adc061cf Content-length: 1523 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNqqqSummary: Blank known passwords by default in SSH packet log Class: wish Priority: low Difficulty: fun Content-Type: text/x-html-body

    Proposal for the SSH packet log we use for debugging: add a checkbox (enabled by default) which causes known password fields to be blanked out, as we recommend that people do manually at the moment.

    95% of the time this information isn't useful for our diagnosis, and blanking it out manually is error-prone (it's not unknown for someone to blank out the text portion but forget the hex dump, for example). If we suspect that the information will be useful, we can always instruct our correspondent to uncheck the box.

    This would also mean that people could turn logging on semi-permanently for intermittent problems and not have to be so careful with the log files.

    Need to correctly handle things like keyboard-interactive authentication, of course.

    A similar option (but not enabled by default) would be to blank the data (`payload') fields - again, this information isn't often useful, and it would reduce the care that has to be taken with log files.

    Obviously this isn't completely secure - even a blanked-out log file contains a fair amount of information that's useful to an attacker. But it's probably a net improvement.

    As of Sep 2002, I (JTN) had a 90% complete patch to do this. I should revive it and commit it. Revision-number: 2579 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2003-01-13T18:03:55.000000Z K 7 svn:log V 49 Oops - put the right `void *' in back->reconfig. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: afefa15974a7a66e57e408dba5562228 Text-delta-base-sha1: 2399f1cda8959ae0f4472169d3c544512bba7c86 Text-content-length: 52 Text-content-md5: f9f09c079f5e31f5726deea42e620c82 Text-content-sha1: 4a8e653806521f340deaec0ce633fc2fe1b74fab Content-length: 93 K 15 cvs2svn:cvs-rev V 5 1.228 PROPS-END SVN zhandle"tart; Revision-number: 2580 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:31.551222Z PROPS-END Revision-number: 2581 Prop-content-length: 127 Content-length: 127 K 10 svn:author V 4 owen K 8 svn:date V 27 2003-01-14T10:05:00.000000Z K 7 svn:log V 28 All done, so mark as fixed. PROPS-END Node-path: putty-wishlist/data/control-slash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 570d4ff6a2b6e5f1c8d3c1935eabff3d Text-delta-base-sha1: 6f662892348de5c504c590d473768f46c655d41f Text-content-length: 92 Text-content-md5: b98903406c1b73e328296d44e78ed96c Text-content-sha1: 277afb9a2f45374d5d5b32ec52dee68674536fcd Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNh HZjYFixed-in: 2003-01-14, there for free on Unix, already there on the Mac. Revision-number: 2582 Prop-content-length: 166 Content-length: 166 K 7 svn:log V 67 Ctrl-PgUp and Ctrl-PgDn now scroll by one line on Unix and Windows K 10 svn:author V 4 owen K 8 svn:date V 27 2003-01-14T11:24:26.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2905612b946e1d7e797fddd1a35f3ae1 Text-delta-base-sha1: be21e1c44e1c9477fd8393583a9795d36c9af277 Text-content-length: 220 Text-content-md5: 17e7553fc4aeeae40f67292dbd49722c Text-content-sha1: 7567d777cdb625f5d7c570d4d28be7e7064aac9f Content-length: 260 K 15 cvs2svn:cvs-rev V 4 1.87 PROPS-END SVN&0;}M-FnK[Up && (event->state & GDK_CONTROL_MASK)) { term_scroll(inst->term, 0, -1 if (event->keyval == GDK_Page_Down && (event->state & GDK_CONTROL_MASK)) { term_scroll(inst->term, 0, +1 Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f9f09c079f5e31f5726deea42e620c82 Text-delta-base-sha1: 4a8e653806521f340deaec0ce633fc2fe1b74fab Text-content-length: 423 Text-content-md5: a3e6eb8bd925654ad7827c6b5c5f2d80 Text-content-sha1: d34e96fccdf6388a182e97bd4e92565d6f66b85b Content-length: 464 K 15 cvs2svn:cvs-rev V 5 1.229 PROPS-END SVN QF!$EPRIOR && shift_state == 2) { SendMessage(hwnd, WM_VSCROLL, SB_LINNEXT && shift_state == 2) { SendMessage(hwnd, WM_VSCROLL, SB_LIN" gg"f (is_full_screen() ? !cfg.scrollbar_in_fullscreen : !cfg.scrollbar) return; si.cbSize = sizeof(si); si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; si.nMin = 0; si.nMax = total - 1; si.nPage = page; si.nPos = s Revision-number: 2583 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2003-01-14T11:26:51.000000Z K 7 svn:log V 113 This has been occasionally irritating me for some time now. I ought to have added it to the wishlist long since. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/resize-altscr Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1144 Text-content-md5: a3156b1c22e21827cbe2835b4c577609 Text-content-sha1: d6739e63949740a0bb338936f4f026a448e537c4 Content-length: 1260 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNjjjSummary: Resizing window has nasty effects on alternate screen Class: wish Difficulty: fun Priority: low Present-in: 2003-01-14 Content-type: text/x-html-body

    Suppose you run a server-side application which switches to the alternate terminal screen. While running this application, you decide you could do with some more vertical space, so you make the window taller. A SIGWINCH is sent to the remote process and it adjusts to the new screen size; no problem there.

    Now, when you quit the application and the primary terminal screen is restored, something weird seems to happen. It looks to me as if the previous contents of the primary screen are restored somewhere near the bottom of the now-taller window, while the cursor is restored somewhere near the top.

    I'm not entirely sure how this should be handled - for instance, there's an argument in favour of pulling lines out of the scrollback and putting them back into the primary screen, as happens when you resize without the alternate screen active. But certainly it would be a good start for the cursor position to match up to the screen contents! Revision-number: 2584 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 31 Done this for Windows and Unix K 10 svn:author V 4 owen K 8 svn:date V 27 2003-01-14T11:29:07.000000Z PROPS-END Node-path: putty-wishlist/data/ctrl-pgupdn Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 911855c5dbde5a40d894008e996669d8 Text-delta-base-sha1: f65d203dc04a9fe8d6cd72554ef817050deb7d89 Text-content-length: 59 Text-content-md5: 4c9cc8de8dd4035762b29bee6ef5ce63 Text-content-sha1: 4f298d6ecfa4f9332fdc0eaa5a5f8a596fd4e8f3 Content-length: 98 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNY+Y

    Done on Windows and Unix, not yet Mac. Revision-number: 2585 Prop-content-length: 490 Content-length: 490 K 8 svn:date V 27 2003-01-14T11:38:25.000000Z K 7 svn:log V 389 I'm finally sick of my checked-out copy of bugs2html always having status `Locally Modified' because of needing different $htmldir and $baseurl values from Ben. So I've moved those definitions into `config.pl', which should be set up locally by anyone wanting to run bugs2html. Also added a .cvsignore so that config.pl won't be flagged as `?' and prompt anyone to check it in by mistake. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 10 svn:ignore V 9 config.pl PROPS-END Node-path: putty-wishlist/control/.cvsignore Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 20 Text-content-md5: 49ad9aaf53f96bf8fe42c1e0db65655d Text-content-sha1: 2c89b849d3a46a3370d81096d9fcc83adc2ec9a6 Content-length: 136 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN  config.pl Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8e5a90828a19be313ff0cb89602d9f15 Text-delta-base-sha1: 2488412202de67646e3af328eaa1491b52fce930 Text-content-length: 684 Text-content-md5: 4c3e34fd91aa8c10cabe0db5f48e2b44 Text-content-sha1: 72b0f203d489fa4599deaf8151d57544ce91700d Content-length: 724 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN7u]Z#! /usr/bin/perl # $Id: bugs2html,v 1.17 2003/01/14 11:38:25 simon Exp $ use FileHandle; use POSIX; use English; $bugdir = "../data"; # config.pl should exist in the same directory as this script, and # should define $htmldir (the full path to the directory HTML files # should be written to) and $baseurl (the relative URL path to be # added on the front of wishlist pages' links to main PuTTY pages). # It can also redefine $bugdir if you really want to run bugs2html # from somewhere other than the directory it's checked out into. A # sample config.pl might read # # $htmldir = "/home/simon/www/putty/wishlist"; # $baseurl = ".."; # require "./config.pl Revision-number: 2586 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2003-01-14T12:41:12.000000Z K 7 svn:log V 51 Slightly better handling of items without classes. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4c3e34fd91aa8c10cabe0db5f48e2b44 Text-delta-base-sha1: 72b0f203d489fa4599deaf8151d57544ce91700d Text-content-length: 262 Text-content-md5: 396671010cb1c6a003c1f8727c8a0003 Text-content-sha1: 099a096a4b842c9bfc2b688ee60a2c2b10ca35a9 Content-length: 302 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNugBKB%Sjb#! /usr/bin/perl # $Id: bugs2html,v 1.18 2003/01/14 12:41:12 jacobmy $class = ($hdrs->{class} or "artifact"); print HTML < Audit trail for this $class. Revision-number: 2587 Prop-content-length: 202 Content-length: 202 K 7 svn:log V 101 I fixed this on Sunday, and forgot that there was a wishlist entry open for it! Now marked as fixed. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-14T12:46:48.000000Z PROPS-END Node-path: putty-wishlist/data/offer-to-reset Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 24795178f8b7e349881fa148bcc01a5f Text-delta-base-sha1: bc74a30cd740a04b3652c7bc1577758e95230d9e Text-content-length: 607 Text-content-md5: 06fcc66fb09d59e4a9e54f45d71be6f8 Text-content-sha1: 05562eca2ad6102f4eaeebaaede8868cc327542c Content-length: 646 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNV FS2Fixed-in: 2003-01-13

    SGT, 2003-01-14: Recent code cleanups had the side effect of allowing me to detect changes in these features, so I arranged that the current state automatically gets updated when you change such a feature in mid-session. I didn't bother with the message box; it seemed excessive for such a small thing.

    Just for reference, at the time of fixing, the full list of such features is: auto wrap mode, DEC origin mode, background-colour erase, whether blinking text really blinks, and the character classes for double-click word-at-a-time selection. Revision-number: 2588 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 29 Record progress on x11-auth. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-14T13:00:03.000000Z PROPS-END Node-path: putty-wishlist/data/x11-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cff64e7e852a38b3b5cf845507f12a42 Text-delta-base-sha1: 90e0defab905de0030cd6252f9ffb32f34508c58 Text-content-length: 628 Text-content-md5: 3eff5e671cd145bac9c3bbc2a2031f81 Text-content-sha1: d0dd961cafacbe5863d5bea6fbf61acbb3a991d4 Content-length: 667 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN}^a}a

    SGT, 2003-01-14: A couple of days ago I built in the infrastructure for this, since X forwarding in the Unix port of Plink is virtually useless without it. The platform-independent X forwarding code now has the ability to talk either of MIT-MAGIC-COOKIE-1 or XDM-AUTHORIZATION-1 to the local X server, provided a platform-specific function tells it what authentication cookie to use. So it's still not actually supported on Windows (since the Windows version of this function does nothing), but the amount of work that would need to be done to support it is now minimal. Revision-number: 2589 Prop-content-length: 720 Content-length: 720 K 8 svn:date V 27 2003-01-14T14:19:35.000000Z K 7 svn:log V 619 After the New Year copyright-dates fiasco, I think it's about time we had one or two official checklists. This file lists the locations of _all_ the copies of the licence and the copyright dates, all the files in CVS which need to know the current version number, and also lays out the release procedure since I always find it terribly fiddly to do it all in the right order. PLEASE KEEP THESE LISTS UP TO DATE, people! Anyone adds a new copy of the licence or the copyright notice, shout about it in here. Likewise any file that needs to know the current release number and can't get away with referencing LATEST.VER. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 6667 Text-content-md5: eee1983a61f05c953581839c72e0e916 Text-content-sha1: c2c5d4b95dd2266bb1eac40dbfc4fb4bb4d706f5 Content-length: 6783 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN}}}Checklists for PuTTY administrative procedures ============================================== Locations of the licence ------------------------ The PuTTY copyright notice and licence are stored in quite a few places. At the start of a new year, the copyright year needs updating in all of them; and when someone sends a massive patch, their name needs adding in all of them too. The LICENCE file in the main source distribution: - putty/LICENCE The resource files: - putty/pageant.rc + the copyright date appears twice, once in the About box and once in the Licence box. Don't forget to change both! - putty/puttygen.rc + the copyright date appears twice, once in the About box and once in the Licence box. Don't forget to change both! - putty/win_res.rc + the copyright date appears twice, once in the About box and once in the Licence box. Don't forget to change both! - putty/mac/mac_res.r The documentation (both the preamble blurb and the licence appendix): - putty/doc/blurb.but - putty/doc/licence.but The website: - putty-website/licence.html Before tagging a release ------------------------ For a long time we got away with never checking the current version number into CVS at all - all version numbers were passed into the build system on the compiler command line, and the _only_ place version numbers showed up in CVS was in the tag information. Unfortunately, those halcyon days are gone, and we do need the version number in CVS in a couple of places. These must be updated _before_ tagging a new release. The file used to generate the Unix snapshot version numbers (which are - so that the Debian versioning system orders them correctly with respect to releases): - putty/LATEST.VER And the Windows installer script: - putty/putty.iss The actual release procedure ---------------------------- This is the procedure I (SGT) currently follow (or _should_ follow :-) when actually making a release, once I'm happy with the position of the tag. - Write a release announcement (basically a summary of the changes since the last release). Squirrel it away in ixion:src/putty/local/announce- in case it's needed again within days of the release going out. - On my local machines, check out the release-tagged version of the sources. - Build the Windows/x86 release binaries. Don't forget to supply VER=/DRELEASE=. Run them, or at least one or two of them, to ensure that they really do report their version number correctly. - Acquire the Windows/alpha release binaries from Owen. + Verify the snapshot-key signatures on these, to ensure they're really the ones he built. If I'm going to snapshot-sign a zip file I make out of these, I'm damn well going to make sure the binaries that go _into_ it were snapshot-signed themselves. - Run Halibut to build the docs. - Build the .zip files. + The binary archive putty.zip just contains all the .exe files except PuTTYtel, and the .hlp and .cnt files. + The source archive putty-src.zip is built by puttysnap.sh (my cron script that also builds the nightly snapshot source archive). + The docs archive puttydoc.zip contains all the HTML files output from Halibut. - Build the installer. - Sign the release (gpg --detach-sign). + Sign the locally built x86 binaries, the locally built x86 binary zipfile, and the locally built x86 installer, with the release keys. + The Alpha binaries should already have been signed with the snapshot keys. Having checked that, sign the Alpha binary zipfile with the snapshot keys too. + The source archive should be signed with the release keys. This was the most fiddly bit of the last release I did: the script that built the source archive was on ixion, so I had to bring the archive back to my local machine, check everything in it was untampered-with, and _then_ sign it. Perhaps next time I should arrange that puttysnap.sh can run on my local box; it'd be a lot easier. + Don't forget to sign with both DSA and RSA keys for absolutely everything. - Begin to pull together the release directory structure. + subdir `x86' containing the x86 binaries, x86 binary zip, x86 installer, and all signatures on the above. + subdir `alpha' containing the Alpha binaries, Alpha binary zip, and all signatures on the above. + top-level dir contains the source zip (plus signatures), puttydoc.txt, the .hlp and .cnt files, and puttydoc.zip. - Create and sign md5sums files: one in the x86 subdir, one in the alpha subdir, and one in the parent dir of both of those. + The md5sums files need not list the .DSA and .RSA signatures, and the top-level md5sums need not list the other two. + Sign the md5sums files (gpg --clearsign). The Alpha md5sums should be signed with the snapshot keys, but the other two with the release keys (yes, the top-level one includes some Alpha files, but I think people will understand). - Now double-check by verifying all the signatures on all the files. - Create subdir `htmldoc' in the release directory, which should contain exactly the same set of HTML files that went into puttydoc.zip. - Now the whole release directory should be present and correct. Upload to ixion:www/putty/, upload to chiark:ftp/putty-, and upload to the:www/putty/. - Update the HTTP redirects. + Update the one at the:www/putty/htaccess which points the virtual subdir `latest' at the actual latest release dir. TEST THIS ONE - it's quite important. + ixion:www/putty/.htaccess has an individual redirect for each version number. Add a new one. - Update the FTP symlink (chiark:ftp/putty-latest -> putty-). - Update web site. + Adjust front page (`the latest version is '). + Adjust filename of installer on links in Download page. + Adjust header text on Changelog page. (That includes changing `are new' in previous version to `were new'!) - Check the Docs page links correctly to the release docs. (It should do this automatically, owing to the `latest' HTTP redirect.) - Check that the web server attaches the right content type to .HLP and .CNT files. - Announce the release! + Mail the announcement to putty-announce. + Post it to comp.security.ssh. + Mention it in on mono. - All done. Probably best to run `cvs up -A' now, or I'll only forget in a few days' time and get confused... Revision-number: 2590 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2003-01-14T15:01:18.000000Z K 7 svn:log V 110 It's impossible to write a checklist from scratch without leaving one or two things out of the first version. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eee1983a61f05c953581839c72e0e916 Text-delta-base-sha1: c2c5d4b95dd2266bb1eac40dbfc4fb4bb4d706f5 Text-content-length: 251 Text-content-md5: 2b2c5ae4b3e0780d03976b31e501e15a Text-content-sha1: 9e2389d73caad1b57beaf589a915af18130b1b31 Content-length: 290 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN}a\+KS)v + Make sure to run mkfiles.pl _after_ this checkout, just in caseRun webupdate, so that all the changes on ixion propagate to chiark. Important to do this _before_ announcing that the release is available Revision-number: 2591 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2003-01-14T15:24:51.000000Z K 7 svn:log V 116 request_resize() needs to call term_size() to tell the terminal emulator that its resize request has been approved. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 25cf659017e9a70a3d5952f487833554 Text-delta-base-sha1: 042936a93f8eb9367ea308e4487d960e9aceafda Text-content-length: 112 Text-content-md5: 3fd8bd71585d6568a29868b23053dc7e Text-content-sha1: e996bbc08adaa32dfe8e8e8581a4972995128f9f Content-length: 152 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNfh V*,h~/* $Id: macterm.c,v 1.46 2003/01/14 15:24:51term_size(s->term, h, w, s->cfg.savelines) Revision-number: 2592 Prop-content-length: 626 Content-length: 626 K 8 svn:date V 27 2003-01-14T18:28:23.000000Z K 7 svn:log V 525 Deglobalise the Unicode module. Despite all my grand plans, I've just done this the very simple way - bundle all the globals into a data structure and pass pointers around. One particularly ugly wart is that wc_to_mb now takes a pointer to this structure as an argument (optional, may be NULL, and unused in any Unicode layer that's even marginally less of a mess than the Windows one). I do need to do this properly at some point, but for now this should just about be adequate. As usual, the Mac port has not been updated. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldiscucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ad9643d16c40123d5c5bb74bef2f13e5 Text-delta-base-sha1: c95e451c95b911c080cb79da9834d22a147fde95 Text-content-length: 137 Text-content-md5: a7c704cf1302be4ead31a4fc21b1cd9e Text-content-sha1: a003cf2bfa4f5845be03e76ceb50471d3d435f06 Content-length: 176 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN3 ss;Ldisc->term->ucsdata->line_codepage, 0, widebuf, len, linebuffer, linesize, NULL, NULL, ldisc->term->ucsdata Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 350064d69b49bad7b16005fe95cc343f Text-delta-base-sha1: 82148a53323af260acb05e196151431e3cc7f755 Text-content-length: 398 Text-content-md5: 246574b74e9469b780e00dee341d9248 Text-content-sha1: 97606544716a9455010df2550cc12357cf3e7932 Content-length: 439 K 15 cvs2svn:cvs-rev V 5 1.188 PROPS-END SVNb/gv0q~cstruct unicode_data { char **uni_tbl; int dbcs_screenfont; int font_codepage; int line_codepage; wchar_t unitab_scoacs[256]; wchar_t unitab_line[256]; wchar_t unitab_font[256]; wchar_t unitab_xterm[256]; wchar_t unitab_oemcp[256]; unsigned char unitab_ctrl[256]; }struct unicode_data, struct unicode_data *ucsdata Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 619423b4542ab142bccf1cf1cd708da9 Text-delta-base-sha1: 7374970fc0686410b76143ae21a233c44a539b40 Text-content-length: 1933 Text-content-md5: 193f0cd74390c8cf641cf35207422724 Text-content-sha1: c9bdc5e8640c7d6ba6cbf9580555c9cdb6f2d2ad Content-length: 1974 K 15 cvs2svn:cvs-rev V 5 1.129 PROPS-END SVNn)h^g9C}n ;?>d}"z9e%^Jj^}"'fFdR[Nstruct unicode_data *ucsdata, ucsdata = ucsdataterm->ucsdata->unitab_ctrl[c] != 0xFF) c = term->ucsdata->term->ucsdata->unitab_ctrl[c] != 0xFF) c = term->ucsdata->term->ucsdata->unitab_ctrl[c] != 0xFF) c = term->ucsdata->term->ucsdata->unitab_line[tchar & 0xFF]; break; case ATTR_LINEDRW: tchar = term->ucsdata->unitab_xterm[tchar & 0xFF]; break; case ATTR_SCOACS: tchar = term->ucsdata->term->ucsdata->term->ucsdata->term->ucsdata->unitab_xterm[uc & 0xFF]; break; } case ATTR_ASCII: uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case ATTR_SCOACS: uc = term->ucsdata->term->ucsdata->unitab_font[uc & 0xFF]; break; case ATTR_OEMCP: uc = term->ucsdata->term->ucsdata->term->ucsdata->font_codepage, 0, buf, 2, wbuf, 4); top.x++; } else { buf[0] = c; rv = mb_to_wc(term->ucsdata->term->ucsdata->unitab_xterm[uc & 0xFF]; break; case ATTR_ASCII: uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case ATTR_SCOACS: uc = term->ucsdata->unitab_scoacs[uc&0xFF]; break; } switch (uc & CSET_MASK) { case ATTR_ACP: uc = term->ucsdata->unitab_font[uc & 0xFF]; break; case ATTR_OEMCP: uc = term->ucsdata->term->ucsdata->dbcs_screenfont && term->ucsdata->font_codepage == term->ucsdata->h?WWh of spaces at the end of a non-wrapping line. */ if (!(ldata[term->cols] & LATTR_WRAPPED)) { unsigned long *q = ldata + term->cols; while (q > ldata && (q[-1] & CHAR_MASK) == 0x20) q--; if (q == ldata + term->cols) q--; if (p.x >= q - ldata) p.x = (dir == -1 ? q - ldata : term->cols - 1); } break; case SM_WORD: /* * In this mode, the units are maximal runs of characters * whose `wordness' has the same value. */ wvalue = wo Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: baa6566a75fd80ec746740a867d3cc23 Text-delta-base-sha1: 2b4a936dc6e8f8109d30aee5b6791d12206bbef9 Text-content-length: 99 Text-content-md5: 7fe54deccc32986b5f7cf9e4fa31b261 Text-content-sha1: 7f8726a5b406549dab6256bea847c9ae58de53aa Content-length: 138 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN.b M%pstruct unicode_data *ucsdata(term)->ucsdata->line_codepage==CP_UTF8) #endif Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0f26507d77952c14a802ffecde0a467d Text-delta-base-sha1: a91f5ab98874cce018a8ce6d2762798d7879f6e7 Text-content-length: 3770 Text-content-md5: d9222c7268928bf0c0deb7e0e305e831 Text-content-sha1: 2927a23376f7a5599feb2096118930a5ab5a95a7 Content-length: 3810 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNLu<)eqN7 5ytaz[>Uv #tvh@NG69|A_0#{{F, struct unicode_data *ucsdataucsdata->line_codepage = decode_codepage(cfg->line_codepage); if (ucsdata->font_codepage <= 0) { ucsdata->font_codepage=0; ucsdata->dbcs_screenfont=0; } if (cfg->vtmode == VT_OEMONLY) { ucsdata->font_codepage = 437; ucsdata->dbcs_screenfont = 0; if (ucsdata->line_codepage <= 0) ucsdata->line_codepage = GetACP(); } else if (ucsdata->line_codepage <= 0) ucsdata->line_codepage = ucsdata->font_codepage; /* Collect screen font ucs table */ if (ucsdata->dbcs_screenfont || ucsdata->font_codepage == 0) { get_unitab(ucsdata->font_codepage, ucsdata->unitab_font, 2); for (i = 128; i < 256; i++) ucsdata->unitab_font[i] = (WCHAR) (ATTR_ACP + i); } else { get_unitab(ucsdata->font_codepage, ucsdata->unitab_font, 1); /* CP437 fonts are often broken ... */ if (ucsdata->font_codepage == 437) ucsdata->unitab_font[0] = ucsdata->csdata->csdata->csdata->unitab_scoacs, ucsdata->unitab_oemcp, sizeof(ucsdata->unitab_scoacs)); else get_unitab(437, ucsdata->unitab_scoacs, 1); /* Collect line set ucs table */ if (ucsdata->line_codepage == ucsdata->font_codepage && (ucsdata->dbcs_screenfont || cfg->vtmode == VT_POORMAN || ucsdata->csdata->unitab_line[i] = (WCHAR) i; for (i = 32; i < 256; i++) ucsdata->unitab_line[i] = (WCHAR) (ATTR_ACP + i); ucsdata->unitab_line[127] = (WCHAR) 127; } else { get_unitab(ucsdata->line_codepage, ucsdata->unitab_line, 0); } #if 0 debug( ("Line cp%d, Font cp%d%s\n", ucsdata->line_codepage, ucsdata->font_codepage, ucsdata->csdata->csdata->unitab_xterm, ucsdata->unitab_line, sizeof(ucsdata->unitab_xterm)); memcpy(ucsdata->unitab_xterm + '`', unitab_xterm_std, sizeof(unitab_xterm_std)); ucsdata->unitab_xterm['_'] = ' '; /* Generate UCS ->line page table. */ if (ucsdata->uni_tbl) { for (i = 0; i < 256; i++) if (ucsdata->uni_tbl[i]) sfree(ucsdata->uni_tbl[i]); sfree(ucsdata->uni_tbl); ucsdata->csdata->unitab_line[i])) continue; if (DIRECT_FONT(ucsdata->unitab_line[i])) continue; if (!ucsdata->uni_tbl) { ucsdata->uni_tbl = smalloc(256 * sizeof(char *)); memset(ucsdata->uni_tbl, 0, 256 * sizeof(char *)); } j = ((ucsdata->unitab_line[i] >> 8) & 0xFF); if (!ucsdata->uni_tbl[j]) { ucsdata->uni_tbl[j] = smalloc(256 * sizeof(char)); memset(ucsdata->uni_tbl[j], 0, 256 * sizeof(char)); } ucsdata->uni_tbl[j][ucsdata->csdata->unitab_line[i] < ' ' || (ucsdata->unitab_line[i] >= 0x7F && ucsdata->unitab_line[i] < 0xA0)) ucsdata->unitab_ctrl[i] = i; else ucsdata->csdata->unitab_scoacs, ucsdata->unitab_oemcp, ATTR_OEMCP); link_font(ucsdata->unitab_line, ucsdata->unitab_font, ATTR_ACP); link_font(ucsdata->unitab_scoacs, ucsdata->unitab_font, ATTR_ACP); link_font(ucsdata->unitab_xterm, ucsdata->csdata->unitab_line, ucsdata->unitab_oemcp, ATTR_OEMCP); link_font(ucsdata->unitab_xterm, ucsdata->unitab_oemcp, ATTR_OEMCP); } if (ucsdata->dbcs_screenfont && ucsdata->font_codepage != ucsdata->csdata->csdata->unitab_line[i]) && ucsdata->unitab_line[i] >= 160 && ucsdata->unitab_line[i] < 256) { ucsdata->unitab_line[i] = (WCHAR) (ATTR_ACP + poorman_latin1[ucsdata->unitab_line[i] - 160]); } for (i = 96; i < 127; i++) if (!DIRECT_FONT(ucsdata->unitab_xterm[i])) ucsdata->unitab_xterm[i] = csdata->unitab_scoacs[i])) ucsdata->, struct unicode_data *ucsdata) { char *p; int i; if (ucsdata && codepage == ucsdata->line_codepage && ucsdata->csdata->uni_tbl && (p1 = ucsdata-> Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 17e7553fc4aeeae40f67292dbd49722c Text-delta-base-sha1: 7567d777cdb625f5d7c570d4d28be7e7064aac9f Text-content-length: 266 Text-content-md5: aa7c2535e7707f4466f22e56f986dbf4 Text-content-sha1: 01e0de26a7e9034b3f7670a49d9f3d0e630b6f40 Content-length: 306 K 15 cvs2svn:cvs-rev V 4 1.88 PROPS-END SVN0,/M}2w~TK\ !T*4|struct unicode_data ucsdatainst->ucsdata.line_codepage, 0, data, len, inst->pasteout_data, inst->pasteout_data_len, NULLinst->ucsdata.&inst->ucsdata, &inst->ucsdata Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c99242c713130bb8f0af7dd57e290fcd Text-delta-base-sha1: ad0fbadde904ae4857a8a39660533bdf607052a3 Text-content-length: 92 Text-content-md5: 49f48d20260b551451ec4a3ea67b93aa Text-content-sha1: 72dfb12f86d332e121583625ddc6c2e7b723a19a Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN/h F{F'struct unicode_data; int init_ucs(struct unicode_data *ucsdata, Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c0ddeb575394fa85a5cea23dd818f7d2 Text-delta-base-sha1: fecd434ab41285e2e1697247f77e030c8838461d Text-content-length: 815 Text-content-md5: 8c3a79e946c8df0a985c3ec64e8e5cae Text-content-sha1: acbf74769de5640e49d646fc0a987877334c30d3 Content-length: 855 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN+.Ba4$;u_q{*]gnV0e/P##E0{, struct unicode_data *ucsdatastruct unicode_data *ucsdata, ucsdata->ucsdata->line_codepage = charset_from_mimeenc(linecharset); if (ucsdata->line_codepage == CS_NONE) ucsdata->ucsdata->line_codepage == CS_NONE) ucsdata->line_codepage = font_charset; if (ucsdata->ucsdata->line_codepage == CS_NONE) ucsdata->unitab_line[i] = 0xD800 | i; else if (1 == charset_to_unicode(&p, &len, wc, 1, ucsdata->line_codepage, NULL, L"", 0)) ucsdata->unitab_line[i] = wc[0]; else ucsdata->csdata->unitab_xterm[i] = unitab_xterm_std[i & 0x1F]; else ucsdata->unitab_xterm[i] = ucsdata->csdata->unitab_scoacs[i] = wc[0]; else ucsdata->csdata->csdata->unitab_ctrl[i] = i; else ucsdata-> Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a3e6eb8bd925654ad7827c6b5c5f2d80 Text-delta-base-sha1: d34e96fccdf6388a182e97bd4e92565d6f66b85b Text-content-length: 1010 Text-content-md5: 690e134eb325397943a5a1d1c75009d5 Text-content-sha1: e956a417c2363dc0117d92ad667e8c044d3c315c Content-length: 1051 K 15 cvs2svn:cvs-rev V 5 1.230 PROPS-END SVNiv961JF|toMy ^'w HsH&;TaZ5struct unicode_data ucsdata;memset(&ucsdata, 0, sizeof(ucsdata)); term = term_init(&cfg, &ucsdataucsdata.font_codepage = GetOEMCP(); else if (TranslateCharsetInfo ((DWORD *) cset, &info, TCI_SRCCHARSET)) ucsdata.font_codepage = info.ciACP; else ucsdata.font_codepage = -1; GetCPInfo(ucsdata.font_codepage, &cpinfo); ucsdata., &ucsdatacsdata.unitab_xterm['q'] & CHAR_MASK); attr |= (ucsdata.ucsdata.ucsdata.ucsdata.ucsdata.csdata.unitab_line[uc & 0xFF]; break; case ATTR_LINEDRW: uc = ucsdata.unitab_xterm[uc & 0xFF]; break; case ATTR_SCOACS: uc = ucsdata.ucsdata.ucsdata.ucsdata.ucsdata. zqq icon_name = smalloc(1 + strlen(title)); strcpy(icon_name, title); if (!cfg.win_name_always && IsIconic(hwnd)) SetWindowText(hwnd, title); } void set_sbar(void *frontend, int total, int start, int page) { SCROLLINFO si; i Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1c55b9b1487854f4f307bd1cd98c4052 Text-delta-base-sha1: 9af558aac9b8cc3c09fce3ff110ea81ce58f0505 Text-content-length: 50 Text-content-md5: d360751faad83cdb935a1f4dd874b428 Text-content-sha1: add6e24793bcb324ca58624b5de50acc37fa4470 Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNf}"[, struct unicode_data *); #endif Revision-number: 2593 Prop-content-length: 328 Content-length: 328 K 8 svn:date V 27 2003-01-14T18:43:26.000000Z K 7 svn:log V 229 Add double width/height support. This passes all the relevant parts of vttest apart from the "mad programmer" screen, which I think is a linedraw problem. This also intorduces proper clipping of the drawn text for good measure. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 602f7418398a6c760560a1cbb9e3e8da Text-delta-base-sha1: d7c36621ea35ea01e898515d513741f5f5f30509 Text-content-length: 176 Text-content-md5: 9d2d41e8d2be2883ece7a05c2179d9a7 Text-content-sha1: d375d1256a45488eb9bae1fbda01835e31e7d63b Content-length: 216 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNKi 82Point font_stdnumer; Point font_stddenom; Point font_widenumer; Point font_widedenom; Point font_bignumer; Point font_bigdenom Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3fd8bd71585d6568a29868b23053dc7e Text-delta-base-sha1: e996bbc08adaa32dfe8e8e8581a4972995128f9f Text-content-length: 2936 Text-content-md5: 1cba07b01eaf8e7bb130be28d5f265a4 Text-content-sha1: b9cc8aa3a0c27105c50f4b96d4359b85a4faf48f Content-length: 2976 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNhGU.,+gUL 6rb3]"j#\,H)FIll.|X/* $Id: macterm.c,v 1.47 2003/01/14 18:43:26/* * Try to work out a horizontal scaling factor for the current font * that will give a chracter width of wantwidth. Return it in numer * and denom (suitable for passing to StdText()). */ static void mac_workoutfontscale(Session *s, int wantwidth, Point *numerp, Point *denomp) { Point numer, denom, tmpnumer, tmpdenom; int gotwidth, i; const char text = 'W'; FontInfo fi; fprintf(stderr, "want width = %d\n", wantwidth); numer.v = denom.v = 1; /* always */ numer.h = denom.h = 1; for (i = 0; i < 3; i++) { fprintf(stderr, "Trying %d:%d\n", numer.h, denom.h); tmpnumer = numer; tmpdenom = denom; if (s->window->grafProcs != NULL) gotwidth = InvokeQDTxMeasUPP(1, &text, &tmpnumer, &tmpdenom, &fi, s->window->grafProcs->txMeasProc); else gotwidth = StdTxMeas(1, &text, &tmpnumer, &tmpdenom, &fi); /* The result of StdTxMeas must be scaled by the factors it returns. */ gotwidth = FixRound(FixMul(gotwidth << 16, FixRatio(tmpnumer.h, tmpdenom.h))); fprintf(stderr, "width = %d\n", gotwidth); if (gotwidth == wantwidth) break; numer.h *= wantwidth; denom.h *= gotwidth; } *numerp = numer; *denomp = denommac_workoutfontscale(s, s->font_width, &s->font_stdnumer, &s->font_stddenom); mac_workoutfontscale(s, s->font_width * 2, &s->font_widenumer, &s->font_widedenom); TextSize(s->cfg.fontheight * 2); mac_workoutfontscale(s, s->font_width * 2, &s->font_bignumer, &s->font_bigdenom); TextSize(s->cfg.fontheight), saveclip; char mactextbuf[1024]; UniChar unitextbuf[1024]; wchar_t *unitextptr; int i, fontwidth fontwidth = s->font_width; if ((lattr & LATTR_MODE) != LATTR_NORM) fontwidth *= 2; fontwidth; a.textrect.right = (x + len) * fontwidth; if (a.textrect.right > s->term->cols * s->font_width) a.textrect.right = s->term->colsswitch (lattr & LATTR_MODE) { case LATTR_NORM: TextSize(s->cfg.fontheight); a.numer = s->font_stdnumer; a.denom = s->font_stddenom; break; case LATTR_WIDE: TextSize(s->cfg.fontheight); a.numer = s->font_widenumer; a.denom = s->font_widedenom; break; case LATTR_TOP: case LATTR_BOT: TextSize(s->cfg.fontheight * 2); a.numer = s->font_bignumer; a.denom = s->font_bigdenom; break; }saveclip = NewRgn(); GetClip(saveclip); ClipRect(&a.textrect);SetClip(saveclip); DisposeRgn(saveclipswitch (a->lattr & LATTR_MODE) { case LATTR_NORM: case LATTR_WIDE: MoveTo(a->textrect.left, a->textrect.top + a->s->font_ascent); break; case LATTR_TOP: MoveTo(a->textrect.left, a->textrect.top + a->s->font_ascent * 2); break; case LATTR_BOT: MoveTo(a->textrect.left, a->textrect.top - a->s->font_height + a->s->font_ascent * 2); break; } Revision-number: 2594 Prop-content-length: 423 Content-length: 423 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-14T18:43:45.000000Z K 7 svn:log V 322 Miscellaneous fixes to finish up `remove-statics'. rlogin.c had a holdout static I hadn't noticed; unicode.c had one too; and a large number of statics that were perfectly OK due to being constants have been made `const', with assorted `const' repercussions all over the place. I now declare `remove-statics' to be fixed. PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f18f4c89d09970aa65ad7d59a947ac7f Text-delta-base-sha1: 12a49a6990f0b5ae994aa01212a7c37250aa650e Text-content-length: 59 Text-content-md5: cdfc4b9341344ef6069611015cd1f72f Text-content-sha1: ad3a536da1ccd9bd3e8e732ab3ce4488c7d22abc Content-length: 99 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNQi76GT3constconstconstconst Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 246574b74e9469b780e00dee341d9248 Text-delta-base-sha1: 97606544716a9455010df2550cc12357cf3e7932 Text-content-length: 70 Text-content-md5: 1d8c2f0dea7f9a385d3f5db692ece31b Text-content-sha1: b19c95e253551bef478f5ee767a60cadc2930ae0 Content-length: 111 K 15 cvs2svn:cvs-rev V 5 1.189 PROPS-END SVN/; /q>onst char *name); int platform_default_i(const Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f6b0c0d6b91bc5e94fedf53602a199ca Text-delta-base-sha1: 2e321e88af0c88eac8c90c9b79711086bb9c47d1 Text-content-length: 155 Text-content-md5: d2d8182d206fe9f04617f5d88e520835 Text-content-sha1: c43d26a581699a4a6eef76fa8ca873a8c901b9e7 Content-length: 195 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN ,ybWW\#W2firstbytif (rlogin->firstbyte) { if (data[0] == '\0') { data++; len--; } rlogin->rlogin->firstbyte = 1 Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c674de9556b296b93bfa696140baa96b Text-delta-base-sha1: c84ce7216cb2d7229be13c0cd9ee66a60949e08c Text-content-length: 108 Text-content-md5: f8325157022a83233a02fd075bec3c99 Text-content-sha1: 8bdbf273ee6dbdc3f0740ae8ffb1e12c1f53f2ad Content-length: 148 K 15 cvs2svn:cvs-rev V 4 1.96 PROPS-END SVNNuFT,i1onst char *name, const char *def, onst char *const onst char *const Node-path: putty/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0520eba5e0f98f6aec2e9e1aa89c3f45 Text-delta-base-sha1: 9611ed0605c11d730cf461037995106dd2fade56 Text-content-length: 474 Text-content-md5: 352872dfce0b5b1700c97179ab0942e3 Text-content-sha1: 446789847c2b6c95728a8ef1f122fb8b5328c8cc Content-length: 513 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN, *$ '|3".wIQ}$onst char *sessionname); void write_setting_s(void *handle, const char *key, const char *value); void write_setting_i(void *handle, constonst char *sessionname); char *read_setting_s(void *handle, const char *key, char *buffer, int buflen); int read_setting_i(void *handle, constonst onst char *hostname, int port, const char *keytype, constonst char *hostname, int port, const char *keytype, const char *key Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c39748cbf44d7f7127d1229cb9407b2d Text-delta-base-sha1: 8b67423b8b051b4f6240ef6a8e14c63cecdf6461 Text-content-length: 143 Text-content-md5: d1394ebd39c763259d8d128332c10967 Text-content-sha1: 510cc71754c27f971cb6f237a357ab64869e3fe0 Content-length: 183 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN@R uuB~const unsigned char iac[2] = { IAC, IAC }; static const unsigned char cr[2] = { CR, NUL }; #if 0 static const Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d9222c7268928bf0c0deb7e0e305e831 Text-delta-base-sha1: 2927a23376f7a5599feb2096118930a5ab5a95a7 Text-content-length: 469 Text-content-md5: 9fb1e518cfd718e70ee7dd9f0ef0fc75 Text-content-sha1: 01bbfe0b40d3f5d5640c6fa231d7c0ab29902ffa Content-length: 509 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNuf8, 9`CO"AO =ponstonstonstconst_internal(int first, int second, int recurse) { static constnc = check_compose_internal(second, first, 1); if (nc == -1) nc = check_compose(toupper(first), toupper(second), 1); if (nc == -1) nc = check_compose(toupper(second), toupper(first), 1); } return nc; } int check_compose(int first, int second) { return check_compose_internal(first, second, 0) Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aa7c2535e7707f4466f22e56f986dbf4 Text-delta-base-sha1: 01e0de26a7e9034b3f7670a49d9f3d0e630b6f40 Text-content-length: 51 Text-content-md5: 5b16ab24582cc74cd47a11d5fca3bd0c Text-content-sha1: 8d65a790f71f5b1a14c1d3beafa367ad46f7527f Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.89 PROPS-END SVN,>A@V=oonst onst onst Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 49f48d20260b551451ec4a3ea67b93aa Text-delta-base-sha1: 72dfb12f86d332e121583625ddc6c2e7b723a19a Text-content-length: 26 Text-content-md5: 9368ed4babdffcfb9545767bed4cc5b0 Text-content-sha1: 1ae3d30559efa385cfb26495360d13c962b8eaa3 Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNhn UTonst Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 548a0c898a14df01519ce7ad82b77708 Text-delta-base-sha1: ad97829aeb7b02612ee2a3200ad96ecb080055ab Text-content-length: 50 Text-content-md5: 63897e20ed3688f0e30f9b56f1df7d6f Text-content-sha1: eba1c4adbe38f5f50d91b6f93640a86d2a7a946f Content-length: 90 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN6HTTS&{;onst onst onst Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 985896bfacd394bc575ef1d89f9fa556 Text-delta-base-sha1: 543e1bf139a9b726a86c13bdd4323fc66eb46a31 Text-content-length: 624 Text-content-md5: 50ed1fa3f94d75cddf660e8c27fb1e4a Text-content-sha1: cf9f95343622774d9ee7765619ac266ac9a119e7 Content-length: 663 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNp}I+";5}3WZ1; :nE.^*3lonst char *sessionname) { return NULL; } void write_setting_s(void *handle, const char *key, const char *value) { } void write_setting_i(void *handle, constonst char *key; const, *keykey = smalloc(q-p); memcpy(key, p, q-p); key[q-p-1] = '\0'; xrms->key = keyonst char *get_setting(const onst onst char *key, char *buffer, int buflen) { constonst char *key, int defvalue) { constonst onst char *hostname, int port, const char *keytype, constonst char *hostname, int port, const char *keytype, const Node-path: putty/windefs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e7b3a01458709ac4c58ce0e4e4066642 Text-delta-base-sha1: 0ec4111685a0ec9de51fb9e54e3c5e59fbeae1e6 Text-content-length: 143 Text-content-md5: c89903b93a461ccae9e309db8d1a29e7 Text-content-sha1: 06f995f86a9143a4bb00ceaf4f3383ea378d3367 Content-length: 182 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN+ zLze:onst char *name) { if (!strcmp(name, "Font")) return "Courier New"; return NULL; } int platform_default_i(const Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c96bd77456689584a13bfbc3c719953c Text-delta-base-sha1: 5fc6b2a8eee06563c180b94fbf6c173bcb86e7ee Text-content-length: 96 Text-content-md5: 4dbc6f40324bc426e73b5a86c7aaf1c6 Text-content-sha1: 175c14030dd5aff27a403d7d35558a00e9e527af Content-length: 136 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVN*0#r`;%Ra;U7;W;constconstconstshort localportconst Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 512441a12651775994b61eff06ceceed Text-delta-base-sha1: 3dc1b3c96d468b6335e7c9af5e6631a5e4442e03 Text-content-length: 464 Text-content-md5: b6c24b318c01b9da5aee06e9b54bd0b5 Text-content-sha1: 7362ff89b3ab4100b91da3ba57f9d285c9730e6e Content-length: 504 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN Mw@D-x$\5C@Rm0:Trh"Yge(V4onst char hex[16] = "0123456789ABCDEF"; static void mungestr(const onst onst onst char *key, const char *SZ, value, 1 + strlen(value)); } void write_setting_i(void *handle, constonst onstonstonst onst char *hostname, int port, constonst char *hostname, int port, const char *keytype, constonst char *hostname, int port, const char *keytype, const Revision-number: 2595 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 54 Remove debugging printfs from mac_workoutfontscale(). K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-14T18:44:34.000000Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1cba07b01eaf8e7bb130be28d5f265a4 Text-delta-base-sha1: b9cc8aa3a0c27105c50f4b96d4359b85a4faf48f Text-content-length: 77 Text-content-md5: 5a6659fd1062663f9db221fab588fccf Text-content-sha1: d253afdb48470f8cb6f3b13840da013240781c80 Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNG0,C,^$8D/* $Id: macterm.c,v 1.48 2003/01/14 18:44:34 Revision-number: 2596 Prop-content-length: 110 Content-length: 110 K 8 svn:date V 27 2003-01-14T18:47:15.000000Z K 7 svn:log V 10 Done. :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/remove-statics Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6d97ed06c36f9ea9f9d0c0f1a66480fb Text-delta-base-sha1: eaec91244f4d0a86724c5d887fe66b09eee2244e Text-content-length: 650 Text-content-md5: 40f2a03a5a71380f6f313b216eb913d7 Text-content-sha1: 46f8cdd07bb5c8ee17059a9967101496b69d9d80 Content-length: 689 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNGw q yLx-html-body Fixed-in: 2003-01-15

    This is a code cleanup which we should probably do anyway.

    SGT, 2003-01-14: After much pain and upheaval, I think this is now as done as it'll ever be. The Unicode module was particularly unpleasant (and wants a substantial rewrite really), and there are a few remaining globals which are genuinely global (applying to all sessions) so I've left them in; but I think everything pertaining to a particular session is now non-global, at least in the portable parts of the code. (The Windows front end still has many static variables, but they will probably never go away.) Revision-number: 2597 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2003-01-14T19:09:24.000000Z K 7 svn:log V 15 const fallout. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 358bdb9c25c497c78bd34399c85789bc Text-delta-base-sha1: 73098cc052222b6ec4a3177198c4c08a2398b17f Text-content-length: 83 Text-content-md5: 44ba2e6e99790bb721370af5f04e22f8 Text-content-sha1: a082596c52f5303145ef65d6e82d5b7997266569 Content-length: 123 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN'2s(a!z/* $Id: mac.c,v 1.28 2003/01/14 19:09:24constconst Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3a284626a099184a0af972f0a80074e9 Text-delta-base-sha1: ff6ccbb62d7eb866c91993ab3072a5a8a55a4aa0 Text-content-length: 161 Text-content-md5: 1c4dd6cc9f42ce3855a8d7d5726b43fb Text-content-sha1: fb526b49ab7a975bb0ad72717e7c34a2e332cff5 Content-length: 200 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNe4b8,cK7\Q$,sO$A!da/* $Id: macstore.c,v 1.8 2003/01/14 19:09:24constconst *key, char const *constconstconstconstconst Revision-number: 2598 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2003-01-14T19:29:18.000000Z K 7 svn:log V 140 Add constants to mac_res.r to set the binary version number. Mention this in CHECKLST as a location where the version number has to be set. K 10 svn:author V 3 ben PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2b2c5ae4b3e0780d03976b31e501e15a Text-delta-base-sha1: 9e2389d73caad1b57beaf589a915af18130b1b31 Text-content-length: 226 Text-content-md5: a8cbcd29c2b0f0b7501145c7f9d92657 Text-content-sha1: d6b854946510fdfd428ef0a34b6bd007864b7859 Content-length: 265 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNav JsJ9(The Windows installer script: - putty/putty.iss The Mac resource file (used to generate the binary bit of the 'vers' resources -- the strings are supplied by the usual means): - putty/mac/mac_res.r Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aeb25fa365934e28c15b84d309b39121 Text-delta-base-sha1: 4ccb836dd15a2130f6c56954f0d69b5bd996941f Text-content-length: 247 Text-content-md5: e08b3ffa6fd0985f215f34016298bdb5 Text-content-sha1: 97ecbede4475ea324c5e499a9b1b355167cd6ff6 Content-length: 287 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNQeLL,hxp2rrA/* $Id: mac_res.r,v 1.13 2003/01/14 19:29:18Current PuTTY version number. Minor is in BCD */ #define VERSION_MAJOR 0x00 #define VERSION_MINOR 0x53VERSION_MAJOR, VERSION_MINORVERSION_MAJOR, VERSION_MINOR Revision-number: 2599 Prop-content-length: 155 Content-length: 155 K 7 svn:log V 57 Update the "known bugs" and "missing features" sections. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-14T19:41:19.000000Z PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 793b184fb420acc8f31adc611f480a9e Text-delta-base-sha1: c58e1becc125139a63be1a67876267344d7d016d Text-content-length: 482 Text-content-md5: d704e175c1977904c1d36e88ce0d5874 Text-content-sha1: b2f22519e6f5e7bdd6e591c93e90c3f809ea4323 Content-length: 522 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNuON)$$Id: README.mac,v 1.10 2003/01/14 19:41:19 * init_ucs() gets unitab_xterm completely wrong. Unimplemented features: * TCP urgent data. * Clipping host resize requests to screen size. * Changing font size in reponse to resize requests. * TEXT copy/paste. * Catching up with current keyboard mapping in other ports. * Saving sessions. * Session configuration. * 'TMPL' for 'Int ' resources (copied into saved sessions). Local Variables: mode: text End: Revision-number: 2600 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2003-01-14T19:42:00.000000Z K 7 svn:log V 37 Update for Unicode deglobalisations. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 44ba2e6e99790bb721370af5f04e22f8 Text-delta-base-sha1: a082596c52f5303145ef65d6e82d5b7997266569 Text-content-length: 63 Text-content-md5: 3c3f8681e4c1523ed3bf93ec1623eb67 Text-content-sha1: ca51145240357b482d9cada6c67144941ef90d36 Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN' ((RU/* $Id: mac.c,v 1.29 2003/01/14 19:42:00 Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d2d41e8d2be2883ece7a05c2179d9a7 Text-delta-base-sha1: d375d1256a45488eb9bae1fbda01835e31e7d63b Text-content-length: 91 Text-content-md5: da36c4f7bbb0d346cf4e3560a72b90a4 Text-content-sha1: 14a59a5d216b89548d668c76b1a440a0d6d40d8c Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNi'@5$3[ /* Unicode stuff */ struct unicode_data ucsdataSession * Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a6659fd1062663f9db221fab588fccf Text-delta-base-sha1: d253afdb48470f8cb6f3b13840da013240781c80 Text-content-length: 98 Text-content-md5: 8cc2ba0251db4f9cb8325060b52328df Text-content-sha1: c2ddf8e201e3d5e5b19698e6d556fdbfd120d30f Content-length: 138 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN0NCO,=v1/* $Id: macterm.c,v 1.49 2003/01/14 19:42:00init_ucs(s);&s->ucsdata Node-path: putty/mac/macucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d72bfb903bb05b87624945bd81b7768b Text-delta-base-sha1: a3d574c6333e3513d32ca8cecb5b3907cd176a94 Text-content-length: 395 Text-content-md5: 0719eca77923afcb607fe51785ea2e88 Text-content-sha1: da6af793f9e48997fb02368a866ec3d6dfa28cef Content-length: 434 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN?&k-*{Wd/* $Id: macucs.c,v 1.4 2003/01/14 19:42:00, struct unicode_data *ucsdataSession *s) { int i; s->ucsdata.unitab_ctrl[i] = i; else s->ucsdata.unitab_ctrl[i] = 0xFF; for (i = 0; i < 256; i++) { s->ucsdata.unitab_line[i] = s->ucsdata.unitab_scoacs[i] = i; s->ucsdata.unitab_xterm[i] = (i >= 0x5F && i < 0x7F) ? ((i+1) & 0x1F) : i; } } Revision-number: 2601 Prop-content-length: 296 Content-length: 296 K 8 svn:date V 27 2003-01-14T19:57:36.000000Z K 7 svn:log V 197 Use the standard linedraw->Unicode mapping from unicode.c to generate unitab_xterm. Most linedraw characters display correctly, but it's clear that RDB and Apple disagree on some of the mappings. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0719eca77923afcb607fe51785ea2e88 Text-delta-base-sha1: da6af793f9e48997fb02368a866ec3d6dfa28cef Text-content-length: 896 Text-content-md5: 8986fe6f9921d544c536e048d4f80159 Text-content-sha1: 930b94795cd388d71f157f88b551a020e4dc6e3a Content-length: 935 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN&Hd>*Y&fa/* $Id: macucs.c,v 1.5 2003/01/14 19:57:36/* Character conversion array, * the xterm one has the four scanlines that have no unicode 2.0 * equivalents mapped to their unicode 3.0 locations. */ static const wchar_t unitab_xterm_std[32] = { 0x2666, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x23ba, 0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, 0x2534, 0x252c, 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x00b7, 0x0020 }; s->ucsdata.unitab_line[i] = s->ucsdata.unitab_scoacs[i] = i; /* VT100 graphics - NB: Broken for non-ascii CP's */ memcpy(s->ucsdata.unitab_xterm, s->ucsdata.unitab_line, sizeof(s->ucsdata.unitab_xterm)); memcpy(s->ucsdata.unitab_xterm + '`', unitab_xterm_std, sizeof(unitab_xterm_std)); s->ucsdata.unitab_xterm['_'] = ' '; } Revision-number: 2602 Prop-content-length: 200 Content-length: 200 K 8 svn:date V 27 2003-01-14T21:30:25.000000Z K 7 svn:log V 101 Remove a couple of "we have not got around to this"es which we have, at least partly, got around to. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/keys.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4017414421b089db2f2adb9786ab9ce5 Text-delta-base-sha1: 572d1a3f664a388468dc57cdd5ea5988c3405784 Text-content-length: 25 Text-content-md5: 7dc29e650f7b1e1f464d07e82872bebf Text-content-sha1: 295bc6da39f908edfa3f0bdee935d17439c1a436 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNM3V7 Revision-number: 2603 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2003-01-14T21:39:00.000000Z K 7 svn:log V 43 Add a couple of recently-reported mirrors. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 73688cc360bf552c893d23680c363e6b Text-delta-base-sha1: 5c13bef8081f7ea9ad1b8fb3aabda24821600bc3 Text-content-length: 176 Text-content-md5: 555e1c5bbcd3b7c7c29a3f4d04386a08 Text-content-sha1: d069b9a1e28dc2a92c7c0971bc6fc6d598428351 Content-length: 215 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNF3}V3^pVwww.formatc.net.pl in 213.247.171.215/mirrors/putty/">213.247.171.215 in Russia Revision-number: 2604 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 34 Summary: Support for more colours K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-14T23:10:54.000000Z PROPS-END Node-path: putty-wishlist/data/256-colours Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 659 Text-content-md5: 620ac0ca77b43b5e3068acf4ec41d0dd Text-content-sha1: 6e7750a62f82b2a4978dac941a126e64416705bb Content-length: 775 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: Support for more colours Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body

    It's been suggested that PuTTY could usefully support xterm's 256-colour mode. This would involve having rather more storage for character attributes than at present, which in the present (0.53) design of PuTTY would mean using 64 bits to store each character of scrollback, which is slightly ludicrous. When we get around to redesigning the scrollback format so as not to use so much memory, adding more attribute bits might become feasible.

    <1042233614.1153.15.camel@evilmagic.org> contains a patch to implement this. Revision-number: 2605 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2003-01-14T23:16:39.000000Z K 7 svn:log V 52 Summary: Command-line option to set local X display K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/cmdline-x-display Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 576 Text-content-md5: e90b121a8d8273f50c79bf518232e799 Text-content-sha1: 46118f417f83cfc984fbaaa65f7336f5c45fc2be Content-length: 692 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN222Summary: Command-line option to set local X display Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body

    PuTTY should probably have a command-line option to set the local X display, so that people who run PuTTY on multi-user machines can get the right one. Of course, if there's some better way to find the user's X display in Windows, we should support that too.

    cmdline-any-option might make this unnecessary.

    Ref: <476F91F7CFDBD41182E000D0B7E7E6930304A958@U9JM7.mgb01.telekom.de> Revision-number: 2606 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2003-01-15T14:51:54.000000Z K 7 svn:log V 82 Use set_icon and set_title rather than SetWindowText. Should fix inactive-title. K 10 svn:author V 4 owen PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 690e134eb325397943a5a1d1c75009d5 Text-delta-base-sha1: e956a417c2363dc0117d92ad667e8c044d3c315c Text-content-length: 227 Text-content-md5: 730ac252b383dfc2f3f21568f1804a82 Text-content-sha1: 1390de5af694eeee639a6ade4175ad14710ac865 Content-length: 268 K 15 cvs2svn:cvs-rev V 5 1.231 PROPS-END SVNj[mmNlset_icon(NULL, "PuTTY (inactive)"); set_title(NULLset_icon(NULL, "PuTTY (inactive)"); set_title(NULLz@FFz void set_icon(void *frontend, char *title) { sfree(icon_name); Revision-number: 2607 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 61 Use set_icon and set_title in window.c fixes inactive-title. K 10 svn:author V 4 owen K 8 svn:date V 27 2003-01-15T14:54:22.000000Z PROPS-END Node-path: putty-wishlist/data/inactive-title Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 85cdd4fe88220941286dd31bf24f81b4 Text-delta-base-sha1: 0332bbb21ecee7de1d40d6fb640c3cb165a83093 Text-content-length: 39 Text-content-md5: 2c8a5a6b553b8eec1f84b45f17f5efed Text-content-sha1: e5d2d00e520aeb7cc50a2486bfc47b23a2750fb9 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNpf eFixed-in: 2003-01-15 Revision-number: 2608 Prop-content-length: 272 Content-length: 272 K 8 svn:date V 27 2003-01-15T15:22:58.000000Z K 7 svn:log V 171 `ssh-default': change the /DSSH_DEFAULT flag to a /DTELNET_DEFAULT one and note its existence in Recipe. As far as I can tell there are no documentation changes required. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7989ca8604c71bbf423480a6745d08e7 Text-delta-base-sha1: d74c9c58b58414996c2c5c336d560771597a9940 Text-content-length: 205 Text-content-md5: ed379ecdc90cb7dcfd0a4b46d47f1ae5 Text-content-sha1: b3f5b61a129407d24c257efd8c3ea8ba969e2737 Content-length: 245 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNk2 55kTELNET_DEFAULT # Causes PuTTY to default to the Telnet protocol (in the absence # of Default Settings and so on to the contrary). Normally PuTTY # will default to SSH Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1d8c2f0dea7f9a385d3f5db692ece31b Text-delta-base-sha1: b19c95e253551bef478f5ee767a60cadc2930ae0 Text-content-length: 117 Text-content-md5: 3f8e4b72ddc8d2701c3b3ab11f9b6478 Text-content-sha1: 7915a99617264399b59a14d93974967def197ad2 Content-length: 158 K 15 cvs2svn:cvs-rev V 5 1.190 PROPS-END SVN;e ]V]2 TELNET_DEFAULT to have telnet by default * (otherwise SSH is the default). */ #ifdef TELNET Revision-number: 2609 Prop-content-length: 179 Content-length: 179 K 7 svn:log V 79 Should be fixed tomorrow (although PuTTY isn't building for me at the moment). K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-15T15:23:47.000000Z PROPS-END Node-path: putty-wishlist/data/ssh-default Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 84ca31570f16c65b7c03a1827ef86a01 Text-delta-base-sha1: 3c929b479953aaad26ccae04e7390acbbc430f83 Text-content-length: 39 Text-content-md5: 2a7fdb72d9c723ba2549333248f08e00 Text-content-sha1: a4a4be2e4dfc4667e8e0e603f627e5c2af02240b Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNH]gbfFixed-in: 2003-01-16 Revision-number: 2610 Prop-content-length: 164 Content-length: 164 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-15T16:16:36.000000Z K 7 svn:log V 64 Fix small breakages as a result of yesterday's upheavals. Oops. PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9fb1e518cfd718e70ee7dd9f0ef0fc75 Text-delta-base-sha1: 01bbfe0b40d3f5d5640c6fa231d7c0ab29902ffa Text-content-length: 120 Text-content-md5: d5d6b6c66eaca77b0ba7087d199bcb0c Text-content-sha1: 84651b41af4842874ebd9e9e7d82976c96d914ec Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNfx ^^ Z_internal(toupper(first), toupper(second), 1); if (nc == -1) nc = check_compose_internal Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d360751faad83cdb935a1f4dd874b428 Text-delta-base-sha1: add6e24793bcb324ca58624b5de50acc37fa4470 Text-content-length: 94 Text-content-md5: 128bd1ebc334e063a1be6fcadafb3a2f Text-content-sha1: caafd19543c777a30d9c48aa8c356b88530c61d0 Content-length: 134 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN}MEMstruct unicode_data; void init_ucs(Config *, struct unicode_data *); #endif Revision-number: 2611 Prop-content-length: 192 Content-length: 192 K 8 svn:date V 27 2003-01-15T18:45:42.000000Z K 7 svn:log V 94 PuTTYtel should use be_nossh, not be_none. While we're here, also comment the meaning of [M]. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ed379ecdc90cb7dcfd0a4b46d47f1ae5 Text-delta-base-sha1: b3f5b61a129407d24c257efd8c3ea8ba969e2737 Text-content-length: 48 Text-content-md5: 3c5cc51b5d4c7f1068c42756f3b4e8d0 Text-content-sha1: cf68fff8b6c4638669250810b3a56681f36e4f35 Content-length: 88 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN2J{JwoC, [M] for Macintoshssh Revision-number: 2612 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2003-01-15T18:47:41.000000Z K 7 svn:log V 90 MacTCP returns canonical names with a trailing dot. We don't want this, so strip it off. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7eb18714fe1acbdef232a089d3f50052 Text-delta-base-sha1: 47699fd29d283864f269ae1c012c6191a325e43c Text-content-length: 256 Text-content-md5: 5bac120842ccd2dbe5c66f37ac7d35af Text-content-sha1: 024a17fef42d46e63370cd18b86a988297e46f21 Content-length: 296 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNW`wFuMw` int realhostlen { realhost = ret->hostinfo.cname; /* MacTCP puts trailing dots on canonical names. */ realhostlen = strlen(realhost); if (realhost[realhostlen - 1] == '.') realhost[realhostlen - 1] = '\0'; } Revision-number: 2613 Prop-content-length: 460 Content-length: 460 K 8 svn:date V 27 2003-01-15T20:47:50.000000Z K 7 svn:log V 359 Implement Simon's suggestion of moving DEFAULT_PROTOCOL into a per-backend- link-module const variable `be_default_protocol' which suggests a sensible default to the front end (which can ignore it). (DEFAULT_PORT is replaced by a lookup in the backend[] table.) Still not pretty, but it does mean that the recent fix for `ssh-default' doesn't break PuTTYtel. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/be_all.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e53e3ed809f829161057e8d5792f5eb1 Text-delta-base-sha1: bc5cf52b4bec9facc62ae4fb46edbfa30c1e566e Text-content-length: 142 Text-content-md5: 8abaa27ccf99cf4256de2a7f9118e761 Text-content-sha1: 813afb6a6cb157134990a3f21a49efa7003b941e Content-length: 181 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN[V yy\#ifdef TELNET_DEFAULT const int be_default_protocol = PROT_TELNET; #else const int be_default_protocol = PROT_SSH; #endif Node-path: putty/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d1cdbb902dae96636f4f2446ef16d47d Text-delta-base-sha1: d5960676a502f4bccf378e0fbd17e73d8b2adda3 Text-content-length: 65 Text-content-md5: a671e8d58c70914915d66065fe87dabb Text-content-sha1: dc3cf9c2060101eb12629e4b068cd0975bd1f388 Content-length: 104 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNM , const int be_default_protocol = PROT_TELNET; Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3c3f8681e4c1523ed3bf93ec1623eb67 Text-delta-base-sha1: ca51145240357b482d9cada6c67144941ef90d36 Text-content-length: 359 Text-content-md5: 842fdb6de410eb00c41cda248f186357 Text-content-sha1: 56899c99d2c8d38dce220275b5eb1273ad30c722 Content-length: 399 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN LL,m*/* $Id: mac.c,v 1.30 2003/01/15 20:47:50 jacobbe_default_protocol; /* Find the appropriate default port. */ { default_port = 0; /* illegal */ int i; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == default_protocol) { default_port = backends[i].backend->default_port; break; } } Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3f8e4b72ddc8d2701c3b3ab11f9b6478 Text-delta-base-sha1: 7915a99617264399b59a14d93974967def197ad2 Text-content-length: 184 Text-content-md5: a4dbf9e12fb14168d4f30ade9d583a1a Text-content-sha1: c61fa5469ba279b400ee6de59433ca28a6b3954a Content-length: 225 K 15 cvs2svn:cvs-rev V 5 1.191 PROPS-END SVNey~D{G/* * Suggested default protocol provided by the backend link module. * The application is free to ignore this. */ extern const int be_default_protocol Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 730ac252b383dfc2f3f21568f1804a82 Text-delta-base-sha1: 1390de5af694eeee639a6ade4175ad14710ac865 Text-content-length: 582 Text-content-md5: d885b5c536ebd12f958d622f283b8a47 Text-content-sha1: 50f1f5dad05c2691654c0c7585c400d9b052580d Content-length: 623 K 15 cvs2svn:cvs-rev V 5 1.232 PROPS-END SVN ##GEbe_default_protocol; /* Find the appropriate default port. */ { default_port = 0; /* illegal */ int i; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == default_protocol) { default_port = backends[i].backend->default_port; break; } }@4tt@_paste(term); } void set_title(void *frontend, char *title) { sfree(window_name); window_name = smalloc(1 + strlen(title)); strcpy(window_name, title); if (cfg.win_name_always || !IsIconic(hwnd)) SetWindowText(hwnd, title); } Revision-number: 2614 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2003-01-15T22:37:58.000000Z K 7 svn:log V 25 Make this compile again. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 842fdb6de410eb00c41cda248f186357 Text-delta-base-sha1: 56899c99d2c8d38dce220275b5eb1273ad30c722 Text-content-length: 107 Text-content-md5: ea4b9c67c535b891725849b0f17acb8f Text-content-sha1: f6cfad688a75310613c8726acf8462faa6ac54fb Content-length: 147 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN S.j/* $Id: mac.c,v 1.31 2003/01/15 22:37:58 benint i; default_port = 0; /* illegal */ Revision-number: 2615 Prop-content-length: 374 Content-length: 374 K 8 svn:date V 27 2003-01-15T23:30:21.000000Z K 7 svn:log V 275 Add the ability to close sessions. This adds *_free() functions to most areas of the code. Not all back-ends have been tested, but Telnet and SSH behave reasonably. Incidentally, almost all of this patch was written through Mac PuTTY, admittedly over a Telnet connection. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f4c19737785d111cffe826c7ece67da3 Text-delta-base-sha1: ff9255a158e4527b50bbf8e75bc32e1ce7814304 Text-content-length: 260 Text-content-md5: cd23104a33c63c6a34039ddd0537d852 Text-content-sha1: 00e4ff026ba9da6100e55977dafda077bc077a2c Content-length: 300 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN# l7l|'free(void *handle) { Ldisc ldisc = (Ldisc) handle; if (ldisc->term) ldisc->term->ldisc = NULL; if (ldisc->back) ldisc->back->provide_ldisc(ldisc->backhandle, NULL); if (ldisc->buf) sfree(ldisc->buf); sfree(ldisc) Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5ce9e6cca01fa342ecb9ecb3d5865aa6 Text-delta-base-sha1: a850d1077e64d62a3c0aafd4b0231cd2ed76d0a6 Text-content-length: 136 Text-content-md5: 6b914a9af7715dae17517f593d19cf32 Text-content-sha1: e4ce6e12ca793960718ba887026c82dc1b790849 Content-length: 176 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN.. r#rfree(void *handle) { struct LogContext *ctx = (struct LogContext *)handle; logfclose(ctx); sfree(ctx) Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ea4b9c67c535b891725849b0f17acb8f Text-delta-base-sha1: f6cfad688a75310613c8726acf8462faa6ac54fb Text-content-length: 223 Text-content-md5: 57596ca7470fca3a710bbbf52cabac92 Text-content-sha1: ae39b44becc42f13672bec8674ff0d4aed2d47a2 Content-length: 263 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNN D1(Y*/* $Id: mac.c,v 1.32 2003/01/15 23:30:21mac_closeterm(window); break; case wAbout: windows.about = NULL; DisposeDialog(window); break; case wLicence: windows.licence = NULL; Disp Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: da36c4f7bbb0d346cf4e3560a72b90a4 Text-delta-base-sha1: 14a59a5d216b89548d668c76b1a440a0d6d40d8c Text-content-length: 56 Text-content-md5: 6a7159eac84ecde41312334fbf3e3bb4 Text-content-sha1: 2cb56191fc64a1de88afa7a2322bd74a0a188c1a Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN'M #  extern void mac_closeterm(WindowPtr Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8cc2ba0251db4f9cb8325060b52328df Text-delta-base-sha1: c2ddf8e201e3d5e5b19698e6d556fdbfd120d30f Text-content-length: 534 Text-content-md5: 8bd5092c290b89d060f6540bf83577e7 Text-content-sha1: 1ddb63043b48712b8c18c74e614643c67ba25c46 Content-length: 574 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNNrt,|-=4/* $Id: macterm.c,v 1.50 2003/01/15 23:30:21&sesslistcloseterm(WindowPtr window) { Session *s = (Session *)GetWRefCon(window); /* XXX warn on close */ HideWindow(s->window); *s->prev = s->next; s->next->prev = s->prev; ldisc_free(s->ldisc); s->back->free(s->backhandle); log_free(s->logctx); if (s->uni_to_font != NULL) DisposeUnicodeToTextInfo(&s->uni_to_font); term_free(s->term); DisposeWindow(s->window); DisposePalette(s->palette); sfree(s Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a4dbf9e12fb14168d4f30ade9d583a1a Text-delta-base-sha1: c61fa5469ba279b400ee6de59433ca28a6b3954a Text-content-length: 104 Text-content-md5: d5a36a8aa9ba604bf563adf9d0c7bd70 Text-content-sha1: 19763a348cfa6d46d9217bf71be5d08386734a30 Content-length: 145 K 15 cvs2svn:cvs-rev V 5 1.192 PROPS-END SVNyl=v |_void (*free) (void *handlefree(Terminalfree(void *logctxfree( Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 38cddb5d4c3529ec2a08e761de955944 Text-delta-base-sha1: 7095cd9f37b2fef13c12853bc87500d4eaf6fde2 Text-content-length: 147 Text-content-md5: 0dcfdf89a6bfda17a9ca615cbd644f76 Text-content-sha1: f21195bd0d69b82318ca7aace2f73a061b72a9c8 Content-length: 187 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVNV\wMs6Hbtstatic void raw_free(void *handle) { Raw raw = (Raw) handle; if (raw->s) sk_close(raw->s); sfree(raw)free Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d2d8182d206fe9f04617f5d88e520835 Text-delta-base-sha1: c43d26a581699a4a6eef76fa8ca873a8c901b9e7 Text-content-length: 170 Text-content-md5: 1ab021cd5fe1f434a068021f06a5ce59 Text-content-sha1: b4ffb3eba1f3c99336d07dfa6cf73c2aa8c2b910 Content-length: 210 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN,J ;}6&static void rlogin_free(void *handle) { Rlogin rlogin = (Rlogin) handle; if (rlogin->s) sk_close(rlogin->s); sfree(rlogin)free Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6660e42228da3ab282a85b4b4c833a70 Text-delta-base-sha1: 10dff3188d847bb5f1d60e2dc962b3d54aa268fc Text-content-length: 1547 Text-content-md5: f3c836440e95216217406ecf86374ba5 Text-content-sha1: afcf87bedaa2e94cf7f6d4c967ef7c0065233b4f Content-length: 1588 K 15 cvs2svn:cvs-rev V 5 1.266 PROPS-END SVNr#,A>{<*+ESw7BPj ssh->kex_ctx = NULLchannels = NULL; ssh->rportfwds = NULLstatic void ssh_free(void *handle) { Ssh ssh = (Ssh) handle; struct ssh_channel *c; struct ssh_rportfwd *pf; if (ssh->v1_cipher_ctx) ssh->cipher->free_context(ssh->v1_cipher_ctx);if (ssh->sc_cipher_ctx) ssh->sccipher->free_context(ssh->sc_cipher_ctx); if (ssh->cs_mac_ctx) ssh->csmac->free_context(ssh->cs_mac_ctx); if (ssh->sc_mac_ctx) ssh->scmac->free_context(ssh->sc_mac_ctx); if (ssh->cs_comp_ctx) ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx); if (ssh->sc_comp_ctx) ssh->sccomp->compress_cleanup(ssh->sc_comp_ctx); if (ssh->kex_ctx) dh_cleanup(ssh->kex_ctx); sfree(ssh->savedhost); if (ssh->channels) { while ((c = delpos234(ssh->channels, 0)) != NULL) { switch (c->type) { case CHAN_X11: if (c->u.x11.s != NULL) x11_close(c->u.x11.s); break; case CHAN_SOCKDATA: if (c->u.pfd.s != NULL) pfd_close(c->u.pfd.s); break; } sfree(c); } freetree234(ssh->channels); } if (ssh->rportfwds) { while ((pf = delpos234(ssh->rportfwds, 0)) != NULL) sfree(pf); freetree234(ssh->rportfwds); } sfree(ssh->deferred_send_data); if (ssh->x11auth) x11_free_auth(ssh->x11auth); sfree(ssh->do_ssh_init_state); sfree(ssh->do_ssh1_login_state); sfree(ssh->do_ssh2_transport_state); sfree(ssh->do_ssh2_authconn_state); if (ssh->s) sk_close(ssh->s); sfree(ssh)free Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ca6ac972df0ac5f1ccebd766a858851 Text-delta-base-sha1: 93c690c9441af579e2e87afcb2cc8bb461e3fa3a Text-content-length: 37 Text-content-md5: bf89cba14d64d9bd636bb5c79ed6efaf Text-content-sha1: 50c8da8b33e5e8bf03a317b285c18704c3a77fe7 Content-length: 77 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVN: 0zfree_auth(void * Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d1394ebd39c763259d8d128332c10967 Text-delta-base-sha1: 510cc71754c27f971cb6f237a357ab64869e3fe0 Text-content-length: 205 Text-content-md5: 0460c06ff70985846c7cf3c982d5e9f2 Text-content-sha1: a22a323d59fc473e9fbc0f58822170fd900763d5 Content-length: 245 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNR *&<Kstatic void telnet_free(void *handle) { Telnet telnet = (Telnet) handle; sfree(telnet->sb_buf); if (telnet->s) sk_close(telnet->s); sfree(telnet); }free Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 193f0cd74390c8cf641cf35207422724 Text-delta-base-sha1: c9bdc5e8640c7d6ba6cbf9580555c9cdb6f2d2ad Text-content-length: 1483 Text-content-md5: f1320ca9bfeea30bf838f437f99e4595 Text-content-sha1: 988b4631dc08cab416839f8cf036b748cfdf043d Content-length: 1524 K 15 cvs2svn:cvs-rev V 5 1.130 PROPS-END SVN MtM?ovoid term_free(Terminal *term) { unsigned long *line; struct beeptime *beep; while ((line = delpos234(term->scrollback, 0)) != NULL) sfree(line); freetree234(term->scrollback); while ((line = delpos234(term->screen, 0)) != NULL) sfree(line); freetree234(term->screen); while ((line = delpos234(term->alt_screen, 0)) != NULL) sfree(line); freetree234(term->alt_screen); sfree(term->disptext); while (term->beephead) { beep = term->beephead; term->beephead = beep->next; sfree(beep); } bufchain_clear(&term->inbuf); if(term->print_job) printer_finish_job(term->print_job); bufchain_clear(&term->printer_buf); sfree(term->paste_buffer); sfree(term)?RR?ble width space. :-( */ if (term->ucsdata->dbcs_screenfont && term->ucsdata->font_codepage == term->ucsdata->line_codepage) return (uc != ' '); if (uc < 0x80) return term->wordness[uc]; for (wptr = ucs_words; wptr->start; wptr++) { if (uc >= wptr->start && uc <= wptr->end) return wptr->ctype; } return 2; } /* * Spread the selection outwards according to the selection mode. */ static pos sel_spread_half(Terminal *term, pos p, int dir) { unsigned long *ldata; short wvalue; int topy = -count234(term->scrollback); ldata = lineptr(p.y); switch (term->selmode) { case SM_CHAR: /* * In this mode, every character is a separate unit, except * for runs Node-path: putty/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 37920cde9fcd2a7f75da2b9959e6af11 Text-delta-base-sha1: 8e838606b26b9d30c3d3dbb92c814fa9283accf0 Text-content-length: 222 Text-content-md5: c1b3af8164e7c2bfa01d6acf9961197f Text-content-sha1: 15fecb2e58d4bd4e49acf26cc4b0798df149fbed Content-length: 261 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNt/4 ,G8kxJaQ_/* $Id: testback.c,v 1.6 2003/01/15 23:30:21free(void *); static void loop_free(void *freeloop_freefree(void *handle) { } static void loop_free(void *handle) { sfree(handle) Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2bd868e282b55a9d74ebfaa43e38b070 Text-delta-base-sha1: fd0d4cad32646f96b493c3f1950642c0f6f0203e Text-content-length: 70 Text-content-md5: 9301776bf82c11bc3a1a341f5ca6448e Text-content-sha1: c6b29f507f05e9a7b633af7aa56022cdc501fa7b Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNr( 1~yyvoid x11_free_auth(void *auth) { sfree(auth) Revision-number: 2616 Prop-content-length: 255 Content-length: 255 K 7 svn:log V 156 "I don't think that bit means what I think it means", if you see what I mean. In other words, turn off the useTextEditServices bit in our 'SIZE' resource. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-15T23:46:11.000000Z PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e08b3ffa6fd0985f215f34016298bdb5 Text-delta-base-sha1: 97ecbede4475ea324c5e499a9b1b355167cd6ff6 Text-content-length: 73 Text-content-md5: c3e4837dd8ad3efd1fed8db310d072ad Text-content-sha1: 08622f4fbd70dc998085e4bf15f503181c4f3fa1 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNei 1/, \/* $Id: mac_res.r,v 1.14 2003/01/15 23:46:11dontU Revision-number: 2617 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 52 Add some icons for saved sessions and random seeds. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-16T00:35:11.000000Z PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c3e4837dd8ad3efd1fed8db310d072ad Text-delta-base-sha1: 08622f4fbd70dc998085e4bf15f503181c4f3fa1 Text-content-length: 10068 Text-content-md5: d5c6baeb63711a578ac64400d9f9927f Text-content-sha1: 815bfc510ccbe2fb5ed4300ac43025b74290ef0a Content-length: 10108 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNipI}\)wrYT$ p fck e;czg![/* $Id: mac_res.r,v 1.15 2003/01/16 00:35FREF' (131, purgeable) { /* Random seed */ 'Rand', 131, 131, 131 }, 'FREF', { 128, 128, 129, 129, 130, 130, 131, 131Saved-session icon */ resource 'ICN#' (129) { { /* array: 2 elements */ /* [1] */ $"1FFFFC00 10000600 10200500 103FFC80" $"10200440 10000420 17AAAFF0 12000510" $"12201A10 12002510 12204810 12019510" $"12222210 12047FD0 12380290 12200D90" $"123F1090 12022190 1224C090 12090190" $"12128090 122C4190 12504090 177555D0" $"10000010 10400110 107FFF10 10400110" $"10000010 1000001resource 'icl4' (129) { $"000FFFFFFFFFFFFFFFFFFF0000000000" $"000F0C0C0C0C0C0C0C0C0FF000000000" $"000FC0C0C0F0C0C0C0C0CFCF00000000" $"000F0C0C0CFFFFFFFFFFFFCCF0000000" $"000FC0C0C0F0C0C0C0C0CFCCCF000000" $"000F0C0C0CDC0C0C0C0C0FCCCCF00000" $"000FCFFFDDDDDDDDDDDDDFFFFFFF0000" $"000F0CFC0CDC0C0C0C0C0F1F0C0F0000" $"000FC0F0C0D0C0C0C0CFF1FDC0CF0000" $"000F0CFC0CDC0C0C0CF11F0D0C0F0000" $"000FC0F0C0D0C0C0CF11F0CDC0CF0000" $"000F0CFC0CDC0C0FF11F0F0D0C0F0000" $"000FC0F0C0D0C0F111F0C0FDC0CF0000" $"000F0CFC0CDC0F111FFFFFFFFF0F0000" $"000FC0F0C0DFF111111111FDF0CF0000" $"000F0CFC0CF111111111FF0DFC0F0000" $"000FC0F0C0DFFFFF111FC0CDF0CF0000" $"000F0CFC0CDC0CF111FC0C0DFC0F0000" $"000FC0F0C0C0CF11FFC0C0CDF0CF0000" $"000F0CFC0C0CF11F0C0C0C0DFC0F0000" $"000FC0F0C0CF11F0F0C0C0CDF0CF0000" $"000F0CFC0CF1FF0C0F0C0C0DFC0F0000" $"000FC0F0CF1FC0C0CEC0C0CDF0CF0000" $"000F0FFFDFFDDDDDDEDDDDDFFF0F0000" $"000FC0C0CDC0C0C0C0C0C0CDC0CF0000" $"000F0C0C0F0C0C0C0C0C0C0F0C0F0000" $"000FC0C0CFFFFFFFFFFFFFFFC0CF0000" $"000F0C0C0F0C0C0C0C0C0C0F0C0F0000" $"000FC0C0C0C0C0C0C0C0C0C0C0CF0000" $"000F0C0C0C0C0C0C0C0C0C0C0C29, purgeable) { $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000" $"000000FFF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5FFFF000000000000000000" $"000000FFF5F5F5F5F5F5FFF5F5F5F5F5F5F5F5F5F5FF2BFF0000000000000000" $"000000FFF5F5F5F5F5F5FFFFFFFFFFFFFFFFFFFFFFFF2B2BFF00000000000000" $"000000FFF5F5F5F5F5F5FFF5F5F5F5F5F5F5F5F5F5FF2B2B2BFF000000000000" $"000000FFF5F5F5F5F5F5F9F5F5F5F5F5F5F5F5F5F5FF2B2B2B2BFF0000000000" $"000000FFF5FFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9FFFFFFFFFFFFFF00000000" $"000000FFF5F5FFF5F5F5F9F5F5F5F5F5F5F5F5F5F5FF05FFF5F5F5FF00000000" $"000000FFF5F5FFF5F5F5F9F5F5F5F5F5F5F5F5FFFF05FFF9F5F5F5FF00000000" $"000000FFF5F5FFF5F5F5F9F5F5F5F5F5F5F5FF0505FFF5F9F5F5F5FF00000000" $"000000FFF5F5FFF5F5F5F9F5F5F5F5F5F5FF0505FFF5F5F9F5F5F5FF00000000" $"000000FFF5F5FFF5F5F5F9F5F5F5F5FFFF0505FFF5FFF5F9F5F5F5FF00000000" $"000000FFF5F5FFF5F5F5F9F5F5F5FF050505FFF5F5F5FFF9F5F5F5FF00000000" $"000000FFF5F5FFF5F5F5F9F5F5FF050505FFFFFFFFFFFFFFFFFFF5FF00000000" $"000000FFF5F5FFF5F5F5F9FFFF050505050505050505FFF9FFF5F5FF00000000" $"000000FFF5F5FFF5F5F5FF050505050505050505FFFFF5F9FFF5F5FF00000000" $"000000FFF5F5FFF5F5F5F9FFFFFFFFFF050505FFF5F5F5F9FFF5F5FF00000000" $"000000FFF5F5FFF5F5F5F9F5F5F5FF050505FFF5F5F5F5F9FFF5F5FF00000000" $"000000FFF5F5FFF5F5F5F5F5F5FF0505FFFFF5F5F5F5F5F9FFF5F5FF00000000" $"000000FFF5F5FFF5F5F5F5F5FF0505FFF5F5F5F5F5F5F5F9FFF5F5FF00000000" $"000000FFF5F5FFF5F5F5F5FF0505FFF5FFF5F5F5F5F5F5F9FFF5F5FF00000000" $"000000FFF5F5FFF5F5F5FF05FFFFF5F5F5FCF5F5F5F5F5F9FFF5F5FF00000000" $"000000FFF5F5FFF5F5FF05FFF5F5F5F5F5FCF5F5F5F5F5F9FFF5F5FF00000000" $"000000FFF5FFFFFFF9FFFFF9F9F9F9F9F9FCF9F9F9F9F9FFFFFFF5FF00000000" $"000000FFF5F5F5F5F5F9F5F5F5F5F5F5F5F5F5F5F5F5F5F9F5F5F5FF00000000" $"000000FFF5F5F5F5F5FFF5F5F5F5F5F5F5F5F5F5F5F5F5FFF5F5F5FF00000000" $"000000FFF5F5F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5FF00000000" $"000000FFF5F5F5F5F5FFF5F5F5F5F5F5F5F5F5F5F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }; resource 'ics#' (129, purgeable) { { /* array: 2 elements */ /* [1] */ $"7FE0 4030 4028 403C 5AB4 50D4 5334 5444" $"5234 54C4 5B14 5544 4814 4FF4 4004 7FFC", /* [2] */ $"7FE0 7FF0 7FF8 7FFC 7FFC 7FFC 7FFC 7FFC" $"7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC" } }; resource 'ics4' (129) { $"0FFFFFFFFFF00000" $"0F0C0C0C0CFF0000" $"0FC0C0C0C0FCF000" $"0F0C0C0C0CFFFF00" $"0FCFDDDDDDFFCF00" $"0F0F0C0CFF1F0F00" $"0FCFC0FF11FDCF00" $"0F0F0F111F0D0F00" $"0FCFC0F111FDCF00" $"0F0F0F11FF0D0F00" $"0FCFF1FFC0CDCF00" $"0F0FCFDDDDDD0F00" $"0FC0F0C0C0CFCF00" $"0F0CFFFFFFFF0F00" $"0FC0C0C0C0C0CF00" $"0FFFFFFFFFFFFF" }; resource 'ics8' (129) { $"00FFFFFFFFFFFFFFFFFFFF0000000000" $"00FFF5F5F5F5F5F5F5F5FFFF00000000" $"00FFF5F5F5F5F5F5F5F5FF2BFF000000" $"00FFF5F5F5F5F5F5F5F5FFFFFFFF0000" $"00FFF5FFF9F9F9F9F9F9FFFFF5FF0000" $"00FFF5FFF5F5F5F5FFFF05FFF5FF0000" $"00FFF5FFF5F5FFFF0505FFF9F5FF0000" $"00FFF5FFF5FF050505FFF5F9F5FF0000" $"00FFF5FFF5F5FF050505FFF9F5FF0000" $"00FFF5FFF5FF0505FFFFF5F9F5FF0000" $"00FFF5FFFF05FFFFF5F5F5F9F5FF0000" $"00FFF5FFF8FFF9F9F9F9F9F9F5FF0000" $"00FFF5F5FFF5F5F5F5F5F5FFF5FF0000" $"00FFF5F5FFFFFFFFFFFFFFFFF5FF0000" $"00FFF5F5F5F5F5F5F5F5F5F5F5FF0000" $"00FFFFFFFFFFFFFF/* Random seed icon */ resource 'ICN#' (131, purgeable) { { /* array: 2 elements */ /* [1] */ $"1FFFFC00 18F36600 161EF500 1CC92C80" $"1CF2EC40 10662C20 108E07F0 151F0490" $"1E00C4F0 1803BBD0 1FC5BE10 108B5A90" $"1B3C4F50 1267AC90 14B60470 1BB791B0" $"17F4D2B0 1DC1F830 1B029450 1B753DD0" $"145A8170 11390DD0 1E15A8B0 1CC4CD90" $"154ECED0 15C9CF30 172CDB50 12617970" $"15E45C90 1D4B9890 15CE443resource 'icl4' (131) { $"000FFFFFFFFFFFFFFFFFFF0000000000" $"000FFC0CFFFF0CFF1FFC0FF000000000" $"000F0FF0C0CFFFF1FFFFCFCF00000000" $"000FFF0CFF0CF11F0CFCFFCCF0000000" $"000FFFC0FFFF11F0FFF0FFCCCF000000" $"000F0C0C0FF11FFC0CFCFFCCCCF00000" $"000FC0C0F111FFF0C0C0CFFFFFFF0000" $"000F0F0F111FFFFF0C0C0F0CFC0F0000" $"000FFFF111111111FFC0CFC0FFFF0000" $"000FF111111111FFFCFFF0FFFF0F0000" $"000FFFFFFF111FCFF0FFFFF0C0CF0000" $"000F0C0CF111FCFF0F0FFCFCFC0F0000" $"000FF0FF11FFFFC0CFC0FFFFCFCF0000" $"000F0CF11FFC0FFFFCFCFF0CFC0F0000" $"000FCF11F0FFCFF0C0C0CFC0CFFF0000" $"000FF1FFFCFF0FFFFC0F0C0FFCFF0000" $"000F1FFFFFFFCFC0FFCFC0F0F0FF0000" $"000FFF0FFF0C0C0FFFFFFC0C0CFF0000" $"000FF0FFC0C0C0F0F0CF0FC0CFCF0000" $"000FFCFF0FFF0F0F0CFFFF0FFF0F0000" $"000FCFC0CF0FF0F0F0C0C0CFCFFF0000" $"000F0C0F0CFFFC0F0C0CFF0FFF0F0000" $"000FFFF0C0CFCFCFF0F0F0C0F0FF0000" $"000FFF0CFF0C0F0CFF0CFF0FFC0F0000" $"000FCFCF0FC0FFF0FFC0FFF0FFCF0000" $"000F0F0FFF0CFC0FFF0CFFFF0CFF0000" $"000FCFFFC0F0FFC0FFCFF0FFCFCF0000" $"000F0CFC0FFC0C0F0FFFFC0F0FFF0000" $"000FCFCFFFF0CFC0CFCFFFC0F0CF0000" $"000FFF0F0F0CF0FFFC0FFC0CFC0F0000" $"000FCFCFFFC0FFF0CFC0CFC0C0FF0000" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" }; resource 'icl8' (131) { $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000" $"000000FFFFF5F5F5FFFFFFFFF5F5FFFF05FFFFF5F5FFFF000000000000000000" $"000000FFF5FFFFF5F5F5F5FFFFFFFF05FFFFFFFFF5FF2BFF0000000000000000" $"000000FFFFFFF5F5FFFFF5F5FF0505FF0000FFF5FFFF2B2BFF00000000000000" $"000000FFFFFFF5F5FFFFFFFF0505FFF5FFFFFFF5FFFF2B2B2BFF000000000000" $"000000FFF5F5F5F5F5FFFF0505FFFFF5F5F5FFF5FFFF2B2B2B2BFF0000000000" $"000000FFF5F5F5F5FF050505FFFFFFF5F5F5F5F5F5FFFFFFFFFFFFFF00000000" $"000000FFF5FFF5FF050505FFFFFFFFFFF5F5F5F5F5FFF5F5FFF5F5FF00000000" $"000000FFFFFFFF050505050505050505FFFFF5F5F5FFF5F5FFFFFFFF00000000" $"000000FFFF050505050505050505FFFFFFF5FFFFFFF5FFFFFFFFF5FF00000000" $"000000FFFFFFFFFFFFFF050505FFF5FFFFF5FFFFFFFFFFF5F5F5F5FF00000000" $"000000FFF5F5F5F5FF050505FFF5FFFFF5FFF5FFFFF5FFF5FFF5F5FF00000000" $"000000FFFFF5FFFF0505FFFFFFFFF5F5F5FFF5F5FFFFFFFFF5FFF5FF00000000" $"000000FFF5F5FF0505FFFFF5F5FFFFFFFFF5FFF5FFFFF5F5FFF5F5FF00000000" $"000000FFF5FF0505FFF5FFFFF5FFFFF5F5F5F5F5F5FFF5F5F5FFFFFF00000000" $"000000FFFF05FFFFFFF5FFFFF5FFFFFFFFF5F5FFF5F5F5FFFFF5FFFF00000000" $"000000FF05FFFFFFFFFFFFFFF5FFF5F5FFFFF5FFF5F5FFF5FFF5FFFF00000000" $"000000FFFFFFF5FFFFFFF5F5F5F5F5FFFFFFFFFFFFF5F5F5F5F5FFFF00000000" $"000000FFFFF5FFFFF5F5F5F5F5F5FF00FFF5F5FFF5FFF5F5F5FFF5FF00000000" $"000000FFFFF5FFFFF5FFFFFFF5FF00FFF5F5FFFFFFFFF5FFFFFFF5FF00000000" $"000000FFF5FFF5F5F5FFF5FFFF00FF00FFF5F5F5F5F5F5FFF5FFFFFF00000000" $"000000FFF5F5F5FFF5F5FFFFFF0000FFF5F5F5F5FFFFF5FFFFFF00FF00000000" $"000000FFFFFFFFF5F5F5F5FFF5FF00FFFFF5FFF5FFF5F5F5FF00FFFF00000000" $"000000FFFFFFF5F5FFFFF5F5F5FF0000FFFFF5F5FFFFF5FFFF0000FF00000000" $"000000FFF5FFF5FFF5FFF5F5FFFFFF00FFFFF5F5FFFFFFF5FFFF00FF00000000" $"000000FFF5FFF5FFFFFFF5F5FFF5F5FFFFFFF5F5FFFFFFFFF5F5FFFF00000000" $"000000FFF5FFFFFFF5F5FFF5FFFFF5F5FFFFF5FFFFF5FFFFF5FFF5FF00000000" $"000000FFF5F5FFF5F5FFFFF5F5F5F5FFF5FFFFFFFFF5F5FFF5FFFFFF00000000" $"000000FFF5FFF5FFFFFFFFF5F5FFF5F5F5FFF5FFFFFFF5F5FFF5F5FF00000000" $"000000FFFFFFF5FFF5FFF5F5FFF5FFFFFFF5F5FFFFF5F5F5FFF5F5FF00000000" $"000000FFF5FFF5FFFFFFF5F5FFFFFFF5F5FFF5F5F5FFF5F5F5F5FFFF00000000" $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }; resource 'ics#' (131) { { /* array: 2 elements */ /* [1] */ $"7FE0 56B0 59A8 637C 51DC 6794 59AC 76EC" $"7224 7C6C 743C 71AC 505C 459C 4424 7FFC", /* [2] */ $"7FE0 7FF0 7FF8 7FFC 7FFC 7FFC 7FFC 7FFC" $"7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC" } }; resource 'ics4' (131) { $"0FFFFFFFFFF00000" $"0F0F0FF1FCFF0000" $"0FCFF11FF0FCF000" $"0FF111FF0FFFFF00" $"0FCF111FFFCFFF00" $"0FF11FFFFC0F0F00" $"0F1FF0CFF0F0FF00" $"0FFF0FFCFFFCFF00" $"0FFFC0F0C0F0CF00" $"0FFFFF0C0FFCFF00" $"0FFFCFC0C0FFFF00" $"0FFF0C0FFCFCFF00" $"0FCFC0C0CFCFFF00" $"0F0C0F0FFC0FFF00" $"0FC0CFC0C0F0CF00" $"0FFFFFFFFFFFFF" }; resource 'ics8' (131) { $"00FFFFFFFFFFFFFFFFFFFF0000000000" $"00FFF5FFF5FFFF05FFF5FFFF00000000" $"00FFF5FFFF0505FFFFF5FF2BFF000000" $"00FFFF050505FFFFF5FFFFFFFFFF0000" $"00FFF5FF050505FFFFFFF5FFFFFF0000" $"00FFFF0505FFFFFFFFF5F5FFF5FF0000" $"00FF05FFFFF5F5FFFFF5FFF5FFFF0000" $"00FFFFFFF5FFFFF5FFFFFFF5FFFF0000" $"00FFFFFFF5F5FFF5F5F5FFF5F5FF0000" $"00FFFFFFFFFFF5F5F5FFFFF5FFFF0000" $"00FFFFFFF5FFF5F5F5F5FFFFFFFF0000" $"00FFFFFFF5F5F5FFFFF5FFF5FFFF0000" $"00FFF5FFF5F5F5F5F5FFF5FFFFFF0000" $"00FFF5F5F5FFF5FFFFF5F5FFFFFF0000" $"00FFF5F5F5FFF5F5F5F5FFF5F5FF0000" $"00 Revision-number: 2618 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2003-01-16T00:52:28.000000Z K 7 svn:log V 38 Statements after declarations, dammit K 10 svn:author V 5 jacob PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d885b5c536ebd12f958d622f283b8a47 Text-delta-base-sha1: 50f1f5dad05c2691654c0c7585c400d9b052580d Text-content-length: 83 Text-content-md5: 6bef319be818bae4328fa13026e48e68 Text-content-sha1: e91e11b3d4ae407e83c39d6221d6903286b526b9 Content-length: 124 K 15 cvs2svn:cvs-rev V 5 1.233 PROPS-END SVN +]xint i; default_port = 0; /* illegal */444 Revision-number: 2619 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.248446Z PROPS-END Revision-number: 2620 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.256616Z PROPS-END Revision-number: 2621 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.264978Z PROPS-END Revision-number: 2622 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.272468Z PROPS-END Revision-number: 2623 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.280574Z PROPS-END Revision-number: 2624 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.288359Z PROPS-END Revision-number: 2625 Prop-content-length: 467 Content-length: 467 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-16T15:43:18.000000Z K 7 svn:log V 366 Steven Shockley points out that the .PPK extension is far from obvious to users. Update the file selection dialogs to mention it per the usual Windows convention, and also sprinkle references to it throughout the docs. I've also scattered hints that most tools need PuTTY's native format; perhaps this will reduce the frequency with which FAQ A.1.2 trips people up. PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e969d8cb60147ebbfb1490b53a05ac9b Text-delta-base-sha1: 64c03e6ea66750bccc96eaa43166ba6c009b3f86 Text-content-length: 138 Text-content-md5: 945aa4cb45368a5dff4836ffedb4cae3 Text-content-sha1: 740ae0e58c0b5c0b20177e7d9c9479114f842623 Content-length: 178 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVN$\ p1;;i\versionid $Id: config.but,v 1.50 2003/01/16 15:43:18 jacobThis key must be in PuTTY's native format (\c{*.PPK}) Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6c01cd8283d9bc70b698317f035ee7d3 Text-delta-base-sha1: 7668bc5af620336d8f143b641e63b9c2cf9df3fa Text-content-length: 136 Text-content-md5: bd2a86154f642e533c1e0d41e2d11886 Text-content-sha1: 4c4113b0ce4f8fb111cd57cb270ddc034d8be509 Content-length: 175 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN!5fm5(Y3n\versionid $Id: pageant.but,v 1.9 2003/01/16 15:43:18 in \c{*.PPK} format. See ppk d:\secondary.ppkppk Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ed9848160b45b18e48b35186d621960 Text-delta-base-sha1: e6f2b0981d883320ccf8a387b5a10a6c9e3f4801 Text-content-length: 575 Text-content-md5: 74b9477d1a2e87507ce0e22c42180544 Text-content-sha1: 1d4152251dfe8fc6f02389950afcc41eb7dbe809 Content-length: 615 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNDt;$B'<s\versionid $Id: pubkey.but,v 1.21 2003/01/16 15:43:18 jacobin PuTTY's native format (\c{*.PPK}); it is the one you will need to tell PuTTY to use for authentication (see \k{config-ssh-privkey}) or tell Pageant to load (see (\c{*.PPK}) so that you can use it with the PuTTY suite. The passphrase will be unchanged by this process (unless you deliberately change it). You may want to change the key comment before you save the key, since OpenSSH's SSH2 key format contains no space for a comment and \cw{ssh.com}'s default comment format is Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a59038f26964b85f3aa31fe0448fcda0 Text-delta-base-sha1: 27009bf724f6f488121d5023c770259ba08e5b86 Text-content-length: 165 Text-content-md5: b346db73979a6c55738a66cc0cec6215 Text-content-sha1: f432592dab228d1693428ed0ebe354aca2a1be67 Content-length: 205 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN/E (8O\versionid $Id: using.but,v 1.11 2003/01/16 15:43:18 jacobin \c{*.PPK} format which PuTTY will use to authenticate with the server. This Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cfa677edc60949f5b04b47e505af519d Text-delta-base-sha1: c255aef7f3b7a583b2fb2b57d3c798b28c27a43c Text-content-length: 47 Text-content-md5: 6b5429bba936f3bcade53a931f026d62 Text-content-sha1: 39c4bae4c70e5c6885ede677a867982173586484 Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVNgs qmz (*.ppk)\0*.PPK\0" " Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cd19d41fd05c1e69da7b59dbf1523966 Text-delta-base-sha1: 74e717789ba18065c80e6ffad7af4dd6cf323d40 Text-content-length: 49 Text-content-md5: d6a58eb118c1d9157e243a8137743b3a Text-content-sha1: a3c4797c413f16c6115f32db2b97eed302081d0a Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNN^ : C (*.ppk)\0*.PPK\0" " Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4fd7dd2d32cf8840e9e305a7f60c0faa Text-delta-base-sha1: 522c69cb79560723ae0740948695426f57028b08 Text-content-length: 48 Text-content-md5: 4cdfcf81c90dc33cf5bdd712429daf5f Text-content-sha1: e202a5e1c133d842c450276163220a19bc15032b Content-length: 89 K 15 cvs2svn:cvs-rev V 5 1.200 PROPS-END SVN KHK (*.ppk) Revision-number: 2626 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.461944Z PROPS-END Revision-number: 2627 Prop-content-length: 216 Content-length: 216 K 7 svn:log V 115 When voting for items already on the wishlist, a stonking new reason that we hadn't already thought of might help. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-17T13:32:51.000000Z PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5ffca80a23a9c91ab49e59c2ba865fab Text-delta-base-sha1: a18eddd39c9661069d495cb404892455f643ec85 Text-content-length: 139 Text-content-md5: 4f72371cca43f08dbee9393aec9f07c9 Text-content-sha1: 5bace015eac70c23ff418deac8fd2600e81788f7 Content-length: 179 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNM s3;al\versionid $Id: feedback.but,v 1.11 2003/01/17 13:32:51 jacobOffering a new and compelling justification might help Revision-number: 2628 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2003-01-17T14:25:55.000000Z K 7 svn:log V 29 Summary: screen(1) front-end K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/putty-screen-frontend Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 627 Text-content-md5: 3cf1347b3d9366f2484425fe5357b473 Text-content-sha1: 46cb733c6178ac817ee272c261212e49ecbfbc07 Content-length: 743 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNeeeSummary: screen(1) front-end Class: wish Difficulty: tricky Depends: scripting Priority: low Content-type: text/x-html-body

    We occasionally get requests to make PuTTY usable as a front-end to the screen terminal multiplexer, providing out-of-band control so that key sequences like C-a are freed up for use.

    While this is clearly desirable, we want to avoid encoding knowledge of server-side applications into the core of PuTTY. This is a clear application of scripting and is unlikely to happen before that is implemented. Revision-number: 2629 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.766217Z PROPS-END Revision-number: 2630 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.773931Z PROPS-END Revision-number: 2631 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.783369Z PROPS-END Revision-number: 2632 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.793152Z PROPS-END Revision-number: 2633 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.802393Z PROPS-END Revision-number: 2634 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:35.812340Z PROPS-END Revision-number: 2635 Prop-content-length: 305 Content-length: 305 K 8 svn:date V 27 2003-01-18T12:03:28.000000Z K 7 svn:log V 206 Simplify the random-seed-saving code: There's no need to take great care to preserve the old file in case the update is interrupted and replace it atomically, so we just overwrite in place. Much simpler. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1c4dd6cc9f42ce3855a8d7d5726b43fb Text-delta-base-sha1: fb526b49ab7a975bb0ad72717e7c34a2e332cff5 Text-content-length: 579 Text-content-md5: 829dfab7c400a62171cffc4c4d3bfde6 Text-content-sha1: 1a032f12b7e3d3ff60d810e327285c41fa44d406 Content-length: 618 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNW#x,k=rQD/* $Id: macstore.c,v 1.9 2003/01/18 12:03:28/* * We don't bother with the usual FSpExchangeFiles dance here because * it doesn't really matter if the old random seed gets lost. */ void write_random_seed(void *data, int len) { short puttyVRefNum; long puttyDirID; OSErr error; FSSpec dst== fnfErr) error = FSpCreate(&dstfile, PUTTY_CREATOR, SEED_TYPE, smRoman); if (error != noErr) return; if (FSpOpenDF(&dstfile, fsWrPerm, &refnum) != noErr) return; FSWrite(refnum, &count, data); FSClose(refnum); return Revision-number: 2636 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2003-01-18T12:18:04.000000Z K 7 svn:log V 75 It would help if everything agreed on the type of PuTTY random seed files. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d5c6baeb63711a578ac64400d9f9927f Text-delta-base-sha1: 815bfc510ccbe2fb5ed4300ac43025b74290ef0a Text-content-length: 72 Text-content-md5: 0c42caf89d3633329f2913da21a78f53 Text-content-sha1: 7bd575c4f6b9f45d1d121d56293b22352b629a13 Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNpp / ,4 #include #include #include "putty.h" #include "mac.h" #include "macresid.h" #include "storageopensession(void) { Session *s; StandardFileReply sfr; static const OSType sftypes[] = { 'Sess', 0, 0, 0 }; void *sesshandle; int i; s = smalloc(sizeof(*s)); memset(s, 0, sizeof(*s)); StandardGetFile(NULL, 1, sftypes, &sfr); if (!sfr.sfGood) goto fail; sesshandle = open_settings_r_fsp(&sfr.sfFile); if (sesshandle == NULL) goto fail; load_open_settings(sesshandle, TRUE, &s->cfg); close_settings_r(sesshandle); /* * Select protocol. This is farmed out into a table in a * separate file to enable an ssh-free variant. */ s->back = NULL; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == s->cfg.protocol) { s->back = backends[i].backend; break; } if (s->back == NULL) { fatalbox("Unsupported protocol number found"); } mac_startsession(s); return; fail: sfree(s); return Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8bd5092c290b89d060f6540bf83577e7 Text-delta-base-sha1: 1ddb63043b48712b8c18c74e614643c67ba25c46 Text-content-length: 101 Text-content-md5: dfceac6f5d9651d334697b0fc97a3cdb Text-content-sha1: 94a8c017bc8be1a3736285913496425d3123182f Content-length: 141 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNE<.,)Kw-n9MI/* $Id: macterm.c,v 1.51 2003/01/18 16:54:25ixMathTextCommon Revision-number: 2642 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2003-01-18T17:14:34.000000Z K 7 svn:log V 74 Add "Save" and "Save As..." items to the menus. No code behind them yet. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e32f1ce032b4b617aa782747ab28aa2c Text-delta-base-sha1: 6ebe4b13bf252c224391cd6938f3c49f24b66fcf Text-content-length: 152 Text-content-md5: 8b97247b78de9db1b45a2a7c4c92ded9 Text-content-sha1: c8693dfffd7d22d526dfed76382175b5628d04f2 Content-length: 192 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNiv*,'YG"n/* $Id: mac_res.r,v 1.19 2003/01/18 17:14:34011Save", noicon, "S", nomark, plain, "Save As\0xc9", noicon, nokey, Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8e824cd443094f3cb2b509287c6625c4 Text-delta-base-sha1: d55aef20ee5e02e12285b60afceec976ea6d8283 Text-content-length: 109 Text-content-md5: 65531e5a72bf1606c2e6e6b8525dcb4b Text-content-sha1: de995e0d99b347d1ab144d1abf05d5ac9f29ba3b Content-length: 148 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN~" W,6H/* $Id: macresid.h,v 1.5 2003/01/18 17:14:34Save 4 #define iSaveAs 5 #define iQuit 7 Revision-number: 2643 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2003-01-18T17:24:21.000000Z K 7 svn:log V 114 PuTTY doesn't remember which file it got a saved session from, so it's as stationery-pad-aware as it needs to be. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8b97247b78de9db1b45a2a7c4c92ded9 Text-delta-base-sha1: c8693dfffd7d22d526dfed76382175b5628d04f2 Text-content-length: 71 Text-content-md5: 34a74ee3a585ea92fc4e3bc1bad5a4c0 Text-content-sha1: 6014ddb722b264588b7b31af9a5841e58dabe3a2 Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNih .,#F/* $Id: mac_res.r,v 1.20 2003/01/18 17:24:21is Revision-number: 2644 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:36.439725Z PROPS-END Revision-number: 2645 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:36.447979Z PROPS-END Revision-number: 2646 Prop-content-length: 254 Content-length: 254 K 8 svn:date V 27 2003-01-18T20:09:21.000000Z K 7 svn:log V 155 Support for saving sessions on the Mac. This is slightly useful even in the absence of a config dialogue, since it allows me to get Default Settings out. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 57596ca7470fca3a710bbbf52cabac92 Text-delta-base-sha1: ae39b44becc42f13672bec8674ff0d4aed2d47a2 Text-content-length: 325 Text-content-md5: 52c95a4449afa554e9df6e2b4564f0e6 Text-content-sha1: 4315b91a6206bc76df96e6caf9af7be82e8f6942 Content-length: 365 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNN%ce]B>Hx>/* $Id: mac.c,v 1.33 2003/01/18 20:09 case iSave: mac_savesession(); goto done; case iSaveAs: mac_savesessionas(); Settings: DisableItem(menu, iSave); /* XXX enable if modified */ EnableItem(menu, iSaveAs);DisableItem(menu, iSave); DisableItem(menu, iSaveAs); Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6a7159eac84ecde41312334fbf3e3bb4 Text-delta-base-sha1: 2cb56191fc64a1de88afa7a2322bd74a0a188c1a Text-content-length: 286 Text-content-md5: 75fcec16ebe348e88c22bf3f768e1f28 Text-content-sha1: e54f2e8cc5b072320f51a1c12d431c176e6ba230 Content-length: 326 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNMqz. P}#define PUTTY_CREATOR FOUR_CHAR_CODE('pTTY') #define INTERNAL_CREATOR FOUR_CHAR_CODE('pTTI') #define SESS_TYPE FOUR_CHAR_CODE('Sess') #define SEED_TYPE FOUR_CHAR_CODE('Seed')savesession(void); extern void mac_savesessionasextern void *open_settings_w Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0aa2f3b5e48130dc0bb7305e64071b28 Text-delta-base-sha1: fde46cdef2e0d43042831874448c560b5babb86d Text-content-length: 782 Text-content-md5: a1f50a4041ad188e2f787a11c6836bc2 Text-content-sha1: 170e368653f1dd4036c59765fc3024523e333101 Content-length: 821 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN"of*E=j8/* $Id: macdlg.c,v 1.4 2003/01/18 20:09:21Resourcesavesession(void) { /* Don't remember which file a session goes with yet, so... */ mac_savesessionas(); } void mac_savesessionas(void) { Session *s = (Session *)GetWRefCon(FrontWindow()); StandardFileReply sfr; void *sesshandle; StandardPutFile("\pSave session as:", "\puntitled", &sfr); if (!sfr.sfGood) return; if (!sfr.sfReplacing) { FSpCreateResFile(&sfr.sfFile, PUTTY_CREATOR, SESS_TYPE, sfr.sfScript); if (ResError() != noErr) return; /* XXX report error */ } sesshandle = open_settings_w_fsp(&sfr.sfFile); if (sesshandle == NULL) return; /* XXX report error */ save_open_settings(sesshandle, TRUE, &s->cfg); close_settings_w(sesshandle) Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 273b8cb67bc31d3ca439a8b5c98b3699 Text-delta-base-sha1: 9e565f3aa73fd279310d2a507945c713dccbcb7b Text-content-length: 1083 Text-content-md5: 57ae26bc2021afb7c128615871d1ce61 Text-content-sha1: edc47176e8aa063381c0747637cbddb4bcd4983d Content-length: 1123 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNeHm*j;X_smZD!/* $Id: macstore.c,v 1.11 2003/01/18 20:09dio.h> #include #include "putty.h" #include "storage.h" #include "mac.h" #include "macresid.h"; long sessDirID; OSErr error; Str255 psessionname; FSSpec dstfile; return NULLdstfile); if (error == fnfErr) { FSpCreateResFile(&dstfile, PUTTY_CREATOR, SESS_TYPE, smSystemScript); if ((error = ResError()) != noErr) return NULL; } else if (error != noErr) return NULL; return open_settings_w_fsp(&dstfile); } /* * NB: Destination file must exist. */ void *open_settings_w_fsp(FSSpec *dstfile) { short tmpVRefNum; long tmpDirID; struct write_settings *ws; OSErr error; Str255 tmpname; ws = smalloc(sizeof *ws); ws->dstfile = *dstfile; /* Create a temporary file to save to first. */ error = FindFolder(ws->dstfile.vRefNum, kTemporaryFolderType, kCreateFolder, &tmpVRefNum, &tmpDirID); if (error != noErr) goto out; c2pstrcpy(tmpname, tmpnam(NULL)); error = FSMakeFSSpec(tmpVRefNum, tmpDirID, tmp Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dfceac6f5d9651d334697b0fc97a3cdb Text-delta-base-sha1: 94a8c017bc8be1a3736285913496425d3123182f Text-content-length: 165 Text-content-md5: dc14f397e3ada405c8dbc711541c1764 Text-content-sha1: 328c7f5e3f9d4fb77e2280a61dff9311e0382b04 Content-length: 205 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNE@ x,^>/* $Id: macterm.c,v 1.52 2003/01/18 20:09:21File); DisableItem(menu, iSave); /* XXX enable if modified */ EnableItem(menu, iSaveAs Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d5a36a8aa9ba604bf563adf9d0c7bd70 Text-delta-base-sha1: 19763a348cfa6d46d9217bf71be5d08386734a30 Text-content-length: 78 Text-content-md5: 316716263a31ad6a7caada1da1401ac3 Text-content-sha1: e55239a47c085328a2d0ff7d9e654d9137cc74a0 Content-length: 119 K 15 cvs2svn:cvs-rev V 5 1.193 PROPS-END SVNl. 7gsave_open_settings(void *sesskey, int do_host, Config * Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f8325157022a83233a02fd075bec3c99 Text-delta-base-sha1: 8bdbf273ee6dbdc3f0740ae8ffb1e12c1f53f2ad Text-content-length: 284 Text-content-md5: 78ff856a1e42b6a0ab6ef10ce3746b19 Text-content-sha1: a66d18ceaef0a98f0da67b33ce05daa114b72793 Content-length: 324 K 15 cvs2svn:cvs-rev V 4 1.97 PROPS-END SVNuj}P}!9|yvoid *sesskey; sesskey = open_settings_w(section); if (!sesskey) return; save_open_settings(sesskey, do_host, cfg); close_settings_w(sesskey); } void save_open_settings(void *sesskey, int do_host, Config *cfg) { int i; char *p Revision-number: 2647 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:36.617828Z PROPS-END Revision-number: 2648 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2003-01-18T20:52:59.000000Z K 7 svn:log V 93 Remember which file a session was opened from, so it can be the default one to save back to. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 75fcec16ebe348e88c22bf3f768e1f28 Text-delta-base-sha1: e54f2e8cc5b072320f51a1c12d431c176e6ba230 Text-content-length: 61 Text-content-md5: 7f959d48c19d425f70bdd932966f3b8c Text-content-sha1: 8d9a8575c31626af3f0f9896f9e142a3a084eed3 Content-length: 101 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNq (a` int hasfile; FSSpec savefile; Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a1f50a4041ad188e2f787a11c6836bc2 Text-delta-base-sha1: 170e368653f1dd4036c59765fc3024523e333101 Text-content-length: 492 Text-content-md5: 8312ed56a0855010a9cb1192bd66c1ae Text-content-sha1: 7ee3739a5769eb808c48645f72b6cdca09ae11fe Content-length: 531 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNR1/-*IL{yd "(Zj/* $Id: macdlg.c,v 1.5 2003/01/18 20:52:59assert.h> s->hasfile = FALSE if (sfr.sfFlags & kIsStationery) s->hasfile = FALSE; else { s->hasfile = TRUE; s->savefile = sfr.sfFile; } Session *s = (Session *)GetWRefCon(FrontWindow()); void *sesshandle; assert(s->hasfile); sesshandle = open_settings_w_fsp(&s->savef s->hasfile ? s->savefile.name : s->hasfile = TRUE; s->savefile = sfr.sfFile Revision-number: 2649 Prop-content-length: 179 Content-length: 179 K 7 svn:log V 81 Clear kex_ctx in a new session so we can safely free an ssh session without one. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-18T21:56:33.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f3c836440e95216217406ecf86374ba5 Text-delta-base-sha1: afcf87bedaa2e94cf7f6d4c967ef7c0065233b4f Text-content-length: 161 Text-content-md5: 45b17665ff98c9f5a60e86be31fbe761 Text-content-sha1: e6e3a37534b7b84e7baf0fd1c2b44880fcb0682f Content-length: 202 K 15 cvs2svn:cvs-rev V 5 1.267 PROPS-END SVN 5-: wanted 0x%08x, got 0x%08x", st->realcrc, st->gotcrc#p :'== SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION) { /* Remotkex_ct Revision-number: 2650 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2003-01-18T22:02:22.000000Z K 7 svn:log V 62 Remove stray debugging code that got in with the last commit. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 45b17665ff98c9f5a60e86be31fbe761 Text-delta-base-sha1: e6e3a37534b7b84e7baf0fd1c2b44880fcb0682f Text-content-length: 96 Text-content-md5: 87ccf5190b3a54f7c949c0c484cf86b3 Text-content-sha1: 489e633c9e9cce4ef779ae4de90b89b52e88f39a Content-length: 137 K 15 cvs2svn:cvs-rev V 5 1.268 PROPS-END SVN5-S"== SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION) { /* Remotp<<4 Revision-number: 2651 Prop-content-length: 289 Content-length: 289 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-18T23:26:56.000000Z K 7 svn:log V 190 Use the correct ProcInfo for AddrToStr. This makes the MacTCP code work in PowerPC builds. Well, makes it not crash, anyway -- AddrToStr doesn't seem to be returning amything very useful. PROPS-END Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5bac120842ccd2dbe5c66f37ac7d35af Text-delta-base-sha1: 024a17fef42d46e63370cd18b86a988297e46f21 Text-content-length: 139 Text-content-md5: c55bbf7154ed69379492cf5d5f074063 Text-content-sha1: fb61ffacaf41ebfc6b7f61ed868c22aa5a882f0b Content-length: 179 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNS ryrh,UInt32))) | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(unsigned long))) | STACK_ROUTINE_PARAMETER(3 Revision-number: 2652 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2003-01-19T00:00:53.000000Z K 7 svn:log V 90 unitab_xterm is now basically right. SC's optimiser seems to do something nasty to ssh.c. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d704e175c1977904c1d36e88ce0d5874 Text-delta-base-sha1: b2f22519e6f5e7bdd6e591c93e90c3f809ea4323 Text-content-length: 230 Text-content-md5: aea6b3b3b6a41cfb45725bddcd6d3c51 Text-content-sha1: af5ab9f457f53a01d3d2daeca2bc366b160c3afc Content-length: 270 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNOE M*#t[$Id: README.mac,v 1.11 2003/01/19 00:00:53Compiling ssh.c using SC 8.8.4 with "-opt time" causes SSH1 connections to fail with "Incorrect CRC received on packet". Using "-opt none" works around this Revision-number: 2653 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:37.364008Z PROPS-END Revision-number: 2654 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:37.374236Z PROPS-END Revision-number: 2655 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:37.383833Z PROPS-END Revision-number: 2656 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:37.395165Z PROPS-END Revision-number: 2657 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:37.404920Z PROPS-END Revision-number: 2658 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:37.419908Z PROPS-END Revision-number: 2659 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:37.428872Z PROPS-END Revision-number: 2660 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2003-01-20T01:07:13.000000Z K 7 svn:log V 56 Sync with reality and add more things that need fixing. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aea6b3b3b6a41cfb45725bddcd6d3c51 Text-delta-base-sha1: af5ab9f457f53a01d3d2daeca2bc366b160c3afc Text-content-length: 718 Text-content-md5: 1ed9210b06b0ba4e0787a5186e56e2c1 Text-content-sha1: d4895e8ed87b6613ab1d99a3e85ff16f2935bf7d Content-length: 758 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNE );)}/;Rjc% $Id: README.mac,v 1.12 2003/01/20 01:07:1non-Carbon PowerPC build called "PuTTY.ppc", and similar builds of PuTTYtel called "PuTTYtel.68k" and "PuTTYtel.ppc". The CFM-68K build is currently disabled because it overflows the global data space and I can't work out how to stop this happening (should be done before release)ession configuration. * Filename abstraction (we want to use alias records). * Host key database. * Entropy collection. * Private key files. * Pageant and PuTTYgen. * Apple Events. Wishlist (after release): * SFTP client (GUI?) * Carbon compatibility (requires Open Transport and Navigation Services). * 'styl' copy (and paste, for script codes? Revision-number: 2661 Prop-content-length: 150 Content-length: 150 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-20T09:44:15.000000Z K 7 svn:log V 50 Add link to the config-on-floppy hack in the docs PROPS-END Node-path: putty-wishlist/data/config-locations Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 27e77b5904be4632748458880c5a7d96 Text-delta-base-sha1: b841f47a50a871443112a01547f50d68cb3b3939 Text-content-length: 207 Text-content-md5: 72956ef9777fca4c659435a04fa77d53 Text-content-sha1: fb046a81bcb8ba6a1904612c31491d976c628428 Content-length: 246 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNn& 7<73;(See the docs for a current hack to do this, which assumes you have write access to your registry.) Revision-number: 2662 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2003-01-20T16:37:36.000000Z K 7 svn:log V 26 pterm should set WINDOWID K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/pterm-windowid Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 503 Text-content-md5: 9757adcd1c4501b2084b8059d023f493 Text-content-sha1: fdd99b23795d951db2c36c38d8a13372c400f4f8 Content-length: 619 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNiiiSummary: pterm should set WINDOWID environment variable Class: bug Priority: medium Difficulty: fun Content-type: text/plain xterm sets the WINDOWID environment variable to the Window ID. Since some programs (Ian's xterm-titler program and w3m-img) use the WINDOWID, pterm should set it too. It looks to me like something in pterm.c needs to say something like: windowid = GDK_WINDOW_XWINDOW(inst->window); ...and then something in pty.c can stuff that into the environment variable. Revision-number: 2663 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2003-01-20T17:04:40.000000Z K 7 svn:log V 117 Summary: Better diagnostics from file transfer backends (particularly ability to see which of SCP and SFTP was used) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sftp-backend-diagnostic Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 394 Text-content-md5: dd58ca10a67a29b8163f7df705080c30 Text-content-sha1: 01850ad2b3a911d089c17a36067f63e221a1f51d Content-length: 510 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN|||Summary: Better diagnostics from file transfer backends Class: wish Difficulty: fun Priority: medium Content-type: text/x-html-body

    There should be better diagnostics surrounding the choice between the SCP and SFTP backends in the file transfer utilities (PSCP, PSFTP). In particular, it should be possible to tell easily which of the backends was used from the `-v' output. Revision-number: 2664 Prop-content-length: 277 Content-length: 277 K 8 svn:date V 27 2003-01-20T17:57:00.000000Z K 7 svn:log V 176 Summary: System tray activity breaks pointer hiding Dave Eyers has apparently tracked down the cause of this, which has been annoying me for ages. Three cheers for Dave Eyers. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/systray-breaks-ptr-hiding Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 509 Text-content-md5: bda29b7cbc3a9cb76f2613d72a0bc7ae Text-content-sha1: cf933b4e08dc700d56f45f8efb41fcbbdfbffdc3 Content-length: 625 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNoooSummary: System tray activity breaks pointer hiding Class: bug Priority: medium Content-type: text/x-html-body

    Activity in the Windows system tray (new icons, possibly changed icons) can cause the pointer to become spuriously unhidden when `Hide mouse pointer when typing in a window' is checked.

    We've had one report of this on Win2K (5.00.2195). I (JTN) can reliably reproduce it at work with Win2K by sending myself mail (Outlook adds an icon to the system tray when this happens). Revision-number: 2665 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2003-01-20T18:05:13.000000Z K 7 svn:log V 112 Run through contrib/accel.pl 1.1 [r1585]: - Fix accelerator clash on SSH panel (D) - Fix accelerator comments K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4cdfcf81c90dc33cf5bdd712429daf5f Text-delta-base-sha1: e202a5e1c133d842c450276163220a19bc15032b Text-content-length: 180 Text-content-md5: ebdad3a23eb360d815dd3131d2f1dea3 Text-content-sha1: 5e873a78d5928bfe240c0c65f02fcd5d97c6c933 Content-length: 221 K 15 cvs2svn:cvs-rev V 5 1.201 PROPS-END SVN78=w~3;JhO9d}ukw~xal12n sud i/* Adds accelerators: ud */&ingle-exu tprsdilmB' IsDlgButtonChecked(hwnd, IDC_SSH2DES Revision-number: 2666 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2003-01-20T20:10:07.000000Z K 7 svn:log V 53 Add a stub "free" routine for pterm. Thanks to rjk. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b7dfe83bd41cfbfc4268430f54c9d103 Text-delta-base-sha1: 84250b646861470f11151ea1deda5c6594eed64d Text-content-length: 111 Text-content-md5: c0a4b82359a76f2eaa65c9ccbd11a694 Text-content-sha1: f3f2e764d613eb7d55f5522705b309b62bfba672 Content-length: 151 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNtYS"ObStub routine (never called in pterm */ static void pty_free(void *handle) { } free Revision-number: 2667 Prop-content-length: 188 Content-length: 188 K 7 svn:log V 90 Enable -Werror in GTK builds (we already have -Wall, so more GCCisms aren't _that_ evil). K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-20T20:15:28.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e0b4bca2d3a33c861528471e40c30a4e Text-delta-base-sha1: 707125810efc8f1891cac533b7561895a0a0d342 Text-content-length: 29 Text-content-md5: c88c44278240999d2aec9fdc3c34a913 Text-content-sha1: d1861d7aa41bb41ee02c74ebccd3aa05577948a4 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVN`h B @Werror Revision-number: 2668 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 70 Add minimal Apple Event support -- we handle the 'aevt'/'quit' event. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-20T22:55:08.000000Z PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 52c95a4449afa554e9df6e2b4564f0e6 Text-delta-base-sha1: 4315b91a6206bc76df96e6caf9af7be82e8f6942 Text-content-length: 684 Text-content-md5: 74ff6e9b137a7655d37b159d6454df0b Text-content-sha1: ca59f93ffcf9dd32a5c084864d4e454108e13b8a Content-length: 724 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNAA]P(9i8j>2S-<0dD x /* $Id: mac.c,v 1.34 2003/01/20 22:55:08AEDataModel.h> #include ]* 3O;$Id: README.mac,v 1.13 2003/01/20 22:55:54 * Warn-on-close. * Close-on-exit. * Warn-on-quit Revision-number: 2670 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2003-01-21T00:27:24.000000Z K 7 svn:log V 32 Remove stray debugging printfs. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 57ae26bc2021afb7c128615871d1ce61 Text-delta-base-sha1: edc47176e8aa063381c0747637cbddb4bcd4983d Text-content-length: 71 Text-content-md5: b430c29c1d9d80b6469959bcc76315e9 Text-content-sha1: b5b53e87a8153cf336006149a4e22b01ee086126 Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNHL- -Z8/* $Id: macstore.c,v 1.12 2003/01/21 00:27:24 Revision-number: 2671 Prop-content-length: 137 Content-length: 137 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-21T00:28:20.000000Z K 7 svn:log V 39 We'll need the event log to work, too. PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 678451262206e322ccc9a1dc400bd590 Text-delta-base-sha1: 3839793264e5e2b63dc6eeed0623c000b2f0796b Text-content-length: 76 Text-content-md5: 667e2b5116af5a51afbbf1f42f1c948b Text-content-sha1: 1204d895d84b824a428b4f355ab9f6ad800df5b3 Content-length: 116 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN>L 6G*Oo$Id: README.mac,v 1.14 2003/01/21 00:28:20 * Event log Revision-number: 2672 Prop-content-length: 130 Content-length: 130 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-21T12:43:12.000000Z K 7 svn:log V 32 Add xref to similar Debian bug. PROPS-END Node-path: putty-wishlist/data/bold-font-colour Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d4a6dc6497a8bf6ad265f481c8f33c60 Text-delta-base-sha1: 9eae1375cf5d420ef850c65d66d6f9948595c340 Text-content-length: 279 Text-content-md5: 28e333f3e3c6731a5348a5dc48561aec Text-content-sha1: 4728108caaf5a80ba593f59f7f8210f724eac808 Content-length: 318 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNIJwUx|Mrx-html-body

    PuTTY allows bold text to be displayed by either emboldening the font, or by changing the colour of the text.

    Debian bug 167785 would appear to be an instance of this problem. Revision-number: 2673 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2003-01-21T13:26:37.000000Z K 7 svn:log V 87 Tweak the version-extraction seddery so that it can cope with extra lines in htaccess. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 555e1c5bbcd3b7c7c29a3f4d04386a08 Text-delta-base-sha1: d069b9a1e28dc2a92c7c0971bc6fc6d598428351 Text-content-length: 77 Text-content-md5: 3562967142972655024e61316d7304bc Text-content-sha1: 99bb1eb5754ea8ee9e8fc339ee89b00250531cf7 Content-length: 116 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN38 8~1-n 's!.*http://the.earth.li/~sgtatham/putty/\(.*\)/!\1!p Revision-number: 2674 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2003-01-21T19:18:06.000000Z K 7 svn:log V 186 Fix "-v" in the Windows console utilities (plink, pscp, psftp). I'm not convinced I've done this the right way (I've introduced a static for logctx in console.c) but it will do for now. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: addb75b61575e608689ce322eef29247 Text-delta-base-sha1: 8f2e902cd90999b7125d209aca58b6cc5de15e11 Text-content-length: 243 Text-content-md5: 1d961e538aa534b58ab545022a5634ad Text-content-sha1: 2cffc5a26db3343b393e7126f7db36b500d39cfb Content-length: 282 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN =U3HEstatic void *console_logctx = NULLconsole_provide_logctx(void *logctx) { console_logctx = logctx; } void logevent(void *frontend, char *string) { if (console_logctx) log_eventlog(console_logctx, string); Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8d77b560b8a2029b4f3c46358d429609 Text-delta-base-sha1: 8d83135279687a874f2f8cd7c95e768231d16673 Text-content-length: 46 Text-content-md5: 93dcc5d16fd3f856c1b39e47d6af25fc Text-content-sha1: 53463659bc86cf24ff01b7a211974302110ea306 Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNw P1Fconsole_provide_logctx( Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 34eddf2520bb1eccc6e7bfa8553191c8 Text-delta-base-sha1: e8662973491f3535ec706a2228e906df893a8b43 Text-content-length: 48 Text-content-md5: a01e93ff520d4e1f9d2b3427b2b4b454 Text-content-sha1: 779c32cb7b956042c31f835f71d6edc22c957a40 Content-length: 88 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN7 OQBconsole_provide_logctx( Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 316716263a31ad6a7caada1da1401ac3 Text-delta-base-sha1: e55239a47c085328a2d0ff7d9e654d9137cc74a0 Text-content-length: 65 Text-content-md5: f12b96fa0c7803b08ab25c553b90cf49 Text-content-sha1: 658b4b5f62a3a7d1b68344c4a3aeb7295906cc73 Content-length: 106 K 15 cvs2svn:cvs-rev V 5 1.194 PROPS-END SVN.Y (void console_provide_logctx(void *logctx Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a0a1ccbe45ee6408ae3fdf07099438d6 Text-delta-base-sha1: 56391eb382e6084b7e07378cf02260f46fa77f70 Text-content-length: 47 Text-content-md5: 40a1f764626e6067dbe956e9edd440b4 Text-content-sha1: 3debacff3966df53f4f3740025c5027ff58841a0 Content-length: 88 K 15 cvs2svn:cvs-rev V 5 1.101 PROPS-END SVN6Z * console_provide_logctx( Revision-number: 2675 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2003-01-21T21:05:35.000000Z K 7 svn:log V 104 accel.pl knows about the accelerators added by winctrls.c:prefslist(). (I'm amazed this still works...) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/contrib/accel.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f093ee8cea4f95208972b590d30a37cd Text-delta-base-sha1: 60d3b9876c00586894864b8e9af7337cb543132e Text-content-length: 375 Text-content-md5: bb7079b12aaf3ba416deffc60b20033d Text-content-sha1: 6a02a5b537ce4f1468701a887b1696d28a694e04 Content-length: 414 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNb]W-=) 02#! /usr/bin/perl -w # $Id: accel.pl,v 1.2 2003/01/21 21:05:3: # windlg.c:1.201 # win_res.rc:1.59 (for global accelerators) # winctrls.c:1.20 (for prefslist() hardcoded accelerators) # Hack: winctrls.c:prefslist() has hard-coded "&Up" and "&Down" # buttons. Take this into account. if (m/\bprefslist *\(/) { $real_accel .= "ud"; Revision-number: 2676 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2003-01-22T13:06:54.000000Z K 7 svn:log V 26 Add slayernetworking.com. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3562967142972655024e61316d7304bc Text-delta-base-sha1: 99bb1eb5754ea8ee9e8fc339ee89b00250531cf7 Text-content-length: 103 Text-content-md5: 19bde74500a7ea6e6af81fb762730153 Text-content-sha1: 706dedd49a5a5c646c515591b42dd19c85c6d992 Content-length: 142 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN8- QGQ#!--HTTPMIRROR-->slayernetworking.com Revision-number: 2677 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2003-01-22T16:13:17.000000Z K 7 svn:log V 213 Initial thoughts on a portable keyboard handler. Please fill in missing details and tell me about horrors I've forgotten. If anyone feels like explaining how the numeric keypad works, that'd be especially nice! K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/portable-keyboard Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2019 Text-content-md5: 5fc886be2f698c754557dd85cde2522a Text-content-sha1: 4da32df85fd5acbe0df342cc92a71533d584b179 Content-length: 2135 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNUUUSummary: Shared keyboard handler across platforms Class: wish Priority: medium Difficulty: tricky Content-type: text/plain At present, each port of PuTTY has a separate keyboard handler, which takes keyboard events and converts them into bytes to be fed to the line discipline. This is clearly silly, since much of the code is shared, but a sensible abstraction is trickier than you might think. I (BJH) can think of the following kinds of keypress that PuTTY has to be able to handle. Further suggestions welcome. * Typewriter keys, possibly affected by Caps Lock, Shift, Alt Gr, or Option. These emit graphic characters in the current character set. The graphic character in question should be whatever the user expects, which is usually determined by the OS. * Typewriter keys with Control held down. For keys which would usually generate ASCII characters without Control, it's usually clear which control character they should generate. What about non-ASCII characters (or non-ASCII keyboards)? In the Mac OS, Command-key shortcuts are always based on a Roman keyboard layout. Should we do the same with Control? * Typewriter keys handled through the "compose" mechanism. These have to be converted to characters as if Compose were not held down, and then composed through a fixed table. * Function keys, including Tab, Esc, Backspace, F1-F12 and editing keys, but not the numeric keypad. These emit escape sequences (sequences of _bytes_, not characters), with the precise sequence depending on terminal modes, configuration, keys held down etc. While complex, I think this is all entirely platform- and keyboard-layout independent, and hence not scary. * The numeric keypad. I haven't worked this out yet. * All the above, with Meta held down. This should send the same sequence as without Meta down, but preceded by ESC. * Keys which should be handled by the OS. I don't think the platform- independent keyboard handler should see these at all. Revision-number: 2678 Prop-content-length: 174 Content-length: 174 K 7 svn:log V 76 Add the numeric keypad and a few other things based on comments from Simon. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-22T19:04:46.000000Z PROPS-END Node-path: putty-wishlist/data/portable-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5fc886be2f698c754557dd85cde2522a Text-delta-base-sha1: 4da32df85fd5acbe0df342cc92a71533d584b179 Text-content-length: 1052 Text-content-md5: 2c80e23e90e9bfc2a4140e616813cd47 Text-content-sha1: 20fcb070ef2222dbf8068f365a6b9e46157cc9c1 Content-length: 1091 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNU>t/&*c[kSTypewriter keys in "Cyrillic-Lock" mode. Here, if Caps Lock is on, those keys that would usually generate certain ASCII characters generate Cyrillic ones instead in application mode. In this mode, the keypad, including Num Lock, behaves as a set of function keys. * The numeric keypad in normal mode, with Num Lock off. In this mode, those keypad keys which can also be editing keys generate the same sequences as the editing keys themselves. Other keys are, I think, processed as with Num Lock on below. * The numeric keypad in normal mode, with Num Lock on. In this mode, the keypad behaves as typewriter keys. * The numeric keypad with Alt held down. This accumulates a numeric character code (line charset) in decimal which is sent when Alt goes upcause PuTTY to do things but which aren't sent to the host. Some of these (e.g. Shift+Page Up) are platform-independent, and can be treated as function keys. Others (e.g. Alt+Space) are better handled in platform-dependent code Revision-number: 2679 Prop-content-length: 277 Content-length: 277 K 8 svn:date V 27 2003-01-22T20:22:39.000000Z K 7 svn:log V 176 Next instalment of the Great Incompatible Defaults Change: `avoid ever using icon title' now defaults to On, because in general it seems to cause more problems than it solves. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 78ff856a1e42b6a0ab6ef10ce3746b19 Text-delta-base-sha1: a66d18ceaef0a98f0da67b33ce05daa114b72793 Text-content-length: 26 Text-content-md5: bf0a7cfe5a454df431b8009733349404 Text-content-sha1: 8a3a6868ffd6ab002f298116e4f753566ed5c676 Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.98 PROPS-END SVNjj Z[1 Revision-number: 2680 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2003-01-22T21:26:23.000000Z K 7 svn:log V 124 Summary: Turn on 'avoid ever using icon title' by default Fixed-in: 2003-01-23 (just so we don't forget it at release time) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/icon-title-default-change Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 421 Text-content-md5: 27ebe9340404d6743f1b695ed05e34d9 Text-content-sha1: 85bb0f6328d2fc125f7bf1a9a9acb63edd3a7155 Content-length: 537 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: Turn on 'avoid ever using icon title' by default Class: wish Difficulty: fun Priority: medium Fixed-in: 2003-01-23

    Separate window and icon titles don't make as much sense in the post-Win95 world as in X11/Windows 3 style user interfaces. Judging by the mail we get, the resulting behaviour seems to be surprising to a fair few users. Perhaps we should turn off use of icon titles by default. Revision-number: 2681 Prop-content-length: 326 Content-length: 326 K 8 svn:date V 27 2003-01-23T11:37:54.000000Z K 7 svn:log V 225 In pursuance of `icon-title-default-change': Change the sense of cfg.win_name_always' representation in the UI (from `Avoid ever using icon title' to `Separate window and icon titles'). Also update the docs to match reality. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 945aa4cb45368a5dff4836ffedb4cae3 Text-delta-base-sha1: 740ae0e58c0b5c0b20177e7d9c9479114f842623 Text-content-length: 315 Text-content-md5: 191e30bb3faf24bb16745930b3525a6a Text-content-sha1: 6d9188a07ea4b7fb22b5929e63493e4f6c05363f Content-length: 355 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVN\{C5bZ\versionid $Id: config.but,v 1.51 2003/01/23 11:37:54 By default, PuTTY only uses the server-supplied \e{window} title, and ignores the icon title entirely. If for some reason you want to see both titles, check the box marked \q{Separate window and icon titles}. If you do this, Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ebdad3a23eb360d815dd3131d2f1dea3 Text-delta-base-sha1: 5e873a78d5928bfe240c0c65f02fcd5d97c6c933 Text-content-length: 98 Text-content-md5: 63aa0173934f3e3aba54eed0a7aa1930 Text-content-sha1: 7f20e0a349a88333e8ed604be05a8ead7a97838f Content-length: 139 K 15 cvs2svn:cvs-rev V 5 1.202 PROPS-END SVN"###BbV$!Separate window and &icon titles!BHBcbc = Revision-number: 2682 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2003-01-23T11:40:23.000000Z K 7 svn:log V 40 Change sense of UI control, updated doc K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/icon-title-default-change Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 27ebe9340404d6743f1b695ed05e34d9 Text-delta-base-sha1: 85bb0f6328d2fc125f7bf1a9a9acb63edd3a7155 Text-content-length: 220 Text-content-md5: 39d86014ebd9cd72f13b70a8ad6d6ac6 Text-content-sha1: b6cba127ae9ee6f8057931e33eab19594a285ddc Content-length: 259 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN\ E{{: 2003-01-24

    In fixing this, I've changed the sense of the control in the Windows UI - what was `Avoid ever using icon title' is now `Separate window and icon titles'. Docs updated accordingly. Revision-number: 2683 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2003-01-23T12:30:26.000000Z K 7 svn:log V 23 Mention Ctrl-PgUp/PgDn K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b346db73979a6c55738a66cc0cec6215 Text-delta-base-sha1: f432592dab228d1693428ed0ebe354aca2a1be67 Text-content-length: 133 Text-content-md5: 46eea388b42ab62d191810195db62dff Text-content-sha1: 4f023f8c9064e36546cf98c7ed31d3924cca3805 Content-length: 173 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNE l+4mX\versionid $Id: using.but,v 1.12 2003/01/23 12:30:26You can scroll a line at a time using Ctrl-PgUp and Ctrl Revision-number: 2684 Prop-content-length: 286 Content-length: 286 K 8 svn:date V 27 2003-01-23T12:41:17.000000Z K 7 svn:log V 185 Note another startup-unselected oddity (no taskbar button). I have no idea whether it has the same cause (or indeed if the original problem still exists, because I can't reproduce it). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/startup-unselected Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f9baedb60da2f0c18436c327993ab44 Text-delta-base-sha1: 5dfaa79600d91d0c480a86d9718f4825ffc207aa Text-content-length: 255 Text-content-md5: b775ba7c1c465c12ac4b5a305ff63e54 Text-content-sha1: 96c7eb6b15f45b129f9c4affe6675ff89ab68cd9 Content-length: 294 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN0l0l JTN, 2003-01-23: Possibly related: I've also noticed that if PuTTY starts up without focus as a result of being run from `wf' (DoIt), on Win2K, it doesn't get a taskbar entry until it received focus (although it's visible on Alt-Tab). Revision-number: 2685 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2003-01-23T12:59:21.000000Z K 7 svn:log V 118 Present-in: 0.52 2002-05-20 2002-10-24 Absent-in: 2002-10-29 2003-01-23 Hurrah for bugs that fix themselves... maybe. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/resize-minimise Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 456159c80d72a1bee2b9817d614db580 Text-delta-base-sha1: c47647c100ab5e1202d4be362ee766d875df25f3 Text-content-length: 348 Text-content-md5: 03bf47a701eb32bbb22bfdae539018bf Text-content-sha1: 4c591f576d500d9452acd9658a357f75666ea0c0 Content-length: 387 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNa% DpAqp 2002-10-24 Absent-in: 2002-10-29 2003-01-23 Fixed-in: 2002-10-29

    Update: This bug appears to have mysteriously fixed itself sometime between 2002-10-24 and 2002-10-29. During this period there was a lot of global-removal and Unix-porting upheaval, including some bug fixes, so I'm going to claim this is fixed. Revision-number: 2686 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2003-01-23T13:01:15.000000Z K 7 svn:log V 26 Add link to adns homepage K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/async-dns Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 975159d89152adf591f40fb1759103da Text-delta-base-sha1: 86570a7d7788f45ca213f7bfae2acf96dbeef2b5 Text-content-length: 89 Text-content-md5: 86d3d44218b30d8c3fe8f4662c2c3731 Text-content-sha1: dbfddd0e34b5169960b80b83d993f990bdad695b Content-length: 128 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN8s C C( adns), Revision-number: 2687 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2003-01-23T13:05:08.000000Z K 7 svn:log V 20 Mention README.mac. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3c495f4a2f8e3da6d19b1234f1a573a0 Text-delta-base-sha1: 9b813cea056fcbf84bb64d8572ea77f476770c49 Text-content-length: 156 Text-content-md5: 9e84ac5c596bfbd5859dca26b7b38ae4 Text-content-sha1: fe048f55304c15e827eb7d50f85036694cca3fad Content-length: 195 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN  See README.mac in the sources for the current state of the world. Revision-number: 2688 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 17 Link to gui-auth K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-23T13:07:10.000000Z PROPS-END Node-path: putty-wishlist/data/avoid-msgbox Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f5ddc1b26bb8f0e49d9c6707ebbc2b1b Text-delta-base-sha1: 24b5637b602d0932b7dd4ed900f16382474e0a13 Text-content-length: 79 Text-content-md5: b0b54b4046d7bfaa014380567a3589dd Text-content-sha1: ef9c68a4b0d26435f563835a166a13453d7a5ee8 Content-length: 118 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN@?@(See also discussion in gui-auth.) Revision-number: 2689 Prop-content-length: 127 Content-length: 127 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-23T13:09:36.000000Z K 7 svn:log V 27 Depends: portable-keyboard PROPS-END Node-path: putty-wishlist/data/key-mapping Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a0c0d08a5ef1a5c18a80407ef9d9f064 Text-delta-base-sha1: 78b9d88ceea8fb21e1d824b58f63659f387d5bab Text-content-length: 148 Text-content-md5: 1715ae1f739eac7ea1d50828404cff24 Text-content-sha1: f2310f3e97cb9173c9fd482309a2f4365c999fdb Content-length: 187 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN|| uteDepends: portable-keyboard(See portable-keyboard for further discussion of this problem.) Revision-number: 2690 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2003-01-23T13:25:22.000000Z K 7 svn:log V 35 Flesh out + suggest persistent log K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pageant-logging Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0718fbd43ed8b321fa718e4ea555f8c6 Text-delta-base-sha1: 22f5b1419ec72b6b869a0093472d373a84db882c Text-content-length: 283 Text-content-md5: 558536e7948f314d2eff052aa010074f Text-content-sha1: b9764d6d187e7830e69909b7c7be0e07ad65d976 Content-length: 322 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN d\ Perhaps a persistent disk log would also be useful.

    If nothing else, this gives you a means of finding out if agent forwardings have been unexpectedly abused.

    Probably depends on better key management to some extent. Revision-number: 2691 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 Summary: Visual/aural indication of Pageant activity Priority: low K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-23T13:25:58.000000Z PROPS-END Node-path: putty-wishlist/data/pageant-activity-ind Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 787 Text-content-md5: 4605fe92671cca67faf30cdff0618d03 Text-content-sha1: 46a6fdbe3abf11dd348df0beea528e15c5f8896b Content-length: 903 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Visual/aural indication of Pageant activity Class: wish Difficulty: fun Priority: low Content-type: text/x-html-body

    When Pageant performs an action such as signing something, perhaps we should indicate this is going on in some way - by tweaking its icon in the system tray, or playing a sound, or something. That way, attentive users might stand a chance of noticing unexpected activity, and could then check an event log for potential abuse of agent forwardings.

    Not sure how exactly to animate the icon, whether it should be different for different operations, and so on.

    Some people would undoubtedly find this annoying and intrusive and place lots of trust in their servers, so it should be configurable off. Revision-number: 2692 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2003-01-23T13:26:47.000000Z K 7 svn:log V 11 Tweak HTML K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/port-wince Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 446fba611ebe1462b8ad2f71f23d3065 Text-delta-base-sha1: fb2fba25abd09c5958c72f45b7c4d0eeeec0d0f4 Text-content-length: 44 Text-content-md5: 06559659c9f25d66f9ecac33d41aa178 Text-content-sha1: e8d9c994c99f8c42b97cbd50007c7cba711a9b06 Content-length: 83 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNiq}e |m

    There will p

    Revision-number: 2693 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2003-01-23T13:28:57.000000Z K 7 svn:log V 51 Cross-link `many-sessions' and `reorder-sessions'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/many-sessions Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c497df4148798c0301f885bc38f17369 Text-delta-base-sha1: 9414412dd5283e8ba551c04122494fbfe4c37fec Text-content-length: 75 Text-content-md5: 5ad4a63b2471298329baf23c54c8e52d Text-content-sha1: f758dbf06fac704aebd2b5ea10e1fc9f0d528e90 Content-length: 114 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNKp 6>|O sort the sessions Node-path: putty-wishlist/data/reorder-sessions Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ffb861e8a7a249049d01ed911d21139a Text-delta-base-sha1: 0bea44ed03f738dcbd3e1aba3e401938e23fe02c Text-content-length: 78 Text-content-md5: 4c90b9e6e8fab70692aa5d6dbc9a2a0c Text-content-sha1: f9c221a267db4e569e49775f8a3789971e24e4fb Content-length: 117 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN: 9v  more than one screenful Revision-number: 2694 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2003-01-23T13:30:25.000000Z K 7 svn:log V 58 Flesh out `Need to think about how this fits into our UI' K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7fa33b033ec39f412967c1106ec78ad0 Text-delta-base-sha1: 4fab266b52aaf4edc9fdb146b4dede00e18924fb Text-content-length: 171 Text-content-md5: cf8117f0de8d0c9f744f02127cc40c6e Text-content-sha1: 57f528dadd1dbf438f022ae8c9988fedd46be248 Content-length: 210 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN3 - unlike every other backend so far, serial connections have neither hostname nor port, and other connections don't have stop bits and guff like that. Revision-number: 2695 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 2003-01-23T13:43:35.000000Z K 7 svn:log V 161 Summary: SSH-2 agent forwarding with ssh.com's product Lifted straight from section 9.4 of the docs. I've not bothered to verify whether it's still true or not. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/agentfwd-ssh.com Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 563 Text-content-md5: 5e3143355732b24de20c6aea1c5161ff Text-content-sha1: 64ebf3d329445313a6e55238b7c60916bf4aae8c Content-length: 679 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN%%%Summary: SSH-2 agent forwarding with ssh.com's product Class: wish Priority: medium Difficulty: taxing Content-type: text/x-html-body

    At present, agent forwarding in SSH-2 is only available when your SSH server is OpenSSH. The ssh.com server uses a different agent protocol which they have not published. If you would like PuTTY to be able to support agent forwarding to an ssh.com server, please write to ssh.com and explain to them that they are hurting themselves and their users by keeping their protocol secret. Revision-number: 2696 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2003-01-23T14:25:29.000000Z K 7 svn:log V 98 Remove Cyrillic-lock per Simon's suggestion. Sketch out a kind of an API for people to criticise. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/portable-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2c80e23e90e9bfc2a4140e616813cd47 Text-delta-base-sha1: 20fcb070ef2222dbf8068f365a6b9e46157cc9c1 Text-content-length: 2617 Text-content-md5: 4618f7956318f922643cacac0e0724cc Text-content-sha1: 997621be4d7213834feec0bb0c0cded48bf8298d Content-length: 2656 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN>1|~q4yyY~SyRu #include hasfile = FALSE; else { s->hasfile = TRUE; s->savefile = *fss; } sesshandle = open_settings_r_fsp(fss); if (sesshandle == NULL) { /* XXX need a way to pass up an error number */ err = -9999; goto fail; } load_open_settings(sesshandle, TRUE, &s->cfg); close_settings_r(sesshandle); noErr; fail: sfree(s); return err; } void mac_opensession(void) { StandardFileReply sfr; static const OSType sftypes[] = { 'Sess', 0, 0, 0 }; StandardGetFile(NULL, 1, sftypes, &sfr); if (!sfr.sfGood) return; mac_opensessionfrom(&sfr.sfFile); /* XXX handle error */pascal OSErr mac_aevt_oapp(const AppleEvent *req, AppleEvent *reply, long refcon) { DescType type; Size size; if (AEGetAttributePtr(req, keyMissedKeywordAttr, typeWildCard, &type, NULL, 0, &size) == noErr) return errAEParamMissed; /* XXX we should do something here. */ return noErr; } pascal OSErr mac_aevt_odoc(const AppleEvent *req, AppleEvent *reply, long refcon) { DescType type; AEKeyword keywd; Size size; AEDescList docs = { typeNull, NULL }; OSErr err; long ndocs, i; FSSpec fss; err = AEGetParamDesc(req, keyDirectObject, typeAEList, &docs); if (err != noErr) goto out; if (AEGetAttributePtr(req, keyMissedKeywordAttr, typeWildCard, &type, NULL, 0, &size) == noErr) { err = errAEParamMissed; goto out; } err = AECountItems(&docs, &ndocs); if (err != noErr) goto out; for (i = 0; i < ndocs; i++) { err = AEGetNthPtr(&docs, i, typeFSS, &keywd, &type, &fss, sizeof(fss), &size); if (err != noErr) goto out; err = mac_opensessionfrom(&fss); if (err != noErr) goto out; } out: AEDisposeDesc(&docs); return err; } pascal OSErr mac_aevt_pdoc(const AppleEvent *req, AppleEvent *reply, long refcon) { DescType type; Size size; if (AEGetAttributePtr(req, keyMissedKeywordAttr, typeWildCard, &type, NULL, 0, &size) == noErr) return errAEParamMissed; /* We can't meaningfully do anything here. */ return errAEEventNotHandled Revision-number: 2701 Prop-content-length: 123 Content-length: 123 K 7 svn:log V 25 Mention rlogin URLs too. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-23T23:27:40.000000Z PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 79fdcaeab7293e5bec7c542a540de52f Text-delta-base-sha1: c7256d521f1a1e6fa7ea1579ab60c7378a1c7d84 Text-content-length: 46 Text-content-md5: c2347823c43867196ca32ef283293f08 Text-content-sha1: 60ed893507d2b623696a7645dbd812cf23616dc8 Content-length: 85 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNKY >Ilogin", and "raw") URLs Revision-number: 2702 Prop-content-length: 220 Content-length: 220 K 8 svn:date V 27 2003-01-23T23:58:44.000000Z K 7 svn:log V 119 Summary: Port to Win32s Dump of our last couple of years' occasional bimbling around trying to get Win32s to go again. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/port-win32s Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1102 Text-content-md5: 3fb6ef68dd7163be3bd1466333a27ffd Text-content-sha1: 364ab8f50d3ca5a680c65a5dbc3bc26f8cffa0b9 Content-length: 1218 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN@@@Summary: Port to Win32s Class: wish Difficulty: taxing Priority: medium Content-type: text/x-html-body

    It shouldn't in principle be too difficult to arrange that PuTTY can be built for Win32s (an extension to Windows 3.1 to let you run 32-bit programs).

    The last vaguely useful Win32s build I know of is from 1999 Nov 4, and even then the configuration dialog didn't work. The most recent attempt (2001 May 17) had a working config dialog, but crashed on starting a session, and as such doesn't really represent progress.

    Compiler/linker support is required for a Win32s build. At the least, the binary must have a .reloc section (symptom of its not doing so is "Invalid format"). MSVC 4 (4.1 or earlier, not 4.2 or later) can build for Win32s with /fixed:no, and mingw32 appears to be able to build with vile dlltool hacks, although I don't think there's suitable startup code.

    Increasing use of Windows' Unicode functions may spell doom for a Win32s port. Not sure.

    Help here would be most welcome. Revision-number: 2703 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2003-01-24T00:25:33.000000Z K 7 svn:log V 145 Redesign the macnet.c infrastructure, largely so as to avoid using Gestalt(), which didn't detect the MacTCP emulation in Owen's Open Transport. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 152c85b80691cacabdc2582bffc20a4a Text-delta-base-sha1: fe938e2f77d1f088e90a41ea11ae3dae40c706b0 Text-content-length: 84 Text-content-md5: d5b78ba576a8b656749594dd491d5337 Text-content-sha1: 3882b40371205f376d772619c8ae64520b1e8f80 Content-length: 124 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNq&6\'BR/* $Id: mac.c,v 1.36 2003/01/24 00:25:3 sk_init()sk Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 155893d1506cc755db0a876b6f500777 Text-delta-base-sha1: e2e70e01f039f05a130655d9dbcdb3dcb2961b67 Text-content-length: 61 Text-content-md5: 9fccc22b77ed6d18fe11c2ae576d99ef Text-content-sha1: c670cc7ff355b42426536ae2296f69cd4eab34ff Content-length: 101 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNt}#:8`h acnet.c */ extern void sk_poll(void Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b98c210bbd7233b4f0805ef3b98b1dab Text-delta-base-sha1: 6524d41345fcdff6fc0c85212a113c51b88b6ddf Text-content-length: 2909 Text-content-md5: b0e7e069e029ec20589da15e7fb6177e Text-content-sha1: 572629c30961eb28db355d92e598e53b93bf5151 Content-length: 2948 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNR96P8b~Wj_fK#include "putty.h" #include "network.h" #include "mac.h" struct macnet_stack { SockAddr (*namelookup)(char const *, char **); SockAddr (*nonamelookup)(char const *); void (*getaddr)(SockAddr, char *, int); int (*hostname_is_local)(char *); int (*address_is_local)(SockAddr); int (*addrtype)(SockAddr); void (*addrcopy)(SockAddr, char *); void (*addr_free)(SockAddr); Socket (*skregister)(void *, Plug); /* "register" is a reserved word */ Socket (*new)(SockAddr, int, int, int, int, Plug); Socket (*newlistener)(char *, int, Plug, int); char *(*addr_error)(SockAddr); void (*poll)(void); void (*cleanup)(void); }; static struct macnet_stack *stack; static struct macnet_stack ot = { ot_namelookup, ot_nonamelookup, ot_getaddr, ot_hostname_is_local, ot_address_is_local, ot_addrtype, ot_addrcopy, ot_addr_free, ot_register, ot_new, ot_newlistener, ot_addr_error, ot_poll, ot_cleanup }; static struct macnet_stack mactcp = { mactcp_namelookup, mactcp_nonamelookup, mactcp_getaddr, mactcp_hostname_is_local, mactcp_address_is_local, mactcp_addrtype, mactcp_addrcopy, mactcp_addr_free, mactcp_register, mactcp_new, mactcp_newlistener, mactcp_addr_error, mactcp_poll, mactcp_cleanup }; void sk_init(void) { #if 0 if (ot_init() == noErr) stack = &ot; else #endif if (mactcp_init() == noErr) stack = &mactcp; else stack = NULL; }stack != NULL) return stack->namelookup(host, canonicalname); return NULL; } SockAddr sk_nonamelookup(char const *host) { if (stack != NULL) return stack->nonamelookup(host); return NULL; } void sk_getaddr(SockAddr addr, char *buf, int buflen) { if (stack != NULL) stack->getaddr(addr, buf, buflen); else *buf = '\0'; } int sk_hostname_is_local(char *name) { if (stack != NULL) return stack->hostname_is_local(name); return 0; } int sk_address_is_local(SockAddr addr) { if (stack != NULL) return stack->address_is_local(addr); return 0; } int sk_addrtype(SockAddr addr) { if (stack != NULL) return stack->addrtype(addr); return 0; } void sk_addrcopy(SockAddr addr, char *buf) { if (stack != NULL) stack->addrcopy(addr, buf); } void sk_addr_free(SockAddr addr) { if (stack != NULL) stack->addr_free(addr); } Socket sk_register(void *sock, Plug plug) { if (stack != NULL) return stack->skregister(sock, plug); stack != NULL) return stack->new(addr, port, privport, oobinline, nodelay, plug); stack != NULL) return stack->newlistener(srcaddr, port, plug, local_host_only); return NULL; } char *sk_addr_error(SockAddr addr) { if (stack != NULL) return stack->addr_error(addr); return "No TCP/IP stack installed"; } void sk_poll(void) { if (stack != NULL) stack->poll(); } void sk_cleanup(void) { if (stack != NULL) stack-> Revision-number: 2704 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2003-01-24T00:28:57.000000Z K 7 svn:log V 33 Add a bug and a missing feature. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 667e2b5116af5a51afbbf1f42f1c948b Text-delta-base-sha1: 1204d895d84b824a428b4f355ab9f6ad800df5b3 Text-content-length: 200 Text-content-md5: fd68525635a1a71e31ef31d96a4b655e Text-content-sha1: d7cac6c9181b23dd0c8967453fe93b80a68fd67a Content-length: 240 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNLN&*>;kRwD$Id: README.mac,v 1.15 2003/01/24 00:28:57 * When the last terminal window closes, the Edit menu doesn't get disabled immediately, which it shouldListening sockets Revision-number: 2705 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2003-01-24T00:37:27.000000Z K 7 svn:log V 32 We'd like full-screen mode too. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fd68525635a1a71e31ef31d96a4b655e Text-delta-base-sha1: d7cac6c9181b23dd0c8967453fe93b80a68fd67a Text-content-length: 79 Text-content-md5: 469e79fdc205ba7de9f92eb130de261a Text-content-sha1: 17001a6b666484be1cee1fc2847957b65e94f8bc Content-length: 119 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNNc 9)",$Id: README.mac,v 1.16 2003/01/24 00:37:2Full screen mode Revision-number: 2706 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 2nd MD5 utility has moved according to Ivan Lendl. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-24T00:40:04.000000Z PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 507730755bd2ddf84feea694f871a0c8 Text-delta-base-sha1: f0c7c0b5ab8f56c2cdcfaab09b7cb73d977e851b Text-content-length: 30 Text-content-md5: 7243d270e9dd76249745c0b586252085 Text-content-sha1: c0de3963955cc710ebe03695c693420eb8129613 Content-length: 69 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN/ <T[3l.com Revision-number: 2707 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:41.309953Z PROPS-END Revision-number: 2708 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:41.318975Z PROPS-END Revision-number: 2709 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:41.327218Z PROPS-END Revision-number: 2710 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:41.340132Z PROPS-END Revision-number: 2711 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2003-01-24T11:55:35.000000Z K 7 svn:log V 13 content-type K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/icon-title-default-change Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 39d86014ebd9cd72f13b70a8ad6d6ac6 Text-delta-base-sha1: b6cba127ae9ee6f8057931e33eab19594a285ddc Text-content-length: 51 Text-content-md5: d57e4b597551b7e6e07c3370ab27fc3f Text-content-sha1: 87c6f40014952918dbd25a22586bdce763635c78 Content-length: 90 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN\{ VContent-type: text/x-html-body Revision-number: 2712 Prop-content-length: 190 Content-length: 190 K 7 svn:log V 90 Marked as fixed on the strength of it fixing Dameon D. Welch-Abernathy's ser2net problem. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-24T13:03:14.000000Z PROPS-END Node-path: putty-wishlist/data/telnet-binary Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 53ab58244798a3ee5d146525d0047607 Text-delta-base-sha1: e1682ed6b7cbb606d04f7273cd59c7c671b96148 Text-content-length: 42 Text-content-md5: e408f0140345a8fc7cea651a8d13d3de Text-content-sha1: d79f8b1a626dd25582d8062ee560f1a0888bcf17 Content-length: 81 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNU& zyFixed-in: 2002-12-20. Revision-number: 2713 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 2003-01-24T14:08:45.000000Z K 7 svn:log V 9 Add

  • K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 19bde74500a7ea6e6af81fb762730153 Text-delta-base-sha1: 706dedd49a5a5c646c515591b42dd19c85c6d992 Text-content-length: 24 Text-content-md5: 0c504fee30f2d55dfb4321d1e9bffc25 Text-content-sha1: c948c87daba569fb9e2dcce9347b62999326bde6 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN-2 GhEli> Revision-number: 2714 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 Change website refs from putty/wishlist.html to putty/wishlist/ K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-01-24T14:12:31.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b4ff9d20e83a17b0433678d650722189 Text-delta-base-sha1: 26e6d149c0856922a5e53ca0d367208f382256bd Text-content-length: 76 Text-content-md5: a377281a51e380d4858c49f34c977ad7 Text-content-sha1: 3b47f0533310e8906dc05c93e89ca016ff1e4d0a Content-length: 116 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNGC 32~I\versionid $Id: faq.but,v 1.42 2003/01/24 14:12:31/ Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4f72371cca43f08dbee9393aec9f07c9 Text-delta-base-sha1: 5bace015eac70c23ff418deac8fd2600e81788f7 Text-content-length: 86 Text-content-md5: d02613f75bfb068bb1e363701dd9d6d9 Text-content-sha1: 6a52f09e4ec01f3d64f37c28c61e340de180c399 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN8V6+FA\versionid $Id: feedback.but,v 1.12 2003/01/24 14:12:3// Revision-number: 2715 Prop-content-length: 184 Content-length: 184 K 7 svn:log V 86 AEGetNthPtr() is stupid and counts from 1. Allowing for this gets aevt/odoc working. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-25T14:04:47.000000Z PROPS-END Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 904b8ae277e3b966e8862585d3c8a2d5 Text-delta-base-sha1: ab68812b31719a5c66a291de1b79a1d299178b97 Text-content-length: 117 Text-content-md5: b6b4bf3839aac65d80b1aa26a3eb102d Text-content-sha1: 6fd9ccabf847030e49221b2803465799cd201ce1 Content-length: 156 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNpt _9*\/* $Id: macdlg.c,v 1.7 2003/01/25 14:04:47 + 1, typeFSS, &keywd, &type, &fss, sizeof(fss), Revision-number: 2716 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2003-01-25T14:07:50.000000Z K 7 svn:log V 117 We now have _some_ useful AE support, so mention what's missing specifically. Also mentio lack of Duplicate Session. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 469e79fdc205ba7de9f92eb130de261a Text-delta-base-sha1: 17001a6b666484be1cee1fc2847957b65e94f8bc Text-content-length: 236 Text-content-md5: c68018d742d61b60463142e5f13918db Text-content-sha1: 0983b6fdbe02d5040b505b7ead4c9e1df28adab6 Content-length: 276 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNc;O*-$?$Id: README.mac,v 1.17 2003/01/25 14:07:50Do something with Open Application Apple Events. * Warn-on-close. * Close-on-exit. * Warn-on-quit. * Event log. * Duplicate session * Handle 'gurl' Apple Events Revision-number: 2717 Prop-content-length: 189 Content-length: 189 K 7 svn:log V 91 Ensure that development snapshots have a version number higher than the preceding release. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-25T14:09:47.000000Z PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7ced8a09028f7bd1793c03cc34e00a61 Text-delta-base-sha1: 29201e433e0d604f0378154f04083e77889f5be5 Text-content-length: 289 Text-content-md5: 14ec34f863f3406d025f4281202a86c8 Text-content-sha1: 1d3ab71f956c40812f38222d15305a6abc6ee885 Content-length: 329 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNl@xl,fsb_f b/* $Id: mac_res.r,v 1.22 2003/01/25 14:09:47#ifdef RELEASE VERSION_MAJOR, VERSION_MINOR, beta, #else VERSION_MAJOR, VERSION_MINOR + 1,#ifdef RELEASE VERSION_MAJOR, VERSION_MINOR, beta, #else VERSION_MAJOR, VERSION_MINOR + 1, Revision-number: 2718 Prop-content-length: 202 Content-length: 202 K 7 svn:log V 103 Add support for "Duplicate Session", moving back-end selection into mac_startsession() in the process. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-25T15:15:40.000000Z PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d5b78ba576a8b656749594dd491d5337 Text-delta-base-sha1: 3882b40371205f376d772619c8ae64520b1e8f80 Text-content-length: 171 Text-content-md5: 48680975fb5966d5509cae95eb06b0ef Text-content-sha1: a8238b4cdcaa9ba73eb10fe30913922867255521 Content-length: 211 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN& S(IgD,:l/* $Id: mac.c,v 1.37 2003/01/25 15:15:40 case iDuplicate: mac_dupsessionEnableItem(menu, iDuplicateDisableItem(menu, iDuplicate Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9fccc22b77ed6d18fe11c2ae576d99ef Text-delta-base-sha1: c670cc7ff355b42426536ae2296f69cd4eab34ff Text-content-length: 24 Text-content-md5: 8b7ca0ace2362b355235f2f90fdcb7ab Text-content-sha1: 95378351f66fd23e0c2bdf79b32039dbe3e79128 Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN} QK2dup Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 14ec34f863f3406d025f4281202a86c8 Text-delta-base-sha1: 1d3ab71f956c40812f38222d15305a6abc6ee885 Text-content-length: 136 Text-content-md5: 1094e43720c5a6776111cef634eeabef Text-content-sha1: 4da5e32eb97cb0691f27a6605e22454ec85e2a46 Content-length: 176 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN@a,}1"/* $Id: mac_res.r,v 1.23 2003/01/25 15:15:40011110-", noicon, nokey,Duplicate", noicon, "D", Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b6b4bf3839aac65d80b1aa26a3eb102d Text-delta-base-sha1: 6fd9ccabf847030e49221b2803465799cd201ce1 Text-content-length: 457 Text-content-md5: b9dcf369d17d8ce88e615fff97d99d66 Text-content-sha1: 5421969aab0179e10ebcd7edb035d5783d1b1297 Content-length: 496 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNtl&*.b|y}p/* $Id: macdlg.c,v 1.8 2003/01/25 15:15:40void mac_dupsession(void) { Session *s1 = (Session *)GetWRefCon(FrontWindow()); Session *s2; s2 = smalloc(sizeof(*s2)); memset(s2, 0, sizeof(*s2)); s2->cfg = s1->cfg; s2->hasfile = s1->hasfile; s2->savefile = s1->savefile; mac_startsession(s2); } static OSErr mac_opensessionfrom(FSSpec *fss) { FInfo fi; Session *s; void *sesshandle Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 65531e5a72bf1606c2e6e6b8525dcb4b Text-delta-base-sha1: de995e0d99b347d1ab144d1abf05d5ac9f29ba3b Text-content-length: 142 Text-content-md5: 40e6c5390a739212659f46f7b0417337 Text-content-sha1: 7d3f95ef61a31c694ad8c76c885d87be21c47486 Content-length: 181 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN"7 w ,K6l/* $Id: macresid.h,v 1.6 2003/01/25 15:15:404 #define iSave 5 #define iSaveAs 6 #define iDuplicate 7 #define iQuit 9 Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dc14f397e3ada405c8dbc711541c1764 Text-delta-base-sha1: 328c7f5e3f9d4fb77e2280a61dff9311e0382b04 Text-content-length: 505 Text-content-md5: d5c4a86ea45308ef960e68dd2240a9fe Text-content-sha1: 1a33be1108d6f8e1741f7ed33c8f9de9027f98a0 Content-length: 545 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVN@aWy,S6>/* $Id: macterm.c,v 1.53 2003/01/25 15:15:40 int i; init_ucs(s); /* * Select protocol. This is farmed out into a table in a * separate file to enable an ssh-free variant. */ s->back = NULL; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == s->cfg.protocol) { s->back = backends[i].backend; break; } if (s->back == NULL) fatalbox("Unsupported protocol number found"); EnableItem(menu, iDuplicate Revision-number: 2719 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 27 Duplicate Session is done. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-25T15:18:51.000000Z PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c68018d742d61b60463142e5f13918db Text-delta-base-sha1: 0983b6fdbe02d5040b505b7ead4c9e1df28adab6 Text-content-length: 63 Text-content-md5: 2c6261bd16177582d21316cec9047f86 Text-content-sha1: 5bfbace7568aec0c9067d61edbcdd773aff3fd6f Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN;% **lO$Id: README.mac,v 1.18 2003/01/25 15:18:51 Revision-number: 2720 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2003-01-25T15:21:54.000000Z K 7 svn:log V 105 The PowerPC build works on Owen's Mac, which doesn't have AppearanceLib, so that bug's definitely fixed. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2c6261bd16177582d21316cec9047f86 Text-delta-base-sha1: 5bfbace7568aec0c9067d61edbcdd773aff3fd6f Text-content-length: 63 Text-content-md5: bc7515170aebbec0d3e92c07103ab43a Text-content-sha1: 036c04689bcbe61522ca352851ee7c4d84ea8db3 Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN% **VO$Id: README.mac,v 1.19 2003/01/25 15:21:54 Revision-number: 2721 Prop-content-length: 560 Content-length: 560 K 8 svn:date V 27 2003-01-25T16:16:45.000000Z K 7 svn:log V 461 Change the term_mouse interface a little so that it gets passed both the raw and the cooked mouse button, with the mapping being done in advance by the front-end. This is useful because it allows the front-end to use information other than the raw button (e.g. the modifier state) to decide which cooked button to generate. . Front ends other than the Mac one are untested, but they just call translate_button() themselves and pass the result to term_mouse(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d5c4a86ea45308ef960e68dd2240a9fe Text-delta-base-sha1: 1a33be1108d6f8e1741f7ed33c8f9de9027f98a0 Text-content-length: 319 Text-content-md5: 6f37c65a6c8ccf1dab8832d3c51e5fb6 Text-content-sha1: ddef0031e3839a40eeab144ab11f9ef96b0ca0e0 Content-length: 359 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNa O,Z7kE+YF#57*/* $Id: macterm.c,v 1.54 2003/01/25 16:16:44term_mouse(s->term, MBT_LEFT, event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELEC MBT_LEFT, event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELECMBT_LEFT, event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELEC Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f12b96fa0c7803b08ab25c553b90cf49 Text-delta-base-sha1: 658b4b5f62a3a7d1b68344c4a3aeb7295906cc73 Text-content-length: 53 Text-content-md5: f5864dbf00c358fbb3301d22974c045c Text-content-sha1: b9237970f6e2b0c7ef5d48fc7a21d05bfa90c487 Content-length: 94 K 15 cvs2svn:cvs-rev V 5 1.195 PROPS-END SVNY*[}:Button, Mouse_Action, Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f1320ca9bfeea30bf838f437f99e4595 Text-delta-base-sha1: 988b4631dc08cab416839f8cf036b748cfdf043d Text-content-length: 375 Text-content-md5: c1797d2690bfe3f709ed7f1f9d93cd7c Text-content-sha1: e7139ecc959538b170797183fdaf44a704a50c30 Content-length: 416 K 15 cvs2svn:cvs-rev V 5 1.131 PROPS-END SVNB>CFej+8>T$9x1~}RIvraw, Mouse_Button bcooked, Mouse_Action a, int x, int y, rawraw) return; term->mouse_is_down = brawcookedcookedcooked == MBT_SELECT && a == MA_DRAG) || (bcookedcooked == MBT_EXTEND && a != MA_DRAG && cooked == MBT_SELECT || bcooked == MBT_EXTEND) && cooked Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5b16ab24582cc74cd47a11d5fca3bd0c Text-delta-base-sha1: 8d65a790f71f5b1a14c1d3beafa367ad46f7527f Text-content-length: 126 Text-content-md5: f5f30af40ce4fddf8ca677691b8777c5 Text-content-sha1: 0b0244948d409a4f3f3b6f3365db32911e912db2 Content-length: 166 K 15 cvs2svn:cvs-rev V 4 1.90 PROPS-END SVN> Wbib%OB|static translate_button(button), act, translate_button(button), MA_DRAG, Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6bef319be818bae4328fa13026e48e68 Text-delta-base-sha1: e91e11b3d4ae407e83c39d6221d6903286b526b9 Text-content-length: 593 Text-content-md5: df94183b6a61826530a4a3dd31c46fea Text-content-sha1: 4f57781177883853119e21d6772dad1e8509be3e Content-length: 634 K 15 cvs2svn:cvs-rev V 5 1.234 PROPS-END SVN>nCfO-\ TP{3J|Mouse_Button translate_button(void *frontend, Mouse_Button button);translate_button(b), MA_CLICK, translate_button(b), lastact, static translate_button(button)translate_button(b), MA_DRAG, translate_button(b)translate_button(b), 4&rr4eturn 0; return -1; } void request_paste(void *frontend) { /* * In Windows, pasting is synchronous: we can read the * clipboard with no difficulty, so request_paste() can just go * ahead and paste. */ term_do Revision-number: 2722 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 Fix minor breakage on Windows as a result of term_mouse revamp. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-25T16:22:49.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: df94183b6a61826530a4a3dd31c46fea Text-delta-base-sha1: 4f57781177883853119e21d6772dad1e8509be3e Text-content-length: 79 Text-content-md5: 35801552dfe9bc51333cb415b084a439 Text-content-sha1: 4c55eb1d6131b93a844ddb35586dec521c3f610e Content-length: 120 K 15 cvs2svn:cvs-rev V 5 1.235 PROPS-END SVN C=eturn 0; return -1; } void& Revision-number: 2723 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2003-01-25T16:23:48.000000Z K 7 svn:log V 48 Fix Unix breakage from term_mouse() revamp too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f5f30af40ce4fddf8ca677691b8777c5 Text-delta-base-sha1: 0b0244948d409a4f3f3b6f3365db32911e912db2 Text-content-length: 23 Text-content-md5: 45700368f3f847770480ff981ff511f4 Text-content-sha1: 12c83d336b85a45a6047c0155955247d03654c78 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.91 PROPS-END SVN y r Revision-number: 2724 Prop-content-length: 323 Content-length: 323 K 8 svn:date V 27 2003-01-25T17:20:54.000000Z K 7 svn:log V 224 Add support for copying non-Unicode text to the clipboard. We also send a simple 'styl' record along with it to specify the font and suchlike. I'm not sure it's worth making this optional in the way the RTF is in Windows. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bc7515170aebbec0d3e92c07103ab43a Text-delta-base-sha1: 036c04689bcbe61522ca352851ee7c4d84ea8db3 Text-content-length: 485 Text-content-md5: 71c6dd7a5d70ef5279de59ce4259a7ec Text-content-sha1: cfe05084f2a4f27dc71f9f1aec16374fb8e4e26b Content-length: 525 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNB,'hQo>BQ$Id: README.mac,v 1.20 2003/01/25 17:20 * When using the "VT100" font, text copied to the clipboard doesn't get newlines in it, because that font has a graphic character at position 0x0d. Even if we did insert 0x0d manually, TextEdit insists on displaying the graphic version, so I think we need a font switch at this point. This can be seen as a special case of the need to switch fonts to get odd characterspaste, for script codes? Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6f37c65a6c8ccf1dab8832d3c51e5fb6 Text-delta-base-sha1: ddef0031e3839a40eeab144ab11f9ef96b0ca0e0 Text-content-length: 1440 Text-content-md5: 7fda2e3bb53d313b594ac91d4f9d1b75 Text-content-sha1: 1b2aca3a17a8accf97aa8328f7bf2052b1bd4ecd Content-length: 1480 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN-e+&4-u{F{#x=)g5/* $Id: macterm.c,v 1.55 2003/01/25 17:20:5 { Session *s = cookie; char *mactextbuf; ByteCount iread, olen; wchar_t *unitextptr; StScrpRec *stsc; size_t stsz; OSErr err; int i; Maybe PICT scrap too. */ if (ZeroScrap() != noErr) return; PutScrap(len * sizeof(*data), 'utxt', data); /* Replace LINE SEPARATORs with CR for TEXT output. */ for (i = 0; i < len; i++) if (data[i] == 0x2028) data[i] = 0x000d; mactextbuf = smalloc(len); /* XXX DBCS */(UniChar *)data, len, &iread, &olen, mactextbuf); if (err != noErr && err != kTECUsedFallbacksStatus) return; } else if (s->font_charset != CS_NONE) { unitextptr = datareturn; PutScrap(olen, 'TEXT', mactextbuf); sfree(mactextbuf); stsz = offsetof(StScrpRec, scrpStyleTab) + sizeof(ScrpSTElement); stsc = smalloc(stsz); stsc->scrpNStyles = 1; stsc->scrpStyleTab[0].scrpStartChar = 0; stsc->scrpStyleTab[0].scrpHeight = s->font_height; stsc->scrpStyleTab[0].scrpAscent = s->font_ascent; stsc->scrpStyleTab[0].scrpFont = s->fontnum; stsc->scrpStyleTab[0].scrpFace = 0; stsc->scrpStyleTab[0].scrpSize = s->cfg.fontheight; stsc->scrpStyleTab[0].scrpColor.red = 0; stsc->scrpStyleTab[0].scrpColor.green = 0; stsc->scrpStyleTab[0].scrpColor.blue = 0; PutScrap(stsz, 'styl', stsc); sfree(stsc Revision-number: 2725 Prop-content-length: 220 Content-length: 220 K 7 svn:log V 121 Don't pass NULL to strcmp. Instead, if the user passes a font of NULL, only match table entries where the font is NULL. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-25T19:21:56.000000Z PROPS-END Node-path: putty/charset/macenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7e1be7c16059ac8d85c909ef785d0576 Text-delta-base-sha1: 66a5787a7bc7bc4d7e8eb206836ff521e00fa83b Text-content-length: 127 Text-content-md5: 8a21c49fabf4efd668c00b474da19690 Text-content-sha1: 536b1b7dc527f3f3e6bb638a032536966a671d90 Content-length: 166 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNE[ j7*@: /* $Id: macenc.c,v 1.2 2003/01/25 19:21:56(fontname != NULL && strcmp(macencs[i].fontname, fontname) == 0) Revision-number: 2726 Prop-content-length: 275 Content-length: 275 K 7 svn:log V 176 Support for pasting 'TEXT', ie text in the local character set. At the moment, we assume it's in the system script -- later we should check for 'styl' scrap in case it isn't. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-25T19:23:03.000000Z PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 71c6dd7a5d70ef5279de59ce4259a7ec Text-delta-base-sha1: cfe05084f2a4f27dc71f9f1aec16374fb8e4e26b Text-content-length: 119 Text-content-md5: c777f1fd0451b69fad12f94b5c0e8db3 Text-content-sha1: ddcb5ad448608ca50919730ab54b9f8cfccf582f Content-length: 159 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN&W.*cV|HBE$Id: README.mac,v 1.21 2003/01/25 19:23:03 * Pasting large blocks of text doesn't work. Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7fda2e3bb53d313b594ac91d4f9d1b75 Text-delta-base-sha1: 1b2aca3a17a8accf97aa8328f7bf2052b1bd4ecd Text-content-length: 1671 Text-content-md5: 055fb05d9948934aa50a355f73747c6b Text-content-sha1: edf2757a5a3bb43bdf198a53224941f8e83bda8a Content-length: 1711 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN_ Yu,T`,tvW=R/* $Id: macterm.c,v 1.56 2003/01/25 19:23:03static wchar_t *data = NULL; Handle texth; long offset; int textlen; TextEncoding enc; TextToUnicodeInfo scrap_to_uni; ByteCount iread, olen; int charset; char *tptr; OSErr err if (data != NULL) sfree(data); data = NULL; } else { if (GetScrap(NULL, 'utxt', &offset) > 0) { if (h == NULL) } else if (GetScrap(NULL, 'TEXT', &offset) > 0) { texth = NewHandle(0); textlen = GetScrap(texth, 'TEXT', &offset); HLock(texth); data = smalloc(textlen * 2); /* XXX should use 'styl' scrap if it's there. */ if (mac_gestalts.encvvers != 0 && UpgradeScriptInfoToTextEncoding(smSystemScript, kTextLanguageDontCare, kTextRegionDontCare, NULL, &enc) == noErr && CreateTextToUnicodeInfoByEncoding(enc, &scrap_to_uni) == noErr) { err = ConvertFromTextToUnicode(scrap_to_uni, textlen, *texth, 0, 0, NULL, NULL, NULL, textlen * 2, &iread, &olen, data); DisposeTextToUnicodeInfo(&scrap_to_uni); if (err == noErr) { *p = data; *lenp = olen / sizeof(**p); } else { *p = NULL; *lenp = 0; } } else { charset = charset_from_macenc(GetScriptManagerVariable(smSysScript), GetScriptManagerVariable(smRegionCode), mac_gestalts.sysvers, NULL); if (charset != CS_NONE) { tptr = *texth; *lenp = charset_to_unicode(&tptr, &textlen, data, textlen * 2, charset, NULL, NULL, 0); } *p = data; } DisposeHandle(texth); } else { *p = NULL; *lenp = 0; } Revision-number: 2727 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2003-01-27T00:33:49.000000Z K 7 svn:log V 21 Remove some fossils. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 40e6c5390a739212659f46f7b0417337 Text-delta-base-sha1: 7d3f95ef61a31c694ad8c76c885d87be21c47486 Text-content-length: 60 Text-content-md5: 8abfd21772e27b792a7070cc2f1f3c53 Text-content-sha1: 9c042e30d3746f6033c7df838a7107a73099bec3 Content-length: 99 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN7e,9,/* $Id: macresid.h,v 1.7 2003/01/27 00:33:49 Revision-number: 2728 Prop-content-length: 456 Content-length: 456 K 8 svn:date V 27 2003-01-27T00:39:01.000000Z K 7 svn:log V 357 First attempt at a platform-independent keyboard handler. This isn't complete yet -- there's no Alt+keypad support, and no way for the front-end to find out what it should do with the Num Lock light. It's also not fully tested. Nonetheless, it's at least as good as the previous Mac keyboard handler. Other platforms probably shouldn't adopt it just yet. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 055fb05d9948934aa50a355f73747c6b Text-delta-base-sha1: edf2757a5a3bb43bdf198a53224941f8e83bda8a Text-content-length: 2966 Text-content-md5: 4461920a89265d695535a63a5b608520 Text-content-sha1: e9b2a551ec58a24169c223bcfb5dbebe7b2d6d93 Content-length: 3006 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN_\&b;,l+U?po/* $Id: macterm.c,v 1.57 2003/01/27 00:39:01void mac_keyterm(WindowPtr window, EventRecord *event) { Session *s = (Session *)GetWRefCon(window); Key_Sym keysym = PK_NULL; unsigned int mods = 0, flags = PKF_NUMLOCK; wchar_t utxt[1]; ObscureCursor(); fprintf(stderr, "Got key event %08x\n", event->message)(event->message & keyCodeMask) >> 8) { case 0x74: /* shift-pageup */ term_scroll(s->term, 0, -(s->term->rows - 1)); return; case 0x79:; } } if (event->modifiers & shiftKey) mods |= PKM_SHIFT; if (event->modifiers & controlKey) mods |= PKM_CONTROL; if (event->what == autoKey) flags |= PKF_REPEAT; /* Mac key events consist of a virtual key code and a character code. */ switch ((event->message & keyCodeMask) >> 8) { case 0x24: keysym = PK_RETURN; break; case 0x30: keysym = PK_TAB; break; case 0x33: keysym = PK_BACKSPACE; break; case 0x35: keysym = PK_ESCAPE; break; case 0x7A: keysym = PK_F1; break; case 0x78: keysym = PK_F2; break; case 0x63: keysym = PK_F3; break; case 0x76: keysym = PK_F4; break; case 0x60: keysym = PK_F5; break; case 0x61: keysym = PK_F6; break; case 0x62: keysym = PK_F7; break; case 0x64: keysym = PK_F8; break; case 0x65: keysym = PK_F9; break; case 0x6D: keysym = PK_F10; break; case 0x67: keysym = PK_F11; break; case 0x6F: keysym = PK_F12; break; case 0x69: keysym = PK_F13; break; case 0x6B: keysym = PK_F14; break; case 0x71: keysym = PK_F15; break; case 0x72: keysym = PK_INSERT; break; case 0x73: keysym = PK_HOME; break; case 0x74: keysym = PK_PAGEUP; break; case 0x75: keysym = PK_DELETE; break; case 0x77: keysym = PK_END; break; case 0x79: keysym = PK_PAGEDOWN; break; case 0x47: keysym = PK_PF1; break; case 0x51: keysym = PK_PF2; break; case 0x4B: keysym = PK_PF3; break; case 0x43: keysym = PK_PF4; break; case 0x4E: keysym = PK_KPMINUS; break; case 0x45: keysym = PK_KPCOMMA; break; case 0x41: keysym = PK_KPDECIMAL; break; case 0x4C: keysym = PK_KPENTER; break; case 0x52: keysym = PK_KP0; break; case 0x53: keysym = PK_KP1; break; case 0x54: keysym = PK_KP2; break; case 0x55: keysym = PK_KP3; break; case 0x56: keysym = PK_KP4; break; case 0x57: keysym = PK_KP5; break; case 0x58: keysym = PK_KP6; break; case 0x59: keysym = PK_KP7; break; case 0x5B: keysym = PK_KP8; break; case 0x5C: keysym = PK_KP9; break; case 0x7B: keysym = PK_LEFT; break; case 0x7C: keysym = PK_RIGHT; break; case 0x7D: keysym = PK_DOWN; break; case 0x7E: keysym = PK_UP; break; } /* XXX Map from key script to Unicode. */ utxt[0] = event->message & charCodeMask; term_key(s->term, keysym, utxt, 1, mods, flags); Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f5864dbf00c358fbb3301d22974c045c Text-delta-base-sha1: b9237970f6e2b0c7ef5d48fc7a21d05bfa90c487 Text-content-length: 1717 Text-content-md5: da92763d602389b6cc787c5f22719525 Text-content-sha1: 76bc2c1cfdd5b2a82e523dc03a062e2eea0c71c9 Content-length: 1758 K 15 cvs2svn:cvs-rev V 5 1.196 PROPS-END SVN*L _)]vJ*/* Keyboard modifiers -- keys the user is actually holding down */ #define PKM_SHIFT 0x01 #define PKM_CONTROL 0x02 #define PKM_META 0x04 #define PKM_ALT 0x08 /* Keyboard flags that aren't really modifiers */ #define PKF_CAPSLOCK 0x10 #define PKF_NUMLOCK 0x20 #define PKF_REPEAT 0x40 /* Stand-alone keysyms for function keys */ typedef enum { PK_NULL, /* No symbol for this key */ /* Main keypad keys */ PK_ESCAPE, PK_TAB, PK_BACKSPACE, PK_RETURN, PK_COMPOSE, /* Editing keys */ PK_HOME, PK_INSERT, PK_DELETE, PK_END, PK_PAGEUP, PK_PAGEDOWN, /* Cursor keys */ PK_UP, PK_DOWN, PK_RIGHT, PK_LEFT, PK_REST, /* Numeric keypad */ /* Real one looks like: */ PK_PF1, PK_PF2, PK_PF3, PK_PF4, /* PF1 PF2 PF3 PF4 */ PK_KPCOMMA, PK_KPMINUS, PK_KPDECIMAL, /* 7 8 9 - */ PK_KP0, PK_KP1, PK_KP2, PK_KP3, PK_KP4, /* 4 5 6 , */ PK_KP5, PK_KP6, PK_KP7, PK_KP8, PK_KP9, /* 1 2 3 en- */ PK_KPBIGPLUS, PK_KPENTER, /* 0 . ter */ /* Top row */ PK_F1, PK_F2, PK_F3, PK_F4, PK_F5, PK_F6, PK_F7, PK_F8, PK_F9, PK_F10, PK_F11, PK_F12, PK_F13, PK_F14, PK_F15, PK_F16, PK_F17, PK_F18, PK_F19, PK_F20, PK_PAUSE } Key_Sym; #define PK_ISEDITING(k) ((k) >= PK_HOME && (k) <= PK_PAGEDOWN) #define PK_ISCURSOR(k) ((k) >= PK_UP && (k) <= PK_REST) #define PK_ISKEYPAD(k) ((k) >= PK_PF1 && (k) <= PK_KPENTER) #define PK_ISFKEY(k) ((k) >= PK_F1 && (k) <= PK_F20)enum { /* Function key types (cfg.funky_type) */ FUNKY_TILDE, FUNKY_LINUX, FUNKY_XTERM, FUNKY_VT400, FUNKY_VT100P, FUNKY_SCOkey(Terminal *, Key_Sym, wchar_t *, size_t, unsigned int, unsigned Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c1797d2690bfe3f709ed7f1f9d93cd7c Text-delta-base-sha1: e7139ecc959538b170797183fdaf44a704a50c30 Text-content-length: 11992 Text-content-md5: 648266018998d56c0829327a9c977cfb Text-content-sha1: e48a4ed1f33323194fb9acb45a34b772c188a5e3 Content-length: 12033 K 15 cvs2svn:cvs-rev V 5 1.132 PROPS-END SVNB //Akey(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen, unsigned int modifiers, unsigned int flags) { char output[10]; char *p = output; int prependesc = FALSE; int i; fprintf(stderr, "keysym = %d, %d chars:", keysym, tlen); for (i = 0; i < tlen; i++) fprintf(stderr, " %04x", text[i]); fprintf(stderr, "\n"); /* XXX Num Lock */ if ((flags & PKF_REPEAT) && term->repeat_off) return; /* Currently, Meta always just prefixes everything with ESC. */ if (modifiers & PKM_META) prependesc = TRUE; modifiers &= ~PKM_META; /* * Alt is only used for Alt+keypad, which isn't supported yet, so * ignore it. */ modifiers &= ~PKM_ALT; /* Standard local function keys */ switch (modifiers & (PKM_SHIFT | PKM_CONTROL)) { case PKM_SHIFT: if (keysym == PK_PAGEUP) /* scroll up one page */; if (keysym == PK_PAGEDOWN) /* scroll down on page */; if (keysym == PK_INSERT) term_do_paste(term); break; case PKM_CONTROL: if (keysym == PK_PAGEUP) /* scroll up one line */; if (keysym == PK_PAGEDOWN) /* scroll down one line */; /* Control-Numlock for app-keypad mode switch */ if (keysym == PK_PF1) term->app_keypad_keys ^= 1; break; } if (modifiers & PKM_ALT) { /* Alt+F4 (close) */ /* Alt+Return (full screen) */ /* Alt+Space (system menu) */ } if (keysym == PK_NULL && (modifiers & PKM_CONTROL) && tlen == 1 && text[0] >= 0x20 && text[0] <= 0x7e) { /* ASCII chars + Control */ if (text[0] >= 0x40 && text[0] <= 0x5f || text[0] >= 0x61 && text[0] <= 0x7a) text[0] &= 0x1f; else { /* * Control-2 should return ^@ (0x00), Control-6 should return * ^^ (0x1E), and Control-Minus should return ^_ (0x1F). Since * the DOS keyboard handling did it, and we have nothing better * to do with the key combo in question, we'll also map * Control-Backquote to ^\ (0x1C). */ switch (text[0]) { case ' ': text[0] = 0x00; break; case '-': text[0] = 0x1f; break; case '/': text[0] = 0x1f; break; case '2': text[0] = 0x00; break; case '3': text[0] = 0x1b; break; case '4': text[0] = 0x1c; break; case '5': text[0] = 0x1d; break; case '6': text[0] = 0x1e; break; case '7': text[0] = 0x1f; break; case '8': text[0] = 0x7f; break; case '`': text[0] = 0x1c; break; } } } /* Nethack keypad */ if (term->cfg.nethack_keypad) { char c = 0; switch (keysym) { case PK_KP1: c = 'b'; break; case PK_KP2: c = 'j'; break; case PK_KP3: c = 'n'; break; case PK_KP4: c = 'h'; break; case PK_KP5: c = '.'; break; case PK_KP6: c = 'l'; break; case PK_KP7: c = 'y'; break; case PK_KP8: c = 'k'; break; case PK_KP9: c = 'u'; break; } if (c != 0) { if (c != '.') { if (modifiers & PKM_CONTROL) c &= 0x1f; else if (modifiers & PKM_SHIFT) c = toupper(c); } *p++ = c; goto done; } } /* Numeric Keypad */ if (PK_ISKEYPAD(keysym)) { int xkey = 0; /* * In VT400 mode, PFn always emits an escape sequence. In * Linux and tilde modes, this only happens in app keypad mode. */ if (term->cfg.funky_type == FUNKY_VT400 || ((term->cfg.funky_type == FUNKY_LINUX || term->cfg.funky_type == FUNKY_TILDE) && term->app_keypad_keys && !term->cfg.no_applic_k)) { switch (keysym) { case PK_PF1: xkey = 'P'; break; case PK_PF2: xkey = 'Q'; break; case PK_PF3: xkey = 'R'; break; case PK_PF4: xkey = 'S'; break; } } if (term->app_keypad_keys && !term->cfg.no_applic_k) { switch (keysym) { case PK_KP0: xkey = 'p'; break; case PK_KP1: xkey = 'q'; break; case PK_KP2: xkey = 'r'; break; case PK_KP3: xkey = 's'; break; case PK_KP4: xkey = 't'; break; case PK_KP5: xkey = 'u'; break; case PK_KP6: xkey = 'v'; break; case PK_KP7: xkey = 'w'; break; case PK_KP8: xkey = 'x'; break; case PK_KP9: xkey = 'y'; break; case PK_KPDECIMAL: xkey = 'n'; break; case PK_KPENTER: xkey = 'M'; break; } if (term->cfg.funky_type == FUNKY_XTERM && tlen > 0) { /* * xterm can't see the layout of the keypad, so it has * to rely on the X keysyms returned by the keys. * Hence, we look at the strings here, not the PuTTY * keysyms (which describe the layout). */ switch (text[0]) { case '+': if (modifiers & PKM_SHIFT) xkey = 'l'; else xkey = 'k'; break; case '/': xkey = 'o'; break; case '*': xkey = 'j'; break; case '-': xkey = 'm'; break; } } else { /* * In all other modes, we try to retain the layout of * the DEC keypad in application mode. */ switch (keysym) { case PK_KPBIGPLUS: /* This key covers the '-' and ',' keys on a VT220 */ if (modifiers & PKM_SHIFT) xkey = 'm'; /* VT220 '-' */ else xkey = 'l'; /* VT220 ',' */ break; case PK_KPMINUS: xkey = 'm'; break; case PK_KPCOMMA: xkey = 'l'; break; } } } if (xkey) { if (term->vt52_mode) { if (xkey >= 'P' && xkey <= 'S') p += sprintf((char *) p, "\x1B%c", xkey); else p += sprintf((char *) p, "\x1B?%c", xkey); } else p += sprintf((char *) p, "\x1BO%c", xkey); goto done; } /* Not in application mode -- treat the number pad as arrow keys? */ if ((flags & PKF_NUMLOCK) == 0) { switch (keysym) { case PK_KP0: keysym = PK_INSERT; break; case PK_KP1: keysym = PK_END; break; case PK_KP2: keysym = PK_DOWN; break; case PK_KP3: keysym = PK_PAGEDOWN; break; case PK_KP4: keysym = PK_LEFT; break; case PK_KP5: keysym = PK_REST; break; case PK_KP6: keysym = PK_RIGHT; break; case PK_KP7: keysym = PK_HOME; break; case PK_KP8: keysym = PK_UP; break; case PK_KP9: keysym = PK_PAGEUP; break; } } } /* Miscellaneous keys */ switch (keysym) { case PK_ESCAPE: *p++ = 0x1b; goto done; case PK_BACKSPACE: if (modifiers == 0) *p++ = (term->cfg.bksp_is_delete ? 0x7F : 0x08); else if (modifiers == PKM_SHIFT) /* We do the opposite of what is configured */ *p++ = (term->cfg.bksp_is_delete ? 0x08 : 0x7F); else break; goto done; case PK_TAB: if (modifiers == 0) *p++ = 0x09; else if (modifiers == PKM_SHIFT) *p++ = 0x1B, *p++ = '[', *p++ = 'Z'; else break; goto done; /* XXX window.c has ctrl+shift+space sending 0xa0 */ case PK_PAUSE: if (modifiers == PKM_CONTROL) *p++ = 26; else break; goto done; case PK_RETURN: case PK_KPENTER: /* Odd keypad modes handled above */ if (modifiers == 0) { *p++ = 0x0d; if (term->cr_lf_return) *p++ = 0x0a; goto done; } } /* SCO function keys and editing keys */ if (term->cfg.funky_type == FUNKY_SCO) { if (PK_ISFKEY(keysym) && keysym <= PK_F12) { static char const codes[] = "MNOPQRSTUVWX" "YZabcdefghij" "klmnopqrstuv" "wxyz@[\\]^_`{"; int index = keysym - PK_F1; if (modifiers & PKM_SHIFT) index += 12; if (modifiers & PKM_CONTROL) index += 24; p += sprintf((char *) p, "\x1B[%c", codes[index]); goto done; } if (PK_ISEDITING(keysym)) { int xkey = 0; switch (keysym) { case PK_DELETE: *p++ = 0x7f; goto done; case PK_HOME: xkey = 'H'; break; case PK_INSERT: xkey = 'L'; break; case PK_END: xkey = 'F'; break; case PK_PAGEUP: xkey = 'I'; break; case PK_PAGEDOWN: xkey = 'G'; break; } p += sprintf((char *) p, "\x1B[%c", xkey); } } if (PK_ISEDITING(keysym) && (modifiers & PKM_SHIFT) == 0) { int code; if (term->cfg.funky_type == FUNKY_XTERM) { /* Xterm shuffles these keys, apparently. */ switch (keysym) { case PK_HOME: keysym = PK_INSERT; break; case PK_INSERT: keysym = PK_HOME; break; case PK_DELETE: keysym = PK_END; break; case PK_END: keysym = PK_PAGEUP; break; case PK_PAGEUP: keysym = PK_DELETE; break; case PK_PAGEDOWN: keysym = PK_PAGEDOWN; break; } } /* RXVT Home/End */ if (term->cfg.rxvt_homeend && (keysym == PK_HOME || keysym == PK_END)) { p += sprintf((char *) p, keysym == PK_HOME ? "\x1B[H" : "\x1BOw"); goto done; } if (term->vt52_mode) { int xkey; /* * A real VT52 doesn't have these, and a VT220 doesn't * send anything for them in VT52 mode. */ switch (keysym) { case PK_HOME: xkey = 'H'; break; case PK_INSERT: xkey = 'L'; break; case PK_DELETE: xkey = 'M'; break; case PK_END: xkey = 'E'; break; case PK_PAGEUP: xkey = 'I'; break; case PK_PAGEDOWN: xkey = 'G'; break; } p += sprintf((char *) p, "\x1B%c", xkey); goto done; } switch (keysym) { case PK_HOME: code = 1; break; case PK_INSERT: code = 2; break; case PK_DELETE: code = 3; break; case PK_END: code = 4; break; case PK_PAGEUP: code = 5; break; case PK_PAGEDOWN: code = 6; break; } p += sprintf((char *) p, "\x1B[%d~", code); goto done; } if (PK_ISFKEY(keysym)) { /* Map Shift+F1-F10 to F11-F20 */ if (keysym >= PK_F1 && keysym <= PK_F10 && (modifiers & PKM_SHIFT)) keysym += 10; if ((term->vt52_mode || term->cfg.funky_type == FUNKY_VT100P) && keysym <= PK_F14) { /* XXX This overrides the XTERM/VT52 mode below */ int offt = 0; if (keysym >= PK_F6) offt++; if (keysym >= PK_F12) offt++; p += sprintf((char *) p, term->vt52_mode ? "\x1B%c" : "\x1BO%c", 'P' + keysym - PK_F1 - offt); goto done; } if (term->cfg.funky_type == FUNKY_LINUX && keysym <= PK_F5) { p += sprintf((char *) p, "\x1B[[%c", 'A' + keysym - PK_F1); goto done; } if (term->cfg.funky_type == FUNKY_XTERM && keysym <= PK_F4) { if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", 'P' + keysym - PK_F1); else p += sprintf((char *) p, "\x1BO%c", 'P' + keysym - PK_F1); goto done; } p += sprintf((char *) p, "\x1B[%d~", 11 + keysym - PK_F1); goto done; } if (PK_ISCURSOR(keysym)) { int xkey; switch (keysym) { case PK_UP: xkey = 'A'; break; case PK_DOWN: xkey = 'B'; break; case PK_RIGHT: xkey = 'C'; break; case PK_LEFT: xkey = 'D'; break; case PK_REST: xkey = 'G'; break; /* centre key on number pad */ } if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", xkey); else { int app_flg = (term->app_cursor_keys && !term->cfg.no_applic_c); /* Useful mapping of Ctrl-arrows */ if (modifiers == PKM_CONTROL) app_flg = !app_flg; if (app_flg) p += sprintf((char *) p, "\x1BO%c", xkey); else p += sprintf((char *) p, "\x1B[%c", xkey); } goto done; } done: if (p > output || tlen > 0) { /* * Interrupt an ongoing paste. I'm not sure * this is sensible, but for the moment it's * preferable to having to faff about buffering * things. */ term_nopaste(term); /* * We need not bother about stdin backlogs * here, because in GUI PuTTY we can't do * anything about it anyway; there's no means * of asking Windows to hold off on KEYDOWN * messages. We _have_ to buffer everything * we're sent. */ term_seen_key_event(term); if (prependesc) { fprintf(stderr, "sending ESC\n"); ldisc_send(term->ldisc, "\x1b", 1, 1); } if (p > output) { fprintf(stderr, "sending %d bytes:", p - output); for (i = 0; i < p - output; i++) fprintf(stderr, " %02x", output[i]); fprintf(stderr, "\n"); ldisc_send(term->ldisc, output, p - output, 1); } else if (tlen > 0) { fprintf(stderr, "sending %d unichars:", tlen); for (i = 0; i < tlen; i++) fprintf(stderr, " %04x", text[i]); fprintf(stderr, "\n"); luni_send(term->ldisc, text, tlen, 1); } } Revision-number: 2729 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:42.952342Z PROPS-END Revision-number: 2730 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:42.976532Z PROPS-END Revision-number: 2731 Prop-content-length: 208 Content-length: 208 K 8 svn:date V 27 2003-01-27T13:54:38.000000Z K 7 svn:log V 107 Charlie at work has complained about pterm's small CPU usage even when idle. It's a fair point, I suppose. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/pterm-timer Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2258 Text-content-md5: 98088fcaf6b5eb5b2e27fce723c1661e Text-content-sha1: cbbd34b43acc599b3886241eae63c65cb4b1ab42 Content-length: 2374 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNDDDSummary: pterm should use no CPU if it's not doing anything Class: semi-bug Priority: medium Difficulty: fun Content-type: text/plain pterm currently runs a GTK timer function every 20ms (fifty times a second). This timer function takes care of calling term_update() to handle actual window updates, calling term_blink() to handle blinking cursors etc, and checking whether the child process has terminated. It would be nice if pterm could avoid doing this unless it was absolutely necessary. So, alternative ways of doing the same things: - to detect stuff in the child process, I'd have to get asynchronous notification of SIGCHLD. I suppose this means having an intra-process pipe in the same way Unix plink does it, so that pty.c's SIGCHLD handler writes a byte to the pipe and the GTK main function calls a function in response. - the reason term_update() is called in the timer function is so that it won't happen more than 50 times per second, which means that really fast-scrolling text doesn't slow down pterm the way it does xterm. So it would be a step backwards to move to just calling term_update() after every term_out(). I think a sensible way to fix this might be: * Introduce a wrapper function in pterm.c, whose job is to arrange a call to term_update either now or later. * The wrapper function will first check how long it's been since the last term_update. If it's been more than 20ms, it will call term_update. If not, it should _schedule_ a GTK timer function which will call term_update at some point 20ms or less in the future. That timer function will then disable itself the first time it runs. * Then we call the wrapper function after every term_out(). - Regular calls to the terminal code are actually necessary if blinking text or blinking cursor are enabled, or if a visual bell is currently active. So I could introduce a spare function in terminal.c which allows the front end to ask the terminal `Do you have any pending events for which I should call you back in future?' The wrapper function described above could call this after term_update, and schedule the timer function _anyway_ if it says yes. Revision-number: 2732 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2003-01-27T15:44:48.000000Z K 7 svn:log V 55 Blinking text was broken on pterm. This should fix it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 648266018998d56c0829327a9c977cfb Text-delta-base-sha1: e48a4ed1f33323194fb9acb45a34b772c188a5e3 Text-content-length: 97 Text-content-md5: 9c65772efa94da724f6cfb07aadc2636 Text-content-sha1: 0faff0afc384904c1cdb480ea4889213aa0d339c Content-length: 138 K 15 cvs2svn:cvs-rev V 5 1.133 PROPS-END SVN 7haterm->ucsdata->unitab_line[(unsigned char)' ']ble widthvv Revision-number: 2733 Prop-content-length: 339 Content-length: 339 K 7 svn:log V 238 Remove all `enum'-typed variables from the Config structure. Everything in there which is integral is now an actual int, which means my forthcoming revamp of the config box will be able to work with `int *' pointers without fear of doom. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-27T18:02:24.000000Z PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cd23104a33c63c6a34039ddd0537d852 Text-delta-base-sha1: 00e4ff026ba9da6100e55977dafda077bc077a2c Text-content-length: 149 Text-content-md5: 731d889605db38bfdd766a05a6ff8740 Text-content-sha1: f41517a6ec2d53a844dc9ace3758e6e4cb1504e7 Content-length: 189 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNz%Et+FORCE_ON || \ (ldisc->cfg->localecho == AUTOFORCE_ON || \ (ldisc->cfg->localedit == AUTO Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b8281875c3ca8d122953cb2b9baf7237 Text-delta-base-sha1: 04080333555456152bc3161cbca8a567e95c5e69 Text-content-length: 63 Text-content-md5: 257d8213dbf7a87cf68e3e36323ee47c Text-content-sha1: 8300335dbc58cfa464225f16b0a5374c1b8b605d Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNNX 'fKFORCE_ON || \ (cfg->proxy_dns == AUTO Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: da92763d602389b6cc787c5f22719525 Text-delta-base-sha1: 76bc2c1cfdd5b2a82e523dc03a062e2eea0c71c9 Text-content-length: 1673 Text-content-md5: ce76dde37877dd471bc2c5554988c792 Text-content-sha1: 640da77f7fb52be3d2eb19969e94ff5d21c3f4df Content-length: 1714 K 15 cvs2svn:cvs-rev V 5 1.197 PROPS-END SVNLAA: H b"Hb,b!V< )_{ KQ[ySenum { VT_XWINDOWS, VT_OEMANSI, VT_OEMONLY, VT_POORMAN, VT_UNICODE }Several different bits of the PuTTY configuration seem to be * three-way settings whose values are `always yes', `always * no', and `decide by some more complex automated means'. This * is true of line discipline options (local echo and line * editing), proxy DNS, Close On Exit, and SSH server bug * workarounds. Accordingly I supply a single enum here to deal * with them all. */ FORCE_ON, FORCE_OFF, AUTO }; enum { /* * Proxy types. */ PROXY_NONE, PROXY_HTTP, PROXY_SOCKS, PROXY_TELNET Protocol back ends. (cfg.protocol) */ PROT_RAW, PROT_TELNET, PROT_RLOGIN, PROT_SSH }; enum { /* Bell settings (cfg.beep) */ BELL_DISABLED, BELL_DEFAULT, BELL_VISUAL, BELL_WAVEFILE }; enum { /* Taskbar flashing indication on bell (cfg.beep_ind) */ B_IND_DISABLED, B_IND_FLASH, B_IND_STEADY }; enum { /* Resize actions (cfg.resize_action) */ RESIZE_TERM, RESIZE_DISABLED, RESIZE_FONT, RESIZE_EITHER/* * IMPORTANT POLICY POINT: everything in this structure which wants * to be treated like an integer must be an actual, honest-to- * goodness `int'. No enum-typed variables. This is because parts * of the code will want to pass around `int *' pointers to them * and we can't run the risk of porting to some system on which the * enum comes out as a different size from int. */ struct config_tag { /* Basic options */ char host[512]; int port; intint proxy_dns; int even_proxy_localhost; intint beep; intintintint Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bf0a7cfe5a454df431b8009733349404 Text-delta-base-sha1: 8a3a6868ffd6ab002f298116e4f753566ed5c676 Text-content-length: 726 Text-content-md5: ded96efb2714a0a4a509decdc2609f9a Text-content-sha1: ee6873e070a855041e86136bcf3419bebbe9d22c Content-length: 766 K 15 cvs2svn:cvs-rev V 4 1.99 PROPS-END SVNj\; WLrqzjX9 2^qV1Lxrgppi(sesskey, "CloseOnExit", AUTOAUTO, &cfg->proxy_dns)cfg->proxy_type)AUTO, &cfg->localecho); gppi(sesskey, "LocalEdit", AUTOcfg->beep); gppi(sesskey, "BeepInd", 0, &cfg->beep_ind)cfg->resize_action)AUTO, &cfg->sshbug_ignore1); gppi(sesskey, "BugPlainPW1", AUTO, &cfg->sshbug_plainpw1); gppi(sesskey, "BugRSA1", AUTO, &cfg->sshbug_rsa1); { int i; gppi(sesskey, "BugHMAC2", AUTO, &cfg->sshbug_hmac2); if (cfg->sshbug_hmac2 == FORCE_ON; } } gppi(sesskey, "BugDeriveKey2", AUTO, &cfg->sshbug_derivekey2); gppi(sesskey, "BugRSAPad2", AUTO, &cfg->sshbug_rsapad2); gppi(sesskey, "BugDHGEx2", AUTO, &cfg->sshbug_dhgex2) Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 87ccf5190b3a54f7c949c0c484cf86b3 Text-delta-base-sha1: 489e633c9e9cce4ef779ae4de90b89b52e88f39a Text-content-length: 346 Text-content-md5: 7f03f7112d903e72606951e85ea7de10 Text-content-sha1: b082db57d59b756336c01bfb1874ca5a50b8ba10 Content-length: 387 K 15 cvs2svn:cvs-rev V 5 1.269 PROPS-END SVN8kUZYRt*:gFORCE_ON || (ssh->cfg.sshbug_ignore1 == FORCE_ON || (ssh->cfg.sshbug_plainpw1 == FORCE_ON || (ssh->cfg.sshbug_rsa1 == FORCE_ON || (ssh->cfg.sshbug_hmac2 == FORCE_ON || (ssh->cfg.sshbug_derivekey2 == FORCE_ON || (ssh->cfg.sshbug_rsapad2 == FORCEe side clo<22 Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 45700368f3f847770480ff981ff511f4 Text-delta-base-sha1: 12c83d336b85a45a6047c0155955247d03654c78 Text-content-length: 109 Text-content-md5: 98248caf63806aca4ad1c56761d64d16 Text-content-sha1: 439db8a8d6be529d965abb01d4c6c5d2d8b44ee5 Content-length: 149 K 15 cvs2svn:cvs-rev V 4 1.92 PROPS-END SVNy9IwO|f^FORCE_ON; /* AUTOFORCE_ON || (inst->cfg.close_on_exit == AUTO Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 63aa0173934f3e3aba54eed0a7aa1930 Text-delta-base-sha1: 7f20e0a349a88333e8ed604be05a8ead7a97838f Text-content-length: 1681 Text-content-md5: 6425c25380c088cad0a2d281bf8db92a Text-content-sha1: 17c36f48aee1efb7318a810f598b3b070c3dad0b Content-length: 1722 K 15 cvs2svn:cvs-rev V 5 1.203 PROPS-END SVNvnS0~C%w>_+L'f7,%i^6o$*#R~'I}AUTO ? IDC_ECHOBACKEND : cfg.localecho == FORCE_ONAUTO ? IDC_EDITBACKEND : cfg.localedit == FORCE_ONAUTO ? IDC_COENORMAL : cfg.close_on_exit == FORCE_OFFFORCE_OFF ? IDC_PROXYDNSNO : cfg.proxy_dns == FORCE_ONFORCE_ON ? 2 : cfg.sshbug_ignore1 == FORCEFORCE_ON ? 2 : cfg.sshbug_plainpw1 == FORCEFORCE_ON ? 2 : cfg.sshbug_rsa1 == FORCEFORCE_ON ? 2 : cfg.sshbug_hmac2 == FORCEFORCE_ON ? 2 : cfg.sshbug_derivekey2 == FORCEFORCE_ON ? 2 : cfg.sshbug_rsapad2 == FORCEFORCE_ON ? 2 : cfg.sshbug_dhgex2 == FORCEAUTO; if (LOWORD(wParam) == IDC_ECHOYES) cfg.localecho = FORCE_ON; if (LOWORD(wParam) == IDC_ECHONO) cfg.localecho = FORCE_OFFAUTO; if (LOWORD(wParam) == IDC_EDITYES) cfg.localedit = FORCE_ON; if (LOWORD(wParam) == IDC_EDITNO) cfg.localedit = FORCE_OFFFORCE_ON : IsDlgButtonChecked(hwnd, IDC_COENEVER) ? FORCE_OFF : AUTOFORCE_OFF : IsDlgButtonChecked(hwnd, IDC_PROXYDNSYES) ? FORCE_ON : cbc = IsDlgBH7/3aOU]Xbgd^zZ_y> AUTO : index == 1 ? FORCE_OFF : FORCEAUTO : index == 1 ? FORCE_OFF : FORCEAUTO : index == 1 ? FORCE_OFF : FORCEAUTO : index == 1 ? FORCE_OFF : FORCEAUTO : index == 1 ? FORCE_OFF:FORCEAUTO : index == 1 ? FORCE_OFF : FORCE_ON); } break; case IDC_BUGD_DHGEX2DHGEX2, CB_GETCURSEL, 0, 0); cfg.sshbug_dhgex2 = (index == 0 ? AUTO : index == 1 ? FORCE_OFF : FORCE Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 35801552dfe9bc51333cb415b084a439 Text-delta-base-sha1: 4c55eb1d6131b93a844ddb35586dec521c3f610e Text-content-length: 110 Text-content-md5: ecfac8cc6a9bcd4f557752a3d5561bd6 Text-content-sha1: d43678dbd96ffb07d06a09c22518d38a67a2f213 Content-length: 151 K 15 cvs2svn:cvs-rev V 5 1.236 PROPS-END SVN<EjOkFORCE_ONFORCE_ON || cfg.close_on_exit == AUTO request_p|| Revision-number: 2734 Prop-content-length: 573 Content-length: 573 K 8 svn:date V 27 2003-01-27T23:03:31.000000Z K 7 svn:log V 472 xterm apparently supports ESC[90m through ESC[97m to set bright foreground colours, and ESC[100m through ESC[107m to set bright background colours. Hence, so do we. Bright-foreground is distinguishable from bold, and bright-background distinguishable from blink, when it leaves terminal.c; the front end may then choose to display them in the same way if it's configured to do so. This change makes the xterm backend for Turbo Vision (!!!) work properly. Untested on Mac. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 191e30bb3faf24bb16745930b3525a6a Text-delta-base-sha1: 6d9188a07ea4b7fb22b5929e63493e4f6c05363f Text-content-length: 333 Text-content-md5: 32d3da0f08bc8d1ad1d82809b47f9fd5 Text-content-sha1: 374c7bc53b9322aa8c3c8026fb68aa1e35d7a894 Content-length: 373 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVN{T/;tf\versionid $Id: config.but,v 1.52 2003/01/27 23:03:30 simonYou can also modify the precise shades used for the bold versions of these colours; these are used to display bold text if you have selected \q{Bolded text is a different colour}, and can also be used if the server asks specifically to use them Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4461920a89265d695535a63a5b608520 Text-delta-base-sha1: e9b2a551ec58a24169c223bcfb5dbebe7b2d6d93 Text-content-length: 285 Text-content-md5: 0d908b2ffdd4e10c7199462e26aa759a Text-content-sha1: 024f1d585363b612e271dc52b9ad08c19112e6a5 Content-length: 325 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN\ay-/CvE/* $Id: macterm.c,v 1.58 2003/01/27 23:03:30 simo; fgcolour = (fgcolour & 0xF) * 2 + (fgcolour & 0x10 ? 1 : 0); bgcolour = ((a->attr & ATTR_BGMASK) >> ATTR_BGSHIFT) * 2; bgcolour = (bgcolour & 0xF) * 2 + (bgcolour & 0x10 ? 1 : 0) |= 1 Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ce76dde37877dd471bc2c5554988c792 Text-delta-base-sha1: 640da77f7fb52be3d2eb19969e94ff5d21c3f4df Text-content-length: 461 Text-content-md5: 11a2a95e001bd87f65591b6a9a8e5e95 Text-content-sha1: 7dee0d0bdd02756362a33c4b6c61865f35af0572 Content-length: 502 K 15 cvs2svn:cvs-rev V 5 1.198 PROPS-END SVNAA,a*e Or80000000UL #define ATTR_WIDE 0x40000000UL #define ATTR_BOLD 0x04000000UL #define ATTR_UNDER 0x08000000UL #define ATTR_REVERSE 0x10000000UL #define ATTR_BLINK 0x20000000UL #define ATTR_FGMASK 0x001F0000UL #define ATTR_BGMASK 0x03E00000UL #define ATTR_COLOURS 0x03FF0000UL #define ATTR_FGSHIFT 16 #define ATTR_BGSHIFT 21 #define ATTR_DEFAULT 0x01280000UL #define ATTR_DEFFG 0x00080000UL #define ATTR_DEFBG 0x01216 Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9c65772efa94da724f6cfb07aadc2636 Text-delta-base-sha1: 0faff0afc384904c1cdb480ea4889213aa0d339c Text-content-length: 1819 Text-content-md5: b14f53effc1642222bb0c1b63d7f0c9d Text-content-sha1: 041c1d7c953457788a5f512d54691192a0ccdee4 Content-length: 1860 K 15 cvs2svn:cvs-rev V 5 1.134 PROPS-END SVN=UQBZtNz({A:4 Y:X 8 newcols; j++) line[j + 1] = ERASE_CHAR; line[newcols] = LATTR_NORM newcols; j++) line[j + 1] = term->erase_char; line[newcols + 1] = LATTR_NORMLATTR_NORM) { if (erase_lattr) ldata[start.x] &= ~(LATTR_WRAPPED | LATTR_WRAPPED2); } else { ldata[start.x] = term->erase_char; }90: case 91: case 92: case 93: case 94: case 95: case 96: case 97: /* xterm-style bright foreground */ term->curr_attr &= ~ATTR_FGMASK; term->curr_attr |= ((term->esc_args[i] - 90 + 16) << ATTR_FGSHIFT)100: case 101: case 102: case 103: case 104: case 105: case 106: case 107: /* xterm-style bright(term->esc_args[i] - 100 + 16) << ATTR_BGSHIFT)v1;;v /* half/fullwidth ASCII */ { 0xff5b, 0xff64, 1}, /* half/fullwidth ASCII */ { 0xfff0, 0xffff, 0}, /* half/fullwidth ASCII */ { 0, 0, 0} }; const struct ucsword *wptr; uc &= (CSET_MASK | CHAR_MASK); switch (uc & CSET_MASK) { case ATTR_LINEDRW: uc = term->ucsdata->unitab_xterm[uc & 0xFF]; break; case ATTR_ASCII: uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case ATTR_SCOACS: uc = term->ucsdata->unitab_scoacs[uc&0xFF]; break; } switch (uc & CSET_MASK) { case ATTR_ACP: uc = term->ucsdata->unitab_font[uc & 0xFF]; break; case ATTR_OEMCP: uc = term->ucsdata->unitab_oemcp[uc & 0xFF]; break; } /* For DBCS font's I can't do anything usefull. Even this will sometimes * fail as there's such a thing as a double width Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 98248caf63806aca4ad1c56761d64d16 Text-delta-base-sha1: 439db8a8d6be529d965abb01d4c6c5d2d8b44ee5 Text-content-length: 294 Text-content-md5: 132e1bc9999c1157ca6457704b53ccf7 Text-content-sha1: ce1336794e3fe40c5fe893b3ea6f594a81a0f7ca Content-length: 334 K 15 cvs2svn:cvs-rev V 4 1.93 PROPS-END SVN9L;+FMl((attr & ATTR_FGMASK) >> ATTR_FGSHIFT); nfg = 2 * (nfg & 0xF) + (nfg & 0x10 ? 1 : 0); nbg = ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT); nbg = 2 * (nbg & 0xF) + (nbg & 0x10 ? 1 : 0 |= 1; if (inst->cfg.bold_colour && (attr & ATTR_BLINK)) nbg |= 1 Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6425c25380c088cad0a2d281bf8db92a Text-delta-base-sha1: 17c36f48aee1efb7318a810f598b3b070c3dad0b Text-content-length: 332 Text-content-md5: 8fac5aed585f8120c88ad501ded713e3 Text-content-sha1: 8bfa57f9b41f0d676fee435d486fe622a1ada96a Content-length: 373 K 15 cvs2svn:cvs-rev V 5 1.204 PROPS-END SVNOf<$A:FBU@LSendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_ADDSTRING, 0, uttonChecked(hwnd, IDC_SSH2DES); break; case IDC_AGENTFWDcfg.agentfwd = IsDlgButtonChecked(hwnd, IDC_AGENTFWD); break; ca7B3T{'HT{@wse IDC_CHANGEUSER} break; case IDC_PALETTE Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ecfac8cc6a9bcd4f557752a3d5561bd6 Text-delta-base-sha1: d43678dbd96ffb07d06a09c22518d38a67a2f213 Text-content-length: 414 Text-content-md5: 23274dffccdda4ff3831218ac6f34720 Text-content-sha1: b920a5e5ad9c8a3bafd02e647ecb2994cb5c9703 Content-length: 455 K 15 cvs2svn:cvs-rev V 5 1.237 PROPS-END SVN;EzJ((attr & ATTR_FGMASK) >> ATTR_FGSHIFT); nfg = 2 * (nfg & 0xF) + (nfg & 0x10 ? 1 : 0); nbg = ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT); nbg = 2 * (nbg & 0xF) + (nbg & 0x10 ? 1 : 0 |= 1; if (bold_mode == BOLD_COLOURS && (attr & ATTR_BLINK)) nbg |= 1|^bb|. */ if (wParam == VK_MENU && !cfg.alt_only) return 0; return -1; } void request_p Revision-number: 2735 Prop-content-length: 587 Content-length: 587 K 8 svn:date V 27 2003-01-27T23:18:16.000000Z K 7 svn:log V 486 Of course, that cleanup I did earlier in which I rationalised all the various `yes/no/maybe' enums into one common one missed a vital point: all those enums mapped on to integers in different ways, which affected the format of stored settings. Arrgh. So now settings.c contains yet more painful warts and I'm _really_ starting to think it's about time we designed a new set of human-usable config keywords and retired this lot to the status of Unpleasant Backwards-Compatibility Relic. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ded96efb2714a0a4a509decdc2609f9a Text-delta-base-sha1: ee6873e070a855041e86136bcf3419bebbe9d22c Text-content-length: 1303 Text-content-md5: 9b6fa3bd3c0ceb80cc9d48b6dc458eb6 Text-content-sha1: b28e0be9cef4842c95578a18086757ae30db777b Content-length: 1344 K 15 cvs2svn:cvs-rev V 5 1.100 PROPS-END SVN\(:Oo:<)sC;6wZm(&(xd/* The CloseOnExit numbers are arranged in a different order from * the standard FORCE_ON / FORCE_OFF / AUTO. */ write_setting_i(sesskey, "CloseOnExit", (cfg->close_on_exit+2)%3(cfg->proxy_dns+2)%32-cfg->sshbug_ignore1); write_setting_i(sesskey, "BugPlainPW1", 2-cfg->sshbug_plainpw1); write_setting_i(sesskey, "BugRSA1", 2-cfg->sshbug_rsa1); write_setting_i(sesskey, "BugHMAC2", 2-cfg->sshbug_hmac2); write_setting_i(sesskey, "BugDeriveKey2", 2-cfg->sshbug_derivekey2); write_setting_i(sesskey, "BugRSAPad2", 2-cfg->sshbug_rsapad2); write_setting_i(sesskey, "BugDHGEx2", 2-/* The CloseOnExit numbers are arranged in a different order from * the standard FORCE_ON / FORCE_OFF / AUTO. */ gppi(sesskey, "CloseOnExit", 1, &i); cfg->close_on_exit = (i+1)%31, &i); cfg->proxy_dns = (i+1)%30, &i); cfg->sshbug_ignore1 = 2-i; gppi(sesskey, "BugPlainPW1", 0, &i); cfg->sshbug_plainpw1 = 2-i; gppi(sesskey, "BugRSA1", 0, &i); cfg->sshbug_rsa1 = 2-i; { int i; gppi(sesskey, "BugHMAC2", 0, &i); cfg->sshbug_hmac2 = 2-i0, &i); cfg->sshbug_derivekey2 = 2-i; gppi(sesskey, "BugRSAPad2", 0, &i); cfg->sshbug_rsapad2 = 2-i; gppi(sesskey, "BugDHGEx2", 0, &i); cfg->sshbug_dhgex2 = 2-i Revision-number: 2736 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 69 Add myself to the list of copyright holders, largely for term_key(). K 10 svn:author V 3 ben K 8 svn:date V 27 2003-01-27T23:46:03.000000Z PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: be0a0d9135bf368b7996b759649f58df Text-delta-base-sha1: 2cb05b828a0ebc17df578414e181a3478100b58c Text-content-length: 31 Text-content-md5: 8480a3117fc44c3ab9f9bc7eef25a031 Text-content-sha1: 59ccc8dd5387e2b4434ccfa2a0f2868600c45273 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNHT @ >Ben Harris Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1094e43720c5a6776111cef634eeabef Text-delta-base-sha1: 4da5e32eb97cb0691f27a6605e22454ec85e2a46 Text-content-length: 80 Text-content-md5: 8eca16bd47486056fb957aecb3d70c69 Text-content-sha1: 80150e107e0e802245a22289c101d09b68f09981 Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN 6G,"q/* $Id: mac_res.r,v 1.24 2003/01/27 23:46:03Ben Harris Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e734fdf0d59e2804e517019f225a1643 Text-delta-base-sha1: 0a1efcdbabd3a88f53b1d45b2536b80373aec648 Text-content-length: 31 Text-content-md5: 78ed0f40441f4c80317ba386df7bf5d9 Text-content-sha1: cfd0c6fe1bf0e4fbb876914e51767592f6ccc806 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNeq Z Ben Harris Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bb1ef741e5360523cab3250369db1f11 Text-delta-base-sha1: d01035191118591f74c6516876c54f89784b4f61 Text-content-length: 31 Text-content-md5: f76c4ee1902ad5229e1d7d20482cce08 Text-content-sha1: 52b861cdc6be95fc2e38bee4275914af7bbd6e2e Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN% @[>Ben Harris Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 27336fd0aa54c1d51bd6e9836157f202 Text-delta-base-sha1: 0009c2d8ad927b5ac649983014185377609b9b71 Text-content-length: 31 Text-content-md5: 3dd75d100c33879263e19950c82da6b8 Text-content-sha1: 8ee85c29a46cfeb46016214b6f8909e1745f114f Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVNjv XBen Harris Revision-number: 2737 Prop-content-length: 260 Content-length: 260 K 8 svn:date V 27 2003-01-28T00:17:17.000000Z K 7 svn:log V 161 Security fascists might claim that logging every keypress to stderr is a bad idea, so stop doing that (only in the Mac port, so not actually much of a problem). K 10 svn:author V 3 ben PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b14f53effc1642222bb0c1b63d7f0c9d Text-delta-base-sha1: 041c1d7c953457788a5f512d54691192a0ccdee4 Text-content-length: 299 Text-content-md5: 0e2f49825afdb4bef6adb106e9c68d44 Text-content-sha1: 3a11c3ec17ad0a8b55e4d99605b25b8bc81d802c Content-length: 340 K 15 cvs2svn:cvs-rev V 5 1.135 PROPS-END SVN1c'f}(|+#|!7Y%v;#if 0#endif#if 0 fprintf(stderr, "sending ESC\n"); #endif ldisc_send(term->ldisc, "\x1b", 1, 1); } if (p > output) { #if 0#endif ldisc_send(term->ldisc, output, p - output, 1); } else if (tlen > 0) { #if 0#endif Revision-number: 2738 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2003-01-28T00:25:20.000000Z K 7 svn:log V 114 Fix a minor oversight in the new 16-colour code for the Mac, which was calculating the background colour wrongly. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0d908b2ffdd4e10c7199462e26aa759a Text-delta-base-sha1: 024f1d585363b612e271dc52b9ad08c19112e6a5 Text-content-length: 72 Text-content-md5: 624228b7df8ec836095f40821582cfc9 Text-content-sha1: 9e79bc7cffd7fdd92dee3dc0c6653b72ccebaae4 Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVNa[ /*1_/* $Id: macterm.c,v 1.59 2003/01/28 00:25:20 be Revision-number: 2739 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2003-01-28T00:35:54.000000Z K 7 svn:log V 49 Don't log every keypress by default here either. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 624228b7df8ec836095f40821582cfc9 Text-delta-base-sha1: 9e79bc7cffd7fdd92dee3dc0c6653b72ccebaae4 Text-content-length: 145 Text-content-md5: 080dcc3bbf7ef863597c5575c1c187c2 Text-content-sha1: f1d5ec3dc14a00e1443b877b095b8b17b7b98720 Content-length: 185 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN[hu ,Iir/* $Id: macterm.c,v 1.60 2003/01/28 00:35:54#if 0 fprintf(stderr, "Got key event %08x\n", event->message); #endif Revision-number: 2740 Prop-content-length: 403 Content-length: 403 K 7 svn:log V 302 Oh, _that's_ why that `if' had the sense it did. Good grief. Apparently I used to rely on the fact that the same `erase_char' used to wipe parts of the screen was also a good value to use for resetting line attributes. Should now be more robust against future reorganisations of the ATTR_* bit fields. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-01-28T09:26:32.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0e2f49825afdb4bef6adb106e9c68d44 Text-delta-base-sha1: 3a11c3ec17ad0a8b55e4d99605b25b8bc81d802c Text-content-length: 250 Text-content-md5: 2fe82b1f82c3239347718b4fe5a9efaf Text-content-sha1: e0e7adb9a6967c6bd124dfd583b60519a5127553 Content-length: 291 K 15 cvs2svn:cvs-rev V 5 1.136 PROPS-END SVN3?!erase_lattr) ldata[start.x] = ~(LATTR_WRAPPED | LATTR_WRAPPED2); else ldata[start.x] = LATTR_NORMc!>c}, /* half/fullwidth ASCII */ { 0xff3b, 0xff40, 1}, Revision-number: 2741 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2003-01-28T09:30:14.000000Z K 7 svn:log V 58 Ahem, and restore the missing & from that checkin. Arrgh. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2fe82b1f82c3239347718b4fe5a9efaf Text-delta-base-sha1: e0e7adb9a6967c6bd124dfd583b60519a5127553 Text-content-length: 45 Text-content-md5: d2a5e8fd126388313642286a82438e15 Text-content-sha1: da608bfcefaa772cd621cdbdefac217b6dedbcef Content-length: 86 K 15 cvs2svn:cvs-rev V 5 1.137 PROPS-END SVN ``&!"!1 Revision-number: 2742 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2003-01-28T10:33:31.000000Z K 7 svn:log V 22 Add some more reports K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ppk-empty-comment Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 93d53b591b4e393b212b9c6cb25cb6a4 Text-delta-base-sha1: a9b1b90c3736a49e30dab86e2ef868ea099a7bed Text-content-length: 188 Text-content-md5: 3a4cb67113b3f673c1d5763a539ec2a8 Text-content-sha1: 5cbdb4d5cc50901a571735c1dbcc56bef19758b1 Content-length: 227 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN!Y"jjAbsent-in: 0.52 Present-in: 0.53b 2002-10-07 2003-01-0420021007152204.98637.qmail@web40403.mail.yahoo.com
  • 1701439409.20021127203822@lut.fi There appears to be some bogosity in the way keyboard accelerators work in PuTTYgen. (Unless otherwise specified, the below is with Win2K SP3.)

    First, there's an outright clash between the accelerators for the `Conversions' menu and the `Key comment' edit box. (The latter isn't visible unless a key is loaded.) Bizarrely, typing Alt+C when no key is loaded causes a key to be generated (perhaps the `Generate' button is the next available control?).

    Keyboard accelerators don't appear to work as expected during and after key generation. (During keygen, all controls are disabled, but menus can be accessed with the mouse.) I need to switch away and back before they work again. (Possibly related: during key generation, frobbing Alt appears to count as randomness.)

    I've heard that under Wine, the menu bar doesn't appear at all until you type an appropriate accelerator key. (not sure which versions) Revision-number: 2753 Prop-content-length: 240 Content-length: 240 K 8 svn:date V 27 2003-01-30T12:15:24.000000Z K 7 svn:log V 139 Summary: Failure to scrub SSH-2 password from memory after use Present-in: 0.53b Fixed-in: 2003-01-10 (this is iDEFENSE advisory 01.28.03) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-passwd-memdump Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 681 Text-content-md5: 7dddecb32853083b722cee91f02e6640 Text-content-sha1: 2a4c2bf63a2926ef384184d3271ca660aca094fc Content-length: 797 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Failure to scrub SSH-2 password from memory after use Class: bug Difficulty: fun Priority: high Present-in: 0.53b Fixed-in: 2003-01-10 Content-type: text/x-html-body

    As reported in iDEFENSE Security Advisory 01.28.03, PuTTY 0.53b fails to scrub the password from a memory buffer after authentication, making it trivially easy for an attacker with access to a memory dump to recover the password. (This only applies when using SSH-2.)

    This is fixed in the nightly development snapshots as of 2003-01-10, and will be fixed in the next stable release. Revision-number: 2754 Prop-content-length: 348 Content-length: 348 K 8 svn:date V 27 2003-01-30T13:39:24.000000Z K 7 svn:log V 247 Yet more fallout from the 16-colour changes. I think by this time these fiddly little changes are no longer bugs I introduced recently, they're bugs that have been around all along and I've only just smoked out by altering the ATTR_* definitions. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d2a5e8fd126388313642286a82438e15 Text-delta-base-sha1: da608bfcefaa772cd621cdbdefac217b6dedbcef Text-content-length: 49 Text-content-md5: f2ccf53aeddba5fec76bb18e9f9625dd Text-content-sha1: ce860766644fe54835dceac2170f38bfc0b00a69 Content-length: 90 K 15 cvs2svn:cvs-rev V 5 1.138 PROPS-END SVN d + 1"&"20, Revision-number: 2755 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2003-01-30T23:11:07.000000Z K 7 svn:log V 86 Small amount of extra noise gathering -- slurp the process list in noise_get_heavy(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macnoise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 098c7a6fa719d4ea4e924646c95ecd40 Text-delta-base-sha1: 3016ae13030f6ecddbea38f8ce992f55cc751272 Text-content-length: 562 Text-content-md5: b7325717571b525071fe406892955c93 Text-content-sha1: 212ad2cbb66435303fedb29b0c954d9703db00b4 Content-length: 601 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNm[\Q QProcesses.h>static void noise_get_processes(void (*func) (void *, int)) { ProcessSerialNumber psn = {0, kNoProcess}; ProcessInfoRec info; for (;;) { GetNextProcess(&psn); if (psn.highLongOfPSN == 0 && psn.lowLongOfPSN == kNoProcess) return; info.processInfoLength = sizeof(info); info.processName = NULL; info.processAppSpec = NULL; GetProcessInformation(&psn, &info); func(&info, sizeof(info)); } } void noise_get_heavy(void (*func) (void *, int)) { noise_get_light(func); noise_get_processes(func); Revision-number: 2756 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2003-01-31T12:25:56.000000Z K 7 svn:log V 57 Convert to minimal HTML. Reference a related Debian bug. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/xterm-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 80d16bec52cfbe4dd40a3a4c58f34d9b Text-delta-base-sha1: 4cfdfd4aba41f8eef6c8b585196d742115fef418 Text-content-length: 121 Text-content-md5: 07eb8acca62270d9dab897043c876f26 Text-content-sha1: a4ff9f4c08ac0bafe4d320869e82447bf503dc4f Content-length: 160 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN<_jtpJrMx-html-body

    Ref: Debian Bug #167629.
    
    Revision-number: 2757 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2003-01-31T23:18:44.000000Z K 7 svn:log V 114 Mention the slightly odd "too many authentication attempts" message you get from OpenSSH if you overfill Pageant. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 158bee82dba3d6a82380cf270be6414c Text-delta-base-sha1: b2a94d5bdac94811a9fbf9819f9c161a2fa844d6 Text-content-length: 722 Text-content-md5: 88fdf4d0e6de604bd855bade3adec526 Text-content-sha1: f0d2b61e8217af7837959709278c3cf043fdd481 Content-length: 761 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN 9J9v\versionid $Id: errors.but,v 1.4 2003/01/31 23:18:44 betoomanyauth} \q{Server sent disconnect message type 2 (SSH_DISCONNECT_PROTOCOL_ERROR): "Too many authentication failures for root"} This message is produced by an OpenSSH (or Sun SSH) server if it receives more failed authentication attempts than it is willing to tolerate. This can easily happen if you are using Pageant and have a large number of keys loaded into it. This can be worked around on the server by disabling public-key authentication or (for Sun SSH only) by increasing \c{MaxAuthTries} in \c{sshd_config}. Neither of these is a really satisfactory solution, and we hope to provide a better one in a future version of PuTTY Revision-number: 2758 Prop-content-length: 258 Content-length: 258 K 8 svn:date V 27 2003-01-31T23:27:02.000000Z K 7 svn:log V 159 Mention a recently-reported problem that either of these would have avoided, and its mention in the manual (so the manual gets updates when the bug is fixed). K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/auth-pref Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 46a3fd63cdf911ed3c4192c055f934a2 Text-delta-base-sha1: a4533e22029a6bd132be14fe95c6bece979ff855 Text-content-length: 260 Text-content-md5: ba002b54f2ef244f1bda8307f5977eb4 Text-content-sha1: a0323ebac67d58ddb5583eb679f2f9bd0caa433a Content-length: 299 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNaN l[lZ This would be particularly useful for servers (like OpenSSH) which limit the number of authentication attempts allowed, since it saves us wasting attempts on methods that the user knows will fail. See errors-toomanyauth in the manual Node-path: putty-wishlist/data/pubkeyfile-and-pageant Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 434ecf3171140ee59f2e9e6bcf58da3c Text-delta-base-sha1: a8dc8ff6817663dc786a5529aaf6e893c251df22 Text-content-length: 219 Text-content-md5: 9207b0e8a33de423cc96b12574972999 Text-content-sha1: a59191ccae332ad8bd23a72980b755d943bc2d7f Content-length: 258 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNHR CjC%# It can also cause problem if Pageant has lots of keys and the server (e.g. OpenSSH) is configured to only allow a certain number of authentication attempts. See errors-toomanyauth in the manual Revision-number: 2759 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2003-02-01T00:05:15.000000Z K 7 svn:log V 39 PuTTY seems to cause ntp to lose time. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ntpd-slowdown Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1601 Text-content-md5: 7b4c521bb7c5837ccfbfb5219fb37318 Text-content-sha1: 8a964032db65e7159f75d8f9b90c1ee0bb83a838 Content-length: 1717 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN333Summary: PuTTY causes ntpd to lose time Class: semi-bug Priority: medium Difficulty: taxing Present-in: 0.53b Content-type: text/x-html-body

    It's been reported that running an SSH2 session through PuTTY causes ntpd to lose time in 10ms steps, as if 100Hz interrupts are being lost. The same problem doesn't affect Telnet connections, though. Ref <C5EA7C1F01A7D311A44700508B95196C0730D8AB@004-h00028.wugo.intranet.wegener.nl> et seq., which mentions the platform as

    PC DELL Latitude 610 with w2k pro Dutch with SP3 on AC Power.

    As far as I can tell, noise_ultralight() and noise_regular() are called even during a Telnet session (they're stubs in PuTTYtel, but in PuTTY they go out and hunt for noise even if no-one's ever going to consume it). noise_get_heavy() is only called at the start of an SSH session, so it shouldn't cause continuing problems, especially not ones that go away when the session ends. I think this narrows us down to noise_get_light(), which is called every time the random pool is used, which looks like being most packets in an SSH session, but never in a Telnet session. noise_get_light() calls GetSystemTime(), GetSystemTimeAdjustment() and GetSystemPowerStatus(). I'd suspect that either GetSystemTimeAdjustment() is mangling said adjustment in the process or (more likely) GetSystemPowerStatus() is calling the APM BIOS, which ISTR has to be done with interrupts disabled. Revision-number: 2760 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2003-02-01T00:29:38.000000Z K 7 svn:log V 78 Be slightly less negative about other people's setting up PuTTY-related fora. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a377281a51e380d4858c49f34c977ad7 Text-delta-base-sha1: 3b47f0533310e8906dc05c93e89ca016ff1e4d0a Text-content-length: 340 Text-content-md5: cee183c91f7d7b4652899afc253303d0 Text-content-sha1: 9b9368c898adb7788068e9c5fc0949ba7b7ee488 Content-length: 380 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVNCf7b8Mv\versionid $Id: faq.but,v 1.43 2003/02/01 00:29:38 benor other forum for PuTTY users to help each other with common problems, that would be fine with us, though the PuTTY team would almost certainly not have the time to read it. It's probably better to use the established newsgroup \cw{comp.security.ssh} for Revision-number: 2761 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2003-02-01T00:51:35.000000Z K 7 svn:log V 63 Summary: Scroll-optimisation for pterm [ courtesy of Richard ] K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/pterm-scrollopt Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3321 Text-content-md5: 0f0c49820aa719129f14ff4989db8952 Text-content-sha1: 1382dec933c9db1b74f158688530a74402870919 Content-length: 3437 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNkkkSummary: Scroll-optimisation for pterm Class: wish Difficulty: tame Priority: medium Content-type: text/plain From Richard: [ NB: this depends on a platform-independent patch which I intend to commit any moment now... ] Index: unix/pterm.c =================================================================== RCS file: /home/cvs/putty/unix/pterm.c,v retrieving revision 1.91 diff -u -r1.91 pterm.c --- unix/pterm.c 25 Jan 2003 16:23:48 -0000 1.91 +++ unix/pterm.c 27 Jan 2003 10:58:25 -0000 @@ -102,6 +102,61 @@ return def; } +#ifdef OPTIMISE_SCROLL +/* + * Scroll a displayed region on the screen. + * (`lines' is +ve for scrolling forward, -ve for backward.) + */ +void do_scroll(Context ctx, int topline, int botline, int lines) +{ + struct draw_ctx *dctx = (struct draw_ctx *)ctx; + struct gui_data *inst = dctx->inst; + GdkGC *gc = dctx->gc; + int scrollarea_lines; + + if (lines > 0) { + scrollarea_lines = botline - topline + 1 - lines; + } else { + scrollarea_lines = botline - topline + 1 + lines; + } + + if (lines == 0 || scrollarea_lines <= 0) return; + if (lines > 0) { + gdk_window_copy_area(inst->area->window, gc, + 0, + (topline * inst->font_height + inst->cfg.window_border), + inst->area->window, + 0, + ((topline + lines) * inst->font_height + inst->cfg.window_border), + (inst->cfg.width * inst->font_width + 2*inst->cfg.window_border), + scrollarea_lines * inst->font_height); + gdk_draw_pixmap(inst->pixmap, gc, inst->pixmap, + 0, + ((topline + lines) * inst->font_height + inst->cfg.window_border), + 0, + (topline * inst->font_height + inst->cfg.window_border), + (inst->cfg.width * inst->font_width + 2*inst->cfg.window_border), + scrollarea_lines * inst->font_height); + } else { + gdk_window_copy_area(inst->area->window, gc, + 0, + ((topline - lines) * inst->font_height + inst->cfg.window_border), + inst->area->window, + 0, + (topline * inst->font_height + inst->cfg.window_border), + (inst->cfg.width * inst->font_width + 2*inst->cfg.window_border), + scrollarea_lines * inst->font_height); + gdk_draw_pixmap(inst->pixmap, gc, inst->pixmap, + 0, + (topline * inst->font_height + inst->cfg.window_border), + 0, + ((topline - lines) * inst->font_height + inst->cfg.window_border), + (inst->cfg.width * inst->font_width + 2*inst->cfg.window_border), + scrollarea_lines * inst->font_height); + } +} +#endif /* OPTIMISE_SCROLL */ + void ldisc_update(void *frontend, int echo, int edit) { /* @@ -1515,6 +1570,10 @@ dctx = smalloc(sizeof(*dctx)); dctx->inst = inst; dctx->gc = gdk_gc_new(inst->area->window); + + /* Make gdk_window_copy_area() generate expose events if neccessary. */ + gdk_gc_set_exposures(dctx->gc, TRUE); + return dctx; } Index: unix/unix.h =================================================================== RCS file: /home/cvs/putty/unix/unix.h,v retrieving revision 1.22 diff -u -r1.22 unix.h --- unix/unix.h 14 Jan 2003 18:43:45 -0000 1.22 +++ unix/unix.h 27 Jan 2003 10:58:25 -0000 @@ -78,4 +78,9 @@ */ int sk_getxdmdata(void *sock, unsigned long *ip, int *port); +/* + * Uncomment to enable the scroll optimisation code. + */ +/* #define OPTIMISE_SCROLL */ + #endif Revision-number: 2762 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2003-02-01T02:09:02.000000Z K 7 svn:log V 29 Misc tweaks to proxy section K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 32d3da0f08bc8d1ad1d82809b47f9fd5 Text-delta-base-sha1: 374c7bc53b9322aa8c3c8026fb68aa1e35d7a894 Text-content-length: 125 Text-content-md5: d27e61b36616c9b0bf26685fef5b4868 Text-content-sha1: 164d1a8d7d1db476bac3afd5b551a1cdcb86df1d Content-length: 165 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNTW[L;2~V\versionid $Id: config.but,v 1.53 2003/02/01 02:09:02 jacobfullyn%pass\nconnect %host %port Revision-number: 2763 Prop-content-length: 336 Content-length: 336 K 7 svn:log V 237 Richard's lazy-scrolling patch. This builds up scroll operations in a list, combining adjacent ones for the same region, and runs them all in do_paint. I'm not sure it's entirely right, but it works on my Mac in every case I've tested. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-01T12:26:33.000000Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 080dcc3bbf7ef863597c5575c1c187c2 Text-delta-base-sha1: f1d5ec3dc14a00e1443b877b095b8b17b7b98720 Text-content-length: 143 Text-content-md5: a1ae6868fc8c4e06674bbd456901bc57 Text-content-sha1: 68b30ad9e1014831976d6e4ca6035dbf41c9fe84 Content-length: 183 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNh`t3,H9//* $Id: macterm.c,v 1.61 2003/02/01 12:26:33Context ctx, int topline, int botline, int lines) { Session *s = ctx Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ba64cbed3ad061f289ff4c37134bca51 Text-delta-base-sha1: ce94e21c306eac6eade28d984959d8592ed7bc9e Text-content-length: 30 Text-content-md5: 482d3de2ba404932eb2c82b10ab5043a Text-content-sha1: b215cb12d2dbaee9a20ba41c42b476b4d0fa1d1c Content-length: 71 K 15 cvs2svn:cvs-rev V 5 1.200 PROPS-END SVNno PContext Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f2ccf53aeddba5fec76bb18e9f9625dd Text-delta-base-sha1: ce860766644fe54835dceac2170f38bfc0b00a69 Text-content-length: 2624 Text-content-md5: a2dd3357602fba1f8aa89862e05bfd43 Text-content-sha1: b6300b4723d84a81673f4f6cb6ba18ac11f955a5 Content-length: 2665 K 15 cvs2svn:cvs-rev V 5 1.139 PROPS-END SVN-/c.'F`Pdp#ifdef OPTIMISE_SCROLL term->scrollhead = term->scrolltail = NULL; #endif /* OPTIMISE_SCROLL */Add a scroll of a region on the screen into the pending scroll list. * `lines' is +ve for scrolling forward, -ve for backward. * * If the scroll is on the same area as the last scroll in the list, * merge them. */ void save_scroll(Terminal *term, int topline, int botline, int lines) { struct scrollregion *newscroll; if (term->scrolltail && term->scrolltail->topline == topline && term->scrolltail->botline == botline) { term->scrolltail->lines += lines; } else { newscroll = smalloc(sizeof(struct scrollregion)); newscroll->topline = topline; newscroll->botline = botline; newscroll->lines = lines; newscroll->next = NULL; if (!term->scrollhead) term->scrollhead = newscroll; else term->scrolltail->next = newscroll; term->scrolltail = newscroll; } } save_scroll(term#ifdef OPTIMISE_SCROLL struct scrollregion *sr; #endif /* OPTIMISE_SCROLL */#ifdef OPTIMISE_SCROLL /* Do scrolls */ sr = term->scrollhead; while (sr) { struct scrollregion *next = sr->next; do_scroll(ctx, sr->topline, sr->botline, sr->lines); sfree(sr); sr = next; } term->scrollhead = term->scrolltail = NULL; #endif /* OPTIMISE_SCROLL */&rr&0x0387, 1}, /* Greek ano teleia */ { 0x055a, 0x055f, 1}, /* Armenian punctuation */ { 0x0589, 0x0589, 1}, /* Armenian full stop */ { 0x0700, 0x070d, 1}, /* Syriac punctuation */ { 0x104a, 0x104f, 1}, /* Myanmar punctuation */ { 0x10fb, 0x10fb, 1}, /* Georgian punctuation */ { 0x1361, 0x1368, 1}, /* Ethiopic punctuation */ { 0x166d, 0x166e, 1}, /* Canadian Syl. punctuation */ { 0x17d4, 0x17dc, 1}, /* Khmer punctuation */ { 0x1800, 0x180a, 1}, /* Mongolian punctuation */ { 0x2000, 0x200a, 0}, /* Various spaces */ { 0x2070, 0x207f, 2}, /* superscript */ { 0x2080, 0x208f, 2}, /* subscript */ { 0x200b, 0x27ff, 1}, /* punctuation and symbols */ { 0x3000, 0x3000, 0}, /* ideographic space */ { 0x3001, 0x3020, 1}, /* ideographic punctuation */ { 0x303f, 0x309f, 3}, /* Hiragana */ { 0x30a0, 0x30ff, 3}, /* Katakana */ { 0x3300, 0x9fff, 3}, /* CJK Ideographs */ { 0xac00, 0xd7a3, 3}, /* Hangul Syllables */ { 0xf900, 0xfaff, 3}, /* CJK Ideographs */ { 0xfe30, 0xfe6b, 1}, /* punctuation forms */ { 0xff00, 0xff0f, 1}, /* half/fullwidth ASCII */ { 0xff1a, 0xff Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7fe54deccc32986b5f7cf9e4fa31b261 Text-delta-base-sha1: 7f8726a5b406549dab6256bea847c9ae58de53aa Text-content-length: 411 Text-content-md5: f9ea6dd9b731c1f255bc900720f85491 Text-content-sha1: 599c64fd9a807f2e3fb7a6e5ea326e6c9695aff3 Content-length: 450 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNbb|pneg{#ifdef OPTIMISE_SCROLL struct scrollregion { struct scrollregion *next; int topline; /* Top line of scroll region. */ int botline; /* Bottom line of scroll region. */ int lines; /* Number of lines to scroll by - +ve is forwards. */ }; #endif /* OPTIMISE_SCROLL */#ifdef OPTIMISE_SCROLL struct scrollregion *scrollhead, *scrolltail; #endif /* OPTIMISE_SCROLL */ Revision-number: 2764 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2003-02-01T12:28:43.000000Z K 7 svn:log V 116 Fix the gcc warnings in this module (since we now seem to be building -Werror under Unix this is quite important!). K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a2dd3357602fba1f8aa89862e05bfd43 Text-delta-base-sha1: b6300b4723d84a81673f4f6cb6ba18ac11f955a5 Text-content-length: 886 Text-content-md5: 595b2a197c5b3b7331f8ed5e60c5b962 Text-content-sha1: 1310d3b77d23daa287b7d89325885a3234e4bdbe Content-length: 927 K 15 cvs2svn:cvs-rev V 5 1.140 PROPS-END SVNwbv:K:QAR =(K[puE5LC C+Vz|#u(unsigned)(text[0] >= 0x40 && text[0] <= 0x5f) || (text[0] >= 0x61 && text[0] <= 0x7a) default: break; /* else gcc warns `enum value not used' */ default: break; /* else gcc warns `enum value not used' */ default: break; /* else gcc warns `enum value not used' */ default: break; /* else gcc warns `enum value not used' */ default: break; /* else gcc warns `enum value not used' */ default: break; /* else gcc warns `enum value not used' */ default: break; /* else gcc warns `enum value not used' */ default: break; /* else gcc warns `enum value not used' */ default: break; /* else gcc warns `enum value not used' */ default: break; /* else gcc warns `enum value not used' */ default: break; /* else gcc warns `enum value not used'(unsigned) Revision-number: 2765 Prop-content-length: 946 Content-length: 946 K 8 svn:date V 27 2003-02-01T12:54:40.000000Z K 7 svn:log V 845 Created new data types `Filename' and `FontSpec', intended to be opaque to all platform-independent modules and only handled within per-platform code. `Filename' is there because the Mac has a magic way to store filenames (though currently this checkin doesn't support it!); `FontSpec' is there so that all the auxiliary stuff such as font height and charset and so on which is needed under Windows but not Unix can be kept where it belongs, and so that I can have a hope in hell of dealing with a font chooser in the forthcoming cross-platform config box code, and best of all it gets the horrid font height wart out of settings.c and into the Windows code where it should be. The Mac part of this checkin is a bunch of random guesses which will probably not quite compile, but which look roughly right to me. Sorry if I screwed it up, Ben :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3c5cc51b5d4c7f1068c42756f3b4e8d0 Text-delta-base-sha1: cf68fff8b6c4638669250810b3a56681f36e4f35 Text-content-length: 56 Text-content-md5: c692e4ba6eeff1bd4d9e6ce9d285acb0 Text-content-sha1: c0a0f8c323fd2a1bcae2ebb6d2124c7d07a02c37 Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNJaRFR/G uxmisc winmisc winmisc Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a0c095b3a04b13834019103557ee92a5 Text-delta-base-sha1: 0825c7159453ca0fad9420b6746195b2aa5627cf Text-content-length: 60 Text-content-md5: cf7e4630937c45347d1516d127e1a159 Text-content-sha1: 097722fc0de638cc9036a16e9a23fb4c4b0aea55 Content-length: 99 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN g '#}cfg->keyfile = filename_from_str(value) Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1d961e538aa534b58ab545022a5634ad Text-delta-base-sha1: 2cffc5a26db3343b393e7126f7db36b500d39cfb Text-content-length: 139 Text-content-md5: 57e3155b258e62118d32f65c3b543100 Text-content-sha1: 2dffcefcff838778d9f5072f0782b0988b4e9e87 Content-length: 179 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN=Jon.tf?~Filename .path); fflush(stderr); return 0; } fprintf(stderr, msgtemplate, FILENAME_MAX, filename.path Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c1d135665099f26f5096c13ab94b24a5 Text-delta-base-sha1: cf7bd41012d871f398eeed01be6d5fe21779f28b Text-content-length: 1224 Text-content-md5: aa7c4ffbd91f0ca2a92fae2c1cb34674 Text-content-sha1: 7a753d0ab542f05b905acc4da252c2b436ae0d12 Content-length: 1264 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN 1<1U 2ExyVxgcbm.lb:Q~4I7*3I`{.g,g{%T7putty.h"onst Filename *filename); struct ssh2_userkey *openssh_read(const Filename *filename, char *passphrase); int openssh_write(const Filename *filename, struct ssh2_userkey *key, char *passphrase); int sshcom_encrypted(const Filename *filename, char **comment); struct ssh2_userkey *sshcom_read(const Filename *filename, char *passphrase); int sshcom_write(const Filename *filename, struct ssh2_userkey *key, onst Filename *filename, int type, char **comment) { if (type == SSH_KEYTYPE_OPENSSH) { /* OpenSSH doesn't do key comments */ *comment = dupstr(filename_to_str(*filename));onst Filename *filename, int type, onst Filename *filename, int type, onst Filename *filename, int type, struct RSAKey *key, char *passphrase) { return 0; } /* * Export an SSH2 key. */ int export_ssh2(const Filenameonst Filename_open(*onst Filenameonst Filenameonst Filename *filename, struct ssh2_userkey *key, _open(*filename, "wb");onst Filename_open(*onst Filenameonst Filenameonst Filename *filename, struct ssh2_userkey *key, _open(*filename, "wb"); Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6b914a9af7715dae17517f593d19cf32 Text-delta-base-sha1: e4ce6e12ca793960718ba887026c82dc1b790849 Text-content-length: 578 Text-content-md5: 69570444c740a5847ecc0e7c74123f9e Text-content-sha1: 4f7a9f37e14869e1b7c2edc38a104e70ef544909 Content-length: 618 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN.a- Bo54Tn; )YJN)l?mFilename currlogfilename; void *frontend; Config cfg; }; static void xlatlognam(Filename *d, Filename &ctx->currlogfilename, ctx->cfg.logfilename,ctx->cfg.host, &tm); ctx->lgfp = f__filename_to_str(ctx->currlogfilename)!filename_equalFilename *dest, Filename src, char *hostname, struct tm *tm) { char buf[10], *bufp; int size; char buffer[FILENAME_MAX]; int len = sizeof(buffer)-1; char *d, *s; d = buffer; s = filename_to_str(src) *dest = filename_from_str(s); } Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 48680975fb5966d5509cae95eb06b0ef Text-delta-base-sha1: a8238b4cdcaa9ba73eb10fe30913922867255521 Text-content-length: 1085 Text-content-md5: 14df852f774f86f4872a1dcd0e7b4af6 Text-content-sha1: 0ccaef32c43c2cb9493ff2d75a71fc15d27b18ef Content-length: 1125 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN %K+DB".Hq@`/* $Id: mac.c,v 1.38 2003/02/01 12:54:40 simoFontSpec platform_default_font(char const *name) { FontSpec ret;strcpy(ret.name, "Monaco"); ret.height = LoWord(smfs); p2cstrcpy(ret.name, pname); } else { strcpy(ret.name, "Monaco"); ret.height = 9; } ret.isbold = 0; } else { ret.name[0] = '\0'; } return ret; } Filename platform_default_filename(const char *name) { Filename ret; if (!strcmp(name, "LogFileName")) strcpy(ret.path, "putty.log"); else *ret.path = '\0'; return ret; } char *platform_default_s(char const *name) { return NULL; } int platform_default_i(char const *name, int def) { long smfs;Filename filename_from_str(char *str) { Filename ret; strncpy(ret.path, str, sizeof(ret.path)); ret.path[sizeof(ret.path)-1] = '\0'; return ret; } char *filename_to_str(Filename fn) { return fn.path; } int filename_equal(Filename f1, Filename f2) { return !strcmp(f1.path, f2.path); } int filename_is_null(Filename fn) { return !*fn.path; Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8b7ca0ace2362b355235f2f90fdcb7ab Text-delta-base-sha1: 95378351f66fd23e0c2bdf79b32039dbe3e79128 Text-content-length: 276 Text-content-md5: 28da66744829c3357fa57fd31c4cac07 Text-content-sha1: 7cfa08c5ebe53396271442d4d57baacf06f103a7 Content-length: 316 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN ||  /* for FILENAME_MAX */ #include "charset.h" struct Filename { char path[FILENAME_MAX]; }; #define f_open(filename, mode) ( fopen((filename).path, (mode)) ) struct FontSpec { char name[64]; int isbold; int height; }; Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b430c29c1d9d80b6469959bcc76315e9 Text-delta-base-sha1: b5b53e87a8153cf336006149a4e22b01ee086126 Text-content-length: 1377 Text-content-md5: 9f8f846d990ce8fcdc669174c4b80af3 Text-content-sha1: 19a3e637327fbac4e05eae27a7a940b56a3d32c6 Content-length: 1417 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNLi H10p\/* $Id: macstore.c,v 1.13 2003/02/01 12:54:40 simoint read_setting_fontspec(void *handle, const char *name, FontSpec *result) { char *settingname; FontSpec ret; if (!read_setting_s(handle, name, ret.name, sizeof(ret.name))) return 0; settingname = dupcat(name, "IsBold", NULL); ret.isbold = read_setting_i(handle, settingname, -1); sfree(settingname); if (ret.isbold == -1) return 0; if (ret.charset == -1) return 0; settingname = dupcat(name, "Height", NULL); ret.height = read_setting_i(handle, settingname, INT_MIN); sfree(settingname); if (ret.height == INT_MIN) return 0; *result = ret; return 1; } void write_setting_fontspec(void *handle, const char *name, FontSpec font) { char *settingname; write_setting_s(handle, name, font.name); settingname = dupcat(name, "IsBold", NULL); write_setting_i(handle, settingname, font.isbold); sfree(settingname); settingname = dupcat(name, "Height", NULL); write_setting_i(handle, settingname, font.height); sfree(settingname); } int read_setting_filename(void *handle, const char *name, Filename *result) { return !!read_setting_s(handle, name, result->path, sizeof(result->path)); } void write_setting_filename(void *handle, const char *name, Filename result) { write_setting_s(handle, name, result.path) Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a1ae6868fc8c4e06674bbd456901bc57 Text-delta-base-sha1: 68b30ad9e1014831976d6e4ca6035dbf41c9fe84 Text-content-length: 294 Text-content-md5: 376886b75436a048f0ecab8678d8da6e Text-content-sha1: 2f0f14daadf9ba240126ecec9c3d722365669802 Content-length: 334 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVN`xGQ8/ 4kc!"w;2@oZO/* $Id: macterm.c,v 1.62 2003/02/01 12:54:40 simo.name); GetFNum(macfont, &s->fontnum); TextFont(s->fontnum); TextFace(s->cfg.font.isbold ? bold : 0); TextSize(s->cfg.font....name.....Filename Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a3cae2cd811d1a17b2d37eca9d5e1d3a Text-delta-base-sha1: 875e032d0577d5ea83e3c656ec00b8c4e2de2bb1 Text-content-length: 89 Text-content-md5: 40d0f194bd566a7d59fd65981ed814d1 Text-content-sha1: 06845b151f73385564fce45720bbefb26c3d7c13 Content-length: 129 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN~C C:CF8typedef struct Filename Filename; typedef struct FontSpec FontSpec; Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 92b31504f0ea84387d55a52d37d59380 Text-delta-base-sha1: fe1c509f2b2767e706ec8b131a055b15bdac6bbc Text-content-length: 356 Text-content-md5: 349ae0131dbd7aa0805487eaea619f8a Text-content-sha1: e7e3232f445cb176390ecdf57ceef9bf07caf002 Content-length: 396 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVNzPK dzY Y^ykWqq-\ELE1 ?Uwhputty.h"Filename &&&filename, NULL, &bloblen); if (!blob&filename, &comment); else needs_pass = ssh2_userkey_encrypted(&&filename, rkey, passphrase); else { skey = ssh2_load_userkey(&name_from_str(filelist)_from_str(filename)filename_from_str(argv[i]) Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 482d3de2ba404932eb2c82b10ab5043a Text-delta-base-sha1: b215cb12d2dbaee9a20ba41c42b476b4d0fa1d1c Text-content-length: 842 Text-content-md5: c6f62e3d7bf618191a77a5daafb2d658 Text-content-sha1: f508c9f85f3d10bf04bc9494bb8e64498706cde7 Content-length: 883 K 15 cvs2svn:cvs-rev V 5 1.201 PROPS-END SVNo<7^AqlL!XhC@J7*gh#ifndef PUTTY_PUTTY_H #define PUTTY_PUTTY_H #include "miscFilename keyfileFilename bell_wavefileFontSpec font; Filename logfilenameFontSpec boldfont; FontSpec widefont; FontSpec wideboldfont The * Filename and FontSpec functions are _not allowed_ to fail to * return, since these defaults _must_ be per-platform.) */ char *platform_default_s(const char *name); int platform_default_i(const char *name, int def); Filename platform_default_filename(const char *name); FontSpec platform_default_fontspec(const char *nameFilename /* * Miscellaneous exports from the platform-specific code. */ Filename filename_from_str(char *string); char *filename_to_str(Filename fn); int filename_equal(Filename f1, Filename f2); int filename_is_null(Filename fn); #endif Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d2a884abc570b7e64f11c55a6e3e56a8 Text-delta-base-sha1: 4f99e299f10c43e30069a9125835d613f5041852 Text-content-length: 582 Text-content-md5: 3d10225183d67e48fb888e018a844638 Text-content-sha1: ab51c583aeb47330f1d724d8826c751fbcafaa05 Content-length: 622 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNjcaW{k&+,FtDVQ!6[(:;,}](/ DZFilename &&filename, &comment); else if (realtype == SSH_KEYTYPE_SSH2) needs_pass = ssh2_userkey_encrypted(&filename, &comment); else needs_pass = import_encrypted(&&filename, &newkey1, passphrase); else ret = import_ssh1(&&filename, passphrase); else newkey2 = import_ssh2(&filename_from_str(cmdline_keyfile) Filename fn = filename_from_str(filename);2(&fn&fn Filename fn = filename_from_str(filename);&fn&fn_from_str(filename) Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9b6fa3bd3c0ceb80cc9d48b6dc458eb6 Text-delta-base-sha1: b28e0be9cef4842c95578a18086757ae30db777b Text-content-length: 908 Text-content-md5: 650aec0e7c28fc3d6c042a01c460fd4d Text-content-sha1: 7ff66852c6b31bcfeb175c528f809b91b013f4ff Content-length: 949 K 15 cvs2svn:cvs-rev V 5 1.101 PROPS-END SVN(PK3gmcZQQ,~"pJ\00NFM@'&/* * gppfont and gppfile cannot have local defaults, since the very * format of a Filename or Font is platform-dependent. So the * platform-dependent functions MUST return some sort of value. */ static void gppfont(void *handle, const char *name, FontSpec *result) { if (!read_setting_fontspec(handle, name, result)) *result = platform_default_fontspec(name); } static void gppfile(void *handle, const char *name, Filename *result) { if (!read_setting_filename(handle, name, result)) *result = platform_default_filename(name);filenamefilenamefilenamefontspec(sesskey, "Font", cfg->fonfontspecfile(sesskey, "LogFileName", &cfg->logfilenamefile(sesskey, "PublicKeyFile", &cfg->keyfilefile(sesskey, "BellWaveFile", &cfg->bell_wavefilefont(sesskey, "Font", &cfg->font);font(sesskey, "BoldFont", &cfg->boldfont Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7f03f7112d903e72606951e85ea7de10 Text-delta-base-sha1: b082db57d59b756336c01bfb1874ca5a50b8ba10 Text-content-length: 349 Text-content-md5: 9f96da28d312f7335cbac2aa8bdc232d Text-content-sha1: 954d32be5639347537c97742756c9fb3e8afaa26 Content-length: 390 K 15 cvs2svn:cvs-rev V 5 1.270 PROPS-END SVN0Pwzacvy o; !filename_is_null(ssh->cfg.keyfile)) { if (!rsakey_pubblob(&!filename_is_null(ssh->cfg.keyfile)&&&filename_to_str(ssh->cfg.keyfile)2/an|l{g]z>WH1_MSG_CHANNEL_CLOSE_CONFIRMATION) { /* Remote side clo!filename_is_null(ssh->cfg.keyfile)&&&&& Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bf89cba14d64d9bd636bb5c79ed6efaf Text-delta-base-sha1: 50c8da8b33e5e8bf03a317b285c18704c3a77fe7 Text-content-length: 947 Text-content-md5: fd10c69d903caed98fc352d4d54418e0 Text-content-sha1: 130ec6a8ecee6827acedde43dfb1d1f31f865c98 Content-length: 987 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVN:v&f[bok|cB(i`Z#include "misconst Filename *filename, struct RSAKey *key, char *passphrase); int rsakey_encrypted(const Filename *filename, char **comment); int rsakey_pubblob(const Filename *filename, void **blob, int *bloblen); int saversakey(const Filenameonst Filename *filename, char **comment); struct ssh2_userkey *ssh2_load_userkey(const Filename *filename, char *passphrase); char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm, int *pub_blob_len); int ssh2_save_userkey(const Filenameonst Filenameonst Filename *filename, int type, char **comment); int import_ssh1(const Filename *filename, int type, struct RSAKey *key, char *passphrase); struct ssh2_userkey *import_ssh2(const Filename *filename, int type, char *passphrase); int export_ssh1(const Filename *filename, int type, struct RSAKey *key, char *passphrase); int export_ssh2(const Filename Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 248e06a38a5e7798c582943b8b919f16 Text-delta-base-sha1: a7a93830e6a1f9be16a079a3004224eb3460b25c Text-content-length: 468 Text-content-md5: 075bb56c889af09a0b27ef7302a71fe3 Text-content-sha1: f9d9950befd456c69079e91273ec0f654ee430f1 Content-length: 508 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN 9Fn;_,vv]vv?`O"vVwa~djzs wk=s3LTP)jJJ9putty.h"onst Filename_open(*onst Filename *filename, char **comment) { FILE *fp; char buf[64]; fp = f_open(*onst Filename_open(*onst Filename *filename, struct RSAKey *key_open(*onst Filename *filename, _open(*onst Filename_open(*onst Filename_open(*onst Filename_open(*onst Filename_open(* Node-path: putty/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 352872dfce0b5b1700c97179ab0942e3 Text-delta-base-sha1: 446789847c2b6c95728a8ef1f122fb8b5328c8cc Text-content-length: 458 Text-content-md5: b31a0813c36cdd2afd14e9316985e14a Text-content-sha1: afe7a0f71e6e3b27444c0de03ac184944fc523a0 Content-length: 497 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN ="Ey=F2uwrite_setting_filename(void *handle, const char *key, Filename value); void write_setting_fontspec(void *handle, const char *key, FontSpec font * read_setting_filename() and read_setting_fontspec() each read into * the provided buffer, and return zero if they failed toint read_setting_filename(void *handle, const char *key, Filename *value); int read_setting_fontspec(void *handle, const char *key, FontSpec *font Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 57573864fe7d0b79d40e463df1dd3b61 Text-delta-base-sha1: c97bc6b747edf4c4353addd66c64e342f2670512 Text-content-length: 1556 Text-content-md5: 8de063a657347d75849ef2ae53f1079a Text-content-sha1: f005c2f843bcf1e5359d7c0949ddbb6a9ebea91b Content-length: 1596 K 15 cvs2svn:cvs-rev V 4 1.95 PROPS-END SVN"[+C+kPNruZr-Zweff.cdcpX+Ct<j0qqr7kFontSpec platform_default_fontspec(const char *name) { FontSpec ret; if (!strcmp(name, "Font")) strcpy(ret.name, "fixed"); else *ret.name = '\0'; return ret; } Filename platform_default_filename(const char *name) { Filename ret; if (!strcmp(name, "LogFileName")) strcpy(ret.path, "putty.log"); else *ret.path = '\0'; return ret; } char *platform_default_s(const char *name) {Filename .name, val, sizeof(cfg->font.name)); cfg->font.name[sizeof(cfg->font.name.name, val, sizeof(cfg->boldfont.name)); cfg->boldfont.name[sizeof(cfg->boldfont.name.name, val, sizeof(cfg->widefont.name)); cfg->widefont.name[sizeof(cfg->widefont.name.name, val, sizeof(cfg->wideboldfont.name)); cfg->wideboldfont.name[sizeof(cfg->wideboldfont.name.path, val, sizeof(cfg->logfilename.path)); cfg->logfilename.path[sizeof(cfg->logfilename.path.name); if (!inst->fonts[0]) { fprintf(stderr, "pterm: unable to load font \"%s\"\n", inst->cfg.font.name.name[0]) { inst->fonts[1] = gdk_font_load(inst->cfg.boldfont.name.name.name[0]) { inst->fonts[2] = gdk_font_load(inst->cfg.widefont.name); if (!inst->fonts[2]) { fprintf(stderr, "pterm: unable to load wide font \"%s\"\n", inst->cfg.widefont.name); exit(1); } set_font_info(inst, 2); } else inst->fonts[2] = NULL; if (inst->cfg.wideboldfont.name[0]) { inst->fonts[3] = gdk_font_load(inst->cfg.wideboldfont.namewideboldfont.name Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9368ed4babdffcfb9545767bed4cc5b0 Text-delta-base-sha1: 1ae3d30559efa385cfb26495360d13c962b8eaa3 Text-content-length: 291 Text-content-md5: de58a8233bfbf73cb4a392334b4b3d77 Text-content-sha1: 79260c9e6ab09ffb5a9e484ce53a21c971e99bdc Content-length: 331 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNn?/?#ifndef PUTTY_UNIX_H #define PUTTY_UNIX_H #include /* for FILENAME_MAX */ #include "charset.h" struct Filename { char path[FILENAME_MAX]; }; #define f_open(filename, mode) ( fopen((filename).path, (mode)) ) struct FontSpec { char name[256]; }; Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 19567cf0de77eed1e0b44b1976c26b66 Text-delta-base-sha1: 06ce4da1914489934f621aea158741c3a6ec207d Text-content-length: 139 Text-content-md5: de6c50dd816a93b2a61bec5703b7737f Text-content-sha1: ffb507a04366e645d2c7b1815afef280ace509d2 Content-length: 178 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN*7oQWfq9Filename .path); fflush(stderr); return 0; } fprintf(stderr, msgtemplate, FILENAME_MAX, filename.path Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 13d4c7005eb122ba6b07ad1d1ca70c20 Text-delta-base-sha1: 33c89eafe149890afa1fe1f5a69aca5ae844b9bc Text-content-length: 414 Text-content-md5: cd97e816e8a906c509e6964b31e52718 Text-content-sha1: 956ddbf46573940a467a7381858a1a7563336176 Content-length: 453 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN^g T Ru#include "putty.h" Filename filename_from_str(char *str) { Filename ret; strncpy(ret.path, str, sizeof(ret.path)); ret.path[sizeof(ret.path)-1] = '\0'; return ret; } char *filename_to_str(Filename fn) { return fn.path; } int filename_equal(Filename f1, Filename f2) { return !strcmp(f1.path, f2.path); } int filename_is_null(Filename fn) { return !*fn.path; } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 63897e20ed3688f0e30f9b56f1df7d6f Text-delta-base-sha1: eba1c4adbe38f5f50d91b6f93640a86d2a7a946f Text-content-length: 325 Text-content-md5: 49471c8a00358f55fe54d46e4eafa0f5 Text-content-sha1: 5878fc6acb3dfecad0e70505f72a7af2dc1690c7 Content-length: 365 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNHx +3+.FontSpec platform_default_fontspec(const char *name) { FontSpec ret; *ret.name = '\0'; return ret; } Filename platform_default_filename(const char *name) { Filename ret; if (!strcmp(name, "LogFileName")) strcpy(ret.path, "putty.log"); else *ret.path = '\0'; return ret Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 50ed1fa3f94d75cddf660e8c27fb1e4a Text-delta-base-sha1: cf9f95343622774d9ee7765619ac266ac9a119e7 Text-content-length: 596 Text-content-md5: 6fd301000dfa4f0f1cf40a53b2ebf033 Text-content-sha1: 953b04b3d88363d15413bf0e99b0117aceafa016 Content-length: 635 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN}? <z< tint read_setting_fontspec(void *handle, const char *name, FontSpec *result) { return !!read_setting_s(handle, name, result->name, sizeof(result->name)); } int read_setting_filename(void *handle, const char *name, Filename *result) { return !!read_setting_s(handle, name, result->path, sizeof(result->path)); } void write_setting_fontspec(void *handle, const char *name, FontSpec result) { write_setting_s(handle, name, result.name); } void write_setting_filename(void *handle, const char *name, Filename result) { write_setting_s(handle, name, result.path Node-path: putty/windefs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c89903b93a461ccae9e309db8d1a29e7 Text-delta-base-sha1: 06f995f86a9143a4bb00ceaf4f3383ea378d3367 Text-content-length: 607 Text-content-md5: 3b3af360067191daeec246e7cc3009ef Text-content-sha1: af40ce6f41637f5f67f077047831a8aca352de3b Content-length: 646 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN+~L2LFontSpec platform_default_fontspec(const char *name) { FontSpec ret; if (!strcmp(name, "Font")) { strcpy(ret.name, "Courier New"); ret.isbold = 0; ret.charset = ANSI_CHARSET; ret.height = 10; } else { ret.name[0] = '\0'; } return ret; } Filename platform_default_filename(const char *name) { Filename ret; if (!strcmp(name, "LogFileName")) strcpy(ret.path, "putty.log"); else *ret.path = '\0'; return ret; } char *platform_default_s(const char *name) { return NULL; } int platform_default_i(const char *name, int def) { return def; } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b8ba04a7279274fe3d8cf2d65e471885 Text-delta-base-sha1: 4ac20f9d58efb8eaf5542953c6edd5e080c852fc Text-content-length: 1126 Text-content-md5: 1eb0712c4c3709ded7ca00f7fefb0fe4 Text-content-sha1: 0f20d3df9f7b5043a671bc8050ab282084172ada Content-length: 1167 K 15 cvs2svn:cvs-rev V 5 1.206 PROPS-END SVNx/Jir$,&YR/+`Z]:UG5XF x;z;3 UN^,.name); if (cfg.font.isbold) strcat(buf, "bold, "); if (cfg.font..height < 0 ? -cfg.font.height : cfg.font..path.path.path.path..isbold ? FW_BOLD : 0); lf.lfCharSet = cfg.font..name.name, lf.lfFaceName, sizeof(cfg.font.name) - 1); cfg.font.name[sizeof(cfg.font.name) - 1] = '\0'; cfg.font.isbold = (lf.lfWeight == FW_BOLD); cfg.font.charset = lf.lfCharSet; cfg.font..pathBell Sound File"; of.Flags = 0; if (GetOpenFileName(&of)) { strcpy(cfg.bell_wavefile.path, filename); SetDlgItemText(hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile.path.path, sizeof(cfg.bell_wavefile.path.path, sizeof(cfg.logfilename.path.path.path, filename); SetDlgItemText(hwnd, IDC_LGFEDIT, cfg.logfilename.pathg~*+L<ZSuQHIqXOQagentfwd = IsDlgButtonChecked(hwnd, IDC.path, sizeof(cfg.keyfile.path.path.path, filename); SetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile.pathFilename .path Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 23274dffccdda4ff3831218ac6f34720 Text-delta-base-sha1: b920a5e5ad9c8a3bafd02e647ecb2994cb5c9703 Text-content-length: 559 Text-content-md5: 1994ddcbe97d93a5c28848c2be647966 Text-content-sha1: 7ecde9399ebde0716e0eda4246a0c5c237a73523 Content-length: 600 K 15 cvs2svn:cvs-rev V 5 1.238 PROPS-END SVNOk1f1x6-nczQKrR1Of m O...name) f(FONT_NORMAL, cfg.font...name...c = cfg.font.charset; w = fw_dontcare; u = FALSE; s = cfg.font.name.name, prev_cfg.font.name) != 0 || strcmp(cfg.line_codepage, prev_cfg.line_codepage) != 0 || cfg.font.isbold != prev_cfg.font.isbold || cfg.font.height != prev_cfg.font.height || cfg.font.charset != prev_cfg.font.^FdqdIU9%andling (i.e. bring up the System menu).name.name.path, NULL, Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 64127c00d2341198ca3ddb2b02f2f907 Text-delta-base-sha1: d9eeacc828d26932d0ad3b398d84fc228463d493 Text-content-length: 392 Text-content-md5: e045783f01551002af6885ef0bf9072a Text-content-sha1: 09914d981a9bbd64dcd6d8fdd8d18868d7dcd234 Content-length: 431 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN;0u;u Filename filename_from_str(char *str) { Filename ret; strncpy(ret.path, str, sizeof(ret.path)); ret.path[sizeof(ret.path)-1] = '\0'; return ret; } char *filename_to_str(Filename fn) { return fn.path; } int filename_equal(Filename f1, Filename f2) { return !strcmp(f1.path, f2.path); } int filename_is_null(Filename fn) { return !*fn.path; } Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b6c24b318c01b9da5aee06e9b54bd0b5 Text-delta-base-sha1: 7362ff89b3ab4100b91da3ba57f9d285c9730e6e Text-content-length: 1873 Text-content-md5: eac6992c707392a56602001192da1fe1 Text-content-sha1: 4e157363671272078a3fa70ce47488225b8897c0 Content-length: 1913 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNM3&!,S5 oldh) newh--; ret.height = newh; } *result = ret; return 1; } void write_setting_fontspec(void *handle, const char *name, FontSpec font) { char *settingname; write_setting_s(handle, name, font.name); settingname = dupcat(name, "IsBold", NULL); write_setting_i(handle, settingname, font.isbold); sfree(settingname); settingname = dupcat(name, "CharSet", NULL); write_setting_i(handle, settingname, font.charset); sfree(settingname); settingname = dupcat(name, "Height", NULL); write_setting_i(handle, settingname, font.height); sfree(settingname); } int read_setting_filename(void *handle, const char *name, Filename *result) { return !!read_setting_s(handle, name, result->path, sizeof(result->path)); } void write_setting_filename(void *handle, const char *name, Filename result) { write_setting_s(handle, name, result.path) Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 128bd1ebc334e063a1be6fcadafb3a2f Text-delta-base-sha1: caafd19543c777a30d9c48aa8c356b88530c61d0 Text-content-length: 278 Text-content-md5: 4b0e48c2b21b82d02cff9380f45a1d56 Text-content-sha1: 69a2330d89d547922c02d4075dff6908c5392dbc Content-length: 318 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN o%m#include /* for FILENAME_MAX */ struct Filename { char path[FILENAME_MAX]; }; #define f_open(filename, mode) ( fopen((filename).path, (mode)) ) struct FontSpec { char name[64]; int isbold; int height; int charset; }; Revision-number: 2766 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2003-02-01T15:42:01.000000Z K 7 svn:log V 27 Make save_scroll() static. K 10 svn:author V 3 ben PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 595b2a197c5b3b7331f8ed5e60c5b962 Text-delta-base-sha1: 1310d3b77d23daa287b7d89325885a3234e4bdbe Text-content-length: 57 Text-content-md5: bb688c16e7ea9e1a585adea7b30950bb Text-content-sha1: 455f4238ce1ebd7bbd65e7b4723f2cdbf94efd1d Content-length: 98 K 15 cvs2svn:cvs-rev V 5 1.141 PROPS-END SVN  m static w~wx0387, Revision-number: 2767 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2003-02-01T15:44:08.000000Z K 7 svn:log V 148 Tidy up Simon's FontSpec abstraction. Also, make fontspec_to_str not return the address of an automatic variable. It now has a memory leak instead. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 14df852f774f86f4872a1dcd0e7b4af6 Text-delta-base-sha1: 0ccaef32c43c2cb9493ff2d75a71fc15d27b18ef Text-content-length: 418 Text-content-md5: 49a99c53ddad88a359a40f206b495734 Text-content-sha1: 0f6fe0b9d8be073ff736c4467b39e9845b027b76 Content-length: 458 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN%w#qi-dxYOO-VO/* $Id: mac.c,v 1.39 2003/02/01 15:44:08 bespec(char const *name) { FontSpec ret; long smfsret.name); if (ret.name[0] == 0) memcpy(ret.name, "\pMonaco", 7); ret.size = LoWord(smfs); } else { memcpy(ret.name, "\pMonaco", 7); ret.size = 9; } ret.face = 0; } else { ret.name[0] = 0/* FIXME: Memory leak! */ return dupstr(fn.path) Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 28da66744829c3357fa57fd31c4cac07 Text-delta-base-sha1: 7cfa08c5ebe53396271442d4d57baacf06f103a7 Text-content-length: 32 Text-content-md5: 8b7ca0ace2362b355235f2f90fdcb7ab Text-content-sha1: 95378351f66fd23e0c2bdf79b32039dbe3e79128 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN  "charset.h" Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9f8f846d990ce8fcdc669174c4b80af3 Text-delta-base-sha1: 19a3e637327fbac4e05eae27a7a940b56a3d32c6 Text-content-length: 709 Text-content-md5: a8b72e28080fdbdb5086252defb44fb3 Text-content-sha1: d976c803d9261c40e0de3eb107fc7a101e9a5a8a Content-length: 749 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNiT(2XO?`6+>/* $Id: macstore.c,v 1.14 2003/02/01 15:44:08 be char tmp[256]; if (!read_setting_s(handle, name, tmp, sizeof(tmp))) return 0; c2pstrcpy(ret.name, tmp); settingname = dupcat(name, "Face", NULL); ret.face = read_setting_i(handle, settingname, 0ret.size = read_setting_i(handle, settingname, 0); sfree(settingname); if (ret.size == 0 char tmp[256]; p2cstrcpy(tmp, font.name); write_setting_s(handle, name, tmp); settingname = dupcat(name, "Face", NULL); write_setting_i(handle, settingname, font.face); sfree(settingname); settingname = dupcat(name, "Size", NULL); write_setting_i(handle, settingname, font.size Node-path: putty/mac/macstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 30265c088180111884e01ff91b5f2630 Text-delta-base-sha1: 047afe65f441b16efbfd235eb4061ddd53108415 Text-content-length: 327 Text-content-md5: c0f104d889e78361d300311b2175f595 Text-content-sha1: c6dc7c9361fed7e6bff2e304751b3d4b5b0274a6 Content-length: 366 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNK~ 1t1Yr#include #include /* for FILENAME_MAX */ struct Filename { char path[FILENAME_MAX]; }; #define f_open(filename, mode) ( fopen((filename).path, (mode)) ) /* Suspiciously similar to an ICFontRecord */ struct FontSpec { short size; Style face; Str255 name; }; Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 376886b75436a048f0ecab8678d8da6e Text-delta-base-sha1: 2f0f14daadf9ba240126ecec9c3d722365669802 Text-content-length: 454 Text-content-md5: ec44409591851755abb9665dd65a5ce9 Text-content-sha1: 8549bdac2a9bb6ebba53982b9924081decedd62f Content-length: 494 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNxlVb.1Xs/zz/l/,"es& 9tYrS KZy/* $Id: macterm.c,v 1.63 2003/02/01 15:44:08 beGetFNum(s->cfg.font.name, &s->fontnum); TextFont(s->fontnum); TextFace(s->cfg.font.face); TextSize(s->cfg.font.sizesizesizes->cfg.font.name char cfontname[256]; no_encv: s->uni_to_font = NULL; p2cstrcpy(cfontname, s->cfg.font.name)cfontsizesizesizesizestyle = s->cfg.font.face; if ( Revision-number: 2768 Prop-content-length: 238 Content-length: 238 K 8 svn:date V 27 2003-02-01T17:24:27.000000Z K 7 svn:log V 137 Oops, Ben is quite right about the rather appalling design of filename_from_str. Here's a better fix, with some const repercussions too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aa7c4ffbd91f0ca2a92fae2c1cb34674 Text-delta-base-sha1: 7a753d0ab542f05b905acc4da252c2b436ae0d12 Text-content-length: 23 Text-content-md5: ed142253c2949ac6ddb70658298d9fbd Text-content-sha1: 3cd791b7e62ae44f4c020d3a75fb1aa7b9578e93 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN ]*^ Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 69570444c740a5847ecc0e7c74123f9e Text-delta-base-sha1: 4f7a9f37e14869e1b7c2edc38a104e70ef544909 Text-content-length: 98 Text-content-md5: 74bf122f5f10e73ef45d8313270f953b Text-content-sha1: 899460fccbd6ad6233f4b203bd4e6ed26bf01006 Content-length: 138 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNarFFFby&; const char *s; d = buffer; s = filename_to_str(&d); } Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 49a99c53ddad88a359a40f206b495734 Text-delta-base-sha1: 0f6fe0b9d8be073ff736c4467b39e9845b027b76 Text-content-length: 152 Text-content-md5: 814f06f7d2db05b0c6702122f6121613 Text-content-sha1: 832518aee683775de13bb822ab49ae8df07cfe59 Content-length: 192 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNwfv+ :DV!/* $Id: mac.c,v 1.40 2003/02/01 17:24:26 simoonst onst char *filename_to_str(const Filename *fn) { return fn->path Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 93dcc5d16fd3f856c1b39e47d6af25fc Text-delta-base-sha1: 53463659bc86cf24ff01b7a211974302110ea306 Text-content-length: 32 Text-content-md5: 1ac8a282e81572bc25f5db23d6fd299b Text-content-sha1: 0209b3692de31949c39db3620e44e2ee84b31693 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVN! ];] const Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a01e93ff520d4e1f9d2b3427b2b4b454 Text-delta-base-sha1: 779c32cb7b956042c31f835f71d6edc22c957a40 Text-content-length: 29 Text-content-md5: 7abbb00e744808b8eff7f8c50c16b071 Text-content-sha1: b15d2436847a11be860a990d8255eaa854076d3a Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN7= / -onst Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c6f62e3d7bf618191a77a5daafb2d658 Text-delta-base-sha1: f508c9f85f3d10bf04bc9494bb8e64498706cde7 Text-content-length: 100 Text-content-md5: 78456bfad23d57e31a9268934cf16007 Text-content-sha1: 1cbfeb1658883f9f103092aa5a63e63f28158697 Content-length: 141 K 15 cvs2svn:cvs-rev V 5 1.202 PROPS-END SVNpktin.type == SS Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bb688c16e7ea9e1a585adea7b30950bb Text-delta-base-sha1: 455f4238ce1ebd7bbd65e7b4723f2cdbf94efd1d Text-content-length: 45 Text-content-md5: c3a405b0190b641ae72405e821dbfb8e Text-content-sha1: 08bf9f4e04bf49ed77caed211173fbbbd64de1c0 Content-length: 86 K 15 cvs2svn:cvs-rev V 5 1.142 PROPS-END SVN~ dbonst Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cd97e816e8a906c509e6964b31e52718 Text-delta-base-sha1: 956ddbf46573940a467a7381858a1a7563336176 Text-content-length: 97 Text-content-md5: 68e00f800e0026f0798b70a1b28ff8b2 Text-content-sha1: 3d8085857366f814e43206a363ad3a7f4db75176 Content-length: 136 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNg{E @Jonst onst char *filename_to_str(const Filename *fn) { return fn-> Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 49471c8a00358f55fe54d46e4eafa0f5 Text-delta-base-sha1: 5878fc6acb3dfecad0e70505f72a7af2dc1690c7 Text-content-length: 32 Text-content-md5: 298beda7176778afb74bdc27010f915e Text-content-sha1: 09b41dd6d50fd3cb9e8375df3a8c47cb1227b856 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNx gg const Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e045783f01551002af6885ef0bf9072a Text-delta-base-sha1: 09914d981a9bbd64dcd6d8fdd8d18868d7dcd234 Text-content-length: 97 Text-content-md5: e89e62caafb3321f4cd7c3aa326ab74e Text-content-sha1: 6c40c3ea0215ec87f1a9eb2f8e41d83a9ee1b7d3 Content-length: 136 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN0DEX W@onst onst char *filename_to_str(const Filename *fn) { return fn-> Revision-number: 2769 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2003-02-01T17:25:06.000000Z K 7 svn:log V 88 Initialise a variable that might otherwise have caused trouble. Thanks to Ross Younger. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 075bb56c889af09a0b27ef7302a71fe3 Text-delta-base-sha1: f9d9950befd456c69079e91273ec0f654ee430f1 Text-content-length: 35 Text-content-md5: 6ab08807c2cb67c2d923edf64bce0ee0 Text-content-sha1: 236bd06e9da2b92e731b795dd86f373c6f4264cc Content-length: 75 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN  tsencryption = Revision-number: 2770 Prop-content-length: 197 Content-length: 197 K 8 svn:date V 27 2003-02-01T21:39:59.000000Z K 7 svn:log V 99 In xlatlognam(), use the start of the destination buffer as the destination filename, not the end. K 10 svn:author V 3 ben PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 74bf122f5f10e73ef45d8313270f953b Text-delta-base-sha1: 899460fccbd6ad6233f4b203bd4e6ed26bf01006 Text-content-length: 27 Text-content-md5: dd7869f1dc06192ba971b80e218aab85 Text-content-sha1: 1dcf4a5d9ea6cb8f641343b845eb5a0966f8c6d1 Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNrw lbuffer); } Revision-number: 2771 Prop-content-length: 553 Content-length: 553 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-01T21:44:05.000000Z K 7 svn:log V 454 Rather more natural (if much more complex) Mac Filename implementation. Filenames are represented as a FSSpec, which is converted to and from an alias record ('alis' resource) when saving and loading sessions. . It might be an idea to allow in-core Filenames to contain alias records too, so that they can refer to directories that don't exist on the current system, but that requires Filenames to be dynamically allocated, which is likely to be a pain. PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 814f06f7d2db05b0c6702122f6121613 Text-delta-base-sha1: 832518aee683775de13bb822ab49ae8df07cfe59 Text-content-length: 1919 Text-content-md5: 9f1430e744ae5db444faff6d349f74e8 Text-content-sha1: f147921727a563dbccd20fa54a85d957836ab71f Content-length: 1959 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNf[j-SP]A%/* $Id: mac.c,v 1.41 2003/02/01 21:44:05 beFSMakeFSSpec(0, 0, "\pputty.log", &ret.fss); else memset(&ret, 0, sizeof(ret))Str255 tmp; /* XXX This fails for filenames over 255 characters long. */ c2pstrcpy(tmp, str); FSMakeFSSpec(0, 0, tmp, &ret.fss); return ret; } /* * Convert a filename to a string for display purposes. * See pp 2-44--2-46 of IM:Files * * XXX static storage considered harmful */ const char *filename_to_str(const Filename *fn) { CInfoPBRec pb; Str255 dirname; OSErr err; static char *path = NULL; char *newpath; if (path != NULL) sfree(path); path = smalloc(fn->fss.name[0]); p2cstrcpy(path, fn->fss.name); pb.dirInfo.ioNamePtr = dirname; pb.dirInfo.ioVRefNum = fn->fss.vRefNum; pb.dirInfo.ioDrParID = fn->fss.parID; pb.dirInfo.ioFDirIndex = -1; do { pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrParID; err = PBGetCatInfoSync(&pb); /* XXX Assume not A/UX */ newpath = smalloc(strlen(path) + dirname[0] + 2); p2cstrcpy(newpath, dirname); strcat(newpath, ":"); strcat(newpath, path); sfree(path); path = newpath; } while (pb.dirInfo.ioDrDirID != fsRtDirID); return path; } int filename_equal(Filename f1, Filename f2) { return f1.fss.vRefNum == f2.fss.vRefNum && f1.fss.parID == f2.fss.parID && f1.fss.name[0] == f2.fss.name[0] && memcmp(f1.fss.name + 1, f2.fss.name + 1, f1.fss.name[0]) == 0; } int filename_is_null(Filename fn) { return fn.fss.vRefNum == 0 && fn.fss.parID == 0 && fn.fss.name[0] == 0; } FILE *f_open(Filename fn, char const *mode) { short savevol; long savedir; char tmp[256]; FILE *ret; HGetVol(NULL, &savevol, &savedir); if (HSetVol(NULL, fn.fss.vRefNum, fn.fss.parID) == noErr) { p2cstrcpy(tmp, fn.fss.name); ret = fopen(tmp, mode); } else ret = NULL; HSetVol(NULL, savevol, savedir); return ret Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a8b72e28080fdbdb5086252defb44fb3 Text-delta-base-sha1: d976c803d9261c40e0de3eb107fc7a101e9a5a8a Text-content-length: 2326 Text-content-md5: a8f417cd9d9b6172fb5eb1e73f45dc3b Text-content-sha1: 7471920207a9456379f8f59b7ba16e9d829b136b Content-length: 2366 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNT5 jl-nG!)Ltqc/* $Id: macstore.c,v 1.15 2003/02/01 21:44:05int fd; AliasHandle h; Boolean changed; OSErr err(AliasHandle)get1namedresource(rAliasType, name); if (h == NULL) goto out; if ((*h)->userType == 'pTTY' && (*h)->aliasSize == sizeof(**h)) memset(result, 0, sizeof(*result)); else { err = ResolveAlias(NULL, h, &result->fss, &changed); if (err != noErr && err != fnfErr) goto out; if ((*h)->userType == 'pTTY') { long dirid; StrFileName fname; /* Tail of record is pascal string contaning leafname */ if (FSpGetDirID(&result->fss, &dirid, FALSE) != noErr) goto out; memcpy(fname, (char *)*h + (*h)->aliasSize, GetHandleSize((Handle)h) - (*h)->aliasSize); err = FSMakeFSSpec(result->fss.vRefNum, dirid, fname, &result->fss); if (err != noErr && err != fnfErr) goto out; } } ReleaseResource((Handle)h); if (ResError() != noErr) goto out; return 1; out: return 0; } void write_setting_filename(void *handle, const char *name, Filename fn) { int fd = *(int *)handle; Aliasif (filename_is_null(fn)) { /* Generate a special "null" alias */ h = (AliasHandle)NewHandle(sizeof(**h)); if (h == NULL) fatalbox("Failed to create fake alias"); (*h)->userType = 'pTTY'; (*h)->aliasSize = sizeof(**h); } else { error = NewAlias(NULL, &fn.fss, &h); if (error == fnfErr) { /* * NewAlias can't create an alias for a nonexistent file. * Create an alias for the directory, and record the * filename as well. */ FSSpec tmpfss; FSMakeFSSpec(fn.fss.vRefNum, fn.fss.parID, NULL, &tmpfss); error = NewAlias(NULL, &tmpfss, &h); if (error != noErr) fatalbox("Failed to create alias"); (*h)->userType = 'pTTY'; SetHandleSize((Handle)h, (*h)->aliasSize + fn.fss.name[0] + 1); if (MemError() != noErr) fatalbox("Failed to create alias"); memcpy((char *)*h + (*h)->aliasSize, fn.fss.name, fn.fss.name[0] + 1); } if (error != noErr) fatalbox("Failed to create alias"); } /* Put the data in a resource. */ id = Unique1ID(rAliasType); if (ResError() != noErr) fatalbox("Failed to get ID for resource %s (%d)", name, ResError()); addresource((Handle)h, rAliasType, id, namename, ResError() Node-path: putty/mac/macstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c0f104d889e78361d300311b2175f595 Text-delta-base-sha1: c6dc7c9361fed7e6bff2e304751b3d4b5b0274a6 Text-content-length: 156 Text-content-md5: 5cf5132662b7c1d99c5cd2130889c181 Text-content-sha1: 8e8466aeef8ba9f5336b3502e7c7cad3b80ef3dd Content-length: 195 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN~hxf0nFiles.h> #include struct Filename { FSSpec fss; }; extern FILE * f_open(struct Filename, char const *);char pad Revision-number: 2772 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2003-02-01T22:20:53.000000Z K 7 svn:log V 126 Add some glue to allow building a Carbon version of PuTTY. It won't work, but it's nice to have the infrastructure in place. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c88c44278240999d2aec9fdc3c34a913 Text-delta-base-sha1: d1861d7aa41bb41ee02c74ebccd3aa05577948a4 Text-content-length: 399 Text-content-md5: 14bfe300651c37d92b428cb4b47ccb1e Text-content-sha1: 3ef742ad6a846b988fde38e6da0bf71b1baca94d Content-length: 439 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNh7J2H1Yh+>T&8?v<COptions_Carbon = {COptions} -opt size -d TARGET_API_MAC_CARBONLinkOptions_CarbonLibs_Carbon = "{SharedLibraries}CarbonLib $objstr = &objects($p, "X.carbon.o", "", undef); print &splitline("$prog.carbonCarbon} " . $objstr . " {Libs_Carbonforeach $d (&deps("X.carbonCarbon}\n\n"; } select STDOUT; close OUT; Revision-number: 2773 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2003-02-01T23:42:30.000000Z K 7 svn:log V 78 Make this compile in a Carbon world (while still supporting everything else). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9f1430e744ae5db444faff6d349f74e8 Text-delta-base-sha1: f147921727a563dbccd20fa54a85d957836ab71f Text-content-length: 2857 Text-content-md5: 1265a305edd3d76bc24defef0301b543 Text-content-sha1: 06b250d051774b35718335822e1875dc4a64ed5c Content-length: 2897 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVN'JPr(4'LZ\%|g{UpcSgdfZ5.z:F3Sm{q/wT?Ej7-C)B%Y}? 0rV/uC##GHsimRrms[XC/* $Id: mac.c,v 1.42 2003/02/01 23:42:30#if !TARGET_API_MAC_CARBON QDGlobals qd; #endif#if !TARGET_API_MAC_CARBON#endif#if !TARGET_API_MAC_CARBON#endif#if !TARGET_API_MAC_CARBON case inSysWindow: SystemClick(event, window); break; #endif#if TARGET_API_MAC_CARBON { BitMap screenBits; GetQDGlobalsScreenBits(&screenBits); DragWindow(window, event->where, &screenBits.bounds); } #else DragWindow(window, event->where, &qd.screenBits.bounds); #endif#if !TARGET_API_MAC_CARBON case diskEvt: if (HiWord(event->message) != noErr) { Point pt; #endif DialogRef dialogdialog = GetDialogFromWindow(window); if (DialogSelect(event, &dialogRef dialog;dialog = GetDialogFromWindow(window); active = (event->modifiers & activeFlag) != 0; GetDialogItem(dialogdialog, &item); } static void mac_updatewindow(WindowPtr window) { #if TARGET_API_MAC_CARBON RgnHandle rgn; #endif#if TARGET_API_MAC_CARBON rgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(window), rgn); UpdateDialog(GetDialogFromWindow(window), rgn); DisposeRgn(rgn); #else UpdateDialog(window, window->visRgn); #endif Rect textrect; SetPort((GrafPtr)GetWindowPort(window)#if TARGET_API_MAC_CARBON GetPortBounds(GetWindowPort(window), &textrect); #else textrect = window->portRect; #endif if (h != NULL) { HLock(h); TETextBox(*h, len, &textrGetWindowKind(window)WindowPtr window; #if !TARGET_API_MAC_CARBON Str255 da; #endif#if !TARGET_API_MAC_CARBON#endif GetDialogWindow(GetNewDialog(wAbout, NULL, (WindowPtr)-1)GetDialogFromWindow(windows.about)#if !TARGET_API_MAC_CARBON case wDA: CloseDeskAcc(((WindowPeek)window)->windowKind); break; #endif case wTerminal: mac_closeterm(window); break; case wAbout: windows.about = NULL; DisposeDialog(GetDialogFromWindow(window)#if TARGET_API_MAC_CARBON /* XXX Is this good enough? What about Carbon on OS 8.1? */ #define EnableItem EnableMenuItem #define DisableItem DisableMenuItem #endif#if TARGET_API_MAC_CARBON Cursor arrow; RgnHandle visrgn; #endif#if TARGET_API_MAC_CARBON GetQDGlobalsArrow(&arrow); SetCursor(&arrow); #else SetCursor(&qd.arrow); #endif { #if TARGET_API_MAC_CARBON visrgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(front), visrgn); DiffRgn(cursrgn, visrgn, cursrgn); DisposeRgn(visrgn); #else DiffRgn(cursrgn, front->visRgn, cursrgn); #endif }#if TARGET_API_MAC_CARBON GetQDGlobalsArrow(&arrow); SetCursor(&arrow); GetPortVisibleRegion(GetWindowPort(window), cursrgn); #else SetCursor(&qd.arrow); CopyRgn(window->visRgn, cursrgn); #endif Revision-number: 2774 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2003-02-01T23:55:00.000000Z K 7 svn:log V 89 Carbonise. Until we support Navigation Services, loading and saving sessions is tricky. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b9dcf369d17d8ce88e615fff97d99d66 Text-delta-base-sha1: 5421969aab0179e10ebcd7edb035d5783d1b1297 Text-content-length: 579 Text-content-md5: f1814e77c957bec8cacf793e576949e8 Text-content-sha1: c9cfcb2739f9b92fcfe9cd5be91b64c01f84e8bd Content-length: 618 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNle8F)8bUm6")w ys/* $Id: macdlg.c,v 1.9 2003/02/01 23:55:0 GetDialogWindow(GetNewDialog(wSettings, NULL, (WindowPtr)-1) { #if !TARGET_API_MAC_CARBON /* XXX Navigation Services */#endif#if !TARGET_API_MAC_CARBON /* XXX Navigation Services */#endif DialogRef dialog = GetDialogFromWindow(window); active = (event->modifiers & activeFlag) != 0; GetDialogItem(dialogdialog DialogRef dialog = GetDialogFromWindow(window); if (DialogSelect(event, &dialog, &item)) switch (item) { case wiSettingsOpen: Hid Revision-number: 2775 Prop-content-length: 192 Content-length: 192 K 8 svn:date V 27 2003-02-02T00:04:36.000000Z K 7 svn:log V 94 Carbonise, mostly by replacing addresource() with c2pstrcpy() and AddResource(), and similar. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a8f417cd9d9b6172fb5eb1e73f45dc3b Text-delta-base-sha1: 7471920207a9456379f8f59b7ba16e9d829b136b Text-content-length: 720 Text-content-md5: 79e1f81aeae383343291b44c127433a7 Text-content-sha1: aa6b49bc8f98157857795a732cd36054d4e54178 Content-length: 760 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN51tPz-!%Fmq|%mXFiqAYS}nIs}nIF5Y}nM]^g|%g?Xiq\O./* $Id: macstore.c,v 1.16 2003/02/02 00:04:36 Str255 pkeyc2pstrcpy(pkey, key); AddResource(h, FOUR_CHAR_CODE('TEXT'), id, p Str255 pkeyc2pstrcpy(pkey, key); AddResource(h, FOUR_CHAR_CODE('Int '), id, p Str255 pkeyc2pstrcpy(pkey, key); h = Get1NamedResource(FOUR_CHAR_CODE('TEXT'), p Str255 pkeyc2pstrcpy(pkey, key); h = Get1NamedResource(FOUR_CHAR_CODE('Int '), pkey Str255 pkeyc2pstrcpy(pkey, key); h = (AliasHandle)Get1NamedResource(rAliasType, pkeykey Str255 pkeykey, ResError()); c2pstrcpy(pkey, key); AddResource((Handle)h, rAliasType, id, p Revision-number: 2776 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2003-02-02T13:27:48.000000Z K 7 svn:log V 72 Add results of diagnostic run -- it's GetSystemPowerStatus() apparently K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ntpd-slowdown Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7b4c521bb7c5837ccfbfb5219fb37318 Text-delta-base-sha1: 8a964032db65e7159f75d8f9b90c1ee0bb83a838 Text-content-length: 174 Text-content-md5: 7a4f7855a962097fecddd20c239f4d43 Text-content-sha1: 0a0ea8314e5a5c0289dec2d792fa3dd96b4e91f6 Content-length: 213 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN3h]hBq

    By use of diagnostic builds we've narrowed the problem down to use of GetSystemPowerStatus(), which is likely to be calling Revision-number: 2777 Prop-content-length: 389 Content-length: 389 K 8 svn:date V 27 2003-02-02T14:00:36.000000Z K 7 svn:log V 288 Summary: Support for `SCO ANSI' terminal features Grab bag for the low background rumble of SCO-ANSI related requests we keep getting. I can't say I have a clue about it, so it would be helpful if someone clueful could review this (particularly to see if bits are already implemented :-) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sco-ansi Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1816 Text-content-md5: 127ddcd24db9f759470ff32e37b4a005 Text-content-sha1: 6d2c18d602fde56d2eeb6183015d03c1a5a41222 Content-length: 1932 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN  Summary: Support for `SCO ANSI' terminal features Class: wish Difficulty: taxing Priority: low Content-type: text/x-html-body

    We occasionally get asked to support `SCO-ANSI' (aka `ANSIC'?) features (as used by UnixWare etc).

    Colours
    From comp.security.ssh:
    Select foreground color              \027[=PsF
    Select background color              \027[=PsG
    Select reverse color                 \027[=PsH
    Select reverse background color      \027[=PsI
    
                SCO-ANSI Color Table
    --------------------------------------------------
       Ps      Color             Ps      Color
    --------------------------------------------------
       0       Black              8      Grey
       1       Blue               9      Lt. Blue
       2       Green             10      Lt. Green
       3       Cyan              11      Lt. Cyan
       4       Red               12      Lt. Red
       5       Magenta           13      Lt. Magenta
       6       Brown             14      Yellow
       7       White             15      Lt. White
    --------------------------------------------------

    There are various other (possibly contradictory) lists of escape sequences buried in the putty-bugs archives. all-escapes also lists some sequences.

    Patch: 342AD8A1750B844BA61AF9DFC417CCF5154D29@eciexchange.ecinet.com

    Line drawing
    (`SCO ACS'?) Setting line character set to `CP437' on the Translation panel might help with this.
    Function keys
    `SCO mode' function keys (and keypad top row) are already implemented (and possibly even do what you want). See the Keyboard panel.
    Revision-number: 2778 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2003-02-02T14:03:04.000000Z K 7 svn:log V 47 Ahem. Get
    and
    the right way round... K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sco-ansi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 127ddcd24db9f759470ff32e37b4a005 Text-delta-base-sha1: 6d2c18d602fde56d2eeb6183015d03c1a5a41222 Text-content-length: 120 Text-content-md5: 801888d44061f48a56e822a8654d5f36 Text-content-sha1: ba866da17e2909fca3eb9388713fec9cc5f6d168 Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN WoOnmyt>Colours
    Line drawing
    Function keys
    Revision-number: 2779 Prop-content-length: 236 Content-length: 236 K 8 svn:date V 27 2003-02-02T15:59:00.000000Z K 7 svn:log V 137 Add support for using Navigation Services to open saved sessions. Support for saving sessions using Navigation Services will come later. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1265a305edd3d76bc24defef0301b543 Text-delta-base-sha1: 06b250d051774b35718335822e1875dc4a64ed5c Text-content-length: 228 Text-content-md5: 2d873a4b3ebe3f672f1bcae2a89b713f Text-content-sha1: de6caed4e147afd9842781cb3b604b1d5082e053 Content-length: 268 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN'QB '##bE/* $Id: mac.c,v 1.43 2003/02/02 15:59:0Navigation /* Navigation Services? */ if (NavServicesAvailable()) mac_gestalts.navsvers = NavLibraryVersion(); else mac_gestalts.navsvers = 0; Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8b7ca0ace2362b355235f2f90fdcb7ab Text-delta-base-sha1: 95378351f66fd23e0c2bdf79b32039dbe3e79128 Text-content-length: 70 Text-content-md5: b3f3533af6a71a1de8fe60265a05e33e Text-content-sha1: 36b78f22fc8e0346efbfb2f6f4fd03012a775177 Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNT 1:i6 long navsvers; /* Navigation Services version Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8eca16bd47486056fb957aecb3d70c69 Text-delta-base-sha1: 80150e107e0e802245a22289c101d09b68f09981 Text-content-length: 490 Text-content-md5: e02e891eea6b12b9275fe4f0a751f509 Text-content-sha1: e1b5d9a4ba5c86c7592c3913842cee1723b64db2 Content-length: 530 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNIN7,"D[/* $Id: mac_res.r,v 1.25 2003/02/02 15:59:00Open resource, for the Translation Manager and Navigation Services */ resource 'open' (open_pTTY) { 'pTTY', { 'Sess' } }; /* Kind resources, for Navigation services etc. */ resource 'kind' (128) { 'pTTY', verBritain, { 'Sess', "PuTTY saved session", } }; resource 'kind' (129) { 'pTTI', verBritain, { 'HKey', "PuTTY host key database", 'Seed', "PuTTY random number seed", } Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f1814e77c957bec8cacf793e576949e8 Text-delta-base-sha1: c9cfcb2739f9b92fcfe9cd5be91b64c01f84e8bd Text-content-length: 1765 Text-content-md5: afb3e93d9fc13ae2e022f2c77fdb976d Text-content-sha1: 83249dabc05b748a9e98a0c84877c18af3cdd76b Content-length: 1805 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNeD(1'4Z-PpBkY /* $Id: macdlg.c,v 1.10 2003/02/02 15:59Navigationstatic OSErr mac_openlist(AEDesc docs) { OSErr err; long ndocs, i; FSSpec fss; AEKeyword keywd; DescType type; Size size; err = AECountItems(&docs, &ndocs); if (err != noErr) return errreturn err;; err = mac_opensessionfrom(&fss); if (err != noErr) return err; } return noErr; } void mac_opensession(void) { if (mac_gestalts.navsvers > 0) { NavReplyRecord navr; NavDialogOptions navopts; NavTypeListHandle navtypes; AEDesc defaultloc = { 'null', NULL }; AEDesc *navdefault = NULL; short vol; long dirid; FSSpec fss; if (NavGetDefaultDialogOptions(&navopts) != noErr) return; /* XXX should we create sessions dir? */ if (get_session_dir(FALSE, &vol, &dirid) == noErr && FSMakeFSSpec(vol, dirid, NULL, &fss) == noErr && AECreateDesc(typeFSS, &fss, sizeof(fss), &defaultloc) == noErr) navdefault = &defaultloc; /* Can't meaningfully preview a saved session yet */ navopts.dialogOptionFlags &= ~kNavAllowPreviews; navtypes = (NavTypeListHandle)GetResource('open', open_pTTY); if (NavGetFile(navdefault, &navr, &navopts, NULL, NULL, NULL, navtypes, NULL) == noErr && navr.validRecord) mac_openlist(navr.selection); NavDisposeReply(&navr); if (navtypes != NULL) ReleaseResource((Handle)navtypes); } #if !TARGET_API_MAC_CARBON /* XXX Navigation Services */ else { StandardFileReply sfr; static const OSType sftypes[] = { 'Sess', 0, 0, 0 }; StandardGetFile(NULL, 1, sftypes, &sfr); if (!sfr.sfGood) return; mac_opensessionfrom(&sfr.sfFile); /* XXX handle error */ }Size size; AEDescList docs = { typeNull, NULL }; OSErr errmac_openlist(docs); Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8abfd21772e27b792a7070cc2f1f3c53 Text-delta-base-sha1: 9c042e30d3746f6033c7df838a7107a73099bec3 Text-content-length: 95 Text-content-md5: 2fe024bdcf3b833873dff9250b236dcc Text-content-sha1: b0109b7f18db6d205b5068157ea43fc2adf690f3 Content-length: 134 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNe IN,tq/* $Id: macresid.h,v 1.8 2003/02/02 15:59:00Open IDs */ #define open_pTTY Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 14bfe300651c37d92b428cb4b47ccb1e Text-delta-base-sha1: 3ef742ad6a846b988fde38e6da0bf71b1baca94d Text-content-length: 88 Text-content-md5: 8d6db90b02ce767a04160f23839fae38 Text-content-sha1: 13892d4cf7bfa451df8c5f7ae607c61affedbca7 Content-length: 128 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNp8MP4Navigation.farNavigationLib" \xb6 -weaklib Navigation Revision-number: 2780 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2003-02-02T16:02:50.000000Z K 7 svn:log V 25 Update to match reality. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ce34e27c31811e586231d38178963f31 Text-delta-base-sha1: 2837d384f7d07cb496d87a024f5bb815ab64712c Text-content-length: 287 Text-content-md5: c417d358dd2a01693b78184a607027af Text-content-sha1: 049cb6e38df7b67bb3da599f3aadf9232667bfd0 Content-length: 327 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNPz8*Ma<+_q$Id: README.mac,v 1.24 2003/02/02 16:02:50 The Carbon build doesn't work yet The Carbon build of PuTTY (when it works) should work on any Power Macintosh with CarbonLib (and Mac OS 8.1 or later), Mac OS 9 or Mac OS X installedSession configuration Revision-number: 2781 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 71 s/tame/fun/ (perhaps 'tame' should be added as a synonym in bugs2html) K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-03T00:49:54.000000Z PROPS-END Node-path: putty-wishlist/data/pterm-scrollopt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f0c49820aa719129f14ff4989db8952 Text-delta-base-sha1: 1382dec933c9db1b74f158688530a74402870919 Text-content-length: 83 Text-content-md5: d96dabfa724dc32083d4cc48c81ffa86 Text-content-sha1: faf0aa82c7ca33976fabd205c1157d744c43db2d Content-length: 122 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNkjBB(CSummary: Scroll-optimisation for pterm Class: wish Difficulty: fun Revision-number: 2782 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:50.161898Z PROPS-END Revision-number: 2783 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:50.170143Z PROPS-END Revision-number: 2784 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:50.178780Z PROPS-END Revision-number: 2785 Prop-content-length: 120 Content-length: 120 K 7 svn:log V 22 Russian mirror moved. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-03T11:29:43.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0c504fee30f2d55dfb4321d1e9bffc25 Text-delta-base-sha1: c948c87daba569fb9e2dcce9347b62999326bde6 Text-content-length: 60 Text-content-md5: 46669fd9667b45f67b2d611038344b48 Text-content-sha1: 13779ba10e67f184792493d5c80a131b3dd6eea1 Content-length: 99 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN2. '162.213.87.215/mirrors/putty/">62.213.87 Revision-number: 2786 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:50.250876Z PROPS-END Revision-number: 2787 Prop-content-length: 228 Content-length: 228 K 7 svn:log V 129 Convert keyboard events into Unicode properly. I can now type all manner of interesting characters and have them work properly. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-04T00:01:33.000000Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ec44409591851755abb9665dd65a5ce9 Text-delta-base-sha1: 8549bdac2a9bb6ebba53982b9924081decedd62f Text-content-length: 1445 Text-content-md5: 75bf6a680a436dff11b514379a46aefd Text-content-sha1: 41ad66e87057be26072ee427c4a51e7eec9f71f4 Content-length: 1485 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNl5!vi,OT$Ig{q/* $Id: macterm.c,v 1.64 2003/02/04 00:01:33UniChar utxt[1]; char txt[1]; size_t len = 0; ScriptCode key_scriptMap from key script to Unicode. */ txt[0] = event->message & charCodeMask; key_script = GetScriptManagerVariable(smKeyScript); if (mac_gestalts.encvvers != 0) { static TextToUnicodeInfo key_to_uni = NULL; static ScriptCode key_to_uni_script; TextEncoding enc; ByteCount iread, olen; OSErr err; if (key_to_uni != NULL && key_to_uni_script != key_script) DisposeTextToUnicodeInfo(&key_to_uni); if (key_to_uni == NULL || key_to_uni_script != key_script) { if (UpgradeScriptInfoToTextEncoding(key_skey_to_uni) == noErr) key_to_uni_script = key_script; else key_to_uni = NULL; } if (key_to_uni != NULL) { err = ConvertFromTextToUnicode(key_to_uni, 1, txt, (kUnicodeKeepInfoMask | kUnicodeStringUnterminatedMask), 0, NULL, NULL, NULL, sizeof(utxt), &iread, &olen, utxt); if (err == noErr) len = olen / sizeof(*utxt); } } else { int charset; char *tptr = txt; int tlen = 1; charset = charset_from_macenc(key_script, GetScriptManagerVariable(smRegionCode), mac_gestalts.sysvers, NULL); if (charset != CS_NONE) { len = charset_to_unicode(&tptr, &tlen, utxt, sizeof(utxt), charset, NULL, NULL, 0); } } term_key(s->term, keysym, utxt, len Revision-number: 2788 Prop-content-length: 238 Content-length: 238 K 8 svn:date V 27 2003-02-04T00:33:11.000000Z K 7 svn:log V 139 Slightly improve Carbon handling: we still have to deal with the "About..." menu entry, even if the rest of the Apple Menu is done for us. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2d873a4b3ebe3f672f1bcae2a89b713f Text-delta-base-sha1: de6caed4e147afd9842781cb3b604b1d5082e053 Text-content-length: 136 Text-content-md5: 7df0d7cf484686b651413d5ed58d69a2 Text-content-sha1: fe43df3d4255e579efbb75de7b958c6492216563 Content-length: 176 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVNQal(o/:B9/* $Id: mac.c,v 1.44 2003/02/04 00:33:11#if !TARGET_API_MAC_CARBON#endif } break; Revision-number: 2789 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2003-02-04T01:53:50.000000Z K 7 svn:log V 70 Carbonise. Currently, size tips and copy/paste won't work in Carbon. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 75bf6a680a436dff11b514379a46aefd Text-delta-base-sha1: 41ad66e87057be26072ee427c4a51e7eec9f71f4 Text-content-length: 5690 Text-content-md5: b8483b005cd0794992d72f161d171cbf Text-content-sha1: bf2d2818e47b62177072ca9eab1a1ad5bb342d25 Content-length: 5730 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVN5CjA3,laC+m[+zr.L$qv Jz]O]isackMuk%$g5~Am`L?5{sp?(_fi|-0Un3 )=` k%~~,z IQ~(o{1s6Cdo?B{DsldSQU!q) OD4e"3wmxD*Il/* $Id: macterm.c,v 1.65 2003/02/04 01:53:50#if TARGET_API_MAC_CARBON CQDProcsPtr gp = GetPortGrafProcs(GetWindowPort(s->window));; #else QDProcsPtr gp = s->window->grafProcs;; #endifgp != NULL) gotwidth = InvokeQDTxMeasUPP(1, &text, &tmpnumer, &tmpdenom, &fi, gpGetWindowPort(s->window)UPP#if !TARGET_API_MAC_CARBON#endif#if TARGET_API_MAC_CARBON Cursor arrow; Rect rect; RgnHandle visrgn; #endif SetPort(GetWindowPort(window)#if TARGET_API_MAC_CARBON SetCursor(GetQDGlobalsArrow(&arrow)); RectRgn(cursrgn, GetControlBounds(s->scrollbar, &rect)); #else SetCursor(&qd.arrow); RectRgn(cursrgn, &(*s->scrollbar)->contrlRect); #endif { #if TARGET_API_MAC_CARBON SetCursor(GetQDGlobalsArrow(&arrow)); #else SetCursor(&qd.arrow); #endif } } #if TARGET_API_MAC_CARBON visrgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(window), visrgn); SectRgn(cursrgn, visrgn, cursrgn); DisposeRgn(visrgn); #else SectRgn(cursrgn, window->visRgn, cursrgn); #endif#if TARGET_API_MAC_CARBON #define DisableItem DisableMenuItem #define EnableItem EnableMenuItem #endif void mac_adjusttermmenus(WindowPtr window) { Session *s; MenuHandle menu; #if !TARGET_API_MAC_CARBON long offset; #endif#if TARGET_API_MAC_CARBON if (1) #else if (GetScrap(NULL, 'TEXT', &offset) == noTypeErr) #endif static ControlActionUPP mac_scrolltracker_upp = NULL; s = (Session *)GetWRefCon(window); SetPort(GetWindowPort(window)if (mac_scrolltracker_upp == NULL) mac_scrolltracker_upp = NewControlActionUPP(&mac_scrolltracker); TrackControl(control, mouse, GetWindowPort(s->window)#if !TARGET_API_MAC_CARBON#endif } void get_clip(void *frontend, wchar_t **p, int *lenp) { #if TARGET_API_MAC_CARBON *lenp = 0; #else#endif#if TARGET_API_MAC_CARBON s = (Session *)GetWRefCon(GetControlOwner(control)); #else s = (Session *)GetWRefCon((*control)->contrlOwner); #endif#if !TARGET_API_MAC_CARBON DragGrayRgnUPP draghooksave; GrafPtr portsave; FontInfo fi; #endif s = (Session *)GetWRefCon(window); #if !TARGET_API_MAC_CARBON#endif#if !TARGET_API_MAC_CARBON#endif#if !TARGET_API_MAC_CARBON#endif Rect bbox; #if TARGET_API_MAC_CARBON RgnHandle visrgn; #endif s = (Session *)GetWRefCon(window); SetPort(GetWindowPort(window)); BeginUpdate(window); pre_paint(s); #if TARGET_API_MAC_CARBON visrgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(window), visrgn); GetRegionBounds(visrgn, &bbox); #else bbox = (*window->visRgn)->rgnBBox; #endif term_paint(s->term, s, PTOCC(bbox.left), PTOCR(bbox.top), PTOCC(bbox.right), PTOCR(bb#if TARGET_API_MAC_CARBON EraseRect(GetControlBounds(s->scrollbar, &bbox)); UpdateControls(window, visrgn); DisposeRgn(visrgn); #else EraseRect(&(*s->scrollbar)->contrlRect); UpdateControls(window, window->visRgn); #endifGetWindowPort(s->window)#if TARGET_API_MAC_CARBON GetPortBounds(GetWindowPort(s->window), &clip); #else clip = s->window->portRect; #endif#if TARGET_API_MAC_CARBON RgnHandle visrgn; #endif static DeviceLoopDrawingUPP do_text_for_device_upp = NULL; assert(len <= 1024); SetPort(GetWindowPort(s->window)#if TARGET_API_MAC_CARBON visrgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(s->window), visrgn); if (!RectInRgn(&a.textrect, visrgn)) { DisposeRgn(visrgn); return; } DisposeRgn(visrgn); #else if (!RectInRgn(&a.textrect, s->window->visRgn)) return; #endifGetWindowPort(s->window) { if (do_text_for_device_upp == NULL) do_text_for_device_upp = NewDeviceLoopDrawingUPP(&do_text_for_device); DeviceLoop(textrgn, do_text_for_device_upp, (long)&a, 0); }#if TARGET_API_MAC_CARBON ValidWindowRect(s->window, &a.textrect); #else ValidRect(&a.textrect); #endif#if TARGET_API_MAC_CARBON CQDProcsPtr gp = GetPortGrafProcs(GetWindowPort(a->s->window)); #else QDProcsPtr gp = a->s->window->grafProcs; #endifgp != NULL) InvokeQDTextUPP(a->len, a->text, a->numer, a->denom, gp#if TARGET_API_MAC_CARBON RgnHandle visrgn; #endif if (HAVE_COLOR_QD()) { s->term->attr_mask = 0; SetPort(GetWindowPort(s->window)); #if TARGET_API_MAC_CARBON visrgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(s->window), visrgn); GetRegionBounds(visrgn, &myrect); DisposeRgn(visrgn); #else myrect = (*s->window->visRgn)->rgnBBox; #endifSetControlMinimum(s->scrollbar, 0); SetControlMaximum(s->scrollbar, total - page) Rect rect; #if TARGET_API_MAC_CARBON GetPortBounds(GetWindowPort(s->window), &rect); #else rect = s->window->portRect; #endif *x = rect.left; *y = r Rect rect; #if TARGET_API_MAC_CARBON GetPortBounds(GetWindowPort(s->window), &rect); #else rect = s->window->portRect; #endif *x = rect.right - rect.left; *y = rect.bottom - rGetWindowPort(s->window)#if TARGET_API_MAC_CARBON GetWindowRegion(s->window, kWindowUpdateRgn, movedupdate); #else GetWindowUpdateRgn(s->window, movedupdate); #endif#if TARGET_API_MAC_CARBON ValidWindowRgn(s->window, movedupdate); #else ValidRgn(movedupdate); #endif#if TARGET_API_MAC_CARBON InvalWindowRgn(s->window, update); InvalWindowRgn(s->window, movedupdate); #else InvalRgn(update); InvalRgn(movedupdate); #endif Revision-number: 2790 Prop-content-length: 348 Content-length: 348 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-04T02:03:53.000000Z K 7 svn:log V 249 Fix various breakages my Carbonisation caused in the Classic build, notably that outside Carbon, CGrafPtr and GrafPtr are different types, even though they're mostly interchangeable, so we need to interpose a cast between GetWindowPort and SetPort. PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b8483b005cd0794992d72f161d171cbf Text-delta-base-sha1: bf2d2818e47b62177072ca9eab1a1ad5bb342d25 Text-content-length: 264 Text-content-md5: 758913694761dfa306d5a64123ef700e Text-content-sha1: b6c4c99aa1162312d79e183f26807861447997ba Content-length: 304 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNCT& ,95nDn25K5L which prompted this commit: /* Newsflash! After 15 years of arduous toil, it's finally possible for specially trained typists wielding advanced text editing technology to define symbolic names for commonly used scrap flavor type constants! Apple triumphs again! */ K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 758913694761dfa306d5a64123ef700e Text-delta-base-sha1: b6c4c99aa1162312d79e183f26807861447997ba Text-content-length: 393 Text-content-md5: 616e8dbfd0031b0ae8ac6105944bd865 Text-content-sha1: 8da4745867c394ad4c5c4d550c237b4ca0dcbb3a Content-length: 433 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVN6E +">Lfj8N(F|L8 /* $Id: macterm.c,v 1.67 2003/02/04 02:08:0kScrapFlavorTypeTextkScrapFlavorTypeUnicodekScrapFlavorTypeTextkScrapFlavorTypeTextStylekScrapFlavorTypeUnicode GetScrap(h, kScrapFlavorTypeUnicode, &offset) / sizeof(**p); HLock(h); *p = (wchar_t *)*h; } else if (GetScrap(NULL, kScrapFlavorTypeTextkScrapFlavorTypeText Revision-number: 2792 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2003-02-04T02:10:42.000000Z K 7 svn:log V 60 Carbonise, or at least disable MacTCP support under Carbon. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b0e7e069e029ec20589da15e7fb6177e Text-delta-base-sha1: 572629c30961eb28db355d92e598e53b93bf5151 Text-content-length: 157 Text-content-md5: ac52d4fd85082dab7c27a3962e423340 Text-content-sha1: a519e1276fe124a909ebe62ee69f58dc7bb17b16 Content-length: 196 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN9}|=9<Xt\3#if !TARGET_API_MAC_CARBON#endif#if !TARGET_API_MAC_CARBON if (mactcp_init() == noErr) stack = &mactcp; else #endif Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c55bbf7154ed69379492cf5d5f074063 Text-delta-base-sha1: fb61ffacaf41ebfc6b7f61ed868c22aa5a882f0b Text-content-length: 59 Text-content-md5: afa4c2f0b68af9275553d46304315e23 Text-content-sha1: d9094c36df334c32cb364482b74566a78fa377c2 Content-length: 99 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNSv>f !TARGET_API_MAC_CARBON#endif Revision-number: 2793 Prop-content-length: 242 Content-length: 242 K 8 svn:date V 27 2003-02-04T02:15:18.000000Z K 7 svn:log V 143 If we're compiling for Carbon, define OTCARBONAPPLICATION so that we get the simplified (and backward-compatible) application-only interfaces. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c836b1d7aa05ee9f900e20ec4fd77dd8 Text-delta-base-sha1: 5738ebeb71278a32061794bae373e5599018bd00 Text-content-length: 137 Text-content-md5: 127bb97972b89f81507b52d53f21e6dd Text-content-sha1: c94fb4e86ae53074d5e560352a63f09a718a8113 Content-length: 176 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNj*xx28/* * Macintosh OpenTransport networking abstraction */ #if TARGET_API_MAC_CARBON #define OTCARBONAPPLICATION 1 #endif Revision-number: 2794 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2003-02-04T12:18:55.000000Z K 7 svn:log V 143 Summary: Manual public key authentication causes crash Class: bug Priority: high Absent-in: 0.53b 2003-01-31 Present-in: 2003-02-03 2003-02-04 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pubkey-crash Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2200 Text-content-md5: 288e89a6a0c89438cb2e3e7a60bc0b80 Text-content-sha1: 7efcad5ea155a48020744b4920f7d2b8e38f1b23 Content-length: 2316 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN  Summary: Manual public key authentication causes crash Class: bug Priority: high Absent-in: 0.53b 2003-01-31 Present-in: 2003-02-03 2003-02-04 A couple of people have reported recent snapshots crashing. I can reproduce this using 2003-02-03 and 2003-02-04, connecting with: - SSH-2 and RSA authentication - SSH-2 and DSA authentication - SSH-1 and RSA authentication (direct, not using Pageant), but not with password for either protocol. Crashes regardless of whether offered key is valid. Using Pageant (2003-02-04, SSH-2, RSA), I can successfully authenticate (no crash). Selection of SSH packet log up to the crash point (for SSH-2): Event Log: Writing new session log (SSH packets mode) to file: ...\putty.log Event Log: Looking up host "ssh.example.com" Event Log: Connecting to ssh.example.com port 22 Event Log: Server version: SSH-1.99-OpenSSH_3.4 NetBSD_Secure_Shell-20020626 Event Log: We claim version: SSH-2.0-PuTTY-Snapshot-2003-02-04 Event Log: Using SSH protocol version 2 Event Log: Doing Diffie-Hellman group exchange Event Log: Doing Diffie-Hellman key exchange Event Log: Host key fingerprint is: Event Log: ssh-rsa 1024 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX Event Log: Initialised AES-256 client->server encryption Event Log: Initialised AES-256 server->client encryption Event Log: Initialised zlib (RFC1950) compression Event Log: Initialised zlib (RFC1950) decompression Outgoing packet type 5 / 0x05 (SSH2_MSG_SERVICE_REQUEST) 00000000 00 00 00 0c 73 73 68 2d 75 73 65 72 61 75 74 68 ....ssh-userauth Incoming packet type 6 / 0x06 (SSH2_MSG_SERVICE_ACCEPT) 00000000 00 00 00 0c 73 73 68 2d 75 73 65 72 61 75 74 68 ....ssh-userauth Outgoing packet type 50 / 0x32 (SSH2_MSG_USERAUTH_REQUEST) 00000000 00 00 00 05 XX XX XX XX XX 00 00 00 0e 73 73 68 ....xxxxx....ssh 00000010 2d 63 6f 6e 6e 65 63 74 69 6f 6e 00 00 00 04 6e -connection....n 00000020 6f 6e 65 one For the above crash, Dr Watson shows the fault on the instruction at 43c720, but I don't know that's very useful. SSH-1 packet log ends: Event Log: Sent username "xxxxx" Incoming packet type 15 / 0x0f (SSH1_SMSG_FAILURE) Revision-number: 2795 Prop-content-length: 116 Content-length: 116 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-04T12:37:08.000000Z K 7 svn:log V 16 Add suspicions. PROPS-END Node-path: putty-wishlist/data/pubkey-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 288e89a6a0c89438cb2e3e7a60bc0b80 Text-delta-base-sha1: 7efcad5ea155a48020744b4920f7d2b8e38f1b23 Text-content-length: 149 Text-content-md5: 54ee91328fddd9f5c771bb45c67633e3 Text-content-sha1: fd7bf14c3588872d7cbc0b164fce25d82850c0f7 Content-length: 188 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN   Of the commits in the relevant time frame, I suspect either the filename abstraction, or Ross Younger's uninitialised variable. Revision-number: 2796 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2003-02-04T12:45:39.000000Z K 7 svn:log V 33 Add reference to submitted patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/slow-startup-printer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 105c8bacf25fa5fac81af515dbd6c6f6 Text-delta-base-sha1: 480b88774f66ddc323c537e344de5c159dc33cdf Text-content-length: 306 Text-content-md5: e8e106a685eb62bb2fcb8e1f86c2b207 Text-content-sha1: af896e9e4b60ba0301fb2fb2681892e6137c59b9 Content-length: 345 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN1P1

    Alternative fix: use a different type of printer enumeration which doesn't try so hard. Patch: yehhebmmpfq.fsf@ocean.cs.brown.edu. Dependent on Windows version, so need to ensure the functionality still works across at least the Win95-series and WinNT-series. Revision-number: 2797 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 71 Soften language -- at least Win2K's command prompt provides a 2>stderr K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-04T12:48:09.000000Z PROPS-END Node-path: putty-wishlist/data/pscp-stdout Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f71180502b4964e5899276fdd2d60998 Text-delta-base-sha1: 47efa038095e1a9c3a4d549201fc8933d1550724 Text-content-length: 85 Text-content-md5: 5fc6c86101543363dace9b29d6232a21 Text-content-sha1: 354122049cd278be915dd7b0fb879244baf872fc Content-length: 124 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN#D_Dnot all versions of Windows provide an easy way to redirect stderr. Revision-number: 2798 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2003-02-04T12:55:10.000000Z K 7 svn:log V 81 Cross-link resize-no-truncate and resize-scroll-effects, since they are related. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/resize-no-truncate Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f09fd195c0206beced00bbf5db964412 Text-delta-base-sha1: 262dada9ecddc38fd72959636cfdc675d5505d6f Text-content-length: 143 Text-content-md5: f31cd61371f074a59387252675e3c5fe Text-content-sha1: a8477d5d999017c6859eee62c417f2ddb2467f4b Content-length: 182 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN~~

    (cf. `resize-scroll-effects' for the case where the number of rows is changed.) Node-path: putty-wishlist/data/resize-scroll-effects Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 920046f43f9d0c626992a9c171653bec Text-delta-base-sha1: 06c327342822fa4ebc92bbb0d2abdae6449a5ad1 Text-content-length: 139 Text-content-md5: 76dd9dc5764a530946e92b9678ba82c5 Text-content-sha1: 81f8b5bb0b407d4c57c6dfe84281af74e33d125c Content-length: 178 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN|vz|z

    (cf. `resize-no-truncate' for the case where the number of columns is changed.) Revision-number: 2799 Prop-content-length: 356 Content-length: 356 K 8 svn:date V 27 2003-02-04T13:00:54.000000Z K 7 svn:log V 255 Further fallout from the introduction of the Filename type. (Memo to self: if you change the type of a variable and everything compiles without type-checking errors, that doesn't mean it's all fixed, because variadic functions aren't type-checked! Oops.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 65037b06edb346812abcb6611be9d5a7 Text-delta-base-sha1: f92e82a15d3bd38696329cc95bd9b641f2d922d6 Text-content-length: 212 Text-content-md5: d46aca06726a074ff359526a86b40c3f Text-content-sha1: 109e86c06e652f81daf4b3aa57a3edb1f9f975e4 Content-length: 253 K 15 cvs2svn:cvs-rev V 5 1.272 PROPS-END SVN +qd filename_to_str(&ssh->cfg.keyfile)bo-~>HMANNEL_CLOSE || ss filename_to_str(&ssh->cfg.keyfile) filename_to_str(&ssh->cfg.keyfile) Revision-number: 2800 Prop-content-length: 315 Content-length: 315 K 7 svn:log V 214 Add another bug workaround, this one for old OpenSSH (<2.3) servers which have a strange idea of what data should be signed in a PK auth request. This actually got in my way while doing serious things at work! :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2003-02-04T13:02:51.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d27e61b36616c9b0bf26685fef5b4868 Text-delta-base-sha1: 164d1a8d7d1db476bac3afd5b551a1cdcb86df1d Text-content-length: 777 Text-content-md5: 0bc9520c05821f27461e038a7e1f2273 Text-content-sha1: 88635c6535a892fac5fea2776aadf880b58f34f2 Content-length: 817 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNW+lG;1x_\versionid $Id: config.but,v 1.54 2003/02/04 13:02:51 simonS{config-ssh-bug-pksessid2} \q{Misuses the session ID in PK auth} \cfg{winhelp-topic}{ssh.bugs.rsapad2} Versions below 2.3 of OpenSSH require SSH2 public-key authentication to be done slightly differently: the data to be signed by the client contains the session ID formatted in a different way. If public-key authentication mysteriously does not work but the Event Log (see \k{using-eventlog}) thinks it has successfully sent a signature, it might be worth enabling the workaround for this bug to see if it helps. If this bug is detected, PuTTY will sign data in the way OpenSSH expects. If this bug is enabled when talking to a correct server, SSH2 public-key authentication will fail Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 78456bfad23d57e31a9268934cf16007 Text-delta-base-sha1: 1cbfeb1658883f9f103092aa5a63e63f28158697 Text-content-length: 40 Text-content-md5: 351051e5c2a2f143cd7554d3e3b31c99 Text-content-sha1: 48081eca1dad7dca72e5207099d311446d65fa27 Content-length: 81 K 15 cvs2svn:cvs-rev V 5 1.203 PROPS-END SVNUg hng, sshbug_pksessid Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 650aec0e7c28fc3d6c042a01c460fd4d Text-delta-base-sha1: 7ff66852c6b31bcfeb175c528f809b91b013f4ff Text-content-length: 110 Text-content-md5: 473aedd3657d55c0d6e8f79832c4d862 Text-content-sha1: 28161870c3c683ae241fd19f487f4bae437cc9b6 Content-length: 151 K 15 cvs2svn:cvs-rev V 5 1.102 PROPS-END SVNP^P^H<hhBugPKSessID2", 2-cfg->sshbug_pksessidBugPKSessID2", 0, &i); cfg->sshbug_pksessid Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d46aca06726a074ff359526a86b40c3f Text-delta-base-sha1: 109e86c06e652f81daf4b3aa57a3edb1f9f975e4 Text-content-length: 1743 Text-content-md5: 53316fa8e3330801ce474d238cd3a39a Text-content-sha1: d7e47903e07db0716f8f3e9e8e1169d5a0dbf5df Content-length: 1784 K 15 cvs2svn:cvs-rev V 5 1.273 PROPS-END SVNewjv2:9#define BUG_SSH2_PK_SESSIONID 128pksessid2 == FORCE_ON || (ssh->cfg.sshbug_pksessid2 == AUTO && wc_match("OpenSSH_2.[0-2]*", imp))) { /* * These versions have the SSH2 session-ID bug in * public-key authentication. */ ssh->remote_bugs |= BUG_SSH2_PK_SESSIONID; logevent("We believe remote version has SSH2 public-key-session-IDb* -pi+< 9~B?^G_CHANNEL_OPEN_FAILURE) { unsigned int remoteid = GET_32BIT(ssh->pktin.body); struct ssh_channel *c; c = find234(ssh->channels, &remoteid, ssh_channelfind); if (c && c->type == CHAN_SOCKDATA_DORMANT) { logevent("Forwarded connection refused by server"); pfd_close(c->u.pfd.s); del234(ssh->channels, c); sfree(c); } } else if (ssh->pktin.type == SSH1_MSG_CH if (ssh->remote_bugs & BUG_SSH2_PK_SESSIONID) s->siglen -= 4 if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) { PUT_32BIT(s->q, 20); s->q += 4; } int p if (ssh->remote_bugs & BUG_SSH2_PK_SESSIONID) sigdata_len -= 4; sigdata = smalloc(sigdata_len); p = 0; if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) { PUT_32BIT(sigdata+p, 20); p += 4; } memcpy(sigdata+p, ssh->v2_session_id, 20); p += 20; memcpy(sigdata+p, ssh->pktout.data + 5, ssh->pktout.length - 5); p += ssh->pktout.length - 5; assert(p == sigdata_len Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1eb0712c4c3709ded7ca00f7fefb0fe4 Text-delta-base-sha1: 0f20d3df9f7b5043a671bc8050ab282084172ada Text-content-length: 1160 Text-content-md5: 4bbf560e301bfa1a605422a2ac2b25c5 Text-content-sha1: e73a311928f3b3ffb3fc78657ba2c454cbed212f Content-length: 1201 K 15 cvs2svn:cvs-rev V 5 1.207 PROPS-END SVN3bc[_N8xKzJ=6ojbJLIDC_BUGS_PKSESSID2, IDC_BUGD_PKSESSID case IDC_BUGS_PKSESSID2: case IDC_BUGD_PKSESSID2: return "JI(`',`ssh.bugs.pksessid SendDlgItemMessage(hwnd, IDC_BUGD_PKSESSID2, CB_RESETCONTENT, 0, 0); SendDlgItemMessage(hwnd, IDC_BUGD_PKSESSID2KSESSIDPKSESSID2, CB_ADDSTRING, 0, (LPARAM)"On"); SendDlgItemMessage(hwnd, IDC_BUGD_PKSESSID2, CB_SETCURSEL, cfg.sshbug_pksessid2 == FORCE_ON ? 2 : cfg.sshbug_pksessidstaticddl(&cp, "Misuses the sessio&n ID in PK auth", IDC_BUGS_PKSESSID2, IDC_BUGD_PKSESSID~.ngT:ST:^T:^U9 G`>e if (!*p) goto disaster:; } break; case IDC_NOPTY cfg.nopty = IsDlgButtonChecked(hwnd, IDC_NOPTY); break; case IDC_COMPRESS cfg.compression = IsDlgButtonChecked(hwnd, IDC_COMPRESS); break; case IDC_SSH2DES cfg.ssh2_des_cbc = IsDlgButtonChecked(hwnd, IDC_SSH2DES); break; case IDC_AGENTFW case IDC_BUGD_PKSESSIDPKSESSID2, CB_GETCURSEL, 0, 0); cfg.sshbug_pksessid2 = (index == 0 ? AUTO : Revision-number: 2801 Prop-content-length: 307 Content-length: 307 K 8 svn:date V 27 2003-02-04T16:17:02.000000Z K 7 svn:log V 206 Based on limited testing, I believe that the checkin of ssh.c rev 1.272 [r2799] fixes this bug. (Perhaps ephemeral bugs that only exist in snapshots should be "cvs rm"d after fixing, to cut down on noise?) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pubkey-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 54ee91328fddd9f5c771bb45c67633e3 Text-delta-base-sha1: fd7bf14c3588872d7cbc0b164fce25d82850c0f7 Text-content-length: 41 Text-content-md5: 85ab4cfd1d37849cfaff755e3ce73b8f Text-content-sha1: f399550270d38f18f0d04664e7231ed43c229af5 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN ! ~Fixed-in: 2003-02-05 Revision-number: 2802 Prop-content-length: 163 Content-length: 163 K 7 svn:log V 65 putty.activalink.com has apparently become putty.activalink.net. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-04T19:47:43.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 46669fd9667b45f67b2d611038344b48 Text-delta-base-sha1: 13779ba10e67f184792493d5c80a131b3dd6eea1 Text-content-length: 47 Text-content-md5: ff3c444377e933106cd0da70e01ec773 Text-content-sha1: d3d6e45624df807d8de2e05fe7338afc55c4fba5 Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN.. NFhnet/">putty.activalink.net Revision-number: 2803 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2003-02-04T19:48:46.000000Z K 7 svn:log V 64 Summary: Better diagnostics on failure to load private key file K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/keyfile-diagnostic Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 546 Text-content-md5: 08a0c27da7fba37380e4c38ef6cb3b5e Text-content-sha1: a0fbf1c076a49444f9609048173a736ff8d68372 Content-length: 662 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Better diagnostics on failure to load private key file Class: wish Difficulty: fun Priority: low Currently some failures to load private key files (PPK) result in messages like "Couldn't load private key". These are failures such as hash/MAC verification and format errors, which seems wrong. A better error reporting channel would be nice. (NB that hash/MAC verification errors will only be visible as such for passphraseless keys, since for encrypted keys tampering is indistinguishable from an incorrect passphrase.) Revision-number: 2804 Prop-content-length: 212 Content-length: 212 K 8 svn:date V 27 2003-02-04T23:39:26.000000Z K 7 svn:log V 113 Add a level of indirection to make it rather easier to work out which of a session's windows we're dealing with. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7df0d7cf484686b651413d5ed58d69a2 Text-delta-base-sha1: fe43df3d4255e579efbb75de7b958c6492216563 Text-content-length: 531 Text-content-md5: c1f2338e8eca419554510f0caf7cfd87 Text-content-sha1: 86c10a4e8f3457badcef190e468706375d742c22 Content-length: 571 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVN'-X(4jF.b%@df:gSA/* $Id: mac.c,v 1.45 2003/02/04 23:39:26/ static int mac_windowtype(WindowPtr window) { #if !TARGET_API_MAC_CARBON if (GetWindowKind(window) < 0) return wDA; #endif return ((WinInfo *)GetWRefCon(window))->wtype WinInfo *wiwi = smalloc(sizeof(*wi)); wi->s = NULL; wi->wtype = wAbout; SetWRefCon(windows.about, (long)wi WinInfo *wi;wi = smalloc(sizeof(*wi)); wi->s = NULL; wi->wtype = wLicence; SetWRefCon(windows.licence, (long)wiGetWindowKind(window) Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3f3533af6a71a1de8fe60265a05e33e Text-delta-base-sha1: 36b78f22fc8e0346efbfb2f6f4fd03012a775177 Text-content-length: 229 Text-content-md5: 0273508d41456ce0f2b71c90147270a6 Text-content-sha1: e58cfff594ecd6b15e5e7deaae57fcd3b2b95c76 Content-length: 269 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNT# MUMS/* Every window used by PuTTY has a refCon field pointing to one of these. */ typedef struct { struct Session *s; int wtype; } WinInfo; #define mac_windowsession(w) (((WinInfo *)GetWRefCon(w))->s) Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: afb3e93d9fc13ae2e022f2c77fdb976d Text-delta-base-sha1: 83249dabc05b748a9e98a0c84877c18af3cdd76b Text-content-length: 143 Text-content-md5: 9e631c6e2749da9f84b65c33181475a3 Text-content-sha1: 63546e92369e28512d482d8b31677419f2940cbb Content-length: 183 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVND4g!+y_rk)p,/* $Id: macdlg.c,v 1.11 2003/02/04 23:39:26mac_windowsessimac_windowsessimac_windowsessimac_windowsessi Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 616e8dbfd0031b0ae8ac6105944bd865 Text-delta-base-sha1: 8da4745867c394ad4c5c4d550c237b4ca0dcbb3a Text-content-length: 515 Text-content-md5: 5b8b5befab0ed4ad61ce388befaeb756 Text-content-sha1: a0aba4068ef26bacc8d7b7a81306a0a7941a8d16 Content-length: 555 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVNq]`,M g-s(3Yn ZvJKJ!(\6%2DjTA/* $Id: macterm.c,v 1.68 2003/02/04 23:39:26 WinInfo *wwi = smalloc(sizeof(*wi)); wi->s = s; wi->wtype = wTerminal; SetWRefCon(s->window, (long)wimac_windowsessimac_windowsessimac_windowsessimac_windowsessimac_windowsession(GetControlOwner(control)); #else s = mac_windowsessimac_windowsessimac_windowsessimac_windowsessisfree((WinInfo *)GetWRefCon(s->window)mac_windowsessimac_windowsessi Revision-number: 2805 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2003-02-05T09:05:35.000000Z K 7 svn:log V 68 Oops; overzealous copy-and-paste in the Windows Help context names. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0bc9520c05821f27461e038a7e1f2273 Text-delta-base-sha1: 88635c6535a892fac5fea2776aadf880b58f34f2 Text-content-length: 86 Text-content-md5: 7002b713d1d60dacc0b21f2d3110be0c Text-content-sha1: eacc32b4c3954f5b55ee790ae56ac0c33e534790 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN+- <-5Dg\versionid $Id: config.but,v 1.55 2003/02/05 09:05:35pksessi Revision-number: 2806 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2003-02-06T01:01:27.000000Z K 7 svn:log V 70 Move net_service_lookup() to macnet.c, since that's where it belongs. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ac52d4fd85082dab7c27a3962e423340 Text-delta-base-sha1: a519e1276fe124a909ebe62ee69f58dc7bb17b16 Text-content-length: 117 Text-content-md5: 618af491633c8b5d7ded05b86a3a71c7 Text-content-sha1: a7de9d092faf4af338db10b3e8db187befc879c3 Content-length: 156 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN}b aBa?> We should use Internet Config here. */ int net_service_lookup(char *service) { return 0; } Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: afa4c2f0b68af9275553d46304315e23 Text-delta-base-sha1: d9094c36df334c32cb364482b74566a78fa377c2 Text-content-length: 23 Text-content-md5: f767e5d03029fe69d317d586f129d3c0 Text-content-sha1: 53078e04170296862c9efd5f11ec3ab1f139985f Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNv ID2 Revision-number: 2807 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2003-02-06T08:45:25.000000Z K 7 svn:log V 35 putty.planetmirror.com (Australia) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ff3c444377e933106cd0da70e01ec773 Text-delta-base-sha1: d3d6e45624df807d8de2e05fe7338afc55c4fba5 Text-content-length: 123 Text-content-md5: ab53903b434dad4236c361a73083918d Text-content-sha1: 8fd350b7268d17868d6e176b90047501f953fd99 Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN.`1,eHfputty.planetmirror.com/">putty.planetmirror.complanetmirror.com/pub/putty/">ftp.planetmirror.com Revision-number: 2808 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:51.887714Z PROPS-END Revision-number: 2809 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:51.895928Z PROPS-END Revision-number: 2810 Prop-content-length: 224 Content-length: 224 K 8 svn:date V 27 2003-02-07T01:33:24.000000Z K 7 svn:log V 125 Clean up Carbon build procedures somewhat. I still don't have anything that actually works, but I think I'm getting closer. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c417d358dd2a01693b78184a607027af Text-delta-base-sha1: 049cb6e38df7b67bb3da599f3aadf9232667bfd0 Text-content-length: 761 Text-content-md5: f199f300efcc8b472c040b8f16a867dd Text-content-sha1: 2356411b054080f6bf619605155104f0c21ce1b8 Content-length: 801 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN[.*Vv}<^$Id: README.mac,v 1.25 2003/02/07 01:33:24 Install this in the usual way. Universal Headers Install using the script in "Documentation:MPW Users - ReadMe". Text Encoding Converter SDK Copy contents of "68K Static Libraries" to "Interfaces&Libraries:Libraries:Libraries". Copy contents of "Stub Libraries" to "Interfaces&Libraries:Libraries:SharedLibraries". CarbonStdCLib.o Copy contents of "CIncludes" to "Interfaces&Libraries:Interfaces:CIncludes". Copy contents of "PPCLibraries" to "Interfaces&Libraries:Libraries:PPC Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c1f2338e8eca419554510f0caf7cfd87 Text-delta-base-sha1: 86c10a4e8f3457badcef190e468706375d742c22 Text-content-length: 327 Text-content-md5: fd69063d7d57886dfb212c662c416854 Text-content-sha1: b56c960c771e0b30b84515fe68c18339c1ca64be Content-length: 367 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVN'+([L/* $Id: mac.c,v 1.46 2003/02/07 01:33:24TARGET_API_MAC_CARBON /* * This is used by (I think) CarbonStdCLib, but only exists in * CarbonLib 1.1 and later. Muppets. Happily, it's documented to be * a synonym for NULL. */ #include const CFAllocatorRef kCFAllocatorDefault = NULL; #else Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8d6db90b02ce767a04160f23839fae38 Text-delta-base-sha1: 13892d4cf7bfa451df8c5f7ae607c61affedbca7 Text-content-length: 220 Text-content-md5: 73fa81ee20d3fce2fa366ac2ab14c836 Text-content-sha1: 6d5f4c875be99f6121d74889cd9c9e419bc0d34e Content-length: 260 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNp9NSM):6-m __appstart -wPPCLibraries}CarbonStdCLib.o" \xb6 "{PPCLibraries}StdCRuntime.o" \xb6 "{PPCLibraries}PPCCRuntime.o" \xb6 "{SharedLibraries}CarbonLib" \xb6 "{SharedLibraries}StdC Revision-number: 2811 Prop-content-length: 339 Content-length: 339 K 8 svn:date V 27 2003-02-07T01:38:12.000000Z K 7 svn:log V 240 Crude Event Log implementation for the Mac. I'm fairly convinced now that using the List Manager was entirely the wrong decision on my part, so I'll probably rewrite this to use TextEdit at some point, but it's better than stderr even so. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c692e4ba6eeff1bd4d9e6ce9d285acb0 Text-delta-base-sha1: c0a0f8c323fd2a1bcae2ebb6d2124c7d07a02c37 Text-content-length: 42 Text-content-md5: 2345c03b054a0f7507088621da25fdbd Text-content-sha1: 113a0945d9605d4a160e76fce4f9e133f0e2a90d Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNasN0Me| macevlo macevlo Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fd69063d7d57886dfb212c662c416854 Text-delta-base-sha1: b56c960c771e0b30b84515fe68c18339c1ca64be Text-content-length: 369 Text-content-md5: 32fce194e841fafa38ce37fab20b91e7 Text-content-sha1: 3b9cb7ca61ff287dbcd15cb30cec7c04854c9674 Content-length: 409 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVN~&=}(AFF->KU`v/* $Id: mac.c,v 1.47 2003/02/07 01:38:12 case wEventLog: mac_clickeventlo break; case wEventLog: mac_groweventlog(window, event); break case wEventLog: mac_activateeventlog case wEventLog: mac_updateeventlogmenu = GetMenuHandle(mWindow); DisableItem(menu, 0); /* Until we get more than 1 item on it. */ Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0273508d41456ce0f2b71c90147270a6 Text-delta-base-sha1: e58cfff594ecd6b15e5e7deaae57fcd3b2b95c76 Text-content-length: 393 Text-content-md5: 01f9ea08780f06d50022df84fbf1f94f Text-content-sha1: 95d5456d65a92f0a9fc51b81afe8ff4c46486d73 Content-length: 433 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN#,e<&.WN,ListsWindowPtr eventlog_window; ListHandle eventlogeventlog.c */ void mac_freeeventlog(Session *); extern void mac_clickeventlog(WindowPtr, EventRecord *); extern void mac_activateeventlog(WindowPtr, EventRecord *); extern void mac_groweventlog(WindowPtr, EventRecord *); extern void mac_updateeventlog(WindowPtr); extern void mac_showeventlog(Session Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e02e891eea6b12b9275fe4f0a751f509 Text-delta-base-sha1: e1b5d9a4ba5c86c7592c3913842cee1723b64db2 Text-content-length: 471 Text-content-md5: 094786a92759cd6b887f4105b5e751f1 Text-content-sha1: 2327327d8cd5190eb0a426b39d2b6fa2d6cafc02 Content-length: 511 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNIf*Y,0.9GzO/* $Id: mac_res.r,v 1.26 2003/02/07 01:38:12, mWindowresource 'MENU' (mWindow, preload) { mWindow, textMenuProc, 0b11111111111111111111111111111111, enabled, "Window", { "Show Event Log", noicon, nokey,Event log */ resource 'WIND' (wEventLog, "event log", purgeable) { { 0, 0, 200, 200 }, zoomDocProc, invisible, goAway, 0x0, "PuTTY Event Log", staggerParentWindowScreen }; Node-path: putty/mac/macevlog.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 7038 Text-content-md5: 4a360796dd8a337fe7243ec685786bdb Text-content-sha1: a4f33542175262dc14f66efabe97a6604bed8863 Content-length: 7154 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNppp/* $Id: macevlog.c,v 1.1 2003/02/07 01:38:12 ben Exp $ */ /* * Copyright (c) 2003 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include #include #include #include #include #include #include #include #include "putty.h" #include "mac.h" #include "macresid.h" #include "terminal.h" static void mac_draweventloggrowicon(Session *s); static void mac_adjusteventlogscrollbar(Session *s); static void mac_createeventlog(Session *s) { Rect view; #if TARGET_API_MAC_CARBON Rect controlrect; #endif ListBounds bounds = { 0, 0, 0, 1 }; /* 1 column, 0 rows */ Point csize = { 0, 0 }; GrafPtr saveport; long fondsize; WinInfo *wi; s->eventlog_window = GetNewWindow(wEventLog, NULL, (WindowPtr)-1); wi = smalloc(sizeof(*wi)); wi->s = s; wi->wtype = wEventLog; SetWRefCon(s->eventlog_window, (long)wi); GetPort(&saveport); SetPort((GrafPtr)GetWindowPort(s->eventlog_window)); fondsize = GetScriptVariable(smRoman, smScriptSmallFondSize); TextFont(HiWord(fondsize)); TextSize(LoWord(fondsize)); SetPort(saveport); #if TARGET_API_MAC_CARBON GetPortBounds(GetWindowPort(s->eventlog_window), &view); #else view = s->eventlog_window->portRect; #endif view.right -= 15; /* Scrollbar */ s->eventlog = LNew(&view, &bounds, csize, 0, s->eventlog_window, TRUE, TRUE, FALSE, TRUE); mac_adjusteventlogscrollbar(s); #if TARGET_API_MAC_CARBON SetListSelectionFlags(s->eventlog, lExtendDrag | lNoDisjoint | lNoExtend); #else (*s->eventlog)->selFlags = lExtendDrag | lNoDisjoint | lNoExtend; #endif ShowWindow(s->eventlog_window); } void mac_freeeventlog(Session *s) { if (s->eventlog != NULL) LDispose(s->eventlog); if (s->eventlog_window != NULL) { sfree((WinInfo *)GetWRefCon(s->eventlog_window)); DisposeWindow(s->eventlog_window); } } /* * FIXME: logevent() should be passed a frontend handle, but backends have to * have a terminal handle instead, because they pass it to from_backend(), * so we accept a terminal handle here as well, and hope no-one tries to call * us with sensible arguments. */ void logevent(void *frontend, char *str) { Terminal *term = frontend; Session *s = term->frontend; ListBounds bounds; Cell cell = { 0, 0 }; if (s->eventlog == NULL) mac_createeventlog(s); if (s->eventlog == NULL) return; #if TARGET_API_MAC_CARBON GetListDataBounds(s->eventlog, &bounds); #else bounds = (*s->eventlog)->dataBounds; #endif cell.v = bounds.bottom; LAddRow(1, cell.v, s->eventlog); LSetCell(str, strlen(str), cell, s->eventlog); } static void mac_draweventloggrowicon(Session *s) { Rect clip; RgnHandle savergn; SetPort((GrafPtr)GetWindowPort(s->eventlog_window)); /* * Stop DrawGrowIcon giving us space for a horizontal scrollbar * See Tech Note TB575 for details. */ #if TARGET_API_MAC_CARBON GetPortBounds(GetWindowPort(s->eventlog_window), &clip); #else clip = s->eventlog_window->portRect; #endif clip.left = clip.right - 15; savergn = NewRgn(); GetClip(savergn); ClipRect(&clip); DrawGrowIcon(s->eventlog_window); SetClip(savergn); DisposeRgn(savergn); } /* * For some reason, LNew doesn't seem to respect the hasGrow * parameter, so we hammer the scrollbar into shape ourselves. */ static void mac_adjusteventlogscrollbar(Session *s) { #if TARGET_API_MAC_CARBON Rect winrect; GetPortBounds(GetWindowPort(s->eventlog_window), &winrect); SizeControl(GetListVerticalScrollBar(s->eventlog), 16, winrect.bottom - 13); #else SizeControl((*s->eventlog)->vScroll, 16, s->eventlog_window->portRect.bottom - 13); #endif } void mac_clickeventlog(WindowPtr window, EventRecord *event) { Session *s = mac_windowsession(window); Point mouse; GrafPtr saveport; GetPort(&saveport); SetPort((GrafPtr)GetWindowPort(window)); mouse = event->where; GlobalToLocal(&mouse); LClick(mouse, event->modifiers, s->eventlog); SetPort(saveport); } void mac_groweventlog(WindowPtr window, EventRecord *event) { Session *s = mac_windowsession(window); Rect limits; long grow_result; #if TARGET_API_MAC_CARBON Rect rect; Point cellsize; #else GrafPtr saveport; #endif SetRect(&limits, 15, 0, SHRT_MAX, SHRT_MAX); grow_result = GrowWindow(window, event->where, &limits); if (grow_result == 0) return; SizeWindow(window, LoWord(grow_result), HiWord(grow_result), TRUE); LSize(LoWord(grow_result) - 15, HiWord(grow_result), s->eventlog); mac_adjusteventlogscrollbar(s); /* We would use SetListCellSize in Carbon, but it's missing. */ (*s->eventlog)->cellSize.h = LoWord(grow_result) - 15; #if TARGET_API_MAC_CARBON cellsize.h = LoWord(grow_result) - 15; GetListViewBounds(s->eventlog, &rect); InvalWindowRect(window, &rect); #else GetPort(&saveport); SetPort(window); InvalRect(&(*s->eventlog)->rView); SetPort(saveport); #endif } void mac_activateeventlog(WindowPtr window, EventRecord *event) { Session *s = mac_windowsession(window); int active = (event->modifiers & activeFlag) != 0; LActivate(active, s->eventlog); mac_draweventloggrowicon(s); } void mac_updateeventlog(WindowPtr window) { Session *s = mac_windowsession(window); #if TARGET_API_MAC_CARBON RgnHandle visrgn; #endif SetPort((GrafPtr)GetWindowPort(window)); BeginUpdate(window); #if TARGET_API_MAC_CARBON visrgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(window), visrgn); LUpdate(visrgn, s->eventlog); DisposeRgn(visrgn); #else LUpdate(window->visRgn, s->eventlog); #endif mac_draweventloggrowicon(s); EndUpdate(window); } void mac_showeventlog(Session *s) { ShowWindow(s->eventlog_window); } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2fe024bdcf3b833873dff9250b236dcc Text-delta-base-sha1: b0109b7f18db6d205b5068157ea43fc2adf690f3 Text-content-length: 158 Text-content-md5: 8ccdb1534c7f62aadeba0a957fbdc9cb Text-content-sha1: b2cf584f1fa78b9b22740b0c628ffb9e4e3603d0 Content-length: 197 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN `~:,>eD"&e/* $Id: macresid.h,v 1.9 2003/02/07 01:38:12#define mWindow 131/* Window menu */ #define iShowEventLog 1#define wEventLog 133 Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5b8b5befab0ed4ad61ce388befaeb756 Text-delta-base-sha1: a0aba4068ef26bacc8d7b7a81306a0a7941a8d16 Text-content-length: 330 Text-content-md5: 56a94c805942bcacd84970d849e396d8 Text-content-sha1: bb4e047bf1a1658662a5798d6ccb5c3c7e515e06 Content-length: 370 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNq',.^=s[i#N/* $Id: macterm.c,v 1.69 2003/02/07 01:38:12->term menu = GetMenuHandle(mWindow); EnableItem(menu, 0); EnableItem(menu, iShowEventLog break; case mWindow: switch(item) { case iShowEventLog: mac_showeventlog(s); break; } break;mac_freeeventlog(s Revision-number: 2812 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:52.132733Z PROPS-END Revision-number: 2813 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2003-02-07T11:23:09.000000Z K 7 svn:log V 41 Specify which version of Wine I'm using. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/puttygen-accel-bogosity Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 523d8cfd26bba9574365e7756d182733 Text-delta-base-sha1: 63f295f10b48e1298748b39b57db8ed3a206c793 Text-content-length: 64 Text-content-md5: c3a10d29e98eb902797170d2cca3c2f1 Text-content-sha1: d344a5258082ba29315fa07515e441b65713c75d Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNh^ +W\qUnder Wine (Debian version 0.0.20020904-1) Revision-number: 2814 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2003-02-07T11:25:47.000000Z K 7 svn:log V 88 Simon suggests that the next release will be conditional on the Mac port's being ready. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9e84ac5c596bfbd5859dca26b7b38ae4 Text-delta-base-sha1: fe048f55304c15e827eb7d50f85036694cca3fad Text-content-length: 70 Text-content-md5: 2f53bb4a7425de2d07ff83ef9c038bb5 Text-content-sha1: bfdf60d4e33c376224ceeefa860df660213bacdc Content-length: 109 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN6\8Summary: Port to the Mac OS Class: wish Priority: high Revision-number: 2815 Prop-content-length: 194 Content-length: 194 K 8 svn:date V 27 2003-02-07T11:27:05.000000Z K 7 svn:log V 96 None of us has a WinCE box (though we have access to several). I think that makes this taxing. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/port-wince Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 06559659c9f25d66f9ecac33d41aa178 Text-delta-base-sha1: e8d9c994c99f8c42b97cbd50007c7cba711a9b06 Text-content-length: 24 Text-content-md5: 8d03870f035a2eef973359b8370ce0ea Text-content-sha1: 5ac570954aabd2ba904c80da84fce3d36ee38587 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNqqW\axing Revision-number: 2816 Prop-content-length: 259 Content-length: 259 K 7 svn:log V 160 Reword this to be more intelligible to ignorant Americans who don't know what AltGr is for. After all, they're the ones who are likely to care about this bug. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-07T11:30:27.000000Z PROPS-END Node-path: putty-wishlist/data/right-alt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a21ae688f65b35d3229cc2a8f1e6d6c5 Text-delta-base-sha1: 0bca7caa759da61eda7513dddd2bd787484d501a Text-content-length: 252 Text-content-md5: 49b5c1dac1a1989689cbb221d4033884 Text-content-sha1: eb701b0c2c97fae9618a5fc55afae55ef227a6cc Content-length: 291 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN%9 dd;jMost PC keyboards use the key to the right of the space bar as AltGr, an extra shift key for generating interesting graphic characters, but some keyboard layouts (apparently the US one, at least) don't, and users of such layouts Revision-number: 2817 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2003-02-07T11:32:02.000000Z K 7 svn:log V 108 I've long thought that this was at most a semi-bug. Gratuitously downgrade it to see if anyone else cares. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/async-dns Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 86d3d44218b30d8c3fe8f4662c2c3731 Text-delta-base-sha1: dbfddd0e34b5169960b80b83d993f990bdad695b Text-content-length: 66 Text-content-md5: ac08c5808306529508ebe22e2744ed64 Text-content-sha1: 227639e762ec30bbfc79dc51825eed84c6cc6246 Content-length: 105 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNsx2F-Summary: DNS lookups are synchronous. Class: semi- Revision-number: 2818 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2003-02-07T11:34:34.000000Z K 7 svn:log V 52 Async-DNS isn't particularly hard on Mac OS either. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/async-dns Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ac08c5808306529508ebe22e2744ed64 Text-delta-base-sha1: 227639e762ec30bbfc79dc51825eed84c6cc6246 Text-content-length: 83 Text-content-md5: ef802f946701f384fbaa22cba703d2ec Text-content-sha1: d8cbb511c77f6acdaf6ec9e6c66a58ee771e31c6 Content-length: 122 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNx: >ies will the Mac OS (where almost everything can be asynchronous Revision-number: 2819 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:52.377678Z PROPS-END Revision-number: 2820 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2003-02-07T13:08:26.000000Z K 7 svn:log V 118 While we're updating this wishlist entry, I'll shove in my current thoughts on how it should actually be implemented. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/async-dns Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ef802f946701f384fbaa22cba703d2ec Text-delta-base-sha1: d8cbb511c77f6acdaf6ec9e6c66a58ee771e31c6 Text-content-length: 1073 Text-content-md5: 5222ec83cee8e483d760db8930b23c15 Text-content-sha1: fb127ac89309df3ac878c91381f9806e6c841ed8 Content-length: 1112 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN:?!.

    SGT, 2003-02-07: I now think I have some idea of how to design a DNS abstraction which can cope equally well with being implemented synchronously or asynchronously. It's rather simple, actually: sk_namelookup acquires a couple of extra parameters, in the form of a function pointer and a context handle to be passed to that function. The code which calls sk_namelookup should expect that function to be called in turn on completion of the DNS lookup. Then a synchronous DNS implementation could actually call the function straight from sk_namelookup itself, whereas an asynchronous one could call it from whatever callback ends up getting hold of the results of the lookup. Client code, of course, will have to be written in such a way that it doesn't mind which happens; in practice that will probably mean the function which called sk_namelookup should terminate immediately after doing so, rather than doing anything which might need to be done before or after the DNS lookup. Revision-number: 2821 Prop-content-length: 123 Content-length: 123 K 7 svn:log V 23 Give PuTTYgen an icon. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-07T13:54:34.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d10225183d67e48fb888e018a844638 Text-delta-base-sha1: ab51c583aeb47330f1d724d8826c751fbcafaa05 Text-content-length: 181 Text-content-md5: 0275b7ea02842fdcb9a7714acb9f14fd Text-content-sha1: fc22a252283258e6747b7b00779d7efbb8a62b62 Content-length: 221 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNc{fcgcifdef MSVC4 #define ICON_BIG 1 #endif SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(200))) Revision-number: 2822 Prop-content-length: 210 Content-length: 210 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-07T14:22:19.000000Z K 7 svn:log V 109 Set some parent windows on PuTTYgen and Pageant About/Licence dialog to improve window management behaviour. PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 349ae0131dbd7aa0805487eaea619f8a Text-delta-base-sha1: e7e3232f445cb176390ecdf57ceef9bf07caf002 Text-content-length: 28 Text-content-md5: e9e0d2f18f2a3db78919be21179e6d66 Text-content-sha1: 92bbd92178023c7ba063eff0b71360608f97bc55 Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVNPP GKhwnd Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0275b7ea02842fdcb9a7714acb9f14fd Text-delta-base-sha1: fc22a252283258e6747b7b00779d7efbb8a62b62 Text-content-length: 39 Text-content-md5: b8c5be4980a494bcfa05a25c47399874 Text-content-sha1: 98458fc092e53e1a88f8779655d71eba593fc1d7 Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVN{{]ya^hwndhwnd Revision-number: 2823 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2003-02-07T15:45:05.000000Z K 7 svn:log V 80 Add some detail about why I believe this is a Hard, if not Impossible, problem. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/win-command-prompt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4c1953b87ce6841c9a2853b298570282 Text-delta-base-sha1: 7e2befcd30f205173c9d401d4ec8e657a53ce266 Text-content-length: 2980 Text-content-md5: 76a7fc3745b51de2bdfdb26782cc0652 Text-content-sha1: a34cbb03fd4a38a91ae11304b19d62291347325f Content-length: 3019 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN$Lots of people ask whether PuTTY would be able to act as a front end for Windows command interpreters (Command Prompt, bash, etc), in place of the not-very-pleasant standard console window.

    I haven't investigated this very closely, but it's not clear to me that this would be useful for anything except Cygwin. I've used Windows telnetds, and they look to me as if they're working in a fundamentally different way from a Unix telnetd. When you issue a command that scrolls the screen a lot, it seems to get _redrawn_ from the server end rather than scrolled - as if the server had its own image of what the console screen ought to look like and was running something like libcurses to reproduce that image on the client side.

    This leads me to conjecture that Windows's equivalent of a pty works more like /dev/vcs than /dev/pty* - Windows will still do the terminal emulation itself, and all you can do is read the results off a rectangular screen buffer and transfer them to an output device. So there would be no scope, in this model, for PuTTY to supply superior terminal emulation.

    The alternative to that, of course, would be to ignore Windows's pty equivalent (whatever it is) and run the application in an ordinary pair of pipes instead. But this doesn't seem to work very well for the ordinary Windows Command Prompt utility: if you do that, you lose the command-line editing and recall which the console device provides.

    As far as I can tell (and this is still all deductions based on observation, and might be wrong), the Cygwin library takes a completely different approach: the first Cygwin program you run in a Windows console will turn part of itself into a terminal emulator, create some pipes, and run the rest of the program in those pipes. If the program spawns other programs, they are passed the same pipes, and all terminal emulation is done by whichever program was first to get hold of the real console device. So in this model, PuTTY could contribute: it could run (say) Cygwin bash in a pair of pipes, and apply its own terminal emulation to the data it received from bash. However, there's still the question of what it would do about local line editing (which Unix utilities would still want to enable sometimes). I suspect Cygwin has a means of dealing with this, which a hypothetical local-PuTTY would have to implement.

    In summary: I believe Windows does not supply an interface at the right level to make it sensibly possible to run a Command Prompt inside PuTTY's terminal emulator. I believe it would be possible in theory, but quite fiddly, to turn PuTTY into a local xterm-alike for the use of Cygwin programs only; but this is significantly less useful than the original goal of making it a generic replacement for the Command Prompt window. So unless anyone can correct my deductions above, I don't think this has a sufficiently high benefit-to-effort ratio to be worth doing. Revision-number: 2824 Prop-content-length: 243 Content-length: 243 K 7 svn:log V 142 Correct a couple of typos, and downgrade to low priority on the basis that I don't think it's a feasible thing to do except in special cases. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-02-07T15:49:50.000000Z PROPS-END Node-path: putty-wishlist/data/win-command-prompt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 76a7fc3745b51de2bdfdb26782cc0652 Text-delta-base-sha1: a34cbb03fd4a38a91ae11304b19d62291347325f Text-content-length: 523 Text-content-md5: 23472b0f0d6685a4b815af5020169597 Text-content-sha1: 33f2822029ae95b227a2ce3b0921b692dd9228a8 Content-length: 562 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN$Bhh$nVna`Dlow redrawn from the server end rather than scrolled - as if the server had its own image of what the console screen ought to look like and was running something like libcurses to reproduce that /dev/vcs than /dev/pty* - Windows will still do the terminal emulation itself, and all you can do is read the results off a rectangular screen buffer and transfer them to an output device. So there would be no scope, in this model, for PuTTY to Revision-number: 2825 Prop-content-length: 425 Content-length: 425 K 8 svn:date V 27 2003-02-07T16:19:48.000000Z K 7 svn:log V 324 Instead of all bug pages containing the date of generation of the HTML form, they now contain the date of last update of the CVS source form, as retrieved by `cvs status'. The main Wishlist index page still contains the generation date, so it's still possible to tell if the cron jobs fail and the script stops being run... K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d458f2bc6c679a0303fb0a1dd056f5df Text-delta-base-sha1: 282c15c56d9e913068e70876fb55c20b61ba3514 Text-content-length: 454 Text-content-md5: d9c2f8402651168b2d708f89206b09ab Text-content-sha1: 01e5d1ce9edcc64defc52bc6442cffa5d63de1dc Content-length: 494 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN*'!i<P%8uD#! /usr/bin/perl # $Id: bugs2html,v 1.20 2003/02/07 16:19:48, `cvs status $bugfile`, $cvsstatEOF $time = "(generated by bugs2html at\n" . POSIX::strftime("%a, %d %b %Y, %H:%M:%S %Z", gmtime) . ")\n"; if ($cvsstat ne "" and $cvsstat =~ /^\s+Working revision:\s+\S+\s+(.*\S)\s*$/m) { $time = "(last revision of this bug record was at $1)\n"; } else { } print HTML $time . "\n"; Revision-number: 2826 Prop-content-length: 274 Content-length: 274 K 7 svn:log V 173 Summary: Proxy crash caused by uninitialised structure members (already fixed -- I'm only adding this now because someone's managed to trip over it with the release binary) K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-07T17:40:45.000000Z PROPS-END Node-path: putty-wishlist/data/proxy-uninit-members Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 609 Text-content-md5: 1967c7b645581b5f0ae5417a9bc2f087 Text-content-sha1: b7aeb04e16bfe35f1a8596510aeac9798ad09aa6 Content-length: 725 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSSSSummary: Proxy crash caused by uninitialised structure members Class: bug Difficulty: fun Priority: high Present-in: 0.53 0.53b Fixed-in: 2002-10-23 Content-type: text/plain Attempting connection with a proxy could cause a crash due to uninitialised structure members in proxy data structures. I (JTN) had only been able to reproduce this with my own local builds (which use a different compiler / libc to the releases and snapshots). However, we've had one report of it cropping up with the 0.53b release on WinXP Pro. There isn't really a workaround other than to use the snapshots instead. Revision-number: 2827 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2003-02-08T15:03:17.000000Z K 7 svn:log V 18 add ref to Mosaic K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/http-proxy-env Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 855d687e4abc7b08f68fce321b46b7da Text-delta-base-sha1: a298503aeeac4e11465bd5d814433565ef502ef9 Text-content-length: 78 Text-content-md5: bd78a982dd5ff72e49922005d07fd4d3 Text-content-sha1: 73a85774c020c6828a0357b1d5b3dd468f89942c Content-length: 117 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNE>D Ben suggests that NCSA Mosaic might be a good place to look. Revision-number: 2828 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 36 Add http://www.nosignal.org/putty/. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-10T18:27:16.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ab53903b434dad4236c361a73083918d Text-delta-base-sha1: 8fd350b7268d17868d6e176b90047501f953fd99 Text-content-length: 58 Text-content-md5: d715dbd2e7a54a9c4c382d0aacc17870 Text-content-sha1: 87e3a743654318a029176491df76984fce39d440 Content-length: 98 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNw %'+Zwww.nosignal.org/putty/">www.nosignal Revision-number: 2829 Prop-content-length: 149 Content-length: 149 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-10T18:43:09.000000Z K 7 svn:log V 51 Summary: time() returning (time_t)-1 is mishandled PROPS-END Node-path: putty-wishlist/data/time_t-minus-one Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 549 Text-content-md5: 61384c51a46050d01d7fb910b49b7d4f Text-content-sha1: 765d83ee3b45395cbadc0b5219bc6df21ba85328 Content-length: 665 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: time() returning (time_t)-1 is mishandled Class: bug Difficulty: fun Priority: medium Present-in: 2003-02-09 Content-type: text/plain In various places, PuTTY calls time() and passes the result straight to localtime() without checking whether the result was (time_t)-1, which indicates that time() couldn't return the correct answer. Doing this invokes undefined behaviour (a GPF on Windows), which is Bad. PuTTY should do something more sensible when presented with (time_t)-1. Ref: <001f01c2d091$74f19560$af00a8c0@dual> Revision-number: 2830 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2003-02-10T23:49:58.000000Z K 7 svn:log V 55 The event log is implemented; remove it from the list. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f199f300efcc8b472c040b8f16a867dd Text-delta-base-sha1: 2356411b054080f6bf619605155104f0c21ce1b8 Text-content-length: 63 Text-content-md5: 67ca855ee00b2b3f9f3aeb0ae468370c Text-content-sha1: 418109cbdbad7e8f1380bcc1dba7110dc5a75c80 Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN *\*$Id: README.mac,v 1.26 2003/02/10 23:49:58 Revision-number: 2831 Prop-content-length: 343 Content-length: 343 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-02-11T13:01:46.000000Z K 7 svn:log V 242 ssh.com have now published their agent protocol, so I've removed the `please pester ssh.com' text, added a link to the draft, and downgraded the difficulty to merely `tricky' on the grounds that the external thing we needed is now available. PROPS-END Node-path: putty-wishlist/data/agentfwd-ssh.com Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5e3143355732b24de20c6aea1c5161ff Text-delta-base-sha1: 64ebf3d329445313a6e55238b7c60916bf4aae8c Text-content-length: 280 Text-content-md5: 84a6a2a3ab9c341b5e0d36a819b7b42f Text-content-sha1: 5980d2846b915f24a1ea15647833420efbe3a0e4 Content-length: 319 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN%" a@f|rickywe have not yet got round to supporting.

    SGT, 2003-02-11: The initial IETF draft of the ssh.com agent protocol is available here: draft-ietf-secsh-agent-01.txt Revision-number: 2832 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2003-02-11T14:10:20.000000Z K 7 svn:log V 69 Remove another `please pester ssh.com for their agent protocol' bit. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd2a86154f642e533c1e0d41e2d11886 Text-delta-base-sha1: 4c4113b0ce4f8fb111cd57cb270ddc034d8be509 Text-content-length: 115 Text-content-md5: b7c4e5604d5b1843c03ff297aaa45628 Text-content-sha1: d15b79074ac2e0d5a3361f8cabf61425358c5a98 Content-length: 155 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN5\ ]&;Y\\versionid $Id: pageant.but,v 1.10 2003/02/11 14:10:20 simon, which PuTTY does not yet suppor Revision-number: 2833 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2003-02-11T14:33:36.000000Z K 7 svn:log V 29 Remove Secure iXplorer link. K 10 svn:author V 4 owen PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7243d270e9dd76249745c0b586252085 Text-delta-base-sha1: c0de3963955cc710ebe03695c693420eb8129613 Text-content-length: 24 Text-content-md5: 4e28905b91fb95e4f1d533226150f990 Text-content-sha1: 951a9a2d18c99b1296278d71498e530eb76138d9 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNk zq% Revision-number: 2834 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2003-02-11T17:46:44.000000Z K 7 svn:log V 65 Summary: Cipher "des-cbc" is less non-standard than PuTTY claims K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-des-cbc-is-std Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1081 Text-content-md5: 25b31aaa0d24e506afcb682cc5cf1246 Text-content-sha1: 305c3efd422883510cca5cacb1381ab597171c10 Content-length: 1197 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN+++Summary: Cipher "des-cbc" is less non-standard than PuTTY claims Class: bug Priority: low Difficulty: fun Present-in: 2003-02-11 Content-type: text/x-html-body

    According to draft-ietf-secsh-assignednumbers-01.txt, "des-cbc" is one of the assigned cipher names for SSH2. PuTTY currently describes it (in the configuration box, the documentation, and comments in sshdes.c) as non-standard.

    draft-ietf-secsh-assignednumbers-01.txt is, however, incorrect in this area, since it claims:

    This document defines the initial state of the IANA assigned numbers for the SSH protocol as defined in [SSH-ARCH], [SSH-TRANS], [SSH-CONNECT], [SSH-USERAUTH]. This document does not define any new protocols or any number ranges not already defined in the above referenced documents.

    "des-cbc" is not defined in any of those referenced documents. Revision-number: 2835 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2003-02-11T23:10:34.000000Z K 7 svn:log V 54 Clip host resize requests to the size of the desktop. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 67ca855ee00b2b3f9f3aeb0ae468370c Text-delta-base-sha1: 418109cbdbad7e8f1380bcc1dba7110dc5a75c80 Text-content-length: 63 Text-content-md5: 55847c5b9bcf4e04d3b2a3af2297d947 Text-content-sha1: 0362284a7ddcd5335a73f48c34e7430379e4ff5e Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN \ **/^$Id: README.mac,v 1.27 2003/02/11 23:10:34 Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 56a94c805942bcacd84970d849e396d8 Text-delta-base-sha1: bb4e047bf1a1658662a5798d6ccb5c3c7e515e06 Text-content-length: 536 Text-content-md5: 1b19bcffec9bc218639cb59786b617e0 Text-content-sha1: 7dac49b523a8928ad6b37a4a04bc4eebc379abe8 Content-length: 576 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVNE{,O8\/* $Id: macterm.c,v 1.70 2003/02/11 23:10:34 { Session *s = frontend; RgnHandle grayrgn; Rect graybox; int wlim, hlim; /* Arbitrarily clip to the size of the desktop. */ grayrgn = GetGrayRgn(); #if TARGET_API_MAC_CARBON GetRegionBounds(grayrgn, &graybox); #else graybox = (*grayrgn)->rgnBBox; #endif wlim = (graybox.right - graybox.left) / s->font_width; hlim = (graybox.bottom - graybox.top) / s->font_height; if (w > wlim) w = wlim; if (h > hlim) h = hlim; Revision-number: 2836 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2003-02-12T11:41:52.000000Z K 7 svn:log V 56 Add likely symptoms and reference to an earlier report. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/time_t-minus-one Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 61384c51a46050d01d7fb910b49b7d4f Text-delta-base-sha1: 765d83ee3b45395cbadc0b5219bc6df21ba85328 Text-content-length: 159 Text-content-md5: 89f418a7e0be645cf5a21299d8ff90d2 Text-content-sha1: a09d0fdb45899b5cca76ef4c52d3cb4c88b9dfe7 Content-length: 198 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN! l ,kIn current versions of Windows this manifests when the system clock is set to dates around 2038. Ref: <20020211221424.GA12404@boerde.de> Revision-number: 2837 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2003-02-12T11:55:24.000000Z K 7 svn:log V 114 Add a quote from RFC 1123 which indicates (in broad terms) how PuTTY should handle hosts with multiple addresses. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/multiple-addresses Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8d84c717a6e44f1025e1df1bcb5ede11 Text-delta-base-sha1: e820f592a75ca75eb6006e7b5ba75d8719b56251 Text-content-length: 588 Text-content-md5: 796e4a8af2e05bcea547784088e1d395 Text-content-sha1: ec8b3a5e773dcc90e22220eca23d821ac42f90b9 Content-length: 627 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN;t9;9

    RFC 1123 has this to say on the subject:

    When the remote host is multihomed, the name-to-address translation will return a list of alternative IP addresses. As specified in Section 6.1.3.4, this list should be in order of decreasing preference. Application protocol implementations SHOULD be prepared to try multiple addresses from the list until success is obtained. More specific requirements for SMTP are given in Section 5.3.4.

    Revision-number: 2838 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 70 Summary: "Print screen" and similar functions Depends: cooked-printer K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-12T17:52:31.000000Z PROPS-END Node-path: putty-wishlist/data/print-screen Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 343 Text-content-md5: bc3e3f28537580a32877ec10db4c9e94 Text-content-sha1: 5983088cb516684c4c435f17ad17c4e310ff5d62 Content-length: 459 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNIIISummary: "Print screen" and similar functions Class: wish Difficulty: tricky Depends: cooked-printer Priority: low Content-type: text/x-html-body

    Support for locally-initiated printing functions such as "print screen".

    This will require something similar to simple Windows GDI line-printer emulation to be implemented. Revision-number: 2839 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2003-02-12T19:49:25.000000Z K 7 svn:log V 65 Update list of Telnet options to match what IANA currently have. K 10 svn:author V 3 ben PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0460c06ff70985846c7cf3c982d5e9f2 Text-delta-base-sha1: a22a323d59fc473e9fbc0f58822170fd900763d5 Text-content-length: 823 Text-content-md5: b2c1216676239c2431c2097f6cc53bc1 Text-content-sha1: 480ce185c66979c039cdfc454ce5aafd8e2ef0c8 Content-length: 863 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVN / ;eYt TELOPT_TN3270E 40 /* TN3270 enhancements */ #define TELOPT_XAUTH 41 #define TELOPT_CHARSET 42 /* Character set */ #define TELOPT_RSP 43 /* Remote serial port */ #define TELOPT_COM_PORT_OPTION 44 /* Com port control */ #define TELOPT_SLE 45 /* Suppress local echo */ #define TELOPT_STARTTLS 46 /* Start TLS */ #define TELOPT_KERMIT 47 /* Automatic Kermit file transfer */ #define TELOPT_SEND_URL 48 #define TELOPT_FORWARD_X 49 #define TELOPT_PRAGMA_LOGON 138 #define TELOPT_SSPI_LOGON 139 #define TELOPT_PRAGMA_HEARTBEAT 140TN3270E); i(XAUTH); i(CHARSET); i(RSP); i(COM_PORT_OPTION); i(SLE); i(STARTTLS); i(KERMIT); i(SEND_URL); i(FORWARD_X); i(PRAGMA_LOGON); i(SSPI_LOGON); i(PRAGMA_HEARTBEAT Revision-number: 2840 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 72 Convert implicit (char *) and (unsigned char *) casts to explicit ones. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-12T23:06:40.000000Z PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ed142253c2949ac6ddb70658298d9fbd Text-delta-base-sha1: 3cd791b7e62ae44f4c020d3a75fb1aa7b9578e93 Text-content-length: 547 Text-content-md5: cb344328dfe8c6ebb705abcdbb3e0fdb Text-content-sha1: b40d803288310f70b7e51c21376c14552c0b494b Content-length: 587 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNl)kUjUt; /Oldnh_qN5Z6.oT_q.5HL6 |(unsigned char *)passphrase, strlen(passphrase)); MD5Update(&md5c, (unsigned char *)(unsigned char *)passphrase, strlen(passphrase)); MD5Update(&md5c, (unsigned char *)(unsigned char *)(char *)(unsigned char *)(unsigned char *)(char *)(unsigned char *)(unsigned char *)(unsigned char *)ciphertext, cipher(char *)(unsigned char *)(unsigned char *)encrypt_pubkey_ossh(keybuf, iv, (unsigned char *)ciphertext, cipher Revision-number: 2841 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2003-02-12T23:21:38.000000Z K 7 svn:log V 47 Deal with a "possible extraneous ';'" warning. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ca446668dabfc8ca0afe0832c5367a31 Text-delta-base-sha1: d7400761d5889231830dac8acb1bed8ee5b84ba3 Text-content-length: 35 Text-content-md5: adc2d12064878436e90735901258ff29 Text-content-sha1: 559b3d997f07f5d2eb1b6d382b6aa18488d8d38c Content-length: 74 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN$  continue Revision-number: 2842 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2003-02-12T23:53:15.000000Z K 7 svn:log V 119 Minimal shell of PuTTYgen for Mac. No actual PuTTYgen-specific code there yet, but an absence of PuTTY-specific code. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2345c03b054a0f7507088621da25fdbd Text-delta-base-sha1: 113a0945d9605d4a160e76fce4f9e133f0e2a90d Text-content-length: 244 Text-content-md5: 84fedd5af0dbda5abee53e43981aa28f Text-content-sha1: 896b6422eaad11e297a57c20a702fa237508884b Content-length: 284 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNsO ['M&I + macmiscPuTTYgen : [M] macpgen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version + sshrand macnoise sshsha macstore misc sshrsa sshdss macmisc sshpubk + sshaes sshsh512 import macpgen.rsrc Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 32fce194e841fafa38ce37fab20b91e7 Text-delta-base-sha1: 3b9cb7ca61ff287dbcd15cb30cec7c04854c9674 Text-content-length: 131 Text-content-md5: 01d750582b2fff384a726469f72ba2a4 Text-content-sha1: fe0357262d07d1d77ec695665803239a5b4faaff Content-length: 171 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVN~Wd (?P*r/* $Id: mac.c,v 1.48 2003/02/12 23:53:15/* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 094786a92759cd6b887f4105b5e751f1 Text-delta-base-sha1: 2327327d8cd5190eb0a426b39d2b6fa2d6cafc02 Text-content-length: 95 Text-content-md5: c93cf36f0517787a630ef3fae9fbeac3 Text-content-sha1: 8920a517ff1922dd2a4a2516a299103fffa22ae6 Content-length: 135 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNfE@F,A`~h/* $Id: mac_res.r,v 1.27 2003/02/12 23:53:15#include "version.r" Node-path: putty/mac/macmisc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4164 Text-content-md5: cdfcc7e6f9dff640b119907659012c61 Text-content-sha1: 01f5428985f33daa1f59104d68a9fb1c06998adf Content-length: 4280 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN666/* $Id: macmisc.c,v 1.1 2003/02/12 23:53:15 ben Exp $ */ /* * Copyright (c) 1999, 2003 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include #include #include #include #include #include #include #include "putty.h" #if TARGET_API_MAC_CARBON /* * This is used by (I think) CarbonStdCLib, but only exists in * CarbonLib 1.1 and later. Muppets. Happily, it's documented to be * a synonym for NULL. */ #include const CFAllocatorRef kCFAllocatorDefault = NULL; #else QDGlobals qd; #endif void fatalbox(char *fmt, ...) { va_list ap; Str255 stuff; va_start(ap, fmt); /* We'd like stuff to be a Pascal string */ stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); va_end(ap); ParamText(stuff, NULL, NULL, NULL); StopAlert(128, NULL); cleanup_exit(1); } void modalfatalbox(char *fmt, ...) { va_list ap; Str255 stuff; va_start(ap, fmt); /* We'd like stuff to be a Pascal string */ stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); va_end(ap); ParamText(stuff, NULL, NULL, NULL); StopAlert(128, NULL); cleanup_exit(1); } Filename filename_from_str(const char *str) { Filename ret; Str255 tmp; /* XXX This fails for filenames over 255 characters long. */ c2pstrcpy(tmp, str); FSMakeFSSpec(0, 0, tmp, &ret.fss); return ret; } /* * Convert a filename to a string for display purposes. * See pp 2-44--2-46 of IM:Files * * XXX static storage considered harmful */ const char *filename_to_str(const Filename *fn) { CInfoPBRec pb; Str255 dirname; OSErr err; static char *path = NULL; char *newpath; if (path != NULL) sfree(path); path = smalloc(fn->fss.name[0]); p2cstrcpy(path, fn->fss.name); pb.dirInfo.ioNamePtr = dirname; pb.dirInfo.ioVRefNum = fn->fss.vRefNum; pb.dirInfo.ioDrParID = fn->fss.parID; pb.dirInfo.ioFDirIndex = -1; do { pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrParID; err = PBGetCatInfoSync(&pb); /* XXX Assume not A/UX */ newpath = smalloc(strlen(path) + dirname[0] + 2); p2cstrcpy(newpath, dirname); strcat(newpath, ":"); strcat(newpath, path); sfree(path); path = newpath; } while (pb.dirInfo.ioDrDirID != fsRtDirID); return path; } int filename_equal(Filename f1, Filename f2) { return f1.fss.vRefNum == f2.fss.vRefNum && f1.fss.parID == f2.fss.parID && f1.fss.name[0] == f2.fss.name[0] && memcmp(f1.fss.name + 1, f2.fss.name + 1, f1.fss.name[0]) == 0; } int filename_is_null(Filename fn) { return fn.fss.vRefNum == 0 && fn.fss.parID == 0 && fn.fss.name[0] == 0; } FILE *f_open(Filename fn, char const *mode) { short savevol; long savedir; char tmp[256]; FILE *ret; HGetVol(NULL, &savevol, &savedir); if (HSetVol(NULL, fn.fss.vRefNum, fn.fss.parID) == noErr) { p2cstrcpy(tmp, fn.fss.name); ret = fopen(tmp, mode); } else ret = NULL; HSetVol(NULL, savevol, savedir); return ret; } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/macpgen.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 16519 Text-content-md5: 88f84b66837394ec8b56a3eb5cbfee80 Text-content-sha1: 3bc972f7b7d65c26d1514291cfbba71c2accbfd9 Content-length: 16635 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNvvv/* $Id: macpgen.c,v 1.1 2003/02/12 23:53:15 ben Exp $ */ /* * Copyright (c) 1999, 2003 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * macpgen.c - PuTTYgen for Mac OS */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* putty.h needs size_t */ #include /* for vsprintf */ #define PUTTY_DO_GLOBALS #include "macpgrid.h" #include "putty.h" #include "ssh.h" #include "mac.h" static void mac_startup(void); static void mac_eventloop(void); #pragma noreturn (mac_eventloop) static void mac_event(EventRecord *); static void mac_contentclick(WindowPtr, EventRecord *); static void mac_growwindow(WindowPtr, EventRecord *); static void mac_activatewindow(WindowPtr, EventRecord *); static void mac_activateabout(WindowPtr, EventRecord *); static void mac_updatewindow(WindowPtr); static void mac_updatelicence(WindowPtr); static void mac_keypress(EventRecord *); static int mac_windowtype(WindowPtr); static void mac_menucommand(long); static void mac_openabout(void); static void mac_openlicence(void); static void mac_adjustcursor(RgnHandle); static void mac_adjustmenus(void); static void mac_closewindow(WindowPtr); static void mac_zoomwindow(WindowPtr, short); #pragma noreturn (cleanup_exit) struct mac_windows { WindowPtr about; WindowPtr licence; }; struct mac_windows windows; int borednow; struct mac_gestalts mac_gestalts; int main (int argc, char **argv) { mac_startup(); mac_eventloop(); } #pragma noreturn (main) static void mac_startup(void) { Handle menuBar; TECInfoHandle ti; #if !TARGET_API_MAC_CARBON /* Init Memory Manager */ MaxApplZone(); /* Init QuickDraw */ InitGraf(&qd.thePort); /* Init Font Manager */ InitFonts(); /* Init Window Manager */ InitWindows(); /* Init Menu Manager */ InitMenus(); /* Init TextEdit */ TEInit(); /* Init Dialog Manager */ InitDialogs(NULL); #endif /* Get base system version (only used if there's no better selector) */ if (Gestalt(gestaltSystemVersion, &mac_gestalts.sysvers) != noErr || (mac_gestalts.sysvers &= 0xffff) < 0x700) fatalbox("PuTTY requires System 7 or newer"); /* Find out if we've got Color Quickdraw */ if (Gestalt(gestaltQuickdrawVersion, &mac_gestalts.qdvers) != noErr) mac_gestalts.qdvers = gestaltOriginalQD; /* ... and the Appearance Manager? */ if (Gestalt(gestaltAppearanceVersion, &mac_gestalts.apprvers) != noErr) if (Gestalt(gestaltAppearanceAttr, NULL) == noErr) mac_gestalts.apprvers = 0x0100; else mac_gestalts.apprvers = 0; #if TARGET_RT_MAC_CFM /* Paranoia: Did we manage to pull in AppearanceLib? */ if (&RegisterAppearanceClient == kUnresolvedCFragSymbolAddress) mac_gestalts.apprvers = 0; #endif #if TARGET_CPU_68K mac_gestalts.cntlattr = 0; mac_gestalts.windattr = 0; #else /* Mac OS 8.5 Control Manager (proportional scrollbars)? */ if (Gestalt(gestaltControlMgrAttr, &mac_gestalts.cntlattr) != noErr || &SetControlViewSize == kUnresolvedCFragSymbolAddress) mac_gestalts.cntlattr = 0; /* Mac OS 8.5 Window Manager? */ if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr || &SetWindowContentColor == kUnresolvedCFragSymbolAddress) mac_gestalts.windattr = 0; #endif /* Text Encoding Conversion Manager? */ if ( #if TARGET_RT_MAC_CFM &TECGetInfo == kUnresolvedCFragSymbolAddress || #else InitializeUnicodeConverter(NULL) != noErr || #endif TECGetInfo(&ti) != noErr) mac_gestalts.encvvers = 0; else { mac_gestalts.encvvers = (*ti)->tecVersion; mac_gestalts.uncvattr = (*ti)->tecUnicodeConverterFeatures; DisposeHandle((Handle)ti); } /* Navigation Services? */ if (NavServicesAvailable()) mac_gestalts.navsvers = NavLibraryVersion(); else mac_gestalts.navsvers = 0; /* We've been tested with the Appearance Manager */ if (mac_gestalts.apprvers != 0) RegisterAppearanceClient(); menuBar = GetNewMBar(128); if (menuBar == NULL) fatalbox("Unable to create menu bar."); SetMenuBar(menuBar); AppendResMenu(GetMenuHandle(mApple), 'DRVR'); mac_adjustmenus(); DrawMenuBar(); InitCursor(); windows.about = NULL; windows.licence = NULL; flags = FLAG_INTERACTIVE; /* Install Apple Event handlers. */ #if 0 AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, NewAEEventHandlerUPP(&mac_aevt_oapp), 0, FALSE); AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerUPP(&mac_aevt_odoc), 0, FALSE); AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerUPP(&mac_aevt_pdoc), 0, FALSE); #endif AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(&mac_aevt_quit), 0, FALSE); } static void mac_eventloop(void) { Boolean gotevent; EventRecord event; RgnHandle cursrgn; cursrgn = NewRgn(); for (;;) { mac_adjustcursor(cursrgn); gotevent = WaitNextEvent(everyEvent, &event, LONG_MAX, cursrgn); mac_adjustcursor(cursrgn); if (gotevent) mac_event(&event); if (borednow) cleanup_exit(0); } DisposeRgn(cursrgn); } static void mac_event(EventRecord *event) { short part; WindowPtr window; switch (event->what) { case mouseDown: part = FindWindow(event->where, &window); switch (part) { case inMenuBar: mac_adjustmenus(); mac_menucommand(MenuSelect(event->where)); break; #if !TARGET_API_MAC_CARBON case inSysWindow: SystemClick(event, window); break; #endif case inContent: if (window != FrontWindow()) /* XXX: check for movable modal dboxes? */ SelectWindow(window); else mac_contentclick(window, event); break; case inGoAway: if (TrackGoAway(window, event->where)) mac_closewindow(window); break; case inDrag: /* XXX: moveable modal check? */ #if TARGET_API_MAC_CARBON { BitMap screenBits; GetQDGlobalsScreenBits(&screenBits); DragWindow(window, event->where, &screenBits.bounds); } #else DragWindow(window, event->where, &qd.screenBits.bounds); #endif break; case inGrow: mac_growwindow(window, event); break; case inZoomIn: case inZoomOut: if (TrackBox(window, event->where, part)) mac_zoomwindow(window, part); break; } break; case keyDown: case autoKey: mac_keypress(event); break; case activateEvt: mac_activatewindow((WindowPtr)event->message, event); break; case updateEvt: mac_updatewindow((WindowPtr)event->message); break; #if !TARGET_API_MAC_CARBON case diskEvt: if (HiWord(event->message) != noErr) { Point pt; SetPt(&pt, 120, 120); DIBadMount(pt, event->message); } break; #endif case kHighLevelEvent: AEProcessAppleEvent(event); /* errors? */ break; } } static void mac_contentclick(WindowPtr window, EventRecord *event) { short item; DialogRef dialog; switch (mac_windowtype(window)) { case wAbout: dialog = GetDialogFromWindow(window); if (DialogSelect(event, &dialog, &item)) switch (item) { case wiAboutLicence: mac_openlicence(); break; } break; } } static void mac_growwindow(WindowPtr window, EventRecord *event) { switch (mac_windowtype(window)) { } } static void mac_activatewindow(WindowPtr window, EventRecord *event) { int active; active = (event->modifiers & activeFlag) != 0; mac_adjustmenus(); switch (mac_windowtype(window)) { case wAbout: mac_activateabout(window, event); break; } } static void mac_activateabout(WindowPtr window, EventRecord *event) { DialogRef dialog; DialogItemType itemtype; Handle itemhandle; short item; Rect itemrect; int active; dialog = GetDialogFromWindow(window); active = (event->modifiers & activeFlag) != 0; GetDialogItem(dialog, wiAboutLicence, &itemtype, &itemhandle, &itemrect); HiliteControl((ControlHandle)itemhandle, active ? 0 : 255); DialogSelect(event, &dialog, &item); } static void mac_updatewindow(WindowPtr window) { #if TARGET_API_MAC_CARBON RgnHandle rgn; #endif switch (mac_windowtype(window)) { case wAbout: BeginUpdate(window); #if TARGET_API_MAC_CARBON rgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(window), rgn); UpdateDialog(GetDialogFromWindow(window), rgn); DisposeRgn(rgn); #else UpdateDialog(window, window->visRgn); #endif EndUpdate(window); break; case wLicence: mac_updatelicence(window); break; } } static void mac_updatelicence(WindowPtr window) { Handle h; int len; long fondsize; Rect textrect; SetPort((GrafPtr)GetWindowPort(window)); BeginUpdate(window); fondsize = GetScriptVariable(smRoman, smScriptSmallFondSize); TextFont(HiWord(fondsize)); TextSize(LoWord(fondsize)); h = Get1Resource('TEXT', wLicence); len = GetResourceSizeOnDisk(h); #if TARGET_API_MAC_CARBON GetPortBounds(GetWindowPort(window), &textrect); #else textrect = window->portRect; #endif if (h != NULL) { HLock(h); TETextBox(*h, len, &textrect, teFlushDefault); HUnlock(h); } EndUpdate(window); } /* * Work out what kind of window we're dealing with. */ static int mac_windowtype(WindowPtr window) { #if !TARGET_API_MAC_CARBON if (GetWindowKind(window) < 0) return wDA; #endif return ((WinInfo *)GetWRefCon(window))->wtype; } /* * Handle a key press */ static void mac_keypress(EventRecord *event) { WindowPtr window; window = FrontWindow(); if (event->what == keyDown && (event->modifiers & cmdKey)) { mac_adjustmenus(); mac_menucommand(MenuKey(event->message & charCodeMask)); } else { switch (mac_windowtype(window)) { } } } static void mac_menucommand(long result) { short menu, item; WindowPtr window; #if !TARGET_API_MAC_CARBON Str255 da; #endif menu = HiWord(result); item = LoWord(result); window = FrontWindow(); /* Things which do the same whatever window we're in. */ switch (menu) { case mApple: switch (item) { case iAbout: mac_openabout(); goto done; #if !TARGET_API_MAC_CARBON default: GetMenuItemText(GetMenuHandle(mApple), item, da); OpenDeskAcc(da); goto done; #endif } break; case mFile: switch (item) { case iClose: mac_closewindow(window); goto done; case iQuit: cleanup_exit(0); goto done; } break; } /* If we get here, handling is up to window-specific code. */ switch (mac_windowtype(window)) { } done: HiliteMenu(0); } static void mac_openabout(void) { DialogItemType itemtype; Handle item; VersRecHndl vers; Rect box; StringPtr longvers; WinInfo *wi; if (windows.about) SelectWindow(windows.about); else { windows.about = GetDialogWindow(GetNewDialog(wAbout, NULL, (WindowPtr)-1)); wi = smalloc(sizeof(*wi)); wi->s = NULL; wi->wtype = wAbout; SetWRefCon(windows.about, (long)wi); vers = (VersRecHndl)Get1Resource('vers', 1); if (vers != NULL && *vers != NULL) { longvers = (*vers)->shortVersion + (*vers)->shortVersion[0] + 1; GetDialogItem(GetDialogFromWindow(windows.about), wiAboutVersion, &itemtype, &item, &box); assert(itemtype & kStaticTextDialogItem); SetDialogItemText(item, longvers); } ShowWindow(windows.about); } } static void mac_openlicence(void) { WinInfo *wi; if (windows.licence) SelectWindow(windows.licence); else { windows.licence = GetNewWindow(wLicence, NULL, (WindowPtr)-1); wi = smalloc(sizeof(*wi)); wi->s = NULL; wi->wtype = wLicence; SetWRefCon(windows.licence, (long)wi); ShowWindow(windows.licence); } } static void mac_closewindow(WindowPtr window) { switch (mac_windowtype(window)) { #if !TARGET_API_MAC_CARBON case wDA: CloseDeskAcc(GetWindowKind(window)); break; #endif case wAbout: windows.about = NULL; DisposeDialog(GetDialogFromWindow(window)); break; case wLicence: windows.licence = NULL; DisposeWindow(window); break; } } static void mac_zoomwindow(WindowPtr window, short part) { /* FIXME: do something */ } /* * Make the menus look right before the user gets to see them. */ #if TARGET_API_MAC_CARBON #define EnableItem EnableMenuItem #define DisableItem DisableMenuItem #endif static void mac_adjustmenus(void) { WindowPtr window; MenuHandle menu; window = FrontWindow(); menu = GetMenuHandle(mApple); EnableItem(menu, 0); EnableItem(menu, iAbout); menu = GetMenuHandle(mFile); EnableItem(menu, 0); EnableItem(menu, iNew); if (window != NULL) EnableItem(menu, iClose); else DisableItem(menu, iClose); EnableItem(menu, iQuit); switch (mac_windowtype(window)) { default: DisableItem(menu, iSave); DisableItem(menu, iSaveAs); menu = GetMenuHandle(mEdit); DisableItem(menu, 0); menu = GetMenuHandle(mWindow); DisableItem(menu, 0); /* Until we get more than 1 item on it. */ break; } DrawMenuBar(); } /* * Make sure the right cursor's being displayed. */ static void mac_adjustcursor(RgnHandle cursrgn) { Point mouse; WindowPtr window, front; short part; #if TARGET_API_MAC_CARBON Cursor arrow; RgnHandle visrgn; #endif GetMouse(&mouse); LocalToGlobal(&mouse); part = FindWindow(mouse, &window); front = FrontWindow(); if (part != inContent || window == NULL || window != front) { /* Cursor isn't in the front window, so switch to arrow */ #if TARGET_API_MAC_CARBON GetQDGlobalsArrow(&arrow); SetCursor(&arrow); #else SetCursor(&qd.arrow); #endif SetRectRgn(cursrgn, SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX); if (front != NULL) { #if TARGET_API_MAC_CARBON visrgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(front), visrgn); DiffRgn(cursrgn, visrgn, cursrgn); DisposeRgn(visrgn); #else DiffRgn(cursrgn, front->visRgn, cursrgn); #endif } } else { switch (mac_windowtype(window)) { default: #if TARGET_API_MAC_CARBON GetQDGlobalsArrow(&arrow); SetCursor(&arrow); GetPortVisibleRegion(GetWindowPort(window), cursrgn); #else SetCursor(&qd.arrow); CopyRgn(window->visRgn, cursrgn); #endif break; } } } pascal OSErr mac_aevt_quit(const AppleEvent *req, AppleEvent *reply, long refcon) { DescType type; Size size; if (AEGetAttributePtr(req, keyMissedKeywordAttr, typeWildCard, &type, NULL, 0, &size) == noErr) return errAEParamMissed; borednow = 1; return noErr; } void cleanup_exit(int status) { #if !TARGET_RT_MAC_CFM if (mac_gestalts.encvvers != 0) TerminateUnicodeConverter(); #endif exit(status); } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/macpgen.r Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 12817 Text-content-md5: de6c2d171292a5ddd7fd5b0ad4cf6ca9 Text-content-sha1: dd60c6237f3eb1acc0de5b656c4a2f2906d6ecfc Content-length: 12933 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN/* $Id: macpgen.r,v 1.1 2003/02/12 23:53:15 ben Exp $ */ /* * Copyright (c) 1999, 2002 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* PuTTYgen resources */ /* * The space after the # for system includes is to stop mkfiles.pl * trying to chase them (Rez doesn't support the angle-bracket * syntax). */ # include "Types.r" # include "Dialogs.r" # include "Palettes.r" # include "Script.r" /* Get resource IDs we share with C code */ #include "macpgrid.h" #include "version.r" /* * Finder-related resources */ /* 'pGen' is now registered with Apple as PuTTYgen's signature */ type 'pGen' as 'STR '; resource 'pGen' (0, purgeable) { "PuTTYgen experimental Mac port" }; resource 'SIZE' (-1) { reserved, ignoreSuspendResumeEvents, reserved, canBackground, needsActivateOnFGSwitch, backgroundAndForeground, dontGetFrontClicks, ignoreAppDiedEvents, is32BitCompatible, isHighLevelEventAware, localandRemoteHLEvents, isStationeryAware, dontUseTextEditServices, reserved, reserved, reserved, 1024 * 1024, /* Minimum size */ 1024 * 1024, /* Preferred size */ }; #define FREF_APPL 128 #define FREF_Seed 132 resource 'FREF' (FREF_APPL, purgeable) { /* The application itself */ 'APPL', FREF_APPL, "" }; resource 'FREF' (FREF_Seed, purgeable) { /* Random seed */ 'Seed', FREF_Seed, "" }; /* "Internal" file types, which can't be opened */ resource 'BNDL' (129, purgeable) { 'pTTI', 0, { 'ICN#', { FREF_Seed, FREF_Seed, }, 'FREF', { FREF_Seed, FREF_Seed, }; }; }; resource 'kind' (129) { 'pTTI', verBritain, { 'Seed', "PuTTY random number seed", } }; /* Icons, courtesy of DeRez */ /* Random seed icon */ resource 'ICN#' (FREF_Seed, purgeable) { { /* array: 2 elements */ /* [1] */ $"1FFFFC00 18F36600 161EF500 1CC92C80" $"1CF2EC40 10662C20 108E07F0 151F0490" $"1E00C4F0 1803BBD0 1FC5BE10 108B5A90" $"1B3C4F50 1267AC90 14B60470 1BB791B0" $"17F4D2B0 1DC1F830 1B029450 1B753DD0" $"145A8170 11390DD0 1E15A8B0 1CC4CD90" $"154ECED0 15C9CF30 172CDB50 12617970" $"15E45C90 1D4B9890 15CE4430 1FFFFFF0", /* [2] */ $"1FFFFC00 1FFFFE00 1FFFFF00 1FFFFF80" $"1FFFFFC0 1FFFFFE0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" $"1FFFFFF0 1FFFFFF0 1FFFFFF0 1FFFFFF0" } }; resource 'icl4' (FREF_Seed) { $"000FFFFFFFFFFFFFFFFFFF0000000000" $"000FFC0CFFFF0CFF1FFC0FF000000000" $"000F0FF0C0CFFFF1FFFFCFCF00000000" $"000FFF0CFF0CF11F0CFCFFCCF0000000" $"000FFFC0FFFF11F0FFF0FFCCCF000000" $"000F0C0C0FF11FFC0CFCFFCCCCF00000" $"000FC0C0F111FFF0C0C0CFFFFFFF0000" $"000F0F0F111FFFFF0C0C0F0CFC0F0000" $"000FFFF111111111FFC0CFC0FFFF0000" $"000FF111111111FFFCFFF0FFFF0F0000" $"000FFFFFFF111FCFF0FFFFF0C0CF0000" $"000F0C0CF111FCFF0F0FFCFCFC0F0000" $"000FF0FF11FFFFC0CFC0FFFFCFCF0000" $"000F0CF11FFC0FFFFCFCFF0CFC0F0000" $"000FCF11F0FFCFF0C0C0CFC0CFFF0000" $"000FF1FFFCFF0FFFFC0F0C0FFCFF0000" $"000F1FFFFFFFCFC0FFCFC0F0F0FF0000" $"000FFF0FFF0C0C0FFFFFFC0C0CFF0000" $"000FF0FFC0C0C0F0F0CF0FC0CFCF0000" $"000FFCFF0FFF0F0F0CFFFF0FFF0F0000" $"000FCFC0CF0FF0F0F0C0C0CFCFFF0000" $"000F0C0F0CFFFC0F0C0CFF0FFF0F0000" $"000FFFF0C0CFCFCFF0F0F0C0F0FF0000" $"000FFF0CFF0C0F0CFF0CFF0FFC0F0000" $"000FCFCF0FC0FFF0FFC0FFF0FFCF0000" $"000F0F0FFF0CFC0FFF0CFFFF0CFF0000" $"000FCFFFC0F0FFC0FFCFF0FFCFCF0000" $"000F0CFC0FFC0C0F0FFFFC0F0FFF0000" $"000FCFCFFFF0CFC0CFCFFFC0F0CF0000" $"000FFF0F0F0CF0FFFC0FFC0CFC0F0000" $"000FCFCFFFC0FFF0CFC0CFC0C0FF0000" $"000FFFFFFFFFFFFFFFFFFFFFFFFF" }; resource 'icl8' (FREF_Seed) { $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000" $"000000FFFFF5F5F5FFFFFFFFF5F5FFFF05FFFFF5F5FFFF000000000000000000" $"000000FFF5FFFFF5F5F5F5FFFFFFFF05FFFFFFFFF5FF2BFF0000000000000000" $"000000FFFFFFF5F5FFFFF5F5FF0505FF0000FFF5FFFF2B2BFF00000000000000" $"000000FFFFFFF5F5FFFFFFFF0505FFF5FFFFFFF5FFFF2B2B2BFF000000000000" $"000000FFF5F5F5F5F5FFFF0505FFFFF5F5F5FFF5FFFF2B2B2B2BFF0000000000" $"000000FFF5F5F5F5FF050505FFFFFFF5F5F5F5F5F5FFFFFFFFFFFFFF00000000" $"000000FFF5FFF5FF050505FFFFFFFFFFF5F5F5F5F5FFF5F5FFF5F5FF00000000" $"000000FFFFFFFF050505050505050505FFFFF5F5F5FFF5F5FFFFFFFF00000000" $"000000FFFF050505050505050505FFFFFFF5FFFFFFF5FFFFFFFFF5FF00000000" $"000000FFFFFFFFFFFFFF050505FFF5FFFFF5FFFFFFFFFFF5F5F5F5FF00000000" $"000000FFF5F5F5F5FF050505FFF5FFFFF5FFF5FFFFF5FFF5FFF5F5FF00000000" $"000000FFFFF5FFFF0505FFFFFFFFF5F5F5FFF5F5FFFFFFFFF5FFF5FF00000000" $"000000FFF5F5FF0505FFFFF5F5FFFFFFFFF5FFF5FFFFF5F5FFF5F5FF00000000" $"000000FFF5FF0505FFF5FFFFF5FFFFF5F5F5F5F5F5FFF5F5F5FFFFFF00000000" $"000000FFFF05FFFFFFF5FFFFF5FFFFFFFFF5F5FFF5F5F5FFFFF5FFFF00000000" $"000000FF05FFFFFFFFFFFFFFF5FFF5F5FFFFF5FFF5F5FFF5FFF5FFFF00000000" $"000000FFFFFFF5FFFFFFF5F5F5F5F5FFFFFFFFFFFFF5F5F5F5F5FFFF00000000" $"000000FFFFF5FFFFF5F5F5F5F5F5FF00FFF5F5FFF5FFF5F5F5FFF5FF00000000" $"000000FFFFF5FFFFF5FFFFFFF5FF00FFF5F5FFFFFFFFF5FFFFFFF5FF00000000" $"000000FFF5FFF5F5F5FFF5FFFF00FF00FFF5F5F5F5F5F5FFF5FFFFFF00000000" $"000000FFF5F5F5FFF5F5FFFFFF0000FFF5F5F5F5FFFFF5FFFFFF00FF00000000" $"000000FFFFFFFFF5F5F5F5FFF5FF00FFFFF5FFF5FFF5F5F5FF00FFFF00000000" $"000000FFFFFFF5F5FFFFF5F5F5FF0000FFFFF5F5FFFFF5FFFF0000FF00000000" $"000000FFF5FFF5FFF5FFF5F5FFFFFF00FFFFF5F5FFFFFFF5FFFF00FF00000000" $"000000FFF5FFF5FFFFFFF5F5FFF5F5FFFFFFF5F5FFFFFFFFF5F5FFFF00000000" $"000000FFF5FFFFFFF5F5FFF5FFFFF5F5FFFFF5FFFFF5FFFFF5FFF5FF00000000" $"000000FFF5F5FFF5F5FFFFF5F5F5F5FFF5FFFFFFFFF5F5FFF5FFFFFF00000000" $"000000FFF5FFF5FFFFFFFFF5F5FFF5F5F5FFF5FFFFFFF5F5FFF5F5FF00000000" $"000000FFFFFFF5FFF5FFF5F5FFF5FFFFFFF5F5FFFFF5F5F5FFF5F5FF00000000" $"000000FFF5FFF5FFFFFFF5F5FFFFFFF5F5FFF5F5F5FFF5F5F5F5FFFF00000000" $"000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" }; resource 'ics#' (FREF_Seed) { { /* array: 2 elements */ /* [1] */ $"7FE0 56B0 59A8 637C 51DC 6794 59AC 76EC" $"7224 7C6C 743C 71AC 505C 459C 4424 7FFC", /* [2] */ $"7FE0 7FF0 7FF8 7FFC 7FFC 7FFC 7FFC 7FFC" $"7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC 7FFC" } }; resource 'ics4' (FREF_Seed) { $"0FFFFFFFFFF00000" $"0F0F0FF1FCFF0000" $"0FCFF11FF0FCF000" $"0FF111FF0FFFFF00" $"0FCF111FFFCFFF00" $"0FF11FFFFC0F0F00" $"0F1FF0CFF0F0FF00" $"0FFF0FFCFFFCFF00" $"0FFFC0F0C0F0CF00" $"0FFFFF0C0FFCFF00" $"0FFFCFC0C0FFFF00" $"0FFF0C0FFCFCFF00" $"0FCFC0C0CFCFFF00" $"0F0C0F0FFC0FFF00" $"0FC0CFC0C0F0CF00" $"0FFFFFFFFFFFFF" }; resource 'ics8' (FREF_Seed) { $"00FFFFFFFFFFFFFFFFFFFF0000000000" $"00FFF5FFF5FFFF05FFF5FFFF00000000" $"00FFF5FFFF0505FFFFF5FF2BFF000000" $"00FFFF050505FFFFF5FFFFFFFFFF0000" $"00FFF5FF050505FFFFFFF5FFFFFF0000" $"00FFFF0505FFFFFFFFF5F5FFF5FF0000" $"00FF05FFFFF5F5FFFFF5FFF5FFFF0000" $"00FFFFFFF5FFFFF5FFFFFFF5FFFF0000" $"00FFFFFFF5F5FFF5F5F5FFF5F5FF0000" $"00FFFFFFFFFFF5F5F5FFFFF5FFFF0000" $"00FFFFFFF5FFF5F5F5F5FFFFFFFF0000" $"00FFFFFFF5F5F5FFFFF5FFF5FFFF0000" $"00FFF5FFF5F5F5F5F5FFF5FFFFFF0000" $"00FFF5F5F5FFF5FFFFF5F5FFFFFF0000" $"00FFF5F5F5FFF5F5F5F5FFF5F5FF0000" $"00FFFFFFFFFFFFFFFFFFFFFFFFFF" }; /* * Application-missing message string, for random seed and host key database * files. */ resource 'STR ' (-16397, purgeable) { "This file is used internally by PuTTY. It cannot be opened." }; /* * Internal resources */ /* Menu bar */ resource 'MBAR' (MBAR_Main, preload) { { mApple, mFile, mEdit, mWindow } }; resource 'MENU' (mApple, preload) { mApple, textMenuProc, 0b11111111111111111111111111111101, enabled, apple, { "About PuTTYgen\0xc9", noicon, nokey, nomark, plain, "-", noicon, nokey, nomark, plain, } }; resource 'MENU' (mFile, preload) { mFile, textMenuProc, 0b11111111111111111111111101111011, enabled, "File", { "New", noicon, "N", nomark, plain, "Open\0xc9", noicon, "O", nomark, plain, "-", noicon, nokey, nomark, plain, "Close", noicon, "W", nomark, plain, "Save", noicon, "S", nomark, plain, "Save As\0xc9", noicon, nokey, nomark, plain, "-", noicon, nokey, nomark, plain, "Quit", noicon, "Q", nomark, plain, } }; resource 'MENU' (mEdit, preload) { mEdit, textMenuProc, 0b11111111111111111111111111111101, enabled, "Edit", { "Undo", noicon, "Z", nomark, plain, "-", noicon, nokey, nomark, plain, "Cut", noicon, "X", nomark, plain, "Copy", noicon, "C", nomark, plain, "Paste", noicon, "V", nomark, plain, "Clear", noicon, nokey, nomark, plain, "Select All", noicon, "A", nomark, plain, } }; resource 'MENU' (mWindow, preload) { mWindow, textMenuProc, 0b11111111111111111111111111111111, enabled, "Window", { } }; /* Fatal error box. Stolen from the Finder. */ resource 'ALRT' (wFatal, "fatalbox", purgeable) { {54, 67, 152, 435}, wFatal, beepStages, alertPositionMainScreen }; resource 'DITL' (wFatal, "fatalbox", purgeable) { { /* array DITLarray: 3 elements */ /* [1] */ {68, 299, 88, 358}, Button { enabled, "OK" }, /* [2] */ {68, 227, 88, 286}, StaticText { disabled, "" }, /* [3] */ {7, 74, 55, 358}, StaticText { disabled, "^0" } } }; /* "About" box */ resource 'DLOG' (wAbout, "about", purgeable) { { 0, 0, 120, 240 }, noGrowDocProc, invisible, goAway, wAbout, /* RefCon -- identifies the window to PuTTY */ wAbout, /* DITL ID */ "About PuTTYgen", alertPositionMainScreen }; resource 'dlgx' (wAbout, "about", purgeable) { versionZero { kDialogFlagsUseThemeBackground | kDialogFlagsUseThemeControls } }; resource 'DITL' (wAbout, "about", purgeable) { { { 87, 13, 107, 227 }, Button { enabled, "View Licence" }, { 13, 13, 29, 227 }, StaticText { disabled, "PuTTYgen"}, { 42, 13, 74, 227 }, StaticText { disabled, "Some version or other\n" "Copyright 1997-9 Simon Tatham"}, } }; /* Licence box */ resource 'WIND' (wLicence, "licence", purgeable) { { 0, 0, 250, 400 }, noGrowDocProc, visible, goAway, wLicence, "PuTTYgen Licence", alertPositionParentWindowScreen }; type 'TEXT' { string; }; resource 'TEXT' (wLicence, "licence", purgeable) { "Copyright 1997-2003 Simon Tatham.\n" "\n" "Portions copyright Robert de Bath, Joris van Rantwijk, Delian" "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry," "Justin Bradford, Ben Harris, and CORE SDI S.A.\n" "\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy of this software and associated documentation " "files (the \"Software\"), to deal in the Software without " "restriction, including without limitation the rights to use, " "copy, modify, merge, publish, distribute, sublicense, and/or " "sell copies of the Software, and to permit persons to whom the " "Software is furnished to do so, subject to the following " "conditions:\n\n" "The above copyright notice and this permission notice shall be " "included in all copies or substantial portions of the Software.\n\n" "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, " "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF " "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND " "NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR " "ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF " "CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN " "CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE " "SOFTWARE." }; Node-path: putty/mac/macpgrid.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 883 Text-content-md5: 74fec6af26e22b51f0a94e737578558f Text-content-sha1: 5ae6d6d746b9fbd8601691e5740054843016b8b0 Content-length: 999 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNeee/* $Id: macpgrid.h,v 1.1 2003/02/12 23:53:15 ben Exp $ */ /* * macpgrid.h -- Mac resource IDs for PuTTYgen * * This file is shared by C and Rez source files */ /* Menu bar IDs */ #define MBAR_Main 128 /* Menu IDs */ #define mApple 128 #define mFile 129 #define mEdit 130 #define mWindow 131 /* Menu Items */ /* Apple menu */ #define iAbout 1 /* File menu */ #define iNew 1 #define iOpen 2 #define iClose 4 #define iSave 5 #define iSaveAs 6 #define iQuit 8 /* Edit menu */ #define iUndo 1 #define iCut 3 #define iCopy 4 #define iPaste 5 #define iClear 6 #define iSelectAll 7 /* Window menu */ /* Window types (and resource IDs) */ #define wNone 0 /* Dummy value for no window */ #define wDA 1 /* Dummy value for desk accessory */ #define wFatal 128 #define wAbout 129 #define wiAboutLicence 1 #define wiAboutVersion 3 #define wLicence 131 Revision-number: 2843 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2003-02-13T12:30:10.000000Z K 7 svn:log V 100 Move the 'vers' resources for Mac OS into their own file, to be shared by the various applications. K 10 svn:author V 3 ben PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a8cbcd29c2b0f0b7501145c7f9d92657 Text-delta-base-sha1: d6b854946510fdfd428ef0a34b6bd007864b7859 Text-content-length: 28 Text-content-md5: a38af5cbc30a7ba87201f5eed93894f2 Text-content-sha1: 8e81b657845dfd977f156257b6c8c97b42d1edaa Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNvv 4;;version Node-path: putty/mac/version.r Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 965 Text-content-md5: 7e6e4a1b83afe73b036647c658ea0c47 Text-content-sha1: c5b874c8e0c5e599a3a3b9c3a8de278c0f4aa840 Content-length: 1081 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN777/* * Current PuTTY version number. Minor is in BCD */ #define VERSION_MAJOR 0x00 #define VERSION_MINOR 0x53 resource 'vers' (1, purgeable) { #ifdef RELEASE VERSION_MAJOR, VERSION_MINOR, beta, #else VERSION_MAJOR, VERSION_MINOR + 1, development, #endif 0, /* No prerelease version */ verBritain, #ifdef RELEASESTR RELEASESTR, "Release " RELEASESTR, #else #ifdef SNAPSHOTSTR SNAPSHOTSTR, "Development snapshot " SNAPSHOTSTR, #else "unknown", "Unidentified build, " $$Date " " $$Time, #endif #endif }; resource 'vers' (2, purgeable) { #ifdef RELEASE VERSION_MAJOR, VERSION_MINOR, beta, #else VERSION_MAJOR, VERSION_MINOR + 1, development, #endif 0, /* No prerelease version */ verBritain, #ifdef RELEASESTR RELEASESTR, "PuTTY " RELEASESTR, #else #ifdef SNAPSHOTSTR SNAPSHOTSTR, "PuTTY snapshot " SNAPSHOTSTR, #else "unknown", "PuTTY", #endif #endif }; Revision-number: 2844 Prop-content-length: 124 Content-length: 124 K 7 svn:log V 24 Add obvious workaround. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-13T14:59:39.000000Z PROPS-END Node-path: putty-wishlist/data/win-command-prompt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 23472b0f0d6685a4b815af5020169597 Text-delta-base-sha1: 33f2822029ae95b227a2ce3b0921b692dd9228a8 Text-content-length: 103 Text-content-md5: d8f46175079ad65e347b2cf6c0e57007 Text-content-sha1: 56896e91a346752afe9fff632cc4f47008613110 Content-length: 142 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNB SBS@

    A workaround is of course to run an SSH (or telnet) server on your Windows box Revision-number: 2845 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2003-02-13T21:55:53.000000Z K 7 svn:log V 74 Summary: Perhaps triple-click select should take account of wrapped lines K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/triple-click-wrap Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1079 Text-content-md5: bb40880e72dc001658973e7539d01263 Text-content-sha1: 7d218c08a51936c24f80c6e145472399b9d65097 Content-length: 1195 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN)))Summary: Perhaps triple-click select should take account of wrapped lines Class: wish Difficulty: fun Priority: low > But: while copying a word (double clicking) just at the wrapping edge > really selects the complete wrapped word, copying a whole line (triple > clicking) only selects a screen line and omits the part wrapped to next > screen line ... Hmm. I'd call that a semi-bug at worst -- I don't think there's any pressing need for the triple-click selection to be a superset of the double-click selection. (When I ask for full lines that's what I want, so I wouldn't want the end of a wrapped word tacked on -- not that you were suggesting that.) However, the closest we have to a spec is xterm, and the xterm I have[1] will select multiple lines at once when wrapped, preserving the superset property. (I.e., if I have something wrapped over three physical lines, the triple-click mode will select either all three lines, or none of them.) Personally I'm not sure I have a strong opinion either way. [1] RH XFree86 4.0.3-5, from Red Hat Linux 7.1 Revision-number: 2846 Prop-content-length: 318 Content-length: 318 K 8 svn:date V 27 2003-02-13T23:04:58.000000Z K 7 svn:log V 217 Based on random Googling: it appears that ssh.com use keyboard-interactive for SecurID in more recent versions. (Not actually verified this myself, of course.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/securid Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e707386551508219b95d6e4cea98c64a Text-delta-base-sha1: 69767e8c6eeac6b4a75356db89943d3c896fdf9c Text-content-length: 373 Text-content-md5: c0931c0f856d1de3aafcfb6ff869aca3 Text-content-sha1: d5d8a2367ac35fe9d02b49a6386f6456ab5d8579 Content-length: 412 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN=Zay'$Summary: ssh.com SecurID authentication (`securid-1@ssh.com')While older versions of ssh.com's server used a private authentication method `securid-1@ssh.com', it appears that more recent versions use `keyboard-interactive', for which PuTTY does have support.

    We haven't seen a spec for the private method, so can't implement it in PuTTY. Revision-number: 2847 Prop-content-length: 138 Content-length: 138 K 7 svn:log V 40 Make various internal functions static. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-15T13:29:26.000000Z PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cb344328dfe8c6ebb705abcdbb3e0fdb Text-delta-base-sha1: b40d803288310f70b7e51c21376c14552c0b494b Text-content-length: 146 Text-content-md5: 73f0b0e68833459b51b58edc51e47e67 Text-content-sha1: a211feb6680b60ab0e1d0c0d7e9170f53cb915d4 Content-length: 186 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN0+Z]G-Xb$exstatic int ber_read_id_len(void *source, int sourcelen, static static atic atic static Revision-number: 2848 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2003-02-15T14:20:04.000000Z K 7 svn:log V 65 seems to want . Silly thing. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 127bb97972b89f81507b52d53f21e6dd Text-delta-base-sha1: c94fb4e86ae53074d5e560352a63f09a718a8113 Text-content-length: 68 Text-content-md5: 92b88e5a59d76b3b4a17bfd5658e1d96 Text-content-sha1: ebd0d9c27a130aa17a52af651c2497a924f9bbb5 Content-length: 107 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN*e 01yFiles.h> /* Needed by OpenTransportInternet.h */ Revision-number: 2849 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 66 Tiny amount of infrastructure for having actual keys in PuTTYgen. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-15T14:20:43.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 84fedd5af0dbda5abee53e43981aa28f Text-delta-base-sha1: 896b6422eaad11e297a57c20a702fa237508884b Text-content-length: 26 Text-content-md5: bb3252133f67f35253a5fed6de7651e7 Text-content-sha1: b02f387b45b1f81235f0a4e57184c5794f133d68 Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNOY O macpgkey Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 01f9ea08780f06d50022df84fbf1f94f Text-delta-base-sha1: 95d5456d65a92f0a9fc51b81afe8ff4c46486d73 Text-content-length: 309 Text-content-md5: 396700470cb5fa098dc6cd5f4e13e003 Text-content-sha1: 7ee959ffc24adbb090f3b1f74e382e534d57db63 Content-length: 349 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN,G]Q]6Z" /* Only used in PuTTY */ struct KeyState *ks; /* Only used in PuTTYgen */PuTTYgen per-window state */ typedef struct KeyState { DialogPtr box; } KeyState; #define mac_windowkey(w) (((WinInfo *)GetWRefCon(w))->ks)from macpgkey.c */ extern void mac_newkey(void Node-path: putty/mac/macpgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 88f84b66837394ec8b56a3eb5cbfee80 Text-delta-base-sha1: 3bc972f7b7d65c26d1514291cfbba71c2accbfd9 Text-content-length: 124 Text-content-md5: 9b13bae13baff8a4e9d506ee06ebbbd6 Text-content-sha1: d39ec6f14d88a6973ec97bed62d396c0857439d7 Content-length: 163 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNv*^?+zjc/* $Id: macpgen.c,v 1.2 2003/02/15 14:20:43gen case iNew: mac_newkey(); goto done; Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: de6c2d171292a5ddd7fd5b0ad4cf6ca9 Text-delta-base-sha1: dd60c6237f3eb1acc0de5b656c4a2f2906d6ecfc Text-content-length: 410 Text-content-md5: e2ee416a644bb6f1091f364cf36365a3 Text-content-sha1: 5867711b09d69d4a7fda76f1515a968a4e1a8797 Content-length: 449 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN|tm+-l2=H}?/* $Id: macpgen.r,v 1.2 2003/02/15 14:20:43/* Missing-application name string, for private keys. */ /* XXX Private keys should eventually be owned by Pageant */ resource 'STR ' (-16396, purgeable) { "PuTTYgen" }; /* Key box */ resource 'DLOG' (wKey, "keyuntitled", staggerParentWindowScreen }; resource 'dlgx' (wKey, "keyKey, "key", purgeable) { { } }; Node-path: putty/mac/macpgrid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 74fec6af26e22b51f0a94e737578558f Text-delta-base-sha1: 5ae6d6d746b9fbd8601691e5740054843016b8b0 Text-content-length: 79 Text-content-md5: a9764bf829f56db15cb20b743fd7d1b0 Text-content-sha1: 456724f7ec45cacbc8e74aec1a15c512f785c159 Content-length: 118 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNew>9,/* $Id: macpgrid.h,v 1.2 2003/02/15 14:20:43#define wKey 134 Revision-number: 2850 Prop-content-length: 421 Content-length: 421 K 8 svn:date V 27 2003-02-15T16:22:15.000000Z K 7 svn:log V 322 Rather than increasing the size of my switch statements yet further, have a bunch of function pointers associated with each window to do things like updates and click handling. This is all looking disturbingly object-oriented. . While I'm here, separate out the about box into its own file, shared by PuTTY and PuTTYgen. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 01d750582b2fff384a726469f72ba2a4 Text-delta-base-sha1: fe0357262d07d1d77ec695665803239a5b4faaff Text-content-length: 1190 Text-content-md5: 06caf3272be0442bb6faa45f08f7a16b Text-content-sha1: 8fcd2ef3ad8dfe919c71d2f77293997d2a17fad5 Content-length: 1230 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNWPKMTN{}~H8}'OVFZuAT;fp{:sy^,A/* $Id: mac.c,v 1.49 2003/02/15 16:22:15 ben Exp $ */ /* * Copyright (c) 1999, 2003 { if (mac_wininfo(window)->click != NULL) (*mac_wininfo(window)->click)(window, event); } static void mac_growwindow(WindowPtr window, EventRecord *event) { if (mac_wininfo(window)->grow != NULL) (*mac_wininfo(window)->grow)(window, event); { mac_adjustmenus(); if (mac_wininfo(window)->activate != NULL) (*mac_wininfo(window)->activate)(window, event); } static void mac_updatewindow(WindowPtr window) { if (mac_wininfo(window)->update != NULL) (*mac_wininfo(window)->update)if (mac_wininfo(window)->key != NULL) (*mac_wininfo(window)->key)(window, event);if (mac_wininfo(window)->menu != NULL) (*mac_wininfo(window)->menu)(window, menu, item); done: HiliteMenu(0);default: if (mac_wininfo(window)->close != NULL) (*mac_wininfo(window)->close)if (mac_wininfo(window)->adjustmenus != NULL) (*mac_wininfo(window)->adjustmenus)(window); else {if (mac_wininfo(window)->adjustcursor != NULL) (*mac_wininfo(window)->adjustcursor)(window, mouse, cursrgn); else { Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 396700470cb5fa098dc6cd5f4e13e003 Text-delta-base-sha1: 7ee959ffc24adbb090f3b1f74e382e534d57db63 Text-content-length: 608 Text-content-md5: 461b0b23107c61d027a405097f75496a Text-content-sha1: 7bceb22cdf40e8e594f8d9eab5619773f4fd6466 Content-length: 648 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNG>7/OI-^;DVq void (*activate) (WindowPtr, EventRecord *); void (*adjustcursor)(WindowPtr, Point, RgnHandle); void (*adjustmenus) (WindowPtr); void (*update) (WindowPtr); void (*click) (WindowPtr, EventRecord *); void (*grow) (WindowPtr, EventRecord *); void (*key) (WindowPtr, EventRecord *); void (*menu) (WindowPtr, short, short); void (*close) (WindowPtr); int wtype; } WinInfo; #define mac_wininfo(w) ((WinInfo *)GetWRefCon(w))/* from maceventlog.c */ extern void mac_freeeventlog(Session *about.c */ extern void mac_openabout(void Node-path: putty/mac/macabout.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4614 Text-content-md5: e1c2b32447ae6c862383c8c168d58746 Text-content-sha1: cf63e5e5e3c6b51d9a8e14c11f3abb375cb01f11 Content-length: 4730 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNxxx/* $Id: macabout.c,v 1.1 2003/02/15 16:22:15 ben Exp $ */ /* * Copyright (c) 1999, 2002, 2003 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include #include #include #include #include #include #include #include #include "putty.h" #include "mac.h" #include "macresid.h" static struct mac_windows { WindowPtr about; WindowPtr licence; } windows; static void mac_openlicence(void); static void mac_clickabout(WindowPtr window, EventRecord *event) { short item; DialogRef dialog; dialog = GetDialogFromWindow(window); if (DialogSelect(event, &dialog, &item)) switch (item) { case wiAboutLicence: mac_openlicence(); break; } } static void mac_activateabout(WindowPtr window, EventRecord *event) { DialogRef dialog; DialogItemType itemtype; Handle itemhandle; short item; Rect itemrect; int active; dialog = GetDialogFromWindow(window); active = (event->modifiers & activeFlag) != 0; GetDialogItem(dialog, wiAboutLicence, &itemtype, &itemhandle, &itemrect); HiliteControl((ControlHandle)itemhandle, active ? 0 : 255); DialogSelect(event, &dialog, &item); } static void mac_updateabout(WindowPtr window) { #if TARGET_API_MAC_CARBON RgnHandle rgn; #endif BeginUpdate(window); #if TARGET_API_MAC_CARBON rgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(window), rgn); UpdateDialog(GetDialogFromWindow(window), rgn); DisposeRgn(rgn); #else UpdateDialog(window, window->visRgn); #endif EndUpdate(window); } static void mac_updatelicence(WindowPtr window) { Handle h; int len; long fondsize; Rect textrect; SetPort((GrafPtr)GetWindowPort(window)); BeginUpdate(window); fondsize = GetScriptVariable(smRoman, smScriptSmallFondSize); TextFont(HiWord(fondsize)); TextSize(LoWord(fondsize)); h = Get1Resource('TEXT', wLicence); len = GetResourceSizeOnDisk(h); #if TARGET_API_MAC_CARBON GetPortBounds(GetWindowPort(window), &textrect); #else textrect = window->portRect; #endif if (h != NULL) { HLock(h); TETextBox(*h, len, &textrect, teFlushDefault); HUnlock(h); } EndUpdate(window); } void mac_openabout(void) { DialogItemType itemtype; Handle item; VersRecHndl vers; Rect box; StringPtr longvers; WinInfo *wi; if (windows.about) SelectWindow(windows.about); else { windows.about = GetDialogWindow(GetNewDialog(wAbout, NULL, (WindowPtr)-1)); wi = smalloc(sizeof(*wi)); memset(wi, 0, sizeof(*wi)); wi->wtype = wAbout; wi->update = &mac_updateabout; wi->click = &mac_clickabout; wi->activate = &mac_activateabout; SetWRefCon(windows.about, (long)wi); vers = (VersRecHndl)Get1Resource('vers', 1); if (vers != NULL && *vers != NULL) { longvers = (*vers)->shortVersion + (*vers)->shortVersion[0] + 1; GetDialogItem(GetDialogFromWindow(windows.about), wiAboutVersion, &itemtype, &item, &box); assert(itemtype & kStaticTextDialogItem); SetDialogItemText(item, longvers); } ShowWindow(windows.about); } } static void mac_openlicence(void) { WinInfo *wi; if (windows.licence) SelectWindow(windows.licence); else { windows.licence = GetNewWindow(wLicence, NULL, (WindowPtr)-1); wi = smalloc(sizeof(*wi)); memset(wi, 0, sizeof(*wi)); wi->wtype = wLicence; wi->update = &mac_updatelicence; SetWRefCon(windows.licence, (long)wi); ShowWindow(windows.licence); } } Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9e631c6e2749da9f84b65c33181475a3 Text-delta-base-sha1: 63546e92369e28512d482d8b31677419f2940cbb Text-content-length: 1415 Text-content-md5: d5eba178e9f0f786cb3d9d5065968488 Text-content-sha1: cb17a0e7882b98ad53f0fad7a17c491626e3108b Content-length: 1455 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN4(Sf+x; xtFlF2@t/* $Id: macdlg.c,v 1.12 2003/02/15 16:22:15static void mac_clickdlg(WindowPtr, EventRecord *); static void mac_activatedlg(WindowPtr, EventRecord *); static void mac_updatedlg(WindowPtr); static void mac_adjustdlgmenus(WindowPtr); void mac_newsession(void) { Session *s; WinInfo *wiwi = smalloc(sizeof(*wi)); memset(wi, 0, sizeof(*wi)); wi->s = s; wi->wtype = wSettings; wi->update = &mac_updatedlg; wi->click = &mac_clickdlg; wi->activate = &mac_activatedlg; wi->adjustmenus = &mac_adjustdlgmenus; SetWRefCon(s->settings_window, (long)wistatic static static void mac_updatedlg(WindowPtr window) { #if TARGET_API_MAC_CARBON RgnHandle rgn; #endif BeginUpdate(window); #if TARGET_API_MAC_CARBON rgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(window), rgn); UpdateDialog(GetDialogFromWindow(window), rgn); DisposeRgn(rgn); #else UpdateDialog(window, window->visRgn); #endif EndUpdate(window); } #if TARGET_API_MAC_CARBON #define EnableItem EnableMenuItem #define DisableItem DisableMenuItem #endif static void mac_adjustdlgmenus(WindowPtr window) { MenuHandle menu; menu = GetMenuHandle(mFile); DisableItem(menu, iSave); /* XXX enable if modified */ EnableItem(menu, iSaveAs); EnableItem(menu, iDuplicate); menu = GetMenuHandle(mEdit); DisableItem(menu, 0); Node-path: putty/mac/macevlog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4a360796dd8a337fe7243ec685786bdb Text-delta-base-sha1: a4f33542175262dc14f66efabe97a6604bed8863 Text-content-length: 582 Text-content-md5: 5367cde802ead3cf8094c1c6648a31ad Text-content-sha1: 9e74c15812810efabf5191b9d9a302da8bc097a3 Content-length: 621 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNp. ^,UwX+ aU9a|t|/* $Id: macevlog.c,v 1.2 2003/02/15 16:22:15static void mac_clickeventlog(WindowPtr, EventRecord *); static void mac_activateeventlog(WindowPtr, EventRecord *); static void mac_groweventlog(WindowPtr, EventRecord *); static void mac_updateeventlog(WindowPtrmemset(wi, 0, sizeof(*wi)); wi->s = s; wi->wtype = wEventLog; wi->click = &mac_clickeventlog; wi->activate = &mac_activateeventlog; wi->grow = &mac_groweventlog; wi->update = &mac_updateeventlstatic void mac_growstatic void mac_activatestatic Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1b19bcffec9bc218639cb59786b617e0 Text-delta-base-sha1: 7dac49b523a8928ad6b37a4a04bc4eebc379abe8 Text-content-length: 1762 Text-content-md5: a04544589f45de55a66fb19462820a3b Text-content-sha1: 7836e44aa7c832efc6c91b7857fb19760b56fd56 Content-length: 1802 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVNEZAd,<y ~*;H/(4X(UUC_f@-~;,hiE ?W$[!s}qb?g['WY h[sKOk>/* $Id: macterm.c,v 1.71 2003/02/15 16:22:15static void mac_activateterm(WindowPtr, EventRecord *); static void mac_adjusttermcursor(WindowPtr, Point, RgnHandle); static void mac_adjusttermmenus(WindowPtr); static void mac_updateterm(WindowPtr); static void mac_clickterm(WindowPtr, EventRecord *); static void mac_growterm(WindowPtr, EventRecord *); static void mac_keyterm(WindowPtr, EventRecord *); static void mac_menuterm(WindowPtr, short, short); static void mac_closeterm(WindowPtrmemset(wi, 0, sizeof(*wi)); wi->s = s; wi->wtype = wTerminal; wi->activate = &mac_activateterm; wi->adjustcursor = &mac_adjusttermcursor; wi->adjustmenus = &mac_adjusttermmenus; wi->update = &mac_updateterm; wi->click = &mac_clickterm; wi->grow = &mac_growterm; wi->key = &mac_keyterm; wi->menu = &mac_menuterm; wi->close = &mac_closeterm static void mac_adjusttermcursor(WindowPtr window, Point mouse, RgnHandle cursrgn) static void mac_adjusttermmenus(WindowPtr window) static void mac_menuterm(WindowPtr window, short menu, short item) static void mac_clickterm(WindowPtr window, EventRecord *event) static void mac_keyterm(WindowPtr window, EventRecord *event) static void mac_growterm(WindowPtr window, EventRecord *event) static void mac_activateterm(WindowPtr window, EventRecord *event) { Session *s; Boolean active = (event->modifiers & activeFlag) != 0static void mac_updateterm(WindowPtr window) { } /* * Presumably this does something in Windows */ void post_paint(Session *s) Revision-number: 2851 Prop-content-length: 245 Content-length: 245 K 8 svn:date V 27 2003-02-15T18:46:35.000000Z K 7 svn:log V 144 Modified text to reflect the fact that the wishlist now shows bugs fixed recently (FSVO "recently"). Hopefully I haven't made it too confusing. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d9c2f8402651168b2d708f89206b09ab Text-delta-base-sha1: 01e5d1ce9edcc64defc52bc6442cffa5d63de1dc Text-content-length: 785 Text-content-md5: a5cf109a14ceddcb849ae4691603040b Text-content-sha1: 5c0512ac88e6f0bb2174bd701a768209d487428f Content-length: 825 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN'S4QBpBjo4YO`dSDr+I@g#! /usr/bin/perl # $Id: bugs2html,v 1.21 2003/02/15 18:46:35 jacobe `pending' list represents things that have not been done to the current development code; items marked as `fixed' may not yet be in the latest release.

    If you do not see a feature here, it's alsoit might already have been added. EOF nest(<Recently fixed

    These are items we believe we have already addressed. See also the Changes pagepending">Pending

    These are bugs still be be fixed and features remaining to be implemented. EOF nest(<BugsSemi-bugsWishlistNon-wish list In detail, we should use PRINTER_INFO_4 where possible, rather than PRINTER_INFO_1 which apparently calls OpenPrinter() for every printer. However, _4 is only available on NT-class systems; the suggestion is that we detect the Windows version and use _5 on 95-class systems - Usenet corroborates this approach. (We're already avoiding _5 on NT because we had problems enumerating network printers.) Yuk. Revision-number: 2854 Prop-content-length: 231 Content-length: 231 K 8 svn:date V 27 2003-02-16T13:03:12.000000Z K 7 svn:log V 132 Stub code for handling key windows in PuTTYgen. This file will eventually include all the stuff that does actual work in PuTTYgen. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macpgkey.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1751 Text-content-md5: 9eebf01441ad0e7d8171027d0c5d0523 Text-content-sha1: 3436fb2c792424987a4e17cb9899175a72e7f1af Content-length: 1867 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNIII/* $Id: macpgkey.c,v 1.1 2003/02/16 13:03:12 ben Exp $ */ /* * Copyright (c) 2003 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* Stuff to handle the key window in PuTTYgen */ #include #include #include #include "putty.h" #include "mac.h" #include "macpgrid.h" void mac_newkey(void) { KeyState *ks; WinInfo *wi; ks = smalloc(sizeof(*ks)); ks->box = GetNewDialog(wKey, NULL, (WindowPtr)-1); wi = smalloc(sizeof(*wi)); memset(wi, 0, sizeof(*wi)); wi->ks = ks; wi->wtype = wKey; SetWRefCon(ks->box, (long)wi); ShowWindow(ks->box); } /* * Local Variables: * c-file-style: "simon" * End: */ Revision-number: 2855 Prop-content-length: 123 Content-length: 123 K 7 svn:log V 25 Actually use macabout.c. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-16T13:03:33.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bb3252133f67f35253a5fed6de7651e7 Text-delta-base-sha1: b02f387b45b1f81235f0a4e57184c5794f133d68 Text-content-length: 30 Text-content-md5: 83593fe09259d2a93fa47b62d212dbc2 Text-content-sha1: 80fdcad0915e2baca514851517eb56daf92c265b Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNYb 9 9 macabout Revision-number: 2856 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2003-02-16T13:44:18.000000Z K 7 svn:log V 65 Make it possible to close the "about" and "licence" boxes again. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macabout.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e1c2b32447ae6c862383c8c168d58746 Text-delta-base-sha1: cf63e5e5e3c6b51d9a8e14c11f3abb375cb01f11 Text-content-length: 326 Text-content-md5: c0dff6b62689895ea0d462804f816226 Text-content-sha1: d9632454b7c5a5c0363891c1e99675a228b34e1d Content-length: 365 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNxb,gx_gsYQY/* $Id: macabout.c,v 1.2 2003/02/16 13:44:18closeabout(WindowPtr window) { windows.about = NULL; DisposeDialog(GetDialogFromWindow(window)static void mac_closelicence(WindowPtr window) { windows.licence = NULL; DisposeWindowwi->close = &mac_closwi->close = &mac_clos Revision-number: 2857 Prop-content-length: 228 Content-length: 228 K 7 svn:log V 129 Bring PuTTYgen into the world of object-oriented event handling. Also add a non-functional "generate" button the the key window. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-16T14:27:37.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 83593fe09259d2a93fa47b62d212dbc2 Text-delta-base-sha1: 80fdcad0915e2baca514851517eb56daf92c265b Text-content-length: 26 Text-content-md5: 462b5a35b79fd1cb5db406c42fff6738 Text-content-sha1: 940ce84f5ed771d4466f9f5e72c169dbb0983fb6 Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNbk a macabout Node-path: putty/mac/macpgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9b13bae13baff8a4e9d506ee06ebbbd6 Text-delta-base-sha1: d39ec6f14d88a6973ec97bed62d396c0857439d7 Text-content-length: 1358 Text-content-md5: 32a97981132e90afe19d50189699e085 Text-content-sha1: 287bd8e9fa7e4aaca33245f04bea0514763a93c9 Content-length: 1397 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN*SnC+] 0CHR[ 'm\+!fP|T6Xy^;%/* $Id: macpgen.c,v 1.3 2003/02/16 14:27:37updatewindow { if (mac_wininfo(window)->click != NULL) (*mac_wininfo(window)->click)(window, event); } static void mac_growwindow(WindowPtr window, EventRecord *event) { if (mac_wininfo(window)->grow != NULL) (*mac_wininfo(window)->grow)(window, event); } static void mac_activatewindow(WindowPtr window, EventRecord *event) { mac_adjustmenus(); if (mac_wininfo(window)->activate != NULL) (*mac_wininfo(window)->activate)(window, event); } static void mac_updatewindow(WindowPtr window) { if (mac_wininfo(window)->update != NULL) (*mac_wininfo(window)->update) if (mac_wininfo(window)->key != NULL) (*mac_wininfo(window)->key)(window, event); } } static void mac_menucommand(long result) if (mac_wininfo(window)->menu != NULL) (*mac_wininfo(window)->menu)(window, menu, item); done: HiliteMenu(0); } static void mac_closewindow(WindowPtr window) default: if (mac_wininfo(window)->close != NULL) (*mac_wininfo(window)->close)(window)if (mac_wininfo(window)->adjustmenus != NULL) (*mac_wininfo(window)->adjustmenus)(window); else { if (mac_wininfo(window)->adjustcursor != NULL) (*mac_wininfo(window)->adjustcursor)(window, mouse, cursrgn); else { Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e2ee416a644bb6f1091f364cf36365a3 Text-delta-base-sha1: 5867711b09d69d4a7fda76f1515a968a4e1a8797 Text-content-length: 194 Text-content-md5: 7b6d3b89f9ae85d5d5268112457837e2 Text-content-sha1: 1b3c50b7ce4bfce2e78c65b52cfee487f488fba8 Content-length: 233 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN|/ ) +zxA/* $Id: macpgen.r,v 1.3 2003/02/16 14:27:37Key, /* RefCon -- identifies the window to PuTTY */ wKey { 13, 13, 33, 227 }, Button { enabled, "Generate" }, } }; Node-path: putty/mac/macpgkey.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9eebf01441ad0e7d8171027d0c5d0523 Text-delta-base-sha1: 3436fb2c792424987a4e17cb9899175a72e7f1af Text-content-length: 1385 Text-content-md5: 8929525824f800d8c2632b8d851dd980 Text-content-sha1: 83306fcd981856aa8fc1e134da6c36cfa3737765 Content-length: 1424 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNI3I*,a~T<B/* $Id: macpgkey.c,v 1.2 2003/02/16 14:27:37static void mac_clickkey(WindowPtr window, EventRecord *event) { short item; DialogRef dialog; dialog = GetDialogFromWindow(window); if (DialogSelect(event, &dialog, &item)) switch (item) { case wiKeyGenerate: /* Do something */ break; } } static void mac_activatekey(WindowPtr window, EventRecord *event) { DialogRef dialog; DialogItemType itemtype; Handle itemhandle; short item; Rect itemrect; int active; dialog = GetDialogFromWindow(window); active = (event->modifiers & activeFlag) != 0; GetDialogItem(dialog, wiKeyGenerate, &itemtype, &itemhandle, &itemrect); HiliteControl((ControlHandle)itemhandle, active ? 0 : 255); DialogSelect(event, &dialog, &item); } static void mac_updatekey(WindowPtr window) { #if TARGET_API_MAC_CARBON RgnHandle rgn; #endif BeginUpdate(window); #if TARGET_API_MAC_CARBON rgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(window), rgn); UpdateDialog(GetDialogFromWindow(window), rgn); DisposeRgn(rgn); #else UpdateDialog(window, window->visRgn); #endif EndUpdate(window); }wi->update = &mac_updatekey; wi->click = &mac_clickkey; wi->activate = &mac_activatekey; SetWRefCon(GetDialogWindow(ks->box), (long)wi); ShowWindow(GetDialogWindow(ks->box) Node-path: putty/mac/macpgrid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a9764bf829f56db15cb20b743fd7d1b0 Text-delta-base-sha1: 456724f7ec45cacbc8e74aec1a15c512f785c159 Text-content-length: 86 Text-content-md5: aada4bf06a7128ada09defe61192cc5b Text-content-sha1: 52724b050f90bab40e36035bbf6d8575858601fe Content-length: 125 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNwEK,/* $Id: macpgrid.h,v 1.3 2003/02/16 14:27:37#define wiKeyGenerate 1 Revision-number: 2858 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2003-02-17T12:03:02.000000Z K 7 svn:log V 47 Off-by-one error in ssh2-keyderive-nonbug fix. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2.0.11-keyderive-nonbug Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 750 Text-content-md5: 6ce108f92a709cabfcbcf06b45c61bd3 Text-content-sha1: dcbed9abdeba4effaf18fe1c65a2c3b52730d06f Content-length: 866 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN```Summary: SSH 2.0.11 apparently doesn't have key-derivation bug Class: bug Priority: medium Difficulty: fun Content-type: text/x-html-body Present-in: 0.53 2002-10-07 0.53b 2003-02-14

    Apparently, while PuTTY believes that SSH 2.0.1[01]* have the SSH2 key-derivation bug, 2.0.11 on Solaris/SPARC 2.5.1 doesn't, and this causes the expected decryption failures. The current OpenSSH code suggests that the bug is only present in versions before SSH 2.0.11. It looks like the fix for ssh2-keyderive-nonbug had an off-by-one error.

    Ref: <000a01c2d422$ceef21b0$b78401c1@common> et seq. Revision-number: 2859 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 39 The Russian mirror finally has a name. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-17T12:08:39.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d715dbd2e7a54a9c4c382d0aacc17870 Text-delta-base-sha1: 87e3a743654318a029176491df76984fce39d440 Text-content-length: 57 Text-content-md5: 00f0f360e2e20b22694772f872aba594 Text-content-sha1: de3d858c4182f47810a4f631653d5e933f3344a1 Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNwp $K,putty.nigilist.ru">putty.nigilist.ru Revision-number: 2860 Prop-content-length: 124 Content-length: 124 K 7 svn:log V 26 Cross reference the moon. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-17T12:57:40.000000Z PROPS-END Node-path: putty-wishlist/data/regexp-logging Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5ba9a44043aff44d81dc206c5baa6468 Text-delta-base-sha1: 56a0a3133264b409d375a24f6dd9030ad586cd26 Text-content-length: 73 Text-content-md5: d77784124f4ef441d78b405d9ffbc5c0 Text-content-sha1: 17b88ad3e7b1f4db027ad01c02ddc90eb8ad9b67 Content-length: 112 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN * 4uthe moon on a stick Revision-number: 2861 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2003-02-18T20:10:24.000000Z K 7 svn:log V 90 Fix `ssh2.0.11-keyderive-nonbug' on the strength of Ben's analysis. Not tested it myself. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 53316fa8e3330801ce474d238cd3a39a Text-delta-base-sha1: d7e47903e07db0716f8f3e9e8e1169d5a0dbf5df Text-content-length: 47 Text-content-md5: 995f4d64a62488358c5f576a6e032213 Text-content-sha1: ab41bb0e5cb5262ca33fb4e13a1bc2fc4d9688cc Content-length: 88 K 15 cvs2svn:cvs-rev V 5 1.274 PROPS-END SVN p0G_C   Revision-number: 2862 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2003-02-18T21:56:36.000000Z K 7 svn:log V 13 ftp.cesga.es K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 00f0f360e2e20b22694772f872aba594 Text-delta-base-sha1: de3d858c4182f47810a4f631653d5e933f3344a1 Text-content-length: 71 Text-content-md5: 17f3d28d0f4ff7c66da72b7a99f03a2b Text-content-sha1: e255fd89d965e661c1555c0970c30a7407cab715 Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNp< 2]-Ccesga.es/MIRRORS/putty/">ftp.cesga.es in Spain Revision-number: 2863 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2003-02-18T23:42:00.000000Z K 7 svn:log V 13 content-type K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/regexp-logging Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d77784124f4ef441d78b405d9ffbc5c0 Text-delta-base-sha1: 17b88ad3e7b1f4db027ad01c02ddc90eb8ad9b67 Text-content-length: 24 Text-content-md5: cecb1bb3d255ed72d899dbe18b616461 Text-content-sha1: 2dd2f41e17147f902a9cdc069d40f96887d8043c Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN*/s7stext/ Revision-number: 2864 Prop-content-length: 175 Content-length: 175 K 7 svn:log V 75 Summary: Scroll bar on the left of the PuTTY window (Owen's investigation) K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-18T23:46:27.000000Z PROPS-END Node-path: putty-wishlist/data/scrollbar-left Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 494 Text-content-md5: 7a27f4c8016912e3043787982eebbb58 Text-content-sha1: 6d7490f34e0fb9226cb8bdd4f3f486206334b011 Content-length: 610 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN```Summary: Scroll bar on the left of the PuTTY window Class: wish Difficulty: tricky Priority: low Content-type: text/plain > I was wondering if you could add to the puTTY Configuration menu the > ability to choose which side of the puTTY window (right or left) the > vertical scrollbar is attached to? I've looked at this, but from the documentation it looked very much to me like a left-handed scrollbar was only available on right-to-left Windows versions (Arabic and Hebrew). Revision-number: 2865 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2003-02-18T23:49:05.000000Z K 7 svn:log V 21 Add naff workaround. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/print-screen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bc3e3f28537580a32877ec10db4c9e94 Text-delta-base-sha1: 5983088cb516684c4c435f17ad17c4e310ff5d62 Text-content-length: 135 Text-content-md5: 4d8c62c54596245a332f5ad015ef891f Text-content-sha1: 94e25a0de2fa03c58ffa4c89c806ec3ee0afd78b Content-length: 174 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNI?vIv

    The best you can do currently is copy and paste from the PuTTY window to another program, and print from there. Revision-number: 2866 Prop-content-length: 119 Content-length: 119 K 7 svn:log V 19 Add link to wconsd K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-19T00:06:08.000000Z PROPS-END Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cf8117f0de8d0c9f744f02127cc40c6e Text-delta-base-sha1: 57f528dadd1dbf438f022ae8c9988fedd46be248 Text-content-length: 200 Text-content-md5: 5ef6a0f0e4bb81395266da7d40f6106c Text-content-sha1: a36e7b2cece9db77b85a17803393a362e39ac890 Content-length: 239 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN3h535

    Workaround: for NT-class systems, you could use wconsd to turn the serial connection into a telnet connection. Revision-number: 2867 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2003-02-19T01:03:47.000000Z K 7 svn:log V 29 Make this compile in Carbon. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macevlog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5367cde802ead3cf8094c1c6648a31ad Text-delta-base-sha1: 9e74c15812810efabf5191b9d9a302da8bc097a3 Text-content-length: 65 Text-content-md5: 997790089dca7eec04b796e286aa7b38 Text-content-sha1: 341ebc6d4ec4f5aa030e4f311d419f47ee4c2d8e Content-length: 104 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN\ ,s,=V/* $Id: macevlog.c,v 1.3 2003/02/19 01:03:47 Revision-number: 2868 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2003-02-19T09:54:45.000000Z K 7 svn:log V 47 Fix documentation for `ssh2-keyderive-nonbug'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7002b713d1d60dacc0b21f2d3110be0c Text-delta-base-sha1: eacc32b4c3954f5b55ee790ae56ac0c33e534790 Text-content-length: 89 Text-content-md5: 1b8b1333e60d17dd0f38c3adb7c4f8ba Text-content-sha1: 1c05b862f084568acec4f0932f3ba1746ad3f61c Content-length: 129 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN-. ?t;{2\versionid $Id: config.but,v 1.56 2003/02/19 09:54:45 jacob0.11 Revision-number: 2869 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2003-02-19T09:57:57.000000Z K 7 svn:log V 30 Add workaround, other tweaks. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-keyderive-nonbug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5fef56e0cac753bbe8076cc1f7efafa5 Text-delta-base-sha1: c67345ae3692c080e2d1d0eaa0d8f3316ed659e9 Text-content-length: 137 Text-content-md5: 2be4eee15aacd7c883e81e93424b730b Text-content-sha1: ce6447719dc5eb128afe06559ab17fc64354867a Content-length: 176 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN. r m0.53b;

    Workaround: change `Miscomputes SSH2 encryption keys' on the `Bugs' panel from `Auto' to `Off'. Revision-number: 2870 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2003-02-19T10:11:27.000000Z K 7 svn:log V 34 Confirmed fixed by Se�n Murphy. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2.0.11-keyderive-nonbug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6ce108f92a709cabfcbcf06b45c61bd3 Text-delta-base-sha1: dcbed9abdeba4effaf18fe1c65a2c3b52730d06f Text-content-length: 41 Text-content-md5: 9907cbde21ebdc70f624745ca18bcf08 Text-content-sha1: 418ff19f56d7a2bfd76f66974d03a9a773c16400 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN`u 7*6Fixed-in: 2003-02-19 Revision-number: 2871 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2003-02-19T13:37:23.000000Z K 7 svn:log V 69 Summary: Keyboard mode to support Microsoft standard serial consoles K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/vt-utf8-keyboard Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1891 Text-content-md5: ffad16f3789faa1eeb5deb0259aac152 Text-content-sha1: c7c934b3632099fed0a971d466f435889f965f4b Content-length: 2007 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNUUUSummary: Keyboard mode to support Microsoft standard serial consoles Class: wish Priority: low Difficulty: fun Content-type: text/x-html-body

    Microsoft have published a standard describing how PCs should talk to serial consoles. To avoid compatibility, this uses a completely different keyboard mapping from the rest of the world, outlined below:

    Home Key<ESC>h
    End Key<ESC>k
    Insert Key%lt;ESC>+
    Delete Key%lt;ESC>-
    Page Up Key%lt;ESC>?
    Page Down Key%lt;ESC>/
    Function 1 Key%lt;ESC>1
    Function 2 Key%lt;ESC>2
    Function 3 Key%lt;ESC>3
    Function 4 Key%lt;ESC>4
    Function 5 Key%lt;ESC>5
    Function 6 Key%lt;ESC>6
    Function 7 Key%lt;ESC>7
    Function 8 Key%lt;ESC>8
    Function 9 Key%lt;ESC>9
    Function 10 Key%lt;ESC>0
    Function 11 Key%lt;ESC>!
    Function 12 Key%lt;ESC>@
    Shift Modifier%lt;ESC>^S
    Alt Modifier%lt;ESC>^A
    Control Modifier%lt;ESC>^C
    Reserved%lt;ESC>#
    Reserved%lt;ESC>A
    Reserved%lt;ESC>B
    Reserved%lt;ESC>C
    Reserved%lt;ESC>D
    Reserved%lt;ESC>&
    Reserved%lt;ESC>*
    Reserved%lt;ESC>.
    Reserved%lt;ESC>R
    Reserved%lt;ESC>r

    The modifiers are represented as the codes listed above, prefixed to the normal sequences. If the modifier is pressed alone, its sequence is transmitted twice in succession. If multiple modifiers apply, they're transmitted in the order shift, control, alt. Revision-number: 2872 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2003-02-20T00:40:39.000000Z K 7 svn:log V 98 Ask for traceback tables in PowerPC objects, since that should make tracking down crashes easier. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 73fa81ee20d3fce2fa366ac2ab14c836 Text-delta-base-sha1: 6d5f4c875be99f6121d74889cd9c9e419bc0d34e Text-content-length: 86 Text-content-md5: d5903269aff70ef3fbc18054d4a6a613 Text-content-sha1: 702ec2c6d2fcf0050f2127a94390163118b777e9 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVN* =1{obj}; print &splitline(sprintf("%s \xc4 %s", $d->{obj}, join " ", @{$d->{deps}}), undef, "\xb6"), "\n"; print "\t{C_$arch} ", $d->{deps}->[0], " -o {Targ} {COptions_$arch}\n\n"; } } foreach $arch qw(PPC Carbon) { foreach $d (&deps("X.\L$arch\E.o", "", "::", ":")) { next unless $d->{obj}; print &splitline(sprintf("%s \xc4 %s", $d->{obj}, join " ", @{$d->{deps}}), undef, "\xb6"), "\n"; # The odd stuff here seems to stop afpd getting confused. print "\techo -n > {Targ}\n"; print "\tsetfile -t XCOF {Targ}\n"; print "\t{C_$arch} ", $d->{deps}->[0], " -o {Targ} {COptions_$arch}\n\n"; } } select STDOUT; close OUT; Revision-number: 2874 Prop-content-length: 280 Content-length: 280 K 8 svn:date V 27 2003-02-20T22:31:52.000000Z K 7 svn:log V 181 Be careful not to try to get information from windows we don't own, or that don't exist at all. Also a small PuTTYgen change that I can't be bothered to filter out of this commit. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 06caf3272be0442bb6faa45f08f7a16b Text-delta-base-sha1: 8fcd2ef3ad8dfe919c71d2f77293997d2a17fad5 Text-content-length: 178 Text-content-md5: e857221c8b40232e86687ed6f96722ed Text-content-sha1: 1641278367239f5730c0e0c4ffe9ee25fbcd1dae Content-length: 218 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNP)|g(6/Kgg7u$,/* $Id: mac.c,v 1.50 2003/02/20 22:31:52mac_frontwwindow != NULL && mac_frontwwindow != NULL && mac_frontwwindow != NULL && Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 461b0b23107c61d027a405097f75496a Text-delta-base-sha1: 7bceb22cdf40e8e594f8d9eab5619773f4fd6466 Text-content-length: 208 Text-content-md5: ef4b0d595905e70dc2a4df43e5fda0c2 Text-content-sha1: e39d36d0fcc4d723b25e7d3d86b030d8e9be7f12 Content-length: 248 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN>30U.Gw int collecting_entropy; int entropy_got, entropy_required, entropy_size; unsigned *entropy; ControlHandle progressmisc.c */ extern WindowPtr mac_frontwindow(void); Node-path: putty/mac/macmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cdfcc7e6f9dff640b119907659012c61 Text-delta-base-sha1: 01f5428985f33daa1f59104d68a9fb1c06998adf Text-content-length: 534 Text-content-md5: 2ecc24f4fc25ab3b48b282a0821d1f0d Text-content-sha1: 666da9b827c74b1f959bd5a78f20e527a16317e4 Content-length: 573 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN6rG+pb#NGo/* $Id: macmisc.c,v 1.2 2003/02/20 22:31:52MacWindows.h> #include collecting_entropy) { GetMouse(&mousenow); if (mousenow.h != mousethen.h || mousenow.v != mousethen.v) { ks->entropy[ks->entropy_got++] = *(unsigned *)&mousenow; ks->entropy[ks->entropy_got++] = TickCount(); if (ks->entropy_got >= ks->entropy_required) ks->collecting_entropy = 0; SetControlValue(ks->progress, ks->entropy_got); mousethen = mousenow; } SetEmptyRgn(cursrgn); } } Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7b6d3b89f9ae85d5d5268112457837e2 Text-delta-base-sha1: 1b3c50b7ce4bfce2e78c65b52cfee487f488fba8 Text-content-length: 268 Text-content-md5: 5e1f6f48637fd86ab1a454fc29e53fdf Text-content-sha1: 875eaac0b4fb349204a857479f802af5216c1578 Content-length: 307 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN/o s+j;3/* $Id: macpgen.r,v 1.4 2003/02/20 22:55:09#define cProgress 129 { 46, 13, 12, 227 }, Control { enabled, cProgress }, } }; resource 'CNTL' (cProgress) { { 46, 13, 12, 227 }, 0, visible, 0, 0, kControlProgressBarProc, 0, "" }; Node-path: putty/mac/macpgkey.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8929525824f800d8c2632b8d851dd980 Text-delta-base-sha1: 83306fcd981856aa8fc1e134da6c36cfa3737765 Text-content-length: 2784 Text-content-md5: e6dabed85de65dcf3a62d0a5eded7e49 Text-content-sha1: 8a3a9103225c27818d6272559aa6abe701084310 Content-length: 2823 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN39(,]mhZ;?8<]r\jI/* $Id: macpgkey.c,v 1.3 2003/02/20 22:55:09 ben Exp $ */ /* * Copyright (c) 2003 Ben Harris * Copyright (c) 1997-2003 Simon TathamControl#include "ssh.h" /* ---------------------------------------------------------------------- * Progress report code. This is really horrible :-) */ #define PROGRESSRANGE 65535 #define MAXPHASE 5 struct progress { int nphases; struct { int exponential; unsigned startpoint, total; unsigned param, current, n; /* if exponential */ unsigned mult; /* if linear */ } phases[MAXPHASE]; unsigned total, divisor, range; ControlHandle progbar; }; static void progress_update(void *param, int action, int phase, int iprogress) { struct progress *p = (struct progress *) param; unsigned progress = iprogress; int position; if (action < PROGFN_READY && p->nphases < phase) p->nphases = phase; switch (action) { case PROGFN_INITIALISE: p->nphases = 0; break; case PROGFN_LIN_PHASE: p->phases[phase-1].exponential = 0; p->phases[phase-1].mult = p->phases[phase].total / progress; break; case PROGFN_EXP_PHASE: p->phases[phase-1].exponential = 1; p->phases[phase-1].param = 0x10000 + progress; p->phases[phase-1].current = p->phases[phase-1].total; p->phases[phase-1].n = 0; break; case PROGFN_PHASE_EXTENT: p->phases[phase-1].total = progress; break; case PROGFN_READY: { unsigned total = 0; int i; for (i = 0; i < p->nphases; i++) { p->phases[i].startpoint = total; total += p->phases[i].total; } p->total = total; p->divisor = ((p->total + PROGRESSRANGE - 1) / PROGRESSRANGE); p->range = p->total / p->divisor; SetControlMaximum(p->progbar, p->range); } break; case PROGFN_PROGRESS: if (p->phases[phase-1].exponential) { while (p->phases[phase-1].n < progress) { p->phases[phase-1].n++; p->phases[phase-1].current *= p->phases[phase-1].param; p->phases[phase-1].current /= 0x10000; } position = (p->phases[phase-1].startpoint + p->phases[phase-1].total - p->phases[phase-1].current); } else { position = (p->phases[phase-1].startpoint + progress * p->phases[phase-1].mult); } SetControlValue(p->progbar, position / p->divisor); break; } } static void mac_clickkey(WindowPtr window, EventRecord *event) { short item; DialogRef dialog; KeyState *ks = mac_windowkey(window)SetControlMaximum(ks->progress, 1024); ks->entropy = smalloc(1024 * sizeof(*ks->entropy)); ks->entropy_required = 1024; ks->entropy_got = 0; ks->collecting_entropy = TRUE; Handle h; short type; Rect rectGetDialogItem(ks->box, wiKeyProgress, &type, &h, &rect); ks->progress = (ControlHandle)h Node-path: putty/mac/macpgrid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aada4bf06a7128ada09defe61192cc5b Text-delta-base-sha1: 52724b050f90bab40e36035bbf6d8575858601fe Text-content-length: 87 Text-content-md5: ce273b82e8703e3f116dbf473689e3dd Text-content-sha1: 549b2a038605424a424d0f7e94df441b93f81b07 Content-length: 126 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN*Fd,/* $Id: macpgrid.h,v 1.4 2003/02/20 22:55:09#define wiKeyProgress 2 Revision-number: 2876 Prop-content-length: 293 Content-length: 293 K 8 svn:date V 27 2003-02-23T00:13:17.000000Z K 7 svn:log V 194 Work around an SC bug that causes it to try to use the same register for two purposes in s_wrpkt_prepare(). This makes SSH1 work on 68K Macs, at least until I deactivate the terminal window... K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 55847c5b9bcf4e04d3b2a3af2297d947 Text-delta-base-sha1: 0362284a7ddcd5335a73f48c34e7430379e4ff5e Text-content-length: 63 Text-content-md5: 7d058fa6162f664aa469d293c2933f23 Text-content-sha1: 6abf4eb8e2179f8c3370197b8782a173d483ca95 Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN\4 *W*3)$Id: README.mac,v 1.28 2003/02/23 00:13:17 Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 995f4d64a62488358c5f576a6e032213 Text-delta-base-sha1: ab41bb0e5cb5262ca33fb4e13a1bc2fc4d9688cc Text-content-length: 524 Text-content-md5: 042503709e36287b0bbd0372fcec9699 Text-content-sha1: bd54573f8410dfc7b4147dd29e1a33389f32571b Content-length: 565 K 15 cvs2svn:cvs-rev V 5 1.275 PROPS-END SVNYY5biglen, i; unsigned long crc; #ifdef __SC__ /* * XXX various versions of SC (including 8.8.4) screw up the * register allocation in this function and use the same register * (D6) for len and as a temporary, with predictable results. The * following sledgehammer prevents this. */ volatile #endif int len ? ~6-~ end_packet(ssh, SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid, PKT_END); } } else if (ssh->pktin.type == SSH1_MSG_C Revision-number: 2877 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2003-02-23T11:38:03.000000Z K 7 svn:log V 118 Summary: Arbitrary restriction on number of forwarded ports Lifted wholesale from `errors-portfwd-space' in the docs. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-space Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 763 Text-content-md5: 08590a6dab4f1346c843a3590d0ee686 Text-content-sha1: b2153677d879a74eea06739199ce6467e1307ea1 Content-length: 879 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNmmmSummary: Arbitrary restriction on number of forwarded ports Class: semi-bug Difficulty: tricky Priority: medium Content-type: text/x-html-body

    Pinched from the `Common error messages' section of the docs:

    10.3 "Out of space for port forwardings"

    PuTTY has a fixed-size buffer which it uses to store the details of all port forwardings you have set up in an SSH session. If you specify too many port forwardings on the PuTTY or Plink command line and this buffer becomes full, you will see this error message.

    We need to fix this (fixed-size buffers are almost always a mistake) but we haven't got round to it. If you actually have trouble with this, let us know and we'll move it up our priority list.

    Revision-number: 2878 Prop-content-length: 311 Content-length: 311 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-23T11:58:59.000000Z K 7 svn:log V 212 Add handling for suspend and resume events, and set the flags in our 'SIZE' resource that say we can handle them. This seems to avoid a crash when PuTTY's switched away from, and is necessary for Carbon anyway. PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e857221c8b40232e86687ed6f96722ed Text-delta-base-sha1: 1641278367239f5730c0e0c4ffe9ee25fbcd1dae Text-content-length: 763 Text-content-md5: 3f3216d449e7b0148a5bb1a8059bbe0d Text-content-sha1: f47197851fc63067749108e2a355da1c2d5966e4 Content-length: 803 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNR8(@B i)/* $Id: mac.c,v 1.51 2003/02/23 11:58:59suspendresume(osEvt: switch ((event->message & osEvtMessageMask) >> 24) { case suspendResumeMessage: mac_suspendresume(event); break; } break;suspendresume(EventRecord *event) { WindowPtr front; EventRecord fakeevent; /* * We're called either before we're suspended or after we're * resumed, so we're the front application at this point. */ front = FrontWindow(); if (front != NULL) { fakeevent.what = activateEvt; fakeevent.message = (UInt32)front; fakeevent.when = event->when; fakeevent.where = event->where; fakeevent.modifiers = (event->message & resumeFlag) ? activeFlag : 0; mac_activatewindow(front, &fakeevent) Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c93cf36f0517787a630ef3fae9fbeac3 Text-delta-base-sha1: 8920a517ff1922dd2a4a2516a299103fffa22ae6 Text-content-length: 137 Text-content-md5: 9cd7202600bd3e71c4eb898e16a634e6 Text-content-sha1: 8ceca4415bafb2d0e2d2d854d919915cde4fef3b Content-length: 177 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNED oH,C 8/* $Id: mac_res.r,v 1.28 2003/02/23 11:58:59acceptSuspendResumeEvents, reserved, canBackground, doe Revision-number: 2879 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2003-02-23T12:41:44.000000Z K 7 svn:log V 108 Scroll the event log to the end after adding a line if it was looking at the end before the line was added. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macevlog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 997790089dca7eec04b796e286aa7b38 Text-delta-base-sha1: 341ebc6d4ec4f5aa030e4f311d419f47ee4c2d8e Text-content-length: 363 Text-content-md5: b1cc9609282ebbce23c4cc807e647beb Text-content-sha1: 8f6ba4354d02c1a52f1d5e4b3a3fbb5329f458f7 Content-length: 402 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN\PEv,@" u`|/* $Id: macevlog.c,v 1.4 2003/02/23 12:41:44, visible GetListVisibleCells(s->eventlog, &visible); #else bounds = (*s->eventlog)->dataBounds; visible = (*s->eventlog)->visible; #endif /* ">=" and "2" because there can be a blank cell below the last one. */ if (visible.bottom >= bounds.bottom) LScroll(0, 2 Revision-number: 2880 Prop-content-length: 270 Content-length: 270 K 8 svn:date V 27 2003-02-23T13:00:38.000000Z K 7 svn:log V 171 Don't open the event log whenever an event is logged; instead handle the "Show Event Log" menu entry sensibly. Similarly, make it possible to close (hide) the event log. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macevlog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b1cc9609282ebbce23c4cc807e647beb Text-delta-base-sha1: 8f6ba4354d02c1a52f1d5e4b3a3fbb5329f458f7 Text-content-length: 278 Text-content-md5: b8c38d7c8986701234472e71c51cd7b0 Text-content-sha1: 311a6e87bc3e44f09902b77c9f88647a3a220823 Content-length: 317 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNPnm6,3Lp2dl/* $Id: macevlog.c,v 1.5 2003/02/23 13:00:38static void mac_closwi->close = &mac_closstatic void mac_closeeventlog(WindowPtr window) { HideWindow(window); } void mac_showeventlog(Session *s) { SelectWindow(s->eventlog_window); Revision-number: 2881 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 54 Handle suspend and resume events in PuTTYgen as well. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-23T13:31:12.000000Z PROPS-END Node-path: putty/mac/macpgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 917d9dd4e69d4b9d9d58673ff4ad1ef9 Text-delta-base-sha1: 92cebbeed9bd3ab7d69945fbc9fd5e4e40e21033 Text-content-length: 763 Text-content-md5: 47224bea8e79c79141ad04ca4ab48398 Text-content-sha1: 1f84dd8183495cd143fd48f9aba7e5f53d1de9bc Content-length: 802 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN |TC+(NEj x/* $Id: macpgen.c,v 1.5 2003/02/23 13:31:12suspendresume(osEvt: switch ((event->message & osEvtMessageMask) >> 24) { case suspendResumeMessage: mac_suspendresume(event); break; } break;suspendresume(EventRecord *event) { WindowPtr front; EventRecord fakeevent; /* * We're called either before we're suspended or after we're * resumed, so we're the front application at this point. */ front = FrontWindow(); if (front != NULL) { fakeevent.what = activateEvt; fakeevent.message = (UInt32)front; fakeevent.when = event->when; fakeevent.where = event->where; fakeevent.modifiers = (event->message & resumeFlag) ? activeFlag : 0; mac_activatewindow(front, &fakeevent Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5e1f6f48637fd86ab1a454fc29e53fdf Text-delta-base-sha1: 875eaac0b4fb349204a857479f802af5216c1578 Text-content-length: 133 Text-content-md5: 14b3644b1b6603539c790b7dea544a16 Text-content-sha1: 3ab9f14d08f8acf94618bec9673310aa7651c976 Content-length: 172 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNon nR+C.A/* $Id: macpgen.r,v 1.5 2003/02/23 13:31:12acceptSuspendResumeEvents, reserved, canBackground, doe Revision-number: 2882 Prop-content-length: 225 Content-length: 225 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-23T13:34:14.000000Z K 7 svn:log V 126 I think the Carbon build now works well enough to be worth turning on by default. It's not particularly useful, but it runs. PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4a41a686f99ed485ee7bec98122c4142 Text-delta-base-sha1: 02016badac724c310a7df83ff9867be95dbc5ee3 Text-content-length: 38 Text-content-md5: 67fad76548a639569b2c91a31ed2b1c3 Text-content-sha1: 1ca084f680a6c089a311a7480d13c322b998efae Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN Y-Y $prog.carbon Revision-number: 2883 Prop-content-length: 221 Content-length: 221 K 8 svn:date V 27 2003-02-23T13:42:34.000000Z K 7 svn:log V 122 Set the executable fragment name (in CFM builds) to the name of the target pgram, rather than to "PuTTY" unconditionally. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 67fad76548a639569b2c91a31ed2b1c3 Text-delta-base-sha1: 1ca084f680a6c089a311a7480d13c322b998efae Text-content-length: 61 Text-content-md5: 71c6ec0ee360ce0a7f1e143aa77768cd Text-content-sha1: 52c7cbebf684e8525f8b9ab44e3fe66c2b02b7a4 Content-length: 101 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN!.6>t-fragname $prog " . " Revision-number: 2884 Prop-content-length: 308 Content-length: 308 K 8 svn:date V 27 2003-02-24T18:48:33.000000Z K 7 svn:log V 207 Done a modicum of testing of proposed patch on Win2K. Still to do 9x. Also bumped priority to "high" as we now have a plausible way of doing things better. (Tempted to change from "semi-bug" to "bug", TBH.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/slow-startup-printer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c1feb47f82997835342cca86da5b5949 Text-delta-base-sha1: c070a48571d3e0d2f95546ebda9b1771ff2f160a Text-content-length: 238 Text-content-md5: 7c245304ad0487d63d1a42ee6b8addff Text-content-sha1: e8555ae8972776ce3d084a8e684cdce11b481711 Content-length: 277 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN!u Wa=dShigh

    Update 2003-02-24: verified that PRINTER_INFO_4 finds all the printers that PRINTER_INFO_5 does on my Win2K SP2 setup. Now just need to implement and test the Win9x fork. Revision-number: 2885 Prop-content-length: 243 Content-length: 243 K 8 svn:date V 27 2003-02-24T22:39:14.000000Z K 7 svn:log V 142 Add some parentheses for general robustness. (In particular I just tried to run mkfiles.pl on Perl 5.005_03 and it didn't work without them.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 71c6ec0ee360ce0a7f1e143aa77768cd Text-delta-base-sha1: 52c7cbebf684e8525f8b9ab44e3fe66c2b02b7a4 Text-content-length: 101 Text-content-md5: 786eebc427c93fb77acffa7fc4798061 Text-content-sha1: 6b4b72728035d05d0324303d58eee79783ecb243 Content-length: 141 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN!' 85RM-,D,w*(qw(68K CFM68K PPC Carbon)(qw(68K CFM68K)(qw(PPC Carbon) Revision-number: 2886 Prop-content-length: 153 Content-length: 153 K 7 svn:log V 55 Use a full URL for Mono, rather than just a host name. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-25T15:04:40.000000Z PROPS-END Node-path: putty-wishlist/data/terminal-modes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0ebb85c8d2af54837f8a308c80067741 Text-delta-base-sha1: e25af38032f0feb201da08dc98a63c49a35ab2f1 Text-content-length: 28 Text-content-md5: 945fedffaf47a429dd08d77f64289915 Text-content-sha1: a0b7348c4ae23eefa99bf74497150952e9a4bbc3 Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN=D 8http:// Revision-number: 2887 Prop-content-length: 109 Content-length: 109 K 7 svn:log V 11 yoogoo.com K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-26T13:41:12.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 17f3d28d0f4ff7c66da72b7a99f03a2b Text-delta-base-sha1: e255fd89d965e661c1555c0970c30a7407cab715 Text-content-length: 87 Text-content-md5: bd9e3e1a8b8f86c1f9b3620ba9a63fa7 Text-content-sha1: 4bc39d18ea9bb6a68dee12c78cfbcc07843cbd5f Content-length: 127 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN<% A#AA{!--HTTPMIRROR-->www.yoogoo Revision-number: 2888 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2003-02-26T15:35:52.000000Z K 7 svn:log V 26 Add CVE candidate number. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/vuln-passwd-memdump Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7dddecb32853083b722cee91f02e6640 Text-delta-base-sha1: 2a4c2bf63a2926ef384184d3271ca660aca094fc Text-content-length: 153 Text-content-md5: 7b26b6a5b5ca62c66b01d9145cc80e4e Text-content-sha1: 15fe7cfc3e4321003fa9a2e9db18f62d6a8f41d8 Content-length: 192 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN!

    This vulnerability corresponds to CVE CAN-2003-0048 . Revision-number: 2889 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2003-02-26T16:36:43.000000Z K 7 svn:log V 50 CAN-2003-0069: Window title reports are dangerous K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/vuln-window-title Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 820 Text-content-md5: f1d75349eb8e286aca9dbec3e1894629 Text-content-sha1: 06507c139a5344848645467b658d4c31f5191f25 Content-length: 936 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN&&&Summary: Window title reports offer opportunities for mischief Class: bug Difficulty: fun Priority: high Present-in: 0.53 0.53b Absent-in: 0.52 2001-11-24 Content-type: text/x-html-body

    It's been suggested that window-title reports might be a bad idea, since they allow anyone who can generate arbitrary output to a terminal to cause almost-arbitrary input from it. The various other terminal reports supported by PuTTY are less of a problem because their formats are rather more constrained.

    PuTTY should probably make window-title reporting support optional and have it default to off.

    This vulnerability corresponds to CVE CAN-2003-0069 . Revision-number: 2890 Prop-content-length: 182 Content-length: 182 K 7 svn:log V 82 May as well add refs to the CVE numbers, even if they're _still_ only candidates. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-26T17:56:57.000000Z PROPS-END Node-path: putty-wishlist/data/vuln-sshredder Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 14381a5d87f7c18c81a29131f6edacb6 Text-delta-base-sha1: 0b90f4101576b39a2b9080a6743d5fbf3f3fc637 Text-content-length: 602 Text-content-md5: bd51dc3f0ec0138c2b03f7548315089c Text-content-sha1: 76159ad3ffd77e106534e5f833b59ca1b31b4b0b Content-length: 641 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN?G?G

    CVE have assigned the following candidate IDs to the vulnerabilities tested for by SSHredder:

    (I haven't checked which of these PuTTY was actually vulnerable to). Revision-number: 2891 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2003-02-26T18:02:19.000000Z K 7 svn:log V 122 Since 0.53b was on a branch, we should probably note at what point this was fixed in the main development thread as well. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-sshredder Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bd51dc3f0ec0138c2b03f7548315089c Text-delta-base-sha1: 76159ad3ffd77e106534e5f833b59ca1b31b4b0b Text-content-length: 32 Text-content-md5: 9d5fa5e6c319037e5a455e2f794a1ffa Text-content-sha1: 855c796811b20785dcf7114aaa629161f5cb1d8e Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN | 2002-11-09 Revision-number: 2892 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2003-02-26T20:44:36.000000Z K 7 svn:log V 87 I've now tried out PRINTER_INFO_5 on Win98. It works at least as well as what we have. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/slow-startup-printer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7c245304ad0487d63d1a42ee6b8addff Text-delta-base-sha1: e8555ae8972776ce3d084a8e684cdce11b481711 Text-content-length: 278 Text-content-md5: e4e24c7392554c7bbe98466fbbe7e90c Text-content-sha1: 9aed112eb1d8ade89e90923cb899cf39d6d1c47d Content-length: 317 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNu>;6: verified that PRINTER_INFO_4 on Win2K SP2 and PRINTER_INFO_5 on Win98 work as least as well for me as what we do currently (PRINTER_INFO_1). All that remains is the tedious mucking around with version detection. Revision-number: 2893 Prop-content-length: 126 Content-length: 126 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-02-26T22:58:28.000000Z K 7 svn:log V 28 Correct spelling of "<". PROPS-END Node-path: putty-wishlist/data/vt-utf8-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ffad16f3789faa1eeb5deb0259aac152 Text-delta-base-sha1: c7c934b3632099fed0a971d466f435889f965f4b Text-content-length: 1055 Text-content-md5: 7fc7300ef4fddbd275c4cb097401b8bd Text-content-sha1: 0195ac7005171779c5e3f78ad62a5c5daa0149b0 Content-length: 1094 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNUU 29<ESC>+ Delete Key<ESC>- Page Up Key<ESC>? Page Down Key<ESC>/ Function 1 Key<ESC>1 Function 2 Key<ESC>2 Function 3 Key<ESC>3 Function 4 Key<ESC>4 Function 5 Key<ESC>5 Function 6 Key<ESC>6 Function 7 Key<ESC>7 Function 8 Key<ESC>8 Function 9 Key<ESC>9 Function 10 Key<ESC>0 Function 11 Key<ESC>! Function 12 Key<ESC>@ Shift Modifier<ESC>^S Alt Modifier<ESC>^A Control Modifier<ESC>^C Reserved<ESC># Reserved<ESC>A Reserved<ESC>B Reserved<ESC>C Reserved<ESC>D Reserved<ESC>& Reserved<ESC>* Reserved<ESC>. Reserved<ESC>R Reserved& Revision-number: 2894 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2003-02-27T11:17:58.000000Z K 7 svn:log V 104 Embolden high-priority semi-bugs and move them to the top of their section, as we do for outright bugs. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a5cf109a14ceddcb849ae4691603040b Text-delta-base-sha1: 5c0512ac88e6f0bb2174bd701a768209d487428f Text-content-length: 257 Text-content-md5: 81d566a43db5b28f43da6d2231480979 Text-content-sha1: e9e5532a8a0eb10e8ab54f4bb005614ff0461047 Content-length: 297 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNSgc6<Wuw\#! /usr/bin/perl # $Id: bugs2html,v 1.22 2003/02/27 11:17:58semibuglist\@semibuglist); my @tmp = grep(($bugs{$_}->{priority} eq 'high'), @semibuglist); subtractbugs(\@semibuglist, printbugs(\@tmp, 1)); printbugs(\@semibuglist Revision-number: 2895 Prop-content-length: 131 Content-length: 131 K 7 svn:log V 32 proxy digest auth would be nice K 10 svn:author V 4 owen K 8 svn:date V 27 2003-02-27T14:22:31.000000Z PROPS-END Node-path: putty-wishlist/data/proxy-http-digest-auth Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 290 Text-content-md5: fd83baf7ff96f4fbcde269e7d8674cec Text-content-sha1: a738854c8841b9da9a997c1fd2ed44f29424eb8f Content-length: 406 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: HTTP proxy authorization using digest auth Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body

    PuTTY currently uses HTTP basic authentication to make connections through an HTTP proxy. It would be good if we also supported digest auth. Revision-number: 2896 Prop-content-length: 263 Content-length: 263 K 7 svn:log V 162 Summary: Occasional PuTTYgen division-by-zero errors (I've had this one kicking around for a while, but didn't have a credible Present-in header until recently.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-02-27T17:54:07.000000Z PROPS-END Node-path: putty-wishlist/data/puttygen-zero-div Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1030 Text-content-md5: 7ca49a3d3619c49ee32b49cf261a54d4 Text-content-sha1: 15789856151ac0f29491356903d1ebba2aeb480b Content-length: 1146 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNxxxSummary: Occasional PuTTYgen division-by-zero errors Class: bug Difficulty: taxing Priority: medium Present-in: 0.53 0.53b Content-type: text/x-html-body

    We are getting very occasional reports of integer division by zero errors in PuTTYgen.

    • 15345.43775.42454.321823@chiark.greenend.org.uk
      2001-11-13? (maybe already resolved)
    • 3CA268CA.7258.2CA7836@localhost
      SSH-1 1024, Win95, version 0.52 (assuming that, as we were told, `Teilungsfehler' is a division error)
    • 000001c2bb51$77afcbf0$6401a8c0@lynn
      SSH-2 RSA 2048, version ???
    • 1645070571.20030227150247@inbox.ru
      SSH-2 RSA 1024, version 0.53b
      At last, we have a stack trace:
      PUTTYGEN! 00408160()  sshbn.obj:_internal_mod
      PUTTYGEN! 004086fa()  sshbn.obj:_bigdivmod
      PUTTYGEN! 00408ecd()  sshbn.obj:_modinv
      PUTTYGEN! 0041040f()  sshrsag.obj:_rsa_generate
      PUTTYGEN! 004051c2()  puttygen.obj:_generate_rsa_key_thread@4
      KERNEL32! 77e887dd()
    Revision-number: 2897 Prop-content-length: 314 Content-length: 314 K 8 svn:date V 27 2003-02-27T23:13:23.000000Z K 7 svn:log V 215 I've finally worked out why my cursor sometimes ends up in the wrong place when I leave the alternate screen. This has been irritating me for _years_. Document it so I don't forget, and we can stop PuTTY doing it. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/resize-scroll-effects Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 76dd9dc5764a530946e92b9678ba82c5 Text-delta-base-sha1: 81f8b5bb0b407d4c57c6dfe84281af74e33d125c Text-content-length: 909 Text-content-md5: 997ae8a8b5e328ec271ab667e86f24fd Text-content-sha1: 0cdf4c510708e54ca85103c0f19dd5759bb31b13 Content-length: 948 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNvr vv|zAnother subtlety is what to do about saved cursor positions. At present in PuTTY (and I think in xterm), if you open an 80x24 window, do something to put stuff into the scrollback, switch to the alternate screen, enlarge the window to the height of the screen and then switch back from the alternate screen, you end up with the cursor on line 24, rather than at the bottom of the scrren with the text that used to be on line 24.

    Another subtlety is what to do about saved cursor positions. At present in PuTTY (and I think in xterm), if you open an 80x24 window, do something to put stuff into the scrollback, switch to the alternate screen, enlarge the window to the height of the screen and then switch back from the alternate screen, you end up with the cursor on line 24, rather than at the bottom of the screen with the text that used to be on line 24. This is clearly wrong Revision-number: 2898 Prop-content-length: 320 Content-length: 320 K 8 svn:date V 27 2003-02-27T23:21:23.000000Z K 7 svn:log V 221 Add 'plst' 0 resources to help Mac OS X do magic things. These aren't actually compiled yet because they must only be present in the Carbon build, and I don't currently compile the resources separately for each platform. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9cd7202600bd3e71c4eb898e16a634e6 Text-delta-base-sha1: 8ceca4415bafb2d0e2d2d854d919915cde4fef3b Text-content-length: 1135 Text-content-md5: 5ecf828aeae6d253eea333243c36b667 Text-content-sha1: ddf6870bdf93c4538a0a3b92d71c826b8df750e7 Content-length: 1175 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVND@R^WXt-/* $Id: mac_res.r,v 1.29 2003/02/27 23:21:23 ben Exp $ */ /* * Copyright (c) 1999, 2002, 2003#if TARGET_API_MAC_CARBON /* * Mac OS X Info.plist. * See Tech Note TN2013 for details. * We don't bother with things that Mac OS X seems to be able to get from * other resources. */ type 'plst' as 'TEXT'; resource 'plst' (0) { "\n" "\n" "\n" " \n" " CFBundleInfoDictionaryVersion 6.0\n" " CFBundleIdentifier\n" " org.tartarus.projects.putty.putty\n" " CFBundleName PuTTY\n" " CFBundlePackageType APPL\n" " CFBundleSignature pTTY\n" " \n" "\n" }; /* Mac OS X doesn't use this, but Mac OS 9 does. */ type 'carb' as 'TEXT'; resource 'carb' (0) { "" }; #endif Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 14b3644b1b6603539c790b7dea544a16 Text-delta-base-sha1: 3ab9f14d08f8acf94618bec9673310aa7651c976 Text-content-length: 1137 Text-content-md5: c5189c5fd5f554f7337d162ed7bf977a Text-content-sha1: 9cd9638feb71b9576bae295c4f4703dd8564af60 Content-length: 1176 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNnpW]kWz.@/* $Id: macpgen.r,v 1.6 2003/02/27 23:21:23 ben Exp $ */ /* * Copyright (c) 1999, 2002, 2003#if TARGET_API_MAC_CARBON /* * Mac OS X Info.plist. * See Tech Note TN2013 for details. * We don't bother with things that Mac OS X seems to be able to get from * other resources. */ type 'plst' as 'TEXT'; resource 'plst' (0) { "\n" "\n" "\n" " \n" " CFBundleInfoDictionaryVersion 6.0\n" " CFBundleIdentifier\n" " org.tartarus.projects.putty.puttygen\n" " CFBundleName PuTTYgen\n" " CFBundlePackageType APPL\n" " CFBundleSignature pGen\n" " \n" "\n" }; /* Mac OS X doesn't use this, but Mac OS 9 does. */ type 'carb' as 'TEXT'; resource 'carb' (0) { "" }; #endif Revision-number: 2899 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2003-02-27T23:34:59.000000Z K 7 svn:log V 93 Handle the Aqua menu layout, in which the system provides a "quit" option for us, correctly. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3f3216d449e7b0148a5bb1a8059bbe0d Text-delta-base-sha1: f47197851fc63067749108e2a355da1c2d5966e4 Text-content-length: 294 Text-content-md5: 40ed1b169ace0a6759b04234586732fd Text-content-sha1: 2e6b597cfdaf234d2ce5953e0a80c4c2c87d128f Content-length: 334 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNt%{b+e}/* $Id: mac.c,v 1.52 2003/02/27 23:34 /* Mac OS 8.5 Menu Manager? */ if (Gestalt(gestaltMenuMgrAttr, &mac_gestalts.menuattr) != noErr) mac_gestalts.menuif (mac_gestalts.menuattr & gestaltMenuMgrAquaLayoutMask) DeleteMenuItem(GetMenuHandle(mFile), iQuit Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef4b0d595905e70dc2a4df43e5fda0c2 Text-delta-base-sha1: e39d36d0fcc4d723b25e7d3d86b030d8e9be7f12 Text-content-length: 25 Text-content-md5: 881a218c26bd197cae847c163ef634f1 Text-content-sha1: 8fc674144d10c6ac7bcedaa8c42f010d6604c51e Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN S;Dmenu Revision-number: 2900 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2003-02-28T20:28:03.000000Z K 7 svn:log V 136 In merging the username and password input functions I inadvertently removed the support for control characters in passwords. Replaced. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 042503709e36287b0bbd0372fcec9699 Text-delta-base-sha1: bd54573f8410dfc7b4147dd29e1a33389f32571b Text-content-length: 457 Text-content-md5: e51cd6de10feb7fb4be35380bdcabeff Text-content-sha1: 7848d2ec445e7e800e0c7c029e633bd8972d60d6 Content-length: 498 K 15 cvs2svn:cvs-rev V 5 1.276 PROPS-END SVNc%cx*/* * This simplistic check for printability is disabled * when we're doing password input, because some people * have control characters in their passwords.o */ if ((!ssh->userpass_input_echo || ?..f1 6 c->type == CHAN_SOCKDATA_DORMANT) { c->remoteid = localid; c->type = CHAN_SOCKDATA; c->v.v1.throttling = 0; pfd_confirm(c->u.pfd.s); } if (c && Revision-number: 2901 Prop-content-length: 526 Content-length: 526 K 8 svn:date V 27 2003-03-01T15:12:03.000000Z K 7 svn:log V 427 Improve scheduling on the Mac: 1: Only update the screen when there's nothing else to do. This means that it's a lot harder for a fast typist to outrun PuTTY. 2: Only sleep for at most 100ms at a time. This is a kludge to work around the WakeUpProcess caused by incoming data can happen before the WaitNextEvent it's meant to interrupt, leading to PuTTY sleeping forever because it doesn't know there's network data pending. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 40ed1b169ace0a6759b04234586732fd Text-delta-base-sha1: 2e6b597cfdaf234d2ce5953e0a80c4c2c87d128f Text-content-length: 574 Text-content-md5: ce5b1cb0490aa7926aee4c1939459303 Text-content-sha1: d1c8264126d537fbaaa58c32ab5daae8126d47a1 Content-length: 614 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNt x(Ae3A/* $Id: mac.c,v 1.53 2003/03/01 15:12:03UInt32 sleeptimesleeptime = 0; for (;;) { mac_adjustcursor(cursrgn); gotevent = WaitNextEvent(everyEvent, &event, sleeptime, cursrgn); /* * XXX For now, limit sleep time to 1/10 s to work around * wake-before-sleep race in MacTCP code. */ sleeptime = 6; mac_adjustcursor(cursrgn); if (gotevent) { /* Ensure we get a null event when the real ones run out. */ sleeptime = 0; mac_event(&event); if (borednow) cleanup_exit(0); } sk_poll(); if (!gotevent) Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 881a218c26bd197cae847c163ef634f1 Text-delta-base-sha1: 8fc674144d10c6ac7bcedaa8c42f010d6604c51e Text-content-length: 44 Text-content-md5: 7464d7d07b1dc0043951cc5562f614c5 Text-content-sha1: cbe424b780162e2575e55dc39e7a42150f877d4e Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN+ BR@extern UInt32 sleeptime Revision-number: 2902 Prop-content-length: 263 Content-length: 263 K 8 svn:date V 27 2003-03-03T16:35:45.000000Z K 7 svn:log V 162 I've been meaning to get round to this for _ages_: in front of my coroutine macros, I now include a comment linking to my web article that explains what they do. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e51cd6de10feb7fb4be35380bdcabeff Text-delta-base-sha1: 7848d2ec445e7e800e0c7c029e633bd8972d60d6 Text-content-length: 426 Text-content-md5: 317c47ae79ef55d04a0240cc0fa0f04c Text-content-sha1: a4a2de0b97d5a0f1059d7fad0bc37096e4709a22 Content-length: 467 K 15 cvs2svn:cvs-rev V 5 1.277 PROPS-END SVN N+ * Coroutine mechanics for the sillier bits of the code. If these * macros look impenetrable to you, you might find it helpful to * read * * http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html * * which explains the theory behind these macros. o qq \r+ION) { unsigned int remoteid = GET_32BIT(ssh->pktin.body); unsigned int localid = GET_32BIT(ssh->pktin.body+4 Revision-number: 2903 Prop-content-length: 153 Content-length: 153 K 7 svn:log V 54 http://putty.wtc.com.tw/ , admin webmaster@wtc.com.tw K 10 svn:author V 4 owen K 8 svn:date V 27 2003-03-04T09:28:16.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd9e3e1a8b8f86c1f9b3620ba9a63fa7 Text-delta-base-sha1: 4bc39d18ea9bb6a68dee12c78cfbcc07843cbd5f Text-content-length: 90 Text-content-md5: ef8412c20305d9c085f6e1e695db0e25 Text-content-sha1: c0d9cca2d55e5ae14a365894473a713049fffb42 Content-length: 130 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN% DLD%putty.wtc.com.tw/">putty.wtc.com.tw in Taiwan Revision-number: 2904 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2003-03-04T14:14:17.000000Z K 7 svn:log V 87 Add 'what does "PuTTY" mean?', and add some IPA to the shortened pronunciation answer. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3f9058213dabb5083b7f5ce20fa0f998 Text-delta-base-sha1: 7c7c8f9046f5ff8c57832af28d3d76c3d9400a86 Text-content-length: 594 Text-content-md5: 7e0465e66b4c0d576ce12c2f3a9cfa5c Text-content-sha1: 6c9b2d8f966795e9eb25916edfcd33116431647b Content-length: 634 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNB ;8\versionid $Id: faq.but,v 1.45 2003/03/04 14:14:17 benmeaning}{Question} What does \q{PuTTY} mean? It's the name of a popular SSH and Telnet client. Any other meaning is in the eye of the beholder. It's been rumoured that \q{PuTTY} is the antonym of \q{\cw{getty}}, or that it's the stuff that makes your Windows useful, or that it's a kind of plutonium Teletype. We couldn't possibly comment on such allegations. \S{faq-pronounce}{Question} How do I pronounce \q{PuTTY}? Exactly like the English word \q{putty}, which we pronounce /\u02C8{'}p\u028C{V}t\u026A{I}/. Revision-number: 2905 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2003-03-05T11:34:19.000000Z K 7 svn:log V 70 Remove a spurious copy of the paragraph about saved cursor positions. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/resize-scroll-effects Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 997ae8a8b5e328ec271ab667e86f24fd Text-delta-base-sha1: 0cdf4c510708e54ca85103c0f19dd5759bb31b13 Text-content-length: 20 Text-content-md5: 751d70cb71376327ec780a0614b064d4 Text-content-sha1: 2d162e7a1aba7d68275bc93e05042dc40a80286f Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNr@ @2 Revision-number: 2906 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2003-03-05T12:10:20.000000Z K 7 svn:log V 50 Add xrefs to Richard's patches for some problems. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/pterm-scrollopt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d96dabfa724dc32083d4cc48c81ffa86 Text-delta-base-sha1: faf0aa82c7ca33976fabd205c1157d744c43db2d Text-content-length: 181 Text-content-md5: f276818bd87495dd4478377250b18114 Text-content-sha1: 03d9e1ea94b675398a6d70fadba6ee748756bbf1 Content-length: 220 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNj #g#x-html-body Richard Boulton has a patch to add scroll optimisation to pterm. Node-path: putty-wishlist/data/pterm-windowid Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9757adcd1c4501b2084b8059d023f493 Text-delta-base-sha1: fdd99b23795d951db2c36c38d8a13372c400f4f8 Text-content-length: 173 Text-content-md5: 0b26a23eb558e98c1aeb6e21ce3aa989 Text-content-sha1: aa1f0755657adf184324792e7326215ee234c476 Content-length: 212 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNiy wl}x-html-body

    
    

    Richard Boulton has a patch for this. Node-path: putty-wishlist/data/resize-scroll-effects Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 751d70cb71376327ec780a0614b064d4 Text-delta-base-sha1: 2d162e7a1aba7d68275bc93e05042dc40a80286f Text-content-length: 158 Text-content-md5: a543c7ff82b9db04612669ed90125105 Text-content-sha1: 88ad0268b5c6a1dee76c071e957924d916ed99c1 Content-length: 197 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN@I F|DRichard Boulton has a patch to fix this Revision-number: 2907 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2003-03-05T18:44:19.000000Z K 7 svn:log V 98 Yet another bloody keyboard mapping, this time for Intel server boards (or at least one of them). K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/intel-keyboard Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2470 Text-content-md5: 7f55500e95fa744ecee205307dd42b94 Text-content-sha1: d89f54dc9e8ff8fcf221f3cbe6366a1b7f2d00ef Content-length: 2586 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: Keyboard mode to support Intel serial consoles Class: wish Priority: low Difficulty: fun Content-type: text/x-html-body

    Intel's server boards appear to use their own keyboard mapping, which doesn't quite correspond to anything that PuTTY supports:

    Key Normal Shift Ctrl Alt
    ESC ^[
    F1 ^[OP
    F2 ^[OQ
    F3 ^[OR
    F4 ^[OS
    F5 ^[OT
    F6 ^[OU
    F7 ^[OV
    F8 ^[OW
    F9 ^[OX
    F10 ^[OY
    F11 ^[OZ
    F12 ^[O1
    Print Screen
    Scroll Lock
    Pause
    Insert ^[[L
    Delete (7Fh)
    Home ^[[H
    End ^[[K
    Pg Up ^[[M
    Pg Down ^[[2J
    Up Arrow^[[A
    Down Arrow^[[B
    Right Arrow^[[C
    Left Arrow^[[D
    Tab (09h)
    backspace(08h) (08h) (7Fh) ^[}(08h)
    (accent)`` (tilde)~ ^[}`
    1 1 ! ^[}1
    2 2 @ ^[}2
    3 3 # ^[}3
    4 4 $ ^[}4
    5 5 % ^[}5
    6 6 ^ ^[}6
    7 7 & ^[}7
    8 8 * ^[}8
    9 9 ( ^[}9
    0 0 ) ^[}0
    (dash)- - (under)_ (1Fh) ^[}-
    = = + ^[}=
    a to z a to z A to Z(01h)to (1Ah)^[}a to ^[}z
    [ [ { (1Bh) ^[}[
    ] ] } (1Dh) ^[}]
    \ \ | (1Ch) ^[}|
    (semi-colon);; (colon): ^[};
    (apostrophe)'' (quote)" ^[}'
    (comma),, < ^[},
    (period).. > ^[}.
    / / ? ^[}/
    (space) (20h) (20h) (20h) ^[}(20h)

    Table from SCB2 Server Board Technical Product Specification, Intel order number A70821-003.

    I think this would best be handled by:

    • Adding a function-key mode for it (assuming that that similar VT100+ mode isn't intended to be identical),
    • Adding an option to have Alt generate a ^[} prefix, and
    • Ignoring all the other discrepancies (control characters, US keyboard mapping etc).
    Revision-number: 2908 Prop-content-length: 901 Content-length: 901 K 8 svn:date V 27 2003-03-05T22:07:40.000000Z K 7 svn:log V 800 The long-awaited config box revamp! I've taken the whole config box to pieces, and put it back together in a new table-driven form. config.c sets up a data structure describing most of the config box; wincfg.c adds in the Windows-specific options (so that config.c can also form the basis for Mac and Unix config boxes). Then winctrls.c contains a shiny new layout engine which consumes that data structure, and windlg.c passes all WM_COMMAND and similar messages to a driver alongside that layout engine. In the process I've sorted out nicer-looking panel titles and finally fixed the list-boxes-are- never-the-right-size bug (turned out to be Windows's fault, of course). I _believe_ it should do everything the old config box did, including context help. Now everyone has to test it thoroughly... K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 462b5a35b79fd1cb5db406c42fff6738 Text-delta-base-sha1: 940ce84f5ed771d4466f9f5e72c169dbb0983fb6 Text-content-length: 63 Text-content-md5: 34386e65b959d8aad445e86c319a85b8 Text-content-sha1: a3a6e1c9d729a03636cbedb1577393ae254d5c29 Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNk$31: dialog config wincfg tree234tree234 Node-path: putty/config.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 51570 Text-content-md5: 19c464e77842465acf8f35889ebadc2c Text-content-sha1: b67a2750af3a72984c94e82952a968bceefc08eb Content-length: 51686 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNaaa/* * config.c - the platform-independent parts of the PuTTY * configuration box. */ #include #include #include "putty.h" #include "dialog.h" #include "storage.h" #define PRINTER_DISABLED_STRING "None (printing disabled)" static void protocolbuttons_handler(union control *ctrl, void *dlg, void *data, int event) { int button, defport; Config *cfg = (Config *)data; /* * This function works just like the standard radio-button * handler, except that it also has to change the setting of * the port box. We expect the context parameter to point at * the `union control' structure for the port box. */ if (event == EVENT_REFRESH) { for (button = 0; button < ctrl->radio.nbuttons; button++) if (cfg->protocol == ctrl->radio.buttondata[button].i) break; /* We expected that `break' to happen, in all circumstances. */ assert(button < ctrl->radio.nbuttons); dlg_radiobutton_set(ctrl, dlg, button); } else if (event == EVENT_VALCHANGE) { int oldproto = cfg->protocol; button = dlg_radiobutton_get(ctrl, dlg); assert(button >= 0 && button < ctrl->radio.nbuttons); cfg->protocol = ctrl->radio.buttondata[button].i; if (oldproto != cfg->protocol) { defport = -1; switch (cfg->protocol) { case PROT_SSH: defport = 22; break; case PROT_TELNET: defport = 23; break; case PROT_RLOGIN: defport = 513; break; } if (defport > 0 && cfg->port != defport) { cfg->port = defport; dlg_refresh((union control *)ctrl->radio.context.p, dlg); } } } } static void numeric_keypad_handler(union control *ctrl, void *dlg, void *data, int event) { int button; Config *cfg = (Config *)data; /* * This function works much like the standard radio button * handler, but it has to handle two fields in Config. */ if (event == EVENT_REFRESH) { if (cfg->nethack_keypad) button = 2; else if (cfg->app_keypad) button = 1; else button = 0; assert(button < ctrl->radio.nbuttons); dlg_radiobutton_set(ctrl, dlg, button); } else if (event == EVENT_VALCHANGE) { button = dlg_radiobutton_get(ctrl, dlg); assert(button >= 0 && button < ctrl->radio.nbuttons); if (button == 2) { cfg->app_keypad = FALSE; cfg->nethack_keypad = TRUE; } else { cfg->app_keypad = (button != 0); cfg->nethack_keypad = FALSE; } } } static void cipherlist_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; if (event == EVENT_REFRESH) { int i; static const struct { char *s; int c; } ciphers[] = { { "3DES", CIPHER_3DES }, { "Blowfish", CIPHER_BLOWFISH }, { "DES", CIPHER_DES }, { "AES (SSH 2 only)", CIPHER_AES }, { "-- warn below here --", CIPHER_WARN } }; /* Set up the "selected ciphers" box. */ /* (cipherlist assumed to contain all ciphers) */ dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < CIPHER_MAX; i++) { int c = cfg->ssh_cipherlist[i]; int j; char *cstr = NULL; for (j = 0; j < (sizeof ciphers) / (sizeof ciphers[0]); j++) { if (ciphers[j].c == c) { cstr = ciphers[j].s; break; } } dlg_listbox_addwithindex(ctrl, dlg, cstr, c); } dlg_update_done(ctrl, dlg); } else if (event == EVENT_VALCHANGE) { int i; /* Update array to match the list box. */ for (i=0; i < CIPHER_MAX; i++) cfg->ssh_cipherlist[i] = dlg_listbox_getid(ctrl, dlg, i); } } static void printerbox_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; if (event == EVENT_REFRESH) { int nprinters, i; printer_enum *pe; dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); dlg_listbox_add(ctrl, dlg, PRINTER_DISABLED_STRING); pe = printer_start_enum(&nprinters); for (i = 0; i < nprinters; i++) dlg_listbox_add(ctrl, dlg, printer_get_name(pe, i)); printer_finish_enum(pe); dlg_editbox_set(ctrl, dlg, (*cfg->printer ? cfg->printer : PRINTER_DISABLED_STRING)); dlg_update_done(ctrl, dlg); } else if (event == EVENT_VALCHANGE) { dlg_editbox_get(ctrl, dlg, cfg->printer, sizeof(cfg->printer)); if (!strcmp(cfg->printer, PRINTER_DISABLED_STRING)) *cfg->printer = '\0'; } } static void codepage_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; if (event == EVENT_REFRESH) { int i; char *cp; dlg_update_start(ctrl, dlg); strcpy(cfg->line_codepage, cp_name(decode_codepage(cfg->line_codepage))); dlg_listbox_clear(ctrl, dlg); for (i = 0; (cp = cp_enumerate(i)) != NULL; i++) dlg_listbox_add(ctrl, dlg, cp); dlg_editbox_set(ctrl, dlg, cfg->line_codepage); dlg_update_done(ctrl, dlg); } else if (event == EVENT_VALCHANGE) { dlg_editbox_get(ctrl, dlg, cfg->line_codepage, sizeof(cfg->line_codepage)); strcpy(cfg->line_codepage, cp_name(decode_codepage(cfg->line_codepage))); } } static void sshbug_handler(union control *ctrl, void *dlg, void *data, int event) { if (event == EVENT_REFRESH) { dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); dlg_listbox_addwithindex(ctrl, dlg, "Auto", AUTO); dlg_listbox_addwithindex(ctrl, dlg, "Off", FORCE_OFF); dlg_listbox_addwithindex(ctrl, dlg, "On", FORCE_ON); switch (*(int *)ATOFFSET(data, ctrl->listbox.context.i)) { case AUTO: dlg_listbox_select(ctrl, dlg, 0); break; case FORCE_OFF: dlg_listbox_select(ctrl, dlg, 1); break; case FORCE_ON: dlg_listbox_select(ctrl, dlg, 2); break; } dlg_update_done(ctrl, dlg); } else if (event == EVENT_SELCHANGE) { int i = dlg_listbox_index(ctrl, dlg); if (i < 0) i = AUTO; else i = dlg_listbox_getid(ctrl, dlg, i); *(int *)ATOFFSET(data, ctrl->listbox.context.i) = i; } } struct sessionsaver_data { union control *editbox, *listbox, *loadbutton, *savebutton, *delbutton; union control *okbutton, *cancelbutton; char savedsession[2048]; struct sesslist *sesslist; }; /* * Helper function to load the session selected in the list box, if * any, as this is done in more than one place below. Returns 0 for * failure. */ static int load_selected_session(struct sessionsaver_data *ssd, void *dlg, Config *cfg) { int i = dlg_listbox_index(ssd->listbox, dlg); int isdef; if (i < 0) { dlg_beep(dlg); return 0; } isdef = !strcmp(ssd->sesslist->sessions[i], "Default Settings"); load_settings(ssd->sesslist->sessions[i], !isdef, cfg); if (!isdef) { strncpy(ssd->savedsession, ssd->sesslist->sessions[i], sizeof(ssd->savedsession)); ssd->savedsession[sizeof(ssd->savedsession)-1] = '\0'; } else { ssd->savedsession[0] = '\0'; } dlg_refresh(NULL, dlg); /* Restore the selection, which might have been clobbered by * changing the value of the edit box. */ dlg_listbox_select(ssd->listbox, dlg, i); return 1; } static void sessionsaver_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; struct sessionsaver_data *ssd = (struct sessionsaver_data *)ctrl->generic.context.p; if (event == EVENT_REFRESH) { if (ctrl == ssd->editbox) { dlg_editbox_set(ctrl, dlg, ssd->savedsession); } else if (ctrl == ssd->listbox) { int i; dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < ssd->sesslist->nsessions; i++) dlg_listbox_add(ctrl, dlg, ssd->sesslist->sessions[i]); dlg_update_done(ctrl, dlg); } } else if (event == EVENT_VALCHANGE) { if (ctrl == ssd->editbox) { dlg_editbox_get(ctrl, dlg, ssd->savedsession, sizeof(ssd->savedsession)); } } else if (event == EVENT_ACTION) { if (ctrl == ssd->listbox || ctrl == ssd->loadbutton) { /* * The user has double-clicked a session, or hit Load. * We must load the selected session, and then * terminate the configuration dialog _if_ there was a * double-click on the list box _and_ that session * contains a hostname. */ if (load_selected_session(ssd, dlg, cfg) && (ctrl == ssd->listbox && cfg->host[0])) { dlg_end(dlg, 1); /* it's all over, and succeeded */ } } else if (ctrl == ssd->savebutton) { int isdef = !strcmp(ssd->savedsession, "Default Settings"); if (!ssd->savedsession[0]) { int i = dlg_listbox_index(ctrl, dlg); if (i < 0) { dlg_beep(dlg); return; } isdef = !strcmp(ssd->sesslist->sessions[i], "Default Settings"); if (!isdef) { strncpy(ssd->savedsession, ssd->sesslist->sessions[i], sizeof(ssd->savedsession)); ssd->savedsession[sizeof(ssd->savedsession)-1] = '\0'; } else { ssd->savedsession[0] = '\0'; } } save_settings(ssd->savedsession, isdef, cfg); get_sesslist(ssd->sesslist, FALSE); get_sesslist(ssd->sesslist, TRUE); dlg_refresh(ssd->editbox, dlg); dlg_refresh(ssd->listbox, dlg); } else if (ctrl == ssd->delbutton) { int i = dlg_listbox_index(ctrl, dlg); if (i <= 0) { dlg_beep(dlg); } else { del_settings(ssd->sesslist->sessions[i]); get_sesslist(ssd->sesslist, FALSE); get_sesslist(ssd->sesslist, TRUE); dlg_refresh(ssd->listbox, dlg); } } else if (ctrl == ssd->okbutton) { /* * Annoying special case. If the `Open' button is * pressed while no host name is currently set, _and_ * the session list previously had the focus, _and_ * there was a session selected in that which had a * valid host name in it, then load it and go. */ if (dlg_last_focused(dlg) == ssd->listbox && !*cfg->host) { Config cfg2; if (!load_selected_session(ssd, dlg, &cfg2)) { dlg_beep(dlg); return; } /* If at this point we have a valid session, go! */ if (*cfg2.host) { *cfg = cfg2; /* structure copy */ dlg_end(dlg, 1); } else dlg_beep(dlg); } /* * Otherwise, do the normal thing: if we have a valid * session, get going. */ if (*cfg->host) { dlg_end(dlg, 1); } else dlg_beep(dlg); } else if (ctrl == ssd->cancelbutton) { dlg_end(dlg, 0); } } } struct charclass_data { union control *listbox, *editbox, *button; }; static void charclass_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; struct charclass_data *ccd = (struct charclass_data *)ctrl->generic.context.p; if (event == EVENT_REFRESH) { if (ctrl == ccd->listbox) { int i; dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < 128; i++) { char str[100]; sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i, (i >= 0x21 && i != 0x7F) ? i : ' ', cfg->wordness[i]); dlg_listbox_add(ctrl, dlg, str); } dlg_update_done(ctrl, dlg); } } else if (event == EVENT_ACTION) { if (ctrl == ccd->button) { char str[100]; int i, n; dlg_editbox_get(ccd->editbox, dlg, str, sizeof(str)); n = atoi(str); for (i = 0; i < 128; i++) { if (dlg_listbox_issel(ccd->listbox, dlg, i)) cfg->wordness[i] = n; } dlg_refresh(ccd->listbox, dlg); } } } struct colour_data { union control *listbox, *rgbtext, *button; }; static const char *const colours[] = { "Default Foreground", "Default Bold Foreground", "Default Background", "Default Bold Background", "Cursor Text", "Cursor Colour", "ANSI Black", "ANSI Black Bold", "ANSI Red", "ANSI Red Bold", "ANSI Green", "ANSI Green Bold", "ANSI Yellow", "ANSI Yellow Bold", "ANSI Blue", "ANSI Blue Bold", "ANSI Magenta", "ANSI Magenta Bold", "ANSI Cyan", "ANSI Cyan Bold", "ANSI White", "ANSI White Bold" }; static void colour_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; struct colour_data *cd = (struct colour_data *)ctrl->generic.context.p; int update = FALSE, r, g, b; if (event == EVENT_REFRESH) { if (ctrl == cd->listbox) { int i; dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < lenof(colours); i++) dlg_listbox_add(ctrl, dlg, colours[i]); dlg_update_done(ctrl, dlg); dlg_text_set(cd->rgbtext, dlg, ""); } } else if (event == EVENT_SELCHANGE) { if (ctrl == cd->listbox) { /* The user has selected a colour. Update the RGB text. */ int i = dlg_listbox_index(ctrl, dlg); if (i < 0) { dlg_beep(dlg); return; } r = cfg->colours[i][0]; g = cfg->colours[i][1]; b = cfg->colours[i][2]; update = TRUE; } } else if (event == EVENT_ACTION) { if (ctrl == cd->button) { int i = dlg_listbox_index(cd->listbox, dlg); if (i < 0) { dlg_beep(dlg); return; } /* * Start a colour selector, which will send us an * EVENT_CALLBACK when it's finished and allow us to * pick up the results. */ dlg_coloursel_start(ctrl, dlg, cfg->colours[i][0], cfg->colours[i][1], cfg->colours[i][2]); } } else if (event == EVENT_CALLBACK) { if (ctrl == cd->button) { int i = dlg_listbox_index(cd->listbox, dlg); /* * Collect the results of the colour selector. Will * return nonzero on success, or zero if the colour * selector did nothing (user hit Cancel, for example). */ if (dlg_coloursel_results(ctrl, dlg, &r, &g, &b)) { cfg->colours[i][0] = r; cfg->colours[i][1] = g; cfg->colours[i][2] = b; update = TRUE; } } } if (update) { char buf[40]; sprintf(buf, "%02x/%02x/%02x", r, g, b); dlg_text_set(cd->rgbtext, dlg, buf); } } struct environ_data { union control *varbox, *valbox, *addbutton, *rembutton, *listbox; }; static void environ_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; struct environ_data *ed = (struct environ_data *)ctrl->generic.context.p; if (event == EVENT_REFRESH) { if (ctrl == ed->listbox) { char *p = cfg->environmt; dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); while (*p) { dlg_listbox_add(ctrl, dlg, p); p += strlen(p) + 1; } dlg_update_done(ctrl, dlg); } } else if (event == EVENT_ACTION) { if (ctrl == ed->addbutton) { char str[sizeof(cfg->environmt)]; char *p; dlg_editbox_get(ed->varbox, dlg, str, sizeof(str)-1); if (!*str) { dlg_beep(dlg); return; } p = str + strlen(str); *p++ = '\t'; dlg_editbox_get(ed->valbox, dlg, p, sizeof(str)-1 - (p - str)); if (!*p) { dlg_beep(dlg); return; } p = cfg->environmt; while (*p) { while (*p) p++; p++; } if ((p - cfg->environmt) + strlen(str) + 2 < sizeof(cfg->environmt)) { strcpy(p, str); p[strlen(str) + 1] = '\0'; dlg_listbox_add(ed->listbox, dlg, str); dlg_editbox_set(ed->varbox, dlg, ""); dlg_editbox_set(ed->valbox, dlg, ""); } else { dlg_error_msg(dlg, "Environment too big"); } } else if (ctrl == ed->rembutton) { int i = dlg_listbox_index(ed->listbox, dlg); if (i < 0) { dlg_beep(dlg); } else { char *p, *q; dlg_listbox_del(ed->listbox, dlg, i); p = cfg->environmt; while (i > 0) { if (!*p) goto disaster; while (*p) p++; p++; i--; } q = p; if (!*p) goto disaster; while (*p) p++; p++; while (*p) { while (*p) *q++ = *p++; *q++ = *p++; } *q = '\0'; disaster:; } } } } struct portfwd_data { union control *addbutton, *rembutton, *listbox; union control *sourcebox, *destbox, *direction; }; static void portfwd_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; struct portfwd_data *pfd = (struct portfwd_data *)ctrl->generic.context.p; if (event == EVENT_REFRESH) { if (ctrl == pfd->listbox) { char *p = cfg->portfwd; dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); while (*p) { dlg_listbox_add(ctrl, dlg, p); p += strlen(p) + 1; } dlg_update_done(ctrl, dlg); } } else if (event == EVENT_ACTION) { if (ctrl == pfd->addbutton) { char str[sizeof(cfg->portfwd)]; char *p; if (dlg_radiobutton_get(pfd->direction, dlg) == 0) str[0] = 'L'; else str[0] = 'R'; dlg_editbox_get(pfd->sourcebox, dlg, str+1, sizeof(str) - 2); if (!str[1]) { dlg_error_msg(dlg, "You need to specify a source port number"); return; } p = str + strlen(str); *p++ = '\t'; dlg_editbox_get(pfd->destbox, dlg, p, sizeof(str)-1 - (p - str)); if (!*p || !strchr(p, ':')) { dlg_error_msg(dlg, "You need to specify a destination address\n" "in the form \"host.name:port\""); return; } p = cfg->portfwd; while (*p) { while (*p) p++; p++; } if ((p - cfg->portfwd) + strlen(str) + 2 < sizeof(cfg->portfwd)) { strcpy(p, str); p[strlen(str) + 1] = '\0'; dlg_listbox_add(pfd->listbox, dlg, str); dlg_editbox_set(pfd->sourcebox, dlg, ""); dlg_editbox_set(pfd->destbox, dlg, ""); } else { dlg_error_msg(dlg, "Too many forwardings"); } } else if (ctrl == pfd->rembutton) { int i = dlg_listbox_index(pfd->listbox, dlg); if (i < 0) dlg_beep(dlg); else { char *p, *q; dlg_listbox_del(pfd->listbox, dlg, i); p = cfg->portfwd; while (i > 0) { if (!*p) goto disaster2; while (*p) p++; p++; i--; } q = p; if (!*p) goto disaster2; while (*p) p++; p++; while (*p) { while (*p) *q++ = *p++; *q++ = *p++; } *q = '\0'; disaster2:; } } } } void setup_config_box(struct controlbox *b, struct sesslist *sesslist, int midsession, int protocol) { struct controlset *s; struct sessionsaver_data *ssd; struct charclass_data *ccd; struct colour_data *cd; struct environ_data *ed; struct portfwd_data *pfd; union control *c; ssd = (struct sessionsaver_data *) ctrl_alloc(b, sizeof(struct sessionsaver_data)); ssd->sesslist = (midsession ? NULL : sesslist); /* * The standard panel that appears at the bottom of all panels: * Open, Cancel, Apply etc. */ s = ctrl_getset(b, "", "", ""); ctrl_columns(s, 5, 20, 20, 20, 20, 20); ssd->okbutton = ctrl_pushbutton(s, (midsession ? "Apply" : "Open"), (char)(midsession ? 'a' : 'o'), HELPCTX(no_help), sessionsaver_handler, P(ssd)); ssd->okbutton->button.isdefault = TRUE; ssd->okbutton->generic.column = 3; ssd->cancelbutton = ctrl_pushbutton(s, "Cancel", 'c', HELPCTX(no_help), sessionsaver_handler, P(ssd)); ssd->cancelbutton->generic.column = 4; /* We carefully don't close the 5-column part, so that platform- * specific add-ons can put extra buttons alongside Open and Cancel. */ /* * The Session panel. */ ctrl_settitle(b, "Session", "Basic options for your PuTTY session"); if (!midsession) { s = ctrl_getset(b, "Session", "hostport", "Specify your connection by host name or IP address"); ctrl_columns(s, 2, 75, 25); c = ctrl_editbox(s, "Host Name (or IP address)", 'n', 100, HELPCTX(session_hostname), dlg_stdeditbox_handler, I(offsetof(Config,host)), I(sizeof(((Config *)0)->host))); c->generic.column = 0; c = ctrl_editbox(s, "Port", 'p', 100, HELPCTX(session_hostname), dlg_stdeditbox_handler, I(offsetof(Config,port)), I(-1)); c->generic.column = 1; ctrl_columns(s, 1, 100); if (backends[3].backend == NULL) { ctrl_radiobuttons(s, "Protocol:", NO_SHORTCUT, 3, HELPCTX(session_hostname), protocolbuttons_handler, P(c), "Raw", 'r', I(PROT_RAW), "Telnet", 't', I(PROT_TELNET), "Rlogin", 'i', I(PROT_RLOGIN), NULL); } else { ctrl_radiobuttons(s, "Protocol:", NO_SHORTCUT, 4, HELPCTX(session_hostname), protocolbuttons_handler, P(c), "Raw", 'r', I(PROT_RAW), "Telnet", 't', I(PROT_TELNET), "Rlogin", 'i', I(PROT_RLOGIN), "SSH", 's', I(PROT_SSH), NULL); } s = ctrl_getset(b, "Session", "savedsessions", "Load, save or delete a stored session"); ctrl_columns(s, 2, 75, 25); ssd->savedsession[0] = '\0'; ssd->sesslist = sesslist; ssd->editbox = ctrl_editbox(s, "Saved Sessions", 'e', 100, HELPCTX(session_saved), sessionsaver_handler, P(ssd), P(NULL)); ssd->editbox->generic.column = 0; /* Reset columns so that the buttons are alongside the list, rather * than alongside that edit box. */ ctrl_columns(s, 1, 100); ctrl_columns(s, 2, 75, 25); ssd->loadbutton = ctrl_pushbutton(s, "Load", 'l', HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->loadbutton->generic.column = 1; ssd->savebutton = ctrl_pushbutton(s, "Save", 'v', HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->savebutton->generic.column = 1; ssd->delbutton = ctrl_pushbutton(s, "Delete", 'd', HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->delbutton->generic.column = 1; ssd->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT, HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->listbox->generic.column = 0; ssd->listbox->listbox.height = 7; ctrl_columns(s, 1, 100); } s = ctrl_getset(b, "Session", "otheropts", NULL); c = ctrl_radiobuttons(s, "Close window on exit:", 'w', 4, HELPCTX(session_coe), dlg_stdradiobutton_handler, I(offsetof(Config, close_on_exit)), "Always", I(FORCE_ON), "Never", I(FORCE_OFF), "Only on clean exit", I(AUTO), NULL); /* * The Session/Logging panel. */ ctrl_settitle(b, "Session/Logging", "Options controlling session logging"); s = ctrl_getset(b, "Session/Logging", "main", NULL); ctrl_radiobuttons(s, "Session logging:", NO_SHORTCUT, 1, HELPCTX(logging_main), dlg_stdradiobutton_handler, I(offsetof(Config, logtype)), "Logging turned off completely", 't', I(LGTYP_NONE), "Log printable output only", 'p', I(LGTYP_ASCII), "Log all session output", 'l', I(LGTYP_DEBUG), "Log SSH packet data", 's', I(LGTYP_PACKETS), NULL); ctrl_filesel(s, "Log file name:", 'f', NULL, TRUE, "Select session log file name", HELPCTX(logging_filename), dlg_stdfilesel_handler, I(offsetof(Config, logfilename))); ctrl_text(s, "(Log file name can contain &Y, &M, &D for date," " &T for time, and &H for host name)", HELPCTX(logging_filename)); ctrl_radiobuttons(s, "What to do if the log file already exists:", 'e', 1, HELPCTX(logging_exists), dlg_stdradiobutton_handler, I(offsetof(Config,logxfovr)), "Always overwrite it", I(LGXF_OVR), "Always append to the end of it", I(LGXF_APN), "Ask the user every time", I(LGXF_ASK), NULL); /* * The Terminal panel. */ ctrl_settitle(b, "Terminal", "Options controlling the terminal emulation"); s = ctrl_getset(b, "Terminal", "general", "Set various terminal options"); ctrl_checkbox(s, "Auto wrap mode initially on", 'w', HELPCTX(terminal_autowrap), dlg_stdcheckbox_handler, I(offsetof(Config,wrap_mode))); ctrl_checkbox(s, "DEC Origin Mode initially on", 'd', HELPCTX(terminal_decom), dlg_stdcheckbox_handler, I(offsetof(Config,dec_om))); ctrl_checkbox(s, "Implicit CR in every LF", 'r', HELPCTX(terminal_lfhascr), dlg_stdcheckbox_handler, I(offsetof(Config,lfhascr))); ctrl_checkbox(s, "Use background colour to erase screen", 'e', HELPCTX(terminal_bce), dlg_stdcheckbox_handler, I(offsetof(Config,bce))); ctrl_checkbox(s, "Enable blinking text", 'n', HELPCTX(terminal_blink), dlg_stdcheckbox_handler, I(offsetof(Config,blinktext))); ctrl_editbox(s, "Answerback to ^E:", 's', 100, HELPCTX(terminal_answerback), dlg_stdeditbox_handler, I(offsetof(Config,answerback)), I(sizeof(((Config *)0)->answerback))); s = ctrl_getset(b, "Terminal", "ldisc", "Line discipline options"); ctrl_radiobuttons(s, "Local echo:", 'l', 3, HELPCTX(terminal_localecho), dlg_stdradiobutton_handler,I(offsetof(Config,localecho)), "Auto", I(AUTO), "Force on", I(FORCE_ON), "Force off", I(FORCE_OFF), NULL); ctrl_radiobuttons(s, "Local line editing:", 't', 3, HELPCTX(terminal_localedit), dlg_stdradiobutton_handler,I(offsetof(Config,localedit)), "Auto", I(AUTO), "Force on", I(FORCE_ON), "Force off", I(FORCE_OFF), NULL); s = ctrl_getset(b, "Terminal", "printing", "Remote-controlled printing"); ctrl_combobox(s, "Printer to send ANSI printer output to:", 'p', 100, HELPCTX(terminal_printing), printerbox_handler, P(NULL), P(NULL)); /* * The Terminal/Keyboard panel. */ ctrl_settitle(b, "Terminal/Keyboard", "Options controlling the effects of keys"); s = ctrl_getset(b, "Terminal/Keyboard", "mappings", "Change the sequences sent by:"); ctrl_radiobuttons(s, "The Backspace key", 'b', 2, HELPCTX(keyboard_backspace), dlg_stdradiobutton_handler, I(offsetof(Config, bksp_is_delete)), "Control-H", I(0), "Control-? (127)", I(1), NULL); ctrl_radiobuttons(s, "The Home and End keys", 'e', 2, HELPCTX(keyboard_homeend), dlg_stdradiobutton_handler, I(offsetof(Config, rxvt_homeend)), "Standard", I(0), "rxvt", I(1), NULL); ctrl_radiobuttons(s, "The Function keys and keypad", 'f', 3, HELPCTX(keyboard_funkeys), dlg_stdradiobutton_handler, I(offsetof(Config, funky_type)), "ESC[n~", I(0), "Linux", I(1), "Xterm R6", I(2), "VT400", I(3), "VT100+", I(4), "SCO", I(5), NULL); s = ctrl_getset(b, "Terminal/Keyboard", "appkeypad", "Application keypad settings:"); ctrl_radiobuttons(s, "Initial state of cursor keys:", 'r', 3, HELPCTX(keyboard_appcursor), dlg_stdradiobutton_handler, I(offsetof(Config, app_cursor)), "Normal", I(0), "Application", I(1), NULL); ctrl_radiobuttons(s, "Initial state of numeric keypad:", 'n', 3, HELPCTX(keyboard_appkeypad), numeric_keypad_handler, P(NULL), "Normal", I(0), "Application", I(1), "NetHack", I(2), NULL); /* * The Terminal/Bell panel. */ ctrl_settitle(b, "Terminal/Bell", "Options controlling the terminal bell"); s = ctrl_getset(b, "Terminal/Bell", "style", "Set the style of bell"); ctrl_radiobuttons(s, "Action to happen when a bell occurs:", 'b', 1, HELPCTX(bell_style), dlg_stdradiobutton_handler, I(offsetof(Config, beep)), "None (bell disabled)", I(BELL_DISABLED), "Make default system alert sound", I(BELL_DEFAULT), "Visual bell (flash window)", I(BELL_VISUAL), NULL); s = ctrl_getset(b, "Terminal/Bell", "overload", "Control the bell overload behaviour"); ctrl_checkbox(s, "Bell is temporarily disabled when over-used", 'd', HELPCTX(bell_overload), dlg_stdcheckbox_handler, I(offsetof(Config,bellovl))); ctrl_editbox(s, "Over-use means this many bells...", 'm', 20, HELPCTX(bell_overload), dlg_stdeditbox_handler, I(offsetof(Config,bellovl_n)), I(-1)); ctrl_editbox(s, "... in this many seconds", 't', 20, HELPCTX(bell_overload), dlg_stdeditbox_handler, I(offsetof(Config,bellovl_t)), I(-1000)); ctrl_text(s, "The bell is re-enabled after a few seconds of silence.", HELPCTX(bell_overload)); ctrl_editbox(s, "Seconds of silence required", 's', 20, HELPCTX(bell_overload), dlg_stdeditbox_handler, I(offsetof(Config,bellovl_s)), I(-1000)); /* * The Terminal/Features panel. */ ctrl_settitle(b, "Terminal/Features", "Enabling and disabling advanced terminal features"); s = ctrl_getset(b, "Terminal/Features", "main", NULL); ctrl_checkbox(s, "Disable application cursor keys mode", 'u', HELPCTX(features_application), dlg_stdcheckbox_handler, I(offsetof(Config,no_applic_c))); ctrl_checkbox(s, "Disable application keypad mode", 'k', HELPCTX(features_application), dlg_stdcheckbox_handler, I(offsetof(Config,no_applic_k))); ctrl_checkbox(s, "Disable xterm-style mouse reporting", 'x', HELPCTX(features_mouse), dlg_stdcheckbox_handler, I(offsetof(Config,no_mouse_rep))); ctrl_checkbox(s, "Disable remote-controlled terminal resizing", 's', HELPCTX(features_resize), dlg_stdcheckbox_handler, I(offsetof(Config,no_remote_resize))); ctrl_checkbox(s, "Disable switching to alternate terminal screen", 'w', HELPCTX(features_altscreen), dlg_stdcheckbox_handler, I(offsetof(Config,no_alt_screen))); ctrl_checkbox(s, "Disable remote-controlled window title changing", 't', HELPCTX(features_retitle), dlg_stdcheckbox_handler, I(offsetof(Config,no_remote_wintitle))); ctrl_checkbox(s, "Disable destructive backspace on server sending ^?",'b', HELPCTX(features_dbackspace), dlg_stdcheckbox_handler, I(offsetof(Config,no_dbackspace))); ctrl_checkbox(s, "Disable remote-controlled character set configuration", 'r', HELPCTX(features_charset), dlg_stdcheckbox_handler, I(offsetof(Config,no_remote_charset))); /* * The Window panel. */ ctrl_settitle(b, "Window", "Options controlling PuTTY's window"); s = ctrl_getset(b, "Window", "size", "Set the size of the window"); ctrl_columns(s, 2, 50, 50); c = ctrl_editbox(s, "Rows", 'r', 100, HELPCTX(window_size), dlg_stdeditbox_handler, I(offsetof(Config,height)),I(-1)); c->generic.column = 0; c = ctrl_editbox(s, "Columns", 'm', 100, HELPCTX(window_size), dlg_stdeditbox_handler, I(offsetof(Config,width)), I(-1)); c->generic.column = 1; ctrl_columns(s, 1, 100); s = ctrl_getset(b, "Window", "scrollback", "Control the scrollback in the window"); ctrl_editbox(s, "Lines of scrollback", 's', 50, HELPCTX(window_scrollback), dlg_stdeditbox_handler, I(offsetof(Config,savelines)), I(-1)); ctrl_checkbox(s, "Display scrollbar", 'd', HELPCTX(window_scrollback), dlg_stdcheckbox_handler, I(offsetof(Config,scrollbar))); ctrl_checkbox(s, "Display scrollbar in full screen mode", 'i', HELPCTX(window_scrollback), dlg_stdcheckbox_handler, I(offsetof(Config,scrollbar_in_fullscreen))); ctrl_checkbox(s, "Reset scrollback on keypress", 'k', HELPCTX(window_scrollback), dlg_stdcheckbox_handler, I(offsetof(Config,scroll_on_key))); ctrl_checkbox(s, "Reset scrollback on display activity", 'p', HELPCTX(window_scrollback), dlg_stdcheckbox_handler, I(offsetof(Config,scroll_on_disp))); /* * The Window/Appearance panel. */ ctrl_settitle(b, "Window/Appearance", "Configure the appearance of PuTTY's window"); s = ctrl_getset(b, "Window/Appearance", "cursor", "Adjust the use of the cursor"); ctrl_radiobuttons(s, "Cursor appearance:", NO_SHORTCUT, 3, HELPCTX(appearance_cursor), dlg_stdradiobutton_handler, I(offsetof(Config, cursor_type)), "Block", 'l', I(0), "Underline", 'u', I(1), "Vertical line", 'v', I(2), NULL); ctrl_checkbox(s, "Cursor blinks", 'b', HELPCTX(appearance_cursor), dlg_stdcheckbox_handler, I(offsetof(Config,blink_cur))); s = ctrl_getset(b, "Window/Appearance", "font", "Font settings"); ctrl_fontsel(s, "Font used in the terminal window", 'n', HELPCTX(appearance_font), dlg_stdfontsel_handler, I(offsetof(Config, font))); s = ctrl_getset(b, "Window/Appearance", "mouse", "Adjust the use of the mouse pointer"); ctrl_checkbox(s, "Hide mouse pointer when typing in window", 'p', HELPCTX(appearance_hidemouse), dlg_stdcheckbox_handler, I(offsetof(Config,hide_mouseptr))); s = ctrl_getset(b, "Window/Appearance", "border", "Adjust the window border"); ctrl_editbox(s, "Gap between text and window edge:", NO_SHORTCUT, 20, HELPCTX(appearance_border), dlg_stdeditbox_handler, I(offsetof(Config,window_border)), I(-1)); /* * The Window/Behaviour panel. */ ctrl_settitle(b, "Window/Behaviour", "Configure the behaviour of PuTTY's window"); s = ctrl_getset(b, "Window/Behaviour", "title", "Adjust the behaviour of the window title"); ctrl_editbox(s, "Window title:", 't', 100, HELPCTX(appearance_title), dlg_stdeditbox_handler, I(offsetof(Config,wintitle)), I(sizeof(((Config *)0)->wintitle))); ctrl_checkbox(s, "Separate window and icon titles", 'i', HELPCTX(appearance_title), dlg_stdcheckbox_handler, I(CHECKBOX_INVERT | offsetof(Config,win_name_always))); s = ctrl_getset(b, "Window/Behaviour", "main", NULL); ctrl_checkbox(s, "Warn before closing window", 'w', HELPCTX(behaviour_closewarn), dlg_stdcheckbox_handler, I(offsetof(Config,warn_on_close))); /* * The Window/Translation panel. */ ctrl_settitle(b, "Window/Translation", "Options controlling character set translation"); s = ctrl_getset(b, "Window/Translation", "trans", "Character set translation on received data"); ctrl_combobox(s, "Received data assumed to be in which character set:", 'r', 100, HELPCTX(translation_codepage), codepage_handler, P(NULL), P(NULL)); s = ctrl_getset(b, "Window/Translation", "linedraw", "Adjust how PuTTY displays line drawing characters"); ctrl_radiobuttons(s, "Handling of line drawing characters:", NO_SHORTCUT,1, HELPCTX(translation_linedraw), dlg_stdradiobutton_handler, I(offsetof(Config, vtmode)), "Font has XWindows encoding", 'x', I(VT_XWINDOWS), "Poor man's line drawing (+, - and |)",'p',I(VT_POORMAN), "Unicode mode", 'u', I(VT_UNICODE), NULL); /* * The Window/Selection panel. */ ctrl_settitle(b, "Window/Selection", "Options controlling copy and paste"); s = ctrl_getset(b, "Window/Selection", "trans", "Translation of pasted characters"); ctrl_checkbox(s, "Don't translate line drawing chars into +, - and |",'d', HELPCTX(selection_linedraw), dlg_stdcheckbox_handler, I(offsetof(Config,rawcnp))); s = ctrl_getset(b, "Window/Selection", "mouse", "Control use of mouse"); ctrl_checkbox(s, "Shift overrides application's use of mouse", 'p', HELPCTX(selection_shiftdrag), dlg_stdcheckbox_handler, I(offsetof(Config,mouse_override))); ctrl_radiobuttons(s, "Default selection mode (Alt+drag does the other one):", NO_SHORTCUT, 2, HELPCTX(selection_rect), dlg_stdradiobutton_handler, I(offsetof(Config, rect_select)), "Normal", 'n', I(0), "Rectangular block", 'r', I(1), NULL); s = ctrl_getset(b, "Window/Selection", "charclass", "Control the select-one-word-at-a-time mode"); ccd = (struct charclass_data *) ctrl_alloc(b, sizeof(struct charclass_data)); ccd->listbox = ctrl_listbox(s, "Character classes:", 'e', HELPCTX(selection_charclasses), charclass_handler, P(ccd)); ccd->listbox->listbox.multisel = 1; ccd->listbox->listbox.ncols = 4; ccd->listbox->listbox.percentages = smalloc(4*sizeof(int)); ccd->listbox->listbox.percentages[0] = 15; ccd->listbox->listbox.percentages[1] = 25; ccd->listbox->listbox.percentages[2] = 20; ccd->listbox->listbox.percentages[3] = 40; ctrl_columns(s, 2, 67, 33); ccd->editbox = ctrl_editbox(s, "Set to class", 't', 50, HELPCTX(selection_charclasses), charclass_handler, P(ccd), P(NULL)); ccd->editbox->generic.column = 0; ccd->button = ctrl_pushbutton(s, "Set", 's', HELPCTX(selection_charclasses), charclass_handler, P(ccd)); ccd->button->generic.column = 1; ctrl_columns(s, 1, 100); /* * The Window/Colours panel. */ ctrl_settitle(b, "Window/Colours", "Options controlling use of colours"); s = ctrl_getset(b, "Window/Colours", "general", "General options for colour usage"); ctrl_checkbox(s, "Bolded text is a different colour", 'b', HELPCTX(colours_bold), dlg_stdcheckbox_handler, I(offsetof(Config,bold_colour))); s = ctrl_getset(b, "Window/Colours", "adjust", "Adjust the precise colours PuTTY displays"); ctrl_text(s, "Select a colour from the list, and then click the" " Modify button to change its appearance.", HELPCTX(colours_config)); ctrl_columns(s, 2, 67, 33); cd = (struct colour_data *)ctrl_alloc(b, sizeof(struct colour_data)); cd->listbox = ctrl_listbox(s, "Select a colour to adjust:", 'u', HELPCTX(colours_config), colour_handler, P(cd)); cd->listbox->generic.column = 0; c = ctrl_text(s, "RGB value:", HELPCTX(colours_config)); c->generic.column = 1; cd->rgbtext = ctrl_text(s, "00/00/00", HELPCTX(colours_config)); cd->rgbtext->generic.column = 1; cd->button = ctrl_pushbutton(s, "Modify", 'm', HELPCTX(colours_config), colour_handler, P(cd)); cd->button->generic.column = 1; ctrl_columns(s, 1, 100); /* * The Connection panel. */ ctrl_settitle(b, "Connection", "Options controlling the connection"); if (!midsession) { s = ctrl_getset(b, "Connection", "data", "Data to send to the server"); ctrl_editbox(s, "Terminal-type string", 't', 50, HELPCTX(connection_termtype), dlg_stdeditbox_handler, I(offsetof(Config,termtype)), I(sizeof(((Config *)0)->termtype))); ctrl_editbox(s, "Auto-login username", 'u', 50, HELPCTX(connection_username), dlg_stdeditbox_handler, I(offsetof(Config,username)), I(sizeof(((Config *)0)->username))); } s = ctrl_getset(b, "Connection", "keepalive", "Sending of null packets to keep session active"); ctrl_editbox(s, "Seconds between keepalives (0 to turn off)", 'k', 20, HELPCTX(connection_keepalive), dlg_stdeditbox_handler, I(offsetof(Config,ping_interval)), I(-1)); if (!midsession) { s = ctrl_getset(b, "Connection", "tcp", "Low-level TCP connection options"); ctrl_checkbox(s, "Disable Nagle's algorithm (TCP_NODELAY option)", 'n', HELPCTX(connection_nodelay), dlg_stdcheckbox_handler, I(offsetof(Config,tcp_nodelay))); } if (!midsession) { /* * The Connection/Proxy panel. */ ctrl_settitle(b, "Connection/Proxy", "Options controlling proxy usage"); s = ctrl_getset(b, "Connection/Proxy", "basics", "Proxy basics"); ctrl_radiobuttons(s, "Proxy type:", NO_SHORTCUT, 4, HELPCTX(proxy_type), dlg_stdradiobutton_handler, I(offsetof(Config, proxy_type)), "None", 'n', I(PROXY_NONE), "HTTP", 't', I(PROXY_HTTP), "SOCKS", 's', I(PROXY_SOCKS), "Telnet", 'l', I(PROXY_TELNET), NULL); ctrl_columns(s, 2, 80, 20); c = ctrl_editbox(s, "Proxy hostname", 'y', 100, HELPCTX(proxy_main), dlg_stdeditbox_handler, I(offsetof(Config,proxy_host)), I(sizeof(((Config *)0)->proxy_host))); c->generic.column = 0; c = ctrl_editbox(s, "Port", 'p', 100, HELPCTX(proxy_main), dlg_stdeditbox_handler, I(offsetof(Config,proxy_port)), I(-1)); c->generic.column = 1; ctrl_columns(s, 1, 100); ctrl_editbox(s, "Exclude Hosts/IPs", 'e', 100, HELPCTX(proxy_exclude), dlg_stdeditbox_handler, I(offsetof(Config,proxy_exclude_list)), I(sizeof(((Config *)0)->proxy_exclude_list))); ctrl_checkbox(s, "Consider proxying local host connections", 'x', HELPCTX(proxy_exclude), dlg_stdcheckbox_handler, I(offsetof(Config,even_proxy_localhost))); ctrl_radiobuttons(s, "Do DNS name lookup at proxy end:", 'd', 3, HELPCTX(proxy_dns), dlg_stdradiobutton_handler, I(offsetof(Config, proxy_dns)), "No", I(FORCE_OFF), "Auto", I(AUTO), "Yes", I(FORCE_ON), NULL); ctrl_editbox(s, "Username", 'u', 60, HELPCTX(proxy_auth), dlg_stdeditbox_handler, I(offsetof(Config,proxy_username)), I(sizeof(((Config *)0)->proxy_username))); c = ctrl_editbox(s, "Password", 'w', 60, HELPCTX(proxy_auth), dlg_stdeditbox_handler, I(offsetof(Config,proxy_password)), I(sizeof(((Config *)0)->proxy_password))); c->editbox.password = 1; s = ctrl_getset(b, "Connection/Proxy", "misc", "Miscellaneous proxy settings"); ctrl_editbox(s, "Telnet command", 'm', 100, HELPCTX(proxy_command), dlg_stdeditbox_handler, I(offsetof(Config,proxy_telnet_command)), I(sizeof(((Config *)0)->proxy_telnet_command))); ctrl_radiobuttons(s, "SOCKS Version", 'v', 2, HELPCTX(proxy_socksver), dlg_stdradiobutton_handler, I(offsetof(Config, proxy_socks_version)), "Version 5", I(5), "Version 4", I(4), NULL); } /* * The Telnet panel exists in the base config box, and in a * mid-session reconfig box _if_ we're using Telnet. */ if (!midsession || protocol == PROT_TELNET) { /* * The Connection/Telnet panel. */ ctrl_settitle(b, "Connection/Telnet", "Options controlling Telnet connections"); if (!midsession) { s = ctrl_getset(b, "Connection/Telnet", "data", "Data to send to the server"); ctrl_editbox(s, "Terminal-speed string", 's', 50, HELPCTX(telnet_termspeed), dlg_stdeditbox_handler, I(offsetof(Config,termspeed)), I(sizeof(((Config *)0)->termspeed))); ctrl_text(s, "Environment variables:", HELPCTX(telnet_environ)); ctrl_columns(s, 2, 80, 20); ed = (struct environ_data *) ctrl_alloc(b, sizeof(struct environ_data)); ed->varbox = ctrl_editbox(s, "Variable", 'v', 60, HELPCTX(telnet_environ), environ_handler, P(ed), P(NULL)); ed->varbox->generic.column = 0; ed->valbox = ctrl_editbox(s, "Value", 'l', 60, HELPCTX(telnet_environ), environ_handler, P(ed), P(NULL)); ed->valbox->generic.column = 0; ed->addbutton = ctrl_pushbutton(s, "Add", 'd', HELPCTX(telnet_environ), environ_handler, P(ed)); ed->addbutton->generic.column = 1; ed->rembutton = ctrl_pushbutton(s, "Remove", 'r', HELPCTX(telnet_environ), environ_handler, P(ed)); ed->rembutton->generic.column = 1; ctrl_columns(s, 1, 100); ed->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT, HELPCTX(telnet_environ), environ_handler, P(ed)); ed->listbox->listbox.height = 3; } s = ctrl_getset(b, "Connection/Telnet", "protocol", "Telnet protocol adjustments"); if (!midsession) { ctrl_radiobuttons(s, "Handling of OLD_ENVIRON ambiguity:", NO_SHORTCUT, 2, HELPCTX(telnet_oldenviron), dlg_stdradiobutton_handler, I(offsetof(Config, rfc_environ)), "BSD (commonplace)", 'b', I(0), "RFC 1408 (unusual)", 'f', I(1), NULL); ctrl_radiobuttons(s, "Telnet negotiation mode:", 't', 2, HELPCTX(telnet_passive), dlg_stdradiobutton_handler, I(offsetof(Config, passive_telnet)), "Passive", I(1), "Active", I(0), NULL); } ctrl_checkbox(s, "Keyboard sends telnet Backspace and Interrupt", 'k', HELPCTX(telnet_specialkeys), dlg_stdcheckbox_handler, I(offsetof(Config,telnet_keyboard))); ctrl_checkbox(s, "Return key sends telnet New Line instead of ^M", NO_SHORTCUT, HELPCTX(telnet_newline), dlg_stdcheckbox_handler, I(offsetof(Config,telnet_newline))); } if (!midsession) { /* * The Connection/Rlogin panel. */ ctrl_settitle(b, "Connection/Rlogin", "Options controlling Rlogin connections"); s = ctrl_getset(b, "Connection/Rlogin", "data", "Data to send to the server"); ctrl_editbox(s, "Terminal-speed string", 's', 50, HELPCTX(rlogin_termspeed), dlg_stdeditbox_handler, I(offsetof(Config,termspeed)), I(sizeof(((Config *)0)->termspeed))); ctrl_editbox(s, "Local username:", 'l', 50, HELPCTX(rlogin_localuser), dlg_stdeditbox_handler, I(offsetof(Config,localusername)), I(sizeof(((Config *)0)->localusername))); } /* * All the SSH stuff is omitted in PuTTYtel. */ if (!midsession && backends[3].backend != NULL) { /* * The Connection/SSH panel. */ ctrl_settitle(b, "Connection/SSH", "Options controlling SSH connections"); s = ctrl_getset(b, "Connection/SSH", "data", "Data to send to the server"); ctrl_editbox(s, "Remote command:", 'r', 100, HELPCTX(ssh_command), dlg_stdeditbox_handler, I(offsetof(Config,remote_cmd)), I(sizeof(((Config *)0)->remote_cmd))); s = ctrl_getset(b, "Connection/SSH", "protocol", "Protocol options"); ctrl_checkbox(s, "Don't allocate a pseudo-terminal", 'p', HELPCTX(ssh_nopty), dlg_stdcheckbox_handler, I(offsetof(Config,nopty))); ctrl_checkbox(s, "Enable compression", 'e', HELPCTX(ssh_compress), dlg_stdcheckbox_handler, I(offsetof(Config,compression))); ctrl_radiobuttons(s, "Preferred SSH protocol version:", NO_SHORTCUT, 4, HELPCTX(ssh_protocol), dlg_stdradiobutton_handler, I(offsetof(Config, sshprot)), "1 only", 'l', I(0), "1", '1', I(1), "2", '2', I(2), "2 only", 'n', I(3), NULL); s = ctrl_getset(b, "Connection/SSH", "encryption", "Encryption options"); ctrl_draglist(s, "Encryption cipher selection policy:", 's', HELPCTX(ssh_ciphers), cipherlist_handler, P(NULL)); ctrl_checkbox(s, "Enable non-standard use of single-DES in SSH 2", 'i', HELPCTX(ssh_ciphers), dlg_stdcheckbox_handler, I(offsetof(Config,ssh2_des_cbc))); /* * The Connection/SSH/Auth panel. */ ctrl_settitle(b, "Connection/SSH/Auth", "Options controlling SSH authentication"); s = ctrl_getset(b, "Connection/SSH/Auth", "methods", "Authentication methods"); ctrl_checkbox(s, "Attempt TIS or CryptoCard auth (SSH1)", 'm', HELPCTX(ssh_auth_tis), dlg_stdcheckbox_handler, I(offsetof(Config,try_tis_auth))); ctrl_checkbox(s, "Attempt \"keyboard-interactive\" auth (SSH2)", 'i', HELPCTX(ssh_auth_ki), dlg_stdcheckbox_handler, I(offsetof(Config,try_ki_auth))); s = ctrl_getset(b, "Connection/SSH/Auth", "params", "Authentication parameters"); ctrl_checkbox(s, "Allow agent forwarding", 'f', HELPCTX(ssh_auth_agentfwd), dlg_stdcheckbox_handler, I(offsetof(Config,agentfwd))); ctrl_checkbox(s, "Allow attempted changes of username in SSH2", 'u', HELPCTX(ssh_auth_changeuser), dlg_stdcheckbox_handler, I(offsetof(Config,change_username))); ctrl_filesel(s, "Private key file for authentication:", 'k', FILTER_KEY_FILES, FALSE, "Select private key file", HELPCTX(ssh_auth_privkey), dlg_stdfilesel_handler, I(offsetof(Config, keyfile))); /* * The Connection/SSH/Tunnels panel. */ ctrl_settitle(b, "Connection/SSH/Tunnels", "Options controlling SSH tunnelling"); s = ctrl_getset(b, "Connection/SSH/Tunnels", "x11", "X11 forwarding"); ctrl_checkbox(s, "Enable X11 forwarding", 'e', HELPCTX(ssh_tunnels_x11), dlg_stdcheckbox_handler,I(offsetof(Config,x11_forward))); ctrl_editbox(s, "X display location", 'x', 50, HELPCTX(ssh_tunnels_x11), dlg_stdeditbox_handler, I(offsetof(Config,x11_display)), I(sizeof(((Config *)0)->x11_display))); ctrl_radiobuttons(s, "Remote X11 authentication protocol", 'u', 2, HELPCTX(ssh_tunnels_x11auth), dlg_stdradiobutton_handler, I(offsetof(Config, x11_auth)), "MIT-Magic-Cookie-1", I(X11_MIT), "XDM-Authorization-1", I(X11_XDM), NULL); s = ctrl_getset(b, "Connection/SSH/Tunnels", "portfwd", "Port forwarding"); ctrl_checkbox(s, "Local ports accept connections from other hosts",'t', HELPCTX(ssh_tunnels_portfwd_localhost), dlg_stdcheckbox_handler, I(offsetof(Config,lport_acceptall))); ctrl_checkbox(s, "Remote ports do the same (SSH v2 only)", 'p', HELPCTX(ssh_tunnels_portfwd_localhost), dlg_stdcheckbox_handler, I(offsetof(Config,rport_acceptall))); ctrl_columns(s, 3, 55, 20, 25); c = ctrl_text(s, "Forwarded ports:", HELPCTX(ssh_tunnels_portfwd)); c->generic.column = COLUMN_FIELD(0,2); /* You want to select from the list, _then_ hit Remove. So tab order * should be that way round. */ pfd = (struct portfwd_data *)ctrl_alloc(b,sizeof(struct portfwd_data)); pfd->rembutton = ctrl_pushbutton(s, "Remove", 'r', HELPCTX(ssh_tunnels_portfwd), portfwd_handler, P(pfd)); pfd->rembutton->generic.column = 2; pfd->rembutton->generic.tabdelay = 1; pfd->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT, HELPCTX(ssh_tunnels_portfwd), portfwd_handler, P(pfd)); pfd->listbox->listbox.height = 3; ctrl_tabdelay(s, pfd->rembutton); ctrl_text(s, "Add new forwarded port:", HELPCTX(ssh_tunnels_portfwd)); /* You want to enter source, destination and type, _then_ hit Add. * Again, we adjust the tab order to reflect this. */ pfd->addbutton = ctrl_pushbutton(s, "Add", 'd', HELPCTX(ssh_tunnels_portfwd), portfwd_handler, P(pfd)); pfd->addbutton->generic.column = 2; pfd->addbutton->generic.tabdelay = 1; pfd->sourcebox = ctrl_editbox(s, "Source port", 's', 40, HELPCTX(ssh_tunnels_portfwd), portfwd_handler, P(pfd), P(NULL)); pfd->sourcebox->generic.column = 0; pfd->destbox = ctrl_editbox(s, "Destination", 'i', 67, HELPCTX(ssh_tunnels_portfwd), portfwd_handler, P(pfd), P(NULL)); pfd->direction = ctrl_radiobuttons(s, NULL, NO_SHORTCUT, 2, HELPCTX(ssh_tunnels_portfwd), portfwd_handler, P(pfd), "Local", 'l', P(NULL), "Remote", 'm', P(NULL), NULL); ctrl_tabdelay(s, pfd->addbutton); ctrl_columns(s, 1, 100); /* * The Connection/SSH/Bugs panel. */ ctrl_settitle(b, "Connection/SSH/Bugs", "Workarounds for SSH server bugs"); s = ctrl_getset(b, "Connection/SSH/Bugs", "main", "Detection of known bugs in SSH servers"); ctrl_droplist(s, "Chokes on SSH1 ignore messages", 'i', 20, HELPCTX(ssh_bugs_ignore1), sshbug_handler, I(offsetof(Config,sshbug_ignore1))); ctrl_droplist(s, "Refuses all SSH1 password camouflage", 's', 20, HELPCTX(ssh_bugs_plainpw1), sshbug_handler, I(offsetof(Config,sshbug_plainpw1))); ctrl_droplist(s, "Chokes on SSH1 RSA authentication", 'r', 20, HELPCTX(ssh_bugs_rsa1), sshbug_handler, I(offsetof(Config,sshbug_rsa1))); ctrl_droplist(s, "Miscomputes SSH2 HMAC keys", 'm', 20, HELPCTX(ssh_bugs_hmac2), sshbug_handler, I(offsetof(Config,sshbug_hmac2))); ctrl_droplist(s, "Miscomputes SSH2 encryption keys", 'e', 20, HELPCTX(ssh_bugs_derivekey2), sshbug_handler, I(offsetof(Config,sshbug_derivekey2))); ctrl_droplist(s, "Requires padding on SSH2 RSA signatures", 'p', 20, HELPCTX(ssh_bugs_rsapad2), sshbug_handler, I(offsetof(Config,sshbug_rsapad2))); ctrl_droplist(s, "Chokes on Diffie-Hellman group exchange", 'd', 20, HELPCTX(ssh_bugs_dhgex2), sshbug_handler, I(offsetof(Config,sshbug_dhgex2))); ctrl_droplist(s, "Misuses the session ID in PK auth", 'n', 20, HELPCTX(ssh_bugs_pksessid2), sshbug_handler, I(offsetof(Config,sshbug_pksessid2))); } } Node-path: putty/dialog.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 17505 Text-content-md5: fad7ad12c4720b5d1bd294241fe03cdb Text-content-sha1: 9cd0ada341c23d3c6bec73946477b968dce9567a Content-length: 17621 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNPPP/* * dialog.c - a reasonably platform-independent mechanism for * describing dialog boxes. */ #include #include #include #define DEFINE_INTORPTR_FNS #include "putty.h" #include "dialog.h" int ctrl_path_elements(char *path) { int i = 1; while (*path) { if (*path == '/') i++; path++; } return i; } /* Return the number of matching path elements at the starts of p1 and p2, * or INT_MAX if the paths are identical. */ int ctrl_path_compare(char *p1, char *p2) { int i = 0; while (*p1 || *p2) { if ((*p1 == '/' || *p1 == '\0') && (*p2 == '/' || *p2 == '\0')) i++; /* a whole element matches, ooh */ if (*p1 != *p2) return i; /* mismatch */ p1++, p2++; } return INT_MAX; /* exact match */ } struct controlbox *ctrl_new_box(void) { struct controlbox *ret = smalloc(sizeof(struct controlbox)); ret->nctrlsets = ret->ctrlsetsize = 0; ret->ctrlsets = NULL; ret->nfrees = ret->freesize = 0; ret->frees = NULL; return ret; } void ctrl_free_box(struct controlbox *b) { int i; for (i = 0; i < b->nctrlsets; i++) { ctrl_free_set(b->ctrlsets[i]); } for (i = 0; i < b->nfrees; i++) sfree(b->frees[i]); sfree(b->ctrlsets); sfree(b->frees); sfree(b); } void ctrl_free_set(struct controlset *s) { int i; sfree(s->pathname); sfree(s->boxname); sfree(s->boxtitle); for (i = 0; i < s->ncontrols; i++) { ctrl_free(s->ctrls[i]); } sfree(s->ctrls); sfree(s); } /* * Find the index of first controlset in a controlbox for a given * path. If that path doesn't exist, return the index where it * should be inserted. */ static int ctrl_find_set(struct controlbox *b, char *path, int start) { int i, last, thisone; last = 0; for (i = 0; i < b->nctrlsets; i++) { thisone = ctrl_path_compare(path, b->ctrlsets[i]->pathname); /* * If `start' is true and there exists a controlset with * exactly the path we've been given, we should return the * index of the first such controlset we find. Otherwise, * we should return the index of the first entry in which * _fewer_ path elements match than they did last time. */ if ((start && thisone == INT_MAX) || thisone < last) return i; last = thisone; } return b->nctrlsets; /* insert at end */ } /* * Find the index of next controlset in a controlbox for a given * path, or -1 if no such controlset exists. If -1 is passed as * input, finds the first. */ int ctrl_find_path(struct controlbox *b, char *path, int index) { if (index < 0) index = ctrl_find_set(b, path, 1); else index++; if (index < b->nctrlsets && !strcmp(path, b->ctrlsets[index]->pathname)) return index; else return -1; } /* Set up a panel title. */ struct controlset *ctrl_settitle(struct controlbox *b, char *path, char *title) { struct controlset *s = smalloc(sizeof(struct controlset)); int index = ctrl_find_set(b, path, 1); s->pathname = dupstr(path); s->boxname = NULL; s->boxtitle = dupstr(title); s->ncontrols = s->ctrlsize = 0; s->ncolumns = 0; /* this is a title! */ s->ctrls = NULL; if (b->nctrlsets >= b->ctrlsetsize) { b->ctrlsetsize = b->nctrlsets + 32; b->ctrlsets = srealloc(b->ctrlsets, b->ctrlsetsize*sizeof(*b->ctrlsets)); } if (index < b->nctrlsets) memmove(&b->ctrlsets[index+1], &b->ctrlsets[index], (b->nctrlsets-index) * sizeof(*b->ctrlsets)); b->ctrlsets[index] = s; b->nctrlsets++; return s; } /* Retrieve a pointer to a controlset, creating it if absent. */ struct controlset *ctrl_getset(struct controlbox *b, char *path, char *name, char *boxtitle) { struct controlset *s; int index = ctrl_find_set(b, path, 1); while (index < b->nctrlsets && !strcmp(b->ctrlsets[index]->pathname, path)) { if (b->ctrlsets[index]->boxname && !strcmp(b->ctrlsets[index]->boxname, name)) return b->ctrlsets[index]; index++; } s = smalloc(sizeof(struct controlset)); s->pathname = dupstr(path); s->boxname = dupstr(name); s->boxtitle = boxtitle ? dupstr(boxtitle) : NULL; s->ncolumns = 1; s->ncontrols = s->ctrlsize = 0; s->ctrls = NULL; if (b->nctrlsets >= b->ctrlsetsize) { b->ctrlsetsize = b->nctrlsets + 32; b->ctrlsets = srealloc(b->ctrlsets, b->ctrlsetsize*sizeof(*b->ctrlsets)); } if (index < b->nctrlsets) memmove(&b->ctrlsets[index+1], &b->ctrlsets[index], (b->nctrlsets-index) * sizeof(*b->ctrlsets)); b->ctrlsets[index] = s; b->nctrlsets++; return s; } /* Allocate some private data in a controlbox. */ void *ctrl_alloc(struct controlbox *b, size_t size) { void *p; p = smalloc(size); if (b->nfrees >= b->freesize) { b->freesize = b->nfrees + 32; b->frees = srealloc(b->frees, b->freesize*sizeof(*b->frees)); } b->frees[b->nfrees++] = p; return p; } static union control *ctrl_new(struct controlset *s, int type, intorptr helpctx, handler_fn handler, intorptr context) { union control *c = smalloc(sizeof(union control)); if (s->ncontrols >= s->ctrlsize) { s->ctrlsize = s->ncontrols + 32; s->ctrls = srealloc(s->ctrls, s->ctrlsize * sizeof(*s->ctrls)); } s->ctrls[s->ncontrols++] = c; /* * Fill in the standard fields. */ c->generic.type = type; c->generic.tabdelay = 0; c->generic.column = COLUMN_FIELD(0, s->ncolumns); c->generic.helpctx = helpctx; c->generic.handler = handler; c->generic.context = context; c->generic.label = NULL; return c; } /* `ncolumns' is followed by that many percentages, as integers. */ union control *ctrl_columns(struct controlset *s, int ncolumns, ...) { union control *c = ctrl_new(s, CTRL_COLUMNS, P(NULL), NULL, P(NULL)); assert(s->ncolumns == 1 || ncolumns == 1); c->columns.ncols = ncolumns; s->ncolumns = ncolumns; if (ncolumns == 1) { c->columns.percentages = NULL; } else { va_list ap; int i; c->columns.percentages = smalloc(ncolumns * sizeof(int)); va_start(ap, ncolumns); for (i = 0; i < ncolumns; i++) c->columns.percentages[i] = va_arg(ap, int); va_end(ap); } return c; } union control *ctrl_editbox(struct controlset *s, char *label, char shortcut, int percentage, intorptr helpctx, handler_fn handler, intorptr context, intorptr context2) { union control *c = ctrl_new(s, CTRL_EDITBOX, helpctx, handler, context); c->editbox.label = label ? dupstr(label) : NULL; c->editbox.shortcut = shortcut; c->editbox.percentwidth = percentage; c->editbox.password = 0; c->editbox.has_list = 0; c->editbox.context2 = context2; return c; } union control *ctrl_combobox(struct controlset *s, char *label, char shortcut, int percentage, intorptr helpctx, handler_fn handler, intorptr context, intorptr context2) { union control *c = ctrl_new(s, CTRL_EDITBOX, helpctx, handler, context); c->editbox.label = label ? dupstr(label) : NULL; c->editbox.shortcut = shortcut; c->editbox.percentwidth = percentage; c->editbox.password = 0; c->editbox.has_list = 1; c->editbox.context2 = context2; return c; } /* * `ncolumns' is followed by (alternately) radio button titles and * intorptrs, until a NULL in place of a title string is seen. Each * title is expected to be followed by a shortcut _iff_ `shortcut' * is NO_SHORTCUT. */ union control *ctrl_radiobuttons(struct controlset *s, char *label, char shortcut, int ncolumns, intorptr helpctx, handler_fn handler, intorptr context, ...) { va_list ap; int i; union control *c = ctrl_new(s, CTRL_RADIO, helpctx, handler, context); c->radio.label = label ? dupstr(label) : NULL; c->radio.shortcut = shortcut; c->radio.ncolumns = ncolumns; /* * Initial pass along variable argument list to count the * buttons. */ va_start(ap, context); i = 0; while (va_arg(ap, char *) != NULL) { i++; if (c->radio.shortcut == NO_SHORTCUT) va_arg(ap, int); /* char promotes to int in arg lists */ va_arg(ap, intorptr); } va_end(ap); c->radio.nbuttons = i; if (c->radio.shortcut == NO_SHORTCUT) c->radio.shortcuts = smalloc(c->radio.nbuttons * sizeof(char)); else c->radio.shortcuts = NULL; c->radio.buttons = smalloc(c->radio.nbuttons * sizeof(char *)); c->radio.buttondata = smalloc(c->radio.nbuttons * sizeof(intorptr)); /* * Second pass along variable argument list to actually fill in * the structure. */ va_start(ap, context); for (i = 0; i < c->radio.nbuttons; i++) { c->radio.buttons[i] = dupstr(va_arg(ap, char *)); if (c->radio.shortcut == NO_SHORTCUT) c->radio.shortcuts[i] = va_arg(ap, int); /* char promotes to int in arg lists */ c->radio.buttondata[i] = va_arg(ap, intorptr); } va_end(ap); return c; } union control *ctrl_pushbutton(struct controlset *s,char *label,char shortcut, intorptr helpctx, handler_fn handler, intorptr context) { union control *c = ctrl_new(s, CTRL_BUTTON, helpctx, handler, context); c->button.label = label ? dupstr(label) : NULL; c->button.shortcut = shortcut; c->button.isdefault = 0; return c; } union control *ctrl_listbox(struct controlset *s,char *label,char shortcut, intorptr helpctx, handler_fn handler, intorptr context) { union control *c = ctrl_new(s, CTRL_LISTBOX, helpctx, handler, context); c->listbox.label = label ? dupstr(label) : NULL; c->listbox.shortcut = shortcut; c->listbox.height = 5; /* *shrug* a plausible default */ c->listbox.draglist = 0; c->listbox.multisel = 0; c->listbox.percentwidth = 100; c->listbox.ncols = 0; c->listbox.percentages = NULL; return c; } union control *ctrl_droplist(struct controlset *s, char *label, char shortcut, int percentage, intorptr helpctx, handler_fn handler, intorptr context) { union control *c = ctrl_new(s, CTRL_LISTBOX, helpctx, handler, context); c->listbox.label = label ? dupstr(label) : NULL; c->listbox.shortcut = shortcut; c->listbox.height = 0; /* means it's a drop-down list */ c->listbox.draglist = 0; c->listbox.multisel = 0; c->listbox.percentwidth = percentage; return c; } union control *ctrl_draglist(struct controlset *s,char *label,char shortcut, intorptr helpctx, handler_fn handler, intorptr context) { union control *c = ctrl_new(s, CTRL_LISTBOX, helpctx, handler, context); c->listbox.label = label ? dupstr(label) : NULL; c->listbox.shortcut = shortcut; c->listbox.height = 5; /* *shrug* a plausible default */ c->listbox.draglist = 1; c->listbox.multisel = 0; c->listbox.percentwidth = 100; return c; } union control *ctrl_filesel(struct controlset *s,char *label,char shortcut, char const *filter, int write, char *title, intorptr helpctx, handler_fn handler, intorptr context) { union control *c = ctrl_new(s, CTRL_FILESELECT, helpctx, handler, context); c->fileselect.label = label ? dupstr(label) : NULL; c->fileselect.shortcut = shortcut; c->fileselect.filter = filter; c->fileselect.for_writing = write; c->fileselect.title = dupstr(title); return c; } union control *ctrl_fontsel(struct controlset *s,char *label,char shortcut, intorptr helpctx, handler_fn handler, intorptr context) { union control *c = ctrl_new(s, CTRL_FONTSELECT, helpctx, handler, context); c->fontselect.label = label ? dupstr(label) : NULL; c->fontselect.shortcut = shortcut; return c; } union control *ctrl_tabdelay(struct controlset *s, union control *ctrl) { union control *c = ctrl_new(s, CTRL_TABDELAY, P(NULL), NULL, P(NULL)); c->tabdelay.ctrl = ctrl; return c; } union control *ctrl_text(struct controlset *s, char *text, intorptr helpctx) { union control *c = ctrl_new(s, CTRL_TEXT, helpctx, NULL, P(NULL)); c->text.label = dupstr(text); return c; } union control *ctrl_checkbox(struct controlset *s, char *label, char shortcut, intorptr helpctx, handler_fn handler, intorptr context) { union control *c = ctrl_new(s, CTRL_CHECKBOX, helpctx, handler, context); c->checkbox.label = label ? dupstr(label) : NULL; c->checkbox.shortcut = shortcut; return c; } void ctrl_free(union control *ctrl) { int i; sfree(ctrl->generic.label); switch (ctrl->generic.type) { case CTRL_RADIO: for (i = 0; i < ctrl->radio.nbuttons; i++) sfree(ctrl->radio.buttons[i]); sfree(ctrl->radio.buttons); sfree(ctrl->radio.shortcuts); sfree(ctrl->radio.buttondata); break; case CTRL_COLUMNS: sfree(ctrl->columns.percentages); break; case CTRL_LISTBOX: sfree(ctrl->listbox.percentages); break; case CTRL_FILESELECT: sfree(ctrl->fileselect.title); break; } sfree(ctrl); } void dlg_stdradiobutton_handler(union control *ctrl, void *dlg, void *data, int event) { int button; /* * For a standard radio button set, the context parameter gives * offsetof(targetfield, Config), and the extra data per button * gives the value the target field should take if that button * is the one selected. */ if (event == EVENT_REFRESH) { for (button = 0; button < ctrl->radio.nbuttons; button++) if (*(int *)ATOFFSET(data, ctrl->radio.context.i) == ctrl->radio.buttondata[button].i) break; /* We expected that `break' to happen, in all circumstances. */ assert(button < ctrl->radio.nbuttons); dlg_radiobutton_set(ctrl, dlg, button); } else if (event == EVENT_VALCHANGE) { button = dlg_radiobutton_get(ctrl, dlg); assert(button >= 0 && button < ctrl->radio.nbuttons); *(int *)ATOFFSET(data, ctrl->radio.context.i) = ctrl->radio.buttondata[button].i; } } void dlg_stdcheckbox_handler(union control *ctrl, void *dlg, void *data, int event) { int offset, invert; /* * For a standard checkbox, the context parameter gives * offsetof(targetfield, Config), optionally ORed with * CHECKBOX_INVERT. */ offset = ctrl->checkbox.context.i; if (offset & CHECKBOX_INVERT) { offset &= ~CHECKBOX_INVERT; invert = 1; } else invert = 0; /* * C lacks a logical XOR, so the following code uses the idiom * (!a ^ !b) to obtain the logical XOR of a and b. (That is, 1 * iff exactly one of a and b is nonzero, otherwise 0.) */ if (event == EVENT_REFRESH) { dlg_checkbox_set(ctrl,dlg, (!*(int *)ATOFFSET(data,offset) ^ !invert)); } else if (event == EVENT_VALCHANGE) { *(int *)ATOFFSET(data, offset) = !dlg_checkbox_get(ctrl,dlg) ^ !invert; } } void dlg_stdeditbox_handler(union control *ctrl, void *dlg, void *data, int event) { /* * The standard edit-box handler expects the main `context' * field to contain the `offsetof' a field in the structure * pointed to by `data'. The secondary `context2' field * indicates the type of this field: * * - if context2 > 0, the field is a char array and context2 * gives its size. * - if context2 == -1, the field is an int and the edit box * is numeric. * - if context2 < -1, the field is an int and the edit box is * _floating_, and (-context2) gives the scale. (E.g. if * context2 == -1000, then typing 1.2 into the box will set * the field to 1200.) */ int offset = ctrl->editbox.context.i; int length = ctrl->editbox.context2.i; if (length > 0) { char *field = (char *)ATOFFSET(data, offset); if (event == EVENT_REFRESH) { dlg_editbox_set(ctrl, dlg, field); } else if (event == EVENT_VALCHANGE) { dlg_editbox_get(ctrl, dlg, field, length); } } else if (length < 0) { int *field = (int *)ATOFFSET(data, offset); char data[80]; if (event == EVENT_REFRESH) { if (length == -1) sprintf(data, "%d", *field); else sprintf(data, "%g", (double)*field / (double)(-length)); dlg_editbox_set(ctrl, dlg, data); } else if (event == EVENT_VALCHANGE) { dlg_editbox_get(ctrl, dlg, data, lenof(data)); if (length == -1) *field = atoi(data); else *field = (int)((-length) * atof(data)); } } } void dlg_stdfilesel_handler(union control *ctrl, void *dlg, void *data, int event) { /* * The standard file-selector handler expects the `context' * field to contain the `offsetof' a Filename field in the * structure pointed to by `data'. */ int offset = ctrl->fileselect.context.i; if (event == EVENT_REFRESH) { dlg_filesel_set(ctrl, dlg, *(Filename *)ATOFFSET(data, offset)); } else if (event == EVENT_VALCHANGE) { dlg_filesel_get(ctrl, dlg, (Filename *)ATOFFSET(data, offset)); } } void dlg_stdfontsel_handler(union control *ctrl, void *dlg, void *data, int event) { /* * The standard file-selector handler expects the `context' * field to contain the `offsetof' a FontSpec field in the * structure pointed to by `data'. */ int offset = ctrl->fontselect.context.i; if (event == EVENT_REFRESH) { dlg_fontsel_set(ctrl, dlg, *(FontSpec *)ATOFFSET(data, offset)); } else if (event == EVENT_VALCHANGE) { dlg_fontsel_get(ctrl, dlg, (FontSpec *)ATOFFSET(data, offset)); } } Node-path: putty/dialog.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 24579 Text-content-md5: 4ff6420be09171473cf349e62fa5754c Text-content-sha1: 4e5ee9dd55a2684c0d922a1942996a19bd8e7f4e Content-length: 24695 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNrrr/* * Exports and types from dialog.c. */ /* * This will come in handy for generic control handlers. Anyone * knows how to make this more portable, let me know :-) */ #define ATOFFSET(data, offset) ( (void *) ( (char *)(data) + (offset) ) ) /* * This is the big union which defines a single control, of any * type. * * General principles: * - _All_ pointers in this structure are expected to point to * dynamically allocated things, unless otherwise indicated. * - `char' fields giving keyboard shortcuts are expected to be * NO_SHORTCUT if no shortcut is desired for a particular control. * - The `label' field can often be NULL, which will cause the * control to not have a label at all. This doesn't apply to * checkboxes and push buttons, in which the label is not * separate from the control. */ #define NO_SHORTCUT '\0' enum { CTRL_TEXT, /* just a static line of text */ CTRL_EDITBOX, /* label plus edit box */ CTRL_RADIO, /* label plus radio buttons */ CTRL_CHECKBOX, /* checkbox (contains own label) */ CTRL_BUTTON, /* simple push button (no label) */ CTRL_LISTBOX, /* label plus list box */ CTRL_COLUMNS, /* divide window into columns */ CTRL_FILESELECT, /* label plus filename selector */ CTRL_FONTSELECT, /* label plus font selector */ CTRL_TABDELAY /* see `tabdelay' below */ }; /* * Many controls have `intorptr' unions for storing user data, * since the user might reasonably want to store either an integer * or a void * pointer. Here I define a union, and two convenience * functions to create that union from actual integers or pointers. * * The convenience functions are declared as inline if possible. * Otherwise, they're declared here and defined when this header is * included with DEFINE_INTORPTR_FNS defined. This is a total pain, * but such is life. */ typedef union { void *p; int i; } intorptr; #if defined DEFINE_INTORPTR_FNS || defined INLINE #ifdef INLINE #define PREFIX INLINE #else #define PREFIX #endif PREFIX intorptr I(int i) { intorptr ret; ret.i = i; return ret; } PREFIX intorptr P(void *p) { intorptr ret; ret.p = p; return ret; } #undef PREFIX #else intorptr I(int i); intorptr P(void *p); #endif /* * Each control has an `int' field specifying which columns it * occupies in a multi-column part of the dialog box. These macros * pack and unpack that field. * * If a control belongs in exactly one column, just specifying the * column number is perfectly adequate. */ #define COLUMN_FIELD(start, span) ( (((span)-1) << 16) + (start) ) #define COLUMN_START(field) ( (field) & 0xFFFF ) #define COLUMN_SPAN(field) ( (((field) >> 16) & 0xFFFF) + 1 ) union control; /* * The number of event types is being deliberately kept small, on * the grounds that not all platforms might be able to report a * large number of subtle events. We have: * - the special REFRESH event, called when a control's value * needs setting * - the ACTION event, called when the user does something that * positively requests action (double-clicking a list box item, * or pushing a push-button) * - the VALCHANGE event, called when the user alters the setting * of the control in a way that is usually considered to alter * the underlying data (toggling a checkbox or radio button, * moving the items around in a drag-list, editing an edit * control) * - the SELCHANGE event, called when the user alters the setting * of the control in a more minor way (changing the selected * item in a list box). * - the CALLBACK event, which happens after the handler routine * has requested a subdialog (file selector, font selector, * colour selector) and it has come back with information. */ enum { EVENT_REFRESH, EVENT_ACTION, EVENT_VALCHANGE, EVENT_SELCHANGE, EVENT_CALLBACK }; typedef void (*handler_fn)(union control *ctrl, void *dlg, void *data, int event); #define STANDARD_PREFIX \ int type; \ char *label; \ int tabdelay; \ int column; \ handler_fn handler; \ intorptr context; \ intorptr helpctx union control { /* * The first possibility in this union is the generic header * shared by all the structures, which we are therefore allowed * to access through any one of them. */ struct { int type; /* * Every control except CTRL_COLUMNS has _some_ sort of * label. By putting it in the `generic' union as well as * everywhere else, we avoid having to have an irritating * switch statement when we go through and deallocate all * the memory in a config-box structure. * * Yes, this does mean that any non-NULL value in this * field is expected to be dynamically allocated and * freeable. * * For CTRL_COLUMNS, this field MUST be NULL. */ char *label; /* * If `tabdelay' is non-zero, it indicates that this * particular control should not yet appear in the tab * order. A subsequent CTRL_TABDELAY entry will place it. */ int tabdelay; /* * Indicate which column(s) this control occupies. This can * be unpacked into starting column and column span by the * COLUMN macros above. */ int column; /* * Most controls need to provide a function which gets * called when that control's setting is changed, or when * the control's setting needs initialising. * * The `data' parameter points to the writable data being * modified as a result of the configuration activity; for * example, the PuTTY `Config' structure, although not * necessarily. * * The `dlg' parameter is passed back to the platform- * specific routines to read and write the actual control * state. */ handler_fn handler; /* * Almost all of the above functions will find it useful to * be able to store a piece of `void *' or `int' data. */ intorptr context; /* * For any control, we also allow the storage of a piece of * data for use by context-sensitive help. For example, on * Windows you can click the magic question mark and then * click a control, and help for that control should spring * up. Hence, here is a slot in which to store per-control * data that a particular platform-specific driver can use * to ensure it brings up the right piece of help text. */ intorptr helpctx; } generic; struct { STANDARD_PREFIX; union control *ctrl; } tabdelay; struct { STANDARD_PREFIX; } text; struct { STANDARD_PREFIX; char shortcut; /* keyboard shortcut */ /* * Percentage of the dialog-box width used by the edit box. * If this is set to 100, the label is on its own line; * otherwise the label is on the same line as the box * itself. */ int percentwidth; int password; /* details of input are hidden */ /* * A special case of the edit box is the combo box, which * has a drop-down list built in. (Note that a _non_- * editable drop-down list is done as a special case of a * list box.) */ int has_list; /* * Edit boxes tend to need two items of context, so here's * a spare. */ intorptr context2; } editbox; struct { STANDARD_PREFIX; /* * `shortcut' here is a single keyboard shortcut which is * expected to select the whole group of radio buttons. It * can be NO_SHORTCUT if required, and there is also a way * to place individual shortcuts on each button; see below. */ char shortcut; /* * There are separate fields for `ncolumns' and `nbuttons' * for several reasons. * * Firstly, we sometimes want the last of a set of buttons * to have a longer label than the rest; we achieve this by * setting `ncolumns' higher than `nbuttons', and the * layout code is expected to understand that the final * button should be given all the remaining space on the * line. This sounds like a ludicrously specific special * case (if we're doing this sort of thing, why not have * the general ability to have a particular button span * more than one column whether it's the last one or not?) * but actually it's reasonably common for the sort of * three-way control you get a lot of in PuTTY: `yes' * versus `no' versus `some more complex way to decide'. * * Secondly, setting `nbuttons' higher than `ncolumns' lets * us have more than one line of radio buttons for a single * setting. A very important special case of this is * setting `ncolumns' to 1, so that each button is on its * own line. */ int ncolumns; int nbuttons; /* * This points to a dynamically allocated array of `char *' * pointers, each of which points to a dynamically * allocated string. */ char **buttons; /* `nbuttons' button labels */ /* * This points to a dynamically allocated array of `char' * giving the individual keyboard shortcuts for each radio * button. The array may be NULL if none are required. */ char *shortcuts; /* `nbuttons' shortcuts; may be NULL */ /* * This points to a dynamically allocated array of * intorptr, giving helpful data for each button. */ intorptr *buttondata; /* `nbuttons' entries; may be NULL */ } radio; struct { STANDARD_PREFIX; char shortcut; } checkbox; struct { STANDARD_PREFIX; char shortcut; /* * At least Windows has the concept of a `default push * button', which gets implicitly pressed when you hit * Return even if it doesn't have the input focus. */ int isdefault; } button; struct { STANDARD_PREFIX; char shortcut; /* keyboard shortcut */ /* * Height of the list box, in approximate number of lines. * If this is zero, the list is a drop-down list. */ int height; /* height in lines */ /* * If this is set, the list elements can be reordered by * the user (by drag-and-drop or by Up and Down buttons, * whatever the per-platform implementation feels * comfortable with). This is not guaranteed to work on a * drop-down list, so don't try it! */ int draglist; /* * If this is set, the list can have more than one element * selected at a time. This is not guaranteed to work on a * drop-down list, so don't try it! */ int multisel; /* * Percentage of the dialog-box width used by the list box. * If this is set to 100, the label is on its own line; * otherwise the label is on the same line as the box * itself. Setting this to anything other than 100 is not * guaranteed to work on a _non_-drop-down list, so don't * try it! */ int percentwidth; /* * Some list boxes contain strings that contain tab * characters. If `ncols' is greater than 0, then * `percentages' is expected to be non-zero and to contain * the respective widths of `ncols' columns, which together * will exactly fit the width of the list box. Otherwise * `percentages' must be NULL. */ int ncols; /* number of columns */ int *percentages; /* % width of each column */ } listbox; struct { STANDARD_PREFIX; char shortcut; /* * `filter' dictates what type of files will be selected by * default; for example, when selecting private key files * the file selector would do well to only show .PPK files * (on those systems where this is the chosen extension). * * The precise contents of `filter' are platform-defined, * unfortunately. The special value NULL means `all files' * and is always a valid fallback. * * Unlike almost all strings in this structure, this value * is NOT expected to require freeing (although of course * you can always use ctrl_alloc if you do need to create * one on the fly). This is because the likely mode of use * is to define string constants in a platform-specific * header file, and directly reference those. Or worse, a * particular platform might choose to cast integers into * this pointer type... */ char const *filter; /* * Some systems like to know whether a file selector is * choosing a file to read or one to write (and possibly * create). */ int for_writing; /* * On at least some platforms, the file selector is a * separate dialog box, and contains a user-settable title. * * This value _is_ expected to require freeing. */ char *title; } fileselect; struct { /* In this variant, `label' MUST be NULL. */ STANDARD_PREFIX; int ncols; /* number of columns */ int *percentages; /* % width of each column */ /* * Every time this control type appears, exactly one of * `ncols' and the previous number of columns MUST be one. * Attempting to allow a seamless transition from a four- * to a five-column layout, for example, would be way more * trouble than it was worth. If you must lay things out * like that, define eight unevenly sized columns and use * column-spanning a lot. But better still, just don't. * * `percentages' may be NULL if ncols==1, to save space. */ } columns; struct { STANDARD_PREFIX; char shortcut; } fontselect; }; #undef STANDARD_PREFIX /* * `controlset' is a container holding an array of `union control' * structures, together with a panel name and a title for the whole * set. In Windows and any similar-looking GUI, each `controlset' * in the config will be a container box within a panel. * * Special case: if `boxname' is NULL, the control set gives an * overall title for an entire panel of controls. */ struct controlset { char *pathname; /* panel path, e.g. "SSH/Tunnels" */ char *boxname; /* internal short name of controlset */ char *boxtitle; /* title of container box */ int ncolumns; /* current no. of columns at bottom */ int ncontrols; /* number of `union control' in array */ int ctrlsize; /* allocated size of array */ union control **ctrls; /* actual array */ }; /* * This is the container structure which holds a complete set of * controls. */ struct controlbox { int nctrlsets; /* number of ctrlsets */ int ctrlsetsize; /* ctrlset size */ struct controlset **ctrlsets; /* actual array of ctrlsets */ int nfrees; int freesize; void **frees; /* array of aux data areas to free */ }; struct controlbox *ctrl_new_box(void); void ctrl_free_box(struct controlbox *); /* * Standard functions used for populating a controlbox structure. */ /* Set up a panel title. */ struct controlset *ctrl_settitle(struct controlbox *, char *path, char *title); /* Retrieve a pointer to a controlset, creating it if absent. */ struct controlset *ctrl_getset(struct controlbox *, char *path, char *name, char *boxtitle); void ctrl_free_set(struct controlset *); void ctrl_free(union control *); /* * This function works like `malloc', but the memory it returns * will be automatically freed when the controlbox is freed. Note * that a controlbox is a dialog-box _template_, not an instance, * and so data allocated through this function is better not used * to hold modifiable per-instance things. It's mostly here for * allocating structures to be passed as control handler params. */ void *ctrl_alloc(struct controlbox *b, size_t size); /* * Individual routines to create `union control' structures in a controlset. * * Most of these routines allow the most common fields to be set * directly, and put default values in the rest. Each one returns a * pointer to the `union control' it created, so that final tweaks * can be made. */ /* `ncolumns' is followed by that many percentages, as integers. */ union control *ctrl_columns(struct controlset *, int ncolumns, ...); union control *ctrl_editbox(struct controlset *, char *label, char shortcut, int percentage, intorptr helpctx, handler_fn handler, intorptr context, intorptr context2); union control *ctrl_combobox(struct controlset *, char *label, char shortcut, int percentage, intorptr helpctx, handler_fn handler, intorptr context, intorptr context2); /* * `ncolumns' is followed by (alternately) radio button titles and * intorptrs, until a NULL in place of a title string is seen. Each * title is expected to be followed by a shortcut _iff_ `shortcut' * is NO_SHORTCUT. */ union control *ctrl_radiobuttons(struct controlset *, char *label, char shortcut, int ncolumns, intorptr helpctx, handler_fn handler, intorptr context, ...); union control *ctrl_pushbutton(struct controlset *,char *label,char shortcut, intorptr helpctx, handler_fn handler, intorptr context); union control *ctrl_listbox(struct controlset *,char *label,char shortcut, intorptr helpctx, handler_fn handler, intorptr context); union control *ctrl_droplist(struct controlset *, char *label, char shortcut, int percentage, intorptr helpctx, handler_fn handler, intorptr context); union control *ctrl_draglist(struct controlset *,char *label,char shortcut, intorptr helpctx, handler_fn handler, intorptr context); union control *ctrl_filesel(struct controlset *,char *label,char shortcut, char const *filter, int write, char *title, intorptr helpctx, handler_fn handler, intorptr context); union control *ctrl_fontsel(struct controlset *,char *label,char shortcut, intorptr helpctx, handler_fn handler, intorptr context); union control *ctrl_text(struct controlset *, char *text, intorptr helpctx); union control *ctrl_checkbox(struct controlset *, char *label, char shortcut, intorptr helpctx, handler_fn handler, intorptr context); union control *ctrl_tabdelay(struct controlset *, union control *); /* * Standard handler routines to cover most of the common cases in * the config box. */ /* * The standard radio-button handler expects the main `context' * field to contain the `offsetof' of an int field in the structure * pointed to by `data', and expects each of the individual button * data to give a value for that int field. */ void dlg_stdradiobutton_handler(union control *ctrl, void *dlg, void *data, int event); /* * The standard checkbox handler expects the main `context' field * to contain the `offsetof' an int field in the structure pointed * to by `data', optionally ORed with CHECKBOX_INVERT to indicate * that the sense of the datum is opposite to the sense of the * checkbox. */ #define CHECKBOX_INVERT (1<<30) void dlg_stdcheckbox_handler(union control *ctrl, void *dlg, void *data, int event); /* * The standard edit-box handler expects the main `context' field * to contain the `offsetof' a field in the structure pointed to by * `data'. The secondary `context2' field indicates the type of * this field: * * - if context2 > 0, the field is a char array and context2 gives * its size. * - if context2 == -1, the field is an int and the edit box is * numeric. * - if context2 < -1, the field is an int and the edit box is * _floating_, and (-context2) gives the scale. (E.g. if * context2 == -1000, then typing 1.2 into the box will set the * field to 1200.) */ void dlg_stdeditbox_handler(union control *ctrl, void *dlg, void *data, int event); /* * The standard file-selector handler expects the main `context' * field to contain the `offsetof' a Filename field in the * structure pointed to by `data'. */ void dlg_stdfilesel_handler(union control *ctrl, void *dlg, void *data, int event); /* * The standard font-selector handler expects the main `context' * field to contain the `offsetof' a Font field in the structure * pointed to by `data'. */ void dlg_stdfontsel_handler(union control *ctrl, void *dlg, void *data, int event); /* * Routines the platform-independent dialog code can call to read * and write the values of controls. */ void dlg_radiobutton_set(union control *ctrl, void *dlg, int whichbutton); int dlg_radiobutton_get(union control *ctrl, void *dlg); void dlg_checkbox_set(union control *ctrl, void *dlg, int checked); int dlg_checkbox_get(union control *ctrl, void *dlg); void dlg_editbox_set(union control *ctrl, void *dlg, char const *text); void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length); /* The `listbox' functions can also apply to combo boxes. */ void dlg_listbox_clear(union control *ctrl, void *dlg); void dlg_listbox_del(union control *ctrl, void *dlg, int index); void dlg_listbox_add(union control *ctrl, void *dlg, char const *text); /* * Each listbox entry may have a numeric id associated with it. * Note that some front ends only permit a string to be stored at * each position, which means that _if_ you put two identical * strings in any listbox then you MUST not assign them different * IDs and expect to get meaningful results back. */ void dlg_listbox_addwithindex(union control *ctrl, void *dlg, char const *text, int id); int dlg_listbox_getid(union control *ctrl, void *dlg, int index); /* dlg_listbox_index returns <0 if no single element is selected. */ int dlg_listbox_index(union control *ctrl, void *dlg); int dlg_listbox_issel(union control *ctrl, void *dlg, int index); void dlg_listbox_select(union control *ctrl, void *dlg, int index); void dlg_text_set(union control *ctrl, void *dlg, char const *text); void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn); void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn); void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec fn); void dlg_fontsel_get(union control *ctrl, void *dlg, FontSpec *fn); /* * Bracketing a large set of updates in these two functions will * cause the front end (if possible) to delay updating the screen * until it's all complete, thus avoiding flicker. */ void dlg_update_start(union control *ctrl, void *dlg); void dlg_update_done(union control *ctrl, void *dlg); /* * Set input focus into a particular control. */ void dlg_set_focus(union control *ctrl, void *dlg); /* * Return the `ctrl' structure for the control that had the input * focus before this one. This is NOT GUARANTEED to work on all * platforms, so don't base any critical functionality on it! */ union control *dlg_last_focused(void *dlg); /* * During event processing, you might well want to give an error * indication to the user. dlg_beep() is a quick and easy generic * error; dlg_error() puts up a message-box or equivalent. */ void dlg_beep(void *dlg); void dlg_error_msg(void *dlg, char *msg); /* * This function signals to the front end that the dialog's * processing is completed, and passes an integer value (typically * a success status). */ void dlg_end(void *dlg, int value); /* * Routines to manage a (per-platform) colour selector. * dlg_coloursel_start() is called in an event handler, and * schedules the running of a colour selector after the event * handler returns. The colour selector will send EVENT_CALLBACK to * the control that spawned it, when it's finished; * dlg_coloursel_results() fetches the results, as integers from 0 * to 255; it returns nonzero on success, or zero if the colour * selector was dismissed by hitting Cancel or similar. * * dlg_coloursel_start() accepts an RGB triple which is used to * initialise the colour selector to its starting value. */ void dlg_coloursel_start(union control *ctrl, void *dlg, int r, int g, int b); int dlg_coloursel_results(union control *ctrl, void *dlg, int *r, int *g, int *b); /* * This routine is used by the platform-independent code to * indicate that the value of a particular control is likely to * have changed. It triggers a call of the handler for that control * with `event' set to EVENT_REFRESH. * * If `ctrl' is NULL, _all_ controls in the dialog get refreshed * (for loading or saving entire sets of settings). */ void dlg_refresh(union control *ctrl, void *dlg); /* * Standard helper functions for reading a controlbox structure. */ /* * Find the index of next controlset in a controlbox for a given * path, or -1 if no such controlset exists. If -1 is passed as * input, finds the first. Intended usage is something like * * for (index=-1; (index=ctrl_find_path(ctrlbox, index, path)) >= 0 ;) { * ... process this controlset ... * } */ int ctrl_find_path(struct controlbox *b, char *path, int index); int ctrl_path_elements(char *path); /* Return the number of matching path elements at the starts of p1 and p2, * or INT_MAX if the paths are identical. */ int ctrl_path_compare(char *p1, char *p2); Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1b8b1333e60d17dd0f38c3adb7c4f8ba Text-delta-base-sha1: 1c05b862f084568acec4f0932f3ba1746ad3f61c Text-content-length: 366 Text-content-md5: b66d57bdf81761e872a8510f2ce7711f Text-content-sha1: 382cdbd7bf7531186049223d9bbc061a7761e0e8 Content-length: 406 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN.3.2;w<26$nIs`N\versionid $Id: config.but,v 1.57 2003/03/05 22:07:40 simonMake default system alert sound} is the default setting. It causes the Windows \q{Default Beep} sound to be played. To change what this sound is, or to test it if nothing seems to be happening, use the Sound configurer in the Windows Control Panel Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3dd75d100c33879263e19950c82da6b8 Text-delta-base-sha1: 8ee85c29a46cfeb46016214b6f8909e1745f114f Text-content-length: 20 Text-content-md5: 62d6e120678b5ea2bf9efaccb5efc4b1 Text-content-sha1: 99129f7e17f13ae173d57292b6a3afbddd29d5c5 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNv[ R m Node-path: putty/wincfg.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 9609 Text-content-md5: a7a19f44632a9b8ee83c8f8f2ac58d00 Text-content-sha1: e75e027ec87833b1e9b0f275f11dfee4a7c2e03a Content-length: 9725 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN{{{/* * wincfg.c - the Windows-specific parts of the PuTTY configuration * box. */ #include #include #include #include "putty.h" #include "dialog.h" #include "storage.h" static void about_handler(union control *ctrl, void *dlg, void *data, int event) { HWND *hwndp = (HWND *)ctrl->generic.context.p; if (event == EVENT_ACTION) { modal_about_box(*hwndp); } } static void help_handler(union control *ctrl, void *dlg, void *data, int event) { HWND *hwndp = (HWND *)ctrl->generic.context.p; if (event == EVENT_ACTION) { show_help(*hwndp); } } void win_setup_config_box(struct controlbox *b, HWND *hwndp, int has_help, int midsession) { struct controlset *s; union control *c; if (!midsession) { /* * Add the About and Help buttons to the standard panel. */ s = ctrl_getset(b, "", "", ""); c = ctrl_pushbutton(s, "About", 'a', HELPCTX(no_help), about_handler, P(hwndp)); c->generic.column = 0; if (has_help) { c = ctrl_pushbutton(s, "Help", 'h', HELPCTX(no_help), help_handler, P(hwndp)); c->generic.column = 1; } } /* * Windows has the AltGr key, which has various Windows- * specific options. */ s = ctrl_getset(b, "Terminal/Keyboard", "features", "Enable extra keyboard features:"); ctrl_checkbox(s, "AltGr acts as Compose key", 't', HELPCTX(keyboard_compose), dlg_stdcheckbox_handler, I(offsetof(Config,compose_key))); ctrl_checkbox(s, "Control-Alt is different from AltGr", 'd', HELPCTX(keyboard_ctrlalt), dlg_stdcheckbox_handler, I(offsetof(Config,ctrlaltkeys))); /* * Windows allows an arbitrary .WAV to be played as a bell. For * this we must search the existing controlset for the * radio-button set controlling the `beep' option, and add an * extra button to it. * * Note that although this _looks_ like a hideous hack, it's * actually all above board. The well-defined interface to the * per-platform dialog box code is the _data structures_ `union * control', `struct controlset' and so on; so code like this * that reaches into those data structures and changes bits of * them is perfectly legitimate and crosses no boundaries. All * the ctrl_* routines that create most of the controls are * convenient shortcuts provided on the cross-platform side of * the interface, and template creation code is under no actual * obligation to use them. */ s = ctrl_getset(b, "Terminal/Bell", "style", "Set the style of bell"); { int i; for (i = 0; i < s->ncontrols; i++) { c = s->ctrls[i]; if (c->generic.type == CTRL_RADIO && c->generic.context.i == offsetof(Config, beep)) { assert(c->generic.handler == dlg_stdradiobutton_handler); c->radio.nbuttons++; c->radio.buttons = srealloc(c->radio.buttons, c->radio.nbuttons * sizeof(*c->radio.buttons)); c->radio.buttons[c->radio.nbuttons-1] = dupstr("Play a custom sound file"); c->radio.buttondata = srealloc(c->radio.buttondata, c->radio.nbuttons * sizeof(*c->radio.buttondata)); c->radio.buttondata[c->radio.nbuttons-1] = I(BELL_WAVEFILE); if (c->radio.shortcuts) { c->radio.shortcuts = srealloc(c->radio.shortcuts, (c->radio.nbuttons * sizeof(*c->radio.shortcuts))); c->radio.shortcuts[c->radio.nbuttons-1] = NO_SHORTCUT; } break; } } } ctrl_filesel(s, "Custom sound file to play as a bell:", NO_SHORTCUT, FILTER_WAVE_FILES, FALSE, "Select bell sound file", HELPCTX(bell_style), dlg_stdfilesel_handler, I(offsetof(Config, bell_wavefile))); /* * While we've got this box open, taskbar flashing on a bell is * also Windows-specific. */ ctrl_radiobuttons(s, "Taskbar/caption indication on bell:", 'i', 3, HELPCTX(bell_taskbar), dlg_stdradiobutton_handler, I(offsetof(Config, beep_ind)), "Disabled", I(B_IND_DISABLED), "Flashing", I(B_IND_FLASH), "Steady", I(B_IND_STEADY), NULL); /* * The sunken-edge border is a Windows GUI feature. */ s = ctrl_getset(b, "Window/Appearance", "border", "Adjust the window border"); ctrl_checkbox(s, "Sunken-edge border (slightly thicker)", 's', HELPCTX(appearance_border), dlg_stdcheckbox_handler, I(offsetof(Config,sunken_edge))); /* * Cyrillic Lock is a horrid misfeature even on Windows, and * the least we can do is ensure it never makes it to any other * platform (at least unless someone fixes it!). */ s = ctrl_getset(b, "Window/Translation", "input", "Enable character set translation on input data"); ctrl_checkbox(s, "Caps Lock acts as Cyrillic switch", 's', HELPCTX(translation_cyrillic), dlg_stdcheckbox_handler, I(offsetof(Config,xlat_capslockcyr))); /* * Windows has the weird OEM font mode, which gives us some * additional options when working with line-drawing * characters. */ s = ctrl_getset(b, "Window/Translation", "linedraw", "Adjust how PuTTY displays line drawing characters"); { int i; for (i = 0; i < s->ncontrols; i++) { c = s->ctrls[i]; if (c->generic.type == CTRL_RADIO && c->generic.context.i == offsetof(Config, vtmode)) { assert(c->generic.handler == dlg_stdradiobutton_handler); c->radio.nbuttons += 2; c->radio.buttons = srealloc(c->radio.buttons, c->radio.nbuttons * sizeof(*c->radio.buttons)); c->radio.buttons[c->radio.nbuttons-2] = dupstr("Use font in both ANSI and OEM modes"); c->radio.buttons[c->radio.nbuttons-1] = dupstr("Use font in OEM mode only"); c->radio.buttondata = srealloc(c->radio.buttondata, c->radio.nbuttons * sizeof(*c->radio.buttondata)); c->radio.buttondata[c->radio.nbuttons-2] = I(VT_OEMANSI); c->radio.buttondata[c->radio.nbuttons-1] = I(VT_OEMONLY); if (!c->radio.shortcuts) { int j; c->radio.shortcuts = smalloc((c->radio.nbuttons * sizeof(*c->radio.shortcuts))); for (j = 0; j < c->radio.nbuttons; j++) c->radio.shortcuts[j] = NO_SHORTCUT; } else { c->radio.shortcuts = srealloc(c->radio.shortcuts, (c->radio.nbuttons * sizeof(*c->radio.shortcuts))); } c->radio.shortcuts[c->radio.nbuttons-2] = 'b'; c->radio.shortcuts[c->radio.nbuttons-1] = 'e'; break; } } } /* * RTF paste is Windows-specific. */ s = ctrl_getset(b, "Window/Selection", "trans", "Translation of pasted characters"); ctrl_checkbox(s, "Paste to clipboard in RTF as well as plain text", 'f', HELPCTX(selection_rtf), dlg_stdcheckbox_handler, I(offsetof(Config,rtf_paste))); /* * Windows often has no middle button, so we supply a selection * mode in which the more critical Paste action is available on * the right button instead. */ s = ctrl_getset(b, "Window/Selection", "mouse", "Control use of mouse"); ctrl_radiobuttons(s, "Action of mouse buttons:", NO_SHORTCUT, 1, HELPCTX(selection_buttons), dlg_stdradiobutton_handler, I(offsetof(Config, mouse_is_xterm)), "Windows (Right pastes, Middle extends)", 'w', I(0), "xterm (Right extends, Middle pastes)", 'x', I(1), NULL); /* * This really ought to go at the _top_ of its box, not the * bottom, so we'll just do some shuffling now we've set it * up... */ c = s->ctrls[s->ncontrols-1]; /* this should be the new control */ memmove(s->ctrls+1, s->ctrls, (s->ncontrols-1)*sizeof(union control *)); s->ctrls[0] = c; /* * Logical palettes don't even make sense anywhere except Windows. */ s = ctrl_getset(b, "Window/Colours", "general", "General options for colour usage"); ctrl_checkbox(s, "Attempt to use logical palettes", 'l', HELPCTX(colours_logpal), dlg_stdcheckbox_handler, I(offsetof(Config,try_palette))); /* * Resize-by-changing-font is a Windows insanity. */ s = ctrl_getset(b, "Window", "size", "Set the size of the window"); ctrl_radiobuttons(s, "When window is resized:", 'z', 1, HELPCTX(window_resize), dlg_stdradiobutton_handler, I(offsetof(Config, resize_action)), "Change the number of rows and columns", I(RESIZE_TERM), "Change the size of the font", I(RESIZE_FONT), "Change font size only when maximised", I(RESIZE_EITHER), "Forbid resizing completely", I(RESIZE_DISABLED), NULL); /* * Most of the Window/Behaviour stuff is there to mimic Windows * conventions which PuTTY can optionally disregard. Hence, * most of these options are Windows-specific. */ s = ctrl_getset(b, "Window/Behaviour", "main", NULL); ctrl_checkbox(s, "Window closes on ALT-F4", '4', HELPCTX(behaviour_altf4), dlg_stdcheckbox_handler, I(offsetof(Config,alt_f4))); ctrl_checkbox(s, "System menu appears on ALT-Space", 'y', HELPCTX(behaviour_altspace), dlg_stdcheckbox_handler, I(offsetof(Config,alt_space))); ctrl_checkbox(s, "System menu appears on ALT alone", 'l', HELPCTX(behaviour_altonly), dlg_stdcheckbox_handler, I(offsetof(Config,alt_only))); ctrl_checkbox(s, "Ensure window is always on top", 'e', HELPCTX(behaviour_alwaysontop), dlg_stdcheckbox_handler, I(offsetof(Config,alwaysontop))); ctrl_checkbox(s, "Full screen on Alt-Enter", 'f', HELPCTX(behaviour_altenter), dlg_stdcheckbox_handler, I(offsetof(Config,fullscreenonaltenter))); } Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 36512056b2683dfb6c8689326e04a404 Text-delta-base-sha1: c5234322ec1ba1426204075dcba7548830b60be4 Text-content-length: 46898 Text-content-md5: 9c0f75f6d0c205535dde94475796aa9f Text-content-sha1: a24196beb40357c42e740d36da82979b4f603ec7 Content-length: 46938 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNMbc?PK0N5AzezCyiz8pZ>wXNS < P ]e)"APv n}sx>K{FdFq*Y0{r# /* * Possible TODO in new cross-platform config box stuff: * * - When lining up two controls alongside each other, I wonder if * we could conveniently arrange to centre them vertically? * Particularly ugly in the current setup is the `Add new * forwarded port:' static next to the rather taller `Remove' * button. */ #include #include #include #include "winstuff.h" #include "misc.h" #include "dialogTITLEHEIGHT 12LISTHEIGHT 11 #define LISTINCREMENT 8/* * We can pass in cp->hwnd == NULL, to indicate a dry run * without creating any actual controls. */ if (cp->hwnd) { ctl = CreateWindowEx(exstyle, wclass, wtext, wstyle, r.left, r.top, r.right, r.bottom, cp->hwnd, (HMENU) wid, hinst, NULL); SendMessage(ctl, WM_SETFONT, cp->font, MAKELPARAM(TRUE, 0)); if (!strcmp(wclass, "LISTBOX")) { /* * Bizarre Windows bug: the list box calculates its * number of lines based on the font it has at creation * time, but sending it WM_SETFONT doesn't cause it to * recalculate. So now, _after_ we've sent it * WM_SETFONT, we explicitly resize it (to the same * size it was already!) to force it to reconsider. */ SetWindowPos(ctl, NULL, 0, 0, r.right, r.bottom, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOZORDER); } }int password, ...) { RECT r; va_list ap; int percent, xpos; percent = xpos = 0; va_start(ap, password | (password ? ES_PASSWORD : 0)ruct radio { char *text; int id; }; static void radioline_common(struct ctlpos *cp, char *text, int id, int nacross, struct radio *buttons, int nbuttons) { RECT r; int group; int i; int j; if (text) {STATIC", WS_CHILD | WS_VISIBLE, 0, text, id); } group = WS_GROUP; i = 0; for (j = 0; j < nbuttons; j++) { char *btext = buttons[j].text; int bid = buttons[j].id; if (i == nacross) { cp->ypos += r.bottom + (nacross > 1 ? GAPBETWEEN : GAPWITHIN); i = 0; } r.left = GAPBETWEEN + i * (cp->width + GAPBETWEEN) / nacross; if (j < nbuttons-1NOTIFY | BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group, 0, btext, bid); group = 0; i++va_list ap; struct radio *buttons; int i, nbuttons; va_start(ap, nacross); nbuttons = 0; while (1) { char *btext = va_arg(ap, char *); int bid; if (!btext) break; bid = va_arg(ap, int); } va_end(ap); buttons = smalloc(nbuttons * sizeof(struct radio)); va_start(ap, nacross); for (i = 0; i < nbuttons; i++) { buttons[i].text = va_arg(ap, char *); buttons[i].id = va_arg(ap, int); } va_end(ap); radioline_common(cp, text, id, nacross, buttons, nbuttons); sfree(buttons struct radio *buttons; int i, nbuttons; va_start(ap, nacross); nbuttons = 0; while (1) { char *btext = va_arg(ap, char *); int bid; if (!btext) break; bid = va_arg(ap, int); } va_end(ap); buttons = smalloc(nbuttons * sizeof(struct radio)); va_start(ap, nacross); for (i = 0; i < nbuttons; i++) { buttons[i].text = va_arg(ap, char *); buttons[i].id = va_arg(ap, int); } va_end(ap); radioline_common(cp, NULL, 0, nacross, buttons, nbuttons); sfree(buttonsva_list ap; struct radio *buttons; int i, nbuttons; va_start(ap, id); nbuttons = 0; while (1) { char *btext = va_arg(ap, char *); int bid; if (!btext) break; bid = va_arg(ap, int); } va_end(ap); buttons = smalloc(nbuttons * sizeof(struct radio)); va_start(ap, id); for (i = 0; i < nbuttons; i++) { buttons[i].text = va_arg(ap, char *); buttons[i].id = va_arg(ap, int); } va_end(ap); radioline_common(cp, text, id, 1, buttons, nbuttons); sfree(buttons)NOTIFY |Wrap a piece of text for a static text control. Returns the * wrapped text (a malloc'ed string containing \ns), and also * returns the number of lines required. */ char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines) { HFONT font = (HFONT) cp->font; HDC hdc = GetDC(hwnd); int lpx = GetDeviceCaps(hdc, LOGPIXELSX); int width, nlines, j; INT *pwidths, nfit; SIZE size; char *ret, *p, *q; RECT r; ret = smalloc(1+strlen(text)); p = text; q = ret; pwidths = smalloc(sizeof(INT)*(1+strlen(text))); /* * Work out the width the text will need to fit in, by doing * the same adjustment that the `statictext' function itself * will perform. * * We must first convert from dialog-box units into pixels, and * then from pixels into the `logical units' that Windows uses * within GDI. You can't make this stuff up. */ r.left = r.top = r.bottom = 0; r.right = cp->width; MapDialogRect(hwnd, &r); width = MulDiv(r.right, lpx, 72); nlines = 1; while (*p) { if (!GetTextExtentExPoint(hdc, p, strlen(p), width, &nfit, pwidths, &size) || (size_t)nfit >= strlen(p)) { /* * Either GetTextExtentExPoint returned failure, or the * whole of the rest of the text fits on this line. * Either way, we stop wrapping, copy the remainder of * the input string unchanged to the output, and leave. */ strcpy(q, p); break; } /* * Now we search backwards along the string from `nfit', * looking for a space at which to break the line. If we * don't find one at all, that's fine - we'll just break * the line at `nfit'. */ for (j = nfit; j > 0; j--) { if (isspace((unsigned char)p[j])) { nfit = j; break; } } strncpy(q, p, nfit); q[nfit] = '\n'; q += nfit+1; p += nfit; while (*p && isspace((unsigned char)*p)) p++; nlines++; } ReleaseDC(cp->hwnd, hdc); if (lines) *lines = nlines; return ret WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP, 0, text, id); } /* * An owner-drawn static text control for a panel title. */ void paneltitleTITLE | SS_OWNERDRAW, 0, NULLBS_NOTIFY |A simple push button. */ void button(struct ctlpos *cp, char *btext, int bid, int defbtnPUSHBTNHEIGHT; /* Q67655: the _dialog box_ must know which button is default * as well as the button itself knowing */ if (defbtn && cp->hwnd) SendMessage(cp->hwnd, DM_SETDEFID, bid, 0); doctl(cp, r, "BUTTON", BS_NOTIFY | WS_CHILD | WS_VISIBLE | WS_TABSTOP | (defbtn ? BS_DEFPUSHBUTTON : 0) | BS_PUSHBUTTON, 0, btext, bid); cp->ypos += PUSHBTNHEIGHTBS_NOTIFY |BS_NOTIFY |combo box on the right hand side, with a static to its left. */ void staticcombo(struct ctlpos *cp, char *stext, 10 WS_VSCROLL | CBS_DROPDOWN | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", lid); cp->ypos += height + GAPBETWEEN; } /* * A static, with a full-width drop-down list box below it. */ void staticddlbig(struct ctlpos *cp, char *stext, int sid, int l cp->ypos += STATICHEIGHT cp->ypos += COMBOHEIGHTlist box with a static labelling it. */ void listbox(struct ctlpos *cp, char *stext, int sid, int lid, int lines, int multi) { RECT r; if (stext != NULL) {STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); }LISTHEIGHT + (lines - 1) * LISTINCREMEN LBS_NOTIFY | LBS_HASSTRINGS | LBS_USETABSTOPS | (multi ? LBS_MULTIPLESEL : 0), WS_EX_CLIENTEDGE, "", lBS_NOTIFY |int lines, char *stext,int listheight = LISTHEIGHT + (lines - 1) * LISTINCREMENT; const int BTNSHEIGHT = 2*PUSHBTNHEIGHT + GAPBETWEEN; int totalheight, buttonposif (stext != NULL) {STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); } if (listheight > BTNSHEIGHT) { totalheight = listheight; buttonpos = (listheight - BTNSHEIGHT) / 2; } else { totalheight = BTNSHEIGHT; buttonpos = 0list | LBS_USETABSTOP + buttonpos; r.bottom = PUSHBTNHEIGHT; doctl(cp, r, "BUTTON", BS_NOTIFY | WS_CHILD | WS_VISIBLE | buttonBS_NOTIFY | WS_CHILD | WS_VISIBLE | * Return value has bit 0 set if the dialog box procedure needs to * return TRUE from handling this message; it has bit 1 set if a * change may have been made in the contents of the list = 0||| ret |= 2; } ret |= 1; break; } } } else { ret |= 2; } } } if (array) { /* Update array to match the list box. */ for (i=0; i < maxmemb; i++) array[i] = SendDlgItemMessage (hwnd, hdl->listid, LB_GETITEMDATA, i, 0); } return ret; ---------------------------------------------------------------------- * Platform-specific side of portable dialog-box mechanism. */ /* * This function takes a string, escapes all the ampersands, and * places a single (unescaped) ampersand in front of the first * occurrence of the given shortcut character (which may be * NO_SHORTCUT). * * Return value is a malloc'ed copy of the processed version of the * string. */ static char *shortcut_escape(char *text, char shortcut) { char *ret; char *p, *q; if (!text) return NULL; /* sfree won't choke on this */ ret = smalloc(2*strlen(text)+1); /* size potentially doubles! */ shortcut = tolower((unsigned char)shortcut); p = text; q = ret; while (*p) { if (shortcut != NO_SHORTCUT && tolower((unsigned char)*p) == shortcut) { *q++ = '&'; shortcut = NO_SHORTCUT; /* stop it happening twice */ } else if (*p == '&') { *q++ = '&'; } *q++ = *p++; } *q = '\0'; return ret; } void winctrl_add_shortcuts(struct dlgparam *dp, struct winctrl *c) { int i; for (i = 0; i < lenof(c->shortcuts); i++) if (c->shortcuts[i] != NO_SHORTCUT) { unsigned char s = tolower((unsigned char)c->shortcuts[i]); assert(!dp->shortcuts[s]); dp->shortcuts[s] = TRUE; } } void winctrl_rem_shortcuts(struct dlgparam *dp, struct winctrl *c) { int i; for (i = 0; i < lenof(c->shortcuts); i++) if (c->shortcuts[i] != NO_SHORTCUT) { unsigned char s = tolower((unsigned char)c->shortcuts[i]); assert(dp->shortcuts[s]); dp->shortcuts[s] = FALSE; } } static int winctrl_cmp_byctrl(void *av, void *bv) { struct winctrl *a = (struct winctrl *)av; struct winctrl *b = (struct winctrl *)bv; if (a->ctrl < b->ctrl) return -1; else if (a->ctrl > b->ctrl) return +1; else return 0; } static int winctrl_cmp_byid(void *av, void *bv) { struct winctrl *a = (struct winctrl *)av; struct winctrl *b = (struct winctrl *)bv; if (a->base_id < b->base_id) return -1; else if (a->base_id > b->base_id) return +1; else return 0; } static int winctrl_cmp_byctrl_find(void *av, void *bv) { union control *a = (union control *)av; struct winctrl *b = (struct winctrl *)bv; if (a < b->ctrl) return -1; else if (a > b->ctrl) return +1; else return 0; } static int winctrl_cmp_byid_find(void *av, void *bv) { int *a = (int *)av; struct winctrl *b = (struct winctrl *)bv; if (*a < b->base_id) return -1; else if (*a >= b->base_id + b->num_ids) return +1; else return 0; } void winctrl_init(struct winctrls *wc) { wc->byctrl = newtree234(winctrl_cmp_byctrl); wc->byid = newtree234(winctrl_cmp_byid); } void winctrl_cleanup(struct winctrls *wc) { struct winctrl *c; while ((c = index234(wc->byid, 0)) != NULL) { winctrl_remove(wc, c); sfree(c->data); sfree(c); } freetree234(wc->byctrl); freetree234(wc->byid); wc->byctrl = wc->byid = NULL; } void winctrl_add(struct winctrls *wc, struct winctrl *c) { struct winctrl *ret; if (c->ctrl) { ret = add234(wc->byctrl, c); assert(ret == c); } ret = add234(wc->byid, c); assert(ret == c); } void winctrl_remove(struct winctrls *wc, struct winctrl *c) { struct winctrl *ret; ret = del234(wc->byctrl, c); ret = del234(wc->byid, c); assert(ret == c); } struct winctrl *winctrl_findbyctrl(struct winctrls *wc, union control *ctrl) { return find234(wc->byctrl, ctrl, winctrl_cmp_byctrl_find); } struct winctrl *winctrl_findbyid(struct winctrls *wc, int id) { return find234(wc->byid, &id, winctrl_cmp_byid_find); } struct winctrl *winctrl_findbyindex(struct winctrls *wc, int index) { return index234(wc->byid, index); } void winctrl_layout(struct dlgparam *dp, struct winctrls *wc, struct ctlpos *cp, struct controlset *s, int *id) { struct ctlpos columns[16]; int ncols, colstart, colspan; struct ctlpos tabdelays[16]; union control *tabdelayed[16]; int ntabdelays; struct ctlpos pos; char shortcuts[MAX_SHORTCUTS_PER_CTRL], nshortcuts; char *escaped; int i, base_id, num_ids, orig_tabdelay; void *data; base_id = *id; /* Start a containing box, if we have a boxname. */ if (s->boxname && *s->boxname) { struct winctrl *c = smalloc(sizeof(struct winctrl)); c->ctrl = NULL; c->base_id = base_id; c->num_ids = 1; c->data = NULL; memset(c->shortcuts, NO_SHORTCUT, lenof(c->shortcuts)); winctrl_add(wc, c); beginbox(cp, s->boxtitle, base_id); base_id++; } /* Draw a title, if we have one. */ if (!s->boxname && s->boxtitle) { struct winctrl *c = smalloc(sizeof(struct winctrl)); c->ctrl = NULL; c->base_id = base_id; c->num_ids = 1; c->data = dupstr(s->boxtitle); memset(c->shortcuts, NO_SHORTCUT, lenof(c->shortcuts)); winctrl_add(wc, c); paneltitle(cp, base_id); base_id++; } /* Initially we have just one column. */ ncols = 1; columns[0] = *cp; /* structure copy */ /* And initially, there are no pending tab-delayed controls. */ ntabdelays = 0; /* Loop over each control in the controlset. */ for (i = 0; i < s->ncontrols; i++) { union control *ctrl = s->ctrls[i]; orig_tabdelay = FALSE; /* * Generic processing that pertains to all control types. * At the end of this if statement, we'll have produced * `ctrl' (a pointer to the control we have to create, or * think about creating, in this iteration of the loop), * `pos' (a suitable ctlpos with which to position it), and * `c' (a winctrl structure to receive details of the * dialog IDs). Or we'll have done a `continue', if it was * CTRL_COLUMNS and doesn't require any control creation at * all. */ if (ctrl->generic.type == CTRL_COLUMNS) { assert((ctrl->columns.ncols == 1) ^ (ncols == 1)); if (ncols == 1) { /* * We're splitting into multiple columns. */ int lpercent, rpercent, lx, rx, i; ncols = ctrl->columns.ncols; assert(ncols <= lenof(columns)); for (i = 1; i < ncols; i++) columns[i] = columns[0]; /* structure copy */ lpercent = 0; for (i = 0; i < ncols; i++) { rpercent = lpercent + ctrl->columns.percentages[i]; lx = columns[i].xoff + lpercent * (columns[i].width + GAPBETWEEN) / 100; rx = columns[i].xoff + rpercent * (columns[i].width + GAPBETWEEN) / 100; columns[i].xoff = lx; columns[i].width = rx - lx - GAPBETWEEN; lpercent = rpercent; } } else { /* * We're recombining the various columns into one. */ int maxy = columns[0].ypos; int i; for (i = 1; i < ncols; i++) if (maxy < columns[i].ypos) maxy = columns[i].ypos; ncols = 1; columns[0] = *cp; /* structure copy */ columns[0].ypos = maxy; } continue; } else if (ctrl->generic.type == CTRL_TABDELAY) { int i; assert(!ctrl->generic.tabdelay); ctrl = ctrl->tabdelay.ctrl; orig_tabdelay = TRUE; for (i = 0; i < ntabdelays; i++) if (tabdelayed[i] == ctrl) break; assert(i < ntabdelays); /* we have to have found it */ pos = tabdelays[i]; /* structure copy */ } else { /* * If it wasn't one of those, it's a genuine control; * so we'll have to compute a position for it now, by * checking its column span. */ int col; colstart = COLUMN_START(ctrl->generic.column); colspan = COLUMN_SPAN(ctrl->generic.column); pos = columns[colstart]; /* structure copy */ pos.width = columns[colstart+colspan-1].width + (columns[colstart+colspan-1].xoff - columns[colstart].xoff); for (col = colstart; col < colstart+colspan; col++) if (pos.ypos < columns[col].ypos) pos.ypos = columns[col].ypos; /* * If this control is to be tabdelayed, add it to the * tabdelay list, and unset pos.hwnd to inhibit actual * control creation. */ if (ctrl->generic.tabdelay) { assert(ntabdelays < lenof(tabdelays)); tabdelays[ntabdelays] = pos; /* structure copy */ tabdelayed[ntabdelays] = ctrl; ntabdelays++; pos.hwnd = NULL; } } /* Most controls don't need anything in c->data. */ data = NULL; /* And they all start off with no shortcuts registered. */ memset(shortcuts, NO_SHORTCUT, lenof(shortcuts)); nshortcuts = 0; /* * Now we're ready to actually create the control, by * switching on its type. */ switch (ctrl->generic.type) { case CTRL_TEXT: { char *wrapped, *escaped; int lines; num_ids = 1; wrapped = staticwrap(&pos, cp->hwnd, ctrl->generic.label, &lines); escaped = shortcut_escape(wrapped, NO_SHORTCUT); statictext(&pos, escaped, lines, base_id); sfree(escaped); sfree(wrapped); } break; case CTRL_EDITBOX: num_ids = 2; /* static, edit */ escaped = shortcut_escape(ctrl->editbox.label, ctrl->editbox.shortcut); shortcuts[nshortcuts++] = ctrl->editbox.shortcut; if (ctrl->editbox.percentwidth == 100) { if (ctrl->editbox.has_list) combobox(&pos, escaped, base_id, base_id+1); else multiedit(&pos, ctrl->editbox.password, escaped, base_id, base_id+1, 100, NULL); } else { if (ctrl->editbox.has_list) { staticcombo(&pos, escaped, base_id, base_id+1, ctrl->editbox.percentwidth); } else { (ctrl->editbox.password ? staticpassedit : staticedit) (&pos, escaped, base_id, base_id+1, ctrl->editbox.percentwidth); } } sfree(escaped); break; case CTRL_RADIO: num_ids = ctrl->radio.nbuttons + 1; /* label as well */ { struct radio *buttons; int i; escaped = shortcut_escape(ctrl->radio.label, ctrl->radio.shortcut); shortcuts[nshortcuts++] = ctrl->radio.shortcut; buttons = smalloc(ctrl->radio.nbuttons * sizeof(struct radio)); for (i = 0; i < ctrl->radio.nbuttons; i++) { buttons[i].text = shortcut_escape(ctrl->radio.buttons[i], (char)(ctrl->radio.shortcuts ? ctrl->radio.shortcuts[i] : NO_SHORTCUT)); buttons[i].id = base_id + 1 + i; if (ctrl->radio.shortcuts) { assert(nshortcuts < MAX_SHORTCUTS_PER_CTRL); shortcuts[nshortcuts++] = ctrl->radio.shortcuts[i]; } } radioline_common(&pos, escaped, base_id, ctrl->radio.ncolumns, buttons, ctrl->radio.nbuttons); for (i = 0; i < ctrl->radio.nbuttons; i++) { sfree(buttons[i].text); } sfree(buttons); sfree(escaped); } break; case CTRL_CHECKBOX: num_ids = 1; escaped = shortcut_escape(ctrl->checkbox.label, ctrl->checkbox.shortcut); shortcuts[nshortcuts++] = ctrl->checkbox.shortcut; checkbox(&pos, escaped, base_id); sfree(escaped); break; case CTRL_BUTTON: escaped = shortcut_escape(ctrl->button.label, ctrl->button.shortcut); shortcuts[nshortcuts++] = ctrl->button.shortcut; num_ids = 1; button(&pos, escaped, base_id, ctrl->button.isdefault); sfree(escaped); break; case CTRL_LISTBOX: num_ids = 2; escaped = shortcut_escape(ctrl->listbox.label, ctrl->listbox.shortcut); shortcuts[nshortcuts++] = ctrl->listbox.shortcut; if (ctrl->listbox.draglist) { data = smalloc(sizeof(struct prefslist)); num_ids = 4; prefslist(data, &pos, ctrl->listbox.height, escaped, base_id, base_id+1, base_id+2, base_id+3); shortcuts[nshortcuts++] = 'u'; /* Up */ shortcuts[nshortcuts++] = 'd'; /* Down */ } else if (ctrl->listbox.height == 0) { /* Drop-down list. */ if (ctrl->listbox.percentwidth == 100) { staticddlbig(&pos, escaped, base_id, base_id+1); } else { staticddl(&pos, escaped, base_id, base_id+1, ctrl->listbox.percentwidth); } } else { /* Ordinary list. */ listbox(&pos, escaped, base_id, base_id+1, ctrl->listbox.height, ctrl->listbox.multisel); } if (ctrl->listbox.ncols) { /* * This method of getting the box width is a bit of * a hack; we'd do better to try to retrieve the * actual width in dialog units from doctl() just * before MapDialogRect. But that's going to be no * fun, and this should be good enough accuracy. */ int width = cp->width * ctrl->listbox.percentwidth; int *tabarray; int i, percent; tabarray = smalloc((ctrl->listbox.ncols-1) * sizeof(int)); percent = 0; for (i = 0; i < ctrl->listbox.ncols-1; i++) { percent += ctrl->listbox.percentages[i]; tabarray[i] = width * percent / 10000; } SendDlgItemMessage(cp->hwnd, base_id+1, LB_SETTABSTOPS, ctrl->listbox.ncols-1, (LPARAM)tabarray); sfree(tabarray); } sfree(escaped); break; case CTRL_FILESELECT: num_ids = 3; escaped = shortcut_escape(ctrl->fileselect.label, ctrl->fileselect.shortcut); shortcuts[nshortcuts++] = ctrl->fileselect.shortcut; editbutton(&pos, escaped, base_id, base_id+1, "Bro&wse...", base_id+2); shortcuts[nshortcuts++] = 'w'; sfree(escaped); break; case CTRL_FONTSELECT: num_ids = 3; escaped = shortcut_escape(ctrl->fontselect.label, ctrl->fontselect.shortcut); shortcuts[nshortcuts++] = ctrl->fontselect.shortcut; statictext(&pos, escaped, 1, base_id); staticbtn(&pos, "", base_id+1, "Change...", base_id+2); sfree(escaped); data = smalloc(sizeof(FontSpec)); break; default: assert(!"Can't happen"); break; } /* * Create a `struct winctrl' for this control, and advance * the dialog ID counter, if it's actually been created * (and isn't tabdelayed). */ if (pos.hwnd) { struct winctrl *c = smalloc(sizeof(struct winctrl)); c->ctrl = ctrl; c->base_id = base_id; c->num_ids = num_ids; c->data = data; memcpy(c->shortcuts, shortcuts, sizeof(shortcuts)); winctrl_add(wc, c); winctrl_add_shortcuts(dp, c); base_id += num_ids; } if (!orig_tabdelay) { /* * Update the ypos in all columns crossed by this * control. */ int i; for (i = colstart; i < colstart+colspan; i++) columns[i].ypos = pos.ypos; } } /* * We've now finished laying out the controls; so now update * the ctlpos and control ID that were passed in, terminate * any containing box, and return. */ for (i = 0; i < ncols; i++) if (cp->ypos < columns[i].ypos) cp->ypos = columns[i].ypos; *id = base_id; if (s->boxname && *s->boxname) endbox(cp); } static void winctrl_set_focus(union control *ctrl, struct dlgparam *dp, int has_focus) { if (has_focus) { if (dp->focused) dp->lastfocused = dp->focused; dp->focused = ctrl; } else if (!has_focus && dp->focused == ctrl) { dp->lastfocused = dp->focused; dp->focused = NULL; } } union control *dlg_last_focused(void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; return dp->lastfocused; } /* * The dialog-box procedure calls this function to handle Windows * messages on a control we manage. */ int winctrl_handle_command(struct dlgparam *dp, UINT msg, WPARAM wParam, LPARAM lParam) { struct winctrl *c; union control *ctrl; int i, id, ret; static UINT draglistmsg = WM_NULL; /* * Filter out pointless window messages. Our interest is in * WM_COMMAND and the drag list message, and nothing else. */ if (draglistmsg == WM_NULL) draglistmsg = RegisterWindowMessage (DRAGLISTMSGSTRING); if (msg != draglistmsg && msg != WM_COMMAND && msg != WM_DRAWITEM) return 0; /* * Look up the control ID in our data. */ for (i = 0; i < dp->nctrltrees; i++) { c = winctrl_findbyid(dp->controltrees[i], LOWORD(wParam)); if (c) break; } if (!c) return 0; /* we have nothing to do */ if (msg == WM_DRAWITEM) { /* * Owner-draw request for a panel title. */ LPDRAWITEMSTRUCT di = (LPDRAWITEMSTRUCT) lParam; HDC hdc = di->hDC; RECT r = di->rcItem; SIZE s; GetTextExtentPoint32(hdc, (char *)c->data, strlen((char *)c->data), &s); DrawEdge(hdc, &r, EDGE_ETCHED, BF_ADJUST | BF_RECT); TextOut(hdc, r.left + (r.right-r.left-s.cx)/2, r.top + (r.bottom-r.top-s.cy)/2, (char *)c->data, strlen((char *)c->data)); return TRUE; } ctrl = c->ctrl; id = LOWORD(wParam) - c->base_id; if (!ctrl || !ctrl->generic.handler) return 0; /* nothing we can do here */ /* * From here on we do not issue `return' statements until the * very end of the dialog box: any event handler is entitled to * ask for a colour selector, so we _must_ always allow control * to reach the end of this switch statement so that the * subsequent code can test dp->coloursel_wanted(). */ ret = 0; dp->coloursel_wanted = FALSE; /* * Now switch on the control type and the message. */ switch (ctrl->generic.type) { case CTRL_EDITBOX: if (msg == WM_COMMAND && !ctrl->editbox.has_list && (HIWORD(wParam) == EN_SETFOCUS || HIWORD(wParam) == EN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == EN_SETFOCUS); if (msg == WM_COMMAND && ctrl->editbox.has_list && (HIWORD(wParam)==CBN_SETFOCUS || HIWORD(wParam)==CBN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == CBN_SETFOCUS); if (msg == WM_COMMAND && !ctrl->editbox.has_list && HIWORD(wParam) == EN_CHANGE) ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE); if (msg == WM_COMMAND && ctrl->editbox.has_list) { if (HIWORD(wParam) == CBN_SELCHANGE) { int index, len; char *text; index = SendDlgItemMessage(dp->hwnd, c->base_id+1, CB_GETCURSEL, 0, 0); len = SendDlgItemMessage(dp->hwnd, c->base_id+1, CB_GETLBTEXTLEN, index, 0); text = smalloc(len+1); SendDlgItemMessage(dp->hwnd, c->base_id+1, CB_GETLBTEXT, index, (LPARAM)text); SetDlgItemText(dp->hwnd, c->base_id+1, text); sfree(text); ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE); } else if (HIWORD(wParam) == CBN_EDITCHANGE) { ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE); } else if (HIWORD(wParam) == CBN_KILLFOCUS) { ctrl->generic.handler(ctrl, dp, dp->data, EVENT_REFRESH); } } break; case CTRL_RADIO: if (msg == WM_COMMAND && (HIWORD(wParam) == BN_SETFOCUS || HIWORD(wParam) == BN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == BN_SETFOCUS); /* * We sometimes get spurious BN_CLICKED messages for the * radio button that is just about to _lose_ selection, if * we're switching using the arrow keys. Therefore we * double-check that the button in wParam is actually * checked before generating an event. */ if (msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED && IsDlgButtonChecked(dp->hwnd, LOWORD(wParam))) { ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE); } break; case CTRL_CHECKBOX: if (msg == WM_COMMAND && (HIWORD(wParam) == BN_SETFOCUS || HIWORD(wParam) == BN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == BN_SETFOCUS); if (msg == WM_COMMAND && (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED)) { ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE); } break; case CTRL_BUTTON: if (msg == WM_COMMAND && (HIWORD(wParam) == BN_SETFOCUS || HIWORD(wParam) == BN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == BN_SETFOCUS); if (msg == WM_COMMAND && (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED)) { ctrl->generic.handler(ctrl, dp, dp->data, EVENT_ACTION); } break; case CTRL_LISTBOX: if (msg == WM_COMMAND && ctrl->listbox.height != 0 && (HIWORD(wParam)==LBN_SETFOCUS || HIWORD(wParam)==LBN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == LBN_SETFOCUS); if (msg == WM_COMMAND && ctrl->listbox.height == 0 && (HIWORD(wParam)==CBN_SETFOCUS || HIWORD(wParam)==CBN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == CBN_SETFOCUS); if (msg == WM_COMMAND && id >= 2 && (HIWORD(wParam) == BN_SETFOCUS || HIWORD(wParam) == BN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == BN_SETFOCUS); if (ctrl->listbox.draglist) { int pret; pret = handle_prefslist(c->data, NULL, 0, (msg != WM_COMMAND), dp->hwnd, wParam, lParam); if (pret & 2) ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE); ret = pret & 1; } else { if (msg == WM_COMMAND && HIWORD(wParam) == LBN_DBLCLK) { SetCapture(dp->hwnd); ctrl->generic.handler(ctrl, dp, dp->data, EVENT_ACTION); } else if (msg == WM_COMMAND && HIWORD(wParam) == LBN_SELCHANGE) { ctrl->generic.handler(ctrl, dp, dp->data, EVENT_SELCHANGE); } } break; case CTRL_FILESELECT: if (msg == WM_COMMAND && id == 1 && (HIWORD(wParam) == EN_SETFOCUS || HIWORD(wParam) == EN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == EN_SETFOCUS); if (msg == WM_COMMAND && id == 2 && (HIWORD(wParam) == BN_SETFOCUS || HIWORD(wParam) == BN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == BN_SETFOCUS); if (id == 2 && (msg == WM_COMMAND && (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED))) { OPENFILENAME of; char filename[FILENAME_MAX]; int ret; memset(&of, 0, sizeof(of)); #ifdef OPENFILENAME_SIZE_VERSION_400 of.lStructSize = OPENFILENAME_SIZE_VERSION_400; #else of.lStructSize = sizeof(of); #endif of.hwndOwner = dp->hwnd; if (ctrl->fileselect.filter) of.lpstrFilter = ctrl->fileselect.filter; else of.lpstrFilter = "All Files (*.*)\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filename; GetDlgItemText(dp->hwnd, c->base_id+1, filename, lenof(filename)); filename[lenof(filename)-1] = '\0'; of.nMaxFile = lenof(filename); of.lpstrFileTitle = NULL; of.lpstrInitialDir = NULL; of.lpstrTitle = ctrl->fileselect.title; of.Flags = 0; if (ctrl->fileselect.for_writing) ret = GetSaveFileName(&of); else ret = GetOpenFileName(&of); if (ret) { SetDlgItemText(dp->hwnd, c->base_id + 1, filename); ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE); } } break; case CTRL_FONTSELECT: if (msg == WM_COMMAND && id == 2 && (HIWORD(wParam) == BN_SETFOCUS || HIWORD(wParam) == BN_KILLFOCUS)) winctrl_set_focus(ctrl, dp, HIWORD(wParam) == BN_SETFOCUS); if (id == 2 && (msg == WM_COMMAND && (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED))) { CHOOSEFONT cf; LOGFONT lf; HDC hdc; FontSpec fs = *(FontSpec *)c->data; hdc = GetDC(0); lf.lfHeight = -MulDiv(fs.height, GetDeviceCaps(hdc, LOGPIXELSY), 72); ReleaseDC(0, hdc); lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0; lf.lfItalic = lf.lfUnderline = lf.lfStrikeOut = 0; lf.lfWeight = (fs.isbold ? FW_BOLD : 0); lf.lfCharSet = fs.charset; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE; strncpy(lf.lfFaceName, fs.name, sizeof(lf.lfFaceName) - 1); lf.lfFaceName[sizeof(lf.lfFaceName) - 1] = '\0'; cf.lStructSize = sizeof(cf); cf.hwndOwner = dp->hwnd; cf.lpLogFont = &lf; cf.Flags = CF_FIXEDPITCHONLY | CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS; if (ChooseFont(&cf)) { strncpy(fs.name, lf.lfFaceName, sizeof(fs.name) - 1); fs.name[sizeof(fs.name) - 1] = '\0'; fs.isbold = (lf.lfWeight == FW_BOLD); fs.charset = lf.lfCharSet; fs.height = cf.iPointSize / 10; dlg_fontsel_set(ctrl, dp, fs); ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE); } } break; } /* * If the above event handler has asked for a colour selector, * now is the time to generate one. */ if (dp->coloursel_wanted) { static CHOOSECOLOR cc; static DWORD custom[16] = { 0 }; /* zero initialisers */ cc.lStructSize = sizeof(cc); cc.hwndOwner = dp->hwnd; cc.hInstance = (HWND) hinst; cc.lpCustColors = custom; cc.rgbResult = RGB(dp->coloursel_result.r, dp->coloursel_result.g, dp->coloursel_result.b); cc.Flags = CC_FULLOPEN | CC_RGBINIT; if (ChooseColor(&cc)) { dp->coloursel_result.r = (unsigned char) (cc.rgbResult & 0xFF); dp->coloursel_result.g = (unsigned char) (cc.rgbResult >> 8) & 0xFF; dp->coloursel_result.b = (unsigned char) (cc.rgbResult >> 16) & 0xFF; dp->coloursel_result.ok = TRUE; } else dp->coloursel_result.ok = FALSE; ctrl->generic.handler(ctrl, dp, dp->data, EVENT_CALLBACK); } return ret; } /* * This function can be called to produce context help on a * control. Returns TRUE if it has actually launched WinHelp. */ int winctrl_context_help(struct dlgparam *dp, HWND hwnd, int id) { int i; struct winctrl *c; char *cmd; /* * Look up the control ID in our data. */ for (i = 0; i < dp->nctrltrees; i++) { c = winctrl_findbyid(dp->controltrees[i], id); if (c) break; } if (!c) return 0; /* we have nothing to do */ /* * This is the Windows front end, so we're allowed to assume * `helpctx.p' is a context string. */ if (!c->ctrl || !c->ctrl->generic.helpctx.p) return 0; /* no help available for this ctrl */ cmd = dupprintf("JI(`',`%s')", c->ctrl->generic.helpctx.p); WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); sfree(cmd); return 1; } /* * Now the various functions that the platform-independent * mechanism can call to access the dialog box entries. */ static struct winctrl *dlg_findbyctrl(struct dlgparam *dp, union control *ctrl) { int i; for (i = 0; i < dp->nctrltrees; i++) { struct winctrl *c = winctrl_findbyctrl(dp->controltrees[i], ctrl); if (c) return c; } return NULL; } void dlg_radiobutton_set(union control *ctrl, void *dlg, int whichbutton) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_RADIO); CheckRadioButton(dp->hwnd, c->base_id + 1, c->base_id + c->ctrl->radio.nbuttons, c->base_id + 1 + whichbutton); } int dlg_radiobutton_get(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); int i; assert(c && c->ctrl->generic.type == CTRL_RADIO); for (i = 0; i < c->ctrl->radio.nbuttons; i++) if (IsDlgButtonChecked(dp->hwnd, c->base_id + 1 + i)) return i; assert(!"No radio button was checked?!"); return 0; } void dlg_checkbox_set(union control *ctrl, void *dlg, int checked) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_CHECKBOX); CheckDlgButton(dp->hwnd, c->base_id, (checked != 0)); } int dlg_checkbox_get(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_CHECKBOX); return 0 != IsDlgButtonChecked(dp->hwnd, c->base_id); } void dlg_editbox_set(union control *ctrl, void *dlg, char const *text) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_EDITBOX); SetDlgItemText(dp->hwnd, c->base_id+1, text); } void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_EDITBOX); GetDlgItemText(dp->hwnd, c->base_id+1, buffer, length); buffer[length-1] = '\0'; } /* The `listbox' functions can also apply to combo boxes. */ void dlg_listbox_clear(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); int msg; assert(c && (c->ctrl->generic.type == CTRL_LISTBOX || c->ctrl->generic.type == CTRL_EDITBOX && c->ctrl->editbox.has_list)); msg = (c->ctrl->generic.type==CTRL_LISTBOX && c->ctrl->listbox.height!=0 ? LB_RESETCONTENT : CB_RESETCONTENT); SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, 0, 0); } void dlg_listbox_del(union control *ctrl, void *dlg, int index) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); int msg; assert(c && (c->ctrl->generic.type == CTRL_LISTBOX || c->ctrl->generic.type == CTRL_EDITBOX && c->ctrl->editbox.has_list)); msg = (c->ctrl->generic.type==CTRL_LISTBOX && c->ctrl->listbox.height!=0 ? LB_DELETESTRING : CB_DELETESTRING); SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, index, 0); } void dlg_listbox_add(union control *ctrl, void *dlg, char const *text) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); int msg; assert(c && (c->ctrl->generic.type == CTRL_LISTBOX || c->ctrl->generic.type == CTRL_EDITBOX && c->ctrl->editbox.has_list)); msg = (c->ctrl->generic.type==CTRL_LISTBOX && c->ctrl->listbox.height!=0 ? LB_ADDSTRING : CB_ADDSTRING); SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, 0, (LPARAM)text); } /* * Each listbox entry may have a numeric id associated with it. * Note that some front ends only permit a string to be stored at * each position, which means that _if_ you put two identical * strings in any listbox then you MUST not assign them different * IDs and expect to get meaningful results back. */ void dlg_listbox_addwithindex(union control *ctrl, void *dlg, char const *text, int id) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); int msg, msg2, index; assert(c && (c->ctrl->generic.type == CTRL_LISTBOX || c->ctrl->generic.type == CTRL_EDITBOX && c->ctrl->editbox.has_list)); msg = (c->ctrl->generic.type==CTRL_LISTBOX && c->ctrl->listbox.height!=0 ? LB_ADDSTRING : CB_ADDSTRING); msg2 = (c->ctrl->generic.type==CTRL_LISTBOX && c->ctrl->listbox.height!=0 ? LB_SETITEMDATA : CB_SETITEMDATA); index = SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, 0, (LPARAM)text); SendDlgItemMessage(dp->hwnd, c->base_id+1, msg2, index, (LPARAM)id); } int dlg_listbox_getid(union control *ctrl, void *dlg, int index) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); int msg; assert(c && c->ctrl->generic.type == CTRL_LISTBOX); msg = (c->ctrl->listbox.height != 0 ? LB_GETITEMDATA : CB_GETITEMDATA); return SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, index, 0); } /* dlg_listbox_index returns <0 if no single element is selected. */ int dlg_listbox_index(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); int msg, ret; assert(c && c->ctrl->generic.type == CTRL_LISTBOX && !c->ctrl->listbox.multisel); msg = (c->ctrl->listbox.height != 0 ? LB_GETCURSEL : CB_GETCURSEL); ret = SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, 0, 0); if (ret == LB_ERR) return -1; else return ret; } int dlg_listbox_issel(union control *ctrl, void *dlg, int index) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_LISTBOX && c->ctrl->listbox.multisel && c->ctrl->listbox.height != 0); return SendDlgItemMessage(dp->hwnd, c->base_id+1, LB_GETSEL, index, 0); } void dlg_listbox_select(union control *ctrl, void *dlg, int index) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); int msg; assert(c && c->ctrl->generic.type == CTRL_LISTBOX && !c->ctrl->listbox.multisel); msg = (c->ctrl->listbox.height != 0 ? LB_SETCURSEL : CB_SETCURSEL); SendDlgItemMessage(dp->hwnd, c->base_id+1, msg, index, 0); } void dlg_text_set(union control *ctrl, void *dlg, char const *text) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_TEXT); SetDlgItemText(dp->hwnd, c->base_id, text); } void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_FILESELECT); SetDlgItemText(dp->hwnd, c->base_id+1, fn.path); } void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_FILESELECT); GetDlgItemText(dp->hwnd, c->base_id+1, fn->path, lenof(fn->path)); fn->path[lenof(fn->path)-1] = '\0'; } void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec fs) { char *buf, *boldstr; struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_FONTSELECT); *(FontSpec *)c->data = fs; /* structure copy */ boldstr = (fs.isbold ? "bold, " : ""); if (fs.height == 0) buf = dupprintf("Font: %s, %sdefault height", fs.name, boldstr); else buf = dupprintf("Font: %s, %s%d-point", fs.name, boldstr, (fs.height < 0 ? -fs.height : fs.height)); SetDlgItemText(dp->hwnd, c->base_id+1, buf); sfree(buf); } void dlg_fontsel_get(union control *ctrl, void *dlg, FontSpec *fs) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); assert(c && c->ctrl->generic.type == CTRL_FONTSELECT); *fs = *(FontSpec *)c->data; /* structure copy */ } /* * Bracketing a large set of updates in these two functions will * cause the front end (if possible) to delay updating the screen * until it's all complete, thus avoiding flicker. */ void dlg_update_start(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); if (c && c->ctrl->generic.type == CTRL_LISTBOX) { SendDlgItemMessage(dp->hwnd, c->base_id+1, WM_SETREDRAW, FALSE, 0); } } void dlg_update_done(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); if (c && c->ctrl->generic.type == CTRL_LISTBOX) { HWND hw = GetDlgItem(dp->hwnd, c->base_id+1); SendMessage(hw, WM_SETREDRAW, TRUE, 0); InvalidateRect(hw, NULL, TRUE); } } void dlg_set_focus(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct winctrl *c = dlg_findbyctrl(dp, ctrl); int id; HWND ctl; switch (ctrl->generic.type) { case CTRL_EDITBOX: id = c->base_id + 1; break; case CTRL_RADIO: for (id = c->base_id + ctrl->radio.nbuttons; id > 1; id--) if (IsDlgButtonChecked(dp->hwnd, id)) break; /* * In the theoretically-unlikely case that no button was * selected, id should come out of this as 1, which is a * reasonable enough choice. */ break; case CTRL_CHECKBOX: id = c->base_id; break; case CTRL_BUTTON: id = c->base_id; break; case CTRL_LISTBOX: id = c->base_id + 1; break; case CTRL_FILESELECT: id = c->base_id + 1; break; case CTRL_FONTSELECT: id = c->base_id + 2; break; default: id = c->base_id; break; } ctl = GetDlgItem(dp->hwnd, id); SetFocus(ctl); } /* * During event processing, you might well want to give an error * indication to the user. dlg_beep() is a quick and easy generic * error; dlg_error() puts up a message-box or equivalent. */ void dlg_beep(void *dlg) { /* struct dlgparam *dp = (struct dlgparam *)dlg; */ MessageBeep(0); } void dlg_error_msg(void *dlg, char *msg) { struct dlgparam *dp = (struct dlgparam *)dlg; MessageBox(dp->hwnd, msg, dp->errtitle ? dp->errtitle : NULL, MB_OK | MB_ICONERROR); } /* * This function signals to the front end that the dialog's * processing is completed, and passes an integer value (typically * a success status). */ void dlg_end(void *dlg, int value) { struct dlgparam *dp = (struct dlgparam *)dlg; dp->ended = TRUE; dp->endresult = value; } void dlg_refresh(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; int i, j; struct winctrl *c; if (!ctrl) { /* * Send EVENT_REFRESH to absolutely everything. */ for (j = 0; j < dp->nctrltrees; j++) { for (i = 0; (c = winctrl_findbyindex(dp->controltrees[j], i)) != NULL; i++) { if (c->ctrl && c->ctrl->generic.handler != NULL) c->ctrl->generic.handler(c->ctrl, dp, dp->data, EVENT_REFRESH); } } } else { /* * Send EVENT_REFRESH to a specific control. */ if (ctrl->generic.handler != NULL) ctrl->generic.handler(ctrl, dp, dp->data, EVENT_REFRESH); } } void dlg_coloursel_start(union control *ctrl, void *dlg, int r, int g, int b) { struct dlgparam *dp = (struct dlgparam *)dlg; dp->coloursel_wanted = TRUE; dp->coloursel_result.r = r; dp->coloursel_result.g = g; dp->coloursel_result.b = b; } int dlg_coloursel_results(union control *ctrl, void *dlg, int *r, int *g, int *b) { struct dlgparam *dp = (struct dlgparam *)dlg; if (dp->coloursel_result.ok) { *r = dp->coloursel_result.r; *g = dp->coloursel_result.g; *b = dp->coloursel_result.b; return 1; } else return 0; } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4bbf560e301bfa1a605422a2ac2b25c5 Text-delta-base-sha1: e73a311928f3b3ffb3fc78657ba2c454cbed212f Text-content-length: 13793 Text-content-md5: 60bbdbd6ea57b0775a958c2df2198c23 Text-content-sha1: 36f20d7333cc6f6dc473705bd18cb088a812ac94 Content-length: 13834 K 15 cvs2svn:cvs-rev V 5 1.208 PROPS-END SVNenqc|mEx|5 G"{ FMF]-_w9bjTTsh\limits.h> #include = 0 ;) { struct controlset *s = ctrlbox->ctrlsets[index]; winctrl_layout(&dp, wc, &cp, s, &base_id); } } /* * This function is the configuration box. */ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND hw, treeview; struct treeview_faff tvfaff; int ret; switch (msg) { case WM_INITDIALOG: dp.hwnd = hwnd; create_controls(hwnd, ""); /* Open and Cancel buttons etc */{ HTREEITEM hfirst = NULL; int i; char *path = NULL; for (i = 0; i < ctrlbox->nctrlsets; i++) { struct controlset *s = ctrlbox->ctrlsets[i]; HTREEITEM item; int j; char *c; if (!s->pathname[0]) continue; j = path ? ctrl_path_compare(s->pathname, path) : 0; if (j == INT_MAX) continue; /* same path, nothing to add to tree */ /* * We expect never to find an implicit path * component. For example, we expect never to see * A/B/C followed by A/D/E, because that would * _implicitly_ create A/D. All our path prefixes * are expected to contain actual controls and be * selectable in the treeview; so we would expect * to see A/D _explicitly_ before encountering * A/D/E. */ assert(j == ctrl_path_elements(s->pathname) - 1); c = strrchr(s->pathname, '/'); if (!c) c = s->pathname; else c++; item = treeview_insert(&tvfaff, j, c, s->pathname); if (!hfirst) hfirst = item; path = s->pathname; } /* * Put the treeview selection on to the Session panel. * This should also cause creation of the relevant * controls. */ TreeView_SelectItem(treeview, hfirst); } /* * Set focus into the first available control. */ { int i; struct winctrl *c; for (i = 0; (c = winctrl_findbyindex(&ctrls_panel, i)) != NULL; i++) { if (c->ctrl) { dlg_set_focus(c->ctrl, &dp); break; } } } SetWindowLong(hwnd, GWL_USERDATA, 1)dp.ended) EndDialog(hwnd, dp.endresult ? 1 : | TVIF_PARAM; TreeView_GetItem(((LPNMHDR) lParam)->hwndFrom, &item); { /* Destroy all controls in the currently visible panel. */ int k; HWND item; struct winctrl *c; while ((c = winctrl_findbyindex(&ctrls_panel, 0)) != NULL) { for (k = 0; k < c->num_ids; k++) { item = GetDlgItem(hwnd, c->base_id + k); if (item) DestroyWindow(item); } winctrl_rem_shortcuts(&dp, c); winctrl_remove(&ctrls_panel, c); sfree(c->data); sfree(c); } } create_controls(hwnd, (char *)item.lParam); dlg_refresh(NULL, &dp); /* set up control values */ case WM_DRAWITEM: default: /* also handle drag list msg here */ { ret = winctrl_handle_command(&dp, msg, wParam, lParam); if (dp.ended && GetCapture() != hwnd) EndDialog(hwnd, dp.endresult ? 1 : 0); } else ret = 0; return ret; case WM_HELP: if (help_path) { if (winctrl_context_help(&dp, hwnd, ((LPHELPINFO)lParam)->iCtrlId)) requested_help = TRUE; else MessageBeep(0); } break; case WM_CLOSE: if (requested_help) { WinHelp(hwnd, help_path, HELP_QUIT, 0); requested_help = FALSE; } EndDialog(hwnd, 0); return 0; /* Grrr Explorer will maximize Dialogs! */ case WM_SIZE: if (wParam == SIZE_MAXIMIZED) force_normal(hwnd); return 0; } return 0; } void modal_about_box(HWND hwnd) { EnableWindow(hwnd, 0); DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc); EnableWindow(hwnd, 1); SetActiveWindow(hwnd); } void show_help(HWND hwnd) { if (help_path) { WinHelp(hwnd, help_path, help_has_contents ? HELP_FINDER : HELP_CONTENTS, 0); requested_help = TRUE; } } void defuse_showwindow(void) { /* * Work around the fact that the app's first call to ShowWindow * will ignore the default in favour of the shell-provided * setting. */ { HWND hwnd; hwnd = CreateDialog(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, NullDlgProc); ShowWindow(hwnd, SW_HIDE); SetActiveWindow(hwnd); DestroyWindow(hwnd); } } int do_config(void) { int ret; ctrlbox = ctrl_new_box(); setup_config_box(ctrlbox, &sesslist, FALSE, 0); win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), FALSE); winctrl_init(&ctrls_base); winctrl_init(&ctrls_panel); dp.controltrees[0] = &ctrls_base; dp.controltrees[1] = &ctrls_panel; dp.nctrltrees = 2; dp.errtitle = "PuTTY Error"; dp.data = &cfg; dp.ended = FALSE; dp.lastfocused = NULL; memset(dp.shortcuts, 0, sizeof(dp.shortcuts)); dp.shortcuts['g'] = TRUE; /* the treeview: `Cate&gory' */ get_sesslist(&sesslist, TRUE); ret = DialogBox(hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL, GenericMainDlgProc); get_sesslist(&sesslist, FALSE); ctrl_free_box(ctrlbox); winctrl_cleanup(&ctrls_base); winctrl_cleanup(&ctrls_panel); return ret; } int do_reconfig(HWND hwnd) { Config backup_cfg; int ret; backup_cfg = cfg; /* structure copy */ ctrlbox = ctrl_new_box(); setup_config_box(ctrlbox, NULL, TRUE, cfg.protocol); win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), TRUE); winctrl_init(&ctrls_base); winctrl_init(&ctrls_panel); dp.controltrees[0] = &ctrls_base; dp.controltrees[1] = &ctrls_panel; dp.nctrltrees = 2; dp.errtitle = "PuTTY Error"; dp.data = &cfg; dp.ended = FALSE; dp.lastfocused = NULL; memset(dp.shortcuts, 0, sizeof(dp.shortcuts)); dp.shortcuts['g'] = TRUE; /* the treeview: `Cate&gory' */ ret = DialogBox(hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL, GenericMainDlgProc); ctrl_free_box(ctrlbox); winctrl_cleanup(&ctrls_base); winctrl_cleanup(&ctrls_panel); if (!ret) cfg = backup_cfg; /* structure copy */ return ret; } void logevent(void *frontend, char *string) { char timebuf[40]; time_t t; log_eventlog(logctx, string); if (nevents >= negsize) { negsize += 64; events = srealloc(events, negsize * sizeof(*events)); } time(&t); strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t", localtime(&t)); events[nevents] = smalloc(strlen(timebuf) + strlen(string) + 1); strcpy(events[nevents], timebuf); strcat(events[nevents], string); if (logbox) { int count; SendDlgItemMessage(logbox, IDN_LIST, LB_ADDSTRING, 0, (LPARAM) events[nevents]); count = SendDlgItemMessage(logbox, IDN_LIST, LB_GETCOUNT, 0, 0); SendDlgItemMessage(logbox, IDN_LIST, LB_SETTOPINDEX, count - 1, 0); } nevents++; } void showeventlog(HWND hwnd) { if (!logbox) { logbox = CreateDialog(hinst, MAKEINTRESOURCE(IDD_LOGBOX), hwnd, LogProc); ShowWindow(logbox, SW_SHOWNORMAL); } SetActiveWindow(logbox); } void showabout(HWND hwnd) { DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc); } void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; static const char absentmsg[] = "The server's host key is not cached in the registry. You\n" "have no guarantee that the server is the computer you\n" "think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, hit Yes to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you want to carry on connecting just once, without\n" "adding the key to the cache, hit No.\n" "If you do not trust this host, hit Cancel to abandon the\n" "connection.\n"; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "\n" "The server's host key does not match the one PuTTY has\n" "cached in the registry. This means that either the\n" "server administrator has changed the host key, or you\n" "have actually connected to another computer pretending\n" "to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "hit Yes to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, hit No.\n" "If you want to abandon the connection completely, hit\n" "Cancel. Hitting Cancel is the ONLY guaranteed safe\n" "choice.\n"; static const char mbtitle[] = "PuTTY Security Alert"; char message[160 + /* sensible fingerprint max size */ (sizeof(absentmsg) > sizeof(wrongmsg) ? sizeof(absentmsg) : sizeof(wrongmsg))]; /* * Verify the key against the registry. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; if (ret == 2) { /* key was different */ int mbret; sprintf(message, wrongmsg, fingerprint); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNOCANCEL); if (mbret == IDYES) store_host_key(host, port, keytype, keystr); if (mbret == IDCANCEL) cleanup_exit(0); } if (ret == 1) { /* key was absent */ int mbret; sprintf(message, absentmsg, fingerprint); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNOCANCEL); if (mbret == IDYES) store_host_key(host, port, keytype, keystr); if (mbret == IDCANCEL) cleanup_exit(0); } } /* * Ask whether the selected cipher is acceptable (since it was * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ void askcipher(void *frontend, char *ciphername, int cs) { static const char mbtitle[] = "PuTTY Security Alert"; static const char msg[] = "The first %.35scipher supported by the server\n" "is %.64s, which is below the configured\n" "warning threshold.\n" "Do you want to continue with this connection?\n"; /* guessed cipher name + type max length */ char message[100 + sizeof(msg)]; int mbret; sprintf(message, msg, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); mbret = MessageBox(NULL, message, mbtitle, MB_ICONWARNING | MB_YESNO); if (mbret == IDYES) return; else cleanup_exit(0); } /* * Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ int askappend(void *frontend, Filename filename) { static const char mbtitle[] = "PuTTY Log to File"; static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n" "You can overwrite it with a new session log,\n" "append your session log to the end of it,\n" "or disable session logging for this session.\n" "Hit Yes to wipe the file, No to append to it,\n" "or Cancel to disable logging."; char message[sizeof(msgtemplate) + FILENAME_MAX]; int mbret; sprintf(message, msgtemplate, FILENAME_MAX, filename.path); mbret = MessageBox(NULL, message, mbtitle, MB_ICONQUESTION | MB_YESNOCANCEL); if (mbret == IDYES) return 2; else if (mbret == IDNO) return 1; else return 0; } /* * Warn about the obsolescent key file format. * * Uniquely among these functions, this one does _not_ expect a * frontend handle. This means that if PuTTY is ported to a * platform which requires frontend handles, this function will be * an anomaly. Fortunately, the problem it addresses will not have * been present on that platform, so it can plausibly be * implemented as an empty function. */ void old_keyfile_warning(void) { static const char mbtitle[] = "PuTTY Key File Warning"; static const char message[] = "You are loading an SSH 2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "PuTTY may stop supporting this private key format,\n" "so we recommend you convert your key to the new\n" "format.\n" "\n" "You can perform this conversion by loading the key\n" "into PuTTYgen and then saving it again."; MessageBox(NULL, message, mbtitle, MB_OK); } Node-path: putty/winhelp.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5731 Text-content-md5: 452c52b56459280c7bd1ed0fb68567bf Text-content-sha1: 1483820326169a6014e94f34fc61d95ef0422383 Content-length: 5847 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNUUU/* * winhelp.h - define Windows Help context names for the controls * in the PuTTY config box. */ #define HELPCTX(x) P(WINHELP_CTX_ ## x) #define WINHELP_CTX_no_help NULL #define WINHELP_CTX_session_hostname "session.hostname" #define WINHELP_CTX_session_saved "session.saved" #define WINHELP_CTX_session_coe "session.coe" #define WINHELP_CTX_logging_main "logging.main" #define WINHELP_CTX_logging_filename "logging.filename" #define WINHELP_CTX_logging_exists "logging.exists" #define WINHELP_CTX_keyboard_backspace "keyboard.backspace" #define WINHELP_CTX_keyboard_homeend "keyboard.homeend" #define WINHELP_CTX_keyboard_funkeys "keyboard.funkeys" #define WINHELP_CTX_keyboard_appkeypad "keyboard.appkeypad" #define WINHELP_CTX_keyboard_appcursor "keyboard.appcursor" #define WINHELP_CTX_keyboard_nethack "keyboard.nethack" #define WINHELP_CTX_keyboard_compose "keyboard.compose" #define WINHELP_CTX_keyboard_ctrlalt "keyboard.ctrlalt" #define WINHELP_CTX_features_application "features.application" #define WINHELP_CTX_features_mouse "features.mouse" #define WINHELP_CTX_features_resize "features.resize" #define WINHELP_CTX_features_altscreen "features.altscreen" #define WINHELP_CTX_features_retitle "features.retitle" #define WINHELP_CTX_features_dbackspace "features.dbackspace" #define WINHELP_CTX_features_charset "features.charset" #define WINHELP_CTX_terminal_autowrap "terminal.autowrap" #define WINHELP_CTX_terminal_decom "terminal.decom" #define WINHELP_CTX_terminal_lfhascr "terminal.lfhascr" #define WINHELP_CTX_terminal_bce "terminal.bce" #define WINHELP_CTX_terminal_blink "terminal.blink" #define WINHELP_CTX_terminal_answerback "terminal.answerback" #define WINHELP_CTX_terminal_localecho "terminal.localecho" #define WINHELP_CTX_terminal_localedit "terminal.localedit" #define WINHELP_CTX_terminal_printing "terminal.printing" #define WINHELP_CTX_bell_style "bell.style" #define WINHELP_CTX_bell_taskbar "bell.taskbar" #define WINHELP_CTX_bell_overload "bell.overload" #define WINHELP_CTX_window_size "window.size" #define WINHELP_CTX_window_resize "window.resize" #define WINHELP_CTX_window_scrollback "window.scrollback" #define WINHELP_CTX_behaviour_closewarn "behaviour.closewarn" #define WINHELP_CTX_behaviour_altf4 "behaviour.altf4" #define WINHELP_CTX_behaviour_altspace "behaviour.altspace" #define WINHELP_CTX_behaviour_altonly "behaviour.altonly" #define WINHELP_CTX_behaviour_alwaysontop "behaviour.alwaysontop" #define WINHELP_CTX_behaviour_altenter "behaviour.altenter" #define WINHELP_CTX_appearance_cursor "appearance.cursor" #define WINHELP_CTX_appearance_font "appearance.font" #define WINHELP_CTX_appearance_title "appearance.title" #define WINHELP_CTX_appearance_hidemouse "appearance.hidemouse" #define WINHELP_CTX_appearance_border "appearance.border" #define WINHELP_CTX_connection_termtype "connection.termtype" #define WINHELP_CTX_connection_username "connection.username" #define WINHELP_CTX_connection_keepalive "connection.keepalive" #define WINHELP_CTX_connection_nodelay "connection.nodelay" #define WINHELP_CTX_proxy_type "proxy.type" #define WINHELP_CTX_proxy_main "proxy.main" #define WINHELP_CTX_proxy_exclude "proxy.exclude" #define WINHELP_CTX_proxy_dns "proxy.dns" #define WINHELP_CTX_proxy_auth "proxy.auth" #define WINHELP_CTX_proxy_command "proxy.command" #define WINHELP_CTX_proxy_socksver "proxy.socksver" #define WINHELP_CTX_telnet_termspeed "telnet.termspeed" #define WINHELP_CTX_telnet_environ "telnet.environ" #define WINHELP_CTX_telnet_oldenviron "telnet.oldenviron" #define WINHELP_CTX_telnet_passive "telnet.passive" #define WINHELP_CTX_telnet_specialkeys "telnet.specialkeys" #define WINHELP_CTX_telnet_newline "telnet.newline" #define WINHELP_CTX_rlogin_termspeed "rlogin.termspeed" #define WINHELP_CTX_rlogin_localuser "rlogin.localuser" #define WINHELP_CTX_ssh_nopty "ssh.nopty" #define WINHELP_CTX_ssh_ciphers "ssh.ciphers" #define WINHELP_CTX_ssh_protocol "ssh.protocol" #define WINHELP_CTX_ssh_command "ssh.command" #define WINHELP_CTX_ssh_compress "ssh.compress" #define WINHELP_CTX_ssh_auth_privkey "ssh.auth.privkey" #define WINHELP_CTX_ssh_auth_agentfwd "ssh.auth.agentfwd" #define WINHELP_CTX_ssh_auth_changeuser "ssh.auth.changeuser" #define WINHELP_CTX_ssh_auth_tis "ssh.auth.tis" #define WINHELP_CTX_ssh_auth_ki "ssh.auth.ki" #define WINHELP_CTX_selection_buttons "selection.buttons" #define WINHELP_CTX_selection_shiftdrag "selection.shiftdrag" #define WINHELP_CTX_selection_rect "selection.rect" #define WINHELP_CTX_selection_charclasses "selection.charclasses" #define WINHELP_CTX_selection_linedraw "selection.linedraw" #define WINHELP_CTX_selection_rtf "selection.rtf" #define WINHELP_CTX_colours_bold "colours.bold" #define WINHELP_CTX_colours_logpal "colours.logpal" #define WINHELP_CTX_colours_config "colours.config" #define WINHELP_CTX_translation_codepage "translation.codepage" #define WINHELP_CTX_translation_cyrillic "translation.cyrillic" #define WINHELP_CTX_translation_linedraw "translation.linedraw" #define WINHELP_CTX_ssh_tunnels_x11 "ssh.tunnels.x11" #define WINHELP_CTX_ssh_tunnels_x11auth "ssh.tunnels.x11auth" #define WINHELP_CTX_ssh_tunnels_portfwd "ssh.tunnels.portfwd" #define WINHELP_CTX_ssh_tunnels_portfwd_localhost "ssh.tunnels.portfwd.localhost" #define WINHELP_CTX_ssh_bugs_ignore1 "ssh.bugs.ignore1" #define WINHELP_CTX_ssh_bugs_plainpw1 "ssh.bugs.plainpw1" #define WINHELP_CTX_ssh_bugs_rsa1 "ssh.bugs.rsa1" #define WINHELP_CTX_ssh_bugs_hmac2 "ssh.bugs.hmac2" #define WINHELP_CTX_ssh_bugs_derivekey2 "ssh.bugs.derivekey2" #define WINHELP_CTX_ssh_bugs_rsapad2 "ssh.bugs.rsapad2" #define WINHELP_CTX_ssh_bugs_dhgex2 "ssh.bugs.dhgex2" #define WINHELP_CTX_ssh_bugs_pksessid2 "ssh.bugs.pksessid2" Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b0e48c2b21b82d02cff9380f45a1d56 Text-delta-base-sha1: 69a2330d89d547922c02d4075dff6908c5392dbc Text-content-length: 3060 Text-content-md5: f9f3b216aa2886e6d4d9a35b3025d01c Text-content-sha1: 51c960db529a20de7db09aed50635b042171c5fd Content-length: 3100 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNV.:"+ xB.">(^`?v#include "tree234.h" #include "winhelp.h"File-selector filter strings used in the config box. On Windows, * these strings are of exactly the type needed to go in * `lpstrFilter' in an OPENFILENAME structure. */ #define FILTER_KEY_FILES ("PuTTY Private Key Files (*.ppk)\0*.ppk\0" \ "All Files (*.*)\0*\0\0\0") #define FILTER_WAVE_FILES ("Wave Files (*.wav)\0*.WAV\0" \ "All Files (*.*)\0*\0\0\0"This structure is passed to event handler functions as the `dlg' * parameter, and hence is passed back to winctrls access functions. */ struct dlgparam { HWND hwnd; /* the hwnd of the dialog box */ struct winctrls *controltrees[8]; /* can have several of these */ int nctrltrees; char *errtitle; /* title of error sub-messageboxes */ void *data; /* data to pass in refresh events */ union control *focused, *lastfocused; /* which ctrl has focus now/before */ int coloursel_wanted; /* has an event handler asked for * a colour selector? */ char shortcuts[128]; /* track which shortcuts in use */ struct { unsigned char r, g, b, ok; } coloursel_result; /* 0-255 */ int ended, endresult; /* has the dialog been ended? */int passwordint lines, char *stext,#define MAX_SHORTCUTS_PER_CTRL 16 /* * This structure is what's stored for each `union control' in the * portable-dialog interface. */ struct winctrl { union control *ctrl; /* * The control may have several components at the Windows * level, with different dialog IDs. To avoid needing N * separate platformsidectrl structures (which could be stored * separately in a tree234 so that lookup by ID worked), we * impose the constraint that those IDs must be in a contiguous * block. */ int base_id; int num_ids; /* * Remember what keyboard shortcuts were used by this control, * so that when we remove it again we can take them out of the * list in the dlgparam. */ char shortcuts[MAX_SHORTCUTS_PER_CTRL]; /* * Some controls need a piece of allocated memory in which to * store temporary data about the control. */ void *data; }; /* * And this structure holds a set of the above, in two separate * tree234s so that it can find an item by `union control' or by * dialog ID. */ struct winctrls { tree234 *byctrl, *byid; }; void winctrl_init(struct winctrls *); void winctrl_cleanup(struct winctrls *); void winctrl_add(struct winctrls *, struct winctrl *); void winctrl_remove(struct winctrls *, struct winctrl *); struct winctrl *winctrl_findbyctrl(struct winctrls *, union control *); struct winctrl *winctrl_findbyid(struct winctrls *, int); struct winctrl *winctrl_findbyindex(struct winctrls *, int); void winctrl_layout(struct dlgparam *dp, struct winctrls *wc, struct ctlpos *cp, struct controlset *s, int *id); int winctrl_handle_command(struct dlgparam *dp, UINT msg, WPARAM wParam, LPARAM lParam Revision-number: 2909 Prop-content-length: 228 Content-length: 228 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-06T12:41:39.000000Z K 7 svn:log V 127 As usual, gcc is better at warnings than MSVC, so here are some pedantic fiddlings with the new config-box stuff to cure some. PROPS-END Node-path: putty/dialog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fad7ad12c4720b5d1bd294241fe03cdb Text-delta-base-sha1: 9cd0ada341c23d3c6bec73946477b968dce9567a Text-content-length: 120 Text-content-md5: 929ee5ba29cad33afd6226aa2b913218 Text-content-sha1: b509299bb7f8847442b4a5f90bcd1c81dbc7bb81 Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNPmZ-JH#include b^rF+xrD65H0rn 6C~cl]JZkUjJZk``Jyk$Jwk#include = 0c = NULL;(HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) && IsDlgButtonChecked(dp->hwnd, LOWORD(wParam))) {c = NULL;(c->ctrl->generic.type == CTRL_EDITBOX && c->ctrl->editbox.has_list)(c->ctrl->generic.type == CTRL_EDITBOX && c->ctrl->editbox.has_list)(c->ctrl->generic.type == CTRL_EDITBOX && c->ctrl->editbox.has_list)(c->ctrl->generic.type == CTRL_EDITBOX && c->ctrl->editbox.has_list) Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f9f3b216aa2886e6d4d9a35b3025d01c Text-delta-base-sha1: 51c960db529a20de7db09aed50635b042171c5fd Text-content-length: 383 Text-content-md5: ef656c0e6af4dfc8b6ad32bead6518ad Text-content-sha1: 84ddf29fb5b3a504a62f9b2ab59ab7cc06915355 Content-length: 423 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNVB[fVe<8ogstruct controlset; struct controlbox; void winctrl_rem_shortcuts(struct dlgparam *dp, struct winctrl *c); int winctrl_context_help(struct dlgparam *dp, HWND hwnd, int id); /* * Exports from wincfg.c. */ void win_setup_config_box(struct controlbox *b, HWND *hwndp, int has_help, int midsessionvoid modal_about_box(HWND hwnd); void show_help Revision-number: 2910 Prop-content-length: 321 Content-length: 321 K 8 svn:date V 27 2003-03-06T12:51:12.000000Z K 7 svn:log V 220 Richard B's patch to push erased text into the scrollback on ESC[2J clears, and also to temporarily push the primary screen contents into the scrollback while the alternate screen is active and bring it back afterwards. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 19c464e77842465acf8f35889ebadc2c Text-delta-base-sha1: b67a2750af3a72984c94e82952a968bceefc08eb Text-content-length: 189 Text-content-md5: 2308b8831ffb0a51d4e5654a51881401 Text-content-sha1: e41701ec4db83859ba587b1828cef280997e5488 Content-length: 228 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNa P K ctrl_checkbox(s, "Push erased text into scrollback", 'e', HELPCTX(window_erased), dlg_stdcheckbox_handler, I(offsetof(Config,erase_to_scrollback Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b66d57bdf81761e872a8510f2ce7711f Text-delta-base-sha1: 382cdbd7bf7531186049223d9bbc061a7761e0e8 Text-content-length: 682 Text-content-md5: d3b456217136f8d65f8f8d111100d7c6 Text-content-sha1: dd9c72f9bdd2543424eda2ec7058bd97cff5404a Content-length: 722 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN3 5WlG\versionid $Id: config.but,v 1.58 2003/03/06 12:51:12S{config-scrollback} \q{Push erased text into scrollback} \cfg{winhelp-topic}{window.erased} When this option is enabled, the contents of the terminal screen will be pushed into the scrollback when a server-side application clears the screen, so that your scrollback will contain a better record of what was on your screen in the past. If the application switches to the alternate screen (see \k{config-features-altscreen} for more about this), then the contents of the primary screen will be visible in the scrollback until the application switches back again. This option is enabled by default Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4ec9cf9b4c1ce0333077d7a008234eb1 Text-delta-base-sha1: 75fc23b835e128152e61bbea10b053250dd9e78e Text-content-length: 42 Text-content-md5: 5efbc1306498d54d2701fea069fc0042 Text-content-sha1: b6ca161836271e0418a7ca555781197d96d99ee2 Content-length: 83 K 15 cvs2svn:cvs-rev V 5 1.205 PROPS-END SVNw D=:erase_to_scrollback Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 473aedd3657d55c0d6e8f79832c4d862 Text-delta-base-sha1: 28161870c3c683ae241fd19f487f4bae437cc9b6 Text-content-length: 122 Text-content-md5: ce2ff801b8a37d7eb03e5fcd489877e4 Text-content-sha1: d2eaa1159d2411950f415e67197ac94aafbc3a44 Content-length: 163 K 15 cvs2svn:cvs-rev V 5 1.103 PROPS-END SVN^q\F%OEraseToScrollback", cfg->erase_to_scrollbackEraseToScrollback", 1, &cfg->erase_to_scrollback Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c3a405b0190b641ae72405e821dbfb8e Text-delta-base-sha1: 08bf9f4e04bf49ed77caed211173fbbbd64de1c0 Text-content-length: 4015 Text-content-md5: 6e0d39ea8f6086ec1034c95c7b5012ee Text-content-sha1: b69b0236229f0c53334f81c195f543725058aa10 Content-length: 4056 K 15 cvs2svn:cvs-rev V 5 1.143 PROPS-END SVN\&QxF b]5y`y'F$Wmx]go~_\&TGet the number of lines in the scrollback. */ static int sblines(Terminal *term) { int sblines = count234(term->scrollback); if (term->cfg.erase_to_scrollback && term->alt_which && term->alt_screen) { sblines += term->alt_sblines; } return sblinesint altlines = 0; if (term->cfg.erase_to_scrollback && term->alt_which && term->alt_screen) { altlines = term->alt_sblines; } if (y < -altlines) { whichtree = term->scrollback; treeindex = y + altlines + count234(term->scrollback); } else { whichtree = term->alt_screen; treeindex = y + term->alt_sblines; /* treeindex = y + count234(term->alt_screen); */ }term->alt_sblines = 0;alt_sblines = 0 term->alt_sblines = 0 Find the bottom line on the screen that has any content. * If only the top line has content, returns 0. * If no lines have content, return -1. */ static int find_last_nonempty_line(Terminal * term, tree234 * screen) { int i; for (i = count234(screen) - 1; i >= 0; i--) { unsigned long *line = index234(screen, i); int j; int cols = line[0]; for (j = 0; j < cols; j++) { if (line[j + 1] != term->erase_char) break; } if (j != cols) break; } return ierm->alt_sblines = find_last_nonempty_line(term, term->alt_screen) + 1 = sblines(term);sblines(termif (term->cfg.erase_to_scrollback && start.y == 0 && start.x == 0 && end.x == 0 && erase_lattr) { /* If it's a whole number of lines, starting at the top, and * we're fully erasing them, erase by scrolling and keep the * lines in the scrollback. */ int scrolllines = end.y; if (end.y == term->rows) { /* Shrink until we find a non-empty row.*/ scrolllines = find_last_nonempty_line(term, term->screen) + 1; } if (scrolllines > 0) scroll(term, 0, scrolllines - 1, scrolllines, TRUE); fix_cpos; } else { unsigned long *ldata = lineptr(start.y); while (poslt(start, end)) { if (start.x == term->cols) { if (!erase_lattr) ldata[start.x] &= ~(LATTR_WRAPPED | LATTR_WRAPPED2); else ldata[start.x] = LATTR_NORM; } else { ldata[start.x] = term->erase_char; } if (incpos(start) && start.y < term->rows) ldata = lineptr(start.y); }sblines(termpy a#) { char buf[4]; WCHAR wbuf[4]; int rv; if (is_dbcs_leadbyte(term->ucsdata->font_codepage, (BYTE) c)) { buf[0] = c; buf[1] = (char) (0xFF & ldata[top.x + 1]); rv = mb_to_wc(term->ucsdata->font_codepage, 0, buf, 2, wbuf, 4); top.x++; } else { buf[0] = c; rv = mb_to_wc(term->ucsdata->font_codepage, 0, buf, 1, wbuf, 4); } if (rv > 0) { memcpy(cbuf, wbuf, rv * sizeof(wchar_t)); cbuf[rv] = 0; } } } #endif for (p = cbuf; *p; p++) { /* Enough overhead for trailing NL and nul */ if (wblen >= buflen - 16) { workbuf = srealloc(workbuf, sizeof(wchar_t) * (buflen += 100)); wbptr = workbuf + wblen; } wblen++; *wbptr++ = *p; } top.x++; } if (nl) { int i; for (i = 0; i < sel_nl_sz; i++) { wblen++; *wbptr++ = sel_nl[i]; } } top.y++; top.x = rect ? old_top_x : 0; } #if SELECTION_NUL_TERMINATED wblen++; *wbptr++ = 0; #endif write_clip(term->frontend, workbuf, wblen, FALSE); /* transfer to clipbd */ if (buflen > 0) /* indicates we allocated this buffer */ sfree(workbuf); } void term_copyall(Terminal *term) { pos top; top.y = -sblines(term); top.x = 0; clipme(term, top, term->curs, 0); } /* * The wordness array is mainly for deciding the disposition of the * US-ASCII characters. */ static int wordtype(Terminal *term, int uc) { struct ucsword { int start, end, ctype; }; static const struct ucsword ucs_words[] = { { 128, 160, 0}, { 161, 191, 1}, { 215, 215, 1}, { 247, 247, 1}, { 0x037e, 0x037e, 1}, /* Greek question mark */ { 0sblines(term Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f9ea6dd9b731c1f255bc900720f85491 Text-delta-base-sha1: 599c64fd9a807f2e3fb7a6e5ea326e6c9695aff3 Text-content-length: 115 Text-content-md5: 3b558c4dc12d810a91f187359e27b383 Text-content-sha1: fbde9ab98b0001257bb0ec360c9957d924c4f9a2 Content-length: 155 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNb@ ]m]vl int alt_sblines; /* # of lines on alternate screen that should be used for scrollback. */ Node-path: putty/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 452c52b56459280c7bd1ed0fb68567bf Text-delta-base-sha1: 1483820326169a6014e94f34fc61d95ef0422383 Text-content-length: 49 Text-content-md5: 56de4949a8156340a72da683b3abe3cf Text-content-sha1: 0bee721d2c2fb4d7b4c0bc28e7ef16b2cb9d231e Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNU {pewindow_erased "window.erased Revision-number: 2911 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2003-03-06T12:52:36.000000Z K 7 svn:log V 57 Repair the delete-saved-session button (trivial braino). K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2308b8831ffb0a51d4e5654a51881401 Text-delta-base-sha1: e41701ec4db83859ba587b1828cef280997e5488 Text-content-length: 36 Text-content-md5: 5f518a5c51a94db061b6608b74d0ed90 Text-content-sha1: 8392faaa95d61cbb02e900b2405b7763d7d617a9 Content-length: 75 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN ptssd->listbox Revision-number: 2912 Prop-content-length: 152 Content-length: 152 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-06T12:57:37.000000Z K 7 svn:log V 52 Richard B's patch to add WINDOWID support to pterm. PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8de063a657347d75849ef2ae53f1079a Text-delta-base-sha1: f005c2f843bcf1e5359d7c0949ddbb6a9ebea91b Text-content-length: 226 Text-content-md5: 6ee2ab4c15b149a7fdf84597288c2acd Text-content-sha1: 59aebc5cd13d71b2688195fbd118cb37ac1ae757 Content-length: 266 K 15 cvs2svn:cvs-rev V 4 1.96 PROPS-END SVNSFWF6Qlong get_windowid(void *frontend) { Terminal *term = (Terminal *)frontend; struct gui_data *inst = (struct gui_data *)(term->frontend); return (long)GDK_WINDOW_XWINDOW(inst->area->window Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c0a4b82359a76f2eaa65c9ccbd11a694 Text-delta-base-sha1: f3f2e764d613eb7d55f5522705b309b62bfba672 Text-content-length: 202 Text-content-md5: b5ccddf1422fffd58c99c91e07008c97 Text-content-sha1: bc89ad212cf65cd0802c157c2d7cb0afc85226b3 Content-length: 242 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNY'O&\pfs long windowidwindowid = get_windowid(pty_frontend);{ char windowid_env_var[40]; sprintf(windowid_env_var, "WINDOWID=%ld", windowid); putenv(windowid Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: de58a8233bfbf73cb4a392334b4b3d77 Text-delta-base-sha1: 79260c9e6ab09ffb5a9e484ce53a21c971e99bdc Text-content-length: 55 Text-content-md5: 6cd4b90425ef1ed4705669d28dcdf1c8 Text-content-sha1: 7ac8b4c8f3228d4e16e1d0cf8aec1619b0192d1a Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN?b "fZelong get_windowid(void *frontend); Revision-number: 2913 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2003-03-06T12:58:01.000000Z K 7 svn:log V 50 Oops, another missing forward-struct-declaration. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5efbc1306498d54d2701fea069fc0042 Text-delta-base-sha1: b6ca161836271e0418a7ca555781197d96d99ee2 Text-content-length: 43 Text-content-md5: 4c23cf61ed457621f55af5d18abcb4fd Text-content-sha1: 02ef848acceac308aeed269d556fbaaa953c40e1 Content-length: 84 K 15 cvs2svn:cvs-rev V 5 1.206 PROPS-END SVN' ystruct controlbox; Revision-number: 2914 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2003-03-06T13:24:02.000000Z K 7 svn:log V 186 Reorganisation of misc.c: Minefield has moved out to winmisc.c, and so has the Windows dputs() - which has also acquired a Unix counterpart in uxmisc.c. -DDEBUG should now work on Unix. K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 77c7300afa5db5f61535413d78b6a9da Text-delta-base-sha1: 4f17b6a47148f6c26b54d6e68caddb1c9bb97674 Text-content-length: 288 Text-content-md5: 773fbfa81fb7b414b2ac7bba25f2b1e7 Text-content-sha1: 4f21a147625e8a039b3b1b056f55017f17afcee3 Content-length: 328 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN6)kC~+GY')&`O6/Qevoid *minefield_c_malloc(size_t size); void minefield_c_free(void *p); void *minefield_c_realloc(void *p, size_t size); #endifextern void dputs(char *); /* defined in per-platform *misc.c */ void debug_ebug_ebug_ebug_ebug_ Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 40d0f194bd566a7d59fd65981ed814d1 Text-delta-base-sha1: 06845b151f73385564fce45720bbefb26c3d7c13 Text-content-length: 122 Text-content-md5: 5da40415fe6e04278d23e9d2b137ea3d Text-content-sha1: 9c34a0f9d90f5a969ebb6ff70bfcbc53f0156255 Content-length: 162 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNCM dOd)ebug_printf(char *fmt, ...); void debug_memdump(void *buf, int len, int L); #define debug(x) (debug_ Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 68e00f800e0026f0798b70a1b28ff8b2 Text-delta-base-sha1: 3d8085857366f814e43206a363ad3a7f4db75176 Text-content-length: 253 Text-content-md5: 96cbeaef54e14ceddee1a482964d9018 Text-content-sha1: 048c82ce62a9d15f52dc63ec8d67bf365caf2753 Content-length: 292 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN{o fGB9`unistd #ifdef DEBUG static FILE *debug_fp = NULL; void dputs(char *buf) { if (!debug_fp) { debug_fp = fopen("debug.log", "w"); } write(1, buf, strlen(buf)); fputs(buf, debug_fp); fflush(debug_fp); } #endif Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e89e62caafb3321f4cd7c3aa326ab74e Text-delta-base-sha1: 6c40c3ea0215ec87f1a9eb2f8e41d83a9ee1b7d3 Text-content-length: 6056 Text-content-md5: 0513c3a6ecc6b2b2949acbc5b3f3c500 Text-content-sha1: 6dea5f80ecc57e1c6d2a22110566a8ccf022827c Content-length: 6095 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNDYD #ifdef DEBUG static FILE *debug_fp = NULL; static HANDLE debug_hdl = INVALID_HANDLE_VALUE; static int debug_got_console = 0; void dputs(char *buf) { DWORD dw; if (!debug_got_console) { if (AllocConsole()) { debug_got_console = 1; debug_hdl = GetStdHandle(STD_OUTPUT_HANDLE); } } if (!debug_fp) { debug_fp = fopen("debug.log", "w"); } if (debug_hdl != INVALID_HANDLE_VALUE) { WriteFile(debug_hdl, buf, strlen(buf), &dw, NULL); } fputs(buf, debug_fp); fflush(debug_fp); } #endif #ifdef MINEFIELD /* * Minefield - a Windows equivalent for Electric Fence */ #define PAGESIZE 4096 /* * Design: * * We start by reserving as much virtual address space as Windows * will sensibly (or not sensibly) let us have. We flag it all as * invalid memory. * * Any allocation attempt is satisfied by committing one or more * pages, with an uncommitted page on either side. The returned * memory region is jammed up against the _end_ of the pages. * * Freeing anything causes instantaneous decommitment of the pages * involved, so stale pointers are caught as soon as possible. */ static int minefield_initialised = 0; static void *minefield_region = NULL; static long minefield_size = 0; static long minefield_npages = 0; static long minefield_curpos = 0; static unsigned short *minefield_admin = NULL; static void *minefield_pages = NULL; static void minefield_admin_hide(int hide) { int access = hide ? PAGE_NOACCESS : PAGE_READWRITE; VirtualProtect(minefield_admin, minefield_npages * 2, access, NULL); } static void minefield_init(void) { int size; int admin_size; int i; for (size = 0x40000000; size > 0; size = ((size >> 3) * 7) & ~0xFFF) { minefield_region = VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS); if (minefield_region) break; } minefield_size = size; /* * Firstly, allocate a section of that to be the admin block. * We'll need a two-byte field for each page. */ minefield_admin = minefield_region; minefield_npages = minefield_size / PAGESIZE; admin_size = (minefield_npages * 2 + PAGESIZE - 1) & ~(PAGESIZE - 1); minefield_npages = (minefield_size - admin_size) / PAGESIZE; minefield_pages = (char *) minefield_region + admin_size; /* * Commit the admin region. */ VirtualAlloc(minefield_admin, minefield_npages * 2, MEM_COMMIT, PAGE_READWRITE); /* * Mark all pages as unused (0xFFFF). */ for (i = 0; i < minefield_npages; i++) minefield_admin[i] = 0xFFFF; /* * Hide the admin region. */ minefield_admin_hide(1); minefield_initialised = 1; } static void minefield_bomb(void) { div(1, *(int *) minefield_pages); } static void *minefield_alloc(int size) { int npages; int pos, lim, region_end, region_start; int start; int i; npages = (size + PAGESIZE - 1) / PAGESIZE; minefield_admin_hide(0); /* * Search from current position until we find a contiguous * bunch of npages+2 unused pages. */ pos = minefield_curpos; lim = minefield_npages; while (1) { /* Skip over used pages. */ while (pos < lim && minefield_admin[pos] != 0xFFFF) pos++; /* Count unused pages. */ start = pos; while (pos < lim && pos - start < npages + 2 && minefield_admin[pos] == 0xFFFF) pos++; if (pos - start == npages + 2) break; /* If we've reached the limit, reset the limit or stop. */ if (pos >= lim) { if (lim == minefield_npages) { /* go round and start again at zero */ lim = minefield_curpos; pos = 0; } else { minefield_admin_hide(1); return NULL; } } } minefield_curpos = pos - 1; /* * We have npages+2 unused pages starting at start. We leave * the first and last of these alone and use the rest. */ region_end = (start + npages + 1) * PAGESIZE; region_start = region_end - size; /* FIXME: could align here if we wanted */ /* * Update the admin region. */ for (i = start + 2; i < start + npages + 1; i++) minefield_admin[i] = 0xFFFE; /* used but no region starts here */ minefield_admin[start + 1] = region_start % PAGESIZE; minefield_admin_hide(1); VirtualAlloc((char *) minefield_pages + region_start, size, MEM_COMMIT, PAGE_READWRITE); return (char *) minefield_pages + region_start; } static void minefield_free(void *ptr) { int region_start, i, j; minefield_admin_hide(0); region_start = (char *) ptr - (char *) minefield_pages; i = region_start / PAGESIZE; if (i < 0 || i >= minefield_npages || minefield_admin[i] != region_start % PAGESIZE) minefield_bomb(); for (j = i; j < minefield_npages && minefield_admin[j] != 0xFFFF; j++) { minefield_admin[j] = 0xFFFF; } VirtualFree(ptr, j * PAGESIZE - region_start, MEM_DECOMMIT); minefield_admin_hide(1); } static int minefield_get_size(void *ptr) { int region_start, i, j; minefield_admin_hide(0); region_start = (char *) ptr - (char *) minefield_pages; i = region_start / PAGESIZE; if (i < 0 || i >= minefield_npages || minefield_admin[i] != region_start % PAGESIZE) minefield_bomb(); for (j = i; j < minefield_npages && minefield_admin[j] != 0xFFFF; j++); minefield_admin_hide(1); return j * PAGESIZE - region_start; } void *minefield_c_malloc(size_t size) { if (!minefield_initialised) minefield_init(); return minefield_alloc(size); } void minefield_c_free(void *p) { if (!minefield_initialised) minefield_init(); minefield_free(p); } /* * realloc _always_ moves the chunk, for rapid detection of code * that assumes it won't. */ void *minefield_c_realloc(void *p, size_t size) { size_t oldsize; void *q; if (!minefield_initialised) minefield_init(); q = minefield_alloc(size); oldsize = minefield_get_size(p); memcpy(q, p, (oldsize < size ? oldsize : size)); minefield_free(p); return q; } #endif /* MINEFIELD */ Revision-number: 2915 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2003-03-06T13:25:48.000000Z K 7 svn:log V 55 Jacob points out that TS_EOL is broken in BINARY mode. K 10 svn:author V 5 simon PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b2c1216676239c2431c2097f6cc53bc1 Text-delta-base-sha1: 480ce185c66979c039cdfc454ce5aafd8e2ef0c8 Text-content-length: 69 Text-content-md5: 5c1b83c36b2686195cbd22f82ff59785 Text-content-sha1: b12b21d103603862dc17deeaa1ea9fa71c3396cf Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVN/T&xixMb - * and without the NUL suffix too1 Revision-number: 2916 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2003-03-06T18:49:05.000000Z K 7 svn:log V 57 Fix a couple of stupid typos in the session-saving code. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5f518a5c51a94db061b6608b74d0ed90 Text-delta-base-sha1: 8392faaa95d61cbb02e900b2405b7763d7d617a9 Text-content-length: 43 Text-content-md5: cc3d28070205c86e752db52156fee733 Text-content-sha1: a30000e3440406dc9d73f598f7af895e96e4eba0 Content-length: 82 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN r v ssd->listbox! Revision-number: 2917 Prop-content-length: 353 Content-length: 353 K 7 svn:log V 252 Got a bit of a better handle on the whole GDI `logical units' mess, and sorted out the static-control text wrapping rather better. Now it works under both large fonts and small fonts on Win2K, so I have high hopes that it's actually correct this time. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-06T19:18:25.000000Z PROPS-END Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a4930413e093975e42c3af291eaa1186 Text-delta-base-sha1: 36aab132490362a3bcc2b915ccfa6c66c44b23d0 Text-content-length: 505 Text-content-md5: f381232904adea3b6660efe366179d77 Text-content-sha1: 92a2e801d122cd8f921cdd12481809752f655298 Content-length: 545 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNnT(CUSHi,q>B*Ci HFONT oldfont, newfont/ SetMapMode(hdc, MM_TEXT); /* ensure logical units == pixelsr.right; nlines = 1; /* * We must select the correct font into the HDC before calling * GetTextExtent*, or silly things will happen. */ newfont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); oldfont = SelectObject(hdc, newfont)SelectObject(hdc, oldfont);SetMapMode(hdc, MM_TEXT); /* ensure logical units == pixels */ Revision-number: 2918 Prop-content-length: 235 Content-length: 235 K 8 svn:date V 27 2003-03-06T19:20:33.000000Z K 7 svn:log V 134 Just for Jacob, the ciphers drag list is now six lines high instead of five, so that the scroll bar doesn't show up when it's active. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cc3d28070205c86e752db52156fee733 Text-delta-base-sha1: a30000e3440406dc9d73f598f7af895e96e4eba0 Text-content-length: 179 Text-content-md5: 48fb6d4a0c0cd41dbaf04a90dc51f058 Text-content-sha1: 656038355880ccc97d189191d51436b4d1204b73 Content-length: 218 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN/,l+ = ctrl_draglist(s, "Encryption cipher selection policy:", 's', HELPCTX(ssh_ciphers), cipherlist_handler, P(NULL)); c->listbox.height = 6; Revision-number: 2919 Prop-content-length: 293 Content-length: 293 K 8 svn:date V 27 2003-03-06T23:44:47.000000Z K 7 svn:log V 194 Slightly better than null verify_ssh_host_key(). It's broken in more ways than I can comfortably enumerate (see the comments in the code), but it's better than always assuming everything's OK. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ce5b1cb0490aa7926aee4c1939459303 Text-delta-base-sha1: d1c8264126d537fbaaa58c32ab5daae8126d47a1 Text-content-length: 1548 Text-content-md5: 3123edd934ca275715edd3d594115174 Text-content-sha1: 0e6cac5a7ab69efb8d5df3c79e5654d106d78962 Content-length: 1588 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN Rb( "v,g"/* $Id: mac.c,v 1.54 2003/03/06 23:44:47terminal/* * FIXME: verify_ssh_host_key() should be passed a frontend handle, * but backends have to have a terminal handle instead, because they * pass it to from_backend(), so we accept a terminal handle here as * well, and hope no-one tries to call us with sensible arguments. */ Str255 stuff; Terminal *term = frontend; Session *s = term->frontend; /* * This function is horribly wrong. For one thing, the alert * shouldn't be modal, it should be movable modal, or a sheet in * Aqua. Also, PuTTY might be in the background, in which case we * should use the Notification Manager to wake up the user. In * any case, we shouldn't hold up processing of other connections' * data just because this one's waiting for the user. It should * also handle a host key cache, of course, and see the note above * about the "frontend" argument and the one below about closing * the connection. All in all, a bit of a mess really. */ stuff[0] = sprintf((char *)(&stuff[1]), "The server's key fingerprint is: %s\n" "Continue connecting?", fingerprint); ParamText(stuff, NULL, NULL, NULL); if (CautionAlert(wQuestion, NULL) == 2) { /* * User chose "Cancel". Unfortunately, if I tear the * connection down here, Bad Things happen when I return. I * think this function should actually return something * telling the SSH code to abandon the connection. */ } Revision-number: 2920 Prop-content-length: 138 Content-length: 138 K 7 svn:log V 40 Alert box to support host-key checking. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-06T23:46:06.000000Z PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5ecf828aeae6d253eea333243c36b667 Text-delta-base-sha1: ddf6870bdf93c4538a0a3b92d71c826b8df750e7 Text-content-length: 310 Text-content-md5: 5efda2d049ef69afc4b57c05e3b2c44b Text-content-sha1: 6b24718555d4fb0e7cf4fcf39520b248c5199724 Content-length: 350 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN@),G*"Vj/* $Id: mac_res.r,v 1.30 2003/03/06 23:46:06Caution box. Stolen from the Finder. */ resource 'ALRT' (wQuestion, "questionbox", purgeable) { {54, 67, 152, 435}, wQuestion, beepStages, alertPositionMainScreen }; resource 'DITL' (wQuestionButton { enabled, "Cancel Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8ccdb1534c7f62aadeba0a957fbdc9cb Text-delta-base-sha1: b2cf584f1fa78b9b22740b0c628ffb9e4e3603d0 Text-content-length: 86 Text-content-md5: bca2f1f1f0f765f7ce14e0d3cff83f35 Text-content-sha1: 7f102595be77f944e261826c33207ce21a26ee8b Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN`w B,&:/* $Id: macresid.h,v 1.10 2003/03/06 23:46:06#define wQuestion 134 Revision-number: 2921 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2003-03-07T09:03:11.000000Z K 7 svn:log V 69 Overnight docs build found a duplicate section keyword. Oops. Fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3b456217136f8d65f8f8d111100d7c6 Text-delta-base-sha1: dd9c72f9bdd2543424eda2ec7058bd97cff5404a Text-content-length: 87 Text-content-md5: 031bc891cee7656eda5f3cde860fde5e Text-content-sha1: 2549bbd8d64408a4c4554bf5f73e357e715b4c36 Content-length: 127 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN<5:T\versionid $Id: config.but,v 1.59 2003/03/07 09:03:11eraseto Revision-number: 2922 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2003-03-07T10:50:16.000000Z K 7 svn:log V 20 Did this yesterday. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/screen-clear Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4033589dd5a8d1cdb9e034f6aeaceae0 Text-delta-base-sha1: 3db3b4ac5248bb4424df00e171de499779a71826 Text-content-length: 479 Text-content-md5: d520740d3716be7db341000b60b21ac0 Text-content-sha1: aedb079e195d70f5a57ece15f59751585a817139 Content-length: 518 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN] F2Fixed-in: 2003-03-07

    SGT, 2003-03-07: Thanks to Richard Boulton for a patch doing just this. In addition, his patch also arranges that when an application switches to the alternate screen, the previous contents of the primary screen are temporarily pushed into the scrollback, so you can check what you were doing just before starting the application. When the primary screen is restored, those lines come back out of the scrollback. Revision-number: 2923 Prop-content-length: 677 Content-length: 677 K 8 svn:date V 27 2003-03-07T18:18:38.000000Z K 7 svn:log V 576 Richard B's patch for resize behaviour. The scrollback now contains a marker which defines everything before it as `permanent' scrollback and everything after it as `temporary'; only temporary scrollback lines are returned to the main screen when the window height is increased. Screen clears mark the lines pushed into the scrollback as permanent; so lines explicitly cleared off the screen by ESC[2J are never returned to it by mistake. This patch also fixes the incorrect state the primary screen is left in when the window is resized while the alternate screen is active. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6e0d39ea8f6086ec1034c95c7b5012ee Text-delta-base-sha1: b69b0236229f0c53334f81c195f543725058aa10 Text-content-length: 4448 Text-content-md5: 0bca43cd40e6062bf3dfa6be20b6d158 Text-content-sha1: 9acd0a30b30d5140a58fe60a183bee6346bfa50b Content-length: 4489 K 15 cvs2svn:cvs-rev V 5 1.144 PROPS-END SVNlhn}ccT.snO1rLn>s`w'R0T2uiw&P!utempsblines = 0;tempsblines = 0tempsblines = 0is longer, we shunt lines in from temporary * scrollback if possible, otherwise we add new blank lines at * the bottom. * * - If the new screen is shorter, we remove any blank lines at * the bottom if possible, otherwise shunt lines above the cursor * to scrollback if possible, otherwise delete lines below the * cursorassert(term->rows == count234(term->screen)); while (term->rows < newrows) { if (term->tempsblines > 0) { /* Insert a line from the scrollback at the top of the screen. */ assert(sblen >= term->tempsblines); line = delpos234(term->scrollback, --sblen); term->tempsblines -= 1; addpos234(term->screen, line, 0); term->curs.y += 1; term->savecurs.y += 1; } else { /* Add a new blank line at the bottom of the screen. */ addpos234(term->screen, line, count234(term->screen)); } term->rows += 1; } /* Do this loop to shrink the screen if newrows < rows */ while (term->rows > newrows) { if (term->curs.y < term->rows - 1) { /* delete bottom row, unless it contains the cursor */ sfree(delpos234(term->screen, term->rows - 1)); } else { /* push top row to scrollback */ line = delpos234(term->screen, 0); addpos234(term->scrollback, line, sblen++); term->tempsblines += 1; term->curs.y -= 1; term->savecurs.y -= 1; } term->rows -= 1; } assert(term->rows == newrows); assert(count234(term->screen) == newrows); /* Delete any excess lines from the scrollback. */if (sblen < term->tempsblines) term->tempsblines = sblen; assert(count234(term->scrollback) <= newsavelines); assert(count234(term->scrollback) >= term->tempsblines); term->disptop = 0; /* Make a new displayed text buffer. *//* Make a new alternate screen. *//* Check that the cursor positions are still valid. */ if (term->savecurs.y < 0) term->savecurs.y = 0; if (term->savecurs.y >= newrows) term->savecurs.y = newrows - 1count234(term->scrollback term->tempsblines += 1 int erasing_lines_from_top = 0/* Lines scrolled away shouldn't be brought back on if the terminal * resizes. */ if (start.y == 0 && start.x == 0 && end.x == 0 && erase_lattr) erasing_lines_from_top = 1; if (term->cfg.erase_to_scrollback && erasing_lines_from_top /* After an erase of lines from the top of the screen, we shouldn't * bring the lines back again if the terminal enlarges (since the user or * application has explictly thrown them away). */ if (erasing_lines_from_top && !(term->alt_which)) term->tempsblines = 0;pZjjp- 1] & 0xFF) == 0x20 || (DIRECT_CHAR(ldata[nlpos.x - 1]) && (ldata[nlpos.x - 1] & CHAR_MASK) == 0x20)) && poslt(top, nlpos)) decpos(nlpos); if (poslt(nlpos, bottom)) nl = TRUE; } else if (ldata[term->cols] & LATTR_WRAPPED2) { /* Ignore the last char on the line in a WRAPPED2 line. */ decpos(nlpos); } /* * ... and then clip it to the terminal x coordinate if * we're doing rectangular selection. (In this case we * still did the above, so that copying e.g. the right-hand * column from a table doesn't fill with spaces on the * right.) */ if (rect) { if (nlpos.x > bottom.x) nlpos.x = bottom.x; nl = (top.y < bottom.y); } while (poslt(top, bottom) && poslt(top, nlpos)) { #if 0 char cbuf[16], *p; sprintf(cbuf, "", (ldata[top.x] & 0xFFFF)); #else wchar_t cbuf[16], *p; int uc = (ldata[top.x] & 0xFFFF); int set, c; if (uc == UCSWIDE) { top.x++; continue; } switch (uc & CSET_MASK) { case ATTR_LINEDRW: if (!term->cfg.rawcnp) { uc = term->ucsdata->unitab_xterm[uc & 0xFF]; break; } case ATTR_ASCII: uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case ATTR_SCOACS: uc = term->ucsdata->unitab_scoacs[uc&0xFF]; break; } switch (uc & CSET_MASK) { case ATTR_ACP: uc = term->ucsdata->unitab_font[uc & 0xFF]; break; case ATTR_OEMCP: uc = term->ucsdata->unitab_oemcp[uc & 0xFF]; break; } set = (uc & CSET_MASK); c = (uc & CHAR_MASK); cbuf[0] = uc; cbuf[1] = 0; if (DIRECT_FONT(uc)) { if (c >= ' ' && c != 0x7F Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b558c4dc12d810a91f187359e27b383 Text-delta-base-sha1: fbde9ab98b0001257bb0ec360c9957d924c4f9a2 Text-content-length: 100 Text-content-md5: 94b65d9cfddeef20f5afaa48711578fb Text-content-sha1: e0479b9840b492e9b9286962f44406d535efdf23 Content-length: 140 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN@ NAN= int tempsblines; /* number of lines in temporary scrollback Revision-number: 2924 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Richard B's latest patch should fix both of these. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-07T18:21:41.000000Z PROPS-END Node-path: putty-wishlist/data/resize-altscr Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a3156b1c22e21827cbe2835b4c577609 Text-delta-base-sha1: d6739e63949740a0bb338936f4f026a448e537c4 Text-content-length: 131 Text-content-md5: d83dc82faae27a64a086d34b84cf24f0 Text-content-sha1: c4add3bfb64b9db2d3efa9c0cb299ed463241a04 Content-length: 170 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNjX mkYFixed-in: 2003-03-08

    SGT, 2003-03-07: Just accepted a patch from Richard Boulton which fixes this. Node-path: putty-wishlist/data/resize-scroll-effects Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a543c7ff82b9db04612669ed90125105 Text-delta-base-sha1: 88ad0268b5c6a1dee76c071e957924d916ed99c1 Text-content-length: 137 Text-content-md5: f18dcffc5e562debc28c61f76a372fff Text-content-sha1: f7910abc6c10e1dae09cd7eecb0f2e08d77df238 Content-length: 176 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNI< r8^Fixed-in: 2003-03-08

    SGT, 2003-03-07: Just accepted a patch from Richard Boulton which should fix this. Revision-number: 2925 Prop-content-length: 508 Content-length: 508 K 8 svn:date V 27 2003-03-08T11:46:42.000000Z K 7 svn:log V 407 Add the ability to allocate extra per-dialog-instance private data in the portable dialog interface. This has allowed me to remove `ssd->savedsession' in config.c, which was (I believe) the only out-of-place piece of per-instance data in the dialog template stuff. Now we should actually be able to run more than one config box in the same process at the same time (for platforms that'll find that useful). K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 48fb6d4a0c0cd41dbaf04a90dc51f058 Text-delta-base-sha1: 656038355880ccc97d189191d51436b4d1204b73 Text-content-length: 1191 Text-content-md5: e88b9346984b12eae299355531b25dc2 Text-content-sha1: 79f082467571db89081fa7c5ec626e21d17c167a Content-length: 1230 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN/cOJfd1vC[t9f4?N[C9"}YV#define SAVEDSESSION_LEN 2048char *savedsessionavedsession, ssd->sesslist->sessions[i], SAVEDSESSION_LEN); savedsession[SAVEDSESSION_LEN-1] = '\0'; } else { char *savedsession; /* * The first time we're called in a new dialog, we must * allocate space to store the current contents of the saved * session edit box (since it must persist even when we switch * panels, but is not part of the Config). */ if (!dlg_get_privdata(ssd->editbox, dlg)) { savedsession = (char *) dlg_alloc_privdata(ssd->editbox, dlg, SAVEDSESSION_LEN); savedsession[0] = '\0'; } else { savedsession = dlg_get_privdata(ssd->editbox, dlg); } if (event == EVENT_REFRESH) { if (ctrl == ssd->editbox) { dlg_editbox_set(ctrl, dlg, savedsession); } else if (ctrl == ssavedsession, SAVEDSESSION_LENsavedsessionavedsession, "Default Settings"); if (!avedsession, ssd->sesslist->sessions[i], SAVEDSESSION_LEN); savedsession[SAVEDSESSION_LEN-1] = '\0'; } else { savedsession[0] = '\0'; } } save_settings(savedsession Node-path: putty/dialog.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4ff6420be09171473cf349e62fa5754c Text-delta-base-sha1: 4e5ee9dd55a2684c0d922a1942996a19bd8e7f4e Text-content-length: 678 Text-content-md5: 950aa67020e1b40cfef6987fd53fe0f2 Text-content-sha1: b8e6597512de6cfc78e110a4f7f6c3a7b08b789c Content-length: 717 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNr _ UIt's perfectly possible that individual controls might need to * allocate or store per-dialog-instance data, so here's a * mechanism. * * `dlg_get_privdata' and `dlg_set_privdata' allow the user to get * and set a void * pointer associated with the control in * question. `dlg_alloc_privdata' will allocate memory, store a * pointer to that memory in the private data field, and arrange * for it to be automatically deallocated on dialog cleanup. */ void *dlg_get_privdata(union control *ctrl, void *dlg); void dlg_set_privdata(union control *ctrl, void *dlg, void *ptr); void *dlg_alloc_privdata(union control *ctrl, void *dlg, size_t size Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f381232904adea3b6660efe366179d77 Text-delta-base-sha1: 92a2e801d122cd8f921cdd12481809752f655298 Text-content-length: 1968 Text-content-md5: 4a83a610b393459868267abed6541d2d Text-content-sha1: 873051d3750f77e1a2263ec0d0c64a98418708a2 Content-length: 2008 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNT(zT ^t`>OA:AI struct perctrl_privdata { union control *ctrl; void *data; int needs_free; }; static int perctrl_privdata_cmp(void *av, void *bv) { struct perctrl_privdata *a = (struct perctrl_privdata *)av; struct perctrl_privdata *b = (struct perctrl_privdatareturn 0; } void dp_init(struct dlgparam *dp) { dp->nctrltrees = 0; dp->data = NULL; dp->ended = FALSE; dp->focused = dp->lastfocused = NULL; memset(dp->shortcuts, 0, sizeof(dp->shortcuts)); dp->hwnd = NULL; dp->errtitle = NULL; dp->privdata = newtree234(perctrl_privdata_cmp); } void dp_add_tree(struct dlgparam *dp, struct winctrls *wc) { assert(dp->nctrltrees < lenof(dp->controltrees)); dp->controltrees[dp->nctrltrees++] = wc; } void dp_cleanup(struct dlgparam *dp) { struct perctrl_privdata *p; if (dp->privdata) { while ( (p = index234(dp->privdata, 0)) != NULL ) { del234(dp->privdata, p); if (p->needs_free) sfree(p->data); sfree(p); } freetree234(dp->privdata); dp->privdata = NULL; } } void *dlg_get_privdataperctrl_privdata tmp, *p; tmp.ctrl = ctrl; p = find234(dp->privdata, &tmp, NULL); if (p) return p->data; else return NULL; } void dlg_set_privdata(union control *ctrl, void *dlg, void *ptrperctrl_privdata tmp, *p; tmp.ctrl = ctrl; p = find234(dp->privdata, &tmp, NULL); if (!p) { p = smalloc(sizeof(struct perctrl_privdata)); p->ctrl = ctrl; p->needs_free = FALSE; add234(dp->privdata, p); } p->data = ptr; } void *dlg_alloc_privdata(union control *ctrl, void *dlg, size_t sizeperctrl_privdata tmp, *p; tmp.ctrl = ctrl; p = find234(dp->privdata, &tmp, NULL); if (!p) { p = smalloc(sizeof(struct perctrl_privdata)); p->ctrl = ctrl; p->needs_free = FALSE; add234(dp->privdata, p); } assert(!p->needs_free); p->needs_free = TRUE; p->data = smalloc(size); return p->data; } Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 60bbdbd6ea57b0775a958c2df2198c23 Text-delta-base-sha1: 36f20d7333cc6f6dc473705bd18cb088a812ac94 Text-content-length: 522 Text-content-md5: 36c277ec32d6273a43d4c3bad940c887 Text-content-sha1: 82eac9355d64855b0375ad4139c9a1e17cbd39c2 Content-length: 563 K 15 cvs2svn:cvs-rev V 5 1.209 PROPS-END SVNd \MG 0JG0h0dp_init(&dp); winctrl_init(&ctrls_base); winctrl_init(&ctrls_panel); dp_add_tree(&dp, &ctrls_base); dp_add_tree(&dp, &ctrls_panel); dp.errtitle = "PuTTY Error"; dp.data = &cfgpanel); winctrl_cleanup(&ctrls_base); dp_cleanup(&dpdp_init(&dp); winctrl_init(&ctrls_base); winctrl_init(&ctrls_panel); dp_add_tree(&dp, &ctrls_base); dp_add_tree(&dp, &ctrls_panel); dp.errtitle = "PuTTY Error"; dp.data = &cfg dp_cleanup(&dp Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef656c0e6af4dfc8b6ad32bead6518ad Text-delta-base-sha1: 84ddf29fb5b3a504a62f9b2ab59ab7cc06915355 Text-content-length: 362 Text-content-md5: 9d865d4e44c28a2d34c94448737ffbb1 Text-content-sha1: 7c71a0448d6dc4d360fcde5e46fd80377a3dbdb8 Content-length: 402 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNBEziq _]echar shortcuts[128]; /* track which shortcuts in usstruct { unsigned char r, g, b, ok; } coloursel_result; /* 0-255 */ tree234 *privdata; /* stores per-control private datavoid dp_init(struct dlgparam *dp); void dp_add_tree(struct dlgparam *dp, struct winctrls *tree); void dp_cleanup(struct dlgparam *dp Revision-number: 2926 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:59.518108Z PROPS-END Revision-number: 2927 Prop-content-length: 462 Content-length: 462 K 8 svn:date V 27 2003-03-11T09:30:31.000000Z K 7 svn:log V 361 Never pass a `char' to a ctype function. I had relied on gcc -Wall letting me know about instances of this, but it turns out that my ctype.h explicitly casts input values to `int' to evade the `subscript has type char' warning, so it had been carefully not letting me know! Found them all by compiling with a doctored ctype.h, and hopefully fixed them all too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 731d889605db38bfdd766a05a6ff8740 Text-delta-base-sha1: f41517a6ec2d53a844dc9ace3758e6e4cb1504e7 Text-content-length: 96 Text-content-md5: 50c4a7c5dab89c6e7ba25e58473529f8 Text-content-sha1: cf8c1ed5eca4f0f58236b26297eb35554f3146b4 Content-length: 136 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN3 JJe2(unsigned char)ldisc->buf[ldisc->buflen-1]) && !isspace((unsigned char) Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 257d8213dbf7a87cf68e3e36323ee47c Text-delta-base-sha1: 8300335dbc58cfa464225f16b0a5374c1b8b605d Text-content-length: 81 Text-content-md5: 792459c7a955901e922f8abc78f5e64c Text-content-sha1: e718c58adf5af348c838b4efb1c6309c96a09cab Content-length: 121 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNX-^ ^%gL (unsigned char)(unsigned char)(unsigned char) Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ab021cd5fe1f434a068021f06a5ce59 Text-delta-base-sha1: b4ffb3eba1f3c99336d07dfa6cf73c2aa8c2b910 Text-content-length: 36 Text-content-md5: 8849e9e03ff5df5dce6733057e6157eb Text-content-sha1: 25585aa2c0042f76580d6cd0de49b3426e0e6a09 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNJY #'#(unsigned char) Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6fd301000dfa4f0f1cf40a53b2ebf033 Text-delta-base-sha1: 953b04b3d88363d15413bf0e99b0117aceafa016 Text-content-length: 36 Text-content-md5: f49adebc4ebd0153a3a119314a0994a2 Text-content-sha1: 8b3d6eccf5b5c17719c44f6899df63778233eb4b Content-length: 75 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN?N eZe(unsigned char) Revision-number: 2928 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2003-03-11T22:35:07.000000Z K 7 svn:log V 74 Increase PuTTY's default partition size to 2 MB. 1 MB just isn't enough. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5efda2d049ef69afc4b57c05e3b2c44b Text-delta-base-sha1: 6b24718555d4fb0e7cf4fcf39520b248c5199724 Text-content-length: 73 Text-content-md5: d4bc0043ab648b4e7b3d6d54cf5aba4b Text-content-sha1: 8dd372430ea3dbe5284d7482012d0125ab3caa17 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN)) 0H,1x/* $Id: mac_res.r,v 1.31 2003/03/11 22:35:072048 Revision-number: 2929 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2003-03-12T13:51:24.000000Z K 7 svn:log V 20 Add a missing

  • . K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef8412c20305d9c085f6e1e695db0e25 Text-delta-base-sha1: c0d9cca2d55e5ae14a365894473a713049fffb42 Text-content-length: 24 Text-content-md5: f7945f1f7d41405b8d9786ba66f36bb1 Text-content-sha1: 65a53b55d9dc9193c35d3dff5bcb5c168288221a Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN  li> Revision-number: 2930 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2003-03-12T17:14:09.000000Z K 7 svn:log V 73 The problem appears to be with the case-sensitivity of the proxy server. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/msproxy-denied Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8147bcd7d40134115d6ca07f0bbb1310 Text-delta-base-sha1: a6533c3f499c9246277c054a79f846c80dfeb643 Text-content-length: 436 Text-content-md5: f78f501b119e71361143e2064571283a Text-content-sha1: b049646f579994db617cd90a2fa2afdddb97b2dd Content-length: 475 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNr!q!

    Another user has experimented with this, and concluded that the problem is that the proxy insists that the authentication scheme be "Basic" rather than "basic". RFC 2617 states that the scheme token is case-insensitive, but in the interests of being conservative in what we send, PuTTY should probably use "Basic". Revision-number: 2931 Prop-content-length: 843 Content-length: 843 K 8 svn:date V 27 2003-03-13T19:52:28.000000Z K 7 svn:log V 742 First stab at a GTK layout engine. It's missing all sorts of stuff (list boxes are particularly conspicuously absent), it has no event handling at all, and it isn't in any way integrated into pterm - you have to build it specially using the test stubs in gtkdlg.c. But what there is so far seems to work plausibly well, so it's a start. Rather than browbeat the existing GTK container/layout widgets into doing what I wanted, I decided to implement two subclasses of GtkContainer myself, which implement precisely the layout model assumed by the config box specification; this has the rather cool consequence that the box can be resized and will maintain the same layout at all times that it would have had if initially created at that size. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e88b9346984b12eae299355531b25dc2 Text-delta-base-sha1: 79f082467571db89081fa7c5ec626e21d17c167a Text-content-length: 41 Text-content-md5: 249d63002bdd1c41d29ca944bd4c0fc8 Text-content-sha1: 528f5e794c83846716829c5ac1d6b8bf26636970 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNc]<.Ckxnamename Node-path: putty/unix/gtkcols.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 20266 Text-content-md5: 34af29a1de0ce0080d798baae4a02eba Text-content-sha1: c3931495bd1714babdac1bbdc4c62c62b3b1dd43 Content-length: 20382 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * gtkcols.c - implementation of the `Columns' GTK layout container. */ #include "gtkcols.h" static void columns_init(Columns *cols); static void columns_class_init(ColumnsClass *klass); static void columns_map(GtkWidget *widget); static void columns_unmap(GtkWidget *widget); static void columns_draw(GtkWidget *widget, GdkRectangle *area); static gint columns_expose(GtkWidget *widget, GdkEventExpose *event); static void columns_base_add(GtkContainer *container, GtkWidget *widget); static void columns_remove(GtkContainer *container, GtkWidget *widget); static void columns_forall(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); static gint columns_focus(GtkContainer *container, GtkDirectionType dir); static GtkType columns_child_type(GtkContainer *container); static void columns_size_request(GtkWidget *widget, GtkRequisition *req); static void columns_size_allocate(GtkWidget *widget, GtkAllocation *alloc); static GtkContainerClass *parent_class = NULL; GtkType columns_get_type(void) { static GtkType columns_type = 0; if (!columns_type) { static const GtkTypeInfo columns_info = { "Columns", sizeof(Columns), sizeof(ColumnsClass), (GtkClassInitFunc) columns_class_init, (GtkObjectInitFunc) columns_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, (GtkClassInitFunc) NULL, }; columns_type = gtk_type_unique(GTK_TYPE_CONTAINER, &columns_info); } return columns_type; } static gint (*columns_inherited_focus)(GtkContainer *container, GtkDirectionType direction); static void columns_class_init(ColumnsClass *klass) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; GtkContainerClass *container_class; object_class = (GtkObjectClass *)klass; widget_class = (GtkWidgetClass *)klass; container_class = (GtkContainerClass *)klass; parent_class = gtk_type_class(GTK_TYPE_CONTAINER); /* * FIXME: do we have to do all this faffing with set_arg, * get_arg and child_arg_type? Ick. */ widget_class->map = columns_map; widget_class->unmap = columns_unmap; widget_class->draw = columns_draw; widget_class->expose_event = columns_expose; widget_class->size_request = columns_size_request; widget_class->size_allocate = columns_size_allocate; container_class->add = columns_base_add; container_class->remove = columns_remove; container_class->forall = columns_forall; container_class->child_type = columns_child_type; /* Save the previous value of this method. */ if (!columns_inherited_focus) columns_inherited_focus = container_class->focus; container_class->focus = columns_focus; } static void columns_init(Columns *cols) { GTK_WIDGET_SET_FLAGS(cols, GTK_NO_WINDOW); cols->children = NULL; cols->spacing = 0; } /* * These appear to be thoroughly tedious functions; the only reason * we have to reimplement them at all is because we defined our own * format for our GList of children... */ static void columns_map(GtkWidget *widget) { Columns *cols; ColumnsChild *child; GList *children; g_return_if_fail(widget != NULL); g_return_if_fail(IS_COLUMNS(widget)); cols = COLUMNS(widget); GTK_WIDGET_SET_FLAGS(cols, GTK_MAPPED); for (children = cols->children; children && (child = children->data); children = children->next) { if (child->widget && GTK_WIDGET_VISIBLE(child->widget) && !GTK_WIDGET_MAPPED(child->widget)) gtk_widget_map(child->widget); } } static void columns_unmap(GtkWidget *widget) { Columns *cols; ColumnsChild *child; GList *children; g_return_if_fail(widget != NULL); g_return_if_fail(IS_COLUMNS(widget)); cols = COLUMNS(widget); GTK_WIDGET_UNSET_FLAGS(cols, GTK_MAPPED); for (children = cols->children; children && (child = children->data); children = children->next) { if (child->widget && GTK_WIDGET_VISIBLE(child->widget) && GTK_WIDGET_MAPPED(child->widget)) gtk_widget_unmap(child->widget); } } static void columns_draw(GtkWidget *widget, GdkRectangle *area) { Columns *cols; ColumnsChild *child; GList *children; GdkRectangle child_area; g_return_if_fail(widget != NULL); g_return_if_fail(IS_COLUMNS(widget)); if (GTK_WIDGET_DRAWABLE(widget)) { cols = COLUMNS(widget); for (children = cols->children; children && (child = children->data); children = children->next) { if (child->widget && GTK_WIDGET_DRAWABLE(child->widget) && gtk_widget_intersect(child->widget, area, &child_area)) gtk_widget_draw(child->widget, &child_area); } } } static gint columns_expose(GtkWidget *widget, GdkEventExpose *event) { Columns *cols; ColumnsChild *child; GList *children; GdkEventExpose child_event; g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(IS_COLUMNS(widget), FALSE); g_return_val_if_fail(event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE(widget)) { cols = COLUMNS(widget); child_event = *event; for (children = cols->children; children && (child = children->data); children = children->next) { if (child->widget && GTK_WIDGET_DRAWABLE(child->widget) && GTK_WIDGET_NO_WINDOW(child->widget) && gtk_widget_intersect(child->widget, &event->area, &child_event.area)) gtk_widget_event(child->widget, (GdkEvent *)&child_event); } } return FALSE; } static void columns_base_add(GtkContainer *container, GtkWidget *widget) { Columns *cols; g_return_if_fail(container != NULL); g_return_if_fail(IS_COLUMNS(container)); g_return_if_fail(widget != NULL); cols = COLUMNS(container); /* * Default is to add a new widget spanning all columns. */ columns_add(cols, widget, 0, 0); /* 0 means ncols */ } static void columns_remove(GtkContainer *container, GtkWidget *widget) { Columns *cols; ColumnsChild *child; GtkWidget *childw; GList *children; gboolean was_visible; g_return_if_fail(container != NULL); g_return_if_fail(IS_COLUMNS(container)); g_return_if_fail(widget != NULL); cols = COLUMNS(container); for (children = cols->children; children && (child = children->data); children = children->next) { if (child->widget != widget) continue; was_visible = GTK_WIDGET_VISIBLE(widget); gtk_widget_unparent(widget); cols->children = g_list_remove_link(cols->children, children); g_list_free(children); g_free(child); if (was_visible) gtk_widget_queue_resize(GTK_WIDGET(container)); break; } for (children = cols->taborder; children && (childw = children->data); children = children->next) { if (childw != widget) continue; cols->taborder = g_list_remove_link(cols->taborder, children); g_list_free(children); break; } } static void columns_forall(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { Columns *cols; ColumnsChild *child; GList *children; g_return_if_fail(container != NULL); g_return_if_fail(IS_COLUMNS(container)); g_return_if_fail(callback != NULL); cols = COLUMNS(container); for (children = cols->children; children && (child = children->data); children = children->next) if (child->widget) callback(child->widget, callback_data); } static GtkType columns_child_type(GtkContainer *container) { return GTK_TYPE_WIDGET; } GtkWidget *columns_new(gint spacing) { Columns *cols; cols = gtk_type_new(columns_get_type()); cols->spacing = spacing; return GTK_WIDGET(cols); } void columns_set_cols(Columns *cols, gint ncols, const gint *percentages) { ColumnsChild *childdata; gint i; g_return_if_fail(cols != NULL); g_return_if_fail(IS_COLUMNS(cols)); g_return_if_fail(ncols > 0); g_return_if_fail(percentages != NULL); childdata = g_new(ColumnsChild, 1); childdata->widget = NULL; childdata->ncols = ncols; childdata->percentages = g_new(gint, ncols); childdata->force_left = FALSE; for (i = 0; i < ncols; i++) childdata->percentages[i] = percentages[i]; cols->children = g_list_append(cols->children, childdata); } void columns_add(Columns *cols, GtkWidget *child, gint colstart, gint colspan) { ColumnsChild *childdata; g_return_if_fail(cols != NULL); g_return_if_fail(IS_COLUMNS(cols)); g_return_if_fail(child != NULL); g_return_if_fail(child->parent == NULL); childdata = g_new(ColumnsChild, 1); childdata->widget = child; childdata->colstart = colstart; childdata->colspan = colspan; childdata->force_left = FALSE; cols->children = g_list_append(cols->children, childdata); cols->taborder = g_list_append(cols->taborder, child); gtk_widget_set_parent(child, GTK_WIDGET(cols)); if (GTK_WIDGET_REALIZED(cols)) gtk_widget_realize(child); if (GTK_WIDGET_VISIBLE(cols) && GTK_WIDGET_VISIBLE(child)) { if (GTK_WIDGET_MAPPED(cols)) gtk_widget_map(child); gtk_widget_queue_resize(child); } } void columns_force_left_align(Columns *cols, GtkWidget *widget) { ColumnsChild *child; GList *children; g_return_if_fail(cols != NULL); g_return_if_fail(IS_COLUMNS(cols)); g_return_if_fail(widget != NULL); for (children = cols->children; children && (child = children->data); children = children->next) { if (child->widget != widget) continue; child->force_left = TRUE; if (GTK_WIDGET_VISIBLE(widget)) gtk_widget_queue_resize(GTK_WIDGET(cols)); break; } } void columns_taborder_last(Columns *cols, GtkWidget *widget) { GtkWidget *childw; GList *children; g_return_if_fail(cols != NULL); g_return_if_fail(IS_COLUMNS(cols)); g_return_if_fail(widget != NULL); for (children = cols->taborder; children && (childw = children->data); children = children->next) { if (childw != widget) continue; cols->taborder = g_list_remove_link(cols->taborder, children); g_list_free(children); cols->taborder = g_list_append(cols->taborder, widget); break; } } /* * Override GtkContainer's focus movement so the user can * explicitly specify the tab order. */ static gint columns_focus(GtkContainer *container, GtkDirectionType dir) { Columns *cols; GList *pos; GtkWidget *focuschild; g_return_val_if_fail(container != NULL, FALSE); g_return_val_if_fail(IS_COLUMNS(container), FALSE); cols = COLUMNS(container); if (!GTK_WIDGET_DRAWABLE(cols) || !GTK_WIDGET_IS_SENSITIVE(cols)) return FALSE; if (!GTK_WIDGET_CAN_FOCUS(container) && (dir == GTK_DIR_TAB_FORWARD || dir == GTK_DIR_TAB_BACKWARD)) { focuschild = container->focus_child; gtk_container_set_focus_child(container, NULL); if (dir == GTK_DIR_TAB_FORWARD) pos = cols->taborder; else pos = g_list_last(cols->taborder); while (pos) { GtkWidget *child = pos->data; if (focuschild) { if (focuschild == child) { focuschild = NULL; /* now we can start looking in here */ if (GTK_WIDGET_DRAWABLE(child) && GTK_IS_CONTAINER(child) && !GTK_WIDGET_HAS_FOCUS(child)) { if (gtk_container_focus(GTK_CONTAINER(child), dir)) return TRUE; } } } else if (GTK_WIDGET_DRAWABLE(child)) { if (GTK_IS_CONTAINER(child)) { if (gtk_container_focus(GTK_CONTAINER(child), dir)) return TRUE; } else if (GTK_WIDGET_CAN_FOCUS(child)) { gtk_widget_grab_focus(child); return TRUE; } } if (dir == GTK_DIR_TAB_FORWARD) pos = pos->next; else pos = pos->prev; } return FALSE; } else return columns_inherited_focus(container, dir); } /* * Now here comes the interesting bit. The actual layout part is * done in the following two functions: * * columns_size_request() examines the list of widgets held in the * Columns, and returns a requisition stating the absolute minimum * size it can bear to be. * * columns_size_allocate() is given an allocation telling it what * size the whole container is going to be, and it calls * gtk_widget_size_allocate() on all of its (visible) children to * set their size and position relative to the top left of the * container. */ static void columns_size_request(GtkWidget *widget, GtkRequisition *req) { Columns *cols; ColumnsChild *child; GList *children; gint i, ncols, colspan, *colypos; const gint *percentages; static const gint onecol[] = { 100 }; g_return_if_fail(widget != NULL); g_return_if_fail(IS_COLUMNS(widget)); g_return_if_fail(req != NULL); cols = COLUMNS(widget); req->width = 0; req->height = cols->spacing; ncols = 1; colypos = g_new(gint, 1); colypos[0] = 0; percentages = onecol; for (children = cols->children; children && (child = children->data); children = children->next) { GtkRequisition creq; if (!child->widget) { /* Column reconfiguration. */ for (i = 1; i < ncols; i++) { if (colypos[0] < colypos[i]) colypos[0] = colypos[i]; } ncols = child->ncols; percentages = child->percentages; colypos = g_renew(gint, colypos, ncols); for (i = 1; i < ncols; i++) colypos[i] = colypos[0]; continue; } /* Only take visible widgets into account. */ if (!GTK_WIDGET_VISIBLE(child->widget)) continue; gtk_widget_size_request(child->widget, &creq); colspan = child->colspan ? child->colspan : ncols-child->colstart; /* * To compute width: we know that creq.width plus * cols->spacing needs to equal a certain percentage of the * full width of the container. So we work this value out, * figure out how wide the container will need to be to * make that percentage of it equal to that width, and * ensure our returned width is at least that much. Very * simple really. */ { int percent, thiswid, fullwid; percent = 0; for (i = 0; i < colspan; i++) percent += percentages[child->colstart+i]; thiswid = creq.width + cols->spacing; /* * Since creq is the _minimum_ size the child needs, we * must ensure that it gets _at least_ that size. * Hence, when scaling thiswid up to fullwid, we must * round up, which means adding percent-1 before * dividing by percent. */ fullwid = (thiswid * 100 + percent - 1) / percent; /* * The above calculation assumes every widget gets * cols->spacing on the right. So we subtract * cols->spacing here to account for the extra load of * spacing on the right. */ if (req->width < fullwid - cols->spacing) req->width = fullwid - cols->spacing; } /* * To compute height: the widget's top will be positioned * at the largest y value so far reached in any of the * columns it crosses. Then it will go down by creq.height * plus padding; and the point it reaches at the bottom is * the new y value in all those columns, and minus the * padding it is also a lower bound on our own size * request. */ { int topy, boty; topy = 0; for (i = 0; i < colspan; i++) { if (topy < colypos[child->colstart+i]) topy = colypos[child->colstart+i]; } boty = topy + creq.height + cols->spacing; for (i = 0; i < colspan; i++) { colypos[child->colstart+i] = boty; } if (req->height < boty - cols->spacing) req->height = boty - cols->spacing; } } req->width += 2*GTK_CONTAINER(cols)->border_width; req->height += 2*GTK_CONTAINER(cols)->border_width; g_free(colypos); } static void columns_size_allocate(GtkWidget *widget, GtkAllocation *alloc) { Columns *cols; ColumnsChild *child; GList *children; gint i, ncols, colspan, border, *colxpos, *colypos; const gint *percentages; static const gint onecol[] = { 100 }; g_return_if_fail(widget != NULL); g_return_if_fail(IS_COLUMNS(widget)); g_return_if_fail(alloc != NULL); cols = COLUMNS(widget); widget->allocation = *alloc; border = GTK_CONTAINER(cols)->border_width; ncols = 1; percentages = onecol; /* colxpos gives the starting x position of each column. * We supply n+1 of them, so that we can find the RH edge easily. * All ending x positions are expected to be adjusted afterwards by * subtracting the spacing. */ colxpos = g_new(gint, 2); colxpos[0] = 0; colxpos[1] = alloc->width - 2*border + cols->spacing; /* As in size_request, colypos is the lowest y reached in each column. */ colypos = g_new(gint, 1); colypos[0] = 0; for (children = cols->children; children && (child = children->data); children = children->next) { GtkRequisition creq; GtkAllocation call; if (!child->widget) { gint percent; /* Column reconfiguration. */ for (i = 1; i < ncols; i++) { if (colypos[0] < colypos[i]) colypos[0] = colypos[i]; } ncols = child->ncols; percentages = child->percentages; colypos = g_renew(gint, colypos, ncols); for (i = 1; i < ncols; i++) colypos[i] = colypos[0]; colxpos = g_renew(gint, colxpos, ncols + 1); colxpos[0] = 0; percent = 0; for (i = 0; i < ncols; i++) { percent += percentages[i]; colxpos[i+1] = (((alloc->width - 2*border) + cols->spacing) * percent / 100); } continue; } /* Only take visible widgets into account. */ if (!GTK_WIDGET_VISIBLE(child->widget)) continue; gtk_widget_get_child_requisition(child->widget, &creq); colspan = child->colspan ? child->colspan : ncols-child->colstart; /* * Starting x position is cols[colstart]. * Ending x position is cols[colstart+colspan] - spacing. * * Unless we're forcing left, in which case the width is * exactly the requisition width. */ call.x = alloc->x + border + colxpos[child->colstart]; if (child->force_left) call.width = creq.width; else call.width = (colxpos[child->colstart+colspan] - colxpos[child->colstart] - cols->spacing); /* * To compute height: the widget's top will be positioned * at the largest y value so far reached in any of the * columns it crosses. Then it will go down by creq.height * plus padding; and the point it reaches at the bottom is * the new y value in all those columns. */ { int topy, boty; topy = 0; for (i = 0; i < colspan; i++) { if (topy < colypos[child->colstart+i]) topy = colypos[child->colstart+i]; } call.y = alloc->y + border + topy; call.height = creq.height; boty = topy + creq.height + cols->spacing; for (i = 0; i < colspan; i++) { colypos[child->colstart+i] = boty; } } gtk_widget_size_allocate(child->widget, &call); } g_free(colxpos); g_free(colypos); } Node-path: putty/unix/gtkcols.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1865 Text-content-md5: a44cacc75f09a0a2cf2d23012143ebda Text-content-sha1: 9ee15c3830d9eeab11f15d5531fdbed78ca8bb8d Content-length: 1981 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN;;;/* * gtkcols.h - header file for a columns-based widget container * capable of supporting the PuTTY portable dialog box layout * mechanism. */ #ifndef COLUMNS_H #define COLUMNS_H #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define TYPE_COLUMNS (columns_get_type()) #define COLUMNS(obj) (GTK_CHECK_CAST((obj), TYPE_COLUMNS, Columns)) #define COLUMNS_CLASS(klass) \ (GTK_CHECK_CLASS_CAST((klass), TYPE_COLUMNS, ColumnsClass)) #define IS_COLUMNS(obj) (GTK_CHECK_TYPE((obj), TYPE_COLUMNS)) #define IS_COLUMNS_CLASS(klass) (GTK_CHECK_CLASS_TYPE((klass), TYPE_COLUMNS)) typedef struct Columns_tag Columns; typedef struct ColumnsClass_tag ColumnsClass; typedef struct ColumnsChild_tag ColumnsChild; struct Columns_tag { GtkContainer container; /* private after here */ GList *children; /* this holds ColumnsChild structures */ GList *taborder; /* this just holds GtkWidgets */ gint spacing; }; struct ColumnsClass_tag { GtkContainerClass parent_class; }; struct ColumnsChild_tag { /* If `widget' is non-NULL, this entry represents an actual widget. */ GtkWidget *widget; gint colstart, colspan; gboolean force_left; /* for recalcitrant GtkLabels */ /* Otherwise, this entry represents a change in the column setup. */ gint ncols; gint *percentages; }; GtkType columns_get_type(void); GtkWidget *columns_new(gint spacing); void columns_set_cols(Columns *cols, gint ncols, const gint *percentages); void columns_add(Columns *cols, GtkWidget *child, gint colstart, gint colspan); void columns_taborder_last(Columns *cols, GtkWidget *child); void columns_force_left_align(Columns *cols, GtkWidget *child); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* COLUMNS_H */ Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 17244 Text-content-md5: f428644d9a8063323c24089a4f3d60b7 Text-content-sha1: 48c29ac919d1df51a325a34be073d1c07bbd2d41 Content-length: 17360 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNKKK/* * gtkdlg.c - GTK implementation of the PuTTY configuration box. */ #include #include #include "gtkcols.h" #include "gtkpanel.h" #ifdef TESTMODE #define PUTTY_DO_GLOBALS /* actually _define_ globals */ #endif #include "putty.h" #include "dialog.h" void *dlg_get_privdata(union control *ctrl, void *dlg) { return NULL; /* FIXME */ } void dlg_set_privdata(union control *ctrl, void *dlg, void *ptr) { /* FIXME */ } void *dlg_alloc_privdata(union control *ctrl, void *dlg, size_t size) { return NULL; /* FIXME */ } union control *dlg_last_focused(void *dlg) { return NULL; /* FIXME */ } void dlg_radiobutton_set(union control *ctrl, void *dlg, int whichbutton) { /* FIXME */ } int dlg_radiobutton_get(union control *ctrl, void *dlg) { return 0; /* FIXME */ } void dlg_checkbox_set(union control *ctrl, void *dlg, int checked) { /* FIXME */ } int dlg_checkbox_get(union control *ctrl, void *dlg) { return 0; /* FIXME */ } void dlg_editbox_set(union control *ctrl, void *dlg, char const *text) { /* FIXME */ } void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length) { /* FIXME */ } /* The `listbox' functions can also apply to combo boxes. */ void dlg_listbox_clear(union control *ctrl, void *dlg) { /* FIXME */ } void dlg_listbox_del(union control *ctrl, void *dlg, int index) { /* FIXME */ } void dlg_listbox_add(union control *ctrl, void *dlg, char const *text) { /* FIXME */ } /* * Each listbox entry may have a numeric id associated with it. * Note that some front ends only permit a string to be stored at * each position, which means that _if_ you put two identical * strings in any listbox then you MUST not assign them different * IDs and expect to get meaningful results back. */ void dlg_listbox_addwithindex(union control *ctrl, void *dlg, char const *text, int id) { /* FIXME */ } int dlg_listbox_getid(union control *ctrl, void *dlg, int index) { return -1; /* FIXME */ } /* dlg_listbox_index returns <0 if no single element is selected. */ int dlg_listbox_index(union control *ctrl, void *dlg) { return -1; /* FIXME */ } int dlg_listbox_issel(union control *ctrl, void *dlg, int index) { return 0; /* FIXME */ } void dlg_listbox_select(union control *ctrl, void *dlg, int index) { /* FIXME */ } void dlg_text_set(union control *ctrl, void *dlg, char const *text) { /* FIXME */ } void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn) { /* FIXME */ } void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn) { /* FIXME */ } void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec fs) { /* FIXME */ } void dlg_fontsel_get(union control *ctrl, void *dlg, FontSpec *fs) { /* FIXME */ } /* * Bracketing a large set of updates in these two functions will * cause the front end (if possible) to delay updating the screen * until it's all complete, thus avoiding flicker. */ void dlg_update_start(union control *ctrl, void *dlg) { /* FIXME */ } void dlg_update_done(union control *ctrl, void *dlg) { /* FIXME */ } void dlg_set_focus(union control *ctrl, void *dlg) { /* FIXME */ } /* * During event processing, you might well want to give an error * indication to the user. dlg_beep() is a quick and easy generic * error; dlg_error() puts up a message-box or equivalent. */ void dlg_beep(void *dlg) { /* FIXME */ } void dlg_error_msg(void *dlg, char *msg) { /* FIXME */ } /* * This function signals to the front end that the dialog's * processing is completed, and passes an integer value (typically * a success status). */ void dlg_end(void *dlg, int value) { /* FIXME */ } void dlg_refresh(union control *ctrl, void *dlg) { /* FIXME */ } void dlg_coloursel_start(union control *ctrl, void *dlg, int r, int g, int b) { /* FIXME */ } int dlg_coloursel_results(union control *ctrl, void *dlg, int *r, int *g, int *b) { return 0; /* FIXME */ } /* * This function does the main layout work: it reads a controlset, * it creates the relevant GTK controls, and returns a GtkWidget * containing the result. (This widget might be a title of some * sort, it might be a Columns containing many controls, or it * might be a GtkFrame containing a Columns; whatever it is, it's * definitely a GtkWidget and should probably be added to a * GtkVbox.) */ GtkWidget *layout_ctrls(struct controlset *s) { Columns *cols; GtkWidget *ret; int i; if (!s->boxname && s->boxtitle) { /* This controlset is a panel title. */ return gtk_label_new(s->boxtitle); } /* * Otherwise, we expect to be laying out actual controls, so * we'll start by creating a Columns for the purpose. */ cols = COLUMNS(columns_new(4)); ret = GTK_WIDGET(cols); gtk_widget_show(ret); /* * Create a containing frame if we have a box name. */ if (*s->boxname) { ret = gtk_frame_new(s->boxtitle); /* NULL is valid here */ gtk_container_set_border_width(GTK_CONTAINER(cols), 4); gtk_container_add(GTK_CONTAINER(ret), GTK_WIDGET(cols)); gtk_widget_show(ret); } /* * Now iterate through the controls themselves, create them, * and add them to the Columns. */ for (i = 0; i < s->ncontrols; i++) { union control *ctrl = s->ctrls[i]; GtkWidget *w = NULL; switch (ctrl->generic.type) { case CTRL_COLUMNS: { static const int simplecols[1] = { 100 }; columns_set_cols(cols, ctrl->columns.ncols, (ctrl->columns.percentages ? ctrl->columns.percentages : simplecols)); } continue; /* no actual control created */ case CTRL_TABDELAY: /* FIXME: we can do columns_taborder_last easily enough, but * we need to be able to remember which GtkWidget(s) correspond * to ctrl->tabdelay.ctrl. */ continue; /* no actual control created */ case CTRL_BUTTON: w = gtk_button_new_with_label(ctrl->generic.label); break; case CTRL_CHECKBOX: w = gtk_check_button_new_with_label(ctrl->generic.label); break; case CTRL_RADIO: /* * Radio buttons get to go inside their own Columns, no * matter what. */ { gint i, *percentages; GSList *group; w = columns_new(1); if (ctrl->generic.label) { GtkWidget *label = gtk_label_new(ctrl->generic.label); columns_add(COLUMNS(w), label, 0, 1); columns_force_left_align(COLUMNS(w), label); gtk_widget_show(label); } percentages = g_new(gint, ctrl->radio.ncolumns); for (i = 0; i < ctrl->radio.ncolumns; i++) { percentages[i] = ((100 * (i+1) / ctrl->radio.ncolumns) - 100 * i / ctrl->radio.ncolumns); } columns_set_cols(COLUMNS(w), ctrl->radio.ncolumns, percentages); g_free(percentages); group = NULL; for (i = 0; i < ctrl->radio.nbuttons; i++) { GtkWidget *b; gint colstart; b = (gtk_radio_button_new_with_label (group, ctrl->radio.buttons[i])); group = gtk_radio_button_group(GTK_RADIO_BUTTON(b)); colstart = i % ctrl->radio.ncolumns; columns_add(COLUMNS(w), b, colstart, (i == ctrl->radio.nbuttons-1 ? ctrl->radio.ncolumns - colstart : 1)); gtk_widget_show(b); } } break; case CTRL_EDITBOX: if (ctrl->editbox.has_list) { w = gtk_combo_new(); } else { w = gtk_entry_new(); if (ctrl->editbox.password) gtk_entry_set_visibility(GTK_ENTRY(w), FALSE); } /* * Edit boxes, for some strange reason, have a minimum * width of 150 in GTK 1.2. We don't want this - we'd * rather the edit boxes acquired their natural width * from the column layout of the rest of the box. */ { GtkRequisition req; gtk_widget_size_request(w, &req); gtk_widget_set_usize(w, 10, req.height); } if (ctrl->generic.label) { GtkWidget *label, *container; label = gtk_label_new(ctrl->generic.label); container = columns_new(4); if (ctrl->editbox.percentwidth == 100) { columns_add(COLUMNS(container), label, 0, 1); columns_force_left_align(COLUMNS(container), label); columns_add(COLUMNS(container), w, 0, 1); } else { gint percentages[2]; percentages[1] = ctrl->editbox.percentwidth; percentages[0] = 100 - ctrl->editbox.percentwidth; columns_set_cols(COLUMNS(container), 2, percentages); columns_add(COLUMNS(container), label, 0, 1); columns_force_left_align(COLUMNS(container), label); columns_add(COLUMNS(container), w, 1, 1); } gtk_widget_show(label); gtk_widget_show(w); w = container; } break; case CTRL_TEXT: w = gtk_label_new(ctrl->generic.label); gtk_label_set_line_wrap(GTK_LABEL(w), TRUE); gtk_label_set_justify(GTK_LABEL(w), GTK_JUSTIFY_FILL); break; } if (w) { columns_add(cols, w, COLUMN_START(ctrl->generic.column), COLUMN_SPAN(ctrl->generic.column)); gtk_widget_show(w); } } return ret; } struct selparam { Panels *panels; GtkWidget *panel, *treeitem; }; static void treeitem_sel(GtkItem *item, gpointer data) { struct selparam *sp = (struct selparam *)data; panels_switch_to(sp->panels, sp->panel); } void destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } void do_config_box(void) { GtkWidget *window, *hbox, *vbox, *cols, *label, *tree, *treescroll, *panels, *panelvbox; int index, level; struct controlbox *ctrlbox; char *path; GtkTreeItem *treeitemlevels[8]; GtkTree *treelevels[8]; Config cfg; struct selparam *selparams = NULL; int nselparams = 0, selparamsize = 0; do_defaults(NULL, &cfg); ctrlbox = ctrl_new_box(); setup_config_box(ctrlbox, NULL, FALSE, 0); window = gtk_dialog_new(); gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(window)->vbox), 4); hbox = gtk_hbox_new(FALSE, 4); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox), hbox, TRUE, TRUE, 0); gtk_widget_show(hbox); vbox = gtk_vbox_new(FALSE, 4); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); gtk_widget_show(vbox); cols = columns_new(4); gtk_box_pack_start(GTK_BOX(vbox), cols, FALSE, FALSE, 0); gtk_widget_show(cols); label = gtk_label_new("Category:"); columns_add(COLUMNS(cols), label, 0, 1); columns_force_left_align(COLUMNS(cols), label); gtk_widget_show(label); treescroll = gtk_scrolled_window_new(NULL, NULL); tree = gtk_tree_new(); gtk_tree_set_view_mode(GTK_TREE(tree), GTK_TREE_VIEW_ITEM); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(treescroll), tree); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(treescroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_widget_show(tree); gtk_widget_show(treescroll); gtk_box_pack_start(GTK_BOX(vbox), treescroll, TRUE, TRUE, 0); panels = panels_new(); gtk_box_pack_start(GTK_BOX(hbox), panels, TRUE, TRUE, 0); gtk_widget_show(panels); panelvbox = NULL; path = NULL; level = 0; for (index = 0; index < ctrlbox->nctrlsets; index++) { struct controlset *s = ctrlbox->ctrlsets[index]; GtkWidget *w = layout_ctrls(s); if (!*s->pathname) { gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->action_area), w, TRUE, TRUE, 0); } else { int j = path ? ctrl_path_compare(s->pathname, path) : 0; if (j != INT_MAX) { /* add to treeview, start new panel */ char *c; GtkWidget *treeitem; int first; /* * We expect never to find an implicit path * component. For example, we expect never to see * A/B/C followed by A/D/E, because that would * _implicitly_ create A/D. All our path prefixes * are expected to contain actual controls and be * selectable in the treeview; so we would expect * to see A/D _explicitly_ before encountering * A/D/E. */ assert(j == ctrl_path_elements(s->pathname) - 1); c = strrchr(s->pathname, '/'); if (!c) c = s->pathname; else c++; treeitem = gtk_tree_item_new_with_label(c); assert(j-1 < level); if (j > 0) { if (!treelevels[j-1]) { treelevels[j-1] = GTK_TREE(gtk_tree_new()); gtk_tree_item_set_subtree (treeitemlevels[j-1], GTK_WIDGET(treelevels[j-1])); gtk_tree_item_expand(treeitemlevels[j-1]); } gtk_tree_append(treelevels[j-1], treeitem); } else { gtk_tree_append(GTK_TREE(tree), treeitem); } treeitemlevels[j] = GTK_TREE_ITEM(treeitem); treelevels[j] = NULL; level = j+1; gtk_widget_show(treeitem); path = s->pathname; first = (panelvbox == NULL); panelvbox = gtk_vbox_new(FALSE, 4); gtk_container_add(GTK_CONTAINER(panels), panelvbox); if (first) { panels_switch_to(PANELS(panels), panelvbox); gtk_tree_select_child(GTK_TREE(tree), treeitem); } if (nselparams >= selparamsize) { selparamsize += 16; selparams = srealloc(selparams, selparamsize * sizeof(*selparams)); } selparams[nselparams].panels = PANELS(panels); selparams[nselparams].panel = panelvbox; selparams[nselparams].treeitem = treeitem; nselparams++; } gtk_box_pack_start(GTK_BOX(panelvbox), w, FALSE, FALSE, 0); } } for (index = 0; index < nselparams; index++) { gtk_signal_connect(GTK_OBJECT(selparams[index].treeitem), "select", GTK_SIGNAL_FUNC(treeitem_sel), &selparams[index]); } gtk_widget_show(window); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(destroy), NULL); gtk_main(); sfree(selparams); } /* ====================================================================== * Below here is a stub main program which allows the dialog box * code to be compiled and tested with a minimal amount of the rest * of PuTTY. */ #ifdef TESTMODE /* Compile command for testing: gcc -o gtkdlg gtk{dlg,cols,panel}.c ../{config,dialog,settings}.c \ ../{misc,tree234,be_none}.c ux{store,misc,print}.c \ -I. -I.. -I../charset -DTESTMODE `gtk-config --cflags --libs` */ void modalfatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } char *cp_name(int codepage) { return (codepage == 123 ? "testing123" : codepage == 234 ? "testing234" : codepage == 345 ? "testing345" : "unknown"); } char *cp_enumerate(int index) { return (index == 0 ? "testing123" : index == 1 ? "testing234" : NULL); } int decode_codepage(char *cp_name) { return (!strcmp(cp_name, "testing123") ? 123 : !strcmp(cp_name, "testing234") ? 234 : !strcmp(cp_name, "testing345") ? 345 : -2); } struct printer_enum_tag { int dummy; } printer_test; printer_enum *printer_start_enum(int *nprinters_ptr) { *nprinters_ptr = 2; return &printer_test; } char *printer_get_name(printer_enum *pe, int i) { return (i==0 ? "lpr" : i==1 ? "lpr -Pfoobar" : NULL); } void printer_finish_enum(printer_enum *pe) { } char *platform_default_s(const char *name) { return NULL; } int platform_default_i(const char *name, int def) { return def; } FontSpec platform_default_fontspec(const char *name) { FontSpec ret; *ret.name = '\0'; return ret; } Filename platform_default_filename(const char *name) { Filename ret; *ret.path = '\0'; return ret; } char *x_get_default(const char *key) { return NULL; } int main(int argc, char **argv) { gtk_init(&argc, &argv); do_config_box(); return 0; } #endif Node-path: putty/unix/gtkpanel.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 10836 Text-content-md5: be494049fa7f60bdd3f8a93721bc8cae Text-content-sha1: 7e15ba2fe31a0046fd32cb02ec93954f8079b5d3 Content-length: 10952 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNFFF/* * gtkpanel.c - implementation of the `Panels' GTK layout container. */ #include "gtkpanel.h" static void panels_init(Panels *panels); static void panels_class_init(PanelsClass *klass); static void panels_map(GtkWidget *widget); static void panels_unmap(GtkWidget *widget); static void panels_draw(GtkWidget *widget, GdkRectangle *area); static gint panels_expose(GtkWidget *widget, GdkEventExpose *event); static void panels_base_add(GtkContainer *container, GtkWidget *widget); static void panels_remove(GtkContainer *container, GtkWidget *widget); static void panels_forall(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); static GtkType panels_child_type(GtkContainer *container); static void panels_size_request(GtkWidget *widget, GtkRequisition *req); static void panels_size_allocate(GtkWidget *widget, GtkAllocation *alloc); static GtkContainerClass *parent_class = NULL; GtkType panels_get_type(void) { static GtkType panels_type = 0; if (!panels_type) { static const GtkTypeInfo panels_info = { "Panels", sizeof(Panels), sizeof(PanelsClass), (GtkClassInitFunc) panels_class_init, (GtkObjectInitFunc) panels_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, (GtkClassInitFunc) NULL, }; panels_type = gtk_type_unique(GTK_TYPE_CONTAINER, &panels_info); } return panels_type; } static void panels_class_init(PanelsClass *klass) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; GtkContainerClass *container_class; object_class = (GtkObjectClass *)klass; widget_class = (GtkWidgetClass *)klass; container_class = (GtkContainerClass *)klass; parent_class = gtk_type_class(GTK_TYPE_CONTAINER); /* * FIXME: do we have to do all this faffing with set_arg, * get_arg and child_arg_type? Ick. */ widget_class->map = panels_map; widget_class->unmap = panels_unmap; widget_class->draw = panels_draw; widget_class->expose_event = panels_expose; widget_class->size_request = panels_size_request; widget_class->size_allocate = panels_size_allocate; container_class->add = panels_base_add; container_class->remove = panels_remove; container_class->forall = panels_forall; container_class->child_type = panels_child_type; } static void panels_init(Panels *panels) { GTK_WIDGET_SET_FLAGS(panels, GTK_NO_WINDOW); panels->children = NULL; } /* * These appear to be thoroughly tedious functions; the only reason * we have to reimplement them at all is because we defined our own * format for our GList of children... */ static void panels_map(GtkWidget *widget) { Panels *panels; GtkWidget *child; GList *children; g_return_if_fail(widget != NULL); g_return_if_fail(IS_PANELS(widget)); panels = PANELS(widget); GTK_WIDGET_SET_FLAGS(panels, GTK_MAPPED); for (children = panels->children; children && (child = children->data); children = children->next) { if (child && GTK_WIDGET_VISIBLE(child) && !GTK_WIDGET_MAPPED(child)) gtk_widget_map(child); } } static void panels_unmap(GtkWidget *widget) { Panels *panels; GtkWidget *child; GList *children; g_return_if_fail(widget != NULL); g_return_if_fail(IS_PANELS(widget)); panels = PANELS(widget); GTK_WIDGET_UNSET_FLAGS(panels, GTK_MAPPED); for (children = panels->children; children && (child = children->data); children = children->next) { if (child && GTK_WIDGET_VISIBLE(child) && GTK_WIDGET_MAPPED(child)) gtk_widget_unmap(child); } } static void panels_draw(GtkWidget *widget, GdkRectangle *area) { Panels *panels; GtkWidget *child; GList *children; GdkRectangle child_area; g_return_if_fail(widget != NULL); g_return_if_fail(IS_PANELS(widget)); if (GTK_WIDGET_DRAWABLE(widget)) { panels = PANELS(widget); for (children = panels->children; children && (child = children->data); children = children->next) { if (child && GTK_WIDGET_DRAWABLE(child) && gtk_widget_intersect(child, area, &child_area)) gtk_widget_draw(child, &child_area); } } } static gint panels_expose(GtkWidget *widget, GdkEventExpose *event) { Panels *panels; GtkWidget *child; GList *children; GdkEventExpose child_event; g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(IS_PANELS(widget), FALSE); g_return_val_if_fail(event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE(widget)) { panels = PANELS(widget); child_event = *event; for (children = panels->children; children && (child = children->data); children = children->next) { if (child && GTK_WIDGET_DRAWABLE(child) && GTK_WIDGET_NO_WINDOW(child) && gtk_widget_intersect(child, &event->area, &child_event.area)) gtk_widget_event(child, (GdkEvent *)&child_event); } } return FALSE; } static void panels_base_add(GtkContainer *container, GtkWidget *widget) { Panels *panels; g_return_if_fail(container != NULL); g_return_if_fail(IS_PANELS(container)); g_return_if_fail(widget != NULL); panels = PANELS(container); panels_add(panels, widget); } static void panels_remove(GtkContainer *container, GtkWidget *widget) { Panels *panels; GtkWidget *child; GList *children; gboolean was_visible; g_return_if_fail(container != NULL); g_return_if_fail(IS_PANELS(container)); g_return_if_fail(widget != NULL); panels = PANELS(container); for (children = panels->children; children && (child = children->data); children = children->next) { if (child != widget) continue; was_visible = GTK_WIDGET_VISIBLE(widget); gtk_widget_unparent(widget); panels->children = g_list_remove_link(panels->children, children); g_list_free(children); if (was_visible) gtk_widget_queue_resize(GTK_WIDGET(container)); break; } } static void panels_forall(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { Panels *panels; GtkWidget *child; GList *children; g_return_if_fail(container != NULL); g_return_if_fail(IS_PANELS(container)); g_return_if_fail(callback != NULL); panels = PANELS(container); for (children = panels->children; children && (child = children->data); children = children->next) if (child) callback(child, callback_data); } static GtkType panels_child_type(GtkContainer *container) { return GTK_TYPE_WIDGET; } GtkWidget *panels_new(void) { Panels *panels; panels = gtk_type_new(panels_get_type()); return GTK_WIDGET(panels); } void panels_add(Panels *panels, GtkWidget *child) { g_return_if_fail(panels != NULL); g_return_if_fail(IS_PANELS(panels)); g_return_if_fail(child != NULL); g_return_if_fail(child->parent == NULL); panels->children = g_list_append(panels->children, child); gtk_widget_set_parent(child, GTK_WIDGET(panels)); if (GTK_WIDGET_REALIZED(panels)) gtk_widget_realize(child); if (GTK_WIDGET_VISIBLE(panels)) { if (GTK_WIDGET_MAPPED(panels)) gtk_widget_map(child); gtk_widget_queue_resize(child); } } void panels_switch_to(Panels *panels, GtkWidget *target) { GtkWidget *child; GList *children; gboolean changed; g_return_if_fail(panels != NULL); g_return_if_fail(IS_PANELS(panels)); g_return_if_fail(target != NULL); g_return_if_fail(target->parent == GTK_WIDGET(panels)); for (children = panels->children; children && (child = children->data); children = children->next) { if (!child) continue; if (child == target) { if (!GTK_WIDGET_VISIBLE(child)) { gtk_widget_show(child); changed = TRUE; } } else { if (GTK_WIDGET_VISIBLE(child)) { gtk_widget_hide(child); changed = TRUE; } } } if (changed) gtk_widget_queue_resize(child); } /* * Now here comes the interesting bit. The actual layout part is * done in the following two functions: * * panels_size_request() examines the list of widgets held in the * Panels, and returns a requisition stating the absolute minimum * size it can bear to be. * * panels_size_allocate() is given an allocation telling it what * size the whole container is going to be, and it calls * gtk_widget_size_allocate() on all of its (visible) children to * set their size and position relative to the top left of the * container. */ static void panels_size_request(GtkWidget *widget, GtkRequisition *req) { Panels *panels; GtkWidget *child; GList *children; g_return_if_fail(widget != NULL); g_return_if_fail(IS_PANELS(widget)); g_return_if_fail(req != NULL); panels = PANELS(widget); req->width = 0; req->height = 0; for (children = panels->children; children && (child = children->data); children = children->next) { GtkRequisition creq; gtk_widget_size_request(child, &creq); if (req->width < creq.width) req->width = creq.width; if (req->height < creq.height) req->height = creq.height; } req->width += 2*GTK_CONTAINER(panels)->border_width; req->height += 2*GTK_CONTAINER(panels)->border_width; } static void panels_size_allocate(GtkWidget *widget, GtkAllocation *alloc) { Panels *panels; GtkWidget *child; GList *children; gint border; g_return_if_fail(widget != NULL); g_return_if_fail(IS_PANELS(widget)); g_return_if_fail(alloc != NULL); panels = PANELS(widget); widget->allocation = *alloc; border = GTK_CONTAINER(panels)->border_width; for (children = panels->children; children && (child = children->data); children = children->next) { GtkAllocation call; /* Only take visible widgets into account. */ if (!GTK_WIDGET_VISIBLE(child)) continue; call.x = alloc->x + border; call.width = alloc->width - 2*border; call.y = alloc->y + border; call.height = alloc->height - 2*border; gtk_widget_size_allocate(child, &call); } } Node-path: putty/unix/gtkpanel.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1310 Text-content-md5: 1537e7c689fe3636a51f8906e21423eb Text-content-sha1: d1fd20a6210e56c8f69a22cb68875d314a9e0cc5 Content-length: 1426 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * gtkpanel.h - header file for a panel-based widget container, * which holds a number of widgets of which at most one is ever * visible at a time, and sizes itself to the maximum of its * children's potential size requests. */ #ifndef PANELS_H #define PANELS_H #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define TYPE_PANELS (panels_get_type()) #define PANELS(obj) (GTK_CHECK_CAST((obj), TYPE_PANELS, Panels)) #define PANELS_CLASS(klass) \ (GTK_CHECK_CLASS_CAST((klass), TYPE_PANELS, PanelsClass)) #define IS_PANELS(obj) (GTK_CHECK_TYPE((obj), TYPE_PANELS)) #define IS_PANELS_CLASS(klass) (GTK_CHECK_CLASS_TYPE((klass), TYPE_PANELS)) typedef struct Panels_tag Panels; typedef struct PanelsClass_tag PanelsClass; typedef struct PanelsChild_tag PanelsChild; struct Panels_tag { GtkContainer container; /* private after here */ GList *children; /* this just holds GtkWidgets */ }; struct PanelsClass_tag { GtkContainerClass parent_class; }; GtkType panels_get_type(void); GtkWidget *panels_new(void); void panels_add(Panels *panels, GtkWidget *child); void panels_switch_to(Panels *panels, GtkWidget *child); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* PANELS_H */ Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6cd4b90425ef1ed4705669d28dcdf1c8 Text-delta-base-sha1: 7ac8b4c8f3228d4e16e1d0cf8aec1619b0192d1a Text-content-length: 144 Text-content-md5: 990b50c1401f6a01d06184bd891d5a48 Text-content-sha1: f4b7f281bc6ecd2484f5bc3643575de4a03da4eb Content-length: 184 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNbj z3z=%GTK, there is no context help available. */ #define HELPCTX(x) P(NULL) #define FILTER_KEY_FILES NULL /* FIXME */ Revision-number: 2932 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:09:59.905248Z PROPS-END Revision-number: 2933 Prop-content-length: 518 Content-length: 518 K 8 svn:date V 27 2003-03-14T18:35:01.000000Z K 7 svn:log V 417 Continuing work on the GTK config box. Created uxcfg.c for the Unix-specific config items; moved a stray Windows-specific config item (scrollbar-in-fullscreen) out into wincfg.c to stop it appearing on Unix; continued updates to gtkdlg.c. I now believe the GTK config box looks basically correct (modulo minor cosmetic issues and keyboard accelerators). Next step, add the event handling so it's actually functional. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 249d63002bdd1c41d29ca944bd4c0fc8 Text-delta-base-sha1: 528f5e794c83846716829c5ac1d6b8bf26636970 Text-content-length: 25 Text-content-md5: 5151783b10d1ed9511bee91366642775 Text-content-sha1: b3d75293289a6ee2cf84b04eb71672c7c94093b2 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN]+ 7ti Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f428644d9a8063323c24089a4f3d60b7 Text-delta-base-sha1: 48c29ac919d1df51a325a34be073d1c07bbd2d41 Text-content-length: 6013 Text-content-md5: 682184c16521942582c1fea653df7922 Text-content-sha1: dce21b71251c54a474150f299e28261ee7f15d17 Content-length: 6052 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNKjaIl\C @5jZ?DJ>*J#wmw~M N^[6CD/* * TODO: * * - event handling, in general! * * - keyboard stuff * + accelerators * + tab order * + default button * * - cosmetics: * + can't we _somehow_ have less leading between radio buttons? * + wrapping text widgets, the horror, the horror * + labels and their associated edit boxes don't line up * properly, int listitemheightFILESELECT: case CTRL_FONTSELECT: { GtkWidget *ww; GtkRequisition req; char *browsebtn = (ctrl->generic.type == CTRL_FILESELECT ? "Browse..." : "Change..."); gint percentages[] = { 75, 25 }; w = columns_new(4); columns_set_cols(COLUMNS(w), 2, percentages); if (ctrl->generic.label) { ww = gtk_label_new(ctrl->generic.label); columns_add(COLUMNS(w), ww, 0, 2); columns_force_left_align(COLUMNS(w), ww); gtk_widget_show(ww); } ww = gtk_entry_new(); gtk_widget_size_request(ww, &req); gtk_widget_set_usize(ww, 10, req.height); columns_add(COLUMNS(w), ww, 0, 1); gtk_widget_show(ww); ww = gtk_button_new_with_label(browsebtn); columns_add(COLUMNS(w), ww, 1, 1); gtk_widget_show(ww); } break; case CTRL_LISTBOX: if (ctrl->listbox.height == 0) { w = gtk_option_menu_new(); } else { GtkWidget *list; list = gtk_list_new(); gtk_list_set_selection_mode(GTK_LIST(list), (ctrl->listbox.multisel ? GTK_SELECTION_MULTIPLE : GTK_SELECTION_SINGLE)); w = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(w), list); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(w), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_widget_show(list); /* * Adjust the height of the scrolled window to the * minimum given by the height parameter. * * This piece of guesswork is a horrid hack based * on looking inside the GTK 1.2 sources * (specifically gtkviewport.c, which appears to be * the widget which provides the border around the * scrolling area). Anyone lets me know how I can * do this in a way which isn't at risk from GTK * upgrades, I'd be grateful. */ { int edge = GTK_WIDGET(list)->style->klass->ythickness; gtk_widget_set_usize(w, 10, 2*edge + (ctrl->listbox.height * listitemheight)); } #if 1 /* here is an example of a percentage-based tabbed list item */ { int i; for (i=0; i<10; i++) { GtkWidget *listitem = gtk_list_item_new(); GtkWidget *cols = columns_new(4); GtkWidget *label1 = gtk_label_new("left"); GtkWidget *label2 = gtk_label_new("right"); GList *itemlist; static const gint percents[] = { 50, 50 }; columns_set_cols(COLUMNS(cols), 2, percents); columns_add(COLUMNS(cols), label1, 0, 1); columns_force_left_align(COLUMNS(cols), label1); columns_add(COLUMNS(cols), label2, 1, 1); columns_force_left_align(COLUMNS(cols), label2); gtk_widget_show(label1); gtk_widget_show(label2); gtk_widget_show(cols); gtk_container_add(GTK_CONTAINER(listitem), cols); itemlist = g_list_append(NULL, listitem); gtk_list_append_items(GTK_LIST(list), itemlist); gtk_widget_show(listitem); } } #endif if (ctrl->listbox.draglist) { /* * GTK doesn't appear to make it easy to * implement a proper draggable list; so * instead I'm just going to have to put an Up * and a Down button to the right of the actual * list box. Ah well. */ GtkWidget *cols, *button; static const gint percentages[2] = { 80, 20 }; cols = columns_new(4); columns_set_cols(COLUMNS(cols), 2, percentages); columns_add(COLUMNS(cols), w, 0, 1); gtk_widget_show(w); button = gtk_button_new_with_label("Up"); columns_add(COLUMNS(cols), button, 1, 1); gtk_widget_show(button); button = gtk_button_new_with_label("Down"); columns_add(COLUMNS(cols), button, 1, 1); gtk_widget_show(button); w = cols; } lislistbox.percentwidth; percentages[0] = 100 - ctrl->lis /* FIXME: deal with wrapping! */, listitemheight{ GtkWidget *listitem = gtk_list_item_new_with_label("foo"); GtkRequisition req; gtk_widget_size_request(listitem, &req); listitemheight = req.height; gtk_widget_unref(listitem); } ctrlbox = ctrl_new_box(); setup_config_box(ctrlbox, NULL, FALSE, 0); unix_setup_config_box(ctrlbox, FALSE); window = gtk_dialog_new(container_set_border_width(GTK_CONTAINER(hbox), 1tree_set_selection_mode(GTK_TREE(tree), GTK_SELECTION_BROWSE, listitemheight gtk_widget_show(wgcc -g,cfg Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 990b50c1401f6a01d06184bd891d5a48 Text-delta-base-sha1: f4b7f281bc6ecd2484f5bc3643575de4a03da4eb Text-content-length: 116 Text-content-md5: 850ab147690493a80939411283a7b271 Text-content-sha1: 58b224ea2887c0397ac02a2557b2670000ac3725 Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNjN ^]^W uxcfg.c */ struct controlbox; void unix_setup_config_box(struct controlbox *b, int midsession Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4057 Text-content-md5: 9d3d63586eadb120beeee698cb0e502f Text-content-sha1: e5996727c782ebbed01939ab9bfb82e9fa6474aa Content-length: 4173 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNKKK/* * uxcfg.c - the Unix-specific parts of the PuTTY configuration * box. */ #include #include #include "putty.h" #include "dialog.h" #include "storage.h" void unix_setup_config_box(struct controlbox *b, int midsession) { struct controlset *s, *s2; union control *c; int i; #ifdef FIXME if (!midsession) { /* * Add the About button to the standard panel. */ s = ctrl_getset(b, "", "", ""); c = ctrl_pushbutton(s, "About", 'a', HELPCTX(no_help), about_handler, P(hwndp)); c->generic.column = 0; } #endif /* * The Config structure contains two Unix-specific elements * which are not configured in here: stamp_utmp and * login_shell. This is because pterm does not put up a * configuration box right at the start, which is the only time * when these elements would be useful to configure. */ /* * GTK makes it rather easier to put the scrollbar on the left * than Windows does! */ s = ctrl_getset(b, "Window", "scrollback", "Control the scrollback in the window"); ctrl_checkbox(s, "Scrollbar on left", 'l', HELPCTX(no_help), dlg_stdcheckbox_handler, I(offsetof(Config,scrollbar_on_left))); /* * Really this wants to go just after `Display scrollbar'. See * if we can find that control, and do some shuffling. */ for (i = 0; i < s->ncontrols; i++) { c = s->ctrls[i]; if (c->generic.type == CTRL_CHECKBOX && c->generic.context.i == offsetof(Config,scrollbar)) { /* * Control i is the scrollbar checkbox. * Control s->ncontrols-1 is the scrollbar-on-left one. */ if (i < s->ncontrols-2) { c = s->ctrls[s->ncontrols-1]; memmove(s->ctrls+i+2, s->ctrls+i+1, (s->ncontrols-i-2)*sizeof(union control *)); s->ctrls[i+1] = c; } break; } } /* * X requires three more fonts: bold, wide, and wide-bold; also * we need the fiddly shadow-bold-offset control. This would * make the Window/Appearance panel rather unwieldy and large, * so I think the sensible thing here is to _move_ this * controlset into a separate Window/Fonts panel! */ s2 = ctrl_getset(b, "Window/Appearance", "font", "Font settings"); /* Remove this controlset from b. */ for (i = 0; i < b->nctrlsets; i++) { if (b->ctrlsets[i] == s2) { memmove(b->ctrlsets+i, b->ctrlsets+i+1, (b->nctrlsets-i-1) * sizeof(*b->ctrlsets)); b->nctrlsets--; break; } } ctrl_settitle(b, "Window/Fonts", "Options controlling font usage"); s = ctrl_getset(b, "Window/Fonts", "font", "Fonts for displaying non-bold text"); ctrl_fontsel(s, "Font used for ordinary text", 'w', HELPCTX(no_help), dlg_stdfontsel_handler, I(offsetof(Config,font))); ctrl_fontsel(s, "Font used for wide (CJK) text", 'w', HELPCTX(no_help), dlg_stdfontsel_handler, I(offsetof(Config,widefont))); s = ctrl_getset(b, "Window/Fonts", "fontbold", "Fonts for displaying bolded text"); ctrl_fontsel(s, "Font used for bolded text", 'b', HELPCTX(no_help), dlg_stdfontsel_handler, I(offsetof(Config,boldfont))); ctrl_fontsel(s, "Font used for bold wide text", 'i', HELPCTX(no_help), dlg_stdfontsel_handler, I(offsetof(Config,wideboldfont))); ctrl_text(s, "If you leave the bold font selectors blank, bold text" " will be displayed by overprinting (\"shadow bold\"). Note" " that this only applies if you have not requested bolding" " to be done by changing the text colour.", HELPCTX(no_help)); ctrl_editbox(s, "Horizontal offset for shadow bold:", 'z', 20, HELPCTX(no_help), dlg_stdeditbox_handler, I(offsetof(Config,shadowboldoffset)), I(-1)); } Node-path: putty/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a7a19f44632a9b8ee83c8f8f2ac58d00 Text-delta-base-sha1: e75e027ec87833b1e9b0f275f11dfee4a7c2e03a Text-content-length: 1242 Text-content-md5: 94d4eefe4f87ea0743d21369d2426ecf Text-content-sha1: 19dfec8de58cfb086da0d4c4e5c14ad5a360c5d6 Content-length: 1281 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN{T BBmFull-screen mode is a Windows peculiarity; hence * scrollbar_in_fullscreen is as well. */ s = ctrl_getset(b, "Window", "scrollback", "Control the scrollback in the window"); ctrl_checkbox(s, "Display scrollbar in full screen mode", 'i', HELPCTX(window_scrollback), dlg_stdcheckbox_handler, I(offsetof(Config,scrollbar_in_fullscreen))); /* * Really this wants to go just after `Display scrollbar'. See * if we can find that control, and do some shuffling. */ { int i; for (i = 0; i < s->ncontrols; i++) { c = s->ctrls[i]; if (c->generic.type == CTRL_CHECKBOX && c->generic.context.i == offsetof(Config,scrollbar)) { /* * Control i is the scrollbar checkbox. * Control s->ncontrols-1 is the scrollbar-in-FS one. */ if (i < s->ncontrols-2) { c = s->ctrls[s->ncontrols-1]; memmove(s->ctrls+i+2, s->ctrls+i+1, (s->ncontrols-i-2)*sizeof(union control *)); s->ctrls[i+1] = c; } break; } Revision-number: 2934 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2003-03-14T21:18:13.000000Z K 7 svn:log V 70 The divisor in the bell timing boxes should be TICKSPERSEC, not 1000. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5151783b10d1ed9511bee91366642775 Text-delta-base-sha1: b3d75293289a6ee2cf84b04eb71672c7c94093b2 Text-content-length: 55 Text-content-md5: be9b322f01599950e69522e9eec1fcfc Text-content-sha1: cd357ae36113a355a4cab506b86fb4b19e87820e Content-length: 94 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN+9",TICKSPERSECTICKSPERSEC Revision-number: 2935 Prop-content-length: 338 Content-length: 338 K 7 svn:log V 237 While I'm adding explanatory comments by the coroutine macros, it occurs to me that would also be a good place to put a copy of the instructions for disabling Edit and Continue debugging. Nobody _actually_ reads the README, after all... K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-14T21:20:32.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 317c47ae79ef55d04a0240cc0fa0f04c Text-delta-base-sha1: a4a2de0b97d5a0f1059d7fad0bc37096e4709a22 Text-content-length: 1011 Text-content-md5: 51e306f1aaf8a9dd6b159436340307bb Text-content-sha1: 64cc0049e5ae5bf14fe8d0828d2d05e42f5fa93a Content-length: 1052 K 15 cvs2svn:cvs-rev V 5 1.278 PROPS-END SVN `W`IS * In particular, if you are getting `case expression not constant' * errors when building with MS Visual Studio, this is because MS's * Edit and Continue debugging feature causes their compiler to * violate ANSI C. To disable Edit and Continue debugging: * * - right-click ssh.c in the FileView * - click Settings * - select the C/C++ tab and the General category * - under `Debug info:', select anything _other_ than `Program * Database for Edit and Continue'oSddo } else { c->remoteid = GET_32BIT(ssh->pktin.body); c->localid = alloc_channel_id(ssh); c->closes = 0; c->v.v1.throttling = 0; c->type = CHAN_SOCKDATA; /* identify channel type */ add234(ssh->channels, c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION, PKT_INT, c->remoteid, PKT_INT, c->localid, PKT_END); logevent("Forwarded port opened successfully"); } } } else if (ssh->pktin.type == SSH1_MSG_CHANNEL_OPEN_CONFIRMAT Revision-number: 2936 Prop-content-length: 307 Content-length: 307 K 7 svn:log V 206 Missed a couple of the Unix-specific settings out of settings.c. One of these days I'll have to separate the platform-specific settings out into winsett and uxsett modules, but for now it's not too urgent. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-15T09:42:15.000000Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ce2ff801b8a37d7eb03e5fcd489877e4 Text-delta-base-sha1: d2eaa1159d2411950f415e67197ac94aafbc3a44 Text-content-length: 116 Text-content-md5: 837e783bbcba2ab7176b744edbc357ab Text-content-sha1: 05115d02b05d43b309a0641425350c36d9dd10a7 Content-length: 157 K 15 cvs2svn:cvs-rev V 5 1.104 PROPS-END SVNq] ZyZ gfont(sesskey, "WideFont", &cfg->widefont); gppfont(sesskey, "WideBoldFont", &cfg->wide Revision-number: 2937 Prop-content-length: 230 Content-length: 230 K 7 svn:log V 129 Windows sets automatic tabs in list boxes, but GTK doesn't, so we should make the tab stop in the forwarded-ports list explicit. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-15T15:49:04.000000Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: be9b322f01599950e69522e9eec1fcfc Text-delta-base-sha1: cd357ae36113a355a4cab506b86fb4b19e87820e Text-content-length: 208 Text-content-md5: 926d5308d4b3bc67f0fb3e3ea2103be6 Text-content-sha1: d7cacad5cb6d8fee8cb09806a8ec07df62dfc45f Content-length: 248 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN9p4_4]\pfd->listbox->listbox.ncols = 2; pfd->listbox->listbox.percentages = smalloc(2*sizeof(int)); pfd->listbox->listbox.percentages[0] = 20; pfd->listbox->listbox.percentages[1] = 80 Revision-number: 2938 Prop-content-length: 413 Content-length: 413 K 8 svn:date V 27 2003-03-15T15:50:42.000000Z K 7 svn:log V 312 Event handling in the GTK dialog engine is now basically present and correct. All the callbacks are getting called, all the dialog actions are working (the port forwarding, colour and charclass configurers are all completely functional), file, font and colour selectors happen, and it's all looking pretty cool. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 682184c16521942582c1fea653df7922 Text-delta-base-sha1: dce21b71251c54a474150f299e28261ee7f15d17 Text-content-length: 28198 Text-content-md5: 85231973c23c25babd627796e8b7a000 Text-content-sha1: e0b409d51bca65eb666b08b2f95661acdcb4b4ed Content-length: 28237 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNjC/g_ primary as the right widget to * forcibly focus? * * - dlg_error_msg * * - must return a value from the dialog box! * * - font selection hiccup: the default `fixed' is not * automatically translated into its expanded XLFD form when the * font selector is started. It should be.#include "tree234.h" struct uctrl { union control *ctrl; GtkWidget *toplevel; void *privdata; int privdata_needs_free; GtkWidget **buttons; int nbuttons; /* for radio buttons */ GtkWidget *entry; /* for editbox, combobox, filesel, fontsel */ GtkWidget *list; /* for combobox, listbox */ GtkWidget *menu; /* for optionmenu (==droplist) */ GtkWidget *optmenu; /* also for optionmenu */ GtkWidget *text; /* for text */ }; struct dlgparam { tree234 *byctrl, *bywidget; void *data; struct { unsigned char r, g, b, ok; } coloursel_result; /* 0-255 */ /* `flags' are set to indicate when a GTK signal handler is being called * due to automatic processing and should not flag a user event. */ int flags; }; #define FLAG_UPDATING_COMBO_LIST 1 /* * Forward references. */ static void listitem_button(GtkWidget *item, GdkEventButton *event, gpointer data); static void menuitem_activate(GtkMenuItem *item, gpointer data); static void coloursel_ok(GtkButton *button, gpointer data); static void coloursel_cancel(GtkButton *button, gpointer data); static int uctrl_cmp_byctrl(void *av, void *bv) { struct uctrl *a = (struct uctrl *)av; struct uctrl *b = (struct uctrl *)bv; if (a->ctrl < b->ctrl) return -1; else if (a->ctrl > b->ctrl) return +1; return 0; } static int uctrl_cmp_byctrl_find(void *av, void *bv) { union control *a = (union control *)av; struct uctrl *b = (struct uctrl *)bv; if (a < b->ctrl) return -1; else if (a > b->ctrl) return +1; return 0; } static int uctrl_cmp_bywidget(void *av, void *bv) { struct uctrl *a = (struct uctrl *)av; struct uctrl *b = (struct uctrl *)bv; if (a->toplevel < b->toplevel) return -1; else if (a->toplevel > b->toplevel) return +1; return 0; } static int uctrl_cmp_bywidget_find(void *av, void *bv) { GtkWidget *a = (GtkWidget *)av; struct uctrl *b = (struct uctrl *)bv; if (a < b->toplevel) return -1; else if (a > b->toplevel) return +1; return 0; } static void dlg_init(struct dlgparam *dp) { dp->byctrl = newtree234(uctrl_cmp_byctrl); dp->bywidget = newtree234(uctrl_cmp_bywidget); dp->coloursel_result.ok = FALSE; } static void dlg_cleanup(struct dlgparam *dp) { struct uctrl *uc; freetree234(dp->byctrl); /* doesn't free the uctrls inside */ while ( (uc = index234(dp->bywidget, 0)) != NULL) { del234(dp->bywidget, uc); if (uc->privdata_needs_free) sfree(uc->privdata); sfree(uc->buttons); sfree(uc); } freetree234(dp->bywidget); } static void dlg_add_uctrl(struct dlgparam *dp, struct uctrl *uc) { add234(dp->byctrl, uc); add234(dp->bywidget, uc); } static struct uctrl *dlg_find_byctrl(struct dlgparam *dp, union control *ctrl) { return find234(dp->byctrl, ctrl, uctrl_cmp_byctrl_find); } static struct uctrl *dlg_find_bywidget(struct dlgparam *dp, GtkWidget *w) { struct uctrl *ret = NULL; do { ret = find234(dp->bywidget, w, uctrl_cmp_bywidget_find); if (ret) return ret; w = w->parent; } while (w); return ret; } void *dlg_get_privdata(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); return uc->privdata; } void dlg_set_privdata(union control *ctrl, void *dlg, void *ptr) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); uc->privdata = ptr; uc->privdata_needs_free = FALSE; } void *dlg_alloc_privdata(union control *ctrl, void *dlg, size_t size) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); uc->privdata = smalloc(size); uc->privdata_needs_free = FALSE; return uc->privdata; } union control *dlg_last_focused(void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg;) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_RADIO); assert(uc->buttons != NULL); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(uc->buttons[which]), TRUE); } int dlg_radiobutton_get(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); int i; assert(uc->ctrl->generic.type == CTRL_RADIO); assert(uc->buttons != NULL); for (i = 0; i < uc->nbuttons; i++) if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(uc->buttons[i]))) return i; return 0; /* got to return something */ } void dlg_checkbox_set(union control *ctrl, void *dlg, int checked) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_CHECKBOX); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(uc->toplevel), checked); } int dlg_checkbox_get(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_CHECKBOX); return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(uc->toplevel)); } void dlg_editbox_set(union control *ctrl, void *dlg, char const *text) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_EDITBOX); assert(uc->entry != NULL); gtk_entry_set_text(GTK_ENTRY(uc->entry), text); } void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_EDITBOX); assert(uc->entry != NULL); strncpy(buffer, gtk_entry_get_text(GTK_ENTRY(uc->entry)), length); buffer[length-1] = '\0'; } static void container_remove_and_destroy(GtkWidget *w, gpointer data) { GtkContainer *cont = GTK_CONTAINER(data); /* gtk_container_remove will unref the widget for us; we need not. */ gtk_container_remove(cont, w);struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); GtkContainer *cont; assert(uc->ctrl->generic.type == CTRL_EDITBOX || uc->ctrl->generic.type == CTRL_LISTBOX); assert(uc->menu != NULL || uc->list != NULL); cont = (uc->menu ? GTK_CONTAINER(uc->menu) : GTK_CONTAINER(uc->list)); gtk_container_foreach(cont, container_remove_and_destroy, cont); } void dlg_listbox_del(union control *ctrl, void *dlg, int index) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_EDITBOX || uc->ctrl->generic.type == CTRL_LISTBOX); assert(uc->menu != NULL || uc->list != NULL); if (uc->menu) { gtk_container_remove (GTK_CONTAINER(uc->menu), g_list_nth_data(GTK_MENU_SHELL(uc->menu)->children, index)); } else { gtk_list_clear_items(GTK_LIST(uc->list), index, index+1); } } void dlg_listbox_add(union control *ctrl, void *dlg, char const *text) { dlg_listbox_addwithindex(ctrl, dlg, text, 0);struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_EDITBOX || uc->ctrl->generic.type == CTRL_LISTBOX); assert(uc->menu != NULL || uc->list != NULL); dp->flags |= FLAG_UPDATING_COMBO_LIST; if (uc->menu) { /* * List item in a drop-down (but non-combo) list. Tabs are * ignored; we just provide a standard menu item with the * text. */ GtkWidget *menuitem = gtk_menu_item_new_with_label(text); gtk_container_add(GTK_CONTAINER(uc->menu), menuitem); gtk_widget_show(menuitem); gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", (gpointer)id); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(menuitem_activate), dp); } else if (!uc->entry) { /* * List item in a non-combo-box list box. We make all of * these Columns containing GtkLabels. This allows us to do * the nasty force_left hack irrespective of whether there * are tabs in the thing. */ GtkWidget *listitem = gtk_list_item_new(); GtkWidget *cols = columns_new(0); gint *percents; int i, ncols; /* Count the tabs in the text, and hence determine # of columns. */ ncols = 1; for (i = 0; text[i]; i++) if (text[i] == '\t') ncols++; assert(ncols <= (uc->ctrl->listbox.ncols ? uc->ctrl->listbox.ncols : 1)); percents = smalloc(ncols * sizeof(gint)); percents[ncols-1] = 100; for (i = 0; i < ncols-1; i++) { percents[i] = uc->ctrl->listbox.percentages[i]; percents[ncols-1] -= percents[i]; } columns_set_cols(COLUMNS(cols), ncols, percents); sfree(percents); for (i = 0; i < ncols; i++) { int len = strcspn(text, "\t"); char *dup = dupprintf("%.*s", len, text); GtkWidget *label; text += len; if (*text) text++; label = gtk_label_new(dup); sfree(dup); columns_add(COLUMNS(cols), label, i, 1); columns_force_left_align(COLUMNS(cols), label); gtk_widget_show(label); } gtk_container_add(GTK_CONTAINER(listitem), cols); gtk_widget_show(cols); gtk_container_add(GTK_CONTAINER(uc->list), listitem); gtk_widget_show(listitem); gtk_signal_connect(GTK_OBJECT(listitem), "button_press_event", GTK_SIGNAL_FUNC(listitem_button), dp); gtk_object_set_data(GTK_OBJECT(listitem), "user-data", (gpointer)id); } else { /* * List item in a combo-box list, which means the sensible * thing to do is make it a perfectly normal label. Hence * tabs are disregarded. */ GtkWidget *listitem = gtk_list_item_new_with_label(text); gtk_container_add(GTK_CONTAINER(uc->list), listitem); gtk_widget_show(listitem); gtk_object_set_data(GTK_OBJECT(listitem), "user-data", (gpointer)id); } dp->flags &= ~FLAG_UPDATING_COMBO_LIST; } int dlg_listbox_getid(union control *ctrl, void *dlg, int index) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); GList *children; GtkObject *item; assert(uc->ctrl->generic.type == CTRL_EDITBOX || uc->ctrl->generic.type == CTRL_LISTBOX); assert(uc->menu != NULL || uc->list != NULL); children = gtk_container_children(GTK_CONTAINER(uc->menu ? uc->menu : uc->list)); item = GTK_OBJECT(g_list_nth_data(children, index)); return (int)gtk_object_get_data(GTK_OBJECT(item), "user-data");struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); GList *children; GtkWidget *item, *activeitem; int i; int selected = -1; assert(uc->ctrl->generic.type == CTRL_EDITBOX || uc->ctrl->generic.type == CTRL_LISTBOX); assert(uc->menu != NULL || uc->list != NULL); if (uc->menu) activeitem = gtk_menu_get_active(GTK_MENU(uc->menu)); children = gtk_container_children(GTK_CONTAINER(uc->menu ? uc->menu : uc->list)); for (i = 0; children!=NULL && (item = GTK_WIDGET(children->data))!=NULL; i++, children = children->next) { if (uc->menu ? activeitem == item : GTK_WIDGET_STATE(item) == GTK_STATE_SELECTED) { if (selected < 0) selected = i; else return -1; } } return selected; } int dlg_listbox_issel(union control *ctrl, void *dlg, int index) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); GList *children; GtkWidget *item, *activeitem; assert(uc->ctrl->generic.type == CTRL_EDITBOX || uc->ctrl->generic.type == CTRL_LISTBOX); assert(uc->menu != NULL || uc->list != NULL); children = gtk_container_children(GTK_CONTAINER(uc->menu ? uc->menu : uc->list)); item = GTK_WIDGET(g_list_nth_data(children, index)); if (uc->menu) { activeitem = gtk_menu_get_active(GTK_MENU(uc->menu)); return item == activeitem; } else { return GTK_WIDGET_STATE(item) == GTK_STATE_SELECTED; }struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_EDITBOX || uc->ctrl->generic.type == CTRL_LISTBOX); assert(uc->optmenu != NULL || uc->list != NULL); if (uc->optmenu) { gtk_option_menu_set_history(GTK_OPTION_MENU(uc->optmenu), index); } else { gtk_list_select_item(GTK_LIST(uc->list), index); } } void dlg_text_set(union control *ctrl, void *dlg, char const *text) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_TEXT); assert(uc->text != NULL); gtk_label_set_text(GTK_LABEL(uc->text), text); } void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_FILESELECT); assert(uc->entry != NULL); gtk_entry_set_text(GTK_ENTRY(uc->entry), fn.path); } void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_FILESELECT); assert(uc->entry != NULL); strncpy(fn->path, gtk_entry_get_text(GTK_ENTRY(uc->entry)), lenof(fn->path)); fn->path[lenof(fn->path)-1] = '\0'; } void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec fs) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_FONTSELECT); assert(uc->entry != NULL); gtk_entry_set_text(GTK_ENTRY(uc->entry), fs.name); } void dlg_fontsel_get(union control *ctrl, void *dlg, FontSpec *fs) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); assert(uc->ctrl->generic.type == CTRL_FONTSELECT); assert(uc->entry != NULL); strncpy(fs->name, gtk_entry_get_text(GTK_ENTRY(uc->entry)), lenof(fs->name)); fs->name[lenof(fs->name)-1] = '\0'; * Apparently we can't do this at all in GTK. GtkCList supports * freeze and thaw, but not GtkList. Bah. */ } void dlg_update_done(union control *ctrl, void *dlg) { /* * Apparently we can't do this at all in GTK. GtkCList supports * freeze and thaw, but not GtkList. Bah. */ } void dlg_set_focus(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg;gdk_beep(); } void dlg_error_msg(void *dlg, char *msg) { struct dlgparam *dp = (struct dlgparam *)dlg;struct dlgparam *dp = (struct dlgparam *)dlg; gtk_main_quit(); /* FIXME: don't forget to faff about with returning a value */ } void dlg_refresh(union control *ctrl, void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc; if (ctrl) { if (ctrl->generic.handler != NULL) ctrl->generic.handler(ctrl, dp, dp->data, EVENT_REFRESH); } else { int i; for (i = 0; (uc = index234(dp->byctrl, i)) != NULL; i++) { assert(uc->ctrl != NULL); if (uc->ctrl->generic.handler != NULL) uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_REFRESH); } }struct dlgparam *dp = (struct dlgparam *)dlg; struct uctrl *uc = dlg_find_byctrl(dp, ctrl); gdouble cvals[4]; GtkWidget *coloursel = gtk_color_selection_dialog_new("Select a colour"); GtkColorSelectionDialog *ccs = GTK_COLOR_SELECTION_DIALOG(coloursel); dp->coloursel_result.ok = FALSE; gtk_window_set_modal(GTK_WINDOW(coloursel), TRUE); gtk_color_selection_set_opacity(GTK_COLOR_SELECTION(ccs->colorsel), FALSE); cvals[0] = r / 255.0; cvals[1] = g / 255.0; cvals[2] = b / 255.0; cvals[3] = 1.0; /* fully opaque! */ gtk_color_selection_set_color(GTK_COLOR_SELECTION(ccs->colorsel), cvals); gtk_object_set_data(GTK_OBJECT(ccs->ok_button), "user-data", (gpointer)coloursel); gtk_object_set_data(GTK_OBJECT(ccs->cancel_button), "user-data", (gpointer)coloursel); gtk_object_set_data(GTK_OBJECT(coloursel), "user-data", (gpointer)uc); gtk_signal_connect(GTK_OBJECT(ccs->ok_button), "clicked", GTK_SIGNAL_FUNC(coloursel_ok), (gpointer)dp); gtk_signal_connect(GTK_OBJECT(ccs->cancel_button), "clicked", GTK_SIGNAL_FUNC(coloursel_cancel), (gpointer)dp); gtk_signal_connect_object(GTK_OBJECT(ccs->ok_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)coloursel); gtk_signal_connect_object(GTK_OBJECT(ccs->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)coloursel); gtk_widget_show(coloursel); } int dlg_coloursel_results(union control *ctrl, void *dlg, int *r, int *g, int *b) { struct dlgparam *dp = (struct dlgparam *)dlg; if (dp->coloursel_result.ok) { *r = dp->coloursel_result.r; *g = dp->coloursel_result.g; *b = dp->coloursel_result.b; return 1; } else return 0; } /* ---------------------------------------------------------------------- * Signal handlers while the dialog box is active. */ static void button_clicked(GtkButton *button, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(button)); uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_ACTION); } static void button_toggled(GtkToggleButton *tb, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(tb)); uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_VALCHANGE); } static void editbox_changed(GtkEditable *ed, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; if (!(dp->flags & FLAG_UPDATING_COMBO_LIST)) { struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(ed)); uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_VALCHANGE); } } static void editbox_lostfocus(GtkWidget *ed, GdkEventFocus *event, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(ed)); uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_REFRESH); } static void listitem_button(GtkWidget *item, GdkEventButton *event, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) { struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(item)); uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_ACTION); } } static void list_selchange(GtkList *list, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(list)); uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_SELCHANGE); } static void menuitem_activate(GtkMenuItem *item, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; GtkWidget *menushell = GTK_WIDGET(item)->parent; gpointer optmenu = gtk_object_get_data(GTK_OBJECT(menushell), "user-data"); struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(optmenu)); uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_SELCHANGE); } static void draglist_move(struct dlgparam *dp, struct uctrl *uc, int direction) { int index = dlg_listbox_index(uc->ctrl, dp); GList *children = gtk_container_children(GTK_CONTAINER(uc->list)); GtkWidget *child; if ((index < 0) || (index == 0 && direction < 0) || (index == g_list_length(children)-1 && direction > 0)) { gdk_beep(); return; } child = g_list_nth_data(children, index); gtk_widget_ref(child); gtk_list_clear_items(GTK_LIST(uc->list), index, index+1); children = NULL; children = g_list_append(children, child); gtk_list_insert_items(GTK_LIST(uc->list), children, index + direction); gtk_list_select_item(GTK_LIST(uc->list), index + direction); uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_VALCHANGE); } static void draglist_up(GtkButton *button, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(button)); draglist_move(dp, uc, -1); } static void draglist_down(GtkButton *button, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(button)); draglist_move(dp, uc, +1); } static void filesel_ok(GtkButton *button, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; gpointer filesel = gtk_object_get_data(GTK_OBJECT(button), "user-data"); struct uctrl *uc = gtk_object_get_data(GTK_OBJECT(filesel), "user-data"); char *name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(filesel)); gtk_entry_set_text(GTK_ENTRY(uc->entry), name); } static void fontsel_ok(GtkButton *button, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; gpointer fontsel = gtk_object_get_data(GTK_OBJECT(button), "user-data"); struct uctrl *uc = gtk_object_get_data(GTK_OBJECT(fontsel), "user-data"); char *name = gtk_font_selection_dialog_get_font_name (GTK_FONT_SELECTION_DIALOG(fontsel)); gtk_entry_set_text(GTK_ENTRY(uc->entry), name); } static void coloursel_ok(GtkButton *button, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; gpointer coloursel = gtk_object_get_data(GTK_OBJECT(button), "user-data"); struct uctrl *uc = gtk_object_get_data(GTK_OBJECT(coloursel), "user-data"); gdouble cvals[4]; gtk_color_selection_get_color (GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(coloursel)->colorsel), cvals); dp->coloursel_result.r = (int) (255 * cvals[0]); dp->coloursel_result.g = (int) (255 * cvals[1]); dp->coloursel_result.b = (int) (255 * cvals[2]); dp->coloursel_result.ok = TRUE; uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_CALLBACK); } static void coloursel_cancel(GtkButton *button, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; gpointer coloursel = gtk_object_get_data(GTK_OBJECT(button), "user-data"); struct uctrl *uc = gtk_object_get_data(GTK_OBJECT(coloursel), "user-data"); dp->coloursel_result.ok = FALSE; uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_CALLBACK); } static void filefont_clicked(GtkButton *button, gpointer data) { struct dlgparam *dp = (struct dlgparam *)data; struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(button)); if (uc->ctrl->generic.type == CTRL_FILESELECT) { GtkWidget *filesel = gtk_file_selection_new(uc->ctrl->fileselect.title); gtk_window_set_modal(GTK_WINDOW(filesel), TRUE); gtk_object_set_data (GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "user-data", (gpointer)filesel); gtk_object_set_data(GTK_OBJECT(filesel), "user-data", (gpointer)uc); gtk_signal_connect (GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked", GTK_SIGNAL_FUNC(filesel_ok), (gpointer)dp); gtk_signal_connect_object (GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)filesel); gtk_signal_connect_object (GTK_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)filesel); gtk_widget_show(filesel); } if (uc->ctrl->generic.type == CTRL_FONTSELECT) { gchar *spacings[] = { "c", "m", NULL }; GtkWidget *fontsel = gtk_font_selection_dialog_new("Select a font"); gtk_window_set_modal(GTK_WINDOW(fontsel), TRUE); gtk_font_selection_dialog_set_filter (GTK_FONT_SELECTION_DIALOG(fontsel), GTK_FONT_FILTER_BASE, GTK_FONT_ALL, NULL, NULL, NULL, NULL, spacings, NULL); gtk_font_selection_dialog_set_font_name (GTK_FONT_SELECTION_DIALOG(fontsel), gtk_entry_get_text(GTK_ENTRY(uc->entry))); gtk_object_set_data (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fontsel)->ok_button), "user-data", (gpointer)fontsel); gtk_object_set_data(GTK_OBJECT(fontsel), "user-data", (gpointer)uc); gtk_signal_connect (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fontsel)->ok_button), "clicked", GTK_SIGNAL_FUNC(fontsel_ok), (gpointer)dp); gtk_signal_connect_object (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fontsel)->ok_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)fontsel); gtk_signal_connect_object (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fontsel)->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)fontsel); gtk_widget_show(fontsel); } } /* ----------------------------------------------------------------------dlgparam *dp, struct controlset *s, struct uctrl uc; GtkWidget *w = NULL; uc.ctrl = ctrl; uc.privdata = NULL; uc.privdata_needs_free = FALSE; uc.buttons = NULL; uc.entry = uc.list = uc.menu = uc.optmenu = uc.text { struct uctrl *uc = dlg_find_byctrl(dp, ctrl->tabdelay.ctrl); if (uc) columns_taborder_last(cols, uc->toplevel); BUTTON: w = gtk_button_new_with_label(ctrl->generic.label); gtk_signal_connect(GTK_OBJECT(w), "clicked", GTK_SIGNAL_FUNC(button_clicked), dp gtk_signal_connect(GTK_OBJECT(w), "toggled", GTK_SIGNAL_FUNC(button_toggled), dp uc.nbuttons = ctrl->radio.nbuttons; uc.buttons = smalloc(uc.nbuttons * sizeof(GtkWidget *)); uc.buttons[i] = b gtk_signal_connect(GTK_OBJECT(b), "toggled", GTK_SIGNAL_FUNC(button_toggled), dp gtk_combo_set_value_in_list(GTK_COMBO(w), FALSE, TRUE); uc.entry = GTK_COMBO(w)->entry; uc.list = GTK_COMBO(w)->list uc.entry = w; } gtk_signal_connect(GTK_OBJECT(uc.entry), "changed", GTK_SIGNAL_FUNC(editbox_changed), dp); gtk_signal_connect(GTK_OBJECT(uc.entry), "focus_out_event", GTK_SIGNAL_FUNC(editbox_lostfocus), dp);uc.entry = gtk_signal_connect(GTK_OBJECT(uc.entry), "changed", GTK_SIGNAL_FUNC(editbox_changed), dp); gtk_signal_connect(GTK_OBJECT(ww), "clicked", GTK_SIGNAL_FUNC(filefont_clicked), dpuc.optmenu = w = gtk_option_menu_new(); uc.menu = gtk_menu_new(); gtk_option_menu_set_menu(GTK_OPTION_MENU(w), uc.menu); gtk_object_set_data(GTK_OBJECT(uc.menu), "user-data", (gpointer)uc.optmenu); } else { uc.list = gtk_list_new(); gtk_list_set_selection_mode(GTK_LIST(uc.uc.uc.list); gtk_signal_connect(GTK_OBJECT(uc.list), "selection-changed", GTK_SIGNAL_FUNC(list_selchange), dpuc. gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(draglist_up), dp gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(draglist_down), dpuc.text = struct uctrl *ucptr; ucptr = smalloc(sizeof(struct uctrl)); *ucptr = uc; /* structure copy */ ucptr->toplevel = w; dlg_add_uctrl(dp, ucptr struct dlgparam dp; struct sesslist sldlg_init(&dpsl.nsessions = 0; ctrlbox = ctrl_new_box(); setup_config_box(ctrlbox, &sl&dp, dp.data = &cfg; dlg_refresh(NULL, &dp);dlg_cleanup(&dp);if (!strcmp(name, "Font")) strcpy(ret.name, "fixed"); else if (!strcmp(name, "LogFileName")) strcpy(ret.path, "putty.log"); else Revision-number: 2939 Prop-content-length: 197 Content-length: 197 K 8 svn:date V 27 2003-03-15T15:55:03.000000Z K 7 svn:log V 97 The Telnet ENVIRON configurer also had a list box with an implicit tab stop. Fixed this one too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 926d5308d4b3bc67f0fb3e3ea2103be6 Text-delta-base-sha1: d7cacad5cb6d8fee8cb09806a8ec07df62dfc45f Text-content-length: 220 Text-content-md5: c4cb73af489b088545f97b0efdb34101 Text-content-sha1: a1d7f5644a9b11d11c18a517fac5ad93202444ff Content-length: 260 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNp3@j@ g ed->listbox->listbox.ncols = 2; ed->listbox->listbox.percentages = smalloc(2*sizeof(int)); ed->listbox->listbox.percentages[0] = 30; ed->listbox->listbox.percentages[1] = 70 Revision-number: 2940 Prop-content-length: 345 Content-length: 345 K 7 svn:log V 244 When a piece of text overflows its column in a tabbed list box, I think on balance I rather like the natural behaviour of the way I've done it, except that non-zero separation between the columns would be even nicer. Accordingly, here is some. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-15T15:56:51.000000Z PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 85231973c23c25babd627796e8b7a000 Text-delta-base-sha1: e0b409d51bca65eb666b08b2f95661acdcb4b4ed Text-content-length: 25 Text-content-md5: d9e65afef77a32edd26500038d04eebf Text-content-sha1: d1b6d80b201a0aeb1e72ecafeef6a47f9c4d89fc Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNCD **1 Revision-number: 2941 Prop-content-length: 421 Content-length: 421 K 8 svn:date V 27 2003-03-15T17:51:05.000000Z K 7 svn:log V 320 Implement RSA blinding, to defeat Brumley and Boneh's RSA timing attacks. In the PuTTY suite I'm pretty sure they're only applicable to a forwarded Pageant, and if your remote sysadmin is abusing your Pageant then you're shafted _anyway_; but it can't hurt to take precautions now, just in case things change in future. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7487234d79ab4815c1eab4586bfcc26c Text-delta-base-sha1: b2f3e083b8fc2e3c73b7855e8b9ebfd8ee901f9c Text-content-length: 2911 Text-content-md5: 8a6372ade77c48a83c4d3bf8022c1913 Text-content-sha1: 398de4d324b4134504480627d4c61131d669ea6f Content-length: 2951 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNT?=!JE=/* * RSA implementation for PuTTY/* * This function is a wrapper on modpow(). It has the same effect * as modpow(), but employs RSA blinding to protect against timing * attacks. */ static Bignum rsa_privkey_op(Bignum input, struct RSAKey *key) { Bignum random, random_encrypted, random_inverse; Bignum input_blinded, ret_blinded; Bignum ret; /* * Start by inventing a random number chosen uniformly from the * range 2..modulus-1. (We do this by preparing a random number * of the right length and retrying if it's greater than the * modulus, to prevent any potential Bleichenbacher-like * attacks making use of the uneven distribution within the * range that would arise from just reducing our number mod n. * There are timing implications to the potential retries, of * course, but all they tell you is the modulus, which you * already knew.) */ while (1) { int bits, byte, bitsleft, v; random = copybn(key->modulus); /* * Find the topmost set bit. (This function will return its * index plus one.) Then we'll set all bits from that one * downwards randomly. */ bits = bignum_bitcount(random); byte = 0; bitsleft = 0; while (bits--) { if (bitsleft <= 0) bitsleft = 8, byte = random_byte(); v = byte & 1; byte >>= 1; bitsleft--; bignum_set_bit(random, bits, v); } /* * Now check that this number is strictly greater than * zero, and strictly less than modulus. */ if (bignum_cmp(random, Zero) <= 0 || bignum_cmp(random, key->modulus) >= 0) { freebn(random); continue; } else { break; } } /* * RSA blinding relies on the fact that (xy)^d mod n is equal * to (x^d mod n) * (y^d mod n) mod n. We invent a random pair * y and y^d; then we multiply x by y, raise to the power e mod * n as usual, and divide by y^d to recover x^d. Thus the * timing of the modpow does not reveal information about x, * but only about xy, which is unpredictable to an attacker. * * The clever bit is that we don't have to do a huge modpow to * get y and y^d; we will use the number we just invented as * _y^d_, and use the RSA public exponent to compute y from it, * which is much faster. */ random_encrypted = modpow(random, key->exponent, key->modulus); random_inverse = modinv(random, key->modulus); input_blinded = modmul(input, random_encrypted, key->modulus); ret_blinded = modpow(input_blinded, key->private_exponent, key->modulus); ret = modmul(ret_blinded, random_inverse, key->modulus); freebn(ret_blinded); freebn(input_blinded); freebn(random_inverse); freebn(random_encrypted); freebn(random); return ret; } Bignum rsadecrypt(Bignum input, struct RSAKey *key) { return rsa_privkey_op(input, key)rsa_privkey_op(in, rsa Revision-number: 2942 Prop-content-length: 204 Content-length: 204 K 7 svn:log V 103 My comment about RSA blinding was talking slight tosh. Fixed in case anyone ever actually reads it :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-15T18:39:10.000000Z PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8a6372ade77c48a83c4d3bf8022c1913 Text-delta-base-sha1: 398de4d324b4134504480627d4c61131d669ea6f Text-content-length: 355 Text-content-md5: cbf7050b4aa054327884b4da2be507df Text-content-sha1: dcbd88a839c78444402ecd3d433cf5e222c6e107 Content-length: 395 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN?xBVo(S8d mod * n as usual, and divide by y^d to recover x^d. Thus an * attacker can't correlate the timing of the modpow with the * input, because they don't know anything about the number * that was input to the actual modpow_public_ exponent to compute (y^d)^e = y * from it, which is much faster to do Revision-number: 2943 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2003-03-16T12:36:33.000000Z K 7 svn:log V 104 Fixed accelerator clash in the Unix-specific config, since gtkdlg.c is now competent to detect them :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9d3d63586eadb120beeee698cb0e502f Text-delta-base-sha1: e5996727c782ebbed01939ab9bfb82e9fa6474aa Text-content-length: 22 Text-content-md5: 636d78399efd48ef4b876ec16d4d6ddf Text-content-sha1: 442dcaada7fb4a839ecafbc37d7c37b413c3a923 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNKK  > f Revision-number: 2944 Prop-content-length: 295 Content-length: 295 K 8 svn:date V 27 2003-03-16T12:37:48.000000Z K 7 svn:log V 194 Further work on the GTK config box; mostly implemented keyboard shortcuts now (only treeviews and list boxes to go, which currently do very weird things and I need to overhaul them completely). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d9e65afef77a32edd26500038d04eebf Text-delta-base-sha1: d1b6d80b201a0aeb1e72ecafeef6a47f9c4d89fc Text-content-length: 10643 Text-content-md5: 0895fdda789ba00ae8c1e2ccda2b43db Text-content-sha1: 3476400cfb097828cb5568e13dbbb9fab26047b7 Content-length: 10682 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVND,X,i\uOs>KMx~<&?Z0cDhK #include #include #include keyval == GDK_Return && widget->parent != NULL) { gint return_val; gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event"); gtk_signal_emit_by_name(GTK_OBJECT(widget->parent), "key_press_event", event, &return_val); return return_val; } return FALSE * `listitemheight' is used to calculate a usize for list boxes: it * should be the height from the size request of a GtkListItem. * * `win' is required for setting the default button. If it is * non-NULL, all buttons created will be default-capable (so they * have extra space round them for the default highlight). */ GtkWidget *layout_ctrls(struct dlgparam *dp, struct Shortcuts *scs, struct controlset *s, int listitemheight, GtkWindow *win*uc; int left = FALSE; GtkWidget *w } uc = smalloc(sizeof(struct uctrl)); uc->ctrl = ctrl; uc->privdata = NULL; uc->privdata_needs_free = FALSE; uc->buttons = NULL; uc->entry = uc->list = uc->menu = NULL; uc->button = uc->optmenu = uc->if (win) { GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT); if (ctrl->button.isdefault) gtk_window_set_default(win, w); } shortcut_add(scs, GTK_BIN(w)->child, ctrl->button.shortcut, SHORTCUT_UCTRL, uc shortcut_add(scs, GTK_BIN(w)->child, ctrl->checkbox.shortcut, SHORTCUT_UCTRL, uc); left = TRUE shortcut_add(scs, label, ctrl->radio.shortcut, SHORTCUT_UCTRL, uc->nbuttons = ctrl->radio.nbuttons; uc->buttons = smalloc(uc->-> columns_force_left_align(COLUMNS(w), b if (ctrl->radio.shortcuts) { shortcut_add(scs, GTK_BIN(b)->child, ctrl->radio.shortcuts[i], SHORTCUT_UCTRL, uc); }->entry = GTK_COMBO(w)->entry; uc->->entry = w; } gtk_signal_connect(GTK_OBJECT(uc->entry), "changed", GTK_SIGNAL_FUNC(editbox_changed), dp); gtk_signal_connect(GTK_OBJECT(uc->entry), "key_press_event", GTK_SIGNAL_FUNC(editbox_key shortcut_add(scs, label, ctrl->editbox.shortcut, SHORTCUT_FOCUS, uc->entry-> shortcut_add(scs, ww, (ctrl->generic.type == CTRL_FILESELECT ? ctrl->fileselect.shortcut : ctrl->fontselect.shortcut), SHORTCUT_UCTRL, uc); } uc->uc->button =->entry), "key_press_event", GTK_SIGNAL_FUNC(editbox_key), dp); gtk_signal_connect(GTK_OBJECT(uc->->optmenu = w = gtk_option_menu_new(); uc->menu = gtk_menu_new(); gtk_option_menu_set_menu(GTK_OPTION_MENU(w), uc->menu); gtk_object_set_data(GTK_OBJECT(uc->menu), "user-data", (gpointer)uc->optmenu); } else { uc->list = gtk_list_new(); gtk_list_set_selection_mode(GTK_LIST(uc->->->list); gtk_signal_connect(GTK_OBJECT(uc->-> shortcut_add(scs, label, ctrl->listbox.shortcut, SHORTCUT_UCTRL, uc);-> assert(w != NULL); columns_add(cols, w, COLUMN_START(ctrl->generic.column), COLUMN_SPAN(ctrl->generic.column)); if (left) columns_force_left_align(cols, w); gtk_widget_show(w); uc->toplevel = w; dlg_add_uctrl(dp, uc); } return ret; } struct selparam { struct dlgparam *dp; Panels *panels; GtkWidget *panel, *treeitem; struct Shortcuts shortcuts sp->dp->shortcuts = &sp->shortcuts; } void destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } int win_key_press(GtkWidget *widget, GdkEventKey *even if (event->keyval == GDK_Escape) { gtk_main_quit(); return TRUE; } if ((event->state & GDK_MOD1_MASK) && (unsigned char)event->string[0] > 0 && (unsigned char)event->string[0] <= 127) { int schr = (unsigned char)event->string[0]; struct Shortcut *sc = &dp->shortcuts->sc[schr]; switch (sc->action) { case SHORTCUT_FOCUS: gtk_widget_grab_focus(sc->widget); break; case SHORTCUT_UCTRL: /* * We must do something sensible with a uctrl. * Precisely what this is depends on the type of * control. */ switch (sc->uc->ctrl->generic.type) { case CTRL_CHECKBOX: case CTRL_BUTTON: /* Check boxes and buttons get the focus _and_ get toggled. */ gtk_widget_grab_focus(sc->uc->toplevel); gtk_signal_emit_by_name(GTK_OBJECT(sc->uc->toplevel), "clicked"); break; case CTRL_FILESELECT: case CTRL_FONTSELECT: /* File/font selectors have their buttons pressed (ooer), * and focus transferred to the edit box. */ gtk_signal_emit_by_name(GTK_OBJECT(sc->uc->button), "clicked"); gtk_widget_grab_focus(sc->uc->entry); break; case CTRL_RADIO: /* * Radio buttons are fun, because they have * multiple shortcuts. We must find whether the * activated shortcut is the shortcut for the whole * group, or for a particular button. In the former * case, we find the currently selected button and * focus it; in the latter, we focus-and-click the * button whose shortcut was pressed. */ if (schr == sc->uc->ctrl->radio.shortcut) { int i; for (i = 0; i < sc->uc->ctrl->radio.nbuttons; i++) if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(sc->uc->buttons[i]))) { gtk_widget_grab_focus(sc->uc->buttons[i]); } } else if (sc->uc->ctrl->radio.shortcuts) { int i; for (i = 0; i < sc->uc->ctrl->radio.nbuttons; i++) if (schr == sc->uc->ctrl->radio.shortcuts[i]) { gtk_widget_grab_focus(sc->uc->buttons[i]); gtk_signal_emit_by_name (GTK_OBJECT(sc->uc->buttons[i]), "clicked"); } } break; case CTRL_LISTBOX: /* * List boxes are fun too. If the list is really an * option menu, we simply focus and click it. * Otherwise we must do something clever (FIXME). */ if (sc->uc->optmenu) { GdkEventButton bev; gint returnval; gtk_widget_grab_focus(sc->uc->optmenu); /* Option menus don't work using the "clicked" signal. * We need to manufacture a button press event :-/ */ bev.type = GDK_BUTTON_PRESS; bev.button = 1; gtk_signal_emit_by_name(GTK_OBJECT(sc->uc->optmenu), "button_press_event", &bev, &returnval); } else { } break; } break; } } return FALSE; } void shortcut_add(struct Shortcuts *scs, GtkWidget *labelw, int chr, int action, void *ptr) { GtkLabel *label = GTK_LABEL(labelw); gchar *currstr, *pattern; int i; if (chr == NO_SHORTCUT) return; chr = tolower((unsigned char)chr); assert(scs->sc[chr].action == SHORTCUT_EMPTY); scs->sc[chr].action = action; if (action == SHORTCUT_FOCUS) { scs->sc[chr].uc = NULL; scs->sc[chr].widget = (GtkWidget *)ptr; } else { scs->sc[chr].widget = NULL; scs->sc[chr].uc = (struct uctrl *)ptr; } gtk_label_get(label, &currstr); for (i = 0; currstr[i]; i++) if (tolower((unsigned char)currstr[i]) == chr) { GtkRequisition req; pattern = dupprintf("%*s_", i, ""); gtk_widget_size_request(GTK_WIDGET(label), &req); gtk_label_set_pattern(label, pattern); gtk_widget_set_usize(GTK_WIDGET(label), -1, req.height); sfree(pattern); break; } struct Shortcuts scsfor (index = 0; index < lenof(scs.sc); index++) { scs.sc[index].action = SHORTCUT_EMPTY; }/* FIXME: focusing treescroll doesn't help */ shortcut_add(&scs, label, 'g', SHORTCUT_FOCUS, tree; if (!*s->pathname) { w = layout_ctrls(&dp, &scs, s, listitemheight, GTK_WINDOW(window));dp = &dp;shortcuts = scs; /* structure copy */ selparams[nselparams].treeitem = treeitem; nselparams++; } w = layout_ctrls(&dp, &selparams[nselparams-1].shortcuts, s, listitemheight, NULL);dp.shortcuts = &selparams[0].shortcuts gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(win_key_press), &dp Revision-number: 2945 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2003-03-16T13:28:48.000000Z K 7 svn:log V 110 RSA blinding requires random numbers. Hence, Pageant now needs to have the random number generator linked in. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 34386e65b959d8aad445e86c319a85b8 Text-delta-base-sha1: a3a6e1c9d729a03636cbedb1577393ae254d5c29 Text-content-length: 44 Text-content-md5: 62955873cc5b61fb565475fb237425a5 Text-content-sha1: cb46ab3e9aea8a7684cbdb55fa6a6bc8ec30ed2a Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN& l#msshrand noise winstore Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e9e0d2f18f2a3db78919be21179e6d66 Text-delta-base-sha1: 92bbd92178023c7ba063eff0b71360608f97bc55 Text-content-length: 85 Text-content-md5: a3019efd95f338f5035c62e84a9344ff Text-content-sha1: 4f67e34f6e2092e078acc36aff7ec7941ad396e8 Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNPD7siQ1the random number generator. */ random_init(); Revision-number: 2946 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:00.729763Z PROPS-END Revision-number: 2947 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:00.738597Z PROPS-END Revision-number: 2948 Prop-content-length: 104 Content-length: 104 K 7 svn:log V 5 typo K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-03-16T20:18:11.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 62955873cc5b61fb565475fb237425a5 Text-delta-base-sha1: cb46ab3e9aea8a7684cbdb55fa6a6bc8ec30ed2a Text-content-length: 22 Text-content-md5: 5878c0d43a9d2d9d79a6284c0fbe543d Text-content-sha1: e5c047a1c07f57185e553ed37bfccb5c4223f5c4 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN&' #p Revision-number: 2949 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2003-03-17T10:48:45.000000Z K 7 svn:log V 19 Add www.bfteam.com K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f7945f1f7d41405b8d9786ba66f36bb1 Text-delta-base-sha1: 65a53b55d9dc9193c35d3dff5bcb5c168288221a Text-content-length: 71 Text-content-md5: 197e65c24aee0dfdc5862b028cb2ec5a Text-content-sha1: a3bebca4b264679d0fd9d3a286b6a071476cbe0c Content-length: 111 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN 27}www.bfteam.com/putty">www.bfteam.com in Turkey Revision-number: 2950 Prop-content-length: 373 Content-length: 373 K 8 svn:date V 27 2003-03-17T16:57:23.000000Z K 7 svn:log V 272 Error messages update. It's now abundantly clear that WSAECONNABORTED is not the same thing as ECONNABORTED, so I've removed the `we're a bit confused about this, send us details' text. And someone has just been confused by `connection timed out', so I've added that too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 88fdf4d0e6de604bd855bade3adec526 Text-delta-base-sha1: f0d2b61e8217af7837959709278c3cf043fdd481 Text-content-length: 1020 Text-content-md5: f16043b2ffa1cdcf32ccfb5c5b79fce0 Text-content-sha1: 0098caf075791d1aa4d17d49018a0b3d4a95f4af Content-length: 1059 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN$`7_@\H\versionid $Id: errors.but,v 1.5 2003/03/17 16:57:23 simoThis error occurs when the Windows network code decides that your network connection is dead. For example, it will happen if you pull the network cable out of the back of an Ethernet-connected computer, or if Windows has any other similar reason to believe the entire network has become unreachable. We are not aware of any reason why this error might occur that would represent a bug in PuTTY. The problem is between you, your Windows system, your network and the remote system \H{errors-connrefused} \q{Network error: Connection timed out} This error means that the network connection PuTTY tried to make to your server received no response at all from the server. Usually this happens because the server machine is completely isolated from the network, or because it is turned off. Check that you have correctly entered the host name or IP address of your server machine. If that fails, consult the administrator of your server. Revision-number: 2951 Prop-content-length: 212 Content-length: 212 K 7 svn:log V 113 When running on a system with Aqua menu layout, delete the separator line above "Quit" as well as "Quit" itself. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-17T19:00:36.000000Z PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3123edd934ca275715edd3d594115174 Text-delta-base-sha1: 0e6cac5a7ab69efb8d5df3c79e5654d106d78962 Text-content-length: 225 Text-content-md5: b3249989692e557eecbeb838ce28aa9a Text-content-sha1: 3d92cb44ae38092b8de9847ced95cb616d39734e Content-length: 265 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVNRB FK(1!/* $Id: mac.c,v 1.55 2003/03/17 19:00:36 { DeleteMenuItem(GetMenuHandle(mFile), iQuit); /* Also delete the separator above the Quit item. */ DeleteMenuItem(GetMenuHandle(mFile), iQuit - 1); } Revision-number: 2952 Prop-content-length: 249 Content-length: 249 K 8 svn:date V 27 2003-03-17T21:36:13.000000Z K 7 svn:log V 150 If I() and S() aren't inline, provide a prototype even if we're defining them. This is useful for compilers that warn about un-prototyped functions. K 10 svn:author V 3 ben PROPS-END Node-path: putty/dialog.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 950aa67020e1b40cfef6987fd53fe0f2 Text-delta-base-sha1: b8e6597512de6cfc78e110a4f7f6c3a7b08b789c Text-content-length: 87 Text-content-md5: 60d0b0ac4fad5f6ffe2c68ff08a167bb Text-content-sha1: d3285abde2e26a1e46d9386b481c78916890fa01 Content-length: 126 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN:P Kndef INLINE intorptr I(int i); intorptr P(void *p); #endif Revision-number: 2953 Prop-content-length: 315 Content-length: 315 K 8 svn:date V 27 2003-03-17T21:40:37.000000Z K 7 svn:log V 216 Partial implementation of the platform-independent dialogue-box interface for the Mac OS. This isn't anywhere near complete, and is wrong in a few important regards, but I think it's heading in the right direction. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5878c0d43a9d2d9d79a6284c0fbe543d Text-delta-base-sha1: e5c047a1c07f57185e553ed37bfccb5c4223f5c4 Text-content-length: 73 Text-content-md5: f64812f31c1caf6f0aea479ab662ec6a Text-content-sha1: 2b50e35de121dfb5b24b5f872f402d56198e1eef Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN'U.1]J dialog config macctrls dialog config macctrls Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7464d7d07b1dc0043951cc5562f614c5 Text-delta-base-sha1: cbe424b780162e2575e55dc39e7a42150f877d4e Text-content-length: 719 Text-content-md5: 23cbc6e415b6848cd679fe18860ef0c4 Text-content-sha1: 180d81d0a0a36890edaa03242c0121edc8929f2d Content-length: 759 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN+5-'8#ZgC$~eMTW#include "tree234 struct macctrls *mcs;#define mac_winctrls(w) (((WinInfo *)GetWRefCon(w))->mcs) struct macctrls { tree234 *byctrl; void *data; /* private data for config box */ }; /* Config dialogue bits */ WindowPtr settings_window; struct controlbox *ctrlbox; struct macctrls settings_ctrlsctrls.c */ extern void macctrl_layoutbox(struct controlbox *, WindowPtr, struct macctrls *); extern void macctrl_activate(WindowPtr, EventRecord *); extern void macctrl_click(WindowPtr, EventRecord *); extern void macctrl_update(WindowPtr); extern void macctrl_adjustmenus(WindowPtr); extern void macctrl_close(WindowPtr); Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d4bc0043ab648b4e7b3d6d54cf5aba4b Text-delta-base-sha1: 8dd372430ea3dbe5284d7482012d0125ab3caa17 Text-content-length: 242 Text-content-md5: 0c6ea3443f2c06bb85ea235cb8c1f855 Text-content-sha1: 56c3f04ab23fecdf262aeedef8a33830ea3c0949 Content-length: 282 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN)Uj+*Fc/* $Id: mac_res.r,v 1.32 2003/03/17 21:40:3WIND' (wSettings, "settings", purgeable) { { 0, 0, 350, 500 }, noGrowDocProc, invisible, goAway, 0x0, "untitled", staggerParentWindowScreen }; Node-path: putty/mac/macctrls.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 16844 Text-content-md5: 657699033f9a7dfac0b403a605092abb Text-content-sha1: 5c3d1d3fa5042db1f11608a010f66042454350d6 Content-length: 16960 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN;;;/* $Id: macctrls.c,v 1.1 2003/03/17 21:40:37 ben Exp $ */ /* * Copyright (c) 2003 Ben Harris * All rights reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include #include #include #include #include #include #include #include "putty.h" #include "mac.h" #include "macresid.h" #include "dialog.h" #include "tree234.h" union macctrl { struct macctrl_generic { enum { MACCTRL_TEXT, MACCTRL_RADIO, MACCTRL_CHECKBOX, MACCTRL_BUTTON } type; /* Template from which this was generated */ union control *ctrl; } generic; struct { struct macctrl_generic generic; ControlRef tbctrl; } text; struct { struct macctrl_generic generic; ControlRef *tbctrls; } radio; struct { struct macctrl_generic generic; ControlRef tbctrl; } checkbox; struct { struct macctrl_generic generic; ControlRef tbctrl; } button; }; struct mac_layoutstate { Point pos; unsigned int width; }; #define ctrlevent(mcs, mc, event) do { \ if ((mc)->generic.ctrl->generic.handler != NULL) \ (*(mc)->generic.ctrl->generic.handler)((mc)->generic.ctrl, (mc),\ (mcs)->data, (event)); \ } while (0) static void macctrl_layoutset(struct mac_layoutstate *, struct controlset *, WindowPtr, struct macctrls *); static void macctrl_text(struct macctrls *, WindowPtr, struct mac_layoutstate *, union control *); static void macctrl_radio(struct macctrls *, WindowPtr, struct mac_layoutstate *, union control *); static void macctrl_checkbox(struct macctrls *, WindowPtr, struct mac_layoutstate *, union control *); static void macctrl_button(struct macctrls *, WindowPtr, struct mac_layoutstate *, union control *); static int macctrl_cmp_byctrl(void *av, void *bv) { union macctrl *a = (union macctrl *)av; union macctrl *b = (union macctrl *)bv; if (a->generic.ctrl < b->generic.ctrl) return -1; else if (a->generic.ctrl > b->generic.ctrl) return +1; else return 0; } void macctrl_layoutbox(struct controlbox *cb, WindowPtr window, struct macctrls *mcs) { int i; struct mac_layoutstate curstate; ControlRef root; Rect rect; #if TARGET_API_MAC_CARBON GetPortBounds(GetWindowPort(window), &rect); #else rect = window->portRect; #endif curstate.pos.h = rect.left + 13; curstate.pos.v = rect.top + 13; curstate.width = rect.right - rect.left - (13 * 2); if (mac_gestalts.apprvers >= 0x100) CreateRootControl(window, &root); mcs->byctrl = newtree234(macctrl_cmp_byctrl); for (i = 0; i < cb->nctrlsets; i++) macctrl_layoutset(&curstate, cb->ctrlsets[i], window, mcs); } static void macctrl_layoutset(struct mac_layoutstate *curstate, struct controlset *s, WindowPtr window, struct macctrls *mcs) { unsigned int i; fprintf(stderr, "--- begin set ---\n"); if (s->boxname && *s->boxname) fprintf(stderr, "boxname = %s\n", s->boxname); if (s->boxtitle) fprintf(stderr, "boxtitle = %s\n", s->boxtitle); for (i = 0; i < s->ncontrols; i++) { union control *ctrl = s->ctrls[i]; char const *s; switch (ctrl->generic.type) { case CTRL_TEXT: s = "text"; break; case CTRL_EDITBOX: s = "editbox"; break; case CTRL_RADIO: s = "radio"; break; case CTRL_CHECKBOX: s = "checkbox"; break; case CTRL_BUTTON: s = "button"; break; case CTRL_LISTBOX: s = "listbox"; break; case CTRL_COLUMNS: s = "columns"; break; case CTRL_FILESELECT: s = "fileselect"; break; case CTRL_FONTSELECT: s = "fontselect"; break; case CTRL_TABDELAY: s = "tabdelay"; break; default: s = "unknown"; break; } fprintf(stderr, " control: %s\n", s); switch (ctrl->generic.type) { case CTRL_TEXT: macctrl_text(mcs, window, curstate, ctrl); break; case CTRL_RADIO: macctrl_radio(mcs, window, curstate, ctrl); break; case CTRL_CHECKBOX: macctrl_checkbox(mcs, window, curstate, ctrl); break; case CTRL_BUTTON: macctrl_button(mcs, window, curstate, ctrl); break; } } } static void macctrl_text(struct macctrls *mcs, WindowPtr window, struct mac_layoutstate *curstate, union control *ctrl) { union macctrl *mc = smalloc(sizeof *mc); Rect bounds; fprintf(stderr, " label = %s\n", ctrl->text.label); mc->generic.type = MACCTRL_TEXT; mc->generic.ctrl = ctrl; bounds.left = curstate->pos.h; bounds.right = bounds.left + curstate->width; bounds.top = curstate->pos.v; bounds.bottom = bounds.top + 16; if (mac_gestalts.apprvers >= 0x100) { SInt16 height; Size olen; mc->text.tbctrl = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, kControlStaticTextProc, (long)mc); SetControlData(mc->text.tbctrl, kControlEntireControl, kControlStaticTextTextTag, strlen(ctrl->text.label), ctrl->text.label); GetControlData(mc->text.tbctrl, kControlEntireControl, kControlStaticTextTextHeightTag, sizeof(height), &height, &olen); fprintf(stderr, " height = %d\n", height); SizeControl(mc->text.tbctrl, curstate->width, height); curstate->pos.v += height + 6; } else { /* Do something useful */ } add234(mcs->byctrl, mc); } static void macctrl_radio(struct macctrls *mcs, WindowPtr window, struct mac_layoutstate *curstate, union control *ctrl) { union macctrl *mc = smalloc(sizeof *mc); Rect bounds; Str255 title; unsigned int i, colwidth; fprintf(stderr, " label = %s\n", ctrl->radio.label); mc->generic.type = MACCTRL_RADIO; mc->generic.ctrl = ctrl; mc->radio.tbctrls = smalloc(sizeof(*mc->radio.tbctrls) * ctrl->radio.nbuttons); colwidth = (curstate->width + 13) / ctrl->radio.ncolumns; for (i = 0; i < ctrl->radio.nbuttons; i++) { fprintf(stderr, " button = %s\n", ctrl->radio.buttons[i]); bounds.top = curstate->pos.v; bounds.bottom = bounds.top + 16; bounds.left = curstate->pos.h + colwidth * (i % ctrl->radio.ncolumns); if (i == ctrl->radio.nbuttons - 1 || i % ctrl->radio.ncolumns == ctrl->radio.ncolumns - 1) { bounds.right = curstate->pos.h + curstate->width; curstate->pos.v += 22; } else bounds.right = bounds.left + colwidth - 13; c2pstrcpy(title, ctrl->radio.buttons[i]); mc->radio.tbctrls[i] = NewControl(window, &bounds, title, TRUE, 0, 0, 1, radioButProc, (long)mc); } add234(mcs->byctrl, mc); ctrlevent(mcs, mc, EVENT_REFRESH); } static void macctrl_checkbox(struct macctrls *mcs, WindowPtr window, struct mac_layoutstate *curstate, union control *ctrl) { union macctrl *mc = smalloc(sizeof *mc); Rect bounds; Str255 title; fprintf(stderr, " label = %s\n", ctrl->checkbox.label); mc->generic.type = MACCTRL_CHECKBOX; mc->generic.ctrl = ctrl; bounds.left = curstate->pos.h; bounds.right = bounds.left + curstate->width; bounds.top = curstate->pos.v; bounds.bottom = bounds.top + 16; c2pstrcpy(title, ctrl->checkbox.label); mc->checkbox.tbctrl = NewControl(window, &bounds, title, TRUE, 0, 0, 1, checkBoxProc, (long)mc); add234(mcs->byctrl, mc); curstate->pos.v += 22; ctrlevent(mcs, mc, EVENT_REFRESH); } static void macctrl_button(struct macctrls *mcs, WindowPtr window, struct mac_layoutstate *curstate, union control *ctrl) { union macctrl *mc = smalloc(sizeof *mc); Rect bounds; Str255 title; fprintf(stderr, " label = %s\n", ctrl->button.label); if (ctrl->button.isdefault) fprintf(stderr, " is default\n"); mc->generic.type = MACCTRL_BUTTON; mc->generic.ctrl = ctrl; bounds.left = curstate->pos.h; bounds.right = bounds.left + 100; /* XXX measure string */ bounds.top = curstate->pos.v; bounds.bottom = bounds.top + 20; c2pstrcpy(title, ctrl->button.label); mc->button.tbctrl = NewControl(window, &bounds, title, TRUE, 0, 0, 1, pushButProc, (long)mc); if (mac_gestalts.apprvers >= 0x100) { Boolean isdefault = ctrl->button.isdefault; SetControlData(mc->button.tbctrl, kControlEntireControl, kControlPushButtonDefaultTag, sizeof(isdefault), &isdefault); } add234(mcs->byctrl, mc); curstate->pos.v += 26; } void macctrl_activate(WindowPtr window, EventRecord *event) { Boolean active = (event->modifiers & activeFlag) != 0; GrafPtr saveport; ControlRef root; GetPort(&saveport); SetPort((GrafPtr)GetWindowPort(window)); if (mac_gestalts.apprvers >= 0x100) { SetThemeWindowBackground(window, active ? kThemeBrushModelessDialogBackgroundActive : kThemeBrushModelessDialogBackgroundInactive, TRUE); GetRootControl(window, &root); if (active) ActivateControl(root); else DeactivateControl(root); } else { /* (De)activate controls one at a time */ } SetPort(saveport); } void macctrl_click(WindowPtr window, EventRecord *event) { Point mouse; ControlHandle control; int part; GrafPtr saveport; union macctrl *mc; struct macctrls *mcs = mac_winctrls(window); int i; GetPort(&saveport); SetPort((GrafPtr)GetWindowPort(window)); mouse = event->where; GlobalToLocal(&mouse); part = FindControl(mouse, window, &control); if (control != NULL) if (TrackControl(control, mouse, NULL) != 0) { mc = (union macctrl *)GetControlReference(control); switch (mc->generic.type) { case MACCTRL_RADIO: for (i = 0; i < mc->generic.ctrl->radio.nbuttons; i++) { if (mc->radio.tbctrls[i] == control) SetControlValue(mc->radio.tbctrls[i], kControlRadioButtonCheckedValue); else SetControlValue(mc->radio.tbctrls[i], kControlRadioButtonUncheckedValue); } ctrlevent(mcs, mc, EVENT_VALCHANGE); break; case MACCTRL_CHECKBOX: SetControlValue(control, !GetControlValue(control)); ctrlevent(mcs, mc, EVENT_VALCHANGE); break; case MACCTRL_BUTTON: ctrlevent(mcs, mc, EVENT_ACTION); break; } } SetPort(saveport); } void macctrl_update(WindowPtr window) { #if TARGET_API_MAC_CARBON RgnHandle visrgn; #endif Rect rect; GrafPtr saveport; BeginUpdate(window); GetPort(&saveport); SetPort((GrafPtr)GetWindowPort(window)); if (mac_gestalts.apprvers >= 0x101) { #if TARGET_API_MAC_CARBON GetPortBounds(GetWindowPort(window), &rect); #else rect = window->portRect; #endif InsetRect(&rect, -1, -1); DrawThemeModelessDialogFrame(&rect, mac_frontwindow() == window ? kThemeStateActive : kThemeStateInactive); } #if TARGET_API_MAC_CARBON visrgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(window), visrgn); UpdateControls(window, visrgn); DisposeRgn(visrgn); #else UpdateControls(window, window->visRgn); #endif SetPort(saveport); EndUpdate(window); } #if TARGET_API_MAC_CARBON #define EnableItem EnableMenuItem #define DisableItem DisableMenuItem #endif void macctrl_adjustmenus(WindowPtr window) { MenuHandle menu; menu = GetMenuHandle(mFile); DisableItem(menu, iSave); /* XXX enable if modified */ EnableItem(menu, iSaveAs); EnableItem(menu, iDuplicate); menu = GetMenuHandle(mEdit); DisableItem(menu, 0); } void macctrl_close(WindowPtr window) { struct macctrls *mcs = mac_winctrls(window); union macctrl *mc; while ((mc = index234(mcs->byctrl, 0)) != NULL) { del234(mcs->byctrl, mc); sfree(mc); } freetree234(mcs->byctrl); mcs->byctrl = NULL; /* XXX DisposeWindow(window); if (s->window == NULL) sfree(s); */ } void dlg_update_start(union control *ctrl, void *dlg) { /* No-op for now */ } void dlg_update_done(union control *ctrl, void *dlg) { /* No-op for now */ } void dlg_set_focus(union control *ctrl, void *dlg) { if (mac_gestalts.apprvers >= 0x100) { /* Use SetKeyboardFocus() */ } else { /* Do our own mucking around */ } } union control *dlg_last_focused(void *dlg) { return NULL; } void dlg_beep(void *dlg) { SysBeep(30); } void dlg_error_msg(void *dlg, char *msg) { Str255 pmsg; c2pstrcpy(pmsg, msg); ParamText(pmsg, NULL, NULL, NULL); StopAlert(128, NULL); } void dlg_end(void *dlg, int value) { }; void dlg_refresh(union control *ctrl, void *dlg) { }; void *dlg_get_privdata(union control *ctrl, void *dlg) { return NULL; } void dlg_set_privdata(union control *ctrl, void *dlg, void *ptr) { fatalbox("dlg_set_privdata"); } void *dlg_alloc_privdata(union control *ctrl, void *dlg, size_t size) { fatalbox("dlg_alloc_privdata"); } /* * Radio Button control */ void dlg_radiobutton_set(union control *ctrl, void *dlg, int whichbutton) { union macctrl *mc = dlg; int i; for (i = 0; i < ctrl->radio.nbuttons; i++) { if (i == whichbutton) SetControlValue(mc->radio.tbctrls[i], kControlRadioButtonCheckedValue); else SetControlValue(mc->radio.tbctrls[i], kControlRadioButtonUncheckedValue); } }; int dlg_radiobutton_get(union control *ctrl, void *dlg) { union macctrl *mc = dlg; int i; for (i = 0; i < ctrl->radio.nbuttons; i++) { if (GetControlValue(mc->radio.tbctrls[i]) == kControlRadioButtonCheckedValue) return i; } return -1; }; /* * Check Box control */ void dlg_checkbox_set(union control *ctrl, void *dlg, int checked) { union macctrl *mc = dlg; SetControlValue(mc->checkbox.tbctrl, checked ? kControlCheckBoxCheckedValue : kControlCheckBoxUncheckedValue); } int dlg_checkbox_get(union control *ctrl, void *dlg) { union macctrl *mc = dlg; return GetControlValue(mc->checkbox.tbctrl); } /* * Edit Box control */ void dlg_editbox_set(union control *ctrl, void *dlg, char const *text) { }; void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length) { }; /* * List Box control */ void dlg_listbox_clear(union control *ctrl, void *dlg) { }; void dlg_listbox_del(union control *ctrl, void *dlg, int index) { }; void dlg_listbox_add(union control *ctrl, void *dlg, char const *text) { }; void dlg_listbox_addwithindex(union control *ctrl, void *dlg, char const *text, int id) { }; int dlg_listbox_getid(union control *ctrl, void *dlg, int index) { return 0; }; int dlg_listbox_index(union control *ctrl, void *dlg) { return 0; }; int dlg_listbox_issel(union control *ctrl, void *dlg, int index) { return 0; }; void dlg_listbox_select(union control *ctrl, void *dlg, int index) { }; /* * Text control */ void dlg_text_set(union control *ctrl, void *dlg, char const *text) { union macctrl *mc = dlg; if (mac_gestalts.apprvers >= 0x100) SetControlData(mc->text.tbctrl, kControlEntireControl, kControlStaticTextTextTag, strlen(ctrl->text.label), ctrl->text.label); } /* * File Selector control */ void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn) { } void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn) { } /* * Font Selector control */ void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec fn) { } void dlg_fontsel_get(union control *ctrl, void *dlg, FontSpec *fn) { } /* * Printer enumeration */ printer_enum *printer_start_enum(int *nprinters) { *nprinters = 0; return NULL; } char *printer_get_name(printer_enum *pe, int thing) { return ""; } void printer_finish_enum(printer_enum *pe) { } /* * Colour selection stuff */ void dlg_coloursel_start(union control *ctrl, void *dlg, int r, int g, int b) { } int dlg_coloursel_results(union control *ctrl, void *dlg, int *r, int *g, int *b) { return 0; } /* * Local Variables: * c-file-style: "simon" * End: */ Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d5eba178e9f0f786cb3d9d5065968488 Text-delta-base-sha1: cb17a0e7882b98ad53f0fad7a17c491626e3108b Text-content-length: 881 Text-content-md5: 73236516a7ce4ffd5eae3b42eb6019a2 Text-content-sha1: 2612bcaaacac22ed884670606fd15cdd5ac86926 Content-length: 921 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN%@+C}PK@yIR%settings_window = GetNewCWindow(wSettings, NULL, (WindowPtr)-1); else s->settings_window = GetNewWindow(wSettings, NULL, (WindowPtr)-1); get_sesslist(&sesslist, TRUE); s->ctrlbox = ctrl_new_box(); setup_config_box(s->ctrlbox, &sesslist, FALSE, 0); s->settings_ctrls.data = &s->cfg; macctrl_layoutbox(s->ctrlbox, s->settings_window, &s->settings_ctrls); wi = smalloc(sizeof(*wi)); memset(wi, 0, sizeof(*wi)); wi->s = s; wi->mcs = s->settings_ctrls; wi->wtype = wSettings; wi->update = &macctrl_update; wi->click = &macctrl_click; wi->activate = &macctrl_activate; wi->adjustmenus = &macctrl_adjustmenus; wi->close = &macctrl_close Node-path: putty/mac/macstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5cf5132662b7c1d99c5cd2130889c181 Text-delta-base-sha1: 8e8466aeef8ba9f5336b3502e7c7cad3b80ef3dd Text-content-length: 81 Text-content-md5: ded32c55f0b84e6efa6026559b1347b6 Text-content-sha1: 3471ac4f722c37ad58a4c978177ad422caa4b7ef Content-length: 120 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNh(@h@ #define HELPCTX(foo) I(0) #define FILTER_KEY_FILES "pAgt.PPK" Node-path: putty/mac/macucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8986fe6f9921d544c536e048d4f80159 Text-delta-base-sha1: 930b94795cd388d71f157f88b551a020e4dc6e3a Text-content-length: 279 Text-content-md5: a8974d4b72a2e79e4b0a2a5511d29dd2 Text-content-sha1: 421e8888f26c35938f618f0301cea43e89549775 Content-length: 318 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNH!*Y/* $Id: macucs.c,v 1.6 2003/03/17 21:40:37 int decode_codepage(char *cp_name) { return 0; } char *cp_enumerate (int index) { if (index == 0) return "ISO/IEC 8859-1"; return NULL; } char *cp_name(int codepage) { return "ISO/IEC 8859-1"; } Revision-number: 2954 Prop-content-length: 179 Content-length: 179 K 7 svn:log V 81 Insert a missing ampersand that meant that the last version didn't even compile. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-17T22:38:18.000000Z PROPS-END Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 73236516a7ce4ffd5eae3b42eb6019a2 Text-delta-base-sha1: 2612bcaaacac22ed884670606fd15cdd5ac86926 Text-content-length: 66 Text-content-md5: dbe48d705d86e751ed96e13a1732eb76 Text-content-sha1: 55136ed18f06a02086c358323986fe3d281811f8 Content-length: 106 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN ,+A?/* $Id: macdlg.c,v 1.14 2003/03/17 22:38:18& Revision-number: 2955 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2003-03-18T00:35:40.000000Z K 7 svn:log V 81 My First CDEF: A terribly trivial static text control for System 7. Needs work. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0c6ea3443f2c06bb85ea235cb8c1f855 Text-delta-base-sha1: 56c3f04ab23fecdf262aeedef8a33830ea3c0949 Text-content-length: 135 Text-content-md5: f13bdb392906b42bc8f209f05a6cce2b Text-content-sha1: 6402b3dab0cc6e8380d51a451a94123d624544a5 Content-length: 175 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNL nY,B/* $Id: mac_res.r,v 1.33 2003/03/18 00:35:40 /* Custom xDEFs */ data 'CDEF' (CDEF_Text) { $"4EF9 00000000 Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 657699033f9a7dfac0b403a605092abb Text-delta-base-sha1: 5c3d1d3fa5042db1f11608a010f66042454350d6 Text-content-length: 1861 Text-content-md5: d510d697b24aa9206162a712d515c53a Text-content-sha1: d9515b1d846ff1468719c04da04bd4db44bf458e Content-length: 1900 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN;s!g,2N e ./* $Id: macctrls.c,v 1.2 2003/03/18 00:35:40Resource#if !TARGET_API_MAC_CARBON static pascal SInt32 macctrl_sys7_text_cdef(SInt16, ControlRef, ControlDefProcMessage, SInt32); #endif #if !TARGET_API_MAC_CARBON /* * This trick enables us to keep all the CDEF code in the main * application, which makes life easier. For details, see * . */ #pragma options align=mac68k typedef struct { short jmpabs; /* 4EF9 */ ControlDefUPP theUPP; } **PatchCDEF; #pragma options align=reset #endif static void macctrl_init() { #if !TARGET_API_MAC_CARBON static int inited = 0; PatchCDEF cdef; if (inited) return; cdef = (PatchCDEF)GetResource(kControlDefProcResourceType, CDEF_Text); (*cdef)->theUPP = NewControlDefProc(macctrl_sys7_text_cdef); inited = 1; #endif } macctrl_init();Str255 title; c2pstrcpy(title, ctrl->text.label); mc->text.tbctrl = NewControl(window, &bounds, title, TRUE, 0, 0, 0, SYS7_TEXT_PROC, (long)mc); } add234(mcs->byctrl, mc); } #if !TARGET_API_MAC_CARBON static pascal SInt32 macctrl_sys7_text_cdef(SInt16 variant, ControlRef control, ControlDefProcMessage msg, SInt32 param) { RgnHandle rgn; switch (msg) { case drawCntl: if ((*control)->contrlVis) TETextBox((*control)->contrlTitle + 1, (*control)->contrlTitle[0], &(*control)->contrlRect, teFlushDefault); return 0; case calcCRgns: if (param & (1 << 31)) { param &= ~(1 << 31); goto calcthumbrgn; } /* FALLTHROUGH */ case calcCntlRgn: rgn = (RgnHandle)param; RectRgn(rgn, &(*control)->contrlRect); return 0; case calcThumbRgn: calcthumbrgn: rgn = (RgnHandle)param; SetEmptyRgn(rgn); return 0; } return 0; } #endif Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bca2f1f1f0f765f7ce14e0d3cff83f35 Text-delta-base-sha1: 7f102595be77f944e261826c33207ce21a26ee8b Text-content-length: 138 Text-content-md5: 0224f04f959f9ea8985477efd00f7ed9 Text-content-sha1: 8c1fa27aed36d5be6f2fe682885d2332a7f7fcee Content-length: 178 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNwBxJ-K/* $Id: macresid.h,v 1.11 2003/03/18 00:35:40 /* xDEFs */ #define CDEF_Text 128 #define SYS7_TEXT_PROC (CDEF_Text << 4) Revision-number: 2956 Prop-content-length: 189 Content-length: 189 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-18T09:03:31.000000Z K 7 svn:log V 89 Gah, another duplicate keyword. I must stop creating new docs sections by cut and paste. PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f16043b2ffa1cdcf32ccfb5c5b79fce0 Text-delta-base-sha1: 0098caf075791d1aa4d17d49018a0b3d4a95f4af Text-content-length: 82 Text-content-md5: 859a39e88aa56d3c795c7748befcb484 Text-content-sha1: d2b9408283066921fb3e6aebece3d4a61e32163f Content-length: 121 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN$% <742r\versionid $Id: errors.but,v 1.6 2003/03/18 09:03:31timedout Revision-number: 2957 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2003-03-18T18:22:03.000000Z K 7 svn:log V 13 Add a patch. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/meta-bit Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 50b71aeceb9db26d7c5f16733894fe9f Text-delta-base-sha1: 498d9d6aadf31a05178cb8fd00b404aa37d4708f Text-content-length: 3915 Text-content-md5: c07af42e4f5e1bdbd3a17d2609e03b8d Text-content-sha1: 329b9bb6594c24b1e31a2704adb9152b2a69f350 Content-length: 3954 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNJ8J8

    We've been sent this patch, which might be helpful:

    Common subdirectories: putty-orig/DOC and putty-mod/DOC
    diff -ubBw putty-orig/PUTTY.H putty-mod/PUTTY.H
    --- putty-orig/PUTTY.H	2002-10-07 19:44:26.000000000 -0400
    +++ putty-mod/PUTTY.H	2003-03-16 17:46:07.000000000 -0500
    @@ -298,6 +298,7 @@
         int alt_f4;			       /* is it special? */
         int alt_space;		       /* is it special? */
         int alt_only;		       /* is it special? */
    +    int alt_metabit;		       /* set meta instead of escape */
         int localecho;
         int localedit;
         int alwaysontop;
    diff -ubBw putty-orig/SETTINGS.C putty-mod/SETTINGS.C
    --- putty-orig/SETTINGS.C	2002-09-26 20:37:34.000000000 -0400
    +++ putty-mod/SETTINGS.C	2003-03-16 17:48:46.000000000 -0500
    @@ -211,6 +211,7 @@
         write_setting_i(sesskey, "AltF4", cfg->alt_f4);
         write_setting_i(sesskey, "AltSpace", cfg->alt_space);
         write_setting_i(sesskey, "AltOnly", cfg->alt_only);
    +    write_setting_i(sesskey, "AltMetabit", cfg->alt_metabit);
         write_setting_i(sesskey, "ComposeKey", cfg->compose_key);
         write_setting_i(sesskey, "CtrlAltKeys", cfg->ctrlaltkeys);
         write_setting_i(sesskey, "TelnetKey", cfg->telnet_keyboard);
    @@ -430,6 +431,7 @@
         gppi(sesskey, "AltF4", 1, &cfg->alt_f4);
         gppi(sesskey, "AltSpace", 0, &cfg->alt_space);
         gppi(sesskey, "AltOnly", 0, &cfg->alt_only);
    +    gppi(sesskey, "AltMetaBit", 0, &cfg->alt_metabit);
         gppi(sesskey, "ComposeKey", 0, &cfg->compose_key);
         gppi(sesskey, "CtrlAltKeys", 1, &cfg->ctrlaltkeys);
         gppi(sesskey, "TelnetKey", 0, &cfg->telnet_keyboard);
    diff -ubBw putty-orig/WINDLG.C putty-mod/WINDLG.C
    --- putty-orig/WINDLG.C	2002-09-26 20:37:34.000000000 -0400
    +++ putty-mod/WINDLG.C	2003-03-16 18:09:15.000000000 -0500
    @@ -303,6 +303,7 @@
         IDC_CURAPPLIC,
         IDC_COMPOSEKEY,
         IDC_CTRLALTKEYS,
    +    IDC_ALTMETABIT,
         keyboardpanelend,
     
         terminalpanelstart,
    @@ -735,6 +736,8 @@
             return "JI(`',`keyboard.compose')";
           case IDC_CTRLALTKEYS:
             return "JI(`',`keyboard.ctrlalt')";
    +      case IDC_ALTMETABIT:
    +	return "JI(`',`keyboard.altmetabit')";
     
           case IDC_NOAPPLICK:
           case IDC_NOAPPLICC:
    @@ -1111,6 +1114,7 @@
         CheckDlgButton(hwnd, IDC_ALTONLY, cfg.alt_only);
         CheckDlgButton(hwnd, IDC_COMPOSEKEY, cfg.compose_key);
         CheckDlgButton(hwnd, IDC_CTRLALTKEYS, cfg.ctrlaltkeys);
    +    CheckDlgButton(hwnd, IDC_ALTMETABIT, cfg.alt_metabit);
         CheckDlgButton(hwnd, IDC_TELNETKEY, cfg.telnet_keyboard);
         CheckDlgButton(hwnd, IDC_TELNETRET, cfg.telnet_newline);
         CheckRadioButton(hwnd, IDC_ECHOBACKEND, IDC_ECHONO,
    @@ -1639,6 +1643,8 @@
     	checkbox(&cp, "AltGr ac&ts as Compose key", IDC_COMPOSEKEY);
     	checkbox(&cp, "Control-Alt is &different from AltGr",
     		 IDC_CTRLALTKEYS);
    +	checkbox(&cp, "Set meta bit on alt (instead of escape-char)",
    +		 IDC_ALTMETABIT);
     	endbox(&cp);
         }
     
    @@ -2699,6 +2705,12 @@
     			cfg.ctrlaltkeys =
     			IsDlgButtonChecked(hwnd, IDC_CTRLALTKEYS);
     		break;
    +	      case IDC_ALTMETABIT:
    +		if (HIWORD(wParam) == BN_CLICKED ||
    +		    HIWORD(wParam) == BN_DOUBLECLICKED)
    +			cfg.alt_metabit =
    +			IsDlgButtonChecked(hwnd, IDC_ALTMETABIT);
    +		break;
     	      case IDC_TELNETKEY:
     		if (HIWORD(wParam) == BN_CLICKED ||
     		    HIWORD(wParam) == BN_DOUBLECLICKED)
    diff -ubBw putty-orig/WINDOW.C putty-mod/WINDOW.C
    --- putty-orig/WINDOW.C	2002-11-08 09:19:48.000000000 -0500
    +++ putty-mod/WINDOW.C	2003-03-16 18:47:52.000000000 -0500
    @@ -3784,8 +3784,11 @@
     		    } else {
     			char cbuf[2];
     			cbuf[0] = '\033';
    -			cbuf[1] = ch;
    -			lpage_send(kbd_codepage, cbuf+!left_alt, 1+!!left_alt, 1);
    +			cbuf[1] = ch | ((left_alt & cfg.alt_metabit) << 7);
    +			lpage_send(kbd_codepage, 
    +				cbuf + !(left_alt & !cfg.alt_metabit), 
    +				1 + !!(left_alt & !cfg.alt_metabit), 
    +				1);
     		    }
     		}
     		show_mouseptr(0);
    
    Revision-number: 2958 Prop-content-length: 582 Content-length: 582 K 8 svn:date V 27 2003-03-18T19:06:51.000000Z K 7 svn:log V 481 Big sprawling dialog-box commit covering all sorts of things. Buttons now have an `iscancel' flag to go with `isdefault'; dlg_last_focused() now explicitly passes the control it _doesn't_ care about (`I want the last control that had focus and isn't this one'); and in the GTK implementation, various fixes have happened, notably including arrow keys working sensibly in list boxes and the treeview and short font aliases being expanded correctly to initialise the font selectors. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c4cb73af489b088545f97b0efdb34101 Text-delta-base-sha1: a1d7f5644a9b11d11c18a517fac5ad93202444ff Text-content-length: 77 Text-content-md5: f52ea8672bb0b94393682f09bd236cab Text-content-sha1: 1d54ecfa80f6c8f98e350af9950e91c497d74d25 Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN3h$ j \:JXl/ctrl, button.iscancel = TRUE Node-path: putty/dialog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 929ee5ba29cad33afd6226aa2b913218 Text-delta-base-sha1: b509299bb7f8847442b4a5f90bcd1c81dbc7bb81 Text-content-length: 41 Text-content-md5: 53a5bda3f58272f77b7fe2743cae2e7a Text-content-sha1: 09d6b90bcef449296b2510e7ffb191aeb6ec1867 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNm .I$c->button.iscancel Node-path: putty/dialog.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 60d0b0ac4fad5f6ffe2c68ff08a167bb Text-delta-base-sha1: d3285abde2e26a1e46d9386b481c78916890fa01 Text-content-length: 427 Text-content-md5: 22965be9b24f014cfef00608e13dea50 Text-content-sha1: 9a6722f8c6a531c27615694fc6b3672140c8dd71 Content-length: 466 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNR+Yzn1f /* * Also, the reverse of this: a default cancel-type button, * which is implicitly pressed when you hit Escape. */ int iscancel; } buttonmost recent control that had * the input focus apart from the one mentioned. This is NOT * GUARANTEED to work on all platforms, so don't base any critical * functionality on it! */ union control *dlg_last_focused(union control *ctrl, Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d510d697b24aa9206162a712d515c53a Text-delta-base-sha1: d9515b1d846ff1468719c04da04bd4db44bf458e Text-content-length: 94 Text-content-md5: a2ff5f5013fb2a5dcfe2a068507f1485 Text-content-sha1: f5049f4bc716ce0720fb510f341869a97915c75f Content-length: 133 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNs Fv/N%/* $Id: macctrls.c,v 1.3 2003/03/18 19:06:51 simounion control *ctrl, Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0895fdda789ba00ae8c1e2ccda2b43db Text-delta-base-sha1: 3476400cfb097828cb5568e13dbbb9fab26047b7 Text-content-length: 16209 Text-content-md5: 3373bf7fd3b2c32dfb92c97dda974a1e Text-content-sha1: 2cf1417e9868116dd0777cde9eec8f9346a0886e Content-length: 16248 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN,*5 _mWa.[#g%Y@Y]@4kplj `[[b3X9_oi"y@f]rIwZ{=i8>Vw{x=O4XW0,B)<I>E;){c\ u7wG9'!\7 AH|m[ecX["3}.8N{[!rr\S)o'!\=0fg3ng<;CC@Bcolour selection woe: what to do about GTK's colour selector * not allowing us full resolution in our own colour selections? * Perhaps making the colour resolution per-platform, at least * at the config level, is actually the least unpleasant * alternativapparently Left/Right on the treeview should be expanding * and collapsing branches. + the error message box is in totally the wrong place and * also looks ugly. Try to fix; look at how (frex) AisleRiot * does it better.#include #include #include treeitemsif (dp->currfocus != ctrl) return dp->currfocus; else return dp->lastfocus; if (ctrl->listbox.multisel) { gtk_signal_connect(GTK_OBJECT(listitem), "key_press_event", GTK_SIGNAL_FUNC(listitem_multi_key), uc->adj); } else { gtk_signal_connect(GTK_OBJECT(listitem), "key_press_event", GTK_SIGNAL_FUNC(listitem_single_key), uc->adj); } gtk_signal_connect(GTK_OBJECT(listitem), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus), dp); g_list_free(children== -1) selected = i; else selected = -2; } } g_list_free(children); return selected < 0 ? -1 : selected; } int dlg_listbox_issel g_list_free(childrenstruct uctrl *uc = dlg_find_byctrl(dp, ctrl); switch (ctrl->generic.type) { case CTRL_CHECKBOX: case CTRL_BUTTON: /* Check boxes and buttons get the focus _and_ get toggled. */ gtk_widget_grab_focus(uc->toplevel); break; case CTRL_FILESELECT: case CTRL_FONTSELECT: case CTRL_EDITBOX: /* Anything containing an edit box gets that focused. */ gtk_widget_grab_focus(uc->entry); break; case CTRL_RADIO: /* * Radio buttons: we find the currently selected button and * focus it. */ { int i; for (i = 0; i < ctrl->radio.nbuttons; i++) if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(uc->buttons[i]))) { gtk_widget_grab_focus(uc->buttons[i]); } } break; case CTRL_LISTBOX: /* * If the list is really an option menu, we focus it. * Otherwise we tell it to focus one of its children, which * appears to do the Right Thing. */ if (uc->optmenu) { gtk_widget_grab_focus(uc->optmenu); } else { assert(uc->list != NULL); gtk_container_focus(GTK_CONTAINER(uc->list), GTK_DIR_TAB_FORWARD); } break; }static void errmsg_button_clicked(GtkButton *button, gpointer data) { gtk_widget_destroy(GTK_WIDGET(data)); } void dlg_error_msg(void *dlg, char *msg) { struct dlgparam *dp = (struct dlgparam *)dlg; GtkWidget *window, *text, *ok; window = gtk_dialog_new(); text = gtk_label_new(msg); gtk_misc_set_alignment(GTK_MISC(text), 0.0, 0.0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox), text, FALSE, FALSE, 0); gtk_widget_show(text); gtk_label_set_line_wrap(GTK_LABEL(text), TRUE); ok = gtk_button_new_with_label("OK"); gtk_box_pack_end(GTK_BOX(GTK_DIALOG(window)->action_area), ok, FALSE, FALSE, 0); gtk_widget_show(ok); GTK_WIDGET_SET_FLAGS(ok, GTK_CAN_DEFAULT); gtk_window_set_default(GTK_WINDOW(window), ok); gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(errmsg_button_clicked), window); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(window_destroy), NULL); gtk_window_set_modal(GTK_WINDOW(window), TRUE); gtk_widget_show(window); gtk_main();dp->retval = value; gtk_main_quit(); } void dlg_refreshgboolean widget_focus(GtkWidget *widget, GdkEventFocus *event, widget); union control *focus; if (uc && uc->ctrl) focus = uc->ctrl; else focus = NULL; if (focus != dp->currfocus) { dp->lastfocus = dp->currfocus; dp->currfocus = focus; } return FALSE; }int listitem_key(GtkWidget *item, GdkEventKey *event, gpointer data, int multiple) { GtkAdjustment *adj = GTK_ADJUSTMENT(data); if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up || event->keyval == GDK_Down || event->keyval == GDK_KP_Down || event->keyval == GDK_Page_Up || event->keyval == GDK_KP_Page_Up || event->keyval == GDK_Page_Down || event->keyval == GDK_KP_Page_Down) { /* * Up, Down, PgUp or PgDn have been pressed on a ListItem * in a list box. So, if the list box is single-selection: * * - if the list item in question isn't already selected, * we simply select it. * - otherwise, we find the next one (or next * however-far-away) in whichever direction we're going, * and select that. * + in this case, we must also fiddle with the * scrollbar to ensure the newly selected item is * actually visible. * * If it's multiple-selection, we do all of the above * except actually selecting anything, so we move the focus * and fiddle the scrollbar to follow it. */ GtkWidget *list = item->parent; gtk_signal_emit_stop_by_name(GTK_OBJECT(item), "key_press_event"); if (!multiple && GTK_WIDGET_STATE(item) != GTK_STATE_SELECTED) { gtk_list_select_child(GTK_LIST(list), item); } else { int direction = (event->keyval==GDK_Up || event->keyval==GDK_KP_Up || event->keyval==GDK_Page_Up || event->keyval==GDK_KP_Page_Up) ? -1 : +1; int step = (event->keyval==GDK_Page_Down || event->keyval==GDK_KP_Page_Down || event->keyval==GDK_Page_Up || event->keyval==GDK_KP_Page_Up) ? 2 : 1; int i, n; GtkWidget *thisitem; GList *children, *chead; chead = children = gtk_container_children(GTK_CONTAINER(list)); n = g_list_length(children); if (step == 2) { /* * Figure out how many list items to a screenful, * and adjust the step appropriately. */ step = 0.5 + adj->page_size * n / (adj->upper - adj->lower); step--; /* go by one less than that */ } i = 0; while (children != NULL) { if (item == children->data) break; children = children->next; i++; } while (step > 0) { if (direction < 0 && i > 0) children = children->prev, i--; else if (direction > 0 && i < n-1) children = children->next, i++; step--; } if (children && children->data) { if (!multiple) gtk_list_select_child(GTK_LIST(list), GTK_WIDGET(children->data)); gtk_widget_grab_focus(GTK_WIDGET(children->data)); gtk_adjustment_clamp_page (adj, adj->lower + (adj->upper-adj->lower) * i / n, adj->lower + (adj->upper-adj->lower) * (i+1) / n); } g_list_free(chead); } return TRUE; } return FALSE; } static int listitem_single_key(GtkWidget *item, GdkEventKey *event, gpointer data) { listitem_key(item, event, data, FALSE); } static int listitem_multi_key(GtkWidget *item, GdkEventKey *event, gpointer data) { listitem_key(item, event, data, TRUE); } static int return TRUE; } return FALSE;g_list_free(children); gchar *fontname = gtk_entry_get_text(GTK_ENTRY(uc->entry))if (!gtk_font_selection_dialog_set_font_name (GTK_FONT_SELECTION_DIALOG(fontsel), fontname)) { /* * If the font name wasn't found as it was, try opening * it and extracting its FONT property. This should * have the effect of mapping short aliases into true * XLFDs. */ GdkFont *font = gdk_font_load(fontname); if (font) { XFontStruct *xfs = GDK_FONT_XFONT(font); Display *disp = GDK_FONT_XDISPLAY(font); Atom fontprop = XInternAtom(disp, "FONT", False); unsigned long ret; if (XGetFontProperty(xfs, fontprop, &ret)) { char *name = XGetAtomName(disp, (Atom)ret); if (name) gtk_font_selection_dialog_set_font_name (GTK_FONT_SELECTION_DIALOG(fontsel), name); } gdk_font_unref(font); } } gtk_object_set_data if (ctrl->button.iscancel) dp->cancelbutton = w; } gtk_signal_connect(GTK_OBJECT(w), "clicked", GTK_SIGNAL_FUNC(button_clicked), dp); gtk_signal_connect(GTK_OBJECT(w), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus gtk_signal_connect(GTK_OBJECT(w), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus gtk_signal_connect(GTK_OBJECT(b), "focus_in_event", GTK_SIGNAL_FUNC(widget_focusgtk_signal_connect(GTK_OBJECT(uc->entry), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus gtk_signal_connect(GTK_OBJECT(uc->entry), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus), dp); gtk_signal_connect(GTK_OBJECT(uc->button), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus gtk_signal_connect(GTK_OBJECT(uc->optmenu), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus), dp); } else { uc->list = gtk_list_new(); if (ctrl->listbox.multisel) { gtk_list_set_selection_mode(GTK_LIST(uc->list), GTK_SELECTION_MULTIPLE); } else { gtk_list_set_selection_mode(GTK_LIST(uc->list), GTK_SELECTION_SINGLE); }uc->adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW(w)); gtk_signal_connect(GTK_OBJECT(uc->list), "focus_in_event", GTK_SIGNAL_FUNC(widget_focusgtk_signal_connect(GTK_OBJECT(button), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus gtk_signal_connect(GTK_OBJECT(button), "focus_in_event", GTK_SIGNAL_FUNC(widget_focusmisc_set_alignment(GTK_MISC(w), 0.0, 0.0 sp->dp->currtreeitem = sp->treeitem; } static void window_ && dp->cancelbutton) { gtk_signal_emit_by_name(GTK_OBJECT(dp->cancelbutton), "clicked"If the list is really an option menu, we focus * and click it. Otherwise we tell it to focus one * of its children, which appears to do the Right * Thing assert(sc->uc->list != NULL); gtk_container_focus(GTK_CONTAINER(sc->uc->list), GTK_DIR_TAB_FORWARD); } break; } break; } } return FALSE; } int treeUp || event->keyval == GDK_KP_Up || event->keyval == GDK_Down || event->keyval == GDK_KP_Down) { int i, j = -1; for (i = 0; i < dp->ntreeitems; i++) if (widget == dp->treeitems[i]) { if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up) { if (i > 0) j = i-1; } else { if (i < dp->ntreeitems-1) j = i+1; } break; } gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event"); if (j >= 0) { gint return_val; gtk_signal_emit_by_name(GTK_OBJECT(dp->treeitems[j]), "toggle"); gtk_widget_grab_focus(dp->treeitems[j]); } return TRUE; } return FALSE; } gint tree_focus(GtkContainer *container, GtkDirectionType direction, int i, f, dir; gtk_signal_emit_stop_by_name(GTK_OBJECT(container), "focus"); dir = (direction == GTK_DIR_UP || direction == GTK_DIR_LEFT || direction == GTK_DIR_TAB_BACKWARD) ? -1 : +1; /* * See if any of the treeitems has the focus. */ f = -1; for (i = 0; i < dp->ntreeitems; i++) if (GTK_WIDGET_HAS_FOCUS(dp->treeitems[i])) { f = i; break; } /* * If there's a focused treeitem, we return FALSE to cause the * focus to move on to some totally other control. If not, we * focus the selected one. */ if (f >= 0) return FALSE; else { gtk_widget_grab_focus(dp->currtreeitem); return TRUE; }intgtk_signal_connect(GTK_OBJECT(tree), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus), &dp);signal_connect(GTK_OBJECT(tree), "focus", GTK_SIGNAL_FUNC(tree_focus), &dp gtk_signal_connect(GTK_OBJECT(treeitem), "key_press_event", GTK_SIGNAL_FUNC(tree_key_press), &dp); gtk_signal_connect(GTK_OBJECT(treeitem), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus), &dp)dp.ntreeitems = nselparams; dp.treeitems = smalloc(dp.ntreeitems * sizeof(GtkWidget *)); dp.treeitems[index] = selparams[index].treeitem dp.currtreeitem = dp.treeitems[0]; dp.lastfocus = NULL; dp.retval = 0; gtk_widget_show(window); /* * Set focus into the first available control. */ int done = 0; int j; if (*s->pathname) { for (j = 0; j < s->ncontrols; j++) if (s->ctrls[j]->generic.type != CTRL_TABDELAY && s->ctrls[j]->generic.type != CTRL_COLUMNS && s->ctrls[j]->generic.type != CTRL_TEXT) { dlg_set_focus(s->ctrls[j], &dp); dp.lastfocus = s->ctrls[j]; done = 1; break; } } if (done) break; } gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(window_ return dp.retval; } /* printf("returned %d\n", do_config_box()); return 0; } #endif Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4a83a610b393459868267abed6541d2d Text-delta-base-sha1: 873051d3750f77e1a2263ec0d0c64a98418708a2 Text-content-length: 349 Text-content-md5: 8a27821a5bd9bffc5844000013e85000 Text-content-sha1: ee29fb5b8bcef76aa16eec89169aa14898dbd112 Content-length: 389 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN 7kuiC"Xl"3'"ZX?@Nactual_base_id Almost all controls start at base_id. */ actual_base_id = base_idif (ctrl->button.iscancel) actual_base_id = IDCANCEL; num_ids = 1; button(&pos, escaped, actual_actual_if (actual_base_id == base_id) return dp->focused == ctrl ? dp->lastfocused : dp-> Revision-number: 2959 Prop-content-length: 345 Content-length: 345 K 8 svn:date V 27 2003-03-18T19:12:40.000000Z K 7 svn:log V 246 Change the token for HTTP Basic Authentication from "basic" to "Basic". According to RFC 2617, it should be case-insensitive, but some proxies (Microsoft Proxy Server in particular) erroneously reject "basic". Should fix semi-bug msproxy-denied. K 10 svn:author V 3 ben PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 792459c7a955901e922f8abc78f5e64c Text-delta-base-sha1: e718c58adf5af348c838b4efb1c6309c96a09cab Text-content-length: 25 Text-content-md5: 2f1369bf9c2c517e8468e6d63f7894f7 Text-content-sha1: 8b48ec7c1de1a1b4fcdd04f9ed8785062d9423de Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN ACBB Revision-number: 2960 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 29 I believe this is now fixed. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-18T19:15:15.000000Z PROPS-END Node-path: putty-wishlist/data/msproxy-denied Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f78f501b119e71361143e2064571283a Text-delta-base-sha1: b049646f579994db617cd90a2fa2afdddb97b2dd Text-content-length: 126 Text-content-md5: 4a8ef1847ad19506bc076a207612a127 Text-content-sha1: 72ddc27766fb483c6d387797bd4d1b5d10b415f1 Content-length: 165 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNX iwxfun Present-in: 0.53b 2002-12-30 Fixed-in: 2003-03-19

    This bug should be fixed as of proxy.c rev 1.27. Revision-number: 2961 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2003-03-18T19:43:32.000000Z K 7 svn:log V 24 Add cdot.senecac.on.ca. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 197e65c24aee0dfdc5862b028cb2ec5a Text-delta-base-sha1: a3bebca4b264679d0fd9d3a286b6a071476cbe0c Text-content-length: 146 Text-content-md5: a33eb79c9c6dd2fc75a1f2ab4518baec Text-content-sha1: 4dd6b3757f7f74fad8b3339e8ab924c46fe08dbd Content-length: 186 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN]wUB?cdot.senecac.on.ca/software/putty/">cdot.senecac.on.ca in cdot.senecac.on.ca/pub/software/putty">cdot.senecac.on.ca Revision-number: 2962 Prop-content-length: 289 Content-length: 289 K 8 svn:date V 27 2003-03-18T19:47:28.000000Z K 7 svn:log V 188 Better appearance and positioning for dlg_error_msg box, and also I've just found out that it's easy to ask for the config box to be centred on the screen by default, which is kinda cool. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3373bf7fd3b2c32dfb92c97dda974a1e Text-delta-base-sha1: 2cf1417e9868116dd0777cde9eec8f9346a0886e Text-content-length: 867 Text-content-md5: 60c0944353e285c1e5ce1ad526037167 Text-content-sha1: 5de26047b42a56208e056a806c832e9704a7ea41 Content-length: 906 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN*M3"A(S y2t|dp]VTwindow titlewindow,hboxhbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), text, FALSE, FALSE, 20); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox), hbox, FALSE, FALSE, 20); gtk_widget_show(text); gtk_widget_show(hbox); gtk_window_set_title(GTK_WINDOW(window), "Error"ndow_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(dp->window)); { gint x, y, w, h, dx, dy; gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_NONE); gdk_window_get_origin(GTK_WIDGET(dp->window)->window, &x, &y); gdk_window_get_size(GTK_WIDGET(dp->window)->window, &w, &h); dx = x + w/4; dy = y + h/4; gtk_widget_set_uposition(GTK_WIDGET(window), dx, dy); } dp.window = window; gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); Revision-number: 2963 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2003-03-18T19:50:41.000000Z K 7 svn:log V 40 Summary: Log proxy connection setup etc K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/proxy-logging Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 327 Text-content-md5: 3b07ce7e355c7aeb17120c4831aa3177 Text-content-sha1: a595d6cde099bb2566aa5ce663475b3d9a50cd71 Content-length: 443 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN999Summary: Log proxy connection setup etc Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body

    There doesn't currently seem to be any logging of the discussions between PuTTY and a proxy server to set up a connection. This would be useful for diagnosing proxy configuration problems. Revision-number: 2964 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2003-03-18T20:19:34.000000Z K 7 svn:log V 29 This was fixed a while back. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/pterm-windowid Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0b26a23eb558e98c1aeb6e21ce3aa989 Text-delta-base-sha1: aa1f0755657adf184324792e7326215ee234c476 Text-content-length: 72 Text-content-md5: de9ea9316b90b33322db768df6ff31cc Text-content-sha1: abcde8f10b8fd569b8675186529eb3ff26e16f8e Content-length: 111 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNy* 2uFixed-in: 2003-03-07, which has now been applied. Revision-number: 2965 Prop-content-length: 195 Content-length: 195 K 7 svn:log V 97 Tag the "Cancel" button appropriately, in case anyone's using a theme that pays attention to it. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-18T23:41:14.000000Z PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a2ff5f5013fb2a5dcfe2a068507f1485 Text-delta-base-sha1: f5049f4bc716ce0720fb510f341869a97915c75f Text-content-length: 288 Text-content-md5: 19487651d86bcc5e0a63a90803b1cbd3 Text-content-sha1: 1702689da8666030657e381ae58b9fdec44fa3bc Content-length: 327 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN k M1Vq/* $Id: macctrls.c,v 1.4 2003/03/18 23:41:14 beif (mac_gestalts.apprvers >= 0x110) { Boolean iscancel = ctrl->button.iscancel; SetControlData(mc->button.tbctrl, kControlEntireControl, kControlPushButtonCancelTag, sizeof(iscancel), &iscancel Revision-number: 2966 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2003-03-18T23:47:33.000000Z K 7 svn:log V 79 Add support for changing the contents of a pre-Appearance static text control. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 19487651d86bcc5e0a63a90803b1cbd3 Text-delta-base-sha1: 1702689da8666030657e381ae58b9fdec44fa3bc Text-content-length: 178 Text-content-md5: b9c66432ee570d376263ab3119e4702e Text-content-sha1: 8ac8d39512371212631888123cd04a323db35bb9 Content-length: 217 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNkQ},='Sc/* $Id: macctrls.c,v 1.5 2003/03/18 23:47:33 Str255 title else { c2pstrcpy(title, text); SetControlTitle(mc->text.tbctrl, title); } Revision-number: 2967 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 70 Add support for drawing a ring around the default button in System 7. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-19T00:40:15.000000Z PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f13bdb392906b42bc8f209f05a6cce2b Text-delta-base-sha1: 6402b3dab0cc6e8380d51a451a94123d624544a5 Text-content-length: 92 Text-content-md5: 30ea33b31558fffbff45756f039c773e Text-content-sha1: 164f1fa2376d34c497d87c7cd10e0404a041deac Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNL D ,//* $Id: mac_res.r,v 1.34 2003/03/19 00:40:15data 'CDEF' (CDEF_Defaul Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b9c66432ee570d376263ab3119e4702e Text-delta-base-sha1: 8ac8d39512371212631888123cd04a323db35bb9 Text-content-length: 862 Text-content-md5: d1e73fa22d46b016eea2c187197a2823 Text-content-sha1: f04ceb6fb554651d05189919ba9d8ac9872df74f Content-length: 901 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNQ/0 ,K= <;'okF=%k};/* $Id: macctrls.c,v 1.6 2003/03/19 00:40:15static pascal SInt32 macctrl_sys7_default_cdef(SInt16, ControlRef, cdef = (PatchCDEF)GetResource(kControlDefProcResourceType, CDEF_Default); (*cdef)->theUPP = NewControlDefProc(macctrl_sys7_defaul else if (ctrl->button.isdefault) { InsetRect(&bounds, -4, -4); NewControl(window, &bounds, title, TRUE, 0, 0, 1, SYS7_DEFAULT_PROC, (long)mc#if !TARGET_API_MAC_CARBON static pascal SInt32 macctrl_sys7_default_cdef(SInt16 variant, ControlRef control, ControlDefProcMessage msg, SInt32 param) { RgnHandle rgn; Rect rect; int oval { rect = (*control)->contrlRect; PenNormal(); PenSize(3, 3); oval = (rect.bottom - rect.top) / 2 + 2; FrameRoundRect(&rect, oval, oval); } Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0224f04f959f9ea8985477efd00f7ed9 Text-delta-base-sha1: 8c1fa27aed36d5be6f2fe682885d2332a7f7fcee Text-content-length: 128 Text-content-md5: b6e1834cf1485cf44e6861f5119f865c Text-content-sha1: 80e25c4e5f12a1cf7cb15466d2ab6a4a4cb245e9 Content-length: 168 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNB l-:/* $Id: macresid.h,v 1.12 2003/03/19 00:40:15#define CDEF_Default 129 #define SYS7_DEFAULT_PROC (CDEF_Defaul Revision-number: 2968 Prop-content-length: 220 Content-length: 220 K 8 svn:date V 27 2003-03-19T15:28:41.000000Z K 7 svn:log V 119 Chip Killian has helped me isolate at least one cause of SMB port forwarding failures. It'll be a pain to fix, though. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/winnet-if2lo Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2149 Text-content-md5: 3dd9136211ed89f160734dd459332c01 Text-content-sha1: d2162189aafdadb11aebb466e932aa46d283d528 Content-length: 2265 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNWWWSummary: PuTTY refuses connections to 127.0.0.1 from interface IP addresses Class: semi-bug Difficulty: tricky Priority: high Content-type: text/x-html-body

    There are persistent reports of PuTTY's port forwarding not working with SMB connections, although there are just as many reports of it working fine. Thanks to Chip Killian's report of this bug and some detective work with netstat, I think I've tracked down the cause of this problem.

    When PuTTY's network layer is asked to open a listening socket for connections from localhost only, it actively refuses any connections that don't come from a loopback source address. This was because I was told that at least some Windows systems implement "the weak end system model", in which any packet coming in to the system with a destination address the machine believes it has will be accepted. In other words, if I construct a packet with my own source address (say 10.1.2.3) and destination 127.0.0.1, and if I convince my IP layer to send it to your machine's Ethernet MAC address, then your machine might actually accept the connection, send back responses to my MAC address with 127.0.0.1 as the source address, and then I've managed to make a connection to one of your machine's internal services from outside. PuTTY's deliberate check that loopback connections come from an actual loopback address largely defeats this attack: if I put 127.0.0.1 as the source address of your packets, I might still get your machine to believe the first SYN, but all its replies will be sent internally and won't come back to me.

    Unfortunately, at least some versions of Windows connect to a SMB share on 127.0.0.1 in such a way that the source of the connection appears to be one of the machine's other IP addresses - and hence PuTTY will reject the connection and refuse to forward it.

    To fix this, I suppose PuTTY will need to find out what IP addresses the machine believes it owns, so that it can accept connections from any of those. If anyone wants to save me some manual-grubbing by letting me know how to do that conveniently, it would be helpful. Revision-number: 2969 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2003-03-20T22:12:12.000000Z K 7 svn:log V 64 Mention xterm mouse reporting in the section on copy and paste. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 46eea388b42ab62d191810195db62dff Text-delta-base-sha1: 4f023f8c9064e36546cf98c7ed31d3924cca3805 Text-content-length: 397 Text-content-md5: c93ecb2c9cac5743b423dbb76ac6fbea Text-content-sha1: f71fc39aebf8110bb96fef8353d2ac9806d67ced Content-length: 437 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN>q<:9s\versionid $Id: using.but,v 1.13 2003/03/20 22:12:12 benIt's possible for the server to ask to handle mouse clicks in the PuTTY window itself. If this happens, the mouse cursor will turn into an arrow, and copy and paste will only work if you hold down Shift. See \k{config-features-mouse} and \k{config-mouseshift} for details of this feature and how to configure it Revision-number: 2970 Prop-content-length: 279 Content-length: 279 K 8 svn:date V 27 2003-03-20T23:15:25.000000Z K 7 svn:log V 180 Pass a pointer to the entire dialog box structure to event handlers, rather than just the individual control pointer, because otherwise event handlers can't modify other controls. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d1e73fa22d46b016eea2c187197a2823 Text-delta-base-sha1: f04ceb6fb554651d05189919ba9d8ac9872df74f Text-content-length: 1069 Text-content-md5: 1bf2dd7e4f964a564bf192384ba69990 Text-content-sha1: 1981ed4f001c8943995718bc8a623dfc4148ded9 Content-length: 1108 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN/NIV>+z[oI3@vlnBnlcHcr|u/* $Id: macctrls.c,v 1.7 2003/03/20 23:15:2data, (event)); \ } while (0) #define findbyctrl(mcs, ctrl) \ find234((mcs)->byctrl, (ctrl), macctrl_cmp_byctrl_findstatic int macctrl_cmp_byctrl_find(void *av, void *bv) { union control *a = (union control *)av; union macctrl *b = (union macctrl *)bv; if (a < b->generic.ctrl) return -1; else if (afprintf(stderr, "pathname = %s\n", s->pathnamestruct macctrls *mcs = dlg; union macctrl *mc = findbyctrl(mcs, ctrl); int i; assert(mc != NULL);struct macctrls *mcs = dlg; union macctrl *mc = findbyctrl(mcs, ctrl); int i; assert(mc != NULL);struct macctrls *mcs = dlg; union macctrl *mc = findbyctrl(mcs, ctrl); assert(mc != NULL);struct macctrls *mcs = dlg; union macctrl *mc = findbyctrl(mcs, ctrl); assert(mc != NULL);struct macctrls *mcs = dlg; union macctrl *mc = findbyctrl(mcs, ctrl); Str255 title; assert(mc != NULL); Revision-number: 2971 Prop-content-length: 253 Content-length: 253 K 7 svn:log V 154 Add crude support for multiple panels in the config dialogue box. There's no way to switch between panels yet, though, so you're stuck on the first one. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-21T00:24:17.000000Z PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 23cbc6e415b6848cd679fe18860ef0c4 Text-delta-base-sha1: 180d81d0a0a36890edaa03242c0121edc8929f2d Text-content-length: 214 Text-content-md5: 316b14b27c98428bdfb696f415ddd7e6 Text-content-sha1: 617f40fe28f498c40ea9438c795155967c40555f Content-length: 254 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN5 >S> *union macctrl; struct macctrls { tree234 *byctrl; void *data; /* private data for config box */ unsigned int npanels; union macctrl **panels; /* lists of controls by panel Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1bf2dd7e4f964a564bf192384ba69990 Text-delta-base-sha1: 1981ed4f001c8943995718bc8a623dfc4148ded9 Text-content-length: 2331 Text-content-md5: 082e5db99e48ef75a84fd66187d1c34f Text-content-sha1: 0966485aca2d1bd9ff439a6f4235a9ad6ca8773c Content-length: 2370 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNN[Z3H,=p+N?wv;u*: +` 6\:\6\@HHZt/* $Id: macctrls.c,v 1.8 2003/03/21 00:24:17#include npanels = 1; for (i = 1; i < cb->nctrlsets; i++) if (strcmp(cb->ctrlsets[i]->pathname, cb->ctrlsets[i-1]->pathname)) mcs->npanels++; mcs->panels = smalloc(sizeof(*mcs->panels) * mcs->npanels); memset(mcs->panels, 0, sizeof(*mcs->panels) * mcs->npanels); curstate.panelnum = 0; for (i = 0; i < cb->nctrlsets; i++) { if (i > 0 && strcmp(cb->ctrlsets[i]->pathname, cb->ctrlsets[i-1]->pathname)) { curstate.pos.v = rect.top + 13; curstate.panelnum++; assert(curstate.panelnum < mcs->npanels); } macctrl_layoutset(&curstate, cb->ctrlsets[i], window, mcs); } macctrl_switchtopanel(mcs, 1switchtopanel(struct macctrls *mcs, unsigned int which) { unsigned int i, j; union macctrl *mc; /* Panel 0 is special and always visible. */ for (i = 1; i < mcs->npanels; i++) for (mc = mcs->panels[i]; mc != NULL; mc = mc->generic.next) switch (mc->generic.type) { case MACCTRL_TEXT: if (i == which) ShowControl(mc->text.tbctrl); else HideControl(mc->text.tbctrl); break; case MACCTRL_RADIO: for (j = 0; j < mc->generic.ctrl->radio.nbuttons; j++) if (i == which) ShowControl(mc->radio.tbctrls[j]); else HideControl(mc->radio.tbctrls[j]); break; case MACCTRL_CHECKBOX: if (i == which) ShowControl(mc->checkbox.tbctrl); else HideControl(mc->checkbox.tbctrl); break; case MACCTRL_BUTTON: if (i == which) ShowControl(mc->button.tbctrl); else HideControl(mc->button.tbctrl); break; mc->generic.next = mcs->panels[curstate->panelnum]; mcs->panels[curstate->panelnum] = mcmc->generic.next = mcs->panels[curstate->panelnum]; mcs->panels[curstate->panelnum] = mcmc->generic.next = mcs->panels[curstate->panelnum]; mcs->panels[curstate->panelnum] = mcmc->generic.next = mcs->panels[curstate->panelnum]; mcs->panels[curstate->panelnum] = mc sfree(mcs->panels); mcs->panels = NULL; } void dlg_update_start Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dbe48d705d86e751ed96e13a1732eb76 Text-delta-base-sha1: 55136ed18f06a02086c358323986fe3d281811f8 Text-content-length: 353 Text-content-md5: fcd5fd728f2ef7dda0b55d12685fe80f Text-content-sha1: 3268051fcb6675a37742681cc392f5a1262e2c22 Content-length: 393 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN~Cw+8^ u/* $Id: macdlg.c,v 1.15 2003/03/21 00:24:17_closedlg; SetWRefCon(s->settings_window, (long)wi); ShowWindow(s->settings_window); } static void mac_closedlg(WindowPtr window) { Session *s = mac_windowsession(window); macctrl_close(window); DisposeWindow(window); if (s->window == NULL) sfree(s); } Revision-number: 2972 Prop-content-length: 447 Content-length: 447 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-22T09:22:52.000000Z K 7 svn:log V 346 Fixed the bug whereby PuTTYgen went into generation mode as soon as it started up. The problem was that I was accepting _any_ event on IDC_GENERATE to trigger this, not just the `clicked' event, and some uninteresting event like `initialise' must have occurred. Quite why this only showed up as a result of the config box revamp I can't imagine. PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b8c5be4980a494bcfa05a25c47399874 Text-delta-base-sha1: 98458fc092e53e1a88f8779655d71eba593fc1d7 Text-content-length: 134 Text-content-md5: d3611d89de6b74fa14d022a4c7df55ff Text-content-sha1: 5cb6c1b13331965aa6d976666cfeb28f5c6abb1c Content-length: 174 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVN{h l<l@; if (HIWORD(wParam) != BN_CLICKED && HIWORD(wParam) != BN_DOUBLECLICKED) break; Revision-number: 2973 Prop-content-length: 194 Content-length: 194 K 8 svn:date V 27 2003-03-22T09:32:49.000000Z K 7 svn:log V 94 Make sure one of the Local/Remote port forwarding radio buttons actually starts off selected! K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f52ea8672bb0b94393682f09bd236cab Text-delta-base-sha1: 1d54ecfa80f6c8f98e350af9950e91c497d74d25 Text-content-length: 143 Text-content-md5: ba3d090677589ab5af1dd90295b58d55 Text-content-sha1: 5c4e545560b3fa49e6f2e4026d9c59877121e2e5 Content-length: 183 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNhat1t<, else if (ctrl == pfd->direction) { /* * Default is Local. */ dlg_radiobutton_set(ctrl, dlg, 0 Revision-number: 2974 Prop-content-length: 661 Content-length: 661 K 8 svn:date V 27 2003-03-22T09:49:20.000000Z K 7 svn:log V 560 Yikes - saving of Default Settings must have been broken for some time! The load code in settings.c was translating an empty string into "Default Settings" to pass to {win,ux}store, whereas the save code was passing the empty string straight down and expecting it to be dealt with. So, a policy decision: the precise name of the "Default Settings" special session _at the storage level_ is up to the individual platform storage code to decide, and all platforms MUST assume Default Settings is meant if they receive NULL or the empty string as a session name. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 837e783bbcba2ab7176b744edbc357ab Text-delta-base-sha1: 05115d02b05d43b309a0641425350c36d9dd10a7 Text-content-length: 77 Text-content-md5: ffbdc0cfb6d33eb793235f15b536404a Text-content-sha1: 3a27595291c686d795da4938ec88206781d00e21 Content-length: 118 K 15 cvs2svn:cvs-rev V 5 1.105 PROPS-END SVN]/ 4W$9load_settings(session, (session != NULL && *session) Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eac6992c707392a56602001192da1fe1 Text-delta-base-sha1: 4e157363671272078a3fa70ce47488225b8897c0 Text-content-length: 166 Text-content-md5: a6b701466d1f3fe41e4ccd89f80f8560 Text-content-sha1: f27a140b17c280330bb6018b1f9d745f47bedc55 Content-length: 206 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNMc0Dy)D2if (!sessionname || !*sessionname) sessionname = "Default Settings"if (!sessionname || !*sessionname) sessionname = "Default Settings" Revision-number: 2975 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 2003-03-22T10:05:10.000000Z K 7 svn:log V 198 Windows file selectors contain an edit box as well as the Browse button; we must send EVENT_VALCHANGE when the edit box is manually changed as well as when the file selector successfully completes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8a27821a5bd9bffc5844000013e85000 Text-delta-base-sha1: ee29fb5b8bcef76aa16eec89169aa14898dbd112 Text-content-length: 62 Text-content-md5: b0073fd5aa18882b69dc6c6bcde7377f Text-content-sha1: ac7819727a7590eb2ee5fea6141ec7907c6bd31e Content-length: 102 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN 6d4V6msg == WM_COMMAND && id == 1 && Revision-number: 2976 Prop-content-length: 486 Content-length: 486 K 8 svn:date V 27 2003-03-22T10:36:28.000000Z K 7 svn:log V 385 Fiddle with the cmdline_saved mechanism: the `-load' option is now never deferred, but is evaluated instantly. This _should_ fix all the irritating problems with (for example) proxy settings and saved sessions not playing nicely. Or it may have some other ghastly side- effect I haven't considered; really I ought to have been keeping better track of all the problems in this area :-( K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cf7e4630937c45347d1516d127e1a159 Text-delta-base-sha1: 097722fc0de638cc9036a16e9a23fb4c4b0aea55 Text-content-length: 627 Text-content-md5: 9719618a461f86e872d2ae0dd431bec9 Text-content-sha1: d0ed1f71c4ae5ac049a5c599057098b197b8cafd Content-length: 667 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNglny{qL 7ACDBJ/ =mEN36w9x1z*{%t!#o8p(N * (In fact -load is not saved at all, since in at least Plink the * processing of further command-line options depends on whether or * not the loaded session contained a hostname. So it must be * executed immediately.) */ #define NPRIORITIES 2/* This parameter must be processed immediately rather than being * saved.00000001000000); cfg->nopty = 1; } if (!strcmp(p, "-C")) { RETURN(1); SAVEABLE(0); cfg->compression = 1; } if (!strcmp(p, "-1")) { RETURN(1); SAVEABLE(000 Revision-number: 2977 Prop-content-length: 228 Content-length: 228 K 8 svn:date V 27 2003-03-22T10:43:42.000000Z K 7 svn:log V 127 This is no longer considered a bug, but the behaviour has not become what the original bug description suggested it should be. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/cmdline-host-override Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 722f0ee767e8618536e0ee34c1bf3db5 Text-delta-base-sha1: b6c0f40071afe41ea8d7f54fd3d5d147ee3d9c51 Text-content-length: 930 Text-content-md5: b6d13e6a0c6c4d39f3d026a33d905f82 Text-content-sha1: e4292697cf807122bd6f88a63d1c7133c3bb750c Content-length: 969 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN v uFixed-in: 2003-03-23

    SGT, 2003-03-22: Well, -load is now processed immediately rather than being deferred until cmdline_process_saved(). This should eliminate this sort of bug completely. However, the effect on Plink host names isn't exactly what I stated above; instead, specifying a -load option that mentions a host name actually prevents Plink from looking for an explicit host name. The upshot of this is that the command plink -load session host will connect to the host specified in the saved session, and interpret "host" as the command to run.

    It's possible that some people really do have a need to load a saved session and override only its host name component, but I think this behaviour is more generally useful. If anyone complains I can always add an explicit -host command-line option. Revision-number: 2978 Prop-content-length: 543 Content-length: 543 K 8 svn:date V 27 2003-03-22T11:07:59.000000Z K 7 svn:log V 442 The GTK colour selector does not provide full 8-bit resolution in the RGB values (it deals in floats with 2 d.p. instead). Hence I've replaced the static RGB text item in the Colours panel with three little edit boxes, so that a user can type in exact 0-255 RGB values if necessary. This should have the additional advantage of being quicker than faffing with the colour selector if you already know exactly what you want and are in a hurry! K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ba3d090677589ab5af1dd90295b58d55 Text-delta-base-sha1: 5c4e545560b3fa49e6f2e4026d9c59877121e2e5 Text-content-length: 1402 Text-content-md5: 92c3cc6676e4b9fb6213e4493942cd5b Text-content-sha1: 8db3f45649445aa6c14650b5ff29d9542dd65b49 Content-length: 1442 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNaT+AghMa`#\edit, *gedit, *bedieditbox_set(cd->redit, dlg, ""); dlg_editbox_set(cd->gedit, dlg, ""); dlg_editbox_set(cd->bediVALCHANGE) { if (ctrl == cd->redit || ctrl == cd->gedit || ctrl == cd->bedit) { /* The user has changed the colour using the edit boxes. */ char buf[80]; int i, cval; dlg_editbox_get(ctrl, dlg, buf, lenof(buf)); cval = atoi(buf) & 255; i = dlg_listbox_index(cd->listbox, dlg); if (i >= 0) { if (ctrl == cd->redit) cfg->colours[i][0] = cval; else if (ctrl == cd->gedit) cfg->colours[i][1] = cval; else if (ctrl == cd->bedit) cfg->colours[i][2] = cval; }d", r); dlg_editbox_set(cd->redit, dlg, buf); sprintf(buf, "%d", g); dlg_editbox_set(cd->gedit, dlg, buf); sprintf(buf, "%d", b); dlg_editbox_set(cd->bedid->listbox->listbox.height = 7; c = ctrl_text(s, "RGB value:", HELPCTX(colours_config)); c->generic.column = 1; cd->redit = ctrl_editbox(s, "Red", 'r', 50, HELPCTX(colours_config), colour_handler, P(cd), P(NULL)); cd->redit->generic.column = 1; cd->gedit = ctrl_editbox(s, "Green", 'n', 50, HELPCTX(colours_config), colour_handler, P(cd), P(NULL)); cd->gedit->generic.column = 1; cd->bedit = ctrl_editbox(s, "Blue", 'e', 50, HELPCTX(colours_config), colour_handler, P(cd), P(NULL)); cd->bedi Revision-number: 2979 Prop-content-length: 627 Content-length: 627 K 8 svn:date V 27 2003-03-22T17:00:06.000000Z K 7 svn:log V 526 Various cosmetic fixes to the GTK config box: vertical alignment of edit box labels, Left/Right on the treeview to collapse and expand branches, a window title, and the best treatment of wrapping text widgets I could think of within the product-order-oriented GTK layout model. I think this thing is now pretty much as good as it's going to get before GTK v2 (which should fix one or two remaining minor nasties which I really couldn't be bothered to work around in GTK 1.2), so the next step is to actually start _using_ it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 60c0944353e285c1e5ce1ad526037167 Text-delta-base-sha1: 5de26047b42a56208e056a806c832e9704a7ea41 Text-content-length: 5506 Text-content-md5: a8d59fb34a88738f1e799b9138b12103 Text-content-sha1: e7ea820b7ed574757f460670b57a7ede4ed7dca9 Content-length: 5545 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNMzI*S3^&KI|sA@1oB!h4l@mUwuv9dv|  G93Z)g2MS) s* s*T3T<W wew=t1 guint textsig;TREE, /* focus a tree itemstatic void label_sizealloc(GtkWidget *widget, GtkAllocation *alloc, struct uctrl *uc = dlg_find_bywidget(dp, widget); gtk_widget_set_usize(uc->text, alloc->width, -1); gtk_label_set_text(GTK_LABEL(uc->text), uc->ctrl->generic.label); gtk_signal_disconnect(GTK_OBJECT(uc->text), uc->textsig); } /* 0 { GtkRequisition req; if (ctrl->editbox.has_list) { w = gtk_combo_new(); gtk_combo_set_value_in_list(GTK_COMBO(w), FALSE, TRUE); uc->entry = GTK_COMBO(w)->entry; uc->list = GTK_COMBO(w)->list; } else { w = gtk_entry_new(); if (ctrl->editbox.password) gtk_entry_set_visibility(GTK_ENTRY(w), FALSE); uc->entry = w; } gtk_signal_connect(GTK_OBJECT(uc->entry), "changed", GTK_SIGNAL_FUNC(editbox_changed), dp);focus_in_event", GTK_SIGNAL_FUNC(widget_focus), dp); /* * Edit boxes, for some strange reason, have a minimum * width of 150 in GTK 1.2. We don't want this - we'd * rather the edit boxes acquired their natural width * from the column layout of the rest of the box. * * Also, while we're here, we'll squirrel away the * edit box height so we can use that to centre its * label vertically beside it. */ if (ctrl->generic.label) { GtkWidget *label, *container; label = gtk_label_new(ctrl->generic.label); shortcut_add(scs, label, ctrl->editbox.shortcut, SHORTCUT_FOCUS, uc->entry); container = columns_new(4); if (ctrl->editbox.percentwidth == 100) { columns_add(COLUMNS(container), label, 0, 1); columns_force_left_align(COLUMNS(container), label); columns_add(COLUMNS(container), w, 0, 1); } else { gint percentages[2]; percentages[1] = ctrl->editbox.percentwidth; percentages[0] = 100 - ctrl->editbox.percentwidth; columns_set_cols(COLUMNS(container), 2, percentages); columns_add(COLUMNS(container), label, 0, 1); columns_force_left_align(COLUMNS(container), label); columns_add(COLUMNS(container), w, 1, 1); /* Centre the label vertically. */ gtk_widget_set_usize(label, -1, req.height); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); } gtk_widget_show(label); gtk_widget_show(w); w = container; } gtk_signal_connect(GTK_OBJECT(uc->entry), "focus_out_event", GTK_SIGNAL_FUNC(editbox_lostfocus), dp); } /* * Wrapping text widgets don't sit well with the GTK * layout model, in which widgets state a minimum size * and the whole window then adjusts to the smallest * size it can sensibly take given its contents. A * wrapping text widget _has_ no clear minimum size; * instead it has a range of possibilities. It can be * one line deep but 2000 wide, or two lines deep and * 1000 pixels, or three by 867, or four by 500 and so * on. It can be as short as you like provided you * don't mind it being wide, or as narrow as you like * provided you don't mind it being tall. * * Therefore, it fits very badly into the layout model. * Hence the only thing to do is pick a width and let * it choose its own number of lines. To do this I'm * going to cheat a little. All new wrapping text * widgets will be created with a minimal text content * "X"; then, after the rest of the dialog box is set * up and its size calculated, the text widgets will be * told their width and given their real text, which * will cause the size to be recomputed in the y * direction (because many of them will expand to more * than one line). */ uc->text = w = gtk_label_new("X" uc->textsig = gtk_signal_connect(GTK_OBJECT(w), "size-allocate", GTK_SIGNAL_FUNC(label_sizealloc), dp);static int tree_grab_focus(struct dlgparam *dp) { int i, freturn tree_grab_focus(dpTREE: tree_grab_focus(dp); break;dir, i, j = -1; for (i = 0; i < dp->ntreeitems; i++) if (widget == dp->treeitems[i]) break; if (i < dp->ntreeitems) { if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up) dir = -1; else dir = +1; while (1) { i += dir; if (i < 0 || i >= dp->ntreeitems) break; /* nothing in that dir to select */ /* * Determine if this tree item is visible. */ { GtkWidget *w = dp->treeitems[i]; int vis = TRUE; while (w && GTK_IS_TREE_ITEM(w) || GTK_IS_TREE(w)) { if (!GTK_WIDGET_VISIBLE(w)) { vis = FALSE; break; } w = w->parent; } if (vis) { j = i; /* got one */ break; } } } /* * It's nice for Left and Right to expand and collapse tree * branches. */ if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left) { gtk_tree_item_collapse(GTK_TREE_ITEM(widget)); return TRUE; } if (event->keyval == GDK_Right || event->keyval == GDK_KP_Right) { gtk_tree_item_expand(GTK_TREE_ITEM(widget)); return TRUE; } return FALSE;const char *titlegtk_window_set_title(GTK_WINDOW(window), titleTREE../{misc,tree234,be_none}.c ux{store,misc,print,cfg}.c \ -I. -I.. -I../charset -DTESTMODE `gtk-config --cflags --libs` "PuTTY Configuration" Node-path: putty/unix/gtkpanel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: be494049fa7f60bdd3f8a93721bc8cae Text-delta-base-sha1: 7e15ba2fe31a0046fd32cb02ec93954f8079b5d3 Text-content-length: 20 Text-content-md5: 98ef9a8aa8745584f560c4086798838c Text-content-sha1: 1bdf190a379d9f77bed95d11baefbaebb78dde01 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNFQ zWo Revision-number: 2980 Prop-content-length: 305 Content-length: 305 K 8 svn:date V 27 2003-03-23T14:11:39.000000Z K 7 svn:log V 206 Add support for pop-up menus (drop-down lists in Windows parlance). For some reason, these explode horribly with the Appearance Manager present, but work fine in bare System 7. Investigations are ongoing. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 082e5db99e48ef75a84fd66187d1c34f Text-delta-base-sha1: 0966485aca2d1bd9ff439a6f4235a9ad6ca8773c Text-content-length: 5917 Text-content-md5: 7d31a33810bd118e38acf932ba3ec167 Text-content-sha1: 77f607126cc20cd735cb745eeae9bd9782a2ff24 Content-length: 5956 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN[:CKg,iTkVsGg s)!M2q.P=JR[@`j9#.d v% Ss@Lt2SsXs%r%RV:Tw*XsMsh/* $Id: macctrls.c,v 1.9 2003/03/23 14:11:39Menu/* Range of menu IDs for popup menus */ #define MENU_MIN 1024 #define MENU_MAX 2048 , MACCTRL_POPUP struct { struct macctrl_generic generic; ControlRef tbctrl; MenuRef menu; int menuid; unsigned int nids; int *ids; } popupstatic void macctrl_popup(struct macctrls *, WindowPtr, 20 case CTRL_LISTBOX: if (ctrl->listbox.height == 0) macctrl_popup(mcs, window, curstate, ctrl); break;static void macctrl_popuplabelwidth; static int nextmenuid; int menuid; MenuRef menu; /* * explains how to * create a popup menu with dynamic content. */ assert(ctrl->listbox.height == 0); assert(!ctrl->listbox.draglist); assert(!ctrl->listbox.multisel); fprintf(stderr, " label = %s\n", ctrl->listbox.label); fprintf(stderr, " percentwidth = %d\n", ctrl->listbox.percentwidth); mc->generic.type = MACCTRL_POPUP; mc->generic.ctrl = ctrl; c2pstrcpy(title, ctrl->button.label); /* Find a spare menu ID and create the menu */ while (GetMenuHandle(nextmenuid) != NULL) if (++nextmenuid >= MENU_MAX) nextmenuid = MENU_MIN; menuid = nextmenuid++; menu = NewMenu(menuid, "\pdummy"); if (menu == NULL) return; mc->popup.menu = menu; mc->popup.menuid = menuid; InsertMenu(menu, kInsertHierarchicalMenu); /* The menu starts off empty */ mc->popup.nids = 0; mc->popup.ids = NULL; 20; /* XXX handle percentwidth == 100 */ labelwidth = curstate->width * (100 - ctrl->listbox.percentwidth) / 100; mc->popup.tbctrl = NewControl(window, &bounds, title, TRUE, popupTitleLeftJust, menuid, labelwidth, popupMenuProc + popupFixedWidth, (long)mc); add234(mcs->byctrl, mc); curstate->pos.v += 26 { mc = (union macctrl *)GetControlReference(control); switch (mc->generic.type) { case MACCTRL_POPUP: TrackControl(control, mouse, (ControlActionUPP)-1); ctrlevent(mcs, mc, EVENT_SELCHANGE); case MACCTRL_RADIO: if (TrackControl(control, mouse, NULL) != 0) { for (i = 0; i < mc->generic.ctrl->radio.nbuttons; i++)ctrlevent(mcs, mc, EVENT_VALCHANGE); } break; case MACCTRL_CHECKBOX: if (TrackControl(control, mouse, NULL) != 0) { } break; case MACCTRL_BUTTON: if (TrackControl(control, mouse, NULL) != 0) ctrlevent(mcs, mc, EVENT_ACTION); break; } /* * Mostly, we don't bother disposing of the Toolbox controls, * since that will happen automatically when the window is * disposed of. Popup menus are an exception, because we have to * dispose of the menu ourselves, and doing that while the control * still holds a reference to it seems rude. */ while ((mc = index234(mcs->byctrl, 0)) != NULL) { switch (mc->generic.type) { case MACCTRL_POPUP: DisposeControl(mc->popup.tbctrl); DeleteMenu(mc->popup.menuid); DisposeMenu(mc->popup.menu); break; }static void dlg_macpopup_clearMenuRef menu = mc->popup.menu; unsigned int i, n; fprintf(stderr, " popup_clear\n"); n = CountMItems(menu); for (i = 0; i < n; i++) DeleteMenuItem(menu, n - i); mc->popup.nids = 0; sfree(mc->popup.ids); mc->popup.ids = NULL; SetControlMaximum(mc->popup.tbctrl, CountMItems(menu)); } void dlg_listbox_clear(union control *ctrl, void *dlg) { if (ctrl->listbox.height == 0) dlg_macpopup_clear(ctrl, dlg); } static void dlg_macpopup_del(union control *ctrl, void *dlg, int index MenuRef menu = mc->popup.menu; fprintf(stderr, " popup_del %d\n", index); DeleteMenuItem(menu, index + 1); if (mc->popup.ids != NULL) memcpy(mc->popup.ids + index, mc->popup.ids + index + 1, (mc->popup.nids - index - 1) * sizeof(*mc->popup.ids)); SetControlMaximum(mc->popup.tbctrl, CountMItems(menu)); } void dlg_listbox_del(union control *ctrl, void *dlg, int index) { if (ctrl->listbox.height == 0) dlg_macpopup_del(ctrl, dlg, index); } static void dlg_macpopup_addMenuRef menu = mc->popup.menu; Str255 itemstring; fprintf(stderr, " popup_add %s\n", text); assert(text[0] != '\0'); c2pstrcpy(itemstring, text); AppendMenu(menu, "\pdummy"); SetMenuItemText(menu, CountMItems(menu), itemstring); SetControlMaximum(mc->popup.tbctrl, CountMItems(menu)); } if (ctrl->listbox.height == 0) dlg_macpopup_add(ctrl, dlg, text); } static void dlg_macpopup_addwithindex(union control *ctrl, void *dlg, char const *text, int id MenuRef menu = mc->popup.menu; unsigned int index; fprintf(stderr, " popup_addwthindex %s, %d\n", text, id); dlg_macpopup_add(ctrl, dlg, text); index = CountMItems(menu) - 1; if (mc->popup.nids <= index) { mc->popup.nids = index + 1; mc->popup.ids = srealloc(mc->popup.ids, mc->popup.nids * sizeof(*mc->popup.ids)); } mc->popup.ids[index] = id; } void dlg_listbox_addwithindex(union control *ctrl, void *dlg, char const *text, int id) { if (ctrl->listbox.height == 0) dlg_macpopup_addwithindex(ctrl, dlg, text, id); } int dlg_listbox_getid(union control *ctrl, void *dlg, int indexif (ctrl->listbox.height == 0) { assert(mc->popup.ids != NULL && mc->popup.nids > index); return mc->popup.ids[index]; } return 0; } int dlg_listbox_index if (ctrl->listbox.height == 0) return GetControlValue(mc->popup.tbctrl) - 1;if (ctrl->listbox.height == 0) return GetControlValue(mc->popup.tbctrl) - 1 == index; return 0; }; void dlg_listbox_select(union control *ctrl, void *dlg, int indexif (ctrl->listbox.height == 0) SetControlValue(mc->popup.tbctrl, index + 1); Revision-number: 2981 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2003-03-24T10:49:01.000000Z K 7 svn:log V 143 The general blurb on using Plink in batch mode ought to mention the host key prompt, and specifically mention how to ensure it won't bite you. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 12064a6ea1e43d8de92d7117f2aaff83 Text-delta-base-sha1: a92b8e2ee0d4b3e6f3e3cf7c9a6edbdbe70e5e7b Text-content-length: 722 Text-content-md5: daea09df971b943b344b42c3512fe39c Text-content-sha1: f5efc4d18133db89b4bfe39d34c4a5f485f12f67 Content-length: 762 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNTV 9):t`\versionid $Id: plink.but,v 1.18 2003/03/24 10:49:01 simonNext, you are likely to need to avoid the various interactive prompts Plink can produce. You might be prompted to verify the host key of the server you're connecting to, to enter a user name, or to enter a password. To avoid being prompted for the server host key when using Plink for an automated connection, you should first make a \e{manual} connection (using either of PuTTY or Plink) to the same server, verify the host key (see \k{gs-hostkey} for more information), and select Yes to add the host key to the Registry. After that, Plink commands connecting to that server should not give a host key prompt unless the host key changes Revision-number: 2982 Prop-content-length: 111 Content-length: 111 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-24T11:22:03.000000Z K 7 svn:log V 13 More traces. PROPS-END Node-path: putty-wishlist/data/cygwin-clobbers-pageant Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f8d2085b8be103995814a0b1144bfa7 Text-delta-base-sha1: 89a1be16d76afd2d4b3ed92de34fc7e42e4cfe7d Text-content-length: 188 Text-content-md5: 0f5599592e4b6a4f4bc44aa083e3f8ca Text-content-sha1: 008ab06164a4b47dba46c9c32d8fa652ad0266eb Content-length: 227 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN 6) )

    There's a thread on the cygwin mailing list about this, though it's not very enlightening. Revision-number: 2983 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2003-03-24T21:55:51.000000Z K 7 svn:log V 87 Slightly improve radio button layout to more closely match the Mac OS 8 HI Guidelines. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7d31a33810bd118e38acf932ba3ec167 Text-delta-base-sha1: 77f607126cc20cd735cb745eeae9bd9782a2ff24 Text-content-length: 182 Text-content-md5: 283ea344102caf7e661b91b041d87ece Text-content-sha1: fd606fe6cbc19b7603bb8c27a928a7ebf9c711f5 Content-length: 222 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN:X"L,y|2Z0"wC/* $Id: macctrls.c,v 1.10 2003/03/24 21:55:51 - 2; bounds.bottom = bounds.top + 1818curstate->pos.v += 4; add234(mcs->byctrl, mc) Revision-number: 2984 Prop-content-length: 303 Content-length: 303 K 8 svn:date V 27 2003-03-24T22:41:38.000000Z K 7 svn:log V 204 Initialise the "next menu ID" counter for pop-up menus. This stops crashes on Mac OS 8. Also re-do support for activate events so as not to depend on embedding hierarchies, and thus to work on System 7. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 316b14b27c98428bdfb696f415ddd7e6 Text-delta-base-sha1: 617f40fe28f498c40ea9438c795155967c40555f Text-content-length: 40 Text-content-md5: bc18bab83a8379b7afb637ca50cd802d Text-content-sha1: a05cd2005dbdc6c94629a11ec328599e4fa46aa9 Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN7 ^FVsigned int curpanel Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 283ea344102caf7e661b91b041d87ece Text-delta-base-sha1: fd606fe6cbc19b7603bb8c27a928a7ebf9c711f5 Text-content-length: 1321 Text-content-md5: e64bace11380516413e3e9785dd09061 Text-content-sha1: e1b52cde575d055520ea54a6870a5e1dfc064308 Content-length: 1361 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNX DWL-yTv.v).W_ >r}ef>(jn/* $Id: macctrls.c,v 1.11 2003/03/24 22:41:380#define hideshow(c) do { \ if (i == which) ShowControl(c); else HideControl(c); \ } while (0) mcs->curpanel = which;hideshowhideshow(mc->radio.tbctrls[j]); break; case MACCTRL_CHECKBOX: hideshow(mc->checkbox.tbctrl); break; case MACCTRL_BUTTON: hideshow(mc->button.tbctrl); break; case MACCTRL_POPUP: hideshow(mc->popup.tbctrl); break; = MENU_MINstruct macctrls *mcs = mac_winctrls(window); Boolean active = (event->modifiers & activeFlag) != 0; GrafPtr saveport; int i, j; ControlPartCode state; union macctrl *mc; #if 0 ControlRef root; #endif#if 0 GetRootControl(window, &root); if (active) ActivateControl(root); else DeactivateControl(root); #endif } state = active ? kControlNoPart : kControlInactivePart; for (i = 0; i <= mcs->curpanel; i += mcs->curpanelHiliteControl(mc->text.tbctrl, stateHiliteControl(mc->radio.tbctrls[j], state); break; case MACCTRL_CHECKBOX: HiliteControl(mc->checkbox.tbctrl, state); break; case MACCTRL_BUTTON: HiliteControl(mc->button.tbctrl, state); break; case MACCTRL_POPUP: HiliteControl(mc->popup.tbctrl, state); break; Revision-number: 2985 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2003-03-24T22:46:11.000000Z K 7 svn:log V 35 Clean out some #ifdef'ed out junk. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e64bace11380516413e3e9785dd09061 Text-delta-base-sha1: e1b52cde575d055520ea54a6870a5e1dfc064308 Text-content-length: 84 Text-content-md5: e85968a8ca8229d7777029afa7e54b7d Text-content-sha1: e8dcc2505aebacbbfef5d900cc919d05d835935f Content-length: 124 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN f/&-k@d /* $Id: macctrls.c,v 1.12 2003/03/24 22:46:110) Revision-number: 2986 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:03.453667Z PROPS-END Revision-number: 2987 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2003-03-25T13:08:39.000000Z K 7 svn:log V 15 www.benbei.com K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a33eb79c9c6dd2fc75a1f2ab4518baec Text-delta-base-sha1: 4dd6b3757f7f74fad8b3339e8ab924c46fe08dbd Text-content-length: 92 Text-content-md5: 15f19cf0146dd12cde14252df9b93d11 Text-content-sha1: c501faea3140f8908a89dc610ea6aef4a16fb4f8 Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN]K FgF?li> www.benbei Revision-number: 2988 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:03.609184Z PROPS-END Revision-number: 2989 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:03.622791Z PROPS-END Revision-number: 2990 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:03.645444Z PROPS-END Revision-number: 2991 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:03.665508Z PROPS-END Revision-number: 2992 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:03.677195Z PROPS-END Revision-number: 2993 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:03.690959Z PROPS-END Revision-number: 2994 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:03.706333Z PROPS-END Revision-number: 2995 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2003-03-25T23:18:59.000000Z K 7 svn:log V 80 Add support for editbox controls on Mac OS 8, and for per-control private data. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3249989692e557eecbeb838ce28aa9a Text-delta-base-sha1: 3d92cb44ae38092b8de9847ced95cb616d39734e Text-content-length: 180 Text-content-md5: 32147af7f6c09689549c3e3bae92d254 Text-content-sha1: 86ea61c68f8abf796d3bb6de87fe9eb1bc53d4a7 Content-length: 220 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVNB@(K!eYi/* $Id: mac.c,v 1.56 2003/03/25 23:18:59Control if (mac_gestalts.apprvers >= 0x100 && mac_frontwindow() != NULL) IdleControls(mac_frontwindow() Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bc18bab83a8379b7afb637ca50cd802d Text-delta-base-sha1: a05cd2005dbdc6c94629a11ec328599e4fa46aa9 Text-content-length: 48 Text-content-md5: b832f25e25906cfbff728f952e1d22fd Text-content-sha1: d45f6d3cb20284b8765cd635b64d266d62d170df Content-length: 88 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVN7y tjMWindowPtr window;key Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e85968a8ca8229d7777029afa7e54b7d Text-delta-base-sha1: e8dcc2505aebacbbfef5d900cc919d05d835935f Text-content-length: 4540 Text-content-md5: b0e1626e2ab1259eed5908dfc1d0089a Text-content-sha1: c8da419f888278ae2b700e571543b6e8e9968d08 Content-length: 4580 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNfn?-ZuUReditboxmc->generic.privdata = NULLeditbox(struct macctrls *mcs, WindowPtr window, struct mac_layoutstate *curstate, fprintf(stderr, " label = %s\n", ctrl->editbox.label); fprintf(stderr, " percentwidth = %d\n", ctrl->editbox.percentwidth); if (ctrl->editbox.password) fprintf(stderr, " password\n"); if (ctrl->editbox.has_list) fprintf(stderr, " has list\n"); mc->generic.type = MACCTRL_EDITBOX; mc->generic.ctrl = ctrl; mc->generic.privdata = NULL + 2; bounds.bottom = bounds.top + 18; if (mac_gestalts.apprvers >= 0x100) { mc->text.tbctrl = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, ctrl->editbox.password ? kControlEditTextPasswordProc : kControlEditTextProc, (long)mc); curstate->pos.v += 28; add234(mcs->byctrl, mc); mc->generic.next = mcs->panels[curstate->panelnum]; mcs->panels[curstate->panelnum] = mc; ctrlevent(mcs, mc, EVENT_REFRESH); } else { /* Do a System 7 version */ } }generic.privdata = NULLmc->generic.privdata = NULLmc->generic.privdata = NULLmc->generic.privdata = NULLEDITBOX: HiliteControl(mc->editbox.tbctrl, state, trackresult; GrafPtr saveport; union macctrl *mc; struct macctrls *mcs = mac_winctrls(window); int i; UInt32 featuresif (mac_gestalts.apprvers >= 0x100) { if (GetControlFeatures(control, &features) == noErr && (features & kControlSupportsFocus) && (features & kControlGetsFocusOnClick)) SetKeyboardFocus(window, control, part); trackresult = HandleControlClick(control, mouse, event->modifiers, (ControlActionUPP)-1); } else trackresult = TrackControl(control, mouse, (ControlActionUPP)-1);RADIO: if (trackresulttrackresulttrackresult != 0) ctrlevent(mcs, mc, EVENT_ACTION); break; case MACCTRL_POPUP: ctrlevent(mcs, mc, EVENT_SELCHANGE); break; } } SetPort(saveport); } void macctrl_key(WindowPtr window, EventRecord *event) { ControlRef control; struct macctrls *mcs = mac_winctrls(window); union macctrl *mc; if (mac_gestalts.apprvers >= 0x100 && GetKeyboardFocus(window, &control) == noErr && control != NULL) { HandleControlKey(control, (event->message & keyCodeMask) >> 8, event->message & charCodeMask, event->modifiers); mc = (union macctrl *)GetControlReference(control); ctrlevent(mcs, mc, EVENT_VALCHANGE); }if (mc->generic.privdata != NULL && mc->generic.freeprivdata) sfree(mc->generic.privdata); struct macctrls *mcs = dlg; union macctrl *mc; if (ctrl == NULL) return; /* FIXME */ mc = findbyctrl(mcs, ctrl); assert(mc != NULL); ctrlevent(mcs, mc, EVENT_REFRESH); }; void *dlg_get_privdataassert(mc != NULL); return mc->generic.privdata; } void dlg_set_privdata(union control *ctrl, void *dlg, void *ptrassert(mc != NULL); mc->generic.privdata = ptr; mc->generic.freeprivdata = FALSEassert(mc != NULL); mc->generic.privdata = smalloc(size); mc->generic.freeprivdata = TRUE; return mc->generic.privdata GrafPtr saveport; assert(mc != NULL); assert(mc->generic.type == MACCTRL_EDITBOX); if (mac_gestalts.apprvers >= 0x100) { SetControlData(mc->editbox.tbctrl, kControlEntireControl, ctrl->editbox.password ? kControlEditTextPasswordTag : kControlEditTextTextTag, strlen(text), text); GetPort(&saveport); SetPort((GrafPtr)(GetWindowPort(mcs->window))); DrawOneControl(mc->editbox.tbctrl); SetPort(saveport); } Size olen; assert(mc != NULL); assert(mc->generic.type == MACCTRL_EDITBOX); if (mac_gestalts.apprvers >= 0x100) { if (GetControlData(mc->editbox.tbctrl, kControlEntireControl, ctrl->editbox.password ? kControlEditTextPasswordTag : kControlEditTextTextTag, length - 1, buffer, &olen) != noErr) olen = 0; if (olen > length - 1) buffer[length - 1] = '\0'; else buffer[olen] = '\0'; buffer[olen] = '\0'; } else buffer[0] = '\0'; fprintf(stderr, "dlg_editbox_get: %s\n", buffer); strlen(text), text Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fcd5fd728f2ef7dda0b55d12685fe80f Text-delta-base-sha1: 3268051fcb6675a37742681cc392f5a1262e2c22 Text-content-length: 83 Text-content-md5: cd1c8760da17be5fd5563f5a4af40a3f Text-content-sha1: 445b0d35bd2071de3096346f5caa6bc70fc1db13 Content-length: 123 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN~ =Q+ r/* $Id: macdlg.c,v 1.16 2003/03/25 23:18:59key = &macctrl_key Revision-number: 2996 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2003-03-25T23:23:03.000000Z K 7 svn:log V 91 Use CountMenuItems() rather than CountMItems() since the latter isn't available in Carbon. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b0e1626e2ab1259eed5908dfc1d0089a Text-delta-base-sha1: c8da419f888278ae2b700e571543b6e8e9968d08 Text-content-length: 191 Text-content-md5: 3e1e3dd037eea65280fd7761d8414e25 Text-content-sha1: e254b0fa437af4cd7fc52f0efb1d70b2ea1a4c13 Content-length: 231 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN0*_-A nM,;N/WG/* $Id: macctrls.c,v 1.14 2003/03/25 23:23:03enuenuenuenuItems(menu), itemstring); SetControlMaximum(mc->popup.tbctrl, CountMenuenu Revision-number: 2997 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2003-03-25T23:45:56.000000Z K 7 svn:log V 128 Rename dlg_listbox_addwithindex() to dlg_listbox_addwithid(), since the old name was, not to put too fine a point on it, wrong. K 10 svn:author V 3 ben PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 92c3cc6676e4b9fb6213e4493942cd5b Text-delta-base-sha1: 8db3f45649445aa6c14650b5ff29d9542dd65b49 Text-content-length: 135 Text-content-md5: 09e6af6702c6c25261ba49f9d066f398 Text-content-sha1: 8b8a2261dd72aeb6471487335c13da1208a328c2 Content-length: 175 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNTHh@)Dgw]dd(ctrl, dlg, "Auto", AUTO); dlg_listbox_addwithid(ctrl, dlg, "Off", FORCE_OFF); dlg_listbox_addwithid Node-path: putty/dialog.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 22965be9b24f014cfef00608e13dea50 Text-delta-base-sha1: 9a6722f8c6a531c27615694fc6b3672140c8dd71 Text-content-length: 62 Text-content-md5: aaff503efc040f6a927857f7610d46bd Text-content-sha1: 980867aeef86848343d530f13c37682ab7513bdf Content-length: 101 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNRL %Ad(union control *ctrl, void *dlg, Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e1e3dd037eea65280fd7761d8414e25 Text-delta-base-sha1: e254b0fa437af4cd7fc52f0efb1d70b2ea1a4c13 Text-content-length: 213 Text-content-md5: 3b580ec4fa10e7139a0f06ad3bafc778 Text-content-sha1: db4edd92addc8a9ee6941b02af6fb1e684802254 Content-length: 253 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN0!(W-0Yn}9w/* $Id: macctrls.c,v 1.15 2003/03/25 23:45:56d(union control *ctrl, void *dlg, d(union control *ctrl, void *dlg, d(ctrl, dlg, text, id); } int dlg_listbox_getid Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a8d59fb34a88738f1e799b9138b12103 Text-delta-base-sha1: e7ea820b7ed574757f460670b57a7ede4ed7dca9 Text-content-length: 105 Text-content-md5: 124d732594420f348583caf47885c70a Text-content-sha1: 1db7ddb4b1f18bef7c7f457737fda3da681d2250 Content-length: 144 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNzqAmmq@h>{T&dd(union control *ctrl, void *dlg, char const *text, int id Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b0073fd5aa18882b69dc6c6bcde7377f Text-delta-base-sha1: ac7819727a7590eb2ee5fea6141ec7907c6bd31e Text-content-length: 62 Text-content-md5: b3f828849c4f74fea766c53d2520a4b6 Text-content-sha1: 9c1246b7e36c7ced3f641066f336de7bf21e1139 Content-length: 102 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN % [4d(union control *ctrl, void *dlg, Revision-number: 2998 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:04.217444Z PROPS-END Revision-number: 2999 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2003-03-26T14:33:38.000000Z K 7 svn:log V 41 Summary: DECCOLM should clear the screen K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/deccolm-cls Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 297 Text-content-md5: 09f1123946a6407966d698373c9c0e93 Text-content-sha1: 537f57344763402aad64e03a98cd68f789c104b4 Content-length: 413 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: DECCOLM should clear the screen Class: bug Priority: medium Difficulty: fun Present-in: 0.53b Content-type: text/plain DECCOLM sequences (CSI ? 3 h and CSI ? 3 l) should also clear the screen and home the cursor. They don't in PuTTY, but they do in xterm, and on a VT420. Revision-number: 3000 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 46 Summary: PuTTY's response to DA is suboptimal K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-26T14:55:49.000000Z PROPS-END Node-path: putty-wishlist/data/da-response Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 596 Text-content-md5: 2540036bf7946620a556a4d32bb2c616 Text-content-sha1: 593384f58fb325135c415bc1b5ac0821d8679bbf Content-length: 712 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNFFFSummary: PuTTY's response to DA is suboptimal Class: semi-bug Priority: medium Difficulty: fun Present-in: 0.53b 2003-03-25 Content-type: text/plain At present, PuTTY's default response to DA (CSI c) is CSI ? 6 c, which denotes a VT102. This is slightly inconsistent with xterm, which returns CSI ? 1 ; 2 c -- a VT100 with AVO. Since PuTTY supports quite a few VT400 options, I suspect it would be more sensible for it to return something in the 6x range, perhaps based on the current compatibility level set by DECSCL. Maybe it should even be configurable -- it is on a VT420. Revision-number: 3001 Prop-content-length: 319 Content-length: 319 K 8 svn:date V 27 2003-03-26T21:14:39.000000Z K 7 svn:log V 220 DECCOLM should clear the screen and home the cursor, so it does now. Correct interactions with DECOM and DECSTBM not investigated. Should fix bug "deccolm-cls", but I'll leave it open till I've checked the interactions. K 10 svn:author V 3 ben PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0bca43cd40e6062bf3dfa6be20b6d158 Text-delta-base-sha1: 9acd0a30b30d5140a58fe60a183bee6346bfa50b Text-content-length: 340 Text-content-md5: 1b4157879f51db06f4e0d8d455e4a5e4 Text-content-sha1: ee20df54aa7e3065aba9480cbc09a5c4905128d9 Content-length: 381 K 15 cvs2svn:cvs-rev V 5 1.145 PROPS-END SVNE->erase_lots(term, FALSE, TRUE, TRUE); /* XXX Interaction with DECOM? DECSTBM? */ move(term, 0, 0, 0); term->seen_disp_event = 1ZoZ normal selection mode this means we need a * newline at the end)... */ if (!(ldata[term->cols] & LATTR_WRAPPED)) { while (((ldata[nlpos.x Revision-number: 3002 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2003-03-26T21:15:59.000000Z K 7 svn:log V 17 Partially fixed. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/deccolm-cls Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 09f1123946a6407966d698373c9c0e93 Text-delta-base-sha1: 537f57344763402aad64e03a98cd68f789c104b4 Text-content-length: 141 Text-content-md5: f9a08fcba03dd5033bdc4d1cf83cc501 Text-content-sha1: 88bd364045cf263ba71cf7644c61c56c372e1544 Content-length: 180 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN\|`|As of 2003-03-27, they do so in PuTTY, but the precise interaction with DECOM and DECSTBM needs checking against a real VT. Revision-number: 3003 Prop-content-length: 201 Content-length: 201 K 7 svn:log V 102 Revert last change. It seems to cause crashes when DECCOLM actually changes the width of the window. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-26T23:13:41.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1b4157879f51db06f4e0d8d455e4a5e4 Text-delta-base-sha1: ee20df54aa7e3065aba9480cbc09a5c4905128d9 Text-content-length: 195 Text-content-md5: 0bca43cd40e6062bf3dfa6be20b6d158 Text-content-sha1: 9acd0a30b30d5140a58fe60a183bee6346bfa50b Content-length: 236 K 15 cvs2svn:cvs-rev V 5 1.146 PROPS-END SVNE&Z normal selection mode this means we need a * newline at the end)... */ if (!(ldata[term->cols] & LATTR_WRAPPED)) { while (((ldata[nlpos.x oZZ Revision-number: 3004 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2003-03-26T23:19:59.000000Z K 7 svn:log V 95 I had to reverse the fix, but I have a better idea of the interaction with other features now. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/deccolm-cls Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f9a08fcba03dd5033bdc4d1cf83cc501 Text-delta-base-sha1: 88bd364045cf263ba71cf7644c61c56c372e1544 Text-content-length: 178 Text-content-md5: cbb2b63d2262320244bebcf62a23d4d5 Text-content-sha1: ad20bd93897d3b4926be6eb39bc7ffd576923526 Content-length: 217 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN\`In PuTTY they don't. It also appears that they should reset the scrolling region established by DECSTBM. I wonder whether there's anything else they affect. Revision-number: 3005 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2003-03-26T23:52:21.000000Z K 7 svn:log V 52 Get preferred and minimum sizes in the right order. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 30ea33b31558fffbff45756f039c773e Text-delta-base-sha1: 164f1fa2376d34c497d87c7cd10e0404a041deac Text-content-length: 130 Text-content-md5: 87faef0b521b4d47ec19645b8648f98c Text-content-sha1: c4a350e5264d0c04add2d2bbdf2eddaf9a07b3ae Content-length: 170 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN i$,t /* $Id: mac_res.r,v 1.35 2003/03/26 23:52:212048 * 1024, /* Preferred size */ 1024 * 1024, /* Minimum Revision-number: 3006 Prop-content-length: 457 Content-length: 457 K 8 svn:date V 27 2003-03-27T00:22:59.000000Z K 7 svn:log V 358 DECCOLM fix, take 2. It turns out that my last fix wasn't causing crashes, but PuTTY was running out of memory, which is both easy and fatal under Mac OS at present. Having fixed that, I've re-instated the screen-clearing and cursor-homing on DECCOLM, and added resetting the scroll region, since this seems to help VTL's keypad diagram display correctly. K 10 svn:author V 3 ben PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0bca43cd40e6062bf3dfa6be20b6d158 Text-delta-base-sha1: 9acd0a30b30d5140a58fe60a183bee6346bfa50b Text-content-length: 352 Text-content-md5: 8f6ff1926d31d9053bc23954a3eaa845 Text-content-sha1: 79f651d83a6f92090f8ffd61d5cfc0f2a8d11e48 Content-length: 393 K 15 cvs2svn:cvs-rev V 5 1.147 PROPS-END SVNE'>term->alt_t = term->marg_t = 0; term->alt_b = term->marg_b = term->rows - 1; move(term, 0, 0, 0); erase_lots(term, FALSE, TRUE, TRUE)ZuZuse in normal selection mode this means we need a * newline at the end)... */ if (!(ldata[term->cols] & LATTR_WRAPPED)) { while (((ldata[nlpos.x Revision-number: 3007 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2003-03-27T11:19:33.000000Z K 7 svn:log V 44 Indicate we've made a bit of progress here. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/port-wince Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8d03870f035a2eef973359b8370ce0ea Text-delta-base-sha1: 5ac570954aabd2ba904c80da84fce3d36ee38587 Text-content-length: 282 Text-content-md5: ea28a35010d5983252b0af3e78e18424 Text-content-sha1: 83d8679dbc6786a4ca3f7b9430cecbf38fa65929 Content-length: 321 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNq_Wricky Content-type: text/x-html-body

    Despite sharing large parts of the Windows API, WinCE doesn't appear to be significantly easier to port to than a totally different operating system. A port is in the pipeline, although it's only in its early stages yet. Revision-number: 3008 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 36 I think this is properly fixed now. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-27T14:11:25.000000Z PROPS-END Node-path: putty-wishlist/data/deccolm-cls Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cbb2b63d2262320244bebcf62a23d4d5 Text-delta-base-sha1: ad20bd93897d3b4926be6eb39bc7ffd576923526 Text-content-length: 138 Text-content-md5: 59344fb2bf5822d8eca66218c2a08623 Text-content-sha1: b1d9f07ba4d7dd06e05d6355a293f4a7075e49d0 Content-length: 177 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN@ vgcfbFixed-in: 2003-03-28, home the cursor and reset the scroll margins. In PuTTY they didn't before snapshot 2003-03-28. Revision-number: 3009 Prop-content-length: 177 Content-length: 177 K 7 svn:log V 79 open_settings_r() and open_settings_w() need to cope with a NULL session name. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-27T22:46:28.000000Z PROPS-END Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 79e1f81aeae383343291b44c127433a7 Text-delta-base-sha1: aa6b49bc8f98157857795a732cd36054d4e54178 Text-content-length: 223 Text-content-md5: 902a1e947789482f77d8b79d4576df0e Text-content-sha1: 6b7c8eaf18f421b3224554b2bb6b5f0461f8474a Content-length: 263 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN1E7\-Ek_oEPa/* $Id: macstore.c,v 1.17 2003/03/27 22:46:28if (!sessionname || !*sessionname) sessionname = "Default Settings";if (!sessionname || !*sessionname) sessionname = "Default Settings"; Revision-number: 3010 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2003-03-28T00:06:17.000000Z K 7 svn:log V 91 Display half of a System 7 edit text CDEF, using TextEdit directly. This is the easy bit. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b580ec4fa10e7139a0f06ad3bafc778 Text-delta-base-sha1: db4edd92addc8a9ee6941b02af6fb1e684802254 Text-content-length: 1504 Text-content-md5: 08705aa8102cf8815a63c1e920ed533b Text-content-sha1: d12af9334c941aecd0edcdb6b2af97a3878306bf Content-length: 1544 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN!R-WUlFu7k9P~qiS `2Eq,!}$/* $Id: macctrls.c,v 1.16 2003/03/28 00:06:17cript.h> #include #include #include #include theUPP = NewControlDefProc(macctrl_sys7_editbox; bounds.bottom = bounds.top + 22; if (mac_gestalts.apprvers >= 0x100) { InsetRect(&bounds, 2, 2); } elseSYS7_EDITBOX_PROC, (long)mc); } curstate->pos.v += 28;trlevent(mcs, mc, EVENT_REFRESH); } #if !TARGET_API_MAC_CARBON static pascal SInt32 macctrl_sys7_editboxTEHandle te; long ssfs; switch (msg) { case initCntl: rect = (*control)->contrlRect; InsetRect(&rect, 3, 3); /* 2 if it's 20 pixels high */ te = TENew(&rect, &rect); ssfs = GetScriptVariable(smSystemScript, smScriptSysFondSize); (*te)->txSize = LoWord(ssfs); (*te)->txFont = HiWord(ssfs); (*control)->contrlData = (Handle)te; return noErr; case dispCntl: TEDispose((TEHandle)(*control)->contrlData); return 0; case drawCntl: if ((*control)->contrlVis) { rect = (*control)->contrlRect; PenNormal(); FrameRect(&rect); InsetRect(&rect, 3, 3); TEUpdate(&rect, (TEHandle)(*control)->contrlDataGetPort(&saveport); SetPort((GrafPtr)(GetWindowPort(mcs->window)) } else { TESetText(text, strlen(text), (TEHandle)(*mc->editbox.tbctrl)->contrlData); } DrawOneControl(mc->editbox.tbctrl); SetPort(saveport); } Revision-number: 3011 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2003-03-28T00:50:04.000000Z K 7 svn:log V 71 Tidy up dlg_editbox_set() and implemen dlg_editbox_get() for System 7. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 08705aa8102cf8815a63c1e920ed533b Text-delta-base-sha1: d12af9334c941aecd0edcdb6b2af97a3878306bf Text-content-length: 476 Text-content-md5: 58bb5606f922ca3d816bafc244035dd3 Text-content-sha1: 9e88d314fb7a048cf2fb53aff5559917f577ffeb Content-length: 516 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN$* -I8Zbb}>9b/* $Id: macctrls.c,v 1.17 2003/03/28 00:50:04else TESetText(text, strlen(text), (TEHandle)(*mc->editbox.tbctrl)->contrlData); TEHandle teolen = length - 1; } else { te = (TEHandle)(*mc->editbox.tbctrl)->contrlData; olen = (*te)->teLength; if (olen > length - 1) olen = length - 1; memcpy(buffer, *(*te)->hText, olen); } buffer[olen] = '\0'; fprintf(stderr, "dlg_editbox_get: %s\n", buffer); } Revision-number: 3012 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2003-03-29T01:44:39.000000Z K 7 svn:log V 58 Update text about ports, hopefully not too controversial. K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7e0465e66b4c0d576ce12c2f3a9cfa5c Text-delta-base-sha1: 6c9b2d8f966795e9eb25916edfcd33116431647b Text-content-length: 673 Text-content-md5: af1371c1fab46544cd1130df63bf0a40 Text-content-sha1: 38f48be107c343cfa4dca0ebd8d592f3d98ac26f Content-length: 713 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNBzuh4eJf0qD#\versionid $Id: faq.but,v 1.46 2003/03/29 01:44:39 owIt's currently being worked on, but it's only in its early stages yet, and certainly isn't yet useful. PuTTY on portable devices would clearly be a useful thing, so in the long term I hope it can be brought up to release qualityThere is a port to the Mac OS in progress. It's just about usable, but has an awful lot of gaps and rough edges that will need cleaning up before releaHowever, some of the work has been done by other people, and a beta port of PuTTY for the Nokia 9200 Communicator series is available from \W{http://www.s2.org/putty/}\cw{http://www.s2.org/putty/} Revision-number: 3013 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2003-03-29T13:54:11.000000Z K 7 svn:log V 70 Fix off-by-one in selection update while scrolling. Thanks Richard B. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8f6ff1926d31d9053bc23954a3eaa845 Text-delta-base-sha1: 79f651d83a6f92090f8ffd61d5cfc0f2a8d11e48 Text-content-length: 66 Text-content-md5: 416af8467280254b1883c06cbe165b95 Text-content-sha1: 8b6dfe223c7ce0e9c77d17c297926bced3806b95 Content-length: 107 K 15 cvs2svn:cvs-rev V 5 1.148 PROPS-END SVNp@pH0 + 1 + 1u}u * beca Revision-number: 3014 Prop-content-length: 546 Content-length: 546 K 7 svn:log V 445 Introduced wrapper macros snew(), snewn() and sresize() for the malloc functions, which automatically cast to the same type they're allocating the size of. Should prevent any future errors involving mallocing the size of the wrong structure type, and will also make life easier if we ever need to turn the PuTTY core code from real C into C++-friendly C. I haven't touched the Mac frontend in this checkin because I couldn't compile or test it. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-29T16:14:26.000000Z PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9719618a461f86e872d2ae0dd431bec9 Text-delta-base-sha1: d0ed1f71c4ae5ac049a5c599057098b197b8cafd Text-content-length: 138 Text-content-md5: bca20a47698341a25635189b3279e69f Text-content-sha1: eeefe507071e7ec53b0d24036ed10272696fe432 Content-length: 178 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNlmn S)`M sresize(saves[pri].params, saves[pri].savesize, struct cmdline_saved_paramsize(command, cmdsize, char Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 09e6af6702c6c25261ba49f9d066f398 Text-delta-base-sha1: 8b8a2261dd72aeb6471487335c13da1208a328c2 Text-content-length: 72 Text-content-md5: 6f8e129d59697996fd685e9d358ca5a9 Text-content-sha1: ca74dc03bab8cd813326ff52abf2d0d3f26f9d4d Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNH-!_Ys`6newn(4, intnewn(2, intnewn(2, int Node-path: putty/dialog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 53a5bda3f58272f77b7fe2743cae2e7a Text-delta-base-sha1: 09d6b90bcef449296b2510e7ffb191aeb6ec1867 Text-content-length: 658 Text-content-md5: 7a30487d426c04250d68bc5092790602 Text-content-sha1: 589844f4954d8c64a9abd69a701e044c6d4e48dd Content-length: 697 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN xL8r T2PmP'Fmij.^E[?I/~8new(struct controlboxnew(struct controlsetsize(b->ctrlsets, b->ctrlsetsize,struct controlset *new(struct controlsetsize(b->ctrlsets, b->ctrlsetsize,struct controlset */* * This is an internal allocation routine, so it's allowed to * use smalloc directly. */size(b->frees, b->freesize, void *new(union controlsize(s->ctrls, s->ctrlsize, union control *newn(ncolumns, intnewn(c->radio.nbuttons, char); else c->radio.shortcuts = NULL; c->radio.buttons = snewn(c->radio.nbuttons, char *); c->radio.buttondata = snewn(c->radio.nbuttons, intorptr Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 73f0b0e68833459b51b58edc51e47e67 Text-delta-base-sha1: a211feb6680b60ab0e1d0c0d7e9170f53cb915d4 Text-content-length: 452 Text-content-md5: 5272527cb8241892dc07dd372c4a74b0 Text-content-sha1: dcd78a059ddabab83430cbc334838ba858d3be09 Content-length: 492 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN0W_mZ6ODp5$4;e'3?e$rU,"new(struct openssh_keysize(ret->keyblob, ret->keyblob_size, unsigned charnewn(blobsize, unsigned charnew(struct ssh2_userkeynewn(sparelen, unsigned charnewn(outlen, unsigned charnew(struct sshcom_keysize(ret->keyblob, ret->keyblob_size, unsigned charnewn(blobsize, unsigned charnew(struct ssh2_userkeynewn(outlen, unsigned char Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 50c4a7c5dab89c6e7ba25e58473529f8 Text-delta-base-sha1: cf8c1ed5eca4f0f58236b26297eb35554f3146b4 Text-content-length: 83 Text-content-md5: 13961b4db11af60082e62ab2413f4c43 Text-content-sha1: 36c3d53c6e9b7c9b21a6acb65f70e5659fbb28bd Content-length: 123 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN378re( new(struct ldisc_tagsize(ldisc->buf, ldisc->bufsiz, char Node-path: putty/ldiscucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a7c704cf1302be4ead31a4fc21b1cd9e Text-delta-base-sha1: a003cf2bfa4f5845be03e76ceb50471d3d435f06 Text-content-length: 68 Text-content-md5: 7e9d95b95dde617e6af46d00bc091195 Text-content-sha1: e86f87a0c7f81bbde4333876600d228d7f01b220 Content-length: 107 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN3)#1>unewn(widesize, wchar_tnewn(linesize, char Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dd7869f1dc06192ba971b80e218aab85 Text-delta-base-sha1: 1dcf4a5d9ea6cb8f641343b845eb5a0966f8c6d1 Text-content-length: 42 Text-content-md5: f6cc21fc9931356d77d2ecc58e9c16d0 Text-content-sha1: a6055235f5160a60e8961ea545541a7cf7063d1e Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNwl G0new(struct LogContext Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 773fbfa81fb7b414b2ac7bba25f2b1e7 Text-delta-base-sha1: 4f21a147625e8a039b3b1b056f55017f17afcee3 Text-content-length: 161 Text-content-md5: 4308c314fff75b541430ba6fac1092ca Text-content-sha1: 7c949f1578fe5ac43451da18b7270ec9d7943df1 Content-length: 201 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN&p(k64/kmB68|newn(len + 1, charnewn(len + 1, charnewn(512, charsize(buf, size, char); } } /* new(struct bufchain_granule Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a3019efd95f338f5035c62e84a9344ff Text-delta-base-sha1: 4f67e34f6e2092e078acc36aff7ec7941ad396e8 Text-content-length: 440 Text-content-md5: 017c48495eff465751701c30aaf80f2e Text-content-sha1: 8179f9267bc43a7d9c50ecdb2d990e7ecae767aa Content-length: 480 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVNDgCfev$oT IpT_N)=Z=*PEfncvkAnewn(bloblen+4, unsigned charnew(struct RSAKeynewn(reqlen, unsigned charnewn(reqlen, unsigned charnewn(len, unsigned charnewn(len, unsigned charnewn(resplen-5, unsigned charnewn(resplen-5, unsigned charnew(struct RSAKeynewn(commentlen+1, charnew(struct ssh2_userkeynewn(commlen + 1, charnewn(8192, charnewn(numSelected, int Node-path: putty/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d135064cd206ec2e8617e89f626add1b Text-delta-base-sha1: 166d399840844e335d407a70ed198b6734061cb0 Text-content-length: 47 Text-content-md5: 2829b58276afeb4d3f4402b49dafc99b Text-content-sha1: 74c74ae5a59c90ee1329c67c448fc3fbe6a200fb Content-length: 86 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNR_ *7newn(retlen, unsigned char Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ac8a282e81572bc25f5db23d6fd299b Text-delta-base-sha1: 0209b3692de31949c39db3620e44e2ee84b31693 Text-content-length: 116 Text-content-md5: 584e87c08a157db5f7096e68a0e8f6fa Text-content-sha1: 449c8eecb0019a2346b666a5f85f56637755ee76 Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVN! Qcuy m4size(command, cmdsize, charsize(command, cmdsize, charsize(sklist, sksize, SOCKET Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cdfc4b9341344ef6069611015cd1f72f Text-delta-base-sha1: ad3a536da1ccd9bd3e8e732ab3ce4488c7d22abc Text-content-length: 102 Text-content-md5: 3ab0e5e19db97f537f34d4bc2f50b0ae Text-content-sha1: 93f044540355088b850ca85b28e5ce5ca8ac8bfd Content-length: 142 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNiE[a2.Psnew(struct PFwdPrivatesnew(struct PFwdPrivatesnew(struct PFwdPrivate Node-path: putty/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5a5f0194d83b07933a6f949d726e68a7 Text-delta-base-sha1: f37026fd512fc17349aeee372bb3b267ec028b01 Text-content-length: 150 Text-content-md5: 5125d9725bf4c42ae6d1c7bffc5f7467 Text-content-sha1: 2710148014654cf994ff69b567aa814bc6791165 Content-length: 189 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNzr!jMpepo"Mxsize(buffer, offset+512, charsize(buffer, offset+needed, charnew(printer_enumnewn(512, charnew(printer_job Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2f1369bf9c2c517e8468e6d63f7894f7 Text-delta-base-sha1: 8b48ec7c1de1a1b4fcdd04f9ed8785062d9423de Text-content-length: 154 Text-content-md5: d0493898c0257d53a4c721afda74f091 Text-content-sha1: 2ea0681499c15f9ea049502497827fd84175831d Content-length: 194 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNs*c\88W<k3(+Znew(struct Socket_proxy_tagnew(struct Plug_proxy_tagnewn(len, char)newn(len, charsnewn(length, char Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7abbb00e744808b8eff7f8c50c16b071 Text-delta-base-sha1: b15d2436847a11be860a990d8255eaa854076d3a Text-content-length: 527 Text-content-md5: 9c74736149e57c3726ed8a91300c63f4 Text-content-sha1: 308023df15344ae5d426eb5a61da654905d2f5a8 Content-length: 567 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN=\=DV5vixv;N9+wx tpfW sresize(ournames, namesize, struct fxp_name *newn(256, char); len = GetCurrentDirectory(256, currdir); if (len > 256) currdir = sresize(currdir, len, charnewn(256, char); len = GetCurrentDirectory(256, currdir); if (len > 256) currdir = sresize(currdir, len, charnew(struct sftp_commandsize(line, linesize, charsize(cmd->words, cmd->wordssize, char * sresize(cmd->words, cmd->wordssize, char *sresize(pending, pendsize, unsigned char Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3611d89de6b74fa14d022a4c7df55ff Text-delta-base-sha1: 5cb6c1b13331965aa6d976666cfeb28f5c6abb1c Text-content-length: 308 Text-content-md5: 81a085f610f4e10d4363d03181a5e883 Text-content-sha1: ce6804af388a4da96c2f88de5337ef34e5c7808b Content-length: 348 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNh/w{[QT:}Q+\FAHVnewn(strlen(key->alg->name) + 4 * ((pub_len + 2) / 3) + strlen(key->comment) + 3, charnew(struct MainDlgStatenew(struct rsa_key_thread_paramsnewn(len + 1, charunsigned)); state->entropy = snewn(state->entropy_required, unsignednewn(30, char Node-path: putty/puttymem.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 454a67cc6634b4e42ca3966d884ab561 Text-delta-base-sha1: 00c20f70c69cac1fda36f81a373ac07b01388651 Text-content-length: 467 Text-content-md5: 69da60e61c0b5a13d4c7f9380cf8f598 Text-content-sha1: 6d34f79f0fcd6a7c30cbcd78325aaacbf43aca7d Content-length: 506 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN3U@@/* * Direct use of smalloc within the code should be avoided where * possible, in favour of these type-casting macros which ensure * you don't mistakenly allocate enough space for one sort of * structure and assign it to a different sort of pointer. */ #define snew(type) ((type *)smalloc(sizeof(type))) #define snewn(n, type) ((type *)smalloc((n)*sizeof(type))) #define sresize(ptr, n, type) ((type *)srealloc(ptr, (n)*sizeof(type))) #endif Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0dcfdf89a6bfda17a9ca615cbd644f76 Text-delta-base-sha1: f21195bd0d69b82318ca7aace2f73a061b72a9c8 Text-content-length: 48 Text-content-md5: 2ae5315988778f0eeba6705ed7800cda Text-content-sha1: 9d1db5cd112cb5449ac54001354c1847cc48144e Content-length: 88 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN\d bgunew(struct raw_backend_data Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8849e9e03ff5df5dce6733057e6157eb Text-delta-base-sha1: 25585aa2c0042f76580d6cd0de49b3426e0e6a09 Text-content-length: 42 Text-content-md5: 986254aef14e98aaff18cd805ee7bd92 Text-content-sha1: 676f8b418443275d7c699775dca20375f6788b6f Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNYX }Fnew(struct rlogin_tag Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: baed2bc8380cba48039fee8b89a9e43f Text-delta-base-sha1: 0e67d78d94ce781d20da27ffedef6934cfdcf5f8 Text-content-length: 371 Text-content-md5: ce209a1330c7529f43d66a3afcca3c62 Text-content-sha1: 50b0d666e23a5578897fa86e71cb7b5a3a407def Content-length: 412 K 15 cvs2svn:cvs-rev V 5 1.103 PROPS-END SVN`/B#%#hP(.#UZKLFfHsresize(pending, pendsize, unsigned charnewn(namelen, char sresize(ournames, namesize, struct fxp_namenewn(1+strlen(source), charnewn(1+strlen(dupsource), char sresize(ournames, namesize, struct fxp_namenew(struct scp_sftp_dirstacksize(act->buf, bufsize, charnewn(4 * strlen(src) + 100, char Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ffbdc0cfb6d33eb793235f15b536404a Text-delta-base-sha1: 3a27595291c686d795da4938ec88206781d00e21 Text-content-length: 138 Text-content-md5: 08fde077f9689cfbf8da3d3841f1a715 Text-content-sha1: 2bbddf03d9baf83aced3ce79f95470517951a7cd Content-length: 179 K 15 cvs2svn:cvs-rev V 5 1.106 PROPS-END SVN/,cH>c ?7xsize(list->buffer, bufsize, charsize(list->buffer, buflen + 1, charnewn(list->nsessions + 1, char * Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cc99d1c0912ea9a0db01cf6aeb1d7b1e Text-delta-base-sha1: a77ec9ed250164f5c5c2378c298402b019775fca Text-content-length: 456 Text-content-md5: 3eeeb05a3b8b7aa4701eb6fc8fb18450 Text-content-sha1: 6d03a6a77ffd51d91693f93b0bbfded87c52225e Content-length: 496 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN0p>|#7{= =T1G124q_mFjsize(pkt->data, pkt->maxlen, charnew(struct sftp_packetnew(struct sftp_packet); pkt->savedpos = 0; pkt->length = pkt->maxlen = GET_32BIT(x); pkt->data = snewn(pkt->length, charnewn(len + 1, charnew(struct fxp_handlenew(struct fxp_handlenew(struct fxp_names); ret->nnames = sftp_pkt_getuint32(pktin); ret->names = snewn(ret->nnames, struct fxp_namenew(struct fxp_name Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bad98b59460e46d8803be11d406c5c0d Text-delta-base-sha1: db365012d301971d97f2e6fe0cca6017bbfe914e Text-content-length: 42 Text-content-md5: 6a44b0c80cc0fd2077025721e96bc90c Text-content-sha1: 40090049578678a87fc4a9f4bfe2104d4e721928 Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNgZ rSnewn(wtlen + 1, TCHAR Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 51e306f1aaf8a9dd6b159436340307bb Text-delta-base-sha1: 64cc0049e5ae5bf14fe8d0828d2d05e42f5fa93a Text-content-length: 1833 Text-content-md5: efb73ff55f79d18c2b0eacf22abe64c3 Text-content-sha1: 022ada4fd67c7284204c2ac4a82aa93fdc2e6188 Content-length: 1874 K 15 cvs2svn:cvs-rev V 5 1.279 PROPS-END SVN4#<9S@u8UpkC; MxO:2?QMIQ1#y`MuQ<Wmp`jLTG.k=$^H# new(struct tsize(ssh->pktin.data, st->biglen + APIEXTRA, unsigned charsize(ssh->pktin.data, ssh->pktin.maxlen + APIEXTRA, unsigned charsize(ssh->pktin.data, st->cipherblk + APIEXTRA, unsigned charsize(ssh->pktin.data, ssh->pktin.maxlen + APIEXTRA, unsigned charsize(ssh->pktin.data, ssh->pktin.maxlen + APIEXTRA, unsigned charsize(ssh->pktout.data, biglen + 12, unsigned char); #else ssh->pktout.data = sresize(ssh->pktout.data, biglen + 4, unsigned charsize(ssh->deferred_send_data, ssh->deferred_size, unsigned charsize(ssh->pktout.data, ssh->pktout.maxlen + APIEXTRA, unsigned charnewn(n + 1, unsigned charsize(ssh->deferred_send_data, ssh->deferred_size, unsigned charnewn(s->vstrsize, charsize(s->vstring, s->vstrsize, charnewn(20 + s->vslen, charnewn(1 + strlen(host), charnewn(s->len, unsigned charnewn(len, charnewn(4 + len, charnewn(top + 1, charnew(struct ssh_rportfwdnew(struct ssh_channelnew(struct ssh_channelnew(struct ssh_channelSRMj\}6IE/sGOP @=t;D3 e != NULL) { char buf[256]; sprintf(buf, "Port open failed: %s", e); logevent(buf); sfree(c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(ssh->pktin.body), PKT_END); newn(c->u.a.totallen, unsigned charnewn(4 + s->len, charnewn(sigdata_len, charnew(struct ssh_channelnew(struct ssh_rportfwdnewn(c->u.a.totallen, unsigned charnew(struct ssh_channelnewn(peeraddrlen+1, charnew(struct ssh_tagnew(struct ssh_channel Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 190caf002b56a5166a472c2670ce6f5e Text-delta-base-sha1: 89b9946ee0e8bfdaa2b476da0a723032192352c5 Text-content-length: 39 Text-content-md5: 324526f2c0a1a69bb2cb5b91044020f5 Text-content-sha1: c397047a8a4d2ed0a30d905783b78003028e67cb Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN W-pnew(AESContext Node-path: putty/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4739934381e4ee8aebcd99295e9dfabb Text-delta-base-sha1: 8a8581ef5180419c41552d63d36cbd6bbff0ef94 Text-content-length: 73 Text-content-md5: 44a39b171b57a8ad42042bb25590e40f Text-content-sha1: 3d854ae2fad04d4b466eb1a13bd06053b9256b5d Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNVB*^u|Enew(BlowfishContextnewn(2, BlowfishContext Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d8c0f1e93274cd55fa04bd59e437a0f3 Text-delta-base-sha1: 74717fadbf3b39bd9f1a5b35c0ada949c0265684 Text-content-length: 578 Text-content-md5: 4e8f121db30a317906ef051f86dd8a43 Text-content-sha1: 2ecb523653cefa1e56cbe0fec348bfb7f77fa8ff Content-length: 618 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN9aS@lW^%PBOFm=%22^B9_% ~y,lMFG1newn(length + 1, unsigned shortnewn(orig[0] + 1, unsigned shortnewn(mlen, unsigned short/* Allocate n of size mlen, copy base to n */ n = snewn(mlen, unsigned shortnewn(2 * mlen, unsigned short); b = snewn(2 * mlen, unsigned shortnewn(mlen, unsigned shortnewn(pqlen, unsigned shortnewn(pqlen, unsigned shortnewn(2 * pqlen, unsigned shortnewn(mlen, unsigned shortnewn(plen, unsigned shortnewn(mlen * 4, unsigned shortnewn(ndigits, charnewn(x[0], unsigned short Node-path: putty/sshcrcda.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f52c02e2fe989d8b0961889e7e8c3f7 Text-delta-base-sha1: 5c7f863642ab90ab275d7798b1d61331ba57a286 Text-content-length: 187 Text-content-md5: 7cefaf7c5653c727e4d2afc7781b0c89 Text-content-sha1: d6f3065d1b9f099e0158b4e8a09cb6a28376a321 Content-length: 226 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNr<y 'Knew(struct crcda_ctxsnewn(ctx->n, uint16); } else { if (l > ctx->n) { ctx->n = l; ctx->h = sresize(ctx->h, ctx->n, uint16 Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7f33d8c13988b7fdb09d383d6d733869 Text-delta-base-sha1: af4d2f1f64f197a5bedd894f70575d29ed6abbcb Text-content-length: 162 Text-content-md5: 702b85666e48847b8e386563c2507356 Text-content-sha1: 3490f38e8e835d8c3fa918d83173f18c875e6f8b Content-length: 202 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN)|zpXpq-|newn(3, DESContextnewn(6, DESContext); } static void *des_make_context(void) { return snew(DESContextnewn(2, DESContext Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 56e3e55427b770a921dd9eca69878578 Text-delta-base-sha1: a488184a495593e0190746dc0576435e7b4b2bc4 Text-content-length: 93 Text-content-md5: 12ff41c54db1f027823f025b9512cdb2 Text-content-sha1: 36de0bd4d13ad74456837ae7bd066f39842e1c38 Content-length: 133 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN$<y2d@new(struct dh_ctxnew(struct dh_ctxnewn(nbytes, unsigned char Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e2da117b8eb249aa7589f24a1d9fec8 Text-delta-base-sha1: 84c4b9aef76104f8a0c7df4053cd07a49e14482f Text-content-length: 219 Text-content-md5: 03c6ee51ad392538f2c36fb717baf7dc Text-content-sha1: a6038d85e6a9bc234ca56c8cfdb461e73c236e27 Content-length: 259 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNo.f0C |ioq!Pnew(struct dss_keynewn(len, charnewn(strlen(buffer) + 1, charnewn(bloblen, unsigned charnewn(bloblen, unsigned charnew(struct dss_keynewn(nbytes, unsigned char Node-path: putty/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 29b0896da8049dc8b57ebbc09d940a72 Text-delta-base-sha1: 65b1fa6211e08c4bb720ce8c6c98739531440915 Text-content-length: 46 Text-content-md5: 893b5df2829d3b745f898d701bca1c18 Text-content-sha1: 6761120b92f7371f5000c6944eb54e859e26a94a Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN90 |=newn(2, struct MD5Context Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ab08807c2cb67c2d923edf64bce0ee0 Text-delta-base-sha1: 236bd06e9da2b92e731b795dd86f373c6f4264cc Text-content-length: 266 Text-content-md5: c1d65d2ec7c7356eb1994c702d91c1d8 Text-content-sha1: f4d7cb7f897c0d8cb4f5b3d96676f62a006b4ecf Content-length: 306 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNP8DK"=xBEZR}tu  newn(j + 1, charnewn(size, charsize(text, size, charnewn(48 * nlines, unsigned charnewn(maclen, unsigned charnew(struct ssh2_userkeynewn(priv_encrypted_len, unsigned charnewn(maclen, unsigned char Node-path: putty/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cfee1e94f7d2a3a43f089b984610f189 Text-delta-base-sha1: 4b0b7bc073f2437180367906fed4b1782b4d12b5 Text-content-length: 44 Text-content-md5: 6f7dee9ba94b15dee2dca21d51578728 Text-content-sha1: 118e78d2c845db1de40ac6fb546cd7d83c7a6960 Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN`d ?Rnewn(POOLSIZE / 2, char Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cbf7050b4aa054327884b4da2be507df Text-delta-base-sha1: dcbd88a839c78444402ecd3d433cf5e222c6e107 Text-content-length: 295 Text-content-md5: e90370a76c040701580581f7bf48f17c Text-content-sha1: 26280652eb44689c4a9efdce5975e794c4fe70a6 Content-length: 335 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNx+<]' 4OYo2/FWl9*>:u0Hnewn(length, unsigned charnew(struct RSAKeynewn(len, charnewn(bloblen, unsigned charnewn(bloblen, unsigned charnew(struct RSAKeynewn(strlen(buffer) + 1, charnewn(nbytes, unsigned charnewn(4 + 7 + 4 + nbytes, unsigned char Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d119beaeb44c1311fc3f00695d8b69b Text-delta-base-sha1: 0251d423ef390c9ea279991b7a453f2c285395dd Text-content-length: 38 Text-content-md5: fcef136ef4f7180d482c1c3d4bf60806 Text-content-sha1: 8c733e693a665c8ca57b4c28a2ceceb53e286715 Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN6- 1kKnewn(2, SHA_State Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8114be900e1915f962b5994e44a56db4 Text-delta-base-sha1: ff9d97cc1231a5bdad78e0d78c1cc7ffe80b47ae Text-content-length: 406 Text-content-md5: 63b2e5022216460f4270e3382254b9d6 Text-content-sha1: 56d3a88fbace05248d0146adea11515d8219bea9 Content-length: 446 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN+z4TRk{e*J+9R,snew(struct LZ77InternalContextsize(out->outbuf, out->outsize, unsigned charnew(struct LZ77Contextnew(struct Outbufnew(struct zlib_table); int pfxmask = (1 << pfxbits) - 1; int nbits, i, j, code; tab->table = snewn(1 << bits, struct zlib_tableentry snew(struct zlib_decompress_ctxsize(dctx->outblk, dctx->outsize, unsigned char Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5c1b83c36b2686195cbd22f82ff59785 Text-delta-base-sha1: b12b21d103603862dc17deeaa1ea9fa71c3396cf Text-content-length: 180 Text-content-md5: 58b9499fce7483d19401d176d5173c9c Text-content-sha1: 9b1ec0f04fdc95603ba429dd5487b3fe25dea414 Content-length: 220 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNTQ}Ieotelnet->sb_size += SB_DELTA; telnet->sb_buf = sresize(telnet->sb_buf, telnet->sb_size, unsigned char); } new(struct telnet_tag Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 416af8467280254b1883c06cbe165b95 Text-delta-base-sha1: 8b6dfe223c7ce0e9c77d17c297926bced3806b95 Text-content-length: 516 Text-content-md5: 4de19e064dca223e07e54a6139e7fc47 Text-content-sha1: 59fc2093e060f2961beec90925872183751cf49f Content-length: 557 K 15 cvs2svn:cvs-rev V 5 1.149 PROPS-END SVNK?2!OD u+f\a{%6zJsize(line, 2 + cols, TTYPEnew(Terminalnewn(newcols + 2, TTYPEnewn(newrows * (newcols + 1), TTYPnewn(newcols + 2, TTYPEsize(term->tabs, newcols, unsigned charnewn(term->cols + 2, TTYPEnew(struct scrollregionnew(struct beeptimenewn(buflen, wchar_t * because in normal selection mode this means we need a * newline at t}"PJx*?>buflen += 100; workbuf = sresize(workbuf, buflen, wchar_tnewn(len, wchar_t Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 94b65d9cfddeef20f5afaa48711578fb Text-delta-base-sha1: e0479b9840b492e9b9286962f44406d535efdf23 Text-content-length: 67 Text-content-md5: 133aa9f4e59f8b905d1697876c6ae488 Text-content-sha1: 23fd914516f4be3a1c32cc93eed91d310c78c988 Content-length: 107 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN& .n TYPE unsigned long #define TSIZE (sizeof(TTYPE Node-path: putty/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c1b3af8164e7c2bfa01d6acf9961197f Text-delta-base-sha1: 15fecb2e58d4bd4e49acf26cc4b0798df149fbed Text-content-length: 92 Text-content-md5: bada4ab2f2777f5f2bd4ffecb325dbe9 Text-content-sha1: 0e93761c6537647740340e5b7c746332d37a8bcb Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN/4 F[//* $Id: testback.c,v 1.7 2003/03/29 16:14:26 simonew(struct loop_state Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9e6875d0ed4d63427dba4b5d4581e53c Text-delta-base-sha1: cd1e25427b6ebfc05b838ffbca239b26c971216c Text-content-length: 129 Text-content-md5: baa406cbdb0c176d5fd4f6ed29304832 Text-content-sha1: 648039b1e2759e0618c5dae59d1b08cc5d0c595e Content-length: 169 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN_0DniZCE 1,t_.mputtymem.h" #include "tree234.h"sssssresize(array, arraysize, void * Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d5d6b6c66eaca77b0ba7087d199bcb0c Text-delta-base-sha1: 84651b41af4842874ebd9e9e7d82976c96d914ec Text-content-length: 63 Text-content-md5: a27afc14be49dbc4d27fb8818cf2123e Text-content-sha1: 6d295ad135af22463105f2a95f597c7f6e03a74d Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNxb+"fnewn(256, char *newn(256, char Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 124d732594420f348583caf47885c70a Text-delta-base-sha1: 1db7ddb4b1f18bef7c7f457737fda3da681d2250 Text-content-length: 309 Text-content-md5: 63286cbbf80014727cb0bb59f5a87bc2 Text-content-sha1: 398706a015710f51807e881bb418ab5fda7fe40b Content-length: 349 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNq-/xBi9=61bR/* * This is an internal allocation routine, so it's allowed to * use smalloc directly. */newn(ncols, gintnew(struct uctrlnewn(uc->nbuttons, GtkWidget *size(selparams, selparamsize, struct selparamnewn(dp.ntreeitems, GtkWidget * Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ee2ab4c15b149a7fdf84597288c2acd Text-delta-base-sha1: 59aebc5cd13d71b2688195fbd118cb37ac1ae757 Text-content-length: 395 Text-content-md5: 9954f6d39e9ff27c1a8f5300e78aa3e1 Text-content-sha1: fef17ee8831902750ad1c34376d83d0489548904 Content-length: 435 K 15 cvs2svn:cvs-rev V 4 1.97 PROPS-END SVNS R+sDzMjSLo7c.Qg[[zW!q-&newn(len*6, charsize(inst->pasteout_data_utf8, inst->pasteout_data_utf8_len, charnewn(len*6, charsize(inst->pasteout_data, inst->pasteout_data_len, charnewn(seldata->length, wchar_tnew(struct draw_ctxnewn(len+1, wchar_tnewn(len*2+1, GdkWCharnewn(len+1, gcharnewn(argc+1, char *new(struct gui_data Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b5ccddf1422fffd58c99c91e07008c97 Text-delta-base-sha1: bc89ad212cf65cd0802c157c2d7cb0afc85226b3 Text-content-length: 47 Text-content-md5: 4e92cac669f1897c7210c5467b524620 Text-content-sha1: e873616820848b161868564f33387a2083285906 Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN newn(2+strlen(shell), char Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: effd2c4edb047ea7789edb07c64e0ab0 Text-delta-base-sha1: cdb5f38d7a46d4517f11232c507b89fcd00c035f Text-content-length: 39 Text-content-md5: 393bbc26d9ebdcacf6dcd1780a2707d8 Text-content-sha1: 7eb225a40b3d26dcee0bf1913765c6acd48f60ab Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNhl HVnewn(maxsize, char Node-path: putty/unix/uxagentc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a6ad9a5d7b9cff27e7342ee6dd146ae9 Text-delta-base-sha1: c5536de4576b5f9ce2358fb1af571f85a5c81124 Text-content-length: 39 Text-content-md5: f213a6febc5f5496e8442e8f616a3ceb Text-content-sha1: 5800e4c355b8329b8662e635b7e9a554713a2ab8 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN ?4Mnewn(retsize, char Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1d4021d62e4673572ac40d80c4055563 Text-delta-base-sha1: 92b22ea399d534b8067e7e315fe72613af6fd396 Text-content-length: 221 Text-content-md5: 4b33141bb3104da603e38d0cbb22678b Text-content-sha1: db428a98c9821395f18d42b0b2fd1fc1e5ca1bb2 Content-length: 261 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN^+95mW}]J|||J8$89|||,|bnew(struct SockAddr_tagnewn(1+strlen(realhost), charnew(struct SockAddr_tagnew(struct Socket_tagwritable = 1new(struct Socket_tagnew(struct Socket_tag Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 298beda7176778afb74bdc27010f915e Text-delta-base-sha1: 09b41dd6d50fd3cb9e8375df3a8c47cb1227b856 Text-content-length: 227 Text-content-md5: 076affd820f104cc8b6e28bc84cc984a Text-content-sha1: 439bb8ba216152945005ba8a3e6479baa1fb8b79 Content-length: 267 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN}C/+Plsize(command, cmdsize, char); } command[cmdlen++]=*p++; } if (cmdlen >= cmdsize) { cmdsize = cmdlen + 512; command = sresize(command, cmdsize, charsize(sklist, sksize, int Node-path: putty/unix/uxprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fc528c35f276eda035e0d320b1048e27 Text-delta-base-sha1: 8cdda8d3784b335f55edb00e73efc9f4821b6aa3 Text-content-length: 36 Text-content-md5: 79c17fe245668cd044335888e5e7f18e Text-content-sha1: 37b3c577c805ab1ad28695f504b40009ff6d064f Content-length: 75 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNA6 WPqnew(printer_job Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f49adebc4ebd0153a3a119314a0994a2 Text-delta-base-sha1: 8b3d6eccf5b5c17719c44f6899df63778233eb4b Text-content-length: 116 Text-content-md5: 365d727669820b973c79956bc7a5c27a Text-content-sha1: d553cbe9fc362be8efd4ef672d4d5844eb559556 Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNNPSL{T blnew(struct xrm_string); key = snewn(q-p, charnewn(512, charsize(ret, size, char Node-path: putty/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 94d4eefe4f87ea0743d21369d2426ecf Text-delta-base-sha1: 19dfec8de58cfb086da0d4c4e5c14ad5a360c5d6 Text-content-length: 394 Text-content-md5: 5fa4a0dcea2a7995badd080f120cdf66 Text-content-sha1: d7b3f71c6d3ca139da63531c8c28c589796fec77 Content-length: 433 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNTr+Sxe0#Xu? ~!X|size(c->radio.buttons, c->radio.nbuttons, char *size(c->radio.buttondata, c->radio.nbuttons, intorptrsize(c->radio.shortcuts, c->radio.nbuttons, charsize(c->radio.buttons, c->radio.nbuttons, char *size(c->radio.buttondata, c->radio.nbuttons, intorptr snewn(c->radio.nbuttons, char sresize(c->radio.shortcuts, c->radio.nbuttons, char Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3f828849c4f74fea766c53d2520a4b6 Text-delta-base-sha1: 9c1246b7e36c7ced3f641066f336de7bf21e1139 Text-content-length: 730 Text-content-md5: 5e808191c38d450ac2c1a4d1a7f42a0b Text-content-sha1: 8c08ebf338d51b620cd35d4712998f66b85d7cea Content-length: 770 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN vD=;/Vq |/*~g^IbF8;BRG r:9C1]VUYTi4Unewn(nbuttons, struct radiotext, idnewn(nbuttons, struct radionewn(nbuttons, struct radio); va_start(ap, idnewn(1+strlen(text), char); p = text; q = ret; pwidths = snewn(1+strlen(text), INTnewn(tlen+1, charnewn(2*strlen(text)+1, charnew(struct winctrlnew(struct winctrlnewn(ctrl->radio.nbuttons, struct radionew(struct prefslistnewn(ctrl->listbox.ncols-1, intnew(FontSpecnew(struct winctrlnewn(len+1, charnew(struct perctrl_privdatanew(struct perctrl_privdata/* * This is an internal allocation routine, so it's allowed to * use smalloc directly. */ Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 36c277ec32d6273a43d4c3bad940c887 Text-delta-base-sha1: 82eac9355d64855b0375ad4139c9a1e17cbd39c2 Text-content-length: 149 Text-content-md5: af7a6a0d63440c9b2eec868ddcfe4a32 Text-content-sha1: fbcb6b0cd000f0443e80750eb889a3be98c9281b Content-length: 190 K 15 cvs2svn:cvs-rev V 5 1.210 PROPS-END SVNdVlsUp) Xnewn(selcount, intnewn(size, charsize(events, negsize, char *newn(strlen(timebuf) + strlen(string) + 1, char Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1994ddcbe97d93a5c28848c2be647966 Text-delta-base-sha1: 7ecde9399ebde0716e0eda4246a0c5c237a73523 Text-content-length: 582 Text-content-md5: 56630f292cea9cca475fad4013583a02 Text-content-sha1: a9f6ce564a49560fa85db3432d996f606296d92c Content-length: 623 K 15 cvs2svn:cvs-rev V 5 1.239 PROPS-END SVN8}p{pW =}pKbZ%kr+newn(size, char/* * This is a genuine case where we must use smalloc * because the snew macros can't cope. */newn(16 + strlen(session), charsnewn(n, charnewn(len + 16, intlen = len; uni_buf = snewn(uni_len, wchar_tnewn(wlen, WCHAR$Sc;GSi2 )F6gke. Otherwise * we return -1, which means Windows will give the keystroke * its default hnewn(1 + strlen(title), charnewn(1 + strlen(title), charnewn(rtfsize, charsize(rtf, rtfsize, charnewn(i, wchar_t Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4dbc6f40324bc426e73b5a86c7aaf1c6 Text-delta-base-sha1: 175c14030dd5aff27a403d7d35558a00e9e527af Text-content-length: 201 Text-content-md5: 0b0d973fa5c2f1ea2a78a850ab14564b Text-content-sha1: 6e26b4f3c3e360396b884b7730b27a65cada6a21 Content-length: 241 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVN*w1 w}}/NHmxm?Mm{/new(struct SockAddr_tagnewn(1+strlen(realhost), charnew(struct SockAddr_tagnew(struct Socket_tagnew(struct Socket_tagnew(struct Socket_tag Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a6b701466d1f3fe41e4ccd89f80f8560 Text-delta-base-sha1: f27a140b17c280330bb6018b1f9d745f47bedc55 Text-content-length: 386 Text-content-md5: ae48bd74b0ed880e34f7e9f45f9977c9 Text-content-sha1: 5a5f8714465bda0fbb30d74869fc99a3b1a9464c Content-length: 426 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNc5A"+_O,ng XDvWbnewn(3 * strlen(sessionname) + 1, charnewn(3 * strlen(sessionname) + 1, charnewn(3 * strlen(sessionname) + 1, charnew(struct enumsettingsnewn(3 * buflen, charnewn(len, char); regname = snewn(3 * (strlen(hostname) + strlen(keytype)) + 15, charnewn(len + 10, charnewn(3 * (strlen(hostname) + strlen(keytype)) + 15, char Node-path: putty/winutils.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 03661dcf552d827f5242e81d1cdf2825 Text-delta-base-sha1: 1c8eaa860c0069ca9a89172b54f3ec6dbf55c5f3 Text-content-length: 276 Text-content-md5: e59d12f3e57884b1282cea56cbb288e3 Text-content-sha1: 4a8cfb5c3fc430221ed9f1f083e3e6c29771ac72 Content-length: 315 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNrHsoeUnewn(1+strlen(cmdline), char); outputargv = snewn(strlen(cmdline)+1 / 2, char *); outputargstart = snewn(strlen(cmdline)+1 / 2, char *size(outputargv, outputargc, char *); outputargstart = sresize(outputargstart, outputargc, char * Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9301776bf82c11bc3a1a341f5ca6448e Text-delta-base-sha1: c6b29f507f05e9a7b633af7aa56022cdc501fa7b Text-content-length: 211 Text-content-md5: eb50f7ad4bebbd66ff9ad92a4d855024 Text-content-sha1: 5ccd5ec7f8e9f6d3aec39e785ba414f4ffde11e3 Content-length: 251 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN(o*Khh=L#USnew(struct X11Authsnew(struct X11Privatesnewn(pr->auth_psize + 1, char); pr->auth_data = snewn(pr->auth_dsize, charnewn(8 + msglen+1 + 4, unsigned char); /* include zero Revision-number: 3015 Prop-content-length: 548 Content-length: 548 K 8 svn:date V 27 2003-03-29T16:47:06.000000Z K 7 svn:log V 447 Added uxsel.c, into which I've moved those parts of the uxnet.c functionality that deal with selectable fds in general. The idea is that pty.c will stop passing its fd straight to pterm.c and hand it to this module instead, and pterm.c will start requesting a general list of fds from this module rather than expecting a single one from pty.c, with the ultimate aim of pterm.c being able to form the basis of a Unix PuTTY as well as pterm proper. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f64812f31c1caf6f0aea479ab662ec6a Text-delta-base-sha1: 2b50e35de121dfb5b24b5f872f402d56198e1eef Text-content-length: 55 Text-content-md5: 613ad14ac1030517047e5f2c7c997f69 Text-content-sha1: 20d7bc130b4537ed82a45db4f6e9500f338813df Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNUf "^fosel uxnet proxy cmdline + Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 850ab147690493a80939411283a7b271 Text-delta-base-sha1: 58b224ea2887c0397ac02a2557b2670000ac3725 Text-content-length: 301 Text-content-md5: 5739e9a57b0654271854cb273bd548c9 Text-content-sha1: 888827c6c4c4a64393e60573b46b3add2da972cc Content-length: 341 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNN\ ; Be interface used by uxsel.c */ void uxsel_init(void); typedef int (*uxsel_callback_fn)(int fd, int event); void uxsel_set(int fd, int rwx, uxsel_callback_fn callback); void uxsel_del(int fd); int select_result(int fd, int event); int first_fd(int *state, int *rwx); int next_fd Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b33141bb3104da603e38d0cbb22678b Text-delta-base-sha1: db428a98c9821395f18d42b0b2fd1fc1e5ca1bb2 Text-content-length: 548 Text-content-md5: 248de14eaa54994b34daadc6fffa0018 Text-content-sha1: 96201dc14df3ba05cad1e6340bcb239cf61b799c Content-length: 588 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN+pHN/;%[[\1AQS=("^:O~1zvoid uxsel_tell(Actual_Socket s)uxsel_tell(ret);uxsel_tell(ret);uxsel_tell(ret);uxsel_del(s->s); uxsel_tell(s);static int net_uxsel_tell(s) uxsel_tell(s); } static void uxsel_tell(Actual_Socket s) { int rwx = 0; if (!s->connected) rwx |= 2; /* write == connect */ if (s->connected && !s->frozen) rwxrwx |= 2; /* write */ if (s->listener) rwx |= 1; /* read == accept */ uxsel_set(s->s, rwx, net_select_result) Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 076affd820f104cc8b6e28bc84cc984a Text-delta-base-sha1: 439bb8ba216152945005ba8a3e6479baa1fb8b79 Text-content-length: 908 Text-content-md5: 6ffe4bcd8156df6fefb18d80279f8be5 Text-content-sha1: eb9b4802739316fbad5471fcd92e924213864ba7 Content-length: 948 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN}+S;wuK = 0; fd = next_fd(&fdstate, &rwx)) i++; /* Expand the fdlist buffer if necessary. */ if (i > fdsize) { fdsize = i + 16; fdlist = sresize(fdlist, fdsize, int); } /* * Add all currently open fds to the select sets, and store * them in fdlist as well. */ fdcount = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) { fdlist[fdcount++] = fd; if (rwx & 1) FD_SET_MAX(fd, maxfd, rset); if (rwx & 2) FD_SET_MAX(fd, maxfd, wset); if (rwx & 4) FD_SET_MAX(fdfdcount; i++) { fd = fdfd, &xset)) select_result(fd, 4); if (FD_ISSET(fd, &rset)) select_result(fd, 1); if (FD_ISSET(fd, &wset)) select_result(fd Node-path: putty/unix/uxsel.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2496 Text-content-md5: 5b1375f9b8b68d1cbdd44d686bd7a9f3 Text-content-sha1: 32f8c1ca1443bf22c8f9e12d6fcb5e69595b2454 Content-length: 2612 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN222/* * uxsel.c * * This module is a sort of all-purpose interchange for file * descriptors. At one end it talks to uxnet.c and pty.c and * anything else which might have one or more fds that need * select()-type things doing to them during an extended program * run; at the other end it talks to pterm.c or uxplink.c or * anything else which might have its own means of actually doing * those select()-type things. */ #include #include "putty.h" #include "tree234.h" struct fd { int fd; int rwx; /* 4=except 2=write 1=read */ uxsel_callback_fn callback; }; static tree234 *fds; static int uxsel_fd_cmp(void *av, void *bv) { struct fd *a = (struct fd *)av; struct fd *b = (struct fd *)bv; if (a->fd < b->fd) return -1; if (a->fd > b->fd) return +1; return 0; } static int uxsel_fd_findcmp(void *av, void *bv) { int *a = (int *)av; struct fd *b = (struct fd *)bv; if (*a < b->fd) return -1; if (*a > b->fd) return +1; return 0; } void uxsel_init(void) { fds = newtree234(uxsel_fd_cmp); } /* * Here is the interface to fd-supplying modules. They supply an * fd, a set of read/write/execute states, and a callback function * for when the fd satisfies one of those states. Repeated calls to * uxsel_set on the same fd are perfectly legal and serve to change * the rwx state (typically you only want to select an fd for * writing when you actually have pending data you want to write to * it!). */ void uxsel_set(int fd, int rwx, uxsel_callback_fn callback) { struct fd *newfd = snew(struct fd); struct fd *oldfd; newfd->fd = fd; newfd->rwx = rwx; newfd->callback = callback; oldfd = find234(fds, newfd, NULL); if (oldfd) { del234(fds, oldfd); sfree(oldfd); } add234(fds, newfd); } void uxsel_del(int fd) { struct fd *oldfd = find234(fds, &fd, uxsel_fd_findcmp); if (oldfd) { del234(fds, oldfd); sfree(oldfd); } } /* * And here is the interface to select-functionality-supplying * modules. */ int next_fd(int *state, int *rwx) { struct fd *fd; fd = index234(fds, (*state)++); if (fd) { *rwx = fd->rwx; return fd->fd; } else return -1; } int first_fd(int *state, int *rwx) { *state = 0; return next_fd(state, rwx); } int select_result(int fd, int event) { struct fd *fdstruct = find234(fds, &fd, uxsel_fd_findcmp); assert(fdstruct != NULL); return fdstruct->callback(fd, event); } Revision-number: 3016 Prop-content-length: 310 Content-length: 310 K 8 svn:date V 27 2003-03-29T17:07:31.000000Z K 7 svn:log V 209 I'm sick of having to type (cd ..; perl mkfiles.pl) when I'm working on Unix. So now mkfiles.pl will look in .. as well as . when searching for Recipe, so I can run `perl ../mkfiles.pl' and it will Just Work. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 786eebc427c93fb77acffa7fc4798061 Text-delta-base-sha1: 6b4b72728035d05d0324303d58eee79783ecb243 Text-content-length: 263 Text-content-md5: 35ce8e442b6d11fd2013fd049f956ded Text-content-sha1: 965ece7914aa9b789a84a41685eb6ece72f79075 Content-length: 303 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN'r l<lJ]o { # We want to deal correctly with being run from one of the # subdirs in the source tree. So if we can't find Recipe here, # try one level up. chdir ".."; open IN, "Recipe" or die "unable to open Recipe file\n"; } Revision-number: 3017 Prop-content-length: 845 Content-length: 845 K 8 svn:date V 27 2003-03-29T18:30:14.000000Z K 7 svn:log V 744 pterm now uses the new uxsel module, so it's one step closer to being able to be a PuTTY as well as a pterm. In the process I've also moved icky things like actually reading from the pty fd and printing the `terminated on signal' messages into pty.c where they obviously should have been in the first place. Also there's been one interesting repercussion in the terminal code: terminal.c's from_backend now calls term_out() directly rather than expecting the front end to call it afterwards. This has had the entertaining side effect of fixing a Windows-specific bug whereby activity in a port forwarding through a PuTTY with a blinking cursor caused the cursor to blink to ON (!!!!). So, a surprisingly far-reaching checkin as it turns out... K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 613ad14ac1030517047e5f2c7c997f69 Text-delta-base-sha1: 20d7bc130b4537ed82a45db4f6e9500f338813df Text-content-length: 26 Text-content-md5: 3f42972117e3d15c6ef84e558cfa9660 Text-content-sha1: 687ded304452cd1f04f305baf0f3a6ddf189a03a Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNfl buxsel Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4de19e064dca223e07e54a6139e7fc47 Text-delta-base-sha1: 59fc2093e060f2961beec90925872183751cf49f Text-content-length: 235 Text-content-md5: 78251a55041a0767287449e60859b485 Text-content-sha1: 931659bd73b70d9f9ce26e27a08bc30377227333 Content-length: 276 K 15 cvs2svn:cvs-rev V 5 1.150 PROPS-END SVN |gz term->in_term_out = FALSE"D }eans we need a * newline at tif (!term->in_term_out) { term->in_term_out = TRUE; term_blink(term, 1); term_out(term); term->in_term_out = FALSE; } Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 133aa9f4e59f8b905d1697876c6ae488 Text-delta-base-sha1: 23fd914516f4be3a1c32cc93eed91d310c78c988 Text-content-length: 399 Text-content-md5: 03628c983e1613a852f9ab95cfda4b3a Text-content-sha1: bb0b202c639692409911a381393a15051d577b33 Content-length: 439 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN& xLx\J /* * from_backend calls term_out, but it can also be called from * the ldisc if the ldisc is called _within_ term_out. So we * have to guard against re-entrancy - if from_backend is * called recursively like this, it will simply add data to the * end of the buffer term_out is in the process of working * through. */ int in_term_out Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9954f6d39e9ff27c1a8f5300e78aa3e1 Text-delta-base-sha1: fef17ee8831902750ad1c34376d83d0489548904 Text-content-length: 1149 Text-content-md5: 92543c2633366c8e9347629d98b59d77 Text-content-sha1: 57f3950d21979d4176728b712ed64c82fda211ae Content-length: 1189 K 15 cvs2svn:cvs-rev V 4 1.98 PROPS-END SVN P;4pw;Tv]ueOKWhtT"~; void *ldisc; Backend *back; void *backhandle; Terminal *term; void *logctx; int exited int exitcode; if ((exitcode = inst->back->exitcode(inst->backhandle)) >= 0) { inst->exited = TRUE; if (inst->cfg.close_on_exit == FORCE_ON || (inst->cfg.close_on_exit == AUTO && exitcode == 0)) exit(0); /* just go. */fd_input_func(gpointer data, gint sourcefd, GdkInputCondition condition) { select_result(sourcefd, (condition == GDK_INPUT_READ ? 1 : condition == GDK_INPUT_WRITE ? 2 : condition == GDK_INPUT_EXCEPTION ? 4 : -1)uxsel_input_add(int fd, int rwx) { int flags = 0; if (rwx & 1) flags |= GDK_INPUT_READ; if (rwx & 2) flags |= GDK_INPUT_WRITE; if (rwx & 4) flags |= GDK_INPUT_EXCEPTION; return gdk_input_add(fd, flags, fd_input_func, NULL); } void uxsel_input_remove(int id) { gdk_input_remove(id); } int main(int argc, char **argv) {uxsel_init(/* now we're reday to deal with the child exit handler being * called */ block_signal(SIGCHLD, 0); inst->exited = FALSE; Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4e92cac669f1897c7210c5467b524620 Text-delta-base-sha1: e873616820848b161868564f33387a2083285906 Text-content-length: 3367 Text-content-md5: 05ba0c1b3bc31acdc25f947687b9e93b Text-content-sha1: bba6899eb8d68f1d5dc4df9ae5a3cafa8ea00597 Content-length: 3407 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN;HRT\Rb.'}jY=4% n,&_B!a:define _GNU_SOURCEstatic Config pty_cfg; static ignal_pipe[2int pty_child_dead, pty_finished; staticpty_close(void)write(pty_signal_pipe[1], "x", 1)int pty_select_result(int fd, int event) { char buf[4096]; int ret; int finished = FALSE; if (fd == pty_master_fd && event == 1) { ret = read(pty_master_fd, buf, sizeof(buf)); /* * Clean termination condition is that either ret == 0, or ret * < 0 and errno == EIO. Not sure why the latter, but it seems * to happen. Boo. */ if (ret == 0 || (ret < 0 && errno == EIO)) { /* * We assume a clean exit if the pty has closed but the * actual child process hasn't. The only way I can * imagine this happening is if it detaches itself from * the pty and goes daemonic - in which case the * expected usage model would precisely _not_ be for * the pterm window to hang around! */ finished = TRUE; if (!pty_child_dead) pty_exit_code = 0; } else if (ret < 0) { perror("read pty master"); exit(1); } else if (ret > 0) { from_backend(pty_frontend, 0, buf, ret); } } else if (fd == pty_signal_pipe[0]) { pid_t pid; int status; char c[1]; read(pty_signal_pipe[0], c, 1); /* ignore its value; it'll be `x' */ do { pid = waitpid(-1, &status, WNOHANG); if (pid == pty_child_pid && (WIFEXITED(status) || WIFSIGNALED(status))) { /* * The primary child process died. We could keep * the terminal open for remaining subprocesses to * output to, but conventional wisdom seems to feel * that that's the Wrong Thing for an xterm-alike, * so we bail out now (though we don't necessarily * _close_ the window, depending on the state of * Close On Exit). This would be easy enough to * change or make configurable if necessary. */ pty_exit_code = status; pty_child_dead = TRUE; finished = TRUE; } } while(pid > 0); } if (finished && !pty_finished) { uxsel_del(pty_master_fd); pty_close(); pty_master_fd = -1; pty_finished = TRUE; /* * This is a slight layering-violation sort of hack: only * if we're not closing on exit (COE is set to Never, or to * Only On Clean and it wasn't a clean exit) do we output a * `terminated' message. */ if (pty_cfg.close_on_exit == FORCE_OFF || (pty_cfg.close_on_exit == AUTO && pty_exit_code != 0)) { char message[512]; if (WIFEXITED(pty_exit_code)) sprintf(message, "\r\n[pterm: process terminated with exit" " code %d]\r\n", WEXITSTATUS(pty_exit_code)); else if (WIFSIGNALED(pty_exit_code)) #ifdef HAVE_NO_STRSIGNAL sprintf(message, "\r\n[pterm: process terminated on signal" " %d]\r\n", WTERMSIG(pty_exit_code)); #else sprintf(message, "\r\n[pterm: process terminated on signal" " %d (%.400s)]\r\n", WTERMSIG(pty_exit_code), strsignal(WTERMSIG(pty_exit_code))); #endif from_backend(pty_frontend, 0, message, strlen(message)); } } return !finished; } static void pty_uxsel_setup(void) { uxsel_set(pty_master_fd, 1, pty_select_result); uxsel_set(pty_signal_pipe[0], 1, pty_select_result);cfg = *cfg; /* structure copy */ pty_finished = FALSE; } if (pipe(pty_signal_pipe) < 0) { perror("pipe"); exit(1); } pty_uxsel_setup();static finishe Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5739e9a57b0654271854cb273bd548c9 Text-delta-base-sha1: 888827c6c4c4a64393e60573b46b3add2da972cc Text-content-length: 190 Text-content-md5: 04240d49774cea019cbe743eca11111a Text-content-sha1: 1d77820b1ace44968f19b34b283c7fe1f3af851f Content-length: 230 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN\ &h&we/* The following are expected to be provided _to_ uxsel.c by the frontend */ int uxsel_input_add(int fd, int rwx); /* returns an id */ void uxsel_input_remove(int id Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ffe4bcd8156df6fefb18d80279f8be5 Text-delta-base-sha1: eb9b4802739316fbad5471fcd92e924213864ba7 Text-content-length: 192 Text-content-md5: 9d4f428753b7a5ce9f8326098a725b72 Text-content-sha1: 7b8e5935da7c280288f0833e41a337133f616ab1 Content-length: 232 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNJ && In Plink our selects are synchronous, so these functions are * empty stubs. */ int uxsel_input_add(int fd, int rwx) { return 0; } void uxsel_input_remove(int id) { Node-path: putty/unix/uxsel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5b1375f9b8b68d1cbdd44d686bd7a9f3 Text-delta-base-sha1: 32f8c1ca1443bf22c8f9e12d6fcb5e69595b2454 Text-content-length: 251 Text-content-md5: 04ff309aba5f148a8c26d92a95fdec7d Text-content-sha1: 02633605bd695349987a841437d2d6b73169cc6c Content-length: 290 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN2NXVU m. int id; /* for uxsel_input_remove */uxsel_input_remove(oldfd->id); del234(fds, oldfd); sfree(oldfd); } add234(fds, newfd); newfd->id = uxsel_input_add(fd, rwxuxsel_input_remove(oldfd->id); Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 56630f292cea9cca475fad4013583a02 Text-delta-base-sha1: a9f6ce564a49560fa85db3432d996f606296d92c Text-content-length: 100 Text-content-md5: 88297b560e8c3454fed2dae98d306fe5 Text-content-sha1: 732a3fbe654d77b67717eb1d345b4af5db999291 Content-length: 141 K 15 cvs2svn:cvs-rev V 5 1.240 PROPS-END SVN :?Ake. Otherwise * we return -1, which means Windows wilLL: Revision-number: 3018 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2003-03-29T18:31:09.000000Z K 7 svn:log V 63 Add the System 7 editbox CDEF, which I seem to have forgotten. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 87faef0b521b4d47ec19645b8648f98c Text-delta-base-sha1: c4a350e5264d0c04add2d2bbdf2eddaf9a07b3ae Text-content-length: 76 Text-content-md5: d3b1e95ba4a2f866b6cc8b39bec5f90f Text-content-sha1: 52a8a90efaaf32b652e5ffb7179abb652888b40a Content-length: 116 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN6 32,Q0/* $Id: mac_res.r,v 1.36 2003/03/29 18:31:09EditBox Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b6e1834cf1485cf44e6861f5119f865c Text-delta-base-sha1: 80e25c4e5f12a1cf7cb15466d2ab6a4a4cb245e9 Text-content-length: 148 Text-content-md5: d011f476b8416a97f8f612be0d7aaecd Text-content-sha1: 9d5a6d01a9027730fd8be035b7e5e7ed37536e2c Content-length: 188 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN P "-R/Z/* $Id: macresid.h,v 1.13 2003/03/29 18:31:09EditBox 129 #define SYS7_EDITBOX_PROC (CDEF_EditBox << 4) #define CDEF_Default 130 Revision-number: 3019 Prop-content-length: 212 Content-length: 212 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-29T18:32:36.000000Z K 7 svn:log V 113 Add input-focus support for System 7, where the Control Manager can't do it itself. Also clean up Carbon builds. PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b832f25e25906cfbff728f952e1d22fd Text-delta-base-sha1: d45f6d3cb20284b8765cd635b64d266d62d170df Text-content-length: 74 Text-content-md5: 702e2cff2d1e97ad8f6f71434105a6ff Text-content-sha1: 952f1da27f5b8966440ab01d037b383b8b45de3d Content-length: 114 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVN: 5G>C union macctrl *focus; /* Input focus for System 7 Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 58bb5606f922ca3d816bafc244035dd3 Text-delta-base-sha1: 9e88d314fb7a048cf2fb53aff5559917f577ffeb Text-content-length: 1817 Text-content-md5: 454146f35d71ed86b44fd1ffc4e8088e Text-content-sha1: b22205fb96245fe913dea1f007c25f4948aacb4f Content-length: 1857 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNXx_-.u4^Q[R Q7uXM}*P@\ r [zgTPw6%cv /* $Id: macctrls.c,v 1.18 2003/03/29 18:32:36setfocus(struct macctrls *, union macctrl *mcs->focus = NULL { #if !TARGET_API_MAC_CARBON if (mcs->focus == mc) macctrl_setfocus(mcs, NULL); #endif } } #if !TARGET_API_MAC_CARBON /* * System 7 focus manipulation */ static void macctrl_defocus(union macctrl *mc) { assert(mac_gestalts.apprvers < 0x100); switch (mc->generic.type) { case MACCTRL_EDITBOX: TEDeactivate((TEHandle)(*mc->editbox.tbctrl)->contrlData); break; } } static void macctrl_enfocus(union macctrl *mc) { assert(mac_gestalts.apprvers < 0x100); switch (mc->generic.type) { case MACCTRL_EDITBOX: TEActivate((TEHandle)(*mc->editbox.tbctrl)->contrlData); break; } } static void macctrl_setfocus(struct macctrls *mcs, union macctrl *mc) { if (mcs->focus != NULL) macctrl_defocus(mcs->focus); mcs->focus = mc; if (mc != NULL) macctrl_enfocus(mc); } #endif Point mousetestCntl: mouse.h = LoWord(param); mouse.v = HiWord(param); return PtInRect(mouse, &(*(TEHandle)(*control)->contrlData)->viewRect) ? kControlEditTextPart : kControlNoPartradiomc = (union macctrl *)GetControlReference(control); { #if !TARGET_API_MAC_CARBON if (mc->generic.type == MACCTRL_EDITBOX && control == mc->editbox.tbctrl) { TEHandle te = (TEHandle)(*control)->contrlData; macctrl_setfocus(mcs, mc); TEClick(mouse, !!(event->modifiers & shiftKey), te); goto done; } #endif trackresult = TrackControl(control, mouse, (ControlActionUPP)-1); }done:#if !TARGET_API_MAC_CARBON#endifSize olen #if !TARGET_API_MAC_CARBON else { TEHandle te = (TEHandle)(*mc->editbox.tbctrl)->contrlData; #endif Revision-number: 3020 Prop-content-length: 679 Content-length: 679 K 7 svn:log V 578 Having created and used uxsel, it actually turns out to be practically trivial to put all the pieces together and create a working prototype of Unix PuTTY! It's missing a lot of things - notably GUI request boxes for host keys and logfiles and so forth, the Event Log, mid-session reconfiguration, session loading and saving, sensible population of the character sets drop-down list and probably other fiddly little things too - but it will put up a config box and then create a GUI window containing an SSH connection to the host you specified, so it's _basically_ there. Woo! K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-29T19:52:50.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3f42972117e3d15c6ef84e558cfa9660 Text-delta-base-sha1: 687ded304452cd1f04f305baf0f3a6ddf189a03a Text-content-length: 204 Text-content-md5: 0e42ed7969f294e168fdfd8709723128 Text-content-sha1: ce1eec7cab878f09d2317c10beed0f247823e875 Content-length: 244 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNl))J%{OC)Config box on Unix. UXCFG = config uxcfg dialog gtkdlg gtkcols gtkpanel + ptermm puttyall uxstore signal CHARSET + uxputty NONSSH UXSSH UXMISC logging ux_x11 UXCFG Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 63286cbbf80014727cb0bb59f5a87bc2 Text-delta-base-sha1: 398706a015710f51807e881bb418ab5fda7fe40b Text-content-length: 369 Text-content-md5: a967a17a8632c7d4c84e98026b8af432 Text-content-sha1: 9516cada05ed4030eee373e63b257308c7eee640 Content-length: 409 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN-+`iuF % Q/a.t=LUG>|/#AUe\5widget_destroy(dp->window); } void dlg_refreshreturnreturn/* struct dlgparam *dp = (struct dlgparam *)data; *//* struct dlgparam *dp = (struct dlgparam *)data; */(GTK_IS_TREE_ITEM(w) || GTK_IS_TREE(w), Config *cfgConfig cfg;, &cfg)); return 0; } #endif Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 92543c2633366c8e9347629d98b59d77 Text-delta-base-sha1: 57f3950d21979d4176728b712ed64c82fda211ae Text-content-length: 531 Text-content-md5: d6b17da1f7f320df8d44206cc7e3e485 Text-content-sha1: 170db08253b5a83eecdc6eae5346f77241b356b5 Content-length: 571 K 15 cvs2svn:cvs-rev V 4 1.99 PROPS-END SVNPN2S!D>u'^mB*}p: extern int use_pty_argv;use_pty_argv && pt_main(int argc, char **argv) { extern Backend *select_backend(Config *cfg); extern int cfgbox(Config *cfg);f (!cfgbox(&inst->cfg)) exit(0); /* config box hit Cancelselect_backend(&inst->cfg); { char *realhost; /* FIXME: don't ignore this! */ inst->back->init((void *)inst->term, &inst->backhandle, &inst->cfg, inst->cfg.host, inst->cfg.port, &realhost, inst->cfg.tcp_nodelay); } Node-path: putty/unix/ptermm.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 425 Text-content-md5: d60a62b6b295287453c24770b9130846 Text-content-sha1: 1eb88a99069eb4f1d209c988527fa4394a2086ae Content-length: 541 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * pterm main program. */ #include #include "putty.h" Backend *select_backend(Config *cfg) { return &pty_backend; } int cfgbox(Config *cfg) { return 1; /* no-op in pterm */ } int main(int argc, char **argv) { extern int pt_main(int argc, char **argv); extern void pty_pre_init(void); /* declared in pty.c */ pty_pre_init(); return pt_main(argc, argv); } Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 05ba0c1b3bc31acdc25f947687b9e93b Text-delta-base-sha1: bba6899eb8d68f1d5dc4df9ae5a3cafa8ea00597 Text-content-length: 46 Text-content-md5: 8e90c21d7e484baaefec798e5223aa42 Text-content-sha1: 18c2534c9e08a5a540a1e5efca421bd94d8a5315 Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN;T zCxint use_pty_argv = TRUE Node-path: putty/unix/uxputty.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 6618 Text-content-md5: 0e668fd217b393f7d9b76a54957b1e9c Text-content-sha1: 9d76c63d422c0306216827574e9df7203219338b Content-length: 6734 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNLLL/* * Unix PuTTY main program. */ #include #include #include #include #include "putty.h" #include "storage.h" /* * FIXME: At least some of these functions should be replaced with * GTK GUI error-box-type things. * * In particular, all the termios-type things must go, and * termios.h should disappear from the above #include list. */ void fatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); cleanup_exit(1); } void connection_fatal(void *frontend, char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); cleanup_exit(1); } void cmdline_error(char *p, ...) { va_list ap; fprintf(stderr, "plink: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } /* * Clean up and exit. */ void cleanup_exit(int code) { /* * Clean up. */ sk_cleanup(); random_save_seed(); exit(code); } void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; static const char absentmsg[] = "The server's host key is not cached. You have no guarantee\n" "that the server is the computer you think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, enter \"y\" to add the key to\n" "PuTTY's cache and carry on connecting.\n" "If you want to carry on connecting just once, without\n" "adding the key to the cache, enter \"n\".\n" "If you do not trust this host, press Return to abandon the\n" "connection.\n" "Store key in cache? (y/n) "; static const char wrongmsg[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has\n" "cached. This means that either the server administrator\n" "has changed the host key, or you have actually connected\n" "to another computer pretending to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key,\n" "enter \"y\" to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating\n" "the cache, enter \"n\".\n" "If you want to abandon the connection completely, press\n" "Return to cancel. Pressing Return is the ONLY guaranteed\n" "safe choice.\n" "Update cached key? (y/n, Return cancels connection) "; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; /* * Verify the key. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; if (ret == 2) { /* key was different */ fprintf(stderr, wrongmsg, fingerprint); fflush(stderr); } if (ret == 1) { /* key was absent */ fprintf(stderr, absentmsg, fingerprint); fflush(stderr); } { struct termios oldmode, newmode; tcgetattr(0, &oldmode); newmode = oldmode; newmode.c_lflag |= ECHO | ISIG | ICANON; tcsetattr(0, TCSANOW, &newmode); line[0] = '\0'; read(0, line, sizeof(line) - 1); tcsetattr(0, TCSANOW, &oldmode); } if (line[0] != '\0' && line[0] != '\r' && line[0] != '\n') { if (line[0] == 'y' || line[0] == 'Y') store_host_key(host, port, keytype, keystr); } else { fprintf(stderr, abandoned); cleanup_exit(0); } } /* * Ask whether the selected cipher is acceptable (since it was * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ void askcipher(void *frontend, char *ciphername, int cs) { static const char msg[] = "The first %scipher supported by the server is\n" "%s, which is below the configured warning threshold.\n" "Continue with connection? (y/n) "; static const char abandoned[] = "Connection abandoned.\n"; char line[32]; fprintf(stderr, msg, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); fflush(stderr); { struct termios oldmode, newmode; tcgetattr(0, &oldmode); newmode = oldmode; newmode.c_lflag |= ECHO | ISIG | ICANON; tcsetattr(0, TCSANOW, &newmode); line[0] = '\0'; read(0, line, sizeof(line) - 1); tcsetattr(0, TCSANOW, &oldmode); } if (line[0] == 'y' || line[0] == 'Y') { return; } else { fprintf(stderr, abandoned); cleanup_exit(0); } } void old_keyfile_warning(void) { static const char message[] = "You are loading an SSH 2 private key which has an\n" "old version of the file format. This means your key\n" "file is not fully tamperproof. Future versions of\n" "PuTTY may stop supporting this private key format,\n" "so we recommend you convert your key to the new\n" "format.\n" "\n" "Once the key is loaded into PuTTYgen, you can perform\n" "this conversion simply by saving it again.\n"; fputs(message, stderr); } /* * Another bunch of temporary stub functions. These ones will want * removing by means of implementing them properly: libcharset * should invent its own sensible format for codepage names and a * means of enumerating them, and printer_enum needs to be dealt * with somehow or other too. */ char *cp_name(int codepage) { return ""; } char *cp_enumerate(int index) { return NULL; } int decode_codepage(char *cp_name) { return -2; } printer_enum *printer_start_enum(int *nprinters_ptr) { *nprinters_ptr = 0; return NULL; } char *printer_get_name(printer_enum *pe, int i) { return NULL; } void printer_finish_enum(printer_enum *pe) { } Backend *select_backend(Config *cfg) { int i; Backend *back = NULL; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == cfg->protocol) { back = backends[i].backend; break; } assert(back != NULL); return back; } int cfgbox(Config *cfg) { extern int do_config_box(const char *title, Config *cfg); return do_config_box("PuTTY Configuration", cfg); } int main(int argc, char **argv) { extern int pt_main(int argc, char **argv); sk_init(); flags = FLAG_VERBOSE | FLAG_INTERACTIVE; default_protocol = be_default_protocol; /* Find the appropriate default port. */ { int i; default_port = 0; /* illegal */ for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == default_protocol) { default_port = backends[i].backend->default_port; break; } } return pt_main(argc, argv); } Revision-number: 3021 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 48 Add support for labels on editboxes and radios. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-29T20:16:51.000000Z PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 454146f35d71ed86b44fd1ffc4e8088e Text-delta-base-sha1: b22205fb96245fe913dea1f007c25f4948aacb4f Text-content-length: 2195 Text-content-md5: 441bd87535eb43bb54b2847a75a4ab2a Text-content-sha1: ddd387a594038ef3b051092213767eafd42bab9c Content-length: 2235 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNX*\)d-Jm9&f2d' s^T5lF}VT5nz=*:/* $Id: macctrls.c,v 1.19 2003/03/29 20:16:51 ControlRef tblabel; } editbox; struct { struct macctrl_generic generic; ControlRef *tbctrls; ControlRef tblabel; } radio4hideshow(mc->editbox.tblabelhideshow(mc->radio.tbctrls[j]); hideshow(mc->radio.tblabellbounds,lbounds.left = curstate->pos.h; lbounds.top = curstate->pos.v; if (ctrl->editbox.percentwidth == 100) { lbounds.right = lbounds.left + curstate->width; lbounds.bottom = lbounds.top + 16; bounds.left = curstate->pos.h; bounds.right = bounds.left + curstate->width; curstate->pos.v += 18; } else { lbounds.right = lbounds.left + curstate->width * (100 - ctrl->editbox.percentwidth) / 100; lbounds.bottom = lbounds.top + 22; bounds.left = lbounds.right; bounds.right = lbounds.left + curstate->width; }mc->editbox.tblabel = NewControl(window, &lbounds, NULL, TRUE, 0, 0, 0, kControlStaticTextProc, (long)mc); SetControlData(mc->editbox.tblabeeditbox.label), ctrl->editbox.label); InsetRect(&bounds, 2, 2); mc->editbox.tbctrl = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, ctrl->editbox.password ? kControlEditTextPasswordProc : kControlEditTextProc, (long)mc); } else { Str255 title; c2pstrcpy(title, ctrl->editbox.label); mc->editbox.tblabel = NewControl(window, &lbounds, title, TRUE, 0, 0, 0, SYS7_TEXT_PROC, (long)mc); mc->editbox.tbctrl = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, bounds.top = curstate->pos.v; bounds.bottom = bounds.top + 16; bounds.left = curstate->pos.h; bounds.right = bounds.left + curstate->width; if (mac_gestalts.apprvers >= 0x100) { mc->radio.tblabel = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, kControlStaticTextProc, (long)mc); SetControlData(mc->radio.tblaberadio.label), ctrl->radio.label); } else { Str255 title; c2pstrcpy(title, ctrl->radio.label); mc->editbox.tblabel = NewControl(window, &bounds, title, TRUE, 0, 0, 0, SYS7_TEXT_PROC, (long)mc); } curstate->pos.v += 18HiliteControl(mc->editbox.tblabeHiliteControl(mc->radio.tblabel Revision-number: 3022 Prop-content-length: 329 Content-length: 329 K 8 svn:date V 27 2003-03-29T22:04:21.000000Z K 7 svn:log V 230 Convert the System 7 static text control to be a read-only version of the editbox control. This means that it has a persistent edit record, can have its height measured and uses the system font by default, all of which are good. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3b1e95ba4a2f866b6cc8b39bec5f90f Text-delta-base-sha1: 52a8a90efaaf32b652e5ffb7179abb652888b40a Text-content-length: 68 Text-content-md5: bcab03b288d0dc23a829cf84f37833db Text-content-sha1: 58798177d8e5eb483b190814c4773c68d0ad8869 Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN6 ,,X^/* $Id: mac_res.r,v 1.37 2003/03/29 22:04:21 Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 441bd87535eb43bb54b2847a75a4ab2a Text-delta-base-sha1: ddd387a594038ef3b051092213767eafd42bab9c Text-content-length: 2116 Text-content-md5: dc76af27d400cab24675c4302b85207a Text-content-sha1: 3dec081bf4153a7807a73c4a962e26830e5d0e3e Content-length: 2156 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN*UqEu,Ftext.tbctrl = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, SYS7_TEXT_PROC, (long)mc); te = (TEHandle)(*mc->text.tbctrl)->contrlData; TESetText(ctrl->text.label, strlen(ctrl->text.label), te); height = TEGetHeight(1, (*te)->nLines, te); } #endif fprintf(stderr, " height = %d\n", height); SizeControl(mc->text.tbctrl, curstate->width, height); curstate->pos.v += height + 6;} #if !TARGET_API_MAC_CARBON else { mc->editbox.tblabel = NewControl(window, &lbounds, NULL, TRUE, 0, 0, 0, SYS7_TEXT_PROC, (long)mc); TESetText(ctrl->editbox.label, strlen(ctrl->editbox.label), (TEHandle)(*mc->editbox.tblabel)->contrlData); mc->editbox.tbctrl = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, SYS7_EDITBOX_PROC, (long)mc); } #endifif (variant == SYS7_EDITBOX_VARIANT) if (variant == SYS7_EDITBOX_VARIANT) { PenNormal(); FrameRect(&rect); InsetRect(&rect, 3, 3); } (*(TEHandle)(*control)->contrlData)->viewRect = rect; TEUpdate(&rect, (TEHandle)(*control)->contrlData); } return 0; case testCntl: if (variant == SYS7_TEXT_VARIANT) return kControlNoPart; mouse.h = LoWord(param); mouse.v = HiWord(param); rect = (*control)->contrlRect; InsetRect(&rect, 3, 3); return PtInRect(mouse, &rect) ? #if !TARGET_API_MAC_CARBON else { mc->radio.tblabel = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, SYS7_TEXT_PROC, (long)mc); TESetText(ctrl->radio.label, strlen(ctrl->radio.label), (TEHandle)(*mc->radio.tblabel)->contrlData); } #endif {#if !TARGET_API_MAC_CARBON if (mcs->focus == mc) { if (active) macctrl_enfocus(mc); else macctrl_defocus(mc); } #endif #if !TARGET_API_MAC_CARBON else TESetText(text, strlen(text), (TEHandle)(*mc->text.tbctrl)->contrlData); #endif Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d011f476b8416a97f8f612be0d7aaecd Text-delta-base-sha1: 9d5a6d01a9027730fd8be035b7e5e7ed37536e2c Text-content-length: 275 Text-content-md5: c08417066fe9ff5f751a1d4c87cd3937 Text-content-sha1: e1b9d799a865a30ce3933f558d913fa15f69f8dd Content-length: 315 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNP( {d-NI/* $Id: macresid.h,v 1.14 2003/03/29 22:04:21EditBox 129 #define SYS7_EDITBOX_VARIANT 0 #define SYS7_TEXT_VARIANT 1 #define SYS7_EDITBOX_PROC ((CDEF_EditBox << 4) + SYS7_EDITBOX_VARIANT) #define SYS7_TEXT_PROC ((CDEF_EditBox << 4) + SYS7_TEXT_VARIANT Revision-number: 3023 Prop-content-length: 240 Content-length: 240 K 7 svn:log V 141 In a couple of places, snewn() was being asked for an array of char which was then assigned to an unsigned char * variabe. This fixes that. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-29T23:05:36.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: efb73ff55f79d18c2b0eacf22abe64c3 Text-delta-base-sha1: 022ada4fd67c7284204c2ac4a82aa93fdc2e6188 Text-content-length: 50 Text-content-md5: 06acaf5e344f187645ae5d50971b3480 Text-content-sha1: 6c30adc6324565432c6d7dd2f0aec6f2497e1231 Content-length: 91 K 15 cvs2svn:cvs-rev V 5 1.280 PROPS-END SVNR[ ?>unsigned Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eb50f7ad4bebbd66ff9ad92a4d855024 Text-delta-base-sha1: 5ccd5ec7f8e9f6d3aec39e785ba414f4ffde11e3 Text-content-length: 29 Text-content-md5: 999f8e4f3c62e5caa018b4d51b622f48 Text-content-sha1: fd12ffcf5d6d96dce4ed027a04895670ba4b428f Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNox `_unsigned Revision-number: 3024 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2003-03-29T23:07:55.000000Z K 7 svn:log V 52 Move the Mac port over to using snew/snewn/sresize. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macabout.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c0dff6b62689895ea0d462804f816226 Text-delta-base-sha1: d9632454b7c5a5c0363891c1e99675a228b34e1d Text-content-length: 94 Text-content-md5: 1fdcb3a63c4d5954eb0475f51021f026 Text-content-sha1: ff773f29e5655cdf892c1f4880ab2c8b10337fed Content-length: 133 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNBm,+HW/* $Id: macabout.c,v 1.3 2003/03/29 23:07:55new(WinInfonew(WinInfo Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dc76af27d400cab24675c4302b85207a Text-delta-base-sha1: 3dec081bf4153a7807a73c4a962e26830e5d0e3e Text-content-length: 342 Text-content-md5: 44429291657e734a2936f0f99e339973 Text-content-sha1: 4abb4359c4f92177ed69f64552029331c529370c Content-length: 382 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNUEP-t'&,Yc|M(h=U=Y du;/* $Id: macctrls.c,v 1.21 2003/03/29 23:07:55newn(mcs->npanels, union macctrl *new(union macctrlnew(union macctrlnew(union macctrl snewn(ctrl->radio.nbuttons, ControlRefnew(union macctrlnew(union macctrlnew(union macctrlsize(mc->popup.ids, mc->popup.nids, int Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cd1c8760da17be5fd5563f5a4af40a3f Text-delta-base-sha1: 445b0d35bd2071de3096346f5caa6bc70fc1db13 Text-content-length: 127 Text-content-md5: b481c9bfc8e3ab4e2db4039d31bfe4ec Text-content-sha1: 6c9ed9b7837a9b57a30fb1140a3c2d95e051c97d Content-length: 167 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNWw+~39Cf4/* $Id: macdlg.c,v 1.17 2003/03/29 23:07:55new(Sessionnew(WinInfonew(Sessionnew(Session Node-path: putty/mac/macevlog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b8c38d7c8986701234472e71c51cd7b0 Text-delta-base-sha1: 311a6e87bc3e44f09902b77c9f88647a3a220823 Text-content-length: 77 Text-content-md5: a2f6c957d0ef75c8d1f07f885c765c70 Text-content-sha1: e2928ed0689c3ed06433816946ff6f3f132557fe Content-length: 116 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNng 7,,B/* $Id: macevlog.c,v 1.6 2003/03/29 23:07:55new(WinInfo Node-path: putty/mac/macmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2ecc24f4fc25ab3b48b282a0821d1f0d Text-delta-base-sha1: 666da9b827c74b1f959bd5a78f20e527a16317e4 Text-content-length: 137 Text-content-md5: 42d4238cafaf365ebacb64e4f342c1d2 Text-content-sha1: 7e0c9e01ed52e95401995b89b6eed4dc1cf8f818 Content-length: 176 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNm@+>0c/* $Id: macmisc.c,v 1.3 2003/03/29 23:07:55newn(fn->fss.name[0], charnewn(strlen(path) + dirname[0] + 2, char Node-path: putty/mac/macpgkey.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e6dabed85de65dcf3a62d0a5eded7e49 Text-delta-base-sha1: 8a3a9103225c27818d6272559aa6abe701084310 Text-content-length: 116 Text-content-md5: 46ef4d9f693c28186aeecc6d50fb7e45 Text-content-sha1: e48ffc7943498f9ecf8d5824f63728a9f1ded7ab Content-length: 155 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN9R,RQ&5Lm/* $Id: macpgkey.c,v 1.4 2003/03/29 23:07:55newn(1024, longnew(KeyStatenew(WinInfo Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 902a1e947789482f77d8b79d4576df0e Text-delta-base-sha1: 6b7c8eaf18f421b3224554b2bb6b5f0461f8474a Text-content-length: 104 Text-content-md5: 72e64304fb5b63f78997c0658c693fe8 Text-content-sha1: 84c80b8514964fc059d3e5047a7277494960af57 Content-length: 144 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNE?LS-v*/* $Id: macstore.c,v 1.18 2003/03/29 23:07:55new(struct write_settingnew(int Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a04544589f45de55a66fb19462820a3b Text-delta-base-sha1: 7836e44aa7c832efc6c91b7857fb19760b56fd56 Text-content-length: 128 Text-content-md5: 11fd267683f1822200bb345e5675dc42 Text-content-sha1: d8786a4b74971f90d238b0c90ad212f82be2ec1c Content-length: 168 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNZZY+L>2(/* $Id: macterm.c,v 1.72 2003/03/29 23:07:5new(WinInfonewn(len, charnewn(textlen, wchar_t Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f767e5d03029fe69d317d586f129d3c0 Text-delta-base-sha1: 53078e04170296862c9efd5f11ec3ab1f139985f Text-content-length: 162 Text-content-md5: a3a2d42cfebb09b6b0fb7f7b2c1bc6e4 Text-content-sha1: 6c13d7f5580655bf665705d8fe86e7a82f088211 Content-length: 202 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN v"sk =zjtnew(struct SockAddr_tagnewn(1 + strlen(realhost), charnew(struct SockAddr_tagnew(struct Socket_tagnewn(buflen, char Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 92b88e5a59d76b3b4a17bfd5658e1d96 Text-delta-base-sha1: ebd0d9c27a130aa17a52af651c2497a924f9bbb5 Text-content-length: 165 Text-content-md5: 24ef625ce59047b26f31b9efa4b0f815 Text-content-sha1: 7479d1853542f9024d629a77a07a180b3c1145d5 Content-length: 205 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNe=%uCHe}F e\~]new(struct SockAddr_tagnewn(1+strlen(realhost), charnew(struct SockAddr_tagnew(struct Socket_tagnew(struct Socket_tag Revision-number: 3025 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 54 The entropy pool is full of unsigned ints, not longs. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-29T23:57:55.000000Z PROPS-END Node-path: putty/mac/macpgkey.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 46ef4d9f693c28186aeecc6d50fb7e45 Text-delta-base-sha1: e48ffc7943498f9ecf8d5824f63728a9f1ded7ab Text-content-length: 74 Text-content-md5: 788191568704cb5fc1951e0a88d5bac6 Text-content-sha1: a17c25aebfb6f9ef933631d9b029f78f9312e3cc Content-length: 113 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN! 4([>/* $Id: macpgkey.c,v 1.5 2003/03/29 23:5unsigned int Revision-number: 3026 Prop-content-length: 145 Content-length: 145 K 7 svn:log V 47 Crude keyboard support for System 7 editboxes. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-30T00:45:00.000000Z PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 44429291657e734a2936f0f99e339973 Text-delta-base-sha1: 4abb4359c4f92177ed69f64552029331c529370c Text-content-length: 614 Text-content-md5: 5ebd198724b819c8e5a54df57b50d135 Text-content-sha1: f1beed558a674932c27abadd2643432c3ad17d92 Content-length: 654 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN0;%-;SC}RM/* $Id: macctrls.c,v 1.22 2003/03/30 00:45:0014 TEHandle te; if (mac_gestalts.apprvers >= 0x100) { if (GetKeyboardFocus(window, &control) == noErr && control != NULL) { event->message & charCodeMask, event->modifiers); mc = (union macctrl *)GetControlReference(control); ctrlevent(mcs, mc, EVENT_VALCHANGE); } } else { if (mcs->focus != NULL) { switch (mcs->focus->generic.type) { case MACCTRL_EDITBOX: te = (TEHandle)(*mcs->focus->editbox.tbctrl)->contrlData; TEKey(event->message & charCodeMask, te); break; } } Revision-number: 3027 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 46 Correct the size of editboxes under Mac OS 8. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-03-30T14:24:20.000000Z PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5ebd198724b819c8e5a54df57b50d135 Text-delta-base-sha1: f1beed558a674932c27abadd2643432c3ad17d92 Text-content-length: 73 Text-content-md5: b00f7cd4af6cd5b3ee9681463caff99a Text-content-sha1: 40fef97bee1e632df633ec71b54cacd331946557 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN00 0m,/* $Id: macctrls.c,v 1.23 2003/03/30 14:24:23, 3 Revision-number: 3028 Prop-content-length: 263 Content-length: 263 K 7 svn:log V 162 Checkin of last night's work on GTK message boxes. Unix PuTTY now has proper GUI prompts for host keys etc, so it should now be usable without a controlling tty. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-31T11:21:07.000000Z PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a967a17a8632c7d4c84e98026b8af432 Text-delta-base-sha1: 9516cada05ed4030eee373e63b257308c7eee640 Text-content-length: 6595 Text-content-md5: 17851d4043e1b40c334d50d4e4fa599f Text-content-sha1: a025544704f1138e046ec571d81b8c953ad68dd4 Content-length: 6635 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN+&Atp-bdUsc\?9Z@th^<(Tstdargstorage dp->treeitems = NULL; dp->window = dp->cancelbutton = dp->currtreeitem = NULLstatic void messagebox_handler(union control *ctrl, void *dlg, void *data, int event) { if (event == EVENT_ACTION) dlg_end(dlg, ctrl->generic.context.i); } int messagebox(GtkWidget *parentwin, char *title, char *msg, int minwid, ...) { GtkWidget *window, *w0, *w1; struct controlbox *ctrlbox; struct controlset *s0, *s1; union control *c; struct dlgparam dp; struct Shortcuts scs; int index, ncols; va_list ap; dlg_init(&dp) ncols = 0; va_start(ap, minwid); while (va_arg(ap, char *) != NULL) { ncols++; (void) va_arg(ap, int); /* shortcut */ (void) va_arg(ap, int); /* normal/default/cancel */ (void) va_arg(ap, int); /* end value */ } va_end(ap); s0 = ctrl_getset(ctrlbox, "", "", ""); c = ctrl_columns(s0, 2, 50, 50); c->columns.ncols = s0->ncolumns = ncols; c->columns.percentages = sresize(c->columns.percentages, ncols, int); for (index = 0; index < ncols; index++) c->columns.percentages[index] = (index+1)*100/ncols - index*100/ncols; va_start(ap, minwid); index = 0; while (1) { char *title = va_arg(ap, char *); int shortcut, type, value; if (title == NULL) break; shortcut = va_arg(ap, int); type = va_arg(ap, int); value = va_arg(ap, int); c = ctrl_pushbutton(s0, title, shortcut, HELPCTX(no_help), messagebox_handler, I(value)); c->generic.column = index++; if (type > 0) c->button.isdefault = TRUE; else if (type < 0) c->button.iscancel = TRUE; } va_end(ap); s1 = ctrl_getset(ctrlbox, "x", "", ""); ctrl_text(s1, msg, HELPCTX(no_help)); window = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(window), title); w0 = layout_ctrls(&dp, &scs, s0, 0, GTK_WINDOW(window)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->action_area), w0, TRUE, TRUE, 0); gtk_widget_show(w0); w1 = layout_ctrls(&dp, &scs, s1, 0, GTK_WINDOW(window)); gtk_container_set_border_width(GTK_CONTAINER(w1), 10); gtk_widget_set_usize(w1, minwid+20, -1); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox), w1, TRUE, TRUE, 0); gtk_widget_show(w1); dp.shortcuts = &scsmodal(GTK_WINDOW(window), TRUE); if (parentwin)parentwin->window, &x, &y); gdk_window_get_size(parentwin gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(parentwin)); } else gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_widget_show(window);ctrl_free_box(ctrlbox); return dp.retval; } static int string_width(char *text) { GtkWidget *label = gtk_label_new(text); GtkRequisition req; gtk_widget_size_request(label, &req); gtk_widget_unref(label); return req.width; } void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint) { static const char absenttxt[] = "The server's host key is not cached. You have no guarantee " "that the server is the computer you think it is.\n" "The server's key fingerprint is:\n" "%s\n" "If you trust this host, press \"Accept\" to add the key to " "PuTTY's cache and carry on connecting.\n" "If you want to carry on connecting just once, without " "adding the key to the cache, press \"Connect Once\".\n" "If you do not trust this host, press \"Cancel\" to abandon the " "connection."; static const char wrongtxt[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has " "cached. This means that either the server administrator " "has changed the host key, or you have actually connected " "to another computer pretending to be the server.\n" "The new key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key, " "press \"Accept\" to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating " "the cache, press \"Connect Once\".\n" "If you want to abandon the connection completely, press " "\"Cancel\" to cancel. Pressing \"Cancel\" is the ONLY guaranteed " "safe choice."; char *text; int ret; /* * Verify the key. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; text = dupprintf((ret == 2 ? wrongtxt : absenttxt), fingerprint); ret = messagebox(GTK_WIDGET(get_window(frontend)), "PuTTY Security Alert", text, string_width(fingerprint), "Accept", 'a', 0, 2, "Connect Once", 'o', 0, 1, "Cancel", 'c', -1, 0, NULL); sfree(text); if (ret == 0) cleanup_exit(0); else if (ret == 2) store_host_key(host, port, keytype, keystr); } /* * Ask whether the selected cipher is acceptable (since it was * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ void askcipher(void *frontend, char *ciphername, int cs) { static const char msg[] = "The first %scipher supported by the server is " "%s, which is below the configured warning threshold.\n" "Continue with connection?"; char *text; int ret; text = dupprintf(msg, (cs == 0) ? "" : (cs == 1) ? "client-to-server " : "server-to-client ", ciphername); ret = messagebox(GTK_WIDGET(get_window(frontend)), "PuTTY Security Alert", text, string_width("Continue with connection?"), "Yes", 'y', 0, 1, "No", 'n', 0, 0, NULL); sfree(text); if (ret) { return; } else { cleanup_exit(0); } } void old_keyfile_warning(void) { /* * This should never happen on Unix. We hope. */ } void fatalbox(char *p, ...) { va_list ap; char *msg; va_start(ap, p); msg = dupvprintf(p, ap); va_end(ap); messagebox(NULL, "PuTTY Fatal Error", msg, string_width("REASONABLY LONG LINE OF TEXT FOR BASIC SANITY"), "OK", 'o', 1, 1, NULL); sfree(msg); cleanup_exit(1); } void connection_fatal(void *frontend, char *p, ...) { va_list ap; char *msg; va_start(ap, p); msg = dupvprintf(p, ap); va_end(ap); messagebox(GTK_WIDGET(get_window(frontend)), "PuTTY Fatal Error", msg, string_width("REASONABLY LONG LINE OF TEXT FOR BASIC SANITY"), "OK", 'o', 1, 1, NULL); sfree(msg); cleanup_exit(1); } Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d6b17da1f7f320df8d44206cc7e3e485 Text-delta-base-sha1: 170db08253b5a83eecdc6eae5346f77241b356b5 Text-content-length: 175 Text-content-md5: 8f8c311f69683606c374df222f300928 Text-content-sha1: f80916e9ac7cd538d992584dc56ae98ab6269d5b Content-length: 216 K 15 cvs2svn:cvs-rev V 5 1.100 PROPS-END SVNNTBgmq8Return the top-level GtkWindow associated with a particular * front end instance. */ void *get_windowterm->frontend; return inst->window; Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 04240d49774cea019cbe743eca11111a Text-delta-base-sha1: 1d77820b1ace44968f19b34b283c7fe1f3af851f Text-content-length: 132 Text-content-md5: 80c9d9763352fa99bbd594c0b1270f37 Text-content-sha1: b92b339dfbe4243a8f0fea483a9e195d3ebb9fe0 Content-length: 172 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN nnugtkdlg.c needs from pterm.c */ void *get_window(void *frontend); /* void * to avoid depending on gtk.h */ Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0e668fd217b393f7d9b76a54957b1e9c Text-delta-base-sha1: 9d76c63d422c0306216827574e9df7203219338b Text-content-length: 3084 Text-content-md5: 64cb15f6630b88db7e1f847acce26b58 Text-content-sha1: 478ea32f80515c580de4cbfe2e73a445e0ef03a6 Content-length: 3123 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNLpApW(5stdlib.h> #include #include #include "putty.h" #include "storage.h" /* * TODO: * * - Arrange for the window title not to be `pterm'. * * - Fix command-line parsing to be more PuTTYlike and not so * ptermy - in particular non-option arguments should be * hostname and port in the obvious way. * * - Session loading and saving; current thinking says the best * way is to have a subdir .putty/sessions containing files * whose names are actually munged saved session names. * * - libcharset enumeration. * * - fix the printer enum (I think the sensible thing is simply to * have uxcfg.c remove the drop-down list completely, since you * can't sensibly provide an enumerated list of lpr commands!). * * - Ctrl+right-click for a context menu (also in Windows for * consistency, I think). This should contain pretty much * everything in the Windows PuTTY menu, and a subset of that in * pterm: * * - Telnet special commands (not in pterm :-) * * - Event Log (this means we must implement the Event Log; not * in pterm) * * - New Session and Duplicate Session (perhaps in pterm, in fact?!) * + Duplicate Session will be fun, since we must work out * how to pass the config data through. * + In fact this should be easier on Unix, since fork() is * available so we need not even exec (this also saves us * the trouble of scrabbling around trying to find our own * binary). Possible scenario: respond to Duplicate * Session by forking. Parent continues as before; child * unceremoniously frees all extant resources (backend, * terminal, ldisc, frontend etc) and then _longjmps_ (I * kid you not) back to a point in pt_main() which causes * it to go back round to the point of opening a new * terminal window and a new backend. * + A tricky bit here is how to free everything without * also _destroying_ things - calling GTK to free up * existing widgets is liable to send destroy messages to * the X server, which won't go down too well with the * parent process. exec() is a much cleaner solution to * this bit, but requires us to invent some ghastly IPC as * we did in Windows PuTTY. * + Arrgh! Also, this won't work in pterm since we'll * already have dropped privileges by this point, so we * can't get another pty. Sigh. Looks like exec has to be * the way forward then :-/ * * - Saved Sessions submenu (not in pterm of course) * * - Change Settings * + we must also implement mid-session reconfig in pterm.c. * + note this also requires config.c and uxcfg.c to be able * to get hold of the application name. * * - Copy All to Clipboard (for what that's worth) * * - Clear Scrollback and Reset Terminal * * - About (and uxcfg.c must also supply the about box) */ Revision-number: 3029 Prop-content-length: 318 Content-length: 318 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-31T11:22:06.000000Z K 7 svn:log V 217 Fix a _very_ subtle segfault in my two GTK container classes: the `forall' function has to be prepared for the list of widgets to change along the way if (for example) the callback function destroys its input widget. PROPS-END Node-path: putty/unix/gtkcols.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 34af29a1de0ce0080d798baae4a02eba Text-delta-base-sha1: c3931495bd1714babdac1bbdc4c62c62b3b1dd43 Text-content-length: 514 Text-content-md5: 5c27be5b591a08f7f24ab5dbcbd6a901 Text-content-sha1: 9636f5dd1724852f15de4b518049e828b90f3ca8 Content-length: 553 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN'^Hn-6Wx!, *nextnext) { /* * We can't wait until after the callback to assign * `children = children->next', because the callback might * be gtk_widget_destroy, which would remove the link * `children' from the list! So instead we must get our * hands on the value of the `next' pointer _before_ the * callback. */ next = children->next; if (child->widget) callback(child->widget, callback_data); } Node-path: putty/unix/gtkpanel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 98ef9a8aa8745584f560c4086798838c Text-delta-base-sha1: 1bdf190a379d9f77bed95d11baefbaebb78dde01 Text-content-length: 505 Text-content-md5: 39a2ce458f835a067476ca91062abfbc Text-content-sha1: 2ba1317abaad17df960ed859881549ba3342b1d7 Content-length: 544 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNQ_V]m'|G)(, *nextcallbacknext) { /* * We can't wait until after the callback to assign * `children = children->next', because the callback might * be gtk_widget_destroy, which would remove the link * `children' from the list! So instead we must get our * hands on the value of the `next' pointer _before_ the * callback. */ next = children->next; if (child) callback(child, callback_data); } Revision-number: 3030 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2003-03-31T11:22:30.000000Z K 7 svn:log V 84 Ahem; fix `bombout' so it passes the correct frontend handle to connection_fatal(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 06acaf5e344f187645ae5d50971b3480 Text-delta-base-sha1: 6c30adc6324565432c6d7dd2f0aec6f2497e1231 Text-content-length: 619 Text-content-md5: c646fd686d888969161ab5c0f40d1980 Text-content-sha1: 5edae4fc1c370b8232528d99f9a236277c54fd8a Content-length: 660 K 15 cvs2svn:cvs-rev V 5 1.281 PROPS-END SVN! 4 GaR,^Wdy?%<e* -:eSo<{/u.'!1bV <a6u-a6 + 66-K\ do { \ char *text = dupprintf msg; \ ssh->state = SSH_STATE_CLOSED; \ if (ssh->s) { sk_close(ssh->s); ssh->s = NULL; } \ logevent(text); \ connection_fatal(ssh->frontend, "%s", text); \ sfree(text); \ } while (0[ v*zZ.Z` r "'FM!><~L5T /R5jL#sS|]QY-. if (ssh->frontend, Revision-number: 3031 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2003-03-31T11:36:14.000000Z K 7 svn:log V 43 Can now save and load settings under Unix. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 17851d4043e1b40c334d50d4e4fa599f Text-delta-base-sha1: a025544704f1138e046ec571d81b8c953ad68dd4 Text-content-length: 103 Text-content-md5: 32099649fa1a29ea2674fab4d6b44789 Text-content-sha1: 40373b94444766f13f264267cf8459f90ab4104a Content-length: 143 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN&`?U?if (!uc) returnget_sesslist(&sl, TRUE)get_sesslist(&sl, FALSE); Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 365d727669820b973c79956bc7a5c27a Text-delta-base-sha1: d553cbe9fc362be8efd4ef672d4d5844eb559556 Text-content-length: 6209 Text-content-md5: 4861b42146470269adc764939ef4b0e3 Text-content-sha1: c5d2c98e61561aefee1c94d8c667150d4c0f900e Content-length: 6249 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNPg *Ho:MCEc/hXnwVW]aIAV@_(B wXX|`*\Vt\assertdirentenum { INDEX_DIR, INDEX_HOSTKEYS, INDEX_RANDSEED, INDEX_SESSIONDIR, INDEX_SESSION, }; static const char hex[16] = "0123456789ABCDEF"; static char *mungestr(const char *in) { char *out, *ret; if (!in) in = "Default Settings"; ret = out = snewn(3*strlen(in)+1, char); while (*in) { /* * There are remarkably few punctuation characters that * aren't shell-special in some way or likely to be used as * separators in some file format or another! Hence we use * opt-in for safe characters rather than opt-out for * specific unsafe ones... */ if (*in!='+' && *in!='-' && *in!='.' && *in!='@' && *in!='_' && !(*in >= '0' && *in <= '9') && !(*in >= 'A' && *in <= 'Z') && !(*in >= 'a' && *in <= 'z')) { *out++ = '%'; *out++ = hex[((unsigned char) *in) >> 4]; *out++ = hex[((unsigned char) *in) & 15]; } else *out++ = *in; in++; } *out = '\0'; return ret; } static char *unmungestr(const char *in) { char *out, *ret; out = ret = snewn(strlen(in)+1, char); while (*in) { if (*in == '%' && in[1] && in[2]) { int i, j; i = in[1] - '0'; i -= (i > 9 ? 7 : 0); j = in[2] - '0'; j -= (j > 9 ? 7 : 0); *out++ = (i << 4) + j; in += 3; } else { *out++ = *in++; } } *out = '\0'; return ret; } static void make_filename(char *filename, int index, const char *subnameif (index == INDEX_SESSION) { char *munged = mungestr(subname); char *fn = dupprintf("/.putty/sessions/%s", munged); strncpy(filename + len, fn, FILENAME_MAX - len); sfree(fn); sfree(munged); } else { strncpy(filename + len, index == INDEX_DIR ? "/.putty" : index == INDEX_SESSIONDIR ? "/.putty/sessions" : index == INDEX_HOSTKEYS ? "/.putty/sshhostkeys" : index == INDEX_RANDSEED ? "/.putty/randomseed" : "/.putty/ERROR", FILENAME_MAX - len); }char filename[FILENAME_MAX]; FILE *fp; /* * Start by making sure the sessions subdir exists. Ignore the * error return from mkdir since it's perfectly likely to be * `already exists', and any other error will trip us up later * on so there's no real need to catch it now. */ make_filename(filename, INDEX_SESSIONDIR, sessionname); mkdir(filename, 0700); make_filename(filename, INDEX_SESSION, sessionname); fp = fopen(filename, "w"); if (!fp) return NULL; /* can't open */ return fp; } void write_setting_s(void *handle, const char *key, const char *value) { FILE *fp = (FILE *)handle; fprintf(fp, "%s=%s\n", key, value); } void write_setting_i(void *handle, const char *key, int value) { FILE *fp = (FILE *)handle; fprintf(fp, "%s=%d\n", key, value); } void close_settings_w(void *handle) { FILE *fp = (FILE *)handle; fclose(fp);keyvalkeycmp(void *av, void *bv) { struct keyval *a = (struct keyval *)av; struct keyval *b = (struct keyvalkeyvalkeyvalkeykeyvalchar filename[FILENAME_MAX]; FILE *fp; char *line; tree234 *ret; make_filename(filename, INDEX_SESSION, sessionname); fp = fopen(filename, "r"); if (!fp) return NULL; /* can't open */ ret = newtree234(keycmp); while ( (line = fgetline(fp)) ) { char *value = strchr(line, '='); struct keyval *kv; if (!value) continue; *value++ = '\0'; value[strcspn(value, "\r\n")] = '\0'; /* trim trailing NL */ kv = snew(struct keyval); kv->key = dupstr(line); kv->value = dupstr(value); add234(ret, kv); sfree(line); } fclose(fp); return ret; } char *read_setting_s(void *handle, const char *key, char *buffer, int buflen) { tree234 *tree = (tree234 *)handle; const char *val; struct keyval tmp, *kv; tmp.key = key; if (tree != NULL && (kv = find234(tree, &tmp, NULL)) != NULL) { val = kv->value; assert(val != NULL); } else val = get_setting(key); tree234 *tree = (tree234 *)handle; const char *val; struct keyval tmp, *kv; tmp.key = key; if (tree != NULL && (kv = find234(tree, &tmp, NULL)) != NULL) { val = kv->value; assert(val != NULL); } else val = get_setting(key); tree234 *tree = (tree234 *)handle; struct keyval *kv; if (!tree) return; while ( (kv = index234(tree, 0)) != NULL) { del234(tree, kv); sfree((char *)kv->key); sfree((char *)kv->value); sfree(kv); } freetree234(tree); } void del_settings(const char *sessionname) { char filename[FILENAME_MAX]; make_filename(filename, INDEX_SESSION, sessionname); unlink(filename); } void *enum_settings_start(void) { DIR *dp; char filename[FILENAME_MAX]; make_filename(filename, INDEX_SESSIONDIR, NULL); dp = opendir(filename); return dp; } char *enum_settings_next(void *handle, char *buffer, int buflen) { DIR *dp = (DIR *)handle; struct dirent *de; struct stat st; char fullpath[FILENAME_MAX]; int len; char *unmunged; make_filename(fullpath, INDEX_SESSIONDIR, NULL); len = strlen(fullpath); while ( (de = readdir(dp)) != NULL ) { if (len < FILENAME_MAX) { fullpath[len] = '/'; strncpy(fullpath+len+1, de->d_name, FILENAME_MAX-(len+1)); fullpath[FILENAME_MAX-1] = '\0'; } if (stat(fullpath, &st) < 0 || !S_ISREG(st.st_mode)) continue; /* try another one */ unmunged = unmungestr(de->d_name); strncpy(buffer, unmunged, buflen); buffer[buflen-1] = '\0'; sfree(unmunged); return buffer; } return NULL; } void enum_settings_finish(void *handle) { DIR *dp = (DIR *)handle; closedir(dp), NULL, NULL, NULL, NULL, NULL, NULL Revision-number: 3032 Prop-content-length: 208 Content-length: 208 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-31T11:42:45.000000Z K 7 svn:log V 107 And everyone's favourite cosmetic change: Unix PuTTY now doesn't claim to be pterm in the window title :-) PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8f8c311f69683606c374df222f300928 Text-delta-base-sha1: f80916e9ac7cd538d992584dc56ae98ab6269d5b Text-content-length: 272 Text-content-md5: 4795ec8979aafeb8fe4299712047b904 Text-content-sha1: 303293e50db456ba3313122324636f6cf6da80ec Content-length: 313 K 15 cvs2svn:cvs-rev V 5 1.101 PROPS-END SVNT*gTf@ if (inst->cfg.wintitle[0]) set_title(inst, inst->cfg.wintitle); else { char *title = make_default_wintitle(realhost); set_title(inst, title); sfree(title); } Node-path: putty/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d60a62b6b295287453c24770b9130846 Text-delta-base-sha1: 1eb88a99069eb4f1d209c988527fa4394a2086ae Text-content-length: 95 Text-content-md5: 115a3873a8df0829c802b9000374c730 Text-content-sha1: 4c698452216812ada3899d894ba55923edf243ac Content-length: 134 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNh ISILOchar *make_default_wintitle(char *hostname) { return dupstr("pterm"); Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 80c9d9763352fa99bbd594c0b1270f37 Text-delta-base-sha1: b92b339dfbe4243a8f0fea483a9e195d3ebb9fe0 Text-content-length: 107 Text-content-md5: 2035af13851312e732ed8fd221961d6b Text-content-sha1: 5258339fd55963b79931c2df0502094ddaa820f1 Content-length: 147 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN` UUu pterm.c needs from {ptermm,uxputty}.c */ char *make_default_wintitle(char *hostname); Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 64cb15f6630b88db7e1f847acce26b58 Text-delta-base-sha1: 478ea32f80515c580de4cbfe2e73a445e0ef03a6 Text-content-length: 122 Text-content-md5: 3e96828ffbdfeee20c2bacd45586d638 Text-content-sha1: 6f66820375677641bfe14bf39b48dc359387e12c Content-length: 161 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNZ3+mcWZk4char *make_default_wintitle(char *hostname) { return dupcat(hostname, " - PuTTY", NULL Revision-number: 3033 Prop-content-length: 260 Content-length: 260 K 7 svn:log V 159 pterm.c now relies on backend `exitcode' functions returning <0 when the session is still connected, and not returning an exit code until after it's finished. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-31T12:10:08.000000Z PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2ae5315988778f0eeba6705ed7800cda Text-delta-base-sha1: 9d1db5cd112cb5449ac54001354c1847cc48144e Text-content-length: 148 Text-content-md5: 9b96a2e0bf57948a505e6341be02c0f7 Text-content-sha1: 4982a4e543b6f4a5f476acc636de9b4277e18d5e Content-length: 188 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNdfzzG|%?Raw raw = (Raw) handle; if (raw->s != NULL) return -1; /* still connected */ else Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 986254aef14e98aaff18cd805ee7bd92 Text-delta-base-sha1: 676f8b418443275d7c699775dca20375f6788b6f Text-content-length: 162 Text-content-md5: 4efd0dcea284816b74cf29e26fa646be Text-content-sha1: 8a8f7588fa56708e4a9c1e6fb5b3221e77824104 Content-length: 202 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNX;P:RRlogin rlogin = (Rlogin) handle; if (rlogin->s != NULL) return -1; /* still connected */ else Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 58b9499fce7483d19401d176d5173c9c Text-delta-base-sha1: 9b1ec0f04fdc95603ba429dd5487b3fe25dea414 Text-content-length: 167 Text-content-md5: a6b260f24067a15dad245c69a1ecd450 Text-content-sha1: 4bba3133c250007f67a24ac5486bf6902ddfd665 Content-length: 207 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNtWD~S>Telnet telnet = (Telnet) handle; if (telnet->s != NULL) return -1; /* still connected */ else Revision-number: 3034 Prop-content-length: 323 Content-length: 323 K 7 svn:log V 222 Support for PuTTY-style command-line arguments in Unix PuTTY. I think it's now actually usable as a day-to-day SSH client, even if things like the Event Log are still missing. So I call that a decent lunch hour's work :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-31T12:10:53.000000Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0e42ed7969f294e168fdfd8709723128 Text-delta-base-sha1: ce1eec7cab878f09d2317c10beed0f247823e875 Text-content-length: 28 Text-content-md5: e91abf21f9415a363bb9b0ddaf872268 Text-content-sha1: d43dd1a2400d2619f77162c4f28c37e4d73ea366 Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVN |{cmdline Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bca20a47698341a25635189b3279e69f Text-delta-base-sha1: eeefe507071e7ec53b0d24036ed10272696fe432 Text-content-length: 820 Text-content-md5: ef06a305207a04d8a4c6f14f7f5d33cb Text-content-sha1: 50842411188864bb7ace8f151f78eb98455ebdc6 Content-length: 860 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNm"k=SiMB6ExC=40n8X& z1x1y){"|ut0u \ if (need_save < 0) return | TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORKUNAVAILABLE_IN(TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORKUNAVAILABLE_IN(TOOLTYPE_NONNETWORKUNAVAILABLE_IN(TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORK | TOOLTYPE_NONNETWORK); SAVEABLE(0); cfg->nopty = 1; } if (!strcmp(p, "-C")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); SAVEABLE(0); cfg->compression = 1; } if (!strcmp(p, "-1")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_NONNETWORKUNAVAILABLE_IN(TOOLTYPE_NONNETWORKUNAVAILABLE_IN(TOOLTYPE_NONNETWORK Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4c23cf61ed457621f55af5d18abcb4fd Text-delta-base-sha1: 02ef848acceac308aeed269d556fbaaa953c40e1 Text-content-length: 54 Text-content-md5: 5e8edef7f8011132bc1f47de9179f1ae Text-content-sha1: fb2cfcf4c609d027f482371aabdccc15b66e5e84 Content-length: 95 K 15 cvs2svn:cvs-rev V 5 1.207 PROPS-END SVN'E ;m:#define TOOLTYPE_NONNETWORK 2 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 32099649fa1a29ea2674fab4d6b44789 Text-delta-base-sha1: 40373b94444766f13f264267cf8459f90ab4104a Text-content-length: 24 Text-content-md5: 7af276ef39b7f16f4e6b4db6add1533a Text-content-sha1: 6e3a9873ced9874f46bff8060185db94a302bbae Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN`C .K Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4795ec8979aafeb8fe4299712047b904 Text-delta-base-sha1: 303293e50db456ba3313122324636f6cf6da80ec Text-content-length: 714 Text-content-md5: b7f554289329caa46c7c047aa5182a21 Text-content-sha1: 093a3e2dc0e9ea2f5245de98d0804e0c75c0cc21 Content-length: 755 K 15 cvs2svn:cvs-rev V 5 1.102 PROPS-END SVN*7&MY.FzCiAvoid cmdline_error(char *p, ...) { va_list ap; fprintf(stderr, "plink int ret; ret = cmdline_process_param(p, (argc > 1 ? argv[1] : NULL), do_everything ? 1 : -1, cfg); if (ret == -2) { cmdline_error("option \"%s\" requires an argument", p); } else if (ret == 2) { --argc, ++argv; /* skip next argument */ continue; } else if (ret == 1) { continue; } if(p[0] != '-' && (!do_everything || process_nonoption_arg(p, cfg))) { /* do nothing */ cmdline_run_saved(&inst->cfg); if (!*inst->cfg.host && Node-path: putty/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 115a3873a8df0829c802b9000374c730 Text-delta-base-sha1: 4c698452216812ada3899d894ba55923edf243ac Text-content-length: 183 Text-content-md5: b971d08cdff41b0b03c6637117fed41d Text-content-sha1: c5014302f75c58c0683fd146d8940b8835311fad Content-length: 222 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNhSuiL9/int process_nonoption_arg(char *arg, Config *cfg) { return 0; /* pterm doesn't have any.cmdline_tooltype = TOOLTYPE_NONNETWORK; Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2035af13851312e732ed8fd221961d6b Text-delta-base-sha1: 5258339fd55963b79931c2df0502094ddaa820f1 Text-content-length: 69 Text-content-md5: e75d3c43389ec9c74f4f4a39205f9b3a Text-content-sha1: a00b02036a19c490966f5b463c71c307a25851a2 Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN` 0lwiint process_nonoption_arg(char *arg, Config *cfg Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3e96828ffbdfeee20c2bacd45586d638 Text-delta-base-sha1: 6f66820375677641bfe14bf39b48dc359387e12c Text-content-length: 1532 Text-content-md5: ebcbf6386f10011d3692633371cbebbf Text-content-sha1: 7591945cf3ddb82edad07ce0bfca0aeb3ccbea7c Content-length: 1571 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN6[A3JwVJprotocol = PROT_TELNET; p = q; while (*p && *p != ':' && *p != '/') p++; c = *p; if (*p) *p++ = '\0'; if (c == ':') cfg->port = atoi(p); else cfg->port = -1; strncpy(cfg->host, q, sizeof(cfg->host) - 1); cfg->host[sizeof(cfg->host) - 1] = '\0'; got_host = 1; } else { /* * Otherwise, treat this argument as a host name. */ while (*p && !isspace((unsigned char)*p)) p++; if (*p) *p++ = '\0'; strncpy(cfg->host, q, sizeof(cfg->host) - 1); cfg->host[sizeof(cfg->host) - 1] = '\0'; got_host = 1; } return 1 Revision-number: 3035 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2003-03-31T12:11:21.000000Z K 7 svn:log V 57 Ahem; update the TODO to reflect the cmdline changes :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ebcbf6386f10011d3692633371cbebbf Text-delta-base-sha1: 7591945cf3ddb82edad07ce0bfca0aeb3ccbea7c Text-content-length: 20 Text-content-md5: e2c70a1d98c81f621ae87723d5f0d863 Text-content-sha1: edcff20e0fa7500d5a8c8193a8c0fc99ef92eba3 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN6 FEq Revision-number: 3036 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 37 Trivial segfault fix from Richard B. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-03-31T12:57:36.000000Z PROPS-END Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e2c70a1d98c81f621ae87723d5f0d863 Text-delta-base-sha1: edcff20e0fa7500d5a8c8193a8c0fc99ef92eba3 Text-content-length: 29 Text-content-md5: 7014a44caf673e64621f5fc47a9d5b31 Text-content-sha1: 0dddc2dbb561431140896875bc3633b5733e25c2 Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN  NFEp = arg; Revision-number: 3037 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2003-03-31T13:15:51.000000Z K 7 svn:log V 71 Make sure the socket is closed properly in the various SSH exit paths. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c646fd686d888969161ab5c0f40d1980 Text-delta-base-sha1: 5edae4fc1c370b8232528d99f9a236277c54fd8a Text-content-length: 791 Text-content-md5: c438af924b215e8b2850f69b637a08d5 Text-content-sha1: 69d8a61eedcdd4fe02f0b8976a70fd32b49f8bd6 Content-length: 832 K 15 cvs2svn:cvs-rev V 5 1.282 PROPS-END SVN(MKB7/ ssh_closing((Plug)ssh, NULL, 0, 0) ssh_closing((Plug)ssh, NULL, 0, 0) ssh_closing((Plug)ssh, NULL, 0, 0)FXurN Px gss|q;oOgLRpfd_newconnect(&c->u.pfd.s, host, port, c, &ssh->cfg); _closing((Plug)ssh, NULL, 0, 0) ssh_closing((Plug)ssh, NULL, 0, 0) ssh_closing((Plug)ssh, NULL, 0, 0) ssh_closing((Plug)ssh, NULL, 0, 0) logevent("All channels closed. Disconnecting"); ssh_closing((Plug)ssh, NULL, 0, 0) ssh_closing((Plug)ssh, NULL, 0, 0)if (ssh->s != NULL) return -1; else return (ssh->exitcode >= 0 ? ssh->exitcode : 0) Revision-number: 3038 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2003-03-31T15:21:09.000000Z K 7 svn:log V 148 Thomas Dickey reports that our description is more than half wrong. I don't currently have time to revalidate it, so just flag this in the header. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/xterm-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 07eb8acca62270d9dab897043c876f26 Text-delta-base-sha1: a4ff9f4c08ac0bafe4d320869e82447bf503dc4f Text-content-length: 186 Text-content-md5: 225d8e4038d0830e66cdcd2cd3bb306c Text-content-sha1: 0eb08a13c57cbbb66b6c71dd9a9a1f6e89c8d57e Content-length: 225 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN. $y$v> The following is mostly untrue. Do not depend on it for anything whatever. If anyone can supply a better description, that would probably be useful.

    Revision-number: 3039 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2003-04-01T09:41:15.000000Z K 7 svn:log V 115 We seem to get asked about this one quite a lot, so it's going on the (non-)wishlist so we can point people at it. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/locking-settings Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2962 Text-content-md5: 3ebafe4bf4cef32b033d7950cae849f9 Text-content-sha1: 4d6806a9761072ad854df325d46c74531a4df1c6 Content-length: 3078 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Ability to lock settings against user changes Class: wish Priority: never Difficulty: tricky Content-type: text/x-html-body

    We get asked reasonably often if it's possible for a sysadmin to set up PuTTY saved settings and then lock them, in such a way that their users wouldn't be able to fiddle with them.

    It's not, and I (SGT) don't intend that it ever should be. This is for two reasons.

    For a start, it seems to me to run counter to the whole point of software, and certainly the whole point of PuTTY in particular, which is to enable people to do useful things. The reason I give my free time to develop PuTTY is because I enjoy making it possible for people to do things they otherwise would not have been able to do - and judging by the mail we get back from happy users, they enjoy it too. So adding a feature which would allow someone to stop people from doing things they otherwise would have been able to do seems to me like a step backwards.

    Secondly, it wouldn't even work; or, at least, it wouldn't work in all but the most ludicrously restrictive setups. The reason for this is that this sort of restriction is voluntary on the part of the application - so all a user would need to bypass it would be a modified version of the application, which didn't voluntarily obey the restrictions. And this wouldn't be hard to come by; even commercial, closed-source programs which try to restrict users from doing things give rise to cracking tools, distributed on the Web and designed to bypass whatever restriction was imposed by the software. A program whose source code is freely available to anyone with a web browser would be an order of magnitude easier to do this to. I confidently predict that if I implemented a user-restricting feature in PuTTY, then it wouldn't take long for someone else to provide a version for download which simply ignored the restrictions. So the only environment in which a restricted PuTTY would actually be secure would be one in which the user was somehow forcibly prevented from installing an unrestricted version.

    (Even locking the Registry itself against updates wouldn't protect you against a version of PuTTY which had been modified to store its data somewhere else. Really, your only chance of success is if you completely prevent users from running any binaries except the ones you supply.)

    In summary: if I have my way then PuTTY will not implement a voluntary locking mechanism. Any sysadmin who really, really wants such a thing can of course modify the source code and implement it themselves, and take whatever precautions they feel necessary to ensure users don't download the original version and bypass the restrictions; but I don't feel that it's an appropriate use of the PuTTY team's time and effort, or an appropriate use of space in the standard PuTTY binary (which we're still trying to keep small). Revision-number: 3040 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2003-04-01T11:39:56.000000Z K 7 svn:log V 87 Summary: Should be able to copy to clipboard without mouse (suggested to me by Julian) K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/keyboard-copy Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 750 Text-content-md5: 6f84216faf57b1c3e45dc95414a85fac Text-content-sha1: f64afe959dbdd8c046a356702255b583932bb653 Content-length: 866 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN```Summary: Should be able to copy to clipboard without mouse Class: wish Priority: low Difficulty: tricky Content-type: text/plain It's been suggested that it should be possible to copy text to the Windows clipboard (and equivalents) without using the mouse. The usual Windows idiom for this would be to move one end of the selection using the cursor keys, and the other end with the shifted cursor keys. Obviously imitating this directly would be silly, since users need the cursor keys to be sent to the server. One possibility might be to have a separate mode, in the style of NCSA Telnet for DOS, which uses Scroll Lock to switch into a mode in which no data are received and the cursor keys move a local selection cursor around. Revision-number: 3041 Prop-content-length: 237 Content-length: 237 K 7 svn:log V 136 Various error-handling fixes, mostly in Unix PuTTY but one (failure to save a session) crosses over into the platform-independent side. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-01T18:10:25.000000Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6f8e129d59697996fd685e9d358ca5a9 Text-delta-base-sha1: ca74dc03bab8cd813326ff52abf2d0d3f26f9d4d Text-content-length: 258 Text-content-md5: 4073aba08ae7a16c90c4f52142f65707 Text-content-sha1: be5653aac1acd94eb293df9b28880aa630e1e1b1 Content-length: 298 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN-f g"g]P { char *errmsg = save_settings(savedsession, !isdef, cfg); if (errmsg) { dlg_error_msg(dlg, errmsg); sfree(errmsg); } } Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 72e64304fb5b63f78997c0658c693fe8 Text-delta-base-sha1: 84c80b8514964fc059d3e5047a7277494960af57 Text-content-length: 113 Text-content-md5: c834c9e1441943ebdff743f8335021e6 Text-content-sha1: 6a51ee4c46836874e6b8fc2ade992f7a71b71984 Content-length: 153 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN?aVw0m''/* $Id: macstore.c,v 1.19 2003/04/01 18:10:25 simo, char **errmsg *errmsg = NULL; Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5e8edef7f8011132bc1f47de9179f1ae Text-delta-base-sha1: fb2cfcf4c609d027f482371aabdccc15b66e5e84 Text-content-length: 31 Text-content-md5: 7b940263b0c90044c497bad7889745f2 Text-content-sha1: 6256af93696082a294d63a01d57da411a8541ca6 Content-length: 72 K 15 cvs2svn:cvs-rev V 5 1.208 PROPS-END SVNEF ).char * Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 08fde077f9689cfbf8da3d3841f1a715 Text-delta-base-sha1: 2bbddf03d9baf83aced3ce79f95470517951a7cd Text-content-length: 323 Text-content-md5: e124e544da41d658d0462933b1d4849b Text-content-sha1: 3200c66c822f5d75d545bc526067224b035713e8 Content-length: 364 K 15 cvs2svn:cvs-rev V 5 1.107 PROPS-END SVN,`$-$NxAkchar *save_settings(char *section, int do_host, Config * cfg) { void *sesskey; char *errmsg; sesskey = open_settings_w(section, &errmsg); if (!sesskey) return errmsg; save_open_settings(sesskey, do_host, cfg); close_settings_w(sesskey); return NULL; } void save Node-path: putty/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b31a0813c36cdd2afd14e9316985e14a Text-delta-base-sha1: afe7a0f71e6e3b27444c0de03ac184944fc523a0 Text-content-length: 143 Text-content-md5: 500a70e1612f5b087e148d550f8183c1 Text-content-sha1: 829567794a346f978fe9c088971e611f6615b5f3 Content-length: 182 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN= yy5 * Any returned error message must be freed after use. */ void *open_settings_w(const char *sessionname, char **errmsg Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7af276ef39b7f16f4e6b4db6add1533a Text-delta-base-sha1: 6e3a9873ced9874f46bff8060185db94a302bbae Text-content-length: 124 Text-content-md5: 197c75bd2d6b73e344f5e7ff2f4b4d2e Text-content-sha1: 1a06d07b54843c815abfc69cdb6e88d2adb51fbd Content-length: 164 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNCXv~i*_message_box(void *window, char *msg) { messagebox(windowfatal_message_box(NULL, msg Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b7f554289329caa46c7c047aa5182a21 Text-delta-base-sha1: 093a3e2dc0e9ea2f5245de98d0804e0c75c0cc21 Text-content-length: 1384 Text-content-md5: 7743c042009101d99d36853f7f933974 Text-content-sha1: 4aab01d69b5bdfc21f44461ad99effcbf959a528 Content-length: 1425 K 15 cvs2svn:cvs-rev V 5 1.103 PROPS-END SVN72(n8xTbuApSdvoid connection_fatal(void *frontend, char *p, ... va_list ap; char *msg; va_start(ap, p); msg = dupvprintf(p, ap); va_end(ap); inst->exited = TRUE; fatal_message_box(inst->window, msg); sfree(msg); if (inst->cfg.close_on_exit == FORCE_ON) cleanup_exit(1!inst->exited && /* * We must process exceptional notifications before ordinary * readability ones, or we may go straight past the urgent * marker. */ if (condition & GDK_INPUT_EXCEPTION) select_result(sourcefd, 4); if (condition & GDK_INPUT_READ) select_result(sourcefd, 1); if (condition & GDK_INPUT_WRITE) select_result(sourcefd, 2term_size(inst->term, inst->cfg.height, inst->cfg.width, inst->cfg.savelines); inst->back = select_backend(&inst->cfg); { char *realhost, *error; error = inst->back->init((void *)inst->term, &inst->backhandle, &inst->cfg, inst->cfg.host, inst->cfg.port, &realhost, inst->cfg.tcp_nodelay); if (error) { char *msg = dupprintf("Unable to open connection to %s:\n%s", inst->cfg.host, error); inst->exited = TRUE; fatal_message_box(inst->window, msg); sfree(msg); return 0; } Node-path: putty/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b971d08cdff41b0b03c6637117fed41d Text-delta-base-sha1: c5014302f75c58c0683fd146d8940b8835311fad Text-content-length: 222 Text-content-md5: 009655826446bf765ebcf8b80b614259 Text-content-sha1: 63d5d48c48e2ce2b43de820ce704991da5f247a5 Content-length: 261 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN+DB%.BO/* * pterm main program. */ #include #include #include #include + Make sure Owen has kept the Alpha release link maps somewhere useful Revision-number: 3046 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:10.983034Z PROPS-END Revision-number: 3047 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:10.991400Z PROPS-END Revision-number: 3048 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:11.000415Z PROPS-END Revision-number: 3049 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:11.010062Z PROPS-END Revision-number: 3050 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:11.019007Z PROPS-END Revision-number: 3051 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:11.028687Z PROPS-END Revision-number: 3052 Prop-content-length: 206 Content-length: 206 K 8 svn:date V 27 2003-04-03T23:18:06.000000Z K 7 svn:log V 107 Implement columns, based loosely on Simon's Windows implementation. Now this actually _looks_ like PuTTY. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b00f7cd4af6cd5b3ee9681463caff99a Text-delta-base-sha1: 40fef97bee1e632df633ec71b54cacd331946557 Text-content-length: 1734 Text-content-md5: fc06d408d57fd49dd2420f4eb0e1b9a0 Text-content-sha1: 0902e83327430052223c596ae2751ef81bc28535 Content-length: 1774 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN0ZPh-E&~$a"UK dT3@O[ cLd/* $Id: macctrls.c,v 1.24 2003/04/03 23:18:0633); /* 14 = proxies, 20 = SSH bugs */ } #define MAXCOLS 16, j, ncols, colstart; struct mac_layoutstate cols[MAXCOLS] cols[0] = *curstate; ncols = 1;colstart = COLUMN_START(ctrl->generic.column);COLUMNS: if (ctrl->columns.ncols != 1) { ncols = ctrl->columns.ncols; fprintf(stderr, " split to %d\n", ncols); assert(ncols <= MAXCOLS); for (j = 0; j < ncols; j++) { cols[j] = cols[0]; if (j > 0) cols[j].pos.h = cols[j-1].pos.h + cols[j-1].width + 6; if (j == ncols - 1) cols[j].width = curstate->width - (cols[j].pos.h - curstate->pos.h); else cols[j].width = (curstate->width + 6) * ctrl->columns.percentages[j] / 100 - 6; } } else { fprintf(stderr, " join\n"); for (j = 0; j < ncols; j++) if (cols[j].pos.v > cols[0].pos.v) cols[0].pos.v = cols[j].pos.v; cols[0].width = curstate->width; ncols = 1; } break; case CTRL_TEXT: macctrl_text(mcs, window, &cols[colstart], ctrl); break; case CTRL_EDITBOX: macctrl_editbox(mcs, window, &cols[colstart], ctrl); break; case CTRL_RADIO: macctrl_radio(mcs, window, &cols[colstart], ctrl); break; case CTRL_CHECKBOX: macctrl_checkbox(mcs, window, &cols[colstart]&cols[colstart], ctrl); break; case CTRL_LISTBOX: if (ctrl->listbox.height == 0) macctrl_popup(mcs, window, &cols[colstart], ctrl); break; } } for (j = 0; j < ncols; j++) if (cols[j].pos.v > curstate->pos.v) curstate->pos.v = cols[j].pos.v; #if !TARGET_API_MAC_CARBON else { TEHandle te; #endif Revision-number: 3053 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2003-04-04T11:22:14.000000Z K 7 svn:log V 132 This script has been unnecessary for some time; since the config box revamp, accelerator clashes have been checked for at run-time. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/contrib/accel.pl Node-action: delete Revision-number: 3054 Prop-content-length: 522 Content-length: 522 K 8 svn:date V 27 2003-04-04T20:21:05.000000Z K 7 svn:log V 421 Turned the old `Telnet Command' System-submenu into a more general `Special Command' menu, in which any backend can place its own list of magical things the user might want to ask the backend to do. In particular I've implemented the recently proposed "break" extension in SSH2 using this mechanism. NB this checkin slightly breaks the Mac build, since it needs to provide at least a stub form of update_specials_menu(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 57e3155b258e62118d32f65c3b543100 Text-delta-base-sha1: 2dffcefcff838778d9f5072f0782b0988b4e9e87 Text-content-length: 64 Text-content-md5: 5b275597984b08fd72375e253de13f8b Text-content-sha1: e1606dacf9b992991c9f79ab65b08a091547f87b Content-length: 104 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNJy +=9void update_specials_menu(void *frontend) { Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7b940263b0c90044c497bad7889745f2 Text-delta-base-sha1: 6256af93696082a294d63a01d57da411a8541ca6 Text-content-length: 235 Text-content-md5: 9eea8824730a7b7e643082d9068d9d31 Text-content-sha1: 48723aad7b6d7a4d71204683980e91ebfa013f3b Content-length: 276 K 15 cvs2svn:cvs-rev V 5 1.209 PROPS-END SVNFEd=mC-struct telnet_special { const char *name; /* NULL==end, ""==separator */ int code; }const struct telnet_special *(*get_specials) (void *handlvoid update_specials_menu(void *frontend Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9b96a2e0bf57948a505e6341be02c0f7 Text-delta-base-sha1: 4982a4e543b6f4a5f476acc636de9b4277e18d5e Text-content-length: 208 Text-content-md5: ef3905e704884445a670000cf8da71cc Text-content-sha1: 50d788e83a7388c80061a9a46b56ed331ed9f32d Content-length: 248 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNf'2&`W/* * Return a list of the special codes that make sense in this * protocol. */ static const struct telnet_special *raw_get_specials(void *handle) { return NULLget_specials Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4efd0dcea284816b74cf29e26fa646be Text-delta-base-sha1: 8a8f7588fa56708e4a9c1e6fb5b3221e77824104 Text-content-length: 211 Text-content-md5: 03b614a2734f5f51fa584f2d39bffe12 Text-content-sha1: 506d5e99c4854ea9958719e138995ac68dc706e1 Content-length: 251 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVN;5N)[I$/* * Return a list of the special codes that make sense in this * protocol. */ static const struct telnet_special *rlogin_get_specials(void *handle) { return NULLget_specials Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c438af924b215e8b2850f69b637a08d5 Text-delta-base-sha1: 69d8a61eedcdd4fe02f0b8976a70fd32b49f8bd6 Text-content-length: 1217 Text-content-md5: 6b3d01c48a153a22cb7976abad14822b Text-content-sha1: 0ded870164609db261b16ce6286edd99b9c6c45b Content-length: 1258 K 15 cvs2svn:cvs-rev V 5 1.283 PROPS-END SVN $IDupdate_specials_menu(ssh->frontend);(-J|o% wi4EC~t, port); logevent(buf); e = version = 0; /* when not ready yetReturn a list of the special codes that make sense in this * protocol. */ static const struct telnet_special *ssh_get_specials(void *handle) { Ssh ssh = (Ssh) handle; if (ssh->version == 1) { static const struct telnet_special ssh1_specials[] = { {"IGNORE message", TS_NOP}, {NULL, 0} }; return ssh1_specials; } else if (ssh->version == 2) { static const struct telnet_special ssh2_specials[] = { {"Break", TS_BRK}, {"IGNORE message", TS_NOP}, {NULL, 0} }; return ssh2_specials; } else return NULL; || code == TS_NOPif (code == TS_BRK) { if (ssh->state == SSH_STATE_CLOSED || ssh->state == SSH_STATE_PREPACKET) return; if (ssh->version == 1) { logevent("Unable to send BREAK signal in SSH1"); } else { ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_addstring(ssh, "break"); ssh2_pkt_addbool(ssh, 0); ssh2_pkt_adduint32(ssh, 0); /* default break length */get_specials Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a6b260f24067a15dad245c69a1ecd450 Text-delta-base-sha1: 4bba3133c250007f67a24ac5486bf6902ddfd665 Text-content-length: 568 Text-content-md5: 9025210a6f6c6326c35408c91ba83c2f Text-content-sha1: 2d86e6e95d0a7dfad4285072f3bc63c12337498c Content-length: 608 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNt! Z%Oconst struct telnet_special *telnet_get_specials(void *handle) { static const struct telnet_special specials[] = { {"Are You There", TS_AYT}, {"Break", TS_BRK}, {"Synch", TS_SYNCH}, {"Erase Character", TS_EC}, {"Erase Line", TS_EL}, {"Go Ahead", TS_GA}, {"No Operation", TS_NOP}, {"", 0}, {"Abort Process", TS_ABORT}, {"Abort Output", TS_AO}, {"Interrupt Process", TS_IP}, {"Suspend Process", TS_SUSP}, {"", 0}, {"End Of Record", TS_EOR}, {"End Of File", TS_EOF}, {NULL, 0} }; return specials;get_specials Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7743c042009101d99d36853f7f933974 Text-delta-base-sha1: 4aab01d69b5bdfc21f44461ad99effcbf959a528 Text-content-length: 179 Text-content-md5: 4c348f94bc69ae86e25654906eceecb2 Text-content-sha1: 688f332fb8a54885c4b91fdb3d86ee50de16ab0e Content-length: 220 K 15 cvs2svn:cvs-rev V 5 1.104 PROPS-END SVN> void update_specials_menu(void *frontend) { /* * When I implement a context menu in pterm, I will need to * support this function properly Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8e90c21d7e484baaefec798e5223aa42 Text-delta-base-sha1: 18c2534c9e08a5a540a1e5efca421bd94d8a5315 Text-content-length: 448 Text-content-md5: c347c6d83e4f3fb47927173451e6460d Text-content-sha1: 999b1bbfdc14d7f806f80bbbb36bd9605eb03ff5 Content-length: 488 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNT-'(E/* * Return a list of the special codes that make sense in this * protocol. */ static const struct telnet_special *pty_get_specials(void *handle) { /* * Hmm. When I get round to having this actually usable, it * might be quite nice to have the ability to deliver a few * well chosen signals to the child process - SIGINT, SIGTERM, * SIGKILL at least. */ return NULLget_specials Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: de6c50dd816a93b2a61bec5703b7737f Text-delta-base-sha1: ffb507a04366e645d2c7b1815afef280ace509d2 Text-content-length: 59 Text-content-md5: 7fc21a5db22cb65c8157c65a93cd4661 Text-content-sha1: 083124afb8f05101cb72e5d68b2112ef7ff180b2 Content-length: 98 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN7f &YgPupdate_specials_menu(void *frontend) { Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 88297b560e8c3454fed2dae98d306fe5 Text-delta-base-sha1: 732a3fbe654d77b67717eb1d345b4af5db999291 Text-content-length: 2882 Text-content-md5: 47153b87de7dd30e70e36ae58a0bbb47 Text-content-sha1: d326b77907d5b35fa561dea37e75bd9dbbd394b6 Content-length: 2923 K 15 cvs2svn:cvs-rev V 5 1.241 PROPS-END SVNCb3z,OZ*!ovw_H4L Qh #define IDM_SPECIAL_MIN 0x0400 #define IDM_SPECIAL_MAX 0x0800 static const struct telnet_special *specials; static int specials_menu_positions; int i; AppendMenu(m, MF_SEPARATOR, 0, 0); specials_menu_position = GetMenuItemCount(m); debug(("specials_menu_position = %d\n", specials_menu_position));update_specials_menu(NULL);Update the Special Commands submenu. */ void update_specials_menu(void *frontend) { HMENU m = GetSystemMenu(hwnd, FALSE); int menu_already_exists = (specials != NULL); int i; specials = back->get_specials(backhandle); if (specials) { HMENU p = CreateMenu(); for (i = 0; specials[i].name; i++) { assert(IDM_SPECIAL_MIN + 0x10 * i < IDM_SPECIAL_MAX); if (*specials[i].name) AppendMenu(p, MF_ENABLED, IDM_SPECIAL_MIN + 0x10 * i, specials[i].name); else AppendMenu(p, MF_SEPARATOR, 0, 0); } if (menu_already_exists) DeleteMenu(m, specials_menu_position, MF_BYPOSITION); else InsertMenu(m, specials_menu_position, MF_BYPOSITION | MF_SEPARATOR, 0, 0); InsertMenu(m, specials_menu_position, MF_BYPOSITION | MF_POPUP | MF_ENABLED, (UINT) p, "Special Command"); } if (wParam >= IDM_SPECIAL_MIN && wParam <= IDM_SPECIAL_MAX) { int i = (wParam - IDM_SPECIAL_MIN) / 0x10; int j; /* * Ensure we haven't been sent a bogus SYSCOMMAND * which would cause us to reference invalid memory * and crash. Perhaps I'm just too paranoid here. */ for (j = 0; j < i; j++) if (!specials || !specials[j].name) break; if (j == i) { back->special(backhandle, specials[i].code); net_pending_errors(); }l give the keystroke * its default handling (i.e. bring up the System menu). */ if (wParam == VK_MENU && !cfg.alt_only) return 0; return -1; } void request_paste(void *frontend) { /* * In Windows, pasting is synchronous: we can read the * clipboard with no difficulty, so request_paste() can just go * ahead and paste. */ term_do_paste(term); } void set_title(void *frontend, char *title) { sfree(window_name); window_name = snewn(1 + strlen(title), char); strcpy(window_name, title); if (cfg.win_name_always || !IsIconic(hwnd)) SetWindowText(hwnd, title); } void set_icon(void *frontend, char *title) { sfree(icon_name); icon_name = snewn(1 + strlen(title), char); strcpy(icon_name, title); if (!cfg.win_name_always && IsIconic(hwnd)) SetWindowText(hwnd, title); } void set_sbar(void *frontend, int total, int start, int page) { SCROLLINFO si; if (is_full_screen() ? !cfg.scrollbar_in_fullscreen : !cfg.scrollbar) return; si.cbSize = sizeof(si); si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; si.nMin = 0; si.nMax = total - 1; si.nPage = LMM Revision-number: 3055 Prop-content-length: 467 Content-length: 467 K 8 svn:date V 27 2003-04-05T11:45:21.000000Z K 7 svn:log V 366 Dynamic port forwarding by means of a local SOCKS server. Fully supports SOCKS 4, SOCKS 4A and SOCKS 5 (well, actually IPv6 in SOCKS 5 isn't supported, but it'll be no difficulty once I actually get round to it). Thanks to Chas Honton for his `stone soup' patch: I didn't end up actually using any of his code, but it galvanised me into doing it properly myself :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef06a305207a04d8a4c6f14f7f5d33cb Text-delta-base-sha1: 50842411188864bb7ace8f151f78eb98455ebdc6 Text-content-length: 793 Text-content-md5: a1ba79b072633f26273e77747ca7099e Text-content-sha1: 06ea905731064705876cf83a5a43e0f7b3e4aeb9 Content-length: 833 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN"5#j~PP?s}MoCBfz( || !strcmp(p, "-D"))) { char *fwd, *ptr, *q, *qq; int dynamic, i=0; RETURN(2dynamic = !strcmp(p, "-D" || ptr[0] == 'D, 'R' or 'Dif (!dynamic) { /* * We expect _at least_ two colons in this string. The * possible formats are `sourceport:desthost:destport', * or `sourceip:sourceport:desthost:destport' if you're * specifying a particular loopback address. We need to * replace the one between source and dest with a \t; * this means we must find the second-to-last colon in * the string. */ q = qq = strchr(ptr, ':'); while (qq) { char *qqq = strchr(qq+1, ':'); if (qqq) q = qq; qq = qqq; } if (q) *q = '\t'; /* replace second-last colon with \t */ } Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4073aba08ae7a16c90c4f52142f65707 Text-delta-base-sha1: be5653aac1acd94eb293df9b28880aa630e1e1b1 Text-content-length: 567 Text-content-md5: 9448308239fe909a69e63c3748db9a0d Text-content-sha1: 251a5ff95a52b34dbd138ee902ea9100dd70b77b Content-length: 607 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNf&N-N',5t*51nt whichbutton = dlg_radiobutton_get(pfd->direction, dlg); if (whichbutton == 0) str[0] = 'L'; else if (whichbutton == 1) str[0] = 'R'; else str[0] = 'Dif (str[0] != 'D') { *p++ = '\t'; dlg_editbox_get(pfd->destbox, dlg, p, sizeof(str)-1 - (p - str)); if (!*p || !strchr(p, ':')) { dlg_error_msg(dlg, "You need to specify a destination address\n" "in the form \"host.name:port\""); return; } } else *p = '\0';3 "Dynamic", 'y', P(NULL), Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 584e87c08a157db5f7096e68a0e8f6fa Text-delta-base-sha1: 449c8eecb0019a2346b666a5f85f56637755ee76 Text-content-length: 74 Text-content-md5: e09df7c214084cea8162ff531ede8df2 Text-content-sha1: e05807fdca3482251b6b70966383f6279757b328 Content-length: 114 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVN h 3cRND listen-port Dynamic SOCKS-based port forwarding Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ab0e5e19db97f537f34d4bc2f50b0ae Text-delta-base-sha1: 93f044540355088b850ca85b28e5ce5ca8ac8bfd Text-content-length: 7924 Text-content-md5: b5ab408c7646bf639ae16ad85a7f2734 Text-content-sha1: 51f84fc6485ee182d2f805076960b9e115f4f32b Content-length: 7964 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNqPaZ% ]yGVcns\kJQm1L7 |qint throttled, throttle_override; int ready; /* * `dynamic' does double duty. It's set to 0 for an ordinary * forwarded port, and nonzero for SOCKS-style dynamic port * forwarding; but it also represents the state of the SOCKS * exchange. */ int dynamic; /* * `hostname' and `port' are the real hostname and port, once * we know what we're connecting to; they're unused for this * purpose while conducting a local SOCKS exchange, which means * we can also use them as a buffer and pointer for reading * data from the SOCKS client. */ char hostname[256]; int port; /* * When doing dynamic port forwarding, we can receive * connection data before we are actually able to send it; so * we may have to temporarily hold some in a dynamically * allocated buffer here. */ void *buffer; int buflen; };if (pr->c) dynamic) { while (len--) { if (pr->port >= lenof(pr->hostname)) { if ((pr->dynamic >> 12) == 4) { /* Send back a SOCKS 4 error before closing. */ char data[8]; memset(data, 0, sizeof(data)); data[1] = 91; /* generic `request rejected' */ sk_write(pr->s, data, 8); } pfd_close(pr->s); return 1; } pr->hostname[pr->port++] = *data++; /* * Now check what's in the buffer to see if it's a * valid and complete message in the SOCKS exchange. */ if ((pr->dynamic == 1 || (pr->dynamic >> 12) == 4) && pr->hostname[0] == 4) { /* * SOCKS 4. */ if (pr->dynamic == 1) pr->dynamic = 0x4000; if (pr->port < 2) continue;/* don't have command code yet */ if (pr->hostname[1] != 1) { /* Send back a SOCKS 4 error before closing. */ char data[8]; memset(data, 0, sizeof(data)); data[1] = 91; /* generic `request rejected' */ sk_write(pr->s, data, 8); pfd_close(pr->s); return 1; } if (pr->port < 8) continue; /* haven't started username */ if (pr->hostname[pr->port-1] != 0) continue; /* haven't _finished_ username */ /* * Now we have a full SOCKS 4 request. Check it to * see if it's a SOCKS 4A request. */ if (pr->hostname[4] == 0 && pr->hostname[5] == 0 && pr->hostname[6] == 0 && pr->hostname[7] != 0) { /* * It's SOCKS 4A. So if we haven't yet * collected the host name, we should continue * waiting for data in order to do so; if we * have, we can go ahead. */ int len; if (pr->dynamic == 0x4000) { pr->dynamic = 0x4001; continue; } pr->hostname[0] = 0; /* reply version code */ pr->hostname[1] = 90; /* request granted */ sk_write(pr->s, pr->hostname, 8); pr->port = GET_16BIT_MSB_FIRST(pr->hostname+2); len = strlen(pr->hostname+8); memmove(pr->hostname, pr->hostname + 8 + len + 1, lenof(pr->hostname) - (8 + len + 1)); goto connect; } else { /* * It's SOCKS 4, which means we should format * the IP address into the hostname string and * then just go. */ pr->hostname[0] = 0; /* reply version code */ pr->hostname[1] = 90; /* request granted */ sk_write(pr->s, pr->hostname, 8); pr->port = GET_16BIT_MSB_FIRST(pr->hostname+2); sprintf(pr->hostname, "%d.%d.%d.%d", (unsigned char)pr->hostname[4], (unsigned char)pr->hostname[5], (unsigned char)pr->hostname[6], (unsigned char)pr->hostname[7]); goto connect; } } if ((pr->dynamic == 1 || (pr->dynamic >> 12) == 5) && pr->hostname[0] == 5) { /* * SOCKS 5. */ if (pr->dynamic == 1) pr->dynamic = 0x5000; if (pr->dynamic == 0x5000) { int i, method; char data[2]; /* * We're receiving a set of method identifiers. */ if (pr->port < 2) continue;/* no method count yet */ if (pr->port < 2 + (unsigned char)pr->hostname[1]) continue; /* no methods yet */ method = 0xFF; /* invalid */ for (i = 0; i < (unsigned char)pr->hostname[1]; i++) if (pr->hostname[2+i] == 0) { method = 0;/* no auth */ break; } data[0] = 5; data[1] = method; sk_write(pr->s, data, 2); pr->dynamic = 0x5001; pr->port = 0; /* re-empty the buffer */ continue; } if (pr->dynamic == 0x5001) { int atype, alen; if (pr->port < 6) continue; atype = (unsigned char)pr->hostname[3]; if (atype == 1) /* IPv4 address */ alen = 4; if (atype == 4) /* IPv6 address */ alen = 16; if (atype == 3) /* domain name has leading length */ alen = 1 + (unsigned char)pr->hostname[4]; if (pr->port < 6 + alen) continue; if (pr->hostname[1] != 1 || pr->hostname[2] != 0) { pr->hostname[1] = 1; /* generic failure */ pr->hostname[2] = 0; /* reserved */ sk_write(pr->s, pr->hostname, pr->port); pfd_close(pr->s); return 1; } /* * Now we have a viable connect request. Switch * on atype. */ pr->port = GET_16BIT_MSB_FIRST(pr->hostname+4+alen); if (atype == 1) { pr->hostname[1] = 0; /* succeeded */ sk_write(pr->s, pr->hostname, alen + 6); sprintf(pr->hostname, "%d.%d.%d.%d", (unsigned char)pr->hostname[4], (unsigned char)pr->hostname[5], (unsigned char)pr->hostname[6], (unsigned char)pr->hostname[7]); goto connect; } else if (atype == 3) { pr->hostname[1] = 0; /* succeeded */ sk_write(pr->s, pr->hostname, alen + 6); memmove(pr->hostname, pr->hostname + 5, alen-1); pr->hostname[alen-1] = '\0'; goto connect; } else { /* * Unknown address type. (FIXME: support IPv6!) */ pr->hostname[1] = 8; /* atype not supported */ sk_write(pr->s, pr->hostname, pr->port); pfd_close(pr->s); return 1; } } } /* * If we get here without either having done `continue' * or `goto connect', it must be because there is no * sensible interpretation of what's in our buffer. So * close the connection rudely. */ pfd_close(pr->s); return 1; } return 1; /* * We come here when we're ready to make an actual * connection. */ connect: pr->c = new_sock_channel(pr->backhandle, pr->s); if (pr->c == NULL) { pfd_close(pr->s); return 1; } else { /* asks to forward to the specified host/port for this */ ssh_send_port_open(pr->c, pr->hostname, pr->port, "forwarding"); } pr->dynamic = 0; /* * Now freeze the socket until the SSH server confirms the * connection. */ sk_set_frozen(pr->s, 1); /* * If there's any data remaining in our current buffer, * save it to be sent on pfd_confirm(). */ if (len > 0) { pr->buffer = snewn(len, char); memcpy(pr->buffer, data, len); pr->buflen = len; } }if (pr->c) buffer = NULLbuffer = NULLsk_set_private_ptr(s, pr); pr->throttled = pr->throttle_override = 0; pr->ready = 0; if (org->dynamic) { pr->dynamic = 1; pr->port = 0; /* hostname buffer is so far empty */ sk_set_frozen(s, 0); /* we want to receive SOCKS _now_! */ } else { strcpy(pr->hostname, org->hostname); pr->port = org->port; pr->c = new_sock_channel(org->backhandle, s); if (pr->c == NULL) { sfree(pr); return 1; } else { /* asks to forward to the specified host/port for this */ ssh_send_port_open(pr->c, pr->hostname, pr->port, "forwarding"); }buffer = NULL; pr->fn = &fn_table; pr->c = NULL; if (desthost) { strcpy(pr->hostname, desthost); pr->port = destport; pr->dynamic = 0; } else pr->dynamic = 1->buffer); if (pr->buffer) { sshfwd_write(pr->c, pr->buffer, pr->buflen); sfree(pr->buffer); pr->buffer = NULL; } Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9eea8824730a7b7e643082d9068d9d31 Text-delta-base-sha1: 48723aad7b6d7a4d71204683980e91ebfa013f3b Text-content-length: 443 Text-content-md5: 774f824ed88534ee8634809c3c8eeb99 Text-content-sha1: b104d9d720472ba68b32fd62b4bf10b170108e37 Content-length: 484 K 15 cvs2svn:cvs-rev V 5 1.210 PROPS-END SVNd !:! /* * The port forwarding string contains a number of * NUL-terminated substrings, terminated in turn by an empty * string (i.e. a second NUL immediately after the previous * one). Each string can be of one of the following forms: * * [LR]localport\thost:port * [LR]localaddr:localport\thost:port * Dlocalport * Dlocaladdr:localport */ char portfwd[1024]; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6b3d01c48a153a22cb7976abad14822b Text-delta-base-sha1: 0ded870164609db261b16ce6286edd99b9c6c45b Text-content-length: 2211 Text-content-md5: d40648244f949b55568f39ce09b97780 Text-content-sha1: d812fdb51b4b8a3e192d33759f766ba808b42d23 Content-length: 2252 K 15 cvs2svn:cvs-rev V 5 1.284 PROPS-END SVN!2{d |Q9ltype != 'D') { if (*ssh->portfwd_strptr == '\t') ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != ':') { if (n < 255) host[n++] = *ssh->portfwd_strptr++; } host[n] = 0; if (*ssh->portfwd_strptr == ':') ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr) { if (n < 255) dports[n++] = *ssh->portfwd_strptr++; } dports[n] = 0; ssh->portfwd_strptr++; dport = atoi(dports); dserv = 0; if (dport == 0) { dserv = 1; dport = net_service_lookup(dports); if (!dport) { logeventf(ssh, "Service lookup failed for" " destination port \"%s\"", dports); } } } else { while (*ssh->portfwd_strptr) ssh->portfwd_strptr++;if (type == 'D') { pfd_addforward(NULL, -1doing SOCKS dynamic forwarding(f%_Zd n|09K9o; } *h = 0; port = GET_32BIT(p); strcpy(pf.dhost, host); pf.dport = port; if (find234(ssh->rportfwds, &pf, NULL) == NULL) { sprintf(buf, "Rejected remote port open request for %s:%d", host, port); logevent(buf); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(ssh->pktin.body), PKT_END); } else { sprintf(buf, "Received remote port open request for %s:%d", hostype != 'D') { if (*ssh->portfwd_strptr == '\t') ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != ':') { if (n < 255) host[n++] = *ssh->portfwd_strptr++; } host[n] = 0; if (*ssh->portfwd_strptr == ':') ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr) { if (n < 255) dports[n++] = *ssh->portfwd_strptr++; } dports[n] = 0; ssh->portfwd_strptr++; dport = atoi(dports); dserv = 0; if (dport == 0) { dserv = 1; dport = net_service_lookup(dports); if (!dport) { logeventf(ssh, "Service lookup failed for destination" " port \"%s\"", dports); } } } else { while (*ssh->portfwd_strptr) ssh->portfwd_strptr++;if (type == 'D') { pfd_addforward(NULL, -1doing SOCKS dynamic forwarding Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fd10c69d903caed98fc352d4d54418e0 Text-delta-base-sha1: 130ec6a8ecee6827acedde43dfb1d1f31f865c98 Text-content-length: 86 Text-content-md5: 0b385bc0bb05e7a3b03eb8ad02761cab Text-content-sha1: d75cf80d097e2819d62ac6c91d55ebd9bc0d8d26 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNv7 @T@#S/* desthost == NULL indicates dynamic (SOCKS) port forwarding */ Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d4f428753b7a5ce9f8326098a725b72 Text-delta-base-sha1: 7b8e5935da7c280288f0833e41a337133f616ab1 Text-content-length: 74 Text-content-md5: f3cef907ac03bde7c008d8fe51da9312 Text-content-sha1: bf217368d322f57ab873402e7f36f2a6bdb1c248 Content-length: 114 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNJ 3po[D listen-port Dynamic SOCKS-based port forwarding Revision-number: 3056 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2003-04-05T11:52:42.000000Z K 7 svn:log V 90 ... of course, it would help if I remembered to _document_ dynamic port forwarding. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 031bc891cee7656eda5f3cde860fde5e Text-delta-base-sha1: 2549bbd8d64408a4c4554bf5f73e357e715b4c36 Text-content-length: 554 Text-content-md5: a9df7b52f5f811eafcc4ab5f860373b0 Text-content-sha1: 9b1489dd47cc9586ecdbca6fcec9456fd64f98d6 Content-length: 594 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN~N5c15j+\versionid $Id: config.but,v 1.60 2003/04/05 11:52:42 Alternatively, select \q{Dynamic} if you want PuTTY to provide a local SOCKS proxy on a local portIf you have selected \q{Local} or \q{Remote} (this step is not needed with \q{Dynamic}), enter a hostname and port number separated by a colon, in the \q{Destination} box. Connections received on the source port will be directed to this destination. For example, to connect to a POP-3 server, you might enter (This also applies to dynamic SOCKS forwarding.) Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c93ecb2c9cac5743b423dbb76ac6fbea Text-delta-base-sha1: f71fc39aebf8110bb96fef8353d2ac9806d67ced Text-content-length: 1049 Text-content-md5: 5f8d03f4f63400be3f1424bf9b0f85ae Text-content-sha1: 7d910f8d23b8be53a6bcd3ccb305626d2184b43d Content-length: 1089 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN>F,_*7,u]x7%fE/+}A\versionid $Id: using.but,v 1.14 2003/04/05 11:52:42 simoAn alternative way to forward local connections to remote hosts is to use dynamic SOCKS proxying. For this, you will need to select the \q{Dynamic} radio button instead of \q{Local}, and then you should not enter anything into the \q{Destination} box (it will be ignored). This will cause PuTTY to listen on the port you have specified, and provide a SOCKS proxy service to any programs which connect to that port. So, in particular, you can forward other PuTTY connections through it by setting up the Proxy control panel (see \k{config-proxy} for details(including dynamic port forwardings) in such a way that machines other than your client PC can connect to the forwarded , \c{-R} and \c{-DTo forward a remote port to a local destination, just use the \c{-R} To set up SOCKS-based dynamic port forwarding on a local port, use the \c{-D} option. For this one you only have to pass the port number: \c putty -D 4096 -load mysession Revision-number: 3057 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2003-04-05T14:32:58.000000Z K 7 svn:log V 58 Add null_get_specials(), for both null and loop backends. K 10 svn:author V 3 ben PROPS-END Node-path: putty/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bada4ab2f2777f5f2bd4ffecb325dbe9 Text-delta-base-sha1: 0e93761c6537647740340e5b7c746332d37a8bcb Text-content-length: 371 Text-content-md5: 2a415c6db24ddedd67b4e07d4be1e595 Text-content-sha1: deb3e03e76a5fd1bdc33515bd251cbfc1843cdc4 Content-length: 410 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN4y GS1zFAEF9Q-/* $Id: testback.c,v 1.8 2003/04/05 14:32:58 beconst struct telnet_special *null_get_specials(void *handleget_specials, null_socket, null_exitcode, null_sendok, null_ldisc,get_specials, null_socket, null_exitcode, null_sendok, null_ldisc,const struct telnet_special *null_get_specials (void *handle) { return NULL; Revision-number: 3058 Prop-content-length: 250 Content-length: 250 K 8 svn:date V 27 2003-04-05T14:34:06.000000Z K 7 svn:log V 151 Implement update_special_menu(), which calls mac_adjustmenus() as appropriate. Eventually, mac_adjustmenus() will handle populating the Specials menu. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 32147af7f6c09689549c3e3bae92d254 Text-delta-base-sha1: 86ea61c68f8abf796d3bb6de87fe9eb1bc53d4a7 Text-content-length: 267 Text-content-md5: dba3e49d24d90749de3e92605a77b26e Text-content-sha1: 21c62f88277e57b380c9e089ada81a83ac180303 Content-length: 307 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN@ o\(G@/* $Id: mac.c,v 1.57 2003/04/05 14:34:06void update_specials_menu(void *frontend) { Session *s = frontend; WindowPtr front; front = mac_frontwindow(); if (front != NULL && mac_windowsession(front) == s) mac_adjustmenus(); Revision-number: 3059 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2003-04-05T15:01:16.000000Z K 7 svn:log V 21 Implement dlg_end(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 702e2cff2d1e97ad8f6f71434105a6ff Text-delta-base-sha1: 952f1da27f5b8966440ab01d037b383b8b45de3d Text-content-length: 49 Text-content-md5: e278e5aab44e4fed1679ad0abe2a480c Text-content-sha1: 862ddd90a0dfbfb414d2ae14d95966ae732c0d28 Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN:\ 0 void (*end)(WindowPtr, int) Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fc06d408d57fd49dd2420f4eb0e1b9a0 Text-delta-base-sha1: 0902e83327430052223c596ae2751ef81bc28535 Text-content-length: 164 Text-content-md5: de3f930efb4f8c073e77ce83e8061d19 Text-content-sha1: adec64a064870760f34d40b758fee41524a8bec0 Content-length: 204 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNZ6L,\bx/* $Id: macctrls.c,v 1.25 2003/04/05 15:01:1 struct macctrls *mcs = dlg; if (mcs->end != NULL) (*mcs->end)(mcs->window, value); Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b481c9bfc8e3ab4e2db4039d31bfe4ec Text-delta-base-sha1: 6c9ed9b7837a9b57a30fb1140a3c2d95e051c97d Text-content-length: 356 Text-content-md5: ed5e1493dbb8a90352154fea6e613678 Text-content-sha1: a7089be264c8e59c784236a56d6dfe1443561812 Content-length: 396 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN? +'20RM/* $Id: macdlg.c,v 1.18 2003/04/05 15:01:16static void mac_enddlg(WindowPtr, ints->settings_ctrls.end = &mac_enddlstatic void mac_enddlg(WindowPtr window, int value) { Session *s = mac_windowsession(window); if (value == 0) mac_closedlg(window); else { mac_startsession(s); mac_closedlg(window); } } Revision-number: 3060 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2003-04-05T15:08:17.000000Z K 7 svn:log V 60 Send EVENT_VALCHANGE when a System 7 editbox gets typed in. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: de3f930efb4f8c073e77ce83e8061d19 Text-delta-base-sha1: adec64a064870760f34d40b758fee41524a8bec0 Text-content-length: 285 Text-content-md5: b90a05f2997ec171318fc217fbc2a9c2 Text-content-sha1: d17e1dc3d301d9c3f466220a52c51a49bf3dbbf0 Content-length: 325 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN6c-SJl/* $Id: macctrls.c,v 1.26 2003/04/05 15:08:17mc = mcs->focus; switch (mc->generic.type) { case MACCTRL_EDITBOX: te = (TEHandle)(*mc->editbox.tbctrl)->contrlData; TEKey(event->message & charCodeMask, te); ctrlevent(mcs, mc, EVENT_VALCHANGE Revision-number: 3061 Prop-content-length: 206 Content-length: 206 K 7 svn:log V 107 Cope with NULL labels in every control where it makes sense, and assert that all other labels are != NULL. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-04-05T15:55:22.000000Z PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b90a05f2997ec171318fc217fbc2a9c2 Text-delta-base-sha1: d17e1dc3d301d9c3f466220a52c51a49bf3dbbf0 Text-content-length: 2137 Text-content-md5: 0a8faf07a69693f3a1fc1996e9686dd5 Text-content-sha1: 747ede7e3b1d7c4555004151d7661c6af609767d Content-length: 2177 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNcFo\c-$042_glZ1jx@;g?"%.2~[Tg:f< \/* $Id: macctrls.c,v 1.27 2003/04/05 15:55:22if (mc->editbox.tblabel != NULL) if (mc->radio.tblabel != NULL) assert(ctrl->text.label != NULL);if (ctrl->editbox.label != NULL) if (ctrl->editbox.label != NULL) { lbounds.right = lbounds.left + curstate->width; lbounds.bottom = lbounds.top + 16; curstate->pos.v += 18; } bounds.left = curstate->pos.h; bounds.right = bounds.left + curstate->widthif (ctrl->editbox.label == NULL) mc->editbox.tblabel = NULL; else { mc->editbox.tblabel = NewControl(window, &lbounds, NULL, TRUE, 0, 0, 0, kControlStaticTextProc, (long)mc); SetControlData(mc->editbox.tblabel, kControlEntireControl, kControlStaticTextTextTag, strlen(ctrl->editbox.label), ctrl->editbox.label); }if (ctrl->editbox.label == NULL) mc->editbox.tblabel = NULL; else { mc->editbox.tblabel = NewControl(window, &lbounds, NULL, TRUE, 0, 0, 0, SYS7_TEXT_PROC, (long)mc); TESetText(ctrl->editbox.label, strlen(ctrl->editbox.label), (TEHandle)(*mc->editbox.tblabel)->contrlData); }if (ctrl->radio.label != NULL) ctrl->radio.label == NULL) mc->radio.tblabel = NULL; else { if (mac_gestalts.apprvers >= 0x100) { mc->radio.tblabel = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, kControlStaticTextProc, (long)mc); SetControlData(mc->radio.tblabel, kControlEntireControl, kControlStaticTextTextTag, strlen(ctrl->radio.label), ctrl->radio.label); } #if !TARGET_API_MAC_CARBON else { mc->radio.tblabel = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, SYS7_TEXT_PROC, (long)mc); TESetText(ctrl->radio.label, strlen(ctrl->radio.label), (TEHandle)(*mc->radio.tblabel)->contrlData); } #endif curstate->pos.v += 18; }assert(ctrl->checkbox.label != NULL);assert(ctrl->button.label != NULL);if (ctrl->listbox.label != NULL) == NULL ? "" :if (mc->editbox.tblabel != NULL) if (mc->radio.tblabel != NULL) Revision-number: 3062 Prop-content-length: 393 Content-length: 393 K 7 svn:log V 292 Ctrl+rightclick now pops up a context menu in Unix PuTTY and pterm. This menu is not yet fully populated, but it has an About box (yet another licence location :-/ ) and supports the new configurable specials menu (thus making Unix PuTTY do one tiny thing which OpenSSH-in-a-pterm can't :-). K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-05T16:05:00.000000Z PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9b0de909aaff2799ae42cf05d3f9fe0e Text-delta-base-sha1: e96e24456b447cb3ab97245186428a15e6114cd5 Text-content-length: 52 Text-content-md5: ec2a05dbc0c3d7e2ec9deb9e4fde4200 Text-content-sha1: bd92bb1730504b2d3851ed37d807c6e4fad6a902 Content-length: 91 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNaction_area), w, FALSE, FALSE, 0); gtk_signal_connect(GTK_OBJECT(w), "clicked", GTK_SIGNAL_FUNC(about_close_clicked), NULL); gtk_widget_show(w); w = gtk_button_new_with_label("View Licence"); GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT); gtk_box_pack_end(GTK_BOX(GTK_DIALOG(aboutbox)->action_area), w, FALSE, FALSE, 0); gtk_signal_connect(GTK_OBJECT(w), "clicked", GTK_SIGNAL_FUNC(licence_clicked), NULL); gtk_widget_show(w); w = gtk_label_new(appname); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(aboutbox)->vbox), w, FALSE, FALSE, 0); gtk_widget_show(w); w = gtk_label_new(ver); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(aboutbox)->vbox), w, FALSE, FALSE, 5); gtk_widget_show(w); w = gtk_label_new("Copyright 1997-2003 Simon Tatham. All rights reserved"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(aboutbox)->vbox), w, FALSE, FALSE, 5); gtk_widget_show(w); gtk_widget_show(aboutbox); } Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4c348f94bc69ae86e25654906eceecb2 Text-delta-base-sha1: 688f332fb8a54885c4b91fdb3d86ee50de16ab0e Text-content-length: 2775 Text-content-md5: 5eda06f1b1ebdb29388c746bf29621ad Text-content-sha1: 472e82014875735f3785aa11e5396c67c013753b Content-length: 2816 K 15 cvs2svn:cvs-rev V 5 1.105 PROPS-END SVN>gOz~w8:FOFqFmp`=M(tkWidget *menu, *specialsmenu, *specialsitem1, *specialsitem2 if (event->button == 3 && ctrl) { gtk_menu_popup(GTK_MENU(inst->menu), NULL, NULL, NULL, NULL, event->button, event->time); return TRUE; } void clear_scrollback_menuitem(GtkMenuItem *item, term_clrsb(inst->term); } void reset_terminal_menuitem(GtkMenuItem *item, term_pwron(inst->term); ldisc_send(inst->ldisc, NULL, 0, 0); } void special_menuitem(GtkMenuItem *item, int code = (int)gtk_object_get_data(GTK_OBJECT(item), "user-data"); inst->back->special(inst->backhandle, code); } void about_menuitem(GtkMenuItem *item, gpointer data) { /* struct gui_data *inst = (struct gui_data *)data; */ about_box(); } void update_specials_menuterm->frontend; const struct telnet_special *specials; specials = inst->back->get_specials(inst->backhandle); gtk_container_foreach(GTK_CONTAINER(inst->specialsmenu), (GtkCallback)gtk_widget_destroy, NULL); if (specials) { int i; GtkWidget *menuitem; for (i = 0; specials[i].name; i++) { if (*specials[i].name) { menuitem = gtk_menu_item_new_with_label(specials[i].name); gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", (gpointer)specials[i].code); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(special_menuitem), inst); } else menuitem = gtk_menu_item_new(); gtk_container_add(GTK_CONTAINER(inst->specialsmenu), menuitem); gtk_widget_show(menuitem); } gtk_widget_show(inst->specialsitem1); gtk_widget_show(inst->specialsitem2); } else { gtk_widget_hide(inst->specialsitem1); gtk_widget_hide(inst->specialsitem2); }/* * Set up the Ctrl+rightclick context menu. */ { GtkWidget *menuitem; char *s; inst->menu = gtk_menu_new(); #define MKMENUITEM(title, func) do { \ menuitem = title ? gtk_menu_item_new_with_label(title) : \ gtk_menu_item_new(); \ gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \ gtk_widget_show(menuitem); \ if (func != NULL) \ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \ GTK_SIGNAL_FUNC(func), inst); \ } while (0) MKMENUITEM("Special Commands", NULL); inst->specialsmenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->specialsmenu); inst->specialsitem1 = menuitem; MKMENUITEM(NULL, NULL); inst->specialsitem2 = menuitem; MKMENUITEM("Clear Scrollback", clear_scrollback_menuitem); MKMENUITEM("Reset Terminal", reset_terminal_menuitem); MKMENUITEM(NULL, NULL); s = dupcat("About ", appname, NULL); MKMENUITEM(s, about_menuitem); sfree(s); #undef MKMENUITEM } update_specials_menu(inst->term Node-path: putty/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 009655826446bf765ebcf8b80b614259 Text-delta-base-sha1: 63d5d48c48e2ce2b43de820ce704991da5f247a5 Text-content-length: 726 Text-content-md5: d2b48a52b8fef789df08000781356f87 Text-content-sha1: 6e63c07472890651e13e69b221c2f8a80d5c747f Content-length: 765 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN+;[;YjAconst char *const appname = "pterm"; /* * Another bunch of temporary stub functions. These ones will want * removing by means of implementing them properly: libcharset * should invent its own sensible format for codepage names and a * means of enumerating them, and printer_enum needs to be dealt * with somehow or other too. */ char *cp_name(int codepage) { return ""; } char *cp_enumerate(int index) { return NULL; } int decode_codepage(char *cp_name) { return -2; } printer_enum *printer_start_enum(int *nprinters_ptr) { *nprinters_ptr = 0; return NULL; } char *printer_get_name(printer_enum *pe, int i) { return NULL; } void printer_finish_enum(printer_enum *pe) { } Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 100d2a5d6d2732bb7bc364e59819769e Text-delta-base-sha1: ae4107b7dff67600e4f873dfc6bb68f613bf0269 Text-content-length: 40 Text-content-md5: 7702b5a612398b02ad23873e054e17ed Text-content-sha1: 40f4ce21311171559d2decff16f86c5af774bc27 Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNn f cvoid about_box(void Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 636d78399efd48ef4b876ec16d4d6ddf Text-delta-base-sha1: 442dcaada7fb4a839ecafbc37d7c37b413c3a923 Text-content-length: 214 Text-content-md5: 361885c90eabc496c45ccd7b6d1d2fec Text-content-sha1: 246a8f14b911ace7929f68354cf36f99cf0f0e41 Content-length: 253 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNKF364AG5static void about_handler(union control *ctrl, void *dlg, void *data, int event) { if (event == EVENT_ACTION) { about_box(); } }NULL)); c->generic.column = 0; } Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7014a44caf673e64621f5fc47a9d5b31 Text-delta-base-sha1: 0dddc2dbb561431140896875bc3633b5733e25c2 Text-content-length: 98 Text-content-md5: f96db741b88e69206a84acb155870589 Text-content-sha1: 00ed237a709540d65c4d16af59685d292e552ddf Content-length: 137 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNrB6z32NNRemainder of the context menu:const char *const appname = "PuTTY"; Revision-number: 3063 Prop-content-length: 272 Content-length: 272 K 7 svn:log V 171 Unix can't sensibly enumerate printers (since they're defined as being lpr commands), so the Unix config box now replaces the printer combo box with an ordinary edit box. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-05T16:12:52.000000Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9448308239fe909a69e63c3748db9a0d Text-delta-base-sha1: 251a5ff95a52b34dbd138ee902ea9100dd70b77b Text-content-length: 426 Text-content-md5: a26fbf02cd40ec1202ca0890a646bb90 Text-content-sha1: 1477b09e1422a0069438ead924510b1c6eee85d2 Content-length: 466 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN1 ,v/* * Some backends may wish to disable the drop-down list on * this edit box. Be prepared for this. */ if (ctrl->editbox.has_list) { dlg_listbox_clear(ctrl, dlg); dlg_listbox_add(ctrl, dlg, PRINTER_DISABLED_STRING); pe = printer_start_enum(&nprinters); for (i = 0; i < nprinters; i++) dlg_listbox_add(ctrl, dlg, printer_get_name(pe, i)); printer_finish_enum(pe); } Node-path: putty/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d2b48a52b8fef789df08000781356f87 Text-delta-base-sha1: 6e63c07472890651e13e69b221c2f8a80d5c747f Text-content-length: 20 Text-content-md5: 242e59c3bae23c511c2fa7996b50d263 Text-content-sha1: 160c5e349e91ec685ab7ace1811c4f51c197e403 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN@ E{ Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 361885c90eabc496c45ccd7b6d1d2fec Text-delta-base-sha1: 246a8f14b911ace7929f68354cf36f99cf0f0e41 Text-content-length: 296 Text-content-md5: 1bc32db78525543f7cfcb03769f0ca14 Text-content-sha1: 0c339aa3750d51c82032d3e4c6ab7e87c5f6fc6b Content-length: 335 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNFf UqOn Unix, we don't have a drop-down list for the printer * control. */ s = ctrl_getset(b, "Terminal", "printing", "Remote-controlled printing"); assert(s->ncontrols == 1 && s->ctrls[0]->generic.type == CTRL_EDITBOX); s->ctrls[0]->editbox.has_list = 0; Node-path: putty/unix/uxprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 79c17fe245668cd044335888e5e7f18e Text-delta-base-sha1: 37b3c577c805ab1ad28695f504b40009ff6d064f Text-content-length: 479 Text-content-md5: f3d513725dd9f416778eadd9eed0d43a Text-content-sha1: a04b6e487b84e63684c7b49c8bf37aa6c91ab03b Content-length: 518 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN6L6L /* * There's no sensible way to enumerate printers under Unix, since * practically any valid Unix command is a valid printer :-) So * these are useless stub functions, and uxcfg.c will disable the * drop-down list in the printer configurer. */ printer_enum *printer_start_enum(int *nprinters_ptr) { *nprinters_ptr = 0; return NULL; } char *printer_get_name(printer_enum *pe, int i) { return NULL; } void printer_finish_enum(printer_enum *pe) { } Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f96db741b88e69206a84acb155870589 Text-delta-base-sha1: 00ed237a709540d65c4d16af59685d292e552ddf Text-content-length: 20 Text-content-md5: fbb6051d7639f52e8ee064d030889b1d Text-content-sha1: 2a94c333c43f341547833b885928668cd3fb9315 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNr -r Revision-number: 3064 Prop-content-length: 362 Content-length: 362 K 8 svn:date V 27 2003-04-05T16:36:11.000000Z K 7 svn:log V 261 Fixed the printing and charset combo boxes in Unix PuTTY. (The former by simply removing it; the latter by adding an enumeration function to libcharset.) This has had slight `const' repercussions on cp_name() and cp_enumerate() which might break the Mac build. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 260a33e318d0d264373fe85851b43e69 Text-delta-base-sha1: aa3984d6dadceef15d056a08db7511282f402912 Text-content-length: 27 Text-content-md5: e3e41e9fbe837a614c38ed3fcce894f1 Text-content-sha1: fab0a0dfca3793fb913a977d26b104a336b006d7 Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN+4 1}. local Node-path: putty/charset/charset.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b58ddbe826b06bb13edc4b81c07ae448 Text-delta-base-sha1: 5a96a6853473126ad5e759af4327405ff7d15b15 Text-content-length: 212 Text-content-md5: 3ba4a86b97197c1621a02d7105398a4f Text-content-sha1: 535b60c780c349c33ca2430b463d93194bef8252 Content-length: 251 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN)w <x<Cfour own encoding names to and from our charset * identifiers. */ const char *charset_to_localenc(int charset); int charset_from_localenc(const char *name); int charset_localenc_nth(int n Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a26fbf02cd40ec1202ca0890a646bb90 Text-delta-base-sha1: 1477b09e1422a0069438ead924510b1c6eee85d2 Text-content-length: 29 Text-content-md5: 38d4961ff2da2ca309327f181870395e Text-content-sha1: 52d2fe5fde75761a2c6c25d59b462c8c64147c9d Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN17 ( 'onst Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 06bc53ab25fff1e3ae7fb71f92d8a04e Text-delta-base-sha1: 67fecbdb95c15cfee46bd858a99561292c392d1c Text-content-length: 68 Text-content-md5: b0f3bf49196230c7b62cc96cbff64193 Text-content-sha1: 8632f6437617310e9a868b3732558bfca84b6198 Content-length: 109 K 15 cvs2svn:cvs-rev V 5 1.212 PROPS-END SVNmy +1defbutton = NULL; mcs->canbuttonif (ctrl->button.isdefault) mcs->defbutton = mc; if (ctrl->button.iscancel) mcs->canbutton = mc unsigned long dummy; switch (event->message & charCodeMask) { case kEnterCharCode: case kReturnCharCode: if (mcs->defbutton != NULL) { assert(mcs->defbutton->generic.type == MACCTRL_BUTTON); HiliteControl(mcs->defbutton->button.tbctrl, kControlButtonPart); /* * I'd like to delay unhilighting the button until after * the event has been processed, but by them the entire * dialgue box might have been destroyed. */ Delay(6, &dummy); HiliteControl(mcs->defbutton->button.tbctrl, kControlNoPart); ctrlevent(mcs, mcs->defbutton, EVENT_ACTION); } return; case kEscapeCharCode: if (mcs->canbutton != NULL) { assert(mcs->canbutton->generic.type == MACCTRL_BUTTON); HiliteControl(mcs->canbutton->button.tbctrl, kControlButtonPart); Delay(6, &dummy); HiliteControl(mcs->defbutton->button.tbctrl, kControlNoPart); ctrlevent(mcs, mcs->canbutton, EVENT_ACTION); } return; } Revision-number: 3066 Prop-content-length: 376 Content-length: 376 K 8 svn:date V 27 2003-04-05T18:00:46.000000Z K 7 svn:log V 277 On System 7, draw the default ring in grey if the window is disabled. This isn't _quite_ right, since it uses a b/w dither everywhere, whereas it should use grey on colour screens. That would involve mucking around with DeviceLoop, though, and I'm not sure I can be bothered. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: de1b3f04a6af3838643b04cd3729504e Text-delta-base-sha1: 449369829b8d04fbcd50ceaaa712dd8a0e484a23 Text-content-length: 556 Text-content-md5: 9ddbe2c57320998cce59295143180140 Text-content-sha1: 5790a2cc7854bebde279fab3e849ab95bbca3246 Content-length: 596 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNMIU-Dz+Nfrc Zsu M$S @/* $Id: macctrls.c,v 1.29 2003/04/05 18:00:46 ControlRef tbring; } buttonmc->button.tbring = NULLmc->button.tbring = NewControl(window, &bounds, title, TRUE, 0, 0, 1, PenState savestateGetPenState(&savestate); PenNormal(); PenSize(3, 3); if ((*control)->contrlHilite == kControlInactivePart) PenPat(&qd.gray SetPenState(&savestate); } return 0popupif (mc->button.tbring != NULL) HiliteControl(mc->button.tbring, state); Revision-number: 3067 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2003-04-05T19:52:12.000000Z K 7 svn:log V 47 Bah. There's always one I forget to `cvs add'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/charset/localenc.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3809 Text-content-md5: e204058323cfe9027f300fc0c4ab8e26 Text-content-sha1: d9b29be8652f71e9d49646d215909e19c4c3ef63 Content-length: 3925 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSSS/* * local.c - translate our internal character set codes to and from * our own set of plausibly legible character-set names. Also * provides a canonical name for each encoding (useful for software * announcing what character set it will be using), and a set of * enumeration functions which return a list of supported * encodings one by one. * * charset_from_localenc will attempt all other text translations * as well as this table, to maximise the number of different ways * you can select a supported charset. */ #include #include "charset.h" #include "internal.h" static const struct { const char *name; int charset; int return_in_enum; /* enumeration misses some charsets */ } localencs[] = { { "", CS_NONE, 0 }, { "ISO-8859-1", CS_ISO8859_1, 1 }, { "ISO-8859-1 with X11 line drawing", CS_ISO8859_1_X11, 0 }, { "ISO-8859-2", CS_ISO8859_2, 1 }, { "ISO-8859-3", CS_ISO8859_3, 1 }, { "ISO-8859-4", CS_ISO8859_4, 1 }, { "ISO-8859-5", CS_ISO8859_5, 1 }, { "ISO-8859-6", CS_ISO8859_6, 1 }, { "ISO-8859-7", CS_ISO8859_7, 1 }, { "ISO-8859-8", CS_ISO8859_8, 1 }, { "ISO-8859-9", CS_ISO8859_9, 1 }, { "ISO-8859-10", CS_ISO8859_10, 1 }, { "ISO-8859-11", CS_ISO8859_11, 1 }, { "ISO-8859-13", CS_ISO8859_13, 1 }, { "ISO-8859-14", CS_ISO8859_14, 1 }, { "ISO-8859-15", CS_ISO8859_15, 1 }, { "ISO-8859-16", CS_ISO8859_16, 1 }, { "CP437", CS_CP437, 1 }, { "CP850", CS_CP850, 1 }, { "CP1250", CS_CP1250, 1 }, { "CP1251", CS_CP1251, 1 }, { "CP1252", CS_CP1252, 1 }, { "CP1253", CS_CP1253, 1 }, { "CP1254", CS_CP1254, 1 }, { "CP1255", CS_CP1255, 1 }, { "CP1256", CS_CP1256, 1 }, { "CP1257", CS_CP1257, 1 }, { "CP1258", CS_CP1258, 1 }, { "KOI8-R", CS_KOI8_R, 1 }, { "KOI8-U", CS_KOI8_U, 1 }, { "Mac Roman", CS_MAC_ROMAN, 1 }, { "Mac Turkish", CS_MAC_TURKISH, 1 }, { "Mac Croatian", CS_MAC_CROATIAN, 1 }, { "Mac Iceland", CS_MAC_ICELAND, 1 }, { "Mac Romanian", CS_MAC_ROMANIAN, 1 }, { "Mac Greek", CS_MAC_GREEK, 1 }, { "Mac Cyrillic", CS_MAC_CYRILLIC, 1 }, { "Mac Thai", CS_MAC_THAI, 1 }, { "Mac Centeuro", CS_MAC_CENTEURO, 1 }, { "Mac Symbol", CS_MAC_SYMBOL, 1 }, { "Mac Dingbats", CS_MAC_DINGBATS, 1 }, { "Mac Roman (old)", CS_MAC_ROMAN_OLD, 0 }, { "Mac Croatian (old)", CS_MAC_CROATIAN_OLD, 0 }, { "Mac Iceland (old)", CS_MAC_ICELAND_OLD, 0 }, { "Mac Romanian (old)", CS_MAC_ROMANIAN_OLD, 0 }, { "Mac Greek (old)", CS_MAC_GREEK_OLD, 0 }, { "Mac Cyrillic (old)", CS_MAC_CYRILLIC_OLD, 0 }, { "Mac Ukraine", CS_MAC_UKRAINE, 1 }, { "Mac VT100", CS_MAC_VT100, 1 }, { "Mac VT100 (old)", CS_MAC_VT100_OLD, 0 }, { "VISCII", CS_VISCII, 1 }, { "HP ROMAN8", CS_HP_ROMAN8, 1 }, { "DEC MCS", CS_DEC_MCS, 1 }, { "UTF-8", CS_UTF8, 1 }, }; const char *charset_to_localenc(int charset) { int i; for (i = 0; i < (int)lenof(localencs); i++) if (charset == localencs[i].charset) return localencs[i].name; return NULL; /* not found */ } int charset_from_localenc(const char *name) { int i; if ( (i = charset_from_mimeenc(name)) != CS_NONE) return i; if ( (i = charset_from_xenc(name)) != CS_NONE) return i; for (i = 0; i < (int)lenof(localencs); i++) { const char *p, *q; p = name; q = localencs[i].name; while (*p || *q) { if (tolower(*p) != tolower(*q)) break; p++; q++; } if (!*p && !*q) return localencs[i].charset; } return CS_NONE; /* not found */ } int charset_localenc_nth(int n) { int i; for (i = 0; i < (int)lenof(localencs); i++) if (localencs[i].return_in_enum && !n--) return localencs[i].charset; return CS_NONE; /* end of list */ } Revision-number: 3068 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2003-04-05T22:00:57.000000Z K 7 svn:log V 82 Add support for list boxes in Mac OS 8. Not entirely solid, but largely working. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9ddbe2c57320998cce59295143180140 Text-delta-base-sha1: 5790a2cc7854bebde279fab3e849ab95bbca3246 Text-content-length: 5935 Text-content-md5: 33a9935135df418db0bb2ba02ea7f6fd Text-content-sha1: d8cfdc8ca59a23d995f61df868cec48592dc5898 Content-length: 5975 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNB1o*-`HH|(=t)1&/PTP6*!\zY[o |'lSRh1zTIr3 VWF5tyGz@5 s@AAA xFq#Dm;Fr3GX3Xv7v,}x [w/* $Id: macctrls.c,v 1.30 2003/04/05 22:00:57LISTBOXunsigned int nids; int *ids; } listlistbox(struct macctrls *, WindowPtr, 9else macctrl_listbox ListHandle list; Size olen; LISTBOX: hideshow(mc->listbox.tbctrl); /* * At least under Mac OS 8.1, hiding a list box * doesn't hide its scroll bars. */ if (mac_gestalts.apprvers >= 0x100) { if (GetControlData(mc->listbox.tbctrl, kControlEntireControl, kControlListBoxListHandleTag, sizeof(list), &list, &olen) == noErr) #if TARGET_API_MAC_CARBON hideshow(GetListVerticalScrollBar(list)); #else hideshow((*list)->vScroll); #endif }lisbounds; ListHandle list; Size olen; if (mac_gestalts.apprvers < 0x100) return;height = %d\n", ctrl->listbox.height); if (ctrl->listbox.draglist) fprintf(stderr, " draglist\n"); if (ctrl->listbox.multisel) fprintf(stderr, " multisel\n"); fprintf(stderr, " ncols = %d\n", ctrl->listbox.ncols); assert(ctrl->listbox.percentwidth == 100); mc->generic.type = MACCTRL_LISTBOX; mc->generic.ctrl = ctrl; mc->generic.privdata = NULL; /* The list starts off empty */ mc->listbox.nids = 0; mc->listbox.ids = NULL; * ctrl->listbox.height; mc->button.tbctrl = NewControl(window, &bounds, NULL, TRUE, ldes_Default, 0, 0, kControlListBoxProc, (long)mc); if (!ctrl->listbox.multisel) { if (GetControlData(mc->listbox.tbctrl, kControlEntireControl, kControlListBoxListHandleTag, sizeof(list), &list, &olen) != noErr) return; #if TARGET_API_MAC_CARBON SetListSelectionFlags(list, lOnlyOne); #else (*list)->selFlags = lOnlyOne; #endif } add234(mcs->byctrl, mc); curstate->pos.v += 6 + 20 * ctrl->listbox.heightLISTBOX: HiliteControl(mc->listbox.tbctrl, state);LISTBOX: /* FIXME spot double-click */ ctrlevent(mcs, mc, EVENT_SELCHANGEif (mc == NULL) returnif (mc == NULL) returnif (mc == NULL) returnif (mc == NULL) return;static void dlg_maclist_clear ListHandle list; Size olen; if (mc == NULL) return; fprintf(stderr, " maclist_clear\n"); if (GetControlData(mc->listbox.tbctrl, kControlEntireControl, kControlListBoxListHandleTag, sizeof(list), &list, &olen) != noErr) return; LDelRow(0, 0, list); mc->listbox.nids = 0; sfree(mc->listbox.ids); mc->listbox.ids = NULL; DrawOneControl(mc->listbox.tbctrl else dlg_maclistif (mc == NULL) return;static void dlg_maclistListHandle list; Size olen; if (mc == NULL) return; fprintf(stderr, " maclist_del %d\n", index); if (GetControlData(mc->listbox.tbctrl, kControlEntireControl, kControlListBoxListHandleTag, sizeof(list), &list, &olen) != noErr) return; LDelRow(1, index, list); if (mc->listbox.ids != NULL) memcpy(mc->listbox.ids + index, mc->listbox.ids + index + 1, (mc->listbox.nids - index - 1) * sizeof(*mc->listbox.ids)); DrawOneControl(mc->listbox.tbctrl else dlg_maclistif (mc == NULL) return; static void dlg_maclistListHandle list; Size olen; ListBounds bounds; Cell cell = { 0, 0 }; if (mc == NULL) return; fprintf(stderr, " maclist_add %s\n", text); if (GetControlData(mc->listbox.tbctrl, kControlEntireControl, kControlListBoxListHandleTag, sizeof(list), &list, &olen) != noErr) return; #if TARGET_API_MAC_CARBON GetListDataBounds(list, &bounds); #else bounds = (*list)->dataBounds; #endif cell.v = bounds.bottom; LAddRow(1, cell.v, list); LSetCell(text, strlen(text), cell, list); DrawOneControl(mc->listbox.tbctrl else dlg_maclistif (mc == NULL) return; fprintf(stderr, " popup_addwthidstatic void dlg_maclist_addwithid(union control *ctrl, void *dlg, ListHandle list; Size olen; ListBounds bounds; int index; if (mc == NULL) return; fprintf(stderr, " maclist_addwithid %s %d\n", text, id); dlg_maclist_add(ctrl, dlg, text); if (GetControlData(mc->listbox.tbctrl, kControlEntireControl, kControlListBoxListHandleTag, sizeof(list), &list, &olen) != noErr) return; #if TARGET_API_MAC_CARBON GetListDataBounds(list, &bounds); #else bounds = (*list)->dataBounds; #endif index = bounds.bottom; if (mc->listbox.nids <= index) { mc->listbox.nids = index + 1; mc->listbox.ids = sresize(mc->listbox.ids, mc->listbox.nids, int); } mc->listbox else dlg_maclistassert(mc != NULL);static int dlg_maclist_index ListHandle list; Size olen; Cell cell = { 0, 0 }; if (GetControlData(mc->listbox.tbctrl, kControlEntireControl, kControlListBoxListHandleTag, sizeof(list), &list, &olen) != noErr) return -1; if (LGetSelect(TRUE, &cell, list)) return cell.v; else return -1; } int dlg_listbox_index; if (ctrl->listbox.height == 0) { mc = findbyctrl(mcs, ctrl); assert(mc != NULL); return GetControlValue(mc->popup.tbctrl) - 1; } else return dlg_maclist_index(ctrl, dlg); } static int dlg_maclist_issListHandle list; Size olen; Cell cell = { 0, 0 }; if (GetControlData(mc->listbox.tbctrl, kControlEntireControl, kControlListBoxListHandleTag, sizeof(list), &list, &olen) != noErr) return FALSE; cell.v = index; return LGetSelect(FALSE, &cell, list); } int dlg_listbox_iss if (ctrl->listbox.height == 0) return GetControlValue(mc->popup.tbctrl) - 1 == index; else return dlg_maclist_issel(ctrl, dlg, index); } void dlg_listbox_select if (mc == NULL) return;if (mc == NULL) return Revision-number: 3069 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2003-04-05T22:03:06.000000Z K 7 svn:log V 117 dd support for list boxes in Mac OS 8. Not entirely solid, but largely working. [ bits missed in the first commit ] K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e278e5aab44e4fed1679ad0abe2a480c Text-delta-base-sha1: 862ddd90a0dfbfb414d2ae14d95966ae732c0d28 Text-content-length: 119 Text-content-md5: d8cc4e94cbbce6830b80b155ffccc9a5 Text-content-sha1: 2650bd84cda663266ffd189961e86d58d60405fd Content-length: 159 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN\A a"a> union macctrl *defbutton; /* Default button */ union macctrl *canbutton; /* Cancel button Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bcab03b288d0dc23a829cf84f37833db Text-delta-base-sha1: 58798177d8e5eb483b190814c4773c68d0ad8869 Text-content-length: 279 Text-content-md5: 5b1eb7708c3a02e30fd1feebc1c7cc65 Text-content-sha1: 070ac712a3afa23bb96e65c99578b5315d440433 Content-length: 319 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNX X,T/* $Id: mac_res.r,v 1.38 2003/04/05 22:03:06 /* List box template */ resource 'ldes' (ldes_Default) { versionZero { 0, /* rows */ 1, /* cols */ 0, 0, /* default cell size */ hasVertScroll, noHorizScroll, 0, /* LDEF number */ noGrowSpace } }; Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c08417066fe9ff5f751a1d4c87cd3937 Text-delta-base-sha1: e1b9d799a865a30ce3933f558d913fa15f69f8dd Text-content-length: 117 Text-content-md5: 3578e83314b9c742f891c81391898f2e Text-content-sha1: 4d40529ba73861e35065a78cd19cdba27ff00f55 Content-length: 157 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN(c _N-6r/* $Id: macresid.h,v 1.15 2003/04/05 22:03:06ldes for list box controls */ #define ldes_Default Revision-number: 3070 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2003-04-05T22:10:13.000000Z K 7 svn:log V 57 Bring list of applications and architectures up to date. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 228 Content-length: 228 K 10 svn:ignore V 195 make.out *.NJ Makefile.mpw PuTTY.68k PuTTY.cfm68k PuTTY.ppc PuTTY.carbon PuTTYtel.68k PuTTYtel.cfm68k PuTTYtel.ppc PuTTYtel.carbon PuTTYgen.68k PuTTYgen.cfm68k PuTTYgen.ppc PuTTYgen.carbon *.rsrc PROPS-END Node-path: putty/mac/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b3fe77f2e551bcff0e1dc483f8d0aa22 Text-delta-base-sha1: 706417c8ef6a06afa59e99096f1ce30a74655419 Text-content-length: 210 Text-content-md5: cd48631b3ac1bbd3b140685c151772c0 Text-content-sha1: ed24a96ffd8c65ae14cfb8c074795be7d50ef935 Content-length: 249 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNmDDDmake.out *.NJ Makefile.mpw PuTTY.68k PuTTY.cfm68k PuTTY.ppc PuTTY.carbon PuTTYtel.68k PuTTYtel.cfm68k PuTTYtel.ppc PuTTYtel.carbon PuTTYgen.68k PuTTYgen.cfm68k PuTTYgen.ppc PuTTYgen.carbon *.rsrc Revision-number: 3071 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2003-04-05T22:12:44.000000Z K 7 svn:log V 29 Const fallout, as predicted. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a8974d4b72a2e79e4b0a2a5511d29dd2 Text-delta-base-sha1: 421e8888f26c35938f618f0301cea43e89549775 Text-content-length: 174 Text-content-md5: e42b54237197f6ef969639c7d9a4bfc7 Text-content-sha1: 6acb7e0f81fade6b1766979d6820b6b2ee79de27 Content-length: 213 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN!- [*n:g/* $Id: macucs.c,v 1.7 2003/04/05 22:12:44const *cp_enumerate (int index) { if (index == 0) return "ISO/IEC 8859-1"; return NULL; } char const Revision-number: 3072 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:14.110825Z PROPS-END Revision-number: 3073 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2003-04-06T13:27:40.000000Z K 7 svn:log V 126 To avoid gratuitous flicker, if a control already has the focus when it's clicked in, don't attempt to move the focus at all. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 33a9935135df418db0bb2ba02ea7f6fd Text-delta-base-sha1: d8cfdc8ca59a23d995f61df868cec48592dc5898 Text-content-length: 187 Text-content-md5: 184d52a4f78721ea01d7ae1b565aef0d Text-content-sha1: 191d87ef27f8c41d17b563352ae8576f35df2767 Content-length: 227 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNB:a-SzIMK,/* $Id: macctrls.c,v 1.31 2003/04/06 13:27:40== mc) return;, oldfocus && GetKeyboardFocus(window, &oldfocus) == noErr && control != oldfocus Revision-number: 3074 Prop-content-length: 467 Content-length: 467 K 8 svn:date V 27 2003-04-06T14:11:33.000000Z K 7 svn:log V 366 Now that we have `appname', make much wider use of it. In particular, the config box uses it in place of the word `PuTTY', which means mid-session reconfig in pterm will look less strange once I implement it. Also, while I'm at it, I've personalised all the dialog boxes and menu items and suchlike so that PuTTYtel actually claims to be PuTTYtel rather than PuTTY. K 10 svn:author V 5 simon PROPS-END Node-path: putty/be_all.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8abaa27ccf99cf4256de2a7f9118e761 Text-delta-base-sha1: 813afb6a6cb157134990a3f21a49efa7003b941e Text-content-length: 437 Text-content-md5: 57be9b687d6b3139088610c1cedbd147 Text-content-sha1: 9a07830b2ef5da4fa8d222a31cfbdab960543d35 Content-length: 476 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNVv W/* * This appname is not strictly in the right place, since Plink * also uses this module. However, Plink doesn't currently use any * of the dialog-box sorts of things that make use of appname, so * it shouldn't do any harm here. I'm trying to avoid having to * have tiny little source modules containing nothing but * declarations of appname, for as long as I can... */ const char *const appname = "PuTTY"; Node-path: putty/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a671e8d58c70914915d66065fe87dabb Text-delta-base-sha1: dc3cf9c2060101eb12629e4b068cd0975bd1f388 Text-content-length: 59 Text-content-md5: f9959f93b530b5a6a1980df2b5557d0d Text-content-sha1: ec68b005998c34fcecdbd2494b88ff93483d95f7 Content-length: 98 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNMv &D Aconst char *const appname = "PuTTYtel" Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 38d4961ff2da2ca309327f181870395e Text-delta-base-sha1: 52d2fe5fde75761a2c6c25d59b462c8c64147c9d Text-content-length: 862 Text-content-md5: f8df43a6677183f5c02d55c8b473f129 Text-content-sha1: dc94595f55ba79397715f68b744cf4180946847a Content-length: 902 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN7R@ZiXropT0N9Y Fq char *strstr = dupprintf("Basic options for your %s session", appname); ctrl_settitle(b, "Session", str); sfree(strstr = dupprintf("Options controlling %s's window", appname); ctrl_settitle(b, "Window", str); sfree(strstr = dupprintf("Configure the appearance of %s's window", appname); ctrl_settitle(b, "Window/Appearance", str); sfree(strstr = dupprintf("Configure the behaviour of %s's window", appname); ctrl_settitle(b, "Window/Behaviour", str); sfree(strtr = dupprintf("Adjust how %s displays line drawing characters", appname); s = ctrl_getset(b, "Window/Translation", "linedraw", str); sfree(strtr = dupprintf("Adjust the precise colours %s displays", appname); s = ctrl_getset(b, "Window/Colours", "adjust", str); sfree(str Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3edd8d169cec0c0921bec6a7052e8063 Text-delta-base-sha1: b027347a6251add977ca3e08c1ca7f024cf18ec5 Text-content-length: 20 Text-content-md5: 3b01b786db95f9800633af63ec10d06d Text-content-sha1: 55fc3573e54bb73cea88f2104f152c103e8ecc0f Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNkE yL Node-path: putty/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5fa4a0dcea2a7995badd080f120cdf66 Text-delta-base-sha1: d7b3f71c6d3ca139da63531c8c28c589796fec77 Text-content-length: 199 Text-content-md5: ce115ec7eeb416dd66fe3b122f69d333 Text-content-sha1: 732fd1ec0f2b09a8585a4f39b0a53f71fe6f82d4 Content-length: 238 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNr+$zAx"|*H char *strtr = dupprintf("Adjust how %s displays line drawing characters", appname); s = ctrl_getset(b, "Window/Translation", "linedraw", str); sfree(str Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5e808191c38d450ac2c1a4d1a7f42a0b Text-delta-base-sha1: 8c08ebf338d51b620cd35d4712998f66b85d7cea Text-content-length: 123 Text-content-md5: 1ccc94ec235f67b1f8d2a30343f20a52 Text-content-sha1: 1467c13d020b781a0da4ae38b83076ad746a89f8 Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNv7U>9K`,Jwintitle = sfree(dp->wintitle); sfree(dp->errtitle); } void *dlg_get_privdata Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: af7a6a0d63440c9b2eec868ddcfe4a32 Text-delta-base-sha1: fbcb6b0cd000f0443e80750eb889a3be98c9281b Text-content-length: 2101 Text-content-md5: fe7939cd4eb63ac2e76ecf19d6dab2a1 Text-content-sha1: 273e57e6b6712a4814d38052d9542a801315f37a Content-length: 2142 K 15 cvs2svn:cvs-rev V 5 1.211 PROPS-END SVNVk!tbkg.j2[@Qc;ye`yU|w`]Ib0zskputty.datagrupo.com.br in Brazil Revision-number: 3076 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2003-04-07T17:03:13.000000Z K 7 svn:log V 41 Back out previous -- host doesn't exist. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 74d3e615ad61b2a5eb353d28641c7021 Text-delta-base-sha1: f380d4c4a4532a24c55f08134b5ec2dee5d1bb81 Text-content-length: 65 Text-content-md5: 15f19cf0146dd12cde14252df9b93d11 Text-content-sha1: c501faea3140f8908a89dc610ea6aef4a16fb4f8 Content-length: 105 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNBK(TB 5unacs.bg/">putty.unacs.bg in Bulgari Revision-number: 3077 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:14.547322Z PROPS-END Revision-number: 3078 Prop-content-length: 568 Content-length: 568 K 8 svn:date V 27 2003-04-08T13:49:12.000000Z K 7 svn:log V 467 While writing gtkdlg.c I learned how to specify a window's initial position in GTK, so I can now implement the other half of -geometry which I'd previously believed to be impossible in GTK. It's still not perfect, because GTK apparently provides no way for us to get hold of the X reparent event in order to support negative geometries in a manner which takes account of the WM borders; but for positive position it's at least an improvement on the previous version! K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5eda06f1b1ebdb29388c746bf29621ad Text-delta-base-sha1: 472e82014875735f3785aa11e5396c67c013753b Text-content-length: 941 Text-content-md5: a567cc54fc668bcec4071b63856e33e6 Text-content-sha1: eb84fd721aec41015c8472494f29b889c20e5a5f Content-length: 982 K 15 cvs2svn:cvs-rev V 5 1.106 PROPS-END SVNgNLS^eX@kKMBj *4*q#Jint xpos, ypos, gotpos, gravityGEOMETRY Position and size of window (size in characters) struct gui_data *inst if (flags & (XValue | YValue)) { inst->xpos = x; inst->ypos = y; inst->gotpos = TRUE; inst->gravity = ((flags & XNegative ? 1 : 0) | (flags & YNegative ? 2 : 0)); }instinst if (inst->gotpos) { int x = inst->xpos, y = inst->ypos; GtkRequisition req; gtk_widget_size_request(GTK_WIDGET(inst->window), &req); if (inst->gravity & 1) x += gdk_screen_width() - req.width; if (inst->gravity & 2) y += gdk_screen_height() - req.height; gtk_window_set_position(GTK_WINDOW(inst->window), GTK_WIN_POS_NONE); gtk_widget_set_uposition(GTK_WIDGET(inst->window), x, y Revision-number: 3079 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2003-04-08T14:02:34.000000Z K 7 svn:log V 101 Rename pterm's -T option to -title, to avoid clashing with PuTTY's -T (don't allocate a pty) option. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a567cc54fc668bcec4071b63856e33e6 Text-delta-base-sha1: eb84fd721aec41015c8472494f29b889c20e5a5f Text-content-length: 30 Text-content-md5: e681364e89c8fd8a4298d78b6bb928c1 Text-content-sha1: 5899897feddf88be47960c96f36ac6d6591e553b Content-length: 71 K 15 cvs2svn:cvs-rev V 5 1.107 PROPS-END SVNNR Ititle Revision-number: 3080 Prop-content-length: 258 Content-length: 258 K 8 svn:date V 27 2003-04-09T09:09:57.000000Z K 7 svn:log V 157 Chas Honton's patch to dynamic port forwarding: should allow longer host names in SOCKS 4A, up to 255 characters (which is apparently the DNS limit anyway). K 10 svn:author V 5 simon PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b5ab408c7646bf639ae16ad85a7f2734 Text-delta-base-sha1: 51f84fc6485ee182d2f805076960b9e115f4f32b Text-content-length: 210 Text-content-md5: 5d41cd6222fbc5db1e8c64ec4ae631f2 Text-content-sha1: b63ff59cf21a8eeb43f7b48a318c7f826a9dd5b5 Content-length: 250 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNqn/-N-.wv[+8pr->port = 8; /* reset buffer to overwrite name */len= pr->port; pr->port = GET_16BIT_MSB_FIRST(pr->hostname+2); memmove(pr->hostname, pr->hostname + 8, len Revision-number: 3081 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:14.705172Z PROPS-END Revision-number: 3082 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2003-04-09T11:18:41.000000Z K 7 svn:log V 69 `dynamic' was uninitialised in other types of port forwarding. Oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5d41cd6222fbc5db1e8c64ec4ae631f2 Text-delta-base-sha1: b63ff59cf21a8eeb43f7b48a318c7f826a9dd5b5 Text-content-length: 63 Text-content-md5: bd6373cfdf068dd755327e2f2bc15e48 Text-content-sha1: ca6bd1d99ab3e066f4b332d831bbab0f0db2cde0 Content-length: 103 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNn$Y^ pr->dynamic = 0;pr->dynamic = 0; Revision-number: 3083 Prop-content-length: 336 Content-length: 336 K 8 svn:date V 27 2003-04-09T11:19:39.000000Z K 7 svn:log V 235 Remote-to-local port forwarding in SSH2 was apparently completely broken! We were expecting the peer address/port in the incoming packet _before_ the connected address/port, which is just wrong. I wonder how I managed to mess that up. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d40648244f949b55568f39ce09b97780 Text-delta-base-sha1: d812fdb51b4b8a3e192d33759f766ba808b42d23 Text-content-length: 295 Text-content-md5: e313c9b43a419eeb363955059e3575d5 Text-content-sha1: e656b52f13041a44e5d459b047de3180b0d1ae6f Content-length: 336 K 15 cvs2svn:cvs-rev V 5 1.285 PROPS-END SVNf)`#6y|0-"\^^eer ssh2_pkt_getstring(ssh, &peeraddr, &peeraddrlen); peerport = ssh2_pkt_getuint32(ssh)eer ssh2_pkt_getstring(ssh, &peeraddr, &peeraddrlen); peer Revision-number: 3084 Prop-content-length: 125 Content-length: 125 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-04-09T11:40:07.000000Z K 7 svn:log V 25 This is now implemented. PROPS-END Node-path: putty-wishlist/data/portfwd-dynamic Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 167a5a40fd038af2f2af1313cc3fc127 Text-delta-base-sha1: e5a29063defa1287d943d0e2eba5cbe34c80ecab Text-content-length: 156 Text-content-md5: a3772db90b2aa2b3295313687847f1d7 Text-content-sha1: 50fe8b7266dc9236e2469dad08eddfe9bb7caa20 Content-length: 195 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN&- \K[rFixed-in: 2003-04-06

    Update, 2003 Apr 6: PuTTY now supports dynamic port forwarding, exporting a SOCKS 4/4A/5 interface. Revision-number: 3085 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2003-04-09T11:50:31.000000Z K 7 svn:log V 22 kos.li in Switzerland K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 15f19cf0146dd12cde14252df9b93d11 Text-delta-base-sha1: c501faea3140f8908a89dc610ea6aef4a16fb4f8 Text-content-length: 61 Text-content-md5: ca967af39c232023fcce7056baf08bb2 Text-content-sha1: 4be2a66d1083c81284b601c3c3e50a2a494b4cd8 Content-length: 101 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNK. (K;kos.li/putty/">kos.li in Switzerland Revision-number: 3086 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:15.097054Z PROPS-END Revision-number: 3087 Prop-content-length: 308 Content-length: 308 K 8 svn:date V 27 2003-04-09T18:46:45.000000Z K 7 svn:log V 207 Event Log for Unix PuTTY. Doesn't yet allow X selection of its contents, and doesn't automatically maintain scroll position at the bottom when new entries are added while the list is open, but it's a start. K 10 svn:author V 5 simon PROPS-END Node-path: putty/dialog.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aaff503efc040f6a927857f7610d46bd Text-delta-base-sha1: 980867aeef86848343d530f13c37682ab7513bdf Text-content-length: 521 Text-content-md5: 6031a216436653a1c8e5290f66bf72a1 Text-content-sha1: 2ebd62c82bf9fbb78f9a7a5804b3923e452b83ee Content-length: 560 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNL. ogoXtnon-zero, the list can have more than one * element selected at a time. This is not guaranteed to * work on a drop-down list, so don't try it! * * Different non-zero values request slightly different * types of multi-selection (this may well be meaningful * only in GTK, so everyone else can ignore it if they * want). 1 means the list box expects to have individual * items selected, whereas 2 means it expects the user to * want to select a large contiguous range at a time. Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4215e907b1cb0da4b655b61533ab82b6 Text-delta-base-sha1: 90b4c97b3ae19bd0494b1a477f1ca8956fa72135 Text-content-length: 4484 Text-content-md5: 7d173810ce80707d5d324dce2916b12b Text-content-sha1: 45252624bfda78788e28f220c26e063557f44cb7 Content-length: 4524 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNs/|zsVvtF/5sYsBsRUa`B6=vF5timdp->byctrl = NULL;dp->bywidget = NULLif (!dp->byctrl) return NULL;if (!dp->bywidget) return == 2)EXTENDED); } else if (ctrl->listbox.multisel == 1)get_listitemheight(void) { GtkWidget *listitem = gtk_list_item_new_with_label("foo"); GtkRequisition req; gtk_widget_size_request(listitem, &req); gtk_widget_unref(listitem); return req.height;get_sesslist(&sl, TRUE); listitemheight = get_listitemheight( struct eventlog_stuff { GtkWidget *parentwin, *window; struct controlbox *eventbox; struct Shortcuts scs; struct dlgparam dp; union control *listctrl; char **events; int nevents, negsize; }; static void eventlog_destroy(GtkWidget *widget, gpointer data) { struct eventlog_stuff *es = (struct eventlog_stuff *)data; es->window = NULL; dlg_cleanup(&es->dp); ctrl_free_box(es->eventbox); } static void eventlog_ok_handler(union control *ctrl, void *dlg, 0); } static void eventlog_list_handler(union control *ctrl, void *dlg, void *data, int event) { struct eventlog_stuff *es = (struct eventlog_stuff *)data; if (event == EVENT_REFRESH) { int i; dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < es->nevents; i++) { dlg_listbox_add(ctrl, dlg, es->events[i]); } dlg_update_done(ctrl, dlg); } } void showeventlog(void *estuff, void *parentwin) { struct eventlog_stuff *es = (struct eventlog_stuff *)estuff; GtkWidget *window, *w0, *w1; GtkWidget *parent = GTK_WIDGET(parentwin); struct controlset *s0, *s1; union control *c; int listitemheight, index; char *title; if (es->window) { gtk_widget_grab_focus(es->window); return; } dlg_init(&es->dp); for (index = 0; index < lenof(es->scs.sc); index++) { es->scs.sc[index].action = SHORTCUT_EMPTY; } es->eventbox = ctrl_new_box(); s0 = ctrl_getset(es->eventbox, "", "", ""); ctrl_columns(s0, 3, 33, 34, 33); c = ctrl_pushbutton(s0, "Close", 'c', HELPCTX(no_help), eventlog_ok_handler, P(NULL)); c->button.column = 1; c->button.isdefault = TRUE; s1 = ctrl_getset(es->eventbox, "x", "", ""); es->listctrl = c = ctrl_listbox(s1, NULL, NO_SHORTCUT, HELPCTX(no_help), eventlog_list_handler, P(es)); c->listbox.height = 10; c->listbox.multisel = 2; c->listbox.ncols = 3; c->listbox.percentages = snewn(3, int); c->listbox.percentages[0] = 25; c->listbox.percentages[1] = 10; c->listbox.percentages[2] = 65; listitemheight = get_listitemheight(); es->window = window = gtk_dialog_new(); title = dupcat(appname, " Event Log", NULL); gtk_window_set_title(GTK_WINDOW(window), title); sfree(title); w0 = layout_ctrls(&es->dp, &es->scs, s0, listitemheightes->dp, &es->scs, s1, listitemheight, GTK_WINDOW(window)); gtk_container_set_border_width(GTK_CONTAINER(w1), 10); gtk_widget_set_usize(w1, 20 + string_width("LINE OF TEXT GIVING WIDTH OF EVENT LOG" " IS QUITE LONG 'COS SSH LOG ENTRIES" " ARE WIDE")es->dp.data = es; es->dp.shortcuts = &es->scs; es->dp.lastfocus = NULL; es->dp.retval = 0; es->dp.window = window; dlg_refresh(NULL, &es->dp); if (parent->window, &x, &y); gdk_window_get_size(parent gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(parenteventlog_destroy), es); gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(win_key_press), &es->dp); } void *eventlogstuff_new(void) { struct eventlog_stuff *es; es = snew(struct eventlog_stuff); memset(es, 0, sizeof(*es)); return es; } void logevent_dlg(void *estuff, char *string) { struct eventlog_stuff *es = (struct eventlog_stuff *)estuff; char timebuf[40]; time_t t; if (es->nevents >= es->negsize) { es->negsize += 64; es->events = sresize(es->events, es->negsize, char *); } time(&t); strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t", localtime(&t)); es->events[es->nevents] = snewn(strlen(timebuf) + strlen(string) + 1, char); strcpy(es->events[es->nevents], timebuf); strcat(es->events[es->nevents], string); if (es->window) { dlg_listbox_add(es->listctrl, &es->dp, es->events[es->nevents]); } es->nevents++; } Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e681364e89c8fd8a4298d78b6bb928c1 Text-delta-base-sha1: 5899897feddf88be47960c96f36ac6d6591e553b Text-content-length: 365 Text-content-md5: d308978b473531c3d8c9d6c1f242902d Text-content-sha1: 383901712a1cc0ac895a17d9ae16277d44e2736d Content-length: 406 K 15 cvs2svn:cvs-rev V 5 1.108 PROPS-END SVNR+9&uk7S,Lg@,m D%- void *eventlogstufflog_eventlog(inst->logctx, string); logevent_dlg(inst->eventlogstuff, string);event_logshoweventlog(inst->eventlogstuff, inst->window extern const int use_event_logif (use_event_log) MKMENUITEM("Event Log", event_log_menuitem);eventlogstuff = eventlogstuff_new( Node-path: putty/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 326cdebf7f2340290c5c45615654928b Text-delta-base-sha1: f140e9c7dbd53b606a2719d08007f591235356a6 Text-content-length: 83 Text-content-md5: d187567e0e29b2ffa12d9b9189f9593d Text-content-sha1: b01df3bdadc67bd28fea8b4dd238c29a8570b0b4 Content-length: 122 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN|< ?}const int use_event_log = 0; /* pterm doesn't need it */ Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7702b5a612398b02ad23873e054e17ed Text-delta-base-sha1: 40f4ce21311171559d2decff16f86c5af774bc27 Text-content-length: 147 Text-content-md5: e1a83ab8679ba9e63503f9ad9f5fce23 Text-content-sha1: 27c05a2bd49efd2fbfc31ca0cbffab0f53efe16e Content-length: 187 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN }|} yvoid *eventlogstuff_new(void); void showeventlog(void *estuff, void *parentwin); void logevent_dlg(void *estuff, char *string Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b01b786db95f9800633af63ec10d06d Text-delta-base-sha1: 55fc3573e54bb73cea88f2104f152c103e8ecc0f Text-content-length: 1264 Text-content-md5: 5ef19c71b7aec72629b54f1c01febb6a Text-content-sha1: 44d8e2adcfa8c619c821464513db95e418a022b4 Content-length: 1304 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNE*KFKp?e+Copy-and-paste from the Event Log. * * - Remainder of the context menu: + This will require some work. We have to throw the new * config at the log module, the ldisc, the terminal, and * the backend; that's the easy bit. But within pterm.c * itself we must also: * - redo the colour palette if necessary * * might be nice to move this over into terminal.c. * That way we could check which palette entries in * cfg have actually been _changed_ during * reconfiguration, and only update those ones in * the currently visible palette. Also it'd save * some of this hassle in the next port. * - enable/disable/move the scroll bar if necessary * - change the window title if necessary * - reinitialise the fonts * - resize the window if necessary (may be required * either by terminal size change or font size change * or both) * - redraw everything, just to be safe. * + In particular, among the above chaos, we must look into * how the choice of font affects the choice of codepage * since the Unix default is to derive the latter from the * formerconst int use_event_log = 1 Revision-number: 3088 Prop-content-length: 240 Content-length: 240 K 7 svn:log V 139 Minor improvements to subsidiary window placement; with any luck the Event Log should go off the side of the screen rather less often now. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-10T08:53:43.000000Z PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7d173810ce80707d5d324dce2916b12b Text-delta-base-sha1: 45252624bfda78788e28f220c26e063557f44cb7 Text-content-length: 1487 Text-content-md5: b10874f308649b56d4c18c8ac9bf6d3f Text-content-sha1: c3447d8567bf42511b2416fa817150bbcd381c20 Content-length: 1527 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN/R?3t-NUvb5K']rJBmstatic void set_transient_window_pos(GtkWidget *parent, GtkWidget *child) { gint x, y, w, h, dx, dy; GtkRequisition req; gtk_window_set_position(GTK_WINDOW(child), GTK_WIN_POS_NONE); gtk_widget_size_request(GTK_WIDGET(child), &req); gdk_window_get_origin(GTK_WIDGET(parent)->window, &x, &y); gdk_window_get_size(GTK_WIDGET(parent)->window, &w, &h); /* * One corner of the transient will be offset inwards, by 1/4 * of the parent window's size, from the corresponding corner * of the parent window. The corner will be chosen so as to * place the transient closer to the centre of the screen; this * should avoid transients going off the edge of the screen on * a regular basis. */ if (x + w/2 < gdk_screen_width() / 2) dx = x + w/4; /* work from left edges */ else dx = x + 3*w/4 - req.width; /* work from right edges */ if (y + h/2 < gdk_screen_height() / 2) dy = y + h/4; /* work from top edges */ else dy = y + 3*h/4 - req.height; /* work from bottom edges */ gtk_widget_set_uposition(GTK_WIDGET(child), dx, dyset_transient_window_pos(dp->window, window);window = gtk_dialog_new();, window); set_transient_window_pos(parentwin, window *windowset_transient_window_pos(GTK_WIDGET(window), aboutbox); set_transient_window_pos(parent, window Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d308978b473531c3d8c9d6c1f242902d Text-delta-base-sha1: 383901712a1cc0ac895a17d9ae16277d44e2736d Text-content-length: 126 Text-content-md5: b7653afb420e3b1fef370423271c42b5 Text-content-sha1: 47264a11b88234756e7ba5e8529997c369848fe4 Content-length: 167 K 15 cvs2svn:cvs-rev V 5 1.109 PROPS-END SVN+1_A_gn*struct gui_data *inst = (struct gui_data *)data; about_box(inst->window); } void event_log Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e1a83ab8679ba9e63503f9ad9f5fce23 Text-delta-base-sha1: 27c05a2bd49efd2fbfc31ca0cbffab0f53efe16e Text-content-length: 49 Text-content-md5: 61b409093eef84ebdd551844d6d4fe9a Text-content-sha1: 8cc900c36303eaf7a4becf7297fdb0ee02a9ccc4 Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNyxyq *window, void *window Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1bc32db78525543f7cfcb03769f0ca14 Text-delta-base-sha1: 0c339aa3750d51c82032d3e4c6ab7e87c5f6fc6b Text-content-length: 68 Text-content-md5: fbbe7bfed01e9a49a7f221a8ab9445a7 Text-content-sha1: 49ee459445bef79481ee7ea3cb6d9f0671a58b26 Content-length: 107 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNf$:K:Wctrl->generic.context.p, void *wiwin Node-path: putty/unix/uxsel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 04ff309aba5f148a8c26d92a95fdec7d Text-delta-base-sha1: 02633605bd695349987a841437d2d6b73169cc6c Text-content-length: 307 Text-content-md5: e7ad0fd9ca120d3edfa932546eb11fb2 Text-content-sha1: 5e06b16873d11b69003a5a1a0e03deb30e49ec3e Content-length: 346 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNN(  /* * Apparently this can sometimes be NULL. Can't see how, but I * assume it means I need to ignore the event since it's on an * fd I've stopped being interested in. Sigh. */ if (fdstruct) return fdstruct->callback(fd, event); else return 1; } Revision-number: 3089 Prop-content-length: 183 Content-length: 183 K 8 svn:date V 27 2003-04-10T11:57:11.000000Z K 7 svn:log V 83 All the stderr messages in this file now use appname rather than guessing wrongly. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b7653afb420e3b1fef370423271c42b5 Text-delta-base-sha1: 47264a11b88234756e7ba5e8529997c369848fe4 Text-content-length: 735 Text-content-md5: c6809db921dd8999d9e2d04329369292 Text-content-sha1: 9059e683c116566cdecb48c90a207bcb07345060 Content-length: 776 K 15 cvs2svn:cvs-rev V 5 1.110 PROPS-END SVN1\]tD[ys,nipCEZG;'c}8I?r%s: couldn't allocate colour %d (#%02x%02x%02x)\n", appname%s: couldn't allocate colour %d (#%02x%02x%02x)\n", appname, i, inst->cfg.colours[i][0], %s: ", appname%s: %s expects an argument\n", appname%s: unable to parse colour \"%s\"\n", appname%s: -e expects an argument\n", appname%s: unrecognized option '%s'\n", appname%s: unable to load font \"%s\"\n", appname%s: unable to load bold font \"%s\"\n", appname%s: unable to load wide font \"%s\"\n", appname%s: unable to load wide/bold font \"%s\"\n", appname, Revision-number: 3090 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2003-04-10T15:35:08.000000Z K 7 svn:log V 104 Add SGT's silly idea of Mar 28 to connect to one host but cache the host key under the name of another. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/hostkey-policy Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1b896be58b4c6a2cdb77ec98e2852e54 Text-delta-base-sha1: b7191d3b7e69ef705910f224d03751078026b196 Text-content-length: 347 Text-content-md5: 49b87683d10a96837f25dac9b2967b21 Text-content-sha1: bac70ad14a2e00a36fdd86af42596cdffe7879a8 Content-length: 386 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN7} CKCoHul>

  • Silly idea: if you select Telnet proxying and a completely empty command string, the effect is that PuTTY will connect to the address specified in the Proxy panel, but will believe itself to be connecting to the address specified in the Session panel. Result: it will cache the host key under the latter name. Revision-number: 3091 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:15.587557Z PROPS-END Revision-number: 3092 Prop-content-length: 172 Content-length: 172 K 7 svn:log V 72 Implemented Change Settings under Unix. We are gradually getting there. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-10T18:00:50.000000Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f8df43a6677183f5c02d55c8b473f129 Text-delta-base-sha1: dc94595f55ba79397715f68b744cf4180946847a Text-content-length: 367 Text-content-md5: aae75549d6000ba991d713028f994f9b Text-content-sha1: 3d2ca87efdb842b207f0d9843499714968cb2b94 Content-length: 407 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNREHOM%,? * Of course, this doesn't need to be done mid-session. */ if (!ssd->editbox) { savedsession = NULL; } else if (!savedsession) { /* In a mid-session Change Settings, Apply is always OK. */ dlg_end(dlg, 1); return; }memset(ssd, 0, sizeof(*ssd Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b10874f308649b56d4c18c8ac9bf6d3f Text-delta-base-sha1: c3447d8567bf42511b2416fa817150bbcd381c20 Text-content-length: 110 Text-content-md5: 9317d46b25bf4d179fc4ee584fd868ed Text-content-sha1: 365aebb78cb1c02a3941259dd16c1c8ec23b66fd Content-length: 150 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNRlMV9VB, int midsessionmidsession, 0); unix_setup_config_box(ctrlbox, midsession Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c6809db921dd8999d9e2d04329369292 Text-delta-base-sha1: 9059e683c116566cdecb48c90a207bcb07345060 Text-content-length: 6057 Text-content-md5: 3ee3972bbdc19ba524a170fb6658c5a3 Text-content-sha1: 4898fad1b065a253415c032271adfcf5d5a64911 Content-length: 6098 K 15 cvs2svn:cvs-rev V 5 1.111 PROPS-END SVN\&}Na>t;==V D?Z(Als{Jl!lD:w~vD%Y*2width, width || h != inst->inst->width = w; inst->cfg.height = inst-> gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area), area_x, area_y); #endif gtk_container_dequeue_resize_handler(GTK_CONTAINER(inst->window));free_colors(inst->colmap, inst->cols + n, 1);setup_fonts_ucs(struct gui_data *inst) { int font_charset; if (inst->fonts[0]) gdk_font_unref(inst->fonts[0]); if (inst->fonts[1]) gdk_font_unref(inst->fonts[1]); if (inst->fonts[2]) gdk_font_unref(inst->fonts[2]); if (inst->fonts[3]) gdk_font_unref(inst->fonts[3]);} void set_geom_hints(struct gui_data *inst) { GdkGeometry geom; geom.min_width = inst->font_width + 2*inst->cfg.window_border; geom.min_height = inst->font_height + 2*inst->cfg.window_border; geom.max_width = geom.max_height = -1; geom.base_width = 2*inst->cfg.window_border; geom.base_height = 2*inst->cfg.window_border; geom.width_inc = inst->font_width; geom.height_inc = inst->font_height; geom.min_aspect = geom.max_aspect = 0; gtk_window_set_geometry_hints(GTK_WINDOW(inst->window), inst->area, &geom, GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE | GDK_HINT_RESIZE_INC); } void clear_scrollbackchange_settings_menuitem(GtkMenuItem *item, gpointer data) { 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, 1, 2, 3, 4, 5 }; struct gui_data *inst = (struct gui_data *)data; char *title = dupcat(appname, " Reconfiguration", NULL); Config cfg2, oldcfg; int i, need_size; cfg2 = inst->cfg; /* structure copy */ if (do_config_box(title, &cfg2, 1)) { oldcfg = inst->cfg; /* structure copy */ inst->cfg = cfg2; /* structure copy */ /* Pass new config data to the logging module */ log_reconfig(inst->logctx, &cfg2); /* * Flush the line discipline's edit buffer in the case * where local editing has just been disabled. */ ldisc_send(inst->ldisc, NULL, 0, 0); /* Pass new config data to the terminal */ term_reconfig(inst->term, &cfg2); /* Pass new config data to the back end */ inst->back->reconfig(inst->backhandle, &cfg2); /* * Just setting inst->cfg is sufficient to cause colour * setting changes to appear on the next ESC]R palette * reset. But we should also check whether any colour * settings have been changed, and revert the ones that * have to the new default, on the assumption that the user * is most likely to want an immediate update. */ for (i = 0; i < NCOLOURS; i++) { if (oldcfg.colours[ww[i]][0] != cfg2.colours[ww[i]][0] || oldcfg.colours[ww[i]][1] != cfg2.colours[ww[i]][1] || oldcfg.colours[ww[i]][2] != cfg2.colours[ww[i]][2]) real_palette_set(inst, i, cfg2.colours[ww[i]][0], cfg2.colours[ww[i]][1], cfg2.colours[ww[i]][2]); } /* * If the scrollbar needs to be shown, hidden, or moved * from one end to the other of the window, do so now. */ if (oldcfg.scrollbar != cfg2.scrollbar) { if (cfg2.scrollbar) gtk_widget_show(inst->sbar); else gtk_widget_hide(inst->sbar); } if (oldcfg.scrollbar_on_left != cfg2.scrollbar_on_left) { gtk_box_reorder_child(inst->hbox, inst->sbar, cfg2.scrollbar_on_left ? 0 : 1); } /* * Change the window title, if required. */ if (strcmp(oldcfg.wintitle, cfg2.wintitle)) set_title(inst, cfg2.wintitle); /* * Redo the whole tangled fonts and Unicode mess if * necessary. */ if (strcmp(oldcfg.font.name, cfg2.font.name) || strcmp(oldcfg.boldfont.name, cfg2.boldfont.name) || strcmp(oldcfg.widefont.name, cfg2.widefont.name) || strcmp(oldcfg.wideboldfont.name, cfg2.wideboldfont.name) || strcmp(oldcfg.line_codepage, cfg2.line_codepage)) { setup_fonts_ucs(inst); need_size = 1; } else need_size = 0; /* * Resize the window. */ if (oldcfg.width != cfg2.width || oldcfg.height != cfg2.height || oldcfg.window_border != cfg2.window_border || need_size) { set_geom_hints(inst); request_resize(inst, cfg2.width, cfg2.height); //term_size(inst->term, cfg2.height, cfg2.width, cfg2.savelines); // where TF is our configure event going?! } term_invalidate(inst->term); } sfree(titlesetup_fonts_ucs(inswidth = inst->cfg.width; inst->height = inst->cfg.heightnst->sbar_adjust = GTK_ADJUSTMENT(gtk_adjustment_new(0,0,0,0,0,0)); inst->sbar = gtk_vscrollbar_new(inst->sbar_adjust); inst->hbox = GTK_BOX(gtk_hbox_new(FALSE, 0)); /* * We always create the scrollbar; it remains invisible if * unwanted, so we can pop it up quickly if it suddenly becomes * desirable. */ if (inst->cfg.scrollbar_on_left) gtk_box_pack_start(inst->hbox, inst->sbar, FALSE, FALSE, 0); gtk_box_pack_start(inst->hbox, inst->area, TRUE, TRUE, 0); if (!inst->cfg.scrollbar_on_left) gtk_box_pack_start(inst->hbox, inst->sbar, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(inst->window), GTK_WIDGET(inst->hbox)); set_geom_hints(inst); gtk_widget_show(inst->area); if (inst->cfg.scrollbar) gtk_widget_show(inst->sbar); else gtk_widget_hide MKMENUITEM("Change Settings", change_settings_menuitem); MKMENUITEM(NULL, NULL); Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 61b409093eef84ebdd551844d6d4fe9a Text-delta-base-sha1: 8cc900c36303eaf7a4becf7297fdb0ee02a9ccc4 Text-content-length: 88 Text-content-md5: ae041ef98349dd8c8084d1a26820b9d1 Text-content-sha1: bfaddef73886ff81e7b3d2d3c0bb3ffbdc8c908a Content-length: 128 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN] B5Bf4int do_config_box(const char *title, Config *cfg, int midsession); Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5ef19c71b7aec72629b54f1c01febb6a Text-delta-base-sha1: 44d8e2adcfa8c619c821464513db95e418a022b4 Text-content-length: 76 Text-content-md5: da60e8a36ca11250650dcac53d9cc7d5 Text-content-sha1: 66f2855b4ddc0d3d5ce36a07e51697a120652df7 Content-length: 116 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN*$2+rvUUreturn do_config_box("PuTTY Configuration", cfg, 0 Revision-number: 3093 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:15.785340Z PROPS-END Revision-number: 3094 Prop-content-length: 325 Content-length: 325 K 7 svn:log V 224 A poster on comp.security.ssh mentions that he had expected to find the location of PuTTY's data storage mentioned in the manual section about loading and storing sessions. This seems not unreasonable, so I've put it there. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-11T17:39:48.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a9df7b52f5f811eafcc4ab5f860373b0 Text-delta-base-sha1: 9b1489dd47cc9586ecdbca6fcec9456fd64f98d6 Text-content-length: 289 Text-content-md5: a42cfbaf9289b039c5b179a3c9b3012b Text-content-sha1: 5130aae431f2603af447ff4b4777e9aef819c9e1 Content-length: 329 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNV)5P([\versionid $Id: config.but,v 1.61 2003/04/11 17:39:48Saved sessions are stored in the Registry, at the location \c HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions If you need to store them in a file, you could try the method described in \k{config-file} Revision-number: 3095 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2003-04-11T17:40:52.000000Z K 7 svn:log V 45 Cutting and pasting from the Unix Event Log. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9317d46b25bf4d179fc4ee584fd868ed Text-delta-base-sha1: 365aebb78cb1c02a3941259dd16c1c8ec23b66fd Text-content-length: 2738 Text-content-md5: 8b22a5249cf26c6d81a2a82ed67c1449 Text-content-sha1: 54e7870492876f80aa8bc277914ba630951fdda9 Content-length: 2778 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNlu%]#ZRwFuKm/= char *seldata; int sellen; int ignore_selchangsfree(es->seldata) else if (event == EVENT_SELCHANGE) { int i; int selsize = 0; /* * If this SELCHANGE event is happening as a result of * deliberate deselection because someone else has grabbed * the selection, the last thing we want to do is pre-empt * them. */ if (es->ignore_selchange) return; /* * Construct the data to use as the selection. */ sfree(es->seldata); es->seldata = NULL; es->sellen = 0; for (i = 0; i < es->nevents; i++) { if (dlg_listbox_issel(ctrl, dlg, i)) { int extralen = strlen(es->events[i]); if (es->sellen + extralen + 2 > selsize) { selsize = es->sellen + extralen + 512; es->seldata = sresize(es->seldata, selsize, char); } strcpy(es->seldata + es->sellen, es->events[i]); es->sellen += extralen; es->seldata[es->sellen++] = '\n'; } } if (gtk_selection_owner_set(es->window, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME)) { extern GdkAtom compound_text_atom; gtk_selection_add_target(es->window, GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, 1); gtk_selection_add_target(es->window, GDK_SELECTION_PRIMARY, compound_text_atom, 1); } } } void eventlog_selection_get(GtkWidget *widget, GtkSelectionData *seldata, guint info, guint time_stamp, gpointer data) { struct eventlog_stuff *es = (struct eventlog_stuff *)data; gtk_selection_data_set(seldata, seldata->target, 8, es->seldata, es->sellen); } gint eventlog_selection_clear(GtkWidget *widget, GdkEventSelection *seldata, gpointer data) { struct eventlog_stuff *es = (struct eventlog_stuff *)data; struct uctrl *uc; /* * Deselect everything in the list box. */ uc = dlg_find_byctrl(&es->dp, es->listctrl); es->ignore_selchange = 1; gtk_list_unselect_all(GTK_LIST(uc->list)); es->ignore_selchange = 0; sfree(es->seldata); es->sellen = 0; es->seldata = NULL; return TRUE; } gtk_signal_connect(GTK_OBJECT(window), "selection_get", GTK_SIGNAL_FUNC(eventlog_selection_get), es); gtk_signal_connect(GTK_OBJECT(window), "selection_clear_event", GTK_SIGNAL_FUNC(eventlog_selection_clear), es Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3ee3972bbdc19ba524a170fb6658c5a3 Text-delta-base-sha1: 4898fad1b065a253415c032271adfcf5d5a64911 Text-content-length: 279 Text-content-md5: 0e53b738d250a5dc1892687e9c21d125 Text-content-sha1: cd1674c99fbe81c5c73799940a60181141434fc0 Content-length: 320 K 15 cvs2svn:cvs-rev V 5 1.112 PROPS-END SVN&-J? ?`%d,S2z.Roh>GdkAtom compound_text_atom, utf8_string_atom;utf8_string_atom)f (!compound_text_atom) compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE); if (!utf8_string_atom) Revision-number: 3096 Prop-content-length: 256 Content-length: 256 K 7 svn:log V 155 Saving of Default Settings under Unix was broken, because mungestr() was translating NULL into "Default Settings" but not doing the same to "". Now fixed. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-11T17:42:52.000000Z PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f10832d0bd26d197ced8a8bb22011ec4 Text-delta-base-sha1: 1eee3db50eda1e64c40751f4ddf785a2adf355f0 Text-content-length: 27 Text-content-md5: 08cc9520008d5dab1b2ae410142de51a Text-content-sha1: e50434f078b936a5d1e725343756f9a60be13ab4 Content-length: 67 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN+3 Q\O || !* Revision-number: 3097 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2003-04-11T17:59:36.000000Z K 7 svn:log V 51 `Copy All' context-menu item, for what it's worth. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0e53b738d250a5dc1892687e9c21d125 Text-delta-base-sha1: cd1674c99fbe81c5c73799940a60181141434fc0 Text-content-length: 103 Text-content-md5: dbda754dd3606cd927f498f4ba165546 Text-content-sha1: 9a64f447f2040f8047b35bba8888f49f17756ae6 Content-length: 144 K 15 cvs2svn:cvs-rev V 5 1.113 PROPS-END SVN-j<Xm'i&uF "copy_alcopyall(inst->term); } void speci"Copy All", copy_al Revision-number: 3098 Prop-content-length: 261 Content-length: 261 K 8 svn:date V 27 2003-04-11T18:10:13.000000Z K 7 svn:log V 160 `Copy All' ought to de-highlight any existing selection, in line with any other operation that shifts the X selection to stuff other than the highlighted text. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 78251a55041a0767287449e60859b485 Text-delta-base-sha1: 931659bd73b70d9f9ce26e27a08bc30377227333 Text-content-length: 99 Text-content-md5: e1cee49d2f31afe0744ddbadde0dd61a Text-content-sha1: 49becc584d67a301d6933f81bd73a5daf510a9bc Content-length: 140 K 15 cvs2svn:cvs-rev V 5 1.151 PROPS-END SVN ], int deselD\_td:X2mode this mdesel, TRUE, FALSE Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: dbda754dd3606cd927f498f4ba165546 Text-delta-base-sha1: 9a64f447f2040f8047b35bba8888f49f17756ae6 Text-content-length: 77 Text-content-md5: 005f05cfd8b4090c0e9665b29a35e71d Text-content-sha1: 1648e338e14d1a65476154513697e3e31ecedb8c Content-length: 118 K 15 cvs2svn:cvs-rev V 5 1.114 PROPS-END SVNj 3928 if (must_deselect) term_deselect(inst->term); Revision-number: 3099 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 25 Implement Warn On Close. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-11T18:15:47.000000Z PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8b22a5249cf26c6d81a2a82ed67c1449 Text-delta-base-sha1: 54e7870492876f80aa8bc277914ba630951fdda9 Text-content-length: 388 Text-content-md5: 5979dcca090b223f0b2784aeacdad927 Text-content-sha1: 3419c0f52f2ff45d53ce1c16571c5141dc540cba Content-length: 428 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNubh8hB3int reallyclose(void *frontend) { char *title = dupcat(appname, " Exit Confirmation", NULL); int ret = messagebox(GTK_WIDGET(get_window(frontend)), title, "Are you sure you want to close this session?", string_width("Most of the width of the above text"), "Yes", 'y', +1, 1, "No", 'n', -1, 0, NULL); sfree(title); return ret Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 005f05cfd8b4090c0e9665b29a35e71d Text-delta-base-sha1: 1648e338e14d1a65476154513697e3e31ecedb8c Text-content-length: 165 Text-content-md5: bd3f83a5eff298c7f3ca302165a3938f Text-content-sha1: b7e6e58c4740f6e27a11e4f48b9c637684fdd9f3 Content-length: 206 K 15 cvs2svn:cvs-rev V 5 1.115 PROPS-END SVNR Z n0struct gui_data *inst = (struct gui_data *)data; if (inst->cfg.warn_on_close) { if (!reallyclose(inst->term)) return TRUE; } Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ae041ef98349dd8c8084d1a26820b9d1 Text-delta-base-sha1: bfaddef73886ff81e7b3d2d3c0bb3ffbdc8c908a Text-content-length: 51 Text-content-md5: 08165f4060e7b87b02cb9b053176365c Text-content-sha1: 59911c529a4cad19678b8fb90974f21c880f03e9 Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN]~ GDint reallyclose(void *frontend Revision-number: 3100 Prop-content-length: 1197 Content-length: 1197 K 8 svn:date V 27 2003-04-11T18:36:27.000000Z K 7 svn:log V 1095 Rationalisation of the system of frontend handles. Most modular bits of PuTTY (terminal, backend, logctx etc) take a `void *' handle passed to them from the frontend, and used as a context for all their callbacks. Most of these point at the frontend structure itself (on platforms where this is meaningful), except that the handle passed to the backend has always pointed at the terminal because from_backend() was implemented in terminal.c. This has finally bitten Unix PuTTY, because both backend and logctx have been passing their respective and very different frontend handles to logevent(), so I've fixed it. from_backend() is now a function supplied by the _frontend_ itself, in all cases, and the frontend handle passed to backends must be the same as that passed to everything else. What was from_backend() in terminal.c is now called term_data(), and the typical implementation of from_backend() in a GUI frontend will just extract the terminal handle from the frontend structure and delegate to that. This appears to work on Unix and Windows, but has most likely broken the Mac build. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b0f3bf49196230c7b62cc96cbff64193 Text-delta-base-sha1: 8632f6437617310e9a868b3732558bfca84b6198 Text-content-length: 124 Text-content-md5: fed94eee8b4263c425bf7efb9bee22a0 Text-content-sha1: 17693a67df818dc947d24dc3e5cbe76066b27e4c Content-length: 165 K 15 cvs2svn:cvs-rev V 5 1.213 PROPS-END SVNyF[WI`T4Eint from_backend(void *frontend, int is_stderr, const char *data, int lenterm_data(Terminal Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e1cee49d2f31afe0744ddbadde0dd61a Text-delta-base-sha1: 49becc584d67a301d6933f81bd73a5daf510a9bc Text-content-length: 115 Text-content-md5: f4b0028cc01406a5cb4bf8122c27ef65 Text-content-sha1: 2d15711bfead06a9f8d2ba7f70e9f3b211fe0a3f Content-length: 156 K 15 cvs2svn:cvs-rev V 5 1.152 PROPS-END SVN\j IBI_}int term_data(Terminal *term, int is_stderr, const char *data, int len) { Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bd3f83a5eff298c7f3ca302165a3938f Text-delta-base-sha1: b7e6e58c4740f6e27a11e4f48b9c637684fdd9f3 Text-content-length: 591 Text-content-md5: fd7d2738e1131a2b7b56df61c095cc6f Text-content-sha1: ec587a3909b1b9e7ae65eb4033bf6fda438633a7 Content-length: 632 K 15 cvs2svn:cvs-rev V 5 1.116 PROPS-END SVNR>dI@]tP%JpU\Lx #r2(*struct gui_data *inst = (struct gui_data *)int from_backend(void *frontend, int is_stderr, const char *data, int len) { struct gui_data *inst = (struct gui_data *)frontend; return term_data(inst->term, is_stderr, data, len); } void logevent(void *frontend, char *string) { struct gui_data *inst = (struct gui_data *)struct gui_data *inst = (struct gui_data *)struct gui_data *inst = (struct gui_data *)frontend} term_invalidate(inst->term); } sfree(title); } void update_specials_menu Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: da60e8a36ca11250650dcac53d9cc7d5 Text-delta-base-sha1: 66f2855b4ddc0d3d5ce36a07e51697a120652df7 Text-content-length: 329 Text-content-md5: e3d9a66641765b9d5836849921dc6383 Text-content-sha1: b4c40e48226f275862d464f6ebffe01cccedae4d Content-length: 369 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN$@,F,^JZGo through all the config options and ensure they can all be * configured and reconfigured properly. * * - Remainder of the context menu: * * - New Session, Duplicate Session and the Saved Sessions * submenu. * + at least New and Duplicate probably _should_ be in * pterm. Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4fdec3b5b328c0dcaf9ea910b1c7b5c1 Text-delta-base-sha1: 4c674cd79ded637e53bf35c0d1c44b4a8e3a1875 Text-content-length: 187 Text-content-md5: f393b627d7778cb3bedb8ca045d32509 Text-content-sha1: ddea3f468fdf9deb075d516da2db35780ff97834 Content-length: 228 K 15 cvs2svn:cvs-rev V 5 1.243 PROPS-END SVN 3A?NULLxt(hwnd,)#! int from_backend(void *frontend, int is_stderr, const char *data, int len) { return term_data(term, is_stderr, data, len); } Revision-number: 3101 Prop-content-length: 233 Content-length: 233 K 7 svn:log V 132 When I implemented the GTK messagebox() function and everything that needed to use it, I completely forgot about askappend(). D'oh. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-11T18:44:05.000000Z PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5979dcca090b223f0b2784aeacdad927 Text-delta-base-sha1: 3419c0f52f2ff45d53ce1c16571c5141dc540cba Text-content-length: 799 Text-content-md5: e1f808e814a518c1332423078e59f4a3 Text-content-sha1: 8d7836fbc31f37d810028bf4766e8627fdf8352c Content-length: 839 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNbk b int askappend(void *frontend, Filename filename) { static const char msgtemplate[] = "The session log file \"%.*s\" already exists. " "You can overwrite it with a new session log, " "append your session log to the end of it, " "or disable session logging for this session."; char *message; char *mbtitle; int mbret; message = dupprintf(msgtemplate, FILENAME_MAX, filename.path); mbtitle = dupprintf("%s Log to File", appname); mbret = messagebox(get_window(frontend), mbtitle, message, string_width("LINE OF TEXT SUITABLE FOR THE" " ASKAPPEND WIDTH"), "Overwrite", 'o', 1, 2, "Append", 'a', 0, 1, "Disable", 'd', -1, 0, NULL); sfree(message); sfree(mbtitle); return mbret; } Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fd7d2738e1131a2b7b56df61c095cc6f Text-delta-base-sha1: ec587a3909b1b9e7ae65eb4033bf6fda438633a7 Text-content-length: 23 Text-content-md5: 19c1ebd0877439ada951706847e12822 Text-content-sha1: 158a28b3e40cc06aca57c196d870e70a0ad1fe80 Content-length: 64 K 15 cvs2svn:cvs-rev V 5 1.117 PROPS-END SVN% |)\ Revision-number: 3102 Prop-content-length: 304 Content-length: 304 K 8 svn:date V 27 2003-04-12T08:27:03.000000Z K 7 svn:log V 203 Close On Exit and Warn On Close fixes: (a) pty_reconfig needs to remember changes in COE so it knows whether to print a message, and (b) once the session has already ended, Warn On Close should shut up. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 19c1ebd0877439ada951706847e12822 Text-delta-base-sha1: 158a28b3e40cc06aca57c196d870e70a0ad1fe80 Text-content-length: 41 Text-content-md5: 38e259def9ecf100165a935bb9f643b6 Text-content-sha1: 3b9118d804b1074f523f3ce410f7da12a1067e7d Content-length: 82 K 15 cvs2svn:cvs-rev V 5 1.118 PROPS-END SVN%6 aDa!inst->exited && Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c347c6d83e4f3fb47927173451e6460d Text-delta-base-sha1: 999b1bbfdc14d7f806f80bbbb36bd9605eb03ff5 Text-content-length: 427 Text-content-md5: c5a7201b4143e672de9fa5edba07796d Text-content-sha1: c99359ea3534480f9f862e42d12191b5fa0f090b Content-length: 467 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN6  gstatic void pty_reconfig(void *handle, Config *cfg) { /* * We don't have much need to reconfigure this backend, but * unfortunately we do need to pick up the setting of Close On * Exit so we know whether to give a `terminated' message. */ pty_cfg = *cfg; /* structure copy */ } /* * Stub routine (never called in pterm). */ static void pty_free(void *handle) { } Revision-number: 3103 Prop-content-length: 392 Content-length: 392 K 8 svn:date V 27 2003-04-12T08:59:06.000000Z K 7 svn:log V 291 Disable window title reporting by default, since it's a security hazard. I considered removing it completely, but I can't rule out the possibility of an OS that actually takes security of its terminal devices seriously, and which might be able to make sensible and safe use of this feature. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aae75549d6000ba991d713028f994f9b Text-delta-base-sha1: 3d2ca87efdb842b207f0d9843499714968cb2b94 Text-content-length: 164 Text-content-md5: 2063526040d912c000bdc0723ad5bdaf Text-content-sha1: 8c0bacf82f194260cb033cd53ca7a1aeb1108f41 Content-length: 204 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNJ%}remote window title querying (SECURITY)", 'q', HELPCTX(features_qtitle), dlg_stdcheckbox_handler, I(offsetof(Config,no_remote_q Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a42cfbaf9289b039c5b179a3c9b3012b Text-delta-base-sha1: 5130aae431f2603af447ff4b4777e9aef819c9e1 Text-content-length: 1047 Text-content-md5: ce8cc3b9c747eba0e827b7db98ea00eb Text-content-sha1: fa2f3318687526e3e0a8c650c0f798932476713c Content-length: 1087 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVNV0y5D4"\versionid $Id: config.but,v 1.62 2003/04/12 08:59:06qtitle} Disabling remote window title querying \cfg{winhelp-topic}{features.qtitle} PuTTY can optionally provide the xterm service of allowing server applications to find out the local window title. This feature is disabled by default, but you can turn it on if you really want it. NOTE that this feature is a \e{potential security hazard}. If a malicious application can write data to your terminal (for example, if you merely \c{cat} a file owned by someone else on the server machine), it can change your window title (unless you have disabled this as mentioned in \k{config-features-retitle}) and then use this service to have the new window title sent back to the server as if typed at the keyboard. This allows an attacker to fake keypresses and potentially cause your server-side applications to do things you didn't want. Therefore this feature is disabled by default, and we recommend you do not turn it on unless you \e{really} know what you are doing Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fed94eee8b4263c425bf7efb9bee22a0 Text-delta-base-sha1: 17693a67df818dc947d24dc3e5cbe76066b27e4c Text-content-length: 81 Text-content-md5: b2866c2a3abd7c0e23486f1120e87ea7 Text-content-sha1: 679c7217bc8a495b0205133abdff8624a991d53b Content-length: 122 K 15 cvs2svn:cvs-rev V 5 1.214 PROPS-END SVNF :occno_remote_qtitle; /* disable remote win title query Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e124e544da41d658d0462933b1d4849b Text-delta-base-sha1: 3200c66c822f5d75d545bc526067224b035713e8 Text-content-length: 96 Text-content-md5: cc8d057906d8e66f295c3d469d29eb67 Text-content-sha1: ccd45c7a9d0969aaf70d8ab0bea6d21a16425452 Content-length: 137 K 15 cvs2svn:cvs-rev V 5 1.108 PROPS-END SVN`gB cZRemoteQTitle", cfg->no_remote_qRemoteQTitle", 1, &cfg->no_remote_q Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f4b0028cc01406a5cb4bf8122c27ef65 Text-delta-base-sha1: 2d15711bfead06a9f8d2ba7f70e9f3b211fe0a3f Text-content-length: 207 Text-content-md5: 4479baec03bc83b66ca8b14768cecf3d Text-content-sha1: 411656d4087b99330ee91721747d9350d13aca1a Content-length: 248 K 15 cvs2svn:cvs-rev V 5 1.153 PROPS-END SVNN && !term->cfg.no_remote_qtitle && !term->cfg.no_remote_qtitlej8NNj line (and also set `nl' if this is the case, * because in normal selection Node-path: putty/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 56de4949a8156340a72da683b3abe3cf Text-delta-base-sha1: 0bee721d2c2fb4d7b4c0bc28e7ef16b2cb9d231e Text-content-length: 39 Text-content-md5: 40728e067dcc5fd549a067fbbab84c19 Text-content-sha1: 7f8797a12ef19dd91dd400e3fd83d0e9c2d6b40e Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN= l?Hqtitle "features.q Revision-number: 3104 Prop-content-length: 112 Content-length: 112 K 8 svn:date V 27 2003-04-12T08:59:56.000000Z K 7 svn:log V 12 Fixed this. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/vuln-window-title Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f1d75349eb8e286aca9dbec3e1894629 Text-delta-base-sha1: 06507c139a5344848645467b658d4c31f5191f25 Text-content-length: 88 Text-content-md5: 01fe33c851e2ded73cbda3cb44a5396b Text-content-sha1: 9e929614a9eedc901010942de6697aae09aaca38 Content-length: 127 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN&i B Fixed-in: 2003-04-13

    SGT, 2003-04-12: Just fixed this. Revision-number: 3105 Prop-content-length: 257 Content-length: 257 K 8 svn:date V 27 2003-04-12T09:05:28.000000Z K 7 svn:log V 156 Mid-session BCE reconfiguration wasn't taking effect immediately because I forgot to set term->erase_char in response to the change in term->use_bce. Oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4479baec03bc83b66ca8b14768cecf3d Text-delta-base-sha1: 411656d4087b99330ee91721747d9350d13aca1a Text-content-length: 303 Text-content-md5: 0a50ee12dd686bc344b451badc4c7b68 Text-content-sha1: 6242668d57e5df62d62193008a51b1fec79fa4d4 Content-length: 344 K 15 cvs2svn:cvs-rev V 5 1.154 PROPS-END SVNPI}|ji { term->use_bce = term->cfg.bce else term->erase_char = ERASE_CHAR; }8e--8p to. So we start it at the end of the * line... */ nlpos.y = top.y; nlpos.x = term->cols; /* * ... move it backwards if there's unused space at the end * of the Revision-number: 3106 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2003-04-12T09:19:09.000000Z K 7 svn:log V 146 Fix from yesterday's frontend-handle upheaval: ldisc calls from_backend(), and must now pass its frontend handle rather than its terminal handle. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 13961b4db11af60082e62ab2413f4c43 Text-delta-base-sha1: 36c3d53c6e9b7c9b21a6acb65f70e5659fbb28bd Text-content-length: 29 Text-content-md5: 2aa516b69f2f8c865aae0086f186e0e2 Text-content-sha1: 019955be0f85b6dd8ec647bb69a4275a99336513 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN7; nErfrontend Revision-number: 3107 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2003-04-12T09:27:56.000000Z K 7 svn:log V 102 Implement the ldisc `special' mechanism in Unix, without which local line editing didn't work at all. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 38e259def9ecf100165a935bb9f643b6 Text-delta-base-sha1: 3b9118d804b1074f523f3ce410f7da12a1067e7d Text-content-length: 557 Text-content-md5: 1d644b2ebca8f7ba27719d0c4908ee5b Text-content-sha1: f8f558f91fdde6acc41f45e16b815fc975173985 Content-length: 598 K 15 cvs2svn:cvs-rev V 5 1.119 PROPS-END SVN66/p99n9Q$_1e bHn, specialspecial = FALSE; special = TRUE; } /* We handle Return ourselves, because it needs to be flagged as * special to ldisc. */ if (event->keyval == GDK_Return) { output[1] = '\015'; end = 2; special = TRUE special = TRUE special = TRUEspecial) { /* * For special control characters, the character set * should never matter. */ output[end] = '\0'; /* NUL-terminate */ ldisc_send(inst->ldisc, output+start, -2, 1); } else Revision-number: 3108 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2003-04-12T10:44:14.000000Z K 7 svn:log V 124 Mid-session reconfiguration of scrollback was failing (in Unix) except when width or height had _also_ been changed. Fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1d644b2ebca8f7ba27719d0c4908ee5b Text-delta-base-sha1: f8f558f91fdde6acc41f45e16b815fc975173985 Text-content-length: 428 Text-content-md5: 82090a4edd98e524fd995cc28cc8b3a9 Text-content-sha1: befe0506d278eb7100b6600b6c86ab95cb3c46a2 Content-length: 469 K 15 cvs2svn:cvs-rev V 5 1.120 PROPS-END SVN6GlKk else { /* * The above will have caused a call to term_size() for * us if it happened. If the user has fiddled with only * the scrollback size, the above will not have * happened and we will need an explicit term_size() * here. */ if (oldcfg.savelines != cfg2.savelines) term_size(inst->term, inst->term->rows, inst->term->cols, cfg2.savelines); Revision-number: 3109 Prop-content-length: 247 Content-length: 247 K 7 svn:log V 146 Further fiddlings with the size reconfiguration stuff; now everything seems to work right even when the only thing changed was the window border. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-12T11:03:44.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 82090a4edd98e524fd995cc28cc8b3a9 Text-delta-base-sha1: befe0506d278eb7100b6600b6c86ab95cb3c46a2 Text-content-length: 935 Text-content-md5: d5b314ef284dd93610368140e550a890 Text-content-sha1: 98c0cf8e0be8f004162efa21306fc2075d48e1b6 Content-length: 976 K 15 cvs2svn:cvs-rev V 5 1.121 PROPS-END SVNG_ ya4[E@o3 GdkGC *gc; /* * See if the terminal size has changed, in which case we must * let the terminal know. */ if (w != inst->width || h != inst->height) { if (inst->pixmap) { gdk_pixmap_unref(inst->pixmap); inst->pixmap = NULL; } inst->pixmap = gdk_pixmap_new(widget->window, (inst->cfg.width * inst->font_width + 2*inst->cfg.window_border), (inst->cfg.height * inst->font_height + 2*inst->cfg.window_border), -1); gc = gdk_gc_new(inst->area->window); gdk_gc_set_foreground(gc, &inst->cols[18]); /* default background */ gdk_draw_rectangle(inst->pixmap, gc, 1, 0, 0, inst->cfg.height * inst->font_height + 2*inst->cfg.window_border); gdk_gc_unref(gc); if (need_size && inst->term) { term_size(inst->term, h, w, inst->cfg.savelines); } if (inst->term) term_invalidate(inst->term); Revision-number: 3110 Prop-content-length: 282 Content-length: 282 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-12T17:37:15.000000Z K 7 svn:log V 181 Support for New Session, Duplicate Session and the Saved Sessions submenu in Unix PuTTY, and Duplicate Session also in pterm. You do _not_ want to know how this is done. Be warned. PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d5b314ef284dd93610368140e550a890 Text-delta-base-sha1: 98c0cf8e0be8f004162efa21306fc2075d48e1b6 Text-content-length: 6986 Text-content-md5: 888ac59e49dd41e07114b0d58528ff69 Text-content-sha1: e623015b6c1c844c5f23e501e31a7418832f7118 Content-length: 7027 K 15 cvs2svn:cvs-rev V 5 1.122 PROPS-END SVN_>mO?N5<^j~FY^~cg;Lt/<^xpiJeO4fD>P$;extern char **pty_argv; /* declared in pty.c */ extern int use_pty_argvtkWidget *sessionsmenu char *progname, **gtkargvstart; int ngtkargschar *valfork_and_exec_self(struct gui_data *inst, int fd_to_close, ...) { /* * Re-execing ourself is not an exact science under Unix. I do * the best I can by using /proc/self/exe if available and by * assuming argv[0] can be found on $PATH if not. * * Note that we also have to reconstruct the elements of the * original argv which gtk swallowed, since the user wants the * new session to appear on the same X display as the old one. */ char **args; va_list ap; int i, n; int pid; /* * Collect the arguments with which to re-exec ourself. */ va_start(ap, fd_to_close); n = 2; /* progname and terminating NULL */ n += inst->ngtkargs; while (va_arg(ap, char *) != NULL) n++; va_end(ap); args = snewn(n, char *); args[0] = inst->progname; args[n-1] = NULL; for (i = 0; i < inst->ngtkargs; i++) args[i+1] = inst->gtkargvstart[i]; i++; va_start(ap, fd_to_close); while ((args[i++] = va_arg(ap, char *)) != NULL); va_end(ap); assert(i == n); /* * Do the double fork. */ pid = fork(); if (pid < 0) { perror("fork"); return; } if (pid == 0) { int pid2 = fork(); if (pid2 < 0) { perror("fork"); _exit(1); } else if (pid2 > 0) { /* * First child has successfully forked second child. My * Work Here Is Done. Note the use of _exit rather than * exit: the latter appears to cause destroy messages * to be sent to the X server. I suspect gtk uses * atexit. */ _exit(0); } /* * If we reach here, we are the second child, so we now * actually perform the exec. */ if (fd_to_close >= 0) close(fd_to_close); execv("/proc/self/exe", args); execvp(inst->progname, args); perror("exec"); _exit(127); } else { int status; waitpid(pid, &status, 0); } } void dup_session_menuitem(GtkMenuItem *item, gpointer gdata) { struct gui_data *inst = (struct gui_data *)gdata; /* * For this feature we must marshal cfg and (possibly) pty_argv * into a byte stream, create a pipe, and send this byte stream * to the child through the pipe. */ int i, ret, size; char *data; char option[80]; int pipefd[2]; if (pipe(pipefd) < 0) { perror("pipe"); return; } size = sizeof(inst->cfg); if (use_pty_argv && pty_argv) { for (i = 0; pty_argv[i]; i++) size += strlen(pty_argv[i]) + 1; } data = snewn(size, char); memcpy(data, &inst->cfg, sizeof(inst->cfg)); if (use_pty_argv && pty_argv) { int p = sizeof(inst->cfg); for (i = 0; pty_argv[i]; i++) { strcpy(data + p, pty_argv[i]); p += strlen(pty_argv[i]) + 1; } assert(p == size); } sprintf(option, "---[%d,%d]", pipefd[0], size); fcntl(pipefd[0], F_SETFD, 0); fork_and_exec_self(inst, pipefd[1], option, NULL); close(pipefd[0]); i = 0; while (i < size && (ret = write(pipefd[1], data + i, size - i)) > 0) i += ret; if (ret < 0) perror("write to pipe"); close(pipefd[1]); sfree(data); } int read_dupsession_data(struct gui_data *inst, Config *cfg, char *arg) { int fd, i, ret, size; char *data; if (sscanf(arg, "---[%d,%d]", &fd, &size) != 2) { fprintf(stderr, "%s: malformed magic argument `%s'\n", appname, arg); exit(1); } data = snewn(size, char); i = 0; while (i < size && (ret = read(fd, data + i, size - i)) > 0) i += ret; if (ret < 0) { perror("read from pipe"); exit(1); } else if (i < size) { fprintf(stderr, "%s: unexpected EOF in Duplicate Session data\n", appname); exit(1); } memcpy(cfg, data, sizeof(Config)); if (use_pty_argv && size > sizeof(Config)) { int n = 0; i = sizeof(Config); while (i < size) { while (i < size && data[i]) i++; if (i >= size) { fprintf(stderr, "%s: malformed Duplicate Session data\n", appname); exit(1); } i++; n++; } pty_argv = snewn(n+1, char *); pty_argv[n] = NULL; n = 0; i = sizeof(Config); while (i < size) { char *p = data + i; while (i < size && data[i]) i++; assert(i < size); i++; pty_argv[n++] = dupstr(p); } } return 0; } void new_session fork_and_exec_self(inst, -1, NULL); } void saved_sessionchar *str = (char *)gtk_object_get_data(GTK_OBJECT(item), "user-data"); fork_and_exec_self(inst, -1, "-load", str, NULL); } void saved_session_freedata(GtkMenuItem *item, gpointer data) { char *str = (char *)gtk_object_get_data(GTK_OBJECT(item), "user-data"); sfree(str); } void update_specials_menu/* * SIGPIPE is not something we want to see terminating the * process. */ block_signal(SIGPIPE, 1); inst->progname = argv[0]; /* * Copy the original argv before letting gtk_init fiddle with * it. It will be required later. */ { int i, oldargc; inst->gtkargvstart = snewn(argc-1, char *); for (i = 1; i < argc; i++) inst->gtkargvstart[i-1] = dupstr(argv[i]); oldargc = argc; gtk_init(&argc, &argv); inst->ngtkargs = oldargc - argc; } if (argc > 1 && !strncmp(argv[1], "---", 3)) { read_dupsession_data(inst, &inst->cfg, argv[1]); /* Splatter this argument so it doesn't clutter a ps listing */ memset(argv[1], 0, strlen(argv[1])); } else { if (do_cmdline(argc, argv, 0, inst, &inst->cfg)) exit(1); /* pre-defaults pass to get -class */ do_defaults(NULL, &inst->cfg); if (do_cmdline(argc, argv, 1, inst, &inst->cfg)) exit(1); /* post-defaults, do everything */ cmdline_run_saved(&inst->cfg); if (!*inst->cfg.host && !cfgbox(&inst->cfg)) exit(0); /* config box hit Cancel */ }, new_session, saved_sessions if (new_session) MKMENUITEM("New Session", new_session_menuitem); MKMENUITEM("Duplicate Session", dup_session_menuitem); if (saved_sessions) { struct sesslist sesslist; int i; inst->sessionsmenu = gtk_menu_new(); get_sesslist(&sesslist, TRUE); for (i = 1; i < sesslist.nsessions; i++) { menuitem = gtk_menu_item_new_with_label(sesslist.sessions[i]); gtk_container_add(GTK_CONTAINER(inst->sessionsmenu), menuitem); gtk_widget_show(menuitemdupstr(sesslist.sessions[i])); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(saved_session_menuitem), inst); gtk_signal_connect(GTK_OBJECT(menuitem), "destroy", GTK_SIGNAL_FUNC(saved_session_freedata), inst); } get_sesslist(&sesslist, FALSE); MKMENUITEM("Saved Sessions", NULL); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->sessionsmenu); } MKMENUITEM(NULL, NULL); Node-path: putty/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d187567e0e29b2ffa12d9b9189f9593d Text-delta-base-sha1: b01df3bdadc67bd28fea8b4dd238c29a8570b0b4 Text-content-length: 81 Text-content-md5: c1c94c303884aa2caa1a54e4e8af5f9f Text-content-sha1: 7c94beacee0f22ac28089ca1b2bce371a39e4c37 Content-length: 120 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN<| <@term, is_stderr, data, len) Revision-number: 3112 Prop-content-length: 138 Content-length: 138 K 7 svn:log V 40 Remove a couple of spurious semicolons. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-04-12T21:07:25.000000Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4ebcb2e24d7351fbe74f1b7f0820acf6 Text-delta-base-sha1: bf220d452884d2f566ce65ad8f3b85b0e7512577 Text-content-length: 116 Text-content-md5: eeeefcd9f0d9cb2211b13642cca9f1a6 Text-content-sha1: bbfd3ad95a0c27f2861e161b1f9c9c2eeda8cba7 Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVNus [),o/* $Id: macterm.c,v 1.74 2003/04/12 21:07:25 #else QDProcsPtr gp = s->window->grafProcs Revision-number: 3113 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2003-04-12T21:15:43.000000Z K 7 svn:log V 103 Don't use an uninitialised value when we get an unsupported ATYP in a SOCKS5 request. Spotted by GCC. K 10 svn:author V 3 ben PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd6373cfdf068dd755327e2f2bc15e48 Text-delta-base-sha1: ca6bd1d99ab3e066f4b332d831bbab0f0db2cde0 Text-content-length: 25 Text-content-md5: b6d19f76d5eaef37e5f5c578cb2b25a0 Text-content-sha1: d8620ea47adc8abf17446f513ea520263ab3a0f4 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN %p% = 0 Revision-number: 3114 Prop-content-length: 280 Content-length: 280 K 8 svn:date V 27 2003-04-12T21:23:58.000000Z K 7 svn:log V 181 socks5_negotiate(): rather than using an uninitialised value when passed an address of an invalid type, assert() that it will never happen. Do something similar for SOCKS4 as well. K 10 svn:author V 3 ben PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d0493898c0257d53a4c721afda74f091 Text-delta-base-sha1: 2ea0681499c15f9ea049502497827fd84175831d Text-content-length: 96 Text-content-md5: fb0328900f3853bf530db224e4121cc2 Text-content-sha1: 1f4a6ad63f5f5a7b28d7139bd57be98f6cfaeb1e Content-length: 136 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNs@D]><7assert(type == ADDRTYPE_NAME);{ assert(type == ADDRTYPE_NAME); Revision-number: 3115 Prop-content-length: 288 Content-length: 288 K 8 svn:date V 27 2003-04-13T13:52:44.000000Z K 7 svn:log V 189 Support for list boxes under System 7. There are some horrible kludges in this code to do with the handling of the scroll bar, but it doesn actually work better than the Mac OS 8 version. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 184d52a4f78721ea01d7ae1b565aef0d Text-delta-base-sha1: 191d87ef27f8c41d17b563352ae8576f35df2767 Text-content-length: 6653 Text-content-md5: a6b89f09d2d8c28a062985501c017d6c Text-content-sha1: e37c11e9596ca13f3d274bf269997c046c78b8b2 Content-length: 6693 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN:Xo{-&=;J?1xO;X/N|~*<c^MF@#91gk/u2yc )~3 OwBu1)Wjt;4{XD92E/InM396{.i}P}=:fT/* $Id: macctrls.c,v 1.32 2003/04/13 13:52:44LisListHandle liststatic pascal SInt32 macctrl_sys7_liscdef = (PatchCDEF)GetResource(kControlDefProcResourceType, CDEF_ListBox); (*cdef)->theUPP = NewControlDefProc(macctrl_sys7_listbox); /* 14 = proxies, 19 = portfwd#if TARGET_API_MAC_CARBON hideshow(GetListVerticalScrollBar(mc->listbox.list)); #else hideshow((*mc->listbox.list)->vScroll); #endifSize olenif (mac_gestalts.apprvers >= 0x100) { InsetRect(&bounds, 3, 3); mc->listbox.tbctrl = NewControl(window, &bounds, NULL, TRUE, ldes_Default, 0, 0, kControlListBoxProc, (long)mc); sizeof(mc->listbox.list), &mc->listbox.list, &olen) != noErr) { DisposeControl(mc->listbox.tbctrl); sfree(mc); return; } } #if !TARGET_API_MAC_CARBON else { InsetRect(&bounds, -3, -3); mc->listbox.tbctrl = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, SYS7_LISTBOX_PROC, (long)mc); mc->listbox.list = (ListHandle)(*mc->listbox.tbctrl)->contrlData; (*mc->listbox.list)->refCon = (long)mc; } #endif if (!ctrl->listbox.multisel) { #if TARGET_API_MAC_CARBON SetListSelectionFlags(mc->listbox.list, lOnlyOne); #else (*mc->listbox.#if !TARGET_API_MAC_CARBON static pascal SInt32 macctrl_sys7_lisListHandle list; long ssfs; Point mouse; ListBounds bounds; Point csize; short savefont; short savesize; GrafPtr curport; switch (msg) { case initCntl: rect = (*control)->contrlRect; InsetRect(&rect, 4, 4); rect.right -= 15; /* scroll bar */ bounds.top = bounds.bottom = bounds.left = 0; bounds.right = 1; csize.h = csize.v = 0; GetPort(&curport); savefont = curport->txFont; savesize = curport->txSize; ssfs = GetScriptVariable(smSystemScript, smScriptSysFondSize); TextFont(HiWord(ssfs)); TextSize(LoWord(ssfs)); list = LNew(&rect, &bounds, csize, 0, (*control)->contrlOwner, TRUE, FALSE, FALSE, TRUE); SetControlReference((*list)->vScroll, (long)list); (*control)->contrlData = (Handle)list; TextFont(savefont); TextSize(savesize); return noErr; case dispCntl: /* * If the dialogue box is being destroyed, the scroll bar * might have gone already. In our situation, this is the * only time we destroy a control, so NULL out the scroll bar * handle to prevent LDispose trying to free it. */ list = (ListHandle)(*control)->contrlData; (*list)->vScroll = NULL; LDispose(list); return 0; case drawCntl: if ((*control)->contrlVis) { rect = (*control)->contrlRect; /* XXX input focus highlighting? */ InsetRect(&rect, 3, 3); PenNormal(); FrameRect(&rect); list = (ListHandle)(*control)->contrlData; LActivate((*control)->contrlHilite != kControlInactivePart, list); GetPort(&curport); LUpdate(curport->visRgn, list); } return 0; case testCntl:4, 4); /* * We deliberately exclude the scrollbar so that LClick() can see it. */ rect.right -= 15; return PtInRect(mouse, &rect) ? kControlListBoxPart : kControlNoPart#if !TARGET_API_MAC_CARBON /* * Special magic for scroll bars in list boxes, whose refcon * is the list. */ if (part == kControlUpButtonPart || part == kControlDownButtonPart || part == kControlPageUpPart || part == kControlPageDownPart || part == kControlIndicatorPart) mc = (union macctrl *) (*(ListHandle)GetControlReference(control))->refCon; else #endif mc = (union macctrl *)GetControlReference(control); fprintf(stderr, "control = %p, part = %d, mc = %p\n", control, part, mc if (mc->generic.type == MACCTRL_LISTBOX && (control == mc->listbox.tbctrl || control == (*mc->listbox.list)->vScroll)) { fprintf(stderr, "list = %p\n", mc->listbox.list); macctrl_setfocus(mcs, mc); if (LClick(mouse, event->modifiers, mc->listbox.list)) /* double-click */ ctrlevent(mcs, mc, EVENT_ACTION); else ctrlevent(mcs, mc, EVENT_SELCHANGELDelRow(0, 0, mc->listbox.switch (ctrl->generic.type) { case CTRL_LISTBOX: if (ctrl->listbox.height == 0) dlg_macpopup_clear(ctrl, dlg); else dlg_maclist_clear(ctrl, dlg); break; }LDelRow(1, index, mc->listbox.switch (ctrl->generic.type) { case CTRL_LISTBOX: if (ctrl->listbox.height == 0) dlg_macpopup_del(ctrl, dlg, index); else dlg_maclist_del(ctrl, dlg, index); break; }#if TARGET_API_MAC_CARBON GetListDataBounds(mc->listbox.list, &bounds); #else bounds = (*mc->listbox.list)->dataBounds; #endif cell.v = bounds.bottom; LAddRow(1, cell.v, mc->listbox.list); LSetCell(text, strlen(text), cell, mc->listbox.switch (ctrl->generic.type) { case CTRL_LISTBOX: if (ctrl->listbox.height == 0) dlg_macpopup_add(ctrl, dlg, text); else dlg_maclist_add(ctrl, dlg, text); break; }Bounds bounds; int indexwithid %s %d\n", text, id); dlg_maclist_add(ctrl, dlg, text); #if TARGET_API_MAC_CARBON GetListDataBounds(mc->listbox.list, &bounds); #else bounds = (*mc->listbox.switch (ctrl->generic.type) { case CTRL_LISTBOX: if (ctrl->listbox.height == 0) dlg_macpopup_addwithid(ctrl, dlg, text, id); else dlg_maclist_addwithid(ctrl, dlg, text, id); break; }switch (ctrl->generic.type) { case CTRL_LISTBOX: if (ctrl->listbox.height == 0) { assert(mc->popup.ids != NULL && mc->popup.nids > index); return mc->popup.ids[index]; } else { assert(mc->listbox.ids != NULL && mc->listbox.nids > index); return mc->listbox.ids[index]; } } = findbyctrl(mcs, ctrl); Cell cell = { 0, 0 }; assert(mc != NULL); switch (ctrl->generic.type) { case CTRL_LISTBOX: if (ctrl->listbox.height == 0) return GetControlValue(mc->popup.tbctrl) - 1; else { if (LGetSelect(TRUE, &cell, mc->listbox.list)) return cell.v; else return -1; } } return -1; } int dlg_listboxCell cell = { 0, 0 }; assert(mc != NULL); switch (ctrl->generic.type) { case CTRL_LISTBOX: if (ctrl->listbox.height == 0) return GetControlValue(mc->popup.tbctrl) - 1 == index; else { cell.v = index; return LGetSelect(FALSE, &cell, mc->listbox.list); } } return FALSE; } void dlg_listbox_select if (mc == NULL) return; switch (ctrl->generic.type) { case CTRL_LISTBOX: if (ctrl->listbox.height == 0) SetControlValue(mc->popup.tbctrl, index + 1); break; } } Revision-number: 3116 Prop-content-length: 212 Content-length: 212 K 8 svn:date V 27 2003-04-13T14:37:07.000000Z K 7 svn:log V 113 Add a list box to the config dialogue to switch between panels. Now I don't have to recompile to change panels! K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a6b89f09d2d8c28a062985501c017d6c Text-delta-base-sha1: e37c11e9596ca13f3d274bf269997c046c78b8b2 Text-content-length: 903 Text-content-md5: 1755bfce217adf5c35718b351f9d4a38 Text-content-sha1: 8a8b663d4b21f4d9b25d8f2feb6fc5d63ad678ee Content-length: 943 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNX)PP-OxK@yGfdrswa/* $Id: macctrls.c,v 1.33 2003/04/13 14:37:07static union control panellist; static void panellist_handler(union control *ctrl, void *dlg, void *data, int event) { struct macctrls *mcs = dlg; if (event == EVENT_SELCHANGE) macctrl_switchtopanel(mcs, dlg_listbox_index(ctrl, dlg) + 1) curstate.pos.h = rect.left + 13; curstate.pos.v = rect.top + 13; curstate.width = 160; panellist.listbox.type = CTRL_LISTBOX; panellist.listbox.handler = &panellist_handler; panellist.listbox.height = 15; panellist.listbox.percentwidth = 100; macctrl_listbox(mcs, window, &curstate, &panellist); curstate.pos.h = rect.left + 13 + 160 + 13; curstate.pos.v = rect.bottom - 33; curstate.width = rect.right - (rect.left + 13 + 160) - (13 * 2) dlg_listbox_add(&panellist, mcs, cb->ctrlsets[i]->pathname Revision-number: 3117 Prop-content-length: 282 Content-length: 282 K 7 svn:log V 183 Enlarge the settings window so as to fill a 640x480 display. This makes enough space to actually fit all of the panels. I'll have to do a version with smaller fonts for 9" screens. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-04-14T21:15:39.000000Z PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5b1eb7708c3a02e30fd1feebc1c7cc65 Text-delta-base-sha1: 070ac712a3afa23bb96e65c99578b5315d440433 Text-content-length: 110 Text-content-md5: ac89e6d4f7b742902ffba190736b124a Text-content-sha1: 1f3fe1599d55fe6ab37640ac10ec17b4fa5679c4 Content-length: 150 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNX M ,0Tph/* $Id: mac_res.r,v 1.39 2003/04/14 21:15:39432, 626data 'CDEF' (CDEF_ListBox Revision-number: 3118 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2003-04-14T21:34:46.000000Z K 7 svn:log V 93 Keyboard events in Mac OS 8 list boxes should generate EVENT_SELCHANGE, not EVENT_VALCHANGE. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1755bfce217adf5c35718b351f9d4a38 Text-delta-base-sha1: 8a8b663d4b21f4d9b25d8f2feb6fc5d63ad678ee Text-content-length: 249 Text-content-md5: 1e8ceffbf269e3a2610042d1eed39924 Text-content-sha1: 6db02b832ece47c699d00ce2aae0288afc014ce8 Content-length: 289 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN \-/f/* $Id: macctrls.c,v 1.34 2003/04/14 21:34:46switch (mc->generic.type) { case MACCTRL_LISTBOX: ctrlevent(mcs, mc, EVENT_SELCHANGE); break; default: ctrlevent(mcs, mc, EVENT_VALCHANGE); break; } Revision-number: 3119 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2003-04-14T22:42:44.000000Z K 7 svn:log V 44 Support for colour selection in the Mac OS. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1e8ceffbf269e3a2610042d1eed39924 Text-delta-base-sha1: 6db02b832ece47c699d00ce2aae0288afc014ce8 Text-content-length: 682 Text-content-md5: 8bb26a2a3030dc6f6c8d7e763a02f8c8 Text-content-sha1: 987868269465dc4639f410b79b861acec96b2e3f Content-length: 722 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN d3-PS;MID/* $Id: macctrls.c,v 1.35 2003/04/14 22:42:44lorPickerPoint where = {-1, -1}; /* Screen with greatest colour depth */ RGBColor incolour; incolour.red = r * 0x0101; incolour.green = g * 0x0101; incolour.blue = b * 0x0101; mcs->gotcolour = GetColor(where, "\pModify Colour:", &incolour, &mcs->thecolour); ctrlevent(mcs, mc, EVENT_CALLBACK); } int dlg_coloursel_results(union control *ctrl, void *dlg, int *r, int *g, int *b) { struct macctrls *mcs = dlg; if (mcs->gotcolour) { *r = mcs->thecolour.red >> 8; *g = mcs->thecolour.green >> 8; *b = mcs->thecolour.blue >> 8; return 1; } else Revision-number: 3120 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2003-04-14T22:55:12.000000Z K 7 svn:log V 83 Don't call GetColor() if we don't have Color Quickdraw -- no good will come of it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8bb26a2a3030dc6f6c8d7e763a02f8c8 Text-delta-base-sha1: 987868269465dc4639f410b79b861acec96b2e3f Text-content-length: 333 Text-content-md5: 17501c928ec22e3211a5e7e0f28543c1 Text-content-sha1: 60efa5f2127359a29f3948fa0c1089966578c0a4 Content-length: 373 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNd0~-Z /* $Id: macctrls.c,v 1.36 2003/04/14 22:55:12f (HAVE_COLOR_QD()) { incolour.red = r * 0x0101; incolour.green = g * 0x0101; incolour.blue = b * 0x0101; mcs->gotcolour = GetColor(where, "\pModify Colour:", &incolour, &mcs->thecolour); ctrlevent(mcs, mc, EVENT_CALLBACK); } else dlg_beep(dlg Revision-number: 3121 Prop-content-length: 274 Content-length: 274 K 8 svn:date V 27 2003-04-14T23:25:04.000000Z K 7 svn:log V 175 Minor fixes: - Erase the background of System 7 editboxes before drawing them. - Set the height of listboxes correctly. - Set the panel-selection listbox to 20 items high. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 17501c928ec22e3211a5e7e0f28543c1 Text-delta-base-sha1: 60efa5f2127359a29f3948fa0c1089966578c0a4 Text-content-length: 132 Text-content-md5: 2e9956f28491723e38c8e40d270aa19c Text-content-sha1: c46b2d7f472d69066e050b43be16611869c39a99 Content-length: 172 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN#]E-:tC(/* $Id: macctrls.c,v 1.37 2003/04/14 23:25:0420EraseRect(&rect);16 * ctrl->listbox.height + 2 Revision-number: 3122 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2003-04-14T23:28:58.000000Z K 7 svn:log V 54 Set the space required by a listbox sensibly as well. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2e9956f28491723e38c8e40d270aa19c Text-delta-base-sha1: c46b2d7f472d69066e050b43be16611869c39a99 Text-content-length: 107 Text-content-md5: 43035a6864f8a1dcdc1be7ae7f6a3f45 Text-content-sha1: c3818619d262b9eaf03e81e8adb87f621859d04d Content-length: 147 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN#'JF-K}LW/* $Id: macctrls.c,v 1.38 2003/04/14 23:28:5816 * ctrl->listbox.height + 2 Revision-number: 3123 Prop-content-length: 132 Content-length: 132 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-04-14T23:47:07.000000Z K 7 svn:log V 34 Remove all those horrid fprintfs. PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 43035a6864f8a1dcdc1be7ae7f6a3f45 Text-delta-base-sha1: c3818619d262b9eaf03e81e8adb87f621859d04d Text-content-length: 246 Text-content-md5: 4b5673b2dfbc1b214424acfe01cad376 Text-content-sha1: 1617670e32bf10f587a0f3112cae72a1402ec0e1 Content-length: 286 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN'2 [-r@~CLe l3+[}fb<x!`k +E$$ ~5nu5tH)N&i4H_/* $Id: macctrls.c,v 1.39 2003/04/14 23:47:07 colstart = COLUMN_START(ctrl->generic.column Revision-number: 3124 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:18.837626Z PROPS-END Revision-number: 3125 Prop-content-length: 424 Content-length: 424 K 8 svn:date V 27 2003-04-16T23:33:44.000000Z K 7 svn:log V 325 Make IPv6 support for Unix work, and make it a lot simpler in the process. At the moment, we have to assume that getaddrinfo() will only return AF_INET and AF_INET6 addresses, since we patch in the port number into the sockaddr later. Fixing this is probably best done by redesigning the PuTTY network abstraction a little. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 248de14eaa54994b34daadc6fffa0018 Text-delta-base-sha1: 96201dc14df3ba05cad1e6340bcb239cf61b799c Text-content-length: 4445 Text-content-md5: e8758f84a1897d9ca3235b410b11b0c3 Text-content-sha1: 9866fd6387a27f812509d75b53fbb91a7fcc5cd6 Content-length: 4485 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNp!|S=HyE4s+ jA]H\$d`< E<i|:C oao+!\K>q:{ITlse unsigned long address; /* Address IPv4#ifdef IPV6 struct addrinfo hints; int err; #else unsigned long a; struct hostent *h = NULL; #endif#ifdef IPV6 hints.ai_flags = AI_CANONNAME; hints.ai_family = AF_UNSPEC; hints.ai_socktype = 0; hints.ai_protocol = 0; hints.ai_addrlen = 0; hints.ai_addr = NULL; hints.ai_canonname = NULL; hints.ai_next = NULL; err = getaddrinfo(host, NULL, NULL, &ret->ai); if (err != 0) { ret->error = gai_strerror(err); return ret; } ret->family = ret->ai->ai_family; *realhost = '\0'; if (ret->ai->ai_canonname != NULL) strncat(realhost, ret->ai->ai_canonname, sizeof(realhost) - 1); else strncat(realhost, host, sizeof(realhost) - 1); #else if ((a = inet_addr(host)) == (unsigned long) INADDR_NONE) { /* * Otherwise use the IPv4-only gethostbyname... (NOTE: * we don't use gethostbyname as a fallback!) */ ret->family = AF_INET; } if (ret->family == 0) { ret->error = (h_errno == HOST_NOT_FOUND || h_errno == NO_DATA || h_errno == NO_ADDRESS ? "Host does not exist" : h_errno == TRY_AGAIN ? "Temporary name service failure" : "gethostbyname: unknown error"); return ret; } memcpy(&a, h->h_addr, sizeof(a)); /* This way we are always sure the h->h_name is valid :) */ strncpy(realhost, h->h_name, sizeof(realhost));#endif if (addr->family == AF_UNSPEC) { strncpy(buf, addr->hostname, buflen); buf[buflen-1] = '\0'; } else { #ifdef IPV6 if (getnameinfo(addr->ai->ai_addr, addr->ai->ai_addrlen, buf, buflen, NULL, 0, NI_NUMERICHOST) != 0) { buf[0] = '\0'; strncat(buf, "", buflen - 1); } #else struct in_addr a; assert(addr->family == AF_INET)#endif if (addr->family == AF_UNSPEC)else { #ifdef IPV6 if (addr->family == AF_INET) return ipv4_is_loopback( ((struct sockaddr_in *)addr->ai->ai_addr)->sin_addr); else if (addr->family == AF_INET6) return IN6_IS_ADDR_LOOPBACK( &((struct sockaddr_in6 *)addr->ai->ai_addr)->sin6_addr); else return 0; #else struct in_addr a; assert(addr->family == AF_INET); a.s_addr = htonl(addr->address); return ipv4_is_loopback(a); #endif #ifdef IPV6 if (addr->family == AF_INET) memcpy(buf, &((struct sockaddr_in *)addr->ai->ai_addr)->sin_addr, sizeof(struct in_addr)); else if (addr->family == AF_INET6) memcpy(buf, &((struct sockaddr_in6 *)addr->ai->ai_addr)->sin6_addr, sizeof(struct in6_addr)); else assert(FALSE); #else struct in_addr a; assert(addr->family == AF_INET); a.s_addr = htonl(addr->address); memcpy(buf, (char*) &a.s_addr, 4); #endif } void sk_addr_free(SockAddr addr) { #ifdef IPV6 if (addr->ai != NULL) freeaddrinfo(addr->ai); #endif/* XXX use getaddrinfo to get a local address? */ a6.sin6_family = AF_INET6; a6.sin6_addr = in6addr_any; a6.sin6_port = htons(localport); retcode = bind(s, (struct sockaddr *) &a6, sizeof(a6)); } else #endif { assert(addr->family == AF_INET); retcode = bind(s, (struct sockaddr *) &a, sizeof(a)); }/* XXX would be better to have got getaddrinfo() to fill in the port. */ if (addr->family == AF_INET) ((struct sockaddr_in *)addr->ai->ai_addr)->sin_port = htons(port); else { assert(addr->family == AF_INET6); ((struct sockaddr_in *)addr->ai->ai_addr)->sin_port = htons(port); } #else a.sin_family = AF_INET; a.sin_addr.s_addr = htonl(addr->address); a.sin_port = htons((short) port); #endif { int i = 1; ioctl(s, FIONBIO, &i); } if (( #ifdef IPV6 connect(s, addr->ai->ai_addr, addr->ai->ai_addrlen#if 0 struct sockaddr_in6 a6; #endif struct addrinfo hints, *ai; char portstr[6]hints.ai_flags = AI_NUMERICHOST; hints.ai_family = AF_UNSPEC; hints.ai_socktype = 0; hints.ai_protocol = 0; hints.ai_addrlen = 0; hints.ai_addr = NULL; hints.ai_canonname = NULL; hints.ai_next = NULL; sprintf(portstr, "%d", port); if (srcaddr != NULL && getaddrinfo(srcaddr, portstr, &hints, &ai) == 0) retcode = bind(s, ai->ai_addr, ai->ai_addrlen); else #if 0 { /* * FIXME: Need two listening sockets, in principle, one for v4 * and one for v6 retcode = bind(s, (struct sockaddr *) &a, sizeof(a)); } Revision-number: 3126 Prop-content-length: 265 Content-length: 265 K 8 svn:date V 27 2003-04-16T23:58:59.000000Z K 7 svn:log V 166 Replace use of FIONBIO with POSIX-approved O_NONBLOCK (set using fcntl()). This should save us having to worry about different OSs' defining it in different headers. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e8758f84a1897d9ca3235b410b11b0c3 Text-delta-base-sha1: 9866fd6387a27f812509d75b53fbb91a7fcc5cd6 Text-content-length: 128 Text-content-md5: dafdb0ae2ba542c8bc2d7d32302bc1db Text-content-sha1: 902371717022d46986aca3d643b4aed3ec17dacb Content-length: 168 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN!Q]!NmSr/ int fl fl = fcntl(s, F_GETFL); if (fl != -1) fcntl(s, F_SETFL, fl | O_NONBLOCK); Revision-number: 3127 Prop-content-length: 279 Content-length: 279 K 8 svn:date V 27 2003-04-18T09:00:16.000000Z K 7 svn:log V 178 Fix obvious foulup in X forwarding: my recent `how did this ever work' change to port forwarding completely broke it, by failing to set peeraddr{,len} before reading them. Oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e313c9b43a419eeb363955059e3575d5 Text-delta-base-sha1: e656b52f13041a44e5d459b047de3180b0d1ae6f Text-content-length: 127 Text-content-md5: fb0558312d46f9009cf1e138cbc681ee Text-content-sha1: 2254c5304c7d3bda8a10a8c4caf1dc5b74225d44 Content-length: 168 K 15 cvs2svn:cvs-rev V 5 1.286 PROPS-END SVN$OlO e]7; ssh2_pkt_getstring(ssh, &peeraddr, &peeraddrlen); Revision-number: 3128 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2003-04-18T09:00:37.000000Z K 7 svn:log V 114 Missed out a couple of uxsel_tell() which were hanging forwarded X connections in at least some situations. Oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dafdb0ae2ba542c8bc2d7d32302bc1db Text-delta-base-sha1: 902371717022d46986aca3d643b4aed3ec17dacb Text-content-length: 309 Text-content-md5: 74cdf3e1e60a88cac54813d9289a2865 Text-content-sha1: 5d0b0bf7593c1dc9f9d26039062f9df5c6e5aca8 Content-length: 349 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNQuk_r/* * Update the select() status to correctly reflect whether or * not we should be selecting for write. */ uxsel_tell/* * Update the select() status to correctly reflect whether or * not we should be selecting for write. */ uxsel_tell Revision-number: 3129 Prop-content-length: 253 Content-length: 253 K 8 svn:date V 27 2003-04-18T09:06:11.000000Z K 7 svn:log V 152 Oops; we _do_ need to set dport even when doing dynamic forwarding, because otherwise the `if (sport && dport)' statement runs the risk of not working. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fb0558312d46f9009cf1e138cbc681ee Text-delta-base-sha1: 2254c5304c7d3bda8a10a8c4caf1dc5b74225d44 Text-content-length: 86 Text-content-md5: 8f138695e4ac5ed10fe106cb21509996 Text-content-sha1: 3c316ebbffdd97c671aa7df0796d77f9616654c5 Content-length: 127 K 15 cvs2svn:cvs-rev V 5 1.287 PROPS-END SVN a^ dport = -1$@ *p; p++ dport = -1 Revision-number: 3130 Prop-content-length: 462 Content-length: 462 K 7 svn:log V 361 Removing items from a list box using gtk_container_remove is nasty, because when the selected item is removed the selection moves on to another item. Thus, calling dlg_listbox_clear causes repeated selchanges in the list, which in turn cause repeated valchanges if the list is attached to a combo box. This has been completely scuppering the Translation panel. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-18T09:14:54.000000Z PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e1f808e814a518c1332423078e59f4a3 Text-delta-base-sha1: 8d7836fbc31f37d810028bf4766e8627fdf8352c Text-content-length: 238 Text-content-md5: 725829123b101bd06f30e9b75117365e Text-content-sha1: ada187eb11752830202f46f7c37d1a117863bb58 Content-length: 278 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNkN){Ngif (uc->menu) { gtk_container_foreach(GTK_CONTAINER(uc->menu), container_remove_and_destroy, GTK_CONTAINER(uc->menu)); } else { gtk_list_clear_items(GTK_LIST(uc->list), 0, -1); } Revision-number: 3131 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2003-04-18T13:09:08.000000Z K 7 svn:log V 43 Missing bits for System 7 listbox support. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3578e83314b9c742f891c81391898f2e Text-delta-base-sha1: 4d40529ba73861e35065a78cd19cdba27ff00f55 Text-content-length: 134 Text-content-md5: 56a86f2a534243202a323d3b3eeaae28 Text-content-sha1: 5af6e6937e86c5cdd48440253e4b73b51fa0ec81 Content-length: 174 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNc*t6-G/* $Id: macresid.h,v 1.16 2003/04/18 13:09:08#define CDEF_ListBox 131 #define SYS7_LISTBOX_PROC (CDEF_ListBox << 4) Revision-number: 3132 Prop-content-length: 141 Content-length: 141 K 7 svn:log V 43 Missing bits for colour selection support. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-04-18T13:09:46.000000Z PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d8cc4e94cbbce6830b80b155ffccc9a5 Text-delta-base-sha1: 2650bd84cda663266ffd189961e86d58d60405fd Text-content-length: 69 Text-content-md5: 1b43c17e1561a0dfbc7153e8058e6b50 Text-content-sha1: 0b5d439dd430c020bdde37ce1f3b55d9970f2921 Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNAr 0; Boolean gotcolour; RGBColor thecolour; Revision-number: 3133 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:19.818961Z PROPS-END Revision-number: 3134 Prop-content-length: 293 Content-length: 293 K 7 svn:log V 192 Unix makefile now uses -O2, which massively cuts down key exchange time. This gives rise to a whole bunch of spare warnings, one or two of which might have been actual bugs; now all resolved. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-23T13:48:09.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 35ce8e442b6d11fd2013fd049f956ded Text-delta-base-sha1: 965ece7914aa9b789a84a41685eb6ece72f79075 Text-content-length: 25 Text-content-md5: ea14eaedf0fe6b9e774632e1b0dfbc38 Text-content-sha1: cf1e83344239b8ed96f782fa4d4a338052ca5612 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVNrv mO2 Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fb0328900f3853bf530db224e4121cc2 Text-delta-base-sha1: 1f4a6ad63f5f5a7b28d7139bd57be98f6cfaeb1e Text-content-length: 96 Text-content-md5: cf6cd4afdacc4bfa0a9b2f3514367798 Text-content-sha1: 824904bf234165666c1e2ee31eb8ba35412725db Content-length: 136 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNd GOGNO else hostip_len = 0; /* placate gcc; shouldn't be required */ Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8f138695e4ac5ed10fe106cb21509996 Text-delta-base-sha1: 3c316ebbffdd97c671aa7df0796d77f9616654c5 Text-content-length: 688 Text-content-md5: 95b55377f868c88b475fb9e82ffd1aa2 Text-content-sha1: d4aa40388fbb0a6da513b7437f78512b9664f9f9 Content-length: 729 K 15 cvs2svn:cvs-rev V 5 1.288 PROPS-END SVN4C:Ii SxiQ@\OrGd\dFt0g*uC#[agkPX<.1g`/&i/bStopStopStopStopStopStopStopStopStopStopStopStopStopStopStopStopStopStopStopdservStopStopStopStop *p; p++; } *h = 0; port =@P Y&R{ MU<(=5k&`F,HJ ?'l^"{b@o=5>xV3"PB_s}pip!_ ) crStopV = 0StopV;StopStopStopStopStopStopStopStopStopStopStopStopStopStopStopStopdservStopStopStopStopStop = 0 crStopVStopStopStop Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0a50ee12dd686bc344b451badc4c7b68 Text-delta-base-sha1: 6242668d57e5df62d62193008a51b1fec79fa4d4 Text-content-length: 111 Text-content-md5: ef85f1b2988e05ca20bfdd1da94030f0 Text-content-sha1: 5fafc2eec741c7d4547b9b2fc9b35f8fdbedc134 Content-length: 152 K 15 cvs2svn:cvs-rev V 5 1.155 PROPS-END SVNev?PBTxkey=0; break; /* else gcc warns `enum value not used'code = 0; Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 725829123b101bd06f30e9b75117365e Text-delta-base-sha1: ada187eb11752830202f46f7c37d1a117863bb58 Text-content-length: 92 Text-content-md5: b0ef05a513cb0da642d40ca160272a52 Text-content-sha1: 16accf4c9eb0581cb122e34c3c7f156a698b5f9d Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNY ChC.g else activeitem = NULL; /* unnecessarily placate gcc */ Node-path: putty/unix/gtkpanel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 39a2ce458f835a067476ca91062abfbc Text-delta-base-sha1: 2ba1317abaad17df960ed859881549ba3342b1d7 Text-content-length: 79 Text-content-md5: f1187b4b02c0cd852d101e181e0850e5 Text-content-sha1: f70a551e0b8e0fd4396021a747ba6993f1eb6337 Content-length: 118 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN_n :J = NULL; GList *children; gboolean changed = FALSE Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 888ac59e49dd41e07114b0d58528ff69 Text-delta-base-sha1: e623015b6c1c844c5f23e501e31a7418832f7118 Text-content-length: 63 Text-content-md5: 40d74e5435abc428ca001e7075ec232d Text-content-sha1: be359e2764709a12b89e5e240d99d8815594c13f Content-length: 104 K 15 cvs2svn:cvs-rev V 5 1.123 PROPS-END SVN>_B]@XOo special = FALSEretret Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 393bbc26d9ebdcacf6dcd1780a2707d8 Text-delta-base-sha1: 7eb225a40b3d26dcee0bf1913765c6acd48f60ab Text-content-length: 44 Text-content-md5: 81d5ba49c64e5b95a61199688e3b67ce Text-content-sha1: 32e0ff7692c78234de759ab3db52572ec7aaec95 Content-length: 83 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNlyBd@A+ int proto = -1 Revision-number: 3135 Prop-content-length: 613 Content-length: 613 K 7 svn:log V 512 Added framework to sshbn.c to make it possible to vary the underlying integer type forming the Bignum. Using this, arranged that gcc/x86 uses 32-bit chunks rather than the guaranteed ANSI- portable 16-bit chunks. This has gained another 30% on key exchanges by my measurements, but I'm not yet convinced that it's all perfectly robust - it seems to work fine for SSH1 and SSH2/RSA but I haven't ensured that every bignum routine is actually being tested, so it may yet show up problems in DSA or key generation. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-23T14:48:57.000000Z PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0b385bc0bb05e7a3b03eb8ad02761cab Text-delta-base-sha1: d75cf80d097e2819d62ac6c91d55ebd9bc0d8d26 Text-content-length: 78 Text-content-md5: c83bc694615a25ca50f6f15b2bdde818 Text-content-sha1: 29cb3353fba046d5ed67678dfff1f623457f7e6c Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN7r 9NkL#ifdef DEBUG void diagbn(char *prefix, Bignum md); #endif Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4e8f121db30a317906ef051f86dd8a43 Text-delta-base-sha1: 2ecb523653cefa1e56cbe0fec348bfb7f77fa8ff Text-content-length: 5284 Text-content-md5: 0965343dbc0d7c7cf07fe9f1a7d18553 Text-content-sha1: 088dd8da94f26a3f0609583e1ac9ca24170bbb22 Content-length: 5324 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNY&oQKN^3S5WYsBDic$QHs/{jlY)dIpCm"R&g0G`U9]>[HVppCm")t?*Cv#FNk;4`pCm"TBZ#96:v C2xwPzU4#<lCct,- 9SBFSk3"9Mjo f8<9{U]"gkh7if defined __GNUC__ && defined __i386__ typedef unsigned long BignumInt; typedef unsigned long long BignumDblInt; #define BIGNUM_INT_MASK 0xFFFFFFFFUL #define BIGNUM_TOP_BIT 0x80000000UL #define BIGNUM_INT_BITS 32 #define MUL_WORD(w1, w2) ((BignumDblInt)w1 * w2) #else typedef unsigned short BignumInt; typedef unsigned long BignumDblInt; #define BIGNUM_INT_MASK 0xFFFFU #define BIGNUM_TOP_BIT 0x8000U #define BIGNUM_INT_BITS 16 #define MUL_WORD(w1, w2) ((BignumDblInt)w1 * w2) #endif #define BIGNUM_INT_BYTES (BIGNUM_INT_BITS / 8) #define BIGNUM_INTERNAL typedef BignumInt *Bignum; #include "ssh.h" BignumInt bnZero[1] = { 0 }; BignumInt bnOne[2] = { 1, 1 }; /* * The Bignum format is an array of `BignumInBIGNUM_INT_BITSBignumInBignumInBIGNUM_INT_BITSBignumInt *a, BignumInt *b, BignumInt *c, int len) { int i, j; BignumDblIntt = 0; for (j = len - 1; j >= 0; j--) { t += MUL_WORD(a[i], (BignumDblInt) b[j]); t += (BignumDblInt) c[i + j + 1]; c[i + j + 1] = (BignumInt) t; t = t >> BIGNUM_INT_BITS; } c[i] = (BignumInt) t; } } static void internal_add_shifted(BignumInt *number, unsigned n, int shift) { int word = 1 + (shift / BIGNUM_INT_BITS); int bshift = shift % BIGNUM_INT_BITS; BignumDblInt addend; addend = n << bshift; while (addend) { addend += number[word]; number[word] = (BignumInt) addend & BIGNUM_INT_MASK; addend >>= BIGNUM_INT_BITSBignumInt *a, int alen, BignumInt *m, int mlen, BignumInt *quot, int qshift) { BignumInBignumDblIntBignumDblInt) h << BIGNUM_INT_BITSBignumDblInt) m1 * (BignumDblInt) q; if (t > ((BignumDblInt) r << BIGNUM_INT_BITS) + ai1) { q--; t -= m1; r = (r + m0) & BIGNUM_INT_MASK; /* overflow? */ if (r >= (BignumDblInt) m0 && t > ((BignumDblInt) r << BIGNUM_INT_BITSBignumDblInt) q * (BignumDblInt) m[k]; t += c; c = t >> BIGNUM_INT_BITS; if ((BignumInt) t > a[i + k]) c++; a[i + k] -= (BignumInBignumInt) t; t = t >> BIGNUM_INT_BITS; } q--; } if (quot) internal_add_shifted(quot, q, qshift + BIGNUM_INT_BITSBignumInBignumInBIGNUM_INT_BITS-1; mshift++) if ((m[0] << mshift) & BIGNUM_TOP_BITBIGNUM_INT_BITSBignumInBignumInt); b = snewn(2 * mlen, BignumInBIGNUM_INT_BITS-1BIGNUM_INT_BITS-1BignumInt *t; t = a; a = b; b = t; } j--; } i++; j = BIGNUM_INT_BITS-1; }mlen - 1; i < 2 * mlen - 1; i++) a[i] = (a[i] << mshift) | (a[i + 1] >> (BIGNUM_INT_BITSBIGNUM_INT_BITSBignumInBignumInBIGNUM_INT_BITS-1; mshift++) if ((m[0] << mshift) & BIGNUM_TOP_BITBIGNUM_INT_BITSBignumInBignumInBignumInBIGNUM_INT_BITSBIGNUM_INT_BITSBignumInBignumInBIGNUM_INT_BITS-1; mshift++) if ((m[0] << mshift) & BIGNUM_TOP_BITBIGNUM_INT_BITSBignumInBIGNUM_INT_BITSBIGNUM_INT_BITSBIGNUM_INT_MASKBIGNUM_INT_BYTES - 1) / BIGNUM_INT_BYTES; /* bytes->result[1 + i / BIGNUM_INT_BYTES] |= byte << (8*i % BIGNUM_INT_BITS)BIGNUM_INT_BITS - 1; while (bitcount >= 0 && (bn[bitcount / BIGNUM_INT_BITS + 1] >> (bitcount % BIGNUM_INT_BITSBIGNUM_INT_BYTES * bn[0]) return 0; /* beyond the end */ else return (bn[i / BIGNUM_INT_BYTES + 1] >> ((i % BIGNUM_INT_BYTES)*8)BIGNUM_INT_BITS * bn[0]) return 0; /* beyond the end */ else return (bn[i / BIGNUM_INT_BITS + 1] >> (i % BIGNUM_INT_BITSBIGNUM_INT_BITS * bn[0]) abort(); /* beyond the end */ else { int v = bitnum / BIGNUM_INT_BITS + 1; int mask = 1 << (bitnum % BIGNUM_INT_BITSBignumInt aval = (i > amax ? 0 : a[i]); BignumInBignumInt ai, ai1; bits = bignum_bitcount(a) - shift; ret = newbn((bits + BIGNUM_INT_BITS - 1) / BIGNUM_INT_BITS); if (ret) { shiftw = shift / BIGNUM_INT_BITS; shiftb = shift % BIGNUM_INT_BITS; shiftbb = BIGNUM_INT_BITSBIGNUM_INT_MASKBignumInBignumInBignumDblIntBignumInt) carry & BIGNUM_INT_MASK; carry >>= BIGNUM_INT_BITSBignumInBIGNUM_INT_MASK; return ret; } /* * Convert a (max 32-bit) long into a bignum. */ Bignum bignum_from_long(unsigned long nn) { Bignum ret; BignumDblInt n = nn; ret = newbn(3); ret[1] = (BignumInt)(n & BIGNUM_INT_MASK); ret[2] = (BignumInt)((n >> BIGNUM_INT_BITS) & BIGNUM_INT_MASKx) { Bignum ret = newbn(number[0] + 1); int i, maxspot = 0; BignumDblInt carry = 0, addend = addendx; for (i = 1; i <= ret[0]; i++) { carry += addend & BIGNUM_INT_MASK; carry += (i <= number[0] ? number[i] : 0); addend >>= BIGNUM_INT_BITS; ret[i] = (BignumInt) carry & BIGNUM_INT_MASK; carry >>= BIGNUM_INT_BITSBignumDblIntdef DEBUG void diagbn(char *prefix, Bignum md) {BignumInt carry = 0; int maxspot = 1; int i; for (i = 1; i <= newx[0]; i++) { BignumInt aword = (i <= modulus[0] ? modulus[i] : 0); BignumInBignumDblInt carry; char *ret; BignumInBignumInBIGNUM_INT_BITS) + workspace[i]; workspace[i] = (BignumIn Revision-number: 3136 Prop-content-length: 363 Content-length: 363 K 7 svn:log V 262 Force gcc to use x86's built-in 64/32->32,32 division instruction rather than swanning off to a helper function. This seems to make woefully little actual performance difference, which annoys me, but it's a just-about-detectable improvement so I'll leave it in. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-23T15:25:45.000000Z PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0965343dbc0d7c7cf07fe9f1a7d18553 Text-delta-base-sha1: 088dd8da94f26a3f0609583e1ac9ca24170bbb22 Text-content-length: 392 Text-content-md5: 185614f8c81ba7e6ebbe8b70b4a561ac Text-content-sha1: a5cb34d4f896de689d914f83b1df6ef0e30e3c00 Content-length: 432 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNY %U{^AiPtAh Odefine DIVMOD_WORD(q, r, hi, lo, w) \ __asm__("div %2" : \ "=d" (r), "=a" (q) : \ "r" (w), "d" (hi), "a" (lo)define DIVMOD_WORD(q, r, hi, lo, w) do { \ BignumDblInt n = (((BignumDblInt)hi) << BIGNUM_INT_BITS) | lo; \ q = n / w; \ r = n % w; \ } while (0DIVMOD_WORD(q, r, h, a[i], m0)MUL_WORD(m1, q)MUL_WORD(q, m[k]) Revision-number: 3137 Prop-content-length: 297 Content-length: 297 K 8 svn:date V 27 2003-04-25T11:48:24.000000Z K 7 svn:log V 196 Robustness in the face of sudden connection closures: we now make a credible effort to shut down open forwardings cleanly when the owning SSH connection terminates abruptly (for whatever reason). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 95b55377f868c88b475fb9e82ffd1aa2 Text-delta-base-sha1: d4aa40388fbb0a6da513b7437f78512b9664f9f9 Text-content-length: 1630 Text-content-md5: e699d61db3ec63c17fc86f4a8e149269 Text-content-sha1: 8dd669a4aad4cce826f01024d1075e811c67cba5 Content-length: 1671 K 15 cvs2svn:cvs-rev V 5 1.289 PROPS-END SVNYc)A&|HCq6hc[9"D|CZSXWxUstatic void ssh_do_close(Ssh ssh ssh_do_close(ssh);void ssh_do_close(Ssh ssh) { int i; struct ssh_channel *c; /* * Now we must shut down any port and X forwardings going * through this connection. */X11: x11_close(c->u.x11.s); break; case CHAN_SOCKDATA: pfd_close(c->u.pfd.s); break; } del234(ssh->channels, c); if (ssh->version == 2) bufchain_clear(&c->v.v2.outbuffer); sfree(c); }_do_close(ssh);ssh_do_close(ssh);pfdssh->state != SSH_STATE_SESSION) { assert(ssh->state == SSH_STATE_CLOSED); return; }state != SSH_STATE_SESSION) { assert(ssh->state == SSH_STATE_CLOSED); return 0; }state != SSH_STATE_SESSION) { assert(ssh->state == SSH_STATE_CLOSED); return; }yjLu.a.lensofar = 0; add234(ssh->channels, c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION, PKT_INT, c->remoteid, PKT_INT, c->localid, PKT_END); } } else if (ssh->pktin.type == SSH1_MSG_PORT_OPEN) { /* Remote side is trying to open a channel to talk to a * forwarded port. Give them back a local channel number. */ struct ssh_channel *c; struct ssh_rportfwd pf; int hostsize, port; char host[256], buf[1024]; char *p, *h, *e; c = snew(struct ssh_channel); c->ssh = ssh; hostsize = GET_32BIT(ssh->pktin.body+4); for (h = host, p = (char *)(ssh->pktin.body+8); hostsize != 0; hostsize--) { if (h+1 < host+sizeof(host)) *h++ = *p; p++; } *h = 0; port =sh_do_close(ssh Revision-number: 3138 Prop-content-length: 143 Content-length: 143 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-04-25T13:46:19.000000Z K 7 svn:log V 45 Mention Certified Security Solutions' patch. PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f20d4a81bc10974fd16c46690b4fbcf3 Text-delta-base-sha1: 773c75f0c0c24f4bb2aef125ae371e73a8240694 Text-content-length: 314 Text-content-md5: 80c58ca58bf4809bb79a0143a073caa0 Text-content-sha1: 3b1f0602e99e0016fc68431564551e2f452a4da9 Content-length: 353 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN>e'>'

    Certified Security Solutions have a patched version of PuTTY 0.52 which supports Kerberos and GSSAPI, but its licence makes it unsuitable for use in PuTTY itself. Revision-number: 3139 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2003-04-25T15:44:01.000000Z K 7 svn:log V 113 Don't block SIGPIPE until _after_ pterm forks, since otherwise the blockage will propagate to the child process. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 40d74e5435abc428ca001e7075ec232d Text-delta-base-sha1: be359e2764709a12b89e5e240d99d8815594c13f Text-content-length: 392 Text-content-md5: c58bec06d738f8d94edd8ab02ee785e3 Text-content-sha1: 896c96637ff85b0d36e4e767eb7d221b7034a1ef Content-length: 433 K 15 cvs2svn:cvs-rev V 5 1.124 PROPS-END SVN_Qgm=jg@/* * Block SIGPIPE: if we attempt Duplicate Session or similar * and it falls over in some way, we certainly don't want * SIGPIPE terminating the main pterm/PuTTY. Note that we do * this _after_ (at least pterm) forks off its child process, * since the child wants SIGPIPE handled in the usual way. */ block_signal(SIGPIPE, 1 Revision-number: 3140 Prop-content-length: 298 Content-length: 298 K 8 svn:date V 27 2003-04-25T16:42:36.000000Z K 7 svn:log V 197 Fix another segfault on abrupt X connection shutdown. This should have happened in rev 1.5 [r996] but didn't! Now we never call sk_get_private_ptr() on a socket unless we've ensured it's non-NULL. K 10 svn:author V 5 simon PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 999f8e4f3c62e5caa018b4d51b622f48 Text-delta-base-sha1: fd12ffcf5d6d96dce4ed027a04895670ba4b428f Text-content-length: 99 Text-content-md5: c775f9c88db3c351c6410bfd8474a67d Text-content-sha1: 06b58a9ff16cb70f7dc838820c0dadd39ff2b997 Content-length: 139 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNxx MOM\; if (!s) return 0; pr = (struct X11Private *) sk_get_private_ptr(s) Revision-number: 3141 Prop-content-length: 231 Content-length: 231 K 7 svn:log V 130 The new ssh_do_close() function itself causes a segfault if the connection goes foom before ssh->channels is set up. Oops. Fixed. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-25T17:44:09.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e699d61db3ec63c17fc86f4a8e149269 Text-delta-base-sha1: 8dd669a4aad4cce826f01024d1075e811c67cba5 Text-content-length: 429 Text-content-md5: 49d95b3fe988af3577222fe9a914f664 Text-content-sha1: e1154a6127a60583c8c58112148caf493fbb5133 Content-length: 470 K 15 cvs2svn:cvs-rev V 5 1.290 PROPS-END SVNY:Ymmif (ssh->channels) { for (i = 0; NULL != (c = index234(ssh->channels, i)); i++) { switch (c->type) { case CHAN_X11: x11_close(c->u.x11.s); break; case CHAN_SOCKDATA: pfd_close(c->u.pfd.s); break; } del234(ssh->channels, c); if (ssh->version == 2) bufchain_clear(&c->v.v2.outbuffer); sfree(c); }'&HAN_AGENT; /* identify channel type */ Revision-number: 3142 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2003-04-26T12:09:52.000000Z K 7 svn:log V 78 MUD-client-like features (e.g., separate text box for input). Priority: never K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/mud-client Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 763 Text-content-md5: ee999305a32ed15f6609e2be4c123ec3 Text-content-sha1: f178b633950e5a3b5a5d0278574a12bb49238a68 Content-length: 879 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNmmmSummary: MUD-client-like features Class: wish Difficulty: tricky Priority: never Content-type: text/x-html-body

    We occasionally get asked for clients useful for accessing MUDs - most frequently, a separate text box for input below the main output window, but also things like command history, triggers and so on.

    We've no plans to turn PuTTY into a MUD client. You'd be better off with specialist MUD client software (perhaps something like TinyFugue on a server which you then use PuTTY to access).

    Someone has taken bits of PuTTY and bits of other things to create a thing called PowTTY. We know nothing about it, but it may be relevant. Revision-number: 3143 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2003-04-26T13:22:25.000000Z K 7 svn:log V 136 The line-drawing paste config option has changed its meaning since it was first designed. Alter the wording and documentation to match. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2063526040d912c000bdc0723ad5bdaf Text-delta-base-sha1: 8c0bacf82f194260cb033cd53ca7a1aeb1108f41 Text-content-length: 65 Text-content-md5: fff439a02fe46918e6c0b5a2c05539e9 Text-content-sha1: 2e942f224def897adad5db141ee05d063b5e7a10 Content-length: 105 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNJ? '.j`Paste VT100 line drawing chars as lqqqk Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ce8cc3b9c747eba0e827b7db98ea00eb Text-delta-base-sha1: fa2f3318687526e3e0a8c650c0f798932476713c Text-content-length: 839 Text-content-md5: 3ca7351bc11d5123b78398fc0a11f9e3 Text-content-sha1: 4ce1356f24f08d96d5e8e45953a6fb3f57bb2fe0 Content-length: 879 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVN0O)5t\versionid $Id: config.but,v 1.63 2003/04/26 13:22:25paste them in the form they appear on the screen: either Unicode line drawing code points, or the \q{poor man's} line-drawing characters \c{+}, \c{-} and \c{|}. The checkbox \q{Paste VT100 line drawing chars as lqqqk} disables this feature, so line-drawing characters will be pasted as the ASCII characters that were printed to produce them. This will typically mean they come out mostly as \c{q} and \c{x}, with a scattering of \c{jklmntuvw} at the corners. This might be useful if you were trying to recreate the same box layout in another program, for example. Note that this option only applies to line-drawing characters which \e{were} printed by using the VT100 mechanism. Line-drawing characters displayed using Unicode will paste as Unicode always Revision-number: 3144 Prop-content-length: 374 Content-length: 374 K 8 svn:date V 27 2003-04-26T13:55:47.000000Z K 7 svn:log V 273 Aha, _that's_ why the icon title didn't work properly in pterm: gtk_window_set_title() overwrote both titles at once. Icon title is now working properly under X, and since X was the reason for the whole icon/window title separation _anyway_ they default to being separate. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c58bec06d738f8d94edd8ab02ee785e3 Text-delta-base-sha1: 896c96637ff85b0d36e4e767eb7d221b7034a1ef Text-content-length: 740 Text-content-md5: 7cb39a4c46ec1264262e6f176a13c985 Text-content-sha1: ede430a1b6b8c7176fab27c624da15625e73763f Content-length: 781 K 15 cvs2svn:cvs-rev V 5 1.125 PROPS-END SVNQe9Eic=^c7NXp#ftL-$if (!strcmp(name, "WinNameAlways")) return 0; /* X natively supports icon titles, so use 'em by defaultstatic void set_window_titles(struct gui_data *inst) { /* * We must always call set_icon_name after calling set_title, * since set_title will write both names. Irritating, but such * is life. */ gtk_window_set_title(GTK_WINDOW(inst->window), inst->wintitle); if (!inst->cfg.win_name_always) gdk_window_set_icon_name(inst->window->window, inst->icontitle);set_window_titles(instset_window_titles(inst set_window_titles(inst { set_title(inst, inst->cfg.wintitle); set_icon(inst, inst->cfg.wintitle); }et_icon Revision-number: 3145 Prop-content-length: 415 Content-length: 415 K 8 svn:date V 27 2003-04-26T14:22:42.000000Z K 7 svn:log V 314 Make the `vtmode' config option work under X. In the process I've had to move another of its values out into wincfg.c - paradoxically, this was the `font has X encoding' option! (Because the Unix font handling code expects to be able to tell for _itself_ whether it has a font with X-encoded line drawing glyphs.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fff439a02fe46918e6c0b5a2c05539e9 Text-delta-base-sha1: 2e942f224def897adad5db141ee05d063b5e7a10 Text-content-length: 85 Text-content-md5: d545c365517c44813919f8c53aa4dd56 Text-content-sha1: 00e70b6d137370244073753263e403fbe0878e32 Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN?"6M=.Use Unicode line drawing code points",'u',I(VT_UNICODE Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7cb39a4c46ec1264262e6f176a13c985 Text-delta-base-sha1: ede430a1b6b8c7176fab27c624da15625e73763f Text-content-length: 96 Text-content-md5: c7a08d9be64775c4adb281a075122c2d Text-content-sha1: b10061e85ac6962ab105737615df85cdf2d9e1ec Content-length: 137 K 15 cvs2svn:cvs-rev V 5 1.126 PROPS-END SVNe$?U, inst->cfg.vtmode || oldcfg.vtmode != cfg2.vtmode Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 08165f4060e7b87b02cb9b053176365c Text-delta-base-sha1: 59911c529a4cad19678b8fb90974f21c880f03e9 Text-content-length: 33 Text-content-md5: 711e9a9eadfb971b6e7f27d2aa8670cd Text-content-sha1: dc149ff5775ec596417cb4123db1cac91e196f75 Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN~ ||, int vtmode Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f77f3c01a0d96d04f6bbe38f117fcdd7 Text-delta-base-sha1: 6eacb006686fc59950585de0addde12e85800b18 Text-content-length: 20 Text-content-md5: ab2e0d4574cea7db091e4143b4127f30 Text-content-sha1: 75a1efda25740a2887a9bdc55ea3371c1f04c72a Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNe >'w Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eafa387b8607547d9736cdbf1beb773c Text-delta-base-sha1: c8152ed833f82990994159cd9994406e3d5c2da8 Text-content-length: 314 Text-content-md5: d1cba89305f4888a2de422da9f4f1fa7 Text-content-sha1: f1ef3632135ee1ed5889ee598fbb2c294aae27fc Content-length: 354 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNf7<<P, int vtmodestatic const wchar_t unitab_xterm_poorman[32] = L"*#****o~**+++++-----++++|****L. "; const wchar_t *ptr; if (vtmode == VT_POORMAN) ptr = unitab_xterm_poorman; else ptr = unitab_xterm_std; if (i >= 0x5F && i < 0x7F) ucsdata->unitab_xterm[i] = ptr Node-path: putty/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ce115ec7eeb416dd66fe3b122f69d333 Text-delta-base-sha1: 732fd1ec0f2b09a8585a4f39b0a53f71fe6f82d4 Text-content-length: 112 Text-content-md5: 65ae79afaec93437d420e47d9d2953a2 Text-content-sha1: 50ed637b2bcc210c87e803a6eb0c906289ede97d Content-length: 151 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN+oJ_x`80D=RY33] = dupstr("Font has XWindows encoding"3] = I(VT_XWINDOWS3] = 'x'; Revision-number: 3146 Prop-content-length: 333 Content-length: 333 K 8 svn:date V 27 2003-04-26T14:35:34.000000Z K 7 svn:log V 232 Finer granularity of config box handling. SSH packet logging should now not show up when it's meaningless (in PuTTYtel, in pterm, and in the middle of any non-SSH session), and the Connection panel is inhibited completely in pterm. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d545c365517c44813919f8c53aa4dd56 Text-delta-base-sha1: 00e70b6d137370244073753263e403fbe0878e32 Text-content-length: 1998 Text-content-md5: 80e8faeed14548e6dac20bb5934f23ce Text-content-sha1: 9b97224294cf0ae24d19eb217fb78369692d10f0 Content-length: 2038 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN"!!Vg-2J=/* * The logging buttons change depending on whether SSH packet * logging can sensibly be available. */ { char *sshlogname; if ((midsession && protocol == PROT_SSH) || (!midsession && backends[3].name != NULL)) sshlogname = "Log SSH packet data"; else sshlogname = NULL; /* this will disable the button */ ctrl_radiobuttons(s, "Session logging:", NO_SHORTCUT, 1, HELPCTX(logging_main), dlg_stdradiobutton_handler, I(offsetof(Config, logtype)), "Logging turned off completely", 't', I(LGTYP_NONE), "Log printable output only", 'p', I(LGTYP_ASCII), "Log all session output", 'l', I(LGTYP_DEBUG), sshlogname, 's', I(LGTYP_PACKETS), NULL); } This doesn't show up if we're in a * non-network utility such as pterm. We tell this by being * passed a protocol < 0. */ if (protocol >= 0) { ctrl_settitle(b, "Connection", "Options controlling the connection"); if (!midsession) { s = ctrl_getset(b, "Connection", "data", "Data to send to the server"); ctrl_editbox(s, "Terminal-type string", 't', 50, HELPCTX(connection_termtype), dlg_stdeditbox_handler, I(offsetof(Config,termtype)), I(sizeof(((Config *)0)->termtype))); ctrl_editbox(s, "Auto-login username", 'u', 50, HELPCTX(connection_username), dlg_stdeditbox_handler, I(offsetof(Config,username)), I(sizeof(((Config *)0)->username))); } s = ctrl_getset(b, "Connection", "keepalive", "Sending of null packets to keep session active"); HELPCTX(connection_keepalive), dlg_stdeditbox_handler, I(offsetof(Config,ping_interval)), I(-1)); if (!midsession) { s = ctrl_getset(b, "Connection", "tcp", "Low-level TCP connection options"); ctrl_checkbox(s, "Disable Nagle's algorithm (TCP_NODELAY option)", 'n', HELPCTX(connection_nodelay), dlg_stdcheckbox_handler, I(offsetof(Config,tcp_nodelay))); } Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b0ef05a513cb0da642d40ca160272a52 Text-delta-base-sha1: 16accf4c9eb0581cb122e34c3c7f156a698b5f9d Text-content-length: 39 Text-content-md5: 165f4235b1a383ab08bcbf900079d134 Text-content-sha1: 16632b0e110c5a0ae9bf43a032bd37aeb9a05260 Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNYe ?cfg->protocol Node-path: putty/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c1c94c303884aa2caa1a54e4e8af5f9f Text-delta-base-sha1: 7c94beacee0f22ac28089ca1b2bce371a39e4c37 Text-content-length: 314 Text-content-md5: 235d317cd68d726846eac3331036735e Text-content-sha1: 97baff2be0ac9e81849d88070ce6264547894837 Content-length: 354 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN|= bM; S/* * This is a no-op in pterm, except that we'll ensure the * protocol is set to -1 to inhibit the useless Connection * panel in the config box. */ cfg->protocol = -1; return 1; default_protocol = -1; pty_pre_init(); return pt_main(argc, argv); } Revision-number: 3147 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2003-04-26T14:36:48.000000Z K 7 svn:log V 63 Might as well provide PuTTYtel for Unix. It's not much effort! K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e3e41e9fbe837a614c38ed3fcce894f1 Text-delta-base-sha1: fab0a0dfca3793fb913a977d26b104a336b006d7 Text-content-length: 94 Text-content-md5: 2356d2c734c6ad76ed8f84538710e352 Text-content-sha1: 8c062fbed141bf5f93a4c6bfea698cfbdd989370 Content-length: 134 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN4yDrzmIkputtytelssh uxstore signal CHARSET + uxputty NONSSH UXMISC logging Node-path: putty/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f9959f93b530b5a6a1980df2b5557d0d Text-delta-base-sha1: ec68b005998c34fcecdbd2494b88ff93483d95f7 Text-content-length: 73 Text-content-md5: e764366c06b8b1fc9d813797449ace6b Text-content-sha1: 668e6a2ff57ae08847c0d3ab28af84b853db6c10 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNvi6dOyunsigned long data) { } void noise_regular(void) { } Revision-number: 3148 Prop-content-length: 276 Content-length: 276 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-26T14:37:49.000000Z K 7 svn:log V 175 Remove the TODO comment at the top of uxputty.c; I'm now not aware of anything that makes the Unix port of PuTTY proper significantly unfinished. That's quite a milestone :-) PROPS-END Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ab2e0d4574cea7db091e4143b4127f30 Text-delta-base-sha1: 75a1efda25740a2887a9bdc55ea3371c1f04c72a Text-content-length: 20 Text-content-md5: d9f938af4cf4475a41b856692396e9e4 Text-content-sha1: d59a340b81428079f31fe5b6a83931894b017a4e Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNe 6f Revision-number: 3149 Prop-content-length: 297 Content-length: 297 K 8 svn:date V 27 2003-04-27T09:45:35.000000Z K 7 svn:log V 196 Take the random number generator back out of Pageant: the `random' numbers needed for RSA blinding are now done deterministically by hashes of the private key, much the same way we do it for DSA. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2356d2c734c6ad76ed8f84538710e352 Text-delta-base-sha1: 8c062fbed141bf5f93a4c6bfea698cfbdd989370 Text-content-length: 20 Text-content-md5: b3107e4370be007db94bdbcdf490903b Text-content-sha1: c60f2fb405c336f276a705c5d25f735c2add6378 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNyb Tk Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 017c48495eff465751701c30aaf80f2e Text-delta-base-sha1: 8179f9267bc43a7d9c50ecdb2d990e7ecae767aa Text-content-length: 631 Text-content-md5: 5f73d085429e763c9f19f8433c000fbe Text-content-sha1: d36990e50e2007e47b6189f830e22a94de05c480 Content-length: 671 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNVsV4kqWe need this to link with the RSA code, because rsaencrypt() * pads its data with random bytes. Since we only use rsadecrypt() * and the signing functions, which are deterministic, this should * never be called. * * If it _is_ called, there is a _serious_ problem, because it * won't generate true random numbers. So we must scream, panic, * and exit immediately if that should happen. */ int random_byte(void) { MessageBox(main_hwnd, "Internal Error", APPNAME, MB_OK | MB_ICONERROR); exit(0); /* this line can't be reached but it placates MSVC's warnings :-) */ return 0; } Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e90370a76c040701580581f7bf48f17c Text-delta-base-sha1: 26280652eb44689c4a9efdce5975e794c4fe70a6 Text-content-length: 1426 Text-content-md5: 8051db1c0fbc69975b0c533a96844172 Text-content-sha1: 970d341e9ae78141ba6dd7d0ba97fc72f44e38e6 Content-length: 1466 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN+z#aCFP=l0:T/u)static void sha512_mpint(SHA512_State * s, Bignum b) { unsigned char lenbuf[4]; int len; len = (bignum_bitcount(b) + 8) / 8; PUT_32BIT(lenbuf, len); SHA512_Bytes(s, lenbuf, 4); while (len-- > 0) { lenbuf[0] = bignum_byte(b, len); SHA512_Bytes(s, lenbuf, 1); } memset(lenbuf, 0, sizeof(lenbuf)SHA512_State ss; unsigned char digest512[64]; int digestused = lenof(digest512); int hashseq = 0 * To preserve determinism and avoid Pageant needing to share * the random number pool, we actually generate this `random' * number by hashing stuff with the private key. { bitsleft = 8; /* * Conceptually the following few lines are equivalent to * byte = random_byte(); */ if (digestused >= lenof(digest512)) { unsigned char seqbuf[4]; PUT_32BIT(seqbuf, hashseq); SHA512_Init(&ss); SHA512_Bytes(&ss, "RSA deterministic blinding", 26); SHA512_Bytes(&ss, seqbuf, sizeof(seqbuf)); sha512_mpint(&ss, key->private_exponent); SHA512_Final(&ss, digest512); hashseq++; /* * Now hash that digest plus the signature * input. */ SHA512_Init(&ss); SHA512_Bytes(&ss, digest512, sizeof(digest512)); sha512_mpint(&ss, input); SHA512_Final(&ss, digest512); digestused = 0; } byte = digest512[digestused++]; } Revision-number: 3150 Prop-content-length: 221 Content-length: 221 K 8 svn:date V 27 2003-04-27T10:02:21.000000Z K 7 svn:log V 120 radioline() was broken after the portable-dialog stuff got added, so PuTTYgen was lacking its key type selector. Fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ccc94ec235f67b1f8d2a30343f20a52 Text-delta-base-sha1: 1467c13d020b781a0da4ae38b83076ad746a89f8 Text-content-length: 44 Text-content-md5: 7423a60f9057838763a490e2cf69f744 Text-content-sha1: 137321138b9bdc44f717051505cfa1a27dd265bb Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN7D Vs'-$ nbuttons++ Revision-number: 3151 Prop-content-length: 304 Content-length: 304 K 8 svn:date V 27 2003-04-27T11:10:48.000000Z K 7 svn:log V 203 Support for non-ISO-8859-1 X keysyms. So in particular, pterm in a Euro-supporting font with a Euro-enabled X key map will now actually generate a Euro character rather than shrugging and doing nothing. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3107e4370be007db94bdbcdf490903b Text-delta-base-sha1: c60f2fb405c336f276a705c5d25f735c2add6378 Text-content-length: 554 Text-content-md5: f24c936cd34ce09f6db8b1dfba52843f Text-content-sha1: de066c4f3505de36c8c1544c18599a9b00191975 Content-length: 594 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNb` )jsoCSame thing on Unix. UXTERM = pterm config uxcfg dialog gtkdlg gtkcols gtkpanel tree234 + terminal wcwidth uxucs ldiscucs logging uxprint xkeysymUXTERM uxmisc misc ldisc settings pty uxsel be_none uxstore + signal CHARSET cmdline ptermm version putty : [X] UXTERM uxmisc misc ldisc settings pty uxsel be_all uxstore + signal CHARSET uxputty NONSSH UXSSH UXMISC ux_x11 puttytel : [X] UXTERM uxmisc misc ldisc settings pty uxsel be_nossh uxstore + signal CHARSET uxputty NONSSH UXMISC Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c7a08d9be64775c4adb281a075122c2d Text-delta-base-sha1: b10061e85ac6962ab105737615df85cdf2d9e1ec Text-content-length: 1899 Text-content-md5: e31ecf87af209b761cdf7ce292b020f3 Text-content-sha1: e9147bfc40fc45a5af1b3b07f94efbd337ce463f Content-length: 1940 K 15 cvs2svn:cvs-rev V 5 1.127 PROPS-END SVN$`>XHRoZ>n.'-NFtC3 oisxUbF)%J3H6w)>A{SJ%3}U o5wchar_t ucsoutput[2]; int ucsval, start, end, special, use_ucsoutputuse_ucsoutput use_ucsoutput = FALSE; /* ALT+things gives leading Escape. */ output[0] = '\033'; strncpy(output+1, event->string, 31); if (!*event->string && (ucsval = keysym_to_unicode(event->keyval)) >= 0) { ucsoutput[0] = '\033'; ucsoutput[1] = ucsval; use_ucsoutput = TRUE; end = 2; } else { output[31] = '\0'; end = strlen(output); }use_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSE use_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSE;use_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSEuse_ucsoutput = FALSE; goto done; } if (code) { end = 1 + sprintf(output+1, "\x1B[%d~", code); use_ucsoutput = FALSEuse_ucsoutput = FALSE;if (!use_ucsoutput) { /* * The stuff we've just generated is assumed to be * ISO-8859-1! This sounds insane, but `man * XLookupString' agrees: strings of this type * returned from the X server are hardcoded to * 8859-1. Strictly speaking we should be doing * this using some sort of GtkIMContext, which (if * we're lucky) would give us our data directly in * Unicode; but that's not supported in GTK 1.2 as * far as I can tell, and it's poorly documented * even in 2.0, so it'll have to wait. */ lpage_send(inst->ldisc, CS_ISO8859_1, output+start, end-start, 1); } else { /* * We generated our own Unicode key data from the * keysym, so use that instead. */ luni_send(inst->ldisc, ucsoutput+start, end-start, 1); } Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 711e9a9eadfb971b6e7f27d2aa8670cd Text-delta-base-sha1: dc149ff5775ec596417cb4123db1cac91e196f75 Text-content-length: 106 Text-content-md5: 7765842c8b932d6baac0015008152127 Text-content-sha1: 9def57ca1d24b13fbf453b1cb2c590affd1a8dd3 Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN e TTypterm.c needs this special function in xkeysym.c */ int keysym_to_unicode(int keysym Node-path: putty/unix/xkeysym.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 20471 Text-content-md5: 743e8f98c08b54afe784551746c826c8 Text-content-sha1: 23874f4283826c58f712394b85a9d73dd98449c2 Content-length: 20587 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNfff/* * xkeysym.c: mapping from X keysyms to Unicode values * * The basic idea of this is shamelessly cribbed from xterm. The * actual character data is generated from Markus Kuhn's proposed * redraft of the X11 keysym mapping table, using the following * piece of Perl/sh code: wget -q -O - http://www.cl.cam.ac.uk/~mgk25/ucs/X11.keysyms | \ perl -ne '/^(\d+)\s+(\d+)\s+[\d\/]+\s+U\+([\dA-Fa-f]+)/ and' \ -e ' do { $a{$1 * 256+ $2} = hex $3; };' \ -e 'END { foreach $i (sort {$a <=> $b} keys %a) {' \ -e ' printf " {0x%x, 0x%x},\n", $i, $a{$i} } }' \ -e 'BEGIN { $a{0x13a4} = 0x20ac }' * (The BEGIN clause inserts a mapping for the Euro sign which for * some reason isn't in the list but xterm supports. *shrug*.) */ #include "misc.h" struct keysym { /* * Currently nothing in here is above 0xFFFF, so I'll use * `unsigned short' to save space. */ unsigned short keysym; unsigned short unicode; }; static struct keysym keysyms[] = { {0x20, 0x20}, {0x21, 0x21}, {0x22, 0x22}, {0x23, 0x23}, {0x24, 0x24}, {0x25, 0x25}, {0x26, 0x26}, {0x27, 0x27}, {0x28, 0x28}, {0x29, 0x29}, {0x2a, 0x2a}, {0x2b, 0x2b}, {0x2c, 0x2c}, {0x2d, 0x2d}, {0x2e, 0x2e}, {0x2f, 0x2f}, {0x30, 0x30}, {0x31, 0x31}, {0x32, 0x32}, {0x33, 0x33}, {0x34, 0x34}, {0x35, 0x35}, {0x36, 0x36}, {0x37, 0x37}, {0x38, 0x38}, {0x39, 0x39}, {0x3a, 0x3a}, {0x3b, 0x3b}, {0x3c, 0x3c}, {0x3d, 0x3d}, {0x3e, 0x3e}, {0x3f, 0x3f}, {0x40, 0x40}, {0x41, 0x41}, {0x42, 0x42}, {0x43, 0x43}, {0x44, 0x44}, {0x45, 0x45}, {0x46, 0x46}, {0x47, 0x47}, {0x48, 0x48}, {0x49, 0x49}, {0x4a, 0x4a}, {0x4b, 0x4b}, {0x4c, 0x4c}, {0x4d, 0x4d}, {0x4e, 0x4e}, {0x4f, 0x4f}, {0x50, 0x50}, {0x51, 0x51}, {0x52, 0x52}, {0x53, 0x53}, {0x54, 0x54}, {0x55, 0x55}, {0x56, 0x56}, {0x57, 0x57}, {0x58, 0x58}, {0x59, 0x59}, {0x5a, 0x5a}, {0x5b, 0x5b}, {0x5c, 0x5c}, {0x5d, 0x5d}, {0x5e, 0x5e}, {0x5f, 0x5f}, {0x60, 0x60}, {0x61, 0x61}, {0x62, 0x62}, {0x63, 0x63}, {0x64, 0x64}, {0x65, 0x65}, {0x66, 0x66}, {0x67, 0x67}, {0x68, 0x68}, {0x69, 0x69}, {0x6a, 0x6a}, {0x6b, 0x6b}, {0x6c, 0x6c}, {0x6d, 0x6d}, {0x6e, 0x6e}, {0x6f, 0x6f}, {0x70, 0x70}, {0x71, 0x71}, {0x72, 0x72}, {0x73, 0x73}, {0x74, 0x74}, {0x75, 0x75}, {0x76, 0x76}, {0x77, 0x77}, {0x78, 0x78}, {0x79, 0x79}, {0x7a, 0x7a}, {0x7b, 0x7b}, {0x7c, 0x7c}, {0x7d, 0x7d}, {0x7e, 0x7e}, {0xa0, 0xa0}, {0xa1, 0xa1}, {0xa2, 0xa2}, {0xa3, 0xa3}, {0xa4, 0xa4}, {0xa5, 0xa5}, {0xa6, 0xa6}, {0xa7, 0xa7}, {0xa8, 0xa8}, {0xa9, 0xa9}, {0xaa, 0xaa}, {0xab, 0xab}, {0xac, 0xac}, {0xad, 0xad}, {0xae, 0xae}, {0xaf, 0xaf}, {0xb0, 0xb0}, {0xb1, 0xb1}, {0xb2, 0xb2}, {0xb3, 0xb3}, {0xb4, 0xb4}, {0xb5, 0xb5}, {0xb6, 0xb6}, {0xb7, 0xb7}, {0xb8, 0xb8}, {0xb9, 0xb9}, {0xba, 0xba}, {0xbb, 0xbb}, {0xbc, 0xbc}, {0xbd, 0xbd}, {0xbe, 0xbe}, {0xbf, 0xbf}, {0xc0, 0xc0}, {0xc1, 0xc1}, {0xc2, 0xc2}, {0xc3, 0xc3}, {0xc4, 0xc4}, {0xc5, 0xc5}, {0xc6, 0xc6}, {0xc7, 0xc7}, {0xc8, 0xc8}, {0xc9, 0xc9}, {0xca, 0xca}, {0xcb, 0xcb}, {0xcc, 0xcc}, {0xcd, 0xcd}, {0xce, 0xce}, {0xcf, 0xcf}, {0xd0, 0xd0}, {0xd1, 0xd1}, {0xd2, 0xd2}, {0xd3, 0xd3}, {0xd4, 0xd4}, {0xd5, 0xd5}, {0xd6, 0xd6}, {0xd7, 0xd7}, {0xd8, 0xd8}, {0xd9, 0xd9}, {0xda, 0xda}, {0xdb, 0xdb}, {0xdc, 0xdc}, {0xdd, 0xdd}, {0xde, 0xde}, {0xdf, 0xdf}, {0xe0, 0xe0}, {0xe1, 0xe1}, {0xe2, 0xe2}, {0xe3, 0xe3}, {0xe4, 0xe4}, {0xe5, 0xe5}, {0xe6, 0xe6}, {0xe7, 0xe7}, {0xe8, 0xe8}, {0xe9, 0xe9}, {0xea, 0xea}, {0xeb, 0xeb}, {0xec, 0xec}, {0xed, 0xed}, {0xee, 0xee}, {0xef, 0xef}, {0xf0, 0xf0}, {0xf1, 0xf1}, {0xf2, 0xf2}, {0xf3, 0xf3}, {0xf4, 0xf4}, {0xf5, 0xf5}, {0xf6, 0xf6}, {0xf7, 0xf7}, {0xf8, 0xf8}, {0xf9, 0xf9}, {0xfa, 0xfa}, {0xfb, 0xfb}, {0xfc, 0xfc}, {0xfd, 0xfd}, {0xfe, 0xfe}, {0xff, 0xff}, {0x1a1, 0x104}, {0x1a2, 0x2d8}, {0x1a3, 0x141}, {0x1a5, 0x13d}, {0x1a6, 0x15a}, {0x1a9, 0x160}, {0x1aa, 0x15e}, {0x1ab, 0x164}, {0x1ac, 0x179}, {0x1ae, 0x17d}, {0x1af, 0x17b}, {0x1b1, 0x105}, {0x1b2, 0x2db}, {0x1b3, 0x142}, {0x1b5, 0x13e}, {0x1b6, 0x15b}, {0x1b7, 0x2c7}, {0x1b9, 0x161}, {0x1ba, 0x15f}, {0x1bb, 0x165}, {0x1bc, 0x17a}, {0x1bd, 0x2dd}, {0x1be, 0x17e}, {0x1bf, 0x17c}, {0x1c0, 0x154}, {0x1c3, 0x102}, {0x1c5, 0x139}, {0x1c6, 0x106}, {0x1c8, 0x10c}, {0x1ca, 0x118}, {0x1cc, 0x11a}, {0x1cf, 0x10e}, {0x1d0, 0x110}, {0x1d1, 0x143}, {0x1d2, 0x147}, {0x1d5, 0x150}, {0x1d8, 0x158}, {0x1d9, 0x16e}, {0x1db, 0x170}, {0x1de, 0x162}, {0x1e0, 0x155}, {0x1e3, 0x103}, {0x1e5, 0x13a}, {0x1e6, 0x107}, {0x1e8, 0x10d}, {0x1ea, 0x119}, {0x1ec, 0x11b}, {0x1ef, 0x10f}, {0x1f0, 0x111}, {0x1f1, 0x144}, {0x1f2, 0x148}, {0x1f5, 0x151}, {0x1f8, 0x159}, {0x1f9, 0x16f}, {0x1fb, 0x171}, {0x1fe, 0x163}, {0x1ff, 0x2d9}, {0x2a1, 0x126}, {0x2a6, 0x124}, {0x2a9, 0x130}, {0x2ab, 0x11e}, {0x2ac, 0x134}, {0x2b1, 0x127}, {0x2b6, 0x125}, {0x2b9, 0x131}, {0x2bb, 0x11f}, {0x2bc, 0x135}, {0x2c5, 0x10a}, {0x2c6, 0x108}, {0x2d5, 0x120}, {0x2d8, 0x11c}, {0x2dd, 0x16c}, {0x2de, 0x15c}, {0x2e5, 0x10b}, {0x2e6, 0x109}, {0x2f5, 0x121}, {0x2f8, 0x11d}, {0x2fd, 0x16d}, {0x2fe, 0x15d}, {0x3a2, 0x138}, {0x3a3, 0x156}, {0x3a5, 0x128}, {0x3a6, 0x13b}, {0x3aa, 0x112}, {0x3ab, 0x122}, {0x3ac, 0x166}, {0x3b3, 0x157}, {0x3b5, 0x129}, {0x3b6, 0x13c}, {0x3ba, 0x113}, {0x3bb, 0x123}, {0x3bc, 0x167}, {0x3bd, 0x14a}, {0x3bf, 0x14b}, {0x3c0, 0x100}, {0x3c7, 0x12e}, {0x3cc, 0x116}, {0x3cf, 0x12a}, {0x3d1, 0x145}, {0x3d2, 0x14c}, {0x3d3, 0x136}, {0x3d9, 0x172}, {0x3dd, 0x168}, {0x3de, 0x16a}, {0x3e0, 0x101}, {0x3e7, 0x12f}, {0x3ec, 0x117}, {0x3ef, 0x12b}, {0x3f1, 0x146}, {0x3f2, 0x14d}, {0x3f3, 0x137}, {0x3f9, 0x173}, {0x3fd, 0x169}, {0x3fe, 0x16b}, {0x47e, 0x203e}, {0x4a1, 0x3002}, {0x4a2, 0x300c}, {0x4a3, 0x300d}, {0x4a4, 0x3001}, {0x4a5, 0x30fb}, {0x4a6, 0x30f2}, {0x4a7, 0x30a1}, {0x4a8, 0x30a3}, {0x4a9, 0x30a5}, {0x4aa, 0x30a7}, {0x4ab, 0x30a9}, {0x4ac, 0x30e3}, {0x4ad, 0x30e5}, {0x4ae, 0x30e7}, {0x4af, 0x30c3}, {0x4b0, 0x30fc}, {0x4b1, 0x30a2}, {0x4b2, 0x30a4}, {0x4b3, 0x30a6}, {0x4b4, 0x30a8}, {0x4b5, 0x30aa}, {0x4b6, 0x30ab}, {0x4b7, 0x30ad}, {0x4b8, 0x30af}, {0x4b9, 0x30b1}, {0x4ba, 0x30b3}, {0x4bb, 0x30b5}, {0x4bc, 0x30b7}, {0x4bd, 0x30b9}, {0x4be, 0x30bb}, {0x4bf, 0x30bd}, {0x4c0, 0x30bf}, {0x4c1, 0x30c1}, {0x4c2, 0x30c4}, {0x4c3, 0x30c6}, {0x4c4, 0x30c8}, {0x4c5, 0x30ca}, {0x4c6, 0x30cb}, {0x4c7, 0x30cc}, {0x4c8, 0x30cd}, {0x4c9, 0x30ce}, {0x4ca, 0x30cf}, {0x4cb, 0x30d2}, {0x4cc, 0x30d5}, {0x4cd, 0x30d8}, {0x4ce, 0x30db}, {0x4cf, 0x30de}, {0x4d0, 0x30df}, {0x4d1, 0x30e0}, {0x4d2, 0x30e1}, {0x4d3, 0x30e2}, {0x4d4, 0x30e4}, {0x4d5, 0x30e6}, {0x4d6, 0x30e8}, {0x4d7, 0x30e9}, {0x4d8, 0x30ea}, {0x4d9, 0x30eb}, {0x4da, 0x30ec}, {0x4db, 0x30ed}, {0x4dc, 0x30ef}, {0x4dd, 0x30f3}, {0x4de, 0x309b}, {0x4df, 0x309c}, {0x5ac, 0x60c}, {0x5bb, 0x61b}, {0x5bf, 0x61f}, {0x5c1, 0x621}, {0x5c2, 0x622}, {0x5c3, 0x623}, {0x5c4, 0x624}, {0x5c5, 0x625}, {0x5c6, 0x626}, {0x5c7, 0x627}, {0x5c8, 0x628}, {0x5c9, 0x629}, {0x5ca, 0x62a}, {0x5cb, 0x62b}, {0x5cc, 0x62c}, {0x5cd, 0x62d}, {0x5ce, 0x62e}, {0x5cf, 0x62f}, {0x5d0, 0x630}, {0x5d1, 0x631}, {0x5d2, 0x632}, {0x5d3, 0x633}, {0x5d4, 0x634}, {0x5d5, 0x635}, {0x5d6, 0x636}, {0x5d7, 0x637}, {0x5d8, 0x638}, {0x5d9, 0x639}, {0x5da, 0x63a}, {0x5e0, 0x640}, {0x5e1, 0x641}, {0x5e2, 0x642}, {0x5e3, 0x643}, {0x5e4, 0x644}, {0x5e5, 0x645}, {0x5e6, 0x646}, {0x5e7, 0x647}, {0x5e8, 0x648}, {0x5e9, 0x649}, {0x5ea, 0x64a}, {0x5eb, 0x64b}, {0x5ec, 0x64c}, {0x5ed, 0x64d}, {0x5ee, 0x64e}, {0x5ef, 0x64f}, {0x5f0, 0x650}, {0x5f1, 0x651}, {0x5f2, 0x652}, {0x6a1, 0x452}, {0x6a2, 0x453}, {0x6a3, 0x451}, {0x6a4, 0x454}, {0x6a5, 0x455}, {0x6a6, 0x456}, {0x6a7, 0x457}, {0x6a8, 0x458}, {0x6a9, 0x459}, {0x6aa, 0x45a}, {0x6ab, 0x45b}, {0x6ac, 0x45c}, {0x6ae, 0x45e}, {0x6af, 0x45f}, {0x6b0, 0x2116}, {0x6b1, 0x402}, {0x6b2, 0x403}, {0x6b3, 0x401}, {0x6b4, 0x404}, {0x6b5, 0x405}, {0x6b6, 0x406}, {0x6b7, 0x407}, {0x6b8, 0x408}, {0x6b9, 0x409}, {0x6ba, 0x40a}, {0x6bb, 0x40b}, {0x6bc, 0x40c}, {0x6be, 0x40e}, {0x6bf, 0x40f}, {0x6c0, 0x44e}, {0x6c1, 0x430}, {0x6c2, 0x431}, {0x6c3, 0x446}, {0x6c4, 0x434}, {0x6c5, 0x435}, {0x6c6, 0x444}, {0x6c7, 0x433}, {0x6c8, 0x445}, {0x6c9, 0x438}, {0x6ca, 0x439}, {0x6cb, 0x43a}, {0x6cc, 0x43b}, {0x6cd, 0x43c}, {0x6ce, 0x43d}, {0x6cf, 0x43e}, {0x6d0, 0x43f}, {0x6d1, 0x44f}, {0x6d2, 0x440}, {0x6d3, 0x441}, {0x6d4, 0x442}, {0x6d5, 0x443}, {0x6d6, 0x436}, {0x6d7, 0x432}, {0x6d8, 0x44c}, {0x6d9, 0x44b}, {0x6da, 0x437}, {0x6db, 0x448}, {0x6dc, 0x44d}, {0x6dd, 0x449}, {0x6de, 0x447}, {0x6df, 0x44a}, {0x6e0, 0x42e}, {0x6e1, 0x410}, {0x6e2, 0x411}, {0x6e3, 0x426}, {0x6e4, 0x414}, {0x6e5, 0x415}, {0x6e6, 0x424}, {0x6e7, 0x413}, {0x6e8, 0x425}, {0x6e9, 0x418}, {0x6ea, 0x419}, {0x6eb, 0x41a}, {0x6ec, 0x41b}, {0x6ed, 0x41c}, {0x6ee, 0x41d}, {0x6ef, 0x41e}, {0x6f0, 0x41f}, {0x6f1, 0x42f}, {0x6f2, 0x420}, {0x6f3, 0x421}, {0x6f4, 0x422}, {0x6f5, 0x423}, {0x6f6, 0x416}, {0x6f7, 0x412}, {0x6f8, 0x42c}, {0x6f9, 0x42b}, {0x6fa, 0x417}, {0x6fb, 0x428}, {0x6fc, 0x42d}, {0x6fd, 0x429}, {0x6fe, 0x427}, {0x6ff, 0x42a}, {0x7a1, 0x386}, {0x7a2, 0x388}, {0x7a3, 0x389}, {0x7a4, 0x38a}, {0x7a5, 0x3aa}, {0x7a7, 0x38c}, {0x7a8, 0x38e}, {0x7a9, 0x3ab}, {0x7ab, 0x38f}, {0x7ae, 0x385}, {0x7af, 0x2015}, {0x7b1, 0x3ac}, {0x7b2, 0x3ad}, {0x7b3, 0x3ae}, {0x7b4, 0x3af}, {0x7b5, 0x3ca}, {0x7b6, 0x390}, {0x7b7, 0x3cc}, {0x7b8, 0x3cd}, {0x7b9, 0x3cb}, {0x7ba, 0x3b0}, {0x7bb, 0x3ce}, {0x7c1, 0x391}, {0x7c2, 0x392}, {0x7c3, 0x393}, {0x7c4, 0x394}, {0x7c5, 0x395}, {0x7c6, 0x396}, {0x7c7, 0x397}, {0x7c8, 0x398}, {0x7c9, 0x399}, {0x7ca, 0x39a}, {0x7cb, 0x39b}, {0x7cc, 0x39c}, {0x7cd, 0x39d}, {0x7ce, 0x39e}, {0x7cf, 0x39f}, {0x7d0, 0x3a0}, {0x7d1, 0x3a1}, {0x7d2, 0x3a3}, {0x7d4, 0x3a4}, {0x7d5, 0x3a5}, {0x7d6, 0x3a6}, {0x7d7, 0x3a7}, {0x7d8, 0x3a8}, {0x7d9, 0x3a9}, {0x7e1, 0x3b1}, {0x7e2, 0x3b2}, {0x7e3, 0x3b3}, {0x7e4, 0x3b4}, {0x7e5, 0x3b5}, {0x7e6, 0x3b6}, {0x7e7, 0x3b7}, {0x7e8, 0x3b8}, {0x7e9, 0x3b9}, {0x7ea, 0x3ba}, {0x7eb, 0x3bb}, {0x7ec, 0x3bc}, {0x7ed, 0x3bd}, {0x7ee, 0x3be}, {0x7ef, 0x3bf}, {0x7f0, 0x3c0}, {0x7f1, 0x3c1}, {0x7f2, 0x3c3}, {0x7f3, 0x3c2}, {0x7f4, 0x3c4}, {0x7f5, 0x3c5}, {0x7f6, 0x3c6}, {0x7f7, 0x3c7}, {0x7f8, 0x3c8}, {0x7f9, 0x3c9}, {0x8a1, 0x23b7}, {0x8a2, 0x250c}, {0x8a3, 0x2500}, {0x8a4, 0x2320}, {0x8a5, 0x2321}, {0x8a6, 0x2502}, {0x8a7, 0x23a1}, {0x8a8, 0x23a3}, {0x8a9, 0x23a4}, {0x8aa, 0x23a6}, {0x8ab, 0x239b}, {0x8ac, 0x239d}, {0x8ad, 0x239e}, {0x8ae, 0x23a0}, {0x8af, 0x23a8}, {0x8b0, 0x23ac}, {0x8bc, 0x2264}, {0x8bd, 0x2260}, {0x8be, 0x2265}, {0x8bf, 0x222b}, {0x8c0, 0x2234}, {0x8c1, 0x221d}, {0x8c2, 0x221e}, {0x8c5, 0x2207}, {0x8c8, 0x223c}, {0x8c9, 0x2243}, {0x8cd, 0x21d4}, {0x8ce, 0x21d2}, {0x8cf, 0x2261}, {0x8d6, 0x221a}, {0x8da, 0x2282}, {0x8db, 0x2283}, {0x8dc, 0x2229}, {0x8dd, 0x222a}, {0x8de, 0x2227}, {0x8df, 0x2228}, {0x8ef, 0x2202}, {0x8f6, 0x192}, {0x8fb, 0x2190}, {0x8fc, 0x2191}, {0x8fd, 0x2192}, {0x8fe, 0x2193}, {0x9e0, 0x25c6}, {0x9e1, 0x2592}, {0x9e2, 0x2409}, {0x9e3, 0x240c}, {0x9e4, 0x240d}, {0x9e5, 0x240a}, {0x9e8, 0x2424}, {0x9e9, 0x240b}, {0x9ea, 0x2518}, {0x9eb, 0x2510}, {0x9ec, 0x250c}, {0x9ed, 0x2514}, {0x9ee, 0x253c}, {0x9ef, 0x23ba}, {0x9f0, 0x23bb}, {0x9f1, 0x2500}, {0x9f2, 0x23bc}, {0x9f3, 0x23bd}, {0x9f4, 0x251c}, {0x9f5, 0x2524}, {0x9f6, 0x2534}, {0x9f7, 0x252c}, {0x9f8, 0x2502}, {0xaa1, 0x2003}, {0xaa2, 0x2002}, {0xaa3, 0x2004}, {0xaa4, 0x2005}, {0xaa5, 0x2007}, {0xaa6, 0x2008}, {0xaa7, 0x2009}, {0xaa8, 0x200a}, {0xaa9, 0x2014}, {0xaaa, 0x2013}, {0xaae, 0x2026}, {0xaaf, 0x2025}, {0xab0, 0x2153}, {0xab1, 0x2154}, {0xab2, 0x2155}, {0xab3, 0x2156}, {0xab4, 0x2157}, {0xab5, 0x2158}, {0xab6, 0x2159}, {0xab7, 0x215a}, {0xab8, 0x2105}, {0xabb, 0x2012}, {0xabc, 0x2329}, {0xabe, 0x232a}, {0xac3, 0x215b}, {0xac4, 0x215c}, {0xac5, 0x215d}, {0xac6, 0x215e}, {0xac9, 0x2122}, {0xaca, 0x2613}, {0xacc, 0x25c1}, {0xacd, 0x25b7}, {0xace, 0x25cb}, {0xacf, 0x25af}, {0xad0, 0x2018}, {0xad1, 0x2019}, {0xad2, 0x201c}, {0xad3, 0x201d}, {0xad4, 0x211e}, {0xad6, 0x2032}, {0xad7, 0x2033}, {0xad9, 0x271d}, {0xadb, 0x25ac}, {0xadc, 0x25c0}, {0xadd, 0x25b6}, {0xade, 0x25cf}, {0xadf, 0x25ae}, {0xae0, 0x25e6}, {0xae1, 0x25ab}, {0xae2, 0x25ad}, {0xae3, 0x25b3}, {0xae4, 0x25bd}, {0xae5, 0x2606}, {0xae6, 0x2022}, {0xae7, 0x25aa}, {0xae8, 0x25b2}, {0xae9, 0x25bc}, {0xaea, 0x261c}, {0xaeb, 0x261e}, {0xaec, 0x2663}, {0xaed, 0x2666}, {0xaee, 0x2665}, {0xaf0, 0x2720}, {0xaf1, 0x2020}, {0xaf2, 0x2021}, {0xaf3, 0x2713}, {0xaf4, 0x2717}, {0xaf5, 0x266f}, {0xaf6, 0x266d}, {0xaf7, 0x2642}, {0xaf8, 0x2640}, {0xaf9, 0x260e}, {0xafa, 0x2315}, {0xafb, 0x2117}, {0xafc, 0x2038}, {0xafd, 0x201a}, {0xafe, 0x201e}, {0xba3, 0x3c}, {0xba6, 0x3e}, {0xba8, 0x2228}, {0xba9, 0x2227}, {0xbc0, 0xaf}, {0xbc2, 0x22a5}, {0xbc3, 0x2229}, {0xbc4, 0x230a}, {0xbc6, 0x5f}, {0xbca, 0x2218}, {0xbcc, 0x2395}, {0xbce, 0x22a4}, {0xbcf, 0x25cb}, {0xbd3, 0x2308}, {0xbd6, 0x222a}, {0xbd8, 0x2283}, {0xbda, 0x2282}, {0xbdc, 0x22a2}, {0xbfc, 0x22a3}, {0xcdf, 0x2017}, {0xce0, 0x5d0}, {0xce1, 0x5d1}, {0xce2, 0x5d2}, {0xce3, 0x5d3}, {0xce4, 0x5d4}, {0xce5, 0x5d5}, {0xce6, 0x5d6}, {0xce7, 0x5d7}, {0xce8, 0x5d8}, {0xce9, 0x5d9}, {0xcea, 0x5da}, {0xceb, 0x5db}, {0xcec, 0x5dc}, {0xced, 0x5dd}, {0xcee, 0x5de}, {0xcef, 0x5df}, {0xcf0, 0x5e0}, {0xcf1, 0x5e1}, {0xcf2, 0x5e2}, {0xcf3, 0x5e3}, {0xcf4, 0x5e4}, {0xcf5, 0x5e5}, {0xcf6, 0x5e6}, {0xcf7, 0x5e7}, {0xcf8, 0x5e8}, {0xcf9, 0x5e9}, {0xcfa, 0x5ea}, {0xda1, 0xe01}, {0xda2, 0xe02}, {0xda3, 0xe03}, {0xda4, 0xe04}, {0xda5, 0xe05}, {0xda6, 0xe06}, {0xda7, 0xe07}, {0xda8, 0xe08}, {0xda9, 0xe09}, {0xdaa, 0xe0a}, {0xdab, 0xe0b}, {0xdac, 0xe0c}, {0xdad, 0xe0d}, {0xdae, 0xe0e}, {0xdaf, 0xe0f}, {0xdb0, 0xe10}, {0xdb1, 0xe11}, {0xdb2, 0xe12}, {0xdb3, 0xe13}, {0xdb4, 0xe14}, {0xdb5, 0xe15}, {0xdb6, 0xe16}, {0xdb7, 0xe17}, {0xdb8, 0xe18}, {0xdb9, 0xe19}, {0xdba, 0xe1a}, {0xdbb, 0xe1b}, {0xdbc, 0xe1c}, {0xdbd, 0xe1d}, {0xdbe, 0xe1e}, {0xdbf, 0xe1f}, {0xdc0, 0xe20}, {0xdc1, 0xe21}, {0xdc2, 0xe22}, {0xdc3, 0xe23}, {0xdc4, 0xe24}, {0xdc5, 0xe25}, {0xdc6, 0xe26}, {0xdc7, 0xe27}, {0xdc8, 0xe28}, {0xdc9, 0xe29}, {0xdca, 0xe2a}, {0xdcb, 0xe2b}, {0xdcc, 0xe2c}, {0xdcd, 0xe2d}, {0xdce, 0xe2e}, {0xdcf, 0xe2f}, {0xdd0, 0xe30}, {0xdd1, 0xe31}, {0xdd2, 0xe32}, {0xdd3, 0xe33}, {0xdd4, 0xe34}, {0xdd5, 0xe35}, {0xdd6, 0xe36}, {0xdd7, 0xe37}, {0xdd8, 0xe38}, {0xdd9, 0xe39}, {0xdda, 0xe3a}, {0xddf, 0xe3f}, {0xde0, 0xe40}, {0xde1, 0xe41}, {0xde2, 0xe42}, {0xde3, 0xe43}, {0xde4, 0xe44}, {0xde5, 0xe45}, {0xde6, 0xe46}, {0xde7, 0xe47}, {0xde8, 0xe48}, {0xde9, 0xe49}, {0xdea, 0xe4a}, {0xdeb, 0xe4b}, {0xdec, 0xe4c}, {0xded, 0xe4d}, {0xdf0, 0xe50}, {0xdf1, 0xe51}, {0xdf2, 0xe52}, {0xdf3, 0xe53}, {0xdf4, 0xe54}, {0xdf5, 0xe55}, {0xdf6, 0xe56}, {0xdf7, 0xe57}, {0xdf8, 0xe58}, {0xdf9, 0xe59}, {0xea1, 0x3131}, {0xea2, 0x3132}, {0xea3, 0x3133}, {0xea4, 0x3134}, {0xea5, 0x3135}, {0xea6, 0x3136}, {0xea7, 0x3137}, {0xea8, 0x3138}, {0xea9, 0x3139}, {0xeaa, 0x313a}, {0xeab, 0x313b}, {0xeac, 0x313c}, {0xead, 0x313d}, {0xeae, 0x313e}, {0xeaf, 0x313f}, {0xeb0, 0x3140}, {0xeb1, 0x3141}, {0xeb2, 0x3142}, {0xeb3, 0x3143}, {0xeb4, 0x3144}, {0xeb5, 0x3145}, {0xeb6, 0x3146}, {0xeb7, 0x3147}, {0xeb8, 0x3148}, {0xeb9, 0x3149}, {0xeba, 0x314a}, {0xebb, 0x314b}, {0xebc, 0x314c}, {0xebd, 0x314d}, {0xebe, 0x314e}, {0xebf, 0x314f}, {0xec0, 0x3150}, {0xec1, 0x3151}, {0xec2, 0x3152}, {0xec3, 0x3153}, {0xec4, 0x3154}, {0xec5, 0x3155}, {0xec6, 0x3156}, {0xec7, 0x3157}, {0xec8, 0x3158}, {0xec9, 0x3159}, {0xeca, 0x315a}, {0xecb, 0x315b}, {0xecc, 0x315c}, {0xecd, 0x315d}, {0xece, 0x315e}, {0xecf, 0x315f}, {0xed0, 0x3160}, {0xed1, 0x3161}, {0xed2, 0x3162}, {0xed3, 0x3163}, {0xed4, 0x11a8}, {0xed5, 0x11a9}, {0xed6, 0x11aa}, {0xed7, 0x11ab}, {0xed8, 0x11ac}, {0xed9, 0x11ad}, {0xeda, 0x11ae}, {0xedb, 0x11af}, {0xedc, 0x11b0}, {0xedd, 0x11b1}, {0xede, 0x11b2}, {0xedf, 0x11b3}, {0xee0, 0x11b4}, {0xee1, 0x11b5}, {0xee2, 0x11b6}, {0xee3, 0x11b7}, {0xee4, 0x11b8}, {0xee5, 0x11b9}, {0xee6, 0x11ba}, {0xee7, 0x11bb}, {0xee8, 0x11bc}, {0xee9, 0x11bd}, {0xeea, 0x11be}, {0xeeb, 0x11bf}, {0xeec, 0x11c0}, {0xeed, 0x11c1}, {0xeee, 0x11c2}, {0xeef, 0x316d}, {0xef0, 0x3171}, {0xef1, 0x3178}, {0xef2, 0x317f}, {0xef3, 0x3181}, {0xef4, 0x3184}, {0xef5, 0x3186}, {0xef6, 0x318d}, {0xef7, 0x318e}, {0xef8, 0x11eb}, {0xef9, 0x11f0}, {0xefa, 0x11f9}, {0xeff, 0x20a9}, {0x13a4, 0x20ac}, {0x13bc, 0x152}, {0x13bd, 0x153}, {0x13be, 0x178}, {0x20a0, 0x20a0}, {0x20a1, 0x20a1}, {0x20a2, 0x20a2}, {0x20a3, 0x20a3}, {0x20a4, 0x20a4}, {0x20a5, 0x20a5}, {0x20a6, 0x20a6}, {0x20a7, 0x20a7}, {0x20a8, 0x20a8}, {0x20aa, 0x20aa}, {0x20ab, 0x20ab}, {0x20ac, 0x20ac}, }; int keysym_to_unicode(int keysym) { int i, j, k; i = -1; j = lenof(keysyms); while (j - i >= 2) { k = (j + i) / 2; if (keysyms[k].keysym == keysym) return keysyms[k].unicode; else if (keysyms[k].keysym < keysym) i = k; else j = k; } return -1; } Revision-number: 3152 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2003-04-27T11:11:35.000000Z K 7 svn:log V 34 Add puttytel binary to .cvsignore K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 92 Content-length: 92 K 10 svn:ignore V 60 Makefile.gtk Makefile local plink pterm putty puttytel *.log PROPS-END Node-path: putty/unix/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b221465dc5bbbf4fdab3462077ba1801 Text-delta-base-sha1: de5bde0d5beb2bb247700c90d3e17c2a1840e109 Text-content-length: 71 Text-content-md5: b2040961591ba7f7edb02f434094e118 Text-content-sha1: 0582feb92733c09c21085fdd6af88d6eb2381d13 Content-length: 110 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN4==Makefile.gtk Makefile local plink pterm putty puttytel *.log Revision-number: 3153 Prop-content-length: 662 Content-length: 662 K 7 svn:log V 561 First half of `pageant-async' work. agent_query() is now passed a callback function; it may return 0 to indicate that it doesn't have an answer _yet_, in which case it will call the callback later on when it does, or it may return 1 to indicate that it's got an answer right now. The Windows agent_query() implementation is functionally unchanged and still synchronous, but the Unix one is async (since that one was really easy to do via uxsel). ssh.c copes cheerfully with either return value, so other ports are at liberty to be sync or async as they choose. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-04-28T11:41:39.000000Z PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5f73d085429e763c9f19f8433c000fbe Text-delta-base-sha1: d36990e50e2007e47b6189f830e22a94de05c480 Text-content-length: 624 Text-content-md5: 9a5dc45f6d7e0354b73e38ab7d1aa0f7 Text-content-sha1: 4a3a7799ab1fb73456452a3eb46e8bba967a510f Content-length: 664 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNl;'F2Atsc7c:-SO*z, retret = agent_query(request, reqlen, &vresponse, &resplen, NULL, NULL); assert(ret == 1, retret = agent_query(request, reqlen, &vresponse, &resplen, NULL, NULL); assert(ret == 1, retval; request[4] = SSH1_AGENTC_REQUEST_RSA_IDENTITIES; PUT_32BIT(request, 4); retval = agent_query(request, 5, &vresponse, &resplen, NULL, NULL); assert(retval == 1, retval; request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; PUT_32BIT(request, 4); retval = agent_query(request, 5, &vresponse, &resplen, NULL, NULL); assert(retval == 1 Node-path: putty/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2829b58276afeb4d3f4402b49dafc99b Text-delta-base-sha1: 74c74ae5a59c90ee1329c67c448fc3fbe6a200fb Text-content-length: 259 Text-content-md5: 47e201d7780fb73ded8ebdf065794155 Text-content-sha1: a385bd5958b4ea6eec923a447f6c9b79e3df54c5 Content-length: 298 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN_|Z yJUZ#0Qint agent_query(void *in, int inlen, void **out, int *outlen, void (*callback)(void *, void *, int), void *callback_ctx 1; /* *out == NULL, so failure */ 1; /* *out == NULL, so failure */ return 1 Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b2866c2a3abd7c0e23486f1120e87ea7 Text-delta-base-sha1: 679c7217bc8a495b0205133abdff8624a991d53b Text-content-length: 566 Text-content-md5: 074e71a7e025dc3e4485b6dfcac74874 Text-content-sha1: 7008d423d6ac5ad37ed14287376bbfd179984bc6 Content-length: 607 K 15 cvs2svn:cvs-rev V 5 1.215 PROPS-END SVN d$&f. * * agent_query returns 1 for here's-a-response, and 0 for query-in- * progress. In the latter case there will be a call to `callback' * at some future point, passing callback_ctx as the first * parameter and the actual reply data as the second and third. * * The response may be a NULL pointer (in either of the synchronous * or asynchronous cases), which indicates failure to receive a * response. */ int agent_query(void *in, int inlen, void **out, int *outlen, void (*callback)(void *, void *, int), void *callback_ctx Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 49d95b3fe988af3577222fe9a914f664 Text-delta-base-sha1: e1154a6127a60583c8c58112148caf493fbb5133 Text-content-length: 4495 Text-content-md5: d26b709777138508d2033384b76a24df Text-content-sha1: ad05b1f28e5615e8983f3a23cdd4fca9a511f842 Content-length: 4536 K 15 cvs2svn:cvs-rev V 5 1.291 PROPS-END SVN2)I(E{l_1B]static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen, int ispkt); static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, int ispkt /* * Used to transfer data back from async agent callbacks. */ void *agent_response; int agent_response_lenvoid ssh_agent_callback(void *sshv, void *reply, int replylen) { Ssh ssh = (Ssh) sshv; ssh->agent_response = reply; ssh->agent_response_len = replylen; if (ssh->version == 1) do_ssh1_login(ssh, NULL, -1, 0); else do_ssh2_authconn(ssh, NULL, -1, 0); } void ssh_agentf_callback(void *cv, void *reply, int replylen) { struct ssh_channel *c = (struct ssh_channel *)cv; Ssh ssh = c->ssh; void *sentreply = reply; if (!sentreply) { /* Fake SSH_AGENT_FAILURE. */ sentreply = "\0\0\0\1\5"; replylen = 5; } if (ssh->version == 2) { ssh2_add_channel_data(c, sentreply, replylen); ssh2_try_send(c); } else { send_packet(ssh, SSH1_MSG_CHANNEL_DATA, PKT_INT, c->remoteid, PKT_INT, replylen, PKT_DATA, sentreply, replylen, PKT_END); } if (reply) sfree(reply)if (!agent_query(s->request, 5, &r, &s->responselen, ssh_agent_callback, ssh)) { do { crReturn(0); if (ispkt) { bombout(("Unexpected data from server while waiting" " for agent response")); crStop(0); } } while (ispkt || inlen > 0); r = ssh->agent_response; s->responselen = ssh->agent_response_len; }if (!agent_query(agentreq, len + 4, &vret, &retlen, ssh_agent_callback, ssh)) { sfree(agentreq); do { crReturn(0); if (ispkt) { bombout(("Unexpected data from server" " while waiting for agent" " response")); crStop(0); } } while (ispkt || inlen > 0); vret = ssh->agent_response; retlen = ssh->agent_response_len; } else sfree(agentreq); ret = vret'WF|R+EG F5T{3nhPQ %Y5,{lk to our * X-Server. Give them back a local channel number. */ struct ssh_channel *c; logevent("Received X11 connect request"); /* Refuse if X11 forwarding is disabled. */ if (!ssh->X11_fwd_enabled) { send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(ssh->pktin.body), PKT_END); logevent("Rejected X11 connect request"); } else { c = snew(struct ssh_channel); c->ssh = ssh; if (x11_init(&c->u.x11.s, ssh->cfg.x11_display, c, ssh->x11auth, NULL, -1, &ssh->cfg) != NULL) { logevent("opening X11 forward connection failed"logevent ("opening X11 forward connection succeeded");X11Opened X11 forward channel"); } } } else if (ssh->pktin.type == SSH1_SMSG_AGENT_OPEN) { /* Remote side is trying to open a channel to talk to our * agent. Give them back a local channel number. */ struct ssh_channel *c; /* Refuse if agent forwarding is disabled. */ if (!ssh->agentfwd_enabled) { send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, GET_32BIT(ssh->pktin.body), PKT_END); } else { c = snew(struct ssh_channel); c->ssh = ssh; c->remoteid = GET_32BIT(ssh->pktin.body); c->localid = alloc_channel_id(ssh); c->closes = 0; c->v.v1.throttling = 0; c->type = C; int replylen; if (agent_query(c->u.a.message, c->u.a.totallen, &reply, &replylen, ssh_agentf_callback, c)) ssh_agentf_callback(c, reply, replylenif (!agent_query(s->request, 5, &r, &s->responselen, ssh_agent_callback, ssh)) { do { crReturnV; if (ispkt) { bombout(("Unexpected data from server while" " waiting for agent response")); crStopV; } } while (ispkt || inlen > 0); r = ssh->agent_response; s->responselen = ssh->agent_response_len; }if (!agent_query(s->agentreq, s->len + 4, &vret, &s->retlen, ssh_agent_callback, ssh)) { do { crReturnV; if (ispkt) { bombout(("Unexpected data from server" " while waiting for agent" " response")); crStopV; } } while (ispkt || inlen > 0); vret = ssh->agent_response; s->retlen = ssh->agent_response_len; }; int replylen; if (agent_query(c->u.a.message, c->u.a.totallen, &reply, &replylen, ssh_agentf_callback, c)) ssh_agentf_callback(c, reply, replylen Node-path: putty/unix/uxagentc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f213a6febc5f5496e8442e8f616a3ceb Text-delta-base-sha1: 5800e4c355b8329b8662e635b7e9a554713a2ab8 Text-content-length: 2761 Text-content-md5: 4b89f49dca31bc0aae18f523f4d838be Text-content-sha1: 46fe94f36e70457ced48bf8b0f56d7b6f9bd78e5 Content-length: 2800 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN\((h,>$S>putty.h" #include "misc.h" #include "tree234static tree234 *agent_connections; struct agent_connection { int fd; char *retbuf; char sizebuf[4]; int retsize, retlen; void (*callback)(void *, void *, int); void *callback_ctx; }; static int agent_conncmp(void *av, void *bv) { struct agent_connection *a = (struct agent_connection *) av; struct agent_connection *b = (struct agent_connection *) bv; if (a->fd < b->fd) return -1; if (a->fd > b->fd) return +1; return 0; } static int agent_connfind(void *av, void *bv) { int afd = *(int *) av; struct agent_connection *b = (struct agent_connection *) bv; if (afd < b->fd) return -1; if (afd > b->fd) return +1; return 0; } static int agent_select_result(int fd, int event) { int ret; struct agent_connection *conn; assert(event == 1); /* not selecting for anything but R */ conn = find234(agent_connections, &fd, agent_connfind); if (!conn) { uxsel_del(fd); return 1; } ret = read(fd, conn->retbuf+conn->retlen, conn->retsize-conn->retlen); if (ret <= 0) { if (conn->retbuf != conn->sizebuf) sfree(conn->retbuf); conn->retbuf = NULL; conn->retlen = 0; goto done; } conn->retlen += ret; if (conn->retsize == 4 && conn->retlen == 4) { conn->retsize = GET_32BIT(conn->retbuf); if (conn->retsize <= 0) { conn->retbuf = NULL; conn->retlen = 0; goto done; } conn->retsize += 4; assert(conn->retbuf == conn->sizebuf); conn->retbuf = snewn(conn->retsize, char); memcpy(conn->retbuf, conn->sizebuf, 4); } if (conn->retlen < conn->retsize) return 0; /* more data to come */ done: /* * We have now completed the agent query. Do the callback, and * clean up. (Of course we don't free retbuf, since ownership * of that passes to the callback.) */ conn->callback(conn->callback_ctx, conn->retbuf, conn->retlen); uxsel_del(fd); close(fd); del234(agent_connections, conn); sfree(conn); return 0; } int agent_query(void *in, int inlen, void **out, int *outlen, void (*callback)(void *, void *, int), void *callback_ctx) { char *name; int sock; struct sockaddr_un addr; int done; struct agent_connection *connif (!agent_connections) agent_connections = newtree234(agent_conncmp); conn = snew(struct agent_connection); conn->fd = sock; conn->retbuf = conn->sizebuf; conn->retsize = 4; conn->retlen = 0; conn->callback = callback; conn->callback_ctx = callback_ctx; add234(agent_connections, conn); uxsel_set(sock, 1, agent_select_result); return 0; failure: *out = NULL; *outlen = 0; return 1; } Revision-number: 3154 Prop-content-length: 434 Content-length: 434 K 8 svn:date V 27 2003-04-28T13:59:32.000000Z K 7 svn:log V 333 Asynchronous agent requests on Windows. Actually, I've kept the ability to do synchronous ones as well, because PSCP and PSFTP don't really need async ones and it would have been a serious pain to implement them. Also, Pageant itself when run as a client of its primary instance doesn't benefit noticeably from async agent requests. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9a5dc45f6d7e0354b73e38ab7d1aa0f7 Text-delta-base-sha1: 4a3a7799ab1fb73456452a3eb46e8bba967a510f Text-content-length: 357 Text-content-md5: 044704afe344c257805f8a4c078bbae9 Text-content-sha1: 678992174a82fb8cd77d70982d0a74411335b214 Content-length: 397 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNl IpIQ/* * This is a can't-happen stub, since Pageant never makes * asynchronous agent requests. */ void agent_schedule_callback(void (*callback)(void *, void *, int), void *callback_ctx, void *data, int len) { assert(!"We shouldn't get here"); } void cleanup_exit(int code) { exit(code); } int flags = FLAG_SYNCAGENT; Node-path: putty/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 47e201d7780fb73ded8ebdf065794155 Text-delta-base-sha1: a385bd5958b4ea6eec923a447f6c9b79e3df54c5 Text-content-length: 2029 Text-content-md5: c2ad17d229e59fde114ee2d58628c94f Text-content-sha1: 6a5f4456005e98fabe1d682abbe332ba6ccf27a0 Content-length: 2068 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN|f.3l_otH3-U&UWMu4-struct agent_query_data { COPYDATASTRUCT cds; unsigned char *mapping; HANDLE handle; char *mapname; HWND hwnd; void (*callback)(void *, void *, int); void *callback_ctx; }; DWORD WINAPI agent_query_thread(LPVOID param) { struct agent_query_data *data = (struct agent_query_data *)param; unsigned char *ret; int id, retlen; id = SendMessage(data->hwnd, WM_COPYDATA, (WPARAM) NULL, (LPARAM) &data->cds); ret = NULL; if (id > 0) { retlen = 4 + GET_32BIT(data->mapping); ret = snewn(retlen, unsigned char); if (ret) { memcpy(ret, data->mapping, retlen); } } if (!ret) retlen = 0; UnmapViewOfFile(data->mapping); CloseHandle(data->handle); sfree(data->mapname); agent_schedule_callback(data->callback, data->callback_ctx, ret, retlen); return 0*mapnameif (!hwnd) return 1; /* *out == NULL, so failure */ mapname = dupprintf(f (callback != NULL && !(flags & FLAG_SYNCAGENT)) { /* * We need an asynchronous Pageant request. Since I know of * no way to stop SendMessage from blocking the thread it's * called in, I see no option but to start a fresh thread. * When we're done we'll PostMessage the result back to our * main window, so that the callback is done in the primary * thread to avoid concurrency. */ struct agent_query_data *data = snew(struct agent_query_data); DWORD threadid; data->mapping = p; data->handle = filemap; data->mapname = mapname; data->callback = callback; data->callback_ctx = callback_ctx; data->cds = cds; /* structure copy */ data->hwnd = hwnd; if (CreateThread(NULL, 0, agent_query_thread, data, 0, &threadid)) return 0; sfree(data); } /* * The user either passed a null callback (indicating that the * query is required to be synchronous) or CreateThread failed. * Either way, we need a synchronous request. */if (id > 0) { retlen = 4 + GET_32BIT(p return 1; } Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e09df7c214084cea8162ff531ede8df2 Text-delta-base-sha1: e05807fdca3482251b6b70966383f6279757b328 Text-content-length: 1021 Text-content-md5: c8e5ec2a5901114b1713765508a838e9 Text-content-sha1: cdd58cd8470ad46c4bd6323608d511f9dcd5b9e4 Content-length: 1061 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVNh*E`<>v}o/cN*.:WM_AGENT_CALLBACK (WM_XUSER + 4) #define MAX_STDIN_BACKLOG 4096 struct agent_callback { void (*callback)(void *, void *, int); void *callback_ctx; void *data; int len; };static DWORD main_thread_id; void agent_schedule_callback(void (*callback)(void *, void *, int), void *callback_ctx, void *data, int len) { struct agent_callback *c = snew(struct agent_callback); c->callback = callback; c->callback_ctx = callback_ctx; c->data = data; c->len = len; PostThreadMessage(main_thread_id, WM_AGENT_CALLBACK, 0, (LPARAM)c)main_thread_id = GetCurrentThreadId(MsgWaitForMultipleObjects(4, handles, FALSE, INFINITE, QS_POSTMESSAG else if (n == 4) { MSG msg; while (PeekMessage(&msg, INVALID_HANDLE_VALUE, WM_AGENT_CALLBACK, WM_AGENT_CALLBACK, PM_REMOVE)) { struct agent_callback *c = (struct agent_callback *)msg.lParam; c->callback(c->callback_ctx, c->data, c->len); sfree(c Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9c74736149e57c3726ed8a91300c63f4 Text-delta-base-sha1: 308023df15344ae5d426eb5a61da654905d2f5a8 Text-content-length: 300 Text-content-md5: 99001b5b35b43af184ad795aafa904ab Text-content-sha1: b637754c7a8138e76c7240ed94c9901abf986dca Content-length: 340 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN\m Vx4NZIn psftp, all agent requests should be synchronous, so this is a * never-called stub. */ void agent_schedule_callback(void (*callback)(void *, void *, int), void *callback_ctx, void *data, int len) { assert(!"We shouldn't be here"); } | FLAG_SYNCAGENT Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 074e71a7e025dc3e4485b6dfcac74874 Text-delta-base-sha1: 7008d423d6ac5ad37ed14287376bbfd179984bc6 Text-content-length: 179 Text-content-md5: f7a28bb5d30249b99960d054f67910c9 Text-content-sha1: faca1b8ba856c329cbcb86fe8914c2804cc74be3 Content-length: 220 K 15 cvs2svn:cvs-rev V 5 1.216 PROPS-END SVNd qwm * Note that additional flags may be defined in platform-specific * headers. It's probably best if those ones start from 0x1000, to * avoid collision Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ce209a1330c7529f43d66a3afcca3c62 Text-delta-base-sha1: 50b0d666e23a5578897fa86e71cb7b5a3a407def Text-content-length: 298 Text-content-md5: d26b24ec62b24a85f712c3a7c24ebfbe Text-content-sha1: 38877c5382a56aef0f5a167a6c54c18af4757366 Content-length: 339 K 15 cvs2svn:cvs-rev V 5 1.104 PROPS-END SVN/?-wC%GhIn pscp, all agent requests should be synchronous, so this is a * never-called stub. */ void agent_schedule_callback(void (*callback)(void *, void *, int), void *callback_ctx, void *data, int len) { assert(!"We shouldn't be here"); } | FLAG_SYNCAGENT Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f393b627d7778cb3bedb8ca045d32509 Text-delta-base-sha1: ddea3f468fdf9deb075d516da2db35780ff97834 Text-content-length: 1104 Text-content-md5: 562fcf9fb0f1b82adf39ec9df6adc847 Text-content-sha1: f5c97cefaa9967755a8d8db75b14cde9c8bc1a44 Content-length: 1145 K 15 cvs2svn:cvs-rev V 5 1.244 PROPS-END SVN[~@|z&::A_#define WM_AGENT_CALLBACK (WM_XUSER + 4struct agent_callback { void (*callback)(void *, void *, int); void *callback_ctx; void *data; int len; }; break; case WM_AGENT_CALLBACK: { struct agent_callback *c = (struct agent_callback *)lParam; c->callback(c->callback_ctx, c->data, c->len); sfree(c); } return 0;#W 4`#Tthe * clipboard with no difficulty, so request_paste() can just go * ahead and paste. */ term_do_paste(term); } void set_title(void *frontend, char *title) { sfree(window_name); window_name = snewn(1 + strlen(title), char); strcpy(window_name, title); if (cfg.win_name_always || !IsIconic(hwnd)) SetWindowText(hwnd, void agent_schedule_callback(void (*callback)(void *, void *, int), void *callback_ctx, void *data, int len) { struct agent_callback *c = snew(struct agent_callback); c->callback = callback; c->callback_ctx = callback_ctx; c->data = data; c->len = len; PostMessage(hwnd, WM_AGENT_CALLBACK, 0, (LPARAM)c); } Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 90bc7a4558062a8f8e0c372c4b4fa92f Text-delta-base-sha1: 39756a60548835b229d35f943c20a465ea80fd1b Text-content-length: 465 Text-content-md5: 0d2b8f4adeace55feb7a6cb5ec7e60fc Text-content-sha1: dea58f410712bc7587a948ec93b1a6edd2e5448f Content-length: 505 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNH ;A; ?/* * pageantc.c needs to schedule callbacks for asynchronous agent * requests. This has to be done differently in GUI and console, so * there's an exported function used for the purpose. * * Also, we supply FLAG_SYNCAGENT to force agent requests to be * synchronous in pscp and psftp. */ void agent_schedule_callback(void (*callback)(void *, void *, int), void *callback_ctx, void *data, int len); #define FLAG_SYNCAGENT 0x1000 Revision-number: 3155 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2003-04-28T14:00:20.000000Z K 7 svn:log V 6 Done. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/pageant-async Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1a9cd1ed6c1833ba290bd203f635a69a Text-delta-base-sha1: d29dd4b2dadf0f28d569a86bea6bc0ef8ffaec82 Text-content-length: 114 Text-content-md5: 34c2d5c85903dd0189ae5f935f049a81 Text-content-sha1: fc4b24172e678210cc2dbdf3eb5688830d7dbd25 Content-length: 153 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN9 ]}=|IFixed-in: 2003-04-29 SGT, 2003-04-28: This was indeed tricky, but should now be done. Revision-number: 3156 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2003-04-28T14:46:17.000000Z K 7 svn:log V 69 Reorganise download page to encourage use of development source code K 10 svn:author V 4 owen PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4e28905b91fb95e4f1d533226150f990 Text-delta-base-sha1: 951a9a2d18c99b1296278d71498e530eb76138d9 Text-content-length: 528 Text-content-md5: d16f101bd39a4c6f1949b38de4fdd80d Text-content-sha1: f6015da8dc845665465ea3f62edb0f9abace107e Content-length: 567 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNk^U-m:jwvT?O@Q@h7`!qm=V;)vJ7dmx;17[h2>Binariesthe.earth.li/~sgtatham/putty/latest/md5sums">md5sumsmd5sumsmd5sumsSource Code

    If you want to do any PuTTY development work, we strongly recommend starting with development snapshot code. We frequently make large changes to the code after major releases, so code based on the current release will be hard for us to use. --> Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b79d02bbd563a7928ac838c497cfa0a2 Text-delta-base-sha1: 1c90db2930c03c7165dffe5431c5e31d0e6bd55a Text-content-length: 537 Text-content-md5: 29dd7135652513642e9101c8d5acde18 Text-content-sha1: 017feef9069dcae217a2cac9e76c0b2cd4949bd0 Content-length: 576 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN&6 mH^6-12 Nightly snapshots moving; Alpha down

    We no longer have access to the machines that have been building the PuTTY nightly snapshots, and so we are moving them to a different machine. Please bear with us if things are not where they should be for a few days.

    As a side effect of this move, we unfortunately no longer have the facilities to build for NT Alpha. If anyone still needs Alpha builds of PuTTY, they will need to provide us with an Alpha machine (or an account on one) to do the builds on. Node-path: putty-website/keys.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7dc29e650f7b1e1f464d07e82872bebf Text-delta-base-sha1: 295bc6da39f908edfa3f0bdee935d17439c1a436 Text-content-length: 334 Text-content-md5: d72a8cb4b3c390e3878661a1ea8c1ecc Text-content-sha1: 481615b29deee6f6b54b00a4f19d04966d872a1c Content-length: 373 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN&=l |UT4*ya team member's home Windows box. The keys themselves are stored on an independently run Unix box outside that company (the same one that hosts our CVS repository). After being built, the binaries are uploaded to this Unix box and then take all reasonable precautions to guard the build machine Revision-number: 3261 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2003-06-13T14:44:30.000000Z K 7 svn:log V 44 Remove another reference to "that company". K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/keys.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d72a8cb4b3c390e3878661a1ea8c1ecc Text-delta-base-sha1: 481615b29deee6f6b54b00a4f19d04966d872a1c Text-content-length: 22 Text-content-md5: 68fb6847046f9a478a865ffe26f9efdf Text-content-sha1: a3f8f87d53ba34c01d0013c2ae3d24dade9e2921 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNp Q4 Revision-number: 3262 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2003-06-14T18:27:10.000000Z K 7 svn:log V 60 Fix a couple of memory leaks pointed out by Adam Bernstein. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2f6c6468cb983cc2392e91367521378e Text-delta-base-sha1: a368a87b20a2fbb93e526caee069e948846db61d Text-content-length: 162 Text-content-md5: 2c7123ade548d7255956527d7f1bb7b2 Text-content-sha1: b8fa609939deb2b3df62dc90ed4365fcb19cd500 Content-length: 203 K 15 cvs2svn:cvs-rev V 5 1.297 PROPS-END SVN; #( { sk_addr_free(addr); return err; }sk_addr_free(addrD5, NULL, 0, 0); logevent("Received disconnect reques Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 12ff41c54db1f027823f025b9512cdb2 Text-delta-base-sha1: 36de0bd4d13ad74456837ae7bd066f39842e1c38 Text-content-length: 30 Text-content-md5: 38adf51b7451d80629df57a62c16b3ef Text-content-sha1: 7c29c6bf2ccedabf6b886f159202e8fa1091ee18 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN, Ab9sfree(buf Revision-number: 3263 Prop-content-length: 293 Content-length: 293 K 7 svn:log V 194 Support for more SCO ANSI escape sequences: CSI = Ps c CSI = Pn1 ; Pn2 C CSI = Ps D CSI = Ps F CSI = Ps G SGR 6 Patch derived from one supplied by Leonid Lisoskiy, with several fixes from me. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-06-15T22:05:05.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 18e2218ff32f5a1a2930457d9544a44c Text-delta-base-sha1: 5b2dbd843d3ad5e50a2e043225782cfa5bd79078 Text-content-length: 4087 Text-content-md5: 08638c7fd33238c3585259461b7e96a6 Text-content-sha1: 358443ea65d2d9aa74a6ec168ca811ea94c5b0f9 Content-length: 4128 K 15 cvs2svn:cvs-rev V 5 1.158 PROPS-END SVN#<:\(ksY?const char sco2ansicolour[] = { 0, 4, 2, 6, 1, 5, 3, 7 };6: /* SCO light bkgrd */ compatibility(SCOANSI); term->blink_is_real = FALSEc', '='): /* Hide or Show Cursor */ compatibility(SCOANSI); switch(term->esc_args[0]) { case 0: /* hide cursor */ term->cursor_on = FALSE; break; case 1: /* restore cursor */ term->big_cursor = FALSE; term->cursor_on = TRUE; break; case 2: /* block cursor */ term->big_cursor = TRUE; term->cursor_on = TRUE; break; } break; case ANSI('C', '='): /* * set cursor start on scanline esc_args[0] and * end on scanline esc_args[1].If you set * the bottom scan line to a value less than * the top scan line, the cursor will disappear. */ compatibility(SCOANSI); if (term->esc_nargs >= 2) { if (term->esc_args[0] > term->esc_args[1]) term->cursor_on = FALSE; else term->cursor_on = TRUE; } break; case ANSI('D', '='): compatibility(SCOANSI); term->blink_is_real = FALSE; if (term->esc_args[0]>=1) term->curr_attr |= ATTR_BLINK; else term->curr_attr &= ~ATTR_BLINK; break; case ANSI('E', '='): compatibility(SCOANSI); term->blink_is_real = (term->esc_args[0] >= 1); break; case ANSI('F', '='): /* set normal foreground */ compatibility(SCOANSI); if (term->esc_args[0] >= 0 && term->esc_args[0] < 16) { term->curr_attr &= ~ATTR_FGMASK; term->curr_attr |= (sco2ansicolour[term->esc_args[0] & 0x7] | ((term->esc_args[0] & 0x8) << 1)) << ATTR_FGSHIFT; } break; case ANSI('G', '='): /* set normal background */ compatibility(SCOANSI); if (term->esc_args[0] >= 0 && term->esc_args[0] < 16) { term->curr_attr &= ~ATTR_BGMASK; term->curr_attr |= (sco2ansicolour[term->esc_args[0] & 0x7] | ((term->esc_args[0] & 0x8) << 1)) << ATTR_BGSHIFT; } break; case ANSI('L', '='): compatibility(SCOANSIf22f j < term->cols; j++) term->disptext[i * (term->cols + 1) + j] = ATTR_INVALID; else for (j = left / 2; j <= right / 2 + 1 && j < term->cols; j++) term->disptext[i * (term->cols + 1) + j] = ATTR_INVALID; } /* This should happen soon enough, also for some reason it sometimes * fails to actually do anything when re-sizing ... painting the wrong * window perhaps ? */ if (immediately) do_paint (term, ctx, FALSE); } /* * Attempt to scroll the scrollback. The second parameter gives the * position we want to scroll to; the first is +1 to denote that * this position is relative to the beginning of the scrollback, -1 * to denote it is relative to the end, and 0 to denote that it is * relative to the current position. */ void term_scroll(Terminal *term, int rel, int where) { int sbtop = -sblines(term); #ifdef OPTIMISE_SCROLL int olddisptop = term->disptop; int shift; #endif /* OPTIMISE_SCROLL */ term->disptop = (rel < 0 ? 0 : rel > 0 ? sbtop : term->disptop) + where; if (term->disptop < sbtop) term->disptop = sbtop; if (term->disptop > 0) term->disptop = 0; update_sbar(term); #ifdef OPTIMISE_SCROLL shift = (term->disptop - olddisptop); if (shift < term->rows && shift > -term->rows) scroll_display(term, 0, term->rows - 1, shift); #endif /* OPTIMISE_SCROLL */ term_update(term); } static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel) { wchar_t *workbuf; wchar_t *wbptr; /* where next char goes within workbuf */ int old_top_x; int wblen = 0; /* workbuf len */ int buflen; /* amount of memory allocated to workbuf */ buflen = 5120; /* Default size */ workbuf = snewn(buflen, wchar_t); wbptr = workbuf; /* start filling here */ old_top_x = top.x; /* needed for rect==1 */ while (poslt(top, bottom)) { int nl = FALSE; unsigned long *ldata = lineptr(t Revision-number: 3264 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 66 Update for current state of world (some sequences still missing). K 10 svn:author V 3 ben K 8 svn:date V 27 2003-06-16T11:45:24.000000Z PROPS-END Node-path: putty-wishlist/data/sco-ansi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: acbf8ae181328230a3d3b1eb7cd27246 Text-delta-base-sha1: afca635a0e2f4b1ace2f0c3930f0fb691d219cd6 Text-content-length: 120 Text-content-md5: 03085c02852b52a7c6f86449c10bc2c4 Text-content-sha1: 66f4defe831a16653c8dd4c36d396af4cb392130 Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNZaYhu8].N These two are supported by PuTTY

    
    These two aren't yet supported.
    
    
    Revision-number: 3265
    Prop-content-length: 134
    Content-length: 134
    
    K 8
    svn:date
    V 27
    2003-06-16T15:12:56.000000Z
    K 7
    svn:log
    V 35
    More info on Windows message faff.
    
    K 10
    svn:author
    V 4
    owen
    PROPS-END
    
    Node-path: putty-wishlist/data/double-keystrokes
    Node-kind: file
    Node-action: change
    Prop-delta: true
    Prop-content-length: 39
    Text-delta: true
    Text-delta-base-md5: aeb9cc72ffd587fd73b066fffa0685d4
    Text-delta-base-sha1: cc83d09db471943d860fcb43fb13c34cbf6a3205
    Text-content-length: 624
    Text-content-md5: 7ff340277969dbec5e92f39ce75be5cd
    Text-content-sha1: 70974ecbc12fdba27a5aa4601f4a4dc8081413a9
    Content-length: 663
    
    K 15
    cvs2svn:cvs-rev
    V 3
    1.3
    PROPS-END
    SVNH%]H]
    OSD: The implicit message loop in DialogBox is doing
    TranslateMessage() (windlg.c, line 647).  We need to change it to use
    CreateDialog and then have our own non-translating message loop:
    
        MSG msg;
        HWND boxhwnd;
    
        boxhwnd =
        CreateDialog(hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL,
    			  GenericMainDlgProc);
    
        while (IsWindow(boxhwnd) && GetMessage(&msg, NULL, 0, 0)) {
        if (!IsDialogMessage(boxhwnd, &msg))
            DispatchMessage(&msg);
        }
    
    This fixes the double characters, but doesn't correctly get rid of the
    dialogue box because EndDialog() only works with DialogBox().  Bah.
    
    
    Revision-number: 3266
    Prop-content-length: 282
    Content-length: 282
    
    K 7
    svn:log
    V 181
    pu.tty.se
    gnu.kookel.org (website only -- the lists of FTP links are well out of date
    anyway)
    
    Soften language -- I don't think that every website mirror fails to rewrite
    FTP URLs.
    
    K 10
    svn:author
    V 5
    jacob
    K 8
    svn:date
    V 27
    2003-06-16T22:09:48.000000Z
    PROPS-END
    
    Node-path: putty-website/mirrors.html
    Node-kind: file
    Node-action: change
    Prop-delta: true
    Prop-content-length: 40
    Text-delta: true
    Text-delta-base-md5: 71071cc9fb030885ba86410bd49a66ec
    Text-delta-base-sha1: f7e69c7b60ec63fc6eeff9770d5f4ae5b68a3d04
    Text-content-length: 122
    Text-content-md5: 082c15b42d40de9cafbfa5c34bf5d335
    Text-content-sha1: b09dcd47cd35f3cb8fa0694997418a4c827eb2b5
    Content-length: 162
    
    K 15
    cvs2svn:cvs-rev
    V 4
    1.30
    PROPS-END
    SVNA)U!V{9%{)gnu.kookel.org/ftp/putty/">gnu.kookel.orgpu.tty.se/">pu.tty.sein many cases,
    none of 
    
    Revision-number: 3267
    Prop-content-length: 146
    Content-length: 146
    
    K 7
    svn:log
    V 47
    Fix double-keystrokes by wrapping CreateDialog
    
    K 10
    svn:author
    V 4
    owen
    K 8
    svn:date
    V 27
    2003-06-16T23:55:26.000000Z
    PROPS-END
    
    Node-path: putty/windlg.c
    Node-kind: file
    Node-action: change
    Prop-delta: true
    Prop-content-length: 41
    Text-delta: true
    Text-delta-base-md5: e458d64e3b132a0a32ecbb94ebd2b2fa
    Text-delta-base-sha1: 1991c6b0b355fc98128de125f2b223a43958c2a8
    Text-content-length: 68
    Text-content-md5: 12b26d5d34e009dcc5ca450cc121d9c7
    Text-content-sha1: 1281f769216aa8eea34d5bf9a4f99f4ab7ac10e0
    Content-length: 109
    
    K 15
    cvs2svn:cvs-rev
    V 5
    1.213
    PROPS-END
    SVNq"w,wI#cl{O%LSaneSaneSaneSane Sane
    
    Node-path: putty/winmisc.c
    Node-kind: file
    Node-action: change
    Prop-delta: true
    Prop-content-length: 39
    Text-delta: true
    Text-delta-base-md5: 0513c3a6ecc6b2b2949acbc5b3f3c500
    Text-delta-base-sha1: 6dea5f80ecc57e1c6d2a22110566a8ccf022827c
    Text-content-length: 603
    Text-content-md5: d5d4556eac1115a15aa92fbe7d9db1ab
    Text-content-sha1: 263bb2b5074f9db9df09d91697a8ee95fdc3aa61
    Content-length: 642
    
    K 15
    cvs2svn:cvs-rev
    V 3
    1.5
    PROPS-END
    SVNY==+@#include "winstuffint SaneDialogBox(HINSTANCE hinst,
    		  LPCTSTR tmpl,
    		  HWND hwndparent,
    		  DLGPROC lpDialogFunc)
    {
        HWND boxhwnd;
        MSG msg;
        
        boxhwnd = CreateDialog(hinst, tmpl, hwndparent, lpDialogFunc);
        while (GetMessage(&msg, NULL, 0, 0)) {
    	if (!(boxinfo.flags & DF_END) && !IsDialogMessage(boxhwnd, &msg))
    	    DispatchMessage(&msg);
    	if (boxinfo.flags & DF_END) break;
        }
        boxinfo.flags=0;
        return boxinfo.result;
    }
    
    void SaneEndDialog(HWND hwnd, int ret)
    {
        boxinfo.result = ret;
        boxinfo.flags |= DF_END;
        DestroyWindow(hwnd)
    
    Node-path: putty/winstuff.h
    Node-kind: file
    Node-action: change
    Prop-delta: true
    Prop-content-length: 40
    Text-delta: true
    Text-delta-base-md5: 0d2b8f4adeace55feb7a6cb5ec7e60fc
    Text-delta-base-sha1: dea58f410712bc7587a948ec93b1a6edd2e5448f
    Text-content-length: 365
    Text-content-md5: dc6bb5699082ae296e641414b845e4ea
    Text-content-sha1: 43d9c8d71a29441205d1beffdedb8b319bf85305
    Content-length: 405
    
    K 15
    cvs2svn:cvs-rev
    V 4
    1.36
    PROPS-END
    SVNnGLb`t"cstruct dlgboxinfo {
        int result;
        int flags;
    };
    
    #define DF_END 0x0001Global structure to hold return values from the config box.
     */
    GLOBAL struct dlgboxinfo boxinfowinmisc.c.
     */
    
    int SaneDialogBox(HINSTANCE hinst,
    		  LPCTSTR tmpl,
    		  HWND hwndparent,
    		  DLGPROC lpDialogFunc);
    
    void SaneEndDialog(HWND hwnd, int ret
    
    Revision-number: 3268
    Prop-content-length: 115
    Content-length: 115
    
    K 8
    svn:date
    V 27
    2003-06-17T00:03:02.000000Z
    K 7
    svn:log
    V 16
    Fixed, we hope.
    
    K 10
    svn:author
    V 4
    owen
    PROPS-END
    
    Node-path: putty-wishlist/data/double-keystrokes
    Node-kind: file
    Node-action: change
    Prop-delta: true
    Prop-content-length: 39
    Text-delta: true
    Text-delta-base-md5: 7ff340277969dbec5e92f39ce75be5cd
    Text-delta-base-sha1: 70974ecbc12fdba27a5aa4601f4a4dc8081413a9
    Text-content-length: 97
    Text-content-md5: c36cabb44f41ebc09333d06198bcfa93
    Text-content-sha1: 818390f0490910848c1f3080b113c640ae2ce08c
    Content-length: 136
    
    K 15
    cvs2svn:cvs-rev
    V 3
    1.4
    PROPS-END
    SVN%qKFixed-in: 2003-06-18
    So we wrap CreateDialog() in our own SaneDialogBox().
    
    
    Revision-number: 3269
    Prop-content-length: 113
    Content-length: 113
    
    K 8
    svn:date
    V 27
    2003-06-17T22:06:04.000000Z
    K 7
    svn:log
    V 13
    putty.ion.lu
    
    K 10
    svn:author
    V 5
    jacob
    PROPS-END
    
    Node-path: putty-website/mirrors.html
    Node-kind: file
    Node-action: change
    Prop-delta: true
    Prop-content-length: 40
    Text-delta: true
    Text-delta-base-md5: 082c15b42d40de9cafbfa5c34bf5d335
    Text-delta-base-sha1: b09dcd47cd35f3cb8fa0694997418a4c827eb2b5
    Text-content-length: 64
    Text-content-md5: 2471bf88f9e3c6db5d81c3048122e5dd
    Text-content-sha1: 2054d463a3fd7b8716520727fbb2579f14004489
    Content-length: 104
    
    K 15
    cvs2svn:cvs-rev
    V 4
    1.31
    PROPS-END
    SVN)'yA0yion.lu/">putty.ion.lu in Luxembourg
    
    Revision-number: 3270
    Prop-content-length: 56
    Content-length: 56
    
    K 8
    svn:date
    V 27
    2006-09-06T12:10:30.357176Z
    PROPS-END
    
    Revision-number: 3271
    Prop-content-length: 56
    Content-length: 56
    
    K 8
    svn:date
    V 27
    2006-09-06T12:10:30.366245Z
    PROPS-END
    
    Revision-number: 3272
    Prop-content-length: 263
    Content-length: 263
    
    K 8
    svn:date
    V 27
    2003-06-18T13:55:50.000000Z
    K 7
    svn:log
    V 162
    Summary: Ability to do NTLM authentication in various contexts (eg. proxy)
    Difficulty: taxing
    Priority: low
    
    Some very vague wittering about NTLM authentication.
    
    K 10
    svn:author
    V 5
    jacob
    PROPS-END
    
    Node-path: putty-wishlist/data/ntlm-auth
    Node-kind: file
    Node-action: add
    Prop-content-length: 116
    Text-delta: true
    Text-content-length: 445
    Text-content-md5: d6b36c444c097e0987365d79af3bee13
    Text-content-sha1: 45bfac543e2158a8faf10efb572190ca0295ce2f
    Content-length: 561
    
    K 13
    svn:eol-style
    V 6
    native
    K 15
    cvs2svn:cvs-rev
    V 3
    1.1
    K 12
    svn:keywords
    V 23
    Author Date Id Revision
    PROPS-END
    SVN///Summary: Ability to do NTLM authentication in various contexts (eg. proxy)
    Class: wish
    Difficulty: taxing
    Priority: low
    
    

    Occasionally people ask for support for NTLM authentication in various contexts (e.g. for HTTP proxy authentication).

    NTLM authentication appears to be proprietary to Microsoft; what public documentation there is appears to be reverse engineered. Revision-number: 3273 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 2003-06-18T16:24:34.000000Z K 7 svn:log V 9 xref FAQ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unicode-mappings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9d5fdbfb68813a02b692e51b465bfac5 Text-delta-base-sha1: 2dd78ec66d62b7cd60019b08153d5b9d7eea0cc2 Text-content-length: 114 Text-content-md5: 529d694703105784f7c79d02666f8552 Text-content-sha1: c0b918437e5073e21a7eaa926c19210b0e3978c0 Content-length: 153 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN%u \%\t1 well known Revision-number: 3274 Prop-content-length: 223 Content-length: 223 K 7 svn:log V 123 Make SaneDialogBox and SaneEndDialog use [GS]etWindowLong rather than a global variable. Should mean that pageant builds. K 10 svn:author V 4 owen K 8 svn:date V 27 2003-06-18T17:25:18.000000Z PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 62d6e120678b5ea2bf9efaccb5efc4b1 Text-delta-base-sha1: 99129f7e17f13ae173d57292b6a3afbddd29d5c5 Text-content-length: 42 Text-content-md5: c43304c2cd89aae3f543b9f69d374f2b Text-content-sha1: ea5730c48bea16ea65e18eab6ab8b57c64cc4411 Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVN[r LJCLASS "PuTTYConfigBox Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d5d4556eac1115a15aa92fbe7d9db1ab Text-delta-base-sha1: 263bb2b5074f9db9df09d91697a8ee95fdc3aa61 Text-content-length: 1092 Text-content-md5: 31c305c270a54a34b14f06b18c6dade9 Text-content-sha1: 8cd29d9e0932a980f82969b61a68a3ce194d3315 Content-length: 1131 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN ,E,WNDCLASS wc; HWND hwnd; MSG msg; int flags; int ret; wc.style = CS_DBLCLKS | CS_SAVEBITS | CS_BYTEALIGNWINDOW; wc.lpfnWndProc = DefDlgProc; wc.cbClsExtra = 0; wc.cbWndExtra = DLGWINDOWEXTRA + 8; wc.hInstance = hinst; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_BACKGROUND +1); wc.lpszMenuName = NULL; wc.lpszClassName = "PuTTYConfigBox"; RegisterClass(&wc); hwnd = CreateDialog(hinst, tmpl, hwndparent, lpDialogFunc); SetWindowLong(hwnd, BOXFLAGS, 0); /* flags */ SetWindowLong(hwnd, BOXRESULT, 0); /* result from SaneEndDialog */ while (GetMessage(&msg, NULL, 0, 0)) { flags=GetWindowLong(hwnd, BOXFLAGS); if (!(flags & DF_END) && !IsDialogMessage(hwnd, &msg)) DispatchMessage(&msg); if (flags & DF_END) break; } ret=GetWindowLong(hwnd, BOXRESULT); DestroyWindow(hwnd); return ret; } void SaneEndDialog(HWND hwnd, int ret) { SetWindowLong(hwnd, BOXRESULT, ret); SetWindowLong(hwnd, BOXFLAGS, DF_END Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dc6bb5699082ae296e641414b845e4ea Text-delta-base-sha1: 43d9c8d71a29441205d1beffdedb8b319bf85305 Text-content-length: 100 Text-content-md5: fc66140ffd58b654ea391105a378145d Text-content-sha1: 411af2340d924d257e9e4c4ad690de8a03087093 Content-length: 140 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNnDDPS'$:4#define BOXFLAGS DLGWINDOWEXTRA #define BOXRESULT DLGWINDOWEXTRA + 4 Revision-number: 3275 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2003-06-19T11:47:22.000000Z K 7 svn:log V 70 Update to match my current understanding. Reference Open Server docs. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/sco-ansi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 03085c02852b52a7c6f86449c10bc2c4 Text-delta-base-sha1: 66f4defe831a16653c8dd4c36d396af4cb392130 Text-content-length: 668 Text-content-md5: 22504eb156359b3bd47ce838114acc70 Text-content-sha1: fa054762ab69ccf6e7e23cbfec034d50c0153306 Content-length: 707 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNa ueq[_A%N Some of these are supported by PuTTY now.

    Colours

    There are various escape sequences which set the default colours used for various kinds of text PuTTY currently only supports the one for setting the default foreground and background (as of 2003-06-16), and gets even that wrong (it interprets it as setting the current forground and background). Select reverse color \027[=PsH Select reverse background color \027[=PsI robably the most autoritative definition is in the SCO Open Server manual page screen(HW) Revision-number: 3276 Prop-content-length: 254 Content-length: 254 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-06-19T13:05:39.000000Z K 7 svn:log V 153 Summary: Use of VirtualLock() on Windows for sensitive material Provides a place to hang Peter Gutmann's musings. Also linked to from pageant-hibernate. PROPS-END Node-path: putty-wishlist/data/pageant-hibernate Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1d9b4b7087e959e50cbc56d98cfdba0e Text-delta-base-sha1: 8680ff0573498670bd71b8445c174f58d2c1ab83 Text-content-length: 60 Text-content-md5: acda207d7b2cacc5ea3c926ebb5c3deb Text-content-sha1: 5e5267bc8a3e1494cf2f64c94e5b68386f98c7bd Content-length: 99 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNh), `virtuallock' Node-path: putty-wishlist/data/virtuallock Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1553 Text-content-md5: 150101d7af89d3ee29c3ea2fb5dc2e32 Text-content-sha1: 6f5b6e3db3ea5d96b5b5d28d33eecbd1086b7c95 Content-length: 1669 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: Use of VirtualLock() on Windows for sensitive material Class: wish Priority: low Content-type: text/x-html-body

    The FAQ gives our reasoning behind not trying to use VirtualLock() on Windows to prevent sensitive material such as private keys being written to disk.

    However, Peter Gutmann has the following comments:

    Actually this may no longer be totally accurate. I had a long discussion about this with some MS technical people and it appears that (at least in Win2K and newer) VirtualLock is more effective than expected. One of the MS guys tried everything possible to get VirtualLocked'd memory paged and couldn't get it swapped out. Unfortunately the info for different Windows versions and at different times has been conflicting, but it appears that with newer versions of Windows it has at least some positive effect. In retrospect I'm glad I was too lazy to take the old VirtualLock() code out of cryptlib.

    Note that if you do use VirtualLock() you have to jump through a number of hoops to handle page-granularity, because although it looks like it's byte- aligned it's really page-aligned, and unlocking one region can have the side- effect of unlocking nearby regions.

    Message-Id: <200305240418.h4O4I6t19012@medusa01.cs.auckland.ac.nz> Revision-number: 3277 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2003-06-19T13:07:21.000000Z K 7 svn:log V 13 Content-type K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ntlm-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d6b36c444c097e0987365d79af3bee13 Text-delta-base-sha1: 45bfac543e2158a8faf10efb572190ca0295ce2f Text-content-length: 49 Text-content-md5: df7d6e4514506f6324dcd270ef96c7ab Text-content-sha1: 3dd1e0f46ccbcfefbdb3d3583c119f742680a4d3 Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN/Nx8wContent-type: text/x-html-body Revision-number: 3278 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2003-06-19T20:42:32.000000Z K 7 svn:log V 61 Fix for `double-alt-keystrokes'. Thanks to Leonid Lisovskiy. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b4732e4d5de7c44a69f7fe6a6e752f16 Text-delta-base-sha1: 0b83f95807df63a1118c0dd877e2f86c9019ea6c Text-content-length: 140 Text-content-md5: a0ada442a6f9f35d0a14d9d258f41d2f Text-content-sha1: fde41fe364aa10b1f7b427465d68655260a087bd Content-length: 181 K 15 cvs2svn:cvs-rev V 5 1.248 PROPS-END SVN WYWP& { term_seen_key_event(term); lpage_send(ldisc, kbd_codepage, &ch, 1, 1); }=G = * In Wind Revision-number: 3279 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2003-06-19T20:43:28.000000Z K 7 svn:log V 27 Fix from Leonid Lisovskiy. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/double-alt-keystrokes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1e0597630423a80ca12dc957aeb06c1c Text-delta-base-sha1: d2f1dab1c262ac0bb6d7339da48ce22262f56170 Text-content-length: 41 Text-content-md5: 7c0bdcdc27df8dc168d8e2ce2b2d46ba Text-content-sha1: e8af5103b11030ef68ff126b0dfc7acc8e9674de Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN+@  " Fixed-in: 2003-06-20 Revision-number: 3280 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 66 Fix problem quitting terminal window while Change Settings active K 10 svn:author V 4 owen K 8 svn:date V 27 2003-06-19T23:04:50.000000Z PROPS-END Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 31c305c270a54a34b14f06b18c6dade9 Text-delta-base-sha1: 8cd29d9e0932a980f82969b61a68a3ce194d3315 Text-content-length: 166 Text-content-md5: d564b52bb835406175d6cb3d40a741d2 Text-content-sha1: c623f516167cccb4b4483b101338576eaebf766a Content-length: 205 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN z Y*}Tj! int gm(gm=GetMessage(&msg, NULL, 0, 0)) > 0if (gm == 0) PostQuitMessage(msg.wParam); /* We got a WM_QUIT, pass it on */ Revision-number: 3281 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2003-06-21T12:23:22.000000Z K 7 svn:log V 15 Patch from RDB K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rlogin-blocked Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 33142166a56d4e2ff113820e15ee5539 Text-delta-base-sha1: d5fdb7315c2f999d704de558e05c3f6858948d8b Text-content-length: 89 Text-content-md5: e741f9fabf63ef2fbb0738ba5addc411 Text-content-sha1: f8562e316da276a653b5d2053d53514e491e050c Content-length: 128 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNZ"HZH

    Patch (unreviewed): 5fc25d0d5ffaa003@mayday.cix.co.uk Revision-number: 3282 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2003-06-21T19:34:36.000000Z K 7 svn:log V 145 Remove -DNO_SECURITY from the cygwin build, since has been available in cygwin for a year and a half. Pointed out by Bruno Kozlowski. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b695d8478b6a8ee502ee9a05f65eaed Text-delta-base-sha1: d2da9e1f4d35fee57b31dc557e60e4e3d1033fa2 Text-content-length: 20 Text-content-md5: d99fa142b9bb0804510fb53529ea17aa Text-content-sha1: 5c576ad76681a48c1550ef902f29e74e41307742 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNvI de Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ea14eaedf0fe6b9e774632e1b0dfbc38 Text-delta-base-sha1: cf1e83344239b8ed96f782fa4d4a338052ca5612 Text-content-length: 22 Text-content-md5: b350a2a606aac9ea3daa140c3d33a67a Text-content-sha1: 882eb96afb841e7a49afe9b5c7e9145b8f2e6e37 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVNvh 08> Revision-number: 3283 Prop-content-length: 290 Content-length: 290 K 8 svn:date V 27 2003-06-21T19:38:56.000000Z K 7 svn:log V 191 Add comments to case statements containing the mnemonics for the various escape and control sequences. This should make it easier to find the implementation of the one you're interested in. K 10 svn:author V 3 ben PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 08638c7fd33238c3585259461b7e96a6 Text-delta-base-sha1: 358443ea65d2d9aa74a6ec168ca811ea94c5b0f9 Text-content-length: 3980 Text-content-md5: 288dd7a3d85495550f2de48c5eb8c6cb Text-content-sha1: 3b6623208b891cbc1ae8b3358b318c481478cdc8 Content-length: 4021 K 15 cvs2svn:cvs-rev V 5 1.159 PROPS-END SVNy)b(g io*WQ}5DkV.u?oY-EvI?h\mBRcawf53XUgr a[nO/j}Gf@,?k{)f+6/s>"jC[Z"wuvww-B;6|=M} R!rk}w~|y[tNmipUxD8<s@t!3}SXXpRp[Cm&V>>EQezDECCKM:DECANM:DECCOLM:DECSCNM:OM:DECAWM: auto wrap */ term->wrap = state; break; case 8: /* DECARM: auto key repeat */ term->repeat_off = !state; break; case 10: /* DECEDM:DECTCEM:IRM: set insert mode */ compatibility(VT102); term->insert = state; break; case 12: /* SRM:LNM:WYULCURM:ENQ: /* BEL: Bell */ /* BS: Back space */ /* LS1: Locking-shift one */ compatibility(VT100); term->cset = 1; break; case '\017': /* LS0: Locking-shift zero */ compatibility(VT100); term->cset = 0; break; case '\033': /* ESC: Escape */ /* CR: Carriage return */ /* FF: Form feed */ /* VT: Line tabulation */ compatibility(VT100); case '\012': /* LF: Line feed */ /* HT: Character tabulation */ /* OSC: /* DECSC: /* DECRC: /* DECKPAM: Keypad application mode */ /* DECKPNM: Keypad numeric mode */ compatibility(VT100); term->app_keypad_keys = FALSE; break; case 'D': /* IND:NEL:RI:DECID:RIS:HTS:DECALN: /* DECDHL: 2*height, top */ nlattr = LATTR_TOP; break; case ANSI('4', '#'): /* DECDHL: 2*height, bottom */ nlattr = LATTR_BOT; break; case ANSI('5', '#'): /* DECSWL: normal */ nlattr = LATTR_NORM; break; default: /* case ANSI('6', '#'): DECDWL: 2*width /* GZD4: G0 designate 94-set */ /* G1D4: G1-designate 94-set */ case ANSI('A /* DOCS: Designate other coding system */CUU: /* VPR: move down N lines */ compatibility(ANSI); /* FALLTHROUGH */ case 'B': /* CUD: Cursor down */DA: /* HPR: move right N cols */ compatibility(ANSI); /* FALLTHROUGH */ case 'C': /* CUF: Cursor right */ CUB:CNL:CPL: /* CHA */ case '`': /* HPA:VPA: /* CUP */ case 'f': /* HVP:ED:EL: erase lineTRUE, !!(i & 2), !!(i & 1)); } term->seen_disp_event = TRUE; break; case 'L': /* IL:DL: deleteICH:DCH:DA:DSR:SM: /* MC: Media copy */RM:TBC:DECSTBM:SGR:/* DECSLPP: /* SU: Scroll up */ /* SD: Scroll down */ /* DECSNLS */ /* * Set number of lines on screen * VT420 uses VGA like hardware and can * support any size in reasonable range * /* DECSCPP */ /* * Set number of columns per page * Docs imply range is only 80 or 132, but */* ECH: *DECREQTPARM:CBT: /* DECSCL: set compat level */hhrn; } blink_diff = now - term->last_blink; /* Make sure the cursor blinks no faster than system blink rate */ if (blink_diff >= 0 && blink_diff < (long) CURSORBLINK) return; term->last_blink = now; term->blinker = !term->blinker; } /* * Invalidate the whole screen so it will be repainted in full. */ void term_invalidate(Terminal *term) { int i; for (i = 0; i < term->rows * (term->cols + 1); i++) term->disptext[i] = ATTR_INVALID; } /* * Paint the window in response to a WM_PAINT message. */ void term_paint(Terminal *term, Context ctx, int left, int top, int right, int bottom, int immediately) { int i, j; if (left < 0) left = 0; if (top < 0) top = 0; if (right >= term->cols) right = term->cols-1; if (bottom >= term->rows) bottom = term->rows-1; for (i = top; i <= bottom && i < term->rows; i++) { if ((term->disptext[i * (term->cols + 1) + term->cols] & LATTR_MODE) == LATTR_NORM) for (j = left; j <= right && Revision-number: 3284 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2003-06-21T20:21:29.000000Z K 7 svn:log V 140 The specific SSH cipher algorithms supported by PuTTY weren't listed anywhere in the documentation. Added some detail - feel free to tweak. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3a5cd86465cbbca6260045f99048ae67 Text-delta-base-sha1: c9dea4c96274a156449c5686762a796b669fff72 Text-content-length: 304 Text-content-md5: 9099e4915b164c8ede8c8343d1e5d747 Text-content-sha1: dabcf44dc7ba0a4eba473ef9417ecc10461dea71 Content-length: 344 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNYk;W\$\versionid $Id: config.but,v 1.65 2003/06/21 20:21:29 jacobPuTTY currently supports the following algorithms: \b AES (Rijndael) - 256, 192, or 128-bit CBC (SSH-2 only) \b Blowfish - 128-bit CBC \b Triple-DES - 168-bit CBC \b Single-DES - 56-bit CBC (see below for SSH-2) Revision-number: 3285 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2003-06-21T21:19:21.000000Z K 7 svn:log V 54 Oops, Ben got there first. Oh well, here's a comment. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d99fa142b9bb0804510fb53529ea17aa Text-delta-base-sha1: 5c576ad76681a48c1550ef902f29e74e41307742 Text-content-length: 88 Text-content-md5: df9cbc6781611282d7614affbb2af9a8 Text-content-sha1: 5aff0f7cf710b69ed9578e4c96309bc315ce4ca7 Content-length: 128 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNI BB1 (such as older versions of # the Cygwin/mingw GNU toolchain) Revision-number: 3286 Prop-content-length: 315 Content-length: 315 K 8 svn:date V 27 2003-06-21T22:40:42.000000Z K 7 svn:log V 216 Improve SCOANSI emulation: The colours that SGR 0 returns to are now changed by the SCO SNF and SNB sequences, which seems to be what the SCO console does (at least in the new mode documented for OpenServer 5.0.6). K 10 svn:author V 3 ben PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 288dd7a3d85495550f2de48c5eb8c6cb Text-delta-base-sha1: 3b6623208b891cbc1ae8b3358b318c481478cdc8 Text-content-length: 844 Text-content-md5: d8a213ea6655eca3e8cbf91f910a5208 Text-content-sha1: 7248d44a22a735f06e9492fdb8d2437951a2be99 Content-length: 885 K 15 cvs2svn:cvs-rev V 5 1.160 PROPS-END SVN0mTfE;U8,1ndefault_attr =term->default_attr; break; case 1: /* enable boldlong colour = (sco2ansicolour[term->esc_args[0] & 0x7] | ((term->esc_args[0] & 0x8) << 1)) << ATTR_FGSHIFT; term->curr_attr &= ~ATTR_FGMASK; term->curr_attr |= colour; term->default_attr &= ~ATTR_FGMASK; term->default_attr |= colourlong colour = term->curr_attr &= ~ATTR_BGMASK; term->curr_attr |= colour; term->default_attr &= ~ATTR_BGMASK; term->default_attr |= colourwwwks no more than 2Hz; we'll use 0.45 s period. */ if (blink_diff < 0 || blink_diff > (TICKSPERSEC * 9 / 20)) { term->last_tblink = now; term->tblinker = !term->tblinker; } if (flg) { term->blinker = 1; term->last_blink = now; retu Revision-number: 3287 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2003-06-21T22:41:45.000000Z K 7 svn:log V 41 Improved implementations of SNF and SNB. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/sco-ansi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 22504eb156359b3bd47ce838114acc70 Text-delta-base-sha1: fa054762ab69ccf6e7e23cbfec034d50c0153306 Text-content-length: 20 Text-content-md5: 0c44a8ad7438debdd6b0a7160db1797a Text-content-sha1: 604f150103c71ff5396aa397d54b5487ca91917a Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN # n5T Revision-number: 3288 Prop-content-length: 224 Content-length: 224 K 7 svn:log V 125 Keep meaning to do this: A "links" page. I'll lash it into the rest of the site once people have had a chance to check it. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-06-21T22:46:36.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5832 Text-content-md5: 9b53697dfc8443d593cf62b45805486b Text-content-sha1: 86ce8fe0cf06f9c5d386bbfc61b16a624a4a9ece Content-length: 5948 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN::: PuTTY Links

    PuTTY Links

    Home | Licence | FAQ | Docs | Download | Keys
    Mirrors | Updates | Feedback | Changes | Wishlist | Team

    Other software based on PuTTY

    Several pieces of third-party software make use of parts of PuTTY to provide facilities not available from PuTTY itself. We list some of them here, with no recommendation implied. We have no control over this code, so we can't vouch for either its quality or its security.

    Specifications implemented by PuTTY

    PuTTY attempts to conform to many specifications. These include:

    SSH2 specifications

    SSH1 specification

    Telnet specifications

    Rlogin specification

    HTTP specifications

    SOCKS specifications

    Terminal specifications


    If you want to comment on this web site, see the Feedback page.
    (last modified on [insert date here]) Revision-number: 3289 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2003-06-21T22:55:58.000000Z K 7 svn:log V 72 Correct IVT URL. Source for Secure iXplorer GPL is available after all. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9b53697dfc8443d593cf62b45805486b Text-delta-base-sha1: 86ce8fe0cf06f9c5d386bbfc61b16a624a4a9ece Text-content-length: 104 Text-content-md5: ac130f4877b018f472841b6b234858c7 Text-content-sha1: 3c7d05fb9bad5e83d55ad088d0aa72f5d9a23745 Content-length: 143 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN:'MAM+%ww.i-tree.org/gpl/ixplorer.htm"> Secure iXplorer GPL, a GUI SFTP client Revision-number: 3290 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2003-06-21T23:03:59.000000Z K 7 svn:log V 49 Make the link to RFC 855 point to the right RFC. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ac130f4877b018f472841b6b234858c7 Text-delta-base-sha1: 3c7d05fb9bad5e83d55ad088d0aa72f5d9a23745 Text-content-length: 22 Text-content-md5: 1327fba2d146e3ecddc4e9ddc24b4684 Text-content-sha1: c942df521fdb2c53827f9d7833509af2a5dbae03 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN'' \J]5 Revision-number: 3291 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2003-06-21T23:13:22.000000Z K 7 svn:log V 39 Missing part of my recent SCOANSI fix. K 10 svn:author V 3 ben PROPS-END Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 03628c983e1613a852f9ab95cfda4b3a Text-delta-base-sha1: bb0b202c639692409911a381393a15051d577b33 Text-content-length: 34 Text-content-md5: 9929db90221cebfe5628262a0cec1b4f Text-content-sha1: 1c03c19c4e9f9481a42cf17f2e59c8b7d6f7fec7 Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN . u,tdefault_attr, Revision-number: 3292 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 Add PowTTY and CSS' GSSAPI/Kerberos patch K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-06-21T23:30:12.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1327fba2d146e3ecddc4e9ddc24b4684 Text-delta-base-sha1: c942df521fdb2c53827f9d7833509af2a5dbae03 Text-content-length: 234 Text-content-md5: c1b87ec2e780d34feba0f42050b7f0b3 Text-content-sha1: d235d17034b59a9dc9b084a39f306adbbae4cda6 Content-length: 273 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN'{ RtR5rli> PuTTY with GSSAPI/Kerberos support (incompatible licence)
  • PowTTY, a MUD client Revision-number: 3293 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2003-06-21T23:40:22.000000Z K 7 svn:log V 19 Freshen ECMA links K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c1b87ec2e780d34feba0f42050b7f0b3 Text-delta-base-sha1: d235d17034b59a9dc9b084a39f306adbbae4cda6 Text-content-length: 99 Text-content-md5: 0908fda8a408e824984c34c19d61f961 Text-content-sha1: 019970102fde2055bdb0a00058b58530f52de6f9 Content-length: 138 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN{H!g-international.org-international.org/publications/standards/ECMA-048.HTM Revision-number: 3294 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2003-06-21T23:45:47.000000Z K 7 svn:log V 11 IPv6 PuTTY K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0908fda8a408e824984c34c19d61f961 Text-delta-base-sha1: 019970102fde2055bdb0a00058b58530f52de6f9 Text-content-length: 90 Text-content-md5: 3eee8ec780bed50eee202a910d285bd4 Text-content-sha1: 167cdabffbfc255754c8711ca3359c47af33324d Content-length: 129 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN_ DHDSFli> PuTTY IPv6 build Revision-number: 3295 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2003-06-21T23:48:49.000000Z K 7 svn:log V 77 Tweak SSH refs to use terminology from K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3eee8ec780bed50eee202a910d285bd4 Text-delta-base-sha1: 167cdabffbfc255754c8711ca3359c47af33324d Text-content-length: 29 Text-content-md5: af1a972caeb736dd369ffdfa62b0edc0 Text-content-sha1: 5fb6e6c06945a6d5aa32859c07b6cbdff07512d3 Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN_a<#-- Revision-number: 3296 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 Add RFC1950 and RFC1951 (zlib/deflate compressed data formats). K 10 svn:author V 5 simon K 8 svn:date V 27 2003-06-22T09:36:55.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: af1a972caeb736dd369ffdfa62b0edc0 Text-delta-base-sha1: 5fb6e6c06945a6d5aa32859c07b6cbdff07512d3 Text-content-length: 410 Text-content-md5: 77d47da6b9f93abcc5117938d255c98b Text-content-sha1: f179864e440bc9f5d26e90d18eb1e75e1aa04660 Content-length: 449 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNam ->#h3>Zlib compressed data format
    • RFC 1950: ZLIB Compressed Data Format Specification (this is mostly just wrapping and red tape)
    • RFC 1951: DEFLATE Compressed Data Format Specification (this contains the details of the actual compressed data Revision-number: 3297 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 2003-06-22T09:48:46.000000Z K 7 svn:log V 9 Re-order K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 77d47da6b9f93abcc5117938d255c98b Text-delta-base-sha1: f179864e440bc9f5d26e90d18eb1e75e1aa04660 Text-content-length: 34 Text-content-md5: 56e32570c795d755b5e37b8d79d3a363 Text-content-sha1: a72f0c08d8a308dbdaa4605a71a6edaff8be2504 Content-length: 73 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNmm ti _ Revision-number: 3298 Prop-content-length: 432 Content-length: 432 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-06-23T08:54:43.000000Z K 7 svn:log V 331 Change all the RFC links from ftp.rfc-editor.org to www.ietf.org. This may be technically slightly less authoritative, but it keeps them consistent with the form I've used in the manual, and also means the links are HTTP rather than FTP, which seems to me like a generally good idea if there isn't an overriding reason to use FTP. PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 56e32570c795d755b5e37b8d79d3a363 Text-delta-base-sha1: a72f0c08d8a308dbdaa4605a71a6edaff8be2504 Text-content-length: 1206 Text-content-md5: 3a6348764bf9e33c30257dffca65e3a8 Text-content-sha1: e9eee776a3a2e4e8c61f04b4604ea987a526d780 Content-length: 1246 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNm/8rh^^*p)`:T;h09sPD)http://www.ietf.org/rfc/rfc854.txt"> RFC 854: TELNET Protocol Specification
    • RFC 855: TELNET Option Specifications
    • RFC 856: TELNET Binary Transmission
    • RFC 857: TELNET Echo Option
    • RFC 858: TELNET Suppress Go Ahead Option
    • RFC 1073: Telnet Window Size Option
    • RFC 1079: Telnet Terminal Speed Option
    • RFC 1091: Telnet Terminal-Type Option
    • RFC 1408: Telnet Environment Option
    • RFC 1928: SOCKS Protocol Version 5
    • Link Node-path: putty-website/docs.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 17151c6cf2b4b350d20b9c5afed77804 Text-delta-base-sha1: 9fa840c0cfa46ad59edeefb4a92054346f13d598 Text-content-length: 49 Text-content-md5: cf6d2753d27f2b8dd93b82629d59be42 Text-content-sha1: a12abc2fca9c2931ca0c59bcf571fda038078474 Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN>_ wLr | Link Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0bbd506714bcf281e6eb7cd70e3ce3d4 Text-delta-base-sha1: 434f82f6022e1082a64538ffc220fd9dc9d73acd Text-content-length: 52 Text-content-md5: 24f435a6586da93b712c88450f380d20 Text-content-sha1: 522390abc7220ba324b9f504ae4ee108ac7c4ad5 Content-length: 91 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNp *K% | Link Node-path: putty-website/faq.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 47633bb5a1f52c0503db023560279d98 Text-delta-base-sha1: b010f90f9236d09bccb0238b1ee14a9202d1cab1 Text-content-length: 49 Text-content-md5: 52e68c80225d87eff29c30ac4aa5e43d Text-content-sha1: f08e8e12793e55af628dac8d42cb3f53cd751fb4 Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNSt O J | Link Node-path: putty-website/feedback.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b84ce9956c9d77823efd8ea3cb2464aa Text-delta-base-sha1: b420607b2fc12cacd0a90faed25305bb394a981f Text-content-length: 49 Text-content-md5: 1205c3b150e9aeb19f77d0ba0d2fc8ef Text-content-sha1: ac111b18d304a055196c0da38832a5fe3465e680 Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN;\  3 | Link Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 29dd7135652513642e9101c8d5acde18 Text-delta-base-sha1: 017feef9069dcae217a2cac9e76c0b2cd4949bd0 Text-content-length: 49 Text-content-md5: d952624e346e4d13aca0ee05013c63da Text-content-sha1: aaedf3b5c87f557d1a0f67d602ff639090914d73 Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN6W # | Link Node-path: putty-website/keys.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 68fb6847046f9a478a865ffe26f9efdf Text-delta-base-sha1: a3f8f87d53ba34c01d0013c2ae3d24dade9e2921 Text-content-length: 53 Text-content-md5: 7396874fbbda7408c90ed4a439aba7a4 Text-content-sha1: c6e876893ce6893c9b1c78464b5ad85436065045 Content-length: 92 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNp f | LinksLink Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3a6348764bf9e33c30257dffca65e3a8 Text-delta-base-sha1: e9eee776a3a2e4e8c61f04b4604ea987a526d780 Text-content-length: 35 Text-content-md5: bf15fdb5dc7ddad5a7fd496e2e089fde Text-content-sha1: 3e0c0e78571146cd625fe969c898c5d4913b8205 Content-length: 75 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN/> nBm | LinksLink Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2471bf88f9e3c6db5d81c3048122e5dd Text-delta-base-sha1: 2054d463a3fd7b8716520727fbb2579f14004489 Text-content-length: 49 Text-content-md5: 233ea0b0ad4ba6c8b71a711e149eda4a Text-content-sha1: ffd7ea6ee4a202a256ce48c40a6368111b73170e Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN2  | Link Node-path: putty-website/team.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fbf82efcc0fd42d28c267b63aef7ad30 Text-delta-base-sha1: e362d029bf6d6fe4d4bda8f52a3ca47051450145 Text-content-length: 49 Text-content-md5: 2b9e21a4d3b6321b677ee17a49fc7eec Text-content-sha1: 3e167827cee13a4698c83a23d4fe3472c11c798e Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN( |w | Link Revision-number: 3301 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2003-06-24T08:23:51.000000Z K 7 svn:log V 33 Add link to Links page in header K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 257ad62046b87e5ee4777da40d87f324 Text-delta-base-sha1: 27579ce518c35ccda088a43cb3658a68423f4b6d Text-content-length: 168 Text-content-md5: 99c09be2faa69916065879d0073add5d Text-content-sha1: 0f9a635492883385f5b194a87a792834f8c7f67a Content-length: 208 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN8 <H>%z>#! /usr/bin/perl # $Id: bugs2html,v 1.24 2003/06/24 08:23:51 | Link | Link Revision-number: 3302 Prop-content-length: 182 Content-length: 182 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-06-24T08:29:07.000000Z K 7 svn:log V 82 Remove "Contributions" section -- QuickPutty is now linked on the links.html page PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 24f435a6586da93b712c88450f380d20 Text-delta-base-sha1: 522390abc7220ba324b9f504ae4ee108ac7c4ad5 Text-content-length: 24 Text-content-md5: 3ad191b8cd2e9ce1daf14b07890ed0c0 Text-content-sha1: 361d0d5364ea614b1eeb477737bf6bae6ecae08f Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN9 4] Revision-number: 3303 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2003-06-24T08:34:38.000000Z K 7 svn:log V 27 Add links.html to site map K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d952624e346e4d13aca0ee05013c63da Text-delta-base-sha1: aaedf3b5c87f557d1a0f67d602ff639090914d73 Text-content-length: 101 Text-content-md5: 3e3cc93954adc2e1d3ad32ee87662c48 Text-content-sha1: c30ac4f7102e11cfa7e39fe340138ea070e15453 Content-length: 141 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNW- O^OWLinks to related software and specifications elsewhere Revision-number: 3304 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:31.866030Z PROPS-END Revision-number: 3305 Prop-content-length: 434 Content-length: 434 K 8 svn:date V 27 2003-06-25T15:52:29.000000Z K 7 svn:log V 333 Incorporate Brad Clarke's suggestion to use "REGEDIT /EA" rather than "REGEDIT /E". On newer versions of Windows (verified on 2K), this will cause the .REG file to be saved in REGEDIT4 format (ASCII) which can be read by older Windows, rather than REGEDIT5 (Unicode). On older Windows, the extra "A" is harmless (verified on Win98). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9099e4915b164c8ede8c8343d1e5d747 Text-delta-base-sha1: dabcf44dc7ba0a4eba473ef9417ecc10461dea71 Text-content-length: 77 Text-content-md5: 3029eae3114263d75cfddecc8dc4bb57 Text-content-sha1: 2d213b78c3ecbe9bf05293e35408dbd66bc1c5e2 Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNYZ 3U2R\versionid $Id: config.but,v 1.66 2003/06/25 15:52a Revision-number: 3306 Prop-content-length: 317 Content-length: 317 K 8 svn:date V 27 2003-06-26T13:41:30.000000Z K 7 svn:log V 216 Fix a segfault (non-security-critical - null dereference for reading) in the zlib code when fed certain kinds of invalid data. As a result, ssh.c now needs to be prepared for zlib_decompress_block to return failure. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2c7123ade548d7255956527d7f1bb7b2 Text-delta-base-sha1: b8fa609939deb2b3df62dc90ed4365fcb19cd500 Text-content-length: 343 Text-content-md5: 332e48ec02e9cf287f70474a4ae31e11 Text-content-sha1: 58605ad006990716641a0c3ec998c20f3160ef3f Content-length: 384 K 15 cvs2svn:cvs-rev V 5 1.298 PROPS-END SVNSSif (!zlib_decompress_block(ssh->sc_comp_ctx, ssh->pktin.body - 1, ssh->pktin.length + 1, &decompblk, &decomplen)) { bombout(("Zlib decompression encountered invalid data")); crStop(0); }DUUDe if (ssh->pktin.type == SSH1_MSG_DISCONNECT) { ssh_closing((Plug)ssh Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 63b2e5022216460f4270e3382254b9d6 Text-delta-base-sha1: 56d3a88fbace05248d0146adea11515d8219bea9 Text-content-length: 530 Text-content-md5: cdb6b4e65dd500865ccbdd930ef19be0 Text-content-sha1: ba16f925552790265a172aee8b74b4075bdb2e43 Content-length: 570 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNzr+YA{<V'mc~z n if (!tab) { /* * There was a missing entry in the table, presumably * due to an invalid Huffman table description, and the * subsequent data has attempted to use the missing * entry. Return a decoding failure. */ return -2== -2) goto decode_error== -2) goto decode_errorif (code == -2) goto decode_error return 1; decode_error: sfree(dctx->outblk); *outblock = dctx->outblk = NULL; *outlen = 0; return 0 Revision-number: 3307 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2003-06-26T14:19:33.000000Z K 7 svn:log V 59 Implement hostkey-prompt-type everywhere except Macintosh. K 10 svn:author V 4 owen PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0c052d3ecaa645b1790d98373286f9ca Text-delta-base-sha1: b4c59b6fdcd626dd5a48f5d2950a9567c90906d0 Text-content-length: 237 Text-content-md5: c673f6d5d411d29efa91b0a72d1621c1 Text-content-sha1: 60b800563406058af0fef9073273663f1c28d471 Content-length: 277 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN//2{}BvS};}@KRKSZ%%%%wrongmsg%skeytype, fingerprint); cleanup_exit(1); } fprintf(stderr, wrongmsg, keytypekeytype, fingerprint); cleanup_exit(1); } fprintf(stderr, absentmsg, keytype Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0bf843cc6d38622f0b9eee8090a0c3b4 Text-delta-base-sha1: efad8ea33293a0339c4f46607ae8adfb8860e899 Text-content-length: 49 Text-content-md5: 481ab9d8d51320f92a3f8fc9480e3e25 Text-content-sha1: 00e7c0c135bbdc88cb6e17d2eed30e00b1d60f73 Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN!0 rp%%skeytype Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bbebdce1b62c33e38529e6c18dd50458 Text-delta-base-sha1: 591f4e806386bfbc84caa4c8b93a21ff883445bf Text-content-length: 237 Text-content-md5: 2e4c53c157631e0e018ffae44a9bb853 Text-content-sha1: ed9cc7732d9b002d60249e62ea10ba1828651568 Content-length: 277 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNl/25f3-S3&+BR-Se%%%wrongmsg%skeytype, fingerprint); cleanup_exit(1); } fprintf(stderr, wrongmsg, keytypekeytype, fingerprint); cleanup_exit(1); } fprintf(stderr, absentmsg, keytype Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 12b26d5d34e009dcc5ca450cc121d9c7 Text-delta-base-sha1: 1281f769216aa8eea34d5bf9a4f99f4ab7ac10e0 Text-content-length: 182 Text-content-md5: add38eed49c4e5f907541dca68653d90 Text-content-sha1: 4303071e3d4c55aac02ca2cb7594846b2937a606 Content-length: 223 K 15 cvs2svn:cvs-rev V 5 1.214 PROPS-END SVN"mk]},w| w%%skeytype if (ret == 1) { /* key was absent */ int mbret; char *message, *title; message = dupprintf(absentmsg, keytype Revision-number: 3308 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2003-06-26T14:24:52.000000Z K 7 svn:log V 45 Fixed this for all platforms except the Mac. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/hostkey-prompt-type Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5c23448abcbb15b0e37bb61a09429058 Text-delta-base-sha1: 50729839cfb0d006c99791f5d0ee97b8881ebc7c Text-content-length: 40 Text-content-md5: b14a9edfe43e56fe2bc9c8a5755d99fa Text-content-sha1: a29751457784fc6226ecbf7fa532cd21a2eadf8a Content-length: 79 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNt rfixed-in: 2003-06-26 Revision-number: 3309 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2003-06-26T15:08:05.000000Z K 7 svn:log V 43 Implement sftp-backend-diagnostic in pscp. K 10 svn:author V 4 owen PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 71c42baa274a90221ab256b8f3907d0a Text-delta-base-sha1: 28601e89e837afd5483c2e6d17bf0450a6cb8296 Text-content-length: 148 Text-content-md5: 705e4316b9cc1adebb957fd6f4241b17 Text-content-sha1: c2a127c4f3c1abb98ee5be8f20e497bfc8d69c8e Content-length: 189 K 15 cvs2svn:cvs-rev V 5 1.106 PROPS-END SVNNJ {i{fh if (verbose) { if (using_sftp) tell_user(stderr, "Using SFTP"); else tell_user(stderr, "Using SCP1"); } Revision-number: 3310 Prop-content-length: 234 Content-length: 234 K 7 svn:log V 134 Mark as fixed; psftp only ever uses sftp by some means, so -v already provides all relevant information, and I've fixed this in pscp. K 10 svn:author V 4 owen K 8 svn:date V 27 2003-06-27T09:03:57.000000Z PROPS-END Node-path: putty-wishlist/data/sftp-backend-diagnostic Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dd58ca10a67a29b8163f7df705080c30 Text-delta-base-sha1: 01850ad2b3a911d089c17a36067f63e221a1f51d Text-content-length: 41 Text-content-md5: 26272a3a5177b969bfb936eba9140da9 Text-content-sha1: cee29c19e38840cbb5a5dc4c615e795c4e8e3049 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN| yFixed-in: 2003-06-27 Revision-number: 3311 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2003-06-27T09:21:43.000000Z K 7 svn:log V 28 Can't replicate the Danish. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/keyboard-problems Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a217ac14cc329b7db2e56e18d15fd3b8 Text-delta-base-sha1: b1b3d46a1e97a86c1ee63c306744a0f65ddad18b Text-content-length: 110 Text-content-md5: 420479da5e8ae089e1a6684e0c060fd7 Text-content-sha1: f47e57fb94b952cf9c1b05d0cd4db4b558051e26 Content-length: 149 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN#{ XIXZI (OSD: I can't replicate this on Win2K with a Danish keymap. I get only the ñ.) Revision-number: 3312 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:32.521150Z PROPS-END Revision-number: 3313 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:32.530031Z PROPS-END Revision-number: 3314 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2003-06-28T07:52:19.000000Z K 7 svn:log V 88 Someone pointed out that ^~ should generate the same as ^^, for consistency with xterm. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a0ada442a6f9f35d0a14d9d258f41d2f Text-delta-base-sha1: fde41fe364aa10b1f7b427465d68655260a087bd Text-content-length: 270 Text-content-md5: fe88e4abd99bbd620b0a0a3b023b6295 Text-content-sha1: 10e4285f2f024c8462a7cd0b10aa227885d9f561 Content-length: 311 K 15 cvs2svn:cvs-rev V 5 1.249 PROPS-END SVN XiX?93 && wParam == 0xDE) { *p++ = 0x1E; /* Ctrl-~ == Ctrl-^ in xterm at least */GOGenu). */ if (wParam == VK_MENU && !cfg.alt_only) return 0; return -1; } void request_paste(void *frontend) { /* Revision-number: 3315 Prop-content-length: 384 Content-length: 384 K 8 svn:date V 27 2003-06-28T14:10:06.000000Z K 7 svn:log V 283 bignum_mod_short shouldn't be depending on a fixed place value in the bignum data! This wasn't actually causing puttygen-zero-div (its unwarranted assumption was still correct under Windows) but it would have caused the same symptoms under Unix when I got round to porting PuTTYgen. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 185614f8c81ba7e6ebbe8b70b4a561ac Text-delta-base-sha1: a5cb34d4f896de689d914f83b1df6ef0e30e3c00 Text-content-length: 69 Text-content-md5: 08a6c712f4ec516900f2389d29abcc1b Text-content-sha1: 706a2a34c1f5936e47b12357c31d73d7e59e8ed1 Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN ; ,g(x(BIGNUM_TOP_BIT % mod) * 2 + number[i] % mod Revision-number: 3316 Prop-content-length: 462 Content-length: 462 K 7 svn:log V 361 Failure to set multipliers[NPRIMES] was rendering the input-modulus feature (make sure your prime is not congruent to Foo mod Bar) largely ineffective. As a result, RSA keys were being generated every so often with at least one prime congruent to 1 mod 37, causing modinv(37, phi(n)) to divide by zero, and rightly so. I believe this fixes `puttygen-zero-div'. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-06-28T14:11:28.000000Z PROPS-END Node-path: putty/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: adc2d12064878436e90735901258ff29 Text-delta-base-sha1: 559b3d997f07f5d2eb1b6d382b6aa18488d8d38c Text-content-length: 131 Text-content-md5: cfd126d710b33bd91a6ffb57fe2cc1f0 Text-content-sha1: 1ce434aa908d5c0a710e7fcbfca8eb1f24c81881 Content-length: 171 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN$ ii if (factor) multipliers[NPRIMES] = bignum_mod_short(factor, modulus); else multipliers[NPRIMES] = 1 Revision-number: 3317 Prop-content-length: 116 Content-length: 116 K 7 svn:log V 16 Believed fixed. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-06-28T14:13:11.000000Z PROPS-END Node-path: putty-wishlist/data/puttygen-zero-div Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7ca49a3d3619c49ee32b49cf261a54d4 Text-delta-base-sha1: 15789856151ac0f29491356903d1ebba2aeb480b Text-content-length: 279 Text-content-md5: a2cbb05e6fe91cf119bf705c54e768f6 Text-content-sha1: 5230b11ed7e27352a84b589c500fe54e342c24e1 Content-length: 318 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNxy {~zlFixed-in: 2003-06-29

      SGT, 2003-06-28: Believed fixed. Thankfully, the bug was not in the bignum implementation (although I found a small bug in there too in the course of fixing it!) but in the much simpler prime-generation code that called it. Revision-number: 3318 Prop-content-length: 340 Content-length: 340 K 8 svn:date V 27 2003-06-29T14:26:09.000000Z K 7 svn:log V 239 First phase of SFTP re-engineering. Each base-level fxp_* function has been split into a send half and a receive half, so that callers can set several requests in motion at a time and deal with the responses in whatever order they arrive. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 26e4a1dcba860b2deb4acf102b29fcd7 Text-delta-base-sha1: cf8b8d8500b47e05991567c0080f131c34757bf5 Text-content-length: 5221 Text-content-md5: e22089a6f2419a5be2532ca2447551c3 Text-content-sha1: afd1c2bd01fb8b79f108ea4ab3fa028e082ac89b Content-length: 5261 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVNs.9$BT"%B]u-I 1B1 !y@YGM 13@D@ NOJT+w$| u(;P]d{; I) 4.k&&> f9q=qH>B(>wzIS?>8$+5P](RWB1`/"90$t @~y!` struct sftp_packet *pktin; struct sftp_request *req, *rreqsftp_register(req = fxp_realpath_send(fullname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); canonname = fxp_realpath_recv(pktinsftp_register(req = fxp_realpath_send("/")); } else { sftp_register(req = fxp_realpath_send(fullname)); } rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); canonname = fxp_realpath_recv(pktin);struct sftp_packet *pktin; struct sftp_request *req, *rreq; int isftp_register(req = fxp_opendir_send(cdir)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); dirh = fxp_opendir_recv(pktin); sftp_register(req = fxp_readdir_send(dirh)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); names = fxp_readdir_recv(pktin); sftp_register(req = fxp_close_send(dirh)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fxp_close_recv(pktinstruct sftp_packet *pktin; struct sftp_request *req, *rreq; char *dirsftp_register(req = fxp_opendir_send(dir)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); dirh = fxp_opendir_recv(pktin); if (!dirh) { printf("Directorytp_register(req = fxp_close_send(dirh)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fxp_close_recv(pktinstruct sftp_packet *pktin; struct sftp_request *req, *rreq; char *sftp_register(req = fxp_open_send(fname, SSH_FXF_READ)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fh = fxp_open_recv(pktin); sftp_register(req = fxp_close_send(fh)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fxp_close_recv(pktin); sftp_register(req = fxp_read_send(fh, offset, sizeof(buffer))); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); len = fxp_read_recv(pktin, buffer, sizeof(buffer)); sftp_register(req = fxp_close_send(fh)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fxp_close_recv(pktin); struct sftp_packet *pktin; struct sftp_request *req, *rreqsftp_register(req = fxp_open_send(outfname, SSH_FXF_WRITE)); } else { sftp_register(req = fxp_open_send(outfname, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_TRUNC)); } rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fh = fxp_open_recv(pktin); nt ret; sftp_register(req = fxp_fstat_send(fh)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); ret = fxp_fstat_recv(pktin, &attrs); if (!ret, ret sftp_register(req = fxp_write_send(fh, buffer, offset, len)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); ret = fxp_write_recv(pktin); if (!retsftp_register(req = fxp_close_send(fh)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fxp_close_recv(pktin); struct sftp_packet *pktin; struct sftp_request *req, *rreqmksftp_register(req = fxp_mkdir_send(dir)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_mkdir_recv(pktin); if (!result) { printf("mkdir(struct sftp_command *cmd) { char *dir; struct sftp_packet *pktin; struct sftp_request *req, *rreqsftp_register(req = fxp_rmdir_send(dir)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_rmdir_recv(pktin); struct sftp_packet *pktin; struct sftp_request *req, *rreqfname, fxp_error()); return 0; } sftp_register(req = fxp_remove_send(fname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_remove_recv(pktin); struct sftp_packet *pktin; struct sftp_request *req, *rreqsftp_register(req = fxp_rename_send(srcfname, dstfname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_rename_recv(pktin); sftp_register(req = fxp_stat_send(dstfname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_stat_recv(pktin, &attrs); sftp_register(req = fxp_rename_send(srcfname, dstfname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_rename_recv(pktin); struct sftp_packet *pktin; struct sftp_request *req, *rreqsftp_register(req = fxp_stat_send(fname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_stat_recv(pktin, &attrs); sftp_register(req = fxp_setstat_send(fname, attrs)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_setstat_recv(pktinstruct sftp_packet *pktin; struct sftp_request *req, *rreq; sftp_register(req = fxp_realpath_send(".")); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); homedir = fxp_realpath_recv(pktin); Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 705e4316b9cc1adebb957fd6f4241b17 Text-delta-base-sha1: c2a127c4f3c1abb98ee5be8f20e497bfc8d69c8e Text-content-length: 4003 Text-content-md5: 33eb1ef2d5c1c4c5150c24dc135b0ab7 Text-content-sha1: da84ba00b4e4c78cce3469ee54ff306825b08e01 Content-length: 4044 K 15 cvs2svn:cvs-rev V 5 1.107 PROPS-END SVNJIK}Nw a!$iKWud+=dY\| oH4GA268Gf ~ K>&(FIly|_UW/eestruct sftp_packet *pktin; struct sftp_request *req, *rreqsftp_register(req = fxp_opendir_send(dirname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); dirh = fxp_opendir_recv(pktin); sftp_register(req = fxp_readdir_send(dirh)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); names = fxp_readdir_recv(pktin); sftp_register(req = fxp_close_send(dirh)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fxp_close_recv(pktinsftp_packet *pktin; struct sftp_request *req, *rreq; struct fxp_attrs attrs; int ret; } sftp_register(req = fxp_stat_send(target)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); ret = fxp_stat_recv(pktin, &attrs); if (!ret ||struct sftp_packet *pktin; struct sftp_request *req, *rreq; sftp_register(req = fxp_open_send(fullname, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_TRUNC)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); scp_sftp_filehandle = fxp_open_recv(pktin); nt ret; struct sftp_packet *pktin; struct sftp_request *req, *rreq; if (!scp_sftp_filehandle) { return 1; } sftp_register(req = fxp_write_send(scp_sftp_filehandle, data, scp_sftp_fileoffset, len)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); ret = fxp_write_recv(pktin); if (!retstruct sftp_packet *pktin; struct sftp_request *req, *rreq; int ret; sftp_register(req = fxp_fsetstat_send(scp_sftp_filehandle, attrs)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); ret = fxp_fsetstat_recv(pktin); if (!ret) { tell_user(stderr, "unable to set file times: %s\n", fxp_error()); errs++; } } sftp_register(req = fxp_close_send(scp_sftp_filehandle)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fxp_close_recv(pktinstruct sftp_packet *pktin; struct sftp_request *req, *rreq; int ret; sftp_register(req = fxp_mkdir_send(fullname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); ret = fxp_mkdir_recv(pktin); if (!ret) err = fxp_error(); else err = "server reported no error"; sftp_register(req = fxp_stat_send(fullname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); ret = fxp_stat_recv(pktin, &attrs); if (!ret ||struct sftp_packet *pktin; struct sftp_request *req, *rreqsftp_register(req = fxp_stat_send(fname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); ret = fxp_stat_recv(pktin, &attrs); sftp_register(req = fxp_opendir_send(fname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); dirhandle = fxp_opendir_recv(pktin); sftp_register(req = fxp_readdir_send(dirhandle)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); names = fxp_readdir_recv(pktin); sftp_register(req = fxp_close_send(dirhandle)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fxp_close_recv(pktintruct sftp_packet *pktin; struct sftp_request *req, *rreq; sftp_register(req = fxp_open_send(scp_sftp_currentname, SSH_FXF_READ)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); scp_sftp_filehandle = fxp_open_recv(pktin); struct sftp_packet *pktin; struct sftp_request *req, *rreq; int actuallen; sftp_register(req = fxp_read_send(scp_sftp_filehandle, scp_sftp_fileoffset, len)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); actuallen = fxp_read_recv(pktin, data, len); struct sftp_packet *pktin; struct sftp_request *req, *rreq; sftp_register(req = fxp_close_send(scp_sftp_filehandle)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fxp_close_recv(pktin) Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3eeeb05a3b8b7aa4701eb6fc8fb18450 Text-delta-base-sha1: 6d03a6a77ffd51d91693f93b0bbfded87c52225e Text-content-length: 7493 Text-content-md5: 67e264b00c95c9dfed60881d3d2148af Text-content-sha1: 864234c23d2ce426f59049ac9a65d7a80faa658d Content-length: 7533 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNp,yQ@e}{X|0ah}Hb|L=/!Qgj;gB"n2M3 Kp~Mtp~ip~Nyl_Lx~XtMwM:naMw exMp~tn|~tn4KFOwnS2wBM3tn CE+tree23static void fxp_internal_error(char *msg)Request ID allocation and temporary dispatch routines. */ #define REQUEST_ID_OFFSET 256 struct sftp_request { unsigned id; int registered; }; static int sftp_reqcmp(void *av, void *bv) { struct sftp_request *a = (struct sftp_request *)av; struct sftp_request *b = (struct sftp_request *)bv; if (a->id < b->id) return -1; if (a->id > b->id) return +1; return 0; } static int sftp_reqfind(void *av, void *bv) { unsigned *a = (unsigned *) av; struct sftp_request *b = (struct sftp_request *)bv; if (*a < b->id) return -1; if (*a > b->id) return +1; return 0; } static tree234 *sftp_requests; static struct sftp_request *sftp_alloc_request(void) { const unsigned CHANNEL_NUMBER_OFFSET = 256; unsigned low, high, mid; int tsize; struct sftp_request *r; if (sftp_requests == NULL) sftp_requests = newtree234(sftp_reqcmp); /* * First-fit allocation of request IDs: always pick the lowest * unused one. To do this, binary-search using the counted * B-tree to find the largest ID which is in a contiguous * sequence from the beginning. (Precisely everything in that * sequence must have ID equal to its tree index plus * SEQUENCE_NUMBER_OFFSET.) */ tsize = count234(sftp_requests); low = -1; high = tsize; while (high - low > 1) { mid = (high + low) / 2; r = index234(sftp_requests, mid); if (r->id == mid + REQUEST_ID_OFFSET) low = mid; /* this one is fine */ else high = mid; /* this one is past it */ } /* * Now low points to either -1, or the tree index of the * largest ID in the initial sequence. */ { unsigned i = low + 1 + REQUEST_ID_OFFSET; assert(NULL == find234(sftp_requests, &i, sftp_reqfind)); } /* * So the request ID we need to create is * low + 1 + REQUEST_ID_OFFSET. */ r = snew(struct sftp_request); r->id = low + 1 + REQUEST_ID_OFFSET; r->registered = 0; add234(sftp_requests, r); return r; } void sftp_register(struct sftp_request *req) { req->registered = 1; } struct sftp_request *sftp_find_request(struct sftp_packet *pktin) { unsigned long id; struct sftp_request *req; id = sftp_pkt_getuint32(pktin); req = find234(sftp_requests, &id, sftp_reqfind); if (!req || !req->registeredNULL; } return reqstruct sftp_request *fxp_realpath_send(char *path) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktout; pktout = sftp_pkt_init(SSH_FXP_REALPATH); sftp_pkt_adduint32(pktout, req->id); return req; } char *fxp_realpath_recv(struct sftp_packet *pktin) {sftp_request *fxp_open_send(char *path, int type) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktoutreq->id); return req; } struct fxp_handle *fxp_open_recv(struct sftp_packet *pktin) {sftp_request *fxp_opendir_send(char *path) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktout; pktout = sftp_pkt_init(SSH_FXP_OPENDIR); sftp_pkt_adduint32(pktout, req->id); sftp_pkt_addstring(pktout, path); sftp_send(pktout); return req; } struct fxp_handle *fxp_opendir_recv(struct sftp_packet *pktin) {DIRClose a file/dir. */ struct sftp_request *fxp_close_send(struct fxp_handle *handle) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktout; pktout = sftp_pkt_init(SSH_FXP_CLOSE); sftp_pkt_adduint32(pktout, req->id); sfree(handle->hstring); sfree(handle); return req; } void fxp_close_recv(struct sftp_packet *pktin) { fxp_got_status(pktin); sftp_pkt_free(pktin); } struct sftp_request *fxp_mkdir_send(char *path) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktoutreq->id); return req; } int fxp_mkdir_recv(struct sftp_packet *pktin) { intstruct sftp_request *fxp_rmdir_send(char *path) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktoutreq->id); sftp_pkt_addstring(pktout, path); sftp_send(pktout); return req; } int fxp_rmdir_recv(struct sftp_packet *pktin) { intstruct sftp_request *fxp_remove_send(char *fname) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktout; pktout = sftp_pkt_init(SSH_FXP_REMOVE); sftp_pkt_adduint32(pktout, req->id); sftp_pkt_addstring(pktout, fname); sftp_send(pktout); return req; } int fxp_remove_recv(struct sftp_packet *pktin) { intstruct sftp_request *fxp_rename_send(char *srcfname, char *dstfname) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktoutreq->id); return req; } int fxp_rename_recv(struct sftp_packet *pktin) { intstruct sftp_request *fxp_stat_send(char *fname) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktout; pktout = sftp_pkt_init(SSH_FXP_STAT); sftp_pkt_adduint32(pktout, req->id); sftp_pkt_addstring(pktout, fname); sftp_send(pktout); return req; } int fxp_stat_recv(struct sftp_packet *pktin, struct fxp_attrs *attrs) {struct sftp_request *fxp_fstat_send(struct fxp_handle *handle) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktoutreq->id); return req; } int fxp_fstat_recv(struct sftp_packet *pktin, struct fxp_attrs *attrs) {/* * Set the attributes of a file. */ struct sftp_request *fxp_setstat_send(char *fname, struct fxp_attrs attrs) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktout; pktout = sftp_pkt_init(SSH_FXP_SETSTAT); sftp_pkt_adduint32(pktout, req->id); return req; } int fxp_setstat_recv(struct sftp_packet *pktin) { intstruct sftp_request *fxp_fsetstat_send(struct fxp_handle *handle, struct fxp_attrs attrs) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktout; pktout = sftp_pkt_init(SSH_FXP_FSETSTAT); sftp_pkt_adduint32(pktout, req->id);pkt_addattrs(pktout, attrs); sftp_send(pktout); return req; } int fxp_fsetstat_recv(struct sftp_packet *pktin) { intstruct sftp_request *fxp_read_send(struct fxp_handle *handle, uint64 offset, int len) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktout; pktout = sftp_pkt_init(SSH_FXP_READ); sftp_pkt_adduint32(pktout, req->id);pkt_adduint64(pktout, offset); sftp_pkt_adduint32(pktout, len); sftp_send(pktout); return req; } int fxp_read_recv(struct sftp_packet *pktin, char *buffer, int len) {sftp_request *fxp_readdir_send(struct fxp_handle *handle) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktoutreq->id); return req; } struct fxp_names *fxp_readdir_recv(struct sftp_packet *pktin) {struct sftp_request *fxp_write_send(struct fxp_handle *handle, char *buffer, uint64 offset, int len) { struct sftp_request *req = sftp_alloc_request(); struct sftp_packet *pktoutreq->id); return req; } int fxp_write_recv(struct sftp_packet *pktin) { Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4319c23960fcd34a3bf57953b153d625 Text-delta-base-sha1: 5ec95d05f961c71ab1d9b91a84c8804c28a44ae9 Text-content-length: 2641 Text-content-md5: 0fdae12505303d023e3b0c7fd3321ed5 Text-content-sha1: e1863b0472f6020e3833f9a06adfb745e22983ce Content-length: 2680 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNN0+p*^struct sftp_request; struct sftp_packetstruct sftp_request *fxp_realpath_send(char *path); char *fxp_realpath_recv(struct sftp_packet *pktin); /* * Open a file. */ struct sftp_request *fxp_open_send(char *path, int type); struct fxp_handle *fxp_open_recv(struct sftp_packet *pktin); /* * Open a directory. */ struct sftp_request *fxp_opendir_send(char *path); struct fxp_handle *fxp_opendir_recv(struct sftp_packet *pktin); /* * Close a file/dir. */ struct sftp_request *fxp_close_send(struct fxp_handle *handle); void fxp_close_recv(struct sftp_packet *pktin); /* * Make a directory. */ struct sftp_request *fxp_mkdir_send(char *path); int fxp_mkdir_recv(struct sftp_packet *pktin); /* * Remove a directory. */ struct sftp_request *fxp_rmdir_send(char *path); int fxp_rmdir_recv(struct sftp_packet *pktin); /* * Remove a file. */ struct sftp_request *fxp_remove_send(char *fname); int fxp_remove_recv(struct sftp_packet *pktin); /* * Rename a file. */ struct sftp_request *fxp_rename_send(char *srcfname, char *dstfname); int fxp_rename_recv(struct sftp_packet *pktin); /* * Return file attributes. */ struct sftp_request *fxp_stat_send(char *fname); int fxp_stat_recv(struct sftp_packet *pktin, struct fxp_attrs *attrs); struct sftp_request *fxp_fstat_send(struct fxp_handle *handle); int fxp_fstat_recv(struct sftp_packet *pktin, struct fxp_attrs *attrs); /* * Set file attributes. */ struct sftp_request *fxp_setstat_send(char *fname, struct fxp_attrs attrs); int fxp_setstat_recv(struct sftp_packet *pktin); struct sftp_request *fxp_fsetstat_send(struct fxp_handle *handle, struct fxp_attrs attrs); int fxp_fsetstat_recv(struct sftp_packet *pktin); /* * Read from a file. */ struct sftp_request *fxp_read_send(struct fxp_handle *handle, uint64 offset, int len); int fxp_read_recv(struct sftp_packet *pktin, char *buffer, int len); /* * Write to a file. Returns 0 on error, 1 on OK. */ struct sftp_request *fxp_write_send(struct fxp_handle *handle, char *buffer, uint64 offset, int len); int fxp_write_recv(struct sftp_packet *pktin); /* * Read from a directory. */ struct sftp_request *fxp_readdir_send(struct fxp_handle *handle); struct fxp_names *fxp_readdir_recv(struct sftp_packet *pktin /* * These functions might well be temporary placeholders to be * replaced with more useful similar functions later. They form the * main dispatch loop for processing incoming SFTP responses. */ void sftp_register(struct sftp_request *req); struct sftp_request *sftp_find_request(struct sftp_packet *pktin); struct sftp_packet *sftp_recv(void); Revision-number: 3319 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2003-06-29T14:47:14.000000Z K 7 svn:log V 110 Phase 1a of SFTP re-engineering: fix the glaring memory and request ID leak in the previous checkin. Oops :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e22089a6f2419a5be2532ca2447551c3 Text-delta-base-sha1: afd1c2bd01fb8b79f108ea4ab3fa028e082ac89b Text-content-length: 307 Text-content-md5: 9bfa79b3f96e9a47cd91f6da083a8376 Text-content-sha1: b0579fe6770b04aa2e74c7015bd07c12327079b5 Content-length: 347 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVN.>__&|;"]Y_x80@E/]6 9B|y"uFc]h@ (K4}}hP{cK, rreq, rreq, rreq, rreq, rreq, rreq, rreq, rreq, rreqrreq, rreq, rreqrreq, rreq, rreq, rreq, rreq, rreq, rreqrreq, rreqrreq, rreq, rreq Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 33eb1ef2d5c1c4c5150c24dc135b0ab7 Text-delta-base-sha1: da84ba00b4e4c78cce3469ee54ff306825b08e01 Text-content-length: 238 Text-content-md5: 456bad95c65c1709c6507b54c03a034e Text-content-sha1: f584e52a47c3d594f9e741e947bf12b5037ffe2f Content-length: 279 K 15 cvs2svn:cvs-rev V 5 1.108 PROPS-END SVNg^&?&-eJ~Z_/[7}AfRz6y.'-C?p$/sQ=D, rreq, rreq, rreqrreq, rreq, rreq, rreq, rreq, rreqrreqrreq, rreq, rreq, rreq, rreqrreq, rreq Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 67e264b00c95c9dfed60881d3d2148af Text-delta-base-sha1: 864234c23d2ce426f59049ac9a65d7a80faa658d Text-content-length: 1144 Text-content-md5: 6ba75cebbf8d5143442243fcd5489dfe Text-content-sha1: 1cd1fe7cc27ce768318a15c85556540f05459192 Content-length: 1184 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNk"G.N(;y;;By4s;]1pg{ip^]p6xdWAMh-Jhp~wF+ 2EAdel234(sftp_requests, req);, struct sftp_request *req) { sfree(req); , struct sftp_request *req) { sfree(req); , struct sftp_request *req) { sfree(req);, struct sftp_request *req) { sfree(req);, struct sftp_request *req) { int id; sfree(req); struct sftp_request *fxp_rmRMint fxp_rmdir_recv(struct sftp_packet *pktin, struct sftp_request *req) { int id; sfree(req); , struct sftp_request *req) { int id; sfree(req); , struct sftp_request *req) { int id; sfree(req); sftp_request *req, struct fxp_attrs *attrs) { sfree(req); struct sftp_request *req, struct fxp_attrs *attrs) { sfree(req);, struct sftp_request *req) { int id; sfree(req); , struct sftp_request *req) { int id; sfree(req); struct sftp_request *req, char *buffer, int len) { sfree(req);, struct sftp_request *req) { sfree(req);, struct sftp_request *req) { sfree(req); Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0fdae12505303d023e3b0c7fd3321ed5 Text-delta-base-sha1: e1863b0472f6020e3833f9a06adfb745e22983ce Text-content-length: 509 Text-content-md5: cf888a7618b6265b741afb530be60b99 Text-content-sha1: 746c8a9000131c438b792e5b35ed2bbcb036df48 Content-length: 549 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNNu[::I Y}fc}b_ or5z/+Glq#]N, struct sftp_request *req, struct sftp_request *req, struct sftp_request *req, struct sftp_request *req, struct sftp_request *req, struct sftp_request *req, struct sftp_request *req, struct sftp_request *reqsftp_request *req, sftp_request *req, , struct sftp_request *req, struct sftp_request *reqstruct sftp_request *req, , struct sftp_request *req, struct sftp_request *req Revision-number: 3320 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:33.019141Z PROPS-END Revision-number: 3321 Prop-content-length: 188 Content-length: 188 K 10 svn:author V 5 simon K 8 svn:date V 27 2003-07-01T19:52:20.000000Z K 7 svn:log V 88 We ought to proactively initiate SSH2 key re-exchange, just in case the server doesn't. PROPS-END Node-path: putty-wishlist/data/ssh2-kex-repeat Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 912 Text-content-md5: 022c26a4b2e4b46f8807d9c0034bc966 Text-content-sha1: 78001eb2256b2c7a5d791e298e8b14e1b51886c5 Content-length: 1028 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Ability to initiate SSH2 key re-exchange Class: semi-bug Priority: medium Difficulty: tricky Depends: ssh2-kex-data Content-type: text/x-html-body

      Either side of an SSH2 connection may initiate a key re-exchange. Not all servers bother to do this, although I suspect most are happy to accept a re-exchange initiated by the client.

      PuTTY currently never initiates a re-exchange; it relies on the server to do so, and responds to it when it does. This doesn't always happen - at least some versions of the OpenSSH server follow the same policy, which means a re-exchange never occurs. We really ought to initiate re-exchange ourselves if the server doesn't.

      Before this can be done, we need to fix ssh2-kex-data, since otherwise the chances of receiving a data packet from the server just after sending our KEXINIT would be unacceptably high. Revision-number: 3322 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2003-07-02T20:48:27.000000Z K 7 svn:log V 13 depraved.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 233ea0b0ad4ba6c8b71a711e149eda4a Text-delta-base-sha1: ffd7ea6ee4a202a256ce48c40a6368111b73170e Text-content-length: 54 Text-content-md5: 879daa5ab96e9034abf68d9628cecfad Text-content-sha1: cd02d4f4849d7855c4572d0ab69e76efa1770ac5 Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN2 !hdepraved.org/putty/">depraved.org Revision-number: 3323 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2003-07-02T20:52:44.000000Z K 7 svn:log V 106 Summary: Perhaps terminal resets should reset window title(s) Message-ID: <3EFCBA0F.1020807@depraved.org> K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/term-reset-title Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 549 Text-content-md5: 074e87daf9bf5857f24ea134eec336b2 Text-content-sha1: 16d611000f0cf6f67dbd35e389dc02450b0638be Content-length: 665 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Perhaps terminal resets should reset window title(s) Class: wish Difficulty: fun Priority: low Content-type: text/x-html-body

      It might be nice if terminal resets (such as ESC c) caused the window and icon titles to revert to some default (whatever was configured in the session?). This might be generous to people who trash their terminal.

      xterm doesn't do this, but it probably isn't going to upset any applications. Revision-number: 3324 Prop-content-length: 323 Content-length: 323 K 8 svn:date V 27 2003-07-02T21:00:12.000000Z K 7 svn:log V 222 Summary: Server-controlled clearing of the scrollback Difficulty: taxing Message-ID: <20030602120404.GA19437@chiark.greenend.org.uk> Message-ID: K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/term-clear-scrollback Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 780 Text-content-md5: 35c6463f3f35c3411cf867c029c152a3 Text-content-sha1: 3225363abb491e8c3f7353b741064bf192af62d6 Content-length: 896 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN~~~Summary: Server-controlled clearing of the scrollback Class: wish Difficulty: taxing Priority: low Content-type: text/x-html-body

      It would sometimes be nice to be able to clear PuTTY's scrollback from the server (via an escape sequence). Example applications:

      • Terminal locking software (e.g. screen's C-a C-x) could issue this escape sequence.
      • If a lot of output is generated it makes use of the scrollback as a poor man's less easier.

      However, I've not yet found a suitable existing escape sequence, and a certain amount of soul-searching is required before we go inventing our own.

      It's been suggested that screen clears could do this. If so, it would have to be configurable, and disabled by default. Revision-number: 3325 Prop-content-length: 174 Content-length: 174 K 7 svn:log V 74 Martin Prikryl reports that WinSCP now supports SFTP. Links page updated. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-07-03T10:23:00.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bf15fdb5dc7ddad5a7fd496e2e089fde Text-delta-base-sha1: 3e0c0e78571146cd625fe969c898c5d4913b8205 Text-content-length: 28 Text-content-md5: a135487982d6c92ad23eacf4fa36211e Text-content-sha1: 039c791604257b9521450ef5de44ec844c4f7c83 Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN>G \dZFTP and Revision-number: 3326 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2003-07-03T12:14:58.000000Z K 7 svn:log V 56 Summary: unfix.org has further IPv6 patches; integrate? K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ipv6-patch-update Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 391 Text-content-md5: 1ccc4c651d93722d68be2e8373449fb9 Text-content-sha1: 50e971d11ff9dd0c48307f4d616b763c08fd7c56 Content-length: 507 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNyyySummary: unfix.org has further IPv6 patches; integrate? Class: wish Difficulty: fun Content-type: text/x-html-body

      We have integrated IPv6-related patches from unfix.org up to their patch level 4.

      However, they are now up to patch level 6 (at the time of writing). Should we integrate their further tweaks at some point? Revision-number: 3327 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2003-07-04T18:37:20.000000Z K 7 svn:log V 53 Add link to Snail Book comparison of SSH-1 and SSH-2 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-default Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bd06669287e931aaf95cfba85e1dfc47 Text-delta-base-sha1: 4708024f6856949fc46f151ffef7b8376e332a1d Text-content-length: 133 Text-content-md5: 8a8b61a7b87c8a369f2b4efb11584f94 Text-content-sha1: 37c38572e3d4695ca9d06243ec214b67abe3dd74 Content-length: 172 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNbQ o^o^ (For a starting point see the Snail Book FAQ.) Revision-number: 3328 Prop-content-length: 208 Content-length: 208 K 7 svn:log V 107 Summary: Use of MS Crypto API on Windows Some ill-informed speculation and musing about the MS Crypto API. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-07-04T19:12:45.000000Z PROPS-END Node-path: putty-wishlist/data/cryptoapi Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1376 Text-content-md5: 90ba293b58f3031f86b2a7e106016b3b Text-content-sha1: 51cbf42fb745d4a8e3f7b0c46894fb4c6acd0dcc Content-length: 1492 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNRRRSummary: Use of MS Crypto API on Windows Difficulty: tricky Priority: low Depends: mdpi Content-type: text/x-html-body

      We did once have some sort of optional support for the Microsoft Crypto API, but it rotted, and didn't support all the algorithms we needed (eg Blowfish), so was eventually removed.

      Quoth Simon:

      My other concern about CryptoAPI is the whole idea of handing a MS-controlled function a pointer and saying `here, take a look at my plaintext'. Not that I think MS is likely to be bugging that function (as it were) at the moment, but there's no point in making it easy for someone to install a modified DLL and trojan all cryptography done in the system.

      On the other hand, it might be good to be able to make use of the thermal noise-based random number generators now appearing in some commodity chipsets such as the Intel 810 FWH. These might be exposed through the Crypto API.

      May also be relevant to `smartcard-auth'.

      Any support would have to be optional (controlled by configuration option? Test for presence of API?). Probably an application for the MDPI. Revision-number: 3329 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 35 Consider bells as a display event. K 10 svn:author V 4 owen K 8 svn:date V 27 2003-07-05T11:35:33.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d8a213ea6655eca3e8cbf91f910a5208 Text-delta-base-sha1: 7248d44a22a735f06e9492fdb8d2437951a2be99 Text-content-length: 76 Text-content-md5: 9f4f19c213af6c48e8d40c2f5f242a28 Text-content-sha1: 2fae9c9e3b7fb506eaea00404cd9bb9090af7e3b Content-length: 117 K 15 cvs2svn:cvs-rev V 5 1.161 PROPS-END SVN D&Oseen_disp_event = TRUEw we text blin Revision-number: 3330 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2003-07-06T08:56:00.000000Z K 7 svn:log V 30 Hyperlink a bugtraq reference K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d84d3e0a95c9f96cb85595896f81f7a8 Text-delta-base-sha1: 14730993be707735be5ea0814d2ea83e690dc4fa Text-content-length: 83 Text-content-md5: b7319debe2baff1ed03c943a4534f991 Text-content-sha1: 2aa4e59fe4cee318b25863b535acc528495238b3 Content-length: 122 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN{/ ::;@ #1298 Revision-number: 3331 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2003-07-06T09:29:06.000000Z K 7 svn:log V 15 Another report K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ppk-empty-comment Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3a4cb67113b3f673c1d5763a539ec2a8 Text-delta-base-sha1: 5cbdb4d5cc50901a571735c1dbcc56bef19758b1 Text-content-length: 105 Text-content-md5: 0c81442c984f2cd20a7d41f524a89c40 Text-content-sha1: d7b9ef50bf3ab423cf654510b0d92979fc4770b3 Content-length: 144 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNqXXli>7A4B87D07376A54897E467B6ACD98B569F0C23@MBSP04.services.sp.trw.com

    Revision-number: 3332 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2003-07-06T09:34:03.000000Z K 7 svn:log V 61 Mention Roald Ribe's success with OpenWatcom and Makefile.vc K 10 svn:author V 5 jacob PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9d4baebff875695418e0c32742c44b75 Text-delta-base-sha1: 946abf7a757f0dbb5576b415bbcaa16f25e57883 Text-content-length: 245 Text-content-md5: 20ad25e712661baddc9c7fb764e5875d Text-content-sha1: e45df54289ba71aaf5b4117d7c340f4dab5bfa18 Content-length: 284 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNX8 ]]L (We've also had one report of success building with the OpenWatcom compiler -- www.openwatcom.org -- using Makefile.vc with `wmake -ms -f makefile.vc' and NO_MULTIMON, although we haven't tried this ourselves.) Revision-number: 3333 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.093640Z PROPS-END Revision-number: 3334 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.103294Z PROPS-END Revision-number: 3335 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.113028Z PROPS-END Revision-number: 3336 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2003-07-07T10:10:15.000000Z K 7 svn:log V 15 ...and another K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ppk-empty-comment Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0c81442c984f2cd20a7d41f524a89c40 Text-delta-base-sha1: d7b9ef50bf3ab423cf654510b0d92979fc4770b3 Text-content-length: 95 Text-content-md5: 30c52cb5f1794a520962b61b5ddd9dd8 Text-content-sha1: 559680ce7e3c4bcb5e5e54843cb289d1d820bc0b Content-length: 134 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNq:NlNli>001501c34423$ca8984a0$c600a8c0@Anya (with attached PPK) Revision-number: 3337 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.159912Z PROPS-END Revision-number: 3338 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.170633Z PROPS-END Revision-number: 3339 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2003-07-07T19:54:30.000000Z K 7 svn:log V 31 At last, I've reproduced this. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ppk-empty-comment Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 30c52cb5f1794a520962b61b5ddd9dd8 Text-delta-base-sha1: 559680ce7e3c4bcb5e5e54843cb289d1d820bc0b Text-content-length: 466 Text-content-md5: 825247582deddd531d71a41d93f3a788 Text-content-sha1: efcdeb37af51ff3fb5bbd7bbb3a3194367778267 Content-length: 505 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN:s 9*. 2003-06-29

    Update (JTN): I've reproduced this with PuTTY and PuTTYgen 2003-06-29, connecting to "SSH-1.99-OpenSSH_3.4p1 Debian 1:3.4p1-1" with SSH-2 and a passphrase'd RSA2 key which was configured on the server. No crash. The comment part of the PPK file looks like:

    0030                         43 6f 6d 6d 65 6e 74 3a           Comment:
    0040 20 0d 0a                                           ..             
    Revision-number: 3340 Prop-content-length: 139 Content-length: 139 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-07-07T20:41:11.000000Z K 7 svn:log V 39 Note workaround and outstanding query. PROPS-END Node-path: putty-wishlist/data/ppk-empty-comment Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 825247582deddd531d71a41d93f3a788 Text-delta-base-sha1: efcdeb37af51ff3fb5bbd7bbb3a3194367778267 Text-content-length: 235 Text-content-md5: 5c14547bfdc6db107a837ad4ca034e3d Text-content-sha1: c00bded84ac51070c3fac018c2a9b86c346a68c8 Content-length: 274 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNsKXsX

    The obvious workaround is to return from ssh.c:c_write() if called with len==0, but why do from_backend() and friends complain about zero-length writes in the first place? Revision-number: 3341 Prop-content-length: 114 Content-length: 114 K 7 svn:log V 14 Freshen links K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-07-08T08:14:55.000000Z PROPS-END Node-path: putty-wishlist/data/srp-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6cb1d4cb85d8fc97a4147eb11905f961 Text-delta-base-sha1: 4c56ae5611244e94ba902f9f91726783a3711e3a Text-content-length: 87 Text-content-md5: 42898ee1f5d00efc732197cc395264b9 Text-content-sha1: 9d46c4e5d1b09a27ced3384394d4232f552e0f90 Content-length: 126 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNw]<ASQ&lysator.liu.se/~nisse/lsh/freshmeat.net/projects/opensshsrp/ Revision-number: 3342 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.353736Z PROPS-END Revision-number: 3343 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.362537Z PROPS-END Revision-number: 3344 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.371202Z PROPS-END Revision-number: 3345 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.379919Z PROPS-END Revision-number: 3346 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.388703Z PROPS-END Revision-number: 3347 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.396930Z PROPS-END Revision-number: 3348 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.405738Z PROPS-END Revision-number: 3349 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.413822Z PROPS-END Revision-number: 3350 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.423168Z PROPS-END Revision-number: 3351 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.431800Z PROPS-END Revision-number: 3352 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:34.440308Z PROPS-END Revision-number: 3353 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2003-07-11T08:51:56.000000Z K 7 svn:log V 35 http://mirrors.duvarweb.net/putty/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 879daa5ab96e9034abf68d9628cecfad Text-delta-base-sha1: cd02d4f4849d7855c4572d0ab69e76efa1770ac5 Text-content-length: 70 Text-content-md5: f3dbab1c59d084cb3815ec81f638cc03 Text-content-sha1: a676880502678010d8479f5f5700bf231d4534bf Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN  1zn2mirrors.duvarweb.net/putty/">mirrors.duvarweb.net Revision-number: 3354 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 35 http://Mirrors.OmniComp.Org/PuTTY/ K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-07-11T15:30:28.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f3dbab1c59d084cb3815ec81f638cc03 Text-delta-base-sha1: a676880502678010d8479f5f5700bf231d4534bf Text-content-length: 108 Text-content-md5: a87cb3b34ec1e416a3581af0dcceb3db Text-content-sha1: 63118d3c007b6f5fb94bba947f3ed7af691aa163 Content-length: 148 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN VV)pli> mirrors.omnicomp.org Revision-number: 3355 Prop-content-length: 133 Content-length: 133 K 7 svn:log V 33 Add refs to impl notes and patch K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-07-11T15:33:11.000000Z PROPS-END Node-path: putty-wishlist/data/winnet-if2lo Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3dd9136211ed89f160734dd459332c01 Text-delta-base-sha1: d2162189aafdadb11aebb466e932aa46d283d528 Text-content-length: 201 Text-content-md5: f23adad576998b95909d2442d6051932 Text-content-sha1: eb9ea74e9956546b815cedcdce15ef1e2a9e3f34 Content-length: 240 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNW 6W6

    Implementation notes: 16112.28530.918046.276274@chiark.greenend.org.uk

    Patch (unreviewed): Pine.LNX.4.44.0307081113060.6374-200000@maggie.lkpg.cendio.se Revision-number: 3356 Prop-content-length: 257 Content-length: 257 K 8 svn:date V 27 2003-07-12T09:55:02.000000Z K 7 svn:log V 156 Summary: Trouble with netscreen firewalls and remote command Difficulty: taxing Don't even know if this is a bug yet (apparently OpenSSH also has trouble). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/netscreen-command Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1167 Text-content-md5: 1244640afd7d454ae973b7b42937180b Text-content-sha1: c3d53892dec520eeccab6d188d0d65dc7a3071a6 Content-length: 1283 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Trouble with netscreen firewalls and remote command Difficulty: taxing Present-in: 0.53b 2003-04-02 Content-type: text/x-html-body

    Apparently when plink or PuTTY connects to a netscreen firewall with a remote command such as "save", the session hangs after "Started session".

    Interactive connections with no command (with both plink and PuTTY) work fine.

    Some other clients (e.g. SecureCRT) are fine, but OpenSSH also has trouble:

    bash-2.05a# ssh 256.256.256.256 -l netscreen -v -v -v save
    OpenSSH_2.9 FreeBSD localisations 20011202, SSH protocols 1.5/2.0, OpenSSL 0x0090601f
    ...
    netscreen@257.257.257.257's password:
    debug3: clear hostkey 0
    debug3: clear hostkey 1
    debug1: Sending command: save
    debug1: Entering interactive session.
    Disconnecting: protocol error: rcvd type 15
    debug1: Calling cleanup 0x8059d60(0x0)

    (These firewalls claim a version string of SSH-1.5-SSH Protocol Compatible Server SCS 2.0. All connections are therefore SSH-1.)

    Reports:

    • EJEBKMGDPLHDFAOHCFBBEEFDCNAA.han@prolink.com.tr
    • 001701c32ed0$95efc5a0$9501a8c0@adcom
    Revision-number: 3357 Prop-content-length: 228 Content-length: 228 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-07-12T10:27:43.000000Z K 7 svn:log V 127 Change "miscategorised bugs/wishes" description, since quite a few things seem to be ending up there (and I plan to add more). PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 99c09be2faa69916065879d0073add5d Text-delta-base-sha1: 0f9a635492883385f5b194a87a792834f8c7f67a Text-content-length: 285 Text-content-md5: 0c2dfdd66f46f290e317e9b761af397c Text-content-sha1: e594159f8f9e7789c4ad6733eeb89a69e1ed2873 Content-length: 325 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN 8#n

    Usually items we don't know enough about, or haven't yet thought about enough, to fully classify my $class = ($hdrs->{class} or "artifact")$class$class Revision-number: 3358 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2003-07-12T13:25:43.000000Z K 7 svn:log V 121 Add section on "Access denied". This was mostly inspired by the password camouflage problems with SSH-1.5-OSU_1.4alpha3. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 859a39e88aa56d3c795c7748befcb484 Text-delta-base-sha1: d2b9408283066921fb3e6aebece3d4a61e32163f Text-content-length: 679 Text-content-md5: c4090331bf8bb64af31acc07ce32fef1 Text-content-sha1: 4c03becc6c5344d017159e8f981d073e52c6923e Content-length: 718 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN%B:6o\versionid $Id: errors.but,v 1.7 2003/07/12 13:25:43 jacobaccess-denied} \q{Access denied}, \q{Authentication during authentication. If you see one of these messages, it means that the server has refused all the forms of authentication PuTTY has tried and it has no further ideas. It may be worth checking the Event Log for diagnostic messages from the server giving more detail. This error can be caused by buggy SSH-1 servers that fail to cope with the various strategies we use for camouflaging passwords in transit. Upgrade your server, or use the workarounds described in \k{config-ssh-bug-ignore1} and possibly \k{config-ssh-bug-plainpw1} Revision-number: 3359 Prop-content-length: 779 Content-length: 779 K 7 svn:log V 678 Add SSH-1 password camouflage bug detection for version OSU_1.4alpha3 of the OSU VMS SSH server . The changelog appears to indicate that the server was fixed for pwplain1 at 1.5alpha4, and for IGNORE and DEBUG messages at 1.5alpha6. However I'm going to go on the reports we've had as I haven't tested this; and they indicate only that 1.5alpha6 is known not to require any bug compatibility modes. (I wasn't sure whether to add this at all, given that upgrading to version OSU_1.5alpha6 is an easy way to fix the problem. However, there is precedent for adding detection for old versions of servers which have since been fixed.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-07-12T13:45:21.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 332e48ec02e9cf287f70474a4ae31e11 Text-delta-base-sha1: 58605ad006990716641a0c3ec998c20f3160ef3f Text-content-length: 185 Text-content-md5: d33e5ff1378a5e0fbd0f30b5bda17f5e Text-content-sha1: cdadabd18772069bbb2d26911175a387df383e43 Content-length: 226 K 15 cvs2svn:cvs-rev V 5 1.299 PROPS-END SVNAQyOuF || !strcmp(imp, "OSU_1.4alpha3 || !strcmp(imp, "OSU_1.4alpha3^EE1_stdout_throttling = 1; ssh1_throttle(ssh, +1); } } els Revision-number: 3360 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2003-07-12T14:09:44.000000Z K 7 svn:log V 66 Summary: PuTTY's placement of PUTTY.RND is non-optimal on Windows K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-randseed-location Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 906 Text-content-md5: bfb7b571d725c00cc3d862f4e609923a Text-content-sha1: bbc51470a942d7fec93afd49b1d5300d996c15ce Content-length: 1022 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN|||Summary: PuTTY's placement of PUTTY.RND is non-optimal on Windows Class: semi-bug Difficulty: fun Priority: medium Content-type: text/x-html-body

    PuTTY attempts to store its random number seed file PUTTY.RND in a sensible place (such as the user's home directory), as described in the FAQ.

    However, we've had various reports that this isn't working as designed, and that PUTTY.RND is ending up in C:\. This has been reported on Windows 2000 and XP.

    Suggested alternative from 001201c32fd3$8c5484a0$bc1eb440@hyperwolf: use one of the paths returned by SHGetFolderPath (requires some faffing wrt old Windows versions).

    (If this is fixed, perhaps we should continue to support reading the files from their old locations.) Revision-number: 3361 Prop-content-length: 128 Content-length: 128 K 7 svn:log V 28 Summary: Timestamps in logs K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-07-12T18:58:03.000000Z PROPS-END Node-path: putty-wishlist/data/log-timestamp Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 358 Text-content-md5: 0c4506b3bf5012f01930f877893cb1d8 Text-content-sha1: a280711278aef62d414323e8b00f874a66585607 Content-length: 474 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNXXXSummary: Timestamps in logs Class: wish Difficulty: tricky Priority: low Timestamps would occasionally be useful in the log files PuTTY produces. Deciding where to put timestamps in SSH packet logs is trivial -- packet starts and Event Log entries. Some people want timestamping in raw terminal logs. This is a rather harder design problem. Revision-number: 3362 Prop-content-length: 112 Content-length: 112 K 7 svn:log V 12 missing

    K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-07-13T09:01:22.000000Z PROPS-END Node-path: putty-wishlist/data/pterm-scrollopt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f276818bd87495dd4478377250b18114 Text-delta-base-sha1: 03d9e1ea94b675398a6d70fadba6ee748756bbf1 Text-content-length: 22 Text-content-md5: 3a10d8032098c0ad5c233a2ef5b9cbd2 Text-content-sha1: f2c32e11bf91d1172664a2fa34dfc6a430d5dfb3 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN ts

    Revision-number: 3363 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:35.083114Z PROPS-END Revision-number: 3364 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:35.091568Z PROPS-END Revision-number: 3365 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:35.100632Z PROPS-END Revision-number: 3366 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:35.109013Z PROPS-END Revision-number: 3367 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:35.117404Z PROPS-END Revision-number: 3368 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2003-07-16T08:28:31.000000Z K 7 svn:log V 90 Clarify that '-m' takes a _local_ file. ref. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5f8d03f4f63400be3f1424bf9b0f85ae Text-delta-base-sha1: 7d910f8d23b8be53a6bcd3ccb305626d2184b43d Text-content-length: 89 Text-content-md5: 13ede797eef7df974e01d4b1f4b5d129 Text-content-sha1: 3ef2fd51b64b2962126634b148077a7570d0a2ab Content-length: 129 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNFL ?::Ss\versionid $Id: using.but,v 1.15 2003/07/16 08:28:31 jacoblocal Revision-number: 3369 Prop-content-length: 155 Content-length: 155 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-07-16T09:14:41.000000Z K 7 svn:log V 55 Summary: Support for public key distribution subsystem PROPS-END Node-path: putty-wishlist/data/subsystem-publickey Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 948 Text-content-md5: 7dae56e6ea310abd90df65b3dd764afc Text-content-sha1: af064d667e4565a79a47f54c8a354437e2c54f7a Content-length: 1064 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN&&&Summary: Support for public key distribution subsystem Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body

    VanDyke are pushing an implementation-independent subsystem publickey@vandyke.com for the distribution of public keys over SSH-2 connections. See draft-galb-secsh-publickey-subsystem-01 (current at time of writing).

    We get quite a lot of mail from people having trouble setting up PK on their server. Perhaps we should have some form of support for this, on general principles of encouraging public-key auth. Need to think about what form it would take.

    VanDyke have implementations (their own software, and a patch for OpenSSH). I don't know whether anyone else does. Revision-number: 3370 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2003-07-16T14:06:05.000000Z K 7 svn:log V 28 Add subsystem name to title K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/subsystem-publickey Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7dae56e6ea310abd90df65b3dd764afc Text-delta-base-sha1: af064d667e4565a79a47f54c8a354437e2c54f7a Text-content-length: 95 Text-content-md5: 7c8f85242aa86cc8e85ec2b1adbecba4 Text-content-sha1: 177d8300f08376bfa3fb61c2484eff34a8fd31b9 Content-length: 134 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN&>NNp6Summary: Support for public key distribution subsystem `publickey@vandyke.com' Revision-number: 3371 Prop-content-length: 162 Content-length: 162 K 7 svn:log V 64 Summary: PuTTY's interpretation of SGR 21 differ's from Linux's K 10 svn:author V 3 ben K 8 svn:date V 27 2003-07-16T15:59:25.000000Z PROPS-END Node-path: putty-wishlist/data/sgr21 Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 573 Text-content-md5: 68c43519623aedcdf4d1f1fb30207743 Text-content-sha1: 72219e882d3b9b21ab8364d03611343bd0b2f699 Content-length: 689 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN///Summary: PuTTY's interpretation of SGR 21 differ's from Linux's Class: semi-bug Priority: low Difficulty: fun Content-type: text/plain ECMA-48 defines SGR 21 as enabling double-underline. PuTTY interprets this the same as single-underline (SGR 4). SCOANSI and Linux interpret it as turning off bold, and at least some applications seem to rely on this. VT520 and xterm don't support this sequence at all. Perhaps PuTTY should align its behaviour with one of the others. xterm would be more ideologically pure, but SCOANSI might be more generally useful. Revision-number: 3372 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2003-07-16T23:20:02.000000Z K 7 svn:log V 18 WinSCP has moved. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a135487982d6c92ad23eacf4fa36211e Text-delta-base-sha1: 039c791604257b9521450ef5de44ec844c4f7c83 Text-content-length: 36 Text-content-md5: cf078f5d884c7986bf21066670d486db Text-content-sha1: 5de98d70a90c67ff3934f8ebe167c912c04f3e48 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNGL 9Csourceforge.net Revision-number: 3373 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:35.365160Z PROPS-END Revision-number: 3374 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:35.373653Z PROPS-END Revision-number: 3375 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:35.402586Z PROPS-END Revision-number: 3376 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:35.411945Z PROPS-END Revision-number: 3377 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2003-08-02T18:10:48.000000Z K 7 svn:log V 74 xterm apparently has a sequence for this, so we don't have to invent one. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/term-clear-scrollback Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 35c6463f3f35c3411cf867c029c152a3 Text-delta-base-sha1: 3225363abb491e8c3f7353b741064bf192af62d6 Text-content-length: 155 Text-content-md5: 58346e96a509163275470fffb8330097 Text-content-sha1: 8073f87f319b7941701693610f180c3236b07bc0 Content-length: 194 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN~fNT~funxterm uses an extension to ED to do this, in the form of CSI 3 J. We could do the same Revision-number: 3378 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:35.473644Z PROPS-END Revision-number: 3379 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2003-08-05T12:19:58.000000Z K 7 svn:log V 21 Up to patch level 7. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ipv6-patch-update Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1ccc4c651d93722d68be2e8373449fb9 Text-delta-base-sha1: 50e971d11ff9dd0c48307f4d616b763c08fd7c56 Text-content-length: 21 Text-content-md5: f6b9658f4d87a9617652cbcc733f699b Text-content-sha1: ade1e85bb2609de664e52d25dbd46ed2917e5d37 Content-length: 60 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNyy %S&7 Revision-number: 3380 Prop-content-length: 838 Content-length: 838 K 8 svn:date V 27 2003-08-05T12:30:12.000000Z K 7 svn:log V 737 Change the VanDyke publickey OpenSSH patch link to an HTTP one provided by Alan Dobkin (which is apparently the link that VanDyke publish). This redirects to the previous location at the time of writing. This should get around a bug in wget 1.8.2 (the current version at the time of writing), which apparently always traverses across hosts (--span-hosts) regardless of configuration if it encounters an https link. This caused us to get numerous complaints from mirrors which had sucked down gigabytes of the web as a result. *sigh* Moral: Simon's hunch about not gratuitously adding URL schemes has a sound basis. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/subsystem-publickey Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7c8f85242aa86cc8e85ec2b1adbecba4 Text-delta-base-sha1: 177d8300f08376bfa3fb61c2484eff34a8fd31b9 Text-content-length: 64 Text-content-md5: 5c76972d6654e1bf549344ea65b7a119 Text-content-sha1: 66aba27df853a7e86a31bbf542509c0f36cf7911 Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN>4 ,GA}://www.vandyke.com/download/os/pks_form.html Revision-number: 3381 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2003-08-05T18:49:51.000000Z K 7 svn:log V 61 Summary: Foundry Networks 1.2.27 port has SSH_MSG_IGNORE bug K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/foundry-ignore-bug Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 473 Text-content-md5: b5a9d1146cc726749592aa13b53c116d Text-content-sha1: 70ddba9502aa252d83945293a8b6ee263476f183 Content-length: 589 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNKKKSummary: Foundry Networks 1.2.27 port has SSH_MSG_IGNORE bug Priority: medium Difficulty: fun Content-type: text/plain Some Foundry Networks devices apparently include an F-Secure-derived SSH server which reports itself as "1.2.27", but has the SSH_MSG_IGNORE bug, which both PuTTY and OpenSSH think stock 1.2.27 doesn't have. PuTTY could deal with this by assuming that all things claiming to be 1.2.27 have this bug, though that might be considered ugly. Revision-number: 3382 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2003-08-06T09:21:23.000000Z K 7 svn:log V 38 http://www.amongthemortals.com/putty/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a87cb3b34ec1e416a3581af0dcceb3db Text-delta-base-sha1: 63118d3c007b6f5fb94bba947f3ed7af691aa163 Text-content-length: 88 Text-content-md5: 346248775ce40e0eee236150e76a1dcb Text-content-sha1: 6aed9601ed914a3edc26322550da2f8753d17c14 Content-length: 128 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN BBKHwww.amongthemortals.com/putty/">amongthemortals.com in Finland Revision-number: 3383 Prop-content-length: 1042 Content-length: 1042 K 8 svn:date V 27 2003-08-07T16:04:33.000000Z K 7 svn:log V 941 Control of 'addr' is now handed over to {platform_,}new_connection() and sk_new() on invocation; these functions become responsible for (eventually) freeing it. The caller must not do anything with 'addr' after it's been passed in. (Ick.) Why: A SOCKS5 crash appears to have been caused by overzealous freeing of a SockAddr (ssh.c:1.257 [r2492]), which for proxied connections is squirreled away long-term (and this can't easily be avoided). It would have been nice to make a copy of the SockAddr, in case the caller has a use for it, but one of the implementations (uxnet.c) hides a "struct addrinfo" in there, and we have no defined way to duplicate those. (None of the current callers _do_ have a further use for the SockAddr.) As far as I can tell, everything _except_ proxying only needs addr for the duration of the call, so sk_addr_free()s immediately. If I'm mistaken, it should at least be easier to find the offending free()... K 10 svn:author V 5 jacob PROPS-END Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c730952cd41488d03b0ce764cb91f4da Text-delta-base-sha1: b4cf94ddb0ff044bc78a81f633c11f0cf69c0782 Text-content-length: 72 Text-content-md5: 2dba353e94bf7bc0903da5708fc4600e Text-content-sha1: faa3e6f67b1d8b82fa441d81b4caa12ed20c363f Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN9 1~ xsk_addr_free(addr); /* don't need this anymore */ Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 828de625d6df31ab3f3812f4de5ed656 Text-delta-base-sha1: 5a77f102447a1b14361f7690f8ac443aaaef3e9f Text-content-length: 77 Text-content-md5: e36c12f5f1577222c10e13c56b12c6f4 Text-content-sha1: 2f1a6eeca1c7ef41920f316ad8491b26edea3a2e Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNI 8=7/* XXX: don't know whether we can sk_addr_free(addr); */ Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3c5c9e2148a1be4fa3aad72555ce0986 Text-delta-base-sha1: b72e0a1643b9816bc8d29bafbfeb5e3f5cfa726f Text-content-length: 300 Text-content-md5: 275a303fefcb3432bb44ed88857cf406 Text-content-sha1: a04a08c72b1f93091367bbc644d80f26300233d8 Content-length: 340 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNy %c !jremote_addr /* will need to be freed on close */ Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cf619de0c08e76b3b61087ef4d5fd2a0 Text-delta-base-sha1: 203297b554d29ecfa76e715bdbad7090e7abf610 Text-content-length: 68 Text-content-md5: f396c0980296aa6a1dacf34faf96565a Text-content-sha1: 026f3d49709d4bbde449c7405fde785e7dd81538 Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNFJ* 4bd { sk_addr_free(addr); return err; } Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b8cdbff346a74d529d638ad14c4a6a58 Text-delta-base-sha1: bb3ab54745563ff0ff901c8f096d0ebb0a1fb77b Text-content-length: 68 Text-content-md5: 7d94ae65aefcb33a4dfaf51bbeb09070 Text-content-sha1: 89c81629f277bdb61d304548bbb6ecfb467bbe2a Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVN<@*/D<# { sk_addr_free(addr); return err; } Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d33e5ff1378a5e0fbd0f30b5bda17f5e Text-delta-base-sha1: cdadabd18772069bbb2d26911175a387df383e43 Text-content-length: 66 Text-content-md5: 436336497c908efcc9fa8bb26cd03fc2 Text-content-sha1: 7f225d8584b1129dc42885b46f3153d17ccd9ff9 Content-length: 107 K 15 cvs2svn:cvs-rev V 5 1.300 PROPS-END SVN f~1_stdout_throttling = 1;^FF Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 86fdcf1fb4a406ff4a21c587ba0ed9f7 Text-delta-base-sha1: 67edd31ffd3e2f16c898e72bc87711239fb85e3e Text-content-length: 73 Text-content-md5: db7d2c3f810e4a1b794e36d0b568b965 Text-content-sha1: aef3ec20263d295450e902c736f798f20dc859c4 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVN[_*$L1E { sk_addr_free(addr); return err; } Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 71d97152ad939c62250c76aebdc6cf57 Text-delta-base-sha1: 46d6b869315ca98351d08e14baba9eac052cd887 Text-content-length: 40 Text-content-md5: 814b5275359831e891342fb9a7e2adc4 Text-content-sha1: b3bb084e84828bd43626f5d70c78009be3cf8aa2 Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN, k0csk_addr_free(addr Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e5a28961a409c75b78ba7ce590811282 Text-delta-base-sha1: 0cfb3b1dd0b9d603b3a6c57c59379078bc1eb834 Text-content-length: 130 Text-content-md5: 3bc33957aab1a964b7e2f428a69db9d7 Text-content-sha1: 0f7f6c6cde52417039da0d722a0f9e23a83f5898 Content-length: 169 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN$~q q/* We are responsible for this and don't need it any more */ sk_addr_free(addr); return (Socket) ret; } Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 374a1557a550b9678b5e3c7d516eb587 Text-delta-base-sha1: 363961c7a67efd8428616989bd996bdf6e9237c1 Text-content-length: 80 Text-content-md5: 87a3b59b473485d2313f5e7fa68fbaea Text-content-sha1: 3ef096ae9764fd2e3d60a563bbcb3b6b2cabc0cc Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVN H 78Y0/* We're done with 'addr' now. */ sk_addr_free(addr Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 130a00c31b1a7f76643e4596332d1855 Text-delta-base-sha1: aac40d04e6d69e07c8d7746061feb302e3acedd7 Text-content-length: 68 Text-content-md5: 54b20d0da322c2813a9eeaa91098c92b Text-content-sha1: 571e0a924ac56238067a3c3178135416bfe30445 Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN*$91 { sk_addr_free(addr); return err; } Revision-number: 3384 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.360337Z PROPS-END Revision-number: 3385 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.368097Z PROPS-END Revision-number: 3386 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.377332Z PROPS-END Revision-number: 3387 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.386135Z PROPS-END Revision-number: 3388 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.394684Z PROPS-END Revision-number: 3389 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.403139Z PROPS-END Revision-number: 3390 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.412122Z PROPS-END Revision-number: 3391 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.421519Z PROPS-END Revision-number: 3392 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.431061Z PROPS-END Revision-number: 3393 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.440406Z PROPS-END Revision-number: 3394 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.449030Z PROPS-END Revision-number: 3395 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.457763Z PROPS-END Revision-number: 3396 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.466222Z PROPS-END Revision-number: 3397 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.475267Z PROPS-END Revision-number: 3398 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.484970Z PROPS-END Revision-number: 3399 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2003-08-11T12:13:00.000000Z K 7 svn:log V 35 Summary: Predefined colour schemes K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/colour-scheme Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 605 Text-content-md5: 4b6740cdf0f97fa4c19e0c089d3bfe5b Text-content-sha1: 8462204bba75688acdfc4cd554562a51e4216489 Content-length: 721 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNOOOSummary: Predefined colour schemes Difficulty: tricky Priority: low Class: wish Content-type: text/plain A couple of people would like to have a bunch of pre-defined colour schemes shipped with PuTTY and some means of switching between them. One person specifically requested on where blue and red are lighter than the default to make them more readable on a black background. It's not entirely clear to me why colours are different from any other configuration option in this regard, though I suppose the fact that all the colour settings go together might have something to do with it. Revision-number: 3400 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2003-08-11T19:13:47.000000Z K 7 svn:log V 102 Summary: Support for text conversions in SFTP (now that a standard exists to implement, i.e. SFTP v4) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sftp-text Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 589 Text-content-md5: feeaf18be3c9507d484322aff3508e83 Text-content-sha1: 7499a6bdfc864494ddc4b574b93f1ee3feac8234 Content-length: 705 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN???Summary: Support for text conversions in SFTP Class: wish Difficulty: tricky Priority: medium Content-type: text/x-html-body

    The FAQ correctly states that we don't support line-ending conversion in SFTP (and SCP), and suggests that standardisation effort is needed.

    SSH_FXP_TEXT has now been proposed in SFTP v4 (see draft-ietf-secsh-filexfer-04). I don't know what implementations exist. Revision-number: 3401 Prop-content-length: 300 Content-length: 300 K 8 svn:date V 27 2003-08-12T08:37:15.000000Z K 7 svn:log V 199 Retire `sftp-text' in favour of `line-endings', which I missed yesterday. (For those just tuned in: SFTP v4 has support for a "text" file type on the wire.) Mutter about local heuristics. s/FXP/FXF/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/line-endings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8c07ebe7242dca4dce8498c76454a824 Text-delta-base-sha1: c5505d4e09dc503f81d2938d1ead6b5d682375d2 Text-content-length: 610 Text-content-md5: 66a9740e2c7d42f150d31ebc528343f4 Text-content-sha1: cd341c0439355e1f5e6ee6ed3cf6fc3c93aca8f0 Content-length: 649 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN@ MD?D Summary: Line ending conversion in PSCP and PSFTP Difficulty: trickyHeuristics shouldn't now be needed at the protocol end for SFTP, as SSH_FXF_TEXT has now been proposed in SFTP v4 (see draft-ietf-secsh-filexfer-04). I don't know what implementations exist.

    Should we require explicit triggering of this mechanism for local files via a command/option, or should we have a "guess" mode? If the latter, I think we should be able to spot and cope with Unix-style files on a Windows system. Node-path: putty-wishlist/data/sftp-text Node-action: delete Revision-number: 3402 Prop-content-length: 197 Content-length: 197 K 7 svn:log V 97 Link to the internet-draft that's just been published. Leave at "taxing" until it matures a bit. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-08-13T14:58:49.000000Z PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c2347823c43867196ca32ef283293f08 Text-delta-base-sha1: 60ed893507d2b623696a7645dbd812cf23616dc8 Text-content-length: 211 Text-content-md5: 73f1b01b2f78edc197f2e3fc84c98c54 Text-content-sha1: 2dcc5eb91cfd796a4c6e6bb476a96fe0aef14154 Content-length: 250 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNY@Y@

    Update: a set of URL schemes has been proposed in draft-ietf-secsh-scp-sftp-ssh-uri-00. Revision-number: 3403 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2003-08-13T17:15:23.000000Z K 7 svn:log V 74 http://putty.mirrors.key2network.com/ <20030812224417.GC4162@nordheim.no> K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 346248775ce40e0eee236150e76a1dcb Text-delta-base-sha1: 6aed9601ed914a3edc26322550da2f8753d17c14 Text-content-length: 91 Text-content-md5: d1e1ac4b63a8dcf2061a84939ab43a7c Text-content-sha1: a91fc9cc3c5a013fa4c2f1e5dbf3dea333a3a56f Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN EE8Xmirrors.key2network.com/">putty.mirrors.key2network.com in Norway Revision-number: 3404 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2003-08-13T17:18:53.000000Z K 7 svn:log V 66 http://putty.fveres.com/ <1060330944.5878.28.camel@ns.fveres.com> K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d1e1ac4b63a8dcf2061a84939ab43a7c Text-delta-base-sha1: a91fc9cc3c5a013fa4c2f1e5dbf3dea333a3a56f Text-content-length: 67 Text-content-md5: fbb7df3fcea7b8ec76574b55734db408 Text-content-sha1: eedf308f1530a04c7422fe5292d3e3f682da34e8 Content-length: 107 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN*<CZputty.fveres.com in Roman Revision-number: 3405 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.824788Z PROPS-END Revision-number: 3406 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:36.833168Z PROPS-END Revision-number: 3407 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2003-08-20T20:52:36.000000Z K 7 svn:log V 61 Noted problems with SSH I-D were fixed in assignednumbers-03 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-des-cbc-is-std Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 25b31aaa0d24e506afcb682cc5cf1246 Text-delta-base-sha1: 305c3efd422883510cca5cacb1381ab597171c10 Text-content-length: 64 Text-content-md5: 0d55ea27ef92885a9abbcc5c61b7f4d1 Text-content-sha1: 81d121da67355b24580ac111d17ad0fbd55801e5 Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN+d +9+4.txt"> draft-ietf-secsh-assignednumbers-04 Revision-number: 3408 Prop-content-length: 276 Content-length: 276 K 8 svn:date V 27 2003-08-21T18:03:06.000000Z K 7 svn:log V 175 Richard Boulton's patch for improved correctness in selection handling (generally, selection request timestamps should be set to the timestamp on the event that caused them). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 46205a2a44f5fb91705ca10a272039ad Text-delta-base-sha1: 58d0bd8c65df1655cc51a1a9bc38c48cfaf27adb Text-content-length: 598 Text-content-md5: 68b02fe2583326a24d02606857bea239 Text-content-sha1: 3ac07673b0022e973aa581314fd9725d9941b0fb Content-length: 639 K 15 cvs2svn:cvs-rev V 5 1.136 PROPS-END SVN[mM C'F=F0Q@F?4baTT9Rh guint32 input_event_time; /* Timestamp of the most recent input event. */Remember the timestamp. */ inst->input_event_time = event->time/* Remember the timestamp. */ inst->input_event_time = event->time/* Remember the timestamp. */ inst->input_event_time = event->timeinst->input_event_time term_deselect(inst->term) inst->input_event_time inst->input_event_time inst->input_event_time inst->input_event_time inst->input_event_time Revision-number: 3409 Prop-content-length: 518 Content-length: 518 K 7 svn:log V 417 Richard B's patch to support X cut buffers as well as ordinary selections, meaning that (a) a pterm can leave copied text in the cut buffer after it terminates so that applications can pick it up even though it isn't still around to deliver the selection in person, and (b) pterm can pick up things left in this way by other apps. Downside is that all of this only happens in ISO8859-1, because X is weird like that. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-08-21T18:07:27.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 68b02fe2583326a24d02606857bea239 Text-delta-base-sha1: 3ac07673b0022e973aa581314fd9725d9941b0fb Text-content-length: 2406 Text-content-md5: 70855702eb8c215874b591e3c8ec1aba Text-content-sha1: c011784a96bb1619a268cf839d065a468e8bbeb0 Content-length: 2447 K 15 cvs2svn:cvs-rev V 5 1.137 PROPS-END SVNW@r}) jmxsecF|1>l#include pasteout_data, inst->pasteout_data_len);freeIf we have data, but it's not of a type we can deal with, * we have to ignore the data. */ if (seldata->length > 0 && seldata->type != GDK_SELECTION_TYPE_STRING && seldata->type != compound_text_atom && seldata->type != utf8_string_atom) return; /* * If we have no data, try looking in a cut buffer. */ if (seldata->length <= 0) { text = retrieve_cutbuffer(&length); if (length == 0) return; /* Xterm is rumoured to expect Latin-1, though I havn't checked the * source, so use that as a de-facto standard. */ charset = CS_ISO8859_1; free_required = 1; } else { if (free_required) XFree(tex init_cutbuffers( Revision-number: 3410 Prop-content-length: 307 Content-length: 307 K 8 svn:date V 27 2003-08-21T18:39:17.000000Z K 7 svn:log V 206 Richard B's patch to enable users to explicitly request shadow bold by disabling bold-font-name guessing (if their bold fonts are ugly). I've turned the UI inside out, but the meat is pretty much the same. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1addb6fc51f8d964b2c626996e475eab Text-delta-base-sha1: dd9e500d855e9fd95fd0b0cad56aaa83b4e99720 Text-content-length: 37 Text-content-md5: 6ec0a6f3ea0f4f53441a131bd3ab03ba Text-content-sha1: 1ce78036fbea343aa9dfd8d91f722f4f2f049026 Content-length: 78 K 15 cvs2svn:cvs-rev V 5 1.221 PROPS-END SVN';  $int shadowbold Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d410ee542c3301719fbdbf0d026554c6 Text-delta-base-sha1: 62efc6053325c53f0cdd1c455154f723fce13114 Text-content-length: 92 Text-content-md5: 647ab4085958c19388b9246182579232 Text-content-sha1: ffd0da2aaba1b5fbac37bbf0c3df1f645a88255d Content-length: 133 K 15 cvs2svn:cvs-rev V 5 1.111 PROPS-END SVN>/)o#", cfg->shadowboldi(sesskey, "ShadowBold", 0, &cfg->shadowbold Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 70855702eb8c215874b591e3c8ec1aba Text-delta-base-sha1: c011784a96bb1619a268cf839d065a468e8bbeb0 Text-content-length: 1566 Text-content-md5: e98a8f991b4c50ab67879022c3af1635 Text-content-sha1: 75e52b54b5c2b67f77f0a959b130825ad1df360d Content-length: 1607 K 15 cvs2svn:cvs-rev V 5 1.138 PROPS-END SVNWEqdS1:~8shadowbold) { inst->fonts[1] = NULL; } else { if (inst->cfg.boldfont.name[0]) { name = inst->cfg.boldfont.name; guessed = FALSE; } else { name = guess_derived_font_name(inst->fonts[0], TRUE, FALSE); guessed = TRUE; } inst->fonts[1] = name ? gdk_font_load(name) : NULL; if (inst->fonts[1]) { set_font_info(inst, 1); } else if (!guessed) { fprintf(stderr, "%s: unable to load bold font \"%s\"\n", appname, inst->cfg.boldfont.name); exit(1); } if (guessed) sfree(name); }shadowbold) { inst->fonts[3] = NULL; } else { if (inst->cfg.wideboldfont.name[0]) { name = inst->cfg.wideboldfont.name; guessed = FALSE; } else { /* * Here we have some choices. We can widen the bold font, * bolden the wide font, or widen and bolden the standard * font. Try them all, in that order! */ if (inst->cfg.widefont.name[0]) name = guess_derived_font_name(inst->fonts[2], TRUE, FALSE); else if (inst->cfg.boldfont.name[0]) name = guess_derived_font_name(inst->fonts[1], FALSE, TRUE); else name = guess_derived_font_name(inst->fonts[0], TRUE, TRUE); guessed = TRUE; } inst->fonts[3] = name ? gdk_font_load(name) : NULL; if (inst->fonts[3]) { set_font_info(inst, 3); } else if (!guessed) { fprintf(stderr, "%s: unable to load wide/bold font \"%s\"\n", appname, inst->cfg.wideboldfont.name); exit(1); } if (guessed) sfree(name); } || oldcfg.shadowbold != cfg2.shadowbold Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 34caf37bee3ab9866b21cdded8c86692 Text-delta-base-sha1: 4e7749b7235dfcaa099712666d7ffbfcc035103c Text-content-length: 336 Text-content-md5: 5b013de9c9a3661de9f34832c3c8bc63 Text-content-sha1: 34a1f3a9c38a2c4d3adca4a8464a76f4775a1ca8 Content-length: 375 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN 7 8&8Y2checkbox(s, "Use shadow bold instead of bold fonts", 'u', HELPCTX(no_help), dlg_stdcheckbox_handler, I(offsetof(Config,shadowbold))); ctrl_text(s, "(Note that bold fonts or shadow bolding are only" " used if you have not requested bolding to be done by" " changing the text colour.) Revision-number: 3411 Prop-content-length: 506 Content-length: 506 K 8 svn:date V 27 2003-08-21T19:48:45.000000Z K 7 svn:log V 405 Fix for `slow-startup-printer': use PRINTER_INFO_4 on NT-class systems, which apparently tries less hard to find printers so won't slow the system down. Tested on 2000 and 98; in both cases printer enumeration and printing worked as well as they did in 2003-08-21. Made a single shared copy of osVersion in winmisc.c so that printing.c can find it. Made other users (window.c, pageant.c) use this copy. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 044704afe344c257805f8a4c078bbae9 Text-delta-base-sha1: 678992174a82fb8cd77d70982d0a74411335b214 Text-content-length: 136 Text-content-md5: 1a6f21466b9bb315379aa26ade0f9194 Text-content-sha1: 4aa2117a640f20aaa7de8c4f1c71f8a027ccee0a Content-length: 176 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVN ]h1{HhIAif (!init_winver()) { modalfatalbox("Windows refuses to report a version"); } if (osVersion Node-path: putty/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5125d9725bf4c42ae6d1c7bffc5f7467 Text-delta-base-sha1: 2710148014654cf994ff69b567aa814bc6791165 Text-content-length: 1332 Text-content-md5: 6e0b2c24e1abe0fbe8a08884ad20cf47 Text-content-sha1: 6a751d2bdf1ab2cb88e28f72fdcb263af99c82b6 Content-length: 1371 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNr9oQfkO3m|* hw |"L5tb#include "winstuff.h" struct printer_enum_tag { int nprinters; DWORD enum_level; union { LPPRINTER_INFO_4 i4; LPPRINTER_INFO_5 i5; }DWORD levellevellevel/* * Determine what enumeration level to use. * When enumerating printers, we need to use PRINTER_INFO_4 on * NT-class systems to avoid Windows looking too hard for them and * slowing things down; and we need to avoid PRINTER_INFO_5 as * we've seen network printers not show up. * On 9x-class systems, PRINTER_INFO_4 isn't available and * PRINTER_INFO_5 is recommended. * Bletch. */ if (osVersion.dwPlatformId != VER_PLATFORM_WIN32_NT) { ret->enum_level = 5; } else { ret->enum_level = 4; } retval = printer_add_enum(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, ret->enum_level,switch (ret->enum_level) { case 4: ret->info.i4 = (LPPRINTER_INFO_4)buffer; break; case 5: ret->info.i5 = (LPPRINTER_INFO_5)buffer; break; }switch (pe->enum_level) { case 4: return pe->info.i4[i].pPrinterName; case 5: return pe->info.i5[i].pPrinterName; default: return NULL; }witch (pe->enum_level) { case 4: sfree(pe->info.i4); break; case 5: sfree(pe->info.i5); break; } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fe88e4abd99bbd620b0a0a3b023b6295 Text-delta-base-sha1: 10e4285f2f024c8462a7cd0b10aa227885d9f561 Text-content-length: 463 Text-content-md5: d871ed78eae69e59e3a8b0af6e729fbe Text-content-sha1: d5c60cad36d8802cf13d019bf7b68a857d47d1cf Content-length: 504 K 15 cvs2svn:cvs-rev V 5 1.250 PROPS-END SVNS1tDaWif (!init_winver()) { char *str = dupprintf("%s Fatal Error", appname); MessageBox(NULL, "Windows refuses to report a version", str, MB_OK | MB_ICONEXCLAMATION); sfree(str); return 1;enu). */ if (wParam == VK_MENU && !cfg.alt_only) return 0; return -1; } void request_paste(void *frontend) { /* * In Windows, pasting is synchronous: we can read the * clipboard with noOxxW Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d564b52bb835406175d6cb3d40a741d2 Text-delta-base-sha1: c623f516167cccb4b4483b101338576eaebf766a Text-content-length: 240 Text-content-md5: b3d459e94e3798865d2ad3b0b2916070 Text-content-sha1: f1f621652aa5aba400732acbfe980f8fa560317e Content-length: 279 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNzTR#E!:`OSVERSIONINFO osVersion;BOOL init_winver(void) { ZeroMemory(&osVersion, sizeof(osVersion)); osVersion.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); return GetVersionEx ( (OSVERSIONINFO *) &osVersion Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fc66140ffd58b654ea391105a378145d Text-delta-base-sha1: 411af2340d924d257e9e4c4ad690de8a03087093 Text-content-length: 74 Text-content-md5: cab4fd031ec6fe34ebffc078617ae75f Text-content-sha1: 8865d7b9b8ef7f16a2aa762d65b045f07b7a4498 Content-length: 114 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNK 5t"pextern OSVERSIONINFO osVersion; BOOL init_winver(void Revision-number: 3412 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2003-08-22T08:18:23.000000Z K 7 svn:log V 28 Confirmed fixed (finally!). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/slow-startup-printer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e4e24c7392554c7bbe98466fbbe7e90c Text-delta-base-sha1: 9aed112eb1d8ade89e90923cb899cf39d6d1c47d Text-content-length: 147 Text-content-md5: d36d270c69c807be0390ca837f73d777 Text-content-sha1: 1202cdc1ac44813591bcbc682083e6fabeaecff7 Content-length: 186 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN>< |,*iFixed-in: 2003-08-2

    Update 2003-08-22: finally got round to implementing this, and got a report that it works. Revision-number: 3413 Prop-content-length: 161 Content-length: 161 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-08-22T08:34:29.000000Z K 7 svn:log V 61 Add summary info at the top, since this is quite a long bug. PROPS-END Node-path: putty-wishlist/data/slow-startup-printer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d36d270c69c807be0390ca837f73d777 Text-delta-base-sha1: 1202cdc1ac44813591bcbc682083e6fabeaecff7 Text-content-length: 293 Text-content-md5: 44a7fa7727e0aeec7d63d69a6c20ed63 Text-content-sha1: f440f9242c465d098246d486019b10832c382288 Content-length: 332 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN Alternatively, snapshots 2003-08-22 and later try less hard to find printers and this has been reported to work.

    Gory details:qU}=gKf?,%ziK?G!D>G"(yyLr5R/* * psftp.c: front end for PSFTP. */psftp, *errmsgerrmsg = psftp_lcd(cmd->words[1]); if (errmsg) { printf("lcd: unable to change directory: %s\n", errmsg); sfree(errmsg); return 0; } currdir = psftp_getcwd( currdir = psftp_getcwd(command", "\n" /* FIXME: this example is crap for non-Windows. */ " Runs a localif (ssh_sftp_loop_iteration() < 0) return 0; /* doom */while (!back->sendok(backhandle)) { if (ssh_sftp_loop_iteration() < 0) { fprintf(stderr, "ssh_init: error during SSH connection setup\n"); return 1; } }psftp_random_save_seed(); return 0; } Node-path: putty/psftp.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 666 Text-content-md5: c3ed557132d9756d6df26c44fa49484e Text-content-sha1: c125c202302ae7341425fd90a0aba1dead7498e7 Content-length: 782 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  /* * psftp.h: interface between psftp.c and each platform-specific * SFTP module. */ #ifndef PUTTY_PSFTP_H #define PUTTY_PSFTP_H /* * psftp_getcwd returns the local current directory. The returned * string must be freed by the caller. */ char *psftp_getcwd(void); /* * psftp_lcd changes the local current directory. The return value * is NULL on success, or else an error message which must be freed * by the caller. */ char *psftp_lcd(char *newdir); /* * One iteration of the PSFTP event loop: wait for network data and * process it, once. */ int ssh_sftp_loop_iteration(void); #endif /* PUTTY_PSFTP_H */ Node-path: putty/winsftp.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2347 Text-content-md5: 1eba4aa94e5a4c31bcc21731cf8f5f3b Text-content-sha1: 46148b573ff7ec5980e2ffc67144c22040ca2de2 Content-length: 2463 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * winsftp.c: the Windows-specific parts of PSFTP. */ #include #include "putty.h" #include "psftp.h" /* * Be told what socket we're supposed to be using. */ static SOCKET sftp_ssh_socket; char *do_select(SOCKET skt, int startup) { if (startup) sftp_ssh_socket = skt; else sftp_ssh_socket = INVALID_SOCKET; return NULL; } extern int select_result(WPARAM, LPARAM); /* * Initialize the WinSock driver. */ static void init_winsock(void) { WORD winsock_ver; WSADATA wsadata; winsock_ver = MAKEWORD(1, 1); if (WSAStartup(winsock_ver, &wsadata)) { fprintf(stderr, "Unable to initialise WinSock"); cleanup_exit(1); } if (LOBYTE(wsadata.wVersion) != 1 || HIBYTE(wsadata.wVersion) != 1) { fprintf(stderr, "WinSock version is incompatible with 1.1"); cleanup_exit(1); } } /* * Set local current directory. Returns NULL on success, or else an * error message which must be freed after printing. */ char *psftp_lcd(char *dir) { char *ret = NULL; if (!SetCurrentDirectory(dir)) { LPVOID message; int i; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&message, 0, NULL); i = strcspn((char *)message, "\n"); ret = dupprintf("%.*s", i, (LPCTSTR)message); LocalFree(message); } return ret; } /* * Get local current directory. Returns a string which must be * freed. */ char *psftp_getcwd(void) { char *ret = snewn(256, char); int len = GetCurrentDirectory(256, ret); if (len > 256) ret = sresize(ret, len, char); GetCurrentDirectory(len, ret); return ret; } /* * Wait for some network data and process it. */ int ssh_sftp_loop_iteration(void) { fd_set readfds; if (sftp_ssh_socket == INVALID_SOCKET) return -1; /* doom */ FD_ZERO(&readfds); FD_SET(sftp_ssh_socket, &readfds); if (select(1, &readfds, NULL, NULL, NULL) < 0) return -1; /* doom */ select_result((WPARAM) sftp_ssh_socket, (LPARAM) FD_READ); return 0; } /* * Main program. Parse arguments etc. */ int main(int argc, char *argv[]) { int ret; init_winsock(); ret = psftp_main(argc, argv); WSACleanup(); return ret; } Revision-number: 3419 Prop-content-length: 310 Content-length: 310 K 8 svn:date V 27 2003-08-24T13:22:17.000000Z K 7 svn:log V 209 And just to prove that psftp.c really is now platform-independent ... here's a Unix port of PSFTP. Woo. (Oddly PSCP looks to be somewhat harder; there's more Windows code interleaved than there was in PSFTP.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 17b0a854405f9f885befe5071c910eab Text-delta-base-sha1: ffe7298df1e490002178704710c0d1dc72b553f9 Text-content-length: 55 Text-content-md5: f47d0f6b291a1b0855a9151e834409d2 Text-content-sha1: 52d8f92e7d002a5ad083af24b8ad2c92ca1c4f20 Content-length: 95 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNTQ "" Gpsftp : [U] psftp uxsftp uxcons Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 82758fd6e879d5ff02020c1c870e5615 Text-delta-base-sha1: d426aa024caf3716d9027d1477599d9a51bd9ee1 Text-content-length: 170 Text-content-md5: e5ef10347a68114cdfc56827a53ae66b Text-content-sha1: 8f12af869faf9a904957ca3a7fb0bf1583bb1c7c Content-length: 210 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNqA>_Y1Y/ v9S/1u74=(int)(int)(int)(int)(int)(int) void *logctx #ifdef FLAG_SYNCAGENT | FLAG_SYNCAGENT #endif Node-path: putty/psftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c3ed557132d9756d6df26c44fa49484e Text-delta-base-sha1: c125c202302ae7341425fd90a0aba1dead7498e7 Text-content-length: 206 Text-content-md5: d7f5f7c00c525f7dd58ae2c22b4ec10f Text-content-sha1: fa95f040ec0748ac01b5a853be0216b6d16f83fd Content-length: 245 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN J 8p8"j/* * The main program in psftp.c. Called from main() in the platform- * specific code, after doing any platform-specific initialisation. */ int psftp_main(int argc, char *argv[] Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ba75cebbf8d5143442243fcd5489dfe Text-delta-base-sha1: 1cd1fe7cc27ce768318a15c85556540f05459192 Text-content-length: 54 Text-content-md5: 490ff7dbf1fe0dcd6c1da8c3a6a8f7ea Text-content-sha1: 82b077fac9fc9ce94a8dd9d87775977c18a3fe03 Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNk<XvWLYl/**/REQUEST_ID Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 98 Content-length: 98 K 10 svn:ignore V 66 Makefile.gtk Makefile local plink pterm putty puttytel psftp *.log PROPS-END Node-path: putty/unix/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b2040961591ba7f7edb02f434094e118 Text-delta-base-sha1: 0582feb92733c09c21085fdd6af88d6eb2381d13 Text-content-length: 78 Text-content-md5: 90cef4d8072291e754b697ad7995fd45 Text-content-sha1: 0690c985de145af7842a7f5c37c919c713428dbe Content-length: 117 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN=CCCMakefile.gtk Makefile local plink pterm putty puttytel psftp *.log Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ba4cac7d3fcc7b39519c909afcbb53ef Text-delta-base-sha1: d7d7318edc747fc87a77dd1a2f1a41c92599b087 Text-content-length: 249 Text-content-md5: 49ba4b78ba2deea772a0f3737b3a2482 Text-content-sha1: 404b0ee3a22da22b3516c9e0fc3f59e1d5d368ed Content-length: 289 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNI^3^ @/* * General helpful Unix stuff: more helpful version of the FD_SET * macro, which also handles maxfd. */ #define FD_SET_MAX(fd, max, set) do { \ FD_SET(fd, &set); \ if (max < fd + 1) max = fd + 1; \ } while (0) Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2e4c53c157631e0e018ffae44a9bb853 Text-delta-base-sha1: ed9cc7732d9b002d60249e62ea10ba1828651568 Text-content-length: 233 Text-content-md5: 0d0bd93f4c2d5af9bae282580de68ed0 Text-content-sha1: 14d7f4a94f361ea0b00096e44d3969dfc05820b6 Content-length: 273 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN*K<9)static void *console_logctx = NULLconsole_provide_logctx(void *logctx) { console_logctx = logctx; } void logevent(void *frontend, const char *string) { if (console_logctx) log_eventlog(console_ Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a133b0ce2fc88f699b1edf93c66e8110 Text-delta-base-sha1: 93965746b0669ba825e2408a7a3aaa36c333b20c Text-content-length: 72 Text-content-md5: b6edd38f1439597d6cc26e5832539654 Text-content-sha1: e2f273c4c767f6a4a60ddf9e467787e0a8538e47 Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN &WW.q', *logctxconsole_provide_logctx(logctx Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4842 Text-content-md5: 6e7f414d3cf4608fe03e8ffc1a40e659 Text-content-sha1: 9f0bde6944c53db4ee152b7623fb8ddf32fdb6a7 Content-length: 4958 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN\\\/* * uxsftp.c: the Unix-specific parts of PSFTP. */ #include #include #include #include #include #include "putty.h" #include "psftp.h" /* * In PSFTP our selects are synchronous, so these functions are * empty stubs. */ int uxsel_input_add(int fd, int rwx) { return 0; } void uxsel_input_remove(int id) { } char *x_get_default(const char *key) { return NULL; /* this is a stub */ } void platform_get_x11_auth(char *display, int *protocol, unsigned char *data, int *datalen) { /* Do nothing, therefore no auth. */ } /* * Default settings that are specific to PSFTP. */ char *platform_default_s(const char *name) { if (!strcmp(name, "UserName")) { /* * Remote login username will default to the local username. */ struct passwd *p; uid_t uid = getuid(); char *user, *ret = NULL; /* * First, find who we think we are using getlogin. If this * agrees with our uid, we'll go along with it. This should * allow sharing of uids between several login names whilst * coping correctly with people who have su'ed. */ user = getlogin(); setpwent(); if (user) p = getpwnam(user); else p = NULL; if (p && p->pw_uid == uid) { /* * The result of getlogin() really does correspond to * our uid. Fine. */ ret = user; } else { /* * If that didn't work, for whatever reason, we'll do * the simpler version: look up our uid in the password * file and map it straight to a name. */ p = getpwuid(uid); ret = p->pw_name; } endpwent(); return ret; } return NULL; } int platform_default_i(const char *name, int def) { return def; } FontSpec platform_default_fontspec(const char *name) { FontSpec ret; *ret.name = '\0'; return ret; } Filename platform_default_filename(const char *name) { Filename ret; if (!strcmp(name, "LogFileName")) strcpy(ret.path, "putty.log"); else *ret.path = '\0'; return ret; } /* * Set local current directory. Returns NULL on success, or else an * error message which must be freed after printing. */ char *psftp_lcd(char *dir) { if (chdir(dir) < 0) return dupprintf("%s: chdir: %s", dir, strerror(errno)); else return NULL; } /* * Get local current directory. Returns a string which must be * freed. */ char *psftp_getcwd(void) { char *buffer, *ret; int size = 256; buffer = snewn(size, char); while (1) { ret = getcwd(buffer, size); if (ret != NULL) return ret; if (errno != ERANGE) { sfree(buffer); return dupprintf("[cwd unavailable: %s]", strerror(errno)); } /* * Otherwise, ERANGE was returned, meaning the buffer * wasn't big enough. */ size = size * 3 / 2; buffer = sresize(buffer, size, char); } } /* * Wait for some network data and process it. */ int ssh_sftp_loop_iteration(void) { fd_set rset, wset, xset; int i, fdcount, fdsize, *fdlist; int fd, fdstate, rwx, ret, maxfd; fdlist = NULL; fdcount = fdsize = 0; /* Count the currently active fds. */ i = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) i++; if (i < 1) return -1; /* doom */ /* Expand the fdlist buffer if necessary. */ if (i > fdsize) { fdsize = i + 16; fdlist = sresize(fdlist, fdsize, int); } FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&xset); maxfd = 0; /* * Add all currently open fds to the select sets, and store * them in fdlist as well. */ fdcount = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) { fdlist[fdcount++] = fd; if (rwx & 1) FD_SET_MAX(fd, maxfd, rset); if (rwx & 2) FD_SET_MAX(fd, maxfd, wset); if (rwx & 4) FD_SET_MAX(fd, maxfd, xset); } do { ret = select(maxfd, &rset, &wset, &xset, NULL); } while (ret < 0 && errno == EINTR); if (ret < 0) { perror("select"); exit(1); } for (i = 0; i < fdcount; i++) { fd = fdlist[i]; /* * We must process exceptional notifications before * ordinary readability ones, or we may go straight * past the urgent marker. */ if (FD_ISSET(fd, &xset)) select_result(fd, 4); if (FD_ISSET(fd, &rset)) select_result(fd, 1); if (FD_ISSET(fd, &wset)) select_result(fd, 2); } sfree(fdlist); return 0; } /* * Main program: do platform-specific initialisation and then call * psftp_main(). */ int main(int argc, char *argv[]) { uxsel_init(); return psftp_main(argc, argv); } Revision-number: 3420 Prop-content-length: 453 Content-length: 453 K 8 svn:date V 27 2003-08-25T13:53:41.000000Z K 7 svn:log V 352 Windows PSCP now links against winsftp.c, and scp.c is now a platform-independent source file. Haven't yet added the extra abstraction routines to uxsftp.c to create a Unix PSCP port, but it shouldn't take long. Also in this checkin, a change of semantics in platform_default_s(): now strings returned from it are expected to be dynamically allocated. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f47d0f6b291a1b0855a9151e834409d2 Text-delta-base-sha1: 52d8f92e7d002a5ad083af24b8ad2c92ca1c4f20 Text-content-length: 157 Text-content-md5: 09f2d012cb7f1e3421904baa99914e65 Text-content-sha1: 2d51aa739609e4f26dc507e2d85247e227803399 Content-length: 197 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNQ(0H\A0!winsftp console WINSSH be_none SFTP wildcard WINMISC +cp : [U] scp uxsftp uxcons UXSSH be_none SFTP wildcard UXMISC Node-path: putty/psftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d7f5f7c00c525f7dd58ae2c22b4ec10f Text-delta-base-sha1: fa95f040ec0748ac01b5a853be0216b6d16f83fd Text-content-length: 4413 Text-content-md5: aed038191de4aca0177f3f8808bf548f Text-content-sha1: 099da740ab330a009020a359e969c807f0e7a562 Content-length: 4452 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNJ2P%H;N`"(/* * psftp.h: interface between psftp.c / scp.c and each * platform-specificRetrieve file times on a local file. Must return two unsigned * longs in POSIX time_t format. */ void get_file_times(char *filename, unsigned long *mtime, unsigned long *atime/* * These functions are used by PSCP to transmit progress updates * and error information to a GUI window managing it. This will * probably only ever be supported on Windows, so these functions * can safely be stubs on all other platforms. */ void gui_update_stats(char *name, unsigned long size, int percentage, unsigned long elapsed, unsigned long done, unsigned long eta, unsigned long ratebs); void gui_send_errcount(int list, int errs); void gui_send_char(int is_stderr, int c); void gui_enable(char *arg); /* * It's likely that a given platform's implementation of file * transfer utilities is going to want to do things with them that * aren't present in stdio. Hence we supply an alternative * abstraction for file access functions. * * This abstraction tells you the size and access times when you * open an existing file (platforms may choose the meaning of the * file times if it's not clear; whatever they choose will be what * PSCP sends to the server as mtime and atime), and lets you set * the times when saving a new file. * * On the other hand, the abstraction is pretty simple: it supports * only opening a file and reading it, or creating a file and * writing it. (FIXME: to use this in PSFTP it will also need to * support seeking to a starting point for restarted transfers.) * None of this read-and-write, seeking-back-and-forth stuff. */ typedef struct RFile RFile; typedef struct WFile WFile; /* Output params size, mtime and atime can all be NULL if desired */ RFile *open_existing_file(char *name, unsigned long *size, unsigned long *mtime, unsigned long *atime); /* Returns <0 on error, 0 on eof, or number of bytes read, as usual */ int read_from_file(RFile *f, void *buffer, int length); /* Closes and frees the RFile */ void close_rfile(RFile *f); WFile *open_new_file(char *name); /* Returns <0 on error, 0 on eof, or number of bytes written, as usual */ int write_to_file(WFile *f, void *buffer, int length); void set_file_times(WFile *f, unsigned long mtime, unsigned long atime); /* Closes and frees the WFile */ void close_wfile(WFile *f); /* * Determine the type of a file: nonexistent, file, directory or * weird. `weird' covers anything else - named pipes, Unix sockets, * device files, fish, badgers, you name it. Things marked `weird' * will be skipped over in recursive file transfers, so the only * real reason for not lumping them in with `nonexistent' is that * it allows a slightly more sane error message. */ enum { FILE_TYPE_NONEXISTENT, FILE_TYPE_FILE, FILE_TYPE_DIRECTORY, FILE_TYPE_WEIRD }; int file_type(char *name); /* * Read all the file names out of a directory. */ typedef struct DirHandle DirHandle; DirHandle *open_directory(char *name); /* The string returned from this will need freeing if not NULL */ char *read_filename(DirHandle *dir); void close_directory(DirHandle *dir); /* * Test a filespec to see whether it's a local wildcard or not. * Return values: * * - WCTYPE_WILDCARD (this is a wildcard). * - WCTYPE_FILENAME (this is a single file name). * - WCTYPE_NONEXISTENT (whichever it was, nothing of that name exists). * * Some platforms may choose not to support local wildcards when * they come from the command line; in this case they simply never * return WCTYPE_WILDCARD, but still test the file's existence. * (However, all platforms will probably want to support wildcards * inside the PSFTP CLI.) */ enum { WCTYPE_NONEXISTENT, WCTYPE_FILENAME, WCTYPE_WILDCARD }; int test_wildcard(char *name, int cmdline); /* * Actually return matching file names for a local wildcard. */ typedef struct WildcardMatcher WildcardMatcher; WildcardMatcher *begin_wildcard_matching(char *name); /* The string returned from this will need freeing if not NULL */ char *wildcard_get_filename(WildcardMatcher *dir); void finish_wildcard_matching(WildcardMatcher *dir); /* * Create a directory. Returns 0 on error, !=0 on success. */ int create_directory(char *name Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6ec0a6f3ea0f4f53441a131bd3ab03ba Text-delta-base-sha1: 1ce78036fbea343aa9dfd8d91f722f4f2f049026 Text-content-length: 94 Text-content-md5: a4ab7307fbfd406a0f34aa6893df81e8 Text-content-sha1: 3eb5c82ed3bbcc75a5f092b41970486f9d0ac540 Content-length: 135 K 15 cvs2svn:cvs-rev V 5 1.222 PROPS-END SVN;}J3Jchar *get_username(void); /* return value needs freeing */ #endif Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 456bad95c65c1709c6507b54c03a034e Text-delta-base-sha1: f584e52a47c3d594f9e741e947bf12b5037ffe2f Text-content-length: 3739 Text-content-md5: eb2133622ba5c4d3aa4009df47e26361 Text-content-sha1: 6b017db8956d49158ef0549a6da8599244f5d3c9 Content-length: 3780 K 15 cvs2svn:cvs-rev V 5 1.109 PROPS-END SVNgK,`{"w@y^I<`u]{tRB4bGd5%Lx)`g2?<_RgZ 1{XApvfX I$a .gx>ny~my C.BU+I2Cdv'V7HFXY% a1Sg([1G.9psftp.h" #include "ssh.h" #include "sftp.h" #include "storage.h"static int gui_mode = 0 gui_send_char(stream == stderr, c); gui_send_errcount(list, errs); gui_send_errcount(list, errs); gui_send_errcount(list, errs); cleanup_exit(1); }ssh_sftp_loop_iteration() < 0while (!back->sendok(backhandle)) { if (ssh_sftp_loop_iteration() < 0) return; /* doom */ gui_send_errcount(list, errs);void *logctxuser = get_username(); if (!user) bump("Empty user name"); else { if (verbose) tell_user(stderr, "Guessing user name: %s", user); strncpy(cfg.username, user, sizeof(cfg.username) - 1); cfg.username[sizeof(cfg.username) - 1] = '\0'; sfree(user); } { gui_update_stats(name, size, pct, elap, done, eta, (unsigned long) ratebs); }ssh_sftp_loop_iteration() < 0unsigned long mtime, atime; char *last; RFile *f; intfile_type(src); if (attr == FILE_TYPE_NONEXISTENT || attr == FILE_TYPE_WEIRD) { run_err("%s: %s file or directory", src, (attr == FILE_TYPE_WEIRD ? "Not a" : "No such")); return; } if (attr == FILE_TYPE_DIRECTORYopen_existing_file(src, &size, &mtime, &atime); if (f == NULL) { run_err("%s: Cannot open file", src); return; } if (preserve) { if (scp_send_filetimes(mtime, atime)) return; } int j, k = 4096; if (i + k > size) k = size - i; if ((j = read_from_file(f, transbuf, k))close_rfi; char *save_target; DirHandle *dir;dir = open_directory(src); if (dir != NULL) { char *filename; while ((filename = read_filename(dir)) != NULL) { char *foundfile = dupcat(src, "/", filename, NULL); source(foundfile); sfree(foundfile); sfree(filename); } } close_directory(dirint attr; WFile *file_type(targ); if (attr == FILE_TYPE_DIRECTORYfile_type(destfname); exists = (attr != FILE_TYPE_NONEXISTENT); if (act.action == SCP_SINK_DIR) { if (exists && attr != FILE_TYPE_DIRECTORY) { run_err("%s: Not a directory", destfname); continue; } if (!exists) { if (!create_directory(destfnameopen_new_file(destfname); if (f == NULLint blksize, read; blksize = 4096; if (blksize > (int)(act.size - received)write_to_file(f, transbuf, read) != (int)set_file_times(f, act.mtime, act.atime); } close_wfi, wc_type wc_type = test_wildcard(argv[0], 1); if (wc_type == WCTYPE_NONEXISTENT) bump("%s: No such file or directory\n", argv[0]); else if (wc_type == WCTYPE_WILDCARD) targetshouldbedirectory = 1wc_type = test_wildcard(src, 1); if (wc_type == WCTYPE_NONEXISTENT) { run_err("%s: No such file or directory", src); continue; } else if (wc_type == WCTYPE_FILENAME) { source(src); continue; } else { WildcardMatcher *wc; char *filename; wc = begin_wildcard_matching(src); if (wc == NULL) { run_err("%s: No such file or directory", src); continue; } while ((filename = wildcard_get_filename(wc)) != NULL) { source(filename); sfree(filename); } finish_wildcard_matching(wc); }Main program. (Called `psftp_main' because it gets called from * *sftp.c; bit silly, I know, but it had to be called _something_.) */ int psftp_ #ifdef FLAG_SYNCAGENT | FLAG_SYNCAGENT #endif ; cmdline_tooltype = TOOLTYPE_FILETRANSFER; ssh_get_line = &console_get_lineenable(argv[++i])random_save_seed(); if (gui_mode) gui_send_errcount(list, errs); Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 647ab4085958c19388b9246182579232 Text-delta-base-sha1: ffd0da2aaba1b5fbac37bbf0c3df1f645a88255d Text-content-length: 38 Text-content-md5: 6b3bed2cdced243e43c2fffd7b7c9944 Text-content-sha1: 7bf08e9169e9a56047b07c88390b2bd61c1db657 Content-length: 79 K 15 cvs2svn:cvs-rev V 5 1.112 PROPS-END SVN k sfree(pdef Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 96cbeaef54e14ceddee1a482964d9018 Text-delta-base-sha1: 048c82ce62a9d15f52dc63ec8d67bf365caf2753 Text-content-length: 940 Text-content-md5: dd3767bde846acfc9c7a99e8faaddbc2 Text-content-sha1: f16f5a60390f468db45e00273f21ee7285d73693 Content-length: 979 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNog$cjl#include #include pw_uid == uid) { /* * The result of getlogin() really does correspond to * our uid. Fine. */ ret = user; } else { /* * If that didn't work, for whatever reason, we'll do * the simpler version: look up our uid in the password * file and map it straight to a name. */ p = getpwuid(uid); if (!p) return NULL; ret = p->pw_name; } endpwent(); return dupstr(ret); } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b6edd38f1439597d6cc26e5832539654 Text-delta-base-sha1: e2f273c4c767f6a4a60ddf9e467787e0a8538e47 Text-content-length: 178 Text-content-md5: 9ee0846f01b8e08ee0a39de367f039f1 Text-content-sha1: 9b8dd4d1b1df3a0b8771493184a575503ca287a8 Content-length: 218 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN 8 [EGdupstr(getenv("DISPLAY")); if (!strcmp(name, "TermType")) return dupstr(getenv("TERM")); if (!strcmp(name, "UserName")) return get_username(); Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6e7f414d3cf4608fe03e8ffc1a40e659 Text-delta-base-sha1: 9f0bde6944c53db4ee152b7623fb8ddf32fdb6a7 Text-content-length: 458 Text-content-md5: 59ae8d6f1d642999d4672ddf64a2bbeb Text-content-sha1: dba19b8655ba85e9538c70fd8987a1200f1bbb09 Content-length: 497 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN\(c0W%(Bo~^/* * uxsftp.c: the Unix-specific parts of PSFTP and PSCtubs for the GUI feedback mechanism in Windows PSCP. */ void gui_update_stats(char *name, unsigned long size, int percentage, unsigned long elapsed, unsigned long done, unsigned long eta, unsigned long ratebs) {} void gui_send_errcount(int list, int errs) {} void gui_send_char(int is_stderr, int c) {} void gui_enable(char *arg) {} Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b3d459e94e3798865d2ad3b0b2916070 Text-delta-base-sha1: f1f621652aa5aba400732acbfe980f8fa560317e Text-content-length: 247 Text-content-md5: cd8ceed273944212d2341b38d00e6aa4 Text-content-sha1: 6798e663b2245ea03e08f26e77f4a3ad88faf17f Content-length: 286 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNT8 _u_dpchar *get_username(void) { DWORD namelen; char *user; namelen = 0; if (GetUserName(NULL, &namelen) == FALSE) return NULL; user = snewn(namelen, char); GetUserName(user, &namelen); return user Node-path: putty/winsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1eba4aa94e5a4c31bcc21731cf8f5f3b Text-delta-base-sha1: 46148b573ff7ec5980e2ffc67144c22040ca2de2 Text-content-length: 9680 Text-content-md5: 680c1131b7063d70e681afc65a8c35e9 Text-content-sha1: 5e5e53785112631fb65c81a2d30736459258767f Content-length: 9719 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNR)c ?QvPG7f/* * winsftp.c: the Windows-specific parts of PSFTP and PSCP. */ #include #ifndef AUTO_WINSOCK #ifdef WINSOCK_TWO #include #else #include #endif #endif #include "putty.h" #include "psftp.h" /* ---------------------------------------------------------------------- * Interface to GUI driver program. */ /* This is just a base value from which the main message numbers are * derived. */ #define WM_APP_BASE 0x8000 /* These two pass a single character value in wParam. They represent * the visible output from PSCP. */ #define WM_STD_OUT_CHAR ( WM_APP_BASE+400 ) #define WM_STD_ERR_CHAR ( WM_APP_BASE+401 ) /* These pass a transfer status update. WM_STATS_CHAR passes a single * character in wParam, and is called repeatedly to pass the name of * the file, terminated with "\n". WM_STATS_SIZE passes the size of * the file being transferred in wParam. WM_STATS_ELAPSED is called * to pass the elapsed time (in seconds) in wParam, and * WM_STATS_PERCENT passes the percentage of the transfer which is * complete, also in wParam. */ #define WM_STATS_CHAR ( WM_APP_BASE+402 ) #define WM_STATS_SIZE ( WM_APP_BASE+403 ) #define WM_STATS_PERCENT ( WM_APP_BASE+404 ) #define WM_STATS_ELAPSED ( WM_APP_BASE+405 ) /* These are used at the end of a run to pass an error code in * wParam: zero means success, nonzero means failure. WM_RET_ERR_CNT * is used after a copy, and WM_LS_RET_ERR_CNT is used after a file * list operation. */ #define WM_RET_ERR_CNT ( WM_APP_BASE+406 ) #define WM_LS_RET_ERR_CNT ( WM_APP_BASE+407 ) /* More transfer status update messages. WM_STATS_DONE passes the * number of bytes sent so far in wParam. WM_STATS_ETA passes the * estimated time to completion (in seconds). WM_STATS_RATEBS passes * the average transfer rate (in bytes per second). */ #define WM_STATS_DONE ( WM_APP_BASE+408 ) #define WM_STATS_ETA ( WM_APP_BASE+409 ) #define WM_STATS_RATEBS ( WM_APP_BASE+410 ) #define NAME_STR_MAX 2048 static char statname[NAME_STR_MAX + 1]; static unsigned long statsize = 0; static unsigned long statdone = 0; static unsigned long stateta = 0; static unsigned long statratebs = 0; static int statperct = 0; static unsigned long statelapsed = 0; static HWND gui_hwnd = NULL; static void send_msg(HWND h, UINT message, WPARAM wParam) { while (!PostMessage(h, message, wParam, 0)) SleepEx(1000, TRUE); } void gui_send_char(int is_stderr, int c) { unsigned int msg_id = WM_STD_OUT_CHAR; if (is_stderr) msg_id = WM_STD_ERR_CHAR; send_msg(gui_hwnd, msg_id, (WPARAM) c); } void gui_send_errcount(int list, int errs) { unsigned int msg_id = WM_RET_ERR_CNT; if (list) msg_id = WM_LS_RET_ERR_CNT; while (!PostMessage(gui_hwnd, msg_id, (WPARAM) errs, 0)) SleepEx(1000, TRUE); } void gui_update_stats(char *name, unsigned long size, int percentage, unsigned long elapsed, unsigned long done, unsigned long eta, unsigned long ratebs) { unsigned int i; if (strcmp(name, statname) != 0) { for (i = 0; i < strlen(name); ++i) send_msg(gui_hwnd, WM_STATS_CHAR, (WPARAM) name[i]); send_msg(gui_hwnd, WM_STATS_CHAR, (WPARAM) '\n'); strcpy(statname, name); } if (statsize != size) { send_msg(gui_hwnd, WM_STATS_SIZE, (WPARAM) size); statsize = size; } if (statdone != done) { send_msg(gui_hwnd, WM_STATS_DONE, (WPARAM) done); statdone = done; } if (stateta != eta) { send_msg(gui_hwnd, WM_STATS_ETA, (WPARAM) eta); stateta = eta; } if (statratebs != ratebs) { send_msg(gui_hwnd, WM_STATS_RATEBS, (WPARAM) ratebs); statratebs = ratebs; } if (statelapsed != elapsed) { send_msg(gui_hwnd, WM_STATS_ELAPSED, (WPARAM) elapsed); statelapsed = elapsed; } if (statperct != percentage) { send_msg(gui_hwnd, WM_STATS_PERCENT, (WPARAM) percentage); statperct = percentage; } } void gui_enable(char *arg) { gui_hwnd = (HWND) atoi(arg); } /* ---------------------------------------------------------------------- * File access abstraction. */#define TIME_POSIX_TO_WIN(t, ft) (*(LONGLONG*)&(ft) = \ ((LONGLONG) (t) + (LONGLONG) 11644473600) * (LONGLONG) 10000000) #define TIME_WIN_TO_POSIX(ft, t) ((t) = (unsigned long) \ ((*(LONGLONG*)&(ft)) / (LONGLONG) 10000000 - (LONGLONG) 11644473600)) struct RFile { HANDLE h; }; RFile *open_existing_file(char *name, unsigned long *size, unsigned long *mtime, unsigned long *atime) { HANDLE h; RFile *ret; h = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if (h == INVALID_HANDLE_VALUE) return NULL; ret = snew(RFile); ret->h = h; if (size) *size = GetFileSize(h, NULL); if (mtime || atime) { FILETIME actime, wrtime; GetFileTime(h, NULL, &actime, &wrtime); if (atime) TIME_WIN_TO_POSIX(actime, *atime); if (mtime) TIME_WIN_TO_POSIX(wrtime, *mtime); } return ret; } int read_from_file(RFile *f, void *buffer, int length) { int ret, read; ret = ReadFile(f->h, buffer, length, &read, NULL); if (!ret) return -1; /* error */ else return read; } void close_rfile(RFile *f) { CloseHandle(f->h); sfree(f); } struct WFile { HANDLE h; }; WFile *open_new_file(char *name) { HANDLE h; WFile *ret; h = CreateFile(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (h == INVALID_HANDLE_VALUE) return NULL; ret = snew(WFile); ret->h = h; return ret; } int write_to_file(WFile *f, void *buffer, int length) { int ret, written; ret = WriteFile(f->h, buffer, length, &written, NULL); if (!ret) return -1; /* error */ else return written; } void set_file_times(WFile *f, unsigned long mtime, unsigned long atime) { FILETIME actime, wrtime; TIME_POSIX_TO_WIN(atime, actime); TIME_POSIX_TO_WIN(mtime, wrtime); SetFileTime(f->h, NULL, &actime, &wrtime); } void close_wfile(WFile *f) { CloseHandle(f->h); sfree(f); } int file_type(char *name) { DWORD attr; attr = GetFileAttributes(name); /* We know of no `weird' files under Windows. */ if (attr == (DWORD)-1) return FILE_TYPE_NONEXISTENT; else if (attr & FILE_ATTRIBUTE_DIRECTORY) return FILE_TYPE_DIRECTORY; else return FILE_TYPE_FILE; } struct DirHandle { HANDLE h; char *name; }; DirHandle *open_directory(char *name) { HANDLE h; WIN32_FIND_DATA fdat; char *findfile; DirHandle *ret; /* To enumerate files in dir `foo', we search for `foo/*'. */ findfile = dupcat(name, "/*", NULL); h = FindFirstFile(findfile, &fdat); if (h == INVALID_HANDLE_VALUE) return NULL; ret = snew(DirHandle); ret->h = h; ret->name = dupstr(fdat.cFileName); return ret; } char *read_filename(DirHandle *dir) { if (!dir->name) { WIN32_FIND_DATA fdat; int ok = FindNextFile(dir->h, &fdat); if (ok) dir->name = dupstr(fdat.cFileName); } if (dir->name) { char *ret = dir->name; dir->name = NULL; return ret; } else return NULL; } void close_directory(DirHandle *dir) { FindClose(dir->h); if (dir->name) sfree(dir->name); sfree(dir); } int test_wildcard(char *name, int cmdline) { HANDLE fh; WIN32_FIND_DATA fdat; /* First see if the exact name exists. */ if (GetFileAttributes(name) != (DWORD)-1) return WCTYPE_FILENAME; /* Otherwise see if a wildcard match finds anything. */ fh = FindFirstFile(name, &fdat); if (fh == INVALID_HANDLE_VALUE) return WCTYPE_NONEXISTENT; FindClose(fh); return WCTYPE_WILDCARD; } struct WildcardMatcher { HANDLE h; char *name; char *srcpath; }; /* * Return a pointer to the portion of str that comes after the last * slash (or backslash or colon, if `local' is TRUE). */ static char *stripslashes(char *str, int local) { char *p; if (local) { p = strchr(str, ':'); if (p) str = p+1; } p = strrchr(str, '/'); if (p) str = p+1; if (local) { p = strrchr(str, '\\'); if (p) str = p+1; } return str; } WildcardMatcher *begin_wildcard_matching(char *name) { HANDLE h; WIN32_FIND_DATA fdat; WildcardMatcher *ret; char *last; h = FindFirstFile(name, &fdat); if (h == INVALID_HANDLE_VALUE) return NULL; ret = snew(WildcardMatcher); ret->h = h; ret->srcpath = dupstr(name); last = stripslashes(ret->srcpath, 1); *last = '\0'; if (fdat.cFileName[0] == '.' && (fdat.cFileName[1] == '\0' || (fdat.cFileName[1] == '.' && fdat.cFileName[2] == '\0'))) ret->name = NULL; else ret->name = dupcat(ret->srcpath, fdat.cFileName, NULL); return ret; } char *wildcard_get_filename(WildcardMatcher *dir) { while (!dir->name) { WIN32_FIND_DATA fdat; int ok = FindNextFile(dir->h, &fdat); if (!ok) return NULL; if (fdat.cFileName[0] == '.' && (fdat.cFileName[1] == '\0' || (fdat.cFileName[1] == '.' && fdat.cFileName[2] == '\0'))) dir->name = NULL; else dir->name = dupcat(dir->srcpath, fdat.cFileName, NULL); } if (dir->name) { char *ret = dir->name; dir->name = NULL; return ret; } else return NULL; } void finish_wildcard_matching(WildcardMatcher *dir) { FindClose(dir->h); if (dir->name) sfree(dir->name); sfree(dir->srcpath); sfree(dir); } int create_directory(char *name) { return CreateDirectory(name, NULL) != 0; } /* ---------------------------------------------------------------------- * Platform-specific network handling. */ ---------------------------------------------------------------------- Revision-number: 3421 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2003-08-25T14:18:14.000000Z K 7 svn:log V 102 Fix a couple of blatant memory leaks; thanks to Ruurd Beerstra for pointing at least one of them out. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 08a6c712f4ec516900f2389d29abcc1b Text-delta-base-sha1: 706a2a34c1f5936e47b12357c31d73d7e59e8ed1 Text-content-length: 79 Text-content-md5: 8eb8c9c6e7a89eb536af62f1c01f8299 Text-content-sha1: aa828ff3a1abadabbae1efcad274e7b657732ccb Content-length: 119 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN;g 5' "sfree(workspace);sfree(workspace); return ret; } Revision-number: 3422 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2003-08-25T14:30:59.000000Z K 7 svn:log V 42 ... and there's a Unix port of PSCP. Ooh. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aed038191de4aca0177f3f8808bf548f Text-delta-base-sha1: 099da740ab330a009020a359e969c807f0e7a562 Text-content-length: 200 Text-content-md5: dcc1570ec5cf6b7675bad4d3d775689e Text-content-sha1: 933ae5bd7b85aaad9ebb3cf75c96c22578e8c41a Content-length: 239 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN2K55/* * Concatenate a directory name and a file name. The way this is * done will depend on the OS. */ char *dir_file_cat(char *dir, char *file); #endif /* PUTTY_PSFTP_H */ Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: eb2133622ba5c4d3aa4009df47e26361 Text-delta-base-sha1: 6b017db8956d49158ef0549a6da8599244f5d3c9 Text-content-length: 54 Text-content-md5: 06aa6fcbbda41a6207172a30322fc4db Text-content-sha1: 15b0a488c47ffdcdd7d4e38d7f841d4854645c33 Content-length: 95 K 15 cvs2svn:cvs-rev V 5 1.110 PROPS-END SVNKE '$ir_file_cat(targ, striptarget Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 59ae8d6f1d642999d4672ddf64a2bbeb Text-delta-base-sha1: dba19b8655ba85e9538c70fd8987a1200f1bbb09 Text-content-length: 4000 Text-content-md5: d6d9a0fd1b9096874425d9690454bdec Text-content-sha1: 481322da2e1f2e138a9ca171cece69ad3699beb6 Content-length: 4039 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNv}<~ #include #include #include #include #include #include fd = fd; if (size || mtime || atime) { struct stat statbuf; if (fstat(fd, &statbuf) < 0) { fprintf(stderr, "%s: stat: %s\n", name, strerror(errno)); memset(&statbuf, 0, sizeof(statbuf)); } if (size) *size = statbuf.st_size; if (mtime) *mtime = statbuf.st_mtime; if (atime) *atime = statbuf.st_atime; } return ret; } int read_from_file(RFile *f, void *buffer, int length) { return read(f->fd, buffer, length); } void close_rfile(RFile *f) { close(f->fd); sfree(f); } struct WFile { int fd; char *name; }; WFile *open_new_file(char *name) { int fd; WFile *ret; fd = open(name, O_CREAT | O_TRUNC | O_WRONLY, 0666); if (fd < 0) return NULL; ret = snew(WFile); ret->fd = fd; ret->name = dupstr(name); return ret; } int write_to_file(WFile *f, void *buffer, int length) { char *p = (char *)buffer; int so_far = 0; /* Keep trying until we've really written as much as we can. */ while (length > 0) { int ret = write(f->fd, p, length); if (ret < 0) return ret; if (ret == 0) break; p += ret; length -= ret; so_far += ret; } return so_far; } void set_file_times(WFile *f, unsigned long mtime, unsigned long atime) { struct utimbuf ut; ut.actime = atime; ut.modtime = mtime; utime(f->name, &ut); } /* Closes and frees the WFile */ void close_wfile(WFile *f) { close(f->fd); sfree(f->name); sfree(f); } int file_type(char *name) { struct stat statbuf; if (stat(name, &statbuf) < 0) { if (errno != ENOENT) fprintf(stderr, "%s: stat: %s\n", name, strerror(errno)); return FILE_TYPE_NONEXISTENT; } if (S_ISREG(statbuf.st_mode)) return FILE_TYPE_FILE; if (S_ISDIR(statbuf.st_mode)) return FILE_TYPE_DIRECTORY; return FILE_TYPE_WEIRD; } struct DirHandle { DIR *dir; }; DirHandle *open_directory(char *name) { DIR *dir; DirHandle *ret; dir = opendir(name); if (!dir) return NULL; ret = snew(DirHandle); ret->dir = dir; return ret; } char *read_filename(DirHandle *dir) { struct dirent *de; do { de = readdir(dir->dir); if (de == NULL) return NULL; } while ((de->d_name[0] == '.' && (de->d_name[1] == '\0' || (de->d_name[1] == '.' && de->d_name[2] == '\0')))); return dupstr(de->d_name); } void close_directory(DirHandle *dir) { closedir(dir->dir); sfree(dir); } int test_wildcard(char *name, int cmdline) { /* * On Unix, we currently don't support local wildcards at all. * We will have to do so (FIXME) once PSFTP starts implementing * mput, but until then we can assume `cmdline' is always set. */ struct stat statbuf; assert(cmdline); if (stat(name, &statbuf) < 0) return WCTYPE_NONEXISTENT; else return WCTYPE_FILENAME; } /* * Actually return matching file names for a local wildcard. FIXME: * we currently don't support this at all. */ struct WildcardMatcher { int x; }; WildcardMatcher *begin_wildcard_matching(char *name) { return NULL; } char *wildcard_get_filename(WildcardMatcher *dir) { return NULL; } void finish_wildcard_matching(WildcardMatcher *dir) {} int create_directory(char *name) { return mkdir(name, 0777) == 0; } char *dir_file_cat(char *dir, char *file) { return dupcat(dir, "/", file, NULL); Node-path: putty/winsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 680c1131b7063d70e681afc65a8c35e9 Text-delta-base-sha1: 5e5e53785112631fb65c81a2d30736459258767f Text-content-length: 153 Text-content-md5: 52bee7ceeedfb12515e8d6f60af3773a Text-content-sha1: ecabd2ef9cec9a2b91c6fd2de8696e160353f258 Content-length: 192 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNRxo64&HD5\C? sfree(findfile)char *dir_file_cat(char *dir, char *file) { return dupcat(dir, "\\", file, NULL); } /* Revision-number: 3423 Prop-content-length: 257 Content-length: 257 K 8 svn:date V 27 2003-08-28T09:42:46.000000Z K 7 svn:log V 156 The author of one of the MD5 programs we link to has just mailed me to say that his program now _is_ cryptographically signed. Wording updated accordingly. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ad191b8cd2e9ce1daf14b07890ed0c0 Text-delta-base-sha1: 361d0d5364ea614b1eeb477737bf6bae6ecae08f Text-content-length: 122 Text-content-md5: e5c4e658b1f0512bf5d589957a9c90b6 Text-content-sha1: 29d0eaa7b8e1f433209ae2bcd972171dff953942 Content-length: 162 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN9 aa0 . (The MD5 program at the first of those two links is also cryptographically signed by its author Revision-number: 3424 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2003-08-28T14:08:30.000000Z K 7 svn:log V 32 Added Angus Duggan's workaround K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/cygwin-clobbers-pageant Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: daaff06b5774c1298ed37f59a6fd0664 Text-delta-base-sha1: e29dd0c607269d3b5c27e73ecfc33ccab36091a7 Text-content-length: 219 Text-content-md5: dab9c23298a5801c02c0bc17bebc101c Text-content-sha1: a9e67b75935d83c53edd917853641a428fe60226 Content-length: 258 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN;H;H

    Workaround from Angus Duggan:

    Use cygstart.exe to start both Pageant and PuTTY. This starts with the same set of credentials that the cygwin programs start with, and all work fine. Revision-number: 3425 Prop-content-length: 133 Content-length: 133 K 7 svn:log V 34 Reported by Marc Aurele La France K 10 svn:author V 4 owen K 8 svn:date V 27 2003-08-29T10:52:47.000000Z PROPS-END Node-path: putty-wishlist/data/win98-focus Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 393 Text-content-md5: 6b447bebd359533a5b6bb3b75aa943e6 Text-content-sha1: 9266c4a54c46483cb215e68405c5f0457b96298f Content-length: 509 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN{{{Summary: Win98 focuses taskbar after PuTTY window closed Class: semi-bug Priority: medium Present-in: 0.53b Content-type: text/plain On Win98, closing a PuTTY window returns focus to the taskbar rather than to the second-most recently focused window. This could well be related to window-placement and PuTTY's guess window. The problem doesn't seem to occur on Win2K and NT. Revision-number: 3426 Prop-content-length: 208 Content-length: 208 K 8 svn:date V 27 2003-08-29T19:06:22.000000Z K 7 svn:log V 107 New option for plink: "-s" specifies that the remote command is an SSH-2 subsystem. (pinched from OpenSSH) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: daea09df971b943b344b42c3512fe39c Text-delta-base-sha1: f5efc4d18133db89b4bfe39d34c4a5f485f12f67 Text-content-length: 709 Text-content-md5: d25e0d9371d6d4aa19ac0e0bd1b9b60a Text-content-sha1: ee6788d8e260d696029a19c9b9f0f1b549346927 Content-length: 749 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNVa'J:S'\:=^>\versionid $Id: plink.but,v 1.19 2003/08/29 19:06:22 jacobUnidentified build, Aug 29 2003 19:49:05D listen-port Dynamic SOCKS-based port forwarding\c -s remote command is an SSH subsystem (SSH-2 only)Plink also supports some of its own options. The following sections describe Plink's specific command-line options. \S2{plink-option-batch} \c{-batch}: disable all interactive prompts S2{plink-option-s} \c{-s}: remote command is SSH subsystem If you specify the \c{-s} option, Plink passes the specified command as the name of an SSH \q{subsystem} rather than an ordinary command line. (This option is only meaningful with the SSH-2 protocol.) Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9f19af4ff3c2bcdd26008afa1d61bce8 Text-delta-base-sha1: 742497658cddf13e3dbbae68c115eead8d187549 Text-content-length: 296 Text-content-md5: d3e5b6cdc4dcff64c9e2ccdd4a401ca1 Text-content-sha1: 45d0bc9339f18e7d35d4e5d09b92c4eca08e8e60 Content-length: 336 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVN/{lCCbq#RMsprintf(" -s remote command is an SSH subsystem (SSH-2 only) int use_subsystem = 0if (!strcmp(p, "-s")) { /* Save status to write to cfg later. */ use_subsystemApply subsystem status. */ if (use_subsystem) cfg.ssh_subsys = TRUE Revision-number: 3427 Prop-content-length: 206 Content-length: 206 K 8 svn:date V 27 2003-08-29T19:21:49.000000Z K 7 svn:log V 105 Add "-s" option to Unix plink too. Compiled, but not tested as Unix plink seems to be segfaulting today. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/plink.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b2748b6e369dca583d6953e26aa673e6 Text-delta-base-sha1: 6e6e0b08acc134ab3e57e6b134b74402ff5f98a6 Text-content-length: 77 Text-content-md5: ff00f9ca524b41d2c46ea6e08a952289 Text-content-sha1: 78f51a471fade98547407c8c37c41f403f949285 Content-length: 116 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN/l=/.IP "\fB-s\fR" Remote command is SSH subsystem (SSH-2 only). Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9ee0846f01b8e08ee0a39de367f039f1 Text-delta-base-sha1: 9b8dd4d1b1df3a0b8771493184a575503ca287a8 Text-content-length: 296 Text-content-md5: cea6962dd3f57536455ccc6c824498e1 Text-content-sha1: c7624204a953aaf6dbeb9b4ff640d70f102718cd Content-length: 336 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN8w{DC\:OB T~:printf(" -s remote command is an SSH subsystem (SSH-2 only)int use_subsystem = 0s")) { /* Save status to write to cfg later. */ use_subsystemApply subsystem status. */ if (use_subsystem) cfg.ssh_subsys = TRUE Revision-number: 3428 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2003-08-29T19:41:57.000000Z K 7 svn:log V 41 Minimal fixes to minimal plink man page. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/plink.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ff00f9ca524b41d2c46ea6e08a952289 Text-delta-base-sha1: 78f51a471fade98547407c8c37c41f403f949285 Text-content-length: 259 Text-content-md5: 51c5d673ad080e966c3ef5d92e69195e Text-content-sha1: 94df1bfbf16dc16a1177a3156b100604a4f7b0a5 Content-length: 298 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNl jM:J"R\fR \fIlisten\fB:\fIhost\fB:\fIport\fR" Forward the a remote port to a local address. .IP "\fB-D\fR \fIlisten-port\fR" Dynamic port forwarding: start a SOCKS server on \fIlisten-port\fR.SH BUGS This man page isn't terribly complete. Revision-number: 3429 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2003-08-29T22:14:04.000000Z K 7 svn:log V 44 dupstr() should cope with being passed NULL K 10 svn:author V 5 jacob PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4308c314fff75b541430ba6fac1092ca Text-delta-base-sha1: 7c949f1578fe5ac43451da18b7270ec9d7943df1 Text-content-length: 141 Text-content-md5: 60cdb9e23f5bbfc916f5d46a423b9f5f Text-content-sha1: 7c14d8998f87f548fd5d478834209cd603451538 Content-length: 181 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNC wwHNchar *p = NULL; if (s) { int len = strlen(s); p = snewn(len + 1, char); strcpy(p, s); } Revision-number: 3430 Prop-content-length: 698 Content-length: 698 K 8 svn:date V 27 2003-08-29T22:52:57.000000Z K 7 svn:log V 597 Work towards wish `keyfile-diagnostic'. Many sshpubk.c keyfile-loading functions have sprouted `**errorstr' arguments, which if non-NULL can return a textual error message. The interface additions are patchy and ad-hoc since this seemed to suit the style of the existing interfaces. I've since realised that most of this is masked by sanity-checking that gets done before these functions are called, but it will at least report MAC failures and the like (tested on Unix), which was the original point of the exercise. Note that not everyone who could be using this information is at the moment. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1a6f21466b9bb315379aa26ade0f9194 Text-delta-base-sha1: 4aa2117a640f20aaa7de8c4f1c71f8a027ccee0a Text-content-length: 123 Text-content-md5: 17da666ed3641c2cd780344863bc4693 Text-content-sha1: bfbf45b9fbd907d8f7b27936e379c699cbbb9ee4 Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVN]uV k *xJ}`, NULL, NULL, NULL); else { skey = ssh2_load_userkey(&filename, passphrase, NULL Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dc2cb529ae834921ca6105bbb06ef4fe Text-delta-base-sha1: 51cc1c3e95ef51581ec54d6746121b52e44558f0 Text-content-length: 45 Text-content-md5: dad61fe745a1195078cfd2c326a9b29a Text-content-sha1: b5b6d0e674e53067e41426fb5c94554477a27d37 Content-length: 85 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN  343-g, NULL, NULL Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 436336497c908efcc9fa8bb26cd03fc2 Text-delta-base-sha1: 7f225d8584b1129dc42885b46f3153d17ccd9ff9 Text-content-length: 552 Text-content-md5: 23abc94e52f486ec38f0389b9922060c Text-content-sha1: 39502e78c617bf9d85e328cf40fa6461f227c8c5 Content-length: 593 K 15 cvs2svn:cvs-rev V 5 1.301 PROPS-END SVN-kki$(CL, NULLconst char *error = NULL; int ret = loadrsakey(&ssh->cfg.keyfile, &s->key, s->password, &error ("); c_write_str(ssh, error); c_write_str(ssh, ")F-% qNKN\bp.( 4, len); if (!ssh->v1_stdout_throttling && bufsize > SSH1_BUFFER_LIMIT) { ssh->v1_stdout_throttling = 1;, NULL, NULL const char *error = NULL; key = ssh2_load_userkey(&ssh->cfg.keyfile, s->password, &error ("); c_write_str(ssh, error); c_write_str(ssh, ") Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1f99a33ba86d9dda0f9ba06e975c52cc Text-delta-base-sha1: 6cd46700f3789b723d088eea77a5dbb1fa863684 Text-content-length: 230 Text-content-md5: 0026d9d035359da5e41f528714d57f2c Text-content-sha1: 210eab07d0efa0974e779745b5a8cfbdac9be6e8 Content-length: 270 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVNvB3 3<f/, const char **errorstr, const char **errorstr, const char **errorstr); char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm, int *pub_blob_len, const char **errorstr Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c1d65d2ec7c7356eb1994c702d91c1d8 Text-delta-base-sha1: f4d7cb7f897c0d8cb4f5b3d96676f62a006b4ecf Text-content-length: 1954 Text-content-md5: 84aa92c0fb01bf78f2ded2407500dbdd Text-content-sha1: 013360017b309b0ed59f030bd808d512cbc5ee83 Content-length: 1994 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNPTCPDh`$AD"yY$P0|GdakBMQ This is a patch to implement this (looks sane -- needs documentation). Revision-number: 3433 Prop-content-length: 225 Content-length: 225 K 7 svn:log V 126 Add support for a DESTDIR variable in the Unix makefile to set the root of the installation tree (for building packages etc). K 10 svn:author V 3 ben K 8 svn:date V 27 2003-09-01T21:27:36.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b350a2a606aac9ea3daa140c3d33a67a Text-delta-base-sha1: 882eb96afb841e7a49afe9b5c7e9145b8f2e6e37 Text-content-length: 120 Text-content-md5: 5a5c6c96a398800417e5cadf36d3fd1d Text-content-sha1: 4887655db45c8e5fa49a36748f3fbc59477dcfa9 Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVNh~ ^2^nzDESTDIR)\$(bindir)/$_\n", &progrealnames("XU")), map("\t\$(INSTALL_DATA) -m 644 $_ \$(DESTDIR) Revision-number: 3434 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2003-09-02T08:52:42.000000Z K 7 svn:log V 16 Added Puttypad. K 10 svn:author V 4 owen PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cf078f5d884c7986bf21066670d486db Text-delta-base-sha1: 5de98d70a90c67ff3934f8ebe167c912c04f3e48 Text-content-length: 121 Text-content-md5: a119abe8649008ae9beae752307b1268 Text-content-sha1: 5c3340a6fc14013c895dbe602f196e0b59cd86db Content-length: 161 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNLI c$cB ualberta.ca/~jeharris/puttypad/"> Puttypad, a build of PuTTY disguised to look like Notepad(! Revision-number: 3435 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 Remove CRs. Oops :-/ K 10 svn:author V 5 simon K 8 svn:date V 27 2003-09-02T09:00:35.000000Z PROPS-END Node-path: putty/psftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dcc1570ec5cf6b7675bad4d3d775689e Text-delta-base-sha1: 933ae5bd7b85aaad9ebb3cf75c96c22578e8c41a Text-content-length: 5188 Text-content-md5: 6e589d3f08b4be23480740a19af645f0 Text-content-sha1: ba74af6d8bedfac3a48063ac14486126538e3f8e Content-length: 5227 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNK555/* * psftp.h: interface between psftp.c / scp.c and each * platform-specific SFTP module. */ #ifndef PUTTY_PSFTP_H #define PUTTY_PSFTP_H /* * psftp_getcwd returns the local current directory. The returned * string must be freed by the caller. */ char *psftp_getcwd(void); /* * psftp_lcd changes the local current directory. The return value * is NULL on success, or else an error message which must be freed * by the caller. */ char *psftp_lcd(char *newdir); /* * Retrieve file times on a local file. Must return two unsigned * longs in POSIX time_t format. */ void get_file_times(char *filename, unsigned long *mtime, unsigned long *atime); /* * One iteration of the PSFTP event loop: wait for network data and * process it, once. */ int ssh_sftp_loop_iteration(void); /* * The main program in psftp.c. Called from main() in the platform- * specific code, after doing any platform-specific initialisation. */ int psftp_main(int argc, char *argv[]); /* * These functions are used by PSCP to transmit progress updates * and error information to a GUI window managing it. This will * probably only ever be supported on Windows, so these functions * can safely be stubs on all other platforms. */ void gui_update_stats(char *name, unsigned long size, int percentage, unsigned long elapsed, unsigned long done, unsigned long eta, unsigned long ratebs); void gui_send_errcount(int list, int errs); void gui_send_char(int is_stderr, int c); void gui_enable(char *arg); /* * It's likely that a given platform's implementation of file * transfer utilities is going to want to do things with them that * aren't present in stdio. Hence we supply an alternative * abstraction for file access functions. * * This abstraction tells you the size and access times when you * open an existing file (platforms may choose the meaning of the * file times if it's not clear; whatever they choose will be what * PSCP sends to the server as mtime and atime), and lets you set * the times when saving a new file. * * On the other hand, the abstraction is pretty simple: it supports * only opening a file and reading it, or creating a file and * writing it. (FIXME: to use this in PSFTP it will also need to * support seeking to a starting point for restarted transfers.) * None of this read-and-write, seeking-back-and-forth stuff. */ typedef struct RFile RFile; typedef struct WFile WFile; /* Output params size, mtime and atime can all be NULL if desired */ RFile *open_existing_file(char *name, unsigned long *size, unsigned long *mtime, unsigned long *atime); /* Returns <0 on error, 0 on eof, or number of bytes read, as usual */ int read_from_file(RFile *f, void *buffer, int length); /* Closes and frees the RFile */ void close_rfile(RFile *f); WFile *open_new_file(char *name); /* Returns <0 on error, 0 on eof, or number of bytes written, as usual */ int write_to_file(WFile *f, void *buffer, int length); void set_file_times(WFile *f, unsigned long mtime, unsigned long atime); /* Closes and frees the WFile */ void close_wfile(WFile *f); /* * Determine the type of a file: nonexistent, file, directory or * weird. `weird' covers anything else - named pipes, Unix sockets, * device files, fish, badgers, you name it. Things marked `weird' * will be skipped over in recursive file transfers, so the only * real reason for not lumping them in with `nonexistent' is that * it allows a slightly more sane error message. */ enum { FILE_TYPE_NONEXISTENT, FILE_TYPE_FILE, FILE_TYPE_DIRECTORY, FILE_TYPE_WEIRD }; int file_type(char *name); /* * Read all the file names out of a directory. */ typedef struct DirHandle DirHandle; DirHandle *open_directory(char *name); /* The string returned from this will need freeing if not NULL */ char *read_filename(DirHandle *dir); void close_directory(DirHandle *dir); /* * Test a filespec to see whether it's a local wildcard or not. * Return values: * * - WCTYPE_WILDCARD (this is a wildcard). * - WCTYPE_FILENAME (this is a single file name). * - WCTYPE_NONEXISTENT (whichever it was, nothing of that name exists). * * Some platforms may choose not to support local wildcards when * they come from the command line; in this case they simply never * return WCTYPE_WILDCARD, but still test the file's existence. * (However, all platforms will probably want to support wildcards * inside the PSFTP CLI.) */ enum { WCTYPE_NONEXISTENT, WCTYPE_FILENAME, WCTYPE_WILDCARD }; int test_wildcard(char *name, int cmdline); /* * Actually return matching file names for a local wildcard. */ typedef struct WildcardMatcher WildcardMatcher; WildcardMatcher *begin_wildcard_matching(char *name); /* The string returned from this will need freeing if not NULL */ char *wildcard_get_filename(WildcardMatcher *dir); void finish_wildcard_matching(WildcardMatcher *dir); /* * Create a directory. Returns 0 on error, !=0 on success. */ int create_directory(char *name); /* * Concatenate a directory name and a file name. The way this is * done will depend on the OS. */ char *dir_file_cat(char *dir, char *file); #endif /* PUTTY_PSFTP_H */ Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d6d9a0fd1b9096874425d9690454bdec Text-delta-base-sha1: 481322da2e1f2e138a9ca171cece69ad3699beb6 Text-content-length: 7730 Text-content-md5: 26a719a2c5092ef9fd2e62181f348fd2 Text-content-sha1: 6739cdff93eff70c70e79fe3b72e5c375911b984 Content-length: 7769 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNv` _D=/* * uxsftp.c: the Unix-specific parts of PSFTP and PSCP. */ #include #include #include #include #include #include #include #include #include #include "putty.h" #include "psftp.h" /* * In PSFTP our selects are synchronous, so these functions are * empty stubs. */ int uxsel_input_add(int fd, int rwx) { return 0; } void uxsel_input_remove(int id) { } char *x_get_default(const char *key) { return NULL; /* this is a stub */ } void platform_get_x11_auth(char *display, int *protocol, unsigned char *data, int *datalen) { /* Do nothing, therefore no auth. */ } /* * Default settings that are specific to PSFTP. */ char *platform_default_s(const char *name) { return NULL; } int platform_default_i(const char *name, int def) { return def; } FontSpec platform_default_fontspec(const char *name) { FontSpec ret; *ret.name = '\0'; return ret; } Filename platform_default_filename(const char *name) { Filename ret; if (!strcmp(name, "LogFileName")) strcpy(ret.path, "putty.log"); else *ret.path = '\0'; return ret; } /* * Stubs for the GUI feedback mechanism in Windows PSCP. */ void gui_update_stats(char *name, unsigned long size, int percentage, unsigned long elapsed, unsigned long done, unsigned long eta, unsigned long ratebs) {} void gui_send_errcount(int list, int errs) {} void gui_send_char(int is_stderr, int c) {} void gui_enable(char *arg) {} /* * Set local current directory. Returns NULL on success, or else an * error message which must be freed after printing. */ char *psftp_lcd(char *dir) { if (chdir(dir) < 0) return dupprintf("%s: chdir: %s", dir, strerror(errno)); else return NULL; } /* * Get local current directory. Returns a string which must be * freed. */ char *psftp_getcwd(void) { char *buffer, *ret; int size = 256; buffer = snewn(size, char); while (1) { ret = getcwd(buffer, size); if (ret != NULL) return ret; if (errno != ERANGE) { sfree(buffer); return dupprintf("[cwd unavailable: %s]", strerror(errno)); } /* * Otherwise, ERANGE was returned, meaning the buffer * wasn't big enough. */ size = size * 3 / 2; buffer = sresize(buffer, size, char); } } struct RFile { int fd; }; RFile *open_existing_file(char *name, unsigned long *size, unsigned long *mtime, unsigned long *atime) { int fd; RFile *ret; fd = open(name, O_RDONLY); if (fd < 0) return NULL; ret = snew(RFile); ret->fd = fd; if (size || mtime || atime) { struct stat statbuf; if (fstat(fd, &statbuf) < 0) { fprintf(stderr, "%s: stat: %s\n", name, strerror(errno)); memset(&statbuf, 0, sizeof(statbuf)); } if (size) *size = statbuf.st_size; if (mtime) *mtime = statbuf.st_mtime; if (atime) *atime = statbuf.st_atime; } return ret; } int read_from_file(RFile *f, void *buffer, int length) { return read(f->fd, buffer, length); } void close_rfile(RFile *f) { close(f->fd); sfree(f); } struct WFile { int fd; char *name; }; WFile *open_new_file(char *name) { int fd; WFile *ret; fd = open(name, O_CREAT | O_TRUNC | O_WRONLY, 0666); if (fd < 0) return NULL; ret = snew(WFile); ret->fd = fd; ret->name = dupstr(name); return ret; } int write_to_file(WFile *f, void *buffer, int length) { char *p = (char *)buffer; int so_far = 0; /* Keep trying until we've really written as much as we can. */ while (length > 0) { int ret = write(f->fd, p, length); if (ret < 0) return ret; if (ret == 0) break; p += ret; length -= ret; so_far += ret; } return so_far; } void set_file_times(WFile *f, unsigned long mtime, unsigned long atime) { struct utimbuf ut; ut.actime = atime; ut.modtime = mtime; utime(f->name, &ut); } /* Closes and frees the WFile */ void close_wfile(WFile *f) { close(f->fd); sfree(f->name); sfree(f); } int file_type(char *name) { struct stat statbuf; if (stat(name, &statbuf) < 0) { if (errno != ENOENT) fprintf(stderr, "%s: stat: %s\n", name, strerror(errno)); return FILE_TYPE_NONEXISTENT; } if (S_ISREG(statbuf.st_mode)) return FILE_TYPE_FILE; if (S_ISDIR(statbuf.st_mode)) return FILE_TYPE_DIRECTORY; return FILE_TYPE_WEIRD; } struct DirHandle { DIR *dir; }; DirHandle *open_directory(char *name) { DIR *dir; DirHandle *ret; dir = opendir(name); if (!dir) return NULL; ret = snew(DirHandle); ret->dir = dir; return ret; } char *read_filename(DirHandle *dir) { struct dirent *de; do { de = readdir(dir->dir); if (de == NULL) return NULL; } while ((de->d_name[0] == '.' && (de->d_name[1] == '\0' || (de->d_name[1] == '.' && de->d_name[2] == '\0')))); return dupstr(de->d_name); } void close_directory(DirHandle *dir) { closedir(dir->dir); sfree(dir); } int test_wildcard(char *name, int cmdline) { /* * On Unix, we currently don't support local wildcards at all. * mput, but until then we can assume `cmdline' is always set. */ struct stat statbuf; assert(cmdline); if (stat(name, &statbuf) < 0) return WCTYPE_NONEXISTENT; else return WCTYPE_FILENAME; } /* * Actually return matching file names for a local wildcard. FIXME: * we currently don't support this at all. */ struct WildcardMatcher { int x; }; WildcardMatcher *begin_wildcard_matching(char *name) { return NULL; } char *wildcard_get_filename(WildcardMatcher *dir) { return NULL; } void finish_wildcard_matching(WildcardMatcher *dir) {} int create_directory(char *name) { return mkdir(name, 0777) == 0; } char *dir_file_cat(char *dir, char *file) { return dupcat(dir, "/", file, NULL); } /* * Wait for some network data and process it. */ int ssh_sftp_loop_iteration(void) { fd_set rset, wset, xset; int i, fdcount, fdsize, *fdlist; int fd, fdstate, rwx, ret, maxfd; fdlist = NULL; fdcount = fdsize = 0; /* Count the currently active fds. */ i = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) i++; if (i < 1) return -1; /* doom */ /* Expand the fdlist buffer if necessary. */ if (i > fdsize) { fdsize = i + 16; fdlist = sresize(fdlist, fdsize, int); } FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&xset); maxfd = 0; /* * Add all currently open fds to the select sets, and store * them in fdlist as well. */ fdcount = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) { fdlist[fdcount++] = fd; if (rwx & 1) FD_SET_MAX(fd, maxfd, rset); if (rwx & 2) FD_SET_MAX(fd, maxfd, wset); if (rwx & 4) FD_SET_MAX(fd, maxfd, xset); } do { ret = select(maxfd, &rset, &wset, &xset, NULL); } while (ret < 0 && errno == EINTR); if (ret < 0) { perror("select"); exit(1); } for (i = 0; i < fdcount; i++) { fd = fdlist[i]; /* * We must process exceptional notifications before * ordinary readability ones, or we may go straight * past the urgent marker. */ if (FD_ISSET(fd, &xset)) select_result(fd, 4); if (FD_ISSET(fd, &rset)) select_result(fd, 1); if (FD_ISSET(fd, &wset)) select_result(fd, 2); } sfree(fdlist); return 0; } /* * Main program: do platform-specific initialisation and then call * psftp_main(). */ int main(int argc, char *argv[]) { uxsel_init(); return psftp_main(argc, argv); } Revision-number: 3436 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2003-09-02T09:52:13.000000Z K 7 svn:log V 44 Include stdlib.h for exit() - thanks Colin. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 26a719a2c5092ef9fd2e62181f348fd2 Text-delta-base-sha1: 6739cdff93eff70c70e79fe3b72e5c375911b984 Text-content-length: 26 Text-content-md5: 1f4af7921a9ecfa6aa2682095e072824 Text-content-sha1: b845ccd40ec107cafd7bd3cdbfd40d8c0ec83640 Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN`t  astdlib Revision-number: 3437 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:40.515512Z PROPS-END Revision-number: 3438 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:40.523503Z PROPS-END Revision-number: 3439 Prop-content-length: 534 Content-length: 534 K 8 svn:date V 27 2003-09-02T19:00:17.000000Z K 7 svn:log V 433 When loading SSH-2 key, ignore passphrase argument if key is unencrypted. This should get rid of a problem that three or four people reported where PuTTY intermittently reports "Unable to load private key" (MAC failed). (ssh.c:do_ssh2_authconn() should also initialise its passphrase so it's not passing garbage passphrases around, of course, but I haven't yet worked out where the best place in the auth loop to do that would be.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 84aa92c0fb01bf78f2ded2407500dbdd Text-delta-base-sha1: 013360017b309b0ed59f030bd808d512cbc5ee83 Text-content-length: 35 Text-content-md5: 96c24a7ee5c0a027db1211d431d9da15 Text-content-sha1: f639fd70204c87fe9357256b057cf12cb4943305 Content-length: 75 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNT^ .&.cipher && Revision-number: 3440 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2003-09-02T19:02:06.000000Z K 7 svn:log V 106 Change an incorrect comment about "PuTTY-User-Key-File-2" private key format after discussion with Simon. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 96c24a7ee5c0a027db1211d431d9da15 Text-delta-base-sha1: f639fd70204c87fe9357256b057cf12cb4943305 Text-content-length: 75 Text-content-md5: 2f4ca33cf38b78097d4360a248d1ed06 Text-content-sha1: 27d4b8acfc691f034a1ca9d1dd2796f86f16b6a0 Content-length: 115 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN^B 3AN(An empty passphrase is used for unencrypted keys.) Revision-number: 3441 Prop-content-length: 255 Content-length: 255 K 8 svn:date V 27 2003-09-03T12:50:34.000000Z K 7 svn:log V 154 Summary: Ability to run Pageant as a Windows Service in NT/2000/etc Priority: never Derived from Simon's message . K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pageant-as-service Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2361 Text-content-md5: 605d2e1ad434842935dbd4b757dd7821 Text-content-sha1: 0e9f6a3183f887299877526836f9a9d30f82a20c Content-length: 2477 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN+++Summary: Ability to run Pageant as a Windows Service in NT/2000/etc Class: wish Difficulty: tricky Priority: never Content-type: text/x-html-body

    People occasionally ask if it's possible to enable running Pageant as a Windows Service.

    It's not. This is for two reasons:

    • Pageant's IPC is pretty ad-hoc, and is done partly through window messages. Hence Pageant needs to have a window open at all times, so it can't run as a persistent service through multiple people's sessions.
    • Pageant is designed to be used by a single user of a machine (and it contains security code to enforce this). If it ran as a service, it would have to somehow segregate requests from multiple users, maintain lots of separate key databases, do its own internal access control to work out which requests were allowed to access what, and generally things would get a lot more complicated. It's never seemed worth going to this effort.

    In any case, I've never been sure of the usefulness of running a long-term SSH agent to supply keys to automated scripts. That doesn't seem much more secure than just leaving the unencrypted key on disk - it might protect you against physical-access attacks in which the attacker shuts the machine down, steals the hard disk, and then can't recover the unencrypted key, but against the much more likely network attack in which the attacker gains access to the still-running machine it's no help because it's almost as easy to read keys out of the agent's memory as it is to read them off disk.

    A better solution for automated scripts is to create a dedicated SSH key for each automated task, and restrict the capabilities of that key on the server side. Then just store the private key unencrypted (readable by you only, of course) on the client. That way, if an attacker manages to gain access to the key file, then they don't gain unrestricted access to the account on the server; instead they only gain the specific ability to tamper with the progress of that particular automated script. Also I think it makes the scripts more reliable, because they only depend on disk files, and they're not dependent on the presence of a persistent process that might have (for example) unexpectedly segfaulted or been accidentally killed a day ago. Revision-number: 3442 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2003-09-03T17:37:03.000000Z K 7 svn:log V 68 Summary: Interpret escape codes in pre-login banner Priority: never K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/banner-escape-codes Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 778 Text-content-md5: e0af30b27fb67a498d1170ec5376e086 Text-content-sha1: 752187bd09c34ac86d636d3563172b177d233c07 Content-length: 894 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN|||Summary: Interpret escape codes in pre-login banner Class: wish Difficulty: fun Priority: never Content-type: text/x-html-body

    People occasionally ask for PuTTY to interpret escape codes in the banner some SSH servers send prior to authentication.

    The current SSH-2 authentication draft draft-ietf-secsh-userauth-17 states, in the section about SSH_MSG_USERAUTH_BANNER:

    If the message string is displayed, control character filtering discussed in [SSH-ARCH] SHOULD be used to avoid attacks by sending terminal control characters.

    This is what PuTTY does, and as such, terminal-control sequences won't work. Revision-number: 3443 Prop-content-length: 123 Content-length: 123 K 7 svn:log V 23 Add pscp to .cvsignore K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-09-03T18:37:35.000000Z PROPS-END Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 103 Content-length: 103 K 10 svn:ignore V 71 Makefile.gtk Makefile local plink pterm putty puttytel psftp pscp *.log PROPS-END Node-path: putty/unix/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 90cef4d8072291e754b697ad7995fd45 Text-delta-base-sha1: 0690c985de145af7842a7f5c37c919c713428dbe Text-content-length: 77 Text-content-md5: b867dd66d06a5fef9a88f3edf99363ca Text-content-sha1: be1a0f82ed756bc971cd77411156e003b0cc5741 Content-length: 116 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNCH@@;Makefile.gtk Makefile local plink pterm putty puttytel psftp psc Revision-number: 3444 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2003-09-03T20:14:38.000000Z K 7 svn:log V 80 Implement `default-colours' on Windows based loosely on Michael Wardle's patch. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3029eae3114263d75cfddecc8dc4bb57 Text-delta-base-sha1: 2d213b78c3ecbe9bf05293e35408dbd66bc1c5e2 Text-content-length: 541 Text-content-md5: 2eccaf062cec32723d77709a1d0d4d52 Text-content-sha1: c29e64ad96933dadb8dd40e025382039ddd1f49b Content-length: 581 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVNZ1o5JC\versionid $Id: config.but,v 1.67 2003/09/03 20:14:38syscolour} \q{Use system colours} \cfg{winhelp-topic}{colours.system} Enabling this option will cause PuTTY to ignore the configured colours for \q{Default Background/Foreground} and \q{Cursor Colour/Text} (see \k{config-colourcfg}), instead going with the system-wide defaults. Note that non-bold and bold text will be the same colour if this option is enabled. You might want to change to indicating bold text by font changes (see \k{config-boldcolour}) Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a4ab7307fbfd406a0f34aa6893df81e8 Text-delta-base-sha1: 3eb5c82ed3bbcc75a5f092b41970486f9d0ac540 Text-content-length: 37 Text-content-md5: 0409d3370d0657d7a223d6b452545a9e Text-content-sha1: da8f4ff54d9d145ffba4bc872849cd7885de4a86 Content-length: 78 K 15 cvs2svn:cvs-rev V 5 1.223 PROPS-END SVN} T2Ksystem_colour; Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6b3bed2cdced243e43c2fffd7b7c9944 Text-delta-base-sha1: 7bf08e9169e9a56047b07c88390b2bd61c1db657 Text-content-length: 108 Text-content-md5: c1a63b9d3ce6ddd97784cbbed3bf9af3 Text-content-sha1: 0500ec9a77d44d65fc025333dc566eec96b739ed Content-length: 149 K 15 cvs2svn:cvs-rev V 5 1.113 PROPS-END SVNNo'pUseSystemColours", cfg->system_colourUseSystemColours", 0, &cfg->system_colour Node-path: putty/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 225262fe3805ef79582f6b2531881f52 Text-delta-base-sha1: 1535c59374646373c2b41303ea6f44622e0f8040 Text-content-length: 194 Text-content-md5: d4b370dbdf24912fbb3533ee4bbd33c6 Text-content-sha1: 11c6d197b63579c5d4916a7b627d1567e11207ba Content-length: 233 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNf *)*>( ctrl_checkbox(s, "Use system colours", 's', HELPCTX(colours_system), dlg_stdcheckbox_handler, I(offsetof(Config,system_colour))); Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d871ed78eae69e59e3a8b0af6e729fbe Text-delta-base-sha1: d5c60cad36d8802cf13d019bf7b68a857d47d1cf Text-content-length: 2246 Text-content-md5: 3d3f58b14b454739bd98da244d250c41 Text-content-sha1: be1e5776c8b6d7c1fad200af7d5c2afbed8b43eb Content-length: 2287 K 15 cvs2svn:cvs-rev V 5 1.251 PROPS-END SVN5Zc=2sys /* Override with system colours if appropriate */ if (cfg.system_colour) systopalette(); } /* * Override bit of defpal with colours from the system. * (NB that this takes a copy the system colours at the time this is called, * so subsequent colour scheme changes don't take effect. To fix that we'd * probably want to be using GetSysColorBrush() and the like.) */ static void systopalette(void) { int i; static const struct { int nIndex; int norm; int bold; } or[] = { { COLOR_WINDOWTEXT, 16, 17 }, /* Default Foreground */ { COLOR_WINDOW, 18, 19 }, /* Default Background */ { COLOR_HIGHLIGHTTEXT, 20, 21 }, /* Cursor Text */ { COLOR_HIGHLIGHT, 22, 23 }, /* Cursor Colour */ }; for (i = 0; i < (sizeof(or)/sizeof(or[0])); i++) { COLORREF colour = GetSysColor(or[i].nIndex); defpal[or[i].norm].rgbtRed = defpal[or[i].bold].rgbtRed = GetRValue(colour); defpal[or[i].norm].rgbtGreen = defpal[or[i].bold].rgbtGreen = GetGValue(colour); defpal[or[i].norm].rgbtBlue = defpal[or[i].bold].rgbtBlue = GetBValue(colour)xRZZx); } else { char cbuf[2]; cbuf[0] = '\033'; cbuf[1] = ch; term_seen_key_event(term); lpage_send(ldisc, kbd_codepage, cbuf+!left_alt, 1+!!left_alt, 1); } } show_mouseptr(0); } /* This is so the ALT-Numpad and dead keys work correctly. */ keys[0] = 0; return p - output; } /* If we're definitly not building up an ALT-54321 then clear it */ if (!left_alt) keys[0] = 0; /* If we will be using alt_sum fix the 256s */ else if (keys[0] && (in_utf(term) || ucsdata.dbcs_screenfont)) keys[0] = 10; } /* * ALT alone may or may not want to bring up the System menu. * If it's not meant to, we return 0 on presses or releases of * ALT, to show that we've swallowed the keystroke. Otherwise * we return -1, which means Windows will give the keystroke * its default handling (i.e. bring up the System menu). */ if (wParam == VK_MENU && !cfg.alt_only) return 0; return -1; } void request_paste(void *frontend) { /* * In Windows, pasting is synchronous: we can read the * clipboard with no Node-path: putty/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 40728e067dcc5fd549a067fbbab84c19 Text-delta-base-sha1: 7f8797a12ef19dd91dd400e3fd83d0e9c2d6b40e Text-content-length: 43 Text-content-md5: 492d57baa927939eb9faf13e6690b9d0 Text-content-sha1: fc1c0ed00d725730d13c5c2c84e98e3f9735e1d4 Content-length: 82 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN=q mnOsystem "colours.system Revision-number: 3445 Prop-content-length: 153 Content-length: 153 K 7 svn:log V 53 Implemented based loosely on Michael Wardle's patch. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-09-03T20:17:14.000000Z PROPS-END Node-path: putty-wishlist/data/default-colours Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 61f5e265359225e66dde7ad666a20fc5 Text-delta-base-sha1: da23d09aa4934d92f428274839a0d9121710287f Text-content-length: 146 Text-content-md5: 359810b3c9f16b1dd0b77b0940d9a83c Text-content-sha1: 578729a9f44673c767defbd605e45f790b3a84ff Content-length: 185 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNdG }gcfiFixed-in: 2003-09-04em>Update: Implemented on Windows (I've also taken the cursor colours from the system-wide config). Revision-number: 3446 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:41.132614Z PROPS-END Revision-number: 3447 Prop-content-length: 130 Content-length: 130 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-09-04T11:58:10.000000Z K 7 svn:log V 30 putty.i-ownur.info back again PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fbb7df3fcea7b8ec76574b55734db408 Text-delta-base-sha1: eedf308f1530a04c7422fe5292d3e3f682da34e8 Text-content-length: 72 Text-content-md5: 51de3504f6db570c0d5200046a3a6ccd Text-content-sha1: da31582ddc0ff167aea9afafd503cb6f76272de6 Content-length: 112 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNu/Ci-ownur.info/">putty.i-ownur.info in Malays Revision-number: 3448 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:41.219244Z PROPS-END Revision-number: 3449 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2003-09-09T16:45:27.000000Z K 7 svn:log V 16 sourcekeg.co.uk K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 51de3504f6db570c0d5200046a3a6ccd Text-delta-base-sha1: da31582ddc0ff167aea9afafd503cb6f76272de6 Text-content-length: 69 Text-content-md5: 8412ea734cd80dd1433296fd3503d6b6 Text-content-sha1: e56841f42293447608306fcce76a2b0c8ef8ea7c Content-length: 109 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNui 0Udwww.sourcekeg.co.uk/putty/">sourcekeg.co.uk Revision-number: 3450 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2003-09-10T12:30:10.000000Z K 7 svn:log V 126 Oops. Fix a bug in my `keyfile-diagnostic' work which caused SSH-2 key loading in pageant (and presumably puttygen) to crash. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2f4ca33cf38b78097d4360a248d1ed06 Text-delta-base-sha1: 27d4b8acfc691f034a1ca9d1dd2796f86f16b6a0 Text-content-length: 40 Text-content-md5: 922c1ff32d42c6da7f1e069713f06a29 Text-content-sha1: d9f9d7a7dee4561ec518f1332604dc246d4cae51 Content-length: 80 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNBQ ''if (errorstr) Revision-number: 3451 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Bart Grzybicki's Polish-localised version of PuTTY K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-09-15T19:21:14.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a119abe8649008ae9beae752307b1268 Text-delta-base-sha1: 5c3340a6fc14013c895dbe602f196e0b59cd86db Text-content-length: 84 Text-content-md5: 05119b9bb24c547bb7de2681e406a255 Text-content-sha1: f839c1bf1549ff109d19e24505db7fd9cae5606c Content-length: 124 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNI! ?:(!bart.eu.org/putty-polish/"> Polish localised version of PuTTY Revision-number: 3452 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2003-09-15T19:21:45.000000Z K 7 svn:log V 37 (can't find any source for previous) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 05119b9bb24c547bb7de2681e406a255 Text-delta-base-sha1: f839c1bf1549ff109d19e24505db7fd9cae5606c Text-content-length: 33 Text-content-md5: 3d4de6a7618e5fcc4ec665f823f32201 Text-content-sha1: 3ee807265144fd3ef40e6edcdf5b255ec57dda75 Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN!- }$} (no source) Revision-number: 3453 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2003-09-16T09:38:05.000000Z K 7 svn:log V 51 Freshen The Wonderful Icon link, and add PowerMenu K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/system-tray Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3a4f2b683e857ca2a9c22ce0470b0bfe Text-delta-base-sha1: a4de08afccb20e6c981e456ededd9f860024b2bd Text-content-length: 236 Text-content-md5: fa3334c1ea7625db29eed50bd2ae4275 Text-content-sha1: 0c987a14c496f5966e1bb7e7fea71964637a5e23 Content-length: 275 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN5{Y"Ywww.thewonderfulicon.com/">The Wonderful Icon.

  • TraySaver.
  • PowerMenu. Revision-number: 3454 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2003-09-17T13:54:22.000000Z K 7 svn:log V 30 Yet another one: TrayIconizer K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/system-tray Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fa3334c1ea7625db29eed50bd2ae4275 Text-delta-base-sha1: 0c987a14c496f5966e1bb7e7fea71964637a5e23 Text-content-length: 99 Text-content-md5: 4669dd0df3d8a409511fcf6d98c46b51 Text-content-sha1: 85af8a8eddf9210a013921a25e23757858a99b4f Content-length: 138 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN{HRvRli> TrayIconizer. Revision-number: 3455 Prop-content-length: 126 Content-length: 126 K 7 svn:log V 26 CSS have updated to 0.53b K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-09-18T18:58:59.000000Z PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 80c58ca58bf4809bb79a0143a073caa0 Text-delta-base-sha1: 3b1f0602e99e0016fc68431564551e2f452a4da9 Text-content-length: 22 Text-content-md5: 601fa2b27f4d2f0ff701718fd3dd41c4 Text-content-sha1: 0bfa754e1f865bb0f1e670e5d1644bc4481186c0 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNef ~f3b Revision-number: 3456 Prop-content-length: 145 Content-length: 145 K 7 svn:log V 45 Mention (undocumented) function PickIconDlg. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-09-18T19:38:25.000000Z PROPS-END Node-path: putty-wishlist/data/session-icon Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cdb6c018c0818088cd39653c6fb1fe78 Text-delta-base-sha1: f4975ce433ab099733f0fde649783dc4bccd1507 Text-content-length: 447 Text-content-md5: f29a684fd0f23d2505b90008669ab2fb Text-content-sha1: 5a97c08d08d955b14a763211f4efc6cefcb1ad6d Content-length: 486 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN8b '&'#ul>
  • Update: There is an undocumented interface to get at Windows' icon chooser from SHELL32.DLL, called PickIconDlg; there's some faff involved but it does appear to be available across a wide range of Windows versions. (Not sure about Win32s.) Revision-number: 3457 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 56 Summary: Support setting environment variables in SSH-2 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-09-20T09:29:47.000000Z PROPS-END Node-path: putty-wishlist/data/ssh2-env-var Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 490 Text-content-md5: d13e2a81aae2204f804bc23d2f7a7c52 Text-content-sha1: 341ad4b0ba768eb5c3e85efeb905ffb827c2c743 Content-length: 606 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN\\\Summary: Support setting environment variables in SSH-2 Class: wish Difficulty: fun Priority: low Content-type: text/x-html-body

    SSH-2 has a mechanism for the client to set random environment variables on the server (the env channel request). Currently we don't support this.

    Last time we looked, we weren't aware of any SSH servers that bothered to support this, but that was a some time ago now.

    (The SSH-1 protocol doesn't support this at all.) Revision-number: 3458 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2003-09-23T10:05:06.000000Z K 7 svn:log V 45 Mention Windows on Alpha as worth mentioning K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b07b2502699b20dcbbaf31684fcfea1c Text-delta-base-sha1: 49b9f25db66484f30172d77b7ca9559f51fc3682 Text-content-length: 213 Text-content-md5: c76fe167a51d5747dc14e7de900daedf Text-content-sha1: 8ef30181f5797dc2ef11105dd61a1afa343f68cf Content-length: 253 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNkl ;;~29\versionid $Id: feedback.but,v 1.14 2003/09/23 10:05:06 jacob(If you're running on Windows for Alpha, tell us, or we'll assume you're running on Intel as this is overwhelmingly the case.) Revision-number: 3459 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2003-09-23T10:12:02.000000Z K 7 svn:log V 136 Imply that some features that have been implemented may appear on the Wishlist but not the Changes page, as this is now often the case. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c76fe167a51d5747dc14e7de900daedf Text-delta-base-sha1: 8ef30181f5797dc2ef11105dd61a1afa343f68cf Text-content-length: 97 Text-content-md5: 9c1604f3f485a4e5ff2e674f0e82df62 Text-content-sha1: 23b148dcf103a641fafdb0618853082a250ed3f0 Content-length: 137 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNlyD7V\versionid $Id: feedback.but,v 1.15 2003/09/23 10:12:02 Wishlist and Revision-number: 3460 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2003-09-24T21:19:48.000000Z K 7 svn:log V 68 www.puttyssh.org (this has been on my other list for a while, oops) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8412ea734cd80dd1433296fd3503d6b6 Text-delta-base-sha1: e56841f42293447608306fcce76a2b0c8ef8ea7c Text-content-length: 86 Text-content-md5: 74761d518231c9ee87ed79f107a96bf5 Text-content-sha1: a6fb1618b6fbee7f4d2df2716e0e865ec101e741 Content-length: 126 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNiQ @d@-

  • puttyssh Revision-number: 3461 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2003-09-24T22:46:22.000000Z K 7 svn:log V 39 You can stop offering us alphas now... K 10 svn:author V 4 owen PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3e3cc93954adc2e1d3ad32ee87662c48 Text-delta-base-sha1: c30ac4f7102e11cfa7e39fe340138ea070e15453 Text-content-length: 239 Text-content-md5: 8af89bde2c27a6fa71775adc3bcee4e0 Text-content-sha1: a6f1246e228b482bd8321e46e38c500df2008eb6 Content-length: 279 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN- WW.9-25 Machine acquired for NT Alpha builds

    We've now got hold of a machine with which to build PuTTY for NT Alpha. Thanks to all those who offered hardware. Alpha NT snapshots should reappear in due course. Revision-number: 3462 Prop-content-length: 256 Content-length: 256 K 8 svn:date V 27 2003-09-24T23:21:56.000000Z K 7 svn:log V 155 Summary: Terminal emulations other than xterm/ECMA-48 (e.g. 3270) Priority: never (Had this kicking around for a while, but the tek4014 guy reminded me.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/terminal-emulations Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 722 Text-content-md5: 7329f24a2a60b1e62123202ee02701fa Text-content-sha1: e298ba02eef921d86222a875b20c90528e710944 Content-length: 838 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNDDDSummary: Terminal emulations other than xterm/ECMA-48 (e.g. 3270) Class: wish Difficulty: tricky Priority: never Content-type: text/x-html-body

    PuTTY aims to do one type of terminal emulation (approximately, xterm/VTxxx/ECMA-48, which is widely used) and do it well.

    PuTTY's authors primarily use it to access systems which have a termcap/terminfo-like terminal abstraction layer, so the need to emulate more than one type of character-cell terminal isn't very important to us.

    We are therefore unlikely to add support for wildly different forms of terminal emulation such as IBM 3270 to the core of PuTTY.

    This probably also goes for extra non-character-cell emulations such as tek4014. Revision-number: 3463 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2003-09-24T23:32:07.000000Z K 7 svn:log V 74 The message listed as containing a patch doesn't (although it claims to). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sco-ansi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0c44a8ad7438debdd6b0a7160db1797a Text-delta-base-sha1: 604f150103c71ff5396aa397d54b5487ca91917a Text-content-length: 20 Text-content-md5: ad617ece1b51bc0d5ad02f823e4824f0 Text-content-sha1: 8b60e8ad83751ef9ae64400c56484e8715b05b1c Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN#O putty.mirrors.ilisys.com Revision-number: 3466 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2003-09-26T09:08:18.000000Z K 7 svn:log V 33 Note some deficiences in SFTPv4. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/line-endings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 66a9740e2c7d42f150d31ebc528343f4 Text-delta-base-sha1: cd341c0439355e1f5e6ee6ed3cf6fc3c93aca8f0 Text-content-length: 312 Text-content-md5: 1e36c2a3ef5d343de544ddaf34e75ba8 Text-content-sha1: ff3fdb69fb898c71bf67c8adb68e30a7c3b4ab97 Content-length: 351 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN + ' d((However, note that this version of the protocol does not allow the server to give hints to the client about whether the file is best opened in text or binary mode, so the operation of "get" would have to be manually switched by "text" and "binary" commands or similar.)

    For "put", s Revision-number: 3467 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2003-09-26T13:04:56.000000Z K 7 svn:log V 67 Clarify what happens when you enter a code page that's not listed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a9accd477a1af71302281e36cbf0e49d Text-delta-base-sha1: 7af80e732d0c303922f8fd056579d8c6e599d32d Text-content-length: 261 Text-content-md5: 234d5213c55555a214f01505b1492275 Text-content-sha1: 5191dd248dc2c46f825a05d40823e4f25da94225 Content-length: 301 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVN8g/52kM\versionid $Id: config.but,v 1.69 2003/09/26 13:04:56can try entering its name manually (\c{CP866} for example) in the list box. If the underlying version of Windows has the appropriate translation table installed, PuTTY will use i Revision-number: 3468 Prop-content-length: 683 Content-length: 683 K 7 svn:log V 582 First cut at speeding up SFTP. Generic download-management code in sftp.c, and psftp.c now uses that instead of going it alone. Should in principle be easily installed in PSCP as well, but I haven't done it yet; also it only handles downloads, not uploads, and finally it doesn't yet properly calculate the correct number of parallel requests to queue. Still, it's a start, and in my own tests it seemed to perform as expected (download speed suddenly became roughly what you'd expect from the available bandwidth, and decreased by roughly the expected number of round-trip times). K 10 svn:author V 5 simon K 8 svn:date V 27 2003-09-27T17:52:34.000000Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e5ef10347a68114cdfc56827a53ae66b Text-delta-base-sha1: 8f12af869faf9a904957ca3a7fb0bf1583bb1c7c Text-content-length: 829 Text-content-md5: d7749e0cdeb51edd62de09e725981f16 Text-content-sha1: 6f5466a1a9361482c2ea8c93078a1d12ceed02c8 Content-length: 869 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNAuiPc !struct fxp_xfer *xferxfer = xfer_download_init(fh, offset); while (!xfer_download_done(xfer)) { void *vbuf; int ret, len; int wpos, wlen; xfer_download_queue(xfer); pktin = sftp_recv(); ret = xfer_download_gotpkt(xfer, pktin); if (ret < 0) { printf("error while reading: %s\n", fxp_error()); ret = 0; } while (xfer_download_data(xfer, &vbuf, &len)) { unsigned char *buf = (unsigned char *)vbuf; wpos = 0; while (wpos < len) { wlen = fwrite(buf + wpos, 1, len - wpos, fp); if (wlen <= 0) { printf("error while writing local file\n"); ret = 0; xfer_set_error(xfer); } wpos += wlen; } if (wpos < len) { /* we had an error */ ret = 0; xfer_set_error(xfer); } } } xfer_cleanup(xfer); Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 490ff7dbf1fe0dcd6c1da8c3a6a8f7ea Text-delta-base-sha1: 82b077fac9fc9ce94a8dd9d87775977c18a3fe03 Text-content-length: 5719 Text-content-md5: 873c4889ad3ec2623e48dc9c8da8c340 Text-content-sha1: 7bd025a5aadfe1bad1477c9759d54c8ab1f0b4a9 Content-length: 5759 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNuserdata = NULL /* * Store user data in an sftp_request structure. */ void *fxp_get_userdata(struct sftp_request *req) { return req->userdata; } void fxp_set_userdata(struct sftp_request *req, void *data) { req->userdata = data; } /* * A wrapper to go round fxp_read_* and fxp_write_*, which manages * the queueing of multiple read/write requests. */ struct req { char *buffer; int len, retlen, complete; uint64 offset; struct req *next, *prev; }; struct fxp_xfer { uint64 offset, furthestdata, filesize; int nreqs, req_max, eof, err; struct fxp_handle *fh; struct req *head, *tail; }; static struct fxp_xfer *xfer_init(struct fxp_handle *fh, uint64 offset) { struct fxp_xfer *xfer = snew(struct fxp_xfer); xfer->fh = fh; xfer->offset = offset; xfer->head = xfer->tail = NULL; xfer->nreqs = 0; xfer->req_max = 4; /* FIXME: set properly! */ xfer->err = 0; xfer->filesize = uint64_make(ULONG_MAX, ULONG_MAX); xfer->furthestdata = uint64_make(0, 0); return xfer; } int xfer_download_done(struct fxp_xfer *xfer) { /* * We're finished if we've seen EOF _and_ there are no * outstanding requests. */ return (xfer->eof || xfer->err) && !xfer->head; } void xfer_download_queue(struct fxp_xfer *xfer) { while (xfer->nreqs < xfer->req_max && !xfer->eof) { /* * Queue a new read request. */ struct req *rr; struct sftp_request *req; rr = snew(struct req); rr->offset = xfer->offset; rr->complete = 0; if (xfer->tail) { xfer->tail->next = rr; rr->prev = xfer->tail; } else { xfer->head = rr; rr->prev = NULL; } xfer->tail = rr; rr->next = NULL; rr->len = 4096; rr->buffer = snewn(rr->len, char); sftp_register(req = fxp_read_send(xfer->fh, rr->offset, rr->len)); fxp_set_userdata(req, rr); xfer->offset = uint64_add32(xfer->offset, rr->len); xfer->nreqs++; #ifdef DEBUG_DOWNLOAD { char buf[40]; uint64_decimal(rr->offset, buf); printf("queueing read request %p at %s\n", rr, buf); } #endif } } struct fxp_xfer *xfer_download_init(struct fxp_handle *fh, uint64 offset) { struct fxp_xfer *xfer = xfer_init(fh, offset); xfer->eof = FALSE; xfer_download_queue(xfer); return xfer; } int xfer_download_gotpkt(struct fxp_xfer *xfer, struct sftp_packet *pktin) { struct sftp_request *rreq; struct req *rr; rreq = sftp_find_request(pktin); rr = (struct req *)fxp_get_userdata(rreq); if (!rr) return 0; /* this packet isn't ours */ rr->retlen = fxp_read_recv(pktin, rreq, rr->buffer, rr->len); #ifdef DEBUG_DOWNLOAD printf("read request %p has returned [%d]\n", rr, rr->retlen); #endif if ((rr->retlen < 0 && fxp_error_type()==SSH_FX_EOF) || rr->retlen == 0) { xfer->eof = TRUE; rr->complete = -1; #ifdef DEBUG_DOWNLOAD printf("setting eof\n"); #endif } else if (rr->retlen < 0) { /* some error other than EOF; signal it back to caller */ return -1; } rr->complete = 1; /* * Special case: if we have received fewer bytes than we * actually read, we should do something. For the moment I'll * just throw an ersatz FXP error to signal this; the SFTP * draft I've got says that it can't happen except on special * files, in which case seeking probably has very little * meaning and so queueing an additional read request to fill * up the gap sounds like the wrong answer. I'm not sure what I * should be doing here - if it _was_ a special file, I suspect * I simply shouldn't have been queueing multiple requests in * the first place... */ if (rr->retlen > 0 && uint64_compare(xfer->furthestdata, rr->offset) < 0) { xfer->furthestdata = rr->offset; #ifdef DEBUG_DOWNLOAD { char buf[40]; uint64_decimal(xfer->furthestdata, buf); printf("setting furthestdata = %s\n", buf); } #endif } if (rr->retlen < rr->len) { uint64 filesize = uint64_add32(rr->offset, (rr->retlen < 0 ? 0 : rr->retlen)); #ifdef DEBUG_DOWNLOAD { char buf[40]; uint64_decimal(filesize, buf); printf("short block! trying filesize = %s\n", buf); } #endif if (uint64_compare(xfer->filesize, filesize) > 0) { xfer->filesize = filesize; #ifdef DEBUG_DOWNLOAD printf("actually changing filesize\n"); #endif } } if (uint64_compare(xfer->furthestdata, xfer->filesize) > 0) { fxp_error_message = "received a short buffer from FXP_READ, but not" " at EOF"; fxp_errtype = -1; xfer_set_error(xfer); return -1; } return 1; } void xfer_set_error(struct fxp_xfer *xfer) { xfer->err = 1; } int xfer_download_data(struct fxp_xfer *xfer, void **buf, int *len) { void *retbuf = NULL; int retlen = 0; /* * Discard anything at the head of the rr queue with complete < * 0; return the first thing with complete > 0. */ while (xfer->head && xfer->head->complete && !retbuf) { struct req *rr = xfer->head; if (rr->complete > 0) { retbuf = rr->buffer; retlen = rr->retlen; #ifdef DEBUG_DOWNLOAD printf("handing back data from read request %p\n", rr); #endif } #ifdef DEBUG_DOWNLOAD else printf("skipping failed read request %p\n", rr); #endif xfer->head = xfer->head->next; if (xfer->head) xfer->head->prev = NULL; else xfer->tail = NULL; sfree(rr); xfer->nreqs--; } if (retbuf) { *buf = retbuf; *len = retlen; return 1; } else return 0; } void xfer_cleanup(struct fxp_xfer *xfer) { struct req *rr; while (xfer->head) { rr = xfer->head; xfer->head = xfer->head->next; sfree(rr->buffer); sfree(rr); } sfree(xfer); } Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cf888a7618b6265b741afb530be60b99 Text-delta-base-sha1: 746c8a9000131c438b792e5b35ed2bbcb036df48 Text-content-length: 731 Text-content-md5: db3b4d4252ef2e4fad0d9dfb769e7044 Text-content-sha1: 3210a63fb54e1e77c63acd083b2e590021037a66 Content-length: 771 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNu?@a"Store user data in an sftp_request structure. */ void *fxp_get_userdata(struct sftp_request *req); void fxp_set_userdata(struct sftp_request *req, void *data /* * A wrapper to go round fxp_read_* and fxp_write_*, which manages * the queueing of multiple read/write requests. */ struct fxp_xfer; struct fxp_xfer *xfer_download_init(struct fxp_handle *fh, uint64 offset); int xfer_download_done(struct fxp_xfer *xfer); void xfer_download_queue(struct fxp_xfer *xfer); int xfer_download_gotpkt(struct fxp_xfer *xfer, struct sftp_packet *pktin); int xfer_download_data(struct fxp_xfer *xfer, void **buf, int *len); void xfer_set_error(struct fxp_xfer *xfer); void xfer_cleanup(struct fxp_xfer *xfer); Revision-number: 3469 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:42.413785Z PROPS-END Revision-number: 3470 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2003-09-28T14:24:01.000000Z K 7 svn:log V 101 Uploads turn out to be much easier than downloads, so here's faster upload support in PSFTP as well. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d7749e0cdeb51edd62de09e725981f16 Text-delta-base-sha1: 6f5466a1a9361482c2ea8c93078a1d12ceed02c8 Text-content-length: 613 Text-content-md5: 485a53a9ed67b74caeec11673e9a0928 Text-content-sha1: 0086dfe28518be23000d7696f01aaf6bbc4b098c Content-length: 653 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNuS.)#.jabMz#dK*struct fxp_xfer *xfer, err, eofxfer = xfer_upload_init(fh, offset); err = eof = 0; while ((!err && !eof) || !xfer_done(xfer)) { char buffer[4096]; int len, ret; while (xfer_upload_ready(xfer) && !err && !eof) { len = fread(buffer, 1, sizeof(buffer), fp); if (len == -1) { printf("error while reading local file\n"); err = 1; } else if (len == 0) { eof = 1; } else { xfer_upload_data(xfer, buffer, len); } } pktin = sftp_recv(); ret = xfer_upload_gotpkt(xfer, pktinerr = 1; } } xfer_cleanup(xfer Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 873c4889ad3ec2623e48dc9c8da8c340 Text-delta-base-sha1: 7bd025a5aadfe1bad1477c9759d54c8ab1f0b4a9 Text-content-length: 2251 Text-content-md5: 4ccdf2d137d3d1d2de7e3f7ef7f02374 Text-content-sha1: db693f8f5f1130dd6c309a3fa7e0f4e1f010ff51 Content-length: 2291 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNz?~"!}((:Vi+qSD4H2req_totalsize, req_maxsizereq_totalsize = 0; xfer->req_maxsize = 16384;req_totalsize < xfer->req_maxsizereq_totalsize += rr->lenxfer->req_totalsize -= rr->len; sfree(rr); } if (retbuf) { *buf = retbuf; *len = retlen; return 1; } else return 0; } struct fxp_xfer *xfer_upload_init(struct fxp_handle *fh, uint64 offset) { struct fxp_xfer *xfer = xfer_init(fh, offset); /* * We set `eof' to 1 because this will cause xfer_done() to * return true iff there are no outstanding requests. During an * upload, our caller will be responsible for working out * whether all the data has been sent, so all it needs to know * from us is whether the outstanding requests have been * handled once that's done. */ xfer->eof = 1; return xfer; } int xfer_upload_ready(struct fxp_xfer *xfer) { if (xfer->req_totalsize < xfer->req_maxsize) return 1; else return 0; } void xfer_upload_data(struct fxp_xfer *xfer, char *buffer, int len) { struct req *rr; struct sftp_request *req; rr = snew(struct req); rr->offset = xfer->offset; rr->complete = 0; if (xfer->tail) { xfer->tail->next = rr; rr->prev = xfer->tail; } else { xfer->head = rr; rr->prev = NULL; } xfer->tail = rr; rr->next = NULL; rr->len = len; rr->buffer = NULL; sftp_register(req = fxp_write_send(xfer->fh, buffer, rr->offset, len)); fxp_set_userdata(req, rr); xfer->offset = uint64_add32(xfer->offset, rr->len); xfer->req_totalsize += rr->len; #ifdef DEBUG_UPLOAD { char buf[40]; uint64_decimal(rr->offset, buf); printf("queueing write request %p at %s [len %d]\n", rr, buf, len); } #endif } int xfer_up, *prev, *next; int retet = fxp_write_recv(pktin, rreq); #ifdef DEBUG_UPLOAD printf("write request %p has returned [%d]\n", rr, ret); #endif /* * Remove this one from the queue. */ prev = rr->prev; next = rr->next; if (prev) prev->next = next; else xfer->head = next; if (next) next->prev = prev; else xfer->tail = prev; xfer->req_totalsize -= rr->len; sfree(rr); if (!ret) return -1; return 1 Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: db3b4d4252ef2e4fad0d9dfb769e7044 Text-delta-base-sha1: 3210a63fb54e1e77c63acd083b2e590021037a66 Text-content-length: 328 Text-content-md5: d391ac1994047da612144d7288536f93 Text-content-sha1: 09bc19db93afee027fb03c0d9f9a5222e58cff69 Content-length: 368 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN?=,wC&,Whstruct fxp_xfer *xfer_upload_init(struct fxp_handle *fh, uint64 offset); int xfer_upload_ready(struct fxp_xfer *xfer); void xfer_upload_data(struct fxp_xfer *xfer, char *buffer, int len); int xfer_upload_gotpkt(struct fxp_xfer *xfer, struct sftp_packet *pktin); int xfer_done(struct fxp_xfer *xfer); Revision-number: 3471 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2003-09-29T15:39:36.000000Z K 7 svn:log V 59 Obvious memory leak in new fast download management. Oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 485a53a9ed67b74caeec11673e9a0928 Text-delta-base-sha1: 0086dfe28518be23000d7696f01aaf6bbc4b098c Text-content-length: 42 Text-content-md5: 0ec9015e9b2fa93417a0298307db510d Text-content-sha1: f330a9fe491bce1f642b216053f5ca041acfb911 Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVNSf +)* sfree(vbuf); Revision-number: 3472 Prop-content-length: 161 Content-length: 161 K 7 svn:log V 61 PSCP in SFTP mode now uses the fast download/upload manager. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-09-29T15:39:56.000000Z PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 06aa6fcbbda41a6207172a30322fc4db Text-delta-base-sha1: 15b0a488c47ffdcdd7d4e38d7f841d4854645c33 Text-content-length: 1706 Text-content-md5: 0538febd5ef4acc4efc88200066982da Text-content-sha1: 2c284eb36ff94c2db9caa74d878b96ec6d785519 Content-length: 1747 K 15 cvs2svn:cvs-rev V 5 1.111 PROPS-END SVNEVGU7t.NfK 'Rf=ja^Ovstruct fxp_xfer *scp_sftp_xfercp_sftp_xfer = xfer_upload_init(scp_sftp_filehandle, scp_sftp_fileoffset if (!scp_sftp_filehandle) { return 1; } while (!xfer_upload_ready(scp_sftp_xfer)) { pktin = sftp_recv(); ret = xfer_upload_gotpkt(scp_sftp_xfer, pktin); if (!ret) { tell_user(stderr, "error while writing: %s\n", fxp_error()); errs++; return 1; } } xfer_upload_data(scp_sftp_xfer, data, len); while (!xfer_done(scp_sftp_xfer)) { pktin = sftp_recv(); xfer_upload_gotpkt(scp_sftp_xfer, pktin); } xfer_cleanup(scp_sftp_xfer)cp_sftp_xfer = xfer_download_init(scp_sftp_filehandle, scp_sftp_fileoffsetint ret, actuallen; void *vbuf; xfer_download_queue(scp_sftp_xfer); pktin = sftp_recv(); ret = xfer_download_gotpkt(scp_sftp_xfer, pktin); if (ret < 0 if (xfer_download_data(scp_sftp_xfer, &vbuf, &actuallen)) { /* * This assertion relies on the fact that the natural * block size used in the xfer manager is at most that * used in this module. I don't like crossing layers in * this way, but it'll do for now. */ assert(actuallen <= len); memcpy(data, vbuf, actuallen); sfree(vbuf); } else/* * Ensure that xfer_done() will work correctly, so we can * clean up any outstanding requests from the file * transfer. */ xfer_set_error(scp_sftp_xfer); while (!xfer_done(scp_sftp_xfer)) { void *vbuf; int len; pktin = sftp_recv(); xfer_download_gotpkt(scp_sftp_xfer, pktin); if (xfer_download_data(scp_sftp_xfer, &vbuf, &len)) sfree(vbuf); } xfer_cleanup(scp_sftp_xfer) Revision-number: 3473 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2003-09-30T12:05:49.000000Z K 7 svn:log V 143 Note Simon's progress on this one. Change difficulty to "tricky". Change priority to "high" (since it seems we want this in the next release). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sftp-slow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4e72b748951be583d08f23ef3219bdc1 Text-delta-base-sha1: 4f2ddd99d553a5bbb502eaf1b231593a3daf54aa Text-content-length: 178 Text-content-md5: e9e68772018a5660c9352d0bc944378f Text-content-sha1: 63a3aed9944fc319790d124eb825cd5d6b4e59b9 Content-length: 217 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN0| ^qricky Priority: high

    Update: As of the 2003-09-30 snapshot, performance should be much improved, although there are tweaks still to be done. Revision-number: 3474 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2003-09-30T12:08:38.000000Z K 7 svn:log V 35 xref wishlist for planned features K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b7319debe2baff1ed03c943a4534f991 Text-delta-base-sha1: 2aa4e59fe4cee318b25863b535acc528495238b3 Text-content-length: 170 Text-content-md5: 1812a3d02a99b2139fdf949eb9894583 Text-content-sha1: c1a53e5ae54541604f44165a87a4db01c0893449 Content-length: 209 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN/C  For features planned for the next release (and already available in the development snapshots), see the wishlist page. Revision-number: 3475 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 70 Clarify text and mention the local input features we already provide. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-09-30T12:12:04.000000Z PROPS-END Node-path: putty-wishlist/data/mud-client Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ee999305a32ed15f6609e2be4c123ec3 Text-delta-base-sha1: f178b633950e5a3b5a5d0278574a12bb49238a68 Text-content-length: 206 Text-content-md5: cebeef82395389aa5b3ecf99f4a7faf8 Text-content-sha1: 824b46a37a48c8d0ad332a54be07c6eb0ff88815 Content-length: 245 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNmV1r!,lfSummary: MUD-client-like features (separate input window, etc)feature already provide some local editing features. Beyond that, we've no plans to turn PuTTY into a fully-fledged Revision-number: 3476 Prop-content-length: 183 Content-length: 183 K 7 svn:log V 83 mention transputty (by linking to links page, so that disclaimers etc are in line) K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-10-02T09:37:36.000000Z PROPS-END Node-path: putty-wishlist/data/transparency Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5cfbdb9ef35bce5270379e934ba217f3 Text-delta-base-sha1: 8676ba046a39828f0b51fdf6f68167b815306eca Text-content-length: 136 Text-content-md5: cfee3f5788ae4b614b77b6576cbc9529 Text-content-sha1: 83648e83710c223d6ec04a9ceca821e1e3e0ed9f Content-length: 175 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN) w)w

    Alternatively, on our links page is transputty, a third-party hack to PuTTY. Revision-number: 3477 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2003-10-02T20:42:50.000000Z K 7 svn:log V 13 mention 5250 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/terminal-emulations Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7329f24a2a60b1e62123202ee02701fa Text-delta-base-sha1: e298ba02eef921d86222a875b20c90528e710944 Text-content-length: 26 Text-content-md5: da4a81a6f3892f4a567f51911fac4ca9 Text-content-sha1: be8af707c58f5dac4c3a4b310b7e578f3879e67f Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNDL XnVor 525 Revision-number: 3478 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 44 Add refinement suggested by Fred Peeterman. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-10-03T08:12:36.000000Z PROPS-END Node-path: putty-wishlist/data/startup-fullscreen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 99f20fc4db4c1af0f94d6097b88af648 Text-delta-base-sha1: f0c0cd645db229a9591396ffccdca4fa36fe450d Text-content-length: 434 Text-content-md5: adb4f80f8d4818255380c81826575820 Text-content-sha1: 522ddf872f99fafc778794c3b430f12e2a142110 Content-length: 473 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNRqR

    If we're going to do this, we should perhaps also propagate maximised-ness and full-screen-ness through Duplicate Session (duplicate a currently maximised session and the next one comes up that way too). Then again, perhaps not; I'm not sure whether it's really helpful to have two full-screen PuTTYs open at once. At least one user definitely wants it to work this way for maximised windows, though. Revision-number: 3479 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2003-10-03T21:21:23.000000Z K 7 svn:log V 99 My ASN.1 decoder returned wrong IDs for anything above 0x1E! Good job it's never had to yet. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5272527cb8241892dc07dd372c4a74b0 Text-delta-base-sha1: dcd78a059ddabab83430cbc334838ba858d3be09 Text-content-length: 120 Text-content-md5: 0d90779d6d7e0ecde2affaf8bf326be1 Text-content-sha1: ce88af02c4b9ecb99b9ef80c22205ea0a128e43f Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNs _s_!sp++, sourcelen--; if (sourcelen == 0) return -1; *id = (*id << 7) | (*p & 0x7F); } Revision-number: 3480 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:42.956466Z PROPS-END Revision-number: 3481 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2003-10-06T18:09:35.000000Z K 7 svn:log V 103 Summary: Hangs on paste with middle button (Intellipoint implicated) Class: semi-bug Present-in: 0.53b K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/scroll-button-hang Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1139 Text-content-md5: 03361d430fa2131fa4dae9e87b933319 Text-content-sha1: 2afc209d49af943a56b608720cfd1cdb657e1cae Content-length: 1255 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNeeeSummary: Hangs on paste with middle button (Intellipoint implicated) Class: semi-bug Present-in: 0.53b

    I've observed the following behaviour on a colleague's machine. I can't reproduce it myself. - JTN

    PuTTY is set to paste on middle button. On this system, when the middle button is pressed, there's a chance that the Microsoft Intellipoint scroll pointer thing is activates (the pointer changes to a circle containing a dot and up/down triangles, and moving the mouse scrolls the window).

    If the middle button is pressed and released quickly, there is no deletorious effect other than the appearance of this pointer.

    However, if the middle button is held and then released part-way through a multi-line paste, the following occurs:

    • The pasting stops dead part-way through.
    • PuTTY appears to "hang" - keypresses do nothing, and the mouse pointer stays an I-beam over the title bar (normally it changes to a proper pointer).

    Alt-Tabbing away unwedges PuTTY, although the missing pasted characters never come through.

    Could be a bug in the way we deal with press/release events? Revision-number: 3482 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2003-10-07T20:54:15.000000Z K 7 svn:log V 34 http://alloscomp.sytes.net/putty/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a7e9a0692f6383c8545732ee5e037159 Text-delta-base-sha1: efb8da035de51a40014f05a589628e847f983279 Text-content-length: 106 Text-content-md5: cc14b26f7b856441b4fc257995e1cf64 Text-content-sha1: c2a59b79d29d7a9c61bb29d2e89dcdf0eba1efaf Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVNVN TQT)-li> alloscomp.sytes.net Revision-number: 3483 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2003-10-07T20:55:24.000000Z K 7 svn:log V 6 patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/term-clear-scrollback Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 58346e96a509163275470fffb8330097 Text-delta-base-sha1: 8073f87f319b7941701693610f180c3236b07bc0 Text-content-length: 103 Text-content-md5: a889336e2b255edb9202db5cf5ac60b9 Text-content-sha1: d22e46804a945021ab3ea21378818ca32f1e282b Content-length: 142 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNf<VfV

    Patch (unreviewed): 3F82D4D8.3080404@pi3.informatik.uni-mannheim.de Revision-number: 3484 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2003-10-07T20:59:29.000000Z K 7 svn:log V 68 Add speculations from "Moh" (I've had these hanging around a while) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-multi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e96ef4708ecdc1df1cd78f372ab82f37 Text-delta-base-sha1: 1df4d773fed3c67605e8045ffe3dd3ae6051fa30 Text-content-length: 610 Text-content-md5: fcc823c2efb2578bdeff0f9ae81a209f Text-content-sha1: aeeed30d8e23092cd19af1fbcf5441139c34c30d Content-length: 649 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNOOOO

    Update: It's been suggested that it could be down to the setsockopt(SO_REUSEADDR) in winnet.c:sk_newlistener(). (Not verified.) Could we remove this, or even use SO_EXCLUSIVEADDRUSE? (Although this isn't available on 95/98/Me.)
    More info: OF46EEC8F3.5421D245-ON85256D7A.00644BCA-85256D7A.00669819@tisny.com Revision-number: 3485 Prop-content-length: 322 Content-length: 322 K 8 svn:date V 27 2003-10-07T21:31:21.000000Z K 7 svn:log V 221 `baltic-default-translation': change default Baltic (CP1257) encoding from 8859-4 to 8859-13 as suggested by Vaidrius Petrauskas, on the grounds that he has a .lt address and sounds like he knows what he's talking about. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6726d25ab1e80aa7101043bfee718755 Text-delta-base-sha1: 45b44ae06b6e6ccdbc8fa5d740ec1970bb90ba03 Text-content-length: 84 Text-content-md5: f21dae9a97d003c5fcd7b3fbe0f60b64 Text-content-sha1: fb98405bb19b1593e619c19005db9c14c972d93f Content-length: 124 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNn 4_9`T13 (changed from 8859-4 on advice of a Lithuanian)13 Revision-number: 3486 Prop-content-length: 346 Content-length: 346 K 8 svn:date V 27 2003-10-07T21:32:50.000000Z K 7 svn:log V 245 Summary: Change default charset for Baltic Windows from Latin-4 to Latin-7 Fixed-in: 2003-10-08 (This is mostly here to document the rationale for the change, in case it upsets anyone. Message-Id: <1059082875.7112.19.camel@plutonas.mif.vu.lt>) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/baltic-default-translation Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 815 Text-content-md5: b9dfc97705d9f370278f2834f603a47c Text-content-sha1: 53c2a02cd39cdfb118a02664a8e741f5177e9751 Content-length: 931 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN!!!Summary: Change default charset for Baltic Windows from Latin-4 to Latin-7 Class: wish Difficulty: fun Priority: low Fixed-in: 2003-10-08

    From a correspondent in .lt (2003 Jul 25):

    Default codepage for Baltic languages (Lithuanian, Latvian and Estonian) should be ISO 8859-13 (Latin-7) instead of current PuTTY's default ISO 8859-4 (Latin-4). ISO 8859-4 is deprecated, and Windows Baltic codepage (CP1257) is basically ISO 8859-13 with several control symbols.

    ISO 8859-13 is the standard codepage in Latvia and Lithuania. I think ISO 8859-15 is standard in Estonia, but this codepage was standartized only recently, and in Windows, CP1257 is still Estonia's default.

    Since we don't know any better, this change is implemented as of 2003-10-08. Revision-number: 3487 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2003-10-08T15:08:57.000000Z K 7 svn:log V 13 content-type K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/baltic-default-translation Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b9dfc97705d9f370278f2834f603a47c Text-delta-base-sha1: 53c2a02cd39cdfb118a02664a8e741f5177e9751 Text-content-length: 51 Text-content-md5: 5461dff6afff17e4dbfc8954e4b80a1b Text-content-sha1: 8be811b0724b344a137fb3df849d641b3fed000e Content-length: 90 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN!@   Content-type: text/x-html-body Node-path: putty-wishlist/data/scroll-button-hang Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 03361d430fa2131fa4dae9e87b933319 Text-delta-base-sha1: 2afc209d49af943a56b608720cfd1cdb657e1cae Text-content-length: 49 Text-content-md5: 14ede6bfaabdeda51ef16ed0a09facb9 Text-content-sha1: 44c1680b967a2899291843d3d0e002990a7505cc Content-length: 88 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNegfContent-type: text/x-html-body Revision-number: 3488 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2003-10-08T20:09:55.000000Z K 7 svn:log V 37 Cosmetic, to fix ssh2-des-cbc-is-std K 10 svn:author V 4 owen PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 72cbfdfbb95d25f28b5facf318c7e434 Text-delta-base-sha1: 21818c9da50a8783778ee4e6249bdc5ef760730c Text-content-length: 31 Text-content-md5: 47870c96537c7c595ed1f79ec1da7c51 Text-content-sha1: df0d46ef58a07715f66bbd3535dcd5211755e005 Content-length: 71 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN_Y 7Clegacy Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 234d5213c55555a214f01505b1492275 Text-delta-base-sha1: 5191dd248dc2c46f825a05d40823e4f25da94225 Text-content-length: 293 Text-content-md5: 15420bf81f8e48d93b2c16a41ba593c5 Text-content-sha1: 7bad686a43bbe315b63f800f47d22504b5133d39 Content-length: 333 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVNf;M\%\versionid $Id: config.but,v 1.70 2003/10/08 20:09:55 owenrecommended in the SSH 2 draft protocol standards, but one or two server implementations do support it. PuTTY can use single-DES to interoperate with these servers if you enable the \q{Enable legacy use of Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 702b85666e48847b8e386563c2507356 Text-delta-base-sha1: 3490f38e8e835d8c3fa918d83173f18c875e6f8b Text-content-length: 300 Text-content-md5: bcec91b1aeca31f4df2e6174fb5f720f Text-content-sha1: 82bfd24b44da84f2e7ac1cf618e7e1932833638f Content-length: 340 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNo"des-cbc" is marked as HISTORIC in * draft-ietf-secsh-assignednumbers-04.txt, referring to * FIPS-46-3. ("Single DES (i.e., DES) will be permitted * for legacy systems only.") , but ssh.com support it and * apparently aren't the only people to do so, so we sigh * Revision-number: 3489 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 23 non-standard -> legacy K 10 svn:author V 4 owen K 8 svn:date V 27 2003-10-08T20:13:29.000000Z PROPS-END Node-path: putty-wishlist/data/ssh2-des-cbc-is-std Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0d55ea27ef92885a9abbcc5c61b7f4d1 Text-delta-base-sha1: 81d121da67355b24580ac111d17ad0fbd55801e5 Text-content-length: 118 Text-content-md5: ae0be7c050b50ec76ae760d0810f2201 Text-content-sha1: 25b4a10609a9dd64a52cbd4a57cdd6ecd88b2298 Content-length: 157 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNdD _dKFixed-in: 2003-10-09

    OSD: toned down "non-standard" to "legacy", which I claim fixes this. Revision-number: 3490 Prop-content-length: 128 Content-length: 128 K 7 svn:log V 28 missed a bit in last commit K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-10-08T21:39:54.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 15420bf81f8e48d93b2c16a41ba593c5 Text-delta-base-sha1: 7bad686a43bbe315b63f800f47d22504b5133d39 Text-content-length: 105 Text-content-md5: d479271f40ebc05a729f04b0e2c72f39 Text-content-sha1: 79fa04b5173b2c10e8061e6a8e2a01da723e6889 Content-length: 145 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVNfnN":~h\versionid $Id: config.but,v 1.71 2003/10/08 21:39:54 jacobrecommended ciphers Revision-number: 3491 Prop-content-length: 466 Content-length: 466 K 7 svn:log V 365 We're getting quite a list of already-fixed bugs and wishes now, and most of them are tiddling little things. Attempt to highlight the "important features" (i.e. those that might end up in the change log) in the already-fixed bugs by selecting on the "difficulty" field and moving non-fun, classified bugs to the head of the list and emphasising them. Kinda works. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-10-08T22:40:44.000000Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0c2dfdd66f46f290e317e9b761af397c Text-delta-base-sha1: e594159f8f9e7789c4ad6733eeb89a69e1ed2873 Text-content-length: 421 Text-content-md5: e54650e57d661d5fc38a7bb60ec3b36f Text-content-sha1: e43166efcc994b4dccb557e2e81acd18210bdc35 Content-length: 461 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN8<=@s}*Nj#! /usr/bin/perl # $Id: bugs2html,v 1.26 2003/10/08 22:40:44_diff_ordered_diff_orderedprintbugs_diff_ordered { my ($buglist) = @_; my @tmp = @$buglist; my @hardbugs = grep((defined($bugs{$_}->{difficulty}) && $bugs{$_}->{difficulty} ne "fun"), @tmp); subtractbugs(\@tmp, printbugs(\@hardbugs, 1)); printbugs(\@tmp); return $buglist; } Revision-number: 3492 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2003-10-08T22:45:58.000000Z K 7 svn:log V 124 Remove a few bugs that have been fixed and were never in any release, in an attempt to reduce clutter on the wishlist page. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/double-alt-keystrokes Node-action: delete Node-path: putty-wishlist/data/double-keystrokes Node-action: delete Node-path: putty-wishlist/data/pubkey-crash Node-action: delete Revision-number: 3493 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2003-10-09T10:58:55.000000Z K 7 svn:log V 24 We have psftp and pscp. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 858fd7929f4d6d5dd20c0e1d34013401 Text-delta-base-sha1: 118ec1a94e18365cf93e5dfc2ff38b0c71b342be Text-content-length: 93 Text-content-md5: 4af9db07ed34d33dd73467980c1cee93 Text-content-sha1: 654d2bf0183e81e52080bcd0f42cb1bb5051bb73 Content-length: 132 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN$2 HHhpsftp and pscp are also now available Revision-number: 3494 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2003-10-09T21:51:32.000000Z K 7 svn:log V 76 Fix algo for SSH-1. (I've had this lying round for ages) Misc other tweaks. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pubkeyfile-and-pageant Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9207b0e8a33de423cc96b12574972999 Text-delta-base-sha1: a59191ccae332ad8bd23a72980b755d943bc2d7f Text-content-length: 645 Text-content-md5: 69ddba7b6c5201fb2a1ef265f490c1f8 Text-content-sha1: dc84de4381759ae49a58fc9428b598ac9c96b87d Content-length: 684 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNR$'RZ* 0B;,Fa})!O>Summary: Pageant + explicit keyfile givesssection 10.5 in the manual.

    Here is my (JTN) suggested algorithm for fixing the immediate problembool success if (k.id in pageant_ids[]) { success = do_pageant_auth (k.id) } else { success = do_putty_auth (k) } if (success) goto auth_success(In SSH-1, you can't test whether a server would accept a key without actually trying it, but that's not terribly important.)ly disabled; this ties nicely into auth-pref.

    Revision-number: 3495 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2003-10-10T12:33:34.000000Z K 7 svn:log V 43 Priority: high Note about choice of fixes. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ppk-empty-comment Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5c14547bfdc6db107a837ad4ca034e3d Text-delta-base-sha1: c00bded84ac51070c3fac018c2a9b86c346a68c8 Text-content-length: 183 Text-content-md5: 1ad619a488044f23c59c26aa345d0784 Text-content-sha1: 891d2fb6523cab4318f3084e0998b8e86d9ce2cb Content-length: 222 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNKe RsXhigh

    JTN: After discussion, we can't remember why that assertion is there. My vote's on removing it and making from_backend() cope with zero-length writes. Revision-number: 3496 Prop-content-length: 599 Content-length: 599 K 7 svn:log V 498 In SOCKS5 dynamic forwarding, we were echoing back DST.{ADDR,PORT} as BND.{ADDR,PORT}. Besides being clearly wrong, correspondence with Sascha Schwarz suggests that this can confuse some SOCKS5 clients (Aventail and sockscap32) which seem to assume that the reply must have ATYP=1 (IPv4 literal) and so get the length wrong. Now all replies have ATYP=1 with BND.{ADDR,PORT} = 0.0.0.0:0 -- this apparently follows practice in OpenSSH. (We don't have enough info to fill these fields in correctly.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-10-10T21:20:01.000000Z PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b23c75ef4ba1a960d17c55b3b53aaf04 Text-delta-base-sha1: 494a5b39a36a5665240c278f6ee2cfbd270a07cc Text-content-length: 934 Text-content-md5: de133104db8fa74038708b368efa3e66 Text-content-sha1: 7f2379e12d0589058a99b5c4e9fac3ae6c44a804 Content-length: 974 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNL-/kJUG}0_EDotD:3NG/* Request too long. *//* * We're receiving a SOCKS request. */ unsigned char reply[10]; /* SOCKS5 atyp=1 reply */ int atype, alen = 0; /* * Pre-fill reply packet. * In all cases, we set BND.{HOST,ADDR} to 0.0.0.0:0 * (atyp=1) in the reply; if we succeed, we don't know * the right answers, and if we fail, they should be * ignored. */ memset(reply, 0, lenof(reply)); reply[0] = 5; /* VER */ reply[3] = 1; /* ATYP = 1 (IPv4, 0.0.0.0:0) */ /* Not CONNECT or reserved field nonzero - error */ reply[1] = 1; /* generic failure */ sk_write(pr->s, reply, lenof(reply)/* REP=0 (success) already */ sk_write(pr->s, reply, lenof(reply)/* REP=0 (success) already */ sk_write(pr->s, reply, lenof(reply)reply[1] = 8; /* atype not supported */ sk_write(pr->s, reply, lenof(reply) Revision-number: 3497 Prop-content-length: 278 Content-length: 278 K 8 svn:date V 27 2003-10-10T22:58:53.000000Z K 7 svn:log V 177 Add random commentary to SOCKS code. Also fix what I think are a couple of very minor bugs in SOCKS4; one won't affect anyone AFAIK, and the other is unlikely to cause trouble. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: de133104db8fa74038708b368efa3e66 Text-delta-base-sha1: 7f2379e12d0589058a99b5c4e9fac3ae6c44a804 Text-content-length: 361 Text-content-md5: 9481a38e1dd80e2821cd7746052a90fc Text-content-sha1: 5126892516aaa11a8e3ffb3e3223df54f54e8df3 Content-length: 401 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN-g&7! #a./* * Throughout SOCKS negotiation, "hostname" is re-used as a * random protocol buffer with "port" storing the length. */ Not CONNECT. */= 8) continue; /* haven't started user/hostname */ if (pr->hostname[pr->port-1] != 0) continue; /* haven't _finished_ user/host - 8"hostname" Revision-number: 3498 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2003-10-11T18:04:48.000000Z K 7 svn:log V 43 Document the xterm CSI 3 J sequence a bit. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/term-clear-scrollback Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a889336e2b255edb9202db5cf5ac60b9 Text-delta-base-sha1: d22e46804a945021ab3ea21378818ca32f1e282b Text-content-length: 217 Text-content-md5: f8b18f1c81abcd9f85f06a4f2ceeae25 Text-content-sha1: f8ac704d197b76f67326d66cbe87e80bc1207b64 Content-length: 256 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN<~ AiATh

    • For avoidance of doubt, this sequence only clears the scrollback in xterm - it doesn't have any other effect. (xterm "XFree86 4.1.0(165)" in Debian xterm_4.1.0-16woody1)
    Revision-number: 3499 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2003-10-11T18:20:45.000000Z K 7 svn:log V 27 More useful documentation. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/term-clear-scrollback Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f8b18f1c81abcd9f85f06a4f2ceeae25 Text-delta-base-sha1: f8ac704d197b76f67326d66cbe87e80bc1207b64 Text-content-length: 377 Text-content-md5: 3b1c5a2cfbfdb1f2adf23353aea7b01b Text-content-sha1: 38a102e0a406f9d57c943093f6ba8f4d6a8b8488 Content-length: 416 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN~&Yi _Q[#Recent versions of xterm use an extension to ED to do this, in the form of CSI 3 J. We could do (It was added to Thomas Dickey's xterm in patch 107; it is documented in ctlseqs.ms as "Erase Saved Lines (xterm)". Revision-number: 3500 Prop-content-length: 599 Content-length: 599 K 8 svn:date V 27 2003-10-12T13:16:39.000000Z K 7 svn:log V 498 Remove all the "assert(len>0)" which forbade zero-length writes across the from_backend() interface, after having made all implementations safe against being called with len==0 and possibly-NULL/undefined "data". (This includes making misc.c:bufchain_add() more robust in this area.) Assertion was originally added 2002-03-01; e.g., see plink.c:1.53 [r1571]. I believe this now shouldn't break anything. This should hopefully make `ppk-empty-comment' finally GO AWAY. (Tested with Unix PuTTY.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 60cdb9e23f5bbfc916f5d46a423b9f5f Text-delta-base-sha1: 7c14d8998f87f548fd5d478834209cd603451538 Text-content-length: 41 Text-content-md5: 76872d6932ec261ad074bc23fc269469 Text-content-sha1: 355f5c1a6e027ec5ef2225a95887d663332a3dae Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNC^ 3,if (len == 0) return Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3e5b6cdc4dcff64c9e2ccdd4a401ca1 Text-delta-base-sha1: 45d0bc9339f18e7d35d4e5d09b92c4eca08e8e60 Text-content-length: 23 Text-content-md5: 21db06622351615cf9d4f25b6d60b102 Text-content-sha1: 89f8d6ef17ffc8c4e191d8d3780cbe3d03ac1b6a Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVN/ ?ZU Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0ec9015e9b2fa93417a0298307db510d Text-delta-base-sha1: f330a9fe491bce1f642b216053f5ca041acfb911 Text-content-length: 80 Text-content-md5: 064ed864f18e0449c5ee638fc5a996e1 Text-content-sha1: 8a482b534b3968eff4a41208d2f1fd5543dee71e Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVNfq+DrZ#Lmyif (len > 0) (outlen > 0) && (len > 0) Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0538febd5ef4acc4efc88200066982da Text-delta-base-sha1: 2c284eb36ff94c2db9caa74d878b96ec6d785519 Text-content-length: 77 Text-content-md5: 27e68f4c5bff6dd58a26f32f61974480 Text-content-sha1: 2af8b97fea074880343e1a1b5a7bb421b3d3c69f Content-length: 118 K 15 cvs2svn:cvs-rev V 5 1.112 PROPS-END SVNVa+8rN#@imif (len > 0) (outlen > 0) && (len > 0) Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9f4f19c213af6c48e8d40c2f5f242a28 Text-delta-base-sha1: 2fae9c9e3b7fb506eaea00404cd9bb9090af7e3b Text-content-length: 40 Text-content-md5: 26910d035e2d042e69bd959bee37c006 Text-content-sha1: 07866a47c25b31c903061091b9609a7d25223db4 Content-length: 81 K 15 cvs2svn:cvs-rev V 5 1.162 PROPS-END SVNl (D> Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cea6962dd3f57536455ccc6c824498e1 Text-delta-base-sha1: c7624204a953aaf6dbeb9b4ff640d70f102718cd Text-content-length: 22 Text-content-md5: 3b477c0f96bdc517b8d4b4c25d6da9dd Text-content-sha1: b1e9175fe2f3bd0682f05c93ca285199eafb1ac1 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNwa K, Revision-number: 3501 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2003-10-12T13:18:41.000000Z K 7 svn:log V 36 Should be fix now (well, tomorrow). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ppk-empty-comment Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1ad619a488044f23c59c26aa345d0784 Text-delta-base-sha1: 891d2fb6523cab4318f3084e0998b8e86d9ce2cb Text-content-length: 217 Text-content-md5: f0a5638d0852d9e65e1eb63513c74484 Text-content-sha1: e39af9677ec2a72ba20bec727ddc2f76ea5a323e Content-length: 256 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNe;.H'Fixed-in: 2003-10-13Update: I've added robustness improvements to everything lurking behind from_backend(), and removed the assertions, so this should be fixed now. Revision-number: 3502 Prop-content-length: 683 Content-length: 683 K 8 svn:date V 27 2003-10-12T13:46:12.000000Z K 7 svn:log V 582 The WinSock library is now loaded at run-time, which means we can attempt to load WS2 and then fall back to WS1 if that fails. This should allow us to use WS2-specific functionality to find out the local system's list of IP addresses, thus fixing winnet-if2lo, while degrading gracefully back to the previous behaviour if that functionality is unavailable. (I haven't yet actually done this; I've just laid the groundwork.) This checkin _may_ cause instability; it seemed fine to me on initial testing, but it's a bit of an upheaval and I wouldn't like to make bets on it just yet. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 09f2d012cb7f1e3421904baa99914e65 Text-delta-base-sha1: 2d51aa739609e4f26dc507e2d85247e227803399 Text-content-length: 203 Text-content-md5: a05ae5d5b8e044602cdb4f008cb7b76c Text-content-sha1: c5717bc8d7fd58c21681b2cddc909cb49ade469c Content-length: 243 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVN(H LpU(@\?`N}\L puttytel : [G] GUITERM NONSSH be_nossh WINMISC win_res.res LIBS pscp : [C] scp winsftp console WINSSH be_none SFTP wildcard WINMISC + scp.res LIBS Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c673f6d5d411d29efa91b0a72d1621c1 Text-delta-base-sha1: 60b800563406058af0fef9073273663f1c28d471 Text-content-length: 24 Text-content-md5: 50268577e83e20cf477b0bccf2580afa Text-content-sha1: 352cdb334e3b87d95f5e854fcc9097305e9d3571 Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN/ nz5 Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 159cb230f1265783e10c76435f801186 Text-delta-base-sha1: 1473b7d1a24e47be37425e006f33041acf2e39db Text-content-length: 18 Text-content-md5: 957e73167c170184cf9a23db22dbf16e Text-content-sha1: 00657bb4a0d51a84e16e8ac2b03bac45f3a16e76 Content-length: 58 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNdO\sq Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 17da666ed3641c2cd780344863bc4693 Text-delta-base-sha1: bfbf45b9fbd907d8f7b27936e379c699cbbb9ee4 Text-content-length: 123 Text-content-md5: 5638a6cd879ae3dad041ccce05499e4d Text-content-sha1: c4fb8ee8cfcc19f41cc0b036f3ff98444ee02e41 Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVNuK b.w;:/* * Pageant: the PuTTY Authentication Agent. */ #ifndef NO_SECURITY #include #endif Node-path: putty/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c2ad17d229e59fde114ee2d58628c94f Text-delta-base-sha1: 6a5f4456005e98fabe1d682abbe332ba6ccf27a0 Text-content-length: 47 Text-content-md5: 6116bbc30b0e6fdd81be3acc4932cce4 Text-content-sha1: 80813f505350440588b495b0bf2a8524ea9e5d59 Content-length: 86 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNfQ24/* * Pageant client code. */ Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 21db06622351615cf9d4f25b6d60b102 Text-delta-base-sha1: 89f8d6ef17ffc8c4e191d8d3780cbe3d03ac1b6a Text-content-length: 343 Text-content-md5: fba8b26e31a3d852cba87ce37a87d14a Text-content-sha1: 28246bc68f5f0fe99482b7780cd0b783ef4d0929 Content-length: 383 K 15 cvs2svn:cvs-rev V 4 1.80 PROPS-END SVN== EE Kc^@F0Fe8`"#-oj$)=IPp_WSAEventSelect(skt, netevent, events) == SOCKET_ERROR) { switch (p_Eventsk_init(); if (p_WSAEventSelect == NULL) { fprintf(stderr, "Plink requires WinSock 2\n"); return 1; }p_cleanup_exit(exitcode); return 0; /* placate compiler warning */ } Node-path: putty/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6e0b2c24e1abe0fbe8a08884ad20cf47 Text-delta-base-sha1: 6a751d2bdf1ab2cb88e28f72fdcb263af99c82b6 Text-content-length: 72 Text-content-md5: d4ff272da009f95f86cb43fa771c3dfa Text-content-sha1: b3fb4ea94d66e2ac2dd6aac3253d2aee26a3d3e1 Content-length: 111 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNn86c/* * Printing interface for PuTTY. */ #include "putty Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dad61fe745a1195078cfd2c326a9b29a Text-delta-base-sha1: b5b6d0e674e53067e41426fb5c94554477a27d37 Text-content-length: 88 Text-content-md5: 7b31ca3e1a3ace6d72245cde92142515 Text-content-sha1: 15a86d713bccc7a130b248355cbd958b6c0e7788 Content-length: 128 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN v @yU=c/* * PuTTY key generation front end. */ #include Node-path: putty/puttyps.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f3e1fd6bd5d5ec53744631e1406a9cd7 Text-delta-base-sha1: 0c2938309ecbde148eb7e153a0b9733533b5fde0 Text-content-length: 17 Text-content-md5: 7733521efb0e0761561d051ab1694808 Text-content-sha1: ad1848981b1faefa0df889aa9563692dd5c4e5c0 Content-length: 56 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNH3Kh` Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6a44b0c80cc0fd2077025721e96bc90c Text-delta-base-sha1: 40090049578678a87fc4a9f4bfe2104d4e721928 Text-content-length: 91 Text-content-md5: c86af30d03fa765946a7ffd0642d31dd Text-content-sha1: 78a680fb4fafb9303325e4fc267e4d990401cf79 Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNZ/JJeu#include #include #include #include "putty Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f21dae9a97d003c5fcd7b3fbe0f60b64 Text-delta-base-sha1: fb98405bb19b1593e619c19005db9c14c972d93f Text-content-length: 18 Text-content-md5: 9043a4d0ff99b27a9d4b62fc9c9a8db5 Text-content-sha1: 2ac4ed5c2c360d6290e70e3710115910b3460806 Content-length: 58 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN tt, Node-path: putty/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d4b370dbdf24912fbb3533ee4bbd33c6 Text-delta-base-sha1: 11c6d197b63579c5d4916a7b627d1567e11207ba Text-content-length: 18 Text-content-md5: 78274e62ddb74c264d237a425d1f8c22 Text-content-sha1: 77f43d3892858d5e67c401555b6ddf223397a24a Content-length: 57 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN{^t Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7423a60f9057838763a490e2cf69f744 Text-delta-base-sha1: 137321138b9bdc44f717051505cfa1a27dd265bb Text-content-length: 134 Text-content-md5: 9abdc74707397d204b1387a6cabc1d01 Text-content-sha1: 8cb5925d61d73bdc7344576e5b4dea6be9dc98b5 Content-length: 174 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVND m-mi[assert.h> #include #include "putty.h" #include "misc.h" #include "dialog.h" #include Node-path: putty/windefs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3b3af360067191daeec246e7cc3009ef Text-delta-base-sha1: af40ce6f41637f5f67f077047831a8aca352de3b Text-content-length: 52 Text-content-md5: c56fe4aa6038a0a2d00634883c7dc966 Text-content-sha1: cf563519f86db9ed4ebfe7e9c1016e80b4f19f21 Content-length: 91 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN~< NN0"putty.h" #include Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: add38eed49c4e5f907541dca68653d90 Text-delta-base-sha1: 4303071e3d4c55aac02ca2cb7594846b2937a606 Text-content-length: 157 Text-content-md5: 4e0378f380a11723b8c2ef818f336cd4 Text-content-sha1: 28a3932cf75813221407eac8ac7fbc6b2bc88514 Content-length: 198 K 15 cvs2svn:cvs-rev V 5 1.215 PROPS-END SVNr @p,putty.h" #include "ssh.h" #include "win_res.h" #include "storage.h" #include "dialog.h" #include #include Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3d3f58b14b454739bd98da244d250c41 Text-delta-base-sha1: be1e5776c8b6d7c1fad200af7d5c2afbed8b43eb Text-content-length: 1174 Text-content-md5: 1f8b45bf5a3d5f7cf65540e46a126252 Text-content-sha1: b81c4f354ace9d552f656a0e4b7160787a82b373 Content-length: 1215 K 15 cvs2svn:cvs-rev V 5 1.252 PROPS-END SVNP'T<xNHE`s~Eydhu[xmnKroaGm.storage.h" #include "win_res.h"imm.h> #include #include #include cleanup_exit(0)cleanup_exit(0)cleanup_exit(0)cleanup_exit(1)cleanup_exit(1)p_WSAAsyncSelect(skt, hwnd, msg, events) == SOCKET_ERROR) { switch (p_); } else { char cbuf[2]; cbuf[0] = '\033'; cbuf[1] = ch; term_seen_key_event(term); lpage_send(ldisc, kbd_codepage, cbuf+!left_alt, 1+!!left_alt, 1); } } show_mouseptr(0); } /* This is so the ALT-Numpad and dead keys work correctly. */ keys[0] = 0; return p - output; } /* If we're definitly not building up an ALT-54321 then clear it */ if (!left_alt) keys[0] = 0; /* If we will be using alt_sum fix the 256s */ else if (keys[0] && (in_utf(term) || ucsdata.dbcs_screenfont)) keys[0] = 10; } /* * ALT alone may or may not want to bring up the System menu. * If it's not meant to, we return 0 on presses or releases of * ALT, to show that we've swallowed the keystroke. Otherwise * we return -1, which means WiR$$. Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cd8ceed273944212d2341b38d00e6aa4 Text-delta-base-sha1: 6798e663b2245ea03e08f26e77f4a3ad88faf17f Text-content-length: 64 Text-content-md5: b742df712ba82ed7e0c15e50a69769d8 Text-content-sha1: e3b1680e30160ed79014c1cc237051489c2d61b6 Content-length: 104 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN8 ,Gstdio.h> #include #include "putty Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 87a3b59b473485d2313f5e7fa68fbaea Text-delta-base-sha1: 3ef096ae9764fd2e3d60a563bbcb3b6b2cabc0cc Text-content-length: 5511 Text-content-md5: 990620b557aa668b07b90e11a7ef2ebd Text-content-sha1: 38472188e744c3d3ff47c74a371893f508308779 Content-length: 5551 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNH#3Evyc7{0]h(9YU./CkN!Ovx&fanx!tZuW6fVk(o;%QRvXH\vxn`pb6fvXo(7^_h=y%tX.f&B:A9`$f;W2\ )ifdef IPV6 #include #include #endif #define ipv4_is_loopback(addr) \ ((p_#define NOTHING #define DECL_WINSOCK_FUNCTION(linkage, rettype, name, params) \ typedef rettype (WINAPI *t_##name) params; \ linkage t_##name p_##name #define GET_WINSOCK_FUNCTION(name) \ p_##name = (t_##name) GetProcAddress(winsock_module, #name) DECL_WINSOCK_FUNCTION(NOTHING, int, WSAAsyncSelect, (SOCKET, HWND, u_int, long)); DECL_WINSOCK_FUNCTION(NOTHING, int, WSAEventSelect, (SOCKET, WSAEVENT, long)); DECL_WINSOCK_FUNCTION(NOTHING, int, select, (int, fd_set FAR *, fd_set FAR *, fd_set FAR *, const struct timeval FAR *)); DECL_WINSOCK_FUNCTION(NOTHING, int, WSAGetLastError, (void)); DECL_WINSOCK_FUNCTION(NOTHING, int, WSAEnumNetworkEvents, (SOCKET, WSAEVENT, LPWSANETWORKEVENTS)); DECL_WINSOCK_FUNCTION(static, int, WSAStartup, (WORD, LPWSADATA)); DECL_WINSOCK_FUNCTION(static, int, WSACleanup, (void)); DECL_WINSOCK_FUNCTION(static, int, closesocket, (SOCKET)); DECL_WINSOCK_FUNCTION(static, u_long, ntohl, (u_long)); DECL_WINSOCK_FUNCTION(static, u_long, htonl, (u_long)); DECL_WINSOCK_FUNCTION(static, u_short, htons, (u_short)); DECL_WINSOCK_FUNCTION(static, u_short, ntohs, (u_short)); DECL_WINSOCK_FUNCTION(static, struct hostent FAR *, gethostbyname, (const char FAR *)); DECL_WINSOCK_FUNCTION(static, struct servent FAR *, getservbyname, (const char FAR *, const char FAR *)); DECL_WINSOCK_FUNCTION(static, unsigned long, inet_addr, (const char FAR *)); DECL_WINSOCK_FUNCTION(static, char FAR *, inet_ntoa, (struct in_addr)); DECL_WINSOCK_FUNCTION(static, int, connect, (SOCKET, const struct sockaddr FAR *, int)); DECL_WINSOCK_FUNCTION(static, int, bind, (SOCKET, const struct sockaddr FAR *, int)); DECL_WINSOCK_FUNCTION(static, int, setsockopt, (SOCKET, int, int, const char FAR *, int)); DECL_WINSOCK_FUNCTION(static, SOCKET, socket, (int, int, int)); DECL_WINSOCK_FUNCTION(static, int, listen, (SOCKET, int)); DECL_WINSOCK_FUNCTION(static, int, send, (SOCKET, const char FAR *, int, int)); DECL_WINSOCK_FUNCTION(static, int, ioctlsocket, (SOCKET, long, u_long FAR *)); DECL_WINSOCK_FUNCTION(static, SOCKET, accept, (SOCKET, struct sockaddr FAR *, int FAR *)); DECL_WINSOCK_FUNCTION(static, int, recv, (SOCKET, char FAR *, int, int)); static HMODULE winsock_module; void sk_init(void) { WORD winsock_ver; WSADATA wsadata; winsock_ver = MAKEWORD(2, 0); winsock_module = LoadLibrary("WS2_32.DLL"); if (!winsock_module) { winsock_module = LoadLibrary("WSOCK32.DLL"); winsock_ver = MAKEWORD(1, 1); } if (!winsock_module) fatalbox("Unable to load any WinSock library"); GET_WINSOCK_FUNCTION(WSAAsyncSelect); GET_WINSOCK_FUNCTION(WSAEventSelect); GET_WINSOCK_FUNCTION(select); GET_WINSOCK_FUNCTION(WSAGetLastError); GET_WINSOCK_FUNCTION(WSAEnumNetworkEvents); GET_WINSOCK_FUNCTION(WSAStartup); GET_WINSOCK_FUNCTION(WSACleanup); GET_WINSOCK_FUNCTION(closesocket); GET_WINSOCK_FUNCTION(ntohl); GET_WINSOCK_FUNCTION(htonl); GET_WINSOCK_FUNCTION(htons); GET_WINSOCK_FUNCTION(ntohs); GET_WINSOCK_FUNCTION(gethostbyname); GET_WINSOCK_FUNCTION(getservbyname); GET_WINSOCK_FUNCTION(inet_addr); GET_WINSOCK_FUNCTION(inet_ntoa); GET_WINSOCK_FUNCTION(connect); GET_WINSOCK_FUNCTION(bind); GET_WINSOCK_FUNCTION(setsockopt); GET_WINSOCK_FUNCTION(socket); GET_WINSOCK_FUNCTION(listen); GET_WINSOCK_FUNCTION(send); GET_WINSOCK_FUNCTION(ioctlsocket); GET_WINSOCK_FUNCTION(accept); GET_WINSOCK_FUNCTION(recv); if (p_WSAStartup(winsock_ver, &wsadata)) { fatalbox("Unable to initialise WinSock"); } if (LOBYTE(wsadata.wVersion) != LOBYTE(winsock_ver)) { p_WSACleanup(); fatalbox("WinSock version is incompatible with %d.%d", LOBYTE(winsock_ver), HIBYTE(winsock_ver)); } p_closesocket(s->s); } } p_WSACleanup(); if (winsock_module) FreeLibrary(winsock_module);p_p_p_p_p_htonl(addr->address); strncpy(buf, p_p_p_p_p_socket(addr->family, SOCK_STREAM, 0); ret->s = s; if (s == INVALID_SOCKET) { err = p_oobinline; if (oobinline) { BOOL b = TRUE; p_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (void *) &b, sizeof(b)); } if (nodelay) { BOOL b = TRUE; p_p_p_htonl(INADDR_ANY); a.sin_port = p_htons(localport); } #ifdef IPV6 retcode = p_p_p_p_p_htonl(addr->address); a.sin_port = p_p_p_p_p_socket(AF_INET, SOCK_STREAM, 0); ret->s = s; if (s == INVALID_SOCKET) { err = p_p_p_p_p_htonl(INADDR_LOOPBACK); else a.sin_addr.s_addr = p_htonl(INADDR_ANY); } a.sin_port = p_htons((short)port); } #ifdef IPV6 retcode = p_p_p_WSAGetLastError(); if (p_listen(s, SOMAXCONN) == SOCKET_ERROR) { p_p_p_p_p_p_recv(s->s, buf, sizeof(buf), 0); noise_ultralight(ret); if (ret < 0) { err = p_p_p_p_recv(s->s, buf, sizeof(buf), 0); if (ret < 0) { err = p_p_accept(s->s,(struct sockaddr *)&isa,&addrlen); if (t == INVALID_SOCKET) { err = p_p_closesocket(t);p_closesocket(t);p_p_getservbyname(service, NULL); if (se != NULL) return p_ Node-path: putty/winsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 52bee7ceeedfb12515e8d6f60af3773a Text-delta-base-sha1: ecabd2ef9cec9a2b91c6fd2de8696e160353f258 Text-content-length: 120 Text-content-md5: 442674da8cd6da49d6df2c1baf7143b8 Text-content-sha1: 9373ebc4e5d058f96502c761a12beca1ea3a2054 Content-length: 159 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNx%TMC.ydD]"putty.h" #include "psftp.h" /* p_ret = psftp_main(argc, argv); return ret; } Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e555e7e4441efc5c1bc54dc8785f1486 Text-delta-base-sha1: 531a05a0f9d2a6ffd9098466b911168953baf14d Text-content-length: 19 Text-content-md5: d7ec26487aa7be1580a44eb3a5701e26 Text-content-sha1: cdd947b9b47a16cf6f9973e1cef8a28b5f23aa52 Content-length: 59 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN2k2 Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cab4fd031ec6fe34ebffc078617ae75f Text-delta-base-sha1: 8865d7b9b8ef7f16a2aa762d65b045f07b7a4498 Text-content-length: 820 Text-content-md5: ec449f614db330ae182c5b31d6fdb0c8 Text-content-sha1: dea0516ecff575e46ac55a1888c2b037484892ce Content-length: 860 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNKmqDenSKfndef AUTO_WINSOCK #include #endif #include winnet.c dynamically loads WinSock 2 or WinSock 1 depending on * what it can get, which means any WinSock routines used outside * that module must be exported from it as function pointers. So * here they are. */ extern int (WINAPI *p_WSAAsyncSelect) (SOCKET s, HWND hWnd, u_int wMsg, long lEvent); extern int (WINAPI *p_WSAEventSelect) (SOCKET s, WSAEVENT hEventObject, long lNetworkEvents); extern int (WINAPI *p_select) (int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR *exceptfds, const struct timeval FAR * timeout); extern int (WINAPI *p_WSAGetLastError)(void); extern int (WINAPI *p_WSAEnumNetworkEvents) (SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents); Revision-number: 3503 Prop-content-length: 304 Content-length: 304 K 8 svn:date V 27 2003-10-12T14:12:54.000000Z K 7 svn:log V 203 Actually fix winnet-if2lo, I think. Tested in an ad-hoc manner by deliberately making a connection from nemesis's real IP address to its loopback address; not tested in the original failing case of SMB. K 10 svn:author V 5 simon PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 990620b557aa668b07b90e11a7ef2ebd Text-delta-base-sha1: 38472188e744c3d3ff47c74a371893f508308779 Text-content-length: 1293 Text-content-md5: aecc2efbf69cb7ef10be690dd04cdde8 Text-content-sha1: d1c52fffe98c50c8c415e02e18dc0ea60ee2b41a Content-length: 1333 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN#T.Q)11 V,^P"7.8knclude #ifdef IPV6DECL_WINSOCK_FUNCTION(static, int, WSAIoctl, (SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE GET_WINSOCK_FUNCTION(WSAIoctlstatic INTERFACE_INFO local_interfaces[16]; static int n_local_interfaces; /* 0=not yet, -1=failed, >0=number */ static int ipv4_is_local_addr(struct in_addr addr) { if (ipv4_is_loopback(addr)) return 1; /* loopback addresses are local */ if (!n_local_interfaces) { SOCKET s = p_socket(AF_INET, SOCK_DGRAM, 0); DWORD retbytes; if (p_WSAIoctl && p_WSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0, local_interfaces, sizeof(local_interfaces), &retbytes, NULL, NULL) == 0) n_local_interfaces = retbytes / sizeof(INTERFACE_INFO); else logevent(NULL, "Unable to get list of local IP addresses"); } if (n_local_interfaces > 0) { int i; for (i = 0; i < n_local_interfaces; i++) { SOCKADDR_IN *address = (SOCKADDR_IN *)&local_interfaces[i].iiAddress; if (address->sin_addr.s_addr == addr.s_addr) return 1; /* this address is local */ } } return 0; /* this address is not local */cal_addrcal_addr Revision-number: 3504 Prop-content-length: 248 Content-length: 248 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-10-12T17:49:25.000000Z K 7 svn:log V 147 More thoughts about ToS. In particular, consider that for SSH connections, we might not _want_ that sort of information leaked into the IP header. PROPS-END Node-path: putty-wishlist/data/ip-tos Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cbb5d27359aa0e7c66774934f0ce5a2d Text-delta-base-sha1: 37d4432613d1e576bbb86321e663ef6edda2ab77 Text-content-length: 367 Text-content-md5: 7777d00319a740fe621190d27ea5306a Text-content-sha1: 9146cfd2b0465e6d4e1be239777e4d3525e9a6a3 Content-length: 406 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNsgT&!mT3. Also, we may not want to leak that sort of information about an encrypted connection. So it would probably need to be configurable, and off by default

    Need to make sure we understand how one is supposed to use this field in today's world; I've a feeling that several sets of semantics may have come and gone over the years. Revision-number: 3505 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 Note lack of puttygen and pageant K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-10-14T19:56:02.000000Z PROPS-END Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4af9db07ed34d33dd73467980c1cee93 Text-delta-base-sha1: 654d2bf0183e81e52080bcd0f42cb1bb5051bb73 Text-content-length: 73 Text-content-md5: 176297a0e84b9bed4d5abf0f79539c2b Text-content-sha1: 9211cffb8f51c9289169abe256dda2af739a425e Content-length: 112 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN2n 5QhJWe do not yet have Unix ports of Puttygen and Pageant Revision-number: 3506 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2003-10-14T19:57:50.000000Z K 7 svn:log V 42 We now have Unix ports of PSCP and PSFTP. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e64e80634f54b57d641d3a7777835942 Text-delta-base-sha1: c0c38df24544a0a8b7915f9c5a5db43999168887 Text-content-length: 242 Text-content-md5: 92a6267201b87117c50e25360075e917 Text-content-sha1: 6c67a905503e511313966447cf072a7911cf38c5 Content-length: 282 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVN V81X\versionid $Id: faq.but,v 1.48 2003/10/14 19:57:50 jacobPSCP, PSFTP, and also \c{pterm} - an \cw{xterm}-type program which supports the same terminal emulation as PuTTY. We do not yet have Unix ports of Pageant or Revision-number: 3507 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2003-10-14T21:01:12.000000Z K 7 svn:log V 78 Remove dead comment about writing settings, and query one about reading them. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 08cc9520008d5dab1b2ae410142de51a Text-delta-base-sha1: e50434f078b936a5d1e725343756f9a60be13ab4 Text-content-length: 88 Text-content-md5: 483996800a7c1c9a48d5dc48375f3490 Text-content-sha1: 81b24ef4ddff9adc412603d0a98fc3abb82dfcf7 Content-length: 128 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN3 >vMa+ FIXME: the above comment is a bit out of date. Did it happen? Revision-number: 3508 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2003-10-14T23:23:28.000000Z K 7 svn:log V 106 Add `--unix' mode to generate ~/.putty/sshhostkeys from known_hosts. (should now be called `kh2putty.py') K 10 svn:author V 5 jacob PROPS-END Node-path: putty/contrib/kh2reg.py Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bbb672986465f8b757e3224dfbeb8dd1 Text-delta-base-sha1: 8fb2741fc743613f7da4db8d81fd0439b5ad56ca Text-content-length: 1173 Text-content-md5: 6150aa02bace002e88d448a4cf72cbc1 Text-content-sha1: df2991fa16d94dcc41308ca2279387228c95c7dc Content-length: 1212 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN$r)`4-'DB  %_:P3q#! /usr/bin/env python # $Id: kh2reg.py,v 1.2 2003/10/14 23:23:28 jacob Exp $ # Convert OpenSSH known_hosts and known_hosts2 files to "new format" PuTTY # host keys. # usage: # kh2reg.py [ -win ] known_hosts1 2 3 4 ... > hosts.reg # Creates a Windows .REG file (double-click to install). # kh2reg.py -unix known_hosts1 2 3 4 ... > sshhostkeys # Creates data suitable for storing in ~/.putty/sshhostkeys (Unix).import getopt def winoutput_type = 'windows' try: optlist, args = getopt.getopt(sys.argv[1:], '', [ 'win', 'unix' ]) if filter(lambda x: x[0] == '--unix', optlist): output_type = 'unix' except getopt.error, e: sys.stderr.write(str(e) + "\n") sys.exit(1) if output_type == 'windows': # Output REG file header. argsif output_type == 'unix': # Unix format. sys.stdout.write('%s %s\n' % (key, value)) else: # Windows format. # XXX: worry about double quotes? sys.stdout.write("\"%s\"=\"%s\"\n" % (win Revision-number: 3509 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2003-10-15T12:09:24.000000Z K 7 svn:log V 23 Update faq-pscp-ascii. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 92a6267201b87117c50e25360075e917 Text-delta-base-sha1: 6c67a905503e511313966447cf072a7911cf38c5 Text-content-length: 421 Text-content-md5: ab75054bbedae5b1e72b20002566f0f9 Text-content-sha1: 314283e1228804dab0b0e1599b359b92d1dc7c16 Content-length: 461 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVN y 2Wg"\versionid $Id: faq.but,v 1.49 2003/10/15 12:09:24 Until recently, this was a limitation of the file transfer protocols: the SCP and SFTP protocols had no notion of transferring a file in anything other than binary mode. (This is still true of SCP.) The current draft protocol spec of SFTP proposes a means of implementing ASCII transfer. At some point PSCP/PSFTP may implement this proposal Revision-number: 3510 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:45.496686Z PROPS-END Revision-number: 3511 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:45.506425Z PROPS-END Revision-number: 3512 Prop-content-length: 162 Content-length: 162 K 7 svn:log V 62 I've been meaning to add this possible workaround for ages... K 10 svn:author V 5 simon K 8 svn:date V 27 2003-10-20T14:27:33.000000Z PROPS-END Node-path: putty-wishlist/data/black-pointer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 536d2c98cf71f357b2c1f12ba6a28c0b Text-delta-base-sha1: 3fe0d07e8d93b442da85f35cedb3dc10085faa9f Text-content-length: 288 Text-content-md5: 690d4ffc9ac7226d67582b39ac998051 Text-content-sha1: 6d7baa9e0e9662de83062265c08721209bc3efcf Content-length: 327 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNaa T p> If anybody else has this problem, they should try reconfiguring their PuTTY colour scheme so that black is RGB 1,1,1 instead of RGB 0,0,0. I suspect that that will make the problem go away; if so, that would confirm my theory about its cause. Revision-number: 3513 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:45.564885Z PROPS-END Revision-number: 3514 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:45.579855Z PROPS-END Revision-number: 3515 Prop-content-length: 199 Content-length: 199 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-10-20T17:02:38.000000Z K 7 svn:log V 99 Reference the several screenfuls of ick required to use SHGetFolderPath provided by Peter Gutmann. PROPS-END Node-path: putty-wishlist/data/win-randseed-location Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bfb7b571d725c00cc3d862f4e609923a Text-delta-base-sha1: bbc51470a942d7fec93afd49b1d5300d996c15ce Text-content-length: 96 Text-content-md5: 09ab92786c919bd4c0143d7468615e44 Text-content-sha1: d256180c53a86dc2392ec298d3640b5851699daf Content-length: 135 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN|G KKw - full horrors in 200310180552.h9I5qHZ21748@cs.auckland.ac.nz Revision-number: 3516 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2003-10-20T17:09:56.000000Z K 7 svn:log V 53 Note Denis Howe's investigation, for what it's worth K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-shortcut Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a28e49c0bd6bed10a6496f2b7229c9d3 Text-delta-base-sha1: 5a8aac1e48ca9e7aad81449a4db82d0f20c8edeb Text-content-length: 354 Text-content-md5: 275ab25bb7e914e400e677c086950c47 Text-content-sha1: 2ed39538b1c783a02fd35227c92fde6838ce1674 Content-length: 393 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN- J'J

    Update: for anyone interested in the original problem, it's been claimed that putting two spaces between command and argument works (i.e.,

    putty  @mysession
    ). We still recommend using -load. Revision-number: 3517 Prop-content-length: 253 Content-length: 253 K 8 svn:date V 27 2003-10-20T22:29:53.000000Z K 7 svn:log V 152 Pull across "Windows scroll optimisations" from the ancient wishlist. (Did this in order to note that it might also help people who use screen readers) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/windows-scrollopt Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 424 Text-content-md5: 00028df3f14299563f52dabb5123636d Text-content-sha1: b9ba0dec5cc39a83eca8a14cc65909eab073e1c8 Content-length: 540 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Scroll optimisations for Windows Class: wish Difficulty: tricky Priority: medium Content-type: text/x-html-body

    Think about pre-building a bitmap for better scrolling, or possibly just doing the old scroll optimisations over again and getting them right.

    Quite apart from the performance improvement, this may also improve the experience of people using screen reader software such as JAWS. Revision-number: 3518 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2003-10-20T22:34:25.000000Z K 7 svn:log V 50 Note the "screen reader" potential justification. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/plink-terminal Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 653f54031dce4ae918a8d98dffb73ee3 Text-delta-base-sha1: c250e9693b87900bac9d150859891fec183bc2af Text-content-length: 307 Text-content-md5: 2ef3139e98644dc25e057905d273a965 Text-content-sha1: f9f1c064a9a69c301ef547fc87a476a58860b0b5 Content-length: 346 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNEa CB

    • We have actually been given one vaguely good reason: it's been suggested that this might improve the experience of people using screen readers. However, fixing `windows-scrollopt' should have the same effect and probably be easier.
    Revision-number: 3519 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2003-10-21T13:26:12.000000Z K 7 svn:log V 19 Fix usage comments K 10 svn:author V 5 jacob PROPS-END Node-path: putty/contrib/kh2reg.py Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6150aa02bace002e88d448a4cf72cbc1 Text-delta-base-sha1: df2991fa16d94dcc41308ca2279387228c95c7dc Text-content-length: 213 Text-content-md5: cb19e87dc1330e90f3d07f246819e39a Text-content-sha1: ff956353f8f34363c00e4d010f4cf02a05bc1f9a Content-length: 252 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNrt hosts.reg # Creates a Windows .REG file (double-click to install). # kh2reg.py - Revision-number: 3520 Prop-content-length: 273 Content-length: 273 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-10-24T12:57:18.000000Z K 7 svn:log V 172 Summary: Switching to full-screen doesn't always hide taskbar Present-in: 0.53b 2003-10-23 (Had this for ages - adding now as I managed to verify on cakestand last night) PROPS-END Node-path: putty-wishlist/data/fullscreen-taskbar Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 538 Text-content-md5: 8e3b710588c4df924aab368ed9a9c468 Text-content-sha1: b496758b9d51f54db86179bdce2623a386675372 Content-length: 654 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  Summary: Switching to full-screen doesn't always hide taskbar Class: bug Present-in: 0.53b 2003-10-23 When switching to full-screen mode (e.g. with Alt-Enter), the taskbar is not always hidden. In some proportion of switches it stays on top. (At least, for a while. With 0.53b and Win98, it does disappear within a second or two if not immediately. I couldn't say for sure that wasn't the behaviour years ago.) I (JTN) have only noticed it on Win98 systems (2 so far), but it has been the case on that platform for ages. Revision-number: 3521 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2003-10-26T21:41:37.000000Z K 7 svn:log V 102 Replaced nfused.net with xlr8d.net at the request of someone who's plausibly the admin of the former. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cc14b26f7b856441b4fc257995e1cf64 Text-delta-base-sha1: c2a59b79d29d7a9c61bb29d2e89dcdf0eba1efaf Text-content-length: 57 Text-content-md5: 88a5cddd4e704d4ae75ec9747d629a9d Text-content-sha1: f609e3c63efc772bbd52574e483b9cc1e6acf3f2 Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVNNZ $jLmirror.xlr8d.net/">putty.mirror.xlr8 Revision-number: 3522 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2003-10-27T18:12:58.000000Z K 7 svn:log V 19 Updated references K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/subsystem-publickey Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5c76972d6654e1bf549344ea65b7a119 Text-delta-base-sha1: 66aba27df853a7e86a31bbf542509c0f36cf7911 Text-content-length: 164 Text-content-md5: 1255efb03dd9b4b47c042fede0da4387 Text-content-sha1: 07c9cd95ad82779cd0d8f27f7ec8a01727eedb52 Content-length: 203 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN4LADMt$NNf (previously publickey@vandyke.com)ietf-secsh-publickey-subsystem-00.txt">draft-ietf-secsh-publickey-subsystem-00 Revision-number: 3523 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2003-10-29T18:43:37.000000Z K 7 svn:log V 117 Summary: "Copy All to Clipboard" misses out screen contents after cursor Present-in: 0.51 0.52 0.53 0.53b 2003-10-29 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/copyall-to-cursor Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 537 Text-content-md5: c7a3f0648e303c597ae3e0a267b07cf5 Text-content-sha1: dc7aeb8ffca58f92b92f776015f42eb4e840b25c Content-length: 653 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  Summary: "Copy All to Clipboard" misses out screen contents after cursor Class: bug Difficulty: fun Priority: medium Present-in: 0.51 0.52 0.53 0.53b 2003-10-29 Content-type: text/x-html-body

    The documentation of the menu option "Copy All to Clipboard" claims that it copies "the whole contents of the terminal screen and scrollback to the clipboard in one go."

    However, it does not copy any text from locations on or after the current cursor position.

    The first release this feature was present in is 0.51. Revision-number: 3524 Prop-content-length: 295 Content-length: 295 K 8 svn:date V 27 2003-10-30T10:30:23.000000Z K 7 svn:log V 194 Move the reference to sitestyle.css out into a separate .but file which is only included if you explicitly tell the docs Makefile to do so. Also make it a relative reference, while we're at it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b197592204f1fd585bbdcdb085f3ad88 Text-delta-base-sha1: 9d9debb318036201934e240c4cf95c7414f659b5 Text-content-length: 108 Text-content-md5: a757b8dcedc2e547a0d9ba2efe7e977d Text-content-sha1: e316e5a361062095ce409089251d80a4af10bb16 Content-length: 148 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNiq[[SCHAPTERS := $(SITE) blurb intro gs using config pscp psftp plink pubkey CHAPTERS += pageant Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 104234d7bbb92d9c0c2473f92e14b2f4 Text-delta-base-sha1: 55e86a2f9981b0b3f88f24c9fdaa1b14c3741408 Text-content-length: 55 Text-content-md5: 953a519a94a697144faf748a7d73884f Text-content-sha1: 637d510514936306ec91024fff09a792af8e6236 Content-length: 94 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN "c8 2003/10/30 10:30:23 simon Exp $ Node-path: putty/doc/site.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 214 Text-content-md5: 9f13cae8bb759dd0880eef630131989c Text-content-sha1: 40f7ff3502a57036c0665e907326c13602a7da3f Content-length: 330 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNHHH\# Additional configuration for the version of the PuTTY docs \# actually published as HTML on the website. \cfg{xhtml-head-end}{} Revision-number: 3525 Prop-content-length: 281 Content-length: 281 K 8 svn:date V 27 2003-10-30T10:41:59.000000Z K 7 svn:log V 180 Hmm, that relative link wasn't too good. Try a more helpful one. Also add to the release checklist so that I'll remember to set this up properly in the next set of release docs... K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ec2a05dbc0c3d7e2ec9deb9e4fde4200 Text-delta-base-sha1: bd92bb1730504b2d3851ed37d807c6e4fad6a902 Text-content-length: 195 Text-content-md5: 41fbdd5516b07f71ab72ce879dc18bda Text-content-sha1: 1e59a4782ad59ee2a95571f33b679d383056399b Content-length: 234 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNP} +(+*& + It also needs a copy of sitestyle.css, because the online versions of the HTML docs will link to this (although the zipped form should be self-contained) Node-path: putty/doc/site.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9f13cae8bb759dd0880eef630131989c Text-delta-base-sha1: 40f7ff3502a57036c0665e907326c13602a7da3f Text-content-length: 18 Text-content-md5: fe3e31d52461be0af213371f8abb791c Text-content-sha1: f031ccc57889f7d8185890b1c9c76684b99d432e Content-length: 57 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNHB#% Revision-number: 3526 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2003-10-31T21:45:15.000000Z K 7 svn:log V 65 Close the host keys file after use. Well spotted Theo Markettos. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 483996800a7c1c9a48d5dc48375f3490 Text-delta-base-sha1: 81b24ef4ddff9adc412603d0a98fc3abb82dfcf7 Text-content-length: 32 Text-content-md5: b569e82870622aa924b5e03ba61e91eb Text-content-sha1: 9555e2ee6b08b87b5b16263152fca2ebb7172419 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN  rfclose(fp); Revision-number: 3527 Prop-content-length: 133 Content-length: 133 K 7 svn:log V 34 Mention version on download page. K 10 svn:author V 4 owen K 8 svn:date V 27 2003-11-03T13:47:49.000000Z PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e5c4e658b1f0512bf5d589957a9c90b6 Text-delta-base-sha1: 29d0eaa7b8e1f433209ae2bcd972171dff953942 Text-content-length: 32 Text-content-md5: 32c1e600b37b74079c6713b16fe1a390 Text-content-sha1: d982918765095f6cab020f7f34540914afb4e93a Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN y (0.53b) Revision-number: 3528 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2003-11-03T13:59:46.000000Z K 7 svn:log V 106 We now mention the version number on the Download page, so I'd better remember to change it next time :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 41fbdd5516b07f71ab72ce879dc18bda Text-delta-base-sha1: 1e59a4782ad59ee2a95571f33b679d383056399b Text-content-length: 44 Text-content-md5: e5cd7b9d2be7b2d3f8f19bcaada1f4bd Text-content-sha1: 9dd8a124ef402323b37d69060478442a1f72e4a4 Content-length: 83 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN}" V5HDownload page similarly Revision-number: 3529 Prop-content-length: 271 Content-length: 271 K 7 svn:log V 170 Summary: Short RSA2 key causes PuTTY crash Class: bug More detail: <20031101102009.GA29907@chiark.greenend.org.uk> (includes suspected root cause) From Theo Markettos. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-11-03T16:13:18.000000Z PROPS-END Node-path: putty-wishlist/data/short-rsa2-key-crash Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 417 Text-content-md5: 6713047a07691a20aeafaf6789a7e178 Text-content-sha1: c441058c65156120a9f9011797363ca7f6121f0b Content-length: 533 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: Short RSA2 key causes PuTTY crash Class: bug Present-in: 0.53b 2003-11-03 "If I create a really short RSA2 key (I used 256 bits) it is generated and accepted OK, but the PuTTY code (CVS head, 22:00 GMT yesterday) segfaults." More detail: <20031101102009.GA29907@chiark.greenend.org.uk> (includes suspected root cause) (I've tested that DSA and RSA1 keys don't suffer from the same problem.) Revision-number: 3530 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2003-11-03T16:22:59.000000Z K 7 svn:log V 17 Mark as "fixed". K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winnet-if2lo Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f23adad576998b95909d2442d6051932 Text-delta-base-sha1: eb9ea74e9956546b815cedcdce15ef1e2a9e3f34 Text-content-length: 202 Text-content-md5: 54113d4d8b952fb571cac730f99255de Text-content-sha1: 3657e7a206623f759db93efe5653091ced1ab977 Content-length: 241 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN  1@Fixed-in: 2003-10-13Update: we have implemented a fix as of the 2003-10-13 snapshot. It would be helpful if someone could tell us whether it makes SMB forwarding work. Revision-number: 3531 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2003-11-04T09:12:12.000000Z K 7 svn:log V 21 gulus.usherbrooke.ca K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 88a5cddd4e704d4ae75ec9747d629a9d Text-delta-base-sha1: f609e3c63efc772bbd52574e483b9cc1e6acf3f2 Text-content-length: 106 Text-content-md5: 1ce39145a06317879ac9488a0860e026 Text-content-sha1: 97c0b51a8effe1602240e9414b7e08d14b59206a Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.45 PROPS-END SVNZfPBPB?Hgulus.USherbrooke.ca/public/applications/ssh/">gulus.usherbrooke.ca in Canad Revision-number: 3532 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:46.273982Z PROPS-END Revision-number: 3533 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2003-11-04T23:40:14.000000Z K 7 svn:log V 27 mirror.nimsay-networks.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ce39145a06317879ac9488a0860e026 Text-delta-base-sha1: 97c0b51a8effe1602240e9414b7e08d14b59206a Text-content-length: 82 Text-content-md5: 5ee80100699e5dc7cd295d5b868ac1df Text-content-sha1: 10fdf02323d80ed3ada3c16757610cac36b09186 Content-length: 122 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVNfm =WY mirror.nimsay-networks.com/putty/">mirror.nimsay-networks.com Revision-number: 3534 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2003-11-05T13:21:12.000000Z K 7 svn:log V 18 securitytools.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5ee80100699e5dc7cd295d5b868ac1df Text-delta-base-sha1: 10fdf02323d80ed3ada3c16757610cac36b09186 Text-content-length: 109 Text-content-md5: e0e63951881838b1549b8603fa445b0c Text-content-sha1: b6a9ffaaa27b9da24c73d1a3625e8a35e0078f34 Content-length: 149 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNmm WhW.?li> securitytool Revision-number: 3535 Prop-content-length: 231 Content-length: 231 K 7 svn:log V 130 putty.deadraq.net removed after administrator notification of its pending closure <1068088647.3fa9bd4754658@webmail.dalbaech.net> K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-11-06T08:57:50.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e0e63951881838b1549b8603fa445b0c Text-delta-base-sha1: b6a9ffaaa27b9da24c73d1a3625e8a35e0078f34 Text-content-length: 20 Text-content-md5: 785875cee2be3fff81b6538729c8558f Text-content-sha1: 16b23483677e3bb03f9d31b0a15e44da95659d4e Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVNm p} Revision-number: 3536 Prop-content-length: 338 Content-length: 338 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-11-06T14:17:56.000000Z K 7 svn:log V 237 Cosmetic fix from Daniel Fazekas: apparently we were failing to allow window-furniture in Playschool Windows be animated on mouse-over. This fix also seems like the Right Thing to do. I've tried it and it seems harmless enough on Win2K. PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1f8b45bf5a3d5f7cf65540e46a126252 Text-delta-base-sha1: b81c4f354ace9d552f656a0e4b7160787a82b373 Text-content-length: 51 Text-content-md5: a62c6ed67f00ba83f194daa45c01c355 Text-content-sha1: bb9b7020d68e92d98b0558eddbd260c680201bd4 Content-length: 92 K 15 cvs2svn:cvs-rev V 5 1.253 PROPS-END SVNjbreakndo$!! Revision-number: 3537 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2003-11-10T13:22:15.000000Z K 7 svn:log V 39 Reference Elias Hatzigeorgiou's email. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/da-response Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2540036bf7946620a556a4d32bb2c616 Text-delta-base-sha1: 593384f58fb325135c415bc1b5ac0821d8679bbf Text-content-length: 173 Text-content-md5: 7f151614ff5ae0fd44de922e22e38057 Text-content-sha1: 8f1fbec565054611f583080e95b66dfaaec118c6 Content-length: 212 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNF`F We've had a report of this causing problems with entry of greek text, and a suggested replacement: <000801c3a54f$1cc29720$befba8c0@semantix.private.gr>. Revision-number: 3538 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2003-11-10T13:25:40.000000Z K 7 svn:log V 39 Actually quote the suggested sequence. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/da-response Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7f151614ff5ae0fd44de922e22e38057 Text-delta-base-sha1: 8f1fbec565054611f583080e95b66dfaaec118c6 Text-content-length: 103 Text-content-md5: 4475d5dbefdb2d09982c7c98e3e310d0 Text-content-sha1: d020285f250516bf4dc024a388dba5f6aaefa41c Content-length: 142 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN`4V^V (suggesting CSI ? 62 ; 1 ; 2 ; 6 ; 7 ; 8 ; 9 c). Haven't analysed this solution yet. Revision-number: 3539 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2003-11-10T19:08:55.000000Z K 7 svn:log V 13 unixsoft.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 785875cee2be3fff81b6538729c8558f Text-delta-base-sha1: 16b23483677e3bb03f9d31b0a15e44da95659d4e Text-content-length: 96 Text-content-md5: df78b1015febb4f1643b37451fa15451 Text-content-sha1: b497e3ee8e6abadd502543947c7fb4fa6ac76f0c Content-length: 136 K 15 cvs2svn:cvs-rev V 4 1.49 PROPS-END SVNm JzJ)Vli> unixsoft.org Revision-number: 3540 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2003-11-10T23:05:59.000000Z K 7 svn:log V 32 Mention Ryan Underwood's patch. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ansisys-compat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 25311b3d46a2a5a45c813e5f4e89a27c Text-delta-base-sha1: 369aaee5ef97169f097c4bd4e9e639de5e387b13 Text-content-length: 95 Text-content-md5: 91d98c28cb400d945ba9e8392351fb03 Text-content-sha1: bc3ab7923441d466f042bccc975d7b8a8e104753 Content-length: 134 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNZ(NZN

    Patch (unreviewed): 20031004001955.GE28811@dbz.icequake.net Revision-number: 3541 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:46.675637Z PROPS-END Revision-number: 3542 Prop-content-length: 118 Content-length: 118 K 7 svn:log V 18 www.marcocorte.it K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-11-14T21:22:19.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: df78b1015febb4f1643b37451fa15451 Text-delta-base-sha1: b497e3ee8e6abadd502543947c7fb4fa6ac76f0c Text-content-length: 77 Text-content-md5: 002a566e28596b8a344d7a30263ec2ea Text-content-sha1: 699ba9427578218fa07d86a8edc177af4810e88d Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNm` 8>jwww.marcocorte.it/putty/">www.marcocorte.it in Italy Revision-number: 3543 Prop-content-length: 852 Content-length: 852 K 8 svn:date V 27 2003-11-15T14:14:16.000000Z K 7 svn:log V 751 Attempt to improve the usefulness of the mirror list in the continued absence of a magic script. (I'll get round to it one day..) Prune mirrors that were either positively defunct (404, NXDOMAIN etc), or more than about a year out of date (i.e., don't include 0.53b), on both occasions that I checked them (2003-11-04 and 2003-11-15). Similarly, put queries against mirrors that I couldn't reach or couldn't resolve on either occasion. (But we keep them in the list, as there's a small chance that they _might_ represent very useful mirrors...) Note that all these remain on my private mirror list, so if I ever get round to finishing the mirror script and the administrators have fixed the mirrors in the meantime, they will reappear on the list. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 002a566e28596b8a344d7a30263ec2ea Text-delta-base-sha1: 699ba9427578218fa07d86a8edc177af4810e88d Text-content-length: 324 Text-content-md5: caaddaa6a9d43fdcf3bb08466d4ffc51 Text-content-sha1: 81ded291587441e8cf4b83df930cbef14e49a072 Content-length: 364 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVN`nJOURS?l{\fg6XaWy|@ p>.9D>x|\n\89X"Iputty.dakin.be/">putty.dakin (unreachable?) (unreachable?) (unreachable?) (unreachable?)mirrors.bitflood.net/putty/">mirrors.bitflood.net (unreachable?) Revision-number: 3544 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2003-11-17T17:50:37.000000Z K 7 svn:log V 47 Erroneously claimed that PuTTYgen was RSA only K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 32c1e600b37b74079c6713b16fe1a390 Text-delta-base-sha1: d982918765095f6cab020f7f34540914afb4e93a Text-content-length: 29 Text-content-md5: fb02440d9b3cb10c993d2fcc5ddb74a1 Text-content-sha1: c219a8c3a52cbb42eeb37c45de0541cd43add5dd Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN& SNPand D Revision-number: 3545 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:46.962718Z PROPS-END Revision-number: 3546 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:46.971922Z PROPS-END Revision-number: 3547 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:46.981049Z PROPS-END Revision-number: 3548 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:46.990107Z PROPS-END Revision-number: 3549 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:46.998406Z PROPS-END Revision-number: 3550 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:47.007121Z PROPS-END Revision-number: 3551 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:47.016212Z PROPS-END Revision-number: 3552 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2003-11-19T17:30:16.000000Z K 7 svn:log V 98 I _think_ this should fix the problem reported by `Stacey': failure to fclose a private key file. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 922c1ff32d42c6da7f1e069713f06a29 Text-delta-base-sha1: d9f9d7a7dee4561ec518f1332604dc246d4cae51 Text-content-length: 269 Text-content-md5: 8ec8567f1721514a12520c94be08a32d Text-content-sha1: f1c1bd5d36e369fc4720c65bb3547d81be3443e5 Content-length: 309 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNQ``IC GCA6=/* * This routine will take care of calling fclose() for us. */error = "not an SSH-1 RSA file"; end: fclose(fp);/* * This routine will take care of calling fclose() for us. */} end: if (fp) fclose(fp); Revision-number: 3553 Prop-content-length: 213 Content-length: 213 K 7 svn:log V 112 Soften language in `faq-incorrect-mac': buggy ssh.com servers aren't the only possible reason for this message. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-11-19T19:03:24.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ab75054bbedae5b1e72b20002566f0f9 Text-delta-base-sha1: 314283e1228804dab0b0e1599b359b92d1dc7c16 Text-content-length: 90 Text-content-md5: 6965bab13c5534c2ba92ef3e8f3ae08f Text-content-sha1: e9361ee7c604c9843f7c60780b7fad42d7fee2a5 Content-length: 130 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNy?$/\\versionid $Id: faq.but,v 1.50 2003/11/19 19:03can be caused by Revision-number: 3554 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2003-11-19T19:09:07.000000Z K 7 svn:log V 116 Make that last checkin more explicit, and in particular reference the "common errors" section of the documentation. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6965bab13c5534c2ba92ef3e8f3ae08f Text-delta-base-sha1: e9361ee7c604c9843f7c60780b7fad42d7fee2a5 Text-content-length: 269 Text-content-md5: 6b6c77e1e14fac418380313155de51fc Text-content-sha1: fae2517d121d5520c401f85fe1e83e08efbdd79d Content-length: 309 K 15 cvs2svn:cvs-rev V 4 1.51 PROPS-END SVNoo2=d\versionid $Id: faq.but,v 1.51 2003/11/19 19:09:07One possible cause of this that used to be common is a bug in old SSH 2 servers distributed by \cw{ssh.com}. (This is not the only possible cause; see \k{errors-crc} in the documentation.) Revision-number: 3555 Prop-content-length: 307 Content-length: 307 K 8 svn:date V 27 2003-11-19T20:48:30.000000Z K 7 svn:log V 206 Introduce a context menu which appears on Ctrl+rightclick. This menu contains all the stuff in the System menu except for the standard System menu bits (move, resize, close etc), and also contains `Paste'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a62c6ed67f00ba83f194daa45c01c355 Text-delta-base-sha1: bb9b7020d68e92d98b0558eddbd260c680201bd4 Text-content-length: 3334 Text-content-md5: cd46f9558303124a2b208d00f27dd2ac Text-content-sha1: c7e7b65f7e5c609694472a2cdba4b3d57cabab21 Content-length: 3375 K 15 cvs2svn:cvs-rev V 5 1.254 PROPS-END SVNT:u sivzPhWD@08`FZN^:F,~#define IDM_PASTE 0x019static struct { HMENU menu; int specials_submenu_pos; } popup_menus[2]; enum { SYSMENU, CTXMENU }s, m; int i, j; char *str; popup_menus[SYSMENU].menu = GetSystemMenu(hwnd, FALSE); popup_menus[CTXMENU].menu = CreatePopupMenu(); AppendMenu(popup_menus[CTXMENU].menu, MF_ENABLED, IDM_PASTE, "&Paste"); for (j = 0; j < lenof(popup_menus); j++) { m = popup_menus[j].menu; AppendMenu(m, MF_SEPARATOR, 0, 0); popup_menus[j].specials_submenu_pos = GetMenuItemCount(m); AppendMenu(m, MF_ENABLED, IDM_SHOWLOG, "&Event Log"); AppendMenu(m, MF_SEPARATOR, 0, 0); AppendMenu(m, MF_ENABLED, IDM_NEWSESS, "Ne&w Session..."); AppendMenu(m, MF_ENABLED, IDM_DUPSESS, "&Duplicate Session"); AppendMenu(m, MF_ENABLED, IDM_RECONF, "Chan&ge Settings..."); AppendMenu(m, MF_SEPARATOR, 0, 0); AppendMenu(m, MF_ENABLED, IDM_COPYALL, "C&opy All to Clipboard"); AppendMenu(m, MF_ENABLED, IDM_CLRSB, "C&lear Scrollback"); AppendMenu(m, MF_ENABLED, IDM_RESET, "Rese&t Terminal"); AppendMenu(m, MF_SEPARATOR, 0, 0); AppendMenu(m, (cfg.resize_action == RESIZE_DISABLED) ? MF_GRAYED : MF_ENABLED, IDM_FULLSCREEN, "&Full Screen"); AppendMenu(m, MF_SEPARATOR, 0, 0); if (help_path) AppendMenu(m, MF_ENABLED, IDM_HELP, "&Help"); str = dupprintf("&About %s", appname); AppendMenu(m, MF_ENABLED, IDM_ABOUT, str); sfree(str); }, jfor (j = 0; j < lenof(popup_menus); j++) { if (menu_already_exists) DeleteMenu(popup_menus[j].menu, popup_menus[j].specials_submenu_pos, MF_BYPOSITION); else InsertMenu(popup_menus[j].menu, popup_menus[j].specials_submenu_pos, MF_BYPOSITION | MF_SEPARATOR, 0, 0); InsertMenu(popup_menus[j].menu, popup_menus[j].specials_submenu_pos, MF_BYPOSITION | MF_POPUP | MF_ENABLED, (UINT) p, "Special Command"); }COMMAND:PASTE: term_do_pasteif (message == WM_RBUTTONDOWN && (wParam & MK_CONTROL)) { POINT cursorpos; GetCursorPos(&cursorpos); TrackPopupMenu(popup_menus[CTXMENU].menu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, cursorpos.x, cursorpos.y, 0, hwnd, NULL); break; }!wVV!h < 0x80) { WCHAR cbuf[2]; cbuf[0] = 27; cbuf[1] = xlat_uskbd2cyrllic(ch); term_seen_key_event(term); luni_send(ldisc, cbuf+!left_alt, 1+!!left_alt, 1); } else { char cbuf[2]; cbuf[0] = '\033'; cbuf[1] = ch; term_seen_key_event(term); lpage_send(ldisc, kbd_codepage, cbuf+!left_alt, 1+!!left_alt, 1); } } show_mouseptr(0); } /* This is so the ALT-Numpad and dead keys work correctly. */ keys[0] = 0; return p - output; } /* If we're definitly not building up an ALT-54321 then clear it */ if (!left_alt) keys[0] = 0; /* If we will be using alt_sum fix the 256s */ else if (keys[0] && (in_utf(term) || ucsdata.dbcs_screenfont)) keys[0] = 10; } /* * ALT alone may or may not want to bring up the System menu. * If it's not meant to, we return 0 on presses or releases of * ALT, to show that we've swallowed the keystroke. Otherwise * we return -1, which means Windo Revision-number: 3556 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:47.285297Z PROPS-END Revision-number: 3557 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:47.294109Z PROPS-END Revision-number: 3558 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:47.315870Z PROPS-END Revision-number: 3559 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:47.325862Z PROPS-END Revision-number: 3560 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 USERAUTH_BANNER bug reported on comp.security.ssh. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-11-20T12:29:35.000000Z PROPS-END Node-path: putty-wishlist/data/drop-banner Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2130 Text-content-md5: 516cba3dce0711684f71827d98587fd6 Text-content-sha1: d2c7e7df57393db2437a3a33ccbf94a8bfa4f36b Content-length: 2246 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNDDDSummary: PuTTY drops USERAUTH_BANNER when awaiting username input Class: bug Difficulty: tricky Content-type: text/x-html-body

    Someone on comp.security.ssh said their login banner did not appear when PuTTY prompted for a username, but did appear when they specified the username ahead of time in the configuration.

    This looks worryingly plausible, in fact: the loop on process_userpass_input() appears to be throwing away all incoming SSH messages, presumably because I didn't expect to be receiving any; and that includes USERAUTH_BANNER. I didn't notice this before because I tested against OpenSSH, which appears to delay sending the banner until after the first (usually null) USERAUTH_REQUEST. However, the poster was using WinSSHD, which sends the banner as soon as the userauth protocol commences (which seems a lot more sensible in retrospect!).

    So in order to fix this in PuTTY I would have to spot USERAUTH_BANNER during username input, and respond to it by doing something thoroughly unpleasant, such as erasing the username input line from the terminal, printing the banner, and redisplaying the username input line after that. This is nasty, but it would have the nice feature that if the banner was sent immediately, it would be displayed before the user finished entering their username.

    I've labelled this bug "tricky" because I'm not sure what to do about Plink. Plink will call ssh_get_line and ignore ssh.c's own username/password input function, which means that on the one hand the banner won't be dropped on the floor in the current version, but on the other hand it would be hard to display it ahead of the username prompt in the fixed version.

    If only the working group had listened to my suggestion of having a ping message I could send during userauth and expect a reply. Then I could send the ping, get a reply back, and if the banner had been sent immediately on commencement of userauth then it would appear before the ping response, and so I'd know whether there was a banner to be displayed before beginning username input. Bah. Revision-number: 3561 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:47.407930Z PROPS-END Revision-number: 3562 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2003-11-20T15:23:06.000000Z K 7 svn:log V 49 marcocorte.it removed at administrator's request K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: caaddaa6a9d43fdcf3bb08466d4ffc51 Text-delta-base-sha1: 81ded291587441e8cf4b83df930cbef14e49a072 Text-content-length: 20 Text-content-md5: c445c3994a7fc5ec352f63d620f6c23a Text-content-sha1: fad69c660c549e82578d383178bbdf7f64818886 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVN t Revision-number: 3563 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2003-11-20T15:44:11.000000Z K 7 svn:log V 76 - mention PuTTY's current behaviour - mention someone's HP-UX vi troubles K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/terminal-modes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 945fedffaf47a429dd08d77f64289915 Text-delta-base-sha1: a0b7348c4ae23eefa99bf74497150952e9a4bbc3 Text-content-length: 302 Text-content-md5: e74e9a70dcc6795ab00e637dc01ee13f Text-content-sha1: 1995f4a19465d7e3b31fe78b0e3256f3905b57b5 Content-length: 341 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVND[oJ)nE4 PuTTY does not currently specify any such information for either protocolWe've had one report that in the absence of information from PuTTY, someone's HP-UX server assumed a terminal speed of 300 baud (!), which seems to cause its vi to use a 5 line display Revision-number: 3564 Prop-content-length: 360 Content-length: 360 K 7 svn:log V 259 Move the `translation of line drawing characters when pasting' option from the Selection panel to the Translation panel (where it fits at least as well). This frees a line in the Selection panel which I'm about to use for an additional mouse handling option. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-11-20T18:33:22.000000Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 47870c96537c7c595ed1f79ec1da7c51 Text-delta-base-sha1: df0d46ef58a07715f66bbd3535dcd5211755e005 Text-content-length: 108 Text-content-md5: f96bdd54c2884ce01e3d58fb66761b87 Text-content-sha1: e0084504760a1d6424a94219e395e717eda32a98 Content-length: 148 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNY@Hmwbudhandle ctrl_checkbox(s, "Copy and paste line drawing characte Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d479271f40ebc05a729f04b0e2c72f39 Text-delta-base-sha1: 79fa04b5173b2c10e8061e6a8e2a01da723e6889 Text-content-length: 524 Text-content-md5: d89c81d77cedea939f21a9eb532187fc Text-content-sha1: 9e2ed714e8284cc0363582864ccc1a7fa36b58e9 Content-length: 564 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNnz#[Y;wInb%^\versionid $Id: config.but,v 1.72 2003/11/20 18:33:22 simonS{config-linedrawpaste} Controlling copy and pasteCopy and paste VT100 line drawing chars as lqqqk} disables this feature, so line-drawing characters will be pasted as the ASCII characters that were printed to produce them. This will typically mean they come out mostly as \c{q} and \c{x}, with a scattering of \c{jklmntuvw} at the corners. This might be useful if you were trying to recreate the same box layout in Node-path: putty/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 78274e62ddb74c264d237a425d1f8c22 Text-delta-base-sha1: 77f43d3892858d5e67c401555b6ddf223397a24a Text-content-length: 47 Text-content-md5: 008c907554fbba5d9b22b9c158dfa749 Text-content-sha1: 0a32817ca7f4c4ec726feb25489fa2dfff903c19 Content-length: 86 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN{{ \vformat", "Formatting Revision-number: 3565 Prop-content-length: 804 Content-length: 804 K 8 svn:date V 27 2003-11-20T18:41:12.000000Z K 7 svn:log V 703 Introduce a new mouse handling option, in which the right button brings up the context menu (and you can then paste by selecting `Paste'). Should be more friendly to Windows-oriented users as opposed to expatriate X users; also has the effect of making it more difficult to paste into PuTTY by a single misplaced mouse click, which has been a common theme of complaint recently. For the moment, `Compromise' (the X-like behaviour with the right and middle buttons reversed so that two-button users still get the two most important functions) is still the default. I'm uncertain that it might not be better to make the new option the default, though, since the compromise option is optimal for _nobody_. K 10 svn:author V 5 simon PROPS-END Node-path: putty/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 008c907554fbba5d9b22b9c158dfa749 Text-delta-base-sha1: 0a32817ca7f4c4ec726feb25489fa2dfff903c19 Text-content-length: 184 Text-content-md5: 2385e6563f841f21716f20b84c026451 Text-content-sha1: 0c8831637beb5f68f15d6f38a8cc1f64658778ea Content-length: 224 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN{,v k'm'Middle extends, Right brings up menu)", I(2), "Compromise (Middle extends, Right pastes)", I(0), "xterm (Right extends, Middle pastes)" Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cd46f9558303124a2b208d00f27dd2ac Text-delta-base-sha1: c7e7b65f7e5c609694472a2cdba4b3d57cabab21 Text-content-length: 406 Text-content-md5: 44a943dbc50e352cb5a6ff76b4901c82 Text-content-sha1: d41fb5a0e12b41611a7b11fa8aaef932678b7a4c Content-length: 447 K 15 cvs2svn:cvs-rev V 5 1.255 PROPS-END SVNp[za == 1 ? MBT_PASTE : MBT_EXTEND; if (button == MBT_RIGHT) return cfg.mouse_is_xterm == 1 ((wParam & MK_CONTROL) || (cfg.mouse_is_xterm == 2))) { POINT cursorpos; show_mouseptr(1); /* make sure pointer is visible */wfoowrm_seen_key_event(term); lpage_send(ldisc, kbd_codepage, &ch, 1, 1); } } else { if(capsOn && c Revision-number: 3566 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.053050Z PROPS-END Revision-number: 3567 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.061415Z PROPS-END Revision-number: 3568 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.070410Z PROPS-END Revision-number: 3569 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.079005Z PROPS-END Revision-number: 3570 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.087576Z PROPS-END Revision-number: 3571 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.118139Z PROPS-END Revision-number: 3572 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2003-11-22T14:50:57.000000Z K 7 svn:log V 138 Trivial braino in parsing of the port forwarding config data. Was causing all port forwardings after the first dynamic one to be ignored. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 23abc94e52f486ec38f0389b9922060c Text-delta-base-sha1: 39502e78c617bf9d85e328cf40fa6461f227c8c5 Text-content-length: 239 Text-content-md5: e3b407abb88726540c31fface6cb8d22 Text-content-sha1: 1b4f27ee446a2c5c71ba1e36d57de80063788acf Content-length: 280 K 15 cvs2svn:cvs-rev V 5 1.302 PROPS-END SVN >4 ssh->portfwd_strptr++; /* eat the NUL and move to next one */--~@<s:.type == SSH1_SMSG_STDERR_DATA, (char *)(ssh->pktin.body) + ssh->portfwd_strptr++; /* eat the NUL and move to next one */ Revision-number: 3573 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.255258Z PROPS-END Revision-number: 3574 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.263778Z PROPS-END Revision-number: 3575 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.272577Z PROPS-END Revision-number: 3576 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.281411Z PROPS-END Revision-number: 3577 Prop-content-length: 424 Content-length: 424 K 7 svn:log V 323 I think the time has come for PuTTYgen to mention "authorized_keys" instead of "authorized_keys2" by default. I believe this change was made in OpenSSH around June 2001, so any versions which it applies should have been replaced by now for other reasons. (The docs still adequately document the confusion surrounding this) K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-11-24T13:40:58.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7b31ca3e1a3ace6d72245cde92142515 Text-delta-base-sha1: 15a86d713bccc7a130b248355cbd958b6c0e7788 Text-content-length: 23 Text-content-md5: f2f5a8edcc15b146be60444390cbbe7e Text-content-sha1: 152bb9de0ff600d376d4155a4941cc9e1f126225 Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVNvu K*L Revision-number: 3578 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.629367Z PROPS-END Revision-number: 3579 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.638228Z PROPS-END Revision-number: 3580 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.647157Z PROPS-END Revision-number: 3581 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.655492Z PROPS-END Revision-number: 3582 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.664458Z PROPS-END Revision-number: 3583 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.674075Z PROPS-END Revision-number: 3584 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.682715Z PROPS-END Revision-number: 3585 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.691848Z PROPS-END Revision-number: 3586 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.700647Z PROPS-END Revision-number: 3587 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.710880Z PROPS-END Revision-number: 3588 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.719382Z PROPS-END Revision-number: 3589 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.727791Z PROPS-END Revision-number: 3590 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:48.736509Z PROPS-END Revision-number: 3591 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 putty.fupp.net, totem.fix.no (same admin) K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-11-25T21:48:33.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c445c3994a7fc5ec352f63d620f6c23a Text-delta-base-sha1: fad69c660c549e82578d383178bbdf7f64818886 Text-content-length: 110 Text-content-md5: f1ae2ab7ab0e322d018ae979ba16ef1f Text-content-sha1: 18ba46858dc54107041f311d2f7e04bd2133c2bf Content-length: 150 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVNWSMi~NPfupp.net/">putty.fupp.nettotem.fix.no/pub/mirrors/putty/">totem.fix.no in Norwa Revision-number: 3592 Prop-content-length: 240 Content-length: 240 K 8 svn:date V 27 2003-11-26T13:25:03.000000Z K 7 svn:log V 139 Create somewhere to log Unix portability patches. (I don't know if we have a policy on how portable we're trying to make the Unix port...) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 291 Text-content-md5: 109f5479038014b0f85090933d841e3a Text-content-sha1: ee7ef5ab71583e49fe34f82b98cf9a012631a141 Content-length: 407 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Extra portability in the Unix port Class: wish Priority: low People occasionally send us patches to make the Unix port more portable. * FreeBSD 4.7-STABLE wwvn0lvct6s.fsf@rjk.greenend.org.uk * NetBSD with gcc-3.x 20031126022610.GA13294@babymeat.com Revision-number: 3593 Prop-content-length: 112 Content-length: 112 K 7 svn:log V 12 another one K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-11-27T00:18:43.000000Z PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 109f5479038014b0f85090933d841e3a Text-delta-base-sha1: ee7ef5ab71583e49fe34f82b98cf9a012631a141 Text-content-length: 68 Text-content-md5: fdd726fb7a82dd07b49c34973adc56b1 Text-content-sha1: 5c94d82da6e02843915dcbf764b64852acde8b2b Content-length: 107 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNL 0XDQFreeBSD 5.1 20031029224803.GK30375@earth.li Revision-number: 3594 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.070148Z PROPS-END Revision-number: 3595 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.078619Z PROPS-END Revision-number: 3596 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.087925Z PROPS-END Revision-number: 3597 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.096098Z PROPS-END Revision-number: 3598 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.104257Z PROPS-END Revision-number: 3599 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.112968Z PROPS-END Revision-number: 3600 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.121280Z PROPS-END Revision-number: 3601 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.129438Z PROPS-END Revision-number: 3602 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.137679Z PROPS-END Revision-number: 3603 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.146773Z PROPS-END Revision-number: 3604 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.155825Z PROPS-END Revision-number: 3605 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.164433Z PROPS-END Revision-number: 3606 Prop-content-length: 115 Content-length: 115 K 7 svn:log V 15 putty.is.co.za K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-12-01T16:25:09.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f1ae2ab7ab0e322d018ae979ba16ef1f Text-delta-base-sha1: 18ba46858dc54107041f311d2f7e04bd2133c2bf Text-content-length: 70 Text-content-md5: 7314a7458c28d8afc0d551180efd2d11 Text-content-sha1: 4f1346a0d4bef59edd9e6bf4945e14e9b961d0c2 Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNWE-FA?Fis.co.za/">putty.is.co.za in South Africa Revision-number: 3607 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2003-12-01T16:39:17.000000Z K 7 svn:log V 22 Update i-d reference. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 73f1b01b2f78edc197f2e3fc84c98c54 Text-delta-base-sha1: 2dcc5eb91cfd796a4c6e6bb476a96fe0aef14154 Text-content-length: 65 Text-content-md5: 9767517e5a0c719bfa2a03ad7f692899 Text-content-sha1: d6574042423486feabbd1de2f40a7611fad70a83 Content-length: 104 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN1h1.txt">draft-ietf-secsh-scp-sftp-ssh-uri-01. Revision-number: 3608 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2003-12-01T17:53:20.000000Z K 7 svn:log V 37 putty.ru.ac.za (from last December!) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7314a7458c28d8afc0d551180efd2d11 Text-delta-base-sha1: 4f1346a0d4bef59edd9e6bf4945e14e9b961d0c2 Text-content-length: 70 Text-content-md5: 16333ec82b1b41d4a9ba5c38ae8cd3c4 Text-content-sha1: d9c3a955e26e6ca89a90786ba4d7b349c4b4bb06 Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVNE3-4A?4ru.ac.za/">putty.ru.ac.za in South Africa Revision-number: 3609 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2003-12-03T19:11:35.000000Z K 7 svn:log V 78 Summary: Logging settings are not saved with Default Settings Class: semi-bug K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/logging-save-default Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 535 Text-content-md5: 53b64301f6151b827147f967969fea09 Text-content-sha1: 679021f89b9f999df9d746591267bd443566d4a9 Content-length: 651 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN  Summary: Logging settings are not saved with Default Settings Present-in: 0.52 0.53 0.53b Class: semi-bug Difficulty: fun Priority: medium Currently the session logging settings are deliberately excluded when saving to "Default Settings". A workaround is to hack the Registry. This has been the case ever since proper logging was added. We suspect this is by design, and dates from before we had effective mechanisms to prevent log file clashes (the prompt-before-overwriting and the dynamic log-file name selection). Revision-number: 3610 Prop-content-length: 190 Content-length: 190 K 7 svn:log V 90 Fix for `logging-save-default': allow logging settings to be saved with Default Settings. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-12-03T19:17:14.000000Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c1a63b9d3ce6ddd97784cbbed3bf9af3 Text-delta-base-sha1: 0500ec9a77d44d65fc025333dc566eec96b739ed Text-content-length: 218 Text-content-md5: 031bc74da4b3c209bdb826846e4f206c Text-content-sha1: a62b84b452f524634c188b5d1ada9c2a24a5fd1c Content-length: 259 K 15 cvs2svn:cvs-rev V 5 1.114 PROPS-END SVN% ?'??] } write_setting_filename(sesskey, "LogFileName", cfg->logfilename); write_setting_i(sesskey, "LogType", cfg->logtype); write_setting_i(sesskey, "LogFileClash", cfg->logxfovr); Revision-number: 3611 Prop-content-length: 106 Content-length: 106 K 8 svn:date V 27 2003-12-03T19:17:45.000000Z K 7 svn:log V 7 Fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/logging-save-default Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 53b64301f6151b827147f967969fea09 Text-delta-base-sha1: 679021f89b9f999df9d746591267bd443566d4a9 Text-content-length: 39 Text-content-md5: ee585fcdf4e900a137409030334ae153 Text-content-sha1: 5f5e28a83e1c05ac262c13998bff83a67a215a82 Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN Z0YFixed-in: 2003-12-04 Revision-number: 3612 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:49.434915Z PROPS-END Revision-number: 3613 Prop-content-length: 198 Content-length: 198 K 7 svn:log V 98 Add a bit more detail about which IETF specs we claim to implement. Mention lack of spec for SCP. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-12-03T22:38:38.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3d4de6a7618e5fcc4ec665f823f32201 Text-delta-base-sha1: 3ee807265144fd3ef40e6edcdf5b255ec57dda75 Text-content-length: 390 Text-content-md5: 8894a6827683c65d9244f05a2d9fc90f Text-content-sha1: b2a1326232f7425a05511817d014f2a48741e410 Content-length: 430 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN-gT- - we claim to implement the following:

    • Core: architecture, transport, userauth, connect, assignednumbers
    • dh-group-exchange
    • auth-kbdinteract
    • break
    • fingerprint (expired)
    • publickeyfile
    • filexfer (expired) We don't know of a reference for the SCP protocol (which is basically BSD rcp). Revision-number: 3614 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 40 fflush(stdout) after each line of stats K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-12-03T22:45:32.000000Z PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 27e68f4c5bff6dd58a26f32f61974480 Text-delta-base-sha1: 2af8b97fea074880343e1a1b5a7bb421b3d3c69f Text-content-length: 39 Text-content-md5: 1937a0e1b0aa9e007aaa1ef65172e446 Text-content-sha1: 4552b39f430143ad21750ebfe28f14f74f6009ab Content-length: 80 K 15 cvs2svn:cvs-rev V 5 1.113 PROPS-END SVNas 5/2 fflush(stdout Revision-number: 3615 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2003-12-03T22:49:32.000000Z K 7 svn:log V 51 Add updating the wishlist to the Release checklist K 10 svn:author V 5 jacob PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e5cd7b9d2be7b2d3f8f19bcaada1f4bd Text-delta-base-sha1: 9dd8a124ef402323b37d69060478442a1f72e4a4 Text-content-length: 190 Text-content-md5: 91978fe8334870ada8fad48a21465663 Text-content-sha1: ff99252190ed84c005a010db9cace881456f0a2b Content-length: 230 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN"M &&&!Update the wishlist - all items that have been fixed since the last release should have their "Fixed-in:" headers updated to include the release version number. Revision-number: 3616 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2003-12-03T22:56:55.000000Z K 7 svn:log V 17 Unreviewed patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/emacs-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f54bb63c8b1fb375e80b292a9bde59fc Text-delta-base-sha1: 27d91cd3774d5c6199b9547313f0a7234e4650a9 Text-content-length: 72 Text-content-md5: a0c061241202a5b500b63b8c16750377 Text-content-sha1: bb0511bcb50a2c2a53499e63e1b745bec4649f18 Content-length: 111 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNd8d

      Patch (unreviewed): 3FB25127.9040101@endbracket.net Revision-number: 3617 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:51.454598Z PROPS-END Revision-number: 3618 Prop-content-length: 277 Content-length: 277 K 8 svn:date V 27 2003-12-03T23:25:48.000000Z K 7 svn:log V 176 Spotted by Tim Kosse: reput on an already complete file was hanging. Should be fixed now (we only wait for packets if we know there are some that haven't been replied to yet). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 064ed864f18e0449c5ee638fc5a996e1 Text-delta-base-sha1: 8a482b534b3968eff4a41208d2f1fd5543dee71e Text-content-length: 207 Text-content-md5: 2f32b3ba774af694980834cc057d41a9 Text-content-sha1: f55fbbb338b8c1ff3205f53b659e15d296b461cc Content-length: 247 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNq 4I4Xif (!xfer_done(xfer)) { pktin = sftp_recv(); ret = xfer_upload_gotpkt(xfer, pktin); if (!ret) { printf("error while writing: %s\n", fxp_error()); err = 1; } Revision-number: 3619 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 Fix from Michael Wardle in bell error message K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-12-03T23:32:47.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 44a943dbc50e352cb5a6ff76b4901c82 Text-delta-base-sha1: d41fb5a0e12b41611a7b11fa8aaef932678b7a4c Text-content-length: 44 Text-content-md5: 11c340f064120d6b208f07ad71e69476 Text-content-sha1: 93bf4fcee9f0dd8819bb33b6cf7fdb2b8ad46b3a Content-length: 85 K 15 cvs2svn:cvs-rev V 5 1.256 PROPS-END SVNfk HH.path Revision-number: 3620 Prop-content-length: 173 Content-length: 173 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-12-03T23:45:46.000000Z K 7 svn:log V 73 Add Kalle Olavi Niemitalo's musings (which match my vague recollections) PROPS-END Node-path: putty-wishlist/data/window-placement Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d03c3e452deb5c66811e29ed39bac41e Text-delta-base-sha1: dd462c44772ee4e0691ce753cf43a0eba4e8b337 Text-content-length: 227 Text-content-md5: 6b45ac7e8761b3fe197c2fb8ec0c68d7 Text-content-sha1: 5aef7e513b9134022f72331a560c03784246ca93 Content-length: 266 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN#sP#P Update: it's been suggested that AdjustWindowRect(Ex) is useful. We still need a device context for font metrics; we could get one from the desktop but that might break in the presence of multiple monitors. Revision-number: 3621 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2003-12-03T23:45:56.000000Z K 7 svn:log V 17 unreviewed patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 601fa2b27f4d2f0ff701718fd3dd41c4 Text-delta-base-sha1: 0bfa754e1f865bb0f1e670e5d1644bc4481186c0 Text-content-length: 90 Text-content-md5: f8b2bb8959a3280196d3e5c556d67d34 Text-content-sha1: 71d7e8a2a947a3da06df7200b0d029988932e0fb Content-length: 129 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNf/IfI

      Patch (unreviewed): 1067597353.3fa23e29bf70c@webmail.technion.ac.il Revision-number: 3622 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 44 tweak for consistency with previous checkin K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-12-04T00:10:07.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 11c340f064120d6b208f07ad71e69476 Text-delta-base-sha1: 93bf4fcee9f0dd8819bb33b6cf7fdb2b8ad46b3a Text-content-length: 44 Text-content-md5: 86226bccf92a5d2a4c4e405622a0e772 Text-content-sha1: 05fa500a8ac0cfad9ec37eac4b037965fc335544 Content-length: 85 K 15 cvs2svn:cvs-rev V 5 1.257 PROPS-END SVNkp </<.path Revision-number: 3623 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2003-12-04T00:35:19.000000Z K 7 svn:log V 78 Add a couple of items to cover the frequent requests we get re function keys. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/function-keys Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1653 Text-content-md5: 047a72e806ff5c2ec69978ffbfadccfe Text-content-sha1: 34c8f9a9b1810084ae5b932892454b0c3cd6ce80 Content-length: 1769 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNgggSummary: Function and other special keys don't do what people want Class: wish Difficulty: taxing Priority: low Content-type: text/x-html-body

      Many people have written to us to say that the function keys (or other `special' keys such as Home and End) don't do what they want, presumably in any of the numerous modes we provide.

      Mapping of keypresses to escape sequences seems to be a horrible morass. The simplest way out may actually be to implement `key-mapping'.

      If the function keys don't emit the sequence you want, you'll have to tell us what you think they should do. See FAQ A.6.17.

      The following list references emails where people have expressed actual opinions about the sequences we should send (and they're not completely weird), in case someone on the team is enthusiastic enough to try to spot patterns.

      • 018501c105fb$9670f580$6400000a@vt.pl
      • 007601c13c50$40fd31f0$2c01a8c0@jay
      • OF98035BD5.D98013EA-ON80256B83.002DA829@baplc.com
      • 83AAC73A5DA2244B9CD12C7AA2C309EB581112@srvsutt01.sis.co.uk
      • 3DB5CD3F.4E01FD26@libero.it
      • C1256C87.0030126E.00@mail.is.mumnet.com
      • A57B8265AC03994B8B598F1787237C152E52AD@m3rgda.gdansk.ad.pkobp.pl
      • DGENLILIJMJKHLPDEIBJMEBOCAAA.ejenner@sykescanada.com
      • 001101c35c27$7c9008c0$3d00c894@micro03
      • 3F9B7EA5.3050300@endbracket.net
      • 6.0.0.22.0.20031203140704.01da8008@mail.strasbourg.4js.com
      • etc, etc, etc.

      See also `xterm-keyboard' (although that claims to be full of lies). Node-path: putty-wishlist/data/modified-fkeys Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 456 Text-content-md5: 5139f8448d7c4d202aa4de23bc704d44 Text-content-sha1: c8729afb59c99eb64c97dbb236632b429607d2c3 Content-length: 572 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN:::Summary: Unique codes for modified function keys Class: wish Difficulty: taxing Content-type: text/x-html-body

      We occasionally get requests to provide unique escape sequences for function keys with more combinations of modifiers than we currently support (e.g., Fn, Shift+Fn, Ctrl+Fn and Ctrl+Shift+Fn).

      Sometimes it's even suggested what sequences these should send.

      See also `function-keys'. Revision-number: 3624 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:51.889453Z PROPS-END Revision-number: 3625 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2003-12-04T20:08:40.000000Z K 7 svn:log V 17 Further thoughts K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/function-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 047a72e806ff5c2ec69978ffbfadccfe Text-delta-base-sha1: 34c8f9a9b1810084ae5b932892454b0c3cd6ce80 Text-content-length: 175 Text-content-md5: bad754cc27945ca6f2241b81a3f96c94 Text-content-sha1: c68751eef333483aef23fc89f9fee2a2a5b95eef Content-length: 214 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNg {nyOtherwise we end up filling the entire `Keyboard' panel with options for everyone's favourite key mapping (perhaps we should move to a drop-down list?) Node-path: putty-wishlist/data/modified-fkeys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5139f8448d7c4d202aa4de23bc704d44 Text-delta-base-sha1: c8729afb59c99eb64c97dbb236632b429607d2c3 Text-content-length: 148 Text-content-md5: 47d34a5957ec9072b6cff6c3ac6b6749 Text-content-sha1: 8600ffae65cdce6235096933c0b9d66dfc31c102 Content-length: 187 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN:7{P+OnAyPriority: low(`xterm-keyboard' has some suggests, but also claims not to be trustworthy.) Revision-number: 3626 Prop-content-length: 124 Content-length: 124 K 7 svn:log V 24 Implementation thoughts K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-12-04T21:21:25.000000Z PROPS-END Node-path: putty-wishlist/data/right-alt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 49b5c1dac1a1989689cbb221d4033884 Text-delta-base-sha1: eb701b0c2c97fae9618a5fc55afae55ef227a6cc Text-content-length: 561 Text-content-md5: 3f6658558115162ba25feca5d4eaabe6 Text-content-sha1: 9509921e60f86fb30fdb2e37025de56f87853cde Content-length: 600 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN9W9

      We might be able to make a guess by comparing the result of GetKeyboardLayout() to known values from the table of language identifiers, but this is flaky enough that it'd want to be a On/Off/Auto option and may not be worth the effort. Revision-number: 3627 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2003-12-04T21:28:05.000000Z K 7 svn:log V 39 Summary: Progress indication for PSFTP K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-progress Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 167 Text-content-md5: 75d7dddff47911ad789343291bb01808 Text-content-sha1: 4dcbd47673b98a74eeeb38a00daf470f11bcff83 Content-length: 283 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Progress indication for PSFTP Class: wish Difficulty: fun Priority: medium Patch (unreviewed): 200310031408.h93E8Go7028177@alumnus.caltech.edu Revision-number: 3628 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2003-12-05T00:01:36.000000Z K 7 svn:log V 37 Update with recent IETF discussions. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-kex-data Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 00bcf20a9e677a913e83aa40d38e08bf Text-delta-base-sha1: 6116547b1e9a6cb27dc55a8f47202bd2f170c9aa Text-content-length: 700 Text-content-md5: 9dcdfde69e1ee4dded2c644b83d57bdd Text-content-sha1: 1245e4a0fbee2e80f5c05fab9c70b30a01be77ea Content-length: 739 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN|!6a:k(repeated):

      • Thread 'Key Re-Exchange' starting 4 Apr 2001
      • Thread 'Some questions about "SSH Transport Layer Encryption Modes"' starting 16 Oct 2003
      • Thread 'data during rekey?' starting 1 Dec 2003

      The consensus seems to be drifting towards "suspending transport of user data while rekey negotiation is in progress", and having any nonblocking rekey as a protocol extension; but as of version -17 of the transport draft there's no sign of this appearing in the actual documents. People have also muttered about the receiving end continuing to accept data encrypted using the "old" keys; presumably some limit would want to be placed on that Revision-number: 3629 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:52.338963Z PROPS-END Revision-number: 3630 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:52.347041Z PROPS-END Revision-number: 3631 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:52.356519Z PROPS-END Revision-number: 3632 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:52.365464Z PROPS-END Revision-number: 3633 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:52.373963Z PROPS-END Revision-number: 3634 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:52.382677Z PROPS-END Revision-number: 3635 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:52.391579Z PROPS-END Revision-number: 3636 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:52.400766Z PROPS-END Revision-number: 3637 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:52.409891Z PROPS-END Revision-number: 3638 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2003-12-10T22:09:02.000000Z K 7 svn:log V 37 http://simplygeek.com/mirrors/putty/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 16333ec82b1b41d4a9ba5c38ae8cd3c4 Text-delta-base-sha1: d9c3a955e26e6ca89a90786ba4d7b349c4b4bb06 Text-content-length: 75 Text-content-md5: eabf29d891443ea0903ab162134395cd Text-content-sha1: 126398f7414f9966fcd08e8921adf84a24519093 Content-length: 115 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN3)2xD|;xsimplygeek.com/mirrors/putty/">simplygeek.com Revision-number: 3639 Prop-content-length: 202 Content-length: 202 K 7 svn:log V 101 ftp.sergei.cc mirror of snapshots. (Don't know why this wasn't here already; it's on my other list.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-12-11T14:22:46.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eabf29d891443ea0903ab162134395cd Text-delta-base-sha1: 126398f7414f9966fcd08e8921adf84a24519093 Text-content-length: 147 Text-content-md5: 088562ea98b3ef727885be88ff92911c Text-content-sha1: bcd186a78dd87fb83feb599ea07499b7740ca62f Content-length: 187 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVN)LxN8hAftp.sergei.cc/pub/putty-snapshots/">sergei.cc in Sweden.ftp.sergei.cc/pub/putty-snapshots/">sergei.cc in Sweden. Revision-number: 3640 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:52.497946Z PROPS-END Revision-number: 3641 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2003-12-16T14:34:00.000000Z K 7 svn:log V 23 putty.mirror.nextit.nl K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 088562ea98b3ef727885be88ff92911c Text-delta-base-sha1: bcd186a78dd87fb83feb599ea07499b7740ca62f Text-content-length: 62 Text-content-md5: 89bd17a3454e6fa91fa05037f93539df Text-content-sha1: 5736a741279e9532930c5679bb5c816d76166ce7 Content-length: 102 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVNLM%>\w>mirror.nextit.nl/">putty.mirror.nexti Revision-number: 3642 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2003-12-16T14:36:20.000000Z K 7 svn:log V 6 patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vstudio-project Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 88d591bcaba092f878c5e95aaf3ac089 Text-delta-base-sha1: acf4ec3f8f5301ef51169c47ceaf71f45a1cdf9e Text-content-length: 69 Text-content-md5: 6626954a28379d81fb05d36da7e9ecad Text-content-sha1: 6b057774229dc5d49aeaeb617e91bab3989ce34b Content-length: 108 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNL5

      Patch (unreviewed): 3FD5C596.2030606@bidsnc.com Revision-number: 3643 Prop-content-length: 118 Content-length: 118 K 7 svn:log V 19 Probably is a bug. K 10 svn:author V 4 owen K 8 svn:date V 27 2003-12-16T15:04:34.000000Z PROPS-END Node-path: putty-wishlist/data/psftp-load-ignores-proxy Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 556 Text-content-md5: 986c604fa70cfb1c18d0f762f8244ef7 Text-content-sha1: a6f653bb178bde678c2a32141be6ddd606429ab1 Content-length: 672 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: pscp -load and psftp -load ignore proxy configuration Class: bug Difficulty: tricky Priority: medium Present-in: 2003-10-13 0.53b Content-type: text/plain When a saved session is used with pscp or psftp with: pscp -load sessionname user@host:path localpath psftp -load sessionname user@host ...any proxy settings from the saved session are ignored. However, if a saved session is used as the host (documented in the pscp manual section), pscp and psftp use the proxy correctly: pscp sessionname:path localpath psftp sessionname Revision-number: 3644 Prop-content-length: 313 Content-length: 313 K 8 svn:date V 27 2003-12-16T18:28:43.000000Z K 7 svn:log V 212 Andy Hood points out that `#ifdef MONITOR_DEFAULTTONEAREST' would benefit from _also_ being conditional on NO_MULTIMON not being defined, to prevent the possibility of only half the multimon code being included. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 86226bccf92a5d2a4c4e405622a0e772 Text-delta-base-sha1: 05fa500a8ac0cfad9ec37eac4b037965fc335544 Text-content-length: 100 Text-content-md5: 3a62a6c529b8f4cb3baa0d0730e621dd Text-content-sha1: 5fad6ba41ca873114902ce7a39e6603ccd5dddd9 Content-length: 141 K 15 cvs2svn:cvs-rev V 5 1.258 PROPS-END SVNp ;D, defined(MONITOR_DEFAULTTONEAREST) && !defined(NO_MULTIMON) Revision-number: 3645 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.115532Z PROPS-END Revision-number: 3646 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.124198Z PROPS-END Revision-number: 3647 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.132403Z PROPS-END Revision-number: 3648 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.140949Z PROPS-END Revision-number: 3649 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.149550Z PROPS-END Revision-number: 3650 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2003-12-19T12:44:46.000000Z K 7 svn:log V 33 Joe Yates's memory leak patches. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a1ba79b072633f26273e77747ca7099e Text-delta-base-sha1: 06ea905731064705876cf83a5a43e0f7b3e4aeb9 Text-content-length: 134 Text-content-md5: 50139411975c19f8f7cd70042bac758d Text-content-sha1: 8657cb544590a30cfa421920951d552909c13fba Content-length: 174 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN5* pipQdvoid cmdline_cleanup(void) { int pri; for (pri = 0; pri < NPRIORITIES; pri++) sfree(saves[pri].params) Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2f32b3ba774af694980834cc057d41a9 Text-delta-base-sha1: f55fbbb338b8c1ff3205f53b659e15d296b461cc Text-content-length: 872 Text-content-md5: 769afea7125fca97e06f91eabaa8677d Text-content-sha1: 7e9ccbf8f5dbed6599d6e9a91cfadc6896cb5794 Content-length: 912 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN^C_n\>cV-} s.\Tfvoid do_sftp_cleanup(dupstr("!"); cmd->words[1] = dupstr(p+1)dupstr(q); } } sfree(line);_cleanup() { char ch; back->special(backhandle, TS_EOF); sftp_recvdata(&ch, 1); back->free(backhandle); sftp_cleanup_request(); if (pwd) { sfree(pwd); pwd = NULL; } if (homedir) { sfree(homedir); homedir = NULL; }ret = cmd->obey(cmd); if (cmd->words) { int i; for(i = 0; i < cmd->nwords; i++) sfree(cmd->words[i]); sfree(cmd->words); } sfree(cmd); if (retif (realhost != NULL) sfree(nt ret; ret = psftp_connect(userhost, user, portnumber); sfree(userhost); if (ret cmdline_cleanup(); console_provide_logctx(NULL); do_sftp_cleanup(); backhandle = NULL; back = NULL; sk_cleanup(); return 0; } Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0409d3370d0657d7a223d6b452545a9e Text-delta-base-sha1: da8f4ff54d9d145ffba4bc872849cd7885de4a86 Text-content-length: 50 Text-content-md5: 699f9a4c715a6ea56f711a8c1497e32d Text-content-sha1: 8f6ee6c8db85a5bfa55035aac3f7c55e93366f05 Content-length: 91 K 15 cvs2svn:cvs-rev V 5 1.224 PROPS-END SVN0  void cmdline_cleanup(void Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1937a0e1b0aa9e007aaa1ef65172e446 Text-delta-base-sha1: 4552b39f430143ad21750ebfe28f14f74f6009ab Text-content-length: 206 Text-content-md5: 59ca07316cae555e80e654eb2d4dd0bf Text-content-sha1: 07b5ae82755c81f74ede836a19e2c83fff289255 Content-length: 247 K 15 cvs2svn:cvs-rev V 5 1.114 PROPS-END SVNs8J8cmdline_cleanup(); console_provide_logctx(NULL); back->free(backhandle); backhandle = NULL; back = NULL; sk_cleanup(); return (errs == 0 ? 0 : 1); } /* end */ Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4ccdf2d137d3d1d2de7e3f7ef7f02374 Text-delta-base-sha1: db693f8f5f1130dd6c309a3fa7e0f4e1f010ff51 Text-content-length: 139 Text-content-md5: cdd922e39b55c1feaa7e5eb4e9f07bf9 Text-content-sha1: bc574cb644725f2d9759b9861f38620caa733b92 Content-length: 179 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN r=ri/cleanup_request(void) { if (sftp_requests == NULL) { freetree234(sftp_requests); sftp_requests = NULL; } Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d391ac1994047da612144d7288536f93 Text-delta-base-sha1: 09bc19db93afee027fb03c0d9f9a5222e58cff69 Text-content-length: 80 Text-content-md5: 6921e22d4f4261d8e33f8b269f256970 Text-content-sha1: 6276419f3d2e2b36dbbde4a330557b6db0b3236c Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN=| ; 7/* * Free sftp_requests */ void sftp_cleanup_request(void Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e3b407abb88726540c31fface6cb8d22 Text-delta-base-sha1: 1b4f27ee446a2c5c71ba1e36d57de80063788acf Text-content-length: 1187 Text-content-md5: bda318d2973c53c0e5be9ea43d738dd6 Text-content-sha1: ea8adf7b78fb20e59130e1a1346645d1fb94a62e Content-length: 1228 K 15 cvs2svn:cvs-rev V 5 1.303 PROPS-END SVN`M4 [;if (servkey.modulus) { sfree(servkey.modulus); servkey.modulus = NULL; } if (servkey.exponent) { sfree(servkey.exponent); servkey.exponent = NULL; } if (hostkey.modulus) { sfree(hostkey.modulus); hostkey.modulus = NULL; } if (hostkey.exponent) { sfree(hostkey.exponent); hostkey.exponent = NULL; } sfree(randomstr-*zj EE K^OL, 0, 0);/* cause ldisc to notice changes */ ssh->send_ok = 1; ssh->channels = newtree234(ssh_channelcmp); while (1) { crReturnV; if (ispkt) { if (ssh->pktin.type == SSH1_SMSG_STDOUT_DATA || ssh->pktin.type == SSH1_SMSG_STDERR_DATA) { long len = GET_32BIT(ssh->pktin.body); int bufsize = from_backend(ssh->frontend, ssh->pktin freebn(s->f); freebn(s->g); freebn(s->K); freebn(s->pif (ssh->pktout.data) { sfree(ssh->pktout.data); ssh->pktout.data = NULL; } if (ssh->pktin.data) { sfree(ssh->pktin.data); ssh->pktin.data = NULL; } if (ssh->crcda_ctx) { crcda_free_context(ssh->crcda_ctx); ssh->crcda_ctx = NULL; } if (ssh->logctx) { log_free(ssh->logctx); ssh->logctx = NULL; } Node-path: putty/sshcrcda.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7cefaf7c5653c727e4d2afc7781b0c89 Text-delta-base-sha1: d6f3065d1b9f099e0158b4e8a09cb6a28376a321 Text-content-length: 138 Text-content-md5: 1da5117b787a57d5cd0ed9cb118b5e78 Text-content-sha1: 62cdf08132eefa68ef93049140508f2eeb30c4fe Content-length: 177 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN<# tt"truct crcda_ctx *ctx = (struct crcda_ctx *)handle; if (ctx) { sfree(ctx->h); ctx->h = NULL; sfree(ctx); } Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8051db1c0fbc69975b0c533a96844172 Text-delta-base-sha1: 970d341e9ae78141ba6dd7d0ba97fc72f44e38e6 Text-content-length: 41 Text-content-md5: b340b1c8615418caabf3cfe246eb18b6 Text-content-sha1: a5484035d92ec607a1b8cec7aa22b870e06bdc3a Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNz cb freebn(out); Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aecc2efbf69cb7ef10be690dd04cdde8 Text-delta-base-sha1: d1c52fffe98c50c8c415e02e18dc0ea60ee2b41a Text-content-length: 61 Text-content-md5: d1f168cb4158d4a8134443d5e5ae9700 Text-content-sha1: 572854f339bd73ff5438de8b918e5bbcf9e32de4 Content-length: 101 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVNTz %"3! freetree234(sktree); sktree = NULL; Revision-number: 3651 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2003-12-19T13:55:16.000000Z K 7 svn:log V 86 Re-add putty.nl, as it has now been freshened at our request (and should stay fresh). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 89bd17a3454e6fa91fa05037f93539df Text-delta-base-sha1: 5736a741279e9532930c5679bb5c816d76166ce7 Text-content-length: 45 Text-content-md5: 050fc685a703c2e8a011850b99b5de97 Text-content-sha1: 1c422f66e59638ff80b1399c91045fb48712c6a7 Content-length: 85 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVNM68[y>www.putty.nl/">putty Revision-number: 3652 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.712014Z PROPS-END Revision-number: 3653 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.721038Z PROPS-END Revision-number: 3654 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.729758Z PROPS-END Revision-number: 3655 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.737969Z PROPS-END Revision-number: 3656 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.746167Z PROPS-END Revision-number: 3657 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.754445Z PROPS-END Revision-number: 3658 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.763803Z PROPS-END Revision-number: 3659 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.773940Z PROPS-END Revision-number: 3660 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.782231Z PROPS-END Revision-number: 3661 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.790529Z PROPS-END Revision-number: 3662 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.798723Z PROPS-END Revision-number: 3663 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.807348Z PROPS-END Revision-number: 3664 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.815991Z PROPS-END Revision-number: 3665 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.824265Z PROPS-END Revision-number: 3666 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.833126Z PROPS-END Revision-number: 3667 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.842235Z PROPS-END Revision-number: 3668 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.851422Z PROPS-END Revision-number: 3669 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.860164Z PROPS-END Revision-number: 3670 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.870034Z PROPS-END Revision-number: 3671 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.878754Z PROPS-END Revision-number: 3672 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:53.887304Z PROPS-END Revision-number: 3673 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2003-12-31T16:09:55.000000Z K 7 svn:log V 147 D'oh! WideFont and WideBoldFont were being read from session files, but not written. I _thought_ something odd was happening with my UTF-8 pterms. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 031bc74da4b3c209bdb826846e4f206c Text-delta-base-sha1: a62b84b452f524634c188b5d1ada9c2a24a5fd1c Text-content-length: 131 Text-content-md5: 7653d4d4d3c3a631d716db20688708dc Text-content-sha1: e7f7f661fd3da9882d154d2d3f2b0f0fc581988c Content-length: 172 K 15 cvs2svn:cvs-rev V 5 1.115 PROPS-END SVN%- kzkH]fontspec(sesskey, "WideFont", cfg->widefont); write_setting_fontspec(sesskey, "WideBoldFont", cfg->wide Revision-number: 3674 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:54.139126Z PROPS-END Revision-number: 3675 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:54.147892Z PROPS-END Revision-number: 3676 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:54.156697Z PROPS-END Revision-number: 3677 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:54.165187Z PROPS-END Revision-number: 3678 Prop-content-length: 381 Content-length: 381 K 8 svn:date V 27 2004-01-01T16:42:48.000000Z K 7 svn:log V 280 Joe Yates's memory leak patch was overenthusiastically freeing things; it called freebn on the DH gex values even if DH gex had not taken place. Bug was trivially reproducible as a NULL-dereference segfault by making any SSH2 connection with DH gex disabled. Should now be fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bda318d2973c53c0e5be9ea43d738dd6 Text-delta-base-sha1: ea8adf7b78fb20e59130e1a1346645d1fb94a62e Text-content-length: 128 Text-content-md5: bf18e70ab10ab69464ab76f1f59900a1 Text-content-sha1: c8b6a5385bdc67d2c5653f71acc2dd3068423ca4 Content-length: 169 K 15 cvs2svn:cvs-rev V 5 1.304 PROPS-END SVN*XUUl>K); if (ssh->kex == &ssh_diffiehellman_gex) { freebn(s->g); freebn(s->p); } Revision-number: 3679 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2004-01-01T16:47:55.000000Z K 7 svn:log V 17 It's a new year. K 10 svn:author V 5 simon PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8480a3117fc44c3ab9f9bc7eef25a031 Text-delta-base-sha1: 59ccc8dd5387e2b4434ccfa2a0f2868600c45273 Text-content-length: 44 Text-content-md5: cd877aaa57cb972c3386a66bbfa738e8 Text-content-sha1: 69dfe82980dffc686363ad7b4ba618574996c63c Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNTT8PuTTY is copyright 1997-2004 Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 953a519a94a697144faf748a7d73884f Text-delta-base-sha1: 637d510514936306ec91024fff09a792af8e6236 Text-content-length: 57 Text-content-md5: f6fa1f40c4d8531ed51aceebb55ef5f0 Text-content-sha1: 1e920d335f1bb60cf985320658a56f7eecd51154 Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN #E.F49 2004/01/01 16:47:48 simon Exp $ Node-path: putty/doc/licence.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4ecd7c05cf584ad3b646fd88dd606cf1 Text-delta-base-sha1: b56d4ddb448650ed28c1f9b7ae2cf57d53140ad2 Text-content-length: 139 Text-content-md5: bda2960a524596fdbbdbb948eca0b994 Text-content-sha1: 567d23181a2fcb6b3879af7e430ead746a601b2a Content-length: 178 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN&&zz,z\versionid $Id: licence.but,v 1.6 2004/01/01 16:47:48 simon Exp $ \A{licence} PuTTY Licence PuTTY is copyright 1997-2004 Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ac89e6d4f7b742902ffba190736b124a Text-delta-base-sha1: 1f3fe1599d55fe6ab37640ac10ec17b4fa5679c4 Text-content-length: 76 Text-content-md5: 3e0a2f46bd7123c9c9939858433b7746 Text-content-sha1: f7e8b3b04f64739a57f03ff3c747713ddc803f3b Content-length: 116 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN  2i/t/* $Id: mac_res.r,v 1.40 2004/01/01 16:47:48 simo4 Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 78ed0f40441f4c80317ba386df7bf5d9 Text-delta-base-sha1: cfd0c6fe1bf0e4fbb876914e51767592f6ccc806 Text-content-length: 29 Text-content-md5: e5bf43efeb35ba986fd016c82976dbf0 Text-content-sha1: f0f03387d36a96a0e4575d6bd9a442edd10ef139 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNqq6L7m44 Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f76c4ee1902ad5229e1d7d20482cce08 Text-delta-base-sha1: 52b861cdc6be95fc2e38bee4275914af7bbd6e2e Text-content-length: 29 Text-content-md5: a047fa36b0355b74be95a061050fde94 Text-content-sha1: 92bb1ddc4b04bbfc01f5552837cd8a6404b2fa73 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN%%iLjn744 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 481ab9d8d51320f92a3f8fc9480e3e25 Text-delta-base-sha1: 00e7c0c135bbdc88cb6e17d2eed30e00b1d60f73 Text-content-length: 34 Text-content-md5: 5027d5b2079f5f8c12e160061ae4af80 Text-content-sha1: 0933d661f3bc543e58708997e6351311b618a9ac Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN00%&v:44 Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c43304c2cd89aae3f543b9f69d374f2b Text-delta-base-sha1: ea5730c48bea16ea65e18eab6ab8b57c64cc4411 Text-content-length: 29 Text-content-md5: c900887b574adc896fc62d1d317f4d2a Text-content-sha1: e8add7dd6e3643a288f982378f81d3f4fb1a1f2b Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNrrBCCk44 Node-path: putty-website/licence.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a89680ab65c0e419c8e1e78fad50f9f4 Text-delta-base-sha1: d55d4a9e013ccb5088e8a957a6fb09398a011d34 Text-content-length: 22 Text-content-md5: 2ec872d49670180f244b0772e39676a2 Text-content-sha1: ad7759210002d9054caa9990822e6074d8fe74de Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN33 OcP4 Revision-number: 3680 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:54.995895Z PROPS-END Revision-number: 3681 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.004062Z PROPS-END Revision-number: 3682 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.013584Z PROPS-END Revision-number: 3683 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.021804Z PROPS-END Revision-number: 3684 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.030404Z PROPS-END Revision-number: 3685 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.039046Z PROPS-END Revision-number: 3686 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.047371Z PROPS-END Revision-number: 3687 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.055719Z PROPS-END Revision-number: 3688 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.063838Z PROPS-END Revision-number: 3689 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.071992Z PROPS-END Revision-number: 3690 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.080461Z PROPS-END Revision-number: 3691 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.090192Z PROPS-END Revision-number: 3692 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.099362Z PROPS-END Revision-number: 3693 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.108243Z PROPS-END Revision-number: 3694 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.116469Z PROPS-END Revision-number: 3695 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.125652Z PROPS-END Revision-number: 3696 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.136045Z PROPS-END Revision-number: 3697 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 couple of new mirrors K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-01-05T21:50:34.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 050fc685a703c2e8a011850b99b5de97 Text-delta-base-sha1: 1c422f66e59638ff80b1399c91045fb48712c6a7 Text-content-length: 163 Text-content-md5: 9890358bcfd4d1d1c05afd05ca06fd17 Text-content-sha1: 11671171dbd71787acd350391914ccb2486d164b Content-length: 203 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN6,~Q WM}Tbmirrors.ispgaya.pt/putty/">mirrors.ispgaya.pt in Portugal.putty.mirrors.redwire.net/">putty.mirrors.redwire Revision-number: 3698 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.233956Z PROPS-END Revision-number: 3699 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.243312Z PROPS-END Revision-number: 3700 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 putty.nobandwidth.net K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-01-07T22:40:06.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9890358bcfd4d1d1c05afd05ca06fd17 Text-delta-base-sha1: 11671171dbd71787acd350391914ccb2486d164b Text-content-length: 60 Text-content-md5: 3b6d0f4898bb3e9274b7e6aa40f7ea2d Text-content-sha1: 7b03eaafa278335781069994bf32c1192c64a87f Content-length: 100 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVN,"#`MsRZnobandwidth.net/">putty.nobandwidth Revision-number: 3701 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.343227Z PROPS-END Revision-number: 3702 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.352480Z PROPS-END Revision-number: 3703 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.362447Z PROPS-END Revision-number: 3704 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.371567Z PROPS-END Revision-number: 3705 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2004-01-09T12:18:00.000000Z K 7 svn:log V 79 Summary: Perhaps PSCP should permit multiple remote sources Difficulty: tricky K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pscp-multi-remote-src Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 870 Text-content-md5: f8bf3e8d67c2a0b87f1319ab93a267d2 Text-content-sha1: 94f9cbc0098e78ed1f3eaa4b8d5f9f4ec0911c5c Content-length: 986 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNXXXSummary: Perhaps PSCP should permit multiple remote sources Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body

      PSCP currently has no local way of specifying multiple remote files explicitly (rather than with wildcards). (If it's using the SCP backend, you may be able to use remote, unsafe, wildcards or shell constructs.)

      i.e. you can't do

      pscp server:file1 server:file2 server:another_file localdir

      In order for this syntax to be more useful than multiple separate invocations of PSCP, we'd have to be slightly clever to group requests to the same server and avoid multiple sessions/re-authentications.

      (Or perhaps we could add brace expansion to the set of local "wildcards" we support, for the SFTP backend at least.) Revision-number: 3706 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.672512Z PROPS-END Revision-number: 3707 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.682556Z PROPS-END Revision-number: 3708 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.691319Z PROPS-END Revision-number: 3709 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.700853Z PROPS-END Revision-number: 3710 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.709732Z PROPS-END Revision-number: 3711 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:55.718708Z PROPS-END Revision-number: 3712 Prop-content-length: 171 Content-length: 171 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-01-12T18:55:52.000000Z K 7 svn:log V 71 i-ownur.info replaced by leakage.org (on request from plausible admin) PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b6d0f4898bb3e9274b7e6aa40f7ea2d Text-delta-base-sha1: 7b03eaafa278335781069994bf32c1192c64a87f Text-content-length: 52 Text-content-md5: 16b67e47d24c59360101c0b4d8e2182f Text-content-sha1: 95cfd53bc5e09ec3c3885e2fb942f76d98c1cf82 Content-length: 92 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVN" Z'{leakage.org/">putty.leakage.org Revision-number: 3713 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:56.488853Z PROPS-END Revision-number: 3714 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:56.498346Z PROPS-END Revision-number: 3715 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:56.507521Z PROPS-END Revision-number: 3716 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:56.515856Z PROPS-END Revision-number: 3717 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:56.524314Z PROPS-END Revision-number: 3718 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:56.534101Z PROPS-END Revision-number: 3719 Prop-content-length: 357 Content-length: 357 K 8 svn:date V 27 2004-01-17T13:00:18.000000Z K 7 svn:log V 256 Idiot me! store_host_key() was blindly _appending_ new host keys to the end of the host key file. This is perfectly all right if a host key never changes, but it's completely useless if you need to replace an existing entry. This version should do better. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b569e82870622aa924b5e03ba61e91eb Text-delta-base-sha1: 9555e2ee6b08b87b5b16263152fca2ebb7172419 Text-content-length: 1084 Text-content-md5: 43048e0ee43be8ed6aae693f119d8e92 Text-content-sha1: ab9fa338e7f6824b6517bd4f3ae13c7f5c0137ea Content-length: 1124 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN{$ eHOSTKEYS_TMPHOSTKEYS_TMP ? "/.putty/sshhostkeys.tmprfp, *wfp; char *newtext, *line; int headerlen; char filename[FILENAME_MAX], tmpfilename[FILENAME_MAX]; newtext = dupprintf("%s@%d:%s %s\n", keytype, port, hostname, key); headerlen = 1 + strcspn(newtext, " "); /* count the space too */ /* * Open both the old file and a new file. */ make_filename(filename, INDEX_HOSTKEYS, NULL); rfp = fopen(filename, "r"); if (!rfp) return; make_filename(tmpfilename, INDEX_HOSTKEYS_TMP, NULL); wfp = fopen(tmpfilename, "w"); if (!wfp) { fclose(rfp); return; } /* * Copy all lines from the old file to the new one that _don't_ * involve the same host key identifier as the one we're adding. */ while ( (line = fgetline(rfp)) ) { if (strncmp(line, newtext, headerlen)) fputs(line, wfp); } /* * Now add the new line at the end. */ fputs(newtext, wfp); fclose(rfp); fclose(wfp); rename(tmpfilename, filename); sfree(newtext Revision-number: 3720 Prop-content-length: 295 Content-length: 295 K 7 svn:log V 194 So _that's_ why mkfiles.pl was running so slowly on my Windows box! &findfile() now caches its results. At least one full order of magnitude speedup when running on an SMB-mounted volume. Phew. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-01-17T13:24:59.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a5c6c96a398800417e5cadf36d3fd1d Text-delta-base-sha1: 4887655db45c8e5fa49a36748f3fbc59477dcfa9 Text-content-length: 304 Text-content-md5: 8d87407131e20f10d99d467ddc4e9595 Text-content-sha1: 8bd32a0fb9f1895b4d06f3f2c6eb2265f7f3dab1 Content-length: 344 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVN~k M uunless (defined $findfilecache{$name}) { $i = 0; foreach $dir (@incdirs) { $outdir = $dir, $i++ if -f "$dir$name"; } die "multiple instances of source file $name\n" if $i > 1; $findfilecache{$name} = $outdir . $name; } return $findfilecache{$name} Revision-number: 3721 Prop-content-length: 340 Content-length: 340 K 8 svn:date V 27 2004-01-17T13:48:40.000000Z K 7 svn:log V 239 Joe Yates's patch to make mkfiles.pl generate Visual Studio project files as well as an nmake makefile. Needed line-end tweakery in order to be able to generate usable project files when run on Unix, but other than that appears fine. Ooh! K 10 svn:author V 5 simon PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 20ad25e712661baddc9c7fb764e5875d Text-delta-base-sha1: e45df54289ba71aaf5b4117d7c340f4dab5bfa18 Text-content-length: 551 Text-content-md5: 3315a41aec30d14d08a99af28f7d8a41 Text-content-sha1: d343f0226ae4ff39fb25112d820732d0c823d24f Content-length: 591 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN8;~^DlSea variety of Makefiles and equivalents: - Makefile.vc is for command-line builds on MS Visual C++ systems. Type `nmake -fInside the MSVC subdirectory are MS Visual Studio project files for doing GUI-based builds of the various PuTTY utilities. These have been tested on Visual Studio 6. You should be able to build each PuTTY utility by loading the corresponding .dsp file in Visual Studio. For example, MSVC/putty/putty.dsp builds PuTTY itself, MSVC/plink/plink.dsp builds Plink, and so on. Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8d87407131e20f10d99d467ddc4e9595 Text-delta-base-sha1: 8bd32a0fb9f1895b4d06f3f2c6eb2265f7f3dab1 Text-content-length: 8593 Text-content-md5: 33baad076e61d9ec8cb6cdb45cf2a281 Text-content-sha1: 07bf2021585ce684bb185ade0fff935a8d6f31e1 Content-length: 8633 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVNki whw aMSVC 6 Workspace and projects # # Note: All files created in this section are written in binary # mode, because although MSVC's command-line make can deal with # LF-only line endings, MSVC project files really _need_ to be # CRLF. Hence, in order for mkfiles.pl to generate usable project # files even when run from Unix, I make sure all files are binary # and explicitly write the CRLFs. # # Create directories if necessary mkdir 'MSVC' if(! -d 'MSVC'); chdir 'MSVC'; @deps = &deps("X.obj", "X.res", "", "\\"); %all_object_deps = map {$_->{obj} => $_->{deps}} @deps; # Create the project files # Get names of all Windows projects (GUI and console) my @prognames = &prognames("GC"); foreach $progname (@prognames) { create_project(\%all_object_deps, $progname); } # Create the workspace file open OUT, ">putty.dsw"; binmode OUT; select OUT; print "Microsoft Developer Studio Workspace File, Format Version 6.00\r\n". "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r\n". "\r\n". "###############################################################################\r\n". "\r\n"; # List projects foreach $progname (@prognames) { ($windows_project, $type) = split ",", $progname; print "Project: \"$windows_project\"=\".\\$windows_project\\$windows_project.dsp\" - Package Owner=<4>\r\n"; } print "\r\n". "Package=<5>\r\n". "{{{\r\n". "}}}\r\n". "\r\n". "Package=<4>\r\n". "{{{\r\n". "}}}\r\n". "\r\n". "###############################################################################\r\n". "\r\n". "Global:\r\n". "\r\n". "Package=<5>\r\n". "{{{\r\n". "}}}\r\n". "\r\n". "Package=<3>\r\n". "{{{\r\n". "}}}\r\n". "\r\n". "###############################################################################\r\n". "\r\n"; select STDOUT; close OUT; chdir '..'; sub create_project { my ($all_object_deps, $progname) = @_; # Construct program's dependency info %seen_objects = (); %lib_files = (); %source_files = (); %header_files = (); %resource_files = (); @object_files = split " ", &objects($progname, "X.obj", "X.res", "X.lib"); foreach $object_file (@object_files) { next if defined $seen_objects{$object_file}; $seen_objects{$object_file} = 1; if($object_file =~ /\.lib$/io) { $lib_files{$object_file} = 1; next; } $object_deps = $all_object_deps{$object_file}; foreach $object_dep (@$object_deps) { if($object_dep =~ /\.c$/io) { $source_files{$object_dep} = 1; next; } if($object_dep =~ /\.h$/io) { $header_files{$object_dep} = 1; next; } if($object_dep =~ /\.(rc|ico)$/io) { $resource_files{$object_dep} = 1; next; } } } $libs = join " ", sort keys %lib_files; @source_files = sort keys %source_files; @header_files = sort keys %header_files; @resources = sort keys %resource_files; ($windows_project, $type) = split ",", $progname; mkdir $windows_project if(! -d $windows_project); chdir $windows_project; $subsys = ($type eq "G") ? "windows" : "console"; open OUT, ">$windows_project.dsp"; binmode OUT; select OUT; print "# Microsoft Developer Studio Project File - Name=\"$windows_project\" - Package Owner=<4>\r\n". "# Microsoft Developer Studio Generated Build File, Format Version 6.00\r\n". "# ** DO NOT EDIT **\r\n". "\r\n". "# TARGTYPE \"Win32 (x86) Application\" 0x0101\r\n". "\r\n". "CFG=$windows_project - Win32 Debug\r\n". "!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r\n". "!MESSAGE use the Export Makefile command and run\r\n". "!MESSAGE \r\n". "!MESSAGE NMAKE /f \"$windows_project.mak\".\r\n". "!MESSAGE \r\n". "!MESSAGE You can specify a configuration when running NMAKE\r\n". "!MESSAGE by defining the macro CFG on the command line. For example:\r\n". "!MESSAGE \r\n". "!MESSAGE NMAKE /f \"$windows_project.mak\" CFG=\"$windows_project - Win32 Debug\"\r\n". "!MESSAGE \r\n". "!MESSAGE Possible choices for configuration are:\r\n". "!MESSAGE \r\n". "!MESSAGE \"$windows_project - Win32 Release\" (based on \"Win32 (x86) Application\")\r\n". "!MESSAGE \"$windows_project - Win32 Debug\" (based on \"Win32 (x86) Application\")\r\n". "!MESSAGE \r\n". "\r\n". "# Begin Project\r\n". "# PROP AllowPerConfigDependencies 0\r\n". "# PROP Scc_ProjName \"\"\r\n". "# PROP Scc_LocalPath \"\"\r\n". "CPP=cl.exe\r\n". "MTL=midl.exe\r\n". "RSC=rc.exe\r\n". "\r\n". "!IF \"\$(CFG)\" == \"$windows_project - Win32 Release\"\r\n". "\r\n". "# PROP BASE Use_MFC 0\r\n". "# PROP BASE Use_Debug_Libraries 0\r\n". "# PROP BASE Output_Dir \"Release\"\r\n". "# PROP BASE Intermediate_Dir \"Release\"\r\n". "# PROP BASE Target_Dir \"\"\r\n". "# PROP Use_MFC 0\r\n". "# PROP Use_Debug_Libraries 0\r\n". "# PROP Output_Dir \"Release\"\r\n". "# PROP Intermediate_Dir \"Release\"\r\n". "# PROP Ignore_Export_Lib 0\r\n". "# PROP Target_Dir \"\"\r\n". "# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /c\r\n". "# ADD CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /c\r\n". "# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\r\n". "# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\r\n". "# ADD BASE RSC /l 0x809 /d \"NDEBUG\"\r\n". "# ADD RSC /l 0x809 /d \"NDEBUG\"\r\n". "BSC32=bscmake.exe\r\n". "# ADD BASE BSC32 /nologo\r\n". "# ADD BSC32 /nologo\r\n". "LINK32=link.exe\r\n". "# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:$subsys /machine:I386\r\n". "# ADD LINK32 $libs /nologo /subsystem:$subsys /machine:I386\r\n". "# SUBTRACT LINK32 /pdb:none\r\n". "\r\n". "!ELSEIF \"\$(CFG)\" == \"$windows_project - Win32 Debug\"\r\n". "\r\n". "# PROP BASE Use_MFC 0\r\n". "# PROP BASE Use_Debug_Libraries 1\r\n". "# PROP BASE Output_Dir \"Debug\"\r\n". "# PROP BASE Intermediate_Dir \"Debug\"\r\n". "# PROP BASE Target_Dir \"\"\r\n". "# PROP Use_MFC 0\r\n". "# PROP Use_Debug_Libraries 1\r\n". "# PROP Output_Dir \"Debug\"\r\n". "# PROP Intermediate_Dir \"Debug\"\r\n". "# PROP Ignore_Export_Lib 0\r\n". "# PROP Target_Dir \"\"\r\n". "# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /GZ /c\r\n". "# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /D \"_MBCS\" /YX /FD /GZ /c\r\n". "# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\r\n". "# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\r\n". "# ADD BASE RSC /l 0x809 /d \"_DEBUG\"\r\n". "# ADD RSC /l 0x809 /d \"_DEBUG\"\r\n". "BSC32=bscmake.exe\r\n". "# ADD BASE BSC32 /nologo\r\n". "# ADD BSC32 /nologo\r\n". "LINK32=link.exe\r\n". "# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:$subsys /debug /machine:I386 /pdbtype:sept\r\n". "# ADD LINK32 $libs /nologo /subsystem:$subsys /debug /machine:I386 /pdbtype:sept\r\n". "# SUBTRACT LINK32 /pdb:none\r\n". "\r\n". "!ENDIF \r\n". "\r\n". "# Begin Target\r\n". "\r\n". "# Name \"$windows_project - Win32 Release\"\r\n". "# Name \"$windows_project - Win32 Debug\"\r\n". "# Begin Group \"Source Files\"\r\n". "\r\n". "# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\r\n"; foreach $source_file (@source_files) { print "# Begin Source File\r\n". "\r\n". "SOURCE=..\\..\\$source_file\r\n"; if($source_file =~ /ssh\.c/io) { # Disable 'Edit and continue' as Visual Studio can't handle the macros print "\r\n". "!IF \"\$(CFG)\" == \"$windows_project - Win32 Release\"\r\n". "\r\n". "!ELSEIF \"\$(CFG)\" == \"$windows_project - Win32 Debug\"\r\n". "\r\n". "# ADD CPP /Zi\r\n". "\r\n". "!ENDIF \r\n". "\r\n"; } print "# End Source File\r\n"; } print "# End Group\r\n". "# Begin Group \"Header Files\"\r\n". "\r\n". "# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\r\n"; foreach $header_file (@header_files) { print "# Begin Source File\r\n". "\r\n". "SOURCE=..\\..\\$header_file\r\n". "# End Source File\r\n"; } print "# End Group\r\n". "# Begin Group \"Resource Files\"\r\n". "\r\n". "# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\r\n"; foreach $resource_file (@resources) { print "# Begin Source File\r\n". "\r\n". "SOURCE=..\\..\\$resource_file\r\n". "# End Source File\r\n"; } print "# End Group\r\n". "# End Target\r\n". "# End Project\r\n"; select STDOUT; close OUT; chdir '..'; } Revision-number: 3722 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2004-01-17T14:17:21.000000Z K 7 svn:log V 132 Building source archives for previous releases has always been a fiddly process. Let's have a magic script designed to do it right. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 91978fe8334870ada8fad48a21465663 Text-delta-base-sha1: ff99252190ed84c005a010db9cace881456f0a2b Text-content-length: 272 Text-content-md5: 575c5004a99b514df93402f418a0b3ed Text-content-sha1: 628e10bbbc8e1504b8e1b71423eac959d8281e0b Content-length: 312 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNMjs]s*Dp]fiddly to build, so it's done by the shell script mksrcarc.sh. First check out the release sources in a pristine directory (to avoid cluttering the zip file with irrelevant stuff), then run mksrcarc.sh in that directory Node-path: putty/mksrcarc.sh Node-kind: file Node-action: add Prop-content-length: 142 Text-delta: true Text-content-length: 703 Text-content-md5: fff9b9397b661e020c1d6e23b5777bcb Text-content-sha1: 25f195f8a5993d5384bf5bf8af19da9cf98d352d Content-length: 845 K 14 svn:executable V 1 * K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN111#!/bin/sh perl mkfiles.pl relver=`cat LATEST.VER` unixarc="putty-$relver$datesuffix" text=`{ find . -name CVS -prune -o \ -name .cvsignore -prune -o \ -name LATEST.VER -prune -o \ -name CHECKLST.txt -prune -o \ -name mksrcarc.sh -prune -o \ -name '*.dsp' -prune -o \ -name '*.dsw' -prune -o \ -type f -print | sed 's/^\.\///'; } | \ grep -ivE MODULE\|putty.iss\|website.url | grep -vF .ico` bin=`{ ls -1 *.ico putty.iss website.url; \ find . -name '*.dsp' -print -o -name '*.dsw' -print; }` zip -k -l putty-src.zip $text > /dev/null zip -k putty-src.zip $bin > /dev/null Revision-number: 3723 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2004-01-17T14:25:36.000000Z K 7 svn:log V 63 Various uninitialised-variable accesses picked up by valgrind. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 26910d035e2d042e69bd959bee37c006 Text-delta-base-sha1: 07866a47c25b31c903061091b9609a7d25223db4 Text-content-length: 726 Text-content-md5: c95fe9725c581372efd9a5fe3f59bda7 Text-content-sha1: 29ab0d94eb07e0d022aaad2de6bcbe8ce80a9e86 Content-length: 767 K 15 cvs2svn:cvs-rev V 5 1.163 PROPS-END SVNl1lcate != NO_SELECTION) { if (term->selstart.y >= seltop && term->selstart.y <= botline) { term->selstart.y--; if (term->selstart.y < seltop) { term->selstart.y = seltop; term->selstart.x = 0; } } if (term->selend.y >= seltop && term->selend.y <= botline) { term->selend.y--; if (term->selend.y < seltop) { term->selend.y = seltop; term->selend.x = 0; } } if (term->selanchor.y >= seltop && term->selanchor.y <= botline) { term->selanchor.y--; if (term->selanchor.y < seltop) { term->selanchor.y = seltop; term->selanchor.x = 0; }l(<l blink_diff = now - term->last_tblink; /* Make sure th Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5027d5b2079f5f8c12e160061ae4af80 Text-delta-base-sha1: 0933d661f3bc543e58708997e6351311b618a9ac Text-content-length: 60 Text-content-md5: a4d858f882a539942825c27b360c35d0 Text-content-sha1: 48626c113e12fa0b2a32acab30cc286b4b293db3 Content-length: 100 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN0] $wBn dp->flags = 0; dp->currfocus Revision-number: 3724 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2004-01-17T16:32:29.000000Z K 7 svn:log V 11 Now fixed! K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vstudio-project Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6626954a28379d81fb05d36da7e9ecad Text-delta-base-sha1: 6b057774229dc5d49aeaeb617e91bab3989ce34b Text-content-length: 143 Text-content-md5: a9f8c2e9b1f82c82c72df47f5fb0b389 Text-content-sha1: 36af3c0c58d172b8087a73266ba61a4505fa8899 Content-length: 182 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNL z^?]fFixed-in: 2004-01-18Update: mkfiles.pl now generates these project files. Many thanks to Joe Yates. Revision-number: 3725 Prop-content-length: 182 Content-length: 182 K 8 svn:date V 27 2004-01-18T08:45:50.000000Z K 7 svn:log V 82 Oops, two lines moved out of my snapshot script should have been left there! Bah. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mksrcarc.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fff9b9397b661e020c1d6e23b5777bcb Text-delta-base-sha1: 25f195f8a5993d5384bf5bf8af19da9cf98d352d Text-content-length: 41 Text-content-md5: 7b4d2beb2bb90854b9a690c4a61928d0 Text-content-sha1: d8cad84d5ba707210b1bfa2913fdb6dfbbd0072b Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN1v]T#!/bin/sh perl mkfiles.pl Revision-number: 3726 Prop-content-length: 276 Content-length: 276 K 8 svn:date V 27 2004-01-18T09:14:41.000000Z K 7 svn:log V 175 Memory management fixes. Fixed a segfault in SSH1 compression cleanup noticed by Gerhard Wiesinger, and also fixed some memory leaks spotted by valgrind while debugging same. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bf18e70ab10ab69464ab76f1f59900a1 Text-delta-base-sha1: c8b6a5385bdc67d2c5653f71acc2dd3068423ca4 Text-content-length: 417 Text-content-md5: 3143c5bb8d5b7cf4fbd51e356e48e6a0 Text-content-sha1: 1ebe83fe7dc79189b5437d662884ec048a3cee96 Content-length: 458 K 15 cvs2svn:cvs-rev V 5 1.305 PROPS-END SVN q{o sfree(s->response);X,Py w&Cc_send(ssh->ldisc, NUL sfree(s->response); { if (ssh->cscomp) ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx); else zlib_compress_cleanup(ssh->cs_comp_ctx); } if (ssh->sc_comp_ctx) { if (ssh->sccomp) ssh->sccomp->decompress_cleanup(ssh->sc_comp_ctx); else zlib_decompress_cleanup(ssh->sc_comp_ctx); } Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cdb6b4e65dd500865ccbdd930ef19be0 Text-delta-base-sha1: ba16f925552790265a172aee8b74b4075bdb2e43 Text-content-length: 151 Text-content-md5: 423472b348d918165ae2598405cb0a87 Text-content-sha1: 3e0d125469c88ac80b3b56b862eed0eead8b14fc Content-length: 191 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNrmp$ !).K'K sfree(ectx->ictx); sfree(ectxzlib_freetable(&dctx->staticlentable); zlib_freetable(&dctx->staticdist Revision-number: 3727 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:57.280960Z PROPS-END Revision-number: 3728 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:57.289058Z PROPS-END Revision-number: 3729 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 Couple of new mirrors K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-01-18T12:26:10.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 16b67e47d24c59360101c0b4d8e2182f Text-delta-base-sha1: 95cfd53bc5e09ec3c3885e2fb942f76d98c1cf82 Text-content-length: 135 Text-content-md5: c2e4daa7ab3a6b9f8aee6304c11a1587 Text-content-sha1: c2748bd0d463c6a69112a5b8a749ff8f09f7b2de Content-length: 175 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVN hBQD~HXputty.molioner.dk/">putty.molioner.dk in Denmarkb-o-b.homelinux.com/putty/">b-o-b.homelinux.com Revision-number: 3730 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:57.427724Z PROPS-END Revision-number: 3731 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:57.438376Z PROPS-END Revision-number: 3732 Prop-content-length: 182 Content-length: 182 K 7 svn:log V 82 Add '*' suggestion, mumble about dynamic forwarding, mutter about remote-to-local K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-01-18T19:27:26.000000Z PROPS-END Node-path: putty-wishlist/data/portfwd-range Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3b15a4a71742764322124532e94465a6 Text-delta-base-sha1: 84e78941fb23307602f5aa203564c35021d48840 Text-content-length: 439 Text-content-md5: 26830d2120b0cb5d5b7fd4709829ef4f Text-content-sha1: b8eeb85396c86758ba925ace733f3da9606a4723 Content-length: 478 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN7\ , Another suggestion is a port of '*' for unrestricted forwarding to a given host. (Although, if you're heading in this direction, you might want to investigate dynamic port forwarding.)

      We might want to be cautious about allowing this for remote-to-local forwarding, as we'd have to send a request for every port in the range at startup. (I think we'd certainly disallow '*'!) Revision-number: 3733 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2004-01-19T00:10:50.000000Z K 7 svn:log V 28 Add Mark Scudder's thoughts K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/transparency Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cfee3f5788ae4b614b77b6576cbc9529 Text-delta-base-sha1: 83648e83710c223d6ec04a9ceca821e1e3e0ed9f Text-content-length: 239 Text-content-md5: ba0798e86e4c52f80e534f80745921e0 Text-content-sha1: 42c09bd44db41d9cb6a64b828fec2e531ac5f268 Content-length: 278 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN zRq ax(

      There are third-party utilities which will do this for you without us needing to modify PuTTY; have a look (Although these apparently don't keep the text opaque, which is apparently not what people want.) Revision-number: 3734 Prop-content-length: 198 Content-length: 198 K 7 svn:log V 98 Re local X server auth, clarify that it's _us_ you should mail, and link to the Feedback section. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-01-19T00:19:32.000000Z PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 13ede797eef7df974e01d4b1f4b5d129 Text-delta-base-sha1: 3ef2fd51b64b2962126634b148077a7570d0a2ab Text-content-length: 135 Text-content-md5: e96bd59a77ec84e74edfe577e6b1255a Text-content-sha1: 72be756c45395293fc0922401a8e04c4c275c8cc Content-length: 175 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNLe o4vV\versionid $Id: using.but,v 1.16 2004/01/19 00:19:32PuTTY authors \#{FIXME} and give details (see \k{feedback}) Revision-number: 3735 Prop-content-length: 210 Content-length: 210 K 7 svn:log V 109 Summary: Option to start key sequences with 0x9B instead of 0x1B Class: wish Suggested by Reinhard Mueller. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-01-19T00:43:20.000000Z PROPS-END Node-path: putty-wishlist/data/function-keys-8bit Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 521 Text-content-md5: 6449d765d7ba493dc919fff776ba65ba Text-content-sha1: 1dd06c43c31081a17b54db6b3ab1c65fd9bff0bb Content-length: 637 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN{{{Summary: Option to start key sequences with 0x9B instead of 0x1B Class: wish Difficulty: fun Priority: low Content-type: text/x-html-body

      Debian apparently has a terminal type xterm-8bit where all occurrences of 0x1B in key sequences (such as function keys) are replaced by 0x9B.

      This gets rid of the irritating delay on pressing Esc while the server works out of it's part of a multi-byte sequence or not.

      It's been suggested that PuTTY should have an option to work like this. Revision-number: 3736 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 This isn't as simple as it sounds, owing to UTF-8. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-01-19T09:05:21.000000Z PROPS-END Node-path: putty-wishlist/data/function-keys-8bit Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6449d765d7ba493dc919fff776ba65ba Text-delta-base-sha1: 1dd06c43c31081a17b54db6b3ab1c65fd9bff0bb Text-content-length: 617 Text-content-md5: 8a8057caa38bdcc01f82b25c760de93c Text-content-sha1: 591db713107b8284d644a2697d8a4e28c22ffb11 Content-length: 656 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN{QV{V

      SGT adds: This sounds like a nice simple feature on the face of it, but unfortunately UTF-8 complicates it a lot. What should happen when the terminal is in UTF-8 mode (or, hypothetically and if we ever get round to it, some other multi-byte character encoding)? Should we send a bare 9B anyway, causing an illegal UTF-8 sequence but keeping compatibility with any software which is scanning the incoming byte stream for a precise sequence of bytes? Or should we send C2 9B, the UTF-8 encoding of U+009B? Or should we simply outlaw this mode completely in UTF-8 mode? Revision-number: 3737 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2004-01-19T09:37:17.000000Z K 7 svn:log V 106 Idiot me _twice_! The new store_host_key() was failing in the absence of an existing host key file. Duhh. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 43048e0ee43be8ed6aae693f119d8e92 Text-delta-base-sha1: ab9fa338e7f6824b6517bd4f3ae13c7f5c0137ea Text-content-length: 546 Text-content-md5: b8c5f070fb03e72834ddd246e1569ac4 Text-content-sha1: 08923321cfe7ae15e7016b6d80917e4c8467d976 Content-length: 586 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN{*~YY:%h5M.tmpfilename, INDEX_HOSTKEYS_TMP, NULL); wfp = fopen(tmpfilename, "w"); if (!wfp) { char dir[FILENAME_MAX]; make_filename(dir, INDEX_DIR, NULL); mkdir(dir, 0700); wfp = fopen(tmpfilename, "w"); } if (!wfp) return; make_filename(filename, INDEX_HOSTKEYS, NULL); rfp = fopen(filename, "r");if (rfp) { while ( (line = fgetline(rfp)) ) { if (strncmp(line, newtext, headerlen)) fputs(line, wfp); } fclose(r Revision-number: 3738 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2004-01-19T11:08:58.000000Z K 7 svn:log V 42 In fact, PuTTY used to do this! Semi-bug? K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/paste-on-release Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 81ebd35bdf366620fd22d7feb4aa9dc6 Text-delta-base-sha1: f75dc70957b65a7ba1f19dea5a8f0c9055f92bca Text-content-length: 270 Text-content-md5: 5bf293b39dc00492d199eeb0519a9f74 Text-content-sha1: bb95a5b5169a0affa8788b9013dc9aefefa53ded Content-length: 309 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN]T whug:Absent-in: 0.53b 2003-03-27 Present-in: 2003-03-31 2004-01-19 (We've had one request for the cancelling behaviour.)

      Update: In fact, (Windows) PuTTY used to behave like this, and it doesn't appear to be a deliberate change. Semi-bug? Revision-number: 3739 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:57.930973Z PROPS-END Revision-number: 3740 Prop-content-length: 599 Content-length: 599 K 8 svn:date V 27 2004-01-20T12:46:36.000000Z K 7 svn:log V 498 `portfwd-loopback-choice' was not consistently documented. - update usage info in tools - ack, plink is over 24 lines now - update man pages for Unix version - Doc changes: - move long description from (GUI) "config" to "using" - sorry if complete specification isn't what this section is meant for, but if you only read "using" it was hard to find. - ensure enough references to this made in other sections (GUI, command-line) - update instance of plink usage info K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d89c81d77cedea939f21a9eb532187fc Text-delta-base-sha1: 9e2ed714e8284cc0363582864ccc1a7fa36b58e9 Text-content-length: 226 Text-content-md5: 53f8165364243df61f263f1dc54afc05 Text-content-sha1: 673ed053f9f446052bea9b2b1fb72893cd93f973 Content-length: 266 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVNzkE:; l\versionid $Id: config.but,v 1.73 2004/01/20 12:46:35 jacob, by specifying (for instance) \c{127.0.0.5:79}. See \k{using-port-forwarding} for more information on how this works and its restrictions Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d25e0d9371d6d4aa19ac0e0bd1b9b60a Text-delta-base-sha1: ee6788d8e260d696029a19c9b9f0f1b549346927 Text-content-length: 326 Text-content-md5: c09b2d683dc042a5a65b8964bb2d7f10 Text-content-sha1: f23bcb6a8da54b3f3f488bd1e2f6c6f622bbf4b1 Content-length: 366 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNa,'d4U,_L\versionid $Id: plink.but,v 1.20 2004/01/20 12:46:35Jan 20 2004 12:39:22[listen-IP:]listen-port \c Dynamic SOCKS-based port forwarding \c -L [listen-IP:]listen-port:host:port \c Forward local port to remote address \c -R [listen-IP:]listen-port:host:port \c Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e96bd59a77ec84e74edfe577e6b1255a Text-delta-base-sha1: 72be756c45395293fc0922401a8e04c4c275c8cc Text-content-length: 942 Text-content-md5: 1ddf78b021d79cfba9a113985fbbe0f1 Text-content-sha1: 1fbe31833454f70446f2614b833264b56e7e381a Content-length: 982 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNe(4PH[`05\versionid $Id: using.but,v 1.17 2004/01/20 12:46:35belowYou can also specify an IP address to listen on. Typically a Windows machine can be asked to listen on any single IP address in the \cw{127.*.*.*} range, and all of these are loopback addresses available only to the local machine. So if you forward (for example) \c{127.0.0.5:79} to a remote machine's \cw{finger} port, then you should be able to run commands such as \c{finger fred@127.0.0.5}. This can be useful if the program connecting to the forwarded port doesn't allow you to change the port number it uses. This feature is available for local-to-remote forwarded ports; SSH1 is unable to support it for remote-to-local ports, while SSH2 can support it in theory but servers will not necessarily cooperatepecify an IP address for the listening end of the tunnel, prepend it to the argument: \c plink -L 127.0.0.5:23:localhost:23 myhost Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fba8b26e31a3d852cba87ce37a87d14a Text-delta-base-sha1: 28246bc68f5f0fe99482b7780cd0b783ef4d0929 Text-content-length: 344 Text-content-md5: f3abb94e93b27fbbeeee782434103a30 Text-content-sha1: b0d102d3d0753107f942e0510436240cdfc1ac69 Content-length: 384 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVN=$ >z>lQ[listen-IP:]listen-port\n"); printf(" Dynamic SOCKS-based port forwarding\n"); printf(" -L [listen-IP:]listen-port:host:port\n"); printf(" Forward local port to remote address\n"); printf(" -R [listen-IP:]listen-port:host:port\n"); printf(" Forward remote port to Node-path: putty/unix/plink.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 51c5d673ad080e966c3ef5d92e69195e Text-delta-base-sha1: 94df1bfbf16dc16a1177a3156b100604a4f7b0a5 Text-content-length: 188 Text-content-md5: 7dc393b193db44b4badbf7aaf9d1e4a2 Text-content-sha1: 241a6f5baed5597fb88ad1f58bc4eb67643e2c78 Content-length: 227 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN@t^t O2[\fIlisten-IP\fB:\fR][\fIlisten-IP\fB:\fR]\fIlisten\fB:\fIhost\fB:\fIport\fR" Forward the a remote port to a local address. .IP "\fB-D\fR [\fIlisten-IP\fB:\fR] Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3b477c0f96bdc517b8d4b4c25d6da9dd Text-delta-base-sha1: b1e9175fe2f3bd0682f05c93ca285199eafb1ac1 Text-content-length: 344 Text-content-md5: 3cf814c4c65c3bbda0e241d7587bda64 Text-content-sha1: 9dac1136ed68483c179872199dc84b96131aaed1 Content-length: 384 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNaH >O>;&[listen-IP:]listen-port\n"); printf(" Dynamic SOCKS-based port forwarding\n"); printf(" -L [listen-IP:]listen-port:host:port\n"); printf(" Forward local port to remote address\n"); printf(" -R [listen-IP:]listen-port:host:port\n"); printf(" Forward remote port to Revision-number: 3741 Prop-content-length: 504 Content-length: 504 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-01-20T19:30:41.000000Z K 7 svn:log V 403 Mark Wutzke points out that the comment in sk_proxy_set_frozen() states that plug_receive() may recurse back into sk_proxy_set_frozen() again. Therefore, bufchain_consume() should have been called _before_ calling plug_receive(), to prevent an infinite loop overflowing the stack. I can't immediately figure out under what circumstances this might happen, but it seems an obviously sensible precaution. PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cafed48d01f6e980513a35e4b5e4a3ad Text-delta-base-sha1: c4ca269a9a80f1b2955b434a685306b480373fd4 Text-content-length: 223 Text-content-md5: 9eb61d4b5a3078971c469dc2ec875560 Text-content-sha1: 26a1fe04faa01340109fcc0fbe9ed9f631762665 Content-length: 263 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN[N?:Q3.Wchar databuf[512]if (len > lenof(databuf)) len = lenof(databuf); memcpy(databuf, data, len); bufchain_consume(&ps->pending_input_data, len); plug_receive(ps->plug, 0, databuf Revision-number: 3742 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2004-01-20T19:41:43.000000Z K 7 svn:log V 211 Josh Hill's patch for full-screen mode on a multi-monitor system: clicks in the top left of the window should not be detected by comparing the coordinates with (0,0) since this won't work on secondary monitors. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3a62a6c529b8f4cb3baa0d0730e621dd Text-delta-base-sha1: 5fad6ba41ca873114902ce7a39e6603ccd5dddd9 Text-content-length: 1253 Text-content-md5: a9766c62cb0122d411086b448a7cc352 Text-content-sha1: fe50be7a7676b7cb8ea015ae95dc4532871b35eb Content-length: 1294 K 15 cvs2svn:cvs-rev V 5 1.259 PROPS-END SVN0X0x{ char mouse_on_hotspot = 0; POINT pt; GetCursorPos(&pt); #ifndef NO_MULTIMON { HMONITOR mon; MONITORINFO mi; mon = MonitorFromPoint(pt, MONITOR_DEFAULTTONULL); if (mon != NULL) { mi.cbSize = sizeof(MONITORINFO); GetMonitorInfo(mon, &mi); if (mi.rcMonitor.left == pt.x && mi.rcMonitor.top == pt.y) { mouse_on_hotspot = 1; } CloseHandle(mon); } } #else if (pt.x == 0 && pt.y == 0) { mouse_on_hotspot = 1; } #endif if (is_full_screen() && press && button == MBT_LEFT && mouse_on_hotspot) { SendMessage(hwnd, WM_SYSCOMMAND, SC_MOUSEMENU, MAKELPARAM(pt.x, pt.y)); return 0; } } key_event(term); luni_send(ldisc, &keybuf, 1, 1); } else { ch = (char) alt_sum; /* * We need not bother about stdin * backlogs here, because in GUI PuTTY * we can't do anything about it * anyway; there's no means of asking * Windows to hold off on KEYDOWN * messages. We _have_ to buffer * everything we're sent. */ term_seen_key_event(term); ldisc_send(ldisc, &ch, 1, 1); } alt_sum = 0; } else { te Revision-number: 3743 Prop-content-length: 242 Content-length: 242 K 8 svn:date V 27 2004-01-20T19:46:00.000000Z K 7 svn:log V 141 Paul van der Meij points out that do_reconfig() should not free dp.errtitle, since it's also freed in dp_cleanup(). Minefield agrees. Fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4e0378f380a11723b8c2ef818f336cd4 Text-delta-base-sha1: 28a3932cf75813221407eac8ac7fbc6b2bc88514 Text-content-length: 22 Text-content-md5: 4d64f087c7104746592120ee41fb463a Text-content-sha1: 822a72a06fd7f6b1af8f59b8f515ab494c95087b Content-length: 63 K 15 cvs2svn:cvs-rev V 5 1.216 PROPS-END SVNrZ iq Revision-number: 3744 Prop-content-length: 436 Content-length: 436 K 7 svn:log V 335 Alexey Savelyev's mkfiles.pl patch to support lcc-win32. This has caused a small amount of extra inconvenience at the tops of .rc files, but it's been positive overall since lcc has managed to point out some pedantic errors (typically static/extern mismatches between function prototypes and definitions) which everything else missed. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-01-20T20:35:27.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 33baad076e61d9ec8cb6cdb45cf2a281 Text-delta-base-sha1: 07bf2021585ce684bb185ade0fff935a8d6f31e1 Text-content-length: 842 Text-content-md5: 948e9f8be41c2f6721d6a4a783484bad Text-content-sha1: 32ba1e68d6cf20283dc50d979f37c04c2f47ca8e Content-length: 882 K 15 cvs2svn:cvs-rev V 4 1.63 PROPS-END SVNit-i_k\q!a/:_n3r& ##-- lcc makefile open OUT, ">Makefile.lcc"; select OUT; print "# Makefile for PuTTY under lccllcc\n". "\n". "# C compilation flags\n". "CFLAGS = -D_WINDOWS\n". "\n". "# Get include directory for resource compiler\n". "\n". ".c.obj:\n". &splitline("\tlcc -O -p6 \$(COMPAT) \$(FWHACK)". " \$(XFLAGS) \$(CFLAGS) \$*.c",69)."\n". ".rc.res:\n". &splitline("\tlrc \$(FWHACK) \$(RCFL) -r \$*.rc",69)."), "\n"; $subsystemtype = undef; if ($prog eq "pageant" || $prog eq "putty" ||$prog eq "puttygen" || $prog eq "puttytel") { $subsystemtype = "-subsystem windows"; } my $libss = "shell32.lib wsock32.lib ws2_32.lib winspool.lib winmm.lib imm32.lib"; print &splitline("\tlcclnk $subsystemtype -o $prog.exe $objstr $libss"); print "\n\n"; } lcc; select STDOUT; close OUT; Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5638a6cd879ae3dad041ccce05499e4d Text-delta-base-sha1: c4fb8ee8cfcc19f41cc0b036f3ff98444ee02e41 Text-content-length: 48 Text-content-md5: b2f4637f204e6308c37db8111fb58749 Text-content-sha1: 7946f86ab9002db3ebc33d08bee667443445bcab Content-length: 88 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNK[dc`Jnclude Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e5bf43efeb35ba986fd016c82976dbf0 Text-delta-base-sha1: f0f03387d36a96a0e4575d6bd9a442edd10ef139 Text-content-length: 147 Text-content-md5: bcaaaeaf4375e01dfc93ce77856965ed Text-content-sha1: a9364be35ef232936edbfba1286002df9765b256 Content-length: 187 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNq7 }ad9V/* Some compilers, like Borland, don't have winresrc.h */ #ifdef __LCC__ #include #else #endif /* end #ifdef __LCC__ Node-path: putty/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d4ff272da009f95f86cb43fa771c3dfa Text-delta-base-sha1: b3fb4ea94d66e2ac2dd6aac3253d2aee26a3d3e1 Text-content-length: 98 Text-content-md5: f868f84898b4ac8fb9ddb1efc92976eb Text-content-sha1: 0bfecca58d05227cf4cf9fcc8826167b0872bbe0 Content-length: 138 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNnQQ3;/* * Printing interface for PuTTY. */ #include "putty.h" #include Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a047fa36b0355b74be95a061050fde94 Text-delta-base-sha1: 92bb1ddc4b04bbfc01f5552837cd8a6404b2fa73 Text-content-length: 147 Text-content-md5: d7fff90b9231ee4f089a7f0368e831f8 Text-content-sha1: 2a773acd03ffff3dd56034823aaaecd80546626b Content-length: 187 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN%k }ad9 /* Some compilers, like Borland, don't have winresrc.h */ #ifdef __LCC__ #include #else #endif /* end #ifdef __LCC__ Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c900887b574adc896fc62d1d317f4d2a Text-delta-base-sha1: e8add7dd6e3643a288f982378f81d3f4fb1a1f2b Text-content-length: 147 Text-content-md5: 63bd1427cf75b202482e8eb4f6075b23 Text-content-sha1: 2b36dd7dbf0569b10443bedb8d4dcec7aef80e9c Content-length: 187 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNr8 }ad9W/* Some compilers, like Borland, don't have winresrc.h */ #ifdef __LCC__ #include #else #endif /* end #ifdef __LCC__ Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4d64f087c7104746592120ee41fb463a Text-delta-base-sha1: 822a72a06fd7f6b1af8f59b8f515ab494c95087b Text-content-length: 42 Text-content-md5: 7b8e8f850dddcc9123dae12d3f5ffccf Text-content-sha1: 49a24e18be712529372889d2e68abb0b09ab4a8b Content-length: 83 K 15 cvs2svn:cvs-rev V 5 1.217 PROPS-END SVNZp [#include Alternatively, PrintNow will apparently cause Alt+PrintScreen to print the current window display to a printer (instead of just copying it to the clipboard). Revision-number: 3749 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2004-01-21T17:11:55.000000Z K 7 svn:log V 81 `What is PuTTY?' gets asked _just_ frequently enough to have finally annoyed me. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6b6c77e1e14fac418380313155de51fc Text-delta-base-sha1: fae2517d121d5520c401f85fe1e83e08efbdd79d Text-content-length: 826 Text-content-md5: 041ebf292a587966d5cc5a7528229c13 Text-content-sha1: 0356c10a14849c9f5c5208e56b7fe25963ecd1ae Content-length: 866 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNo_8fA.\versionid $Id: faq.but,v 1.52 2004/01/21 17:11:55 simonintro} Introduction \S{faq-what} What is PuTTY? PuTTY is a client program for the SSH, Telnet and Rlogin network protocols. These protocols are all used to run a remote session on a computer, over a network. PuTTY implements the client end of that session: the end at which the session is displayed, rather than the end at which it runs. In really simple terms: you run PuTTY on a Windows machine, and tell it to connect to (for example) a Unix machine. PuTTY opens a window. Then, anything you type into that window is sent straight to the Unix machine, and everything the Unix machine sends back is displayed in the window. So you can work on the Unix machine as if you were sitting at its console, while actually sitting somewhere else Revision-number: 3750 Prop-content-length: 120 Content-length: 120 K 7 svn:log V 20 Declare this fixed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-01-21T18:45:38.000000Z PROPS-END Node-path: putty-wishlist/data/sftp-slow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e9e68772018a5660c9352d0bc944378f Text-delta-base-sha1: 63a3aed9944fc319790d124eb825cd5d6b4e59b9 Text-content-length: 162 Text-content-md5: 49df0806951cb71081e594321062069f Text-content-sha1: ced055c013ee76c06e92bb0c6953b42a34786e19 Content-length: 201 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN|Y "-!vFixed-in: 2003-09-30. I believe there are tweaks that could be done to make it better still, but I'm going to declare this closed anyway. Revision-number: 3751 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2004-01-21T19:33:48.000000Z K 7 svn:log V 66 Martin Prikryl points out that need_pw may be used uninitialised. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3143c5bb8d5b7cf4fbd51e356e48e6a0 Text-delta-base-sha1: 1ebe83fe7dc79189b5437d662884ec048a3cee96 Text-content-length: 65 Text-content-md5: 1fcfd04116a5e0821ba4a1a0feb8f0f2 Text-content-sha1: 4c70b30da0dcd8ac2810b079c75d02f5c2fbb530 Content-length: 106 K 15 cvs2svn:cvs-rev V 5 1.306 PROPS-END SVN,E &$ s->need_pw = FALSE Revision-number: 3752 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 56 Two small memory leaks, also noticed by Martin Prikryl. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-01-21T19:41:34.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1fcfd04116a5e0821ba4a1a0feb8f0f2 Text-delta-base-sha1: 4c70b30da0dcd8ac2810b079c75d02f5c2fbb530 Text-content-length: 74 Text-content-md5: 51d79f18bdb0e1de6c81c9a6bca179b0 Text-content-sha1: 0564eb8465f4ad84fa85c0a3b1bf36f9823d3d8b Content-length: 115 K 15 cvs2svn:cvs-rev V 5 1.307 PROPS-END SVNEi vSr key->alg->freekey(key->data) Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8eb8c9c6e7a89eb536af62f1c01f8299 Text-delta-base-sha1: aa828ff3a1abadabbae1efcad274e7b657732ccb Text-content-length: 34 Text-content-md5: ae73effe9ac1d19a3a9ef199576eb39a Text-content-sha1: cfd8e7366dcd850fe764867c39552136f83c37cb Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNgs 'C$ freebn(q Revision-number: 3753 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2004-01-21T19:45:44.000000Z K 7 svn:log V 57 Theo Markettos's unsigned-vs-signed-char pedantry patch. K 10 svn:author V 5 simon PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9481a38e1dd80e2821cd7746052a90fc Text-delta-base-sha1: 5126892516aaa11a8e3ffb3e3223df54f54e8df3 Text-content-length: 148 Text-content-md5: 52ce5bdc2fb167d2b9169fb8fa3bfb15 Text-content-sha1: 457a9640035f24c8e25bbf295722e3e5f5412d46 Content-length: 188 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNglo$n4 DTG (char *)(char *)(char *)(char *) reply, lenof(reply)); pfd_close(pr->s); return 1; } } } Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 769afea7125fca97e06f91eabaa8677d Text-delta-base-sha1: 7e9ccbf8f5dbed6599d6e9a91cfadc6896cb5794 Text-content-length: 24 Text-content-md5: 9d6f86949f848fa70f8bd9b0de07555b Text-content-sha1: 8037bafc78328de56897b14b26e2df0eb9ada307 Content-length: 64 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVN^L I Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 59ca07316cae555e80e654eb2d4dd0bf Text-delta-base-sha1: 07b5ae82755c81f74ede836a19e2c83fff289255 Text-content-length: 325 Text-content-md5: c5c08ad5a53ea3e5d43f0a0bab4c6197 Text-content-sha1: de4c25cc318e3d46710b107004ce38c9733d79f8 Content-length: 366 K 15 cvs2svn:cvs-rev V 5 1.115 PROPS-END SVNFqdBEAYaC{>'V}Xk(unsigned char *) (unsigned char *) (unsigned char *) (unsigned char *) buf, len); } int sftp_senddata(char *buf, int len) { back->send(backhandle,(unsigned char *) (unsigned char *) (unsigned char *) (unsigned char *) (unsigned char *) Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 814b5275359831e891342fb9a7e2adc4 Text-delta-base-sha1: b3bb084e84828bd43626f5d70c78009be3cf8aa2 Text-content-length: 39 Text-content-md5: baa9283611f558a89eedb27d049445f4 Text-content-sha1: e1d2b1a62c138e9a594e4e553d4b43f1baa9541e Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN,: 9s9(socklen_t *) Revision-number: 3754 Prop-content-length: 389 Content-length: 389 K 8 svn:date V 27 2004-01-21T19:56:08.000000Z K 7 svn:log V 288 Darryl L. Miles's patch to support an optional port number argument on the PSFTP `open' command; it was arguably a bug that this command couldn't do such an obvious thing that could be done from the main command line. Also had to fix a NULL-dereference in do_sftp_cleanup in the process. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d6f86949f848fa70f8bd9b0de07555b Text-delta-base-sha1: 8037bafc78328de56897b14b26e2df0eb9ada307 Text-content-length: 423 Text-content-md5: e7a40439e738405176fb08b6c5f057f8 Text-content-sha1: 6bd2af865b99bbec85fc86be1b39d41a2eb54a01 Content-length: 463 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNL.$u /^-YYxTnt portnumber; cmd->nwords > 2) { portnumber = atoi(cmd->words[2]); if (portnumber == 0) { printf("open: invalid port number\n"); return 0; } } else portnumber = 0; if (psftp_connect(cmd->words[1], NULL, portnumber []if (back) { back->special(backhandle, TS_EOF); sftp_recvdata(&ch, 1); back->free(backhandle); sftp_cleanup_request(); } Revision-number: 3755 Prop-content-length: 436 Content-length: 436 K 7 svn:log V 335 Kaisuke Nakajima points out that it's unnecessary to translate negative font sizes (meaning pixels) into positive ones (points) in winstore.c, since it gets done anyway at the point of font creation; and removing the code in winstore.c means that the precise font entered by the user is saved in the config, rather than being rounded. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-01-21T20:59:20.000000Z PROPS-END Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9abdc74707397d204b1387a6cabc1d01 Text-delta-base-sha1: 8cb5925d61d73bdc7344576e5b4dea6be9dc98b5 Text-content-length: 131 Text-content-md5: 79aef269903b7edcdbafa92559e12f93 Text-content-sha1: 8fe0869730b4b5900a404fd8c7d490c47db6d34e Content-length: 171 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN( iKit%s", fs.name, boldstr, (fs.height < 0 ? -fs.height : fs.height), (fs.height < 0 ? "pixel" : "point" Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d7ec26487aa7be1580a44eb3a5701e26 Text-delta-base-sha1: cdd947b9b47a16cf6f9973e1cef8a28b5f23aa52 Text-content-length: 20 Text-content-md5: 200ec902f5b2d9a1ef9cae5dadf99685 Text-content-sha1: 2cd152f662309f119efbdba4d8bcfb0640462a58 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN KA\ Revision-number: 3756 Prop-content-length: 533 Content-length: 533 K 7 svn:log V 432 Bah! Nicolas Barry correctly points out that my async agent code simply doesn't work - if multiple concurrent agent requests are attempted, some of them will fail for no apparent reason. I assume concurrent SendMessage() calls don't work in the Windows API, or some such. So I'm commenting out the async code for the moment (there wasn't a Windows Pageant that made helpful use of it anyway yet) and returning to the drawing board. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-01-21T21:11:03.000000Z PROPS-END Node-path: putty/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6116bbc30b0e6fdd81be3acc4932cce4 Text-delta-base-sha1: 80813f505350440588b495b0bf2a8524ea9e5d59 Text-content-length: 308 Text-content-md5: 1e7acb8f58b26de2b36b4e0fdab740f7 Text-content-sha1: 62e962c364146e2875cefcf4ffbed1ac14622bcb Content-length: 348 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNQa *dO(Hu<P/* * Unfortunately, this asynchronous agent request mechanism doesn't * appear to work terribly well. I'm going to comment it out for * the moment, and see if I can come up with a better one :-/ */ #ifdef WINDOWS_ASYNC_AGENT#endif#ifdef WINDOWS_ASYNC_AGENT#endif Revision-number: 3757 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:59.695139Z PROPS-END Revision-number: 3758 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:59.703746Z PROPS-END Revision-number: 3759 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2004-01-22T00:41:29.000000Z K 7 svn:log V 112 Fix incorrect changelog for 0.53: this version could both import and export ssh.com and OpenSSH keys (PuTTYgen) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1812a3d02a99b2139fdf949eb9894583 Text-delta-base-sha1: c1a53e5ae54541604f44165a87a4db01c0893449 Text-content-length: 103 Text-content-md5: 0e1013199bb4ffdcf6f10c64d230a456 Text-content-sha1: 3a37f48cc412f24801c098b8a6a645e0a4c4a662 Content-length: 142 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNC NN2and export OpenSSH and ssh.com SSH2 private keys, as well as PuTTY's own forma Revision-number: 3760 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2004-01-22T18:37:48.000000Z K 7 svn:log V 58 Fix a casting bug with the length-independent sshbn code. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ae73effe9ac1d19a3a9ef199576eb39a Text-delta-base-sha1: cfd8e7366dcd850fe764867c39552136f83c37cb Text-content-length: 38 Text-content-md5: 3c61b1ff2afa080ab5ea1a9afdd12d44 Text-content-sha1: 9bef51c724ed6bf2734bb015348a008feb968de6 Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNs %N%(BignumDblInt) Revision-number: 3761 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2004-01-22T18:52:49.000000Z K 7 svn:log V 27 Placate some gcc warnings. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0d90779d6d7e0ecde2affaf8bf326be1 Text-delta-base-sha1: ce88af02c4b9ecb99b9ef80c22205ea0a128e43f Text-content-length: 213 Text-content-md5: 9361a8552c9cb39e29647c94936d7d07 Text-content-sha1: ba7405b548782e838021c86a893023a5fcd2bec2 Content-length: 253 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNs`' CEBK8cXs = 0, blobptr, privptr; char *modptr = NULL; int modlen = 0 else num_integers = 0; /* placate compiler warnings */ = 0 = 0 else return NULL; Revision-number: 3762 Prop-content-length: 327 Content-length: 327 K 8 svn:date V 27 2004-01-22T19:15:32.000000Z K 7 svn:log V 226 Added a command-line key generation tool. Currently builds and runs on Linux, but the (very few) platform-specific bits are already abstracted out of the main code, so it should port to other platforms with a minimum of fuss. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a05ae5d5b8e044602cdb4f008cb7b76c Text-delta-base-sha1: c5717bc8d7fd58c21681b2cddc909cb49ade469c Text-content-length: 169 Text-content-md5: e95c3418d6438d92f9b2e4ff17373887 Text-content-sha1: 06afb3ce81808e982f7956418b0fb17cce97fc9d Content-length: 209 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVNH$ VL|uSuttygen : [U] cmduxnoise sshsha misc sshrsa sshdss uxcons uxstore uxmisc + sshpubk sshaes sshsh512 import puttygen.res tree234 uxgen Node-path: putty/cmdgen.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 22412 Text-content-md5: bfc45b4cf02b07e5df2fbb7a60b61967 Text-content-sha1: c93713fa30592f044f9bea9dcc47f258bd7297a8 Content-length: 22528 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN{{{/* * cmdgen.c - command-line form of PuTTYgen */ /* * TODO: * * - Test thoroughly. * + a neat way to do this might be to have a -DTESTMODE for * this file, which #defines console_get_line and * get_random_noise to different names in order to be able to * link them to test stubs rather than the real ones. That * way I can have a test rig which checks whether passphrases * are being prompted for. */ #define PUTTY_DO_GLOBALS #include #include #include #include #include #include #include "putty.h" #include "ssh.h" #ifdef TESTMODE #define get_random_data get_random_data_diagnostic char *get_random_data(int len) { char *buf = snewn(len, char); memset(buf, 'x', len); return buf; } #endif struct progress { int phase, current; }; static void progress_update(void *param, int action, int phase, int iprogress) { struct progress *p = (struct progress *)param; if (action != PROGFN_PROGRESS) return; if (phase > p->phase) { if (p->phase >= 0) fputc('\n', stderr); p->phase = phase; if (iprogress >= 0) p->current = iprogress - 1; else p->current = iprogress; } while (p->current < iprogress) { fputc('+', stdout); p->current++; } fflush(stdout); } static void no_progress(void *param, int action, int phase, int iprogress) { } void modalfatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); cleanup_exit(1); } /* * Stubs to let everything else link sensibly. */ void log_eventlog(void *handle, const char *event) { } char *x_get_default(const char *key) { return NULL; } void sk_cleanup(void) { } void showversion(void) { char *verstr = dupstr(ver); verstr[0] = tolower(verstr[0]); printf("PuTTYgen %s\n", verstr); sfree(verstr); } void usage(void) { fprintf(stderr, "Usage: puttygen ( keyfile | -t type [ -b bits ] )\n" " [ -C comment ] [ -P ]\n" " [ -o output-keyfile ] [ -O type ]\n"); } void help(void) { /* * Help message is an extended version of the usage message. So * start with that, plus a version heading. */ showversion(); usage(); fprintf(stderr, " -t specify key type when generating (rsa, dsa, rsa1)\n" " -C change or specify key comment\n" " -P change key passphrase\n" " -O specify output type:\n" " private output PuTTY private key format\n" " private-openssh export OpenSSH private key\n" " private-sshcom export ssh.com private key\n" " public standard / ssh.com public key\n" " public-openssh OpenSSH public key\n" " fingerprint output the key fingerprint\n" " -l equivalent to `-O fingerprint'\n" " -L equivalent to `-O public-openssh'\n" " -p equivalent to `-O public'\n" ); } static int save_ssh2_pubkey(char *filename, char *comment, void *v_pub_blob, int pub_len) { unsigned char *pub_blob = (unsigned char *)v_pub_blob; char *p; int i, column; FILE *fp; if (filename) { fp = fopen(filename, "wb"); if (!fp) return 0; } else fp = stdout; fprintf(fp, "---- BEGIN SSH2 PUBLIC KEY ----\n"); if (comment) { fprintf(fp, "Comment: \""); for (p = comment; *p; p++) { if (*p == '\\' || *p == '\"') fputc('\\', fp); fputc(*p, fp); } fprintf(fp, "\"\n"); } i = 0; column = 0; while (i < pub_len) { char buf[5]; int n = (pub_len - i < 3 ? pub_len - i : 3); base64_encode_atom(pub_blob + i, n, buf); i += n; buf[4] = '\0'; fputs(buf, fp); if (++column >= 16) { fputc('\n', fp); column = 0; } } if (column > 0) fputc('\n', fp); fprintf(fp, "---- END SSH2 PUBLIC KEY ----\n"); if (filename) fclose(fp); return 1; } static void move(char *from, char *to) { int ret; ret = rename(from, to); if (ret) { /* * This OS may require us to remove the original file first. */ remove(to); ret = rename(from, to); } if (ret) { perror("puttygen: cannot move new file on to old one"); exit(1); } } static char *blobfp(char *alg, int bits, char *blob, int bloblen) { char buffer[128]; unsigned char digest[16]; struct MD5Context md5c; int i; MD5Init(&md5c); MD5Update(&md5c, blob, bloblen); MD5Final(digest, &md5c); sprintf(buffer, "%s ", alg); if (bits > 0) sprintf(buffer + strlen(buffer), "%d ", bits); for (i = 0; i < 16; i++) sprintf(buffer + strlen(buffer), "%s%02x", i ? ":" : "", digest[i]); return dupstr(buffer); } int main(int argc, char **argv) { char *infile = NULL; Filename infilename; enum { NOKEYGEN, RSA1, RSA2, DSA } keytype = NOKEYGEN; char *outfile = NULL, *outfiletmp = NULL; Filename outfilename; enum { PRIVATE, PUBLIC, PUBLICO, FP, OPENSSH, SSHCOM } outtype = PRIVATE; int bits = 1024; char *comment = NULL, *origcomment = NULL; int change_passphrase = FALSE; int errs = FALSE, nogo = FALSE; int intype = SSH_KEYTYPE_UNOPENABLE; int sshver = 0; struct ssh2_userkey *ssh2key = NULL; struct RSAKey *ssh1key = NULL; char *ssh2blob = NULL, *ssh2alg = NULL; const struct ssh_signkey *ssh2algf = NULL; int ssh2bloblen; char *passphrase = NULL; int load_encrypted; progfn_t progressfn = is_interactive() ? progress_update : no_progress; /* ------------------------------------------------------------------ * Parse the command line to figure out what we've been asked to do. */ /* * If run with no arguments at all, print the usage message and * return success. */ if (argc <= 1) { usage(); return 0; } /* * Parse command line arguments. */ while (--argc) { char *p = *++argv; if (*p == '-') { /* * An option. */ while (p && *++p) { char c = *p; switch (c) { case '-': /* * Long option. */ { char *opt, *val; opt = p++; /* opt will have _one_ leading - */ while (*p && *p != '=') p++; /* find end of option */ if (*p == '=') { *p++ = '\0'; val = p; } else val = NULL; if (!strcmp(opt, "-help")) { help(); nogo = TRUE; } else if (!strcmp(opt, "-version")) { showversion(); nogo = TRUE; } /* * A sample option requiring an argument: * * else if (!strcmp(opt, "-output")) { * if (!val) * errs = TRUE, error(err_optnoarg, opt); * else * ofile = val; * } */ else { errs = TRUE; fprintf(stderr, "puttygen: no such option `--%s'\n", opt); } } p = NULL; break; case 'h': case 'V': case 'P': case 'l': case 'L': case 'p': case 'q': /* * Option requiring no parameter. */ switch (c) { case 'h': help(); nogo = TRUE; break; case 'V': showversion(); nogo = TRUE; break; case 'P': change_passphrase = TRUE; break; case 'l': outtype = FP; break; case 'L': outtype = PUBLICO; break; case 'p': outtype = PUBLIC; break; case 'q': progressfn = no_progress; break; } break; case 't': case 'b': case 'C': case 'O': case 'o': /* * Option requiring parameter. */ p++; if (!*p && argc > 1) --argc, p = *++argv; else if (!*p) { fprintf(stderr, "puttygen: option `-%c' expects a" " parameter\n", c); errs = TRUE; } /* * Now c is the option and p is the parameter. */ switch (c) { case 't': if (!strcmp(p, "rsa") || !strcmp(p, "rsa2")) keytype = RSA2, sshver = 2; else if (!strcmp(p, "rsa1")) keytype = RSA1, sshver = 1; else if (!strcmp(p, "dsa") || !strcmp(p, "dss")) keytype = DSA, sshver = 2; else { fprintf(stderr, "puttygen: unknown key type `%s'\n", p); errs = TRUE; } break; case 'b': bits = atoi(p); break; case 'C': comment = p; break; case 'O': if (!strcmp(p, "public")) outtype = PUBLIC; else if (!strcmp(p, "public-openssh")) outtype = PUBLICO; else if (!strcmp(p, "private")) outtype = PRIVATE; else if (!strcmp(p, "fingerprint")) outtype = FP; else if (!strcmp(p, "private-openssh")) outtype = OPENSSH, sshver = 2; else if (!strcmp(p, "private-sshcom")) outtype = SSHCOM, sshver = 2; else { fprintf(stderr, "puttygen: unknown output type `%s'\n", p); errs = TRUE; } break; case 'o': outfile = p; break; } p = NULL; /* prevent continued processing */ break; default: /* * Unrecognised option. */ errs = TRUE; fprintf(stderr, "puttygen: no such option `-%c'\n", c); break; } } } else { /* * A non-option argument. */ if (!infile) infile = p; else { errs = TRUE; fprintf(stderr, "puttygen: cannot handle more than one" " input file\n"); } } } if (errs) return 1; if (nogo) return 0; /* * If run with at least one argument _but_ not the required * ones, print the usage message and return failure. */ if (!infile && keytype == NOKEYGEN) { usage(); return 1; } /* ------------------------------------------------------------------ * Figure out further details of exactly what we're going to do. */ /* * Bomb out if we've been asked to both load and generate a * key. */ if (keytype != NOKEYGEN && intype) { fprintf(stderr, "puttygen: cannot both load and generate a key\n"); return 1; } /* * Analyse the type of the input file, in case this affects our * course of action. */ if (infile) { infilename = filename_from_str(infile); intype = key_type(&infilename); switch (intype) { /* * It would be nice here to be able to load _public_ * key files, in any of a number of forms, and (a) * convert them to other public key types, (b) print * out their fingerprints. Or, I suppose, for real * orthogonality, (c) change their comment! * * In fact this opens some interesting possibilities. * Suppose ssh2_userkey_loadpub() were able to load * public key files as well as extracting the public * key from private ones. And suppose I did the thing * I've been wanting to do, where specifying a * particular private key file for authentication * causes any _other_ key in the agent to be discarded. * Then, if you had an agent forwarded to the machine * you were running Unix PuTTY or Plink on, and you * needed to specify which of the keys in the agent it * should use, you could do that by supplying a * _public_ key file, thus not needing to trust even * your encrypted private key file to the network. Ooh! */ case SSH_KEYTYPE_UNOPENABLE: case SSH_KEYTYPE_UNKNOWN: fprintf(stderr, "puttygen: unable to load file `%s': %s\n", infile, key_type_to_str(intype)); return 1; case SSH_KEYTYPE_SSH1: if (sshver == 2) { fprintf(stderr, "puttygen: conversion from SSH1 to SSH2 keys" " not supported\n"); return 1; } sshver = 1; break; case SSH_KEYTYPE_SSH2: case SSH_KEYTYPE_OPENSSH: case SSH_KEYTYPE_SSHCOM: if (sshver == 1) { fprintf(stderr, "puttygen: conversion from SSH2 to SSH1 keys" " not supported\n"); return 1; } sshver = 2; break; } } /* * Determine the default output file, if none is provided. * * This will usually be equal to stdout, except that if the * input and output file formats are the same then the default * output is to overwrite the input. * * Also in this code, we bomb out if the input and output file * formats are the same and no other action is performed. */ if ((intype == SSH_KEYTYPE_SSH1 && outtype == PRIVATE) || (intype == SSH_KEYTYPE_SSH2 && outtype == PRIVATE) || (intype == SSH_KEYTYPE_OPENSSH && outtype == OPENSSH) || (intype == SSH_KEYTYPE_SSHCOM && outtype == SSHCOM)) { if (!outfile) { outfile = infile; outfiletmp = dupcat(outfile, ".tmp"); } if (!change_passphrase && !comment) { fprintf(stderr, "puttygen: this command would perform no useful" " action\n"); return 1; } } else { if (!outfile) { /* * Bomb out rather than automatically choosing to write * a private key file to stdout. */ if (outtype==PRIVATE || outtype==OPENSSH || outtype==SSHCOM) { fprintf(stderr, "puttygen: need to specify an output file\n"); return 1; } } } /* * Figure out whether we need to load the encrypted part of the * key. This will be the case if either (a) we need to write * out a private key format, or (b) the entire input key file * is encrypted. */ if (outtype == PRIVATE || outtype == OPENSSH || outtype == SSHCOM || intype == SSH_KEYTYPE_OPENSSH || intype == SSH_KEYTYPE_SSHCOM) load_encrypted = TRUE; else load_encrypted = FALSE; /* ------------------------------------------------------------------ * Now we're ready to actually do some stuff. */ /* * Either load or generate a key. */ if (keytype != NOKEYGEN) { char *entropy; char default_comment[80]; time_t t; struct tm *tm; struct progress prog; prog.phase = -1; prog.current = -1; time(&t); tm = localtime(&t); if (keytype == DSA) strftime(default_comment, 30, "dsa-key-%Y%m%d", tm); else strftime(default_comment, 30, "rsa-key-%Y%m%d", tm); random_init(); entropy = get_random_data(bits / 8); random_add_heavynoise(entropy, bits / 8); memset(entropy, 0, bits/8); sfree(entropy); if (keytype == DSA) { struct dss_key *dsskey = snew(struct dss_key); dsa_generate(dsskey, bits, progressfn, &prog); ssh2key = snew(struct ssh2_userkey); ssh2key->data = dsskey; ssh2key->alg = &ssh_dss; ssh1key = NULL; } else { struct RSAKey *rsakey = snew(struct RSAKey); rsa_generate(rsakey, bits, progressfn, &prog); if (keytype == RSA1) { ssh1key = rsakey; } else { ssh2key = snew(struct ssh2_userkey); ssh2key->data = rsakey; ssh2key->alg = &ssh_rsa; } } progressfn(&prog, PROGFN_PROGRESS, INT_MAX, -1); if (ssh2key) ssh2key->comment = dupstr(default_comment); if (ssh1key) ssh1key->comment = dupstr(default_comment); } else { const char *error = NULL; int encrypted; assert(infile != NULL); /* * Find out whether the input key is encrypted. */ if (intype == SSH_KEYTYPE_SSH1) encrypted = rsakey_encrypted(&infilename, &origcomment); else if (intype == SSH_KEYTYPE_SSH2) encrypted = ssh2_userkey_encrypted(&infilename, &origcomment); else encrypted = import_encrypted(&infilename, intype, &origcomment); /* * If so, ask for a passphrase. */ if (encrypted && load_encrypted) { passphrase = snewn(512, char); if (!console_get_line("Enter passphrase to load key: ", passphrase, 512, TRUE)) { perror("puttygen: unable to read passphrase"); return 1; } } else { passphrase = NULL; } switch (intype) { int ret; case SSH_KEYTYPE_SSH1: ssh1key = snew(struct RSAKey); if (!load_encrypted) { void *vblob; char *blob; int n, bloblen; ret = rsakey_pubblob(&infilename, &vblob, &bloblen, &error); blob = (char *)vblob; n = 4; /* skip modulus bits */ n += ssh1_read_bignum(blob + n, &ssh1key->exponent); n += ssh1_read_bignum(blob + n, &ssh1key->modulus); ssh1key->comment = NULL; } else { ret = loadrsakey(&infilename, ssh1key, passphrase, &error); } if (ret) error = NULL; else if (!error) error = "unknown error"; break; case SSH_KEYTYPE_SSH2: if (!load_encrypted) { ssh2blob = ssh2_userkey_loadpub(&infilename, &ssh2alg, &ssh2bloblen, &error); ssh2algf = find_pubkey_alg(ssh2alg); if (ssh2algf) bits = ssh2algf->pubkey_bits(ssh2blob, ssh2bloblen); else bits = -1; } else { ssh2key = ssh2_load_userkey(&infilename, passphrase, &error); } if (ssh2key || ssh2blob) error = NULL; else if (!error) { if (ssh2key == SSH2_WRONG_PASSPHRASE) error = "wrong passphrase"; else error = "unknown error"; } break; case SSH_KEYTYPE_OPENSSH: case SSH_KEYTYPE_SSHCOM: ssh2key = import_ssh2(&infilename, intype, passphrase); if (ssh2key) error = NULL; else if (!error) { if (ssh2key == SSH2_WRONG_PASSPHRASE) error = "wrong passphrase"; else error = "unknown error"; } break; default: assert(0); } if (error) { fprintf(stderr, "puttygen: error loading `%s': %s\n", infile, error); return 1; } } /* * Change the comment if asked to. */ if (comment) { if (sshver == 1) { assert(ssh1key); sfree(ssh1key->comment); ssh1key->comment = dupstr(comment); } else { assert(ssh2key); sfree(ssh2key->comment); ssh2key->comment = dupstr(comment); } } /* * Prompt for a new passphrase if we have been asked to, or if * we have just generated a key. */ if (change_passphrase || keytype != NOKEYGEN) { char *passphrase2; if (passphrase) { memset(passphrase, 0, strlen(passphrase)); sfree(passphrase); } passphrase = snewn(512, char); passphrase2 = snewn(512, char); if (!console_get_line("Enter passphrase to save key: ", passphrase, 512, TRUE) || !console_get_line("Re-enter passphrase to verify: ", passphrase2, 512, TRUE)) { perror("puttygen: unable to read new passphrase"); return 1; } if (strcmp(passphrase, passphrase2)) { fprintf(stderr, "puttygen: passphrases do not match\n"); return 1; } memset(passphrase2, 0, strlen(passphrase2)); sfree(passphrase2); if (!*passphrase) { sfree(passphrase); passphrase = NULL; } } /* * Write output. * * (In the case where outfile and outfiletmp are both NULL, * there is no semantic reason to initialise outfilename at * all; but we have to write _something_ to it or some compiler * will probably complain that it might be used uninitialised.) */ if (outfiletmp) outfilename = filename_from_str(outfiletmp); else outfilename = filename_from_str(outfile ? outfile : ""); switch (outtype) { int ret; case PRIVATE: if (sshver == 1) { assert(ssh1key); ret = saversakey(&outfilename, ssh1key, passphrase); if (!ret) { fprintf(stderr, "puttygen: unable to save SSH1 private key\n"); return 1; } } else { assert(ssh2key); ret = ssh2_save_userkey(&outfilename, ssh2key, passphrase); if (!ret) { fprintf(stderr, "puttygen: unable to save SSH2 private key\n"); return 1; } } if (outfiletmp) move(outfiletmp, outfile); break; case PUBLIC: case PUBLICO: if (sshver == 1) { FILE *fp; char *dec1, *dec2; assert(ssh1key); if (outfile) fp = f_open(outfilename, "w"); else fp = stdout; dec1 = bignum_decimal(ssh1key->exponent); dec2 = bignum_decimal(ssh1key->modulus); fprintf(fp, "%d %s %s %s\n", bignum_bitcount(ssh1key->modulus), dec1, dec2, ssh1key->comment); sfree(dec1); sfree(dec2); if (outfile) fclose(fp); } else if (outtype == PUBLIC) { if (!ssh2blob) { assert(ssh2key); ssh2blob = ssh2key->alg->public_blob(ssh2key->data, &ssh2bloblen); } save_ssh2_pubkey(outfile, ssh2key ? ssh2key->comment : origcomment, ssh2blob, ssh2bloblen); } else if (outtype == PUBLICO) { char *buffer, *p; int i; FILE *fp; if (!ssh2blob) { assert(ssh2key); ssh2blob = ssh2key->alg->public_blob(ssh2key->data, &ssh2bloblen); } if (!ssh2alg) { assert(ssh2key); ssh2alg = ssh2key->alg->name; } if (ssh2key) comment = ssh2key->comment; else comment = origcomment; buffer = snewn(strlen(ssh2alg) + 4 * ((ssh2bloblen+2) / 3) + strlen(comment) + 3, char); strcpy(buffer, ssh2alg); p = buffer + strlen(buffer); *p++ = ' '; i = 0; while (i < ssh2bloblen) { int n = (ssh2bloblen - i < 3 ? ssh2bloblen - i : 3); base64_encode_atom(ssh2blob + i, n, p); i += n; p += 4; } if (*comment) { *p++ = ' '; strcpy(p, comment); } else *p++ = '\0'; if (outfile) fp = f_open(outfilename, "w"); else fp = stdout; fprintf(fp, "%s\n", buffer); if (outfile) fclose(fp); sfree(buffer); } break; case FP: { FILE *fp; char *fingerprint; if (sshver == 1) { assert(ssh1key); fingerprint = snewn(128, char); rsa_fingerprint(fingerprint, 128, ssh1key); } else { if (ssh2key) { fingerprint = ssh2key->alg->fingerprint(ssh2key->data); } else { assert(ssh2blob); fingerprint = blobfp(ssh2alg, bits, ssh2blob, ssh2bloblen); } } if (outfile) fp = f_open(outfilename, "w"); else fp = stdout; fprintf(fp, "%s\n", fingerprint); if (outfile) fclose(fp); sfree(fingerprint); } break; case OPENSSH: case SSHCOM: assert(sshver == 2); assert(ssh2key); ret = export_ssh2(&outfilename, outtype, ssh2key, passphrase); if (!ret) { fprintf(stderr, "puttygen: unable to export key\n"); return 1; } if (outfiletmp) move(outfiletmp, outfile); break; } if (passphrase) { memset(passphrase, 0, strlen(passphrase)); sfree(passphrase); } if (ssh1key) freersakey(ssh1key); if (ssh2key) { ssh2key->alg->freekey(ssh2key->data); sfree(ssh2key); } return 0; } Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 699f9a4c715a6ea56f711a8c1497e32d Text-delta-base-sha1: 8f6ee6c8db85a5bfa55035aac3f7c55e93366f05 Text-content-length: 120 Text-content-md5: f49903499654ab89d67e2f77e3ca09f3 Text-content-sha1: f24b3ea4e3664d5ff92c2feb019e2dcf70b3aced Content-length: 161 K 15 cvs2svn:cvs-rev V 5 1.225 PROPS-END SVN0]  Fint is_interactive(voidchar *get_random_data(int bytes); /* used in cmdgen.c */ #endif Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0026d9d035359da5e41f528714d57f2c Text-delta-base-sha1: 210eab07d0efa0974e779745b5a8cfbdac9be6e8 Text-content-length: 108 Text-content-md5: 54ba186d31931617f6d58e49de20aac6 Text-content-sha1: 1a253d4cf1d2adeadb31124d1c1275c1a321c553 Content-length: 148 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVNvaQ^0Htint (*pubkey_bits) (voidconst struct ssh_signkey *find_pubkey_alg(const char *nam Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 03c6ee51ad392538f2c36fb717baf7dc Text-delta-base-sha1: a6038d85e6a9bc234ca56c8cfdb461e73c236e27 Text-content-length: 239 Text-content-md5: cdbb609974ddfcbb99a5fdc96ff51a46 Text-content-sha1: 66877af0a5f81dd0f965a411643374c61f8e9771 Content-length: 279 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNmO,D T4int dss_pubkey_bits(void *blob, int len) { struct dss_key *dss; int ret; dss = dss_newkey((char *) blob, len); ret = bignum_bitcount(dss->p); dss_freekey(dss); return retpubkey_bits Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8ec8567f1721514a12520c94be08a32d Text-delta-base-sha1: f1c1bd5d36e369fc4720c65bb3547d81be3443e5 Text-content-length: 368 Text-content-md5: 748bd3d21c8c63e9027ad66dcceed925 Text-content-sha1: 4e6a41ef2c0812c715d7dd491ac9e0c4c90a8780 Content-length: 408 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN`F20P MsY0ICnw8RcRfp = NULLif (fp) fp = NULLconst struct ssh_signkey *find_pubkey_alg(const char *name) { if (!strcmp(name, "ssh-rsa")) return &ssh_rsa; else if (!strcmp(name, "ssh-dss")) return &ssh_dss; else return NULL; }alg = find_pubkey_alg(b); if (!alg)alg = find_pubkey_alg(b); if (!alg) Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b340b1c8615418caabf3cfe246eb18b6 Text-delta-base-sha1: a5484035d92ec607a1b8cec7aa22b870e06bdc3a Text-content-length: 247 Text-content-md5: 52076dbaf8d1ddfd0dcdf689d11555c4 Text-content-sha1: 4b141b25f13b5da7670e6e43bea4edddf181287d Content-length: 287 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVN yW5L)X3int rsa2_pubkey_bits(void *blob, int len) { struct RSAKey *rsa; int ret; rsa = rsa2_newkey((char *) blob, len); ret = bignum_bitcount(rsa->modulus); rsa2_freekey(rsa); return retpubkey_bits Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 112 Content-length: 112 K 10 svn:ignore V 80 Makefile.gtk Makefile local plink pterm putty puttytel psftp pscp puttygen *.log PROPS-END Node-path: putty/unix/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b867dd66d06a5fef9a88f3edf99363ca Text-delta-base-sha1: be1a0f82ed756bc971cd77411156e003b0cc5741 Text-content-length: 29 Text-content-md5: 46310dae2e33f18cc392a1ba3d57bb6c Text-content-sha1: fafeb669436e4bbc452384a3ccc200d226361a11 Content-length: 68 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNHQA puttygen *.log Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0d0bd93f4c2d5af9bae282580de68ed0 Text-delta-base-sha1: 14d7f4a94f361ea0b00096e44d3969dfc05820b6 Text-content-length: 68 Text-content-md5: f7fec101f93d4d9c908f9668a381914c Text-content-sha1: 055f9cd6ba5a210dede65e810e77daee5b16c78f Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN*^4* int is_interactive(void) { return isatty(0); } Node-path: putty/unix/uxgen.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 630 Text-content-md5: 0e034ec45febb2a5f3a9e0f870b5647a Text-content-sha1: 0e65ca3150e6abed0284036476755fa9f34c8e1b Content-length: 746 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNhhh/* * uxgen.c: Unix implementation of get_heavy_noise() from cmdgen.c. */ #include #include #include #include "putty.h" char *get_random_data(int len) { char *buf = snewn(len, char); int fd; int ngot, ret; fd = open("/dev/random", O_RDONLY); if (fd < 0) { sfree(buf); perror("puttygen: unable to open /dev/random"); return NULL; } ngot = 0; while (ngot < len) { ret = read(fd, buf+ngot, len-ngot); if (ret < 0) { close(fd); perror("puttygen: unable to read /dev/random"); return NULL; } ngot += ret; } return buf; } Revision-number: 3763 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.198181Z PROPS-END Revision-number: 3764 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.208092Z PROPS-END Revision-number: 3765 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2004-01-23T13:21:17.000000Z K 7 svn:log V 51 Couple of bits missing from the command-line help. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bfc45b4cf02b07e5df2fbb7a60b61967 Text-delta-base-sha1: c93713fa30592f044f9bea9dcc47f258bd7297a8 Text-content-length: 129 Text-content-md5: 08024856dda436ae1085daacf2bec0d6 Text-content-sha1: 7e0f5d6602b3af9e4df437c41392a1ba142721a6 Content-length: 168 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN{s][ Zm{| -l | -L" " | -pb specify number of bits when generating keyo specify output file Revision-number: 3766 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 Add a man page for the new command-line PuTTYgen. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-01-23T13:21:25.000000Z PROPS-END Node-path: putty/unix/puttygen.1 Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5348 Text-content-md5: 73ce8661b4e65317d6fdfe7cbe24c339 Text-content-sha1: f2da12d1d97b11e8da99a8e3daf9924ce3119de7 Content-length: 5464 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNVVV.TH puttygen 1 .UC .SH NAME puttygen \- public-key generator for the PuTTY tools .SH SYNOPSIS \fBputtygen\fP ( \fIkeyfile\fP | \-t \fIkeytype\fP [ \-b \fIbits\fP ] ) [ \-C \fInew-comment\fP ] [ \-P ] [ \-O \fIoutput-type\fP | \-l | \-L | \-p ] [ \-o \fIoutput-file\fP ] .SH DESCRIPTION \fBputtygen\fP is a tool to generate and manipulate SSH public and private key pairs. It is part of the PuTTY suite, although it can also interoperate with the private key formats used by some other SSH clients. When you run \fBputtygen\fP, it does three things. Firstly, it either loads an existing key file (if you specified \fIkeyfile\fP), or generates a new key (if you specified \fIkeytype\fP). Then, it optionally makes modifications to the key (changing the comment and/or the passphrase); finally, it outputs the key, or some information about the key, to a file. All three of these phases are controlled by the options described in the following section. .SH OPTIONS In the first phase, \fBputtygen\fP either loads or generates a key. The options to control this are: .IP "\fIkeyfile\fP" Specify a private key file to be loaded. This private key file can be in the (de facto standard) SSH1 key format, or in PuTTY's SSH2 key format, or in either of the SSH2 private key formats used by OpenSSH and ssh.com's implementation. .IP "\fB\-t\fP \fIkeytype\fP" Specify a type of key to generate. The acceptable values here are \fBrsa\fP and \fBdsa\fP (to generate SSH2 keys), and \fBrsa1\fP (to generate SSH1 keys). .IP "\fB\-b\fP \fIbits\fP" Specify the size of the key to generate, in bits. Default is 1024. .PP In the second phase, \fBputtygen\fP optionally alters properties of the key it has loaded or generated. The options to control this are: .IP "\fB\-C\fP \fInew\-comment\fP" Specify a comment string to describe the key. This comment string will be used by PuTTY to identify the key to you (when asking you to enter the passphrase, for example, so that you know which passphrase to type). .IP "\fB\-P\fP" Indicate that you want to change the key's passphrase. This is automatic when you are generating a new key, but not when you are modifying an existing key. .PP In the third phase, \fBputtygen\fP saves the key or information about it. The options to control this are: .IP "\fB\-O\fP \fIoutput\-type\fP" Specify the type of output you want \fBputtygen\fP to produce. Acceptable options are: .RS .IP "\fBprivate\fP" Save the private key in a format usable by PuTTY. This will either be the standard SSH1 key format, or PuTTY's own SSH2 key format. .IP "\fBpublic\fP" Save the public key only. For SSH1 keys, the standard public key format will be used ("1024 37 5698745...."). For SSH2 keys, the public key will be output in the format specified in the IETF drafts, which is a multi-line text file beginning with the line "---- BEGIN SSH2 PUBLIC KEY ----". .IP "\fBpublic-openssh\fP" Save the public key only, in a format usable by OpenSSH. For SSH1 keys, this output format behaves identically to \fBpublic\fP. For SSH2 keys, the public key will be output in the OpenSSH format, which is a single line ("ssh-rsa AAAAB3NzaC1yc2..."). .IP "\fBfingerprint\fP" Print the fingerprint of the public key. All fingerprinting algorithms are believed compatible with OpenSSH. .IP "\fBprivate-openssh\fP" Save an SSH2 private key in OpenSSH's format. This option is not permitted for SSH1 keys. .IP "\fBprivate-sshcom\fP" Save an SSH2 private key in ssh.com's format. This option is not permitted for SSH1 keys. .RE .IP If no output type is specified, the default is \fBprivate\fP. .IP "\fB\-o\fP \fIoutput\-file\fP" Specify the file where \fBputtygen\fP should write its output. If this option is not specified, \fBputtygen\fP will assume you want to overwrite the original file if the input and output file types are the same (changing a comment or passphrase), and will assume you want to output to stdout if you are asking for a public key or fingerprint. Otherwise, the \fB\-o\fP option is required. .IP "\fB\-l\fP" Synonym for "\fB-O fingerprint\fP". .IP "\fB\-L\fP" Synonym for "\fB-O public-openssh\fP". .IP "\fB\-p\fP" Synonym for "\fB-O public\fP". .SH EXAMPLES To generate an SSH2 RSA key pair and save it in PuTTY's own format (you will be prompted for the passphrase): \fBputtygen -t rsa -C "my home key" -o mykey.ppk\fP To generate a larger (2048-bit) key: \fBputtygen -t rsa -b 2048 -C "my home key" -o mykey.ppk\fP To change the passphrase on a key (you will be prompted for the old and new passphrases): \fBputtygen -P mykey.ppk\fP To change the comment on a key: \fBputtygen -C "new comment" mykey.ppk\fP To convert a key into OpenSSH's private key format: \fBputtygen mykey.ppk -O private-openssh -o my-openssh-key\fP To convert a key \fIfrom\fP another format (\fBputtygen\fP will automatically detect the input key type): \fBputtygen my-ssh.com-key -o mykey.ppk\fP To display the fingerprint of a key (some key types require a passphrase to extract even this much information): \fBputtygen -l mykey.ppk\fP To add the OpenSSH-format public half of a key to your authorised keys file: \fBputtygen -L mykey.ppk >> $HOME/.ssh/authorized_keys\fP .SH BUGS There's currently no way to supply passphrases in batch mode, or even just to specify that you don't want a passphrase at all. Revision-number: 3767 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2004-01-24T17:16:37.000000Z K 7 svn:log V 118 Reasonably thorough test suite for command-line PuTTYgen, and several bugs fixed in the process of constructing same. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 08024856dda436ae1085daacf2bec0d6 Text-delta-base-sha1: 7e0f5d6602b3af9e4df437c41392a1ba142721a6 Text-content-length: 15785 Text-content-md5: 4ddb0294f2ab5b2f2dd8764ca0881261 Text-content-sha1: 767529998acaa1e648f77831726190cc3a0e297e Content-length: 15824 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNsJTGE)q%r/>Wx |j~k[DF4QxeQv}L/* * cmdgen.c - command-line form of PuTTYgen_CMDGEN /* * This section overrides some definitions below for test purposes. * When compiled with -DTEST_CMDGEN: * * - Calls to get_random_data() are replaced with the diagnostic * function below (I #define the name so that I can still link * with the original set of modules without symbol clash), in * order to avoid depleting the test system's /dev/random * unnecessarily. * * - Calls to console_get_line() are replaced with the diagnostic * function below, so that I can run tests in an automated * manner and provide their interactive passphrase inputs. * * - main() is renamed to cmdgen_main(); at the bottom of the file * I define another main() which calls the former repeatedly to * run tests. */define console_get_line console_get_line_diagnostic int nprompts, promptsgot; const char *prompts[3]; int console_get_line(const char *prompt, char *str, int maxlen, int is_pw) { if (promptsgot < nprompts) { assert(strlen(prompts[promptsgot]) < maxlen); strcpy(str, prompts[promptsgot++]); return TRUE; } else { promptsgot++; /* track number of requests anyway */ return FALSE; } } #define main cmdgen_mainintreturn FALSE; } return TRUE;, NULLrsakey->comment = NULL ssh1key->private_expon > 0(ssh2key && ssh2key != SSH2_WRONG_PASSPHRASE) { if (!move(outfiletmp, outfile)) return 1; /* rename failed */ } { if (!move(outfiletmp, outfile)) return 1; /* rename failed */ } #ifdef TEST_CMDGEN #undef main #include int passes, fails; void setup_passphrases(char *first, ...) { va_list ap; char *next; nprompts = 0; if (first) { prompts[nprompts++] = first; va_start(ap, first); while ((next = va_arg(ap, char *)) != NULL) { assert(nprompts < lenof(prompts)); prompts[nprompts++] = next; } va_end(ap); } } void test(int retval, ...) { va_list ap; int i, argc, ret; char **argv; argc = 0; va_start(ap, retval); while (va_arg(ap, char *) != NULL) argc++; va_end(ap); argv = snewn(argc+1, char *); va_start(ap, retval); for (i = 0; i <= argc; i++) argv[i] = va_arg(ap, char *); va_end(ap); promptsgot = 0; ret = cmdgen_main(argc, argv); if (ret != retval) { printf("FAILED retval (exp %d got %d):", retval, ret); for (i = 0; i < argc; i++) printf(" %s", argv[i]); printf("\n"); fails++; } else if (promptsgot != nprompts) { printf("FAILED nprompts (exp %d got %d):", nprompts, promptsgot); for (i = 0; i < argc; i++) printf(" %s", argv[i]); printf("\n"); fails++; } else { passes++; } } void filecmp(char *file1, char *file2, char *fmt, ...) { /* * Ideally I should do file comparison myself, to maximise the * portability of this test suite once this application begins * running on non-Unix platforms. For the moment, though, * calling Unix diff is perfectly adequate. */ char *buf; int ret; buf = dupprintf("diff -q '%s' '%s'", file1, file2); ret = system(buf); sfree(buf); if (ret) { va_list ap; printf("FAILED diff (ret=%d): ", ret); va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); printf("\n"); fails++; } else passes++; } char *cleanup_fp(char *s) { char *p; if (!strncmp(s, "ssh-", 4)) { s += strcspn(s, " \n\t"); s += strspn(s, " \n\t"); } p = s; s += strcspn(s, " \n\t"); s += strspn(s, " \n\t"); s += strcspn(s, " \n\t"); return dupprintf("%.*s", s - p, p); } char *get_fp(char *filename) { FILE *fp; char buf[256], *ret; fp = fopen(filename, "r"); if (!fp) return NULL; ret = fgets(buf, sizeof(buf), fp); fclose(fp); if (!ret) return NULL; return cleanup_fp(buf); } void check_fp(char *filename, char *fp, char *fmt, ...) { char *newfp; if (!fp) return; newfp = get_fp(filename); if (!strcmp(fp, newfp)) { passes++; } else { va_list ap; printf("FAILED check_fp ['%s' != '%s']: ", newfp, fp); va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); printf("\n"); fails++; } sfree(newfp); } int main(int argc, char **argv) { int i; static char *const keytypes[] = { "rsa1", "dsa", "rsa" }; /* * Even when this thing is compiled for automatic test mode, * it's helpful to be able to invoke it with command-line * options for _manual_ tests. */ if (argc > 1) return cmdgen_main(argc, argv); passes = fails = 0; for (i = 0; i < lenof(keytypes); i++) { char filename[128], osfilename[128], scfilename[128]; char pubfilename[128], tmpfilename1[128], tmpfilename2[128]; char *fp; sprintf(filename, "test-%s.ppk", keytypes[i]); sprintf(pubfilename, "test-%s.pub", keytypes[i]); sprintf(osfilename, "test-%s.os", keytypes[i]); sprintf(scfilename, "test-%s.sc", keytypes[i]); sprintf(tmpfilename1, "test-%s.tmp1", keytypes[i]); sprintf(tmpfilename2, "test-%s.tmp2", keytypes[i]); /* * Create an encrypted key. */ setup_passphrases("sponge", "sponge", NULL); test(0, "puttygen", "-t", keytypes[i], "-o", filename, NULL); /* * List the public key in OpenSSH format. */ setup_passphrases(NULL); test(0, "puttygen", "-L", filename, "-o", pubfilename, NULL); { char cmdbuf[256]; fp = NULL; sprintf(cmdbuf, "ssh-keygen -l -f '%s' > '%s'", pubfilename, tmpfilename1); if (system(cmdbuf) || (fp = get_fp(tmpfilename1)) == NULL) { printf("UNABLE to test fingerprint matching against OpenSSH"); } } /* * List the public key in IETF/ssh.com format. */ setup_passphrases(NULL); test(0, "puttygen", "-p", filename, NULL); /* * List the fingerprint of the key. */ setup_passphrases(NULL); test(0, "puttygen", "-l", filename, "-o", tmpfilename1, NULL); if (!fp) { /* * If we can't test fingerprints against OpenSSH, we * can at the very least test equality of all the * fingerprints we generate of this key throughout * testing. */ fp = get_fp(tmpfilename1); } else { check_fp(tmpfilename1, fp, "%s initial fp", keytypes[i]); } /* * Change the comment of the key; this _does_ require a * passphrase owing to the tamperproofing. * * NOTE: In SSH1, this only requires a passphrase because * of inadequacies of the loading and saving mechanisms. In * _principle_, it should be perfectly possible to modify * the comment on an SSH1 key without requiring a * passphrase; the only reason I can't do it is because my * loading and saving mechanisms don't include a method of * loading all the key data without also trying to decrypt * the private section. * * I don't consider this to be a problem worth solving, * because (a) to fix it would probably end up bloating * PuTTY proper, and (b) SSH1 is on the way out anyway so * it shouldn't be highly significant. If it seriously * bothers anyone then perhaps I _might_ be persuadable. */ setup_passphrases("sponge", NULL); test(0, "puttygen", "-C", "new-comment", filename, NULL); /* * Change the passphrase to nothing. */ setup_passphrases("sponge", "", "", NULL); test(0, "puttygen", "-P", filename, NULL); /* * Change the comment of the key again; this time we expect no * passphrase to be required. */ setup_passphrases(NULL); test(0, "puttygen", "-C", "new-comment-2", filename, NULL); /* * Export the private key into OpenSSH format; no passphrase * should be required since the key is currently unencrypted. * For RSA1 keys, this should give an error. */ setup_passphrases(NULL); test((i==0), "puttygen", "-O", "private-openssh", "-o", osfilename, filename, NULL); if (i) { /* * List the fingerprint of the OpenSSH-formatted key. */ setup_passphrases(NULL); test(0, "puttygen", "-l", osfilename, "-o", tmpfilename1, NULL); check_fp(tmpfilename1, fp, "%s openssh clear fp", keytypes[i]); /* * List the public half of the OpenSSH-formatted key in * OpenSSH format. */ setup_passphrases(NULL); test(0, "puttygen", "-L", osfilename, NULL); /* * List the public half of the OpenSSH-formatted key in * IETF/ssh.com format. */ setup_passphrases(NULL); test(0, "puttygen", "-p", osfilename, NULL); } /* * Export the private key into ssh.com format; no passphrase * should be required since the key is currently unencrypted. * For RSA1 keys, this should give an error. */ setup_passphrases(NULL); test((i==0), "puttygen", "-O", "private-sshcom", "-o", scfilename, filename, NULL); if (i) { /* * List the fingerprint of the ssh.com-formatted key. */ setup_passphrases(NULL); test(0, "puttygen", "-l", scfilename, "-o", tmpfilename1, NULL); check_fp(tmpfilename1, fp, "%s ssh.com clear fp", keytypes[i]); /* * List the public half of the ssh.com-formatted key in * OpenSSH format. */ setup_passphrases(NULL); test(0, "puttygen", "-L", scfilename, NULL); /* * List the public half of the ssh.com-formatted key in * IETF/ssh.com format. */ setup_passphrases(NULL); test(0, "puttygen", "-p", scfilename, NULL); } if (i) { /* * Convert from OpenSSH into ssh.com. */ setup_passphrases(NULL); test(0, "puttygen", osfilename, "-o", tmpfilename1, "-O", "private-sshcom", NULL); /* * Convert from ssh.com back into a PuTTY key, * supplying the same comment as we had before we * started to ensure the comparison works. */ setup_passphrases(NULL); test(0, "puttygen", tmpfilename1, "-C", "new-comment-2", "-o", tmpfilename2, NULL); /* * See if the PuTTY key thus generated is the same as * the original. */ filecmp(filename, tmpfilename2, "p->o->s->p clear %s", keytypes[i]); /* * Convert from ssh.com to OpenSSH. */ setup_passphrases(NULL); test(0, "puttygen", scfilename, "-o", tmpfilename1, "-O", "private-openssh", NULL); /* * Convert from OpenSSH back into a PuTTY key, * supplying the same comment as we had before we * started to ensure the comparison works. */ setup_passphrases(NULL); test(0, "puttygen", tmpfilename1, "-C", "new-comment-2", "-o", tmpfilename2, NULL); /* * See if the PuTTY key thus generated is the same as * the original. */ filecmp(filename, tmpfilename2, "p->s->o->p clear %s", keytypes[i]); /* * Finally, do a round-trip conversion between PuTTY * and ssh.com without involving OpenSSH, to test that * the key comment is preserved in that case. */ setup_passphrases(NULL); test(0, "puttygen", "-O", "private-sshcom", "-o", tmpfilename1, filename, NULL); setup_passphrases(NULL); test(0, "puttygen", tmpfilename1, "-o", tmpfilename2, NULL); filecmp(filename, tmpfilename2, "p->s->p clear %s", keytypes[i]); } /* * Check that mismatched passphrases cause an error. */ setup_passphrases("sponge2", "sponge3", NULL); test(1, "puttygen", "-P", filename, NULL); /* * Put a passphrase back on. */ setup_passphrases("sponge2", "sponge2", NULL); test(0, "puttygen", "-P", filename, NULL); /* * Export the private key into OpenSSH format, this time * while encrypted. For RSA1 keys, this should give an * error. */ if (i == 0) setup_passphrases(NULL); /* error, hence no passphrase read */ else setup_passphrases("sponge2", NULL); test((i==0), "puttygen", "-O", "private-openssh", "-o", osfilename, filename, NULL); if (i) { /* * List the fingerprint of the OpenSSH-formatted key. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", "-l", osfilename, "-o", tmpfilename1, NULL); check_fp(tmpfilename1, fp, "%s openssh encrypted fp", keytypes[i]); /* * List the public half of the OpenSSH-formatted key in * OpenSSH format. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", "-L", osfilename, NULL); /* * List the public half of the OpenSSH-formatted key in * IETF/ssh.com format. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", "-p", osfilename, NULL); } /* * Export the private key into ssh.com format, this time * while encrypted. For RSA1 keys, this should give an * error. */ if (i == 0) setup_passphrases(NULL); /* error, hence no passphrase read */ else setup_passphrases("sponge2", NULL); test((i==0), "puttygen", "-O", "private-sshcom", "-o", scfilename, filename, NULL); if (i) { /* * List the fingerprint of the ssh.com-formatted key. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", "-l", scfilename, "-o", tmpfilename1, NULL); check_fp(tmpfilename1, fp, "%s ssh.com encrypted fp", keytypes[i]); /* * List the public half of the ssh.com-formatted key in * OpenSSH format. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", "-L", scfilename, NULL); /* * List the public half of the ssh.com-formatted key in * IETF/ssh.com format. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", "-p", scfilename, NULL); } if (i) { /* * Convert from OpenSSH into ssh.com. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", osfilename, "-o", tmpfilename1, "-O", "private-sshcom", NULL); /* * Convert from ssh.com back into a PuTTY key, * supplying the same comment as we had before we * started to ensure the comparison works. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", tmpfilename1, "-C", "new-comment-2", "-o", tmpfilename2, NULL); /* * See if the PuTTY key thus generated is the same as * the original. */ filecmp(filename, tmpfilename2, "p->o->s->p encrypted %s", keytypes[i]); /* * Convert from ssh.com to OpenSSH. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", scfilename, "-o", tmpfilename1, "-O", "private-openssh", NULL); /* * Convert from OpenSSH back into a PuTTY key, * supplying the same comment as we had before we * started to ensure the comparison works. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", tmpfilename1, "-C", "new-comment-2", "-o", tmpfilename2, NULL); /* * See if the PuTTY key thus generated is the same as * the original. */ filecmp(filename, tmpfilename2, "p->s->o->p encrypted %s", keytypes[i]); /* * Finally, do a round-trip conversion between PuTTY * and ssh.com without involving OpenSSH, to test that * the key comment is preserved in that case. */ setup_passphrases("sponge2", NULL); test(0, "puttygen", "-O", "private-sshcom", "-o", tmpfilename1, filename, NULL); setup_passphrases("sponge2", NULL); test(0, "puttygen", tmpfilename1, "-o", tmpfilename2, NULL); filecmp(filename, tmpfilename2, "p->s->p encrypted %s", keytypes[i]); } /* * Load with the wrong passphrase. */ setup_passphrases("sponge8", NULL); test(1, "puttygen", "-C", "spurious-new-comment", filename, NULL); /* * Load a totally bogus file. */ setup_passphrases(NULL); test(1, "puttygen", "-C", "spurious-new-comment", pubfilename, NULL); } printf("%d passes, %d fails\n", passes, fails); return 0; } #endif Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 748bd3d21c8c63e9027ad66dcceed925 Text-delta-base-sha1: 4e6a41ef2c0812c715d7dd491ac9e0c4c90a8780 Text-content-length: 52 Text-content-md5: 7779df645f1b56ff29f225aed7da2cf2 Text-content-sha1: 3573c231e3e5c2478729adec94d52e3ac7623ba5 Content-length: 92 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNFd +(error = "wrong passphrase"; Revision-number: 3768 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2004-01-24T18:30:32.000000Z K 7 svn:log V 22 Unix PuTTYgen: exists K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 041ebf292a587966d5cc5a7528229c13 Text-delta-base-sha1: 0356c10a14849c9f5c5208e56b7fe25963ecd1ae Text-content-length: 134 Text-content-md5: 3a6eb1e542e28a561351f60801322aee Text-content-sha1: 68e2885d5d26d1bd59cd9824cd3dd477336794cc Content-length: 174 K 15 cvs2svn:cvs-rev V 4 1.53 PROPS-END SVN_^hc8t+@\versionid $Id: faq.but,v 1.53 2004/01/24 18:30:32 jacobuTTYgen, PSCP, PSFTP, and a Unix port of Pageant Revision-number: 3769 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 puttygen port exists K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-01-24T18:31:30.000000Z PROPS-END Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 176297a0e84b9bed4d5abf0f79539c2b Text-delta-base-sha1: 9211cffb8f51c9289169abe256dda2af739a425e Text-content-length: 68 Text-content-md5: b7929be3ec687c4265a19b0b2e566344 Text-content-sha1: 2fc7f7febe69d447c096bdaae5d189c57093b8b0 Content-length: 107 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNn /:4, pscp, and puttygen Revision-number: 3770 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.755937Z PROPS-END Revision-number: 3771 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.769582Z PROPS-END Revision-number: 3772 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.779263Z PROPS-END Revision-number: 3773 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.789318Z PROPS-END Revision-number: 3774 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.841042Z PROPS-END Revision-number: 3775 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.850425Z PROPS-END Revision-number: 3776 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.860202Z PROPS-END Revision-number: 3777 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.870218Z PROPS-END Revision-number: 3778 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.879036Z PROPS-END Revision-number: 3779 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.888686Z PROPS-END Revision-number: 3780 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.898647Z PROPS-END Revision-number: 3781 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.907233Z PROPS-END Revision-number: 3782 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.915817Z PROPS-END Revision-number: 3783 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.925383Z PROPS-END Revision-number: 3784 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.934849Z PROPS-END Revision-number: 3785 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.944459Z PROPS-END Revision-number: 3786 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.954933Z PROPS-END Revision-number: 3787 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.964334Z PROPS-END Revision-number: 3788 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.974082Z PROPS-END Revision-number: 3789 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:00.983489Z PROPS-END Revision-number: 3790 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 Mirror site backlog. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-03T14:28:31.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c2e4daa7ab3a6b9f8aee6304c11a1587 Text-delta-base-sha1: c2748bd0d463c6a69112a5b8a749ff8f09f7b2de Text-content-length: 220 Text-content-md5: b77a66c785bf16ac081b5b8d5a144a73 Text-content-sha1: 0ef8649cbc27f7b6eca8fd1d0b1a8ff040e6333f Content-length: 260 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNO 0`@A?h`A?)HD,[shortcircuit.net.au/">putty.shortcircuit.net.au in Australiabsdguru.dk/">putty.bsdguru.dk in Denmarkb-o-b.homelinux.com/mirror/putty/">b-o-b.homelinux.com in the US Revision-number: 3791 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:02.698433Z PROPS-END Revision-number: 3792 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 52 Patch from Colin Watson: document pterm.WarnOnClose K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-03T14:36:01.000000Z PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 89ccd658736a5de57a809dbbfe0f3b42 Text-delta-base-sha1: e903f9929ce9d2aa49eb87858f0105f117c02e51 Text-content-length: 152 Text-content-md5: 6c8b734298ed464773456c9c314e58e3 Text-content-sha1: 9e4c72941348615a95fe1573ee3ad36c90c7f08e Content-length: 192 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNR{ AqBWarnOnClos1. When set to 1, \fIpterm\fP will ask for confirmation before closing its window when you press the close button Revision-number: 3793 Prop-content-length: 327 Content-length: 327 K 8 svn:date V 27 2004-02-03T14:47:43.000000Z K 7 svn:log V 226 Patch from Theo Markettos: apparently "BSD-derived IP stacks fall over when trying to bind to the localhost interface with a sockaddr_in which has non-zero sin_zero fields." Zero sockaddr_in (and sockaddr_in6) before any use. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: baa9283611f558a89eedb27d049445f4 Text-delta-base-sha1: e1d2b1a62c138e9a594e4e553d4b43f1baa9541e Text-content-length: 397 Text-content-md5: 4b374cb52174d717d3b9b216b13ee487 Text-content-sha1: f3ebe3c3c468453b84dd23108dccc570a64e2d54 Content-length: 437 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN:"kt//l<&BSD IP stacks need sockaddr_in zeroed before filling in */ memset(&a,'\0',sizeof(struct sockaddr_in)); #ifdef IPV6 memset(&a6,'\0',sizeof(struct sockaddr_in6)); #endif /* BSD IP stacks need sockaddr_in zeroed before filling in */ memset(&a,'\0',sizeof(struct sockaddr_in)); #ifdef IPV6 #if 0 memset(&a6,'\0',sizeof(struct sockaddr_in6)); #endif Revision-number: 3794 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2004-02-03T18:18:59.000000Z K 7 svn:log V 15 Another patch. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fdd726fb7a82dd07b49c34973adc56b1 Text-delta-base-sha1: 5c94d82da6e02843915dcbf764b64852acde8b2b Text-content-length: 82 Text-content-md5: ac1f17fc0b130718ccf7989b4ed6d9cd Text-content-sha1: 72eeaf931f7f8d0d5f12da7e7db0d0d1dde76675 Content-length: 121 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNL ALA * FreeBSD-5.2-RELEASE 1075418510.724.16.camel@localhost Revision-number: 3795 Prop-content-length: 120 Content-length: 120 K 7 svn:log V 20 Unimplement this :( K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-03T18:39:33.000000Z PROPS-END Node-path: putty-wishlist/data/pageant-async Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 34c2d5c85903dd0189ae5f935f049a81 Text-delta-base-sha1: fc4b24172e678210cc2dbdf3eb5688830d7dbd25 Text-content-length: 579 Text-content-md5: d7886e1573a944d227652d1b25e15a66 Text-content-sha1: 668fd676593e1965f753b5f7a002771bcbc2fb17 Content-length: 618 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN` +w>x-html-body

      p> SGT, 2003-04-28: This was indeed tricky, but should now be done.

      Update, 2004-01-24: Bah! Nicolas Barry correctly points out that my async agent code simply doesn't work - if multiple concurrent agent requests are attempted, some of them will fail for no apparent reason. I assume concurrent SendMessage() calls don't work in the Windows API, or some such. So I'm commenting out the async code for the moment (there wasn't a Windows Pageant that made helpful use of it anyway yet) and returning to the drawing board. Revision-number: 3796 Prop-content-length: 201 Content-length: 201 K 7 svn:log V 100 Swap priorities of port-mac and port-unix and see if anyone notices. Also clean up port-unix a bit. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-03T18:46:14.000000Z PROPS-END Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a2675e4c7a6cfe0c5f41fb476c925eef Text-delta-base-sha1: f099940064a9506708ef877b25353f79908a34f9 Text-content-length: 72 Text-content-md5: 830cc157c0c80d948cbd7c2120e9d53c Text-content-sha1: 76c97bcbb5cf0094e5a07a9a0550ae85eb9d89a0 Content-length: 111 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN7986Summary: Port to the Mac OS Class: wish Priority: medium Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b7929be3ec687c4265a19b0b2e566344 Text-delta-base-sha1: 2fc7f7febe69d447c096bdaae5d189c57093b8b0 Text-content-length: 128 Text-content-md5: 0aad2a9a84ef70d686ae21a5db824cdd Text-content-sha1: ef4666d17c5e4715af284a796b50467d947da08b Content-length: 167 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN kJ2hSummary: Port to Unix Class: wish Priority: higha Unix port of Pageant (although another agent can be used) Revision-number: 3797 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2004-02-03T19:33:23.000000Z K 7 svn:log V 27 Freshen Symbian PuTTY link K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8894a6827683c65d9244f05a2d9fc90f Text-delta-base-sha1: b2a1326232f7425a05511817d014f2a48741e410 Text-content-length: 44 Text-content-md5: d226308f86cbf7a88b5cc77b2544cbc8 Text-content-sha1: f9c8758a58ae81c8ddf138b86c0b941ddba60d37 Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN xs2putty.sourceforge.net Revision-number: 3798 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.067750Z PROPS-END Revision-number: 3799 Prop-content-length: 148 Content-length: 148 K 7 svn:log V 48 Update after correspondence with Darren Tucker. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-03T21:20:07.000000Z PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5d0cbf6b8c0953ccdac28b447ccdd859 Text-delta-base-sha1: 6f0cd7ad8b29a20e784a5cbfb32750517b57dfea Text-content-length: 180 Text-content-md5: a6be7ceef53674b27bdc209cfcc278ad Text-content-sha1: cdb185cc06017e4ec69345988cae9d5acb918648 Content-length: 219 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNa !i!Old versions of the OpenSSH password expiry patches used to use this mechanism, but newer versions don't. Revision-number: 3800 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2004-02-03T23:16:11.000000Z K 7 svn:log V 39 http://www.trudgian.net/mirrors/putty/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b77a66c785bf16ac081b5b8d5a144a73 Text-delta-base-sha1: 0ef8649cbc27f7b6eca8fd1d0b1a8ff040e6333f Text-content-length: 66 Text-content-md5: f9a189ef4eb51fe90c2ec84c668805eb Text-content-sha1: 602d2aa4f66b7c7d523bb2ccec6dbe5aa209f07a Content-length: 106 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVNOE)5M<5www.trudgian.net/mirrors/putty/">trudgian Revision-number: 3801 Prop-content-length: 130 Content-length: 130 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-04T18:39:14.000000Z K 7 svn:log V 30 Host key q: mention kh2reg.py PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3a6eb1e542e28a561351f60801322aee Text-delta-base-sha1: 68e2885d5d26d1bd59cd9824cd3dd477336794cc Text-content-length: 354 Text-content-md5: ba6c1e2c57802987cf474a269241ee8d Text-content-sha1: f15b5e17e1047b7813d0a2a1e3cdfac2a6bb9a3b Content-length: 394 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN^uFG2hv\versionid $Id: faq.but,v 1.54 2004/02/04 18:39:14If you have host keys available in the common \c{known_hosts} format, we have a script called \W{http://cvs.tartarus.org/putty/contrib/kh2reg.py}\c{kh2reg.py} to convert them to a Windows .REG file, which can be installed ahead of time by double-clicking or using \c{REGEDIT} Revision-number: 3802 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2004-02-04T19:02:02.000000Z K 7 svn:log V 20 Mention non-F-keys. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/modified-fkeys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 47d34a5957ec9072b6cff6c3ac6b6749 Text-delta-base-sha1: 8600ffae65cdce6235096933c0b9d66dfc31c102 Text-content-length: 203 Text-content-md5: e9fd7816a0b72e9721f0795d0f7cb727 Text-content-sha1: 0aa714b614c7cbea99d142424bdf1db2605465c0 Content-length: 242 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN7[.)+x3kLSummary: Unique codes for modified function/special(and other special keys) with more combinations of modifiers than we currently support (e.g., Fn, Shift+Fn, Ctrl+Fn and ion Revision-number: 3803 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.327386Z PROPS-END Revision-number: 3804 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.336704Z PROPS-END Revision-number: 3805 Prop-content-length: 113 Content-length: 113 K 7 svn:log V 13 Mention pssh K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-05T10:24:57.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d226308f86cbf7a88b5cc77b2544cbc8 Text-delta-base-sha1: f9c8758a58ae81c8ddf138b86c0b941ddba60d37 Text-content-length: 118 Text-content-md5: 5bdf3f272ece357d08812f1499d65af7 Text-content-sha1: 4557170d3a6db44235f3e9d1ac1a5b103405284a Content-length: 158 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN `Z`]Asealiesoftware.com/pssh/"> pssh, a Palm OS SSH-2 client that uses some PuTTY terminal code Revision-number: 3806 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.381431Z PROPS-END Revision-number: 3807 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2004-02-05T10:32:23.000000Z K 7 svn:log V 26 xlr8d.net is now diis.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f9a189ef4eb51fe90c2ec84c668805eb Text-delta-base-sha1: 602d2aa4f66b7c7d523bb2ccec6dbe5aa209f07a Text-content-length: 42 Text-content-md5: b0827042818ab40bf43013911b9739ae Text-content-sha1: 10a8277bd9ad50d79de2e41f6532c2b7c7c21733 Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNE/ 2diis.net/putty/">diis Revision-number: 3808 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.534292Z PROPS-END Revision-number: 3809 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.543601Z PROPS-END Revision-number: 3810 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.556572Z PROPS-END Revision-number: 3811 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.583965Z PROPS-END Revision-number: 3812 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.593462Z PROPS-END Revision-number: 3813 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.602113Z PROPS-END Revision-number: 3814 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:03.610696Z PROPS-END Revision-number: 3815 Prop-content-length: 770 Content-length: 770 K 7 svn:log V 669 Charles Wilcox reported a signature validation bug with 2500-bit RSA keys. This _appears_ to be due to me computing the byte count of the key by dividing the bit count by 8 and rounding _down_ rather than up. Therefore, I can't see how this code could ever have worked on any SSH2 RSA key whose length was not a multiple of 8 bits; and therefore I'm staggered that we haven't noticed it before! OpenSSH's keygen appears to be scrupulous about ensuring the returned key length is exactly what you asked for rather than one bit less, but even so I'm astonished that _all_ keygen implementations for servers we've ever interoperated with have avoided tripping this bug... K 10 svn:author V 5 simon K 8 svn:date V 27 2004-02-07T10:02:20.000000Z PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 52076dbaf8d1ddfd0dcdf689d11555c4 Text-delta-base-sha1: 4b141b25f13b5da7670e6e43bea4edddf181287d Text-content-length: 57 Text-content-md5: 9ab103e1ac15567531fa2a565573fe5b Text-content-sha1: de0f4659346dd72ffa8964ce9c81d40c2c2dd1f5 Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNy} A](bignum_bitcount(rsa->modulus)+7 Revision-number: 3816 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 25 Silly grammatical error. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-02-07T17:36:05.000000Z PROPS-END Node-path: putty/README.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3f02c6364c742e9ea2429230a6ff7bb9 Text-delta-base-sha1: 815ecf75745bc4ebcb03b7d3bc4d61593e0484c9 Text-content-length: 25 Text-content-md5: 1c1519ebfb2ee75babf68c276c1721c9 Text-content-sha1: 34b24901845d04fb6bb405fe171f2f1de59ae82f Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN  pon Revision-number: 3817 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2004-02-07T17:38:54.000000Z K 7 svn:log V 21 Add some Unix blurb. K 10 svn:author V 5 simon PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d4acb4693b5794e9ab1dedd95c285338 Text-delta-base-sha1: 42d1da6a8b202cc30f1ae40efbc72338ef71c417 Text-content-length: 533 Text-content-md5: 51995ffc52cd1b1476130078d439a684 Text-content-sha1: 81357da77dd80b3a0b314a78588b02f5f0833a3c Content-length: 573 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN82w423^Uc. For building on WindowFor building on Unix: - unix/Makefile.gtk is for Unix and GTK. If you don't have GTK, you should still be able to build the command-line utilities (PSCP, PSFTP, Plink, PuTTYgen) using this makefile. The makefile expects you to change into the `unix' subdirectory, then run `make -f Makefile.gtk'. Note that Unix PuTTY has mostly only been tested on Linux so far; portability problems such as BSD-style ptys or different header file requirements are expected. Revision-number: 3818 Prop-content-length: 691 Content-length: 691 K 8 svn:date V 27 2004-02-07T18:10:54.000000Z K 7 svn:log V 590 Added a wrinkle to the version.c build in the Unix makefile, which will validate an md5sums manifest and if all md5sums match will use a version number provided in a file. This should allow me to produce a Unix release source archive with the property that when unpacked and built it will produce binaries advertising themselves as `Release X.YZ', but as soon as the user starts fiddling with the sources it will revert to `Unidentified build' (though of course the user can still _explicitly_ ask for a release tag, and in fact this will override the default if any default is specified). K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 948e9f8be41c2f6721d6a4a783484bad Text-delta-base-sha1: 32ba1e68d6cf20283dc50d979f37c04c2f47ca8e Text-content-length: 234 Text-content-md5: 646bdbc366528d9a4726e963a40bdcba Text-content-sha1: fb27406aa2ff5b569583cac9d9766eb196cfa908 Content-length: 274 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNt>HA:L?i if test -z \"\$(VER)\" && (cd ..; md5sum -c manifest); then \\\n". "\t\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) `cat ../version.def` -c ../version.c; \\\n". "\telse \\\n". "\t; \\\n". "\tfi Revision-number: 3819 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2004-02-07T18:14:53.000000Z K 7 svn:log V 56 Another admin script, to build the Unix source archive. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkunxarc.sh Node-kind: file Node-action: add Prop-content-length: 142 Text-delta: true Text-content-length: 1203 Text-content-md5: bc68ae6b20bcf906e9fb7537ea7f499a Text-content-sha1: 1cd0e33a610831d3fc1692266fbbfa575ce32a32 Content-length: 1345 K 13 svn:eol-style V 6 native K 14 svn:executable V 1 * K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN%%%#!/bin/sh # Build a Unix source distribution from the PuTTY CVS area. # # Pass an argument of the form `2004-02-08' to have the archive # tagged as a development snapshot; of the form `0.54' to have it # tagged as a release. case "$1" in ????-??-??) case "$1" in *[!-0-9]*) echo "Malformed snapshot ID '$1'" >&2;exit 1;;esac arcsuffix="-`cat LATEST.VER`-$1" ver="-DSNAPSHOT=$1" ;; '') arcsuffix= ver= ;; *) case "$1" in *[!.0-9a-z]*) echo "Malformed release ID '$1'">&2;exit 1;;esac arcsuffix="-$1" ver="-DRELEASE=$1" ;; esac perl mkfiles.pl relver=`cat LATEST.VER` arcname="putty$arcsuffix" mkdir uxarc mkdir uxarc/$arcname find . -name uxarc -prune -o -name . -o \ -type d -exec mkdir uxarc/$arcname/{} \; find . -name uxarc -prune -o \ -name CVS -prune -o \ -name .cvsignore -prune -o \ -name '*.zip' -prune -o \ -name '*.tar.gz' -prune -o \ -type f -exec ln -s $PWD/{} uxarc/$arcname/{} \; if test "x$ver" != "x"; then (cd uxarc/$arcname; md5sum `find . -name '*.[ch]' -print` > manifest; echo "$ver" > version.def) fi tar -C uxarc -chzf - $arcname > $arcname.tar.gz rm -rf uxarc Revision-number: 3820 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2004-02-07T18:17:50.000000Z K 7 svn:log V 59 Update version numbers preparatory to tagging for release. K 10 svn:author V 5 simon PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: df9e0ae00fb8fe4db80f1ff690a2546c Text-delta-base-sha1: 03335086beefdf8a0545ca8c9d5ea025e42a0c7e Text-content-length: 15 Text-content-md5: 8814e7cef7af6db911a353640fcc7034 Text-content-sha1: 4ec9d70ce529770de4163dc723b8db98a5af79b9 Content-length: 54 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN0.54 Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c09b2d683dc042a5a65b8964bb2d7f10 Text-delta-base-sha1: f23bcb6a8da54b3f3f488bd1e2f6c6f622bbf4b1 Text-content-length: 92 Text-content-md5: 47da628c4af66ec9bffbb9bc44591239 Text-content-sha1: 73ef23c91079c8bf669b14f6f7be80d0dab74b27 Content-length: 132 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN, FJ:,\versionid $Id: plink.but,v 1.21 2004/02/07 18:17:50 simonRelease 0.54 Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6bfb1023651801a1b8db6fdead0f0410 Text-delta-base-sha1: 69a5a7a58d256f45d0a21fb519a59405f6cbb462 Text-content-length: 80 Text-content-md5: 62431ef28025da5ab4d19143d64e251c Text-content-sha1: e04575b67e995ac885d8096c7ff24bf0130d5a77 Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNxx :B9||\versionid $Id: pscp.but,v 1.23 2004/02/07 18:17:50 simon4 Node-path: putty/mac/version.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7e6e4a1b83afe73b036647c658ea0c47 Text-delta-base-sha1: c5b874c8e0c5e599a3a3b9c3a8de278c0f4aa840 Text-content-length: 20 Text-content-md5: 9fb4337ccf8b433b0e548919bf74aab2 Text-content-sha1: 4d95f05fdd0f69af8e2f337b99259bf13b3ee3b3 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN77mIn4 Node-path: putty/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1094492434c41636af72a10e31c42d34 Text-delta-base-sha1: 5ab779a37d723251b13b6667879ad833336aa099 Text-content-length: 22 Text-content-md5: eaebaba30c4bef3ae1d6fbcc06e170c3 Text-content-sha1: 473f1419bbb9c862341cb874c30297f9763b569e Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN X;Y4 Revision-number: 3821 Prop-content-length: 293 Content-length: 293 K 8 svn:date V 27 2004-02-07T21:06:34.000000Z K 7 svn:log V 192 Added something to infer items fixed in releases from snapshot fix dates, to avoid having to touch every wishlist item. Currently the table driving the inference is hard-coded in this script. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e54650e57d661d5fc38a7bb60ec3b36f Text-delta-base-sha1: e43166efcc994b4dccb557e2e81acd18210bdc35 Text-content-length: 1283 Text-content-md5: 99be44093a031e24d903563815e810a3 Text-content-sha1: c995b67127e9a0bad4924191a7c58b8ef7775adf Content-length: 1323 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNs(Oa;ulxH~R~{#! /usr/bin/perl # $Id: bugs2html,v 1.27 2004/02/07 21:06:3# This array maps releases to snapshot dates - it's used to # automatically mark bugs which were fixed before the relevant # snapshot date as also being fixed in a release. # (It's only used for recent releases - old ones are all # be explicitly marked in the wishlist data. Obviously branch # releases don't go here either.) @releases = ( # [ "0.54", "2004-??-??" ] )add_release_fixes($bugname)For a given bug, look at the snapshots it was fixed in and work # out whether that also implies it's been fixed in a release. sub add_release_fixes { my ($bug) = @_; my @extra_fixed = (); return unless exists ($bugs{$bug}->{"fixed-in"})next unless $ver =~ m/^\d\d\d\d-\d\d-\d\d$/; map { my ($rel, $rel_date) = @$_; # Textual comparison works for snapshot dates. # We add the release version in parentheses so that it's # distinguishable from one in the source data. push @extra_fixed, "($rel)" if ($ver le $rel_date); } @releases; } $bugs{$bug}->{"fixed-in"} = join " ", $bugs{$bug}->{"fixed-in"}, @extra_fixed$ver =~ s/^\((.*)\)$/$1/; # remove "auto-generated" hint Revision-number: 3822 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2004-02-07T21:56:41.000000Z K 7 svn:log V 69 Update title to reflect the behaviour that was actually implemented. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/offer-to-reset Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 06fcc66fb09d59e4a9e54f45d71be6f8 Text-delta-base-sha1: 05562eca2ad6102f4eaeebaaede8868cc327542c Text-content-length: 50 Text-content-md5: e06741127d407ef73a2d20d19616ce63 Text-content-sha1: d25183a6fb7b172ddc06cbb9482a0e8afe13231f Content-length: 89 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN("Summary: Allow immediate change of Revision-number: 3823 Prop-content-length: 181 Content-length: 181 K 7 svn:log V 81 Oh, and the Unix port is probably neither "nascent" nor "experimental" any more. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-07T22:00:19.000000Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 99be44093a031e24d903563815e810a3 Text-delta-base-sha1: c995b67127e9a0bad4924191a7c58b8ef7775adf Text-content-length: 163 Text-content-md5: fa829ffc7bb85466d620893b41cac1a2 Text-content-sha1: aa97e5d47dbcbacfb3d3c7eee3d04f28a9e796a0 Content-length: 203 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNs^ 5#! /usr/bin/perl # $Id: bugs2html,v 1.28 2004/02/07 22:00:19 Debian package of the Revision-number: 3824 Prop-content-length: 318 Content-length: 318 K 8 svn:date V 27 2004-02-07T22:13:36.000000Z K 7 svn:log V 217 Summary: RSA signature validation fails with non-8-bit-multiple keys Derived from Simon's checkin comment. (I think this is worth having on the wishlist for 0.54 in case anyone's been scratching their heads over it.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rsa-non8mult-verify-fail Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1073 Text-content-md5: ae6bdd77906b95d14ac93026690c8ad8 Text-content-sha1: db5414593f70d775782084896674fd6c132629bd Content-length: 1189 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN###Summary: RSA signature validation fails with non-8-bit-multiple keys Class: bug Difficulty: fun Priority: high Present-in: 0.53b 2004-02-04 Fixed-in: 2004-02-07 Charles Wilcox reported a signature validation bug with a large SSH-2 RSA host key - PuTTY reported `Server's host key did not match the signature supplied'. We reproduced this with a 2500-bit RSA host key. SGT: This _appears_ to be due to me computing the byte count of the key by dividing the bit count by 8 and rounding _down_ rather than up. Therefore, I can't see how this code could ever have worked on any SSH2 RSA key whose length was not a multiple of 8 bits; and therefore I'm staggered that we haven't noticed it before! OpenSSH's keygen appears to be scrupulous about ensuring the returned key length is exactly what you asked for rather than one bit less, but even so I'm astonished that _all_ keygen implementations for servers we've ever interoperated with have avoided tripping this bug... JTN: verified that this does indeed occur with 1023-bit and 513-bit SSH-2 RSA host keys. Revision-number: 3825 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2004-02-07T23:21:28.000000Z K 7 svn:log V 59 Update the advice about updating the wishlist post-release K 10 svn:author V 5 jacob PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 575c5004a99b514df93402f418a0b3ed Text-delta-base-sha1: 628e10bbbc8e1504b8e1b71423eac959d8281e0b Text-content-length: 129 Text-content-md5: 117195900412e3874aacefb77fa97f91 Text-content-sha1: e6ba7539d3edd14fa473430698964b8a73e2a2a0 Content-length: 169 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNjC kVkh. This can be done without touching individual items by editing the @releases array in control/bugs2html Revision-number: 3826 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2004-02-07T23:34:02.000000Z K 7 svn:log V 90 Summary: Context menu on Ctrl+right-click Fixed-in: 2003-11-20 May as well mention this. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/context-menu Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 328 Text-content-md5: 32440662f3e9b37b3686a26f5e230920 Text-content-sha1: f5cac0698df30fdb918630b35a2fe666e915013a Content-length: 444 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN:::Summary: Context menu on Ctrl+right-click Class: wish Priority: low Difficulty: fun Fixed-in: 2003-11-20 In Windows PuTTY, a context menu which appears when holding down Ctrl and right-clicking on the PuTTY window, like in xterm/pterm. Contains all the System menu options (except move/resize/etc), and `Paste'. Revision-number: 3827 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Mention the Ctrl+right-click context menu now available on Windows. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-07T23:35:32.000000Z PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1ddf78b021d79cfba9a113985fbbe0f1 Text-delta-base-sha1: 1fbe31833454f70446f2614b833264b56e7e381a Text-content-length: 343 Text-content-md5: cb56044f852b6238fb029d48e4373790 Text-content-sha1: 8b9f2d521022bf437374fa84e140290a849d700f Content-length: 383 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN(4 4j{)\versionid $Id: using.but,v 1.18 2004/02/07 23:35:32(Pressing Shift-Ins, or selecting \q{Paste} from the Ctrl+right-click context menu, have the same effect.)(These options are also available in a context menu brought up by holding Ctrl and clicking with the right mouse button anywhere in the PuTTY window.) Revision-number: 3828 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2004-02-07T23:48:49.000000Z K 7 svn:log V 44 Mention new "Windows" mouse-handling option K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/paste-semantics Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3b4a577743f7ce1cb2b78e35e003f4f5 Text-delta-base-sha1: 71441f9119da32a8c98913c97e31b368c16db21e Text-content-length: 204 Text-content-md5: 523c7dfaa1ed90d3e1bf99a3a5c91eba Text-content-sha1: 0a195114b7efcf737524e96cea783da88f8a9f90 Content-length: 243 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNAy 6A6?

      Update: as of 2003-11-21, there is a new mouse-handling option whereby the right button brings up a context menu containing a Paste option, rather than pasting directly Revision-number: 3829 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2004-02-07T23:49:21.000000Z K 7 svn:log V 74 Document the new "Compromise" mouse-handling option introduced 2003-11-20 K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 53f8165364243df61f263f1dc54afc05 Text-delta-base-sha1: 673ed053f9f446052bea9b2b1fb72893cd93f973 Text-content-length: 761 Text-content-md5: 7b54d4ebaba8f7f8ccecf81becc980e6 Text-content-sha1: 0195fbc649243555f708f4416c1ad4df86f48380 Content-length: 801 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVNk)RC5yIY$K \versionid $Id: config.but,v 1.74 2004/02/07 23:49:21by default modelled on the Unix \c{xterm} application. The X Window System uses a three-button mouse, and the convention is that the left button selects, the right button extends an existing selection, and the middle button pastes. Windows often only has two mouse buttons, so in PuTTY's default configuration (\q{Compromise}), the \e{right} button pastes, and the \e{middle} Alternatively, with the \q{Windows} option selected, the middle button extends, and the right button brings up a context menu (on which one of the options is \q{Paste}). (This context menu is always available by holding down Ctrl and right-clicking, regardless of the setting of this option.) Revision-number: 3830 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2004-02-08T00:14:57.000000Z K 7 svn:log V 46 Briefly document the "special commands" menu. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cb56044f852b6238fb029d48e4373790 Text-delta-base-sha1: 8b9f2d521022bf437374fa84e140290a849d700f Text-content-length: 390 Text-content-md5: d8eb1bf4f04fd3adccfcc1f6efbff3a8 Text-content-sha1: d6abfe4ae3eb94e3d3cebb6f362e14a83ad281a1 Content-length: 430 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNFju46g\versionid $Id: using.but,v 1.19 2004/02/08 00:14:57specials} Special commands Depending on the protocol used for the current session, there may be a submenu of \q{special commands}. These are protocol-specific tokens, such as a \q{break} signal, that can be sent down a connection in addition to normal data. Currently only Telnet and SSH have special commands Revision-number: 3831 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2004-02-08T10:48:17.000000Z K 7 svn:log V 93 I think we can declare this fixed, given that it's present in all the release-quality ports. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ctrl-pgupdn Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4c9cc8de8dd4035762b29bee6ef5ce63 Text-delta-base-sha1: 4f298d6ecfa4f9332fdc0eaa5a5f8a596fd4e8f3 Text-content-length: 39 Text-content-md5: b22218b55268b2a4a07c865f66755663 Text-content-sha1: 7912c9d61ad945498329bdfcb2140ba8ccf1b5df Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNonFixed-in: 2003-01-15 Revision-number: 3832 Prop-content-length: 129 Content-length: 129 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-08T11:47:23.000000Z K 7 svn:log V 29 Update agent draft reference PROPS-END Node-path: putty-wishlist/data/agentfwd-ssh.com Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 84a6a2a3ab9c341b5e0d36a819b7b42f Text-delta-base-sha1: 5980d2846b915f24a1ea15647833420efbe3a0e4 Text-content-length: 62 Text-content-md5: e80d3f430f2ae0eb1d61f5b4f7f2bfec Text-content-sha1: c2b6122dd2285432910aa5198d5c60ddfe0ab408 Content-length: 101 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN" )Zf2.txt">draft-ietf-secsh-agent-02.txt Revision-number: 3833 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2004-02-08T12:16:27.000000Z K 7 svn:log V 40 Clarify what old versions of PuTTY did. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/paste-on-release Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5bf293b39dc00492d199eeb0519a9f74 Text-delta-base-sha1: bb95a5b5169a0affa8788b9013dc9aefefa53ded Text-content-length: 143 Text-content-md5: 3037784c75fa48f7ec8a48274d3069df Text-content-sha1: 03b84247c12f9b85b0b14721a0d5b31c718c387b Content-length: 182 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNT~~paste on release, and it doesn't appear to be a deliberate change. Semi-bug? (It didn't have the "cancel" behaviour, though.) Revision-number: 3834 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2004-02-08T12:19:59.000000Z K 7 svn:log V 35 Well, no technical reason, anyway. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rsh-backend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 77da0579e9f8bcb592cc8b04d2c0812a Text-delta-base-sha1: 9bdab273a4935a88af7d793d997a03448483a85a Text-content-length: 26 Text-content-md5: bcd1ab6904d62ef72a83b9b6101a7268 Text-content-sha1: 4a77a694d66d771b45ac23173d5685023f71d256 Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN g"ftechnical Revision-number: 3835 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2004-02-08T14:12:57.000000Z K 7 svn:log V 48 Mutter about relation to `resize', and a patch. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/startup-fullscreen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: adb4f80f8d4818255380c81826575820 Text-delta-base-sha1: 522ddf872f99fafc778794c3b430f12e2a142110 Text-content-length: 247 Text-content-md5: 5c9edac5c73e1d9a7cd18d04906f70fc Text-content-sha1: b90d55caa2c647c8f0d773eacb4fa5cdeaeacb71 Content-length: 286 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNqR `]\QDepends: resize

      This should perhaps be considered in the context of a general overhaul of resize handling.

      Patch (unreviewed): 40E631F174C41E4DBE52727E137AF927C043E6@EXCHVS1.cs.cornell.edu Revision-number: 3836 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:04.808340Z PROPS-END Revision-number: 3837 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:04.817133Z PROPS-END Revision-number: 3838 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:04.826154Z PROPS-END Revision-number: 3839 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:04.835736Z PROPS-END Revision-number: 3840 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:04.844329Z PROPS-END Revision-number: 3841 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:04.853333Z PROPS-END Revision-number: 3842 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2004-02-10T18:22:00.000000Z K 7 svn:log V 30 Jacob's FAQ changes for 0.54. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ba6c1e2c57802987cf474a269241ee8d Text-delta-base-sha1: f15b5e17e1047b7813d0a2a1e3cdfac2a6bb9a3b Text-content-length: 1415 Text-content-md5: 010ce632737481b9be7d989885e49d63 Text-content-sha1: 43b11bc32bdd7828fc53a0a1da7caf5e6da3e3aa Content-length: 1455 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVNu?/J8u|c\jxG`V:0k \versionid $Id: faq.but,v 1.55 2004/02/10 18:22:00 simonhas now been released and the plan seems to tools only run on full Win32 systems and Unix. \q{Win32} includes Windows 95, 98, and ME, and it includes Windows NT, Windows 2000 and Windows XP. In the development code, a partial port to the Mac OS (see \k{faq-mac-port}) isn EPOCIs there a port to Unix? As of 0.54, there are Unix ports of most of the traditional PuTTY tools, and also one entirely new application. If you look at the source release, you should find a \c{unix} subdirectory containing \c{Makefile.gtk}, which should build you Unix ports of Plink, PuTTY itself, PuTTYgen, PSCP, PSFTP, and also \c{pterm} - an \cw{xterm}-type program which supports the same terminal emulation as PuTTY. We do not yet have a Unix port of Pageant. If you don't have Gtk, you should still be able to build the command-line tools. Note that Unix PuTTY has mostly only been tested on Linux so far; portability problems such as BSD-style ptys or different header file requirements are expectedmay non versions 0.53b and prior, if you change one of these options in the middle of a session, you will find that the change does not immediately take effect. It will only take effect once you reset the terminal. In version 0.54, the behaviour has changed - changes to these settings take effect immediately Revision-number: 3843 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:04.928730Z PROPS-END Revision-number: 3844 Prop-content-length: 512 Content-length: 512 K 8 svn:date V 27 2004-02-10T19:07:45.000000Z K 7 svn:log V 411 Jacob reports a segfault when using HTTP proxying under Minefield. It appears that this is because Visual C's sscanf works by first calling strlen to get the length of the string, so that its internal read-character routine can be sure of never overrunning the buffer. Quite why the internal read-char routine can't detect \0 _itself_ rather than having to have it found for it in advance I have no idea. Sigh. K 10 svn:author V 5 simon PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9eb61d4b5a3078971c469dc2ec875560 Text-delta-base-sha1: 26a1fe04faa01340109fcc0fbe9ed9f631762665 Text-content-length: 301 Text-content-md5: fae3a080429b7b366312309093d61da2 Text-content-sha1: 2596ad011d59dba49caabf1e9f3025302dd25edb Content-length: 341 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNN3\r+1, char); bufchain_fetch(&p->pending_input_data, data, len); /* * We must NUL-terminate this data, because Windows * sscanf appears to require a NUL at the end of the * string because it strlens it _first_. Sigh. */ data[len] = '\0' Revision-number: 3845 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2004-02-10T19:32:08.000000Z K 7 svn:log V 117 Sigh. Since Mailman breakage means we won't be releasing 0.54 today after all, I'll slightly edit those FAQ changes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 010ce632737481b9be7d989885e49d63 Text-delta-base-sha1: 43b11bc32bdd7828fc53a0a1da7caf5e6da3e3aa Text-content-length: 209 Text-content-md5: 45e7cbb14166a30cd94e596b45f7fbf6 Text-content-sha1: ab71c9bf082d9e0fa1d0b4abc99b1e8116dcc7c3 Content-length: 249 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVN?U/S2CH= 4\versionid $Id: faq.but,v 1.56 2004/02/10 19:32:08 (out soon), there are Unix ports of most of the traditional PuTTY (out soon), the behaviour has changed - changes to these Revision-number: 3846 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:05.067391Z PROPS-END Revision-number: 3847 Prop-content-length: 245 Content-length: 245 K 8 svn:date V 27 2004-02-11T13:58:27.000000Z K 7 svn:log V 144 Jacob's last-minute testing found a couple of trivial bugs in import.c, and my attempts to reproduce them in cmdgen found another one there :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4ddb0294f2ab5b2f2dd8764ca0881261 Text-delta-base-sha1: 767529998acaa1e648f77831726190cc3a0e297e Text-content-length: 62 Text-content-md5: 3ff1c3d580c4d2882d0458a0c3891f71 Text-content-sha1: b5d13cd33140addc0603541f42adc39d93a67312 Content-length: 101 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNJn $zPz && ssh2key != SSH2_WRONG_PASSPHRASE Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9361a8552c9cb39e29647c94936d7d07 Text-delta-base-sha1: ba7405b548782e838021c86a893023a5fcd2bec2 Text-content-length: 68 Text-content-md5: a9fc7baad25de42d400f71a56735ca51 Text-content-sha1: 2d8937c5f0bbc3b9a99d6643099c48ef037e39c3 Content-length: 108 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVN`%cA\Gretval = SSH2_WRONG_PASSPHRASE< 0 || Revision-number: 3848 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2004-02-12T18:28:00.000000Z K 7 svn:log V 73 Back out my temporary edit of the FAQ, to make it once again 0.54-ready. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 45e7cbb14166a30cd94e596b45f7fbf6 Text-delta-base-sha1: ab71c9bf082d9e0fa1d0b4abc99b1e8116dcc7c3 Text-content-length: 186 Text-content-md5: 8216abfde34861c49c6f93ccc867ca4b Text-content-sha1: 6ee38444076192eaf92f2e190f63dce146b2c9e1 Content-length: 226 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVNU?S2HH J\versionid $Id: faq.but,v 1.57 2004/02/12 18:28:00, there are Unix ports of most of the traditional PuTTY , the behaviour has changed - changes to these Revision-number: 3849 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2004-02-12T18:28:00.000000Z K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-54'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-0.54 Node-kind: dir Node-action: add Node-copyfrom-rev: 3848 Node-copyfrom-path: putty Revision-number: 3850 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:05.220602Z PROPS-END Revision-number: 3851 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2004-02-12T19:27:05.000000Z K 7 svn:log V 40 Add the 0.54 release date to bugs2html. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fa829ffc7bb85466d620893b41cac1a2 Text-delta-base-sha1: aa97e5d47dbcbacfb3d3c7eee3d04f28a9e796a0 Text-content-length: 116 Text-content-md5: 8738e84608ee7f425d176543920796bc Text-content-sha1: ebf571b47c39708b8a2d1e299169db963f60d71d Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN^] ]B.BR #! /usr/bin/perl # $Id: bugs2html,v 1.29 2004/02/12 19:27:05 simon [ "0.54", "2004-02-12 Revision-number: 3852 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2004-02-12T19:39:28.000000Z K 7 svn:log V 38 Website changes for the 0.54 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 87c9d7a52d842aceb865d0b380d31258 Text-delta-base-sha1: 498348099c54a26f36daa50a8669248b65f103e6 Text-content-length: 90 Text-content-md5: 249c3578b1fe7c4fa279cd8cbe7fdb3a Text-content-sha1: 2236c8b4e3ef250d5c8b3b59ea3651b116b4583b Content-length: 129 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNV DhD*]temp /~sgtatham/putty/0.54/ http://the.earth.li/~sgtatham/putty/0.54 Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0e1013199bb4ffdcf6f10c64d230a456 Text-delta-base-sha1: 3a37f48cc412f24801c098b8a6a645e0a4c4a662 Text-content-length: 362 Text-content-md5: cb752798cdc89f378846f5f605a4a59f Text-content-sha1: a4bb9bcee7bc7a662a47ac9dfaa0b38c6cfe0d08 Content-length: 401 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN OUOm.4 (released 2004-02-12):

      • Port to Unix!
      • Dynamic SSH port forwarding.
      • Ability to leave DNS lookups to the proxy, when using a proxy.
      • Sped up PSFTP.
      • Fixed various bugs, notably one which was impeding port-forwarding of SMB.
      • Some default settings changes: SSH and SSH2 are now default, BCE is off.
      Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fb02440d9b3cb10c993d2fcc5ddb74a1 Text-delta-base-sha1: c219a8c3a52cbb42eeb37c45de0541cd43add5dd Text-content-length: 768 Text-content-md5: 083f3c3ccab248573b920d77afa30388 Text-content-sha1: 6dc19da88f5fabdfd09e5b07b7e54f51b9147e25 Content-length: 808 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN&I)*,]j>^>%daTU<Q>%C.x44-installer.exe">putty-0.54-installer.exe-0.544-installer-0.54Unix source

      This .tar.gz source archive should build the latest release version of PuTTY for Unix. (We currently do not supply development snapshots in this format; see below for instructions on accessing our CVS repository if you need up-to-date Unix source.)

      To build the source, you will need to unpack this archive, change into the "unix" subdirectory, and type "make -f Makefile.gtk". (Sorry, no autoconf as yet either.)

  • Development str> Release s Revision-number: 3157 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:22.160369Z PROPS-END Revision-number: 3158 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2003-05-01T11:03:12.000000Z K 7 svn:log V 57 Summary: PuTTY should support HTTP Digest authentication K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/http-digestauth Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 410 Text-content-md5: df073e3d08b4533964ae19d21b7d28e3 Text-content-sha1: 44a909fc16459fb5969d3d3f6df2436a2e31e511 Content-length: 526 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  Summary: PuTTY should support HTTP Digest authentication Class: wish Priority: medium Difficulty: tricky Content-type: text/plain Currently, PuTTY only support HTTP Basic authentication, which involves sending the user's password over the network in cleartext, which is Bad. HTTP Digest authentication is marginally more secure, and not ludicrously complex, so PuTTY should probably support it. Revision-number: 3159 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2003-05-01T11:06:10.000000Z K 7 svn:log V 55 Summary: Should be able to prompt for a proxy password K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/proxy-password-prompt Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 380 Text-content-md5: d90ce6ce5d753ba30d4632f4bf4a50a0 Text-content-sha1: da6c486b73bf3fe0e67ef6190db601eb06e1c3fd Content-length: 496 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNnnnSummary: Should be able to prompt for a proxy password Class: wish Priority: medium Difficulty: fun Content-type: text/plain Currently, proxy passwords have to be stored unencrypted in the registry, or entered manually through the setup dialogue before every session. It should be possible to enter them at the time the connection is set up, like other passwords. Revision-number: 3160 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2003-05-01T11:11:22.000000Z K 7 svn:log V 59 Unfortunately, I think this is `tricky' rather than `fun'. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/proxy-password-prompt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d90ce6ce5d753ba30d4632f4bf4a50a0 Text-delta-base-sha1: da6c486b73bf3fe0e67ef6190db601eb06e1c3fd Text-content-length: 541 Text-content-md5: 66ee7307004e599dea91a2e3c1a80565 Text-content-sha1: e71ddae2aedce05a6d0eca1b0a078d6928dae517 Content-length: 580 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNnq ` ctricky This isn't entirely trivial, I fear. At the moment, every proxied connection maps to exactly one actual network connection; there is no provision for making a trial connection and trying again if it doesn't work. For at least some proxy types, if the user supplies no password we'll have to attempt the connection without a password (because we don't want to prompt for a password when there's really supposed to be no password). Then, if that fails, we'll have to prompt for a password and try again. Revision-number: 3161 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2003-05-04T14:14:10.000000Z K 7 svn:log V 44 Colin's and my fixes to connection_fatal(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef3905e704884445a670000cf8da71cc Text-delta-base-sha1: 50d788e83a7388c80061a9a46b56ed331ed9f32d Text-content-length: 36 Text-content-md5: b27a35b698d671570ee217ee85d29e19 Text-content-sha1: d810972842abe94e43a9bd6384a7fccaff8f9c17 Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVN'6 (raw->frontend, Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 03b614a2734f5f51fa584f2d39bffe12 Text-delta-base-sha1: 506d5e99c4854ea9958719e138995ac68dc706e1 Text-content-length: 39 Text-content-md5: 8a8cdb2821a7288abb851855f2b1f376 Text-content-sha1: b17cac2960f532f646d9eca55b1da19e008075c0 Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN kkrlogin->frontend, Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d26b709777138508d2033384b76a24df Text-delta-base-sha1: ad05b1f28e5615e8983f3a23cdd4fca9a511f842 Text-content-length: 53 Text-content-md5: 437b0a008ea75480165fcc369fd89e87 Text-content-sha1: 9f563cc66c639018caf570d3d831a4156ab3b763 Content-length: 94 K 15 cvs2svn:cvs-rev V 5 1.292 PROPS-END SVN >><"%s"W]W to ta Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9025210a6f6c6326c35408c91ba83c2f Text-delta-base-sha1: 2d86e6e95d0a7dfad4285072f3bc63c12337498c Text-content-length: 43 Text-content-md5: 92594d7061ed4615097e3cf87a9d9133 Text-content-sha1: d3bf7c63b3ccafa0dc43e862fe5d2d0effa4d23a Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVN!3 VKVtelnet->frontend, Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 562fcf9fb0f1b82adf39ec9df6adc847 Text-delta-base-sha1: f5c97cefaa9967755a8d8db75b14cde9c8bc1a44 Text-content-length: 512 Text-content-md5: 90bb822c62e55bbe2c424bbb6cf44b01 Text-content-sha1: 8b900e53dd76b94388c720cc9d0737007ba1b5db Content-length: 553 K 15 cvs2svn:cvs-rev V 5 1.245 PROPS-END SVN$'?GOG+ =*stuff, morestuff[100]; va_start(ap, fmt); stuff = dupvprintf(sfree(stuff); *stuff, morestuff[100]; va_start(ap, fmt); stuff = dupvprintf(sfree(stuffW|.Gv$Gvv@Fasting is synchronous: we can read *stuff, morestuff[100]; va_start(ap, fmt); stuff = dupvprintf(sfree(stuff*stuff, morestuff[100]; va_start(ap, fmt); stuff = dupvprintf( MB_SYSTEMMODAL | MB_ICONERROR | MB_OK); sfree(stuff Revision-number: 3162 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2003-05-04T14:18:18.000000Z K 7 svn:log V 102 Colin's const-fixing Patch Of Death. Seems to build fine on Windows as well as Unix, so it can go in. K 10 svn:author V 5 simon PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5b275597984b08fd72375e253de13f8b Text-delta-base-sha1: e1606dacf9b992991c9f79ab65b08a091547f87b Text-content-length: 25 Text-content-md5: 0c052d3ecaa645b1790d98373286f9ca Text-content-sha1: b4c59b6fdcd626dd5a48f5d2950a9567c90906d0 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNy dbonst Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f6cc21fc9931356d77d2ecc58e9c16d0 Text-delta-base-sha1: a6055235f5160a60e8961ea545541a7cf7063d1e Text-content-length: 25 Text-content-md5: caaee8e5d6e932a3f09f6923114bfb8c Text-content-sha1: fc18d0de8ee1501963e978069b10abc33077f04f Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNlr  a onst Node-path: putty/mac/macevlog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9dc721dda301f459a1668c23fbb65e93 Text-delta-base-sha1: 58ac6d547f125002d81e686d5b528ffe47397f1f Text-content-length: 75 Text-content-md5: 5eb44ad2d459ca2a4cbe2b477769f902 Text-content-sha1: 2bb0c6a5225440e5f3c06f0ed2881938168e4760 Content-length: 114 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN5= 5(/`U/* $Id: macevlog.c,v 1.8 2003/05/04 14:18:18 simoonst Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 618af491633c8b5d7ded05b86a3a71c7 Text-delta-base-sha1: a7de9d092faf4af338db10b3e8db187befc879c3 Text-content-length: 26 Text-content-md5: 8e1894ef0cca04c8a2167677845f00c2 Text-content-sha1: 2d2ef039c7251a563b1c3891a16a30c13bf2711f Content-length: 65 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNbh 211onst Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eeeefcd9f0d9cb2211b13642cca9f1a6 Text-delta-base-sha1: bbfd3ad95a0c27f2861e161b1f9c9c2eeda8cba7 Text-content-length: 78 Text-content-md5: 27bbf0b104c4e47efd9493ee78789ffb Text-content-sha1: b413686b51e642e068536de43cd5c0e81cfc981e Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVNs{ 5/B1/* $Id: macterm.c,v 1.75 2003/05/04 14:18:18 simoonst Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a3a2d42cfebb09b6b0fb7f7b2c1bc6e4 Text-delta-base-sha1: 6c13d7f5580655bf665705d8fe86e7a82f088211 Text-content-length: 38 Text-content-md5: c730952cd41488d03b0ce764cb91f4da Text-content-sha1: b4cf94ddb0ff044bc78a81f633c11f0cf69c0782 Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNvJrH>8onstonst Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 24ef625ce59047b26f31b9efa4b0f815 Text-delta-base-sha1: 7479d1853542f9024d629a77a07a180b3c1145d5 Text-content-length: 64 Text-content-md5: 828de625d6df31ab3f3812f4de5ed656 Text-content-sha1: 5a77f102447a1b14361f7690f8ac443aaaef3e9f Content-length: 104 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN=I!DBA onstonst char *ot_tcp_socket_erro Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 02d758b901abe7a7be75e3986451dc33 Text-delta-base-sha1: 8d031d35ed1cbc1f84dcaac933c8daad391065a8 Text-content-length: 45 Text-content-md5: f19f8cdf578efcf8e0111ce243127dc9 Text-content-sha1: 3fcdb8e2a61ed79c6cdb4c667093b1738e6aedf2 Content-length: 85 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN@R @f>";onstonstonst Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c8e5ec2a5901114b1713765508a838e9 Text-delta-base-sha1: cdd58cd8470ad46c4bd6323608d511f9dcd5b9e4 Text-content-length: 28 Text-content-md5: 9f19af4ff3c2bcdd26008afa1d61bce8 Text-content-sha1: 742497658cddf13e3dbbae68c115eead8d187549 Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVN ~onst Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b6d19f76d5eaef37e5f5c578cb2b25a0 Text-delta-base-sha1: d8620ea47adc8abf17446f513ea520263ab3a0f4 Text-content-length: 302 Text-content-md5: 8e20b780f5cbdf143e5d2ae0808dffe8 Text-content-sha1: 8aa9ed6ab4df7c2b0c858006f86ec519f1fdd9ed Content-length: 342 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVND*xo]mLk1Ji71Vl  onstonst char *pfd_newconnect(Socket *s, char *hostname, int port, void *c pfd_sent, NULL }; SockAddr addr; const char *err; charonstonst char *pfd_addforward(char *desthost, int destport, char *srcaddr, int port,onst Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cf6cd4afdacc4bfa0a9b2f3514367798 Text-delta-base-sha1: 824904bf234165666c1e2ee31eb8ba35412725db Text-content-length: 73 Text-content-md5: 6f17bfd4cb8266c63de1e049da57e933 Text-content-sha1: 3baeea9ef5ac9020b88542db6d9ae6e097b4249f Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNdb RP^j>N8,onstonstsk_addr_error(proxy_addr Node-path: putty/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 40b43f22d16acd346119739d7e688d39 Text-delta-base-sha1: 5c575352bf41c525c9c8d338b94c983e9deaa939 Text-content-length: 25 Text-content-md5: b2dd35f3ab92ff16d6138fcc14626857 Text-content-sha1: 9ddccba36ce4465183aacfad22ddbff0c28a30ce Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNou 3>1onst Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 99001b5b35b43af184ad795aafa904ab Text-delta-base-sha1: b637754c7a8138e76c7240ed94c9901abf986dca Text-content-length: 29 Text-content-md5: 26e4a1dcba860b2deb4acf102b29fcd7 Text-content-sha1: cf8b8d8500b47e05991567c0080f131c34757bf5 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVNms #L!onst Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f7a28bb5d30249b99960d054f67910c9 Text-delta-base-sha1: faca1b8ba856c329cbcb86fe8914c2804cc74be3 Text-content-length: 132 Text-content-md5: cce359b064848910976228872b24913c Text-content-sha1: 2ec654566bae43a4c4053d5c69373572ea1f0dfe Content-length: 173 K 15 cvs2svn:cvs-rev V 5 1.217 PROPS-END SVN^8V}geonst char *(*init) (void *frontend_handle, void **backend_handle, Config *cfg, onstonst Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b27a35b698d671570ee217ee85d29e19 Text-delta-base-sha1: d810972842abe94e43a9bd6384a7fccaff8f9c17 Text-content-length: 131 Text-content-md5: cf619de0c08e76b3b61087ef4d5fd2a0 Text-content-sha1: 203297b554d29ecfa76e715bdbad7090e7abf610 Content-length: 171 K 15 cvs2svn:cvs-rev V 4 1.48 PROPS-END SVN6FanUlY8jLonstonst char *raw_init(void *frontend_handle, void **backend_handle, Config *cfg, onst Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8a8cdb2821a7288abb851855f2b1f376 Text-delta-base-sha1: b17cac2960f532f646d9eca55b1da19e008075c0 Text-content-length: 194 Text-content-md5: b8cdbff346a74d529d638ad14c4a6a58 Text-content-sha1: bb3ab54745563ff0ff901c8f096d0ebb0a1fb77b Content-length: 234 K 15 cvs2svn:cvs-rev V 4 1.44 PROPS-END SVN<J HL3aonstonst char *rlogin_init(void *frontend_handle, void **backend_handle, Config *cfg, char *host, int port, char **realhost, onst Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d26b24ec62b24a85f712c3a7c24ebfbe Text-delta-base-sha1: 38877c5382a56aef0f5a167a6c54c18af4757366 Text-content-length: 48 Text-content-md5: 71c42baa274a90221ab256b8f3907d0a Text-content-sha1: 28601e89e837afd5483c2e6d17bf0450a6cb8296 Content-length: 89 K 15 cvs2svn:cvs-rev V 5 1.105 PROPS-END SVN?N .7onst char *err; char Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 437b0a008ea75480165fcc369fd89e87 Text-delta-base-sha1: 9f563cc66c639018caf570d3d831a4156ab3b763 Text-content-length: 470 Text-content-md5: cd7447c9c9b548919fbf538c438ef54e Text-content-sha1: 96cd8f327df4f782a10f964859c63b55f74c7713 Content-length: 511 K 15 cvs2svn:cvs-rev V 5 1.293 PROPS-END SVN#JEC*^)Ahonstonstonst char *connect_to_host(Ssh ssh, char *host, int port, onst]13mrPwfrying to open a channel; const charonst char *e = pfd_newconnect(&c->u.pfd.s, realpf->dhost, realpf->dport, c, onst char *ssh_init(void *frontend_handle, void **backend_handle, Config *cfg, char *host, int port, char **realhost, int nodelay) { const Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c83bc694615a25ca50f6f15b2bdde818 Text-delta-base-sha1: 29cb3353fba046d5ed67678dfff1f623457f7e6c Text-content-length: 313 Text-content-md5: 800298e4de87f4c4af96b6b1ff47f884 Text-content-sha1: ce33c196b67d4d30176a5b337b8d56ed381c2177 Content-length: 353 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVNr  l N^?nO[onstonst char *pfd_newconnect(Socket * s, char *hostname, int port, void *c,onst char *pfd_addforward(char *desthost, int destport, char *srcaddr, int port, void *backhandle, onst char *x11_init(Socket *, char *, void *, void *, const char *, int, Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 92594d7061ed4615097e3cf87a9d9133 Text-delta-base-sha1: d3bf7c63b3ccafa0dc43e862fe5d2d0effa4d23a Text-content-length: 200 Text-content-md5: 86fdcf1fb4a406ff4a21c587ba0ed9f7 Text-content-sha1: 67edd31ffd3e2f16c898e72bc87711239fb85e3e Content-length: 240 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVN3[4:2f8{onstonst char *telnet_init(void *frontend_handle, void **backend_handle, Config *cfg, char *host, int port, char **realhost, onst Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 165f4235b1a383ab08bcbf900079d134 Text-delta-base-sha1: 16632b0e110c5a0ae9bf43a032bd37aeb9a05260 Text-content-length: 47 Text-content-md5: 9ad4eb09ec6b47c59f3a80f1ec04e440 Text-content-sha1: a66f772496a9c5a1c5870ce1241faf780ac7f9da Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNekkE{*;onst char *string Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e31ecf87af209b761cdf7ce292b020f3 Text-delta-base-sha1: e9147bfc40fc45a5af1b3b07f94efbd337ce463f Text-content-length: 65 Text-content-md5: 80701f13c19b9cbc8f4445f4c8885f51 Text-content-sha1: 905b14e6231515b2b1d1dff71509da09a545c8e4 Content-length: 106 K 15 cvs2svn:cvs-rev V 5 1.128 PROPS-END SVN`rmB: Wonst char *string; const char Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c5a7201b4143e672de9fa5edba07796d Text-delta-base-sha1: c99359ea3534480f9f862e42d12191b5fa0f090b Text-content-length: 33 Text-content-md5: ebb9f84f13cafd6fa55a897d63e71811 Text-content-sha1: e88f1974b295210be3ee3da617e683f17acec1e6 Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN6;}F{sConst Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7765842c8b932d6baac0015008152127 Text-delta-base-sha1: 9def57ca1d24b13fbf453b1cb2c590affd1a8dd3 Text-content-length: 25 Text-content-md5: 305987db078c01ad6baeb127e3baccda Text-content-sha1: 1f12c1d64f8a1ce3ab69cac14c0f6c878a441532 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNek 9.7onst Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7fc21a5db22cb65c8157c65a93cd4661 Text-delta-base-sha1: 083124afb8f05101cb72e5d68b2112ef7ff180b2 Text-content-length: 25 Text-content-md5: bbebdce1b62c33e38529e6c18dd50458 Text-content-sha1: 591f4e806386bfbc84caa4c8b93a21ff883445bf Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNfl ?)=onst Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 74cdf3e1e60a88cac54813d9289a2865 Text-delta-base-sha1: 5d0b0bf7593c1dc9f9d26039062f9df5c6e5aca8 Text-content-length: 220 Text-content-md5: 40bbb29c14345e1b915fedbde4c1a8e0 Text-content-sha1: bb4e9e25fbdbbd3b2f72c8726fba89e26c4d8cc8 Content-length: 260 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNu,"q>o'+KQAvlPO&onstonstonst onstonst char *str = (ret == 0 ? "Internal networking trouble" : onst char *sk_addr_error(SockAddr addr) { return addr->error; } static const Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f3cef907ac03bde7c008d8fe51da9312 Text-delta-base-sha1: bf217368d322f57ab873402e7f36f2a6bdb1c248 Text-content-length: 28 Text-content-md5: a133b0ce2fc88f699b1edf93c66e8110 Text-content-sha1: 93965746b0669ba825e2408a7a3aaa36c333b20c Content-length: 68 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN 2a1onst Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fe7939cd4eb63ac2e76ecf19d6dab2a1 Text-delta-base-sha1: 273e57e6b6712a4814d38052d9542a801315f37a Text-content-length: 27 Text-content-md5: e458d64e3b132a0a32ecbb94ebd2b2fa Text-content-sha1: 1991c6b0b355fc98128de125f2b223a43958c2a8 Content-length: 68 K 15 cvs2svn:cvs-rev V 5 1.212 PROPS-END SVNkq Sonst Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 90bb822c62e55bbe2c424bbb6cf44b01 Text-delta-base-sha1: 8b900e53dd76b94388c720cc9d0737007ba1b5db Text-content-length: 52 Text-content-md5: 8cfbf00c676594504ef0631d16be399e Text-content-sha1: a4665bbd628193a6faa78554ed4dd97f8d27be3e Content-length: 93 K 15 cvs2svn:cvs-rev V 5 1.246 PROPS-END SVN  n onst "ows, p Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0b0d973fa5c2f1ea2a78a850ab14564b Text-delta-base-sha1: 6e26b4f3c3e360396b884b7730b27a65cada6a21 Text-content-length: 116 Text-content-md5: 374a1557a550b9678b5e3c7d516eb587 Text-content-sha1: 363961c7a67efd8428616989bd996bdf6e9237c1 Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.52 PROPS-END SVNw TYMWPhonstonst char *sk_addr_error(SockAddr addr) { return addr->error; } static const Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c775f9c88db3c351c6410bfd8474a67d Text-delta-base-sha1: 06b58a9ff16cb70f7dc838820c0dadd39ff2b997 Text-content-length: 132 Text-content-md5: 130a00c31b1a7f76643e4596332d1855 Text-content-sha1: aac40d04e6d69e07c8d7746061feb302e3acedd7 Content-length: 172 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNxbFR?^onstonst char *x11_init(Socket * s, char *display, void *c, void *auth, onst char *err; char Revision-number: 3163 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2003-05-06T08:43:11.000000Z K 7 svn:log V 36 Update to use -title rather than -T K 10 svn:author V 4 owen PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b02d6d650dbc8ed1f62c37ea9e9cba0c Text-delta-base-sha1: e19864fa5831b86704049f4d8c40ad848716838f Text-content-length: 29 Text-content-md5: 9e688d37e3dd57215bce96287eb13d9e Text-content-sha1: 9b8c0236c6e7475905cbc1494520960d5885e953 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNEI =title Revision-number: 3164 Prop-content-length: 288 Content-length: 288 K 8 svn:date V 27 2003-05-06T19:52:31.000000Z K 7 svn:log V 187 Support, on Unix only (so far), for OpenSSH-style generic proxying (running a local command in a pair of pipes and proxying through that, for example `ssh proxyhost nc -q0 %host %port'). K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f24c936cd34ce09f6db8b1dfba52843f Text-delta-base-sha1: de066c4f3505de36c8c1544c18599a9b00191975 Text-content-length: 142 Text-content-md5: 3b695d8478b6a8ee502ee9a05f65eaed Text-content-sha1: d2da9e1f4d35fee57b31dc557e60e4e3d1033fa2 Content-length: 182 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVN`vsIli&Q pproxy UXMISC = misc version uxstore settings tree234 uxsel uxnet proxy cmdline + uxmisc uxproxy pproxy Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 80e8faeed14548e6dac20bb5934f23ce Text-delta-base-sha1: 9b97224294cf0ae24d19eb217fb78369692d10f0 Text-content-length: 232 Text-content-md5: e7a7197042131e3088be44fd97b4f96e Text-content-sha1: 96bcb87827d0a6cb65972b670e21289fd5e66af6 Content-length: 272 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNiLvL'^'t', 4, HELPCTX(proxy_type), dlg_stdradiobutton_handler, I(offsetof(Config, proxy_type)), "None", I(PROXY_NONE), "HTTP", I(PROXY_HTTP), "SOCKS", I(PROXY_SOCKS), "Telnet" Node-path: putty/pproxy.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 403 Text-content-md5: cee9887da8a857715e80bb16f8c3b50c Text-content-sha1: 239b949f0a9ab537984b4602ef3e0b6d5a6ef688 Content-length: 519 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN/* * pproxy.c: dummy implementation of platform_new_connection(), to * be supplanted on any platform which has its own local proxy * method. */ #include "putty.h" #include "network.h" #include "proxy.h" Socket new_connection(SockAddr addr, char *hostname, int port, int privport, int oobinline, int nodelay, Plug plug, const Config *cfg) { return NULL; } Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6f17bfd4cb8266c63de1e049da57e933 Text-delta-base-sha1: 3baeea9ef5ac9020b88542db6d9ae6e097b4249f Text-content-length: 4980 Text-content-md5: bcf8043db1f49cd5d8004d78bffd3572 Text-content-sha1: cb7a41fb3d62f8a452060dfd4c1b7820a15743bd Content-length: 5020 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVNbf>(d'{[YT}" +@ d+Hyumplatform_new_connection(SockAddr addr, char *hostname, int port, int privport, int oobinline, int nodelay, Plug plug, const Config *cfg); Socket sret; if ( (sret = platform_new_connection(addr, hostname, port, privport, oobinline, nodelay, plug, cfg)) ) return sretchar *format_telnet_command(SockAddr addr, int port, const Config *cfg) { char *ret = NULL; int retlen = 0, retsize = 0; int so = 0, eo = 0; #define ENSURE(n) do { \ if (retsize < retlen + n) { \ retsize = retlen + n + 512; \ ret = sresize(ret, retsize, char); \ } \ } while (0) /* we need to escape \\, \%, \r, \n, \t, \x??, \0???, * %%, %host, %port, %user, and %pass */ while (cfg->proxy_telnet_command[eo] != 0) { /* scan forward until we hit end-of-line, * or an escape character (\ or %) */ while (cfg->proxy_telnet_command[eo] != 0 && cfg->proxy_telnet_command[eo] != '%' && cfg->proxy_telnet_command[eo] != '\\') eo++; /* if we hit eol, break out of our escaping loop */ if (cfg->proxy_telnet_command[eo] == 0) break; /* if there was any unescaped text before the escape * character, send that now */ if (eo != so) { ENSURE(eo - so); memcpy(ret + retlen, cfg->proxy_telnet_command + so, eo - so); retlen += eo - so; } so = eo++; /* if the escape character was the last character of * the line, we'll just stop and send it. */ if (cfg->proxy_telnet_command[eo] == 0) break; if (cfg->proxy_telnet_command[so] == '\\') { /* we recognize \\, \%, \r, \n, \t, \x??. * anything else, we just send unescaped (including the \). */ switch (cfg->proxy_telnet_command[eo]) { case '\\': ENSURE(1); ret[retlen++] = '\\'; eo++; break; case '%': ENSURE(1); ret[retlen++] = '%'; eo++; break; case 'r': ENSURE(1); ret[retlen++] = '\r'; eo++; break; case 'n': ENSURE(1); ret[retlen++] = '\n'; eo++; break; case 't': ENSURE(1); ret[retlen++] = '\t'; eo++; break; case 'x': case 'X': cfg->proxy_telnet_command[eo] >= '0' && cfg->proxy_telnet_command[eo] <= '9') v += cfg->proxy_telnet_command[eo] - '0'; else if (cfg->proxy_telnet_command[eo] >= 'a' && cfg->proxy_telnet_command[eo] <= 'f') v += cfg->proxy_telnet_command[eo] - 'a' + 10; else if (cfg->proxy_telnet_command[eo] >= 'A' && cfg->proxy_telnet_command[eo] <= 'F') v += cfg->ENSURE(1); ret[retlen++] = '\\'; eo = so + 1; break; } /* we only extract two hex characters */ if (i == 1) { ENSURE(1); ret[retlen++] = v; eo++; break; } i++; v <<= 4; } } break; default: ENSURE(2); memcpy(ret+retlen, cfg->proxy_telnet_command + so, 2); retlen += 2; eo++; break; } } else { /* % escape. we recognize %%, %host, %port, %user, %pass. * anything else, we just send unescaped (including the %). */ if (cfg->proxy_telnet_command[eo] == '%') { ENSURE(1); ret[retlen++] = '%'; eo++; } else if (strnicmp(cfg->proxy_telnet_command + eo, "host", 4) == 0) { char dest[512]; int destlen; sk_getaddr(addr, dest, lenof(dest)); destlen = strlen(dest); ENSURE(destlen); memcpy(ret+retlen, dest, destlen); retlen += destlen; eo += 4; } else if (strnicmp(cfg->proxy_telnet_command + eo, "port", 4) == 0) { char portstr[8], portlen; portlen = sprintf(portstr, "%i", port); ENSURE(portlen); memcpy(ret + retlen, portstr, portlen); retlen += portlen; eo += 4; } else if (strnicmp(cfg->proxy_telnet_command + eo, "user", 4) == 0) { int userlen = strlen(cfg->proxy_username); ENSURE(userlen); memcpy(ret+retlen, cfg->proxy_username, userlen); retlen += userlen; eo += 4; } else if (strnicmp(cfg->proxy_telnet_command + eo, "pass", 4) == 0) { int passlen = strlen(cfg->proxy_password); ENSURE(passlen); memcpy(ret+retlen, cfg->proxy_password, passlen); retlen += passlen; eo += 4; } else { /* we don't escape this, so send the % now, and * don't advance eo, so that we'll consider the * text immediately following the % as unescaped. */ ENSURE(1); ret[retlen++] = '%'; } } /* resume scanning for additional escapes after this one. */ so = eo; } /* if there is any unescaped text at the end of the line, send it */ if (eo != so) { ENSURE(eo - so); memcpy(ret + retlen, cfg->proxy_telnet_command + so, eo - so); retlen += eo - so; } ENSURE(1); ret[retlen] = '\0'; return ret; #undef ENSURE } char *formatted_cmd; formatted_cmd = format_telnet_command(p->remote_addr, p->remote_port, &p->cfg); sk_write(p->sub_socket, formatted_cmd, strlen(formatted_cmd)); sfree(formatted_cmd Node-path: putty/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b2dd35f3ab92ff16d6138fcc14626857 Text-delta-base-sha1: 9ddccba36ce4465183aacfad22ddbff0c28a30ce Text-content-length: 182 Text-content-md5: 2bcb34171445893c0f599d54d15d41fb Text-content-sha1: df3b433984dbb694b7899f9054c82d9225f8f428 Content-length: 221 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNu#n#/* * This may be reused by local-command proxies on individual * platforms. */ char *format_telnet_command(SockAddr addr, int port, const Config *cfg); #endif Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cce359b064848910976228872b24913c Text-delta-base-sha1: 2ec654566bae43a4c4053d5c69373572ea1f0dfe Text-content-length: 35 Text-content-md5: bc1776eacd57010a108f11edc2d3ca12 Text-content-sha1: 7324a922ffb8fd6e1201c3fab4fb006faac026dc Content-length: 76 K 15 cvs2svn:cvs-rev V 5 1.218 PROPS-END SVN! , PROXY_CMD Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fbbe7bfed01e9a49a7f221a8ab9445a7 Text-delta-base-sha1: 49ee459445bef79481ee7ea3cb6d9f0671a58b26 Text-content-length: 1298 Text-content-md5: e9a21c5895af17783e6173e60cd4dcb2 Text-content-sha1: f1f678ec82d378a1645119f7e4be388e42fbb5a5 Content-length: 1337 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN /* * Unix supports a local-command proxy. This also means we must * adjust the text on the `Telnet command' control. */ s = ctrl_getset(b, "Connection/Proxy", "basics", "Proxy basics"); { int i; for (i = 0; i < s->ncontrols; i++) { c = s->ctrls[i]; if (c->generic.type == CTRL_RADIO && c->generic.context.i == offsetof(Config, proxy_type)) { assert(c->generic.handler == dlg_stdradiobutton_handler); c->radio.nbuttons++; c->radio.ncolumns++; c->radio.buttons = sresize(c->radio.buttons, c->radio.nbuttons, char *); c->radio.buttons[c->radio.nbuttons-1] = dupstr("Local"); c->radio.buttondata = sresize(c->radio.buttondata, c->radio.nbuttons, intorptr); c->radio.buttondata[c->radio.nbuttons-1] = I(PROXY_CMD); break; } } } s = ctrl_getset(b, "Connection/Proxy", "misc", "Miscellaneous proxy settings"); { int i; for (i = 0; i < s->ncontrols; i++) { c = s->ctrls[i]; if (c->generic.type == CTRL_EDITBOX && c->generic.context.i == offsetof(Config, proxy_telnet_command)) { assert(c->generic.handler == dlg_stdeditbox_handler); sfree(c->generic.label); c->generic.label = dupstr("Telnet command, or local" " proxy command"); break; } } } } Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 7090 Text-content-md5: e5a28961a409c75b78ba7ce590811282 Text-content-sha1: 0cfb3b1dd0b9d603b3a6c57c59379078bc1eb834 Content-length: 7206 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN$$$/* * uxproxy.c: Unix implementation of platform_new_connection(), * supporting an OpenSSH-like proxy command. */ #include #include #include #include #include #define DEFINE_PLUG_METHOD_MACROS #include "tree234.h" #include "putty.h" #include "network.h" #include "proxy.h" typedef struct Socket_localproxy_tag * Local_Proxy_Socket; struct Socket_localproxy_tag { const struct socket_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ int to_cmd, from_cmd; /* fds */ char *error; Plug plug; bufchain pending_output_data; bufchain pending_input_data; void *privptr; }; static int localproxy_select_result(int fd, int event); /* * Trees to look up the pipe fds in. */ static tree234 *localproxy_by_fromfd, *localproxy_by_tofd; static int localproxy_fromfd_cmp(void *av, void *bv) { Local_Proxy_Socket a = (Local_Proxy_Socket)av; Local_Proxy_Socket b = (Local_Proxy_Socket)bv; if (a->from_cmd < b->from_cmd) return -1; if (a->from_cmd > b->from_cmd) return +1; return 0; } static int localproxy_fromfd_find(void *av, void *bv) { int a = *(int *)av; Local_Proxy_Socket b = (Local_Proxy_Socket)bv; if (a < b->from_cmd) return -1; if (a > b->from_cmd) return +1; return 0; } static int localproxy_tofd_cmp(void *av, void *bv) { Local_Proxy_Socket a = (Local_Proxy_Socket)av; Local_Proxy_Socket b = (Local_Proxy_Socket)bv; if (a->to_cmd < b->to_cmd) return -1; if (a->to_cmd > b->to_cmd) return +1; return 0; } static int localproxy_tofd_find(void *av, void *bv) { int a = *(int *)av; Local_Proxy_Socket b = (Local_Proxy_Socket)bv; if (a < b->to_cmd) return -1; if (a > b->to_cmd) return +1; return 0; } /* basic proxy socket functions */ static Plug sk_localproxy_plug (Socket s, Plug p) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; Plug ret = ps->plug; if (p) ps->plug = p; return ret; } static void sk_localproxy_close (Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; del234(localproxy_by_fromfd, ps); del234(localproxy_by_tofd, ps); close(ps->to_cmd); close(ps->from_cmd); sfree(ps); } static int localproxy_try_send(Local_Proxy_Socket ps) { int sent = 0; while (bufchain_size(&ps->pending_output_data) > 0) { void *data; int len, ret; bufchain_prefix(&ps->pending_output_data, &data, &len); ret = write(ps->to_cmd, data, len); if (ret < 0 && errno != EWOULDBLOCK) { /* We're inside the Unix frontend here, so we know * that the frontend handle is unnecessary. */ logevent(NULL, strerror(errno)); fatalbox("%s", strerror(errno)); } else if (ret <= 0) { break; } else { bufchain_consume(&ps->pending_output_data, ret); sent += ret; } } if (bufchain_size(&ps->pending_output_data) == 0) uxsel_del(ps->to_cmd); else uxsel_set(ps->to_cmd, 2, localproxy_select_result); return sent; } static int sk_localproxy_write (Socket s, const char *data, int len) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; bufchain_add(&ps->pending_output_data, data, len); localproxy_try_send(ps); return bufchain_size(&ps->pending_output_data); } static int sk_localproxy_write_oob (Socket s, const char *data, int len) { /* * oob data is treated as inband; nasty, but nothing really * better we can do */ return sk_localproxy_write(s, data, len); } static void sk_localproxy_flush (Socket s) { /* Local_Proxy_Socket ps = (Local_Proxy_Socket) s; */ /* do nothing */ } static void sk_localproxy_set_private_ptr (Socket s, void *ptr) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; ps->privptr = ptr; } static void * sk_localproxy_get_private_ptr (Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; return ps->privptr; } static void sk_localproxy_set_frozen (Socket s, int is_frozen) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; if (is_frozen) uxsel_del(ps->from_cmd); else uxsel_set(ps->from_cmd, 1, localproxy_select_result); } static const char * sk_localproxy_socket_error (Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; return ps->error; } static int localproxy_select_result(int fd, int event) { Local_Proxy_Socket s; char buf[20480]; int ret; if (!(s = find234(localproxy_by_fromfd, &fd, localproxy_fromfd_find)) && !(s = find234(localproxy_by_tofd, &fd, localproxy_tofd_find)) ) return 1; /* boggle */ if (event == 1) { assert(fd == s->from_cmd); ret = read(fd, buf, sizeof(buf)); if (ret < 0) { return plug_closing(s->plug, strerror(errno), errno, 0); } else if (ret == 0) { return plug_closing(s->plug, NULL, 0, 0); } else { return plug_receive(s->plug, 1, buf, ret); } } else if (event == 2) { assert(fd == s->to_cmd); if (localproxy_try_send(s)) plug_sent(s->plug, bufchain_size(&s->pending_output_data)); return 1; } return 1; } Socket platform_new_connection(SockAddr addr, char *hostname, int port, int privport, int oobinline, int nodelay, Plug plug, const Config *cfg) { char *cmd; static const struct socket_function_table socket_fn_table = { sk_localproxy_plug, sk_localproxy_close, sk_localproxy_write, sk_localproxy_write_oob, sk_localproxy_flush, sk_localproxy_set_private_ptr, sk_localproxy_get_private_ptr, sk_localproxy_set_frozen, sk_localproxy_socket_error }; Local_Proxy_Socket ret; int to_cmd_pipe[2], from_cmd_pipe[2], pid; if (cfg->proxy_type != PROXY_CMD) return NULL; cmd = format_telnet_command(addr, port, cfg); ret = snew(struct Socket_localproxy_tag); ret->fn = &socket_fn_table; ret->plug = plug; ret->error = NULL; bufchain_init(&ret->pending_input_data); bufchain_init(&ret->pending_output_data); /* * Create the pipes to the proxy command, and spawn the proxy * command process. */ if (pipe(to_cmd_pipe) < 0 || pipe(from_cmd_pipe) < 0) { ret->error = dupprintf("pipe: %s", strerror(errno)); return (Socket)ret; } pid = fork(); if (pid < 0) { ret->error = dupprintf("fork: %s", strerror(errno)); return (Socket)ret; } else if (pid == 0) { int i; close(0); close(1); dup2(to_cmd_pipe[0], 0); dup2(from_cmd_pipe[1], 1); for (i = 3; i < 127; i++) close(i); fcntl(0, F_SETFD, 0); fcntl(1, F_SETFD, 0); execl("/bin/sh", "sh", "-c", cmd, NULL); _exit(255); } close(to_cmd_pipe[0]); close(from_cmd_pipe[1]); ret->to_cmd = to_cmd_pipe[1]; ret->from_cmd = from_cmd_pipe[0]; if (!localproxy_by_fromfd) localproxy_by_fromfd = newtree234(localproxy_fromfd_cmp); if (!localproxy_by_tofd) localproxy_by_tofd = newtree234(localproxy_tofd_cmp); add234(localproxy_by_fromfd, ret); add234(localproxy_by_tofd, ret); uxsel_set(ret->from_cmd, 1, localproxy_select_result); return (Socket) ret; } Revision-number: 3165 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2003-05-06T19:55:00.000000Z K 7 svn:log V 37 Reinstate `-T title', in pterm only. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 80701f13c19b9cbc8f4445f4c8885f51 Text-delta-base-sha1: 905b14e6231515b2b1d1dff71509da09a545c8e4 Text-content-length: 377 Text-content-md5: fdf8818d7f89a89a9dc3f4a34ea4bd21 Text-content-sha1: ae6b54e7f2e6b71d77df18b26ce6ec6da07f53bf Content-length: 418 K 15 cvs2svn:cvs-rev V 5 1.129 PROPS-END SVNrQ\\o /* * Shameless cheating. Debian requires all X terminal * emulators to support `-T title'; but * cmdline_process_param will eat -T (it means no-pty) and * complain that pterm doesn't support it. So, in pterm * only, we convert -T into -title. */ if ((cmdline_tooltype & TOOLTYPE_NONNETWORK) && !strcmp(p, "-T")) p = "-title" Revision-number: 3166 Prop-content-length: 340 Content-length: 340 K 8 svn:date V 27 2003-05-07T08:49:57.000000Z K 7 svn:log V 239 Ahem. Well, the complicated Unix implementation of platform_new_connection() worked fine, but the really simple stub version for the other ports fell over horribly because I got its name wrong. NEVER ASSUME YOU'VE DONE THE EASY BIT RIGHT. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cee9887da8a857715e80bb16f8c3b50c Text-delta-base-sha1: 239b949f0a9ab537984b4602ef3e0b6d5a6ef688 Text-content-length: 164 Text-content-md5: 38a6163696c91bd6b729555ee8790c40 Text-content-sha1: 6b65e3e49bb54847910c45ae0c6578dd2bb46824 Content-length: 203 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN X.Wplatform_new_connection(SockAddr addr, char *hostname, int port, int privport, int oobinline, int nodelay, Plug plug, Revision-number: 3167 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2003-05-07T10:58:52.000000Z K 7 svn:log V 86 Adjust the bug description on this to make it clearer that it can also apply to PSCP. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/sftp-slow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: df91be8ac74f69c193a5b9fbc385dce2 Text-delta-base-sha1: d53a0f07562b54acb49fa18f7ae66cd3be08f25a Text-content-length: 92 Text-content-md5: 4e72b748951be583d08f23ef3219bdc1 Text-content-sha1: 4f2ddd99d553a5bbb502eaf1b231593a3daf54aa Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN0KKe0Summary: PSFTP, and PSCP in SFTP mode, transfer files much slower than old- Revision-number: 3168 Prop-content-length: 489 Content-length: 489 K 7 svn:log V 388 Yesterday's proxy enhancements also slightly nadgered the config box, in that it started to expand under the weight of proxy options. Now fixed, by folding the SOCKS version selector into the general proxy type selector so there's one single 5- or 6-way radio button set split over two lines. settings.c has of course grown a backwards compatibility wart to deal with legacy config data. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-05-07T12:07:23.000000Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e7a7197042131e3088be44fd97b4f96e Text-delta-base-sha1: 96bcb87827d0a6cb65972b670e21289fd5e66af6 Text-content-length: 181 Text-content-md5: 72cbfdfbb95d25f28b5facf318c7e434 Text-content-sha1: 21818c9da50a8783778ee4e6249bdc5ef760730c Content-length: 221 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNi_ @|U_2Tf` NULL); ctrl_radiobuttons(s, "Proxy type:", 't', 3SOCKS 4", I(PROXY_SOCKS4), "SOCKS 5", I(PROXY_SOCKS5), "HTTP", I(PROXY_HTTP Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ca7351bc11d5123b78398fc0a11f9e3 Text-delta-base-sha1: 4ce1356f24f08d96d5e8e45953a6fb3f57bb2fe0 Text-content-length: 151 Text-content-md5: 3a5cd86465cbbca6260045f99048ae67 Text-content-sha1: c9dea4c96274a156449c5686762a796b669fff72 Content-length: 191 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNOuz5@j^'(\versionid $Id: config.but,v 1.64 2003/05/07 12:07:23 4} or \q{SOCKS 5} allows you to proxy your connections through Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bcf8043db1f49cd5d8004d78bffd3572 Text-delta-base-sha1: cb7a41fb3d62f8a452060dfd4c1b7820a15743bd Text-content-length: 248 Text-content-md5: adc60a113ef0ad46a0ef3814ec7e4de0 Text-content-sha1: 1ac2e16df955ef779979dc38ee62586d7c5cf379 Content-length: 288 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNf<Wb7/uI\ cfg->proxy_type != PROXY_SOCKS4 && \ cfg->proxy_type != PROXY_SOCKS54) { ret->negotiate = proxy_socks4_negotiate; } else if (cfg->proxy_type == PROXY_SOCKS5) { Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bc1776eacd57010a108f11edc2d3ca12 Text-delta-base-sha1: 7324a922ffb8fd6e1201c3fab4fb006faac026dc Text-content-length: 64 Text-content-md5: 8b84b1c313c0b652d0ec148ce23b5bb4 Text-content-sha1: 5cdc783596095b57c1485166676c51efb913a4c5 Content-length: 105 K 15 cvs2svn:cvs-rev V 5 1.219 PROPS-END SVN!$i%zeproxy_type); if (cfg->proxy_type == -1) { int i; gppi(sesskey, "ProxyType", -1, &i); if (i == 0) cfg->proxy_type = PROXY_NONE; else if (i == 1) cfg->proxy_type = PROXY_HTTP; else if (i == 3) cfg->proxy_type = PROXY_TELNET; else if (i == 4) cfg->proxy_type = PROXY_CMD; else { gppi(sesskey, "ProxySOCKSVersion", 5, &i); if (i == 5) cfg->proxy_type = PROXY_SOCKS5; else cfg->proxy_type = PROXY_SOCKS4; } } Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e9a21c5895af17783e6173e60cd4dcb2 Text-delta-base-sha1: f1f678ec82d378a1645119f7e4be388e42fbb5a5 Text-content-length: 39 Text-content-md5: 2102ac4915946596a69a4924f8d77d11 Text-content-sha1: a32ee44e146701291d67342f14cf275acdae8ead Content-length: 78 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNvFT.z^dsNULL Revision-number: 3169 Prop-content-length: 257 Content-length: 257 K 8 svn:date V 27 2003-05-07T13:14:48.000000Z K 7 svn:log V 156 Bah. Stop the Proxy panel appearing empty in Change Settings. One day I'll make a reasonably big checkin and _not_ have six tiny mop- up issues after it... K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2102ac4915946596a69a4924f8d77d11 Text-delta-base-sha1: a32ee44e146701291d67342f14cf275acdae8ead Text-content-length: 111 Text-content-md5: 34caf37bee3ab9866b21cdded8c86692 Text-content-sha1: 4e7749b7235dfcaa099712666d7ffbfcc035103c Content-length: 150 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNv YYYif (!midsession) { int i; s = ctrl_getset(b, "Connection/Proxy", "basics", NULL) Revision-number: 3170 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2003-05-08T09:07:37.000000Z K 7 svn:log V 53 Fix a typo in my backwards-compatibility wart. Oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5b162f122d797048a4233bda4fad963e Text-delta-base-sha1: 7acd90b7be8a3dc78b9ea6b4ffed921cb571796e Text-content-length: 24 Text-content-md5: d410ee542c3301719fbdbf0d026554c6 Text-content-sha1: 62efc6053325c53f0cdd1c455154f723fce13114 Content-length: 65 K 15 cvs2svn:cvs-rev V 5 1.110 PROPS-END SVN vx0 Revision-number: 3171 Prop-content-length: 742 Content-length: 742 K 7 svn:log V 641 Fixes for Debian bug #192701 (64-bit gccs warn about casts between ptrs and ints of different size and -Werror makes this serious). The GTK bits are done by Colin's patch to use GINT_TO_POINTER (thanks); the uxnet bits are done by cleaning up the rest of the code. In particular, network.h now typedefs `OSSocket' to be a type capable of holding whatever the OS's socket data type is that underlies our socket abstraction. Individual platforms can make this typedef themselves if they define OSSOCKET_DEFINED to prevent network.h redoing it; so the Unix OSSocket is now int. Default is still void *, so other platforms should be unaffected. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-05-10T08:35:54.000000Z PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f19f8cdf578efcf8e0111ce243127dc9 Text-delta-base-sha1: 3fcdb8e2a61ed79c6cdb4c667093b1738e6aedf2 Text-content-length: 106 Text-content-md5: 15c2dd455085d3f8eb0c8724d36815cc Text-content-sha1: c37f496b51be23e6faae4aaa33b935b40e79c5f9 Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNRIwaul\N#ifndef OSSOCKET_DEFINED typedef void *OSSocket; #endifOSSocket OSSocket Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8e20b780f5cbdf143e5d2ae0808dffe8 Text-delta-base-sha1: 8aa9ed6ab4df7c2b0c858006f86ec519f1fdd9ed Text-content-length: 38 Text-content-md5: d2a56ef1b8e5a852717edebffc0bd226 Text-content-sha1: 0a69afc0d202c086011ad68caf4c7c3523345782 Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNDG q/?OSSocket sock Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: adc60a113ef0ad46a0ef3814ec7e4de0 Text-delta-base-sha1: 1ac2e16df955ef779979dc38ee62586d7c5cf379 Text-content-length: 33 Text-content-md5: d5acb2dd3782a7d217d0784f8622cdd3 Text-content-sha1: 615d9f12b2ff2914b1733f132abd24e5c05d2804 Content-length: 73 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN& Revision-number: 3172 Prop-content-length: 195 Content-length: 195 K 8 svn:date V 27 2003-05-10T08:37:54.000000Z K 7 svn:log V 95 Should fix Debian bug #192674: another gcc complaint about potentially uninitialised variable. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ef85f1b2988e05ca20bfdd1da94030f0 Text-delta-base-sha1: 5fafc2eec741c7d4547b9b2fc9b35f8fdbedc134 Text-content-length: 50 Text-content-md5: 981c5d719ab10975ceaa249f3af93f91 Text-content-sha1: 13e02a905638de7baedce6735e7a57711e01c9f7 Content-length: 91 K 15 cvs2svn:cvs-rev V 5 1.156 PROPS-END SVNv m xkey = 0; Revision-number: 3173 Prop-content-length: 254 Content-length: 254 K 7 svn:log V 153 Stupid braino in get_window_title (thanks Colin): window and icon titles were being reported the wrong way round. Should fix half of Debian bug #191751. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-05-10T09:05:41.000000Z PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5915f15243243873bc58ef6acb5adbb9 Text-delta-base-sha1: d019c2f5a80e723be5633703de89818eddad44c6 Text-content-length: 44 Text-content-md5: 41271b60e11545c100796dd360a2f684 Text-content-sha1: 61d1beb4303671ad82f5b328be208dcdfd143ecd Content-length: 85 K 15 cvs2svn:cvs-rev V 5 1.131 PROPS-END SVNmm Xlicontitle : inst->wi Revision-number: 3174 Prop-content-length: 209 Content-length: 209 K 8 svn:date V 27 2003-05-10T09:06:00.000000Z K 7 svn:log V 108 pterm's manpage now documents the NoRemoteQTitle resource. Should fix the other half of Debian bug #191751. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9e688d37e3dd57215bce96287eb13d9e Text-delta-base-sha1: 9b8c0236c6e7475905cbc1494520960d5885e953 Text-content-length: 812 Text-content-md5: 423278b4155d7371e273e62d18c771ce Text-content-sha1: e6bc0bd403739be22e01e45dbcd2a28f90d9c3a9 Content-length: 852 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNI- 7E}$%RemoteQ1. When set to 1, it stops the server from remotely requesting the title of the \fIpterm\fP window. This feature is a \fBPOTENTIAL SECURITY HAZARD\fP. If a malicious application can write data to your terminal (for example, if you merely \fIcat\fP a file owned by someone else on the server machine), it can change your window title (unless you have disabled this using the \fBNoRemoteWinTitle\fP resource) and then use this service to have the new window title sent back to the server as if typed at the keyboard. This allows an attacker to fake keypresses and potentially cause your server-side applications to do things you didn't want. Therefore this feature is disabled by default, and we recommend you do not turn it on unless you \fBreally\fP know what you are doing Revision-number: 3175 Prop-content-length: 458 Content-length: 458 K 8 svn:date V 27 2003-05-10T10:15:00.000000Z K 7 svn:log V 357 pterm will now attempt to guess suitable names for any missing fonts from the ones given; so it'll ask for a font twice as wide as your base one if you don't specify a wide font, it'll ask for a bolded version of your base font if you don't specify a bold font, and similarly for a wide/bold font. Should solve Debian bug #187389; at least it works for me. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 41271b60e11545c100796dd360a2f684 Text-delta-base-sha1: 61d1beb4303671ad82f5b328be208dcdfd143ecd Text-content-length: 3167 Text-content-md5: 1c9aff2bbc5e00bc1220f459f490e583 Text-content-sha1: b2875663c8d6f8f31969698b89626e0c87229a6c Content-length: 3208 K 15 cvs2svn:cvs-rev V 5 1.132 PROPS-END SVNm\'*jBdn3i,D>"76char *guess_derived_font_name(GdkFont *font, int bold, int wide) {fontprop = XInternAtom(disp, "FONT", False); unsigned long ret; if (XGetFontProperty(xfs, fontprop, &ret)) { char *name = XGetAtomName(disp, (Atom)ret); if (name && name[0] == '-') { char *strings[13]; char *dupname, *extrafree = NULL, *ret; char *p, *q; int nstr; p = q = dupname = dupstr(name); /* skip initial minus */ nstr = 0; while (*p && nstr < lenof(strings)) { if (*p == '-') { *p = '\0'; strings[nstr++] = p+1; } p++; } if (nstr < lenof(strings)) return NULL; /* XLFD was malformed */ if (bold) strings[2] = "bold"; if (wide) { /* 4 is `wideness', which obviously may have changed. */ /* 5 is additional style, which may be e.g. `ja' or `ko'. */ strings[4] = strings[5] = "*"; strings[11] = extrafree = dupprintf("%d", 2*atoi(strings[11])); } ret = dupcat("-", strings[ 0], "-", strings[ 1], "-", strings[ 2], "-", strings[ 3], "-", strings[ 4], "-", strings[ 5], "-", strings[ 6], "-", strings[ 7], "-", strings[ 8], "-", strings[ 9], "-", strings[10], "-", strings[11], "-", strings[12], NULL); sfree(extrafree); sfree(dupname); return ret; } } return NULL; } void setup_fonts_ucs(struct gui_data *inst) { int font_charset; char *name; int guessed if (inst->cfg.boldfont.name[0]) { name = inst->cfg.boldfont.name; guessed = FALSE; } else { name = guess_derived_font_name(inst->fonts[0], TRUE, FALSE); guessed = TRUE; } inst->fonts[1] = name ? gdk_font_load(name) : NULL; if (inst->fonts[1]) { set_font_info(inst, 1); } else if (!guessed) { fprintf(stderr, "%s: unable to load bold font \"%s\"\n", appname, inst->cfg.boldfont.name); exit(1); } if (guessed) sfree(name); if (inst->cfg.widefont.name[0]) { name = inst->cfg.widefont.name; guessed = FALSE; } else { name = guess_derived_font_name(inst->fonts[0], FALSE, TRUE); guessed = TRUE; } inst->fonts[2] = name ? gdk_font_load(name) : NULL; if (inst->fonts[2]) { set_font_info(inst, 2); } else if (!guessed) { inst->cfg.widefont.name); exit(1); } if (guessed) sfree(name); if (inst->cfg.wideboldfont.name[0]) { name = inst->cfg.wideboldfont.name; guessed = FALSE; } else { /* * Here we have some choices. We can widen the bold font, * bolden the wide font, or widen and bolden the standard * font. Try them all, in that order! */ if (inst->cfg.widefont.name[0]) name = guess_derived_font_name(inst->fonts[2], TRUE, FALSE); else if (inst->cfg.boldfont.name[0]) name = guess_derived_font_name(inst->fonts[1], FALSE, TRUE); else name = guess_derived_font_name(inst->fonts[0], TRUE, TRUE); guessed = TRUE; } inst->fonts[3] = name ? gdk_font_load(name) : NULL; if (inst->fonts[3]) { set_font_info(inst, 3); } else if (!guessed) { fprintf(stderr, "%s: unable to load wide/bold font \"%s\"\n", appname, inst->cfg.wideboldfont.name); exit(1); } if (guessed) sfree(name) Revision-number: 3176 Prop-content-length: 192 Content-length: 192 K 8 svn:date V 27 2003-05-10T10:15:36.000000Z K 7 svn:log V 92 Remove the now incorrect `Unicode is not supported' from the bugs in the pterm man page :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 423278b4155d7371e273e62d18c771ce Text-delta-base-sha1: e6bc0bd403739be22e01e45dbcd2a28f90d9c3a9 Text-content-length: 18 Text-content-md5: a4a51ac0221930928626fdecedf6b0bf Text-content-sha1: 742f4a432e79fce347dfbb62509548c1d76462d7 Content-length: 58 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN-qq Revision-number: 3177 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2003-05-10T11:26:33.000000Z K 7 svn:log V 36 Comment a few things I need to fix. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b5673b2dfbc1b214424acfe01cad376 Text-delta-base-sha1: 1617670e32bf10f587a0f3112cae72a1402ec0e1 Text-content-length: 181 Text-content-md5: afa609fb0f403b8c81a6aa64dced241d Text-content-sha1: 6427ed4a5d9f8b5ecf8c6719ac15a18c67cc77e4 Content-length: 221 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN2-"7EX/* $Id: macctrls.c,v 1.40 2003/05/10 11:26:33/* XXX what if there's no selection? */ /* XXX Start with panel 1 active *//* XXX Use label */ Revision-number: 3178 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2003-05-10T11:40:18.000000Z K 7 svn:log V 66 Update signature of agent_query() to match the rest of the world. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dba3e49d24d90749de3e92605a77b26e Text-delta-base-sha1: 21c62f88277e57b380c9e089ada81a83ac180303 Text-content-length: 241 Text-content-md5: 1a73357e02b42ef1fde0003b26dda655 Text-content-sha1: 5e28df723c96ed2f074be68dc54b5622075d80db Content-length: 281 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN UTv(, /* $Id: mac.c,v 1.58 2003/05/10 11:40:18int agent_query(void *in, int inlen, void **out, int *outlen, void (*callback)(void *, void *, int), void *callback_ctx) { *out = NULL; *outlen = 0; return 1 Revision-number: 3179 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2003-05-10T11:50:18.000000Z K 7 svn:log V 54 Eliminate a "possible unintended assignment" warning. K 10 svn:author V 3 ben PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d5acb2dd3782a7d217d0784f8622cdd3 Text-delta-base-sha1: 615d9f12b2ff2914b1733f132abd24e5c05d2804 Text-content-length: 142 Text-content-md5: 508d70be462112d7e95fa809267ef14b Text-content-sha1: 9747c0cd9b4405f73c8ef0571314ee859422c567 Content-length: 182 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN?I uausL(sret = platform_new_connection(addr, hostname, port, privport, oobinline, nodelay, plug, cfg)) != NULL Revision-number: 3180 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2003-05-10T11:57:55.000000Z K 7 svn:log V 45 Extra const for loop_init() and null_init(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2a415c6db24ddedd67b4e07d4be1e595 Text-delta-base-sha1: deb3e03e76a5fd1bdc33515bd251cbfc1843cdc4 Text-content-length: 559 Text-content-md5: 4afc20fb3cfa0c6a61e7c9d599f6d5c5 Text-content-sha1: 08c62a476177a62b3c4b7598d0c16c5d5c003642 Content-length: 598 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNy{,)c491H/* $Id: testback.c,v 1.9 2003/05/10 11:57:55onst char *null_init(void *, void **, Config *, char *, int, char **, int); static const char *loop_init(void *, void **, Config *, char *, int, char **, onst char *null_init(void *frontend_handle, void **backend_handle, Config *cfg, char *host, int port, char **realhost, int nodelay) { return NULL; } static const char *loop_init(void *frontend_handle, void **backend_handle, Config *cfg, char *host, int port, char **realhost, Revision-number: 3181 Prop-content-length: 219 Content-length: 219 K 7 svn:log V 120 I believe that verify_ssh_host_key() should now be passed a real front-end handle, which removes one of its many flaws. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-05-10T12:27:38.000000Z PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1a73357e02b42ef1fde0003b26dda655 Text-delta-base-sha1: 5e28df723c96ed2f074be68dc54b5622075d80db Text-content-length: 171 Text-content-md5: 4e0ab7012f6b882c0c68d1d053c86795 Text-content-sha1: aa4f3763d0bffb26c3fd93859ca5cf23d0c1eaf5 Content-length: 211 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVNUhT' qPN?/* $Id: mac.c,v 1.59 2003/05/10 12:27:3Session *s = below * about closing the connection. All in all, a bit of a mess * Revision-number: 3182 Prop-content-length: 158 Content-length: 158 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-05-10T12:54:29.000000Z K 7 svn:log V 60 Make ssh_agent_callback() and ssh_agentf_callback() static. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cd7447c9c9b548919fbf538c438ef54e Text-delta-base-sha1: 96cd8f327df4f782a10f964859c63b55f74c7713 Text-content-length: 78 Text-content-md5: 1694d39d3fa79f1f3dc0a1591977d470 Text-content-sha1: f4bce315cb6d5c7e4a05eb83687d91e1114dc976 Content-length: 119 K 15 cvs2svn:cvs-rev V 5 1.294 PROPS-END SVN..0Bstatic static 1?1mote side is t Revision-number: 3183 Prop-content-length: 512 Content-length: 512 K 7 svn:log V 413 Change the way that panel-switching works so that we only hide the panel we're switching from and show the panel we're switching to, rather than iterating over all the panels, hiding and showing them as appropriate. This has that consequence that all controls have to be created invisible, since they no longer get hidden after creation. As usual, the scroll bars on list boxes have a special hack of their own. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-05-10T20:23:23.000000Z PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: afa609fb0f403b8c81a6aa64dced241d Text-delta-base-sha1: 6427ed4a5d9f8b5ecf8c6719ac15a18c67cc77e4 Text-content-length: 2110 Text-content-md5: 8a09236b580e602f550d76c7765cba7e Text-content-sha1: b8b5068881784f845a6695de619d9d1e5efab653 Content-length: 2150 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNp)2,!G a[c Fo283m)#nO<@4\6jY)^ :,panels[panel]; mc != NULL; mc = mc->generic.next) { #if !TARGET_API_MAC_CARBON if (mcs->focus == mc) macctrl_setfocus(mcs, NULL); #endif switch (mc->generic.type) { case MACCTRL_TEXT: hideshow(mc->text.tbctrl); break; case MACCTRL_EDITBOX: hideshow(mc->editbox.tbctrl); if (mc->editbox.tblabel != NULL) hideshow(mc->editbox.tblabel); break; case MACCTRL_RADIO: for (j = 0; j < mc->generic.ctrl->radio.nbuttons; j++) hideshow(mc->radio.tbctrls[j]); if (mc->radio.tblabel != NULL) hideshow(mc->radio.tblabel); break; case MACCTRL_CHECKBOX: hideshow(mc->checkbox.tbctrl); break; case MACCTRL_BUTTON: hideshow(mc->button.tbctrl); if (mc->button.tbring != NULL) hideshow(mc->button.tbring); break; case MACCTRL_LISTBOX: hideshow(mc->listbox.tbctrl); /* * At least under Mac OS 8.1, hiding a list box * doesn't hide its scroll bars. */ #if TARGET_API_MAC_CARBON hideshow(GetListVerticalScrollBar(mc->listbox.list)); #else hideshow((*mc->listbox.list)->vScroll); #endif break; case MACCTRL_POPUP: hideshow(mc->popup.tbctrl); break; } } } static void macctrl_switchtopanel(struct macctrls *mcs, unsigned int which) { macctrl_hideshowpanel(mcs, mcs->curpanel, FALSE); macctrl_hideshowpanel(mcs, which, TRUE); mcs->curpanel = which;FALSFALSFALSFALSFALSFALSFALSFALSFALSFALSFALSFALSFALSFALS#if TARGET_API_MAC_CARBON HideControl(GetListVerticalScrollBar(mc->listbox.list)); #else HideControl((*mc->listbox.list)->vScroll); #endifFALS Revision-number: 3184 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2003-05-10T20:51:39.000000Z K 7 svn:log V 26 Finally, column spanning. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8a09236b580e602f550d76c7765cba7e Text-delta-base-sha1: b8b5068881784f845a6695de619d9d1e5efab653 Text-content-length: 1179 Text-content-md5: 4983f2e974b82baacfc124af3783322c Text-content-sha1: 261e657467c819796dcae2fd1b5345ad4542675a Content-length: 1219 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVNpQr,-+Wha6 P/* $Id: macctrls.c,v 1.42 2003/05/10 20:51:39, colspan; struct mac_layoutstate cols[MAXCOLS], poscolspan = COLUMN_SPAN(ctrl->generic.column); if (ctrl->generic.type == CTRL_COLUMNS) {} else { pos = cols[colstart]; pos.width = cols[colstart + colspan - 1].width + (cols[colstart + colspan - 1].pos.h - cols[colstart].pos.h); for (j = colstart; j < colstart + colspan; j++) if (pos.pos.v < cols[j].pos.v) pos.pos.v = cols[j].pos.v; switch (ctrl->generic.type) { case CTRL_TEXT: macctrl_text(mcs, window, &pos, ctrl); break; case CTRL_EDITBOX: macctrl_editbox(mcs, window, &pos, ctrl); break; case CTRL_RADIO: macctrl_radio(mcs, window, &pos, ctrl); break; case CTRL_CHECKBOX: macctrl_checkbox(mcs, window, &pos, ctrl); break; case CTRL_BUTTON: macctrl_button(mcs, window, &pos, ctrl); break; case CTRL_LISTBOX: if (ctrl->listbox.height == 0) macctrl_popup(mcs, window, &pos, ctrl); else macctrl_listbox(mcs, window, &pos, ctrl); break; } for (j = colstart; j < colstart + colspan; j++) cols[j].pos.v = pos.pos.v Revision-number: 3185 Prop-content-length: 486 Content-length: 486 K 8 svn:date V 27 2003-05-11T12:28:53.000000Z K 7 svn:log V 385 I think I've just fixed Debian bug #166396. The +ut option was causing pty_utmp_helper_pipe to be closed, but its fd was kept around even when stale, and closed again when the main child process terminated - by which time the fd number had been reused for a rather more vital fd, which GTK didn't appreciate having closed under its feet. Hence, spin on POLLNVAL. Should now be sorted. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ebb9f84f13cafd6fa55a897d63e71811 Text-delta-base-sha1: e88f1974b295210be3ee3da617e683f17acec1e6 Text-content-length: 309 Text-content-md5: 5180774bd7bee79074f617f51aaa7413 Text-content-sha1: c7c5b64821a7895b1722d8794d3dd076bab0a54f Content-length: 349 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN;8 liW5y oL { close(pty_utmp_helper_pipe); /* just let the child process die */ pty_utmp_helper_pipe = -1; }pty_utmp_helper_pipe = -1;if (pty_utmp_helper_pipe >= 0) { close(pty_utmp_helper_pipe); /* this causes utmp to be cleaned up */ pty_utmp_helper_pipe = -1; } Revision-number: 3186 Prop-content-length: 221 Content-length: 221 K 8 svn:date V 27 2003-05-11T14:19:17.000000Z K 7 svn:log V 120 Some time ago I arranged for -geometry to be able to specify window position as well as size. Now reflected in manpage. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a4a51ac0221930928626fdecedf6b0bf Text-delta-base-sha1: 742f4a432e79fce347dfbb62509548c1d76462d7 Text-content-length: 179 Text-content-md5: 7d79fbd5492f1238bc0cba36548b466b Text-content-sha1: 732c99006cc325dd1eabcbe6605129a3e77e5ac7 Content-length: 219 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNqQ gRgeometry\fP" Specify the size of the terminal, in rows and columns of text. See \fIX(7)\fP for more information on the syntax of geometry specifications Revision-number: 3187 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2003-05-11T14:19:57.000000Z K 7 svn:log V 19 Missing full stop. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7d79fbd5492f1238bc0cba36548b466b Text-delta-base-sha1: 732c99006cc325dd1eabcbe6605129a3e77e5ac7 Text-content-length: 25 Text-content-md5: 89ccd658736a5de57a809dbbfe0f3b42 Text-content-sha1: e903f9929ce9d2aa49eb87858f0105f117c02e51 Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNQR *'*. Revision-number: 3188 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 40 Brief man pages for PuTTY and PuTTYtel. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-05-11T14:32:43.000000Z PROPS-END Node-path: putty/unix/putty.1 Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 7219 Text-content-md5: ffa980d30aef9f254be996da4f3f6242 Text-content-sha1: e69b3f6e8406a1cf81fcf17e281f8f723f4e13b2 Content-length: 7335 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN%%%.TH putty 1 .UC .SH NAME putty \- GUI SSH, Telnet and Rlogin client for X .SH SYNOPSIS \fBputty\fP [ \fIoptions\fP ] [ \fIhost\fP ] .SH DESCRIPTION \fIputty\fP is a graphical SSH, Telnet and Rlogin client for X. It is a direct port of the Windows SSH client of the same name. .SH OPTIONS The command-line options supported by \fIputty\fP are: .IP "\fB\-\-display\fP \fIdisplay\-name\fP" Specify the X display on which to open \fIputty\fP. (Note this option has a double minus sign, even though none of the others do. This is because this option is supplied automatically by GTK. Sorry.) .IP "\fB\-fn\fP \fIfont-name\fP" Specify the font to use for normal text displayed in the terminal. .IP "\fB\-fb\fP \fIfont-name\fP" Specify the font to use for bold text displayed in the terminal. If the \fIBoldAsColour\fP resource is set to 1 (the default), bold text will be displayed in different colours instead of a different font, so this option will be ignored. If \fIBoldAsColour\fP is set to 0 and you do not specify a bold font, \fIputty\fP will overprint the normal font to make it look bolder. .IP "\fB\-fw\fP \fIfont-name\fP" Specify the font to use for double-width characters (typically Chinese, Japanese and Korean text) displayed in the terminal. .IP "\fB\-fwb\fP \fIfont-name\fP" Specify the font to use for bold double-width characters (typically Chinese, Japanese and Korean text) Like \fI-fb\fP, this will be ignored unless the \fIBoldAsColour\fP resource is set to 0. .IP "\fB\-geometry\fP \fIgeometry\fP" Specify the size of the terminal, in rows and columns of text. See \fIX(7)\fP for more information on the syntax of geometry specifications. .IP "\fB\-sl\fP \fIlines\fP" Specify the number of lines of scrollback to save off the top of the terminal. .IP "\fB\-fg\fP \fIcolour\fP" Specify the foreground colour to use for normal text. .IP "\fB\-bg\fP \fIcolour\fP" Specify the background colour to use for normal text. .IP "\fB\-bfg\fP \fIcolour\fP" Specify the foreground colour to use for bold text, if the \fIBoldAsColour\fP resource is set to 1 (the default). .IP "\fB\-bbg\fP \fIcolour\fP" Specify the foreground colour to use for bold reverse-video text, if the \fIBoldAsColour\fP resource is set to 1 (the default). (This colour is best thought of as the bold version of the background colour; so it only appears when text is displayed \fIin\fP the background colour.) .IP "\fB\-cfg\fP \fIcolour\fP" Specify the foreground colour to use for text covered by the cursor. .IP "\fB\-cbg\fP \fIcolour\fP" Specify the background colour to use for text covered by the cursor. In other words, this is the main colour of the cursor. .IP "\fB\-title\fP \fItitle\fP" Specify the initial title of the terminal window. (This can be changed under control of the server.) .IP "\fB\-sb\-\fP or \fB+sb\fP" Tells \fIputty\fP not to display a scroll bar. .IP "\fB\-sb\fP" Tells \fIputty\fP to display a scroll bar: this is the opposite of \fI\-sb\-\fP. This is the default option: you will probably only need to specify it explicitly if you have changed the default using the \fIScrollBar\fP resource. .IP "\fB\-log\fP \fIfilename\fP" This option makes \fIputty\fP log all the terminal output to a file as well as displaying it in the terminal. .IP "\fB\-cs\fP \fIcharset\fP" This option specifies the character set in which \fIputty\fP should assume the session is operating. This character set will be used to interpret all the data received from the session, and all input you type or paste into \fIputty\fP will be converted into this character set before being sent to the session. Any character set name which is valid in a MIME header (and supported by \fIputty\fP) should be valid here (examples are "ISO-8859-1", "windows-1252" or "UTF-8"). Also, any character encoding which is valid in an X logical font description should be valid ("ibm-cp437", for example). \fIputty\fP's default behaviour is to use the same character encoding as its primary font. If you supply a Unicode (iso10646-1) font, it will default to the UTF-8 character set. Character set names are case-insensitive. .IP "\fB\-nethack\fP" Tells \fIputty\fP to enable NetHack keypad mode, in which the numeric keypad generates the NetHack "hjklyubn" direction keys. This enables you to play NetHack with the numeric keypad without having to use the NetHack "number_pad" option (which requires you to press "n" before any repeat count). So you can move with the numeric keypad, and enter repeat counts with the normal number keys. .IP "\fB\-help\fP, \fB\-\-help\fP" Display a message summarizing the available options. .IP "\fB\-load\fP \fIsession\fP" Load a saved session by name. This allows you to run a saved session straight from the command line without having to go through the configuration box first. .IP "\fB\-ssh\fP, \fB\-telnet\fP, \fB\-rlogin\fP, \fB\-raw\fP" Select the protocol \fIputty\fP will use to make the connection. .IP "\fB\-l\fP \fIusername\fP" Specify the username to use when logging in to the server. .IP "\fB\-L\fP [\fIsrcaddr\fP:]\fIsrcport\fP:\fIdesthost\fP:\fIdestport\fP" Set up a local port forwarding: listen on \fIsrcport\fP (or \fIsrcaddr\fP:\fIsrcport\fP if specified), and forward any connections over the SSH connection to the destination address \fIdesthost\fP:\fIdestport\fP. Only works in SSH. .IP "\fB\-R\fP [\fIsrcaddr\fP:]\fIsrcport\fP:\fIdesthost\fP:\fIdestport\fP" Set up a remote port forwarding: ask the SSH server to listen on \fIsrcport\fP (or \fIsrcaddr\fP:\fIsrcport\fP if specified), and to forward any connections back over the SSH connection where the client will pass them on to the destination address \fIdesthost\fP:\fIdestport\fP. Only works in SSH. .IP "\fB\-D\fP [\fIsrcaddr\fP:]\fIsrcport\fP" Set up dynamic port forwarding. The client listens on \fIsrcport\fP (or \fIsrcaddr\fP:\fIsrcport\fP if specified), and implements a SOCKS server. So you can point SOCKS-aware applications at this port and they will automatically use the SSH connection to tunnel all their connections. Only works in SSH. .IP "\fB\-P\fP \fIport\fP" Specify the port to connect to the server on. .IP "\fB\-A\fP, \fB\-a\fP" Enable (\fB\-A\fP) or disable (\fB\-a\fP) SSH agent forwarding. Currently this only works with OpenSSH and SSH1. .IP "\fB\-X\fP, \fB\-x\fP" Enable (\fB\-X\fP) or disable (\fB\-x\fP) X11 forwarding. .IP "\fB\-T\fP, \fB\-t\fP" Enable (\fB\-t\fP) or disable (\fB\-T\fP) the allocation of a pseudo-terminal at the server end. .IP "\fB\-C\fP, \fB\-t\fP" Enable zlib-style compression on the connection. .IP "\fB\-1\fP, \fB\-2\fP" Select SSH protocol v1 or v2. .IP "\fB\-i\fP \fIkeyfile\fP" Specify a private key file to use for authentication. For SSH2 keys, this key file must be in PuTTY's format, not OpenSSH's or anyone else's. .SH SAVED SESSIONS Saved sessions are stored in a \fI.putty/sessions\fP subdirectory in your home directory. .SH MORE INFORMATION For more information on PuTTY, it's probably best to go and look at the manual on the web page: \fBhttp://www.chiark.greenend.org.uk/~sgtatham/putty/\fP .SH BUGS This man page isn't terribly complete. It's not very helpful to require a PuTTY-format SSH2 key file when there isn't yet a Unix port of PuTTYgen. Node-path: putty/unix/puttytel.1 Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5527 Text-content-md5: 0bbbc147f5b2f39ce11faaea11089e40 Text-content-sha1: e44937facdeeb58c092cb716b775a6e1921ee01c Content-length: 5643 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN  .TH puttytel 1 .UC .SH NAME puttytel \- GUI Telnet and Rlogin client for X .SH SYNOPSIS \fBputtytel\fP [ \fIoptions\fP ] [ \fIhost\fP ] .SH DESCRIPTION \fIputtytel\fP is a graphical Telnet and Rlogin client for X. It is a direct port of the Windows Telnet and Rlogin client of the same name, and a cut-down cryptography-free version of PuTTY. .SH OPTIONS The command-line options supported by \fIputtytel\fP are: .IP "\fB\-\-display\fP \fIdisplay\-name\fP" Specify the X display on which to open \fIputtytel\fP. (Note this option has a double minus sign, even though none of the others do. This is because this option is supplied automatically by GTK. Sorry.) .IP "\fB\-fn\fP \fIfont-name\fP" Specify the font to use for normal text displayed in the terminal. .IP "\fB\-fb\fP \fIfont-name\fP" Specify the font to use for bold text displayed in the terminal. If the \fIBoldAsColour\fP resource is set to 1 (the default), bold text will be displayed in different colours instead of a different font, so this option will be ignored. If \fIBoldAsColour\fP is set to 0 and you do not specify a bold font, \fIputtytel\fP will overprint the normal font to make it look bolder. .IP "\fB\-fw\fP \fIfont-name\fP" Specify the font to use for double-width characters (typically Chinese, Japanese and Korean text) displayed in the terminal. .IP "\fB\-fwb\fP \fIfont-name\fP" Specify the font to use for bold double-width characters (typically Chinese, Japanese and Korean text) Like \fI-fb\fP, this will be ignored unless the \fIBoldAsColour\fP resource is set to 0. .IP "\fB\-geometry\fP \fIgeometry\fP" Specify the size of the terminal, in rows and columns of text. See \fIX(7)\fP for more information on the syntax of geometry specifications. .IP "\fB\-sl\fP \fIlines\fP" Specify the number of lines of scrollback to save off the top of the terminal. .IP "\fB\-fg\fP \fIcolour\fP" Specify the foreground colour to use for normal text. .IP "\fB\-bg\fP \fIcolour\fP" Specify the background colour to use for normal text. .IP "\fB\-bfg\fP \fIcolour\fP" Specify the foreground colour to use for bold text, if the \fIBoldAsColour\fP resource is set to 1 (the default). .IP "\fB\-bbg\fP \fIcolour\fP" Specify the foreground colour to use for bold reverse-video text, if the \fIBoldAsColour\fP resource is set to 1 (the default). (This colour is best thought of as the bold version of the background colour; so it only appears when text is displayed \fIin\fP the background colour.) .IP "\fB\-cfg\fP \fIcolour\fP" Specify the foreground colour to use for text covered by the cursor. .IP "\fB\-cbg\fP \fIcolour\fP" Specify the background colour to use for text covered by the cursor. In other words, this is the main colour of the cursor. .IP "\fB\-title\fP \fItitle\fP" Specify the initial title of the terminal window. (This can be changed under control of the server.) .IP "\fB\-sb\-\fP or \fB+sb\fP" Tells \fIputtytel\fP not to display a scroll bar. .IP "\fB\-sb\fP" Tells \fIputtytel\fP to display a scroll bar: this is the opposite of \fI\-sb\-\fP. This is the default option: you will probably only need to specify it explicitly if you have changed the default using the \fIScrollBar\fP resource. .IP "\fB\-log\fP \fIfilename\fP" This option makes \fIputtytel\fP log all the terminal output to a file as well as displaying it in the terminal. .IP "\fB\-cs\fP \fIcharset\fP" This option specifies the character set in which \fIputtytel\fP should assume the session is operating. This character set will be used to interpret all the data received from the session, and all input you type or paste into \fIputtytel\fP will be converted into this character set before being sent to the session. Any character set name which is valid in a MIME header (and supported by \fIputtytel\fP) should be valid here (examples are "ISO-8859-1", "windows-1252" or "UTF-8"). Also, any character encoding which is valid in an X logical font description should be valid ("ibm-cp437", for example). \fIputtytel\fP's default behaviour is to use the same character encoding as its primary font. If you supply a Unicode (iso10646-1) font, it will default to the UTF-8 character set. Character set names are case-insensitive. .IP "\fB\-nethack\fP" Tells \fIputtytel\fP to enable NetHack keypad mode, in which the numeric keypad generates the NetHack "hjklyubn" direction keys. This enables you to play NetHack with the numeric keypad without having to use the NetHack "number_pad" option (which requires you to press "n" before any repeat count). So you can move with the numeric keypad, and enter repeat counts with the normal number keys. .IP "\fB\-help\fP, \fB\-\-help\fP" Display a message summarizing the available options. .IP "\fB\-load\fP \fIsession\fP" Load a saved session by name. This allows you to run a saved session straight from the command line without having to go through the configuration box first. .IP "\fB\-telnet\fP, \fB\-rlogin\fP, \fB\-raw\fP" Select the protocol \fIputtytel\fP will use to make the connection. .IP "\fB\-l\fP \fIusername\fP" Specify the username to use when logging in to the server. .IP "\fB\-P\fP \fIport\fP" Specify the port to connect to the server on. .SH SAVED SESSIONS Saved sessions are stored in a \fI.putty/sessions\fP subdirectory in your home directory. .SH MORE INFORMATION For more information on PuTTY and PuTTYtel, it's probably best to go and look at the manual on the web page: \fBhttp://www.chiark.greenend.org.uk/~sgtatham/putty/\fP .SH BUGS This man page isn't terribly complete. Revision-number: 3189 Prop-content-length: 234 Content-length: 234 K 7 svn:log V 133 Patch from Rene Post: ctrl_{drag,drop}list both now initialise the same set of structure fields that the ordinary ctrl_listbox does. K 10 svn:author V 5 simon K 8 svn:date V 27 2003-05-12T13:41:41.000000Z PROPS-END Node-path: putty/dialog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7a30487d426c04250d68bc5092790602 Text-delta-base-sha1: 589844f4954d8c64a9abd69a701e044c6d4e48dd Text-content-length: 86 Text-content-md5: fddcf94bf9b081058edad94323138df3 Text-content-sha1: 95f02a273f0fa49075e0ad9f073ec811a8c54340 Content-length: 125 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNxr!(j`%@ L^%~zaglist(struct controlset *s,char *label, Revision-number: 3190 Prop-content-length: 409 Content-length: 409 K 8 svn:date V 27 2003-05-13T18:14:14.000000Z K 7 svn:log V 308 Debian bug #193013 points out that the (default-)one-pixel border is not redrawn when the window background colour is reconfigured mid- session. In addition, the Official Window Background is not reset, meaning that opaque resizes etc will flicker in the old background colour. This checkin should fix both. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1c9aff2bbc5e00bc1220f459f490e583 Text-delta-base-sha1: b2875663c8d6f8f31969698b89626e0c87229a6c Text-content-length: 539 Text-content-md5: 6d8450df1020aeef8f124a5ca27258f7 Text-content-sha1: 5ab9a92681171ca17fe1da5b8b695f644fbe434d Content-length: 580 K 15 cvs2svn:cvs-rev V 5 1.133 PROPS-END SVN\04YM 'EE+T6i4Bvoid draw_backing_rect(struct gui_data *inst) { GdkGC *draw_backing_rect(inst { /* * If the default background has changed, we must * repaint the space in between the window border * and the text area. */ if (i == 18) { set_window_background(inst); draw_backing_rect(inst); } } /* * We do an explicit full redraw here to ensure the window * border has been redrawn as well as the text area. */ gtk_widget_queue_draw(inst->area Revision-number: 3191 Prop-content-length: 436 Content-length: 436 K 7 svn:log V 335 Rename crc32() to crc32_compute(), to avoid clashing catastrophically with the crc32() function in the zlib interface. (Not that PuTTY itself _uses_ zlib, but on Unix it's linked against libgtk which uses libpng which uses zlib. And zlib has poor namespace management so it defines this ridiculously intrusive function name. Arrrrgh.) K 10 svn:author V 5 simon K 8 svn:date V 27 2003-05-13T18:23:43.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1694d39d3fa79f1f3dc0a1591977d470 Text-delta-base-sha1: f4bce315cb6d5c7e4a05eb83687d91e1114dc976 Text-content-length: 82 Text-content-md5: 67c138d4c41077d2ad8b1d321d4fcdd8 Text-content-sha1: f3c35ab6469bc51e303ac8fb86e128189921e37e Content-length: 123 K 15 cvs2svn:cvs-rev V 5 1.295 PROPS-END SVNCUCX_compute_compute?O?_OPEN) { /* Re Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 800298e4de87f4c4af96b6b1ff47f884 Text-delta-base-sha1: ce33c196b67d4d30176a5b337b8d56ed381c2177 Text-content-length: 29 Text-content-md5: 1f99a33ba86d9dda0f9ba06e975c52cc Text-content-sha1: 6cd46700f3789b723d088eea77a5dbb1fa863684 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVN  Z3Z_compute Node-path: putty/sshcrc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2ef783aa7df0d870ad628c9dccc723d6 Text-delta-base-sha1: bc892f655c3649a46704035099d2d67ca4b0a7e9 Text-content-length: 146 Text-content-md5: 42d1e3592b1fd4afc2341a449382fc3d Text-content-sha1: 27a571d0976de553dfe09c28371ed05ebc82c5b7 Content-length: 185 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN!9qHHa<IX_compute_compute(buf,len) it * will also generate void crc32_init(void) which sets up the * table_compute Revision-number: 3192 Prop-content-length: 409 Content-length: 409 K 8 svn:date V 27 2003-05-13T18:43:30.000000Z K 7 svn:log V 308 Allow pterm to receive selections in compound text format. Doesn't actually _understand_ compound text yet - anything with non-ASCII-or-8859-1 characters will fail miserably - but it will at least successfully receive plain text if the pasting application doesn't see fit to give it out in any other format. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6d8450df1020aeef8f124a5ca27258f7 Text-delta-base-sha1: 5ab9a92681171ca17fe1da5b8b695f644fbe434d Text-content-length: 254 Text-content-md5: 0f18fe6cbd6b19ce38cd63c930da741f Text-content-sha1: 598b1ead896d451c36f850793e5b371747064cb9 Content-length: 295 K 15 cvs2svn:cvs-rev V 5 1.134 PROPS-END SVN0kTzJ>,Dt!compound * text nextcompound_text_atom, GDK_CURRENT_TIME); return; } if (seldata->target == compound_text_atom && seldata->length <= 0) { /* * Failed to get UTF-8 or compound textcompound_text_atom Revision-number: 3193 Prop-content-length: 430 Content-length: 430 K 8 svn:date V 27 2003-05-13T19:57:17.000000Z K 7 svn:log V 329 Real COMPOUND_TEXT support! I was expecting to have to read the spec and implement the required subset of ISO-2022 in libcharset, but it turns out that Xlib provides conversion functions between UTF-8 and compound text, which are just about ideal for us. So now we can paste multilingual stuff both to and from emacs21. Rock on. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0f18fe6cbd6b19ce38cd63c930da741f Text-delta-base-sha1: 598b1ead896d451c36f850793e5b371747064cb9 Text-content-length: 2511 Text-content-md5: 46205a2a44f5fb91705ca10a272039ad Text-content-sha1: 58d0bd8c65df1655cc51a1a9bc38c48cfaf27adb Content-length: 2552 K 15 cvs2svn:cvs-rev V 5 1.135 PROPS-END SVNkjW JD$P|`aZn%h6t) }4|Z.pBgGL=dctext, *pasteout_data_utf8; int pasteout_data_len, pasteout_data_ctextctext) sfree(inst->pasteout_data_ctext); if (inst->pasteout_data_utf8) sfree(inst->pasteout_data_utf8); /* * Set up UTF-8 and compound text paste data. This only happens * if we aren't in XTextProperty tp; char *list[1] + 1, char); inst->pasteout_data_utf8[inst->pasteout_data_utf8_len] = '\0'; } /* * Now let Xlib convert our UTF-8 data into compound text. */ list[0] = inst->pasteout_data_utf8; if (Xutf8TextListToTextProperty(GDK_DISPLAY(), list, 1, XCompoundTextStyle, &tp) == 0) { inst->pasteout_data_ctext = snewn(tp.nitems+1, char); memcpy(inst->pasteout_data_ctext, tp.value, tp.nitems); inst->pasteout_data_ctext_len = tp.nitems; XFree(tp.value); } } else { inst->pasteout_data_utf8 = NULL; inst->pasteout_data_utf8_len = 0; inst->pasteout_data_ctext = NULL; inst->pasteout_data_ctextif (inst->pasteout_data_ctext) gtk_selection_add_target(inst->area, GDK_SELECTION_PRIMARY, if (seldata->target == compound_text_atom) gtk_selection_data_set(seldata, seldata->target, 8, inst->pasteout_data_ctext, inst->pasteout_data_ctextctext) sfree(inst->pasteout_data_ctextctext = NULL; inst->pasteout_data_ctext XTextProperty tp; char **list; char *text; int length, count, ret; int free_list_required = 0; int charset /* * Convert COMPOUND_TEXT into UTF-8. */ if (seldata->type == compound_text_atom) { tp.value = seldata->data; tp.encoding = (Atom) seldata->type; tp.format = seldata->format; tp.nitems = seldata->length; ret = Xutf8TextPropertyToTextList(GDK_DISPLAY(), &tp, &list, &count); if (ret != 0 || count != 1) { /* * Compound text failed; fall back to STRING. */ gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, GDK_CURRENT_TIME); return; } text = list[0]; length = strlen(list[0]); charset = CS_UTF8; free_list_required = 1; } else { text = (char *)seldata->data; length = seldata->length; charset = (seldata->type == utf8_string_atom ? CS_UTF8 : inst->ucsdata.line_codepage); }length, wchar_t); inst->pastein_data_len = length; inst->pastein_data_len = mb_to_wc(charset, 0, text, if (free_list_required) XFreeStringList(list); } gint idle_paste Revision-number: 3194 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:26.604759Z PROPS-END Revision-number: 3195 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2003-05-14T12:31:57.000000Z K 7 svn:log V 60 New mirrors: putty.datagrupo.com.br and putty.mybsd.org.my. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ca967af39c232023fcce7056baf08bb2 Text-delta-base-sha1: 4be2a66d1083c81284b601c3c3e50a2a494b4cd8 Text-content-length: 105 Text-content-md5: 824170bae43fd29e1b02edc09cef84c4 Text-content-sha1: 7e0604e5aff61f8613a4ef86afb130cc2081c104 Content-length: 145 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN.NT iEdatagrupo.com.br">putty.datagrupo.com.br mybsd.org.my/">putty.mybsd.org.my Revision-number: 3196 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2003-05-14T18:53:28.000000Z K 7 svn:log V 81 Rene Post's other patch: PuTTYgen was generating double file dialogs by mistake. K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 81a085f610f4e10d4363d03181a5e883 Text-delta-base-sha1: ce6804af388a4da96c2f88de5337ef34e5c7808b Text-content-length: 175 Text-content-md5: 47b45adb69b65253af86ec47618eb420 Text-content-sha1: cdb6831b7bf3e993e709e97623129843bde0369f Content-length: 215 K 15 cvs2svn:cvs-rev V 4 1.54 PROPS-END SVN$~xT=FT=(F=if (HIWORD(wParam) != BN_CLICKED) break;if (HIWORD(wParam) != BN_CLICKED) break;if (HIWORD(wParam) != BN_CLICKED) break; Revision-number: 3197 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:26.712790Z PROPS-END Revision-number: 3198 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:26.722316Z PROPS-END Revision-number: 3199 Prop-content-length: 320 Content-length: 320 K 7 svn:log V 221 The "latest news" was over a year old, which was starting to get silly, and was causing occasional people to think the project was dead. Remove it. The same sentiment is expressed at the top of the Feedback page anyway. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-05-20T22:05:57.000000Z PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ebdc7c8036b8072978c4eb304ee85b9c Text-delta-base-sha1: ca7859b671acd0b049911148b9b38b1a8e6015ec Text-content-length: 20 Text-content-md5: 77344a1f1e260a335c43041b63ffe986 Text-content-sha1: 117f21d000bd574fe26407c7e6c9fb829b19d01e Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN8 N@x Revision-number: 3200 Prop-content-length: 208 Content-length: 208 K 8 svn:date V 27 2003-05-22T08:43:50.000000Z K 7 svn:log V 107 Update a couple of bits of the FAQ. We do now default to SSH2, and we do have a Unix port of PuTTY proper. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: af1371c1fab46544cd1130df63bf0a40 Text-delta-base-sha1: 38f48be107c343cfa4dca0ebd8d592f3d98ac26f Text-content-length: 192 Text-content-md5: e64e80634f54b57d641d3a7777835942 Text-content-sha1: c0c38df24544a0a8b7915f9c5a5db43999168887 Content-length: 232 K 15 cvs2svn:cvs-rev V 4 1.47 PROPS-END SVNz )67'frC(R\versionid $Id: faq.but,v 1.47 2003/05/22 08:43:50 simoUnix ports of Plink, PuTTY itself We do not yet have Unix ports of PSCP, PSFTP, Pageant or PuTTYgen. Revision-number: 3201 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2003-05-23T21:29:11.000000Z K 7 svn:log V 98 Link to Benjamin Schweizer's funkier wconsd. Message-ID: <000501c31d52$e66999f0$4000a8c0@tripper> K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5ef6a0f0e4bb81395266da7d40f6106c Text-delta-base-sha1: a36e7b2cece9db77b85a17803393a362e39ac890 Text-content-length: 165 Text-content-md5: 9fd5decadec50b32a408762c104fc839 Text-content-sha1: 1f8caff22a01c1817c5222f900d3044aff4e2ea6 Content-length: 204 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNhzh(Or someone's suggested a patched version that's funkier in some way.) Revision-number: 3202 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2003-05-24T10:17:23.000000Z K 7 svn:log V 79 Mention patch in Debian BTS Message-ID: <20030524064555.GB24323@riva.ucam.org> K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/bold-font-colour Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 28e333f3e3c6731a5348a5dc48561aec Text-delta-base-sha1: 4728108caaf5a80ba593f59f7f8210f724eac808 Text-content-length: 115 Text-content-md5: 9dc39c43d740823cd045a042a0ed7aa5 Text-content-sha1: 85223168fba94c1c0c3fcc72dd87ad5176e51c5b Content-length: 154 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNJ,bJb

    Patch (unreviewed, incomplete): Debian bug 193352 Revision-number: 3203 Prop-content-length: 256 Content-length: 256 K 8 svn:date V 27 2003-05-24T10:37:13.000000Z K 7 svn:log V 155 Couple of new mirrors. One of the .my mirrors was dead, and there's enough evidence that it was run by the same people as the new one, so I've removed it. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 824170bae43fd29e1b02edc09cef84c4 Text-delta-base-sha1: 7e0604e5aff61f8613a4ef86afb130cc2081c104 Text-content-length: 213 Text-content-md5: 7bf32fb4f0205cbb0c816000ef403fd5 Text-content-sha1: 9ec0fd17f3f2cc9d8a7335c21682de958c5e53bb Content-length: 253 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN '"!Q<HUyA1>A(omybsd.org.my/">putty.mybsd.org.mystuwww.uvt.nl/putty/">stuwww.uvtwww.soa.co.nz/putty/">www.soa.co.nz in New Zealandgaesi.org/">putty.gaesi.org in Portugal Revision-number: 3204 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2003-05-24T10:39:41.000000Z K 7 svn:log V 14 Mention patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/meta-bit Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c07af42e4f5e1bdbd3a17d2609e03b8d Text-delta-base-sha1: 329b9bb6594c24b1e31a2704adb9152b2a69f350 Text-content-length: 90 Text-content-md5: be801356496992c461f6802c82ee17ed Text-content-sha1: d92918b11d54fbf4c61147fc865b30f365b826c5 Content-length: 129 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNK FF

    Another patch (unreviewed): 3EC11D82.60306@isometry.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 508d70be462112d7e95fa809267ef14b Text-delta-base-sha1: 9747c0cd9b4405f73c8ef0571314ee859422c567 Text-content-length: 112 Text-content-md5: 218d7c92221db7a3da3cc3861c6a433c Text-content-sha1: 540013858a8c49e20c1c3bdbc9c867d73dda2c67 Content-length: 152 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNIYSwEJnicmp(hostip, exclude_list + s, e - if (strnicmp(hostname, exclude_list + s, e - Revision-number: 3206 Prop-content-length: 261 Content-length: 261 K 8 svn:date V 27 2003-05-24T11:19:07.000000Z K 7 svn:log V 160 It seems like a reasonable idea to link to the Debian package / bug report pages (rather than necessarily create a proxy for every Debian bug in the wishlist). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 81d566a43db5b28f43da6d2231480979 Text-delta-base-sha1: e9e5532a8a0eb10e8ab54f4bb005614ff0461047 Text-content-length: 291 Text-content-md5: 257ad62046b87e5ee4777da40d87f324 Text-content-sha1: 27579ce518c35ccda088a43cb3658a68423f4b6d Content-length: 331 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNg8 r The Debian bug-tracking system also accrues bug reports and feature requests relating to the experimental Debian package of the nascent Unix port Revision-number: 3207 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2003-05-24T11:48:26.000000Z K 7 svn:log V 14 Mention patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pterm-timer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 98088fcaf6b5eb5b2e27fce723c1661e Text-delta-base-sha1: cbbd34b43acc599b3886241eae63c65cb4b1ab42 Text-content-length: 86 Text-content-md5: a4b9f3c3ce37bfbe83ace733ea13e65c Text-content-sha1: 8baca39f2ae00034ef8bb0635d144ee1c982eff0 Content-length: 125 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVND EDE Patch (unreviewed): Pine.LNX.4.53mb.0304291625260.25393@ask.diku.dk Revision-number: 3208 Prop-content-length: 389 Content-length: 389 K 8 svn:date V 27 2003-05-24T12:31:32.000000Z K 7 svn:log V 288 Modified form of Jim Lucas's PC speaker patch. I don't like discriminating on the Windows version in order to decide whether to call MessageBeep(-1) or Beep() - I'd prefer to directly test the specific OS property in any given case - but it looks as if this is the best available option. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8b84b1c313c0b652d0ec148ce23b5bb4 Text-delta-base-sha1: 5cdc783596095b57c1485166676c51efb913a4c5 Text-content-length: 40 Text-content-md5: 1addb6fc51f8d964b2c626996e475eab Text-content-sha1: dd9e500d855e9fd95fd0b0cad56aaa83b4e99720 Content-length: 81 K 15 cvs2svn:cvs-rev V 5 1.220 PROPS-END SVN' /h/, BELL_PCSPEAKER Node-path: putty/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 65ae79afaec93437d420e47d9d2953a2 Text-delta-base-sha1: 50ed637b2bcc210c87e803a6eb0c906289ede97d Text-content-length: 493 Text-content-md5: 225262fe3805ef79582f6b2531881f52 Text-content-sha1: 1535c59374646373c2b41303ea6f44622e0f8040 Content-length: 532 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNof&;8P5x`9T2C b, and * also the use of the PC speaker. For this we must search the * existing controlset for the radio-button set controlling the * `beep' option, and add extra buttons += 21] = dupstr("Play a custom sound file"); c->radio.buttons[c->radio.nbuttons-2] = dupstr("Beep using the PC speaker1] = I(BELL_WAVEFILE); c->radio.buttondata[c->radio.nbuttons-2] = I(BELL_PCSPEAKER c->radio.shortcuts[c->radio.nbuttons-2 Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8cfbf00c676594504ef0631d16be399e Text-delta-base-sha1: a4665bbd628193a6faa78554ed4dd97f8d27be3e Text-content-length: 319 Text-content-md5: b4732e4d5de7c44a69f7fe6a6e752f16 Text-content-sha1: 0b83f95807df63a1118c0dd877e2f86c9019ea6c Content-length: 360 K 15 cvs2svn:cvs-rev V 5 1.247 PROPS-END SVN"=I:l_C else if (mode == BELL_PCSPEAKER) { /* * We must beep in different ways depending on whether this * is a 95-series or NT-series OS. */ if(osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) Beep(800, 100); else MessageBeep(-1); lastbeep = GetTickCount(); Revision-number: 3209 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2003-05-24T12:34:57.000000Z K 7 svn:log V 14 Mention patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-generality Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 591ca1007b0129788d5991b4a2e6ea5e Text-delta-base-sha1: 6c908d10f5dd8320ffa0ae9b16833748244c849d Text-content-length: 101 Text-content-md5: 9afa6714a3dd340b9bbdd695dfc3c074 Text-content-sha1: 621beaadef0a80a2837df73c5237cb4a1e531358 Content-length: 140 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN; O"O!

    • Patch (unreviewed): 3E9DBAE6.6030703@acero.com
    Revision-number: 3210 Prop-content-length: 115 Content-length: 115 K 7 svn:log V 15 Mention patch. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-05-24T12:49:38.000000Z PROPS-END Node-path: putty-wishlist/data/pscp-restart Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8f043b8dd8a3364847241f5f7773b0f6 Text-delta-base-sha1: db5ece3900a805dcf4581e2ba7ea0e70424bae90 Text-content-length: 223 Text-content-md5: 2c3666bcde010219f1cc10579772f641 Text-content-sha1: 392f860331593f96fdba83a2952263cb024b4178 Content-length: 262 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNw4Bd2j\/x-html-body

    Patch (unreviewed): PTPGCKH2Y6YUBAP05524Y1Y4YUQ97.3e567e18@eddy (also at gazonk.org) Revision-number: 3211 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2003-05-24T13:22:17.000000Z K 7 svn:log V 23 Lithuania: hardcore.lt K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7bf32fb4f0205cbb0c816000ef403fd5 Text-delta-base-sha1: 9ec0fd17f3f2cc9d8a7335c21682de958c5e53bb Text-content-length: 73 Text-content-md5: 70baad5c94803e0602b80977639bb1c7 Text-content-sha1: 195ba7860e3a80cb6dcfab1d80df00c8a18e371f Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN w0Ak!hardcore.lt/putty/">hardcore.lt in Lithuania Revision-number: 3212 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 60 I think we can reasonably remove items fixed this long ago. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-05-24T15:32:24.000000Z PROPS-END Node-path: putty-wishlist/data/blinkrate Node-action: delete Revision-number: 3213 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2003-05-24T15:38:48.000000Z K 7 svn:log V 186 -rw-r--r-- 1 jacob jacob 1734 Mar 10 22:45 proxy-command Summary: Proxying through arbitrary command (e.g. another SSH session) (this one's been sitting around for a while) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy-command Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1748 Text-content-md5: 9040faa81da9e064e1db0cc0076aff36 Text-content-sha1: 5b266ed1981acd3fb2b727e0053cc66f036b24c1 Content-length: 1864 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNFFFSummary: Proxying through arbitrary command (e.g. another SSH session) Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body

    We occasionally get asked to implement use of arbitrary commands as proxy-like transports, similar to the ProxyCommand feature of OpenSSH.

    We also get requests to use an SSH server as a `proxy'. These should probably be considered an instance of the general case. Treating SSH as just another proxy type like HTTP etc isn't feasible - we have pages of configuration UI for the `main' session, and all this would need to be configurable for the `proxy' session too. In the current model all this would have to be crammed in or under the Proxy panel somehow. With a ProxyCommand feature you could use Plink as a transport and configure it as usual.

    It's less obvious how a ProxyCommand-type feature should be configured on Windows than on Unix, as Windows is much less command-oriented (where OpenSSH usually runs).

    A partial solution is to set up a local (e.g.) SOCKS server which will run whatever bizarre command you need. You can then use PuTTY's existing proxy facilities. I don't know whether there is a convenient product that provides a SOCKS front end and runs arbitrary commands at the back end, but there clearly should be. This does of course require that your SOCKS server has been started up in the first place, but since (if sufficiently clever) it can defer doing anything tricky until it's needed, that needn't be an onerous requirement.

    If `portfwd-dynamic' were to be implemented, this approach would assist those people who need to use an SSH server as a proxy. Revision-number: 3214 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2003-05-24T15:43:35.000000Z K 7 svn:log V 93 - implemented on Unix - portfwd-dynamic is implemented - add Simon's comments on Win95/98 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy-command Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9040faa81da9e064e1db0cc0076aff36 Text-delta-base-sha1: 5b266ed1981acd3fb2b727e0053cc66f036b24c1 Text-content-length: 292 Text-content-md5: 52eec787f107c5315db2aba0e4f27082 Text-content-sha1: 073eb30ade34e33595ab7fb60e883874b6745ab5 Content-length: 331 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNF}~d'}Rtg Also, implementation in a manner compatible with Win95/98 (which lack useful pipes) might be trickyWith `portfwd-dynamic',

    Update: as of 2003 May 6 the Unix port supports this. The Windows version doesn't (yet). Revision-number: 3215 Prop-content-length: 271 Content-length: 271 K 7 svn:log V 170 Fixed accelerator clash between "Conversions" menu and "key comment" control (former is now "Con&versions"). Add shortcut to key fingerprint for ease of copy-and-paste. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-05-24T18:02:49.000000Z PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 47b45adb69b65253af86ec47618eb420 Text-delta-base-sha1: cdb6831b7bf3e993e709e97623129843bde0369f Text-content-length: 38 Text-content-md5: dc2cb529ae834921ca6105bbb06ef4fe Text-content-sha1: 51cc1c3e95ef51581ec54d6746121b52e44558f0 Content-length: 78 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN2KHCon&& Revision-number: 3216 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2003-05-24T18:03:29.000000Z K 7 svn:log V 25 Fixed accelerator clash. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/puttygen-accel-bogosity Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c3a10d29e98eb902797170d2cca3c2f1 Text-delta-base-sha1: d344a5258082ba29315fa07515e441b65713c75d Text-content-length: 161 Text-content-md5: 65e3e25dce1eb74e0828e7a6e86bbea2 Text-content-sha1: 2649ebc8065c7b81e22dc7a5501ced1c2df537dc Content-length: 200 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN^c$c$yX 2003-05-24

    • Fixed the clash for the 2003-05-25 snapshot. Non-intuitive shortcut behaviour pre-generation remains.
    Revision-number: 3217 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2003-05-24T18:19:46.000000Z K 7 svn:log V 96 Summary: Keystrokes are doubled if "Change Settings" is open Spotted by Owen, reproduced by me. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/double-keystrokes Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 442 Text-content-md5: d3ca4d194ef1fc04d79ec4df13fc39d4 Text-content-sha1: 84ffb0278f67819d04447aa5e7de565e67868193 Content-length: 558 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN,,,Summary: Keystrokes are doubled if "Change Settings" is open Class: bug Absent-in: 0.53b 2003-05-05 Present-in: 2003-05-06 2003-04-24 2003-05-24 Priority: medium If you bring up Change Settings mid-session and type in its parent window, your keystrokes are mysteriously doubled. In 2003-05-05 and before, Change Settings was modal, so this situation could not occur. This appears to be a side effect of the config box revamp. Revision-number: 3218 Prop-content-length: 197 Content-length: 197 K 7 svn:log V 97 URL wart to stop Exploder 6 on Windows trying to interpret README.mac as a MacPaint image *grrs* K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-05-24T18:33:16.000000Z PROPS-END Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2f53bb4a7425de2d07ff83ef9c038bb5 Text-delta-base-sha1: bfdf60d4e33c376224ceeefa860df660213bacdc Text-content-length: 57 Text-content-md5: a2675e4c7a6cfe0c5f41fb476c925eef Text-content-sha1: f099940064a9506708ef877b25353f79908a34f9 Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN7 %MEM&content-type=text/vnd.viewcvs-markup Revision-number: 3219 Prop-content-length: 268 Content-length: 268 K 8 svn:date V 27 2003-05-24T19:03:34.000000Z K 7 svn:log V 167 Add exceptions for "VShell" to the ssh.com bug compatibility modes (which are just numbers) in an attempt to fix `vshell-no-bug-compat'. Not even tested a little bit. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 67c138d4c41077d2ad8b1d321d4fcdd8 Text-delta-base-sha1: f3c35ab6469bc51e303ac8fb86e128189921e37e Text-content-length: 167 Text-content-md5: 2f6c6468cb983cc2392e91367521378e Text-content-sha1: a368a87b20a2fbb93e526caee069e948846db61d Content-length: 208 K 15 cvs2svn:cvs-rev V 5 1.296 PROPS-END SVN4XRpP!wc_match("* VShell", imp)!wc_match("* VShell", imp)O@@Ot"); crStopV; } else if (ssh->pktin.type == SSH1_SMSG_X11 Revision-number: 3220 Prop-content-length: 204 Content-length: 204 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-05-24T19:08:24.000000Z K 7 svn:log V 103 I've committed an intended fix, although I haven't tested it against either ssh.com or VShell servers. PROPS-END Node-path: putty-wishlist/data/vshell-no-bug-compat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 76d5f621a78a3141d873f1ffe0d784f5 Text-delta-base-sha1: 62c1e6cce55f9002201c4ab46259b8682b9d7cd2 Text-content-length: 165 Text-content-md5: f4c2540cf3105769a6d74aa79cb896d5 Text-content-sha1: cd89815ed6a7fb542170ad870802d125040a28b9 Content-length: 204 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNK[ p\o{Fixed-in: 2003-05-25

    Update: an exception has been added to the bug compatibility modes for VShell, although I haven't tested it. Revision-number: 3221 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2003-05-24T19:15:16.000000Z K 7 svn:log V 20 DUTR #29 -> UAX #29 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unicode-select Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b92032dc6415bf28a224544fd8e3d0f0 Text-delta-base-sha1: a3caee0c38a8032697e3945e18c98bf2e56e82db Text-content-length: 23 Text-content-md5: 6d49b64f004179bbca53d274499a40f3 Text-content-sha1: f570b78c22d0fe1a051ff7bbaf396e52cd98b16e Content-length: 62 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNXW hllUAX Revision-number: 3222 Prop-content-length: 798 Content-length: 798 K 8 svn:date V 27 2003-05-27T09:43:14.000000Z K 7 svn:log V 697 Experimental change in the behaviour of `disable alternate terminal screen'. Now it also disables the save-and-restore-cursor behaviour of ESC[?1048h and ESC[?1049h, since these sequences seem to be output by software trying to switch to the alternate screen, and it looks very odd to have the cursor position restored to where it was before `less' when the garbage `less' wrote all over the screen is still around. The `traditional' ESC 7 and ESC 8 still function as normal, on the basis that they aren't usually used in conjunction with the alternate screen. I'm not sure whether this will be the right decision; I'm prepared to change it back if a sufficiently serious counterexample shows up. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 981c5d719ab10975ceaa249f3af93f91 Text-delta-base-sha1: 13e02a905638de7baedce6735e7a57711e01c9f7 Text-content-length: 296 Text-content-md5: 18e2218ff32f5a1a2930457d9544a44c Text-content-sha1: 5b2dbd843d3ad5e50a2e043225782cfa5bd79078 Content-length: 337 K 15 cvs2svn:cvs-rev V 5 1.157 PROPS-END SVNv'rNvg-+oif (!term->cfg.no_alt_screen) && !term->cfg.no_alt_screen) TRUE, FALSE); if (!state && !term->cfg.no_alt_screenfffop.y); pos nlpos; /* * nlpos will point at the maximum position on this line we * should copy u Revision-number: 3223 Prop-content-length: 110 Content-length: 110 K 8 svn:date V 27 2003-05-27T21:25:19.000000Z K 7 svn:log V 10 duplo.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 70baad5c94803e0602b80977639bb1c7 Text-delta-base-sha1: 195ba7860e3a80cb6dcfab1d80df00c8a18e371f Text-content-length: 48 Text-content-md5: 96cde5b67b6e662d67e56fd4c1d0edf9 Text-content-sha1: aadff522a701db6b792b7a7554bc0aea7b62b004 Content-length: 88 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNw[ ,Kduplo.org/putty/">duplo.org Revision-number: 3224 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2003-05-28T12:29:18.000000Z K 7 svn:log V 184 Summary: Send keyboard input to multiple active sessions Priority: never Message-Id: Message-ID: K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/terminal-fanout Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2594 Text-content-md5: 883011849369ee2a86f4771e012d399f Text-content-sha1: 82842bb10a908ddd8c5cef5cecefcabfe72e3330 Content-length: 2710 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Send keyboard input to multiple active sessions Class: wish Difficulty: tricky Priority: never Content-type: text/x-html-body

    A few people have asked us to implement a feature where multiple sessions simultaneously take input from the keyboard. (Perhaps with a separate window for input to all sessions, allowing input to individual sessions too.) The usual reason cited is the need to administer multiple similar systems (e.g., clusters).

    (Apparently `Sun Cluster' implements something like this in `ctelnet/estelnet').

    We think that this is (a) a niche feature not worth taking up space in everyone's PuTTY binaries for, and (b) better done by a separate application. Outlined below is a design for a Windows application which would do the job:

    If I'm the sort of user who wants to type the same text into multiple windows, there's no real reason I might not want to type the same text into a collection of windows that I already had on the screen, or had not happened to start up from the same PuTTY command line. Ideally I'd like to select any set of my existing windows and type the same text into all of those. In fact, they probably wouldn't all want to be PuTTYs - I can see clear uses for being able to select a bunch of PuTTYs and a Notepad, so I can keep a log of what I typed in a text file.

    What I'm driving at is that I think this could be a useful piece of functionality, but really it belongs in a separate input-duplicating application which is independent of PuTTY. The way I see this working is:

    • you'd start up this application, and it would contain (say) a list box which listed the windows it was currently targetting.
    • there would also be an `Add Window' button; you'd press this, then select another top-level window (a PuTTY, or something else), and the title of that window would appear in the list.
    • there'd be an actual input box, which you could select and then type text. Any text you typed into the input box would be sent to all the windows shown in the list.
    • when a targetted application closed, the duplicator would notice and its title bar would vanish from the list.

    I think this application, as I've outlined it, would be far more flexible and useful than putting the functionality directly into PuTTY. Unfortunately, I don't think I've got the time to write it.

    There are apparently Unix utilities called fanout and fanterm which implement this style of thing. Revision-number: 3225 Prop-content-length: 150 Content-length: 150 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-05-29T10:41:36.000000Z K 7 svn:log V 50 Simon's now checked in an implementation of this. PROPS-END Node-path: putty-wishlist/data/pc-speaker Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a4a679bbcd5697603a51604d7ae22d09 Text-delta-base-sha1: be717f7b8ecd77e905cc79dc8e6a2ed1985c0983 Text-content-length: 142 Text-content-md5: 4f00e26e48fc679ee5384cf450219332 Text-content-sha1: 4ea9744990f6d0560a549056ed1f9abf8d3dd990 Content-length: 181 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNRL ySReFixed-in: 2003-05-25 Implemented in 2003-05-25, using a grotty Windows-version-detection hack. Tested on at least Win2K. Revision-number: 3226 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2003-05-29T11:09:02.000000Z K 7 svn:log V 23 Happy Birthday To You! K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 77344a1f1e260a335c43041b63ffe986 Text-delta-base-sha1: 117f21d000bd574fe26407c7e6c9fb829b19d01e Text-content-length: 298 Text-content-md5: b79d02bbd563a7928ac838c497cfa0a2 Text-content-sha1: 1c90db2930c03c7165dffe5431c5e31d0e6bd55a Content-length: 337 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN& NFHLatest news

    2003-05-29 Happy Birthday

    Exactly five years ago today, PuTTY made its first ever successful SSH connection. Thanks to all the people who have contributed time, effort, ideas, code, mirror space, money, beer and anything else to the project! Revision-number: 3227 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.213412Z PROPS-END Revision-number: 3228 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.223139Z PROPS-END Revision-number: 3229 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.231166Z PROPS-END Revision-number: 3230 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.240063Z PROPS-END Revision-number: 3231 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.248018Z PROPS-END Revision-number: 3232 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.257067Z PROPS-END Revision-number: 3233 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.673539Z PROPS-END Revision-number: 3234 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.689635Z PROPS-END Revision-number: 3235 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.699194Z PROPS-END Revision-number: 3236 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2003-06-02T10:40:20.000000Z K 7 svn:log V 92 Mention ClearType/XP's contribution. Also that the solution is rather harder than it looks. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/font-overflow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7368d6961fa59424005e95d1a1da4b52 Text-delta-base-sha1: 8569361b7e8d8a035b219684b670a7b970e581e2 Text-content-length: 228 Text-content-md5: 5af69fc71c83d5534f7c5cadc10bc723 Text-content-sha1: d3d381020e335f8121ba0ee0ed3fd6f08f905464 Content-length: 267 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNTJAJ@ This seems to be particularly common when using ClearType in Windows XP Unfortunately, implementing this is likely to involve substantial changes to the way PuTTY stores the contents of the screen. Revision-number: 3237 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2003-06-03T19:15:40.000000Z K 7 svn:log V 19 putty.servicez.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 96cde5b67b6e662d67e56fd4c1d0edf9 Text-delta-base-sha1: aadff522a701db6b792b7a7554bc0aea7b62b004 Text-content-length: 64 Text-content-md5: bd3db8a498c6693ab919f8398f83c9c8 Text-content-sha1: a54c55f014aa1295375b1f2a9f00c958ec2a34eb Content-length: 104 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN[T';R{ ;putty.servicez.org/">putty.servicez.org Revision-number: 3238 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.784852Z PROPS-END Revision-number: 3239 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2003-06-04T19:33:13.000000Z K 7 svn:log V 17 putty.edpnet.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd3db8a498c6693ab919f8398f83c9c8 Text-delta-base-sha1: a54c55f014aa1295375b1f2a9f00c958ec2a34eb Text-content-length: 70 Text-content-md5: 71071cc9fb030885ba86410bd49a66ec Text-content-sha1: f7e69c7b60ec63fc6eeff9770d5f4ae5b68a3d04 Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNTA-T@T.edpnet.net/">putty.edpnet.net in Belgium Revision-number: 3240 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2003-06-04T22:52:04.000000Z K 7 svn:log V 78 Summary: "unexpected packet type 91" with tunnel open during connection setup K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-at-start Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 4732 Text-content-md5: 255802bd0943b09f3e2fa4cfdde1ba2a Text-content-sha1: 52c60707b5167a1718524bc89a3f32edb7fc8d51 Content-length: 4848 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNnnnSummary: "unexpected packet type 91" with tunnel open during connection setup Class: bug Present-in: 0.53b 2003-06-04 Report of message "Unexpected response to shell/command request: packet type 91" - seems to be correlated with seeing "Opening forwarded connection" before "Allocated pty" in Event log. Sounds to me like the connection setup code is insufficiently able to cope with asynchrony. ref <28ssdvsa2meifm4mnriadpcffs2ahuul73@smtp.image.dk> and prior in thread. Excerpts from bug reports: ---------- 2003-06-05 00:21:20 Looking up host "server.example.com" 2003-06-05 00:21:20 Connecting to X.Y.Z.W port 22 2003-06-05 00:21:20 Server version: SSH-2.0-OpenSSH_3.4p1 2003-06-05 00:21:20 We claim version: SSH-2.0-PuTTY-Snapshot-2003-06-04 2003-06-05 00:21:20 Using SSH protocol version 2 2003-06-05 00:21:21 Doing Diffie-Hellman group exchange 2003-06-05 00:21:21 Doing Diffie-Hellman key exchange 2003-06-05 00:21:30 Host key fingerprint is: 2003-06-05 00:21:30 ssh-dss 1024 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX 2003-06-05 00:21:30 Initialised AES-256 client->server encryption 2003-06-05 00:21:30 Initialised AES-256 server->client encryption 2003-06-05 00:21:30 Initialised zlib (RFC1950) compression 2003-06-05 00:21:30 Initialised zlib (RFC1950) decompression 2003-06-05 00:21:31 Reading private key file "C:\some\path\to\key.PPK" 2003-06-05 00:21:31 Offered public key 2003-06-05 00:21:31 Offer of public key accepted 2003-06-05 00:21:32 Access granted 2003-06-05 00:21:32 Opened channel for session 2003-06-05 00:21:32 Requesting X11 forwarding 2003-06-05 00:21:32 X11 forwarding enabled 2003-06-05 00:21:32 Local port 10119 forwarding to news.example.com:119 2003-06-05 00:21:32 Local port 8080 forwarding to proxy.example.com:8080 2003-06-05 00:21:32 Opening forwarded connection to news.example.com:119 2003-06-05 00:21:32 Allocated pty 2003-06-05 00:21:32 Unexpected response to shell/command request: packet type 91 And a bit more verbose (another run with the same behaviour): Event Log: Offered public key Incoming packet type 60 / 0x3c (SSH2_MSG_USERAUTH_PK_OK) Event Log: Offer of public key accepted Outgoing packet type 50 / 0x32 (SSH2_MSG_USERAUTH_REQUEST) Incoming packet type 52 / 0x34 (SSH2_MSG_USERAUTH_SUCCESS) Event Log: Access granted Outgoing packet type 90 / 0x5a (SSH2_MSG_CHANNEL_OPEN) Incoming packet type 91 / 0x5b (SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) Event Log: Opened channel for session Event Log: Requesting X11 forwarding Outgoing packet type 98 / 0x62 (SSH2_MSG_CHANNEL_REQUEST) Incoming packet type 99 / 0x63 (SSH2_MSG_CHANNEL_SUCCESS) Event Log: X11 forwarding enabled Event Log: Local port 10119 forwarding to news.example.com:119 Event Log: Local port 8080 forwarding to proxy.example.com:8080 Outgoing packet type 98 / 0x62 (SSH2_MSG_CHANNEL_REQUEST) Event Log: Opening forwarded connection to news.example.com:119 Outgoing packet type 90 / 0x5a (SSH2_MSG_CHANNEL_OPEN) Incoming packet type 99 / 0x63 (SSH2_MSG_CHANNEL_SUCCESS) Event Log: Allocated pty Outgoing packet type 98 / 0x62 (SSH2_MSG_CHANNEL_REQUEST) Incoming packet type 91 / 0x5b (SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) Event Log: Unexpected response to shell/command request: packet type 91 Reproduced using netcat: "nc -vvvvvv localhost 10119" runned many times while PuTTY is connecting. ---------- Previous report: ---------- PuTTY Release 0.53b Windows 95 B SSH2 Server version: SSH-2.0-OpenSSH_3.4p1 The problem/symptom: PuTTY shows a message box with "Unexpected response to shell/command request: packet type 91" and goes into inactive mode where port forwarding isn't possible (I guess it's line 5236 in ssh.c). How to reproduce: Have PuTTY forward a local port to a machine on the other end. Try to use the forwarded port while starting PuTTY and connecting to the remote host. I have the problem with an internal news server on my university which I read through an SSH forwarded port using Forte Agent that I tell to fetch news before PuTTY is connected. Forte Agent waits 1 second between retries. [...] It seems PuTTY sends an SSH2_MSG_CHANNEL_OPEN interleaved with other packets and then gets confused when it sees the reply SSH2_MSG_CHANNEL_OPEN_CONFIRMATION. I should probably also note that the problem is periodic, and whenever I have seen the problem and the event log (5 times or so) it has had "Opening forwarded connection to news.example.com:119" just before "Allocated pty". Also I have found netcat better to provoke the error by trying "nc -vvv localhost 10119" just before running "C:\Programmer\putty\putty.exe -load ask" in another prompt. ---------- Revision-number: 3241 Prop-content-length: 242 Content-length: 242 K 8 svn:date V 27 2003-06-05T12:05:37.000000Z K 7 svn:log V 141 Summary: Cannot rlogin to host after uncleanly terminated connection Message-ID: K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rlogin-blocked Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 616 Text-content-md5: 33142166a56d4e2ff113820e15ee5539 Text-content-sha1: d5fdb7315c2f999d704de558e05c3f6858948d8b Content-length: 732 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNZZZSummary: Cannot rlogin to host after uncleanly terminated connection Class: bug Present-in: 0.53b 2003-06-05 Content-type: text/x-html-body

    If a PuTTY rlogin connection to a given remote system is terminated uncleanly (e.g., by closing the PuTTY window), further attempts to rlogin to that host result in a "PuTTY Fatal Error: Network error: Address already in use" for several minutes.

    I've observed this on Win2K with Red Hat Linux i386 7.1 (in.rlogind from rsh-server-0.17-2.5). The original reporter observed it on NT4SP6a, server OS "Linux (several versions), HP-UX (several versions)". Revision-number: 3242 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.981281Z PROPS-END Revision-number: 3243 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.989671Z PROPS-END Revision-number: 3244 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:28.997782Z PROPS-END Revision-number: 3245 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:29.006971Z PROPS-END Revision-number: 3246 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:10:29.017572Z PROPS-END Revision-number: 3247 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2003-06-05T16:41:33.000000Z K 7 svn:log V 42 Add reference to Leonid Lisovskiy's patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sco-ansi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 801888d44061f48a56e822a8654d5f36 Text-delta-base-sha1: ba866da17e2909fca3eb9388713fec9cc5f6d168 Text-content-length: 101 Text-content-md5: d5ca39d31d5a9cef680147d9d6eade60 Text-content-sha1: e9059d70231ece377c29457dbcff81a710bc9018 Content-length: 140 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN \ OhO%ep> Patch (unreviewed): >1235026314.20030605202751@bigfoot.com< Revision-number: 3248 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2003-06-06T10:42:14.000000Z K 7 svn:log V 108 Move prototype for platform_new_connection() to a header file so the definitions can be checked against it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 15c2dd455085d3f8eb0c8724d36815cc Text-delta-base-sha1: c37f496b51be23e6faae4aaa33b935b40e79c5f9 Text-content-length: 227 Text-content-md5: 3c5c9e2148a1be4fa3aad72555ce0986 Text-content-sha1: b72e0a1643b9816bc8d29bafbfeb5e3f5cfa726f Content-length: 267 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNy K K"oplatform-dependent callback from new_connection() */ Socket platform_new_connection(SockAddr addr, char *hostname, int port, int privport, int oobinline, int nodelay, Plug plug, Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 218d7c92221db7a3da3cc3861c6a433c Text-delta-base-sha1: 540013858a8c49e20c1c3bdbc9c867d73dda2c67 Text-content-length: 23 Text-content-md5: b05336ae2539cb31a6c5325466130268 Text-content-sha1: d1f26ecd7f1704a1352ad7cb55014627ea9f486f Content-length: 63 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNY) ;nk Revision-number: 3249 Prop-content-length: 200 Content-length: 200 K 7 svn:log V 101 Mention that smartcards should really be handled by an agent-like thing rather than by PuTTY itself. K 10 svn:author V 3 ben K 8 svn:date V 27 2003-06-06T18:03:03.000000Z PROPS-END Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6fc4fe9f2aaaf6669c902c903282be3b Text-delta-base-sha1: 22f5361e2ac6cf2347d4fed5ecbc6b2322784b5f Text-content-length: 295 Text-content-md5: 7c9888accf21b5b899bfe2694e99b64c Text-content-sha1: 09b295ee922372b2cd37c9d10a596cfaf4f4ed55 Content-length: 334 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNcwc

    Alternatively, it might be better to integrate smartcard support into an SSH agent, either as part of Pageant or as a plug-in replacement for it. After all, the purpose of a smartcard is to generate cryptographic signatures on demand, which is what an SSH agent does too. Revision-number: 3250 Prop-content-length: 143 Content-length: 143 K 10 svn:author V 3 ben K 8 svn:date V 27 2003-06-06T18:16:52.000000Z K 7 svn:log V 45 Suggest that local support staff are useful. PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d02613f75bfb068bb1e363701dd9d6d9 Text-delta-base-sha1: 6a52f09e4ec01f3d64f37c28c61e340de180c399 Text-content-length: 315 Text-content-md5: b07b2502699b20dcbbaf31684fcfea1c Text-content-sha1: 49b9f25db66484f30172d77b7ca9559f51fc3682 Content-length: 355 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNk 6=ej\versionid $Id: feedback.but,v 1.13 2003/06/06 18:16:52 bensomeone else installed PuTTY for you, or you're using PuTTY on someone else's computer, try asking them for help first. They're more likely to understand how they installed it and what they expected you to use it for than we are Revision-number: 3251 Prop-content-length: 141 Content-length: 141 K 7 svn:log V 42 Results of some investigations into this. K 10 svn:author V 4 owen K 8 svn:date V 27 2003-06-07T21:20:47.000000Z PROPS-END Node-path: putty-wishlist/data/double-keystrokes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d3ca4d194ef1fc04d79ec4df13fc39d4 Text-delta-base-sha1: 84ffb0278f67819d04447aa5e7de565e67868193 Text-content-length: 303 Text-content-md5: aeb9cc72ffd587fd73b066fffa0685d4 Text-content-sha1: cc83d09db471943d860fcb43fb13c34cbf6a3205 Content-length: 342 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN,H, OSD: When Change Settings is up, keystrokes generate WM_KEYDOWN WM_CHAR WM_KEYUP rather than the usual WM_KEYDOWN WM_KEYUP; it's the extra WM_CHAR that's the problem, but I don't know where it's coming from. Is something in the config box doing TranslateMessage() behind our backs? Revision-number: 3252 Prop-content-length: 236 Content-length: 236 K 8 svn:date V 27 2003-06-09T11:27:41.000000Z K 7 svn:log V 135 Summary: ALT+nnn character entry method gives doubled characters Appeared between 2002-10-22 and -10-24. Not investigated further yet. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/double-alt-keystrokes Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 313 Text-content-md5: 1e0597630423a80ca12dc957aeb06c1c Text-content-sha1: d2f1dab1c262ac0bb6d7339da48ce22262f56170 Content-length: 429 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN+++Summary: ALT+nnn character entry method gives doubled characters Class: bug Absent-in: 0.53b 2002-10-20 Present-in: 2002-10-22 2003-06-09 Using the ALT+nnn method for entering characters with a given decimal code point (e.g. [press left Alt] 6 5 [release left Alt]) gives the same keystroke twice. Revision-number: 3253 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 44 Cross-link portfwd-range and portfwd-space. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-06-10T11:09:46.000000Z PROPS-END Node-path: putty-wishlist/data/portfwd-range Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d4c5a5804c5a1710c21a76afd0084e27 Text-delta-base-sha1: 418e2dd47165497ae289dc52d2765b0bf1030eea Text-content-length: 190 Text-content-md5: 3b15a4a71742764322124532e94465a6 Text-content-sha1: 84e78941fb23307602f5aa203564c35021d48840 Content-length: 229 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN 7+ +

    This is slightly more necessary than it could be because of the limitations on the number of forwarded ports (see `portfwd-space'). Node-path: putty-wishlist/data/portfwd-space Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 08590a6dab4f1346c843a3590d0ee686 Text-delta-base-sha1: b2153677d879a74eea06739199ce6467e1307ea1 Text-content-length: 143 Text-content-md5: c50b4bd13cce67200b5080d7c831ef0d Text-content-sha1: 2b29127132550079ee0578991dc5cd1ce5137888 Content-length: 182 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNmk~m~

    If we implemented `portfwd-range' then the need to fix this would become less pressing. Revision-number: 3254 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 37 I think this is a semi-bug at worst. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-06-10T11:10:24.000000Z PROPS-END Node-path: putty-wishlist/data/cygwin-clobbers-pageant Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0f5599592e4b6a4f4bc44aa083e3f8ca Text-delta-base-sha1: 008ab06164a4b47dba46c9c32d8fa652ad0266eb Text-content-length: 24 Text-content-md5: daaff06b5774c1298ed37f59a6fd0664 Text-content-sha1: e29dd0c607269d3b5c27e73ecfc33ccab36091a7 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN6;DrDsemi- Revision-number: 3255 Prop-content-length: 119 Content-length: 119 K 7 svn:log V 19 Update ECMA links. K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-06-10T11:16:11.000000Z PROPS-END Node-path: putty-wishlist/data/bidi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 94850cfec959d00a7e00a2f2be5d0e37 Text-delta-base-sha1: 9f0278885076c69c0e36986df08c40d02f688266 Text-content-length: 111 Text-content-md5: 89d9d6cabec8888de25c506bdddcc8df Text-content-sha1: 43219aeee3237966fb89b89c23681b6b82696d8d Content-length: 150 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN AT0,?|-international.org/publications/standards-international.org/publications/techreports Revision-number: 3256 Prop-content-length: 122 Content-length: 122 K 10 svn:author V 5 jacob K 8 svn:date V 27 2003-06-10T11:23:06.000000Z K 7 svn:log V 22 Freshen + link to FAQ PROPS-END Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ccafffc028c132d813a9ec7791606600 Text-delta-base-sha1: 254411168619bf1aad85cf9fcf0a4b12693a5890 Text-content-length: 422 Text-content-md5: 858fd7929f4d6d5dd20c0e1d34013401 Text-content-sha1: 118ec1a94e18365cf93e5dfc2ff38b0c71b342be Content-length: 461 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN $You can also build a Unix port of PuTTY itself. This isn't as useful a thing on Unix as it is on Windows; its major value is as a pathfinding effort for other ports. If anyone really has a use for it, we'd be interested to know why :-)

    We don't currently have ports of any other PuTTY utilities.

    See also the FAQ. Revision-number: 3257 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2003-06-10T11:26:47.000000Z K 7 svn:log V 18 Add links to RFCs K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/srp-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7adfa4460a65ac765480fbcd4733016a Text-delta-base-sha1: 55207d439710c047d7d2bc29049f973fe368a423 Text-content-length: 204 Text-content-md5: 6cb1d4cb85d8fc97a4147eb11905f961 Text-content-sha1: 4c56ae5611244e94ba902f9f91726783a3711e3a Content-length: 243 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNw 3JDzRo RFC2945RFC2944 describes Telnet SRP authentication. Revision-number: 3258 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2003-06-11T15:50:01.000000Z K 7 svn:log V 18 Fix HTML stuff-up K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sco-ansi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d5ca39d31d5a9cef680147d9d6eade60 Text-delta-base-sha1: e9059d70231ece377c29457dbcff81a710bc9018 Text-content-length: 69 Text-content-md5: acbf8ae181328230a3d3b1eb7cd27246 Text-content-sha1: afca635a0e2f4b1ace2f0c3930f0fb691d219cd6 Content-length: 108 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN\Z 0&6lt;1235026314.20030605202751@bigfoot.com> 6' (or press Windows-W), and have the URL automatically Revision-number: 3260 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2003-06-12T19:00:28.000000Z K 7 svn:log V 52 Website changes due to moving nightlies out of LSL. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d16f101bd39a4c6f1949b38de4fdd80d Text-delta-base-sha1: f6015da8dc845665465ea3f62edb0f9abace107e Text-content-length: 152 Text-content-md5: 0bbd506714bcf281e6eb7cd70e3ce3d4 Text-content-sha1: 434f82f6022e1082a64538ffc220fd9dc9d73acd Content-length: 191 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN^p0[;%9)\O]9Z]{w72,!----!--

    For Alphaalpha/putty.zipalpha/putty.zip.DSA">(DSA sig)
    Release source code for Unix0.54.tar.gz">putty-0.54.tar.gzputty-0.54.tar.gz0.54.tar.gzputty-0.54.tar.gz zip Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8af89bde2c27a6fa71775adc3bcee4e0 Text-delta-base-sha1: a6f1246e228b482bd8321e46e38c500df2008eb6 Text-content-length: 45 Text-content-md5: 5e714eaf9a23e39164ba1376c4f9ab5f Text-content-sha1: debd6d937fdda424cabcef06e77d917e80f93cbe Content-length: 85 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN bOh=GXr! and Unix4 Revision-number: 3853 Prop-content-length: 296 Content-length: 296 K 8 svn:date V 27 2004-02-12T19:45:45.000000Z K 7 svn:log V 195 Modifications to the release procedure as a result of actually trying to _follow_ it for the first time :-) And also due to the fact that it now needs to mention the Unix source tarball as well. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 117195900412e3874aacefb77fa97f91 Text-delta-base-sha1: e6ba7539d3edd14fa473430698964b8a73e2a2a0 Text-content-length: 1330 Text-content-md5: ff8c3304bf2ef8ac88e8cc3a503c8b39 Text-content-sha1: 42ffdeacfffcf2fb454cfdade29251fafbb0a2a5 Content-length: 1370 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNCq8n[T'Kw%,Wc*Cst, 9 Do this in a _clean_ directory; don't depend on my usual source dir. + Make sure to run mkfiles.pl _after_ this checkout, just in case. - Build the source archives now, while the directory is still pristine. + run ./mksrcarc.sh to build the Windows source zip. + run `./mkunxarc.sh X.YZ' to build the Unix tarballignatures on these, to ensure they're really the ones he built. If I'm going to sign a zip file I make out of these, I'm damn well going to make sure the binaries that go _into_ it are binary archives putty.zip (one for each architecture): each one just contains all the .exe files except PuTTYtel, and the .hlp and .cnt files. + zip -k putty.zip `ls *.exe | grep -v puttytel` putty.hlp putty.cnt + same again for Alpha. - Build the docs archive puttydoc.zip: it contains all the HTML files output from Halibut. + zip puttydoc.zip *.htmlrelease keys. Having checked that, sign the Alpha binary zipfile with the releaseWindows source zip (plus signatures), the Unix source tarball - Now double-check by verifying all the signatures on all the files, and running md5sum -c on all the md5sumss of installer and Unix tarball on links in TT> on mono. - All done. Revision-number: 3854 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:05.487868Z PROPS-END Revision-number: 3855 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:05.496811Z PROPS-END Revision-number: 3856 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:05.508172Z PROPS-END Revision-number: 3857 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 Bah! Knew there'd be _something_. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-02-12T23:26:37.000000Z PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ff8c3304bf2ef8ac88e8cc3a503c8b39 Text-delta-base-sha1: 42ffdeacfffcf2fb454cfdade29251fafbb0a2a5 Text-content-length: 111 Text-content-md5: 48289c910150293c5ea643e319ce2f5b Text-content-sha1: 2182f4f3dd138cc5587e013b7c0d93548bace0b1 Content-length: 151 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNqP Y!YVCheck the permissions! Actually try downloading from the, to make sure it really works Revision-number: 3858 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2004-02-13T00:19:11.000000Z K 7 svn:log V 15 Fixed-in: 0.54 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0aad2a9a84ef70d686ae21a5db824cdd Text-delta-base-sha1: ef4666d17c5e4715af284a796b50467d947da08b Text-content-length: 110 Text-content-md5: 3b025cf877d13263a935841404d68c65 Text-content-sha1: c4df97e79955cbf3fbdfa6666d04d000b17c5e4a Content-length: 149 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNw YDZCKFixed-in: 0.54

    Update: as of 0.54, we think this is good enough to release. Revision-number: 3859 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 Missed one: sftp-slow has gone away with 0.54 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-13T00:20:52.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8216abfde34861c49c6f93ccc867ca4b Text-delta-base-sha1: 6ee38444076192eaf92f2e190f63dce146b2c9e1 Text-content-length: 381 Text-content-md5: 55781323f9b2fbe2bbeff88981f771a2 Text-content-sha1: 5fac534c4d64324d7be289505f319dfce449795b Content-length: 421 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN?]_78'Gx\versionid $Id: faq.but,v 1.58 2004/02/13 00:20:52 jacobThe throughput of PSFTP 0.54 should be much better than 0.53b and prior; we've added code to the SFTP backend to queue several blocks of data rather than waiting for an acknowledgement for each. (The SCP backend did not suffer from this performance issue because SCP is a much simpler protocol.) Revision-number: 3860 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2004-02-13T00:21:35.000000Z K 7 svn:log V 43 Remove claim that there's no Unix puttygen K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/putty.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ffa980d30aef9f254be996da4f3f6242 Text-delta-base-sha1: e69b3f6e8406a1cf81fcf17e281f8f723f4e13b2 Text-content-length: 15 Text-content-md5: 06fd72b0b4fc8ac0345e2ae95a17de95 Text-content-sha1: 8126a5ee1d8d19a9a5b7bad4d542850e45f30870 Content-length: 54 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN%88 Revision-number: 3861 Prop-content-length: 139 Content-length: 139 K 7 svn:log V 39 Makefile.cyg now generates a link map. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-13T00:40:45.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 646bdbc366528d9a4726e963a40bdcba Text-delta-base-sha1: fb27406aa2ff5b569583cac9d9766eb196cfa908 Text-content-length: 43 Text-content-md5: 520c5a8ac94878043dc929a610529576 Text-content-sha1: 189ac05f853eba9004f80db9375a123eedbb4220 Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVN>i U="-Wl,-Map,$prog.map Revision-number: 3862 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 40 Add .map files to Cygwin "clean" target K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-13T00:41:44.000000Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 520c5a8ac94878043dc929a610529576 Text-delta-base-sha1: 189ac05f853eba9004f80db9375a123eedbb4220 Text-content-length: 30 Text-content-md5: 3a6b6433ab8f5f43461edb761e6a2b49 Text-content-sha1: 9bcdc20ed830f194a356f616beb3689ef4b440e2 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNio e *.map Revision-number: 3863 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2004-02-13T07:42:27.000000Z K 7 svn:log V 128 Alexei Podtelezhnikov points out that PuTTYgen's key-type default ought to have moved in sync with PuTTY's SSH version default. K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f2f5a8edcc15b146be60444390cbbe7e Text-delta-base-sha1: 152bb9de0ff600d376d4155a4941cc9e1f126225 Text-content-length: 30 Text-content-md5: 11dd7256ded8e0ee50772403e3fa286a Text-content-sha1: 32ceac0267ee00517a42abe464fccd108befdca6 Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVNux 3A42RSA Revision-number: 3864 Prop-content-length: 232 Content-length: 232 K 8 svn:date V 27 2004-02-13T11:20:42.000000Z K 7 svn:log V 131 I don't think iXplorer is now sufficiently unique to mention in the docs (given that we have a Links page full of such things now) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 62431ef28025da5ab4d19143d64e251c Text-delta-base-sha1: e04575b67e995ac885d8096c7ff24bf0130d5a77 Text-content-length: 73 Text-content-md5: f463efbd72626e66ce3fac15d5bf7e31 Text-content-sha1: 388433b382005f9e68dab6269d06f8df9a48464c Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVNxC9 9\versionid $Id: pscp.but,v 1.24 2004/02/13 11:20:42 jacob Revision-number: 3865 Prop-content-length: 181 Content-length: 181 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-13T12:19:26.000000Z K 7 svn:log V 81 bloody PageRank hackers. (since no-one objected to this wording back in October) PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 55781323f9b2fbe2bbeff88981f771a2 Text-delta-base-sha1: 5fac534c4d64324d7be289505f319dfce449795b Text-content-length: 1525 Text-content-md5: 335ebe2330e2cf74e24efc2d3cbed5eb Text-content-sha1: 95b6e3901d8d1db124f6a907b0081a0e78d47e3f Content-length: 1565 K 15 cvs2svn:cvs-rev V 4 1.59 PROPS-END SVN] X2&F\versionid $Id: faq.but,v 1.59 2004/02/13 12:19:26link}{Question} Would you link to my web site from the PuTTY web site? Only if the content of your web page is of definite direct interest to PuTTY users. If your content is unrelated, or only tangentially related, to PuTTY, then the link would simply be advertising for you. One very nice effect of the Google ranking mechanism is that by and large, the most popular web sites get the highest rankings. This means that when an ordinary person does a search, the top item in the search is very likely to be a high-quality site or the site they actually wanted, rather than the site which paid the most money for its ranking. The PuTTY web site is held in high esteem by Google, for precisely this reason: lots of people have linked to it simply because they like PuTTY, without us ever having to ask anyone to link to us. We feel that it would be an abuse of this esteem to use it to boost the ranking of random advertisers' web sites. If you want your web site to have a high Google ranking, we'd prefer that you achieve this the way we did - by being good enough at what you do that people will link to you simply because they like you. If you have software based on PuTTY, or specifically designed to interoperate with PuTTY, or in some other way of genuine interest to PuTTY users, then we will probably be happy to add a link to you on our Links page. And if you're running a mirror of the PuTTY web site, we're \e{definitely} interested Revision-number: 3866 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2004-02-13T16:11:35.000000Z K 7 svn:log V 42 mention Phil Pennock's patch + commentary K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ac1f17fc0b130718ccf7989b4ed6d9cd Text-delta-base-sha1: 72eeaf931f7f8d0d5f12da7e7db0d0d1dde76675 Text-content-length: 87 Text-content-md5: 499ab7f448fa599a62e74c1213568043 Text-content-sha1: cfd232563e056e7cd0996490aa0eb5b1930b1c34 Content-length: 126 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN SF F 20040213160319.GA565@scimitar.noc.nl.demon.net (with commentary) Revision-number: 3867 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2004-02-15T22:40:39.000000Z K 7 svn:log V 33 Mention KPuTTY and GPuTTY, FWIW. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5bdf3f272ece357d08812f1499d65af7 Text-delta-base-sha1: 4557170d3a6db44235f3e9d1ac1a5b103405284a Text-content-length: 185 Text-content-md5: d5d7ede39079856773309a2d9b6f4677 Text-content-sha1: ece833b893e8f9cf0b338e58c06c98f24075c45b Content-length: 225 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVNM !:!r%kputty.sourceforge.net/">KPuTTY and GPuTTY, PuTTY-lookalike frontends for Unix Revision-number: 3868 Prop-content-length: 226 Content-length: 226 K 8 svn:date V 27 2004-02-16T14:38:42.000000Z K 7 svn:log V 125 Couple of new FAQ questions: `what's the point of the Unix port' and `why does scrollback no longer work when I run screen'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 335ebe2330e2cf74e24efc2d3cbed5eb Text-delta-base-sha1: 95b6e3901d8d1db124f6a907b0081a0e78d47e3f Text-content-length: 2412 Text-content-md5: a1b821288429133a7d1539b144a959c9 Text-content-sha1: 9633f69832dc8b5663681d0cdeeaa7cc1abc69e9 Content-length: 2452 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVN *Gz81r(^w\versionid $Id: faq.but,v 1.60 2004/02/16 14:38:42 simonunix-why}{Question} What's the point of the Unix port? Unix has OpenSSH. All sorts of little things. \c{pterm} is directly useful to anyone who prefers PuTTY's terminal emulation to \c{xterm}'s, which at least some people do. Unix Plink has apparently found a niche among people who find the complexity of OpenSSL makes OpenSSH hard to install (and who don't mind Plink not having as many features). Some users want to generate a large number of SSH keys on Unix and then copy them all into PuTTY, and the Unix PuTTYgen should allow them to automate that conversion process. There were development advantages as well; porting PuTTY to Unix was a valuable path-finding effort for other future ports, and also allowed us to use the excellent Linux tool \W{http://valgrind.kde.org/}{Valgrind} to help with debugging, which has already improved PuTTY's stability on \e{all} platforms. However, if you're a Unix user and you can see no reason to switch from OpenSSH to PuTTY/Plink, then you're probably right. We don't expect our Unix port to be the right thing for everybodyS{faq-screen}{Question} Since I upgraded to PuTTY 0.54, the scrollback has stopped working when I run \c{screen}. PuTTY's terminal emulator has always had the policy that when the \q{alternate screen} is in use, nothing is added to the scrollback. This is because the usual sorts of programs which use the alternate screen are things like text editors, which tend to scroll back and forth in the same document a lot; so (a) they would fill up the scrollback with a large amount of unhelpfully disordered text, and (b) they contain their \e{own} method for the user to scroll back to the bit they were interested in. We have generally found this policy to do the Right Thing in almost all situations. Unfortunately, \c{screen} is one exception: it uses the alternate screen, but it's still usually helpful to have PuTTY's scrollback continue working. The simplest solution is to go to the Features control panel and tick \q{Disable switching to alternate terminal screen}. (See \k{config-features-altscreen} for more details.) The reason why this only started to be a problem in 0.54 is because \c{screen} typically uses an unusual control sequence to switch to the alternate screen, and previous versions of PuTTY did not support this sequence Revision-number: 3869 Prop-content-length: 112 Content-length: 112 K 8 svn:date V 27 2004-02-16T16:02:33.000000Z K 7 svn:log V 12 Past tense! K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cb752798cdc89f378846f5f605a4a59f Text-delta-base-sha1: a4bb9bcee7bc7a662a47ac9dfaa0b38c6cfe0d08 Text-content-length: 34 Text-content-md5: 2a0a90a75613d8b39e7f1b73c46f8e4a Text-content-sha1: 13732ae667994d102086d7886dd3ab40dc0aa193 Content-length: 74 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN8J9 wewe Revision-number: 3870 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2004-02-17T18:28:37.000000Z K 7 svn:log V 14 Solaris patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 499ab7f448fa599a62e74c1213568043 Text-delta-base-sha1: cfd232563e056e7cd0996490aa0eb5b1930b1c34 Text-content-length: 71 Text-content-md5: 3eab88a7e7da86bf3b9304158bffa803 Text-content-sha1: f0573e4e075c53c3e2021cdad6f97aee8ad4deef Content-length: 110 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNS 7S * Solaris 20040217181156.GM17353@granzeau.com Revision-number: 3871 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 mirrors.dedipower.com K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-17T18:33:29.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b0827042818ab40bf43013911b9739ae Text-delta-base-sha1: 10a8277bd9ad50d79de2e41f6532c2b7c7c21733 Text-content-length: 107 Text-content-md5: 509f4df83ed80bd798af2317f02acc61 Text-content-sha1: 9fc3d842296c70c5d10dd9a4d17bb6a38c7fc850 Content-length: 147 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVN/+ UWU0mirrors.dedipower.com/putty/">mirrors.dedipower.com in the UK. Revision-number: 3872 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:06.218830Z PROPS-END Revision-number: 3873 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:06.228580Z PROPS-END Revision-number: 3874 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:06.237983Z PROPS-END Revision-number: 3875 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2004-02-18T11:06:45.000000Z K 7 svn:log V 21 putty.jeremytech.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 509f4df83ed80bd798af2317f02acc61 Text-delta-base-sha1: 9fc3d842296c70c5d10dd9a4d17bb6a38c7fc850 Text-content-length: 73 Text-content-md5: ec247aa6ace73d0c5b7673f33fb5737b Text-content-sha1: e29f9106ed7c7f5ff7b36a6e583c60ad67628327 Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVN+01D?z1putty.jeremytech.com/">putty.jeremytech.com Revision-number: 3876 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:06.382002Z PROPS-END Revision-number: 3877 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:06.393322Z PROPS-END Revision-number: 3878 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:06.402334Z PROPS-END Revision-number: 3879 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:06.411841Z PROPS-END Revision-number: 3880 Prop-content-length: 259 Content-length: 259 K 8 svn:date V 27 2004-02-21T22:52:45.000000Z K 7 svn:log V 158 Summary: Hard hangs on Win2000/XP Difficulty: taxing We've been getting reports of this for a while, although there's been a rash of them recently. No clue. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/hard-hangs Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2231 Text-content-md5: 68ad1b2d9f274f7bcef098dd8be0d450 Text-content-sha1: 561b1e74fcc1743dceb6ba8abbd9a9be2cb44cc4 Content-length: 2347 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN)))Summary: Hard hangs on Win2000/XP Class: semi-bug Difficulty: taxing Content-type: text/x-html-body Present-in: 0.52 2002-02-24 0.53b 0.54

    Apparently, for some people, PuTTY randomly hangs hard with Win2000/XP.

    We've been getting rare but persistent reports of this for a while, but there seems to have been a rash of them recently (Feb 2004). None of us have ever seen this, so we're going to need some help if we're to stop it happening.

    Common characteristics of the reports we've had:

    • When one PuTTY hangs, they all hang, including any new instances attempted (once they get to opening a terminal window), until the system is restarted. But other applications on the same system are unaffected.
    • When trying to close PuTTY via the task manager, one receives a message like "This program cannot be closed. If it is being debugged, please resume it or close the debugger first."
    • It doesn't seem to be correlated with any particular event - it can occur hours into an established connection.
    • It's claimed that the PuTTY backend is still functional (sending keepalives, etc).
    • Might only happen with SSH? (1 and 2)

    If I had to make a guess, I'd investigate some of the trickery we use to get noise for random numbers. My notes also suggest that I thought someone thought that sound might be implicated, but I can't find any evidence for that now. Reports:

    Revision-number: 3881 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2004-02-21T23:04:46.000000Z K 7 svn:log V 22 Found another report. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/hard-hangs Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 68ad1b2d9f274f7bcef098dd8be0d450 Text-delta-base-sha1: 561b1e74fcc1743dceb6ba8abbd9a9be2cb44cc4 Text-content-length: 50 Text-content-md5: 58e5606b617143bcfad863a51bfcfc9c Text-content-sha1: 39a43a1ee70eb4683017f0fce1d0ce145386280e Content-length: 89 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN)K % 3C4550B2.5EDB3F19@nada.kth.se Revision-number: 3882 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2004-02-21T23:06:32.000000Z K 7 svn:log V 27 Change problem description K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/hard-hangs Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 58e5606b617143bcfad863a51bfcfc9c Text-delta-base-sha1: 39a43a1ee70eb4683017f0fce1d0ce145386280e Text-content-length: 90 Text-content-md5: bf13ad83e17165f92c16743b0ce680bf Text-content-sha1: 69bce78c6fadcf7b95ca4fe171cdb3b5df364fed Content-length: 129 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNKr D)FSummary: PuTTY becomes unresponsive / unkillablebecomes unresponsive Revision-number: 3883 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 trudgian.net removed at administrator request K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-21T23:16:32.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ec247aa6ace73d0c5b7673f33fb5737b Text-delta-base-sha1: e29f9106ed7c7f5ff7b36a6e583c60ad67628327 Text-content-length: 20 Text-content-md5: 24c9f412a1dc5d2eeb30783669f63e81 Text-content-sha1: db63e88d789a27f7f079579a4ce73253f5d1bbe2 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVN) % Revision-number: 3884 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2004-02-21T23:19:04.000000Z K 7 svn:log V 33 Mac OS X, mention FreeBSD ports. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3eab88a7e7da86bf3b9304158bffa803 Text-delta-base-sha1: f0573e4e075c53c3e2021cdad6f97aee8ad4deef Text-content-length: 147 Text-content-md5: 53428b2360eef21504fc40a42850638d Text-content-sha1: 13f1e796f385495b122027dbc379125bd4702b4e Content-length: 186 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN  * Mac OS X dhbecker-0uHkTAZ3waS4IzZ253W5cgjfAlrQMYu@mailblocks.com Apparently PuTTY is now in the FreeBSD ports tree. Revision-number: 3885 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2004-02-22T14:24:27.000000Z K 7 svn:log V 73 Summary: Keepalives not yet implemented on Unix Spotted by Steve Bamber. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-keepalives Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 266 Text-content-md5: d0d26bfdea1b62a81281129931e11df3 Text-content-sha1: 31b3c44f0a5668af950a63d9a2c551e3ce13c303 Content-length: 382 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN|||Summary: Keepalives not yet implemented on Unix Class: semi-bug Content-type: text/x-html-body Present-in: 0.54 2004-02-21

    The Keepalive period appears in the Unix PuTTY dialog box, but doesn't appear to do anything (in at least PuTTY and plink). Revision-number: 3886 Prop-content-length: 145 Content-length: 145 K 7 svn:log V 45 Tart up, fix outright lies, mention web docs K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-22T14:37:54.000000Z PROPS-END Node-path: putty/unix/plink.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7dc393b193db44b4badbf7aaf9d1e4a2 Text-delta-base-sha1: 241a6f5baed5597fb88ad1f58bc4eb67643e2c78 Text-content-length: 457 Text-content-md5: 916238f1550a27495ae1ea8e84d228ae Text-content-sha1: ba0163b0dbd021bbe16d3a0458b282a210d45967 Content-length: 496 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN@d N;$r^Mz?H.TH plink 1 .SH NAME plink \- PuTTY link, command line network connection toollocala\fR" Disable agent forwarding (default). .IP "\fB-tTSSHMORE INFORMATION For more information on plink, it's probably best to go and look at the manual on the PuTTY web page: \fBhttp://www.chiark.greenend.org.uk/~sgtatham/putty/\fP .SH BUGS This man page isn't terribly complete. See the above web link for better documentation. Revision-number: 3887 Prop-content-length: 115 Content-length: 115 K 7 svn:log V 15 Fix typo in -C K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-22T14:40:40.000000Z PROPS-END Node-path: putty/unix/putty.1 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 06fd72b0b4fc8ac0345e2ae95a17de95 Text-delta-base-sha1: 8126a5ee1d8d19a9a5b7bad4d542850e45f30870 Text-content-length: 20 Text-content-md5: 8641cce96d4e6b584fa4108aa85d2c6d Text-content-sha1: d316cb9c412a321f1cd49085611e96034789447b Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN8- IdT Revision-number: 3888 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2004-02-22T14:48:48.000000Z K 7 svn:log V 27 Minor fix in usage message K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f463efbd72626e66ce3fac15d5bf7e31 Text-delta-base-sha1: 388433b382005f9e68dab6269d06f8df9a48464c Text-content-length: 80 Text-content-md5: 657fa313841c83d0d61009aecc4fb78b Text-content-sha1: 4a8b7a939d3ac87b9dd0498131e8e1bda3c49620 Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNCE :Y32\versionid $Id: pscp.but,v 1.25 2004/02/22 14:48:48[user@] Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c5c08ad5a53ea3e5d43f0a0bab4c6197 Text-delta-base-sha1: de4c25cc318e3d46710b107004ce38c9733d79f8 Text-content-length: 32 Text-content-md5: c631032558397172df90a5c72c416ec9 Text-content-sha1: 55cdc325ffed1a96debf5534d2f3ace22cd94415 Content-length: 73 K 15 cvs2svn:cvs-rev V 5 1.116 PROPS-END SVN  [user@] Revision-number: 3889 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2004-02-22T14:57:40.000000Z K 7 svn:log V 34 Correct slightly misleading usage K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e7a40439e738405176fb08b6c5f057f8 Text-delta-base-sha1: 6bd2af865b99bbec85fc86be1b39d41a2eb54a01 Text-content-length: 32 Text-content-md5: b6af2b79392b28cc906c3a6b17e21fdb Text-content-sha1: 00331635e09dbe67f8e1ebe0a55f976dd3842b84 Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVN.0 =lB[user@] Revision-number: 3890 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2004-02-22T15:05:29.000000Z K 7 svn:log V 70 Add (probably frustratingly) bare-bones man pages for pscp and psftp. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/pscp.1 Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1630 Text-content-md5: 1e614c14330b997dca0debd1468efa96 Text-content-sha1: c41c40b9e81953dd33379257d49e7a44286f8a0c Content-length: 1746 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNPPP.TH pscp 1 .SH NAME pscp \- command-line SCP (secure copy) / SFTP client .SH SYNOPSIS \fBpscp\fR [\fIoptions\fR] [\fIuser\fB@\fR]\fIhost\fB:\fIsource\fR \fItarget\fR .br \fBpscp\fR [\fIoptions\fR] \fIsource\fR [\fIsource\fR...] [\fIuser\fB@\fR]\fIhost\fB:\fItarget\fR .br \fBpscp\fR [\fIoptions\fR] \fB-ls\fR [\fIuser\fB@\fR]\fIhost\fB:\fIfilespec\fR .SH DESCRIPTION \fBpscp\fR is a command-line client for the SSH-based SCP (secure copy) and SFTP (secure file transfer protocol) protocols. .SH OPTIONS The command-line options supported by \fIpscp\fP are: .IP "\fB-ls\fR" Remote directory listing. .IP "\fB-p\fR" Preserve file attributes. .IP "\fB-q\fR" Quiet, don't show statistics. .IP "\fB-r\fR" Copy directories recursively. .IP "\fB-unsafe\fR" Allow server-side wildcards (DANGEROUS). .IP "\fB-v\fR" Show verbose messages. .IP "\fB-load\fR \fIsession\fR" Load settings from saved session. .IP "\fB-P\fR \fIport\fR" Connect to port \fIport\fR. .IP "\fB-l\fR \fIuser\fR" Set remote username to \fIuser\fR. .IP "\fB-batch\fR" Disable interactive prompts. .IP "\fB-pw\fR \fIpassword\fR" Set remote password to \fIpassword\fR. .IP "\fB-1\fR" Force use of SSH protocol version 1. .IP "\fB-2\fR" Force use of SSH protocol version 2. .IP "\fB-C\fR" Enable SSH compression. .IP "\fB-i\fR \fIpath\fR" Private key file for authentication. .SH MORE INFORMATION For more information on \fBpscp\fR it's probably best to go and look at the manual on the PuTTY web page: \fBhttp://www.chiark.greenend.org.uk/~sgtatham/putty/\fP .SH BUGS This man page isn't terribly complete. See the above web link for better documentation. Node-path: putty/unix/psftp.1 Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1449 Text-content-md5: 5cc26966accfc38f48f4691a93626059 Text-content-sha1: 9e03aff02ca1819f9303b9705180bc8771e47832 Content-length: 1565 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN.TH psftp 1 .SH NAME psftp \- interactive SFTP (secure file transfer protocol) client .SH SYNOPSIS \fBpsftp\fR [\fIoptions\fR] [\fIuser\fB@\fR]\fIhost\fR .SH DESCRIPTION \fBpsftp\fR is an interactive text-based client for the SSH-based SFTP (secure file transfer) protocol. .SH OPTIONS The command-line options supported by \fIpsftp\fP are: .IP "\fB-b\fR \fIbatchfile\fR" Use specified batchfile. .IP "\fB-bc\fR" Output batchfile commands. .IP "\fB-be\fR" Don't stop batchfile processing on errors. .IP "\fB-v\fR" Show verbose messages. .IP "\fB-load\fR \fIsession\fR" Load settings from saved session. .IP "\fB-P\fR \fIport\fR" Connect to port \fIport\fR. .IP "\fB-l\fR \fIuser\fR" Set remote username to \fIuser\fR. .IP "\fB-batch\fR" Disable interactive prompts. .IP "\fB-pw\fR \fIpassword\fR" Set remote password to \fIpassword\fR. .IP "\fB-1\fR" Force use of SSH protocol version 1. .IP "\fB-2\fR" Force use of SSH protocol version 2. .IP "\fB-C\fR" Enable SSH compression. .IP "\fB-i\fR \fIpath\fR" Private key file for authentication. .SH COMMANDS For a list of commands available inside \fBpsftp\fR, type \fBhelp\fR at the \fBpsftp>\fR prompt. .SH MORE INFORMATION For more information on \fBpsftp\fR it's probably best to go and look at the manual on the PuTTY web page: \fBhttp://www.chiark.greenend.org.uk/~sgtatham/putty/\fP .SH BUGS This man page isn't terribly complete. See the above web link for better documentation. Revision-number: 3891 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2004-02-22T16:52:27.000000Z K 7 svn:log V 53 Expand "what platform" text to take account of Unix. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9c1604f3f485a4e5ff2e674f0e82df62 Text-delta-base-sha1: 23b148dcf103a641fafdb0618853082a250ed3f0 Text-content-length: 284 Text-content-md5: 7c560fe204e8d5e7d94e2b18b6fd6ea9 Text-content-sha1: 06773c59b28cacdfca0593e586041c26ff3e6538 Content-length: 324 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVNy5 K7Ji\versionid $Id: feedback.but,v 1.16 2004/02/22 16:52:27PuTTY is a multi-platform application; tell us what version of what OS you are running PuTTY on. (If you're running on Unix, or Windows for Alpha, tell us, or we'll assume you're running on Windows for Revision-number: 3892 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.118808Z PROPS-END Revision-number: 3893 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.149238Z PROPS-END Revision-number: 3894 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.158034Z PROPS-END Revision-number: 3895 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.166870Z PROPS-END Revision-number: 3896 Prop-content-length: 120 Content-length: 120 K 7 svn:log V 20 Mention PocketPuTTY K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-23T19:10:43.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a1b821288429133a7d1539b144a959c9 Text-delta-base-sha1: 9633f69832dc8b5663681d0cdeeaa7cc1abc69e9 Text-content-length: 180 Text-content-md5: 8b5f637500fabee272c09a6dd50edaa1 Text-content-sha1: c63e2e52b855450f03f45a13df8dab5d35fcfef5 Content-length: 220 K 15 cvs2svn:cvs-rev V 4 1.61 PROPS-END SVN* _8a\versionid $Id: faq.but,v 1.61 2004/02/23 19:10:43 jacobThere's a also third-party port at \W{http://pocketputty.aleq.cz/}\c{http://pocketputty.aleq.cz/} Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d5d7ede39079856773309a2d9b6f4677 Text-delta-base-sha1: ece833b893e8f9cf0b338e58c06c98f24075c45b Text-content-length: 118 Text-content-md5: 294a5164f69ab821ad4bcb0f910cf70a Text-content-sha1: d41c696907415d08fe6ca0ce128dbb697cb0149d Content-length: 158 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNMC ```Jpocketputty.aleq.cz/"> PocketPuTTY, a port of 0.53b for Windows Mobile 2003 (no source yet Node-path: putty-wishlist/data/port-wince Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ea28a35010d5983252b0af3e78e18424 Text-delta-base-sha1: 83d8679dbc6786a4ca3f7b9430cecbf38fa65929 Text-content-length: 246 Text-content-md5: 092acc8d5dab8dd8dc012bd2c202862c Text-content-sha1: 2b10c457e843d23291050cd6208bcb87f567cbda Content-length: 285 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN_Bc_c

    There's a third-party port at pocketputty.aleq.cz. At the time of writing, I don't think any of us have tried it, it's in an early stage of development, and there's no source yet. Revision-number: 3897 Prop-content-length: 153 Content-length: 153 K 7 svn:log V 53 Speculate on the possibility of merging aleq's work. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-23T19:13:16.000000Z PROPS-END Node-path: putty-wishlist/data/port-wince Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 092acc8d5dab8dd8dc012bd2c202862c Text-delta-base-sha1: 2b10c457e843d23291050cd6208bcb87f567cbda Text-content-length: 207 Text-content-md5: eb77124bddcaf8770d98ee8144c2db04 Text-content-sha1: 87ac2688eb40d70611d0bf8f12f8f59b1565d486 Content-length: 246 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNB| 9A9@ It's possible that it could be merged into the main tree at some point, but there'd need to be some upheaval, primarily to cope with everything being wide strings and the like on WinCE Revision-number: 3898 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.785275Z PROPS-END Revision-number: 3899 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.796538Z PROPS-END Revision-number: 3900 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2004-02-24T17:47:49.000000Z K 7 svn:log V 73 XFree86 seems to be stable these days, so suggest synchronising with it. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/xterm-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 225d8e4038d0830e66cdcd2cd3bb306c Text-delta-base-sha1: 0eb08a13c57cbbb66b6c71dd9a9a1f6e89c8d57e Text-content-length: 256 Text-content-md5: 0a97a0e1c9c8e44bd926bfe26b3227e6 Text-content-sha1: fbe8b15bbfd53fe3e980b4abb8eb707c91dfba51 Content-length: 295 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN.?c Y"c{[

    current XFree86 xterm seems to be considered the best baseline by our users. Its ctlseqs.ms documents things fairly well.

    Ref: Debian Bug #167629.

    Revision-number: 3901 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2004-02-24T17:48:05.000000Z K 7 svn:log V 41 Various updates from Usenet discussions. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/hard-hangs Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bf13ad83e17165f92c16743b0ce680bf Text-delta-base-sha1: 69bce78c6fadcf7b95ca4fe171cdb3b5df364fed Text-content-length: 451 Text-content-md5: 49bedf61b5413ea053ff60c9d69f0cc8 Text-content-sha1: 66891631663d22952650787dc0ac5ab84caf84d1 Content-length: 490 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNrt$Hu'\YLooks like it only happens with SSH (1 and 2)
  • May be absent in 0.49?

    We've had one suggestion that Office 2002 may be implicated. If you can corroborate or falsify that, please let us know.

    If someone can debug one of the hanging PuTTY processes and tell us where it's got stuck, that would be good too Revision-number: 3902 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.885400Z PROPS-END Revision-number: 3903 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.895103Z PROPS-END Revision-number: 3904 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.903734Z PROPS-END Revision-number: 3905 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2004-02-25T17:42:14.000000Z K 7 svn:log V 34 Tweak now that OpenSSH 3.8 is out K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a6be7ceef53674b27bdc209cfcc278ad Text-delta-base-sha1: cdb185cc06017e4ec69345988cae9d5acb918648 Text-content-length: 115 Text-content-md5: d23f1f2cf24a7e8fd64fa45a40c04863 Text-content-sha1: 6229011bf7f5484d80ad114543cd5a9be6cb2c74 Content-length: 154 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN VbtbI believe that newer versions (including the version that was incorporated in OpenSSH 3.8) don't. Revision-number: 3906 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.949819Z PROPS-END Revision-number: 3907 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:07.958656Z PROPS-END Revision-number: 3908 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2004-02-26T17:49:20.000000Z K 7 svn:log V 19 tprinteractive.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 24c9f412a1dc5d2eeb30783669f63e81 Text-delta-base-sha1: db63e88d789a27f7f079579a4ce73253f5d1bbe2 Text-content-length: 90 Text-content-md5: ca762a287c6207dea2b3276bb71615f8 Text-content-sha1: f2295c2d634a4f7928bb06437f9395973bd4b98c Content-length: 130 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN)-@1@D=x1www.tprinteractive.com/goldeneye/putty/">tprinteractive.com Revision-number: 3909 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2004-02-26T20:52:34.000000Z K 7 svn:log V 61 Latest updates. Office 2002 hypothesis is out of the window. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/hard-hangs Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 49bedf61b5413ea053ff60c9d69f0cc8 Text-delta-base-sha1: 66891631663d22952650787dc0ac5ab84caf84d1 Text-content-length: 425 Text-content-md5: b290bc00f5cb42578250f9502a875749 Text-content-sha1: 471176ada027d4ccabd60ba3f0f12e794020cf92 Content-length: 464 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNt C?$KM'Stab in the dark: it's not correlated with Visual Studio, is it?

    Once the system has got into this state, an SSH packet log of a new session which hangs might be useful, so we can infer exactly where it's hanging and what it might be doing (since there's been a suggestion that it's some way into the SSH protocol)br>more info: 9AC105024CEA64458BF66D1DE13CA50DDB44ED@tibbemeexs1.eu.jnj.com Revision-number: 3910 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 putty.247available.com (at last!) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-02-26T23:59:17.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ca762a287c6207dea2b3276bb71615f8 Text-delta-base-sha1: f2295c2d634a4f7928bb06437f9395973bd4b98c Text-content-length: 78 Text-content-md5: 97e83319bfd7416b441d76031d0ca05d Text-content-sha1: 8b3e270d0b799167780e0f1ca048c82ff51188da Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVN-+51Iz|1putty.247available.com/putty/">putty.247available.com Revision-number: 3911 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:08.283924Z PROPS-END Revision-number: 3912 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:08.293927Z PROPS-END Revision-number: 3913 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:08.303127Z PROPS-END Revision-number: 3914 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:08.312078Z PROPS-END Revision-number: 3915 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:08.321493Z PROPS-END Revision-number: 3916 Prop-content-length: 217 Content-length: 217 K 7 svn:log V 116 Mention that proxy password is saved in plain text in configuration, since we've had a couple of indignant e-mails. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-01T18:17:34.000000Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7b54d4ebaba8f7f8ccecf81becc980e6 Text-delta-base-sha1: 0195fbc649243555f708f4416c1ad4df86f48380 Text-content-length: 249 Text-content-md5: bddbbaf8c798c606fa6f09111dd99d60 Text-content-sha1: ea1698971e59784ae6164d55c0e91faf3f9ebd15 Content-length: 289 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVN)R[j5& \versionid $Id: config.but,v 1.75 2004/03/01 18:17:34Note that if you save your session, the proxy password will be saved in plain text, so anyone who can access your PuTTY configuration data will be able to discover it Revision-number: 3917 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 17 drafts unexpired K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-01T18:50:47.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 294a5164f69ab821ad4bcb0f910cf70a Text-delta-base-sha1: d41c696907415d08fe6ca0ce128dbb697cb0149d Text-content-length: 56 Text-content-md5: 90d93f721b47442aa0732ba242a749fa Text-content-sha1: f41467bf36c017c6db2bfac6e241d26bd14c0512 Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNC #xK

  • publickeyfile
  • filexfer Revision-number: 3918 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2004-03-01T23:53:18.000000Z K 7 svn:log V 74 Summary: Unix: "expected key exchange reply packet from server" and crash K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-kex-packet Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 911 Text-content-md5: 212eb5cb935a26d7fe849cb250e1ea6f Text-content-sha1: 063210f97c84638a5f206cfb769a23f7fa0fc4c7 Content-length: 1027 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSummary: Unix: "expected key exchange reply packet from server" and crash Present-in: 0.54 Content-type: text/plain We've had a couple of reports of the Unix version putting up the "new host key" dialog, but then immediately putting up a "PuTTY Fatal Error: expected key exchange reply packet from server" error box over it and then crashing. I've reproduced this by connecting to one of our correspondents' servers. If the host key is already in the database, the connection goes through fine. The fault doesn't appear to happen with the Windows version, nor with Unix plink. Reports: 000701c3fd23$4a4626e0$0400a8c0@capricho followup: 000b01c3fd2a$4822cd80$0400a8c0@capricho putty-0.54-0.20040216.3mdk.i586.rpm 40379F51.3030603@glendown.de server appears to be SSH-2.0-3.1.0 SSH Secure Shell (non-commercial) associated with diffie-hellman-group1-sha1 (as opposed to gex)? Revision-number: 3919 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2004-03-02T09:44:33.000000Z K 7 svn:log V 16 putty.lxnt.info K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 97e83319bfd7416b441d76031d0ca05d Text-delta-base-sha1: 8b3e270d0b799167780e0f1ca048c82ff51188da Text-content-length: 52 Text-content-md5: 28af7b4b4c1a775f261ed566932542e4 Text-content-sha1: 52cb846e8c5f0675385a79fd528808a4e4d416af Content-length: 92 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVN+"I@lxnt.info/">putty.lxnt.info Revision-number: 3920 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2004-03-02T09:46:21.000000Z K 7 svn:log V 117 Oops, just found another Russian mirror we were told about in Oct 2002, but seems to be up to date: www.putty.spb.ru K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 28af7b4b4c1a775f261ed566932542e4 Text-delta-base-sha1: 52cb846e8c5f0675385a79fd528808a4e4d416af Text-content-length: 56 Text-content-md5: fac26bc4ed0e117cffa8a5ac399a9f7b Text-content-sha1: 7862742b6fcfec4139ae509c533bad9d124aa096 Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVN #X=www.putty.spb.ru/">www.putty.spb.ru Revision-number: 3921 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2004-03-04T21:24:10.000000Z K 7 svn:log V 87 Mention Links page in ports section, since there are now a number of third-party ports K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8b5f637500fabee272c09a6dd50edaa1 Text-delta-base-sha1: c63e2e52b855450f03f45a13df8dab5d35fcfef5 Text-content-length: 174 Text-content-md5: 7e996aeb2ce812b65d49c3b19b833c21 Text-content-sha1: d1db9eae2b42027177e44253b353d0ade8aa4465 Content-length: 214 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVNr 2aGG\versionid $Id: faq.but,v 1.62 2004/03/04 21:24:10There are some third-party ports to various platforms, mentioned on the Links page of our website Revision-number: 3922 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2004-03-05T19:01:45.000000Z K 7 svn:log V 80 Finally correct REGEDIT syntax for "saving in a file" hack. (verified on Win2K) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bddbbaf8c798c606fa6f09111dd99d60 Text-delta-base-sha1: ea1698971e59784ae6164d55c0e91faf3f9ebd15 Text-content-length: 78 Text-content-md5: 867d8931b52e15c9bfb8aaf25eecf6e3 Text-content-sha1: dff5966a85aff3e56708fd7725867cb64dc0d7a4 Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVNRS 585fl\versionid $Id: config.but,v 1.76 2004/03/05 19:01:45 Revision-number: 3923 Prop-content-length: 199 Content-length: 199 K 7 svn:log V 99 Remove puttypad link, since it seems to have sunk without trace and we keep getting mail about it. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-06T14:01:26.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 90d93f721b47442aa0732ba242a749fa Text-delta-base-sha1: f41467bf36c017c6db2bfac6e241d26bd14c0512 Text-content-length: 20 Text-content-md5: 74204632945d0d2cce77a8a014352ce5 Text-content-sha1: daf457490bee29e0fd54b0931233ed5e00f331ac Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN >b; Revision-number: 3924 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2004-03-06T15:57:51.000000Z K 7 svn:log V 66 Path to gulus.USherbrooke.ca mirror site changed at admin request K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fac26bc4ed0e117cffa8a5ac399a9f7b Text-delta-base-sha1: 7862742b6fcfec4139ae509c533bad9d124aa096 Text-content-length: 77 Text-content-md5: b25b5c7f9df2b72fb85fdf2d35192791 Text-content-sha1: 8e7ba6f26ad22f56bf1a2e8e1aaed495a05aac37 Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVN|4tA@n/appl/ssh/putty/">gulus.usherbrooke.ca in Canada Revision-number: 3925 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:08.822983Z PROPS-END Revision-number: 3926 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:08.835973Z PROPS-END Revision-number: 3927 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2004-03-09T20:27:07.000000Z K 7 svn:log V 48 CallingHome http://callinghome.sourceforge.net/ K 10 svn:author V 4 owen PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 74204632945d0d2cce77a8a014352ce5 Text-delta-base-sha1: daf457490bee29e0fd54b0931233ed5e00f331ac Text-content-length: 141 Text-content-md5: a14c523c2ed0362af5d6fb88be1252ab Text-content-sha1: ccd673205671f8203825daccf4a410e57e34ce07 Content-length: 181 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN  w;wg9li>CallingHome, for maintaining long-running SSH tunnels using PuTTY. Revision-number: 3928 Prop-content-length: 189 Content-length: 189 K 7 svn:log V 89 "PocketPuTTY homepage has been moved to faster server (donated by DUXY.net webhosting)." K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-10T11:46:38.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a14c523c2ed0362af5d6fb88be1252ab Text-delta-base-sha1: ccd673205671f8203825daccf4a410e57e34ce07 Text-content-length: 29 Text-content-md5: d3d99905c5c782a79dc87a7762d63697 Text-content-sha1: 82399e96b843df45368ef34d4ad4b3aeee50f3c0 Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN o#vduxy.net Revision-number: 3929 Prop-content-length: 288 Content-length: 288 K 8 svn:date V 27 2004-03-10T17:11:12.000000Z K 7 svn:log V 188 Make `Copy all to Clipboard' copy all non-empty lines from the scrollback and the terminal to the clipboard, rather than just the content before the cursor. Should fix copyall-to-cursor. K 10 svn:author V 4 owen PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c95fe9725c581372efd9a5fe3f59bda7 Text-delta-base-sha1: 29ab0d94eb07e0d022aaad2de6bcbe8ce80a9e86 Text-content-length: 243 Text-content-md5: 0cd1cbfd6f7f254e5674ef59e7be0354 Text-content-sha1: 52c37d2a2e3176a07d377ef670e2ef9ee39ee7bc Content-length: 284 K 15 cvs2svn:cvs-rev V 5 1.164 PROPS-END SVN() HRHpos bottom; tree234 *screen = term->screen; top.y = -sblines(term); top.x = 0; bottom.y = find_last_nonempty_line(term, screen); bottom.x = term->cols; clipme(term, top, bottom Revision-number: 3930 Prop-content-length: 120 Content-length: 120 K 7 svn:log V 20 ftp.man.szczecin.pl K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-10T19:04:34.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b25b5c7f9df2b72fb85fdf2d35192791 Text-delta-base-sha1: 8e7ba6f26ad22f56bf1a2e8e1aaed495a05aac37 Text-content-length: 284 Text-content-md5: 87a7d6aae3f92ec6cb559e15e3ef0970 Text-content-sha1: 43458a1980ca215c14a901918f7da232e2aa2aa7 Content-length: 324 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVN|yLt*2PyY#man.szczecin.pl/pub/security/software/cryptography/apps/ssh/PuTTY/stable-release/">ftp.man.szczecin.pl in Polandman.szczecin.pl/pub/security/software/cryptography/apps/ssh/PuTTY/nightly-builds/">ftp.man.szczecin.pl in Poland.
  • other good reasons too).

    (Perhaps we've been getting more reports recently because modern BIOI / Windows versions / whatever are more upset by frequent calls to the APM BIOS or whatever it is than older systems?) Revision-number: 3938 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2004-03-17T16:03:03.000000Z K 7 svn:log V 58 Remove GetSystemPowerStatus() - should resolve hard-hangs K 10 svn:author V 4 owen PROPS-END Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 957e73167c170184cf9a23db22dbf16e Text-delta-base-sha1: 00657bb4a0d51a84e16e8ac2b03bac45f3a16e76 Text-content-length: 35 Text-content-md5: be600719720964223bedb45334306065 Text-content-sha1: 5bed23b9f85d2180b547397a8bbb56dec1ea167c Content-length: 75 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNO/&2^ ~6 Revision-number: 3939 Prop-content-length: 278 Content-length: 278 K 8 svn:date V 27 2004-03-18T09:49:56.000000Z K 7 svn:log V 177 GetSystemPowerStatus() call has been removed, so note that in these affected semi-bugs. Don't claim Fixed-In yet, though, as we haven't any reports of it positively going away. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/hard-hangs Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 37daaa409c073966ed248f1aed2e784f Text-delta-base-sha1: 3309c43faf1b84fbbc0a04222be3e8ae7d6ee707 Text-content-length: 218 Text-content-md5: 0ad1aea08a1c39508e19ecff8b74f935 Text-content-sha1: b532870d0ef523701b3813f8194b41d06f414a78 Content-length: 257 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNL B BC This source of noise has now been removed as of 2004-03-18 (there were other good reasons too). Please let us know if this appears to solve (or not!) the problem Node-path: putty-wishlist/data/ntpd-slowdown Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7a4f7855a962097fecddd20c239f4d43 Text-delta-base-sha1: 0a0ea8314e5a5c0289dec2d792fa3dd96b4e91f6 Text-content-length: 233 Text-content-md5: fe0f82a40d329b3f43cd3d27dad480ae Text-content-sha1: 9c13a04f0debd8e2e4c0a23d457cf70cb635e43d Content-length: 272 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNnVV

    Update, 2004-03-18: the GetSystemPowerStatus() call has been removed in an attempt to fix `hard-hangs'. With luck, that should make this problem go away too. Revision-number: 3940 Prop-content-length: 337 Content-length: 337 K 8 svn:date V 27 2004-03-19T19:01:38.000000Z K 7 svn:log V 236 Add wishes for FAQs about auto-reconnect and remembering the password for the same (and indeed remembering passwords at all, to complement the FAQ entry). Also mention the idea of `reuse-windows' being able to kill off a live session. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/reconnect-auto Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 718 Text-content-md5: db0f2003e62d773f40218c62fb0be238 Text-content-sha1: d59e18b9ce3445e528378ffc2930a7ad0cace2fc Content-length: 834 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVN@@@Summary: Reconnect automatically if connection goes down Class: wish Priority: low Depends: reuse-windows Depends: disconnect Difficulty: fun Content-type: text/x-html-body

    Some people would like for PuTTY to have an option to automatically attempt to re-establish a session if it goes does unexpectedly.

    We probably need to be able to reliably detect when disconnections were clean or not first. We'd probably also want to re-use the same window.

    (Some people would like for us to remember the password so they don't have to type it again, but we won't be doing that.) Node-path: putty-wishlist/data/reconnect-remember-password Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 634 Text-content-md5: dee9bb868953db5be0c4aee96fd233a4 Text-content-sha1: 74d6aa02e89a31680eb93783cd2946fc41970c79 Content-length: 750 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNlllSummary: Remember entered password for reconnecting a dead session Depends: reuse-windows Class: wish Priority: never Difficulty: tricky Content-type: text/x-html-body

    Some people would like for PuTTY to remember any password entered, and submit it without the user's intervention in the event of an unclean disconnect (often in conjunction with automatically reconnecting) so they don't have to type it again.

    I don't think we'll be implementing this, for much the same reasons we won't implement storing the password in saved settings. Node-path: putty-wishlist/data/remember-password Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 294 Text-content-md5: 092025bef23327dcf188c1d13e3a03cb Text-content-sha1: 780dda943efee4379a33e48e3f8af9d592d5be93 Content-length: 410 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNSummary: Ability to store password in settings Class: wish Difficulty: tricky Priority: never Content-type: text/x-html-body

    Our rationale for not implementing this feature is set out in the FAQ. Node-path: putty-wishlist/data/reuse-windows Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 97e7a31d0ced9b6ac3d0d559959ede36 Text-delta-base-sha1: c9ad8c9cb0996c7f5570de8df9b2df82f6213ee4 Text-content-length: 316 Text-content-md5: 2a832568dcede7cbac5c3469aea6a563 Text-content-sha1: 1fbcb0168ee774d9ab5dadfe20703b451200a7b9 Content-length: 355 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNB))

    We've had one request for a "Duplicate + Kill" option. Perhaps this would be a sensible behaviour if the new "reconnect" option were invoked on a live session. (With suitable prompting, of course.)

    (Some people would like this to happen automatically.) Revision-number: 3941 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2004-03-19T20:19:06.000000Z K 7 svn:log V 14 more verbiage K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/reconnect-remember-password Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: dee9bb868953db5be0c4aee96fd233a4 Text-delta-base-sha1: 74d6aa02e89a31680eb93783cd2946fc41970c79 Text-content-length: 181 Text-content-md5: 9ab2aa9aa38f5e485cd8a30588937fcf Text-content-sha1: 97a9ac7888341aca5b5d6b0f1af6213e1a96e22a Content-length: 220 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNl "k" We go to some lengths to avoid passwords hanging around in memory, so we're hardly likely to do it deliberately. Revision-number: 3942 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2004-03-19T21:11:20.000000Z K 7 svn:log V 86 Mention Doug Graham's performance tweaks in case we want to investigate them further. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-speedups Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 342 Text-content-md5: eaf43b661f348b6b709c64bf210444db Text-content-sha1: b175e99fe913423b6da109154295bcce018b84d1 Content-length: 458 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNHHHSummary: Further speedups for PSFTP Class: semi-bug Difficulty: tricky We've had some suggestions (and patches) that are claimed to significantly improve PSFTP's throughput, by frobbing Nagle and trying to be clever about how the SSH protocol is broken up into TCP packets. <20040311202215.GA12409@nortelnetworks.com> et seq. Revision-number: 3943 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.751924Z PROPS-END Revision-number: 3944 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.761417Z PROPS-END Revision-number: 3945 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.770337Z PROPS-END Revision-number: 3946 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.780509Z PROPS-END Revision-number: 3947 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.791175Z PROPS-END Revision-number: 3948 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.803218Z PROPS-END Revision-number: 3949 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.882861Z PROPS-END Revision-number: 3950 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2004-03-22T11:03:45.000000Z K 7 svn:log V 103 All the stuff I just sent to Peter Porter should probably go in here too, for everyone else's benefit. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/pageant-async Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d7886e1573a944d227652d1b25e15a66 Text-delta-base-sha1: 668fd676593e1965f753b5f7a002771bcbc2fb17 Text-content-length: 3828 Text-content-md5: d80663a73e21f3ef65e4d2def19f9a5b Text-content-sha1: 0e9983b5e4d6d7990471ed004c32087c7b0a8264 Content-length: 3867 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN`Aa`a

    Update, 2004-03-22: Since I've just written a long mail to one user explaining why this is a difficult problem, it seems sensible to paste it in here too.

    Currently, PuTTY communicates with Pageant by means of sending a Windows message asking for an authentication, and waiting for Pageant's Windows message handler to return success or failure. This is fine as long as Pageant can process every request in negligible time. However, as soon as Pageant starts needing to do anything GUI-related in response to a request (such as putting up a request to ask the user for a passphrase), things get tricky. If Pageant puts up a dialog box, this causes a subsidiary message loop to be run (so that it can receive messages on the dialog box itself), and at the end of that loop it can reply to the original message; the difficulty is what to do if a second PuTTY sends _another_ signature request message which requires another dialog box while the first dialog box is up. Pageant cannot sensibly choose in what order to reply to the messages; it can't accept the new message because then it would have to stop processing any messages on the first dialog; it can't delay accepting the new message because you can't do that with SendMessage events (believe me, I've tried). It has no feasible option except to completely freeze the first dialog and put up a second, which just isn't acceptable (particularly if the two requests were for the _same_ key, in which case obviously what it really wants to do is finish asking for the passphrase the first time and then reply to both requests).

    So a wholly new mechanism is required. Options include:

    • Rather than Pageant replying to the sign request as its reply to the Windows message, it could reply in some other way, such as by sending a separate Windows message back. Fine for PuTTY; not so fine for Plink, which doesn't currently require a window at all and would now have to open one.
    • Alternatively, perhaps there's some other kind of synchronisation object that could be passed through the shared memory used in the Windows message (a semaphore or some such) which Pageant could signal when it had filled in the request.
    • Alternatively again, there's the option of abandoning Windows messages completely and going for a solution involving some completely other Windows IPC mechanism. I'm not sure what the options are here; the fact that Cygwin's OpenSSH-derived agent (which is presumably compiled from the standard Unix OpenSSH code which uses Unix-domain sockets) works at all suggests that at least one suitable mechanism exists, but I haven't as yet read the source of the Cygwin library to see how it fakes Unix-domain sockets.
    • While we're here, the security properties must be maintained. Windows messages don't use user-based access control: any process with access to your GUI display can send messages to your other windows, and it's not always the case that all processes running on your display are running as the same user (the NT/2k machines at my office, for example, have RSH daemons that sometimes put up windows which are owned by another user). The current Windows- message communication works by passing a shared memory handle through the Windows message, and the permissions and ownership on that shared memory handle are used to implement the required security. Any replacement solution would need to do at least as well, or it would be unsuitable for any NT-class OS.
    • So, this is a pretty open question, and as far as I know there aren't any easy answers (certainly no answers easy enough for me to have spotted them already, and I have spent some time thinking about this). If this could be solved, everything else in the area of Pageant enhancements would be simple by comparison.
    Revision-number: 3951 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.968921Z PROPS-END Revision-number: 3952 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.978505Z PROPS-END Revision-number: 3953 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.989047Z PROPS-END Revision-number: 3954 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:09.998970Z PROPS-END Revision-number: 3955 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:10.009211Z PROPS-END Revision-number: 3956 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2004-03-24T13:58:02.000000Z K 7 svn:log V 17 Mention PuTTYcyg K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d3d99905c5c782a79dc87a7762d63697 Text-delta-base-sha1: 82399e96b843df45368ef34d4ad4b3aeee50f3c0 Text-content-length: 153 Text-content-md5: 5ef0d095bc6bedc13ade009b1f610a1e Text-content-sha1: f5aaab67c9a56eb48adb6a7f9edd7da0f96fbcca Content-length: 193 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN4 :y!gecko.gc.maricopa.edu/~medgar/puttycyg/"> PuTTYcyg, to use PuTTY as a terminal for Cygwin Revision-number: 3957 Prop-content-length: 300 Content-length: 300 K 7 svn:log V 199 Mention PuTTYcyg in `win-command-prompt', and add Simon's general design thoughts arising from it; link to those from relevant other feature requests. (These items could probably stand refactoring.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-24T14:09:31.000000Z PROPS-END Node-path: putty-wishlist/data/proxy-command Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 52eec787f107c5315db2aba0e4f27082 Text-delta-base-sha1: 073eb30ade34e33595ab7fb60e883874b6745ab5 Text-content-length: 121 Text-content-md5: a9079a16bbc3d2eec1b5d987b4dccdf7 Text-content-sha1: 99c802e7130f351ce6665d7c891e19f31e23ee67 Content-length: 160 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN}a cdcc(see also design discussion in `win-command-prompt') Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9fd5decadec50b32a408762c104fc839 Text-delta-base-sha1: 1f8caff22a01c1817c5222f900d3044aff4e2ea6 Text-content-length: 119 Text-content-md5: dd1d71faeae257932592dbb0cebc21c2 Text-content-sha1: aee2d58d9bfffb5adf40e8f50a2f8b786c67b766 Content-length: 158 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNzb a8aI1See also design discussion in `win-command-prompt' Node-path: putty-wishlist/data/win-command-prompt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d8f46175079ad65e347b2cf6c0e57007 Text-delta-base-sha1: 56896e91a346752afe9fff632cc4f47008613110 Text-content-length: 2437 Text-content-md5: 9a91e646e6b344e483acd2f0cff4cf71 Text-content-sha1: be029d14c70726321b26ed689f20a04e353fc485 Content-length: 2476 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN rr

    Mark Edgar has created PuTTYcyg, which allows PuTTY to act as a terminal for Cygwin (with the aid of a helper application linked against Cygwin). (further discussion in 4032C9DD.4000202@student.gc.maricopa.edu)

    Simon's reaction:

    This certainly looks believable enough for the moment.
    
    What I'd _like_ to do is to set up a more general mechanism for
    having PuTTY monitor Windows file descriptors as well as network
    sockets. This would be useful for supporting the OpenSSH-like
    ProxyCommand function (for example running PuTTY over a secondary
    Plink), and for talking to serial ports; and it would _also_ be an
    interesting alternative approach to your problem, since we could
    arrange to run (something like) cthelper with a group of pipes
    rather than local network connections.
    
    If we were to do this, it would open up two or three possible
    avenues of implementation for your feature:
    
     (a) cthelper works roughly as it now does, with two data channels
         from PuTTY to it so that data and screen resizes can be
         separated. They could now be pipes rather than network sockets,
         but this would still require an extra back end in PuTTY.
    
     (b) If cthelper were to speak (a reasonably small subset of) the
         Telnet protocol on its stdin/stdout, then it might be possible
         to do this _without_ any modifications to PuTTY once I
         implement proxy commands: you would supply `cthelper' as a
         proxy command, and select Telnet as the protocol (the host and
         port would then become unimportant). Then cthelper could
         separate the incoming Telnet stream into screen resize events
         and data, perform minimal Telnet encoding on the data it sent
         back, and your code could be completely independent of changes
         to mine.
    
     (c) I'd also quite like to implement a DLL plugin interface; I've
         been wanting to do this for a while but recently there have
         been some slightly more immediate reasons for wanting it. It
         would obviously be good to have DLL plugins be able to add
         extra back ends, so possibly that would be a good approach.
    
    For the moment, though, yours looks entirely workable and I'll have
    to give it a try...
    
    Revision-number: 3958 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2004-03-24T14:10:13.000000Z K 7 svn:log V 91 Mention Peter Heslin's lengthy response to this, which I've not attempted to digest (yet). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xterm-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0a97a0e1c9c8e44bd926bfe26b3227e6 Text-delta-base-sha1: fbe8b15bbfd53fe3e980b4abb8eb707c91dfba51 Text-content-length: 125 Text-content-md5: 400c32c40fa527bf21d19a092ba53a24 Text-content-sha1: fa731478f508112e8ae15b160136dc10d10ee2f2 Content-length: 164 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN?. i|iIvem>Update: A lengthy response to this item: 20040221234425.GA18710@heslin.eclipse.co.uk Revision-number: 3959 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2004-03-24T14:10:24.000000Z K 7 svn:log V 14 another patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-progress Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 75d7dddff47911ad789343291bb01808 Text-delta-base-sha1: 4dcbd47673b98a74eeeb38a00daf470f11bcff83 Text-content-length: 91 Text-content-md5: be06084a99bce60258b289cdf64da180 Text-content-sha1: e29c5fdf5f900857567320f752a1c9e2e35c898f Content-length: 130 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNcJJ Another (unreviewed): 20040228014634.41649.qmail@web10102.mail.yahoo.com Revision-number: 3960 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2004-03-24T14:13:34.000000Z K 7 svn:log V 14 more analysis K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/short-rsa2-key-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6713047a07691a20aeafaf6789a7e178 Text-delta-base-sha1: c441058c65156120a9f9011797363ca7f6121f0b Text-content-length: 1402 Text-content-md5: cac4c631ad991b317ec6aa0a26df1927 Text-content-sha1: 647406da4a80e5e2f127a70e8d0d90c9734998fd Content-length: 1441 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNC eY^5 Summary: Short RSA2 key causes PuTTY crash Class: bug Priority: medium Difficulty: tricky ----- More analysis: > Looking at rsa2_sign(), if the RSA modulus of the key is too small, we > can't fit in the padding, ASN1 goop and hash, but the loop is merrily > attempting to cram it all in anyway, overrunning the malloced block and > (apparently) causing fruity stack badness. *nods* Yes, I managed to trace that much myself. The trouble is not that I don't know the cause of the problem, but more that I don't know how best to fix it. [...] the plausible options are (a) reject the key when PuTTY attempts to load it, or (b) return failure and a useful error message from the sign operation. I'm undecided between those two; (a) is nice from the point of view of detecting and reporting any error condition at the earliest possible moment, but (b) feels a little more robust since the check can be performed in the _same_ code that will then go and use the buffer space - so rather than having to keep two pieces of similar-looking code in sync, there's just one piece of code which is likely to keep naturally in sync with itself. Either one, however, requires some infrastructure change to support, which is why I didn't fix it before the 0.54 release. (Quite why anyone's using 256-bit keys _anyway_ is beyond me, but these days no weird user behaviour is a surprise to me.) Revision-number: 3961 Prop-content-length: 105 Content-length: 105 K 7 svn:log V 6 patch K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-24T14:14:11.000000Z PROPS-END Node-path: putty-wishlist/data/mdpi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f7c73a45233901228650a76e7ff58be0 Text-delta-base-sha1: 996fd29538771f145271010087446b64988bb129 Text-content-length: 71 Text-content-md5: 07f347709bc8c16b72c1ac6688646f8d Text-content-sha1: 0f4a09032e590fb8598686aaac349635bf3ace21 Content-length: 110 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNW7W

    Patch (unreviewed): 404DDD77.9010501@nodomain.org Node-path: putty-wishlist/data/telnet-url-userinfo Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d3f18bb60a10c5494d7247a6b9647f67 Text-delta-base-sha1: 3157e23cfabe07d9a217b9963a203b9050f8bc38 Text-content-length: 94 Text-content-md5: 43d70a4eddbc603563209318e7d26eb1 Text-content-sha1: 9fbc156db050147d580a53058753af83f8955320 Content-length: 133 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN!nM!M

    Patch (unreviewed, Unix only): 20040215182103.GA3208@impropriety.org.uk Revision-number: 3962 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2004-03-24T14:52:09.000000Z K 7 svn:log V 96 Thomas Henlich's bug report and fix for dead keys. 20040323143836.GA40414@rcs.urz.tu-dresden.de K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/keyboard-problems Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 420479da5e8ae089e1a6684e0c060fd7 Text-delta-base-sha1: f47e57fb94b952cf9c1b05d0cd4db4b558051e26 Text-content-length: 499 Text-content-md5: 515ae057f1ae1600a14bc9651193f25c Text-content-sha1: 9071456f8e314b83db50a8d7f221c4fd1b65c804 Content-length: 538 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN{%XA.5 onSummary: Problems with various keyboard layouts / IME (Although to get any fixes rolled in, you'll probably need to convince us that it won't break for anyone else's keyboard layout, and that it works across all the Windows versions we support.)

    (Some of the items below have been on this list for a very long time, and may in fact have been fixed.)

    There's a fix for dead keys that might make some of this stuff go away. Node-path: putty-wishlist/data/win-dead-keys Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1094 Text-content-md5: 247369fffc0bbc4b653608a373a3a80c Text-content-sha1: 510275da03e9dbfcc6c92674558618b428829a2c Content-length: 1210 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN888Summary: Trouble with dead keys on Windows Class: bug Difficulty: tricky Priority: medium Fixed-in: 2004-03-25 Content-type: text/x-html-body

    When using a keyboard layout that uses dead keys (such as German, or US International), entering a non-composing sequence (such as a pair of circumflexes), such that the second keypress resulted in two characters, gave the wrong result (the second character was wrong).

    Changing the lpChar argument of ToAsciiEx from WORD[] to BYTE[], and using a pointer cast, makes it work properly. The documentation isn't clear what type the storage behind the pointer should be, but Googling indicates that this usage is not uncommon.

    Fix tested on Win2K (and by a third party on WinXP).

    This may sort out some other keyboard problems people have been having, too, if we're lucky. Revision-number: 3963 Prop-content-length: 328 Content-length: 328 K 8 svn:date V 27 2004-03-24T14:53:51.000000Z K 7 svn:log V 227 Fix from Thomas Henlich for bug in dead key support. I've reproduced the problem and verified the fix on Win2K with the US-International keyboard layout. (Closes: `win-dead-keys') <20040323143836.GA40414@rcs.urz.tu-dresden.de> K 10 svn:author V 5 jacob PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e3b6b918be1ae491bbd2acf5081fb6c9 Text-delta-base-sha1: 3b21efb01d3c32084efeb5979aa721a4b125bc8b Text-content-length: 866 Text-content-md5: b3cf6d37c2eebfed7aa52100d6460628 Text-content-sha1: a794fe2fe77b72329e89639db941407f36fa27ee Content-length: 907 K 15 cvs2svn:cvs-rev V 5 1.261 PROPS-END SVN-bU`mXs/* keys is for ToAsciiEx; XXX do we know how big this needs to be? */ static BYTE/* 'keys' parameter is declared in MSDN documentation as * 'LPWORD lpChar'. In 0.54 and below we took that to mean that * 'keys' should be an array of WORD, but an array of BYTE works * better on keyboard with dead keys, at least for Win2K/US- * International and WinXP/German. Bletch. */ r = ToAsciiEx(wParam, scan, keystate, (LPWORD) || (compose_char, ch)) == -1) { MessageBeep(MB_ICONHAND); return 0; } keybuf = nc; term_seen_key_event(term); luni_send(ldisc, &keybuf, 1, 1); continue; } compose_state = 0; if (!key_down) { if (alt_sum) { if (in_utf(term) || ucsdata.dbcs_screenfont) { keybuf = alt_sum; term_seen_key_event(term); luni_send(l Revision-number: 3964 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2004-03-24T15:02:00.000000Z K 7 svn:log V 44 Mention that feedback would be appreciated. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-dead-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 247369fffc0bbc4b653608a373a3a80c Text-delta-base-sha1: 510275da03e9dbfcc6c92674558618b428829a2c Text-content-length: 182 Text-content-md5: bb3c592c8eb841ddb0b309c67dee29d9 Text-content-sha1: db034f37a86f00c166fff748cca66cab49cf04df Content-length: 221 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN8Z#7# If it fixes a problem for you, we'd appreciate you letting us know. (Alternatively, if it makes things worse, then we definitely want to know!) Revision-number: 3965 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:10.659995Z PROPS-END Revision-number: 3966 Prop-content-length: 454 Content-length: 454 K 8 svn:date V 27 2004-03-24T19:36:04.000000Z K 7 svn:log V 353 Now that Halibut is capable of generating man pages better than I can do it by hand, I've converted the man page set from Unix PuTTY into Halibut format, and enhanced the Makefile so it will build them. At some future point this will also allow me to include the man pages as an appendix in the main manual (once I _have_ a main manual for Unix PuTTY). K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 78 Content-length: 78 K 10 svn:ignore V 46 *.html *.txt *.cnt *.hlp *.gid *.GID *.log *.1 PROPS-END Node-path: putty/doc/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5d813ea94fad14ad290524a75a0344b4 Text-delta-base-sha1: 13422a64ffa25e5c89d8d6a2d265746a711a6374 Text-content-length: 57 Text-content-md5: 4611bdeff0175ed3eef93924d64eec1b Text-content-sha1: 7599e141fe57e2f404847e1be0cd352042d74b05 Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN+//*.html *.txt *.cnt *.hlp *.gid *.GID *.log *.1 Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a757b8dcedc2e547a0d9ba2efe7e977d Text-delta-base-sha1: e316e5a361062095ce409089251d80a4af10bb16 Text-content-length: 557 Text-content-md5: 2a5b06ca3c6a170f2cf7c071c39416db Text-content-sha1: 4a68d807f23d2d7e89f81bda3b766d8f48d6b6a0 Content-length: 597 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNq` I~all: Contents.html manMKMAN = $(HOME)/src/halibut/build/halibut mancfg.but $< && mv output.1 $@ MANPAGES = putty.1 puttygen.1 plink.1 pscp.1 psftp.1 puttytel.1 pterm.1 man: $(MANPAGES) putty.1: man-putt.but mancfg.but; $(MKMAN) puttygen.1: man-pg.but mancfg.but; $(MKMAN) plink.1: man-pl.but mancfg.but; $(MKMAN) pscp.1: man-pscp.but mancfg.but; $(MKMAN) psftp.1: man-psft.but mancfg.but; $(MKMAN) puttytel.1: man-ptel.but mancfg.but; $(MKMAN) pterm.1: man-pter.but mancfg.but; $(MKMAN) clean: rm -f *.html *.txt *.hlp *.cnt *.1 Node-path: putty/doc/man-pg.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5728 Text-content-md5: 2acd4c8ad01b8884719c987716e50c94 Text-content-sha1: 309ab7fff4f9494f082d66586a4568ea46d3ee5b Content-length: 5844 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNRRR\cfg{man-identity}{puttygen}{1}{2004-03-24}{PuTTY tool suite}{PuTTY tool suite} \H{puttygen-manpage} Man page for PuTTYgen \S{puttygen-manpage-name} NAME \cw{puttygen} - public-key generator for the PuTTY tools \S{puttygen-manpage-synopsis} SYNOPSIS \c puttygen ( keyfile | -t keytype [ -b bits ] ) \e bbbbbbbb iiiiiii bb iiiiiii bb iiii \c [ -C new-comment ] [ -P ] \e bb iiiiiiiiiii bb \c [ -O output-type | -l | -L | -p ] \e bb iiiiiiiiiii bb bb bb \c [ -o output-file ] \e bb iiiiiiiiiii \S{puttygen-manpage-description} DESCRIPTION \c{puttygen} is a tool to generate and manipulate SSH public and private key pairs. It is part of the PuTTY suite, although it can also interoperate with the private key formats used by some other SSH clients. When you run \c{puttygen}, it does three things. Firstly, it either loads an existing key file (if you specified \e{keyfile}), or generates a new key (if you specified \e{keytype}). Then, it optionally makes modifications to the key (changing the comment and/or the passphrase); finally, it outputs the key, or some information about the key, to a file. All three of these phases are controlled by the options described in the following section. \S{puttygen-manpage-options} OPTIONS In the first phase, \c{puttygen} either loads or generates a key. The options to control this are: \dt \e{keyfile} \dd Specify a private key file to be loaded. This private key file can be in the (de facto standard) SSH1 key format, or in PuTTY's SSH2 key format, or in either of the SSH2 private key formats used by OpenSSH and ssh.com's implementation. \dt \cw{\-t} \e{keytype} \dd Specify a type of key to generate. The acceptable values here are \c{rsa} and \c{dsa} (to generate SSH2 keys), and \c{rsa1} (to generate SSH1 keys). \dt \cw{\-b} \e{bits} \dd Specify the size of the key to generate, in bits. Default is 1024. In the second phase, \c{puttygen} optionally alters properties of the key it has loaded or generated. The options to control this are: \dt \cw{\-C} \e{new\-comment} \dd Specify a comment string to describe the key. This comment string will be used by PuTTY to identify the key to you (when asking you to enter the passphrase, for example, so that you know which passphrase to type). \dt \cw{\-P} \dd Indicate that you want to change the key's passphrase. This is automatic when you are generating a new key, but not when you are modifying an existing key. In the third phase, \c{puttygen} saves the key or information about it. The options to control this are: \dt \cw{\-O} \e{output\-type} \dd Specify the type of output you want \c{puttygen} to produce. Acceptable options are: \lcont{ \dt \cw{private} \dd Save the private key in a format usable by PuTTY. This will either be the standard SSH1 key format, or PuTTY's own SSH2 key format. \dt \cw{public} \dd Save the public key only. For SSH1 keys, the standard public key format will be used (\q{\cw{1024 37 5698745}...}). For SSH2 keys, the public key will be output in the format specified in the IETF drafts, which is a multi-line text file beginning with the line \q{\cw{---- BEGIN SSH2 PUBLIC KEY ----}}. \dt \cw{public-openssh} \dd Save the public key only, in a format usable by OpenSSH. For SSH1 keys, this output format behaves identically to \c{public}. For SSH2 keys, the public key will be output in the OpenSSH format, which is a single line (\q{\cw{ssh-rsa AAAAB3NzaC1yc2}...}). \dt \cw{fingerprint} \dd Print the fingerprint of the public key. All fingerprinting algorithms are believed compatible with OpenSSH. \dt \cw{private-openssh} \dd Save an SSH2 private key in OpenSSH's format. This option is not permitted for SSH1 keys. \dt \cw{private-sshcom} \dd Save an SSH2 private key in ssh.com's format. This option is not permitted for SSH1 keys. If no output type is specified, the default is \c{private}. } \dt \cw{\-o} \e{output\-file} \dd Specify the file where \c{puttygen} should write its output. If this option is not specified, \c{puttygen} will assume you want to overwrite the original file if the input and output file types are the same (changing a comment or passphrase), and will assume you want to output to stdout if you are asking for a public key or fingerprint. Otherwise, the \c{\-o} option is required. \dt \cw{\-l} \dd Synonym for \q{\cw{-O fingerprint}}. \dt \cw{\-L} \dd Synonym for \q{\cw{-O public-openssh}}. \dt \cw{\-p} \dd Synonym for \q{\cw{-O public}}. \S{puttygen-manpage-examples} EXAMPLES To generate an SSH2 RSA key pair and save it in PuTTY's own format (you will be prompted for the passphrase): \c puttygen -t rsa -C "my home key" -o mykey.ppk To generate a larger (2048-bit) key: \c puttygen -t rsa -b 2048 -C "my home key" -o mykey.ppk To change the passphrase on a key (you will be prompted for the old and new passphrases): \c puttygen -P mykey.ppk To change the comment on a key: \c puttygen -C "new comment" mykey.ppk To convert a key into OpenSSH's private key format: \c puttygen mykey.ppk -O private-openssh -o my-openssh-key To convert a key \e{from} another format (\c{puttygen} will automatically detect the input key type): \c puttygen my-ssh.com-key -o mykey.ppk To display the fingerprint of a key (some key types require a passphrase to extract even this much information): \c puttygen -l mykey.ppk To add the OpenSSH-format public half of a key to your authorised keys file: \c puttygen -L mykey.ppk >> $HOME/.ssh/authorized_keys \S{puttygen-manpage-bugs} BUGS There's currently no way to supply passphrases in batch mode, or even just to specify that you don't want a passphrase at all. Node-path: putty/doc/man-pl.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3232 Text-content-md5: 748e579e29e373da48ad23ac5c06a57e Text-content-sha1: c6475b6b493bae45aa2eb0a58ce2b3ccdde492fe Content-length: 3348 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN\cfg{man-identity}{plink}{1}{2004-03-24}{PuTTY tool suite}{PuTTY tool suite} \cfg{man-mindepth}{1} \H{plink-manpage} Man page for Plink \S{plink-manpage-name} NAME \cw{plink} \- PuTTY link, command line network connection tool \S{plink-manpage-synopsis} SYNOPSIS \c plink [options] [user@]host [command] \e bbbbb iiiiiii iiiib iiii iiiiiii \S{plink-manpage-description} DESCRIPTION \cw{plink} is a network connection tool supporting several protocols. \S{plink-manpage-options} OPTIONS The command-line options supported by \cw{plink} are: \dt \cw{-v} \dd Show verbose messages. \dt \cw{-load} \e{session} \dd Load settings from saved session. \dt \cw{-ssh} \dd Force use of SSH protocol (default). \dt \cw{-telnet} \dd Force use of Telnet protocol. \dt \cw{-rlogin} \dd Force use of rlogin protocol. \dt \cw{-raw} \dd Force raw mode. \dt \cw{-P} \e{port} \dd Connect to port \e{port}. \dt \cw{-l} \e{user} \dd Set remote username to \e{user}. \dt \cw{-m} \e{path} \dd Read remote command(s) from local file \e{path}. \dt \cw{-batch} \dd Disable interactive prompts. \dt \cw{-pw} \e{password} \dd Set remote password to \e{password}. \dt \cw{\-L} \cw{[}\e{srcaddr}\cw{:]}\e{srcport}\cw{:}\e{desthost}\cw{:}\e{destport} \dd Set up a local port forwarding: listen on \e{srcport} (or \e{srcaddr}:\e{srcport} if specified), and forward any connections over the SSH connection to the destination address \e{desthost}:\e{destport}. Only works in SSH. \dt \cw{\-R} \cw{[}\e{srcaddr}\cw{:]}\e{srcport}\cw{:}\e{desthost}\cw{:}\e{destport} \dd Set up a remote port forwarding: ask the SSH server to listen on \e{srcport} (or \e{srcaddr}:\e{srcport} if specified), and to forward any connections back over the SSH connection where the client will pass them on to the destination address \e{desthost}:\e{destport}. Only works in SSH. \dt \cw{\-D} [\e{srcaddr}:]\e{srcport} \dd Set up dynamic port forwarding. The client listens on \e{srcport} (or \e{srcaddr}:\e{srcport} if specified), and implements a SOCKS server. So you can point SOCKS-aware applications at this port and they will automatically use the SSH connection to tunnel all their connections. Only works in SSH. \dt \cw{-X} \dd Enable X11 forwarding. \dt \cw{-x} \dd Disable X11 forwarding (default). \dt \cw{-A} \dd Enable agent forwarding. \dt \cw{-a} \dd Disable agent forwarding (default). \dt \cw{-t} \dd Enable pty allocation (default if a command is NOT specified). \dt \cw{-T} \dd Disable pty allocation (default if a command is specified). \dt \cw{-1} \dd Force use of SSH protocol version 1. \dt \cw{-2} \dd Force use of SSH protocol version 2. \dt \cw{-C} \dd Enable SSH compression. \dt \cw{-i} \e{path} \dd Private key file for authentication. \dt \cw{-s} \dd Remote command is SSH subsystem (SSH-2 only). \S{plink-manpage-more-information} MORE INFORMATION For more information on plink, it's probably best to go and look at the manual on the PuTTY web page: \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/}\cw{http://www.chiark.greenend.org.uk/~sgtatham/putty/} \S{plink-manpage-bugs} BUGS This man page isn't terribly complete. See the above web link for better documentation. Node-path: putty/doc/man-pscp.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1981 Text-content-md5: b46736162e8b263edc3d9fd606451c18 Text-content-sha1: 8fd817e0980110fd81629beab06584122d610456 Content-length: 2097 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN///\cfg{man-identity}{pscp}{1}{2004-03-24}{PuTTY tool suite}{PuTTY tool suite} \H{pscp-manpage} Man page for PSCP \S{pscp-manpage-name} NAME \cw{pscp} \- command-line SCP (secure copy) / SFTP client \S{pscp-manpage-synopsis} SYNOPSIS \c pscp [options] [user@]host:source target \e bbbb iiiiiii iiiib iiiibiiiiii iiiiii \c pscp [options] source [source...] [user@]host:target \e bbbb iiiiiii iiiiii iiiiii iiiib iiiibiiiiii \c pscp [options] -ls [user@]host:filespec \e bbbb iiiiiii bbb iiiib iiiibiiiiiiii \S{pscp-manpage-description} DESCRIPTION \cw{pscp} is a command-line client for the SSH-based SCP (secure copy) and SFTP (secure file transfer protocol) protocols. \S{pscp-manpage-options} OPTIONS The command-line options supported by \e{pscp} are: \dt \cw{-ls} \dd Remote directory listing. \dt \cw{-p} \dd Preserve file attributes. \dt \cw{-q} \dd Quiet, don't show statistics. \dt \cw{-r} \dd Copy directories recursively. \dt \cw{-unsafe} \dd Allow server-side wildcards (DANGEROUS). \dt \cw{-v} \dd Show verbose messages. \dt \cw{-load} \e{session} \dd Load settings from saved session. \dt \cw{-P} \e{port} \dd Connect to port \e{port}. \dt \cw{-l} \e{user} \dd Set remote username to \e{user}. \dt \cw{-batch} \dd Disable interactive prompts. \dt \cw{-pw} \e{password} \dd Set remote password to \e{password}. \dt \cw{-1} \dd Force use of SSH protocol version 1. \dt \cw{-2} \dd Force use of SSH protocol version 2. \dt \cw{-C} \dd Enable SSH compression. \dt \cw{-i} \e{path} \dd Private key file for authentication. \S{pscp-manpage-more-information} MORE INFORMATION For more information on \cw{pscp} it's probably best to go and look at the manual on the PuTTY web page: \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/}\cw{http://www.chiark.greenend.org.uk/~sgtatham/putty/} \S{pscp-manpage-bugs} BUGS This man page isn't terribly complete. See the above web link for better documentation. Node-path: putty/doc/man-psft.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1755 Text-content-md5: 8fa8de28b2f4d7370d8261443e33eeda Text-content-sha1: 45c099e8ca70108b9e87b591f3e48d9a9a33d65c Content-length: 1871 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNMMM\cfg{man-identity}{psftp}{1}{2004-03-24}{PuTTY tool suite}{PuTTY tool suite} \H{psftp-manpage} Man page for PSFTP \S{psftp-manpage-name} NAME \cw{psftp} \- interactive SFTP (secure file transfer protocol) client \S{psftp-manpage-synopsis} SYNOPSIS \c psftp [options] [user@]host \e bbbbb iiiiiii iiiib iiii \S{psftp-manpage-description} DESCRIPTION \cw{psftp} is an interactive text-based client for the SSH-based SFTP (secure file transfer) protocol. \S{psftp-manpage-options} OPTIONS The command-line options supported by \cw{psftp} are: \dt \cw{-b} \e{batchfile} \dd Use specified batchfile. \dt \cw{-bc} \dd Output batchfile commands. \dt \cw{-be} \dd Don't stop batchfile processing on errors. \dt \cw{-v} \dd Show verbose messages. \dt \cw{-load} \e{session} \dd Load settings from saved session. \dt \cw{-P} \e{port} \dd Connect to port \e{port}. \dt \cw{-l} \e{user} \dd Set remote username to \e{user}. \dt \cw{-batch} \dd Disable interactive prompts. \dt \cw{-pw} \e{password} \dd Set remote password to \e{password}. \dt \cw{-1} \dd Force use of SSH protocol version 1. \dt \cw{-2} \dd Force use of SSH protocol version 2. \dt \cw{-C} \dd Enable SSH compression. \dt \cw{-i} \e{path} \dd Private key file for authentication. \S{psftp-manpage-commands} COMMANDS For a list of commands available inside \cw{psftp}, type \cw{help} at the \cw{psftp>} prompt. \S{psftp-manpage-more-information} MORE INFORMATION For more information on \cw{psftp} it's probably best to go and look at the manual on the PuTTY web page: \cw{http://www.chiark.greenend.org.uk/~sgtatham/putty/} \S{psftp-manpage-bugs} BUGS This man page isn't terribly complete. See the above web link for better documentation. Node-path: putty/doc/man-ptel.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 5969 Text-content-md5: b1a717d5c8188a9855c9bc32c485fa3b Text-content-sha1: 5af01dfe1dd246671321f1bc1c5306c2b914676e Content-length: 6085 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNCCC\cfg{man-identity}{puttytel}{1}{2004-03-24}{PuTTY tool suite}{PuTTY tool suite} \H{puttytel-manpage} Man page for PuTTYtel \S{puttytel-manpage-name} NAME \cw{puttytel} \- GUI Telnet and Rlogin client for X \S{puttytel-manpage-synopsis} SYNOPSIS \c puttytel [ options ] [ host ] \e bbbbbbbb iiiiiii iiii \S{puttytel-manpage-description} DESCRIPTION \cw{puttytel} is a graphical Telnet and Rlogin client for X. It is a direct port of the Windows Telnet and Rlogin client of the same name, and a cut-down cryptography-free version of PuTTY. \S{puttytel-manpage-options} OPTIONS The command-line options supported by \cw{puttytel} are: \dt \cw{\-\-display} \e{display\-name} \dd Specify the X display on which to open \cw{puttytel}. (Note this option has a double minus sign, even though none of the others do. This is because this option is supplied automatically by GTK. Sorry.) \dt \cw{\-fn} \e{font-name} \dd Specify the font to use for normal text displayed in the terminal. \dt \cw{\-fb} \e{font-name} \dd Specify the font to use for bold text displayed in the terminal. If the \cw{BoldAsColour} resource is set to 1 (the default), bold text will be displayed in different colours instead of a different font, so this option will be ignored. If \cw{BoldAsColour} is set to 0 and you do not specify a bold font, \cw{puttytel} will overprint the normal font to make it look bolder. \dt \cw{\-fw} \e{font-name} \dd Specify the font to use for double-width characters (typically Chinese, Japanese and Korean text) displayed in the terminal. \dt \cw{\-fwb} \e{font-name} \dd Specify the font to use for bold double-width characters (typically Chinese, Japanese and Korean text). Like \cw{-fb}, this will be ignored unless the \cw{BoldAsColour} resource is set to 0. \dt \cw{\-geometry} \e{geometry} \dd Specify the size of the terminal, in rows and columns of text. See \e{X(7)} for more information on the syntax of geometry specifications. \dt \cw{\-sl} \e{lines} \dd Specify the number of lines of scrollback to save off the top of the terminal. \dt \cw{\-fg} \e{colour} \dd Specify the foreground colour to use for normal text. \dt \cw{\-bg} \e{colour} \dd Specify the background colour to use for normal text. \dt \cw{\-bfg} \e{colour} \dd Specify the foreground colour to use for bold text, if the \cw{BoldAsColour} resource is set to 1 (the default). \dt \cw{\-bbg} \e{colour} \dd Specify the foreground colour to use for bold reverse-video text, if the \cw{BoldAsColour} resource is set to 1 (the default). (This colour is best thought of as the bold version of the background colour; so it only appears when text is displayed \e{in} the background colour.) \dt \cw{\-cfg} \e{colour} \dd Specify the foreground colour to use for text covered by the cursor. \dt \cw{\-cbg} \e{colour} \dd Specify the background colour to use for text covered by the cursor. In other words, this is the main colour of the cursor. \dt \cw{\-title} \e{title} \dd Specify the initial title of the terminal window. (This can be changed under control of the server.) \dt \cw{\-sb\-} or \cw{+sb} \dd Tells \cw{puttytel} not to display a scroll bar. \dt \cw{\-sb} \dd Tells \cw{puttytel} to display a scroll bar: this is the opposite of \cw{\-sb\-}. This is the default option: you will probably only need to specify it explicitly if you have changed the default using the \cw{ScrollBar} resource. \dt \cw{\-log} \e{filename} \dd This option makes \cw{puttytel} log all the terminal output to a file as well as displaying it in the terminal. \dt \cw{\-cs} \e{charset} \dd This option specifies the character set in which \cw{puttytel} should assume the session is operating. This character set will be used to interpret all the data received from the session, and all input you type or paste into \cw{puttytel} will be converted into this character set before being sent to the session. \lcont{ Any character set name which is valid in a MIME header (and supported by \cw{puttytel}) should be valid here (examples are \q{\cw{ISO-8859-1}}, \q{\cw{windows-1252}} or \q{\cw{UTF-8}}). Also, any character encoding which is valid in an X logical font description should be valid (\q{\cw{ibm-cp437}}, for example). \cw{puttytel}'s default behaviour is to use the same character encoding as its primary font. If you supply a Unicode (\cw{iso10646-1}) font, it will default to the UTF-8 character set. Character set names are case-insensitive. } \dt \cw{\-nethack} \dd Tells \cw{puttytel} to enable NetHack keypad mode, in which the numeric keypad generates the NetHack \c{hjklyubn} direction keys. This enables you to play NetHack with the numeric keypad without having to use the NetHack \c{number_pad} option (which requires you to press \q{\cw{n}} before any repeat count). So you can move with the numeric keypad, and enter repeat counts with the normal number keys. \dt \cw{\-help}, \cw{\-\-help} \dd Display a message summarizing the available options. \dt \cw{\-load} \e{session} \dd Load a saved session by name. This allows you to run a saved session straight from the command line without having to go through the configuration box first. \dt \cw{\-telnet}, \cw{\-rlogin}, \cw{\-raw} \dd Select the protocol \cw{puttytel} will use to make the connection. \dt \cw{\-l} \e{username} \dd Specify the username to use when logging in to the server. \dt \cw{\-P} \e{port} \dd Specify the port to connect to the server on. \S{puttytel-manpage-saved-sessions} SAVED SESSIONS Saved sessions are stored in a \cw{.putty/sessions} subdirectory in your home directory. \S{puttytel-manpage-more-information} MORE INFORMATION For more information on PuTTY and PuTTYtel, it's probably best to go and look at the manual on the web page: \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/}\cw{http://www.chiark.greenend.org.uk/~sgtatham/putty/} \S{puttytel-manpage-bugs} BUGS This man page isn't terribly complete. Node-path: putty/doc/man-pter.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 24266 Text-content-md5: 99998a3166fda47809ebc7c6e7556671 Text-content-sha1: e08599042093846d54a10f729ff578defd846b37 Content-length: 24382 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN999\cfg{man-identity}{pterm}{1}{2004-03-24}{PuTTY tool suite}{PuTTY tool suite} \H{pterm-manpage} Man page for pterm \S{pterm-manpage-name} NAME pterm \- yet another X terminal emulator \S{pterm-manpage-synopsis} SYNOPSIS \c pterm [ options ] \e bbbbb iiiiiii \S{pterm-manpage-description} DESCRIPTION \cw{pterm} is a terminal emulator for X. It is based on a port of the terminal emulation engine in the Windows SSH client PuTTY. \S{pterm-manpage-options} OPTIONS The command-line options supported by \cw{pterm} are: \dt \cw{\-e} \e{command} [ \e{arguments} ] \dd Specify a command to be executed in the new terminal. Everything on the command line after this option will be passed straight to the \cw{execvp} system call; so if you need the command to redirect its input or output, you will have to use \cw{sh}: \lcont{ \c pterm -e sh -c 'mycommand < inputfile' } \dt \cw{\-\-display} \e{display\-name} \dd Specify the X display on which to open \cw{pterm}. (Note this option has a double minus sign, even though none of the others do. This is because this option is supplied automatically by GTK. Sorry.) \dt \cw{\-name} \e{font-name} \dd Specify the name under which \cw{pterm} looks up X resources. Normally it will look them up as (for example) \cw{pterm.Font}. If you specify \q{\cw{\-name xyz}}, it will look them up as \cw{xyz.Font} instead. This allows you to set up several different sets of defaults and choose between them. \dt \cw{\-fn} \e{font-name} \dd Specify the font to use for normal text displayed in the terminal. \dt \cw{\-fb} \e{font-name} \dd Specify the font to use for bold text displayed in the terminal. If the \cw{BoldAsColour} resource is set to 1 (the default), bold text will be displayed in different colours instead of a different font, so this option will be ignored. If \cw{BoldAsColour} is set to 0 and you do not specify a bold font, \cw{pterm} will overprint the normal font to make it look bolder. \dt \cw{\-fw} \e{font-name} \dd Specify the font to use for double-width characters (typically Chinese, Japanese and Korean text) displayed in the terminal. \dt \cw{\-fwb} \e{font-name} \dd Specify the font to use for bold double-width characters (typically Chinese, Japanese and Korean text). Like \cw{-fb}, this will be ignored unless the \cw{BoldAsColour} resource is set to 0. \dt \cw{\-geometry} \e{geometry} \dd Specify the size of the terminal, in rows and columns of text. See \e{X(7)} for more information on the syntax of geometry specifications. \dt \cw{\-sl} \e{lines} \dd Specify the number of lines of scrollback to save off the top of the terminal. \dt \cw{\-fg} \e{colour} \dd Specify the foreground colour to use for normal text. \dt \cw{\-bg} \e{colour} \dd Specify the background colour to use for normal text. \dt \cw{\-bfg} \e{colour} \dd Specify the foreground colour to use for bold text, if the \cw{BoldAsColour} resource is set to 1 (the default). \dt \cw{\-bbg} \e{colour} \dd Specify the foreground colour to use for bold reverse-video text, if the \cw{BoldAsColour} resource is set to 1 (the default). (This colour is best thought of as the bold version of the background colour; so it only appears when text is displayed \e{in} the background colour.) \dt \cw{\-cfg} \e{colour} \dd Specify the foreground colour to use for text covered by the cursor. \dt \cw{\-cbg} \e{colour} \dd Specify the background colour to use for text covered by the cursor. In other words, this is the main colour of the cursor. \dt \cw{\-title} \e{title} \dd Specify the initial title of the terminal window. (This can be changed under control of the server.) \dt \cw{\-ut\-} or \cw{+ut} \dd Tells \cw{pterm} not to record your login in the \cw{utmp}, \cw{wtmp} and \cw{lastlog} system log files; so you will not show up on \cw{finger} or \cw{who} listings, for example. \dt \cw{\-ut} \dd Tells \cw{pterm} to record your login in \cw{utmp}, \cw{wtmp} and \cw{lastlog}: this is the opposite of \cw{\-ut\-}. This is the default option: you will probably only need to specify it explicitly if you have changed the default using the \cw{StampUtmp} resource. \dt \cw{\-ls\-} or \cw{+ls} \dd Tells \cw{pterm} not to execute your shell as a login shell. \dt \cw{\-ls} \dd Tells \cw{pterm} to execute your shell as a login shell: this is the opposite of \cw{\-ls\-}. This is the default option: you will probably only need to specify it explicitly if you have changed the default using the \cw{LoginShell} resource. \dt \cw{\-sb\-} or \cw{+sb} \dd Tells \cw{pterm} not to display a scroll bar. \dt \cw{\-sb} \dd Tells \cw{pterm} to display a scroll bar: this is the opposite of \cw{\-sb\-}. This is the default option: you will probably only need to specify it explicitly if you have changed the default using the \cw{ScrollBar} resource. \dt \cw{\-log} \e{filename} \dd This option makes \cw{pterm} log all the terminal output to a file as well as displaying it in the terminal. \dt \cw{\-cs} \e{charset} \dd This option specifies the character set in which \cw{pterm} should assume the session is operating. This character set will be used to interpret all the data received from the session, and all input you type or paste into \cw{pterm} will be converted into this character set before being sent to the session. \lcont{ Any character set name which is valid in a MIME header (and supported by \cw{pterm}) should be valid here (examples are \q{\cw{ISO-8859-1}}, \q{\cw{windows-1252}} or \q{\cw{UTF-8}}). Also, any character encoding which is valid in an X logical font description should be valid (\q{\cw{ibm-cp437}}, for example). \cw{pterm}'s default behaviour is to use the same character encoding as its primary font. If you supply a Unicode (\cw{iso10646-1}) font, it will default to the UTF-8 character set. Character set names are case-insensitive. } \dt \cw{\-nethack} \dd Tells \cw{pterm} to enable NetHack keypad mode, in which the numeric keypad generates the NetHack \c{hjklyubn} direction keys. This enables you to play NetHack with the numeric keypad without having to use the NetHack \c{number_pad} option (which requires you to press \q{\cw{n}} before any repeat count). So you can move with the numeric keypad, and enter repeat counts with the normal number keys. \dt \cw{\-xrm} \e{resource-string} \dd This option specifies an X resource string. Useful for setting resources which do not have their own command-line options. For example: \lcont{ \c pterm -xrm 'ScrollbarOnLeft: 1' } \dt \cw{\-help}, \cw{\-\-help} \dd Display a message summarizing the available options. \S{pterm-manpage-x-resources} X RESOURCES \cw{pterm} can be more completely configured by means of X resources. All of these resources are of the form \cw{pterm.FOO} for some \cw{FOO}; you can make \cw{pterm} look them up under another name, such as \cw{xyz.FOO}, by specifying the command-line option \q{\cw{\-name xyz}}. \dt \cw{pterm.CloseOnExit} \dd This option should be set to 0, 1 or 2; the default is 2. It controls what \cw{pterm} does when the process running inside it terminates. When set to 2 (the default), \cw{pterm} will close its window as soon as the process inside it terminates. When set to 0, \cw{pterm} will print the process's exit status, and the window will remain present until a key is pressed (allowing you to inspect the scrollback, and copy and paste text out of it). \lcont{ When this setting is set to 1, \cw{pterm} will close immediately if the process exits cleanly (with an exit status of zero), but the window will stay around if the process exits with a non-zero code or on a signal. This enables you to see what went wrong if the process suffers an error, but not to have to bother closing the window in normal circumstances. } \dt \cw{pterm.WarnOnClose} \dd This option should be set to either 0 or 1; the default is 1. When set to 1, \cw{pterm} will ask for confirmation before closing its window when you press the close button. \dt \cw{pterm.TerminalType} \dd This controls the value set in the \cw{TERM} environment variable inside the new terminal. The default is \q{\cw{xterm}}. \dt \cw{pterm.BackspaceIsDelete} \dd This option should be set to either 0 or 1; the default is 1. When set to 0, the ordinary Backspace key generates the Backspace character (\cw{^H}); when set to 1, it generates the Delete character (\cw{^?}). Whichever one you set, the terminal device inside \cw{pterm} will be set up to expect it. \dt \cw{pterm.RXVTHomeEnd} \dd This option should be set to either 0 or 1; the default is 0. When it is set to 1, the Home and End keys generate the control sequences they would generate in the \cw{rxvt} terminal emulator, instead of the more usual ones generated by other emulators. \dt \cw{pterm.LinuxFunctionKeys} \dd This option can be set to any number between 0 and 5 inclusive; the default is 0. The modes vary the control sequences sent by the function keys; for more complete documentation, it is probably simplest to try each option in \q{\cw{pterm \-e cat}}, and press the keys to see what they generate. \dt \cw{pterm.NoApplicationKeys} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from ever switching the numeric keypad into application mode (where the keys send function-key-like sequences instead of numbers or arrow keys). You probably only need this if some application is making a nuisance of itself. \dt \cw{pterm.NoApplicationCursors} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from ever switching the cursor keys into application mode (where the keys send slightly different sequences). You probably only need this if some application is making a nuisance of itself. \dt \cw{pterm.NoMouseReporting} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from ever enabling mouse reporting mode (where mouse clicks are sent to the application instead of controlling cut and paste). \dt \cw{pterm.NoRemoteResize} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from being able to remotely control the size of the \cw{pterm} window. \dt \cw{pterm.NoAltScreen} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from using the \q{alternate screen} terminal feature, which lets full-screen applications leave the screen exactly the way they found it. \dt \cw{pterm.NoRemoteWinTitle} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, it stops the server from remotely controlling the title of the \cw{pterm} window. \dt \cw{pterm.NoRemoteQTitle} \dd This option should be set to either 0 or 1; the default is 1. When set to 1, it stops the server from remotely requesting the title of the \cw{pterm} window. \lcont{ This feature is a \e{POTENTIAL SECURITY HAZARD}. If a malicious application can write data to your terminal (for example, if you merely \cw{cat} a file owned by someone else on the server machine), it can change your window title (unless you have disabled this using the \cw{NoRemoteWinTitle} resource) and then use this service to have the new window title sent back to the server as if typed at the keyboard. This allows an attacker to fake keypresses and potentially cause your server-side applications to do things you didn't want. Therefore this feature is disabled by default, and we recommend you do not turn it on unless you \e{really} know what you are doing. } \dt \cw{pterm.NoDBackspace} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, it disables the normal action of the Delete (\cw{^?}) character when sent from the server to the terminal, which is to move the cursor left by one space and erase the character now under it. \dt \cw{pterm.ApplicationCursorKeys} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, the default initial state of the cursor keys are application mode (where the keys send function-key-like sequences instead of numbers or arrow keys). When set to 0, the default state is the normal one. \dt \cw{pterm.ApplicationKeypad} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, the default initial state of the numeric keypad is application mode (where the keys send function-key-like sequences instead of numbers or arrow keys). When set to 0, the default state is the normal one. \dt \cw{pterm.NetHackKeypad} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, the numeric keypad operates in NetHack mode. This is equivalent to the \cw{\-nethack} command-line option. \dt \cw{pterm.Answerback} \dd This option controls the string which the terminal sends in response to receiving the \cw{^E} character (\q{tell me about yourself}). By default this string is \q{\cw{PuTTY}}. \dt \cw{pterm.HideMousePtr} \dd This option should be set to either 0 or 1; the default is 0. When it is set to 1, the mouse pointer will disappear if it is over the \cw{pterm} window and you press a key. It will reappear as soon as you move it. \dt \cw{pterm.WindowBorder} \dd This option controls the number of pixels of space between the text in the \cw{pterm} window and the window frame. The default is 1. You can increase this value, but decreasing it to 0 is not recommended because it can cause the window manager's size hints to work incorrectly. \dt \cw{pterm.CurType} \dd This option should be set to either 0, 1 or 2; the default is 0. When set to 0, the text cursor displayed in the window is a rectangular block. When set to 1, the cursor is an underline; when set to 2, it is a vertical line. \dt \cw{pterm.BlinkCur} \dd This option should be set to either 0 or 1; the default is 0. When it is set to 1, the text cursor will blink when the window is active. \dt \cw{pterm.Beep} \dd This option should be set to either 0 or 2 (yes, 2); the default is 0. When it is set to 2, \cw{pterm} will respond to a bell character (\cw{^G}) by flashing the window instead of beeping. \dt \cw{pterm.BellOverload} \dd This option should be set to either 0 or 1; the default is 0. When it is set to 1, \cw{pterm} will watch out for large numbers of bells arriving in a short time and will temporarily disable the bell until they stop. The idea is that if you \cw{cat} a binary file, the frantic beeping will mostly be silenced by this feature and will not drive you crazy. \lcont{ The bell overload mode is activated by receiving N bells in time T; after a further time S without any bells, overload mode will turn itself off again. Bell overload mode is always deactivated by any keypress in the terminal. This means it can respond to large unexpected streams of data, but does not interfere with ordinary command-line activities that generate beeps (such as filename completion). } \dt \cw{pterm.BellOverloadN} \dd This option counts the number of bell characters which will activate bell overload if they are received within a length of time T. The default is 5. \dt \cw{pterm.BellOverloadT} \dd This option specifies the time period in which receiving N or more bells will activate bell overload mode. It is measured in microseconds, so (for example) set it to 1000000 for one second. The default is 2000000 (two seconds). \dt \cw{pterm.BellOverloadS} \dd This option specifies the time period of silence required to turn off bell overload mode. It is measured in microseconds, so (for example) set it to 1000000 for one second. The default is 5000000 (five seconds of silence). \dt \cw{pterm.ScrollbackLines} \dd This option specifies how many lines of scrollback to save above the visible terminal screen. The default is 200. This resource is equivalent to the \cw{\-sl} command-line option. \dt \cw{pterm.DECOriginMode} \dd This option should be set to either 0 or 1; the default is 0. It specifies the default state of DEC Origin Mode. (If you don't know what that means, you probably don't need to mess with it.) \dt \cw{pterm.AutoWrapMode} \dd This option should be set to either 0 or 1; the default is 1. It specifies the default state of auto wrap mode. When set to 1, very long lines will wrap over to the next line on the terminal; when set to 0, long lines will be squashed against the right-hand edge of the screen. \dt \cw{pterm.LFImpliesCR} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, the terminal will return the cursor to the left side of the screen when it receives a line feed character. \dt \cw{pterm.WinTitle} \dd This resource is the same as the \cw{\-T} command-line option: it controls the initial title of the window. The default is \q{\cw{pterm}}. \dt \cw{pterm.TermWidth} \dd This resource is the same as the width part of the \cw{\-geometry} command-line option: it controls the number of columns of text in the window. The default is 80. \dt \cw{pterm.TermHeight} \dd This resource is the same as the width part of the \cw{\-geometry} command-line option: it controls the number of columns of text in the window. The defaults is 24. \dt \cw{pterm.Font} \dd This resource is the same as the \cw{\-fn} command-line option: it controls the font used to display normal text. The default is \q{\cw{fixed}}. \dt \cw{pterm.BoldFont} \dd This resource is the same as the \cw{\-fb} command-line option: it controls the font used to display bold text when \cw{BoldAsColour} is turned off. The default is unset (the font will be bolded by printing it twice at a one-pixel offset). \dt \cw{pterm.WideFont} \dd This resource is the same as the \cw{\-fw} command-line option: it controls the font used to display double-width characters. The default is unset (double-width characters cannot be displayed). \dt \cw{pterm.WideBoldFont} \dd This resource is the same as the \cw{\-fwb} command-line option: it controls the font used to display double-width characters in bold, when \cw{BoldAsColour} is turned off. The default is unset (double-width characters are displayed in bold by printing them twice at a one-pixel offset). \dt \cw{pterm.ShadowBoldOffset} \dd This resource can be set to an integer; the default is \-1. It specifies the offset at which text is overprinted when using \q{shadow bold} mode. The default (1) means that the text will be printed in the normal place, and also one character to the right; this seems to work well for most X bitmap fonts, which have a blank line of pixels down the right-hand side. For some fonts, you may need to set this to \-1, so that the text is overprinted one pixel to the left; for really large fonts, you may want to set it higher than 1 (in one direction or the other). \dt \cw{pterm.BoldAsColour} \dd This option should be set to either 0 or 1; the default is 1. It specifies the default state of auto wrap mode. When set to 1, bold text is shown by displaying it in a brighter colour; when set to 0, bold text is shown by displaying it in a heavier font. \dt \cw{pterm.Colour0}, \cw{pterm.Colour1}, ..., \cw{pterm.Colour21} \dd These options control the various colours used to display text in the \cw{pterm} window. Each one should be specified as a triple of decimal numbers giving red, green and blue values: so that black is \q{\cw{0,0,0}}, white is \q{\cw{255,255,255}}, red is \q{\cw{255,0,0}} and so on. \lcont{ Colours 0 and 1 specify the foreground colour and its bold equivalent (the \cw{\-fg} and \cw{\-bfg} command-line options). Colours 2 and 3 specify the background colour and its bold equivalent (the \cw{\-bg} and \cw{\-bbg} command-line options). Colours 4 and 5 specify the text and block colours used for the cursor (the \cw{\-cfg} and \cw{\-cbg} command-line options). Each even number from 6 to 20 inclusive specifies the colour to be used for one of the ANSI primary colour specifications (black, red, green, yellow, blue, magenta, cyan, white, in that order); the odd numbers from 7 to 21 inclusive specify the bold version of each colour, in the same order. The defaults are: \c pterm.Colour0: 187,187,187 \c pterm.Colour1: 255,255,255 \c pterm.Colour2: 0,0,0 \c pterm.Colour3: 85,85,85 \c pterm.Colour4: 0,0,0 \c pterm.Colour5: 0,255,0 \c pterm.Colour6: 0,0,0 \c pterm.Colour7: 85,85,85 \c pterm.Colour8: 187,0,0 \c pterm.Colour9: 255,85,85 \c pterm.Colour10: 0,187,0 \c pterm.Colour11: 85,255,85 \c pterm.Colour12: 187,187,0 \c pterm.Colour13: 255,255,85 \c pterm.Colour14: 0,0,187 \c pterm.Colour15: 85,85,255 \c pterm.Colour16: 187,0,187 \c pterm.Colour17: 255,85,255 \c pterm.Colour18: 0,187,187 \c pterm.Colour19: 85,255,255 \c pterm.Colour20: 187,187,187 \c pterm.Colour21: 255,255,255 } \dt \cw{pterm.RectSelect} \dd This option should be set to either 0 or 1; the default is 0. When set to 0, dragging the mouse over several lines selects to the end of each line and from the beginning of the next; when set to 1, dragging the mouse over several lines selects a rectangular region. In each case, holding down Alt while dragging gives the other behaviour. \dt \cw{pterm.MouseOverride} \dd This option should be set to either 0 or 1; the default is 1. When set to 1, if the application requests mouse tracking (so that mouse clicks are sent to it instead of doing selection), holding down Shift will revert the mouse to normal selection. When set to 0, mouse tracking completely disables selection. \dt \cw{pterm.Printer} \dd This option is unset by default. If you set it, then server-controlled printing is enabled: the server can send control sequences to request data to be sent to a printer. That data will be piped into the command you specify here; so you might want to set it to \q{\cw{lpr}}, for example, or \q{\cw{lpr \-Pmyprinter}}. \dt \cw{pterm.ScrollBar} \dd This option should be set to either 0 or 1; the default is 1. When set to 0, the scrollbar is hidden (although Shift-PageUp and Shift-PageDown still work). This is the same as the \cw{\-sb} command-line option. \dt \cw{pterm.ScrollbarOnLeft} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, the scrollbar will be displayed on the left of the terminal instead of on the right. \dt \cw{pterm.ScrollOnKey} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, any keypress causes the position of the scrollback to be reset to the very bottom. \dt \cw{pterm.ScrollOnDisp} \dd This option should be set to either 0 or 1; the default is 1. When set to 1, any activity in the display causes the position of the scrollback to be reset to the very bottom. \dt \cw{pterm.LineCodePage} \dd This option specifies the character set to be used for the session. This is the same as the \cw{\-cs} command-line option. \dt \cw{pterm.NoRemoteCharset} \dd This option disables the terminal's ability to change its character set when it receives escape sequences telling it to. You might need to do this to interoperate with programs which incorrectly change the character set to something they think is sensible. \dt \cw{pterm.BCE} \dd This option should be set to either 0 or 1; the default is 1. When set to 1, the various control sequences that erase parts of the terminal display will erase in whatever the current background colour is; when set to 0, they will erase in black always. \dt \cw{pterm.BlinkText} \dd This option should be set to either 0 or 1; the default is 0. When set to 1, text specified as blinking by the server will actually blink on and off; when set to 0, \cw{pterm} will use the less distracting approach of making the text's background colour bold. \dt \cw{pterm.StampUtmp} \dd This option should be set to either 0 or 1; the default is 1. When set to 1, \cw{pterm} will log the login in the various system log files. This resource is equivalent to the \cw{\-ut} command-line option. \dt \cw{pterm.LoginShell} \dd This option should be set to either 0 or 1; the default is 1. When set to 1, \cw{pterm} will execute your shell as a login shell. This resource is equivalent to the \cw{\-ls} command-line option. \S{pterm-manpage-bugs} BUGS Most of the X resources have silly names. (Historical reasons from PuTTY, mostly.) Node-path: putty/doc/man-putt.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 7519 Text-content-md5: f1bd7ae63a0806831204ef58e5a40bc1 Text-content-sha1: b1917e698620bc7f89da2122a3d660b6aed96eea Content-length: 7635 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNQQQ\cfg{man-identity}{putty}{1}{2004-03-24}{PuTTY tool suite}{PuTTY tool suite} \H{putty-manpage} Man page for PuTTY \S{putty-manpage-name} NAME \cw{putty} - GUI SSH, Telnet and Rlogin client for X \S{putty-manpage-synopsis} SYNOPSIS \c putty [ options ] [ host ] \e bbbbb iiiiiii iiii \S{putty-manpage-description} DESCRIPTION \cw{putty} is a graphical SSH, Telnet and Rlogin client for X. It is a direct port of the Windows SSH client of the same name. \S{putty-manpage-options} OPTIONS The command-line options supported by \cw{putty} are: \dt \cw{\-\-display} \e{display\-name} \dd Specify the X display on which to open \cw{putty}. (Note this option has a double minus sign, even though none of the others do. This is because this option is supplied automatically by GTK. Sorry.) \dt \cw{\-fn} \e{font-name} \dd Specify the font to use for normal text displayed in the terminal. \dt \cw{\-fb} \e{font-name} \dd Specify the font to use for bold text displayed in the terminal. If the \cw{BoldAsColour} resource is set to 1 (the default), bold text will be displayed in different colours instead of a different font, so this option will be ignored. If \cw{BoldAsColour} is set to 0 and you do not specify a bold font, \cw{putty} will overprint the normal font to make it look bolder. \dt \cw{\-fw} \e{font-name} \dd Specify the font to use for double-width characters (typically Chinese, Japanese and Korean text) displayed in the terminal. \dt \cw{\-fwb} \e{font-name} \dd Specify the font to use for bold double-width characters (typically Chinese, Japanese and Korean text). Like \cw{-fb}, this will be ignored unless the \cw{BoldAsColour} resource is set to 0. \dt \cw{\-geometry} \e{geometry} \dd Specify the size of the terminal, in rows and columns of text. See \e{X(7)} for more information on the syntax of geometry specifications. \dt \cw{\-sl} \e{lines} \dd Specify the number of lines of scrollback to save off the top of the terminal. \dt \cw{\-fg} \e{colour} \dd Specify the foreground colour to use for normal text. \dt \cw{\-bg} \e{colour} \dd Specify the background colour to use for normal text. \dt \cw{\-bfg} \e{colour} \dd Specify the foreground colour to use for bold text, if the \cw{BoldAsColour} resource is set to 1 (the default). \dt \cw{\-bbg} \e{colour} \dd Specify the foreground colour to use for bold reverse-video text, if the \cw{BoldAsColour} resource is set to 1 (the default). (This colour is best thought of as the bold version of the background colour; so it only appears when text is displayed \e{in} the background colour.) \dt \cw{\-cfg} \e{colour} \dd Specify the foreground colour to use for text covered by the cursor. \dt \cw{\-cbg} \e{colour} \dd Specify the background colour to use for text covered by the cursor. In other words, this is the main colour of the cursor. \dt \cw{\-title} \e{title} \dd Specify the initial title of the terminal window. (This can be changed under control of the server.) \dt \cw{\-sb\-} or \cw{+sb} \dd Tells \cw{putty} not to display a scroll bar. \dt \cw{\-sb} \dd Tells \cw{putty} to display a scroll bar: this is the opposite of \cw{\-sb\-}. This is the default option: you will probably only need to specify it explicitly if you have changed the default using the \cw{ScrollBar} resource. \dt \cw{\-log} \e{filename} \dd This option makes \cw{putty} log all the terminal output to a file as well as displaying it in the terminal. \dt \cw{\-cs} \e{charset} \dd This option specifies the character set in which \cw{putty} should assume the session is operating. This character set will be used to interpret all the data received from the session, and all input you type or paste into \cw{putty} will be converted into this character set before being sent to the session. \lcont{ Any character set name which is valid in a MIME header (and supported by \cw{putty}) should be valid here (examples are \q{\cw{ISO-8859-1}}, \q{\cw{windows-1252}} or \q{\cw{UTF-8}}). Also, any character encoding which is valid in an X logical font description should be valid (\q{\cw{ibm-cp437}}, for example). \cw{putty}'s default behaviour is to use the same character encoding as its primary font. If you supply a Unicode (\cw{iso10646-1}) font, it will default to the UTF-8 character set. Character set names are case-insensitive. } \dt \cw{\-nethack} \dd Tells \cw{putty} to enable NetHack keypad mode, in which the numeric keypad generates the NetHack \c{hjklyubn} direction keys. This enables you to play NetHack with the numeric keypad without having to use the NetHack \c{number_pad} option (which requires you to press \q{\cw{n}} before any repeat count). So you can move with the numeric keypad, and enter repeat counts with the normal number keys. \dt \cw{\-help}, \cw{\-\-help} \dd Display a message summarizing the available options. \dt \cw{\-load} \e{session} \dd Load a saved session by name. This allows you to run a saved session straight from the command line without having to go through the configuration box first. \dt \cw{\-ssh}, \cw{\-telnet}, \cw{\-rlogin}, \cw{\-raw} \dd Select the protocol \cw{putty} will use to make the connection. \dt \cw{\-l} \e{username} \dd Specify the username to use when logging in to the server. \dt \cw{\-L} \cw{[}\e{srcaddr}\cw{:]}\e{srcport}\cw{:}\e{desthost}\cw{:}\e{destport} \dd Set up a local port forwarding: listen on \e{srcport} (or \e{srcaddr}:\e{srcport} if specified), and forward any connections over the SSH connection to the destination address \e{desthost}:\e{destport}. Only works in SSH. \dt \cw{\-R} \cw{[}\e{srcaddr}\cw{:]}\e{srcport}\cw{:}\e{desthost}\cw{:}\e{destport} \dd Set up a remote port forwarding: ask the SSH server to listen on \e{srcport} (or \e{srcaddr}:\e{srcport} if specified), and to forward any connections back over the SSH connection where the client will pass them on to the destination address \e{desthost}:\e{destport}. Only works in SSH. \dt \cw{\-D} [\e{srcaddr}:]\e{srcport} \dd Set up dynamic port forwarding. The client listens on \e{srcport} (or \e{srcaddr}:\e{srcport} if specified), and implements a SOCKS server. So you can point SOCKS-aware applications at this port and they will automatically use the SSH connection to tunnel all their connections. Only works in SSH. \dt \cw{\-P} \e{port} \dd Specify the port to connect to the server on. \dt \cw{\-A}, \cw{\-a} \dd Enable (\cw{\-A}) or disable (\cw{\-a}) SSH agent forwarding. Currently this only works with OpenSSH and SSH1. \dt \cw{\-X}, \cw{\-x} \dd Enable (\cw{\-X}) or disable (\cw{\-x}) X11 forwarding. \dt \cw{\-T}, \cw{\-t} \dd Enable (\cw{\-t}) or disable (\cw{\-T}) the allocation of a pseudo-terminal at the server end. \dt \cw{\-C} \dd Enable zlib-style compression on the connection. \dt \cw{\-1}, \cw{\-2} \dd Select SSH protocol v1 or v2. \dt \cw{\-i} \e{keyfile} \dd Specify a private key file to use for authentication. For SSH2 keys, this key file must be in PuTTY's format, not OpenSSH's or anyone else's. \S{putty-manpage-saved-sessions} SAVED SESSIONS Saved sessions are stored in a \cw{.putty/sessions} subdirectory in your home directory. \S{putty-manpage-more-information} MORE INFORMATION For more information on PuTTY, it's probably best to go and look at the manual on the web page: \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/}\cw{http://www.chiark.greenend.org.uk/~sgtatham/putty/} \S{putty-manpage-bugs} BUGS This man page isn't terribly complete. Node-path: putty/doc/mancfg.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 81 Text-content-md5: ddad301851fa2b4d8cf3d3452bdbd197 Text-content-sha1: 2302f16d8e7bc3ef57d1807f82bfbfeacaf6c25d Content-length: 197 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNFFF\cfg{man-mindepth}{2} \C{not-shown} Chapter title which is not shown Node-path: putty/doc/manpages.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 108 Text-content-md5: 55ab127799e44d67ecc72b709490f6e6 Text-content-sha1: 96e081fb42c346f373b32969aa7339e191b5ce81 Content-length: 224 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNaaa\A{man-pages} Man pages for Unix PuTTY This appendix contains all the man pages for Unix PuTTY. Node-path: putty/unix/pscp.1 Node-action: delete Node-path: putty/unix/putty.1 Node-action: delete Node-path: putty/unix/pterm.1 Node-action: delete Node-path: putty/unix/puttytel.1 Node-action: delete Node-path: putty/unix/psftp.1 Node-action: delete Node-path: putty/unix/plink.1 Node-action: delete Node-path: putty/unix/puttygen.1 Node-action: delete Revision-number: 3967 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:10.858798Z PROPS-END Revision-number: 3968 Prop-content-length: 242 Content-length: 242 K 8 svn:date V 27 2004-03-24T19:50:46.000000Z K 7 svn:log V 141 The Unix source archive ought to have pre-built docs (in particular man pages) in it, if only so that non-Halibut-users have what they need. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bc68ae6b20bcf906e9fb7537ea7f499a Text-delta-base-sha1: 1cd0e33a610831d3fc1692266fbbfa575ce32a32 Text-content-length: 37 Text-content-md5: 817f766bb480a8ca30b7e17a9653d9b2 Text-content-sha1: 81e6847a20829ddc4d3a2d4954416f11685d8605 Content-length: 76 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN%6 TRS(cd doc && make) Revision-number: 3969 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2004-03-24T19:51:59.000000Z K 7 svn:log V 58 Oh yes, and the Unix Makefile needs to know that as well. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3a6b6433ab8f5f43461edb761e6a2b49 Text-delta-base-sha1: 9bcdc20ed830f194a356f616beb3689ef4b440e2 Text-content-length: 32 Text-content-md5: aba409c711beae87d6e9547567ece150 Text-content-sha1: 8939668d9c640db728ffaa601e48046ca244b59a Content-length: 72 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVNov hh../doc/ Revision-number: 3970 Prop-content-length: 138 Content-length: 138 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-24T20:03:30.000000Z K 7 svn:log V 38 Use $(HALIBUT) variable consistently. PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2a5b06ca3c6a170f2cf7c071c39416db Text-delta-base-sha1: 4a68d807f23d2d7e89f81bda3b766d8f48d6b6a0 Text-content-length: 41 Text-content-md5: 5d94825a69c6c359ec91dad1bea94dc0 Text-content-sha1: 870654b7489a928ec6e864b2ff184b76e6fc6b0d Content-length: 81 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN`28VU ALIBUT)ALIBUT) Revision-number: 3971 Prop-content-length: 226 Content-length: 226 K 7 svn:log V 125 Hmm. Better turn that `make' into a `make -s', or else my nightly snapshot cron job will fill my mailbox with goo every day. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-03-25T09:03:37.000000Z PROPS-END Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 817f766bb480a8ca30b7e17a9653d9b2 Text-delta-base-sha1: 81e6847a20829ddc4d3a2d4954416f11685d8605 Text-content-length: 24 Text-content-md5: 219dc84aafe7d966be615aec21b4b748 Text-content-sha1: 377156c0106ca0d61d0cdc1ba5bf6c4b8250d380 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN69 cSc -s Revision-number: 3972 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2004-03-25T11:31:50.000000Z K 7 svn:log V 26 Another patch on the web. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f8b2bb8959a3280196d3e5c556d67d34 Text-delta-base-sha1: 71d7e8a2a947a3da06df7200b0d029988932e0fb Text-content-length: 77 Text-content-md5: 85a2efe7c85f0483c6e1377c44ef518b Text-content-sha1: 2aee95af2a32a70c1b614c9f58d8b0dda0e310e6 Content-length: 116 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN/l=/

    Another patch here. Revision-number: 3973 Prop-content-length: 275 Content-length: 275 K 7 svn:log V 174 tweak text about mouse reporting and copy and paste to indicate that shift's only necessary for mouse-based actions (since we seem to be growing more copy-and-paste options) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-25T11:33:17.000000Z PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b379d340e95f77c22bf833aedac15cef Text-delta-base-sha1: 25f7faa35d6702362f94ec94b9f02613d7b06249 Text-content-length: 259 Text-content-md5: 3ed5fff187a05fe575b085d8435fd158 Text-content-sha1: ec358cea978640695b3c44aa9a291cfb323869b2 Content-length: 299 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVNexg43up\versionid $Id: using.but,v 1.21 2004/03/25 11:33:17using the mouse to copy and paste will only work if you hold down Shift. See \k{config-features-mouse} and \k{config-mouseshift} for details of this feature and how to configure Revision-number: 3974 Prop-content-length: 172 Content-length: 172 K 7 svn:log V 72 Summary: Pageant keeps open handles on removeable media Class: semi-bug K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-25T12:27:05.000000Z PROPS-END Node-path: putty-wishlist/data/pageant-dirhandle Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1152 Text-content-md5: 101f8c1565c601c746ca9cbb150a5240 Text-content-sha1: c4f1a475d0f4b55ac630648de0874cb9105d2ae8 Content-length: 1268 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNrrrSummary: Pageant keeps open handles on removeable media Class: semi-bug Content-type: text/x-html-body

    We've had a couple of reports (e.g. on comp.security.ssh) that the Pageant process tends to keep hold of a directory handle to the directory of the last key loaded via the file selection GUI.

    This causes trouble for people who keep keys on removeable media such as USB memory sticks, as Windows won't let them unmount and remove the device.

    The following workarounds are said to work:

    • Load, or attempt to load, a second (dummy) key from somewhere else such as a fixed drive using the file selection GUI.
    • Don't use the file selection GUI at all - pass the path to the key on the Pageant command line.

    We don't believe that the Pageant code itself keeps handles on anything particularly, so we suspect that the file selection GUI is keeping a handle behind our backs. The workarounds above bear out this hypothesis.

    Suggestions for ways in which we could stop this being a problem welcome. Revision-number: 3975 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2004-03-25T17:49:42.000000Z K 7 svn:log V 69 Retire `input-methods' in favour of an expanded `keyboard-problems'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/keyboard-problems Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 515ae057f1ae1600a14bc9651193f25c Text-delta-base-sha1: 9071456f8e314b83db50a8d7f221c4fd1b65c804 Text-content-length: 290 Text-content-md5: 0e7d533b4b55b46f93f6ef9d9883e00d Text-content-sha1: a1f9df84547b1ad32ca78997ff72b117c2b7bb0e Content-length: 329 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN%k{y7 2m= )Nv/Summary: Problems with various keyboard layouts / input methods and input methods. , because we just don't know enough about internationalisation Please do let us know if soli> I believe there are also Eastern input mechanisms we don't handle sensibly Node-path: putty-wishlist/data/input-methods Node-action: delete Revision-number: 3976 Prop-content-length: 110 Content-length: 110 K 8 svn:date V 27 2004-03-25T17:53:32.000000Z K 7 svn:log V 10 Classify. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/cryptoapi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 90ba293b58f3031f86b2a7e106016b3b Text-delta-base-sha1: 51cbf42fb745d4a8e3f7b0c46894fb4c6acd0dcc Text-content-length: 68 Text-content-md5: f2dc2ae7da4dbf9d45d3f30edfc7ffda Text-content-sha1: c2ba84462c0f581ab8fb6db5777981c6bf4da63e Content-length: 107 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNR^4*(Summary: Use of MS Crypto API on Windows Class: wish Revision-number: 3977 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:11.474076Z PROPS-END Revision-number: 3978 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:11.484221Z PROPS-END Revision-number: 3979 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:11.510994Z PROPS-END Revision-number: 3980 Prop-content-length: 172 Content-length: 172 K 7 svn:log V 72 Mention history and Jordan Russell's patch (which needs Unix fettling). K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-25T19:14:59.000000Z PROPS-END Node-path: putty-wishlist/data/selection-pause Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a769d66304c3a8e2a44de17de80c011a Text-delta-base-sha1: 92d23c2da244495f0bea3febbf084ae8cffc3dcb Text-content-length: 188 Text-content-md5: e53b080a52aad13d8405ea871c32c4e3 Text-content-sha1: 7a069918f4ae0860b6df1a5870313eb9f1dc45ad Content-length: 227 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN}$ &q p{Present-in: 0.54 Absent-in: 0.52 0.53 0.53b

    We used to do this, but we broke it in 0.54.

    Patch (needs Unix fettling): 004801c41291$340fb8e0$024d460a@neptune Revision-number: 3981 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:11.561285Z PROPS-END Revision-number: 3982 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:11.570504Z PROPS-END Revision-number: 3983 Prop-content-length: 106 Content-length: 106 K 8 svn:date V 27 2004-03-25T20:20:35.000000Z K 7 svn:log V 7 tweaks K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/key-mapping Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1715ae1f739eac7ea1d50828404cff24 Text-delta-base-sha1: f2310f3e97cb9173c9fd482309a2f4365c999fdb Text-content-length: 79 Text-content-md5: 831da3300b80f519c8d2bb69939f4639 Text-content-sha1: 663d87f70f9342f17274a9b613fe0fa11ff1c8c6 Content-length: 118 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN|4HBU_function keysremain Revision-number: 3984 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2004-03-25T23:56:38.000000Z K 7 svn:log V 43 Arg! Win2K is OK, but Win98 is now broken! K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-dead-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bb3c592c8eb841ddb0b309c67dee29d9 Text-delta-base-sha1: db034f37a86f00c166fff748cca66cab49cf04df Text-content-length: 211 Text-content-md5: 024f4df353608714dc529553008493cc Text-content-sha1: 4453f5d5c3710ad3aaef050267132e141f3a9b61 Content-length: 250 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNZd ;$;Ued as of 2003-03-25 tested on Win2K (and by a third party on WinXP).

    • Aaargh, but apparently it breaks dead keys on Win98SE, which were working perfectly well before. *sigh*
    Revision-number: 3985 Prop-content-length: 110 Content-length: 110 K 8 svn:date V 27 2004-03-26T14:43:38.000000Z K 7 svn:log V 10 AAAAAARGH K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-dead-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 024f4df353608714dc529553008493cc Text-delta-base-sha1: 4453f5d5c3710ad3aaef050267132e141f3a9b61 Text-content-length: 2346 Text-content-md5: 5c25fbcc5cab8c2629169c26a7748304 Text-content-sha1: 1f5a15d2f1ff5c20ca0a7aee8778f08e73af44e4 Content-length: 2385 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNdYM!Hgb.kOvhSummary: Trouble with dead keys on Windows Class: semi-bug Difficulty: taxing on Win2K or XP, entering a non-composing sequence (such as a pair of circumflexes), such that the second keypress resulted in two characters, gave the wrong result (the second character was wrong).

    Changing the storage behind on 2K/XP. (Done as of 2004-03-25.) The documentation isn't clear what type the storage behind the pointer should be, but Googling indicates that this usage is not uncommon.

    However, this breaks the same situation in (French) Win98SE, which was working OK before with the WORD[] array. (But fixes it for French Win2K.)

    This area is rich in history. For example:

    • We originally switched from ToAscii to ToAsciiEx to fix a problem a Lithuanian user was having with top bits being stripped.
      ref: 20001222172132.A17154@kibiras.kaunas.alna.lt
    • We then had a complaint from a Korean user that ToAsciiEx didn't work on Korean Win98 (but was OK on WinMe and 2000), whereas ToAscii was fine. We didn't do anything about this because it seemed just too horrible.
      ref: 3B67475D.64790726@kias.re.kr
    • We've also had a complaint from a Danish user that they get the first key in a dead key sequence and the composed character.
      ref: 000701c09c57$a2ce70e0$0e00a8c0@neland.dk
    • We've had a report that fiddling with the keys array before passing it to ToAsciiEx makes a difference, which could be consistent with a confusion like that described above.
      ref: E14wR3x-0000t8-00@ixion.tartarus.org

    I've got a horrible suspicion that it's not as simple as a Win9x/NT split; this function appears to be an interface to the keyboard driver, and MS's specification of that interface on their website looks unclear to me, so I suspect that whether it's an array of bytes or words is dependent on the keyboard driver in question.

    We could in principle try to detect it by initialising the array with unlikely values and seeing what changes. Bleurgh.

    This may be the root ofour hacking in this area makes a difference to you (positive or negative), please let us know. Revision-number: 3986 Prop-content-length: 257 Content-length: 257 K 8 svn:date V 27 2004-03-26T15:18:42.000000Z K 7 svn:log V 156 More experimental hackery for `win-dead-keys'. Works for me as well as it did in the one case I can test, but I suspect this isn't the whole story. Bletch. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b3cf6d37c2eebfed7aa52100d6460628 Text-delta-base-sha1: a794fe2fe77b72329e89639db941407f36fa27ee Text-content-length: 1777 Text-content-md5: 3c877d4f4acbff06a3efbb81ee9cee86 Text-content-sha1: 92be140dd71864a83f4a5a4b692b08cfdecc68d7 Content-length: 1818 K 15 cvs2svn:cvs-rev V 5 1.262 PROPS-END SVN0zc7zs. There's some ick here, see below. */ static WORDXXX how do we know what the max size of the keys array should * be is? There's indication on MS' website of an Inquire/InquireEx * functioning returning a KBINFO structure which tells us. */ if (osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) { /* XXX 'keys' parameter is declared in MSDN documentation as * 'LPWORD lpChar'. * The experience of a French user indicates that on * Win98, WORD[] should be passed in, but on Win2K, it should * be BYTE[]. German WinXP and my Win2K with "US International" * driver corroborate this. * Experimentally I've conditionalised the behaviour on the * Win9x/NT split, but I suspect it's worse than that. * See wishlist item `win-dead-keys' for more horrible detail * and speculations. */ BYTE keybs[3]; int i; r = ToAsciiEx(wParam, scan, keystate, (LPWORD)keybs, 0, kbd_layout); for (i=0; i<3; i++) keys[i] = keybs[i]; } else { r = ToAsciiEx(wParam, scan, keystate, keys, 0, kbd_layout); } ? "," : "", keys[r1])); } debug((")")); } #endif if (r > 0) { WCHAR keybuf; /* * Interrupt an ongoing paste. I'm not sure this is * sensible, but for the moment it's preferable to * having to faff about buffering things. */ term_nopaste(term); p = output; for (i = 0; i < r; i++) { unsigned char ch = (unsigned char) keys[i]; if (compose_state == 2 && (ch & 0x80) == 0 && ch > ' ') { compose_char = ch; compose_state++; continue; } if (compose_state == 3 && (ch & 0x80) == 0 && ch > ' ') { int nc; compose_state = 0; if ((nc = check_compose Revision-number: 3987 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2004-03-26T15:50:13.000000Z K 7 svn:log V 38 Oh, and reproduced on German Win98SE. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-dead-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5c25fbcc5cab8c2629169c26a7748304 Text-delta-base-sha1: 1f5a15d2f1ff5c20ca0a7aee8778f08e73af44e4 Text-content-length: 32 Text-content-md5: 764edb83e38c02e8d2734dd01a1bf2e1 Text-content-sha1: 119db37510b1982cc984ccc1e55b4bec253f25c2 Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNYd %4% and German Revision-number: 3988 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:11.903701Z PROPS-END Revision-number: 3989 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:11.912711Z PROPS-END Revision-number: 3990 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2004-03-27T02:46:26.000000Z K 7 svn:log V 33 Update filexfer draft reference. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/line-endings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1e36c2a3ef5d343de544ddaf34e75ba8 Text-delta-base-sha1: ff3fdb69fb898c71bf67c8adb68e30a7c3b4ab97 Text-content-length: 66 Text-content-md5: de46084235a8712415f8b27888a83972 Text-content-sha1: 9a51f8f448adb6eeb95f8f2fff074c44927d8867 Content-length: 105 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN+.(wVy9ras of5.txt">draft-ietf-secsh-filexfer-05 Revision-number: 3991 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:11.997001Z PROPS-END Revision-number: 3992 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2004-03-27T11:50:51.000000Z K 7 svn:log V 42 Add Darren Tucker's suggested workaround. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-ftp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: de2b2e8fe4f2428953fc8a656d43007e Text-delta-base-sha1: b3c0d3240a1f30cdd9863420d1f0de624f8f5f69 Text-content-length: 205 Text-content-md5: f9fea7874ea25900a8aed315f1351fc2 Text-content-sha1: fca9641c377efa5cb7108bfd844ea7e67b25c06e Content-length: 244 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN#]:#:

    In theory, however, a SOCKSified FTP client would work with PuTTY's dynamic forwarding if you use passive mode. (This requires that both FTP client and server support it.) Revision-number: 3993 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2004-03-27T12:51:00.000000Z K 7 svn:log V 35 Update Fixed-in: for Win98 hackery K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-dead-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 764edb83e38c02e8d2734dd01a1bf2e1 Text-delta-base-sha1: 119db37510b1982cc984ccc1e55b4bec253f25c2 Text-content-length: 126 Text-content-md5: 1fabedfc17581021278d1896ca660f7c Text-content-sha1: fd91b3619f1aa8ef01c299af9049f6b9d6161ea9 Content-length: 165 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNdGdr(scI7 The storage of the array is conditionalised on Windows version as of 2004-03-27. *crosses fingers* Revision-number: 3994 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:12.082507Z PROPS-END Revision-number: 3995 Prop-content-length: 225 Content-length: 225 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-03-29T11:37:44.000000Z K 7 svn:log V 124 PayPal is actually _much_ easier to work with than e-gold these days, so I've reversed the order in the donations question. PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7ef444c90edc5100633b3d31c91d5c9a Text-delta-base-sha1: ba264e2c54f7e60e15ef2c3f8f078fcf92131295 Text-content-length: 441 Text-content-md5: e60dbd463193ad921ae9a4844d7e3f67 Text-content-sha1: 7e9c7046ceaaf916abbdcfd851d5473894cedb4c Content-length: 481 K 15 cvs2svn:cvs-rev V 4 1.64 PROPS-END SVNR]%2j6\versionid $Id: faq.but,v 1.64 2004/03/29 11:37:44send money to \cw{} using PayPal (\W{http://www.paypal.com/}\cw{www.paypal.com}). Alternatively, if you don't trust PayPal, you could donate through e-gold (\W{http://www.e-gold.com}\cw{www.e-gold.com}): deposit your donation in account number 174769, then send us e-mail to let us know you've done so (otherwise we might not notice for months! Revision-number: 3996 Prop-content-length: 120 Content-length: 120 K 7 svn:log V 20 putty.gigafreak.net K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-29T16:53:24.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 87a7d6aae3f92ec6cb559e15e3ef0970 Text-delta-base-sha1: 43458a1980ca215c14a901918f7da232e2aa2aa7 Text-content-length: 91 Text-content-md5: d5da43eb2d4e581ab1e2e32d39e8a6aa Text-content-sha1: d402d85dac34134209a485a6015629f023110e71 Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVN=R;[8}putty.gigafreak.net/">putty.gigafreak.netwww.putty.nl/">putty Revision-number: 3997 Prop-content-length: 272 Content-length: 272 K 7 svn:log V 171 Miscellaneous tinkering: - remove a couple of "fixed in 0.52" (or before) type questions - mention Mac OS X port that someone was working on - add a missing {Question} K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-30T11:36:51.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e60dbd463193ad921ae9a4844d7e3f67 Text-delta-base-sha1: 7e9c7046ceaaf916abbdcfd851d5473894cedb4c Text-content-length: 195 Text-content-md5: fac8e8d0207a11660d0b55b73fbb5ff7 Text-content-sha1: de592df50c1d766634f1453d9221872fb986cf49 Content-length: 235 K 15 cvs2svn:cvs-rev V 4 1.65 PROPS-END SVN]c%!8gXO?uxputty.fyxm.net in Slovak Revision-number: 3999 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:12.530279Z PROPS-END Revision-number: 4000 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:13.886823Z PROPS-END Revision-number: 4001 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:13.964354Z PROPS-END Revision-number: 4002 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:13.991226Z PROPS-END Revision-number: 4003 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.010671Z PROPS-END Revision-number: 4004 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.028565Z PROPS-END Revision-number: 4005 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.061849Z PROPS-END Revision-number: 4006 Prop-content-length: 230 Content-length: 230 K 8 svn:date V 27 2004-03-30T21:35:56.000000Z K 7 svn:log V 129 Reasonably grotty hacks so that the droppings left by the man page generation don't interfere with the main HTML doc generation. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5d94825a69c6c359ec91dad1bea94dc0 Text-delta-base-sha1: 870654b7489a928ec6e864b2ff184b76e6fc6b0d Text-content-length: 228 Text-content-md5: eba10ffc301674711b09427998b53e67 Text-content-sha1: c658770d1fb0ebebe97189cd2941768c507cca46 Content-length: 268 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN2bF0d5}DROPPINGS := output.txt output.hlp output.cnt output.1 DROPPINGS += Contents.html IndexPage.html Chapter*.html Section*.html DROPPINGS += Appendix*.html all: man Contents.html && rm -f $(DROPPINGS) Revision-number: 4007 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.105793Z PROPS-END Revision-number: 4008 Prop-content-length: 107 Content-length: 107 K 7 svn:log V 8 grammer K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-03-31T09:00:39.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fac8e8d0207a11660d0b55b73fbb5ff7 Text-delta-base-sha1: de592df50c1d766634f1453d9221872fb986cf49 Text-content-length: 80 Text-content-md5: 84bb6b885fec5c794b2a1d514dec8e1c Text-content-sha1: 2bd5ade3f1937bebe4bda5cb6b7aa19b9554463c Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.66 PROPS-END SVNcc 7\2P\versionid $Id: faq.but,v 1.66 2004/03/31 09:00:39lso a Revision-number: 4009 Prop-content-length: 299 Content-length: 299 K 7 svn:log V 198 Add `can I put PuTTY on a coverdisk / bundle it / etc' to the FAQ in case people are incapable of spotting it on the Feedback page. Also add to both locations Owen's point about first-line support. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-03-31T12:50:17.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 84bb6b885fec5c794b2a1d514dec8e1c Text-delta-base-sha1: 2bd5ade3f1937bebe4bda5cb6b7aa19b9554463c Text-content-length: 848 Text-content-md5: 1cc4cce3e0196665c4bab342cd335ae4 Text-content-sha1: f8d129b028f2b279f0fe362ab9f62c1a892d465d Content-length: 888 K 15 cvs2svn:cvs-rev V 4 1.67 PROPS-END SVNcb3Y8{V \versionid $Id: faq.but,v 1.67 2004/03/31 12:50:17 simonS{faq-permission}{Question} Can I have permission to put PuTTY on a cover disk / distribute it with other software / etc? Yes. You need not bother asking us explicitly for permission. You already have permission. Redistribution of the unmodified PuTTY binary in this way is entirely permitted by our licence, and you are welcome to do it as much as you like. If you are distributing PuTTY within your own organisation, or for use with your own product, then we recommend (but do not insist) that you offer your own first-line technical support, to answer questions directly relating to the interaction of PuTTY with your particular environment. If your users mail us directly, we won't be able to give them very much help about things specific to your own setup Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7c560fe204e8d5e7d94e2b18b6fd6ea9 Text-delta-base-sha1: 06773c59b28cacdfca0593e586041c26ff3e6538 Text-content-length: 496 Text-content-md5: 4664c274bb90aa04a7bd3f0aaec77b8b Text-content-sha1: 8ebfbb5b63e3fbf7c7701e0539627665e55fd03e Content-length: 536 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN5MS|=~7\versionid $Id: feedback.but,v 1.17 2004/03/31 12:50:17 simon(If you want to distribute PuTTY alongside your own application for use with that application, or if you want to distribute PuTTY within your own organisation, then we recommend you offer your own first-line technical support, to answer questions about the interaction of PuTTY with your environment. If your users mail us directly, we won't be able to tell them anything useful about your specific setup.) Revision-number: 4010 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.470078Z PROPS-END Revision-number: 4011 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.479196Z PROPS-END Revision-number: 4012 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.489537Z PROPS-END Revision-number: 4013 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.498851Z PROPS-END Revision-number: 4014 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.508020Z PROPS-END Revision-number: 4015 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.517129Z PROPS-END Revision-number: 4016 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.525793Z PROPS-END Revision-number: 4017 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.534726Z PROPS-END Revision-number: 4018 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.543794Z PROPS-END Revision-number: 4019 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.553307Z PROPS-END Revision-number: 4020 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.563193Z PROPS-END Revision-number: 4021 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 58 What was that rogue man-mindepth directive doing in here? K 10 svn:author V 5 simon K 8 svn:date V 27 2004-04-01T17:33:22.000000Z PROPS-END Node-path: putty/doc/man-pl.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 748e579e29e373da48ad23ac5c06a57e Text-delta-base-sha1: c6475b6b493bae45aa2eb0a58ce2b3ccdde492fe Text-content-length: 18 Text-content-md5: 032b6e77af437adb3fb2fad024e7b3a4 Text-content-sha1: 1f3727465283a6ef144294ac6daaf637c4d6b9dc Content-length: 57 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN|M/c Revision-number: 4022 Prop-content-length: 180 Content-length: 180 K 7 svn:log V 80 Clean up Makefile now that Halibut's new command-line options make life easier. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-04-01T17:34:18.000000Z PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eba10ffc301674711b09427998b53e67 Text-delta-base-sha1: c658770d1fb0ebebe97189cd2941768c507cca46 Text-content-length: 155 Text-content-md5: d9dd9018ecffd4729e88fcd67e20af59 Text-content-sha1: f5fd71987baf76f46975761bce308561eb8c3cca Content-length: 195 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVNb; 5-all: man index.html index.html: $(INPUTS) $(HALIBUT) --text --html --winhelp $(INPUTS) MKMAN = $(HALIBUT) --man=$@ mancfg.but $< Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f6fa1f40c4d8531ed51aceebb55ef5f0 Text-delta-base-sha1: 1e920d335f1bb60cf985320658a56f7eecd51154 Text-content-length: 407 Text-content-md5: da15d8f52dec94dff7709fadb9c0c458 Text-content-sha1: 8e618c2555c1aabbab977b554973f0238afe5716 Content-length: 447 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN _s\title PuTTY User Manual \cfg{xhtml-leaf-level}{1} \cfg{xhtml-leaf-smallest-contents}{2} \cfg{xhtml-leaf-contains-contents}{true} \cfg{xhtml-body-end}{Comments to putty@projects.tartarus.org} \cfg{xhtml-contents-filename}{index.html} \cfg{text-filename}{puttydoc.txt} \cfg{winhelp-filename}{putty.hlp10 2004/04/01 17:34:18 simon Exp $ Revision-number: 4023 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.898115Z PROPS-END Revision-number: 4024 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.906825Z PROPS-END Revision-number: 4025 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.925200Z PROPS-END Revision-number: 4026 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.935224Z PROPS-END Revision-number: 4027 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.944575Z PROPS-END Revision-number: 4028 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.953858Z PROPS-END Revision-number: 4029 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.962647Z PROPS-END Revision-number: 4030 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.972603Z PROPS-END Revision-number: 4031 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.984001Z PROPS-END Revision-number: 4032 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:14.994895Z PROPS-END Revision-number: 4033 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:15.011731Z PROPS-END Revision-number: 4034 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:15.021043Z PROPS-END Revision-number: 4035 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:15.030470Z PROPS-END Revision-number: 4036 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:15.041003Z PROPS-END Revision-number: 4037 Prop-content-length: 250 Content-length: 250 K 7 svn:log V 149 Since we've not heard any dissenting voices, I'll declare `hard-hangs' and `ntpd-slowdown' fixed, and see if that brings anyone out of the woodwork. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-04-03T09:44:21.000000Z PROPS-END Node-path: putty-wishlist/data/hard-hangs Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0ad1aea08a1c39508e19ecff8b74f935 Text-delta-base-sha1: b532870d0ef523701b3813f8194b41d06f414a78 Text-content-length: 41 Text-content-md5: aea9b5c30f8bd2462ad5bba381d6bfff Text-content-sha1: 98704d8070ed946157df5074b180efe59b8f646a Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN& (j'Fixed-in: 2004-03-18 Node-path: putty-wishlist/data/ntpd-slowdown Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: fe0f82a40d329b3f43cd3d27dad480ae Text-delta-base-sha1: 9c13a04f0debd8e2e4c0a23d457cf70cb635e43d Text-content-length: 41 Text-content-md5: c47f03d2bb35723ebab41a40578e97b5 Text-content-sha1: 145af7abe2da85491c793daa71538382f6a50e85 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNn  b Fixed-in: 2004-03-18 Revision-number: 4038 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:15.098104Z PROPS-END Revision-number: 4039 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2004-04-06T22:44:52.000000Z K 7 svn:log V 13 freshen link K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/subsystem-publickey Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1255efb03dd9b4b47c042fede0da4387 Text-delta-base-sha1: 07c9cd95ad82779cd0d8f27f7ec8a01727eedb52 Text-content-length: 67 Text-content-md5: d2ee9a2b5564288ab68fad1adf248f8e Text-content-sha1: 0fc954a4de07ca742efde3fcea9c1dd0766ce9c3 Content-length: 106 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNLL .PN~1.txt">draft-ietf-secsh-publickey-subsystem-01 Revision-number: 4040 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2004-04-06T22:51:38.000000Z K 7 svn:log V 31 netmirror.org ftp.inf.utfsm.cl K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 64e913db3e37300e256e67cf11494098 Text-delta-base-sha1: 25cd1aa65e6f6ebb952cead79c01d8933c9eb13c Text-content-length: 146 Text-content-md5: a6b6a7f398c2365eb69697cde1c2236f Text-content-sha1: c999fd79ad986fd521f34aff00ee9f58dbd0d5a5 Content-length: 186 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVN}EsA@x knetmirror.org/mirror/putty/">netmirror.org in Germanyinf.utfsm.cl/pub/ssh/putty/">ftp.inf.utfsm.cl in Chile Revision-number: 4041 Prop-content-length: 181 Content-length: 181 K 7 svn:log V 81 Added indexing for the first three chapters of the manual. This is a big job :-/ K 10 svn:author V 5 simon K 8 svn:date V 27 2004-04-08T12:38:53.000000Z PROPS-END Node-path: putty/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 62ea7ab64058c8b7f02caa78c5fd93ea Text-delta-base-sha1: b6f8ae85378099beec62ce0bd554b6892a578a13 Text-content-length: 2121 Text-content-md5: 7e848ea73d8bfcdaceb8439bb2529f37 Text-content-sha1: da5c17be2dc620679e9838cd3913349665b44042 Content-length: 2160 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN:=Yd#0 eu`E')de,*f9B]]*Q:[Gg7uq3 0\versionid $Id: gs.but,v 1.7 2004/04/08 12:38:53\ii{Starting a session}\i{protocol} to use, from the \q{Protocol} buttons. For a login session, you should select \i{Telnet}, \i{Rlogin} or \i{SSH}. See \k{which-one} for a description of the differences between the three protocols, and advice on which one to use. The fourth protocol, \I{raw protocol}\e{Raw}, is not used for interactive login sessions; you would usually use this for debugging \i{MUDs}\i{Verifying the host key} (SSH only) If you are not using the \i{SSH} protocol, you can skip this i\e{spoofing}: secretly redirecting your connection to a different computer, so that you send your password to the wrong machine. Using this technique, an attacker would be able to learn the password that guards your login account, and could then log in as if they were you and use the account for \i{Registry}. Every time you connect to a server, it checks that the host key presented by the server is the same host key as it was the last time you connected. If it is not, you will see a warning, and you will have the chance to abandon your connection before you type any private information (such as a password) into \I{trusting host keys}trust this host key or \ii{Logging in} After you have connected, and perhaps verified the server's host key, you will be asked to log in, probably using a \i{username} and a \i{password}. Your system administrator should have provided you with these. Enter the username and the password, and the server should grant you access and begin your session. If you have \I{mistyping a password}mistyped your password, most servers will give you several chances to get it \i{different usernames}. If you type your username wrongly, you must close PuTTY and start logging i\i{prompt}, at which you can type commands which the server will carry out. Some servers will offer you on-line help; others might not. If you are in doubt about what to do next, consult your system administrator. \H{gs-logout} \ii{Logging out}\i{Close button} Node-path: putty/doc/index.but Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3920 Text-content-md5: b91890e20d63a9269bff31a539f4b2e4 Text-content-sha1: 11bca0a7a4ce1655a18fe35f57c3afb09b81ed6d Content-length: 4036 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNBBB\IM{verifying the host key} verifying the host key \IM{verifying the host key} host key, verifying \IM{trusting host keys} trusting host keys \IM{trusting host keys} host keys, trusting \IM{starting a session} starting a session \IM{starting a session} session, starting \IM{mistyping a password} mistyping a password \IM{mistyping a password} password, mistyping \IM{different usernames} different usernames \IM{different usernames} changing usernames \IM{different usernames} usernames, different \IM{differences between SSH, Telnet and Rlogin} differences between SSH, Telnet and Rlogin \IM{differences between SSH, Telnet and Rlogin} protocols, differences between \IM{differences between SSH, Telnet and Rlogin} SSH, differences from Telnet and Rlogin \IM{differences between SSH, Telnet and Rlogin} Telnet, differences from SSH and Rlogin \IM{differences between SSH, Telnet and Rlogin} Rlogin, differences from SSH and Telnet \IM{differences between SSH, Telnet and Rlogin} selecting a protocol \IM{differences between SSH, Telnet and Rlogin} choosing a protocol \IM{copy and paste} copy and paste \IM{copy and paste} cut and paste \IM{copy and paste} paste, copy and \IM{rectangular selection} rectangular selection \IM{rectangular selection} selection, rectangular \IM{adjusting a selection} adjusting a selection \IM{adjusting a selection} selection, adjusting \IM{port forwarding}{port forwardings} port forwarding in SSH \IM{port forwarding}{port forwardings} SSH port forwarding \IM{port forwarding}{port forwardings} forwarding ports in SSH \IM{port forwarding}{port forwardings} tunnelling using SSH \IM{port forwarding}{port forwardings} SSH tunnelling \IM{debugging Internet protocols} debugging Internet protocols \IM{debugging Internet protocols} Internet protocols, debugging \IM{debugging Internet protocols} protocols, debugging \IM{raw TCP connections} raw TCP connections \IM{raw TCP connections} TCP connections, raw \IM{command-line arguments} command-line arguments \IM{command-line arguments} arguments, command-line \IM{command-line arguments} options, command-line \IM{command-line arguments} switches, command-line \IM{telnet URLs} Telnet URLs \IM{telnet URLs} URLs, Telnet \IM{saved sessions, loading from command line} saved sessions, loading from command line \IM{saved sessions, loading from command line} loading saved sessions from command line \IM{saved sessions, loading from command line} command line, loading saved sessions from \IM{protocol selection} protocol selection \IM{protocol selection} selecting a protocol \IM{protocol selection} choosing a protocol \IM{login name} login name \IM{login name} user name \IM{agent forwarding} agent forwarding \IM{agent forwarding} SSH agent forwarding \IM{agent forwarding} forwarding, SSH agent \IM{X11 forwarding} X11 forwarding \IM{X11 forwarding} SSH X11 forwarding \IM{X11 forwarding} forwarding, X11 \IM{pseudo-terminal allocation} pseudo-terminal allocation \IM{pseudo-terminal allocation} pty allocation \IM{-telnet} \c{-telnet} command-line option \IM{-raw} \c{-raw} command-line option \IM{-rlogin} \c{-rlogin} command-line option \IM{-ssh} \c{-ssh} command-line option \IM{-cleanup} \c{-cleanup} command-line option \IM{-load} \c{-load} command-line option \IM{-v} \c{-v} command-line option \IM{-l} \c{-l} command-line option \IM{-L} \c{-L} command-line option \IM{-R} \c{-R} command-line option \IM{-D} \c{-D} command-line option \IM{-m} \c{-m} command-line option \IM{-P} \c{-P} command-line option \IM{-pw} \c{-pw} command-line option \IM{-A} \c{-A} command-line option \IM{-a} \c{-a} command-line option \IM{-X} \c{-X} command-line option \IM{-x} \c{-x} command-line option \IM{-T} \c{-T} command-line option \IM{-t} \c{-t} command-line option \IM{-C} \c{-C} command-line option \IM{-1} \c{-1} command-line option \IM{-2} \c{-2} command-line option \IM{-i} \c{-i} command-line option Node-path: putty/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a0895b4050eb81cbe0137eda38e0b612 Text-delta-base-sha1: 66daaf63307eb7478b3454621e4fa9a045b9931f Text-content-length: 393 Text-content-md5: 44d714d804d8ab389bb1246397fd7d76 Text-content-sha1: 41966af068e21c73914922f142d521b417ac4a7a Content-length: 432 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNj+R3UYXiI@+52b\versionid $Id: intro.but,v 1.5 2004/04/08 12:38:53\i{Command Prompt}} or \q{\i{MS-DOS Prompt}} in Windows. The system prints a prompt, iiii\i{differences between SSH, Telnet and Rlogin}r client and server are both behind the same (good) firewall, it is more likely to be safe to use Telnet or Rlogin, but we still recommend you use SSH. Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3ed5fff187a05fe575b085d8435fd158 Text-delta-base-sha1: ec358cea978640695b3c44aa9a291cfb323869b2 Text-content-length: 8435 Text-content-md5: 2570b057ee8dd652d738de475c78dc72 Text-content-sha1: 6157f5e763bd454058736758a4b1756eb4ee9428 Content-length: 8475 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNxba!:e8> mVu(Dnhz @9T%uQss?7^Z0UHFBc{6B]QX^< (jXaqzZ`[DDP3')po* .N5)L@qc]q8#]M+|c:[0" Y5!@ ,cMgDdL)O\versionid $Id: using.but,v 1.22 2004/04/08 12:38:53 simon\I{copy and paste}Often in a PuTTY session you will find text on your terminal screen which you want to type in again. Like most other terminal emulators, PuTTY allows you to copy and paste the text rather than having to type it again. Also, copy and paste uses the \I{Windows clipboard}Windows \i{clipboard}, so that you can paste (for example) URLs into a web browser, or paste from a word \i{mouse}. In order to copy text to the clipboard, you just click the \i{left mouse button} in the terminal window, and drag to \I{selecting text}select text. When you let go of the button, the text is \e{automatically} copied to the clipboard. You do not need to press Ctrl-C or Ctrl-Ins; in fact, if you do press Ctrl-C, PuTTY will send a Ctrl-C character down your session to the server where it will probably \i{Shift-Ins}, or selecting \q{Paste} from the Ctrl+right-click context menu, have the same effect.) When you click the \i{right mouse button}, PuTTY will read whatever is in the Windows clipboard and paste it into your session, \e{exactly} as if it had been typed at the keyboard. (Therefore, be careful of pasting formatted text into an editor that does automatic indenting; you may find that the spaces pasted from the clipboard plus the spaces added by the editor add up to too many spaces and ruin the formatting. There is nothing PuTTY can do about this.) If you \i{double-click} the left mouse button, PuTTY will select a whole word. If you double-click, hold down the second click, and drag the mouse, PuTTY will select a sequence of whole words. (You can adjust \i{triple-click} and drag, then PuTTY will select a whole line or sequence of lines. If you want to select a \I{rectangular selection}rectangular region instead of selecting to the end of each line, you can do this by holding down Alt when you make your selection. (You can also configure rectangular selection to be the default, and then holding down Alt gives the normal behaviour instead. See \k{config-rectselect} for details.) If you have a \i{middle mouse button}, then you can use it to \I{adjusting a selection}adjust an existing selection if you selected something slightly wrong. (If you have configured the middle mouse button to paste, then the right mouse button does this instead.) Click the button on the screen, and you can pick up the nearest end of the selection and drag it to \I{scrollback}\i{history}\i{Shift-PgUp} and \i{Shift-PgDn}. You can scroll a line at a time using \i{Ctrl-PgUp} and \i{Ctrl-PgDn}. These are still \i{System menu}\i{Event Log}\i{clipboard}. If you are \ii{Special commands} Depending on the protocol used for the current session, there may be a submenu of \q{special commands}. These are protocol-specific tokens, such as a \i{\q{break} signal}, that can be sent down a connection in addition to normal data. Currently only Telnet and SSH have special commands. \# FIXME: possibly the full list of special commands should be \# given here, if only so that it can be sensibly indexed and \# someone looking up (e.g.) AYT can find out how to send one?i{\q{New Session}} will start a completely new instance of PuTTY, and bring up the configuration box as normal. \b Selecting \i{\q{Duplicate Session}i{\q{Saved Sessions} submenu}\I{settings, changing}Changing your session settings If you select \i{\q{Change Settings}\i{Copy All to Clipboard}\i{clipboard} in one go. \S2{reset-terminal} \I{scrollback, clearing}Clearing and \I{terminal, resetting}resetting the terminal The \i{\q{Clear Scrollback}} option on the system menu tells PuTTY to i{\q{Reset Terminal}} option causes a full reset of the terminal emulation. A VT-series terminal is a complex piece of software and can easily get into a state where all the text printed becomes unreadable. (This can happen, for example, if you accidentally output a binary file to your terminal.) If this happens, selecting Reset Terminal should sort it out. \S2{using-fullscreen} \ii{Full screen}\i{log file} of your \I{session log}i{\q{Logging} panel} \i{character set} configuration If you find that special characters (\i{accented characters}i{\q{Translation} panel}, you should see a large number of character sets which you can \i{X11 forwarding}\i{X server} should tell you what it does i{\c{DISPLAY} environment variable}\i{port forwarding}\I{dynamic port forwarding}dynamic \I{SOCKS} proxying. For this, you will need to select the \q{Dynamic} radio button instead of \q{Local}, and then you should not enter anything into the \q{Destination} box (it will be ignored). This will cause PuTTY to listen on the port you have specified, and provide a SOCKS proxy service to any programs which connect to that port. So, in particular, you can forward other PuTTY connections through it by setting up the Proxy control panel (see \k{config-proxy} for \i{IP address} example) \c{127.0.0.5:79} to a remote machine's \cw{finger} port, then you should be able to run commands such as \c{finger fred@127.0.0.5}. This can be useful if the program connecting to the forwarded port doesn't allow you to change the port number it uses. This feature is available for local-to-remote forwarded ports; SSH1 is unable to support it for remote-to-local ports, while SSH2 can support it in theory but servers will not necessarily cooperate. \H{using-rawprot} Making \i{raw TCP connections} A lot of \I{debugging Internet protocols}Internet protocols are composed of commands and responses in plain text. For example, \i{SMTP} (the protocol used to transfer e-mail), \i{NNTP} (the protocol used to transfer Usenet news), and \i{HTTP} (the protocol used to serve Web pages) all consist of commands in readable plain I{\q{Raw} protocol}\q{Raw}, from the \q{Protocol} buttons in the \q{Session} configuration panel. (See \k{config-hostname}.) You can then enter a host name and a port \i{command-line arguments} (e.g., from a \i{command prompt window}, or a \i{Windows shortcut}). \S{using-cmdline-session} Starting a session from the command line \I\c{-ssh}\I\c{-telnet}\I\c{-rlogin}\I\c{-raw}These options allow you to bypass the configuration window and launch straight into a \i{telnet URLs} in ii\c{-load}: load a saved session \I{saved sessions, loading from command line}The \c{-load} option causes PuTTY to load configuration details out of a saved session. If these details include a host name, then this option is all you need to make PuTTY start a session (although Plink still requires an i\c{-ssh} selects the SSH protocol. \b \i\c{-telnet} selects the Telnet protocol. \b \i\c{-rlogin} selects the Rlogin protocol. \b \i\c{-raw} selects the raw protocol (which only work with the SSH protocol). These options are equivalent to the \i{protocol selection} buttons in i\c{-v}: increase verbosity \I{verbose mode}Most of the PuTTY tools can be made to tell you more about what they are doing by supplying the \c{-v} option. If you are having trouble when making a connection, or you're simply curious, you can turn this switch on and hope to find out more about what is happening. \S2{using-cmdline-l} \i\c{-l}: specify a \i{login name}i\c{-L}, \i\c{-R} and \i\c{-D}: set up \i{port forwardings}i\c{-m}: read a remote command or script from a file The \i most Unix systems, you can even put multiple lines in this file and execute i\c{-P}: specify a \i{port number}is option is equivalent to the port number control in the Session panel of the PuTTY configuration box (see \k{config-hostname}). \S2{using-cmdline-pw} \i\c{-pw}: specify a \i{password}i\c{-A} and \i\c{-a}: control \i{agent forwarding}\i{Pageant}i\c{-X} and \i\c{-x}: control \i{X11 forwarding}i\c{-t} and \i\c{-T}: control \i{pseudo-terminal allocation}i\c{-C}: enable \i{compression}i\c{-1} and \i\c{-2}: specify an \i{SSH protocol version} The \c{-1} and \c{-2} options force PuTTY to use version \I{SSH1}1 or version \I{SSH2}2 of the SSH protocol. These options are only meaningful if i\c{-i}: specify an SSH \i{private key}\i{public-key authentication}, see Revision-number: 4042 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:16.952402Z PROPS-END Revision-number: 4043 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:16.961561Z PROPS-END Revision-number: 4044 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:16.970314Z PROPS-END Revision-number: 4045 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:16.978938Z PROPS-END Revision-number: 4046 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:16.987263Z PROPS-END Revision-number: 4047 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:16.996249Z PROPS-END Revision-number: 4048 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.005425Z PROPS-END Revision-number: 4049 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.014057Z PROPS-END Revision-number: 4050 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.022981Z PROPS-END Revision-number: 4051 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.032049Z PROPS-END Revision-number: 4052 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.041416Z PROPS-END Revision-number: 4053 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.050175Z PROPS-END Revision-number: 4054 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.058543Z PROPS-END Revision-number: 4055 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.067167Z PROPS-END Revision-number: 4056 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.076073Z PROPS-END Revision-number: 4057 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.085215Z PROPS-END Revision-number: 4058 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.093845Z PROPS-END Revision-number: 4059 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.103536Z PROPS-END Revision-number: 4060 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.112821Z PROPS-END Revision-number: 4061 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.122401Z PROPS-END Revision-number: 4062 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.131193Z PROPS-END Revision-number: 4063 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.139601Z PROPS-END Revision-number: 4064 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.148208Z PROPS-END Revision-number: 4065 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.157474Z PROPS-END Revision-number: 4066 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.166490Z PROPS-END Revision-number: 4067 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.175683Z PROPS-END Revision-number: 4068 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.184383Z PROPS-END Revision-number: 4069 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.194439Z PROPS-END Revision-number: 4070 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.219346Z PROPS-END Revision-number: 4071 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.228948Z PROPS-END Revision-number: 4072 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.237495Z PROPS-END Revision-number: 4073 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.247163Z PROPS-END Revision-number: 4074 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.256900Z PROPS-END Revision-number: 4075 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.265795Z PROPS-END Revision-number: 4076 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.274519Z PROPS-END Revision-number: 4077 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.283529Z PROPS-END Revision-number: 4078 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.291985Z PROPS-END Revision-number: 4079 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.301167Z PROPS-END Revision-number: 4080 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.309556Z PROPS-END Revision-number: 4081 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.318437Z PROPS-END Revision-number: 4082 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.327454Z PROPS-END Revision-number: 4083 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.335881Z PROPS-END Revision-number: 4084 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.344639Z PROPS-END Revision-number: 4085 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.353490Z PROPS-END Revision-number: 4086 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.362206Z PROPS-END Revision-number: 4087 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.372284Z PROPS-END Revision-number: 4088 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.380910Z PROPS-END Revision-number: 4089 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.389160Z PROPS-END Revision-number: 4090 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.399469Z PROPS-END Revision-number: 4091 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.409926Z PROPS-END Revision-number: 4092 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2004-04-17T20:25:09.000000Z K 7 svn:log V 58 Add -V for version information to plink, pscp, and psftp. K 10 svn:author V 4 owen PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f3abb94e93b27fbbeeee782434103a30 Text-delta-base-sha1: b0d102d3d0753107f942e0510436240cdfc1ac69 Text-content-length: 204 Text-content-md5: d816c5441c46b4c186af8ba929e49320 Text-content-sha1: 609175e05cd39b108a362e904681731e39051c85 Content-length: 244 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVN$f- |%printf(" -V print version information\n"); exit(1); } static void version(void) { printf("plink: %s\n", verif (!strcmp(p, "-V")) { version() Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b6af2b79392b28cc906c3a6b17e21fdb Text-delta-base-sha1: 00331635e09dbe67f8e1ebe0a55f976dd3842b84 Text-content-length: 192 Text-content-md5: f1e54dcbf7d8e8cc6890be0409fde250 Text-content-sha1: 3c8e4d67070d0e70fd0b36c2173582f7b8154c52 Content-length: 232 K 15 cvs2svn:cvs-rev V 4 1.74 PROPS-END SVN0q=B;U[printf(" -V print version information\n"); cleanup_exit(1); } static void version(void) { printf("psftp: %s\n", ver); V") == 0) { version Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c631032558397172df90a5c72c416ec9 Text-delta-base-sha1: 55cdc325ffed1a96debf5534d2f3ace22cd94415 Text-content-length: 165 Text-content-md5: 31f1b1701087b88ca9c4a8d3ba605f25 Text-content-sha1: 1b81165246dcb23fbb72cffacbae74e2cbb1838a Content-length: 206 K 15 cvs2svn:cvs-rev V 5 1.117 PROPS-END SVNW~@W:wsKH printf(" -V print version informationversion(void) { printf("pscp: %s\n", ver);V") == 0) { version Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3cf814c4c65c3bbda0e241d7587bda64 Text-delta-base-sha1: 9dac1136ed68483c179872199dc84b96131aaed1 Text-content-length: 187 Text-content-md5: 085952a3b79a3b04c853c3f8c6891ea0 Text-content-sha1: 5d6097c48c8293cc76fd39e5659a87d44019cf07 Content-length: 227 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNH b||[8printf(" -V print version information\n"); exit(1); } static void version(void) { printf("plink: %s\n", verV")) { version() Revision-number: 4093 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.640503Z PROPS-END Revision-number: 4094 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.649994Z PROPS-END Revision-number: 4095 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.659306Z PROPS-END Revision-number: 4096 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2004-04-20T08:40:35.000000Z K 7 svn:log V 17 putty.scarlet.be K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a6b6a7f398c2365eb69697cde1c2236f Text-delta-base-sha1: c999fd79ad986fd521f34aff00ee9f58dbd0d5a5 Text-content-length: 54 Text-content-md5: 88e72cf56aaa62f10721b6b291ca08ab Text-content-sha1: b677d6c0b33b603af6c53388e0d674d895302c49 Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVNE2+R1-scarlet.be/">putty.scarlet.be Revision-number: 4097 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.978309Z PROPS-END Revision-number: 4098 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.987674Z PROPS-END Revision-number: 4099 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:17.996767Z PROPS-END Revision-number: 4100 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.006118Z PROPS-END Revision-number: 4101 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.014707Z PROPS-END Revision-number: 4102 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.023399Z PROPS-END Revision-number: 4103 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.031797Z PROPS-END Revision-number: 4104 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.040528Z PROPS-END Revision-number: 4105 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.049506Z PROPS-END Revision-number: 4106 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.058173Z PROPS-END Revision-number: 4107 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.067960Z PROPS-END Revision-number: 4108 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2004-04-21T08:15:12.000000Z K 7 svn:log V 36 Fix links to the crypto law survey. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 083f3c3ccab248573b920d77afa30388 Text-delta-base-sha1: 6dc19da88f5fabdfd09e5b07b7e54f51b9147e25 Text-content-length: 47 Text-content-md5: 21029631397ff1387dd70965ff90237f Text-content-sha1: 8ad766abf6a61f2a41162411c2c9b35c8d804c5f Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN O&ouvt.nl/koops/cryptolaw/ Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5e714eaf9a23e39164ba1376c4f9ab5f Text-delta-base-sha1: debd6d937fdda424cabcef06e77d917e80f93cbe Text-content-length: 44 Text-content-md5: 55d5ee4d9d3326cea9e9a97d0f5bb49f Text-content-sha1: af50d80f54ef4c77c6308f72e2f50e5f38307ca9 Content-length: 84 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN t{uvt.nl/koops/cryptolaw/ Revision-number: 4109 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.172263Z PROPS-END Revision-number: 4110 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2004-04-21T17:44:15.000000Z K 7 svn:log V 59 Summary: Support for Internationalized Domain Names (IDNs) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/idn Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 636 Text-content-md5: b45267587e588c39dec0216ace6a39ca Text-content-sha1: 4a2833ab9f44a9092c637e0ea06e90066b3d22b6 Content-length: 752 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNnnnSummary: Support for Internationalized Domain Names (IDNs) Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body

    We've had a couple of requests for IDN support (RFC3490 et al) in PuTTY.

    Ideally this would be implemented by the OS. However it's been suggested to us that Microsoft at least won't add anything "until at least Longhorn". There are various libraries out there such as the VeriSign IDN SDK and GNU libidn. Revision-number: 4111 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.216508Z PROPS-END Revision-number: 4112 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:18.225424Z PROPS-END Revision-number: 4113 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2004-04-22T14:17:38.000000Z K 7 svn:log V 16 Add PuTTY Magic K 10 svn:author V 4 owen PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5ef0d095bc6bedc13ade009b1f610a1e Text-delta-base-sha1: f5aaab67c9a56eb48adb6a7f9edd7da0f96fbcca Text-content-length: 162 Text-content-md5: 66b0b575765d8dd98b7e4256d9602821 Text-content-sha1: 82320d94d2b6b68f4838c882f83498cf0bd83ec7 Content-length: 202 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN4S ( !www.kenworld.se/robert/index.asp?dir=Putty%20Magic">PuTTY Magic provides borderlessness, transparency, and alphablending in PuTTY. Revision-number: 4114 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.013177Z PROPS-END Revision-number: 4115 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.023521Z PROPS-END Revision-number: 4116 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.032828Z PROPS-END Revision-number: 4117 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.041935Z PROPS-END Revision-number: 4118 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.050965Z PROPS-END Revision-number: 4119 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.060321Z PROPS-END Revision-number: 4120 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.069373Z PROPS-END Revision-number: 4121 Prop-content-length: 124 Content-length: 124 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-04-23T11:40:38.000000Z K 7 svn:log V 24 fix grocer's apostrophe PROPS-END Node-path: putty-wishlist/data/sgr21 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 68c43519623aedcdf4d1f1fb30207743 Text-delta-base-sha1: 72219e882d3b9b21ab8364d03611343bd0b2f699 Text-content-length: 64 Text-content-md5: 3272a45c0811871d606dda8370acfb52 Text-content-sha1: 50a86c844fb82db1fa1c0f774ad8af22972daeec Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN/.0~1Summary: PuTTY's interpretation of SGR 21 differ Revision-number: 4122 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2004-04-23T11:45:32.000000Z K 7 svn:log V 27 Add link to newmodes draft K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-kex-repeat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 022c26a4b2e4b46f8807d9c0034bc966 Text-delta-base-sha1: 78001eb2256b2c7a5d791e298e8b14e1b51886c5 Text-content-length: 119 Text-content-md5: 0f242980ea3c0ed8b752f800bee2a70b Text-content-sha1: f94a0038777b287e0575a82666d442469f128d9b Content-length: 158 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNU a\aj really ought Revision-number: 4123 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-04-23T11:53:57.000000Z K 7 svn:log V 23 Add John Sullivan note PROPS-END Node-path: putty-wishlist/data/window-placement Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6b45ac7e8761b3fe197c2fb8ec0c68d7 Text-delta-base-sha1: 5aef7e513b9134022f72331a560c03784246ca93 Text-content-length: 161 Text-content-md5: bbfd8131bc84662ca23d7d378cf1cad7 Text-content-sha1: bfacd9f4e5c656b558c225fe85d0362f020bc05a Content-length: 200 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNss Further update: it's been suggested that GetWindowDC(NULL) should be fine in 99% of cases. <12250972734.20040408170548@kanargh.force9.co.uk> Revision-number: 4124 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2004-04-23T12:03:48.000000Z K 7 svn:log V 30 Update some rotted FAQ links. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/function-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bad754cc27945ca6f2241b81a3f96c94 Text-delta-base-sha1: c68751eef333483aef23fc89f9fee2a2a5b95eef Text-content-length: 37 Text-content-md5: 764cad5e1fd2492eef3c9d60571abcd2 Text-content-sha1: 268140faf826be3e0411110b378ac75e47f9760c Content-length: 76 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN Yi7.15">FAQ A.7.15 Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3b025cf877d13263a935841404d68c65 Text-delta-base-sha1: c4df97e79955cbf3fbdfa6666d04d000b17c5e4a Text-content-length: 21 Text-content-md5: ab0c1956883324695044ee2e7550d00a Text-content-sha1: f02830973c1aec06b9ce2100e9a0d50458e72512 Content-length: 60 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNww X3 Node-path: putty-wishlist/data/startup-fullscreen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5c9edac5c73e1d9a7cd18d04906f70fc Text-delta-base-sha1: b90d55caa2c647c8f0d773eacb4fa5cdeaeacb71 Text-content-length: 22 Text-content-md5: 7c8b45e51a41829bf588aff679e7282b Text-content-sha1: eb30065255e7cc6089e71cab0e528eab6e326041 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNRR IJ6 Node-path: putty-wishlist/data/term-reset-title Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 074e87daf9bf5857f24ea134eec336b2 Text-delta-base-sha1: 16d611000f0cf6f67dbd35e389dc02450b0638be Text-content-length: 24 Text-content-md5: 37179c8ed84634d938ba3856977343a4 Text-content-sha1: 8bdcfd0c7b0ee2f7d5643440062c46d244f8b2d5 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN x7.13 Node-path: putty-wishlist/data/unicode-mappings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 529d694703105784f7c79d02666f8552 Text-delta-base-sha1: c0b918437e5073e21a7eaa926c19210b0e3978c0 Text-content-length: 25 Text-content-md5: 02e00675e173e47f7206259fbe0c2de8 Text-content-sha1: 95546be38f5c8815d4fe3337f96bff91d7e19e59 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNuu lp7.18 Node-path: putty-wishlist/data/virtuallock Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 150101d7af89d3ee29c3ea2fb5dc2e32 Text-delta-base-sha1: 6f5b6e3db3ea5d96b5b5d28d33eecbd1086b7c95 Text-content-length: 22 Text-content-md5: 366fa4d5aa4bfe2ea7b1b9474b7842bb Text-content-sha1: ca167cf83e785df43328489b4e6a2955323b9e27 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN H:I8 Node-path: putty-wishlist/data/win-randseed-location Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 09ab92786c919bd4c0143d7468615e44 Text-delta-base-sha1: d256180c53a86dc2392ec298d3640b5851699daf Text-content-length: 22 Text-content-md5: b71489efd006dff1c49e18f4437c25c5 Text-content-sha1: 9db0dab8deba0781b9795d8c3df9aa5441119ac8 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNGG uQv5 Revision-number: 4125 Prop-content-length: 112 Content-length: 112 K 8 svn:date V 27 2004-04-23T12:07:21.000000Z K 7 svn:log V 12 Update link K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/port-wince Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eb77124bddcaf8770d98ee8144c2db04 Text-delta-base-sha1: 87ac2688eb40d70611d0bf8f12f8f59b1565d486 Text-content-length: 52 Text-content-md5: 6b51f423334171e41e80143f582bedb7 Text-content-sha1: 172e9fe90c89663d53b67b7692b20d94f3e8c0d2 Content-length: 91 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN|~ A;duxy.net/">pocketputty.duxy.net Revision-number: 4126 Prop-content-length: 194 Content-length: 194 K 8 svn:date V 27 2004-04-23T12:13:30.000000Z K 7 svn:log V 94 Include my musings from 20040301184227.GD26974@chiark.greenend.org.uk, since no-one objected. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy-password-prompt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 66ee7307004e599dea91a2e3c1a80565 Text-delta-base-sha1: e71ddae2aedce05a6d0eca1b0a078d6928dae517 Text-content-length: 1439 Text-content-md5: 2b9fa2e07be64539f09808002369521b Text-content-sha1: 851ec8ee97375e5f02a46f0d8c457c66f7719149 Content-length: 1478 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNq~ r Each proxied connection maps to exactly one actual network connection, and our UI may need to reflect this (no attempt to log in without password before prompting; no retries). I (JTN) have just checked all the proxy protocols we support (SOCKS4, SOCKS5, HTTP), and I don't _think_ any of them support the sending of username but no password (as opposed to an empty password). Therefore I think this change to the proxy authentication UI should suffice: [x] Attempt username/password authentication Username: (o) prompt ( ) use this: [abc123 ] Password: (o) prompt ( ) use this: [****** ] and would map onto proxy types as follows: - telnet: if checked, %user and %pass as specified, otherwise zero-length (could be generous and only prompt for %user and %pass if they appear in the command string) - SOCKS4/4A: if checked, username as specified, otherwise zero-length (ignore password always) - SOCKS5: if checked, user/pass as specified, otherwise don't attempt auth - HTTP: if checked, user/pass as specified, otherwise don't attempt auth (bomb out if requested?) - proxy command: similar to telnet I guess that prompting should occur by the normal mechanism of a prompt in the terminal window, which probably means some upheaval. Probably a good time to implement proxy-logging too. Legacy settings: preserve whatever the current implied behaviour turns out to be, I guess. Revision-number: 4127 Prop-content-length: 284 Content-length: 284 K 8 svn:date V 27 2004-04-23T12:32:47.000000Z K 7 svn:log V 183 Remove duplicate `proxy-http-digest-auth' in favour of `http-digestauth' (which had the higher priority). Also, muse about whether we need to worry about including this in PuTTYtel. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/http-digestauth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: df073e3d08b4533964ae19d21b7d28e3 Text-delta-base-sha1: 44a909fc16459fb5969d3d3f6df2436a2e31e511 Text-content-length: 349 Text-content-md5: 80d520a634e057392ee109ee7f0f8c43 Text-content-sha1: 2e3def95c7723fbe69c79ba399fa93016abac8ff Content-length: 388 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN zCDV8|apSummary: PuTTY should support HTTP Digest authentication for proxieswhen using HTTP proxies, PuTTY only supports HTTP Basic authentication, which involves sending the user's password over the ludicrously complex, so PuTTY should probably support it. Do we need to worry about whether this capability ends up in PuTTYtel? Node-path: putty-wishlist/data/proxy-http-digest-auth Node-action: delete Revision-number: 4128 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.539519Z PROPS-END Revision-number: 4129 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.548708Z PROPS-END Revision-number: 4130 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.557595Z PROPS-END Revision-number: 4131 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:19.566649Z PROPS-END Revision-number: 4132 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2004-04-24T12:25:09.000000Z K 7 svn:log V 34 Tweak documentation of -V option. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/man-pl.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 032b6e77af437adb3fb2fad024e7b3a4 Text-delta-base-sha1: 1f3727465283a6ef144294ac6daaf637c4d6b9dc Text-content-length: 63 Text-content-md5: 7628de1d2466cedea0dad3b08f626159 Text-content-sha1: c9bc3eedc19c37cf3d7b167df3c36605e77d7217 Content-length: 102 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN|1 *jV} \dd Show version information and exit. Node-path: putty/doc/man-pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b46736162e8b263edc3d9fd606451c18 Text-delta-base-sha1: 8fd817e0980110fd81629beab06584122d610456 Text-content-length: 63 Text-content-md5: c104ef85ed2996d973b208444b007ad1 Text-content-sha1: 076f3e8cc6688b3bd6308941b92c0bee891e67ed Content-length: 102 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN/d *)V} \dd Show version information and exit. Node-path: putty/doc/man-psft.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8fa8de28b2f4d7370d8261443e33eeda Text-delta-base-sha1: 45c099e8ca70108b9e87b591f3e48d9a9a33d65c Text-content-length: 63 Text-content-md5: 8c5a488815178af270a4d1951b81d043 Text-content-sha1: 4a49bf569f89207c45ea02e37ea35d903dc64ecd Content-length: 102 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNM *2&'V} \dd Show version information and exit. Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 47da628c4af66ec9bffbb9bc44591239 Text-delta-base-sha1: 73ef23c91079c8bf669b14f6f7be80d0dab74b27 Text-content-length: 120 Text-content-md5: e503589291316960f144a278e894109f Text-content-sha1: 8916d247b9e61912414cbebbf9eed7c3c6e64d0d Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVN8]T:} \versionid $Id: plink.but,v 1.22 2004/04/24 12:25:08 jacobXXV show version information Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 657fa313841c83d0d61009aecc4fb78b Text-delta-base-sha1: 4a8b7a939d3ac87b9dd0498131e8e1bda3c49620 Text-content-length: 120 Text-content-md5: 70e98675c6d40c86260695bd63386500 Text-content-sha1: ee0a7e6a0df202b4e5f050faaf7acce71ac2c184 Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNEn\H2|B\versionid $Id: pscp.but,v 1.26 2004/04/24 12:25:0XX\c -V print version information Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d816c5441c46b4c186af8ba929e49320 Text-delta-base-sha1: 609175e05cd39b108a362e904681731e39051c85 Text-content-length: 62 Text-content-md5: 35ea9d9bfae5f698d175797c7cc53d19 Text-content-sha1: 6dfb5726c0897b67245f855c08ec82f4a24e23d7 Content-length: 102 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVNff" "DV print version information Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 085952a3b79a3b04c853c3f8c6891ea0 Text-delta-base-sha1: 5d6097c48c8293cc76fd39e5659a87d44019cf07 Text-content-length: 62 Text-content-md5: 8f794789e35289f303a35c718c9f5f51 Text-content-sha1: 025427a3097c2a2f0883a807b97448170a6d4bb2 Content-length: 102 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN "k VqV print version information Revision-number: 4133 Prop-content-length: 461 Content-length: 461 K 8 svn:date V 27 2004-04-24T20:05:03.000000Z K 7 svn:log V 360 In SSH, we now send terminal speeds to the server when requesting a pty (we didn't before) - `ssh-termspeed'. In the process, I've removed the individual controls on the Telnet and Rlogin panels and replaced them with one on the Connection panel (since they were backed by the same storage anyway). The terminal speeds sent in SSH are logged in the Event Log. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f96bdd54c2884ce01e3d58fb66761b87 Text-delta-base-sha1: e0084504760a1d6424a94219e395e717eda32a98 Text-content-length: 91 Text-content-md5: 2210256abda271d46b9555bd4d1e5749 Text-content-sha1: 6795b68311faccc31b895f40a46c28d266904c77 Content-length: 131 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN>1)|$HD \$Terminal speeds", 's', 50, HELPCTX(connection Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 867d8931b52e15c9bfb8aaf25eecf6e3 Text-delta-base-sha1: dff5966a85aff3e56708fd7725867cb64dc0d7a4 Text-content-length: 1041 Text-content-md5: 2fecadd9ea2c186ada3aaacefb557bd9 Text-content-sha1: 65f91e0ab0d2805213cbca5e4932b820818434a5 Content-length: 1081 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVNS\!bu5-Ro;=/L\versionid $Id: config.but,v 1.77 2004/04/24 20:05:03termspeed} \q{Terminal speeds} \cfg{winhelp-topic}{connection.termspeed} The Telnet, Rlogin, and SSH protocols allow the client to specify terminal speeds to the server. This parameter does \e{not} affect the actual speed of the connection, which is always \q{as fast as possible}; it is just a hint that is sometimes used by server software to modify its behaviour. For instance, if a slow speed is indicated, the server may switch to a less bandwidth-hungry display mode. The value is usually meaningless in a network environment, but PuTTY lets you configure it, in case you find the server is reacting badly to the default value. The format is a pair of numbers separated by a comma, for instance, \c{38400,38400}. The first number represents the output speed (\e{from} the server), and the second is the input speed (\e{to} the server). (Only the first is used in the Rlogin protocol.) This option has no effect on Raw connections Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 51d79f18bdb0e1de6c81c9a6bca179b0 Text-delta-base-sha1: 0564eb8465f4ad84fa85c0a3b1bf36f9823d3d8b Text-content-length: 1385 Text-content-md5: d1810602748f7c85dda7f7ce141ddd72 Text-content-sha1: 26767234d7f913b58c913097815b34eb30a01c34 Content-length: 1426 K 15 cvs2svn:cvs-rev V 5 1.308 PROPS-END SVNRhu+fG4/* Unpick the terminal-speed string. */ /* XXX perhaps we should allow no speeds to be sent. */ int ospeed = 38400, ispeed = 38400; /* last-resort defaults */ sscanf(ssh->cfg.termspeed, "%d,%d", &ospeed, &ispeed); /* Send the pty request. *//* width,height in pixels */ PKT_CHAR, 192, PKT_INT, ispeed, /* TTY_OP_ISPEED */ PKT_CHAR, 193, PKT_INT, ospeed, /* TTY_OP_OSPEED */ f(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)", ospeed, ispeedi//}3}Mv|\uG\xKOmote_cmd_ptr2) { cmd = ssh->cfg.remote_cmd_ptr2; ssh->fallback_cmd = TRUE; } if (*cmd) send_packet(ssh, SSH1_CMSG_EXEC_CMD, PKT_STR, cmd, PKT_END); else send_packet(ssh, SSH1_CMSG_EXEC_SHELL, PKT_END); logevent("Started session")if (ssh->ldisc) ldis/* Unpick the terminal-speed string. */ /* XXX perhaps we should allow no speeds to be sent. */ int ospeed = 38400, ispeed = 38400; /* last-resort defaults */ sscanf(ssh->cfg.termspeed, "%d,%d", &ospeed, &ispeed); /* Build the pty request. */byte(ssh, 128); /* TTY_OP_ISPEED */ ssh2_pkt_adduint32(ssh, ispeed); ssh2_pkt_addbyte(ssh, 129); /* TTY_OP_OSPEED */ ssh2_pkt_adduint32(ssh, ospeed); ssh2_pkt_addstring_data(ssh, "\0", 1); /* TTY_OP_ENDf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)", ospeed, ispeed Node-path: putty/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 492d57baa927939eb9faf13e6690b9d0 Text-delta-base-sha1: fc1c0ed00d725730d13c5c2c84e98e3f9735e1d4 Text-content-length: 62 Text-content-md5: 0931ec119c224580164199c6e7e5f155 Text-content-sha1: 178a477e54f66a69cbd0a6ce9bbaf4e28dbb80d3 Content-length: 101 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNqA6j=4termspeed "connection.termspeed Revision-number: 4134 Prop-content-length: 255 Content-length: 255 K 8 svn:date V 27 2004-04-24T20:05:58.000000Z K 7 svn:log V 154 Split out sending of terminal _speed_ in SSH to a separate wish `ssh-termspeed' (which I've just implemented). Also fettle `terminal-modes' itself a bit. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh-termspeed Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 924 Text-content-md5: 190f4b4c94167cb6166b9f09e3e2972a Text-content-sha1: 255f1187fae5fb57f7c39003d0bc06098d2902b4 Content-length: 1040 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Send terminal speeds in SSH Class: wish Difficulty: fun Priority: medium Content-type: text/x-html-body Fixed-in: 2004-04-25

    We've had a couple of requests for PuTTY to transmit a terminal speed in SSH, as it already does for Telnet and Rlogin protocols.

    Apparently server defaults in the absence of information from PuTTY aren't always helpful; in particular, OpenSSH on HP-UX ends up at 300 baud(!), and this causes vi and emacs to invoke various emergency procedures (e.g., vi uses a 5-line display).

    As of 2004-04-25, PuTTY will send terminal speeds in SSH based on the same terminal-speed string as for other protocols (which has been moved to the Connection panel in the UI).

    Currently there's no way to turn off the sending of terminal speeds in SSH (speeds are always sent). If anyone complains, we can change this. Node-path: putty-wishlist/data/terminal-modes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e74e9a70dcc6795ab00e637dc01ee13f Text-delta-base-sha1: 1995f4a19465d7e3b31fe78b0e3256f3905b57b5 Text-content-length: 263 Text-content-md5: 8d5e2b90b41b493eb41f4c519bfc11af Text-content-sha1: 1be7b6167bcaac39b081397870f9a75cb15ad348 Content-length: 302 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN[%hh`Y)9E4'Summary: Implement sending of full terminal modes in SSH Class: wish Priority: medium Difficulty: tricky apart from terminal speedA complete UI for terminal modes would be a noticeable amount of work Revision-number: 4135 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2004-04-24T21:15:02.000000Z K 7 svn:log V 146 pu.tty.se renamed to http://kato.tx.se/putty/ at administrator request. (Doesn't currently have the binaries; hopefully this will be sorted out.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 88e72cf56aaa62f10721b6b291ca08ab Text-delta-base-sha1: b677d6c0b33b603af6c53388e0d674d895302c49 Text-content-length: 47 Text-content-md5: 6e1e123c98d8d53792d9ee1abb547419 Text-content-sha1: 1d8383fec4a8d2a8057de65ca0d57a0799404e6f Content-length: 87 K 15 cvs2svn:cvs-rev V 4 1.80 PROPS-END SVN2: >bPkato.tx.se/putty/">kato.tx Revision-number: 4136 Prop-content-length: 363 Content-length: 363 K 8 svn:date V 27 2004-04-25T09:04:38.000000Z K 7 svn:log V 262 Make mkfiles.pl less tied to PuTTY in particular, by inventing new directives that allow me to move some of the PuTTY-specific Makefile fragments into Recipe. Not complete yet, but ought to be enough for me to at least _try_ using mkfiles.pl in another project. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e95c3418d6438d92f9b2e4ff17373887 Text-delta-base-sha1: 06afb3ce81808e982f7956418b0fb17cce97fc9d Text-content-length: 2512 Text-content-md5: 7e88d3538ed1ac386be7904655030bb1 Text-content-sha1: c23f699b5b7ccb2dec5d09cd046873ec07ac8922 Content-length: 2552 K 15 cvs2svn:cvs-rev V 4 1.55 PROPS-END SVN$X*=mo9+%WM------------------------------------------------------------ # Top-level configuration. # Overall project name. !name putty # Locations and types of output Makefiles. !makefile vc Makefile.vc !makefile vcproj MSVC !makefile cygwin Makefile.cyg !makefile borland Makefile.bor !makefile lcc Makefile.lcc !makefile gtk unix/Makefile.gtk !makefile mpw mac/Makefile.mpw------------------------------------------------------------ # Additional text added verbatim to each individual Makefile. # Hack to force version.o to be rebuilt always. !begin vc version.obj: *.c *.h *.rc cl $(FWHACK) $(VER) $(CFLAGS) /c version.c !end !begin cygwin version.o: FORCE; FORCE: $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) $(VER) -c version.c !end !begin borland version.obj: FORCE FORCE: bcc32 $(FWHACK) $(VER) $(CFLAGS) /c version.obj !end !begin lcc version.o: FORCE FORCE: lcc $(FWHACK) $(VER) $(CFLAGS) /c version.c !end # For Unix, we also need the gross MD5 hack that causes automatic # version number selection in release source archives. !begin gtk version.o: FORCE; FORCE: if test -z "$(VER)" && (cd ..; md5sum -c manifest); then \ $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) `cat ../version.def` -c ../version.c; \ else \ $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) $(VER) -c ../version.c; \ fi !end # `make install' target for Unix. !begin gtk install: $(INSTALL_PROGRAM) -m 755 plink $(DESTDIR)$(bindir)/plink $(INSTALL_PROGRAM) -m 755 pscp $(DESTDIR)$(bindir)/pscp $(INSTALL_PROGRAM) -m 755 psftp $(DESTDIR)$(bindir)/psftp $(INSTALL_PROGRAM) -m 755 pterm $(DESTDIR)$(bindir)/pterm $(INSTALL_PROGRAM) -m 755 putty $(DESTDIR)$(bindir)/putty $(INSTALL_PROGRAM) -m 755 puttygen $(DESTDIR)$(bindir)/puttygen $(INSTALL_PROGRAM) -m 755 puttytel $(DESTDIR)$(bindir)/puttytel $(INSTALL_DATA) -m 644 ../doc/plink.1 $(DESTDIR)$(man1dir)/plink.1 $(INSTALL_DATA) -m 644 ../doc/pscp.1 $(DESTDIR)$(man1dir)/pscp.1 $(INSTALL_DATA) -m 644 ../doc/psftp.1 $(DESTDIR)$(man1dir)/psftp.1 $(INSTALL_DATA) -m 644 ../doc/pterm.1 $(DESTDIR)$(man1dir)/pterm.1 $(INSTALL_DATA) -m 644 ../doc/putty.1 $(DESTDIR)$(man1dir)/putty.1 $(INSTALL_DATA) -m 644 ../doc/puttygen.1 $(DESTDIR)$(man1dir)/puttygen.1 $(INSTALL_DATA) -m 644 ../doc/puttytel.1 $(DESTDIR)$(man1dir)/puttytel.1 install-strip: $(MAKE) install INSTALL_PROGRAM="$(INSTALL_PROGRAM) -s" !end # ------------------------------------------------------------------------------------------------------------------------ Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aba409c711beae87d6e9547567ece150 Text-delta-base-sha1: 8939668d9c640db728ffaa601e48046ca244b59a Text-content-length: 25940 Text-content-md5: 71b96a62e4bca431d3eb10b8a932dd7b Text-content-sha1: d4d0d7769d03bf246b309d49c4a21e81dd486841 Content-length: 25980 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVNvBq4 #7|^:\gVDC_zO5RJ9tF{aLvQ3\J9vK>LvDQ3dJ9K>pLv/En9#ECE#b_H[9*n^bjgPxzn#g=xY.BS1JJ9tF{N^FQ36J9JJ@O<J9tK>OLv)Q3;#!/usr/bin/env perl # # Cross-platform Makefile generatoruse Cwddivert = undef; # ref to scalar in which text is currently being put $help = ""; # list of newline-free lines of help text $project_name = "project"; # this is a good enough default %makefiles = (); # maps makefile types to output makefile pathnames %makefile_extra = (); # maps makefile types to extra Makefilea diversion). next if /^\s*#/ and !defined $divert; chomp; split; if ($_[0] eq "!begin" and $_[1] eq "help") { $divert = \$help; next; } if ($_[0] eq "!end") { $divert = undef; next; } if ($_[0] eq "!name") { $project_name = $_[1]; next; } if ($_[0] eq "!makefile" and &mfval($_[1])) { $makefiles{$_[1]}=$_[2]; next;} if ($_[0] eq "!begin") { if (&mfval($_[1])) { $divert = \$makefile_extra{$_[1]}; } else { $divert = \$dummy; } next; } # If we're gathering help text, keep doing so. if (defined $divert) { ${$divert} push @{$depends{$i}}, $j; Validation of input. sub mfval($) { my ($type) = @_; # Returns true if the argument is a known makefile type. Otherwise, # prints a warning and returns false; if (grep { $type eq $_ } ("vc","vcproj","cygwin","borland","lcc","gtk","mpw")) { return 1; } warn "$.:unknown makefile type '$type'\n"; return 0if (defined $makefiles{'cygwin'}) { ##-- CygWin makefile open OUT, ">$makefiles{'cygwin'}"; select OUT; print "# Makefile for $project_name under cygwin.\n". "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". # gcc command line option is -D not /D ($_ = $help) =~ s/=\/D/=-D/gs; print $_; print "\n". "# TOOLPATH = c:\\cygwin\\bin\\ # or similar, if you're running Windows\n". "# TOOLPATH = /pkg/mingw32msvc/i386-mingw32msvc/bin/\n". "CC = \$(TOOLPATH)gcc\n". "RC = \$(TOOLPATH)windres\n". "# Uncomment the following two lines to compile under Winelib\n". "# CC = winegcc\n". "# RC = wrc\n". "# You may also need to tell windres where to find include files:\n". "# RCINC = --include-dir c:\\cygwin\\include\\\n". "\n". &splitline("CFLAGS = -mno-cygwin -Wall -O2 -D_WINDOWS -DDEBUG -DWIN32S_COMPAT". " -D_NO_OLDNAMES -DNO_MULTIMON -I.")."\n". "LDFLAGS = -mno-cygwin -s\n". &splitline("RCFLAGS = \$(RCINC) --define WIN32=1 --define _WIN32=1". " --define WINVER=0x0400 --define MINGW32_FIX=1")."\n". "\n". ".SUFFIXES:\n". "\n". "%.o: %.c\n". "\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c \$<\n". "\n". "%.res.o: %.rc\n". "\t\$(RC) \$(FWHACK) \$(RCFL) \$(RCFLAGS) \$< \$\@\n". "\n"; print "\n\n"; foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.o", "X.res.o", undef); print &splitline($prog . ".exe: " . $objstr), "\n"; my $mw = $type eq "G" ? " -mwindows" : ""; $libstr = &objects($p, undef, undef, "-lX"); print &splitline("\t\$(CC)" . $mw . " \$(LDFLAGS) -o \$@ " . "-Wl,-Map,$prog.map " . $objstr . " $libstr", 69), "\n\n"; } foreach $d (&deps("X.o", "X.res.o", "", "/")) { "\n"; } print "\n"; print $makefile_extra{'cygwin'}; print "\nclean:\n". "\trm -f *.o *.exe *.res.o *.map\n". "\n"; select STDOUT; close OUT; } ##-- Borland makefile if (defined $makefiles{'borland'}) { %stdlibs = ( # Borland provides many Win32 API libraries intrinsically "advapi32" => 1, "comctl32" => 1, "comdlg32" => 1, "gdi32" => 1, "imm32" => 1, "shell32" => 1, "user32" => 1, "winmm" => 1, "winspool" => 1, "wsock32" => 1, ); open OUT, ">$makefiles{'borland'}"; select OUT; print "# Makefile for $project_name under Borland C.\n". "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". # bcc32 command line option is -D not /D ($_ = $help) =~ s/=\/D/=-D/gs; print $_; print "\n". "# so that the .rsp files still depend on the correct makefile.\n". "MAKEFILE = Makefile.bor\n". "\n". "# C compilation flags\n". "CFLAGS = -D_WINDOWS -DWINVER=0x0401\n". "\n". "# Get include directory for resource compiler\n". "!if !\$d(BCB)\n". "BCB = \$(MAKEDIR)\\..\n". "!endif\n". "\n". ".c.obj:\n". &splitline("\tbcc32 -w-aus -w-ccc -w-par -w-pia \$(COMPAT) \$(FWHACK)". " \$(XFLAGS) \$(CFLAGS) /c \$*.c",69)."\n". ".rc.res:\n". &splitline("\tbrcc32 \$(FWHACK) \$(RCFL) -i \$(BCB)\\include -r". " -DNO_WINRESRC_H -DWIN32 -D_WIN32 -DWINVER=0x0401 \$*.rc",69)."\n". "\n"; print "\n\n"; foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.obj", "X.res", undef); print &splitline("$prog.exe: " . $objstr . " $prog.rsp"), "\n"; my $ap = ($type eq "G") ? "-aa" : "-ap"; print "\tilink32 $ap -Gn -L\$(BCB)\\lib \@$prog.rsp\n\n"; } foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; print $prog, ".rsp: \$(MAKEFILE)\n"; $objstr = &objects($p, "X.obj", undef, undef); @objlist = split " ", $objstr; @objlines = (""); foreach $i (@objlist) { if (length($objlines[$#objlines] . " $i") > 50) { push @objlines, ""; } $objlines[$#objlines] .= " $i"; } $c0w = ($type eq "G") ? "c0w32" : "c0x32"; print "\techo $c0w + > $prog.rsp\n"; for ($i=0; $i<=$#objlines; $i++) { $plus = ($i < $#objlines ? " +" : ""); print "\techo$objlines[$i]$plus >> $prog.rsp\n"; } print "\techo $prog.exe >> $prog.rsp\n"; $objstr = &objects($p, "X.obj", "X.res", undef); @libs = split " ", &objects($p, undef, undef, "X"); @libs = grep { !$stdlibs{$_} } @libs; unshift @libs, "cw32", "import32"; $libstr = join ' ', @libs; print "\techo nul,$libstr, >> $prog.rsp\n"; print "\techo " . &objects($p, undef, "X.res", undef) . " >> $prog.rsp\n"; print "\n"; } foreach $d (&deps("X.obj", "X.res", "", "\\")) { "\n"; } print "\n"; print $makefile_extra{'borland'}; print "\nclean:\n". "\t-del *.obj\n". "\t-del *.exe\n". "\t-del *.res\n". "\t-del *.pch\n". "\t-del *.aps\n". "\t-del *.il*\n". "\t-del *.pdb\n". "\t-del *.rsp\n". "\t-del *.tds\n". "\t-del *.\$\$\$\$\$\$\n"; select STDOUT; close OUT; } if (defined $makefiles{'vc'}) { ##-- Visual C++ makefile open OUT, ">$makefiles{'vc'}"; select OUT; print "# Makefile for $project_name under Visual C.\n". "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". print $help; print "\n". "# so that the .rsp files still depend on the correct makefile.\n". "MAKEFILE = Makefile.vc\n". "\n". "# C compilation flags\n". "CFLAGS = /nologo /W3 /O1 /D_WINDOWS /D_WIN32_WINDOWS=0x401 /DWINVER=0x401\n". "LFLAGS = /incremental:no /fixed\n". "\n". ".c.obj:\n". "\tcl \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) /c \$*.c\n". ".rc.res:\n". "\trc \$(FWHACK) \$(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 \$*.rc\n". "\n"; print "\n\n"; foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.obj", "X.res", undef); print &splitline("$prog.exe: " . $objstr . " $prog.rsp"), "\n"; print "\tlink \$(LFLAGS) -out:$prog.exe -map:$prog.map \@$prog.rsp\n\n"; } foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; print $prog, ".rsp: \$(MAKEFILE)\n"; $objstr = &objects($p, "X.obj", "X.res", "X.lib"); @objlist = split " ", $objstr; @objlines = (""); foreach $i (@objlist) { if (length($objlines[$#objlines] . " $i") > 50) { push @objlines, ""; } $objlines[$#objlines] .= " $i"; } $subsys = ($type eq "G") ? "windows" : "console"; print "\techo /nologo /subsystem:$subsys > $prog.rsp\n"; for ($i=0; $i<=$#objlines; $i++) { print "\techo$objlines[$i] >> $prog.rsp\n"; } print "\n"; } foreach $d (&deps("X.obj", "X.res", "", "\\")) { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; } print "\n"; print $makefile_extra{'vc'}; print "\nclean: tidy\n". "\t-del *.exe\n\n". "tidy:\n". "\t-del *.obj\n". "\t-del *.res\n". "\t-del *.pch\n". "\t-del *.aps\n". "\t-del *.ilk\n". "\t-del *.pdb\n". "\t-del *.rsp\n". "\t-del *.dsp\n". "\t-del *.dsw\n". "\t-del *.ncb\n". "\t-del *.opt\n". "\t-del *.plg\n". "\t-del *.map\n". "\t-del *.idb\n". "\t-del debug.log\n"; select STDOUT; close OUT; } if (defined $makefiles{'vcproj'}) { $orig_dir = cwd; ##-- MSVC 6 Workspace and projects # # Note: All files created in this section are written in binary # mode, because although MSVC's command-line make can deal with # LF-only line endings, MSVC project files really _need_ to be # CRLF. Hence, in order for mkfiles.pl to generate usable project # files even when run from Unix, I make sure all files are binary # and explicitly write the CRLFs. # # Create directories if necessary mkdir $makefiles{'vcproj'} if(! -d $makefiles{'vcproj'}); chdir $makefiles{'vcproj'}; @deps = &deps("X.obj", "X.res", "", "\\"); %all_object_deps = map {$_->{obj} => $_->{deps}} @deps; # Create the project files # Get names of all Windows projects (GUI and console) my @prognames = &prognames("GC"); foreach $progname (@prognames) { create_project(\%all_object_deps, $progname); } # Create the workspace file open OUT, ">$project_name.dsw"; binmode OUT; select OUT; print "Microsoft Developer Studio Workspace File, Format Version 6.00\r\n". "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r\n". "\r\n". "##########\r\n". "\r\n"; # List projects foreach $progname (@prognames) { ($windows_project, $type) = split ",", $progname; } print "\r\n". "Package=<5>\r\n". "{{{\r\n". "}}}\r\n". "\r\n". "Package=<4>\r\n". "{{{\r\n". "}}}\r\n". "\r\n". "##########\r\n". "\r\n". "Global:\r\n". "\r\n". "Package=<5>\r\n". "{{{\r\n". "}}}\r\n". "\r\n". "Package=<3>\r\n". "{{{\r\n". "}}}\r\n". "\r\n". "##########\r\n". "\r\n"; select STDOUT; close OUT; chdir $orig_dir; sub create_project { my ($all_object_deps, $progname) = @_; # Construct program's dependency info %seen_objects = (); %lib_files = (); %source_files = (); %header_files = (); %resource_files = (); @object_files = split " ", &objects($progname, "X.obj", "X.res", "X.lib"); foreach $object_file (@object_files) { next if defined $seen_objects{$object_file}; $seen_objects{$object_file} = 1; if($object_file =~ /\.lib$/io) { $lib_files{$object_file} = 1; next; } $object_deps = $all_object_deps{$object_file}; foreach $object_dep (@$object_deps) { if($object_dep =~ /\.c$/io) { $source_files{$object_dep} = 1; next; } if($object_dep =~ /\.h$/io) { $header_files{$object_dep} = 1; next; } if($object_dep =~ /\.(rc|ico)$/io) { $resource_files{$object_dep} = 1; next; } } } $libs = join " ", sort keys %lib_files; @source_files = sort keys %source_files; @header_files = sort keys %header_files; @resources = sort keys %resource_files; ($windows_project, $type) = split ",", $progname; mkdir $windows_project if(! -d $windows_project); chdir $windows_project; $subsys = ($type eq "G") ? "windows" : "console"; open OUT, ">$windows_project.dsp"; binmode OUT; select OUT; print "# Microsoft Developer Studio Generated Build File, Format Version 6.00\r\n". "# ** DO NOT EDIT **\r\n". "\r\n". "# TARGTYPE \"Win32 (x86) Application\" 0x0101\r\n". "\r\n". "CFG=$windows_project - Win32 Debug\r\n". "!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r\n". "!MESSAGE use the Export Makefile command and run\r\n". "!MESSAGE \r\n". "!MESSAGE NMAKE /f \"$windows_project.mak\".\r\n". "!MESSAGE \r\n". "!MESSAGE You can specify a configuration when running NMAKE\r\n". "!MESSAGE by defining the macro CFG on the command line. For example:\r\n". "!MESSAGE \r\n". "!MESSAGE NMAKE /f \"$windows_project.mak\" CFG=\"$windows_project - Win32 Debug\"\r\n". "!MESSAGE \r\n". "!MESSAGE Possible choices for configuration are:\r\n". "!MESSAGE \r\n". "!MESSAGE \"$windows_project - Win32 Release\" (based on \"Win32 (x86) Application\")\r\n". "!MESSAGE \r\n". "\r\n". "# Begin Project\r\n". "# PROP AllowPerConfigDependencies 0\r\n". "# PROP Scc_ProjName \"\"\r\n". "# PROP Scc_LocalPath \"\"\r\n". "CPP=cl.exe\r\n". "MTL=midl.exe\r\n". "RSC=rc.exe\r\n". "\r\n". "!IF \"\$(CFG)\" == \"$windows_project - Win32 Release\"\r\n". "\r\n". "# PROP BASE Use_MFC 0\r\n". "# PROP BASE Use_Debug_Libraries 0\r\n". "# PROP BASE Output_Dir \"Release\"\r\n". "# PROP BASE Intermediate_Dir \"Release\"\r\n". "# PROP BASE Target_Dir \"\"\r\n". "# PROP Use_MFC 0\r\n". "# PROP Use_Debug_Libraries 0\r\n". "# PROP Output_Dir \"Release\"\r\n". "# PROP Intermediate_Dir \"Release\"\r\n". "# PROP Ignore_Export_Lib 0\r\n". "# PROP Target_Dir \"\"\r\n". "# ADD "# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\r\n". "# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\r\n". "# ADD BASE RSC /l 0x809 /d \"NDEBUG\"\r\n". "# ADD RSC /l 0x809 /d \"NDEBUG\"\r\n". "BSC32=bscmake.exe\r\n". "# ADD BASE BSC32 /nologo\r\n". "# ADD BSC32 /nologo\r\n". "LINK32=link.exe\r\n". "# ADD LINK32 $libs /nologo /subsystem:$subsys /machine:I386\r\n". "# SUBTRACT LINK32 /pdb:none\r\n". "\r\n". "!ELSEIF \"\$(CFG)\" == \"$windows_project - Win32 Debug\"\r\n". "\r\n". "# PROP BASE Use_MFC 0\r\n". "# PROP BASE Use_Debug_Libraries 1\r\n". "# PROP BASE Output_Dir \"Debug\"\r\n". "# PROP BASE Intermediate_Dir \"Debug\"\r\n". "# PROP BASE Target_Dir \"\"\r\n". "# PROP Use_MFC 0\r\n". "# PROP Use_Debug_Libraries 1\r\n". "# PROP Output_Dir \"Debug\"\r\n". "# PROP Intermediate_Dir \"Debug\"\r\n". "# PROP Ignore_Export_Lib 0\r\n". "# PROP Target_Dir \"\"\r\n". "# ADD "# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\r\n". "# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\r\n". "# ADD BASE RSC /l 0x809 /d \"_DEBUG\"\r\n". "# ADD RSC /l 0x809 /d \"_DEBUG\"\r\n". "BSC32=bscmake.exe\r\n". "# ADD BASE BSC32 /nologo\r\n". "# ADD BSC32 /nologo\r\n". "LINK32=link.exe\r\n". debug /machine:I386 /pdbtype:sept\r\n". "# SUBTRACT LINK32 /pdb:none\r\n". "\r\n". "!ENDIF \r\n". "\r\n". "# Begin Target\r\n". "\r\n". "# Name \"$windows_project - Win32 Release\"\r\n". "# Name \"$windows_project - Win32 Debug\"\r\n". "# Begin Group \"Source Files\"\r\n". "\r\n". "# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\r\n"; foreach $source_file (@source_files) { print "# Begin Source File\r\n". "\r\n". "SOURCE=..\\..\\$source_file\r\n"; if($source_file =~ /ssh\.c/io) { # Disable 'Edit and continue' as Visual Studio can't handle the macros print "\r\n". "!IF \"\$(CFG)\" == \"$windows_project - Win32 Release\"\r\n". "\r\n". "!ELSEIF \"\$(CFG)\" == \"$windows_project - Win32 Debug\"\r\n". "\r\n". "# ADD CPP /Zi\r\n". "\r\n". "!ENDIF \r\n". "\r\n"; } print "# End Source File\r\n"; } print "# End Group\r\n". "# Begin Group \"Header Files\"\r\n". "\r\n". "# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\r\n"; foreach $header_file (@header_files) { print "# Begin Source File\r\n". "\r\n". "SOURCE=..\\..\\$header_file\r\n". "# End Source File\r\n"; } print "# End Group\r\n". "# Begin Group \"Resource Files\"\r\n". "\r\n". foreach $resource_file (@resources) { print "# Begin Source File\r\n". "\r\n". "SOURCE=..\\..\\$resource_file\r\n". "# End Source File\r\n"; } print "# End Group\r\n". "# End Target\r\n". "# End Project\r\n"; select STDOUT; close OUT; chdir ".."; } } if (defined $makefiles{'gtk'}) { ##-- X/GTK/Unix makefile open OUT, ">$makefiles{'gtk'}"; select OUT; print "# Makefile for $project_name under X/GTK and Unix.\n". "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". # gcc command line option is -D not /D ($_ = $help) =~ s/=\/D/=-D/gs; print $_; print "\n". "# TOOLPATH = /opt/gcc/bin\n". "CC = \$(TOOLPATH)cc\n". "\n". "XLDFLAGS = `gtk-config --libs`\n". "ULDFLAGS =#\n". "INSTALL=install\n", "INSTALL_PROGRAM=\$(INSTALL)\n", "INSTALL_DATA=\$(INSTALL)\n", "prefix=/usr/local\n", "exec_prefix=\$(prefix)\n", "bindir=\$(exec_prefix)/bin\n", "mandir=\$(prefix)/man\n", "man1dir=\$(mandir)/man1\n", "\n". ".SUFFIXES:\n". "\n". "%.o:\n". "\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c \$<\n". "\n"; print &splitline("all:" . join "", map { " $_" } &progrealnames("XU")); print "\n\n"; foreach $p (&prognames("XU")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.o", undef, undef); print &splitline($prog . ": " . $objstr), "\n"; $libstr = &objects($p, undef, undef, "-lX"); print &splitline("\t\$(CC)" . $mw . " \$(${type}LDFLAGS) -o \$@ " . $objstr . " $libstr", 69), "\n\n"; } foreach $d (&deps("X.o", undef, "../", "/")) { "\n"; } print "\n"; print $makefile_extra{'gtk'}; print "\nclean:\n". "\trm -f *.o". (join "", map { " $_" } &progrealnames("XU")) . "\n"; select STDOUT; close OUT; } if (defined $makefiles{'mpw'}) { ##-- MPW Makefile open OUT, ">$makefiles{'mpw'}"; select OUT; print "# Makefile for $project_name under MPW.\n#\n". "# This file was created by `mkfiles.pl' from the `Recipe' file.\n". # MPW command line option is -d not /D ($_ = $help) =~ s/=\/D/=-d /gs; print $_; print "\n\n". "ROptions = `Echo \"{VER}\" | StreamEdit -e \"1,\$ replace /=(\xc5)\xa81\xb0/ 'STR=\xb6\xb6\xb6\xb6\xb6\"' \xa81 '\xb6\xb6\xb6\xb6\xb6\"'\"`". "\n". "C_68K = {C}\n". "C_CFM68K = {C}\n". "C_PPC = {PPCC}\n". "C_Carbon = {PPCC}\n". "\n". "# -w 35 disables \"unused parameter\" warnings\n". "COptions = -i : -i :: -i ::charset -w 35 -w err -proto strict -ansi on \xb6\n". " -notOnce\n". "COptions_68K = {COptions} -model far -opt time\n". "# Enabling \"-opt space\" for CFM-68K gives me undefined references to\n". "# _\$LDIVT and _\$LMODT.\n". "COptions_CFM68K = {COptions} -model cfmSeg -opt time\n". "COptions_PPC = {COptions} -opt size -traceback\n". "\n". "\n". "Link_68K = ILink\n". "Link_CFM68K = ILink\n". "Link_PPC = PPCLink\n". "Link_Carbon = PPCLink\n". "\n". "LinkOptions = -c 'pTTY'\n". "LinkOptions_68K = {LinkOptions} -br 68k -model far -compact\n". "LinkOptions_CFM68K = {LinkOptions} -br 020 -model cfmseg -compact\n". "LinkOptions_PPC = {LinkOptions}\n". "LinkOptions_Carbon = -m __appstart -w {LinkOptions}\n". "\n". "Libs_68K = \"{CLibraries}StdCLib.far.o\" \xb6\n". " \"{Libraries}MacRuntime.o\" \xb6\n". " \"{Libraries}MathLib.far.o\" \xb6\n". " \"{Libraries}IntEnv.far.o\" \xb6\n". " \"{Libraries}Interface.o\" \xb6\n". " \"{Libraries}Navigation.far.o\" \xb6\n". " \"{Libraries}OpenTransport.o\" \xb6\n". " \"{Libraries}OpenTransportApp.o\" \xb6\n". " \"{Libraries}OpenTptInet.o\" \xb6\n". " \"{Libraries}UnicodeConverterLib.far.o\"\n". "\n". "Libs_CFM = \"{SharedLibraries}InterfaceLib\" \xb6\n". " \"{SharedLibraries}StdCLib\" \xb6\n". " \"{SharedLibraries}AppearanceLib\" \xb6\n". " -weaklib AppearanceLib \xb6\n". " \"{SharedLibraries}NavigationLib\" \xb6\n". " -weaklib NavigationLib \xb6\n". " \"{SharedLibraries}TextCommon\" \xb6\n". " -weaklib TextCommon \xb6\n". " \"{SharedLibraries}UnicodeConverter\" \xb6\n". " -weaklib UnicodeConverter\n". "\n". "Libs_CFM68K = {Libs_CFM} \xb6\n". " \"{CFM68KLibraries}NuMacRuntime.o\"\n". "\n". "Libs_PPC = {Libs_CFM} \xb6\n". " \"{SharedLibraries}ControlsLib\" \xb6\n". " -weaklib ControlsLib \xb6\n". " \"{SharedLibraries}WindowsLib\" \xb6\n". " -weaklib WindowsLib \xb6\n". " \"{SharedLibraries}OpenTransportLib\" \xb6\n". " -weaklib OTClientLib \xb6\n". " -weaklib OTClientUtilLib \xb6\n". " \"{SharedLibraries}OpenTptInternetLib\" \xb6\n". " -weaklib OTInetClientLib \xb6\n". " \"{PPCLibraries}StdCRuntime.o\" \xb6\n". " \"{PPCLibraries}PPCCRuntime.o\" \xb6\n". " \"{PPCLibraries}CarbonAccessors.o\" \xb6\n". " \"{PPCLibraries}OpenTransportAppPPC.o\" \xb6\n". " \"{PPCLibraries}OpenTptInetPPC.o\"\n". "\n". "Libs_Carbon = \"{PPCLibraries}CarbonStdCLib.o\" \xb6\n". " \"{PPCLibraries}StdCRuntime.o\" \xb6\n". " \"{PPCLibraries}PPCCRuntime.o\" \xb6\n". " \"{SharedLibraries}CarbonLib\" \xb6\n". " \"{SharedLibraries}StdCLib\"\n". "\n"; print "\n\n"; foreach $p (&prognames("M")) { ($prog, $type) = split ",", $p; print &splitline("$prog \xc4 $prog.68k $prog.ppc $prog.carbon", undef, "\xb6"), "\n\n"; $rsrc = &objects($p, "", "X.rsrc", undef); foreach $arch (qw(68K CFM68K PPC Carbon)) { $objstr = &objects($p, "X.\L$arch\E.o", "", undef); print &splitline("$prog.\L$arch\E \xc4 $objstr $rsrc", undef, "\xb6"); print "\n"; print &splitline("\tDuplicate -y $rsrc {Targ}", 69, "\xb6"), "\n"; print &splitline("\t{Link_$arch} -o {Targ} -fragname $prog " . "{LinkOptions_$arch} " . $objstr . " {Libs_$arch}", 69, "\xb6"), "\n"; print &splitline("\tSetFile -a BMi {Targ}", 69, "\xb6"), "\n\n"; } } foreach $d (&deps("", "X.rsrc", "::", ":")) { next unless $d->{obj}; print &splitline(sprintf("%s \xc4 %s", $d->{obj}, join " ", @{$d->{deps}}), undef, "\xb6"), "\n"; print "\tRez ", $d->{deps}->[0], " -o {Targ} {ROptions}\n\n"; } foreach $arch (qw(68K CFM68K)) { foreach $d (&deps("X.\L$arch\E.o", "", "::", ":")) { next unless $d->{obj}; print &splitline(sprintf("%s \xc4 %s", $d->{obj}, join " ", @{$d->{deps}}), undef, "\xb6"), "\n"; print "\t{C_$arch} ", $d->{deps}->[0], " -o {Targ} {COptions_$arch}\n\n"; } } foreach $arch (qw(PPC Carbon)) { foreach $d (&deps("X.\L$arch\E.o", "", "::", ":")) { next unless $d->{obj}; print &splitline(sprintf("%s \xc4 %s", $d->{obj}, join " ", @{$d->{deps}}), undef, "\xb6"), "\n"; # The odd stuff here seems to stop afpd getting confused. print "\techo -n > {Targ}\n"; print "\tsetfile -t XCOF {Targ}\n"; print "\t{C_$arch} ", $d->{deps}->[0], " -o {Targ} {COptions_$arch}\n\n"; } } select STDOUT; close OUT; } if (defined $makefiles{'lcc'}) { ##-- lcc makefile open OUT, ">$makefiles{'lcc'}"; select OUT; print "# Makefile for $project_name under lcc.\n". "#\n# This file was created by `mkfiles.pl' from the `Recipe' file.\n". # lcc command line option is -D not /D ($_ = $help) =~ s/=\/D/=-D/gs; print $_; print "\n". "# so that the .rsp files still depend on the correct makefile.\n". "MAKEFILE = Makefile.lcc\n". "\n". "# C compilation flags\n". "CFLAGS = -D_WINDOWS\n". "\n". "# Get include directory for resource compiler\n". "\n". ".c.obj:\n". &splitline("\tlcc -O -p6 \$(COMPAT) \$(FWHACK)". " \$(XFLAGS) \$(CFLAGS) \$*.c",69)."\n". ".rc.res:\n". &splitline("\tlrc \$(FWHACK) \$(RCFL) -r \$*.rc",69)."\n". "\n"; print "\n\n"; foreach $p (&prognames("GC")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.obj", "X.res", undef); print &splitline("$prog.exe: " . $objstr ), "\n"; $subsystemtype = undef; if ($type eq "G") { $subsystemtype = "-subsystem windows"; } my $libss = "shell32.lib wsock32.lib ws2_32.lib winspool.lib winmm.lib imm32.lib"; print &splitline("\tlcclnk $subsystemtype -o $prog.exe $objstr $libss"); print "\n\n"; } foreach $d (&deps("X.obj", "X.res", "", "\\")) { "\n"; } print "\n"; print $makefile_extra{'lcc'}; print "\nclean:\n". "\t-del *.obj\n". "\t-del *.exe\n". "\t-del *.res\n"; select STDOUT; close OUT; } Revision-number: 4137 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2004-04-25T09:26:52.000000Z K 7 svn:log V 24 More portability fixes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7e88d3538ed1ac386be7904655030bb1 Text-delta-base-sha1: c23f699b5b7ccb2dec5d09cd046873ec07ac8922 Text-content-length: 87 Text-content-md5: a63ce0f402410cd8557ef0c475abab82 Text-content-sha1: 97fa5951d9c75fd152c6ec43d7cc5f6a60b9b31e Content-length: 127 K 15 cvs2svn:cvs-rev V 4 1.56 PROPS-END SVNX A+A.*# Source directories. !srcdir charset/ !srcdir unix/ !srcdir mac/ Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 71b96a62e4bca431d3eb10b8a932dd7b Text-delta-base-sha1: d4d0d7769d03bf246b309d49c4a21e81dd486841 Text-content-length: 1283 Text-content-md5: 33399dee348ace944c5230a47c880255 Text-content-sha1: 68363c54a3374873023390afe6cf677c035c5808 Content-length: 1323 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVN VwH6h]V ?L#_@oNy*B_D }Mib1Iyja@Ryay,1XKy>(}\p#`# PuTTY specifics which could still do with removing: # - Mac makefile is not portabilised at all. Include directories # are hardwired, and also the libraries are fixed. This is # mainly because I was too scared to go anywhere near it. # - sbcsgen.pl is still run at startupsrcdirs = (".srcdir") { push @srcdirs,dirpfx { my ($path) = shift @_; my ($sep) = shift @_; my $ret = "", $i; while (($i = index $path, $sep) >= 0) { $path = substr $path, ($i + length $sep); $ret .= "..$sep"; } return $ret; }sr $dirpfx = &dirpfx($makefiles{'cygwin'}, "/");" . (join " ", map {"-I$dirpfx$_"} @srcdirs)) . $dirpfx$dirpfx = &dirpfx($makefiles{'borland'}, "\\"); " \$(XFLAGS) \$(CFLAGS) ". (join " ", map {"-I$dirpfx$_"} @srcdirs) . "$dirpfx, "\\$dirpfx = &dirpfx($makefiles{'vc'}, "\\"); $dirpfx, "\\")) { $dirpfx = &dirpfx($makefiles{'gtk'}, "/");" . (join " ", map {"-I$dirpfx$_"} @srcdirs) . "$dirpfx$dirpfx = &dirpfx($makefiles{'lcc'}, "\\"); " . (join " ", map {"-I$dirpfx$_"} @srcdirs) . "$dirpfx, "\\lcc Revision-number: 4138 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:20.365180Z PROPS-END Revision-number: 4139 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:20.390996Z PROPS-END Revision-number: 4140 Prop-content-length: 446 Content-length: 446 K 8 svn:date V 27 2004-04-25T15:33:10.000000Z K 7 svn:log V 345 In the special case that handles selecting a session and hitting Enter, there is a structure copy of a Config, which invalidated the remote_cmd_ptr in that structure (pointing to its own remote_cmd). This was causing remote commands not to be executed in this special case. I've patched the pointer up manually (as is done in plink.c), but ugh. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2210256abda271d46b9555bd4d1e5749 Text-delta-base-sha1: 6795b68311faccc31b895f40a46c28d266904c77 Text-content-length: 70 Text-content-md5: bd873cc5ae21e2a0fb26de696eb5ec8b Text-content-sha1: 9f0c7a199583083567ec7aa7f07d1b1bd4ec13ac Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN>w .&#cfg->remote_cmd_ptr = cfg->remote_cmd; /* nast Revision-number: 4141 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:20.511702Z PROPS-END Revision-number: 4142 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2004-04-25T22:18:19.000000Z K 7 svn:log V 33 Implement `pscp-select-backend'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 70e98675c6d40c86260695bd63386500 Text-delta-base-sha1: ee0a7e6a0df202b4e5f050faaf7acce71ac2c184 Text-content-length: 1760 Text-content-md5: 7353dc0517391bd3a1d00850b8586e2f Text-content-sha1: 97132f6fb0bf7d4119a972e04af699233244a667 Content-length: 1800 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNnz9z3RM,myGyu\versionid $Id: pscp.but,v 1.27 2004/04/25 22:18:19\c -scp force use of SCP protocol \c -sftp force use of SFTP protocol (You can force use of the SFTP protocol, if available, with \c{-sftp} - see \k{pscp-usage-options-backend}.)2{pscp-usage-options-backend}\c{-sftp}, \c{-scp} force use of particular protocol As mentioned in \k{pscp-usage-basics}, there are two different file transfer protocols in use with SSH. Despite its name, PSCP (like many other ostensible \cw{scp} clients) can use either of these protocols. The older SCP protocol does not have a written specification and leaves a lot of detail to the server platform. Wildcards are expanded on the server. The simple design means that any wildcard specification supported by the server platform (such as brace expansion) can be used, but also leads to interoperability issues such as with filename quoting (for instance, where filenames contain spaces), and also the security issue described in \k{pscp-usage-basics}. The newer SFTP protocol, which is usually associated with SSH 2 servers, is specified in a more platform independent way, and leaves issues such as wildcard syntax up to the client. This makes it more consistent across platforms, more suitable for scripting and automation, and avoids security issues with wilcard matching. Normally PSCP will attempt to use the SFTP protocol, and only fall back to the SCP protocol if SFTP is not available on the server. The \c{-scp} option forces PSCP to use the SCP protocol or quit. The \c{-sftp} option forces PSCP to use the SFTP protocol or quit. When this option is specified, PSCP looks harder for an SFTP server, which may allow use of SFTP with SSH 1 depending on server setup Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 31f1b1701087b88ca9c4a8d3ba605f25 Text-delta-base-sha1: 1b81165246dcb23fbb72cffacbae74e2cbb1838a Text-content-length: 1623 Text-content-md5: e798f32685d48362e732b09280a0ed3b Text-content-sha1: 848b91904fd1bdfff9d4d3cc7c37f92074b7d6d7 Content-length: 1664 K 15 cvs2svn:cvs-rev V 5 1.118 PROPS-END SVNW3zfJi)FbX MW iqyintry_scp = 1; static int try_sftp = 1; static int main_cmd_is_sftp = 0; static int fallback_cmd_is_sftp /* Work out which backend we ended up using. */ if (!ssh_fallback_cmd(backhandle)) using_sftp = main_cmd_is_sftp; else using_sftp = fallback_cmd_is_sftp; Set up main and possibly fallback command depending on * options specified by user.cfg.remote_cmd_ptr2 = NULL; if (try_sftp) { /* First choice is SFTP subsystem. */ main_cmd_is_sftp = 1; strcpy(cfg.remote_cmd, "sftp"); cfg.ssh_subsys = TRUE; if (try_scp) { /* Fallback is to use the provided scp command. */ fallback_cmd_is_sftp = 0; cfg.remote_cmd_ptr2 = cmd; cfg.ssh_subsys2 = FALSE; } else { /* Since we're not going to try SCP, we may as well try * harder to find an SFTP server, since in the current * implementation we have a spare slot. */ fallback_cmd_is_sftp = 1; /* see psftp.c for full explanation of this kludge */ cfg.remote_cmd_ptr2 = "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" "exec sftp-server"; cfg.ssh_subsys2 = FALSE; } } else { /* Don't try SFTP at all; just try the scp command. */ main_cmd_is_sftp = 0; cfg.remote_cmd_ptr = cmd; cfg.ssh_subsys = FALSE; } printf(" -sftp force use of SFTP protocol\n"); printf(" -scp force use of SCP protocolsftp") == 0) { try_scp = 0; try_sftp = 1; } else if (strcmp(argv[i], "-scp") == 0) { try_scp = 1; try_sftp = 0 Revision-number: 4143 Prop-content-length: 113 Content-length: 113 K 7 svn:log V 13 Implemented. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-04-25T22:18:44.000000Z PROPS-END Node-path: putty-wishlist/data/pscp-select-backend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 73a195dfe928bf3ce5695c9285320254 Text-delta-base-sha1: 5d57752fdb1104a5caa6641dd07fca26aeca6485 Text-content-length: 41 Text-content-md5: c0fea10e3747ed158de3f15c09e01654 Text-content-sha1: 855b303d6e375a62b3efad72c812c31cda681b79 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNAV  7 Fixed-in: 2004-04-26 Revision-number: 4144 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2004-04-26T11:49:40.000000Z K 7 svn:log V 21 StickyKeys problems. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/xp-stickykeys-breaks-capslock Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 881 Text-content-md5: ec244f617d479ed9529adac172ef7b0d Text-content-sha1: ad94128a2aa4e3ff408b84647ab380deb39ab610 Content-length: 997 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNcccSummary: StickyKeys inverts sense of capslock on WinXP and Win2k3 Class: bug Priority: medium Present-in: 0.53b, 0.54 Content-type: text/plain On Windows XP and Windows Server 2003, if the PuTTY window has focus and StickyKeys is activated (e.g. by holding down a modifier key or tapping Shift five times) and then disabled, the case of characters typed in the PuTTY window is inverted. To reproduce: * Log in to a system. Keep focus on the PuTTY window. * Press shift repeatedly until the 'StickyKeys' dialogue box comes up. * Click 'Cancel' to turn off StickyKeys. * Now type in the PuTTY window. Letters appear in the opposite case they should be (capital without shift, lower case with shift, and reversed if caps lock is on). * Do the 'StickyKeys' thing again to get back to normal. Ref: Revision-number: 4145 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:20.874087Z PROPS-END Revision-number: 4146 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:20.883988Z PROPS-END Revision-number: 4147 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:20.892601Z PROPS-END Revision-number: 4148 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2004-04-27T12:31:57.000000Z K 7 svn:log V 101 Various tweaks to header comments to remind me which bits are meant to be platform-independent, etc. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 50268577e83e20cf477b0bccf2580afa Text-delta-base-sha1: 352cdb334e3b87d95f5e854fcc9097305e9d3571 Text-content-length: 26 Text-content-md5: e5ff68ff8d4cf1183cade3dc1fab19c1 Text-content-sha1: 0d733be859f3ad83f0f3b9afc1d2b1f7cefa0954 Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNK=JWindows Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 76872d6932ec261ad074bc23fc269469 Text-delta-base-sha1: 355f5c1a6e027ec5ef2225a95887d663332a3dae Text-content-length: 93 Text-content-md5: e7ca6748d5c94fd63ade447bdb4405b4 Text-content-sha1: 610bef62f39e8dac546cb3b3e510f1f04a8948bd Content-length: 133 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN^*LL^/* * Platform-independent routines shared between all PuTTY programs. */ Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 35ea9d9bfae5f698d175797c7cc53d19 Text-delta-base-sha1: 6dfb5726c0897b67245f855c08ec82f4a24e23d7 Text-content-length: 42 Text-content-md5: 5a71690e7f9cb097888f51f308160430 Text-content-sha1: f65bb5f8d43230aaf893405ff736ab124488c5e6 Content-length: 82 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVNfnW/* * PLink - a Windows Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f1e54dcbf7d8e8cc6890be0409fde250 Text-delta-base-sha1: 3c8e4d67070d0e70fd0b36c2173582f7b8154c52 Text-content-length: 56 Text-content-md5: 2ee15f577a696f4d52b29da0d720a273 Text-content-sha1: 46bb38ee9a8a8edcd836bde44edc0a53ec86a179 Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVNq%c/* * psftp.c: (platform-independent) Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 11dd7256ded8e0ee50772403e3fa286a Text-delta-base-sha1: 32ceac0267ee00517a42abe464fccd108befdca6 Text-content-length: 65 Text-content-md5: fa138ad898ebd284191e4f390bf96eed Text-content-sha1: 93121c865d73475f439c9edbf9aa432a42ee9d70 Content-length: 105 K 15 cvs2svn:cvs-rev V 4 1.60 PROPS-END SVNx.T$/* * PuTTY key generation front end (Windows) Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7653d4d4d3c3a631d716db20688708dc Text-delta-base-sha1: e7f7f661fd3da9882d154d2d3f2b0f0fc581988c Text-content-length: 91 Text-content-md5: 915d1dd0b1e7612c355866a0e09c2e68 Text-content-sha1: 4a21abfd1c6e7a82db65f4087a6929523a0de241 Content-length: 132 K 15 cvs2svn:cvs-rev V 5 1.116 PROPS-END SVN-DGG}0/* * settings.c: read and write saved sessions. (platform-independent) Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b742df712ba82ed7e0c15e50a69769d8 Text-delta-base-sha1: e3b1680e30160ed79014c1cc237051489c2d61b6 Text-content-length: 70 Text-content-md5: a71fc06f5bd195a650eb9ea373751c44 Text-content-sha1: 85ca58bf08344cb6c3ae3d3fd77eb9e0d842b1e3 Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN 6V7/* * winmisc.c: miscellaneous Windows-specific things Node-path: putty/winutils.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e59d12f3e57884b1282cea56cbb288e3 Text-delta-base-sha1: 4a8cfb5c3fc430221ed9f1f083e3e6c29771ac72 Text-content-length: 80 Text-content-md5: 32668a82e18f9001c057a670a33903f4 Text-content-sha1: 3d0a4a20d8ad8bb79fb56405e4a2efd62947bbf5 Content-length: 119 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNHU=0/* * winutils.c: miscellaneous Windows utilities for GUI app Revision-number: 4149 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2004-04-27T12:52:34.000000Z K 7 svn:log V 53 Add notes on our globs' incompatibilities with POSIX K 10 svn:author V 5 jacob PROPS-END Node-path: putty/wildcard.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e7b2c3afeb1130e2441cb707edd775fa Text-delta-base-sha1: e9866aead3193b9299c4de852d538298977f5f80 Text-content-length: 548 Text-content-md5: ae8fc5f0684067464d098be448e6e051 Text-content-sha1: d091225f7d3c7a065476638eff503ef5a06d7f01 Content-length: 587 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN+ w (kSome notes on differences from POSIX globs (IEEE Std 1003.1, 2003 ed.): * - backslashes act as escapes even within [] bracket expressions * - does not support [!...] for non-matching list (POSIX are weird); * NB POSIX allows [^...] as well via "A bracket expression starting * with an unquoted circumflex character produces unspecified * results". If we wanted to allow [!...] we might want to define * [^!] as having its literal meaning (match '^' or '!'). * - none of the scary [[:class:]] stuff, etc Revision-number: 4150 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2004-04-27T12:57:13.000000Z K 7 svn:log V 68 Remove now-unused variable pwrstat. Spotted by Krzysztof Kowalczyk. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: be600719720964223bedb45334306065 Text-delta-base-sha1: 5bed23b9f85d2180b547397a8bbb56dec1ea167c Text-content-length: 20 Text-content-md5: 235d5bb01439e9a477e72bd5d14f31fd Text-content-sha1: 0907db6fcf2f96dbb45053eb6b84692f42c30d01 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN/ 2\S Revision-number: 4151 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.135071Z PROPS-END Revision-number: 4152 Prop-content-length: 309 Content-length: 309 K 8 svn:date V 27 2004-04-27T18:16:33.000000Z K 7 svn:log V 208 Krzysztof Kowalczyk's fix for "Assertion failed: actuallen <= len" when transferring files >2G with PSCP. (I'm unable to actually test this works, but it looks plausible, and small transfers aren't mangled.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e798f32685d48362e732b09280a0ed3b Text-delta-base-sha1: 848b91904fd1bdfff9d4d3cc7c37f92074b7d6d7 Text-content-length: 207 Text-content-md5: 765b67f6586c5cb3648e1df79d7a096d Text-content-sha1: c4915e2771938b62ab6e8b829d6b426f6c701565 Content-length: 248 K 15 cvs2svn:cvs-rev V 5 1.119 PROPS-END SVN33V1unsigned long blksize; int read; blksize = 4096; if (blksize > (act.size - received)) blksize = act.size - received; read = scp_recv_filedata(transbuf, (int) Revision-number: 4153 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2004-04-27T18:23:48.000000Z K 7 svn:log V 151 Krzysztof Kowalczyk notes that 'etastr' can overflow if the times involved start to get silly. Replace it with a dynamically allocated string instead. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 765b67f6586c5cb3648e1df79d7a096d Text-delta-base-sha1: c4915e2771938b62ab6e8b829d6b426f6c701565 Text-content-length: 106 Text-content-md5: 5f4b932916fa08f6e5bb515afd529db4 Text-content-sha1: 77df1d37c089e238b84c570dc0f973f502793aa5 Content-length: 147 K 15 cvs2svn:cvs-rev V 5 1.120 PROPS-END SVN1FMWn*etastretastr = dupprintf("%02ld:%02ld:%02ld", free(etastr); Revision-number: 4154 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 37 Update with some current information K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-04-27T18:38:15.000000Z PROPS-END Node-path: putty-wishlist/data/large-files Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d5fa7368ec72dbf29ad4835862a26ba3 Text-delta-base-sha1: dc1c7cc60b4f9f0d292cfce5b411f3bc52e42f90 Text-content-length: 696 Text-content-md5: 2b59776aff950220bdec57492343b53e Text-content-sha1: 254cc8569f97aa223ce10579780142dec1df01f9 Content-length: 735 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNvjU11w.Summary: PSFTP and PSCP can't handle big files (> 2 GB, > 4 GB) The file transfer utilities (PSCP and PSFTP) ought to handle really really big (>2Gb) files. There have been reports that they don't do so properly. (Apparently, on Windows,

    2004-04-27: One symptom we've had reported a lot recently is the error message "Assertion failed: actuallen <= len, file scp.c, line 1435" for files >2GB. As of the 2004-04-28 snapshot, there should be a fix which will make this go away (thanks to Krzysztof Kowalczyk), but we've not been able to test than, and in any case files over 4GB are still not supported (and this would require some upheaval to fix). Revision-number: 4155 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.436122Z PROPS-END Revision-number: 4156 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.444538Z PROPS-END Revision-number: 4157 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.453992Z PROPS-END Revision-number: 4158 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.462944Z PROPS-END Revision-number: 4159 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.472263Z PROPS-END Revision-number: 4160 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.480940Z PROPS-END Revision-number: 4161 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2004-04-28T17:16:32.000000Z K 7 svn:log V 23 update pocketputty URL K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1cc4cce3e0196665c4bab342cd335ae4 Text-delta-base-sha1: f8d129b028f2b279f0fe362ab9f62c1a892d465d Text-content-length: 121 Text-content-md5: e26b6a19b6da14fd60dcd40d8a74dacd Text-content-sha1: 8a1a0d1f66f8441253a08b1fff5d93d09d1e52a2 Content-length: 161 K 15 cvs2svn:cvs-rev V 4 1.68 PROPS-END SVNbd `8~d\versionid $Id: faq.but,v 1.68 2004/04/28 17:16:32 jacobduxy.net/}\c{http://pocketputty.duxy.net Revision-number: 4162 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.588278Z PROPS-END Revision-number: 4163 Prop-content-length: 235 Content-length: 235 K 8 svn:date V 27 2004-04-28T17:26:15.000000Z K 7 svn:log V 134 "Does PuTTY support storing settings, so I don't have to change them every time?" appears to be a FAQ. (Some renumbering will ensue.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e26b6a19b6da14fd60dcd40d8a74dacd Text-delta-base-sha1: 8a1a0d1f66f8441253a08b1fff5d93d09d1e52a2 Text-content-length: 314 Text-content-md5: fed30c081a3a73ace20c4bb606fcbbb4 Text-content-sha1: 5bd8e70d5d2d52113c01eb0f99a3d22774cf419e Content-length: 354 K 15 cvs2svn:cvs-rev V 4 1.69 PROPS-END SVNdZ/2l W\versionid $Id: faq.but,v 1.69 2004/04/28 17:26:15savedsettings}{Question} Does PuTTY support storing settings, so I don't have to change them every time? Yes, all of PuTTY's settings can be saved in named session profiles. See \k{config-saving} in the documentation for how to do this Revision-number: 4164 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.906638Z PROPS-END Revision-number: 4165 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.916736Z PROPS-END Revision-number: 4166 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.925916Z PROPS-END Revision-number: 4167 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.934789Z PROPS-END Revision-number: 4168 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.943645Z PROPS-END Revision-number: 4169 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.952711Z PROPS-END Revision-number: 4170 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:21.961984Z PROPS-END Revision-number: 4171 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2004-04-29T13:55:59.000000Z K 7 svn:log V 16 putty.cofman.dk K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6e1e123c98d8d53792d9ee1abb547419 Text-delta-base-sha1: 1d8383fec4a8d2a8057de65ca0d57a0799404e6f Text-content-length: 49 Text-content-md5: 311eb9e343f42b02d69ba8e6d679d789 Text-content-sha1: bc0faaca8f7725c85d0b2d05adac21aa97ebfd6b Content-length: 89 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVN:%1M:+cofman.dk/">putty.cofman Revision-number: 4172 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2004-04-29T14:41:28.000000Z K 7 svn:log V 19 Mention -scp/-sftp K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/man-pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c104ef85ed2996d973b208444b007ad1 Text-delta-base-sha1: 076f3e8cc6688b3bd6308941b92c0bee891e67ed Text-content-length: 114 Text-content-md5: 5286618c3d20f8614f230655316b2d20 Text-content-sha1: a62721e10ebe0aee95149ef410e31e5d1978c744 Content-length: 153 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNdD \d\`dt \cw{-scp} \dd Force use of SCP protocol. \dt \cw{-sftp} \dd Force use of SFTP protocol Revision-number: 4173 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:22.253153Z PROPS-END Revision-number: 4174 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:22.264004Z PROPS-END Revision-number: 4175 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:22.273401Z PROPS-END Revision-number: 4176 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:22.282371Z PROPS-END Revision-number: 4177 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:22.292301Z PROPS-END Revision-number: 4178 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2004-05-01T00:54:10.000000Z K 7 svn:log V 36 Thoughts so far on Mazovia support. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/mazovia Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1392 Text-content-md5: 6537f4a5e0765da31328a531402f9fe0 Text-content-sha1: e5450eeb45642f34a4a8ee34d35cf096ee0edf9e Content-length: 1508 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNbbbSummary: Support for Mazovia character set Class: wish Difficulty: taxing Priority: low Content-type: text/x-html-body

    We've had a few requests to add a Polish character set called "Mazovia" to the available translations.

    It's also known as CP620, but Polish versions of Windows don't appear to recognise this, so we'll have to add native support to PuTTY.

    In order to do this we need a translation table from Mazovia code points to Unicode. We're almost in a position to do this now based on the mazovia translation table in this ZIP file, but there are a couple of questions still to be answered:

    • Code point 0x9B: corresponds to Polish currency zloty, symbol "zŽ", for which a single code point does not exist in Unicode. Plan to map this to U+FFFD REPLACEMENT CHARACTER (we're assured it's not very important).
    • Code point 0xA8: the character table above indicates it's U+00BD INVERTED QUESTION MARK, but another table we've seen shows a glyph like U+00A7 SECTION SIGN. Which is correct?

    More info: http://www.jastra.com.pl/klub/ogonki.htm

    References:

    • 4090B793.9090502@talex.pl
    • 000a01c3f0a9$3d701240$4501a8c0@waza.com.pl
    Revision-number: 4179 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.098777Z PROPS-END Revision-number: 4180 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.108182Z PROPS-END Revision-number: 4181 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.118046Z PROPS-END Revision-number: 4182 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.127461Z PROPS-END Revision-number: 4183 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.136314Z PROPS-END Revision-number: 4184 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.145974Z PROPS-END Revision-number: 4185 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.155040Z PROPS-END Revision-number: 4186 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.164342Z PROPS-END Revision-number: 4187 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.173849Z PROPS-END Revision-number: 4188 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.182758Z PROPS-END Revision-number: 4189 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.192603Z PROPS-END Revision-number: 4190 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.201570Z PROPS-END Revision-number: 4191 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.211317Z PROPS-END Revision-number: 4192 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.220887Z PROPS-END Revision-number: 4193 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.229534Z PROPS-END Revision-number: 4194 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.238970Z PROPS-END Revision-number: 4195 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.248830Z PROPS-END Revision-number: 4196 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.259102Z PROPS-END Revision-number: 4197 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.268354Z PROPS-END Revision-number: 4198 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.277719Z PROPS-END Revision-number: 4199 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.287943Z PROPS-END Revision-number: 4200 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.296854Z PROPS-END Revision-number: 4201 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.306864Z PROPS-END Revision-number: 4202 Prop-content-length: 112 Content-length: 112 K 8 svn:date V 27 2004-05-05T09:42:12.000000Z K 7 svn:log V 12 FAQ linkrot K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/remember-password Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 092025bef23327dcf188c1d13e3a03cb Text-delta-base-sha1: 780dda943efee4379a33e48e3f8af9d592d5be93 Text-content-length: 28 Text-content-md5: 76c689ca7496ff0cdc90751218d21990 Text-content-sha1: 0c0869fc9787905d4cdfae2a4b7fcd3f349885df Content-length: 67 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN 8">FAQ. Revision-number: 4203 Prop-content-length: 125 Content-length: 125 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-05-05T13:16:21.000000Z K 7 svn:log V 25 character reference oops PROPS-END Node-path: putty-wishlist/data/mazovia Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6537f4a5e0765da31328a531402f9fe0 Text-delta-base-sha1: e5450eeb45642f34a4a8ee34d35cf096ee0edf9e Text-content-length: 22 Text-content-md5: d0382ad8751db40fd0e16d9b014828f1 Text-content-sha1: d1a32e227748c012c3f070fb2b718788d3efb8e5 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNbc %=%x Revision-number: 4204 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.390933Z PROPS-END Revision-number: 4205 Prop-content-length: 320 Content-length: 320 K 8 svn:date V 27 2004-05-06T11:27:58.000000Z K 7 svn:log V 219 A user at ARM just found his home directory was _world_ writable, and this caused public key authentication to fail in spite of following our instructions to the letter. It can't hurt to s/g-w/go-w/ here, just in case! K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 74b9477d1a2e87507ce0e22c42180544 Text-delta-base-sha1: 1d4152251dfe8fc6f02389950afcc41eb7dbe809 Text-content-length: 172 Text-content-md5: 33fcb8c7e4b2672ff4761fb1a61efc47 Text-content-sha1: 23377a8033724a02bdb38413ae707e679d505d3c Content-length: 212 K 15 cvs2svn:cvs-rev V 4 1.22 PROPS-END SVNDWl;U[i\versionid $Id: pubkey.but,v 1.22 2004/05/06 11:27:58 simon or world-writable. You can typically do this by using a command such as \c chmod go Revision-number: 4206 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.578386Z PROPS-END Revision-number: 4207 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:23.588361Z PROPS-END Revision-number: 4208 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:24.837217Z PROPS-END Revision-number: 4209 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.090861Z PROPS-END Revision-number: 4210 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.110526Z PROPS-END Revision-number: 4211 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.121510Z PROPS-END Revision-number: 4212 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.138310Z PROPS-END Revision-number: 4213 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.158297Z PROPS-END Revision-number: 4214 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.180346Z PROPS-END Revision-number: 4215 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.195355Z PROPS-END Revision-number: 4216 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.208897Z PROPS-END Revision-number: 4217 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2004-05-12T10:25:52.000000Z K 7 svn:log V 28 Add a canned Google search. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8738e84608ee7f425d176543920796bc Text-delta-base-sha1: ebf571b47c39708b8a2d1e299169db963f60d71d Text-content-length: 801 Text-content-md5: 649a3ee6fb5650f4bb47c9377e41a37e Text-content-sha1: 6d44bef7f673475fcb7970fbd4a4691296bcdce3 Content-length: 841 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN] B7Bb6v\3*#! /usr/bin/perl # $Id: bugs2html,v 1.30 2004/05/12 10:25:52 jacobmy $site = $baseurl; ($site =~ s#^http://([^/]*).*$#$1#) or ($site = "www.chiark.greenend.org.uk")

    Search the wishlist:

    Google
    WWW $site
    Revision-number: 4218 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.327080Z PROPS-END Revision-number: 4219 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.336503Z PROPS-END Revision-number: 4220 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.345404Z PROPS-END Revision-number: 4221 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.354402Z PROPS-END Revision-number: 4222 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.363460Z PROPS-END Revision-number: 4223 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.373589Z PROPS-END Revision-number: 4224 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 32 http://xs.epmh.com/mirror/putty K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-05-14T12:30:08.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 311eb9e343f42b02d69ba8e6d679d789 Text-delta-base-sha1: bc0faaca8f7725c85d0b2d05adac21aa97ebfd6b Text-content-length: 74 Text-content-md5: 109ce82de6fb38eab57f67eac6120f55 Text-content-sha1: 86f18e7e746296c7baa031edd69f1930f0de1e40 Content-length: 114 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVN% 5rn7xs.epmh.com/mirror/putty/">xs.epmh.com in Finland Revision-number: 4225 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.659372Z PROPS-END Revision-number: 4226 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.667999Z PROPS-END Revision-number: 4227 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.677428Z PROPS-END Revision-number: 4228 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.687416Z PROPS-END Revision-number: 4229 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.696570Z PROPS-END Revision-number: 4230 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.706079Z PROPS-END Revision-number: 4231 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.715400Z PROPS-END Revision-number: 4232 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.724557Z PROPS-END Revision-number: 4233 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.733822Z PROPS-END Revision-number: 4234 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:25.743431Z PROPS-END Revision-number: 4235 Prop-content-length: 264 Content-length: 264 K 8 svn:date V 27 2004-05-20T12:48:19.000000Z K 7 svn:log V 163 I added more detail to the `Authentication failed at PuTTY X11 proxy' error message some time ago, but forgot to change the wording in the error messages chapter. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c4090331bf8bb64af31acc07ce32fef1 Text-delta-base-sha1: 4c03becc6c5344d017159e8f981d073e52c6923e Text-content-length: 454 Text-content-md5: e10449cf75010b16bd81fb5c8dea2999 Text-content-sha1: 36f280b760447984eed84ae57400092925c8196c Content-length: 493 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN%:9-n2>D\versionid $Id: errors.but,v 1.8 2004/05/20 12:48:19 simonPuTTY X11 proxy: \e{various errors}} This family of errors are reported when PuTTY is doing X forwarding. They are sent back to the X application running on the SSH server, which will one of these messages is because they used SSH to log in as one user (let's say \q{fred}), and then used the Unix \c{su} command to become another user (typically \q{root}). The Revision-number: 4236 Prop-content-length: 275 Content-length: 275 K 8 svn:date V 27 2004-05-22T10:36:50.000000Z K 7 svn:log V 174 At last! After much delay, much faffing back and forth, and much enhancement and fiddling, I have now massaged Arabeyes' first patch into a form I'm happy to check in. Phew. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a63ce0f402410cd8557ef0c475abab82 Text-delta-base-sha1: 97fa5951d9c75fd152c6ec43d7cc5f6a60b9b31e Text-content-length: 411 Text-content-md5: 4dd6dba8f24a79b572b9154886f9c3ff Text-content-sha1: e534e9af2045e3f340eac166afd20d31563b01dd Content-length: 451 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVNJ -Terminal emulator and its (platform-independent) dependencies. TERMINAL = terminal wcwidth ldiscucs logging tree234 minibidi + config dialog # GUI front end and terminal emulator (putty, puttytel). GUITERM = TERMINAL window windlg winctrls sizetip unicode printing + winutils wincfg # Same thing on Unix. UXTERM = TERMINAL pterm uxcfg gtkdlg gtkcols gtkpanel uxucs Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd873cc5ae21e2a0fb26de696eb5ec8b Text-delta-base-sha1: 9f0c7a199583083567ec7aa7f07d1b1bd4ec13ac Text-content-length: 312 Text-content-md5: 8ed9d56ab45a87a6f8ced8d73e02f7c7 Text-content-sha1: 10cfd0fa327d9d5f23c818846bbfb896b6b7b917 Content-length: 352 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVNw"Z ctrl_checkbox(s, "Disable Arabic text shaping", 'l', HELPCTX(no_help), dlg_stdcheckbox_handler, I(offsetof(Config, arabicshaping))); ctrl_checkbox(s, "Disable bidirectional text display", 'j', HELPCTX(no_help), dlg_stdcheckbox_handler, I(offsetof(Config, bidi Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2fecadd9ea2c186ada3aaacefb557bd9 Text-delta-base-sha1: 65f91e0ab0d2805213cbca5e4932b820818434a5 Text-content-length: 1816 Text-content-md5: 85b5a2bdc63c48f350fa0d0771b0ff33 Text-content-sha1: 05b38c5e1f4ad646f5bad0938df0fa047ee2e56e Content-length: 1856 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVN\z;? <\versionid $Id: config.but,v 1.78 2004/05/22 10:36:50 simonS{config-features-shaping} Disabling Arabic text shaping \cfg{winhelp-topic}{features.arabicshaping} PuTTY supports shaping of Arabic text, which means that if your server sends text written in the basic Unicode Arabic alphabet then it will convert it to the correct display forms before printing it on the screen. If you are using full-screen software which was not expecting this to happen (especially if you are not an Arabic speaker and you unexpectedly find yourself dealing with Arabic text files in applications which are not Arabic-aware), you might find that the display becomes corrupted. By ticking this box, you can disable Arabic text shaping so that PuTTY displays precisely the characters it is told to display. You may also find you need to disable bidirectional text display; see \S{config-features-bidi}. \S{config-features-bidi} Disabling bidirectional text display \cfg{winhelp-topic}{features.bidi} PuTTY supports bidirectional text display, which means that if your server sends text written in a language which is usually displayed from right to left (such as Arabic or Hebrew) then PuTTY will automatically flip it round so that it is displayed in the right direction on the screen. If you are using full-screen software which was not expecting this to happen (especially if you are not an Arabic speaker and you unexpectedly find yourself dealing with Arabic text files in applications which are not Arabic-aware), you might find that the display becomes corrupted. By ticking this box, you can disable bidirectional text display, so that PuTTY displays text from left to right in all situations. You may also find you need to disable Arabic text shaping; see \S{config-features-arabicshaping} Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2aa516b69f2f8c865aae0086f186e0e2 Text-delta-base-sha1: 019955be0f85b6dd8ec647bb69a4275a99336513 Text-content-length: 826 Text-content-md5: 293b6d695ac816e2c14c206d28bb9840 Text-content-sha1: 73ed6f7b79499f802c5f4481959101d35bec0db8 Content-length: 866 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN; )N%ZtKup Zp;%  if (in_utf(ldisc->term) && c >= 0xC0) return 1; /* UTF-8 introducer character * (FIXME: combining / wide chars) */ else if (in_utf(ldisc->term) && c >= 0x80 && c < 0xC0) return 0; /* UTF-8 followup character */ else return 4; /* hex representation (!in_utf(ldisc->term) && c >= 0xA0) || (in_utf(ldisc->term) && c >= 0x80int char_start(Ldisc ldisc, unsigned char c) { if (in_utf(ldisc->term)) return (c < 0x80 || c >= 0xC0); else return 1;, and output BSBs, to return to * last character boundary (in UTF-8 mode this may * be more than one byte)do { if (ECHOING) bsb(ldisc, plen(ldisc, ldisc->buf[ldisc->buflen - 1])); ldisc->buflen--; } while (!char_start(ldisc, ldisc->buf[ldisc->buflen])) Node-path: putty/minibidi.c Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 33867 Text-content-md5: 074830d59108fa889c7e640dc3bb818c Text-content-sha1: 5715cf150e9a2296dc597e5ae21b7dd6c747ca78 Content-length: 33983 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN:::/************************************************************************ * $Id: minibidi.c,v 1.1 2004/05/22 10:36:50 simon Exp $ * * ------------ * Description: * ------------ * This is an implemention of Unicode's Bidirectional Algorithm * (known as UAX #9). * * http://www.unicode.org/reports/tr9/ * * Author: Ahmad Khalifa * * ----------------- * Revision Details: (Updated by Revision Control System) * ----------------- * $Date: 2004/05/22 10:36:50 $ * $Author: simon $ * $Revision: 1.1 $ * $Source: /u1/simon/svn-migration/cvs/putty/minibidi.c,v $ * * (www.arabeyes.org - under MIT license) * ************************************************************************/ /* * TODO: * ===== * - Explicit marks need to be handled (they are not 100% now) * - Ligatures */ #include "minibidi.h" /* * Flips the text buffer, according to max level, and * all higher levels * * Input: * from: text buffer, on which to apply flipping * level: resolved levels buffer * max: the maximum level found in this line (should be unsigned char) * count: line size in bidi_char */ void flipThisRun(bidi_char *from, unsigned char *level, int max, int count) { int i, j, rcount, tlevel; bidi_char temp; j = i = 0; while(i((i-j)/2); rcount--) { temp = from[j+rcount-1]; from[j+rcount-1] = from[i-rcount]; from[i-rcount] = temp; } } } /* * Finds the index of a run with level equals tlevel */ int findIndexOfRun(unsigned char* level , int start, int count, int tlevel) { int i; for(i=start; i0 && level[from] == current) { from--; } return level[++from]; } /* * Returns the first odd value greater than x */ unsigned char leastGreaterOdd(unsigned char x) { if((x % 2) == 0) return x+1; else return x+2; } /* * Returns the first even value greater than x */ unsigned char leastGreaterEven(unsigned char x) { if((x % 2) == 0) return x+2; else return x+1; } /* * Loops over the RLE_table array looking for the * type of ch */ unsigned char getRLE(wchar_t ch) { int offset, i, freq; freq = offset = 0; for(i=0; i<0xFFFF; i++) { freq = ((RLENode*)RLE_table)[i].f; offset += freq; if(offset == ch) return ((RLENode*)RLE_table)[i].d; else if(offset > ch) return ((RLENode*)RLE_table)[i-1].d; } /* this is here to stop compiler nagging */ return ON; } /* The Main shaping function, and the only one to be used * by the outside world. * * line: buffer to apply shaping to. this must be passed by doBidi() first * to: output buffer for the shaped data * count: number of characters in line */ int do_shape(bidi_char *line, bidi_char *to, int count) { int i, tempShape, ligFlag; for(ligFlag=i=0; i= 0) { if(types[j] == AL) { types[i] = AN; break; }else if(types[j] == R || types[j] == L) { break; } j--; } } } /* Rule (W3) * W3. Change all ALs to R. * * Optimization: on Rule Xn, we might set a flag on AL type * to prevent this loop in L R lines only... */ for(i=0; i= 0) { if(types[j] == L) { types[i] = L; break; } else if(types[j] == R || types[j] == AL) { break; } j--; } } } /* Rule (N1) * N1. A sequence of neutrals takes the direction of the surrounding * strong text if the text on both sides has the same direction. European * and Arabic numbers are treated as though they were R. */ if(types[0] == ON) { if((types[1] == R) || (types[1] == EN) || (types[1] == AN)) types[0] = R; else if(types[1] == L) types[0] = L; } for(i=1; i<(count-1); i++) { if(types[i] == ON) { if(types[i-1] == L) { j=i; while(j<(count-1) && types[j] == ON) { j++; } if(types[j] == L) { while(i0 && (getType(line[j].wc) == WS)) { j--; } if(j < (count-1)) { for(j++; j=i ; j--) { levels[j] = paragraphLevel; } } }else if(tempType == B || tempType == S) levels[i] = paragraphLevel; } /* Rule (L4) NOT IMPLEMENTED * L4. A character that possesses the mirrored property as specified by * Section 4.7, Mirrored, must be depicted by a mirrored glyph if the * resolved directionality of that character is R. */ /* Note: this is implemented before L2 for efficiency */ for(i=0; i tempType) { tempType = levels[i]; imax=i; } i++; } /* maximum level in tempType, its index in imax. */ while(tempType > 0) /* loop from highest level to the least odd, */ { /* which i assume is 1 */ flipThisRun(line, levels, tempType, count); tempType--; } /* Rule (L3) NOT IMPLEMENTED * L3. Combining marks applied to a right-to-left base character will at * this point precede their base character. If the rendering engine * expects them to follow the base characters in the final display * process, then the ordering of the marks and the base character must * be reversed. */ free(types); free(levels); return R; } /* * Bad, Horrible funtion * takes a pointer to a character that is checked for * having a mirror glyph. */ void doMirror(wchar_t* ch) { if((*ch & 0xFF00) == 0) { switch(*ch) { case 0x0028: *ch = 0x0029; break; case 0x0029: *ch = 0x0028; break; case 0x003C: *ch = 0x003E; break; case 0x003E: *ch = 0x003C; break; case 0x005B: *ch = 0x005D; break; case 0x005D: *ch = 0x005B; break; case 0x007B: *ch = 0x007D; break; case 0x007D: *ch = 0x007B; break; case 0x00AB: *ch = 0x00BB; break; case 0x00BB: *ch = 0x00AB; break; } } else if((*ch & 0xFF00) == 0x2000) { switch(*ch) { case 0x2039: *ch = 0x203A; break; case 0x203A: *ch = 0x2039; break; case 0x2045: *ch = 0x2046; break; case 0x2046: *ch = 0x2045; break; case 0x207D: *ch = 0x207E; break; case 0x207E: *ch = 0x207D; break; case 0x208D: *ch = 0x208E; break; case 0x208E: *ch = 0x208D; break; } } else if((*ch & 0xFF00) == 0x2200) { switch(*ch) { case 0x2208: *ch = 0x220B; break; case 0x2209: *ch = 0x220C; break; case 0x220A: *ch = 0x220D; break; case 0x220B: *ch = 0x2208; break; case 0x220C: *ch = 0x2209; break; case 0x220D: *ch = 0x220A; break; case 0x2215: *ch = 0x29F5; break; case 0x223C: *ch = 0x223D; break; case 0x223D: *ch = 0x223C; break; case 0x2243: *ch = 0x22CD; break; case 0x2252: *ch = 0x2253; break; case 0x2253: *ch = 0x2252; break; case 0x2254: *ch = 0x2255; break; case 0x2255: *ch = 0x2254; break; case 0x2264: *ch = 0x2265; break; case 0x2265: *ch = 0x2264; break; case 0x2266: *ch = 0x2267; break; case 0x2267: *ch = 0x2266; break; case 0x2268: *ch = 0x2269; break; case 0x2269: *ch = 0x2268; break; case 0x226A: *ch = 0x226B; break; case 0x226B: *ch = 0x226A; break; case 0x226E: *ch = 0x226F; break; case 0x226F: *ch = 0x226E; break; case 0x2270: *ch = 0x2271; break; case 0x2271: *ch = 0x2270; break; case 0x2272: *ch = 0x2273; break; case 0x2273: *ch = 0x2272; break; case 0x2274: *ch = 0x2275; break; case 0x2275: *ch = 0x2274; break; case 0x2276: *ch = 0x2277; break; case 0x2277: *ch = 0x2276; break; case 0x2278: *ch = 0x2279; break; case 0x2279: *ch = 0x2278; break; case 0x227A: *ch = 0x227B; break; case 0x227B: *ch = 0x227A; break; case 0x227C: *ch = 0x227D; break; case 0x227D: *ch = 0x227C; break; case 0x227E: *ch = 0x227F; break; case 0x227F: *ch = 0x227E; break; case 0x2280: *ch = 0x2281; break; case 0x2281: *ch = 0x2280; break; case 0x2282: *ch = 0x2283; break; case 0x2283: *ch = 0x2282; break; case 0x2284: *ch = 0x2285; break; case 0x2285: *ch = 0x2284; break; case 0x2286: *ch = 0x2287; break; case 0x2287: *ch = 0x2286; break; case 0x2288: *ch = 0x2289; break; case 0x2289: *ch = 0x2288; break; case 0x228A: *ch = 0x228B; break; case 0x228B: *ch = 0x228A; break; case 0x228F: *ch = 0x2290; break; case 0x2290: *ch = 0x228F; break; case 0x2291: *ch = 0x2292; break; case 0x2292: *ch = 0x2291; break; case 0x2298: *ch = 0x29B8; break; case 0x22A2: *ch = 0x22A3; break; case 0x22A3: *ch = 0x22A2; break; case 0x22A6: *ch = 0x2ADE; break; case 0x22A8: *ch = 0x2AE4; break; case 0x22A9: *ch = 0x2AE3; break; case 0x22AB: *ch = 0x2AE5; break; case 0x22B0: *ch = 0x22B1; break; case 0x22B1: *ch = 0x22B0; break; case 0x22B2: *ch = 0x22B3; break; case 0x22B3: *ch = 0x22B2; break; case 0x22B4: *ch = 0x22B5; break; case 0x22B5: *ch = 0x22B4; break; case 0x22B6: *ch = 0x22B7; break; case 0x22B7: *ch = 0x22B6; break; case 0x22C9: *ch = 0x22CA; break; case 0x22CA: *ch = 0x22C9; break; case 0x22CB: *ch = 0x22CC; break; case 0x22CC: *ch = 0x22CB; break; case 0x22CD: *ch = 0x2243; break; case 0x22D0: *ch = 0x22D1; break; case 0x22D1: *ch = 0x22D0; break; case 0x22D6: *ch = 0x22D7; break; case 0x22D7: *ch = 0x22D6; break; case 0x22D8: *ch = 0x22D9; break; case 0x22D9: *ch = 0x22D8; break; case 0x22DA: *ch = 0x22DB; break; case 0x22DB: *ch = 0x22DA; break; case 0x22DC: *ch = 0x22DD; break; case 0x22DD: *ch = 0x22DC; break; case 0x22DE: *ch = 0x22DF; break; case 0x22DF: *ch = 0x22DE; break; case 0x22E0: *ch = 0x22E1; break; case 0x22E1: *ch = 0x22E0; break; case 0x22E2: *ch = 0x22E3; break; case 0x22E3: *ch = 0x22E2; break; case 0x22E4: *ch = 0x22E5; break; case 0x22E5: *ch = 0x22E4; break; case 0x22E6: *ch = 0x22E7; break; case 0x22E7: *ch = 0x22E6; break; case 0x22E8: *ch = 0x22E9; break; case 0x22E9: *ch = 0x22E8; break; case 0x22EA: *ch = 0x22EB; break; case 0x22EB: *ch = 0x22EA; break; case 0x22EC: *ch = 0x22ED; break; case 0x22ED: *ch = 0x22EC; break; case 0x22F0: *ch = 0x22F1; break; case 0x22F1: *ch = 0x22F0; break; case 0x22F2: *ch = 0x22FA; break; case 0x22F3: *ch = 0x22FB; break; case 0x22F4: *ch = 0x22FC; break; case 0x22F6: *ch = 0x22FD; break; case 0x22F7: *ch = 0x22FE; break; case 0x22FA: *ch = 0x22F2; break; case 0x22FB: *ch = 0x22F3; break; case 0x22FC: *ch = 0x22F4; break; case 0x22FD: *ch = 0x22F6; break; case 0x22FE: *ch = 0x22F7; break; } }else if((*ch & 0xFF00) == 0x2300) { switch(*ch) { case 0x2308: *ch = 0x2309; break; case 0x2309: *ch = 0x2308; break; case 0x230A: *ch = 0x230B; break; case 0x230B: *ch = 0x230A; break; case 0x2329: *ch = 0x232A; break; case 0x232A: *ch = 0x2329; break; } } else if((*ch & 0xFF00) == 0x2700) { switch(*ch) { case 0x2768: *ch = 0x2769; break; case 0x2769: *ch = 0x2768; break; case 0x276A: *ch = 0x276B; break; case 0x276B: *ch = 0x276A; break; case 0x276C: *ch = 0x276D; break; case 0x276D: *ch = 0x276C; break; case 0x276E: *ch = 0x276F; break; case 0x276F: *ch = 0x276E; break; case 0x2770: *ch = 0x2771; break; case 0x2771: *ch = 0x2770; break; case 0x2772: *ch = 0x2773; break; case 0x2773: *ch = 0x2772; break; case 0x2774: *ch = 0x2775; break; case 0x2775: *ch = 0x2774; break; case 0x27D5: *ch = 0x27D6; break; case 0x27D6: *ch = 0x27D5; break; case 0x27DD: *ch = 0x27DE; break; case 0x27DE: *ch = 0x27DD; break; case 0x27E2: *ch = 0x27E3; break; case 0x27E3: *ch = 0x27E2; break; case 0x27E4: *ch = 0x27E5; break; case 0x27E5: *ch = 0x27E4; break; case 0x27E6: *ch = 0x27E7; break; case 0x27E7: *ch = 0x27E6; break; case 0x27E8: *ch = 0x27E9; break; case 0x27E9: *ch = 0x27E8; break; case 0x27EA: *ch = 0x27EB; break; case 0x27EB: *ch = 0x27EA; break; } } else if((*ch & 0xFF00) == 0x2900) { switch(*ch) { case 0x2983: *ch = 0x2984; break; case 0x2984: *ch = 0x2983; break; case 0x2985: *ch = 0x2986; break; case 0x2986: *ch = 0x2985; break; case 0x2987: *ch = 0x2988; break; case 0x2988: *ch = 0x2987; break; case 0x2989: *ch = 0x298A; break; case 0x298A: *ch = 0x2989; break; case 0x298B: *ch = 0x298C; break; case 0x298C: *ch = 0x298B; break; case 0x298D: *ch = 0x2990; break; case 0x298E: *ch = 0x298F; break; case 0x298F: *ch = 0x298E; break; case 0x2990: *ch = 0x298D; break; case 0x2991: *ch = 0x2992; break; case 0x2992: *ch = 0x2991; break; case 0x2993: *ch = 0x2994; break; case 0x2994: *ch = 0x2993; break; case 0x2995: *ch = 0x2996; break; case 0x2996: *ch = 0x2995; break; case 0x2997: *ch = 0x2998; break; case 0x2998: *ch = 0x2997; break; case 0x29B8: *ch = 0x2298; break; case 0x29C0: *ch = 0x29C1; break; case 0x29C1: *ch = 0x29C0; break; case 0x29C4: *ch = 0x29C5; break; case 0x29C5: *ch = 0x29C4; break; case 0x29CF: *ch = 0x29D0; break; case 0x29D0: *ch = 0x29CF; break; case 0x29D1: *ch = 0x29D2; break; case 0x29D2: *ch = 0x29D1; break; case 0x29D4: *ch = 0x29D5; break; case 0x29D5: *ch = 0x29D4; break; case 0x29D8: *ch = 0x29D9; break; case 0x29D9: *ch = 0x29D8; break; case 0x29DA: *ch = 0x29DB; break; case 0x29DB: *ch = 0x29DA; break; case 0x29F5: *ch = 0x2215; break; case 0x29F8: *ch = 0x29F9; break; case 0x29F9: *ch = 0x29F8; break; case 0x29FC: *ch = 0x29FD; break; case 0x29FD: *ch = 0x29FC; break; } } else if((*ch & 0xFF00) == 0x2A00) { switch(*ch) { case 0x2A2B: *ch = 0x2A2C; break; case 0x2A2C: *ch = 0x2A2B; break; case 0x2A2D: *ch = 0x2A2C; break; case 0x2A2E: *ch = 0x2A2D; break; case 0x2A34: *ch = 0x2A35; break; case 0x2A35: *ch = 0x2A34; break; case 0x2A3C: *ch = 0x2A3D; break; case 0x2A3D: *ch = 0x2A3C; break; case 0x2A64: *ch = 0x2A65; break; case 0x2A65: *ch = 0x2A64; break; case 0x2A79: *ch = 0x2A7A; break; case 0x2A7A: *ch = 0x2A79; break; case 0x2A7D: *ch = 0x2A7E; break; case 0x2A7E: *ch = 0x2A7D; break; case 0x2A7F: *ch = 0x2A80; break; case 0x2A80: *ch = 0x2A7F; break; case 0x2A81: *ch = 0x2A82; break; case 0x2A82: *ch = 0x2A81; break; case 0x2A83: *ch = 0x2A84; break; case 0x2A84: *ch = 0x2A83; break; case 0x2A8B: *ch = 0x2A8C; break; case 0x2A8C: *ch = 0x2A8B; break; case 0x2A91: *ch = 0x2A92; break; case 0x2A92: *ch = 0x2A91; break; case 0x2A93: *ch = 0x2A94; break; case 0x2A94: *ch = 0x2A93; break; case 0x2A95: *ch = 0x2A96; break; case 0x2A96: *ch = 0x2A95; break; case 0x2A97: *ch = 0x2A98; break; case 0x2A98: *ch = 0x2A97; break; case 0x2A99: *ch = 0x2A9A; break; case 0x2A9A: *ch = 0x2A99; break; case 0x2A9B: *ch = 0x2A9C; break; case 0x2A9C: *ch = 0x2A9B; break; case 0x2AA1: *ch = 0x2AA2; break; case 0x2AA2: *ch = 0x2AA1; break; case 0x2AA6: *ch = 0x2AA7; break; case 0x2AA7: *ch = 0x2AA6; break; case 0x2AA8: *ch = 0x2AA9; break; case 0x2AA9: *ch = 0x2AA8; break; case 0x2AAA: *ch = 0x2AAB; break; case 0x2AAB: *ch = 0x2AAA; break; case 0x2AAC: *ch = 0x2AAD; break; case 0x2AAD: *ch = 0x2AAC; break; case 0x2AAF: *ch = 0x2AB0; break; case 0x2AB0: *ch = 0x2AAF; break; case 0x2AB3: *ch = 0x2AB4; break; case 0x2AB4: *ch = 0x2AB3; break; case 0x2ABB: *ch = 0x2ABC; break; case 0x2ABC: *ch = 0x2ABB; break; case 0x2ABD: *ch = 0x2ABE; break; case 0x2ABE: *ch = 0x2ABD; break; case 0x2ABF: *ch = 0x2AC0; break; case 0x2AC0: *ch = 0x2ABF; break; case 0x2AC1: *ch = 0x2AC2; break; case 0x2AC2: *ch = 0x2AC1; break; case 0x2AC3: *ch = 0x2AC4; break; case 0x2AC4: *ch = 0x2AC3; break; case 0x2AC5: *ch = 0x2AC6; break; case 0x2AC6: *ch = 0x2AC5; break; case 0x2ACD: *ch = 0x2ACE; break; case 0x2ACE: *ch = 0x2ACD; break; case 0x2ACF: *ch = 0x2AD0; break; case 0x2AD0: *ch = 0x2ACF; break; case 0x2AD1: *ch = 0x2AD2; break; case 0x2AD2: *ch = 0x2AD1; break; case 0x2AD3: *ch = 0x2AD4; break; case 0x2AD4: *ch = 0x2AD3; break; case 0x2AD5: *ch = 0x2AD6; break; case 0x2AD6: *ch = 0x2AD5; break; case 0x2ADE: *ch = 0x22A6; break; case 0x2AE3: *ch = 0x22A9; break; case 0x2AE4: *ch = 0x22A8; break; case 0x2AE5: *ch = 0x22AB; break; case 0x2AEC: *ch = 0x2AED; break; case 0x2AED: *ch = 0x2AEC; break; case 0x2AF7: *ch = 0x2AF8; break; case 0x2AF8: *ch = 0x2AF7; break; case 0x2AF9: *ch = 0x2AFA; break; case 0x2AFA: *ch = 0x2AF9; break; } } else if((*ch & 0xFF00) == 0x3000) { switch(*ch) { case 0x3008: *ch = 0x3009; break; case 0x3009: *ch = 0x3008; break; case 0x300A: *ch = 0x300B; break; case 0x300B: *ch = 0x300A; break; case 0x300C: *ch = 0x300D; break; case 0x300D: *ch = 0x300C; break; case 0x300E: *ch = 0x300F; break; case 0x300F: *ch = 0x300E; break; case 0x3010: *ch = 0x3011; break; case 0x3011: *ch = 0x3010; break; case 0x3014: *ch = 0x3015; break; case 0x3015: *ch = 0x3014; break; case 0x3016: *ch = 0x3017; break; case 0x3017: *ch = 0x3016; break; case 0x3018: *ch = 0x3019; break; case 0x3019: *ch = 0x3018; break; case 0x301A: *ch = 0x301B; break; case 0x301B: *ch = 0x301A; break; } } else if((*ch & 0xFF00) == 0xFF00) { switch(*ch) { case 0xFF08: *ch = 0xFF09; break; case 0xFF09: *ch = 0xFF08; break; case 0xFF1C: *ch = 0xFF1E; break; case 0xFF1E: *ch = 0xFF1C; break; case 0xFF3B: *ch = 0xFF3D; break; case 0xFF3D: *ch = 0xFF3B; break; case 0xFF5B: *ch = 0xFF5D; break; case 0xFF5D: *ch = 0xFF5B; break; case 0xFF5F: *ch = 0xFF60; break; case 0xFF60: *ch = 0xFF5F; break; case 0xFF62: *ch = 0xFF63; break; case 0xFF63: *ch = 0xFF62; break; } } } Node-path: putty/minibidi.h Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 18510 Text-content-md5: d5c3ca595868eda65612ea3e8e965f1c Text-content-sha1: a6e19661aadcabe652483f4d7238e891d52cbdb5 Content-length: 18626 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN===/************************************************************************ * $Id: minibidi.h,v 1.1 2004/05/22 10:36:50 simon Exp $ * * ------------ * Description: * ------------ * This is an implemention of Unicode's Bidirectional Algorithm * (known as UAX #9). * * http://www.unicode.org/reports/tr9/ * * Author: Ahmad Khalifa * * ----------------- * Revision Details: (Updated by Revision Control System) * ----------------- * $Date: 2004/05/22 10:36:50 $ * $Author: simon $ * $Revision: 1.1 $ * $Source: /u1/simon/svn-migration/cvs/putty/minibidi.h,v $ * * (www.arabeyes.org - under MIT license) * ************************************************************************/ /* * TODO: * ===== * - work almost finished * - Shaping Table to be expanded to include the whole range. * - Ligature handling */ #include /* definition of wchar_t*/ #define LMASK 0x3F /* Embedding Level mask */ #define OMASK 0xC0 /* Override mask */ #define OISL 0x80 /* Override is L */ #define OISR 0x40 /* Override is R */ /* Shaping Helpers */ #define STYPE(xh) (((xh >= SHAPE_FIRST) && (xh <= SHAPE_LAST)) ? \ shapetypes[xh-SHAPE_FIRST].type : SU) /*))*/ #define SISOLATED(xh) (shapetypes[xh-SHAPE_FIRST].form_b) #define SFINAL(xh) xh+1 #define SINITIAL(xh) xh+2 #define SMEDIAL(ch) ch+3 typedef struct bidi_char { wchar_t origwc, wc; unsigned short index; } bidi_char; /* function declarations */ void flipThisRun(bidi_char *from, unsigned char* level, int max, int count); int findIndexOfRun(unsigned char* level , int start, int count, int tlevel); unsigned char getType(wchar_t ch); unsigned char setOverrideBits(unsigned char level, unsigned char override); unsigned char getPreviousLevel(unsigned char* level, int from); unsigned char leastGreaterOdd(unsigned char x); unsigned char leastGreaterEven(unsigned char x); unsigned char getRLE(wchar_t ch); int do_shape(bidi_char *line, bidi_char *to, int count); int do_bidi(bidi_char *line, int count); void doMirror(wchar_t* ch); /* character types */ enum { L, LRE, LRO, R, AL, RLE, RLO, PDF, EN, ES, ET, AN, CS, NSM, BN, B, S, WS, ON, }; /* Shaping Types */ enum { SL, /* Left-Joining, doesnt exist in U+0600 - U+06FF */ SR, /* Right-Joining, ie has Isolated, Final */ SD, /* Dual-Joining, ie has Isolated, Final, Initial, Medial */ SU, /* Non-Joining */ SC /* Join-Causing, like U+0640 (TATWEEL) */ }; typedef struct{ char type; wchar_t form_b; } shape_node; /* Kept near the actual table, for verification. */ #define SHAPE_FIRST 0x621 #define SHAPE_LAST 0x64A const shape_node shapetypes[] = { /* index, Typ, Iso, Ligature Index*/ /* 621 */ {SU, 0xFE80}, /* 622 */ {SR, 0xFE81}, /* 623 */ {SR, 0xFE83}, /* 624 */ {SR, 0xFE85}, /* 625 */ {SR, 0xFE87}, /* 626 */ {SD, 0xFE89}, /* 627 */ {SR, 0xFE8D}, /* 628 */ {SD, 0xFE8F}, /* 629 */ {SR, 0xFE93}, /* 62A */ {SD, 0xFE95}, /* 62B */ {SD, 0xFE99}, /* 62C */ {SD, 0xFE9D}, /* 62D */ {SD, 0xFEA1}, /* 62E */ {SD, 0xFEA5}, /* 62F */ {SR, 0xFEA9}, /* 630 */ {SR, 0xFEAB}, /* 631 */ {SR, 0xFEAD}, /* 632 */ {SR, 0xFEAF}, /* 633 */ {SD, 0xFEB1}, /* 634 */ {SD, 0xFEB5}, /* 635 */ {SD, 0xFEB9}, /* 636 */ {SD, 0xFEBD}, /* 637 */ {SD, 0xFEC1}, /* 638 */ {SD, 0xFEC5}, /* 639 */ {SD, 0xFEC9}, /* 63A */ {SD, 0xFECD}, /* 63B */ {SU, 0x0}, /* 63C */ {SU, 0x0}, /* 63D */ {SU, 0x0}, /* 63E */ {SU, 0x0}, /* 63F */ {SU, 0x0}, /* 640 */ {SC, 0x0}, /* 641 */ {SD, 0xFED1}, /* 642 */ {SD, 0xFED5}, /* 643 */ {SD, 0xFED9}, /* 644 */ {SD, 0xFEDD}, /* 645 */ {SD, 0xFEE1}, /* 646 */ {SD, 0xFEE5}, /* 647 */ {SD, 0xFEE9}, /* 648 */ {SR, 0xFEED}, /* 649 */ {SR, 0xFEEF}, /* SD */ /* 64A */ {SD, 0xFEF1}, }; /* * This describes the data byte and its frequency */ typedef struct { unsigned char f; unsigned char d; }RLENode; /* This is an array of RLENodes, which is the * Compressed unicode types table */ const unsigned char RLE_table[] = { 0x09, 0x10, 0x01, 0x0F, 0x01, 0x10, 0x01, 0x11, 0x01, 0x0F, 0x01, 0x0E, 0x0E, 0x0F, 0x03, 0x10, 0x01, 0x11, 0x01, 0x12, 0x02, 0x0A, 0x03, 0x12, 0x05, 0x0A, 0x01, 0x0C, 0x01, 0x0A, 0x01, 0x0C, 0x01, 0x09, 0x01, 0x08, 0x0A, 0x0C, 0x01, 0x12, 0x06, 0x00, 0x1A, 0x12, 0x06, 0x00, 0x1A, 0x12, 0x04, 0x0E, 0x06, 0x0F, 0x01, 0x0E, 0x1A, 0x0C, 0x01, 0x12, 0x01, 0x0A, 0x04, 0x12, 0x04, 0x00, 0x01, 0x12, 0x05, 0x0A, 0x02, 0x08, 0x02, 0x12, 0x01, 0x00, 0x01, 0x12, 0x03, 0x08, 0x01, 0x00, 0x01, 0x12, 0x05, 0x00, 0x17, 0x12, 0x01, 0x00, 0x1F, 0x12, 0x01, 0x00, 0xFF, 0x00, 0x2A, 0x12, 0x01, 0x00, 0x12, 0x12, 0x1C, 0x00, 0x5E, 0x12, 0x02, 0x00, 0x09, 0x12, 0x02, 0x00, 0x07, 0x12, 0x0E, 0x00, 0x02, 0x12, 0x0E, 0x00, 0x05, 0x12, 0x09, 0x00, 0x01, 0x12, 0x11, 0x0D, 0x50, 0x12, 0x10, 0x0D, 0x10, 0x12, 0x0A, 0x00, 0x01, 0x12, 0x0B, 0x00, 0x01, 0x12, 0x01, 0x00, 0x03, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x14, 0x12, 0x01, 0x00, 0x2C, 0x12, 0x01, 0x00, 0x26, 0x12, 0x0A, 0x00, 0x83, 0x0D, 0x04, 0x12, 0x01, 0x0D, 0x02, 0x00, 0x45, 0x12, 0x01, 0x00, 0x26, 0x12, 0x02, 0x00, 0x02, 0x12, 0x06, 0x00, 0x10, 0x12, 0x21, 0x00, 0x26, 0x12, 0x02, 0x00, 0x07, 0x12, 0x01, 0x00, 0x27, 0x12, 0x01, 0x00, 0x01, 0x12, 0x07, 0x0D, 0x11, 0x12, 0x01, 0x0D, 0x17, 0x12, 0x01, 0x0D, 0x03, 0x03, 0x01, 0x0D, 0x01, 0x03, 0x01, 0x0D, 0x02, 0x03, 0x01, 0x0D, 0x01, 0x12, 0x0B, 0x03, 0x1B, 0x12, 0x05, 0x03, 0x05, 0x12, 0x17, 0x0C, 0x01, 0x12, 0x0E, 0x04, 0x01, 0x12, 0x03, 0x04, 0x01, 0x12, 0x01, 0x04, 0x1A, 0x12, 0x05, 0x04, 0x0B, 0x0D, 0x0B, 0x12, 0x0A, 0x0B, 0x0A, 0x0A, 0x01, 0x0B, 0x02, 0x04, 0x03, 0x0D, 0x01, 0x04, 0x65, 0x0D, 0x07, 0x04, 0x01, 0x0D, 0x07, 0x04, 0x02, 0x0D, 0x02, 0x12, 0x01, 0x0D, 0x04, 0x12, 0x02, 0x08, 0x0A, 0x04, 0x05, 0x12, 0x01, 0x04, 0x0E, 0x12, 0x01, 0x0E, 0x01, 0x04, 0x01, 0x0D, 0x01, 0x04, 0x1B, 0x12, 0x03, 0x0D, 0x1B, 0x12, 0x35, 0x04, 0x26, 0x0D, 0x0B, 0x04, 0x01, 0x12, 0xFF, 0x12, 0x50, 0x0D, 0x02, 0x00, 0x01, 0x12, 0x01, 0x00, 0x35, 0x12, 0x02, 0x0D, 0x01, 0x00, 0x04, 0x0D, 0x08, 0x00, 0x04, 0x0D, 0x01, 0x12, 0x02, 0x00, 0x01, 0x0D, 0x04, 0x12, 0x03, 0x00, 0x0A, 0x0D, 0x02, 0x00, 0x0D, 0x12, 0x10, 0x0D, 0x01, 0x00, 0x02, 0x12, 0x01, 0x00, 0x08, 0x12, 0x02, 0x00, 0x02, 0x12, 0x02, 0x00, 0x16, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x01, 0x12, 0x03, 0x00, 0x04, 0x12, 0x02, 0x0D, 0x01, 0x12, 0x01, 0x00, 0x03, 0x0D, 0x04, 0x12, 0x02, 0x00, 0x02, 0x12, 0x02, 0x00, 0x02, 0x0D, 0x01, 0x12, 0x09, 0x00, 0x01, 0x12, 0x04, 0x00, 0x02, 0x12, 0x01, 0x00, 0x03, 0x0D, 0x02, 0x12, 0x02, 0x00, 0x0C, 0x0A, 0x02, 0x00, 0x07, 0x12, 0x07, 0x0D, 0x01, 0x12, 0x02, 0x00, 0x06, 0x12, 0x04, 0x00, 0x02, 0x12, 0x02, 0x00, 0x16, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x02, 0x12, 0x01, 0x00, 0x02, 0x12, 0x01, 0x00, 0x02, 0x12, 0x02, 0x0D, 0x01, 0x12, 0x01, 0x00, 0x03, 0x0D, 0x02, 0x12, 0x04, 0x0D, 0x02, 0x12, 0x02, 0x0D, 0x03, 0x12, 0x0B, 0x00, 0x04, 0x12, 0x01, 0x00, 0x01, 0x12, 0x07, 0x00, 0x0A, 0x0D, 0x02, 0x00, 0x03, 0x12, 0x0C, 0x0D, 0x02, 0x00, 0x01, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x03, 0x12, 0x01, 0x00, 0x16, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x02, 0x12, 0x01, 0x00, 0x05, 0x12, 0x02, 0x0D, 0x01, 0x00, 0x04, 0x0D, 0x05, 0x12, 0x01, 0x0D, 0x02, 0x00, 0x01, 0x12, 0x01, 0x00, 0x02, 0x0D, 0x01, 0x12, 0x02, 0x00, 0x01, 0x12, 0x0F, 0x00, 0x01, 0x12, 0x05, 0x00, 0x0A, 0x12, 0x11, 0x0D, 0x01, 0x00, 0x02, 0x12, 0x01, 0x00, 0x08, 0x12, 0x02, 0x00, 0x02, 0x12, 0x02, 0x00, 0x16, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x02, 0x12, 0x02, 0x00, 0x04, 0x12, 0x02, 0x0D, 0x01, 0x00, 0x02, 0x0D, 0x01, 0x00, 0x01, 0x0D, 0x03, 0x12, 0x03, 0x00, 0x02, 0x12, 0x02, 0x00, 0x02, 0x0D, 0x01, 0x12, 0x08, 0x0D, 0x01, 0x00, 0x01, 0x12, 0x04, 0x00, 0x02, 0x12, 0x01, 0x00, 0x03, 0x12, 0x04, 0x00, 0x0B, 0x12, 0x11, 0x0D, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x06, 0x12, 0x03, 0x00, 0x03, 0x12, 0x01, 0x00, 0x04, 0x12, 0x03, 0x00, 0x02, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x02, 0x12, 0x03, 0x00, 0x02, 0x12, 0x03, 0x00, 0x03, 0x12, 0x03, 0x00, 0x08, 0x12, 0x01, 0x00, 0x03, 0x12, 0x04, 0x00, 0x02, 0x0D, 0x01, 0x00, 0x02, 0x12, 0x03, 0x00, 0x03, 0x12, 0x01, 0x00, 0x03, 0x0D, 0x01, 0x12, 0x09, 0x00, 0x01, 0x12, 0x0F, 0x00, 0x0C, 0x12, 0x0E, 0x00, 0x03, 0x12, 0x01, 0x00, 0x08, 0x12, 0x01, 0x00, 0x03, 0x12, 0x01, 0x00, 0x17, 0x12, 0x01, 0x00, 0x0A, 0x12, 0x01, 0x00, 0x05, 0x12, 0x04, 0x0D, 0x03, 0x00, 0x04, 0x12, 0x01, 0x0D, 0x03, 0x12, 0x01, 0x0D, 0x04, 0x12, 0x07, 0x0D, 0x02, 0x12, 0x09, 0x00, 0x02, 0x12, 0x04, 0x00, 0x0A, 0x12, 0x12, 0x00, 0x02, 0x12, 0x01, 0x00, 0x08, 0x12, 0x01, 0x00, 0x03, 0x12, 0x01, 0x00, 0x17, 0x12, 0x01, 0x00, 0x0A, 0x12, 0x01, 0x00, 0x05, 0x12, 0x04, 0x00, 0x01, 0x0D, 0x01, 0x00, 0x05, 0x12, 0x01, 0x0D, 0x01, 0x00, 0x02, 0x12, 0x01, 0x00, 0x02, 0x0D, 0x02, 0x12, 0x07, 0x00, 0x02, 0x12, 0x07, 0x00, 0x01, 0x12, 0x01, 0x00, 0x02, 0x12, 0x04, 0x00, 0x0A, 0x12, 0x12, 0x00, 0x02, 0x12, 0x01, 0x00, 0x08, 0x12, 0x01, 0x00, 0x03, 0x12, 0x01, 0x00, 0x17, 0x12, 0x01, 0x00, 0x10, 0x12, 0x04, 0x00, 0x03, 0x0D, 0x03, 0x12, 0x02, 0x00, 0x03, 0x12, 0x01, 0x00, 0x03, 0x0D, 0x01, 0x12, 0x09, 0x00, 0x01, 0x12, 0x08, 0x00, 0x02, 0x12, 0x04, 0x00, 0x0A, 0x12, 0x12, 0x00, 0x02, 0x12, 0x01, 0x00, 0x12, 0x12, 0x03, 0x00, 0x18, 0x12, 0x01, 0x00, 0x09, 0x12, 0x01, 0x00, 0x01, 0x12, 0x02, 0x00, 0x07, 0x12, 0x03, 0x0D, 0x01, 0x12, 0x04, 0x00, 0x03, 0x0D, 0x03, 0x12, 0x01, 0x0D, 0x01, 0x12, 0x01, 0x00, 0x08, 0x12, 0x12, 0x00, 0x03, 0x12, 0x0C, 0x00, 0x30, 0x0D, 0x01, 0x00, 0x02, 0x0D, 0x07, 0x12, 0x04, 0x0A, 0x01, 0x00, 0x07, 0x0D, 0x08, 0x00, 0x0D, 0x12, 0x25, 0x00, 0x02, 0x12, 0x01, 0x00, 0x01, 0x12, 0x02, 0x00, 0x02, 0x12, 0x01, 0x00, 0x01, 0x12, 0x02, 0x00, 0x01, 0x12, 0x06, 0x00, 0x04, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x03, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x01, 0x12, 0x02, 0x00, 0x02, 0x12, 0x01, 0x00, 0x04, 0x0D, 0x01, 0x00, 0x02, 0x0D, 0x06, 0x12, 0x01, 0x0D, 0x02, 0x00, 0x01, 0x12, 0x02, 0x00, 0x05, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x0D, 0x06, 0x12, 0x02, 0x00, 0x0A, 0x12, 0x02, 0x00, 0x02, 0x12, 0x22, 0x00, 0x18, 0x0D, 0x02, 0x00, 0x1B, 0x0D, 0x01, 0x00, 0x01, 0x0D, 0x01, 0x00, 0x01, 0x0D, 0x01, 0x12, 0x04, 0x00, 0x0A, 0x12, 0x01, 0x00, 0x22, 0x12, 0x06, 0x0D, 0x0E, 0x00, 0x01, 0x0D, 0x05, 0x00, 0x01, 0x0D, 0x02, 0x00, 0x04, 0x12, 0x04, 0x0D, 0x08, 0x12, 0x01, 0x0D, 0x24, 0x12, 0x01, 0x00, 0x08, 0x0D, 0x01, 0x00, 0x06, 0x12, 0x02, 0x00, 0x01, 0x12, 0x30, 0x00, 0x22, 0x12, 0x01, 0x00, 0x05, 0x12, 0x01, 0x00, 0x02, 0x12, 0x01, 0x00, 0x01, 0x0D, 0x04, 0x00, 0x01, 0x0D, 0x01, 0x12, 0x03, 0x0D, 0x02, 0x00, 0x01, 0x0D, 0x01, 0x12, 0x06, 0x00, 0x18, 0x0D, 0x02, 0x12, 0x46, 0x00, 0x26, 0x12, 0x0A, 0x00, 0x29, 0x12, 0x02, 0x00, 0x01, 0x12, 0x04, 0x00, 0x5A, 0x12, 0x05, 0x00, 0x44, 0x12, 0x05, 0x00, 0x52, 0x12, 0x06, 0x00, 0x07, 0x12, 0x01, 0x00, 0x3F, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x04, 0x12, 0x02, 0x00, 0x07, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x04, 0x12, 0x02, 0x00, 0x27, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x04, 0x12, 0x02, 0x00, 0x1F, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x04, 0x12, 0x02, 0x00, 0x07, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x04, 0x12, 0x02, 0x00, 0x07, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x17, 0x12, 0x01, 0x00, 0x1F, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x04, 0x12, 0x02, 0x00, 0x07, 0x12, 0x01, 0x00, 0x27, 0x12, 0x01, 0x00, 0x13, 0x12, 0x06, 0x00, 0x1C, 0x12, 0x23, 0x00, 0x55, 0x12, 0x0C, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x78, 0x12, 0x09, 0x11, 0x01, 0x00, 0x1A, 0x12, 0x05, 0x00, 0x51, 0x12, 0x0F, 0x00, 0x0D, 0x12, 0x01, 0x00, 0x04, 0x0D, 0x03, 0x12, 0x0B, 0x00, 0x12, 0x0D, 0x03, 0x00, 0x02, 0x12, 0x09, 0x00, 0x12, 0x0D, 0x02, 0x12, 0x0C, 0x00, 0x0D, 0x12, 0x01, 0x00, 0x03, 0x12, 0x01, 0x0D, 0x02, 0x12, 0x0C, 0x00, 0x37, 0x0D, 0x07, 0x00, 0x08, 0x0D, 0x01, 0x00, 0x02, 0x0D, 0x0B, 0x00, 0x07, 0x0A, 0x01, 0x00, 0x01, 0x12, 0x03, 0x00, 0x0A, 0x12, 0x21, 0x0D, 0x03, 0x0E, 0x01, 0x12, 0x01, 0x00, 0x0A, 0x12, 0x06, 0x00, 0x58, 0x12, 0x08, 0x00, 0x29, 0x0D, 0x01, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0x5B, 0x00, 0x9C, 0x12, 0x04, 0x00, 0x5A, 0x12, 0x06, 0x00, 0x16, 0x12, 0x02, 0x00, 0x06, 0x12, 0x02, 0x00, 0x26, 0x12, 0x02, 0x00, 0x06, 0x12, 0x02, 0x00, 0x08, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x1F, 0x12, 0x02, 0x00, 0x35, 0x12, 0x01, 0x00, 0x07, 0x12, 0x01, 0x00, 0x01, 0x12, 0x03, 0x00, 0x03, 0x12, 0x01, 0x00, 0x07, 0x12, 0x03, 0x00, 0x04, 0x12, 0x02, 0x00, 0x06, 0x12, 0x04, 0x00, 0x0D, 0x12, 0x05, 0x00, 0x03, 0x12, 0x01, 0x00, 0x07, 0x12, 0x03, 0x11, 0x0B, 0x0E, 0x03, 0x00, 0x01, 0x03, 0x01, 0x12, 0x18, 0x11, 0x01, 0x0F, 0x01, 0x01, 0x01, 0x05, 0x01, 0x07, 0x01, 0x02, 0x01, 0x06, 0x01, 0x11, 0x01, 0x0A, 0x05, 0x12, 0x2A, 0x11, 0x01, 0x0E, 0x04, 0x12, 0x06, 0x0E, 0x06, 0x08, 0x01, 0x00, 0x01, 0x12, 0x02, 0x08, 0x06, 0x0A, 0x02, 0x12, 0x03, 0x00, 0x01, 0x08, 0x0A, 0x0A, 0x02, 0x12, 0x14, 0x0A, 0x12, 0x12, 0x1E, 0x0D, 0x1B, 0x12, 0x17, 0x00, 0x01, 0x12, 0x04, 0x00, 0x01, 0x12, 0x02, 0x00, 0x0A, 0x12, 0x01, 0x00, 0x01, 0x12, 0x03, 0x00, 0x05, 0x12, 0x06, 0x00, 0x01, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x01, 0x12, 0x01, 0x00, 0x04, 0x0A, 0x01, 0x00, 0x03, 0x12, 0x01, 0x00, 0x07, 0x12, 0x03, 0x00, 0x03, 0x12, 0x05, 0x00, 0x05, 0x12, 0x16, 0x00, 0x24, 0x12, 0x8E, 0x0A, 0x02, 0x12, 0xFF, 0x12, 0x23, 0x00, 0x45, 0x12, 0x1A, 0x00, 0x01, 0x12, 0xCA, 0x08, 0x3C, 0x00, 0x4E, 0x08, 0x01, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0x20, 0x11, 0x01, 0x12, 0x04, 0x00, 0x03, 0x12, 0x19, 0x00, 0x09, 0x0D, 0x06, 0x12, 0x01, 0x00, 0x05, 0x12, 0x02, 0x00, 0x05, 0x12, 0x04, 0x00, 0x56, 0x12, 0x02, 0x0D, 0x02, 0x12, 0x02, 0x00, 0x03, 0x12, 0x01, 0x00, 0x5A, 0x12, 0x01, 0x00, 0x04, 0x12, 0x05, 0x00, 0x28, 0x12, 0x04, 0x00, 0x5E, 0x12, 0x01, 0x00, 0x28, 0x12, 0x38, 0x00, 0x2D, 0x12, 0x03, 0x00, 0x24, 0x12, 0x1C, 0x00, 0x1C, 0x12, 0x03, 0x00, 0x32, 0x12, 0x0F, 0x00, 0x0C, 0x12, 0x04, 0x00, 0x2F, 0x12, 0x01, 0x00, 0x77, 0x12, 0x04, 0x00, 0x63, 0x12, 0x02, 0x00, 0x1F, 0x12, 0x01, 0x00, 0x01, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xCD, 0x00, 0x01, 0x12, 0x4A, 0x00, 0x01, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xF5, 0x00, 0x01, 0x12, 0x5A, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x91, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0x7A, 0x00, 0x01, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xCD, 0x00, 0x01, 0x12, 0x5C, 0x00, 0x01, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0x81, 0x00, 0x02, 0x12, 0x7E, 0x00, 0x02, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0x02, 0x00, 0x02, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0xFF, 0x12, 0x17, 0x00, 0xFF, 0x00, 0x30, 0x12, 0x02, 0x00, 0x3B, 0x12, 0x95, 0x00, 0x07, 0x12, 0x0C, 0x00, 0x05, 0x12, 0x05, 0x03, 0x01, 0x0D, 0x01, 0x03, 0x0A, 0x0A, 0x01, 0x03, 0x0D, 0x12, 0x01, 0x03, 0x05, 0x12, 0x01, 0x03, 0x01, 0x12, 0x01, 0x03, 0x02, 0x12, 0x01, 0x03, 0x02, 0x12, 0x01, 0x03, 0x0A, 0x04, 0x62, 0x12, 0x21, 0x04, 0xFF, 0x04, 0x6C, 0x12, 0x12, 0x04, 0x40, 0x12, 0x02, 0x04, 0x36, 0x12, 0x28, 0x04, 0x0D, 0x12, 0x03, 0x0D, 0x10, 0x12, 0x10, 0x0D, 0x04, 0x12, 0x2C, 0x0C, 0x01, 0x12, 0x01, 0x0C, 0x01, 0x12, 0x02, 0x0C, 0x01, 0x12, 0x09, 0x0A, 0x01, 0x12, 0x02, 0x0A, 0x02, 0x12, 0x05, 0x0A, 0x02, 0x12, 0x05, 0x04, 0x05, 0x12, 0x01, 0x04, 0x87, 0x12, 0x02, 0x0E, 0x01, 0x12, 0x03, 0x0A, 0x03, 0x12, 0x05, 0x0A, 0x01, 0x0C, 0x01, 0x0A, 0x01, 0x0C, 0x01, 0x09, 0x01, 0x08, 0x0A, 0x0C, 0x01, 0x12, 0x06, 0x00, 0x1A, 0x12, 0x06, 0x00, 0x1A, 0x12, 0x0B, 0x00, 0x59, 0x12, 0x03, 0x00, 0x06, 0x12, 0x02, 0x00, 0x06, 0x12, 0x02, 0x00, 0x06, 0x12, 0x02, 0x00, 0x03, 0x12, 0x03, 0x0A, 0x02, 0x12, 0x03, 0x0A, 0x02, 0x12, 0x09, 0x00, 0x0E, 0x00, }; Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f49903499654ab89d67e2f77e3ca09f3 Text-delta-base-sha1: f24b3ea4e3664d5ff92c2feb019e2dcf70b3aced Text-content-length: 278 Text-content-md5: 84290de541b47afc514e9b741ce0d146 Text-content-sha1: 83dc87a9dd521ef86df3ffa59e862b82f8fd6c5e Content-length: 319 K 15 cvs2svn:cvs-rev V 5 1.226 PROPS-END SVN u7T1V {int arabicshaping; int bidiExports from minibidi.c. */ typedef struct bidi_char { wchar_t origwc, wc; unsigned short index; } bidi_char; int do_bidi(bidi_char *line, int count); int do_shape(bidi_char *line, bidi_char *to, int count Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 915d1dd0b1e7612c355866a0e09c2e68 Text-delta-base-sha1: 4a21abfd1c6e7a82db65f4087a6929523a0de241 Text-content-length: 235 Text-content-md5: 4ff8a506683b0b4b244da35f7799c65e Text-content-sha1: 14914dd199ca395713e7fc0920d487117c02d242 Content-length: 276 K 15 cvs2svn:cvs-rev V 5 1.117 PROPS-END SVND<?Qa&0GU^ 5DisableArabicShaping", cfg->arabicshaping); write_setting_i(sesskey, "DisableBidi", cfg->bidiDisableArabicShaping", 0, &cfg->arabicshaping); gppi(sesskey, "DisableBidi", 0, &cfg->bidi Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0cd1cbfd6f7f254e5674ef59e7be0354 Text-delta-base-sha1: 52c37d2a2e3176a07d377ef670e2ef9ee39ee7bc Text-content-length: 8074 Text-content-md5: e2e1fc700bf9b40b034da161dc017469 Text-content-sha1: f4506679424ce9aea32e84152d122804d5ce196e Content-length: 8115 K 15 cvs2svn:cvs-rev V 5 1.165 PROPS-END SVN<)t>%slyyOjaV1* 1e /* Allocate temporary buffers for Arabic shaping and bidi. */ if (!term->cfg.arabicshaping || !term->cfg.bidi) { term->wcFrom = sresize(term->wcFrom, term->cols, bidi_char); term->ltemp = sresize(term->ltemp, term->cols+1, unsigned long); term->wcTo = sresize(term->wcTo, term->cols, bidi_char); } term->ltemp = NULL; term->wcFrom = NULL; term->wcTo = NULL; term->bidi_cache_size = 0; term->pre_bidi_cache = term->post_bidi_cache = NULL int i->ltemp); sfree(term->wcFrom); sfree(term->wcTo); for (i = 0; i < term->bidi_cache_size; i++) { sfree(term->pre_bidi_cache[i]); sfree(term->post_bidi_cache[i]); } sfree(term->pre_bidi_cache); sfree(term->post_bidi_cache); To prevent having to run the reasonably tricky bidi algorithm * too many times, we maintain a cache of the last lineful of data * fed to the algorithm on each line of the display. */ static int term_bidi_cache_hit(Terminal *term, int line, unsigned long *lbefore, int width) { if (!term->pre_bidi_cache) return FALSE; /* cache doesn't even exist yet! */ if (line >= term->bidi_cache_size) return FALSE; /* cache doesn't have this many lines */ if (!term->pre_bidi_cache[line]) return FALSE; /* cache doesn't contain _this_ line */ if (!memcmp(term->pre_bidi_cache[line], lbefore, width * sizeof(unsigned long))) return TRUE; /* aha! the line matches the cache */ return FALSE; /* it didn't match. */ } static void term_bidi_cache_store(Terminal *term, int line, unsigned long *lbefore, unsigned long *lafter, int width) { if (!term->pre_bidi_cache || term->bidi_cache_size <= line) { int j = term->bidi_cache_size; term->bidi_cache_size = line+1; term->pre_bidi_cache = sresize(term->pre_bidi_cache, term->bidi_cache_size, unsigned long *); term->post_bidi_cache = sresize(term->post_bidi_cache, term->bidi_cache_size, unsigned long *); while (j < term->bidi_cache_size) { term->pre_bidi_cache[j] = term->post_bidi_cache[j] = NULL; j++; } } sfree(term->pre_bidi_cache[line]); sfree(term->post_bidi_cache[line]); term->pre_bidi_cache[line] = snewn(width, unsigned long); term->post_bidi_cache[line] = snewn(width, unsigned long); memcpy(term->pre_bidi_cache[line], lbefore, width * sizeof(unsigned long)); memcpy(term->post_bidi_cache[line], lafter, width * sizeof(unsigned long)); }it /* Do Arabic shaping and bidi. */ if(!term->cfg.bidi || !term->cfg.arabicshaping) { if (!term_bidi_cache_hit(term, i, ldata, term->cols)) { for(it=0; itcols ; it++) { int uc = (ldata[it] & 0xFFFF); switch (uc & CSET_MASK) { case ATTR_LINEDRW: if (!term->cfg.rawcnp) { uc = term->ucsdata->unitab_xterm[uc & 0xFF]; break; } case ATTR_ASCII: uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case ATTR_SCOACS: uc = term->ucsdata->unitab_scoacs[uc&0xFF]; break; } switch (uc & CSET_MASK) { case ATTR_ACP: uc = term->ucsdata->unitab_font[uc & 0xFF]; break; case ATTR_OEMCP: uc = term->ucsdata->unitab_oemcp[uc & 0xFF]; break; } term->wcFrom[it].origwc = term->wcFrom[it].wc = uc; term->wcFrom[it].index = it; } if(!term->cfg.bidi) do_bidi(term->wcFrom, term->cols); /* this is saved iff done from inside the shaping */ if(!term->cfg.bidi && term->cfg.arabicshaping) for(it=0; itcols; it++) term->wcTo[it] = term->wcFrom[it]; if(!term->cfg.arabicshaping) do_shape(term->wcFrom, term->wcTo, term->cols); for(it=0; itcols ; it++) { term->ltemp[it] = ldata[term->wcTo[it].index]; if (term->wcTo[it].origwc != term->wcTo[it].wc) term->ltemp[it] = ((term->ltemp[it] & 0xFFFF0),)000) | term->wcTo[it].wc); } term_bidi_cache_store(term, i, ldata, term->ltemp, term->cols); ldata = term->ltemp; } else { ldata = term->post_bidi_cache[i]; } } for (j = 0; j < term->cols; j++, idx++) { unsigned long tattr, tchar; unsigned long *d = ldata + j; int break_run; scrpos.x = j; tchar = (*d & (CHAR_MASK | CSET_MASK)); tattr = (*d & (ATTR_MASK ^ CSET_MASK)); switch (tchar & CSET_MASK) { case ATTR_ASCII: tchar = term->ucsdata->unitab_line[tchar & 0xFF]; break; case ATTR_LINEDRW: tchar = term->ucsdata->unitab_xterm[tchar & 0xFF]; break; case ATTR_SCOACS: tchar = term->ucsdata->unitab_scoacs[tchar&0xFF]; break; } tattr |= (tchar & CSET_MASK); tchar &= CHAR_MASK; if ((d[1] & (CHAR_MASK | CSET_MASK)) == UCSWIDE) tattr |= ATTR_WIDE; /* Video reversing things */ if (term->selstate == DRAGGING || term->selstate == SELECTED) { if (term->seltype == LEXICOGRAPHIC) selected = (posle(term->selstart, scrpos) && poslt(scrpos, term->selend)); else selected = (posPle(term->selstart, scrpos) && posPlt(scrpos, term->selend)); } else selected = FALSE; tattr = (tattr ^ rv ^ (selected ? ATTR_REVERSE : 0)); /* 'Real' blinking ? */ if (term->blink_is_real && (tattr & ATTR_BLINK)) { if (term->has_focus && term->tblinker) { tchar = term->ucsdata->unitab_line[(unsigned char)' ']; } tattr &= ~ATTR_BLINK; } /* * Check the font we'll _probably_ be using to see if * the character is wide when we don't want it to be. */ if ((tchar | tattr) != (term->disptext[idx]& ~ATTR_NARROW)) { if ((tattr & ATTR_WIDE) == 0 && char_width(ctx, (tchar | tattr) & 0xFFFF) == 2) tattr |= ATTR_NARROW; } else if (term->disptext[idx]&ATTR_NARROW) tattr |= ATTR_NARROW; /* Cursor here ? Save the 'background' */ if (i == our_curs_y && j == our_curs_x) { cursor_background = tattr | tchar; term->dispcurs = term->disptext + idx; } if ((term->disptext[idx] ^ tattr) & ATTR_WIDE) dirty_line = TRUE; break_run = (((tattr ^ attr) & term->attr_mask) || j - start >= sizeof(ch)); /* Special hack for VT100 Linedraw glyphs */ if ((attr & CSET_MASK) == 0x2300 && tchar >= 0xBA && tchar <= 0xBD) break_run = TRUE; if (!term->ucsdata->dbcs_screenfont && !dirty_line) { if ((tchar | tattr) == term->disptext[idx]) break_run = TRUE; else if (!dirty_run && ccount == 1) break_run = TRUE; } if (break_run) { if ((dirty_run || last_run_dirty) && ccount > 0) { do_text(ctx, start, i, ch, ccount, attr, lattr); updated_line = 1; } start = j; ccount = 0; attr = tattr; if (term->ucsdata->dbcs_screenfont) last_run_dirty = dirty_run; dirty_run = dirty_line; } if ((tchar | tattr) != term->disptext[idx]) dirty_run = TRUE; ch[ccount++] = (char) tchar; term->disptext[idx] = tchar | tattr; /* If it's a wide char step along to the next one. */ if (tattr & ATTR_WIDE) { if (++j < term->cols) { idx++; d++; /* * By construction above, the cursor should not * be on the right-hand half of this character. * Ever. */ assert(!(i == our_curs_y && j == our_curs_x)); if (term->disptext[idx] != *d) dirty_run = TRUE; term->disptext[idx] = *d; } } } if (dirty_run && ccount > 0) { do_text(ctx, start, i, ch, ccount, attr, lattr); updated_line = 1; } /* Cursor on this line ? (and changed) */ if (i == our_curs_y && (term->curstype != cursor || updated_line)) { ch[0] = (char) (cursor_background & CHAR_MASK); attr = (cursor_background & ATTR_MASK) | cursor; do_cursor(ctx, our_curs_x, i, ch, 1, attr, lattr); term->curstype = cursor; } } } /* * Flick the switch that says if blinking things should be shown or hidden. */ void term_blink(Terminal *term, int flg) { long now, blink_diff; now = GETTICKCOUNT(); Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9929db90221cebfe5628262a0cec1b4f Text-delta-base-sha1: 1c03c19c4e9f9481a42cf17f2e59c8b7d6f7fec7 Text-content-length: 240 Text-content-md5: 9b0846c53744486827e86b9bb2593a5b Text-content-sha1: 75eb85411492633cce991d0fa2415182d06f9593 Content-length: 280 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN. YTY\R /* * These are buffers used by the bidi and Arabic shaping code. */ unsigned long *ltemp; bidi_char *wcFrom, *wcTo; unsigned long **pre_bidi_cache, **post_bidi_cache; int bidi_cache_size Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3c877d4f4acbff06a3efbb81ee9cee86 Text-delta-base-sha1: 92be140dd71864a83f4a5a4b692b08cfdecc68d7 Text-content-length: 2315 Text-content-md5: fc702c04eac84f59a382f28029dc4770 Text-content-sha1: fa348d81e9b96ae41a94ff4c32354bf09a370484 Content-length: 2356 K 15 cvs2svn:cvs-rev V 5 1.263 PROPS-END SVNg&^x,|/;bThis is a wrapper to ExtTextOut() to force Windows to display * the precise glyphs we give it. Otherwise it would do its own * bidi and Arabic shaping, and we would end up uncertain which * characters it had put where. */ static void exact_textout(HDC hdc, int x, int y, CONST RECT *lprc, unsigned short *lpString, UINT cbCount, CONST INT *lpDx) { GCP_RESULTSW gcpr; char *buffer = snewn(cbCount*2+2, char); char *classbuffer = snewn(cbCount, char); memset(&gcpr, 0, sizeof(gcpr)); memset(buffer, 0, cbCount*2+2); memset(classbuffer, GCPCLASS_NEUTRAL, cbCount); gcpr.lStructSize = sizeof(gcpr); gcpr.lpGlyphs = (void *)buffer; gcpr.lpClass = classbuffer; gcpr.nGlyphs = cbCount; GetCharacterPlacementW(hdc, lpString, cbCount, 0, &gcpr, FLI_MASK | GCP_CLASSIN); ExtTextOut(hdc, x, y, ETO_GLYPH_INDEX | ETO_CLIPPED | ETO_OPAQUE, lprc, buffer, cbCount, lpDx/* print Glyphs as they are, without Windows' Shaping*/ exact_textout(hdc, x, y - font_height * (lattr == LATTR_BOT) + text_adjust, &line_box, wbuf, len, IpDx); /*wbuf, len, IpDx); */tccys' parameter is declared in MSDN documentation as * 'LPWORD lpChar'. * The experience of a French user indicates that on * Win98, WORD[] should be passed in, but on Win2K, it should * be BYTE[]. German WinXP and my Win2K with "US International" * driver corroborate this. * Experimentally I've conditionalised the behaviour on the * Win9x/NT split, but I suspect it's worse than that. * See wishlist item `win-dead-keys' for more horrible detail * and speculations. */ BYTE keybs[3]; int i; r = ToAsciiEx(wParam, scan, keystate, (LPWORD)keybs, 0, kbd_layout); for (i=0; i<3; i++) keys[i] = keybs[i]; } else { r = ToAsciiEx(wParam, scan, keystate, keys, 0, kbd_layout); } #ifdef SHOW_TOASCII_RESULT if (r == 1 && !key_down) { if (alt_sum) { if (in_utf(term) || ucsdata.dbcs_screenfont) debug((", (U+%04x)", alt_sum)); else debug((", LCH(%d)", alt_sum)); } else { debug((", ACH(%d)", keys[0])); } } else if (r > 0) { int r1; debug((", ASC(")); for (r1 = 0; r1 < r; r1++) { debug(("%s%d", r1 Node-path: putty/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0931ec119c224580164199c6e7e5f155 Text-delta-base-sha1: 178a477e54f66a69cbd0a6ce9bbaf4e28dbb80d3 Text-content-length: 118 Text-content-md5: 3a08da499161145b1e7b9f5e8864a4f1 Text-content-sha1: 863a170a0c285d4ec7e7715cef1d295ef2e9f804 Content-length: 157 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNA7 ``Hyfeatures_arabicshaping "features.arabicshaping" #define WINHELP_CTX_features_bidi "features.bidi Revision-number: 4237 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2004-05-22T11:04:35.000000Z K 7 svn:log V 64 Fix Halibut syntax errors in the new shaping/bidi doc sections. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 85b5a2bdc63c48f350fa0d0771b0ff33 Text-delta-base-sha1: 05b38c5e1f4ad646f5bad0938df0fa047ee2e56e Text-content-length: 106 Text-content-md5: 304705a6dc95c8ebd801930e400265b5 Text-content-sha1: 6deed3a29fa3e04b70668af6c16fb5fb79f670b0 Content-length: 146 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVNH-5|c(w\versionid $Id: config.but,v 1.79 2004/05/22 11:04:35kk{config-features- Revision-number: 4238 Prop-content-length: 356 Content-length: 356 K 8 svn:date V 27 2004-05-22T11:09:31.000000Z K 7 svn:log V 255 Halibut now warns about code paragraph lines which are too long to fit in the text output format. If only to stop myself getting pestered with cron stderr messages every night, here are some changes that remove over-long code lines from the PuTTY manual. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 304705a6dc95c8ebd801930e400265b5 Text-delta-base-sha1: 6deed3a29fa3e04b70668af6c16fb5fb79f670b0 Text-content-length: 167 Text-content-md5: 6ddaa816457765da9951f5125a3f9c0a Text-content-sha1: 1e18c957851bb8d9f26142193e6b96e47af86dc8 Content-length: 207 K 15 cvs2svn:cvs-rev V 4 1.80 PROPS-END SVN  5Vm,\versionid $Id: config.but,v 1.80 2004/05/22 11:09:31new.reg HKEY_CURRENT_USER\Software\SimonTatham\PuTTY \c copy new.reg putty.reg \c del Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fed30c081a3a73ace20c4bb606fcbbb4 Text-delta-base-sha1: 5bd8e70d5d2d52113c01eb0f99a3d22774cf419e Text-content-length: 102 Text-content-md5: 4410c127cbc2b4a9ea6f3d1095bab748 Text-content-sha1: feb1bd2a64037134ea4cd5ab0f8defa9e4fea2d6 Content-length: 142 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVNZZK38\~\versionid $Id: faq.but,v 1.70 2004/05/22 11:09:31 simon \c wuadmintools/ Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b7c4e5604d5b1843c03ff297aaa45628 Text-delta-base-sha1: d15b79074ac2e0d5a3361f8cabf61425358c5a98 Text-content-length: 199 Text-content-md5: b8c0584b09286dd3c17c8cc32fb76f87 Text-content-sha1: 14728cb4de6c743e46efbec0b2bc9c1b76b76ddb Content-length: 239 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN\R /]6yF\versionid $Id: pageant.but,v 1.11 2004/05/22 11:09:311024 22:c3:68:3b:09:41:36:c3:39:83:91:ae:71:b2:0f:04 k1 \c ssh-rsa 1023 74:63:08:82:95:75:e1:7c:33:31:bb:cb:00:c0:89:8b k Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e503589291316960f144a278e894109f Text-delta-base-sha1: 8916d247b9e61912414cbebbf9eed7c3c6e64d0d Text-content-length: 120 Text-content-md5: ec4bb37344764a7b174fb2f5c3ff1b1b Text-content-sha1: 510be06478033174c4b645c3241087f06e3a0ae7 Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVN83 b3:\versionid $Id: plink.but,v 1.23 2004/05/22 11:09:31 simonred/ /var/log/httpd/access.log > fredlog Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7353dc0517391bd3a1d00850b8586e2f Text-delta-base-sha1: 97132f6fb0bf7d4119a972e04af699233244a667 Text-content-length: 503 Text-content-md5: 39c20c3953554d1f4ae5eb9d1bcdf60d Text-content-sha1: 385a0223ee663e3418939ad1e722af33208864bd Content-length: 543 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNz8P9l~{W#\versionid $Id: pscp.but,v 1.28 2004/05/22 11:09:31 simonfoo.txt} to the server \c{example.com} as user \c{fred} to the file \c{/tmp/foo} you would type: \c pscp c:\documents\foo.txt fred@example.com:/tmp/foosaying something like \q{warning: remote host tried to write to a file called 'terminal.c' when we requested a file called '*.c'. If this is a wildcard, consider upgrading to SSH 2 or using the '-unsafe' option. Renaming of this file has been disallowed}| Revision-number: 4239 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.635332Z PROPS-END Revision-number: 4240 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.644858Z PROPS-END Revision-number: 4241 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2004-05-22T14:21:27.000000Z K 7 svn:log V 62 Fix indentation after Richard B's patch in rev 1.137 [r3409]. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e98a8f991b4c50ab67879022c3af1635 Text-delta-base-sha1: 75e52b54b5c2b67f77f0a959b130825ad1df360d Text-content-length: 871 Text-content-md5: 22a24ba91ae0a0df02d1fb0a7d253c4c Text-content-sha1: 6c7ec313fdcc7d9a2642c83737a5b32afbf3d667 Content-length: 912 K 15 cvs2svn:cvs-rev V 5 1.139 PROPS-END SVNEsJuJ4 /* * Convert COMPOUND_TEXT into UTF-8. */ if (seldata->type == compound_text_atom) { tp.value = seldata->data; tp.encoding = (Atom) seldata->type; tp.format = seldata->format; tp.nitems = seldata->length; ret = Xutf8TextPropertyToTextList(GDK_DISPLAY(), &tp, &list, &count); if (ret != 0 || count != 1) { /* * Compound text failed; fall back to STRING. */ gtk_selection_convert(inst->area, GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, inst->input_event_time); return; } text = list[0]; length = strlen(list[0]); charset = CS_UTF8; free_list_required = 1; } else { text = (char *)seldata->data; length = seldata->length; charset = (seldata->type == utf8_string_atom ? CS_UTF8 : inst->ucsdata.line_codepage); Revision-number: 4242 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.741185Z PROPS-END Revision-number: 4243 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.750715Z PROPS-END Revision-number: 4244 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.852191Z PROPS-END Revision-number: 4245 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.861082Z PROPS-END Revision-number: 4246 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.869930Z PROPS-END Revision-number: 4247 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.879201Z PROPS-END Revision-number: 4248 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.888889Z PROPS-END Revision-number: 4249 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.898476Z PROPS-END Revision-number: 4250 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:26.908887Z PROPS-END Revision-number: 4251 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2004-05-24T08:53:41.000000Z K 7 svn:log V 24 mirrors.thinktech.co.uk K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 109ce82de6fb38eab57f67eac6120f55 Text-delta-base-sha1: 86f18e7e746296c7baa031edd69f1930f0de1e40 Text-content-length: 66 Text-content-md5: 85f8fb5eece55a21ebc414a44d01a816 Text-content-sha1: 5c6192da4bc0b496ae6a7023aab5b0d591d34407 Content-length: 106 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVN)YOrDQthinktech.co.uk/putty/">mirrors.thinktech Revision-number: 4252 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2004-05-24T09:55:51.000000Z K 7 svn:log V 143 There do in fact appear to be help topics for the Arabic and bidi options, so use them. Also use an accelerator that actually exists for bidi. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8ed9d56ab45a87a6f8ced8d73e02f7c7 Text-delta-base-sha1: 10cfd0fa327d9d5f23c818846bbfb896b6b7b917 Text-content-length: 80 Text-content-md5: 5a8633f37ea82e5b57f4e568910f4f67 Text-content-sha1: 6029da2981484f7ed45dde2b36c7d70ce93a0c38 Content-length: 120 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN,/gnfeatures_arabicshapingd', HELPCTX(features_bidi Revision-number: 4253 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2004-05-24T09:59:31.000000Z K 7 svn:log V 34 Mention TrayIt (Pasi Tuulosniemi) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/system-tray Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4669dd0df3d8a409511fcf6d98c46b51 Text-delta-base-sha1: 85af8a8eddf9210a013921a25e23757858a99b4f Text-content-length: 82 Text-content-md5: 4cb98927e9a1da93b282097ffa3865da Text-content-sha1: 0c32476593ac96c6affd8514e76a89da1212fac2 Content-length: 121 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNH?C:li> TrayIt Revision-number: 4254 Prop-content-length: 258 Content-length: 258 K 8 svn:date V 27 2004-05-24T11:30:15.000000Z K 7 svn:log V 157 Arnaud Desitter points out a silly mistake in retrieve_cutbuffer() (don't test for `int *nbytes' being <= 0, test for the integer it points to being <= 0!). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 22a24ba91ae0a0df02d1fb0a7d253c4c Text-delta-base-sha1: 6c7ec313fdcc7d9a2642c83737a5b32afbf3d667 Text-content-length: 27 Text-content-md5: cdbd55e18aac64ee4b4d90fe9a08a566 Text-content-sha1: b6d982c49b1772ed2cd7138cc4a6fa17be100c94 Content-length: 68 K 15 cvs2svn:cvs-rev V 5 1.140 PROPS-END SVNst i i* Revision-number: 4255 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:27.165382Z PROPS-END Revision-number: 4256 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2004-05-24T17:12:42.000000Z K 7 svn:log V 57 Typos in Borland Makefile pointed out by Arnaud Desitter K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4dd6dba8f24a79b572b9154886f9c3ff Text-delta-base-sha1: e534e9af2045e3f340eac166afd20d31563b01dd Text-content-length: 22 Text-content-md5: 9f21332b18b47093dc680e509839e942 Text-content-sha1: 20a30a2f69339b2eb3cd7ed445519a83d7b2000a Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVNJH !&$c Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 33399dee348ace944c5230a47c880255 Text-delta-base-sha1: 68363c54a3374873023390afe6cf677c035c5808 Text-content-length: 25 Text-content-md5: 9a94782c084b66e83582c41a9e39745f Text-content-sha1: a1665269198a600ed4002589e557bee6e93e731b Content-length: 65 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN   Revision-number: 4257 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:27.286005Z PROPS-END Revision-number: 4258 Prop-content-length: 139 Content-length: 139 K 7 svn:log V 39 Explicitly mention symptoms with emacs K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-05-26T09:07:43.000000Z PROPS-END Node-path: putty-wishlist/data/ssh-termspeed Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 190f4b4c94167cb6166b9f09e3e2972a Text-delta-base-sha1: 255f1187fae5fb57f7c39003d0bc06098d2902b4 Text-content-length: 99 Text-content-md5: 84dc3f0b024b4595e7d1301c3638c709 Text-content-sha1: 50322aac8dfb9a282aa85c86ee178a1d31e01474 Content-length: 138 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN[ M/M_/, and emacs runs terribly slow to avoid overloading the terminal Revision-number: 4259 Prop-content-length: 250 Content-length: 250 K 8 svn:date V 27 2004-05-26T09:19:48.000000Z K 7 svn:log V 149 In the entry about twiddling Windows TCP timeouts, mention that it's OK to create the registry values, and link back to the original MS KB articles. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4410c127cbc2b4a9ea6f3d1095bab748 Text-delta-base-sha1: feb1bd2a64037134ea4cd5ab0f8defa9e4fea2d6 Text-content-length: 367 Text-content-md5: 4ff0f3f71f212a8f1361399edf798c74 Text-content-sha1: 848ea8196d406f1ce274c04832b312163f02ce95 Content-length: 407 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVNZf AR8 6'~\\versionid $Id: faq.but,v 1.71 2004/05/26 09:19:48 jacobreate or (See MS Knowledge Base article \W{http://support.microsoft.com/default.aspx?scid=kb;en-us;158474}{158474} for more information.)(See MS Knowledge Base article \W{http://support.microsoft.com/default.aspx?scid=kb;en-us;120642}{120642} for more information.) Revision-number: 4260 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2004-05-26T22:52:22.000000Z K 7 svn:log V 49 mention Terminal Services from comp.security.ssh K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-loopback-choice Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 0be25301792ea4e076f2f2bd010283e7 Text-delta-base-sha1: f434662ff5cff37853dc454349f0137776ab0e4e Text-content-length: 152 Text-content-md5: eeeada419b3564c9062f34358295c7e2 Text-content-sha1: 51d80c81c05197605038ba60fa3bb52d047196d7 Content-length: 191 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN (Apparently this is also useful for forwarding Windows Terminal Services -- see <99ab3348.0405241707.74fa3d6b@posting.google.com>.) Revision-number: 4261 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:27.505191Z PROPS-END Revision-number: 4262 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:27.514969Z PROPS-END Revision-number: 4263 Prop-content-length: 221 Content-length: 221 K 8 svn:date V 27 2004-05-31T14:01:52.000000Z K 7 svn:log V 120 RJK's patch to enable PuTTY's X forwarding to connect to local X servers using Unix sockets (on Unix only, obviously!). K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4ff8a506683b0b4b244da35f7799c65e Text-delta-base-sha1: 14914dd199ca395713e7fc0920d487117c02d242 Text-content-length: 24 Text-content-md5: e1f4d5bd78109aa2b3ea767a6aedb82a Text-content-sha1: 9a6701dffb3896463b54fb840129c4f175a33c60 Content-length: 65 K 15 cvs2svn:cvs-rev V 5 1.118 PROPS-END SVN<1 jGu Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 54ba186d31931617f6d58e49de20aac6 Text-delta-base-sha1: 1a253d4cf1d2adeadb31124d1c1275c1a321c553 Text-content-length: 352 Text-content-md5: 6ab1a83101ab35577de990d0afe5c59a Text-content-sha1: de88266c0e71b372683912c1a4d3f0dba2c14bd2 Content-length: 392 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVNaA+LOu Uchar *x11_display(const char *display); /* Platform-dependent X11 functionsextern const char platform_x11_best_transport[]; /* best X11 hostname for this platform if none specified */ SockAddr platform_get_x11_unix_address(int displaynum, char **canonicalname); /* make up a SockAddr naming the address for displaynum */ Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 81d5ba49c64e5b95a61199688e3b67ce Text-delta-base-sha1: 32e0ff7692c78234de759ab3db52572ec7aaec95 Text-content-length: 356 Text-content-md5: 6e52610dee1f2d8ac6cdc2758b1d9040 Text-content-sha1: 83ccef81a92e00302ab0ed4167194dfcef36caf4 Content-length: 395 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNy>AmhstVC4E #include "putty.h" #include "sshdisplay = x11_display(display); || !strncmp(display, "unix:", 5)) command = dupprintf("xauth list %s 2>/dev/null", strchr(display, ':')); else command = dupprintf("xauth list %s 2>/dev/null", display); sfree( const char platform_x11_best_transport[] = "unix"; Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4b374cb52174d717d3b9b216b13ee487 Text-delta-base-sha1: f3ebe3c3c468453b84dd23108dccc570a64e2d54 Text-content-length: 3592 Text-content-md5: d2a453e852550596c7ba9633311fefeb Text-content-sha1: 5960750fd76bf1a3cea68a032f515d7fd6f18a3a Content-length: 3632 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN"p1I>f:EkN})=Df~$e#include family != AF_UNIX) { /* Loop round trying to bind */ while (1) { int retcode; #ifdef IPV6 if (addr->family == AF_INET6) { /* XXX use getaddrinfo to get a local address? */ a6.sin6_family = AF_INET6; a6.sin6_addr = in6addr_any; a6.sin6_port = htons(localport); retcode = bind(s, (struct sockaddr *) &a6, sizeof(a6)); } else #endif { assert(addr->family == AF_INET); a.sin_family = AF_INET; a.sin_addr.s_addr = htonl(INADDR_ANY); a.sin_port = htons(localport); retcode = bind(s, (struct sockaddr *) &a, sizeof(a)); } if (retcode >= 0) { err = 0; break; /* done */ } else { err = errno; if (err != EADDRINUSE) /* failed, for a bad reason */ break; } if (localport == 0) break; /* we're only looping once */ localport--; if (localport == 0) break; /* we might have got to the end */ } if (err) { ret->error = error_string(err); return (Socket) ret; } } /* * Connect to remote address. */ switch(addr->family) { #ifdef IPV6 case AF_INET: /* XXX would be better to have got getaddrinfo() to fill in the port. */ ((struct sockaddr_in *)addr->ai->ai_addr)->sin_port = htons(port); sa = (const struct sockaddr *)addr->ai->ai_addr; salen = addr->ai->ai_addrlen; break; case AF_INET6: ((struct sockaddr_in *)addr->ai->ai_addr)->sin_port = htons(port); sa = (const struct sockaddr *)addr->ai->ai_addr; salen = addr->ai->ai_addrlen; break; #else case AF_INET: a.sin_family = AF_INET; a.sin_addr.s_addr = htonl(addr->address); a.sin_port = htons((short) port); sa = (const struct sockaddr *)&a; salen = sizeof a; break; #endif case AF_UNIX: assert(port == 0); /* to catch confused people */ assert(strlen(addr->hostname) < sizeof au.sun_path); memset(&au, 0, sizeof au); au.sun_family = AF_UNIX; strcpy(au.sun_path, addr->hostname); sa = (const struct sockaddr *)&au; salen = sizeof au; break; default: assert(0 && "unknown address family"); } fl = fcntl(s, F_GETFL); if (fl != -1) fcntl(s, F_SETFL, fl | O_NONBLOCK); if ((connect(s, sa, salen)addrlen = sizeof(addr); if (getsockname(s->s, (struct sockaddr *)&addr, &addrlen) < 0) return 0; switch(addr.sin_family) { case AF_INET: *ip = ntohl(addr.sin_addr.s_addr); *port = ntohs(addr.sin_port); break; case AF_UNIX: /* * For a Unix socket, we return 0xFFFFFFFF for the IP address and * our current pid for the port. Bizarre, but such is life. */ *ip = ntohl(0xFFFFFFFF); *port = getpid(); break; /* XXX IPV6 */ default: return 0; } SockAddr platform_get_x11_unix_address(int displaynum, char **canonicalname) { SockAddr ret = snew(struct SockAddr_tag); int n; memset(ret, 0, sizeof *ret); ret->family = AF_UNIX; n = snprintf(ret->hostname, sizeof ret->hostname, "%s%d", X11_UNIX_PATH, displaynum); if(n < 0) ret->error = "snprintf failed"; else if(n >= sizeof ret->hostname) ret->error = "X11 UNIX name too long"; else *canonicalname = dupstr(ret->hostname); return ret; } Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1f4af7921a9ecfa6aa2682095e072824 Text-delta-base-sha1: b845ccd40ec107cafd7bd3cdbfd40d8c0ec83640 Text-content-length: 71 Text-content-md5: 21e64a3c3f79e941dba6daf5bfc98125 Text-content-sha1: 5a2e33a9977b5173bd874fe2820a655308e3c1bf Content-length: 110 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNt( 2`^const char platform_x11_best_transport[] = "unix"; Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a71fc06f5bd195a650eb9ea373751c44 Text-delta-base-sha1: 85ca58bf08344cb6c3ae3d3fd77eb9e0d842b1e3 Text-content-length: 76 Text-content-md5: 41abc695f6be863c81952510be9d7dd8 Text-content-sha1: 8ca1071f28860cd4a9a30665a9046032828b1a13 Content-length: 116 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN E 7@N>const char platform_x11_best_transport[] = "localhost"; Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d1f168cb4158d4a8134443d5e5ae9700 Text-delta-base-sha1: 572854f339bd73ff5438de8b918e5bbcf9e32de4 Text-content-length: 207 Text-content-md5: 96e993e1a383b94922f0da09bec39e3f Text-content-sha1: 579758d7d90d727af1012a2c4822aa873ea54d3b Content-length: 247 K 15 cvs2svn:cvs-rev V 4 1.57 PROPS-END SVNz{ 5zL9 SockAddr platform_get_x11_unix_address(int displaynummemset(ret, 0, sizeof(struct SockAddr_tag)); ret->error = "unix sockets not supported on this platform"; return ret; } Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 54b20d0da322c2813a9eeaa91098c92b Text-delta-base-sha1: 571e0a924ac56238067a3c3178135416bfe30445 Text-content-length: 1028 Text-content-md5: 879f0fecad9c69d84fb9c791bfe57a34 Text-content-sha1: 08f485c870c48bf4efdccd3c1fcabcfd1efbaa93 Content-length: 1068 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNcY}sut ,{}OH Find the right display, returns an allocated string */ char *x11_display(const char *display) { if(!display || !*display) if(!(display = getenv("DISPLAY"))) display = ":0"; if(display[0] == ':') { /* no transport specified, use whatever we think is best */ return dupcat(platform_x11_best_transport, display, (char *)0); } else return dupstr(display default display */ display = x11_display(display);assert(n != 0); /* x11_display() promises this */strncpy(host, display, n); host[n] = '\0'; sfree(display); if(!strcmp(host, "unix")) { /* use AF_UNIX sockets (doesn't make sense on all platforms) */ addr = platform_get_x11_unix_address(displaynum, &dummy_realhost); port = 0; /* to show we are not confused */ } else { port = 6000 + displaynum; /* * Try to find host. */ addr = name_lookup(host, port, &dummy_realhost, cfg); if ((err = sk_addr_error(addr)) != NULL) { sk_addr_free(addr); return err; } Revision-number: 4264 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:27.725123Z PROPS-END Revision-number: 4265 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:27.734960Z PROPS-END Revision-number: 4266 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2004-06-02T15:03:39.000000Z K 7 svn:log V 38 http://www.signal42.com/mirrors/putty K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 85f8fb5eece55a21ebc414a44d01a816 Text-delta-base-sha1: 5c6192da4bc0b496ae6a7023aab5b0d591d34407 Text-content-length: 66 Text-content-md5: 19bffd519e5386a8b59b975adc680c27 Text-content-sha1: f6f808ff8037687a51c8f1ac52fe46d11548d8c4 Content-length: 106 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVN )+Mj+www.signal42.com/mirrors/putty/">signal42 Revision-number: 4267 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:27.836146Z PROPS-END Revision-number: 4268 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:27.845769Z PROPS-END Revision-number: 4269 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:27.854851Z PROPS-END Revision-number: 4270 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2004-06-03T09:34:31.000000Z K 7 svn:log V 40 Summary: Port to Gtk+-2 toolkit on Unix K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/port-unix-gtk2 Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 353 Text-content-md5: 44a5996ed30929fa445d535a19713309 Text-content-sha1: 8b995c15b0cb5e7783e90f10a54d3360372aee56 Content-length: 469 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNSSSSummary: Port to Gtk+-2 toolkit on Unix Class: wish Difficulty: tricky Priority: low Currently, the Unix port of PuTTY uses the Gtk+-1.2 UI toolkit. It would be nice if it could also support Gtk+-2. We would require that the source still be compilable against Gtk+-1.2. Someone is working on this. <20040602051221.GA17584@dumbterm.net> Revision-number: 4271 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 71 Summary: Hooks to run external commands (e.g. after forwarding set up) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-06-03T09:38:14.000000Z PROPS-END Node-path: putty-wishlist/data/command-hooks Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 629 Text-content-md5: b068f7459fba5c96395dbe837a344fc2 Text-content-sha1: e899c490194c1845987b573420dc1601ba22351f Content-length: 745 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNgggSummary: Hooks to run external commands (e.g. after forwarding set up) Class: wish Difficulty: fun Priority: medium Content-type: text/x-html-body

    We occasionally get asked for the ability to run external commands at various points in PuTTY's operation. One particularly common request is for some way to invoke a command after authentication has completed and port forwarding has been set up, to start an application that's dependent on the forwarding being in place.

    Possibly an application for scripting, although many common cases wouldn't need that level of flexibility. Revision-number: 4272 Prop-content-length: 590 Content-length: 590 K 7 svn:log V 489 Spotted by Dimitry Andric: `ssh-termspeed' implementation was not taking account of coroutines and used local variables over a crFoo. I believe the impact was cosmetic, affecting the speeds reported in the Event Log only. I've put the variables `ispeed' and `ospeed' in the main ssh_tag structure, even though they're only live for a short duration; I did this rather than create a new state struct for ssh1_protocol() (since ssh_tag already has short-duration junk like portfwd_strptr). K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-06-03T10:36:27.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d1810602748f7c85dda7f7ce141ddd72 Text-delta-base-sha1: 26767234d7f913b58c913097815b34eb30a01c34 Text-content-length: 600 Text-content-md5: 38f72fea89a13742b94c13a8446528eb Text-content-sha1: 4485f9c6e7b0480e8f3a33aa80f396bb136471b8 Content-length: 641 K 15 cvs2svn:cvs-rev V 5 1.309 PROPS-END SVN$}YzP~ 8Dn}7sospeed, ispeed; /* temporaries */ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */ sscanf(ssh->cfg.termspeed, "%d,%d", &ssh->ospeed, &ssh->ssh->ispeed, /* TTY_OP_ISPEED */ PKT_CHAR, 193, PKT_INT, ssh->ssh->ospeed, ssh->%xVs[bZ= U, { char *cmd = ssh->cfg.remote_cmd_ptr; if (ssh->cfg.ssh_subsys && ssh->cfg.re ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */ sscanf(ssh->cfg.termspeed, "%d,%d", &ssh->ospeed, &ssh->ssh->ssh->ssh->ospeed, ssh-> Revision-number: 4273 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2004-06-05T16:32:13.000000Z K 7 svn:log V 19 putty.mirroria.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 19bffd519e5386a8b59b975adc680c27 Text-delta-base-sha1: f6f808ff8037687a51c8f1ac52fe46d11548d8c4 Text-content-length: 64 Text-content-md5: 182ce834a1d8467853c36fa5a79baf91 Text-content-sha1: b4abdc68f32dcd89a1fe0bf679991cf6c34e6cf7 Content-length: 104 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVN |'OJyputty.mirroria.net Revision-number: 4274 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2004-06-10T10:01:11.000000Z K 7 svn:log V 71 Explain that the configurable window title is only an initial setting. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ddaa816457765da9951f5125a3f9c0a Text-delta-base-sha1: 1e18c957851bb8d9f26142193e6b96e47af86dc8 Text-content-length: 260 Text-content-md5: 1820765139887f136ee1d588e8f18f61 Text-content-sha1: cffdf73f45ba6dcb710a71f7d7363f31c9ed0c5d Content-length: 300 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVN 2f6;+t\versionid $Id: config.but,v 1.81 2004/06/10 10:01:11 jacob (unless this is disabled - see \k{config-features-retitle}); the title string set here is therefore only the \e{initial} window title. As well as the \e{window} title, t Revision-number: 4275 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:28.906977Z PROPS-END Revision-number: 4276 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:28.918223Z PROPS-END Revision-number: 4277 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:28.928834Z PROPS-END Revision-number: 4278 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:28.938352Z PROPS-END Revision-number: 4279 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:28.947808Z PROPS-END Revision-number: 4280 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2004-06-14T18:59:09.000000Z K 7 svn:log V 16 hostgold.com.br K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 182ce834a1d8467853c36fa5a79baf91 Text-delta-base-sha1: b4abdc68f32dcd89a1fe0bf679991cf6c34e6cf7 Text-content-length: 83 Text-content-md5: 54d72359810232bc60a867b3f4bd8036 Text-content-sha1: 6c2a5b1622c94c0447c21af764d34f439fa5f1e8 Content-length: 123 K 15 cvs2svn:cvs-rev V 4 1.86 PROPS-END SVN|p9hA@nwww.hostgold.com.br/putty/">hostgold.com.br in Brazil Revision-number: 4281 Prop-content-length: 265 Content-length: 265 K 8 svn:date V 27 2004-06-15T09:50:05.000000Z K 7 svn:log V 164 `Authenticating with key' message when using a local key file in SSH2 was not contained within a test for FLAG_VERBOSE. Thanks to Paul Gotch for pointing this out. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 38f72fea89a13742b94c13a8446528eb Text-delta-base-sha1: 4485f9c6e7b0480e8f3a33aa80f396bb136471b8 Text-content-length: 199 Text-content-md5: af4e40d7160dc11683d892151befa9b5 Text-content-sha1: 0d1add8538a81bd9eeebf4cbf1559171f0f30610 Content-length: 240 K 15 cvs2svn:cvs-rev V 5 1.310 PROPS-END SVN#voif (flags & FLAG_VERBOSE) { c_write_str(ssh, "Authenticating with public key \""); c_write_str(ssh, comment); c_write_str(ssh, "\"\r\n"); } Revision-number: 4282 Prop-content-length: 162 Content-length: 162 K 7 svn:log V 62 Fix Halibut warnings about merging distinct-case index terms. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-06-15T10:17:03.000000Z PROPS-END Node-path: putty/doc/index.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b91890e20d63a9269bff31a539f4b2e4 Text-delta-base-sha1: 11bca0a7a4ce1655a18fe35f57c3afb09b81ed6d Text-content-length: 494 Text-content-md5: 78758467e8e60441d9f14f469523b89e Text-content-sha1: bc41dc08dff6f63dbd070c7359af91dde28b4a58 Content-length: 533 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNBr VV<-upper} \c{-L} command-line option \IM{-R-upper} \c{-R} command-line option \IM{-D-upper} \c{-D} command-line option \IM{-m} \c{-m} command-line option \IM{-P-upper} \c{-P} command-line option \IM{-pw} \c{-pw} command-line option \IM{-A-upper} \c{-A} command-line option \IM{-a} \c{-a} command-line option \IM{-X-upper} \c{-X} command-line option \IM{-x} \c{-x} command-line option \IM{-T-upper} \c{-T} command-line option \IM{-t} \c{-t} command-line option \IM{-C-upper Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2570b057ee8dd652d738de475c78dc72 Text-delta-base-sha1: 6157f5e763bd454058736758a4b1756eb4ee9428 Text-content-length: 245 Text-content-md5: bb908cf43b9b8736a5bd6a4858ce8531 Text-content-sha1: bd49487498541b66b78906ebfe4794409cee67e5 Content-length: 285 K 15 cvs2svn:cvs-rev V 4 1.23 PROPS-END SVNb216-:E]2l q,nU \versionid $Id: using.but,v 1.23 2004/06/15 10:17:03 jacobI{-L-upper}\c{-L}, \I{-R-upper}\c{-R} and \I{-D-upper}\c{-D}: set up I{-P-upper}I{-A-upper}I{-X-upper}I{-T-upper}I{-C-upper} Revision-number: 4283 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2004-06-15T10:38:04.000000Z K 7 svn:log V 24 Add index.but to build. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d9dd9018ecffd4729e88fcd67e20af59 Text-delta-base-sha1: f5fd71987baf76f46975761bce308561eb8c3cca Text-content-length: 36 Text-content-md5: fb4d9946af479b2ac3f0bcca9fbb3ae1 Text-content-sha1: 75442078cacc5ad52ccf6a6e84637ada1a540b0a Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN;MxDwCHAPTERS += index Revision-number: 4284 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 It's probably worth mentioning that SSH stands for `secure shell'. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-06-15T11:00:28.000000Z PROPS-END Node-path: putty/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 44d714d804d8ab389bb1246397fd7d76 Text-delta-base-sha1: 41966af068e21c73914922f142d521b417ac4a7a Text-content-length: 299 Text-content-md5: cdf635e6fdbb3178c685d6dc61747e23 Text-content-sha1: 59577871b45f5ab60a9addc931214af3a9bb9c09 Content-length: 338 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNG v9Y?`\versionid $Id: intro.but,v 1.6 2004/06/15 11:00:28 jacob(which stands for \q{\i{secure shell}}) is a recently designed, high-security protocol. It uses strong cryptography to protect your connection against eavesdropping, hijacking and other attacks. Telnet and Rlogin are Revision-number: 4285 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2004-06-15T11:11:19.000000Z K 7 svn:log V 103 Mention "beep using the PC speaker" on general principles (although there isn't much to say about it). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1820765139887f136ee1d588e8f18f61 Text-delta-base-sha1: cffdf73f45ba6dcb710a71f7d7363f31c9ed0c5d Text-content-length: 126 Text-content-md5: 0c6dc6aa947cd147cd2418f01f27f275 Text-content-sha1: a180d0217165b97c33d07d8dbb5f197c0418fadc Content-length: 166 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVN2ic5pB\versionid $Id: config.but,v 1.82 2004/06/15 11:11:19Beep using the PC speaker} is self-explanatory Revision-number: 4286 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2004-06-15T11:31:30.000000Z K 7 svn:log V 73 hide scrollbar - you can use more than just Shift+PgUp/Dn to scroll now. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0c6dc6aa947cd147cd2418f01f27f275 Text-delta-base-sha1: a180d0217165b97c33d07d8dbb5f197c0418fadc Text-content-length: 222 Text-content-md5: f2246875150b8cbf31dba2ad8acc1597 Text-content-sha1: ec0d1068d5936f4085fb1b0a304ec1aa47706bcf Content-length: 262 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVNi@\5 e\versionid $Id: config.but,v 1.83 2004/06/15 11:31:30the keyboard as described in \k{using-scrollback}). You can separately configure whether the scrollbar is shown in full-screen mode and in Revision-number: 4287 Prop-content-length: 305 Content-length: 305 K 8 svn:date V 27 2004-06-15T12:34:03.000000Z K 7 svn:log V 204 Now that Halibut automatically omits the filename part of hyperlinks when source and target are within the same file, faq.pl should avoid getting confused by having no work to do in fixing up such links! K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/faq.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 52e68c80225d87eff29c30ac4aa5e43d Text-delta-base-sha1: f08e8e12793e55af628dac8d42cb3f53cd751fb4 Text-content-length: 55 Text-content-md5: 3092ca712957b6b1b104ba1a3fcaa1cd Text-content-sha1: 3059cd09e6277c5dde66326808f61aacd24fc41e Content-length: 94 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNt$!=7/^#/ or s/^AppendixA.html// or Revision-number: 4288 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.585841Z PROPS-END Revision-number: 4289 Prop-content-length: 226 Content-length: 226 K 7 svn:log V 125 The Feedback script needed the same treatment as the FAQ script now that Halibut generates purely internal links. (untested) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-06-19T11:48:11.000000Z PROPS-END Node-path: putty-website/feedback.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1205c3b150e9aeb19f77d0ba0d2fc8ef Text-delta-base-sha1: ac111b18d304a055196c0da38832a5fe3465e680 Text-content-length: 27 Text-content-md5: eb008b504f9f1d7f6962c536c7390a7f Text-content-sha1: e5de0433b06236cef6f4c3840a761aa6811f2e54 Content-length: 66 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN\d X/^#/ or Revision-number: 4290 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.619137Z PROPS-END Revision-number: 4291 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.628920Z PROPS-END Revision-number: 4292 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.638324Z PROPS-END Revision-number: 4293 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.647413Z PROPS-END Revision-number: 4294 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.661093Z PROPS-END Revision-number: 4295 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.681129Z PROPS-END Revision-number: 4296 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.692866Z PROPS-END Revision-number: 4297 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.702401Z PROPS-END Revision-number: 4298 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.711430Z PROPS-END Revision-number: 4299 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.780090Z PROPS-END Revision-number: 4300 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.790140Z PROPS-END Revision-number: 4301 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.799398Z PROPS-END Revision-number: 4302 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.823798Z PROPS-END Revision-number: 4303 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.835441Z PROPS-END Revision-number: 4304 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.846966Z PROPS-END Revision-number: 4305 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:30.865805Z PROPS-END Revision-number: 4306 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2004-06-20T12:42:58.000000Z K 7 svn:log V 70 Administrivia: update links to FAQ/docs for new Halibut anchor syntax K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/config-locations Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 72956ef9777fca4c659435a04fa77d53 Text-delta-base-sha1: fb046a81bcb8ba6a1904612c31491d976c628428 Text-content-length: 69 Text-content-md5: 04615686357fad9848763f38f237a0be Text-content-sha1: 0964c75c57dcf2ddc6ffa99eaddf540c5e414da3 Content-length: 108 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN& 0Q www.tartarus.org/~simon/puttydoc/Chapter4.html#S Node-path: putty-wishlist/data/function-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 764cad5e1fd2492eef3c9d60571abcd2 Text-delta-base-sha1: 268140faf826be3e0411110b378ac75e47f9760c Text-content-length: 22 Text-content-md5: b7325938631305e85bb1ad88a92a2eec Text-content-sha1: 14aedb5ce55bda76c742393a35e4fa9b27776d3f Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN W)WQ Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ab0c1956883324695044ee2e7550d00a Text-delta-base-sha1: f02830973c1aec06b9ce2100e9a0d50458e72512 Text-content-length: 21 Text-content-md5: a859e4eb8c7eb4be1283ec71334a70d2 Text-content-sha1: 843d807018ce1de8ac61911cfefa57e0dea341ff Content-length: 60 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNwx [Q Node-path: putty-wishlist/data/pscp-multi-remote-src Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f8bf3e8d67c2a0b87f1319ab93a267d2 Text-delta-base-sha1: 94f9cbc0098e78ed1f3eaa4b8d5f9f4ec0911c5c Text-content-length: 22 Text-content-md5: 65aa4b9d8cc0ffdc9183d1b5d0728216 Text-content-sha1: 120d9813a0ebf400dd0648066dded2d183c3d983 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNXY x`xS Node-path: putty-wishlist/data/pubkeyfile-and-pageant Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 69ddba7b6c5201fb2a1ef265f490c1f8 Text-delta-base-sha1: dc84de4381759ae49a58fc9428b598ac9c96b87d Text-content-length: 22 Text-content-md5: d3f954100eee76e14e1c5169c302cf13 Text-content-sha1: 935390114bd00be2ef98805519dc3671507d203c Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN$% MWMS Node-path: putty-wishlist/data/remember-password Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 76c689ca7496ff0cdc90751218d21990 Text-delta-base-sha1: 0c0869fc9787905d4cdfae2a4b7fcd3f349885df Text-content-length: 33 Text-content-md5: 1998269872722af0e204986ac97fe5d2 Text-content-sha1: ada95ed32de2d1d7329db4aa0d03a5bf5cc48c7c Content-length: 72 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNQA.2.8">FAQ. Node-path: putty-wishlist/data/startup-fullscreen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7c8b45e51a41829bf588aff679e7282b Text-delta-base-sha1: eb30065255e7cc6089e71cab0e528eab6e326041 Text-content-length: 22 Text-content-md5: b1a7e8c770ddb3fa6dd3ac6cf89410d4 Text-content-sha1: dba54065b19ebdee95dbc46d3b3179f6a7620875 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNRS G GQ Node-path: putty-wishlist/data/term-reset-title Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 37179c8ed84634d938ba3856977343a4 Text-delta-base-sha1: 8bdcfd0c7b0ee2f7d5643440062c46d244f8b2d5 Text-content-length: 21 Text-content-md5: 46270dc63d2a07b570370b8ba0eeb34c Text-content-sha1: 74fadb7623d53bd0adb74bbef8f6efa7735e2b06 Content-length: 60 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN ~Q Node-path: putty-wishlist/data/unicode-mappings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 02e00675e173e47f7206259fbe0c2de8 Text-delta-base-sha1: 95546be38f5c8815d4fe3337f96bff91d7e19e59 Text-content-length: 25 Text-content-md5: 4538657af0972ca5dc2849093c75436f Text-content-sha1: ac039f1fd857f035611a002a0815f682e2de2b65 Content-length: 64 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNuv jmQA.8 Node-path: putty-wishlist/data/virtuallock Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 366fa4d5aa4bfe2ea7b1b9474b7842bb Text-delta-base-sha1: ca167cf83e785df43328489b4e6a2955323b9e27 Text-content-length: 22 Text-content-md5: d5671c6b190d43039b3d5cb1ab8b2e9f Text-content-sha1: aa9e600e0427e4c786455180b677e272ecdf3fb1 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN F=FQ Node-path: putty-wishlist/data/win-randseed-location Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b71489efd006dff1c49e18f4437c25c5 Text-delta-base-sha1: 9db0dab8deba0781b9795d8c3df9aa5441119ac8 Text-content-length: 22 Text-content-md5: 77b014f52d501995e36bfa912c3e77ef Text-content-sha1: 3f291f4f48d927f2629882affec4ca47d41502ae Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNGH sTsQ Revision-number: 4307 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:31.748751Z PROPS-END Revision-number: 4308 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:31.760195Z PROPS-END Revision-number: 4309 Prop-content-length: 589 Content-length: 589 K 8 svn:date V 27 2004-06-20T17:07:38.000000Z K 7 svn:log V 488 Add a configuration option for TCP keepalives (SO_KEEPALIVE), default off. No very good reason, but I've occasionally wanted to frob it to see if it makes any difference to problems I'm having, and it was easy. Tested that it does actually cause keepalives on Windows (with tcpdump); should also work on Unix. Not implemented on Mac (does nothing), but then neither is TCP_NODELAY. Quite a big checkin, much of which is adding `keepalive' alongside `nodelay' in network function calls. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a8633f37ea82e5b57f4e568910f4f67 Text-delta-base-sha1: 6029da2981484f7ed45dde2b36c7d70ce93a0c38 Text-content-length: 207 Text-content-md5: cc56d7cbfff4ebc447cf167c34547427 Text-content-sha1: 75724518e2cf1da8c1742508e42bd61b287634d3 Content-length: 247 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN,e3?3s9 ctrl_checkbox(s, "Enable TCP keepalives (SO_KEEPALIVE option)", 'p', HELPCTX(connection_tcpkeepalive), dlg_stdcheckbox_handler, I(offsetof(Config,tcp_keepalives Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f2246875150b8cbf31dba2ad8acc1597 Text-delta-base-sha1: ec0d1068d5936f4085fb1b0a304ec1aa47706bcf Text-content-length: 1158 Text-content-md5: 295a3ae50dfc7f7b22f427f3edb5a7aa Text-content-sha1: f24ffd9c7e0a8fe9a16337e32586705b20a323ee Content-length: 1198 K 15 cvs2svn:cvs-rev V 4 1.84 PROPS-END SVNEa95&nw|\versionid $Id: config.but,v 1.84 2004/06/20 17:07:36 (For an alternative, see \k{config-tcp-keepalives}.)S{config-tcp-keepalives} \q{Enable TCP keepalives} \cfg{winhelp-topic}{connection.tcpkeepalive} \e{NOTE:} TCP keepalives should not be confused with the application-level keepalives described in \k{config-keepalive}. If in doubt, you probably want application-level keepalives; TCP keepalives are provided for completeness. The idea of TCP keepalives is similar to application-level keepalives, and the same caveats apply. The main differences are: \b TCP keepalives are available on \e{all} connection types, including Raw and Rlogin. \b The interval between TCP keepalives is usually much longer, typically two hours; this is set by the operating system, and cannot be configured within PuTTY. \b If the operating system does not receive a response to a keepalive, it may send out more in quick succession and if terminate the connection if no response is received. TCP keepalives may be useful for ensuring that half-open connections are terminated than for keeping a connection alive. TCP keepalives are Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8e1894ef0cca04c8a2167677845f00c2 Text-delta-base-sha1: 2d2ef039c7251a563b1c3891a16a30c13bf2711f Text-content-length: 59 Text-content-md5: fdc448db6aff01eb3c85c2fcf457d8f5 Text-content-sha1: 351a4946c1c3c0cebb2a8f8a4693578728ad4169 Content-length: 98 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNh  ndsVint keepalivekeepalive, Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 27bbf0b104c4e47efd9493ee78789ffb Text-delta-base-sha1: b413686b51e642e068536de43cd5c0e81cfc981e Text-content-length: 104 Text-content-md5: 066c83bfd4d11ac88380ab56ffba49aa Text-content-sha1: 49d06d5c925d832d9080808797d49b13acf5a017 Content-length: 144 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVN{ OM2|/* $Id: macterm.c,v 1.76 2004/06/20 17:07:37 jacob, s->cfg.tcp_keepalives Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2dba353e94bf7bc0903da5708fc4600e Text-delta-base-sha1: faa3e6f67b1d8b82fa441d81b4caa12ed20c363f Text-content-length: 36 Text-content-md5: c03bdcff129501fe4805591e4067e5a5 Text-content-sha1: 76069f428705afa2c947ec975de03bd0a6820aed Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.21 PROPS-END SVN9H MnKint keepalive Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e36c12f5f1577222c10e13c56b12c6f4 Text-delta-base-sha1: 2f1a6eeca1c7ef41920f316ad8491b26edea3a2e Text-content-length: 51 Text-content-md5: abe09b8a9ff1549c8a8e9d99a0010e53 Text-content-sha1: b394304e1cf44afffe8c2178fe08fd63c24ee6e8 Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN!jhh7Pint keepalive, keepalive Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 275a303fefcb3432bb44ed88857cf406 Text-delta-base-sha1: a04a08c72b1f93091367bbc644d80f26300233d8 Text-content-length: 114 Text-content-md5: 91d2c1bedf333c4477341cfab3e34043 Text-content-sha1: 470f3f788865e06f17a46a4be15c0e5d16acbd7a Content-length: 154 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVN 8QJu}int keepalive, Plug plug,int keepalive, Plug plug,int keepalive Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a71690e7f9cb097888f51f308160430 Text-delta-base-sha1: f65bb5f8d43230aaf893405ff736ab124488c5e6 Text-content-length: 43 Text-content-md5: bcf907d45fd641e2208675cd9cab7d7b Text-content-sha1: 22513acece6a4fb71036ae4fff70adae97f38f72 Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVNn gg, cfg.tcp_keepalives Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 52ce5bdc2fb167d2b9169fb8fa3bfb15 Text-delta-base-sha1: 457a9640035f24c8e25bbf295722e3e5f5412d46 Text-content-length: 20 Text-content-md5: bf0f0648206d46d821daf95c2e4bd888 Text-content-sha1: b693c1c35b5167ad7d5e1b9061e3d91861b98b5b Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN W/T Node-path: putty/pproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 38a6163696c91bd6b729555ee8790c40 Text-delta-base-sha1: 6b65e3e49bb54847910c45ae0c6578dd2bb46824 Text-content-length: 54 Text-content-md5: c17c138c3ef9a5a1b29c30f3ac481d3c Text-content-sha1: 4060fa38e46f1c4ec2c88ec45f1c6056db49a70f Content-length: 93 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN##W)kint keepalive, Plug plug, Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fae3a080429b7b366312309093d61da2 Text-delta-base-sha1: 2596ad011d59dba49caabf1e9f3025302dd25edb Text-content-length: 112 Text-content-md5: 81ccd39dd37fd6d03aec0e8638214b34 Text-content-sha1: 1b3697937a4c72d81cdaffce384d15e854f2048e Content-length: 152 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNXFC_U 3d:int keepalive, Plug plug,keepalive, keepalivekeepalive Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2ee15f577a696f4d52b29da0d720a273 Text-delta-base-sha1: 46bb38ee9a8a8edcd836bde44edc0a53ec86a179 Text-content-length: 54 Text-content-md5: 26988c859b32f1df71aa216f441dce6a Text-content-sha1: dbbe2e0ce382b3de2a4e655b8f69f11b7140ceff Content-length: 94 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVN$ 2U3 0, cfg.tcp_keepalives Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 84290de541b47afc514e9b741ce0d146 Text-delta-base-sha1: 83dc87a9dd521ef86df3ffa59e862b82f8fd6c5e Text-content-length: 67 Text-content-md5: 5f15f10405f97bc7ef6f5b6200851004 Text-content-sha1: 89b25728978240359b3dd88ff44a191def589d38 Content-length: 108 K 15 cvs2svn:cvs-rev V 5 1.227 PROPS-END SVN 8%oHo\1, int keepaliveint tcp_keepalives Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f396c0980296aa6a1dacf34faf96565a Text-delta-base-sha1: 026f3d49709d4bbde449c7405fde785e7dd81538 Text-content-length: 59 Text-content-md5: f5ff96d6590374811cf75c81292f3cbf Text-content-sha1: 0202a05ab4242d996e5a8164b041b1f83e8dfac4 Content-length: 99 K 15 cvs2svn:cvs-rev V 4 1.50 PROPS-END SVNJk V5V@ , int keepalive keepalive Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7d94ae65aefcb33a4dfaf51bbeb09070 Text-delta-base-sha1: 89c81629f277bdb61d304548bbb6ecfb467bbe2a Text-content-length: 51 Text-content-md5: d44b3defc3bb7eeb4cc5ea4189ad31fe Text-content-sha1: 1b842f6c764b3de0d0d1ed6845293dd147d5de1a Content-length: 91 K 15 cvs2svn:cvs-rev V 4 1.46 PROPS-END SVN@ZzHz@, int keepalivekeepalive Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5f4b932916fa08f6e5bb515afd529db4 Text-delta-base-sha1: 77df1d37c089e238b84c570dc0f973f502793aa5 Text-content-length: 54 Text-content-md5: f348cbc28d0136e686f51dfb5a1524e0 Text-content-sha1: 9808b17f527aa5da7bf9eb78720ed84446fc4ef6 Content-length: 95 K 15 cvs2svn:cvs-rev V 5 1.121 PROPS-END SVN1N FjG 0, cfg.tcp_keepalives Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e1f4d5bd78109aa2b3ea767a6aedb82a Text-delta-base-sha1: 9a6701dffb3896463b54fb840129c4f175a33c60 Text-content-length: 127 Text-content-md5: 4b8d2d0f710c04879aa32104dc35e3fa Text-content-sha1: 1ae8667931d5ebf13a9836e6f5760054cca94002 Content-length: 168 K 15 cvs2svn:cvs-rev V 5 1.119 PROPS-END SVN12bze?ri(sesskey, "TCPKeepalives", cfg->tcp_keepalivesi(sesskey, "TCPKeepalives", 0, &cfg->tcp_keepalives Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: af4e40d7160dc11683d892151befa9b5 Text-delta-base-sha1: 0d1add8538a81bd9eeebf4cbf1559171f0f30610 Text-content-length: 147 Text-content-md5: 4700815c5ec71e2963605fb3c91d2bf1 Text-content-sha1: 506c85ebae888d15581a2a8a3c11ad96a6b3fe50 Content-length: 188 K 15 cvs2svn:cvs-rev V 5 1.311 PROPS-END SVN o lz, int keepalivekeepalive#^;,S,$ight back to that. */, int keepalive, keepalive Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: db7d2c3f810e4a1b794e36d0b568b965 Text-delta-base-sha1: aef3ec20263d295450e902c736f798f20dc859c4 Text-content-length: 56 Text-content-md5: 6f2c558a050966cbcb9e5abe7f744090 Text-content-sha1: fe4dedc9bf4544f603a0c2ddde5ada345318e385 Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN_y"+4, int keepalivekeepalive Node-path: putty/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4afc20fb3cfa0c6a61e7c9d599f6d5c5 Text-delta-base-sha1: 08c62a476177a62b3c4b7598d0c16c5d5c003642 Text-content-length: 122 Text-content-md5: f0bb1e79d7dad4d14157920f475afee8 Text-content-sha1: bb00866888e2249cd8a3a640e237249c75c2c145 Content-length: 162 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVNHSH0`tuP3E%x/* $Id: testback.c,v 1.10 2004/06/20 17:07:32 jacob,,, int keepalive, int keepalive Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cdbd55e18aac64ee4b4d90fe9a08a566 Text-delta-base-sha1: b6d982c49b1772ed2cd7138cc4a6fa17be100c94 Text-content-length: 56 Text-content-md5: 0656ef4886e40de7999656ec2988ac14 Text-content-sha1: 46b6411e9083a7825efb524c2f8f73ed807206ba Content-length: 97 K 15 cvs2svn:cvs-rev V 5 1.141 PROPS-END SVNt >6>, inst->cfg.tcp_keepalives Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5180774bd7bee79074f617f51aaa7413 Text-delta-base-sha1: c7c5b64821a7895b1722d8794d3dd076bab0a54f Text-content-length: 45 Text-content-md5: 44aacdf121108bfcf0a4e88888599904 Text-content-sha1: 09f1114af4e4dc1ee7746373d40f936bdfa43757 Content-length: 85 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN8N ~:~, int keepalive Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d2a453e852550596c7ba9633311fefeb Text-delta-base-sha1: 5960750fd76bf1a3cea68a032f515d7fd6f18a3a Text-content-length: 115 Text-content-md5: ee0a98b18814b32291cbd2e51e313e20 Text-content-sha1: 4249c8c87a387cc1a6dd517147fe3f5d98c81cfa Content-length: 155 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVNplTN}GK%int keepaliveif (keepalive) { int b = TRUE; setsockopt(s, SOL_SOCKET, SO_KEEPALIVE Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8f794789e35289f303a35c718c9f5f51 Text-delta-base-sha1: 025427a3097c2a2f0883a807b97448170a6d4bb2 Text-content-length: 43 Text-content-md5: 501f9de7c40f8b93db4f1729adba8862 Text-content-sha1: e34c4f5e608a96d78f41a821dded6d44a9921ec4 Content-length: 83 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN   , cfg.tcp_keepalives Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3bc33957aab1a964b7e2f428a69db9d7 Text-delta-base-sha1: 0f7f6c6cde52417039da0d722a0f9e23a83f5898 Text-content-length: 56 Text-content-md5: d76fac038f05f0a5ff449e0bc5fefcda Text-content-sha1: 3c384eba7aefa890006bb427fef50fb51b23e95c Content-length: 95 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN~ #i}int keepalive, Plug plug, Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fc702c04eac84f59a382f28029dc4770 Text-delta-base-sha1: fa348d81e9b96ae41a94ff4c32354bf09a370484 Text-content-length: 93 Text-content-md5: 4fd598838b8e4e7abbecc030a7efe2af Text-content-sha1: f2cfeb91f8feb1bded504e7f7e1a3836eac0ee4b Content-length: 134 K 15 cvs2svn:cvs-rev V 5 1.264 PROPS-END SVN LL, cfg.tcp_keepalivesttIN32_NT) { /* XXX 'ke Node-path: putty/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3a08da499161145b1e7b9f5e8864a4f1 Text-delta-base-sha1: 863a170a0c285d4ec7e7715cef1d295ef2e9f804 Text-content-length: 69 Text-content-md5: 4282dbce1235a5642d5c0fe32a2551c7 Text-content-sha1: e4e4ddc1e8cd07b95478a90f55897406aa6bc85a Content-length: 108 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN7} 02connection_tcpkeepalive "connection.tcpkeepalive Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 96e993e1a383b94922f0da09bec39e3f Text-delta-base-sha1: 579758d7d90d727af1012a2c4822aa873ea54d3b Text-content-length: 120 Text-content-md5: e4e38db1d3d9d432e7909b86356e9e69 Text-content-sha1: 3dee1b618018d5173f0abd3870d48f45a5fc23f9 Content-length: 160 K 15 cvs2svn:cvs-rev V 4 1.58 PROPS-END SVN{zW,v*Jzint keepaliveif (keepalive) { BOOL b = TRUE; p_setsockopt(s, SOL_SOCKET, SO_KEEPALIVE Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 879f0fecad9c69d84fb9c791bfe57a34 Text-delta-base-sha1: 08f485c870c48bf4efdccd3c1fcabcfd1efbaa93 Text-content-length: 20 Text-content-md5: 0a77fa2d90742094996e326396972ef2 Text-content-sha1: 07c1f53476f34cf3d0ae8ad663a3cd2fecfe7e5b Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNcf ssp Revision-number: 4310 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2004-06-20T17:11:06.000000Z K 7 svn:log V 26 *** empty log message *** K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/tcp-keepalives Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 295 Text-content-md5: ef9931ce11b2a20872cc397eb524682e Text-content-sha1: c1991d5324d83a8d9e185fe4c9db5ec1e2e9b9d7 Content-length: 411 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: Ability to enable TCP keepalives Class: wish Difficulty: fun Priority: low Fixed-in: 2004-06-21 It might be nice to have an option to enable TCP keepalives (SO_KEEPALIVE), as distinct from the application-level keepalives that are already implemented for Telnet and SSH. Revision-number: 4311 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:32.373906Z PROPS-END Revision-number: 4312 Prop-content-length: 107 Content-length: 107 K 8 svn:date V 27 2004-06-27T11:04:39.000000Z K 7 svn:log V 8 grammer K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 295a3ae50dfc7f7b22f427f3edb5a7aa Text-delta-base-sha1: f24ffd9c7e0a8fe9a16337e32586705b20a323ee Text-content-length: 83 Text-content-md5: 217b469eaad3f5bc183a47df4587bfcc Text-content-sha1: 29ca8fe088818b1fba31b1c139dc0183b50735b1 Content-length: 123 K 15 cvs2svn:cvs-rev V 4 1.85 PROPS-END SVNEJ85}H\versionid $Id: config.but,v 1.85 2004/06/27 11:04:39mor Revision-number: 4313 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:32.588934Z PROPS-END Revision-number: 4314 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:32.597559Z PROPS-END Revision-number: 4315 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:32.606507Z PROPS-END Revision-number: 4316 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:32.615762Z PROPS-END Revision-number: 4317 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:32.625989Z PROPS-END Revision-number: 4318 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2004-06-28T09:19:15.000000Z K 7 svn:log V 61 For the last time, we don't want to implement port knocking! K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/port-knocking Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3029 Text-content-md5: b45687d0851c92f0404856a40d10bc73 Text-content-sha1: 6340bf0cf7de2d3e7b912d982e307c86be66c751 Content-length: 3145 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNGGGSummary: Port knocking Class: wish Priority: never Difficulty: tricky Content-type: text/x-html-body

    We have been asked several times to implement Port Knocking: a mechanism for making a running service appear to be a connection-refusing closed port unless the right sequence of "knocks" (attempted connections to genuinely closed ports) is received before the connection attempt.

    The PuTTY team is collectively unconvinced that this is a good idea. For a start, it's not universally usable, because many firewalls won't let the knocks through. (Obviously the firewall at the server end is precisely what will need to be specifically listening out for the knock, but firewalls at the client end or in between are likely to cause a lot more trouble. And in particular, if you're connecting through an SSH tunnel, you'll have a hard time sending a knock.) Also, since the knock is effectively sent in cleartext, it doesn't buy you a great deal of security - the only real gain is that your service appears to be a closed port to anyone doing a port scan, and although that might have advantages it might also cause administrators to become more relaxed about the real security of their service. It seems like a lot of effort for very little gain.

    Much more importantly, though, we don't like the idea of this mechanism having to be implemented separately in every network client program - particularly given the hints on the port knocking website that more inventive forms of knock may be developed in future, which would of course mean we'd have to keep up with development. To implement and maintain this in PuTTY and all other network utilities would be a huge amount of effort.

    If this is to be done at all, it should be done in a largely client-independent manner. For example:

    • On Unix, you could construct a dynamic library which replaced the connect(2) system call, and use LD_PRELOAD to apply it to almost any application.
    • Also on Unix, you could write a small command-line application which performed the port knock and then made the connection (a port-knocking enabled equivalent of nc(1)), and then invoke that using the "Local" proxy setting in PuTTY. At some point we would like to implement this proxy setting in Windows PuTTY as well (see proxy-command), and at that point this solution will be applicable to Windows as well.
    • On either (or both) of Windows or Unix, you could write a SOCKS server which performed appropriate port knocks before proxying any given connection, and point PuTTY at it using the existing SOCKS proxy support.

    If anyone really wants to see this feature in PuTTY, they should probably look into one of the above options. The most universally applicable solution without needing to change PuTTY at all would be the SOCKS server approach. Revision-number: 4319 Prop-content-length: 311 Content-length: 311 K 8 svn:date V 27 2004-06-28T09:24:40.000000Z K 7 svn:log V 210 Ahem. I didn't realise that the `GNU Netcat' page was a _replacement_ for the standard nc(1), not the thing itself. Changed link to point at the original, at least until I hear that the GNU one is worth using. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/port-knocking Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: b45687d0851c92f0404856a40d10bc73 Text-delta-base-sha1: 6340bf0cf7de2d3e7b912d982e307c86be66c751 Text-content-length: 69 Text-content-md5: c2e9b8210e835d0d1b45d3583c98f040 Text-content-sha1: feeca4be107a9e8ba995d1f4948d4906f7e0efa9 Content-length: 108 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNGa 0?rUwww.atstake.com/research/tools/network_utilities Revision-number: 4320 Prop-content-length: 222 Content-length: 222 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-07-02T09:12:04.000000Z K 7 svn:log V 121 REJS's moon-on-stick.jpg now gives `403 Forbidden', unfortunately. I've GIMPed up a replacement and redirected the link. PROPS-END Node-path: putty-wishlist/data/moon-on-stick Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 48100ba34e1a68d0b3d50ec4a82ccec7 Text-delta-base-sha1: dc000d8ea22a9c121ac1daf0ffdc483db05f287b Text-content-length: 70 Text-content-md5: 17e413c3ea76c34ba0f50e24d3110cc8 Text-content-sha1: 2ae5b3964454a9fd771121df598e74a3c40888ff Content-length: 109 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNLP3 ?.chiark.greenend.org.uk/~sgtatham/moon-on-stick.jpe Revision-number: 4321 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:32.995566Z PROPS-END Revision-number: 4322 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:33.004969Z PROPS-END Revision-number: 4323 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:33.014448Z PROPS-END Revision-number: 4324 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:33.023724Z PROPS-END Revision-number: 4325 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:33.033477Z PROPS-END Revision-number: 4326 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:33.042365Z PROPS-END Revision-number: 4327 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:33.051665Z PROPS-END Revision-number: 4328 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:33.060804Z PROPS-END Revision-number: 4329 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:33.069902Z PROPS-END Revision-number: 4330 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:33.079449Z PROPS-END Revision-number: 4331 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2004-07-17T16:16:20.000000Z K 7 svn:log V 65 HTMLify. Include the Solaris patch since it seems to be popular. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 53428b2360eef21504fc40a42850638d Text-delta-base-sha1: 13f1e796f385495b122027dbc379125bd4702b4e Text-content-length: 2027 Text-content-md5: 4f9d5e3f78d334220dd2859d665d0bfb Text-content-sha1: 37001c1052f08ae345cccf9f87320a3b6eb3ab96 Content-length: 2066 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN YFYContent-type: text/x-html-body

    People occasionally send us patches to make the Unix port more portable.

    We should probably work out a mechanism for dealing with Unix portability. autoconf seems likely.

    Here are some of the patches we've received:

    • FreeBSD 4.7-STABLE
      wwvn0lvct6s.fsf@rjk.greenend.org.uk
    • FreeBSD 5.1
      20031029224803.GK30375@earth.li
    • NetBSD with gcc-3.x
      20031126022610.GA13294@babymeat.com
    • FreeBSD-5.2-RELEASE
      1075418510.724.16.camel@localhost
      20040213160319.GA565@scimitar.noc.nl.demon.net (with commentary)
    • Solaris
      20040217181156.GM17353@granzeau.com - see below
    • Mac OS X
      dhbecker-0uHkTAZ3waS4IzZ253W5cgjfAlrQMYu@mailblocks.com
    • Apparently PuTTY is now in the FreeBSD ports tree.

    Solaris patch (for use with GNU tools) follows:
    diff -c unixold/Makefile.gtk unix/Makefile.gtk
    *** unixold/Makefile.gtk        Thu Feb 12 12:43:43 2004
    --- unix/Makefile.gtk   Tue Feb 17 12:11:31 2004
    ***************
    *** 83,88 ****
    --- 83,90 ----
      CFLAGS = -O2 -Wall -Werror -g -I. -I.. -I../charset `gtk-config --cflags`
      XLDFLAGS = `gtk-config --libs`
      ULDFLAGS =#
    + # Uncomment for Solaris
    + # ULDFLAGS = -lsocket -lnsl
      INSTALL=install
      INSTALL_PROGRAM=$(INSTALL)
      INSTALL_DATA=$(INSTALL)
    diff -c unixold/uxnet.c unix/uxnet.c
    *** unixold/uxnet.c     Tue Feb  3 08:47:43 2004
    --- unix/uxnet.c        Tue Feb 17 12:10:58 2004
    ***************
    *** 15,20 ****
    --- 15,28 ----
      #include <netinet/in.h>
      #include <netinet/tcp.h>
      #include <netdb.h>
    + /* This is a hack for solaris, it keeps SIOCATMARK here. */
    + #ifndef SIOCATMARK
    + #include <sys/sockio.h>
    + #endif
    + /* For Unix flavors that don't define INADDR_NONE */
    + #ifndef INADDR_NONE
    + #define       INADDR_NONE     0xffffffff
    + #endif
    
      #define DEFINE_PLUG_METHOD_MACROS
      #include "putty.h"
    **************
    Revision-number: 4332 Prop-content-length: 253 Content-length: 253 K 8 svn:date V 27 2004-07-20T12:05:18.000000Z K 7 svn:log V 152 Summary: Reports of port forwarding corruption Class: bug Grab bag for all reports of corruption we've had so we can attempt to find some commonality. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-corrupt Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2504 Text-content-md5: f0fde8d2b700c7a3faaf9764f2361cb2 Text-content-sha1: 2ea0533efdd23aa47df3e7cab9a74ef2fb995c92 Content-length: 2620 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN:::Summary: Reports of port forwarding corruption Class: bug Present-in: 0.53b 2003-06-29 0.54 Content-type: text/x-html-body

    We've had several reports of data corruption in port-forwarded connections. Some (possibly all) of these are due to data loss. The PuTTY client (as opposed to others) appears to be correlated with the data loss, although it's unclear whether the data is actually being lost before or after PuTTY is dealing with it.

    Problems have been reported with both directions of tunneling, both directions of data transfer, and both SSH protocols (SSH-1 and SSH-2).

    The reports below may correspond to several different bugs, as a range of symptoms are reported.

    • 2821c598.0306222343.8ea8a79@posting.google.com
      (also 3F031766.BC09B85A@uni-mb.si)
      Server: SSH-1.5-OSU_1.4alpha3 on OpenVMS V7.3-1
      Protocol: SSH-1
      local-to-remote tunnel of POP3/SMTP
      Problems with sending messages (dialogue or attachments corrupted)
      Apparently the first port-forwarded connection in a session will lose some quantity of the data sent from PuTTY to the server from the start of the connection.
      SSH packet log makes it look like data is being lost by the server (or possibly after PuTTY does the logging), but other clients (e.g., OpenSSH, recent F-Secure) don't show this behaviour.
    • 20040209143157.89534.qmail@web14102.mail.yahoo.com
      0.53b + (2004-02-02?) + (2004-02-09?)
      Various Red Hat 7.x servers. One is SSH-1.99-OpenSSH_3.1p1.
      Protocol: SSH-1 and SSH-2
      HTTP tunnel (local-to-remote?)
      Result of GET truncated (incomplete)?
      Looks to be correlated with slow consumer (web browser)
      Same person has same problem with TeraTerm SSH ("Error 10058: Cannot send after socket shutdown.").
      PuTTY sometimes hangs?
      Includes SSH packet log; this shows SSH-2 local-to-remote forwarding, with PuTTY apparently receiving all the data. Maybe it fails to pass it on to the HTTP client?
    • 002101c45ee8$ff761990$6801a8c0@carmani600m
      "SMTP tunneling corrupts attachments" -- no other info
    • 1090249727.4682.55.camel@oberon.tremagi.org.uk
      Win2KSP3 + PuTTY 0.54 (and 0.53b)
      Fedora Core 2 (unpatched) + OpenSSH (openssh-server-3.6.1p2-34)
      Remote tunnel for "yum" over HTTP: "yum" pulling data (i.e. outbound from PuTTY)
    Revision-number: 4333 Prop-content-length: 119 Content-length: 119 K 7 svn:log V 19 add Priority: high K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-20T13:31:18.000000Z PROPS-END Node-path: putty-wishlist/data/portfwd-corrupt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f0fde8d2b700c7a3faaf9764f2361cb2 Text-delta-base-sha1: 2ea0533efdd23aa47df3e7cab9a74ef2fb995c92 Text-content-length: 33 Text-content-md5: 9ae2741600ec6f40e8a8f1c1ee8b360b Text-content-sha1: 0860c2a29d2c1e067456d097fb87bc8d79def925 Content-length: 72 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN:I\_[Priority: high Revision-number: 4334 Prop-content-length: 116 Content-length: 116 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-20T14:14:01.000000Z K 7 svn:log V 16 putty.mirror.fr PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 54d72359810232bc60a867b3f4bd8036 Text-delta-base-sha1: 6c2a5b1622c94c0447c21af764d34f439fa5f1e8 Text-content-length: 60 Text-content-md5: a86133797899b3b65003860bd4d5d67e Text-content-sha1: 287c56dcbdcfec2605750dbb790acd6c0a1c9533 Content-length: 100 K 15 cvs2svn:cvs-rev V 4 1.87 PROPS-END SVNp_!dNy dputty.mirror.fr/">putty.mirror.fr Revision-number: 4335 Prop-content-length: 117 Content-length: 117 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-20T15:24:47.000000Z K 7 svn:log V 17 Mention WinSize. PROPS-END Node-path: putty-wishlist/data/control-window-pos Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aed0e2bcafc1d8e1d0de6552a80e700c Text-delta-base-sha1: 2d68173e5183a423a4accf5f02c33583c8e66cd2 Text-content-length: 193 Text-content-md5: 379d356544472cfbd763df80d13249d3 Text-content-sha1: 2f661b6bdc14ccf177783e46a6b37e064b828b98 Content-length: 232 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN )/)'`daimi.au.dk/~maxx/maxximum-windows.html#WS">WinSize (free, at least as in beer); another is ZMover (shareware); yet Revision-number: 4336 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2004-07-20T15:30:51.000000Z K 7 svn:log V 41 Mention the dangers of the "-pw" option. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/man-pl.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7628de1d2466cedea0dad3b08f626159 Text-delta-base-sha1: c9bc3eedc19c37cf3d7b167df3c36605e77d7217 Text-content-length: 147 Text-content-md5: d3532a635a2a59d4a95d09a245880d68 Text-content-sha1: 0cc9679ee1da80e9bcc591eb7c133078111c7c97 Content-length: 186 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN1/ }/}. \e{CAUTION:} this will likely make the password visible to other users of the local machine (via commands such as \q{\c{w}}) Node-path: putty/doc/man-pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 5286618c3d20f8614f230655316b2d20 Text-delta-base-sha1: a62721e10ebe0aee95149ef410e31e5d1978c744 Text-content-length: 147 Text-content-md5: 4cd4b29d3861b5f9b5615e624f3395ab Text-content-sha1: 62d44cd1a8663332f290a88e68b4ba4a6a979586 Content-length: 186 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNDB } }< \e{CAUTION:} this will likely make the password visible to other users of the local machine (via commands such as \q{\c{w}}) Node-path: putty/doc/man-psft.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8c5a488815178af270a4d1951b81d043 Text-delta-base-sha1: 4a49bf569f89207c45ea02e37ea35d903dc64ecd Text-content-length: 147 Text-content-md5: 9f2cc24863a8872b3924c85a5ab835dd Text-content-sha1: 7ffb34a71b3de3dc9a40c75541c5b0de2a75b655 Content-length: 186 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN }V}-U \e{CAUTION:} this will likely make the password visible to other users of the local machine (via commands such as \q{\c{w}}) Revision-number: 4337 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2004-07-20T15:34:39.000000Z K 7 svn:log V 26 Limitations of -m option. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bb908cf43b9b8736a5bd6a4858ce8531 Text-delta-base-sha1: bd49487498541b66b78906ebfe4794409cee67e5 Text-content-length: 219 Text-content-md5: e528d55789148732058e43ef28c803ab Text-content-sha1: c096448b2743319bcb3c68463270256acae16ddb Content-length: 259 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN2&9s4Mz-\versionid $Id: using.but,v 1.24 2004/07/20 15:34:39; but this will not work on all servers (and is known not to work with certain \q{embedded} servers such as routers). This option is Revision-number: 4338 Prop-content-length: 230 Content-length: 230 K 8 svn:date V 27 2004-07-20T20:13:25.000000Z K 7 svn:log V 129 We shouldn't reference off the end of the display line when checking for UCSWIDE. Thanks Jacob, for catching this with valgrind. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e2e1fc700bf9b40b034da161dc017469 Text-delta-base-sha1: f4506679424ce9aea32e84152d122804d5ce196e Text-content-length: 110 Text-content-md5: 1da05c8bb930ceeb4e0cca4d82d58aa3 Text-content-sha1: ce4aeaf3327ad59eb4c01e4188ee7500c7518c2c Content-length: 151 K 15 cvs2svn:cvs-rev V 5 1.166 PROPS-END SVN,> E"EWUj < term->cols-1 && (d[1] & (CHAR_MASK | CSET_MASK)) == UCSWIDE) Revision-number: 4339 Prop-content-length: 234 Content-length: 234 K 8 svn:date V 27 2004-07-20T23:42:01.000000Z K 7 svn:log V 133 Another report. Upgrade to "bug" (since PuTTY crashes and generally misbehaves, and the server isn't doing anything obviously wrong) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-kex-packet Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 212eb5cb935a26d7fe849cb250e1ea6f Text-delta-base-sha1: 063210f97c84638a5f206cfb769a23f7fa0fc4c7 Text-content-length: 492 Text-content-md5: 81c6a8fc880eac8e9cbe69fbeed57a69 Text-content-sha1: 927ad28fa79d455c05000732263fad78e0244713 Content-length: 531 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNNKJxIh@AYClass: bug (so could be a GUI concurrency problem due to the blocking caused by the host key verification dialog?) log: ixion:~jacob/putty-wishlist/data-mine/unix-kex-packet.d/putty.log protocol looks fine 1090364295.14285.12.camel@scrat.iceage server is SSH-2.0-3.2.5 SSH Secure Shell using diffie-hellman-group1-sha1 SSH packet log attached - protocol looks fine (although it has extra IGNORE messages interspersed, unlike previous) Revision-number: 4340 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2004-07-20T23:45:35.000000Z K 7 svn:log V 19 Detail workaround. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-kex-packet Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 81c6a8fc880eac8e9cbe69fbeed57a69 Text-delta-base-sha1: 927ad28fa79d455c05000732263fad78e0244713 Text-content-length: 211 Text-content-md5: 4c0eb39825e8a1395cf958dedc355ba8 Text-content-sha1: b0b035a0dadf74edd3211148e29b590a98ca91aa Content-length: 250 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNN ;7;5Workaround: add the host key to the database first. (Apparently this can be done by setting "close window on exit" to "never" in the first session, or use contrib/kh2reg.py in PuTTY CVS.) Revision-number: 4341 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2004-07-20T23:51:14.000000Z K 7 svn:log V 15 More thoughts. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-kex-packet Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4c0eb39825e8a1395cf958dedc355ba8 Text-delta-base-sha1: b0b035a0dadf74edd3211148e29b590a98ca91aa Text-content-length: 269 Text-content-md5: 78043d32d95fd3af033bc042890c8ae6 Text-content-sha1: e776a02070919311af2ae08617c1d5cc4f93b07c Content-length: 308 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN  u8uV5hat might be special about these connections is that the server sends NEWKEYS immediately after sending KEXDH_REPLY, whereas (say) OpenSSH appears to wait for the client to send NEWKEYS before sending its NEWKEYS. (Based on PuTTY's packet logs.) Revision-number: 4342 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2004-07-21T14:41:58.000000Z K 7 svn:log V 48 More details of what we see in SSH packet logs. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-kex-packet Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 78043d32d95fd3af033bc042890c8ae6 Text-delta-base-sha1: e776a02070919311af2ae08617c1d5cc4f93b07c Text-content-length: 955 Text-content-md5: 59fad5931dece7efb89624a9c06b3308 Text-content-sha1: 140b48a16d6a486ad20404bd0978efddac70a407 Content-length: 994 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN+8<0jIn PuTTY's SSH packet log, what appears to distinguish failing from successful connections is that in the latter, PuTTY logs sending a NEWKEYS before logging receiving one, whereas in the former, it doesn't log sending one at all. So in Windows and Unix-plink connections with and without the host key prompt, and Unix PuTTY without the prompt, we get something like Incoming packet type 31 / 0x1f (SSH2_MSG_KEXDH_REPLY) [...] Event Log: Host key fingerprint is: Event Log: ssh-dss 1024 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx Outgoing packet type 21 / 0x15 (SSH2_MSG_NEWKEYS) Incoming packet type 21 / 0x15 (SSH2_MSG_NEWKEYS) whereas in Unix PuTTY with the prompt, we have Incoming packet type 31 / 0x1f (SSH2_MSG_KEXDH_REPLY) [...] Incoming packet type 21 / 0x15 (SSH2_MSG_NEWKEYS) Event Log: expected key exchange reply packet from server while waiting for the user to respond to the prompt. Revision-number: 4343 Prop-content-length: 104 Content-length: 104 K 8 svn:date V 27 2004-07-21T21:39:55.000000Z K 7 svn:log V 5 typo K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/large-files Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2b59776aff950220bdec57492343b53e Text-delta-base-sha1: 254cc8569f97aa223ce10579780142dec1df01f9 Text-content-length: 21 Text-content-md5: a256a67d9bc5e04ce3bf1188e2c9797b Text-content-sha1: ba799852321aeddd31ef0afb210f3c7e5da67d76 Content-length: 60 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNjj xqyt Revision-number: 4344 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2004-07-22T11:18:08.000000Z K 7 svn:log V 46 Mention bps units of terminal speeds (FWLIW). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 217b469eaad3f5bc183a47df4587bfcc Text-delta-base-sha1: 29ca8fe088818b1fba31b1c139dc0183b50735b1 Text-content-length: 196 Text-content-md5: c85ecaa034a89ee4de9b061c4bc652e6 Text-content-sha1: 6585b9659bf8cea0171e458456d8eb97322d8b14 Content-length: 236 K 15 cvs2svn:cvs-rev V 4 1.86 PROPS-END SVNJ]'?5rwS\versionid $Id: config.but,v 1.86 2004/07/22 11:18:08 in bits per second, and the second is the input speed (\e{to} the server). (Only the first is used in the Rlogin Revision-number: 4345 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2004-07-22T12:38:37.000000Z K 7 svn:log V 86 Add a section on the errors you see when you attempt to load a key of the wrong type. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e10449cf75010b16bd81fb5c8dea2999 Text-delta-base-sha1: 36f280b760447984eed84ae57400092925c8196c Text-content-length: 939 Text-content-md5: 44c1f3b9194ceb9eba4b3fcd410380ec Text-content-sha1: ddf1519bb0f3a92b1e609d99fffa9a656c69ca00 Content-length: 978 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNo :q{7aQD\versionid $Id: errors.but,v 1.9 2004/07/22 12:38:37 jacobkey-wrong-format} \q{Unable to use this private key file}, \q{Couldn't load private key}, \q{Key is of wrong typewhen trying public-key authentication, or given by Pageant when trying to load a private key. If you see one of these messages, it often indicates that you've tried to load a key of an inappropriate type into PuTTY, Plink, PSCP, PSFTP, or Pageant. You may have specified a key that's inappropriate for the connection you're making. The SSH-1 and SSH-2 protocols require different private key formats, and a SSH-1 key can't be used for a SSH-2 connection (or vice versa). Alternatively, you may have tried to load an SSH-2 key in a \q{foreign} format (OpenSSH or \cw{ssh.com}) directly into one of the PuTTY tools, in which case you need to import it into PuTTY's native format (\c{*.PPK}) using PuTTYgen - see \k{puttygen-conversions} Revision-number: 4346 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2004-07-24T12:37:42.000000Z K 7 svn:log V 106 In faq-bce, mention that the non-immediate effect of changing BCE only applies to versions prior to 0.54. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4ff0f3f71f212a8f1361399edf798c74 Text-delta-base-sha1: 848ea8196d406f1ce274c04832b312163f02ce95 Text-content-length: 145 Text-content-md5: 431ae329bef95c53a4e59db5488bbcd3 Text-content-sha1: 901fd9f3450b60c231f7e4fecb9f07376af399aa Content-length: 185 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNfu2Cuq\versionid $Id: faq.but,v 1.72 2004/07/24 12:37:42n versions before 0.54, it may not take effect until you reset the Revision-number: 4347 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 35 Update with current state of play. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-24T15:34:19.000000Z PROPS-END Node-path: putty-wishlist/data/ssh2-kex-data Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9dcdfde69e1ee4dded2c644b83d57bdd Text-delta-base-sha1: 1245e4a0fbee2e80f5c05fab9c70b30a01be77ea Text-content-length: 1376 Text-content-md5: 40ac43c57dc31307b61d4a5141253463 Text-content-sha1: 46be9879b352cbd94aaf78aa94856477044e6c1f Content-length: 1415 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN! @ {jEj7

    In the current SSH-2 protocol drafts, it's not entirely clear to all readers what happens to the connection layer while the transport layer is in a key exchange phase, so it isn't clear from there what PuTTY should do in this situation. A

  • Thread 'Data transfer during key re-exchange' starting 25 Jun 2004

    The consensus seems have settled on the proposal above, and having any nonblocking rekey as a protocol extension (see for instance message <200310192351.h9JNpxAx004282@thunk.east.sun.com>), so we don't now have much excuse for not implementing that; but as of version -18 of the transport draft no change has been made to the actual documents. (See the current version of a proposed change to the language to make this clearer.)

    People have also muttered about the receiving end continuing to accept data encrypted using the "old" context; perhaps we'd want to keep an eye on how much data the other end tried to encrypt with a given context and close the connection if in our opinion it was too much. (Although this would be rather rude if we didn't request a rekey first in plenty of time.) Revision-number: 4348 Prop-content-length: 115 Content-length: 115 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-24T15:47:05.000000Z K 7 svn:log V 15 fix broken URL PROPS-END Node-path: putty-wishlist/data/ssh2-kex-data Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 40ac43c57dc31307b61d4a5141253463 Text-delta-base-sha1: 46be9879b352cbd94aaf78aa94856477044e6c1f Text-content-length: 20 Text-content-md5: 567ccda833e83093ff150e831dede1c6 Text-content-sha1: 203fc9ee052549bed03d57cffd916567be65cf83 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN   Revision-number: 4349 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2004-07-24T19:25:49.000000Z K 7 svn:log V 68 Comment explaining `need_save' argument to cmdline_process_param(). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 50139411975c19f8f7cd70042bac758d Text-delta-base-sha1: 8657cb544590a30cfa421920951d552909c13fba Text-content-length: 373 Text-content-md5: a4b7baf4c749b9c0f5fb1da50f6913ab Text-content-sha1: 425d10e32fa231adabecedb4b1d670974d0b094c Content-length: 413 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN* ]J]dFIf `need_save' is 1, arguments which need to be saved as * described at this top of this file are, for later execution; * if 0, they are processed normally. (-1 is a special value used * by pterm to count arguments for a preliminary pass through the * argument list; it causes immediate return with an appropriate * value with no action taken.) Revision-number: 4350 Prop-content-length: 276 Content-length: 276 K 8 svn:date V 27 2004-07-25T12:12:53.000000Z K 7 svn:log V 175 Text around -load option "(although Plink still requires an explicitly specified host name)" didn't appear to actually be true any more (see `cmdline-host-override'). Removed K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e528d55789148732058e43ef28c803ab Text-delta-base-sha1: c096448b2743319bcb3c68463270256acae16ddb Text-content-length: 77 Text-content-md5: aef9e3234e373e3f7da435182604299f Text-content-sha1: 66f08e46f7dafb71e775284f15c3181899df73e9 Content-length: 117 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN&d 4P4`F\versionid $Id: using.but,v 1.25 2004/07/25 12:12:53 Revision-number: 4351 Prop-content-length: 269 Content-length: 269 K 7 svn:log V 168 Summary: PSFTP and PSCP ignore the -load option Present-in: 0.54 2004-07-21 (I had thought that this might cover `psftp-load-ignores-proxy', but now I'm not so sure.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-25T13:57:14.000000Z PROPS-END Node-path: putty-wishlist/data/psftp-pscp-ignore-load Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 403 Text-content-md5: 7881c63c7a05e4e29c15c8183afea86c Text-content-sha1: a9e9213078312691ea6aa4c40b3002e0fd9218ca Content-length: 519 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNSummary: PSFTP and PSCP ignore the -load option Class: bug Difficulty: fun Priority: high Present-in: 0.54 2004-07-21 Content-type: text/x-html-body

    The PSFTP and PSCP tools more or less entirely ignore the -load session option.

    They unconditionally clobber the loaded details with do_defaults(), either from another session or Default Settings. Revision-number: 4352 Prop-content-length: 1001 Content-length: 1001 K 7 svn:log V 900 Fix for `psftp-pscp-ignore-load': Default Settings is now loaded before "-load" is processed so that it doesn't clobber it. I've also changed the semantics of "-load" slightly for PSCP, PSFTP, and Plink: if it's specified at all, it overrides (disables) the implicit loading of session details based on a supplied hostname elsewhere (on the grounds that the user is more likely to want the "-load" session than the implicit session). (PuTTY itself doesn't do implicit loading at all, so I haven't changed it.) This means that all the PuTTY tools' behaviour is now consistent iff "-load" is specified (otherwise, some tools have implicit-session, and others don't). However, I've not documented this behaviour, as there's a good chance it will be swept away if and when we get round to sorting out how we deal with settings from multiple sources. It's intended as a "do something sensible" change. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-25T14:00:26.000000Z PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a4b7baf4c749b9c0f5fb1da50f6913ab Text-delta-base-sha1: 425d10e32fa231adabecedb4b1d670974d0b094c Text-content-length: 90 Text-content-md5: 9e80f9b1bb9ce64414806bde2a6e2bad Text-content-sha1: 7c315b1cb8e6e9c99d03888a874fc790a808afbb Content-length: 130 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN #@P@_|4Wloaded_session = TRUE; return 2; } if (!strcmp(p, "-ssh Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bcf907d45fd641e2208675cd9cab7d7b Text-delta-base-sha1: 22513acece6a4fb71036ae4fff70adae97f38f72 Text-content-length: 254 Text-content-md5: 7dd2598cbaaaee344274922a2942b3e9 Text-content-sha1: 25356658ed74c285ae2122ed499d383023622cb5 Content-length: 294 K 15 cvs2svn:cvs-rev V 4 1.86 PROPS-END SVNXA`;+d{loaded_session = FALSEloaded_session || cfg2.host[0] == '\0') { /* No settings for this host; use defaults */ /* (or session was already loaded with -load)/* Ick: patch up internal pointer after copy */ Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 26988c859b32f1df71aa216f441dce6a Text-delta-base-sha1: dbbe2e0ce382b3de2a4e655b8f69f11b7140ceff Text-content-length: 854 Text-content-md5: 6211cea4ad9a8694e03278bfdf667f6b Text-content-sha1: 2a82160c1ba7b8a6daee5c9efba0ca79632c170c Content-length: 894 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVN$22>Cio# * If we haven't loaded session details already (e.g., from -load), * try looking for a session called "host". */ if (!loaded_session) { /* Try to load settings for `host' into a temporary config */ Config cfg2; cfg2.host[0] = '\0'; do_defaults(host, &cfg2); if (cfg2.host[0] != '\0') { /* Settings present and include hostname */ /* Re-load data into the real config. */ do_defaults(host, &cfg); } else { /* Session doesn't exist or mention a hostname. */ /* Use `host' as a bare hostname. */ strncpy(cfg.host, host, sizeof(cfg.host) - 1); cfg.host[sizeof(cfg.host) - 1] = '\0'; } } else { /* Patch in hostname `host' to session details. *//* Load Default Settings before doing anything else. */ do_defaults(NULL, &cfg); loaded_session = FALSE Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5f15f10405f97bc7ef6f5b6200851004 Text-delta-base-sha1: 89b25728978240359b3dd88ff44a191def589d38 Text-content-length: 127 Text-content-md5: be0ba7095fb036fa67575a65b4556ee8 Text-content-sha1: 70b3c638506b576582794d8b45c280d103fa200d Content-length: 168 K 15 cvs2svn:cvs-rev V 5 1.228 PROPS-END SVN8" g_g\\/* * This is set TRUE by cmdline.c iff a session is loaded with "-load". */ GLOBAL int loaded_session Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f348cbc28d0136e686f51dfb5a1524e0 Text-delta-base-sha1: 9808b17f527aa5da7bf9eb78720ed84446fc4ef6 Text-content-length: 853 Text-content-md5: cdabd5f76db27ebc05479dc202b44f5e Text-content-sha1: 122fb747a21f267d52bc8a80f3df4bb2ae2d67e9 Content-length: 894 K 15 cvs2svn:cvs-rev V 5 1.122 PROPS-END SVNN\2zCJ%ofh * If we haven't loaded session details already (e.g., from -load), * try looking for a session called "host". */ if (!loaded_session) { /* Try to load settings for `host' into a temporary config */ Config cfg2; cfg2.host[0] = '\0'; do_defaults(host, &cfg2); if (cfg2.host[0] != '\0') { /* Settings present and include hostname */ /* Re-load data into the real config. */ do_defaults(host, &cfg); } else { /* Session doesn't exist or mention a hostname. */ /* Use `host' as a bare hostname. */ strncpy(cfg.host, host, sizeof(cfg.host) - 1); cfg.host[sizeof(cfg.host) - 1] = '\0'; } } else { /* Patch in hostname `host' to session details. *//* Load Default Settings before doing anything else. */ do_defaults(NULL, &cfg); loaded_session = FALSE Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 501f9de7c40f8b93db4f1729adba8862 Text-delta-base-sha1: e34c4f5e608a96d78f41a821dded6d44a9921ec4 Text-content-length: 254 Text-content-md5: ffa8f72a5e5bd05c4333b51f6a641e36 Text-content-sha1: e988bd4bf45c288a416d0dcdbad86b9f907fe0fe Content-length: 294 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN;Xd.^+U&xloaded_session = FALSEloaded_session || cfg2.host[0] == '\0') { /* No settings for this host; use defaults */ /* (or session was already loaded with -load)/* Ick: patch up internal pointer after copy */ Revision-number: 4353 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2004-07-25T14:16:14.000000Z K 7 svn:log V 37 Add message-IDs of original reports. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-load-ignores-proxy Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 986c604fa70cfb1c18d0f762f8244ef7 Text-delta-base-sha1: a6f653bb178bde678c2a32141be6ddd606429ab1 Text-content-length: 141 Text-content-md5: 9018c34e6030ab9930219875154103ce Text-content-sha1: a1366ad773363746314c411f9439809f40ab861f Content-length: 180 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN|| Original report: <20030909012544.7544BDF297@swordfish.cs.caltech.edu> <20031216034329.A48BFDF28D@swordfish.cs.caltech.edu> Revision-number: 4354 Prop-content-length: 485 Content-length: 485 K 7 svn:log V 384 I don't think this bug applies to 0.53b at all; I think it crept in between 2003-03-21 and 2003-03-24 (when `-load' was made non-deferred), and thus is one and the same as `psftp-pscp-ignore-load'. Phew. (Although it would be easy to think 0.53b was ignoring proxy settings if you were using a session saved in 0.54, because 0.53b looks for ProxyType and 0.54 writes ProxyMethod...) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-25T15:31:04.000000Z PROPS-END Node-path: putty-wishlist/data/psftp-load-ignores-proxy Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9018c34e6030ab9930219875154103ce Text-delta-base-sha1: a1366ad773363746314c411f9439809f40ab861f Text-content-length: 81 Text-content-md5: d3ba87574fb091d004bf9ec522ef2313 Text-content-sha1: 02c7c7a116b3ef27fb94de669aad742ad067f185 Content-length: 120 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN; =n Absent-in: 0.53b 2003-03-21 Present-in: 2003-03-24 2003-10-13 Revision-number: 4355 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2004-07-25T15:31:24.000000Z K 7 svn:log V 46 Remove in favour of `psftp-pscp-ignore-load'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-load-ignores-proxy Node-action: delete Revision-number: 4356 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2004-07-25T15:33:46.000000Z K 7 svn:log V 106 Found when this crept in, and fixed it. (NB this item is the same as the old `psftp-load-ignores-proxy'.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-pscp-ignore-load Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7881c63c7a05e4e29c15c8183afea86c Text-delta-base-sha1: a9e9213078312691ea6aa4c40b3002e0fd9218ca Text-content-length: 199 Text-content-md5: a650bdfbdc6c3bff86813ca26f9df4dc Text-content-sha1: d15e92ebffc7dd4c493e0a26f01a28da70af7f23 Content-length: 238 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN 0ZWuYAbsent-in: 0.53b 2003-03-21 Present-in: 2003-03-24 0.54 2004-07-21 Fixed-in: 2004-07-26

    This probably crept in when -load was made non-deferred. Fixed in CVS. Revision-number: 4357 Prop-content-length: 484 Content-length: 484 K 8 svn:date V 27 2004-07-25T16:10:48.000000Z K 7 svn:log V 383 PSFTP was ignoring `-1' and `-2' and always using SSH-2 with fallback to SSH-1. It also ignored any settings forbidding fallback to SSH-1. Ignoring `-1' and `-2' is hardly the end of the world, as it'd be difficult to think of a realistic situation where fallback didn't do the right thing and PSFTP was still useful. However, ignoring a user's `SSH-2 only' setting was a bit rude. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6211cea4ad9a8694e03278bfdf667f6b Text-delta-base-sha1: 2a82160c1ba7b8a6daee5c9efba0ca79632c170c Text-content-length: 359 Text-content-md5: e8f80e1e448e023375a768c59966df6b Text-content-sha1: c38d7de59c5219760a605b6758f2017584e972e4 Content-length: 399 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVN2FEEE^5^TIf saved session / Default Settings says SSH-1 (`1 only' or `1'), * then change it to SSH-2, on the grounds that that's more likely to * work for SFTP. (Can be overridden with `-1' option.) * But if it says `2 only' or `2', respect which. */ if (cfg.sshprot != 2 && cfg.sshprot != 3) cfg.sshprot = 2; Revision-number: 4358 Prop-content-length: 419 Content-length: 419 K 7 svn:log V 318 Attempt to make Windows pointer hiding more robust by ignoring MOUSEMOVE and NCMOUSEMOVE messages where nothing actually changes. It seems Windows likes to send such messages occasionally when other stuff is going on (e.g., in other windows). (Also spotted by Franco Barber <20040122055232.GA8168@febsun.cmhnet.org>.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-25T19:52:07.000000Z PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4fd598838b8e4e7abbecc030a7efe2af Text-delta-base-sha1: f2cfeb91f8feb1bded504e7f7e1a3836eac0ee4b Text-content-length: 1357 Text-content-md5: dc90e7cbde8135620e57c394eb88d125 Text-content-sha1: 110e42de92a12e6ca658a503b816e6080d23773c Content-length: 1398 K 15 cvs2svn:cvs-rev V 5 1.265 PROPS-END SVN:F8Cc'c static UINT last_mousemove = 0{ /* * Windows seems to like to occasionally send MOUSEMOVE * events even if the mouse hasn't moved. Don't unhide * the mouse pointer in this case. */ static WPARAM wp = 0; static LPARAM lp = 0; if (wParam != wp || lParam != lp || last_mousemove != WM_MOUSEMOVE) { show_mouseptr(1); wp = wParam; lp = lParam; last_mousemove = WM_MOUSEMOVE; } }{ static WPARAM wp = 0; static LPARAM lp = 0; if (wParam != wp || lParam != lp || last_mousemove != WM_NCMOUSEMOVE) { show_mouseptr(1); wp = wParam; lp = lParam; last_mousemove = WM_NCMOUSEMOVE; } }vv alt_sum = alt_sum * 10 + wParam - VK_NUMPAD0; else alt_sum = 0; } /* Okay we've done everything interesting; let windows deal with * the boring stuff */ { BOOL capsOn=0; /* helg: clear CAPS LOCK state if caps lock switches to cyrillic */ if(cfg.xlat_capslockcyr && keystate[VK_CAPITAL] != 0) { capsOn= !left_alt; keystate[VK_CAPITAL] = 0; } /* XXX how do we know what the max size of the keys array should * be is? There's indication on MS' website of an Inquire/InquireEx * functioning returning a KBINFO structure which tells us. */ if (osVersion.dwPlatformId == VER_PLATFORM_W Revision-number: 4359 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2004-07-25T19:54:44.000000Z K 7 svn:log V 56 Tentative fix for this. Not claimed Fixed-in: just yet. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/systray-breaks-ptr-hiding Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bda29b7cbc3a9cb76f2613d72a0bc7ae Text-delta-base-sha1: cf933b4e08dc700d56f45f8efb41fcbbdfbffdc3 Text-content-length: 445 Text-content-md5: a862759652a80ef05ee487a981a39f01 Text-content-sha1: de3fabab49dc95808d38ce327f1caf4a1335e620 Content-length: 484 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNo*o*

    Update, 2004-Jul-25: I was unable to reproduce the system tray behaviour on a Win98SE system, but activity in other windows would cause WM_MOUSEMOVE and WM_NCMOUSEMOVE messages to be sent when nothing had actually changed. As of tomorrow's snapshot, PuTTY will ignore such messages. Hopefully this will solve the original problem; if it works for you it'd be nice if you could tell us. Revision-number: 4360 Prop-content-length: 122 Content-length: 122 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-25T22:24:32.000000Z K 7 svn:log V 22 Experimentally fixed. PROPS-END Node-path: putty-wishlist/data/window-placement Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bbfd8131bc84662ca23d7d378cf1cad7 Text-delta-base-sha1: bfacd9f4e5c656b558c225fe85d0362f020bc05a Text-content-length: 265 Text-content-md5: 2e61c9f2de5da90acc19367bcc396297 Text-content-sha1: bd877b6e0147cc4ec85693d38815232fe969493a Content-length: 304 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNu ss 2004-Jul-25: I've experimentally committed this change to the snapshots. It does appear to basically work on Win98SE, to not obviously break anything, and to improve window placement. If it breaks your weird configuration, please let us know. Revision-number: 4361 Prop-content-length: 163 Content-length: 163 K 7 svn:log V 63 Be less optimistic about the change as I've found some issues. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-25T22:38:09.000000Z PROPS-END Node-path: putty-wishlist/data/window-placement Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2e61c9f2de5da90acc19367bcc396297 Text-delta-base-sha1: bd877b6e0147cc4ec85693d38815232fe969493a Text-content-length: 103 Text-content-md5: 26841348cecb6996c7d4bb5c19de997d Text-content-sha1: f9d979ae806a7056baa6e39b7bf37a76b4f67217 Content-length: 142 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNugVVm experimenting with this change and hope to put it in the snapshots to try out soon. Revision-number: 4362 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2004-07-26T10:37:31.000000Z K 7 svn:log V 106 Add notes on another breakage of pointer-hiding I've observed - one that isn't fixed by my recent change. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/systray-breaks-ptr-hiding Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a862759652a80ef05ee487a981a39f01 Text-delta-base-sha1: de3fabab49dc95808d38ce327f1caf4a1335e620 Text-content-length: 496 Text-content-md5: efd47dd2af89b60af392172783cc8e93 Text-content-sha1: b8edbc1985ce6b5c2314f1510e0c2879c1024f54 Content-length: 535 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNv]]

    (Aside: the mouse pointer occasionally seems to get shown on my Win98SE system - as a pointer, not an I-beam - and then isn't hidden by subsequent typing. I think it may momentarily be an hourglass first. It's sometimes caused by playing a .WAV file for a bell, and sometimes happens for no apparent reason. This doesn't appear to be visible to the usual PuTTY show/hide pointer mechanisms (show_mouseptr()), so isn't fixed by the above change.) Revision-number: 4363 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2004-07-26T15:40:37.000000Z K 7 svn:log V 33 ftp://diis.net/pub/mirror/putty/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a86133797899b3b65003860bd4d5d67e Text-delta-base-sha1: 287c56dcbdcfec2605750dbb790acd6c0a1c9533 Text-content-length: 74 Text-content-md5: 763674faa9413a121c3fe7d601461030 Text-content-sha1: e6c86af0f5280a5d521b6161367831a8b978a33e Content-length: 114 K 15 cvs2svn:cvs-rev V 4 1.88 PROPS-END SVN_( 3cMdiis.net/pub/mirror/putty/">diis.net in Germany Revision-number: 4364 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2004-07-26T17:48:08.000000Z K 7 svn:log V 18 putty.tuxparty.de K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 763674faa9413a121c3fe7d601461030 Text-delta-base-sha1: e6c86af0f5280a5d521b6161367831a8b978a33e Text-content-length: 73 Text-content-md5: 36ddccddf2b48731ebb2f74f50280c8c Text-content-sha1: 049c21dda5681b37d9d042a7542adfcdf23578be Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.89 PROPS-END SVN(.IA@_Ituxparty.de/">putty.tuxparty.de in Germany Revision-number: 4365 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2004-07-27T07:40:25.000000Z K 7 svn:log V 47 Oops - ftp.diis.net is in the US, not Germany. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 36ddccddf2b48731ebb2f74f50280c8c Text-delta-base-sha1: 049c21dda5681b37d9d042a7542adfcdf23578be Text-content-length: 78 Text-content-md5: 4ebd57b5a19cb808defba47527065ef9 Text-content-sha1: 3a47d94b6ce4bc7ed8adb2459227119def4f8ef0 Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.90 PROPS-END SVN2R~diis.net/pub/mirror/putty/">diis.net in the US Revision-number: 4366 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 2004-07-27T13:24:01.000000Z K 7 svn:log V 161 pscp-size-change: PSCP assertion failure if remote source file changes size and cross-link with `large-files' since the same error message is mentioned in both. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/large-files Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a256a67d9bc5e04ce3bf1188e2c9797b Text-delta-base-sha1: ba799852321aeddd31ef0afb210f3c7e5da67d76 Text-content-length: 235 Text-content-md5: 71b39233d18c7ca8a11f50899e4bf78a Text-content-sha1: 60c46ceb490ffa23e2efe45d1d322013b8050a60 Content-length: 274 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNjQXyX; also note that the same error can still occur if files change in size. In any case files over 4GB are still not supported (and this would require some upheaval to fix). Node-path: putty-wishlist/data/pscp-size-change Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 512 Text-content-md5: e68e49a07b3eb9d3a92870a908b31d07 Text-content-sha1: 7ed34c149a8d5a02cce96163665689512b565405 Content-length: 628 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 PROPS-END SVNrrrSummary: PSCP assertion failure if remote source file changes size Class: semi-bug Priority: medium Content-type: text/x-html-body

    If PSCP is used to copy a remote file to the local machine, and the remote file changes in size during the transfer (e.g., an active log file), PSCP can give an error message like "Assertion failed: actuallen <= len, file scp.c, line 1435".

    (Note that the same error used to occur for static but particularly large files.) Revision-number: 4367 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2004-07-27T15:20:37.000000Z K 7 svn:log V 37 Fix double-free in X selection code. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0656ef4886e40de7999656ec2988ac14 Text-delta-base-sha1: 46b6411e9083a7825efb524c2f8f73ed807206ba Text-content-length: 136 Text-content-md5: 79a96bdae820d1097fd7ce8866916234 Text-content-sha1: cbc2ff850a946c3dc19866ab82b7b27c06236998 Content-length: 177 K 15 cvs2svn:cvs-rev V 5 1.142 PROPS-END SVNm>mV= else { inst->pasteout_data_ctext = NULL; inst->pasteout_data_ctext_len = 0; Revision-number: 4368 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2004-07-28T10:24:57.000000Z K 7 svn:log V 52 Note that this is associated with the SFTP backend. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pscp-size-change Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e68e49a07b3eb9d3a92870a908b31d07 Text-delta-base-sha1: 7ed34c149a8d5a02cce96163665689512b565405 Text-content-length: 373 Text-content-md5: 95007d12e948f7dd91bdbf14c4ecd6f8 Text-content-sha1: eca8c143ce6bda5b34f45e864f19d3524e267037 Content-length: 412 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNrTbrb

    This assertion is associated with the SFTP backend. A workaround may be to persuade PSCP to use its SCP backend instead (for instance, with the -scp option added in the development snapshots); you'll avoid the assertion, but I haven't checked that the file will be safely transferred in its entirety. Revision-number: 4369 Prop-content-length: 270 Content-length: 270 K 8 svn:date V 27 2004-07-28T11:04:22.000000Z K 7 svn:log V 169 Another wart in the command-line processing: if the user just specifies `-load sessname', and that mentions a hostname, that should be sufficient to start a connection. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e8f80e1e448e023375a768c59966df6b Text-delta-base-sha1: c38d7de59c5219760a605b6758f2017584e972e4 Text-content-length: 304 Text-content-md5: b6adfcdb11484b85904a85ad592036b0 Text-content-sha1: a2b1367e0fd89c9e19059c534a4706e78f594120 Content-length: 344 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVNFmTrthe loaded session provides a hostname, and a hostname has not * otherwise been specified, pop it in `userhost' so that * `psftp -load sessname' is sufficient to start a session. */ if (!userhost && cfg.host[0] != '\0') { userhost = dupstr(cfg.host); } Revision-number: 4370 Prop-content-length: 244 Content-length: 244 K 7 svn:log V 143 Talk about Halibut; mention Unix `install' target; mention lack of Makefiles if you check out directly from CVS as it's come up once or twice. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-29T10:09:25.000000Z PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 51995ffc52cd1b1476130078d439a684 Text-delta-base-sha1: 81357da77dd80b3a0b314a78588b02f5f0833a3c Text-content-length: 543 Text-content-md5: 8f50b1642010dab790e71b1f3c9c9473 Text-content-sha1: e56e86f0a8baf25904cdf6af2cdefd53b8715c86 Content-length: 583 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN20x5h*5\|XZ (If you have fetched the source from CVS, you'll have to generate the Makefiles yourself -- see below.) There is an `install' target; note that by default it tries to install `man' pages, which need to be built using Halibut first -- see belowDocumentation (in various formats including Windows Help and Unix `man' pages) is to be built from the Halibut (`.but') files in the `doc' subdirectory using `doc/Makefile'. Halibut can be found at Revision-number: 4371 Prop-content-length: 179 Content-length: 179 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-07-29T10:23:48.000000Z K 7 svn:log V 79 "Where does PuTTY store its data?" -- mention where Unix PuTTY stores its data PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 431ae329bef95c53a4e59db5488bbcd3 Text-delta-base-sha1: 901fd9f3450b60c231f7e4fecb9f07376af399aa Text-content-length: 233 Text-content-md5: ecb26a545149c59609fe2b6af11f7605 Text-content-sha1: 59e89f21b0651961e316fb0b388c2604f3a8d0d1 Content-length: 273 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVNQG2QmD{\versionid $Id: faq.but,v 1.73 2004/07/29 10:23:48On Windows, PuTTY stores most of its data (saved sessions, SSH host keys) in the On Unix, PuTTY stores all of this data in a directory \cw{~/.putty}. Revision-number: 4372 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2004-07-29T15:44:35.000000Z K 7 svn:log V 32 Improve robustness in modpow(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3c61b1ff2afa080ab5ea1a9afdd12d44 Text-delta-base-sha1: 9bef51c724ed6bf2734bb015348a008feb968de6 Text-content-length: 411 Text-content-md5: b32b16c2cc60c810ade6b990cfbc389b Text-content-sha1: 46fbbba752260192f79e0fd27677d34f8b7165b4 Content-length: 451 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN>rR6Di?Cq.jassert/ Bignum modpow(Bignum base_inbase, result; /* * The most significant word of mod needs to be non-zero. It * should already be, but let's make sure. */ assert(mod[mod[0]] != 0); /* * Make sure the base is smaller than the modulus, by reducing * it modulo the modulus if not. */ base = bigmod(base_in, mod)freebn(base Revision-number: 4373 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2004-07-29T15:44:35.000000Z K 7 svn:log V 71 This commit was manufactured by cvs2svn to create branch 'branch-0-55'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-branch-0.55 Node-kind: dir Node-action: add Node-copyfrom-rev: 4372 Node-copyfrom-path: putty Revision-number: 4374 Prop-content-length: 174 Content-length: 174 K 7 svn:log V 74 Back out the Arabeyes patch on a CVS branch, ready for a bug-fix release. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-07-29T17:56:50.000000Z PROPS-END Node-path: putty-branch-0.55/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 9f21332b18b47093dc680e509839e942 Text-delta-base-sha1: 20a30a2f69339b2eb3cd7ed445519a83d7b2000a Text-content-length: 363 Text-content-md5: 97a47dc4695e45719b0f3de2ffb8d893 Text-content-sha1: 2f0f31f6f0fefdeca8d9c3a49ece92a700690c3c Content-length: 407 K 15 cvs2svn:cvs-rev V 8 1.58.2.1 PROPS-END SVNH S+S.GUI front end and terminal emulator (putty, puttytel). GUITERM = window windlg winctrls terminal sizetip wcwidth unicode ldiscucs + logging printing winutils dialog config wincfg tree234 # Same thing on Unix. UXTERM = pterm config uxcfg dialog gtkdlg gtkcols gtkpanel tree234 + terminal wcwidth uxucs ldiscucs logging Node-path: putty-branch-0.55/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: cc56d7cbfff4ebc447cf167c34547427 Text-delta-base-sha1: 75724518e2cf1da8c1742508e42bd61b287634d3 Text-content-length: 25 Text-content-md5: 8d05478bbc2194d22768cb06dfe7dd2f Text-content-sha1: 97f122689662153ed9b717a82ee847a2b5f02344 Content-length: 69 K 15 cvs2svn:cvs-rev V 8 1.35.2.1 PROPS-END SVNe0 "W Node-path: putty-branch-0.55/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: c85ecaa034a89ee4de9b061c4bc652e6 Text-delta-base-sha1: 6585b9659bf8cea0171e458456d8eb97322d8b14 Text-content-length: 89 Text-content-md5: 9fd190c3ece2b4514c4336ffb146d721 Text-content-sha1: 866bbff505d956da7e5933347a5b55d0f4eeb655 Content-length: 133 K 15 cvs2svn:cvs-rev V 8 1.86.2.1 PROPS-END SVN]$ ?<;)4\versionid $Id: config.but,v 1.86.2.1 2004/07/29 17:56:50 simon Node-path: putty-branch-0.55/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 293b6d695ac816e2c14c206d28bb9840 Text-delta-base-sha1: 73ed6f7b79499f802c5f4481959101d35bec0db8 Text-content-length: 146 Text-content-md5: 2aa516b69f2f8c865aae0086f186e0e2 Text-content-sha1: 019955be0f85b6dd8ec647bb69a4275a99336513 Content-length: 190 K 15 cvs2svn:cvs-rev V 8 1.31.2.1 PROPS-END SVN ;#dNZsu; e)r return 4; /* for hex XY (c >= 160 && !in_utf(ldisc->term) one char and output one BSB Node-path: putty-branch-0.55/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: be0ba7095fb036fa67575a65b4556ee8 Text-delta-base-sha1: 70b3c638506b576582794d8b45c280d103fa200d Text-content-length: 28 Text-content-md5: a264731d469e6af606f1edc8113a3bfb Text-content-sha1: cc88a9926f2de0b3d9dbacb6eebe9ee6986d922c Content-length: 73 K 15 cvs2svn:cvs-rev V 9 1.228.2.1 PROPS-END SVN"b8 Node-path: putty-branch-0.55/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 4b8d2d0f710c04879aa32104dc35e3fa Text-delta-base-sha1: 1ae8667931d5ebf13a9836e6f5760054cca94002 Text-content-length: 39 Text-content-md5: 48c60ec665e9f1576da492789f6d4c37 Text-content-sha1: 885dd6dba069516b8f3d4e61ef97b2dca445f2fe Content-length: 84 K 15 cvs2svn:cvs-rev V 9 1.119.2.1 PROPS-END SVN2:t) Node-path: putty-branch-0.55/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 1da05c8bb930ceeb4e0cca4d82d58aa3 Text-delta-base-sha1: ce4aeaf3327ad59eb4c01e4188ee7500c7518c2c Text-content-length: 3988 Text-content-md5: 23e13731453311231e8c45fd323dbcb4 Text-content-sha1: e138d7dbfd0f3c9b47a9798f9627461940083600 Content-length: 4033 K 15 cvs2svn:cvs-rev V 9 1.166.2.1 PROPS-END SVN.Gt$3jxwm@lN(g E for (j = 0; j < term->cols; j++, idx++) { unsigned long tattr, tchar; unsigned long *d = ldata + j; int break_run; scrpos.x = j; tchar = (*d & (CHAR_MASK | CSET_MASK)); tattr = (*d & (ATTR_MASK ^ CSET_MASK)); switch (tchar & CSET_MASK) { case ATTR_ASCII: tchar = term->ucsdata->unitab_line[tchar & 0xFF]; break; case ATTR_LINEDRW: tchar = term->ucsdata->unitab_xterm[tchar & 0xFF]; break; case ATTR_SCOACS: tchar = term->ucsdata->unitab_scoacs[tchar&0xFF]; break; } tattr |= (tchar & CSET_MASK); tchar &= CHAR_MASK; if (j < term->cols-1 && (d[1] & (CHAR_MASK | CSET_MASK)) == UCSWIDE) tattr |= ATTR_WIDE; /* Video reversing things */ if (term->selstate == DRAGGING || term->selstate == SELECTED) { if (term->seltype == LEXICOGRAPHIC) selected = (posle(term->selstart, scrpos) && poslt(scrpos, term->selend)); else selected = (posPle(term->selstart, scrpos) && posPlt(scrpos, term->selend)); } else selected = FALSE; tattr = (tattr ^ rv ^ (selected ? ATTR_REVERSE : 0)); /* 'Real' blinking ? */ if (term->blink_is_real && (tattr & ATTR_BLINK)) { if (term->has_focus && term->tblinker) { tchar = term->ucsdata->unitab_line[(unsigned char)' ']; } tattr &= ~ATTR_BLINK; } /* * Check the font we'll _probably_ be using to see if * the character is wide when we don't want it to be. */ if ((tchar | tattr) != (term->disptext[idx]& ~ATTR_NARROW)) { if ((tattr & ATTR_WIDE) == 0 && char_width(ctx, (tchar | tattr) & 0xFFFF) == 2) tattr |= ATTR_NARROW; } else if (term->disptext[idx]&ATTR_NARROW) tattr |= ATTR_NARROW; /* Cursor here ? Save the 'background' */ if (i == our_curs_y && j == our_curs_x) { cursor_background = tattr | tchar; term->dispcurs = term->disptext + idx; } if ((term->disptext[idx] ^ tattr) & ATTR_WIDE) dirty_line = TRUE; break_run = (((tattr ^ attr) & term->attr_mask) || j - start >= sizeof(ch)); /* Special hack for VT100 Linedraw glyphs */ if ((attr & CSET_MASK) == 0x2300 && tchar >= 0xBA && tchar <= 0xBD) break_run = TRUE; if (!term->ucsdata->dbcs_screenfont && !dirty_line) { if ((tchar | tattr) == term->disptext[idx]) break_run = TRUE; else if (!dirty_run && ccount == 1) break_run = TRUE; } if (break_run) { if ((dirty_run || last_run_dirty) && ccount > 0) { do_text(ctx, start, i, ch, ccount, attr, lattr); updated_line = 1; } start = j; ccount = 0; attr = tattr; if (term->ucsdata->dbcs_screenfont) last_run_dirty = dirty_run; dirty_run = dirty_line; } if ((tchar | tattr) != term->disptext[idx]) dirty_run = TRUE; ch[ccount++] = (char) tchar; term->disptext[idx] = tchar | tattr; /* If it's a wide char step along to the next one. */ if (tattr & ATTR_WIDE) { if (++j < term->cols) { idx++; d++; /* * By construction above, the cursor should not * be on the right-hand half of this character. * Ever. */ assert(!(i == our_curs_y && j == our_curs_x)); if (term->disptext[idx] != *d) dirty_run = TRUE; term->disptext[idx] = *d; } } } if (dirty_run && ccount > 0) { do_text(ctx, start, i, ch, ccount, attr, lattr); updated_line = 1; } /* Cursor on this line ? (and changed) */ if (i == our_curs_y && (term->curstype != cursor || updated_line)) { ch[0] = (char) (cursor_background & CHAR_MASK); attr = (cursor_background & ATTR_MASK) | cursor; do_cursor(ctx, our_curs_x, i, ch, 1, attr, lattr); term->curstype = cursor; } } } /* * Flick the switch that says if blinking things should be shown or hidden. */ void term_blink(Terminal *term, int flg) { long now, blink_diff; now = >;; Node-path: putty-branch-0.55/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 9b0846c53744486827e86b9bb2593a5b Text-delta-base-sha1: 75eb85411492633cce991d0fa2415182d06f9593 Text-content-length: 19 Text-content-md5: 9929db90221cebfe5628262a0cec1b4f Text-content-sha1: 1c03c19c4e9f9481a42cf17f2e59c8b7d6f7fec7 Content-length: 63 K 15 cvs2svn:cvs-rev V 8 1.15.2.1 PROPS-END SVN .TZ/ Node-path: putty-branch-0.55/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: dc90e7cbde8135620e57c394eb88d125 Text-delta-base-sha1: 110e42de92a12e6ca658a503b816e6080d23773c Text-content-length: 1199 Text-content-md5: 4b5bce5c20b706caca466667f0d9128e Text-content-sha1: 30afb483c4d4a9481b19b9cba5bc90206ccb6199 Content-length: 1244 K 15 cvs2svn:cvs-rev V 9 1.265.2.1 PROPS-END SVNtHP{r+Ucwbuf, len, IpDx); alt_sum = alt_sum * 10 + wParam - VK_NUMPAD0; else alt_sum = 0; } /* Okay we've done everything interesting; let windows deal with * the boring stuff */ { BOOL capsOn=0; /* helg: clear CAPS LOCK state if caps lock switches to cyrillic */ if(cfg.xlat_capslockcyr && keystate[VK_CAPITAL] != 0) { capsOn= !left_alt; keystate[VK_CAPITAL] = 0; } /* XXX how do we know what the max size of the keys array should * be is? There's indication on MS' website of an Inquire/InquireEx * functioning returning a KBINFO structure which tells us. */ if (osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) { /* XXX 'keys' parameter is declared in MSDN documentation as * 'LPWORD lpChar'. * The experience of a French user indicates that on * Win98, WORD[] should be passed in, but on Win2K, it should * be BYTE[]. German WinXP and my Win2K with "US International" * driver corroborate this. * Experimentally I've conditionalised the behaviour on the * Win9x/NT split, but I suspect it's worse than that. * See wishlist item `win-dead-key!!c Node-path: putty-branch-0.55/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 4282dbce1235a5642d5c0fe32a2551c7 Text-delta-base-sha1: e4e4ddc1e8cd07b95478a90f55897406aa6bc85a Text-content-length: 20 Text-content-md5: 6d1b35f76c86c783c3861eaa3392e508 Text-content-sha1: 54ba782b4ec06529b507bbf4b00cdeccfcc2a04b Content-length: 63 K 15 cvs2svn:cvs-rev V 7 1.7.2.1 PROPS-END SVN} x Node-path: putty-branch-0.55/minibidi.c Node-action: delete Node-path: putty-branch-0.55/minibidi.h Node-action: delete Revision-number: 4375 Prop-content-length: 278 Content-length: 278 K 8 svn:date V 27 2004-07-30T09:38:37.000000Z K 7 svn:log V 177 Tweak to make it more obvious that the System menu is only available from the _terminal_ window -- should be obvious from context but the nearest context is some distance away. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: aef9e3234e373e3f7da435182604299f Text-delta-base-sha1: 66f08e46f7dafb71e775284f15c3181899df73e9 Text-content-length: 203 Text-content-md5: 6373f311091e52a95e05e05c012c560d Text-content-sha1: 58a6c5eb84f9bf35f9933f4a7ac3ab4d6c3c8bb0 Content-length: 243 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVNdm 0$4|K\versionid $Id: using.but,v 1.26 2004/07/30 09:38:37terminal window, or click the right mouse button on the title bar, you will see the standard Windows system menu containing Revision-number: 4376 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:37.253629Z PROPS-END Revision-number: 4377 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:37.264045Z PROPS-END Revision-number: 4378 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2004-07-31T15:33:22.000000Z K 7 svn:log V 121 General robustness improvements in SSH1. In particular, SSH1 and SSH2 now share most of their packet-decoding functions. K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.55/cmdgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 3ff1c3d580c4d2882d0458a0c3891f71 Text-delta-base-sha1: b5d13cd33140addc0603541f42adc39d93a67312 Text-content-length: 377 Text-content-md5: 549b476f4a35824921bc0e3b7696a79a Text-content-sha1: 2235695de7f14fce5294a810c633cc8d0cf02b66 Content-length: 420 K 15 cvs2svn:cvs-rev V 7 1.4.2.1 PROPS-END SVNn[U/-TH&l l = ssh1_read_bignum(blob + n, bloblen - n, &ssh1key->exponent); if (l < 0) { error = "SSH1 public key blob was too short"; } else { n += l; l = ssh1_read_bignum(blob + n, bloblen - n, &ssh1key->modulus); if (l < 0) { error = "SSH1 public key blob was too short"; } else n += l; } Node-path: putty-branch-0.55/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: b2f4637f204e6308c37db8111fb58749 Text-delta-base-sha1: 7946f86ab9002db3ebc33d08bee667443445bcab Text-content-length: 4341 Text-content-md5: 6ffb4e11b264f79d4b71cf048963d114 Text-content-sha1: 78733d4880957afe0b969fd3fa78b8798888fbc7 Content-length: 4385 K 15 cvs2svn:cvs-rev V 8 1.69.2.1 PROPS-END SVN[OM/HTibm}-O%.'BC qSPej}S>u>P?cH:XEj NVZ"W@lMz%LB <zQVs^sC`^V-C}Zint *length); static void *get_keylist2(int *length, keylist&keylistlen&keylistlen); } if (keylist) { if (keylistlen < 4) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } nkeys = GET_32BIT(keylist); p = keylist + 4; keylistlen -= { int n = rsa_public_blob_len(p, keylistlen); if (n < 0) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } p += n; keylistlen -= n; } else { int n; if (keylistlen < 4) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } n = 4 + GET_32BIT(p); if (keylistlen < n) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } p += n; keylistlen -= n; } /* Now skip over comment field */ { int n; if (keylistlen < 4) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } n = 4 + GET_32BIT(p); if (keylistlen < n) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } p += n; keylistlen -= n; }reqlen += clen + 4int *length if (length) *length = resplen-5; } else { ret = make_keylist1(lengthint *length request[4] = SSH2_AGENTC_REQUEST2_AGENT if (length) *length = resplen-5; } else { ret = make_keylist2(lengthunsigned char *msgend; int type; /* * Get the message length. */ msgend = p + 4 + GET_32BIT(p); /* * Get the message type. */ if (msgend < p+5) goto failure;i = ssh1_read_bignum(p, msgend - p, &reqkey.exponent); if (i < 0) goto failure; p += i; i = ssh1_read_bignum(p, msgend - p, &reqkey.modulus); if (i < 0) goto failure; p += i; i = ssh1_read_bignum(p, msgend - p, &challenge); if (i < 0) goto failure; p += i; if (msgend < p+16memcpy(response_source + 32, p, 16); p += 16; if (msgend < p+4 || if (msgend < p+4) goto failure; b.len = GET_32BIT(p); p += 4; if (msgend < p+b.len) goto failure; b.blob = p; p += b.len; if (msgend < p+4) goto failure; datalen = GET_32BIT(p); p += 4; if (msgend < p+datalen) goto failure; data = pn, commentlen; n = makekey(p, msgend - p, key, NULL, 1); if (n < 0) { freersakey(key); sfree(key); goto failure; } p += n; n = makeprivate(p, msgend - p, key); if (n < 0) { freersakey(key); sfree(key); goto failure; } p += n; n = ssh1_read_bignum(p, msgend - p, &key->iqmp); /* p^-1 mod q */ if (n < 0) { freersakey(key); sfree(key); goto failure; } p += n; n = ssh1_read_bignum(p, msgend - p, &key->p); /* p */ if (n < 0) { freersakey(key); sfree(key); goto failure; } p += n; n = ssh1_read_bignum(p, msgend - p, &key->q); /* q */ if (n < 0) { freersakey(key); sfree(key); goto failure; } p += n; if (msgend < p+4) { freersakey(key); sfree(key); goto failure; } commentlen = GET_32BIT(p); if (msgend < p+commentlen) { freersakey(key); sfree(key); goto failure; } if (msgend < p+4) goto failure; alglen = GET_32BIT(p); p += 4; if (msgend < p+alglen) goto failure; alg = p; p += alglen; key = snew(struct ssh2_userkey) msgend - p /* * p has been advanced by openssh_createkey, but * certainly not _beyond_ the end of the buffer. */ assert(p <= msgend); if (msgend < p+4) { key->alg->freekey(key->data);if (msgend < p+commlen) { key->alg->freekey(key->data); sfree(key); goto failure; } int n; n = makekey(p, msgend - p, &reqkey, NULL, 0); if (n < 0) goto failure; if (msgend < p+4) goto failure; b.len = GET_32BIT(p); p += 4; if (msgend < p+b.len) goto failure; b.blob = p; p += b.len; Node-path: putty-branch-0.55/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 4700815c5ec71e2963605fb3c91d2bf1 Text-delta-base-sha1: 506c85ebae888d15581a2a8a3c11ad96a6b3fe50 Text-content-length: 9022 Text-content-md5: 022007a1e7b2828c798958acf690900e Text-content-sha1: ef97f8fa1c71bc6452289324f3dac13d319a02b9 Content-length: 9067 K 15 cvs2svn:cvs-rev V 9 1.311.2.1 PROPS-END SVN,R{ yuLD8^;qE0_4`"c<[%Ls^(mWdM0O=(-!hD/7ayp ssh->pktin.savedpos = 0body = ssh->pktin.dataPacket decode functions for both SSH1 and SSH2. */ static unsigned long sshbodybody[ssh->pktin.savedpos] != 0; ssh->pktin.savedpos++; return value; } static void sshbodybody + ssh->pktin.savedpos); ssh->pktin.savedpos += *length; } static void *ssh_pkt_getdata(Ssh ssh, int length) { if (ssh->pktin.length - ssh->pktin.savedpos < length) return NULL; ssh->pktin.savedpos += length; return ssh->pktin.body + (ssh->pktin.savedpos - length); } static int ssh1_pkt_getrsakey(Ssh ssh, struct RSAKey *key, unsigned char **keystr) { int j; j = makekey(ssh->pktin.body + ssh->pktin.savedpos, ssh->pktin.length - ssh->pktin.savedpos, key, keystr, 0); if (j < 0) return FALSE; ssh->pktin.savedpos += j; assert(ssh->pktin.savedpos < ssh->pktin.length); return TRUE; } static Bignum ssh1_pkt_getmp(Ssh ssh) { int j; Bignum b; j = ssh1_read_bignum(ssh->pktin.body + ssh->pktin.savedpos, ssh->pktin.length - ssh->pktin.savedpos, &b); if (j < 0) return NULL; ssh->pktin.savedpos += j; return b, ret; unsigned char cookie[8], *ptrptr = ssh_pkt_getdata(ssh, 8); if (!ptr) { bombout(("SSH1 public key packet stopped before random cookie")); crStop(0); } memcpy(cookie, ptr, 8); if (!ssh1_pkt_getrsakey(ssh, &servkey, &s->keystr1) || !ssh1_pkt_getrsakey(ssh, &hostkey, &s->keystr2)) { bombout(("SSH1 public key packet stopped before public keys")); crStop(0); }ssh_pkt_getuint32(ssh); s->supported_ciphers_mask = ssh_pkt_getuint32(ssh); s->supported_auths_mask = ssh_pkt_getuint32(sshcookie/* * Verify that the `bits' and `bytes' parameters match. */ if (hostkey.bits > hostkey.bytes * 8 || servkey.bits > servkey.bytes * 8) { bombout(("SSH1 public keys were badly formatted")); crStop(0); }et = rsaencrypt(s->rsabuf, 32, &servkey); if (ret) ret = rsaencrypt(s->rsabuf, servkey.bytes, &hostkey); } else { ret = rsaencrypt(s->rsabuf, 32, &hostkey); if (ret) ret = rsaencrypt(s->rsabuf, hostkey.bytes, &servkey); } if (!ret) { bombout(("SSH1 public key encryptions failed due to bad formatting")); crStop(0); { int n, ok = FALSE; do { /* do while (0) to make breaking easy */ n = ssh1_read_bignum (s->p, s->responselen-(s->p-s->response), &s->key.exponent); if (n < 0) break; s->p += n; n = ssh1_read_bignum (s->p, s->responselen-(s->p-s->response), &s->key.modulus); if (n < 0) break; s->p += n; if (s->responselen - (s->p-s->response) < 4) break; s->commentlen = GET_32BIT(s->p); s->p += 4; if (s->responselen - (s->p-s->response) < s->commentlen) break; s->commentp = (char *)s->p; s->p += s->commentlen; ok = TRUE; } while (0); if (!ok) { logevent("Pageant key list packet was truncated"); break; } }if ((s->challenge = ssh1_pkt_getmp(ssh)) == NULL) { bombout(("Server's RSA challenge was badly formatted")); crStop(0); } char *challenge; int challengelen; ssh_pkt_getstring(ssh, &challenge, &challengelen); if (!challenge) { bombout(("TIS challenge packet was badly formed")); crStop(0); }challengechar *challenge; int challengelen; ssh_pkt_getstring(ssh, &challenge, &challengelen); if (!challenge) { bombout(("CryptoCard challenge packet was badly formed")); crStop(0); }challengeif ((challenge = ssh1_pkt_getmp(ssh)) == NULL) { bombout(("Server's RSA challenge was badly formatted")); crStop(0); }^8r2~ frMI`z{y?ryKw gc5<2tgz`#fHVhgcnMui\Mu g;l(%Qq.>8>wd69UWU-+,/]<:Gw5?`WZmMH#:d;jan@i8*dc;4;jLy$;ZvLy4=";*4@Wuju7i;e@&p;}= ;=w\5Mwz_ N~MJ@ PKT_END); do { crReturnV; } while (!ispkt); if (ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crStopV; } else if (ssh->pktin.type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused port" " forwarding\r\n"); } logevent("Remote port forwarding enabled"); } } } } } Send the pty request. */ send_packet(ssh, SSH1_CMSG_REQUEST_PTY, PKT_STR, ssh->cfg.termtype, PKT_INT, ssh->term_height, PKT_INT, ssh->term_width, PKT_INT, 0, PKT_INT, 0, /* width,height in pixels */ PKT_CHAR, 192, PKT_INT, ssh->ispeed, /* TTY_OP_ISPEED */ PKT_CHAR, 193, PKT_INT, ssh->ospeed, /* TTY_OP_OSPEED */ PKT_CHAR, 0, PKT_END); ssh->state = SSH_STATE_INTERMED; do { crReturnV; } while (!ispkt); if (ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crStopV; } else if (ssh->pktin.type == SSH1_SMSG_FAILURE) { logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)", ssh->ospeed, ssh->ispeed); } else { ssh->editing = ssh->echoing = 1; } if (ssh->cfg.compression) { send_packet(ssh, SSH1_CMSG_REQUEST_COMPRESSION, PKT_INT, 6, PKT_END); do { crReturnV; } while (!ispkt); if (ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crStopV; } else if (ssh->pktin.type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused to compress\r\n"); } logevent("Started compression"); ssh->v1_compressing = TRUE; ssh->cs_comp_ctx = zlib_compress_init(); logevent("Initialised zlib (RFC1950) compression"); ssh->sc_comp_ctx = zlib_decompress_init(); logevent("Initialised zlib (RFC1950) decompression"); } /* * Start the shell or command. * * Special case: if the first-choice command is an SSH2 * subsystem (hence not usable here) and the second choice * exists, we fall strachar *string; int stringlen, bufsize; ssh_pkt_getstring(ssh, &string, &stringlen); if (string == NULL) { bombout(("Incoming terminal data packet was badly formed")); crStopV; } string, string int remoteid = ssh_pkt_getuint32(ssh)remoteidOpening X11 forward connection failed"); sfree(c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, remoteid, PKT_END); } else { logevent ("Opening X11 forward connection succeeded"); c->remoteid = remoteid int remoteid = ssh_pkt_getuint32(ssh)remoteidremoteidremoteid; int hostsize, port; char *host, buf[1024]; const char *e; c = snew(struct ssh_channel); c->ssh = ssh; remoteid = ssh_pkt_getuint32(ssh); ssh_pkt_getstring(ssh, &host, &hostsize); port = ssh_pkt_getuint32(ssh); if (hostsize >= lenof(pf.dhost)) hostsize = lenof(pf.dhost)-1; memcpy(pf.dhost, host, hostsize); pf.dhost[hostsize] = '\0'pf.dremoteidpf.dhost, port); logevent(buf); e = pfd_newconnect(&c->u.pfd.s, pf.dhost, port, remoteid, PKT_END); } else { c->remoteid = remoteidssh_pkt_getuint32(ssh); unsigned int localid = sshsshsshssh_pkt_getuint32(ssh); char *p; int len; struct ssh_channel *c; ssh_pkt_getstring(ssh, &p, &len); p, len); break; case CHAN_SOCKDATA: bufsize = pfd_send(c->u.pfd.s, ssh_pkt_getuint32(ssh_pkt_getstring(ssh, &s->hostkeydata, &s->hostkeylen); s->f = ssh2_pkt_getmp(ssh); ssh_pkt_getstring(ssh, &name, &name_len); ssh_pkt_getstring(ssh, &inst, &inst_len); ssh_pkt_getuint32(ssh); ssh->mainchan->v.v2.remmaxpkt = sshc->v.v2.remwindow += sshX11c->v.v2.remwindow += sshc->v.v2.remwindow += sshptyc->v.v2.remwindow += sshshell/commandssh->pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA && ssh_pkt_getuint32(ssh) != SSH2_EXTENDED_DATA_STDERR) continue; /* extended but not stderr */ sshconfirming this */ c->remoteid = ssh_pkt_getuint32(ssh); c->type = CHAN_SOCKDATA; c->v.v2.remwindow = ssh_pkt_getuint32(ssh); c->v.v2.remmaxpkt = ssh_pkt_getuint32(ssh); ssh_pkt_getstring(ssh, &type, &typelen); c = snew(struct ssh_channel); c->ssh = ssh; remid = ssh_pkt_getuint32(ssh); winsize = ssh_pkt_getuint32(ssh); pktsize = ssh_pkt_getuint32(ssh); if (typelen == 3 && !memcmp(type, "x11", 3)) { char *addrstr; ssh_pkt_getstring(ssh, &dummy, &dummylen);/* skip address */ pf.sport = ssh_pkt_getuint32(ssh); ssh_pkt_getstring(ssh, &peeraddr, &peeraddrlen); peerport = ssh Node-path: putty-branch-0.55/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 6ab1a83101ab35577de990d0afe5c59a Text-delta-base-sha1: de88266c0e71b372683912c1a4d3f0dba2c14bd2 Text-content-length: 100 Text-content-md5: f000acde0a5a241dc4378071c3e7328f Text-content-sha1: 5184de71dccef0a6ef181d414711ae8e72bc5553 Content-length: 144 K 15 cvs2svn:cvs-rev V 8 1.75.2.1 PROPS-END SVN%>lgjvm.cpint lenint len, struct RSAKey *result); int, int maxlenint len Node-path: putty-branch-0.55/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: b32b16c2cc60c810ade6b990cfbc389b Text-delta-base-sha1: 46fbbba752260192f79e0fd27677d34f8b7165b4 Text-content-length: 258 Text-content-md5: 489476143cc1a3910e0c7ae3cc96d5d0 Text-content-sha1: cd9c310e56868fdf1b8af1ea07536e3cc118e659 Content-length: 302 K 15 cvs2svn:cvs-rev V 8 1.29.2.1 PROPS-END SVN>(cuMzxVh, or -1 if there wasn't enough data. */ int ssh1_read_bignum(const unsigned char *data, int len, Bignum * result) { const unsigned char *p = data; int i; int w, b; if (len < 2) return -1len < b+2) return -1; Node-path: putty-branch-0.55/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 38adf51b7451d80629df57a62c16b3ef Text-delta-base-sha1: 7c29c6bf2ccedabf6b886f159202e8fa1091ee18 Text-content-length: 57 Text-content-md5: 8c8bd3892f585405b556a1d7cb9dfd68 Text-content-sha1: 4188d9627919a3398bbcee1f200ea05750312187 Content-length: 101 K 15 cvs2svn:cvs-rev V 8 1.13.2.1 PROPS-END SVN,G $w,nbytes, &ctx->x); /* can't fail */ Node-path: putty-branch-0.55/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 7779df645f1b56ff29f225aed7da2cf2 Text-delta-base-sha1: 3573c231e3e5c2478729adec94d52e3ac7623ba5 Text-content-length: 409 Text-content-md5: df56bf00adb1b2c67b80c33648089b53 Text-content-sha1: 53e8e63e2f9dbc55490c236a77a683106cc99145 Content-length: 453 K 15 cvs2svn:cvs-rev V 8 1.30.2.1 PROPS-END SVNdxS;\.6len, key, NULL, 1); if (j = makeprivate(buf + i, len - i, key); if (j < 0) goto end; i += j; j = ssh1_read_bignum(buf + i, len - i, &key->iqmp); if (j < 0) goto end; i += j; j = ssh1_read_bignum(buf + i, len - i, &key->q); if (j < 0) goto end; i += j; j = ssh1_read_bignum(buf + i, len - i, &key->p); if (j < 0) goto end; i += j Node-path: putty-branch-0.55/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 9ab103e1ac15567531fa2a565573fe5b Text-delta-base-sha1: de0f4659346dd72ffa8964ce9c81d40c2c2dd1f5 Text-content-length: 1174 Text-content-md5: 3ece62bf96bcfe6f90c7d06603c34bfe Text-content-sha1: 19a8baead600df7cdb2acef5a53e1fe8d15071d0 Content-length: 1218 K 15 cvs2svn:cvs-rev V 8 1.39.2.1 PROPS-END SVN}T1Wi} fEfk|{HOq>j|int len, n; if (len < 4) return -1len - { n = ssh1_read_bignum(p, len, result ? &result->exponent : NULL); if (n < 0) return -1; p += n; len -= n; } n = ssh1_read_bignum(p, len, result ? &result->modulus : NULL); if (n < 0) return -1; if (result) result->bytes = n - 2; if (keystr) *keystr = p + 2; p += n; len -= n; if (order == 1) { n = ssh1_read_bignum(p, len, result ? &result->exponent : NULL); if (n < 0) return -1; p += n; len -= n; } return p - data; } int makeprivate(unsigned char *data, int len, struct RSAKey *result) { return ssh1_read_bignum(data, len, &result->private_exponent); } intif (key->bytes < length + 4) return 0; /* RSA key too short! */ return 1, int maxlen) { unsigned char *p = (unsigned char *)data; int n; if (maxlen < 4) return -1; p += 4; /* length word */ maxlen -= 4; n = ssh1_read_bignum(p, maxlen, NULL); /* exponent */ if (n < 0) return -1; p += n; n = ssh1_read_bignum(p, maxlen, NULL); /* modulus */ if (n < 0) return -1; p += n; Revision-number: 4379 Prop-content-length: 169 Content-length: 169 K 7 svn:log V 69 Merged SSH1 robustness changes from 0.55 release branch on to trunk. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-08-01T12:07:11.000000Z PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3ff1c3d580c4d2882d0458a0c3891f71 Text-delta-base-sha1: b5d13cd33140addc0603541f42adc39d93a67312 Text-content-length: 377 Text-content-md5: 549b476f4a35824921bc0e3b7696a79a Text-content-sha1: 2235695de7f14fce5294a810c633cc8d0cf02b66 Content-length: 416 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNn[U/-TH&l l = ssh1_read_bignum(blob + n, bloblen - n, &ssh1key->exponent); if (l < 0) { error = "SSH1 public key blob was too short"; } else { n += l; l = ssh1_read_bignum(blob + n, bloblen - n, &ssh1key->modulus); if (l < 0) { error = "SSH1 public key blob was too short"; } else n += l; } Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b2f4637f204e6308c37db8111fb58749 Text-delta-base-sha1: 7946f86ab9002db3ebc33d08bee667443445bcab Text-content-length: 4341 Text-content-md5: 6ffb4e11b264f79d4b71cf048963d114 Text-content-sha1: 78733d4880957afe0b969fd3fa78b8798888fbc7 Content-length: 4381 K 15 cvs2svn:cvs-rev V 4 1.70 PROPS-END SVN[OM/HTibm}-O%.'BC qSPej}S>u>P?cH:XEj NVZ"W@lMz%LB <zQVs^sC`^V-C}Zint *length); static void *get_keylist2(int *length, keylist&keylistlen&keylistlen); } if (keylist) { if (keylistlen < 4) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } nkeys = GET_32BIT(keylist); p = keylist + 4; keylistlen -= { int n = rsa_public_blob_len(p, keylistlen); if (n < 0) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } p += n; keylistlen -= n; } else { int n; if (keylistlen < 4) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } n = 4 + GET_32BIT(p); if (keylistlen < n) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } p += n; keylistlen -= n; } /* Now skip over comment field */ { int n; if (keylistlen < 4) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } n = 4 + GET_32BIT(p); if (keylistlen < n) { MessageBox(NULL, "Received broken key list?!", APPNAME, MB_OK | MB_ICONERROR); return; } p += n; keylistlen -= n; }reqlen += clen + 4int *length if (length) *length = resplen-5; } else { ret = make_keylist1(lengthint *length request[4] = SSH2_AGENTC_REQUEST2_AGENT if (length) *length = resplen-5; } else { ret = make_keylist2(lengthunsigned char *msgend; int type; /* * Get the message length. */ msgend = p + 4 + GET_32BIT(p); /* * Get the message type. */ if (msgend < p+5) goto failure;i = ssh1_read_bignum(p, msgend - p, &reqkey.exponent); if (i < 0) goto failure; p += i; i = ssh1_read_bignum(p, msgend - p, &reqkey.modulus); if (i < 0) goto failure; p += i; i = ssh1_read_bignum(p, msgend - p, &challenge); if (i < 0) goto failure; p += i; if (msgend < p+16memcpy(response_source + 32, p, 16); p += 16; if (msgend < p+4 || if (msgend < p+4) goto failure; b.len = GET_32BIT(p); p += 4; if (msgend < p+b.len) goto failure; b.blob = p; p += b.len; if (msgend < p+4) goto failure; datalen = GET_32BIT(p); p += 4; if (msgend < p+datalen) goto failure; data = pn, commentlen; n = makekey(p, msgend - p, key, NULL, 1); if (n < 0) { freersakey(key); sfree(key); goto failure; } p += n; n = makeprivate(p, msgend - p, key); if (n < 0) { freersakey(key); sfree(key); goto failure; } p += n; n = ssh1_read_bignum(p, msgend - p, &key->iqmp); /* p^-1 mod q */ if (n < 0) { freersakey(key); sfree(key); goto failure; } p += n; n = ssh1_read_bignum(p, msgend - p, &key->p); /* p */ if (n < 0) { freersakey(key); sfree(key); goto failure; } p += n; n = ssh1_read_bignum(p, msgend - p, &key->q); /* q */ if (n < 0) { freersakey(key); sfree(key); goto failure; } p += n; if (msgend < p+4) { freersakey(key); sfree(key); goto failure; } commentlen = GET_32BIT(p); if (msgend < p+commentlen) { freersakey(key); sfree(key); goto failure; } if (msgend < p+4) goto failure; alglen = GET_32BIT(p); p += 4; if (msgend < p+alglen) goto failure; alg = p; p += alglen; key = snew(struct ssh2_userkey) msgend - p /* * p has been advanced by openssh_createkey, but * certainly not _beyond_ the end of the buffer. */ assert(p <= msgend); if (msgend < p+4) { key->alg->freekey(key->data);if (msgend < p+commlen) { key->alg->freekey(key->data); sfree(key); goto failure; } int n; n = makekey(p, msgend - p, &reqkey, NULL, 0); if (n < 0) goto failure; if (msgend < p+4) goto failure; b.len = GET_32BIT(p); p += 4; if (msgend < p+b.len) goto failure; b.blob = p; p += b.len; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4700815c5ec71e2963605fb3c91d2bf1 Text-delta-base-sha1: 506c85ebae888d15581a2a8a3c11ad96a6b3fe50 Text-content-length: 9022 Text-content-md5: 022007a1e7b2828c798958acf690900e Text-content-sha1: ef97f8fa1c71bc6452289324f3dac13d319a02b9 Content-length: 9063 K 15 cvs2svn:cvs-rev V 5 1.312 PROPS-END SVN,R{ yuLD8^;qE0_4`"c<[%Ls^(mWdM0O=(-!hD/7ayp ssh->pktin.savedpos = 0body = ssh->pktin.dataPacket decode functions for both SSH1 and SSH2. */ static unsigned long sshbodybody[ssh->pktin.savedpos] != 0; ssh->pktin.savedpos++; return value; } static void sshbodybody + ssh->pktin.savedpos); ssh->pktin.savedpos += *length; } static void *ssh_pkt_getdata(Ssh ssh, int length) { if (ssh->pktin.length - ssh->pktin.savedpos < length) return NULL; ssh->pktin.savedpos += length; return ssh->pktin.body + (ssh->pktin.savedpos - length); } static int ssh1_pkt_getrsakey(Ssh ssh, struct RSAKey *key, unsigned char **keystr) { int j; j = makekey(ssh->pktin.body + ssh->pktin.savedpos, ssh->pktin.length - ssh->pktin.savedpos, key, keystr, 0); if (j < 0) return FALSE; ssh->pktin.savedpos += j; assert(ssh->pktin.savedpos < ssh->pktin.length); return TRUE; } static Bignum ssh1_pkt_getmp(Ssh ssh) { int j; Bignum b; j = ssh1_read_bignum(ssh->pktin.body + ssh->pktin.savedpos, ssh->pktin.length - ssh->pktin.savedpos, &b); if (j < 0) return NULL; ssh->pktin.savedpos += j; return b, ret; unsigned char cookie[8], *ptrptr = ssh_pkt_getdata(ssh, 8); if (!ptr) { bombout(("SSH1 public key packet stopped before random cookie")); crStop(0); } memcpy(cookie, ptr, 8); if (!ssh1_pkt_getrsakey(ssh, &servkey, &s->keystr1) || !ssh1_pkt_getrsakey(ssh, &hostkey, &s->keystr2)) { bombout(("SSH1 public key packet stopped before public keys")); crStop(0); }ssh_pkt_getuint32(ssh); s->supported_ciphers_mask = ssh_pkt_getuint32(ssh); s->supported_auths_mask = ssh_pkt_getuint32(sshcookie/* * Verify that the `bits' and `bytes' parameters match. */ if (hostkey.bits > hostkey.bytes * 8 || servkey.bits > servkey.bytes * 8) { bombout(("SSH1 public keys were badly formatted")); crStop(0); }et = rsaencrypt(s->rsabuf, 32, &servkey); if (ret) ret = rsaencrypt(s->rsabuf, servkey.bytes, &hostkey); } else { ret = rsaencrypt(s->rsabuf, 32, &hostkey); if (ret) ret = rsaencrypt(s->rsabuf, hostkey.bytes, &servkey); } if (!ret) { bombout(("SSH1 public key encryptions failed due to bad formatting")); crStop(0); { int n, ok = FALSE; do { /* do while (0) to make breaking easy */ n = ssh1_read_bignum (s->p, s->responselen-(s->p-s->response), &s->key.exponent); if (n < 0) break; s->p += n; n = ssh1_read_bignum (s->p, s->responselen-(s->p-s->response), &s->key.modulus); if (n < 0) break; s->p += n; if (s->responselen - (s->p-s->response) < 4) break; s->commentlen = GET_32BIT(s->p); s->p += 4; if (s->responselen - (s->p-s->response) < s->commentlen) break; s->commentp = (char *)s->p; s->p += s->commentlen; ok = TRUE; } while (0); if (!ok) { logevent("Pageant key list packet was truncated"); break; } }if ((s->challenge = ssh1_pkt_getmp(ssh)) == NULL) { bombout(("Server's RSA challenge was badly formatted")); crStop(0); } char *challenge; int challengelen; ssh_pkt_getstring(ssh, &challenge, &challengelen); if (!challenge) { bombout(("TIS challenge packet was badly formed")); crStop(0); }challengechar *challenge; int challengelen; ssh_pkt_getstring(ssh, &challenge, &challengelen); if (!challenge) { bombout(("CryptoCard challenge packet was badly formed")); crStop(0); }challengeif ((challenge = ssh1_pkt_getmp(ssh)) == NULL) { bombout(("Server's RSA challenge was badly formatted")); crStop(0); }^8r2~ frMI`z{y?ryKw gc5<2tgz`#fHVhgcnMui\Mu g;l(%Qq.>8>wd69UWU-+,/]<:Gw5?`WZmMH#:d;jan@i8*dc;4;jLy$;ZvLy4=";*4@Wuju7i;e@&p;}= ;=w\5Mwz_ N~MJ@ PKT_END); do { crReturnV; } while (!ispkt); if (ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crStopV; } else if (ssh->pktin.type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused port" " forwarding\r\n"); } logevent("Remote port forwarding enabled"); } } } } } Send the pty request. */ send_packet(ssh, SSH1_CMSG_REQUEST_PTY, PKT_STR, ssh->cfg.termtype, PKT_INT, ssh->term_height, PKT_INT, ssh->term_width, PKT_INT, 0, PKT_INT, 0, /* width,height in pixels */ PKT_CHAR, 192, PKT_INT, ssh->ispeed, /* TTY_OP_ISPEED */ PKT_CHAR, 193, PKT_INT, ssh->ospeed, /* TTY_OP_OSPEED */ PKT_CHAR, 0, PKT_END); ssh->state = SSH_STATE_INTERMED; do { crReturnV; } while (!ispkt); if (ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crStopV; } else if (ssh->pktin.type == SSH1_SMSG_FAILURE) { logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)", ssh->ospeed, ssh->ispeed); } else { ssh->editing = ssh->echoing = 1; } if (ssh->cfg.compression) { send_packet(ssh, SSH1_CMSG_REQUEST_COMPRESSION, PKT_INT, 6, PKT_END); do { crReturnV; } while (!ispkt); if (ssh->pktin.type != SSH1_SMSG_SUCCESS && ssh->pktin.type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crStopV; } else if (ssh->pktin.type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused to compress\r\n"); } logevent("Started compression"); ssh->v1_compressing = TRUE; ssh->cs_comp_ctx = zlib_compress_init(); logevent("Initialised zlib (RFC1950) compression"); ssh->sc_comp_ctx = zlib_decompress_init(); logevent("Initialised zlib (RFC1950) decompression"); } /* * Start the shell or command. * * Special case: if the first-choice command is an SSH2 * subsystem (hence not usable here) and the second choice * exists, we fall strachar *string; int stringlen, bufsize; ssh_pkt_getstring(ssh, &string, &stringlen); if (string == NULL) { bombout(("Incoming terminal data packet was badly formed")); crStopV; } string, string int remoteid = ssh_pkt_getuint32(ssh)remoteidOpening X11 forward connection failed"); sfree(c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, remoteid, PKT_END); } else { logevent ("Opening X11 forward connection succeeded"); c->remoteid = remoteid int remoteid = ssh_pkt_getuint32(ssh)remoteidremoteidremoteid; int hostsize, port; char *host, buf[1024]; const char *e; c = snew(struct ssh_channel); c->ssh = ssh; remoteid = ssh_pkt_getuint32(ssh); ssh_pkt_getstring(ssh, &host, &hostsize); port = ssh_pkt_getuint32(ssh); if (hostsize >= lenof(pf.dhost)) hostsize = lenof(pf.dhost)-1; memcpy(pf.dhost, host, hostsize); pf.dhost[hostsize] = '\0'pf.dremoteidpf.dhost, port); logevent(buf); e = pfd_newconnect(&c->u.pfd.s, pf.dhost, port, remoteid, PKT_END); } else { c->remoteid = remoteidssh_pkt_getuint32(ssh); unsigned int localid = sshsshsshssh_pkt_getuint32(ssh); char *p; int len; struct ssh_channel *c; ssh_pkt_getstring(ssh, &p, &len); p, len); break; case CHAN_SOCKDATA: bufsize = pfd_send(c->u.pfd.s, ssh_pkt_getuint32(ssh_pkt_getstring(ssh, &s->hostkeydata, &s->hostkeylen); s->f = ssh2_pkt_getmp(ssh); ssh_pkt_getstring(ssh, &name, &name_len); ssh_pkt_getstring(ssh, &inst, &inst_len); ssh_pkt_getuint32(ssh); ssh->mainchan->v.v2.remmaxpkt = sshc->v.v2.remwindow += sshX11c->v.v2.remwindow += sshc->v.v2.remwindow += sshptyc->v.v2.remwindow += sshshell/commandssh->pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA && ssh_pkt_getuint32(ssh) != SSH2_EXTENDED_DATA_STDERR) continue; /* extended but not stderr */ sshconfirming this */ c->remoteid = ssh_pkt_getuint32(ssh); c->type = CHAN_SOCKDATA; c->v.v2.remwindow = ssh_pkt_getuint32(ssh); c->v.v2.remmaxpkt = ssh_pkt_getuint32(ssh); ssh_pkt_getstring(ssh, &type, &typelen); c = snew(struct ssh_channel); c->ssh = ssh; remid = ssh_pkt_getuint32(ssh); winsize = ssh_pkt_getuint32(ssh); pktsize = ssh_pkt_getuint32(ssh); if (typelen == 3 && !memcmp(type, "x11", 3)) { char *addrstr; ssh_pkt_getstring(ssh, &dummy, &dummylen);/* skip address */ pf.sport = ssh_pkt_getuint32(ssh); ssh_pkt_getstring(ssh, &peeraddr, &peeraddrlen); peerport = ssh Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ab1a83101ab35577de990d0afe5c59a Text-delta-base-sha1: de88266c0e71b372683912c1a4d3f0dba2c14bd2 Text-content-length: 100 Text-content-md5: f000acde0a5a241dc4378071c3e7328f Text-content-sha1: 5184de71dccef0a6ef181d414711ae8e72bc5553 Content-length: 140 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVN%>lgjvm.cpint lenint len, struct RSAKey *result); int, int maxlenint len Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b32b16c2cc60c810ade6b990cfbc389b Text-delta-base-sha1: 46fbbba752260192f79e0fd27677d34f8b7165b4 Text-content-length: 258 Text-content-md5: 489476143cc1a3910e0c7ae3cc96d5d0 Text-content-sha1: cd9c310e56868fdf1b8af1ea07536e3cc118e659 Content-length: 298 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVN>(cuMzxVh, or -1 if there wasn't enough data. */ int ssh1_read_bignum(const unsigned char *data, int len, Bignum * result) { const unsigned char *p = data; int i; int w, b; if (len < 2) return -1len < b+2) return -1; Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 38adf51b7451d80629df57a62c16b3ef Text-delta-base-sha1: 7c29c6bf2ccedabf6b886f159202e8fa1091ee18 Text-content-length: 57 Text-content-md5: 8c8bd3892f585405b556a1d7cb9dfd68 Text-content-sha1: 4188d9627919a3398bbcee1f200ea05750312187 Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN,G $w,nbytes, &ctx->x); /* can't fail */ Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7779df645f1b56ff29f225aed7da2cf2 Text-delta-base-sha1: 3573c231e3e5c2478729adec94d52e3ac7623ba5 Text-content-length: 409 Text-content-md5: df56bf00adb1b2c67b80c33648089b53 Text-content-sha1: 53e8e63e2f9dbc55490c236a77a683106cc99145 Content-length: 449 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVNdxS;\.6len, key, NULL, 1); if (j = makeprivate(buf + i, len - i, key); if (j < 0) goto end; i += j; j = ssh1_read_bignum(buf + i, len - i, &key->iqmp); if (j < 0) goto end; i += j; j = ssh1_read_bignum(buf + i, len - i, &key->q); if (j < 0) goto end; i += j; j = ssh1_read_bignum(buf + i, len - i, &key->p); if (j < 0) goto end; i += j Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9ab103e1ac15567531fa2a565573fe5b Text-delta-base-sha1: de0f4659346dd72ffa8964ce9c81d40c2c2dd1f5 Text-content-length: 1174 Text-content-md5: 3ece62bf96bcfe6f90c7d06603c34bfe Text-content-sha1: 19a8baead600df7cdb2acef5a53e1fe8d15071d0 Content-length: 1214 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN}T1Wi} fEfk|{HOq>j|int len, n; if (len < 4) return -1len - { n = ssh1_read_bignum(p, len, result ? &result->exponent : NULL); if (n < 0) return -1; p += n; len -= n; } n = ssh1_read_bignum(p, len, result ? &result->modulus : NULL); if (n < 0) return -1; if (result) result->bytes = n - 2; if (keystr) *keystr = p + 2; p += n; len -= n; if (order == 1) { n = ssh1_read_bignum(p, len, result ? &result->exponent : NULL); if (n < 0) return -1; p += n; len -= n; } return p - data; } int makeprivate(unsigned char *data, int len, struct RSAKey *result) { return ssh1_read_bignum(data, len, &result->private_exponent); } intif (key->bytes < length + 4) return 0; /* RSA key too short! */ return 1, int maxlen) { unsigned char *p = (unsigned char *)data; int n; if (maxlen < 4) return -1; p += 4; /* length word */ maxlen -= 4; n = ssh1_read_bignum(p, maxlen, NULL); /* exponent */ if (n < 0) return -1; p += n; n = ssh1_read_bignum(p, maxlen, NULL); /* modulus */ if (n < 0) return -1; p += n; Revision-number: 4380 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:37.936005Z PROPS-END Revision-number: 4381 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2004-08-03T08:46:54.000000Z K 7 svn:log V 44 Bump version number ready for 0.55 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.55/LATEST.VER Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 8814e7cef7af6db911a353640fcc7034 Text-delta-base-sha1: 4ec9d70ce529770de4163dc723b8db98a5af79b9 Text-content-length: 15 Text-content-md5: d9a651af38c10465843449c77e105edf Text-content-sha1: fbda8b60944f7ee0866ae08d88d1695eae32702c Content-length: 58 K 15 cvs2svn:cvs-rev V 7 1.3.2.1 PROPS-END SVN0.55 Node-path: putty-branch-0.55/mac/version.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 9fb4337ccf8b433b0e548919bf74aab2 Text-delta-base-sha1: 4d95f05fdd0f69af8e2f337b99259bf13b3ee3b3 Text-content-length: 20 Text-content-md5: bca53e18158f16883cd6187ebac87a9c Text-content-sha1: 669b6633c1ba2ad5bed74efb5ecad88a3f89ac58 Content-length: 63 K 15 cvs2svn:cvs-rev V 7 1.2.2.1 PROPS-END SVN77mIn5 Node-path: putty-branch-0.55/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: eaebaba30c4bef3ae1d6fbcc06e170c3 Text-delta-base-sha1: 473f1419bbb9c862341cb874c30297f9763b569e Text-content-length: 22 Text-content-md5: d3bf60bac6ee0eee7ae4a95b6b5fe8a6 Text-content-sha1: ebf64193022643a13db481659db3cf1b8f30664e Content-length: 65 K 15 cvs2svn:cvs-rev V 7 1.3.2.1 PROPS-END SVN X;Y5 Revision-number: 4382 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2004-08-03T12:07:37.000000Z K 7 svn:log V 93 In usage messages, correct minor discrepancies with reality, and bump version number to 0.55 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.55/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: ec4bb37344764a7b174fb2f5c3ff1b1b Text-delta-base-sha1: 510be06478033174c4b645c3241087f06e3a0ae7 Text-content-length: 97 Text-content-md5: 1af0981de32cc82f594f9919b1cf849d Text-content-sha1: 932e2a7994787ffc56aa3b7bd9c38d9a1dbd2301 Content-length: 141 K 15 cvs2svn:cvs-rev V 8 1.23.2.1 PROPS-END SVN38ET:\versionid $Id: plink.but,v 1.23.2.1 2004/08/03 12:07:37 jacob55print Node-path: putty-branch-0.55/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 39c20c3953554d1f4ae5eb9d1bcdf60d Text-delta-base-sha1: 385a0223ee663e3418939ad1e722af33208864bd Text-content-length: 158 Text-content-md5: a3d5e7df7d4d037a68430dd2d04a9512 Text-content-sha1: 9b5aa6db1cf1fb4f9d5b490c0f0825b0d0a41e5c Content-length: 202 K 15 cvs2svn:cvs-rev V 8 1.28.2.1 PROPS-END SVN8<A98|ACu\versionid $Id: pscp.but,v 1.28.2.1 2004/08/03 12:07:37 jacob55ftp force use of SFTP protocol \c -scp force use of SC Revision-number: 4383 Prop-content-length: 183 Content-length: 183 K 7 svn:log V 83 Merge doc tweak from trunk cvs up -j1.25 -j1.26 using.but [svn merge -r4374:4375] K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-03T12:08:23.000000Z PROPS-END Node-path: putty-branch-0.55/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: aef9e3234e373e3f7da435182604299f Text-delta-base-sha1: 66f08e46f7dafb71e775284f15c3181899df73e9 Text-content-length: 206 Text-content-md5: b32965a012af2322aa9234087b4b87b3 Text-content-sha1: 1b882f1dd84caef610292eea65ce471dc092067a Content-length: 250 K 15 cvs2svn:cvs-rev V 8 1.25.2.1 PROPS-END SVNdq 3%3|K\versionid $Id: using.but,v 1.25.2.1 2004/08/03 12:08:2terminal window, or click the right mouse button on the title bar, you will see the standard Windows system menu containing Revision-number: 4384 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2004-08-03T12:08:23.000000Z K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-55'. K 10 svn:author V 7 cvs2svn PROPS-END Node-path: putty-0.55 Node-kind: dir Node-action: add Node-copyfrom-rev: 4371 Node-copyfrom-path: putty Node-path: putty-0.55/LATEST.VER Node-kind: file Node-action: delete Node-path: putty-0.55/LATEST.VER Node-kind: file Node-action: add Node-copyfrom-rev: 4381 Node-copyfrom-path: putty-branch-0.55/LATEST.VER Text-copy-source-md5: d9a651af38c10465843449c77e105edf Text-copy-source-sha1: fbda8b60944f7ee0866ae08d88d1695eae32702c Node-path: putty-0.55/Recipe Node-kind: file Node-action: delete Node-path: putty-0.55/Recipe Node-kind: file Node-action: add Node-copyfrom-rev: 4374 Node-copyfrom-path: putty-branch-0.55/Recipe Text-copy-source-md5: 97a47dc4695e45719b0f3de2ffb8d893 Text-copy-source-sha1: 2f0f31f6f0fefdeca8d9c3a49ece92a700690c3c Node-path: putty-0.55/cmdgen.c Node-kind: file Node-action: delete Node-path: putty-0.55/cmdgen.c Node-kind: file Node-action: add Node-copyfrom-rev: 4378 Node-copyfrom-path: putty-branch-0.55/cmdgen.c Text-copy-source-md5: 549b476f4a35824921bc0e3b7696a79a Text-copy-source-sha1: 2235695de7f14fce5294a810c633cc8d0cf02b66 Node-path: putty-0.55/config.c Node-kind: file Node-action: delete Node-path: putty-0.55/config.c Node-kind: file Node-action: add Node-copyfrom-rev: 4374 Node-copyfrom-path: putty-branch-0.55/config.c Text-copy-source-md5: 8d05478bbc2194d22768cb06dfe7dd2f Text-copy-source-sha1: 97f122689662153ed9b717a82ee847a2b5f02344 Node-path: putty-0.55/doc/config.but Node-kind: file Node-action: delete Node-path: putty-0.55/doc/config.but Node-kind: file Node-action: add Node-copyfrom-rev: 4374 Node-copyfrom-path: putty-branch-0.55/doc/config.but Text-copy-source-md5: 9fd190c3ece2b4514c4336ffb146d721 Text-copy-source-sha1: 866bbff505d956da7e5933347a5b55d0f4eeb655 Node-path: putty-0.55/doc/plink.but Node-kind: file Node-action: delete Node-path: putty-0.55/doc/plink.but Node-kind: file Node-action: add Node-copyfrom-rev: 4382 Node-copyfrom-path: putty-branch-0.55/doc/plink.but Text-copy-source-md5: 1af0981de32cc82f594f9919b1cf849d Text-copy-source-sha1: 932e2a7994787ffc56aa3b7bd9c38d9a1dbd2301 Node-path: putty-0.55/doc/pscp.but Node-kind: file Node-action: delete Node-path: putty-0.55/doc/pscp.but Node-kind: file Node-action: add Node-copyfrom-rev: 4382 Node-copyfrom-path: putty-branch-0.55/doc/pscp.but Text-copy-source-md5: a3d5e7df7d4d037a68430dd2d04a9512 Text-copy-source-sha1: 9b5aa6db1cf1fb4f9d5b490c0f0825b0d0a41e5c Node-path: putty-0.55/doc/using.but Node-kind: file Node-action: delete Node-path: putty-0.55/doc/using.but Node-kind: file Node-action: add Node-copyfrom-rev: 4383 Node-copyfrom-path: putty-branch-0.55/doc/using.but Text-copy-source-md5: b32965a012af2322aa9234087b4b87b3 Text-copy-source-sha1: 1b882f1dd84caef610292eea65ce471dc092067a Node-path: putty-0.55/ldisc.c Node-kind: file Node-action: delete Node-path: putty-0.55/ldisc.c Node-kind: file Node-action: add Node-copyfrom-rev: 4374 Node-copyfrom-path: putty-branch-0.55/ldisc.c Text-copy-source-md5: 2aa516b69f2f8c865aae0086f186e0e2 Text-copy-source-sha1: 019955be0f85b6dd8ec647bb69a4275a99336513 Node-path: putty-0.55/mac/version.r Node-kind: file Node-action: delete Node-path: putty-0.55/mac/version.r Node-kind: file Node-action: add Node-copyfrom-rev: 4381 Node-copyfrom-path: putty-branch-0.55/mac/version.r Text-copy-source-md5: bca53e18158f16883cd6187ebac87a9c Text-copy-source-sha1: 669b6633c1ba2ad5bed74efb5ecad88a3f89ac58 Node-path: putty-0.55/pageant.c Node-kind: file Node-action: delete Node-path: putty-0.55/pageant.c Node-kind: file Node-action: add Node-copyfrom-rev: 4378 Node-copyfrom-path: putty-branch-0.55/pageant.c Text-copy-source-md5: 6ffb4e11b264f79d4b71cf048963d114 Text-copy-source-sha1: 78733d4880957afe0b969fd3fa78b8798888fbc7 Node-path: putty-0.55/putty.h Node-kind: file Node-action: delete Node-path: putty-0.55/putty.h Node-kind: file Node-action: add Node-copyfrom-rev: 4374 Node-copyfrom-path: putty-branch-0.55/putty.h Text-copy-source-md5: a264731d469e6af606f1edc8113a3bfb Text-copy-source-sha1: cc88a9926f2de0b3d9dbacb6eebe9ee6986d922c Node-path: putty-0.55/putty.iss Node-kind: file Node-action: delete Node-path: putty-0.55/putty.iss Node-kind: file Node-action: add Node-copyfrom-rev: 4381 Node-copyfrom-path: putty-branch-0.55/putty.iss Text-copy-source-md5: d3bf60bac6ee0eee7ae4a95b6b5fe8a6 Text-copy-source-sha1: ebf64193022643a13db481659db3cf1b8f30664e Node-path: putty-0.55/settings.c Node-kind: file Node-action: delete Node-path: putty-0.55/settings.c Node-kind: file Node-action: add Node-copyfrom-rev: 4374 Node-copyfrom-path: putty-branch-0.55/settings.c Text-copy-source-md5: 48c60ec665e9f1576da492789f6d4c37 Text-copy-source-sha1: 885dd6dba069516b8f3d4e61ef97b2dca445f2fe Node-path: putty-0.55/ssh.c Node-kind: file Node-action: delete Node-path: putty-0.55/ssh.c Node-kind: file Node-action: add Node-copyfrom-rev: 4378 Node-copyfrom-path: putty-branch-0.55/ssh.c Text-copy-source-md5: 022007a1e7b2828c798958acf690900e Text-copy-source-sha1: ef97f8fa1c71bc6452289324f3dac13d319a02b9 Node-path: putty-0.55/ssh.h Node-kind: file Node-action: delete Node-path: putty-0.55/ssh.h Node-kind: file Node-action: add Node-copyfrom-rev: 4378 Node-copyfrom-path: putty-branch-0.55/ssh.h Text-copy-source-md5: f000acde0a5a241dc4378071c3e7328f Text-copy-source-sha1: 5184de71dccef0a6ef181d414711ae8e72bc5553 Node-path: putty-0.55/sshbn.c Node-kind: file Node-action: delete Node-path: putty-0.55/sshbn.c Node-kind: file Node-action: add Node-copyfrom-rev: 4378 Node-copyfrom-path: putty-branch-0.55/sshbn.c Text-copy-source-md5: 489476143cc1a3910e0c7ae3cc96d5d0 Text-copy-source-sha1: cd9c310e56868fdf1b8af1ea07536e3cc118e659 Node-path: putty-0.55/sshdh.c Node-kind: file Node-action: delete Node-path: putty-0.55/sshdh.c Node-kind: file Node-action: add Node-copyfrom-rev: 4378 Node-copyfrom-path: putty-branch-0.55/sshdh.c Text-copy-source-md5: 8c8bd3892f585405b556a1d7cb9dfd68 Text-copy-source-sha1: 4188d9627919a3398bbcee1f200ea05750312187 Node-path: putty-0.55/sshpubk.c Node-kind: file Node-action: delete Node-path: putty-0.55/sshpubk.c Node-kind: file Node-action: add Node-copyfrom-rev: 4378 Node-copyfrom-path: putty-branch-0.55/sshpubk.c Text-copy-source-md5: df56bf00adb1b2c67b80c33648089b53 Text-copy-source-sha1: 53e8e63e2f9dbc55490c236a77a683106cc99145 Node-path: putty-0.55/sshrsa.c Node-kind: file Node-action: delete Node-path: putty-0.55/sshrsa.c Node-kind: file Node-action: add Node-copyfrom-rev: 4378 Node-copyfrom-path: putty-branch-0.55/sshrsa.c Text-copy-source-md5: 3ece62bf96bcfe6f90c7d06603c34bfe Text-copy-source-sha1: 19a8baead600df7cdb2acef5a53e1fe8d15071d0 Node-path: putty-0.55/terminal.c Node-kind: file Node-action: delete Node-path: putty-0.55/terminal.c Node-kind: file Node-action: add Node-copyfrom-rev: 4374 Node-copyfrom-path: putty-branch-0.55/terminal.c Text-copy-source-md5: 23e13731453311231e8c45fd323dbcb4 Text-copy-source-sha1: e138d7dbfd0f3c9b47a9798f9627461940083600 Node-path: putty-0.55/terminal.h Node-kind: file Node-action: delete Node-path: putty-0.55/terminal.h Node-kind: file Node-action: add Node-copyfrom-rev: 4374 Node-copyfrom-path: putty-branch-0.55/terminal.h Text-copy-source-md5: 9929db90221cebfe5628262a0cec1b4f Text-copy-source-sha1: 1c03c19c4e9f9481a42cf17f2e59c8b7d6f7fec7 Node-path: putty-0.55/window.c Node-kind: file Node-action: delete Node-path: putty-0.55/window.c Node-kind: file Node-action: add Node-copyfrom-rev: 4374 Node-copyfrom-path: putty-branch-0.55/window.c Text-copy-source-md5: 4b5bce5c20b706caca466667f0d9128e Text-copy-source-sha1: 30afb483c4d4a9481b19b9cba5bc90206ccb6199 Node-path: putty-0.55/winhelp.h Node-kind: file Node-action: delete Node-path: putty-0.55/winhelp.h Node-kind: file Node-action: add Node-copyfrom-rev: 4374 Node-copyfrom-path: putty-branch-0.55/winhelp.h Text-copy-source-md5: 6d1b35f76c86c783c3861eaa3392e508 Text-copy-source-sha1: 54ba782b4ec06529b507bbf4b00cdeccfcc2a04b Node-path: putty-0.55/minibidi.h Node-action: delete Node-path: putty-0.55/minibidi.c Node-action: delete Revision-number: 4385 Prop-content-length: 184 Content-length: 184 K 7 svn:log V 84 Merge minor usage message tweaks (but not version number changes) from branch-0-55. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-03T13:23:48.000000Z PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ec4bb37344764a7b174fb2f5c3ff1b1b Text-delta-base-sha1: 510be06478033174c4b645c3241087f06e3a0ae7 Text-content-length: 85 Text-content-md5: 75461a59673d95f2fee619b64f60a89f Text-content-sha1: e785301862e42ef075de69a0cebfbf13b428cd53 Content-length: 125 K 15 cvs2svn:cvs-rev V 4 1.24 PROPS-END SVN34 ?\:\versionid $Id: plink.but,v 1.24 2004/08/03 13:23:48 jacobprint Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 39c20c3953554d1f4ae5eb9d1bcdf60d Text-delta-base-sha1: 385a0223ee663e3418939ad1e722af33208864bd Text-content-length: 145 Text-content-md5: 7a3180b37ac7d10c727f33e9154a625e Text-content-sha1: e67bbc6cc38606d91b1d1d3856abc52d0a96d07c Content-length: 185 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVN88 z{9ACu\versionid $Id: pscp.but,v 1.29 2004/08/03 13:23:48 jacobftp force use of SFTP protocol \c -scp force use of SC Revision-number: 4386 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2004-08-03T18:51:17.000000Z K 7 svn:log V 34 Website updates for 0.55 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2a0a90a75613d8b39e7f1b73c46f8e4a Text-delta-base-sha1: 13732ae667994d102086d7886dd3ab40dc0aa193 Text-content-length: 1058 Text-content-md5: bd420d9684bf8749b9f94ac7ec57b73d Text-content-sha1: 39acfdbe5f0db942bb8eea3338727cb20d5955da Content-length: 1098 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVN, UPC5 (released 2004-08-03):

    • Security fix: a vulnerability discovered by Core Security Technologies (advisory number CORE-2004-0705), potentially allowing arbitrary code execution on the client by a malicious server before host key verification, has been fixed.
    • Bug fix: General robustness of the SSH1 implementation has been improved, which may have fixed further potential security problems although we are not aware of any specific ones.
    • Bug fix: Random noise generation was hanging some computers and interfering with other processes' precision timing, and should now not do so.
    • Bug fix: dead key support should work better.
    • Bug fix: a terminal speed is now sent to the SSH server.
    • Bug fix: removed a spurious diagnostic message in Plink.
    • Bug fix: the `-load' option in PSCP and PSFTP should work better.
    • Bug fix: X forwarding on the Unix port can now talk to Unix sockets as well as TCP sockets.
    • Bug fix: various crashes and assertion failures fixed..

    These features we Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 21029631397ff1387dd70965ff90237f Text-delta-base-sha1: 8ad766abf6a61f2a41162411c2c9b35c8d804c5f Text-content-length: 205 Text-content-md5: dde59dbd6245d8ea2cedd3d85ebe02b7 Text-content-sha1: c64586be5c81269f69bd49922a2b593411a2bbe6 Content-length: 245 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN 5 !"]j1Z' T>O?Q@!k55-installer.exe">putty-0.55-installerutty-0.555-installerutty-0.555.tar.gz">putty-0.55.tar.gzputty-0.55.tar.gzputty-0.55.tar.gzputty-0.55 Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 55d5ee4d9d3326cea9e9a97d0f5bb49f Text-delta-base-sha1: af50d80f54ef4c77c6308f72e2f50e5f38307ca9 Text-content-length: 22 Text-content-md5: 8d38647697981ae53e2b31c96e5d2a6d Text-content-sha1: c8407d60c8e3679b10ffe6f38affde7af9a9b3e8 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN i5 Revision-number: 4387 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2004-08-03T18:51:36.000000Z K 7 svn:log V 22 More website updates. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 249c3578b1fe7c4fa279cd8cbe7fdb3a Text-delta-base-sha1: 2236c8b4e3ef250d5c8b3b59ea3651b116b4583b Text-content-length: 90 Text-content-md5: 60c194515b715dda17b9c8d5c8b97006 Text-content-sha1: d8f243e049ae42ab84c2a9961e779b000a4d4f85 Content-length: 129 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNV% D7D*,temp /~sgtatham/putty/0.55/ http://the.earth.li/~sgtatham/putty/0.55 Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 66b0b575765d8dd98b7e4256d9602821 Text-delta-base-sha1: 82320d94d2b6b68f4838c882f83498cf0bd83ec7 Text-content-length: 307 Text-content-md5: 4c89bf9923a89d93d1a7e51e652934c3 Text-content-sha1: fc4fd5c8abdbbe9323f725aac5c3e1fa13b8dc5f Content-length: 347 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVNSq nhkli>Safe Passage, an alternative to PuTTY's dynamic port forwarding which doesn't require SOCKS support in your client applications (it seems to install itself somehow at the Windows networking level). Based on the PuTTY code. Commercial, but cheap Revision-number: 4388 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2004-08-03T18:52:20.000000Z K 7 svn:log V 17 Update for 0.55. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 649a3ee6fb5650f4bb47c9377e41a37e Text-delta-base-sha1: 6d44bef7f673475fcb7970fbd4a4691296bcdce3 Text-content-length: 109 Text-content-md5: 427aa56d7eef5415ddb6704e1200aff8 Text-content-sha1: 48730a0b579fd477c66836c5df26eba9b88043d5 Content-length: 149 K 15 cvs2svn:cvs-rev V 4 1.31 PROPS-END SVN ? VB8B1o#! /usr/bin/perl # $Id: bugs2html,v 1.31 2004/08/03 18:52:20 simon5", "2004-08-02" ] Revision-number: 4389 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2004-08-03T19:07:41.000000Z K 7 svn:log V 27 Fix syntax error. Oops :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 427aa56d7eef5415ddb6704e1200aff8 Text-delta-base-sha1: 48730a0b579fd477c66836c5df26eba9b88043d5 Text-content-length: 83 Text-content-md5: ff8dbf44d44a996bd693b2a03ec02c02 Text-content-sha1: f5af830887500781892cdbab6099c1cd77c04306 Content-length: 123 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN?@ =R<1#! /usr/bin/perl # $Id: bugs2html,v 1.32 2004/08/03 19:07:41, Revision-number: 4390 Prop-content-length: 159 Content-length: 159 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-03T19:08:57.000000Z K 7 svn:log V 59 Mention that Arabeyes code is now in CVS, but not in 0.55. PROPS-END Node-path: putty-wishlist/data/bidi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 89d9d6cabec8888de25c506bdddcc8df Text-delta-base-sha1: 43219aeee3237966fb89b89c23681b6b82696d8d Text-content-length: 186 Text-content-md5: 6025a206c406c74c42de090d80ba50f3 Text-content-sha1: a6c14716195cdffe9ef6bada1f4a6613a5f38663 Content-length: 225 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNAe $@$@ As of 2004-05-23, their initial code is in the PuTTY snapshots; however it was not released in the 0.55 bugfix release due to stability issues. this code Revision-number: 4391 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2004-08-03T19:13:04.000000Z K 7 svn:log V 72 A security hole like this is probably worth putting in the Latest News. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8d38647697981ae53e2b31c96e5d2a6d Text-delta-base-sha1: c8407d60c8e3679b10ffe6f38affde7af9a9b3e8 Text-content-length: 571 Text-content-md5: d85fd5444870adc3d946a1c04a619ada Text-content-sha1: 52a6cdd5d4a647d049df26a085839bdcf0ea25b4 Content-length: 611 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN5 #~#r4-08-03 SECURITY HOLE, fixed in PuTTY 0.55

    PuTTY 0.55, released today, fixes a serious security hole which may allow a server to execute code of its choice on a PuTTY client connecting to it. In SSH2, the attack can be performed before host key verification, meaning that even if you trust the server you think you are connecting to, a different machine could be impersonating it and could launch the attack before you could tell the difference. We recommend everybody upgrade to 0.55 as soon as possible. Revision-number: 4392 Prop-content-length: 316 Content-length: 316 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-03T23:43:07.000000Z K 7 svn:log V 215 When using remote forwarding with SSH-1, you'd get bogus 'SSH1 cannot handle source address spec ":10023"; ignoring' type errors in the Event Log. The forwarding would go ahead as normal so this is cosmetic. Fixed. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 022007a1e7b2828c798958acf690900e Text-delta-base-sha1: ef97f8fa1c71bc6452289324f3dac13d319a02b9 Text-content-length: 44 Text-content-md5: 8dfffc4efda462f37d1dfdab0358c880 Text-content-sha1: cebe9a5a22072d914271243a33aea4d94a985260 Content-length: 85 K 15 cvs2svn:cvs-rev V 5 1.313 PROPS-END SVN E:E*898 Revision-number: 4393 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:38.947678Z PROPS-END Revision-number: 4394 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:38.957070Z PROPS-END Revision-number: 4395 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2004-08-04T15:59:04.000000Z K 7 svn:log V 98 First pass at pruning: remove all mirrors which are grievously out of date (over two months old). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4ebd57b5a19cb808defba47527065ef9 Text-delta-base-sha1: 3a47d94b6ce4bc7ed8adb2459227119def4f8ef0 Text-content-length: 332 Text-content-md5: 9648ec9f1bdf279051a1dd2f303cf24f Text-content-sha1: 1f12a9ebffa6c7f59485bf6db011be140a476ee4 Content-length: 372 K 15 cvs2svn:cvs-rev V 4 1.91 PROPS-END SVN.d[`Va+I{k8J?j9V;K m5A@g~zOh7I@RS6e<~putty.activalink.net/">putty.activalink.netputty.hichac.de/">putty.hichac.delobnix.org/">putty.globnix.orggnu.kookel.org/ftp/putty/">gnu.kookelwww.putty.spb.ru/">www.putty.spb.ru in Russiaduplo.org/putty/">duplo.org Revision-number: 4396 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2004-08-04T16:12:54.000000Z K 7 svn:log V 37 Add guidance on how often to mirror. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9648ec9f1bdf279051a1dd2f303cf24f Text-delta-base-sha1: 1f12a9ebffa6c7f59485bf6db011be140a476ee4 Text-content-length: 121 Text-content-md5: 9490370ea91fc256087658fe4423a8c0 Text-content-sha1: 34a2021909949b582944fa617efd18072348ecdd Content-length: 161 K 15 cvs2svn:cvs-rev V 4 1.92 PROPS-END SVN. c;c{3e normally suggest that mirrors are updated around once a week, and no less often than once a month Revision-number: 4397 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2004-08-04T16:24:52.000000Z K 7 svn:log V 25 Reinstate simplygeek.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9490370ea91fc256087658fe4423a8c0 Text-delta-base-sha1: 34a2021909949b582944fa617efd18072348ecdd Text-content-length: 75 Text-content-md5: ea533ceae5ba9cbea9770dadc2bcf5a1 Text-content-sha1: f433d27ae83048169ad3721fd467b361af652e40 Content-length: 115 K 15 cvs2svn:cvs-rev V 4 1.93 PROPS-END SVN21Dh1simplygeek.com/mirrors/putty/">simplygeek.com Revision-number: 4398 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:39.121676Z PROPS-END Revision-number: 4399 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:39.130679Z PROPS-END Revision-number: 4400 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:39.140592Z PROPS-END Revision-number: 4401 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:39.149793Z PROPS-END Revision-number: 4402 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2004-08-04T18:47:49.000000Z K 7 svn:log V 26 Reinstate chefax.fe.up.pt K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ea533ceae5ba9cbea9770dadc2bcf5a1 Text-delta-base-sha1: f433d27ae83048169ad3721fd467b361af652e40 Text-content-length: 65 Text-content-md5: 7acf74e2b496410da5e9c54c4e4aed95 Text-content-sha1: 9607bb268182b38a78d0b0b6bfdd98a36c0b89ef Content-length: 105 K 15 cvs2svn:cvs-rev V 4 1.94 PROPS-END SVN ,8Wchefax.fe.up.pt/putty/">chefax.fe.up.pt Revision-number: 4403 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2004-08-04T21:52:32.000000Z K 7 svn:log V 51 Add link to CORE advisory now it's been published. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: bd420d9684bf8749b9f94ac7ec57b73d Text-delta-base-sha1: 39acfdbe5f0db942bb8eea3338727cb20d5955da Text-content-length: 258 Text-content-md5: ce656c0cff2352149a38a12c5a5a64ae Text-content-sha1: 0b8192fefb20930d82b9247574d9c3fd4dec3d65 Content-length: 298 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVN, gOgIc CORE-2004-0705), potentially allowing arbitrary code execution on the client by a malicious server before host key verification, has been Revision-number: 4404 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Add bug database entries for the two vulnerabilities fixed in 0.55. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-08-05T09:40:42.000000Z PROPS-END Node-path: putty-wishlist/data/vuln-modpow Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 3907 Text-content-md5: a071039e68936423c1e534ee4a01484e Text-content-sha1: 5186d0a9abc1a1fe96faa580a45f6b78e2ce5767 Content-length: 4023 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN555Summary: Vulnerability: serious buffer management bug in modpow() Class: bug Difficulty: fun Priority: high Present-in: 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.53b 0.54 Fixed-in: 0.55 Content-type: text/x-html-body

    All versions of the PuTTY suite prior to 0.55 have a memory corruption vulnerability in the modpow() function.

    This function performs modular exponentiation: it takes three arguments base, exp and mod, and it raises base to the power exp modulo mod.

    Unfortunately, it fails to check that base is at most the same size as mod. By arranging for base to be significantly bigger than mod, an attacker can cause the modpow() function to write memory before the beginning of one of its working buffers. The data written to that memory is taken from the base argument itself, so if an attacker can control this value then they can write data of their choice to PuTTY's memory.

    (We are not aware of an actual exploit having been written for this bug, so we cannot be absolutely certain that it can be realistically exploited. It might be, for example, that no particularly sensitive data happens to be within range of the underflowing buffer. However, it would be incautious not to assume the worst and treat this as a potentially disastrous attack.)

    The obvious fix is for modpow() to reduce base modulo mod as the very first thing it does, thus preserving the mathematical correctness of the function (and improving performance if anyone should use an overlong base for a legitimate reason!). PuTTY release 0.55 implements this fix, and is believed not to be vulnerable.

    This bug is EXTREMELY SEVERE in SSH2. SSH2 uses Diffie-Hellman key exchange, in which each of client and server sends a large number to the other, and each one performs a modpow operation using that large number as the base. In other words, a malicious server can exploit this bug during the initial key exchange phase, before the client has received and verified a host key signature. So this attack can be performed by a man-in-the-middle between the SSH client and server, and the normal host key protections against MITM attacks are bypassed. Even if you trust the server you think you are connecting to, you are not safe.

    The bug is of more limited impact in SSH1. In SSH1, all the modpow operations performed during key exchange involve the client inventing base, while the server provides exp and mod. Therefore, a malicious server cannot exploit this bug during SSH1 key exchange. They can only exploit it during public key authentication, in which the server sends an RSA-encrypted value and the client performs a modpow to decrypt it. This means that the only servers which can attack you through this bug are servers you trust, since by the time the server can mount this attack it must already have proved that it holds an acceptable host key. Also, if you use SSH1 but do not use public-key authentication, there is no longer any opening for the server to exploit this bug.

    However, see vuln-ssh1-kex for another potential problem in SSH1 key exchange. Even SSH1 users who do not use public-key authentication should upgrade.

    This bug was discovered by Core Security Technologies, and documented in their advisory CORE-2004-0705. It is also mentioned in an advisory by Secunia, numbered SA12212. Node-path: putty-wishlist/data/vuln-ssh1-kex Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 2820 Text-content-md5: cef1106337ae3d058baa5968073f7007 Text-content-sha1: 825dd8ecc9a8a07b188ff2bcd0493ec893f2b2df Content-length: 2936 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNvvvSummary: Vulnerability: buffer management bug in SSH1 key exchange Class: bug Difficulty: fun Priority: high Present-in: 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.53b 0.54 Fixed-in: 0.55 Content-type: text/x-html-body

    All versions of the PuTTY suite prior to 0.55 have a memory corruption bug in SSH1 key exchange, which might lead to a security vulnerability.

    The bug lies in the rsaencrypt() function, which performs RSA encryption with PKCS#1 v1.5 padding, as used in the SSH1 key exchange. This function assumes that the data to be encrypted is smaller than the modulus of the public key. If this is not the case, the memmove() operation at the start of the function will overwrite memory before the input buffer.

    A malicious server can trigger this bug by sending an unexpectedly small public key modulus. However, it is not clear that the server can exploit this bug to take control of the client, since the data written beyond the buffer is part of the cleartext invented by the client, not part of the key modulus sent by the server. I (SGT) doubt that a server can do much more than cause the client to crash by exploiting this bug.

    Nonetheless, that's more than a server should be able to do, and it is just possible that there is a more damaging exploit in spite of appearances, so this is still a serious bug that needs fixing. PuTTY release 0.55 fixes it by having rsaencrypt() explicitly check that the public key is long enough to allow the encryption of the supplied data.

    Although PuTTY verifies the server's host key against its Registry cache before performing the vulnerable encryption operation, this does not protect you from a spoofed server or man-in-the-middle attack. SSH1 involves two public keys: a server key (changed every hour, for forward security) and a host key (never changed, for server authentication). Some data is encrypted using both keys, and then the server proves its identity by decrypting it. So a MITM can send a maliciously shortened server key and the correct host key; the fact that it does not have the private half of the host key will not matter, since by the time it is challenged to prove its identity by decrypting the doubly encrypted data, the short server key will have already triggered the bug and the damage will be done.

    This bug was discovered by Core Security Technologies, and documented in their advisory CORE-2004-0705. It is also mentioned in an advisory by Secunia, numbered SA12212. Revision-number: 4405 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2004-08-05T12:48:36.000000Z K 7 svn:log V 32 Reinstate more updated mirrors. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7acf74e2b496410da5e9c54c4e4aed95 Text-delta-base-sha1: 9607bb268182b38a78d0b0b6bfdd98a36c0b89ef Text-content-length: 309 Text-content-md5: 5fbcf9093029ac3ce52efbd78e3f3cc9 Text-content-sha1: 2932d9e7f2bfa980d8fd8c215975dbe62f85a253 Content-length: 349 K 15 cvs2svn:cvs-rev V 4 1.95 PROPS-END SVNI"<0{PvQ3IB?scarlet.be/">putty.scarlet.be in Belgiummirror.nimsay-networks.com/putty/">mirror.nimsay-networks.comvery.rulez.org/">putty.very.rulez.org in Hungary. [ :-) ] gaesi.org/">putty.gaesi.org putty.lxnt.info/">putty.lxnt.info in Russ Revision-number: 4406 Prop-content-length: 104 Content-length: 104 K 8 svn:date V 27 2004-08-05T13:39:59.000000Z K 7 svn:log V 5 Typo K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/mazovia Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d0382ad8751db40fd0e16d9b014828f1 Text-delta-base-sha1: d1a32e227748c012c3f070fb2b718788d3efb8e5 Text-content-length: 22 Text-content-md5: 56629ec0b29a296154e5e95799854545 Text-content-sha1: 2a49b4acb7a9e92d4123a9a6afa0fad6999888a3 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNcc PF Revision-number: 4407 Prop-content-length: 201 Content-length: 201 K 8 svn:date V 27 2004-08-05T14:10:24.000000Z K 7 svn:log V 100 Fix for `mazovia': add Mazovia translation table based on info from Slawomir Oczkowski and "Diron". K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9043a4d0ff99b27a9d4b62fc9c9a8db5 Text-delta-base-sha1: 2ac4ed5c2c360d6290e70e3710115910b3460806 Text-content-length: 1519 Text-content-md5: 991d965ab6f74cc80c51c452c0a95aa6 Text-content-sha1: 8e9603381060ddcc27e0f3863d6f14194264c5f7 Content-length: 1559 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNtOK,Wa/* Mazovia (Polish) aka CP620 * from "Mazowia to Unicode table", 04/24/96, Mikolaj Jedrzejak */ static const wchar_t mazovia[] = { /* Code point 0x9B is "zloty" symbol (zŽ), which is not * widely used and for which there is no Unicode equivalent. * One reference shows 0xA8 as U+00A7 SECTION SIGN, but we're * told that's incorrect. */ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x0105, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0107, 0x00C4, 0x0104, 0x0118, 0x0119, 0x0142, 0x00F4, 0x00F6, 0x0106, 0x00FB, 0x00F9, 0x015a, 0x00D6, 0x00DC, 0xFFFD, 0x0141, 0x00A5, 0x015b, 0x0192, 0x0179, 0x017b, 0x00F3, 0x00d3, 0x0144, 0x0143, 0x017a, 0x017c, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0620 (Mazovia)", 0, 128, mazovia Revision-number: 4408 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2004-08-05T14:11:17.000000Z K 7 svn:log V 70 We've got the missing info from correspondents, so this is now fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/mazovia Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 56629ec0b29a296154e5e95799854545 Text-delta-base-sha1: 2a49b4acb7a9e92d4123a9a6afa0fad6999888a3 Text-content-length: 290 Text-content-md5: 0c47b7129efc0ab96047d2c19539c20e Text-content-sha1: 5287978b8b3958f66c929a5a0cc27123820f4c06 Content-length: 329 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNcb vXW{y"IraFixed-in: 2004-08-06Most of the translation table from Mazovia to Unicode is based on the mazovia translation table that was availwere a couple of questionable code pointsMappedSomeone from .pltells us the former is correct. Revision-number: 4409 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2004-08-05T22:13:26.000000Z K 7 svn:log V 44 ftp://cdot.senecac.on.ca/pub/software/putty K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5fbcf9093029ac3ce52efbd78e3f3cc9 Text-delta-base-sha1: 2932d9e7f2bfa980d8fd8c215975dbe62f85a253 Text-content-length: 78 Text-content-md5: d27bdda3bf352f378a1cd6bc117de277 Text-content-sha1: eaa4b4de8223f0dc48e0018ed3a1d6a73505b1ea Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.96 PROPS-END SVNI& 9F'"cdot.senecac.on.ca/pub/software/putty">cdot.senecac.on.ca Revision-number: 4410 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:39.523447Z PROPS-END Revision-number: 4411 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:39.532279Z PROPS-END Revision-number: 4412 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:39.541352Z PROPS-END Revision-number: 4413 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2004-08-06T10:55:23.000000Z K 7 svn:log V 26 Reinstate putty.fyxm.net. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d27bdda3bf352f378a1cd6bc117de277 Text-delta-base-sha1: eaa4b4de8223f0dc48e0018ed3a1d6a73505b1ea Text-content-length: 66 Text-content-md5: b333200b998abc16688590645647731a Text-content-sha1: 6a02c6655536ab40dca3e066c815a4f64e2b5d4c Content-length: 106 K 15 cvs2svn:cvs-rev V 4 1.97 PROPS-END SVN& -F`putty.fyxm.net/">putty.fyxm.net in Slovak Revision-number: 4414 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2004-08-06T11:00:10.000000Z K 7 svn:log V 31 Reinstate gulus.usherbrooke.ca K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b333200b998abc16688590645647731a Text-delta-base-sha1: 6a02c6655536ab40dca3e066c815a4f64e2b5d4c Text-content-length: 87 Text-content-md5: e6bd2ea0ed972180d9ab40bafee2b84d Text-content-sha1: dbfe7e80eaf544897cb2de90140bd8d241c62ccd Content-length: 127 K 15 cvs2svn:cvs-rev V 4 1.98 PROPS-END SVN>NIyBNgulus.USherbrooke.ca/pub/appl/ssh/putty/">gulus.usherbrooke.ca Revision-number: 4415 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2004-08-06T11:29:03.000000Z K 7 svn:log V 68 New mirror: mirror.internet.tp (which is in France, not East Timor) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e6bd2ea0ed972180d9ab40bafee2b84d Text-delta-base-sha1: dbfe7e80eaf544897cb2de90140bd8d241c62ccd Text-content-length: 84 Text-content-md5: 1a0414a448e9a1232b9d57aecbc681e9 Text-content-sha1: 4bfe3d0e04833df45925836dda3e7a5b83954aea Content-length: 124 K 15 cvs2svn:cvs-rev V 4 1.99 PROPS-END SVN ;dA-jmirror.internet.tp/putty/">mirror.internet.tp in France Revision-number: 4416 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2004-08-06T11:53:18.000000Z K 7 svn:log V 13 remove cruft K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/bidi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6025a206c406c74c42de090d80ba50f3 Text-delta-base-sha1: a6c14716195cdffe9ef6bada1f4a6613a5f38663 Text-content-length: 15 Text-content-md5: 13b5c921de7c2f527fcf0a7e1d3e1fdc Text-content-sha1: a6e86ea1d247f878734b062467853c064932c909 Content-length: 54 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNeZZ Revision-number: 4417 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:39.714927Z PROPS-END Revision-number: 4418 Prop-content-length: 173 Content-length: 173 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-07T02:31:57.000000Z K 7 svn:log V 73 Suggest that mirror maintainers may want to subscribe to putty-announce. PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1a0414a448e9a1232b9d57aecbc681e9 Text-delta-base-sha1: 4bfe3d0e04833df45925836dda3e7a5b83954aea Text-content-length: 133 Text-content-md5: 966791c6e378f464858e1fb29df030c1 Text-content-sha1: 4689a9e8fca6f8e68b65d0736fe39d536d5b0e68 Content-length: 174 K 15 cvs2svn:cvs-rev V 5 1.100 PROPS-END SVN } oo{ You can also subscribe to our mailing list to receive notification of new releases Revision-number: 4419 Prop-content-length: 136 Content-length: 136 K 7 svn:log V 36 Reinstate putty.shortcircuit.net.au K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-07T02:35:59.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 966791c6e378f464858e1fb29df030c1 Text-delta-base-sha1: 4689a9e8fca6f8e68b65d0736fe39d536d5b0e68 Text-content-length: 106 Text-content-md5: 5aa899a7f3270a565bea5eda24728755 Text-content-sha1: 12c35cdac5362edaad161e7ce1acf4fe3154a283 Content-length: 147 K 15 cvs2svn:cvs-rev V 5 1.101 PROPS-END SVN}~ T`TJ3shortcircuit.net.au/">putty.shortcircuit.net.au in Australia. Revision-number: 4420 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2004-08-07T14:55:27.000000Z K 7 svn:log V 25 Mention stable OSVDB ID. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-modpow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: a071039e68936423c1e534ee4a01484e Text-delta-base-sha1: 5186d0a9abc1a1fe96faa580a45f6b78e2ce5767 Text-content-length: 96 Text-content-md5: ecc4dfe0c88112863e979ba72c562cca Text-content-sha1: c6cae7fa3abee74d2b6721216796d91c23201741 Content-length: 135 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN5O3O, and has been assigned OSVDB ID 8299. Revision-number: 4421 Prop-content-length: 264 Content-length: 264 K 8 svn:date V 27 2004-08-07T15:46:16.000000Z K 7 svn:log V 163 Add new class `vulnerability', and special highlighting / sections for it. Reclassify existing vulnerabilities. (Also cosmetically reorder versions in bugs2html.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ff8dbf44d44a996bd693b2a03ec02c02 Text-delta-base-sha1: f5af830887500781892cdbab6099c1cd77c04306 Text-content-length: 1269 Text-content-md5: 9e6beeddf7a0af1fcd35be282d267177 Text-content-sha1: a2b8785c2b2a83890f20d10ca8f8e173b193423d Content-length: 1309 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN@71B8BEW E^P|kyn]>#! /usr/bin/perl # $Id: bugs2html,v 1.33 2004/08/07 15:46:15 jacob4", "2004-02-12" ], [ "0.55", "2004-08-02" ] ); %classdesc = ('vulnerability' => "This is a security vulnerability.", Security vulnerabilities

      EOF my @tmp = grep(($bugs{$_}->{class} eq 'vulnerability'), @{$fixedvers{$class}}); subtractbugs(\@fullbuglist, printbugs(\@tmp, 2)); unnest("
    \n");# If there are any of these visible, chances are that we haven't # considered them important enough to make a new release for. nest(<Vulnerabilities

    These are potential or actual vulnerabilities in the code that may allow an attacker to gain some level of unauthorised access.

      EOF my @vulnlist = grep(($bugs{$_}->{class} eq 'vulnerability'), @fullbuglist); subtractbugs(\@fullbuglist, printbugs(\@vulnlist, 2)); unnest("
    \n");# Print bugs ordered by difficulty.emph) = @_; $emph = 0 unless defined($emphemphemph) = @_; $emph = 0 unless defined($emph); if ($emph == 2) { return qq[
  • $bugname: ] . qq[$bugs{$bugname}->{summary}\n]; } elsif ($emph == 1 Node-path: putty-wishlist/data/vuln-modpow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ecc4dfe0c88112863e979ba72c562cca Text-delta-base-sha1: c6cae7fa3abee74d2b6721216796d91c23201741 Text-content-length: 32 Text-content-md5: 28fdc39dc8086605c2c01862a5ecc78e Text-content-sha1: 757fb603f8f4a0e1fcb334538eeb1c4a1c39aa7d Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN  I6Lvulnerability Node-path: putty-wishlist/data/vuln-passwd-memdump Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 7b26b6a5b5ca62c66b01d9145cc80e4e Text-delta-base-sha1: 15fe7cfc3e4321003fa9a2e9db18f62d6a8f41d8 Text-content-length: 32 Text-content-md5: f4d56223734980e2d5bb08fbc438e9af Text-content-sha1: 5d0b330ed4c05a507186bff713d039804ec44390 Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN!+ FXIvulnerability Node-path: putty-wishlist/data/vuln-ssh1-kex Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cef1106337ae3d058baa5968073f7007 Text-delta-base-sha1: 825dd8ecc9a8a07b188ff2bcd0493ec893f2b2df Text-content-length: 32 Text-content-md5: fa6d80631e0ed23e9f7e8d2075675e0d Text-content-sha1: 870f23c32f5feef05ed56f18fee64e6186c5162c Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNv J)Mvulnerability Node-path: putty-wishlist/data/vuln-sshredder Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9d5fa5e6c319037e5a455e2f794a1ffa Text-delta-base-sha1: 855c796811b20785dcf7114aaa629161f5cb1d8e Text-content-length: 32 Text-content-md5: 2dfbad490d9d8a765d32adf34972f2f5 Text-content-sha1: fc8424fa385ad85dc740467bc11bbec5d3a3421f Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN GGJvulnerability Node-path: putty-wishlist/data/vuln-window-title Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 01fe33c851e2ded73cbda3cb44a5396b Text-delta-base-sha1: 9e929614a9eedc901010942de6697aae09aaca38 Text-content-length: 32 Text-content-md5: 9691fa6afd571bbe8f683072cf558d41 Text-content-sha1: fad1b93b55cd289cfde1212eacd8f57732d46c7a Content-length: 71 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNis F Ivulnerability Revision-number: 4422 Prop-content-length: 133 Content-length: 133 K 7 svn:log V 33 Mention doorman.sourceforge.net. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-08-07T16:14:19.000000Z PROPS-END Node-path: putty-wishlist/data/port-knocking Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: c2e9b8210e835d0d1b45d3583c98f040 Text-delta-base-sha1: feeca4be107a9e8ba995d1f4948d4906f7e0efa9 Text-content-length: 584 Text-content-md5: f4e115ff7d2b20ed270ff8f4a1eb3a72 Text-content-sha1: c415ee394e454bb39ec5c760ca5c73ec60b182bd Content-length: 623 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNa5a5

    SGT, 2004-08-07: We've been informed of doorman.sourceforge.net, a port-knocking client and server including a pre-compiled client for Windows. I haven't looked at it closely, but it seems that (a) it uses a single UDP packet as the knock rather than a sequence of failed connections to closed TCP ports, and (b) the knock client works by performing the knock and then running another program (such as PuTTY), which is a very simple approach that I failed to think of when I wrote the above list of possibilities. Revision-number: 4423 Prop-content-length: 231 Content-length: 231 K 7 svn:log V 130 The wunsch.org mirror redirects back to chiark (301 Moved Permanently) for me, and I don't have any record of its admin. Removed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-07T19:54:55.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 5aa899a7f3270a565bea5eda24728755 Text-delta-base-sha1: 12c35cdac5362edaad161e7ce1acf4fe3154a283 Text-content-length: 20 Text-content-md5: 9f52b91d857b5bca9adf3951bbdd746d Text-content-sha1: 93d2c99c2d911c902534ad3e388e6136b8810791 Content-length: 61 K 15 cvs2svn:cvs-rev V 5 1.102 PROPS-END SVN~ J>@ Revision-number: 4424 Prop-content-length: 274 Content-length: 274 K 7 svn:log V 173 Prune mirrors due to various "hard" errors (authoritative NXDOMAIN, files not found, serving something other than PuTTY, etc). Add "unreachable" flags next to some mirrors. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-07T21:36:40.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9f52b91d857b5bca9adf3951bbdd746d Text-delta-base-sha1: 93d2c99c2d911c902534ad3e388e6136b8810791 Text-content-length: 484 Text-content-md5: d7844fadee724040600d75b787f990b0 Text-content-sha1: a47145794779735aa4766f4961b14dcb3079b7fb Content-length: 525 K 15 cvs2svn:cvs-rev V 5 1.103 PROPS-END SVNKhpS!Skk!Ju[jroK@0s} phI<"{M>M>Smk.Z"/7Q (unreachable?)globnix.org/">putty.globnix.org (unreachable?) (unreachable?)www.signal42.com/mirrors/putty/">signal42.comMirrors.OmniComp.Org/PuTTY/">mirrors.omnicompwww.puttyssh.org/">puttysshuni-oldenburg.de/misc/putty/">ftp.uni-oldenburg.de in Germany. (unreachable?)ds5.agh.edu.pl/pub/putty">ftp.ds5.agh.edu.pl in Poland Revision-number: 4425 Prop-content-length: 119 Content-length: 119 K 7 svn:log V 19 Mention FileZilla. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-08T23:45:01.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4c89bf9923a89d93d1a7e51e652934c3 Text-delta-base-sha1: fc4fd5c8abdbbe9323f725aac5c3e1fa13b8dc5f Text-content-length: 123 Text-content-md5: b3523fcb07238246285d62615f16a8ee Text-content-sha1: a5864d32f9f58e2222b3062234521134ada0c6d1 Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.29 PROPS-END SVNqk ee~sfilezilla.sourceforge.net/"> FileZilla, a GUI file transfer client with SFTP support from PuTTY Revision-number: 4426 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:40.271123Z PROPS-END Revision-number: 4427 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:40.281380Z PROPS-END Revision-number: 4428 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:40.294553Z PROPS-END Revision-number: 4429 Prop-content-length: 594 Content-length: 594 K 8 svn:date V 27 2004-08-09T17:01:25.000000Z K 7 svn:log V 493 Apparently sending the tar output to stdout rather than a file causes tar to pad with trailing NULs, which slightly upsets old versions of gzip (1.2.4, not 1.3.x), which upsets some of our correspondents. Use -f to send it to a file instead. (It's not transparently clear what happens when you mix -f and -C; I've tested this with ixion's tar, 1.13.25.) Also add option -o to generate POSIX tar files, as for halibut/Makefile; apparently this shuts up a `trailing garbage' error from WinZip. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 219dc84aafe7d966be615aec21b4b748 Text-delta-base-sha1: 377156c0106ca0d61d0cdc1ba5bf6c4b8250d380 Text-content-length: 57 Text-content-md5: 3dcf3c4e9645c5f562f4ed2b9144ad0c Text-content-sha1: 3eb51720da8cf184e35af0b677f5f7af6fbb1473 Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN96) of $arcname.tar.gz $arcname rm -rf uxarc Revision-number: 4430 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 71 Oops - merge version number bump from branch-0-55 (such was the plan). K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-09T17:04:50.000000Z PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8814e7cef7af6db911a353640fcc7034 Text-delta-base-sha1: 4ec9d70ce529770de4163dc723b8db98a5af79b9 Text-content-length: 15 Text-content-md5: d9a651af38c10465843449c77e105edf Text-content-sha1: fbda8b60944f7ee0866ae08d88d1695eae32702c Content-length: 54 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN0.55 Node-path: putty/mac/version.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9fb4337ccf8b433b0e548919bf74aab2 Text-delta-base-sha1: 4d95f05fdd0f69af8e2f337b99259bf13b3ee3b3 Text-content-length: 20 Text-content-md5: bca53e18158f16883cd6187ebac87a9c Text-content-sha1: 669b6633c1ba2ad5bed74efb5ecad88a3f89ac58 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVN77mIn5 Node-path: putty/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eaebaba30c4bef3ae1d6fbcc06e170c3 Text-delta-base-sha1: 473f1419bbb9c862341cb874c30297f9763b569e Text-content-length: 22 Text-content-md5: d3bf60bac6ee0eee7ae4a95b6b5fe8a6 Text-content-sha1: ebf64193022643a13db481659db3cf1b8f30664e Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN X;Y5 Revision-number: 4431 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:41.547756Z PROPS-END Revision-number: 4432 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:41.558308Z PROPS-END Revision-number: 4433 Prop-content-length: 263 Content-length: 263 K 8 svn:date V 27 2004-08-10T13:48:07.000000Z K 7 svn:log V 162 We get a staggering number of mirrors with non-working binaries. Try some language to avoid that. If it doesn't work, maybe it should go in a separate paragraph. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d7844fadee724040600d75b787f990b0 Text-delta-base-sha1: a47145794779735aa4766f4961b14dcb3079b7fb Text-content-length: 218 Text-content-md5: be0e4053b5ec77ad86a82df05da4e0fa Text-content-sha1: 2df1aa160c3cdedb8d5e421257d49e4bd4fe5ed3 Content-length: 259 K 15 cvs2svn:cvs-rev V 5 1.104 PROPS-END SVNK<*G4*um^ (which rather defeats the point of having a mirror in the first place) (Please check that the binaries are accessible from your Download page before notifying us of your mirror!) Revision-number: 4434 Prop-content-length: 302 Content-length: 302 K 7 svn:log V 201 Revised mirroring guidelines: we now support (and encourage) rsync, and thanks to a better understanding of RedirectMatch I now have a wget mirror script which doesn't require editing for each mirror. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-08-10T16:24:14.000000Z PROPS-END Node-path: putty-website/mirror-wget.sh Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1710 Text-content-md5: 754fda4c95105463139cbb69ff7c6da8 Text-content-sha1: 0224cc13fc903322f8380ff7e21b5ede9d193023 Content-length: 1826 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN  #!/bin/sh # When run, this script will generate a mirror of the PuTTY website # in a subdirectory called `putty'. # Fetch the main web site. wget --no-parent -l0 -r --cut-dirs=1 -nH \ http://www.chiark.greenend.org.uk/~sgtatham/putty/ # Fetch the .htaccess file from the download site, in order to find the # version number of the latest release. cd putty wget http://the.earth.li/~sgtatham/putty/htaccess version=`sed -n 's!.*http://the.earth.li/~sgtatham/putty/\(.*\)/!\1!p' htaccess` echo Latest version is $version # Retrieve the binaries directory for that version from the binaries # server. wget --no-parent -l0 -r --cut-dirs=3 -P $version -nH \ http://the.earth.li/~sgtatham/putty/$version/ # Fix the hyperlinks in the download and docs pages so that they point # to the local mirror of the binaries instead of the primary binaries # server. Without this there's barely any point in doing the mirror at # all. perl -i~ -pe 's!http://the.earth.li/~sgtatham/putty/!!' download.html docs.html # Create a .htaccess file that supplies the redirection from # "latest" to a numbered version directory. This RedirectMatch # command ought to do that job independently of the echo "RedirectMatch temp ^(.*)/latest(/[^/]*/?[^/]*)?$ \$1/$version\$2" > .htaccess # The .htaccess file should also ensure the Windows Help files are # not given any strange MIME types by the web server. Also it # should make sure the GPG signatures have the correct MIME type. echo "AddType application/octet-stream .hlp" >> .htaccess echo "AddType application/octet-stream .cnt" >> .htaccess echo "AddType application/octet-stream .RSA" >> .htaccess echo "AddType application/octet-stream .DSA" >> .htaccess Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: be0e4053b5ec77ad86a82df05da4e0fa Text-delta-base-sha1: 2df1aa160c3cdedb8d5e421257d49e4bd4fe5ed3 Text-content-length: 2699 Text-content-md5: 0234cd4149eb0fe22b3c958880316e6a Text-content-sha1: 23424b834abd9e448816f56966af9aec2722ae5d Content-length: 2740 K 15 cvs2svn:cvs-rev V 5 1.105 PROPS-END SVNCkz$q8Osimplest way to mirror the PuTTY website is to use rsync. We provide a version of the website content intended for use as a standalone mirror, at rsync://rsync.chiark.greenend.org.uk/ftp/users/sgtatham/putty-website-mirror. So you could set up a mirror by running a cron job which issued a command something like this every day:

    rsync -r rsync://rsync.chiark.greenend.org.uk/ftp/users/sgtatham/putty-website-mirror/ .

    You should run this command inside the directory where you plan to put the mirror; when that command is run, it will fill the current directory with HTML files and subdirectories.

    If you use the above command to fetch our pre-packaged mirror site, it will only work as designed if your web server is Apache: the site contains a .htaccess file which handles a couple of non-obvious MIME types and deals with making the virtual subdirectory "latest" redirect to the current latest release. If you do not use Apache, you will have to reproduce this behaviour in some other way suitable for your own web server.

    Alternatively, you can mirror our web site using GNU wget. This is more difficult, because our binary downloads are hosted on a different server for bandwidth reasons, so a conventional "wget -r" will not fetch them at all. Instead, you will need at least two invocations of wget. Also, as mentioned above, the release binaries appear to be stored in a virtual directory called "latest", but this actually returns an HTTP

    Here is a sample Bourne shell script to create a working PuTTY mirror site with the binaries in the right place and the HTTP redirect set up correctly. This script requires sed, perl and GNU wget, and it also assumes your web server is Apache (as above). Unlike the above rsync command, this script will create a subdirectory called "putty" in the current directory, and place all the PuTTY web site files inside that subdirectory.

    Before notifying us of your mirror, please test that it works:

    • Check that the binary download links work.
    • Check that the binary download links point at your site, not ours. If they point straight back to our own binary downloads, there is not much point in having the mirror site in the first place!
    • Check that the on-line documentation for the latest release works, and points at your site not ours.
    rsync. We normally suggest that mirrors are updated around once a week, and no less often than once a month. You can also subscribe to our mailing list to receive notification of new releases. Revision-number: 4437 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2004-08-10T17:12:11.000000Z K 7 svn:log V 78 Mutter about efficiency of rsync relative to wget, and other related changes. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d2fbcd8718ad1dbaa32976bc22024be2 Text-delta-base-sha1: 02786735d489cd1c68d09e8899ea671a93c4d5a2 Text-content-length: 530 Text-content-md5: bad998ab79e3fce41bff2a071d0d90b5 Text-content-sha1: 7387ef04285ec71c47f50a5e659807e93f8b344b Content-length: 571 K 15 cvs2svn:cvs-rev V 5 1.107 PROPS-END SVNKDl'2xArYpreferred (and simplest)less bandwidth-efficient, as unlike rsync it's not incremental. It's also more difficult, because our binary downloads are hosted on a different server for bandwidth reasons, so a conventional "wget -r" will not fetch them at all. Instead, you will wget mirrors are updated around once a week, and no less often than once a month. You can also subscribe to our mailing list to receive notification of Revision-number: 4438 Prop-content-length: 276 Content-length: 276 K 8 svn:date V 27 2004-08-10T17:12:31.000000Z K 7 svn:log V 175 Remove the email address from the footer of the HTML manual, and replace it with a link to the Feedback page, as we have long since done everywhere else on the PuTTY website. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: da15d8f52dec94dff7709fadb9c0c458 Text-delta-base-sha1: 8e618c2555c1aabbab977b554973f0238afe5716 Text-content-length: 236 Text-content-md5: b44156a5a863db0702eb945cac588670 Text-content-sha1: 73ea665782773bf87605bd3d98f17fe47be44010 Content-length: 276 K 15 cvs2svn:cvs-rev V 4 1.11 PROPS-END SVNgP;ro v

    If you want to provide feedback on this manual or on the PuTTY tools themselves, see the Feedback page. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-loopback-choice Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: eeeada419b3564c9062f34358295c7e2 Text-delta-base-sha1: 51d80c81c05197605038ba60fa3bb52d047196d7 Text-content-length: 143 Text-content-md5: 3c2362e977ac92dd1162509d63dd42db Text-content-sha1: 7141734bac1d46b0259e77eb9543aa90308b86c8 Content-length: 182 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN~~ 2004-Aug-10: we've had a report that Windows XP SP2 breaks this. (Apparently RC2 worked, but "RTM" - the release - doesn't.) Revision-number: 4441 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2004-08-11T09:04:47.000000Z K 7 svn:log V 91 My new rsync mirror setup might need attention when we do a new release. Add to checklist. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 48289c910150293c5ea643e319ce2f5b Text-delta-base-sha1: 2182f4f3dd138cc5587e013b7c0d93548bace0b1 Text-content-length: 158 Text-content-md5: c2f42c3710ad091b6bca00b170dddfad Text-content-sha1: f0737773dad17ea30396694f957f1784e5522587 Content-length: 198 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVNP] 5".fter running webupdate, run update-rsync on chiark and verify that the rsync mirror package correctly identifies the new version Revision-number: 4442 Prop-content-length: 113 Content-length: 113 K 7 svn:log V 13 link to MDPI K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-11T13:01:21.000000Z PROPS-END Node-path: putty-wishlist/data/zmodem Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d1f72318f6d4944d7930a341195937c3 Text-delta-base-sha1: 125c6ba1438a416fc879ddafe0f5d0386cc7c157 Text-content-length: 86 Text-content-md5: c8365d676032197e122a6aa0c73b9c8f Text-content-sha1: 4f9c92b3c7f728e90da09393c6daa7b863a230b7 Content-length: 125 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVND[EE DLL plugin. Depends how big it is, I think. Revision-number: 4443 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2004-08-11T14:54:37.000000Z K 7 svn:log V 35 new http://putty.fatalnetwork.com/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bad998ab79e3fce41bff2a071d0d90b5 Text-delta-base-sha1: 7387ef04285ec71c47f50a5e659807e93f8b344b Text-content-length: 81 Text-content-md5: 87100fe1335eb1fe795d3b2fa22578a5 Text-content-sha1: 841601eb836ef8f4ee798f18fbfdc2d83bc53c63 Content-length: 122 K 15 cvs2svn:cvs-rev V 5 1.108 PROPS-END SVNDA <h\fatalnetwork.com/">putty.fatalnetwork.com in New Zealand Revision-number: 4444 Prop-content-length: 120 Content-length: 120 K 7 svn:log V 22 Update i-d reference. K 10 svn:author V 3 ben K 8 svn:date V 27 2004-08-11T22:01:56.000000Z PROPS-END Node-path: putty-wishlist/data/banner-escape-codes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e0af30b27fb67a498d1170ec5376e086 Text-delta-base-sha1: 752187bd09c34ac86d636d3563172b177d233c07 Text-content-length: 57 Text-content-md5: 8249196671f81ac80299d84576dbb8d7 Text-content-sha1: 49125de26f898799c1d09d29c7c7e2f25889a053 Content-length: 96 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN|| $ph21.txt">draft-ietf-secsh-userauth-21 Revision-number: 4445 Prop-content-length: 335 Content-length: 335 K 8 svn:date V 27 2004-08-12T01:02:01.000000Z K 7 svn:log V 234 Flush the logfile reasonably frequently in `printable output only' and `all session data' modes, without completely mauling the performance, by fflush()ing once per term_out(). If anyone complains I suppose we can make this optional. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: caaee8e5d6e932a3f09f6923114bfb8c Text-delta-base-sha1: fc18d0de8ee1501963e978069b10abc33077f04f Text-content-length: 123 Text-content-md5: a75b56b91c7fbf462d3a61a8541ed824 Text-content-sha1: 56c18acbead361a0c122c117d33149a17b7547b3 Content-length: 163 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNr6aAY0;7Flush any open log file. */ void logflush(void *handle) if (ctx->lgfp) fflush(ctx->lgfp); Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: be0ba7095fb036fa67575a65b4556ee8 Text-delta-base-sha1: 70b3c638506b576582794d8b45c280d103fa200d Text-content-length: 43 Text-content-md5: c42f477873c837c8729ddbce3ddb2716 Text-content-sha1: 8495ef961ed4064c93c2db5b127c93e9737983e5 Content-length: 84 K 15 cvs2svn:cvs-rev V 5 1.229 PROPS-END SVN"? hE]flush(void *logctx Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1da05c8bb930ceeb4e0cca4d82d58aa3 Text-delta-base-sha1: ce4aeaf3327ad59eb4c01e4188ee7500c7518c2c Text-content-length: 95 Text-content-md5: 197a255ba8ad9faf65e6b76bba31ae64 Text-content-sha1: 739bf703d8a3d5c776401ee661897b5cbc601759 Content-length: 136 K 15 cvs2svn:cvs-rev V 5 1.167 PROPS-END SVN UR logflush(term->logctx>Z> ((term->ltemp[it] & 0xFFFF0 Revision-number: 4446 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Summary: Flush session log file during session Fixed-in: 2004-08-13 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-12T01:07:04.000000Z PROPS-END Node-path: putty-wishlist/data/log-flush Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 483 Text-content-md5: 22d9b30461fcdb4702f4b7e2eefe6e0c Text-content-sha1: 8300618ee77e31af878e283d1e5326aa5895cec9 Content-length: 599 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNUUUSummary: Flush session log file during session Class: semi-bug Difficulty: fun Priority: low Present-in: 0.55 Fixed-in: 2004-08-13 Perhaps we should occasionally flush the session log during a session `printable output only' and `all session output' logging modes, so that the file on disc is at least vaguely up-to-date. This is done as of 2004-08-13. It incurs some performance overhead, of course; if anyone complains, we could make it less frequent, or optional. Revision-number: 4447 Prop-content-length: 107 Content-length: 107 K 8 svn:date V 27 2004-08-12T01:13:01.000000Z K 7 svn:log V 8 grammar K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/log-flush Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 22d9b30461fcdb4702f4b7e2eefe6e0c Text-delta-base-sha1: 8300618ee77e31af878e283d1e5326aa5895cec9 Text-content-length: 24 Text-content-md5: c4b5b4d09d1d7a4c630ba49c485fd5e7 Text-content-sha1: 7db3ba1a8caf5b88fb703c445ab00816a65227e9 Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNUX J Jin Revision-number: 4448 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 27 Add link to failure report K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-12T12:13:39.000000Z PROPS-END Node-path: putty-wishlist/data/portfwd-loopback-choice Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 3c2362e977ac92dd1162509d63dd42db Text-delta-base-sha1: 7141734bac1d46b0259e77eb9543aa90308b86c8 Text-content-length: 580 Text-content-md5: 20e7bea93c2c1689b14156f591edf501 Text-content-sha1: 6e72d0dbf526d2bdef385cd280d3d3ff10dcbc14 Content-length: 619 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN2JLtx-html-body Fixed-in: 2002-12-19

    This was implemented as of 2002-12-19.

    (Apparently this is also useful for forwarding Windows Terminal Services - see this posting.)

    Update, 2004-Aug-10: we've had a report that Windows XP SP2 breaks this. (Apparently RC2 worked, but "RTM" - the release - doesn't.) Revision-number: 4449 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2004-08-12T13:37:24.000000Z K 7 svn:log V 65 Add (some of) Simon Valiquette's suggestions about rsync advice. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 87100fe1335eb1fe795d3b2fa22578a5 Text-delta-base-sha1: 841601eb836ef8f4ee798f18fbfdc2d83bc53c63 Text-content-length: 120 Text-content-md5: ae72b803ee2182c99acdd9e2e9565380 Text-content-sha1: 36911edbd0bcd280de77f80351f3b4caa027b5a2 Content-length: 161 K 15 cvs2svn:cvs-rev V 5 1.109 PROPS-END SVNAX\L~R*TF{auH Alternatively, you can replace . with the name of the target directory Revision-number: 4450 Prop-content-length: 163 Content-length: 163 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-12T20:55:58.000000Z K 7 svn:log V 63 add xref at the bottom of X11 section to options in config.but PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6373f311091e52a95e05e05c012c560d Text-delta-base-sha1: 58a6c5eb84f9bf35f9933f4a7ac3ab4d6c3c8bb0 Text-content-length: 144 Text-content-md5: 1a5ffffce22b5e64d1d89ccfbe735f3e Text-content-sha1: a712efb0f04aa1687275b0d3e567700b24552d15 Content-length: 184 K 15 cvs2svn:cvs-rev V 4 1.27 PROPS-END SVNm3 w/4C `\versionid $Id: using.but,v 1.27 2004/08/12 20:55:58For more options relating to X11 forwarding, see \k{config-ssh-x11} Revision-number: 4451 Prop-content-length: 354 Content-length: 354 K 8 svn:date V 27 2004-08-13T01:08:34.000000Z K 7 svn:log V 253 Extra logging in SSH-2 port-forwarding. Most obviously, the opening of a forwarded X11 connection is now logged as well as the closing; but we also log the peer IP/port in case it's interesting, and log the reason for refusing to honour a channel open. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8dfffc4efda462f37d1dfdab0358c880 Text-delta-base-sha1: cebe9a5a22072d914271243a33aea4d94a985260 Text-content-length: 422 Text-content-md5: 9faf48b7fb0dfeab4d2b2d432134d777 Text-content-sha1: 2796ee9ea9ff876ffa4f771c60c2213918023978 Content-length: 463 K 15 cvs2svn:cvs-rev V 5 1.314 PROPS-END SVN9{0XlUsT>rUjp> ][^addrstlogeventf(ssh, "Received X11 connect request from %s:%d", addrstr, peerportlogevent("Opening X11 forward connection succeeded");logeventf(ssh, "Received remote port %d open request " "from %s:%d", pf.sport, peeraddr, peerportAttempting to forward remote port to " "logeventf(ssh, "Rejected channel open: %s", error Revision-number: 4452 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2004-08-14T12:24:02.000000Z K 7 svn:log V 116 ssh_free() should not call log_free(); it's for the front end to decide whether the logctx is finished with or not. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9faf48b7fb0dfeab4d2b2d432134d777 Text-delta-base-sha1: 2796ee9ea9ff876ffa4f771c60c2213918023978 Text-content-length: 40 Text-content-md5: 2d6ce3c99f54e3d88f9320e99c3dfa0b Text-content-sha1: 2be3827d5bc75869657e22e04da150e625390b86 Content-length: 81 K 15 cvs2svn:cvs-rev V 5 1.315 PROPS-END SVN{1 aP+ Revision-number: 4453 Prop-content-length: 273 Content-length: 273 K 8 svn:date V 27 2004-08-14T13:04:18.000000Z K 7 svn:log V 172 Implement `Restart Session', in both Unix and Windows PuTTY. Largely because Owen questioned whether it was really easy enough to be labelled `fun' in the bug database :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 79a96bdae820d1097fd7ce8866916234 Text-delta-base-sha1: cbc2ff850a946c3dc19866ab82b7b27c06236998 Text-content-length: 1997 Text-content-md5: 16bcb93479477b4ac4e2961cb46862bb Text-content-sha1: cad0cb698f53c020838ef237329224a55b364f47 Content-length: 2038 K 15 cvs2svn:cvs-rev V 5 1.143 PROPS-END SVNm.R0R=mldisc) if (inst->ldisc) lpage_send(inst->ldisc, CS_ISO8859_1, output+start, if (inst->ldisc) if (inst->ldisc) if (inst->ldisc) { ldisc_free(inst->ldisc); inst->ldisc = NULL; } if (inst->back) { inst->back->free(inst->backhandle); inst->backhandle = NULL; inst->back = NULL; update_specials_menu(inst); } gtk_widget_show(inst->restartitem);if (inst->ldisc) f (inst->back) if (inst->ldisc) f (inst->back) restart_session if (!inst->back) { logevent(inst, "----- Session restarted -----"); start_backend(inst); inst->exited = FALSE; } } void saved_sessionif (inst->back) specials = inst->back->get_specials(inst->backhandle); else specials = NULL; static void start_backend(struct gui_data *inst) { extern Backend *select_backend(Config *cfg); char *realhost; const char *error; inst->back = select_backend(&inst->cfg); error = inst->back->init((void *)inst, &inst->backhandle, &inst->cfg, inst->cfg.host, inst->cfg.port, &realhost, inst->cfg.tcp_nodelay, inst->cfg.tcp_keepalives); if (error) { char *msg = dupprintf("Unable to open connection to %s:\n%s", inst->cfg.host, error); inst->exited = TRUE; fatal_message_box(inst->window, msg); sfree(msg); exit(0); } if (inst->cfg.wintitle[0]) { set_title(inst, inst->cfg.wintitle); set_icon(inst, inst->cfg.wintitle); } else { char *title = make_default_wintitle(realhost); set_title(inst, title); set_icon(inst, title); sfree(title); inst); gtk_widget_hide(inst->restartitem); } int pt_main(int argc, char **argv) {Restart Session", restart_session_menuitem); inst->restartitem = menuitem; gtk_widget_hide(inst->restartstart_backend(inst); Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: dc90e7cbde8135620e57c394eb88d125 Text-delta-base-sha1: 110e42de92a12e6ca658a503b816e6080d23773c Text-content-length: 5228 Text-content-md5: 7e0b485710cfca5301ac3cf81dc9a335 Text-content-sha1: 30994c0438c7bf7ee516a1a476ff00c34011654c Content-length: 5269 K 15 cvs2svn:cvs-rev V 5 1.266 PROPS-END SVNdVasHrsD3`/C'\qa%zf156IQf&&~'Z%START 0x0040 #define IDM_RECONF 0x0050 #define IDM_CLRSB 0x0060 #define IDM_RESET 0x007static void start_backend(void) { const char *error; char msg[1024], *title; char *realhost; int i;back = NULL; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == cfg.protocol) { back = backends[i].backend; break; } if (back == NULL) { char *str = dupprintf("%s Internal Error", appname); MessageBox(NULL, "Unsupported protocol number found", str, MB_OK | MB_ICONEXCLAMATION); sfree(str); cleanup_exit(1); } error = back->init(NULL, &backhandle, &cfg, cfg.host, cfg.port, &realhost, cfg.tcp_nodelay, cfg.tcp_keepalives); back->provide_logctx(backhandle, logctx); if (error) { char *str = dupprintf("%s Error", appname); sprintf(msg, "Unable to open connection to\n" "%.800s\n" "%s", cfg.host, error); MessageBox(NULL, msg, str, MB_ICONERROR | MB_OK); sfree(str); exit(0); } window_name = icon_name = NULL; if (*cfg.wintitle) { title = cfg.wintitle; } else { sprintf(msg, "%s - %s", realhost, appname); title = msg; } sfree(realhost); set_title(NULL, title); set_icon(NULL, title);/* * Destroy the Restart Session menu item. (This will return * failure if it's already absent, as it will be the very first * time we call this function. We ignore that, because as long * as the menu item ends up not being there, we don't care * whether it was us who removed it or not!) */ for (i = 0; i < lenof(popup_menus); i++) { DeleteMenu(popup_menus[i].menu, IDM_RESTART, MF_BYCOMMAND); } session_closed = FALSE; } static void close_session(void) { char morestuff[100]; int i; session_closed = TRUE; sprintf(morestuff, "%.70s (inactive)", appname); set_icon(NULL, morestuff); set_title(NULL, morestuff); if (ldisc) { ldisc_free(ldisc); ldisc = NULL; } if (back) { back->free(backhandle); backhandle = NULL; back = NULL; update_specials_menu(NULL); } /* * Show the Restart Session menu item. Do a precautionary * delete first to ensure we never end up with more than one. */ for (i = 0; i < lenof(popup_menus); i++) { DeleteMenu(popup_menus[i].menu, IDM_RESTART, MF_BYCOMMAND); InsertMenu(popup_menus[i].menu, IDM_DUPSESS, MF_BYCOMMAND | MF_ENABLED, IDM_RESTART, "&Restart Session"); }start_backend()p; int menu_already_exists = (specials != NULL); int i, j; if (back) specials = back->get_specials(backhandle); else specials = NULL; if (specials) { } else p = NULL; for (j = 0; j < lenof(popup_menus); j++) { if (menu_already_exists) { DeleteMenu(popup_menus[j].menu, popup_menus[j].specials_submenu_pos, MF_BYPOSITION); DeleteMenu(popup_menus[j].menu, popup_menus[j].specials_submenu_pos, MF_BYPOSITION); } if (specials) { InsertMenu(popup_menus[j].menu, popup_menus[j].specials_submenu_pos, close_session(lose_session(); session_closed = TRUEif (back) START: if (!back) { logevent(NULL, "----- Session restarted -----"); start_backend(); } if (ldisc) if (back) if (ldisc) if (back) if (ldisc) if (ldisc) if (ldisc) if (ldisc) if (ldisc) k(nh%mHu= {case VK_RIGHT: xkey = 'C'; break; case VK_LEFT: xkey = 'D'; break; case VK_CLEAR: xkey = 'G'; break; } if (xkey) { if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", xkey); else { int app_flg = (term->app_cursor_keys && !cfg.no_applic_c); #if 0 /* * RDB: VT100 & VT102 manuals both state the * app cursor keys only work if the app keypad * is on. * * SGT: That may well be true, but xterm * disagrees and so does at least one * application, so I've #if'ed this out and the * behaviour is back to PuTTY's original: app * cursor and app keypad are independently * switchable modes. If anyone complains about * _this_ I'll have to put in a configurable * option. */ if (!term->app_keypad_keys) app_flg = 0; #endif /* Useful mapping of Ctrl-arrows */ if (shift_state == 2) app_flg = !app_flg; if (app_flg) p += sprintf((char *) p, "\x1BO%c", xkey); else p += sprintf((char *) p, "\x1B[%c", xkey); } return p - output; } } /* * Finally, deal with Return ourselves. (Win95 seems to * foul it up when Alt is pressed, for some reason.) */ if (wParam == VK_RETURN) { /* Return */ *p++ = 0x0D; *p++ = 0; return -2; } if (left_alt && wParam >= VK_NUMPAD0 && wParam <= VK_NUMPAD9) if (ldisc) if (ldisc) if (ldisc) ldisc_send(ldisc, &ch, 1, 1); } alt_sum = 0; } else { term_seen_key_event(term); if (ldisc) if (ldisc) if (ldisc) lpage_send(ldisc, kbd_codepage, Revision-number: 4454 Prop-content-length: 111 Content-length: 111 K 7 svn:log V 11 Done this. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-08-14T13:05:41.000000Z PROPS-END Node-path: putty-wishlist/data/reuse-windows Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2a832568dcede7cbac5c3469aea6a563 Text-delta-base-sha1: 1fbcb0168ee774d9ab5dadfe20703b451200a7b9 Text-content-length: 355 Text-content-md5: 6978f76b76a156809eeebbe8fd360613 Text-content-sha1: dbd691df9cafc56273dac81fcddd4a6930aac293 Content-length: 394 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNB G/3@Fixed-in: 2004-08-15

    SGT, 2004-08-14: Just implemented a "Restart Session" menu option, on both Unix and Windows PuTTY. Mostly because Owen questioned whether this feature was really easy enough to label as "fun". It hadn't occurred to me before that challenging my competence was a way to motivate me to do stuff :- Revision-number: 4455 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 new putty.md5.com.ar K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-15T11:35:12.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: ae72b803ee2182c99acdd9e2e9565380 Text-delta-base-sha1: 36911edbd0bcd280de77f80351f3b4caa027b5a2 Text-content-length: 88 Text-content-md5: 3cb6fd1527b0e4ef23eda40b8a3053f3 Text-content-sha1: 77cdf6c30e102f722739ad1b1941ff05b2345501 Content-length: 129 K 15 cvs2svn:cvs-rev V 5 1.110 PROPS-END SVN B`Be3md5.com.ar/">putty.md4.com.ar in Argentina. Revision-number: 4456 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2004-08-15T14:04:50.000000Z K 7 svn:log V 53 add reference to WinXPSP2 fix from comp.security.ssh K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-loopback-choice Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 20e7bea93c2c1689b14156f591edf501 Text-delta-base-sha1: 6e72d0dbf526d2bdef385cd280d3d3ff10dcbc14 Text-content-length: 198 Text-content-md5: cf5174d0b44b20cc925c5b9f6ac3f67e Text-content-sha1: 92d5f169ce776b1e840e93bac33c4112ac94ac75 Content-length: 237 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNO33There is apparently a fix available from Microsoft if you ask nicely - see this posting. Revision-number: 4457 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2004-08-15T16:33:43.000000Z K 7 svn:log V 29 new puttymirror.rowehost.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3cb6fd1527b0e4ef23eda40b8a3053f3 Text-delta-base-sha1: 77cdf6c30e102f722739ad1b1941ff05b2345501 Text-content-length: 166 Text-content-md5: 14009b912015309d186697ee2dd0adbe Text-content-sha1: 8f2e651cd3e514c1d19e2d91753e3f634ba55fac Content-length: 207 K 15 cvs2svn:cvs-rev V 5 1.111 PROPS-END SVNM=S=N<puttymirror.rowehost.com/">puttymirror.rowehostwww.signal42.com/mirrors/putty/">signal42247available.com/putty/">putty.247availabl Revision-number: 4458 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 Note behaviour of `cd' with no arguments. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-15T17:21:46.000000Z PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ed426665e43ac2d8ffc86bd3302085a3 Text-delta-base-sha1: 16eab048b212d6f910bfc6110a1dd2e9cf0953df Text-content-length: 265 Text-content-md5: e61b09cec9cff2a8c0ebf989837c35ea Text-content-sha1: df4197b162056650a2a7ec79c79b5b2314aaf022 Content-length: 304 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN] n{95&7\versionid $Id: psftp.but,v 1.6 2004/08/15 17:21:46 jacobIf you don't provide an argument, \c{cd} will return you to your home directory on the server (more precisely, the remote directory you were in at the start of the connection). To Revision-number: 4459 Prop-content-length: 254 Content-length: 254 K 8 svn:date V 27 2004-08-16T09:38:12.000000Z K 7 svn:log V 153 Patch from Kurt Roeckx: apparently on Debian amd64, the ut_time member of struct utmp is not equivalent to time_t (it's 32-bit). From Debian bug#265910. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 44aacdf121108bfcf0a4e88888599904 Text-delta-base-sha1: 09f1114af4e4dc1ee7746373d40f936bdfa43757 Text-content-length: 343 Text-content-md5: f347c6535335daea4c93225578970839 Text-content-sha1: ae6d1868f8568d541db3ac8216f87134d0f169df Content-length: 383 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNNI&#s6qZ~t6?s}93 time_t uttime/* Apparently there are some architectures where (struct utmp).ut_time * is not essentially time_t (e.g. Linux amd64). Hence the temporary. */ time(&uttime); utmp_entry.ut_time = uttime; /* may truncate */ time_t uttimetime); utmp_entry.ut_time = uttime; Revision-number: 4460 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.550140Z PROPS-END Revision-number: 4461 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.558936Z PROPS-END Revision-number: 4462 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.567876Z PROPS-END Revision-number: 4463 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.576891Z PROPS-END Revision-number: 4464 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.585934Z PROPS-END Revision-number: 4465 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.595141Z PROPS-END Revision-number: 4466 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.604571Z PROPS-END Revision-number: 4467 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.614023Z PROPS-END Revision-number: 4468 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2004-08-16T14:43:29.000000Z K 7 svn:log V 31 Update comment on dupprintf(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e7ca6748d5c94fd63ade447bdb4405b4 Text-delta-base-sha1: 610bef62f39e8dac546cb3b3e510f1f04a8948bd Text-content-length: 2028 Text-content-md5: 7a30b9d839b227074b8c7df7997c2fee Text-content-sha1: d42006e698f23cdd6f9dcf9fd7eddf1316811073 Content-length: 2068 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN*\ T?TIaCurrently I'm doing this via vsnprintf. This has worked so far, * but it's not good, because: * * - vsnprintf is not available on all platforms. There's an ifdef * to use `_vsnprintf', which seems to be the local name for it * on Windows. Other platforms may lack it completely, in which * case it'll be time to rewrite this function in a totally * different way. * * - technically you can't reuse a va_list like this: it is left * unspecified whether advancing a va_list pointer modifies its * value or something it points to, so on some platforms calling * vsnprintf twice on the same va_list might fail hideously. It * would be better to use the `va_copy' macro mandated by C99, * but that too is not yet ubiquitous. * * The only `properly' portable solution I can think of is to * implement my own format string scanner, which figures out an * upper bound for the length of each formatting directive, * allocates the buffer as it goes along, and calls sprintf() to * actually process each directive. If I ever need to actually do * this, some caveats: * * - It's very hard to find a reliable upper bound for * floating-point values. %f, in particular, when supplied with * a number near to the upper or lower limit of representable * numbers, could easily take several hundred characters. It's * probably feasible to predict this statically using the * constants in , or even to predict it dynamically by * looking at the exponent of the specific float provided, but * it won't be fun. * * - Don't forget to _check_, after calling sprintf, that it's * used at most the amount of space we had available. * * - Fault any formatting directive we don't fully understand. The * aim here is to _guarantee_ that we never overflow the buffer, * because this is a security-critical function. If we see a * directive we don't know about, we should panic and die rather * than run any risk Revision-number: 4469 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.785407Z PROPS-END Revision-number: 4470 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.795375Z PROPS-END Revision-number: 4471 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2004-08-17T08:34:14.000000Z K 7 svn:log V 25 new mirrors.unix-boy.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 14009b912015309d186697ee2dd0adbe Text-delta-base-sha1: 8f2e651cd3e514c1d19e2d91753e3f634ba55fac Text-content-length: 74 Text-content-md5: b242d38d12a6f216baf775c9dd0be759 Text-content-sha1: 8c9463e2c78104b941cf5364126c51aa04f22093 Content-length: 115 K 15 cvs2svn:cvs-rev V 5 1.112 PROPS-END SVN}1I?qmirrors.unix-boy.com/putty/">mirrors.unix-boy.com Revision-number: 4472 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2004-08-17T08:36:12.000000Z K 7 svn:log V 33 reinstate putty.mirror.nextit.nl K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b242d38d12a6f216baf775c9dd0be759 Text-delta-base-sha1: 8c9463e2c78104b941cf5364126c51aa04f22093 Text-content-length: 62 Text-content-md5: b1edd58af46984cc855292189c3f9455 Text-content-sha1: 34eef98ad9fa78229f1ea8360305485bbfe7b88c Content-length: 103 K 15 cvs2svn:cvs-rev V 5 1.113 PROPS-END SVN}~%|V5vmirror.nextit.nl/">putty.mirror.nexti Revision-number: 4473 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.911294Z PROPS-END Revision-number: 4474 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:43.920595Z PROPS-END Revision-number: 4475 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2004-08-17T12:05:46.000000Z K 7 svn:log V 89 Link directly to the MS KB article describing the XP SP2 problem now that it's appeared. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-loopback-choice Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cf5174d0b44b20cc925c5b9f6ac3f67e Text-delta-base-sha1: 92d5f169ce776b1e840e93bac33c4112ac94ac75 Text-content-length: 218 Text-content-md5: 1c72e8b8ff51f4e9936f677f4c4066db Text-content-sha1: d3dc140790843cf2375bf2c6522a8befaeda592a Content-length: 257 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNOmG&G fix available from Microsoft if you ask nicely - see MS KB 884020 - and it looks like it'll be in the next service pack. Revision-number: 4476 Prop-content-length: 686 Content-length: 686 K 7 svn:log V 585 Someone complained that their keyboard-interactive password prompt was being truncated - it was from OpenSSH on HP/UX and had all sorts of stuff in it ("last successful login" etc). Bodged it by bumping up the space allocated in the fixed array for a password prompt. Also added an indication that the prompt is being truncated, as required by draft-ietf-secsh-auth-kbdinteract-06. (NB that before this checkin, there was a more-or-less harmless buffer overread where if we ever received a keyboard-interactive prompt with echo=1, we'd probably spew goo on the terminal; fixed now.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-17T14:08:05.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2d6ce3c99f54e3d88f9320e99c3dfa0b Text-delta-base-sha1: 2be3827d5bc75869657e22e04da150e625390b86 Text-content-length: 395 Text-content-md5: 941541ee9f00d6c9752c201f091aadaa Text-content-sha1: bd9ce42f769bd65fad067c5c323d99560aca13a3 Content-length: 436 K 15 cvs2svn:cvs-rev V 5 1.316 PROPS-END SVN1nV S-512atic const char trunc[] = ": "; static const int prlen = sizeof(s->pwprompt) - lenof(trunc); if (prompt_len > prlen) { memcpy(s->pwprompt, prompt, prlen); strcpy(s->pwprompt + prlen, trunc); } else { memcpy(s->pwprompt, prompt, prompt_len); s->pwprompt[prompt_len] = '\0'; } Revision-number: 4477 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:44.202095Z PROPS-END Revision-number: 4478 Prop-content-length: 145 Content-length: 145 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-18T10:24:40.000000Z K 7 svn:log V 45 Mention the mirroring guidelines on the web. PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4664c274bb90aa04a7bd3f0aaec77b8b Text-delta-base-sha1: 8ebfbb5b63e3fbf7c7701e0539627665e55fd03e Text-content-length: 415 Text-content-md5: f809142b8cd31b5aaf3b12ad2f2a32c1 Text-content-sha1: 761f42e1a5f9ca136ed9bbafe0100ce4438bff77 Content-length: 455 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNMdz)=ng:OZs\versionid $Id: feedback.but,v 1.18 2004/08/18 10:24:40 jacob and checked that it works, and remember to let us know which country your mirror is in, then we'll add it to (see also the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/mirrors.html#guidelines}{guidelines on the Mirrors page}); but if you just want to ask for permission, you don't need to. You already have Revision-number: 4479 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:44.307177Z PROPS-END Revision-number: 4480 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2004-08-19T10:11:50.000000Z K 7 svn:log V 16 typo md4.com.ar K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b1edd58af46984cc855292189c3f9455 Text-delta-base-sha1: 34eef98ad9fa78229f1ea8360305485bbfe7b88c Text-content-length: 22 Text-content-md5: b1f26bb10051a85d9a58b8453229440e Text-content-sha1: 8862495b75dc6cda08ed8e2b3df116b06536837b Content-length: 63 K 15 cvs2svn:cvs-rev V 5 1.114 PROPS-END SVN~~ uv5 Revision-number: 4481 Prop-content-length: 157 Content-length: 157 K 7 svn:log V 57 Add the WinXPSP2 alternate-localhost problem to the FAQ. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-08-19T12:58:14.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9274ec15071775b4cb2424eb648d0d01 Text-delta-base-sha1: d22e6ca22843b346707a0e07113d90be5d89cf10 Text-content-length: 743 Text-content-md5: b4ed1b4cb0974478a0ed05d589b503ae Text-content-sha1: 3ee9605cbfd08769075100d736c9628e14e76b8d Content-length: 783 K 15 cvs2svn:cvs-rev V 4 1.75 PROPS-END SVN_HBP2U0ra~\versionid $Id: faq.but,v 1.75 2004/08/19 12:58:14S{faq-alternate-localhost}{Question} Since I upgraded Windows XP to Service Pack 2, I can't use addresses like \cw{127.0.0.2}. Some people who ask PuTTY to listen on localhost addresses other than \cw{127.0.0.1} to forward services such as SMB and Windows Terminal Services have found that doing so no longer works since they upgraded to WinXP SP2. This is an issue with SP2 that is acknowledged by Microsoft in 884020}{884020}. For a fix, you'll need to contact Microsoft support. We've been told that the process is reasonably easy, and is free of charge; and that the fix will be included in the next Windows XP Service Pack (but probably not before) Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1a5ffffce22b5e64d1d89ccfbe735f3e Text-delta-base-sha1: a712efb0f04aa1687275b0d3e567700b24552d15 Text-content-length: 260 Text-content-md5: f46cfab3b1e6f340a232d5ea4e86c133 Text-content-sha1: 620a31c17a8800552aba7369c12f5536385626c3 Content-length: 300 K 15 cvs2svn:cvs-rev V 4 1.28 PROPS-END SVN3hgG43:y\versionid $Id: using.but,v 1.28 2004/08/19 12:58:14(Note that if you're using Windows XP Service Pack 2, you may need to obtain a fix from Microsoft in order to use addresses like \cw{127.0.0.5} - see \k{faq-alternate-localhost}.) Revision-number: 4482 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2004-08-19T12:59:38.000000Z K 7 svn:log V 25 Reference the PuTTY FAQ. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-loopback-choice Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1c72e8b8ff51f4e9936f677f4c4066db Text-delta-base-sha1: d3dc140790843cf2375bf2c6522a8befaeda592a Text-content-length: 97 Text-content-md5: 36e94a03781b8c5b4b2fa14f6dc9608a Text-content-sha1: 564d1490e13a348001298f2a0a22a1c8e261cb0b Content-length: 136 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVNm<PlPwww.chiark.greenend.org.uk/~sgtatham/putty/faq.html#QA.7.20">the PuTTY FAQ. Revision-number: 4483 Prop-content-length: 112 Content-length: 112 K 8 svn:date V 27 2004-08-19T13:06:05.000000Z K 7 svn:log V 12 Fix linkrot K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unicode-mappings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4538657af0972ca5dc2849093c75436f Text-delta-base-sha1: ac039f1fd857f035611a002a0815f682e2de2b65 Text-content-length: 22 Text-content-md5: 890ee8d02e279e3d13ebe004e53e29a1 Text-content-sha1: 4063d7122c98a8335b4847279c79660138111df3 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVNvv mn7 Revision-number: 4484 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2004-08-19T13:15:02.000000Z K 7 svn:log V 102 Remove claim in usage text that Plink defaults to SSH, since it's not true in a number of situations. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 75461a59673d95f2fee619b64f60a89f Text-delta-base-sha1: e785301862e42ef075de69a0cebfbf13b428cd53 Text-content-length: 73 Text-content-md5: 7133f416074acbb1614eae01626a7f68 Text-content-sha1: f60afac44f8cd34a844486fb0c44543f0f02946e Content-length: 113 K 15 cvs2svn:cvs-rev V 4 1.25 PROPS-END SVN4& 4'4Ki\versionid $Id: plink.but,v 1.25 2004/08/19 13:14:55 Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7dd2598cbaaaee344274922a2942b3e9 Text-delta-base-sha1: 25356658ed74c285ae2122ed499d383023622cb5 Text-content-length: 22 Text-content-md5: a3ea4da8658e24ee328d875f07e4664c Text-content-sha1: 71353f0b10427d810beee0543bdcf8d147749b92 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.87 PROPS-END SVN $m2 Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ffa8f72a5e5bd05c4333b51f6a641e36 Text-delta-base-sha1: e988bd4bf45c288a416d0dcdbad86b9f907fe0fe Text-content-length: 22 Text-content-md5: b2cc2be42edfaabfbb7f02bbc6751cc3 Text-content-sha1: 8caca941be4e41747ad7c34461f1e33d4a0ff231 Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.32 PROPS-END SVN;- q< Revision-number: 4485 Prop-content-length: 369 Content-length: 369 K 8 svn:date V 27 2004-08-19T15:05:31.000000Z K 7 svn:log V 268 Fix an annoying inconsistency that's been bugging me for years: "plink host" and "plink user@host" differed in that the former attempted to load session `host' while the latter didn't. Now both forms attempt to load a session. Someone will probably complain, but hey. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a3ea4da8658e24ee328d875f07e4664c Text-delta-base-sha1: 71353f0b10427d810beee0543bdcf8d147749b92 Text-content-length: 714 Text-content-md5: 6905b4f0e871fb78505abb3d1c99bf75 Text-content-sha1: f8b63bfd7118c18406b8c5244c5aa6b0910dddd0 Content-length: 754 K 15 cvs2svn:cvs-rev V 4 1.88 PROPS-END SVNq'.C.\p]uAuZ2EL, *user, *hostA nonzero length string followed by an @ is treated * as a username. (We discount an _initial_ @.) The * rest of the string (or the whole string if no @) * is treated as a session name and/or hostnam) { *r++ = '\0'; user = p, host = r; } else { user = NULL, host = p; } /* * Now attempt to load a saved session with the * same name as the hostname. */ { Config cfg2; do_defaults(hosthost if (user) { /* Patch in specified username. */ strncpy(cfg.username, user, sizeof(cfg.username) - 1); cfg.username[sizeof(cfg.username) - 1] = '\0'; } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b2cc2be42edfaabfbb7f02bbc6751cc3 Text-delta-base-sha1: 8caca941be4e41747ad7c34461f1e33d4a0ff231 Text-content-length: 744 Text-content-md5: e39d6810270f73a4eec37bdee47e2f71 Text-content-sha1: 64d93ecf57ecde18cfd40255c2d8a875d8598d41 Content-length: 784 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN- $6CAA uK]Otp=, *user, *hostA nonzero length string followed by an @ is treated * as a username. (We discount an _initial_ @.) The * rest of the string (or the whole string if no @) * is treated as a session name and/or hostname. */ r = strrchr(p, '@'); if (r == p) p++, r = NULL; /* discount initial @ */ if (r) { *r++ = '\0'; user = p, host = r; } else { user = NULL, host = p; } /* * Now attempt to load a saved session with the * same name as the hostname. */ { Config cfg2; do_defaults(hosthost if (user) { /* Patch in specified username. */ strncpy(cfg.username, user, } Revision-number: 4486 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2004-08-19T15:31:34.000000Z K 7 svn:log V 62 new www.silvertree.org; rm ftp.silvertree.org (admin request) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b1f26bb10051a85d9a58b8453229440e Text-delta-base-sha1: 8862495b75dc6cda08ed8e2b3df116b06536837b Text-content-length: 78 Text-content-md5: 9d4ab97ec1e8460c5abda1475a6ff31c Text-content-sha1: 380a6797bafa4dc0079b1664e6debba1fb56cf8d Content-length: 119 K 15 cvs2svn:cvs-rev V 5 1.115 PROPS-END SVN~"0I@  qwww.silvertree.org/mirror/putty/">silvertree.org Revision-number: 4487 Prop-content-length: 257 Content-length: 257 K 8 svn:date V 27 2004-08-20T08:32:30.000000Z K 7 svn:log V 156 alternate-localhost WinXP SP2: apparently SP2 fixes the problem with Terminal Services that meant you needed to use alternate-localhost in the first place! K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b4ed1b4cb0974478a0ed05d589b503ae Text-delta-base-sha1: 3ee9605cbfd08769075100d736c9628e14e76b8d Text-content-length: 227 Text-content-md5: ec2263eb7767103b1721bd44d18d0984 Text-content-sha1: 958ed01857e5835b04d97da0f5a2e8b81fd6f23b Content-length: 267 K 15 cvs2svn:cvs-rev V 4 1.76 PROPS-END SVNH^F82`h\versionid $Id: faq.but,v 1.76 2004/08/20 08:32:30(\e{However}, we've been told that SP2 \e{also} fixes the bug that means you need to use non-\cw{127.0.0.1} addresses to forward Terminal Services.) Revision-number: 4488 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2004-08-20T09:09:01.000000Z K 7 svn:log V 71 alternate-localhost: add "apparently" since none of this is first-hand K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ec2263eb7767103b1721bd44d18d0984 Text-delta-base-sha1: 958ed01857e5835b04d97da0f5a2e8b81fd6f23b Text-content-length: 146 Text-content-md5: 488b4409ac166cde41c1900ad287c863 Text-content-sha1: 444c365540c12d81c7c1fededdd275d636ec866f Content-length: 186 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVN^ir82@V/iu\versionid $Id: faq.but,v 1.77 2004/08/20 09:09:01pparently an issue with SP2 that is acknowledged by Microsoft in Revision-number: 4489 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:44.925168Z PROPS-END Revision-number: 4490 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2004-08-20T09:29:14.000000Z K 7 svn:log V 21 new putty.zone-h.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9d4ab97ec1e8460c5abda1475a6ff31c Text-delta-base-sha1: 380a6797bafa4dc0079b1664e6debba1fb56cf8d Text-content-length: 71 Text-content-md5: 78812a1e7eb99c1a096a70dd3dda740d Text-content-sha1: 6bc1699eda3a14685d5aeeb20086207d08cc8a13 Content-length: 112 K 15 cvs2svn:cvs-rev V 5 1.116 PROPS-END SVN" 2?cputty.zone-h.org/">putty.zone-h.org in Estonia Revision-number: 4491 Prop-content-length: 230 Content-length: 230 K 8 svn:date V 27 2004-08-20T14:04:13.000000Z K 7 svn:log V 129 Patch to use enum constants for cfg.funky_type instead of numeric literals, from "Anthony" <410C2A86.2010003@mail2004.ajrh.net>. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 16bcb93479477b4ac4e2961cb46862bb Text-delta-base-sha1: cad0cb698f53c020838ef237329224a55b364f47 Text-content-length: 142 Text-content-md5: b03ebc0a132d004dc93832f28a641b26 Text-content-sha1: 312ef198af32fa9d0d593cc61032766ac29f8291 Content-length: 183 K 15 cvs2svn:cvs-rev V 5 1.144 PROPS-END SVNm07JS!TuvIlF6}*B+FUNKY_XTERMFUNKY_VT400FUNKY_SCOFUNKY_SCOFUNKY_VT100PFUNKY_LINUXFUNKY_XTERM Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7e0b485710cfca5301ac3cf81dc9a335 Text-delta-base-sha1: 30994c0438c7bf7ee516a1a476ff00c34011654c Text-content-length: 686 Text-content-md5: 136559b40341c85f82236cc39e928f0a Text-content-sha1: 0587bb33c4b74f9ba731e45001facb5305b5200f Content-length: 727 K 15 cvs2svn:cvs-rev V 5 1.267 PROPS-END SVNTj; /^L(KuANcR2KQIf0$?FUNKY_VT400 || (cfg.funky_type <= FUNKY_LINUXFUNKY_XTERM) || cfg.funky_type == FUNKY_VT400FUNKY_VT400 || (cfg.funky_type <= FUNKY_LINUXFUNKY_XTERMFUNKY_XTERM) xkey = 'o'; break; case VK_MULTIPLY: if (cfg.funky_type == FUNKY_XTERM) xkey = 'j'; break; case VK_SUBTRACT: if (cfg.funky_type == FUNKY_XTERMFUNKY_VT400FUNKY_SCOFUNKY_SCOFUNKY_VT100PFUNKY_LINUXFUNKY_XTERMkkWindows...). */ { char xkey = 0; switch (wParam) { case VK_UP: xkey = 'A'; break; case VK_DOWN: xkey = 'B'; break; Revision-number: 4492 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2004-08-20T14:42:22.000000Z K 7 svn:log V 28 new {putty,w3}.omnitech.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 78812a1e7eb99c1a096a70dd3dda740d Text-delta-base-sha1: 6bc1699eda3a14685d5aeeb20086207d08cc8a13 Text-content-length: 98 Text-content-md5: 7308d991f671eaba02749fa2d9f664a1 Text-content-sha1: cb3c303cac847c8f87004bd5cc26939984aadecb Content-length: 139 K 15 cvs2svn:cvs-rev V 5 1.117 PROPS-END SVNoDN{N{putty.omnitech.net/">putty.omnitecw3.omnitech.net/putty/">w3.omnitec Revision-number: 4493 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:45.215447Z PROPS-END Revision-number: 4494 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:45.229678Z PROPS-END Revision-number: 4495 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:45.242609Z PROPS-END Revision-number: 4496 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2004-08-25T08:43:44.000000Z K 7 svn:log V 19 IPv6 patch updated K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ipv6-patch-update Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: f6b9658f4d87a9617652cbcc733f699b Text-delta-base-sha1: ade1e85bb2609de664e52d25dbd46ed2917e5d37 Text-content-length: 21 Text-content-md5: 64d05c34e938e1f35bb456d3707ff7f9 Text-content-sha1: 4f30f1d599657c9cbc8d0b9eb6bb2aec35e0b29d Content-length: 60 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNyy %S&9 Revision-number: 4497 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2004-08-25T09:08:34.000000Z K 7 svn:log V 28 link to AMD64 Windows build K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b3523fcb07238246285d62615f16a8ee Text-delta-base-sha1: a5864d32f9f58e2222b3062234521134ada0c6d1 Text-content-length: 170 Text-content-md5: 9cbbf75845fd094ba5ce5fd6b9d335d3 Text-content-sha1: a6096c810f9c7265ab5e01243bcf84b3e5da65ec Content-length: 210 K 15 cvs2svn:cvs-rev V 4 1.30 PROPS-END SVNk S->js.ofasoft.com/amd64/putty_amd64.zip"> AMD64 Windows build (and the diff to 0.55) Revision-number: 4498 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2004-08-25T09:20:41.000000Z K 7 svn:log V 69 Add comments indicating why these manifest files are present at all. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/pageant.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 90141aa4e171fef470d68e94d997b05d Text-delta-base-sha1: 26116e28ce85b6ebcab9395a0044743c7e76f7db Text-content-length: 187 Text-content-md5: 86486a86dc0237ac625307f5a25dabd6 Text-content-sha1: c6310738dfebd3321a3c27df665bcef363d3919c Content-length: 226 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN~p((H6 .www.ip97.com/mirrors/putty/">ip97 Revision-number: 4602 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:53.360652Z PROPS-END Revision-number: 4603 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:11:53.369850Z PROPS-END Revision-number: 4604 Prop-content-length: 544 Content-length: 544 K 8 svn:date V 27 2004-10-06T22:31:07.000000Z K 7 svn:log V 443 X forwarding changes: - new function platform_get_x_display() to find a sensible local display. On Unix, the Gtk apps weren't taking account of --display when determining where to send forwarded X traffic. - explicitly document that leaving X display location blank in config tries to do something sensible (and that it's now blank by default) - don't override X11Display setting in plink, since that's more properly done later K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0a2bdc16a88a1cdd892c21303cf6343a Text-delta-base-sha1: 586fa49be43e28af4d802cf4eb154540c2a15e2d Text-content-length: 306 Text-content-md5: 60a77bdaa9e169630325d571ccd51b05 Text-content-sha1: f2ec1a78880e04a3a39a125dc7df0903854f48d6 Content-length: 346 K 15 cvs2svn:cvs-rev V 4 1.92 PROPS-END SVNEc4aNw\versionid $Id: config.but,v 1.92 2004/10/06 22:31:0somewhere unusual, you will need to enter its location in the \q{X display location} box; if this is left blank, PuTTY try to find a sensible default in the environment, or use the primary local display (\c{:0}) if that fails Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9a298621f99c014946aaa4b0203ae391 Text-delta-base-sha1: 59d22ca1ebf1eae0e36b6483662d32fec7e89384 Text-content-length: 239 Text-content-md5: dc7c12ac05b1a079fe51d341f1618fe5 Text-content-sha1: a29ca4bea8800aee4ade9b710da83b9b547139a0 Content-length: 279 K 15 cvs2svn:cvs-rev V 4 1.33 PROPS-END SVN-jS4}0\versionid $Id: using.but,v 1.33 2004/10/06 22:31:07is blank by default, which means that PuTTY will try to use a sensible default such as \c{:0}, which is the usual display location where your X server will be Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b458b8bccc135db63b8d35320057a52f Text-delta-base-sha1: 3369f686cc91afafa2d96ad099574e911afa4868 Text-content-length: 101 Text-content-md5: 8ccdb0720db95be18ee3225684d4dc99 Text-content-sha1: 917ecc6a7c7f4ec4747263b904ebd59c951c3bd4 Content-length: 141 K 15 cvs2svn:cvs-rev V 4 1.79 PROPS-END SVNsF O_O[char *platform_get_x_display(void); /* allocated local X display string, if any Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 6e52610dee1f2d8ac6cdc2758b1d9040 Text-delta-base-sha1: 83ccef81a92e00302ab0ed4167194dfcef36caf4 Text-content-length: 15 Text-content-md5: b6dd2f1f328cac087719f710c45e3d76 Text-content-sha1: 500be98cb0c5c380b2975a7f7f57c13004af1dab Content-length: 54 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVN>  Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f7fec101f93d4d9c908f9668a381914c Text-delta-base-sha1: 055f9cd6ba5a210dede65e810e77daee5b16c78f Text-content-length: 212 Text-content-md5: 2c03758c35828ea39f1031293bf103df Text-content-sha1: db4d26851f159c255df7f33f202fbcbcfcc041c0 Content-length: 252 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN^A^A /* * X11-forwarding-related things suitable for console. */ const char platform_x11_best_transport[] = "unix"; char *platform_get_x_display(void) { return dupstr(getenv("DISPLAY")); } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: eb3922e00343fe11cfa85763d5bb4911 Text-delta-base-sha1: 3ca5a35b3739e250b5af5c6aba843440cb631fbb Text-content-length: 22 Text-content-md5: 6849f89dc676fc1835dd877c9cebdb6f Text-content-sha1: 54478d27c5052e7642eb2716667f4445cbc53f2d Content-length: 62 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNF E Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d9f938af4cf4475a41b856692396e9e4 Text-delta-base-sha1: d59a340b81428079f31fe5b6a83931894b017a4e Text-content-length: 420 Text-content-md5: 473d2502f4cfbe77e0b921581d750095 Text-content-sha1: a03c0fad8f954ea37d615a045b7fca7c2535f466 Content-length: 460 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN,5uk1#include CVE Revision-number: 4606 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2004-10-07T10:19:46.000000Z K 7 svn:log V 29 faq-permission: xref licence K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f7225268beac8c95dda266e27f0646f5 Text-delta-base-sha1: 02d6c9ad1e88412ee62b310f9496b76b058d9519 Text-content-length: 108 Text-content-md5: 64d0130120ee88399550a6623f8edeb2 Text-content-sha1: 941933a0524f44ba680cace8822c23d87c60c2c4 Content-length: 148 K 15 cvs2svn:cvs-rev V 4 1.81 PROPS-END SVN!3 RR2\versionid $Id: faq.but,v 1.81 2004/10/07 10:19:46 (see \k{licence}), and you are Revision-number: 4607 Prop-content-length: 209 Content-length: 209 K 7 svn:log V 108 faq-alternate-localhost: You can now download the fix directly rather than having to go through MS support. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-08T12:38:08.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 64d0130120ee88399550a6623f8edeb2 Text-delta-base-sha1: 941933a0524f44ba680cace8822c23d87c60c2c4 Text-content-length: 119 Text-content-md5: 76a8ae84d193c75b22bbf76b34a09181 Text-content-sha1: 248766fd3678cb5ff1bc9eb2d6fde56b432581be Content-length: 159 K 15 cvs2svn:cvs-rev V 4 1.82 PROPS-END SVN3] ]_2!\versionid $Id: faq.but,v 1.82 2004/10/08 12:38:08The article links to a fix you can download Revision-number: 4608 Prop-content-length: 173 Content-length: 173 K 7 svn:log V 71 This commit was manufactured by cvs2svn to create branch 'branch-0-56'. K 10 svn:author V 7 cvs2svn K 8 svn:date V 27 2004-10-08T12:38:08.000000Z PROPS-END Node-path: putty-branch-0.56 Node-kind: dir Node-action: add Node-copyfrom-rev: 4607 Node-copyfrom-path: putty Revision-number: 4609 Prop-content-length: 1758 Content-length: 1758 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-13T11:50:16.000000Z K 7 svn:log V 1656 Re-engineering of terminal emulator, phase 1. The active terminal screen is no longer an array of `unsigned long' encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of `termchar' structures, which currently have 32-bit Unicode and 32 attribute bits but which will probably expand further in future. To prevent bloat of the memory footprint, I've introduced a mostly RLE-like compression scheme for storing scrollback: each line is compressed into a compact (but hard to modify) form when it moves into the term->scrollback tree, and is temporarily decompressed when the user wants to scroll back over it. My initial tests suggest that this compression averages about 1/4 of the previous (32 bits per character cell) data size in typical output, which means this is an improvement even without counting the new ability to extend the information stored in each character cell. Another beneficial side effect is that the insane format in which Unicode was passed to front ends through do_text() has now been rendered sane. Testing is incomplete; this _may_ still have instabilities. Windows and Unix front ends both seem to work as far as I've looked, but I haven't yet looked very hard. The Mac front end I've edited (it seemed obvious how to change it) but I can't compile or test it. As an immediate functional effect, the terminal emulator now supports full 32-bit Unicode to whatever extent the host platform allows it to. For example, if you output a 4-or-more-byte UTF-8 character in Unix pterm, it will not display it properly, but it will correctly paste it back out in a UTF8_STRING selection. Windows is more restricted, sadly. PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 066c83bfd4d11ac88380ab56ffba49aa Text-delta-base-sha1: 49d06d5c925d832d9080808797d49b13acf5a017 Text-content-length: 116 Text-content-md5: 299ad11c9667b76fe285249c4da79b92 Text-content-sha1: 277fcf6fc8bd99e9b045da4b4b3442d411275b4a Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.77 PROPS-END SVNY&A72om*zp<96y/* $Id: macterm.c,v 1.77 2004/10/13 11:50:16 simonwchar_ttexttext Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1755022df9d006339e6f6c0540d8f0bf Text-delta-base-sha1: fe8fbaa33767bfb05d122583469ab4b7d5bb88a1 Text-content-length: 1434 Text-content-md5: f1449d5b266c9c6886cebd7fe84f7b5d Text-content-sha1: 6ad1e002bb47b7f45bd536cd44e1b573bda3ccf2 Content-length: 1475 K 15 cvs2svn:cvs-rev V 5 1.232 PROPS-END SVNa4X|PB>WW3TMfN&i0000000UL /* active cursor (block) */ #define TATTR_PASCURS 0x2000000000000000000001UL #define LATTR_TOP 0x00000002UL #define LATTR_BOT 0x00000003UL #define LATTR_MODE 0x00000003UL #define LATTR_WRAPPED 0x00000010UL #define LATTR_WRAPPED2 0x00000020UL #define ATTR_INVALID 0x03FFU /* Like Linux use the F000 page for direct to font. */ #define CSET_OEMCP 0x0000F000UL /* OEM Codepage DTF */ #define CSETCSET_ASCII 0x0000D800UL /* normal ASCII charset ESC ( B */ #define CSET_LINEDRW 0x0000D900UL /* line drawing charset ESC ( 0 */ #define CSET_SCOACS 0x0000DA00UL /* SCO Alternate charset */ #define CSET_GBCHR 0x0000DB00UL /* UK variant charset ESC ( A */ #define CSET_MASK 0xFFFFFF00UL /* Character set mask */ #define DIRECT_CHAR(c) ((c&0xFFFFFC00)==0xD800) #define DIRECT_FONT(c) ((c&0xFFFFFE00)==0xF000) #define UCSERR (CSETU #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_FGSHIFT 0 #define ATTR_BGSHIFT 5 #define ATTR_DEFAULT 0x0128U /* bg 9, fg 8 */ #define ATTR_DEFFG 0x0008U #define ATTR_DEFBG 0x0120UUwchar_t *, int, unsigned long, int); void do_cursor(Context, int, int, wchar_t Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 197a255ba8ad9faf65e6b76bba31ae64 Text-delta-base-sha1: 739bf703d8a3d5c776401ee661897b5cbc601759 Text-content-length: 38779 Text-content-md5: 45b996f85342a804cbaa756391e5facd Text-content-sha1: 95e474c95eeb17af42ed821c41fbb6094637720c Content-length: 38820 K 15 cvs2svn:cvs-rev V 5 1.168 PROPS-END SVNQsdxISA?f":~QD.:v':mn?'U.NPj+kh!x?]7\,q9L#J ubL>u("S{n| ] AC~aVeF6"veW5>sYvIx(J$gE$0/H)\V _?fXrN}.-.Kam[[P-8 Z h v0 ;[v WOhOF "Kt](H[a)[(x)].chr == UCSWIDE ? (a)[(x)-1].chr : (a)[(x)].chr ) /* * Detect the various aliases of U+0020 SPACE. */ #define IS_SPACE_CHR(chr) \ ((chr) == 0x20 || (DIRECT_CHAR(chr) && ((chr) & 0xFF) == 0x20)) /* * Spot magic CSETs. */ #define CSET_OF(chr) (DIRECT_CHAR(chr)||DIRECT_FONT(chr) ? (chr)&CSET_MASK : 0) /* * Internal prototypes. */ static void resizeline(Terminal *, termline *, int); static termline *lineptr(Terminal *, int, int, int); static void unlineptr(termline *static termline *newline(Terminal *term, int cols, int bce) { termline *line; int j; line = snew(termline); line->chars = snewn(cols, termchar); for (j = 0; j < cols; j++) line->chars[j] = (bce ? term->erase_char : term->basic_erase_char); line->cols = cols; line->lattr = LATTR_NORM; line->temporary = FALSE; return line; } static void freeline(termline *line) { sfree(line->chars); sfree(line); } static void unlineptr(termline *line) { if (line->temporary) freeline(line); } /* * Compress and decompress a termline into an RLE-based format for * storing in scrollback. (Since scrollback almost never needs to * be modified and exists in huge quantities, this is a sensible * tradeoff, particularly since it allows us to continue adding * features to the main termchar structure without proportionally * bloating the terminal emulator's memory footprint unless those * features are in constant use.) */ struct buf { unsigned char *data; int len, size; }; static void add(struct buf *b, unsigned char c) { if (b->len >= b->size) { b->size = (b->len * 3 / 2) + 512; b->data = sresize(b->data, b->size, unsigned char); } b->data[b->len++] = c; } static int get(struct buf *b) { return b->data[b->len++]; } static void makerle(struct buf *b, termline *ldata, void (*makeliteral)(struct buf *b, termchar *c, unsigned long *state)) { int hdrpos, hdrsize, n, prevlen, prevpos, thislen, thispos, prev2; termchar *c = ldata->chars; unsigned long state = 0, oldstate; n = ldata->cols; hdrpos = b->len; hdrsize = 0; add(b, 0); prevlen = prevpos = 0; prev2 = FALSE; while (n-- > 0) { thispos = b->len; makeliteral(b, c++, &state); thislen = b->len - thispos; if (thislen == prevlen && !memcmp(b->data + prevpos, b->data + thispos, thislen)) { /* * This literal precisely matches the previous one. * Turn it into a run if it's worthwhile. * * With one-byte literals, it costs us two bytes to * encode a run, plus another byte to write the header * to resume normal output; so a three-element run is * neutral, and anything beyond that is unconditionally * worthwhile. With two-byte literals or more, even a * 2-run is a win. */ if (thislen > 1 || prev2) { int runpos, runlen; /* * It's worth encoding a run. Start at prevpos, * unless hdrsize==0 in which case we can back up * another one and start by overwriting hdrpos. */ hdrsize--; /* remove the literal at prevpos */ if (prev2) { assert(hdrsize > 0); hdrsize--; prevpos -= prevlen;/* and possibly another one */ } if (hdrsize == 0) { assert(prevpos == hdrpos + 1); runpos = hdrpos; b->len = prevpos+prevlen; } else { memmove(b->data + prevpos+1, b->data + prevpos, prevlen); runpos = prevpos; b->len = prevpos+prevlen+1; /* * Terminate the previous run of ordinary * literals. */ assert(hdrsize >= 1 && hdrsize <= 128); b->data[hdrpos] = hdrsize - 1; } runlen = prev2 ? 3 : 2; while (n > 0 && runlen < 129) { int tmppos, tmplen; tmppos = b->len; oldstate = state; makeliteral(b, c, &state); tmplen = b->len - tmppos; b->len = tmppos; if (tmplen != thislen || memcmp(b->data + runpos+1, b->data + tmppos, tmplen)) { state = oldstate; break; /* run over */ } n--, c++, runlen++; } assert(runlen >= 2 && runlen <= 129); b->data[runpos] = runlen + 0x80 - 2; hdrpos = b->len; hdrsize = 0; add(b, 0); continue; } else { /* * Just flag that the previous two literals were * identical, in case we find a third identical one * we want to turn into a run. */ prev2 = TRUE; prevlen = thislen; prevpos = thispos; } } else { prev2 = FALSE; prevlen = thislen; prevpos = thispos; } /* * This character isn't (yet) part of a run. Add it to * hdrsize. */ hdrsize++; if (hdrsize == 128) { b->data[hdrpos] = hdrsize - 1; hdrpos = b->len; hdrsize = 0; add(b, 0); prevlen = prevpos = 0; prev2 = FALSE; } } /* * Clean up. */ if (hdrsize > 0) { assert(hdrsize <= 128); b->data[hdrpos] = hdrsize - 1; } else { b->len = hdrpos; } } static void makeliteral_chr(struct buf *b, termchar *c, unsigned long *state) { /* * My encoding for characters is UTF-8-like, in that it stores * 7-bit ASCII in one byte and uses high-bit-set bytes as * introducers to indicate a longer sequence. However, it's * unlike UTF-8 in that it doesn't need to be able to * resynchronise, and therefore I don't want to waste two bits * per byte on having recognisable continuation characters. * Also I don't want to rule out the possibility that I may one * day use values 0x80000000-0xFFFFFFFF for interesting * purposes, so unlike UTF-8 I need a full 32-bit range. * Accordingly, here is my encoding: * * 00000000-0000007F: 0xxxxxxx (but see below) * 00000080-00003FFF: 10xxxxxx xxxxxxxx * 00004000-001FFFFF: 110xxxxx xxxxxxxx xxxxxxxx * 00200000-0FFFFFFF: 1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx * 10000000-FFFFFFFF: 11110ZZZ xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx * * (`Z' is like `x' but is always going to be zero since the * values I'm encoding don't go above 2^32. In principle the * five-byte form of the encoding could extend to 2^35, and * there could be six-, seven-, eight- and nine-byte forms as * well to allow up to 64-bit values to be encoded. But that's * completely unnecessary for these purposes!) * * The encoding as written above would be very simple, except * that 7-bit ASCII can occur in several different ways in the * terminal data; sometimes it crops up in the D800 page * (CSET_ASCII) but at other times it's in the 0000 page (real * Unicode). Therefore, this encoding is actually _stateful_: * the one-byte encoding of 00-7F actually indicates `reuse the * upper three bytes of the last character', and to encode an * absolute value of 00-7F you need to use the two-byte form * instead. */ if ((c->chr & ~0x7F) == *state) { add(b, (unsigned char)(c->chr & 0x7F)); } else if (c->chr < 0x4000) { add(b, (unsigned char)(((c->chr >> 8) & 0x3F) | 0x80)); add(b, (unsigned char)(c->chr & 0xFF)); } else if (c->chr < 0x200000) { add(b, (unsigned char)(((c->chr >> 16) & 0x1F) | 0xC0)); add(b, (unsigned char)((c->chr >> 8) & 0xFF)); add(b, (unsigned char)(c->chr & 0xFF)); } else if (c->chr < 0x10000000) { add(b, (unsigned char)(((c->chr >> 24) & 0x0F) | 0xE0)); add(b, (unsigned char)((c->chr >> 16) & 0xFF)); add(b, (unsigned char)((c->chr >> 8) & 0xFF)); add(b, (unsigned char)(c->chr & 0xFF)); } else { add(b, 0xF0); add(b, (unsigned char)((c->chr >> 24) & 0xFF)); add(b, (unsigned char)((c->chr >> 16) & 0xFF)); add(b, (unsigned char)((c->chr >> 8) & 0xFF)); add(b, (unsigned char)(c->chr & 0xFF)); } *state = c->chr & ~0xFF; } static void makeliteral_attr(struct buf *b, termchar *c, unsigned long *state) { /* * My encoding for attributes is 16-bit-granular and assumes * that the top bit of the word is never required. I either * store a two-byte value with the top bit clear (indicating * just that value), or a four-byte value with the top bit set * (indicating the same value with its top bit clear). */ if (c->attr < 0x8000) { add(b, (unsigned char)((c->attr >> 8) & 0xFF)); add(b, (unsigned char)(c->attr & 0xFF)); } else { add(b, (unsigned char)(((c->attr >> 24) & 0x7F) | 0x80)); add(b, (unsigned char)((c->attr >> 16) & 0xFF)); add(b, (unsigned char)((c->attr >> 8) & 0xFF)); add(b, (unsigned char)(c->attr & 0xFF)); } } static termline *decompressline(unsigned char *data, int *bytes_used); static unsigned char *compressline(termline *ldata) { struct buf buffer = { NULL, 0, 0 }, *b = &buffer; /* * First, store the column count, 7 bits at a time, least * significant `digit' first, with the high bit set on all but * the last. */ { int n = ldata->cols; while (n >= 128) { add(b, (unsigned char)((n & 0x7F) | 0x80)); n >>= 7; } add(b, (unsigned char)(n)); } /* * Next store the lattrs; same principle. */ { int n = ldata->lattr; while (n >= 128) { add(b, (unsigned char)((n & 0x7F) | 0x80)); n >>= 7; } add(b, (unsigned char)(n)); } /* * Now we store a sequence of separate run-length encoded * fragments, each containing exactly as many symbols as there * are columns in the ldata. * * All of these have a common basic format: * * - a byte 00-7F indicates that X+1 literals follow it * - a byte 80-FF indicates that a single literal follows it * and expects to be repeated (X-0x80)+2 times. * * The format of the `literals' varies between the fragments. */ makerle(b, ldata, makeliteral_chr); makerle(b, ldata, makeliteral_attr); /* * Diagnostics: ensure that the compressed data really does * decompress to the right thing. */ #ifndef CHECK_SB_COMPRESSION { int dused; termline *dcl; #ifdef DIAGNOSTIC_SB_COMPRESSION int i; for (i = 0; i < b->len; i++) { printf(" %02x ", b->data[i]); } printf("\n"); #endif dcl = decompressline(b->data, &dused); assert(b->len == dused); assert(ldata->cols == dcl->cols); assert(ldata->lattr == dcl->lattr); assert(!memcmp(ldata->chars, dcl->chars, ldata->cols * TSIZE)); #ifdef DIAGNOSTIC_SB_COMPRESSION printf("%d cols (%d bytes) -> %d bytes (factor of %g)\n", ldata->cols, 4 * ldata->cols, dused, (double)dused / (4 * ldata->cols)); #endif freeline(dcl); } #endif /* * Trim the allocated memory so we don't waste any, and return. */ return sresize(b->data, b->len, unsigned char); } static void readrle(struct buf *b, termline *ldata, void (*readliteral)(struct buf *b, termchar *c, unsigned long *state)) { int n = 0; unsigned long state = 0; while (n < ldata->cols) { int hdr = get(b); if (hdr >= 0x80) { /* A run. */ int pos = b->len, count = hdr + 2 - 0x80; while (count--) { assert(n < ldata->cols); b->len = pos; readliteral(b, ldata->chars + n, &state); n++; } } else { /* Just a sequence of consecutive literals. */ int count = hdr + 1; while (count--) { assert(n < ldata->cols); readliteral(b, ldata->chars + n, &state); n++; } } } assert(n == ldata->cols); } static void readliteral_chr(struct buf *b, termchar *c, unsigned long *state) { int byte; /* * 00000000-0000007F: 0xxxxxxx * 00000080-00003FFF: 10xxxxxx xxxxxxxx * 00004000-001FFFFF: 110xxxxx xxxxxxxx xxxxxxxx * 00200000-0FFFFFFF: 1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx * 10000000-FFFFFFFF: 11110ZZZ xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx */ byte = get(b); if (byte < 0x80) { c->chr = byte | *state; } else if (byte < 0xC0) { c->chr = (byte &~ 0xC0) << 8; c->chr |= get(b); } else if (byte < 0xE0) { c->chr = (byte &~ 0xE0) << 16; c->chr |= get(b) << 8; c->chr |= get(b); } else if (byte < 0xF0) { c->chr = (byte &~ 0xF0) << 24; c->chr |= get(b) << 16; c->chr |= get(b) << 8; c->chr |= get(b); } else { assert(byte == 0xF0); c->chr = get(b) << 24; c->chr |= get(b) << 16; c->chr |= get(b) << 8; c->chr |= get(b); } *state = c->chr & ~0xFF; } static void readliteral_attr(struct buf *b, termchar *c, unsigned long *state) { int val; val = get(b) << 8; val |= get(b); if (val >= 0x8000) { val <<= 16; val |= get(b) << 8; val |= get(b); } c->attr = val; } static termline *decompressline(unsigned char *data, int *bytes_used) { int ncols, byte, shift; struct buf buffer, *b = &buffer; termline *ldata; b->data = data; b->len = 0; /* * First read in the column count. */ ncols = shift = 0; do { byte = get(b); ncols |= (byte & 0x7F) << shift; shift += 7; } while (byte & 0x80); /* * Now create the output termline. */ ldata = snew(termline); ldata->chars = snewn(ncols, termchar); ldata->cols = ncols; ldata->temporary = TRUE; /* * Now read in the lattr. */ ldata->lattr = shift = 0; do { byte = get(b); ldata->lattr |= (byte & 0x7F) << shift; shift += 7; } while (byte & 0x80); /* * Now we read in each of the RLE streams in turn. */ readrle(b, ldata, readliteral_chr); readrle(b, ldata, readliteral_attr); /* Return the number of bytes read, for diagnostic purposes. */ if (bytes_used) *bytes_used = b->len; return ldata; }void resizeline(Terminal *term, termline *line, int cols) { int i, oldlen; if (line->cols != ->cols; line->chars = sresize(line->chars, cols, TTYPE); line->cols = cols; for (i = oldlen; i < cols; i++) line->chars[i] = term->basic_erase_char; }termline *lineptr(Terminal *term, int y, int lineno, int screen) { termline * assert(!screen); if (whichtree == term->scrollback) { unsigned char *cline = index234(whichtree, treeindex); line = decompressline(cline, NULL); } else { line = index234(whichtree, treeindex); } /* We assume that we don't screw up and retrieve something out of range. */ assert(line != NULL); resizeline(term, line, term->cols); /* FIXME: should we sort the compressed scrollback out here? */ return line; } #define lineptr(x) (lineptr)(term,x,__LINE__,FALSE) #define scrlineptr(x) (lineptr)(term,x,__LINE__,TRUECSETterm->basic_erase_chartermcharstatic void set_erase_char(Terminal *term) { term->erase_char = term->basic_erase_char; if (term->use_bce) term->erase_char.attr = (term->curr_attr & (ATTR_FGMASK | ATTR_BGMASK)set_erase_char(term)CSETtermline /* this is compressed data, not a termline */NULL; term->dispcursx = term->dispcursy = -1term->basic_erase_char.chr = CSET_ASCII | ' '; term->basic_erase_char.attr = ATTR_DEFAULT; return term; } void term_free(Terminal *term) { termline /* compressed data, not a termline */freeline(line); freetree234(term->screen); while ((line = delpos234(term->alt_screen, 0)) != NULL) freeline(line); freetree234(term->alt_screen); if (term->disptext) { for (i = 0; i < term->rows; i++) freeline(term->disptext[i]); }termline *unsigned char *cline; /* Insert a line from the scrollback at the top of the screen. */ assert(sblen >= term->tempsblines); cline = delpos234(term->scrollback, --sblen); line = decompressline(cline, NULL); sfree(cline); line->temporary = FALSE; /* reconstituted line is now real */newline(term, newcols, FALSE)compressline(line), sblen++); freeline(line, termline *); for (i = 0; i < newrows; i++) { newdisp[i] = newline(term, newcols, FALSE); for (j = 0; j < newcols; j++) newdisp[i]->chars[i].attr = ATTR_INVALID; } if (term->disptext) { for (i = 0; i < term->rows; i++) freeline(term->disptext[i]); }x = term->dispcursy = -1newline(term, newcols, TRUE)freelintermline *line = index234(screen, i); int j; for (j = 0; j < line->cols; j++) { if (line->chars[j].chr != term->erase_char.chr || line->chars[j].attr != term->erase_char.attr) break; } if (j != line->termline *lineresizeline(term, line, term->cols); for (i = 0; i < term->cols; i++) line->chars[i] = term->erase_char; line->lattr = LATTR_NORMif * the scrollback is full. */ if (sblen == term->savelines) { unsigned char *cline; sblen--; cline = delpos234(term->scrollback, 0); sfree(cline); } else term->tempsblines += 1; addpos234(term->scrollback, compressline(line), sblen); line = newline(term, term->cols, TRUE)resizeline(term, line, term->cols); for (i = 0; i < term->cols; i++) line->chars[i] = term->erase_char; line->lattrint distance, nlines, i; distance = lines > 0 ? lines : -lines; nlines = botline - topline + 1 - distance; if (lines > 0) { for (i = 0; i < nlines; i++) memcpy(term->disptext[start+i]->chars, term->disptext[start+i+distance]->chars, term->cols * TSIZE); if (term->dispcursy >= 0 && term->dispcursy >= topline + distance && term->dispcursy < topline + distance + nlines) term->dispcursy -= distance; for (i = 0; i < distance; i++) for (j = 0; j < term->cols; j++) term->disptext[start+nlines+i]->chars[j].attr |= ATTR_INVALID; } else { for (i = nlines; i-- ;) memcpy(term->disptext[start+i+distance]->chars, term->disptext[start+i]->chars, term->cols * TSIZE); if (term->dispcursy >= 0 && term->dispcursy >= topline && term->dispcursy < topline + nlines) term->dispcursy += distance; for (i = 0; i < distance; i++) for (j = 0; j < term->cols; j++) term->disptext[start+i]->chars[j].attrset_erase_char(termtermlinescrlineptr(y); if (x == term->cols) { ldata->lattr &= ~LATTR_WRAPPED2; } else { if (ldata->chars[x].chr == UCSWIDE) { ldata->chars[x-1].chr = ' ' | CSET_ASCII; ldata->chars[x] = ldata->chars[x-1]termline *ldata = scrlineptr(start.y); while (poslt(start, end)) { if (start.x == term->cols) { if (!erase_lattr) ldata->lattr &= ~(LATTR_WRAPPED | LATTR_WRAPPED2); else ldata->lattr = LATTR_NORM; } else { ldata->chars[start.x] = term->erase_char; } if (incpos(start) && start.y < term->rows) { ldata = scrlineptr(start.y); }termlinescrlineptr(term->curs.y); if (dir < 0) { memmove(ldata->chars + term->curs.x, ldata->chars + term->curs.x + n, m * TSIZE); while (n--) ldata->chars[term->curs.x + m++] = term->erase_char; } else { memmove(ldata->chars + term->curs.x + n, ldata->chars + term->curs.x, m * TSIZE); while (n--) ldata->charsunsigned long c; intCSETCSETCSET_LINEDRWCSET_LINEDRW; break; case CSET_GBCHR: /* If UK-ASCII, make the '#' a LineDraw Pound */ if (c == '#') { c = '}' | CSET_LINEDRW; break; } /*FALLTHROUGH*/ case CSETCSET_ASCII; break; case CSET_SCOACS: if (c>=' ') c = ((unsigned char)c) | CSET/* destructive backspace might be disabled */ if (!term->cfg.no_dbackspace) { term->cpos->chr = ' ' | CSET_ASCII; term->cpos->attr = term->curr_attr; } } else /* Or normal C0 controls. */ if ((c & ~0x1Ftermline *ldata = scr->lattrscrlineptr(term->curs.y)->lattrCSETterm->cpos->chr = CSET_ASCII | ' '; term->cpos->attr = term->curr_attr; scrlineptr(term->curs.y)->lattr |= term->cpos->chr = c; term->cpos->attr = term->curr_attr; term->cpos++; term->cpos->chr = UCSWIDE; term->cpos->attr =term->cpos->chr = c; term->cpos->attr = term->curr_attr; term->cpos++scrlineptr(term->curs.y)->lattrtermline *ldata; int i, j; pos scrtop, scrbot; for (i = 0; i < term->rows; i++) { ldata = scrlineptr(i); for (j = 0; j < term->cols; j++) { ldata->chars[j] = term->basic_erase_char; ldata->chars[j].chr = 'E'; } ldata->lattr = LATTR_NORMint nlattr; scrlineptr(term->curs.y)->lattr CSETCSETCSETCSETCSETCSET_ASCII; break; case ANSI('0', ')1] = CSETCSETset_erase_char(termtermcharset_erase_char(term(char)(int)c >= '0' && (int)c <= '9') val = c - '0'; else if ((int)c >= 'A' && (int)c <= 'A' + max - 10) val = c - 'A' + 10; else if ((int)c >= 'a' && (int)ZpQ|Q:t=xXTw[[qlug Rte6"@zqr(8lN:v[bhVxpulSu4QtzrKZv,w0E/CI:'tbTt*O6a*,UdhKTgs[0] + c - '0'; break; default: term->termstate = OSC_STRING; term->osc_strlen = 0; } break; case VT52_ESC: term->termstate = TOPLEVEL; term->seen_disp_event = TRUE; switch (c) { case 'A': move(term, term->curs.x, term->curs.y - 1, 1); break; case 'B': move(term, term->curs.x, term->curs.y + 1, 1); break; case 'C': move(term, term->curs.x + 1, term->curs.y, 1); break; case 'D': move(term, term->curs.x - 1, term->curs.y, 1); break; /* * From the VT100 Manual * NOTE: The special graphics characters in the VT100 * are different from those in the VT52 * * From VT102 manual: * 137 _ Blank - Same * 140 ` Reserved - Humm. * 141 a Solid rectangle - Similar * 142 b 1/ - Top half of fraction for the * 143 c 3/ - subscript numbers below. * 144 d 5/ * 145 e 7/ * 146 f Degrees - Same * 147 g Plus or minus - Same * 150 h Right arrow * 151 i Ellipsis (dots) * 152 j Divide by * 153 k Down arrow * 154 l Bar at scan 0 * 155 m Bar at scan 1 * 156 n Bar at scan 2 * 157 o Bar at scan 3 - Similar * 160 p Bar at scan 4 - Similar * 161 q Bar at scan 5 - Similar * 162 r Bar at scan 6 - Same * 163 s Bar at scan 7 - Similar * 164 t Subscript 0 * 165 u Subscript 1 * 166 v Subscript 2 * 167 w Subscript 3 * 170 x Subscript 4 * 171 y Subscript 5 * 172 z Subscript 6 * 173 { Subscript 7 * 174 | Subscript 8 * 175 } Subscript 9 * 176 ~ Paragraph * */ case 'F': term->cset_attr[term->cset = 0] = CSET_LINEDRW; break; case 'G': term->cset_attr[term->cset = 0] = CSET_ASCII; break; case 'H': move(term, 0, 0, 0); break; case 'I': if (term->curs.y == 0) scroll(term, 0, term->rows - 1, -1, TRUE); else if (term->curs.y > 0) term->curs.y--; fix_cpos; term->wrapnext = FALSE; break; case 'J': erase_lots(term, FALSE, FALSE, TRUE); term->disptop = 0; break; case 'K': erase_lots(term, TRUE, FALSE, TRUE); break; #if 0 case 'V': /* XXX Print cursor line */ break; case 'W': /* XXX Start controller mode */ break; case 'X': /* XXX Stop controller mode */ break; #endif case 'Y': term->termstate = VT52_Y1; break; case 'Z': if (term->ldisc) ldisc_send(term->ldisc, "\033/Z", 3, 0); break; case '=': term->app_keypad_keys = TRUE; break; case '>': term->app_keypad_keys = FALSE; break; case '<': /* XXX This should switch to VT100 mode not current or default * VT mode. But this will only have effect in a VT220+ * emulation. */ term->vt52_mode = FALSE; term->blink_is_real = term->cfg.blinktext; break; #if 0 case '^': /* XXX Enter auto print mode */ break; case '_': /* XXX Exit auto print mode */ break; case ']': /* XXX Print screen */ break; #endif #ifdef VT52_PLUS case 'E': /* compatibility(ATARI) */ move(term, 0, 0, 0); erase_lots(term, FALSE, FALSE, TRUE); term->disptop = 0; break; case 'L': /* compatibility(ATARI) */ if (term->curs.y <= term->marg_b) scroll(term, term->curs.y, term->marg_b, -1, FALSE); break; case 'M': /* compatibility(ATARI) */ if (term->curs.y <= term->marg_b) scroll(term, term->curs.y, term->marg_b, 1, TRUE); break; case 'b': /* compatibility(ATARI) */ term->termstate = VT52_FG; break; case 'c': /* compatibility(ATARI) */ term->termstate = VT52_BG; break; case 'd': /* compatibility(ATARI) */ erase_lots(term, FALSE, TRUE, FALSE); term->disptop = 0; break; case 'e': /* compatibility(ATARI) */ term->cursor_on = TRUE; break; case 'f': /* compatibility(ATARI) */ term->cursor_on = FALSE; break; /* case 'j': Save cursor position - broken on ST */ /* case 'k': Restore cursor position */ case 'l': /* compatibility(ATARI) */ erase_lots(term, TRUE, TRUE, TRUE); term->curs.x = 0; term->wrapnext = FALSE; fix_cpos; break; case 'o': /* compatibility(ATARI) */ erase_lots(term, TRUE, TRUE, FALSE); break; case 'p': /* compatibility(ATARI) */ term->curr_attr |= ATTR_REVERSE; break; case 'q': /* compatibility(ATARI) */ term->curr_attr &= ~ATTR_REVERSE; break; case 'v': /* wrap Autowrap on - Wyse style */ /* compatibility(ATARI) */ term->wrap = 1; break; case 'w': /* Autowrap off */ /* compatibility(ATARI) */ term->wrap = 0; break; case 'R': /* compatibility(OTHER) */ term->vt52_bold = FALSE; term->curr_attr = ATTR_DEFAULT; set_erase_char(term); break; case 'S': /* compatibility(VI50) */ term->curr_attr |= ATTR_UNDER; break; case 'W': /* compatibility(VI50) */ term->curr_attr &= ~ATTR_UNDER; break; case 'U': /* compatibility(VI50) */ term->vt52_bold = TRUE; term->curr_attr |= ATTR_BOLD; break; case 'T': /* compatibility(VI50) */ term->vt52_bold = FALSE; term->curr_attr &= ~ATTR_BOLD; break; #endif } break; case VT52_Y1: term->termstate = VT52_Y2; move(term, term->curs.x, c - ' ', 0); break; case VT52_Y2: term->termstate = TOPLEVEL; move(term, c - ' ', term->curs.y, 0); break; #ifdef VT52_PLUS case VT52_FG: term->termstate = TOPLEVEL; term->curr_attr &= ~ATTR_FGMASK; term->curr_attr &= ~ATTR_BOLD; term->curr_attr |= (c & 0x7) << ATTR_FGSHIFT; if ((c & 0x8) || term->vt52_bold) term->curr_attr |= ATTR_BOLD; set_erase_char(term); break; case VT52_BG: term->termstate = TOPLEVEL; term->curr_attr &= ~ATTR_BGMASK; term->curr_attr &= ~ATTR_BLINK; term->curr_attr |= (c & 0x7) << ATTR_BGSHIFT; /* Note: bold background */ if (c & 0x8) term->curr_attr |= ATTR_BLINK; set_erase_char(term); break; #endif default: break; /* placate gcc warning about enum use */ } if (term->selstate != NO_SELECTION) { pos cursplus = term->curs; incpos(cursplus); check_selection(term, term->curs, cursplus); } } term_print_flush(term); logflush(term->logctx); } /* * To prevent having to run the reasonably tricky bidi algorithm * too many times, we maintain a cache of the last lineful of data * fed to the algorithm on each line of the display. */ static int term_bidi_cache_hit(Terminal *term, int line, termchar *lbefore, int width) { if (!term->pre_bidi_cache) return FALSE; /* cache doesn't even exist yet! */ if (line >= term->bidi_cache_size) return FALSE; /* cache doesn't have this many lines */ if (!term->pre_bidi_cache[line]) return FALSE; /* cache doesn't contain _this_ line */ if (!memcmp(term->pre_bidi_cache[line], lbefore, width * TSIZE)) return TRUE; /* aha! the line matches the cache */ return FALSE; /* it didn't match. */ } static void term_bidi_cache_store(Terminal *term, int line, termchar *lbefore, termchar *lafter, int width) { if (!term->pre_bidi_cache || term->bidi_cache_size <= line) { int j = term->bidi_cache_size; term->bidi_cache_size = line+1; term->pre_bidi_cache = sresize(term->pre_bidi_cache, term->bidi_cache_size, termchar *); term->post_bidi_cache = sresize(term->post_bidi_cache, term->bidi_cache_size, termchar *); while (j < term->bidi_cache_size) { term->pre_bidi_cache[j] = term->post_bidi_cache[j] = NULL; j++; } } sfree(term->pre_bidi_cache[line]); sfree(term->post_bidi_cache[line]); term->pre_bidi_cache[line] = snewn(width, termchar); term->post_bidi_cache[line] = snewn(width, termchar); memcpy(term->pre_bidi_cache[line], lbefore, width * TSIZE); memcpy(term->post_bidi_cache[line], lafter, width * TSIZE); } /* * Given a context, update the window. Out of paranoia, we don't * allow WM_PAINT responses to do scrolling optimisations. */ static void do_paint(Terminal *term, Context ctx, int may_optimise) { int i, it, j, our_curs_y, our_curs_x; int rv, cursor; pos scrpos; wchar_t ch[1024]; termchar cursor_background; unsigned long ticks; #ifdef OPTIMISE_SCROLL struct scrollregion *sr; #endif /* OPTIMISE_SCROLL */ cursor_background = term->basic_erase_char; /* * Check the visual bell state. */ if (term->in_vbell) { ticks = GETTICKCOUNT(); if (ticks - term->vbell_startpoint >= VBELL_TIMEOUT) term->in_vbell = FALSE; } rv = (!term->rvideo ^ !term->in_vbell ? ATTR_REVERSE : 0); /* Depends on: * screen array, disptop, scrtop, * selection, rv, * cfg.blinkpc, blink_is_real, tblinker, * curs.y, curs.x, blinker, cfg.blink_cur, cursor_on, has_focus, wrapnext */ /* Has the cursor position or type changed ? */ if (term->cursor_on) { if (term->has_focus) { if (term->blinker || !term->cfg.blink_cur) cursor = TATTR_ACTCURS; else cursor = 0; } else cursor = TATTR_PASCURS; if (term->wrapnext) cursor |= TATTR_RIGHTCURS; } else cursor = 0; our_curs_y = term->curs.y - term->disptop; { /* * Adjust the cursor position in the case where it's * resting on the right-hand half of a CJK wide character. * xterm's behaviour here, which seems adequate to me, is * to display the cursor covering the _whole_ character, * exactly as if it were one space to the left. */ termline *ldata = lineptr(term->curs.y); our_curs_x = term->curs.x; if (our_curs_x > 0 && ldata->chars[our_curs_x].chr == UCSWIDE) our_curs_x--; unlineptr(ldata); } /* * If the cursor is not where it was last time we painted, and * its previous position is visible on screen, invalidate its * previous position. */ if (term->dispcursy >= 0 && (term->curstype != cursor || term->dispcursy != our_curs_y || term->dispcursx != our_curs_x)) { termchar *dispcurs = term->disptext[term->dispcursy]->chars + term->dispcursx; if (term->dispcursx > 0 && dispcurs->chr == UCSWIDE) dispcurs[-1].attr |= ATTR_INVALID; if (term->dispcursx < term->cols-1 && dispcurs[1].chr == UCSWIDE) dispcurs[1].attr |= ATTR_INVALID; dispcurs->attr |= ATTR_INVALID; term->curstype = 0; } term->dispcursx = term->dispcursy = -1; #ifdef OPTIMISE_SCROLL /* Do scrolls */ sr = term->scrollhead; while (sr) { struct scrollregion *next = sr->next; do_scroll(ctx, sr->topline, sr->botline, sr->lines); sfree(sr); sr = next; } term->scrollhead = term->scrolltail = NULL; #endif /* OPTIMISE_SCROLL */ /* The normal screen data */ for (i = 0; i < term->rows; i++) { termline *ldata; termchar *lchars; int dirty_line, dirty_run, selected; unsigned long attr = 0, cset = 0; int updated_line = 0; int start = 0; int ccount = 0; int last_run_dirty = 0; scrpos.y = i + term->disptop; ldata = lineptr(scrpos.y); dirty_run = dirty_line = (ldata->lattr != term->disptext[i]->lattr); term->disptext[i]->lattr = ldata->lattr; /* Do Arabic shaping and bidi. */ if(!term->cfg.bidi || !term->cfg.arabicshaping) { if (!term_bidi_cache_hit(term, i, ldata->chars, term->cols)) { for(it=0; itcols ; it++) { unsigned long uc = (ldata->chars[it].chr); switch (uc & CSET_MASK) { case CSET_LINEDRW: if (!term->cfg.rawcnp) { uc = term->ucsdata->unitab_xterm[uc & 0xFF]; break; } case CSET_ASCII: uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case CSET_SCOACS: uc = term->ucsdata->unitab_scoacs[uc&0xFF]; break; } switch (uc & CSET_MASK) { case CSET_ACP: uc = term->ucsdata->unitab_font[uc & 0xFF]; break; case CSET_OEMCP: uc = term->ucsdata->unitab_oemcp[uc & 0xFF]; break; } term->wcFrom[it].origwc = term->wcFrom[it].wc = (wchar_t)uc; term->wcFrom[it].index = it; } if(!term->cfg.bidi) do_bidi(term->wcFrom, term->cols); /* this is saved iff done from inside the shaping */ if(!term->cfg.bidi && term->cfg.arabicshaping) for(it=0; itcols; it++) term->wcTo[it] = term->wcFrom[it]; if(!term->cfg.arabicshaping) do_shape(term->wcFrom, term->wcTo, term->cols); for(it=0; itcols ; it++) { term->ltemp[it] = ldata->chars[term->wcTo[it].index]; if (term->wcTo[it].origwc != term->wcTo[it].wc) term->ltemp[it].chr = term->wcTo[it].wc; } term_bidi_cache_store(term, i, ldata->chars, term->ltemp, term->cols); lchars = term->ltemp; } else { lchars = term->post_bidi_cache[i]; } } else lchars = ldata->chars; for (j = 0; j < term->cols; j++) { unsigned long tattr, tchar; termchar *d = lchars + j; int break_run; scrpos.x = j; tchar = d->chr; tattr = d->attr; switch (tchar & CSET_MASK) { case CSETCSET_LINEDRW: tchar = term->ucsdata->unitab_xterm[tchar & 0xFF]; break; case CSET_SCOACS: tchar = term->ucsdata->unitab_scoacs[tchar&0xFF]; break; } if (j < term->cols-1 && d[1].chrtchar != term->disptext[i]->chars[j].chr || tattr != (term->disptext[i]->chars[j].attr &~ ATTR_NARROW)) { if ((tattr & ATTR_WIDE) == 0 && char_width(ctx, tchar) == 2) tattr |= ATTR_NARROW; } else if (term->disptext[i]->chars[j].attr & .chr = tchar; cursor_background.attr = tattr; term->dispcursx = j; term->dispcursy = i; } if ((term->disptext[i]->chars[j].attrtchar >= 0x23BA && tchar <= 0x23BD) break_run = TRUE; /* * Separate out sequences of characters that have the * same CSET, if that CSET is a magic one. */ if (CSET_OF(tchar) != cset) term->disptext[i]->chars[j].chr == tchar && term->disptext[i]->chars[j].attr == tattrdata->lattr); updated_line = 1; } start = j; ccount = 0; attr = tattr; cset = CSET_OF(tchar)term->disptext[i]->chars[j].chr != tchar || term->disptext[i]->chars[j].attr != tattr) dirty_run = TRUE; ch[ccount++] = (wchar_t) tchar; term->disptext[i]->chars[j].chr = tchar; term->disptext[i]->chars[j].attr =memcmp(&term->disptext[i]->chars[j], d, sizeof(*d))) dirty_run = TRUE; term->disptext[i]->chars[jdata->wchar_t) cursor_background.chr; attr = cursor_background.attr | cursor; do_cursor(ctx, our_curs_x, i, ch, 1, attr, ldata->lattr); term->curstype = cursor; } unlineptr(ldata);, j; for (i = 0; i < term->rows; i++) for (j = 0; j < term->cols; j++) term->disptext[i]->chars[j].attrterm->disptext[i]->lattr == LATTR_NORM) for (j = left; j <= right && j < term->cols; j++) term->disptext[i]->chars[j].attr]->chars[j].attrtermline->lattr & LATTR_WRAPPED)) { while (IS_SPACE_CHR(ldata->chars[nlpos.x - 1].chr) && ->lattrldata->chars[top.x].chrCSETCSET_ASCII: uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case CSETCSET_ACP: uc = term->ucsdata->unitab_font[uc & 0xFF]; break; case CSET~CSET->chars[top.x + 1].chr unlineptr(ldata)switch (uc & CSET_MASK) { case CSET_LINEDRW: uc = term->ucsdata->unitab_xterm[uc & 0xFF]; break; case CSET_ASCII: uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case CSET_SCOACS: uc = term->ucsdata->unitab_scoacs[uc&0xFF]; break; } switch (uc & CSET_MASK) { case CSET_ACP: uc = term->ucsdata->unitab_font[uc & 0xFF]; break; case CSET_OEMCP: uc = term->ucsdata->unitab_oemcp[uc & 0xFF]; break; } /* For DBCS fonts I can't do anything usefutermline->lattr & LATTR_WRAPPED)) { termchar *q = ldata->chars + term->cols; while (q > ldata->chars && IS_SPACE_CHR(q[-1].chr)) q--; if (q == ldata->chars + term->cols) q--; if (p.x >= q - ldata->chars) p.x = (dir == -1 ? q - ldata->chars->chars, p.x)); if (dir == +1) { while (1) { int maxcols = (ldata->lattr & LATTR_WRAPPED2 ? term->cols-1 : term->cols); if (p.x < maxcols-1) { if (wordtype(term, UCSGET(ldata->chars, p.x+1)) == wvalue) p.x++; else break; } else { if (ldata->lattr & LATTR_WRAPPED) { termline->chars, 0)) == wvalue) { p.x = 0; p.y++; unlineptr(ldata); ldata = ldata2; } else { unlineptr(ldata2); break; }->chars, p.x-1)) == wvalue) p.x--; else break; } else { termline->lattr & LATTR_WRAPPED2 ? term->cols-1 : term->cols); if (ldata2->lattr & LATTR_WRAPPED) { if (wordtype(term, UCSGET(ldata2->charsunlineptr(ldata); ldata = ldata2; } else { unlineptr(ldata2); break; } unlineptr(ldata);termline->lattr & LATTR_MODE) != LATTR_NORM) selpoint.x /= 2; unlineptr(ldata) Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9b0846c53744486827e86b9bb2593a5b Text-delta-base-sha1: 75eb85411492633cce991d0fa2415182d06f9593 Text-content-length: 738 Text-content-md5: 95bac5def74ba9995babeef9e1caa035 Text-content-sha1: 988c37fb9d1bd68acacc7bc85f2e425fb462846d Content-length: 778 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN 8 (`k] ]F[*rptypedef struct termchar termchar; typedef struct termline termline; struct termchar { unsigned long chr; unsigned long attr; }; struct termline { unsigned short lattr; int cols; int temporary; /* TRUE if decompressed from scrollback */ struct termchar *chars; };termchar *cpos; /* cursor position (convenience) */ termline **disptext; /* buffer of text on real screen */ int dispcursx, dispcursy; /* location of cursor on real screen */ int curstype; termchar->charsint default_attr, curr_attr, save_attr; termchar basic_erase_char,intinttermchar *ltemp; bidi_char *wcFrom, *wcTo; termchar Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 991d965ab6f74cc80c51c452c0a95aa6 Text-delta-base-sha1: 8e9603381060ddcc27e0f3863d6f14194264c5f7 Text-content-length: 393 Text-content-md5: e11a5caf963b50356a25df235b112961 Text-content-sha1: 1cd437a85a1e0e9bc01d3cc7ae01b4cf36aab853 Content-length: 433 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNOO@;ZM^/YJ;l@+>o1KCSETCSETCSET_OEMCP); link_font(ucsdata->unitab_line, ucsdata->unitab_font, CSET_ACP); link_font(ucsdata->unitab_scoacs, ucsdata->unitab_font, CSET_ACP); link_font(ucsdata->unitab_xterm, ucsdata->unitab_font, CSETCSET_OEMCP); link_font(ucsdata->unitab_xterm, ucsdata->unitab_oemcp, CSETCSETCSETCSETCSET Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: af69c54ad3698eef5e98dc279ed839f4 Text-delta-base-sha1: b223765324064600123e2670310018b1253a32e8 Text-content-length: 861 Text-content-md5: a284fd901e8305004585514cabe8a305 Text-content-sha1: 81bc9c8cc1caa3e256cae68b6e7d8656937a4468 Content-length: 902 K 15 cvs2svn:cvs-rev V 5 1.146 PROPS-END SVNI}RgLk<;_r,A7|}`~lc(6<}e&~6<YxDVwchar_t(lattr & LATTR_MODE)text[i]if (shadow) gdk_draw_text_wc(inst->pixmap, inst->fonts[fontid], gc, x*inst->font_width+inst->cfg.window_border+inst->cfg.shadowboldoffset, y*inst->font_height+inst->cfg.window_border+inst->fonts[0]->ascent, if (shadow) gdk_draw_text(inst->pixmap, inst->fonts[fontid], gc, x*inst->font_width+inst->cfg.window_border+inst->cfg.shadowboldoffset, y*inst->font_height+inst->cfg.window_border+inst->fonts[0]->ascent, gcs, len); sfree(gcs); } sfree(wcs(lattr & LATTR_MODE)(lattr & LATTR_MODE)(lattr & LATTR_MODE)wchar_t *text, int len, int widefactor; (lattr & LATTR_MODE)wchar_t *text, int len, (lattr & LATTR_MODE)(lattr & LATTR_MODE) Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7cd2045e9eb48b967f48a7879bc44867 Text-delta-base-sha1: b611496fca9c1d507c3225f8ceb047586b382bf1 Text-content-length: 2245 Text-content-md5: 8fa9176723de18abdca335fbff022925 Text-content-sha1: 7e7643ffd49dce66b7b8292e629ac785a69d4bed Content-length: 2286 K 15 cvs2svn:cvs-rev V 5 1.271 PROPS-END SVNQ D.U]dh,O#Yj4O6vzFeT+9b\%jM 5,!Y#wchar_t, char_width; int text_adjust = 0; static int *IpDx = 0, IpDxLEN = 0; lattr &= LATTR_MODE; char_width = fnt_width = font_width * (1 + (lattr != LATTR_NORM))text[0] >= 0x23BA && text[0] <= 0x23BD) { switch ((unsigned char) (text[0])) { case 0xBA: text_adjust = -2 * font_height / 5; break; case 0xBB: text_adjust = -1 * font_height / 5; break; case 0xBC: text_adjust = font_height / 5; break; case 0xBD: text_adjust = 2 * font_height / 5; break; } if (lattr == LATTR_TOP || lattr == LATTR_BOT) text_adjust *= 2; text[0] = ucsdata.unitab_xterm['q']; if (attr & ATTR_UNDER) { attr &= ~ATTR_UNDER; force_manual_underline = 1;text[0])) { int i; for (i = 0; i < len; i++) text[i] = 0xFFFD; } /* OEM CP */ if ((text[0] & CSET_MASK) == CSETtext[0] & CSET_MASK) == CSETchar dbcstext[2]; dbcstext[0] = text[mptr] & 0xFF; dbcstext[1] = text[mptr+1] & 0xFF; dbcstext, 2, uni_buf+nlen, 1); mptr++; } else { char dbcstext[1]; dbcstext[0] = text[mptr] & 0xFF; MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS, dbcstexttext[0])) { static char *directbuf = NULL; static int directlen = 0; int i; if (len > directlen) { directlen = len; directbuf = sresize(directbuf, directlen, char); } for (i = 0; i < len; i++) directbuf[i] = text[i] & 0xFF; directbuf, directbuftext[i]wchar_t*textCSET_ASCII: uc = ucsdata.unitab_line[uc & 0xFF]; break; case CSET_LINEDRW: uc = ucsdata.unitab_xterm[uc & 0xFF]; break; case CSET~CSET_MASK) >= ' ' && (uc&~CSET_MASK)<= '~') return 1; if ( (uc & CSET_MASK) == CSET_ACP ) { SelectObject(hdc, fonts[FONT_NORMAL]); } else if ( (uc & CSET_MASK) == CSET~CSET_MASK, uc&~CSET_MASK, &ibuf) != 1 && GetCharWidth(hdc, uc&~CSET_MASK, uc&~CSET,vJJ,de) p += sprintf((char *) p, "\x1B%c", code + 'P' - 11); else p += sprintf((char *) p, "\x1BO%c", code + 'P' - 11); return p - output; } if (cfg.rxvt_homeend && (code == 1 || code == 4)) Revision-number: 4610 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2004-10-13T12:04:34.000000Z K 7 svn:log V 6 Done. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/compressed-scrollback Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: df7315be012a7d0920eb2189b0bc019e Text-delta-base-sha1: 64c6a4d9749cbd4c9d3ebd59c885753f01baa9ff Text-content-length: 111 Text-content-md5: 9a9b0ea02b51a905e8e3e70d895255fd Text-content-sha1: 7cc60c86962af7e656d1e38f2637e0e57a566f63 Content-length: 150 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN`; ZmtlFFixed-in: 2004-10-14

    SGT, 2004-10-13: I've now done the initial work for this. Revision-number: 4611 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2004-10-13T12:10:30.000000Z K 7 svn:log V 21 Fix '/*' in comment. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/winsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 442674da8cd6da49d6df2c1baf7143b8 Text-delta-base-sha1: 9373ebc4e5d058f96502c761a12beca1ea3a2054 Text-content-length: 48 Text-content-md5: 84e6b047179bc4f041e7b666ca1384da Text-content-sha1: c0209d49ef37c0a4914f9f446d6703c4731de642 Content-length: 87 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN% |t1Enumerate files in dir `foo Revision-number: 4612 Prop-content-length: 312 Content-length: 312 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-13T12:29:50.000000Z K 7 svn:log V 211 I think we've been told before that you're not supposed to CloseHandle() the thing returned from MonitorFromPoint. Certainly MS Visual Studio's debugger complained about it just now. CloseHandle() call removed. PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8fa9176723de18abdca335fbff022925 Text-delta-base-sha1: 7e7643ffd49dce66b7b8292e629ac785a69d4bed Text-content-length: 63 Text-content-md5: 0da9ba1566d132ed19dbbdb2049dd025 Text-content-sha1: fd1234aaf3ff65c9227190ee7b445daea174776a Content-length: 104 K 15 cvs2svn:cvs-rev V 5 1.272 PROPS-END SVN i~de) p += sprintf((cvaa Revision-number: 4613 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2004-10-13T13:35:29.000000Z K 7 svn:log V 66 Fix segfaults in terminal resizing, introduced by re-engineering. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 45b996f85342a804cbaa756391e5facd Text-delta-base-sha1: 95e474c95eeb17af42ed821c41fbb6094637720c Text-content-length: 168 Text-content-md5: 3ccf911645e07bbe4f13d9ecf9a4a2ed Text-content-sha1: 10d9e8535e40ef45cadb0458b67a4a0a93ede997 Content-length: 209 K 15 cvs2svn:cvs-rev V 5 1.169 PROPS-END SVNMg= DHKif (line) { sfree(line->chars); sfree(line); }, oldrows = term->rowsold5#rm->esc_args[0] = 10 * term->esc_ar Revision-number: 4614 Prop-content-length: 705 Content-length: 705 K 8 svn:date V 27 2004-10-13T13:43:11.000000Z K 7 svn:log V 604 Implement part of `ssh2-generality': introduce the ability to tell PuTTY / Plink not to run a remote shell/command at all. Supported in the GUI configuration and via the (OpenSSH-like) -N command-line option. No effort is currently made to arrange `nice' UI properties. If you do this in GUI PuTTY, a full-size terminal window will still be created, and will sit there with almost nothing in it throughout your session. If you do it in Plink, Plink will not accept any kind of request to terminate gracefully; you'll have to ^C or kill it. Nonetheless, even this little will be useful to some people... K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9e80f9b1bb9ce64414806bde2a6e2bad Text-delta-base-sha1: 7c315b1cb8e6e9c99d03888a874fc790a808afbb Text-content-length: 78 Text-content-md5: d65d65fd3204bf0de61fc84edfe9eef9 Text-content-sha1: b599c3fc4a8e2f0ef2f8e61726228304abe58b78 Content-length: 118 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN#60jd1L{l7Nssh_no_shell = 1; } if (!strcmp(p, "-C Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3f7da4caa3a844d39a01dd5c9adce97a Text-delta-base-sha1: 03fb7446e1ed56079b54f068a102b8a7c49bd58f Text-content-length: 182 Text-content-md5: a426e1cbae427bb5a68a70f2f2001437 Text-content-sha1: 662ad3c32c089cabdaff0125acfe43efce95c5b8 Content-length: 222 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNR|2 Don't start a shell or command at all", 'n', HELPCTX(ssh_noshell), dlg_stdcheckbox_handler, I(offsetof(Config,ssh_no_shelly Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 60a77bdaa9e169630325d571ccd51b05 Text-delta-base-sha1: f2ec1a78880e04a3a39a125dc7df0903854f48d6 Text-content-length: 905 Text-content-md5: 2aa34bc4d89260dc2072d93c273317ca Text-content-sha1: bb74639db8429bdabcc8be09aa6e8168d4df11b9 Content-length: 945 K 15 cvs2svn:cvs-rev V 4 1.93 PROPS-END SVNc$k;0E\versionid $Id: config.but,v 1.93 2004/10/13 13:43:11 simonnoshell} \q{Don't start a shell or command at all} \cfg{winhelp-topic}{ssh.noshell} If you tick this box, PuTTY will not attempt to run a shell or command after connecting to the remote server. You might want to use this option if you are only using the SSH connection for port forwarding, and your user account on the server does not have the ability to run a shell. This feature is only available in SSH protocol version 2 (since the version 1 protocol assumes you will always want to run a shell). This feature can also be enabled using the \c{-N} command-line option; see \k{using-cmdline-noshell}. If you use this feature in Plink, you will not be able to terminate the Plink process by any graceful means; the only way to kill it will be by pressing Control-C or sending a kill signal from another program Node-path: putty/doc/index.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 78758467e8e60441d9f14f469523b89e Text-delta-base-sha1: bc41dc08dff6f63dbd070c7359af91dde28b4a58 Text-content-length: 34 Text-content-md5: 09605c301a4958b1a588687051ce52de Text-content-sha1: 1bb337b2917869efd13d5f6fe83128365e743134 Content-length: 73 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNr sN-upper} \c{-N Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dc7c12ac05b1a079fe51d341f1618fe5 Text-delta-base-sha1: a29ca4bea8800aee4ade9b710da83b9b547139a0 Text-content-length: 725 Text-content-md5: 992c458af6708c8e8e913329c841f1d4 Text-content-sha1: 4025ea266c7b85f426638d3b55cbf58df2427d43 Content-length: 765 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVNjF3E:yc,k\versionid $Id: using.but,v 1.34 2004/10/13 13:43:11 simonnoshell} \I{-N-upper}\c{-N}: suppress starting a shell or command The \c{-N} option prevents PuTTY from attempting to start a shell or command on the remote server. You might want to use this option if you are only using the SSH connection for port forwarding, and your user account on the server does not have the ability to run a shell. This feature is only available in SSH protocol version 2 (since the version 1 protocol assumes you will always want to run a shell). This option is equivalent to the \q{Don't start a shell or command at all} checkbox in the SSH panel of the PuTTY configuration box (see \k{config-ssh-noshell Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f1449d5b266c9c6886cebd7fe84f7b5d Text-delta-base-sha1: 6ad1e002bb47b7f45bd536cd44e1b573bda3ccf2 Text-content-length: 73 Text-content-md5: de3a6c45f70b2d5e06abf52f92235323 Text-content-sha1: 098762f490a58b3825a868857e149302a00bc93d Content-length: 114 K 15 cvs2svn:cvs-rev V 5 1.233 PROPS-END SVNa 2(A int ssh_no_shell; /* avoid running a shell Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c5bb1181864f86af7f29a80ec9bca6f8 Text-delta-base-sha1: 960090650e2e47f1637c71cec5d66ac5822551dd Text-content-length: 103 Text-content-md5: 09df567b93dc8ed74d7311917130691f Text-content-sha1: f093a17bed75d6d295229e962966ed559b3f9576 Content-length: 144 K 15 cvs2svn:cvs-rev V 5 1.121 PROPS-END SVN6-IV>2PfNoShell", cfg->ssh_no_shelli(sesskey, "SshNoShell", 0, &cfg->ssh_no_shell Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 8895c19b7f7471b044e048180a79705b Text-delta-base-sha1: e7555f46a5b6b40268d107988ec5a9bdd42622ab Text-content-length: 2074 Text-content-md5: 7691b604b8d56fa253a996913c7968ac Text-content-sha1: acd11f96c5cf9221fe047113d1bdcf955812fd2d Content-length: 2115 K 15 cvs2svn:cvs-rev V 5 1.324 PROPS-END SVNG][Zx0B(1i"v,Doj}fssh->channels = newtree234(ssh_channelcmp); /* * Create the main session channel. */ if (!ssh->cfg.ssh_no_shell) { ssh->mainchan = snew(struct ssh_channel); ssh->mainchan->ssh = ssh; ssh->mainchan->localid = alloc_channel_id(ssh); ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring(ssh, "session"); ssh2_pkt_adduint32(ssh, ssh->mainchan->localid); ssh->mainchan->v.v2.locwindow = OUR_V2_WINSIZE; ssh2_pkt_adduint32(ssh, ssh->mainchan->v.v2.locwindow);/* our window size */ ssh2_pkt_adduint32(ssh, 0x4000UL); /* our max pkt size */ ssh2_pkt_send(ssh); crWaitUntilV(ispkt); if (ssh->pktin.type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) { bombout(("Server refused to open a session")); crStopV; /* FIXME: error data comes back in FAILURE packet */ } if (ssh_pkt_getuint32(ssh) != ssh->mainchan->localid) { bombout(("Server's channel confirmation cited wrong channel")); crStopV; } ssh->mainchan->remoteid = ssh_pkt_getuint32(ssh); ssh->mainchan->type = CHAN_MAINSESSION; ssh->mainchan->closes = 0; ssh->mainchan->v.v2.remwindow = ssh_pkt_getuint32(ssh); ssh->mainchan->v.v2.remmaxpkt = ssh_pkt_getuint32(ssh); bufchain_init(&ssh->mainchan->v.v2.outbuffer); add234(ssh->channels, ssh->mainchan); logevent("Opened channel for session"); } else ssh->mainchan = NULL; /* * Potentially enable X11 forwarding. */ if (ssh->mainchan && mainchan && ssh->mainchan && if (ssh->mainchan)if (ssh->mainchan) (This is only our termination condition if we're * not running in -N mode.) */ if (!ssh->cfg.ssh_no_shell && if (ssh->mainchan)if (ssh->mainchan)if (ssh->mainchan)?Z hXgSSH_STATE_PREPACKET) return; if (ssh->version == 1) { if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) send_packet(ssh, SSH1_MSG_IGNORE, PKT_STR, "", PKT_END); } else { ssh2_pkt_init(ssh, SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(ssh); if (ssh->mainchan) Node-path: putty/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 78dbbcfa68346acaf9e9c8f1fe6dc6c4 Text-delta-base-sha1: 9f082d3796ea0fbe48dca6198c2d34ffcd0a0bcb Text-content-length: 41 Text-content-md5: ef1ba584b560c42d5be6fc2f2142c893 Text-content-sha1: 9b1941d653a91a86f7513b05d5d2b343426b55c9 Content-length: 80 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN5 )xnoshell "ssh.noshell Revision-number: 4615 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2004-10-13T13:46:35.000000Z K 7 svn:log V 30 Done (the easy) part of this. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/ssh2-generality Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 9afa6714a3dd340b9bbdd695dfc3c074 Text-delta-base-sha1: 621beaadef0a80a2837df73c5237cb4a1e531358 Text-content-length: 215 Text-content-md5: 026571724f67ca863ceec18a8057e486 Text-content-sha1: 490d349d5216d2ff31af9c237a286956aa4b4367 Content-length: 254 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN OD D

    SGT, 2004-10-13: Just checked in the easy bit. PuTTY and Plink can now avoid running a command (equivalent to OpenSSH's -N option, and indeed enabled by the same switch). Revision-number: 4616 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2004-10-13T16:48:17.000000Z K 7 svn:log V 72 linktrade.ws 213.239.211.243 putty.say-problem.net reinstated mirror.fr K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 498de62780a3d20cd682346d712b53f8 Text-delta-base-sha1: a9c95a151ca452c6002e2572185d929673b2d512 Text-content-length: 270 Text-content-md5: f8b35a537864dc0f24a6fb9fd5e98e63 Text-content-sha1: 3db222e4bdd95e67cfa54a7e8cf8067546190462 Content-length: 311 K 15 cvs2svn:cvs-rev V 5 1.132 PROPS-END SVNL-SP6;N?c*I?M=Uw213.239.211.243/mirror/putty/">213.239.211.243putty.say-problem.net/">putty.say-problem.net in Latviaputty.mirror.fr/">putty.mirror.frlinktrade.ws/mirror/putty/">linktrade.wswww.ip97.com/mirrors/putty/">ip97 Revision-number: 4617 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2004-10-13T23:47:46.000000Z K 7 svn:log V 45 Sync spec with reality: add "vulnerability". K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/spec Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 54b728a33026d067005a2912fa2944d5 Text-delta-base-sha1: 8ce2463ac5b925400887c1bbf1d096001194053b Text-content-length: 69 Text-content-md5: 1d3fc6525cce22b48c739037bc172e4c Text-content-sha1: 84134379b022386cc4394448d52c2712454f67ce Content-length: 108 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNDy 02-vulnerability This is a security vulnerability. Revision-number: 4618 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2004-10-14T00:18:22.000000Z K 7 svn:log V 91 Munge to allow non-single-pass transformations on bodies of bugs. No change to output yet. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9e6beeddf7a0af1fcd35be282d267177 Text-delta-base-sha1: a2b8785c2b2a83890f20d10ca8f8e173b193423d Text-content-length: 1069 Text-content-md5: 311edf4a2a119eaf5fdccf2c68d2e8bb Text-content-sha1: 14071c4bab7fd11b754005bb242c494438432439 Content-length: 1109 K 15 cvs2svn:cvs-rev V 4 1.34 PROPS-END SVN*t<8E1aqMnXVXtvQXtKxju=[Y.+*b8R+d:.dLn`6BH |K(>MXoq#! /usr/bin/perl # $Id: bugs2html,v 1.34 2004/10/14 00:18:22{ "hdrs" => \%hdrs, "body" => $body, "cvs" => `cvs status $bugfile` }; add_release_fixes($bugname); } foreach my $bug (keys %bugs) { bug2html($bughdrs"hdrs"hdrshdrs}->{class} eq 'bug' || $bugs{$_}->{hdrs}->{class} eq 'semi-bughdrs}->{class} eq 'wishhdrs}->{class} eq 'vulnerability'), hdrshdrshdrs}->{class} eq 'semi-bug'), hdrshdrshdrshdrshdrshdrs}->{priority} eq 'lowhdrshdrshdrs}->{difficulty}) && $bugs{$_}->{hdrs) = @_; my $hdrs = $bugs{$bugname}->{"hdrs"}; my $body = $bugs{$bugname}->{"body"}; my $cvsstat = $bugs{$bugname}->{"cvs"}hdrs"}->{"fixed-in"}); foreach my $ver (split(' ', $bugs{$bug}->{"hdrs"hdrs"}->{"fixed-in"} = join " ", $bugs{$bug}->{"hdrs"hdrshdrshdrs Revision-number: 4619 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 70 You no longer need to ask MS nicely for a fix for the XP SP2 problem. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-14T00:26:59.000000Z PROPS-END Node-path: putty-wishlist/data/portfwd-loopback-choice Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 36e94a03781b8c5b4b2fa14f6dc9608a Text-delta-base-sha1: 564d1490e13a348001298f2a0a22a1c8e261cb0b Text-content-length: 19 Text-content-md5: 7b57233020562f7f760dec2137b7d02f Text-content-sha1: 6d25d1ecc7434e7f1f80152c62117a18bee41b5d Content-length: 58 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN<*DfV Revision-number: 4620 Prop-content-length: 125 Content-length: 125 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-14T00:47:50.000000Z K 7 svn:log V 25 Mention DISPLAY env var. PROPS-END Node-path: putty-wishlist/data/cmdline-x-display Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e90b121a8d8273f50c79bf518232e799 Text-delta-base-sha1: 46118f417f83cfc984fbaaa65f7336f5c45fc2be Text-content-length: 230 Text-content-md5: 61757f6a889799fd28354d4f4f17202f Text-content-sha1: 92e05a6b99fbc3225b54fec75a1401b3bd8c031d Content-length: 269 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN2S2S

    Update 2004-10: if the "X display" is left blank in the configuration, PuTTY will attempt to take the display location from the environment variable DISPLAY (on both Windows and Unix). Revision-number: 4621 Prop-content-length: 265 Content-length: 265 K 8 svn:date V 27 2004-10-14T01:02:22.000000Z K 7 svn:log V 164 For each dependency in a "depends" header, add a corresponding blockage in a "blocks" header. Highlight each entry according to whether it has a "fixed-in" header. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 311edf4a2a119eaf5fdccf2c68d2e8bb Text-delta-base-sha1: 14071c4bab7fd11b754005bb242c494438432439 Text-content-length: 959 Text-content-md5: a8a0768fa666442ac9093a61c44a4eb2 Text-content-sha1: 68e9b4070b61583a40fa14aa6853c8bf041e8a95 Content-length: 999 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVN(?9oO4k!y#! /usr/bin/perl # $Id: bugs2html,v 1.35 2004/10/14 01:02knit_dependencies($bug($h eq "depends") || ($h eq "blocks")) { print HTML join " ", (map { my $r = "$_"; $r = "$r" if !defined($bugs{$_}->{"hdrs"}->{"fixed-in"}); $r; } (split ' ', $hdrs->{$h})For a given bug, adds symmetrical "blocks" pseudo-headers to other # bugs pointed at by this bug's "depends" header. sub knit_dependencies { my ($bug) = @_; foreach my $dep (split(' ', $bugs{$bug}->{"hdrs"}->{"depends"})) { my @blocks = (); if (defined($bugs{$dep}->{"hdrs"}->{"blocks"})) { push @blocks, (split(' ', $bugs{$dep}->{"hdrs"}->{"blocks"})); } push @blocks, $bug unless grep(($_ eq $bug), @blocks); $bugs{$dep}->{"hdrs"}->{"blocks"} = join " ", @blocks; } Revision-number: 4622 Prop-content-length: 1217 Content-length: 1217 K 7 svn:log V 1115 First-stage support for Unicode combining characters. The `chars' array of each `termline' structure now contains optional additional entries after the normal number of columns, which are used to chain a linked list of combining characters off any primary termchar that needs it. This means we support arbitrarily many combining characters per cell (unlike xterm's hard limit of 2). Cut and paste works correctly (selecting a character cell containing multiple code points causes all those code points to be cut and pasted). Display works by simply overlaying all the relevant characters on top of one another; this is good enough for Unix (xterm does the same thing), and mostly seems OK for Windows except that the Windows Unicode fonts have a nasty habit of not containing most of the combining characters and thus overlaying an unknown-code-point box on your perfectly good base glyph. I had no idea how to add support in the Mac do_text(), so I've simply stuck in an assertion that will trigger the first time a combining character is displayed, and hopefully this will bite someone with the clue to fix it. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-14T16:42:43.000000Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 299ad11c9667b76fe285249c4da79b92 Text-delta-base-sha1: 277fcf6fc8bd99e9b045da4b4b3442d411275b4a Text-content-length: 299 Text-content-md5: e56c50c70367e8681049debe87e6897a Text-content-sha1: 51c046cb239f589978bacf5250931ec0f4e47364 Content-length: 339 K 15 cvs2svn:cvs-rev V 4 1.78 PROPS-END SVNYB i,aL /* $Id: macterm.c,v 1.78 2004/10/14 16:42:43/* SGT, 2004-10-14: I don't know how to support combining characters * on the Mac. Hopefully the first person to fail this assertion will * know how to do it better than me... */ assert(!(attr & TATTR_COMBINING) Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: de3a6c45f70b2d5e06abf52f92235323 Text-delta-base-sha1: 098762f490a58b3825a868857e149302a00bc93d Text-content-length: 94 Text-content-md5: fa11894af8aa12668935d7ba883610af Text-content-sha1: f3ed1483861eff96de570b82fe89c4c0c00ccb5d Content-length: 135 K 15 cvs2svn:cvs-rev V 5 1.234 PROPS-END SVNd E1En-#define TATTR_COMBINING 0x80000000UL /* combining characters Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3ccf911645e07bbe4f13d9ecf9a4a2ed Text-delta-base-sha1: 10d9e8535e40ef45cadb0458b67a4a0a93ede997 Text-content-length: 22604 Text-content-md5: eed18edfb622da411e357977796be795 Text-content-sha1: de127b6e832bfaec6619737afb302c664091b5c7 Content-length: 22645 K 15 cvs2svn:cvs-rev V 5 1.170 PROPS-END SVN2sfcU%C$oC>|8it^Y3rG#{hb9~B4O_0+ P8!X`eFNd*U 2'H5L.FOg '8V9<{ EL\t"y!XB])L7&/:JXtmq+@Sc+UnC,BH_F^Y:G~N x,1 AcY:IICDvuKline->size = cols; line->lattr = LATTR_NORM; line->temporary = FALSE; line->cc_free = 0Diagnostic function: verify that a termline has a correct * combining character structure. */ static void cc_check(termline *line) { unsigned char *flags; int i, j; assert(line->size >= line->cols); flags = snewn(line->size, unsigned char); for (i = 0; i < line->size; i++) flags[i] = (i < line->cols); for (i = 0; i < line->cols; i++) { j = i; while (line->chars[j].cc_next) { j += line->chars[j].cc_next; assert(j >= line->cols && j < line->size); assert(!flags[j]); flags[j] = TRUE; } } j = line->cc_free; if (j) { while (1) { assert(j >= line->cols && j < line->size); assert(!flags[j]); flags[j] = TRUE; if (line->chars[j].cc_next) j += line->chars[j].cc_next; else break; } } j = 0; for (i = 0; i < line->size; i++) j += (flags[i] != 0); assert(j == line->size); } /* * Add a combining character to a character cell. */ static void add_cc(termline *line, int col, unsigned long chr) { int newcc; assert(col >= 0 && col < line->cols); /* * Start by extending the cols array if the free list is empty. */ if (!line->cc_free) { int n = line->size; line->size += 16 + (line->size - line->cols) / 2; line->chars = sresize(line->chars, line->size, termchar); line->cc_free = n; while (n < line->size) { if (n+1 < line->size) line->chars[n].cc_next = 1; else line->chars[n].cc_next = 0; n++; } } /* * Now walk the cc list of the cell in question. */ while (line->chars[col].cc_next) col += line->chars[col].cc_next; /* * `col' now points at the last cc currently in this cell; so * we simply add another one. */ newcc = line->cc_free; if (line->chars[newcc].cc_next) line->cc_free = newcc + line->chars[newcc].cc_next; else line->cc_free = 0; line->chars[newcc].cc_next = 0; line->chars[newcc].chr = chr; line->chars[col].cc_next = newcc - col; cc_check(line); } /* * Clear the combining character list in a character cell. */ static void clear_cc(termline *line, int col) { int oldfree, origcol = col; assert(col >= 0 && col < line->cols); if (!line->chars[col].cc_next) return; /* nothing needs doing */ oldfree = line->cc_free; line->cc_free = col + line->chars[col].cc_next; while (line->chars[col].cc_next) col += line->chars[col].cc_next; if (oldfree) line->chars[col].cc_next = oldfree - col; else line->chars[col].cc_next = 0; line->chars[origcol].cc_next = 0; cc_check(line); } /* * Compare two character cells for equality. Special case required * in do_paint() where we override what we expect the chr and attr * fields to be. */ static int termchars_equal_override(termchar *a, termchar *b, unsigned long bchr, unsigned long battr) { /* FULL-TERMCHAR */ if (a->chr != bchr) return FALSE; if (a->attr != battr) return FALSE; while (a->cc_next || b->cc_next) { if (!a->cc_next || !b->cc_next) return FALSE; /* one cc-list ends, other does not */ a += a->cc_next; b += b->cc_next; if (a->chr != b->chr) return FALSE; } return TRUE; } static int termchars_equal(termchar *a, termchar *b) { return termchars_equal_override(a, b, b->chr, b->attr); } /* * Copy a character cell. (Requires a pointer to the destination * termline, so as to access its free list.) */ static void copy_termchar(termline *destline, int x, termchar *src) { clear_cc(destline, x); destline->chars[x] = *src; /* copy everything except cc-list */ destline->chars[x].cc_next = 0; /* and make sure this is zero */ while (src->cc_next) { src += src->cc_next; add_cc(destline, x, src->chr); } } /* * Move a character cell within its termline. */ static void move_termchar(termline *line, termchar *dest, termchar *src) { /* First clear the cc list from the original char, just in case. */ clear_cc(line, dest - line->chars); /* Move the character cell and adjust its cc_next. */ *dest = *src; /* copy everything except cc-list */ if (src->cc_next) dest->cc_next = src->cc_next - (dest-src); /* Ensure the original cell doesn't have a cc list. */ src->cc_next = 0static void makeliteral_ccFor combining characters, I just encode a bunch of ordinary * chars using makeliteral_chr, and terminate with a \0 * character (which I know won't come up as a combining char * itself). * * I don't use the stateful encoding in makeliteral_chr. */ unsigned long zstate; termchar z; while (c->cc_next) { c += c->cc_next; assert(c->chr != 0); zstate = 0; makeliteral_chr(b, c, &zstate); } z.chr = 0; zstate = 0; makeliteral_chr(b, &z, &zstate); makerle(b, ldata, makeliteral_cc int i; #ifdef DIAGNOSTIC_SB_COMPRESSIONfor (i = 0; i < ldata->cols; i++) assert(termchars_equal(&ldata->chars[i], &dcl->chars[i]termline *ldata, ldataldatatermline *ldata, termline *ldata, static void readliteral_cc(struct buf *b, termchar *c, termline *ldata, unsigned long *state) { termchar n; unsigned long zstate; int x = c - ldata->chars; c->cc_next = 0; while (1) { zstate = 0; readliteral_chr(b, &n, ldata, &zstate); if (!n.chr) break; add_cc(ldata, x, n.chr); }ldata->size = ncols; ldata->temporary = TRUE; ldata->cc_free = 0; /* * We must set all the cc pointers in ldata->chars to 0 right * now, so that cc diagnostics that verify the integrity of the * whole line will make sense while we're in the middle of * building it up. */ { int i; for (i = 0; i < ldata->cols; i++) ldata->chars[i].cc_next = 0; } readrle(b, ldata, readliteral_cc * First, go through all the characters that will be thrown * out in the resize (if we're shrinking the line) and * return their cc lists to the cc free list. */ for (i = cols; i < line->cols; i++) clear_cc(line, i); /* * Now do the actual resize, leaving the _same_ amount of * cc space as there was to begin with. */ oldlen = line->cols; line->size += cols - oldlen; line->chars = sresize(line->chars, line->size, TTYPE); line->cols = cols; /* * Bodily move the entire cc section from where it started * to where it now needs to be. */ memmove(line->chars + line->cols, line->chars + oldlen, (line->size - line->cols) * TSIZE); /* * Go through what's left of the original line, and adjust * the first cc_next pointer in each list. (All the * subsequent ones are still valid because they are * relative offsets within the cc block.) Also do the same * to the head of the cc_free list. */ for (i = 0; i < oldlen && i < line->cols; i++) if (line->chars[i].cc_next) line->chars[i].cc_next += cols - oldlen; if (line->cc_free) line->cc_free += cols - oldlen; /* * And finally fill in the new space with erase chars. (We * don't have to worry about cc lists here, because we * _know_ the erase char doesn't have one.) */ cc_check(line)ltemp_size = 0; term->wcFrom = NULL; term->wcTo = NULL; term->wcFromTo_size = 0; term->bidi_cache_size = 0; term->pre_bidi_cache = term->post_bidi_cache = NULL; /* FULL-TERMCHAR */ term->basic_erase_char.cc_next = 0; term->erase_char = term->basic_erase_char if (!termchars_equal(&line->chars[j], &term->erase_char)) break;copy_termchar(line, i, &term->erase_char)cc_check(copy_termchar(line, i, &term->erase_char), jfor (j = 0; j < term->cols; j++) copy_termchar(term->disptext[start+i], j, term->disptext[start+i+distance]->chars+jfor (j = 0; j < term->cols; j++) copy_termchar(term->disptext[start+i+distance], j, term->disptext[start+i]->chars+jclear_cc(ldata, x-1); clear_cc(ldata, x);copy_termchar(ldata, start.x, &term->erase_char), jfor (j = 0; j < m; j++) move_termchar(ldata, ldata->chars + term->curs.x + j, ldata->chars + term->curs.x + j + n); while (n--) copy_termchar(ldata, term->curs.x + m++, &term->erase_char); } else { for (j = m; j-- ;) move_termchar(ldata, ldata->chars + term->curs.x + j + n, ldata->chars + term->curs.x + j); while (n--) copy_termchar(ldata, term->curs.x + n, &term->erase_char)/* destructive backspace might be disabled */ if (!term->cfg.no_dbackspace) { copy_termchar(scrlineptr(term->curs.y), term->curs.x, &term->erase_char){ termline *cline = scrlineptr(term->curs.y); if (term->wrapnext && term->wrap && width > 0) { clineterm->wrapnext = FALSE; } if (term->insert && width > 0) insch(term, width); if (term->selstate != NO_SELECTION) { pos cursplus = term->curs; incpos(cursplus); check_selection(term, term->curs, cursplus); } if (((c & CSET_MASK) == CSET_ASCII || (c & CSET_MASK) == 0) && term->logctx) logtraffic(term->logctx, (unsigned char) c, LGTYP_ASCII); copy_termchar(cline, term->curs.x, &term->erase_char); cline->lattr |= /* FULL-TERMCHAR */ clear_cc(cline, term->curs.x); cline->chars[term->curs.x].chr = c; cline->chars[term->curs.x].attr = term->curr_attr; term->curs.x++; /* FULL-TERMCHAR */ clear_cc(cline, term->curs.x); cline->chars[term->curs.x].chr = UCSWIDE; cline->chars[term->curs.x].attr = term->curr_attr; /* FULL-TERMCHAR */ clear_cc(cline, term->curs.x); cline->chars[term->curs.x].chr = c; cline->chars[term->curs.x].attr = term->curr_attr; break; case 0: add_cc(cline, term->curs.x - !term->wrapnext, c); continue; default: continue; } term->curs.x++; if (term->curs.x == term->cols) { term->curs.x--; term->wrapnext = TRUE; if (term->wrap && term->vt52_mode) { cline->lattr |= LATTR_WRAPPED; if (term->curs.y == term->marg_b) scroll(term, term->marg_t, term->marg_b, 1, TRUE); else if (term->curs.y < term->rows - 1) term->curs.y++; term->curs.x = 0; term->wrapnext = FALSE; } } term->seen_disp_event = 1; }copy_termchar(ldata, j, &term->basic_erase_char)int p = term->curs.x; termline *cline = scrlineptr(term->curs.y); copy_termchar(cline, p++, &term->erase_char)5yrnEcg@CYf{-[(UBrV-u+Uf$]/nCU1 "E.&k85MtT\O{/])|Il case ANSI('C', '='): /* * set cursor start on scanline esc_args[0] and * end on scanline esc_args[1].If you set * the bottom scan line to a value less than * the top scan line, the cursor will disappear. */ compatibility(SCOANSI); if (term->esc_nargs >= 2) { if (term->esc_args[0] > term->esc_args[1]) term->cursor_on = FALSE; else term->cursor_on = TRUE; } break; case ANSI('D', '='): compatibility(SCOANSI); term->blink_is_real = FALSE; if (term->esc_args[0]>=1) term->curr_attr |= ATTR_BLINK; else term->curr_attr &= ~ATTR_BLINK; break; case ANSI('E', '='): compatibility(SCOANSI); term->blink_is_real = (term->esc_args[0] >= 1); break; case ANSI('F', '='): /* set normal foreground */ compatibility(SCOANSI); if (term->esc_args[0] >= 0 && term->esc_args[0] < 16) { long colour = (sco2ansicolour[term->esc_args[0] & 0x7] | ((term->esc_args[0] & 0x8) << 1)) << ATTR_FGSHIFT; term->curr_attr &= ~ATTR_FGMASK; term->curr_attr |= colour; term->default_attr &= ~ATTR_FGMASK; term->default_attr |= colour; } break; case ANSI('G', '='): /* set normal background */ compatibility(SCOANSI); if (term->esc_args[0] >= 0 && term->esc_args[0] < 16) { long colour = (sco2ansicolour[term->esc_args[0] & 0x7] | ((term->esc_args[0] & 0x8) << 1)) << ATTR_BGSHIFT; term->curr_attr &= ~ATTR_BGMASK; term->curr_attr |= colour; term->default_attr &= ~ATTR_BGMASK; term->default_attr |= colour; } break; case ANSI('L', '='): compatibility(SCOANSI); term->use_bce = (term->esc_args[0] <= 0); set_erase_char(term); break; case ANSI('p', '"'): /* DECSCL: set compat level */ /* * Allow the host to make this emulator a * 'perfect' VT102. This first appeared in * the VT220, but we do need to get back to * PuTTY mode so I won't check it. * * The arg in 40..42,50 are a PuTTY extension. * The 2nd arg, 8bit vs 7bit is not checked. * * Setting VT102 mode should also change * the Fkeys to generate PF* codes as a * real VT102 has no Fkeys. The VT220 does * this, F11..F13 become ESC,BS,LF other * Fkeys send nothing. * * Note ESC c will NOT change this! */ switch (term->esc_args[0]) { case 61: term->compatibility_level &= ~TM_VTXXX; term->compatibility_level |= TM_VT102; break; case 62: term->compatibility_level &= ~TM_VTXXX; term->compatibility_level |= TM_VT220; break; default: if (term->esc_args[0] > 60 && term->esc_args[0] < 70) term->compatibility_level |= TM_VTXXX; break; case 40: term->compatibility_level &= TM_VTXXX; break; case 41: term->compatibility_level = TM_PUTTY; break; case 42: term->compatibility_level = TM_SCOANSI; break; case ARG_DEFAULT: term->compatibility_level = TM_PUTTY; break; case 50: break; } /* Change the response to CSI c */ if (term->esc_args[0] == 50) { int i; char lbuf[64]; strcpy(term->id_string, "\033[?"); for (i = 1; i < term->esc_nargs; i++) { if (i != 1) strcat(term->id_string, ";"); sprintf(lbuf, "%d", term->esc_args[i]); strcat(term->id_string, lbuf); } strcat(term->id_string, "c"); } #if 0 /* Is this a good idea ? * Well we should do a soft reset at this point ... */ if (!has_compat(VT420) && has_compat(VT100)) { if (!term->cfg.no_remote_resize) { if (term->reset_132) request_resize(132, 24); else request_resize(80, 24); } } #endif break; } break; case SEEN_OSC: term->osc_w = FALSE; switch (c) { case 'P': /* Linux palette sequence */ term->termstate = SEEN_OSC_P; term->osc_strlen = 0; break; case 'R': /* Linux palette reset */ palette_reset(term->frontend); term_invalidate(term); term->termstate = TOPLEVEL; break; case 'W': /* word-set */ term->termstate = SEEN_OSC_W; term->osc_w = TRUE; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': tecase 'L': /* * Grotty hack to support xterm and DECterm title * sequences concurrently. */ if (term->esc_args[0] == 2) { term->esc_args[0] = 1; break; } /* else fall through */OSC_STRING: /* * This OSC stuff is EVIL. It takes just one character to get into * sysline mode and it's not initially obvious how to get out. * So I've added CR and LF as string aborts. * This shouldn't effect compatibility as I believe embedded * control characters are supposed to be interpreted (maybe?) * and they don't display anything useful anyway. * * -- RDB */ if (c == '\012' || c == '\015') { term->termstate = TOPLEVEL; } else if (c == 0234 || c == '\007') { /* * These characters terminate the string; ST and BEL * terminate the sequence and trigger instant * processing of it, whereas ESC goes back to SEEN_ESC * mode unless it is followed by \, in which case it is * synonymous with ST in the first place. */ do_osc(term); term->termstate = TOPLEVEL; } else if (c == '\033') term->termstate = OSC_MAYBE_ST; else if (term->osc_strlen < OSC_STR_MAX) term->osc_string[term->osc_strlen++] = (char)c; break; case SEEN_OSC_P: { int max = (term->osc_strlen == 0 ? 21 : 16); int val; if ((int)c >= '0' && (int)c <= '9') val = c - '0'; else if ((int)c >= 'A' && (int)c <= 'A' + max - 10) val = c - 'A' + 10; else if ((int)c >= 'a' && (int)c <= 'a' + max - 10) val = c - 'a' + 10; else { term->termstate = TOPLEVEL; break; } term->osc_string[term->osc_strlen++] = val; if (term->osc_strlen >= 7) { palette_set(term->frontend, term->osc_string[0], term->osc_string[1] * 16 + term->osc_string[2], term->osc_string[3] * 16 + term->osc_string[4], term->osc_string[5] * 16 + term->osc_string[6]); term_invalidate(term); term->termstate = TOPLEVEL; } } break; case SEEN_OSC_W: switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': tent i; for (i = 0; i < width; i++) if (!termchars_equal(term->pre_bidi_cache[line] + i, lbefore + i)) return FALSE; /* line doesn't match cache */ return TRU*ch; int chlenchlen = 1024; ch = snewn(chlen, wchar_t)if (term->wcFromTo_size < term->cols) { term->wcFromTo_size = term->cols; term->wcFrom = sresize(term->wcFrom, term->wcFromTo_size, bidi_char); term->wcTo = sresize(term->wcTo, term->wcFromTo_size, bidi_char); }if (term->ltemp_size < ldata->size) { term->ltemp_size = ldata->size; term->ltemp = sresize(term->ltemp, term->ltemp_size, termchar); } memcpy(term->ltemp, ldata->chars, ldata->size * TSIZE if (term->ltemp[it].cc_next) term->ltemp[it].cc_next -= it - term->wcTo[it].indexldata->size); , do_copy/* FULL-TERMCHAR */ cursor_background.chr = tchar; cursor_background.attr = tattr; /* For once, this cc_next field is an absolute index in lchars */ if (d->cc_next) cursor_background.cc_next = d->cc_next + j; else cursor_background.cc_next = 0tattr ^ attr) & term->attr_mask) != 0/* * Break on both sides of any combined-character cell. */ if (d->cc_next != 0 || (j > 0 && d[-1].cc_next != 0)do_copy = FALSE; if (!termchars_equal_override(&term->disptext[i]->chars[j], d, tchar, tattr)) { do_copy = TRUE; dirty_run = TRUE; } if (ccount >= chlen) { chlen = ccount + 256; ch = sresize(ch, chlen, wchar_t); } ch[ccount++] = (wchar_t) tchar; if (d->cc_next) { termchar *dd = d; while (dd->cc_next) { unsigned long schar; dd += dd->cc_next; schar = dd->chr; switch (schar & CSET_MASK) { case CSET_ASCII: schar = term->ucsdata->unitab_line[schar & 0xFF]; break; case CSET_LINEDRW: schar = term->ucsdata->unitab_xterm[schar & 0xFF]; break; case CSET_SCOACS: schar = term->ucsdata->unitab_scoacs[schar&0xFF]; break; } if (ccount >= chlen) { chlen = ccount + 256; ch = sresize(ch, chlen, wchar_t); } ch[ccount++] = (wchar_t) schar; } attr |= TATTR_COMBINING; } if (do_copy) { copy_termchar(term->disptext[i], j, d); term->disptext[i]->chars[j].chr = tchar; term->disptext[i]->chars[j].attr = tattr; }!termchars_equal(&term->disptext[i]->chars[j], d)) dirty_run = TRUE; copy_termchar(term->disptext[i], j, d) if (cursor_background.cc_next) { termchar *dd = ldata->chars + cursor_background.cc_next; while (1) { unsigned long schar; schar = dd->chr; switch (schar & CSET_MASK) { case CSET_ASCII: schar = term->ucsdata->unitab_line[schar & 0xFF]; break; case CSET_LINEDRW: schar = term->ucsdata->unitab_xterm[schar & 0xFF]; break; case CSET_SCOACS: schar = term->ucsdata->unitab_scoacs[schar&0xFF]; break; } if (ccount >= chlen) { chlen = ccount + 256; ch = sresize(ch, chlen, wchar_t); } ch[ccount++] = (wchar_t) schar; if (dd->cc_next) dd += dd->cc_next; else break; } attr |= TATTR_COMBINING; } sfree(ch);set, c; int x = top.x; if (ldata->chars[x].chr == UCSWIDE) { top.x++; continue; } while (1) { int uc = ldata->chars[x].chr; switch (uc & CSET_MASK) { case CSET_LINEDRW: if (!term->cfg.rawcnp) { uc = term->ucsdata->unitab_xterm[uc & 0xFF]; break; } case CSET_ASCII: uc = term->ucsdata->unitab_line[uc & 0xFF]; break; case CSET_SCOACS: uc = term->ucsdata->unitab_scoacs[uc&0xFF]; break; } switch (uc & CSET_MASK) { case CSET_ACP: uc = term->ucsdata->unitab_font[uc & 0xFF]; break; case CSET_OEMCP: uc = term->ucsdata->unitab_oemcp[uc & 0xFF]; break; } set = (uc & CSET_MASK); c = (uc & ~CSET_MASK); cbuf[0] = uc; cbuf[1] = 0; if (DIRECT_FONT(uc)) { if (c >= ' ' && c != 0x7F) { char buf[4]; WCHAR wbuf[4]; int rv; if (is_dbcs_leadbyte(term->ucsdata->font_codepage, (BYTE) c)) { buf[0] = c; buf[1] = (char) (0xFF & ldata->chars[top.x + 1].chr); rv = mb_to_wc(term->ucsdata->font_codepage, 0, buf, 2, wbuf, 4); top.x++; } else { buf[0] = c; rv = mb_to_wc(term->ucsdata->font_codepage, 0, buf, 1, wbuf, 4); } if (rv > 0) { memcpy(cbuf, wbuf, rv * sizeof(wchar_t)); cbuf[rv] = 0; } } } #endif for (p = cbuf; *p; p++) { /* Enough overhead for trailing NL and nul */ if (wblen >= buflen - 16) { buflen += 100; workbuf = sresize(workbuf, buflen, wchar_t); wbptr = workbuf + wblen; } wblen++; *wbptr++ = *p; } if (ldata->chars[x].cc_next) x += ldata->chars[x].cc_next; else break Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 95bac5def74ba9995babeef9e1caa035 Text-delta-base-sha1: 988c37fb9d1bd68acacc7bc85f2e425fb462846d Text-content-length: 1098 Text-content-md5: e4787879b35a0b24ca7d8a3791b1dffc Text-content-sha1: e654d5f5f56faa05269914cd0fa71d3cdc987cd2 Content-length: 1138 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN D!d^7-4C'c/* * Any code in terminal.c which definitely needs to be changed * when extra fields are added here is labelled with a comment * saying FULL-TERMCHAR. */ unsigned long chr; unsigned long attr; /* * The cc_next field is used to link multiple termchars * together into a list, so as to fit more than one character * into a character cell (Unicode combining characters). * * cc_next is a relative offset into the current array of * termchars. I.e. to advance to the next character in a list, * one does `tc += tc->next'. * * Zero means end of list. */ int cc_next; }; struct termline { unsigned short lattr; int cols; /* number of real columns on the line */ int size; /* number of allocated termchars * (cc-lists may make this > cols) */ int temporary; /* TRUE if decompressed from scrollback */ int cc_free; /* offset to first cc in free listint ltemp_size; bidi_char *wcFrom, *wcTo; int wcFromTo_size Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a284fd901e8305004585514cabe8a305 Text-delta-base-sha1: 81bc9c8cc1caa3e256cae68b6e7d8656937a4468 Text-content-length: 888 Text-content-md5: c5d0180415e8eb29fdb871a54f8e6ceb Text-content-sha1: 9a8959c24ac37bc7c24133c1ff10eeebd23c3185 Content-length: 929 K 15 cvs2svn:cvs-rev V 5 1.147 PROPS-END SVNI|P0TTWJvj._3OO;M>zkQ?YL>J9bg int ncombining, combining; int nfg, nbg, t, fontid, shadow, rlen, widefactor; if (attr & TATTR_COMBINING) { ncombining = len; len = 1; } else ncombining = 1*ncombining+1, wchar_t); for (i = 0; i < len*ncombiningcombining = 0; combining < ncombining; combining++) { for (i = 0; i <= len; i++) gwcs[i] = wcs[i + combining]; if (shadow) gdk_draw_text_wc(inst->pixmap, inst->fonts[fontid], gc, gwcs, len*2); } sfree(gwcs); } else { gcs = snewn(len+1, gchar); for (combining = 0; combining < ncombining; combining++) { wc_to_mb(inst->fontinfo[fontid].charset, 0, wcs + combining, len, gcs, len, ".", NULL, NULL);, gcs, len); if (shadow) gdk_draw_text(inst->pixmap, inst->fonts[fontid], gc, gcs, len); } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0da9ba1566d132ed19dbbdb2049dd025 Text-delta-base-sha1: fd1234aaf3ff65c9227190ee7b445daea174776a Text-content-length: 1490 Text-content-md5: e4814dc86192611199263c4a2b9ccfd3 Text-content-sha1: 2ceb8dcb6a27f29fedf6472f0ffb84d9fa1d382f Content-length: 1531 K 15 cvs2svn:cvs-rev V 5 1.273 PROPS-END SVN>)xSx~7"@3DCAZ]\J9&8, int opaque | GCP_DIACRITIC); ExtTextOut(hdc, x, y, ETO_GLYPH_INDEX | ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0), lprc,_internal(Context ctx, int x, int y, wchar_t *text, int len, if (attr & TATTR_COMBINING) SetBkMode(hdc, TRANSPARENT); else if (wlen < len) { sfree(wbuf); wlen = len; wbuf = snewn(wlen, WCHAR); } , !(attr & TATTR_COMBINING)/* * Wrapper that handles combining characters. */ void do_text(Context ctx, int x, int y, wchar_t *text, int len, unsigned long attr, int lattr) { if (attr & TATTR_COMBINING) { unsigned long a = 0; attr &= ~TATTR_COMBINING; while (len--) { do_text_internal(ctx, x, y, text, 1, attr | a, lattr); text++; a = TATTR_COMBINING; } } else do_text_internal(ctx, x, y, text, len, attr, lattr);a*IIae == FUNKY_VT100P) && code >= 11 && code <= 24) { int offt = 0; if (code > 15) offt++; if (code > 21) offt++; if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", code + 'P' - 11 - offt); else p += sprintf((char *) p, "\x1BO%c", code + 'P' - 11 - offt); return p - output; } if (cfg.funky_type == FUNKY_LINUX && code >= 11 && code <= 15) { p += sprintf((char *) p, "\x1B[[%c", code + 'A' - 11); return p - output; } if (cfg.funky_type == FUNKY_XTERM && code >= 11 && code <= 14) { if (term->vt52_mode) p += sprintf((c Revision-number: 4623 Prop-content-length: 774 Content-length: 774 K 8 svn:date V 27 2004-10-15T08:16:29.000000Z K 7 svn:log V 673 I'm instituting a policy that before every release I will grep the PuTTY source for the word XXX-REMOVE-BEFORE-RELEASE, and not release until I've got rid of all of them. Hence, here's an addition to the release checklist which will remind me to do so. I don't want this mechanism to seriously inhibit a release by being a placeholder for a large piece of work we might never get round to. It should be used only in cases where it's _simple_ to change the offending code: for example, a performance-impacting diagnostic might be invaluable while testing nightly snapshots but wouldn't want to slow down everyone's next release, and it's easy to get rid of on release day. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c2f42c3710ad091b6bca00b170dddfad Text-delta-base-sha1: f0737773dad17ea30396694f957f1784e5522587 Text-content-length: 274 Text-content-md5: ce99291e01884311cba8bea110ac00e2 Text-content-sha1: 026053ddb498d750af76eae12913e30a5f273fc7 Content-length: 314 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN]Xsq5( - First of all, go through the source and remove anything tagged with a comment containing the word XXX-REMOVE-BEFORE-RELEASE.Double-check that we have removed anything tagged with a comment containing the word XXX-REMOVE-BEFORE-RELEASE Revision-number: 4624 Prop-content-length: 425 Content-length: 425 K 8 svn:date V 27 2004-10-15T08:22:49.000000Z K 7 svn:log V 324 Mark cc_check() and all calls to it with the new XXX-REMOVE-BEFORE-RELEASE tag, since they're performance-intensive. And now that I'm reasonably confident of remembering to remove them before the next release, I feel less guilty about adding them willy- nilly all over the place, so I've shoved in a couple more for now :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: eed18edfb622da411e357977796be795 Text-delta-base-sha1: de127b6e832bfaec6619737afb302c664091b5c7 Text-content-length: 1104 Text-content-md5: 4f4f796c6a853a5ff2979405935ea002 Text-content-sha1: 0548fd89d14ed1cd237453df0603ee680e13f095 Content-length: 1145 K 15 cvs2svn:cvs-rev V 5 1.171 PROPS-END SVN5y|^~wIu$>@a$bek * XXX-REMOVE-BEFORE-RELEASE: This is a performance-intensive * check. Although it's currently really useful for getting all the * bugs out of the new cc stuff, it will want to be absent when we * make a proper releas /* XXX-REMOVE-BEFORE-RELEASE */ /* XXX-REMOVE-BEFORE-RELEASE */ cc_check(destline); /* XXX-REMOVE-BEFORE-RELEASE */ cc_check(line); /* XXX-REMOVE-BEFORE-RELEASE */ /* XXX-REMOVE-BEFORE-RELEASE */ /* XXX-REMOVE-BEFORE-RELEASE */yyy } check_selection(term, old_curs, term->curs); } break; case ANSI('c', '='): /* Hide or Show Cursor */ compatibility(SCOANSI); switch(term->esc_args[0]) { case 0: /* hide cursor */ term->cursor_on = FALSE; break; case 1: /* restore cursor */ term->big_cursor = FALSE; term->cursor_on = TRUE; break; case 2: /* block cursor */ term->big_cursor = TRUE; term->cursor_on = TRUE; break; } break; Revision-number: 4625 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2004-10-15T08:51:57.000000Z K 7 svn:log V 49 Fix cursor display on a combined character cell. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4f4f796c6a853a5ff2979405935ea002 Text-delta-base-sha1: 0548fd89d14ed1cd237453df0603ee680e13f095 Text-content-length: 134 Text-content-md5: 36a4e4f90e6d1800ee645a4ebc4defd8 Text-content-sha1: 1449162e1fb182826583727227e58fa05dc5610a Content-length: 175 K 15 cvs2svn:cvs-rev V 5 1.172 PROPS-END SVN ~iyterm->seen_disp_event = 1y-3~y|vrm->tabs[term->curs.x]); ccount = 1ccount Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: c5d0180415e8eb29fdb871a54f8e6ceb Text-delta-base-sha1: 9a8959c24ac37bc7c24133c1ff10eeebd23c3185 Text-content-length: 57 Text-content-md5: 05b76f513584acdf51e59fad5e30a24e Text-content-sha1: 68a889901261c76a76965b250bf84f51e250686f Content-length: 98 K 15 cvs2svn:cvs-rev V 5 1.148 PROPS-END SVN|'6<`TATTR_COMBINING) len = 1 Revision-number: 4626 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 I broke ordinary line wrapping as a result of retiring cpos. Oops. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-15T09:06:45.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 36a4e4f90e6d1800ee645a4ebc4defd8 Text-delta-base-sha1: 1449162e1fb182826583727227e58fa05dc5610a Text-content-length: 113 Text-content-md5: e740a2702c6d931a4b763f03b59321d9 Text-content-sha1: e5728bac3867743dc7f98da66a88090334572944 Content-length: 154 K 15 cvs2svn:cvs-rev V 5 1.173 PROPS-END SVN !4+0 cline = scrlineptr(term->curs.y)-R%-} while (term->curs.x >0 && !te Revision-number: 4627 Prop-content-length: 300 Content-length: 300 K 7 svn:log V 199 Fix Windows redraw problem on RH half of wrapped lines. (term_paint was checking whether lattr == LATTR_NORM, where it should have been checking (lattr & LATTR_MODE) to mask off LATTR_WRAPPED et al. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-15T09:16:58.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e740a2702c6d931a4b763f03b59321d9 Text-delta-base-sha1: e5728bac3867743dc7f98da66a88090334572944 Text-content-length: 81 Text-content-md5: aeb524c7e3ea99bcf521185d345e000e Text-content-sha1: 50fd66f344d53c1583b706cdd616e005a11a399c Content-length: 122 K 15 cvs2svn:cvs-rev V 5 1.174 PROPS-END SVNRa '>|V(term->disptext[i]->lattr & LATTR_MODE) Revision-number: 4628 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2004-10-15T09:28:46.000000Z K 7 svn:log V 62 Fix applying combining characters to double-width characters. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: aeb524c7e3ea99bcf521185d345e000e Text-delta-base-sha1: 50fd66f344d53c1583b706cdd616e005a11a399c Text-content-length: 876 Text-content-md5: 75d8fd7a1a397ed84998bc08b9901ab0 Text-content-sha1: 9695d2f452b9f4025acfa23ba15c292bda8925db Content-length: 917 K 15 cvs2svn:cvs-rev V 5 1.175 PROPS-END SVNEnEM=if (term->curs.x > 0) { int x = term->curs.x - 1; /* If we're in wrapnext state, the character * to combine with is _here_, not to our left. */ if (term->wrapnext) x++; /* * If the previous character is * UCSWIDE, back up another one. */ if (cline->chars[x].chr == UCSWIDE) { assert(x > 0); x--; } add_cc(cline, x, c); term->seen_disp_event = 1; }aWvva || i == 1) { strcpy(buf, "\033[2;1;1;112;112;1;0x"); buf[2] += i; ldisc_send(term->ldisc, buf, 20, 0); } } break; case 'Z': /* CBT: BackTab for xterm */ compatibility(OTHER); { int i = def(term->esc_args[0], 1); pos old_curs = term->curs; for(;i>0 && term->curs.x>0; i--) { do { term->curs.x--; Revision-number: 4629 Prop-content-length: 131 Content-length: 131 K 7 svn:log V 31 Fix many bugs in resizeline(). K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-15T10:48:27.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 75d8fd7a1a397ed84998bc08b9901ab0 Text-delta-base-sha1: 9695d2f452b9f4025acfa23ba15c292bda8925db Text-content-length: 1556 Text-content-md5: d9d51007b1733418d555f13f91e2d6ed Text-content-sha1: 1504db2110af6c0f279de745b4bff1ba0aae6cf2 Content-length: 1597 K 15 cvs2svn:cvs-rev V 5 1.176 PROPS-END SVN.h,:Or/ IB:*=gcols; if (line->cols != cols) { oldcols = line->cols; oldcols; i++) clear_cc(line, i); /* * If we're shrinking the line, we now bodily move the * entire cc section from where it started to where it now * needs to be. (We have to do this before the resize, so * that the data we're copying is still there. However, if * we're expanding, we have to wait until _after_ the * resize so that the space we're copying into is there.) */ if (cols < oldcols) memmove(line->chars + cols, line->chars + oldcols, (line->size - line->cols) * TSIZEline->size += cols - oldcols; line->chars = sresize(line->chars, line->size, TTYPE); line->cols = cols; /* * If we're expanding the line, _now_ we move the cc * section. */ if (cols > oldcols) memmove(line->chars + cols, line->chars + oldcols, cols && i < cols; i++) if (line->chars[i].cc_next) line->chars[i].cc_next += cols - oldcols; if (line->cc_free) line->cc_free += cols - oldcolscolsW3\\W, term->curs.x, term->curs.y); check_boundary(term, term->curs.x+n, term->curs.y); check_selection(term, term->curs, cursplus); while (n--) copy_termchar(cline, p++, &term->erase_char); term->seen_disp_event = TRUE; } break; case 'x': /* DECREQTPARM: report terminal characteristics */ compatibility(VT100); if (term->ldisc) { char buf[32]; int i = def(term->esc_args[0], 0); if (i == 0 Revision-number: 4630 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2004-10-15T10:58:06.000000Z K 7 svn:log V 116 Downgrade to `fun'; now the terminal emulator is looking sensible, this is now a practically trivial piece of work. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/256-colours Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 4decf3deb41b6fd94a5cdf5ae78acd14 Text-delta-base-sha1: 1a625367fc25d8aed783f991b47c5fdbcbed174a Text-content-length: 786 Text-content-md5: 6c019102efa6e661aaeab90138fd4be4 Text-content-sha1: 97074369e78be078f416cc13dc4b73655d96f87f Content-length: 825 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNsHHfun Depends: compressed-scrollback Content-type: text/x-html-body

    It's been suggested that PuTTY could usefully support xterm's 256-colour mode (ESC [ 38;5;XX m and ESC [ 48;5;XX m, where XX is a colour index from 0-255).

    This would be a pretty easy piece of work, now that we have plenty of free bits in the attribute word in the termchar structure. However, I'm currently unaware of any applications that use it, aside from a vague suggestion that people might put 256-colour codes in their colour ls settings.

    If anyone gives us a good reason why we should want to implement this, I'll probably just go ahead and do it.

    (<1042233614.1153.15.camel@evilmagic.org> contains a patch to implement this, but it's very out of date.) Revision-number: 4631 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2004-10-15T11:11:19.000000Z K 7 svn:log V 102 Store line widths in the bidi cache, so we don't fail to re-bidi a line when the window size changes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: d9d51007b1733418d555f13f91e2d6ed Text-delta-base-sha1: 1504db2110af6c0f279de745b4bff1ba0aae6cf2 Text-content-length: 1016 Text-content-md5: e05ffac5fb3208d4b4a966bedeb509e9 Text-content-sha1: 4a3aa4712077e5e2256945002fc3fdc8139738e0 Content-length: 1057 K 15 cvs2svn:cvs-rev V 5 1.177 PROPS-END SVN .+'M.chars); sfree(term->post_bidi_cache[i].chars3'){(U@K%\zUX[oundary(term.chars) return FALSE; /* cache doesn't contain _this_ line */ if (term->pre_bidi_cache[line].width != width) return FALSE; /* line is wrong width.chars+i, lbefore+struct bidi_cache_entrystruct bidi_cache_entry); while (j < term->bidi_cache_size) { term->pre_bidi_cache[j].chars = term->post_bidi_cache[j].chars = NULL; term->pre_bidi_cache[j].width = term->post_bidi_cache[j].width = -1; j++; } } sfree(term->pre_bidi_cache[line].chars); sfree(term->post_bidi_cache[line].chars); term->pre_bidi_cache[line].width = width; term->pre_bidi_cache[line].chars = snewn(width, termchar); term->post_bidi_cache[line].width = width; term->post_bidi_cache[line].chars = snewn(width, termchar); memcpy(term->pre_bidi_cache[line].chars, lbefore, width * TSIZE); memcpy(term->post_bidi_cache[line].chars.chars Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e4787879b35a0b24ca7d8a3791b1dffc Text-delta-base-sha1: e654d5f5f56faa05269914cd0fa71d3cdc987cd2 Text-content-length: 101 Text-content-md5: 554ed26d41c4b75eb51adfdfc0486789 Text-content-sha1: 20bca25dd20979ff20bce4632ecdd92343224a1c Content-length: 141 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNDJm^E?bidi_cache_entry { int width;struct bidi_cache_entry *pre_bidi_cache, Revision-number: 4632 Prop-content-length: 265 Content-length: 265 K 8 svn:date V 27 2004-10-15T11:14:42.000000Z K 7 svn:log V 164 Don't forget to flush the bidi cache when the user enables or disables bidi or shaping, otherwise they'll have to do a manual screen refresh to see any difference. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e05ffac5fb3208d4b4a966bedeb509e9 Text-delta-base-sha1: 4a3aa4712077e5e2256945002fc3fdc8139738e0 Text-content-length: 1065 Text-content-md5: bb01f6c15c6b7a050803c735802279d4 Text-content-sha1: 770b1bd3a2096c7c46eee7fcf7252ce576dc5c4f Content-length: 1106 K 15 cvs2svn:cvs-rev V 5 1.178 PROPS-END SVNyfy!`/* * If the bidi or shaping settings have changed, flush the bidi * cache completely. */ if (term->cfg.arabicshaping != cfg->arabicshaping || term->cfg.bidi != cfg->bidi) { for (i = 0; i < term->bidi_cache_size; i++) { sfree(term->pre_bidi_cache[i].chars); sfree(term->post_bidi_cache[i].chars); term->pre_bidi_cache[i].width = -1; term->pre_bidi_cache[i].chars = NULL; term->post_bidi_cache[i].width = -1; term->post_bidi_cache[i].chars = NULL; } }'&'), term->rows); deselect(term); } break; case 'X': /* ECH: write N spaces w/o moving cursor */ /* XXX VTTEST says this is vt220, vt510 manual * says vt100 */ compatibility(ANSIMIN); { int n = def(term->esc_args[0], 1); pos cursplus; int p = term->curs.x; termline *cline = scrlineptr(term->curs.y); if (n > term->cols - term->curs.x) n = term->cols - term->curs.x; cursplus = term->curs; cursplus.x += n; check_b Revision-number: 4633 Prop-content-length: 198 Content-length: 198 K 7 svn:log V 98 Mark the trial decompress in every call to compressline() with the XXX-REMOVE-BEFORE-RELEASE tag. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-15T11:29:02.000000Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: bb01f6c15c6b7a050803c735802279d4 Text-delta-base-sha1: 770b1bd3a2096c7c46eee7fcf7252ce576dc5c4f Text-content-length: 267 Text-content-md5: e09ac70941c3ba0c6a51f3337a273d81 Text-content-sha1: fd55f56aef87a13eaaff169cc8aac4ad84bc4404 Content-length: 308 K 15 cvs2svn:cvs-rev V 5 1.179 PROPS-END SVNk0ke( * XXX-REMOVE-BEFORE-RELEASE: This is a bit performance-heavy * to be leaving in production code&ss&fg.no_remote_resize) request_resize(term->frontend, def(term->esc_args[0], term->cfg.width Revision-number: 4634 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2004-10-15T11:42:02.000000Z K 7 svn:log V 103 A combining character on U+0020 SPACE stops it from being `uninteresting' to the clipboard processing. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e09ac70941c3ba0c6a51f3337a273d81 Text-delta-base-sha1: fd55f56aef87a13eaaff169cc8aac4ad84bc4404 Text-content-length: 130 Text-content-md5: cc2f17b51110ed09bf9e8a83d8ee183f Text-content-sha1: 163a62d7b827fbc3d7edb07b7baa8e278089a4a3 Content-length: 171 K 15 cvs2svn:cvs-rev V 5 1.180 PROPS-END SVN[QnReJO!ldata->chars[nlpos.x - 1].cc_next IS_SPACE_CHR(q[-1].chr) && !q[-1].cc_next Revision-number: 4635 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2004-10-15T11:51:26.000000Z K 7 svn:log V 69 Add missing check_boundary() calls in destructive backspace handler. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: cc2f17b51110ed09bf9e8a83d8ee183f Text-delta-base-sha1: 163a62d7b827fbc3d7edb07b7baa8e278089a4a3 Text-content-length: 253 Text-content-md5: 01e356cba9f12fc64fe949c1643fb8be Text-content-sha1: 2d865347910bf3c94711a7313924def77408cbfb Content-length: 294 K 15 cvs2svn:cvs-rev V 5 1.181 PROPS-END SVNfDfV@heck_boundary(term, term->curs.x, term->curs.y); check_boundary(term, term->curs.x+1, term->curs.y);[Ejj[ * I'll allow any. */ compatibility(VT340TEXT); if (term->esc_nargs <= 1) { if (!term->c Revision-number: 4636 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2004-10-15T12:17:48.000000Z K 7 svn:log V 140 Double-height and double-width line attributes (ESC#3, ESC#4, ESC#6) were not working correctly with double-width Unicode characters (CJK). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 05b76f513584acdf51e59fad5e30a24e Text-delta-base-sha1: 68a889901261c76a76965b250bf84f51e250686f Text-content-length: 75 Text-content-md5: 2188601d14e6f7d7d5a47825e6ac2be7 Text-content-sha1: 332bbd21f82af3bb09d5bfaa1f0d9e17368713b3 Content-length: 116 K 15 cvs2svn:cvs-rev V 5 1.149 PROPS-END SVN'6%MVJ]7widefactor(i+1), len * widefactor Revision-number: 4637 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2004-10-15T12:25:51.000000Z K 7 svn:log V 79 And fix _cursor_ display on double-width double-width characters (as it were). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2188601d14e6f7d7d5a47825e6ac2be7 Text-delta-base-sha1: 332bbd21f82af3bb09d5bfaa1f0d9e17368713b3 Text-content-length: 53 Text-content-md5: a2189baa18b26e4d8d3035c136c14a5f Text-content-sha1: 08650857b85f22d9b470d8f6d6be710bed38648f Content-length: 94 K 15 cvs2svn:cvs-rev V 5 1.150 PROPS-END SVN6N@b?widefactorwidefactor Revision-number: 4638 Prop-content-length: 374 Content-length: 374 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-15T12:37:44.000000Z K 7 svn:log V 273 Fix two memory leaks in the new code. (There's no point compressing the scrollback if you then leak away all the memory you saved!) One of the leaks - by far the bigger of the two - was in my temporary diagnostic function cc_check(), which is particularly embarrassing :-) PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 01e356cba9f12fc64fe949c1643fb8be Text-delta-base-sha1: 2d865347910bf3c94711a7313924def77408cbfb Text-content-length: 157 Text-content-md5: e287d5b5f3932c00dfa807aecb40fe00 Text-content-sha1: c2c6eeedab1fa99aca78fd8f44b25280f5725383 Content-length: 198 K 15 cvs2svn:cvs-rev V 5 1.182 PROPS-END SVNHw(tC sfree(flags/* now `line' itself can be reused as the bottom line */Ei$Emply range is only 80 or 132, but Revision-number: 4639 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 Known stability issue appears to be fixed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-15T13:20:31.000000Z PROPS-END Node-path: putty-wishlist/data/bidi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 52ad8ee1502ec4f563a03e8182f3b843 Text-delta-base-sha1: 0e4662070fc3c96160064f04f1f4a071b213569c Text-content-length: 115 Text-content-md5: 45589f30c12ddff68b2096ed1404775a Text-content-sha1: e6afda00a10b7b01745eda04dd8dc85b5ec79a16 Content-length: 154 K 15 cvs2svn:cvs-rev V 3 1.8 PROPS-END SVN;bYb As of the 2004-10-16 snapshot, the known issue with horizontal window expansion should be fixed. Revision-number: 4640 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2004-10-15T13:42:03.000000Z K 7 svn:log V 17 Arabeyes' plans. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/bidi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 45589f30c12ddff68b2096ed1404775a Text-delta-base-sha1: e6afda00a10b7b01745eda04dd8dc85b5ec79a16 Text-content-length: 274 Text-content-md5: cc08dfe099768f77288d03e86860da56 Text-content-sha1: 4117fe42f81e19e0a9cff34abb22ba3492ff8df7 Content-length: 313 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN;:;

    Arabeyes have plans for further changes to improve Arabic support. One thing they're blocking on is combining character support. Revision-number: 4641 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2004-10-15T13:47:43.000000Z K 7 svn:log V 140 Declare fixed, as the hard work has been done. (I've claimed tomorrow's snapshot as fixed-in, because today's is a little ropey all told :) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unicode-combining Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 1b977c2a0b874ca0033ade1738e87b21 Text-delta-base-sha1: 96d778c7ee35d8d218020600e90009f4f0f808b9 Text-content-length: 244 Text-content-md5: 320d2bb12196f8a1cba68b0c73c2bfc5 Text-content-sha1: 143b4c0fc657e0c57cfb75a9f8521f0ed5ce8356 Content-length: 283 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVNX6 ]}\|IFixed-in: 2004-10-16

    Update, 2004-10-15: PuTTY now has the ability to store an arbitrary number of code points per character cell. Cut and paste is implemented correctly, and display is by simple overlaying. Revision-number: 4642 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2004-10-15T13:50:18.000000Z K 7 svn:log V 44 The hard work is done. Fixed-in: 2004-10-14 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unicode-more-planes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 8afb2e1bf19046149b87df5b70b3b07b Text-delta-base-sha1: c892cc8352e9390713648379d790d5f6437b5d44 Text-content-length: 220 Text-content-md5: 465d94cc5144fa2d1befc066104b83d4 Text-content-sha1: 0194b2f133c8bfa182dc95ebee4c7115168d6d82 Content-length: 259 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN EvYu1Fixed-in: 2004-10-14Update: as of the 2004-10-14 snapshot, PuTTY uses 32 bits internally to store the code point. Platform support for copy/paste and display has some limitations, though. Revision-number: 4643 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2004-10-15T23:32:01.000000Z K 7 svn:log V 53 Mention plink's new -N option in usage and man page. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/man-pl.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d3532a635a2a59d4a95d09a245880d68 Text-delta-base-sha1: 0cc9679ee1da80e9bcc591eb7c133078111c7c97 Text-content-length: 81 Text-content-md5: 411888d2cdff62e0e4a6f6df8e115195 Text-content-sha1: 38a5bf729d1b307c3c14f8b569198a72bfbe7442 Content-length: 120 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN/| <0dt \cw{-N} \dd Don't start a remote command or shell at all Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7133f416074acbb1614eae01626a7f68 Text-delta-base-sha1: f60afac44f8cd34a844486fb0c44543f0f02946e Text-content-length: 116 Text-content-md5: ec7ec301e6e24d65a0cd3bb553d08db7 Text-content-sha1: 9c3f2bd1b2d23b0ed5e7e5a83e713a63b45abb2f Content-length: 156 K 15 cvs2svn:cvs-rev V 4 1.26 PROPS-END SVN&^ ^.4RT\versionid $Id: plink.but,v 1.26 2004/10/15 23:32:01\c -N don't start a shell/command Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ce1674ffb23c1783443aee89d3da3c66 Text-delta-base-sha1: cea35472f7946658e28aefb8c6a7d9eb1ad9c850 Text-content-length: 70 Text-content-md5: 3ef83c8baec8e6f253872b345a54a2a3 Text-content-sha1: 814cd1120eea9baa9b2f176bc2c1c3d04cc1d2fc Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.90 PROPS-END SVNr8 />K'printf(" -N don't start a shell/command Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6849f89dc676fc1835dd877c9cebdb6f Text-delta-base-sha1: 54478d27c5052e7642eb2716667f4445cbc53f2d Text-content-length: 70 Text-content-md5: fdb590c22ab5d5c6561a122bd68187e8 Text-content-sha1: a1f7ab8d8a232800d3ba7ce3e661c68f9eb71178 Content-length: 110 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVNF /C,printf(" -N don't start a shell/command Revision-number: 4644 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2004-10-16T00:10:29.000000Z K 7 svn:log V 77 Keepalives don't work in Windows Plink, and never have. Perhaps they should. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/plink-keepalives Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 196 Text-content-md5: 50ec484501732f7d79b5762bf4148b14 Text-content-sha1: 921154bd840ba555ce8c1556133ddfe3baa19a29 Content-length: 312 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN666Summary: Keepalives don't work in Plink Class: semi-bug Present-in: 0.50 0.51 0.52 0.53 0.53b 0.54 0.55 Keepalives don't work in Windows Plink, and never have. Perhaps they should. Revision-number: 4645 Prop-content-length: 944 Content-length: 944 K 7 svn:log V 843 Moved the environment variables config block out of the Telnet panel into the Connection panel, and implemented support for the SSH2 "env" request. (I haven't yet found a server which accepts this request, so although I've visually checked the packet log and it looks OK, I haven't yet been able to do a full end-to-end test.) Also, the `pty' backend reads this data and does a series of `putenv' commands before launching the shell or application. This is mostly because in last week's UTF-8 faffings I got thoroughly sick of typing `export LANG=en_GB.UTF-8' every time I started a new testing pterm, and it suddenly occurred to me that this would be precisely the sort of thing you'd want to have pterm set up for you, particularly since you can configure it alongside the translation settings and so you can ensure they match up properly. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-16T10:56:54.000000Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a426e1cbae427bb5a68a70f2f2001437 Text-delta-base-sha1: 662ad3c32c089cabdaff0125acfe43efce95c5b8 Text-content-length: 36 Text-content-md5: c01c59889ffa28d12a3be2aad9c2fd9e Text-content-sha1: aea72715e83b1bed7984cc1b11258bfcb324714e Content-length: 76 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVN| pm66w Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2aa34bc4d89260dc2072d93c273317ca Text-delta-base-sha1: bb74639db8429bdabcc8be09aa6e8168d4df11b9 Text-content-length: 359 Text-content-md5: 520a6ea45760c92ab5c4566f1a3e5b39 Text-content-sha1: b7b5b9b613a7f07f140e3d5f01f4492a51111ea5 Content-length: 399 K 15 cvs2svn:cvs-rev V 4 1.94 PROPS-END SVN$)"7U5* ? E_\versionid $Id: config.but,v 1.94 2004/10/16 10:56:54Version 2 of the SSH protocol also provides a similar mechanism, which is easier to implement without security flaws. Newer SSH2 servers are more likely to support it than older ones. This configuration data is not used in the SSHv1, rlogin or raw protocols Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7691b604b8d56fa253a996913c7968ac Text-delta-base-sha1: acd11f96c5cf9221fe047113d1bdcf955812fd2d Text-content-length: 4253 Text-content-md5: 4aa466156a53e18c056cb7b5b68d693d Text-content-sha1: dafbd457a6f9c4cbe0e31a239a205c7a5758ab14 Content-length: 4294 K 15 cvs2svn:cvs-rev V 5 1.325 PROPS-END SVN<k!i8s int num_env, env_left, env_okend environment variables. * * Simplest thing here is to send all the requests at once, and * then wait for a whole bunch of successes or failures. */ if (ssh->mainchan && *ssh->cfg.environmt) { char *e = ssh->cfg.environmt; char *var, *varend, *val; s->num_env = 0; while (*e) { var = e; while (*e && *e != '\t') e++; varend = e; if (*e == '\t') e++; val = e; while (*e) e++; e++; ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_addstring(ssh, "env"); ssh2_pkt_addbool(ssh, 1); /* want reply */ ssh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_data(ssh, var, varend-var); ssh2_pkt_addstring(ssh, val); ssh2_pkt_send(ssh); s->num_env++; } logeventf(ssh, "Sent %d environment variables", s->num_env); s->env_ok = 0; s->env_left = s->num_env; while (s->env_left > 0) { do { crWaitUntilV(ispkt); if (ssh->pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh_pkt_getuint32(ssh); struct ssh_channel *c; c = find234(ssh->channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ c->v.v2.remwindow += ssh_pkt_getuint32(ssh); } } while (ssh->pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (ssh->pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (ssh->pktin.type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Unexpected response to environment request:" " packet type %d", ssh->pktin.type)); crStopV; } } else { s->env_ok++; } s->env_left--; } if (s->env_ok == s->num_env) { logevent("All environment variables successfully set"); } else if (s->env_ok == 0) { logevent("All environment variables refused"); c_write_str(ssh, "Server refused to set environment variables\r\n"); } else { logeventf(ssh, "%d environment variables refused", s->num_env - s->env_ok); c_write_str(ssh, "Server refused to set all environment variables\r\n"); }Z/ z=< ssh->size_needed = TRUE; /* buffer for later */ break; case SSH_STATE_SESSION: if (!ssh->cfg.nopty) { if (ssh->version == 1) { send_packet(ssh, SSH1_CMSG_WINDOW_SIZE, PKT_INT, ssh->term_height, PKT_INT, ssh->term_width, PKT_INT, 0, PKT_INT, 0, PKT_END); } else if (ssh->mainchan) { ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_addstring(ssh, "window-change"); ssh2_pkt_addbool(ssh, 0); ssh2_pkt_adduint32(ssh, ssh->term_width); ssh2_pkt_adduint32(ssh, ssh->term_height); ssh2_pkt_adduint32(ssh, 0); ssh2_pkt_adduint32(ssh, 0); ssh2_pkt_send(ssh); } } break; } } /* * Return a list of the special codes that make sense in this * protocol. */ static const struct telnet_special *ssh_get_specials(void *handle) { Ssh ssh = (Ssh) handle; if (ssh->version == 1) { static const struct telnet_special ssh1_specials[] = { {"IGNORE message", TS_NOP}, {NULL, 0} }; return ssh1_specials; } else if (ssh->version == 2) { static const struct telnet_special ssh2_specials[] = { {"Break", TS_BRK}, {"IGNORE message", TS_NOP}, {NULL, 0} }; return ssh2_specials; } else return NULL; } /* * Send Telnet special codes. TS_EOF is useful for `plink', so you * can send an EOF and collect resulting output (e.g. `plink * hostname sort'). */ static void ssh_special(void *handle, Telnet_Special code) { Ssh ssh = (Ssh) handle; if (code == TS_EOF) { if (ssh->state != SSH_STATE_SESSION) { /* * Buffer the EOF in case we are pre-SESSION, so we can * send it as soon as we reach SESSION. */ if (code == TS_EOF) ssh->eof_needed = TRUE; return; } if (ssh->version == 1) { send_packet(ssh, SSH1_CMSG_EOF, PKT_END); } else if (ssh->mainchan) { ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_EOF); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_send(ssh); } logevent("Sent EOF message"); } else if (code == TS_PING || code == TS_NOP Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f347c6535335daea4c93225578970839 Text-delta-base-sha1: ae6d1868f8568d541db3ac8216f87134d0f169df Text-content-length: 513 Text-content-md5: db11eca5e1196c22a96e39cbfdfc9017 Text-content-sha1: 4af232b59274e50992b713f0e065ec83eccaaab6 Content-length: 553 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNI2 gRgyP{ char *e = cfg->environmt; char *var, *varend, *val, *varval; while (*e) { var = e; while (*e && *e != '\t') e++; varend = e; if (*e == '\t') e++; val = e; while (*e) e++; e++; varval = dupprintf("%.*s=%s", varend-var, var, val); putenv(varval); /* * We must not free varval, since putenv links it * into the environment _in place_. Weird, but * there we go. Memory usage will be rationalised * as soon as we exec anyway. */ } } Revision-number: 4646 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2004-10-16T12:08:33.000000Z K 7 svn:log V 21 Fixed-in: 2004-10-17 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-env-var Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d13e2a81aae2204f804bc23d2f7a7c52 Text-delta-base-sha1: 341ad4b0ba768eb5c3e85efeb905ffb827c2c743 Text-content-length: 141 Text-content-md5: 396f34f43e1068ca9be3d89ee4d9e1ed Text-content-sha1: 2ffc5c5b2c154f6d3024b76d90fe20254f45059a Content-length: 180 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVN\U xb{adFixed-in: 2004-10-17

    Update: we now support this, although we still don't know of any SSH servers that do. Revision-number: 4647 Prop-content-length: 226 Content-length: 226 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-16T12:36:50.000000Z K 7 svn:log V 125 Fix bug in scrollback compression, which manifested when attempting to encode a very long (len>128) run of the same literal. PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e287d5b5f3932c00dfa807aecb40fe00 Text-delta-base-sha1: c2c6eeedab1fa99aca78fd8f44b25280f5725383 Text-content-length: 247 Text-content-md5: 4e574b40c5e23919acc67d21ff07ca19 Text-content-sha1: 125311903db82a22159cab9c1a0532625ca6f366 Content-length: 288 K 15 cvs2svn:cvs-rev V 5 1.183 PROPS-END SVN exe#v /* And ensure this run doesn't interfere with the next. */ prevlen = prevpos = 0; prev2 = FALSEiPggieak; case ANSI('|', '$'): /* DECSCPP */ /* * Set number of columns per page * Docs i Revision-number: 4648 Prop-content-length: 1027 Content-length: 1027 K 8 svn:date V 27 2004-10-16T14:17:58.000000Z K 7 svn:log V 926 Markus Kuhn's UTF-8 page http://www.cl.cam.ac.uk/~mgk25/unicode.html#activate feels strongly that it should be easy to make _all_ your applications work in UTF-8 mode, without having to remember a switch for each one. Every application should simply note a UTF-8 locale setting and switch into UTF-8 mode automatically. Therefore, for the Unix port only, there's now a checkbox, enabled by default, which causes the drop-down Translation box to be overridden if the locale indicates UTF-8. Anyone who doesn't like this, or doesn't like MGK, is welcome to turn it straight back off. I'm not _completely_ convinced by MGK's argument myself; for xterm/pterm to do _useful_ UTF-8 you also need to specify a decently Unicode-capable font, and there's no way _that_ can be automagically done on noticing a locale setting. But it's a de facto standard (i.e. xterm does it :-) so I might as well at least be _able_ to support it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: fa11894af8aa12668935d7ba883610af Text-delta-base-sha1: f3ed1483861eff96de570b82fe89c4c0c00ccb5d Text-content-length: 36 Text-content-md5: b96eed79af97e5faf41eacfb6683d048 Text-content-sha1: e24c33ad256a65af1f6eaa993276be4f6ffdd888 Content-length: 77 K 15 cvs2svn:cvs-rev V 5 1.235 PROPS-END SVNd{ c Yutf8_override Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 09df567b93dc8ed74d7311917130691f Text-delta-base-sha1: f093a17bed75d6d295229e962966ed559b3f9576 Text-content-length: 123 Text-content-md5: 7b2aa13b2a933cdef8648d262f755421 Text-content-sha1: e5c64bee9b21e1f2268e3cf39652b229c63736f5 Content-length: 164 K 15 cvs2svn:cvs-rev V 5 1.122 PROPS-END SVN-*]dtNu8i(sesskey, "UTF8Override", cfg->utf8_overridi(sesskey, "UTF8Override", 1, &cfg->utf8_override Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a2189baa18b26e4d8d3035c136c14a5f Text-delta-base-sha1: 08650857b85f22d9b470d8f6d6be710bed38648f Text-content-length: 82 Text-content-md5: 2684820711fb7e9e1f1242c8b72d52cf Text-content-sha1: f4ecd8373280d0c78e8f5d7bcc00335f2e0bb433 Content-length: 123 K 15 cvs2svn:cvs-rev V 5 1.151 PROPS-END SVNNg 8; inst->cfg.line_codepage, inst->cfg.utf8_overrid Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 49ba4b78ba2deea772a0f3737b3a2482 Text-delta-base-sha1: 404b0ee3a22da22b3516c9e0fc3f59e1d5d368ed Text-content-length: 65 Text-content-md5: 58345e7750be9cfce7cb958c8591edc8 Text-content-sha1: 2ae6c0ffe1af75fb1058d0baa0e600d0e45001f0 Content-length: 105 K 15 cvs2svn:cvs-rev V 4 1.43 PROPS-END SVN& ,y char *line_codepage, int utf8_overrid Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5b013de9c9a3661de9f34832c3c8bc63 Text-delta-base-sha1: 34a1f3a9c38a2c4d3adca4a8464a76f4775a1ca8 Text-content-length: 692 Text-content-md5: 1493210bc9d9eb5a400ca45354dd5c4f Text-content-sha1: a6d94ce5301f24cfe2558d98076668f98931004d Content-length: 732 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN7f @ -Markus Kuhn feels, not totally unreasonably, that it's good * for all applications to shift into UTF-8 mode if they notice * that they've been started with a LANG setting dictating it, * so that people don't have to keep remembering a separate * UTF-8 option for every application they use. Therefore, * here's an override option in the Translation panel. */ s = ctrl_getset(b, "Window/Translation", "trans", "Character set translation on received data"); ctrl_checkbox(s, "Override with UTF-8 if locale says so", 'l', HELPCTX(translation_utf8_override), dlg_stdcheckbox_handler, I(offsetof(Config,utf8_override) Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d1cba89305f4888a2de422da9f4f1fa7 Text-delta-base-sha1: f1ef3632135ee1ed5889ee598fbb2c294aae27fc Text-content-length: 589 Text-content-md5: 0b9b0ff9e99069ff1606272090dd5651 Text-content-sha1: a7515dcfa3628cfa378e8b3ed74c5cc4ae17156f Content-length: 629 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN7.+K*O7W`char *linecharset, int utf8_overrideIf utf8_override is set and the POSIX locale settings * dictate a UTF-8 character set, then just go straight for * UTF-8. */ ucsdata->line_codepage = CS_NONE; if (utf8_override) { const char *s; if (((s = getenv("LC_ALL")) && *s) || ((s = getenv("LC_CTYPE")) && *s) || ((s = getenv("LANG")) && *s)) { if (strstr(s, "UTF-8")) ucsdata->line_codepage = CS_UTF8; } } /* * Failing that, line_codepage should be decoded from the * specification in cfg Revision-number: 4649 Prop-content-length: 432 Content-length: 432 K 8 svn:date V 27 2004-10-17T14:44:27.000000Z K 7 svn:log V 331 Telnet specials menu was not being reinstated after a session was restarted in the same window (Windows version only). Policy change: it's now the backend's responsibility to call update_specials_menu() at the start of a session (or whenever it feels ready), if it has any special commands. Otherwise the menu won't be displayed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b96eed79af97e5faf41eacfb6683d048 Text-delta-base-sha1: e24c33ad256a65af1f6eaa993276be4f6ffdd888 Text-content-length: 254 Text-content-md5: 4982ff2cb941e8794418a87b6fed1664 Text-content-sha1: e673c8815e7a962accc1ea503f603468de72318a Content-length: 295 K 15 cvs2svn:cvs-rev V 5 1.236 PROPS-END SVN{^b&bV%/* It's the backend's responsibility to invoke this at the start of a * connection, if necessary; it can also invoke it later if the set of * special commands changes. It does not need to invoke it at session * shutdown. */ Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 1f304d99f0fbcfe72c7bb81b834f7a37 Text-delta-base-sha1: 935de1ff1071faf5b99c1c42381348d1e887b2ad Text-content-length: 131 Text-content-md5: 91268289b80cd6b03995ff3806b574bf Text-content-sha1: da6386eafb645b11ba530b5a6c1c3d95cb8eb844 Content-length: 171 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVN/ i}i9v/* * We can send special commands from the start. */ update_specials_menu(telnet->frontend) Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2684820711fb7e9e1f1242c8b72d52cf Text-delta-base-sha1: f4ecd8373280d0c78e8f5d7bcc00335f2e0bb433 Text-content-length: 107 Text-content-md5: 91340912ce2dc2904ddbcada64cf20d1 Text-content-sha1: 2283848e130d9dbc8c89de3b2aa36abf8ee96868 Content-length: 148 K 15 cvs2svn:cvs-rev V 5 1.152 PROPS-END SVNgK)IK ]gtk_widget_hide(inst->specialsitem1); gtk_widget_hide(inst->specialsitem2) Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: e4814dc86192611199263c4a2b9ccfd3 Text-delta-base-sha1: 2ceb8dcb6a27f29fedf6472f0ffb84d9fa1d382f Text-content-length: 96 Text-content-md5: 7923cb093f1bb6f7e08202026e80c798 Text-content-sha1: 77a292c0c522d3ace4c9401fca1e53331879be2b Content-length: 137 K 15 cvs2svn:cvs-rev V 5 1.274 PROPS-END SVN/48Jestart_backend(e == FUNKY_VT100P) && code >= 11 *  ! Revision-number: 4650 Prop-content-length: 410 Content-length: 410 K 8 svn:date V 27 2004-10-17T15:32:42.000000Z K 7 svn:log V 309 We shouldn't offer the Break special when we don't have a session to send it down. (A side effect of fixing this is that ssh->mainchain is set to NULL when it closes, which might avoid other sorts of trouble.) While we're here, don't bother offering SSH1_MSG_IGNORE if we believe the remote will barf on it. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4aa466156a53e18c056cb7b5b68d693d Text-delta-base-sha1: dafbd457a6f9c4cbe0e31a239a205c7a5758ab14 Text-content-length: 1514 Text-content-md5: 3e5953e9aae16e00d837bb5ecc72f777 Text-content-sha1: bd408b6c08571ee449452cc8cae508d62bfa5995 Content-length: 1555 K 15 cvs2svn:cvs-rev V 5 1.326 PROPS-END SVNouqM 4update_specials_menu(ssh->frontendssh->mainchan = NULL; update_specials_menu(ssh->frontend); break;/O0@WpHgbreak; /* do nothing */ case SSH_STATE_INTERMED: static const struct telnet_special ignore_special[] = { {"IGNORE message", TS_NOP}, }; static const struct telnet_special ssh2_session_specials[] = { {"", 0}, {"Break", TS_BRK} /* XXX we should also support signals */ }; static const struct telnet_special specials_end[] = { {NULL, 0} }; static struct telnet_special ssh_specials[lenof(ignore_special) + lenof(ssh2_session_specials) + lenof(specials_end)]; Ssh ssh = (Ssh) handle; int i = 0; #define ADD_SPECIALS(name) \ do { \ assert((i + lenof(name)) <= lenof(ssh_specials)); \ memcpy(&ssh_specials[i], name, sizeof name); \ i += lenof(name); \ } while(0) if (ssh->version == 1) { /* Don't bother offering IGNORE if we've decided the remote * won't cope with it, since we wouldn't bother sending it if * asked anyway. */ if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) ADD_SPECIALS(ignore_special); } else if (ssh->version == 2) { /* XXX add rekey, when implemented */ ADD_SPECIALS(ignore_special); if (ssh->mainchan) ADD_SPECIALS(ssh2_session_specials); } /* else we're not ready yet */ if (i) { ADD_SPECIALS(specials_end); return ssh_specials; } else { return NULL; } #undef ADD_SPECIALS Revision-number: 4651 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2004-10-17T20:31:43.000000Z K 7 svn:log V 60 Mention the logging-things-falling-off-the-scrollback idea. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/save-scrollback Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ee1ba2c32af89570becd10d6cf303d27 Text-delta-base-sha1: f81806e28d5b39c0f5513443556433a18cc51737 Text-content-length: 772 Text-content-md5: 96e9a34c927960c9c8ad31ddd8a54a07 Text-content-sha1: ed6e9a8fb4c0252db1326e2953b196e76a5b260e Content-length: 811 K 15 cvs2svn:cvs-rev V 3 1.2 PROPS-END SVNUFqUq

    Related: someone suggested that it might be useful to be able to log stuff to a file as it goes into the scrollback; this would avoid the problem with `Log printable output only' that characters backspaced over, etc, are logged. However, lines can in theory be pulled out of the scrollback and modified, when the window is expanded vertically.

    The right solution to this is to log lines when they're about to fall off the top of the scrollback. Obviously this will usually leave rather a lag between things happening and finally being written to disc; and when the log file is closed, the entire screen and scrollback state would have to be written to the log to bring it up to date, which is a rather similar operation to this wish. Revision-number: 4652 Prop-content-length: 590 Content-length: 590 K 8 svn:date V 27 2004-10-17T21:22:22.000000Z K 7 svn:log V 489 Support the SSH-2 mechanism for sending signals to a running session. Neither of the SSH servers I conveniently have access to (Debian stable OpenSSH -- 3.4p1 -- and lshd) seem to take a blind bit of notice, but the channel requests look fine to me in the packet log. I've included all the signals explicitly defined by draft-ietf-secsh-connect-19, but I've put the more obscure ones in a submenu of the specials menu; there's therefore been some minor upheaval to support such submenus. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 992c458af6708c8e8e913329c841f1d4 Text-delta-base-sha1: 4025ea266c7b85f426638d3b55cbf58df2427d43 Text-content-length: 575 Text-content-md5: 88c3f2fd020901eb720ce5e237c288bd Text-content-sha1: ff470fa3b5cb584d9df4d820c85a287fdcb5fa7a Content-length: 615 K 15 cvs2svn:cvs-rev V 4 1.35 PROPS-END SVNF4#q:i &\versionid $Id: using.but,v 1.35 2004/10/17 21:22:22 jacobIGNORE message, SSH special command}\I{No-op, in SSH}IGNORE message \lcont{ Should have no effect. } \b \I{Break, SSH special command}Break \lcont{ Only available in SSH-2, and only during a session. Optional extension; may not be supported by server. PuTTY requests the server's default break length. } \b \I{Signal, SSH special command}Signals (SIGINT, SIGTERM etc) \lcont{ Only available in SSH-2, and only during a session. Sends various POSIX signals. Not honoured by all servers Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4982ff2cb941e8794418a87b6fed1664 Text-delta-base-sha1: e673c8815e7a962accc1ea503f603468de72318a Text-content-length: 673 Text-content-md5: 2427840f33d0529c8f7e132d13b2281c Text-content-sha1: 58c7e2a2fe2ea157f3152234af6091d46aa98b01 Content-length: 714 K 15 cvs2svn:cvs-rev V 5 1.237 PROPS-END SVN^y~z|dz/* Actual special commands. Originally Telnet, but some codes have * been re-used for similar specials in other protocols. */, /* 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, TS_SIGTERM, TS_SIGUSR1, TS_SIGUSR2, /* Pseudo-specials used for constructing the specials menu. */ TS_SEP, /* Separator */ TS_SUBMENU, /* Start a new submenu with specified name */ TS_EXITMENU /* Exit current submenu or end of specials */ } Telnet_Special; struct telnet_special { const char *name; Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 3e5953e9aae16e00d837bb5ecc72f777 Text-delta-base-sha1: bd408b6c08571ee449452cc8cae508d62bfa5995 Text-content-length: 1738 Text-content-md5: aef362f41da99911395dac559e4225e6 Text-content-sha1: 9290e16ece8884261f414246fe179200c937db8c Content-length: 1779 K 15 cvs2svn:cvs-rev V 5 1.327 PROPS-END SVNO !}8|J|NG*yL-"NULL, TS_SEP}, {"Break", TS_BRK}, /* These are the signal names defined by draft-ietf-secsh-connect-19. * They include all the ISO C signals, but are a subset of the POSIX * required signals. */ {"SIGINT (Interrupt)", TS_SIGINT}, {"SIGTERM (Terminate)", TS_SIGTERM}, {"SIGKILL (Kill)", TS_SIGKILL}, {"SIGQUIT (Quit)", TS_SIGQUIT}, {"SIGHUP (Hangup)", TS_SIGHUP}, {"More signals", TS_SUBMENU}, {"SIGABRT", TS_SIGABRT}, {"SIGALRM", TS_SIGALRM}, {"SIGFPE", TS_SIGFPE}, {"SIGILL", TS_SIGILL}, {"SIGPIPE", TS_SIGPIPE}, {"SIGSEGV", TS_SIGSEGV}, {"SIGUSR1", TS_SIGUSR1}, {"SIGUSR2", TS_SIGUSR2}, {NULL, TS_EXITMENU}TS_EXITMENUIs is a POSIX signal? */ char *signame = NULL; if (code == TS_SIGABRT) signame = "ABRT"; if (code == TS_SIGALRM) signame = "ALRM"; if (code == TS_SIGFPE) signame = "FPE"; if (code == TS_SIGHUP) signame = "HUP"; if (code == TS_SIGILL) signame = "ILL"; if (code == TS_SIGINT) signame = "INT"; if (code == TS_SIGKILL) signame = "KILL"; if (code == TS_SIGPIPE) signame = "PIPE"; if (code == TS_SIGQUIT) signame = "QUIT"; if (code == TS_SIGSEGV) signame = "SEGV"; if (code == TS_SIGTERM) signame = "TERM"; if (code == TS_SIGUSR1) signame = "USR1"; if (code == TS_SIGUSR2) signame = "USR2"; /* The SSH-2 protocol does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */ if (ssh->version == 2 && signal"); ssh2_pkt_addbool(ssh, 0); ssh2_pkt_addstring(ssh, signame); ssh2_pkt_send(ssh); logeventf(ssh, "Sent signal SIG%s", signame); } } else { /* Never heard of it. Do nothing */ } Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 91268289b80cd6b03995ff3806b574bf Text-delta-base-sha1: da6386eafb645b11ba530b5a6c1c3d95cb8eb844 Text-content-length: 182 Text-content-md5: bdf42d3a4c00d4f987ebc6b29510429f Text-content-sha1: ec27be8fe50cd24dcd6244ea9aff311b5e1f9b3b Content-length: 222 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVNf6z{5X(w default: break; /* never heard of it */NULL, TS_SEPNULL, TS_SEP}, {"End Of Record", TS_EOR}, {"End Of File", TS_EOF}, {NULL, TS_EXITMENU Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 91340912ce2dc2904ddbcada64cf20d1 Text-delta-base-sha1: 2283848e130d9dbc8c89de3b2aa36abf8ee96868 Text-content-length: 1059 Text-content-md5: 26464cd0355b07a836f856ae7b46ed91 Text-content-sha1: f0dd3994417f4e434b9489d61c013a941b667af5 Content-length: 1100 K 15 cvs2svn:cvs-rev V 5 1.153 PROPS-END SVNX}/ ]{z/* I believe this disposes of submenus too. */ = inst->specialsmenu; /* A lame "stack" for submenus that will do for now. */ GtkWidget *saved_menu = NULL; int nesting = 1; for (i = 0; nesting > 0; i++) { GtkWidget *menuitem = NULL; switch (specials[i].code) { case TS_SUBMENU: assert (nesting < 2); saved_menu = menu; /* XXX lame stacking */ menu = gtk_menu_new(); menuitem = gtk_menu_item_new_with_label(specials[i].name); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu); gtk_container_add(GTK_CONTAINER(saved_menu), menuitem); gtk_widget_show(menuitem); menuitem = NULL; nesting++; break; case TS_EXITMENU: nesting--; if (nesting) { menu = saved_menu; /* XXX lame stacking */ saved_menu = NULL; } break; case TS_SEP: menuitem = gtk_menu_item_new(); break; default: break; } if (menuitem) { gtk_container_add(GTK_CONTAINER(menu), menuitem); gtk_widget_show(menuitem); }ain(); return 0; } Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7923cb093f1bb6f7e08202026e80c798 Text-delta-base-sha1: 77a292c0c522d3ace4c9401fca1e53331879be2b Text-content-length: 1856 Text-content-md5: b308b195d5a4543c698f63dd12cc545e Text-content-sha1: dd8bf9422fb49f1a0cc60e9d4ef48ffed5459a86 Content-length: 1897 K 15 cvs2svn:cvs-rev V 5 1.275 PROPS-END SVN6aX gSoun@lV.)TxA8static int n_/* We can't use Windows to provide a stack for submenus, so * here's a lame "stack" that will do for now. */ HMENU saved_menu = NULL; int nesting = 1; p = CreatePopupMenu(); for (i = 0; nesting > 0; i++) { assert(IDM_SPECIAL_MIN + 0x10 * i < IDM_SPECIAL_MAX); switch (specials[i].code) { case TS_SEP: AppendMenu(p, MF_SEPARATOR, 0, 0); break; case TS_SUBMENU: assert(nesting < 2); nesting++; saved_menu = p; /* XXX lame stacking */ p = CreatePopupMenu(); AppendMenu(saved_menu, MF_POPUP | MF_ENABLED, (UINT) p, specials[i].name); break; case TS_EXITMENU: nesting--; if (nesting) { p = saved_menu; /* XXX lame stacking */ saved_menu = NULL; } break; default: break; } } /* Squirrel the highest special. */ n_specials = i - 1; } else { p = NULL; n_specials = 0; } for (j = 0; j < lenof(popup_menus); j++) { if (menu_already_exists) { /* XXX does this free up all submenus? */if (i >= n_specials) break; if (back) back->special(backhandle, specials[i].code); net_pending_errors();  eak; case VK_F10: index = 9; break; case VK_F11: index = 10; break; case VK_F12: index = 11; break; } if (keystate[VK_SHIFT] & 0x80) index += 12; if (keystate[VK_CONTROL] & 0x80) index += 24; p += sprintf((char *) p, "\x1B[%c", codes[index]); return p - output; } if (cfg.funky_type == FUNKY_SCO && /* SCO small keypad */ code >= 1 && code <= 6) { char codes[] = "HL.FIG"; if (code == 3) { *p++ = '\x7F'; } else { p += sprintf((char *) p, "\x1B[%c", codes[code-1]); } return p - output; } if ((term->vt52_mode || cfg.funky_type == FUNKY_VT100P) && code >= 11 Revision-number: 4653 Prop-content-length: 461 Content-length: 461 K 8 svn:date V 27 2004-10-18T00:41:48.000000Z K 7 svn:log V 360 Add support for logging "exit-signal", why not. This is disgustingly huge because old versions of OpenSSH got the message format wrong, so we have to infer which format is in use. Tested with Debian stable OpenSSH (3.4p1), with `uint32' packet, and lshd, which uses the correct `string' packet, and also let me test "core dumped" and the explanatory message. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: aef362f41da99911395dac559e4225e6 Text-delta-base-sha1: 9290e16ece8884261f414246fe179200c937db8c Text-content-length: 5242 Text-content-md5: b1d2c6a048c338bd0f4c684ebc025776 Text-content-sha1: 462b67bbbfda6fa4a1dd2001dc841e3dfbadca96 Content-length: 5283 K 15 cvs2svn:cvs-rev V 5 1.328 PROPS-END SVN:,C)g^, yint reply = SSH2_MSG_CHANNEL_FAILURE; /* default */c == ssh->mainchan) { /* * We recognise "exit-status" and "exit-signal" on * the primary channel. */ if (typelen == 11 && !memcmp(type, "exit-status", 11)) { ssh->exitcode = ssh_pkt_getuint32(ssh); logeventf(ssh, "Server sent command exit status %d", ssh->exitcode); reply = SSH2_MSG_CHANNEL_SUCCESS; } else if (typelen == 11 && !memcmp(type, "exit-signal", 11)) { int is_plausible = TRUE, is_int = FALSE; char *fmt_sig = "", *fmt_msg = ""; char *msg; int msglen = 0, core = FALSE; /* ICK: older versions of OpenSSH (e.g. 3.4p1) * provide an `int' for the signal, despite its * having been a `string' in the drafts since at * least 2001. (Fixed in session.c 1.147.) Try to * infer which we can safely parse it as. */ { unsigned char *p = ssh->pktin.body + ssh->pktin.savedpos; long len = ssh->pktin.length - ssh->pktin.savedpos; unsigned long num = GET_32BIT(p); /* what is it? */ /* If it's 0, it hardly matters; assume string */ if (num == 0) { is_int = FALSE; } else { int maybe_int = FALSE, maybe_str = FALSE; #define CHECK_HYPOTHESIS(offset, result) \ do { \ long q = offset; \ if (q+4 <= len) { \ q = q + 4 + GET_32BIT(p+q); \ if (q+4 <= len && (q = q + 4 + GET_32BIT(p+q)) && q == len) \ result = TRUE; \ } \ } while(0) CHECK_HYPOTHESIS(4+1, maybe_int); CHECK_HYPOTHESIS(4+num+1, maybe_str); #undef CHECK_HYPOTHESIS if (maybe_int && !maybe_str) is_int = TRUE; else if (!maybe_int && maybe_str) is_int = FALSE; else /* Crikey. Either or neither. Panic. */ is_plausible = FALSE; } } if (is_plausible) { if (is_int) { /* Old non-standard OpenSSH. */ int signum = ssh_pkt_getuint32(ssh); fmt_sig = dupprintf(" %d", signum); } else { /* As per the drafts. */ char *sig; int siglen; ssh_pkt_getstring(ssh, &sig, &siglen); /* Signal name isn't supposed to be blank, but * let's cope gracefully if it is. */ if (siglen) { fmt_sig = dupprintf(" \"%.*s\"", siglen, sig); } } core = ssh2_pkt_getbool(ssh); ssh_pkt_getstring(ssh, &msg, &msglen); if (msglen) { fmt_msg = dupprintf(" (\"%.*s\")", msglen, msg); } /* ignore lang tag */ } /* else don't attempt to parse */ logeventf(ssh, "Server exited on signal%s%s%s", fmt_sig, core ? " (core dumped)" : "", fmt_msg); if (*fmt_sig) sfree(fmt_sig); if (*fmt_msg) sfree(fmt_msg); reply = SSH2_MSG_CHANNEL_SUCCESS; reply = SSH2_MSG_CHANNEL_FAILURE; } if (want_reply) { ssh2_pkt_init(ssh, reply); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_send(ssh); }ss sh->do_ssh2_transport_state); sfree(ssh->do_ssh2_authconn_state); if (ssh->pktout.data) { sfree(ssh->pktout.data); ssh->pktout.data = NULL; } if (ssh->pktin.data) { sfree(ssh->pktin.data); ssh->pktin.data = NULL; } if (ssh->crcda_ctx) { crcda_free_context(ssh->crcda_ctx); ssh->crcda_ctx = NULL; } if (ssh->s) ssh_do_close(ssh); sfree(ssh); } /* * Reconfigure the SSH backend. * * Currently, this function does nothing very useful. In future, * however, we could do some handy things with it. For example, we * could make the port forwarding configurer active in the Change * Settings box, and this routine could close down existing * forwardings and open up new ones in response to changes. */ static void ssh_reconfig(void *handle, Config *cfg) { Ssh ssh = (Ssh) handle; ssh->cfg = *cfg; /* STRUCTURE COPY */ } /* * Called to send data down the Telnet connection. */ static int ssh_send(void *handle, char *buf, int len) { Ssh ssh = (Ssh) handle; if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL) return 0; ssh->protocol(ssh, (unsigned char *)buf, len, 0); return ssh_sendbuffer(ssh); } /* * Called to query the current amount of buffered stdin data. */ static int ssh_sendbuffer(void *handle) { Ssh ssh = (Ssh) handle; int override_value; if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL) return 0; /* * If the SSH socket itself has backed up, add the total backup * size on that to any individual buffer on the stdin channel. */ override_value = 0; if (ssh->throttled_all) override_value = ssh->overall_bufsize; if (ssh->version == 1) { return override_value; } else if (ssh->version == 2) { if (!ssh->mainchan || ssh->mainchan->closes > 0) return override_value; else return (override_value + bufchain_size(&ssh->mainchan->v.v2.outbuffer)); } return 0; } /* * Called to set the size of the window from SSH's POV. */ static void ssh_size(void *handle, int width, int height) { Ssh ssh = (Ssh) handle; ssh->term_width = width; ssh->term_height = height; switch (ssh->state) { case SSH_STATE_BEFORE_SIZE: case SSH_STATE_PREPACKET: case SSH_STATE_CLOSED: Revision-number: 4654 Prop-content-length: 451 Content-length: 451 K 8 svn:date V 27 2004-10-19T13:54:50.000000Z K 7 svn:log V 350 Munge line-drawing description to match current naming and order of options (in the Windows version), and hopefully to clarify distinction between line charset and local font, which has occasionally foxed me. Cross-reference the Translation panel reference section from the intro section in using.but and mention line-drawing characters there also. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 520a6ea45760c92ab5c4566f1a3e5b39 Text-delta-base-sha1: b7b5b9b613a7f07f140e3d5f01f4492a51111ea5 Text-content-length: 717 Text-content-md5: 6e9a5feb74882b8c42cd07f12838660f Text-content-sha1: 68c40b1ed6c35355d1237d2d4559ce93e4986524 Content-length: 757 K 15 cvs2svn:cvs-rev V 4 1.95 PROPS-END SVN)C#y;) (|0A]eD\versionid $Id: config.but,v 1.95 2004/10/19 13:54:50 jacob that shift temporarily into a separate character set for drawing simple lines and boxes. However, there are a variety of ways in which PuTTY can attempt to find appropriate characters, and the right one to use depends on the locally configured font. In general you should probably try lots of options until you find one that your particular font supports. \b \q{Use Unicode line drawing code points} tries to use the box characters that are present in Unicode. For good Unicode-supporting fonts this is probably the most reliable and functional optionthat were received as Unicode code points will paste as Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 88c3f2fd020901eb720ce5e237c288bd Text-delta-base-sha1: ff470fa3b5cb584d9df4d820c85a287fdcb5fa7a Text-content-length: 523 Text-content-md5: 3980c599924c474ee62b0dd9922edeb7 Text-content-sha1: 3b426557057af6091d64da8ccd14b8a67f538bf1 Content-length: 563 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN4"g4!R,\versionid $Id: using.but,v 1.36 2004/10/19 13:54:50, or \i{line-drawing characters}) are not being displayed correctly in your PuTTY session, it may be that PuTTY is interpreting the characters sent by the server according to the wrong \e{character set}. There are a lot of different character sets available, so it's entirely possible for can select, and other related options. Now all you need is to find out which of them you want! (See \k{config-translation} for more information.) Revision-number: 4655 Prop-content-length: 295 Content-length: 295 K 8 svn:date V 27 2004-10-20T10:59:04.000000Z K 7 svn:log V 194 P800 PuTTY link hasn't worked for a while. From forum: "The binary is removed from this site at the moment cause it's so unstable. We'll see if we find time in future to make a better version." K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a60c41b778925f0d739f49bf9dc3e914 Text-delta-base-sha1: 344df21186f30806cb78eb29a2a998af2f37e651 Text-content-length: 20 Text-content-md5: 4021d9444900c8615d47ac84dfff0426 Text-content-sha1: 54d7958b6e8f77c9298288e884feef4f96db86b7 Content-length: 60 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN1 ~3\ Revision-number: 4656 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2004-10-20T11:04:26.000000Z K 7 svn:log V 27 lk Arabeyes wishlist entry K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 4021d9444900c8615d47ac84dfff0426 Text-delta-base-sha1: 54d7958b6e8f77c9298288e884feef4f96db86b7 Text-content-length: 81 Text-content-md5: d103c7f99bebd02a97ba385d8e9adf2c Text-content-sha1: 7ea5fe55cd71731b8d4581406973489b407f6b6a Content-length: 121 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN1n <-, (see also wishlist entry) Revision-number: 4657 Prop-content-length: 467 Content-length: 467 K 8 svn:date V 27 2004-10-21T10:59:53.000000Z K 7 svn:log V 366 I just had a need to decode a piece of Zlib data from out of the middle of a PDF. So here's a modification to sshzlib.c which enables it to be compiled into a standalone Zlib decoder if you define ZLIB_STANDALONE. As an added bonus, it (both standalone and in PuTTY) also validates the Zlib header, just to make sure someone hasn't defined a new compression format. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 423472b348d918165ae2598405cb0a87 Text-delta-base-sha1: 3e0d125469c88ac80b3b56b862eed0eead8b14fc Text-content-length: 3520 Text-content-md5: 83153799abcff7cb341ee9b2ac149ab6 Text-content-sha1: 109487d4819412a1f3fab31baec9df8bbc906c8d Content-length: 3560 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNm3 wI.wN@jGW dfdef ZLIB_STANDALONE /* * This module also makes a handy zlib decoding tool for when * you're picking apart Zip files or PDFs or PNGs. If you compile * it with ZLIB_STANDALONE defined, it builds on its own and * becomes a command-line utility. * * Therefore, here I provide a self-contained implementation of the * macros required from the rest of the PuTTY sources. */ #define snew(type) ( (type *) malloc(sizeof(type)) ) #define snewn(n, type) ( (type *) malloc((n) * sizeof(type)) ) #define sresize(x, n, type) ( (type *) realloc((x), (n) * sizeof(type)) ) #define sfree(x) ( free((x)) ) #else #include "ssh.h" #endif, headersnewn(256, unsigned char); dctx->outsize = 256; /* * The header is stored as a big-endian 16-bit integer, * in contrast to the general little-endian policy in * the rest of the format :-( */ header = (((dctx->bits & 0xFF00) >> 8) | ((dctx->bits & 0x00FF) << 8)); EATBITS(16); /* * Check the header: * * - bits 8-11 should be 1000 (Deflate/RFC1951) * - bits 12-15 should be at most 0111 (window size) * - bit 5 should be zero (no dictionary present) * - we don't care about bits 6-7 (compression rate) * - bits 0-4 should be set up to make the whole thing * a multiple of 31 (checksum). */ if ((header & 0x0F00) != 0x0800 || (header & 0xF000) > 0x7000 || (header & 0x0020) != 0x0000 || (header % 31) != 0) goto decode_error; #ifdef ZLIB_STANDALONE #include #include int main(int argc, char **argv) { unsigned char buf[16], *outbuf; int ret, outlen; void *handle; int noheader = FALSE, opts = TRUE; char *filename = NULL; FILE *fp; while (--argc) { char *p = *++argv; if (p[0] == '-' && opts) { if (!strcmp(p, "-d")) noheader = TRUE; else if (!strcmp(p, "--")) opts = FALSE; /* next thing is filename */ else { fprintf(stderr, "unknown command line option '%s'\n", p); return 1; } } else if (!filename) { filename = p; } else { fprintf(stderr, "can only handle one filename\n"); return 1; } } handle = zlib_decompress_init(); if (noheader) { /* * Provide missing zlib header if -d was specified. */ zlib_decompress_block(handle, "\x78\x9C", 2, &outbuf, &outlen); assert(outlen == 0); } if (filename) fp = fopen(filename, "rb"); else fp = stdin; if (!fp) { assert(filename); fprintf(stderr, "unable to open '%s'\n", filename); return 1; } while (1) { ret = fread(buf, 1, sizeof(buf), fp); if (ret <= 0) break; zlib_decompress_block(handle, buf, ret, &outbuf, &outlen); if (outbuf) { if (outlen) fwrite(outbuf, 1, outlen, stdout); sfree(outbuf); } else { fprintf(stderr, "decoding error\n"); return 1; } } zlib_decompress_cleanup(handle); if (filename) fclose(fp); return 0; } #else #endif Revision-number: 4658 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:01.260017Z PROPS-END Revision-number: 4659 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:01.269376Z PROPS-END Revision-number: 4660 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:01.295538Z PROPS-END Revision-number: 4661 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:01.305305Z PROPS-END Revision-number: 4662 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:01.316130Z PROPS-END Revision-number: 4663 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:01.326236Z PROPS-END Revision-number: 4664 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:01.335723Z PROPS-END Revision-number: 4665 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:01.348082Z PROPS-END Revision-number: 4666 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:01.358335Z PROPS-END Revision-number: 4667 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:01.369024Z PROPS-END Revision-number: 4668 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2004-10-22T15:07:14.000000Z K 7 svn:log V 35 putty.huewenet.de putty.archive.hk K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: f8b35a537864dc0f24a6fb9fd5e98e63 Text-delta-base-sha1: 3db222e4bdd95e67cfa54a7e8cf8067546190462 Text-content-length: 120 Text-content-md5: b12040778db1bc72cdfde97749e8e735 Text-content-sha1: 5291912ea151ce5c0cd3bd9796ac5534a46a80e0 Content-length: 161 K 15 cvs2svn:cvs-rev V 5 1.133 PROPS-END SVN|SJ?cA@*tputty.huewenet.de/">putty.huewenet.dearchive.hk/">putty.archive.hk in Hong Kong Revision-number: 4669 Prop-content-length: 242 Content-length: 242 K 8 svn:date V 27 2004-10-22T16:47:46.000000Z K 7 svn:log V 141 We ought to be using the ssh_pkt_* routines for the messages which we process at any time in the rdpkt routines, as well as everywhere else. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b1d2c6a048c338bd0f4c684ebc025776 Text-delta-base-sha1: 462b67bbbfda6fa4a1dd2001dc841e3dfbadca96 Text-content-length: 1721 Text-content-md5: dad78c7f34da69450427aea15b814e73 Text-content-sha1: 9a08214b07fe2e3bd7da389fa3cb168adcae90d6 Content-length: 1762 K 15 cvs2svn:cvs-rev V 5 1.329 PROPS-END SVNJ1x={l94EZt}AvmbB>{SXunsignedstatic unsigned long ssh_pkt_getuint32(Ssh ssh); static void ssh_pkt_getstring(Ssh ssh, char **p, int *lengt char *buf, *msg; int msglen; ssh_pkt_getstring(ssh, &msg, &msglen); buf = dupprintf("Remote debug message: %.*s", msglen, msg); logevent(buf); sfree(buf); *msg; int msglen; ssh_pkt_getstring(ssh, &msg, &msglen); bombout(("Server sent disconnect message:\n\"%.*s\"", msglen, msg, *msg; int nowlen, reason, msglen; reason = ssh_pkt_getuint32(ssh); ssh_pkt_getstring(ssh, &msg, &msglenmsg*buf, *msg; int msglen; ssh_pkt_getstring(ssh, &msg, &msglen); buf = dupprintf("Remote debug message: %.*s", msglen, msg); logevent(buf); sfree(buf); } goto next_packet;STR, proto, PKT_STR, data, PKT_END); }X11 forwarding refused"); } else { logevent("X11 forwarding enabled"); ssh->X11_fwd_enabled = TRUE; } } { char type; int n; int sport,dport,sserv,dserv; char sports[256], dports[256], saddr[2/zK5sh->do_ssh2_transport_state); sfree(ssh->do_ssh2_authconn_state); if (ssh->pktout.data) { sfree(ssh->pktout.data); ssh->pktout.data = NULL; } if (ssh->pktin.data) { sfree(ssh->pktin.data); ssh->pktin.data = NULL; } if (ssh->crcda_ctx) { crcda_free_context(ssh->crcda_ctx); ssh->crcda_ctx = NULL; } if (ssh->s) ssh_do_close(ssh); sfree(ssh); } /* * Reconfigure the SSH backend. * * Currently, this function does nothing very useful. In future, * however, we could do som}ww Revision-number: 4670 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2004-10-22T16:50:51.000000Z K 7 svn:log V 51 Better bounds checking in the exit-signal handler. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: dad78c7f34da69450427aea15b814e73 Text-delta-base-sha1: 9a08214b07fe2e3bd7da389fa3cb168adcae90d6 Text-content-length: 184 Text-content-md5: 81af4413f63b668a8338dc9e92821129 Text-content-sha1: 6ccabccf93b1c48747a2681b70530b8c9beb24b3 Content-length: 225 K 15 cvs2svn:cvs-rev V 5 1.330 PROPS-END SVN dd W >= 0 && q+4 <= len) { \ q = q + 4 + GET_32BIT(p+q); \ if (q >= 0 && q+4 <= len && \ ww * however, we could do som Revision-number: 4671 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 Mention that README is useful in the sections about source code. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-22T22:48:15.000000Z PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: dde59dbd6245d8ea2cedd3d85ebe02b7 Text-delta-base-sha1: c64586be5c81269f69bd49922a2b593411a2bbe6 Text-content-length: 178 Text-content-md5: c7a5625a7e950762ffd5bf458cd5cd63 Text-content-sha1: 5fb02d925c8e952dda584f23e478bef81dc1849a Content-length: 218 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN ! % W_- See the file "README" for more information.p> See the file "README" for more information on building PuTTY from sourc Revision-number: 4672 Prop-content-length: 317 Content-length: 317 K 7 svn:log V 216 I've started an 0.56 release branch from just before my recent terminal emulator re-engineering. This is a merge of various unrelated new stuff from the trunk after that point: notably -N and a variety of bug fixes. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-24T13:21:11.000000Z PROPS-END Node-path: putty-branch-0.56/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 9e80f9b1bb9ce64414806bde2a6e2bad Text-delta-base-sha1: 7c315b1cb8e6e9c99d03888a874fc790a808afbb Text-content-length: 78 Text-content-md5: d65d65fd3204bf0de61fc84edfe9eef9 Text-content-sha1: b599c3fc4a8e2f0ef2f8e61726228304abe58b78 Content-length: 122 K 15 cvs2svn:cvs-rev V 8 1.16.4.1 PROPS-END SVN#60jd1L{l7Nssh_no_shell = 1; } if (!strcmp(p, "-C Node-path: putty-branch-0.56/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 3f7da4caa3a844d39a01dd5c9adce97a Text-delta-base-sha1: 03fb7446e1ed56079b54f068a102b8a7c49bd58f Text-content-length: 182 Text-content-md5: a426e1cbae427bb5a68a70f2f2001437 Text-content-sha1: 662ad3c32c089cabdaff0125acfe43efce95c5b8 Content-length: 226 K 15 cvs2svn:cvs-rev V 8 1.37.2.1 PROPS-END SVNR|2 Don't start a shell or command at all", 'n', HELPCTX(ssh_noshell), dlg_stdcheckbox_handler, I(offsetof(Config,ssh_no_shelly Node-path: putty-branch-0.56/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 60a77bdaa9e169630325d571ccd51b05 Text-delta-base-sha1: f2ec1a78880e04a3a39a125dc7df0903854f48d6 Text-content-length: 909 Text-content-md5: 543c87cc6bbfeac6df0122395549a83e Text-content-sha1: ac0d5a32e6f8504955f3c456d36958e248cf5044 Content-length: 953 K 15 cvs2svn:cvs-rev V 8 1.92.2.1 PROPS-END SVNc(o;0E\versionid $Id: config.but,v 1.92.2.1 2004/10/24 13:21:11 simonnoshell} \q{Don't start a shell or command at all} \cfg{winhelp-topic}{ssh.noshell} If you tick this box, PuTTY will not attempt to run a shell or command after connecting to the remote server. You might want to use this option if you are only using the SSH connection for port forwarding, and your user account on the server does not have the ability to run a shell. This feature is only available in SSH protocol version 2 (since the version 1 protocol assumes you will always want to run a shell). This feature can also be enabled using the \c{-N} command-line option; see \k{using-cmdline-noshell}. If you use this feature in Plink, you will not be able to terminate the Plink process by any graceful means; the only way to kill it will be by pressing Control-C or sending a kill signal from another program Node-path: putty-branch-0.56/doc/index.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 78758467e8e60441d9f14f469523b89e Text-delta-base-sha1: bc41dc08dff6f63dbd070c7359af91dde28b4a58 Text-content-length: 34 Text-content-md5: 09605c301a4958b1a588687051ce52de Text-content-sha1: 1bb337b2917869efd13d5f6fe83128365e743134 Content-length: 77 K 15 cvs2svn:cvs-rev V 7 1.2.4.1 PROPS-END SVNr sN-upper} \c{-N Node-path: putty-branch-0.56/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: dc7c12ac05b1a079fe51d341f1618fe5 Text-delta-base-sha1: a29ca4bea8800aee4ade9b710da83b9b547139a0 Text-content-length: 729 Text-content-md5: b2e597002a3af26e70fde3b3d166c1b7 Text-content-sha1: d0ee6f7d2ebf4c6514d072dfc9fe35c386009edc Content-length: 773 K 15 cvs2svn:cvs-rev V 8 1.33.2.1 PROPS-END SVNjJ7E:yc,k\versionid $Id: using.but,v 1.33.2.1 2004/10/24 13:21:11 simonnoshell} \I{-N-upper}\c{-N}: suppress starting a shell or command The \c{-N} option prevents PuTTY from attempting to start a shell or command on the remote server. You might want to use this option if you are only using the SSH connection for port forwarding, and your user account on the server does not have the ability to run a shell. This feature is only available in SSH protocol version 2 (since the version 1 protocol assumes you will always want to run a shell). This option is equivalent to the \q{Don't start a shell or command at all} checkbox in the SSH panel of the PuTTY configuration box (see \k{config-ssh-noshell Node-path: putty-branch-0.56/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 1755022df9d006339e6f6c0540d8f0bf Text-delta-base-sha1: fe8fbaa33767bfb05d122583469ab4b7d5bb88a1 Text-content-length: 73 Text-content-md5: 9969ba4005832826c9a67c7976ce841e Text-content-sha1: 2c29c01f6fc76c61bdb8b7d135332ef83a61544e Content-length: 118 K 15 cvs2svn:cvs-rev V 9 1.231.2.1 PROPS-END SVNI 2\;Tint ssh_no_shell; /* avoid running a shell Node-path: putty-branch-0.56/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: c5bb1181864f86af7f29a80ec9bca6f8 Text-delta-base-sha1: 960090650e2e47f1637c71cec5d66ac5822551dd Text-content-length: 103 Text-content-md5: 09df567b93dc8ed74d7311917130691f Text-content-sha1: f093a17bed75d6d295229e962966ed559b3f9576 Content-length: 148 K 15 cvs2svn:cvs-rev V 9 1.120.2.1 PROPS-END SVN6-IV>2PfNoShell", cfg->ssh_no_shelli(sesskey, "SshNoShell", 0, &cfg->ssh_no_shell Node-path: putty-branch-0.56/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 8895c19b7f7471b044e048180a79705b Text-delta-base-sha1: e7555f46a5b6b40268d107988ec5a9bdd42622ab Text-content-length: 2074 Text-content-md5: 7691b604b8d56fa253a996913c7968ac Text-content-sha1: acd11f96c5cf9221fe047113d1bdcf955812fd2d Content-length: 2119 K 15 cvs2svn:cvs-rev V 9 1.323.2.1 PROPS-END SVNG][Zx0B(1i"v,Doj}fssh->channels = newtree234(ssh_channelcmp); /* * Create the main session channel. */ if (!ssh->cfg.ssh_no_shell) { ssh->mainchan = snew(struct ssh_channel); ssh->mainchan->ssh = ssh; ssh->mainchan->localid = alloc_channel_id(ssh); ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring(ssh, "session"); ssh2_pkt_adduint32(ssh, ssh->mainchan->localid); ssh->mainchan->v.v2.locwindow = OUR_V2_WINSIZE; ssh2_pkt_adduint32(ssh, ssh->mainchan->v.v2.locwindow);/* our window size */ ssh2_pkt_adduint32(ssh, 0x4000UL); /* our max pkt size */ ssh2_pkt_send(ssh); crWaitUntilV(ispkt); if (ssh->pktin.type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) { bombout(("Server refused to open a session")); crStopV; /* FIXME: error data comes back in FAILURE packet */ } if (ssh_pkt_getuint32(ssh) != ssh->mainchan->localid) { bombout(("Server's channel confirmation cited wrong channel")); crStopV; } ssh->mainchan->remoteid = ssh_pkt_getuint32(ssh); ssh->mainchan->type = CHAN_MAINSESSION; ssh->mainchan->closes = 0; ssh->mainchan->v.v2.remwindow = ssh_pkt_getuint32(ssh); ssh->mainchan->v.v2.remmaxpkt = ssh_pkt_getuint32(ssh); bufchain_init(&ssh->mainchan->v.v2.outbuffer); add234(ssh->channels, ssh->mainchan); logevent("Opened channel for session"); } else ssh->mainchan = NULL; /* * Potentially enable X11 forwarding. */ if (ssh->mainchan && mainchan && ssh->mainchan && if (ssh->mainchan)if (ssh->mainchan) (This is only our termination condition if we're * not running in -N mode.) */ if (!ssh->cfg.ssh_no_shell && if (ssh->mainchan)if (ssh->mainchan)if (ssh->mainchan)?Z hXgSSH_STATE_PREPACKET) return; if (ssh->version == 1) { if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) send_packet(ssh, SSH1_MSG_IGNORE, PKT_STR, "", PKT_END); } else { ssh2_pkt_init(ssh, SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(ssh); if (ssh->mainchan) Node-path: putty-branch-0.56/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 197a255ba8ad9faf65e6b76bba31ae64 Text-delta-base-sha1: 739bf703d8a3d5c776401ee661897b5cbc601759 Text-content-length: 374 Text-content-md5: df849327f062eda9dda6fefa86d39631 Text-content-sha1: 0ee2cbdf6b1f040b0dd8c69b3875376eb5064a7b Content-length: 419 K 15 cvs2svn:cvs-rev V 9 1.167.2.1 PROPS-END SVNTT,a{ /* destructive bksp might be disabled */ check_boundary(term, term->curs.x, term->curs.y); check_boundary(term, term->curs.x+1, term->curs.y); *term->cpos = (' ' | term->curr_attr | ATTR_ASCII); }ZMssZtemp[it] = ldata[term->wcTo[it].index]; if (term->wcTo[it].origwc != term->wcTo[it].wc) term->ltemp[it] = Node-path: putty-branch-0.56/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: af69c54ad3698eef5e98dc279ed839f4 Text-delta-base-sha1: b223765324064600123e2670310018b1253a32e8 Text-content-length: 92 Text-content-md5: 0e52c89fdf783cc6a4fe2294d48ac2cc Text-content-sha1: 9c7ac81dcc8afa51860bd2cab460c80471e0fe39 Content-length: 137 K 15 cvs2svn:cvs-rev V 9 1.145.2.1 PROPS-END SVNA'(<89n|LgS2widefactorwidefactorwidefactorwidefactor Node-path: putty-branch-0.56/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 7cd2045e9eb48b967f48a7879bc44867 Text-delta-base-sha1: b611496fca9c1d507c3225f8ceb047586b382bf1 Text-content-length: 63 Text-content-md5: e643faf0210c81d5a132a3dead730227 Text-content-sha1: 9b3f9112e6f01c45deda855e90be7a0efb98d208 Content-length: 108 K 15 cvs2svn:cvs-rev V 9 1.270.2.1 PROPS-END SVN i~ { p += sprintf(, Node-path: putty-branch-0.56/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 78dbbcfa68346acaf9e9c8f1fe6dc6c4 Text-delta-base-sha1: 9f082d3796ea0fbe48dca6198c2d34ffcd0a0bcb Text-content-length: 41 Text-content-md5: ef1ba584b560c42d5be6fc2f2142c893 Text-content-sha1: 9b1941d653a91a86f7513b05d5d2b343426b55c9 Content-length: 84 K 15 cvs2svn:cvs-rev V 7 1.8.2.1 PROPS-END SVN5 )xnoshell "ssh.noshell Node-path: putty-branch-0.56/winsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 442674da8cd6da49d6df2c1baf7143b8 Text-delta-base-sha1: 9373ebc4e5d058f96502c761a12beca1ea3a2054 Text-content-length: 48 Text-content-md5: 84e6b047179bc4f041e7b666ca1384da Text-content-sha1: c0209d49ef37c0a4914f9f446d6703c4731de642 Content-length: 91 K 15 cvs2svn:cvs-rev V 7 1.4.4.1 PROPS-END SVN% |t1Enumerate files in dir `foo Revision-number: 4673 Prop-content-length: 271 Content-length: 271 K 8 svn:date V 27 2004-10-24T13:29:03.000000Z K 7 svn:log V 170 Further merges from trunk: Jacob's specials menu work, Jacob's extra -N docs, my environment variables patch, and my UTF-8 locale override mechanism in Unix PuTTY/pterm. K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.56/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: a426e1cbae427bb5a68a70f2f2001437 Text-delta-base-sha1: 662ad3c32c089cabdaff0125acfe43efce95c5b8 Text-content-length: 36 Text-content-md5: c01c59889ffa28d12a3be2aad9c2fd9e Text-content-sha1: aea72715e83b1bed7984cc1b11258bfcb324714e Content-length: 80 K 15 cvs2svn:cvs-rev V 8 1.37.2.2 PROPS-END SVN| pm66w Node-path: putty-branch-0.56/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 543c87cc6bbfeac6df0122395549a83e Text-delta-base-sha1: ac0d5a32e6f8504955f3c456d36958e248cf5044 Text-content-length: 363 Text-content-md5: ea594d10a1a5340206b5b2e8b5d47810 Text-content-sha1: df9774b3ed5ee2c29416751ddbc4cb024d41b466 Content-length: 407 K 15 cvs2svn:cvs-rev V 8 1.92.2.2 PROPS-END SVN(-";U9* CEc\versionid $Id: config.but,v 1.92.2.2 2004/10/24 13:29:02Version 2 of the SSH protocol also provides a similar mechanism, which is easier to implement without security flaws. Newer SSH2 servers are more likely to support it than older ones. This configuration data is not used in the SSHv1, rlogin or raw protocols Node-path: putty-branch-0.56/doc/man-pl.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: d3532a635a2a59d4a95d09a245880d68 Text-delta-base-sha1: 0cc9679ee1da80e9bcc591eb7c133078111c7c97 Text-content-length: 81 Text-content-md5: 411888d2cdff62e0e4a6f6df8e115195 Text-content-sha1: 38a5bf729d1b307c3c14f8b569198a72bfbe7442 Content-length: 124 K 15 cvs2svn:cvs-rev V 7 1.4.4.1 PROPS-END SVN/| <0dt \cw{-N} \dd Don't start a remote command or shell at all Node-path: putty-branch-0.56/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 7133f416074acbb1614eae01626a7f68 Text-delta-base-sha1: f60afac44f8cd34a844486fb0c44543f0f02946e Text-content-length: 126 Text-content-md5: 3550be143d48d5b6322f39d33109ca8d Text-content-sha1: 1d39d79bd4b8c6754c0048efbc188f1dbbc14525 Content-length: 170 K 15 cvs2svn:cvs-rev V 8 1.25.2.1 PROPS-END SVN&b h(:RT\versionid $Id: plink.but,v 1.25.2.1 2004/10/24 13:29:02 simon\c -N don't start a shell/command Node-path: putty-branch-0.56/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: ce1674ffb23c1783443aee89d3da3c66 Text-delta-base-sha1: cea35472f7946658e28aefb8c6a7d9eb1ad9c850 Text-content-length: 70 Text-content-md5: 3ef83c8baec8e6f253872b345a54a2a3 Text-content-sha1: 814cd1120eea9baa9b2f176bc2c1c3d04cc1d2fc Content-length: 114 K 15 cvs2svn:cvs-rev V 8 1.89.2.1 PROPS-END SVNr8 />K'printf(" -N don't start a shell/command Node-path: putty-branch-0.56/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 9969ba4005832826c9a67c7976ce841e Text-delta-base-sha1: 2c29c01f6fc76c61bdb8b7d135332ef83a61544e Text-content-length: 272 Text-content-md5: 4f3514665fe7cceee03aa379706c5140 Text-content-sha1: 8e86a4ee00e7f584bc66e17c8fa688632babd24a Content-length: 317 K 15 cvs2svn:cvs-rev V 9 1.231.2.2 PROPS-END SVNICoN0DbVsutf8_override/* It's the backend's responsibility to invoke this at the start of a * connection, if necessary; it can also invoke it later if the set of * special commands changes. It does not need to invoke it at session * shutdown. */ Node-path: putty-branch-0.56/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 09df567b93dc8ed74d7311917130691f Text-delta-base-sha1: f093a17bed75d6d295229e962966ed559b3f9576 Text-content-length: 123 Text-content-md5: 7b2aa13b2a933cdef8648d262f755421 Text-content-sha1: e5c64bee9b21e1f2268e3cf39652b229c63736f5 Content-length: 168 K 15 cvs2svn:cvs-rev V 9 1.120.2.2 PROPS-END SVN-*]dtNu8i(sesskey, "UTF8Override", cfg->utf8_overridi(sesskey, "UTF8Override", 1, &cfg->utf8_override Node-path: putty-branch-0.56/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 7691b604b8d56fa253a996913c7968ac Text-delta-base-sha1: acd11f96c5cf9221fe047113d1bdcf955812fd2d Text-content-length: 5307 Text-content-md5: 3e5953e9aae16e00d837bb5ecc72f777 Text-content-sha1: bd408b6c08571ee449452cc8cae508d62bfa5995 Content-length: 5352 K 15 cvs2svn:cvs-rev V 9 1.323.2.2 PROPS-END SVN&+kli9Q9sM _ int num_env, env_left, env_okupdate_specials_menu(ssh->frontendend environment variables. * * Simplest thing here is to send all the requests at once, and * then wait for a whole bunch of successes or failures. */ if (ssh->mainchan && *ssh->cfg.environmt) { char *e = ssh->cfg.environmt; char *var, *varend, *val; s->num_env = 0; while (*e) { var = e; while (*e && *e != '\t') e++; varend = e; if (*e == '\t') e++; val = e; while (*e) e++; e++; ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_addstring(ssh, "env"); ssh2_pkt_addbool(ssh, 1); /* want reply */ ssh2_pkt_addstring_start(ssh); ssh2_pkt_addstring_data(ssh, var, varend-var); ssh2_pkt_addstring(ssh, val); ssh2_pkt_send(ssh); s->num_env++; } logeventf(ssh, "Sent %d environment variables", s->num_env); s->env_ok = 0; s->env_left = s->num_env; while (s->env_left > 0) { do { crWaitUntilV(ispkt); if (ssh->pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh_pkt_getuint32(ssh); struct ssh_channel *c; c = find234(ssh->channels, &i, ssh_channelfind); if (!c) continue; /* nonexistent channel */ c->v.v2.remwindow += ssh_pkt_getuint32(ssh); } } while (ssh->pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (ssh->pktin.type != SSH2_MSG_CHANNEL_SUCCESS) { if (ssh->pktin.type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Unexpected response to environment request:" " packet type %d", ssh->pktin.type)); crStopV; } } else { s->env_ok++; } s->env_left--; } if (s->env_ok == s->num_env) { logevent("All environment variables successfully set"); } else if (s->env_ok == 0) { logevent("All environment variables refused"); c_write_str(ssh, "Server refused to set environment variables\r\n"); } else { logeventf(ssh, "%d environment variables refused", s->num_env - s->env_ok); c_write_str(ssh, "Server refused to set all environment variables\r\n"); }ssh->mainchan = NULL; update_specials_menu(ssh->frontend); break;ZO 77z=size_needed = TRUE; /* buffer for later */ break; case SSH_STATE_SESSION: if (!ssh->cfg.nopty) { if (ssh->version == 1) { send_packet(ssh, SSH1_CMSG_WINDOW_SIZE, PKT_INT, ssh->term_height, PKT_INT, ssh->term_width, PKT_INT, 0, PKT_INT, 0, PKT_END); } else if (ssh->mainchan) { ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_addstring(ssh, "window-change"); ssh2_pkt_addbool(ssh, 0); ssh2_pkt_adduint32(ssh, ssh->term_width); ssh2_pkt_adduint32(ssh, ssh->term_height); ssh2_pkt_adduint32(ssh, 0); ssh2_pkt_adduint32(ssh, 0); ssh2_pkt_send(ssh); } } break; } } /* * Return a list of the special codes that make sense in this * protocol. */ static const struct telnet_special *ssh_get_specials(void *handle) { static const struct telnet_special ignore_special[] = { {"IGNORE message", TS_NOP}, }; static const struct telnet_special ssh2_session_specials[] = { {"", 0}, {"Break", TS_BRK} /* XXX we should also support signals */ }; static const struct telnet_special specials_end[] = { {NULL, 0} }; static struct telnet_special ssh_specials[lenof(ignore_special) + lenof(ssh2_session_specials) + lenof(specials_end)]; Ssh ssh = (Ssh) handle; int i = 0; #define ADD_SPECIALS(name) \ do { \ assert((i + lenof(name)) <= lenof(ssh_specials)); \ memcpy(&ssh_specials[i], name, sizeof name); \ i += lenof(name); \ } while(0) if (ssh->version == 1) { /* Don't bother offering IGNORE if we've decided the remote * won't cope with it, since we wouldn't bother sending it if * asked anyway. */ if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) ADD_SPECIALS(ignore_special); } else if (ssh->version == 2) { /* XXX add rekey, when implemented */ ADD_SPECIALS(ignore_special); if (ssh->mainchan) ADD_SPECIALS(ssh2_session_specials); } /* else we're not ready yet */ if (i) { ADD_SPECIALS(specials_end); return ssh_specials; } else { return NULL; } #undef ADD_SPECIALS } /* * Send Telnet special codes. TS_EOF is useful for `plink', so you * can send an EOF and collect resulting output (e.g. `plink * hostname sort'). */ static void ssh_special(void *handle, Telnet_Special code) { Ssh ssh = (Ssh) handle; if (code == TS_EOF) { if (ssh->state != SSH_STATE_SESSION) { /* * Buffer the EOF in case we are pre-SESSION, so we can * send it as soon as we reach SESSION. */ if (code == TS_EOF) ssh->eof_needed = TRUE; return; } if (ssh->version == 1) { send_packet(ssh, SSH1_CMSG_EOF, PKT_END); } else if (ssh->mainchan) { ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_EOF); ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid); ssh2_pkt_send(ssh); } logevent("Sent EOF message"); } else if (code == TS_PING || code == TS_NOP Node-path: putty-branch-0.56/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 1f304d99f0fbcfe72c7bb81b834f7a37 Text-delta-base-sha1: 935de1ff1071faf5b99c1c42381348d1e887b2ad Text-content-length: 131 Text-content-md5: 91268289b80cd6b03995ff3806b574bf Text-content-sha1: da6386eafb645b11ba530b5a6c1c3d95cb8eb844 Content-length: 175 K 15 cvs2svn:cvs-rev V 8 1.71.2.1 PROPS-END SVN/ i}i9v/* * We can send special commands from the start. */ update_specials_menu(telnet->frontend) Node-path: putty-branch-0.56/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 0e52c89fdf783cc6a4fe2294d48ac2cc Text-delta-base-sha1: 9c7ac81dcc8afa51860bd2cab460c80471e0fe39 Text-content-length: 98 Text-content-md5: 481307dbdf519473634be3b1bf85807c Text-content-sha1: 38f132a90902be6fdd78c454903a43849191482e Content-length: 143 K 15 cvs2svn:cvs-rev V 9 1.145.2.2 PROPS-END SVNA8U.#M49 inst->cfg.line_codepage, inst->cfg.utf8_overrid Node-path: putty-branch-0.56/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: f347c6535335daea4c93225578970839 Text-delta-base-sha1: ae6d1868f8568d541db3ac8216f87134d0f169df Text-content-length: 513 Text-content-md5: db11eca5e1196c22a96e39cbfdfc9017 Text-content-sha1: 4af232b59274e50992b713f0e065ec83eccaaab6 Content-length: 557 K 15 cvs2svn:cvs-rev V 8 1.37.2.1 PROPS-END SVNI2 gRgyP{ char *e = cfg->environmt; char *var, *varend, *val, *varval; while (*e) { var = e; while (*e && *e != '\t') e++; varend = e; if (*e == '\t') e++; val = e; while (*e) e++; e++; varval = dupprintf("%.*s=%s", varend-var, var, val); putenv(varval); /* * We must not free varval, since putenv links it * into the environment _in place_. Weird, but * there we go. Memory usage will be rationalised * as soon as we exec anyway. */ } } Node-path: putty-branch-0.56/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 49ba4b78ba2deea772a0f3737b3a2482 Text-delta-base-sha1: 404b0ee3a22da22b3516c9e0fc3f59e1d5d368ed Text-content-length: 65 Text-content-md5: 58345e7750be9cfce7cb958c8591edc8 Text-content-sha1: 2ae6c0ffe1af75fb1058d0baa0e600d0e45001f0 Content-length: 109 K 15 cvs2svn:cvs-rev V 8 1.42.4.1 PROPS-END SVN& ,y char *line_codepage, int utf8_overrid Node-path: putty-branch-0.56/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: 5b013de9c9a3661de9f34832c3c8bc63 Text-delta-base-sha1: 34a1f3a9c38a2c4d3adca4a8464a76f4775a1ca8 Text-content-length: 692 Text-content-md5: 1493210bc9d9eb5a400ca45354dd5c4f Text-content-sha1: a6d94ce5301f24cfe2558d98076668f98931004d Content-length: 735 K 15 cvs2svn:cvs-rev V 7 1.9.4.1 PROPS-END SVN7f @ -Markus Kuhn feels, not totally unreasonably, that it's good * for all applications to shift into UTF-8 mode if they notice * that they've been started with a LANG setting dictating it, * so that people don't have to keep remembering a separate * UTF-8 option for every application they use. Therefore, * here's an override option in the Translation panel. */ s = ctrl_getset(b, "Window/Translation", "trans", "Character set translation on received data"); ctrl_checkbox(s, "Override with UTF-8 if locale says so", 'l', HELPCTX(translation_utf8_override), dlg_stdcheckbox_handler, I(offsetof(Config,utf8_override) Node-path: putty-branch-0.56/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 6849f89dc676fc1835dd877c9cebdb6f Text-delta-base-sha1: 54478d27c5052e7642eb2716667f4445cbc53f2d Text-content-length: 70 Text-content-md5: fdb590c22ab5d5c6561a122bd68187e8 Text-content-sha1: a1f7ab8d8a232800d3ba7ce3e661c68f9eb71178 Content-length: 114 K 15 cvs2svn:cvs-rev V 8 1.35.2.1 PROPS-END SVNF /C,printf(" -N don't start a shell/command Node-path: putty-branch-0.56/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: d1cba89305f4888a2de422da9f4f1fa7 Text-delta-base-sha1: f1ef3632135ee1ed5889ee598fbb2c294aae27fc Text-content-length: 589 Text-content-md5: 0b9b0ff9e99069ff1606272090dd5651 Text-content-sha1: a7515dcfa3628cfa378e8b3ed74c5cc4ae17156f Content-length: 633 K 15 cvs2svn:cvs-rev V 8 1.16.4.1 PROPS-END SVN7.+K*O7W`char *linecharset, int utf8_overrideIf utf8_override is set and the POSIX locale settings * dictate a UTF-8 character set, then just go straight for * UTF-8. */ ucsdata->line_codepage = CS_NONE; if (utf8_override) { const char *s; if (((s = getenv("LC_ALL")) && *s) || ((s = getenv("LC_CTYPE")) && *s) || ((s = getenv("LANG")) && *s)) { if (strstr(s, "UTF-8")) ucsdata->line_codepage = CS_UTF8; } } /* * Failing that, line_codepage should be decoded from the * specification in cfg Node-path: putty-branch-0.56/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: e643faf0210c81d5a132a3dead730227 Text-delta-base-sha1: 9b3f9112e6f01c45deda855e90be7a0efb98d208 Text-content-length: 96 Text-content-md5: cb500f2abe2f3b187725bfc5c34603d4 Text-content-sha1: 3646beb25de53655a7a82578e1828cc0f064169c Content-length: 141 K 15 cvs2svn:cvs-rev V 9 1.270.2.2 PROPS-END SVN/48Jestart_backend((char *) p, code == 1 ? "\x1B[H" vv! Revision-number: 4674 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2004-10-24T13:31:55.000000Z K 7 svn:log V 99 Yet more trunk merges. Jacob's SSH signals stuff, some docs changes, and stability stuff in ssh.c. K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.56/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: ea594d10a1a5340206b5b2e8b5d47810 Text-delta-base-sha1: df9774b3ed5ee2c29416751ddbc4cb024d41b466 Text-content-length: 715 Text-content-md5: d787420262c227745e8da2c56a139857 Text-content-sha1: a0ec81b51c4ec02c7603602e923524c9d19f7f05 Content-length: 759 K 15 cvs2svn:cvs-rev V 8 1.92.2.3 PROPS-END SVN-G#9) ,|4AaeH\versionid $Id: config.but,v 1.92.2.3 2004/10/24 13:31:55 that shift temporarily into a separate character set for drawing simple lines and boxes. However, there are a variety of ways in which PuTTY can attempt to find appropriate characters, and the right one to use depends on the locally configured font. In general you should probably try lots of options until you find one that your particular font supports. \b \q{Use Unicode line drawing code points} tries to use the box characters that are present in Unicode. For good Unicode-supporting fonts this is probably the most reliable and functional optionthat were received as Unicode code points will paste as Node-path: putty-branch-0.56/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: b2e597002a3af26e70fde3b3d166c1b7 Text-delta-base-sha1: d0ee6f7d2ebf4c6514d072dfc9fe35c386009edc Text-content-length: 1024 Text-content-md5: 7eaeb68d349a83c3354e70370a42c192 Text-content-sha1: df3d20050d14f716a58d3ca3684b5c7f2b55da2a Content-length: 1068 K 15 cvs2svn:cvs-rev V 8 1.33.2.2 PROPS-END SVNJ&Tw8i=*!hB\versionid $Id: using.but,v 1.33.2.2 2004/10/24 13:31:55IGNORE message, SSH special command}\I{No-op, in SSH}IGNORE message \lcont{ Should have no effect. } \b \I{Break, SSH special command}Break \lcont{ Only available in SSH-2, and only during a session. Optional extension; may not be supported by server. PuTTY requests the server's default break length. } \b \I{Signal, SSH special command}Signals (SIGINT, SIGTERM etc) \lcont{ Only available in SSH-2, and only during a session. Sends various POSIX signals. Not honoured by all servers, or \i{line-drawing characters}) are not being displayed correctly in your PuTTY session, it may be that PuTTY is interpreting the characters sent by the server according to the wrong \e{character set}. There are a lot of different character sets available, so it's entirely possible for can select, and other related options. Now all you need is to find out which of them you want! (See \k{config-translation} for more information.) Node-path: putty-branch-0.56/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 4f3514665fe7cceee03aa379706c5140 Text-delta-base-sha1: 8e86a4ee00e7f584bc66e17c8fa688632babd24a Text-content-length: 673 Text-content-md5: 46a84a8e168ae8d99f9c5ce7ebc8e39a Text-content-sha1: 796bc9c19a1e222a9444577fbfb489bc13d7a875 Content-length: 718 K 15 cvs2svn:cvs-rev V 9 1.231.2.3 PROPS-END SVNC^~je|^e/* Actual special commands. Originally Telnet, but some codes have * been re-used for similar specials in other protocols. */, /* 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, TS_SIGTERM, TS_SIGUSR1, TS_SIGUSR2, /* Pseudo-specials used for constructing the specials menu. */ TS_SEP, /* Separator */ TS_SUBMENU, /* Start a new submenu with specified name */ TS_EXITMENU /* Exit current submenu or end of specials */ } Telnet_Special; struct telnet_special { const char *name; Node-path: putty-branch-0.56/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 3e5953e9aae16e00d837bb5ecc72f777 Text-delta-base-sha1: bd408b6c08571ee449452cc8cae508d62bfa5995 Text-content-length: 7621 Text-content-md5: 81af4413f63b668a8338dc9e92821129 Text-content-sha1: 6ccabccf93b1c48747a2681b70530b8c9beb24b3 Content-length: 7666 K 15 cvs2svn:cvs-rev V 9 1.323.2.3 PROPS-END SVNJ1x={l94EZt}AvmbB>{SXunsignedstatic unsigned long ssh_pkt_getuint32(Ssh ssh); static void ssh_pkt_getstring(Ssh ssh, char **p, int *lengt char *buf, *msg; int msglen; ssh_pkt_getstring(ssh, &msg, &msglen); buf = dupprintf("Remote debug message: %.*s", msglen, msg); logevent(buf); sfree(buf); *msg; int msglen; ssh_pkt_getstring(ssh, &msg, &msglen); bombout(("Server sent disconnect message:\n\"%.*s\"", msglen, msg, *msg; int nowlen, reason, msglen; reason = ssh_pkt_getuint32(ssh); ssh_pkt_getstring(ssh, &msg, &msglenmsg*buf, *msg; int msglen; ssh_pkt_getstring(ssh, &msg, &msglen); buf = dupprintf("Remote debug message: %.*s", msglen, msg); logevent(buf); sfree(buf); } goto next_packet;STR, proto, PKT_STR, data, PKT_END); }X11 forwarding refused"); } else { logevent("X11 forwarding enabled"); ssh->X11_fwd_enabled = TRUE; } } { char type; int n; int sport,dport,sserv,dserv; char sports[256], dports[256], saddr[2&V/zw5C)^, cint reply = SSH2_MSG_CHANNEL_FAILURE; /* default */c == ssh->mainchan) { /* * We recognise "exit-status" and "exit-signal" on * the primary channel. */ if (typelen == 11 && !memcmp(type, "exit-status", 11)) { ssh->exitcode = ssh_pkt_getuint32(ssh); logeventf(ssh, "Server sent command exit status %d", ssh->exitcode); reply = SSH2_MSG_CHANNEL_SUCCESS; } else if (typelen == 11 && !memcmp(type, "exit-signal", 11)) { int is_plausible = TRUE, is_int = FALSE; char *fmt_sig = "", *fmt_msg = ""; char *msg; int msglen = 0, core = FALSE; /* ICK: older versions of OpenSSH (e.g. 3.4p1) * provide an `int' for the signal, despite its * having been a `string' in the drafts since at * least 2001. (Fixed in session.c 1.147.) Try to * infer which we can safely parse it as. */ { unsigned char *p = ssh->pktin.body + ssh->pktin.savedpos; long len = ssh->pktin.length - ssh->pktin.savedpos; unsigned long num = GET_32BIT(p); /* what is it? */ /* If it's 0, it hardly matters; assume string */ if (num == 0) { is_int = FALSE; } else { int maybe_int = FALSE, maybe_str = FALSE; #define CHECK_HYPOTHESIS(offset, result) \ do { \ long q = offset; \ if (q >= 0 && q+4 <= len) { \ q = q + 4 + GET_32BIT(p+q); \ if (q >= 0 && q+4 <= len && \ (q = q + 4 + GET_32BIT(p+q)) && q == len) \ result = TRUE; \ } \ } while(0) CHECK_HYPOTHESIS(4+1, maybe_int); CHECK_HYPOTHESIS(4+num+1, maybe_str); #undef CHECK_HYPOTHESIS if (maybe_int && !maybe_str) is_int = TRUE; else if (!maybe_int && maybe_str) is_int = FALSE; else /* Crikey. Either or neither. Panic. */ is_plausible = FALSE; } } if (is_plausible) { if (is_int) { /* Old non-standard OpenSSH. */ int signum = ssh_pkt_getuint32(ssh); fmt_sig = dupprintf(" %d", signum); } else { /* As per the drafts. */ char *sig; int siglen; ssh_pkt_getstring(ssh, &sig, &siglen); /* Signal name isn't supposed to be blank, but * let's cope gracefully if it is. */ if (siglen) { fmt_sig = dupprintf(" \"%.*s\"", siglen, sig); } } core = ssh2_pkt_getbool(ssh); ssh_pkt_getstring(ssh, &msg, &msglen); if (msglen) { fmt_msg = dupprintf(" (\"%.*s\")", msglen, msg); } /* ignore lang tag */ } /* else don't attempt to parse */ logeventf(ssh, "Server exited on signal%s%s%s", fmt_sig, core ? " (core dumped)" : "", fmt_msg); if (*fmt_sig) sfree(fmt_sig); if (*fmt_msg) sfree(fmt_msg); reply = SSH2_MSG_CHANNEL_SUCCESS; reply = SSH2_MSG_CHANNEL_FAILURE; } if (want_reply) { ssh2_pkt_init(ssh, reply); ssh2_pkt_adduint32(ssh, c->remoteid); ssh2_pkt_send(ssh);O$ 8|J|NG*yL-" * however, we could do some handy things with it. For example, we * could make the port forwarding configurer active in the Change * Settings box, and this routine could close down existing * forwardings and open up new ones in response to changes. */ static void ssh_reconfig(void *handle, Config *cfg) { Ssh ssh = (Ssh) handle; ssh->cfg = *cfg; /* STRUCTURE COPY */ } /* * Called to send data down the Telnet connection. */ static int ssh_send(void *handle, char *buf, int len) { Ssh ssh = (Ssh) handle; if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL) return 0; ssh->protocol(ssh, (unsigned char *)buf, len, 0); return ssh_sendbuffer(ssh); } /* * Called to query the current amount of buffered stdin data. */ static int ssh_sendbuffer(void *handle) { Ssh ssh = (Ssh) handle; int override_value; if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL) return 0; /* * If the SSH socket itself has backed up, add the total backup * size on that to any individual buffer on the stdin channel. */ override_value = 0; if (ssh->throttled_all) override_value = ssh->overall_bufsize; if (ssh->version == 1) { return override_value; } else if (ssh->version == 2) { if (!ssh->mainchan || ssh->mainchan->closes > 0) return override_value; else return (override_value + bufchain_size(&ssh->mainchan->v.v2.outbuffer)); } return 0; } /* * Called to set the size of the window from SSH's POV. */ static void ssh_size(void *handle, int width, int height) { Ssh ssh = (Ssh) handle; ssh->term_width = width; ssh->term_height = height; switch (ssh->state) { case SSH_STATE_BEFORE_SIZE: case SSH_STATE_PREPACKET: case SSH_STATE_CLOSED: NULL, TS_SEP}, {"Break", TS_BRK}, /* These are the signal names defined by draft-ietf-secsh-connect-19. * They include all the ISO C signals, but are a subset of the POSIX * required signals. */ {"SIGINT (Interrupt)", TS_SIGINT}, {"SIGTERM (Terminate)", TS_SIGTERM}, {"SIGKILL (Kill)", TS_SIGKILL}, {"SIGQUIT (Quit)", TS_SIGQUIT}, {"SIGHUP (Hangup)", TS_SIGHUP}, {"More signals", TS_SUBMENU}, {"SIGABRT", TS_SIGABRT}, {"SIGALRM", TS_SIGALRM}, {"SIGFPE", TS_SIGFPE}, {"SIGILL", TS_SIGILL}, {"SIGPIPE", TS_SIGPIPE}, {"SIGSEGV", TS_SIGSEGV}, {"SIGUSR1", TS_SIGUSR1}, {"SIGUSR2", TS_SIGUSR2}, {NULL, TS_EXITMENU}TS_EXITMENUIs is a POSIX signal? */ char *signame = NULL; if (code == TS_SIGABRT) signame = "ABRT"; if (code == TS_SIGALRM) signame = "ALRM"; if (code == TS_SIGFPE) signame = "FPE"; if (code == TS_SIGHUP) signame = "HUP"; if (code == TS_SIGILL) signame = "ILL"; if (code == TS_SIGINT) signame = "INT"; if (code == TS_SIGKILL) signame = "KILL"; if (code == TS_SIGPIPE) signame = "PIPE"; if (code == TS_SIGQUIT) signame = "QUIT"; if (code == TS_SIGSEGV) signame = "SEGV"; if (code == TS_SIGTERM) signame = "TERM"; if (code == TS_SIGUSR1) signame = "USR1"; if (code == TS_SIGUSR2) signame = "USR2"; /* The SSH-2 protocol does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */ if (ssh->version == 2 && signal"); ssh2_pkt_addbool(ssh, 0); ssh2_pkt_addstring(ssh, signame); ssh2_pkt_send(ssh); logeventf(ssh, "Sent signal SIG%s", signame); } } else { /* Never heard of it. Do nothing */ } Node-path: putty-branch-0.56/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 423472b348d918165ae2598405cb0a87 Text-delta-base-sha1: 3e0d125469c88ac80b3b56b862eed0eead8b14fc Text-content-length: 3520 Text-content-md5: 83153799abcff7cb341ee9b2ac149ab6 Text-content-sha1: 109487d4819412a1f3fab31baec9df8bbc906c8d Content-length: 3564 K 15 cvs2svn:cvs-rev V 8 1.16.4.1 PROPS-END SVNm3 wI.wN@jGW dfdef ZLIB_STANDALONE /* * This module also makes a handy zlib decoding tool for when * you're picking apart Zip files or PDFs or PNGs. If you compile * it with ZLIB_STANDALONE defined, it builds on its own and * becomes a command-line utility. * * Therefore, here I provide a self-contained implementation of the * macros required from the rest of the PuTTY sources. */ #define snew(type) ( (type *) malloc(sizeof(type)) ) #define snewn(n, type) ( (type *) malloc((n) * sizeof(type)) ) #define sresize(x, n, type) ( (type *) realloc((x), (n) * sizeof(type)) ) #define sfree(x) ( free((x)) ) #else #include "ssh.h" #endif, headersnewn(256, unsigned char); dctx->outsize = 256; /* * The header is stored as a big-endian 16-bit integer, * in contrast to the general little-endian policy in * the rest of the format :-( */ header = (((dctx->bits & 0xFF00) >> 8) | ((dctx->bits & 0x00FF) << 8)); EATBITS(16); /* * Check the header: * * - bits 8-11 should be 1000 (Deflate/RFC1951) * - bits 12-15 should be at most 0111 (window size) * - bit 5 should be zero (no dictionary present) * - we don't care about bits 6-7 (compression rate) * - bits 0-4 should be set up to make the whole thing * a multiple of 31 (checksum). */ if ((header & 0x0F00) != 0x0800 || (header & 0xF000) > 0x7000 || (header & 0x0020) != 0x0000 || (header % 31) != 0) goto decode_error; #ifdef ZLIB_STANDALONE #include #include int main(int argc, char **argv) { unsigned char buf[16], *outbuf; int ret, outlen; void *handle; int noheader = FALSE, opts = TRUE; char *filename = NULL; FILE *fp; while (--argc) { char *p = *++argv; if (p[0] == '-' && opts) { if (!strcmp(p, "-d")) noheader = TRUE; else if (!strcmp(p, "--")) opts = FALSE; /* next thing is filename */ else { fprintf(stderr, "unknown command line option '%s'\n", p); return 1; } } else if (!filename) { filename = p; } else { fprintf(stderr, "can only handle one filename\n"); return 1; } } handle = zlib_decompress_init(); if (noheader) { /* * Provide missing zlib header if -d was specified. */ zlib_decompress_block(handle, "\x78\x9C", 2, &outbuf, &outlen); assert(outlen == 0); } if (filename) fp = fopen(filename, "rb"); else fp = stdin; if (!fp) { assert(filename); fprintf(stderr, "unable to open '%s'\n", filename); return 1; } while (1) { ret = fread(buf, 1, sizeof(buf), fp); if (ret <= 0) break; zlib_decompress_block(handle, buf, ret, &outbuf, &outlen); if (outbuf) { if (outlen) fwrite(outbuf, 1, outlen, stdout); sfree(outbuf); } else { fprintf(stderr, "decoding error\n"); return 1; } } zlib_decompress_cleanup(handle); if (filename) fclose(fp); return 0; } #else #endif Node-path: putty-branch-0.56/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 91268289b80cd6b03995ff3806b574bf Text-delta-base-sha1: da6386eafb645b11ba530b5a6c1c3d95cb8eb844 Text-content-length: 182 Text-content-md5: bdf42d3a4c00d4f987ebc6b29510429f Text-content-sha1: ec27be8fe50cd24dcd6244ea9aff311b5e1f9b3b Content-length: 226 K 15 cvs2svn:cvs-rev V 8 1.71.2.2 PROPS-END SVNf6z{5X(w default: break; /* never heard of it */NULL, TS_SEPNULL, TS_SEP}, {"End Of Record", TS_EOR}, {"End Of File", TS_EOF}, {NULL, TS_EXITMENU Node-path: putty-branch-0.56/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 481307dbdf519473634be3b1bf85807c Text-delta-base-sha1: 38f132a90902be6fdd78c454903a43849191482e Text-content-length: 1027 Text-content-md5: ff3bf0a8f45f40c87d27156932158831 Text-content-sha1: ce375e531f102439fe146e6974b9f756964db171 Content-length: 1072 K 15 cvs2svn:cvs-rev V 9 1.145.2.3 PROPS-END SVN Xup/ P{m/* I believe this disposes of submenus too. */ = inst->specialsmenu; /* A lame "stack" for submenus that will do for now. */ GtkWidget *saved_menu = NULL; int nesting = 1; for (i = 0; nesting > 0; i++) { GtkWidget *menuitem = NULL; switch (specials[i].code) { case TS_SUBMENU: assert (nesting < 2); saved_menu = menu; /* XXX lame stacking */ menu = gtk_menu_new(); menuitem = gtk_menu_item_new_with_label(specials[i].name); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu); gtk_container_add(GTK_CONTAINER(saved_menu), menuitem); gtk_widget_show(menuitem); menuitem = NULL; nesting++; break; case TS_EXITMENU: nesting--; if (nesting) { menu = saved_menu; /* XXX lame stacking */ saved_menu = NULL; } break; case TS_SEP: menuitem = gtk_menu_item_new(); break; default: break; } if (menuitem) { gtk_container_add(GTK_CONTAINER(menu), menuitem); gtk_widget_show(menuitem); } Node-path: putty-branch-0.56/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: cb500f2abe2f3b187725bfc5c34603d4 Text-delta-base-sha1: 3646beb25de53655a7a82578e1828cc0f064169c Text-content-length: 1856 Text-content-md5: 5a9b50c13a93da98c991963a36a5328a Text-content-sha1: 3f001a016af984724ed11e0942ff8da057369be0 Content-length: 1901 K 15 cvs2svn:cvs-rev V 9 1.270.2.3 PROPS-END SVN6aX gSoun@lVj.)!xtstatic int n_/* We can't use Windows to provide a stack for submenus, so * here's a lame "stack" that will do for now. */ HMENU saved_menu = NULL; int nesting = 1; p = CreatePopupMenu(); for (i = 0; nesting > 0; i++) { assert(IDM_SPECIAL_MIN + 0x10 * i < IDM_SPECIAL_MAX); switch (specials[i].code) { case TS_SEP: AppendMenu(p, MF_SEPARATOR, 0, 0); break; case TS_SUBMENU: assert(nesting < 2); nesting++; saved_menu = p; /* XXX lame stacking */ p = CreatePopupMenu(); AppendMenu(saved_menu, MF_POPUP | MF_ENABLED, (UINT) p, specials[i].name); break; case TS_EXITMENU: nesting--; if (nesting) { p = saved_menu; /* XXX lame stacking */ saved_menu = NULL; } break; default: break; } } /* Squirrel the highest special. */ n_specials = i - 1; } else { p = NULL; n_specials = 0; } for (j = 0; j < lenof(popup_menus); j++) { if (menu_already_exists) { /* XXX does this free up all submenus? */if (i >= n_specials) break; if (back) back->special(backhandle, specials[i].code); net_pending_errors();v}var *) p, "\x1B%c", code + 'P' - 11 - offt); else p += sprintf((char *) p, "\x1BO%c", code + 'P' - 11 - offt); return p - output; } if (cfg.funky_type == FUNKY_LINUX && code >= 11 && code <= 15) { p += sprintf((char *) p, "\x1B[[%c", code + 'A' - 11); return p - output; } if (cfg.funky_type == FUNKY_XTERM && code >= 11 && code <= 14) { if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", code + 'P' - 11); else p += sprintf((char *) p, "\x1BO%c", code + 'P' - 11); return p - output; } if (cfg.rxvt_homeend && (code == 1 || code == 4)) { p += sprintf((char *) p, code == 1 ? "\x1B[H" Revision-number: 4675 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2004-10-24T13:37:32.000000Z K 7 svn:log V 110 Back out Arabic on the 0.56 branch (patch precisely duplicated from the backing-out diff on the 0.55 branch). K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.56/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: d0585032ab0b494d27cf51197a714437 Text-delta-base-sha1: eff003e8fc311ec92b07e0bbf7a50b838e0e5471 Text-content-length: 363 Text-content-md5: 48346930a40e70b53d7fbbc9d65e437c Text-content-sha1: 6a08bb133d048da5820a6014f5a6b6615d4d7505 Content-length: 407 K 15 cvs2svn:cvs-rev V 8 1.59.2.1 PROPS-END SVN p S+Sr.GUI front end and terminal emulator (putty, puttytel). GUITERM = window windlg winctrls terminal sizetip wcwidth unicode ldiscucs + logging printing winutils dialog config wincfg tree234 # Same thing on Unix. UXTERM = pterm config uxcfg dialog gtkdlg gtkcols gtkpanel tree234 + terminal wcwidth uxucs ldiscucs logging Node-path: putty-branch-0.56/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: c01c59889ffa28d12a3be2aad9c2fd9e Text-delta-base-sha1: aea72715e83b1bed7984cc1b11258bfcb324714e Text-content-length: 25 Text-content-md5: 2f39ff609fbcc237714d1d2501605d4b Text-content-sha1: 4df1c8a73cb8140b6d85ef66319807ce3aacd8b2 Content-length: 69 K 15 cvs2svn:cvs-rev V 8 1.37.2.3 PROPS-END SVN U 7S Node-path: putty-branch-0.56/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: d787420262c227745e8da2c56a139857 Text-delta-base-sha1: a0ec81b51c4ec02c7603602e923524c9d19f7f05 Text-content-length: 83 Text-content-md5: 92b4e04a862f9043ee1968d7572ea1dd Text-content-sha1: 53fbfa5f20e2a527057382e09bbb38ec4e01aef7 Content-length: 127 K 15 cvs2svn:cvs-rev V 8 1.92.2.4 PROPS-END SVNG 9W9zM\versionid $Id: config.but,v 1.92.2.4 2004/10/24 13:37:32 Node-path: putty-branch-0.56/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 293b6d695ac816e2c14c206d28bb9840 Text-delta-base-sha1: 73ed6f7b79499f802c5f4481959101d35bec0db8 Text-content-length: 146 Text-content-md5: 2aa516b69f2f8c865aae0086f186e0e2 Text-content-sha1: 019955be0f85b6dd8ec647bb69a4275a99336513 Content-length: 190 K 15 cvs2svn:cvs-rev V 8 1.31.4.1 PROPS-END SVN ;#dNZsu; e)r return 4; /* for hex XY (c >= 160 && !in_utf(ldisc->term) one char and output one BSB Node-path: putty-branch-0.56/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 46a84a8e168ae8d99f9c5ce7ebc8e39a Text-delta-base-sha1: 796bc9c19a1e222a9444577fbfb489bc13d7a875 Text-content-length: 28 Text-content-md5: 702c6aca8f454129848afb0b76d44f4d Text-content-sha1: 9ed794947b4f383481c63d2fa45614ab500a2750 Content-length: 73 K 15 cvs2svn:cvs-rev V 9 1.231.2.4 PROPS-END SVN^Ycs[ Node-path: putty-branch-0.56/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 7b2aa13b2a933cdef8648d262f755421 Text-delta-base-sha1: e5c64bee9b21e1f2268e3cf39652b229c63736f5 Text-content-length: 39 Text-content-md5: 3bcdc4dc229117aecd70e2a9981c1814 Text-content-sha1: 3cf4910f8b4cd772e47a5bacf5fdefd52402ae30 Content-length: 84 K 15 cvs2svn:cvs-rev V 9 1.120.2.3 PROPS-END SVN*2]_xetQdF Node-path: putty-branch-0.56/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: df849327f062eda9dda6fefa86d39631 Text-delta-base-sha1: 0ee2cbdf6b1f040b0dd8c69b3875376eb5064a7b Text-content-length: 3845 Text-content-md5: 4fa838ccc1879735d0633c7aa77b2e50 Text-content-sha1: 0afb2f706a2c3f9b96dffec4d3edd729f885e6b2 Content-length: 3890 K 15 cvs2svn:cvs-rev V 9 1.167.2.2 PROPS-END SVN.8t$3jxwmOlN$(v 6 for (j = 0; j < term->cols; j++, idx++) { unsigned long tattr, tchar; unsigned long *d = ldata + j; int break_run; scrpos.x = j; tchar = (*d & (CHAR_MASK | CSET_MASK)); tattr = (*d & (ATTR_MASK ^ CSET_MASK)); switch (tchar & CSET_MASK) { case ATTR_ASCII: tchar = term->ucsdata->unitab_line[tchar & 0xFF]; break; case ATTR_LINEDRW: tchar = term->ucsdata->unitab_xterm[tchar & 0xFF]; break; case ATTR_SCOACS: tchar = term->ucsdata->unitab_scoacs[tchar&0xFF]; break; } tattr |= (tchar & CSET_MASK); tchar &= CHAR_MASK; if (j < term->cols-1 && (d[1] & (CHAR_MASK | CSET_MASK)) == UCSWIDE) tattr |= ATTR_WIDE; /* Video reversing things */ if (term->selstate == DRAGGING || term->selstate == SELECTED) { if (term->seltype == LEXICOGRAPHIC) selected = (posle(term->selstart, scrpos) && poslt(scrpos, term->selend)); else selected = (posPle(term->selstart, scrpos) && posPlt(scrpos, term->selend)); } else selected = FALSE; tattr = (tattr ^ rv ^ (selected ? ATTR_REVERSE : 0)); /* 'Real' blinking ? */ if (term->blink_is_real && (tattr & ATTR_BLINK)) { if (term->has_focus && term->tblinker) { tchar = term->ucsdata->unitab_line[(unsigned char)' ']; } tattr &= ~ATTR_BLINK; } /* * Check the font we'll _probably_ be using to see if * the character is wide when we don't want it to be. */ if ((tchar | tattr) != (term->disptext[idx]& ~ATTR_NARROW)) { if ((tattr & ATTR_WIDE) == 0 && char_width(ctx, (tchar | tattr) & 0xFFFF) == 2) tattr |= ATTR_NARROW; } else if (term->disptext[idx]&ATTR_NARROW) tattr |= ATTR_NARROW; /* Cursor here ? Save the 'background' */ if (i == our_curs_y && j == our_curs_x) { cursor_background = tattr | tchar; term->dispcurs = term->disptext + idx; } if ((term->disptext[idx] ^ tattr) & ATTR_WIDE) dirty_line = TRUE; break_run = (((tattr ^ attr) & term->attr_mask) || j - start >= sizeof(ch)); /* Special hack for VT100 Linedraw glyphs */ if ((attr & CSET_MASK) == 0x2300 && tchar >= 0xBA && tchar <= 0xBD) break_run = TRUE; if (!term->ucsdata->dbcs_screenfont && !dirty_line) { if ((tchar | tattr) == term->disptext[idx]) break_run = TRUE; else if (!dirty_run && ccount == 1) break_run = TRUE; } if (break_run) { if ((dirty_run || last_run_dirty) && ccount > 0) { do_text(ctx, start, i, ch, ccount, attr, lattr); updated_line = 1; } start = j; ccount = 0; attr = tattr; if (term->ucsdata->dbcs_screenfont) last_run_dirty = dirty_run; dirty_run = dirty_line; } if ((tchar | tattr) != term->disptext[idx]) dirty_run = TRUE; ch[ccount++] = (char) tchar; term->disptext[idx] = tchar | tattr; /* If it's a wide char step along to the next one. */ if (tattr & ATTR_WIDE) { if (++j < term->cols) { idx++; d++; /* * By construction above, the cursor should not * be on the right-hand half of this character. * Ever. */ assert(!(i == our_curs_y && j == our_curs_x)); if (term->disptext[idx] != *d) dirty_run = TRUE; term->disptext[idx] = *d; } } } if (dirty_run && ccount > 0) { do_text(ctx, start, i, ch, ccount, attr, lattr); updated_line = 1; } /* Cursor on this line ? (and changed) */ if (i == our_curs_y && (term->curstype != cursor || updated_line)) { ch[0] = (char) (cursor_background & CHAR_MASK); attr = (cursor_background & ATTR_MASK) | cursor; do_cursor(ctx, our_curs_x, i, ch, 1, attr, lattr); term->curstype = cursor; } } } /* * Flick the switcMJJ Node-path: putty-branch-0.56/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 9b0846c53744486827e86b9bb2593a5b Text-delta-base-sha1: 75eb85411492633cce991d0fa2415182d06f9593 Text-content-length: 19 Text-content-md5: 9929db90221cebfe5628262a0cec1b4f Text-content-sha1: 1c03c19c4e9f9481a42cf17f2e59c8b7d6f7fec7 Content-length: 63 K 15 cvs2svn:cvs-rev V 8 1.15.4.1 PROPS-END SVN .TZ/ Node-path: putty-branch-0.56/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 45 Text-delta: true Text-delta-base-md5: 5a9b50c13a93da98c991963a36a5328a Text-delta-base-sha1: 3f001a016af984724ed11e0942ff8da057369be0 Text-content-length: 1222 Text-content-md5: 3c9c19186cd5ee23a687a62f2320547f Text-content-sha1: 47f0b1b49f84d52a50805e2a491079d334cf2abf Content-length: 1267 K 15 cvs2svn:cvs-rev V 9 1.270.2.4 PROPS-END SVN#Dv ;Sx@@c /* And the shadow bold hack. */ar *) p, "\x1B%c", code + 'P' - 11 - offt); else p += sprintf((char *) p, "\x1BO%c", code + 'P' - 11 - offt); return p - output; } if (cfg.funky_type == FUNKY_LINUX && code >= 11 && code <= 15) { p += sprintf((char *) p, "\x1B[[%c", code + 'A' - 11); return p - output; } if (cfg.funky_type == FUNKY_XTERM && code >= 11 && code <= 14) { if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", code + 'P' - 11); else p += sprintf((char *) p, "\x1BO%c", code + 'P' - 11); return p - output; } if (cfg.rxvt_homeend && (code == 1 || code == 4)) { p += sprintf((char *) p, code == 1 ? "\x1B[H" : "\x1BOw"); return p - output; } if (code) { p += sprintf((char *) p, "\x1B[%d~", code); return p - output; } /* * Now the remaining keys (arrows and Keypad 5. Keypad 5 for * some reason seems to send VK_CLEAR to Windows...). */ { char xkey = 0; switch (wParam) { case VK_UP: xkey = 'A'; break; case VK_DOWN: xkey = 'B'; break; case VK_RIGHT: xkey = 'C'; break; case VK_LEFT: xkey = 'D'; break;}c Node-path: putty-branch-0.56/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: ef1ba584b560c42d5be6fc2f2142c893 Text-delta-base-sha1: 9b1941d653a91a86f7513b05d5d2b343426b55c9 Text-content-length: 20 Text-content-md5: 853cd26e6434fe2c9101bfce8c053b2c Text-content-sha1: 0e841d9d41b1b36f016958257ad0398a166d2de6 Content-length: 63 K 15 cvs2svn:cvs-rev V 7 1.8.2.2 PROPS-END SVN5? & Node-path: putty-branch-0.56/minibidi.c Node-action: delete Node-path: putty-branch-0.56/minibidi.h Node-action: delete Revision-number: 4676 Prop-content-length: 144 Content-length: 144 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-10-24T13:43:52.000000Z K 7 svn:log V 44 Bump the version number on the 0.56 branch. PROPS-END Node-path: putty-branch-0.56/LATEST.VER Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: d9a651af38c10465843449c77e105edf Text-delta-base-sha1: fbda8b60944f7ee0866ae08d88d1695eae32702c Text-content-length: 15 Text-content-md5: 0354dac1614437ebfd65cec07b74744d Text-content-sha1: 0532c7f82a1931f3f7aab776bab10618ec3e2e2e Content-length: 58 K 15 cvs2svn:cvs-rev V 7 1.4.2.1 PROPS-END SVN0.56 Node-path: putty-branch-0.56/mac/version.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: bca53e18158f16883cd6187ebac87a9c Text-delta-base-sha1: 669b6633c1ba2ad5bed74efb5ecad88a3f89ac58 Text-content-length: 20 Text-content-md5: 2e35d53531e93ba7e6893dd47c92b579 Text-content-sha1: 60a014e521df37f0755f408abd82ac3cce53f718 Content-length: 63 K 15 cvs2svn:cvs-rev V 7 1.3.2.1 PROPS-END SVN77mIn6 Node-path: putty-branch-0.56/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: d3bf60bac6ee0eee7ae4a95b6b5fe8a6 Text-delta-base-sha1: ebf64193022643a13db481659db3cf1b8f30664e Text-content-length: 22 Text-content-md5: 7f049844d1355bac2febd62e3867a572 Text-content-sha1: 0fef9ff10c0a5c5d01f10498fc55b32b4663264c Content-length: 65 K 15 cvs2svn:cvs-rev V 7 1.4.2.1 PROPS-END SVN X;Y6 Revision-number: 4677 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2004-10-24T13:50:09.000000Z K 7 svn:log V 48 Put "release 0.56" in usage messages on branch. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.56/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 3550be143d48d5b6322f39d33109ca8d Text-delta-base-sha1: 1d39d79bd4b8c6754c0048efbc188f1dbbc14525 Text-content-length: 86 Text-content-md5: 880fc314dfcdf5e4ad3fa0252466a614 Text-content-sha1: 31f37aecebab3e33b27271635c0c0d67e9bd6530 Content-length: 130 K 15 cvs2svn:cvs-rev V 8 1.25.2.2 PROPS-END SVNbb @T>N\versionid $Id: plink.but,v 1.25.2.2 2004/10/24 13:50:09 jacob56 Node-path: putty-branch-0.56/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 7a3180b37ac7d10c727f33e9154a625e Text-delta-base-sha1: e67bbc6cc38606d91b1d1d3856abc52d0a96d07c Text-content-length: 79 Text-content-md5: 1ee033a49c4e0ce121f01d6bb5f6837b Text-content-sha1: 5fc37b55adaafe7dbea28ee9981f557cc3b6fb34 Content-length: 123 K 15 cvs2svn:cvs-rev V 8 1.29.2.1 PROPS-END SVN8< 9G3<|\versionid $Id: pscp.but,v 1.29.2.1 2004/10/24 13:50:0956 Revision-number: 4678 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2004-10-24T15:41:44.000000Z K 7 svn:log V 28 Mention PSFTP on title page K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: b44156a5a863db0702eb945cac588670 Text-delta-base-sha1: 73ea665782773bf87605bd3d98f17fe47be44010 Text-content-length: 59 Text-content-md5: 39d71fe3b75f8484313a5b7028123bfe Text-content-sha1: 7529e0d1b2e7b080bfb24ed71c7138c3e1d7ad56 Content-length: 99 K 15 cvs2svn:cvs-rev V 4 1.12 PROPS-END SVNgn %L}HSFT2 2004/10/24 15:41:44 jacob Exp $ Revision-number: 4679 Prop-content-length: 438 Content-length: 438 K 8 svn:date V 27 2004-10-24T15:58:31.000000Z K 7 svn:log V 337 Differences between protocols: remove the entire paragraph about environment variables. It was no longer true (given that we support them in SSH-2 now), and the new situation was probably too complex to explain in an introductory chapter. And the utility of setting them seems to be marginal these days given the lack of server support. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: cdf635e6fdbb3178c685d6dc61747e23 Text-delta-base-sha1: 59577871b45f5ab60a9addc931214af3a9bb9c09 Text-content-length: 72 Text-content-md5: dbe70bf5b27f7d86204516bd564409b1 Text-content-sha1: 8ac5f032821efa96bf026d0323d0eb3bab9a31ed Content-length: 111 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVNG 3 3Ox\versionid $Id: intro.but,v 1.7 2004/10/24 15:58:31 Revision-number: 4680 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2004-10-24T16:02:14.000000Z K 7 svn:log V 113 cvs up -j1.6 -j1.7 intro.but [svn merge -r4678:4679] Remove now-incorrect paragraph about environment variables. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.56/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: cdf635e6fdbb3178c685d6dc61747e23 Text-delta-base-sha1: 59577871b45f5ab60a9addc931214af3a9bb9c09 Text-content-length: 76 Text-content-md5: bc8d043862f3e2d3d539c529d6d3727e Text-content-sha1: 00495edebf7ac66ca9ca5c869f113296870e89ad Content-length: 119 K 15 cvs2svn:cvs-rev V 7 1.6.4.1 PROPS-END SVNG 7 3Ox\versionid $Id: intro.but,v 1.6.4.1 2004/10/24 16:02:14 Revision-number: 4681 Prop-content-length: 305 Content-length: 305 K 8 svn:date V 27 2004-10-24T16:24:58.000000Z K 7 svn:log V 204 Freshness tweaks: - soften language around changing-username-during-login section; with SSH-2 this is a misfeature of implementations rather than the protocol itself - tweak new-host-key dialog text K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: db80c7c4955639fe33df0cdf293051bc Text-delta-base-sha1: 5e86f4a377dc413d65ae0ba924c0a567cc74030a Text-content-length: 234 Text-content-md5: 49c997a3957f832f72772a8e6dc7fea4 Text-content-sha1: 9a421b991d986559224b6b6578e08d9d29005fb7 Content-length: 273 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVNU3Kb0jk\versionid $Id: gs.but,v 1.9 2004/10/24 16:24:58rsa2; many SSH servers do not permit you to make two login attempts using \i{different usernames}. If you type your username wrongly, you must close PuTTY Revision-number: 4682 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2004-10-24T16:25:34.000000Z K 7 svn:log V 79 cvs up -j1.8 -j1.9 gs.but [svn merge -r4680:4681] Freshness tweaks from trunk. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.56/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: db80c7c4955639fe33df0cdf293051bc Text-delta-base-sha1: 5e86f4a377dc413d65ae0ba924c0a567cc74030a Text-content-length: 238 Text-content-md5: 3812dcfeb291246ee80df75014d609dd Text-content-sha1: 115ab3a5ee907262778b0986400c36fa6dd08fd8 Content-length: 281 K 15 cvs2svn:cvs-rev V 7 1.8.2.1 PROPS-END SVNU7Ob0jk\versionid $Id: gs.but,v 1.8.2.1 2004/10/24 16:25:34rsa2; many SSH servers do not permit you to make two login attempts using \i{different usernames}. If you type your username wrongly, you must close PuTTY Revision-number: 4683 Prop-content-length: 183 Content-length: 183 K 8 svn:date V 27 2004-10-24T16:26:20.000000Z K 7 svn:log V 83 cvs up -j1.11 -j1.12 blurb.but [svn merge -r4677:4678] Mention PSFTP on title page K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.56/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: b44156a5a863db0702eb945cac588670 Text-delta-base-sha1: 73ea665782773bf87605bd3d98f17fe47be44010 Text-content-length: 62 Text-content-md5: 96719aeea902d93b522d134cb78272dc Text-content-sha1: fd61289de129b504c9d0f7832374148ec41c95bd Content-length: 106 K 15 cvs2svn:cvs-rev V 8 1.11.2.1 PROPS-END SVNgr (L~HSFT.2.1 2004/10/24 16:26:20 jacob Exp $ Revision-number: 4684 Prop-content-length: 192 Content-length: 192 K 8 svn:date V 27 2004-10-24T16:48:43.000000Z K 7 svn:log V 92 Freshness tweaks: - mention `Restart Session' - tweak language of `-N' (plural->singular) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3980c599924c474ee62b0dd9922edeb7 Text-delta-base-sha1: 3b426557057af6091d64da8ccd14b8a67f538bf1 Text-content-length: 395 Text-content-md5: 905b1322cba62f6132777fdb16d15cb0 Text-content-sha1: 220799079c894a645e8ad0e621d6245ef44ae210 Content-length: 435 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVN"2d40ufY@k7\versionid $Id: using.but,v 1.37 2004/10/24 16:48:43in a new window with precisely the same options as your current one - connecting to the same host using the same protocol, with all the same terminal settings and everything. \b In an inactive window, selecting \i{\q{Restart Session}} will do the same as \q{Duplicate Session}, but in the current window Revision-number: 4685 Prop-content-length: 184 Content-length: 184 K 7 svn:log V 84 cvs up -j1.36 -j1.37 using.but [svn merge -r4683:4684] Freshness tweaks from trunk. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-24T16:50:16.000000Z PROPS-END Node-path: putty-branch-0.56/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 7eaeb68d349a83c3354e70370a42c192 Text-delta-base-sha1: df3d20050d14f716a58d3ca3684b5c7f2b55da2a Text-content-length: 418 Text-content-md5: e54b7475c74604860312302ae12a0f27 Text-content-sha1: 05cd6920f2a4eb5ff36589443d7b68de5076d4c7 Content-length: 462 K 15 cvs2svn:cvs-rev V 8 1.33.2.3 PROPS-END SVN&6z>0ujM6k;\versionid $Id: using.but,v 1.33.2.3 2004/10/24 16:50:16 jacobin a new window with precisely the same options as your current one - connecting to the same host using the same protocol, with all the same terminal settings and everything. \b In an inactive window, selecting \i{\q{Restart Session}} will do the same as \q{Duplicate Session}, but in the current windowis option is Revision-number: 4686 Prop-content-length: 557 Content-length: 557 K 8 svn:date V 27 2004-10-24T18:26:00.000000Z K 7 svn:log V 456 Random tweaks: - change click-by-click advice on modifying saved sessions - add `Restart Session' as another reason you might not want to close the window on exit; other tweaks to this language - mention Shift-Backspace action - the window resizing configuration documentation was completely out of date; rewrite - add a note about Default Bold Background since it's caused confusion - "remote terminal" -> "remote system" in terminal-type doc K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6e9a5feb74882b8c42cd07f12838660f Text-delta-base-sha1: 68c40b1ed6c35355d1237d2d4559ce93e4986524 Text-content-length: 1672 Text-content-md5: 206a0a589c40a32f49c0df8e4e21ad35 Text-content-sha1: 4e9c206efe45181538931b614f238fe28f4068c2 Content-length: 1712 K 15 cvs2svn:cvs-rev V 4 1.96 PROPS-END SVNC(?;'4qUp3]N}j6I@?$0@Kx\versionid $Id: config.but,v 1.96 2004/10/24 18:26:0 and press the \q{Save} button. The new settings will be saved over the top of the old ones \lcont{ To save the new settings under a different name, you can enter the new name in the \q{Saved Sessions} box, or single-click to select a session name in the list box to overwrite that session. To save \q{Default Settings}, you must single-click the name before saving. }or restart the session, you should arrange for this , but \I{inactive window}inactive). The third setting, and the default one, is \q{Only on clean exit}. In this mode, a session which terminates normally will cause its window to close, but one which is aborted unexpectedly by network trouble or a confusing message from (Typing \i{Shift-Backspace} will cause PuTTY to send whichever code isn't configured here as the default.) using its window furniture. There are four options here: \b \q{Change the number of rows and columns}: the font size will not change. (This is the default.) \b \q{Change the size of the font}: the number of rows and columns in the terminal will stay the same, and the font size will change. \b \q{Change font size when maximised}: when the window is resized, the number of rows and columns will change, \e{except} when the window is maximised (or restored), when the font size will change. \b \q{Forbid resizing completely}: the terminal will refuse to be resized at all (Note that \q{Default Bold Background} is \e{not} the background colour used for bold text; it is only used if the server specifically asks for a bold background.)system Revision-number: 4687 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2004-10-24T18:28:04.000000Z K 7 svn:log V 76 cvs up -j1.95 -j1.96 config.but [svn merge -r4685:4686] Updates from trunk. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.56/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 92b4e04a862f9043ee1968d7572ea1dd Text-delta-base-sha1: 53fbfa5f20e2a527057382e09bbb38ec4e01aef7 Text-content-length: 1682 Text-content-md5: c96bd048c4238510e8b6d4275c40cae2 Text-content-sha1: 62d486a9e23fcf513d392451352ee132dbc30961 Content-length: 1726 K 15 cvs2svn:cvs-rev V 8 1.92.2.5 PROPS-END SVN o>F ?qUt3aNjyM@?H$0K?\versionid $Id: config.but,v 1.92.2.5 2004/10/24 18:28:04 jacob and press the \q{Save} button. The new settings will be saved over the top of the old ones \lcont{ To save the new settings under a different name, you can enter the new name in the \q{Saved Sessions} box, or single-click to select a session name in the list box to overwrite that session. To save \q{Default Settings}, you must single-click the name before saving. }or restart the session, you should arrange for this , but \I{inactive window}inactive). The third setting, and the default one, is \q{Only on clean exit}. In this mode, a session which terminates normally will cause its window to close, but one which is aborted unexpectedly by network trouble or a confusing message from (Typing \i{Shift-Backspace} will cause PuTTY to send whichever code isn't configured here as the default.) using its window furniture. There are four options here: \b \q{Change the number of rows and columns}: the font size will not change. (This is the default.) \b \q{Change the size of the font}: the number of rows and columns in the terminal will stay the same, and the font size will change. \b \q{Change font size when maximised}: when the window is resized, the number of rows and columns will change, \e{except} when the window is maximised (or restored), when the font size will change. \b \q{Forbid resizing completely}: the terminal will refuse to be resized at all (Note that \q{Default Bold Background} is \e{not} the background colour used for bold text; it is only used if the server specifically asks for a bold background.)system Revision-number: 4688 Prop-content-length: 112 Content-length: 112 K 8 svn:date V 27 2004-10-24T18:30:10.000000Z K 7 svn:log V 12 Mention -i. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: e61b09cec9cff2a8c0ebf989837c35ea Text-delta-base-sha1: df4197b162056650a2a7ec79c79b5b2314aaf022 Text-content-length: 237 Text-content-md5: 31478dfadea8991034cb53d215901a63 Text-content-sha1: a7f59ac29a0c72d30f2ec7c0bfedb76e8f21069d Content-length: 276 K 15 cvs2svn:cvs-rev V 3 1.7 PROPS-END SVN+LH3}\versionid $Id: psftp.but,v 1.7 2004/10/24 18:30:10hreeyou can supply the name of a private key file on the command line, with the \c{-i} option. See \k{using-cmdline-identity} for more information. Thir Revision-number: 4689 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2004-10-24T18:30:31.000000Z K 7 svn:log V 64 cvs up -j1.6 -j1.7 psftp.but [svn merge -r4687:4688] Mention -i K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.56/doc/psftp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 43 Text-delta: true Text-delta-base-md5: e61b09cec9cff2a8c0ebf989837c35ea Text-delta-base-sha1: df4197b162056650a2a7ec79c79b5b2314aaf022 Text-content-length: 241 Text-content-md5: cfa100036466214f84fb7551f947632d Text-content-sha1: cd5dcaa01fd28671de42bb377bfa806b1d728be0 Content-length: 284 K 15 cvs2svn:cvs-rev V 7 1.6.2.1 PROPS-END SVN/PH3}\versionid $Id: psftp.but,v 1.6.2.1 2004/10/24 18:30:31hreeyou can supply the name of a private key file on the command line, with the \c{-i} option. See \k{using-cmdline-identity} for more information. Thir Revision-number: 4690 Prop-content-length: 401 Content-length: 401 K 8 svn:date V 27 2004-10-24T22:57:36.000000Z K 7 svn:log V 300 Add a note about documentation of the Unix port (i.e., we don't, specifically). This is mainly intended to make the documentation suitable for including in distributions such as the Debian package, but won't be amiss on the web site docs. It will look a bit out of place in the .HLP, but never mind. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 39d71fe3b75f8484313a5b7028123bfe Text-delta-base-sha1: 7529e0d1b2e7b080bfb24ed71c7138c3e1d7ad56 Text-content-length: 617 Text-content-md5: 4cf206cc65e9dfde91db0447dad5b83b Text-content-sha1: e056009a19a93d718e169ebd34af40435221a4a9 Content-length: 657 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVNnu PF._mPuTTY is a free (MIT-licensed) Win32 Telnet and SSH client. This manual documents PuTTY, and its companion utilities PSCP, PSFTP, Plink, Pageant and PuTTYgen. \e{Note to Unix users:} this manual currently primarily documents the Windows versions of the PuTTY utilities. Some options are therefore mentioned that are absent from the Unix version; the Unix version has features not described here; and the \cw{pterm} and command-line \cw{puttygen} utilities are not described at all. The only Unix-specific documentation that currently exists is the man pages3 2004/10/24 22:57:36 jacob Exp $ Revision-number: 4691 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2004-10-24T22:58:17.000000Z K 7 svn:log V 75 cvs up -j1.12 -j1.13 blurb.but [svn merge -r4689:4690] Note to Unix users. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-branch-0.56/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 44 Text-delta: true Text-delta-base-md5: 96719aeea902d93b522d134cb78272dc Text-delta-base-sha1: fd61289de129b504c9d0f7832374148ec41c95bd Text-content-length: 617 Text-content-md5: d1d33d79f0a53d7cf6698728cd0eec73 Text-content-sha1: c83503bcfec91617633ec6b87402c6c072d28771 Content-length: 661 K 15 cvs2svn:cvs-rev V 8 1.11.2.2 PROPS-END SVNry PF.cmPuTTY is a free (MIT-licensed) Win32 Telnet and SSH client. This manual documents PuTTY, and its companion utilities PSCP, PSFTP, Plink, Pageant and PuTTYgen. \e{Note to Unix users:} this manual currently primarily documents the Windows versions of the PuTTY utilities. Some options are therefore mentioned that are absent from the Unix version; the Unix version has features not described here; and the \cw{pterm} and command-line \cw{puttygen} utilities are not described at all. The only Unix-specific documentation that currently exists is the man pages2 2004/10/24 22:58:17 jacob Exp $ Revision-number: 4692 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 66 This commit was manufactured by cvs2svn to create tag 'beta-0-56'. K 10 svn:author V 7 cvs2svn K 8 svn:date V 27 2004-10-24T22:58:17.000000Z PROPS-END Node-path: putty-0.56 Node-kind: dir Node-action: add Node-copyfrom-rev: 4607 Node-copyfrom-path: putty Node-path: putty-0.56/LATEST.VER Node-kind: file Node-action: delete Node-path: putty-0.56/LATEST.VER Node-kind: file Node-action: add Node-copyfrom-rev: 4676 Node-copyfrom-path: putty-branch-0.56/LATEST.VER Text-copy-source-md5: 0354dac1614437ebfd65cec07b74744d Text-copy-source-sha1: 0532c7f82a1931f3f7aab776bab10618ec3e2e2e Node-path: putty-0.56/Recipe Node-kind: file Node-action: delete Node-path: putty-0.56/Recipe Node-kind: file Node-action: add Node-copyfrom-rev: 4675 Node-copyfrom-path: putty-branch-0.56/Recipe Text-copy-source-md5: 48346930a40e70b53d7fbbc9d65e437c Text-copy-source-sha1: 6a08bb133d048da5820a6014f5a6b6615d4d7505 Node-path: putty-0.56/cmdline.c Node-kind: file Node-action: delete Node-path: putty-0.56/cmdline.c Node-kind: file Node-action: add Node-copyfrom-rev: 4672 Node-copyfrom-path: putty-branch-0.56/cmdline.c Text-copy-source-md5: d65d65fd3204bf0de61fc84edfe9eef9 Text-copy-source-sha1: b599c3fc4a8e2f0ef2f8e61726228304abe58b78 Node-path: putty-0.56/config.c Node-kind: file Node-action: delete Node-path: putty-0.56/config.c Node-kind: file Node-action: add Node-copyfrom-rev: 4675 Node-copyfrom-path: putty-branch-0.56/config.c Text-copy-source-md5: 2f39ff609fbcc237714d1d2501605d4b Text-copy-source-sha1: 4df1c8a73cb8140b6d85ef66319807ce3aacd8b2 Node-path: putty-0.56/doc/blurb.but Node-kind: file Node-action: delete Node-path: putty-0.56/doc/blurb.but Node-kind: file Node-action: add Node-copyfrom-rev: 4691 Node-copyfrom-path: putty-branch-0.56/doc/blurb.but Text-copy-source-md5: d1d33d79f0a53d7cf6698728cd0eec73 Text-copy-source-sha1: c83503bcfec91617633ec6b87402c6c072d28771 Node-path: putty-0.56/doc/config.but Node-kind: file Node-action: delete Node-path: putty-0.56/doc/config.but Node-kind: file Node-action: add Node-copyfrom-rev: 4687 Node-copyfrom-path: putty-branch-0.56/doc/config.but Text-copy-source-md5: c96bd048c4238510e8b6d4275c40cae2 Text-copy-source-sha1: 62d486a9e23fcf513d392451352ee132dbc30961 Node-path: putty-0.56/doc/gs.but Node-kind: file Node-action: delete Node-path: putty-0.56/doc/gs.but Node-kind: file Node-action: add Node-copyfrom-rev: 4682 Node-copyfrom-path: putty-branch-0.56/doc/gs.but Text-copy-source-md5: 3812dcfeb291246ee80df75014d609dd Text-copy-source-sha1: 115ab3a5ee907262778b0986400c36fa6dd08fd8 Node-path: putty-0.56/doc/index.but Node-kind: file Node-action: delete Node-path: putty-0.56/doc/index.but Node-kind: file Node-action: add Node-copyfrom-rev: 4672 Node-copyfrom-path: putty-branch-0.56/doc/index.but Text-copy-source-md5: 09605c301a4958b1a588687051ce52de Text-copy-source-sha1: 1bb337b2917869efd13d5f6fe83128365e743134 Node-path: putty-0.56/doc/intro.but Node-kind: file Node-action: delete Node-path: putty-0.56/doc/intro.but Node-kind: file Node-action: add Node-copyfrom-rev: 4680 Node-copyfrom-path: putty-branch-0.56/doc/intro.but Text-copy-source-md5: bc8d043862f3e2d3d539c529d6d3727e Text-copy-source-sha1: 00495edebf7ac66ca9ca5c869f113296870e89ad Node-path: putty-0.56/doc/man-pl.but Node-kind: file Node-action: delete Node-path: putty-0.56/doc/man-pl.but Node-kind: file Node-action: add Node-copyfrom-rev: 4673 Node-copyfrom-path: putty-branch-0.56/doc/man-pl.but Text-copy-source-md5: 411888d2cdff62e0e4a6f6df8e115195 Text-copy-source-sha1: 38a5bf729d1b307c3c14f8b569198a72bfbe7442 Node-path: putty-0.56/doc/plink.but Node-kind: file Node-action: delete Node-path: putty-0.56/doc/plink.but Node-kind: file Node-action: add Node-copyfrom-rev: 4677 Node-copyfrom-path: putty-branch-0.56/doc/plink.but Text-copy-source-md5: 880fc314dfcdf5e4ad3fa0252466a614 Text-copy-source-sha1: 31f37aecebab3e33b27271635c0c0d67e9bd6530 Node-path: putty-0.56/doc/pscp.but Node-kind: file Node-action: delete Node-path: putty-0.56/doc/pscp.but Node-kind: file Node-action: add Node-copyfrom-rev: 4677 Node-copyfrom-path: putty-branch-0.56/doc/pscp.but Text-copy-source-md5: 1ee033a49c4e0ce121f01d6bb5f6837b Text-copy-source-sha1: 5fc37b55adaafe7dbea28ee9981f557cc3b6fb34 Node-path: putty-0.56/doc/psftp.but Node-kind: file Node-action: delete Node-path: putty-0.56/doc/psftp.but Node-kind: file Node-action: add Node-copyfrom-rev: 4689 Node-copyfrom-path: putty-branch-0.56/doc/psftp.but Text-copy-source-md5: cfa100036466214f84fb7551f947632d Text-copy-source-sha1: cd5dcaa01fd28671de42bb377bfa806b1d728be0 Node-path: putty-0.56/doc/using.but Node-kind: file Node-action: delete Node-path: putty-0.56/doc/using.but Node-kind: file Node-action: add Node-copyfrom-rev: 4685 Node-copyfrom-path: putty-branch-0.56/doc/using.but Text-copy-source-md5: e54b7475c74604860312302ae12a0f27 Text-copy-source-sha1: 05cd6920f2a4eb5ff36589443d7b68de5076d4c7 Node-path: putty-0.56/ldisc.c Node-kind: file Node-action: delete Node-path: putty-0.56/ldisc.c Node-kind: file Node-action: add Node-copyfrom-rev: 4675 Node-copyfrom-path: putty-branch-0.56/ldisc.c Text-copy-source-md5: 2aa516b69f2f8c865aae0086f186e0e2 Text-copy-source-sha1: 019955be0f85b6dd8ec647bb69a4275a99336513 Node-path: putty-0.56/mac/version.r Node-kind: file Node-action: delete Node-path: putty-0.56/mac/version.r Node-kind: file Node-action: add Node-copyfrom-rev: 4676 Node-copyfrom-path: putty-branch-0.56/mac/version.r Text-copy-source-md5: 2e35d53531e93ba7e6893dd47c92b579 Text-copy-source-sha1: 60a014e521df37f0755f408abd82ac3cce53f718 Node-path: putty-0.56/plink.c Node-kind: file Node-action: delete Node-path: putty-0.56/plink.c Node-kind: file Node-action: add Node-copyfrom-rev: 4673 Node-copyfrom-path: putty-branch-0.56/plink.c Text-copy-source-md5: 3ef83c8baec8e6f253872b345a54a2a3 Text-copy-source-sha1: 814cd1120eea9baa9b2f176bc2c1c3d04cc1d2fc Node-path: putty-0.56/putty.h Node-kind: file Node-action: delete Node-path: putty-0.56/putty.h Node-kind: file Node-action: add Node-copyfrom-rev: 4675 Node-copyfrom-path: putty-branch-0.56/putty.h Text-copy-source-md5: 702c6aca8f454129848afb0b76d44f4d Text-copy-source-sha1: 9ed794947b4f383481c63d2fa45614ab500a2750 Node-path: putty-0.56/putty.iss Node-kind: file Node-action: delete Node-path: putty-0.56/putty.iss Node-kind: file Node-action: add Node-copyfrom-rev: 4676 Node-copyfrom-path: putty-branch-0.56/putty.iss Text-copy-source-md5: 7f049844d1355bac2febd62e3867a572 Text-copy-source-sha1: 0fef9ff10c0a5c5d01f10498fc55b32b4663264c Node-path: putty-0.56/settings.c Node-kind: file Node-action: delete Node-path: putty-0.56/settings.c Node-kind: file Node-action: add Node-copyfrom-rev: 4675 Node-copyfrom-path: putty-branch-0.56/settings.c Text-copy-source-md5: 3bcdc4dc229117aecd70e2a9981c1814 Text-copy-source-sha1: 3cf4910f8b4cd772e47a5bacf5fdefd52402ae30 Node-path: putty-0.56/ssh.c Node-kind: file Node-action: delete Node-path: putty-0.56/ssh.c Node-kind: file Node-action: add Node-copyfrom-rev: 4674 Node-copyfrom-path: putty-branch-0.56/ssh.c Text-copy-source-md5: 81af4413f63b668a8338dc9e92821129 Text-copy-source-sha1: 6ccabccf93b1c48747a2681b70530b8c9beb24b3 Node-path: putty-0.56/sshzlib.c Node-kind: file Node-action: delete Node-path: putty-0.56/sshzlib.c Node-kind: file Node-action: add Node-copyfrom-rev: 4674 Node-copyfrom-path: putty-branch-0.56/sshzlib.c Text-copy-source-md5: 83153799abcff7cb341ee9b2ac149ab6 Text-copy-source-sha1: 109487d4819412a1f3fab31baec9df8bbc906c8d Node-path: putty-0.56/telnet.c Node-kind: file Node-action: delete Node-path: putty-0.56/telnet.c Node-kind: file Node-action: add Node-copyfrom-rev: 4674 Node-copyfrom-path: putty-branch-0.56/telnet.c Text-copy-source-md5: bdf42d3a4c00d4f987ebc6b29510429f Text-copy-source-sha1: ec27be8fe50cd24dcd6244ea9aff311b5e1f9b3b Node-path: putty-0.56/terminal.c Node-kind: file Node-action: delete Node-path: putty-0.56/terminal.c Node-kind: file Node-action: add Node-copyfrom-rev: 4675 Node-copyfrom-path: putty-branch-0.56/terminal.c Text-copy-source-md5: 4fa838ccc1879735d0633c7aa77b2e50 Text-copy-source-sha1: 0afb2f706a2c3f9b96dffec4d3edd729f885e6b2 Node-path: putty-0.56/terminal.h Node-kind: file Node-action: delete Node-path: putty-0.56/terminal.h Node-kind: file Node-action: add Node-copyfrom-rev: 4675 Node-copyfrom-path: putty-branch-0.56/terminal.h Text-copy-source-md5: 9929db90221cebfe5628262a0cec1b4f Text-copy-source-sha1: 1c03c19c4e9f9481a42cf17f2e59c8b7d6f7fec7 Node-path: putty-0.56/unix/pterm.c Node-kind: file Node-action: delete Node-path: putty-0.56/unix/pterm.c Node-kind: file Node-action: add Node-copyfrom-rev: 4674 Node-copyfrom-path: putty-branch-0.56/unix/pterm.c Text-copy-source-md5: ff3bf0a8f45f40c87d27156932158831 Text-copy-source-sha1: ce375e531f102439fe146e6974b9f756964db171 Node-path: putty-0.56/unix/pty.c Node-kind: file Node-action: delete Node-path: putty-0.56/unix/pty.c Node-kind: file Node-action: add Node-copyfrom-rev: 4673 Node-copyfrom-path: putty-branch-0.56/unix/pty.c Text-copy-source-md5: db11eca5e1196c22a96e39cbfdfc9017 Text-copy-source-sha1: 4af232b59274e50992b713f0e065ec83eccaaab6 Node-path: putty-0.56/unix/unix.h Node-kind: file Node-action: delete Node-path: putty-0.56/unix/unix.h Node-kind: file Node-action: add Node-copyfrom-rev: 4673 Node-copyfrom-path: putty-branch-0.56/unix/unix.h Text-copy-source-md5: 58345e7750be9cfce7cb958c8591edc8 Text-copy-source-sha1: 2ae6c0ffe1af75fb1058d0baa0e600d0e45001f0 Node-path: putty-0.56/unix/uxcfg.c Node-kind: file Node-action: delete Node-path: putty-0.56/unix/uxcfg.c Node-kind: file Node-action: add Node-copyfrom-rev: 4673 Node-copyfrom-path: putty-branch-0.56/unix/uxcfg.c Text-copy-source-md5: 1493210bc9d9eb5a400ca45354dd5c4f Text-copy-source-sha1: a6d94ce5301f24cfe2558d98076668f98931004d Node-path: putty-0.56/unix/uxplink.c Node-kind: file Node-action: delete Node-path: putty-0.56/unix/uxplink.c Node-kind: file Node-action: add Node-copyfrom-rev: 4673 Node-copyfrom-path: putty-branch-0.56/unix/uxplink.c Text-copy-source-md5: fdb590c22ab5d5c6561a122bd68187e8 Text-copy-source-sha1: a1f7ab8d8a232800d3ba7ce3e661c68f9eb71178 Node-path: putty-0.56/unix/uxucs.c Node-kind: file Node-action: delete Node-path: putty-0.56/unix/uxucs.c Node-kind: file Node-action: add Node-copyfrom-rev: 4673 Node-copyfrom-path: putty-branch-0.56/unix/uxucs.c Text-copy-source-md5: 0b9b0ff9e99069ff1606272090dd5651 Text-copy-source-sha1: a7515dcfa3628cfa378e8b3ed74c5cc4ae17156f Node-path: putty-0.56/window.c Node-kind: file Node-action: delete Node-path: putty-0.56/window.c Node-kind: file Node-action: add Node-copyfrom-rev: 4675 Node-copyfrom-path: putty-branch-0.56/window.c Text-copy-source-md5: 3c9c19186cd5ee23a687a62f2320547f Text-copy-source-sha1: 47f0b1b49f84d52a50805e2a491079d334cf2abf Node-path: putty-0.56/winhelp.h Node-kind: file Node-action: delete Node-path: putty-0.56/winhelp.h Node-kind: file Node-action: add Node-copyfrom-rev: 4675 Node-copyfrom-path: putty-branch-0.56/winhelp.h Text-copy-source-md5: 853cd26e6434fe2c9101bfce8c053b2c Text-copy-source-sha1: 0e841d9d41b1b36f016958257ad0398a166d2de6 Node-path: putty-0.56/winsftp.c Node-kind: file Node-action: delete Node-path: putty-0.56/winsftp.c Node-kind: file Node-action: add Node-copyfrom-rev: 4672 Node-copyfrom-path: putty-branch-0.56/winsftp.c Text-copy-source-md5: 84e6b047179bc4f041e7b666ca1384da Text-copy-source-sha1: c0209d49ef37c0a4914f9f446d6703c4731de642 Node-path: putty-0.56/minibidi.h Node-action: delete Node-path: putty-0.56/minibidi.c Node-action: delete Revision-number: 4693 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:06.344405Z PROPS-END Revision-number: 4694 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2004-10-26T18:15:32.000000Z K 7 svn:log V 38 Website changes for the 0.56 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 60c194515b715dda17b9c8d5c8b97006 Text-delta-base-sha1: d8f243e049ae42ab84c2a9961e779b000a4d4f85 Text-content-length: 90 Text-content-md5: 7ae943620f0eb30428f4b2cc25b4e28f Text-content-sha1: 49ec5b38ededb6b60f2a532999d986319d748ddd Content-length: 129 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN%t DD*{temp /~sgtatham/putty/0.56/ http://the.earth.li/~sgtatham/putty/0.56 Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ce656c0cff2352149a38a12c5a5a64ae Text-delta-base-sha1: 0b8192fefb20930d82b9247574d9c3fd4dec3d65 Text-content-length: 1767 Text-content-md5: 5af605c0d35a81a1b96dab50967890a5 Text-content-sha1: ec8f0034cedf5951657f6e1fc47ad13a1c1b1c5d Content-length: 1807 K 15 cvs2svn:cvs-rev V 4 1.13 PROPS-END SVN.EU(C~Q.6 (released 2004-10-26):

    • Security fix: a vulnerability discovered by iDEFENSE, potentially allowing arbitrary code execution on the client by a malicious SSH2Ability to restart a session within an inactive window, via a new menu option.
    • Minimal support for not running a shell or command at all in SSH protocol 2 (equivalent to OpenSSH's "-N" option). PuTTY/Plink still provide a normal window for interaction, and have to be explicitly killed.
    • Transparent support for CHAP cryptographic authentication in the SOCKS 5 proxy protocol. (Not in PuTTYtel.)
    • More diagnostics in the Event Log, particularly of SSH port forwarding.
    • Ability to request setting of environment variables in SSH (protocol 2 only). (However, we don't know of any servers that support this.)
    • Ability to send POSIX signals in SSH (protocol 2 only) via the "Special Commands" menu. (Again, we don't know of any servers supporting this.)
    • Bug fix: The PuTTY tools now more consistently support usernames containing "@" signs.
    • Support for the Polish character set "Mazovia".
    • When logging is enabled, the log file is flushed more frequently, so that its contents can be viewed before it is closed.
    • More flexibility in SSH packet logging: known passwords and session data can be omitted from the log file. Passwords are omitted by default. (This option isn't perfect for removing sensitive details; you should still review log files before letting them out of your sight.)
    • Unix-specific changes:
      • Ability to set environment variables in pterm.
      • PuTTY and pterm attempt to use a UTF-8 line character set by default if this is indicated by the locale; however, this can be overridden.
    Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c7a5625a7e950762ffd5bf458cd5cd63 Text-delta-base-sha1: 5fb02d925c8e952dda584f23e478bef81dc1849a Text-content-length: 189 Text-content-md5: 2d9541241d56904259ea50b57168e26d Text-content-sha1: 8a5c331310e4de78d1ca89ee4598bbc257e367b3 Content-length: 229 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVN!!6z!"]j1Z` d}O?Q@}$66-installer.exe">putty-0.56-installerutty-0.566-installerutty-0.566.tar.gz">putty-0.566.tar.gzputty-0.56.tar.gzputty-0.56 Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d85fd5444870adc3d946a1c04a619ada Text-delta-base-sha1: 52a6cdd5d4a647d049df26a085839bdcf0ea25b4 Text-content-length: 303 Text-content-md5: 5a29da6978c41796023e9ec160e7cb13 Text-content-sha1: 6bde5950cf3bf04b82bc5fd9004d26c171e43156 Content-length: 343 K 15 cvs2svn:cvs-rev V 4 1.16 PROPS-END SVN5[ c{Cr610-26 ANOTHER SECURITY HOLE, fixed in PuTTY 0.56

    PuTTY 0.56, released today, fixes a serious security hole which can6 as soon as possible.

    That's two really bad holes in three months. I'd like to apologise to all our users for the inconvenience. Revision-number: 4695 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2004-10-26T18:16:11.000000Z K 7 svn:log V 23 Add 0.56 release date. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: a8a0768fa666442ac9093a61c44a4eb2 Text-delta-base-sha1: 68e9b4070b61583a40fa14aa6853c8bf041e8a95 Text-content-length: 119 Text-content-md5: e530ff07f2439e0b9ac4d82c46c4bcae Text-content-sha1: f5258fac9c3778e184149ddf579eba550814e788 Content-length: 159 K 15 cvs2svn:cvs-rev V 4 1.36 PROPS-END SVN(G ]BmB}+#! /usr/bin/perl # $Id: bugs2html,v 1.36 2004/10/26 18:16:11 simon [ "0.56", "2004-10-25 Revision-number: 4696 Prop-content-length: 305 Content-length: 305 K 8 svn:date V 27 2004-10-26T18:29:54.000000Z K 7 svn:log V 204 Updates for 0.56 release. Since 0.56 is a branch release and doesn't include some of the snapshot features, I've bodged the release date in the script and one of the wishlist items to do the right thing. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e530ff07f2439e0b9ac4d82c46c4bcae Text-delta-base-sha1: f5258fac9c3778e184149ddf579eba550814e788 Text-content-length: 272 Text-content-md5: f3a7db4e6c7f371c60c8807b2562f07f Text-content-sha1: dfce161f345e42aa029a8c46957f635541c90d76 Content-length: 312 K 15 cvs2svn:cvs-rev V 4 1.37 PROPS-END SVNGvsB B1zM#! /usr/bin/perl # $Id: bugs2html,v 1.37 2004/10/26 18:29:51 jacobneed special handling.) @releases = ( [ "0.54", "2004-02-12" ], [ "0.55", "2004-08-02" ], [ "0.56", "2004-10-13" ] # branch date -- released on 2004-10-26 Node-path: putty-wishlist/data/ssh2-env-var Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 396f34f43e1068ca9be3d89ee4d9e1ed Text-delta-base-sha1: 2ffc5c5b2c154f6d3024b76d90fe20254f45059a Text-content-length: 24 Text-content-md5: ff23dc8fd0cc30f06dea1b9abe1e9777 Text-content-sha1: b8a74104f9fa453f952e856fb0544a28b09c5aeb Content-length: 63 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNUZv_v 0.56 Node-path: putty-wishlist/data/vuln-ssh2-debug Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 1887 Text-content-md5: 75f5c6a2b0c75de767711483f9824293 Text-content-sha1: cf973593dad8a6e310c9690acd6edd87dadfaac4 Content-length: 2003 K 13 svn:eol-style V 6 native K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVNQQQSummary: Vulnerability: crafted SSH2_MSG_DEBUG can cause remote code execution Class: vulnerability Difficulty: fun Priority: high Absent-in: 0.51 Present-in: 0.52 0.53 0.53b 0.54 0.55 Fixed-in: 2004-10-23 0.56 Content-type: text/x-html-body

    Many versions of PuTTY prior to 0.56 have a memory corruption vulnerability in their treatment of received debug messages in SSH protocol version 2 (SSH2_MSG_DEBUG).

    This message is handled in ssh2_rdpkt(). A string length is read from the SSH packet and clipped to the length of a buffer. However, the string length is stored as a signed integer, and there is no protection against its being large enough to be stored as a negative number. This will bypass the length checking and appear as a large positive number once again to the subsequent memcpy(), causing a memory overflow. Code execution has been demonstrated as a result of this overflow.

    This bug is EXTREMELY SEVERE. PuTTY can process debug messages at any time in the protocol, including during the initial key exchange phase. Therefore, this bug can be exploited by a malicious server, before the client has received and verified a host key signature. So this attack can be performed by a man-in-the-middle between the SSH client and server, and the normal host key protections against MITM attacks are bypassed. Even if you trust the server you think you are connecting to, you are not safe.

    This bug does not affect SSH protocol version 1, as the SSH2_MSG_DEBUG string length is sanity-checked against the packet length before use.

    This bug was discovered by an anonymous contributor to iDEFENSE's Vulnerability Contributor Program. It will be documented by iDEFENSE in a forthcoming advisory. Revision-number: 4697 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2004-10-26T18:35:28.000000Z K 7 svn:log V 34 0.56 doesn't include bidi either. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/bidi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: cc08dfe099768f77288d03e86860da56 Text-delta-base-sha1: 4117fe42f81e19e0a9cff34abb22ba3492ff8df7 Text-content-length: 162 Text-content-md5: 524dd13849d6f4444c12c4f4b7abdf62 Text-content-sha1: f2075d2a3ec8d3b782b1e791009a5b79b3701f47 Content-length: 202 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN:V 2  or 0.56 bugfix releases due to stability and incompleteness issues. As of the 2004-10-16 snapshot, the known issue with horizontal window Revision-number: 4698 Prop-content-length: 235 Content-length: 235 K 8 svn:date V 27 2004-10-26T18:44:42.000000Z K 7 svn:log V 134 Reorder a couple of points on the wishlist, and also add a few helpful chunks of `sh' to make life easier next time I make a release. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ce99291e01884311cba8bea110ac00e2 Text-delta-base-sha1: 026053ddb498d750af76eae12913e30a5f273fc7 Text-content-length: 1017 Text-content-md5: ef879dd18d235162e13c3d7fb3328cca Text-content-sha1: 12ca7dc026fb1bed7ab8321b069fb3bd09c2e153 Content-length: 1057 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVNXE$I(Y':0~-~ 0( for i in ; do for t in DSA RSA; do gpg --load-extension=idea --detach-sign -u "Releases ($t)" -o $i.$t $i; done; done Easiest thing is to run, in each directory, this command: md5sum `\find * -name '*SA' -o -type f -print` > md5sums + Sign the md5sums files (gpg --clearsign). for i in md5sums */md5sums; do for t in DSA RSA; do gpg --load-extension=idea --clearsign -u "Releases ($t)" -o $i.$t $i; done; done. - Do final checks on the release directory: + verify all the signatures. In each directory: for i in *.*SA; do case $i in md5sums*) gpg --verify $i;; *) gpg --verify $i `echo $i | sed 's/\..SA$//'`;; esac; done + check the md5sums. In each directory: md5sum -c md5sums - Having double-checked the release, copy it from ixion to chiark:ftp/putty- an * Don't forget to create the new directories on chiark - ~/www/putty/{,/x86,/alpha,/htmldoc} - before running webupdat Revision-number: 4699 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2004-10-26T18:59:39.000000Z K 7 svn:log V 54 Merge version number bump (0.56) from release branch. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d9a651af38c10465843449c77e105edf Text-delta-base-sha1: fbda8b60944f7ee0866ae08d88d1695eae32702c Text-content-length: 15 Text-content-md5: 0354dac1614437ebfd65cec07b74744d Text-content-sha1: 0532c7f82a1931f3f7aab776bab10618ec3e2e2e Content-length: 54 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN0.56 Node-path: putty/mac/version.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: bca53e18158f16883cd6187ebac87a9c Text-delta-base-sha1: 669b6633c1ba2ad5bed74efb5ecad88a3f89ac58 Text-content-length: 20 Text-content-md5: 2e35d53531e93ba7e6893dd47c92b579 Text-content-sha1: 60a014e521df37f0755f408abd82ac3cce53f718 Content-length: 59 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN77mIn6 Node-path: putty/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d3bf60bac6ee0eee7ae4a95b6b5fe8a6 Text-delta-base-sha1: ebf64193022643a13db481659db3cf1b8f30664e Text-content-length: 22 Text-content-md5: 7f049844d1355bac2febd62e3867a572 Text-content-sha1: 0fef9ff10c0a5c5d01f10498fc55b32b4663264c Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN X;Y6 Revision-number: 4700 Prop-content-length: 250 Content-length: 250 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-26T19:32:25.000000Z K 7 svn:log V 149 Add bumping version number on trunk to new post-release checklist. Also, sometimes `0.XX' is used in the docs as a placeholder for a version number. PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef879dd18d235162e13c3d7fb3328cca Text-delta-base-sha1: 12ca7dc026fb1bed7ab8321b069fb3bd09c2e153 Text-content-length: 435 Text-content-md5: 97dc75143144c18d0f4a9b5e5b9129fc Text-content-sha1: 366055c0e4d469fbedcb210e09c33fbfc987e0c7 Content-length: 475 K 15 cvs2svn:cvs-rev V 4 1.18 PROPS-END SVNEUm^Ol; Sometimes these are marked in between releases as `0.XX', so it's worth grepping for that tooRelax (slightly). After the release ----------------- The following want doing some time soon after a release has been made: - If the release was made from a branch, make sure the version number in _trunk_ CVS is up to date in all the locations listed above, so that (e.g.) Unix snapshots come out right. Revision-number: 4701 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:06.802429Z PROPS-END Revision-number: 4702 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2004-10-26T19:47:35.000000Z K 7 svn:log V 121 Good grief! I should create the `htmldoc' subdir in the release tree _before_ I create the md5sums files. I am a gibbon. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 97dc75143144c18d0f4a9b5e5b9129fc Text-delta-base-sha1: 366055c0e4d469fbedcb210e09c33fbfc987e0c7 Text-content-length: 30 Text-content-md5: 23ac1259565cc0399b63cfab9724282a Text-content-sha1: a595ada06828dcd5b75f0fb2cd9b20666ea2af7c Content-length: 70 K 15 cvs2svn:cvs-rev V 4 1.19 PROPS-END SVNUUo7&7hx] Revision-number: 4703 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2004-10-26T20:25:41.000000Z K 7 svn:log V 29 s/are new/were new/ for 0.55 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5af605c0d35a81a1b96dab50967890a5 Text-delta-base-sha1: ec8f0034cedf5951657f6e1fc47ad13a1c1b1c5d Text-content-length: 26 Text-content-md5: fb7cd2adb57818763aab32bb4b003ee0 Text-content-sha1: 104f0d3f8f14afbd4dab5ad6bc004ec0069fa0fb Content-length: 66 K 15 cvs2svn:cvs-rev V 4 1.14 PROPS-END SVN./ qputty.ion.lu in Luxembourgleakage.org/">putty.leakage.org in Malaysiamirrors.key2network.com/">putty.mirrors.key2network.com in Norway Revision-number: 4710 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2004-10-27T12:18:31.000000Z K 7 svn:log V 24 reinstate netmirror.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b6b53eb7e3fed5ff5b86f068ca7d29ee Text-delta-base-sha1: bd23000146d9eb1ffe158f9215fdd2b44f71aca2 Text-content-length: 69 Text-content-md5: 2cb443eb5887f026728a95f87ac8163a Text-content-sha1: bf827ca7f54aedf4b69f458121f3df157a0c57a2 Content-length: 110 K 15 cvs2svn:cvs-rev V 5 1.138 PROPS-END SVN|*VJ62Vnetmirror.org/mirror/putty/">netmirror.org Revision-number: 4711 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2004-10-27T12:37:52.000000Z K 7 svn:log V 27 ftp://netmirror.org/putty/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2cb443eb5887f026728a95f87ac8163a Text-delta-base-sha1: bf827ca7f54aedf4b69f458121f3df157a0c57a2 Text-content-length: 73 Text-content-md5: 648354c29c4d6e7b2706291915edfa18 Text-content-sha1: 21b05208d8420e5fddba67ec084d76ab6180d64d Content-length: 114 K 15 cvs2svn:cvs-rev V 5 1.139 PROPS-END SVN|D 2t^netmirror.org/putty/">netmirror.org in Germany Revision-number: 4712 Prop-content-length: 284 Content-length: 284 K 8 svn:date V 27 2004-10-27T14:46:21.000000Z K 7 svn:log V 183 (Try to) distinguish projects which actually use PuTTY code from those that are merely relevant to PuTTY, to aid people in determining which ones our security alerts are relevant to. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d103c7f99bebd02a97ba385d8e9adf2c Text-delta-base-sha1: 7ea5fe55cd71731b8d4581406973489b407f6b6a Text-content-length: 563 Text-content-md5: 515e161e077498bcb680c68b5454d074 Text-content-sha1: ffc7b7db811fa99a99365679d56c8030dd1c6bc4 Content-length: 603 K 15 cvs2svn:cvs-rev V 4 1.38 PROPS-END SVNnpAfbC5,3,~lOod Px:%*_`;~?TRelated software

    Several pieces of third-party software incorporate parts of the PuTTY code, or augment PuTTY in other ways, to provide facilities not available from PuTTY itself. We list some of them here, with no recommendation implied. We have no control over this code, so we can't vouch for either its quality or its security.

    Software based on PuTTY's code

    These projects include actual code from some version of PuTTY. 3>Other related software

      Revision-number: 4713 Prop-content-length: 163 Content-length: 163 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-27T14:59:17.000000Z K 7 svn:log V 63 CSS appear to have changed the licence for their GSSAPI patch. PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 515e161e077498bcb680c68b5454d074 Text-delta-base-sha1: ffc7b7db811fa99a99365679d56c8030dd1c6bc4 Text-content-length: 114 Text-content-md5: 7a4ae4dece7e6dd3bb22a99cbd8b1b2b Text-content-sha1: 77aaadfeb381a448588af76aa984ee4e03c16172 Content-length: 154 K 15 cvs2svn:cvs-rev V 4 1.39 PROPS-END SVNpYX2X}Rwww.certifiedsecuritysolutions.com/downloads.html"> PuTTY with GSSAPI/Kerberos support Revision-number: 4714 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2004-10-27T15:00:39.000000Z K 7 svn:log V 122 CSS appear to have changed the licence for their GSSAPI patch, and they track PuTTY development. v_t_m's patch reviewed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 85a2efe7c85f0483c6e1377c44ef518b Text-delta-base-sha1: 2aee95af2a32a70c1b614c9f58d8b0dda0e310e6 Text-content-length: 92 Text-content-md5: 98ecd68e6568fdaa63c1362e7f1aea42 Text-content-sha1: 8ab16f1b3b1298e3e1df9f3859e539145b395332 Content-length: 131 K 15 cvs2svn:cvs-rev V 3 1.6 PROPS-END SVNlF Fzd which supports Kerberos and GSSAPI (reviewed and found wanting). Revision-number: 4715 Prop-content-length: 243 Content-length: 243 K 8 svn:date V 27 2004-10-27T15:50:52.000000Z K 7 svn:log V 142 Malcolm Rowe's UI tweak patch for About/Licence: recognise `Esc' to close windows (PuTTY, Pageant, PuTTYgen); Licence window parent in PuTTY. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6ffb4e11b264f79d4b71cf048963d114 Text-delta-base-sha1: 78733d4880957afe0b969fd3fa78b8798888fbc7 Text-content-length: 56 Text-content-md5: d19eac18ef79210bb3549d194e62bd42 Text-content-sha1: d9d8a3df7a4fe18b687bd6e3e72a044dc6964a43 Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.71 PROPS-END SVNOs-('case IDCANCELcase IDCANCEL Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: e236b3e38aeee6c0cab6d6b0ff011d03 Text-delta-base-sha1: 78fbe4cb0b5f266e92ea2bf9f9b181957fc103a9 Text-content-length: 56 Text-content-md5: 5a26df40911f0e4242a6291ff340ae51 Text-content-sha1: ceec8a8291ec3459db65791bcaf0e548d02a6d9e Content-length: 96 K 15 cvs2svn:cvs-rev V 4 1.62 PROPS-END SVN)%# G>case IDCANCELcase IDCANCEL Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7b8e8f850dddcc9123dae12d3f5ffccf Text-delta-base-sha1: 49a24e18be712529372889d2e68abb0b09ab4a8b Text-content-length: 47 Text-content-md5: bd843c9a975a6e5978decf06d3c4e89c Text-content-sha1: a77b06b777c419f18458c5d7469004cfafcc01af Content-length: 88 K 15 cvs2svn:cvs-rev V 5 1.218 PROPS-END SVNpy8t@0case IDCANCELhwnd Revision-number: 4716 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2004-10-27T17:12:15.000000Z K 7 svn:log V 39 iDEFENSE have released their advisory. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-ssh2-debug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: ed08ab4178cdfbbb8458a2501fb5546d Text-delta-base-sha1: d6021b61bb997c7d6b0c04b758d6fef177a0564a Text-content-length: 174 Text-content-md5: aec862682165660bc068c74340a9567c Text-content-sha1: 61d7d03ef926da5a41828bac0b7cdc85f70b03da Content-length: 213 K 15 cvs2svn:cvs-rev V 3 1.3 PROPS-END SVNQ2is documented in iDEFENSE's advisory 10.27.04. Revision-number: 4717 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2004-10-27T17:21:38.000000Z K 7 svn:log V 27 Add iDEFENSE advisory URL. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: fb7cd2adb57818763aab32bb4b003ee0 Text-delta-base-sha1: 104f0d3f8f14afbd4dab5ad6bc004ec0069fa0fb Text-content-length: 162 Text-content-md5: 54ef41e09c02d3f2305140f9ff9cc9c3 Text-content-sha1: c397e65fedc737749edbbb4135c192a81a128b8b Content-length: 202 K 15 cvs2svn:cvs-rev V 4 1.15 PROPS-END SVN/6 ,, (advisory number 10-27-04) Revision-number: 4718 Prop-content-length: 359 Content-length: 359 K 7 svn:log V 258 Malcolm Rowe spotted that we broke display of SSH2_MSG_DEBUG messages while fixing `vuln-ssh2-debug', by missing out a field. In most cases (always_display = 0) we would log a zero-length or truncated message. (Also add a prototype for ssh2_pkt_getbool().) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-28T00:23:44.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 81af4413f63b668a8338dc9e92821129 Text-delta-base-sha1: 6ccabccf93b1c48747a2681b70530b8c9beb24b3 Text-content-length: 526 Text-content-md5: 6160bcfc590f0f79a94a0d0f09924d5d Text-content-sha1: 2dc8df36960b69334de51434b856bfe88f8d9c67 Content-length: 567 K 15 cvs2svn:cvs-rev V 5 1.331 PROPS-END SVNuc Rint ssh2_pkt_getbool int always_display; /* XXX maybe we should actually take notice of this */ always_display = ssh2_pkt_getbool(ssh);eOaX,myXlogevent("X11 forwarding enabled"); ssh->X11_fwd_enabled = TRUE; } } 1" " destinationB//tx = NULL; } if (ssh->s) ssh_do_close(ssh); sfree(ssh); } /* * Reconfigure the SSH backend. * * Currently, this function does nothing very useful. In future, Revision-number: 4719 Prop-content-length: 126 Content-length: 126 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-28T12:04:33.000000Z K 7 svn:log V 26 reinstate sourcekeg.co.uk PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 648354c29c4d6e7b2706291915edfa18 Text-delta-base-sha1: 21b05208d8420e5fddba67ec084d76ab6180d64d Text-content-length: 62 Text-content-md5: a51a6ec07f82b65edfcb8cceff7ef7b7 Text-content-sha1: 9c66994ef8cfc3e90ed1212dd245989888004f42 Content-length: 103 K 15 cvs2svn:cvs-rev V 5 1.140 PROPS-END SVND8 'HI{sourcekeg.co.uk/putty/">sourcekeg.co.uk Revision-number: 4720 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2004-10-28T12:44:45.000000Z K 7 svn:log V 14 IPv6 patch 10 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ipv6-patch-update Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: 2e52bf9aeb3119baaab5ff05bf41f797 Text-delta-base-sha1: f5f938be5f2cf832fb48c6be3a3aee4014abce4d Text-content-length: 22 Text-content-md5: d9b581bc1498a52b9d85e27d2b5ec76c Text-content-sha1: f00fbab13b1e10dd46f2b785b3a0540a70a6fcc6 Content-length: 61 K 15 cvs2svn:cvs-rev V 3 1.5 PROPS-END SVN 3S410 Revision-number: 4721 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 40 CallingHome doesn't contain PuTTY code. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-28T12:48:10.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 7a4ae4dece7e6dd3bb22a99cbd8b1b2b Text-delta-base-sha1: 77aaadfeb381a448588af76aa984ee4e03c16172 Text-content-length: 29 Text-content-md5: f5c6e2bb89334409568ff0cf849635c9 Text-content-sha1: 17d10f277d327ddbf7e9278f5baf4df52ea72b9f Content-length: 69 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVNYYv.oyv< Revision-number: 4722 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2004-10-28T13:00:25.000000Z K 7 svn:log V 15 Secunia, OSVDB K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-ssh2-debug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: aec862682165660bc068c74340a9567c Text-delta-base-sha1: 61d7d03ef926da5a41828bac0b7cdc85f70b03da Text-content-length: 216 Text-content-md5: cc0bb46a8290b6e8b775a87edca3ca9b Text-content-sha1: 5fbf9bbf42edc4be01908161007df8b5d5e7ffd3 Content-length: 255 K 15 cvs2svn:cvs-rev V 3 1.4 PROPS-END SVN2vE1E It is also mentioned in an advisory by Secunia, numbered SA12987, and has been assigned OSVDB ID 11165. Revision-number: 4723 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 27 Reinstate penguin.3wsi.net K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-10-28T16:31:26.000000Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: a51a6ec07f82b65edfcb8cceff7ef7b7 Text-delta-base-sha1: 9c66994ef8cfc3e90ed1212dd245989888004f42 Text-content-length: 81 Text-content-md5: 44fac7c9de8e039f12661e86da1dd8fa Text-content-sha1: 0d12aa82b6b3296182fd8b5c8c313219e14a7ad6 Content-length: 122 K 15 cvs2svn:cvs-rev V 5 1.141 PROPS-END SVN8,6?C@tDenguin.3wsi.net/putty">penguin.3wsi.net in Indones Revision-number: 4724 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2004-10-29T12:13:32.000000Z K 7 svn:log V 24 http://wigen.net/putty/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 44fac7c9de8e039f12661e86da1dd8fa Text-delta-base-sha1: 0d12aa82b6b3296182fd8b5c8c313219e14a7ad6 Text-content-length: 68 Text-content-md5: 380b19e5f8313c8319266c2fa8cbccf1 Text-content-sha1: 00f19b8f22c66ff234d1038bf5caec1782da67b8 Content-length: 109 K 15 cvs2svn:cvs-rev V 5 1.142 PROPS-END SVN,)EA@aKwigen.net/putty/">wigen.net in Norway Revision-number: 4725 Prop-content-length: 493 Content-length: 493 K 8 svn:date V 27 2004-11-01T00:17:31.000000Z K 7 svn:log V 392 Argh. Failure to make a variable static to get round coroutine mechanics means that each SSH-2 remote tunnel will sfree() something random and thus have a chance of crashing or doing something else bad, although it won't otherwise affect execution. Introduced in 1.319 [r4529] (some of my improved diagnostics). One day I'll make a checkin to ssh.c without forgetting about the coroutines... K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 6160bcfc590f0f79a94a0d0f09924d5d Text-delta-base-sha1: 2dc8df36960b69334de51434b856bfe88f8d9c67 Text-content-length: 70 Text-content-md5: 1c4b4f94099cb35ade48067ba89f8c5c Text-content-sha1: 19cc1ac9e584329f76b666803b979d7c64696075 Content-length: 111 K 15 cvs2svn:cvs-rev V 5 1.332 PROPS-END SVN `static BIBcrcda_c Revision-number: 4726 Prop-content-length: 212 Content-length: 212 K 7 svn:log V 111 Summary: SSH-2 remote tunneling may cause crash Absent-in: 0.55 Present-in: 0.56 Fixed-in: 2004-11-02 *hides* K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-01T00:23:57.000000Z PROPS-END Node-path: putty-wishlist/data/ssh2-remote-tunnel-crash Node-kind: file Node-action: add Prop-content-length: 116 Text-delta: true Text-content-length: 638 Text-content-md5: fb41548119f4e04a15faae24a72dbaec Text-content-sha1: 1d1031db689af1472074d8927fcc78210dff546f Content-length: 754 K 15 cvs2svn:cvs-rev V 3 1.1 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVNpppSummary: SSH-2 remote tunneling may cause crash Class: bug Difficulty: fun Priority: high Absent-in: 0.55 Present-in: 0.56 Fixed-in: 2004-11-02 Content-type: text/x-html-body

      When any SSH-2 remote tunnels are configured, there is a chance that PuTTY will crash (or do something else bad), mostly likely after user authentication (when tunnels are first set up). Increasing numbers of remote tunnels is likely to increase the likelihood of a crash.

      (This is due to free()-ing of an uninitialised pointer in the event logging code. Other than the errant free(), execution is not affected.) Revision-number: 4727 Prop-content-length: 478 Content-length: 478 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-01T00:47:37.000000Z K 7 svn:log V 377 Ahem, let's not try initialising a static with a non-constant initialiser. Also, I'm pretty sure that adding a source address to a remote SSH-2 forwarding can never have worked, since we added an address string to the packet twice in that case. OpenSSH 3.4p1 certainly doesn't like it (`Server has disabled port forwarding' debug message). Fixed (and OpenSSH is happier now). PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 1c4b4f94099cb35ade48067ba89f8c5c Text-delta-base-sha1: 19cc1ac9e584329f76b666803b979d7c64696075 Text-content-length: 291 Text-content-md5: 29d6f8be524eafe60ec07d18b2a4e205 Text-content-sha1: 4405f36da4d537bfa05532338a2afb6e80666ef1 Content-length: 332 K 15 cvs2svn:cvs-rev V 5 1.333 PROPS-END SVN@/>&<S ; { ssh2_pkt_addstring(ssh, saddr); } else if (ssh->cfg.rport_acceptall) { ssh2_pkt_addstring(ssh, "0.0.0.0"); } else { ssh2_pkt_addstring(ssh, "127.0.0.1"); }Ij!Ie_context(ssh->crcda_ctx); ssh-> Revision-number: 4728 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 58 Argh, I messed up SSH1 remote tunnels too (same mistake). K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-01T14:18:37.000000Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 29d6f8be524eafe60ec07d18b2a4e205 Text-delta-base-sha1: 4405f36da4d537bfa05532338a2afb6e80666ef1 Text-content-length: 79 Text-content-md5: b23cba7e3fddea200dbe85f5a82fa964 Text-content-sha1: 772e6bd36b3ac618db213a135e8fcf2d69e361d3 Content-length: 120 K 15 cvs2svn:cvs-rev V 5 1.334 PROPS-END SVNXCej~jda_ctx) { crcda_fre Revision-number: 4729 Prop-content-length: 210 Content-length: 210 K 8 svn:date V 27 2004-11-01T14:20:13.000000Z K 7 svn:log V 109 Moved `ssh2-remote-tunnel-crash' to `ssh-remote-tunnel-crash' since it also affects SSH-1, and tweaked text. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh-remote-tunnel-crash Node-kind: file Node-action: add Node-copyfrom-rev: 4728 Node-copyfrom-path: putty-wishlist/data/ssh2-remote-tunnel-crash Text-copy-source-md5: fb41548119f4e04a15faae24a72dbaec Text-copy-source-sha1: 1d1031db689af1472074d8927fcc78210dff546f Text-delta: true Text-delta-base-md5: fb41548119f4e04a15faae24a72dbaec Text-delta-base-sha1: 1d1031db689af1472074d8927fcc78210dff546f Text-content-length: 134 Text-content-md5: ea2d0217b808b67aeee9234ba0495f1a Text-content-sha1: f8b66b765a25b0a470e12d9008f5b0abfe6b657e Content-length: 134 SVNp j/E-CSummary: SSHremote tunnels are configured, there is a chance that PuTTY This affects both SSH-1 and SSH-2 Node-path: putty-wishlist/data/ssh2-remote-tunnel-crash Node-action: delete Revision-number: 4730 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2004-11-01T17:35:24.000000Z K 7 svn:log V 113 Link to wishlist items corresponding to vulnerabilities from the front page. Remove news that's over a year old. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 5a29da6978c41796023e9ec160e7cb13 Text-delta-base-sha1: 6bde5950cf3bf04b82bc5fd9004d26c171e43156 Text-content-length: 169 Text-content-md5: d0d08a60c84b8b35647790c852944c73 Text-content-sha1: 7cd473defdff20bfd056a39944993e44c65f8c84 Content-length: 209 K 15 cvs2svn:cvs-rev V 4 1.17 PROPS-END SVN[7\EuA7B serious security hole serious security hole Revision-number: 4731 Prop-content-length: 619 Content-length: 619 K 8 svn:date V 27 2004-11-02T17:44:06.000000Z K 7 svn:log V 518 Since neither I nor Owen know why the IDM_ values for the saved-sessions submenu were going up in steps of 16, I've changed to steps of 1, thus increasing the possible number of sessions from ~256 to 4096, since a recent report seemed to indicate that the previous limit might not be enough for someone (!) I can't find any documentation that puts an upper limit on the number of menu items, and it seems to work on Win98, which is where I'd expect it to break if anywhere. Also a number of other tweaks to this code. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: b308b195d5a4543c698f63dd12cc545e Text-delta-base-sha1: dd8bf9422fb49f1a0cc60e9d4ef48ffed5459a86 Text-content-length: 696 Text-content-md5: 9fda3d094e118f75fe2e3a3d67bb4673 Text-content-sha1: c54e86c87f94432ad018b715b60118f46b9da0a0 Content-length: 737 K 15 cvs2svn:cvs-rev V 5 1.276 PROPS-END SVN&=Vn\Uf BiArX/* Maximum number of sessions on saved-session submenu */ #define MENU_SAVED_MAX (IDM_SAVED_MAX-IDM_SAVED_MIN)/* skip sesslist.sessions[0] == Default Settings */ for (i = 1; i < ((sesslist.nsessions <= MENU_SAVED_MAX+1) ? sesslist.nsessions : MENU_SAVED_MAX+1); i++) AppendMenu(s, MF_ENABLED, IDM_SAVED_MIN + i-1unsigned int sessno = lParam - IDM_SAVED_MIN + 1; if (sessno < sesslist.nsessions) { char *session = sesslist.sessions[sessno]; /* XXX spaces? quotes? "-load"? */ cl = dupprintf("putty @%s", session); freecl = TRUE;F6F8: index = 7; break; case VK_F9: index = 8; br Revision-number: 4732 Prop-content-length: 441 Content-length: 441 K 8 svn:date V 27 2004-11-02T22:30:24.000000Z K 7 svn:log V 340 Simon has reminded me _why_ menu identifiers were spaced every sixteen, so let's add a comment so that we don't forget again. Source: K 10 svn:author V 5 jacob PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: d19eac18ef79210bb3549d194e62bd42 Text-delta-base-sha1: d9d8a3df7a4fe18b687bd6e3e72a044dc6964a43 Text-content-length: 272 Text-content-md5: 8dc9733e3acca05433364a49ffe7003a Text-content-sha1: 0914ae3cdcd5ec238884461a79ce032985dfc4c6 Content-length: 312 K 15 cvs2svn:cvs-rev V 4 1.72 PROPS-END SVNsj u`u^/* From MSDN: In the WM_SYSCOMMAND message, the four low-order bits of * wParam are used by Windows, and should be masked off, so we shouldn't * attempt to store information in them. Hence all these identifiers have * the low 4 bits clear. */ Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 9fda3d094e118f75fe2e3a3d67bb4673 Text-delta-base-sha1: c54e86c87f94432ad018b715b60118f46b9da0a0 Text-content-length: 539 Text-content-md5: 0394db1e0a6b4cfb9d76dc6992286a63 Text-content-sha1: ae63c2eb2583e216ba09a8f1df499781e612da0e Content-length: 580 K 15 cvs2svn:cvs-rev V 5 1.277 PROPS-END SVN u5uV3/* From MSDN: In the WM_SYSCOMMAND message, the four low-order bits of * wParam are used by Windows, and should be masked off, so we shouldn't * attempt to store information in them. Hence all these identifiers have * the low 4 bits clear. */F=wwF0; break; case VK_F2: index = 1; break; case VK_F3: index = 2; break; case VK_F4: index = 3; break; case VK_F5: index = 4; break; case VK_F6: index = 5; break; case VK_F7: index = 6; break; case VK_ Revision-number: 4733 Prop-content-length: 312 Content-length: 312 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-02T23:06:20.000000Z K 7 svn:log V 211 Go back to using intervals of 16 for the saved session identifiers for the system menu, but expand from 256 entries to 1024 as there seems to be plenty of space. Also remove a couple of unused IDM_* constants. PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 0394db1e0a6b4cfb9d76dc6992286a63 Text-delta-base-sha1: ae63c2eb2583e216ba09a8f1df499781e612da0e Text-content-length: 380 Text-content-md5: acee4ee363e6f48e8a5f5c754962c85d Text-content-sha1: 72f3d6abba3584d281acc27515f1c52f922955ae Content-length: 421 K 15 cvs2svn:cvs-rev V 5 1.278 PROPS-END SVN(6(&ga!@:}N2Also, identifiers should < 0xF0005000 #define MENU_SAVED_STEP 16 /* Maximum number of sessions on saved-session submenu */ #define MENU_SAVED_MAX ((IDM_SAVED_MAX-IDM_SAVED_MIN) / MENU_SAVED_STEP(i-1)*MENU_SAVED_STEP((lParam - IDM_SAVED_MIN) / MENU_SAVED_STEP)0; break; case VK_F2: index = 1; bre=+ Revision-number: 4734 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2004-11-02T23:06:43.000000Z K 7 svn:log V 60 Note upper limit of WM_SYSCOMMAND identifiers in a comment. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 8dc9733e3acca05433364a49ffe7003a Text-delta-base-sha1: 0914ae3cdcd5ec238884461a79ce032985dfc4c6 Text-content-length: 57 Text-content-md5: 30517a31d2e25ee3ac6324531837c6f7 Text-content-sha1: 997984396ae0ecc7be72e87d7fe3542832d79307 Content-length: 97 K 15 cvs2svn:cvs-rev V 4 1.73 PROPS-END SVNj !SQAlso, identifiers should < 0xF000 Revision-number: 4735 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:09.967894Z PROPS-END Revision-number: 4736 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:09.977276Z PROPS-END Revision-number: 4737 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:09.986500Z PROPS-END Revision-number: 4738 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:09.996425Z PROPS-END Revision-number: 4739 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.006391Z PROPS-END Revision-number: 4740 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.016307Z PROPS-END Revision-number: 4741 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.026817Z PROPS-END Revision-number: 4742 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.036381Z PROPS-END Revision-number: 4743 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.046995Z PROPS-END Revision-number: 4744 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.057112Z PROPS-END Revision-number: 4745 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.067486Z PROPS-END Revision-number: 4746 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.077737Z PROPS-END Revision-number: 4747 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.087337Z PROPS-END Revision-number: 4748 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.097825Z PROPS-END Revision-number: 4749 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.107745Z PROPS-END Revision-number: 4750 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.118220Z PROPS-END Revision-number: 4751 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.147394Z PROPS-END Revision-number: 4752 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.156631Z PROPS-END Revision-number: 4753 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.166580Z PROPS-END Revision-number: 4754 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.176157Z PROPS-END Revision-number: 4755 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 Mention TortoiseCVS. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-05T14:53:50.000000Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: f5c6e2bb89334409568ff0cf849635c9 Text-delta-base-sha1: 17d10f277d327ddbf7e9278f5baf4df52ea72b9f Text-content-length: 132 Text-content-md5: 9d5aae35c89a822c764e175b2ff00ca4 Text-content-sha1: e6d09d1a37de59d75ac7a79615599b669ec1a68d Content-length: 172 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVNY` n#nO www.tortoisecvs.org/"> TortoiseCVS, a Windows Explorer frontend to CVS Revision-number: 4756 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.272556Z PROPS-END Revision-number: 4757 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.303117Z PROPS-END Revision-number: 4758 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.312679Z PROPS-END Revision-number: 4759 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.322133Z PROPS-END Revision-number: 4760 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.332520Z PROPS-END Revision-number: 4761 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2004-11-09T11:09:27.000000Z K 7 svn:log V 49 putty.miscellaneousmirror.org mirrors.sunsite.dk K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 380b19e5f8313c8319266c2fa8cbccf1 Text-delta-base-sha1: 00f19b8f22c66ff234d1038bf5caec1782da67b8 Text-content-length: 166 Text-content-md5: d0d5365ee2ba9cae583f61b14c967028 Text-content-sha1: 13cb5e1f638a0ce5d7ed846217840076aab12b44 Content-length: 207 K 15 cvs2svn:cvs-rev V 5 1.143 PROPS-END SVN|zStTvJmirrors.sunsite.dk/putty/">mirrors.sunsitemiscellaneousmirror.org/">putty.miscellaneousputty.huewenet.de/">putty.huewenet.de Revision-number: 4762 Prop-content-length: 198 Content-length: 198 K 7 svn:log V 98 DJSD requests a force-monochrome option for users who dislike angry- fruit-salad applications :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2004-11-09T17:57:32.000000Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: c01c59889ffa28d12a3be2aad9c2fd9e Text-delta-base-sha1: aea72715e83b1bed7984cc1b11258bfcb324714e Text-content-length: 161 Text-content-md5: 3cd23b3985c73b402f06ce405b365f83 Text-content-sha1: 6b54a0797bf6a8685a68886c646de8ceda7d58cc Content-length: 201 K 15 cvs2svn:cvs-rev V 4 1.40 PROPS-END SVN (%~ Allow terminal to specify ANSI colours", 'i', HELPCTX(colours_ansi), dlg_stdcheckbox_handler, I(offsetof(Config,ansi_colour)) Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 206a0a589c40a32f49c0df8e4e21ad35 Text-delta-base-sha1: 4e9c206efe45181538931b614f238fe28f4068c2 Text-content-length: 798 Text-content-md5: e3f36f26c20ecc4489c70453144d822c Text-content-sha1: 5c78609fec4ff9ac056c725b4b8f9b0dd645c7b8 Content-length: 838 K 15 cvs2svn:cvs-rev V 4 1.97 PROPS-END SVN(=V;m\versionid $Id: config.but,v 1.97 2004/11/09 17:57:32 simonansicolour} \q{Allow terminal to specify ANSI colours} \cfg{winhelp-topic}{colours.ansi} This option is enabled by default. If it is disabled, PuTTY will ignore any control sequences sent by the server to request coloured text. If you have a particularly garish application, you might want to turn this option off and make PuTTY only use the default foreground and background colours(777IT4 \c \c [HKEY_CURRENT_USER\Software\SimonTatham\PuTTY] \c "RandSeedFile"="a:\\putty.rnd" You should replace \c{a:\\putty.rnd} with the location where you want to store your random number data. If the aim is to carry around PuTTY and its settings on one floppy, you probably want to store it on the floppy. Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 2427840f33d0529c8f7e132d13b2281c Text-delta-base-sha1: 58c7e2a2fe2ea157f3152234af6091d46aa98b01 Text-content-length: 35 Text-content-md5: 3992244cb607926b1ac09ce5f5d82531 Text-content-sha1: 126c5e4047e9bcc741d2e7eacbbe441a36a31f9d Content-length: 76 K 15 cvs2svn:cvs-rev V 5 1.238 PROPS-END SVNy :H1ansi_colour; Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 7b2aa13b2a933cdef8648d262f755421 Text-delta-base-sha1: e5c64bee9b21e1f2268e3cf39652b229c63736f5 Text-content-length: 92 Text-content-md5: 6c6234ececf16f042c3f71f82566739a Text-content-sha1: 4f9acf40142adc4e70ef88285d8fd25d48e5a9ab Content-length: 133 K 15 cvs2svn:cvs-rev V 5 1.123 PROPS-END SVN*>B~!! ANSIColour", cfg->ansi_colourANSIColour", 1, &cfg->ansi_colour Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: 4e574b40c5e23919acc67d21ff07ca19 Text-delta-base-sha1: 125311903db82a22159cab9c1a0532625ca6f366 Text-content-length: 190 Text-content-md5: 117d9256268a43743b51b986f1b6f069 Text-content-sha1: 8ed9436f83fd222745f8cdad619f441338155717 Content-length: 231 K 15 cvs2svn:cvs-rev V 5 1.184 PROPS-END SVNPd%." if (!term->cfg.ansi_colour) tattr = (tattr & ~(ATTR_FGMASK | ATTR_BGMASK)) | ATTR_DEFFG | ATTR_DEFBG Node-path: putty/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ef1ba584b560c42d5be6fc2f2142c893 Text-delta-base-sha1: 9b1941d653a91a86f7513b05d5d2b343426b55c9 Text-content-length: 39 Text-content-md5: 1f013c4b5b15bdfc8730194efa2aa1bb Text-content-sha1: 52b08a967eda38fe14adf0c2811df4e1dc905cfc Content-length: 79 K 15 cvs2svn:cvs-rev V 4 1.10 PROPS-END SVN5e Rcansi "colours.ansi Revision-number: 4763 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 32 Another MacOS X patch, from RJK K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-09T19:50:24.000000Z PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 39 Text-delta: true Text-delta-base-md5: d7619a79f89e825e4243f223aba63eba Text-delta-base-sha1: 64fb2ac04922bbf694cef021e156651fd1923e06 Text-content-length: 64 Text-content-md5: 2178133c8f992bddf77a3692f8e6747f Text-content-sha1: e7c16321189aa7fac79c724edc1629bc4ea35f58 Content-length: 103 K 15 cvs2svn:cvs-rev V 3 1.9 PROPS-END SVN:k +@:
      wwv1xf7t9o1.fsf@rjk.greenend.org.uk Revision-number: 4764 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.873339Z PROPS-END Revision-number: 4765 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.883381Z PROPS-END Revision-number: 4766 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.895838Z PROPS-END Revision-number: 4767 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.905119Z PROPS-END Revision-number: 4768 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.915002Z PROPS-END Revision-number: 4769 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:10.924487Z PROPS-END Revision-number: 4770 Prop-content-length: 266 Content-length: 266 K 8 svn:date V 27 2004-11-11T09:40:50.000000Z K 7 svn:log V 165 I masked off LATTR_WRAPPED et al in do_text_internal(), but forgot to do the same in do_cursor(). Bet that's the cause of Andrey Borzenkov's cursor positioning bug. K 10 svn:author V 5 simon PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 41 Text-delta: true Text-delta-base-md5: acee4ee363e6f48e8a5f5c754962c85d Text-delta-base-sha1: 72f3d6abba3584d281acc27515f1c52f922955ae Text-content-length: 88 Text-content-md5: 737ef48693e43f419c37590df0217bd7 Text-content-sha1: 88cb36f8d078dea501695165a56d6f8320db9f75 Content-length: 129 K 15 cvs2svn:cvs-rev V 5 1.279 PROPS-END SVN mylattr &= LATTR_MODE,case VK_F2: index = 1; bre Revision-number: 4771 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:11.100273Z PROPS-END Revision-number: 4772 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:11.110619Z PROPS-END Revision-number: 4773 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:11.120393Z PROPS-END Revision-number: 4774 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:11.129897Z PROPS-END Revision-number: 4775 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:11.139758Z PROPS-END Revision-number: 4776 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:11.150078Z PROPS-END Revision-number: 4777 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:11.160444Z PROPS-END Revision-number: 4778 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2004-11-14T12:22:14.000000Z K 7 svn:log V 42 TortoiseSVN contains a TortoisePlink too. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 9d5aae35c89a822c764e175b2ff00ca4 Text-delta-base-sha1: e6d09d1a37de59d75ac7a79615599b669ec1a68d Text-content-length: 279 Text-content-md5: 140adcd1a0862ee5eb09c42358f92f4e Text-content-sha1: 3f973df45a321632262057c1b26d5c3b8688e8b6 Content-length: 319 K 15 cvs2svn:cvs-rev V 4 1.42 PROPS-END SVN` KK and
      TortoiseSVN, Windows Explorer frontends to CVS and Subversion respectively, use a modified Plink for SSH transport. Revision-number: 4779 Prop-content-length: 307 Content-length: 307 K 8 svn:date V 27 2004-11-15T11:10:36.000000Z K 7 svn:log V 206 Miloslav Cempirek Ing points out that we should return from sessionsaver_handler after processing a one-click saved session launch, to protect against accidentally calling dlg_end twice on the same dialog. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 3cd23b3985c73b402f06ce405b365f83 Text-delta-base-sha1: 6b54a0797bf6a8685a68886c646de8ceda7d58cc Text-content-length: 46 Text-content-md5: 74ec556db84757ea06c9abb275c5eab5 Text-content-sha1: 9870160b7967e3c270f29b278fbd675204992dfc Content-length: 86 K 15 cvs2svn:cvs-rev V 4 1.41 PROPS-END SVN(@  return Revision-number: 4780 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:11.292268Z PROPS-END Revision-number: 4781 Prop-content-length: 315 Content-length: 315 K 7 svn:log V 214 Mention that comp.terminals may also be a useful newsgroup. I've done this by centralising information about newsgroups in feedback.but and linking to that from elsewhere; I've also put in a link to Google Groups. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-15T15:57:28.000000Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 76a8ae84d193c75b22bbf76b34a09181 Text-delta-base-sha1: 248766fd3678cb5ff1bc9eb2d6fde56b432581be Text-content-length: 157 Text-content-md5: 3cce44c5852b0c7213f4ccc5a0516440 Text-content-sha1: 99f986b846b91d909a1694add42403c2a66181ac Content-length: 197 K 15 cvs2svn:cvs-rev V 4 1.83 PROPS-END SVN]l]1PO\versionid $Id: faq.but,v 1.83 2004/11/15 15:57:2one of the established newsgroups for this purpose (see \k{feedback-other-fora}) Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 0411ddb0e9fc7922da515daa62e3d2ad Text-delta-base-sha1: 148a334ec9cc5df83d71292a3046aee5cc225aeb Text-content-length: 903 Text-content-md5: 2df1f7abbdd24be86923d9ff23f81fe4 Text-content-sha1: bb82a340f0303aadb7cf044a574289977b0ff337 Content-length: 943 K 15 cvs2svn:cvs-rev V 4 1.20 PROPS-END SVN?-L)7KQ?VDT]I\JGU\versionid $Id: feedback.but,v 1.20 2004/11/15 15:57:28to a newsgroup (see \k{feedback-other-fora}), or some other means, then it newsgroups, or passed to a local S{feedback-other-fora} Other places to ask for help There are two Usenet newsgroups that are particularly relevant to the PuTTY tools: \b \W{news:comp.security.ssh}\c{comp.security.ssh}, for questions specific to using the SSH protocol; \b \W{news:comp.terminals}\c{comp.terminals}, for issues relating to terminal emulation (for instance, keyboard problems). If you don't have direct access to Usenet, you can access these newsgroups through Google Groups (\W{http://groups.google.com/}\cw{groups.google.com})a newsgroup (see \k{feedback-other-fora}) and seeinga newsgroup (see \k{feedback-other-fora}) and see if someone can explain a newsgroup (see \k{feedback-other-fora}) Revision-number: 4782 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:27.162879Z PROPS-END Revision-number: 4783 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:27.171900Z PROPS-END Revision-number: 4784 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:27.182379Z PROPS-END Revision-number: 4785 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:27.191823Z PROPS-END Revision-number: 4786 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2004-11-16T15:18:24.704407Z K 7 svn:log V 104 Remove outdated branches and tags, now we've migrated to Subversion and this is a meaningful operation. K 10 svn:author V 5 simon PROPS-END Node-path: putty-ben-mac-port Node-action: delete Node-path: putty-zlib-dll Node-action: delete Node-path: putty-ben-hacked-terminal Node-action: delete Node-path: putty-ben-scrollopt-for-simon Node-action: delete Node-path: putty-ben-early-mac-port Node-action: delete Node-path: putty-pre-blowfish Node-action: delete Revision-number: 4787 Prop-content-length: 381 Content-length: 381 K 8 svn:date V 27 2004-11-16T15:27:00.670127Z K 7 svn:log V 280 CVS revision numbers, stored as `cvs2svn:cvs-rev' properties, are a useful piece of history in this repository but we don't want to preserve their latest values on future commits. Accordingly, I'm deleting them from all active development (though not from past release branches). K 10 svn:author V 5 simon PROPS-END Node-path: putty/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/MODULE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/README.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/be_all.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/be_none.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/charset.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/enum.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/fromucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/internal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/localenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/macenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/mimeenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/sbcs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/sbcs.dat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/sbcsgen.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/slookup.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/toucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/utf8.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/charset/xenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/contrib/kh2reg.py Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/cproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/dialog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/dialog.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/index.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/licence.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/man-pg.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/man-pl.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/man-pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/man-psft.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/man-ptel.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/man-pter.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/man-putt.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/mancfg.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/manpages.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/site.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/int64.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/int64.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/ldisc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/ldiscucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macabout.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macevlog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macnoise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macpgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macpgkey.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macpgrid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/macucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/stricmp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/version.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mac/vsnprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/minibidi.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mksrcarc.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/nocproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/pageant.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/pageant.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/pageants.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/plink.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/pproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/psftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/putty.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/putty.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/puttycfg.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/puttygen.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/puttygen.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/puttymem.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/puttyps.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/resource.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/scp.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/scp.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshcrc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshcrcda.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshdssg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshrsag.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshsh512.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/tree234.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/gtkcols.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/gtkcols.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/gtkpanel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/gtkpanel.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/signal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxagentc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxnoise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxsel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/unix/xkeysym.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/version.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/wcwidth.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/website.url Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/wildcard.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/windefs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/winsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/winutils.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/MODULE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/README.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/be_all.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/be_none.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/licence.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/psftp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/int64.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/int64.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/pageant.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/pageant.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/pageants.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/plink.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/putty.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/putty.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/puttycfg.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/puttygen.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/puttygen.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/puttymem.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/resource.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/scp.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/scp.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshcrc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshcrcda.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshdssg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshrsag.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshsh512.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/tree234.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/version.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/wcwidth.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/website.url Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/wildcard.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/winutils.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.53/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/LATEST.VER Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/MODULE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/README.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/be_all.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/be_none.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/charset.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/enum.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/fromucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/internal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/localenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/macenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/mimeenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/sbcs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/sbcs.dat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/sbcsgen.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/slookup.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/toucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/utf8.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/charset/xenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/cmdgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/contrib/kh2reg.py Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/dialog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/dialog.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/index.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/licence.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/man-pg.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/man-pl.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/man-pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/man-psft.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/man-ptel.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/man-pter.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/man-putt.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/mancfg.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/manpages.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/psftp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/site.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/int64.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/int64.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/ldisc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/ldiscucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macabout.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macevlog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macnoise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macpgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macpgen.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macpgkey.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macpgrid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/macucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/stricmp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/version.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mac/vsnprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mksrcarc.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/mkunxarc.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/pageant.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/pageant.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/pageants.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/plink.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/pproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/psftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/putty.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/putty.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/puttycfg.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/puttygen.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/puttygen.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/puttymem.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/puttyps.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/resource.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/scp.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/scp.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshcrc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshcrcda.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshdssg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshrsag.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshsh512.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/tree234.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/gtkcols.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/gtkcols.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/gtkpanel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/gtkpanel.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/signal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/ux_x11.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxagentc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxnoise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxsel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/unix/xkeysym.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/version.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/wcwidth.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/website.url Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/wildcard.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/windefs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/winsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/winutils.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.55/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/CHECKLST.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/LATEST.VER Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/LICENCE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/MODULE Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/README.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/Recipe Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/be_all.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/be_none.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/be_nossh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/README Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/charset.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/enum.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/fromucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/internal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/localenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/macenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/mimeenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/sbcs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/sbcs.dat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/sbcsgen.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/slookup.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/toucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/utf8.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/charset/xenc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/cmdgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/cmdline.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/config.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/console.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/contrib/kh2reg.py Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/cproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/dialog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/dialog.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/Makefile Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/blurb.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/config.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/errors.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/faq.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/feedback.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/gs.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/index.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/intro.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/licence.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/man-pg.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/man-pl.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/man-pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/man-psft.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/man-ptel.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/man-pter.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/man-putt.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/mancfg.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/manpages.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/pageant.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/plink.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/pscp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/psftp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/pubkey.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/site.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/doc/using.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/import.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/int64.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/int64.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/ldisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/ldisc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/ldiscucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/logging.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/README.mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/mac.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/mac.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/mac_res.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macabout.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macevlog.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macnoise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macpgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macpgen.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macpgkey.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macpgrid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macresid.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/macucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/mtcpnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/otnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/stricmp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/version.r Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mac/vsnprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/misc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/misc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mkfiles.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mksrcarc.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/mkunxarc.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/network.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/nocproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/noise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/pageant.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/pageant.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/pageant.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/pageant.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/pageantc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/pageants.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/plink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/plink.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/portfwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/pproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/printing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/proxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/proxy.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/psftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/psftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/putty.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/putty.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/putty.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/puttycfg.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/puttygen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/puttygen.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/puttygen.mft Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/puttygen.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/puttymem.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/puttyps.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/raw.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/resource.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/rlogin.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/scp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/scp.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/scp.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/settings.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sftp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sizetip.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/ssh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/ssh.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshaes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshblowf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshbn.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshcrc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshcrcda.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshdes.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshdh.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshdss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshdssg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshmd5.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshprime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshpubk.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshrand.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshrsa.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshrsag.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshsh512.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshsha.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/sshzlib.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/storage.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/telnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/terminal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/terminal.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/testback.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/tree234.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/tree234.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unicode.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/gtkcols.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/gtkcols.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/gtkdlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/gtkpanel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/gtkpanel.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/pterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/ptermm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/pty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/signal.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/unix.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/ux_x11.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxagentc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxcons.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxgen.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxnoise.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxplink.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxsel.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/uxucs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/unix/xkeysym.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/version.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/wcwidth.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/website.url Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/wildcard.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/win_res.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/win_res.rc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/wincfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/winctrls.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/windefs.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/windlg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/window.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/winhelp.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/winmisc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/winnet.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/winsftp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/winstore.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/winstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/winutils.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-branch-0.56/x11fwd.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/docs.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/faq.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/feedback.pl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/keys/master-dsa.asc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/keys/master-rsa.asc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/keys/release-dsa.asc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/keys/release-rsa.asc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/keys/snapshot-dsa.asc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/keys/snapshot-rsa.asc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/keys.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/licence.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/maillist.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/mirror-wget.sh Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/putty.ico Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/sitestyle.css Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-website/team.html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/control/.cvsignore Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/control/spec Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/256-colours Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/accept-host-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/agentfwd-ssh.com Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ampersat-in-username Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ansisys-compat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/async-dns Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/auth-pref Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/avoid-msgbox Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/baltic-default-translation Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/banner-escape-codes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/bce-default-change Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/beepind-win2k Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/bidi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/black-pointer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/bold-font-colour Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/cmdline-any-option Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/cmdline-environ Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/cmdline-host-override Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/cmdline-x-display Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/colour-scheme Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/command-hooks Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/command-line Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/compress-binaries Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/compressed-scrollback Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/config-inheritance Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/config-locations Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/context-menu Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/control-slash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/control-window-pos Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/cooked-printer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/copyall-to-cursor Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/cryptoapi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ctrl-pgupdn Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/cygwin-clobbers-pageant Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/da-response Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/deccolm-cls Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/default-colours Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/disable-colour Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/disconnect Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/dll-frontend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/do-text-splitting Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/do-text-unicode Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/drag-drop Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/drop-banner Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/emacs-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/emulate-3-buttons Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/errmsg-full-stops Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ext-data-at-start Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/fatal-errors Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/font-overflow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/font-quality Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/fore-back Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/foundry-ignore-bug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/freebsd-4.6-ki-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/fullscreen-taskbar Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/function-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/function-keys-8bit Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/gui-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/gui-sftp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/hard-hangs Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/horiz-scroll Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/hostkey-policy Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/hostkey-prompt-type Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/hostname-whitespace Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/http-digestauth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/http-proxy-env Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/i18n Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/icon-title-default-change Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/idn Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/inactive-title Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/intel-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ip-tos Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ipv6-build Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ipv6-patch-update Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/key-formats Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/key-mapping Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/keyboard-copy Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/keyboard-problems Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/keyfile-diagnostic Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/keymap-switch Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/large-files Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/line-endings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/locking-settings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/log-flush Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/log-timestamp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/logging-save-default Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/long-usernames Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/many-sessions Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/mapvirtualkeyex Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/mazovia Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/mdpi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/menu-bar Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/meta-bit Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/modified-fkeys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/moon-on-stick Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/msproxy-denied Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/mud-client Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/multi-font Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/multiple-addresses Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/multiple-connections Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/netscreen-command Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/nonexistent-channel Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ntlm-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ntpd-slowdown Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/null-opaque-resize Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/offer-to-reset Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/osc Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pageant-activity-ind Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pageant-as-service Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pageant-async Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pageant-dirhandle Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pageant-hibernate Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pageant-key-mgmt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pageant-logging Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/passthru-default-printer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/paste-fidelity Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/paste-on-release Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/paste-semantics Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pc-speaker Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/plink-keepalives Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/plink-terminal Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/port-knocking Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/port-unix-gtk2 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/port-win32s Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/port-wince Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portable-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portfwd-at-start Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portfwd-corrupt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portfwd-dynamic Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portfwd-ftp Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portfwd-loopback-choice Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portfwd-multi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portfwd-open-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portfwd-range Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portfwd-reconf Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/portfwd-space Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ppk-empty-comment Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/print-screen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/printer-list Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/proxy Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/proxy-command Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/proxy-iprange Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/proxy-logging Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/proxy-lookup Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/proxy-password-prompt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/proxy-uninit-members Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pscp-check-first Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pscp-cmdline-port-bug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pscp-filemodes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pscp-memory-leak Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pscp-multi-remote-src Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pscp-restart Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pscp-select-backend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pscp-size-change Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pscp-stdout Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/psftp-multi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/psftp-paging Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/psftp-progress Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/psftp-pscp-ignore-load Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/psftp-speedups Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pterm-scrollopt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pterm-timer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pterm-windowid Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/pubkeyfile-and-pageant Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/putty-screen-frontend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/puttygen-accel-bogosity Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/puttygen-zero-div Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/reconnect-auto Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/reconnect-remember-password Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/regexp-logging Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/remember-password Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/remove-statics Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/reorder-sessions Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/resize Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/resize-altscr Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/resize-minimise Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/resize-no-truncate Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/resize-scroll-effects Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/reuse-windows Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/right-alt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/rlogin-blocked Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/rsa-non8mult-verify-fail Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/rsa-verify-failed Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/rsh-backend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/save-mid-session Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/save-scrollback Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/sco-ansi Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/screen-clear Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/scripting Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/scroll-button-hang Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/scrollbar-left Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/search-scrollback Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/securid Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/sel-colours Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/selection-pause Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/session-icon Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/sftp-backend-diagnostic Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/sftp-slow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/sgr-as-colours Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/sgr21 Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/shift-backspace Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/short-rsa2-key-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/slow-startup-printer Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/socks5-chap Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/srp-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh-default Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh-log-pw-blank Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh-remote-tunnel-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh-termspeed Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh-window-adjust Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh.com-userauth-refused Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh2-default Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh2-des-cbc-is-std Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh2-env-var Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh2-generality Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh2-kex-data Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh2-kex-repeat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh2-keyderive-nonbug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh2-only Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssh2.0.11-keyderive-nonbug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/sshcrcda-assertion-failed Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/ssl Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/startup-fullscreen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/startup-unselected Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/status-bar Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/strange-winsock-msg Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/subsystem-publickey Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/system-menu Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/system-tray Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/systray-breaks-ptr-hiding Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/tcp-keepalives Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/telnet-binary Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/telnet-resize-iac Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/telnet-url-userinfo Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/term-clear-scrollback Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/term-reset-title Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/terminal-emulations Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/terminal-fanout Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/terminal-modes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/terminfo Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/time_t-minus-one Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/toolbar Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/transparency Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/triple-click-wrap Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/unicode-combining Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/unicode-mappings Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/unicode-more-planes Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/unicode-select Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/unix-keepalives Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/unix-kex-packet Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/url-launching Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/vb-control Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/virtual-serial Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/virtuallock Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/vshell-no-bug-compat Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/vstudio-project Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/vt-utf8-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/vuln-modpow Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/vuln-passwd-memdump Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/vuln-ssh1-kex Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/vuln-ssh2-debug Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/vuln-sshredder Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/vuln-window-title Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/win-command-prompt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/win-dead-keys Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/win-randseed-location Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/win98-focus Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/win98-wheel Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/window-placement Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/windows-scrollopt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/winnet-if2lo Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/x11-auth Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/x11-default-screen Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/x11-proxy-crash Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/xp-shortcut Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/xp-stickykeys-breaks-capslock Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/xterm-keyboard Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Node-path: putty-wishlist/data/zmodem Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 31 Content-length: 31 D 15 cvs2svn:cvs-rev PROPS-END Revision-number: 4788 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2004-11-16T15:29:14.095995Z K 7 svn:log V 48 Remove .cvsignore files on all active branches. K 10 svn:author V 5 simon PROPS-END Node-path: putty/charset/.cvsignore Node-action: delete Node-path: putty/doc/.cvsignore Node-action: delete Node-path: putty/mac/.cvsignore Node-action: delete Node-path: putty/unix/.cvsignore Node-action: delete Node-path: putty/.cvsignore Node-action: delete Node-path: putty-branch-0.53/doc/.cvsignore Node-action: delete Node-path: putty-branch-0.53/.cvsignore Node-action: delete Node-path: putty-branch-0.55/charset/.cvsignore Node-action: delete Node-path: putty-branch-0.55/doc/.cvsignore Node-action: delete Node-path: putty-branch-0.55/mac/.cvsignore Node-action: delete Node-path: putty-branch-0.55/unix/.cvsignore Node-action: delete Node-path: putty-branch-0.55/.cvsignore Node-action: delete Node-path: putty-branch-0.56/charset/.cvsignore Node-action: delete Node-path: putty-branch-0.56/doc/.cvsignore Node-action: delete Node-path: putty-branch-0.56/mac/.cvsignore Node-action: delete Node-path: putty-branch-0.56/unix/.cvsignore Node-action: delete Node-path: putty-branch-0.56/.cvsignore Node-action: delete Node-path: putty-website/.cvsignore Node-action: delete Node-path: putty-wishlist/control/.cvsignore Node-action: delete Revision-number: 4789 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 54 Update PuTTY website to reflect Subversion migration. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-11-16T18:00:22.830408Z PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2d9541241d56904259ea50b57168e26d Text-delta-base-sha1: 8a5c331310e4de78d1ca89ee4598bbc257e367b3 Text-content-length: 1165 Text-content-md5: f5dbf0f4d8ba7bd8241d4c3d89a249a4 Text-content-sha1: 78c3f98987e7e5009186f21c21e64963b6d1c8c6 Content-length: 1165 SVN!5c6A8z'NSSubversion repository if you need up-to-date Unix SubversionSubversion repository directly.

      The Subversion URL you need for the PuTTY trunk development is svn://ixion.tartarus.org/main/putty. So you could check out the trunk version of PuTTY using a command such as svn co svn://ixion.tartarus.org/main/putty

      To check out branches of the code, replace putty with the branch name (such as putty-branch-0.56). You can see what branches exist using the command svn ls svn://ixion.tartarus.org/main.

      In case you aren't able to access the real PuTTY repository using Subversion over the network, we also provide a gzip-compressed Subversion dump file of the repository, updated every night. So if you want to browse PuTTY's revision history, you could download that, unpack it, and point a local Subversion client at it. Click here to download the dump file: putty-svn.dump.gz.

      Alternatively, you can browse the Subversion repository on the WWW, Subversion as its version control system. I'm afraid this means that anyone who was previously checking our source out of CVS will have to start checking it out using Subversion instead. Revision-number: 4790 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2004-11-16T18:01:39.691647Z K 7 svn:log V 53 Various changes related to the Subversion migration. K 10 svn:author V 5 simon PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c114e72f5f7ba80a5844e94c6fda4700 Text-delta-base-sha1: db84eb8f1711ebb31c8f9bfcfcd4b875ed29592e Text-content-length: 89 Text-content-md5: b8ee8272db345b7bb87714ee7b8106cb Text-content-sha1: fc0d299a249f6ee531fc83253bc3501ee4bba992 Content-length: 89 SVN  CcCk Subversion, you'll have to generate the Makefiles yourself -- see Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3cce44c5852b0c7213f4ccc5a0516440 Text-delta-base-sha1: 99f986b846b91d909a1694add42403c2a66181ac Text-content-length: 119 Text-content-md5: 7c6d35d47fbb6993b0f1fcf025fad48f Text-content-sha1: 8a4d99a9b81c05527a124e9625f19de943f90c15 Content-length: 119 SVNld ]%=Ob \versionid $Idwww.tartarus.org/~simon-anonsvn/viewcvs.cgi/putty/contrib/kh2reg.py?view=markup Node-path: putty/mksrcarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7b4d2beb2bb90854b9a690c4a61928d0 Text-delta-base-sha1: d8cad84d5ba707210b1bfa2913fdb6dfbbd0072b Text-content-length: 24 Text-content-md5: 2cc7432e39a2a41b5ab7ac2d267322da Text-content-sha1: f798e6c2a8b0a27cb1611e3f11df2d5de6847889 Content-length: 24 SVNv ^.svn Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3dcf3c4e9645c5f562f4ed2b9144ad0c Text-delta-base-sha1: 3eb51720da8cf184e35af0b677f5f7af6fbb1473 Text-content-length: 25 Text-content-md5: 49e5b438c37e09f4f76d6204bc661d19 Text-content-sha1: e3fc7773dca94fc64faa9e39cf0b8910a146fffe Content-length: 25 SVN6T Mi.svn Revision-number: 4791 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2004-11-16T18:04:48.890017Z K 7 svn:log V 56 Update the wishlist to reflect migration to Subversion. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f3a7db4e6c7f371c60c8807b2562f07f Text-delta-base-sha1: dfce161f345e42aa029a8c46957f635541c90d76 Text-content-length: 231 Text-content-md5: 80ff045a32a79941967b4ae1337223f3 Text-content-sha1: ddf7cd6535fcb81fd6937193d75b965d1e4232b8 Content-length: 231 SVNv_;G+mS80Hd#! /usr/bin/perl # $Idsvn" => `svn infosvninfo = $bugs{$bugname}->{"svnwww.tartarus.org/~simon-anonsvn/viewcvs.cgisvninfo ne "" and $svninfo =~ /^Last Changed Date:\s+([^\(]+)\s+(\(.*)? Node-path: putty-wishlist/data/accept-host-keys Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0422d10be6896151e1bb5b0df5ba249b Text-delta-base-sha1: 84115f0edfe0d0d9b43ed5b0e81a8a223a0ba9ae Text-content-length: 64 Text-content-md5: 177cf0e408c4803eda23998ece4667f0 Text-content-sha1: cb5b697a9c68e491239133e9c1fab26e8f49af77 Content-length: 64 SVN +l|www.tartarus.org/~simon-anonsvn/viewcvs.cgi Node-path: putty-wishlist/data/cryptoapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f2dc2ae7da4dbf9d45d3f30edfc7ffda Text-delta-base-sha1: c2ba84462c0f581ab8fb6db5777981c6bf4da63e Text-content-length: 98 Text-content-md5: 0acf3886c5ff2f9ca2e95b815b8ec5ee Text-content-sha1: 2c167a55d222bdb21f6995acfee9fbb6a44e3414 Content-length: 98 SVN^| L*LXwww.tartarus.org/~simon-anonsvn/viewcvs.cgi/putty/mscrypto.c?rev=1308">some Node-path: putty-wishlist/data/ssh2.0.11-keyderive-nonbug Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9907cbde21ebdc70f624745ca18bcf08 Text-delta-base-sha1: 418ff19f56d7a2bfd76f66974d03a9a773c16400 Text-content-length: 98 Text-content-md5: 7297b00dfc74372293208a2670372145 Text-content-sha1: 7c13311d2509a75346e2879122f5b74160af1108 Content-length: 98 SVNu L L9rZvBwindows/Makefile.vc !makefile vcproj windows/MSVC !makefile cygwin windows/Makefile.cyg !makefile borland windows/Makefile.bor !makefile lcc windows/windows..\version.c !end !specialobj vc version !begin cygwin version.o: FORCE FORCE: $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) $(VER) -c ../version.c !end !specialobj cygwin version !begin borland version.obj: FORCE FORCE: bcc32 $(FWHACK) $(VER) $(CFLAGS) /c ..\version.c !end !specialobj borland version !begin lcc version.o: FORCE FORCE: lcc $(FWHACK) $(VER) $(CFLAGS) /c ..\version.c !end !specialobj lcc version!specialobj gtk versionwinucs winprintwinnoise winpgwinplink wincons NONSSH WINSSH BE_ALL logging WINMISC + plink.res LIBS pscp : [C] scp winsftp winconswincons WINSSH BE_SSH SFTP WINMISC scp.res LIBS pageant : [G] winpgnt sshrsa sshpubk sshdes sshbn sshmd5 version tree234 + misc sshaes sshsha winpgntc sshdss sshsh512 winutils winmisc + pageant.res LIBS puttygen : [G] winpgen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version + sshrand win Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9a94782c084b66e83582c41a9e39745f Text-delta-base-sha1: a1665269198a600ed4002589e557bee6e93e731b Text-content-length: 1910 Text-content-md5: c86bf08bf65b9d0d851e26e15ba09c5a Text-content-sha1: c0e9141142ca7e7380621886b5da88a9c97d890a Content-length: 1910 SVN }D# @ep`|+ #6+OmgvoshvVn+xX}K1,x\L[Bn&BABzSBL]v3G;ye3!3w8wgvw4Xspecialobj" and &mfval($_[1])) { $specialobj{$_[1]}->{$_[2]} = 1 while (($i = index $path, $sep) >= 0 || ($j = index $path, "/") >= 0) { if ($i >= 0 and ($j < 0 or $i < $j)) { $path = substr $path, ($i + length $sep); } else { $path = substr $path, ($j + 1); }mftynext if $specialobj{$mftyp}->{$i};, "cygwin if ($d->{obj} =~ /\.res\.o$/) { print "\t\$(RC) \$(FWHACK) \$(RCFL) \$(RCFLAGS) ".$d->{deps}->[0]." ".$d->{obj}."\n\n"; } else { print "\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c ".$d->{deps}->[0]."\n\n"; }, "borland" . (join " ", map {"-I$dirpfx$_"} @srcdirs) . " /D_WINDOWS /D_WIN32_WINDOWS=0x401 /DWINVER=0x401\n". "LFLAGS = /incremental:no /fixed\n". "\n". , "vc")) { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; if ($d->{obj} =~ /.obj$/) { print "\tcl \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) /c ".$d->{deps}->[0],"\n\n"; } else { print "\trc \$(FWHACK) \$(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 ".$d->{deps}->[0],"\n\n"; } $dirpfx = &dirpfx($makefiles{'vcproj'}, "\\");$dirpfx, "\\", "vcproj". (join " ", map {"/I \"..\\..\\$dirpfx$_\""} @srcdirs) . "". (join " ", map {"/I \"..\\..\\$dirpfx$_\""} @srcdirs) . "". (join " ", map {"/I \"..\\..\\$dirpfx$_\""} @srcdirs) . "". (join " ", map {"/I \"..\\..\\$dirpfx$_\""} @srcdirs) . ", "gtk, "mpw, "mpw, "mpw, "lcc if ($d->{obj} =~ /\.obj$/) { print &splitline("\tlcc -O -p6 \$(COMPAT) \$(FWHACK)". " \$(XFLAGS) \$(CFLAGS) ".$d->{deps}->[0],69)."\n"; } else { print &splitline("\tlrc \$(FWHACK) \$(RCFL) -r ".$d->{deps}->[0],69)."\n"; } Node-path: putty/windows Node-kind: dir Node-action: add Prop-content-length: 241 Content-length: 241 K 10 svn:ignore V 208 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp *.tds *.td2 *.map Makefile.bor Makefile.cyg Makefile.vc Makefile.lcc MSVC *.log *.GID local Output *.DSA *.RSA *.cnt *.hlp .bmake PROPS-END Node-path: putty/windows/pageant.ico Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/pageant.ico Text-copy-source-md5: 8c20e7258f00f854018808c30d31dcbd Text-copy-source-sha1: 219f03de1754f86888c796e7c3a209c4a76665ab Node-path: putty/windows/pageant.mft Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/pageant.mft Text-copy-source-md5: 86486a86dc0237ac625307f5a25dabd6 Text-copy-source-sha1: c6310738dfebd3321a3c27df665bcef363d3919c Node-path: putty/windows/pageant.rc Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/pageant.rc Text-copy-source-md5: 29f622ff0beaf3759db2f114755c94c5 Text-copy-source-sha1: fbb9e1f963d43ba8241802db493451e2a7a57690 Node-path: putty/windows/pageants.ico Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/pageants.ico Text-copy-source-md5: fe0b946e4fcf82c5462e395b52615006 Text-copy-source-sha1: cbb00a9216fb9cb4be47454a1b94bb3f1770a07d Node-path: putty/windows/plink.rc Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/plink.rc Text-copy-source-md5: a4f6e7df7066180cf02df9f0e8b8dea8 Text-copy-source-sha1: c9dd6df3ed1161f08be3dbc37676f171d6ad0223 Node-path: putty/windows/putty.ico Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/putty.ico Text-copy-source-md5: 1eeb6033797eebd2e3781a4228a05e22 Text-copy-source-sha1: 7615b8c192f81b6416b8ede7d82bad03eb6992ea Node-path: putty/windows/putty.iss Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/putty.iss Text-copy-source-md5: 7f049844d1355bac2febd62e3867a572 Text-copy-source-sha1: 0fef9ff10c0a5c5d01f10498fc55b32b4663264c Text-delta: true Text-delta-base-md5: 7f049844d1355bac2febd62e3867a572 Text-delta-base-sha1: 0fef9ff10c0a5c5d01f10498fc55b32b4663264c Text-content-length: 2097 Text-content-md5: 752ad719e5fdf43c8e2837ac55b6af39 Text-content-sha1: a1f92fe2455bd30af81e1833f403ba4980304974 Content-length: 2097 SVNV/vE@uMj?F]fyy; -*- no -*- ; putty.iss ; ; -- Inno Setup installer script for PuTTY and its related tools. ; ; TODO for future releases: ; ; - It would be neighbourly to set up an [UninstallRun] entry that ran ; some close cousin of `putty -cleanup', only it should prompt first ; in case the user wants to keep stuff. And make the `leave it alone' ; button the DEFAULT. And perhaps warn that on NT-style systems not ; everything will be caught by this. ; ; - The Quick Launch bar is an interesting thought. Certainly a fair ; number of people actually _believe_ my silly joke about how PuTTY ; is the only thing that makes Windows usable, so perhaps they'd like ; that. Unchecked by default, though, I think. ; * does this need to be conditional on the Windows version? [Setup] AppName=PuTTY AppVerName=PuTTY version 0.56 DefaultDirName={pf}\PuTTY DefaultGroupName=PuTTY UninstallDisplayIcon={app}\putty.exe ChangesAssociations=yes Compression=zip/9 [Files] Source: "putty.exe"; DestDir: "{app}" Source: "pageant.exe"; DestDir: "{app}" Source: "puttygen.exe"; DestDir: "{app}" Source: "pscp.exe"; DestDir: "{app}" Source: "psftp.exe"; DestDir: "{app}" Source: "plink.exe"; DestDir: "{app}" Source: "website.url"; DestDir: "{app}" Source: "doc\putty.hlp"; DestDir: "{app}" Source: "doc\putty.cnt"; DestDir: "{app}" Source: "LICENCE"; DestDir: "{app}" Source: "README.txt"; DestDir: "{app}"; Flags: isreadme [Icons] Name: "{group}\PuTTY Manual"; Filename: "{app}\putty.hlp"; Tasks: startmenu Name: "{group}\PuTTY Web Site"; Filename: "{app}\website.url"; Tasks: startmenu Name: "{group}\PSFTP"; Filename: "{app}\psftp.exe"; Tasks: startmenu Name: "{group}\PuTTYgen"; Filename: "{app}\puttygen.exe"; Tasks: startmenu Name: "{group}\Pageant"; Filename: "{app}\pageant.exe"; Tasks: startmenu [Tasks] Name: startmenu; Description: "Create a &Start Menu group" Name: desktopicon; Description: "Create a &desktop icon for PuTTY" Name: associate; Description: "&Associate .PPK files (PuTTY Private Key) with Pageant" [Registry] Node-path: putty/windows/putty.mft Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/putty.mft Text-copy-source-md5: 0f5778c606c2ba21e8a3e8c3581f1b95 Text-copy-source-sha1: 6efed928aacfc8d1858ddb74b26cd09ff31eeaf1 Node-path: putty/windows/puttycfg.ico Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/puttycfg.ico Text-copy-source-md5: 7595dddf6c3bef49e18ba68cddce4437 Text-copy-source-sha1: ebf8073296accd6f1057063131ba8f4ff2289843 Node-path: putty/windows/puttygen.ico Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/puttygen.ico Text-copy-source-md5: 42b6ba5e5c543bac15811a1768e0f6fe Text-copy-source-sha1: 071b7f309749c0546ddf19dc43313011a50c40b7 Node-path: putty/windows/puttygen.mft Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/puttygen.mft Text-copy-source-md5: 4298e9220a8f1e5020ccb77b39372f8d Text-copy-source-sha1: 7623bd0ca9c71663cdf4058ca52354529f2ddd76 Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/puttygen.rc Text-copy-source-md5: 2e441f0eccd8973450f5a4c338f5b23c Text-copy-source-sha1: 5a861124f14f23ea1a025f703b5799783a34227d Node-path: putty/windows/scp.ico Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/scp.ico Text-copy-source-md5: 401b5a0ee63cc6d9d0346d2c1270f718 Text-copy-source-sha1: 14176796b0ca4e635d0a4757f80ea1198d1de089 Node-path: putty/windows/scp.rc Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/scp.rc Text-copy-source-md5: 3f5ca2ffc5a0ab8ce79ec50398e0ab40 Text-copy-source-sha1: e96499dad88d0e1819c6151109efae012beee0cd Node-path: putty/windows/sizetip.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/sizetip.c Text-copy-source-md5: c86af30d03fa765946a7ffd0642d31dd Text-copy-source-sha1: 78a680fb4fafb9303325e4fc267e4d990401cf79 Node-path: putty/windows/website.url Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/website.url Text-copy-source-md5: bf666ba92bddcb14d76c8e1c722bd773 Text-copy-source-sha1: af99cd3aff44e7776226c97ba5be6bdeecb2d7e1 Text-delta: true Text-delta-base-md5: bf666ba92bddcb14d76c8e1c722bd773 Text-delta-base-sha1: af99cd3aff44e7776226c97ba5be6bdeecb2d7e1 Text-content-length: 114 Text-content-md5: c2066d79f529d2c3c5abd6bba037cbdf Text-content-sha1: a766fadec39883ab96decfe10087b398853b6a09 Content-length: 114 SVNiggg[InternetShortcut] URL=http://www.chiark.greenend.org.uk/~sgtatham/putty/ Node-path: putty/windows/win_res.h Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/win_res.h Text-copy-source-md5: 398e0c61a5af9f8b92bfdadb527a5d60 Text-copy-source-sha1: 97138145f0991d49cb4eecf66eba9f36851e9ec5 Node-path: putty/windows/win_res.rc Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/win_res.rc Text-copy-source-md5: 19fa31ead42777fde5a53d56fe7f40d7 Text-copy-source-sha1: 514b520a18b36234c60fb2987d3614b56d8eaea6 Node-path: putty/windows/wincfg.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/wincfg.c Text-copy-source-md5: 2385e6563f841f21716f20b84c026451 Text-copy-source-sha1: 0c8831637beb5f68f15d6f38a8cc1f64658778ea Node-path: putty/windows/wincons.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/console.c Text-copy-source-md5: e5ff68ff8d4cf1183cade3dc1fab19c1 Text-copy-source-sha1: 0d733be859f3ad83f0f3b9afc1d2b1f7cefa0954 Node-path: putty/windows/winctrls.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/winctrls.c Text-copy-source-md5: 79aef269903b7edcdbafa92559e12f93 Text-copy-source-sha1: 8fe0869730b4b5900a404fd8c7d490c47db6d34e Node-path: putty/windows/windefs.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/windefs.c Text-copy-source-md5: c56fe4aa6038a0a2d00634883c7dc966 Text-copy-source-sha1: cf563519f86db9ed4ebfe7e9c1016e80b4f19f21 Node-path: putty/windows/windlg.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/windlg.c Text-copy-source-md5: bd843c9a975a6e5978decf06d3c4e89c Text-copy-source-sha1: a77b06b777c419f18458c5d7469004cfafcc01af Node-path: putty/windows/window.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/window.c Text-copy-source-md5: 737ef48693e43f419c37590df0217bd7 Text-copy-source-sha1: 88cb36f8d078dea501695165a56d6f8320db9f75 Node-path: putty/windows/winhelp.h Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/winhelp.h Text-copy-source-md5: 1f013c4b5b15bdfc8730194efa2aa1bb Text-copy-source-sha1: 52b08a967eda38fe14adf0c2811df4e1dc905cfc Node-path: putty/windows/winmisc.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/winmisc.c Text-copy-source-md5: 1e0b6588a3f9ef1d240277ded04cc473 Text-copy-source-sha1: 0179b8a30fb8055e82bb36fa57669ec6d8a4ddd5 Node-path: putty/windows/winnet.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/winnet.c Text-copy-source-md5: e4e38db1d3d9d432e7909b86356e9e69 Text-copy-source-sha1: 3dee1b618018d5173f0abd3870d48f45a5fc23f9 Node-path: putty/windows/winnoise.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/noise.c Text-copy-source-md5: 235d5bb01439e9a477e72bd5d14f31fd Text-copy-source-sha1: 0907db6fcf2f96dbb45053eb6b84692f42c30d01 Node-path: putty/windows/winpgen.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/puttygen.c Text-copy-source-md5: 5a26df40911f0e4242a6291ff340ae51 Text-copy-source-sha1: ceec8a8291ec3459db65791bcaf0e548d02a6d9e Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/pageant.c Text-copy-source-md5: 30517a31d2e25ee3ac6324531837c6f7 Text-copy-source-sha1: 997984396ae0ecc7be72e87d7fe3542832d79307 Node-path: putty/windows/winpgntc.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/pageantc.c Text-copy-source-md5: 1e7acb8f58b26de2b36b4e0fdab740f7 Text-copy-source-sha1: 62e962c364146e2875cefcf4ffbed1ac14622bcb Node-path: putty/windows/winplink.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/plink.c Text-copy-source-md5: 3ef83c8baec8e6f253872b345a54a2a3 Text-copy-source-sha1: 814cd1120eea9baa9b2f176bc2c1c3d04cc1d2fc Node-path: putty/windows/winprint.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/printing.c Text-copy-source-md5: f868f84898b4ac8fb9ddb1efc92976eb Text-copy-source-sha1: 0bfecca58d05227cf4cf9fcc8826167b0872bbe0 Node-path: putty/windows/winsftp.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/winsftp.c Text-copy-source-md5: 84e6b047179bc4f041e7b666ca1384da Text-copy-source-sha1: c0209d49ef37c0a4914f9f446d6703c4731de642 Node-path: putty/windows/winstore.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/winstore.c Text-copy-source-md5: 200ec902f5b2d9a1ef9cae5dadf99685 Text-copy-source-sha1: 2cd152f662309f119efbdba4d8bcfb0640462a58 Node-path: putty/windows/winstuff.h Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/winstuff.h Text-copy-source-md5: ec449f614db330ae182c5b31d6fdb0c8 Text-copy-source-sha1: dea0516ecff575e46ac55a1888c2b037484892ce Node-path: putty/windows/winucs.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/unicode.c Text-copy-source-md5: e11a5caf963b50356a25df235b112961 Text-copy-source-sha1: 1cd437a85a1e0e9bc01d3cc7ae01b4cf36aab853 Node-path: putty/windows/winutils.c Node-kind: file Node-action: add Node-copyfrom-rev: 4791 Node-copyfrom-path: putty/winutils.c Text-copy-source-md5: 32668a82e18f9001c057a670a33903f4 Text-copy-source-sha1: 3d0a4a20d8ad8bb79fb56405e4a2efd62947bbf5 Node-path: putty/puttycfg.ico Node-action: delete Node-path: putty/plink.rc Node-action: delete Node-path: putty/puttygen.rc Node-action: delete Node-path: putty/pageant.rc Node-action: delete Node-path: putty/putty.iss Node-action: delete Node-path: putty/console.c Node-action: delete Node-path: putty/winnet.c Node-action: delete Node-path: putty/winctrls.c Node-action: delete Node-path: putty/window.c Node-action: delete Node-path: putty/scp.rc Node-action: delete Node-path: putty/winstore.c Node-action: delete Node-path: putty/winstuff.h Node-action: delete Node-path: putty/wincfg.c Node-action: delete Node-path: putty/winutils.c Node-action: delete Node-path: putty/puttygen.mft Node-action: delete Node-path: putty/pageant.mft Node-action: delete Node-path: putty/windlg.c Node-action: delete Node-path: putty/unicode.c Node-action: delete Node-path: putty/win_res.rc Node-action: delete Node-path: putty/putty.mft Node-action: delete Node-path: putty/winsftp.c Node-action: delete Node-path: putty/windefs.c Node-action: delete Node-path: putty/puttygen.ico Node-action: delete Node-path: putty/pageant.ico Node-action: delete Node-path: putty/winmisc.c Node-action: delete Node-path: putty/winhelp.h Node-action: delete Node-path: putty/win_res.h Node-action: delete Node-path: putty/scp.ico Node-action: delete Node-path: putty/noise.c Node-action: delete Node-path: putty/plink.c Node-action: delete Node-path: putty/putty.ico Node-action: delete Node-path: putty/pageant.c Node-action: delete Node-path: putty/puttygen.c Node-action: delete Node-path: putty/website.url Node-action: delete Node-path: putty/pageantc.c Node-action: delete Node-path: putty/sizetip.c Node-action: delete Node-path: putty/pageants.ico Node-action: delete Node-path: putty/printing.c Node-action: delete Revision-number: 4793 Prop-content-length: 254 Content-length: 254 K 8 svn:date V 27 2004-11-16T23:26:22.186331Z K 7 svn:log V 153 Fix Windows installer script: the paths were wrong after the directory reorganisation, and also the EOL style needs to be CRLF or Inno Setup gets upset. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 38 Text-delta: true Text-delta-base-md5: 752ad719e5fdf43c8e2837ac55b6af39 Text-delta-base-sha1: a1f92fe2455bd30af81e1833f403ba4980304974 Text-content-length: 2291 Text-content-md5: b92ec17feb7769f6eded47a931daf4b2 Text-content-sha1: 89ae7f5a9a89210f83dbfdbfc0fd6847e53e3e4e Content-length: 2329 K 13 svn:eol-style V 4 CRLF PROPS-END SVNV /8H|+K<  #+{<; -*- no -*- ; putty.iss ; ; -- Inno Setup installer script for PuTTY and its related tools. ; ; TODO for future releases: ; ; some close cousin of `putty -cleanup', only it should prompt first ; in case the user wants to keep stuff. And make the `leave it alone' ; button the DEFAULT. And perhaps warn that on NT-style systems not ; everything will be caught by this. ; ; - The Quick Launch bar is an interesting thought. Certainly a fair ; number of people actually _believe_ my silly joke about how PuTTY ; is the only thing that makes Windows usable, so perhaps they'd like ; that. Unchecked by default, though, I think. ; * does this need to be conditional on the Windows version? [Setup] AppName=PuTTY AppVerName=PuTTY version 0.56 DefaultDirName={pf}\PuTTY DefaultGroupName=PuTTY UninstallDisplayIcon={app}\putty.exe ChangesAssociations=yes Compression=zip/9 [Files] Source: "putty.exe"; DestDir: "{app}" Source: "pageant.exe"; DestDir: "{app}" Source: "puttygen.exe"; DestDir: "{app}" Source: "pscp.exe"; DestDir: "{app}" Source: "psftp.exe"; DestDir: "{app}" Source: "plink.exe"; DestDir: "{app}" Source: "website.url"; DestDir: "{app}" Source: "..\doc\putty.hlp"; DestDir: "{app}" Source: "..\doc\putty.cnt"; DestDir: "{app}" Source: "..\LICENCE"; DestDir: "{app}" Source: "..\README.txt"; DestDir: "{app}"; Flags: isreadme [Icons] Name: "{group}\PuTTY"; Filename: "{app}\putty.exe"; Tasks: startmenu Name: "{group}\PuTTY Manual"; Filename: "{app}\putty.hlp"; Tasks: startmenu Name: "{group}\PuTTY Web Site"; Filename: "{app}\website.url"; Tasks: startmenu Name: "{group}\PSFTP"; Filename: "{app}\psftp.exe"; Tasks: startmenu Name: "{group}\Pageant"; Filename: "{app}\pageant.exe"; Tasks: startmenu Name: "{userdesktop}\PuTTY"; Filename: "{app}\putty.exe"; Tasks: desktopicon [Tasks] Name: startmenu; Description: "Create a &Start Menu group" Name: desktopicon; Description: "Create a &desktop icon for PuTTY" Name: associate; Description: "&Associate .PPK files (PuTTY Private Key) with Pageant" [Registry] Root: HKCR; Subkey: "PuTTYPrivateKey\shell\edit"; ValueType: string; ValueName: ""; ValueData: "&Edit"; Tasks: associate Revision-number: 4794 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2004-11-16T23:32:57.336972Z K 7 svn:log V 48 Some tweaks for Subversion and windows/ subdir. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 23ac1259565cc0399b63cfab9724282a Text-delta-base-sha1: a595ada06828dcd5b75f0fb2cd9b20666ea2af7c Text-content-length: 326 Text-content-md5: db5516928bb1fe22b5e75bea21413ecd Text-content-sha1: 3ccd894ba4561716f1ac30d9103f8c22e6218ece Content-length: 326 SVNU9a{r {}*; l~Cp22crwindows/pageantdowsdows/win_resmac/mac_res.r - putty/unix/gtkdlg. at all - all version numbers were passed into the build system on the compiler command line, and the _only_ place version numbers showed up in the source fileschecked inwindowson the _trunk_ Revision-number: 4795 Prop-content-length: 118 Content-length: 118 K 7 svn:log V 18 s/CVS/Subversion/ K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-16T23:56:00.883956Z PROPS-END Node-path: putty-website/keys.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7396874fbbda7408c90ed4a439aba7a4 Text-delta-base-sha1: c6e876893ce6893c9b1c78464b5ad85436065045 Text-content-length: 31 Text-content-md5: 4db142a29f2d61e88fb03d34c176b3d0 Text-content-sha1: 0d2dc238b4863ae6f833d51312f29287b014be45 Content-length: 31 SVN ]1`Subversion Revision-number: 4796 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2004-11-16T23:58:25.135528Z K 7 svn:log V 27 pedantic s/CVS/Subversion/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7c6d35d47fbb6993b0f1fcf025fad48f Text-delta-base-sha1: 8a4d99a9b81c05527a124e9625f19de943f90c15 Text-content-length: 35 Text-content-md5: ca6f754210f841e9b22ea7bad7724a72 Text-content-sha1: d9d48d115e595da39257f92fbe10809e6b44fe64 Content-length: 35 SVNdk /22Subversion Revision-number: 4797 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2004-11-17T08:02:01.409182Z K 7 svn:log V 46 Fix mksrcarc.sh for directory reorganisation. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mksrcarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2cc7432e39a2a41b5ab7ac2d267322da Text-delta-base-sha1: f798e6c2a8b0a27cb1611e3f11df2d5de6847889 Text-content-length: 61 Text-content-md5: c6104fbb02aeb69718af061c9773109e Text-content-sha1: afe203e03da33651adfd63822924ca0e1767ac31 Content-length: 61 SVN4 (n~windows/*.ico windows/putty.iss windows/ Revision-number: 4798 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:34.374846Z PROPS-END Revision-number: 4799 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:34.384311Z PROPS-END Revision-number: 4800 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:34.402824Z PROPS-END Revision-number: 4801 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:34.415697Z PROPS-END Revision-number: 4802 Prop-content-length: 221 Content-length: 221 K 8 svn:date V 27 2004-11-17T16:45:05.397937Z K 7 svn:log V 120 Summary: Problems with host name resolution on Win95; WinSock 2 implicated? Absent-in: 0.52 0.53b Present-in: 0.54 0.56 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win95-resolution Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1085 Text-content-md5: e4cd86a72b756b61b946874c05a91072 Text-content-sha1: e1ce050192df494a9106bfe584ca80f7ad322f90 Content-length: 1095 PROPS-END SVN///Summary: Problems with host name resolution on Win95; WinSock 2 implicated? Absent-in: 0.52 0.53b Present-in: 0.54 0.56 Content-type: text/x-html-body

      We've had a couple of reports that recent versions of PuTTY have trouble resolving hostnames, while other apps such as Windows Telnet, and old versions of PuTTY, work fine. However, the only Win95 system I (JTN) have access to appears to work fine in this regard; on that system the Windows Sockets 2 upgrade is not installed, whereas on at least one of the problem systems WinSock2 does appear to be installed. (We changed to dynamically loading WinSock 2 where available in all applications between 0.53b and 0.54; previously all the apps except Plink linked against WinSock 1.)

      The error reported is "ssh_init: Host does not exist".

      Reports:

      • E1Bq1Ni-00053V-00@smtp6.mindspring.com (looks like WinSock 2 is installed)
      • Pine.SOL.3.96.1040920100623.8845A-100000@langs, perhaps
      • 20041115005023.GA28326@radon.dcs.kcl.ac.uk
      Revision-number: 4803 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:34.532338Z PROPS-END Revision-number: 4804 Prop-content-length: 966 Content-length: 966 K 8 svn:date V 27 2004-11-17T18:16:59.111894Z K 7 svn:log V 865 Now we use Subversion, it seems excessive to have an individual $Id$ line for every single .but file at the bottom of each page of the HTML PuTTY docs. However, we can't _always_ replace that with a single SVN revision, because there isn't always one available (SVN still allows mixed working copies in which some files are deliberately checked out against a different revision). Hence, here's a mechanism for doing better. It uses `svnversion .' to determine _whether_ a single revision number adequately describes the current directory, and replaces all the version IDs with that if so. If it can't do that, it uses the version IDs as before. Also, this allows an explicit version string to be passed on the make command line which will override _both_ these possibilities, so that release documentation can be clearly labelled with the release version number. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db5516928bb1fe22b5e75bea21413ecd Text-delta-base-sha1: 3ccd894ba4561716f1ac30d9103f8c22e6218ece Text-content-length: 214 Text-content-md5: 82c081094250f2eaff1b5af4e6345aaa Text-content-sha1: 509ee4be5ab31f730b4cbaadab0027f7cba2b378 Content-length: 214 SVN> > >s Define VERSION on the make command line to override the version strings, since Subversion revision numbers are less meaningful on a tag. + make -C doc VERSION="PuTTY release 0.XX" Node-path: putty/doc Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 88 Content-length: 88 K 10 svn:ignore V 56 *.html *.txt *.cnt *.hlp *.gid *.GID *.log *.1 vstr.but PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb4d9946af479b2ac3f0bcca9fbb3ae1 Text-delta-base-sha1: 75442078cacc5ad52ccf6a6e84637ada1a540b0a Text-content-length: 1077 Text-content-md5: 171549d8ba8f537238d3ccca43547920 Text-content-sha1: 38ac21f04a6be6a411edbcbb619f1d220bf59c63 Content-length: 1077 SVNMM~ "*all: man index.html # Decide on the versionid policy. # # If the user has passed in $(VERSION) on the command line (`make # VERSION="Release 0.56"'), we use that as an explicit version # string. Otherwise, we use `svnversion' to examine the checked-out # documentation source, and if that returns a single revision # number then we invent a version string reflecting just that # number. Failing _that_, we resort to versionids.but which shows a # $Id for each individual file. # # So here, we define VERSION using svnversion if it isn't already # defined ... ifndef VERSION SVNVERSION=$(shell test -d .svn && svnversion .) BADCHARS=$(findstring :,$(SVNVERSION))$(findstring S,$(SVNVERSION)) ifeq ($(BADCHARS),) ifneq ($(SVNVERSION),) VERSION=Built from revision $(patsubst M,,$(SVNVERSION)) endif endif endif # ... and now, we condition our build behaviour on whether or not # VERSION _is_ defined. ifdef VERSION VERSIONIDS=vstr vstr.but: FORCE echo \\versionid $(VERSION) > vstr.but FORCE:; else VERSIONIDS=vids endif $(VERSIONIDS) vstr.but Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cf206cc65e9dfde91db0447dad5b83b Text-delta-base-sha1: e056009a19a93d718e169ebd34af40435221a4a9 Text-content-length: 57 Text-content-md5: 80ff0598e4a0e29a2a0c174e2dddfce4 Text-content-sha1: 85781bd35948bfc44aec4cddabb20c4fe36db09a Content-length: 57 SVNu\)3\define{versionidblurb} \versionid $Id$ Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e3f36f26c20ecc4489c70453144d822c Text-delta-base-sha1: 5c78609fec4ff9ac056c725b4b8f9b0dd645c7b8 Text-content-length: 97 Text-content-md5: 8be20524cf9f4591b3cb50b1ab4ff3ec Text-content-sha1: 365767d04acc51acf575a860baf77b5c8ed13156 Content-length: 97 SVN@@@\define{versionidconfig} \versionid $IdIT4 \c \c [HKEY_CURRENT7 Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 76acf4ba3b7adc8bf127d3efbd0a0ef2 Text-delta-base-sha1: ffcb30dc3e4b9afa32bbe98e180efc6d6fc8832b Text-content-length: 55 Text-content-md5: ba6b89067cc0426df00b9baf5972cb19 Text-content-sha1: 74db040f687b3f9348250490a328a67e0d9c61e5 Content-length: 55 SVN}d'=@\define{versioniderrors} \versionid $Id Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ca6f754210f841e9b22ea7bad7724a72 Text-delta-base-sha1: d9d48d115e595da39257f92fbe10809e6b44fe64 Text-content-length: 41 Text-content-md5: 4ac5afbae3f485274bb9057876d16768 Text-content-sha1: 2f4a44c35fd4c6588f875fde47f95cc8ef135186 Content-length: 41 SVNkk\define{versionidfaq} Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2df1f7abbdd24be86923d9ff23f81fe4 Text-delta-base-sha1: bb82a340f0303aadb7cf044a574289977b0ff337 Text-content-length: 60 Text-content-md5: 6a7e9bd4f74d13522eef0eca49e7d448 Text-content-sha1: a58511ac42e2de0e53ef21b87d595d20b7191457 Content-length: 60 SVN?&)}B\define{versionidfeedback} \versionid $Id Node-path: putty/doc/gs.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49c997a3957f832f72772a8e6dc7fea4 Text-delta-base-sha1: 9a421b991d986559224b6b6578e08d9d29005fb7 Text-content-length: 51 Text-content-md5: 47be4fc62b53ac0e2169b656bd567043 Text-content-sha1: aead8d483564b752b929e019fb7d3a9a14cd34fa Content-length: 51 SVN3#x;\define{versionidgs} \versionid $Id Node-path: putty/doc/intro.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dbe70bf5b27f7d86204516bd564409b1 Text-delta-base-sha1: 8ac5f032821efa96bf026d0323d0eb3bab9a31ed Text-content-length: 54 Text-content-md5: 2ffefbd611fb71a3fa4da3289c122ab3 Text-content-sha1: ea8db0b64c2146e53f645941edd2460c50145aeb Content-length: 54 SVN s&M>\define{versionidintro} \versionid $Id Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c52ac02662b5bb641eb06ceed77c1a62 Text-delta-base-sha1: f200a56f06f8b65c379240d4edf2f9d1294b01cf Text-content-length: 56 Text-content-md5: a1ae553873577a22a2a37c85468a6907 Text-content-sha1: d6b1e3f32038ecc71099179c39dc4b22b7937bfd Content-length: 56 SVNA)(@\define{versionidlicence} \versionid $Id Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b8c0584b09286dd3c17c8cc32fb76f87 Text-delta-base-sha1: 14728cb4de6c743e46efbec0b2bc9c1b76b76ddb Text-content-length: 56 Text-content-md5: f6f1b1f8bed57314d96dd6798eed0820 Text-content-sha1: 8df192c57b633325d61fcaed36ebe075df20c225 Content-length: 56 SVNR9(A\define{versionidpageant} \versionid $Id Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec7ec301e6e24d65a0cd3bb553d08db7 Text-delta-base-sha1: 9c3f2bd1b2d23b0ed5e7e5a83e713a63b45abb2f Text-content-length: 54 Text-content-md5: 994ebfa3b451117a9c3e326a91fcf971 Text-content-sha1: 79ab8f4c024d0109d5a3cb27335f3219b72d6f4b Content-length: 54 SVN^E&?\define{versionidplink} \versionid $Id Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a3180b37ac7d10c727f33e9154a625e Text-delta-base-sha1: e67bbc6cc38606d91b1d1d3856abc52d0a96d07c Text-content-length: 53 Text-content-md5: a19ca86c068c25aa637c02c0f1921e0f Text-content-sha1: 63c290daf6609c06b08f8764c38ca9769a0049df Content-length: 53 SVN8%z>\define{versionidpscp} \versionid $Id Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 31478dfadea8991034cb53d215901a63 Text-delta-base-sha1: a7f59ac29a0c72d30f2ec7c0bfedb76e8f21069d Text-content-length: 57 Text-content-md5: c079c6056f24f0773f773a1d61277604 Text-content-sha1: 70e8ef0abfde3d8d5ab412e3b3e80e09fd176682 Content-length: 57 SVN+&m>\define{versionidpsftp} \versionid $Id Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 33fcb8c7e4b2672ff4761fb1a61efc47 Text-delta-base-sha1: 23377a8033724a02bdb38413ae707e679d505d3c Text-content-length: 58 Text-content-md5: acb60c15fda56259081b38fd671f8384 Text-content-sha1: 94d7a5a2cca09990608015260c67e2d349e78f44 Content-length: 58 SVNW>'@\define{versionidpubkey} \versionid $Id Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 905b1322cba62f6132777fdb16d15cb0 Text-delta-base-sha1: 220799079c894a645e8ad0e621d6245ef44ae210 Text-content-length: 57 Text-content-md5: 51bf7c25e2494fab87fdf0b0d98703f6 Text-content-sha1: d2662de404b8598a9209edd60090c43369c9b4bd Content-length: 57 SVN2&s?\define{versionidusing} \versionid $Id Node-path: putty/doc/vids.but Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 337 Text-content-md5: 5af9cd4807b6cb664727db72e0be1d49 Text-content-sha1: 90e6c1a4c73520531240637e7c0c3c85ddbb9d43 Content-length: 347 PROPS-END SVNCCC\# Invoke the versionid macros defined in all the other manual \# chapter files. \versionidblurb \versionidintro \versionidgs \versionidusing \versionidconfig \versionidpscp \versionidpsftp \versionidplink \versionidpubkey \versionidpageant \versioniderrors \versionidfaq \versionidfeedback \versionidlicence Revision-number: 4805 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:34.741357Z PROPS-END Revision-number: 4806 Prop-content-length: 336 Content-length: 336 K 8 svn:date V 27 2004-11-17T18:27:04.139474Z K 7 svn:log V 235 mkunxarc.sh was still including (mostly empty) .svn directories, and that in turn was confusing the new doc/Makefile mechanism. Fixed the former, and also put an additional safeguard in the latter in a belt-and-braces sort of fashion. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 171549d8ba8f537238d3ccca43547920 Text-delta-base-sha1: 38ac21f04a6be6a411edbcbb619f1d220bf59c63 Text-content-length: 115 Text-content-md5: 5315d9ba9788fa8d6efe9557fe805c65 Text-content-sha1: dc0ba5b9e65ccad1bc287682362777f6927f7547 Content-length: 115 SVNMr ]_]6ifneq ($(SVNVERSION),exported) VERSION=Built from revision $(patsubst M,,$(SVNVERSION)) endif Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49e5b438c37e09f4f76d6204bc661d19 Text-delta-base-sha1: e3fc7773dca94fc64faa9e39cf0b8910a146fffe Text-content-length: 89 Text-content-md5: 8c75c7f0a001d91d7f58ff9633b39cdb Text-content-sha1: 03f77dc9690ea416dc8e095712c4107fa8ab027e Content-length: 89 SVNT CYC|X\ -name CVS -prune -o \ -name .svn -prune -o \ Revision-number: 4807 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:34.970469Z PROPS-END Revision-number: 4808 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:34.981855Z PROPS-END Revision-number: 4809 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:34.991903Z PROPS-END Revision-number: 4810 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.012933Z PROPS-END Revision-number: 4811 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.045841Z PROPS-END Revision-number: 4812 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.057298Z PROPS-END Revision-number: 4813 Prop-content-length: 279 Content-length: 279 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-11-18T11:30:39.479274Z K 7 svn:log V 178 Move MODULE files out of individual project directories into a MODULES top-level directory, which is where the Tartarus website scripts will (hopefully) start reading them from. PROPS-END Node-path: putty/MODULE Node-action: delete Node-path: putty-branch-0.53/MODULE Node-action: delete Node-path: putty-branch-0.55/MODULE Node-action: delete Node-path: putty-branch-0.56/MODULE Node-action: delete Revision-number: 4814 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.120109Z PROPS-END Revision-number: 4815 Prop-content-length: 300 Content-length: 300 K 8 svn:date V 27 2004-11-18T15:16:18.067835Z K 7 svn:log V 199 Add an extra appendix to the manual containing PuTTY's (hitherto) unwritten design principles, so would-be contributors won't have to either read our minds or pay _very_ close attention to the code. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5315d9ba9788fa8d6efe9557fe805c65 Text-delta-base-sha1: dc0ba5b9e65ccad1bc287682362777f6927f7547 Text-content-length: 25 Text-content-md5: 631e1b0402f33fb9ffdfd456587eb6c8 Text-content-sha1: 046bca271b3612cc3c11ca84d43cd829b54bae2d Content-length: 25 SVNrv X udp Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a7e9bd4f74d13522eef0eca49e7d448 Text-delta-base-sha1: a58511ac42e2de0e53ef21b87d595d20b7191457 Text-content-length: 159 Text-content-md5: 39eec0c7f3a0425e96eab4be5d175335 Text-content-sha1: 46edf6cf10084cac8b1fd0f42795817eb494b62f Content-length: 159 SVN&, @g? Also, read the design principles listed in \k{udp}: if you do not conform to them, we will probably not be able to accept your patch Node-path: putty/doc/udp.but Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 18735 Text-content-md5: 35c8c27c92c8b0c087c987a8928690ad Text-content-sha1: e0469557ec40405d4ba17d08a5dfb18523fb2b52 Content-length: 18745 PROPS-END SVN\# This file is so named for tradition's sake: it contains what we \# always used to refer to, before they were written down, as \# PuTTY's `unwritten design principles'. It has nothing to do with \# the User Datagram Protocol. \define{versionidudp} \versionid $Id$ \A{udp} PuTTY hacking guide This appendix lists a selection of the design principles applying to the PuTTY source code. If you are planning to send code contributions, you should read this first. \H{udp-portability} Cross-OS portability Despite Windows being its main area of fame, PuTTY is no longer a Windows-only application suite. It has a working Unix port; a Mac port is in progress; more ports may or may not happen at a later date. Therefore, embedding Windows-specific code in core modules such as \cw{ssh.c} is not acceptable. We went to great lengths to \e{remove} all the Windows-specific stuff from our core modules, and to shift it out into Windows-specific modules. Adding large amounts of Windows-specific stuff in parts of the code that should be portable is almost guaranteed to make us reject a contribution. The PuTTY source base is divided into platform-specific modules and platform-generic modules. The Unix-specific modules are all in the \c{unix} subdirectory; the Mac-specific modules are in the \c{mac} subdirectory; the Windows-specific modules are in the \c{windows} subdirectory. All the modules in the main source directory - notably \e{all} of the code for the various back ends - are platform-generic. We want to keep them that way. This also means you should stick to what you are guaranteed by ANSI/ISO C (that is, the original C89/C90 standard, not C99). Try not to make assumptions about the precise size of basic types such as \c{int} and \c{long int}; don't use pointer casts to do endianness-dependent operations, and so on. (There are one or two aspects of ANSI C portability which we \e{don't} care about. In particular, we expect PuTTY to be compiled on 32-bit architectures \e{or bigger}; so it's safe to assume that \c{int} is at least 32 bits wide, not just the 16 you are guaranteed by ANSI C.) \H{udp-multi-backend} Multiple backends treated equally PuTTY is not an SSH client with some other stuff tacked on the side. PuTTY is a generic, multiple-backend, remote VT-terminal client which happens to support one backend which is larger, more popular and more useful than the rest. Any extra feature which can possibly be general across all backends should be so: localising features unnecessarily into the SSH back end is a design error. (For example, we had several code submissions for proxy support which worked by hacking \cw{ssh.c}. Clearly this is completely wrong: the \cw{network.h} abstraction is the place to put it, so that it will apply to all back ends equally, and indeed we eventually put it there after another contributor sent a better patch.) The rest of PuTTY should try to avoid knowing anything about specific back ends if at all possible. To support a feature which is only available in one network protocol, for example, the back end interface should be extended in a general manner such that \e{any} back end which is able to provide that feature can do so. If it so happens that only one back end actually does, that's just the way it is, but it shouldn't be relied upon by any code. \H{udp-globals} Multiple sessions per process on some platforms Some ports of PuTTY - notably the in-progress Mac port - are constrained by the operating system to run as a single process potentially managing multiple sessions. Therefore, the platform-independent parts of PuTTY use \e{hardly any} global variables. The very few that do exist, such as \c{flags}, are tolerated because they are not specific to a particular login session: instead, they define properties that are expected to apply equally to \e{all} the sessions run by a single PuTTY process. Any data that is specific to a particular network session is stored in dynamically allocated data structures, and pointers to these structures are passed around between functions. Platform-specific code can reverse this decision if it likes. The Windows code, for historical reasons, stores most of its data as global variables. That's OK, because \e{on Windows} we know there is only one session per PuTTY process, so it's safe to do that. But changes to the platform-independent code should avoid introducing any more global variables than already exist. \H{udp-pure-c} C, not C++ PuTTY is written entirely in C, not in C++. We have made \e{some} effort to make it easy to compile our code using a C++ compiler: notably, our \c{snew}, \c{snewn} and \c{sresize} macros explicitly cast the return values of \cw{malloc} and \cw{realloc} to the target type. (This has type checking advantages even in C: it means you never accidentally allocate the wrong size piece of memory for the pointer type you're assigning it to. C++ friendliness is really a side benefit.) We want PuTTY to continue being pure C, at least in the platform-independent parts and the currently existing ports. Patches which switch the Makefiles to compile it as C++ and start using classes will not be accepted. Also, in particular, we disapprove of \cw{//} comments, at least for the moment. (Perhaps once C99 becomes genuinely widespread we might be more lenient.) The one exception: a port to a new platform may use languages other than C if they are necessary to code on that platform. If your favourite PDA has a GUI with a C++ API, then there's no way you can do a port of PuTTY without using C++, so go ahead and use it. But keep the C++ restricted to that platform's subdirectory; if your changes force the Unix or Windows ports to be compiled as C++, they will be unacceptable to us. \H{udp-security} Security-conscious coding PuTTY is a network application and a security application. Assume your code will end up being fed deliberately malicious data by attackers, and try to code in a way that makes it unlikely to be a security risk. In particular, try not to use fixed-size buffers for variable-size data such as strings received from the network (or even the user). We provide functions such as \cw{dupcat} and \cw{dupprintf}, which dynamically allocate buffers of the right size for the string they construct. Use these wherever possible. \H{udp-multi-compiler} Independence of specific compiler Windows PuTTY can currently be compiled with any of four Windows compilers: MS Visual C, Borland's freely downloadable C compiler, the Cygwin / \cw{mingw32} GNU tools, and \cw{lcc-win32}. This is a really useful property of PuTTY, because it means people who want to contribute to the coding don't depend on having a specific compiler; so they don't have to fork out money for MSVC if they don't already have it, but on the other hand if they \e{do} have it they also don't have to spend effort installing \cw{gcc} alongside it. They can use whichever compiler they happen to have available, or install whichever is cheapest and easiest if they don't have one. Therefore, we don't want PuTTY to start depending on which compiler you're using. Using GNU extensions to the C language, for example, would ruin this useful property (not that anyone's ever tried it!); and more realistically, depending on an MS-specific library function supplied by the MSVC C library (\cw{_snprintf}, for example) is a mistake, because that function won't be available under the other compilers. Any function supplied in an official Windows DLL as part of the Windows API is fine, and anything defined in the C library standard is also fine, because those should be available irrespective of compilation environment. But things in between, available as non-standard library and language extensions in only one compiler, are disallowed. (\cw{_snprintf} in particular should be unnecessary, since we provide \cw{dupprintf}; see \k{udp-security}.) Compiler independence should apply on all platforms, of course, not just on Windows. \H{udp-small} Small code size PuTTY is tiny, compared to many other Windows applications. And it's easy to install: it depends on no DLLs, no other applications, no service packs or system upgrades. It's just one executable. You install that executable wherever you want to, and run it. We want to keep both these properties - the small size, and the ease of installation - if at all possible. So code contributions that depend critically on external DLLs, or that add a huge amount to the code size for a feature which is only useful to a small minority of users, are likely to be thrown out immediately. We do vaguely intend to introduce a DLL plugin interface for PuTTY, whereby seriously large extra features can be implemented in plugin modules. The important thing, though, is that those DLLs will be \e{optional}; if PuTTY can't find them on startup, it should run perfectly happily and just won't provide those particular features. A full installation of PuTTY might one day contain ten or twenty little DLL plugins, which would cut down a little on the ease of installation - but if you really needed ease of installation you \e{could} still just install the one PuTTY binary, or just the DLLs you really needed, and it would still work fine. Depending on \e{external} DLLs is something we'd like to avoid if at all possible (though for some purposes, such as complex SSH authentication mechanisms, it may be unavoidable). If it can't be avoided, the important thing is to follow the same principle of graceful degradation: if a DLL can't be found, then PuTTY should run happily and just not supply the feature that depended on it. \H{udp-single-threaded} Single-threaded code PuTTY and its supporting tools, or at least the vast majority of them, run in only one OS thread. This means that if you're devising some piece of internal mechanism, there's no need to use locks to make sure it doesn't get called by two threads at once. The only way code can be called re-entrantly is by recursion. That said, most of Windows PuTTY's network handling is triggered off Windows messages requested by \cw{WSAAsyncSelect()}, so if you call \cw{MessageBox()} deep within some network event handling code you should be aware that you might be re-entered if a network event comes in and is passed on to our window procedure by the \cw{MessageBox()} message loop. Also, the front ends (in particular Windows Plink) can use multiple threads if they like. However, Windows Plink keeps \e{very} tight control of its auxiliary threads, and uses them pretty much exclusively as a form of \cw{select()}. Pretty much all the code outside \cw{windows/winplink.c} is \e{only} ever called from the one primary thread; the others just loop round blocking on file handles and send messages to the main thread when some real work needs doing. This is not considered a portability hazard because that bit of \cw{windows/winplink.c} will need rewriting on other platforms in any case. One important consequence of this: PuTTY has only one thread in which to do everything. That \q{everything} may include managing more than one login session (\k{udp-globals}), managing multiple data channels within an SSH session, responding to GUI events even when nothing is happening on the network, and responding to network requests from the server (such as repeat key exchange) even when the program is dealing with complex user interaction such as the re-configuration dialog box. This means that \e{almost none} of the PuTTY code can safely block. \H{udp-keystrokes} Keystrokes sent to the server wherever possible In almost all cases, PuTTY sends keystrokes to the server. Even weird keystrokes that you think should be hot keys controlling PuTTY. Even Alt-F4 or Alt-Space, for example. If a keystroke has a well-defined escape sequence that it could usefully be sending to the server, then it should do so, or at the very least it should be configurably able to do so. To unconditionally turn a key combination into a hot key to control PuTTY is almost always a design error. If a hot key is really truly required, then try to find a key combination for it which \e{isn't} already used in existing PuTTYs (either it sends nothing to the server, or it sends the same thing as some other combination). Even then, be prepared for the possibility that one day that key combination might end up being needed to send something to the server - so make sure that there's an alternative way to invoke whatever PuTTY feature it controls. \H{udp-640x480} 640\u00D7{x}480 friendliness in configuration panels There's a reason we have lots of tiny configuration panels instead of a few huge ones, and that reason is that not everyone has a 1600\u00D7{x}1200 desktop. 640\u00D7{x}480 is still a viable resolution for running Windows (and indeed it's still the default if you start up in safe mode), so it's still a resolution we care about. Accordingly, the PuTTY configuration box, and the PuTTYgen control window, are deliberately kept just small enough to fit comfortably on a 640\u00D7{x}480 display. If you're adding controls to either of these boxes and you find yourself wanting to increase the size of the whole box, \e{don't}. Split it into more panels instead. \H{udp-makefiles-auto} Automatically generated \cw{Makefile}s PuTTY is intended to compile on multiple platforms, and with multiple compilers. It would be horrifying to try to maintain a single \cw{Makefile} which handled all possible situations, and just as painful to try to directly maintain a set of matching \cw{Makefile}s for each different compilation environment. Therefore, we have moved the problem up by one level. In the PuTTY source archive is a file called \c{Recipe}, which lists which source files combine to produce which binaries; and there is also a script called \cw{mkfiles.pl}, which reads \c{Recipe} and writes out the real \cw{Makefile}s. (The script also reads all the source files and analyses their dependencies on header files, so we get an extra benefit from doing it this way, which is that we can supply correct dependency information even in environments where it's difficult to set up an automated \c{make depend} phase.) You should \e{never} edit any of the PuTTY \cw{Makefile}s directly. They are not stored in our source repository at all. They are automatically generated by \cw{mkfiles.pl} from the file \c{Recipe}. If you need to add a new object file to a particular binary, the right thing to do is to edit \c{Recipe} and re-run \cw{mkfiles.pl}. This will cause the new object file to be added in every tool that requires it, on every platform where it matters, in every \cw{Makefile} to which it is relevant, \e{and} to get all the dependency data right. If you send us a patch that modifies one of the \cw{Makefile}s, you just waste our time, because we will have to convert it into a change to \c{Recipe}. If you send us a patch that modifies \e{all} of the \cw{Makefile}s, you will have wasted a lot of \e{your} time as well! (There is a comment at the top of every \cw{Makefile} in the PuTTY source archive saying this, but many people don't seem to read it, so it's worth repeating here.) \H{udp-ssh-coroutines} Coroutines in \cw{ssh.c} Large parts of the code in \cw{ssh.c} are structured using a set of macros that implement (something close to) Donald Knuth's \q{coroutines} concept in C. Essentially, the purpose of these macros are to arrange that a function can call \cw{crReturn()} to return to its caller, and the next time it is called control will resume from just after that \cw{crReturn} statement. This means that any local (automatic) variables declared in such a function will be corrupted every time you call \cw{crReturn}. If you need a variable to persist for longer than that, you \e{must} make it a field in one of the persistent state structures: either the local state structures \c{s} or \c{st} in each function, or the backend-wide structure \c{ssh}. See \W{http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html}\c{http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html} for a more in-depth discussion of what these macros are for and how they work. \H{udp-compile-once} Single compilation of each source file The PuTTY build system for any given platform works on the following very simple model: \b Each source file is compiled precisely once, to produce a single object file. \b Each binary is created by linking together some combination of those object files. Therefore, if you need to introduce functionality to a particular module which is only available in some of the tool binaries (for example, a cryptographic proxy authentication mechanism which needs to be left out of PuTTYtel to maintain its usability in crypto-hostile jurisdictions), the \e{wrong} way to do it is by adding \cw{#ifdef}s in (say) \cw{proxy.c}. This would require separate compilation of \cw{proxy.c} for PuTTY and PuTTYtel, which means that the entire \cw{Makefile}-generation architecture (see \k{udp-makefiles-auto}) would have to be significantly redesigned. Unless you are prepared to do that redesign yourself, \e{and} guarantee that it will still port to any future platforms we might decide to run on, you should not attempt this! The \e{right} way to introduce a feature like this is to put the new code in a separate source file, and (if necessary) introduce a second new source file defining the same set of functions, but defining them as stubs which don't provide the feature. Then the module whose behaviour needs to vary (\cw{proxy.c} in this example) can call the functions defined in these two modules, and it will either provide the new feature or not provide it according to which of your new modules it is linked with. Of course, object files are never shared \e{between} platforms; so it is allowable to use \cw{#ifdef} to select between platforms. This happens in \cw{puttyps.h} (choosing which of the platform-specific include files to use), and also in \cw{misc.c} (the Windows-specific \q{Minefield} memory diagnostic system). It should be used sparingly, though, if at all. \H{udp-perfection} Do as we say, not as we do The current PuTTY code probably does not conform strictly to \e{all} of the principles listed above. There may be the occasional SSH-specific piece of code in what should be a backend-independent module, or the occasional dependence on a non-standard X library function under Unix. This should not be taken as a licence to go ahead and violate the rules. Where we violate them ourselves, we're not happy about it, and we would welcome patches that fix any existing problems. Please try to help us make our code better, not worse! Node-path: putty/doc/vids.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5af9cd4807b6cb664727db72e0be1d49 Text-delta-base-sha1: 90e6c1a4c73520531240637e7c0c3c85ddbb9d43 Text-content-length: 31 Text-content-md5: 85ed80cc34fa02f19ec72cb8ef568bae Text-content-sha1: dc386021eef990d754bbf7ba76e793e8c49dd9e2 Content-length: 31 SVNCRC \versionidudp Revision-number: 4816 Prop-content-length: 437 Content-length: 437 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-18T17:13:45.096738Z K 7 svn:log V 336 *sigh* X11 forwarding to a local display (":0" or similar) specified in the environment rather than the configuraton was failing as of 0.56 (introduced in r4604). This probably only bit users of Unix PuTTY. Didn't spot in testing as I was forwarding to already-forwarded displays. I really wasn't having a good month that month, was I? PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c7045bbdd73eb8406cdcdbe7646dd15 Text-delta-base-sha1: c3573a8324cc47c82ef13f8797df72386ab8659e Text-content-length: 24 Text-content-md5: 7c491b5c69c0d337b0bcfe61336c5aa5 Text-content-sha1: b62a7c349821b85b6088fadac7594ab1783788d8 Content-length: 24 SVNFB 1ret Revision-number: 4817 Prop-content-length: 239 Content-length: 239 K 7 svn:log V 138 Summary: X11 forwarding to implicitly specified local display broken Absent-in: 0.55 Present-in: 0.56 Fixed-in: 2004-11-19 *hides again* K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-18T18:19:21.211237Z PROPS-END Node-path: putty-wishlist/data/x11-local-display-broken Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1530 Text-content-md5: 93acc7f5a5b06b34a537198c26d19ae5 Text-content-sha1: ddf9f0bf05cd28110873ebb2e02e0a277f0fd4df Content-length: 1540 PROPS-END SVNlllSummary: X11 forwarding to implicitly specified local display broken Class: bug Difficulty: fun Priority: high Absent-in: 0.55 Present-in: 0.56 Fixed-in: 2004-11-19 Content-type: text/x-html-body

      In PuTTY and Plink 0.56, X11 forwarding would not work if the local X display location was not specified in the configuration dialog or a saved session, and the location inferred from the environment was of the form :0.0 (i.e., no hostname or transport type specified before the colon), or if no local display is specified anywhere (in which case a hard-coded default of :0 will be used).

      This is more likely to affect users of the Unix version running PuTTY on their local machines, who will expect the display location to be taken from the environment; under Windows, users are more likely to specify the X display location explicitly, and also old versions of PuTTY defaulted to localhost:0, which could persist in saved sessions / Default Settings. Windows users could however be affected if they leave the display location blank in the configuration and rely on PuTTY's default of localhost:0.

      This is fixed as of 2004-11-19. Workarounds for 0.56 include:

      • Specify an argument like --display unix:0 (Unix PuTTY only)
      • Change the environment variable DISPLAY in PuTTY/Plink's environment to the form unix:0 (or localhost:0 on Windows)
      • Specify the display location explicitly in PuTTY's configuration dialog
      Revision-number: 4818 Prop-content-length: 277 Content-length: 277 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-18T19:41:41.738098Z K 7 svn:log V 176 "Software caused connection abort": a couple of people now have got rid of this with keepalives. Also try to emphasise that this seems to be a generic catch-all type of error. PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ba6b89067cc0426df00b9baf5972cb19 Text-delta-base-sha1: 74db040f687b3f9348250490a328a67e0d9c61e5 Text-content-length: 417 Text-content-md5: c91315d39082ea498ebf9e42173ce134 Text-content-sha1: 4ce92bd88024accabaf7240b58af1996427381c7 Content-length: 417 SVNddVe Yis a generic error produced by the Windows network code when it decides that your network connection is dead. For example, it might happen if you pull the network cable out of the back of an Ethernet-connected computer, or if Windows has any other similar reason to believe the entire Some people have reported that enabling keepalives (see \k{config-keepalive}) fixes this error for th Revision-number: 4819 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2004-11-18T19:44:26.574342Z K 7 svn:log V 91 "Connection reset by peer" is apparently not the only error that keepalives can help with. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8be20524cf9f4591b3cb50b1ab4ff3ec Text-delta-base-sha1: 365767d04acc51acf575a860baf77b5c8ed13156 Text-content-length: 152 Text-content-md5: 89c16a73e4293ab346572c78dbf2e15f Text-content-sha1: 44140b970a9a63604e0dcc5f5a0eee0fce51096a Content-length: 152 SVN_`_A/most often with \q{Connection reset by peer}) after they have been idle for a while, you might .\c [HKEY_CURRENT Revision-number: 4820 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2004-11-19T00:05:16.095418Z K 7 svn:log V 35 Another WinSock 2 system confirmed K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win95-resolution Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e4cd86a72b756b61b946874c05a91072 Text-delta-base-sha1: e1ce050192df494a9106bfe584ca80f7ad322f90 Text-content-length: 57 Text-content-md5: 0532fc0907f55fc988eb12a86009ea81 Text-content-sha1: 01dfa91a7e4c4ddc2d41ab7909327ceeca81200e Content-length: 57 SVN/H #%two (WinSock 2 is installed)
    Revision-number: 4821 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.835796Z PROPS-END Revision-number: 4822 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.845733Z PROPS-END Revision-number: 4823 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.855066Z PROPS-END Revision-number: 4824 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.868273Z PROPS-END Revision-number: 4825 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.880005Z PROPS-END Revision-number: 4826 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.893354Z PROPS-END Revision-number: 4827 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.905233Z PROPS-END Revision-number: 4828 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.917025Z PROPS-END Revision-number: 4829 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.929014Z PROPS-END Revision-number: 4830 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:35.941565Z PROPS-END Revision-number: 4831 Prop-content-length: 752 Content-length: 752 K 8 svn:date V 27 2004-11-19T20:57:32.446290Z K 7 svn:log V 651 Remove FLAG_INTERACTIVE test from "login as:" prompt. Kelly John Carney pointed out that Plink would attempt to use a zero-length username iff a remote command was specified (because the FLAG_INTERACTIVE test was erroneously combined with the no-username test). I don't think this will break non-interactive use; in the cases which behave differently, Plink would be attempting to use the empty username, which was almost certainly wrong, whereas now it will give a prompt (which can be avoided with -batch as usual). (Although perhaps we should attempt to use a local username as a guess for the remote username, as PSCP does? I've not done this.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b23cba7e3fddea200dbe85f5a82fa964 Text-delta-base-sha1: 772e6bd36b3ac618db213a135e8fcf2d69e361d3 Text-content-length: 153 Text-content-md5: 7a4d501aafb115ac512b0ec174b617f4 Text-content-sha1: 72a37eac3cf7a33807b0023536cf6e80c039b8a6 Content-length: 153 SVN zhlogevent("X11 forwarding enabl <jZ&da_ctx) { crcda_free_context(ssh->crcda_ctx); ssh->crcda_c~BB< Revision-number: 4832 Prop-content-length: 403 Content-length: 403 K 8 svn:date V 27 2004-11-19T21:05:31.121564Z K 7 svn:log V 302 console_get_line() returns failure iff console_batch_mode is set, whereas before is would return success and the empty string. IMO this makes `-batch' much more useful; before, utilities such as Plink in `-batch' mode would attempt to plough on using empty strings for usernames, passwords, and so on. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c03758c35828ea39f1031293bf103df Text-delta-base-sha1: db4d26851f159c255df7f33f202fbcbcfcc041c0 Text-content-length: 53 Text-content-md5: f5522306f1cb7e7b3e757b58ffbde3d8 Text-content-sha1: c08e2a1f8ac007f4589a7a299004674f72498e29 Content-length: 53 SVN(}q. return 0 return 1; } Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e5ff68ff8d4cf1183cade3dc1fab19c1 Text-delta-base-sha1: 0d733be859f3ad83f0f3b9afc1d2b1f7cefa0954 Text-content-length: 51 Text-content-md5: 0d30878bc4b4c10415d710a0bddfa83d Text-content-sha1: 6f6a716b6dfd3b4b10ec474eafaca1663efea53a Content-length: 51 SVNi| return 0 return 1; } Revision-number: 4833 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2004-11-19T21:24:47.925487Z K 7 svn:log V 98 Make PSFTP use console_get_line() to fetch username, so that that prompt is affected by `-batch'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8050ce10450fcbb9ca3f336f6052a2c0 Text-delta-base-sha1: 43cb67f1899238728062f5f90b974f2612252ec7 Text-content-length: 160 Text-content-md5: 18e64f97fb1d6fbed7f95748b9380d16 Text-content-sha1: 1663b9b9210991cd04369ef0233a022cf9f8c410 Content-length: 160 SVNnu^if (!console_get_line("login as: ", cfg.username, sizeof(cfg.username), FALSE)) { fprintf(stderr, "psftp: no username, Revision-number: 4834 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.654561Z PROPS-END Revision-number: 4835 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.663964Z PROPS-END Revision-number: 4836 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.673798Z PROPS-END Revision-number: 4837 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.684573Z PROPS-END Revision-number: 4838 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.694882Z PROPS-END Revision-number: 4839 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.705921Z PROPS-END Revision-number: 4840 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.716405Z PROPS-END Revision-number: 4841 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.727190Z PROPS-END Revision-number: 4842 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.736954Z PROPS-END Revision-number: 4843 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.747925Z PROPS-END Revision-number: 4844 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.757871Z PROPS-END Revision-number: 4845 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.767925Z PROPS-END Revision-number: 4846 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.778404Z PROPS-END Revision-number: 4847 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.789600Z PROPS-END Revision-number: 4848 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:36.799829Z PROPS-END Revision-number: 4849 Prop-content-length: 476 Content-length: 476 K 7 svn:log V 375 As a result of the policy allowing changes of username to reset the authentication state, a failed `password' authentication in SSH-2 was sending us back to trying `none' and `keyboard-interactive' each time round, which uses up OpenSSH's quota of authentication attempts rather quickly. Added a check for `cfg.change_username' to the logic which sends us back to the start. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-20T17:11:38.704353Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a4d501aafb115ac512b0ec174b617f4 Text-delta-base-sha1: 72a37eac3cf7a33807b0023536cf6e80c039b8a6 Text-content-length: 267 Text-content-md5: 3dd9b428273a3ce96a7060049090fc0c Text-content-sha1: 6d2a007c94181c99cd0a3ea8ea8efde9702593a5 Content-length: 267 SVNetBCtd7 (iff we're configured to allow * username change attempts) && ssh->cfg.change_usernameB'eeBpktin.data = NULL; } if (ssh->crcda_ctx) { crcda_free_context(ssh->crcda_ctx); ssh->crcda_c Revision-number: 4850 Prop-content-length: 549 Content-length: 549 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-20T17:47:40.143121Z K 7 svn:log V 448 XXX comment in the logic which sends failed password auth back to username prompt for keyboard-interactive. I suspect we should do the same with that method (especially given the apparent number of systems that use it for regular password auth), but in the absence of systems to test against I've not actually made the change. (I'm worried that the `partial success' field might not be set correctly in a multi-stage authentication, for instance.) PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3dd9b428273a3ce96a7060049090fc0c Text-delta-base-sha1: 6d2a007c94181c99cd0a3ea8ea8efde9702593a5 Text-content-length: 226 Text-content-md5: 2149eaad8a969f5b0a3fb93a06486cf8 Text-content-sha1: 6f2bf57b4b191eb7c29248ef8bce37e0577c6d0b Content-length: 226 SVNP'P /* XXX perhaps we should allow * keyboard-interactive to do this too? */'XX'sh->pktout.data = NULL; } if (ssh->pktin.data) { sfree(ssh->pktin.data); ssh-> Revision-number: 4851 Prop-content-length: 268 Content-length: 268 K 8 svn:date V 27 2004-11-20T18:29:58.451936Z K 7 svn:log V 167 UI tweak from Malcolm Rowe: set IDM_VIEWKEYS as the default menu item and use that mechanism to invoke it on double-click; this emboldens it in the right- click menu. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30517a31d2e25ee3ac6324531837c6f7 Text-delta-base-sha1: 997984396ae0ecc7be72e87d7fe3542832d79307 Text-content-length: 282 Text-content-md5: a6cc5849e3b8d32aa276d716b01a22e8 Text-content-sha1: 5dc3f61d4d4539091bb988d18e949850fa0ff805 Content-length: 282 SVN :vl :VU8Run the default menu item. */ UINT menuitem = GetMenuDefaultItem(systray_menu, FALSE, 0); if (menuitem != -1) PostMessage(hwnd, WM_COMMAND, menuitem/* Set the default menu item. */ SetMenuDefaultItem(systray_menu, IDM_VIEWKEYS, FALSE Revision-number: 4852 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2004-11-20T18:47:22.930665Z K 7 svn:log V 18 Mention Wintunnel K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 140adcd1a0862ee5eb09c42358f92f4e Text-delta-base-sha1: 3f973df45a321632262057c1b26d5c3b8688e8b6 Text-content-length: 108 Text-content-md5: 64f0fc728056788693bc9216347ff308 Text-content-sha1: 5b18f885f76cb0d32cbbf5a1142eff80dcfe3fed Content-length: 108 SVN V_VKJsourceforge.net/projects/wintunnel"> Wintunnel, a front end for creating tunnels Revision-number: 4853 Prop-content-length: 104 Content-length: 104 K 7 svn:log V 5 TWSC K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-20T18:56:31.143753Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 64f0fc728056788693bc9216347ff308 Text-delta-base-sha1: 5b18f885f76cb0d32cbbf5a1142eff80dcfe3fed Text-content-length: 154 Text-content-md5: c2ed298aa8caca85b8cd3c34f7654e0b Text-content-sha1: a94212ff03409a3a37d37e0ed0b29b90818aa671 Content-length: 154 SVN f&Zli> TWSC (Terminal Window ShortCuts), provides a menu of open terminal windows ( Revision-number: 4854 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2004-11-20T18:59:57.945076Z K 7 svn:log V 14 Mention TWSC. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/multiple-connections Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b5e6b4c86cfe61f631f1cc9c23cfc023 Text-delta-base-sha1: 77c2a750dc21fbe542f433fde4f90aac1566f5ad Text-content-length: 147 Text-content-md5: df4a19ac98e4fcaaeadc9bc07b84db5c Text-content-sha1: d8e82490ab499d50b23910bb46b8b86650de7a6c Content-length: 147 SVN444

    People who want this capability may find the third-party utility TWSC useful. Revision-number: 4855 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 Add missing backslash in "Unable to create registry key" messages. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-20T19:07:34.666826Z PROPS-END Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 200ec902f5b2d9a1ef9cae5dadf99685 Text-delta-base-sha1: 2cd152f662309f119efbdba4d8bcfb0640462a58 Text-content-length: 31 Text-content-md5: dde3e4600ebce8199a30011b1bf2e929 Text-content-sha1: 42a41568cd244d19049abd983153c1e288855012 Content-length: 31 SVN --Y3\\\\ Revision-number: 4856 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.893387Z PROPS-END Revision-number: 4857 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.903071Z PROPS-END Revision-number: 4858 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.912826Z PROPS-END Revision-number: 4859 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.922561Z PROPS-END Revision-number: 4860 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.931976Z PROPS-END Revision-number: 4861 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.941357Z PROPS-END Revision-number: 4862 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.951638Z PROPS-END Revision-number: 4863 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.961301Z PROPS-END Revision-number: 4864 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.971158Z PROPS-END Revision-number: 4865 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.980889Z PROPS-END Revision-number: 4866 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:37.990603Z PROPS-END Revision-number: 4867 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.000479Z PROPS-END Revision-number: 4868 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.010052Z PROPS-END Revision-number: 4869 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.019777Z PROPS-END Revision-number: 4870 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.029013Z PROPS-END Revision-number: 4871 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.038342Z PROPS-END Revision-number: 4872 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.047607Z PROPS-END Revision-number: 4873 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.056845Z PROPS-END Revision-number: 4874 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.066621Z PROPS-END Revision-number: 4875 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.076221Z PROPS-END Revision-number: 4876 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.086276Z PROPS-END Revision-number: 4877 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2004-11-22T11:02:44.925703Z K 7 svn:log V 71 Trivial bug fix pointed out by Paul Fox: potentially missing fclose(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df56bf00adb1b2c67b80c33648089b53 Text-delta-base-sha1: 53e8e63e2f9dbc55490c236a77a683106cc99145 Text-content-length: 67 Text-content-md5: acd7db7978a040c2087304c8f1d62355 Text-content-sha1: 26bd8994bb907c6687fe56d28086216f37754608 Content-length: 67 SVN# +V"u if (fclose(fp)) ret = 0 Revision-number: 4878 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.188018Z PROPS-END Revision-number: 4879 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:38.197862Z PROPS-END Revision-number: 4880 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 Minor index tweakery. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-11-22T12:42:33.985021Z PROPS-END Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 09605c301a4958b1a588687051ce52de Text-delta-base-sha1: 1bb337b2917869efd13d5f6fe83128365e743134 Text-content-length: 393 Text-content-md5: 9148644abf36128ce1db6b5dd7b2da66 Text-content-sha1: db73a0b78f9a7c3a5367e5d57d637d33bbd9e8d7 Content-length: 393 SVN pISH2\IM{pseudo-terminal allocation} allocation, of pseudo-terminal \IM{removing registry entries} removing registry entries \IM{removing registry entries} registry entries, removing \IM{random seed file} random seed file \IM{random seed file} \c{putty.rnd} \IM{suppressing remote shell} remote shell, suppressing \IM{suppressing remote shell} shell, remote, suppressing Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 51bf7c25e2494fab87fdf0b0d98703f6 Text-delta-base-sha1: d2662de404b8598a9209edd60090c43369c9b4bd Text-content-length: 171 Text-content-md5: ffeadfed542eb862c6dea0b23e4a44b8 Text-content-sha1: 671d973d288834cb7fe1f79ff138bf6f17d16da0 Content-length: 171 SVNXe[)]\I{removing registry entries}registry entries and \I{random seed file} from the local machine (after i\I{suppressing remote shell} Revision-number: 4881 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 71 Fix typo in term_size(), flagged by a Dr Watson log from Temme Rainer. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-11-22T13:49:12.648425Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 117d9256268a43743b51b986f1b6f069 Text-delta-base-sha1: 8ed9436f83fd222745f8cdad619f441338155717 Text-content-length: 43 Text-content-md5: acc25aa55af17b0609dbdea40b37dddd Text-content-sha1: bfb717b057e1886bb6521f9ba4da0eb83141dc9a Content-length: 43 SVN t ujddd Revision-number: 4882 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:39.034103Z PROPS-END Revision-number: 4883 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:39.043889Z PROPS-END Revision-number: 4884 Prop-content-length: 258 Content-length: 258 K 8 svn:date V 27 2004-11-22T19:42:00.694662Z K 7 svn:log V 157 Improve tolerance in the face of existing mirror directories -- this probably explains the number of apparently up-to-date sites still serving old binaries. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirror-wget.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 754fda4c95105463139cbb69ff7c6da8 Text-delta-base-sha1: 0224cc13fc903322f8380ff7e21b5ede9d193023 Text-content-length: 338 Text-content-md5: 034e11ec60c5a4b6607399f166fad811 Text-content-sha1: 3423bb3a85fadf46586ee59cb577a4f9c68bcfaf Content-length: 338 SVN h 9+wr8h#!/bin/sh # $Id$ # When run, this script will generate a mirror of the PuTTY website # in a subdirectory called `putty'. It does not attempt to work # incrementally (only fetching things that have changed) but should # work tolerably well when run in the presence of an existing mirror # directoryrm -f htaccess Revision-number: 4885 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2004-11-22T19:45:15.337609Z K 7 svn:log V 26 Finish incomplete comment K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirror-wget.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 034e11ec60c5a4b6607399f166fad811 Text-delta-base-sha1: 3423bb3a85fadf46586ee59cb577a4f9c68bcfaf Text-content-length: 39 Text-content-md5: 46cc014b9b05ce84310330751412b61c Text-content-sha1: 6c5320a90b2646aaa822e3ac502bd0a3be54baee Content-length: 39 SVNhz gghostname and path. Revision-number: 4886 Prop-content-length: 322 Content-length: 322 K 7 svn:log V 221 Remove 1/3 of our mirrors for various reasons, mostly: (a) new site but old binaries (probably due to old mirror-wget.sh); (b) old site (0.55 or before); (c) fails to mirror the binaries. (But some other brokenness too.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-23T14:09:59.357479Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d0d5365ee2ba9cae583f61b14c967028 Text-delta-base-sha1: 13cb5e1f638a0ce5d7ed846217840076aab12b44 Text-content-length: 384 Text-content-md5: abf76e52c70aeb92e2bbcc51eaed213d Text-content-sha1: bdef03dfc5f9ae633ed46477c179feebcc669c59 Content-length: 384 SVN' hOvPA@h| }zS|g>BSw~~Ekc!aoR~A@m-kt o0ntq`qO1 ~ntzX="7W.netmonic.com/">putty.mirror.netmonic.com in Austriamolioner.dk/">putty.molionerwww.amongthemortals.com/putty/">amongthemortals.com in Finlandputty.coolzero.info/">putty.coolzero.infowigen.net/putty/">wigen.net in Norway Revision-number: 4887 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2004-11-23T14:27:20.866359Z K 7 svn:log V 40 http://mirror.root-servers.co.uk/putty/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: abf76e52c70aeb92e2bbcc51eaed213d Text-delta-base-sha1: bdef03dfc5f9ae633ed46477c179feebcc669c59 Text-content-length: 72 Text-content-md5: 44172a59d2341b51f6397803dcd0f17c Text-content-sha1: 2d32c2be5ae3186b0bbd904bac1723d258f1a317 Content-length: 72 SVN'+/~O5/x.root-servers.co.uk/putty/">mirror.root-servers Revision-number: 4888 Prop-content-length: 176 Content-length: 176 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-11-23T16:43:04.045109Z K 7 svn:log V 76 Darek Olszewski points out that telnet->ldisc is never initialised to NULL. PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bdf42d3a4c00d4f987ebc6b29510429f Text-delta-base-sha1: ec27be8fe50cd24dcd6244ea9aff311b5e1f9b3b Text-content-length: 44 Text-content-md5: f43ccf4fd3554dc8302f92d5972d97d6 Text-content-sha1: c235586cf38bdd29827a2fdb6331dd515d0f471a Content-length: 44 SVNf E(>telnet->ldisc = NUL Revision-number: 4889 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 Reinstate some fixed mirrors. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-23T17:11:54.407320Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 44172a59d2341b51f6397803dcd0f17c Text-delta-base-sha1: 2d32c2be5ae3186b0bbd904bac1723d258f1a317 Text-content-length: 341 Text-content-md5: d671f91b2e6da566d42e38e814941e18 Text-content-sha1: 6c3b1f7c60bfa21a1af7f8703fbee4e005154dff Content-length: 341 SVN++>)}evW:J?I?scarlet.be/">putty.scarlet.be in Belgiumputty.mirror.codersnetwork.co.uk/">putty.mirror.codersnetwork.co.uk in Canada.xs.epmh.com/mirror/putty/">xs.epmh.com in Finlandputty.huewenet.de/">putty.huewenet.demirrors.dedipower.com/putty/">mirrors.dedipower.com Revision-number: 4890 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2004-11-23T17:18:42.083753Z K 7 svn:log V 17 reinstate och.cz K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d671f91b2e6da566d42e38e814941e18 Text-delta-base-sha1: 6c3b1f7c60bfa21a1af7f8703fbee4e005154dff Text-content-length: 47 Text-content-md5: 3e5b1119208c9f2d4c60461981ff6082 Text-content-sha1: c2f48baea99f6a190dae49350389d494ccef1896 Content-length: 47 SVNq www.och Revision-number: 4891 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2004-11-23T18:22:47.283450Z K 7 svn:log V 34 www.och.cz/putty --> putty.och.cz K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3e5b1119208c9f2d4c60461981ff6082 Text-delta-base-sha1: c2f48baea99f6a190dae49350389d494ccef1896 Text-content-length: 41 Text-content-md5: 97f4d0906647101f4ee3bea3cc38cf30 Text-content-sha1: e9ee7cc6f9c3ad6c9075908f6ac81dbef2bac1a2 Content-length: 41 SVNqo @1putty.och.cz/">putty Revision-number: 4892 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2004-11-24T00:54:22.961237Z K 7 svn:log V 20 More reinstatements K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 97f4d0906647101f4ee3bea3cc38cf30 Text-delta-base-sha1: e9ee7cc6f9c3ad6c9075908f6ac81dbef2bac1a2 Text-content-length: 167 Text-content-md5: 33c4914610e157c3a90469c682df454d Text-content-sha1: f66c99f36c2533c24f5a5690490e681aaa9c950e Content-length: 167 SVNolEMwy?T[s.ilisys.com.au/">putty.mirrors.ilisys.com.au li> alloscomp.sytes.net Revision-number: 4893 Prop-content-length: 110 Content-length: 110 K 7 svn:log V 10 \k --> \K K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-24T03:18:14.751634Z PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: acb60c15fda56259081b38fd671f8384 Text-delta-base-sha1: 94d7a5a2cca09990608015260c67e2d349e78f44 Text-content-length: 24 Text-content-md5: abb8b74896e6cb89d992fc9b089dd2b4 Text-content-sha1: 95abfdb17f1c5d34e1a9518780f5feab8f2156c9 Content-length: 24 SVN>> /K Revision-number: 4894 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2004-11-24T10:04:14.676945Z K 7 svn:log V 80 Fix duplicate and tags in the generated FAQ and Feedback pages. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/faq.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 861157cc7688f6e3c1f94275baf00745 Text-delta-base-sha1: 1fc5a3cfc5311f63aa0bbedb1899726f63af07a7 Text-content-length: 122 Text-content-md5: 6c944fba069f5cf152350813fd5b9acc Text-content-sha1: 3de52953ec462bcc546f773115b324b93f8b3911 Content-length: 122 SVN d(d|## don't put in the or , since we're adding text on # the end s/<\/(body|html)>//i Node-path: putty-website/feedback.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60d2f98edebbe3e6ca064c25c4e02f22 Text-delta-base-sha1: 9013dba75c3da7618bdbbd96dcd7893f41aa5f1c Text-content-length: 122 Text-content-md5: 14c6fa70530f532baaf5ff02ed43666a Text-content-sha1: 9f11c7f7a118e3cd9d18a9e456cb6cdb5adbd95b Content-length: 122 SVN dd# don't put in the or , since we're adding text on # the end s/<\/(body|html)>//i Revision-number: 4895 Prop-content-length: 354 Content-length: 354 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-11-24T11:35:27.622920Z K 7 svn:log V 253 It's probably about time I took my private path to the Halibut binary out of the PuTTY docs Makefile. Instead, I expect to find Halibut as simply `halibut' on the PATH, and anyone who doesn't have it there can always do `make HALIBUT=/path/to/halibut'. PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 631e1b0402f33fb9ffdfd456587eb6c8 Text-delta-base-sha1: 046bca271b3612cc3c11ca84d43cd829b54bae2d Text-content-length: 20 Text-content-md5: 166929d27830a149ced8eddc25f02385 Text-content-sha1: af638210cd0250959c0b691cd789ec7f49d89e06 Content-length: 20 SVNv\ '5A Revision-number: 4896 Prop-content-length: 406 Content-length: 406 K 7 svn:log V 305 RJK's OS X portability patch: - initialise blank mbstate_t using memset rather than an ad-hoc initialiser. - expand the OMIT_UTMP ifdefs to enclose a load of entire functions that would generate `static function never called' warnings if left as empty shells. - couple of other fiddly things. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-11-24T11:36:08.241070Z PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db11eca5e1196c22a96e39cbfdfc9017 Text-delta-base-sha1: 4af232b59274e50992b713f0e065ec83eccaaab6 Text-content-length: 689 Text-content-md5: 2e7178cde925a0bb44d736711e11bdca Text-content-sha1: 1a4a7cf0fdc69f93c71e5f59f6de3d37e5f03bcc Content-length: 689 SVN2y`Cgw}~bq@ {x7V7 ~y9p9EJk4oCstatchild_pidchar **pty_argv; int use_pty_argv = TRUE; static void pty_close(void); #ifndef OMIT_UTMP static int pty_utmp_helper_pid, pty_utmp_helper_pipe; static int pty_stamped_utmp = 0; static struct utmp utmp_entry; static void setup_utmp(char *ttyname, char *location) {} static void cleanup_utmp(void) {} #endif#ifndef OMIT_UTMP#endif#ifndef OMIT_UTMP pid_t pid; int pipefd[2]; #endif#ifndef HAVE_NO_SETRESUID int gid = getgid(), uid = getuid();#ifndef OMIT_UTMP#endifpgrp, pgrp); close(open(pty_name, O_WRONLY, 0)); setpgrp(pgrp, pgrp#ifndef OMIT_UTMP#endif Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b9b0ff9e99069ff1606272090dd5651 Text-delta-base-sha1: a7515dcfa3628cfa378e8b3ed74c5cc4ae17156f Text-content-length: 111 Text-content-md5: 67333cf93f56817eaee957d4faea3463 Text-content-sha1: de1765e1643007dafcd6ef92f818e71cb37c367b Content-length: 111 SVN.bT d; memset(&state, 0, sizeof state);; int n = 0; memset(&state, 0, sizeof state); Revision-number: 4897 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2004-11-24T11:42:45.495246Z K 7 svn:log V 44 I think rjk meant `setpgid', not `setpgrp'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e7178cde925a0bb44d736711e11bdca Text-delta-base-sha1: 1a4a7cf0fdc69f93c71e5f59f6de3d37e5f03bcc Text-content-length: 84 Text-content-md5: 5f2e5750ff9351c3a72e913342e0cff8 Text-content-sha1: 5113de05aa6a3884c53bef22aab9a7eae7080ac3 Content-length: 84 SVNyy =Qkid(pgrp, pgrp); close(open(pty_name, O_WRONLY, 0)); setpgid Revision-number: 4898 Prop-content-length: 803 Content-length: 803 K 8 svn:date V 27 2004-11-24T18:45:52.199271Z K 7 svn:log V 702 Minor refactoring: the fields `pktin' and `pktout' in the Ssh structure have been retired. Now all Packet structures are dynamically allocated. Each rdpkt function allocates one, and it's freed after being used; and the packet construction functions allocate them too, and they're freed by the send functions. `pktin' and `pktout' were ugly. They were _morally_ still global variables; even though they were replicated per SSH session to comply with the Mac no-globals requirement, they weren't really in the _spirit_ of `dynamically allocate your data'. As a side effect of this change, the `pktout_blanks' and `pktout_nblanks' fields in the Ssh structure have been moved into the Packet structure. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2149eaad8a969f5b0a3fb93a06486cf8 Text-delta-base-sha1: 6f2bf57b4b191eb7c29248ef8bce37e0577c6d0b Text-content-length: 38843 Text-content-md5: e1d31d741032cab9d7653c0af0a67f26 Text-content-sha1: 44dcc5a1e157a7c9a8f181d5a1fa66b35fbf496c Content-length: 38843 SVNnm:>d=pm8lxv,9cosFm@* W>hrI-92zWe'yfn`v$rRP*p6OsXG}PvLcn|S@UJF=]-L2Ak}~ ns,}'E.U>,n#$xAEF~f!wl7w[%"w!? + P Y=qru%2wu*w'G nt@ pAZjS~SS~|W=NrW9.[bh^9->tt IOzx.twnA G;]J_c8NR0G]7&F;egO@"$3BwiAFPJj6?{zqz,[7|6yMbc (Rbq,VHHqQOvPPl]%l9struct Packet; static struct Packet *ssh2_pkt_init(int pkt_type); static void ssh2_pkt_addbool(struct Packet *, unsigned char value); static void ssh2_pkt_adduint32(struct Packet *, unsigned long value); static void ssh2_pkt_addstring_start(struct Packet *); static void ssh2_pkt_addstring_str(struct Packet *, char *data); static void ssh2_pkt_addstring_data(struct Packet *, char *data, int len); static void ssh2_pkt_addstring(struct Packet *struct Packet *, Bignum b); static int ssh2_pkt_construct(Ssh, struct Packet *); static void ssh2_pkt_send(Ssh, struct Packet *); static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin); static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin /* * State associated with packet logging */ int logmode; int nblanks; struct logblank_t *blanks; }; static void ssh1_protocol(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin); static void ssh2_protocol(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktinstruct Packet *pkt); static int ssh2_pkt_getbool(struct Packet *pkt); static void ssh_pkt_getstring(struct Packet *pkt struct Packet *pktin struct Packet *pktinunsigned char *deferred_send_data; int deferred_len, deferred_size struct Packet *pkt); struct Packet *struct Packet *pkt, int blanktype) { if (ssh->cfg.logomitpass) pkt->logmode = blanktype; } static void dont_log_data(Ssh ssh, struct Packet *pkt, int blanktype) { if (ssh->cfg.logomitdata) pkt->logmode = blanktype; } static void end_log_omission(Ssh ssh, struct Packet *pkt) { pkt->static void ssh_free_packet(struct Packet *pkt) { sfree(pkt->data); sfree(pkt); } static struct Packet *ssh_new_packet(void) { struct Packet *pkt = snew(struct Packet); pkt->data = NULL; pkt->maxlen = 0; pkt->logmode = PKTLOG_EMIT; pkt->nblanks = 0; pkt->blanks = NULL; return pkta Packet structure when a packet is completed. */ static struct Packet *t->pktin = ssh_new_packet(); st->pktin->type = 0; st->pktin->length = 0; for (st->i = st->len = 0; st->i < 4; st->i++) { while ((*datalen) == 0) crReturn(NULLt->pktin-> ssh_free_packet(st->pktin); crStop(NULL); } st->pktin->maxlen = st->biglen; st->pktin->data = snewn(st->biglen + APIEXTRA, unsigned char); st->to_read = st->biglen; st->p = st->pktin->NULLt->pktin-> ssh_free_packet(st->pktin); crStop(NULL); } if (ssh->cipher) ssh->cipher->decrypt(ssh->v1_cipher_ctx, st->pktin->data, st->biglen); st->realcrc = crc32_compute(st->pktin->data, st->biglen - 4); st->gotcrc = GET_32BIT(st->pktin->ssh_free_packet(st->pktin); crStop(NULL); } st->pktin->body = st->pktin->data + st->pad + 1; st->pktin->t->pktin->body - 1, st->pktin->ssh_free_packet(st->pktin); crStop(NULL); } if (st->pktin->maxlen < st->pad + decomplen) { st->pktin->maxlen = st->pad + decomplen; st->pktin->data = sresize(st->pktin->data, st->pktin->maxlen + APIEXTRA, unsigned char); st->pktin->body = st->pktin->data + st->pad + 1; } memcpy(st->pktin->body - 1, decompblk, decomplen); sfree(decompblk); st->pktin->length = decomplen - 1; } st->pktin->type = st->pktin->t->pktin->type == SSH1_SMSG_STDOUT_DATA) || (st->pktin->type == SSH1_SMSG_STDERR_DATA)) { do_blank = TRUE; blank_prefix = 0; } else if (st->pktin->t->pktin->length PKT_INCOMING, st->pktin->type, ssh1_pkt_type(st->pktin->type), st->pktin->body, st->pktin->length, nblanks, &blank); } if (st->pktin->type == SSH1_SMSG_STDOUT_DATA || st->pktin->type == SSH1_SMSG_STDERR_DATA || st->pktin->type == SSH1_MSG_DEBUG || st->pktin->type == SSH1_SMSG_AUTH_TIS_CHALLENGE || st->pktin->t->pktin->body); if (stringlen + 4 != st->pktin->ssh_free_packet(st->pktin); crStop(NULL); } } if (st->pktin->t->pktinssh_free_packet(st->pktin); goto next_packet; } else if (st->pktin->type == SSH1_MSG_IGNORE) { /* do nothing */ ssh_free_packet(st->pktin); goto next_packet; } if (st->pktin->t->pktin, &msg, &msglen); bombout(("Server sent disconnect message:\n\"%.*s\"", msglen, msg)); ssh_free_packet(st->pktin); crStop(NULL); } crFinish(st->pktin); } static struct Packet *ssh2 st->pktin = ssh_new_packet(); st->pktin->type = 0; st->pktin->st->pktin->data = snewn(st->cipherblk + APIEXTRA, unsigned char);NULL); st->pktin->t->pktin->t->pktin->data); st->pad = st->pktin->ssh_free_packet(st->pktin); crStop(NULLt->pktin->llocate memory for the rest of the packet. */ st->pktin->maxlen = st->packetlen + st->maclen; st->pktin->data = sresize(st->pktin->data, st->pktin->maxlen + APIEXTRA, unsigned char);NULL); st->pktin->t->pktin->t->pktin->data, st->len + 4, st->incoming_sequence)) { bombout(("Incorrect MAC received on packet")); ssh_free_packet(st->pktin); crStop(NULLt->pktin->data + 5, st->pktin->length - 5, &newpayload, &newlen)) { if (st->pktin->maxlen < newlen + 5) { st->pktin->maxlen = newlen + 5; st->pktin->data = sresize(st->pktin->data, st->pktin->maxlen + APIEXTRA, unsigned char); } st->pktin->length = 5 + newlen; memcpy(st->pktin->t->pktin->savedpos = 6; st->pktin->body = st->pktin->data; st->pktin->type = st->pktin->data[5st->pktin->type == SSH2_MSG_CHANNEL_DATA) { do_blank = TRUE; blank_prefix = 4; } else if (st->pktin->t->pktin->t->pktin->type, ssh2_pkt_type(ssh->pkt_ctx, st->pktin->type), st->pktin->data+6, st->pktin->length-6, nblanks, &blank); } switch (st->pktin->t->pktin); ssh_pkt_getstring(st->pktin ssh_free_packet(st->pktin); crStop(NULL); } break; case SSH2_MSG_IGNORE: ssh_free_packet(st->pktin);t->pktin); ssh_pkt_getstring(st->pktin ssh_free_packet(st->pktin);{ struct Packet *pktout; pktout = ssh2_pkt_init(SSH2_MSG_UNIMPLEMENTED); ssh2_pkt_adduint32(pktout, st->incoming_sequence - 1); ssh2_pkt_send(ssh, pktout); } break; } crFinish(st->pktin); } static void ssh1_pktout_size(struct Packet *pktpkt->length = len - 5; if (pkt->maxlen < biglen) { pkt->maxlen = biglen; pkt->data = sresize(pkt->data, biglen + 4 + APIEXTRA, unsigned char); } pkt->body = pkt->data + 4 + pad + 1; } static struct Packet *s_wrpkt_start(int type, int len) { struct Packet *pkt = ssh_new_packet(); ssh1_pktout_size(pkt, len); pkt->type = type; /* Initialise log omission state */ pkt->nblanks = 0; pkt->blanks = NULL; return pkt; } static int s_wrpkt_prepare(Ssh ssh, struct Packet *pktpkt->body[-1] = pkt->type; if (ssh->logctx) log_packet(ssh->logctx, PKT_OUTGOING, pkt->type, ssh1_pkt_type(pkt->type), pkt->body, pkt->length, pkt->nblanks, pkt->blanks); sfree(pkt->blanks); pkt->blanks = NULL; pkt->pkt->body - 1, pkt->length + 1, &compblk, &complen); ssh1_pktout_size(pkt, complen - 1); memcpy(pkt->body - 1, compblk, complen); sfree(compblk); } len = pkt->pkt->data[i + 4] = random_byte(); crc = crc32_compute(pkt->data + 4, biglen - 4); PUT_32BIT(pkt->data + biglen, crc); PUT_32BIT(pkt->data, len); if (ssh->cipher) ssh->cipher->encrypt(ssh->v1_cipher_ctx, pkt->data + 4, biglen); return biglen + 4; } static void s_wrpkt(Ssh ssh, struct Packet *pkt) { int len, backlog; len = s_wrpkt_prepare(ssh, pkt); backlog = sk_write(ssh->s, (char *)pkt->, struct Packet *pkt) { int len; len = s_wrpkt_prepare(ssh, pktpkt->struct Packet *construct_packet(Ssh ssh, int pkttype, struct Packet *pktpkt = s_wrpkt_start(pkttype, pktlen); p = pkt->body; while ((argtype = va_arg(ap2, int)) != PKT_END) { int offset = p - pkt->pkt, PKTLOG_BLANK); break; case PKTT_DATA: dont_log_data(ssh, pkt, PKTLOG_OMIT); break; case PKTT_OTHER: end_log_omission(ssh, pktpkt->logmode != PKTLOG_EMIT)) { pkt->nblanks++; pkt->blanks = sresize(pkt->blanks, pkt->nblanks, struct logblank_t); pkt->blanks[pkt->nblanks-1].offset = offset; pkt->blanks[pkt->nblanks-1].len = len; pkt->blanks[pkt->nblanks-1].type = pkt->logmode; } } return pkt; } static void send_packet(Ssh ssh, int pkttype, ...) { struct Packet *pkt;pkt = construct_packet(ssh, pkttype, ap1, ap2); va_end(ap2); va_end(ap1); s_wrpkt(ssh, pkt); ssh_free_packet(pkt); } static void defer_packet(Ssh ssh, int pkttype, ...) { struct Packet *pkt;pkt = construct_packet(ssh, pkttype, ap1, ap2); va_end(ap2); va_end(ap1); s_wrpkt_defer(ssh, pkt); ssh_free_packet(pktstruct Packet *pkt, int length) { if (pkt->maxlen < length) { pkt->maxlen = length + 256; pkt->data = sresize(pkt->data, pkt->maxlen + APIEXTRA, unsigned char); } } static void ssh2_pkt_adddata(struct Packet *pkt, void *data, int len) { if (pkt->logmode != PKTLOG_EMIT) { pkt->nblanks++; pkt->blanks = sresize(pkt->blanks, pkt->nblanks, struct logblank_t); pkt->blanks[pkt->nblanks-1].offset = pkt->length - 6; pkt->blanks[pkt->nblanks-1].len = len; pkt->blanks[pkt->nblanks-1].type = pkt->logmode; } pkt->length += len; ssh2_pkt_ensure(pkt, pkt->length); memcpy(pkt->data + pkt->length - len, data, len); } static void ssh2_pkt_addbyte(struct Packet *pkt, unsigned char byte) { ssh2_pkt_adddata(pkt, &byte, 1); } static struct Packet *ssh2_pkt_init(int pkt_type) { struct Packet *pkt = ssh_new_packet(); pkt->length = 5; ssh2_pkt_addbyte(pkt, (unsigned char) pkt_type); return pkt; } static void ssh2_pkt_addbool(struct Packet *pkt, unsigned char value) { ssh2_pkt_adddata(pkt, &value, 1); } static void ssh2_pkt_adduint32(struct Packet *pkt, unsigned long value) { unsigned char x[4]; PUT_32BIT(x, value); ssh2_pkt_adddata(pkt, x, 4); } static void ssh2_pkt_addstring_start(struct Packet *pkt) { ssh2_pkt_adduint32(pkt, 0); pkt->savedpos = pkt->length; } static void ssh2_pkt_addstring_str(struct Packet *pkt, char *data) { ssh2_pkt_adddata(pkt, data, strlen(data)); PUT_32BIT(pkt->data + pkt->savedpos - 4, pkt->length - pkt->savedpos); } static void ssh2_pkt_addstring_data(struct Packet *pkt, char *data, int len) { ssh2_pkt_adddata(pkt, data, len); PUT_32BIT(pkt->data + pkt->savedpos - 4, pkt->length - pkt->savedpos); } static void ssh2_pkt_addstring(struct Packet *pkt, char *data) { ssh2_pkt_addstring_start(pkt); ssh2_pkt_addstring_str(pktstruct Packet *pktsh2_pkt_addstring_start(pkt); ssh2_pkt_addstring_data(pktpkt->data. Total length is returned. */ static int ssh2_pkt_construct(Ssh ssh, struct Packet *pktpkt->data[5], ssh2_pkt_type(ssh->pkt_ctx, pkt->data[5]), pkt->data + 6, pkt->length - 6, pkt->nblanks, pkt->blanks); sfree(pkt->blanks); pkt->blanks = NULL; pkt->pkt->data + 5, pkt->length - 5, &newpayload, &newlen)) { pkt->length = 5; ssh2_pkt_adddata(pktpkt->length + padding) % cipherblk) % cipherblk; maclen = ssh->csmac ? ssh->csmac->len : 0; ssh2_pkt_ensure(pkt, pkt->length + padding + maclen); pkt->data[4] = padding; for (i = 0; i < padding; i++) pkt->data[pkt->length + i] = random_byte(); PUT_32BIT(pkt->data, pkt->length + padding - 4); if (ssh->csmac) ssh->csmac->generate(ssh->cs_mac_ctx, pkt->data, pkt->pkt->data, pkt->length + padding); /* Ready-to-send packet starts at pkt->data. We return length. */ return pkt->, struct Packet *pkt) { int len; int backlog; len = ssh2_pkt_construct(ssh, pkt); backlog = sk_write(ssh->s, (char *)pkt->data, len); if (backlog > SSH_MAX_BACKLOG) ssh_throttle_all(ssh, 1, backlog); ssh_free_packet(pkt, struct Packet *pkt) { int len = ssh2_pkt_construct(ssh, pktpkt->data, len); ssh->deferred_len += len; ssh_free_packet(pkt)struct Packet *pkt) { unsigned long value; if (pkt->length - pkt->pkt->body + pkt->savedpos); pkt->savedpos += 4; return value; } static int ssh2_pkt_getbool(struct Packet *pkt) { unsigned long value; if (pkt->length - pkt->savedpos < 1) return 0; /* arrgh, no way to decline (FIXME?) */ value = pkt->body[pkt->savedpos] != 0; pkt->savedpos++; return value; } static void ssh_pkt_getstring(struct Packet *pkt, char **p, int *length) { int len; *p = NULL; *length = 0; if (pkt->length - pkt->savedpos < 4) return; len = GET_32BIT(pkt->body + pkt->savedpos); if (len < 0) return; *length = len; pkt->savedpos += 4; if (pkt->length - pkt->savedpos < *length) return; *p = (char *)(pkt->body + pkt->savedpos); pkt->savedpos += *length; } static void *ssh_pkt_getdata(struct Packet *pkt, int length) { if (pkt->length - pkt->savedpos < length) return NULL; pkt->savedpos += length; return pkt->body + (pkt->savedpos - length); } static int ssh1_pkt_getrsakey(struct Packet *pkt, struct RSAKey *key, unsigned char **keystr) { int j; j = makekey(pkt->body + pkt->savedpos, pkt->length - pkt->savedpos, key, keystr, 0); if (j < 0) return FALSE; pkt->savedpos += j; assert(pkt->savedpos < pkt->length); return TRUE; } static Bignum ssh1_pkt_getmp(struct Packet *pkt) { int j; Bignum b; j = ssh1_read_bignum(pkt->body + pkt->savedpos, pkt->length - pkt->savedpos, &b); if (j < 0) return NULL; pkt->savedpos += j; return b; } static Bignum ssh2_pkt_getmp(struct Packet *pkt) { char *p; int length; Bignum b; ssh_pkt_getstring(pkt, &p, &length); if (!p) return NULL; if (p[0] & 0x80) return NULL;struct Packet *pkt, pkt); ssh2_pkt_addstring_data(pktpktpkt, (char *)newlen, 1); /* dmemdump(newlen, 1); */ } ssh2_pkt_addstring_data(pktpkt); ssh2_pkt_addstring_data(pktstruct Packet *pktin = ssh->s_rdpkt(ssh, &data, &datalen); if (pktin) { ssh->protocol(ssh, NULL, 0, pktin); ssh_free_packet(pktin); } if (ssh->state == SSH_STATE_CLOSED) return;NULL); else do_ssh2_authconn(ssh, NULL, -1, NULL struct Packet *pktinpktin) crWaitUntil(pktin); if (pktin->pktinpktin, &servkey, &s->keystr1) || !ssh1_pkt_getrsakey(pktinpktin); s->supported_ciphers_mask = ssh_pkt_getuint32(pktin); s->supported_auths_mask = ssh_pkt_getuint32(pktinpktin); if (pktin->pktinpktinpktin->pktinpktinpktin); if (pktin->pktinpktinpktinpktin); if (pktin->pktin); if (pktin->pktinpktin); if (pktin->pktinpktinpktin); if (pktin->pktin->pktinpktin); if (pktin->pktin->pktin); if (pktin->pktin->pktin->truct Packet *pktout; pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_send(ssh, pktout struct Packet *pktinpktinpktin); if (pktin->type != SSH1_SMSG_SUCCESS && pktin->pktin->Bx]} n;6Ac:(]}e]}0(:fR+O,"~N+h|moVz,Z1V?a ?v[!T *?iZQ \;"bsEDiJ+O/1bN6?X1m Jmt0~ RM3+M3/;$d~N;$u_ov3wSUxM85Yf5K>ov3y&K>ov&{:Ni@s |I(PQ\ov2v`DaCgpovTi:C&tMX1.2Oi1O!HK>KB$ov #$oS,E(tP.ZNR~vzfs[%D lm| a)?DZw7qJtAU9%6Wj _'Z~U|T_STR, data, PKT_END); } do { crReturnV; } while (!pktin); if (pktin->type != SSH1_SMSG_SUCCESS && pktin->pktin->type == SSH1_SMSG_FAILURE) {pktin); if (pktin->type != SSH1_SMSG_SUCCESS && pktin->pktin->pktin); if (pktin->type != SSH1_SMSG_SUCCESS && pktin->pktin->pktin); if (pktin->type != SSH1_SMSG_SUCCESS && pktin->pktin->pktin) { if (pktin->type == SSH1_SMSG_STDOUT_DATA || pktin->type == SSH1_SMSG_STDERR_DATA) { char *string; int stringlen, bufsize; ssh_pkt_getstring(pktinpktin->pktin->pktin->pktinpktin->pktinpktin->pktin); ssh_pkt_getstring(pktin, &host, &hostsize); port = ssh_pkt_getuint32(pktinpktin->pktin); unsigned int localid = ssh_pkt_getuint32(pktinpktin->type == SSH1_MSG_CHANNEL_OPEN_FAILURE) { unsigned int remoteid = ssh_pkt_getuint32(pktinpktin->type == SSH1_MSG_CHANNEL_CLOSE || pktin->pktinpktin->pktin->pktin->pktin->pktin); char *p; int len; struct ssh_channel *c; ssh_pkt_getstring(pktinpktin->pktin->pktin->type == SSH1_SMSG_EXIT_STATUS) { char buf[100]; ssh->exitcode = ssh_pkt_getuint32(pktinpktin-> struct Packet *pktin struct Packet *pktout->pktout = ssh2_pkt_init(SSH2_MSG_KEXINIT); for (i = 0; i < 16; i++) ssh2_pkt_addbyte(s->pktout, (unsigned char) random_byte()); /* List key exchange algorithms. */ ssh2_pkt_addstring_start(s->pktout->pktout, kex_algs[i]->name); if (i < lenof(kex_algs) - 1) ssh2_pkt_addstring_str(s->pktout->pktout); for (i = 0; i < lenof(hostkey_algs); i++) { ssh2_pkt_addstring_str(s->pktout, hostkey_algs[i]->name); if (i < lenof(hostkey_algs) - 1) ssh2_pkt_addstring_str(s->pktout->pktout); cipherstr_started->pktout, ","); ssh2_pkt_addstring_str(s->pktout->pktout); cipherstr_startedcontinue;->pktout, ","); ssh2_pkt_addstring_str(s->pktout->pktout); for (i = 0; i < s->nmacs; i++) { ssh2_pkt_addstring_str(s->pktout->pktout, ","); } /* List server->client MAC algorithms. */ ssh2_pkt_addstring_start(s->pktout); for (i = 0; i < s->nmacs; i++) { ssh2_pkt_addstring_str(s->pktout->pktout, ","); } /* List client->server compression algorithms. */ ssh2_pkt_addstring_start(s->pktout); assert(lenof(compressions) > 1); ssh2_pkt_addstring_str(s->pktout->pktout, ","); ssh2_pkt_addstring_str(s->pktout->pktout); assert(lenof(compressions) > 1); ssh2_pkt_addstring_str(s->pktout->pktout, ","); ssh2_pkt_addstring_str(s->pktout, c->name); } } /* List client->server languages. Empty list. */ ssh2_pkt_addstring_start(s->pktout); /* List server->client languages. Empty list. */ ssh2_pkt_addstring_start(s->pktout->pktout, FALSE); /* Reserved. */ ssh2_pkt_adduint32(s->pktout, 0); } ssh->exhash = ssh->exhashbase; sha_string(&ssh->exhash, s->pktout->data + 5, s->pktout->length - 5); ssh2_pkt_send(ssh, s->pktout); if (!pktin) crWaitUntil(pktin); if (pktin->length > 5) sha_string(&ssh->exhash, pktin->data + 5, pktin->pktin->pktin->savedpos += 16; /* skip garbage cookie */ ssh_pkt_getstring(pktinpktinpktinpktinpktinpktinpktinpktin->pktout = ssh2_pkt_init(SSH2_MSG_KEX_DH_GEX_REQUEST); ssh2_pkt_adduint32(s->pktout, s->pbits); ssh2_pkt_send(ssh, s->pktout); crWaitUntil(pktin); if (pktin->pktin); s->g = ssh2_pkt_getmp(pktin); if (!s->p || !s->g) { bombout(("unable to read mp-ints from incoming group packet")); crStop(0); }->pktout = ssh2_pkt_init(s->kex_init_value); ssh2_pkt_addmp(s->pktout, s->e); ssh2_pkt_send(ssh, s->pktout); crWaitUntil(pktin); if (pktin->pktin, &s->hostkeydata, &s->hostkeylen); s->f = ssh2_pkt_getmp(pktin); if (!s->f) { bombout(("unable to parse key exchange reply packet")); crStop(0); } ssh_pkt_getstring(pktin->pktout = ssh2_pkt_init(SSH2_MSG_NEWKEYS); ssh2_pkt_send(ssh, s->pktout); /* * Expect SSH2_MSG_NEWKEYS from server. */ crWaitUntil(pktin); if (pktin->pktin && pktin-> struct Packet *pktoutpktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA); ssh2_pkt_adduint32(pktout, c->remoteid); dont_log_data(ssh, pktout, PKTLOG_OMIT); ssh2_pkt_addstring_start(pktout); ssh2_pkt_addstring_data(pktout, data, len); end_log_omission(ssh, pktout); ssh2_pkt_send(ssh, pktouttruct Packet *pktout; pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_adduint32(pktout, newwin - c->v.v2.locwindow); ssh2_pkt_send(ssh, pktout struct Packet *pktin struct Packet *pktout->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST); ssh2_pkt_addstring(s->pktout, "ssh-userauth"); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->pktin->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout, "ssh-connection");/* service requested */ ssh2_pkt_addstring(s->pktout, "none"); /* method */ ssh2_pkt_send(ssh, s->pktoutpktin); while (pktin->pktinpktin); } if (pktin->pktin->pktin->pktin->pktin->type == SSH2_MSG_USERAUTH_FAILURE) { char *methods; int methlen; ssh_pkt_getstring(pktinpktinpktinpktin->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout->pktout, "publickey"); /* method */ ssh2_pkt_addbool(s->pktout, FALSE); /* no signature included */ ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout->pktout, "publickey"); /* method */ ssh2_pkt_addbool(s->pktout, TRUE); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen); s->siglen = s->pktout->->pktout->data + 5, s->pktout->length - 5); s->q += s->pktout->pktinpktintout, , s->pktout->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout->pktout, "publickey"); /* method */ ssh2_pkt_addbool(s->pktout, FALSE); /* no signature included */ ssh2_pkt_addstring(s->pktout, algorithm); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, (char *)pub_blob, pub_blob_len); ssh2_pkt_send(ssh, s->pktout); logevent("Offered public key"); crWaitUntilV(pktin); if (pktin->->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(s->pktout, "keyboard-interactive"); /* method */ ssh2_pkt_addstring(s->pktout, ""); /* lang */ ssh2_pkt_addstring(s->pktout, ""); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_USERAUTH_INFO_REQUEST) { if (pktin->pktin, &name, &name_len); ssh_pkt_getstring(pktin, &inst, &inst_len); ssh_pkt_getstring(pktinpktinpktinpktin->pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(s->pktout,SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(s->pktout, "No more passwords available" " to try"); ssh2_pkt_addstring(s->pktout, "en"); /* language tag */ ssh2_pkt_send(ssh, s->pktoutpktin->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout->pktout, "none"); /* method */ ssh2_pkt_send(ssh, s->pktout->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout->pktout, "publickey"); /* method */ ssh2_pkt_addbool(s->pktout, TRUE); ssh2_pkt_addstring(s->pktout->pktout); ssh2_pkt_addstring_data(s->pktout->pktout->->pktout->data + 5, s->pktout->length - 5); p += s->pktout->s->pktout, s->pktout->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(s->pktout, "password"); ssh2_pkt_addbool(s->pktout, FALSE); dont_log_password(ssh, s->pktout, PKTLOG_BLANK); ssh2_pkt_addstring(s->pktout, s->password); memset(s->password, 0, sizeof(s->password)); end_log_omission(ssh, s->pktout); ssh2_pkt_defer(ssh, s->pktout->pktout = ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(s->pktout->pktout, &c, 1); } ssh2_pkt_defer(ssh, s->pktout->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_INFO_RESPONSE); ssh2_pkt_adduint32(s->pktout, s->num_prompts); } if (s->need_pw) { /* only add pw if we just got one! */ dont_log_password(ssh, s->pktout, PKTLOG_BLANK); ssh2_pkt_addstring(s->pktout, s->pktout); s->curr_prompt++; } if (s->curr_prompt >= s->num_prompts) { ssh2_pkt_send(ssh, s->pktout->pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(s->pktout, SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(s->pktout->pktout, "en"); /* language tag */ ssh2_pkt_send(ssh, s->pktout->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring(s->pktout, "session"); ssh2_pkt_adduint32(s->pktout->pktout, ssh->mainchan->v.v2.locwindow);/* our window size */ ssh2_pkt_adduint32(s->pktout, 0x4000UL); /* our max pkt size */ ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->pktinpktinpktin); ssh->mainchan->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(s->pktout, "x11-req"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_addbool(s->pktout, 0); /* many connections */ ssh2_pkt_addstring(s->pktout, proto); ssh2_pkt_addstring(s->pktout, data); ssh2_pkt_adduint32(s->pktout, x11_get_screen_number(ssh->cfg.x11_display)); ssh2_pkt_send(ssh, s->pktout); do { crWaitUntilV(pktin); if (pktin->pktin); struct ssh_channel *c; c->v.v2.remwindow += ssh_pkt_getuint32(pktin); } } while (pktin->type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->pktin->->pktout = ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST); ssh2_pkt_addstring(s->pktout, "tcpip-forward"); ssh2_pkt_addbool(s->pktout, 1);/* want reply */ if (*saddr) { ssh2_pkt_addstring(s->pktout, saddr); } else if (ssh->cfg.rport_acceptall) { ssh2_pkt_addstring(s->pktout, "0.0.0.0"); } else { ssh2_pkt_addstring(s->pktout, "127.0.0.1"); } ssh2_pkt_adduint32(s->pktout, sport); ssh2_pkt_send(ssh, s->pktout); do { crWaitUntilV(pktin); if (pktin->pktinpktin); } } while (pktin->type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin->type != SSH2_MSG_REQUEST_SUCCESS) { if (pktin->pktin->->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(s->pktout, "auth-agent-req@openssh.com"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_send(ssh, s->pktout); do { crWaitUntilV(pktin); if (pktin->pktin); struct ssh_channel *c; c->v.v2.remwindow += ssh_pkt_getuint32(pktin); } } while (pktin->type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->pktin->->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid); /* recipient channel */ ssh2_pkt_addstring(s->pktout, "pty-req"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_addstring(s->pktout, ssh->cfg.termtype); ssh2_pkt_adduint32(s->pktout, ssh->term_width); ssh2_pkt_adduint32(s->pktout, ssh->term_height); ssh2_pkt_adduint32(s->pktout, 0); /* pixel width */ ssh2_pkt_adduint32(s->pktout, 0); /* pixel height */ ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addbyte(s->pktout, 128); /* TTY_OP_ISPEED */ ssh2_pkt_adduint32(s->pktout, ssh->ispeed); ssh2_pkt_addbyte(s->pktout, 129); /* TTY_OP_OSPEED */ ssh2_pkt_adduint32(s->pktout, ssh->ospeed); ssh2_pkt_addstring_data(s->pktout, "\0", 1); /* TTY_OP_END */ ssh2_pkt_send(ssh, s->pktout); ssh->state = SSH_STATE_INTERMED; do { crWaitUntilV(pktin); if (pktin->pktin); struct ssh_channel *c; c->v.v2.remwindow += ssh_pkt_getuint32(pktin); } } while (pktin->type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Unexpected response to pty request:" " packet type %d", pktin->->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(s->pktout, "env"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, var, varend-var); ssh2_pkt_addstring(s->pktout, val); ssh2_pkt_send(ssh, s->pktoutpktin); if (pktin->type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) { unsigned i = ssh_pkt_getuint32(pktinpktin); } } while (pktin->type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->pktin->->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(s->pktout->pktout, "subsystem"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_addstring(s->pktout, cmd); } else if (*cmd) { ssh2_pkt_addstring(s->pktout, "exec"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_addstring(s->pktout, cmd); } else { ssh2_pkt_addstring(s->pktout, "shell"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ } ssh2_pkt_send(ssh, s->pktout); do { crWaitUntilV(pktin); if (pktin->pktin); struct ssh_channel *c; c->v.v2.remwindow += ssh_pkt_getuint32(pktin); } } while (pktin->type == SSH2_MSG_CHANNEL_WINDOW_ADJUST); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->pktin->pktin) { if (pktin->type == SSH2_MSG_CHANNEL_DATA || pktin->pktin); struct ssh_channel *c; if (pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA && ssh_pkt_getuint32(pktinpktinpktin->pktin->type == SSH2_MSG_CHANNEL_EOF) { unsigned i = ssh_pkt_getuint32(pktinpktin->type == SSH2_MSG_CHANNEL_CLOSE) { unsigned i = ssh_pkt_getuint32(pktin->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(s->pktout, c->remoteid); ssh2_pkt_send(ssh, s->pktout->pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(s->pktout, SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(s->pktout, "All open channels closed"); ssh2_pkt_addstring(s->pktout, "en"); /* language tag */ ssh2_pkt_send(ssh, s->pktoutpktin->pktinpktin); s->try_send = TRUE; } else if (pktin->type == SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) { unsigned i = ssh_pkt_getuint32(pktin); struct ssh_channel *c;pktin); c->type = CHAN_SOCKDATA; c->v.v2.remwindow = ssh_pkt_getuint32(pktin); c->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(s->pktout, c->remoteid); ssh2_pkt_send(ssh, s->pktout); } } else if (pktin->pktinpktinpktinpktin->pktin); ssh_pkt_getstring(pktin, &type, &typelen); want_reply = ssh2_pkt_getbool(pktin->pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(s->pktout, SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(s->pktout, buf); ssh2_pkt_addstring(s->pktout, "en"); /* language tag */ ssh2_pkt_send(ssh, s->pktoutpktinpktin->body + pktin->savedpos; long len = pktin->length - pktin->pktinpktinpktin); ssh_pkt_getstring(pktin->pktout = ssh2_pkt_init(reply); ssh2_pkt_adduint32(s->pktout, c->remoteid); ssh2_pkt_send(ssh, s->pktout); } } else if (pktin->pktin, &type, &typelen); want_reply = ssh2_pkt_getbool(pktin->pktout = ssh2_pkt_init(SSH2_MSG_REQUEST_FAILURE); ssh2_pkt_send(ssh, s->pktout); } } else if (pktin->pktin, &type, &typelen); c = snew(struct ssh_channel); c->ssh = ssh; remid = ssh_pkt_getuint32(pktin); winsize = ssh_pkt_getuint32(pktin); pktsize = ssh_pkt_getuint32(pktinpktinpktinpktin, &dummy, &dummylen);/* skip address */ pf.sport = ssh_pkt_getuint32(pktin); ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen); peerport = ssh_pkt_getuint32(pktin->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURE); ssh2_pkt_adduint32(s->pktout, c->remoteid); ssh2_pkt_adduint32(s->pktout, SSH2_OPEN_CONNECT_FAILED); ssh2_pkt_addstring(s->pktout, error); ssh2_pkt_addstring(s->pktout, "en"); /* language tag */ ssh2_pkt_send(ssh, s->pktout->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION); ssh2_pkt_adduint32(s->pktout, c->remoteid); ssh2_pkt_adduint32(s->pktout, c->localid); ssh2_pkt_adduint32(s->pktout, c->v.v2.locwindow); ssh2_pkt_adduint32(s->pktout, 0x4000UL); /* our max pkt size */ ssh2_pkt_send(ssh, s->pktout); } } else { bombout(("Strange packet received: type %d", pktin-> struct Packet *pktin) { if (do_ssh2_transport(ssh, in, inlen, pktin) == 0) return; do_ssh2_authconn(ssh, in, inlen, pktinssh->deferred_send_data = NULL; ssh->deferred_len = 0; ssh->deferred_size = 05U4MpF;scSo4NznjT5rRc3vH:5{+g 0; ssh->v1_throttle_count = 0; ssh->overall_bufsize = 0; ssh->fallback_cmd = 0; ssh->protocol = NULL; p = connect_to_host(ssh, host, port, realhost, nodelay, keepalive); if (p != NULL) return p; return NULL; } static void ssh_free(void *handle) { Ssh ssh = (Ssh) handle; struct ssh_channel *c; struct ssh_rportfwd *pf; if (ssh->v1_cipher_ctx) ssh->cipher->free_context(ssh->v1_cipher_ctx); if (ssh->cs_cipher_ctx) ssh->cscipher->free_context(ssh->cs_cipher_ctx); if (ssh->sc_cipher_ctx) ssh->sccipher->free_context(ssh->sc_cipher_ctx); if (ssh->cs_mac_ctx) ssh->csmac->free_context(ssh->cs_mac_ctx); if (ssh->sc_mac_ctx) ssh->scmac->free_context(ssh->sc_mac_ctx); if (ssh->cs_comp_ctx) { if (ssh->cscomp) ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx); else zlib_compress_cleanup(ssh->cs_comp_ctx); } if (ssh->sc_comp_ctx) { if (ssh->sccomp) ssh->sccomp->decompress_cleanup(ssh->sc_comp_ctx); else zlib_decompress_cleanup(ssh->sc_comp_ctx); } if (ssh->kex_ctx) dh_cleanup(ssh->kex_ctx); sfree(ssh->savedhost); if (ssh->channels) { while ((c = delpos234(ssh->channels, 0)) != NULL) { switch (c->type) { case CHAN_X11: if (c->u.x11.s != NULL) x11_close(c->u.x11.s); break; case CHAN_SOCKDATA: if (c->u.pfd.s != NULL) pfd_close(c->u.pfd.s); break; } sfree(c); } freetree234(ssh->channels); } if (ssh->rportfwds) { while ((pf = delpos234(ssh->rportfwds, 0)) != NULL) sfree(pf); freetree234(ssh->rportfwds); } sfree(ssh->deferred_send_data); if (ssh->x11auth) x11_free_auth(ssh->x11auth); sfree(ssh->do_ssh_init_state); sfree(ssh->do_ssh1_login_state); sfree(ssh->do_ssh2_transport_state); sfree(ssh->do_ssh2_authconn_state); struct Packet *pktoutpktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(pktout, "window-change"); ssh2_pkt_addbool(pktout, 0); ssh2_pkt_adduint32(pktout, ssh->term_width); ssh2_pkt_adduint32(pktout, ssh->term_height); ssh2_pkt_adduint32(pktout, 0); ssh2_pkt_adduint32(pktout, 0); ssh2_pkt_send(ssh, pktout struct Packet *pktouttruct Packet *pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_EOF); ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid); ssh2_pkt_send(ssh, pktoutpktout = ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(pktout); ssh2_pkt_send(ssh, pktout); } } else if (code == TS_BRKlogevent("Unable to send BREAK signal in SSH1"); } else if (ssh->mainchan) { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(pktout, "break"); ssh2_pkt_addbool(pktout, 0); ssh2_pkt_adduint32(pktout, 0); /* default break length */ ssh2_pkt_send(ssh, pktoutpktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(pktout, "signal"); ssh2_pkt_addbool(pktout, 0); ssh2_pkt_addstring(pktout, signame); ssh2_pkt_send(ssh, pktout struct Packet *pktoutpktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring(pktout, "direct-tcpip"); ssh2_pkt_adduint32(pktoutpktout, c->v.v2.locwindow);/* our window size */ ssh2_pkt_adduint32(pktout, 0x4000UL); /* our max pkt size */ ssh2_pkt_addstring(pktout, hostname); ssh2_pkt_adduint32(pktoutpktout, "client-side-connection"); ssh2_pkt_adduint32(pktout, 0); ssh2_pkt_send(ssh, pktout); } } Revision-number: 4899 Prop-content-length: 484 Content-length: 484 K 8 svn:date V 27 2004-11-24T19:23:02.350603Z K 7 svn:log V 383 Now that Packet structures are dynamically allocated, it means we can keep several of them in parallel. In particular, this allows us to queue outgoing packets during repeat key exchange, to be actually sent after the rekey completes. (This doesn't fully fix ssh2-kex-data; also required is the ability to handle _incoming_ connection-layer packets during rekey without exploding.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e1d31d741032cab9d7653c0af0a67f26 Text-delta-base-sha1: 44dcc5a1e157a7c9a8f181d5a1fa66b35fbf496c Text-content-length: 9723 Text-content-md5: d1546e19f23bd06e9496acd604263ccc Text-content-sha1: 6b9b63b27e30a927b329c4ecbcca760dcf01f701 Content-length: 9723 SVNLKeZ:I7EW{_$B7-qUS_B0void ssh2_pkt_send_noqueue(Ssh, struct Packet *);struct Packet **queue; int queuelen, queuesize; int queueing;/* UNIMPLEMENTED messages MUST appear in the same order as * the messages they respond to. Hence, never queue them. */ ssh2_pkt_send_noqueueRoutines called from the main SSH code to send packets. There * are quite a few of these, because we have two separate * mechanisms for delaying the sending of packets: * * - In order to send an IGNORE message and a password message in * a single fixed-length blob, we require the ability to * concatenate the encrypted forms of those two packets _into_ a * single blob and then pass it to our transport * layer in one go. Hence, there's a deferment mechanism which * works after packet encryption. * * - In order to avoid sending any connection-layer messages * during repeat key exchange, we have to queue up any such * outgoing messages _before_ they are encrypted (and in * particular before they're allocated sequence numbers), and * then send them once we've finished. * * I call these mechanisms `defer' and `queue' respectively, so as * to distinguish them reasonably easily. * * The functions send_noqueue() and defer_noqueue() free the packet * structure they are passed. Every outgoing packet goes through * precisely one of these functions in its life; packets passed to * ssh2_pkt_send() or ssh2_pkt_defer() either go straight to one of * these or get queued, and then when the queue is later emptied * the packets are all passed to defer_noqueue(). */ /* * Send an SSH2 packet immediately, without queuing or deferring. */ static void ssh2_pkt_send_noqueueDefer an SSH2 packet. */ static void ssh2_pkt_defer_noqueueQueue an SSH2 packet. */ static void ssh2_pkt_queue(Ssh ssh, struct Packet *pkt) { assert(ssh->queueing); if (ssh->queuelen >= ssh->queuesize) { ssh->queuesize = ssh->queuelen + 32; ssh->queue = sresize(ssh->queue, ssh->queuesize, struct Packet *); } ssh->queue[ssh->queuelen++] = pkt; } /* * Either queue or send a packet, depending on whether queueing is * set. */ static void ssh2_pkt_send(Ssh ssh, struct Packet *pkt) { if (ssh->queueing) ssh2_pkt_queue(ssh, pkt); else ssh2_pkt_send_noqueue(ssh, pkt); } /* * Either queue or defer a packet, depending on whether queueing is * set. */ static void ssh2_pkt_defer(Ssh ssh, struct Packet *pkt) { if (ssh->queueing) ssh2_pkt_queue(ssh, pkt); else ssh2_pkt_defer_noqueue(ssh, * The expected use of the defer mechanism is that you call * ssh2_pkt_defer() a few times, then call ssh_pkt_defersend(). If * not currently queueing, this simply sets up deferred_send_data * and then sends it. If we _are_ currently queueing, the calls to * ssh2_pkt_defer() put the deferred packets on to the queue * instead, and therefore ssh_pkt_defersend() has no deferred data * to send. Hence, there's no need to make it conditional on * ssh->queueing/* * Send all queued SSH2 packets. We send them by means of * ssh2_pkt_defer_noqueue(), in case they included a pair of * packets that needed to be lumped together. */ static void ssh2_pkt_queuesend(Ssh ssh) { int i; assert(!ssh->queueing); for (i = 0; i < ssh->queuelen; i++) ssh2_pkt_defer_noqueue(ssh, ssh->queue[i]); ssh->queuelen = 0; ssh_pkt_defersend(sshaMo?6f e[-@,mK}@%=;bv/t_send(ssh, pktout); } } c->closes = 1; /* sent MSG_CLOSE */ if (c->type == CHAN_X11) { c->u.x11.s = NULL; logevent("Forwarded X11 connection terminated"); } else if (c->type == CHAN_SOCKDATA || c->type == CHAN_SOCKDATA_DORMANT) { c->u.pfd.s = NULL; logevent("Forwarded port closed"); } } } int sshfwd_write(struct ssh_channel *c, char *buf, int len) { Ssh ssh = c->ssh; if (ssh->state != SSH_STATE_SESSION) { assert(ssh->state == SSH_STATE_CLOSED); return 0; } if (ssh->version == 1) { send_packet(ssh, SSH1_MSG_CHANNEL_DATA, PKT_INT, c->remoteid, PKTT_DATA, PKT_INT, len, PKT_DATA, buf, len, PKTT_OTHER, PKT_END); /* * In SSH1 we can return 0 here - implying that forwarded * connections are never individually throttled - because * the only circumstance that can cause throttling will be * the whole SSH connection backing up, in which case * _everything_ will be throttled as a whole. */ return 0; } else { ssh2_add_channel_data(c, buf, len); return ssh2_try_send(c); } } void sshfwd_unthrottle(struct ssh_channel *c, int bufsize) { Ssh ssh = c->ssh; if (ssh->state != SSH_STATE_SESSION) { assert(ssh->state == SSH_STATE_CLOSED); return; } if (ssh->version == 1) { if (c->v.v1.throttling && bufsize < SSH1_BUFFER_LIMIT) { c->v.v1.throttling = 0; ssh1_throttle(ssh, -1); } } else { ssh2_set_window(c, OUR_V2_WINSIZE - bufsize); } } static void ssh1_protocol(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin) { crBegin(ssh->ssh1_protocol_crstate); random_init(); while (!do_ssh1_login(ssh, in, inlen, pktin)) { crReturnV; } if (ssh->state == SSH_STATE_CLOSED) crReturnV; if (ssh->cfg.agentfwd && agent_exists()) { logevent("Requesting agent forwarding"); send_packet(ssh, SSH1_CMSG_AGENT_REQUEST_FORWARDING, PKT_END);if (if (ssh->v1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) { send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKT_STR, data, PKT_INT, x11_get_screen_number(ssh->cfg.x11_display), PKT_END); } else { send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKEnable queueing of outgoing auth- or connection-layer * packets while we are in the middle of a key exchange. */ ssh->queueing = TRUE_noqueue_noqueue_noqueue_noqueue(ssh, s->pktout); /* * Now our end of the key exchange is complete, we can send all * our queued higher-layer packets. */ ssh->queueing = FALSE; ssh2_pkt_queuesend(ssh_noqueue_noqueue_noqueue_noqueue5:}q]i3 int i; struct ssh_channel *c; /* * Try to send data on all channels if we can. */ for (i = 0; NULL != (c = index234(ssh->channels, i)); i++) { int bufsize; if (c->closes) continue; /* don't send on closing channels */ bufsize = ssh2_try_send(c); if (bufsize == 0) { switch (c->type) { case CHAN_MAINSESSION: /* stdin need not receive an unthrottle * notification since it will be polled */ break; case CHAN_X11: x11_unthrottle(c->u.x11.s); break; case CHAN_AGENT: /* agent sockets are request/response and need no * buffer management */ break; case CHAN_SOCKDATA: pfd_unthrottle(c->u.pfd.s); break; } } } } } crFinishV; } /* * Handle the top-level SSH2 protocol. */ static void ssh2_protocol(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin) { if (do_ssh2_transport(ssh, in, inlen, pktin) == 0) return; do_ssh2_authconn(ssh, in, inlen, pktin); } /* * Called to set up the connection. * * Returns an error message, or NULL on success. */ static const char *ssh_init(void *frontend_handle, void **backend_handle, Config *cfg, char *host, int port, char **realhost, int nodelay, int keepalive) { const char *p; Ssh ssh; ssh = snew(struct ssh_tag); ssh->cfg = *cfg; /* STRUCTURE COPY */ ssh->version = 0; /* when not ready yet */ ssh->s = NULL; ssh->cipher = NULL; ssh->v1_cipher_ctx = NULL; ssh->crcda_ctx = NULL; ssh->cscipher = NULL; ssh->cs_cipher_ctx = NULL; ssh->sccipher = NULL; ssh->sc_cipher_ctx = NULL; ssh->csmac = NULL; ssh->cs_mac_ctx = NULL; ssh->scmac = NULL; ssh->sc_mac_ctx = NULL; ssh->cscomp = NULL; ssh->cs_comp_ctx = NULL; ssh->sccomp = NULL; ssh->sc_comp_ctx = NULL; ssh->kex = NULL; ssh->kex_ctx = NULL; ssh->hostkey = NULL; ssh->exitcode = -1; ssh->state = SSH_STATE_PREPACKET; ssh->size_needed = FALSE; ssh->eof_needed = FALSE; ssh->ldisc = NULL; ssh->logctx = NULL; ssh->deferred_send_data = NULL; ssh->deferred_len = 0; ssh->deferred_size = 0; ssh->fallback_cmd = 0; ssh->pkt_ctx = 0; ssh->x11auth = NULL; ssh->v1_compressing = FALSE; ssh->v2_outgoing_sequence = 0; ssh->ssh1_rdpkt_crstate = 0; ssh->ssh2_rdpkt_crstate = 0; ssh->do_ssh_init_crstate = 0; ssh->ssh_gotdata_crstate = 0; ssh->ssh1_protocol_crstate = 0; ssh->do_ssh1_login_crstate = 0; ssh->do_ssh2_transport_crstate = 0; ssh->do_ssh2_authconn_crstate = 0; ssh->do_ssh_init_state = NULL; ssh->do_ssh1_login_state = NULL; ssh->do_ssh2_transport_state = NULL; ssh->do_ssh2_authconn_state = NULL; ssh->mainchan = NULL; ssh->throttled_all = 0; ssh->v1_stdout_throttling = 0; ssh->queue = NULL; ssh->queuelen = ssh->queuesize = 0; ssh->queueing = FALSE; *backend_handle = ssh; #ifdef MSCRYPTOAPI if (crypto_startup() == 0) return "Microsoft high encryption pack not installed!"; #endif ssh->frontend = frontend_handle; ssh->term_width = ssh->cfg.width; ssh->term_height = ssh->cfg.height; ssh->channels = NULL; ssh->rportfwds = NULL; ssh->send_ok = 0; ssh->editing = 0; ssh->echoing =while (ssh->queuelen-- > 0) ssh_free_packet(ssh->queue[ssh->queuelen]); sfree(ssh->queue_noqueue Revision-number: 4900 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2004-11-24T19:53:31.099859Z K 7 svn:log V 114 random_init() should be called at most once during the running of PuTTY, even if it's managing multiple sessions. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrand.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f7dee9ba94b15dee2dca21d51578728 Text-delta-base-sha1: 118e78d2c845db1de40ac6fb546cd7d83c7a6960 Text-content-length: 200 Text-content-md5: 7cd9153ac58803814bd1d837f7c56990 Text-content-sha1: 7636e98aa8bb356b4c2f33c227eec6a103f9e183 Content-length: 200 SVNdx 0h0`if (!random_active) { memset(&pool, 0, sizeof(pool)); /* just to start with */ random_active = 1; noise_get_heavy(random_add_heavynoise_bitbybit); random_stir(); } Revision-number: 4901 Prop-content-length: 1228 Content-length: 1228 K 8 svn:date V 27 2004-11-24T20:35:15.729885Z K 7 svn:log V 1126 Re-architected the top level of the SSH protocol handlers. ssh1_protocol() and ssh2_protocol() are now high-level functions which see _every_ SSH packet and decide which lower-level function to pass it to. Also, they each support a dispatch table of simple handler functions for message types which can arrive at any time. Results are: - ignore, debug and disconnect messages are now handled by the dispatch table rather than being warts in the rdpkt functions - SSH2_MSG_WINDOW_ADJUST is handled by the dispatch table, which means that do_ssh2_authconn doesn't have to explicitly special-case it absolutely every time it waits for a response to its latest channel request - the top-level SSH2 protocol function chooses whether messages get funnelled to the transport layer or the auth/conn layer based on the message number ranges defined in the SSH architecture draft - so things that should go to auth/conn go there even in the middle of a rekey (although a special case is that nothing goes to auth/conn until initial kex has finished). This should fix the other half of ssh2-kex-data. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d1546e19f23bd06e9496acd604263ccc Text-delta-base-sha1: 6b9b63b27e30a927b329c4ecbcca760dcf01f701 Text-content-length: 13044 Text-content-md5: 5a68ea015bfb2ca36b574491a447db90 Text-content-sha1: ca65dc5df33afa9763f848413b9daa6c519ac8c3 Content-length: 13044 SVNYy#iBVzM,weV0o//HvU/y#FY|mInJD'Y v=|=(long sequenc1_protocol_setup(Ssh ssh); static void ssh2_protocol_setup(Ssh sshtypedef void (*handler_fn_t)(Ssh ssh, struct Packet *pktin)do_ssh1_login_crstate; int do_ssh1_connectio/* ssh1 and ssh2 use this for different things, but both use it */ int protocol_initial_phase_don /* * Dispatch table for packet types that we may have to deal * with at any time. */ handler_fn_t packet_dispatch[256] st->pktin->sequence = st->incoming_sequence++; /* * Dec2_protocol_setup(ssh)1_protocol_setup(ssh)random_init(t_send(ssh, pktout); } } c->closes = 1; /* sent MSG_CLOSE */ if (c->type == CHAN_X11) { c->u.x11.s = NULL; logevent("Forwarded X11 connection terminated"); } else if (c->type == CHAN_SOCKDATA || c->type == CHAN_SOCKDATA_DORMANT) { c->u.pfd.s = NULL; logevent("Forwarded port closed"); } } } int sshfwd_write(struct ssh_channel *c, char *buf, int len 0; } if (ssh->version == 1) { send_packet(ssh, SSH1_MSG_CHANNEL_DATA, PKT_INT, c->remoteid, PKTT_DATA, PKT_INT, len, PKT_DATA, buf, len, PKTT_OTHER, PKT_END); /* * In SSH1 we can return 0 here - implying that forwarded * connections are never individually throttled - because * the only circumstance that can cause throttling will be * the whole SSH connection backing up, in which case * _everything_ will be throttled as a whole. */ return 0; } else { ssh2_add_channel_data(c, buf, len); return ssh2_try_send(c); } } void sshfwd_unthrottle(struct ssh_channel *c, int bufsizessh->version == 1) { if (c->v.v1.throttling && bufsize < SSH1_BUFFER_LIMIT) { c->v.v1.throttling = 0; ssh1_throttle(ssh, -1); } } else { ssh2_set_window(c, OUR_V2_WINSIZE - bufsize); } } static void do_ssh1_connection(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin) { crBegin(ssh->do_ssh1_connection_crstate); if (ssh->cfg.agentfwd && agent_exists()) { logevent("Requesting agent forwarding"); send_packet(ssh, SSH1_CMSG_AGENT_REQUEST_FORWARDING, PKT_END); do { crReturnV; } while (!pktin); if (pktin->type != SSH1_SMSG_SUCCESS && pktin->type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crStopV; } else if (pktin->type == SSH1_SMSG_FAILURE) { logevent("Agent forwarding refused"); } else { logevent("Agent forwarding enabled"); ssh->agentfwd_enabled = TRUE; } } if (ssh->cfg.x11_forward) { char proto[20], data[64]; logevent("Requesting X11 forwarding"); ssh->x11auth = x11_invent_auth(proto, sizeof(proto), data, sizeof(data), ssh->cfg.x11_auth); x11_get_real_auth(ssh->x11auth, ssh->cfg.x11_display); if (ssh->v1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) { send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKT_STR, data, PKT_INT, x11_get_screen_number(ssh->cfg.x11_display), PKT_END); } else { send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKT_STR, data, PKT_END); } do { crReturnV; } while (!pktin); if (pktin->type != SSH1_SMSG_SUCCESS && pktin->type != SSH1_SMSG_FAILURE) { bombout(("Protocol confusion")); crStopV; } else if (pktin->type == SSH1_SMSG_FAILURE) { logevent("X11 forwarding refused"); } else { logevent("X11 forwarding enabled"); ssh->X11_fwd_enabled = TRUE; } } { char type; int n; int sport,dport,sserv,dserv; char sports[256], dports[256], saddr[256], host[256]; ssh->rportfwds = newtree234(ssh_rportcmp_ssh1); /* Add port forwardings. */ ssh->portfwd_strptr = ssh->cfg.portfwd; while (*ssh->portfwd_strptr) { type = *ssh->portfwd_strptr++; saddr[0] = '\0'; n = 0; while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != '\t') { if (*ssh->portfwd_strptr == ':') { /* * We've seen a colon in the middle of the * source port number. This means that * everything we've seen until now is the * source _address_, so we'll move it into * saddr and start sports from the beginning * again. */ ssh->portfwd_strptr++; sports[n] = '\0'; strcpy(saddr, sports); n = 0; } if (n < 255) sports[n++] = *ssh->portfwd_strptr++; } sports[n] = 0; if (type != 'D') { if (*ssh->portfwd_strptr == '\t') ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != ':') { if (n < 255) host[n++] = *ssh->portfwd_strptr++; } host[n] = 0; if (*ssh->portfwd_strptr == ':') ssh->portfwd_strptr++; n = 0; while (*ssh->portfwd_strptr) { if (n < 255) dports[n++nG3.-OV9&7[^ W1Y T\X4  sEHandle the top-level SSH2 protocol. */ static void ssh1_msg_debug(Ssh ssh, struct Packet *pktin) { char *buf, *msg; int msglen; ssh_pkt_getstring(pktin, &msg, &msglen); buf = dupprintf("Remote debug message: %.*s", msglen, msg); logevent(buf); sfree(buf); } static void ssh1_msg_disconnect(Ssh ssh, struct Packet *pktin) { /* log reason code in disconnect message */ char *msg; int msglen; ssh_pkt_getstring(pktin, &msg, &msglen); bombout(("Server sent disconnect message:\n\"%.*s\"", msglen, msg)); } void ssh_msg_ignore(Ssh ssh, struct Packet *pktin) { /* Do nothing, because we're ignoring it! Duhh. */ } static void ssh1_protocol_setup(Ssh ssh) { int i; /* * Most messages are handled by the coroutines. */ for (i = 0; i < 256; i++) ssh->packet_dispatch[i] = NULL; /* * These special message types we install handlers for. */ ssh->packet_dispatch[SSH1_MSG_DISCONNECT] = ssh1_msg_disconnect; ssh->packet_dispatch[SSH1_MSG_IGNORE] = ssh_msg_ignore; ssh->packet_dispatch[SSH1_MSG_DEBUG] = ssh1_msg_debug; } static void ssh1_protocol(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin) { if (ssh->state == SSH_STATE_CLOSED) return; if (pktin && ssh->packet_dispatch[pktin->type]) { ssh->packet_dispatch[pktin->type](ssh, pktin); return; } if (!ssh->protocol_initial_phase_done) { if (do_ssh1_login(ssh, in, inlen, pktin)) ssh->protocol_initial_phase_done = TRUE; else return; } do_ssh1_connection(ssh, in, inlen, pktin)1void ssh2_msg_channel_window_adjust(Ssh ssh, struct Packet *pktin) { unsigned i = ssh_pkt_getuint32(pktin); struct ssh_channel *c; c = find234(ssh->channels, &i, ssh_channelfind); if (c && !c->closes) c->v.v2.remwindow += ssh_pkt_getuint32(pktin);Set up handlers for some connection protocol messages, so we * don't have to handle them repeatedly in this coroutine. */ ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = ssh2_msg_channel_window_adjustcrWaitUntilV(pktincrWaitUntilV(pktincrWaitUntilV(pktincrWaitUntilV(pktincrWaitUntilV(pktin crWaitUntilV(pktin int i; struct ssh_channel *c; /* * Try to send data on all channels if we can. */ for (i = 0; NULL != (c = index234(ssh->channels, i)); i++) { int bufsize; if (c->closes) continue; /* don't send on closing channels */ bufsize = ssh2_try_send(c); if (bufsize == 0) { switch (c->type) { case CHAN_MAINSESSION: /* stdin need not receive an unthrottle * notification since it will be polled */ break; case CHAN_X11: x11_unthrottle(c->u.x11.s); break; case CHAN_AGENT: /* agent sockets are request/response and need no * buffer management */ break; case CHAN_SOCKDATA: pfd_unthrottle(c->u.pfd.s); break; } } } } } crFinishV; } /* * Handlers for SSH2 messages that might arrive at any moment. */ void ssh2_msg_disconnect(Ssh ssh, struct Packet *pktin) { /* log reason code in disconnect message */ char *buf, *msg; int nowlen, reason, msglen; reason = ssh_pkt_getuint32(pktin); ssh_pkt_getstring(pktin, &msg, &msglen); if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) { buf = dupprintf("Received disconnect message (%s)", ssh2_disconnect_reasons[reason]); } else { buf = dupprintf("Received disconnect message (unknown" " type %d)", reason); } logevent(buf); sfree(buf); buf = dupprintf("Disconnection message text: %n%.*s", &nowlen, msglen, msg); logevent(buf); bombout(("Server sent disconnect message\ntype %d (%s):\n\"%s\"", reason, (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) ? ssh2_disconnect_reasons[reason] : "unknown", buf+nowlen)); sfree(buf); } void ssh2_msg_debug(Ssh ssh, struct Packet *pktin) { /* log the debug message */ char *buf, *msg; int msglen; int always_display; /* XXX maybe we should actually take notice of this */ always_display = ssh2_pkt_getbool(pktin); ssh_pkt_getstring(pktin, &msg, &msglen); buf = dupprintf("Remote debug message: %.*s", msglen, msg); logevent(buf); sfree(buf); } void ssh2_msg_something_unimplemented(Ssh ssh, struct Packet *pktin) { struct Packet *pktout; pktout = ssh2_pkt_init(SSH2_MSG_UNIMPLEMENTED); ssh2_pkt_adduint32(pktout, pktin->sequence); /* * UNIMPLEMENTED messages MUST appear in the same order as the * messages they respond to. Hence, never queue them. */ ssh2_pkt_send_noqueue(ssh, pktout); } /* * Handle the top-level SSH2 protocol. */ static void ssh2_protocol_setup(Ssh ssh) { int i; /* * Most messages cause SSH2_MSG_UNIMPLEMENTED. */ for (i = 0; i < 256; i++) ssh->packet_dispatch[i] = ssh2_msg_something_unimplemented; /* * Any message we actually understand, we set to NULL so that * the coroutines will get it. */ ssh->packet_dispatch[SSH2_MSG_UNIMPLEMENTED] = NULL; ssh->packet_dispatch[SSH2_MSG_SERVICE_REQUEST] = NULL; ssh->packet_dispatch[SSH2_MSG_SERVICE_ACCEPT] = NULL; ssh->packet_dispatch[SSH2_MSG_KEXINIT] = NULL; ssh->packet_dispatch[SSH2_MSG_NEWKEYS] = NULL; ssh->packet_dispatch[SSH2_MSG_KEXDH_INIT] = NULL; ssh->packet_dispatch[SSH2_MSG_KEXDH_REPLY] = NULL; /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REQUEST] = NULL; duplicate case value */ /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_GROUP] = NULL; duplicate case value */ ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_INIT] = NULL; ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REPLY] = NULL; ssh->packet_dispatch[SSH2_MSG_USERAUTH_REQUEST] = NULL; ssh->packet_dispatch[SSH2_MSG_USERAUTH_FAILURE] = NULL; ssh->packet_dispatch[SSH2_MSG_USERAUTH_SUCCESS] = NULL; ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = NULL; ssh->packet_dispatch[SSH2_MSG_USERAUTH_PK_OK] = NULL; /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ] = NULL; duplicate case value */ /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_REQUEST] = NULL; duplicate case value */ ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_RESPONSE] = NULL; ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = NULL; ssh->packet_dispatch[SSH2_MSG_REQUEST_SUCCESS] = NULL; ssh->packet_dispatch[SSH2_MSG_REQUEST_FAILURE] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAI:=/g/3LzBS,LURE] = NULL; /* * These special message types we install handlers for. */ ssh->packet_dispatch[SSH2_MSG_DISCONNECT] = ssh2_msg_disconnect; ssh->packet_dispatch[SSH2_MSG_IGNORE] = ssh_msg_ignore; /* shared with ssh1 */ ssh->packet_dispatch[SSH2_MSG_DEBUG] = ssh2_msg_debug; } ssh->state == SSH_STATE_CLOSED) return; if (pktin && ssh->packet_dispatch[pktin->type]) { ssh->packet_dispatch[pktin->type](ssh, pktin); return; } if (!ssh->protocol_initial_phase_done || (pktin && pktin->type >= 20 && pktin->type < 50)) { if (do_ssh2_transport(ssh, in, inlen, pktin) && !ssh->protocol_initial_phase_done) { ssh->protocol_initial_phase_done = TRUE; /* * Allow authconn to initialise itself. */ do_ssh2_authconn(ssh, NULL, 0, NULL); } } else { do_ssh2_authconn(ssh, in, inlen, pktin); }do_ssh1_connectionssh->protocol_initial_phase_done = FALSE Revision-number: 4902 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2004-11-24T22:52:16.648795Z K 7 svn:log V 147 Fixed-in: 2004-11-25 (still need to get around to assessing whether the language in the new drafts is good enough, but that's not PuTTY's problem) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-kex-data Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 567ccda833e83093ff150e831dede1c6 Text-delta-base-sha1: 203fc9ee052549bed03d57cffd916567be65cf83 Text-content-length: 110 Text-content-md5: c7ddc1af11ba19c7a8e111edfe74cf64 Text-content-sha1: 9ee6a4c383db555818163979f4bc2920e0d307a6 Content-length: 110 SVNy Yg9fEFixed-in: 2004-11-25

    Update: should be fixed as of the 2004-11-25 snapshot. Revision-number: 4903 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2004-11-25T00:56:13.001399Z K 7 svn:log V 23 Today's reinstatements K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 33c4914610e157c3a90469c682df454d Text-delta-base-sha1: f66c99f36c2533c24f5a5690490e681aaa9c950e Text-content-length: 185 Text-content-md5: daf570129510b7578471ef682f2679b0 Text-content-sha1: 0abb695cce70fbe2c657def4051520f9f0ff7757 Content-length: 185 SVNl! =s&:B[%M;lbec.at/support/putty/">bec.atcofman.dk/">putty.cofmanputty.fatalnetwork.com/">putty.fatalnetwork.com in New Zealanddiis.net/putty/">diis Revision-number: 4904 Prop-content-length: 226 Content-length: 226 K 7 svn:log V 125 uint64_decimal() incorrectly output 0 as "" instead of "0". This only affected PSFTP's "reput" chat. Spotted by Greg Parker. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-25T13:40:01.620537Z PROPS-END Node-path: putty/int64.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f3af5e81216349b8e063b0b447d8c821 Text-delta-base-sha1: 67be694abc0bf9a36cb244e0492f7daa458d2ae8 Text-content-length: 125 Text-content-md5: d5dd4bdb81e182ef2b646a5b40c5e58b Text-content-sha1: 53a6bcb57bf2e7ab5c7751ef825a3f3a734487c4 Content-length: 125 SVNFJ gsgpVdo { x = uint64_div10(x, &d); assert(start > 0); buf[--start] = d + '0'; } while (x.hi || x.lo); Revision-number: 4905 Prop-content-length: 119 Content-length: 119 K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-26T11:41:09.365903Z K 7 svn:log V 19 note about testing PROPS-END Node-path: putty-wishlist/data/ssh2-kex-data Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c7ddc1af11ba19c7a8e111edfe74cf64 Text-delta-base-sha1: 9ee6a4c383db555818163979f4bc2920e0d307a6 Text-content-length: 102 Text-content-md5: 66b59a9744f5d2b30baaf96e44f9d6b7 Text-content-sha1: bda99bc4a2d1fec2ae28a6647fc737ccc2941754 Content-length: 102 SVNyNUyUWe haven't been able to test it very thoroughly yet, though, so testing is welcomed. Revision-number: 4906 Prop-content-length: 616 Content-length: 616 K 8 svn:date V 27 2004-11-27T13:20:21.935496Z K 7 svn:log V 515 New timing infrastructure. There's a new function schedule_timer() which pretty much any module can call to request a call-back in the future. So terminal.c can do its own handling of blinking, visual bells and deferred screen updates, without having to rely on term_update() being called 50 times a second (fixes: pterm-timer); and ssh.c and telnet.c both invoke a new module pinger.c which takes care of sending keepalives, so they get sent uniformly in all front ends (fixes: plink-keepalives, unix-keepalives). K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7feac9a4c5d195fde748008062b077cc Text-delta-base-sha1: d2f9b0a9d55e23113b7b99d25b4f89d9f0c9b1b4 Text-content-length: 293 Text-content-md5: 852b4a6af44a1e174deec98cde299070 Text-content-sha1: 06880bdb70a66b3649735d9ef72efbbb100f3265 Content-length: 293 SVNiA|RZQ{+]K + timing pinger pingerMISC = timing misc version settings tree234 proxy WINMISC = MISC winstore winnet cmdline windefs winmisc pproxy UXMISC = MISC uxstore uxsel uxnet cmdline uxmisc uxproxy MACMISC = MISC macstore macnet mtcpnet otnet Node-path: putty/doc/udp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35c8c27c92c8b0c087c987a8928690ad Text-delta-base-sha1: e0469557ec40405d4ba17d08a5dfb18523fb2b52 Text-content-length: 636 Text-content-md5: 879ccb1e5ecaa47f81befc2bec7ee5e1 Text-content-sha1: 30907c06e630b0722c719a6978c90a67ed41ddfc Content-length: 636 SVN1\"#|?7gnever use global variables to store per-session data. The global variables that do exist are tolerated because they are not specific to a particular login session: \c{flags} defines properties that are expected to apply equally to \e{all} the sessions run by a single PuTTY process, the random number state in \cw{sshrand.c} and the timer list in \cw{timing.c} serve all sessions equally, and so on. But most data is specific to a particular network session, and is therefore stored in dynamically allocated data structures, and pointers to these global variables, unless they are genuinely cross-session Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e56c50c70367e8681049debe87e6897a Text-delta-base-sha1: 51c046cb239f589978bacf5250931ec0f4e47364 Text-content-length: 30 Text-content-md5: 982af5e5c43d35e408d9ea0590654663 Text-content-sha1: a9772087fadf3476ad2d38b30eb540c6c9c11482 Content-length: 30 SVNB} 77@/* $Id Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a30b9d839b227074b8c7df7997c2fee Text-delta-base-sha1: d42006e698f23cdd6f9dcf9fd7eddf1316811073 Text-content-length: 581 Text-content-md5: bf949676f8fac4f5aa6f335f64661471 Text-content-sha1: 8af4e9b0f1346ae647f023747b78bd75663647db Content-length: 581 SVN\ )1)O@`| * Read an entire line of text from a file. Return a buffer * malloced to be as big as necessary (caller must free). */ char *fgetline(FILE *fp) { char *ret = snewn(512, char); int size = 512, len = 0; while (fgets(ret + len, size - len, fp)) { len += strlen(ret + len); if (ret[len-1] == '\n') break; /* got a newline, we're done */ size = len + 512; ret = sresize(ret, size, char); } if (len == 0) { /* first fgets returned NULL */ sfree(ret); return NULL; } ret[len] = '\0'; return ret; } Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5da40415fe6e04278d23e9d2b137ea3d Text-delta-base-sha1: 9c34a0f9d90f5a969ebb6ff70bfcbc53f0156255 Text-content-length: 77 Text-content-md5: 4c12890daf8ec5d686bb962e90fd2d41 Text-content-sha1: 6b89e7d7f9b64076f429ac3db0c86e0364a8be2e Content-length: 77 SVNM4OUA<io.h> /* for FILE * */char *fgetline(FILE *f Node-path: putty/pinger.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1537 Text-content-md5: 605ddd7434cc6a5768c60ba0edbcf26d Text-content-sha1: d6737e5e6844e09af633cd9453890b7095172a4a Content-length: 1547 PROPS-END SVNsss/* * pinger.c: centralised module that deals with sending TS_PING * keepalives, to avoid replicating this code in multiple backends. */ #include "putty.h" struct pinger_tag { int interval; int pending; long next; Backend *back; void *backhandle; }; static void pinger_schedule(Pinger pinger); static void pinger_timer(void *ctx, long now) { Pinger pinger = (Pinger)ctx; if (pinger->pending && now - pinger->next >= 0) { pinger->back->special(pinger->backhandle, TS_PING); pinger->pending = FALSE; pinger_schedule(pinger); } } static void pinger_schedule(Pinger pinger) { int next; if (!pinger->interval) { pinger->pending = FALSE; /* cancel any pending ping */ return; } next = schedule_timer(pinger->interval * TICKSPERSEC, pinger_timer, pinger); if (!pinger->pending || next < pinger->next) { pinger->next = next; pinger->pending = TRUE; } } Pinger pinger_new(Config *cfg, Backend *back, void *backhandle) { Pinger pinger = snew(struct pinger_tag); pinger->interval = cfg->ping_interval; pinger->pending = FALSE; pinger->back = back; pinger->backhandle = backhandle; pinger_schedule(pinger); return pinger; } void pinger_reconfig(Pinger pinger, Config *oldcfg, Config *newcfg) { if (oldcfg->ping_interval != newcfg->ping_interval) { pinger->interval = newcfg->ping_interval; pinger_schedule(pinger); } } void pinger_free(Pinger pinger) { expire_timer_context(pinger); sfree(pinger); } Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18e64f97fb1d6fbed7f95748b9380d16 Text-delta-base-sha1: 1663b9b9210991cd04369ef0233a022cf9f8c410 Text-content-length: 466 Text-content-md5: 9124a147dda3067a36a7e0a7de6bc882 Text-content-sha1: 431a8c7d3c3e8cdd7d88f6371214550be99ddd7d Content-length: 466 SVNuP""v~(O$)?ZWstruct sftp_command *cmd; char *p, *q, *r; int quoting if (fp) { if (modeflags & 1) printf("psftp> "); line = fgetline(fp); } else { line = ssh_sftp_get_cmdline("psftp> "); } if (!line || !*line) { cmd->obey = sftp_cmd_quit; if ((mode == 0) || (modeflags & 1)) printf("quit\n"); return cmd; /* eof */ } line[strcspn(line, "\r\n")] = '\0'; sfree(line); NULL Node-path: putty/psftp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e589d3f08b4be23480740a19af645f0 Text-delta-base-sha1: ba74af6d8bedfac3a48063ac14486126538e3f8e Text-content-length: 137 Text-content-md5: 81b005160d2be44572e4f1938af17b8e Text-content-sha1: 1062fb8e605e08a6b5c64e403123f7c6ba9ce770 Content-length: 137 SVN52 s$sRead a command line for PSFTP from standard input. Caller must * free. */ char *ssh_sftp_get_cmdline(char *prompt Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3992244cb607926b1ac09ce5f5d82531 Text-delta-base-sha1: 126c5e4047e9bcc741d2e7eacbbe441a36a31f9d Text-content-length: 1902 Text-content-md5: a8bd4f87e943453b115195222a2d7498 Text-content-sha1: 6a3cd1ad13715f34dd8a5ba1cddaa8914198a4c8 Content-length: 1902 SVNhH0-HmZvoid notify_remote_exit(void *frontendpinger.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 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 Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f5ff96d6590374811cf75c81292f3cbf Text-delta-base-sha1: 0202a05ab4242d996e5a8164b041b1f83e8dfac4 Text-content-length: 55 Text-content-md5: 0048b980a1912a62aa4a6f2d318ddba0 Text-content-sha1: 30b5fd67feb836fe60227871e89180690e91cc47 Content-length: 55 SVNk "^ notify_remote_exit(raw->frontend) Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d44b3defc3bb7eeb4cc5ea4189ad31fe Text-delta-base-sha1: 1b842f6c764b3de0d0d1ed6845293dd147d5de1a Text-content-length: 58 Text-content-md5: fc264f5e90735a72d4891353e5390eaf Text-content-sha1: 7f89b61a35d25839f472da17ef1c274e00e1b8e4 Content-length: 58 SVNZ %xdv notify_remote_exit(rlogin->frontend) Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5a68ea015bfb2ca36b574491a447db90 Text-delta-base-sha1: ca65dc5df33afa9763f848413b9daa6c519ac8c3 Text-content-length: 642 Text-content-md5: cff533eab8ca13bf02408081833f4604 Text-content-sha1: 82d91810b5963c642463bfd73ff1380b34fdface Content-length: 642 SVN$P!SkgomNY /* * This module deals with sending keepalives. */ Pinger pinger ssh->pinger = pinger_new(&ssh->cfg, &ssh_backend, ssh) notify_remote_exit(ssh->frontend)notify_remote_exit(ssh->frontend) WZ)~=DY5EC; ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAIssh->pinger = NULL if (ssh->pinger) pinger_free(ssh->pingerpinger_reconfig(ssh->pinger, &ssh->cfg, cfg) Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f43ccf4fd3554dc8302f92d5972d97d6 Text-delta-base-sha1: c235586cf38bdd29827a2fdb6331dd515d0f471a Text-content-length: 292 Text-content-md5: b62a436517f95cc4cbf2d707f4ab58f3 Text-content-sha1: 922cd739c2acb645c9a4e027f00a7141331fc54e Content-length: 292 SVN .hWDUH2RB0}!&?A Pinger pinger notify_remote_exit(telnet->frontend)telnet->pingertelnet->pinger = pinger_new(&telnet->cfg, &telnet_backend, telnet)if (telnet->pinger) pinger_free(telnet->pingerpinger_reconfig(telnet->pinger, &telnet->cfg, cfg) Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: acc25aa55af17b0609dbdea40b37dddd Text-delta-base-sha1: bfb717b057e1886bb6521f9ba4da0eb83141dc9a Text-content-length: 8110 Text-content-md5: 3d63428be3d17cfe60a84cfb9ec3550e Text-content-sha1: 67653a19e72f2fec0217f357be68d2de0563d41a Content-length: 8110 SVN>K(6A(buBu.<J<jo"F&xN7_~l&0 ;Fb%`#'bi}];4FnwMnbOa|#v*5B{Y]> BfhDHg*(^G"oZw^W\C~]g}~z"UPDATE_DELAY ((TICKSPERSEC+49)/50)/* ticks to defer window update */ #define TBLINK_DELAY ((TICKSPERSEC*9+19)/20)/* ticks between text blinks*/ #define CBLINK_DELAY (CURSORBLINK) /* ticks between cursor blinks */ #define VBELL_DELAY (VBELL_TIMEOUT) /* visual bell timeout in ticks */static void term_schedule_tblink(Terminal *term); static void term_schedule_cblink(Terminal *term); static void term_timer(void *ctx, long now) { Terminal *term = (Terminal *)ctx; int update = FALSE; if (term->tblink_pending && now - term->next_tblink >= 0) { term->tblinker = !term->tblinker; term->tblink_pending = FALSE; term_schedule_tblink(term); update = TRUE; } if (term->cblink_pending && now - term->next_cblink >= 0) { term->cblinker = !term->cblinker; term->cblink_pending = FALSE; term_schedule_cblink(term); update = TRUE; } if (term->in_vbell && now - term->vbell_end >= 0) { term->in_vbell = FALSE; update = TRUE; } if (update || (term->window_update_pending && now - term->next_update >= 0)) term_update(term); } /* * Call this whenever the terminal window state changes, to queue * an update. */ static void seen_disp_event(Terminal *term) { term->seen_disp_event = TRUE; /* for scrollback-reset-on-activity */ if (!term->window_update_pending) { term->window_update_pending = TRUE; term->next_update = schedule_timer(UPDATE_DELAY, term_timer, term); } } /* * Call when the terminal's blinking-text settings change, or when * a text blink has just occurred. */ static void term_schedule_tblink(Terminal *term) { if (term->tblink_pending) return; /* already well in hand */ if (term->blink_is_real) { term->next_tblink = schedule_timer(TBLINK_DELAY, term_timer, term); term->tblink_pending = TRUE; } else { term->tblinker = 1; /* reset when not in use */ term->tblink_pending = FALSE; } } /* * Likewise with cursor blinks. */ static void term_schedule_cblink(Terminal *term) { if (term->cblink_pending) return; /* already well in hand */ if (term->cfg.blink_cur) { term->next_cblink = schedule_timer(CBLINK_DELAY, term_timer, term); term->cblink_pending = TRUE; } else { term->cblinker = 1; /* reset when not in use */ term->cblink_pending = FALSE; } } /* * Call to reset cursor blinking on new output. */ static void term_reset_cblink(Terminal *term) { seen_disp_event(term); term->cblinker = 1; term->cblink_pending = FALSE; term_schedule_cblink(term); } /* * Call to begin a visual bell. */ static void term_schedule_vbell(Terminal *term, int already_started, long startpoint) { long ticks_already_gone; if (already_started) ticks_already_gone = GETTICKCOUNT() - startpoint; else ticks_already_gone = 0; if (ticks_already_gone < VBELL_DELAY) { term->in_vbell = TRUE; term->vbell_end = schedule_timer(VBELL_DELAY - ticks_already_gone, term_timer, term); } else { term->in_vbell = FALSE; } } term_schedule_tblink(term); term_schedule_cblink(term); } /* * Force a screen update. */ void term_update(Terminal *term) { Context ctx; term->window_update_pending = FALSE; seen_disp_event(term)tttblink) { term->blink_is_real = term->cfg.blinktext; } term_schedule_tblink(term); term_schedule_cblink(term);cblink_pending = term->tblink_pending = FALSEcwindow_update_pending = FALSEexpire_timer_context(termterm_schedule_tblink(term);if (term->rvideo && !state) { /* This is an OFF, so set up a vbell */ term_schedule_vbell(term, TRUE, term->rvbell_startpoint);GETTICKCOUNT(); } term->rvideo = state; seen_disp_eventseen_disp_event(term)seen_disp_event(term)seen_disp_event(term)static if (term->cfg.beep == BELL_VISUAL) { term_schedule_vbell(term, FALSE, 0); } } seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)seen_disp_event(term)term_schedule_tblink(term)seen_disp_event(term)doX}VXtl.kP5R}:hQb63i3tdvJL buf, len, 0); } break; case 14: if (term->ldisc) { get_window_pixels(term->frontend, &x, &y); len = sprintf(buf, "\033[4;%d;%dt", x, y); ldisc_send(term->ldisc, buf, len, 0); } break; case 18: if (term->ldisc) { len = sprintf(buf, "\033[8;%d;%dt", term->rows, term->cols); ldisc_send(term->ldisc, buf, len, 0); } break; case 19: /* * Hmmm. Strictly speaking we * should return `the size of the * screen in characters', but * that's not easy: (a) window * furniture being what it is it's * hard to compute, and (b) in * resize-font mode maximising the * window wouldn't change the * number of characters. *shrug*. I * think we'll ignore it for the * moment and see if anyone * complains, and then ask them * what they would like it to do. */ break; case 20: if (term->ldisc && !term->cfg.no_remote_qtitle) { p = get_window_title(term->frontend, TRUE); len = strlen(p); ldisc_send(term->ldisc, "\033]L", 3, 0); ldisc_send(term->ldisc, p, len, 0); ldisc_send(term->ldisc, "\033\\", 2, 0); } break; case 21: if (term->ldisc && !term->cfg.no_remote_qtitle) { p = get_window_title(term->frontend,FALSE); len = strlen(p); ldisc_send(term->ldisc, "\033]l", 3, 0); ldisc_send(term->ldisc, p, len, 0); ldisc_send(term->ldisc, "\033\\", 2, 0); } break; } } break; case 'S': /* SU: Scroll up */ compatibility(SCOANSI); scroll(term, term->marg_t, term->marg_b, def(term->esc_args[0], 1), TRUE); term->wrapnext = FALSE; seen_disp_event(term); break; case 'T': /* SD: Scroll down */ compatibility(SCOANSI); scroll(term, term->marg_t, term->marg_b, -def(term->esc_args[0], 1), TRUE); term->wrapnext = FALSE; seen_disp_event(term); break; case ANSI('|', '*'): /* DECSNLS */ /* * Set number of lines on screen * VT420 uses VGA like hardware and can * support any size in reasonable range * (24..49 AIUI) with no default specified. */ compatibility(VT420); if (term->esc_nargs == 1 && term->esc_args[0] > 0) { if (!term->cfg.no_remote_resize) request_resize(term->frontend, term->cols, def(term->esc_args[0], term->cfg.height)); deselect(term); } brseen_disp_event(term)term_schedule_tblink(term)term_schedule_tblink(termseen_disp_event(term)term_schedule_tblink(term)ccif (immediately) { do_paint (term, ctx, FALSE); } else { if (!term->window_update_pending) { term->window_update_pending = TRUE; term->next_update = schedule_timer(UPDATE_DELAY, term_timer, term); } }reset_cblink(term); /* * During drag-selects, we do not process terminal input, * because the user will want the screen to hold still to * be selected. */ if (term->selstate != DRAGGING) Node-path: putty/terminal.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 554ed26d41c4b75eb51adfdfc0486789 Text-delta-base-sha1: 20bca25dd20979ff20bce4632ecdd92343224a1c Text-content-length: 367 Text-content-md5: 0a169957c01b830992ec1daefe31e041 Text-content-sha1: 737ff835fa11381086192509d79f6963996052f0 Content-length: 367 SVNzFp Pv7e5clong vbell_endWe schedule a window update shortly after receiving terminal * data. This tracks whether one is currently pending. */ int window_update_pending; long next_update; /* * Track pending blinks and tblinks. */ int tblink_pending, cblink_pending; long next_tblink, next_cblink Node-path: putty/timing.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 3813 Text-content-md5: 11431750b7a7bf8861f51fd1cc8fcc42 Text-content-sha1: 768070937d5af12149b4ae7ebb09eb1007733a1f Content-length: 3823 PROPS-END SVNWWW/* * timing.c * * This module tracks any timers set up by schedule_timer(). It * keeps all the currently active timers in a list; it informs the * front end of when the next timer is due to go off if that * changes; and, very importantly, it tracks the context pointers * passed to schedule_timer(), so that if a context is freed all * the timers associated with it can be immediately annulled. */ #include #include #include "putty.h" #include "tree234.h" struct timer { timer_fn_t fn; void *ctx; long now; }; static tree234 *timers = NULL; static tree234 *timer_contexts = NULL; static long now = 0L; static int compare_timers(void *av, void *bv) { struct timer *a = (struct timer *)av; struct timer *b = (struct timer *)bv; long at = a->now - now; long bt = b->now - now; if (at < bt) return -1; else if (at > bt) return +1; /* * Failing that, compare on the other two fields, just so that * we don't get unwanted equality. */ if (a->fn < b->fn) return -1; else if (a->fn > b->fn) return +1; if (a->ctx < b->ctx) return -1; else if (a->ctx > b->ctx) return +1; /* * Failing _that_, the two entries genuinely are equal, and we * never have a need to store them separately in the tree. */ return 0; } static int compare_timer_contexts(void *av, void *bv) { char *a = (char *)av; char *b = (char *)bv; if (a < b) return -1; else if (a > b) return +1; return 0; } static void init_timers(void) { if (!timers) { timers = newtree234(compare_timers); timer_contexts = newtree234(compare_timer_contexts); now = GETTICKCOUNT(); } } long schedule_timer(int ticks, timer_fn_t fn, void *ctx) { long when; struct timer *t, *first; init_timers(); when = ticks + GETTICKCOUNT(); assert(when - now > 0); t = snew(struct timer); t->fn = fn; t->ctx = ctx; t->now = when; if (t != add234(timers, t)) { sfree(t); /* identical timer already exists */ } else { add234(timer_contexts, t->ctx);/* don't care if this fails */ } first = (struct timer *)index234(timers, 0); if (first == t) { /* * This timer is the very first on the list, so we must * notify the front end. */ timer_change_notify(first->now); } return when; } /* * Call to run any timers whose time has reached the present. * Returns the time (in ticks) expected until the next timer after * that triggers. */ int run_timers(long anow, long *next) { struct timer *first; init_timers(); now = anow; while (1) { first = (struct timer *)index234(timers, 0); if (!first) return FALSE; /* no timers remaining */ if (find234(timer_contexts, first->ctx, NULL) == NULL) { /* * This timer belongs to a context that has been * expired. Delete it without running. */ delpos234(timers, 0); sfree(first); } else if (first->now - now <= 0) { /* * This timer is active and has reached its running * time. Run it. */ delpos234(timers, 0); first->fn(first->ctx, first->now); sfree(first); } else { /* * This is the first still-active timer that is in the * future. Return how long it has yet to go. */ *next = first->now; return TRUE; } } } /* * Call to expire all timers associated with a given context. */ void expire_timer_context(void *ctx) { init_timers(); /* * We don't bother to check the return value; if the context * already wasn't in the tree (presumably because no timers * ever actually got scheduled for it) then that's fine and we * simply don't need to do anything. */ del234(timer_contexts, ctx); } Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 26464cd0355b07a836f856ae7b46ed91 Text-delta-base-sha1: f0dd3994417f4e434b9489d61c013a941b667af5 Text-content-length: 1743 Text-content-md5: b21138ce035202ca39664f460db9dd37 Text-content-sha1: fe2424c5cf72e9cbe50f0d97297174b8ca8f4cda Content-length: 1743 SVN4'<I$P7eDML3!w/* * Timers are global across all sessions (even if we were handling * multiple sessions, which we aren't), so the current timer ID is * a global variable. */ static guint timer_id = 0void notify_remote_exit} static gint timer_trigger(gpointer data) { long now = GPOINTER_TO_INT(data); long next; long ticks; if (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); timer_id = gtk_timeout_add(ticks > 0 ? ticks : 1, timer_trigger, GINT_TO_POINTER(next)); } /* * Never let a timer resume. If we need another one, we've * asked for it explicitly above. */ return FALSE; } void timer_change_notify(long next) { long ticks; if (timer_id) gtk_timeout_remove(timer_id); ticks = next - GETTICKCOUNT(); if (ticks <= 0) ticks = 1; /* just in case */ timer_id = gtk_timeout_add(ticks, timer_trigger, GINT_TO_POINTER(next))hhterm, inst->logctx); uxsel_init(); term_size(inst->term, inst->cfg.height, inst->cfg.width, inst->cfg.savelines); start_backend(inst); ldisc_send(inst->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */ /* now we're reday to deal with the child exit handler being * called */ block_signal(SIGCHLD, 0); /* * Block SIGPIPE: if we attempt Duplicate Session or similar * and it falls over in some way, we certainly don't want * SIGPIPE terminating the main pterm/PuTTY. Note that we do * this _after_ (at least pterm) forks off its child process, * since the child wants SIGPIPE handled in the usual way. */ block_signal(SIGPIPE, 1); inst->exited = FALSE; gtk_m Node-path: putty/unix/pty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f2e5750ff9351c3a72e913342e0cff8 Text-delta-base-sha1: 5113de05aa6a3884c53bef22aab9a7eae7080ac3 Text-content-length: 58 Text-content-md5: 35c189429355ae9ae8a06e01dd9c08c4 Text-content-sha1: 5e9b5333ab20393382b3367d12e37559d10e065a Content-length: 58 SVNy #s notify_remote_exit(pty_frontend); Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 58345e7750be9cfce7cb958c8591edc8 Text-delta-base-sha1: 2ae6c0ffe1af75fb1058d0baa0e600d0e45001f0 Text-content-length: 99 Text-content-md5: 3af0748a1a5cee23cbd0b377985cadac Text-content-sha1: 4c7c219466b3e685c8c94aa325bcc653f9e89274 Content-length: 99 SVN&" MnMg? 1000 /* we choose to use milliseconds */ #define CURSORBLINK 45 Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f5522306f1cb7e7b3e757b58ffbde3d8 Text-delta-base-sha1: c08e2a1f8ac007f4589a7a299004674f72498e29 Text-content-length: 96 Text-content-md5: ca3229ff49ee19c437dbc2da074a9fbd Text-content-sha1: ffd78562ff46c80c35b4331db1c6575d5d199319 Content-length: 96 SVN(~ J-J!notify_remote_exit(void *frontend) { } void timer_change_notify(long next Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd3767bde846acfc9c7a99e8faaddbc2 Text-delta-base-sha1: f16f5a60390f468db45e00273f21ee7285d73693 Text-content-length: 250 Text-content-md5: fac966952813a9fe0ef4f4f038ecc426 Text-content-sha1: 3a6dd04c643aeb1f7b4f7c0557fb41a9775ee8cb Content-length: 250 SVN= bbV/We want to use milliseconds rather than microseconds, * because we need a decent number of them to fit into a 32-bit * word so it can be used for keepalives. */ return tv.tv_sec * 1000 + tv.tv_usec / 1000; } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fdb590c22ab5d5c6561a122bd68187e8 Text-delta-base-sha1: a1f7ab8d8a232800d3ba7ce3e661c68f9eb71178 Text-content-length: 468 Text-content-md5: 2f2b84b0c15bcfae774dd8c9a07c97b9 Text-content-sha1: f929dde6fd98da01fbda25e014984763a35a6d25 Content-length: 468 SVN .X?Vc i# long now now = GETTICKCOUNT()long next, ticks; struct timeval tv, *ptv; if (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); if (ticks < 0) ticks = 0; /* just in case */ tv.tv_sec = ticks / 1000; tv.tv_usec = ticks % 1000 * 1000; ptv = &tv; } else { ptv = NULL; } ret = select(maxfd, &rset, &wset, &xset, ptv); if (ret == 0) now = next; else now = GETTICKCOUNT( Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1f4af7921a9ecfa6aa2682095e072824 Text-delta-base-sha1: b845ccd40ec107cafd7bd3cdbfd40d8c0ec83640 Text-content-length: 2480 Text-content-md5: fcdd309d1c53b51615648dfdbdf4f414 Text-content-sha1: ed88ce75c3c2bdc6b4838b902995f7121c878453 Content-length: 2480 SVNt  licDu#9;Do a select() between all currently active network fds and * optionally stdin. */ static int ssh_sftp_do_select(int include_stdin long now = GETTICKCOUNT(); fdlist = NULL; fdcount = fdsize = 0; do { /* Count the currently active fds. */ i = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) i++; if (i < 1) return -1; /* doom */ /* Expand the fdlist buffer if necessary. */ if (i > fdsize) { fdsize = i + 16; fdlist = sresize(fdlist, fdsize, int); } FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&xset); maxfd = 0; /* * Add all currently open fds to the select sets, and store * them in fdlist as well. */ fdcount = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) { fdlist[fdcount++] = fd; if (rwx & 1) FD_SET_MAX(fd, maxfd, rset); if (rwx & 2) FD_SET_MAX(fd, maxfd, wset); if (rwx & 4) FD_SET_MAX(fd, maxfd, xset); } if (include_stdin) FD_SET_MAX(0, maxfd, rset); do { long next, ticks; struct timeval tv, *ptv; if (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); if (ticks <= 0) ticks = 1; /* just in case */ tv.tv_sec = ticks / 1000; tv.tv_usec = ticks % 1000 * 1000; ptv = &tv; } else { ptv = NULL; } ret = select(maxfd, &rset, &wset, &xset, ptv); if (ret == 0) now = next; else now = GETTICKCOUNT(); } while (ret < 0 && errno != EINTR); } while (ret == 0FD_ISSET(0, &rset) ? 1 : 0; } /* * Wait for some network data and process it. */ int ssh_sftp_loop_iteration(void) { return ssh_sftp_do_select(FALSE); } /* * Read a PSFTP command line from stdin. */ char *ssh_sftp_get_cmdline(char *prompt) { char *buf; int buflen, bufsize, ret; fputs(prompt, stdout); fflush(stdout); buf = NULL; buflen = bufsize = 0; while (1) { ret = ssh_sftp_do_select(TRUE); if (ret < 0) { printf("connection died\n"); return NULL; /* woop woop */ } if (ret > 0) { if (buflen >= bufsize) { bufsize = buflen + 512; buf = sresize(buf, bufsize, char); } ret = read(0, buf+buflen, 1); if (ret < 0) { perror("read"); return NULL; } if (ret == 0) { /* eof on stdin; no error, but no answer either */ return NULL; } if (buf[buflen++] == '\n') { /* we have a full line */ return buf; } } } Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b8c5f070fb03e72834ddd246e1569ac4 Text-delta-base-sha1: 08923321cfe7ae15e7016b6d80917e4c8467d976 Text-content-length: 20 Text-content-md5: 8e4c98483c3b7ca66d589093a18da191 Text-content-sha1: be68941111bdaed0eb3adfa218e2636845fe79c0 Content-length: 20 SVN*v VT Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0d30878bc4b4c10415d710a0bddfa83d Text-delta-base-sha1: 6f6a716b6dfd3b4b10ec474eafaca1663efea53a Text-content-length: 99 Text-content-md5: 01d656bf6a4e302996f304f4e279998d Text-content-sha1: e3457231237c3877fb30e6d1c92c0169d2b7ea8d Content-length: 99 SVNm MvM*mnotify_remote_exit(void *frontend) { } void timer_change_notify(long next) { Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 737ef48693e43f419c37590df0217bd7 Text-delta-base-sha1: 88cb36f8d078dea501695165a56d6f8320db9f75 Text-content-length: 3502 Text-content-md5: 9dd7669e203b183d4a173043e9842fec Text-content-sha1: ad7ab60a3ef86b71dd3c07c4f42cdc166e47e84a Content-length: 3502 SVN{o\"m1[3xU5k Ski)i'}K9"C0C|I6UE/<.Rmvoid enact_netevent(WPARAM, LPARAM#define TIMING_TIMER_ID 1234 static long timing_next_timewhile (msg.message != WM_QUIT) { if (!(IsWindow(logbox) && IsDialogMessage(logbox, &msg))) DispatchMessage(&msg);net_pending_errors()netevent(WPARAM wParam, LPARAM lParamreentering = 1; ret = select_result(wParam, void notify_remote_exit(void *fe) { /* stub not needed in this frontend */ } void timer_change_notify(long next) { long ticks = next - GETTICKCOUNT(); if (ticks <= 0) ticks = 1; /* just in case */ KillTimer(hwnd, TIMING_TIMER_ID); SetTimer(hwnd, TIMING_TIMER_ID, ticks, NULL); timing_next_time = next; }(UINT_PTR)wParam == TIMING_TIMER_ID) { long next; KillTimer(hwnd, TIMING_TIMER_ID); if (run_timers(timing_next_time, &next)) { timer_change_notify(next); } else { } }TRUEenact_netevent(wParam, lParam); net_pending_errors(case VK_F2: index = 1; break; case VK_F3: index = 2; break; case VK_F4: index = 3; break; case VK_F5: index = 4; break; case VK_F6: index = 5; break; case VK_F7: index = 6; break; case VK_F8: index = 7; break; case VK_F9: index = 8; break; case VK_F10: index = 9; break; case VK_F11: index = 10; break; case VK_F12: index = 11; break; } if (keystate[VK_SHIFT] & 0x80) index += 12; if (keystate[VK_CONTROL] & 0x80) index += 24; p += sprintf((char *) p, "\x1B[%c", codes[index]); return p - output; } if (cfg.funky_type == FUNKY_SCO && /* SCO small keypad */ code >= 1 && code <= 6) { char codes[] = "HL.FIG"; if (code == 3) { *p++ = '\x7F'; } else { p += sprintf((char *) p, "\x1B[%c", codes[code-1]); } return p - output; } if ((term->vt52_mode || cfg.funky_type == FUNKY_VT100P) && code >= 11 && code <= 24) { int offt = 0; if (code > 15) offt++; if (code > 21) offt++; if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", code + 'P' - 11 - offt); else p += sprintf((char *) p, "\x1BO%c", code + 'P' - 11 - offt); return p - output; } if (cfg.funky_type == FUNKY_LINUX && code >= 11 && code <= 15) { p += sprintf((char *) p, "\x1B[[%c", code + 'A' - 11); return p - output; } if (cfg.funky_type == FUNKY_XTERM && code >= 11 && code <= 14) { if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", code + 'P' - 11); else p += sprintf((char *) p, "\x1BO%c", code + 'P' - 11); return p - output; } if (cfg.rxvt_homeend && (code == 1 || code == 4)) { p += sprintf((char *) p, code == 1 ? "\x1B[H" : "\x1BOw"); return p - output; } if (code) { p += sprintf((char *) p, "\x1B[%d~", code); return p - output; } /* * Now the remaining keys (arrows and Keypad 5. ,5 4mPJl<static void flash_window(int mode); static long next_flash; static int flashing = 0; static void flash_window_timer(void *ctx, long now) { if (flashing && now - next_flash >= 0) { flash_window(1); }flashing = 1; FlashWindow(hwnd, TRUE); next_flash = schedule_timer(450, flash_window_timer, hwnd); } } else if ((mode == 1) && (cfg.beep_ind == B_IND_FLASH)) { /* maintain */ if (flashing) { FlashWindow(hwnd, TRUE); /* toggle */ next_flash = schedule_timer(450, flash_window_timer, hwnd); Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e4e38db1d3d9d432e7909b86356e9e69 Text-delta-base-sha1: 3dee1b618018d5173f0abd3870d48f45a5fc23f9 Text-content-length: 209 Text-content-md5: 8974cdb96f893cd1803f584a1fdc6adb Text-content-sha1: 4e5267fcb7d4b9ad7ce6bb3f2bd08e2d53afc55f Content-length: 209 SVNz45I56Dextern int socket_writable(SOCKET skt) { Actual_Socket s = find234(sktree, (void *)skt, cmpforsearch); if (s) return bufchain_size(&s->output_data) > 0; else return 0 Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ef83c8baec8e6f253872b345a54a2a3 Text-delta-base-sha1: 814cd1120eea9baa9b2f176bc2c1c3d04cc1d2fc Text-content-length: 559 Text-content-md5: e539feceeca0f90e775e97d202e6f65f Text-content-sha1: 22d1b828f80cd811e62d7994f6a9cf4d46cd1d52 Content-length: 559 SVN82=d},{944g/w/%STMk long now, nextnow = GETTICKCOUNT(); while (1) { int n; DWORD ticksif (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); if (ticks < 0) ticks = 0; /* just in case */ } else { ticks = INFINITE; } n = MsgWaitForMultipleObjects(4, handles, FALSE, ticks, QS_POSTMESSAGE); if (n == WAIT_OBJECT_0 +WAIT_OBJECT_0 +WAIT_OBJECT_0 +WAIT_OBJECT_0 +WAIT_OBJECT_0 + if (n == WAIT_TIMEOUT) { now = next; } else { now = GETTICKCOUNT(); } Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 84e6b047179bc4f041e7b666ca1384da Text-delta-base-sha1: c0209d49ef37c0a4914f9f446d6703c4731de642 Text-content-length: 5962 Text-content-md5: 2ef78a3df05d3e9624e9535c7c13da2f Text-content-sha1: 43aa1d82138446fa79210aa149ca54e004283287 Content-length: 5962 SVN >$MO{8sRx ~ #include "putty.h" #include "psftp.h"static HANDLE netevent = NULL; char *do_select(SOCKET skt, int startup) { int events; if (startup) sftp_ssh_socket = skt; else sftp_ssh_socket = INVALID_SOCKET; if (p_WSAEventSelect) { if (startup) { events = (FD_CONNECT | FD_READ | FD_WRITE | FD_OOB | FD_CLOSE | FD_ACCEPT); netevent = CreateEvent(NULL, FALSE, FALSE, NULL); } else { events = 0; } if (p_WSAEventSelect(skt, netevent, events) == SOCKET_ERROR) { switch (p_WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "WSAEventSelect(): unknown error"; } } } return NULL; } extern int select_result(WPARAM, LPARAM); int do_eventsel_loop(HANDLE other_event) { int n; long next, ticks; HANDLE handles[2]; SOCKET *sklist; int skcount; long now = GETTICKCOUNT(); if (!netevent) { return -1; /* doom */ } handles[0] = netevent; handles[1] = other_event; if (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); if (ticks < 0) ticks = 0; /* just in case */ } else { ticks = INFINITE; } n = MsgWaitForMultipleObjects(other_event ? 2 : 1, handles, FALSE, ticks, QS_POSTMESSAGE); if (n == WAIT_OBJECT_0 + 0) { WSANETWORKEVENTS things; SOCKET socket; extern SOCKET first_socket(int *), next_socket(int *); extern int select_result(WPARAM, LPARAM); int i, socketstate; /* * We must not call select_result() for any socket * until we have finished enumerating within the * tree. This is because select_result() may close * the socket and modify the tree. */ /* Count the active sockets. */ i = 0; for (socket = first_socket(&socketstate); socket != INVALID_SOCKET; socket = next_socket(&socketstate)) i++; /* Expand the buffer if necessary. */ sklist = snewn(i, SOCKET); /* Retrieve the sockets into sklist. */ skcount = 0; for (socket = first_socket(&socketstate); socket != INVALID_SOCKET; socket = next_socket(&socketstate)) { sklist[skcount++] = socket; } /* Now we're done enumerating; go through the list. */ for (i = 0; i < skcount; i++) { WPARAM wp; socket = sklist[i]; wp = (WPARAM) socket; if (!p_WSAEnumNetworkEvents(socket, NULL, &things)) { static const struct { int bit, mask; } eventtypes[] = { {FD_CONNECT_BIT, FD_CONNECT}, {FD_READ_BIT, FD_READ}, {FD_CLOSE_BIT, FD_CLOSE}, {FD_OOB_BIT, FD_OOB}, {FD_WRITE_BIT, FD_WRITE}, {FD_ACCEPT_BIT, FD_ACCEPT}, }; int e; noise_ultralight(socket); noise_ultralight(things.lNetworkEvents); for (e = 0; e < lenof(eventtypes); e++) if (things.lNetworkEvents & eventtypes[e].mask) { LPARAM lp; int err = things.iErrorCode[eventtypes[e].bit]; lp = WSAMAKESELECTREPLY(eventtypes[e].mask, err); select_result(wp, lp); } } } sfree(sklist); } if (n == WAIT_TIMEOUT) { now = next; } else { now = GETTICKCOUNT(); } if (other_event && n == WAIT_OBJECT_0 + 1) return 1; return 0; } /* * Wait for some network data and process it. * * We have two variants of this function. One uses select() so that * it's compatible with WinSock 1. The other uses WSAEventSelect * and MsgWaitForMultipleObjects, so that we can consistently use * WSAEventSelect throughout; this enables us to also implement * ssh_sftp_get_cmdline() using a parallel mechanism. */ int ssh_sftp_loop_iteration(void) { if (sftp_ssh_socket == INVALID_SOCKET) return -1; /* doom */ if (p_WSAEventSelect == NULL) { fd_set readfds; int ret; long now = GETTICKCOUNT(); if (socket_writable(sftp_ssh_socket)) select_result((WPARAM) sftp_ssh_socket, (LPARAM) FD_WRITE); do { long next, ticks; struct timeval tv, *ptv; if (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); if (ticks <= 0) ticks = 1; /* just in case */ tv.tv_sec = ticks / 1000; tv.tv_usec = ticks % 1000 * 1000; ptv = &tv; } else { ptv = NULL; } FD_ZERO(&readfds); FD_SET(sftp_ssh_socket, &readfds); ret = p_select(1, &readfds, NULL, NULL, ptv); if (ret < 0) return -1; /* doom */ else if (ret == 0) now = next; else now = GETTICKCOUNT(); } while (ret == 0); select_result((WPARAM) sftp_ssh_socket, (LPARAM) FD_READ); return 0; } else { return do_eventsel_loop(NULL); } } /* * Read a command line from standard input. * * In the presence of WinSock 2, we can use WSAEventSelect to * mediate between the socket and stdin, meaning we can send * keepalives and respond to server events even while waiting at * the PSFTP command prompt. Without WS2, we fall back to a simple * fgets. */ struct command_read_ctx { HANDLE event; char *line; }; static DWORD WINAPI command_read_thread(void *param) { struct command_read_ctx *ctx = (struct command_read_ctx *) param; ctx->line = fgetline(stdin); SetEvent(ctx->event); return 0; } char *ssh_sftp_get_cmdline(char *prompt) { int ret; struct command_read_ctx actx, *ctx = &actx; DWORD threadid; fputs(prompt, stdout); fflush(stdout); if (sftp_ssh_socket == INVALID_SOCKET || p_WSAEventSelect == NULL) { return fgetline(stdin); /* very simple */ } /* * Create a second thread to read from stdin. Process network * and timing events until it terminates. */ ctx->event = CreateEvent(NULL, FALSE, FALSE, NULL); ctx->line = NULL; if (!CreateThread(NULL, 0, command_read_thread, ctx, 0, &threadid)) { fprintf(stderr, "Unable to create command input thread\n"); cleanup_exit(1); } do { ret = do_eventsel_loop(ctx->event); /* Error return can only occur if netevent==NULL, and it ain't. */ assert(ret >= 0); } while (ret == 0); return ctx->line Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec449f614db330ae182c5b31d6fdb0c8 Text-delta-base-sha1: dea0516ecff575e46ac55a1888c2b037484892ce Text-content-length: 58 Text-content-md5: 73517be99ed4e5f6836c91468a6e8d42 Text-content-sha1: 064420d1dd80f05ff8e129ceb6f522e9c0625941 Content-length: 58 SVNm %okextern int socket_writable(SOCKET skt Node-path: putty-wishlist/data/plink-keepalives Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 50ec484501732f7d79b5762bf4148b14 Text-delta-base-sha1: 921154bd840ba555ce8c1556133ddfe3baa19a29 Text-content-length: 38 Text-content-md5: 002bb883cec098b918a1df95560c2827 Text-content-sha1: 7f43cba15024a16896ea4f4e9dcc73021d64c86d Content-length: 38 SVN6KhOgFixed-in: 2004-11-28 Node-path: putty-wishlist/data/pterm-timer Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a4b9f3c3ce37bfbe83ace733ea13e65c Text-delta-base-sha1: 8baca39f2ae00034ef8bb0635d144ee1c982eff0 Text-content-length: 41 Text-content-md5: 1705677d47e39e826d5f5b137a412632 Text-content-sha1: 43c50062701f167ff0946a79c086073c71cfa0e3 Content-length: 41 SVN  Fixed-in: 2004-11-28 Node-path: putty-wishlist/data/unix-keepalives Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d0d26bfdea1b62a81281129931e11df3 Text-delta-base-sha1: 31b3c44f0a5668af950a63d9a2c551e3ce13c303 Text-content-length: 39 Text-content-md5: b271cef840c43b53c164f7ce049d04f0 Text-content-sha1: 37f7dd91444a7b66c666aa44a5672e8a37c0d223 Content-length: 39 SVN|{zFixed-in: 2004-11-28 Revision-number: 4907 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2004-11-27T13:31:07.041933Z K 7 svn:log V 113 Bah, I knew I'd miss _something_. term_out is now static, so declaring it in putty.h gives a warning under Unix. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a8bd4f87e943453b115195222a2d7498 Text-delta-base-sha1: 6a3cd1ad13715f34dd8a5ba1cddaa8914198a4c8 Text-content-length: 70 Text-content-md5: 18377d06c54d04fc2da9a76a0ab2a129 Text-content-sha1: 073e3fd00212fbef601e2f77b5f31487498a3f9d Content-length: 70 SVNh~(" *>Special command for SSH. */ TS_REKEY Revision-number: 4908 Prop-content-length: 509 Content-length: 509 K 8 svn:date V 27 2004-11-27T14:29:20.732441Z K 7 svn:log V 408 Implement client-initiated rekeys after an hour, or after 1Gb of data transfer in either direction (whichever comes first), or at explicit client request (nice idea Jacob). Have tested by lowering the limits, and it all seems solid enough; in particular, this has also allowed me to test the behaviour when connection-level data is received during rekey, and that looks fine too (at least it does _now_ :-). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cff533eab8ca13bf02408081833f4604 Text-delta-base-sha1: 82d91810b5963c642463bfd73ff1380b34fdface Text-content-length: 6657 Text-content-md5: e9e8170de0a5816929ea22297fbb3d27 Text-content-sha1: ce0eb8ccda9512ad9973434faba06df9be33492c Content-length: 6657 SVNGs^B ] c=px ace{hNW K# long encrypted_len; /* for SSH2 total-size counting */static void ssh2_timer(void *ctx, long now); static int do_ssh2_transport(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin /* * Track incoming and outgoing data sizes and time, for * size-based rekeys. */ unsigned long incoming_data_size, outgoing_data_size, deferred_data_size; int kex_in_progress; long next_rekey; }; #define MAX_DATA_BEFORE_REKEY (0x40000000UL) #define REKEY_TIMEOUT (3600 * TICKSPERSEC)st->pktin->encrypted_len = st->packetlenpkt->encrypted_len = pkt->length + padding ssh->outgoing_data_size += pkt->encrypted_len; if (!ssh->kex_in_progress && ssh->outgoing_data_size > MAX_DATA_BEFORE_REKEY) do_ssh2_transport(ssh, "Initiating key re-exchange " "(too much data sent)", -1, NULL); ->deferred_data_size += pkt->encrypted_ ssh->outgoing_data_size += ssh->deferred_data_size; if (!ssh->kex_in_progress && ssh->outgoing_data_size > MAX_DATA_BEFORE_REKEY) do_ssh2_transport(ssh, "Initiating key re-exchange " "(too much data sent)", -1, NULL); ssh->deferred_data_size = 0,wrX2kex_in_progressThe exchange hash from the very first key exchange is also * the session id, used in session key construction and * authentication. */ if (s->first_kex) memcpy(ssh->v2_session_id, s->exchange_hash, sizeof(s->exchange_hash) ssh->outgoing_data_size = 0; /* start counting from here */ /* * We've sent client NEWKEYS, so create and initialise * client-to-server/* * Set IVs on client-to-server keys. Here we use the exchange * hash from the _first_ key exchange. */ { unsigned char keyspace[40]A',keyspace); ssh->cscipher->setivE',keyspace); ssh->csmac->setkey(ssh->cs_mac_ctx, keyspace); } client->server MAC algorithm", ssh->cs ssh->incoming_data_size = 0; /* start counting from here */ /* * We've seen server NEWKEYS, so create and initialise * server-to-client session keys. */on server-to-client keys. Here we use the exchange * hash from the _first_ key exchange. */ { unsigned char keyspace[40]B',keyspace); ssh->sccipher->setiv(ssh->scserver->client encryption", ssh->scciphersccomp->text_name) logeventf(ssh, "Initialised %s decompression", ssh->sccomp->text_name); /* * Free key exchange data. */Key exchange is over. Schedule a timer for our next rekey. */ ssh->kex_in_progress = FALSE; ssh->next_rekey = schedule_timer(REKEY_TIMEOUT, ssh2_timer, ssh); * We _also_ go back to the start if we see pktin==NULL and * inlen==-1, because this is a special signal meaning * `initiate client-driven rekey', and `in' contains a message * giving the reason for the rekey. */ while (!((pktin && pktin->type == SSH2_MSG_KEXINIT) || (!pktin && inlen == -1))) { crReturn(1); } if (pktin) { logevent("Server initiated key re-exchange"); } else { logevent((char *)in); }f7#K!yss)!C2n'jIMPLEMENTED); ssh2_pkt_adduint32(pktout, pktin->sequence); /* * UNIMPLEMENTED messages MUST appear in the same order as the * messages they respond to. Hence, never queue them. */ ssh2_pkt_send_noqueue(ssh, pktout); } /* * Handle the top-level SSH2 protocol. */ static void ssh2_protocol_setup(Ssh ssh) { int i; /* * Most messages cause SSH2_MSG_UNIMPLEMENTED. */ for (i = 0; i < 256; i++) ssh->packet_dispatch[i] = ssh2_msg_something_unimplemented; /* * Any message we actually understand, we set to NULL so that * the coroutines will get it. */ ssh->packet_dispatch[SSH2_MSG_UNIMPLEMENTED] = NULL; ssh->packet_dispatch[SSH2_MSG_SERVICE_REQUEST] = NULL; ssh->packet_dispatch[SSH2_MSG_SERVICE_ACCEPT] = NULL; ssh->packet_dispatch[SSH2_MSG_KEXINIT] = NULL; ssh->packet_dispatch[SSH2_MSG_NEWKEYS] = NULL; ssh->packet_dispatch[SSH2_MSG_KEXDH_INIT] = NULL; ssh->packet_dispatch[SSH2_MSG_KEXDH_REPLY] = NULL; /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REQUEST] = NULL; duplicate case value */ /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_GROUP] = NULL; duplicate case value */ ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_INIT] = NULL; ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REPLY] = NULL; ssh->packet_dispatch[SSH2_MSG_USERAUTH_REQUEST] = NULL; ssh->packet_dispatch[SSH2_MSG_USERAUTH_FAILURE] = NULL; ssh->packet_dispatch[SSH2_MSG_USERAUTH_SUCCESS] = NULL; ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = NULL; ssh->packet_dispatch[SSH2_MSG_USERAUTH_PK_OK] = NULL; /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ] = NULL; duplicate case value */ /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_REQUEST] = NULL; duplicate case value */ ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_RESPONSE] = NULL; ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = NULL; ssh->packet_dispatch[SSH2_MSG_REQUEST_SUCCESS] = NULL; ssh->packet_dispatch[SSH2_MSG_REQUEST_FAILURE] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = NULL; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = NULL; timer(void *ctx, long now) { Ssh ssh = (Ssh)ctx; if (!ssh->kex_in_progress && now - ssh->next_rekey >= 0) { do_ssh2_transport(ssh, "Initiating key re-exchange (timeout)", -1, NULL); }) { ssh->incoming_data_size += pktin->encrypted_len; if (!ssh->kex_in_progress && ssh->incoming_data_size > MAX_DATA_BEFORE_REKEY) do_ssh2_transport(ssh, "Initiating key re-exchange " "(too much data received)", -1, NULL); }ssh->incoming_data_size = ssh->outgoing_data_size = ssh->deferred_data_size = 0L; ssh->kex_in_progress = FALSEexpire_timer_context {"Repeat key exchange", TS_REKEYREKEY) { if (!ssh->kex_in_progress && ssh->version == 2) { do_ssh2_transport(ssh, "Initiating key re-exchange at" " user request", -1, NULL Node-path: putty-wishlist/data/ssh2-kex-repeat Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f242980ea3c0ed8b752f800bee2a70b Text-delta-base-sha1: f94a0038777b287e0575a82666d442469f128d9b Text-content-length: 41 Text-content-md5: aa93ea883a9896e98eb73c060d5a555a Text-content-sha1: 176034847fc2eadc3bbc3217ff83db5cbe4b901b Content-length: 41 SVNUj :Fixed-in: 2004-11-28 Revision-number: 4909 Prop-content-length: 636 Content-length: 636 K 8 svn:date V 27 2004-11-27T15:32:45.564730Z K 7 svn:log V 535 Almost _all_ of the final connection-layer loop, in both SSH1 and SSH2, is now handled by the packet dispatch table. Dispatch table entries are enabled as soon as possible, so that if anyone tries to (for example) start using a forwarded port before the main shell session setup has finished, things should work sensibly. The SSH code is now a hybrid of coroutine-based sequential logic and table-driven event dispatch, each where it makes the most sense. I'm rather pleased with it. Should fix: ext-data-at-start, portfwd-at-start. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e9e8170de0a5816929ea22297fbb3d27 Text-delta-base-sha1: ce0eb8ccda9512ad9973434faba06df9be33492c Text-content-length: 26597 Text-content-md5: 319cc17da7f9ec06e12df267ed77a439 Text-content-sha1: bbf2369e3552c5271bc63d93eb6735124dbbf0ef Content-length: 26597 SVN` `ssh1_smsg_stdout_stderr_data(Ssh ssh, struct Packet *pktin) { char *string; int stringlen, bufsize; ssh_pkt_getstring(pktin, &string, &stringlen); if (string == NULL) { bombout(("Incoming terminal data packet was badly formed")); return; } bufsize = from_backend(ssh->frontend, pktin->type == SSH1_SMSG_STDERR_DATA, string, stringlen); if (!ssh->v1_stdout_throttling && bufsize > SSH1_BUFFER_LIMIT) { ssh->v1_stdout_throttling = 1; ssh1_throttle(ssh, +1); } } static void ssh1_smsg_x11_open(Ssh ssh, struct Packet *pktin) { /* Remote side is trying to open a channel to talk to our * X-Server. Give them back a local channel number. */ struct ssh_channel *c; int remoteid = ssh_pkt_getuint32(pktin); logevent("Received X11 connect request"); /* Refuse if X11 forwarding is disabled. */ if (!ssh->X11_fwd_enabled) { send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, remoteid, PKT_END); logevent("Rejected X11 connect request"); } else { c = snew(struct ssh_channel); c->ssh = ssh; if (x11_init(&c->u.x11.s, ssh->cfg.x11_display, c, ssh->x11auth, NULL, -1, &ssh->cfg) != NULL) { logevent("Opening X11 forward connection failed"); sfree(c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, remoteid, PKT_END); } else { logevent ("Opening X11 forward connection succeeded"); c->remoteid = remoteid; c->localid = alloc_channel_id(ssh); c->closes = 0; ^* #ep Y;OeKzA]gBPt?$M _b#(@@4 gJ}zS-fB[ c->v.v1.throttling = 0; c->type = CHAN_X11; /* identify channel type */ add234(ssh->channels, c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION, PKT_INT, c->remoteid, PKT_INT, c->localid, PKT_END); logevent("Opened X11 forward channel"); } } } static void ssh1_smsg_agent_open(Ssh ssh, struct Packet *pktin) { /* Remote side is trying to open a channel to talk to our * agent. Give them back a local channel number. */ struct ssh_channel *c; int remoteid = ssh_pkt_getuint32(pktin); /* Refuse if agent forwarding is disabled. */ if (!ssh->agentfwd_enabled) { send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, remoteid, PKT_END); } else { c = snew(struct ssh_channel); c->ssh = ssh; c->remoteid = remoteid; c->localid = alloc_channel_id(ssh); c->closes = 0; c->v.v1.throttling = 0; c->type = CHAN_AGENT; /* identify channel type */ c->u.a.lensofar = 0; add234(ssh->channels, c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION, PKT_INT, c->remoteid, PKT_INT, c->localid, PKT_END); } } static void ssh1_msg_port_open(Ssh ssh, struct Packet *pktin) { /* Remote side is trying to open a channel to talk to a * forwarded port. Give them back a local channel number. */ struct ssh_channel *c; struct ssh_rportfwd pf; int remoteid; int hostsize, port; char *host, buf[1024]; const char *e; c = snew(struct ssh_channel); c->ssh = ssh; remoteid = ssh_pkt_getuint32(pktin); ssh_pkt_getstring(pktin, &host, &hostsize); port = ssh_pkt_getuint32(pktin); if (hostsize >= lenof(pf.dhost)) hostsize = lenof(pf.dhost)-1; memcpy(pf.dhost, host, hostsize); pf.dhost[hostsize] = '\0'; pf.dport = port; if (find234(ssh->rportfwds, &pf, NULL) == NULL) { sprintf(buf, "Rejected remote port open request for %s:%d", pf.dhost, port); logevent(buf); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, remoteid, PKT_END); } else { sprintf(buf, "Received remote port open request for %s:%d", pf.dhost, port); logevent(buf); e = pfd_newconnect(&c->u.pfd.s, pf.dhost, port, c, &ssh->cfg); if (e != NULL) { char buf[256]; sprintf(buf, "Port open failed: %s", e); logevent(buf); sfree(c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, remoteid, PKT_END); } else { c->remoteid = remoteid; c->localid = alloc_channel_id(ssh); c->closes = 0; c->v.v1.throttling = 0; c->type = CHAN_SOCKDATA; /* identify channel type */ add234(ssh->channels, c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION, PKT_INT, c->remoteid, PKT_INT, c->localid, PKT_END); logevent("Forwarded port opened successfully"); } } } static void ssh1_msg_channel_open_confirmation(Ssh ssh, struct Packet *pktin) { unsigned int remoteid = ssh_pkt_getuint32(pktin); unsigned int localid = ssh_pkt_getuint32(pktin); struct ssh_channel *c; c = find234(ssh->channels, &remoteid, ssh_channelfind); if (c && c->type == CHAN_SOCKDATA_DORMANT) { c->remoteid = localid; c->type = CHAN_SOCKDATA; c->v.v1.throttling = 0; pfd_confirm(c->u.pfd.s); } if (c && c->closes) { /* * We have a pending close on this channel, * which we decided on before the server acked * the channel open. So now we know the * remoteid, we can close it again. */ send_packet(ssh, SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid, PKT_END); } } static void ssh1_msg_channel_open_failure(Ssh ssh, struct Packet *pktin) { unsigned int remoteid = ssh_pkt_getuint32(pktin); struct ssh_channel *c; c = find234(ssh->channels, &remoteid, ssh_channelfind); if (c && c->type == CHAN_SOCKDATA_DORMANT) { logevent("Forwarded connection refused by server"); pfd_close(c->u.pfd.s); del234(ssh->channels, c); sfree(c); } } static void ssh1_msg_channel_close(Ssh ssh, struct Packet *pktin) { /* Remote side closes a channel. */((int)c->remoteid) != -1) { int closetype; closetype = (pktin->type == SSH1_MSG_CHANNEL_CLOSE ? 1 : 2); if ((c->closes == 0) && (c->type == CHAN_X11)) { logevent("Forwarded X11 connection terminated"); assert(c->u.x11.s != NULL); x11_close(c->u.x11.s); c->u.x11.s = NULL; } if ((c->closes == 0) && (c->type == CHAN_SOCKDATA)) { logevent("Forwarded port closed"); assert(c->u.pfd.s != NULL); pfd_close(c->u.pfd.s); c->u.pfd.s = NULL; } c->closes |= (closetype << 2); /* seen this message */ if (!(c->closes & closetype)) { send_packet(ssh, pktin->type, PKT_INT, c->remoteid, PKT_END); c->closes |= closetype; /* sent it too */ } if (c->closes == 15) { del234(ssh->channels, c); sfree(c); } } else { bombout(("Received CHANNEL_CLOSE%s for %s channel %d\n", pktin->type == SSH1_MSG_CHANNEL_CLOSE ? "" : "_CONFIRMATION", c ? "half-open" : "nonexistent", i)); } } static void ssh1_msg_channel_data(Ssh ssh, struct Packet *pktin) { /* Data sent down one of our channels. */ int i = ssh_pkt_getuint32(pktin); char *p; int len; struct ssh_channel *c; ssh_pkt_getstring(pktin, &p, &len); c = find234(ssh->channels, &i, ssh_channelfind); if (c) { int bufsize = 0; switch (c->type) { case CHAN_X11: bufsize = x11_send(c->u.x11.s, p, len); break; case CHAN_SOCKDATA: bufsize = pfd_send(c->u.pfd.s, p, len); break; case CHAN_AGENT: /* Data for an agent message. Buffer it. */ while (len > 0) { if (c->u.a.lensofar < 4) { int l = min(4 - c->u.a.lensofar, len); memcpy(c->u.a.msglen + c->u.a.lensofar, p, l); p += l; len -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == 4) { c->u.a.totallen = 4 + GET_32BIT(c->u.a.msglen); c->u.a.message = snewn(c->u.a.totallen, unsigned char); memcpy(c->u.a.message, c->u.a.msglen, 4); } if (c->u.a.lensofar >= 4 && len > 0) { int l = min(c->u.a.totallen - c->u.a.lensofar, len); memcpy(c->u.a.message + c->u.a.lensofar, p, l); p += l; len -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == c->u.a.totallen) { void *reply; int replylen; if (agent_query(c->u.a.message, c->u.a.totallen, &reply, &replylen, ssh_agentf_callback, c)) ssh_agentf_callback(c, reply, replylen); sfree(c->u.a.message); c->u.a.lensofar = 0; } } bufsize = 0; /* agent channels never back up */ break; } if (!c->v.v1.throttling && bufsize > SSH1_BUFFER_LIMIT) { c->v.v1.throttling = 1; ssh1_throttle(ssh, +1); } } } static void ssh1_smsg_exit_status(Ssh ssh, struct Packet *pktin) { char buf[100]; ssh->exitcode = ssh_pkt_getuint32(pktin); sprintf(buf, "Server sent command exit status %d", ssh->exitcode); logevent(buf); send_packet(ssh, SSH1_CMSG_EXIT_CONFIRMATION, PKT_END); /* * In case `helpful' firewalls or proxies tack * extra human-readable text on the end of the * session which we might mistake for another * encrypted packet, we close the session once * we've sent EXIT_CONFIRMATION. */ ssh_closing((Plug)ssh, NULL, 0, 0); } static void do_ssh1_connection(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin) { crBegin(ssh->do_ssh1_connection_crstate); ssh->packet_dispatch[SSH1_SMSG_STDOUT_DATA] = ssh->packet_dispatch[SSH1_SMSG_STDERR_DATA] = ssh1_smsg_stdout_stderr_data; ssh->packet_dispatch[SSH1_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh1_msg_channel_open_confirmation; ssh->packet_dispatch[SSH1_MSG_CHANNEL_OPEN_FAILURE] = ssh1_msg_channel_open_failure; ssh->packet_dispatch[SSH1_MSG_CHANNEL_CLOSE] = ssh->packet_dispatch[SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION] = ssh1_msg_channel_close; ssh->packet_dispatch[SSH1_MSG_CHANNEL_DATA] = ssh1_msg_channel_data; ssh->packet_dispatch[SSH1_SMSG_EXIT_STATUS] = ssh1_smsg_exit_status; if (ssh->cfg.agentfwd && agent_exists()) { logevent("Requesting agent forwarding"); send_packet(ssh, SSH1_CMSG_AGENT_REQUEST_FORWARDING ssh->packet_dispatch[SSH1_SMSG_AGENT_OPEN] = ssh1_smsg_agent_open; } } if (if (ssh->v1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) { send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKT_STR, data, PKT_INT, x11_get_screen_number(ssh->cfg.x11_display), PKT_END); } else { send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING, PKT_STR, proto, PKT_STR, data, PKT_END); } ssh->packet_dispatch[SSH1_SMSG_X11_OPEN] = ssh1_smsg_x11_open logevent("Server refused this port forwarding"); } else { logevent("Remote port forwarding enabled"); ssh->packet_dispatch[SSH1_MSG_PORT_OPEN] = ssh1_msg_port_open; } /* * By this point, most incoming packets are already being * handled by the dispatch table, and we need only pay * attention to the unusual ones. */ crReturnV; if (pktin) { static static void ssh2_msg_channel_data(Ssh ssh, struct Packet *pktin) { char *data; int length;!c) return; /* nonexistent channel */ if (pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA && ssh_pkt_getuint32(pktin) != SSH2_EXTENDED_DATA_STDERR) return; /* extended but not stderr */ ssh_pkt_getstring(pktin, &data, &length); if (data) { int bufsize = 0; c->v.v2.locwindow -= length; switch (c->type) { case CHAN_MAINSESSION: bufsize = from_backend(ssh->frontend, pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA, data, length); break; case CHAN_X11: bufsize = x11_send(c->u.x11.s, data, length); break; case CHAN_SOCKDATA: bufsize = pfd_send(c->u.pfd.s, data, length); break; case CHAN_AGENT: while (length > 0) { if (c->u.a.lensofar < 4) { int l = min(4 - c->u.a.lensofar, length); memcpy(c->u.a.msglen + c->u.a.lensofar, data, l); data += l; length -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == 4) { c->u.a.totallen = 4 + GET_32BIT(c->u.a.msglen); c->u.a.message = snewn(c->u.a.totallen, unsigned char); memcpy(c->u.a.message, c->u.a.msglen, 4); } if (c->u.a.lensofar >= 4 && length > 0) { int l = min(c->u.a.totallen - c->u.a.lensofar, length); memcpy(c->u.a.message + c->u.a.lensofar, data, l); data += l; length -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == c->u.a.totallen) { void *reply; int replylen; if (agent_query(c->u.a.message, c->u.a.totallen, &reply, &replylen, ssh_agentf_callback, c)) ssh_agentf_callback(c, reply, replylen); sfree(c->u.a.message); c->u.a.lensofar = 0; } } bufsize = 0; break; } /* * If we are not buffering too much data, * enlarge the window again at the remote side. */ if (bufsize < OUR_V2_WINSIZE) ssh2_set_window(c, OUR_V2_WINSIZE - bufsize); } } static void ssh2_msg_channel_eof(Ssh ssh, struct Packet *pktin) { unsigned i = ssh_pkt_getuint32(pktin); struct ssh_channel *c; c = find234(ssh->channels, &i, ssh_channelfind); if (!c) return; /* nonexistent channel */ if (c->type == CHAN_X11) { /* * Remote EOF on an X11 channel means we should * wrap up and close the channel ourselves. */ x11_close(c->u.x11.s); sshfwd_close(c); } else if (c->type == CHAN_AGENT) { sshfwd_close(c); } else if (c->type == CHAN_SOCKDATA) { pfd_close(c->u.pfd.s); sshfwd_close(c); } } static void ssh2_msg_channel_close(Ssh ssh, struct Packet *pktin) { unsigned i = ssh_pkt_getuint32(pktin); struct ssh_channel *c; struct Packet *pktout; c = find234(ssh->channels, &i, ssh_channelfind); if (!c || ((int)c->remoteid) == -1) { bombout(("Received CHANNEL_CLOSE for %s channel %d\n", c ? "half-open" : "nonexistent", i)); return; } /* Do pre-close processing on the channel. */ switch (c->type) { case CHAN_MAINSESSION: ssh->mainchan = NULL; update_specials_menu(ssh->frontend); break; case CHAN_X11: if (c->u.x11.s != NULL) x11_close(c->u.x11.s); sshfwd_close(c); break; case CHAN_AGENT: sshfwd_close(c); break; case CHAN_SOCKDATA: if (c->u.pfd.s != NULL) pfd_close(c->u.pfd.s); sshfwd_close(c); break; } if (c->closes == 0) { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_send(ssh, pktout); } del234(ssh->channels, c); bufchain_clear(&c->v.v2.outbuffer); sfree(c); /* * See if that was the last channel left open. * (This is only our termination condition if we're * not running in -N mode.) */ if (!ssh->cfg.ssh_no_shell && count234(ssh->channels) == 0) { logevent("All channels closed. Disconnecting"); #if 0 /* * We used to send SSH_MSG_DISCONNECT here, * because I'd believed that _every_ conforming * SSH2 connection had to end with a disconnect * being sent by at least one side; apparently * I was wrong and it's perfectly OK to * unceremoniously slam the connection shut * when you're done, and indeed OpenSSH feels * this is more polite than sending a * DISCONNECT. So now we don't. */ s->pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_addstring(s->pktout, "All open channels closed"); ssh2_pkt_addstring(s->pktout, "en"); /* language tag */ ssh2_pkt_send_noqueue(ssh, s->pktout); #endif ssh_closing((Plug)ssh, NULL, 0, 0); } } static void ssh2_msg_channel_open_confirmation(Ssh ssh, struct Packet *pktin) { unsigned i = ssh_pkt_getuint32(pktin); struct ssh_channel *c; struct Packet *pktout; c = find234(ssh->channels, &i, ssh_channelfind); if (!c) return; /* nonexistent channel */ if (c->type != CHAN_SOCKDATA_DORMANT) return; /* dunno why they're confirming this */ c->remoteid = ssh_pkt_getuint32(pktin); c->type = CHAN_SOCKDATA; c->v.v2.remwindow = ssh_pkt_getuint32(pktin); c->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin); if (c->u.pfd.s) pfd_confirm(c->u.pfd.s); if (c->closes) { /* * We have a pending close on this channel, * which we decided on before the server acked * the channel open. So now we know the * remoteid, we can close it again. */ pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_send(ssh, pktout); } } static void ssh2_msg_channel_open_failure(Ssh ssh, struct Packet *pktin) { static const char *const reasons[] = { "", "Administratively prohibited", "Connect failed", "Unknown channel type", "Resource shortage", }; unsigned i = ssh_pkt_getuint32(pktin); unsigned reason_code; char *reason_string; int reason_length; char *message; struct ssh_channel *c; c = find234(ssh->channels, &i, ssh_channelfind); if (!c) return; /* nonexistent channel */ if (c->type != CHAN_SOCKDATA_DORMANT) return; /* dunno why they're failing this */ reason_code = ssh_pkt_getuint32(pktin); if (reason_code >= lenof(reasons)) reason_code = 0; /* ensure reasons[reason_code] in range */ ssh_pkt_getstring(pktin, &reason_string, &reason_length); message = dupprintf("Forwarded connection refused by" " server: %s [%.*s]", reasons[reason_code], reason_length, reason_string); logevent(message); sfree(message); pfd_close(c->u.pfd.s); del234(ssh->channels, c); sfree(c); } static void ssh2_msg_channel_request(Ssh ssh, struct Packet *pktin) { unsigned localid; char *type; int typelen, want_reply; int reply = SSH2_MSG_CHANNEL_FAILURE; /* default */ struct ssh_channel *c; struct Packet *pktout; localid = ssh_pkt_getuint32(pktin); ssh_pkt_getstring(pktin, &type, &typelen); want_reply = ssh2_pkt_getbool(pktin); /* * First, check that the channel exists. Otherwise, * we can instantly disconnect with a rude message. */ c = find234(ssh->channels, &localid, ssh_channelfind); if (!c) { char buf[80]; sprintf(buf, "Received channel request for nonexistent" " channel %d", localid); logevent(buf); pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(pktout, SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(pktout, buf); ssh2_pkt_addstring(pktout, "en"); /* language tag */ ssh2_pkt_send_noqueue(ssh, pktout); connection_fatal(ssh->frontend, "%s", buf); ssh_closing((Plug)ssh, NULL, 0, 0); return; } /* * Having got the channel number, we now look at * the request type string to see if it's something * we recognise. */ if (c == ssh->mainchan) { /* * We recognise "exit-status" and "exit-signal" on * the primary channel. */ if (typelen == 11 && !memcmp(type, "exit-status", 11)) { ssh->exitcode = ssh_pkt_getuint32(pktin); logeventf(ssh, "Server sent command exit status %d", ssh->exitcode); reply = SSH2_MSG_CHANNEL_SUCCESS; } else if (typelen == 11 && !memcmp(type, "exit-signal", 11)) { int is_plausible = TRUE, is_int = FALSE; char *fmt_sig = "", *fmt_msg = ""; char *msg; int msglen = 0, core = FALSE; /* ICK: older versions of OpenSSH (e.g. 3.4p1) * provide an `int' for the signal, despite its * having been a `string' in the drafts since at * least 2001. (Fixed in session.c 1.147.) Try to * infer which we can safely parse it as. */ { unsigned char *p = pktin->body + pktin->savedpos; long len = pktin->length - pktin->savedpos; unsigned long num = GET_32BIT(p); /* what is it? */ /* If it's 0, it hardly matters; assume string */ if (num == 0) { is_int = FALSE; } else { CHECK_HYPOTHESIS(4+1, maybe_int); CHECK_HYPOTHESIS(4+num+1, maybe_str); #undef CHECK_HYPOTHESIS if (maybe_int && !maybe_str) is_int = TRUE; else if (!maybe_int && maybe_str) is_int = FALSE; else /* Crikey. Either or neither. Panic. */ is_plausible = FALSE; } } if (is_plausible) { if (is_int) { /* Old non-standard OpenSSH. */ int signum = ssh_pkt_getuint32(pktin); fmt_sig = dupprintf(" %d", signum); } else { /* As per the drafts. */ char *sig; int siglen; ssh_pkt_getstring(pktin, &sig, &siglen); /* Signal name isn't supposed to be blank, but * let's cope gracefully if it is. */ if (siglen) { fmt_sig = dupprintf(" \"%.*s\"", siglen, sig); } } core = ssh2_pkt_getbool(pktin); ssh_pkt_getstring(pktin, &msg, &msglen); if (msglen) { fmt_msg = dupprintf(" (\"%.*s\")", msglen, msg); } /* ignore lang tag */ } /* else don't attempt to parse */ logeventf(ssh, "Server exited on signal%s%s%s", fmt_sig, core ? " (core dumped)" : "", fmt_msg); if (*fmt_sig) sfree(fmt_sig); if (*fmt_msg) sfree(fmt_msg); reply = SSH2_MSG_CHANNEL_SUCCESS; } } else { /* * This is a channel request we don't know * about, so we now either ignore the request * or respond with CHANNEL_FAILURE, depending * on want_reply. */ reply = SSH2_MSG_CHANNEL_FAILURE; } if (want_reply) { pktout = ssh2_pkt_init(reply); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_send(ssh, pktout); } } static void ssh2_msg_global_request(Ssh ssh, struct Packet *pktin) { char *type; int typelen, want_reply; struct Packet *pktout; ssh_pkt_getstring(pktin, &type, &typelen); want_reply = ssh2_pkt_getbool(pktin); /* * We currently don't support any global requests * at all, so we either ignore the request or * respond with REQUEST_FAILURE, depending on * want_reply. */ if (want_reply) { pktout = ssh2_pkt_init(SSH2_MSG_REQUEST_FAILURE); ssh2_pkt_send(ssh, pktout); } } static void ssh2_msg_channel_open(Ssh ssh, struct Packet *pktin) { char *type; int typelen; char *peeraddr; int peeraddrlen; int peerport; char *error = NULL; struct ssh_channel *c; unsigned remid, winsize, pktsize; struct Packet *pktout; ssh_pkt_getstring(pktin, &type, &typelen); c = snew(struct ssh_channel); c->ssh = ssh; remid = ssh_pkt_getuint32(pktin); winsize = ssh_pkt_getuint32(pktin); pktsize = ssh_pkt_getuint32(pktin); if (typelen == 3 && !memcmp(type, "x11", 3)) { char *addrstr; ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen); addrstr = snewn(peeraddrlen+1, char); memcpy(addrstr, peeraddr, peeraddrlen); addrstr[peeraddrlen] = '\0'; peerport = ssh_pkt_getuint32(pktin); logeventf(ssh, "Received X11 connect request from %s:%d", addrstr, peerport); if (!ssh->X11_fwd_enabled) error = "X11 forwarding is not enabled"; else if (x11_init(&c->u.x11.s, ssh->cfg.x11_display, c, ssh->x11auth, addrstr, peerport, &ssh->cfg) != NULL) { error = "Unable to open an X11 connection"; } else { logevent("Opening X11 forward connection succeeded"); c->type = CHAN_X11; } sfree(addrstr); } else if (typelen == 15 && !memcmp(type, "forwarded-tcpip", 15)) { struct ssh_rportfwd pf, *realpf; char *dummy; int dummylen; ssh_pkt_getstring(pktin, &dummy, &dummylen);/* skip address */ pf.sport = ssh_pkt_getuint32(pktin); ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen); peerport = ssh_pkt_getuint32(pktin); realpf = find234(ssh->rportfwds, &pf, NULL); logeventf(ssh, "Received remote port %d open request " "from %s:%d", pf.sport, peeraddr, peerport); if (realpf == NULL) { error = "Remote port is not recognised"; } else { const char *e = pfd_newconnect(&c->u.pfd.s, realpf->dhost, realpf->dport, c, &ssh->cfg); logeventf(ssh, "Attempting to forward remote port to " "%s:%d", realpf->dhost, realpf->dport); if (e != NULL) { logeventf(ssh, "Port open failed: %s", e); error = "Port open failed"; } else { logevent("Forwarded port opened successfully"); c->type = CHAN_SOCKDATA; } } } else if (typelen == 22 && !memcmp(type, "auth-agent@openssh.com", 3)) { if (!ssh->agentfwd_enabled) error = "Agent forwarding is not enabled"; else { c->type = CHAN_AGENT; /* identify channel type */ c->u.a.lensofar = 0; } } else { error = "Unsupported channel type requested"; } c->remoteid = remid; if (error) { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURE); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_adduint32(pktout, SSH2_OPEN_CONNECT_FAILED); ssh2_pkt_addstring(pktout, error); ssh2_pkt_addstring(pktout, "en"); /* language tag */ ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Rejected channel open: %s", error); sfree(c); } else { c->localid = alloc_channel_id(ssh); c->closes = 0; c->v.v2.locwindow = OUR_V2_WINSIZE; c->v.v2.remwindow = winsize; c->v.v2.remmaxpkt = pktsize; bufchain_init(&c->v.v2.outbuffer); add234(ssh->channels, c); pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_adduint32(pktout, c->localid); ssh2_pkt_adduint32(pktout, c->v.v2.locwindow); ssh2_pkt_adduint32(pktout, 0x4000UL); /* our max pkt size */ ssh2_pkt_send(ssh, pktout); } ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = ssh2_msg_global_requeNow we have a channel, make dispatch table entries for * general channel-based messages. */ ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = ssh2_msg_channel_data; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_channel_eof; ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_channel_close; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh2_msg_channel_open_confirmation; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_channel_open_failure; ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = ssh2_msg_channel_request; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_channel_open /* * _All_ the connection-layer packets we expect to * receive are now handled by the dispatch table. * Anything that reaches here must be bogus. */ bombout(("Strange packet received: type %d", pktin->type)); crStopV;fIccfy take notice of this */ always_display = ssh2_pkt_getbool(pktin); ssh_pkt_getstring(pktin, &msg, &msglen); buf = dupprintf("Remote debug message: %.*s", msglen, msg); logevent(buf); sfree(buf); } void ssh2_msg_something_unimplemented(Ssh ssh, struct Packet *pktin) { struct Packet *pktout; pktout = ssh2_pkt_init(SSH2_MSG_UN Node-path: putty-wishlist/data/ext-data-at-start Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e02636e51bb6a562abea574e5a207df Text-delta-base-sha1: 375f763548adbd42bc4e1f88f29e5625d4b75dd5 Text-content-length: 317 Text-content-md5: 979ab89b8f202fd988b69ecb937949fc Text-content-sha1: 8e0694191144daa500e6f5cd5e5686379801e987 Content-length: 317 SVN; &s"rFixed-in: 2004-11-28

    SGT, 2004-11-27: I've rearchitected the SSH back end somewhat, so that it's now a hybrid of coroutine-based sequential code and random dispatch-table handling of incoming packets. This ought to solve this problem, although I'm unable to immediately test it. Node-path: putty-wishlist/data/portfwd-at-start Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25f712201d3d4902d5a93af23dcdd327 Text-delta-base-sha1: 2ad38e69cbcaeaeeac3136dfe98ba32d666f566b Text-content-length: 319 Text-content-md5: 74bd53f91f12a6f390b786a0efc7df0f Text-content-sha1: ddf003df176388b8f7088a735b07d87f26ac9b67 Content-length: 319 SVNe &LFixed-in: 2004-11-28

    SGT, 2004-11-27: I've rearchitected the SSH back end somewhat, so that it's now a hybrid of coroutine-based sequential code and random dispatch-table handling of incoming packets. This ought to solve this problem, although I'm unable to immediately test it. Revision-number: 4910 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2004-11-27T15:47:37.631764Z K 7 svn:log V 23 I fixed this in r4609. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/do-text-unicode Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7ad0a754bd08d380151ea7c51d03fee4 Text-delta-base-sha1: 92a384be2dabd2300a745931928598b4bb83add8 Text-content-length: 39 Text-content-md5: f02d5a28b15adf65b332700dc298fac6 Text-content-sha1: 05331abce3910154ce9a68ecaf61cb0c98c8917e Content-length: 39 SVNK`|P{Fixed-in: 2004-10-14 Revision-number: 4911 Prop-content-length: 452 Content-length: 452 K 8 svn:date V 27 2004-11-27T19:34:45.789324Z K 7 svn:log V 351 Slight improvement to cursor blink timing: since the cursor doesn't blink when the window doesn't have focus, we don't schedule blink timers at that point either. Infrastructure change: term->has_focus should now not be written directly from outside terminal.c. Instead, use the function term_set_focus, which will sort out the blink timers as well. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 982af5e5c43d35e408d9ea0590654663 Text-delta-base-sha1: a9772087fadf3476ad2d38b30eb540c6c9c11482 Text-content-length: 57 Text-content-md5: 8167283a011668e2de1db48e91f92db4 Text-content-sha1: e11ca022a77e35f3b2afd80f1b0aa6a7fa4f5ee6 Content-length: 57 SVN} 4.Oterm_set_focus(s->term, active) Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18377d06c54d04fc2da9a76a0ab2a129 Text-delta-base-sha1: 073e3fd00212fbef601e2f77b5f31487498a3f9d Text-content-length: 74 Text-content-md5: f20ee8f89935360dbfd25ff21ea25273 Text-content-sha1: 964fb7f84d4f8fe1fdb87e8ee93d28637654866d Content-length: 74 SVN~2 17J4void term_set_focus(Terminal *term, int has_focus Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3d63428be3d17cfe60a84cfb9ec3550e Text-delta-base-sha1: 67653a19e72f2fec0217f357be68d2de0563d41a Text-content-length: 361 Text-content-md5: 7a394705425fd4acfa6970faf902304f Text-content-sha1: 39de05ab673eed0cf7c57234ea2d9b50c11f36d7 Content-length: 361 SVN9T81D;ECblink_is_real) { if (!term->tblink_pending) fg.blink_cur && term->has_focus) { if (!term->cblink_pending) buf, len, 0); } break; case 14: if (term->ldio%y,Cy void term_set_focus(Terminal *term, int has_focus) { term->has_focus = has_focus; term_schedule_cblink(term); } Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b21138ce035202ca39664f460db9dd37 Text-delta-base-sha1: fe2424c5cf72e9cbe50f0d97297174b8ca8f4cda Text-content-length: 81 Text-content-md5: 06cd01afde47f167bffb066e2251723a Text-content-sha1: dedf27cb61876ca87cdd6c1dd3bddace31279006 Content-length: 81 SVN %A;term_set_focus(inst->term, event->in)st-> Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9dd7669e203b183d4a173043e9842fec Text-delta-base-sha1: ad7ab60a3ef86b71dd3c07c4f42cdc166e47e84a Text-content-length: 156 Text-content-md5: 6206b884050a80741afa74f5b058dac4 Text-content-sha1: 1d48edb3a98fcc0cb3870e974c0f2763e9a4a720 Content-length: 156 SVN#OCmRANO!q_set_focus(term, _set_focus(term, _set_focus(term, TRUE)_set_focus(term, FALSE)5A 5d Keypad 5. Revision-number: 4912 Prop-content-length: 237 Content-length: 237 K 7 svn:log V 136 Changes in startup order to ensure any subsystem which might attempt to schedule timers is not started until after hwnd is initialised. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-11-27T19:41:24.640717Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6206b884050a80741afa74f5b058dac4 Text-delta-base-sha1: 1d48edb3a98fcc0cb3870e974c0f2763e9a4a720 Text-content-length: 737 Text-content-md5: 2100b875e03db9b13ca005473a4b396f Text-content-sha1: ac1ddc4b30ae2c7fab2c358f002baf02c28d9458 Content-length: 737 SVN/l&nev.v1.throttling 'V*y take notice of this */ always_disIJ-'Lcfandom_ref() random_unref( Node-path: putty/sshrand.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7cd9153ac58803814bd1d837f7c56990 Text-delta-base-sha1: 7636e98aa8bb356b4c2f33c227eec6a103f9e183 Text-content-length: 738 Text-content-md5: df604fcb3ec5540d28c59eab1bbe5255 Text-content-sha1: 2ffc4c7c7e2fb928369caa161dcedc4a1be4be9b Content-length: 738 SVNxn?mckO|B`/* Collect environmental noise every 5 minutes */ #define NOISE_REGULAR_INTERVAL (5*60*TICKSPERSEC)long next_noise_collectionstatic void random_timer(void *ctx, long now) { if (random_active > 0 && now - next_noise_collection >= 0) { noise_regular(); next_noise_collection = schedule_timer(NOISE_REGULAR_INTERVAL, random_timer, &pool); } } void random_ref(void) { if (!random_active) { memset(&pool, 0, sizeof(pool)); /* just to start with */ noise_get_heavy(random_add_heavynoise_bitbybit); random_stir(); next_noise_collection = schedule_timer(NOISE_REGULAR_INTERVAL, random_timer, &pool); } random_active++; } void random_unref(void) { random_active--; Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5a26df40911f0e4242a6291ff340ae51 Text-delta-base-sha1: ceec8a8291ec3459db65791bcaf0e548d02a6d9e Text-content-length: 27 Text-content-md5: a6e5fdc9d20b54e979ba1211f61e67e6 Text-content-sha1: 31555c85da610f9ebb3ea92a77b8403fd5f479d5 Content-length: 27 SVN)( J[Nref Revision-number: 4914 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2004-11-28T00:48:31.695067Z K 7 svn:log V 40 Oops; forgot to add this file in r4913. K 10 svn:author V 5 simon PROPS-END Node-path: putty/notiming.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 431 Text-content-md5: 1ac362fb4d33967e24beb8ad6d85d312 Text-content-sha1: 57424264154abd866a8114860d91c7d869bca6ec Content-length: 441 PROPS-END SVN!!!/* * notiming.c: stub version of schedule_timer(). * * Used in key generation tools, which need the random number * generator but don't want the hassle of calling noise_regular() * at regular intervals - and don't _need_ it either, since they * have their own rigorous and different means of noise collection. */ #include "putty.h" long schedule_timer(int ticks, timer_fn_t fn, void *ctx) { return 0; } Revision-number: 4915 Prop-content-length: 316 Content-length: 316 K 8 svn:date V 27 2004-11-28T09:24:57.656444Z K 7 svn:log V 215 Cursor position, selection highlights and mouse clicks are now all transformed back and forth according to the character position permutation output from the bidi algorithm. I was expecting that to be a lot harder. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a394705425fd4acfa6970faf902304f Text-delta-base-sha1: 39de05ab673eed0cf7c57234ea2d9b50c11f36d7 Text-content-length: 3985 Text-content-md5: 9c252553526368a309b436d6ce9e0b33 Text-content-sha1: e7a3b42451423b2a206cd44d186ae7d0458cf92e Content-length: 3985 SVN%LWBNxJ-7YX^5~/Z+)pN bidi_char *wcTo, int width) { int i; term->post_bidi_cache[line].forward = snewn(width, int); term->post_bidi_cache[line].backward = snewn(width, int memset(term->post_bidi_cache[line].forward, 0, width * sizeof(int)); memset(term->post_bidi_cache[line].backward, 0, width * sizeof(int)); for (i = 0; i < width; i++) { int p = wcTo[i].index; assert(0 <= p && p < width); term->post_bidi_cache[line].backward[i] = p; term->post_bidi_cache[line].forward[p] = i; } } /* * Prepare the bidi information for a screen line. Returns the * transformed list of termchars, or NULL if no transformation at * all took place (because bidi is disabled). If return was * non-NULL, auxiliary information such as the forward and reverse * mappings of permutation position are available in * term->post_bidi_cache[scr_y].*. */ static termchar *term_bidi_line(Terminal *term, struct termline *ldata, int scr_y) { termchar *lchars; int it; /* Do Arabic shaping and bidi. */ if(!term->cfg.bidi || !term->cfg.arabicshaping) { if (!term_bidi_cache_hit(term, scr_y, ldata->chars, term->cols)) { if (term->wcFromTo_size < term->cols) { term->wcFromTo_size = term->cols; term->wcFrom = sresize(term->wcFrom, term->wcFromTo_size, bidi_char); term->wcTo = sresize(term->wcTo, term->wcFromTo_size, bidi_char); } for(it=0; itcols ; it++) { unsigned long uc = (ldata->chars[it].chr)term->wcFrom[it].origwc = term->wcFrom[it].wc = (wchar_t)uc; term->wcFrom[it].index = it; } if(!term->cfg.bidi) do_bidi(term->wcFrom, term->cols); /* this is saved iff done from inside the shaping */ if(!term->cfg.bidi && term->cfg.arabicshaping) for(it=0; itcols; it++) term->wcTo[it] = term->wcFrom[it]; if(!term->cfg.arabicshaping) do_shape(term->wcFrom, term->wcTo, term->cols); if (term->ltemp_size < ldata->size) { term->ltemp_size = ldata->size; term->ltemp = sresize(term->ltemp, term->ltemp_size, termchar); } memcpy(term->ltemp, ldata->chars, ldata->size * TSIZE); for(it=0; itcols ; it++) { term->ltemp[it] = ldata->chars[term->wcTo[it].index]; if (term->ltemp[it].cc_next) term->ltemp[it].cc_next -= it - term->wcTo[it].index; if (term->wcTo[it].origwc != term->wcTo[it].wc) term->ltemp[it].chr = term->wcTo[it].wc; } term_bidi_cache_store(term, scr_y, ldata->chars, term->ltemp, term->wcTo, ldata->size); lchars = term->ltemp; } else { lchars = term->post_bidi_cache[scr_y].chars; } } else { lchars = NULL; } return lchars: * - for bidi * - in the case where it's resting on the right-hand half * of a CJK wide character. xterm's behaviour here, * which seems adequate to me, is to display the cursor * covering the _whole_ character, exactly as if it were * one space to the left. */ termline *ldata = lineptr(term->curs.y); termchar *lchars; our_curs_x = term->curs.x; if ( (lchars = term_bidi_line(term, ldata, our_curs_y)) != NULL) { our_curs_x = term->post_bidi_cache[our_curs_y].forward[our_curs_x]; } else lchars = ldata->chars; if (our_curs_x > 0 && lchars[our_curs_x].chr == UCSWIDE) our_curs_x--; int *backwardlchars = term_bidi_line(term, ldata, i); if (lchars) { backward = term->post_bidi_cache[i].backward; } else { lchars = ldata->chars; backward = NULL; }backward ? backward[j] :ldata = lineptr(selpoint.y); if ((ldata->lattr & LATTR_MODE) != LATTR_NORM) x /= 2; /* * Transform x through the bidi algorithm to find the _logical_ * click point from the physical one. */ if (term_bidi_line(term, ldata, y) != NULL) { x = term->post_bidi_cache[y].backward[x]; } selpoint.x = x Node-path: putty/terminal.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0a169957c01b830992ec1daefe31e041 Text-delta-base-sha1: 737ff835fa11381086192509d79f6963996052f0 Text-content-length: 98 Text-content-md5: 93d5395981178b523d7fc4e05687b977 Text-content-sha1: 882e3aceb3a622f6239d41a0b72bd0ba6dbd6927 Content-length: 98 SVNzG L+LP* int *forward, *backward; /* the permutations of line positions */ Revision-number: 4916 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2004-11-28T09:32:17.195931Z K 7 svn:log V 35 Stability fixes (thanks valgrind). K 10 svn:author V 5 simon PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 074830d59108fa889c7e640dc3bb818c Text-delta-base-sha1: 5715cf150e9a2296dc597e5ae21b7dd6c747ca78 Text-content-length: 145 Text-content-md5: 9870934a5a17e65384a96ff5c28b9bb7 Text-content-sha1: 58c508e15c8afaabef972c3294d6a11c1395f7dc Content-length: 145 SVN:yhPGaA}=$ * $Author$ * $Revisionixterm_256Xterm256Colour", 1, &cfg->xterm_256 Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9c252553526368a309b436d6ce9e0b33 Text-delta-base-sha1: e7a3b42451423b2a206cd44d186ae7d0458cf92e Text-content-length: 4841 Text-content-md5: f12db5c750758126d786e2fdcd4d7458 Text-content-sha1: 3ed747bdb11dd3e11c8cfc0b4809a2682dacf7f3 Content-length: 4841 SVNCV K^Nj' LCh"u W "F * However, first I permute the bits of the attribute value, so * that the eight bits of colour (four in each of fg and bg) * which are never non-zero unless xterm 256-colour mode is in * use are placed higher up the word than everything else. This * ensures that attribute values remain 16-bit _unless_ the * user uses extended colour. */ unsigned attr, colourbits; attr = c->attr; assert(ATTR_BGSHIFT > ATTR_FGSHIFT); colourbits = (attr >> (ATTR_BGSHIFT + 4)) & 0xF; colourbits <<= 4; colourbits |= (attr >> (ATTR_FGSHIFT + 4)) & 0xF; attr = (((attr >> (ATTR_BGSHIFT + 8)) << (ATTR_BGSHIFT + 4)) | (attr & ((1 << (ATTR_BGSHIFT + 4))-1))); attr = (((attr >> (ATTR_FGSHIFT + 8)) << (ATTR_FGSHIFT + 4)) | (attr & ((1 << (ATTR_FGSHIFT + 4))-1))); attr |= (colourbits << (32-9)); if (attr < 0x8000) { add(b, (unsigned char)((attr >> 8) & 0xFF)); add(b, (unsigned char)(attr & 0xFF)); } else { add(b, (unsigned char)(((attr >> 24) & 0x7F) | 0x80)); add(b, (unsigned char)((attr >> 16) & 0xFF)); add(b, (unsigned char)((attr >> 8) & 0xFF)); add(b, (unsigned char)(unsigned val, attr, colourbits; val = get(b) << 8; val |= get(b); if (val >= 0x8000) { val &= ~0x8000; val <<= 16; val |= get(b) << 8; val |= get(b); } colourbits = (val >> (32-9)) & 0xFF; attr = (val & ((1<<(32-9))-1)); attr = (((attr >> (ATTR_FGSHIFT + 4)) << (ATTR_FGSHIFT + 8)) | (attr & ((1 << (ATTR_FGSHIFT + 4))-1))); attr = (((attr >> (ATTR_BGSHIFT + 4)) << (ATTR_BGSHIFT + 8)) | (attr & ((1 << (ATTR_BGSHIFT + 4))-1))); attr |= (colourbits >> 4) << (ATTR_BGSHIFT + 4); attr |= (colourbits & 0xF) << (ATTR_FGSHIFT + 4); c->attr = attrstatic void term_schedule_update(Terminal *term) {term_schedule_update(term);88 case 38: /* xterm 256-colour mode */ if (i+2 < term->esc_nargs && term->esc_args[i+1] == 5) { term->curr_attr &= ~ATTR_FGMASK; term->curr_attr |= ((term->esc_args[i+2] & 0xFF) << ATTR_FGSHIFT); i += 2; } break; case 48: /* xterm 256-colour mode */ if (i+2 < term->esc_nargs && term->esc_args[i+1] == 5) { term->curr_attr &= ~ATTR_BGMASK; term->curr_attr |= ((term->esc_args[i+2] & 0xFF) << ATTR_BGSHIFT); i += 2; }L-=yv^"! ?}6]zI8Heg 24)); deselect(term); } else if (term->esc_nargs >= 1 && term->esc_args[0] >= 1 && term->esc_args[0] < 24) { compatibility(OTHER); switch (term->esc_args[0]) { int x, y, len; char buf[80], *p; case 1: set_iconic(term->frontend, FALSE); break; case 2: set_iconic(term->frontend, TRUE); break; case 3: if (term->esc_nargs >= 3) { if (!term->cfg.no_remote_resize) move_window(term->frontend, def(term->esc_args[1], 0), def(term->esc_args[2], 0)); } break; case 4: /* We should resize the window to a given * size in pixels here, but currently our * resizing code isn't healthy enough to * manage it. */ break; case 5: /* move to top */ set_zorder(term->frontend, TRUE); break; case 6: /* move to bottom */ set_zorder(term->frontend, FALSE); break; case 7: refresh_window(term->frontend); break; case 8: if (term->esc_nargs >= 3) { if (!term->cfg.no_remote_resize) request_resize(term->frontend, def(term->esc_args[2], term->cfg.width), def(term->esc_args[1], term->cfg.height)); } break; case 9: if (term->esc_nargs >= 2) set_zoomed(term->frontend, term->esc_args[1] ? TRUE : FALSE); break; case 11: if (term->ldisc) ldisc_send(term->ldisc, is_iconic(term->frontend) ? "\033[1t" : "\033[2t", 4, 0); break; case 13: if (term->ldisc) { get_window_pos(term->frontend, &x, &y); len = sprintf(buf, "\033[3;%d;%dt", x, y); ldisc_send(term->ldisc, buf, len, 0); } break; case 14: if (term->lditerm->esc_args[0] & 0x8term->esc_args[0] & 0x8F) << ATTR_FGSHIFT;F) << ATTR_BGSHIFT;if (!term->cfg.xterm_256_colour) { int colour; colour = (tattr & ATTR_FGMASK) >> ATTR_FGSHIFT; if (colour >= 16 && colour < 256) tattr = (tattr &~ ATTR_FGMASK) | ATTR_DEFFG; colour = (tattr & ATTR_BGMASK) >> ATTR_BGSHIFT; if (colour >= 16 && colour < 256) tattr = (tattr &~ ATTR_BGMASK) | ATTR_DEFBG; } term_schedule_update(term)term_schedule_update(term); Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06cd01afde47f167bffb066e2251723a Text-delta-base-sha1: dedf27cb61876ca87cdd6c1dd3bddace31279006 Text-content-length: 2710 Text-content-md5: 43c8c8a8d922439130d155c03979be24 Text-content-sha1: 4b27432527f5d97efe3ec607247ce89ef07f1a48 Content-length: 2710 SVNk+um2$Vvnj'z+t|-nh9~* 'T/;rh/* Colours come in two flavours: configurable, and xterm-extended. */ #define NCFGCOLOURS (lenof(((Config *)0)->colours)) #define NEXTCOLOURS 240 /* 216 colour-cube plus 24 shades of grey */ #define NALLCOLOURS (NCFGCOLOURS + NEXTCOLOURSALLif (n >= 16) n += 256 - 16; if (n > NALLCOLOURS) return; real_palette_set(inst, n, r, g, b); if (n == 25256, 257, 258, 259, 260, 261, 0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 }; gboolean success[NALLCOLOURS]; int i; assert(lenof(ww) == NCFGALLCOLOURS); } for (i = 0; i < NCFGCOLOURS; i++) { inst->cols[ww[i]].red = inst->cfg.colours[i][0] * 0x0101; inst->cols[ww[i]].green = inst->cfg.colours[i][1] * 0x0101; inst->cols[ww[i]].blue = inst->cfg.colours[i][2] * 0x0101; } for (i = 0; i < NEXTCOLOURS; i++) { if (i < 216) { int r = i / 36, g = (i / 6) % 6, b = i % 6; inst->cols[i+16].red = r * 0x3333; inst->cols[i+16].green = g * 0x3333; inst->cols[i+16].blue = b * 0x3333; } else { int shade = i - 216; shade = (shade + 1) * 0xFFFF / (NEXTCOLOURS - 216 + 1); inst->cols[i+16].red = inst->cols[i+16].green = inst->cols[i+16].blue = shade; } } gdk_colormap_alloc_colors(inst->colmap, inst->cols, NALLCOLOURS, FALSE, FALSE, success); for (i = 0; i < NALLbg = ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT { if (nfg < 16) nfg |= 8; else if (nfg >= 256) nfg |= 1; } if (inst->cfg.bold_colour && (attr & ATTR_BLINK)) { if (nbg < 16) nbg |= 8; else if (nbg >= 256) nbg |= 1; } if (attr & TATTR_ACTCURS) { nfg = 260; nbg = 2626FG 256, 257, 258, 259, 260, 261, 0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 1assert(lenof(ww) == NCFGCOLOURS)FGCOLOURS; i++) { if (oldcfg.colours[i][0] != cfg2.colours[i][0] || oldcfg.colours[i][1] != cfg2.colours[i][1] || oldcfg.colours[i][2] != cfg2.colours[i][2]) { real_palette_set(inst, ww[i], cfg2.colours[i][0], cfg2.colours[i][1], cfg2.colours[i25eaa inst->textcursor = make_mouse_ptr(inst, GDK_XTERM); inst->rawcursor = make_mouse_ptr(inst, GDK_LEFT_PTR); inst->blankcursor = make_mouse_ptr(inst, -1); make_mouse_ptr(inst, -2); /* clean up cursor font */ inst->currcursor = inst->textcursor; show_mouseptr(inst, 1); inst->eventlogstuff = eventlogstuff_new(); inst->term = term_init(&inst->cfg, &inst->ucsdata, inst); inst->logctx = log_init(inst, &inst->cfg); term_provide_logctx(in Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2100b875e03db9b13ca005473a4b396f Text-delta-base-sha1: ac1ddc4b30ae2c7fab2c358f002baf02c28d9458 Text-content-length: 2496 Text-content-md5: d5bb7bfe4ae26174e441ec87617e5e67 Text-content-sha1: 88e629dd41806f9b6ed0c14cc4d31912f0d53e32 Content-length: 2496 SVNX?dH'[".BZZ41G1I@u<xFGCOLOURS 24 #define NEXTCOLOURS 240 #define NALLCOLOURS (NCFGCOLOURS + NEXTCOLOURS) static COLORREF colours[NALLCOLOURS]; static HPALETTE pal; static LPLOGPALETTE logpal; static RGBTRIPLE defpal[NALL256, 257, 258, 259, 260, 261, 0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 }; for (i = 0; i < 22; i++) { int w = ww[i]; defpal[w].rgbtRed = cfg.colours[i][0]; defpal[w].rgbtGreen = cfg.colours[i][1]; defpal[w].rgbtBlue = cfg.colours[i][2]; } for (i = 0; i < NEXTCOLOURS; i++) { if (i < 216) { int r = i / 36, g = (i / 6) % 6, b = i % 6; defpal[i+16].rgbtRed = r * 0x33; defpal[i+16].rgbtGreen = g * 0x33; defpal[i+16].rgbtBlue = b * 0x33; } else { int shade = i - 216; shade = (shade + 1) * 0xFF / (NEXTCOLOURS - 216 + 1); defpal[i+16].rgbtRed = defpal[i+16].rgbtGreen = defpal[i+16].rgbtBlue = shade; }256, 257 }, /* Default Foreground */ { COLOR_WINDOW, 258, 259 }, /* Default Background */ { COLOR_HIGHLIGHTTEXT, 260, 260 }, /* Cursor Text */ { COLOR_HIGHLIGHT, 261, 261ALLCOLOURS * sizeof(PALETTEENTRY)); logpal->palVersion = 0x300; logpal->palNumEntries = NALLCOLOURS; for (i = 0; i < NALLALLALL~(ATTR_REVERSE|ATTR_BLINK|ATTR_COLOURS); if (bold_mode == BOLD_COLOURS) attr &= ~ATTR_BOLD; /* cursor fg and bg */ attr |= (260 << ATTR_FGSHIFT) | (261 << ATTR_BGSHIFT)bg = ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT { if (nfg < 16) nfg |= 8; else if (nfg >= 256) nfg |= 1; } if (bold_mode == BOLD_COLOURS && (attr & ATTR_BLINK)) { if (nbg < 16) nbg |= 8; else if (nbg >= 256) nbg |= 1; }61LY om U4zy?8 if (code > 21) offt++; if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", code + 'P' - 11 - offt); else p += sprintf((char *) p, "\x1BO%c", code + 'P' - 11 - offt); return p - output; } if (cfg.funky_type == FUNKY_LINUX && code >= 11 && code <= 15) { p += sprintf((char *) p, "\x1B[[%c", code + 'A' - 11); return p - output; } if (cfg.funky_type == FUNKY_XTERM && code >= 11 && code <= 14) { if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", code + 'P' - 11); else p += sprintf((char *) p, "\x1BO%c", code + 'P' - 11); return p - output; } if (cfgALLif (n >= 16) n += 256 - 16; if (n > NALLCOLOURS) return; real_palette_set(n/* And this */ for (i = 0; i < NALLALL Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1f013c4b5b15bdfc8730194efa2aa1bb Text-delta-base-sha1: 52b08a967eda38fe14adf0c2811df4e1dc905cfc Text-content-length: 47 Text-content-md5: 4b6f714451003b4f795cbc25fdb48b54 Text-content-sha1: a98b6825c723bc1d44740e6bbb383bcce2a719a7 Content-length: 47 SVNe 1Rxterm256 "colours.xterm256 Node-path: putty-wishlist/data/256-colours Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6c019102efa6e661aaeab90138fd4be4 Text-delta-base-sha1: 97074369e78be078f416cc13dc4b73655d96f87f Text-content-length: 152 Text-content-md5: 7e26299571a4223aeddd431634449209 Text-content-sha1: 45c6b8bbe73b901d51f71f79bc2a503e6c5fa0c4 Content-length: 152 SVNHK L}KnFixed-in: 2004-11-29

    SGT, 2004-11-28: this is now done, and I don't think I've broken anything else en route. Revision-number: 4918 Prop-content-length: 192 Content-length: 192 K 8 svn:date V 27 2004-11-28T15:18:23.535497Z K 7 svn:log V 92 Bah, there's always one thing I miss. Correct the background-colour handling in Unix PuTTY. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 43c8c8a8d922439130d155c03979be24 Text-delta-base-sha1: 4b27432527f5d97efe3ec607247ce89ef07f1a48 Text-content-length: 52 Text-content-md5: 2cdacfb4094e67c72940f18ba8a91c79 Text-content-sha1: 15cfcbcbcadb9269e451540c84c317d113a8d23f Content-length: 52 SVN7p8U)2525ege Revision-number: 4919 Prop-content-length: 114 Content-length: 114 K 7 svn:log V 14 missing K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-29T08:18:27.089277Z PROPS-END Node-path: putty-wishlist/data/ext-data-at-start Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 979ab89b8f202fd988b69ecb937949fc Text-delta-base-sha1: 8e0694191144daa500e6f5cd5e5686379801e987 Text-content-length: 25 Text-content-md5: 348dca370d00870aaf9e30ffcf99a2e8 Text-content-sha1: f01d70ae3f94abf3cb3644c250df1bca23daa54e Content-length: 25 SVN;@ wDw Revision-number: 4920 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2004-11-29T08:20:26.878443Z K 7 svn:log V 22 Another missing K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-at-start Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 74bd53f91f12a6f390b786a0efc7df0f Text-delta-base-sha1: ddf003df176388b8f7088a735b07d87f26ac9b67 Text-content-length: 25 Text-content-md5: ffb937714114ec48cbbd9490e50b4baa Text-content-sha1: 92a1e13d8150c021584bacdeaeb52e62c2e6fd76 Content-length: 25 SVN  HDH Revision-number: 4921 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2004-11-29T08:52:33.580014Z K 7 svn:log V 31 putty.bsdguru.dk is sane again K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: daf570129510b7578471ef682f2679b0 Text-delta-base-sha1: 0abb695cce70fbe2c657def4051520f9f0ff7757 Text-content-length: 51 Text-content-md5: ff907cefecd7368e33eb8985c835d49f Text-content-sha1: d01e1f28039e781362f163f6040537f57fe14be0 Content-length: 51 SVN _S{>_bsdguru.dk/">putty.bsdguru Revision-number: 4922 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2004-11-29T09:23:11.320626Z K 7 svn:log V 113 Briefly document the "CP866" manual-entry feature on Windows in the dialog itself (since we have a bit of room). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2385e6563f841f21716f20b84c026451 Text-delta-base-sha1: 0c8831637beb5f68f15d6f38a8cc1f64658778ea Text-content-length: 429 Text-content-md5: b242fdced0dc57b044226fdd7c9fc751 Text-content-sha1: 00deb03e82ae92fe52a4cff795bb003c751f3989 Content-length: 429 SVN,T (On Windows we can use but not enumerate translation tables * from the operating system. Briefly document this. */ s = ctrl_getset(b, "Window/Translation", "trans", "Character set translation on received data"); ctrl_text(s, "(Codepages supported by Windows but not listed here, " "such as CP866 on many systems, can be entered manually)", HELPCTX(translation_codepage Revision-number: 4923 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2004-11-29T09:27:13.290715Z K 7 svn:log V 16 typo in comment K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a605d3225bacd68110d282bd479e21e7 Text-delta-base-sha1: fc8b3adcd17ab57358c70c298d19fe0115537807 Text-content-length: 59 Text-content-md5: d14d1aa6f3ac3d37358f30d464f2e056 Text-content-sha1: 560c415c07f32fa6d03b579f8c17f0c31e0e0ed9 Content-length: 59 SVN &Y'pJII Revision-number: 4924 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2004-11-29T09:40:59.076026Z K 7 svn:log V 63 rm '$Source$' from comments as not meaningful under Subversion K 10 svn:author V 5 jacob PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9870934a5a17e65384a96ff5c28b9bb7 Text-delta-base-sha1: 58c508e15c8afaabef972c3294d6a11c1395f7dc Text-content-length: 23 Text-content-md5: dd35b9986d745dc232502e7f244ceec3 Text-content-sha1: 57b297b7ee4e16276d9cae44ef1c148030a870f3 Content-length: 23 SVNy; 7u Node-path: putty/minibidi.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d5c3ca595868eda65612ea3e8e965f1c Text-delta-base-sha1: a6e19661aadcabe652483f4d7238e891d52cbdb5 Text-content-length: 112 Text-content-md5: 2dbedfcffb751678dff648f308bb51c6 Text-content-sha1: 2cbc3904414e2b29293e1212727e2b401f157ffa Content-length: 112 SVN=*OPGOA:$ * $Author$ * $Revision$ * * (www.arabeyes.org - under MIT license) * Revision-number: 4925 Prop-content-length: 201 Content-length: 201 K 8 svn:date V 27 2004-11-29T11:31:21.102339Z K 7 svn:log V 100 Some blurb about terminal types and 256-colour xterms. Thanks to Dan Nicolaescu for the suggestion. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f1476c36367b030fe912dc3570c9519 Text-delta-base-sha1: 7213af666f6628960289e37ec4e547aea09b10ef Text-content-length: 1242 Text-content-md5: cd8a4b37e77482629b2c2bc8e874c7d4 Text-content-sha1: bf90fe3a39cce5cc7e502d3086d4b379f3718265 Content-length: 1242 SVNT1T{-If you have an application which is supposed to use 256-colour mode and it isn't working, you may find you need to tell your server that your terminal supports 256 colours. On Unix, you do this by ensuring that the setting of \cw{TERM} describes a 256-colour-capable terminal. You can check this using a command such as \c{infocmp}: \c $ infocmp | grep colors \c colors#256, cols#80, it#8, lines#24, pairs#256, \e bbbbbbbbbb If you do not see \cq{colors#256} in the output, you may need to change your terminal setting. On modern Linux machines, you could try \cq{xterm-256colorb:XXbhe contents of a file into the Registry, then runs PuTTY, exports the contents of the Registry back into the file, and deletes the Registry entries. This can all be done using the Regedit command line options, so it's all automatic. Here is what you need in \c{PUTTY.BAT}: \c @ECHO OFF \c regedit /s putty.reg \c regedit /s puttyrnd.reg \c start /w putty.exe \c regedit /ea new.reg HKEY_CURRENT_USER\Software\SimonTatham\PuTTY \c copy new.reg putty.reg \c del new.reg \c regedit /s puttydel.reg This batch file needs two auxiliary files: \c{PUTTYRND.REG} which sets up an initial safe location for Revision-number: 4926 Prop-content-length: 123 Content-length: 123 K 10 svn:author V 4 owen K 8 svn:date V 27 2004-11-29T16:58:02.164262Z K 7 svn:log V 24 Nitpick, close bracket. PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d5bb7bfe4ae26174e441ec87617e5e67 Text-delta-base-sha1: 88e629dd41806f9b6ed0c14cc4d31912f0d53e32 Text-content-length: 45 Text-content-md5: 667f197534dda80192df163cf6883af6 Text-content-sha1: c58b8776b968bed5bc7730a203ef422637f19607 Content-length: 45 SVN %Z%)YZY Revision-number: 4927 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:46.007863Z PROPS-END Revision-number: 4928 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:46.017202Z PROPS-END Revision-number: 4929 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:46.026867Z PROPS-END Revision-number: 4930 Prop-content-length: 172 Content-length: 172 K 7 svn:log V 72 Summary: Be cleverer with SSH-2 flow control to improve bulk throughput K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-29T23:39:44.476150Z PROPS-END Node-path: putty-wishlist/data/flow-control Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1433 Text-content-md5: 7fe50589e7400a016f1178161f1b05c9 Text-content-sha1: 7cb5cc5baaf8f2a5f5e83642c8d32fd1261dbf4f Content-length: 1443 PROPS-END SVN  Summary: Be cleverer with SSH-2 flow control to improve bulk throughput Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body

    (This wish applies to SSH-2; SSH-1 doesn't provide flow control above TCP's.)

    Currently PuTTY's SSH-2 implementation uses a fixed SSH-2 channel window size of 16k for each channel. Perhaps we should do something cleverer to improve throughput on high-bandwidth or high-latency connections.

    Things are simple if only a single channel is in use, but might become more complicated to tune if multiple channels were to be used (e.g., port-forwarding of bulk transfers, or some of the wilder excesses of SSH-2 generality). However, the common case is likely to be an SFTP or SCP transfer as the only channel of an SSH-2 session.

    The Pittsburgh Supercomputing Center suggest that basing the SSH window size on the TCP window size from the underlying OS can help in some circumstances.

    If this is done, some higher-level protocols could probably benefit from similar adaptation -- notably SFTP, which since it was sped up has also used a 16k "window size" of its own for bulk transfers. We've had improvement reported from tweaking this and the SSH-2 channel window size on a 100Mbit network (ref 41A6366F.9030909@enriva.com). Revision-number: 4931 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2004-11-30T01:07:29.301769Z K 7 svn:log V 51 Another default-background fix for 256-colour mode K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2cdacfb4094e67c72940f18ba8a91c79 Text-delta-base-sha1: 15cfcbcbcadb9269e451540c84c317d113a8d23f Text-content-length: 47 Text-content-md5: f19f9a12e79ac7c250a3b9d2e9082c0d Text-content-sha1: cc754b8c173edf882095cb29e9089b3262917d35 Content-length: 47 SVN rw258]); gig } Revision-number: 4932 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:46.183914Z PROPS-END Revision-number: 4933 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 Fix ViewCVS link; Depends: remove-statics K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-30T12:18:12.947429Z PROPS-END Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 830cc157c0c80d948cbd7c2120e9d53c Text-delta-base-sha1: 76c97bcbb5cf0094e5a07a9a0550ae85eb9d89a0 Text-content-length: 118 Text-content-md5: 0515e0876194ecabe4f854399eb7c268 Text-content-sha1: 4427fd60797c20c0f6dd11efd4a10e72cefcb786 Content-length: 118 SVN9J]LVKFKnDepends: remove-staticswww.tartarus.org/~simon-anonsvn/viewcvs.cgi/putty/mac/README.mac?view= Revision-number: 4934 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 Simon has fixed this. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-11-30T12:21:30.191365Z PROPS-END Node-path: putty-wishlist/data/disable-colour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 40d207bb3e6108eedd9671cce4d86e15 Text-delta-base-sha1: 0ee01876861f14efe320d82ebe0c5dc37f0c6fd7 Text-content-length: 39 Text-content-md5: d82f8d703ed4a98c2a69edfb7f945900 Text-content-sha1: 7bac1924e6de3cbe24dddffc3fcb6a67de5c3ea0 Content-length: 39 SVN-j/iFixed-in: 2004-11-10 Revision-number: 4935 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2004-11-30T12:29:04.945262Z K 7 svn:log V 37 Thoughts on Config structure revamp. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/config-struct Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1622 Text-content-md5: 09d7e0626656fe838f315b2f080c6413 Text-content-sha1: f35bd7bfb18862e49c90db41062c9cea77f2e275 Content-length: 1632 PROPS-END SVNHHHSummary: Remove fixed-length buffers in configuration structure Class: wish Difficulty: tricky Priority: medium Depends: config-locations Content-type: text/x-html-body

    Currently PuTTY uses a single struct (Config) containing a bunch of fixed-length buffers to store its configuration. This leads to problems such as limited space for port forwardings. It should clearly be replaced with a structure containing references to allocated storage.

    This isn't entirely trivial, which is probably the main reason we haven't done it yet:

    • Object housekeeping. Currently, when a Config needs to be duplicated intra-process, a structure copy is usually by and large adequate, with occasional grotty fixing-up of pointers. Similar issues apply to construction and destruction. We'd need to replace this with proper suite of object housekeeping functions.
    • Serialisation. Currently `Duplicate Session' is implemented by squirting the struct over to another process and crossing our fingers. This is obviously icky, and clearly won't be sufficient when there are more pointers around.
      Any textual format we invent to store configuration in a file would probably be suitable for this too; so this should probably wait until we've done that (which we already have to some extent for the Unix port).
    • Opaque objects. Some platforms may use opaque objects to represent things like filenames. These need to be copyable, serialisable etc.
    Node-path: putty-wishlist/data/portfwd-space Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c50b4bd13cce67200b5080d7c831ef0d Text-delta-base-sha1: 2b29127132550079ee0578991dc5cd1ce5137888 Text-content-length: 41 Text-content-md5: 4dc07c4900a1bfb8f4900a7c77b85e1e Text-content-sha1: cdfcd6aadcef79b54325d377a91621b6efa0b115 Content-length: 41 SVNkp|oDepends: config-struct Revision-number: 4936 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 60 Fix large memory leak introduced in the r4915 bidi changes. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-11-30T13:39:58.326831Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f12db5c750758126d786e2fdcd4d7458 Text-delta-base-sha1: 3ed747bdb11dd3e11c8cfc0b4809a2682dacf7f3 Text-content-length: 305 Text-content-md5: 6f0f56607e1c127ec1679da6a4d2e3fc Text-content-sha1: fc76714afe89ff4ecc7503ca1a4daf7c51cc1e62 Content-length: 305 SVN-4}q^0}term->pre_bidi_cache[j].forward = term->post_bidi_cache[j].forward = NULL; term->pre_bidi_cache[j].backward = term->post_bidi_cache[j].backward = NULL sfree(term->post_bidi_cache[line].forward); sfree(term->post_bidi_cache[line].backward Revision-number: 4937 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:46.594052Z PROPS-END Revision-number: 4938 Prop-content-length: 339 Content-length: 339 K 8 svn:date V 27 2004-12-01T09:25:20.084422Z K 7 svn:log V 238 term_bidi_cache_store() now has a need to distinguish between the _width_ of a terminal line (number of character cell positions) and its _size_ (number of termchars), since of course these differ in the presence of combining characters. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f0f56607e1c127ec1679da6a4d2e3fc Text-delta-base-sha1: fc76714afe89ff4ecc7503ca1a4daf7c51cc1e62 Text-content-length: 207 Text-content-md5: ecb2d40037c6e1eab465fc2ff2c9d99a Text-content-sha1: 5fc9798045e8abcc0d516b662c31be3521419012 Content-length: 207 SVN4h)OOjh?WIPa0, int sizesizesizesize * TSIZE); memcpy(term->post_bidi_cache[line].chars, lafter, size term->cols Revision-number: 4939 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2004-12-01T13:37:31.435988Z K 7 svn:log V 114 Kimmo Parviainen points out that SSH software version strings have restrictions on the use of hyphens and spaces. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d14d1aa6f3ac3d37358f30d464f2e056 Text-delta-base-sha1: 560c415c07f32fa6d03b579f8c17f0c31e0e0ed9 Text-content-length: 4011 Text-content-md5: 989d1f4170a973081bf1fb85659b2907 Text-content-sha1: c075d3980733d72850e41324a0230a53e18f4d50 Content-length: 4011 SVN4HET=o0/* * The `software version' part of an SSH version string is required * to contain no spaces or minus signs. */ static void ssh_fix_verstring(char *str) { /* Eat "SSH--". */ assert(*str == 'S'); str++; assert(*str == 'S'); str++; assert(*str == 'H'); str++; assert(*str == '-'); str++; while (*str && *str != '-') str++; assert(*str == '-'); str++; /* Convert minus signs and spaces in the remaining string into * underscores. */ while (*str) { if (*str == '-' || *str == ' ') *str = '_'; str++{ char *verstring; if (s->proto2 && (ssh->cfg.sshprot >= 2 || !s->proto1)) { /* * Construct a v2 version string. */ verstring = dupprintf("SSH-2.0-%s\n", sshver); ssh->version = 2; } else { /* * Construct a v1 version string. */ verstring = dupprintf("SSH-%s-%s\n", (ssh_versioncmp(s->version, "1.5") <= 0 ? s->version : "1.5"), sshver); ssh->version = 1; } ssh_fix_verstring(verstring); if (ssh->version == 2) { /* * Hash our version string and their version string. */ SHA_Init(&ssh->exhashbase); sha_string(&ssh->exhashbase, verstring, strlen(verstring)-1); sha_string(&ssh->exhashbase, s->vstring, strcspn(s->vstring, "\r\n")); /* * Initialise SSHv2 protocol. */ ssh->protocol = ssh2_protocol; ssh2_protocol_setup(ssh); ssh->s_rdpkt = ssh2_rdpkt; } else { /* * Initialise SSHv1 protocol. */ ssh->protocol = ssh1_protocol; ssh1_protocol_setup(ssh); ssh->s_rdpkt = ssh1_rdpkt; } logeventf(ssh, "We claim version: %.*s", strlen(verstring)-1, verstring); sk_write(ssh->s, verstring, strlen(verstring)); sfree(verstring); } logeventf(ssh, "Using SSH protocol version %d", ssh->version); cOl"yTvW G6out_throttling = 1; ssh1_throttle(ssh, +1); } } static void ssh1_smsg_x11X-Serverlogevent("Received X11 connect request"); /* Refuse if X11 forwarding is disabled. */ if (!ssh->X11_fwd_enabled) { send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, PKT_INT, remoteid, PKT_END); logevent("Rejected X11 connect request"); } else { c = snew(struct ssh_channel); c->ssh = ssh; if (x11_init(&c->u.x11.s, ssh->cfg.x11_display, c, ssh->x11auth, NULL, -1, &ssh->cfg) != NULL) { logevent("Opening X11 forward connection failed"logevent ("Opening X11 forward connection succeeded");Iz11Ih ssh, struct Packet *pktin) { /* log reason code in disconnect message */ char *buf, *msg; int nowlen, reason, msglen; reason = ssh_pkt_getuint32(pktin); ssh_pkt_getstring(pktin, &msg, &msglen); if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) { buf = dupprintf("Received disconnect message (%s)", ssh2_disconnect_reasons[reason]); } else { buf = dupprintf("Received disconnect message (unknown" " type %d)", reason); } logevent(buf); sfree(buf); buf = dupprintf("Disconnection message text: %n%.*s", &nowlen, msglen, msg); logevent(buf); bombout(("Server sent disconnect message\ntype %d (%s):\n\"%s\"", reason, (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) ? ssh2_disconnect_reasons[reason] : "unknown", buf+nowlen)); sfree(buf); } void ssh2_msg_debug(Ssh ssh, struct Packet *pktin) { /* log the debug message */ char *buf, *msg; int msglen; int always_display; /* XXX maybe we should actually take notice of this */ always_disp Revision-number: 4940 Prop-content-length: 207 Content-length: 207 K 7 svn:log V 106 And now I look at it, the latest draft also says version strings should be followed by \r\n, not just \n. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-01T13:42:50.871022Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 989d1f4170a973081bf1fb85659b2907 Text-delta-base-sha1: c075d3980733d72850e41324a0230a53e18f4d50 Text-content-length: 367 Text-content-md5: e4071f69c768e79fc0474c5aae45eaba Text-content-sha1: fb91c8d60fb1bce091221059e7eea2edf1313660 Content-length: 367 SVN$:79`o-rr strcspn(verstring, "\r\n")); sha_string(&ssh->exhashbase, s->vstring, cspn(verstring, "\r\n")@@@stdout_throttling && bufsize > SSH1_BUFFER_LIMIT) { ssh->v1_stdz:@@zthat might arrive at any moment. */ void ssh2_msg_disconnect(Ss Revision-number: 4941 Prop-content-length: 273 Content-length: 273 K 8 svn:date V 27 2004-12-01T15:34:12.169100Z K 7 svn:log V 172 Bah. Ben points out that SSH_1_ version strings should still end in \n, and also that `\r' and `\n' don't mean what I think they mean on all compilers (Mac reverses them). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e4071f69c768e79fc0474c5aae45eaba Text-delta-base-sha1: fb91c8d60fb1bce091221059e7eea2edf1313660 Text-content-length: 271 Text-content-md5: 28dced75b8efefdbd472c7c42e962b1b Text-content-sha1: 7b91ff1d997f83f4b1a1cfc23c232057814861e9 Content-length: 271 SVN* %5= uu{mk015\012015\012012015\012")); sha_string(&ssh->exhashbase, s->vstring, strcspn(s->vstring, "\015\012015\012l); if (!ssh->v1_:N:s for SSH2 messages Revision-number: 4942 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:47.221558Z PROPS-END Revision-number: 4943 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:47.230775Z PROPS-END Revision-number: 4944 Prop-content-length: 187 Content-length: 187 K 7 svn:log V 87 mirror.nucleardog.com putty.fluoline.net putty.4thecrew.net reinstate www.putty.net.pl K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-12-02T12:13:37.167160Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff907cefecd7368e33eb8985c835d49f Text-delta-base-sha1: d01e1f28039e781362f163f6040537f57fe14be0 Text-content-length: 255 Text-content-md5: 2f6c4686185c7b9ee674b1084c0ead6c Text-content-sha1: 731e48234096b6b1f54fbd0f7c178cd20de5ce6e Content-length: 255 SVN V.DAH X=[:_Z3Mw} mirror.nucleardog.com/putty/">mirror.nucleardog.com in Canadafluoline.net">putty.fluoline.nettelexs.nl/">putty.telexsutty.net.pl/">putty.net.pl in Polandputty.4thecrew.net/">putty.4thecrew Revision-number: 4945 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2004-12-02T13:07:32.351763Z K 7 svn:log V 123 Mention our assumptions about the execution character set. Not very well-written, since my brain is largely absent today. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/udp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 879ccb1e5ecaa47f81befc2bec7ee5e1 Text-delta-base-sha1: 30907c06e630b0722c719a6978c90a67ed41ddfc Text-content-length: 241 Text-content-md5: 187ea79cff02a35c67988e8b04a1c439 Text-content-sha1: 77aab8c8989991ddc3009cf237f8ba744ad79e10 Content-length: 241 SVN1 VDVnC Similarly, we assume that the execution character encoding is a superset of the printable characters of ASCII, though we don't assume the numeric values of control characters, particularly \cw{'\n'} and \cw{'\r'} Revision-number: 4946 Prop-content-length: 460 Content-length: 460 K 8 svn:date V 27 2004-12-02T13:37:28.185925Z K 7 svn:log V 359 NULL a couple of members after freeing them in ssh_free(). In particular, should stop ssh_do_close() accessing freed ssh->channels when invoked later from ssh_free(). Spotted by Fred Sauer. (Perhaps this is the cause of the crashes people have been reporting on abnormal closures such as `Software caused connection abort'? I've not been able to test this.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 28dced75b8efefdbd472c7c42e962b1b Text-delta-base-sha1: 7b91ff1d997f83f4b1a1cfc23c232057814861e9 Text-content-length: 104 Text-content-md5: 3783b8c9c992b572ebbd810d9bfb6c5c Text-content-sha1: c450a901daba8a1c2856dadfb6b701c022cd42fe Content-length: 104 SVNN}+~|N ssh->channels = NULL ssh->rportfwds = NULL Revision-number: 4947 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2004-12-02T13:48:32.978840Z K 7 svn:log V 46 \n and \r need double backslashes in Halibut. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/udp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 187ea79cff02a35c67988e8b04a1c439 Text-delta-base-sha1: 77aab8c8989991ddc3009cf237f8ba744ad79e10 Text-content-length: 188 Text-content-md5: ace97dccf9422c17785764e53779b8a3 Text-content-sha1: 4a5d6da14d64c83907a7522dda69105c52ade0ba Content-length: 188 SVN !w!r encoding is a superset of the printable characters of ASCII, though we don't assume the numeric values of control characters, particularly \cw{'\\n'} and \cw{'\ Revision-number: 4948 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2004-12-07T11:50:44.951895Z K 7 svn:log V 40 Fix segfault when HOME not set on Unix. K 10 svn:author V 4 owen PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e4c98483c3b7ca66d589093a18da191 Text-delta-base-sha1: be68941111bdaed0eb3adfa218e2636845fe79c0 Text-content-length: 48 Text-content-md5: 258bd15c1dc9e38b7600d1b521589683 Text-content-sha1: adfc5cf2060a7bce94db57fb0e13c83ed3fa6f69 Content-length: 48 SVNv ![if (!home) home="/" Revision-number: 4949 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:47.630320Z PROPS-END Revision-number: 4950 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:47.640189Z PROPS-END Revision-number: 4951 Prop-content-length: 191 Content-length: 191 K 7 svn:log V 91 Bidi stability work. I _think_ I've now removed all the failures of array bounds checking. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-07T18:10:09.255880Z PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd35b9986d745dc232502e7f244ceec3 Text-delta-base-sha1: 57b297b7ee4e16276d9cae44ef1c148030a870f3 Text-content-length: 1691 Text-content-md5: 82f149fd470527990f6f9bf96ed12cdb Text-content-sha1: 76aec1dd70edd0d39833590d6f692d62072ced2e Content-length: 1691 SVN;i[20 .EDDC&+icn5_D3M5U1Kk_qJ#define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) * Find the most recent run of the same value in `level', and * return the value _before_ it. Used to process U+202C POP * DIRECTIONAL FORMATTING. */ int getPreviousLevel(unsigned char* level, int from) { if (from > 0) { unsigned char current = level[--from]; while (from >= 0 && level[from] == current) from--; if (from >= 0) return level[from]; return -1; } else return -1; offset = 0; for(i=0; i 0) switch(line[i-1].wc) { case 0x622 tempShape = (i > 0 ? STYPE(line[i-1].wc) : SU tempShape = (i > 0 ? STYPE(line[i-1].wc) : SU { int prevlevel = getPreviousLevel(levels, i); if (prevlevel == -1) { currentEmbedding = paragraphLevel; currentOverride = ON; } else { currentOverride = currentEmbedding & OMASK; currentEmbedding = currentEmbedding & ~OMASK; } }1i > 0 && types[i-1] == EN) { types[i] = EN; continue; }else if(i < count-1 && types[i+1] == EN) { types[i] = EN; continue; }else if(i < count-1 && count >= 2 && count >= 2 && Node-path: putty/minibidi.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2dbedfcffb751678dff648f308bb51c6 Text-delta-base-sha1: 2cbc3904414e2b29293e1212727e2b401f157ffa Text-content-length: 14675 Text-content-md5: 6a0057ff6373bb7e2738cb4153997d33 Text-content-sha1: eed9b22d1b18435881e97ba0ecc38cc3f194261e Content-length: 14675 SVN*S3 %hZintd; unsigned char fRLENode RLE_table[] = { { BN, 9}, { S, 1}, { B, 1}, { S, 1}, { WS, 1}, { B, 1}, { BN, 14}, { B, 3}, { S, 1}, { WS, 1}, { ON, 2}, { ET, 3}, { ON, 5}, { ET, 1}, { CS, 1}, { ET, 1}, { CS, 1}, { ES, 1}, { EN, 10}, { CS, 1}, { ON, 6}, { L, 26}, { ON, 6}, { L, 26}, { ON, 4}, { BN, 6}, { B, 1}, { BN, 26}, { CS, 1}, { ON, 1}, { ET, 4}, { ON, 4}, { L, 1}, { ON, 5}, { ET, 2}, { EN, 2}, { ON, 1}, { L, 1}, { ON, 3}, { EN, 1}, { L, 1}, { ON, 5}, { L, 23}, { ON, 1}, { L, 31}, { ON, 1}, { L, 255}, { L, 42}, { ON, 1}, { L, 18}, { ON, 28}, { L, 94}, { ON, 2}, { L, 9}, { ON, 2}, { L, 7}, { ON, 14}, { L, 2}, { ON, 14}, { L, 5}, { ON, 9}, { L, 1}, { ON, 17}, {NSM, 80}, { ON, 16}, {NSM, 16}, { ON, 10}, { L, 1}, { ON, 11}, { L, 1}, { ON, 1}, { L, 3}, { ON, 1}, { L, 1}, { ON, 1}, { L, 20}, { ON, 1}, { L, 44}, { ON, 1}, { L, 38}, { ON, 10}, { L, 131}, {NSM, 4}, { ON, 1}, {NSM, 2}, { L, 69}, { ON, 1}, { L, 38}, { ON, 2}, { L, 2}, { ON, 6}, { L, 16}, { ON, 33}, { L, 38}, { ON, 2}, { L, 7}, { ON, 1}, { L, 39}, { ON, 1}, { L, 1}, { ON, 7}, {NSM, 17}, { ON, 1}, {NSM, 23}, { ON, 1}, {NSM, 3}, { R, 1}, {NSM, 1}, { R, 1}, {NSM, 2}, { R, 1}, {NSM, 1}, { ON, 11}, { R, 27}, { ON, 5}, { R, 5}, { ON, 23}, { CS, 1}, { ON, 14}, { AL, 1}, { ON, 3}, { AL, 1}, { ON, 1}, { AL, 26}, { ON, 5}, { AL, 11}, {NSM, 11}, { ON, 10}, { AN, 10}, { ET, 1}, { AN, 2}, { AL, 3}, {NSM, 1}, { AL, 101}, {NSM, 7}, { AL, 1}, {NSM, 7}, { AL, 2}, {NSM, 2}, { ON, 1}, {NSM, 4}, { ON, 2}, { EN, 10}, { AL, 5}, { ON, 1}, { AL, 14}, { ON, 1}, { BN, 1}, { AL, 1}, {NSM, 1}, { AL, 27}, { ON, 3}, {NSM, 27}, { ON, 53}, { AL, 38}, {NSM, 11}, { AL, 1}, { ON, 255}, { ON, 80}, {NSM, 2}, { L, 1}, { ON, 1}, { L, 53}, { ON, 2}, {NSM, 1}, { L, 4}, {NSM, 8}, { L, 4}, {NSM, 1}, { ON, 2}, { L, 1}, {NSM, 4}, { ON, 3}, { L, 10}, {NSM, 2}, { L, 13}, { ON, 16}, {NSM, 1}, { L, 2}, { ON, 1}, { L, 8}, { ON, 2}, { L, 2}, { ON, 2}, { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, { L, 1}, { ON, 3}, { L, 4}, { ON, 2}, {NSM, 1}, { ON, 1}, { L, 3}, {NSM, 4}, { ON, 2}, { L, 2}, { ON, 2}, { L, 2}, {NSM, 1}, { ON, 9}, { L, 1}, { ON, 4}, { L, 2}, { ON, 1}, { L, 3}, {NSM, 2}, { ON, 2}, { L, 12}, { ET, 2}, { L, 7}, { ON, 7}, {NSM, 1}, { ON, 2}, { L, 6}, { ON, 4}, { L, 2}, { ON, 2}, { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, { L, 2}, { ON, 1}, { L, 2}, { ON, 1}, { L, 2}, { ON, 2}, {NSM, 1}, { ON, 1}, { L, 3}, {NSM, 2}, { ON, 4}, {NSM, 2}, { ON, 2}, {NSM, 3}, { ON, 11}, { L, 4}, { ON, 1}, { L, 1}, { ON, 7}, { L, 10}, {NSM, 2}, { L, 3}, { ON, 12}, {NSM, 2}, { L, 1}, { ON, 1}, { L, 7}, { ON, 1}, { L, 1}, { ON, 1}, { L, 3}, { ON, 1}, { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, { L, 2}, { ON, 1}, { L, 5}, { ON, 2}, {NSM, 1}, { L, 4}, {NSM, 5}, { ON, 1}, {NSM, 2}, { L, 1}, { ON, 1}, { L, 2}, {NSM, 1}, { ON, 2}, { L, 1}, { ON, 15}, { L, 1}, { ON, 5}, { L, 10}, { ON, 17}, {NSM, 1}, { L, 2}, { ON, 1}, { L, 8}, { ON, 2}, { L, 2}, { ON, 2}, { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, { L, 2}, { ON, 2}, { L, 4}, { ON, 2}, {NSM, 1}, { L, 2}, {NSM, 1}, { L, 1}, {NSM, 3}, { ON, 3}, { L, 2}, { ON, 2}, { L, 2}, {NSM, 1}, { ON, 8}, {NSM, 1}, { L, 1}, { ON, 4}, { L, 2}, { ON, 1}, { L, 3}, { ON, 4}, { L, 11}, { ON, 17}, {NSM, 1}, { L, 1}, { ON, 1}, { L, 6}, { ON, 3}, { L, 3}, { ON, 1}, { L, 4}, { ON, 3}, { L, 2}, { ON, 1}, { L, 1}, { ON, 1}, { L, 2}, { ON, 3}, { L, 2}, { ON, 3}, { L, 3}, { ON, 3}, { L, 8}, { ON, 1}, { L, 3}, { ON, 4}, { L, 2}, {NSM, 1}, { L, 2}, { ON, 3}, { L, 3}, { ON, 1}, { L, 3}, {NSM, 1}, { ON, 9}, { L, 1}, { ON, 15}, { L, 12}, { ON, 14}, { L, 3}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, { ON, 1}, { L, 23}, { ON, 1}, { L, 10}, { ON, 1}, { L, 5}, { ON, 4}, {NSM, 3}, { L, 4}, { ON, 1}, {NSM, 3}, { ON, 1}, {NSM, 4}, { ON, 7}, {NSM, 2}, { ON, 9}, { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, { L, 2}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, { ON, 1}, { L, 23}, { ON, 1}, { L, 10}, { ON, 1}, { L, 5}, { ON, 4}, { L, 1}, {NSM, 1}, { L, 5}, { ON, 1}, {NSM, 1}, { L, 2}, { ON, 1}, { L, 2}, {NSM, 2}, { ON, 7}, { L, 2}, { ON, 7}, { L, 1}, { ON, 1}, { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, { L, 2}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, { ON, 1}, { L, 23}, { ON, 1}, { L, 16}, { ON, 4}, { L, 3}, {NSM, 3}, { ON, 2}, { L, 3}, { ON, 1}, { L, 3}, {NSM, 1}, { ON, 9}, { L, 1}, { ON, 8}, { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, { L, 2}, { ON, 1}, { L, 18}, { ON, 3}, { L, 24}, { ON, 1}, { L, 9}, { ON, 1}, { L, 1}, { ON, 2}, { L, 7}, { ON, 3}, {NSM, 1}, { ON, 4}, { L, 3}, {NSM, 3}, { ON, 1}, {NSM, 1}, { ON, 1}, { L, 8}, { ON, 18}, { L, 3}, { ON, 12}, { L, 48}, {NSM, 1}, { L, 2}, {NSM, 7}, { ON, 4}, { ET, 1}, { L, 7}, {NSM, 8}, { L, 13}, { ON, 37}, { L, 2}, { ON, 1}, { L, 1}, { ON, 2}, { L, 2}, { ON, 1}, { L, 1}, { ON, 2}, { L, 1}, { ON, 6}, { L, 4}, { ON, 1}, { L, 7}, { ON, 1}, { L, 3}, { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, { ON, 2}, { L, 2}, { ON, 1}, { L, 4}, {NSM, 1}, { L, 2}, {NSM, 6}, { ON, 1}, {NSM, 2}, { L, 1}, { ON, 2}, { L, 5}, { ON, 1}, { L, 1}, { ON, 1}, {NSM, 6}, { ON, 2}, { L, 10}, { ON, 2}, { L, 2}, { ON, 34}, { L, 24}, {NSM, 2}, { L, 27}, {NSM, 1}, { L, 1}, {NSM, 1}, { L, 1}, {NSM, 1}, { ON, 4}, { L, 10}, { ON, 1}, { L, 34}, { ON, 6}, {NSM, 14}, { L, 1}, {NSM, 5}, { L, 1}, {NSM, 2}, { L, 4}, { ON, 4}, {NSM, 8}, { ON, 1}, {NSM, 36}, { ON, 1}, { L, 8}, {NSM, 1}, { L, 6}, { ON, 2}, { L, 1}, { ON, 48}, { L, 34}, { ON, 1}, { L, 5}, { ON, 1}, { L, 2}, { ON, 1}, { L, 1}, {NSM, 4}, { L, 1}, {NSM, 1}, { ON, 3}, {NSM, 2}, { L, 1}, {NSM, 1}, { ON, 6}, { L, 24}, {NSM, 2}, { ON, 70}, { L, 38}, { ON, 10}, { L, 41}, { ON, 2}, { L, 1}, { ON, 4}, { L, 90}, { ON, 5}, { L, 68}, { ON, 5}, { L, 82}, { ON, 6}, { L, 7}, { ON, 1}, { L, 63}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 39}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 31}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, { ON, 1}, { L, 7}, { ON, 1}, { L, 23}, { ON, 1}, { L, 31}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, { ON, 1}, { L, 39}, { ON, 1}, { L, 19}, { ON, 6}, { L, 28}, { ON, 35}, { L, 85}, { ON, 12}, { L, 255}, { L, 255}, { L, 120}, { ON, 9}, { WS, 1}, { L, 26}, { ON, 5}, { L, 81}, { ON, 15}, { L, 13}, { ON, 1}, { L, 4}, {NSM, 3}, { ON, 11}, { L, 18}, {NSM, 3}, { L, 2}, { ON, 9}, { L, 18}, {NSM, 2}, { ON, 12}, { L, 13}, { ON, 1}, { L, 3}, { ON, 1}, {NSM, 2}, { ON, 12}, { L, 55}, {NSM, 7}, { L, 8}, {NSM, 1}, { L, 2}, {NSM, 11}, { L, 7}, { ET, 1}, { L, 1}, { ON, 3}, { L, 10}, { ON, 33}, {NSM, 3}, { BN, 1}, { ON, 1}, { L, 10}, { ON, 6}, { L, 88}, { ON, 8}, { L, 41}, {NSM, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 91}, { L, 156}, { ON, 4}, { L, 90}, { ON, 6}, { L, 22}, { ON, 2}, { L, 6}, { ON, 2}, { L, 38}, { ON, 2}, { L, 6}, { ON, 2}, { L, 8}, { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, { L, 31}, { ON, 2}, { L, 53}, { ON, 1}, { L, 7}, { ON, 1}, { L, 1}, { ON, 3}, { L, 3}, { ON, 1}, { L, 7}, { ON, 3}, { L, 4}, { ON, 2}, { L, 6}, { ON, 4}, { L, 13}, { ON, 5}, { L, 3}, { ON, 1}, { L, 7}, { ON, 3}, { WS, 11}, { BN, 3}, { L, 1}, { R, 1}, { ON, 24}, { WS, 1}, { B, 1}, {LRE, 1}, {RLE, 1}, {PDF, 1}, {LRO, 1}, {RLO, 1}, { WS, 1}, { ET, 5}, { ON, 42}, { WS, 1}, { BN, 4}, { ON, 6}, { BN, 6}, { EN, 1}, { L, 1}, { ON, 2}, { EN, 6}, { ET, 2}, { ON, 3}, { L, 1}, { EN, 10}, { ET, 2}, { ON, 20}, { ET, 18}, { ON, 30}, {NSM, 27}, { ON, 23}, { L, 1}, { ON, 4}, { L, 1}, { ON, 2}, { L, 10}, { ON, 1}, { L, 1}, { ON, 3}, { L, 5}, { ON, 6}, { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ET, 1}, { L, 3}, { ON, 1}, { L, 7}, { ON, 3}, { L, 3}, { ON, 5}, { L, 5}, { ON, 22}, { L, 36}, { ON, 142}, { ET, 2}, { ON, 255}, { ON, 35}, { L, 69}, { ON, 26}, { L, 1}, { ON, 202}, { EN, 60}, { L, 78}, { EN, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 32}, { WS, 1}, { ON, 4}, { L, 3}, { ON, 25}, { L, 9}, {NSM, 6}, { ON, 1}, { L, 5}, { ON, 2}, { L, 5}, { ON, 4}, { L, 86}, { ON, 2}, {NSM, 2}, { ON, 2}, { L, 3}, { ON, 1}, { L, 90}, { ON, 1}, { L, 4}, { ON, 5}, { L, 40}, { ON, 4}, { L, 94}, { ON, 1}, { L, 40}, { ON, 56}, { L, 45}, { ON, 3}, { L, 36}, { ON, 28}, { L, 28}, { ON, 3}, { L, 50}, { ON, 15}, { L, 12}, { ON, 4}, { L, 47}, { ON, 1}, { L, 119}, { ON, 4}, { L, 99}, { ON, 2}, { L, 31}, { ON, 1}, { L, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 205}, { L, 1}, { ON, 74}, { L, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 245}, { L, 1}, { ON, 90}, { L, 255}, { L, 255}, { L, 255}, { L, 255}, { L, 145}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 122}, { L, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 205}, { L, 1}, { ON, 92}, { L, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 129}, { L, 2}, { ON, 126}, { L, 2}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 2}, { L, 2}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 23}, { L, 255}, { L, 48}, { ON, 2}, { L, 59}, { ON, 149}, { L, 7}, { ON, 12}, { L, 5}, { ON, 5}, { R, 1}, {NSM, 1}, { R, 10}, { ET, 1}, { R, 13}, { ON, 1}, { R, 5}, { ON, 1}, { R, 1}, { ON, 1}, { R, 2}, { ON, 1}, { R, 2}, { ON, 1}, { R, 10}, { AL, 98}, { ON, 33}, { AL, 255}, { AL, 108}, { ON, 18}, { AL, 64}, { ON, 2}, { AL, 54}, { ON, 40}, { AL, 13}, { ON, 3}, {NSM, 16}, { ON, 16}, {NSM, 4}, { ON, 44}, { CS, 1}, { ON, 1}, { CS, 1}, { ON, 2}, { CS, 1}, { ON, 9}, { ET, 1}, { ON, 2}, { ET, 2}, { ON, 5}, { ET, 2}, { ON, 5}, { AL, 5}, { ON, 1}, { AL, 135}, { ON, 2}, { BN, 1}, { ON, 3}, { ET, 3}, { ON, 5}, { ET, 1}, { CS, 1}, { ET, 1}, { CS, 1}, { ES, 1}, { EN, 10}, { CS, 1}, { ON, 6}, { L, 26}, { ON, 6}, { L, 26}, { ON, 11}, { L, 89}, { ON, 3}, { L, 6}, { ON, 2}, { L, 6}, { ON, 2}, { L, 6}, { ON, 2}, { L, 3}, { ON, 3}, { ET, 2}, { ON, 3}, { ET, 2}, { ON, 9}, { L, 14}, }; Revision-number: 4952 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2004-12-07T18:18:28.006604Z K 7 svn:log V 147 Reformat minibidi.[ch] in line with my coding conventions. It was just getting to be too much hassle trying to work with the existing indentation. K 10 svn:author V 5 simon PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 82f149fd470527990f6f9bf96ed12cdb Text-delta-base-sha1: 76aec1dd70edd0d39833590d6f692d62072ced2e Text-content-length: 17381 Text-content-md5: 835c84c86274f0137ee8add699f092ea Text-content-sha1: 74969401292ffdd3d3a5375e2b69e2050d1c7d73 Content-length: 17381 SVNi2= ' b2,c $lg_s/#"JEARRe jQ:]-:Q:\8Q:PG:oq`-bKyyyrMk;Fk.R}l^V8+CeW[z1;X4R9~Lk`N l4BFvziN ,|7R (i((i-j)/2); rcount--) (i=start; i 0) switch (line[i-1].wc) { case 0x622: ligFlag = 1; if 6; else to[i].wc = 0xFEF5; break; case 0x623: ligFlag = 1; if C; else to[i].wc = 0xFEFB; break; } if (ligFlag) { to[i-1].wc = 0x20; ligFlag = 0; break; } } if ((tempShape == SL) || (tempShape == SD) || (tempShape == SC)) ((tempShape == SR) || (tempShape == SD) || (tempShape == SC)) to[i].wc = SMEDIAL((SISOLATED(line[i].wc)) (i=0; i= 0) { if (types[j] == AL) { types[i] = AN; break; } else if (types[j] == R || types[j] == L) { break; (i=0; i 0 && types[i-1] == EN) { types[i] = EN; continue; } else if (i < count-1 && types[i+1] == EN) { types[i] = EN; continue; } else if (i < count-1 && types[i+1] == ET) { j=i; while (j = 0) { if (types[j] == L) { types[i] = L; break; } else if (types[j] == R || types[j] == AL) (count >= 2 && types[0] == ON) { if ((types[1] == R) || (types[1] == EN) || (types[1] == AN)) types[0] = R; else if (types[1] == L) types[0] = L; } for (i=1; i<(count-1); i++) { if (types[i] == ON) { if (types[i-1] == L) { j=i; while (j<(count-1) && types[j] == ON) { j++; } if (types[j] == L) { while (i= 2 && types[count-1] == ON) { if (types[count-2] == R || types[count-2] == EN || types[count-2] == AN) types[count-1] = R; else if (i=0; i0 && (getType(line[j].wc) == WS)) { j--; } if (j < (count-1)) { for (j++; j=i ; j--) { levels[j] = paragraphLevel; } } } else if (tempType == B || tempType == S) { levels[i] = paragraphLevel; } (i=0; i tempType) (tempType > 0) { /* loop from highest level to the least odd, */ c ((*ch & 0xFF00) == 0) { switch (*ch) { case 0x0028: *ch = 0x0029; break; case 0x0029: *ch = 0x0028; break; case 0x003C: *ch = 0x003E; break; case 0x003E: *ch = 0x003C; break; case 0x005B: *ch = 0x005D; break; case 0x005D: *ch = 0x005B; break; case 0x007B: *ch = 0x007D; break; case 0x007D: *ch = 0x007B; break; case 0x00AB: *ch = 0x00BB; break; case 0x00BB: *ch = 0x00AB; break; } } else if ((*ch & 0xFF00) == 0x2000) { switch (*ch) { case 0x2039: *ch = 0x203A; break; case 0x203A: *ch = 0x2039; break; case 0x2045: *ch = 0x2046; break; case 0x2046: *ch = 0x2045; break; case 0x207D: *ch = 0x207E; break; case 0x207E: *ch = 0x207D; break; case 0x208D: *ch = 0x208E; break; case 0x208E: *ch = 0x208D; break; } } else if ((*ch & 0xFF00) == 0x2200) { switch (*ch) { case 0x2208: *ch = 0x220B; break; case 0x2209: *ch = 0x220C; break; case 0x220A: *ch = 0x220D; break; case 0x220B: *ch = 0x2208; break; case 0x220C: *ch = 0x2209; break; case 0x220D: *ch = 0x220A; break; case 0x2215: *ch = 0x29F5; break; case 0x223C: *ch = 0x223D; break; case 0x223D: *ch = 0x223C; break; case 0x2243: *ch = 0x22CD; break; case 0x2252: *ch = 0x2253; break; case 0x2253: *ch = 0x2252; break; case 0x2254: *ch = 0x2255; break; case 0x2255: *ch = 0x2254; break; case 0x2264: *ch = 0x2265; break; case 0x2265: *ch = 0x2264; break; case 0x2266: *ch = 0x2267; break; case 0x2267: *ch = 0x2266; break; case 0x2268: *ch = 0x2269; break; case 0x2269: *ch = 0x2268; break; case 0x226A: *ch = 0x226B; break; case 0x226B: *ch = 0x226A; break; case 0x226E: *ch = 0x226F; break; case 0x226F: *ch = 0x226E; break; case 0x2270: *ch = 0x2271; break; case 0x2271: *ch = 0x2270; break; case 0x2272: *ch = 0x2273; break; case 0x2273: *ch = 0x2272; break; case 0x2274: *ch = 0x2275; break; case 0x2275: *ch = 0x2274; break; case 0x2276: *ch = 0x2277; break; case 0x2277: *ch = 0x2276; break; case 0x2278: *ch = 0x2279; break; case 0x2279: *ch = 0x2278; break; case 0x227A: *ch = 0x227B; break; case 0x227B: *ch = 0x227A; break; case 0x227C: *ch = 0x227D; break; case 0x227D: *ch = 0x227C; break; case 0x227E: *ch = 0x227F; break; case 0x227F: *ch = 0x227E; break; case 0x2280: *ch = 0x2281; break; case 0x2281: *ch = 0x2280; break; case 0x2282: *ch = 0x2283; break; case 0x2283: *ch = 0x2282; break; case 0x2284: *ch = 0x2285; break; case 0x2285: *ch = 0x2284; break; case 0x2286: *ch = 0x2287; break; case 0x2287: *ch = 0x2286; break; case 0x2288: *ch = 0x2289; break; case 0x2289: *ch = 0x2288; break; case 0x228A: *ch = 0x228B; break; case 0x228B: *ch = 0x228A; break; case 0x228F: *ch = 0x2290; break; case 0x2290: *ch = 0x228F; break; case 0x2291: *ch = 0x2292; break; case 0x2292: *ch = 0x2291; break; case 0x2298: *ch = 0x29B8; break; case 0x22A2: *ch = 0x22A3; break; case 0x22A3: *ch = 0x22A2; break; case 0x22A6: *ch = 0x2ADE; break; case 0x22A8: *ch = 0x2AE4; break; case 0x22A9: *ch = 0x2AE3; break; case 0x22AB: *ch = 0x2AE5; break; case 0x22B0: *ch = 0x22B1; break; case 0x22B1: *ch = 0x22B0; break; case 0x22B2: *ch = 0x22B3; break; case 0x22B3: *ch = 0x22B2; break; case 0x22B4: *ch = 0x22B5; break; case 0x22B5: *ch = 0x22B4; break; case 0x22B6: *ch = 0x22B7; break; case 0x22B7: *ch = 0x22B6; break; case 0x22C9: *ch = 0x22CA; break; case 0x22CA: *ch = 0x22C9; break; case 0x22CB: *ch = 0x22CC; break; case 0x22CC: *ch = 0x22CB; break; case 0x22CD: *ch = 0x2243; break; case 0x22D0: *ch = 0x22D1; break; case 0x22D1: *ch = 0x22D0; break; case 0x22D6: *ch = 0x22D7; break; case 0x22D7: *ch = 0x22D6; break; case 0x22D8: *ch = 0x22D9; break; case 0x22D9: *ch = 0x22D8; break; case 0x22DA: *ch = 0x22DB; break; case 0x22DB: *ch = 0x22DA; break; case 0x22DC: *ch = 0x22DD; break; case 0x22DD: *ch = 0x22DC; break; case 0x22DE: *ch = 0x22DF; break; case 0x22DF: *ch = 0x22DE; break; case 0x22E0: *ch = 0x22E1; break; case 0x22E1: *ch = 0x22E0; break; case 0x22E2: *ch = 0x22E3; break; case 0x22E3: *ch = 0x22E2; break; case 0x22E4: *ch = 0x22E5; break; case 0x22E5: *ch = 0x22E4; break; case 0x22E6: *ch = 0x22E7; break; case 0x22E7: *ch = 0x22E6; break; case 0x22E8: *ch = 0x22E9; break; case 0x22E9: *ch = 0x22E8; break; case 0x22EA: *ch = 0x22EB; break; case 0x22EB: *ch = 0x22EA; break; case 0x22EC: *ch = 0x22ED; break; case 0x22ED: *ch = 0x22EC; break; case 0x22F0: *ch = 0x22F1; break; case 0x22F1: *ch = 0x22F0; break; case 0x22F2: *ch = 0x22FA; break; case 0x22F3: *ch = 0x22FB; break; case 0x22F4: *ch = 0x22FC; break; case 0x22F6: *ch = 0x22FD; break; case 0x22F7: *ch = 0x22FE; break; case 0x22FA: *ch = 0x22F2; break; case 0x22FB: *ch = 0x22F3; break; case 0x22FC: *ch = 0x22F4; break; case 0x22FD: *ch = 0x22F6; break; case 0x22FE: *ch = 0x22F7; break; } } else if ((*ch & 0xFF00) == 0x2300) { switch (*ch) { case 0x2308: *ch = 0x2309; break; case 0x2309: *ch = 0x2308; break; case 0x230A: *ch = 0x230B; break; case 0x230B: *ch = 0x230A; break; case 0x2329: *ch = 0x232A; break; case 0x232A: *ch = 0x2329; break; } } else if ((*ch & 0xFF00) == 0x2700) { switch (*ch) { case 0x2768: *ch = 0x2769; break; case 0x2769: *ch = 0x2768; break; case 0x276A: *ch = 0x276B; break; case 0x276B: *ch = 0x276A; break; case 0x276C: *ch = 0x276D; break; case 0x276D: *ch = 0x276C; break; case 0x276E: *ch = 0x276F; break; case 0x276F: *ch = 0x276E; break; case 0x2770: *ch = 0x2771; break; case 0x2771: *ch = 0x2770; break; case 0x2772: *ch = 0x2773; break; case 0x2773: *ch = 0x2772; break; case 0x2774: *ch = 0x2775; break; case 0x2775: *ch = 0x2774; break; case 0x27D5: *ch = 0x27D6; break; case 0x27D6: *ch = 0x27D5; break; case 0x27DD: *ch = 0x27DE; break; case 0x27DE: *ch = 0x27DD; break; case 0x27E2: *ch = 0x27E3; break; case 0x27E3: *ch = 0x27E2; break; case 0x27E4: *ch = 0x27E5; break; case 0x27E5: *ch = 0x27E4; break; case 0x27E6: *ch = 0x27E7; break; case 0x27E7: *ch = 0x27E6; break; case 0x27E8: *ch = 0x27E9; break; case 0x27E9: *ch = 0x27E8; break; case 0x27EA: *ch = 0x27EB; break; case 0x27EB: *ch = 0x27EA; break; } } else if ((*ch & 0xFF00) == 0x2900) { switch (*ch) { case 0x2983: *ch = 0x2984; break; case 0x2984: *ch = 0x2983; break; case 0x2985: *ch = 0x2986; break; case 0x2986: *ch = 0x2985; break; case 0x2987: *ch = 0x2988; break; case 0x2988: *ch = 0x2987; break; case 0x2989: *ch = 0x298A; break; case 0x298A: *ch = 0x2989; break; case 0x298B: *ch = 0x298C; break; case 0x298C: *ch = 0x298B; break; case 0x298D: *ch = 0x2990; break; case 0x298E: *ch = 0x298F; break; case 0x298F: *ch = 0x298E; break; case 0x2990: *ch = 0x298D; break; case 0x2991: *ch = 0x2992; break; case 0x2992: *ch = 0x2991; break; case 0x2993: *ch = 0x2994; break; case 0x2994: *ch = 0x2993; break; case 0x2995: *ch = 0x2996; break; case 0x2996: *ch = 0x2995; break; case 0x2997: *ch = 0x2998; break; case 0x2998: *ch = 0x2997; break; case 0x29B8: *ch = 0x2298; break; case 0x29C0: *ch = 0x29C1; break; case 0x29C1: *ch = 0x29C0; break; case 0x29C4: *ch = 0x29C5; break; case 0x29C5: *ch = 0x29C4; break; case 0x29CF: *ch = 0x29D0; break; case 0x29D0: *ch = 0x29CF; break; case 0x29D1: *ch = 0x29D2; break; case 0x29D2: *ch = 0x29D1; break; case 0x29D4: *ch = 0x29D5; break; case 0x29D5: *ch = 0x29D4; break; case 0x29D8: *ch = 0x29D9; break; case 0x29D9: *ch = 0x29D8; break; case 0x29DA: *ch = 0x29DB; break; case 0x29DB: *ch = 0x29DA; break; case 0x29F5: *ch = 0x2215; break; case 0x29F8: *ch = 0x29F9; break; case 0x29F9: *ch = 0x29F8; break; case 0x29FC: *ch = 0x29FD; break; case 0x29FD: *ch = 0x29FC; break; } } else if ((*ch & 0xFF00) == 0x2A00) { switch (*ch) { case 0x2A2B: *ch = 0x2A2C; break; case 0x2A2C: *ch = 0x2A2B; break; case 0x2A2D: *ch = 0x2A2C; break; case 0x2A2E: *ch = 0x2A2D; break; case 0x2A34: *ch = 0x2A35; break; case 0x2A35: *ch = 0x2A34; break; case 0x2A3C: *ch = 0x2A3D; break; case 0x2A3D: *ch = 0x2A3C; break; case 0x2A64: *ch = 0x2A65; break; case 0x2A65: *ch = 0x2A64; break; case 0x2A79: *ch = 0x2A7A; break; case 0x2A7A: *ch = 0x2A79; break; case 0x2A7D: *ch = 0x2A7E; break; case 0x2A7E: *ch = 0x2A7D; break; case 0x2A7F: *ch = 0x2A80; break; case 0x2A80: *ch = 0x2A7F; break; case 0x2A81: *ch = 0x2A82; break; case 0x2A82: *ch = 0x2A81; break; case 0x2A83: *ch = 0x2A84; break; case 0x2A84: *ch = 0x2A83; break; case 0x2A8B: *ch = 0x2A8C; break; case 0x2A8C: *ch = 0x2A8B; break; case 0x2A91: *ch = 0x2A92; break; case 0x2A92: *ch = 0x2A91; break; case 0x2A93: *ch = 0x2A94; break; case 0x2A94: *ch = 0x2A93; break; case 0x2A95: *ch = 0x2A96; break; case 0x2A96: *ch = 0x2A95; break; case 0x2A97: *ch = 0x2A98; break; case 0x2A98: *ch = 0x2A97; break; case 0x2A99: *ch = 0x2A9A; break; case 0x2A9A: *ch = 0x2A99; break; case 0x2A9B: *ch = 0x2A9C; break; case 0x2A9C: *ch = 0x2A9B; break; case 0x2AA1: *ch = 0x2AA2; break; case 0x2AA2: *ch = 0x2AA1; break; case 0x2AA6: *ch = 0x2AA7; break; case 0x2AA7: *ch = 0x2AA6; break; case 0x2AA8: *ch = 0x2AA9; break; case 0x2AA9: *ch = 0x2AA8; break; case 0x2AAA: *ch = 0x2AAB; break; case 0x2AAB: *ch = 0x2AAA; break; case 0x2AAC: *ch = 0x2AAD; break; case 0x2AAD: *ch = 0x2AAC; break; case 0x2AAF: *ch = 0x2AB0; break; case 0x2AB0: *ch = 0x2AAF; break; case 0x2AB3: *ch = 0x2AB4; break; case 0x2AB4: *ch = 0x2AB3; break; case 0x2ABB: *ch = 0x2ABC; break; case 0x2ABC: *ch = 0x2ABB; break; case 0x2ABD: *ch = 0x2ABE; break; case 0x2ABE: *ch = 0x2ABD; break; case 0x2ABF: *ch = 0x2AC0; break; case 0x2AC0: *ch = 0x2ABF; break; case 0x2AC1: *ch = 0x2AC2; break; case 0x2AC2: *ch = 0x2AC1; break; case 0x2AC3: *ch = 0x2AC4; break; case 0x2AC4: *ch = 0x2AC3; break; case 0x2AC5: *ch = 0x2AC6; break; case 0x2AC6: *ch = 0x2AC5; break; case 0x2ACD: *ch = 0x2ACE; break; case 0x2ACE: *ch = 0x2ACD; break; case 0x2ACF: *ch = 0x2AD0; break; case 0x2AD0: *ch = 0x2ACF; break; case 0x2AD1: *ch = 0x2AD2; break; case 0x2AD2: *ch = 0x2AD1; break; case 0x2AD3: *ch = 0x2AD4; break; case 0x2AD4: *ch = 0x2AD3; break; case 0x2AD5: *ch = 0x2AD6; break; case 0x2AD6: *ch = 0x2AD5; break; case 0x2ADE: *ch = 0x22A6; break; case 0x2AE3: *ch = 0x22A9; break; case 0x2AE4: *ch = 0x22A8; break; case 0x2AE5: *ch = 0x22AB; break; case 0x2AEC: *ch = 0x2AED; break; case 0x2AED: *ch = 0x2AEC; break; case 0x2AF7: *ch = 0x2AF8; break; case 0x2AF8: *ch = 0x2AF7; break; case 0x2AF9: *ch = 0x2AFA; break; case 0x2AFA: *ch = 0x2AF9; break; } } else if ((*ch & 0xFF00) == 0x3000) { switch (*ch) { case 0x3008: *ch = 0x3009; break; case 0x3009: *ch = 0x3008; break; case 0x300A: *ch = 0x300B; break; case 0x300B: *ch = 0x300A; break; case 0x300C: *ch = 0x300D; break; case 0x300D: *ch = 0x300C; break; case 0x300E: *ch = 0x300F; break; case 0x300F: *ch = 0x300E; break; case 0x3010: *ch = 0x3011; break; case 0x3011: *ch = 0x3010; break; case 0x3014: *ch = 0x3015; break; case 0x3015: *ch = 0x3014; break; case 0x3016: *ch = 0x3017; break; case 0x3017: *ch = 0x3016; break; case 0x3018: *ch = 0x3019; break; case 0x3019: *ch = 0x3018; break; case 0x301A: *ch = 0x301B; break; case 0x301B: *ch = 0x301A; break; } } else if ((*ch & 0xFF00) == 0xFF00) { switch (*ch) { case 0xFF08: *ch = 0xFF09; break; case 0xFF09: *ch = 0xFF08; break; case 0xFF1C: *ch = 0xFF1E; break; case 0xFF1E: *ch = 0xFF1C; break; case 0xFF3B: *ch = 0xFF3D; break; case 0xFF3D: *ch = 0xFF3B; break; case 0xFF5B: *ch = 0xFF5D; break; case 0xFF5D: *ch = 0xFF5B; break; case 0xFF5F: *ch = 0xFF60; break; case 0xFF60: *ch = 0xFF5F; break; case 0xFF62: *ch = 0xFF63; break; case 0xFF63: *ch = 0xFF62; break; } } } Node-path: putty/minibidi.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a0057ff6373bb7e2738cb4153997d33 Text-delta-base-sha1: eed9b22d1b18435881e97ba0ecc38cc3f194261e Text-content-length: 2107 Text-content-md5: e47616929a678dafec0c521c479b50c5 Text-content-sha1: 5bf2500b6a028d6029134fdfd3b97cfa0922953b Content-length: 2107 SVNS?! 7sTd)%4zSN(xh) >= SHAPE_FIRST) && ((xh) <= SHAPE_LAST)) ? \ shapetypes[(xh)-SHAPE_FIRST].type : SU) /*))*/ #define SISOLATED(xh) (shapetypes[(xh)-SHAPE_FIRST].form_b) #define SFINAL(xh) ((xh)+1) #define SINITIAL(xh) ((xh)+2) #define SMEDIAL(ch) ((ch)+3) { L, LRE, LRO, R, AL, RLE, RLO, PDF, EN, ES, ET, AN, CS, NSM, BN, B, S, WS, ON, }; /* Shaping Types */ enum { SL, /* Left-Joining, doesnt exist in U+0600 - U+06FF */ SR, /* Right-Joining, ie has Isolated, Final */ SD, /* Dual-Joining, ie has Isolated, Final, Initial, Medial */ SU, /* Non-Joining */ SC /* Join-Causing, like U+0640 (TATWEEL) */ }; typedef struct { char type; /* index, Typ, Iso, Ligature Index*/ /* 621 */ {SU, 0xFE80}, /* 622 */ {SR, 0xFE81}, /* 623 */ {SR, 0xFE83}, /* 624 */ {SR, 0xFE85}, /* 625 */ {SR, 0xFE87}, /* 626 */ {SD, 0xFE89}, /* 627 */ {SR, 0xFE8D}, /* 628 */ {SD, 0xFE8F}, /* 629 */ {SR, 0xFE93}, /* 62A */ {SD, 0xFE95}, /* 62B */ {SD, 0xFE99}, /* 62C */ {SD, 0xFE9D}, /* 62D */ {SD, 0xFEA1}, /* 62E */ {SD, 0xFEA5}, /* 62F */ {SR, 0xFEA9}, /* 630 */ {SR, 0xFEAB}, /* 631 */ {SR, 0xFEAD}, /* 632 */ {SR, 0xFEAF}, /* 633 */ {SD, 0xFEB1}, /* 634 */ {SD, 0xFEB5}, /* 635 */ {SD, 0xFEB9}, /* 636 */ {SD, 0xFEBD}, /* 637 */ {SD, 0xFEC1}, /* 638 */ {SD, 0xFEC5}, /* 639 */ {SD, 0xFEC9}, /* 63A */ {SD, 0xFECD}, /* 63B */ {SU, 0x0}, /* 63C */ {SU, 0x0}, /* 63D */ {SU, 0x0}, /* 63E */ {SU, 0x0}, /* 63F */ {SU, 0x0}, /* 640 */ {SC, 0x0}, /* 641 */ {SD, 0xFED1}, /* 642 */ {SD, 0xFED5}, /* 643 */ {SD, 0xFED9}, /* 644 */ {SD, 0xFEDD}, /* 645 */ {SD, 0xFEE1}, /* 646 */ {SD, 0xFEE5}, /* 647 */ {SD, 0xFEE9}, /* 648 */ {SR, 0xFEED}, /* 649 */ {SR, 0xFEEF}, /* SD */ /* 64A */ {SD, 0xFEF1}, }; /* * This describes the data byte and its frequency */ typedef struct { unsigned char d; unsigned char f; } Revision-number: 4953 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:47.795054Z PROPS-END Revision-number: 4954 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:47.805875Z PROPS-END Revision-number: 4955 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:47.815522Z PROPS-END Revision-number: 4956 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2004-12-08T13:06:36.773563Z K 7 svn:log V 15 putty.4any.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f6c4686185c7b9ee674b1084c0ead6c Text-delta-base-sha1: 731e48234096b6b1f54fbd0f7c178cd20de5ce6e Text-content-length: 66 Text-content-md5: 5bb707a0d7ca090ed4ee16cb24fd7967 Text-content-sha1: 4726dbba0d3d5138dcc9e8b851d94c8ce6b0a430 Content-length: 66 SVNV?'DI? K4any.org/">putty.4any.org in Austri Revision-number: 4957 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:47.880211Z PROPS-END Revision-number: 4958 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:47.890982Z PROPS-END Revision-number: 4959 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:47.901214Z PROPS-END Revision-number: 4960 Prop-content-length: 363 Content-length: 363 K 8 svn:date V 27 2004-12-08T17:15:03.607295Z K 7 svn:log V 262 It turns out that my nightly snapshot scripts were actually _creating_ a snapshot Unix source archive every night, and all that was missing was a link to it from the download page. So here one is. (Oops. I made this change last week and forgot to check it in.) K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f5dbf0f4d8ba7bd8241d4c3d89a249a4 Text-delta-base-sha1: 78c3f98987e7e5009186f21c21e64963b6d1c8c6 Text-content-length: 973 Text-content-md5: c21551befa1ee51d5248d0f1901927f2 Text-content-sha1: eae57ed2c88cd58d301b7eb9ccc0003c3d964d26 Content-length: 973 SVN5o?,u*:)MOtcEQ@RegjK/p> /p>

    These .tar.gz source archives should build the latest release version, and latest development snapshot, of PuTTY for Unix.

    To build the source, you will need to unpack one of these archives, change into the "unix" subdirectory, and type "make -f Makefile.gtk". (Sorry, no autoconf as yet either.) See the file "README" for more information.

    (The filename of the development snapshot source archive contains the snapshot date, so it will change every night. It is not offered by FTP, because FTP does not support the redirect mechanism that implements this.)

    tr> (DSA sig)
    Development snapshotwww.tartarus.org/~simon/putty-unix/putty-snapshot.tar.gz">putty-<version>.tar.gz

    Windows source c

    Revision-number: 4961 Prop-content-length: 352 Content-length: 352 K 7 svn:log V 251 Add a "source code" heading, and some explanatory text (Unix/Windows archives mostly the same, etc). Partly this is an attempt to fend off the occasional "can you put the PuTTY code up for download", "do you have PSCP source code as well" and so on. K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-12-08T17:34:59.468265Z PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c21551befa1ee51d5248d0f1901927f2 Text-delta-base-sha1: eae57ed2c88cd58d301b7eb9ccc0003c3d964d26 Text-content-length: 454 Text-content-md5: f501bad630a8cbc266a0013ac0ba0667 Text-content-sha1: 1163918d048f093592ec89881dfa830d22b7a27d Content-length: 454 SVNo>#:I$

    This is the source code for all of the PuTTY utilities.

    For convenience, we provide several versions of the source code, for different platforms. The actual content does not differ substantially between Windows and Unix archives; the differences are mostly in formatting (filenames, line endings, etc).h3>Unix source codeWindows source code

    3>Access via Subversionyo}zD)pt, /* definition of wchar_t*/ #include "misc.h" #define LMASK 0x3F /* Embedding Level mask */ #define OMASK 0xC0 /* Override mask */ #define OISL 0x80 /* Override is L */ #define OISR 0x40 /* Override is R */ /* Shaping Helpers */ #define STYPE(xh) ((((xh) >= SHAPE_FIRST) && ((xh) <= SHAPE_LAST)) ? \ shapetypes[(xh)-SHAPE_FIRST].type : SU) /*))*/ #define SISOLATED(xh) (shapetypes[(xh)-SHAPE_FIRST].form_b) #define SFINAL(xh) ((xh)+1) #define SINITIAL(xh) ((xh)+2) #define SMEDIAL(ch) ((ch)+3) #define leastGreaterOdd(x) ( ((x)+1) | 1 ) #define leastGreaterEven(x) ( ((x)+2) &~ 1 ) typedef struct bidi_char { wchar_t origwc, wc; unsigned short index; } bidi_char; /* function declarations */ void flipThisRun(bidi_char *from, unsigned char* level, int max, int count); int findIndexOfRun(unsigned char* level , int start, int count, int tlevel); unsigned char getType(wchar_t ch);; int getPreviousLevel(unsigned char* level, int from); unsigned char getRLE(wchar_t ch); int do_shape(bidi_char *line, bidi_char *to, int count); int do_bidi(bidi_char *line, int count); void doMirror(wchar_t* ch); /* character types */ enum { L, LRE, LRO, R, AL, RLE, RLO, PDF, EN, ES, ET, AN, CS, NSM, BN, B, S, WS, ON, }; /* Shaping Types */ enum { SL, /* Left-Joining, doesnt exist in U+0600 - U+06FF */ SR, /* Right-Joining, ie has Isolated, Final */ SD, /* Dual-Joining, ie has Isolated, Final, Initial, Medial */ SU, /* Non-Joining */ SC /* Join-Causing, like U+0640 (TATWEEL) */ }; typedef struct { char type; wchar_t form_b; } shape_node; /* Kept near the actual table, for verification. */ #define SHAPE_FIRST 0x621 #define SHAPE_LAST 0x64A const shape_node shapetypes[] = { /* index, Typ, Iso, Ligature Index*/ /* 621 */ {SU, 0xFE80}, /* 622 */ {SR, 0xFE81}, /* 623 */ {SR, 0xFE83}, /* 624 */ {SR, 0xFE85}, /* 625 */ {SR, 0xFE87}, /* 626 */ {SD, 0xFE89}, /* 627 */ {SR, 0xFE8D}, /* 628 */ {SD, 0xFE8F}, /* 629 */ {SR, 0xFE93}, /* 62A */ {SD, 0xFE95}, /* 62B */ {SD, 0xFE99}, /* 62C */ {SD, 0xFE9D}, /* 62D */ {SD, 0xFEA1}, /* 62E */ {SD, 0xFEA5}, /* 62F */ {SR, 0xFEA9}, /* 630 */ {SR, 0xFEAB}, /* 631 */ {SR, 0xFEAD}, /* 632 */ {SR, 0xFEAF}, /* 633 */ {SD, 0xFEB1}, /* 634 */ {SD, 0xFEB5}, /* 635 */ {SD, 0xFEB9}, /* 636 */ {SD, 0xFEBD}, /* 637 */ {SD, 0xFEC1}, /* 638 */ {SD, 0xFEC5}, /* 639 */ {SD, 0xFEC9}, /* 63A */ {SD, 0xFECD}, /* 63B */ {SU, 0x0}, /* 63C */ {SU, 0x0}, /* 63D */ {SU, 0x0}, /* 63E */ {SU, 0x0}, /* 63F */ {SU, 0x0}, /* 640 */ {SC, 0x0}, /* 641 */ {SD, 0xFED1}, /* 642 */ {SD, 0xFED5}, /* 643 */ {SD, 0xFED9}, /* 644 */ {SD, 0xFEDD}, /* 645 */ {SD, 0xFEE1}, /* 646 */ {SD, 0xFEE5}, /* 647 */ {SD, 0xFEE9}, /* 648 */ {SR, 0xFEED}, /* 649 */ {SR, 0xFEEF}, /* SD */ /* 64A */ {SD, 0xFEF1}, }; /* * This describes the data byte and its frequency */ typedef struct { unsigned char d; unsigned char f; } RLENode; /* This is an array of RLENodes, which is the * Compressed unicode types table */ const RLENode RLE_table[] = { { BN, 9}, { S, 1}, { B, 1}, { S, 1}, { WS, 1}, { B, 1}, { BN, 14}, { B, 3}, { S, 1}, { WS, 1}, { ON, 2}, { ET, 3}, { ON, 5}, { ET, 1}, { CS, 1}, { ET, 1}, { CS, 1}, { ES, 1}, { EN, 10}, { CS, 1}, { ON, 6}, { L, 26}, { ON, 6}, { L, 26}, { ON, 4}, { BN, 6}, { B, 1}, { BN, 26}, { CS, 1}, { ON, 1}, { ET, 4}, { ON, 4}, { L, 1}, { ON, 5}, { ET, 2}, { EN, 2}, { ON, 1}, { L, 1}, { ON, 3}, { EN, 1}, { L, 1}, { ON, 5}, { L, 23}, { ON, 1}, { L, 31}, { ON, 1}, { L, 255}, { L, 42}, { ON, 1}, { L, 18}, { ON, 28}, { L, 94}, { ON, 2}, { L, 9}, { ON, 2}, { L, 7}, { ON, 14}, { L, 2}, { ON, 14}, { L, 5}, { ON, 9}, { L, 1}, { ON, 17}, {NSM, 80}, { ON, 16}, {NSM, 16}, { ON, 10}, { L, 1}, { ON, 11}, { L, 1}, { ON, 1}, { L, 3}, { ON, 1}, { L, 1}, { ON, 1}, { L, 20}, { ON, 1}, { L, 44}, { ON, 1}, { L, 38}, { ON, 10}, { L, 131}, {NSM, 4}, { ON, 1}, {NSM, 2}, { L, 69}, { ON, 1}, { L, 38}, { ON, 2}, { L, 2}, { ON, 6}, { L, 16}, { ON, 33}, { L, 38}, { ON, 2}, { L, 7}, { ON, 1}, { L, 39}, { ON, 1}, { L, 1}, { ON, 7}, {NSM, 17}, { ON, 1}, {NSM, 23}, { ON, 1}, {NSM, 3}, { R, 1}, {NSM, 1}, { R, 1}, {NSM, 2}, { R, 1}, {NSM, 1}, { ON, 11}, { R, 27}, { ON, 5}, { R, 5}, { ON, 23}, { CS, 1}, { ON, 14}, { AL, 1}, { ON, 3}, { AL, 1}, { ON, 1}, { AL, 26}, { ON, 5}, { AL, 11}, {NSM, 11}, { ON, 10}, { AN, 10}, { ET, 1}, { AN, 2}, { AL, 3}, {NSM, 1}, { AL, 101}, {NSM, 7}, { AL, 1}, {NSM, 7}, { AL, 2}, {NSM, 2}, { ON, 1}, {NSM, 4}, { ON, 2}, { EN, 10}, { AL, 5}, { ON, 1}, { AL, 14}, { ON, 1}, { BN, 1}, { AL, 1}, {NSM, 1}, { AL, 27}, { ON, 3}, {NSM, 27}, { ON, 53}, { AL, 38}, {NSM, 11}, { AL, 1}, { ON, 255}, { ON, 80}, {NSM, 2}, { L, 1}, { ON, 1}, { L, 53}, { ON, 2}, {NSM, 1}, { L, 4}, {NSM, 8}, { L, 4}, {NSM, 1}, { ON, 2}, { L, 1}, {NSM, 4}, { ON, 3}, { L, 10}, {NSM, 2}, { L, 13}, { ON, 16}, {NSM, 1}, { L, 2}, { ON, 1}, { L, 8}, { ON, 2}, { L, 2}, { ON, 2}, { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, { L, 1}, { ON, 3}, { L, 4}, { ON, 2}, {NSM, 1}, { ON, 1}, { L, 3}, {NSM, 4}, { ON, 2}, { L, 2}, { ON, 2}, { L, 2}, {NSM, 1}, { ON, 9}, { L, 1}, { ON, 4}, { L, 2}, { ON, 1}, { L, 3}, {NSM, 2}, { ON, 2}, { L, 12}, { ET, 2}, { L, 7}, { ON, 7}, {NSM, 1}, { ON, 2}, { L, 6}, { ON, 4}, { L, 2}, { ON, 2}, { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, { L, 2}, { ON, 1}, { L, 2}, { ON, 1}, { L, 2}, { ON, 2}, {NSM, 1}, { ON, 1}, { L, 3}, {NSM, 2}, { ON, 4}, {NSM, 2}, { ON, 2}, {NSM, 3}, { ON, 11}, { L, 4}, { ON, 1}, { L, 1}, { ON, 7}, { L, 10}, {NSM, 2}, { L, 3}, { ON, 12}, {NSM, 2}, { L, 1}, { ON, 1}, { L, 7}, { ON, 1}, { L, 1}, { ON, 1}, { L, 3}, { ON, 1}, { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, { L, 2}, { ON, 1}, { L, 5}, { ON, 2}, {NSM, 1}, { L, 4}, {NSM, 5}, { ON, 1}, {NSM, 2}, { L, 1}, { ON, 1}, { L, 2}, {NSM, 1}, { ON, 2}, { L, 1}, { ON, 15}, { L, 1}, { ON, 5}, { L, 10}, { ON, 17}, {NSM, 1}, { L, 2}, { ON, 1}, { L, 8}, { ON, 2}, { L, 2}, { ON, 2}, { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, { L, 2}, { ON, 2}, { L, 4}, { ON, 2}, {NSM, 1}, { L, 2}, {NSM, 1}, { L, 1}, {NSM, 3}, { ON, 3}, { L, 2}, { ON, 2}, { L, 2}, {NSM, 1}, { ON, 8}, {NSM, 1}, { L, 1}, { ON, 4}, { L, 2}, { ON, 1}, { L, 3}, { ON, 4}, { L, 11}, { ON, 17}, {NSM, 1}, { L, 1}, { ON, 1}, { L, 6}, { ON, 3}, { L, 3}, { ON, 1}, { L, 4}, { ON, 3}, { L, 2}, { ON, 1}, { L, 1}, { ON, 1}, { L, 2}, { ON, 3}, { L, 2}, { ON, 3}, { L, 3}, { ON, 3}, { L, 8}, { ON, 1}, { L, 3}, { ON, 4}, { L, 2}, {NSM, 1}, { L, 2}, { ON, 3}, { L, 3}, { ON, 1}, { L, 3}, {NSM, 1}, { ON, 9}, { L, 1}, { ON, 15}, { L, 12}, { ON, 14}, { L, 3}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, { ON, 1}, { L, 23}, { ON, 1}, { L, 10}, { ON, 1}, { L, 5}, { ON, 4}, {NSM, 3}, { L, 4}, { ON, 1}, {NSM, 3}, { ON, 1}, {NSM, 4}, { ON, 7}, {NSM, 2}, { ON, 9}, { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, { L, 2}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, { ON, 1}, { L, 23}, { ON, 1}, { L, 10}, { ON, 1}, { L, 5}, { ON, 4}, { L, 1}, {NSM, 1}, { L, 5}, { ON, 1}, {NSM, 1}, { L, 2}, { ON, 1}, { L, 2}, {NSM, 2}, { ON, 7}, { L, 2}, { ON, 7}, { L, 1}, { ON, 1}, { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, { L, 2}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, { ON, 1}, { L, 23}, { ON, 1}, { L, 16}, { ON, 4}, { L, 3}, {NSM, 3}, { ON, 2}, { L, 3}, { ON, 1}, { L, 3}, {NSM, 1}, { ON, 9}, { L, 1}, { ON, 8}, { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, { L, 2}, { ON, 1}, { L, 18}, { ON, 3}, { L, 24}, { ON, 1}, { L, 9}, { ON, 1}, { L, 1}, { ON, 2}, { L, 7}, { ON, 3}, {NSM, 1}, { ON, 4}, { L, 3}, {NSM, 3}, { ON, 1}, {NSM, 1}, { ON, 1}, { L, 8}, { ON, 18}, { L, 3}, { ON, 12}, { L, 48}, {NSM, 1}, { L, 2}, {NSM, 7}, { ON, 4}, { ET, 1}, { L, 7}, {NSM, 8}, { L, 13}, { ON, 37}, { L, 2}, { ON, 1}, { L, 1}, { ON, 2}, { L, 2}, { ON, 1}, { L, 1}, { ON, 2}, { L, 1}, { ON, 6}, { L, 4}, { ON, 1}, { L, 7}, { ON, 1}, { L, 3}, { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, { ON, 2}, { L, 2}, { ON, 1}, { L, 4}, {NSM, 1}, { L, 2}, {NSM, 6}, { ON, 1}, {NSM, 2}, { L, 1}, { ON, 2}, { L, 5}, { ON, 1}, { L, 1}, { ON, 1}, {NSM, 6}, { ON, 2}, { L, 10}, { ON, 2}, { L, 2}, { ON, 34}, { L, 24}, {NSM, 2}, { L, 27}, {NSM, 1}, { L, 1}, {NSM, 1}, { L, 1}, {NSM, 1}, { ON, 4}, { L, 10}, { ON, 1}, { L, 34}, { ON, 6}, {NSM, 14}, { L, 1}, {NSM, 5}, { L, 1}, {NSM, 2}, { L, 4}, { ON, 4}, {NSM, 8}, { ON, 1}, {NSM, 36}, { ON, 1}, { L, 8}, {NSM, 1}, { L, 6}, { ON, 2}, { L, 1}, { ON, 48}, { L, 34}, { ON, 1}, { L, 5}, { ON, 1}, { L, 2}, { ON, 1}, { L, 1}, {NSM, 4}, { L, 1}, {NSM, 1}, { ON, 3}, {NSM, 2}, { L, 1}, {NSM, 1}, { ON, 6}, { L, 24}, {NSM, 2}, { ON, 70}, { L, 38}, { ON, 10}, { L, 41}, { ON, 2}, { L, 1}, { ON, 4}, { L, 90}, { ON, 5}, { L, 68}, { ON, 5}, { L, 82}, { ON, 6}, { L, 7}, { ON, 1}, { L, 63}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 39}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 31}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, { ON, 1}, { L, 7}, { ON, 1}, { L, 23}, { ON, 1}, { L, 31}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, { ON, 1}, { L, 39}, { ON, 1}, { L, 19}, { ON, 6}, { L, 28}, { ON, 35}, { L, 85}, { ON, 12}, { L, 255}, { L, 255}, { L, 120}, { ON, 9}, { WS, 1}, { L, 26}, { ON, 5}, { L, 81}, { ON, 15}, { L, 13}, { ON, 1}, { L, 4}, {NSM, 3}, { ON, 11}, { L, 18}, {NSM, 3}, { L, 2}, { ON, 9}, { L, 18}, {NSM, 2}, { ON, 12}, { L, 13}, { ON, 1}, { L, 3}, { ON, 1}, {NSM, 2}, { ON, 12}, { L, 55}, {NSM, 7}, { L, 8}, {NSM, 1}, { L, 2}, {NSM, 11}, { L, 7}, { ET, 1}, { L, 1}, { ON, 3}, { L, 10}, { ON, 33}, {NSM, 3}, { BN, 1}, { ON, 1}, { L, 10}, { ON, 6}, { L, 88}, { ON, 8}, { L, 41}, {NSM, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 91}, { L, 156}, { ON, 4}, { L, 90}, { ON, 6}, { L, 22}, { ON, 2}, { L, 6}, { ON, 2}, { L, 38}, { ON, 2}, { L, 6}, { ON, 2}, { L, 8}, { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, { L, 31}, { ON, 2}, { L, 53}, { ON, 1}, { L, 7}, { ON, 1}, { L, 1}, { ON, 3}, { L, 3}, { ON, 1}, { L, 7}, { ON, 3}, { L, 4}, { ON, 2}, { L, 6}, { ON, 4}, { L, 13}, { ON, 5}, { L, 3}, { ON, 1}, { L, 7}, { ON, 3}, { WS, 11}, { BN, 3}, { L, 1}, { R, 1}, { ON, 24}, { WS, 1}, { B, 1}, {LRE, 1}, {RLE, 1}, {PDF, 1}, {LRO, 1}, {RLO, 1}, { WS, 1}, { ET, 5}, { ON, 42}, { WS, 1}, { BN, 4}, { ON, 6}, { BN, 6}, { EN, 1}, { L, 1}, { ON, 2}, { EN, 6}, { ET, 2}, { ON, 3}, { L, 1}, { EN, 10}, { ET, 2}, { ON, 20}, { ET, 18}, { ON, 30}, {NSM, 27}, { ON, 23}, { L, 1}, { ON, 4}, { L, 1}, { ON, 2}, { L, 10}, { ON, 1}, { L, 1}, { ON, 3}, { L, 5}, { ON, 6}, { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ET, 1}, { L, 3}, { ON, 1}, { L, 7}, { ON, 3}, { L, 3}, { ON, 5}, { L, 5}, { ON, 22}, { L, 36}, { ON, 142}, { ET, 2}, { ON, 255}, { ON, 35}, { L, 69}, { ON, 26}, { L, 1}, { ON, 202}, { EN, 60}, { L, 78}, { EN, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 32}, { WS, 1}, { ON, 4}, { L, 3}, { ON, 25}, { L, 9}, {NSM, 6}, { ON, 1}, { L, 5}, { ON, 2}, { L, 5}, { ON, 4}, { L, 86}, { ON, 2}, {NSM, 2}, { ON, 2}, { L, 3}, { ON, 1}, { L, 90}, { ON, 1}, { L, 4}, { ON, 5}, { L, 40}, { ON, 4}, { L, 94}, { ON, 1}, { L, 40}, { ON, 56}, { L, 45}, { ON, 3}, { L, 36}, { ON, 28}, { L, 28}, { ON, 3}, { L, 50}, { ON, 15}, { L, 12}, { ON, 4}, { L, 47}, { ON, 1}, { L, 119}, { ON, 4}, { L, 99}, { ON, 2}, { L, 31}, { ON, 1}, { L, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 205}, { L, 1}, { ON, 74}, { L, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 245}, { L, 1}, { ON, 90}, { L, 255}, { L, 255}, { L, 255}, { L, 255}, { L, 145}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 122}, { L, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 205}, { L, 1}, { ON, 92}, { L, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 129}, { L, 2}, { ON, 126}, { L, 2}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 2}, { L, 2}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 23}, { L, 255}, { L, 48}, { ON, 2}, { L, 59}, { ON, 149}, { L, 7}, { ON, 12}, { L, 5}, { ON, 5}, { R, 1}, {NSM, 1}, { R, 10}, { ET, 1}, { R, 13}, { ON, 1}, { R, 5}, { ON, 1}, { R, 1}, { ON, 1}, { R, 2}, { ON, 1}, { R, 2}, { ON, 1}, { R, 10}, { AL, 98}, { ON, 33}, { AL, 255}, { AL, 108}, { ON, 18}, { AL, 64}, { ON, 2}, { AL, 54}, { ON, 40}, { AL, 13}, { ON, 3}, {NSM, 16}, { ON, 16}, {NSM, 4}, { ON, 44}, { CS, 1}, { ON, 1}, { CS, 1}, { ON, 2}, { CS, 1}, { ON, 9}, { ET, 1}, { ON, 2}, { ET, 2}, { ON, 5}, { ET, 2}, { ON, 5}, { AL, 5}, { ON, 1}, { AL, 135}, { ON, 2}, { BN, 1}, { ON, 3}, { ET, 3}, { ON, 5}, { ET, 1}, { CS, 1}, { ET, 1}, { CS, 1}, { ES, 1}, { EN, 10}, { CS, 1}, { ON, 6}, { L, 26}, { ON, 6}, { L, 26}, { ON, 11}, { L, 89}, { ON, 3}, { L, 6}, { ON, 2}, { L, 6}, { ON, 2}, { L, 6}, { ON, 2}, { L, 3}, { ON, 3}, { ET, 2}, { ON, 3}, { ET, 2}, { ON, 9}, { L, 14}, };kfor (k = i - 1; k > j; k--, j++) { temp = from[k]; from[k] = from[j]; from[jnt type = getType(line[i].wc); if (type == R || typesnewn(count, unsigned char); levels = snewn(count, unsigned charnt type = getType(line[i].wc); if (type == R || type == AL) { paragraphLevel = 1; break; } else if (typesfree(types); s Node-path: putty/minibidi.h Node-action: delete Revision-number: 4964 Prop-content-length: 408 Content-length: 408 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-08T19:41:14.349971Z K 7 svn:log V 307 Replace the RLE-based getType() function with one that binary- searches a list of (start,end,type) tuples. This increases data size by about 5Kb, which is a shame; but on the plus side, it boosts performance from O(N) to O(log N). As an added bonus, the table now covers _all_ of Unicode, not just the BMP. PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 59fc353977bc9c4377ac05c1777addbd Text-delta-base-sha1: 5f1cfd47b34009bcb36710f0d88b577dfc8c5659 Text-content-length: 19943 Text-content-md5: e17954f559f9199503d735e0f9f23eca Text-content-sha1: ed32b93fc028c483846a9b0663b8ccb7781a7008 Content-length: 19943 SVNd(&2 #hN/0*Linthe bidi character type of ch. * * The data table in this function is constructed from the Unicode * Character Database, downloadable from unicode.org at the URL * * http://www.unicode.org/Public/UNIDATA/UnicodeData.txt * * by the following fragment of Perl: perl -ne 'split ";"; $num = hex $_[0]; $type = $_[4];' \ -e '$fl = ($_[1] =~ /First/ ? 1 : $_[1] =~ /Last/ ? 2 : 0);' \ -e 'if ($type eq $runtype and ($runend == $num-1 or ' \ -e ' ($fl==2 and $pfl==1))) {$runend = $num;} else { &reset; }' \ -e '$pfl=$fl; END { &reset }; sub reset {' \ -e 'printf" {0x%04x, 0x%04x, %s},\n",$runstart,$runend,$runtype' \ -e ' if defined $runstart and $runtype ne "ON";' \ -e '$runstart=$runend=$num; $runtype=$type;}' \ UnicodeData.txt */ unsigned char getType(int ch) { static const struct { int first, last, type; } lookup[] = { {0x0000, 0x0008, BN}, {0x0009, 0x0009, S}, {0x000a, 0x000a, B}, {0x000b, 0x000b, S}, {0x000c, 0x000c, WS}, {0x000d, 0x000d, B}, {0x000e, 0x001b, BN}, {0x001c, 0x001e, B}, {0x001f, 0x001f, S}, {0x0020, 0x0020, WS}, {0x0023, 0x0025, ET}, {0x002b, 0x002b, ES}, {0x002c, 0x002c, CS}, {0x002d, 0x002d, ES}, {0x002e, 0x002f, CS}, {0x0030, 0x0039, EN}, {0x003a, 0x003a, CS}, {0x0041, 0x005a, L}, {0x0061, 0x007a, L}, {0x007f, 0x0084, BN}, {0x0085, 0x0085, B}, {0x0086, 0x009f, BN}, {0x00a0, 0x00a0, CS}, {0x00a2, 0x00a5, ET}, {0x00aa, 0x00aa, L}, {0x00ad, 0x00ad, BN}, {0x00b0, 0x00b1, ET}, {0x00b2, 0x00b3, EN}, {0x00b5, 0x00b5, L}, {0x00b9, 0x00b9, EN}, {0x00ba, 0x00ba, L}, {0x00c0, 0x00d6, L}, {0x00d8, 0x00f6, L}, {0x00f8, 0x0236, L}, {0x0250, 0x02b8, L}, {0x02bb, 0x02c1, L}, {0x02d0, 0x02d1, L}, {0x02e0, 0x02e4, L}, {0x02ee, 0x02ee, L}, {0x0300, 0x0357, NSM}, {0x035d, 0x036f, NSM}, {0x037a, 0x037a, L}, {0x0386, 0x0386, L}, {0x0388, 0x038a, L}, {0x038c, 0x038c, L}, {0x038e, 0x03a1, L}, {0x03a3, 0x03ce, L}, {0x03d0, 0x03f5, L}, {0x03f7, 0x03fb, L}, {0x0400, 0x0482, L}, {0x0483, 0x0486, NSM}, {0x0488, 0x0489, NSM}, {0x048a, 0x04ce, L}, {0x04d0, 0x04f5, L}, {0x04f8, 0x04f9, L}, {0x0500, 0x050f, L}, {0x0531, 0x0556, L}, {0x0559, 0x055f, L}, {0x0561, 0x0587, L}, {0x0589, 0x0589, L}, {0x0591, 0x05a1, NSM}, {0x05a3, 0x05b9, NSM}, {0x05bb, 0x05bd, NSM}, {0x05be, 0x05be, R}, {0x05bf, 0x05bf, NSM}, {0x05c0, 0x05c0, R}, {0x05c1, 0x05c2, NSM}, {0x05c3, 0x05c3, R}, {0x05c4, 0x05c4, NSM}, {0x05d0, 0x05ea, R}, {0x05f0, 0x05f4, R}, {0x0600, 0x0603, AL}, {0x060c, 0x060c, CS}, {0x060d, 0x060d, AL}, {0x0610, 0x0615, NSM}, {0x061b, 0x061b, AL}, {0x061f, 0x061f, AL}, {0x0621, 0x063a, AL}, {0x0640, 0x064a, AL}, {0x064b, 0x0658, NSM}, {0x0660, 0x0669, AN}, {0x066a, 0x066a, ET}, {0x066b, 0x066c, AN}, {0x066d, 0x066f, AL}, {0x0670, 0x0670, NSM}, {0x0671, 0x06d5, AL}, {0x06d6, 0x06dc, NSM}, {0x06dd, 0x06dd, AL}, {0x06de, 0x06e4, NSM}, {0x06e5, 0x06e6, AL}, {0x06e7, 0x06e8, NSM}, {0x06ea, 0x06ed, NSM}, {0x06ee, 0x06ef, AL}, {0x06f0, 0x06f9, EN}, {0x06fa, 0x070d, AL}, {0x070f, 0x070f, BN}, {0x0710, 0x0710, AL}, {0x0711, 0x0711, NSM}, {0x0712, 0x072f, AL}, {0x0730, 0x074a, NSM}, {0x074d, 0x074f, AL}, {0x0780, 0x07a5, AL}, {0x07a6, 0x07b0, NSM}, {0x07b1, 0x07b1, AL}, {0x0901, 0x0902, NSM}, {0x0903, 0x0939, L}, {0x093c, 0x093c, NSM}, {0x093d, 0x0940, L}, {0x0941, 0x0948, NSM}, {0x0949, 0x094c, L}, {0x094d, 0x094d, NSM}, {0x0950, 0x0950, L}, {0x0951, 0x0954, NSM}, {0x0958, 0x0961, L}, {0x0962, 0x0963, NSM}, {0x0964, 0x0970, L}, {0x0981, 0x0981, NSM}, {0x0982, 0x0983, L}, {0x0985, 0x098c, L}, {0x098f, 0x0990, L}, {0x0993, 0x09a8, L}, {0x09aa, 0x09b0, L}, {0x09b2, 0x09b2, L}, {0x09b6, 0x09b9, L}, {0x09bc, 0x09bc, NSM}, {0x09bd, 0x09c0, L}, {0x09c1, 0x09c4, NSM}, {0x09c7, 0x09c8, L}, {0x09cb, 0x09cc, L}, {0x09cd, 0x09cd, NSM}, {0x09d7, 0x09d7, L}, {0x09dc, 0x09dd, L}, {0x09df, 0x09e1, L}, {0x09e2, 0x09e3, NSM}, {0x09e6, 0x09f1, L}, {0x09f2, 0x09f3, ET}, {0x09f4, 0x09fa, L}, {0x0a01, 0x0a02, NSM}, {0x0a03, 0x0a03, L}, {0x0a05, 0x0a0a, L}, {0x0a0f, 0x0a10, L}, {0x0a13, 0x0a28, L}, {0x0a2a, 0x0a30, L}, {0x0a32, 0x0a33, L}, {0x0a35, 0x0a36, L}, {0x0a38, 0x0a39, L}, {0x0a3c, 0x0a3c, NSM}, {0x0a3e, 0x0a40, L}, {0x0a41, 0x0a42, NSM}, {0x0a47, 0x0a48, NSM}, {0x0a4b, 0x0a4d, NSM}, {0x0a59, 0x0a5c, L}, {0x0a5e, 0x0a5e, L}, {0x0a66, 0x0a6f, L}, {0x0a70, 0x0a71, NSM}, {0x0a72, 0x0a74, L}, {0x0a81, 0x0a82, NSM}, {0x0a83, 0x0a83, L}, {0x0a85, 0x0a8d, L}, {0x0a8f, 0x0a91, L}, {0x0a93, 0x0aa8, L}, {0x0aaa, 0x0ab0, L}, {0x0ab2, 0x0ab3, L}, {0x0ab5, 0x0ab9, L}, {0x0abc, 0x0abc, NSM}, {0x0abd, 0x0ac0, L}, {0x0ac1, 0x0ac5, NSM}, {0x0ac7, 0x0ac8, NSM}, {0x0ac9, 0x0ac9, L}, {0x0acb, 0x0acc, L}, {0x0acd, 0x0acd, NSM}, {0x0ad0, 0x0ad0, L}, {0x0ae0, 0x0ae1, L}, {0x0ae2, 0x0ae3, NSM}, {0x0ae6, 0x0aef, L}, {0x0af1, 0x0af1, ET}, {0x0b01, 0x0b01, NSM}, {0x0b02, 0x0b03, L}, {0x0b05, 0x0b0c, L}, {0x0b0f, 0x0b10, L}, {0x0b13, 0x0b28, L}, {0x0b2a, 0x0b30, L}, {0x0b32, 0x0b33, L}, {0x0b35, 0x0b39, L}, {0x0b3c, 0x0b3c, NSM}, {0x0b3d, 0x0b3e, L}, {0x0b3f, 0x0b3f, NSM}, {0x0b40, 0x0b40, L}, {0x0b41, 0x0b43, NSM}, {0x0b47, 0x0b48, L}, {0x0b4b, 0x0b4c, L}, {0x0b4d, 0x0b4d, NSM}, {0x0b56, 0x0b56, NSM}, {0x0b57, 0x0b57, L}, {0x0b5c, 0x0b5d, L}, {0x0b5f, 0x0b61, L}, {0x0b66, 0x0b71, L}, {0x0b82, 0x0b82, NSM}, {0x0b83, 0x0b83, L}, {0x0b85, 0x0b8a, L}, {0x0b8e, 0x0b90, L}, {0x0b92, 0x0b95, L}, {0x0b99, 0x0b9a, L}, {0x0b9c, 0x0b9c, L}, {0x0b9e, 0x0b9f, L}, {0x0ba3, 0x0ba4, L}, {0x0ba8, 0x0baa, L}, {0x0bae, 0x0bb5, L}, {0x0bb7, 0x0bb9, L}, {0x0bbe, 0x0bbf, L}, {0x0bc0, 0x0bc0, NSM}, {0x0bc1, 0x0bc2, L}, {0x0bc6, 0x0bc8, L}, {0x0bca, 0x0bcc, L}, {0x0bcd, 0x0bcd, NSM}, {0x0bd7, 0x0bd7, L}, {0x0be7, 0x0bf2, L}, {0x0bf9, 0x0bf9, ET}, {0x0c01, 0x0c03, L}, {0x0c05, 0x0c0c, L}, {0x0c0e, 0x0c10, L}, {0x0c12, 0x0c28, L}, {0x0c2a, 0x0c33, L}, {0x0c35, 0x0c39, L}, {0x0c3e, 0x0c40, NSM}, {0x0c41, 0x0c44, L}, {0x0c46, 0x0c48, NSM}, {0x0c4a, 0x0c4d, NSM}, {0x0c55, 0x0c56, NSM}, {0x0c60, 0x0c61, L}, {0x0c66, 0x0c6f, L}, {0x0c82, 0x0c83, L}, {0x0c85, 0x0c8c, L}, {0x0c8e, 0x0c90, L}, {0x0c92, 0x0ca8, L}, {0x0caa, 0x0cb3, L}, {0x0cb5, 0x0cb9, L}, {0x0cbc, 0x0cbc, NSM}, {0x0cbd, 0x0cc4, L}, {0x0cc6, 0x0cc8, L}, {0x0cca, 0x0ccb, L}, {0x0ccc, 0x0ccd, NSM}, {0x0cd5, 0x0cd6, L}, {0x0cde, 0x0cde, L}, {0x0ce0, 0x0ce1, L}, {0x0ce6, 0x0cef, L}, {0x0d02, 0x0d03, L}, {0x0d05, 0x0d0c, L}, {0x0d0e, 0x0d10, L}, {0x0d12, 0x0d28, L}, {0x0d2a, 0x0d39, L}, {0x0d3e, 0x0d40, L}, {0x0d41, 0x0d43, NSM}, {0x0d46, 0x0d48, L}, {0x0d4a, 0x0d4c, L}, {0x0d4d, 0x0d4d, NSM}, {0x0d57, 0x0d57, L}, {0x0d60, 0x0d61, L}, {0x0d66, 0x0d6f, L}, {0x0d82, 0x0d83, L}, {0x0d85, 0x0d96, L}, {0x0d9a, 0x0db1, L}, {0x0db3, 0x0dbb, L}, {0x0dbd, 0x0dbd, L}, {0x0dc0, 0x0dc6, L}, {0x0dca, 0x0dca, NSM}, {0x0dcf, 0x0dd1, L}, {0x0dd2, 0x0dd4, NSM}, {0x0dd6, 0x0dd6, NSM}, {0x0dd8, 0x0ddf, L}, {0x0df2, 0x0df4, L}, {0x0e01, 0x0e30, L}, {0x0e31, 0x0e31, NSM}, {0x0e32, 0x0e33, L}, {0x0e34, 0x0e3a, NSM}, {0x0e3f, 0x0e3f, ET}, {0x0e40, 0x0e46, L}, {0x0e47, 0x0e4e, NSM}, {0x0e4f, 0x0e5b, L}, {0x0e81, 0x0e82, L}, {0x0e84, 0x0e84, L}, {0x0e87, 0x0e88, L}, {0x0e8a, 0x0e8a, L}, {0x0e8d, 0x0e8d, L}, {0x0e94, 0x0e97, L}, {0x0e99, 0x0e9f, L}, {0x0ea1, 0x0ea3, L}, {0x0ea5, 0x0ea5, L}, {0x0ea7, 0x0ea7, L}, {0x0eaa, 0x0eab, L}, {0x0ead, 0x0eb0, L}, {0x0eb1, 0x0eb1, NSM}, {0x0eb2, 0x0eb3, L}, {0x0eb4, 0x0eb9, NSM}, {0x0ebb, 0x0ebc, NSM}, {0x0ebd, 0x0ebd, L}, {0x0ec0, 0x0ec4, L}, {0x0ec6, 0x0ec6, L}, {0x0ec8, 0x0ecd, NSM}, {0x0ed0, 0x0ed9, L}, {0x0edc, 0x0edd, L}, {0x0f00, 0x0f17, L}, {0x0f18, 0x0f19, NSM}, {0x0f1a, 0x0f34, L}, {0x0f35, 0x0f35, NSM}, {0x0f36, 0x0f36, L}, {0x0f37, 0x0f37, NSM}, {0x0f38, 0x0f38, L}, {0x0f39, 0x0f39, NSM}, {0x0f3e, 0x0f47, L}, {0x0f49, 0x0f6a, L}, {0x0f71, 0x0f7e, NSM}, {0x0f7f, 0x0f7f, L}, {0x0f80, 0x0f84, NSM}, {0x0f85, 0x0f85, L}, {0x0f86, 0x0f87, NSM}, {0x0f88, 0x0f8b, L}, {0x0f90, 0x0f97, NSM}, {0x0f99, 0x0fbc, NSM}, {0x0fbe, 0x0fc5, L}, {0x0fc6, 0x0fc6, NSM}, {0x0fc7, 0x0fcc, L}, {0x0fcf, 0x0fcf, L}, {0x1000, 0x1021, L}, {0x1023, 0x1027, L}, {0x1029, 0x102a, L}, {0x102c, 0x102c, L}, {0x102d, 0x1030, NSM}, {0x1031, 0x1031, L}, {0x1032, 0x1032, NSM}, {0x1036, 0x1037, NSM}, {0x1038, 0x1038, L}, {0x1039, 0x1039, NSM}, {0x1040, 0x1057, L}, {0x1058, 0x1059, NSM}, {0x10a0, 0x10c5, L}, {0x10d0, 0x10f8, L}, {0x10fb, 0x10fb, L}, {0x1100, 0x1159, L}, {0x115f, 0x11a2, L}, {0x11a8, 0x11f9, L}, {0x1200, 0x1206, L}, {0x1208, 0x1246, L}, {0x1248, 0x1248, L}, {0x124a, 0x124d, L}, {0x1250, 0x1256, L}, {0x1258, 0x1258, L}, {0x125a, 0x125d, L}, {0x1260, 0x1286, L}, {0x1288, 0x1288, L}, {0x128a, 0x128d, L}, {0x1290, 0x12ae, L}, {0x12b0, 0x12b0, L}, {0x12b2, 0x12b5, L}, {0x12b8, 0x12be, L}, {0x12c0, 0x12c0, L}, {0x12c2, 0x12c5, L}, {0x12c8, 0x12ce, L}, {0x12d0, 0x12d6, L}, {0x12d8, 0x12ee, L}, {0x12f0, 0x130e, L}, {0x1310, 0x1310, L}, {0x1312, 0x1315, L}, {0x1318, 0x131e, L}, {0x1320, 0x1346, L}, {0x1348, 0x135a, L}, {0x1361, 0x137c, L}, {0x13a0, 0x13f4, L}, {0x1401, 0x1676, L}, {0x1680, 0x1680, WS}, {0x1681, 0x169a, L}, {0x16a0, 0x16f0, L}, {0x1700, 0x170c, L}, {0x170e, 0x1711, L}, {0x1712, 0x1714, NSM}, {0x1720, 0x1731, L}, {0x1732, 0x1734, NSM}, {0x1735, 0x1736, L}, {0x1740, 0x1751, L}, {0x1752, 0x1753, NSM}, {0x1760, 0x176c, L}, {0x176e, 0x1770, L}, {0x1772, 0x1773, NSM}, {0x1780, 0x17b6, L}, {0x17b7, 0x17bd, NSM}, {0x17be, 0x17c5, L}, {0x17c6, 0x17c6, NSM}, {0x17c7, 0x17c8, L}, {0x17c9, 0x17d3, NSM}, {0x17d4, 0x17da, L}, {0x17db, 0x17db, ET}, {0x17dc, 0x17dc, L}, {0x17dd, 0x17dd, NSM}, {0x17e0, 0x17e9, L}, {0x180b, 0x180d, NSM}, {0x180e, 0x180e, WS}, {0x1810, 0x1819, L}, {0x1820, 0x1877, L}, {0x1880, 0x18a8, L}, {0x18a9, 0x18a9, NSM}, {0x1900, 0x191c, L}, {0x1920, 0x1922, NSM}, {0x1923, 0x1926, L}, {0x1927, 0x192b, NSM}, {0x1930, 0x1931, L}, {0x1932, 0x1932, NSM}, {0x1933, 0x1938, L}, {0x1939, 0x193b, NSM}, {0x1946, 0x196d, L}, {0x1970, 0x1974, L}, {0x1d00, 0x1d6b, L}, {0x1e00, 0x1e9b, L}, {0x1ea0, 0x1ef9, L}, {0x1f00, 0x1f15, L}, {0x1f18, 0x1f1d, L}, {0x1f20, 0x1f45, L}, {0x1f48, 0x1f4d, L}, {0x1f50, 0x1f57, L}, {0x1f59, 0x1f59, L}, {0x1f5b, 0x1f5b, L}, {0x1f5d, 0x1f5d, L}, {0x1f5f, 0x1f7d, L}, {0x1f80, 0x1fb4, L}, {0x1fb6, 0x1fbc, L}, {0x1fbe, 0x1fbe, L}, {0x1fc2, 0x1fc4, L}, {0x1fc6, 0x1fcc, L}, {0x1fd0, 0x1fd3, L}, {0x1fd6, 0x1fdb, L}, {0x1fe0, 0x1fec, L}, {0x1ff2, 0x1ff4, L}, {0x1ff6, 0x1ffc, L}, {0x2000, 0x200a, WS}, {0x200b, 0x200d, BN}, {0x200e, 0x200e, L}, {0x200f, 0x200f, R}, {0x2028, 0x2028, WS}, {0x2029, 0x2029, B}, {0x202a, 0x202a, LRE}, {0x202b, 0x202b, RLE}, {0x202c, 0x202c, PDF}, {0x202d, 0x202d, LRO}, {0x202e, 0x202e, RLO}, {0x202f, 0x202f, WS}, {0x2030, 0x2034, ET}, {0x2044, 0x2044, CS}, {0x205f, 0x205f, WS}, {0x2060, 0x2063, BN}, {0x206a, 0x206f, BN}, {0x2070, 0x2070, EN}, {0x2071, 0x2071, L}, {0x2074, 0x2079, EN}, {0x207a, 0x207b, ET}, {0x207f, 0x207f, L}, {0x2080, 0x2089, EN}, {0x208a, 0x208b, ET}, {0x20a0, 0x20b1, ET}, {0x20d0, 0x20ea, NSM}, {0x2102, 0x2102, L}, {0x2107, 0x2107, L}, {0x210a, 0x2113, L}, {0x2115, 0x2115, L}, {0x2119, 0x211d, L}, {0x2124, 0x2124, L}, {0x2126, 0x2126, L}, {0x2128, 0x2128, L}, {0x212a, 0x212d, L}, {0x212e, 0x212e, ET}, {0x212f, 0x2131, L}, {0x2133, 0x2139, L}, {0x213d, 0x213f, L}, {0x2145, 0x2149, L}, {0x2160, 0x2183, L}, {0x2212, 0x2213, ET}, {0x2336, 0x237a, L}, {0x2395, 0x2395, L}, {0x2488, 0x249b, EN}, {0x249c, 0x24e9, L}, {0x2800, 0x28ff, L}, {0x3000, 0x3000, WS}, {0x3005, 0x3007, L}, {0x3021, 0x3029, L}, {0x302a, 0x302f, NSM}, {0x3031, 0x3035, L}, {0x3038, 0x303c, L}, {0x3041, 0x3096, L}, {0x3099, 0x309a, NSM}, {0x309d, 0x309f, L}, {0x30a1, 0x30fa, L}, {0x30fc, 0x30ff, L}, {0x3105, 0x312c, L}, {0x3131, 0x318e, L}, {0x3190, 0x31b7, L}, {0x31f0, 0x321c, L}, {0x3220, 0x3243, L}, {0x3260, 0x327b, L}, {0x327f, 0x32b0, L}, {0x32c0, 0x32cb, L}, {0x32d0, 0x32fe, L}, {0x3300, 0x3376, L}, {0x337b, 0x33dd, L}, {0x33e0, 0x33fe, L}, {0x3400, 0x4db5, L}, {0x4e00, 0x9fa5, L}, {0xa000, 0xa48c, L}, {0xac00, 0xd7a3, L}, {0xd800, 0xfa2d, L}, {0xfa30, 0xfa6a, L}, {0xfb00, 0xfb06, L}, {0xfb13, 0xfb17, L}, {0xfb1d, 0xfb1d, R}, {0xfb1e, 0xfb1e, NSM}, {0xfb1f, 0xfb28, R}, {0xfb29, 0xfb29, ET}, {0xfb2a, 0xfb36, R}, {0xfb38, 0xfb3c, R}, {0xfb3e, 0xfb3e, R}, {0xfb40, 0xfb41, R}, {0xfb43, 0xfb44, R}, {0xfb46, 0xfb4f, R}, {0xfb50, 0xfbb1, AL}, {0xfbd3, 0xfd3d, AL}, {0xfd50, 0xfd8f, AL}, {0xfd92, 0xfdc7, AL}, {0xfdf0, 0xfdfc, AL}, {0xfe00, 0xfe0f, NSM}, {0xfe20, 0xfe23, NSM}, {0xfe50, 0xfe50, CS}, {0xfe52, 0xfe52, CS}, {0xfe55, 0xfe55, CS}, {0xfe5f, 0xfe5f, ET}, {0xfe62, 0xfe63, ET}, {0xfe69, 0xfe6a, ET}, {0xfe70, 0xfe74, AL}, {0xfe76, 0xfefc, AL}, {0xfeff, 0xfeff, BN}, {0xff03, 0xff05, ET}, {0xff0b, 0xff0b, ET}, {0xff0c, 0xff0c, CS}, {0xff0d, 0xff0d, ET}, {0xff0e, 0xff0e, CS}, {0xff0f, 0xff0f, ES}, {0xff10, 0xff19, EN}, {0xff1a, 0xff1a, CS}, {0xff21, 0xff3a, L}, {0xff41, 0xff5a, L}, {0xff66, 0xffbe, L}, {0xffc2, 0xffc7, L}, {0xffca, 0xffcf, L}, {0xffd2, 0xffd7, L}, {0xffda, 0xffdc, L}, {0xffe0, 0xffe1, ET}, {0xffe5, 0xffe6, ET}, {0x10000, 0x1000b, L}, {0x1000d, 0x10026, L}, {0x10028, 0x1003a, L}, {0x1003c, 0x1003d, L}, {0x1003f, 0x1004d, L}, {0x10050, 0x1005d, L}, {0x10080, 0x100fa, L}, {0x10100, 0x10100, L}, {0x10102, 0x10102, L}, {0x10107, 0x10133, L}, {0x10137, 0x1013f, L}, {0x10300, 0x1031e, L}, {0x10320, 0x10323, L}, {0x10330, 0x1034a, L}, {0x10380, 0x1039d, L}, {0x1039f, 0x1039f, L}, {0x10400, 0x1049d, L}, {0x104a0, 0x104a9, L}, {0x10800, 0x10805, R}, {0x10808, 0x10808, R}, {0x1080a, 0x10835, R}, {0x10837, 0x10838, R}, {0x1083c, 0x1083c, R}, {0x1083f, 0x1083f, R}, {0x1d000, 0x1d0f5, L}, {0x1d100, 0x1d126, L}, {0x1d12a, 0x1d166, L}, {0x1d167, 0x1d169, NSM}, {0x1d16a, 0x1d172, L}, {0x1d173, 0x1d17a, BN}, {0x1d17b, 0x1d182, NSM}, {0x1d183, 0x1d184, L}, {0x1d185, 0x1d18b, NSM}, {0x1d18c, 0x1d1a9, L}, {0x1d1aa, 0x1d1ad, NSM}, {0x1d1ae, 0x1d1dd, L}, {0x1d400, 0x1d454, L}, {0x1d456, 0x1d49c, L}, {0x1d49e, 0x1d49f, L}, {0x1d4a2, 0x1d4a2, L}, {0x1d4a5, 0x1d4a6, L}, {0x1d4a9, 0x1d4ac, L}, {0x1d4ae, 0x1d4b9, L}, {0x1d4bb, 0x1d4bb, L}, {0x1d4bd, 0x1d4c3, L}, {0x1d4c5, 0x1d505, L}, {0x1d507, 0x1d50a, L}, {0x1d50d, 0x1d514, L}, {0x1d516, 0x1d51c, L}, {0x1d51e, 0x1d539, L}, {0x1d53b, 0x1d53e, L}, {0x1d540, 0x1d544, L}, {0x1d546, 0x1d546, L}, {0x1d54a, 0x1d550, L}, {0x1d552, 0x1d6a3, L}, {0x1d6a8, 0x1d7c9, L}, {0x1d7ce, 0x1d7ff, EN}, {0x20000, 0x2a6d6, L}, {0x2f800, 0x2fa1d, L}, {0xe0001, 0xe0001, BN}, {0xe0020, 0xe007f, BN}, {0xe0100, 0xe01ef, NSM}, {0xf0000, 0xffffd, L}, {0x100000, 0x10fffd, L}, }; int i, j, k; i = -1; j = lenof(lookup); while (j - i > 2) { k = (i + j) / 2; if (ch < lookup[k].first) j = k; else if (ch > lookup[k].last) i = k; else return lookup[k].type; } /* * If we reach here, the character was not in any of the * intervals listed in the lookup table. This means we return * ON (`Other Neutrals'). This is the appropriate code for any * character genuinely not listed in the Unicode table, and * also the table above has deliberately left out any * characters _explicitly_ listed as ON (to save space!). */ return ON Revision-number: 4965 Prop-content-length: 275 Content-length: 275 K 8 svn:date V 27 2004-12-10T11:41:14.808682Z K 7 svn:log V 174 Unix PSCP was tight-looping when connecting through a ProxyCommand. Turned out that sk_localproxy_close() was closing the pipe fds without removing them from the uxsel list. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d76fac038f05f0a5ff449e0bc5fefcda Text-delta-base-sha1: 3c384eba7aefa890006bb427fef50fb51b23e95c Text-content-length: 72 Text-content-md5: c60eca2d749ad45b1540067088dc4546 Text-content-sha1: 10f1e8e4b3e9763ce9584839fa82a5f4802cc787 Content-length: 72 SVN E 3-e(uxsel_del(ps->to_cmd); uxsel_del(ps->from_cmd); Revision-number: 4966 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.653513Z PROPS-END Revision-number: 4967 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.662634Z PROPS-END Revision-number: 4968 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.671617Z PROPS-END Revision-number: 4969 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.681136Z PROPS-END Revision-number: 4970 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.690489Z PROPS-END Revision-number: 4971 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.699893Z PROPS-END Revision-number: 4972 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2004-12-11T10:08:38.473448Z K 7 svn:log V 42 Add putty-svn.dump.gz to the ignore list. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 113 Content-length: 113 K 10 svn:ignore V 81 old*.html 0.* wishlist faq.html feedback.html putty-cvs.tar.gz putty-svn.dump.gz PROPS-END Revision-number: 4973 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.725753Z PROPS-END Revision-number: 4974 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.735626Z PROPS-END Revision-number: 4975 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.744813Z PROPS-END Revision-number: 4976 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.754206Z PROPS-END Revision-number: 4977 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.764644Z PROPS-END Revision-number: 4978 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:48.774285Z PROPS-END Revision-number: 4979 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2004-12-13T12:18:07.114083Z K 7 svn:log V 19 putty.freelamp.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5bb707a0d7ca090ed4ee16cb24fd7967 Text-delta-base-sha1: 4726dbba0d3d5138dcc9e8b851d94c8ce6b0a430 Text-content-length: 72 Text-content-md5: 5157c86af91246e27d0e118f8159305a Text-content-sha1: b7e552b9fe6536cf0bc57872f59febf1a84637eb Content-length: 72 SVN?.-}A?C|reelamp.com/">putty.freelamp.com in China Revision-number: 4980 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:49.000187Z PROPS-END Revision-number: 4981 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:49.009705Z PROPS-END Revision-number: 4982 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:49.019666Z PROPS-END Revision-number: 4983 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:49.031002Z PROPS-END Revision-number: 4984 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:49.041124Z PROPS-END Revision-number: 4985 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:49.053117Z PROPS-END Revision-number: 4986 Prop-content-length: 111 Content-length: 111 K 7 svn:log V 11 Add CVE ID K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-12-14T13:03:28.511577Z PROPS-END Node-path: putty-wishlist/data/vuln-ssh2-debug Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cc0bb46a8290b6e8b775a87edca3ca9b Text-delta-base-sha1: 5fbf9bbf42edc4be01908161007df8b5d5e7ffd3 Text-content-length: 118 Text-content-md5: fe27e375f941576b6047e21eb23ec477 Text-content-sha1: f5b2732189ffdf484514d05940440c3a47f62716 Content-length: 118 SVNvY b<b;; CVE ID CAN-2004-1008 an Revision-number: 4987 Prop-content-length: 344 Content-length: 344 K 8 svn:date V 27 2004-12-16T15:01:43.443150Z K 7 svn:log V 243 Rename scp.* to pscp.*, because I always misspell it that way. Also it's more consistent with PSFTP like this: scp.c/pscp.c is more similar to psftp.c (the main application framework) than it is to sftp.c (a set of back-end library routines). K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 867bf82a9f9559fc5419f7b3eb8b410f Text-delta-base-sha1: eca82e52eb4b9e1a318db179fd6d6b0ab4f05cdf Text-content-length: 178 Text-content-md5: 4065f9c79fff72a374db71410b7b6508 Text-content-sha1: 91b6e1b0b251f1b0c082a8c4dd0c7c453b7d82e1 Content-length: 178 SVNW[qTpscp winsftp wincons WINSSH BE_SSH SFTP wildcard WINMISC + pscp.res LIBS psftp : [C] psftp winsftp wincons WINSSH BE_SSH SFTP WINMISC pp Node-path: putty/pscp.c Node-kind: file Node-action: add Node-copyfrom-rev: 4986 Node-copyfrom-path: putty/scp.c Text-copy-source-md5: 8cbc03e0e27f27cfdd0a5a3cd0b3dbaa Text-copy-source-sha1: 7fdf91c2ade90e715448a42ebe6c5d1087ad33a1 Node-path: putty/windows/pscp.ico Node-kind: file Node-action: add Node-copyfrom-rev: 4986 Node-copyfrom-path: putty/windows/scp.ico Text-copy-source-md5: 401b5a0ee63cc6d9d0346d2c1270f718 Text-copy-source-sha1: 14176796b0ca4e635d0a4757f80ea1198d1de089 Node-path: putty/windows/pscp.rc Node-kind: file Node-action: add Node-copyfrom-rev: 4986 Node-copyfrom-path: putty/windows/scp.rc Text-copy-source-md5: 3f5ca2ffc5a0ab8ce79ec50398e0ab40 Text-copy-source-sha1: e96499dad88d0e1819c6151109efae012beee0cd Text-delta: true Text-delta-base-md5: 3f5ca2ffc5a0ab8ce79ec50398e0ab40 Text-delta-base-sha1: e96499dad88d0e1819c6151109efae012beee0cd Text-content-length: 31 Text-content-md5: 024a69b7abec99f61efa1b5c073bf483 Text-content-sha1: a688c50ad7b7268fa3d7bbc5b2678eceb257b2e7 Content-length: 31 SVN200 ICON "pscp.ico" Node-path: putty/windows/scp.ico Node-action: delete Node-path: putty/windows/scp.rc Node-action: delete Node-path: putty/scp.c Node-action: delete Revision-number: 4988 Prop-content-length: 280 Content-length: 280 K 8 svn:date V 27 2004-12-16T15:22:36.112990Z K 7 svn:log V 179 Abe Crabtree complains that flushing the log file as often as we do in 0.56 results in unacceptable performance for him on Win2000. Add a checkbox to revert to the old behaviour. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fe67fc19b27459da17a6e9882eb4aa6 Text-delta-base-sha1: e0cb76da4eebf8fc7cfc947c1674f53ec055c8d6 Text-content-length: 167 Text-content-md5: 5d3ae0675023d3b2504e9329362e5c26 Text-content-sha1: 5435080003c0071206e6949e3e6063bf54677097 Content-length: 167 SVNly _ \ ctrl_checkbox(s, "Flush log file frequently", 'u', HELPCTX(logging_flush), dlg_stdcheckbox_handler, I(offsetof(Config,logflush)) Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cd8a4b37e77482629b2c2bc8e874c7d4 Text-delta-base-sha1: bf90fe3a39cce5cc7e502d3086d4b379f3718265 Text-content-length: 1450 Text-content-md5: c98216cc0e4f550f26deacbab69f6b2b Text-content-sha1: f5c86f6a0609f9b2e3681547c728f3aeb210f68b Content-length: 1450 SVN 767&flush} \q{Flush log file frequently} \cfg{winhelp-topic}{logging.flush} This option allows you to control how frequently logged data is flushed to disc. By default, PuTTY will flush data as soon as it is displayed, so that if you view the log file while a session is still open, it will be up to date; and if the client system crashes, there's a greater chance that the data will be preserved. However, this can incur a performance penalty. If PuTTY is running slowly with logging enabled, you could try unchecking this option. Be warned that the log file may not always be up to date as a result (although it will of course be flushed when it is closed, for instance at the end of a session):GG:different way. If public-key authentication mysteriously does not work but the Event Log (see \k{using-eventlog}) thinks it has successfully sent a signature, it might be worth enabling the workaround for this bug to see if it helps. If this bug is detected, PuTTY will sign data in the way OpenSSH expects. If this bug is enabled when talking to a correct server, SSH2 public-key authentication will fail. This is an SSH2-specific bug. \H{config-file} Storing configuration in a file PuTTY does not currently support storing its configuration in a file instead of the Registry. However, you can work around this with a couple of batch files. You will need a file called (say) \c{PUTTY.BAT} which imports t Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: acf0045aecab590d74c0ff05fa9cd113 Text-delta-base-sha1: 0ee1adfa0d370e8d48683a377a0ac74f6b4127be Text-content-length: 28 Text-content-md5: 8bafb78b9d72dae973c99ae6060b507b Text-content-sha1: 494b6465d65892a82de90eaf3a6e3383c9d0578e Content-length: 28 SVN) u/hflush Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 535fe6c600fcd99f4c1c8f7952fb9f98 Text-delta-base-sha1: 982f4bda6c20cd65407065660ca72845289ebc0a Text-content-length: 81 Text-content-md5: 7352d63d37f285bab1d37ca72e6b9439 Text-content-sha1: 0e7068a3183e0bcabf96d59c076c10c46b2df835 Content-length: 81 SVN&4t{MYLogFlush", cfg->logflushLogFlush", 1, &cfg->logflush Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ecb2d40037c6e1eab465fc2ff2c9d99a Text-delta-base-sha1: 5fc9798045e8abcc0d516b662c31be3521419012 Text-content-length: 67 Text-content-md5: 796714fc13bad23a0d22ef02e106145a Text-content-sha1: 1f0c683e717defca60d94165ad742e2216cfda3b Content-length: 67 SVNh Pif (term->cfg.logflush) Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4b6f714451003b4f795cbc25fdb48b54 Text-delta-base-sha1: a98b6825c723bc1d44740e6bbb383bcce2a719a7 Text-content-length: 41 Text-content-md5: 46fd662079e4bf01ba63db220b272591 Text-content-sha1: b9635e671aad14cef7a024b8254b03fb369e8eee Content-length: 41 SVNO :cflush "logging.flush Node-path: putty-wishlist/data/log-flush Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c4b5b4d09d1d7a4c630ba49c485fd5e7 Text-delta-base-sha1: 7db3ba1a8caf5b88fb703c445ab00816a65227e9 Text-content-length: 165 Text-content-md5: 658522887b8f1c228ab490b970b599d0 Text-content-sha1: 321e226d1c42772609acccf9914b0058a88fa77c Content-length: 165 SVNXjX Update, 2004-12-16: we've had one complaint about the performance hit on Windows in 0.56, so I've added a checkbox to restore the old behaviour. Revision-number: 4989 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2004-12-16T15:38:39.958920Z K 7 svn:log V 37 Fix obviously stupid segfault. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3783b8c9c992b572ebbd810d9bfb6c5c Text-delta-base-sha1: c450a901daba8a1c2856dadfb6b701c022cd42fe Text-content-length: 112 Text-content-md5: bf3ecb420fbd21a00412d369b63dae8c Text-content-sha1: 7e59e9caff98e1cfaceed1aa08a5d24452d945bf Content-length: 112 SVN}} 9Lxif (ssh->pinger) pinger_free(ssh->pinger); sfree(ssh Revision-number: 4990 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 Support for recursive file transfer in PSFTP. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-16T16:37:37.773357Z PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c079c6056f24f0773f773a1d61277604 Text-delta-base-sha1: 70e8ef0abfde3d8d5ab412e3b3e80e09fd176682 Text-content-length: 700 Text-content-md5: e6947c823558b46321eff7a69b729c35 Text-content-sha1: 9c1b76578e0f2e09a4c09614a1256694b8b96e93 Content-length: 700 SVN1fNjdLGLTo fetch an entire directory recursively, you can use the \c{-r} option: \c get -r mydir \c get -r mydir newname (If you want to fetch a file whose name starts with a hyphen, you may have to use the \c{--} special argument, which stops \c{get} from interpreting anything as a switch after it. For example, \cq{get -- -silly-name-}.)To send an entire directory recursively, you can use the \c{-r} option: \c put -r mydir \c put -r mydir newname (If you want to send a file whose name starts with a hyphen, you may have to use the \c{--} special argument, which stops \c{put} from interpreting anything as a switch after it. For example, \cq{put -- -silly-name-}.) Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9124a147dda3067a36a7e0a7de6bc882 Text-delta-base-sha1: 431a8c7d3c3e8cdd7d88f6371214550be99ddd7d Text-content-length: 9166 Text-content-md5: e664fccf4fd150ca25530bd17cf86aa8 Text-content-sha1: 9c53a6393401c22a3fa53f74ebfae0f80576e725 Content-length: 9166 SVNPVA~TLjv{WQ|h$\}ykwO~Dj DjVIK=}3x~x8d\RFkG_|Q|D%\qjOKww`@8Nww`S2ZcVzDetermine whether a string is entirely composed of dots. */ static int is_dots(char *str) { return str[strspn(str, ".")] == '\0'; } * qsort comparison routine for fxp_name structures. Sorts by real * file name. */ static int sftp_name /* * Likewise, but for a bare char *. */ static int bare_name_compare(const void *av, const void *bv) { const char **a = (const char **) av; const char **b = (const char **) bv; return strcmp(*a, *b);The meat of the `get' and `put' commands. */ int sftp_get_file(char *fname, char *outfname, int recurseuint64 offset; FILE *fp; int ret; /* * In recursive mode, see if we're dealing with a directory. * (If we're not in recursive mode, we need not even check: the * subsequent FXP_OPEN will return a usable error message.) */ if (recurse) { struct fxp_attrs attrs; int result; sftp_register(req = fxp_stat_send( struct fxp_handle *dirhandle; int nnames, namesize; struct fxp_name **ournames; struct fxp_names *names; int i; /* * First, attempt to create the destination directory, * unless it already exists. */ if (file_type(outfname) != FILE_TYPE_DIRECTORY && !create_directory(outfname)) { printf("%s: Cannot create directory\n", outfname); return 0; } /* * Now get the list of filenames in the remote * directory. */ sftp_register(req = fxp_opendir_send(fname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); dirhandle = fxp_opendir_recv(pktin, rreq); if (!dirhandle) { printf("%s: unable to open directory: %s\n", fname, fxp_error()); return 0; } nnames = namesize = 0; ournames = NULL; while (1) { int i; sftp_register(req = fxp_readdir_send(dirhandlnames = fxp_readdir_recv(pktin, rreq); if (names == NULL) { if (fxp_error_type() == SSH_FX_EOF) break; printf("%s: reading directory: %s\n", fname, fxp_error()); sfree(ournames); return 0; } if (names->nnames == 0) { fxp_free_names(names); break; } if (nnames + names->nnames >= namesize) { namesize += names->nnames + 128; ournames = sresize(ournames, namesize, struct fxp_name *); } for (i = 0; i < names->nnames; i++) if (!is_dots(names->names[i].filename)) ournames[nnames++] = fxp_dup_name(&names->names[i]); fxp_free_names(names); } sftp_register(req = fxp_close_send(dirhandle)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); fxp_close_recv(pktin, rreq); /* * Sort the names into a clear order. This ought to * make things more predictable when we're doing a * reget of the same directory, just in case two * readdirs on the same remote directory return a * different order. */ qsort(ournames, nnames, sizeof(*ournames), sftp_name_compare); /* * If we're in restart mode, find the last filename on * this list that already exists. We may have to do a * reget on _that_ file, but shouldn't have to do * anything on the previous files. * * If none of them exists, of course, we start at 0. */ i = 0; while (i < nnames) { char *nextoutfname; int ret; nextoutfname = dir_file_cat(outfname, ournames[i]->filename); ret = (file_type(nextoutfname) == FILE_TYPE_NONEXISTENT); sfree(nextoutfname); if (ret) break; i++; } if (i > 0) i--; /* * Now we're ready to recurse. Starting at ournames[i] * and continuing on to the end of the list, we * construct a new source and target file name, and * call sftp_get_file again. */ for (; i < nnames; i++) { char *nextfname, *nextoutfname; int ret; nextfname = dupcat(fname, "/", ournames[i]->filename, NULL); nextoutfname = dir_file_cat(outfname, ournames[i]->filename); ret = sftp_get_file(nextfname, nextoutfname, recurse, restart); restart = FALSE; /* after first partial file, do full */ sfree(nextoutfname); sfree(nextfname); if (!ret) { for (i = 0; i < nnames; i++) { fxp_free_name(ournames[i]); } sfree(ournames); return 0; } } /* * Done this recursion level. Free everything. */ for (i = 0; i < nnames; i++) { fxp_free_name(ournames[i]); } sfree(ournames); return 1; } }return ret; } int sftp_put_file(char *fname, char *outfname, int recurse/* * In recursive mode, see if we're dealing with a directory. * (If we're not in recursive mode, we need not even check: the * subsequent fopen will return an error message.) */ if (recurse && file_type(fname) == FILE_TYPE_DIRECTORY) { struct fxp_attrs attrs; int result; int nnames, namesize; char *name, **ournames; DirHandle *dh; int i; /* * First, attempt to create the destination directory, * unless it already exists. */ sftp_register(req = fxp_stat_send(ou if (!result || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS) || !(attrs.permissions & 0040000)) { sftp_register(req = fxp_mkdir_send(outfname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_mkdir_recv(pktin, rreq); if (!result) { printf("%s: create directory: %s\n", outfname, fxp_error()); return 0; } } /* * Now get the list of filenames in the local directory. */ dh = open_directory(fname); if (!dh) { printf("%s: unable to open directory\n", fname); return 0; } nnames = namesize = 0; ournames = NULL; while ((name = read_filename(dh)) != NULL) { if (nnames >= namesize) { namesize += 128; ournames = sresize(ournames, namesize, char *); } ournames[nnames++] = name; } close_directory(dh); /* * Sort the names into a clear order. This ought to make * things more predictable when we're doing a reput of the * same directory, just in case two readdirs on the same * local directory return a different order. */ qsort(ournames, nnames, sizeof(*ournames), bare_name_compare); /* * If we're in restart mode, find the last filename on this * list that already exists. We may have to do a reput on * _that_ file, but shouldn't have to do anything on the * previous files. * * If none of them exists, of course, we start at 0. */ i = 0; while (i < nnames) { char *nextoutfname; nextoutfname = dupcat(outfname, "/", ournames[i], NULL); sftp_register(req = fxp_stat_send(nextoutfname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_stat_recv(pktin, rreq, &attrs); sfree(nextoutfname); if (!result) break; i++; } if (i > 0) i--; /* * Now we're ready to recurse. Starting at ournames[i] * and continuing on to the end of the list, we * construct a new source and target file name, and * call sftp_put_file again. */ for (; i < nnames; i++) { char *nextfname, *nextoutfname; int ret; nextfname = dir_file_cat(fname, ournames[i]); nextoutfname = dupcat(outfname, "/", ournames[i], NULL); ret = sftp_put_file(nextfname, nextoutfname, recurse, restart); restart = FALSE; /* after first partial file, do full */ sfree(nextoutfname); sfree(nextfname); if (!ret) { for (i = 0; i < nnames; i++) { sfree(ournames[i]); } sfree(ournames); return 0; } } /* * Done this recursion level. Free everything. */ for (i = 0; i < nnames; i++) { sfree(ournames[i]); } sfree(ournames); return 1 return ret;namechar *fname, *origfname, *outfname; int i, ret; int recurse = FALSE = 1; while (i < cmd->nwords && cmd->words[i][0] == '-') { if (!strcmp(cmd->words[i], "--")) { /* finish processing options */ i++; break; } else if (!strcmp(cmd->words[i], "-r")) { recurse = TRUE; } else { printf("get: unrecognised option '%s'\n", cmd->words[i]); return 0; } i++; } if (i >= cmd->nwordsorigfname = cmd->words[i++]; fname = canonify(origfname); if (!fname) { printf("%s: %s\n", origfname, fxp_error()); return 0; } outfname = (i >= cmd->nwords ? stripslashes(origfname, 0) : cmd->words[i++]); ret = sftp_get_file(fname, outfname, recurse, restartchar *fname, *origoutfname, *outfname; int i, ret; int recurse = FALSE = 1; while (i < cmd->nwords && cmd->words[i][0] == '-') { if (!strcmp(cmd->words[i], "--")) { /* finish processing options */ i++; break; } else if (!strcmp(cmd->words[i], "-r")) { recurse = TRUE; } else { printf("put: unrecognised option '%s'\n", cmd->words[i]); return 0; } i++; } if (i >= cmd->nwordsi++]; origoutfname = (i >= cmd->nwords ? stripslashes(fname, 1) : cmd->words[i++ret = sftp_put_file(fname, outfname, recurse, restart); Node-path: putty-wishlist/data/psftp-multi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c1668d6136aa674e95857795a27659f9 Text-delta-base-sha1: 51910aa3e4ec463afc42acffe7ac3548313d81c3 Text-content-length: 156 Text-content-md5: d866847ed0ed421623cf9a3d354fe055 Text-content-sha1: c594434308fed832bfeeaed3ef083460e4f1a08b Content-length: 156 SVNv v

    SGT, 2004-12-16: Recursion is now implemented (get -r and put -r). Wildcards are next on the list. Revision-number: 4991 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 56 Implement mget and mput in PSFTP, supporting wildcards. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-16T17:35:20.385619Z PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e6947c823558b46321eff7a69b729c35 Text-delta-base-sha1: 9c1b76578e0f2e09a4c09614a1256694b8b96e93 Text-content-length: 725 Text-content-md5: 1b3ed7ab44d7f057ebc58a244ed15fa4 Text-content-sha1: 79e725c78f8c61f3c4647682e96eb6129961f24c Content-length: 725 SVN1{ ;y;Gjmgetput} The \c{mget} and \c{mput} commands: fetch or send multiple files \c{mget} works almost exactly like \c{get}, except that it allows you to specify more than one file to fetch at once. You can do this in two ways: \b by giving two or more explicit file names (\cq{mget file1.txt file2.txt}) \b by using a wildcard (\cq{mget *.txt}). Every argument to \c{mget} is treated as the name of a file to fetch (unlike \c{get}, which will interpret at most one argument like that, and a second argument will be treated as an alternative name under which to store the retrieved file), or a wildcard expression matching more than one file. \c{mput} is similar to \c{put}, with the same differences. Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e664fccf4fd150ca25530bd17cf86aa8 Text-delta-base-sha1: 9c53a6393401c22a3fa53f74ebfae0f80576e725 Text-content-length: 5877 Text-content-md5: 024516b171b5cb00d5bbdf635eebca0b Text-content-sha1: b54b4e8ca8e2348a75677b2dea7cd929282a043a Content-length: 5877 SVNViD"g g{X1ct(Gw0M&B%{ `& KK@HDu7aPqQ,Z}!+Yo9 \]eiNo9qmh VxNPKNJN, char *wildcardwildcard || recurse) { struct fxp_attrs attrs; int result; if (!wildcard) { sftp_register(req = fxp_stat_send(fnamresult = fxp_stat_recv(pktin, rreq, &attrs); } else result = 0; /* placate optimisers */ if (wildcard || (result && (attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS) && (attrs.permissions & 0040000) (or this is a wildcard * run). */ if (!wildcard && && (!wildcard || wc_match(wildcard, names->names[i].filename)A polite warning if nothing at all matched the * wildcard. */ if (wildcard && !nnames) { printf("%s: nothing matched\n", wildcard); }if (outfname) nextoutfname = dir_file_cat(outfname, ournames[i]->filename); else nextoutfname = dupstr(if (outfname) nextoutfname = dir_file_cat(outfname, ournames[i]->filename); else nextoutfname = dupstr(ournames[i]->filename); ret = sftp_get_file(nextfname, nextoutfname, recurse, restart, NULL, char *wildcard) { struct fxp_handle *fh; struct fxp_xfer *xfewildcard || (recurse && file_type(fname) == FILE_TYPE_DIRECTORY)) { struct fxp_attrs attrs; int result; int nnames, namesize; char *name, **ournames; DirHandle *dh; int i; if (!wildcard) {sftp_register(req = fxp_stat_send(if (!result || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS) || !(attrs.permissions & 0040000)) { sftp_register(req = fxp_mkdir_send(oumkdir_recv(pktin, rreq); if (!result) { printf("%s: create directory: %s\n", outfname, fxp_error()); return 0; }nnames = namesize = 0; ournames = NULL; if (wildcard) { WildcardMatcher *wcm; wcm = begin_wildcard_matching(wildcard); if (wcm) { while ((name = wildcard_get_filename(wcm)) != NULL) { if (nnames >= namesize) { namesize += 128; ournames = sresize(ournames, namesize, char *); } ournames[nnames++] = name; } finish_wildcard_matching(wcm); } } else { dh = open_directory(fname); if (!dh) { printf("%s: unable to open directory\n", fname); return 0; } while ((name = read_filename(dh)) != NULL) { if (nnames >= namesize) { namesize += 128; ournames = sresize(ournames, namesize, char *); } ournames[nnames++] = name; } close_directory(dh); } /* * A polite warning if nothing at all matched the * wildcard. */ if (wildcard && !nnames) { printf("%s: nothing matched\n", wildcard); }if (fname) nextfname = dir_file_cat(fname, ournames[i]); else nextfname = dupstr( recurse, restart, NULLhree very * similar commands here. The basic one is `get'; `reget' differs * in that it; `mget' * differs in that it interprets all its arguments as files to * transfer (never as a different local name for a remote file) and * can handle wildcards. */ int sftp_general_get(struct sftp_command *cmd, int restart, int multiple) { char *fname, *unwcdo { unwcfname = NULL; origfname = cmd->words[i++]; if (multiple && !wc_unescape(unwcfname = snewn(strlen(origfname)+1, char), origfname)) { ret = sftp_get_file(pwd, NULL, recurse, restart, origfname); } else { fname = canonify(origfname); if (!fname) { printf("%s: %s\n", origfname, fxp_error()); sfree(unwcfname); return 0; } if (!multiple && i < cmd->nwords) outfname = cmd->words[i++]; else outfname = stripslashes(origfname, 1); ret = sftp_get_file(fname, outfname, recurse, restart, NULL); sfree(fname); } sfree(unwcfname); if (!ret) return ret; } while (multiple && i < cmd->nwords, 0); } int sftp_cmd_mget(struct sftp_command *cmd) { return sftp_general_get(cmd, 0, 1); } int sftp_cmd_reget(struct sftp_command *cmd) { return sftp_general_get(cmd, 1, 0); } /* * Send a file and store it at the remote end. We have three very * similar commands here. The basic one is `put'; `reput' differs * in that it; `mput' * differs in that it interprets all its arguments as files to * transfer (never as a different remote name for a local file) and * can handle wildcards. */ int sftp_general_put(struct sftp_command *cmd, int restart, int multipledo { fname = cmd->words[i++]; if (multiple && test_wildcard(fname, FALSE) == WCTYPE_WILDCARD) { ret = sftp_put_file(NULL, pwd, recurse, restart, fname); } else { if (!multiple && i < cmd->nwords) origoutfname = cmd->words[i++]; else origoutfname = stripslashes(fname, 1); outfname = canonify(origoutfname); if (!outfname) { printf("%s: %s\n", origoutfname, fxp_error()); return 0; } ret = sftp_put_file(fname, outfname, recurse, restart, NULL); sfree(outfname); } if (!ret) return ret; } while (multiple && i < cmd->nwords); return ret; } int sftp_cmd_put(struct sftp_command *cmd) { return sftp_general_put(cmd, 0, 0); } int sftp_cmd_mput(struct sftp_command *cmd) { return sftp_general_put(cmd, 0, 1, 0get", TRUE, "download multiple files at once", " [ ... ]\n" " Downloads many files from the server, storing each one under\n" " the same name it has on the server side. You can use wildcards\n" " such as \"*.c\" to specify lots of files at once.\n", sftp_cmd_mgetput", TRUE, "upload multiple files at once", " [ ... ]\n" " Uploads many files to the server, storing each one under the\n" " same name it has on the client side. You can use wildcards\n" " such as \"*.c\" to specify lots of files at once.\n", sftp_cmd_mput Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fcdd309d1c53b51615648dfdbdf4f414 Text-delta-base-sha1: ed88ce75c3c2bdc6b4838b902995f7121c878453 Text-content-length: 1187 Text-content-md5: fd499f9f1a5b35fc7b5ecaf2930b336a Text-content-sha1: c42aa6d4f0d3cf4662dfc1653023ef41d9169052 Content-length: 1187 SVN S &wp#include 0) ret = WCTYPE_WILDCARD; globfree(&globbed); } return ret; } } /* * Actually return matching file names for a local wildcard. */ struct WildcardMatcher { glob_t globbed; int i; }; WildcardMatcher *begin_wildcard_matching(char *name) { WildcardMatcher *ret = snew(WildcardMatcher); if (glob(name, 0, NULL, &ret->globbed) < 0) { sfree(ret); return NULL; } ret->i = 0; return ret; } char *wildcard_get_filename(WildcardMatcher *dir) { if (dir->i < dir->globbed.gl_pathc) { return dupstr(dir->globbed.gl_pathv[dir->i++]); } else return NULL; } void finish_wildcard_matching(WildcardMatcher *dir) { globfree(&dir->globbed); sfree(dir); Node-path: putty-wishlist/data/psftp-multi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d866847ed0ed421623cf9a3d354fe055 Text-delta-base-sha1: c594434308fed832bfeeaed3ef083460e4f1a08b Text-content-length: 136 Text-content-md5: 6d7a321c6e2861917ed4b6704dcaa78c Text-content-sha1: 740a8cd65f2bbba3ec1e621074853e65958372ce Content-length: 136 SVNTw]w, and so are wildcards (mget and mput, basically like the standard ftp client). Revision-number: 4992 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2004-12-16T17:45:29.290865Z K 7 svn:log V 62 Wildcards in `ls'. I think that completes `psftp-multi'. Woo! K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1b3ed7ab44d7f057ebc58a244ed15fa4 Text-delta-base-sha1: 79e725c78f8c61f3c4647682e96eb6129961f24c Text-content-length: 149 Text-content-md5: ec56c98d436930ba832b7ee4b9c8f18d Text-content-sha1: 4d1ae109b0cc85f423b386d7c0b23e972d5e71cc Content-length: 149 SVN{z }}`And you can list a subset of the contents of a directory by providing a wildcard: \c dir /home/fred/*.txt \c dir sources/*.c Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 024516b171b5cb00d5bbdf635eebca0b Text-delta-base-sha1: b54b4e8ca8e2348a75677b2dea7cd929282a043a Text-content-length: 787 Text-content-md5: 58c37716b901a32ef7a86445a8179aaf Text-content-sha1: e71e9e6f2e33c64ca670c20181f50e55c460dacc Content-length: 787 SVNi8MkN8 ;WUoM@EM 7S^ , *unwcdir, *wildcardi dir = "."; else dir = cmd->words[1]; unwcdir = snewn(1 + strlen(dir), char); if (wc_unescape(unwcdir, dir)) { dir = unwcdir; wildcard = NULL; } else { char *tmpdir; int len, check; wildcard = stripslashes(dir, 0); unwcdir = dupstr(dir); len = wildcard - dir; unwcdir[len] = '\0'; if (len > 0 && unwcdir[len-1] == '/') unwcdir[len-1] = '\0'; tmpdir = snewn(1 + len, char); check = wc_unescape(tmpdir, unwcdir); sfree(tmpdir); if (!check) { printf("Multiple-level wildcards are not supported\n"); sfree(unwcdir); return 0; } dir = unwcdir; }sfree(unwcdirif (!wildcard || wc_match(wildcard, names->names[i].filename)) sfree(unw0 Node-path: putty-wishlist/data/psftp-multi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d7a321c6e2861917ed4b6704dcaa78c Text-delta-base-sha1: 740a8cd65f2bbba3ec1e621074853e65958372ce Text-content-length: 82 Text-content-md5: 610b00605486ac05c8a9376546e3301e Text-content-sha1: 63bbfcdb3ca3382f87b311f22da4eb2b20bb4e4c Content-length: 82 SVNT >nfmFixed-in: 2004-12-17 ls also supports wildcards. Revision-number: 4993 Prop-content-length: 363 Content-length: 363 K 8 svn:date V 27 2004-12-16T19:15:38.239270Z K 7 svn:log V 262 Jacob points out that I introduced a bug in PSFTP when I did the timing shakeup: just running `psftp' caused the net/stdin select loop (on both Unix and Windows) to get confused at the lack of any network connection and give up immediately. Should now be fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 58c37716b901a32ef7a86445a8179aaf Text-delta-base-sha1: e71e9e6f2e33c64ca670c20181f50e55c460dacc Text-content-length: 78 Text-content-md5: c02a05ed55df0809a43e15284f9eb7a4 Text-content-sha1: cee27a916659d29d28153abafafa7d4ba331436c Content-length: 78 SVND.znz.f, back == NULL back = NULL; backhandle = NULL Node-path: putty/psftp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 81b005160d2be44572e4f1938af17b8e Text-delta-base-sha1: 1062fb8e605e08a6b5c64e403123f7c6ba9ce770 Text-content-length: 451 Text-content-md5: e8ac1940b951037fa4d36091990a1697 Text-content-sha1: 345db351ccf07576f76ba3d319c435b3946be654 Content-length: 451 SVN24 +n+ * If `backend_required' is TRUE, should also listen for activity * at the backend (rekeys, clientalives, unexpected closures etc) * and respond as necessary, and if the backend closes it should * treat this as a failure condition. If `backend_required' is * FALSE, a back end is not (intentionally) active at all (e.g. * psftp before an `open' command). */ char *ssh_sftp_get_cmdline(char *prompt, int backend_required Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fd499f9f1a5b35fc7b5ecaf2930b336a Text-delta-base-sha1: c42aa6d4f0d3cf4662dfc1653023ef41d9169052 Text-content-length: 196 Text-content-md5: 49bafd607478b168544b05d2f143e0b3 Text-content-sha1: 0553eff494d9d4b375a8c02efcf86c68ce449501 Content-length: 196 SVNSdUdY9s;o)*, int no_fds_ok && !no_fds_ok, FALSE); } /* * Read a PSFTP command line from stdin. */ char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok, no_fds_ok Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ef78a3df05d3e9624e9535c7c13da2f Text-delta-base-sha1: 43aa1d82138446fa79210aa149ca54e004283287 Text-content-length: 120 Text-content-md5: 2cd3dbc9f652956011741292ba1a5e58 Text-content-sha1: 34ed045aa51ade47f81dd798b32e864a84a5d553 Content-length: 120 SVN>nUjDj.]a = INVALID_SOCKET, int no_fds_ok(sftp_ssh_socket == INVALID_SOCKET && no_fds_ok) || Revision-number: 4994 Prop-content-length: 426 Content-length: 426 K 8 svn:date V 27 2004-12-16T19:19:59.582168Z K 7 svn:log V 325 Implement the `close' command, which terminates an SFTP session but does not quit PSFTP, so you can then issue another `open' to connect to somewhere else. This has apparently been trivial for some time, for exactly the same reasons that `reuse-windows' was so easy, but it hadn't occurred to me to actually do it until now. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c02a05ed55df0809a43e15284f9eb7a4 Text-delta-base-sha1: cee27a916659d29d28153abafafa7d4ba331436c Text-content-length: 497 Text-content-md5: 3899e85d68b482df8295a0e5f631c58b Text-content-sha1: 477e0403bdc3959ca675dab566cb0a394df281d2 Content-length: 497 SVND *9C 3>%4ab%int sftp_cmd_closedo_sftp_cleanup(); return 0close", TRUE, "finish your SFTP session but do not quit PSFTP", "\n" " Terminates your SFTP session, but does not quit the PSFTP\n" " program. You can then use \"open\" to start another SFTP\n" " session, to the same server or to a different one.\n", sftp_cmd_closedo_sftp_cleanup(); random_save_seed(); cmdline_cleanup(); console_provide_logctx(NULL) Revision-number: 4995 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2004-12-16T19:36:47.625495Z K 7 svn:log V 101 General mechanism for ensuring a dodgy SFTP server can't return malicious filenames via FXP_READDIR. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8cbc03e0e27f27cfdd0a5a3cd0b3dbaa Text-delta-base-sha1: 7fdf91c2ade90e715448a42ebe6c5d1087ad33a1 Text-content-length: 506 Text-content-md5: 8257d510a7f99a173155354308f02135 Text-content-sha1: 6f045716432948a8a3402bbccd9e9ef4881ccba8 Content-length: 506 SVN]Wp(qWE { if (!strcmp(names->names[i].filename, ".") || !strcmp(names->names[i].filename, "..")) { /* * . and .. are normal consequences of * reading a directory, and aren't worth * complaining about. */ } else if (!vet_filename(names->names[i].filename)) { tell_user(stderr, "ignoring potentially dangerous server-" "supplied filename '%s'\n", names->names[i].filename); } else ournames[nnames++] = names->names[i]; } Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3899e85d68b482df8295a0e5f631c58b Text-delta-base-sha1: 477e0403bdc3959ca675dab566cb0a394df281d2 Text-content-length: 458 Text-content-md5: 9b81457481f0c59f4a74de9ddde0d5be Text-content-sha1: 4e666b8edb086e140ad0286f913c793edb12202d Content-length: 458 SVN *Tfd*-sstrcmp(names->names[i].filename, ".") && strcmp(names->names[i].filename, "..") && (!wildcard || wc_match(wildcard, names->names[i].filename))) { if (!vet_filename(names->names[i].filename)) { printf("ignoring potentially dangerous server-" "supplied filename '%s'\n", names->names[i].filename); } else { ournames[nnames++] = fxp_dup_name(&names->names[i]); } } Node-path: putty/psftp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e8ac1940b951037fa4d36091990a1697 Text-delta-base-sha1: 345db351ccf07576f76ba3d319c435b3946be654 Text-content-length: 381 Text-content-md5: 3b7ea805c45f9bb1931a65268984c967 Text-content-sha1: 1ad470205428023a059112c173affd8c62244619 Content-length: 381 SVN4# e'eVet a filename returned from the remote host, to ensure it isn't * in some way malicious. The idea is that this function is applied * to filenames returned from FXP_READDIR, which means we can panic * if we see _anything_ resembling a directory separator. * * Returns TRUE if the filename is kosher, FALSE if dangerous. */ int vet_filename(char *name Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49bafd607478b168544b05d2f143e0b3 Text-delta-base-sha1: 0553eff494d9d4b375a8c02efcf86c68ce449501 Text-content-length: 195 Text-content-md5: 8a3617295ca723809ed6080a0c793d7f Text-content-sha1: f471aa1d74242c579c64437ff9ed971049be498c Content-length: 195 SVNE +>+\5vet_filename(char *name) { if (strchr(name, '/')) return FALSE; if (name[0] == '.' && (!name[1] || (name[1] == '.' && !name[2]))) return FALSE; return TRUE Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2cd3dbc9f652956011741292ba1a5e58 Text-delta-base-sha1: 34ed045aa51ade47f81dd798b32e864a84a5d553 Text-content-length: 241 Text-content-md5: 7e3f38e1371e598394a61144da503b4e Text-content-sha1: 091bc0aa3c0c9b95327030c157ad0a120be9aacb Content-length: 241 SVNnN WuWlvet_filename(char *name) { if (strchr(name, '/') || strchr(name, '\\') || strchr(name, ':')) return FALSE; if (!name[strspn(name, ".")]) /* entirely composed of dots */ return FALSE; return TRUE Revision-number: 4996 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:51.002353Z PROPS-END Revision-number: 4997 Prop-content-length: 363 Content-length: 363 K 7 svn:log V 262 Apparently SIGCHLD is blocked by default in processes run in a pterm, which was breaking my bash job notification patch. This is apparently not the case for xterm, so I've fiddled with it. Not entirely sure _why_ it did this in the first place, but there we go. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-17T09:43:09.687903Z PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35c189429355ae9ae8a06e01dd9c08c4 Text-delta-base-sha1: 5e9b5333ab20393382b3367d12e37559d10e065a Text-content-length: 244 Text-content-md5: 8b6c66e403c4db337d7357e6430c7f60 Text-content-sha1: 67f1dc94cbd8eddf7e2034272e069c5ea0a42e86 Content-length: 244 SVNhU!\_-y SIGCHLD, meanwhile, has been * tinkered with by the watchdog process. Reverse all this *{ sigset_t set; sigemptyset(&set); sigaddset(&set, SIGCHLD); sigprocmask(SIG_UNBLOCK, &set, NULL); } Revision-number: 4998 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:51.063272Z PROPS-END Revision-number: 4999 Prop-content-length: 242 Content-length: 242 K 8 svn:date V 27 2004-12-17T11:18:13.452219Z K 7 svn:log V 141 I'd rather not keep losing these little test files, so here's some stuff that I can `cat' into a terminal to test particular features of it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/testdata Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: putty/testdata/colours.txt Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 5078 Text-content-md5: 04382bc80e56b3d6b5de6ac1e6cc4396 Text-content-sha1: 8750e0cbea1ee51381403ad871a8e59161a4cec0 Content-length: 5088 PROPS-END SVNHHHTest of most colour rendering. Omits the SCO fg and bg sequences, since they are destructive. Normal text and bold; reverse video and bold ANSI plus bold: 0 bold 1 bold 2 bold 3 bold 4 bold 5 bold 6 bold 7 bold xterm bright: fg0 bg0 fg1 bg1 fg2 bg2 fg3 bg3 fg4 bg4 fg5 bg5 fg6 bg6 fg7 bg7 xterm 256:  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47  48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63  64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79  80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95  96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111  112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127  128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143  144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159  160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175  176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191  192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207  208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223  224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239  240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 Node-path: putty/testdata/scocols.txt Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 482 Text-content-md5: bde02aa70d86722993cb829fd39e78e6 Text-content-sha1: 8ed5b6f964a142aee96a5bcaef380fb326c9e988 Content-length: 492 PROPS-END SVNTTTTest of (destructive) SCO colour rendering. SCO fg: [=0F0[=7F [=1F1[=7F [=2F2[=7F [=3F3[=7F [=4F4[=7F [=5F5[=7F [=6F6[=7F [=7F7[=7F [=8F8[=7F [=9F9[=7F [=10F10[=7F [=11F11[=7F [=12F12[=7F [=13F13[=7F [=14F14[=7F [=15F15[=7F SCO bg: [=0G0[=0G [=1G1[=0G [=2G2[=0G [=3G3[=0G [=4G4[=0G [=5G5[=0G [=6G6[=0G [=7G7[=0G [=8G8[=0G [=9G9[=0G [=10G10[=0G [=11G11[=0G [=12G12[=0G [=13G13[=0G [=14G14[=0G [=15G15[=0G Node-path: putty/testdata/utf8.txt Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1590 Text-content-md5: 560a76564895b39f31221b3c83f796ed Text-content-sha1: 299b361bd8885416ed412ae65000e8e6789d5376 Content-length: 1600 PROPS-END SVN(((Test of UTF-8 output in a terminal emulator ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ Some basic Unicode: ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B), Combining characters: STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ [----------------------------|------------------------] ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่ สิบสองกษัตริย์ก่อนหน้าแลถัดไป สององค์ไซร้โง่เขลาเบาปัญญา Wide characters with difficult wrapping: コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ コンニチハ Arabic and bidirectional text: (من مجمع الزوائد ومنبع الفوائد للهيثمي ، ج 1 ، ص 74-84) عن جرير رضي الله عنه قال قال رسول الله صلى الله عليه وسلم: بني الاسلام على خمس شهادة ان لا اله الا الله واقام Revision-number: 5000 Prop-content-length: 284 Content-length: 284 K 7 svn:log V 183 I had apparently broken wrapping of double-width characters (again). Also fixed the new UTF-8 test file so that it tests double-width wrapping both with _and_ without LATTR_WRAPPED2. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-17T11:24:25.921270Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 796714fc13bad23a0d22ef02e106145a Text-delta-base-sha1: 1f0c683e717defca60d94165ad742e2216cfda3b Text-content-length: 116 Text-content-md5: 1ba2883852d74d81248e2be211f8d746 Text-content-sha1: c654be9df989c1859b6048eb3f98660ec9548698 Content-length: 116 SVN Gcline = scrlineptr(term->curs.y)*))) { compatibility(VT340TEXT); Node-path: putty/testdata/utf8.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 560a76564895b39f31221b3c83f796ed Text-delta-base-sha1: 299b361bd8885416ed412ae65000e8e6789d5376 Text-content-length: 42 Text-content-md5: 1ae5952f6321a065ef619581dc99bbdd Text-content-sha1: 02e561a2d6c93f6a73e6f4a050086258414366f9 Content-length: 42 SVN(9*`9 Here we go then: Revision-number: 5001 Prop-content-length: 677 Content-length: 677 K 8 svn:date V 27 2004-12-17T11:37:16.023520Z K 7 svn:log V 576 Divide the do_paint() loop into several subloops. The activity of going through the line and working out which bits need to be redrawn is now in a separate loop from the subsequent activity of actually going through and doing the redraws. This _should_ enable me to tinker with the which-bits-to-redraw data in between the two, thus fixing `font-overflow'. However, I thought it would be sensible to break the work up into two commits so we can track bugs in the restructuring separately from bugs introduced by the new feature. Also added a couple more terminal test files. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ba2883852d74d81248e2be211f8d746 Text-delta-base-sha1: c654be9df989c1859b6048eb3f98660ec9548698 Text-content-length: 1102 Text-content-md5: 10116fa94aaecc98f9631150480b18d6 Text-content-sha1: f56da4b7d310c566781ed7c916ce44427dac97ab Content-length: 1102 SVN*+Nbojn{POBJyI;b }wYt|MaI termchar *newline;newline = snewn(term->cols, termchar/* * First loop: work along the line deciding what we want * each character cell to look like. */ for (j = 0; j < term->cols; j++) { unsigned long tattr, tchar; termchar *d = lchars + j/* FULL-TERMCHAR */ newline[j].attr = tattr; newline[j].chr = tchar; /* Combining characters are still read from lchars */ newline[j].cc_next = 0; } /* * Now loop over the line again, noting where things have * changed. */ for (j = 0; j < term->cols; j++) { if (term->disptext[i]->chars[j].chr != newline[j].chr || term->disptext[i]->chars[j].attr != newline[j].attr) { term->disptext[i]->chars[j].attr |= ATTR_INVALID; } } /* * Finally, loop once more and actually do the drawing. */for (j = 0; j < term->cols; j++) { unsigned long tattr, tchar; int break_run, do_copy; termchar *d = lchars + j; tattr = newline[j].attr; tchar = newline[j].chr;newline);||| Node-path: putty/testdata/lattrs.txt Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 123 Text-content-md5: a379d80b168401cfb7356388dcbeb445 Text-content-sha1: 0c89f5ee98e8fd2014ddbb7636a5ede6d69d6728 Content-length: 133 PROPS-END SVNpppTest of line attributes: #3Double-height top #4Double-height bottom #5Normal text (#5) #6Double-width only Node-path: putty/testdata/vt100.txt Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 751 Text-content-md5: 98d5110f78986a99421a53bf77d22009 Text-content-sha1: 223cae1cb3d778da10d9959dbb3598abd7e3c24e Content-length: 761 PROPS-END SVNaaaVT100 line drawing characters, actually using the VT100 escapes (B)0ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo lqqqqqqqqqqpoopqrssrqqqqqqqqqqwqqqqqqqqqqpoopqrssrqqqqqqqqqqk x x x x ooh, swirly! x top right corner x x x x tqqqqqqqqqqpoopqrssrqqqqqqqqqqnqqqqqqqqqqpoopqrssrqqqqqqqqqqu x x x x stuff down here x is quite inane x x x x mqqqqqqqqqqpoopqrssrqqqqqqqqqqvqqqqqqqqqqpoopqrssrqqqqqqqqqqj Revision-number: 5002 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2004-12-17T12:15:17.439162Z K 7 svn:log V 138 Update online help for "-r" and "--" options to get/put commands. Use command name in error messages rather than hardcoded "get:"/"put:". K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b81457481f0c59f4a74de9ddde0d5be Text-delta-base-sha1: 4e666b8edb086e140ad0286f913c793edb12202d Text-content-length: 1025 Text-content-md5: c2eae09efb07ff74f4f6f4faa5095bcf Text-content-sha1: eee4c28bab0eba1ebfae447b85b9b58c932625ea Content-length: 1025 SVNv}g, w,FVz1{T+{ AA#R=C yMOBx %s: unrecognised option '%s'\n", cmd->words[0], cmd->words[i]); return 0; } i++; } if (i >= cmd->nwords) { printf("%s: expects a filename\n", cmd->words[0]%s: unrecognised option '%s'\n", cmd->words[0], cmd->words[i]); return 0; } i++; } if (i >= cmd->nwords) { printf("%s: expects a filename\n", cmd->words[0]/[ is given, it is treated as a set of files to\n" " list; otherwise, all files ar[ -r ] [ -- ] " If -r specified, recursively fetch a directory[ -r ] [ -- ] " If -r specified, recursively fetch files and directories " If -r specified, recursively store files and directories[ -r ] [ -- ] " If -r specified, recursively store a directory[ -r ] [ -- ] " If -r specified, resume interrupted \"get -r\"[ -r ] [ -- ] " If -r specified, resume interrupted \"put -r\" Revision-number: 5003 Prop-content-length: 744 Content-length: 744 K 7 svn:log V 643 I _think_ I've just fixed `font-overflow'. term->disptext now tracks the start of every contiguous run passed to do_text() or do_cursor(), and arranges never to overwrite only part of such a run on the next update. I'm a bit worried about this checkin because I've also completely revamped cursor handling: the cursor was previously being drawn _outside_ the main loop over the display line, and is now drawn as part of that loop when it gets to the cursor location. It _seems_ to still work sensibly, even in complex cases involving LATTR_WIDE and double-width CJK characters etc, but I won't be entirely happy until it's had some beta use. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-17T12:55:12.696405Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8bafb78b9d72dae973c99ae6060b507b Text-delta-base-sha1: 494b6465d65892a82de90eaf3a6e3383c9d0578e Text-content-length: 438 Text-content-md5: 9c6780f04fcd7f0e97811826c1238445 Text-content-sha1: 84c2ed0efd6635e9bf4ab991cc62b907fd033f77 Content-length: 438 SVN)G&fa"(y# * 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 endDATTR_STARTRUN 0x80000000UL /* start of redraw run */ #define TDATTR_MASK 0xF0000000UL #define TATTR_MASK (TDATTR_MASK) #define DATTR_MASK (TDATTR_MASK) Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 10116fa94aaecc98f9631150480b18d6 Text-delta-base-sha1: f56da4b7d310c566781ed7c916ce44427dac97ab Text-content-length: 1823 Text-content-md5: fb5356f39f84ee6d92fb48ec1781af8c Text-content-sha1: a7047a78c2fd32cb0f9c078faade56037b0593e3 Content-length: 1823 SVN 0@ (a->attr &~ DATTR_MASK) != (battr &~ DATTR_MASK)+"Zq~n=>>`V7/J:F:v>gI~dOiB1 || term->esc_args[0] >= 24laststart, dirtyrect(ATTR_NARROW | DATTR_MASK)if (i == our_curs_y && j == our_curs_x) { tattr |= cursor; term->curstype = cursor * During this loop, we keep track of where we last saw * DATTR_STARTRUN. Any mismatch automatically invalidates * _all_ of the containing run that was last printed: that * is, any rectangle that was drawn in one go in the * previous update should be either left completely alone * or overwritten in its entirety. This, along with the * expectation that front ends clip all text runs to their * bounding rectangle, should solve any possible problems * with fonts that overflow their character cells. */ laststart = 0; dirtyrect = FALSE;attr & DATTR_STARTRUN) { laststart = j; dirtyrect = FALSE; } if (term->disptext[i]->chars[j].chr != newline[j].chr || (term->disptext[i]->chars[j].attr &~ DATTR_MASK) != newline[j].attr) { int k; for (k = laststart; k < j; k++) term->disptext[i]->chars[k].attr |= ATTR_INVALID; dirtyrect = TRUE; } if (dirtyrect) term->disptext[i]->chars[j].attr |= ATTR_INVALID;(term->disptext[i]->chars[j].attr &~ DATTR_MASK)if (attr & (TATTR_ACTCURS | TATTR_PASCURS)) do_cursor(ctx, our_curs_x, i, ch, ccount, attr, ldata->lattr); else do_text(ctx, start, i, ch, ccount, attr, ldata->lattr); if (start == j) term->disptext[i]->chars[j].attr |= DATTR_STARTRUNif (attr & (TATTR_ACTCURS | TATTR_PASCURS)) do_cursor(ctx, our_curs_x, i, ch, ccount, attr, ldata->lattr); else do_text(ctx, start, i, ch, ccount, attr, ldata->lattr); updated_line = 1 Node-path: putty-wishlist/data/font-overflow Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5af69fc71c83d5534f7c5cadc10bc723 Text-delta-base-sha1: d3d381020e335f8121ba0ee0ed3fd6f08f905464 Text-content-length: 381 Text-content-md5: 5a85146aff056f79aa0d0a0c18665c78 Text-content-sha1: ad03c19fbd572d928912b4da47cd98b905d02d1a Content-length: 381 SVN fq.pRFixed-in: 2004-12-18

    SGT, 2004-12-17: I think this is now done. I've tested it in a known failure case on Windows (1600x1200 screen, set font to Courier New 11, set resize behaviour to change-font, maximise window, the lower case m then projects over its character cell) and it now appears not to cause any droppings no matter what I do. Revision-number: 5004 Prop-content-length: 306 Content-length: 306 K 8 svn:date V 27 2004-12-17T13:00:01.842276Z K 7 svn:log V 205 Document recent SFTP changes: - document behaviour of "-r" with mget/mput/reget/reput - document "close" command - document SFTP wildcard syntax for those who may not be familiar with Unix wildcards K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a19ca86c068c25aa637c02c0f1921e0f Text-delta-base-sha1: 63c290daf6609c06b08f8764c38ca9769a0049df Text-content-length: 115 Text-content-md5: 2aaa9b29ead07709fbb847951cb182c0 Text-content-sha1: 0dca4d051078fdd3db692b24b219d6e6f5a485aa Content-length: 115 SVNdXWl(PuTTY's SFTP wildcard syntax is described in \k{psftp-wildcards}.) This makes it more d Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec56c98d436930ba832b7ee4b9c8f18d Text-delta-base-sha1: 4d1ae109b0cc85f423b386d7c0b23e972d5e71cc Text-content-length: 2147 Text-content-md5: f17ed451d5308698b391fc8f2afc2e12 Text-content-sha1: 94566b944c580d26c73fe9f1a03738780e9ce7c2 Content-length: 2147 SVNzR*+c(Xmr_+OKw]n wildcards} Wildcards in PSFTP Several commands in PSFTP support \q{wildcards} to select multiple files. For \e{local} file specifications (such as the first argument to \c{put}), wildcard rules for the local operating system are used. For instance, PSFTP running on Windows might require the use of \c{*.*} where PSFTP on Unix would need \c{*}. For \e{remote} file specifications (such as the first argument to \c{get}), PSFTP uses a standard wildcard syntax (similar to POSIX wildcards): \b \c{*} matches any sequence of characters (including a zero-length sequence). \b \c{?} matches exactly one character. \b \c{[abc]} matches exactly one character which can be \cw{a}, \cw{b}, or \cw{c}. \lcont{ \c{[a-z]} matches any character in the range \cw{a} to \cw{z}. \c{[^abc]} matches a single character that is \e{not} \cw{a}, \cw{b}, or \cw{c}. Special cases: \c{[-a]} matches a literal hyphen (\cw{-}) or \cw{a}; \c{[^-a]} matches all other characters. \c{[a^]} matches a literal caret (\cw{^}) or \cw{a}. } \b \c{\\} (backslash) before any of the above characters (or itself) removes that character's special meaning. A leading period (\cw{.}) on a filename is not treated specially, unlike in some Unix contexts; \c{get *} will fetch all files, whether or not they start with a leading period.close the connection, terminate PSFTP and return to the command line (or just close the PSFTP console window if you started it from the close} The \c{close} command: close your connection If you just want to close the network connection but keep PSFTP running, you can use the \c{close} command. You can then use the \c{open} command to open a new connectionThe \c{-r} and \c{--} options from \c{get} are also available with \c{mget}\c reget -r mydir These commands are intended mainly for resuming interrupted transfers. They assume that the remote file or directory structure has not changed in any way; if there have been changes, you may end up with corrupted files. In particular, the \c{-r} option will not pick up changes to files or directories already transferred in full. Revision-number: 5005 Prop-content-length: 358 Content-length: 358 K 8 svn:date V 27 2004-12-17T13:39:41.648007Z K 7 svn:log V 257 The xfer mechanism wasn't gracefully terminating when an error was encountered part way through transfer. In particular, this caused psftp to hang (waiting for FXP_READ replies which had already arrived) if you try `get' (without -r) on a remote directory. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c2eae09efb07ff74f4f6f4faa5095bcf Text-delta-base-sha1: eee4c28bab0eba1ebfae447b85b9b58c932625ea Text-content-length: 156 Text-content-md5: 04c81a591bfe08af938c0c7de4349652 Text-content-sha1: a03249f48e707f0c13d1a308cb2809f5266c785d Content-length: 156 SVNCx!yC6eR6, shown_err = FALSE if (!shown_err) { printf("error while reading: %s\n", fxp_error()); shown_err = TRUE; } Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cdd922e39b55c1feaa7e5eb4e9f07bf9 Text-delta-base-sha1: bc574cb644725f2d9759b9861f38620caa733b92 Text-content-length: 102 Text-content-md5: 81c21bd189a54d88f8e8dc433b00b2fa Text-content-sha1: 825569ae812d758cc1d2ce9c241f570b76e5cbbb Content-length: 102 SVNUF9ND !xfer->eof && !xfer->errxfer_set_error(xfer); rr->complete = -1; Revision-number: 5006 Prop-content-length: 380 Content-length: 380 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-17T14:25:53.093922Z K 7 svn:log V 279 Jacob has pointed out why SIGCHLD was blocked, so I've updated the comment when I unblock it in pty.c to reflect reality. Also I've moved block_signal() out of pterm.c into signal.c, so I can conveniently use it for unblocking SIGCHLD rather than having to reinvent it in pty.c. PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f19f9a12e79ac7c250a3b9d2e9082c0d Text-delta-base-sha1: cc754b8c173edf882095cb29e9089b3262917d35 Text-content-length: 267 Text-content-md5: 0ab89295d4ed4dd38cded3142a88149d Text-content-sha1: 3e0d9ae0f225d7190c4a1059f537dd4816625ce2 Content-length: 267 SVN`i7I` } inst->textcursor = make_mouse_ptr(inst, GDK_XTERM); inst->rawcursor = make_mouse_ptr(inst, GDK_LEFT_PTR); inst->blankcursor = make_mouse_ptr(inst, -1); make_mouse_ptr(inst, -2); /* clean up cursor i  ` Node-path: putty/unix/pty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b6c66e403c4db337d7357e6430c7f60 Text-delta-base-sha1: 67f1dc94cbd8eddf7e2034272e069c5ea0a42e86 Text-content-length: 209 Text-content-md5: 9b221a59c6b6e846c29b64ca2f424216 Text-content-sha1: 77366d9cfb6b859bba7bade8c353d2797ffda6c7 Content-length: 209 SVNh~ 656Uwas blocked * during pt_main() startup. Reverse all this for our child * process. */ putty_signal(SIGINT, SIG_DFL); putty_signal(SIGQUIT, SIG_DFL); block_signal(SIGCHLD, 0); Node-path: putty/unix/signal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f600071be582552890a5e1133e9a0c9 Text-delta-base-sha1: 611569baacbac9c539bfea6b599cd05f0142beda Text-content-length: 296 Text-content-md5: ebc71db8f171255bb28054658f1ae698 Text-content-sha1: ecb5521eab10e49ee18cfd36e14a6aac3540b9e6 Content-length: 296 SVN/3 `YCl#include #include #include mirror.public-internet.org Revision-number: 5009 Prop-content-length: 335 Content-length: 335 K 8 svn:date V 27 2004-12-18T10:00:27.795062Z K 7 svn:log V 234 zip apparently gives a warning (`-l used on binary file') when you use -l on a UTF-8 text file. Move potentially UTF-8 things (the new testdata files) into a new category of source files, and suppress zip's warning for that category. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mksrcarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c6104fbb02aeb69718af061c9773109e Text-delta-base-sha1: afe203e03da33651adfd63822924ca0e1767ac31 Text-content-length: 507 Text-content-md5: f58226b7f58258522bb3c377e6f356d3 Text-content-sha1: 4cfc685bb11b69e91b4e5f76bfb2daea52206927 Content-length: 507 SVN4-`b5`M#!/bin/sh perl mkfiles.pl # These are text files.'testdata/.*\.txt|MODULE|putty.iss|website.url' | grep -vF .ico` # These are files which I'm _sure_ should be treated as text, but # which zip might complain about, so we direct its moans to # /dev/null! Apparently its heuristics are doubtful of UTF-8 text # files. bintext=testdata/*.txt # These are actual binary files which we don't want transforming.-l putty-src.zip $bintext >& /dev/null zip -k putty-src.zip $bin > /dev/null Revision-number: 5010 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2004-12-18T10:46:21.347705Z K 7 svn:log V 29 Missed options off mput help K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04c81a591bfe08af938c0c7de4349652 Text-delta-base-sha1: a03249f48e707f0c13d1a308cb2809f5266c785d Text-content-length: 39 Text-content-md5: ebed22ac8a81c63a8da91c57ed010d39 Text-content-sha1: e4ff1e909e0adc812d53a765277d7f3be7bae31d Content-length: 39 SVNCQ 7 6[ -r ] [ -- ] Revision-number: 5011 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2004-12-18T11:34:41.466607Z K 7 svn:log V 90 Make sure the docs in a Unix release tarball are generated with the correct version info. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c75c7f0a001d91d7f58ff9633b39cdb Text-delta-base-sha1: 03f77dc9690ea416dc8e095712c4107fa8ab027e Text-content-length: 187 Text-content-md5: ae4a46f78cda207e4915b91a354e9bf4 Text-content-sha1: 6cd2b11b737cbb5001a4c9c9ffc1bac3c6cc4bb8 Content-length: 187 SVNo+j2fdocver= ;; '') arcsuffix= ver= docdocver="VERSION=\"PuTTY release $1\"" ;; esac perl mkfiles.pl (cd doc && make -s ${docver:+"$docver"} Revision-number: 5012 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2004-12-19T22:37:05.810639Z K 7 svn:log V 80 Fix line cursor colours (fallout from `256-colours'), on both Windows and Unix. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0ab89295d4ed4dd38cded3142a88149d Text-delta-base-sha1: 3e0d9ae0f225d7190c4a1059f537dd4816625ce2 Text-content-length: 52 Text-content-md5: 47e46d0ad35477f98a4151fbad4b1c10 Text-content-sha1: 2b4582de44ef07f9b9ce43d2277916ebf4b7a523 Content-length: 52 SVN h26font */  Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 667f197534dda80192df163cf6883af6 Text-delta-base-sha1: c58b8776b968bed5bc7730a203ef422637f19607 Text-content-length: 55 Text-content-md5: caad6447c50387da52292377d49f33e7 Text-content-sha1: 971d083c2a3429f4356e0c20dd723f323ba5a129 Content-length: 55 SVNx yd6161Z\Z Revision-number: 5013 Prop-content-length: 209 Content-length: 209 K 8 svn:date V 27 2004-12-19T23:15:17.009218Z K 7 svn:log V 108 Correct number of configurable colours (NCFGCOLOURS) to match reality (leftover from `256-colours', r4917). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: caad6447c50387da52292377d49f33e7 Text-delta-base-sha1: 971d083c2a3429f4356e0c20dd723f323ba5a129 Text-content-length: 41 Text-content-md5: 1068f380006862875e3ed4a886a3a2d1 Text-content-sha1: 1584af25d9730dff2473e832c086e42b76212db1 Content-length: 41 SVN op2\\\ Revision-number: 5014 Prop-content-length: 368 Content-length: 368 K 8 svn:date V 27 2004-12-19T23:37:30.145007Z K 7 svn:log V 267 Restore border around terminal to default background colour rather than something outside colours[] (consistently brown on my system). (I don't understand why this code was the way it was, but it gave the correct result before r4917 `256-colours', and now doesn't.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1068f380006862875e3ed4a886a3a2d1 Text-delta-base-sha1: 1584af25d9730dff2473e832c086e42b76212db1 Text-content-length: 130 Text-content-md5: 039a637ccbf9335fb979abd86f5f24bc Text-content-sha1: 1b06e77eaf6c98f28e5dbd2b3a2cd6a83ff4c137 Content-length: 130 SVN8aa}zATTR_DEFBG>>ATTR_BGSHIFTATTR_DEFBG>>ATTR_BGSHIFT if (\T O9qkcode > 21) offt++; Revision-number: 5015 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 60 Summary: Batch mode for Windows PuTTYgen Difficulty: mayhem K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-12-20T01:29:33.826134Z PROPS-END Node-path: putty-wishlist/data/puttygen-batch Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 780 Text-content-md5: ed572135dbdfb43783a551abd4132230 Text-content-sha1: 8e75930c1541736235191c77006b094ee646a485 Content-length: 790 PROPS-END SVN~~~Summary: Batch mode for Windows PuTTYgen Class: wish Difficulty: mayhem Priority: low Content-type: text/x-html-body

    We're occasionally asked for a means of generating keys non-interactively with the Windows version of PuTTYgen; for instance, command-line arguments to specify the key type and so on.

    The main reason that we haven't done this is that interaction would still be required; there isn't a source of sufficiently good randomness on Windows, so for key generation we make the user generate some by waving the mouse around.

    We've been alerted to a trojan PuTTY 0.56 installer that was posted on CNET's download.com for about a fortnight (now removed). We are informed it installed various spyware.

    The file length was 509860 bytes (much shorter than any installer we've ever released) and the md5sum was 49550e478e9dd008998c2c5294a884c5.

    We'd like to take this opportunity to encourage everyone to verify the signatures of PuTTY downloads before executing them. Details are on our Keys page. Revision-number: 5026 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2004-12-24T10:04:28.949327Z K 7 svn:log V 63 Don't offer repeat key exchange as a special command in SSH-1. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6ea572593833fd1902f2abc486603e77 Text-delta-base-sha1: 00f658ca31032f47b86d384d425ffd9576080781 Text-content-length: 418 Text-content-md5: da405dbc53a6da1223d2698d6fc39534 Text-content-sha1: 8172e00c0a3121e94386db76fab028884df2a232 Content-length: 418 SVN:U?{zMvIy"}_pssh1_ignore_special[] = { {"IGNORE message", TS_NOP} }; static const struct telnet_special ssh2_transport_specials23/* XXX review this length for any changes: */ static struct telnet_special ssh_specials[lenof(ssh2_transport_specialsssh1_ignore_special); } else if (ssh->version == 2) { ADD_SPECIALS(ssh2_transport_specials Revision-number: 5027 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2004-12-24T13:39:32.088321Z K 7 svn:log V 51 Basic configurability for client-initiated rekeys. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 65cc2dda8d49fe7a6c69bfe52aad507a Text-delta-base-sha1: 3a4507b4e37cdd0987e9fc2678ccd75ff8fee487 Text-content-length: 644 Text-content-md5: d127a681c71bb3fd957f4fb5014dab23 Text-content-sha1: 6108239052fd37873434dfc746ae6671c254d3fd Content-length: 644 SVNIc_!cl0 /* FIXME: these could usefully be configured mid-session in SSH-2. * (So could cipher/compression/kex, now we have rekey.) */ ctrl_editbox(s, "Max minutes before rekey (0 for no limit)", 't', 20, HELPCTX(ssh_kex_repeat), dlg_stdeditbox_handler, I(offsetof(Config,ssh_rekey_time)), I(-1)); ctrl_editbox(s, "Max data before rekey (0 for no limit)", 'd', 20, HELPCTX(ssh_kex_repeat), dlg_stdeditbox_handler, I(offsetof(Config,ssh_rekey_data)), I(16)); ctrl_text(s, "(Use 1M for 1 megabyte, 1G for 1 gigabyte etc)", HELPCTX(ssh_kex_repeat)); Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5056a0005d85b11b72445d29bb97f480 Text-delta-base-sha1: fcff002d879d622d9a5ddadd9f2a17c5fc7b2ed7 Text-content-length: 2777 Text-content-md5: a8845b4466d537f7919da44a74d1547f Text-content-sha1: 3cfb2c1750169315a244e7dd818b6f21a2352195 Content-length: 2777 SVNpn 2 gp]S{config-ssh-kex-rekey} Repeat key exchange \cfg{winhelp-topic}{ssh.kex.repeat} If the session key negotiated at connection startup is used too much or for too long, it may become feasible to mount attacks against the SSH connection. Therefore, the SSH-2 protocol specifies that a new key exchange should take place every so often; this can be initiated by either the client or the server. These options control how often PuTTY will initiate a repeat key exchange (\q{rekey}). You can also force a key exchange at any time from the Special Commands menu (see \k{using-specials}). \# FIXME: do we have any additions to the SSH-2 drafts' advice on these values? Do we want to enforce any limits? \b \q{Max minutes before rekey} specifies the amount of time that is allowed to elapse before a rekey is initiated. If this is set to zero, PuTTY will not rekey due to elapsed time. The SSH-2 protocol specification recommends a timeout of at most 60 minutes. \b \q{Max data before rekey} specifies the amount of data (in bytes) that is permitted to flow in either direction before a rekey is initiated. If this is set to zero, PuTTY will not rekey due to transferred data. The SSH-2 protocol specification recommends a limit of at most 1 gigabyte. \lcont{ As well as specifying a value in bytes, the following shorthand can be used: \b \cq{1k} specifies 1 kilobyte (1024 bytes). \b \cq{1M} specifies 1 megabyte (1024 kilobytes). \b \cq{1G} specifies 1 gigabyte (1024 megabytes). } PuTTY can be prevented from initiating a rekey entirely by setting both of these values to zero. (Note, however, that the SSH server may still initiate rekeys.)([33(ages. If this \q{bug} is detected, PuTTY will have no choice but to send the user's password with no form of camouflage, so that an eavesdropping user will be easily able to find out the exact length of the password. If this bug is enabled when talking to a correct server, the session will succeed, but will be more vulnerable to eavesdroppers than it could be. This is an SSH1-specific bug. SSH2 is secure against this type of attack. \S{config-ssh-bug-rsa1} \q{Chokes on SSH1 RSA authentication} \cfg{winhelp-topic}{ssh.bugs.rsa1} Some SSH1 servers cannot deal with RSA authentication messages at all. If Pageant is running and contains any SSH1 keys, PuTTY will normally automatically try RSA authentication before falling back to passwords, so these servers will crash when they see the RSA attempt. If this bug is detected, PuTTY will go straight to password authentication. If this bug is enabled when talking to a correct server, the session will succeed, but of course RSA authentication will be impossible. This is an SSH1-specific bug. \S{config-ssh-bug-hm Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 55615133fbf31a3a5ac6b772c9e8efd6 Text-delta-base-sha1: e381c90b5f4657e0c1bb853b1e337a36c5a407d5 Text-content-length: 103 Text-content-md5: 888bcfe4276a89f924b7a446f6aa8752 Text-content-sha1: b5227d07049b796eb3250baf0295d344cc0bccd8 Content-length: 103 SVNZe N4NcwFor more information about repeat key exchanges, see \k{config-ssh-kex-rekey}. Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bf949676f8fac4f5aa6f335f64661471 Text-delta-base-sha1: 8af4e9b0f1346ae647f023747b78bd75663647db Text-content-length: 741 Text-content-md5: 7ef7bd0360d42361ac90babc77577869 Text-content-sha1: 20c6ae79fde0e6c43b17b55478dec03c6b966a46 Content-length: 741 SVN Z MDMI@ * Parse a string block size specification. This is approximately a * subset of the block size specs supported by GNU fileutils: * "nk" = n kilobytes * "nM" = n megabytes * "nG" = n gigabytes * All numbers are decimal, and suffixes refer to powers of two. * Case-insensitive. */ unsigned long parse_blocksize(const char *bs) { char *suf; unsigned long r = strtoul(bs, &suf, 10); if (*suf != '\0') { while (isspace(*suf)) suf++; switch (*suf) { case 'k': case 'K': r *= 1024ul; break; case 'm': case 'M': r *= 1024ul * 1024ul; break; case 'g': case 'G': r *= 1024ul * 1024ul * 1024ul; break; case '\0': default: break; } } return r; } Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4c12890daf8ec5d686bb962e90fd2d41 Text-delta-base-sha1: 6b89e7d7f9b64076f429ac3db0c86e0364a8be2e Text-content-length: 66 Text-content-md5: c7bc9956cece20f012dfa000f16ec0b7 Text-content-sha1: 43c67a4f499f633e6ea1eeec685b9139cdbfd98c Content-length: 66 SVND -+l(unsigned long parse_blocksize(const char *bs) Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cce9c6b3f64843fcda0bef8a9c6d346d Text-delta-base-sha1: 49f38764895b45bbefc4f9b9d97ac105242d5c00 Text-content-length: 92 Text-content-md5: 4407a9ea6461e07056f53d6f11fbde7d Text-content-sha1: 140beea19299a7872e4889f18fef8df0eecf7ee9 Content-length: 92 SVNp> CC]ssh_rekey_time; /* in minutes */ char ssh_rekey_data[16 Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9173eca6c939b3c0136c44bf4388b008 Text-delta-base-sha1: 391f901a64ac026a5963d048eee13b09b3b69242 Text-content-length: 259 Text-content-md5: d234cad4bf2ab8849460f09d60d3f843 Text-content-sha1: 152933c3b1b361ebd6ab0903db0ac93fbe2ceae2 Content-length: 259 SVNaZ`9DBRekeyTime", cfg->ssh_rekey_time); write_setting_s(sesskey, "RekeyBytes", cfg->ssh_rekey_dataRekeyTime", 60, &cfg->ssh_rekey_time); gpps(sesskey, "RekeyBytes", "1G", cfg->ssh_rekey_data, sizeof(cfg->ssh_rekey_data)); Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da405dbc53a6da1223d2698d6fc39534 Text-delta-base-sha1: 8172e00c0a3121e94386db76fab028884df2a232 Text-content-length: 597 Text-content-md5: b27eeb7ea1db6e2a7521228e87fe2e45 Text-content-sha1: 87acf1a8ee18bb3ad797b4dfdca6df4ad1656167 Content-length: 597 SVN)F"C0kC`k[%unsigned long maxmax_data_size != 0 && ssh->outgoing_data_size > ssh->max_data_sizemax_data_size != 0 && ssh->outgoing_data_size > ssh->max_data_size*/ uKif (ssh->cfg.ssh_rekey_time != 0) ssh->next_rekey = schedule_timer(ssh->cfg.ssh_rekey_time*60*TICKSPERSEC, ssh2_timer, ssh); :Z?@HG@r' /* * We have spare data. Add it to the channel buffermax_data_size != 0 && ssh->incoming_data_size > ssh->max_data_sizemax_data_size = parse_blocksize(ssh->cfg.ssh_rekey_data) Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ffcec004976b72716234e30d0704647d Text-delta-base-sha1: b2d788f201ac00492fc9f28c7ab8d43d749ac844 Text-content-length: 47 Text-content-md5: 0dad7a9dec8651514272ee1d615010fd Text-content-sha1: 6f45f8965dae5833bd274f2db174e39d4766c437 Content-length: 47 SVNI} un[kex_repeat "ssh.kex.repeat Revision-number: 5028 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2004-12-28T14:04:26.844147Z K 7 svn:log V 136 Fix divide overflow in internal_mod(). Thanks to William Petiot for spotting a special case that the DIV instruction can't quite cover. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 489476143cc1a3910e0c7ae3cc96d5d0 Text-delta-base-sha1: cd9c310e56868fdf1b8af1ea07536e3cc118e659 Text-content-length: 1094 Text-content-md5: 6f51fc1d8f9d1853cb31932e25e26173 Text-content-sha1: 593904b71d1594175be967fdfc7a63d0f472d320 Content-length: 1094 SVN(q +i+]Kif (h >= m0) { /* * Special case. * * To illustrate it, suppose a BignumInt is 8 bits, and * we are dividing (say) A1:23:45:67 by A1:B2:C3. Then * our initial division will be 0xA123 / 0xA1, which * will give a quotient of 0x100 and a divide overflow. * However, the invariants in this division algorithm * are not violated, since the full number A1:23:... is * _less_ than the quotient prefix A1:B2:... and so the * following correction loop would have sorted it out. * * In this situation we set q to be the largest * quotient we _can_ stomach (0xFF, of course). */ q = BIGNUM_INT_MASK; } else { DIVMOD_WORD(q, r, h, a[i], m0); /* Refine our estimate of q by looking at h:a[i]:a[i+1] / m0:m1 */ t = MUL_WORD(m1, q); if (t > ((BignumDblInt) r << BIGNUM_INT_BITS) + ai1) { q--; t -= m1; r = (r + m0) & BIGNUM_INT_MASK; /* overflow? */ if (r >= (BignumDblInt) m0 && t > ((BignumDblInt) r << BIGNUM_INT_BITS) + ai1) q--; } Revision-number: 5029 Prop-content-length: 1136 Content-length: 1136 K 8 svn:date V 27 2004-12-28T14:04:58.011852Z K 7 svn:log V 1034 Abstracted out the rather large port-forwarding setup code into a routine which is common between SSH1 and SSH2. Since this routine is not part of the coroutine system, this means it can't sit and wait to get its various success/failure responses back. Hence, I've introduced a system of queued packet handlers, each of which waits for exactly one of a pair of messages (SSH1_SMSG_{SUCCESS,FAILURE} or SSH2_MSG_REQUEST_{SUCCESS,FAILURE}), handles it when it arrives, and automatically de-registers itself. Hence the port-forwarding setup code can be called once, and then subsequent packets related to it will automatically be handled as they arrive. The real purpose of all this is that the infrastructure is now there for me to arrange mid-session configurability of port forwarding. However, a side benefit is that fewer round trips are involved in session startup. I'd quite like to move more of the connection setup (X forwarding, agent forwarding, pty allocation etc) to using the new queued handler mechanism for this reason. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b27eeb7ea1db6e2a7521228e87fe2e45 Text-delta-base-sha1: 87acf1a8ee18bb3ad797b4dfdca6df4ad1656167 Text-content-length: 10172 Text-content-md5: 1dcff83379ea2747ad26868543314be1 Text-content-sha1: 2e67c97615b594093743137d0ac59ceaf8490bc1 Content-length: 10172 SVN/ ZfbFY0]k' M<, in SSH 1 this structure is indexed by destination * host:port pair, whereas in SSH 2 it char *sportdesctypedef void (*chandler_fn_t)(Ssh ssh, struct Packet *pktin, void *ctx); struct queued_handler; struct queued_handler { int msg1, msg2; chandler_fn_t handler; void *ctx; struct queued_handler *next; }Queues of one-off handler functions for success/failure * indications from a request. */ struct queued_handler *qhead, *qtail_queueing_handler(Ssh ssh, struct Packet *pktin) { struct queued_handler *qh = ssh->qhead; assert(qh != NULL); assert(pktin->type == qh->msg1 || pktin->type == qh->msg2); if (qh->msg1 > 0) { assert(ssh->packet_dispatch[qh->msg1] == ssh_queueing_handler); ssh->packet_dispatch[qh->msg1] = NULL; } if (qh->msg2 > 0) { assert(ssh->packet_dispatch[qh->msg2] == ssh_queueing_handler); ssh->packet_dispatch[qh->msg2] = 2aF layRDJe5ME; k+yNULL; } if (qh->next) { ssh->qhead = qh->next; if (ssh->qhead->msg1 > 0) { assert(ssh->packet_dispatch[ssh->qhead->msg1] == NULL); ssh->packet_dispatch[ssh->qhead->msg1] = ssh_queueing_handler; } if (ssh->qhead->msg2 > 0) { assert(ssh->packet_dispatch[ssh->qhead->msg2] == NULL); ssh->packet_dispatch[ssh->qhead->msg2] = ssh_queueing_handler; } } else { ssh->qhead = ssh->qtail = NULL; ssh->packet_dispatch[pktin->type] = NULL; } qh->handler(ssh, pktin, qh->ctx); sfree(qh); } static void ssh_queue_handler(Ssh ssh, int msg1, int msg2, chandler_fn_t handler, void *ctx) { struct queued_handler *qh; qh = snew(struct queued_handler); qh->msg1 = msg1; qh->msg2 = msg2; qh->handler = handler; qh->ctx = ctx; qh->next = NULL; if (ssh->qtail == NULL) { ssh->qhead = qh; if (qh->msg1 > 0) { assert(ssh->packet_dispatch[qh->msg1] == NULL); ssh->packet_dispatch[qh->msg1] = ssh_queueing_handler; } if (qh->msg2 > 0) { assert(ssh->packet_dispatch[qh->msg2] == NULL); ssh->packet_dispatch[qh->msg2] = ssh_queueing_handler; } } else { ssh->qtail->next = qh; } ssh->qtail = qh; } static void ssh_rportfwd_succfail(Ssh ssh, struct Packet *pktin, void *ctx) { struct ssh_rportfwd *rpf, *pf = (struct ssh_rportfwd *)ctx; if (pktin->type == (ssh->version == 1 ? SSH1_SMSG_SUCCESS : SSH2_MSG_REQUEST_SUCCESS)) { logeventf(ssh, "Remote port forwarding from %s enabled", pf->sportdesc); } else { logeventf(ssh, "Remote port forwarding from %s refused", pf->sportdesc); rpf = del234(ssh->rportfwds, pf); assert(rpf == pf); sfree(pf->sportdesc); sfree(pf); } } static void ssh_setup_portfwd(Ssh ssh, const Config *cfg) { char type; int n; int sport,dport,sserv,dserv; char sports[256], dports[256], saddr[256], host[256]; const char *portfwd_strptr; portfwd_strptr = cfg->portfwd; while (*portfwd_strptr) { type = *portfwd_strptr++; saddr[0] = '\0'; n = 0; while (*portfwd_strptr && *portfwd_strptr != '\t') { if (*portfwd_strptr == ':') { /* * We've seen a colon in the middle of the * source port number. This means that * everything we've seen until now is the * source _address_, so we'll move it into * saddr and start sports from the beginning * again. */ portfwd_strptr++; sports[n] = '\0'; if (ssh->version == 1 && type == 'R') { logeventf(ssh, "SSH1 cannot handle remote source address " "spec \"%s\"; ignoring", sports); } else strcpy(saddr, sports); n = 0; } if (n < 255) sports[n++] = *portfwd_strptr++; } sports[n] = 0; if (type != 'D') { if (*portfwd_strptr == '\t') portfwd_strptr++; n = 0; while (*portfwd_strptr && *portfwd_strptr != ':') { if (n < 255) host[n++] = *portfwd_strptr++; } host[n] = 0; if (*portfwd_strptr == ':') portfwd_strptr++; n = 0; while (*portfwd_strptr) { if (n < 255) dports[n++] = *portfwd_strptr++; } dports[n] = 0; portfwd_strptr++; dport = atoi(dports); dserv = 0; if (dport == 0) { dserv = 1; dport = net_service_lookup(dports); if (!dport) { logeventf(ssh, "Service lookup failed for destination" " port \"%s\"", dports); } } } else { while (*portfwd_strptr) portfwd_strptr++; dport = dserv = -1; portfwd_strptr++; /* eat the NUL and move to next one */ } sport = atoi(sports); sserv = 0; if (sport == 0) { sserv = 1; sport = net_service_lookup(sports); if (!sport) { logeventf(ssh, "Service lookup failed for source" " port \"%s\"", sports); } } if (sport && dport) { /* Set up a description of the source port. */ static char *sportdesc; sportdesc = dupprintf("%.*s%.*s%.*s%.*s%d%.*s", (int)(*saddr?strlen(saddr):0), *saddr?saddr:NULL, (int)(*saddr?1:0), ":", (int)(sserv ? strlen(sports) : 0), sports, sserv, "(", sport, sserv, ")"); if (type == 'L') { /* Verbose description of the destination port */ char *dportdesc = dupprintf("%s:%.*s%.*s%d%.*s", host, (int)(dserv ? strlen(dports) : 0), dports, dserv, "(", dport, dserv, ")"); const char *err = pfd_addforward(host, dport, *saddr ? saddr : NULL, sport, ssh, &ssh->cfg); if (err) { logeventf(ssh, "Local port %s forward to %s" " failed: %s", sportdesc, dportdesc, err); } else { logeventf(ssh, "Local port %s forwarding to %s", sportdesc, dportdesc); } sfree(dportdesc); } else if (type == 'D') { const char *err = pfd_addforward(NULL, -1, *saddr ? saddr : NULL, sport, ssh, &ssh->cfg); if (err) { logeventf(ssh, "Local port %s SOCKS dynamic forward" " setup failed: %s", sportdesc, err); } else { logeventf(ssh, "Local port %s doing SOCKS" " dynamic forwarding", sportdesc); } } else { struct ssh_rportfwd *pf; /* * Ensure the remote port forwardings tree exists. */ if (!ssh->rportfwds) { if (ssh->version == 1) ssh->rportfwds = newtree234(ssh_rportcmp_ssh1); else ssh->rportfwds = newtree234(ssh_rportcmp_ssh2); } pf = snew(struct ssh_rportfwd); strcpy(pf->dhost, host); pf->dport = dport; pf->sport = sport; if (add234(ssh->rportfwds, pf) != pf) { logeventf(ssh, "Duplicate remote port forwarding to %s:%d", host, dport); sfree(pf); } else { logeventf(ssh, "Requesting remote port %s" " forward to %s:%.*s%.*s%d%.*s", sportdesc, host, (int)(dserv ? strlen(dports) : 0), dports, dserv, "(", dport, dserv, ")"); pf->sportdesc = sportdesc; sportdesc = NULL; if (ssh->version == 1) {ssh_queue_handler(ssh, SSH1_SMSG_SUCCESS, SSH1_SMSG_FAILURE, ssh_rportfwd_succfail, pf); } else { struct Packet *pktout; pktout = ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST); ssh2_pkt_addstring(pktout, "tcpip-forward"); ssh2_pkt_addbool(pktout, 1);/* want reply */ if (*saddr) { ssh2_pkt_addstring(pktout, saddr); } else if (ssh->cfg.rport_acceptall) { ssh2_pkt_addstring(pktout, "0.0.0.0"); } else { ssh2_pkt_addstring(pktout, "127.0.0.1"); } ssh2_pkt_adduint32(pktout, sport); ssh2_pkt_send(ssh, pktout); ssh_queue_handler(ssh, SSH2_MSG_REQUEST_SUCCESS, SSH2_MSG_REQUEST_FAILURE, ssh_rportfwd_succfail, pf); } } } sfree(sportdesc); } } } static void ssh1_smsg_stdout_stderr_data(Ssh ssh, struct Packet *pktin) { char *string; int stringlen, bufsize; ssh_pkt_getstring(pktin, &string, &stringlen); if (string == NULL) { bombout(("Incoming terminal data packet was badly formed")); return; } bufsize = from_backend(ssh->frontend, pktin->type == SSH1_SMSG_STDERR_DATA, string, stringlen); if (!ssh->v1_stdout_throttling && bufsize > SSH1_BUFFER_LIMIT) { ssh->v1_stdout_throttling = 1; ssh1_throttle(ssh, +1); } } static void ssh1_smsg_x11X-Serverssh_setup_portfwd(ssh, &ssh->cfg); ssh->packet_dispatch[SSH1_MSG_PORT_OPEN] = ssh1_msg_port_open;ssh_setup_portfwd(ssh, &ssh->cfg); /* * We have spare data. Add it to the channel buffer. */ ssh2_add_channel_data(ssh->mainchan, (char *)in, inlen); s->try_send = TRUE; } if (s->try_send) { int i; struct ssh_channel *c; /* * Try to send data on all channels if we can. */ for (i = 0; NULL != (c = index234(ssh->channels, i)); i++) { int bufsize; if (c->closes) continue; /* don't send on closing channels */ bufsize = ssh2_try_send(c); if (bufsize == 0) { switch (c->type) { case CHAN_MAINSESSION: /* stdin need not receive an unthrottle * notification since it will be polled */ break; case CHAN_X11: x11_unthrottle(c->u.x11.s); break; case CHAN_AGENT: /* agent sockets are request/response and need no * buffer management */ break; case CHAN_SOCKDATA: pfd_unthrottle(c->u.pfd.s); break; } } } } } crFinishV; } /* * Handlers for SSH2 messages that might arrive at any moment. */ void ssh2buf, *msg; int nowlen, reason, msglen; reason = ssh_pkt_getuint32(pktin); ssh_pkt_getstring(pktin, &msg, &msglen); if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) { buf = dupprintf("Received disconnect message (%s)", ssh2_disconnect_reasons[reason]); } else { buf = dupprintf("Received disconnect message (unknown" " type %d)", reason); } logevent(buf); sfree(buf); buf = dupprintf("Disconnection message text: %n%.*s", &nowlen, msglen, msg); logevent(buf); bombout(("Server sent disconnect message\ntype %d (%s):\n\"%s\"", reason, (reason > 0 && reaZ*4 mhtU ssh->qhead = ssh->qtail = NULLwhile (ssh->qhead) { struct queued_handler *qh = ssh->qhead; ssh->qhead = qh->next; sfree(ssh->qhead); } ssh->qhead = ssh->qtail = NULL Revision-number: 5030 Prop-content-length: 894 Content-length: 894 K 7 svn:log V 793 SSH port forwarding is now configurable in mid-session. After doing Change Settings, the port forwarding setup function is run again, and tags all existing port forwardings as `do not keep'. Then it iterates through the config in the normal way; when it encounters a port forwarding which is already in the tree, it tags it `keep' rather than setting it up from scratch. Finally, it goes through the tree and removes any that haven't been labelled `keep'. Hence, editing the list of forwardings in Change Settings has the effect of cancelling any forwardings you remove, and adding any new ones. The SSH panel now appears in the reconfig box, and is empty apart from a message explaining that it has to be there for subpanels of it to exist. Better wording for this message would be welcome. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-28T14:07:05.701423Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d127a681c71bb3fd957f4fb5014dab23 Text-delta-base-sha1: 6108239052fd37873434dfc746ae6671c254d3fd Text-content-length: 6281 Text-content-md5: 3310397ca13537f1df8a75574cc2d7d6 Text-content-sha1: fabcc70a232df38252811877a72125a9dd6e8a23 Content-length: 6281 SVNI D7&`E|D@td@1H@O?@+Dp @, or in a reconfig * when we're not doing SSH. */ if (backends[3].name != NULL && (!midsession || protocol == PROT_SSH)if (midsession) { s = ctrl_getset(b, "Connection/SSH", "disclaimer", NULL); ctrl_text(s, "Nothing on this panel may be reconfigured in mid-" "session; it is only here so that sub-panels of it can " "exist without looking strange.", HELPCTX(no_help)); } if (!midsession) { s = ctrl_getset(b, "Connection/SSH", "data", "Data to send to the server"); ctrl_editbox(s, "Remote command:", 'r', 100, HELPCTX(ssh_command), dlg_stdeditbox_handler, I(offsetof(Config,remote_cmd)), I(sizeof(((Config *)0)->remote_cmd))); s = ctrl_getset(b, "Connection/SSH", "protocol", "Protocol options"); ctrl_checkbox(s, "Don't allocate a pseudo-terminal", 'p', HELPCTX(ssh_nopty), dlg_stdcheckbox_handler, I(offsetof(Config,nopty))); ctrl_checkbox(s, "Don't start a shell or command at all", 'n', HELPCTX(ssh_noshell), dlg_stdcheckbox_handler, I(offsetof(Config,ssh_no_shell))); ctrl_checkbox(s, "Enable compression", 'e', HELPCTX(ssh_compress), dlg_stdcheckbox_handler, I(offsetof(Config,compression))); ctrl_radiobuttons(s, "Preferred SSH protocol version:", NO_SHORTCUT, 4, HELPCTX(ssh_protocol), dlg_stdradiobutton_handler, I(offsetof(Config, sshprot)), "1 only", 'l', I(0), "1", '1', I(1), "2", '2', I(2), "2 only", 'y', I(3), NULL); s = ctrl_getset(b, "Connection/SSH", "encryption", "Encryption options"); c = ctrl_draglist(s, "Encryption cipher selection policy:", 's', HELPCTX(ssh_ciphers), cipherlist_handler, P(NULL)); c->listbox.height = 6; ctrl_checkbox(s, "Enable legacy use of single-DES in SSH 2", 'i', HELPCTX(ssh_ciphers), dlg_stdcheckbox_handler, I(offsetof(Config,ssh2_des_cbc))); /* * The Connection/SSH/Kex panel. */ ctrl_settitle(b, "Connection/SSH/Kex", "Options controlling SSH key exchange"); s = ctrl_getset(b, "Connection/SSH/Kex", "main", "Key exchange algorithm options"); c = ctrl_draglist(s, "Algorithm selection policy", 's', HELPCTX(ssh_kexlist), kexlist_handler, P(NULL)); c->listbox.height = 5; s = ctrl_getset(b, "Connection/SSH/Kex", "repeat", "Options controlling key re-exchange"); ctrl_editbox(s, "Max minutes before rekey (0 for no limit)", 't', 20, HELPCTX(ssh_kex_repeat), dlg_stdeditbox_handler, I(offsetof(Config,ssh_rekey_time)), I(-1)); ctrl_editbox(s, "Max data before rekey (0 for no limit)", 'd', 20, HELPCTX(ssh_kex_repeat), dlg_stdeditbox_handler, I(offsetof(Config,ssh_rekey_data)), I(16)); ctrl_text(s, "(Use 1M for 1 megabyte, 1G for 1 gigabyte etc)", HELPCTX(ssh_kex_repeat)); /* * The Connection/SSH/Auth panel. */ ctrl_settitle(b, "Connection/SSH/Auth", "Options controlling SSH authentication"); s = ctrl_getset(b, "Connection/SSH/Auth", "methods", "Authentication methods"); ctrl_checkbox(s, "Attempt TIS or CryptoCard auth (SSH1)", 'm', HELPCTX(ssh_auth_tis), dlg_stdcheckbox_handler, I(offsetof(Config,try_tis_auth))); ctrl_checkbox(s, "Attempt \"keyboard-interactive\" auth (SSH2)", 'i', HELPCTX(ssh_auth_ki), dlg_stdcheckbox_handler, I(offsetof(Config,try_ki_auth))); s = ctrl_getset(b, "Connection/SSH/Auth", "params", "Authentication parameters"); ctrl_checkbox(s, "Allow agent forwarding", 'f', HELPCTX(ssh_auth_agentfwd), dlg_stdcheckbox_handler, I(offsetof(Config,agentfwd))); ctrl_checkbox(s, "Allow attempted changes of username in SSH2", 'u', HELPCTX(ssh_auth_changeuser), dlg_stdcheckbox_handler, I(offsetof(Config,change_username))); ctrl_filesel(s, "Private key file for authentication:", 'k', FILTER_KEY_FILES, FALSE, "Select private key file", HELPCTX(ssh_auth_privkey), dlg_stdfilesel_handler, I(offsetof(Config, keyfile))); } /* * The Connection/SSH/Tunnels panel. Some of this _is_ * still available in mid-sessionif (!midsession) { s = ctrl_getset(b, "Connection/SSH/Tunnels", "x11", "X11 forwarding"); ctrl_checkbox(s, "Enable X11 forwarding", 'e', HELPCTX(ssh_tunnels_x11), dlg_stdcheckbox_handler,I(offsetof(Config,x11_forward))); ctrl_editbox(s, "X display location", 'x', 50, HELPCTX(ssh_tunnels_x11), dlg_stdeditbox_handler, I(offsetof(Config,x11_display)), I(sizeof(((Config *)0)->x11_display))); HELPCTX(ssh_tunnels_x11auth), dlg_stdradiobutton_handler, I(offsetof(Config, x11_auth)), "MIT-Magic-Cookie-1", I(X11_MIT), "XDM-Authorization-1", I(X11_XDM), NULL); }if (!midsession) { /* * The Connection/SSH/Bugs panel. */ ctrl_settitle(b, "Connection/SSH/Bugs", "Workarounds for SSH server bugs"); s = ctrl_getset(b, "Connection/SSH/Bugs", "main", "Detection of known bugs in SSH servers"); ctrl_droplist(s, "Chokes on SSH1 ignore messages", 'i', 20, HELPCTX(ssh_bugs_ignore1), sshbug_handler, I(offsetof(Config,sshbug_ignore1))); HELPCTX(ssh_bugs_plainpw1), sshbug_handler, I(offsetof(Config,sshbug_plainpw1))); ctrl_droplist(s, "Chokes on SSH1 RSA authentication", 'r', 20, HELPCTX(ssh_bugs_rsa1), sshbug_handler, I(offsetof(Config,sshbug_rsa1))); ctrl_droplist(s, "Miscomputes SSH2 HMAC keys", 'm', 20, HELPCTX(ssh_bugs_hmac2), sshbug_handler, I(offsetof(Config,sshbug_hmac2))); ctrl_droplist(s, "Miscomputes SSH2 encryption keys", 'e', 20, HELPCTX(ssh_bugs_derivekey2), sshbug_handler, I(offsetof(Config,sshbug_derivekey2))); ctrl_droplist(s, "Requires padding on SSH2 RSA signatures", 'p', 20, HELPCTX(ssh_bugs_rsapad2), sshbug_handler, I(offsetof(Config,sshbug_rsapad2))); ctrl_droplist(s, "Misuses the session ID in PK auth", 'n', 20, HELPCTX(ssh_bugs_pksessid2), sshbug_handler, I(offsetof(Config,sshbug_pksessid2))); } Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a8845b4466d537f7919da44a74d1547f Text-delta-base-sha1: 3cfb2c1750169315a244e7dd818b6f21a2352195 Text-content-length: 1986 Text-content-md5: 5e7bafb25729c560a8b7fd39f39416fb Text-content-sha1: 088beed98069a43e61316473240a6a19fe229cd4 Content-length: 1986 SVNI3I0You can modify the currently active set of port forwardings in mid-session using \q{Change Settings}. If you delete a local or dynamic port forwarding in mid-session, PuTTY will stop listening for connections on that port, so it can be re-used by another program. If you delete a remote port forwarding, note that: \b The SSHv1 protocol contains no mechanism for asking the server to stop listening on a remote port. \b The SSHv2 protocol does contain such a mechanism, but not all SSH servers support it. (In particular, OpenSSH does not support it in any version earlier than 3.9.) If you ask to delete a remote port forwarding and PuTTY cannot make the server actually stop listening on the port, it will instead just start refusing incoming connections on that port. Therefore, although the port cannot be reused by another program, you can at least be reasonably sure that server-side programs can no longer access the service at your end of the port forwarding['LL[h-bug-plainpw1}. If this bug is enabled when talking to a correct server, the session will succeed, but keepalives will not work and the session might be more vulnerable to eavesdroppers than it could be. This is an SSH1-specific bug. No known SSH2 server fails to deal with SSH2 ignore messages. \S{config-ssh-bug-plainpw1} \q{Refuses all SSH1 password camouflage} \cfg{winhelp-topic}{ssh.bugs.plainpw1} When talking to an SSH1 server which cannot deal with ignore messages (see \k{config-ssh-bug-ignore1}), PuTTY will attempt to disguise the length of the user's password by sending additional padding \e{within} the password packet. This is technically a violation of the SSH1 specification, and so PuTTY will only do it when it cannot use standards-compliant ignore messages as camouflage. In this sense, for a server to refuse to accept a padded password packet is not really a bug, but it does make life inconvenient if the server can also not handle ignore mess Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bf0f0648206d46d821daf95c2e4bd888 Text-delta-base-sha1: b693c1c35b5167ad7d5e1b9061e3d91861b98b5b Text-content-length: 166 Text-content-md5: 6b32e0b4008c93b7690a18917c5d3c38 Text-content-sha1: 891392761f49722053f9afb982550f6512ae6c01 Content-length: 166 SVN+6+XZWZ,, void **sockdata*sockdata = (void *)s/* * Terminate a listener. */ void pfd_terminate(void *sv) { pfd_close((Socket)sv Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1dcff83379ea2747ad26868543314be1 Text-delta-base-sha1: 2e67c97615b594093743137d0ac59ceaf8490bc1 Text-content-length: 11041 Text-content-md5: 0b405a048bd9ac7a281425b7006b74eb Text-content-sha1: 7a1c06257639c16b53dc2202dac9ff16e20e243c Content-length: 11041 SVN%/c9 b1portfwd; /* forward declaration */ struct ssh_rportfwd { unsigned sport, dport; char dhost[256]; char *sportdesc; struct ssh_portfwd *pfrec; }; #define free_rportfwd(pf) ( \ ((pf) ? (sfree((pf)->sportdesc)) : (void)0 ), sfree(pf) ) /* * Separately to the rportfwd tree (which is for looking up port * open requests from the server), a tree of _these_ structures is * used to keep track of all the currently open port forwardings, * so that we can reconfigure in mid-session if the user requests * it. */ struct ssh_portfwd { int keep; int type; unsigned sport, dport; char *saddr, *daddr; struct ssh_rportfwd *remote; void *local; }; #define free_portfwd(pf) ( \ ((pf) ? (sfree((pf)->saddr), sfree((pf)->daddr)) : (void)0 ), sfree(pf) ), */* * Special form of strcmp which can cope with NULL inputs. NULL is * defined to sort before even the empty string. */ static int nullstrcmp(const char *a, const char *b) { if (a == NULL && b == NULL) return 0; if (a == NULL) return -1; if (b == NULL) return +1; return strcmp(a, b); } static int ssh_portcmp(void *av, void *bv) { struct ssh_portfwd *a = (struct ssh_portfwd *) av; struct ssh_portfwd *b = (struct ssh_portfwd *) bv; int i; if (a->type > b->type) return +1; if (a->type < b->type) return -1; if ( (i = nullstrcmp(a->saddr, b->saddr)) != 0) return i < 0 ? -1 : +1; if (a->sport > b->sport) return +1; if (a->sport < b->sport) return -1; if (a->type != 'D') { if ( (i = nullstrcmp(a->daddr, b->daddr)) != 0) return i < 0 ? -1 : +1; if (a->dport > b->dport) return +1; if (a->dport < b->dport) return -1; }Fm $4.'tY&QQw"%?." 8ed port closed"); } } } int sshfwd_write(struct ssh_channel *c, char *buf, int len) { Ssh ssh = c->ssh; if (ssh->state != SSH_STATE_SESSION) { assert(ssh->state == SSH_STATE_CLOSED); return 0; } if (ssh->version == 1) { send_packet(ssh, SSH1_MSG_CHANNEL_DATA, PKT_INT, c->remoteid, PKTT_DATA, PKT_INT, len, PKT_DATA, buf, len, PKTT_OTHER, PKT_END); /* * In SSH1 we can return 0 here - implying that forwarded * connections are never individually throttled - because * the only circumstance that can cause throttling will be * the whole SSH connection backing up, in which case * _everything_ will be throttled as a whole. */ return 0; } else { ssh2_add_channel_data(c, buf, len); return ssh2_try_send(c); } } void sshfwd_unthrottle(struct ssh_channel *c, int bufsize) { Ssh ssh = c->ssh; if (ssh->state != SSH_STATE_SESSION) { assert(ssh->state == SSH_STATE_CLOSED); return; } if (ssh->version == 1) { if (c->v.v1.throttling && bufsize < SSH1_BUFFER_LIMIT) { c->v.v1.throttling = 0; ssh1_throttle(ssh, -1); } } else { ssh2_set_window(c, OUR_V2_WINSIZE - bufsize); } } static void ssh_queueing_handler(Ssh ssh, struct Packet *pktin) { struct queued_handler *qh = ssh->qhead; assert(qh != NULL); assert(pktin->type == qh->msg1 || pktin->type == qh->msg2); if (qh->msg1 > 0) { assert(ssh->packet_dispatch[qh->msg1] == ssh_queueing_handler); ssh->packet_dispatch[qh->msg1] = NULL; } if (qh->msg2 > 0) { assert(ssh->packet_dispatch[qh->msg2] == ssh_queueing_handler); ssh->packet_dispatch[qh->msg2] = free_rportfwdif (!ssh->portfwds) { ssh->portfwds = newtree234(ssh_portcmp); } else { /* * Go through the existing port forwardings and tag them * with keep==FALSE. Any that we want to keep will be * re-enabled as we go through the configuration and find * out which bits are the same as they were before. */ struct ssh_portfwd *epf; int i; for (i = 0; (epf = index234(ssh->portfwds, i)) != NULL; i++) epf->keep = FALSE; }ruct ssh_portfwd *pfrec, *epfrec; pfrec = snew(struct ssh_portfwd); pfrec->type = type; pfrec->saddr = *saddr ? dupstr(saddr) : NULL; pfrec->sport = sport; pfrec->daddr = dupstr(host); pfrec->dport = dport; pfrec->local = NULL; pfrec->remote = NULL; epfrec = add234(ssh->portfwds, pfrec); if (epfrec != pfrec) { /* * We already have a port forwarding with precisely * these parameters. Hence, no need to do anything; * simply tag the existing one as `keep'. */ epfrec->keep = TRUE; free_portfwd(pfrec); } else, &pfrec->local, &pfrec->local pfrec->remote = pf; pf->pfrec = pfrec /* * Now go through and destroy any port forwardings which were * not re-enabled. */ { struct ssh_portfwd *epf; int i; for (i = 0; (epf = index234(ssh->portfwds, i)) != NULL; i++) if (!epf->keep) { char *message; message = dupprintf("%s port forwarding from %s%s%d", epf->type == 'L' ? "local" : epf->type == 'R' ? "remote" : "dynamic", epf->saddr ? epf->saddr : "", epf->saddr ? ":" : "", epf->sport); if (epf->type != 'D') { char *msg2 = dupprintf("%s to %s:%d", message, epf->daddr, epf->dport); sfree(message); message = msg2; } logeventf(ssh, "Cancelling %s", message); sfree(message); if (epf->remote) { struct ssh_rportfwd *rpf = epf->remote; struct Packet *pktout; /* * Cancel the port forwarding at the server * end. */ if (ssh->version == 1) { /* * We cannot cancel listening ports on the * server side in SSH1! There's no message * to support it. Instead, we simply remove * the rportfwd record from the local end * so that any connections the server tries * to make on it are rejected. */ } else { pktout = ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST); ssh2_pkt_addstring(pktout, "cancel-tcpip-forward"); ssh2_pkt_addbool(pktout, 0);/* _don't_ want reply */ if (epf->saddr) { ssh2_pkt_addstring(pktout, epf->epf->sport); ssh2_pkt_send(ssh, pktout); } del234(ssh->rportfwds, rpf); free_rportfwd(rpf); } else if (epf->local) { pfd_terminate(epf->local); } delpos234(ssh->portfwds, i); free_portfwd(epf); i--; /* so we don't skip one in the list */ *EN<< ~.|nt("All environment variables successfully set"); } else if (s->env_ok == 0) { logevent("All environment variables refused"); c_write_str(ssh, "Server refused to set environment variables\r\n"); } else { logeventf(ssh, "%d environment variables refused", s->num_env - s->env_ok); c_write_str(ssh, "Server refused to set all environment variables\r\n"); } } /* * Start a shell or a remote command. We may have to attempt * this twice if the config data has provided a second choice * of command. */ if (ssh->mainchan) while (1) { int subsys; char *cmd; if (ssh->fallback_cmd) { subsys = ssh->cfg.ssh_subsys2; cmd = ssh->cfg.remote_cmd_ptr2; } else { subsys = ssh->cfg.ssh_subsys; cmd = ssh->cfg.remote_cmd_ptr; } s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid); /* recipient channel */ if (subsys) { ssh2_pkt_addstring(s->pktout, "subsystem"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_addstring(s->pktout, cmd); } else if (*cmd) { ssh2_pkt_addstring(s->pktout, "exec"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_addstring(s->pktout, cmd); } else { ssh2_pkt_addstring(s->pktout, "shell"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ } ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Unexpected response to shell/command request:" " packet type %d", pktin->type)); crStopV; } /* * We failed to start the command. If this is the * fallback command, we really are finished; if it's * not, and if the fallback command exists, try falling * back to it before complaining. */ if (!ssh->fallback_cmd && ssh->cfg.remote_cmd_ptr2 != NULL) { logevent("Primary command failed; attempting fallback"); ssh->fallback_cmd = TRUE; continue; } bombout(("Server refused to start a shell/command")); crStopV; } else { logevent("Started a shell/command"); } break; } ssh->state = SSH_STATE_SESSION; if (ssh->size_needed) ssh_size(ssh, ssh->term_width, ssh->term_height); if (ssh->eof_needed) ssh_special(ssh, TS_EOF); /* * Transfer data! */ if (ssh->ldisc) ldisc_send(ssh->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */ if (ssh->mainchan) ssh->send_ok = 1; while (1) { crReturnV; s->try_send = FALSE; if (pktin) { /* * _All_ the connection-layer packets we expect to * receive are now handled by the dispatch table. * Anything that reaches here must be bogus. */ bombout(("Strange packet received: type %d", pktin->type)); crStopV; } else if (ssh->mainchan) { /* * We have spare data. Add it to the channel buffer. */ ssh2_add_channel_data(ssh->mainchan, (char *)in, inlen); s->try_send = TRUE; } if (s->try_send) { int i; struct ssh_channel *c; /* * Try to send data on all channels if we can. */ for (i = 0; NULL != (c = index234(ssh->channels, i)); i++) { int bufsize; if (c->closes) continue; /* don't send on closing channels */ bufsize = ssh2_try_send(c); if (bufsize == 0) { switch (c->type) { case CHAN_MAINSESSION: /* stdin need not receive an unthrottle * notification since it will be polled */ break; case CHAN_X11: x11_unthrottle(c->u.x11.s); break; case CHAN_AGENT: /* agent sockets are request/response and need no * buffer management */ break; case CHAN_SOCKDATA: pfd_unthrottle(c->u.pfd.s); break; } } } } } crFinishV; } /* * Handlers for SSH2 messages that might arrive at any moment. */ void ssh2_msg_disconnect(Ssh ssh, struct Packet *pktin) { /* log reason code in disconnect message */ char *buf, *msg; int nowlen, reason, msglen; reason = ssh_pkt_getuint32(pktin); ssh_pkt_getstring(pktin, &msg, &msglen); if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) { buf = dupprintf("Received disconnect message (%s)", ssh2_disconnect_reasons[reason]); } else { buf = dupprintf("Received disconnect message (unknown" " type %d)", reason); } logevent(buf); sfree(buf); buf = dupprintf("Disconnection message text: %n%.*s", &nowlen, msglen, msg); logevent(buf); bombout(("Server sent disconnect message\ntype %d (%s):\n\"%s\"", reason, (reason > 0 && rea_setup_portfwd(ssh Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: afa7562649cddea387522967b305231e Text-delta-base-sha1: bec772f2a2691f0c25af2bffdf305389c83ec09b Text-content-length: 115 Text-content-md5: 982525bdd1283cb7e92b39f6dab01d58 Text-content-sha1: 6c55f704b98faca4d3796163a145c8c298c2b6d2 Content-length: 115 SVNQ ]]n', void **sockdata); extern void pfd_close(Socket s); extern void pfd_terminate(void *sockdata Revision-number: 5031 Prop-content-length: 424 Content-length: 424 K 8 svn:date V 27 2004-12-28T14:10:32.920715Z K 7 svn:log V 323 Support reconfiguration of key exchange in mid-session. The fiddly bit is working out when to reschedule the next rekey for when the timeout or data limit changes; sometimes it will be _right now_ because we're already over the new limit. Still to do: the Kex panel should not appear in mid-session if we are using SSHv1. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3310397ca13537f1df8a75574cc2d7d6 Text-delta-base-sha1: fabcc70a232df38252811877a72125a9dd6e8a23 Text-content-length: 1060 Text-content-md5: 9c88a1bd7e862a769333a054fe63de20 Text-content-sha1: 2e78a71f6073820969d717ed92c8c9c4b47d55e8 Content-length: 1060 SVN NPv* } /* * The Connection/SSH/Kex panel. (Owing to repeat key * exchange, this is all meaningful in mid-session.) */ ctrl_settitle(b, "Connection/SSH/Kex", "Options controlling SSH key exchange"); s = ctrl_getset(b, "Connection/SSH/Kex", "main", "Key exchange algorithm options"); c = ctrl_draglist(s, "Algorithm selection policy", 's', HELPCTX(ssh_kexlist), kexlist_handler, P(NULL)); c->listbox.height = 5; s = ctrl_getset(b, "Connection/SSH/Kex", "repeat", "Options controlling key re-exchange"); ctrl_editbox(s, "Max minutes before rekey (0 for no limit)", 't', 20, HELPCTX(ssh_kex_repeat), dlg_stdeditbox_handler, I(offsetof(Config,ssh_rekey_time)), I(-1)); ctrl_editbox(s, "Max data before rekey (0 for no limit)", 'd', 20, HELPCTX(ssh_kex_repeat), dlg_stdeditbox_handler, I(offsetof(Config,ssh_rekey_data)), I(16)); ctrl_text(s, "(Use 1M for 1 megabyte, 1G for 1 gigabyte etc)", HELPCTX(ssh_kex_repeat)); if (!midsession) { Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b405a048bd9ac7a281425b7006b74eb Text-delta-base-sha1: 7a1c06257639c16b53dc2202dac9ff16e20e243c Text-content-length: 1187 Text-content-md5: d67a5dc5968affd294a964db2457747f Text-content-sha1: dc2faae68800b2e300ef283817da7f993521f2fa Content-length: 1187 SVN  [, las,ikcent("Forwardssh->last_rekey = GETTICKCOUNT()E cp`Q'-; } if (s->env_ok == s->num_env) { logeve ssh->cfg.ssh_rekey_time != 0char *rekeying = NULL; unsigned long old_max_data_size; pinger_reconfig(ssh->pinger, &ssh->cfg, cfg); ssh_setup_portfwd(ssh, cfg); if (ssh->cfg.ssh_rekey_time != cfg->ssh_rekey_time && cfg->ssh_rekey_time != 0) { long new_next = ssh->last_rekey + cfg->ssh_rekey_time*60*TICKSPERSEC; long now = GETTICKCOUNT(); if (new_next - now < 0) { rekeying = "Initiating key re-exchange (timeout shortened)"; } else { ssh->next_rekey = schedule_timer(new_next - now, ssh2_timer, ssh); } } old_max_data_size = ssh->max_data_size; ssh->max_data_size = parse_blocksize(cfg->ssh_rekey_data); if (old_max_data_size != ssh->max_data_size && ssh->max_data_size != 0) { if (ssh->outgoing_data_size > ssh->max_data_size || ssh->incoming_data_size > ssh->max_data_size) rekeying = "Initiating key re-exchange (data limit lowered)"; } if (rekeying && !ssh->kex_in_progress) { do_ssh2_transport(ssh, rekeying, -1, NULL); } Revision-number: 5032 Prop-content-length: 239 Content-length: 239 K 7 svn:log V 138 Can't use `d' for an accelerator in the Kex panel, since it clashes with the `d' used for the Down button in the Windows preference list. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-28T14:11:00.974517Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9c88a1bd7e862a769333a054fe63de20 Text-delta-base-sha1: 2e78a71f6073820969d717ed92c8c9c4b47d55e8 Text-content-length: 31 Text-content-md5: 6c958788279bb6c88615d7add82bcfe1 Text-content-sha1: 2e652398fd4ab483aee82d14137ee4f46cfcc02d Content-length: 31 SVNNNei)Ox Revision-number: 5033 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2004-12-28T14:14:38.630472Z K 7 svn:log V 18 This is now done. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/portfwd-reconf Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e227bf4ad12e2d20731a5bfc7f8e5aa1 Text-delta-base-sha1: f304b3193ef362305edace3d123bc2a83609b966 Text-content-length: 383 Text-content-md5: b6c2daf4c88776b830466ccc01752291 Text-content-sha1: d09732a68cc5aa92ad27cf1389c5a64cd648ac90 Content-length: 383 SVNAe\Lu-?Fixed-in: 2004-12-29 Content-type: text/x-html-body

    SGT, 2004-12-28: Should now be done. Turned out to be made a lot easier by the packet-handler restructuring I did in r4901 to fix ssh2-kex-data, ext-data-at-start and portfwd-at-start Revision-number: 5034 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2004-12-28T16:18:17.064699Z K 7 svn:log V 118 Forgot to initialise ssh->portfwds to NULL. Unusually, this was pointed out by the MSVC debugger, not by valgrind :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d67a5dc5968affd294a964db2457747f Text-delta-base-sha1: dc2faae68800b2e300ef283817da7f993521f2fa Text-content-length: 64 Text-content-md5: a329f4ef98839d3687a2b80728383c0f Text-content-sha1: eeb6dc1ee3c9ad3edc11be7a9b94efe0d34c6883 Content-length: 64 SVN4 t7c ssh-> Revision-number: 5035 Prop-content-length: 350 Content-length: 350 K 8 svn:date V 27 2004-12-28T16:46:30.246057Z K 7 svn:log V 249 Ability to save in mid-session! Simplest possible resolution to all the difficult questions about when it's sensible to offer the option of saving to the slot we loaded from: _we never do_. The user must always explicitly specify a slot to save to. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6c958788279bb6c88615d7add82bcfe1 Text-delta-base-sha1: 2e652398fd4ab483aee82d14137ee4f46cfcc02d Text-content-length: 1303 Text-content-md5: ad4feddf23efc49bdbe415752cbf52cd Text-content-sha1: 8f0230cb9baada5cd3a0567ea665695e83399bb4 Content-length: 1303 SVNNXuuLz{S } /* * The Load/Save panel is available even in mid-session. */ s = ctrl_getset(b, "Session", "savedsessions", "Load, save or delete a stored session"); ctrl_columns(s, 2, 75, 25); ssd->sesslist = sesslist; ssd->editbox = ctrl_editbox(s, "Saved Sessions", 'e', 100, HELPCTX(session_saved), sessionsaver_handler, P(ssd), P(NULL)); ssd->editbox->generic.column = 0; /* Reset columns so that the buttons are alongside the list, rather * than alongside that edit box. */ ctrl_columns(s, 1, 100); ctrl_columns(s, 2, 75, 25); ssd->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT, HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->listbox->generic.column = 0; ssd->listbox->listbox.height = 7; ssd->loadbutton = ctrl_pushbutton(s, "Load", 'l', HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->loadbutton->generic.column = 1; ssd->savebutton = ctrl_pushbutton(s, "Save", 'v', HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->savebutton->generic.column = 1; ssd->delbutton = ctrl_pushbutton(s, "Delete", 'd', HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->delbutton Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a623be6693077450952bb2863fe1641 Text-delta-base-sha1: b16ad07cceafd34a98795fc3377317ac4bc701e9 Text-content-length: 32 Text-content-md5: f9a10d592ec828bf3f3b092b6e0dc17f Text-content-sha1: 41d0f7818e8945c82c45f75e6de09913a9f5a2ef Content-length: 32 SVNv{ f&sesslist Node-path: putty-wishlist/data/save-mid-session Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5ca6fe809e2d9042c98de23a6909f235 Text-delta-base-sha1: 9ea1e08cf5a155224f4253479537f3f5f562fb13 Text-content-length: 544 Text-content-md5: 0b8e911398da72956e8249cb65873f15 Text-content-sha1: 3fbbfa98afcde4b2723ce1662bdb0e4461447bc7 Content-length: 544 SVN~  ~

    SGT, 2004-12-28: Someone - I've sadly forgotten who - suggested that the simplest possible solution is not to automatically highlight the session you loaded, or enter its name in the session name box. Just provide the list and the Load/Save buttons, so that you can save over an explicitly named session. Then anyone who modifies the hostname and saves over the original slot has to do so explicitly and deliberately, ensuring that it's probably what they meant to do.

    Therefore, I've now done this. Revision-number: 5036 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:56.290677Z PROPS-END Revision-number: 5037 Prop-content-length: 214 Content-length: 214 K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-28T17:10:53.367433Z K 7 svn:log V 113 Bidi is now pretty good and I intend to have it in the next release, so it's about time to mark it as done here. PROPS-END Node-path: putty-wishlist/data/bidi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 524dd13849d6f4444c12c4f4b7abdf62 Text-delta-base-sha1: f2075d2a3ec8d3b782b1e791009a5b79b3701f47 Text-content-length: 238 Text-content-md5: 555ca82a64abe478cbe38c8b22ab8c06 Text-content-sha1: 28b7876295d87dbd5bd4ccaee5e5c670027ffdba Content-length: 238 SVNV. WXWCFixed-in: 2004-12-28

    SGT, 2004-12-28: There's been a lot of work on this recently, including some serious stability changes, and I think I'm now willing to declare this fixed enough to go into a release. Revision-number: 5038 Prop-content-length: 370 Content-length: 370 K 7 svn:log V 269 The latest unfix.org IPv6 patch contains these apparently IPv6-unrelated changes, which convert ints into unsigned in a few key places in ssh.c. Looks harmless at worst, possibly terribly useful, so I think we'll have these no matter what the real IPv6 stuff is up to! K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-28T17:12:20.379560Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a329f4ef98839d3687a2b80728383c0f Text-delta-base-sha1: eeb6dc1ee3c9ad3edc11be7a9b94efe0d34c6883 Text-content-length: 197 Text-content-md5: b8bef068362b18f1b5d7c4e8f7599142 Text-content-sha1: 435748952e3633dddbc6b28fdf484e20fe18f1bf Content-length: 197 SVN10Q!h2|904gcunsignedunsignedunsignedunsignedunsignedunsigned4j64 } else { s->env_ok++; } s->env_left- Revision-number: 5039 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2004-12-28T22:48:15.049600Z K 7 svn:log V 20 Freshen some links. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/team.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b9e21a4d3b6321b677ee17a49fc7eec Text-delta-base-sha1: 3e167827cee13a4698c83a23d4fe3472c11c798e Text-content-length: 39 Text-content-md5: 44294672de70ea6f100c062128d9e940 Text-content-sha1: 42da80bf8dc41a1d1dbeb4bb17ab63377d030740 Content-length: 39 SVN(  uzv2/bjh21.me.uk Revision-number: 5040 Prop-content-length: 439 Content-length: 439 K 8 svn:date V 27 2004-12-29T12:32:25.328364Z K 7 svn:log V 338 Loose end from r5031: the Kex panel should only be displayed in mid-session if we are not using SSHv1. I've done this by introducing a generic `cfg_info' function which every back end can use to communicate an int's worth of data to setup_config_box; in SSH that's the protocol version in use, and in everything else it's currently zero. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ad4feddf23efc49bdbe415752cbf52cd Text-delta-base-sha1: 8f0230cb9baada5cd3a0567ea665695e83399bb4 Text-content-length: 1052 Text-content-md5: 8b3e9694c8adced111b59a06ab22cdee Text-content-sha1: 61e9f3d92192381af749902dbf9642e2a355ed5f Content-length: 1052 SVNXOxIIg M, int protcfginfo _if_ * we're using SSH2 or haven't decided yet.) */ if (protcfginfo != 1) { ctrl_settitle(b, "Connection/SSH/Kex", "Options controlling SSH key exchange"); s = ctrl_getset(b, "Connection/SSH/Kex", "main", "Key exchange algorithm options"); c = ctrl_draglist(s, "Algorithm selection policy", 's', HELPCTX(ssh_kexlist), kexlist_handler, P(NULL)); c->listbox.height = 5; s = ctrl_getset(b, "Connection/SSH/Kex", "repeat", "Options controlling key re-exchange"); ctrl_editbox(s, "Max minutes before rekey (0 for no limit)", 't', 20, HELPCTX(ssh_kex_repeat), dlg_stdeditbox_handler, I(offsetof(Config,ssh_rekey_time)), I(-1)); ctrl_editbox(s, "Max data before rekey (0 for no limit)", 'x', 20, HELPCTX(ssh_kex_repeat), dlg_stdeditbox_handler, I(offsetof(Config,ssh_rekey_data)), I(16)); ctrl_text(s, "(Use 1M for 1 megabyte, 1G for 1 gigabyte etc)", HELPCTX(ssh_kex_repeat)); } Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ed5e1493dbb8a90352154fea6e613678 Text-delta-base-sha1: a7089be264c8e59c784236a56d6dfe1443561812 Text-content-length: 27 Text-content-md5: 9563c85ce2cb640419a45a598b1c6da3 Text-content-sha1: 027f7ba4f7db362f3412487c394bdaefb42520df Content-length: 27 SVNt 4OP/* $Id Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4407a9ea6461e07056f53d6f11fbde7d Text-delta-base-sha1: 140beea19299a7872e4889f18fef8df0eecf7ee9 Text-content-length: 73 Text-content-md5: 5d203a0c41a44c4b6da14ffda7013c68 Text-content-sha1: 42b260eb8cd33105a8df4225e7016aeb49800026 Content-length: 73 SVN>s*FC;@~(*cfg_info) (void *handle, int protcfginfo Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0048b980a1912a62aa4a6f2d318ddba0 Text-delta-base-sha1: 30b5fd67feb836fe60227871e89180690e91cc47 Text-content-length: 134 Text-content-md5: b076a6b8d42106182a80578507e09461 Text-content-sha1: 2d2830b77a6e9dc575fbd4b537b2ad1029f5b76b Content-length: 134 SVN oeX6T/* * cfg_info for Raw does nothing at all. */ static int raw_cfg_info(void *handle) { raw_cfg_info, 1 }; Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fc264f5e90735a72d4891353e5390eaf Text-delta-base-sha1: 7f89b61a35d25839f472da17ef1c274e00e1b8e4 Text-content-length: 135 Text-content-md5: 5e40074acacfeddca647464e58647962 Text-content-sha1: 1c6d176b95afdcf00dbf23b6c67f59ad92be93c9 Content-length: 135 SVNm'^f v/* * cfg_info for rlogin does nothing at all. */ static int rlogin_cfg_info(void *handle) { rlogin_cfg_info Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b8bef068362b18f1b5d7c4e8f7599142 Text-delta-base-sha1: 435748952e3633dddbc6b28fdf484e20fe18f1bf Text-content-length: 293 Text-content-md5: 707ad280bb2cf7b3d970ba49068bb422 Text-content-sha1: 66a5540a4e2d7a51296564c00c5af12553e46b9b Content-length: 293 SVNjWhP\cfg_info for SSH is the currently running version of the * protocol. (1 for 1; 2 for 2; 0 for not-decided-yet.) */ static int ssh_cfg_info(void *handle) { Ssh ssh = (Ssh) handle; return ssh->versionssh_cfg_info, 22 }; Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b62a436517f95cc4cbf2d707f4ab58f3 Text-delta-base-sha1: 922cd739c2acb645c9a4e027f00a7141331fc54e Text-content-length: 148 Text-content-md5: 140d834cab5e6a7e64131e097b70530b Text-content-sha1: 337ad26852a7de9604979766d083f48d9620353a Content-length: 148 SVN y2^f!/* * cfg_info for Telnet does nothing at all. */ static int telnet_cfg_info(void *handle) { telnet_cfg_info, 23 }; Node-path: putty/testback.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f0bb1e79d7dad4d14157920f475afee8 Text-delta-base-sha1: bb00866888e2249cd8a3a640e237249c75c2c145 Text-content-length: 132 Text-content-md5: 90decf5985e0aaaf5a57af1ffedd7141 Text-content-sha1: e6090e1541159c80d03af6c5ffa28037751bb17f Content-length: 132 SVNHwcF8}xNz/* $Id null_cfg_info null_cfg_infostatic int null_cfg_info(void *handle) { return 0; } Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d6e128e679b08e6074b28a446dcaa37f Text-delta-base-sha1: 04a073aa21ec8fec2fd543f3f17b0f794a085112 Text-content-length: 67 Text-content-md5: 8cbf3a3e42e482386479fa61a557f3a6 Text-content-sha1: c91884c1b8cb9d2dbac52e891405d699f05957f0 Content-length: 67 SVNMo"7R7D , int protcfginfo, protcfginfo Node-path: putty/unix/pterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 47e46d0ad35477f98a4151fbad4b1c10 Text-delta-base-sha1: 2b4582de44ef07f9b9ce43d2277916ebf4b7a523 Text-content-length: 162 Text-content-md5: f625c5462d53f34360e9dc592fb9ece7 Text-content-sha1: 01a0f97d3d24a37bee0a486d868f263a5d561873 Content-length: 162 SVN =7 7, inst->back?inst->back->cfg_info(inst->backhandle):0<=ake_mouse_ptr(inst, -2); /* clean up cursor font */ Node-path: putty/unix/pty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b221a59c6b6e846c29b64ca2f424216 Text-delta-base-sha1: 77366d9cfb6b859bba7bade8c353d2797ffda6c7 Text-content-length: 101 Text-content-md5: c27f60dd8e6c249422c06b46705599b8 Text-content-sha1: 6b4b6f49785f7e90f2a6dbd7ea29324c6ac1589f Content-length: 101 SVN~I KT*Ostatic int pty_cfg_info(void *handle) { return 0pty_cfg_info, 1 }; Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 78af47815c4257ea37c55c703ffab750 Text-delta-base-sha1: 4253fda049cb0f0817330bf3d603bfecb960f1ff Text-content-length: 57 Text-content-md5: 02ed78bdccd65cdf67da9981c78c0f68 Text-content-sha1: b7091797da23002539984258d97dfcd0fecad08a Content-length: 57 SVNj $*19 int midsession, int protcfginfo Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 473d2502f4cfbe77e0b921581d750095 Text-delta-base-sha1: a03c0fad8f954ea37d615a045b7fca7c2535f466 Text-content-length: 20 Text-content-md5: 8aef74bc313a0cbfb8c54d5a7b9aa045 Text-content-sha1: 87a7c1af953813115848a383eec8382d3fad8df9 Content-length: 20 SVN,/ 7x4 Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f9a10d592ec828bf3f3b092b6e0dc17f Text-delta-base-sha1: 41d0f7818e8945c82c45f75e6de09913a9f5a2ef Text-content-length: 64 Text-content-md5: 0aec380bd775a45a5c0c29647b5b8d11 Text-content-sha1: 26aff1fd877c6ace8455919a9c0eef64b6bb6886 Content-length: 64 SVN{u~6sR), int protcfginfo, protcfginfo Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 039a637ccbf9335fb979abd86f5f24bc Text-delta-base-sha1: 1b06e77eaf6c98f28e5dbd2b3a2cd6a83ff4c137 Text-content-length: 121 Text-content-md5: b9fc1a67d86d2918c89d97bc18fef7e9 Text-content-sha1: 9620c9927a1f4b77feac6d17f7d9134d3fc8d6bc Content-length: 121 SVN 'ipi, back ? back->cfg_info(backhandle) : 0T{'T if (code > 15) offt++; if ( Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73517be99ed4e5f6836c91468a6e8d42 Text-delta-base-sha1: 064420d1dd80f05ff8e129ceb6f522e9c0625941 Text-content-length: 26 Text-content-md5: fbfbc74cf99a14d10cd1d4fe0032e990 Text-content-sha1: 7c2a46709119fe10447c07a67ddd0216b24378df Content-length: 26 SVN , int Revision-number: 5041 Prop-content-length: 260 Content-length: 260 K 7 svn:log V 159 Add some discussion of rekeys-as-keepalives, and their potential adverse effect on the life expectancy of a low-use connection over a low-reliability network. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-29T13:44:20.615214Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e7bafb25729c560a8b7fd39f39416fb Text-delta-base-sha1: 088beed98069a43e61316473240a6a19fe229cd4 Text-content-length: 1674 Text-content-md5: 7f43bed8022b21e7d7b4d99771096e18 Text-content-sha1: 850f8d9daa4dfb161eca5a85011421cda8b8505a Content-length: 1674 SVN?m?T \e{server} may still initiate rekeys.) You might have a need to disable rekeys completely for the same reasons that keepalives aren't always helpful. If you anticipate suffering a network dropout of several hours in the middle of an SSH connection, but were not actually planning to send \e{data} down that connection during those hours, then an attempted rekey in the middle of the dropout will probably cause the connection to be abandoned, whereas if rekeys are disabled then the connection should in principle survive (in the absence of interfering firewalls). See \k{config-keepalive} for more discussion of these issues; for these purposes, rekeys have much the same properties as keepalives. (Except that rekeys have cryptographic value in themselves, so you should bear that in mind when deciding whether to turn them off'E'server has the bug. \S{config-ssh-bug-ignore1} \q{Chokes on SSH1 ignore messages} \cfg{winhelp-topic}{ssh.bugs.ignore1} An ignore message (SSH_MSG_IGNORE) is a message in the SSH protocol which can be sent from the client to the server, or from the server to the client, at any time. Either side is required to ignore the message whenever it receives it. PuTTY uses ignore messages to hide the password packet in SSH1, so that a listener cannot tell the length of the user's password; it also uses ignore messages for connection keepalives (see \k{config-keepalive}). If this bug is detected, PuTTY will stop using ignore messages. This means that keepalives will stop working, and PuTTY will have to fall back to a secondary defence against SSH1 password-length eavesdropping. See \k{config-ss Revision-number: 5042 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 Add Fixed-In: header K 10 svn:author V 5 jacob K 8 svn:date V 27 2004-12-30T09:30:37.948379Z PROPS-END Node-path: putty-wishlist/data/save-mid-session Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b8e911398da72956e8249cb65873f15 Text-delta-base-sha1: 3fbbfa98afcde4b2723ce1662bdb0e4461447bc7 Text-content-length: 39 Text-content-md5: fc239feca89e5e48c493e1ed7654714b Text-content-sha1: 41e14ae8e19dbaf14b57cc2ceaf54ab5d037afe5 Content-length: 39 SVN onFixed-in: 2004-12-29 Revision-number: 5043 Prop-content-length: 431 Content-length: 431 K 8 svn:date V 27 2004-12-30T10:58:28.824060Z K 7 svn:log V 330 Remove "Load" button in mid-session configuration dialog, as it allows the user to manipulate settings they can't see so could lead to confusion. (Also remove "Delete" button for some sort of UI consistency even though it's harmless.) Also conditionalise other aspects of sessionsaver_handler() that don't make sense mid-session. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b3e9694c8adced111b59a06ab22cdee Text-delta-base-sha1: 61e9f3d92192381af749902dbf9642e2a355ed5f Text-content-length: 1069 Text-content-md5: d2a6cab8929c0bc0363bdff707109b77 Text-content-sha1: b79857384411db1c59849a75b65a8aa904b48945 Content-length: 1069 SVNOKmidsession && (ctrl == ssd->listbox || (ssd->loadbutton && ctrl == ssd->loadbutton))!ssd->midsession && ssd->delbutton && ssd->mimidsession = midsessionif (!midsession) { ssd->loadbutton = ctrl_pushbutton(s, "Load", 'l', HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->loadbutton->generic.column = 1; } else { /* We can't offer the Load button mid-session, as it would allow the * user to load and subsequently save settings they can't see. (And * also change otherwise immutable settings underfoot; that probably * shouldn't be a problem, but.) */ ssd->loadbutton = NULL; } /* "Save" button is permitted mid-session. */if (!midsession) { ssd->delbutton = ctrl_pushbutton(s, "Delete", 'd', HELPCTX(session_saved), sessionsaver_handler, P(ssd)); ssd->delbutton->generic.column = 1; } else { /* Disable the Delete button mid-session too, for UI consistency. */ ssd->delbutton = NULL; } Revision-number: 5044 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2004-12-30T13:36:35.899915Z K 7 svn:log V 14 putty.kgt.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5550ab5d2c1b9f89640506afbb828cda Text-delta-base-sha1: 63dcb6bc069936c09c658bacc69248809a7df447 Text-content-length: 50 Text-content-md5: 8455d2835c951c84a741f4edaa474c93 Text-content-sha1: f943d96d59960d0fa0a1fc8d3357f0faa6be60a5 Content-length: 50 SVN|jJw1dkgt.org/">putty.kgt.org Revision-number: 5045 Prop-content-length: 644 Content-length: 644 K 7 svn:log V 543 I've decided that trying to do wildcards in PSFTP as a special case of directory recursion was a strategic error: it obfuscates sftp_{get,put}_file(), and also it makes it very hard to handle subdirectory wildcards such as `foo/*'. Accordingly, here's a completely different approach, in which sftp_{get,put}_file() are still responsible for directory recursion, but wildcards are expanded in sftp_general_{get,put}() before being passed thereto. Subdirectory wildcards are now handled consistently across Unix, Windows and the remote server. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-30T13:51:37.589137Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ebed22ac8a81c63a8da91c57ed010d39 Text-delta-base-sha1: e4ff1e909e0adc812d53a765277d7f3be7bae31d Text-content-length: 5970 Text-content-md5: e66853356719186b0b47a5940cdd2147 Text-content-sha1: 171494446e1faeacc6cc1f6f5390add73ec26e65 Content-length: 5970 SVNQJyWkUi4oB'xam}N )~3i~ylC(>AE|xKL[5xJT7Ml{C*(q;l{d#/};Qi=D recurse) { struct fxp_attrs attrs; int result; sftp_register(req = fxp_stat_send(. */ if ( recurse, restartrecurse && file_type(fname) == FILE_TYPE_DIRECTORY) { struct fxp_attrs attrs; int result; int nnames, namesize; char *name, **ournames; DirHandle *dh; int i; /* * First, attempt to create the destination directory, * unless it already exists. */ sftp_register(req = fxp_stat_send(ou if (!result || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS) || !(attrs.permissions & 0040000)) { sftp_register(req = fxp_mkdir_send(outmkdir_recv(pktin, rreq); if (!result) { printf("%s: create directory: %s\n", outfname, fxp_error()); return 0; dh = open_directory(fname); if (!dh) { printf("%s: unable to open directory\n", fname); return 0; } while ((name = read_filename(dh)) != NULL) { if (nnames >= namesize) { namesize += 128; ournames = sresize(ournames, namesize, char *); } ournames[nnames++] = name; } close_directory(dh); recurse, restart remote wildcard matcher, providing a similar interface to the * local one in psftp.h. */ typedef struct SftpWildcardMatcher { struct fxp_handle *dirh; struct fxp_names *names; int namepos; char *wildcard, *prefix; } SftpWildcardMatcher; SftpWildcardMatcher *sftp_begin_wildcard_matching(char *name) { char *wildcard; char *unwcdir, *tmpdir, *cdir; int len, check; SftpWildcardMatcher *swcm; struct fxp_handle *dirh; /* * We don't handle multi-level wildcards; so we expect to find * a fully specified directory part, followed by a wildcard * after that. */ wildcard = stripslashes(name, 0); unwcdir = dupstr(name); len = wildcard - name; unwcdir[len] = '\0'; if (len > 0 && unwcdir[len-1] == '/') unwcdir[len-1] = '\0'; tmpdir = snewn(1 + len, char); check = wc_unescape(tmpdir, unwcdir); sfree(tmpdir); if (!check) { printf("Multiple-level wildcards are not supported\n"); sfree(unwcdir); return NULL; } cdir = canonify(unwcdir); sftp_register(req = fxp_opendir_send(cdirh) { swcm = snew(SftpWildcardMatcher); swcm->dirh = dirh; swcm->names = NULL; swcm->wildcard = dupstr(wildcard); swcm->prefix = unwcdir; } else { printf("Unable to open %s: %s\n", cdir, fxp_error()); swcm = NULL; sfree(unwcdir); } sfree(cdir); return swcm; } char *sftp_wildcard_get_filename(SftpWildcardMatcher *swcm) { struct fxp_name *namewhile (1) { if (swcm->names && swcm->namepos >= swcm->names->nnames) { fxp_free_names(swcm->names); swcm->names = NULL; } if (!swcm->names) { sftp_register(req = fxp_readdir_send(swcm->swcm->names = fxp_readdir_recv(pktin, rreq); if (!swcm->names) { if (fxp_error_type() != SSH_FX_EOF) printf("%s: reading directory: %s\n", swcm->prefix, fxp_error()); return NULL; } swcm->namepos = 0; } assert(swcm->names && swcm->namepos < swcm->names->nnames); name = &swcm->names->names[swcm->namepos++]; if (!strcmp(name->filename, ".") || !strcmp(name->filename, "..")) continue; /* expected bad filenames */ if (!vet_filename(name->filename)) { printf("ignoring potentially dangerous server-" "supplied filename '%s'\n", name->filename); continue; /* unexpected bad filename */ } if (!wc_match(swcm->wildcard, name->filename)) continue; /* doesn't match the wildcard */ /* * We have a working filename. Return it. */ return dupprintf("%s%s%s", swcm->prefix, swcm->prefix[strlen(swcm->prefix)-1]=='/' ? "" : "/", name->filename); } } void sftp_finish_wildcard_matching(SftpWildcardMatcher *swcm) {sftp_register(req = fxp_close_send(swcm->dirhfxp_close_recv(pktin, rreq); if (swcm->names) fxp_free_names(swcm->names); sfree(swcm->prefix); sfree(swcm->wildcard); sfree(swcm)rigwret = 1; do { SftpWildcardMatcher *swcm; origfname = cmd->words[i++]; unwcfname = snewn(strlen(origfname)+1, char); if (multiple && !wc_unescape(unwcfname, origfname)) { swcm = sftp_begin_wildcard_matching(origfname); if (!swcm) { sfree(unwcfname); continue; } origwfname = sftp_wildcard_get_filename(swcm); if (!origwfname) { /* Politely warn the user that nothing matched. */ printf("%s: nothing matched\n", origfname); sftp_finish_wildcard_matching(swcm); sfree(unwcfname); continue; } } else { origwfname = origfname; swcm = NULL; } while (origwfname) { fname = canonify(origwfname); if (!fname) { printf("%s: %s\n", origwwfname, 0); ret = sftp_get_file(fname, outfname, recurse, restart); sfree(fname); if (swcm) { sfree(origwfname); origwfname = sftp_wildcard_get_filename(swcm); } else { origwfname = NULL; } } sfree(unwcfname); if (swcm) sftp_finish_wildcard_matching(swcmwfname, *origoutret = 1; do { WildcardMatcher *wcm;wcm = begin_wildcard_matching(fname); wfname = wildcard_get_filename(wcm); if (!wfname) { /* Politely warn the user that nothing matched. */ printf("%s: nothing matched\n", fname); finish_wildcard_matching(wcm); continue; } } else { wfname = fname; wcm = NULL; } while (wfname) { if (!multiple && i < cmd->nwords) origoutfname = cmd->words[i++]; else origoutfname = stripslashes(wif (wcm) { sfree(wfname); finish_wildcard_matching(wcm); } return 0; } ret = sftp_put_file(wfname, outfname, recurse, restart); sfree(outfname); if (wcm) { sfree(wfname); wfname = wildcard_get_filename(wcm); } else { wfname = NULL; } } if (wcm) finish_wildcard_matching(wcm); Revision-number: 5046 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2004-12-30T15:29:38.382872Z K 7 svn:log V 19 Stray // comments. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 707ad280bb2cf7b3d970ba49068bb422 Text-delta-base-sha1: 66a5540a4e2d7a51296564c00c5af12553e46b9b Text-content-length: 85 Text-content-md5: c10b32e565aeb20d44bfdb9c526da580 Text-content-sha1: f5d23fad04ede40070901abbc1cffe9a5ea711cf Content-length: 85 SVNW[ _`w* PKT_STR, , */ Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9fc1a67d86d2918c89d97bc18fef7e9 Text-delta-base-sha1: 9620c9927a1f4b77feac6d17f7d9134d3fc8d6bc Text-content-length: 76 Text-content-md5: 48cf45136a447ea006586e9fe46da32b Text-content-sha1: 392ead6763959b0fe200249443da2294094a4e2f Content-length: 76 SVN O.* SelectClipRgn(hdc, NULL); */{~{0; Revision-number: 5047 Prop-content-length: 736 Content-length: 736 K 8 svn:date V 27 2004-12-30T16:45:11.443535Z K 7 svn:log V 635 Integrate unfix.org's IPv6 patches up to level 10, with rather a lot of polishing to bring them to what I think should in principle be release quality. Unlike the unfix.org patches themselves, this checkin enables IPv6 by default; if you want to leave it out, you have to build with COMPAT=-DNO_IPV6. I have tested that this compiles on Visual C 7 (so the nightlies _should_ acquire IPv6 support without missing a beat), but since I don't have IPv6 set up myself I haven't actually tested that it _works_. It still seems to make correct IPv4 connections, but that's all I've been able to verify for myself. Further testing is needed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4065f9c79fff72a374db71410b7b6508 Text-delta-base-sha1: 91b6e1b0b251f1b0c082a8c4dd0c7c453b7d82e1 Text-content-length: 205 Text-content-md5: a93a7196bc8f489dc3ad44c1a4740507 Text-content-sha1: b80d6cdc81881b6715c4ca7b188ca27e7d48832c Content-length: 205 SVN[" 5k5YNO_IPV6 # Disables PuTTY's ability to make IPv6 connections, enabling # it to compile under development environments which do not # support IPv6 in their header files Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d65d65fd3204bf0de61fc84edfe9eef9 Text-delta-base-sha1: b599c3fc4a8e2f0ef2f8e61726228304abe58b78 Text-content-length: 252 Text-content-md5: 122deada845d28baaf11d73472b02130 Text-content-sha1: 464173628ba7c5b9269d3a5c5b017e2c9a003918 Content-length: 252 SVN6' d d#if (!strcmp(p, "-4") || !strcmp(p, "-ipv4")) { RETURN(1); SAVEABLE(1); cfg->addressfamily = ADDRTYPE_IPV4; } if (!strcmp(p, "-6") || !strcmp(p, "-ipv6")) { RETURN(1); SAVEABLE(1); cfg->addressfamily = ADDRTYPE_IPV6 Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d2a6cab8929c0bc0363bdff707109b77 Text-delta-base-sha1: b79857384411db1c59849a75b65a8aa904b48945 Text-content-length: 2314 Text-content-md5: 7cab7789a2234d1484e90a20c5eb3edd Text-content-sha1: 6ffe9058eb1934da26484e2c38a2443a0517ae4b Content-length: 2314 SVNKkwv$Q=L{f}/9b}glistbox) { char *p = cfg->portfwd } else if (ctrl == pfd->addressfamily) {i, type; int whichbutton; i = 0; whichbutton = dlg_radiobutton_get(pfd->addressfamily, dlg); if (whichbutton == 1) str[i++] = '4'; else if (whichbutton == 2) str[i++] = '6'; whichbutton = dlg_radiobutton_get(pfd->direction, dlg); if (whichbutton == 0) type = 'L'; else if (whichbutton == 1) type = 'R'; else type = 'D'; str[i++] = type; dlg_editbox_get(pfd->sourcebox, dlg, str+i, sizeof(str) - i); if (!str[2type s = ctrl_getset(b, "Connection", "ipversion", "Internet protocol version"); ctrl_radiobuttons(s, NULL, NO_SHORTCUT, #ifndef NO_IPV6 3, #else 2, #endif HELPCTX(connection_ipversion), dlg_stdradiobutton_handler, I(offsetof(Config, addressfamily)), "Auto", NO_SHORTCUT, I(ADDRTYPE_UNSPEC), "IPv4", NO_SHORTCUT, I(ADDRTYPE_IPV4), #ifndef NO_IPV6 "IPv6", NO_SHORTCUT, I(ADDRTYPE_IPV6), #endif NULL); } /* * A sub-panel Connection/Data, containing options that * decide on data to send to the server. */ if (!midsession) { ctrl_settitle(b, "Connection/Data", "Data to send to the server"); s = ctrl_getset(b, "Connection/Data", "login", "Login details"s = ctrl_getset(b, "Connection/Data", "term", "Terminal details s = ctrl_getset(b, "Connection/Data", "env", "Environment variables"if (!midsession) { /* * The Connection/SSH/X11 panel. */ ctrl_settitle(b, "Connection/SSH/X11", "Options controlling SSH X11 forwarding"); s = ctrl_getset(b, "Connection/SSH/X11/* * The Tunnels panel _is_port forwarding");pfd->addressfamily = ctrl_radiobuttons(s, NULL, NO_SHORTCUT, #ifndef NO_IPV6 3, #else 2, #endif HELPCTX(ssh_tunnels_portfwd_ipversion), portfwd_handler, P(pfd), "Auto", NO_SHORTCUT, I(ADDRTYPE_UNSPEC), "IPv4", NO_SHORTCUT, I(ADDRTYPE_IPV4), #ifndef NO_IPV6 "IPv6", NO_SHORTCUT, I(ADDRTYPE_IPV6), #endif Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f43bed8022b21e7d7b4d99771096e18 Text-delta-base-sha1: 850f8d9daa4dfb161eca5a85011421cda8b8505a Text-content-length: 3403 Text-content-md5: dc9b5d6f3fb70fbd5e1996e2dda4fbe6 Text-content-sha1: 18b0462e9769a4fcbac6faf02f0feb7a39c3f0b4 Content-length: 3403 SVN?R  XzzCR ) (F+@@S{config-address-family} \q{Internet protocol} \cfg{winhelp-topic}{connection.ipversion} This option allows the user to select between the old and new Internet protocols and addressing schemes (IPv4 and IPv6). The default setting is \q{Auto}, which means PuTTY will do something sensible and try to guess which protocol you wanted. (If you specify a literal Internet address, it will use whichever protocol that address implies. If you provide a hostname, it will see what kinds of address exist for that hostname; it will use IPv6 if there is an IPv6 address available, and fall back to IPv4 if not.) If you need to force PuTTY to use a particular protocol, you can explicitly set this to \q{IPv4} or \q{IPv6}. \H{config-data} The Data panel The Data panel allows you to configure various pieces of data which can be sent to the server to affect your connection at the far end. Each options on this panel applies to more than one protocol. Options which apply to only one protocol appear on that protocol's configuration panelx11} The X11 panel \cfg{winhelp-topic}{ssh.tunnels.x11} The X11 panel allows you to configure forwarding of X11 over an SSH connection.H{config-ssh-portfwd} The Tunnels panel \cfg{winhelp-topic}{ssh.tunnels.portfwd} The Tunnels panel allows you to configure tunnelling of arbitrary connection types through an SSH connection.E`E3.0 does not, for example). \S{config-ssh-portfwd-address-family} Selecting Internet protocol version for forwarded ports \cfg{winhelp-topic}{ssh.tunnels.portfwd.ipversion} This switch allows you to select a specific Internet protocol (IPv4 or IPv6) for the local end of a forwarded port. By default, it is set on \q{Auto}, which means that: \b for a local-to-remote port forwarding, PuTTY will listen for incoming connections in both IPv4 and (if available) IPv6 \b for a remote-to-local port forwarding, PuTTY will choose a sensible protocol for the outgoing connection. \# FIXME: work out what this paragraph means, reword it for clarity, \# and reinstate it. Note that on Windows the address space for IPv4 and IPv6 is completely disjunct, so listening on IPv6 won't make PuTTY listen on IPv4. This behaviour may be different on most remote hosts when they are not operating Windows. \H{config-ssh-bugs} The Bugs panel Not all SSH servers work properly. Various existing servers have bugs in them, which can make it impossible for a client to talk to them unless it knows about the bug and works around it. Since most servers announce their software version number at the beginning of the SSH connection, PuTTY will attempt to detect which bugs it can expect to see in the server and automatically enable workarounds. However, sometimes it will make mistakes; if the server has been deliberately configured to conceal its version number, or if the server is a version which PuTTY's bug database does not know about, then PuTTY will not know what bugs to expect. The Bugs panel allows you to manually configure the bugs PuTTY expects to see in the server. Each bug can be configured in three states: \b \q{Off}: PuTTY will assume the server does not have the bug. \b \q{On}: PuTTY will assume the server \e{does} have the bug. \b \q{Auto}: PuTTY will use the server's version number announcement to try to guess whether or not the Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 994ebfa3b451117a9c3e326a91fcf971 Text-delta-base-sha1: 79ab8f4c024d0109d5a3cb27335f3219b72d6f4b Text-content-length: 55 Text-content-md5: 2d9f37843960faea73cae6dc945c8626 Text-content-sha1: 84ff3fef95afbf7efa0fa1c0310a944d7507d7cd Content-length: 55 SVNEn ";44 -6 force use of IPv4 or IPv6 Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2aaa9b29ead07709fbb847951cb182c0 Text-delta-base-sha1: 0dca4d051078fdd3db692b24b219d6e6f5a485aa Text-content-length: 55 Text-content-md5: abbb09ef3ced74f0e16a1fca3659c02a Text-content-sha1: 08260e6cb8de049f68da43380b0d85c2ea4ef981 Content-length: 55 SVNd "65/4 -6 force use of IPv4 or IPv6 Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 888bcfe4276a89f924b7a446f6aa8752 Text-delta-base-sha1: b5227d07049b796eb3250baf0295d344cc0bccd8 Text-content-length: 404 Text-content-md5: 6639ab4f279914816fc72b10cb5cfb1c Text-content-sha1: 6e22cf2a8ac397d16482d1ab14d296f76aba23d6 Content-length: 404 SVNeuxxylpversion} \i\c{-4} and \i\c{-6}: specify an \i{Internet protocol version} The \c{-4} and \c{-6} options force PuTTY to use the older Internet protocol \i{IPv4} or the newer \i{IPv6}. These options are equivalent to selecting your preferred Internet protocol version as \q{IPv4} or \q{IPv6} in the Connection panel of the PuTTY configuration box (see \k{config-address-family Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fdc448db6aff01eb3c85c2fcf457d8f5 Text-delta-base-sha1: 351a4946c1c3c0cebb2a8f8a4693578728ad4169 Text-content-length: 65 Text-content-md5: 90f6939093635077380c71d4c3fb1be4 Text-content-sha1: a5408bd1f97f1eeb5b1487c16e73684b26fa0c91 Content-length: 65 SVN 4&#@#+a, int address_family, int address_fami Node-path: putty/network.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 91d2c1bedf333c4477341cfab3e34043 Text-delta-base-sha1: 470f3f788865e06f17a46a4be15c0e5d16acbd7a Text-content-length: 209 Text-content-md5: 76e5157bf5788533f0daa1ab8170c293 Text-content-sha1: 984ce591f56ea23eebb7727c7d426b85e13c37c3 Content-length: 209 SVN8P( {4%o&, int addressfamily); SockAddr name_lookup(char *host, int port, char **canonicalname, const Config *cfg, int addressfamily, int address_family, int address_fami Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6b32e0b4008c93b7690a18917c5d3c38 Text-delta-base-sha1: 891392761f49722053f9afb982550f6512ae6c01 Text-content-length: 109 Text-content-md5: 6bbadecc26924166d1250540451cc4ec Text-content-sha1: cba62c6310fd97660559ec0d86330a7bb38bf4e9 Content-length: 109 SVN\Fd4d*AB, int addressfamily, addressfamily, int address_family, address_family Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48d622f029487eca8b16646809481028 Text-delta-base-sha1: a2a46845cf8ae462465dd685e911723ce0342ef6 Text-content-length: 134 Text-content-md5: f390b15b6f2e28566330a79fce21e4fa Text-content-sha1: 1c26e4ab01ca3f9785c6e93fe985e9d0122bd235 Content-length: 134 SVN%}#V^f^0DQt=E%, int addressfamily, addressfamily, cfg->addressfamily, int addressfamily, addressfami Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8257d510a7f99a173155354308f02135 Text-delta-base-sha1: 6f045716432948a8a3402bbccd9e9ef4881ccba8 Text-content-length: 623 Text-content-md5: a0e55cf03d9dbb7310ead154bb76b531 Text-content-sha1: 36709148e94e6b7e1caa82cf5d8daf1728d0538e Content-length: 623 SVNs(9vaddressfamily == ADDRTYPE_IPV4 ? " (IPv4)" : (cfg->addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" : "")), cfg->addressfamily Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e40074acacfeddca647464e58647962 Text-delta-base-sha1: 1c6d176b95afdcf00dbf23b6c67f59ad92be93c9 Text-content-length: 277 Text-content-md5: 85a552966f9a02843c1698959606671b Text-content-sha1: ce78672e320ae70c02934167238f9985566cf500 Content-length: 277 SVN }G}O6%s", host, (cfg->addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" : (cfg->addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" : ""))); logevent(rlogin->frontend, buf); sfree(buf); } addr = name_lookup(host, port, realhost, cfg, cfg->addressfamily Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d234cad4bf2ab8849460f09d60d3f843 Text-delta-base-sha1: 152933c3b1b361ebd6ab0903db0ac93fbe2ceae2 Text-content-length: 230 Text-content-md5: 39b6e6be34bfbde328e8d326e6fccb48 Text-content-sha1: ec06d7791d4850b96eef1a1e07f92eee69556f56 Content-length: 230 SVNqBu\*jf< Address family selection */ write_setting_i(sesskey, "AddressFamily", cfg->addressfamilyAddress family selection */ gppi(sesskey, "AddressFamily", ADDRTYPE_UNSPEC, &cfg->addressfamily); Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c10b32e565aeb20d44bfdb9c526da580 Text-delta-base-sha1: f5d23fad04ede40070901abbc1cffe9a5ea711cf Text-content-length: 2547 Text-content-md5: 2917a7ae95e925ba4be8afc8711a1416 Text-content-sha1: 0eb425b572e0d360f0c5b37691fd810c136a362e Content-length: 2547 SVNw/ )f: int addressfamily%s", host, (ssh->cfg.addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" : (ssh->cfg.addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" : ""))); addr = name_lookup(host, port, realhost, &ssh->cfg, ssh->cfg.addressfamilyHj=b a{} 1|!,3p czM] c->u.x11.s = NULL; logevent("Forwarded X11 connection terminated"); } else if (c->type == CHAN_SOCKDATA || c->type == CHAN_SOCKDATA_DORMANT) { c->u.pfd.s = NULL; logevaddress_family,address_family = 'A'; type = 'L'; while (*portfwd_strptr && *portfwd_strptr != '\t') { if (*portfwd_strptr == 'A' || *portfwd_strptr == '4' || *portfwd_strptr == '6') address_family = *portfwd_strptr; else if (*portfwd_strptr == 'L' || *portfwd_strptr == 'R' || *portfwd_strptr == 'D') type = *portfwd_strptr; portfwd_strptr++; } saddr[0] = '\0'; pfrec->addressfamily = (address_family == '4' ? ADDRTYPE_IPV4 : address_family == '6' ? ADDRTYPE_IPV6 : ADDRTYPE_UNSPEC), pfrec->addressfamily); logeventf(ssh, "Local %sport %s forward to %s%s%s", pfrec->addressfamily == ADDRTYPE_IPV4 ? "IPv4 " : pfrec->addressfamily == ADDRTYPE_IPV6 ? "IPv6 " : "", sportdesc, dportdesc, err ? " failed: " : "", err); , pfrec->addressfamily); logeventf(ssh, "Local %sport %s SOCKS dynamic forward%s%s", pfrec->addressfamily == ADDRTYPE_IPV4 ? "IPv4 " : pfrec->addressfamily == ADDRTYPE_IPV6 ? "IPv6 " : "", sportdesc, err ? " setup failed: " : "", err);, *pfp pfp = find234(ssh->rportfwds, &pf, NULL); if (pfp, pfp->pfrec->addressfamily, realpf->pfrec->addressfamily[1~LXt2[ val = e; while (*e) e++; e++; s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(s->pktout, "env_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, var, varend-var); ssh2_pkt_addstring(s->pktout, val); ssh2_pkt_send(ssh, s->pktout); s->num_env++; } logeventf(ssh, "Sent %d environment variables", s->num_env); s->env_ok = 0; s->env_left = s->num_env; while (s->env_left > 0) { crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Unexpected response to environment request:" " packet type %d", pktin->type)); crStopV; } Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 982525bdd1283cb7e92b39f6dab01d58 Text-delta-base-sha1: 6c55f704b98faca4d3796163a145c8c298c2b6d2 Text-content-length: 78 Text-content-md5: 573a50340ddfc841f554763199779bdb Text-content-sha1: 6404e950652ea49cef1960c6c2f82b4125f7f221 Content-length: 78 SVNQ3:]::, int addressfamily, int address_family Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 140d834cab5e6a7e64131e097b70530b Text-delta-base-sha1: 337ad26852a7de9604979766d083f48d9620353a Text-content-length: 183 Text-content-md5: aacbe4e9e6f341e9cf373cec436e00b8 Text-content-sha1: fe821b7fecbca1391c0753fff2b87bc5f235334e Content-length: 183 SVN2q9g*%s", host, (cfg->addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" : (cfg->addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" : "")), cfg->addressfamily Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ee0a98b18814b32291cbd2e51e313e20 Text-delta-base-sha1: 4249c8c87a387cc1a6dd517147fe3f5d98c81cfa Text-content-length: 1255 Text-content-md5: 4afa4dff8c2cc369c39c8edbe408b160 Text-content-sha1: 1a84f92e3a0188fb6dd073b77301178e172476dc Content-length: 1255 SVNlpi(,QovT)u YHis5,p5)N-6]9(i,x{F#mwundef NO_, int address_family) { SockAddr ret = snew(struct SockAddr_tag); #ifndef NO_ndef NO_IPV6 hints.ai_flags = AI_CANONNAME; hints.ai_family = address_familyndef NO_ndef NO_ndef NO_ndef NO_ndef NO_ndef NO_ndef NO_ndef NO_ndef NO_, int address_family) { int s; #ifndef NO_IPV6Translate address_family from platform-independent constants * into local reality. */ address_family = (address_family == ADDRTYPE_IPV4 ? AF_INET : address_family == ADDRTYPE_IPV6 ? AF_INET6 : AF_UNSPEC); #ifndef NO_IPV6 /* Let's default to IPv6. * If the stack doesn't support IPv6, we will fall back to IPv4. */ if (address_family == AF_UNSPEC) address_family = AF_INET6; #else /* No other choice, default to IPv4 */ if (address_family == AF_UNSPEC) address_family = AF_INET; #endif /* * Open socket. */ s = socket(address_family, SOCK_STREAM, 0); /* If the host doesn't support IPv6 try fallback to IPv4. */ if (s < 0 && address_family == AF_INET6) { address_family = AF_INET; s = socket(address_family, SOCK_STREAM, 0); }ndef NO_address_family Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f2b84b0c15bcfae774dd8c9a07c97b9 Text-delta-base-sha1: f929dde6fd98da01fbda25e014984763a35a6d25 Text-content-length: 57 Text-content-md5: 6d8511ec879fcb91ee526350d603cd23 Text-content-sha1: f887591bb237d3a8a79ba1710545dc1ca6e329f5 Content-length: 57 SVNH "{4 -6 force use of IPv4 or IPv6 Node-path: putty/windows/win_res.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 19fa31ead42777fde5a53d56fe7f40d7 Text-delta-base-sha1: 514b520a18b36234c60fb2987d3614b56d8eaea6 Text-content-length: 23 Text-content-md5: eb4d38ae17bab99c5434470b4dd2a28a Text-content-sha1: d8cdad08ac3b607606927905b40a86b87f501ef3 Content-length: 23 SVNmm M 30 Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0aec380bd775a45a5c0c29647b5b8d11 Text-delta-base-sha1: 26aff1fd877c6ace8455919a9c0eef64b6bb6886 Text-content-length: 39 Text-content-md5: 72e8ac70e3f6e4f6452c9df4abc59239 Text-content-sha1: 6727a59386c77fcc8a0b6effb8c1afb9bdd3ebc7 Content-length: 39 SVN9LT{!1099 Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48cf45136a447ea006586e9fe46da32b Text-delta-base-sha1: 392ead6763959b0fe200249443da2294094a4e2f Text-content-length: 516 Text-content-md5: f467f462cc4a090030144c412409efa9 Text-content-sha1: a52c7e194330af552b70392319df3cdc8b05635c Content-length: 516 SVN l In * order to protect IPv6 address literals against this * treatment, we do not do this if there's _more_ than one * colon. */ { char *c = strchr(cfg.host, ':'); if (c) { char *d = strchr(c+1, ':'); if (!d) *c = '\0'; } }~QSS~7F'; } else { p += sprintf((char *) p, "\x1B[%c", codes[code-1]); } return p - output; } if ((term->vt52_mode || cfg.funky_type == FUNKY_VT100P) && code >= 11 && code <= 24) { int offt = Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0dad7a9dec8651514272ee1d615010fd Text-delta-base-sha1: 6f45f8965dae5833bd274f2db174e39d4766c437 Text-content-length: 114 Text-content-md5: 0a8fa1c7ed01e5c6fb2592a67785b6c2 Text-content-sha1: a93a203f918d668de126557461381410e104345e Content-length: 114 SVN}WbJA qipversion "connection.ipversiontunnels_portfwd_ipversion "ssh.tunnels.portfwd.ipversion Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e0b6588a3f9ef1d240277ded04cc473 Text-delta-base-sha1: 0179b8a30fb8055e82bb36fa57669ec6d8a4ddd5 Text-content-length: 194 Text-content-md5: 1fd1d7be4519ad0cc1085b4d66559c20 Text-content-sha1: 2bef54eb3199da0b50d34ef7e5e04f197771ab41 Content-length: 194 SVNSo * *8 { /* * Apparently this doesn't work at least on Windows XP SP2. * Thus assume a maximum of 256. It will fail again if it * doesn't fit. */ namelen = 256; } Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8974cdb96f893cd1803f584a1fdc6adb Text-delta-base-sha1: 4e5267fcb7d4b9ad7ce6bb3f2bd08e2d53afc55f Text-content-length: 4262 Text-content-md5: 776c98212121b34d96f1234e46f64852 Text-content-sha1: f25c7d73bcf1e33c777f1dfd572415ee34ea7860 Content-length: 4262 SVN4xw7oZEI'(uOkJe1!M:T eeB|aBW n|Ip~S|+SCpX 9B;jg;C5<quJj8t4Io 'W9`"TWb~'z# Ku=RbR/* * Windows networking abstraction. * * For the IPv6 code in here I am indebted to Jeroen Massar and * unfix.org. #ifndef NO_IPV6 const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT; The hostname field is also used when the hostname has both * an IPv6 and IPv4 address and the IPv6 connection attempt * fails. We then try the IPv4 address. * This 'family' should become an option in the GUI and * on the commandline for selecting a default protocol. */ int family; unsigned long address; /* Address IPv4 style. */ #ifndef NO_IPV6 struct addrinfo *ai; /* Address AF-independent (IPv4+IPv6), int address_family(address_family == ADDRTYPE_IPV4 ? AF_INET : #ifndef NO_IPV6 address_family == ADDRTYPE_IPV6 ? AF_INET6 : #endif AF_UNSPEC); *realhost = '\0'; if ((a = p_inet_addr(host)) == (unsigned long) INADDR_NONE) { #ifndef NO_ */ if (fGetAddrInfo) { struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = ret->family; if (fGetAddrInfo(host, NULL, &hints, &ret->ai) == 0) fallback!) */ if (ret->family == 0) { if (ret->family == AF_UNSPECndef NO_ } else { ret->error = NULL; #ifndef NO_ndef NO_ndef NO_IPV6 if (addr->family == AF_INET6) { /* Try to get the WSAAddressToStringAADDRTOSTR) (LPSOCKADDR lpsaAddress, DWORD dwAddressLength, LPWSAPROTOCOL_INFO lpProtocolInfo, OUT LPTSTR lpszAddressString, IN OUT LPDWORD lpdwAddressStringLength ); FADDRTOSTR fAddrToStr = NULL; HINSTANCE dllWS2 = LoadLibrary("ws2_32.dll"); if (dllWS2) { fAddrToStr = (FADDRTOSTR)GetProcAddress(dllWS2, "WSAAddressToStringA"); if (fAddrToStr) { fAddrToStr(addr->ai->ai_addr, addr->ai->ai_addrlen, NULL, buf, &buflen); } else strncpy(buf, "IPv6", buflen); FreeLibrary(dllWS2); }strncpy(buf, p_inet_ntoa(a), buflen); buf[buflen-1] = '\0'; } else {ndef NO_IPV6 if (addr->family == AF_INET6) { return IN6_IS_ADDR_LOOPBACK((const struct in6_addr *)addr->ai->ai_addr);ndef NO_ndef NO_ndef NO_#ifndef NO_IPV6 /* Let's default to IPv6, this shouldn't hurt anybody * If the stack supports IPv6 it will also allow IPv4 connections. */ if (addr->family == AF_UNSPEC) addr->family = AF_INET6; #else /* No other choice, default to IPv4 */ if (addr->family == AF_UNSPEC) addr->family = AF_INET; #endifndef NO_ /*a6.sin6_addr = in6addr_any; */ /* == 0 done by memset()ndef NO_ndef NO_ndef NO_, int address_familySOCKET s; #ifndef NO_IPV6 SOCKADDR_IN6 a6; #endif SOCKADDR_IN a; Translate address_family from platform-independent constants * into local reality. */ address_family = (address_family == ADDRTYPE_IPV4 ? AF_INET : #ifndef NO_IPV6 address_family == ADDRTYPE_IPV6 ? AF_INET6 : #endif AF_UNSPEC); #ifndef NO_IPV6 /* Let's default to IPv6, this shouldn't hurt anybody * If the stack supports IPv6 it will also allow IPv4 connections. */ if (address_family == AF_UNSPEC) address_family = AF_INET6; #else /* No other choice, default to IPv4 */ if (address_family == AF_UNSPEC) address_family = AF_INET; #endif /* * Open socket. */ s = p_socket(address_familyndef NO_IPV6 if (address_ * (jeroen:) saddr is specified as an address.. eg 2001:db8::1 * Thus we need either a parser that understands [2001:db8::1]:80 * style addresses and/or enhance this to understand hostnames too.ndef NO_IPV6 retcode = p_bind(s, (address_ess_#ifdef NO_IPV6 struct sockaddr_in isa; #else struct sockaddr_storage isa; #endif int addrlen = sizeof(isaisa#ifndef NO_IPV6 if (isa.ss_family == AF_INET && s->localhost_only && !ipv4_is_local_addr(((struct sockaddr_in *)&isa)->sin_addr)) { #else if (s->localhost_only && !ipv4_is_local_addr(isa.sin_addr)) { #endif Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e539feceeca0f90e775e97d202e6f65f Text-delta-base-sha1: 22d1b828f80cd811e62d7994f6a9cf4d46cd1d52 Text-content-length: 57 Text-content-md5: 280750819e54becb42049dea8383087b Text-content-sha1: dec12cc340197de494ba65176c9f515d37494102 Content-length: 57 SVN2i " SGT, 2004-12-30: Now that a kind and helpful user has donated a more up-to-date compiler with up-to-date headers, I have integrated unfix.org's latest patch, polished it a bit, and enabled it by default in the nightly builds. Node-path: putty-wishlist/data/ipv6-patch-update Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d9b581bc1498a52b9d85e27d2b5ec76c Text-delta-base-sha1: f00fbab13b1e10dd46f2b785b3a0540a70a6fcc6 Text-content-length: 202 Text-content-md5: 354c6fb1d9ecfcc825a0721f8100942e Text-content-sha1: 54f6a593b51c65dc5847317166e5711527afa41a Content-length: 202 SVN< 3b'aFixed-in: 2004-12-31

    SGT, 2004-12-30: I have integrated unfix.org's latest patch (v10). It took some polishing, but it's done. Also it's enabled in the nightly builds. Revision-number: 5048 Prop-content-length: 254 Content-length: 254 K 8 svn:date V 27 2004-12-30T17:29:54.063777Z K 7 svn:log V 155 If we're going to define _XOPEN_SOURCE, we should at least define it to a version that includes putenv(). Make it 600 (the current one) for good measure. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/pty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c27f60dd8e6c249422c06b46705599b8 Text-delta-base-sha1: 6b4b6f49785f7e90f2a6dbd7ea29324c6ac1589f Text-content-length: 28 Text-content-md5: 8ba36ab2792d3cd7558ebb5816e0b279 Text-content-sha1: 1a1b07fa1d28c983066aa2ff17c4a73b0d477bf4 Content-length: 28 SVNIM 33 600 Revision-number: 5049 Prop-content-length: 380 Content-length: 380 K 8 svn:date V 27 2004-12-30T17:48:35.924203Z K 7 svn:log V 279 Jacob points out that when we reconfigure port forwarding, we ought to be destroying old ones _before_ creating new ones, so that we can reuse a port for a new purpose without colliding with ourselves. Also fixed port forwarding, which my IPv6 checkin had completely funted :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2917a7ae95e925ba4be8afc8711a1416 Text-delta-base-sha1: 0eb425b572e0d360f0c5b37691fd810c136a362e Text-content-length: 4841 Text-content-md5: 20caf651439e787f73e1e44792671a46 Text-content-sha1: 443ddf61ef23ee1706a2bda2d0be649b949a1a81 Content-length: 4841 SVN>#F\Senum { DESTROY, KEEP, CREATE } statusa->addressfamily > b->addressfamily) return +1; if (a->addressfamily < b->addressfamilyg-P]9fuW #0?_jw}qld0@| C~glG j$[it32(pktout, c->remoteid); ssh2_pkt_send(ssh, pktout); } } c->closes = 1; /* sent MSG_CLOSE */ if (c->type == CHAN_X11) { onst char *portfwd_strptr = cfg->portfwd; struct ssh_portfwd *epf; int istatus==DESTROY. Any that we want to keep will be * re-enabled (status==KEEP) as we go through the * configuration and find out which bits are the same as * they were before. */epf->status = DESTROY; } while (*portfwd_strptr) { char address_family, type; int sport,dport,sserv,dserv; char sports[256], dports[256], saddr[256], host[256]; int n; address_family = 'A'; type = 'L'; if (*portfwd_strptr == 'A' || *portfwd_strptr == '4' || *portfwd_strptr == '6') address_family = *portfwd_strptr++; if (*portfwd_strptr == 'L' || *portfwd_strptr == 'R' || *portfwd_strptr == 'D') type = *portfwd_strptr++;*host ? dupstr(host) : NULLKEEP. */ epfrec->status = KEEP; free_portfwd(pfrec); } else { pfrec->status = CREATE; }for (i = 0; (epf = index234(ssh->portfwds, i)) != NULL; i++) if (epf->status == DESTROY) { char *message; message = dupprintf("%s port forwarding from %s%s%d", epf->type == 'L' ? "local" : epf->type == 'R' ? "remote" : "dynamic", epf->saddr ? epf->saddr : "", epf->saddr ? ":" : "", epf->sport); if (epf->type != 'D') { char *msg2 = dupprintf("%s to %s:%d", message, epf->daddr, epf->dport); sfree(message); message = msg2; } logeventf(ssh, "Cancelling %s", message); sfree(message); if (epf->remote) { struct ssh_rportfwd *rpf = epf->remote; struct Packet *pktout; /* * Cancel the port forwarding at the server * end. */ if (ssh->version == 1) { /* * We cannot cancel listening ports on the * server side in SSH1! There's no message * to support it. Instead, we simply remove * the rportfwd record from the local end * so that any connections the server tries * to make on it are rejected. */ } else { pktout = ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST); ssh2_pkt_addstring(pktout, "cancel-tcpip-forward"); ssh2_pkt_addbool(pktout, 0);/* _don't_ want reply */ if (epf->saddr) { ssh2_pkt_addstring(pktout, epf->saddr); } else if (ssh->cfg.rport_acceptall) { ssh2_pkt_addstring(pktout, "0.0.0.0"); } else { ssh2_pkt_addstring(pktout, "127.0.0.1"); } ssh2_pkt_adduint32(pktout, epf->sport); ssh2_pkt_send(ssh, pktout); } del234(ssh->rportfwds, rpf); free_rportfwd(rpf); } else if (epf->local) { pfd_terminate(epf->local); } delpos234(ssh->portfwds, i); free_portfwd(epf); i--; /* so we don't skip one in the list */ } /* * And finally, set up any new port forwardings (status==CREATE). */ for (i = 0; (epf = index234(ssh->portfwds, i)) != NULL; i++) if (epf->status == CREATE) { char *sportdesc, *dportdesc; sportdesc = dupprintf("%s%s%d", epf->saddr ? epf->saddr : "", epf->saddr ? ":" : "", epf->sport); if (epf->type == 'D') { dportdesc = NULL; } else { dportdesc = dupprintf("%s:%d", epf->daddr, epf->dport); } if (epf->type == 'L') { const char *err = pfd_addforward(epf->daddr, epf->dport, epf->saddr, epf->sport, ssh, &ssh->cfg, &epf->local, epf->addressfamily); logeventf(ssh, "Local %sport %s forwarding to %s%s%s", epf->addressfamily == ADDRTYPE_IPV4 ? "IPv4 " : epf ? err : ""); } else if (epf->type == 'D') { const char *err = pfd_addforward(NULL, -1, epf->saddr, epf->sport, ssh, &ssh->cfg, &epf->local, epf->addressfamily); logeventf(ssh, "Local %sport %s SOCKS dynamic forwarding%s%s", epf->addressfamily == ADDRTYPE_IPV4 ? "IPv4 " : epf->addressfamily == ADDRTYPE_IPV6 ? "IPv6 " : "", sportdesc, err ? " failed: " : "", err ? err : ""ncpy(pf->dhost, epf->daddr, lenof(pf->dhost)-1); pf->dhost[lenof(pf->dhost)-1] = '\0'; pf->dport = epf->dport; pf->sport = epf->epf->daddr, epf->dport); sfree(pf); } else { logeventf(ssh, "Requesting remote port %s" " forward to %s", sportdesc, dportdescepf->remote = pf; pf->pfrec = epfepf->sport, PKT_STR, epf->daddr, PKT_INT, epf-> sfree(dportdesc); 1B1var, *varend, *val; s->num_env = 0; while (*e) { var = e; while (*e && *e != '\t') e++; varend = e; if (*e == '\t') e++; Revision-number: 5050 Prop-content-length: 260 Content-length: 260 K 8 svn:date V 27 2004-12-30T17:53:26.575662Z K 7 svn:log V 159 Reinstate the textual service name in port forwarding Event Log messages where specified. (I had removed this in the previous revision through forgetfulness.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 20caf651439e787f73e1e44792671a46 Text-delta-base-sha1: 443ddf61ef23ee1706a2bda2d0be649b949a1a81 Text-content-length: 1139 Text-content-md5: 3f006b7eb54a8f79c5120641a2e69802 Text-content-sha1: 30d31a69ae0c5b9abc0a484d7830b92a569f8f5e Content-length: 1139 SVNB+%uBchar *sserv, *dserv, \ sfree((pf)->sserv), sfree((pf)->dserv;I$ Y9_972tout; pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduinserv = sserv ? dupstr(sports) : NULL; pfrec->sport = sport; pfrec->daddr = *host ? dupstr(host) : NULL; pfrec->dserv = dserv ? dupstr(dportss%s%d%s", epf->saddr ? epf->saddr : "", epf->saddr ? ":" : "", epf->sserv ? epf->sserv : "", epf->sserv ? "(" : "", epf->sport, epf->sserv ? ")" : ""s%s%d%s", epf->daddr, epf->dserv ? epf->dserv : "", epf->dserv ? "(" : "", epf->dport, epf->dserv ? ")" : ""BYBocated pty (ospeed %dbps, ispeed %dbps)", ssh->ospeed, ssh->ispeed); } } else { ssh->editing = ssh->echoing = 1; } /* * Send environment variables. * * Simplest thing here is to send all the requests at once, and * then wait for a whole bunch of successes or failures. */ if (ssh->mainchan && *ssh->cfg.environmt) { char *e = ssh->cfg.environmt; char * Revision-number: 5051 Prop-content-length: 557 Content-length: 557 K 7 svn:log V 456 Allow reconfiguration of compression and cipher settings in mid-session in SSH2: this forces an immediate rekey to activate the new settings. I'm not sure exactly what this will be useful for (except possibly it might make comparative performance testing easier?), but it has wonderful James Bond value for being able to switch to a more secure cipher before doing anything sensitive :-) If, that is, you weren't using the most secure one to begin with... K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-31T10:51:14.586701Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7cab7789a2234d1484e90a20c5eb3edd Text-delta-base-sha1: 6ffe9058eb1934da26484e2c38a2443a0517ae4b Text-content-length: 328 Text-content-md5: 34a5cbddea2650c544bc3f531c9f577b Text-content-sha1: c46c4c81c847d0515da1996a22bcc3f438657da8 Content-length: 328 SVNk#{4{v-b/?}n && protcfginfo == 1} if (!midsession || protcfginfo != 1) { s = ctrl_getset(b, "Connection/SSH", "protocol", "Protocol options"); } if (!midsession) { s = ctrl_getset(b, "Connection/SSH", "protocol", "Protocol options"); } if (!midsession || protcfginfo != 1) { Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3f006b7eb54a8f79c5120641a2e69802 Text-delta-base-sha1: 30d31a69ae0c5b9abc0a484d7830b92a569f8f5e Text-content-length: 1987 Text-content-md5: f4114aac3d2e67a19f462fbc72e810e5 Text-content-sha1: c735b4378caa0560a44c3419d1d6ca3fbcd57531 Content-length: 1987 SVNM+M* char *deferred_rekey_reason; /* points to STATIC string; don't free */R&Nbk$332\0Ly/f|M^LOSE, PKT_INT, c->remoteid, PKT_END); } else { struct Packet *pkgot_session_id, activated_authconngot_session_id = s->activated_authconn = FALSE /* * Set up preferred compression. */ if (ssh->cfg.compression) s->preferred_comp = &ssh_zlib; else s->preferred_comp = &ssh_comp_none!s->got_session_id) {!s->got_session_id) { memcpy(ssh->v2_session_id, s->exchange_hash, sizeof(s->exchange_hash)); s->got_session_id = TRUE; }Loop straight back round if we have a * deferred rekey reason. */ if (ssh->deferred_rekey_reason) { logevent(ssh->deferred_rekey_reason); pktin = NULL; ssh->deferred_rekey_reason = NULL; goto begin_key_exchange; } /* * Otherwise, ss->activated_authconn) { crReturn(1); } s->activated_authconn = TRUEY"")!qKofdyfs, s->pktout); ssh->state = SSH_STATE_INTERMEDpty request:" " packet type %d", pktin->type)); crStopV; } c_write_str(ssh, "Server refused to allocate pty\r\n"); ssh->editing = ssh->echoing = 1; } else { logeventf(ssh, "All ssh->deferred_rekey_reason, rekey_mandatory = FALSEssh->cfg.compression != cfg->compression) { rekeying = "Initiating key re-exchange (compression setting changed)"; rekey_mandatory = TRUE; } if (ssh->cfg.ssh2_des_cbc != cfg->ssh2_des_cbc || memcmp(ssh->cfg.ssh_cipherlist, cfg->ssh_cipherlist, sizeof(ssh->cfg.ssh_cipherlist))) { rekeying = "Initiating key re-exchange (cipher settings changed)"; rekey_mandatory = TRUE; } ssh->cfg = *cfg; /* STRUCTURE COPY */ if (rekeying) { if (!ssh->kex_in_progress) { do_ssh2_transport(ssh, rekeying, -1, NULL); } else if (rekey_mandatory) { ssh->deferred_rekey_reason = rekeying; } } Revision-number: 5052 Prop-content-length: 269 Content-length: 269 K 8 svn:date V 27 2004-12-31T11:46:28.842314Z K 7 svn:log V 168 In r5043 Jacob removed the `Load' and `Delete' buttons in the saved- sessions panel in the reconfig box. I think, given that, the title of that box also wants work :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 34a5cbddea2650c544bc3f531c9f577b Text-delta-base-sha1: c46c4c81c847d0515da1996a22bcc3f438657da8 Text-content-length: 76 Text-content-md5: d618e6d5d017922d6d2a046961b7d0b8 Text-content-sha1: 600d620352df12c52c577056d85abeaf06b100a5 Content-length: 76 SVN? 20])midsession ? "Save the current session settings" : Revision-number: 5053 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2004-12-31T13:02:46.539849Z K 7 svn:log V 184 Rename some of the more stupidly named files in the Unix back end. Notably pterm.c, which was a sensible name right at the start but became a misnomer as soon as I created Unix PuTTY. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a93a7196bc8f489dc3ad44c1a4740507 Text-delta-base-sha1: b80d6cdc81881b6715c4ca7b188ca27e7d48832c Text-content-length: 282 Text-content-md5: ac907fdc48d34fbcbefdeb28bd6ed783 Text-content-sha1: 0bfb99d6e46865f811fa0d22136465edf4ea4806 Content-length: 282 SVN"2r 0)cagcXJgtkwin gtkdlg gtkcols gtkpanel uxcfguxpty uxsel BE_NONE uxstore + uxsignal CHARSET cmdline uxpterm version putty : [X] UXTERM uxmisc misc ldisc settings uxpty uxsel BE_ALL uxstore + uxuxpty uxsel BE_NOSSH + uxstore uxux Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: add Node-copyfrom-rev: 5051 Node-copyfrom-path: putty/unix/pterm.c Text-copy-source-md5: f625c5462d53f34360e9dc592fb9ece7 Text-copy-source-sha1: 01a0f97d3d24a37bee0a486d868f263a5d561873 Text-delta: true Text-delta-base-md5: f625c5462d53f34360e9dc592fb9ece7 Text-delta-base-sha1: 01a0f97d3d24a37bee0a486d868f263a5d561873 Text-content-length: 165 Text-content-md5: 8113eb17c2b9b9a889b5cd853b79e6f2 Text-content-sha1: 90acae5250b00c13ea24f46ff2b6ab1fa8d4af6e Content-length: 165 SVN `/* * gtkwin.c: the main code that runs a PuTTY terminal emulator and * backend in a GTK windowake_mouse_ptr(inst, -2); /<! Node-path: putty/unix/uxpterm.c Node-kind: file Node-action: add Node-copyfrom-rev: 5051 Node-copyfrom-path: putty/unix/ptermm.c Text-copy-source-md5: 235d317cd68d726846eac3331036735e Text-copy-source-sha1: 97baff2be0ac9e81849d88070ce6264547894837 Node-path: putty/unix/uxpty.c Node-kind: file Node-action: add Node-copyfrom-rev: 5051 Node-copyfrom-path: putty/unix/pty.c Text-copy-source-md5: 8ba36ab2792d3cd7558ebb5816e0b279 Text-copy-source-sha1: 1a1b07fa1d28c983066aa2ff17c4a73b0d477bf4 Node-path: putty/unix/uxsignal.c Node-kind: file Node-action: add Node-copyfrom-rev: 5051 Node-copyfrom-path: putty/unix/signal.c Text-copy-source-md5: ebc71db8f171255bb28054658f1ae698 Text-copy-source-sha1: ecb5521eab10e49ee18cfd36e14a6aac3540b9e6 Text-delta: true Text-delta-base-md5: ebc71db8f171255bb28054658f1ae698 Text-delta-base-sha1: ecb5521eab10e49ee18cfd36e14a6aac3540b9e6 Text-content-length: 382 Text-content-md5: 34058d4a3a63c3ae5b6dd3768fc6392e Text-content-sha1: a88f93c40d2e723972ea256488b5131bc66b440b Content-length: 382 SVN31 gVgt?non-portable, as it varies in meaning * between platforms and depending on feature macros, and has * stupid semantics at least some of the time. * * This function provides the same interface as the libc function, * but provides consistent semantics. It assumes POSIX semantics * for sigaction() (so you might need to do some more work if you * port to Node-path: putty/unix/ptermm.c Node-action: delete Node-path: putty/unix/pterm.c Node-action: delete Node-path: putty/unix/pty.c Node-action: delete Node-path: putty/unix/signal.c Node-action: delete Revision-number: 5054 Prop-content-length: 213 Content-length: 213 K 7 svn:log V 112 A couple of people have pointed out that the local variable `reading' in this file is not reliably initialised. K 10 svn:author V 5 simon K 8 svn:date V 27 2004-12-31T19:06:20.490250Z PROPS-END Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 280750819e54becb42049dea8383087b Text-delta-base-sha1: dec12cc340197de494ba65176c9f515d37494102 Text-content-length: 45 Text-content-md5: acda038d1364d72ff741e2dfc368ccca Text-content-sha1: dd63af961fb9241a0991c0ce47a54027bfb88e89 Content-length: 45 SVNi 9 27 = FALSE rea Revision-number: 5055 Prop-content-length: 283 Content-length: 283 K 7 svn:log V 182 "Nirwana Nirwana" points out that mget, mput and ls are not the only PSFTP commands that can make good use of wildcards! Now implemented wildcard support in rmdir, rm, mv and chmod. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-01T12:34:32.091723Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ddbea9faca507ca1bd7273a4292cd3eb Text-delta-base-sha1: 3efa870010277dab642527ed912cdd6d9e8d4c4e Text-content-length: 6159 Text-content-md5: 9d3e2340a293835eae2dd731fc5a862c Text-content-sha1: 54705874c4f8a91941f1a49e99d1f1efe6e63a13 Content-length: 6159 SVNK7C=ATGuC@^ 2X|ZZrb}_ 2{Zr gG 2iTuLa:Ya:t2VVqa:{2ag 2*bDV-hBa9ib(!swcm->prefix[0] || swcm->prefix[strlen(swcm->prefix)-1]=='/' ? "" : "/") * General function to match a potential wildcard in a filename * argument and iterate over every matching file. Used in several * PSFTP commands (rmdir, rm, chmod, mv). */ int wildcard_iterate(char *filename, int (*func)(void *, char *), void *ctx) { char *unwcfname, *newname, *cname; int is_wc, ret; unwcfname = snewn(strlen(filename)+1, char); is_wc = !wc_unescape(unwcfname, filename); if (is_wc) { SftpWildcardMatcher *swcm = sftp_begin_wildcard_matching(filename); int matched = FALSE; sfree(unwcfname); if (!swcm) return 0; ret = 1; while ( (newname = sftp_wildcard_get_filename(swcm)) != NULL ) { cname = canonify(newname); if (!cname) { printf("%s: %s\n", newname, fxp_error()); ret = 0; } matched = TRUE; ret &= func(ctx, cname); sfree(cname); } if (!matched) { /* Politely warn the user that nothing matched. */ printf("%s: nothing matched\n", filename); } sftp_finish_wildcard_matching(swcm); } else { cname = canonify(unwcfname); if (!cname) { printf("%s: %s\n", filename, fxp_error()); ret = 0; } ret = func(ctx, cname); sfree(cname); sfree(unwcfname); } return ret; } /* * Handy helper function. */ int is_wildcard(char *name) { char *unwcfname = snewn(strlen(name)+1, char); int is_wc = !wc_unescape(unwcfname, name); sfree(unwcfname); return is_wc; } /* int i, ret { printf("mkdir: expects a directory\n"); return 0; } ret = 1; for (i = 1; i < cmd->nwords; i++) { dir = canonify(cmd->words[i]); if (!dir) { printf("%s: %s\n", dir, fxp_error()); return 0; } sftp_register(req = fxp_mkdir_send(dirmkdir_recv(pktin, rreq); if (!result) { printf("mkdir %s: %s\n", dir, fxp_error()); sfree(dir); ret = 0; } sfree(dir); } return ret; } static int sftp_action_rmdir(void *vctx, char *dir) {return 0; } return 1; } int sftp_cmd_rmdir(struct sftp_command *cmd) { int i, ret { printf("rmdir: expects a directory\n"); return 0; } ret = 1; for (i = 1; i < cmd->nwords; i++) ret &= wildcard_iterate(cmd->words[i], sftp_action_rmdir, NULL); return ret; } static int sftp_action_rm(void *vctx, char *fname) {return 1; } int sftp_cmd_rm(struct sftp_command *cmd) { int i, ret { printf("rm: expects a filename\n"); return 0; } ret = 1; for (i = 1; i < cmd->nwords; i++) ret &= wildcard_iterate(cmd->words[i], sftp_action_rm, NULL); return ret; } static int check_is_dir(char *dstfname) {attrs attrs; int result; sftp_register(req = fxp_stat_send(dstfnamestat_recv(pktin, rreq, &attrs); if (result && (attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS) && (attrs.permissions & 0040000)) return TRUE; else return FALSE; } struct sftp_context_mv { char *dstfname; int dest_is_dir; }; static int sftp_action_mv(void *vctx, char *srcfname) { struct sftp_context_mv *ctx = (struct sftp_context_mv *)vctx; struct sftp_packet *pktin; struct sftp_request *req, *rreq; const char *error; char *finalfname, *newcanon = NULL; int ret, result; if (ctx->dest_is_dir) { char *p; char *newname; p = srcfname + strlen(srcfname); while (p > srcfname && p[-1] != '/') p--; newname = dupcat(ctx->dstfname, "/", p, NULL); newcanon = canonify(newname); if (!newcanon) { printf("%s: %s\n", newname, fxp_error()); sfree(newname); return 0; } sfree(newname); finalfname = newcanon; } else { finalfname = ctx->dstfname; } sftp_register(req = fxp_rename_send(srcfname, finalfnamerename_recv(pktin, rreq); error = result ? NULL : fxp_error(); if (error) { printf("mv %s %s: %s\n", srcfname, finalfname, error); ret = 0; } else { printf("%s -> %s\n", srcfname, finalfname); ret = 1; } sfree(newcanon); return ret; } int sftp_cmd_mv(struct sftp_command *cmd) { struct sftp_context_mv actx, *ctx = &actx; int i, ret3) { printf("mv: expects two filenames\n"); return 0; } ctx->dstfname = canonify(cmd->words[cmd->nwords-1]); if (!ctx->dstfname) { printf("%s: %s\n", ctx->dstfname, fxp_error()); return 0; } /* * If there's more than one source argument, or one source * argument which is a wildcard, we _require_ that the * destination is a directory. */ ctx->dest_is_dir = check_is_dir(ctx->dstfname); if ((cmd->nwords > 3 || is_wildcard(cmd->words[1])) && !ctx->dest_is_dir) { printf("mv: multiple or wildcard arguments require the destination" " to be a directory\n"); return 0; } /* * Now iterate over the source arguments. */ ret = 1; for (i = 1; i < cmd->nwords-1; i++) ret &= wildcard_iterate(cmd->words[i], sftp_action_mv, ctx); return ret; } struct sftp_context_chmod { unsigned attrs_clr, attrs_xor; }; static int sftp_action_chmod(void *vctx, char *fname) { struct fxp_attrs attrs unsigned oldperms, newperms; struct sftp_context_chmod *ctx = (struct sftp_context_chmod *)vctx; sftp_register(req = fxp_stat_send(fnamectx->attrs_clr; attrs.permissions ^= ctx->attrs_xor; newperms = attrs.permissions & 07777; if (oldperms == newperms) return 1; /* no need to do anything! */return 1; } int sftp_cmd_chmod(struct sftp_command *cmd) { char *mode; int i, ret; struct sftp_context_chmod actx, *ctx = &actxctx->attrs_clr = ctx->ctx->attrs_clr = 07777; sscanf(mode, "%o", &ctx->attrs_xor); ctx->attrs_xor &= ctx->ctx->attrs_clr |= perms; ctx->attrs_xor |= perms; break; case '-': ctx->attrs_clr |= perms; ctx->attrs_xor &= ~perms; break; case '=': ctx->attrs_clr |= subset; ctx->ret = 1; for (i = 2; i < cmd->nwords; i++) ret &= wildcard_iterate(cmd->words[i], sftp_action_chmod, ctx); return ret Revision-number: 5056 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 71 There's always one: fix small memory leak introduced in last revision. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-01T13:01:13.050311Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d3e2340a293835eae2dd731fc5a862c Text-delta-base-sha1: 54705874c4f8a91941f1a49e99d1f1efe6e63a13 Text-content-length: 73 Text-content-md5: 48ef7ff99be3bed20660b9fb58e5022c Text-content-sha1: e77fc8d4ced1118db89a62756b99cae32ed16df3 Content-length: 73 SVN7h(/J+Gpsfree(ctx->dstfnamesfree(ctx->dstfname); Revision-number: 5057 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2005-01-01T14:06:12.114154Z K 7 svn:log V 103 Remove rogue sfree()s inside new wildcard action functions -- were causing segfaults in failure cases. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48ef7ff99be3bed20660b9fb58e5022c Text-delta-base-sha1: e77fc8d4ced1118db89a62756b99cae32ed16df3 Text-content-length: 37 Text-content-md5: e83bb76c2bb4184a4a9faa9a58bfc7a1 Text-content-sha1: 28af5fc7382ce0835ed568906c3cd5f0364130fd Content-length: 37 SVNh;.*=LvQ Revision-number: 5058 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2005-01-01T16:16:13.713771Z K 7 svn:log V 67 Document recent changes to PSFTP (and other documentation tweaks). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f17ed451d5308698b391fc8f2afc2e12 Text-delta-base-sha1: 94566b944c580d26c73fe9f1a03738780e9ce7c2 Text-content-length: 1416 Text-content-md5: de9339499dced74ef6fbb7006e05fef4 Text-content-sha1: dbfacc88684cc84b36e8098194fbe332ea0cbefe Content-length: 1416 SVNRO==7Y<7|Oh`PF!q2Land directories on the server. You do this using the \c{chmod} command, which works very You can specify multiple files or wildcards. For example: \c chmod go-rwx,u+w privatefile \c chmod a+r public* \c chmod 640 groupfile1 groupfile2 to all files and directories starting with \q{public} or filenames: \c del oldfile.dat \c del file1.txt file2.txt \c del *.o Files will be deleted without further prompting, even if multiple files are specified. \c{del} will only delete files. You cannot use it to delete directories; use \c{rmdir} for that.You can specify multiple directories to create at once: \c mkdir dir1 dir2 dir3 or names: \c rmdir oldstuff \c rmdir *.old ancient Directories will be deleted without further prompting, even if multiple directories are specified.mv} The \c{mv} command: move and rename remote files To rename a single file on the server, type \c{mv}, then the current file name, and then the new file name: \c mv oldfile newname You can also move the file into a different directory and change the name: \c mv oldfile dir/newname To move one or more files into an existing subdirectory, specify the files (using wildcards if desired), and then the destination directory: \c mv file dir \c mv file1 dir1/file2 dir2 \c mv *.c *.h .. The \c{rename} and \c{ren} commands work exactly the same way as \c{mv Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e83bb76c2bb4184a4a9faa9a58bfc7a1 Text-delta-base-sha1: 28af5fc7382ce0835ed568906c3cd5f0364130fd Text-content-length: 1396 Text-content-md5: f6af229c70767ff4f6a5a7cb0bc0f781 Text-content-sha1: 25f36c23bd75b4225f7fa171a280a63b5228aaa9 Content-length: 1396 SVN;E[ r+s pS0a~HZ;d%=1R(,n [ ... ]\n" " Change the file permissions on one or more remote files or\n" " directories.\n" " can be any octal Unix permission specifier.\n" " Alternatively, can include the following modifiersfiles on the remote server", " [ ... ]\n" " Delete a file or files from the serverremote filesdirectories on the remote server", " [ ... ]\n" " Creates directories with the given namesfile(s) on the remote server", " [ ... ] \n" " Moves or renames (s) on the server to ,\n" " also on the server.\n" " If specifies an existing directory, then \n" " may be a wildcard, and multiple s may be given; all\n" " source files are moved into .\n" " Otherwise, must specify a single file, which is moved\n" " or renamed so that it is accessible under the name [ ... ] " Wildcards may be used to specify multiple directories Revision-number: 5059 Prop-content-length: 222 Content-length: 222 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-01T16:35:57.549863Z K 7 svn:log V 121 Now that rm, mkdir, and rmdir can operate on lots of files, make them more chatty like the other multiple-file commands. PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f6af229c70767ff4f6a5a7cb0bc0f781 Text-delta-base-sha1: 25f36c23bd75b4225f7fa171a280a63b5228aaa9 Text-content-length: 140 Text-content-md5: 85be7e393cfa883ad8f08adefabb1316 Text-content-sha1: 3197a9d9dd9126a89346eb8feeaa955fcf7c888c Content-length: 140 SVNE5dq/q)= else printf("mkdir %s: OK\n", dir);printf("rmdir %s: OK\n", dir);printf("rm %s: OK\n", fname); Revision-number: 5060 Prop-content-length: 145 Content-length: 145 K 7 svn:log V 45 Localise "not connected to a host" messages. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-01T16:43:19.799206Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85be7e393cfa883ad8f08adefabb1316 Text-delta-base-sha1: 3197a9d9dd9126a89346eb8feeaa955fcf7c888c Text-content-length: 392 Text-content-md5: 0dd8a76f71ae0ed7fba8881646c46a60 Text-content-sha1: 50cedd5a1990a5dbe831a3496ca8c6a4e1aefa01 Content-length: 392 SVN5qfg2! :6216$Li*X*hkaWyePstatic void not_connected(void) { printf("psftp: not connected to a host; use \"open host.name\"\n"not_connected(); return 0; }not_connected(not_connected(not_connected(not_connected(not_connected(not_connected(not_connected(not_connected(not_connected(not_connected( Revision-number: 5061 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 17 It's a new year! K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-02T09:19:14.495962Z PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c2ce7ecbe4d35c1f87ea4f1d7ab7958 Text-delta-base-sha1: 0c06eb0b74dcd281c91e67183697cf33b7d4fcba Text-content-length: 44 Text-content-md5: c144dfa0c72df54dfb8b10c03fff7d2a Text-content-sha1: 6a48cd2eb63e3cd72a75b37c61a99b40a8d511d8 Content-length: 44 SVNccGPuTTY is copyright 1997-2005 Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 80ff0598e4a0e29a2a0c174e2dddfce4 Text-delta-base-sha1: 85781bd35948bfc44aec4cddabb20c4fe36db09a Text-content-length: 22 Text-content-md5: d5c63223a5a11ce7fb114034ce3d30cf Text-content-sha1: b9bf4203898429e8f55f5fc71ec19dd50260a3d6 Content-length: 22 SVN\\ LM5 Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a1ae553873577a22a2a37c85468a6907 Text-delta-base-sha1: d6b1e3f32038ecc71099179c39dc4b22b7937bfd Text-content-length: 20 Text-content-md5: ade0a4d0b6aa9c9cedb9fbeb510492dd Text-content-sha1: 0921b6f2cb92589d259033364909360ddb32a125 Content-length: 20 SVN))aGb5 Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 40b466cd5991d944af152319d8824d1c Text-delta-base-sha1: 10d1ed5f3b110795927ad6b8c9d0028d53bd090a Text-content-length: 33 Text-content-md5: 1e1471ea326aec3cd8596a28eda52852 Text-content-sha1: 9dd2f859fe176e9d4aeec14b95ef319b8207752d Content-length: 33 SVNm c7/* $Id5 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8cbf3a3e42e482386479fa61a557f3a6 Text-delta-base-sha1: c91884c1b8cb9d2dbac52e891405d699f05957f0 Text-content-length: 34 Text-content-md5: 5c15a4c4b5a3b62d0749b7a418d2a258 Text-content-sha1: f39daa629d8c690fa1d641d78fa66897f6f88120 Content-length: 34 SVNooU"Vvy55 Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 29f622ff0beaf3759db2f114755c94c5 Text-delta-base-sha1: fbb9e1f963d43ba8241802db493451e2a7a57690 Text-content-length: 29 Text-content-md5: d570f70543a1f6d326ef419144bf7e2f Text-content-sha1: c26f9a0bbc6703db2dfd97d5fa3f2d929ec7a84b Content-length: 29 SVNllLM55 Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e441f0eccd8973450f5a4c338f5b23c Text-delta-base-sha1: 5a861124f14f23ea1a025f703b5799783a34227d Text-content-length: 29 Text-content-md5: d67c5f8132c34680a60f1504d506cfe5 Text-content-sha1: f65f60395b42afa907bcb57dba0bcfa4b2edc485 Content-length: 29 SVN 2L3 55 Node-path: putty/windows/win_res.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eb4d38ae17bab99c5434470b4dd2a28a Text-delta-base-sha1: d8cdad08ac3b607606927905b40a86b87f501ef3 Text-content-length: 29 Text-content-md5: 73ad4eeec97af3d7601e96da8b303eb7 Text-content-sha1: ecf580c1845de6f25cbd6b9a73146b5573cc08f7 Content-length: 29 SVNmm C P55 Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: faa531a111787335f20429ea0d5b4771 Text-delta-base-sha1: 14f63376936327e39580f50bd04f08b48559b8bd Text-content-length: 22 Text-content-md5: 4c8682f64651a9ebc9cdfe32a6eaca9f Text-content-sha1: 7e880662c078ac9bbc56c2f86304acb5e9716afb Content-length: 22 SVN__ OP5 Revision-number: 5062 Prop-content-length: 116 Content-length: 116 K 7 svn:log V 16 colon in kex UI K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-02T13:17:22.364989Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d618e6d5d017922d6d2a046961b7d0b8 Text-delta-base-sha1: 600d620352df12c52c577056d85abeaf06b100a5 Text-content-length: 26 Text-content-md5: 08c98aae7b3a6a661fdb463fa77f81f6 Text-content-sha1: e59d9bd1b4eede1df35d81fcf1996c966d0601c1 Content-length: 26 SVN?@ (: Revision-number: 5063 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 56 If we're going to use select(), we need . K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-04T14:37:32.641993Z PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d8511ec879fcb91ee526350d603cd23 Text-delta-base-sha1: f887591bb237d3a8a79ba1710545dc1ca6e329f5 Text-content-length: 44 Text-content-md5: 45ccd4e90d10d30e520762addfdc8661 Text-content-sha1: 5334e0733db5358ab0aca42d2c54f12723775c30 Content-length: 44 SVNH` /#include ai to NULL in sk_nonamelookup. Was causing segfaults in IPv6-enabled Unix PuTTY connecting through a proxy when letting the proxy do the DNS. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-04T17:39:35.987785Z PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4afa4dff8c2cc369c39c8edbe408b160 Text-delta-base-sha1: 1a84f92e3a0188fb6dd073b77301178e172476dc Text-content-length: 66 Text-content-md5: 09f67ce6183f4142d9aef61984b180a8 Text-content-sha1: db2116c8d1f2819f4ccd5924422bb5749da5e5ce Content-length: 66 SVNG *KRJ#ifndef NO_IPV6 ret->ai = NULL; #endif Revision-number: 5065 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:01.627225Z PROPS-END Revision-number: 5066 Prop-content-length: 157 Content-length: 157 K 7 svn:log V 57 Apparently VanDyke's Windows server uses these messages. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-05T23:54:59.014695Z PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d23f1f2cf24a7e8fd64fa45a40c04863 Text-delta-base-sha1: 6229011bf7f5484d80ad114543cd5a9be6cb2c74 Text-content-length: 106 Text-content-md5: 28e8a1bd3365037717a410b410fe516e Text-content-sha1: 0eed24debc8a2fd2eda1d7914ebac4eb0d9eb60c Content-length: 106 SVNV/YVY

    According to a message on IETF secsh, VanDyke's Windows server uses these messages. Revision-number: 5067 Prop-content-length: 195 Content-length: 195 K 8 svn:date V 27 2005-01-06T12:37:33.980330Z K 7 svn:log V 95 Try to make it clearer that "-be" and "-bc" must be specified in _addition_ to "-b batchfile". K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: de9339499dced74ef6fbb7006e05fef4 Text-delta-base-sha1: dbfacc88684cc84b36e8098194fbe332ea0cbefe Text-content-length: 343 Text-content-md5: f2ef3d3ca7f4c3d4e9170e90c5626301 Text-content-sha1: 8701d41a418715fbc9ab528a971bb80131af0849 Content-length: 343 SVNOD*u>xT;L&Iadd specified with \c{-b}. With the \c{-bc} option, PSFTP will display prompts and commands just as if the commands had been typed at the keyboard. So instead of seeing this: \c C:\>psftp fred@hostname -b batchfileC:\>psftp fred@hostname -bc -b batchfileadditional option causes PSFTP to continue Revision-number: 5068 Prop-content-length: 368 Content-length: 368 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-06T13:23:47.561800Z K 7 svn:log V 267 `kbdint-failure': we now offer keyboard-interactive auth to the user for as long as the server offers it, rather than only once, unless the server responds to our initial USERAUTH_REQUEST("keyboard-interactive") with FAILURE, in which case we give up on it entirely. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f4114aac3d2e67a19f462fbc72e810e5 Text-delta-base-sha1: c735b4378caa0560a44c3419d1d6ca3fbcd57531 Text-content-length: 342 Text-content-md5: 04ce1d802b0ac7159b26e30955b9346b Text-content-sha1: 3617c43197da60200a5d8a42ad3ed2b5831987f2 Content-length: 342 SVN-wo}JgY~}$I|; int kbd_inter_running, kbd_inter_refusedkbd_inter_running = FALSE; s->kbd_inter_refusedkbd_inter_refused) { s->method = AUTH_KEYBOARD_INTERACTIVE; s->type = AUTH_TYPE_KEYBOARD_INTERACTIVs->kbd_inter_refused = TRUE; /* don't try it again */"%"ssh Node-path: putty-wishlist/data/kbdint-failure Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1073 Text-content-md5: 3d803ad7fedcb9aed16d45bfe9ec813f Text-content-sha1: cef2a3a8e694670880e382d634c8a24272f2f2c6 Content-length: 1083 PROPS-END SVN###Summary: Keyboard-interactive authentication only permits one try Class: bug Difficulty: fun Priority: high Present-in: 0.56 Fixed-in: 2005-01-07 Content-type: text/x-html-body

    It's been observed that SSH-2 "keyboard-interactive" authentication in PuTTY only permits one attempt at authentication before falling back to other forms of authentication, such as password-based. If no other methods are supported by the server, PuTTY will bomb out with the message "No supported authentication methods left to try!".

    This has been exacerbated recently as several distributions are configuring OpenSSH to use k-i for even basic password authentication these days, and not enabling PasswordAuthentication at all by default.

    As of 2005-01-07, PuTTY will continue to attempt keyboard-interactive authentication as long as the server continues to offer it, in preference to password authentication, unless the server refuses it outright. (If this is a problem for you, you can disable attempts to use keyboard-interactive entirely on the "Auth" panel.) Revision-number: 5069 Prop-content-length: 197 Content-length: 197 K 8 svn:date V 27 2005-01-06T15:47:12.757379Z K 7 svn:log V 97 I can't believe that after all this time we still had a rogue set of `' quotes! Changed to \q{}. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ac5afbae3f485274bb9057876d16768 Text-delta-base-sha1: 2f4a44c35fd4c6588f875fde47f95cc8ef135186 Text-content-length: 45 Text-content-md5: f854845a9587ae58c83164574bcd198e Text-content-sha1: de3da1978ea485a35aaaa3b60c422126728b630c Content-length: 45 SVN :6K\q{PuTTYPuTTYPuTTY} Revision-number: 5070 Prop-content-length: 223 Content-length: 223 K 7 svn:log V 122 Add an explicit message about lack of support for PASSWD_CHANGEREQ in a half-hearted attempt to flush out any uses of it. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-06T17:05:54.117340Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04ce1d802b0ac7159b26e30955b9346b Text-delta-base-sha1: 3617c43197da60200a5d8a42ad3ed2b5831987f2 Text-content-length: 391 Text-content-md5: 988cd09655b9145b1bb31e7792e10442 Text-content-sha1: 85a53ae16771ba5d0797e5fcc65011c8f8186594 Content-length: 391 SVNX:== SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ) { /* FIXME: perhaps we should support this? */ bombout(("PASSWD_CHANGEREQ not yet supported")); crStopV%W22%kt_addbyte(s->pktout, 129); /* TTY_OP_OSPEED */ ssh2_pkt_adduint32(s->pktout, ssh->ospeed); ssh2_pkt_addstring_data(s->pktout, "\0", 1); /* TTY_OP_END */ ssh2_pkt_send( Revision-number: 5071 Prop-content-length: 347 Content-length: 347 K 8 svn:date V 27 2005-01-07T09:24:24.545716Z K 7 svn:log V 246 Use sk_set_frozen() to ensure that no data will be accepted from an SSH connection when we're in the middle of asking the user a dialog-box-type question. Fixes `unix-kex-packet', which has just bitten me when connecting to one of the work Suns. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 988cd09655b9145b1bb31e7792e10442 Text-delta-base-sha1: 85a53ae16771ba5d0797e5fcc65011c8f8186594 Text-content-length: 1288 Text-content-md5: 8e76a7eda4db185e943c0f35bf8932ef Text-content-sha1: 8730ae1a77b6573f8761528cde5c4b91ad3d653c Content-length: 1288 SVN Z  { sk_set_frozen(ssh->s, 1); askalg(ssh->frontend, "cipher", cipher_string); sk_set_frozen(ssh->s, 0); }9!Xl=@9WydOW3H JRJ->remoteid) != -1) { if (ssh->version == 1) { send_packet(ssh, SSH1_MSG_CHANNEL_C { sk_set_frozen(ssh->s, 1); askalg(ssh->frontend, "key-exchange algorithm", ssh->kex->name); sk_set_frozen(ssh->s, 0); } { sk_set_frozen(ssh->s, 1); sk_set_frozen(ssh->s, 0); } { sk_set_frozen(ssh->s, 1); sk_set_frozen(ssh->s, 0); }sk_set_frozen(ssh->s, 1sk_set_frozen(ssh->s, 0W;ddW"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_addstring(s->pktout, ssh->cfg.termtype); ssh2_pkt_adduint32(s->pktout, ssh->term_width); ssh2_pkt_adduint32(s->pktout, ssh->term_height); ssh2_pkt_adduint32(s->pktout, 0); /* pixel width */ ssh2_pkt_adduint32(s->pktout, 0); /* pixel height */ ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addbyte(s->pktout, 128); /* TTY_OP_ISPEED */ ssh2_pkt_adduint32(s->pktout, ssh->ispeed); ssh2_p Node-path: putty-wishlist/data/unix-kex-packet Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8285b8bdd8108f177c75e28fdb84e0e8 Text-delta-base-sha1: 8386e6cdb94815a88fac73bf37fe1bf1c3b35d25 Text-content-length: 250 Text-content-md5: b558fd4f23022644f8de6151942febce Text-content-sha1: 58a2bc279975b4305e46c190334ea58ea9b48c70 Content-length: 250 SVN@'g@g

    SGT, 2005-01-07: Simplest answer, I think, is to use sk_set_frozen() to ensure that the SSH connection in question doesn't accept any more data while we're in the middle of asking the user about something. Revision-number: 5072 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2005-01-07T09:30:00.228357Z K 7 svn:log V 128 Ahem. Actually _marking_ this as fixed would be more helpful than just adding a comment at the bottom saying how I've fixed it. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/unix-kex-packet Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b558fd4f23022644f8de6151942febce Text-delta-base-sha1: 58a2bc279975b4305e46c190334ea58ea9b48c70 Text-content-length: 39 Text-content-md5: fa9fbe38a980173e4e67ab0e49e369ba Text-content-sha1: 77e01d463f3411ad64ad004e2c489305a914e629 Content-length: 39 SVN'<fBeFixed-in: 2005-01-08 Revision-number: 5073 Prop-content-length: 678 Content-length: 678 K 8 svn:date V 27 2005-01-07T14:22:17.227686Z K 7 svn:log V 577 Proxy command formatting now recognises `%proxyhost' and `%proxyport' in addition to the other things it interpolates. This is useful when using the Unix-only `Local' proxy type: it allows me to, for example, set up a proxy command such as ssh %proxyhost nc -q0 %host %port and then enter the name of the proxy machine in `Proxy hostname', which makes it marginally more convenient to quickly change to using a different proxy to get at the same target. I haven't documented this, because we currently don't document the Local proxy type at all. Possibly we should, though. K 10 svn:author V 5 simon PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f390b15b6f2e28566330a79fce21e4fa Text-delta-base-sha1: 1c26e4ab01ca3f9785c6e93fe985e9d0122bd235 Text-content-length: 561 Text-content-md5: 4ddacce15e91c254361bb6717cd414ee Text-content-sha1: 308c2570c8ad828639957b0bae30993946b59c83 Content-length: 561 SVN}F)PK@|d%proxyhost, %proxyport. Anything else we just send *if (strnicmp(cfg->proxy_telnet_command + eo, "proxyhost", 4) == 0) { int phlen = strlen(cfg->proxy_host); ENSURE(phlen); memcpy(ret+retlen, cfg->proxy_host, phlen); retlen += phlen; eo += 9roxyport", 4) == 0) { char pport[50]; int pplen; sprintf(pport, "%d", cfg->proxy_port); pplen = strlen(cfg->proxy_host); ENSURE(pplen); memcpy(ret+retlen, pport, pplen); retlen += pplen; eo += 9 Revision-number: 5074 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:02.479644Z PROPS-END Revision-number: 5075 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:02.489492Z PROPS-END Revision-number: 5076 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 44 Update faq-bce further for changes in 0.54. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-07T15:25:32.091484Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f854845a9587ae58c83164574bcd198e Text-delta-base-sha1: de3da1978ea485a35aaaa3b60c422126728b630c Text-content-length: 460 Text-content-md5: 5a25d77ea06d9d6b637de056c37c7e9f Text-content-sha1: 79d868267925bc0cbe860b2124fa286bfffe7e84 Content-length: 460 SVNz)Opktout, "pty-req Node-path: putty-wishlist/data/kbdint-failure Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3d803ad7fedcb9aed16d45bfe9ec813f Text-delta-base-sha1: cef2a3a8e694670880e382d634c8a24272f2f2c6 Text-content-length: 29 Text-content-md5: 5441ae1f00a642d036242bb71ffbf3ad Text-content-sha1: 82ab9ee547e7d467aca946a1a82630b4cd7add3c Content-length: 29 SVN##[6m88 Revision-number: 5079 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:02.881166Z PROPS-END Revision-number: 5080 Prop-content-length: 566 Content-length: 566 K 7 svn:log V 465 Jacob points out that changing TICKSPERSEC in unix.h changed the meaning of BellOverload{T,S} in Unix saved sessions. Add a Unix- specific backwards compatibility wart to settings.c to compensate. Of course when I do the serious config format revamp, I will ensure that no config item depends on internal #defines (these time intervals will be specified as a floating-point number of seconds) and this horror will be relegated to the old-config-compatibility code. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-08T13:08:32.781810Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 39b6e6be34bfbde328e8d326e6fccb48 Text-delta-base-sha1: ec06d7791d4850b96eef1a1e07f92eee69556f56 Text-content-length: 381 Text-content-md5: fc51e8a4c54b23b2f5a86573c36823dc Text-content-sha1: 450061ea8ccb333f6250a7c42886c26318d0fef0 Content-length: 381 SVNq9Zl+=t} #ifdef PUTTY_UNIX_H * 1000 #endif ); write_setting_i(sesskey, "BellOverloadS", cfg->bellovl_s #ifdef PUTTY_UNIX_H * 1000 #endif i); cfg->bellovl_t = i #ifdef PUTTY_UNIX_H / 1000 #endif ; gppi(sesskey, "BellOverloadS", 5*TICKSPERSEC, &i); cfg->bellovl_s = i #ifdef PUTTY_UNIX_H / 1000 #endif Revision-number: 5081 Prop-content-length: 423 Content-length: 423 K 7 svn:log V 322 Clear the kex-specific context in ssh->pkt_ctx for every new key exchange. Without doing this, after we have done one specific-group DH exchange (group1 or group14), ssh2_pkt_type _always_ translates 30 and 31 as KEXDH_INIT and KEXDH_REPLY, making a subsequent group-exchange kex look rather strange in an SSH packet log. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-08T13:28:41.496189Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9c3a061654aa260b795bdbedfb1d502c Text-delta-base-sha1: 7a13d49d0bb93b282c99a2f6c25b4525683a86b0 Text-content-length: 259 Text-content-md5: 60d89de482d5882795564c8e157ed7bf Text-content-sha1: e38265bad86f60c62475e83eafdc08cee5cb577a Content-length: 259 SVN 'BKEX_MASK 0x000FRWWRpen, we can close it then. */ if (((int)cssh->pkt_ctx &= ~SSH2_PKTCTX_KEX_MASK;V-WWVpkt_adduint32(s->pktout, ssh->mainchan->remoteid); /* recipient channel */ ssh2_pkt_ad Revision-number: 5082 Prop-content-length: 271 Content-length: 271 K 8 svn:date V 27 2005-01-08T14:02:06.298485Z K 7 svn:log V 170 Cleanups to sk_namelookup(). In particular, it now doesn't segfault if you explicitly specify IPv6 and then try to look up a hostname which doesn't have an IPv6 address. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 776c98212121b34d96f1234e46f64852 Text-delta-base-sha1: f25c7d73bcf1e33c777f1dfd572415ee34ea7860 Text-content-length: 606 Text-content-md5: a0bfb60752f082e269e3bade6f0faee9 Text-content-sha1: 9bf0181686e22549717f520d83045fd7cf293170 Content-length: 606 SVNx--# W.8}~8^d int ret_family; int errret_family = AF_UNSPEChints, struct addrinfo ** struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = ret->family; if ((err = fGetAddrInfo(host, NULL, &hints, &ret->ai)) == 0) ret_ (h = p_gethostbyname(host)) ) ret_family = AF_INET; else err = p_WSAGetLastError(); } if (ret_family == AF_UNSPEC) { ret->error = (err == WSAENETDOWN ? "Network is down" : err == WSAHOST_NOT_FOUND ? "Host does not exist" : err ret->family = ret_family Revision-number: 5083 Prop-content-length: 505 Content-length: 505 K 8 svn:date V 27 2005-01-08T14:45:26.133965Z K 7 svn:log V 404 For local and dynamic port forwardings (i.e. the ones which listen on a local port), the `Auto' protocol option on the Tunnels panel should always produce a port you can connect to in _either_ of IPv4 and v6, because the aim is for the user not to have to know or care which one they're using. This was not the case on Windows, and now is. Also, updated the docs to give more detail on issues like this. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc9b5d6f3fb70fbd5e1996e2dda4fbe6 Text-delta-base-sha1: 18b0462e9769a4fcbac6faf02f0feb7a39c3f0b4 Text-content-length: 602 Text-content-md5: 99420db60b7cb69eadd63566edbcc6ec Text-content-sha1: 1576a813a39d6d6ea5c3e69301a0a3f04eb846f1 Content-length: 602 SVN`Y 2C2d|Note that some operating systems may listen for incoming connections in IPv4 even if you specifically asked for IPv6, because their IPv4 and IPv6 protocol stacks are linked together. Apparently Linux does this, and Windows does not. So if you're running PuTTY on Windows and you tick \q{IPv6} for a local or dynamic port forwarding, it will \e{only} be usable by connecting to it using IPv6; whereas if you do the same on Linux, you can also use it with IPv4. However, ticking \q{Auto} should always give you a port which you can connect to using either protocol Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0bfb60752f082e269e3bade6f0faee9 Text-delta-base-sha1: 9bf0181686e22549717f520d83045fd7cf293170 Text-content-length: 1765 Text-content-md5: f828ba6dec38e2c9b84ac843b4ed05aa Text-content-sha1: e1880bbc4a4e9f0f3b277ebda5d2e103b7acbefa Content-length: 1765 SVN-5mjX'! sq(b=*qU@;P7D>6EI>@!N,+]P /* * We sometimes need pairs of Socket structures to be linked: * if we are listening on the same IPv6 and v4 port, for * example. So here we define `parent' and `child' pointers to * track this link. */ Actual_Socket parent, child; } ret->parent = ret->child = NULL ret->parent = ret->child = NULLorig_address_family DWORD err; char *errstr; Actual_Socket ret; int retcode; int on = 1; int address_familylocal_host_only; ret->pending_error = 0; ret->parent = ret->child = NULLorig_orig_address_family == ADDRTYPE_IPV6 ? AF_INET6 : #endif AF_UNSPEC); /* * Our default, if passed the `don't care' value * ADDRTYPE_UNSPEC, is to listen on IPv4. If IPv6 is supported, * we will also set up a second socket listening on IPv6, but * the v4 one is primary since that ought to work even on * non-v6-supporting systems. */ if (address_family == AF_UNSPEC) address_family = AF_INET;p_closesocket(sp_closesocket(s); ret->error = errstr; return (Socket) ret; } add234(sktree, ret); #ifndef NO_IPV6 /* * If we were given ADDRTYPE_UNSPEC, we must also create an * IPv6 listening socket and link it to this one. */ if (address_family == AF_INET && orig_address_family == ADDRTYPE_UNSPEC) { Actual_Socket other; other = (Actual_Socket) sk_newlistener(srcaddr, port, plug, local_host_only, ADDRTYPE_IPV6); if (other) { if (!other->error) { other->parent = ret; ret->child = other; } else { sfree(other); } } } #endifif (s->child) sk_tcp_close((Socket)s->child) Revision-number: 5084 Prop-content-length: 721 Content-length: 721 K 7 svn:log V 620 I've changed my mind about what the IP version selection options in the config should do when IPv6 is configured out. They shouldn't sit there looking silly with only `Auto' and `IPv4' settings: they should instead be completely absent. I had thought the former was acceptable since IPv4-only was a configuration that people should only be using if their compilers didn't support IPv6, but now it occurs to me that ports to fundamentally non-IPv6-supporting platforms are not implausible, and on such ports the presence of a vestigial config option under the _standard_ build conditions would be a low-quality solution. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-09T11:44:21.965957Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 08c98aae7b3a6a661fdb463fa77f81f6 Text-delta-base-sha1: e59d9bd1b4eede1df35d81fcf1996c966d0601c1 Text-content-length: 291 Text-content-md5: cab6a9568d743b688c4e87916885359d Text-content-sha1: f97804cdfbcc72046dbbc3ad08b5df2d9d9fdc36 Content-length: 291 SVN@d*k32IbyU6 F(#ifndef NO_IPV6 3, "IPv6", NO_SHORTCUT, I(ADDRTYPE_IPV6), NULL); #endif#ifndef NO_IPV6 pfd->addressfamily = ctrl_radiobuttons(s, NULL, NO_SHORTCUT, 3, "IPv6", NO_SHORTCUT, I(ADDRTYPE_IPV6), NULL); #endif Revision-number: 5085 Prop-content-length: 193 Content-length: 193 K 7 svn:log V 93 Having laboriously constructed a hints parameter for getaddrinfo, it would help to _use_ it! K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-09T11:58:36.874837Z PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 09f67ce6183f4142d9aef61984b180a8 Text-delta-base-sha1: db2116c8d1f2819f4ccd5924422bb5749da5e5ce Text-content-length: 30 Text-content-md5: cc02190d36d2561ffa4b5d75eb6702ab Text-content-sha1: cf6b046946e5367f02a58f08d071bf9533d92b5b Content-length: 30 SVNGI ' &hints Revision-number: 5086 Prop-content-length: 336 Content-length: 336 K 8 svn:date V 27 2005-01-09T14:27:48.572256Z K 7 svn:log V 236 New function ltime() returns a struct tm of the current local time. Fixes crashes when time() returns (time_t)-1 on Windows by using the Win32 GetLocalTime() function. (The Unix implementation still just uses time() and localtime().) K 10 svn:author V 4 owen PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ac907fdc48d34fbcbefdeb28bd6ed783 Text-delta-base-sha1: 0bfb99d6e46865f811fa0d22136465edf4ea4806 Text-content-length: 153 Text-content-md5: 1ca10be2a3f38f0c5af3e83e21b2802b Text-content-sha1: 7c06e07aa5e46e949db8bbf2c571915b20b1313e Content-length: 153 SVN2\qHR=&oC wintime UXMISC = MISC uxstore uxsel uxnet cmdline uxmisc uxproxy time wintime timeime tree234 uxgen + Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04611232cd5bbde7b23909c64fa18c18 Text-delta-base-sha1: 7012024c140ceb6a5461b98e53a2dc74a28681ff Text-content-length: 259 Text-content-md5: 87e35b9124249316fff7a2bf9f776f87 Text-content-sha1: b42e7e8088889f4dcb6f711b7d23343dc589240d Content-length: 259 SVNZ? h<h?struct tm tm; struct progress prog; prog.phase = -1; prog.current = -1; tm = ltime(); if (keytype == DSA) strftime(default_comment, 30, "dsa-key-%Y%m%d", &tm); else strftime(default_comment, 30, "rsa-key-%Y%m%d", & Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e33342b13c8c4fc0a36f905901c7da5e Text-delta-base-sha1: af4f6f4f81953d70de4a59eeaa302210b51cb2e5 Text-content-length: 36 Text-content-md5: 52d0cddedad7aad1e12283e4f6b6669b Text-content-sha1: 8b2132799d9c610669435a75e1a9e389a508e848 Content-length: 36 SVNx ]HkIRm = ltime( Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c7bc9956cece20f012dfa000f16ec0b7 Text-delta-base-sha1: 43c67a4f499f633e6ea1eeec685b9139cdbfd98c Text-content-length: 102 Text-content-md5: 14eb173a589df65c5800784e51239b5e Text-content-sha1: e612cdae5006845b1a9608b19bdad283ce7c7ffa Content-length: 102 SVNDK*>#include /* for struct_tmstruct tm ltime(void Node-path: putty/time.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 166 Text-content-md5: 11976422c786723932edb1b6b306c20b Text-content-sha1: dd2bae210761f967af69906e5220600a348ace91 Content-length: 176 PROPS-END SVN#include #include struct tm ltime(void) { time_t t; time(&t); assert (t != ((time_t)-1)); return *localtime(&t); } Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c15a4c4b5a3b62d0749b7a418d2a258 Text-delta-base-sha1: f39daa629d8c690fa1d641d78fa66897f6f88120 Text-content-length: 121 Text-content-md5: 52dcaafdbbca23ea319305b0b4fca09d Text-content-sha1: d657ac8ebeadf3b39124e0e03623c4eccad0eca9 Content-length: 121 SVNoeX`hL,Cstruct tm tmm=ltime(); strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t", &tm Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 72e8ac70e3f6e4f6452c9df4abc59239 Text-delta-base-sha1: 6727a59386c77fcc8a0b6effb8c1afb9bdd3ebc7 Text-content-length: 118 Text-content-md5: a64c9391bbc2d892a9030c6520757da3 Text-content-sha1: 38125d30cf6bad78a39b70489158dfe4b6a3dc5e Content-length: 118 SVNXi qLFWstruct tm tmm=ltime(); strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t", &tm Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a6e5fdc9d20b54e979ba1211f61e67e6 Text-delta-base-sha1: 31555c85da610f9ebb3ea92a77b8403fd5f479d5 Text-content-length: 208 Text-content-md5: bc33fa4925da1406e4bbcde3a5dd3f13 Text-content-sha1: c9a8787ddef973ee5662b3d068074a55e46bda4b Content-length: 208 SVN(4^4s5struct tm tm; tm = ltime(); if (state->is_dsa) strftime(*state->commentptr, 30, "dsa-key-%Y%m%d", &tm); else strftime(*state->commentptr, 30, "rsa-key-%Y%m%d", & Node-path: putty/windows/wintime.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 469 Text-content-md5: 6d8a5a7898412f68e15bdf2f877690ca Text-content-sha1: e904f4f2432399b1c5870ddb3d609f31e6dd1708 Content-length: 479 PROPS-END SVNGGG#include "putty.h" #include struct tm ltime(void) { SYSTEMTIME st; struct tm tm; GetLocalTime(&st); tm.tm_sec=st.wSecond; tm.tm_min=st.wMinute; tm.tm_hour=st.wHour; tm.tm_mday=st.wDay; tm.tm_mon=st.wMonth-1; tm.tm_year=(st.wYear>=1900?st.wYear-1900:0); tm.tm_wday=st.wDayOfWeek; tm.tm_yday=-1; /* GetLocalTime doesn't tell us */ tm.tm_isdst=0; /* GetLocalTime doesn't tell us */ return tm; } Revision-number: 5087 Prop-content-length: 122 Content-length: 122 K 10 svn:author V 4 owen K 8 svn:date V 27 2005-01-09T14:41:11.260867Z K 7 svn:log V 23 Fixed this on Windows. PROPS-END Node-path: putty-wishlist/data/time_t-minus-one Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 89f418a7e0be645cf5a21299d8ff90d2 Text-delta-base-sha1: a09d0fdb45899b5cca76ef4c52d3cb4c88b9dfe7 Text-content-length: 39 Text-content-md5: e5b92059ee750705f3c27692ef400c50 Text-content-sha1: ec72202c35677fb99a7595a2673054d31ff5da92 Content-length: 39 SVN!6v,uFixed-in: 2005-01-10 Revision-number: 5088 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 28 Remove unwanted underscore. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-01-09T14:45:00.841459Z PROPS-END Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 14eb173a589df65c5800784e51239b5e Text-delta-base-sha1: e612cdae5006845b1a9608b19bdad283ce7c7ffa Text-content-length: 22 Text-content-md5: e1c94d839434694bd980231cf3dad5b4 Text-content-sha1: cafeb8a5979d29f47d0c662f16a58d3dee335691 Content-length: 22 SVN PFQ Revision-number: 5089 Prop-content-length: 270 Content-length: 270 K 8 svn:date V 27 2005-01-09T14:55:55.376265Z K 7 svn:log V 169 sk_namelookup() on Unix was failing to translate from our platform- independent ADDRTYPE_* constants to real AF_* ones, causing explicit protocol specification to fail. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cc02190d36d2561ffa4b5d75eb6702ab Text-delta-base-sha1: cf6b046946e5367f02a58f08d071bf9533d92b5b Text-content-length: 182 Text-content-md5: 2629018f4c4c1d038760b30dfd2d3cef Text-content-sha1: d4d5d149533592968cb054d3dff1751b37c45fa1 Content-length: 182 SVNI; GYp(address_family == ADDRTYPE_IPV4 ? AF_INET : address_family == ADDRTYPE_IPV6 ? AF_INET6 : AF_UNSPEC); hints.ai_socktype = SOCK_STREAM Revision-number: 5090 Prop-content-length: 110 Content-length: 110 K 8 svn:date V 27 2005-01-10T09:52:34.437898Z K 7 svn:log V 10 AIX patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2178133c8f992bddf77a3692f8e6747f Text-delta-base-sha1: e7c16321189aa7fac79c724edc1629bc4ea35f58 Text-content-length: 132 Text-content-md5: 2bba36778be0d89b0e4cbe8e970d12d6 Text-content-sha1: c2da56b02ff99c570aeef56c4c4c7515b4e082ff Content-length: 132 SVNka nsnkli>AIX (v4.3.3, v5.1, v5.2, v5.3)
    OF71AF0B3D.3EEF9A4D-ONC1256F84.0077EAA2-C1256F84.007BE7DA@de.ibm.com Revision-number: 5091 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 30 Doubt this is still relevant. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-01-10T12:00:30.298000Z PROPS-END Node-path: putty-wishlist/data/keymap-switch Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a59cdc6a592476ca1473c283dc3500db Text-delta-base-sha1: 945738a0198da00ccb98a4c1cc43777655c4f036 Text-content-length: 307 Text-content-md5: fcf90ef6d92f110e4341af33468a20ac Text-content-sha1: d125a581f6a978fbd76b99b3f04564b8d8cb3ff7 Content-length: 307 SVN1Q 1 OSD: I can't reproduce this on this Windows XP system, and the code for recognising keymap switching (WM_INPUTLANGCHANGE) seems to have been there since at least r1427 if not since RDB's Unicode patch in r1110. Unless anyone can reproduce this anywhere, I'm tempted to mark it as done. Revision-number: 5092 Prop-content-length: 294 Content-length: 294 K 7 svn:log V 193 Servers announcing themselves as `Sun_SSH_1.0' apparently cannot deal with rekeys at all: they totally ignore mid-session KEXINIT sent by the client. Hence, a new bug entry so we don't try it. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-11T10:37:55.311293Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cab6a9568d743b688c4e87916885359d Text-delta-base-sha1: f97804cdfbcc72046dbbc3ad08b5df2d9d9fdc36 Text-content-length: 189 Text-content-md5: 44f58700eac8c2a2f6730a2a9cc3e3ff Text-content-sha1: 73aa6cc7803aaacb09b314c0c10e74ce116600de Content-length: 189 SVNd'Z' ctrl_droplist(s, "Ignores key re-exchange completely", 'k', 20, HELPCTX(ssh_bugs_rekey2), sshbug_handler, I(offsetof(Config,sshbug_rekey2))); } } } Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99420db60b7cb69eadd63566edbcc6ec Text-delta-base-sha1: 1576a813a39d6d6ea5c3e69301a0a3f04eb846f1 Text-content-length: 725 Text-content-md5: 439a912a49a36594bb74a1cb62c243e1 Text-content-sha1: 0d4ae58921c6b7e59e2e35649d0c98e9359a4fc7 Content-length: 725 SVNY) --knS{config-ssh-bug-rekey} \q{Ignores key re-exchange completely} \cfg{winhelp-topic}{ssh.bugs.rekey2} Some very old SSH servers cannot cope with repeat key exchange at all, and will ignore attempts by the client to start one. Since PuTTY pauses the session while performing a repeat key exchange, the effect of this would be to cause the session to hang after an hour (unless you have your rekey timeout set differently; see \k{config-ssh-kex-rekey} for more about rekeys). If this bug is detected, PuTTY will never initiate a repeat key exchange. If this bug is enabled when talking to a correct server, the session should still function, but may be less secure than you would expect Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc53066df32ca56bef52b810ea9e04a2 Text-delta-base-sha1: 8eb6ca73030d2493e9df8897092c02ecda24bb00 Text-content-length: 39 Text-content-md5: eefa772a00826bdcd8348e351fba896c Text-content-sha1: 338f0d9761512870ac5b5d3f231d5be7fe070689 Content-length: 39 SVNDS YlX, sshbug_rekey Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fc51e8a4c54b23b2f5a86573c36823dc Text-delta-base-sha1: 450061ea8ccb333f6250a7c42886c26318d0fef0 Text-content-length: 62 Text-content-md5: ea881d96d475930160db389f7b4dd14a Text-content-sha1: 81ab88611e483d7573f291b97f33719373a1cb98 Content-length: 62 SVN9z %|Y`BugRekey2", 0, &i); cfg->sshbug_rekey Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60d89de482d5882795564c8e157ed7bf Text-delta-base-sha1: e38265bad86f60c62475e83eafdc08cee5cb577a Text-content-length: 2836 Text-content-md5: b29194d21fb20c09f88b16c335d6f4ef Text-content-sha1: 53f73460d39f37cf3edb5a6363c64ebe06484cb2 Content-length: 2836 SVN#ho)cfg.sshbug_rekey2 == FORCE_ON || (ssh->cfg.sshbug_rekey2 == AUTO && wc_match("Sun_SSH_1.0", imp))) { /* * These versions have the SSH2 ignore-rekey bug. */ ssh->remote_bugs |= BUG_SSH2_REKEY; logevent("We believe remote version has SSH2 ignore-rekeya`b_7W the channel's remoteid is -1, we have sent * CHANNEL_OPEN for this channel, but it hasn't even been * acknowledged by the server. So we must set a close flag * on it now, and then when the server acks the channel * o wait_for_rekey: /* * Special case: if the server bug is set that doesn't * allow rekeying, we give a different log message and * continue waiting. (If such a server _initiates_ a rekey, * we process it anyway!) */ if ((ssh->remote_bugs & BUG_SSH2_REKEY)) { logeventf(ssh, "Server bug prevents key re-exchange (%s)", (char *)in); /* Reset the counters, so that at least this message doesn't * hit the event log _too_ often. */ ssh->outgoing_data_size = 0; ssh->incoming_data_size = 0; if (ssh->cfg.ssh_rekey_time != 0) { ssh->next_rekey = schedule_timer(ssh->cfg.ssh_rekey_time*60*TICKSPERSEC, ssh2_timer, ssh); } goto wait_for_rekey; /* this is utterly horrid */ } else { logeventf(ssh, "Initiating key re-exchange (%s)", (char *)in); logevent((char *)in); }-9H|;o-w@wT -{Lvr&'{K<H?;0}->cfg); /* * Potentially enable agent forwarding. */ if (ssh->mainchan && ssh->cfg.agentfwd && agent_exists()) { logevent("Requesting OpenSSH-style agent forwarding"); ssh2_pkt_addstring(s->pktout, "auth-agent-req@openssh.com"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */agent forwarding request:" " packet type %d", pktin->type)); crStopV; } logevent("Agent forwarding refused"); } else { logevent("Agent forwarding enabled"); ssh->agentfwd_enabled = TRUE; } } /* * Now allocate a pty for the session. */ if (ssh->mainchan && !ssh->cfg.nopty) { /* Unpick the terminal-speed string. */ /* XXX perhaps we should allow no speeds to be sent. */ ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */ sscanf(ssh->cfg.termspeed, "%d,%d", &ssh->ospeed, &ssh->ispeed); /* Build the pty request. */timeout",too much data receivedtimeout shorteneddata limit loweredcompression setting changedcipher settings changedat Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0a8fa1c7ed01e5c6fb2592a67785b6c2 Text-delta-base-sha1: a93a203f918d668de126557461381410e104345e Text-content-length: 70 Text-content-md5: 5f71289efc11191a7ee8b57ea6802382 Text-content-sha1: 72e3228e019a2973b9a71a4469812a8670b9040e Content-length: 70 SVNE6#define WINHELP_CTX_ssh_bugs_rekey2 "ssh.bugs.rekey2" Revision-number: 5093 Prop-content-length: 370 Content-length: 370 K 8 svn:date V 27 2005-01-11T10:45:43.399593Z K 7 svn:log V 269 The Unix `make install' target now allows you to define UTMP_GROUP, in which case pterm will be installed setgid that, or to define UTMP_USER in which case it will be installed setuid that. If you define neither, it will be installed without any set-id bits as before. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ca10be2a3f38f0c5af3e83e21b2802b Text-delta-base-sha1: 7c06e07aa5e46e949db8bbf2c571915b20b1313e Text-content-length: 296 Text-content-md5: d9d2cc671e477cebc385cd06ca373c1e Text-content-sha1: 7ce65e5eb1599beb371fa45e39e9b3ad295c6aa0 Content-length: 296 SVN\n 4*2if test -n "$(UTMP_GROUP)"; then \ chgrp $(UTMP_GROUP) $(DESTDIR)$(bindir)/pterm && \ chmod 2755 $(DESTDIR)$(bindir)/pterm; \ elif test -n "$(UTMP_USER)"; then \ chown $(UTMP_USER) $(DESTDIR)$(bindir)/pterm && \ chmod 4755 $(DESTDIR)$(bindir)/pterm; \ fi Revision-number: 5094 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 39 Sun_SSH_1.0.1 also has BUG_SSH2_REKEY. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-11T13:24:47.467768Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b29194d21fb20c09f88b16c335d6f4ef Text-delta-base-sha1: 53f73460d39f37cf3edb5a6363c64ebe06484cb2 Text-content-length: 205 Text-content-md5: f4b81a578c8b90b2efaafe9415899c94 Text-content-sha1: a29c21327c73287d5623c488c7dae68b40afb024 Content-length: 205 SVNBjBT(wc_match("Sun_SSH_1.0", imp) || wc_match("Sun_SSH_1.0.1", imp)'Y if (c && !c->closes) { /* * If9`'9 */ ssh_setup_portfwd(ssh, &ssh Revision-number: 5095 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 Bah, I left a rogue event log entry lying around. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-11T15:33:35.229466Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f4b81a578c8b90b2efaafe9415899c94 Text-delta-base-sha1: a29c21327c73287d5623c488c7dae68b40afb024 Text-content-length: 92 Text-content-md5: 2414fd4fe91a931ea9c66112420c69f4 Text-content-sha1: 4187db6f24db3a4f319f55f7a8642a249a75f77b Content-length: 92 SVN "Mo */ ssh_setup_portfwd(ssh,`>>" Revision-number: 5096 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2005-01-11T15:34:15.865453Z K 7 svn:log V 60 Some versions of OpenSSH don't like KEXINIT sent too early. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/kexinit-unimplemented Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2286 Text-content-md5: 6b1b9fba0a9664f4b53e132a7c51e400 Text-content-sha1: 6127e83eb6d55ed20ec0174dffd37888c55517a9 Content-length: 2296 PROPS-END SVN```Summary: SSH_MSG_UNIMPLEMENTED in response to SSH_MSG_KEXINIT is ignored Class: semi-bug Priority: medium Difficulty: tricky Content-type: text/plain ---------------------------------------------------[Tue Jan 11 15:08:58 2005]-- From: Not ordinarily borrowable. (bjh:1) To: anakin:8 Curious: If I use PuTTY to connect to wraith.csi.cam.ac.uk, and request key re-exchange before typing the user name, the packet log shows PuTTY getting an SSH2_MSG_UNIMPLEMENTED, but PuTTY doesn't bombout(("expected key exchange packet from server")) as I'd expect. Of course, it also doesn't give up on the key exchange, which it perhaps should. ---------------------------------------------------[Tue Jan 11 15:13:37 2005]-- From: `Wombling *freely*', dammit! (anakin:8) To: bjh:1 > Curious: If I use PuTTY to connect to wraith.csi.cam.ac.uk, and request key > re-exchange before typing the user name, the packet log shows PuTTY getting a > SSH2_MSG_UNIMPLEMENTED, but PuTTY doesn't bombout(("expected key exchange > packet from server")) as I'd expect. Well, UNIMPLEMENTED won't be going to do_ssh2_transport(), because it's not in the transport layer range of message numbers [20,50). So I suppose it'd go to do_ssh2_authconn(). My guess is that it's being swallowed in the crWaitUntilV(!pktin) at line 6076, which I suppose ought to be fixed somehow. Responding to the UNIMPLEMENTED by abandoning that particular key exchange sounds above the call of duty to me, I have to say, when the fault is obviously OpenSSH's. ---------------------------------------------------[Tue Jan 11 15:25:54 2005]-- From: Not ordinarily borrowable. (bjh:1) To: anakin:8 > Well, UNIMPLEMENTED won't be going to do_ssh2_transport(), because it's not i > the transport layer range of message numbers [20,50). So I suppose it'd go to > do_ssh2_authconn(). Ah. That would explain my confusion. > Responding to the UNIMPLEMENTED by abandoning that particular key exchange > sounds above the call of duty to me, I have to say, when the fault is obvious > OpenSSH's. I suppose so. It's not as if we're likely to do an automatic re-exchange before authentication is complete, so exiting with an error at that stage would be reasonable. I'll add a wishlist item, since that code scares me. Revision-number: 5097 Prop-content-length: 298 Content-length: 298 K 8 svn:date V 27 2005-01-11T16:33:08.272164Z K 7 svn:log V 199 Versions of OpenSSH before 2.5.4 kill the connection if the client attempts to rekey. Extend the description of SSH2_BUG_REKEY to cover this situation and apply it to the relevant OpenSSH versions. K 10 svn:author V 3 ben PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 44f58700eac8c2a2f6730a2a9cc3e3ff Text-delta-base-sha1: 73aa6cc7803aaacb09b314c0c10e74ce116600de Text-content-length: 51 Text-content-md5: 4d7ddc2fc91663ae0816d657e5e06b5c Text-content-sha1: 6fc4eb44a11644f8cca25ce868b017c4d900b016 Content-length: 51 SVN| pqHandles key re-exchange bad Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 439a912a49a36594bb74a1cb62c243e1 Text-delta-base-sha1: 0d4ae58921c6b7e59e2e35649d0c98e9359a4fc7 Text-content-length: 253 Text-content-md5: a1ee88e76cc889802920bc673096a651 Text-content-sha1: 31cdec3e96c2e22e7f3a16b335a93f907d18c85c Content-length: 253 SVN)!N,Jg@iHandles key re-exchange badly} \cfg{winhelp-topic}{ssh.bugs.rekey2} SomeOther, very old, SSH servers handle repeat key exchange even more badly, and disconnect upon receiving a repeat key exchange request Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2414fd4fe91a931ea9c66112420c69f4 Text-delta-base-sha1: 4187db6f24db3a4f319f55f7a8642a249a75f77b Text-content-length: 215 Text-content-md5: d0944595278dce7c11bba03b19c0d67d Text-content-sha1: 91542f1c6bea658449bb771c29d97370a05bad19 Content-length: 215 SVNHuHlkc^tHOpenSSH_2.[0-4]*", imp) || wc_match("OpenSSH_2.5.[0-3]*", imp) || N~2 >DD>* * Enable port forwardings. */ ssh_setup_portfwd(ssh, Revision-number: 5098 Prop-content-length: 497 Content-length: 497 K 10 svn:author V 5 simon K 8 svn:date V 27 2005-01-11T19:33:41.846772Z K 7 svn:log V 396 Fix `disconnect': arrange that we keep track of when we're expecting to see the server slam the TCP connection shut (i.e. almost never, unless it's just sent us an SSH_MSG_DISCONNECT), and treat an unexpected closure as a non-clean session termination. Previously any server-initiated connection closure was being treated as a clean exit, which was a hangover from the good old Telnet-only days. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d0944595278dce7c11bba03b19c0d67d Text-delta-base-sha1: 91542f1c6bea658449bb771c29d97370a05bad19 Text-content-length: 1732 Text-content-md5: c468dfb76943430fde542c9a05e33f29 Text-content-sha1: b240478f28c3cdf1a113a948a79f37286e36ad57 Content-length: 1732 SVNW`yd4t(mhYk&{^\:9:bqint ssh_do_close(Ssh ssh, int notify_exit int close_expected, FALSEint ssh_do_close(Ssh ssh, int notify_exit) { int i, ret = 0 if (notify_exit) notify_remote_exit(ssh->frontend); else ret = 1 return ret;int need_notify = ssh_do_close(ssh, FALSE); if (!error_msg && !ssh->close_expected) { error_msg = "Server unexpectedly closed network connection"; } logevent("Server closed network connection"); } if (need_notify) notify_remote_exit(ssh->frontend);, TRUE ssh->close_expected = TRUE ssh->close_expected = TRUE8tv?=tpqx[bQD1's_SMSG_FAILURE) { if (flags & FLAG_VERBOSE) c_write_str(ssh, "Access denied\r\n"); logevent("Authentication refused"); } else if (pktin->type != SSH1_SMSG_SUCCESS) { bombout(("Strange packet received, type %d", pktin->type)); crStop(0); } } logevent("Authentication successful"); crFinish(1); } void sshfwd_close(struct ssh_channel *c->close_expected = TRUE;->close_expected = TRUE;->close_expected = TRUE ssh->close_expected = TRUE ssh->close_expected = TRUE ssh->close_expected = TRUE!zH@2H>wM5l(s->pktout, 0); /* many connections */ ssh2_pkt_addstring(s->pktout, proto); ssh2_pkt_addstring(s->pktout, data); ssh2_pkt_adduint32(s->pktout, x11_get_screen_number(ssh->cfg.x11_display));X11 forwardinglogevent("X11 forwarding refused"); } else { logevent("X11 forwarding enabled"); ssh->X11_fwd_enabled = TRUE; } } /close_expected = FALSE, TRUE Node-path: putty-wishlist/data/disconnect Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 14cfe41c2d117c0cdf97e1916a60fa14 Text-delta-base-sha1: 053a18693849e78a7b159a8b4a3bb72b9510ff37 Text-content-length: 287 Text-content-md5: 269445292e12d9f43edb2f7c5ff4f1c7 Text-content-sha1: f7bb971be9965e89bcee50d28ddde4e4c30588f1 Content-length: 287 SVNZf Z

    SGT, 2005-01-11: In fact, SSH is really simple in this respect: as far as I can tell it's always the client's job to close the connection, so any closure on the part of the server counts as unexpected. Unless, that is, it comes after a DISCONNECT. Revision-number: 5099 Prop-content-length: 136 Content-length: 136 K 7 svn:log V 36 _actually_ add putty.portalinux.org K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-12T03:39:57.169152Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8455d2835c951c84a741f4edaa474c93 Text-delta-base-sha1: f943d96d59960d0fa0a1fc8d3357f0faa6be60a5 Text-content-length: 128 Text-content-md5: e4ec865dea8e2877172deec42c96b021 Text-content-sha1: 4069bad73039601135dc04d3936c80f3110810d4 Content-length: 128 SVN|q`AA|portalinux.org/">putty.portalinux.org in Belgiumscarlet.be/">putty.scarlet.be in Belgium Revision-number: 5100 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 25 http://putty.nasice.org/ K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-12T03:48:31.262853Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e4ec865dea8e2877172deec42c96b021 Text-delta-base-sha1: 4069bad73039601135dc04d3936c80f3110810d4 Text-content-length: 66 Text-content-md5: 8c042a3fe018100f798afb53a1325439 Text-content-sha1: 0c93a7ad5c70e74af24c9d3f347654b55ee2c383 Content-length: 66 SVNq^ +`Snasice.org/">putty.nasice.org in Croati Revision-number: 5101 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:06.257804Z PROPS-END Revision-number: 5102 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 46 Mark this as present in yesterday's snapshot. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-12T19:23:42.130900Z PROPS-END Node-path: putty-wishlist/data/kexinit-unimplemented Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6b1b9fba0a9664f4b53e132a7c51e400 Text-delta-base-sha1: 6127e83eb6d55ed20ec0174dffd37888c55517a9 Text-content-length: 43 Text-content-md5: 9e9493f466164e3abe025d1d37d5b9d6 Text-content-sha1: 062671466c8a8752df7a805f0e75ddc99a3dd88f Content-length: 43 SVN`w KPresent-in: 2005-01-11 Revision-number: 5103 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2005-01-12T19:24:25.601135Z K 7 svn:log V 45 Summary: first_kex_packet_follows is ignored K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/kexinit-guess Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1165 Text-content-md5: 1383b25944ec465a73056efc4c9ccd57 Text-content-sha1: ffdcbb46b084d6992d3013e4ece9832827204689 Content-length: 1175 PROPS-END SVNSummary: first_kex_packet_follows is ignored Class: bug Priority: medium Difficulty: fun Content-type: text/plain Present-in: 2005-01-11 The current SECSH transport draft, draft-ietf-secsh-transport-22.txt, specifies a boolean in the KEXINIT packet defined as: first_kex_packet_follows Indicates whether a guessed key exchange packet follows. If a guessed packet will be sent, this MUST be TRUE. If no guessed packet will be sent, this MUST be FALSE. After receiving the SSH_MSG_KEXINIT packet from the other side, each party will know whether their guess was right. If the other party's guess was wrong, and this field was TRUE, the next packet MUST be silently ignored, and both sides MUST then act as determined by the negotiated key exchange method. If the guess was right, key exchange MUST continue using the guessed packet. From code inspection, I think PuTTY currently ignores this field, which means that if it encounters a server that sets it to true and doesn't share PuTTY's preferred key-exchange method, it'll get horribly confused. Revision-number: 5104 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2005-01-12T19:36:45.147416Z K 7 svn:log V 29 Note expiry of relevant I-D. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9767517e5a0c719bfa2a03ad7f692899 Text-delta-base-sha1: d6574042423486feabbd1de2f40a7611fad70a83 Text-content-length: 214 Text-content-md5: a644ee084bc25ca8d5d8ebbd56d7cea0 Text-content-sha1: 455652277c03954f8de3317cab48dafdc2df3547 Content-length: 214 SVNFCCwas proposed in draft-ietf-secsh-scp-sftp-ssh-uri-01, but that draft has expired and not been replaced. Revision-number: 5105 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 42 Summary: PuTTY misinterprets SCI as DECID K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-13T13:41:23.654265Z PROPS-END Node-path: putty-wishlist/data/sci-is-not-decid Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 660 Text-content-md5: 3b8e19d8508a92e36905247747e37d0a Text-content-sha1: fd815e9a3133d519f745023f17091aae4350b673 Content-length: 670 PROPS-END SVNSummary: PuTTY misinterprets SCI as DECID Class: bug Priority: medium Difficulty: fun Content-type: text/plain Present-in: 2005-01-12 When using an ISO 8-bit character set (like ISO 8859-1), character code 0x9a is the C1 control SCI, Single Character Introducer, whose use is "reserved for future standardization" by ECMA-48. PuTTY, though, internally translates it into ESC Z, which it then interprets as DECID for VT52 compatibility. This is particularly unfortunate since it means that there's a single byte that causes PuTTY to send data back to the server, which tends to cause problems for people foolish enough as to "cat" binary files. Revision-number: 5106 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2005-01-13T21:21:27.542313Z K 7 svn:log V 43 Summary: Support for Multi_Key in GTK port K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/multi-key Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 337 Text-content-md5: 84f2e52aee2915714848a1701fa1fd7a Text-content-sha1: 9d5b432f3decd915ea02ec336d86b59c68f5fc25 Content-length: 347 PROPS-END SVNCCCSummary: Support for Multi_Key in GTK port Class: semi-bug Priority: low Content-type: text/plain E1Cp2HC-0004Ni-00@chiark.greenend.org.uk: The Multi_Key (that is the X Compose key) doesn't appear to work in pterm. In other applications if I type " ' e" then I get an e-acute whereas in pterm I just get 'e. Revision-number: 5107 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2005-01-13T21:50:41.048292Z K 7 svn:log V 59 Mention Cygwin/X as a potential X server, since it's free. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6639ab4f279914816fc72b10cb5cfb1c Text-delta-base-sha1: 6e22cf2a8ac397d16482d1ab14d296f76aba23d6 Text-content-length: 42 Text-content-md5: 071bcd23592d61a29faba72cd55051af Text-content-sha1: 3a55f68b897d8b25f5b69267fed5a4753b9a0be3 Content-length: 42 SVNu ZaCygwin/X, X-Win32, Revision-number: 5108 Prop-content-length: 275 Content-length: 275 K 8 svn:date V 27 2005-01-14T12:26:38.397014Z K 7 svn:log V 176 Don't use GNUish pattern rules in the Unix Makefile, since they're not supported by non-GNU makes. This allows the standard Solaris /usr/ccs/bin/make to handle that Makefile. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c86bf08bf65b9d0d851e26e15ba09c5a Text-delta-base-sha1: c0e9141142ca7e7380621886b5da88a9c97d890a Text-content-length: 127 Text-content-md5: c2b059cb53132007a1770d4e4a671e51 Text-content-sha1: 6480c1eba839d1dc4f8a73036d94c8069185489f Content-length: 127 SVN}_8r _w print &splitline("\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c $d->{deps}->[0]\n") Revision-number: 5109 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 58 INADDR_NONE is nonstandard. Use (in_addr_t)(-1) instead. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-14T19:28:18.090697Z PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2629018f4c4c1d038760b30dfd2d3cef Text-delta-base-sha1: d4d5d149533592968cb054d3dff1751b37c45fa1 Text-content-length: 60 Text-content-md5: 189af9b939ac82c756cd6fee637a99e0 Text-content-sha1: 80451194f531371293971ca9dddc7fe1806c546f Content-length: 60 SVN;B|j>}(in_addr_t)(-1)(in_addr_t)(-1) Revision-number: 5110 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:06.672701Z PROPS-END Revision-number: 5111 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2005-01-15T17:16:48.553057Z K 7 svn:log V 70 Throw away "./" in findfile so that the Mac makefile has valid paths. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c2b059cb53132007a1770d4e4a671e51 Text-delta-base-sha1: 6480c1eba839d1dc4f8a73036d94c8069185489f Text-content-length: 44 Text-content-md5: 4f4a9fb55a38ffda79a9a3e687bca492 Text-content-sha1: d7dd49c2b479eebabf74e7b703212fe1481c3a6b Content-length: 44 SVN) } $outdir=~s/^\.\/// Revision-number: 5112 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2005-01-15T17:28:44.655930Z K 7 svn:log V 42 Fix prototypes for mactcp_new and ot_new. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1b43c17e1561a0dfbc7153e8058e6b50 Text-delta-base-sha1: 0b5d439dd430c020bdde37ce1f3b55d9970f2921 Text-content-length: 25 Text-content-md5: 9f9c25ce51945511781962fe649f6c34 Text-content-sha1: ec5e55c3980a0d0dc0a6f0b5579c653837c0fc84 Content-length: 25 SVNr|mh~t Revision-number: 5113 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2005-01-15T18:30:05.696954Z K 7 svn:log V 63 FWHACK has been dead for years. Remove it from the Makefiles. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d9d2cc671e477cebc385cd06ca373c1e Text-delta-base-sha1: 7ce65e5eb1599beb371fa45e39e9b3ad295c6aa0 Text-content-length: 126 Text-content-md5: 347179a63b59ddac6dbbdb4150e1ff6a Text-content-sha1: 72e85f77eadc95d3c458928b9ea6183dfb32336f Content-length: 126 SVNnY!RQ*t;{9j>)2R-AXFLAGS) $(CFLAGS) `cat ../version.def` -c ../version.c; \ else \ $(CC) $(COMPAT Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f4a9fb55a38ffda79a9a3e687bca492 Text-delta-base-sha1: d7dd49c2b479eebabf74e7b703212fe1481c3a6b Text-content-length: 163 Text-content-md5: 7807e4cab21f409fe9d6a66742248113 Text-content-sha1: 1062aaee9621f2da93439166556b6d1e7dd10e5c Content-length: 163 SVN)F0fj*k%,EN|UOzfdE". " \$(XFLAGS) \$(CFLAGS) ".$d->{deps}->[0],69)."\n"; } else { print &splitline("\tlrc Revision-number: 5114 Prop-content-length: 305 Content-length: 305 K 8 svn:date V 27 2005-01-15T20:39:27.478413Z K 7 svn:log V 206 Turn of ICRNL in the client tty when we're not in editing mode. This means that we send literal CRs and let the remote pty layer work out what to do with them, so that if it wants raw mode it can have it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 45ccd4e90d10d30e520762addfdc8661 Text-delta-base-sha1: 5334e0733db5358ab0aca42d2c54f12723775c30 Text-content-length: 163 Text-content-md5: a192d2991c2c915a56d1a9635650e81f Text-content-sha1: be2c580cdbca4ebe9307b90505c087f02d46cc97 Content-length: 163 SVN` D P { mode.c_iflag |= ICRNL; mode.c_lflag |= ISIG | ICANON; } else { mode.c_iflag &= ~ICRNL; mode.c_lflag &= ~(ISIG | ICANON); } Revision-number: 5115 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2005-01-16T12:37:19.182128Z K 7 svn:log V 132 Rewrite of Unix sk_newlistener() which should fix any possible problems involving trying to bind an IPv6 socket to an IPv4 address. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 189af9b939ac82c756cd6fee637a99e0 Text-delta-base-sha1: 80451194f531371293971ca9dddc7fe1806c546f Text-content-length: 1971 Text-content-md5: 1e5c743d172302f5a2d277cc18009552 Text-content-sha1: 2283adf171de83b8581454657a9e12dcb15667ae Content-length: 1971 SVNB:3rg4AgkUlp|kZy{\N4$ struct sockaddr_in6 a6; #endif struct sockaddr *addr; int addrlen; struct sockaddr_in aretcode = -1; addr = NULL; addrlen = -1; /* placate optimiser */ if (srcaddr != NULL) { #ifndef NO_IPV6 hints.ai_flags = AI_NUMERICHOST; hints.ai_family = address_family; hints.ai_socktype = 0; hints.ai_protocol = 0; hints.ai_addrlen = 0; hints.ai_addr = NULL; hints.ai_canonname = NULL; hints.ai_next = NULL; sprintf(portstr, "%d", port); retcode = getaddrinfo(srcaddr, portstr, &hints, &ai); addr = ai->ai_addr; addrlen = ai->ai_addrlen; #else memset(&a,'\0',sizeof(struct sockaddr_in)); a.sin_family = AF_INET; a.sin_port = htons(port); a.sin_addr.s_addr = inet_addr(srcaddr); if (a.sin_addr.s_addr != (in_addr_t)(-1)) { /* Override localhost_only with specified listen addr. */ ret->localhost_only = ipv4_is_loopback(a.sin_addr); got_addr = 1; } addr = (struct sockaddr *)a; addrlen = sizeof(a); retcode = 0; #endif } if (retcode != 0) { #ifndef NO_IPV6 if (address_family == AF_INET6) { memset(&a6,'\0',sizeof(struct sockaddr_in6)); a6.sin6_family = AF_INET6; a6.sin6_port = htons(port); if (local_host_only) a6.sin6_addr = in6addr_loopback; else a6.sin6_addr = in6addr_any; addr = (struct sockaddr *)&a6; addrlen = sizeof(a6); } else #endif { memset(&a,'\0',sizeof(struct sockaddr_in)); a.sin_family = AF_INET; a.sin_port = htons(port); addr = (struct sockaddr *)&a; addrlen = sizeof(a); } } retcode = bind(s, addr, addrlen); if (retcoderet->s = s Revision-number: 5116 Prop-content-length: 133 Content-length: 133 K 7 svn:log V 34 Add minibidi to Mac PuTTY objects K 10 svn:author V 4 owen K 8 svn:date V 27 2005-01-16T13:40:36.692826Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 347179a63b59ddac6dbbdb4150e1ff6a Text-delta-base-sha1: 72e85f77eadc95d3c458928b9ea6183dfb32336f Text-content-length: 45 Text-content-md5: 39b141c3aee1f3e131c1505096745fd2 Text-content-sha1: c0c6802e17098d92d409c7248beb2ba96d0b14c5 Content-length: 45 SVNYkB:B]| minibidi minibidi Revision-number: 5117 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2005-01-16T14:02:56.989892Z K 7 svn:log V 151 Owen tells me the Mac compiler complains at a char / unsigned char mismatch in the invocation of hmacmd5_key(). Do it properly with a void * argument. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 573a50340ddfc841f554763199779bdb Text-delta-base-sha1: 6404e950652ea49cef1960c6c2f82b4125f7f221 Text-content-length: 25 Text-content-md5: 23384daa7c1acac3de62181d02d8a91e Text-content-sha1: 70fc95cc32eebfecc5ee61e8f9f22036c94b28ff Content-length: 25 SVN{ \(void Node-path: putty/sshmd5.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 707d4cf4fea56e0dc70d7b0efad8563a Text-delta-base-sha1: c2af5d7b942fa281a346c9f21d812f85f00f0f4c Text-content-length: 96 Text-content-md5: 3657669b423215c4cfb61adb588eb544 Text-content-sha1: 91d6f76cc9eb686f6c3be401b91ddd9e0197a952 Content-length: 96 SVNaF_gw Xvoid const *keyvunsigned char const *key = (unsigned char const *)keyv Revision-number: 5118 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2005-01-16T14:14:59.388856Z K 7 svn:log V 86 Make our SSH2 maximum packet size into a constant, since it's used in several places. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c468dfb76943430fde542c9a05e33f29 Text-delta-base-sha1: b240478f28c3cdf1a113a948a79f37286e36ad57 Text-content-length: 221 Text-content-md5: 7ce9703e7a18db7fa58669d9edebaf2c Text-content-sha1: 4627c9002c6e83ebfdf2c280dac1993858f099eb Content-length: 221 SVN CB#define OUR_V2_MAXPKT 0x4000UL;![)Iktin); if (pktin->type == SSH1OUR_V2_MAXPKTOUR_V2_MAXPKT);; 4Y.a /* want reply */ ssh2_pkt_addbooOUR_V2_MAXPKT Revision-number: 5119 Prop-content-length: 231 Content-length: 231 K 8 svn:date V 27 2005-01-16T14:29:34.641799Z K 7 svn:log V 130 Support for falling back through the list of addresses returned from a DNS lookup, whether they're IPv4, v6 or a mixture of both. K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 76e5157bf5788533f0daa1ab8170c293 Text-delta-base-sha1: 984ce591f56ea23eebb7727c7d426b85e13c37c3 Text-content-length: 739 Text-content-md5: ed054d02c76d6071b8635f098af94f5a Text-content-sha1: 76afa82c328385144a14a99c3cb29494034139f6 Content-length: 739 SVNP'DEwE@MYwvoid (*log)(Plug p, int type, SockAddr addr, int port, const char *error_msg, int error_code); /* * Passes the client progress reports on the process of setting * up the connection. * * - type==0 means we are about to try to connect to address * `addr' (error_msg and error_code are ignored) * - type==1 means we have failed to connect to address `addr' * (error_msg and error_code are supplied). This is not a * fatal error - we may well have other candidate addresses * to fall back to. When it _is_ fatal, the closing() * function will be called. */log(p,type,addr,port,msg,code) (((*p)->log) (p, type, addr, port, msg, code)) Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6bbadecc26924166d1250540451cc4ec Text-delta-base-sha1: cba62c6310fd97660559ec0d86330a7bb38bf4e9 Text-content-length: 233 Text-content-md5: 50a2a6912d144671200b4dacf1bfc826 Text-content-sha1: f231e9000a330282c8dc5fdd07ca9ecf91e87311 Content-length: 233 SVN\6?S3oJ32(4void pfd_log(Plug plug, int type, SockAddr addr, int port, const char *error_msg, int error_code) { /* we have to dump these since we have no interface to logging.c */ }log,log,log, Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ddacce15e91c254361bb6717cd414ee Text-delta-base-sha1: 308c2570c8ad828639957b0bae30993946b59c83 Text-content-length: 296 Text-content-md5: b24de40732816f483eaee88ddd9a2229 Text-content-sha1: bd5d12a33f8eb40b62bcf647dca1bdfbf792044e Content-length: 296 SVNFc+I"h^void plug_proxy_log(Plug plug, int type, SockAddr addr, int port, const char *error_msg, int error_code) { Proxy_Plug pp = (Proxy_Plug) plug; Proxy_Socket ps = pp->proxy_socket; plug_log(ps->plug, type, addr, port, error_msg, error_code); }log, Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f65efc902d80ca0fa1ab0bebadaf3f3 Text-delta-base-sha1: 18c48237f128a36603937b54ed6a791cad5bceb3 Text-content-length: 439 Text-content-md5: 28f24fdd7b7c6dfc67a2173eb52e2f5f Text-content-sha1: 056f6c3da12851d28130954487556e2aada76ef1 Content-length: 439 SVNR ELvoid raw_log(Plug plug, int type, SockAddr addr, int port, const char *error_msg, int error_code) { Raw raw = (Raw) plug; char addrbuf[256], *msg; sk_getaddr(addr, addrbuf, lenof(addrbuf)); if (type == 0) msg = dupprintf("Connecting to %s port %d", addrbuf, port); else msg = dupprintf("Failed to connect to %s: %s", addrbuf, error_msg); logevent(raw->frontend, msglog, Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85a552966f9a02843c1698959606671b Text-delta-base-sha1: ce78672e320ae70c02934167238f9985566cf500 Text-content-length: 457 Text-content-md5: 27a5192b6975ca0bc7fa250a6196e74e Text-content-sha1: d2caa7553947c10210a917b01196dbb1c0e4272e Content-length: 457 SVN&+"WlX;void rlogin_log(Plug plug, int type, SockAddr addr, int port, const char *error_msg, int error_code) { Rlogin rlogin = (Rlogin) plug; char addrbuf[256], *msg; sk_getaddr(addr, addrbuf, lenof(addrbuf)); if (type == 0) msg = dupprintf("Connecting to %s port %d", addrbuf, port); else msg = dupprintf("Failed to connect to %s: %s", addrbuf, error_msg); logevent(rlogin->frontend, msglog, Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7ce9703e7a18db7fa58669d9edebaf2c Text-delta-base-sha1: 4627c9002c6e83ebfdf2c280dac1993858f099eb Text-content-length: 897 Text-content-md5: 6d498cc900c62fad51ca7f6e9117b847 Text-content-sha1: 97a99e870ae70a2a7e0498e5c918831d2e053bb0 Content-length: 897 SVN4R(~tvovoid ssh_log(Plug plug, int type, SockAddr addr, int port, const char *error_msg, int error_code) { Ssh ssh = (Ssh) plug; char addrbuf[256], *msg; sk_getaddr(addr, addrbuf, lenof(addrbuf)); if (type == 0) msg = dupprintf("Connecting to %s port %d", addrbuf, port); else msg = dupprintf("Failed to connect to %s: %s", addrbuf, error_msg); logevent(msg)log,eNT, len, PKT_DATA, s->password, len, PKTT_OTHER, PKT_END); } } else { send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD, PKT_STR, s->password, PKTT_OTHER, PKT_END); } } logevent("Sent password"); memset(s->password, 0, strlen(s->password)); crWaitUntil(p;V^ouG;!zeof(data), ssh->cfg.x11_auth); x11_get_real_auth(ssh->x11auth, ssh->cfg.x11_display); ssh2_pkt_addstring(s->pktout, "x11-req Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aacbe4e9e6f341e9cf373cec436e00b8 Text-delta-base-sha1: fe821b7fecbca1391c0753fff2b87bc5f235334e Text-content-length: 572 Text-content-md5: 602051be87f0bde5ce7d7d174a229f91 Text-content-sha1: 595c3b4bcd26d57b18b696bb5287bf63b6149d21 Content-length: 572 SVN~# _$Tc\}+Pq.void telnet_log(Plug plug, int type, SockAddr addr, int port, const char *error_msg, int error_code) { Telnet telnet = (Telnet) plug; char addrbuf[256], *msg; sk_getaddr(addr, addrbuf, lenof(addrbuf)); if (type == 0) msg = dupprintf("Connecting to %s port %d", addrbuf, port); else msg = dupprintf("Failed to connect to %s: %s", addrbuf, error_msg); logevent(telnet->frontend, msg);logevent(telnet->frontend, error_msg); connection_fatal(telnet->frontend, "%s", error_msg); } log, Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e5c743d172302f5a2d277cc18009552 Text-delta-base-sha1: 2283adf171de83b8581454657a9e12dcb15667ae Text-content-length: 5380 Text-content-md5: 022a7b963e1d00ba10c77a6af9dada21 Text-content-sha1: 498295ccd194a5cf2b359cbb4e9900b27fd78543 Content-length: 5380 SVN:@d#, L0t(vz*o`d:Nu3*E|,A4mx!Dx9Y x!rrmew=bWu9 .)9YjSl#Ph;Lr]/O4L}}N4B I5?^r5\z%Qk,HO/s!x4p8_ int nodelay, keepalive; /* for connect()-type sockets */ int privport, port; /* and again */ SockAddr adds; /* Addresses IPv6 style. */ struct addrinfo *ai; /* steps along the linked list */ #else unsigned long *addresses; /* Addresses IPv4 style. */ int naddresses, curraddr; int ns); ret->ai = ret->ais /*debug(("Resolving \"%s\" with gethostbyname() (IPv4 only)...\n", host)); */ if ( (h = gethostbyname(host)) ) ret->family = AF_INET; } if (ret->family == 0) { ret->error = (h_errno == HOST_NOT_FOUND || h_errno == NO_DATA || h_errno == NO_ADDRESS ? "Host does not exist" : h_errno == TRY_AGAIN ? "Temporary name service failure" : "gethostbyname: unknown error"); return ret; } for (n = 0; h->h_addr_list[n]; n++); ret->addresses = snewn(n, unsigned long); ret->naddresses = n; for (n = 0; n < ret->naddresses; n++) { memcpy(&a, h->h_addr_list[n], sizeof(a)); ret->addresses[n] = ntohl(a); } ret->addresses = snew(unsigned long); ret->naddresses = 1; ret->addresses[0] = ntohl(a); ret->curraddr = 0; }s = NULL; #else ret->addresses = NULL; #endif return ret; } static int sk_nextaddr(SockAddr addr) { #ifndef NO_IPV6 if (addr->ai->ai_next) { addr->ai = addr->ai->ai_next; addr->family = addr->ai->ai_family; return TRUE; } else return FALSE; #else if (addr->curraddr+1 < addr->naddresses) { addr->curraddr++; return TRUE; } else { return FALSE; } #endif es[addr->curraddr]es[addr->curraddr]es[addr->curraddr]s != NULL) freeaddrinfo(addr->ais); #else sfree(addr->addresses ret->addr = NULL; ret->s = sockfd; if (ret->s < 0) { ret->error = strerrorstatic int try_connect(Actual_Socket sock = 0; short localport; int fl, salen; if (sock->s >= 0) close(sock->s); plug_log(sock->plug, 0, sock->addr, sock->port, NULL, 0); /* * Open socket. */ assert(sock->addr->family != AF_UNSPEC); s = socket(sock->addr->family, SOCK_STREAM, 0); sock->s = s; if (s < 0) { err = errno; goto ret; } if (sock->sock->nodelay) { int b = TRUE; setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *) &b, sizeof(b)); } if (sock->sock->sock->sock->sock-> goto ret; } /* * Connect to remote address. */ switch(sock->sock->addr->ai->ai_addr)->sin_port = htons(sock->port); sa = (const struct sockaddr *)sock->addr->ai->ai_addr; salen = sock->addr->ai->ai_addrlen; break; case AF_INET6: ((struct sockaddr_in *)sock->addr->ai->ai_addr)->sin_port = htons(sock->port); sa = (const struct sockaddr *)sock->addr->ai->ai_addr; salen = sock->sock->addr->addresses[sock->addr->curraddr]); a.sin_port = htons((short) sock->sock->port == 0); /* to catch confused people */ assert(strlen(sock->sock->err = errno; gotosock->connected = 1; sock->writable = 1; } uxsel_tell(sock); add234(sktree, sock); ret: if (err) plug_log(sock->plug, 1, sock->addr, sock->port, strerror(err), err); return errActual_Socket ret; int err ret->addr = addr; ret->s = -1; ret->oobinline = oobinline; ret->nodelay = nodelay; ret->keepalive = keepalive; ret->privport = privport; ret->port = port; err = 0; do { err = try_connect(ret); } while (err && sk_nextaddr(ret->addr)); if (err) ret->error = strerror(er ret->addr = NULLstrerrorstrerror(errno); return (Socket) ret; } if (listen(s, SOMAXCONN) < 0) { close(s); ret->error = strerrorif (s->addr) sk_addr_free(s->addrstrerror(err)); fatalbox("%s", strerrorstrerror /* * Receiving actual data on a socket means we can * stop falling back through the candidate * addresses to connect to. */ if (s->addr) { sk_addr_free(s->addr); s->addr = NULL; } /* * An error at this point _might_ be an error reported * by a non-blocking connect(). So before we return a * panic status to the user, let's just see whether * that's the case. */ int err = errno; if (s->addr) { plug_log(s->plug, 1, s->addr, s->port, strerror(err), err); while (s->addr && sk_nextaddr(s->addr)) { err = try_connect(s); } } if (err != 0) return plug_closing(s->plug, strerror(err), err, 0); } else if (0 == ret) { return plug_closing(s->plug, NULL, 0, 0); } else { /* * Receiving actual data on a socket means we can * stop falling back through the candidate * addresses to connect to. */ if (s->addr) { sk_addr_free(s->addr); s->addr = NULL; }strerror#ifndef NO_IPV6 ret->ais = NULL; #else ret->addresses = NULL; #endif return ret; } Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f828ba6dec38e2c9b84ac843b4ed05aa Text-delta-base-sha1: e1880bbc4a4e9f0f3b277ebda5d2e103b7acbefa Text-content-length: 7793 Text-content-md5: 23d2742160efc32281c07c9d32f39906 Text-content-sha1: 932a1b1eb9249bf84bcfe1ce11932577b2976fc8 Content-length: 7793 SVN5#?,$,t r4&NgSjhH@~oVckB:BB {P9$-2(9p/p7N,Mais)) == 0) ret_family = ret->ais->ai_family; ret->ai = ret->aisp_getaddrip_getnameinfo) { if (p_getnameiint n; for (n = 0; h->h_addr_list[n]; n++); ret->addresses = snewn(n, unsigned long); ret->naddresses = n; for (n = 0; n < ret->naddresses; n++) { memcpy(&a, h->h_addr_list[n], sizeof(a)); ret->addresses[n] = p_ntohl(a); } ret->curraddr = 0;addresses = snewn(1, unsigned long); ret->naddresses = 1; ret->curraddr = 0; ret->addresses[0] = p_ntohl(a); ret->family = AF_INET; strncpy(realhost, host, sizeof(realhost)); }int sk_nextaddr(SockAddr addr) { #ifndef NO_IPV6 if (addr->ai) { if (addr->ai->ai_next) { addr->ai = addr->ai->ai_next; addr->family = addr->ai->ai_family; return TRUE; } else return FALSE; } #endif if (addr->curraddr+1 < addr->naddresses) { addr->curraddr++; return TRUE; } else { return FALSE; } } void sk_getaddr(SockAddr addr, char *buf, int buflen) { #ifndef NO_IPV6 if (addr->aissert(addr->addresses && addr->curraddr < addr->naddresses); a.s_addr = p_htonl(addr->addresses[addr->curraddr]ssert(addr->addresses && addr->curraddr < addr->naddresses); a.s_addr = p_htonl(addr->addresses[addr->curraddr]ai) { if (addr->family == AF_INET) memcpy(buf, &((struct sockaddr_in *)addr->ai->ai_addr)->sin_addr, sizeof(struct in_addr)); else if (addr->family == AF_INET6) memcpy(buf, &((struct sockaddr_in6 *)addr->ai->ai_addr)->sin6_addr, sizeof(struct in6_addr)); else assert(FALSEssert(addr->addresses && addr->curraddr < addr->naddresses); a.s_addr = p_htonl(addr->addresses[addr->curraddr]); memcpy(buf, (char*) &a.s_addr, 4); } } void sk_addr_free(SockAddr addr) { #ifndef NO_IPV6 if (addr->ais && p_freeaddrinfo) p_freeaddrinfo(addr->ais); #endif if (addr->addresses) sfree(addr->addresses); ret->addrstatic DWORD try_connect(Actual_Socket sock) { SOCKET s; #ifndef NO_IPV6 SOCKADDR_IN6 a6; #endif SOCKADDR_IN a; DWORD err; char *errstr; short localport; int family; if (sock->s != INVALID_SOCKET) { do_select(sock->s, 0); p_closesocket(sock->s); } plug_log(sock->plug, 0, sock->addr, sock->port, NULL, 0)sock->addr->ai) { family = sock->addr->ai->ai_family; } else #endif { /* Default to IPv4 */ family = AF_INET; } s = p_socket(family, SOCK_STREAM, 0); socksock->error = winsock_error_string(err); goto ret; } if (sock->sock->sock->sock->sockcode; #ifndef NO_IPV6 if (sockcode = p_bind(s, (sock->addr->family == AF_INET6 ? (struct sockaddr *) &a6 : (struct sockaddr *) &a), (sock->addr->family == AF_INET6 ? sizeof(a6) : sizeof(a))); #else sockcode = p_bind(s, (struct sockaddr *) &a, sizeof(a)); #endif if (socksock->error = winsock_error_string(err); goto ret; } /* * Connect to remote address. */ #ifndef NO_IPV6 if (sock->addr->ai) { if (family == AF_INET6) { a6.sin6_family = AF_INET6; a6.sin6_port = p_htons((short) sock->port); a6.sin6_addr = ((struct sockaddr_in6 *) sock->addr->ai->ai_addr)->sin6_addr; } else { a.sin_family = AF_INET; a.sin_addr = ((struct sockaddr_in *) sock->addr->ai->ai_addr)->sin_addr; a.sin_port = p_htons((short) sock->port); } } else #endif { assert(sock->addr->addresses && sock->addr->curraddr < sock->addr->naddresses); a.sin_family = AF_INET; a.sin_addr.s_addr = p_htonl(sock->addr->addresses[sock->addr->curraddr]); a.sin_port = p_htons((short) sock->sock->error = errstr; err = 1; goto ret; } if (( #ifndef NO_IPV6 p_connect(s, ((family == AF_INET6) ? (struct sockaddr *) &a6 : (struct sockaddr *) &a), (sock->error = winsock_error_string(err); gotosock->writable = 1; } add234(sktree, sock); err = 0; ret: if (err) plug_log(sock->plug, 1, sock->addr, sock->port, sock->error, err); return errActual_Socket ret; DWORD err ret->oobinline = oobinline; ret->nodelay = nodelay; ret->keepalive = keepalive; ret->privport = privport; ret->port = port; ret->addr = addr; ret->s = INVALID_SOCKET; err = 0; do { err = try_connect(ret); } while (err && sk_nextaddr(ret->addr) ret->addrif (s->addr) sk_addr_free(s->addrif (s->addr) { plug_log(s->plug, 1, s->addr, s->port, winsock_error_string(err), err); while (s->addr && sk_nextaddr(s->addr)) { err = try_connect(s); } } if (err != 0) return plug_closing(s->plug, winsock_error_string(err), err, 0); else return 1/* * Once a socket is connected, we can stop falling * back through the candidate addresses to connect * to. */ if (s->addr) { sk_addr_free(s->addr); s->addr = NULL; } Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 118e01d3a026fb895fc8e0489bb4071b Text-delta-base-sha1: 12d8d53e3ab8051285f51a718ef48e1bef76722a Text-content-length: 213 Text-content-md5: 22c82642a67e2c929e06fc48a71c3344 Text-content-sha1: 6fbf603504f54bccad1884b4f5153bc39f499e5f Content-length: 213 SVNS73 <void x11_log(Plug p, int type, SockAddr addr, int port, const char *error_msg, int error_code) { /* We have no interface to the logging module here, so we drop these. */log, Node-path: putty-wishlist/data/multiple-addresses Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 796e4a8af2e05bcea547784088e1d395 Text-delta-base-sha1: ec8b3a5e773dcc90e22220eca23d821ac42f90b9 Text-content-length: 405 Text-content-md5: 8731375a719e6f8bbf9ea2bb03747035 Text-content-sha1: 7f031212573529c0de00a87ba5e7913fceac71ca Content-length: 405 SVNts ~j ijFixed-in: 2005-01-17 SGT, 2005-01-16: This is much more important in an IPv6-supporting world, since there's the possibility that your DNS lookup will return you an IPv6 and an IPv4 address in that order, and if you can't route to the former then you must fall back to the latter or else the introduction of IPv6 support has made matters worse for you. Hence, done. Revision-number: 5120 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 55 Mac SC compiler whinges about trailing commas in enums K 10 svn:author V 4 owen K 8 svn:date V 27 2005-01-16T14:33:43.370152Z PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0fa47f30650a7f437e08dc3a293b6282 Text-delta-base-sha1: 07c066c4fb75c6bef05652c154cd3f4057b7069b Text-content-length: 35 Text-content-md5: 8e2f54e920e1b6b560aa79b64cecb8d7 Text-content-sha1: 1df61b6367691c34f2668353d9700a14897fe0e6 Content-length: 35 SVN.+M'N@vw7 Revision-number: 5121 Prop-content-length: 352 Content-length: 352 K 8 svn:date V 27 2005-01-16T14:43:12.266408Z K 7 svn:log V 253 Be a little less enthusiastic about sending SSH_MSG_CHANNEL_WINDOW_ADJUST: only send it when it will significantly increase the server's idea of our window. This avoids the slew of one-byte WINDOW_ADJUSTs that an interactive shell typically generates. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d498cc900c62fad51ca7f6e9117b847 Text-delta-base-sha1: 97a99e870ae70a2a7e0498e5c918831d2e053bb0 Text-content-length: 703 Text-content-md5: c60d8f0b75d50e0355394d5da8c2d6c5 Text-content-sha1: 2f7cf25ef6fa603f1c827d6162c9ac8999581cd9 Content-length: 703 SVNN@Nr^/* * Only send a WINDOW_ADJUST if there's significantly more window * available than the other end thinks there is. This saves us * sending a WINDOW_ADJUST for every character in a shell session. * * "Significant" is arbitrarily defined as half the window size. */ if (newwin > c->v.v2.locwindow * 2V00Vispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_channel_open; /* * Potentially enable X11 forwarding. */ if (ssh->mainchan && ssh->cfg.x11_forward) { char proto[20], data[64]; logevent("Requesting X11 forwarding"); ssh->x11auth = x11_invent_auth(proto, sizeof(proto), data, si Revision-number: 5122 Prop-content-length: 275 Content-length: 275 K 8 svn:date V 27 2005-01-17T00:50:35.164996Z K 7 svn:log V 176 In SSH2, rather than sending an SSH_MSG_IGNORE after every password, just pad the packet out to 256 bytes. Much simpler. This leavs ssh2_pkt_defer() unused, so ifdef it out. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c60d8f0b75d50e0355394d5da8c2d6c5 Text-delta-base-sha1: 2f7cf25ef6fa603f1c827d6162c9ac8999581cd9 Text-content-length: 1864 Text-content-md5: 82efe287172b8544b207bfa019f58a53 Text-content-sha1: bb0e5cc7016271409c33ec6089f75da8c13450a4 Content-length: 1864 SVN4y$jgY6b<Can#+long forcepad; /* Force padding to at least this length */pkt->forcepad = 0 If pkt->forcepad is set, make sure the packet is at least that size * after paddingif (pkt->length + padding < pkt->forcepad) padding = pkt->forcepad - pkt->length; padding += (cipherblk - (pkt->length + padding) % cipherblk) % cipherblk; assert(padding <= 255)#if 0 /* disused */#endif+EEb<&[ |"^ o /* * The server has _both_ * BUG_CHOKES_ON_SSH1_IGNORE and * BUG_NEEDS_SSH1_PLAIN_PASSWORD. There is * therefore nothing we can do. */ int len; len = strlen(s->password); logevent("Sending unpadded password"); send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD, PKT_Ipad out the password packet to 256 bytes to make * it harder for an attacker to find the length of the * user's password. * * Anyone using a password longer than 256 bytes *->pktout->forcepad = 256send(ssh, s->pktoutispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_channel_open; /* * Potentially enable X11 forwarding. */ if (ssh->mainchan && s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(s->pktout, "x11-req"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_addbool(s->pktout, 0); /* many connections */ ssh2_pkt_addstring(s->pktout, proto); ssh2_pkt_addstring(s->pktout, data); ssh2_pkt_adduint32(s->pktout, x11_get_screen_number(ssh->cfg.x11_display)); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Unexpected response to X11 forwarding request:" " packii Revision-number: 5123 Prop-content-length: 188 Content-length: 188 K 7 svn:log V 88 Add details from original report. Based on testing on Win2000, this went away in 0.52. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-17T10:04:59.347508Z PROPS-END Node-path: putty-wishlist/data/null-opaque-resize Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1553ad2476d51e6e9af836859578b26a Text-delta-base-sha1: ca018443839f2743f01acdbd784cf81d980437a6 Text-content-length: 153 Text-content-md5: 078736a71b9b50c0361a92d6f6f9c90a Text-content-sha1: 00b1911b185971c9974eb144b7e9497a3f2e6eb5 Content-length: 153 SVN_c c}bYPresent-in: 2001-03-26 0.51 Fixed-in: 0.52

    Original report: Pine.LNX.4.33.0105081849050.32668-100000@sziami.cs.bme.hu Revision-number: 5124 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2005-01-17T10:07:13.273594Z K 7 svn:log V 69 Change some function arguments to void * to placate picky compilers. K 10 svn:author V 4 owen PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 82efe287172b8544b207bfa019f58a53 Text-delta-base-sha1: bb0e5cc7016271409c33ec6089f75da8c13450a4 Text-content-length: 551 Text-content-md5: af4080f2467084bd4ab9fc94de126661 Text-content-sha1: b28cfa7f621b589d9aa6068a349524b8a5679724 Content-length: 551 SVN F\[2 K5void *vin, int inlen, struct Packet *pktin); static void ssh2_protocol(Ssh ssh, void *vvoid *vvoid *v/* * The server has _both@* ]cQvoid *vin, int inlen, struct Packet *pktin) { unsigned char *in=(unsigned char*)vin;void *vin, int inlen, struct Packet *pktin) { unsigned char *in = (unsigned char *)vin;i8tH:K3`18se to X11 forwardingvoid *vin, int inlen, struct Packet *pktin) { unsigned char *in = (unsigned char *)vin; Revision-number: 5125 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2005-01-17T11:44:20.651473Z K 7 svn:log V 7 Added. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/multi-changesettings-crash Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 349 Text-content-md5: 92052fa298494d09347e51d955963e57 Text-content-sha1: 29ca9c3e9c31f561cbc26710dfc0a06d492477de Content-length: 359 PROPS-END SVNOOOsummary: Multiple Change Settings dialogues cause crash difficulty: fun class: bug priority: medium Content-type: text/plain If you open multiple simultaneous Change Settings dialogue boxes from the same PuTTY session, PuTTY crashes when you close one of them. We should restrict Change Settings so you can only have one at a time! Revision-number: 5126 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:08.667294Z PROPS-END Revision-number: 5127 Prop-content-length: 149 Content-length: 149 K 7 svn:log V 51 This bug never existed -- the server was at fault. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-17T16:03:13.322549Z PROPS-END Node-path: putty-wishlist/data/ssh-window-adjust Node-action: delete Revision-number: 5128 Prop-content-length: 325 Content-length: 325 K 8 svn:date V 27 2005-01-17T16:38:55.421952Z K 7 svn:log V 226 Currentish ssh.com supports single-DES in SSH2 as "des-cbc@ssh.com". It seems to be entirely the same as "des-cbc", so supporting it is trivial and we may as well do so. If nothing else, it makes it clear whose fault it is. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bcec91b1aeca31f4df2e6174fb5f720f Text-delta-base-sha1: 82bfd24b44da84f2e7ac1cf618e7e1932833638f Text-content-length: 146 Text-content-md5: 95fde56de2b3c113649be883edc1f207 Text-content-sha1: d1d18c1f51a61d97598f5f5f3e0f5d15cffcfeba Content-length: 146 SVNqjXYTT.ssh_des_sshcom@ssh.com, &ssh_des_sshcom_ssh2 }; const struct ssh2_ciphers ssh2_des = { sizeof(des Revision-number: 5129 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2005-01-18T09:38:58.647405Z K 7 svn:log V 86 ssh_pkt_getstring wants a boring int rather than an unsigned int. Let's give it one. K 10 svn:author V 4 owen PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: af4080f2467084bd4ab9fc94de126661 Text-delta-base-sha1: b28cfa7f621b589d9aa6068a349524b8a5679724 Text-content-length: 90 Text-content-md5: 3995a20cf531482b534f6e7221ef10cd Text-content-sha1: e5f91dab929b47602e782ebc99b4d8a8f082729a Content-length: 90 SVN>$kse to X11 forwardi8& H|\\ng Revision-number: 5130 Prop-content-length: 304 Content-length: 304 K 8 svn:date V 27 2005-01-18T10:52:30.197995Z K 7 svn:log V 203 Summary: Window redraw problems on Windows Present-in: 0.56 2005-01-13 Summarise the reports we've had of the terminal window not redrawing. Also, I've got the _configuration_ dialog not to redraw now. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-redraw Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1475 Text-content-md5: 77f868e2464031d0ce051ee86e2809e5 Text-content-sha1: 06a94b44361745fdae820c37e490398616a00a72 Content-length: 1485 PROPS-END SVN555Summary: Window redraw problems on Windows Class: bug Difficulty: taxing Priority: medium Present-in: 0.56 2005-01-13

    We get occasional reports of failure to redraw parts of the PuTTY terminal window, typically when another window is opaquely dragged over the PuTTY window, leaving white areas on the window which can usually be filled in by dragging another window over the PuTTY window again. Two of us have managed to reproduce this ourselves with vigorous window-waving.

    This could be a PuTTY bug or a Windows bug. We're assured that this probably isn't a function of the video card driver (which isn't responsible for calculating what to redraw, just for doing what it's told), but it may be a function of the Windows version (all reports so far are on NT-series OSs, and my (JTN) attempts to reproduce on 98SE didn't show anything).

    Reports:

    • 0.56, WinXP SP2, nVidia card
      8E5ACAE05E6B9E44A2903C693A5D4E8A04C48633@hqemmail02.nvidia.com
    • 0.56?, WinXP pre-SP2, Matrox Millennium G550 (OSD)
      831xebsg1z.fsf@chiark.greenend.org.uk
    • 2005-01-13, Win2K SP4, ATI RAGE 128 PRO II (JTN), 1.4GHz
      (I can also trigger partial redraw failures on the configuration dialog by the same method! -- the background becomes green, bizarrely. Also 0.56.)
      20050117101008.GI7859@chiark.greenend.org.uk
    Revision-number: 5131 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 Add some speculation as to possible cause. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-18T10:54:12.298413Z PROPS-END Node-path: putty-wishlist/data/win-redraw Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 77f868e2464031d0ce051ee86e2809e5 Text-delta-base-sha1: 06a94b44361745fdae820c37e490398616a00a72 Text-content-length: 243 Text-content-md5: 1038ea332dfb78643ac035b7a92049a4 Text-content-sha1: 77db2fbe9f5f2cb374b0b6bcc3bf8c7599174626 Content-length: 243 SVN5 [V[eP(I (JTN) have a vague recollection about some misgivings and our return value from window/dialog functions, or similar, compared to the docs on MSDN, although this was years ago. I wonder if that could be causing this?) Revision-number: 5132 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2005-01-18T10:58:38.236014Z K 7 svn:log V 34 Note negative result with Notepad K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-redraw Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1038ea332dfb78643ac035b7a92049a4 Text-delta-base-sha1: 77db2fbe9f5f2cb374b0b6bcc3bf8c7599174626 Text-content-length: 144 Text-content-md5: aef6587fa3b84639fbaccae975e2e2a4 Text-content-sha1: 1e41f258e5f6466f682e9e9cde8145e4eecef008 Content-length: 144 SVN zaz:\Quite reproducible. Unable to get Notepad to exhibit the same behaviour on similar timescales, so it seems PuTTY-specific. Revision-number: 5133 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2005-01-18T17:33:46.249549Z K 7 svn:log V 20 RJK suggested this. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/unix-persistent-bell Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1205 Text-content-md5: 384fcde986cbb9c9868bc891f6240753 Text-content-sha1: 3d9b1546568f3a801fee51c17ef93de13d088e3c Content-length: 1215 PROPS-END SVN'''Summary: Persistent bell indication on Unix Class: wish Priority: low Content-type: text/x-html-body

    Windows PuTTY has options in the Bell configuration panel to arrange that when a window beeps, a persistent indication appears (the taskbar entry and the window title change colour). So if you have lots of PuTTYs open at the same time and one of them beeps while you're not looking, then when you come back you can see at a glance which one it was.

    There is no analogous feature in the Unix port. One would be nice.

    It's difficult to do this on Unix as well as it's done on Windows, because there is no facility in X to flash windows' title bars or (the equivalent of) taskbar entries, because both of those are managed by the window manager and no standardised mechanism is defined to ask the WM to do this sort of thing on your behalf.

    On the other hand, it would be relatively easy to apply some sort of visual change to the contents of the window (changing the background colour springs to mind as a reasonably easy option). This wouldn't really be good enough if the window was minimised or in another virtual desktop, but it would be better than nothing. Revision-number: 5134 Prop-content-length: 183 Content-length: 183 K 7 svn:log V 84 The terminal reengineering of r4609 left an unused `start' lying around. Remove it. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-01-18T19:04:59.583357Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a48a9a7faae8ec782b184d1ec66ac3c1 Text-delta-base-sha1: f59b2fc91fdc8fe83b111a333c665813c568308b Text-content-length: 175 Text-content-md5: e1f7bdb269e3a2071933b0e2bad6a59f Text-content-sha1: 4c16c9fbe53c22cf6a127f87b20a4517ceb26b58 Content-length: 175 SVN&l,AJ6%Ui], j, term->disptext[i+distance], j, term->disptext[i1 || term->esc_args[0] >= 24)) {kk$ Revision-number: 5135 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 33 Yes we do mean assignment. Bah. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-01-18T19:09:02.482878Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3995a20cf531482b534f6e7221ef10cd Text-delta-base-sha1: e5f91dab929b47602e782ebc99b4d8a8f082729a Text-content-length: 97 Text-content-md5: 161a6290cd747a6c8b138203ad28f4cf Text-content-sha1: dc11e90e3767cf469992b0ccd8da0b1c79f86abb Content-length: 97 SVN I1(q = q + 4 + GET_32BIT(p+q))!= 0&,&rwardi Revision-number: 5136 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2005-01-18T22:01:25.489315Z K 7 svn:log V 49 Bits and pieces, mostly stubs, for the Mac port. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bf4f3412f94e1511d6b1152afbfa1307 Text-delta-base-sha1: 91289291f539228f8b350c3f492034bf8bb7136c Text-content-length: 92 Text-content-md5: 031b814e69cdde02934923b534fc0377 Text-content-sha1: 8013dcc09ea144137379eec929e38c1f6ce59e96 Content-length: 92 SVNJ DD? void notify_remote_exit(void *fe) { /* XXX anything needed here? */ Node-path: putty/mac/macmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 42d4238cafaf365ebacb64e4f342c1d2 Text-delta-base-sha1: 7e0c9e01ed52e95401995b89b6eed4dc1cf8f818 Text-content-length: 552 Text-content-md5: 81d2568d03f61dcde700e2c91742766b Text-content-sha1: 83e44867373e350bc7fdd0fefd7c3e528372d917 Content-length: 552 SVN| +4 AZ/* $Idstruct tm ltime(void) { struct tm tm; DateTimeRec d; GetTime(&d); tm.tm_sec=d.second; tm.tm_min=d.minute; tm.tm_hour=d.hour; tm.tm_mday=d.day; tm.tm_mon=d.month; tm.tm_year=d.year; tm.tm_wday=d.dayOfWeek; tm.tm_yday=1; /* GetTime doesn't tell us */ tm.tm_isdst=0; /* Have to do DST ourselves */ /* XXX find out DST adjustment and add it */ return tm; } const char platform_x11_best_transport[] = "localhost"; char *platform_get_x_display(void) { return NULL Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 90f6939093635077380c71d4c3fb1be4 Text-delta-base-sha1: a5408bd1f97f1eeb5b1487c16e73684b26fa0c91 Text-content-length: 117 Text-content-md5: aeba2a92aadbf576405421594bfb1682 Text-content-sha1: e24aa929ac2e595e29cbe46753d85634d3515f32 Content-length: 117 SVN4 ava?uSockAddr platform_get_x11_unix_address(int displaynum, char **canonicalname) { return NULL; } Node-path: putty/mac/macnoise.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b7325717571b525071fe406892955c93 Text-delta-base-sha1: 212ad2cbb66435303fedb29b0c954d9703db00b4 Text-content-length: 157 Text-content-md5: a1eae79997a621836869b73e9d6294c5 Text-content-sha1: 3f06b3aa401e21e264de7550a2b43119d58e3a5e Content-length: 157 SVN[ N2)a timer, and grabs as much changeable * system data as it can quickly get its hands on. */ void noise_regular(void) { /* XXX */ Revision-number: 5137 Prop-content-length: 226 Content-length: 226 K 8 svn:date V 27 2005-01-19T10:07:58.903640Z K 7 svn:log V 125 Add a lengthy comment warning future front-end implementors about the right and wrong way to implement the timing interface. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eefa772a00826bdcd8348e351fba896c Text-delta-base-sha1: 338f0d9761512870ac5b5d3f231d5be7fe070689 Text-content-length: 2979 Text-content-md5: e9551635b1e77f70a787be3b92426790 Text-content-sha1: 7ddac9939baa64a8f97b98779935b0868f9ce7db Content-length: 2979 SVNS]mij * *** FRONT END IMPLEMENTORS NOTE: * * There's an important subtlety in the front-end implementation of * the timer interface. When a front end is given a `next' value, * either returned from run_timers() or via timer_change_notify(), * it should ensure that it really passes _that value_ as the `now' * parameter to its next run_timers call. It should _not_ simply * call GETTICKCOUNT() to get the `now' parameter when invoking * run_timers(). * * The reason for this is that an OS's system clock might not agree * exactly with the timing mechanisms it supplies to wait for a * given interval. I'll illustrate this by the simple example of * Unix Plink, which uses timeouts to select() in a way which for * these purposes can simply be considered to be a wait() function. * Suppose, for the sake of argument, that this wait() function * tends to return early by 1%. Then a possible sequence of actions * is: * * - run_timers() tells the front end that the next timer firing * is 10000ms from now. * - Front end calls wait(10000ms), but according to * GETTICKCOUNT() it has only waited for 9900ms. * - Front end calls run_timers() again, passing time T-100ms as * `now'. * - run_timers() does nothing, and says the next timer firing is * still 100ms from now. * - Front end calls wait(100ms), which only waits for 99ms. * - Front end calls run_timers() yet again, passing time T-1ms. * - run_timers() says there's still 1ms to wait. * - Front end calls wait(1ms). * * If you're _lucky_ at this point, wait(1ms) will actually wait * for 1ms and you'll only have woken the program up three times. * If you're unlucky, wait(1ms) might do nothing at all due to * being below some minimum threshold, and you might find your * program spends the whole of the last millisecond tight-looping * between wait() and run_timers(). * * Instead, what you should do is to _save_ the precise `next' * value provided by run_timers() or via timer_change_notify(), and * use that precise value as the input to the next run_timers() * call. So: * * - run_timers() tells the front end that the next timer firing * is at time T, 10000ms from now. * - Front end calls wait(10000ms). * - Front end then immediately calls run_timers() and passes it * time T, without stopping to check GETTICKCOUNT() at all. * * This guarantees that the program wakes up only as many times as * there are actual timer actions to be taken, and that the timing * mechanism will never send it into a tight loop. * * (It does also mean that the timer action in the above example * will occur 100ms early, but this is not generally critical. And * the hypothetical 1% error in wait() will be partially corrected * for anyway when, _after_ run_timers() returns, you call * GETTICKCOUNT() and compare the result with the returned `next' * value to find out how long you have to make your next wait().) Revision-number: 5138 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2005-01-19T11:51:00.983411Z K 7 svn:log V 21 Mention DataFreeway. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c2ed298aa8caca85b8cd3c34f7654e0b Text-delta-base-sha1: a94212ff03409a3a37d37e0ed0b29b90818aa671 Text-content-length: 191 Text-content-md5: 59a9e489793ab643e34912f9f693fcc0 Text-content-sha1: a4c7487282c46f1a903c4ebd83dae368daea770f Content-length: 191 SVN7 '('h&li> DataFreeway, uses PuTTY to provide a Microsoft Explorer interface to SSH/SFTP (no source) Revision-number: 5139 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2005-01-19T11:53:15.761947Z K 7 svn:log V 75 Possible workaround for SSH2 CBC weakness. Not sure if we want to bother. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-cbc-weakness Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 910 Text-content-md5: c5c3c3b1c674ddd5fb3cc36c0e69c5d7 Text-content-sha1: 9cdee3ca23ddf5a30021057189ca298bc3055b91 Content-length: 920 PROPS-END SVNSummary: SSH2 CBC weaknesses can be worked around Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body Present-in: 2005-01-17

    Bellare et al describe a weakness in the use of CBC-mode ciphers in SSH2. Section 9.2.1 of the current secsh-architecture draft suggests emitting an SSH_MSG_IGNORE before each real packet, which I think converts Bellare et al's SSH-IPC into SSH-NPC. Bellare et al suggest that that has a weakness too, and we should pad each real packet with at least one cipher block of random data, which would give us something equivalent to SSH-$NPC.

    Implementing this in PuTTY would be fairly easy, and would give us decent security until CTR modes are standardised. It would, though, add something like 32 bytes of overhead to each SSH packet in CBC mode. Revision-number: 5140 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2005-01-19T11:56:41.900742Z K 7 svn:log V 40 Note that I see this in other apps too. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-redraw Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aef6587fa3b84639fbaccae975e2e2a4 Text-delta-base-sha1: 1e41f258e5f6466f682e9e9cde8145e4eecef008 Text-content-length: 585 Text-content-md5: 1a55150c6482e11dc7b487b786607578 Text-content-sha1: aa19a8545c3c393c408d06dbf3710003886c09de Content-length: 585 SVN=*32-:FBSSummary: Window redraw problems on Windows Class: semi-Currently this looks like a Windows bug. I (JTN) can reproduce it with apps other than PuTTY (for instance, in WordPad's menu bar). We're assured that this probably isn't a function of the video card driver (which isn't responsible for calculating what to redraw, just for doing what it's told), but it may be a function of the Windows version (all reports so far are on NT-series OSs, and my (JTN) attempts to reproduce on 98SE Can also reproduce with WordPad menu bar, so probably not our problem. Revision-number: 5141 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2005-01-19T12:01:31.293524Z K 7 svn:log V 38 ...and Owen sees it with WordPad too. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-redraw Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1a55150c6482e11dc7b487b786607578 Text-delta-base-sha1: aa19a8545c3c393c408d06dbf3710003886c09de Text-content-length: 36 Text-content-md5: 158ea7809608d6fe50d3ae6b9c6ac947 Text-content-sha1: e18201b182b636aed414c31b35cec9f9f0587800 Content-length: 36 SVN=F $We (JTN and OSD Revision-number: 5142 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2005-01-19T12:34:52.449249Z K 7 svn:log V 116 Make the outgoing SSH2 sequence number unsigned, so as to avoid depending on overflow behaviour of signed integers. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 161a6290cd747a6c8b138203ad28f4cf Text-delta-base-sha1: dc11e90e3767cf469992b0ccd8da0b1c79f86abb Text-content-length: 93 Text-content-md5: 0a4328859c4918125df55074e02ccc0e Text-content-sha1: d14996c5d3b7b5ad21cff0bbf32b34299cfe66fb Content-length: 93 SVN ^unsigned long v has _both,6 , to X11 fo Revision-number: 5143 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2005-01-19T16:32:44.437534Z K 7 svn:log V 46 Better reference for the Bellare et al paper. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-cbc-weakness Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5c3c3b1c674ddd5fb3cc36c0e69c5d7 Text-delta-base-sha1: 9cdee3ca23ddf5a30021057189ca298bc3055b91 Text-content-length: 54 Text-content-md5: a4af9a3c9717e421c11f917be9674e8d Text-content-sha1: 59ad326c22d5d8d139aa25ecd7249a3397725a5a Content-length: 54 SVNp !)&Zdoi.acm.org/10.1145/996943.996945 Revision-number: 5144 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2005-01-19T17:21:09.868983Z K 7 svn:log V 45 Thoughts on SSH2 sequence-number wraparound. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-sequence-wrap Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 734 Text-content-md5: bd1204fbf5b7581c54922e8b78b0ccf0 Text-content-sha1: 4a8a86e5ec3b63dd24abf5cb5ff55a8b7cc7bcea Content-length: 744 PROPS-END SVNPPPSummary: SSH2 replay attacks should be avoided Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body Present-in: 2005-01-17

    Bellare et al note that if the sequence number for SSH2 MACs repeats itself without an intervening rekey, all sorts of attacks become possible. If PuTTY were particularly paranoid, it could force a re-key before this happens, and even kill the connection if the sequence number did wrap around. More polite would probably be a note in the documentation that turning off traffic-based re-keying is a very bad idea and to accept the worse-than-it-could-be security of connections to servers that can't re-key. Revision-number: 5145 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2005-01-19T17:41:21.512706Z K 7 svn:log V 64 While we're here, pad USERAUTH_INFO_RESPONSEs to 256 bytes too. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0a4328859c4918125df55074e02ccc0e Text-delta-base-sha1: d14996c5d3b7b5ad21cff0bbf32b34299cfe66fb Text-content-length: 115 Text-content-md5: a4a32a7f78959c548b01ff3813a9b589 Text-content-sha1: 46c4735db510af770ae8eabe6f734d8275b2d1b4 Content-length: 115 SVN H ?->pktout->forcepad = 2566W!6{ bombout(("Unexpected response Revision-number: 5146 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2005-01-19T23:30:38.394485Z K 7 svn:log V 115 Add an assertion so that short-rsa2-key-crash at least avoids segfaulting while we come up with a better solution. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 743b29baa7b366d1980c08e3dd529d89 Text-delta-base-sha1: a7263a453ed7274fcde8c67d9e187fc628324366 Text-content-length: 60 Text-content-md5: 35b7c51cbac461abef44762c33980c89 Text-content-sha1: e441c8787d621fe517f32be784b892e89e4c8998 Content-length: 60 SVN 2 #@O:assert(1 <= nbytes - 20 - ASN1_LEN) Revision-number: 5147 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2005-01-20T11:08:41.343065Z K 7 svn:log V 13 Content-Type K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-redraw Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 158ea7809608d6fe50d3ae6b9c6ac947 Text-delta-base-sha1: e18201b182b636aed414c31b35cec9f9f0587800 Text-content-length: 49 Text-content-md5: 8248779967a1adbf925f1402c04addb7 Text-content-sha1: 0c63cbc5fa03448b10d167d986e36f343844998a Content-length: 49 SVNFe{LzContent-type: text/x-html-body Revision-number: 5148 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2005-01-20T11:11:01.835618Z K 7 svn:log V 16 Add Difficulty: K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-persistent-bell Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 384fcde986cbb9c9868bc891f6240753 Text-delta-base-sha1: 3d9b1546568f3a801fee51c17ef93de13d088e3c Text-content-length: 91 Text-content-md5: 73442983367f0f6c58bd61db72100365 Text-content-sha1: 67355583eacaa6ab7477e74cca2c25529f1c8abd Content-length: 91 SVN':JJp7Summary: Persistent bell indication on Unix Class: wish Difficulty: tricky Revision-number: 5149 Prop-content-length: 179 Content-length: 179 K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-20T13:40:14.117096Z K 7 svn:log V 81 PSFTP supports restarting recursive transfers now, so it can't be all that hard. PROPS-END Node-path: putty-wishlist/data/pscp-restart Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c3666bcde010219f1cc10579772f641 Text-delta-base-sha1: 392f860331593f96fdba83a2952263cb024b4178 Text-content-length: 109 Text-content-md5: 47d87cc5bf954fd78c69a76c91c3101b Text-content-sha1: c787acbebb7c7c2a3f43c66209f5bf084ac74039 Content-length: 109 SVN47 W6W* and restarting recursive transfers (reget -r) is already supported by PSFTP. T Revision-number: 5150 Prop-content-length: 159 Content-length: 159 K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-20T13:41:25.475959Z K 7 svn:log V 61 Summary: PSFTP should have restartable multi-file transfers. PROPS-END Node-path: putty-wishlist/data/psftp-remget Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 473 Text-content-md5: 2091c9b0eb04d81ec4ebe7f0e783669a Text-content-sha1: 5a81f4d8936c09151cac1e11c23519c29162331f Content-length: 483 PROPS-END SVNKKKSummary: Restart multiple-file operations in PSFTP Class: wish Priority: low Difficulty: tricky Content-type: text/plain While PSFTP supports "reget" to restart a download, and "mget" to download multiple files, it doesn't have a "remget" to restart the download of multiple files. The same applies to "reput" and "mput". The general case of restarting a multiple-file {up,down}load is already handled by "re{get,put} -r", so that shouldn't be a problem. Revision-number: 5151 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2005-01-20T13:56:06.469602Z K 7 svn:log V 32 Some thoughts and an assertion. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/short-rsa2-key-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cac4c631ad991b317ec6aa0a26df1927 Text-delta-base-sha1: 647406da4a80e5e2f127a70e8d0d90c9734998fd Text-content-length: 294 Text-content-md5: 0c8e5d129ad9e3150f621f5659dbb7a3 Text-content-sha1: 3e5dca5ea3852904a19554800dd7b94d07360273 Content-length: 294 SVNCVC BJH21: I've added an assert() to the code so that the explosion when trying to use a too-short key is more controlled. It occurs to me that PuTTYgen really should warn (and maybe fail) when asked to generate an ssh-rsa key that can't possibly be used. Revision-number: 5152 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:11.444051Z PROPS-END Revision-number: 5153 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:11.455337Z PROPS-END Revision-number: 5154 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2005-01-20T16:42:25.622808Z K 7 svn:log V 35 Fix/bludgeon Mac compile wrinkles. K 10 svn:author V 4 owen PROPS-END Node-path: putty/cproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2878ac380d6a5c7080df8cd3637cb210 Text-delta-base-sha1: 8a449ecc1b9da22f4fc00a8b63d57fa537ec902f Text-content-length: 29 Text-content-md5: f82427f479916df00fd6626850f7c9e6 Text-content-sha1: 1a9ba2fd99c911ca5e5dc40ed0cc7e66648bda09 Content-length: 29 SVNy G2G(char *) Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 22c82642a67e2c929e06fc48a71c3344 Text-delta-base-sha1: 6fbf603504f54bccad1884b4f5153bc39f499e5f Text-content-length: 56 Text-content-md5: 044fb87d3c92840db93352082d2d8747 Text-content-sha1: 5c6649911ae304b93a461904b4e2d4b3cef8019d Content-length: 56 SVN #:@[(ret = platform_get_x_display())==0 Revision-number: 5155 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2005-01-20T21:22:02.606032Z K 7 svn:log V 65 Summary: Remote channel numbers of 0xffffffff will confuse PuTTY K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh-remoteid-minusone Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 665 Text-content-md5: 50cb59b4230360258e1f2fc9fd758741 Text-content-sha1: 574bb7ff4f9efbef9d08dcfe12fb4845ca17ba5d Content-length: 675 PROPS-END SVN  Summary: Remote channel numbers of 0xffffffff will confuse PuTTY Class: bug Difficulty: fun Priority: medium Present-in: 2005-01-19 Content-type: text/plain Within ssh.c, PuTTY uses a server channel number of (unsigned)(-1) to represent a channel that doesn't have a server channel number assigned yet. Neither SSH1 nor SSH2, though, places any restriction on the use of 0xffffffff as a channel number, which is what (unsigned)(-1) will be on a 32-bit system. If a server using 0xffffffff as a channel number, PuTTY will not believe that the channel is properly open, and will, for instance, die with a fatal error if the server tries to close it. Revision-number: 5156 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 60 Dispose of a variable whose only use was being set to zero. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-20T21:45:42.661216Z PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 022a7b963e1d00ba10c77a6af9dada21 Text-delta-base-sha1: 498295ccd194a5cf2b359cbb4e9900b27fd78543 Text-content-length: 30 Text-content-md5: 959a394cde7499472524fc35f22cad2e Text-content-sha1: abadcc41303372d480bab8f8c880be0987d7db35 Content-length: 30 SVN@%/<fZ Revision-number: 5157 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2005-01-20T23:45:24.872343Z K 7 svn:log V 53 Summary: SSH2 message strings etc should be in UTF-8 K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-utf8-strings Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 642 Text-content-md5: 60c4d9e06e996259157bc310b5904b62 Text-content-sha1: b0d5aa760f82470c86c9b64ff8279c1a938dfd50 Content-length: 652 PROPS-END SVNtttSummary: SSH2 message strings etc should be in UTF-8 Class: bug Difficulty: tricky Present-in: 2005-01-19 Content-type: text/plain All of the human-readable and human-supplied strings in SSH2, including user names, passwords, banners, and error messages, are specified to be encoded in UTF-8. PuTTY currently ignores this and uses whatever character-set the terminal happens to be configured to use instead. Fixing this is relatively easy in PuTTY, where it's possible for the SSH code to poke around in the terminal's state. It's not so easy for plink and PSFTP, which will need to gain an understanding of character sets. Revision-number: 5158 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2005-01-20T23:48:39.114954Z K 7 svn:log V 16 Add a priority. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-utf8-strings Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60c4d9e06e996259157bc310b5904b62 Text-delta-base-sha1: b0d5aa760f82470c86c9b64ff8279c1a938dfd50 Text-content-length: 33 Text-content-md5: 17f175035482c8080da9c53cd90dfc3a Text-content-sha1: 3f09246b0f0c9a3a8bf6d26c29ac4ba73367e2a2 Content-length: 33 SVNtU"Riority: medium Revision-number: 5159 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2005-01-20T23:52:01.133459Z K 7 svn:log V 47 Add present-in reflecting the original report. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/drop-banner Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b054fd32fd07cd322f28b6c2955d9559 Text-delta-base-sha1: 68716eca0f2247704aca2500754eb1340aeb0501 Text-content-length: 36 Text-content-md5: afa6e7715eded428f45d125a3988b42e Text-content-sha1: 3471d7a7db0d7b18c1dec1764c17bc26a1557b58 Content-length: 36 SVNgyi~Present-in: 0.53b Revision-number: 5160 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2005-01-21T00:02:59.871052Z K 7 svn:log V 107 Colours now work properly, including 256-colour stuff. Timing stuff now there, but almost certainly bogus. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 031b814e69cdde02934923b534fc0377 Text-delta-base-sha1: 8013dcc09ea144137379eec929e38c1f6ce59e96 Text-content-length: 600 Text-content-md5: da4b379a202f74db116f605a8b0e606c Text-content-sha1: eb4c9388ae0d3e3a38ebea02feeffad6d76235b4 Content-length: 600 SVN1232-AkZY/bstatic long timing_next_void timer_change_notify(long next) { timing_next_time = next long next; long ticksleft; cursrgn = NewRgn(); sleeptime = 0; for (;;) { mac_adjustcursor(cursrgn); ticksleft=timing_next_time-GETTICKCOUNT(); if (sleeptime > ticksleft && ticksleft >=0) sleeptime=ticksleft; gotevent = WaitNextEvent(everyEvent, &event, sleeptime, cursrgn); if (timing_next_time <= GETTICKCOUNT()) { if (run_timers(timing_next_time, &next)) { timer_change_notify(next); } } Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8167283a011668e2de1db48e91f92db4 Text-delta-base-sha1: e11ca022a77e35f3b2afd80f1b0aa6a7fa4f5ee6 Text-content-length: 1109 Text-content-md5: 1ff5a3c7f4f7bdcd71180c84a05299f3 Text-content-sha1: 3ec875ab63a327ffa8a1e75296bc3abe89c6e004 Content-length: 1109 SVN@pA$Ve>owKr|{rH~yDEFAULT_FG 256 #define DEFAULT_FG_BOLD 257 #define DEFAULT_BG 258 #define DEFAULT_BG_BOLD 259 #define CURSOR_FG 260 #define CURSOR_BG 266bgcolour = ((a->attr & ATTR_BGMASK) >> ATTR_BGSHIFTif (fgcolour < 16) fgcolour |=8; else if (fgcolour >= 256) fgcolour |=wchar_t if (!HAVE_COLOR_QD()) return; real_palette_set(s, n, r, g, b); if (n == DEFAULT_BG) mac_adjustwinbg(s); 256, 257, 258, 259, 260, 261, 0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 }; int i; if (!HAVE_COLOR_QD()) return; for (i = 0; i < 22; i++) { int w = ww[i]; real_palette_set(s,w, s->cfg.colours[i][0], s->cfg.colours[i][1], s->cfg.colours[i][2]); } for (i = 0; i < 240; i++) { if (i < 216) { int r = i / 36, g = (i / 6) % 6, b = i % 6; real_palette_set(s,i+16, r * 0x33, g * 0x33, b * 0x33); } else { int shade = i - 216; shade = (shade + 1) * 0xFF / (240 - 216 + 1); real_palette_set(s,i+16,shade,shade,shade); } } Revision-number: 5161 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:11.992244Z PROPS-END Revision-number: 5162 Prop-content-length: 316 Content-length: 316 K 7 svn:log V 217 Probable support for first_kex_packet_follows in KEXINIT. Not significantly tested since none of the common key-exchange protocols starts with a packet from the server, so I don't have a server that implements this. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-22T13:32:41.315039Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a4a32a7f78959c548b01ff3813a9b589 Text-delta-base-sha1: 46c4735db510af770ae8eabe6f734d8275b2d1b4 Text-content-length: 2061 Text-content-md5: b88bf621965040092fe31dda439a30a8 Text-content-sha1: c2eaf8f691af499ae9eefca88994dd552c6aa707 Content-length: 2061 SVN8b\]FYUS(zh:T] N|imilar routine for checking whether we have the first string in a list. */ static int first_/* * Is it at the start of the string? */ if (haylen >= needlen && /* haystack is long enough */ !memcmp(needle, haystack, needlen) && /* initial match */ (haylen == needlen || haystack[needlen] == ',') /* either , or EOS follows */ ) return 1; return 0; } , guessok/* * Note that the server's guess is considered wrong if it doesn't match * the first algorithm in our list, even if it's still the algorithm * we end up using. */ guessok = first_in_commasep_string(s->preferred_kex[0]->name, str, len);guessok = guessok && first_in_commasep_string(hostkey_algs[0]->name, str, len); ssh_pkt_getstring(pktin, &str, &len); /* client->server language */ ssh_pkt_getstring(pktin, &str, &len); /* server->client language */ if (ssh2_pkt_getbool(pktin) && !guessok) /* first_kex_packet_follows */ crWaitUntil(pktin); /* Ignore packet */W /ook=@5]2R ssh2_msg_channel_open_confirmation; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_channel_open_failure; ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = ssh2_msg_channel_request; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_channel_open; /* * Potentially enable X11 forwarding. */ if (ssh->mainchan && ssh->cfg.x11_forward) { char proto[20], data[64]; logevent("Requesting X11 forwarding"); ssh->x11auth = x11_invent_auth(proto, sizeof(proto), data, sizeof(data), ssh->cfg.x11_auth); x11_get_real_auth(ssh->x11auth, ssh->cfg.x11_display); ssh2_pkt_addstring(s->pktout, "x11-req"); ssh2_pkt_addbool(s->pktout, 1); /* want reply */ ssh2_pkt_addbool(s->pktout, 0); /* many connections */ ssh2_pkt_addstring(s->pktout, proto); ssh2_pkt_addstring(s->pktout, data); ssh2_pkt_adduint32(s->pktout, x11_get_screen_number(ssh->cfg.x11_display));X11 Revision-number: 5163 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2005-01-22T13:34:08.178411Z K 7 svn:log V 40 I think this is fixed by revision 5162. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/kexinit-guess Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1383b25944ec465a73056efc4c9ccd57 Text-delta-base-sha1: ffdcbb46b084d6992d3013e4ece9832827204689 Text-content-length: 41 Text-content-md5: bfffa95cb73862eb28e388361436b903 Text-content-sha1: 7f7620399d91753dcbabad362458fc61b1a9f82d Content-length: 41 SVN  wFixed-in: 2005-01-23 Revision-number: 5164 Prop-content-length: 193 Content-length: 193 K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-22T14:01:01.031556Z K 7 svn:log V 95 Explicitly ignore SCI rather than translating it into DECID. Should fix bug sci-is-not-decid. PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e1f7bdb269e3a2071933b0e2bad6a59f Text-delta-base-sha1: 4c16c9fbe53c22cf6a127f87b20a4517ceb26b58 Text-content-length: 494 Text-content-md5: 42f0b02d6aff40baa67c0f0977c48648 Text-content-sha1: b8fd255681f6b0fcfff149ac1d0947914443bf86 Content-length: 494 SVNM8M{ * How about C1 controls? * Explicitly ignore SCI (0x9a), which we don't translate to DECID. */ if ((c & -32) == 0x80 && term->termstate < DO_CTRLS && !term->vt52_mode && has_compat(VT220)) { if (c == 0x9a) c = 0; else { term->termstate = SEEN_ESC; term->esc_query = FALSE; c = '@' + (c & 0x1F); }k]rrknd reports. */ if (term->esc_nargs <= 1 && (term->esc_args[0] < 1 || term->esc_args[0] >= 24)) { Revision-number: 5165 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2005-01-22T14:01:53.754535Z K 7 svn:log V 24 Fixed in revision 5164. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/sci-is-not-decid Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b8e19d8508a92e36905247747e37d0a Text-delta-base-sha1: fd815e9a3133d519f745023f17091aae4350b673 Text-content-length: 41 Text-content-md5: 3b4ba61ec7120804d9d3cd1369c5df7b Text-content-sha1: 18f1e5a773ff2188aa40d9dc04f20b59a4c2fa87 Content-length: 41 SVN Fixed-in: 2005-01-23 Revision-number: 5166 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2005-01-22T14:51:29.635435Z K 7 svn:log V 132 Owen's just pointed out that random_stir() is capable of recursion. I'm sure I didn't mean that to happen! Added a lock to stop it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrand.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df604fcb3ec5540d28c59eab1bbe5255 Text-delta-base-sha1: 2ffc4c7c7e2fb928369caa161dcedc4a1be4be9b Text-content-length: 274 Text-content-md5: 09c35b144e7c3331f7a9a76fecd7cddb Text-content-sha1: 978d6d3dbe9f30d7d69586b58150b7f86a77b53a Content-length: 274 SVNngn+i);J S int stir_pending/* * noise_get_light will call random_add_noise, which may call * back to here. Prevent recursive stirs. */ if (pool.stir_pending) return; pool.stir_pending = TRUE pool.stir_pending = FALSE Revision-number: 5167 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2005-01-22T15:19:21.777296Z K 7 svn:log V 106 If getaddrinfo() fails, it's not safe to dereference the struct addrinfo* it passes back to us, so don't. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 959a394cde7499472524fc35f22cad2e Text-delta-base-sha1: abadcc41303372d480bab8f8c880be0987d7db35 Text-content-length: 104 Text-content-md5: 0004c594fa8f65127091aa6cc5076c85 Text-content-sha1: 8b8ba9f2799d547369daa22d30deb31f721d17ca Content-length: 104 SVN%6 NNNW if (retcode = 0) { addr = ai->ai_addr; addrlen = ai->ai_addrlen; } Revision-number: 5168 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2005-01-22T15:20:35.385823Z K 7 svn:log V 29 Stupid typo, spotted by GCC. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0004c594fa8f65127091aa6cc5076c85 Text-delta-base-sha1: 8b8ba9f2799d547369daa22d30deb31f721d17ca Text-content-length: 24 Text-content-md5: 7cf09df6337f5544be992fb3691b7465 Text-content-sha1: 8d3095cba6d00469f3f15d26c27822627803dc01 Content-length: 24 SVN67 (' Revision-number: 5169 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:12.539784Z PROPS-END Revision-number: 5170 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2005-01-22T15:32:10.129929Z K 7 svn:log V 126 When calling getaddrinfo() for a listening socket, pass in a suggested type of SOCK_STREAM, since that's what we'll be using. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7cf09df6337f5544be992fb3691b7465 Text-delta-base-sha1: 8d3095cba6d00469f3f15d26c27822627803dc01 Text-content-length: 36 Text-content-md5: a69a114fff9ff157d44991a8c6ca69c3 Text-content-sha1: a1049848ba82a9d9d6890ef2c475eae222e8c172 Content-length: 36 SVN7A SOCK_STREAM Revision-number: 5171 Prop-content-length: 300 Content-length: 300 K 7 svn:log V 201 Don't abuse a remote channel number of (unsigned)(-1) to indicate a channel for which we don't yet have a remote number, and instead add a flag to indicate this fact. Fixes bug ssh-remoteid-minusone. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-22T16:06:21.692906Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b88bf621965040092fe31dda439a30a8 Text-delta-base-sha1: c2eaf8f691af499ae9eefca88994dd552c6aa707 Text-content-length: 722 Text-content-md5: 24af29ab46af34e1b2e929d2c8c2124c Text-content-sha1: 8cefdba31318c46bf3c8716a3432a718bec61abb Content-length: 722 SVNP P& True if we opened this channel but server hasn't confirmed. */ int halfopenW~Xi{pzoiKzw?NNxU=7 t1_DATA, ss, len, PKTT_OTHER, PKT_END); } else { /* * The serverhalfopen is true!c->halfopenhalfopen = FALSEhalfopen = FALSEhalfopen = FALSEhalfopen = FALSE!c->halfopenc->halfopenhalfopen = FALSEc->halfopen = FALSEhalfopen = FALSE ?k[dpnnel_data; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_channel_eof; ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_channel_close; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] =halfopen = TRUE; Revision-number: 5172 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 24 Fixed in revision 5171. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-22T16:18:07.713871Z PROPS-END Node-path: putty-wishlist/data/ssh-remoteid-minusone Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 50cb59b4230360258e1f2fc9fd758741 Text-delta-base-sha1: 574bb7ff4f9efbef9d08dcfe12fb4845ca17ba5d Text-content-length: 41 Text-content-md5: ccdf7d603991b50ea71fa0f17d5aeb4f Text-content-sha1: 38d113d5e766305cd7c1d20d0c3266a86bbedd4d Content-length: 41 SVN Fixed-in: 2005-01-23 Revision-number: 5173 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:12.962813Z PROPS-END Revision-number: 5174 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:12.972482Z PROPS-END Revision-number: 5175 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:12.982650Z PROPS-END Revision-number: 5176 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:12.992778Z PROPS-END Revision-number: 5177 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.002813Z PROPS-END Revision-number: 5178 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.012688Z PROPS-END Revision-number: 5179 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.022434Z PROPS-END Revision-number: 5180 Prop-content-length: 382 Content-length: 382 K 8 svn:date V 27 2005-01-23T14:31:08.479595Z K 7 svn:log V 283 When checking if a connection comes from localhost, don't assume it's an IPv4 connection. Instead, correctly check IPv4 and IPv6 connections, assume that AF_LOCAL is always local, and anything else is always remote. This makes trivial local-to-remote forwarding work on my system. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a69a114fff9ff157d44991a8c6ca69c3 Text-delta-base-sha1: a1049848ba82a9d9d6890ef2c475eae222e8c172 Text-content-length: 850 Text-content-md5: bfcdb35b714a81afb14384efc3e5e623 Text-content-sha1: 545fc27eb2334b4ba42300852c356b17025e47fd Content-length: 850 SVNA1-@+mF{sockaddr_is_loopback(struct sockaddr *sa) { struct sockaddr_in *sin; #ifndef NO_IPV6 struct sockaddr_in6 *sin6; #endif switch (sa->sa_family) { case AF_INET: sin = (struct sockaddr_in *)sa; return ipv4_is_loopback(sin->sin_addr); #ifndef NO_IPV6 case AF_INET6: sin6 = (struct sockaddr_in6 *)sa; return IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr); #endif case AF_LOCAL: return TRUE; default: return FALSE; }#ifdef NO_IPV6 struct sockaddr_in ss; #else struct sockaddr_storage ss; #endif socklen_t addrlen = sizeof(ss); int t; /* socket of connection */ memset(&ss, 0, addrlen); t = accept(s->s, (struct sockaddr *)&ss, &addrlen); if (t < 0) { break; } if (s->localhost_only && !sockaddr_is_loopback((struct sockaddr *)&ss Revision-number: 5181 Prop-content-length: 131 Content-length: 131 K 10 svn:author V 4 owen K 8 svn:date V 27 2005-01-23T15:01:21.168811Z K 7 svn:log V 32 Give the config window a title. PROPS-END Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9563c85ce2cb640419a45a598b1c6da3 Text-delta-base-sha1: 027f7ba4f7db362f3412487c394bdaefb42520df Text-content-length: 148 Text-content-md5: b291e6e2d6616b533d809585ad291d83 Text-content-sha1: f4fb8cf5295ba71c02da5a8a2eb38a8cdd47691a Content-length: 148 SVNt}rIW;<V/ETextUtils Str255 mactitlec2pstrcpy(mactitle, "PuTTY Configuration"); SetWTitle(s->settings_window, mactitle Revision-number: 5182 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.579352Z PROPS-END Revision-number: 5183 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.589774Z PROPS-END Revision-number: 5184 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.600421Z PROPS-END Revision-number: 5185 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.610719Z PROPS-END Revision-number: 5186 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.620822Z PROPS-END Revision-number: 5187 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.630719Z PROPS-END Revision-number: 5188 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.640892Z PROPS-END Revision-number: 5189 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.650958Z PROPS-END Revision-number: 5190 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.660286Z PROPS-END Revision-number: 5191 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.669636Z PROPS-END Revision-number: 5192 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.679130Z PROPS-END Revision-number: 5193 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.706374Z PROPS-END Revision-number: 5194 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.723927Z PROPS-END Revision-number: 5195 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.734510Z PROPS-END Revision-number: 5196 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.744985Z PROPS-END Revision-number: 5197 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.754897Z PROPS-END Revision-number: 5198 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.765075Z PROPS-END Revision-number: 5199 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.775440Z PROPS-END Revision-number: 5200 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2005-01-24T15:43:49.045935Z K 7 svn:log V 40 Add links to relevant X specifications. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 59a9e489793ab643e34912f9f693fcc0 Text-delta-base-sha1: a4c7487282c46f1a903c4ebd83dae368daea770f Text-content-length: 303 Text-content-md5: 1a7e27bbd35e1fa8738424b333ef4cc6 Text-content-sha1: 23cb579b9828f084fd8f5ef012ae8fca73b1fab4 Content-length: 303 SVN7Z + X Window System

    • X Window System Protocol
    • X Display Manager Control Protocol, including the definition of XDM-AUTHORIZATION-1. Revision-number: 5201 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.848601Z PROPS-END Revision-number: 5202 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2005-01-24T15:47:45.811902Z K 7 svn:log V 68 Reference the best documentation I've found for MIT-MAGIC-COOKIE-1. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1a7e27bbd35e1fa8738424b333ef4cc6 Text-delta-base-sha1: 23cb579b9828f084fd8f5ef012ae8fca73b1fab4 Text-content-length: 136 Text-content-md5: 68d6484aaa5d3a381835218404124027 Text-content-sha1: 497fed7bca4a0eca22f7783dca421ed7e71c7a35 Content-length: 136 SVNZQ r1r.,li> Xsecurity(7), which documents MIT-MAGIC-COOKIE Revision-number: 5203 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:13.958262Z PROPS-END Revision-number: 5204 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2005-01-24T17:01:28.878077Z K 7 svn:log V 70 Summary: PuTTY doesn't apply replay protection to XDM-AUTHORIZATION-1 K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/xdmauth-replay Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1038 Text-content-md5: 4444d295162ba09e5725f3a1dde6355e Text-content-sha1: 24cece381454ae289c871c3b3b63ea24dab83278 Content-length: 1048 PROPS-END SVNSummary: PuTTY doesn't apply replay protection to XDM-AUTHORIZATION-1 Class: bug Difficulty: fun Present-in: 2005-01-23 Priority: medium Content-type: text/plain The XDMCP specification says that an X server should only accept an XDM-AUTHORIZATION-1 if no packet containing the same (N, T) pair has been received in the last 20 minutes. This provides replay protection, but PuTTY's X11 proxy doesn't implement it, leaving it potentally open to replay attacks. NB: I (BJH) think that this 20 minutes is incorrect -- used tokens should be remembered until they're so old that they'd be rejected for that reason alone, which could be 40 minutes after they're received allowing for clock skew. As a corollory to this, when using XDM-AUTHORIZATION-1 to talk to a local server, PuTTY should avoid generating the same token more than once, which it can currently do for Unix-domain connections because it doesn't vary the address field. Xlib decrements the address field (starting at 0xffffffff) for each connection it makes. Revision-number: 5205 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:14.005434Z PROPS-END Revision-number: 5206 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:14.016248Z PROPS-END Revision-number: 5207 Prop-content-length: 340 Content-length: 340 K 8 svn:date V 27 2005-01-25T12:49:38.995449Z K 7 svn:log V 241 Tidy up the crypto links section. In particular: Refer to FIPSes as "FIPS PUB nnn" rather than "NIST FIPS nnn", since the former matches their cover pages. Give titles for RFCs and FIPSes and remove descriptive text that duplicates titles. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 68d6484aaa5d3a381835218404124027 Text-delta-base-sha1: 497fed7bca4a0eca22f7783dca421ed7e71c7a35 Text-content-length: 964 Text-content-md5: 8130682e5cb1cfdddc6f53dfe1126de8 Text-content-sha1: 9757f4f2a98306e3a61415d1e1fd164989d62eed Content-length: 964 SVNQ6#J>RP={VFIPS PUB 46-3: Data Encryption Standard (DES) also defines TDEA (3DES)FIPS PUB 197: Advanced Encryption Standard (AES)
    • RFC 1321: The MD5 Message-Digest Algorithm
    • FIPS PUB 180-2: Secure Hash Signature Standard (SHS) defines secure hash functions SHA-1 and SHA-512.
    • RFC 2104: HMAC: Keyed Hashing for Message Authentication definesFIPS PUB 186-2: Digital Signature Standard (DSS) defines the digital signature algorithm DSA.
    • RFC 3447: Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications version 2.1 defines the basic RSA encryption and signature algorithms as well as specific padding schemes to turn them into a set of well Revision-number: 5208 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:14.257240Z PROPS-END Revision-number: 5209 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:14.267001Z PROPS-END Revision-number: 5210 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:14.278169Z PROPS-END Revision-number: 5211 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:14.288934Z PROPS-END Revision-number: 5212 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2005-01-26T18:11:28.318196Z K 7 svn:log V 25 Make a few things static K 10 svn:author V 4 owen PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 24af29ab46af34e1b2e929d2c8c2124c Text-delta-base-sha1: 8cefdba31318c46bf3c8716a3432a718bec61abb Text-content-length: 112 Text-content-md5: cec0c0af4d9b0bccd80bebd0d18c994c Text-content-sha1: 7148de03da214d3df27a59397dd5f73d679965ce Content-length: 112 SVN iistatic ?[)o)(msg_chastatic static static Revision-number: 5213 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2005-01-26T19:04:42.752176Z K 7 svn:log V 49 Add ssh.h for prototypes for the X display stubs K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/macmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 81d2568d03f61dcde700e2c91742766b Text-delta-base-sha1: 83e44867373e350bc7fdd0fefd7c3e528372d917 Text-content-length: 34 Text-content-md5: 30c01c759832bf0f54df52241268430d Text-content-sha1: 3d5085b9e35351c6d7795e9256256ccf7bd20b6a Content-length: 34 SVN| d`#include "ssh Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aeba2a92aadbf576405421594bfb1682 Text-delta-base-sha1: e24aa929ac2e595e29cbe46753d85634d3515f32 Text-content-length: 87 Text-content-md5: 224b3979ec84de37079d35941548a19e Text-content-sha1: 5914d923191f6bc259a862fb103322fe3261df77 Content-length: 87 SVN'FFa5#include "putty.h" #include "network.h" #include "mac.h" #include "ssh Revision-number: 5214 Prop-content-length: 229 Content-length: 229 K 7 svn:log V 129 Move sk_poll() inside (!gotevent), which is more logical but doesn't have any actual beneficial effect on event handling, sadly. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-01-26T19:05:50.755736Z PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da4b379a202f74db116f605a8b0e606c Text-delta-base-sha1: eb4c9388ae0d3e3a38ebea02feeffad6d76235b4 Text-content-length: 53 Text-content-md5: fb61ba15a47183ece643acc545173d84 Text-content-sha1: f30021bd779e3ce010510cfbd40f310b3f7e7ddb Content-length: 53 SVN15 GPaif (!gotevent) sk_poll(); Revision-number: 5215 Prop-content-length: 361 Content-length: 361 K 7 svn:log V 262 Move sockaddr_is_loopback() to before sk_address_is_local(), and define the latter in terms of the former. Also adjust the definition of ipv4_is_loopback() to avoid using the non-standard inet_netof() and IN_LOOPBACKNET, and move it next to its remaining uses. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-26T20:18:33.274204Z PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bfcdb35b714a81afb14384efc3e5e623 Text-delta-base-sha1: 545fc27eb2334b4ba42300852c356b17025e47fd Text-content-length: 189 Text-content-md5: 327eebfce596a223dc97bafce81e7bbd Text-content-sha1: 516e46beef061e34ffdf69de9c4e56996327ec09 Content-length: 189 SVN1t" {@_Q)POb#define ipv4_is_loopback(addr) \ (((addr).s_addr & htonl(0xff000000)) == htonl(0x7f000000))return sockaddr_is_loopback(addr->ai->ai_addr) Revision-number: 5216 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2005-01-26T23:30:34.156497Z K 7 svn:log V 62 Add a Change Settings dialogue box. Doesn't do anything yet. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb61ba15a47183ece643acc545173d84 Text-delta-base-sha1: f30021bd779e3ce010510cfbd40f310b3f7e7ddb Text-content-length: 71 Text-content-md5: 1dbbe6116608c72cf9d66c587e5d55ef Text-content-sha1: a2619743e3ae9d7eb27a96bb10fdebb1aa5f20e6 Content-length: 71 SVN5*RqD case iChange: mac_reconfigChange); Node-path: putty/mac/mac.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9f9c25ce51945511781962fe649f6c34 Text-delta-base-sha1: ec5e55c3980a0d0dc0a6f0b5579c653837c0fc84 Text-content-length: 29 Text-content-md5: 4fd04f22d7c9015c81f4f754a4b63e85 Text-content-sha1: 30b2f3c447d5e00d4e27580c6c875f1ba36f6e66 Content-length: 29 SVN| f.Nreconfig Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e1471ea326aec3cd8596a28eda52852 Text-delta-base-sha1: 9dd2f859fe176e9d4aeec14b95ef319b8207752d Text-content-length: 72 Text-content-md5: 1977c086fe9c42ce51dab20303267fa3 Text-content-sha1: 3db195371bae1e1d77bfc50a53ece404d201c177 Content-length: 72 SVNm (}sz0111101Change Settings", noicon, nokey, Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4983f2e974b82baacfc124af3783322c Text-delta-base-sha1: 261e657467c819796dcae2fd1b5345ad4542675a Text-content-length: 48 Text-content-md5: 7f6d5439c33b2ff98b85fe479cab7278 Text-content-sha1: 0a18260f1dd7023d89221469842151cf07a31e8b Content-length: 48 SVNQ8 62/* $Idmcs->curpanel = 1 Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b291e6e2d6616b533d809585ad291d83 Text-delta-base-sha1: f4fb8cf5295ba71c02da5a8a2eb38a8cdd47691a Text-content-length: 1060 Text-content-md5: 8c6c5dbe77808df87b71b0a9bee9de4e Text-content-sha1: 2ae98a6a5f91f635b4cfdfa187da0b321778bffe Content-length: 1060 SVN}f-k d+AR&"&!:F Feonfig(int); static void mac_closedlg(WindowPtr); static void mac_enddlg_config(WindowPtr, int); static void mac_enddlg_reconfig(WindowPtr, int); void mac_newsession(void) { mac_config(FALSE); } void mac_reconfig(void) { mac_config(TRUE); } static void mac_config(int midsession) { Session *s; WinInfo *wi; static struct sesslist sesslist; Str255 mactitle; char *str; if (midsession) { s = mac_windowsession(FrontWindow()); } else { s = snew(Session); memset(s, 0, sizeof(*s)); do_defaults(NULL, &s->cfg); s->hasfile = FALSE; }midsession, 0, 0); s->settings_ctrls.data = &s->cfg; if (midsession) s->settings_ctrls.end = &mac_enddlg_reconfig; else s->settings_ctrls.end = &mac_enddlg_config; if (midsession) str = dupprintf("%s Reconfiguration", appname); else str = dupprintf("%s Configuration", appname); c2pstrcpy(mactitle, str_confistatic void mac_enddlg_reconfi Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56a86f2a534243202a323d3b3eeaae28 Text-delta-base-sha1: 5af6e6937e86c5cdd48440253e4b73b51fa0ec81 Text-content-length: 137 Text-content-md5: 4bc1d73af2176f552a24b05ede29ef88 Text-content-sha1: 63e57e8ff7f4c1941639177fbdeb555d4fd3b8b1 Content-length: 137 SVN* r66lm=/* $Idhange 3 #define iClose 5 #define iSave 6 #define iSaveAs 7 #define iDuplicate 8 #define iQuit 10 Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ff5a3c7f4f7bdcd71180c84a05299f3 Text-delta-base-sha1: 3ec875ab63a327ffa8a1e75296bc3abe89c6e004 Text-content-length: 30 Text-content-md5: 71c84b89f7b46f6077830804aa7560fa Text-content-sha1: 15d6e8fdc82f53940a95b48eddd289927de29719 Content-length: 30 SVN 6bChange Revision-number: 5217 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2005-01-26T23:49:56.235441Z K 7 svn:log V 126 Buffer overruns are embarassing (even if caused by user error), so assert that this one can't happen until I actually fix it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 327eebfce596a223dc97bafce81e7bbd Text-delta-base-sha1: 516e46beef061e34ffdf69de9c4e56996327ec09 Text-content-length: 60 Text-content-md5: db9d3d7f7473d66b72768d66de2014c2 Text-content-sha1: 346e029f9e0aaa40fa4244e9003b80b4afb6951d Content-length: 60 SVNt #R$P assert(port >= 0 && port <= 99999) Revision-number: 5218 Prop-content-length: 139 Content-length: 139 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-01-27T11:17:28.643853Z K 7 svn:log V 39 putty.mirrorplus.org mirrormonster.com PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c042a3fe018100f798afb53a1325439 Text-delta-base-sha1: 0c93a7ad5c70e74af24c9d3f347654b55ee2c383 Text-content-length: 171 Text-content-md5: c103ee2286ab049f03b2f25bd1f9932d Text-content-sha1: 0758fe74d35aac1546ee15a3d13aa8d3570d8896 Content-length: 171 SVN^OLJ@J@D-A(6mirrorplus.org/">putty.mirrorplus.orgputty.kgt.org/">putty.kgt.orgwww.mirrormonster.com/putty-ssh/">mirrormonster.com in the US Revision-number: 5219 Prop-content-length: 762 Content-length: 762 K 8 svn:date V 27 2005-01-28T11:39:45.654210Z K 7 svn:log V 663 Overhaul of client-side XDM-AUTHORIZATION-1: * Make sk_getxdmdata() return an arbitrary string rather than two integers. This better matches the spec, even if the current version always returns six bytes * On Unix, for PF_UNIX sockets, return a counter rather than a constant along with the PID. This should allow multiple clients to connect within one second, and is what Xlib does. * On Unix, interpret AF_INET6 addresses like Xlib does, returning the embedded IPv4 address for v4-mapped addresses, and six bytes of zeroes otherwise. The latter is silly, but if I'm going to do anything more sane I need to check that X servers won't reject it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/mac/macstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ded32c55f0b84e6efa6026559b1347b6 Text-delta-base-sha1: 3471ac4f722c37ad58a4c978177ad422caa4b7ef Text-content-length: 72 Text-content-md5: 1cf46d659e5c15d989c1644adb94bca6 Text-content-sha1: 806799b3bed9ef7c6b4bb16a16e542aad128c27b Content-length: 72 SVN(& 3[NULL. */ #define sk_getxdmdata(socket, lenp) (NULL Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02ed78bdccd65cdf67da9981c78c0f68 Text-delta-base-sha1: b7091797da23002539984258d97dfcd0fecad08a Text-content-length: 62 Text-content-md5: 7e0aa838688431cf80b9eb4bb1a838b6 Text-content-sha1: 4f34ce25c556f0f87e8273421504dacf04b8db4a Content-length: 62 SVNn )Zkvoid *sk_getxdmdata(void *sock, int *lenp Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db9d3d7f7473d66b72768d66de2014c2 Text-delta-base-sha1: 346e029f9e0aaa40fa4244e9003b80b4afb6951d Text-content-length: 1630 Text-content-md5: 0a222f9753b44547b2a5565dddb36eb5 Text-content-sha1: 04a27235942a2f05f57d608eeea99f9e5a016d1e Content-length: 1630 SVN%:vW~cw"#define PUT_32BIT_MSB_FIRST(cp, value) ( \ (cp)[0] = (char)((value) >> 24), \ (cp)[1] = (char)((value) >> 16), \ (cp)[2] = (char)((value) >> 8), \ (cp)[3] = (char)(value) ) #define PUT_16BIT_MSB_FIRST(cp, value) ( \ (cp)[0] = (char)((value) >> 8), \ (cp)[1] = (char)(value) ) void *sk_getxdmdata(void *sock, int *lenp) { Actual_Socket s = (Actual_Socket) sock; #ifdef NO_IPV6 struct sockaddr_in addr; #else struct sockaddr_storage addr; struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr; #endif struct sockaddr *sa = (struct sockaddr *)&addr; struct sockaddr_in *sin = (struct sockaddr_in *)&addr; socklen_t addrlen; char *buf; static unsigned int unix_addr = 0xFFFFFFFFNULL; /* failure */ addrlen = sizeof(addr); if (getsockname(s->s, sa, &addrlen) < 0) return NULL; switch(sa->sa_family) { case AF_INET: *lenp = 6; buf = snewn(*lenp, char); PUT_32BIT_MSB_FIRST(buf, ntohl(sin->sin_addr.s_addr)); PUT_16BIT_MSB_FIRST(buf+4, ntohs(sin->sin_port)); break; #ifndef NO_IPV6 case AF_INET6: *lenp = 6; buf = snewn(*lenp, char); if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { memcpy(buf, sin6->sin6_addr.s6_addr + 12, 4); PUT_16BIT_MSB_FIRST(buf+4, ntohs(sin6->sin6_port)); } else /* This is stupid, but it's what XLib does. */ memset(buf, 0, 6); break; #endif case AF_UNIX: *lenp = 6; buf = snewn(*lenp, char); PUT_32BIT_MSB_FIRST(buf, unix_addr--); PUT_16BIT_MSB_FIRST(buf+4, getpid()); break; /* XXX IPV6 */ default: return NULL; } return buf Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fbfbc74cf99a14d10cd1d4fe0032e990 Text-delta-base-sha1: 7c2a46709119fe10447c07a67ddd0216b24378df Text-content-length: 42 Text-content-md5: 55d45f809ab67fb65a789a6e3299a012 Text-content-sha1: ab13541602b3276a52bf99dfc9b320ea737364c7 Content-length: 42 SVNQ.V NULLlenp) (NULL Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 044fb87d3c92840db93352082d2d8747 Text-delta-base-sha1: 5c6649911ae304b93a461904b4e2d4b3cef8019d Text-content-length: 566 Text-content-md5: 6f6d4fd362c3d5defe658d4da51ce9d4 Text-content-sha1: 35c9b8707e643f4427452aee271c46b8d5ef148f Content-length: 566 SVNWzQUPFq,int buflen; static const char zeroes[4] = { 0,0,0,0 }; void *buf(buf = sk_getxdmdata(s, &buflen))) { time_t t; realauthlen = (buflen+12+7) & ~7; assert(realauthlen <= lenof(realauthdata)); memset(realauthdata, 0, realauthlen); memcpy(realauthdata, pr->auth->realdata, 8); memcpy(realauthdata+8, buf, buflen); t = time(NULL); PUT_32BIT_MSB_FIRST(realauthdata+8+buflen, t); des_encrypt_xdmauth(pr->auth->realdata+9, (unsigned char *)realauthdata, realauthlen); sfree(buf Revision-number: 5220 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2005-01-28T11:47:33.592117Z K 7 svn:log V 79 Use AF_UNIX, not AF_LOCAL, since the former is in POSIX and the latter is not. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0a222f9753b44547b2a5565dddb36eb5 Text-delta-base-sha1: 04a27235942a2f05f57d608eeea99f9e5a016d1e Text-content-length: 28 Text-content-md5: c651b322cb93d59874998cb3d7d4dacb Text-content-sha1: 89346953079a39f3d3e49a7ca3108acd01f3e9a5 Content-length: 28 SVN%$ !UNIX Revision-number: 5221 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2005-01-28T11:50:56.592660Z K 7 svn:log V 37 sfree the memory dupprintf allocated K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c6c5dbe77808df87b71b0a9bee9de4e Text-delta-base-sha1: 2ae98a6a5f91f635b4cfdfa187da0b321778bffe Text-content-length: 27 Text-content-md5: 0ce8909953b00d427a3ac78a3b29a8b4 Text-content-sha1: f0ea2492458ac7fa710df6cc35e63657720a8bf3 Content-length: 27 SVNfv H(>sfree( Revision-number: 5222 Prop-content-length: 326 Content-length: 326 K 7 svn:log V 227 Split discussion of diabling rekeys between time-based and data-based, since disabling the former is much more useful, and much safer, than disabling the latter. The new wording on data-based rekeys might need some polishing. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-01-28T13:47:37.805158Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a1ee88e76cc889802920bc673096a651 Text-delta-base-sha1: 31cdec3e96c2e22e7f3a16b335a93f907d18c85c Text-content-length: 972 Text-content-md5: d3c765120c7eb669ee56eaf85aad6846 Text-content-sha1: a5c18c4834cf23ca555ff6fd427efe6645258335 Content-length: 972 SVN)myDi@\temp_cfg = s->cfg;temp_ s->cfg = s->temp_cfg; Config prev_cfg = s->cfg; s->cfg = s->temp_cfg; mac_closedlg(window); /* Pass new config data to the logging module */ log_reconfig(s->logctx, &s->cfg); /* * Flush the line discipline's edit buffer in the * case where local editing has just been disabled. */ if (s->ldisc) ldisc_send(s->ldisc, NULL, 0, 0); /* Change the palette */ palette_reset(s); /* Pass new config data to the terminal */ term_reconfig(s->term, &s->cfg); /* Pass new config data to the back end */ if (s->back) s->back->reconfig(s->backhandle, &s->cfg); /* Screen size changed ? */ if (s->cfg.height != prev_cfg.height || s->cfg.width != prev_cfg.width || s->cfg.savelines != prev_cfg.savelines) { term_size(s->term, s->cfg.height, s->cfg.width, s->cfg.savelines); request_resize(s, s->cfg.width, s->cfg.height); } /* Set the window title */ if (s->cfg.wintitle[0]) set_title(s, s->cfg.wintitle); /* TODO: zoom, scroll bar, font */ Revision-number: 5228 Prop-content-length: 301 Content-length: 301 K 7 svn:log V 201 Another compiler pickiness. It feels wrong to be doing this to perfectly idiomatic code, somehow, and I half wonder whether the Mac compilers are too stupid to be allowed to treat warnings as errors. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-01-29T22:50:18.283227Z PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f6d4fd362c3d5defe658d4da51ce9d4 Text-delta-base-sha1: 35c9b8707e643f4427452aee271c46b8d5ef148f Text-content-length: 57 Text-content-md5: 9d0e36e5aefaf6124e13b09ed1ef76df Text-content-sha1: af4988c560939750ee9eee946b87def6bfd61dcb Content-length: 57 SVNW\ $!@(buf = sk_getxdmdata(s, &buflen))!=0 Revision-number: 5229 Prop-content-length: 294 Content-length: 294 K 8 svn:date V 27 2005-01-30T14:10:05.809773Z K 7 svn:log V 194 The HI guidelines seem adamant that the File menu should never be called anything but File, and two Mac users expressed profound distress at the thought of it being called Session. File it is. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1977c086fe9c42ce51dab20303267fa3 Text-delta-base-sha1: 3db195371bae1e1d77bfc50a53ece404d201c177 Text-content-length: 85 Text-content-md5: fd0ded366be316ab6b69357c0f76064b Text-content-sha1: 9a836305ec6159c07dc57fcf7abc9eaece14138d Content-length: 85 SVN C6`,&z0111101011, enabled, "File-", noicon, nokey, Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4bc1d73af2176f552a24b05ede29ef88 Text-delta-base-sha1: 63e57e8ff7f4c1941639177fbdeb555d4fd3b8b1 Text-content-length: 116 Text-content-md5: baf7f9a19f4a0106a405d8912a5d1ad9 Text-content-sha1: b1a6eb8ea57f1b6891683130c27d9f9475485ff2 Content-length: 116 SVN ^J^m(4 #define iClose 6 #define iSave 7 #define iSaveAs 8 #define iDuplicate 9 #define iQuit 11 Revision-number: 5230 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2005-01-30T14:59:47.174118Z K 7 svn:log V 24 Hide/show the scrollbar K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7b8e99c67f559f7e99cca64f851f4c1f Text-delta-base-sha1: dcd54b4ff158377e8be74332c00b4ea3329c3097 Text-content-length: 162 Text-content-md5: 9b1157cb9c85f605a2d17e89b41477ac Text-content-sha1: d0924a4ecfd1e6666954fb0daedd8cc3b33064be Content-length: 162 SVN/IxScroll bar */ if (s->cfg.scrollbar != prev_cfg.scrollbar) request_resize(s, s->cfg.width, s->cfg.height); /* TODO: zoom Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 71c84b89f7b46f6077830804aa7560fa Text-delta-base-sha1: 15d6e8fdc82f53940a95b48eddd289927de29719 Text-content-length: 423 Text-content-md5: 9d8c0d69b6dcedba965b9e1d74fa03a6 Text-content-sha1: c346bf7d1033c2b12226feaa022de74c86e15c75 Content-length: 423 SVNR~M~fylt}-q int extraforscroll; extraforscroll=s->cfg.scrollbar ? 15 : 0; winwidth = newcols * s->font_width + extraforscrollif (s->cfg.scrollbar) { HideControl(s->scrollbar); MoveControl(s->scrollbar, winwidth - extraforscroll, -1); SizeControl(s->scrollbar, extraforscroll + 1, winheight - 13); ShowControl(s->scrollbar); } && s->cfg.scrollbar Revision-number: 5231 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2005-01-30T16:03:52.618609Z K 7 svn:log V 25 Remove redundant . K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f501bad630a8cbc266a0013ac0ba0667 Text-delta-base-sha1: 1163918d048f093592ec89881dfa830d22b7a27d Text-content-length: 24 Text-content-md5: 768944d61d2ee6a933d9c46149cdad2e Text-content-sha1: 0cfd13ce8b8ddce1453c0c9caccf723e55ec7b2c Content-length: 24 SVN>8 ! Revision-number: 5232 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2005-01-31T22:00:22.958165Z K 7 svn:log V 14 Mention Nutty K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8130682e5cb1cfdddc6f53dfe1126de8 Text-delta-base-sha1: 9757f4f2a98306e3a61415d1e1fd164989d62eed Text-content-length: 148 Text-content-md5: 602b264beb102e6c63f5332200ae1afd Text-content-sha1: 152ca0d5ee2ea62fe220feb92d8ef63ecb9c27b6 Content-length: 148 SVN6I ~~Eqwww.groehn.net/nutty/"> Nutty, with URL recognition (not actively developed) Revision-number: 5233 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2005-02-02T19:56:29.167041Z K 7 svn:log V 53 Update the configuration when the window is resized. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d8c0d69b6dcedba965b9e1d74fa03a6 Text-delta-base-sha1: c346bf7d1033c2b12226feaa022de74c86e15c75 Text-content-length: 83 Text-content-md5: 2674c3fe33c6a85e5d162074296e1d08 Text-content-sha1: 17f6808278e69c7664945e7b5b0bb6838e7f662b Content-length: 83 SVNR 9$0" s->cfg.height=s->term->rows; s->cfg.width=s->term->cols Revision-number: 5234 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2005-02-02T21:18:39.387391Z K 7 svn:log V 29 Make ot_recv less voracious. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: abe09b8a9ff1549c8a8e9d99a0010e53 Text-delta-base-sha1: b394304e1cf44afffe8c2178fe08fd63c24ee6e8 Text-content-length: 277 Text-content-md5: 30728376d38e36b9708f2edca9e73330 Text-content-sha1: 4d7838250609781fc03c94a99bdd8be3231fd0d4 Content-length: 277 SVN! ~R~A`]; OTFlags flags; if (s->frozen) return; o = OTRcv(s->ep, buf, sizeof(buf), &flags); if (o > 0) plug_receive(s->plug, 0, buf, o); if (o < 0 && o != kOTNoDataErr) plug_closing(s->plug, NULL, 0, 0); /* XXX Error msg */ Revision-number: 5235 Prop-content-length: 174 Content-length: 174 K 7 svn:log V 75 Flashing things now work as a natural consequence of the timing interface. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-02-02T21:33:13.125695Z PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7d058fa6162f664aa469d293c2933f23 Text-delta-base-sha1: 6abf4eb8e2179f8c3370197b8782a173d483ca95 Text-content-length: 24 Text-content-md5: 9a05e90b8ab56842fec4b74af8b50a3e Text-content-sha1: c8cf743dcc2f5190f6935f32347bc236369a423d Content-length: 24 SVN4p z3sA$Id Revision-number: 5236 Prop-content-length: 363 Content-length: 363 K 10 svn:author V 3 ben K 8 svn:date V 27 2005-02-02T23:51:58.391448Z K 7 svn:log V 264 Implement anti-replay protection for XDM-AUTHORIZATION-1, as required by the specification. We keep a cache of tickets we've seen recently and reject duplicates. Once a ticket in our cache is old enough that we wouldn't accept a duplicate anyway, we expire it. PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d0e36e5aefaf6124e13b09ed1ef76df Text-delta-base-sha1: af4988c560939750ee9eee946b87def6bfd61dcb Text-content-length: 1300 Text-content-md5: 61fc098f60414f846de2a790e60e9ca5 Text-content-sha1: 1b497c2285b6b2973e692380edf841e7ab1b557d Content-length: 1300 SVN\M@H*`&|yqZ}L|_LFEM@&A#include "tree234DMSeen { unsigned int time; unsigned char clientid[6]; tree234 *xdmsestatic int xdmseen_cmp(void *a, void *b) { struct XDMSeen *sa = a, *sb = b; return sa->time > sb->time ? 1 : sa->time < sb->time ? -1 : memcmp(sa->clientid, sb->clientid, sizeof(sa->clientid)); } auth->xdmseen = newtree234(xdmseen_cmpv) { struct X11Auth *auth = (struct X11Auth *)authv; struct XDMSeen *seen; if (auth->xdmseen != NULL) { while ((seen = delpos234(auth->xdmseen, 0)) != NULL) sfree(seen); freetree234(auth->xdmseen); }#define XDM_MAXSKEW 20*60 /* 20 minute clock skew should be OK */ struct XDMSeen *seen, *retXDM_MAXSKEW) return "XDM-AUTHORIZATION-1 time stamp was too far out"; seen = snew(struct XDMSeen); seen->time = t; memcpy(seen->clientid, data+8, 6); assert(auth->xdmseen != NULL); ret = add234(auth->xdmseen, seen); if (ret != seen) { sfree(seen); return "XDM-AUTHORIZATION-1 data replayed"; } /* While we're here, purge entries too old to be replayed. */ for (;;) { seen = index234(auth->xdmseen, 0); assert(seen != NULL); if (t - seen->time <= XDM_MAXSKEW) break; sfree(delpos234(auth->xdmseen, 0)); } Revision-number: 5237 Prop-content-length: 146 Content-length: 146 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-02T23:58:55.007360Z K 7 svn:log V 46 Mention Nutty, and add Simon's analysis of it PROPS-END Node-path: putty-wishlist/data/url-launching Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7baee8ad91d31f758426a86ba275d948 Text-delta-base-sha1: 7e0e0ea6783e7df0d63e49803ee26af89edefc98 Text-content-length: 629 Text-content-md5: 37f80e8d524f3de1b81d649f761ef3a6 Text-content-sha1: f5fb7bcc0dd0de849a7e16ee66ef384680d951e7 Content-length: 629 SVN> b>b

      There is a third-party patch to PuTTY to add this feature, called Nutty. We won't be incorporating it into PuTTY as it doesn't take account of several of our design principles:

      • it isn't cross-OS portable (Windows-specific URL launching and platform-independent URL finding are entangled in the same source module)
      • it uses global variables for per-session data
      • it's written in C++
      • it incorporates a regular expression matcher and hence increases code size excessively
      Revision-number: 5238 Prop-content-length: 257 Content-length: 257 K 8 svn:date V 27 2005-02-03T00:40:08.432670Z K 7 svn:log V 156 Summary: Occasional "server's host key did not match the signature supplied" (Mostly added to remind us that there's a packet log waiting to be analysed.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rsa-sig-verify-fail Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 880 Text-content-md5: 3bc39fffcab098334f7904bfd295f638 Text-content-sha1: 7c9bc7abde5d34af204355b0fe79e5a4941c1d38 Content-length: 890 PROPS-END SVNbbbSummary: Occasional "server's host key did not match the signature supplied" Difficulty: tricky Present-in: 0.55 2005-01-31 Content-type: text/x-html-body

      We've had a couple of as-yet-unexplained reports of this (SSH-2 specific) error message, which may represent a bug in PuTTY or in an SSH server. They've been difficult to reproduce.

      • <20040827195154.GE20058@eggnog.rc-comp.com>
        WinXP, 0.55, "OpenSSH_3.6.1p2 Debian 1:3.6.1p2-9" & "OpenSSH_3.8.1p1 Debian 1:3.8.1p1-8"; problem went away on its own after a while
        With packet log, as yet not analysed
      • <1107146212.080831.145250@z14g2000cwz.googlegroups.com>
        WinXP, 2005-01-31:r5331 and "older versions"; unknown server; appears specific to client machine
      Revision-number: 5239 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2005-02-03T00:42:32.279847Z K 7 svn:log V 69 I don't think there's anything tying this error to RSA specifically. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/host-key-sig-verify-fail Node-kind: file Node-action: add Node-copyfrom-rev: 5238 Node-copyfrom-path: putty-wishlist/data/rsa-sig-verify-fail Text-copy-source-md5: 3bc39fffcab098334f7904bfd295f638 Text-copy-source-sha1: 7c9bc7abde5d34af204355b0fe79e5a4941c1d38 Node-path: putty-wishlist/data/rsa-sig-verify-fail Node-action: delete Revision-number: 5240 Prop-content-length: 109 Content-length: 109 K 8 svn:date V 27 2005-02-03T12:52:25.998804Z K 7 svn:log V 11 Fixed now. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/xdmauth-replay Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4444d295162ba09e5725f3a1dde6355e Text-delta-base-sha1: 24cece381454ae289c871c3b3b63ea24dab83278 Text-content-length: 41 Text-content-md5: 3749aa9b5a1da351f066e4ad9ccea20b Text-content-sha1: 4d5cb5d8bcbef847e6ea71099099d137a334a0b3 Content-length: 41 SVN "_!Fixed-in: 2005-02-03 Revision-number: 5241 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2005-02-04T13:34:46.847247Z K 7 svn:log V 50 In the end, I went for the ddocumentation change. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-sequence-wrap Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bd1204fbf5b7581c54922e8b78b0ccf0 Text-delta-base-sha1: 4a8a86e5ec3b63dd24abf5cb5ff55a8b7cc7bcea Text-content-length: 41 Text-content-md5: 913492c0ea56d51eccbcb0ae2b2d42d7 Text-content-sha1: a5fbe3b21d770e620a590faed895649add0ced8f Content-length: 41 SVNPe ?Fixed-in: 2005-01-29 Revision-number: 5242 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2005-02-04T14:34:11.711587Z K 7 svn:log V 28 putty.infowave.org in Korea K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c103ee2286ab049f03b2f25bd1f9932d Text-delta-base-sha1: 0758fe74d35aac1546ee15a3d13aa8d3570d8896 Text-content-length: 73 Text-content-md5: 2bc7dad80e8e425d6fa01f0ecd4d27db Text-content-sha1: cf5700da5e264673234ddc16bdf21713763c83a6 Content-length: 73 SVNO>.NANinfowave.org/">putty.infowave.org in Korea Revision-number: 5243 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2005-02-04T14:39:07.485812Z K 7 svn:log V 20 reinstate gigafreak K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2bc7dad80e8e425d6fa01f0ecd4d27db Text-delta-base-sha1: cf5700da5e264673234ddc16bdf21713763c83a6 Text-content-length: 62 Text-content-md5: 3d0d7ac6b26151b48373d03d6f34c4a9 Text-content-sha1: f00fff56475c1ad29010126fb76261aefad8485a Content-length: 62 SVN>9#X47gigafreak.net/">putty.gigafreak.net Revision-number: 5244 Prop-content-length: 196 Content-length: 196 K 7 svn:log V 98 Summary: pterm aborts if Default Settings has SSH packet logging enabled I just experienced this. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-02-04T14:41:29.236727Z PROPS-END Node-path: putty-wishlist/data/pterm-logtype-crash Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 660 Text-content-md5: 704f1927581aa13eace21837d3055fce Text-content-sha1: ad58eeab8e98c142ab7db3d3cee584aa909065d3 Content-length: 670 PROPS-END SVNSummary: pterm aborts if Default Settings has SSH packet logging enabled Present-in: 2005-02-04 Priority: medium Difficulty: tricky Content-type: text/plain Setting the logging type to SSH packet logging in Unix PuTTY, then invoking pterm and attempting to open the "Change Settings" box gives an assertion failure: pterm: ../dialog.c:476: dlg_stdradiobutton_handler: Assertion `button < ctrl->radio.nbuttons' failed. This is because pterm doesn't have an SSH packet logging mode, so it can't represent the saved setting in its dialogue box. I expect that the same problem affects PuTTYtel, and similar problems may exist for other settings. Revision-number: 5245 Prop-content-length: 195 Content-length: 195 K 7 svn:log V 97 Summary: Setting rows and columns to zero causes crash From mail to putty-bugs. Not reproduced. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-02-04T14:53:55.209837Z PROPS-END Node-path: putty-wishlist/data/zero-rows-cols-crash Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 738 Text-content-md5: 0e12a6b23400830c7c6d6968f95d4fab Text-content-sha1: 6948a8b91f6dcf009784707e9e6ca10caed7e7a3 Content-length: 748 PROPS-END SVNTTTSummary: Setting rows and columns to zero causes crash Class: bug Priority: medium Content-type: text/plain <4202CF05.2010508@registriesltd.com.au> (Windows XP): Secondly I wanted to report a very minor bug in putty. If you have a logged in session (SSH to a Linux box in this case) and you choose "change settings.." from the right click menu on putty and then change the window size to 0 Rows 0 Columns putty will crash. As it crashes it pops up a modal OK error message box with the title 'Putty Fatal Error' and the text 'Out of Memory'. Once you click OK the putty window closes. BJH: I've tested this with Unix PuTTY, and the problem doesn't arise because my window manager limits how small the window can get. Revision-number: 5246 Prop-content-length: 113 Content-length: 113 K 7 svn:log V 15 This is a bug. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-02-04T14:55:26.805362Z PROPS-END Node-path: putty-wishlist/data/pterm-logtype-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 704f1927581aa13eace21837d3055fce Text-delta-base-sha1: ad58eeab8e98c142ab7db3d3cee584aa909065d3 Text-content-length: 30 Text-content-md5: 8a30fdec8be25dbd13c4d26d37556c21 Text-content-sha1: fb5c9fa62fb54828f1fc6412a4eafbb1e84c2070 Content-length: 30 SVN lass: bug Revision-number: 5247 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2005-02-04T19:14:41.575077Z K 7 svn:log V 76 Found a patch to add securid-1@ssh.com support to OpenSSH, in case we care. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/securid Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 71f1aaf752af3ef5c8a097e3ade99857 Text-delta-base-sha1: d9d11507083bc89bcc746252741f2490c082b547 Text-content-length: 115 Text-content-md5: cd93f94dae1cd80e9c71487757731095 Text-content-sha1: 4cca4c216aa46df6f79e507191078262873cb437 Content-length: 115 SVNdA ]I]I, though there's a patch to support it in OpenSSH 3.7.1p2 Revision-number: 5248 Prop-content-length: 155 Content-length: 155 K 7 svn:log V 57 Be slightly less vague about GSSAPI and mention GSI too. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-02-04T19:19:56.824672Z PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 98ecd68e6568fdaa63c1362e7f1aea42 Text-delta-base-sha1: 8ab16f1b3b1298e3e1df9f3859e539145b395332 Text-content-length: 363 Text-content-md5: 4714c53d50b572eb101a6ea4080148ad Text-content-sha1: 14a36c5fd0e429502feddfa19c32469557d14782 Content-length: 363 SVNF| SS GSSAPI. It appears that Globus GSI authentication also uses GSSAPI, though for some reason needs a different client imeplentation (and yet a third if you want to support both) Revision-number: 5249 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2005-02-05T00:14:24.068513Z K 7 svn:log V 55 mac_pollterm() is no longer useful and can be retired. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1dbbe6116608c72cf9d66c587e5d55ef Text-delta-base-sha1: a2619743e3ae9d7eb27a96bb10fdebb1aa5f20e6 Text-content-length: 27 Text-content-md5: 85ed02e67a2cf40a6162482dbb005126 Text-content-sha1: 5d67cd957659ddc582d77759d5ab9e4ffc9b5bd4 Content-length: 27 SVNS@' | Node-path: putty/mac/mac.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cbebc7958c3c435602765e02456dca6d Text-delta-base-sha1: c9b4e4175ffd978bbb806ef8e58ec9faaa0230d2 Text-content-length: 20 Text-content-md5: 69e4fb44875d9c3cecca95fedbb6710e Text-content-sha1: 2dfb4b861c5b60fd8a8712ebbac5456ff2ccf4be Content-length: 20 SVNkK {P Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2674c3fe33c6a85e5d162074296e1d08 Text-delta-base-sha1: 17f6808278e69c7664945e7b5b0bb6838e7f662b Text-content-length: 23 Text-content-md5: 0244035630018454c18c2f7e06295d94 Text-content-sha1: 202d8316245b711a37f2601423e475be21fb59f1 Content-length: 23 SVN _ \1 Revision-number: 5250 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 65 Times and dates in the event log, fixing ltime() in the process. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-02-05T00:29:20.786306Z PROPS-END Node-path: putty/mac/macevlog.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5eb44ad2d459ca2a4cbe2b477769f902 Text-delta-base-sha1: 2bb0c6a5225440e5f3c06f0ed2881938168e4760 Text-content-length: 330 Text-content-md5: a67cef61bcd881567d71f13c78ec8b8f Text-content-sha1: 9f8f39aeb39c937ec21e253ce6d79cab43b1a8d0 Content-length: 330 SVN=%% 7~>*OHu/* $Id char timebuf[40]; struct tm tm; char *string; tm=ltime(); strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t", &tm); string=snewn(strlen(timebuf) + strlen(str) +1, char); strcpy(string, timebuf); strcat(string, str)ing, strlen(string sfree(strin Node-path: putty/mac/macmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30c01c759832bf0f54df52241268430d Text-delta-base-sha1: 3d5085b9e35351c6d7795e9256256ccf7bd20b6a Text-content-length: 51 Text-content-md5: 8c46528cd5543ceba42c31d8d74e7476 Text-content-sha1: ddfa48e4066f4331412baba30e3b7df91e91f963 Content-length: 51 SVN  s-1; tm.tm_year=d.year-1900 Revision-number: 5251 Prop-content-length: 277 Content-length: 277 K 8 svn:date V 27 2005-02-05T10:55:09.640477Z K 7 svn:log V 176 Mac PuTTY.ppc wouldn't compile for me until I added this prototype. Not sure why it's been working for Owen and not me, but the prototype ought to be there anyway, so *shrug*. K 10 svn:author V 5 simon PROPS-END Node-path: putty/testback.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 90decf5985e0aaaf5a57af1ffedd7141 Text-delta-base-sha1: e6090e1541159c80d03af6c5ffa28037751bb17f Text-content-length: 52 Text-content-md5: 7829eef16a7aaafb3a07725e790cdbc0 Text-content-sha1: 5a058390df131d9a0b65def499fd826085e3ff34 Content-length: 52 SVNw K/Hstatic int null_cfg_info(void * Revision-number: 5252 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 2005-02-05T11:59:04.795399Z K 7 svn:log V 9 fix link K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/url-launching Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 37f80e8d524f3de1b81d649f761ef3a6 Text-delta-base-sha1: f5fb7bcc0dd0de849a7e16ee66ef384680d951e7 Text-content-length: 22 Text-content-md5: 30d02719cd7c997333a3e352e8e42cb3 Text-content-sha1: 284ad757584e7c22b331babfc7b02f270cba8ad2 Content-length: 22 SVN ! JVJl Revision-number: 5253 Prop-content-length: 104 Content-length: 104 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-05T12:04:06.310541Z K 7 svn:log V 5 typo PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4714c53d50b572eb101a6ea4080148ad Text-delta-base-sha1: 14a36c5fd0e429502feddfa19c32469557d14782 Text-content-length: 25 Text-content-md5: 0e1ca64d4c0c0d92eb19d3d7df06e699 Text-content-sha1: 8314eeb6d7c84e7113e5bef48a4d7cf094eb0739 Content-length: 25 SVN|} 9@ make.out Echo "# `Date -t` ----- Executing build commands." make.out Delete make.out Echo "# `Date -t` ----- Done." Revision-number: 5255 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2005-02-05T14:46:39.989289Z K 7 svn:log V 114 Added a small shell script to run enough SetFile commands to make MPW builds work after checking out on Mac OS X. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mac/setfile.sh Node-kind: file Node-action: add Prop-content-length: 36 Text-delta: true Text-content-length: 696 Text-content-md5: 1b98cc85e0a2cb6a348cd12a0ee2f9a0 Text-content-sha1: c27ed6fceab8fe870044fe4e7f70e4b303776afa Content-length: 732 K 14 svn:executable V 1 * PROPS-END SVN***#!/bin/sh # Shell script to be run on Mac OS X, which uses `SetFile' to set # up the appropriate file metadata so that you can run MPW and have # it build classic-Mac PuTTY. SETFILE=/Developer/Tools/SetFile # I want to be able to run this either from the `mac' subdirectory # or from the main `putty' source directory. if test -f mac_res.r -a -f ../putty.h; then cd .. fi if test ! -f putty.h; then echo 'putty.h not found.' >&2 echo 'This script should be run in the PuTTY source directory.' >&2 exit 1 fi # Now we can assume we're in the main PuTTY source dir. find . -name .svn -prune -o -name '*.[chr]' -exec $SETFILE -t TEXT {} \; $SETFILE -t TEXT mac/mkputty.mpw Revision-number: 5256 Prop-content-length: 386 Content-length: 386 K 7 svn:log V 286 Implement refreshing the whole dialogue box with dlg_refresh, so that if you load a session all the panels in the configuration dialogue reflect the new settings. However, there's a glitch which paints a white rectangle between the Saved Sessions listbox and the Close-on-exit radios. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-02-05T14:50:42.952085Z PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f6d5439c33b2ff98b85fe479cab7278 Text-delta-base-sha1: 0a18260f1dd7023d89221469842151cf07a31e8b Text-content-length: 346 Text-content-md5: 4930e5d08eba031ed648b6be2f2d4435 Text-content-sha1: eec333e99af844f4d40c2d81c5048f10b66c4076 Content-length: 346 SVN8N>'>iO int i; if (ctrl == NULL) { /* NULL means refresh every control */ for (i = 0 ; i < mcs->npanels; i++) { for (mc = mcs->panels[i]; mc != NULL; mc = mc->generic.next) { ctrlevent(mcs, mc, EVENT_REFRESH); } } return; } /* Just refresh a specific control Revision-number: 5257 Prop-content-length: 396 Content-length: 396 K 8 svn:date V 27 2005-02-05T15:33:36.760402Z K 7 svn:log V 295 When allocating BSD-style ptys, we should not be satisfied with a /dev/ptyXX we can open: we must also check that we can open and use the corresponding /dev/ttyXX, because if it's been left in the wrong mode then we will look terribly silly when we fork and _then_ discover our pty is unusable. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ba36ab2792d3cd7558ebb5816e0b279 Text-delta-base-sha1: 1a1b07fa1d28c983066aa2ff17c4a73b0d477bf4 Text-content-length: 817 Text-content-md5: 5d9e2a2e0e94f150181ad39109787c7e Text-content-sha1: 76b034dd83b647e3f8931e530f93095879cd0195 Content-length: 817 SVNM<1rurx`!@zJT_8HB , pty_slaveint pty_open_slave(void) { if (pty_slave_fd < 0) pty_slave_fd = open(pty_name, O_RDWR); return pty_slave_fd; } { /* * We must also check at this point that we are * able to open the slave side of the pty. We * wouldn't want to allocate the wrong master, * get all the way down to forking, and _then_ * find we're unable to open the slave. */ strcpy(pty_name, master_name); pty_name[5] = 't'; /* /dev/ptyXX -> /dev/ttyXX */ if (pty_open_slave() >= 0 && access(pty_name, R_OK | W_OK) == 0) goto got_one; if (pty_slave_fd > 0) close(pty_slave_fd); pty_slave_fd = -1; }pty_slavepty_open_slave( if (pty_slave_fd > 0) close(pty_slave_fd); } Revision-number: 5258 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:17.808174Z PROPS-END Revision-number: 5259 Prop-content-length: 222 Content-length: 222 K 7 svn:log V 121 The pty backend won't _always_ be running under X, so it should be possible to compile it without the WINDOWID variable. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-02-06T13:33:41.371838Z PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d9e2a2e0e94f150181ad39109787c7e Text-delta-base-sha1: 76b034dd83b647e3f8931e530f93095879cd0195 Text-content-length: 328 Text-content-md5: 78bec4ffa4f9feae91833db7287f6e85 Text-content-sha1: ed8b92e47000f17036faa68e8e11541d4306ec78 Content-length: 328 SVN<,]Q>u39CkRj#ifndef NOT_X_WINDOWS /* for Mac OS X native compilation */ long windowid; #endif#ifndef NOT_X_WINDOWS /* for Mac OS X native compilation */ windowid = get_windowid(pty_frontend); #endif#ifndef NOT_X_WINDOWS /* for Mac OS X native compilation */#endif Revision-number: 5260 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2005-02-06T15:00:36.372391Z K 7 svn:log V 43 First stab at a host key cache on the Mac. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85ed02e67a2cf40a6162482dbb005126 Text-delta-base-sha1: 5d67cd957659ddc582d77759d5ab9e4ffc9b5bd4 Text-content-length: 893 Text-content-md5: 40aed5db1ee69f4b13e83c9ac02f7cc4 Text-content-sha1: 0276e1343e8db524bde8083a5406f7b9b55cec21 Content-length: 893 SVNSIS42 . G int retAlso see the * note below about closing the connection. All in all, a bit of * a mess really. */ /* Verify the key against the cache */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return; if (ret == 2) { /* key was different */ stuff[0] = sprintf((char *)(&stuff[1]), "WARNING - POTENTIAL SECURITY BREACH\n", "The key fingerprint is: %s\n" "Continue connecting?", fingerprint); ParamText(stuff, NULL, NULL, NULL); } if (ret == 1) { /* key was absent */ stuff[0] = sprintf((char *)(&stuff[1]), "The server's key fingerprint is: %s\n" "Continue connecting?", fingerprint); ParamText(stuff, NULL, NULL, NULL); } } else { store_host_key(host, port, keytype, keystr); Node-path: putty/mac/mac.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69e4fb44875d9c3cecca95fedbb6710e Text-delta-base-sha1: 2dfb4b861c5b60fd8a8712ebbac5456ff2ccf4be Text-content-length: 218 Text-content-md5: fd6d65f9bb58f7959bb8ee33dfa0aa86 Text-content-sha1: 0c0b67b1fa07f2528dcde4b934287478b4fd0119 Content-length: 218 SVNK<liN}#define HKYS_TYPE FOUR_CHAR_CODE('Hkysextern int verify_host_key(const char *, int, const char *, const char*); extern void store_host_key(const char *, int, const char *, const char Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c834c9e1441943ebdff743f8335021e6 Text-delta-base-sha1: 6a51ee4c46836874e6b8fc2ade992f7a71b71984 Text-content-length: 2827 Text-content-md5: c1aa4fb0edc49fe5604e0bf4b43f7d8d Text-content-sha1: 39abb22ccd9def71b2ee92d6f12daca42e53524e Content-length: 2827 SVNa_k]8rI8sN/* $Idint verify_host_key(const char *hostname, int port, const char *keytype, const char *key) { short puttyVRefNum; long puttyDirID; OSErr error; FSSpec keyfile; short refnum; char *resname; Str255 presname; char *resvalue; Handle reshandle; int len, compare; if (get_putty_dir(kCreateFolder, &puttyVRefNum, &puttyDirID) != noErr) return 1; error = FSMakeFSSpec(puttyVRefNum, puttyDirID, "\pSSH Host Keys", &keyfile); if (error == fnfErr) { /* Keys file doesn't exist yet, so we can't match the key */ return 1; } refnum = FSpOpenResFile(&keyfile, fsRdPerm); if (refnum == -1) { /* We couldn't open the resource fork, so we can't match the key */ return 1; } UseResFile(refnum); resname = dupprintf("%s@%d:%s", keytype, port, hostname); c2pstrcpy(presname, resname); reshandle = Get1NamedResource(FOUR_CHAR_CODE('TEXT'), presname); if (ResError() != noErr) { /* Couldn't open the specific resource */ return 1; } len = GetHandleSize(reshandle); resvalue = snewn(len+1, char); memcpy(resvalue, *reshandle, len); resvalue[len]='\0'; ReleaseResource(reshandle); CloseResFile(refnum); compare = strncmp(resvalue, key, strlen(resvalue)); sfree(resname); sfree(resvalue); if (compare) { /* Key different */ return 2; } else { /* Key matched */ return 0; } } void store_host_key(const char *hostname, int port, const char *keytype, const char *key) { short puttyVRefNum; long puttyDirID; OSErr error; FSSpec keyfile; short keyrefnum; char *resname; Str255 presname; Handle resvalue; int id; /* Open the host key file */ if (get_putty_dir(~kCreateFolder, &puttyVRefNum, &puttyDirID) != noErr) goto out; error = FSMakeFSSpec(puttyVRefNum, puttyDirID, "\pSSH Host Keys", &keyfile); if (error == fnfErr) { /* It doesn't exist, so create it */ FSpCreateResFile(&keyfile, INTERNAL_CREATOR, HKYS_TYPE, smRoman); keyrefnum = FSpOpenResFile(&keyfile, fsWrPerm); if (ResError() == noErr) { copy_resource('STR', -16397); /* XXX: wtf is this? */ CloseResFile(keyrefnum); } } else if (error != noErr) goto out; keyrefnum = FSpOpenResFile(&keyfile, fsWrPerm); if (keyrefnum == -1) goto out; UseResFile(keyrefnum); resname = dupprintf("%s@%d:%s", keytype, port, hostname); c2pstrcpy(presname, resname); error = PtrToHand(key, &resvalue, strlen(key)); if (error != noErr) goto out; goto out; AddResource(resvalue, FOUR_CHAR_CODE('TEXT'), id, presname); if (ResError() != noErr) goto out; CloseResFile(keyrefnum); return; out: fatalbox("Writing host key failed (%d)", error); sfree(resname); } Revision-number: 5261 Prop-content-length: 653 Content-length: 653 K 8 svn:date V 27 2005-02-06T15:14:34.473174Z K 7 svn:log V 552 Encapsulated most of the pty backend's variables into a proper data structure, in preparation for wanting more than one of them in a single process. This can't be done cleanly, because the whole business with pty_pre_init pre-allocating the pty rather assumes we want a known number of the things before we drop privileges; so there's a horrid hack to make pty_pre_init work on platforms that have at most one pty instance per process, but at the same time things ought to work sensibly with more than one per process _if_ pty_pre_init isn't required. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 78bec4ffa4f9feae91833db7287f6e85 Text-delta-base-sha1: ed8b92e47000f17036faa68e8e11541d4306ec78 Text-content-length: 9579 Text-content-md5: e6bd139c8457faad817a982b042b5684 Text-content-sha1: 1e7754cff396624ef9af831cbff7e5d67ce40e98 Content-length: 9579 SVN D' :Mf2<s=37~H<'# Q;X@vy(Z*Z!rI/~ducHkJoU%_<E[bd>Y{wpstQ8Y^,l^rREH0&QICY-f=p0b'%NO/* * Pseudo-tty backend for pterm#include "tree234typedef struct pty_tag *Pty; /* * The pty_signal_pipe, along with the SIGCHLD handler, must be * process-global rather than session-specific. */ static int pty_signal_pipe[2] = { -1, -1 }; /* obviously bogus initial val */ struct pty_tag { Config cfg; int master_fd, slave_fd; void *frontend; char name[FILENAME_MAX]; int child_pid; int term_width, term_height; int child_dead, finished; int exit_code; }; /* * We store our pty backends in a tree sorted by master fd, so that * when we get an uxsel notification we know which backend instance * is the owner of the pty that caused it. */ static int pty_compare_by_fd(void *av, void *bv) { Pty a = (Pty)av; Pty b = (Pty)bv; if (a->master_fd < b->master_fd) return -1; else if (a->master_fd > b->master_fd) return +1; return 0; } static int pty_find_by_fd(void *av, void *bv) { int a = *(int *)av; Pty b = (Pty)bv; if (a < b->master_fd) return -1; else if (a > b->master_fd) return +1; return 0; } static tree234 *ptys_by_fd = NULL; /* * We also have a tree sorted by child pid, so that when we wait() * in response to the signal we know which backend instance is the * owner of the process that caused the signal. */ static int pty_compare_by_pid(void *av, void *bv) { Pty a = (Pty)av; Pty b = (Pty)bv; if (a->child_pid < b->child_pid) return -1; else if (a->child_pid > b->child_pid) return +1; return 0; } static int pty_find_by_pid(void *av, void *bv) { int a = *(int *)av; Pty b = (Pty)bv; if (a < b->child_pid) return -1; else if (a > b->child_pid) return +1; return 0; } static tree234 *ptys_by_pid = NULL; /* * If we are using pty_pre_init(), it will need to have already * allocated a pty structure, which we must then return from * pty_init() rather than allocating a new one. Here we store that * structure between allocation and use. * * Note that although most of this module is entirely capable of * handling multiple ptys in a single process, pty_pre_init() is * fundamentally _dependent_ on there being at most one pty per * process, so the normal static-data constraints don't apply. * * Likewise, since utmp is only used via pty_pre_init, it too must * be single-instance, so we can declare utmp-related variables * here. */ static Pty single_pty = NULL; static struct utmp utmp_entry; #endif /* * pty_argv is a grievous hack to allow a proper argv to be passed * through from the Unix command line. Again, it doesn't really * make sense outside a one-pty-per-process setup. */ char **pty_argv; int use_pty_argv; static void pty_close(Pty pty); #ifndef OMIT_UTMPPty pty) { if (pty->slave_fd < 0) pty->slave_fd = open(pty->name, O_RDWR); return pty->slave_fd; } static void pty_open_master(Pty pty->master_fd = open(master_name, O_RDWR); if (pty->->name, master_name); pty->pty) >= 0 && access(pty->name, R_OK | W_OK) == 0) goto got_one; if (pty->slave_fd > 0) close(pty->slave_fd); pty->slave_fd = -1; } close(pty->->name, getuid(), gp ? gp->gr_gid : -1); chmod(pty->name, 0600); #else pty->master_fd = open("/dev/ptmx", O_RDWR); if (pty->->master_fd) < 0) { perror("grantpt"); exit(1); } if (unlockpt(pty->master_fd) < 0) { perror("unlockpt"); exit(1); } pty->name[FILENAME_MAX-1] = '\0'; strncpy(pty->name, ptsname(pty->master_fd), FILENAME_MAX-1); #endif if (!ptys_by_fd) ptys_by_fd = newtree234(pty_compare_by_fd); add234(ptys_by_fd, pty); Pty pty; #ifndef OMIT_UTMP pid_t pid; int pipefd[2]; #endif pty = single_pty = snew(struct pty_tag);->master_fd = pty->slave_fd = -1; #ifndef OMIT_UTMP pty_stamped_utmp = FALSE; #endif if (geteuid() != getuid() || getegid() != getgid()) { pty_open_master(pty->real_select_result(Pty pty, int event, int status) { char buf[4096]; int ret; int finished = FALSE; if (event < 0) { /* * We've been called because our child process did * something. `status' tells us what. */ if ((WIFEXITED(status) || WIFSIGNALED(status))) { /* * The primary child process died. We could keep * the terminal open for remaining subprocesses to * output to, but conventional wisdom seems to feel * that that's the Wrong Thing for an xterm-alike, * so we bail out now (though we don't necessarily * _close_ the window, depending on the state of * Close On Exit). This would be easy enough to * change or make configurable if necessary. */ pty->exit_code = status; pty->child_dead = TRUE; del234(ptys_by_pid, pty); finished = TRUE; } } else { if (event == 1) { ret = read(pty->master_fd, buf, sizeof(buf)); /* * Clean termination condition is that either ret == 0, or ret * < 0 and errno == EIO. Not sure why the latter, but it seems * to happen. Boo. */ if (ret == 0 || (ret < 0 && errno == EIO)) { /* * We assume a clean exit if the pty has closed but the * actual child process hasn't. The only way I can * imagine this happening is if it detaches itself from * the pty and goes daemonic - in which case the * expected usage model would precisely _not_ be for * the pterm window to hang around! */ finished = TRUE; if (!pty->child_dead) pty->exit_code = 0; } else if (ret < 0) { perror("read pty master"); exit(1); } else if (ret > 0) { from_backend(pty->frontend, 0, buf, ret); } } } if (finished && !pty->finished) { uxsel_del(pty->master_fd); pty_close(pty); pty->master_fd = -1; pty->->cfg.close_on_exit == FORCE_OFF || (pty->cfg.close_on_exit == AUTO && pty->exit_code != 0)) { char message[512]; if (WIFEXITED(pty->exit_code)) sprintf(message, "\r\n[pterm: process terminated with exit" " code %d]\r\n", WEXITSTATUS(pty->exit_code)); else if (WIFSIGNALED(pty->->->exit_code), strsignal(WTERMSIG(pty->exit_code))); #endif from_backend(pty->frontend, 0, message, strlen(message)); } notify_remote_exit(pty->frontend); } return !finished; } int pty_select_result(int fd, int event) { int ret = TRUE; Pty pty; if (fd == pty_signal_pipe[0]) { pid_t pid; int i ipid = pid; pty = find234(ptys_by_pid, &pid, pty_find_by_pid); if (pty) ret = ret && pty_real_select_result(pty, -1, status); } while (pid > 0); } else { pty = find234(ptys_by_fd, &fd, pty_find_by_fd); if (pty) ret = ret && pty_real_select_result(pty, event, 0); } return ret; } static void pty_uxsel_setup(Pty pty) { uxsel_set(pty->master_fd, 1, pty_select_result); /* * In principle this only needs calling once for all pty * backend instances, but it's simplest just to call it every * time; uxsel won't mind. */ Pty pty; if (single_pty) { pty = single_pty; } else { pty = snew(struct pty_tag); pty->master_fd = pty->slave_fd = -1; #ifndef OMIT_UTMP pty_stamped_utmp = FALSE; #endif } pty->frontend = frontend; *backend_handle = NULL; /* we can't sensibly use this, sadly */ pty->cfg = *cfg; /* structure copy */ pty->term_width = cfg->width; pty->term_height = cfg->height; if (pty->master_fd < 0) pty_open_master(pty->->->->pty); if (slavefd < 0) { perror("slave pty: open"); _exit(1); } close(pty->->->child_pid = pid; pty->child_dead = FALSE; pty->finished = FALSE; if (pty->slave_fd > 0) close(pty->slave_fd); if (!ptys_by_pid) ptys_by_pid = newtree234(pty_compare_by_pid); add234(ptys_by_pid, pty); } if (pty_signal_pipe[0] < 0 && pipe(pty_signal_pipe) < 0) { perror("pipe"); exit(1); } pty_uxsel_setup(pty); *backend_handle = ptyPty pty = (Pty)handle;-> Pty pty = (Pty)handle; /* Either of these may fail `not found'. That's fine with us. */ del234(ptys_by_pid, pty); del234(ptys_by_fd, pty); sfree(pty);Pty pty = (Pty)handle; if (pty->->Pty pty) { if (pty->master_fd >= 0) { close(pty->master_fd); pty->/* Pty pty = (Pty)handle; */Pty pty = (Pty)handle; struct winsize size; pty->term_width = width; pty->term_height = height; size.ws_row = (unsigned short)pty->term_height; size.ws_col = (unsigned short)pty->term_width; size.ws_xpixel = (unsigned short) pty->term_width * font_dimension(pty->frontend, 0); size.ws_ypixel = (unsigned short) pty->term_height * font_dimension(pty->frontend, 1); ioctl(pty->Pty pty = (Pty)handle; */ Pty pty = (Pty)handle; *//* Pty pty = (Pty)handle; *//* Pty pty = (Pty)handle; */ return 1; } static void pty_unthrottle(void *handle, int backlog) { /* Pty pty = (Pty)handle; */ /* do nothing */ } static int pty_ldisc(void *handle, int option) { /* Pty pty = (Pty)handle; */Pty pty = (Pty)handle; */Pty pty = (Pty)handle; */ /* This is a stub. */ } static int pty_exitcode(void *handle) { Pty pty = (Pty)handle; if (!pty->finished) return -1; /* not dead yet */ else return pty->exit_code; } static int pty_cfg_info(void *handle) { /* Pty pty = (Pty)handle; */ Revision-number: 5262 Prop-content-length: 281 Content-length: 281 K 7 svn:log V 180 Reinstate the broken -e option in pterm. Also I've just worked out a much better way of handling pty_argv which doesn't require uxpty.c to be linked in to Unix PuTTY and PuTTYtel. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-02-06T15:52:00.435845Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 39b141c3aee1f3e131c1505096745fd2 Text-delta-base-sha1: c0c6802e17098d92d409c7248beb2ba96d0b14c5 Text-content-length: 25 Text-content-md5: 6763505dfa783e9a093b17306ba89159 Text-content-sha1: 970889263a5f5e94388528531f7a9f7700edce17 Content-length: 25 SVNk_\b~m Node-path: putty/unix/uxpterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 235d317cd68d726846eac3331036735e Text-delta-base-sha1: 97baff2be0ac9e81849d88070ce6264547894837 Text-content-length: 51 Text-content-md5: e19d0f56720d54fc0bb08150bd0d8253 Text-content-sha1: 98d21308724bdaa45fd70e80e0aff1a8b532284f Content-length: 51 SVN=\ >const int use_pty_argv = TRUE; Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e6bd139c8457faad817a982b042b5684 Text-delta-base-sha1: 1e7754cff396624ef9af831cbff7e5d67ce40e98 Text-content-length: 23 Text-content-md5: c63609c861adade68ee0be9aa79839ed Text-content-sha1: 6be3c5c3d6d970bc226a2262a435741f690c6412 Content-length: 23 SVN x h" Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8aef74bc313a0cbfb8c54d5a7b9aa045 Text-delta-base-sha1: 87a7c1af953813115848a383eec8382d3fad8df9 Text-content-length: 147 Text-content-md5: 3c22149afced66581dc1edad4212de35 Text-content-sha1: cf6d816c4449842eb22f815354d4ed4ecea1b0fe Content-length: 147 SVN/4 }K}lCStubs to avoid uxpty.c needing to be linked in. */ const int use_pty_argv = FALSE; char **pty_argv; /* never used */ Revision-number: 5263 Prop-content-length: 174 Content-length: 174 K 7 svn:log V 75 Add a comment about the deficiencies of the host key cache implementation. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-02-07T10:47:48.611348Z PROPS-END Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c1aa4fb0edc49fe5604e0bf4b43f7d8d Text-delta-base-sha1: 39abb22ccd9def71b2ee92d6f12daca42e53524e Text-content-length: 446 Text-content-md5: 7f138768c6750c93eeb7668a1ad339c3 Text-content-sha1: 0cb72fa7348da85e9ae511687554af9437ccc06a Content-length: 446 SVN_lc4xp!L/* * This host key cache uses a file in the PuTTY Preferences folder and * stores keys as individual TEXT resources in the resource fork of * that file. This has two problems. Firstly, a resource fork can * contain no more than 2727 resources. Secondly, the Resource * Manager uses a linear search to find a particular resource, which * could make having lots of host keys quite slow. */ int verify Revision-number: 5264 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2005-02-07T11:40:28.216806Z K 7 svn:log V 91 Summary: Context help causes WinHelp crash after PuTTY help files upgraded Class: semi-bug K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winhelp-crash Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1233 Text-content-md5: baaa1adef8e4b76456a5e31c60ba6463 Text-content-sha1: 19018de6ae0828b28d91dc7ddae5072f2c512f02 Content-length: 1243 PROPS-END SVNCCCSummary: Context help causes WinHelp crash after PuTTY help files upgraded Class: semi-bug Difficulty: taxing Content-type: text/x-html-body

      Invoking context help from within Windows PuTTY after the PuTTY help files on a system have been replaced has been observed to cause WinHelp to crash.

      Since the crash occurs in winhelp.exe, it's almost certainly a WinHelp bug, but perhaps there is something we can do to avoid triggering it. We're out of ideas, though.

      The symptoms I observed (on Win98SE, and also on 2000 when I had access to it, IIRC) were:

      • When using new .HLP and .CNT files (e.g., downloaded into a new directory, alongside a new version of PuTTY such as a development snapshot), invoking context help consistently causes WINHELP.EXE to crash and leave a putty.TMP file lying around.
      • However, invoking the Help file without context by pressing (say) the Help button on PuTTY's configuration dialog, or invoking it from a session's system menu, works fine, and subsequently to that, context help works too.
      • Deleting the hidden putty.GID file that appears alongside the PuTTY help files the first time they're used doesn't appear to help.
      Revision-number: 5265 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 http://www.covidimus.net/projects/putty/putty.php K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-07T11:47:58.840155Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 602b264beb102e6c63f5332200ae1afd Text-delta-base-sha1: 152ca0d5ee2ea62fe220feb92d8ef63ecb9c27b6 Text-content-length: 113 Text-content-md5: 4297735070e6bf9c31681717559adb3d Text-content-sha1: 042c105adcf2ecfac6989862720963dcba09b39c Content-length: 113 SVNI= [ [Xqcovidimus.net/projects/putty/putty.php"> Another transparency patch at covidimus.net. Revision-number: 5266 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2005-02-07T11:48:40.991197Z K 7 svn:log V 23 More third-party hacks K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/transparency Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ba0798e86e4c52f80e534f80745921e0 Text-delta-base-sha1: 42c09bd44db41d9cb6a64b828fec2e531ac5f268 Text-content-length: 104 Text-content-md5: 4fd35f14ff4508e3aa1a5d917c1b83d9 Text-content-sha1: ba8f336a3fc21de1290499433b5a7c71d92d7b26 Content-length: 104 SVNznWWthere are several third-party solutions on our links page. Revision-number: 5267 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2005-02-07T12:16:00.005760Z K 7 svn:log V 81 Summary: Assertion failed in terminal.c:lineptr(): line != NULL Present-in: 0.56 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1094 Text-content-md5: dc909cd800c82f60d1a998b216e7c72a Text-content-sha1: 2ebbea3b9607471e07031a5164dcd152aba4810f Content-length: 1104 PROPS-END SVN888Summary: Assertion failed in terminal.c:lineptr(): line != NULL Class: bug Present-in: 0.56 Content-type: text/x-html-body

      No-one has reproduced this with a current snapshot, and we haven't yet been able to reproduce it with 0.56 either.

      All these instances are in terminal.c:lineptr() (the line number has changed a lot due to the extensive terminal re-engineering since 0.56).

      • Pine.0410290832480.79579@mozart.musicbox.net
        0.56 on WinME and 2K; terminal.c:159
      • 2164FF46E100024E87C4F72442B267050393955A@mail02.ad.telekom.lv
        0.56 on W2KSP2; terminal.c:159
      • BB8EDCA75DA7624F9A8B446F68A56C70438A89@PKDWB06C.ad.sprint.com
        0.56 on Win2K; terminal.c:159
        "disable switching to alternate screen" enabled

      Perhaps an unrelated bug that's already been fixed:

      • 000d01c4b1c7$ca506090$4296a8c0@nadine
        2004-10-14; terminal.c:662; connecting to SunOS
        reportedly fixed in 2004-10-15, although since other reports indicate the failure is intermittent, perhaps not
      Revision-number: 5268 Prop-content-length: 179 Content-length: 179 K 7 svn:log V 79 Petri Kero pointed out a FreeLibrary() call that should be guarded by NO_IPV6. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-07T12:23:10.970258Z PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 23d2742160efc32281c07c9d32f39906 Text-delta-base-sha1: 932a1b1eb9249bf84bcfe1ce11932577b2976fc8 Text-content-length: 99 Text-content-md5: 13e05706b017f909b671b84241dd421a Text-content-sha1: 9862984f7dec8135fda3e14b90ef0c526d798418 Content-length: 99 SVN. J JZ=#ifndef NO_IPV6 if (wship6_module) FreeLibrary(wship6_module); #endif Revision-number: 5269 Prop-content-length: 115 Content-length: 115 K 7 svn:log V 15 Another patch. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-07T13:11:18.346718Z PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0e1ca64d4c0c0d92eb19d3d7df06e699 Text-delta-base-sha1: 8314eeb6d7c84e7113e5bef48a4d7cf094eb0739 Text-content-length: 191 Text-content-md5: f1501ec2530ed4778db54a7d038c1d25 Text-content-sha1: 8651a999b8671fd4c4e7170de0c2d620cd6083b3 Content-length: 191 SVN}),},

      Yet another patch, for "SSPI / GSS-API" here (new-BSD licence; unreviewed as yet). Revision-number: 5270 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2005-02-07T15:23:45.975144Z K 7 svn:log V 52 Comment explaining location in top-level directory. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/time.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 11976422c786723932edb1b6b306c20b Text-delta-base-sha1: dd2bae210761f967af69906e5220600a348ace91 Text-content-length: 233 Text-content-md5: e7f5e5b5290559e893de521799671d70 Text-content-sha1: 69c16858a480e1a0644df6a80093273752c597ef Content-length: 233 SVNnVV/* * Portable implementation of ltime() for any ISO-C platform where * time_t behaves. (In practice, we've found that platforms such as * Windows and Mac have needed their own specialised implementations.) */ Revision-number: 5271 Prop-content-length: 340 Content-length: 340 K 8 svn:date V 27 2005-02-07T20:24:13.861784Z K 7 svn:log V 239 Revert my LF->CR change following Owen's comment that it actually breaks netatalk-based setups (which _swap_ LF and CR). Instead, setfile.sh (which I have to run _anyway_ on OS X) copies mkputty.mpw to mk.mpw and then makes that CR-based. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mac/mkputty.mpw Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 29 Text-delta: true Text-delta-base-md5: 1afa3fad74dbe0449a3860cfc2c82c78 Text-delta-base-sha1: a2b0cd81bc47f338d7ec90cf69793945910b9943 Text-content-length: 321 Text-content-md5: cb966d7c31ae384456f7aa45b02f78cd Text-content-sha1: 1554355682c07adbb3721e33d4f641354565cc5d Content-length: 350 D 13 svn:eol-style PROPS-END SVN2222# $Id$ Set makefile Makefile.mpw # Run Make, then execute its output. Echo "# `Date -t` ----- Analyzing dependencies." Begin Echo "Set Echo 1" Make {"Parameters"} -f "{makefile}" End > make.out Echo "# `Date -t` ----- Executing build commands." make.out Delete make.out Echo "# `Date -t` ----- Done." Node-path: putty/mac/setfile.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1b98cc85e0a2cb6a348cd12a0ee2f9a0 Text-delta-base-sha1: c27ed6fceab8fe870044fe4e7f70e4b303776afa Text-content-length: 144 Text-content-md5: 41182567af4cbe2069c13e54bd7f98f1 Text-content-sha1: b1ff7c77b3f5e8bd98e83269ead334f1bd12a3ff Content-length: 144 SVN*  # CR-ise mkputty.mpw and set the new version to TEXT. tr '\n' '\r' < mac/mkputty.mpw > mac/mk.mpw $SETFILE -t TEXT mac/mk.mpw Revision-number: 5272 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2005-02-07T23:43:03.437011Z K 7 svn:log V 39 Add the new mk.mpw to the ignore list. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mac Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 236 Content-length: 236 K 10 svn:ignore V 203 make.out *.NJ mk.mpw Makefile.mpw PuTTY.68k PuTTY.cfm68k PuTTY.ppc PuTTY.carbon PuTTYtel.68k PuTTYtel.cfm68k PuTTYtel.ppc PuTTYtel.carbon PuTTYgen.68k PuTTYgen.cfm68k PuTTYgen.ppc PuTTYgen.carbon *.rsrc PROPS-END Revision-number: 5273 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2005-02-08T10:04:28.301224Z K 7 svn:log V 50 Clarify why the new behaviour might be a problem. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/kbdint-failure Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5441ae1f00a642d036242bb71ffbf3ad Text-delta-base-sha1: 82ab9ee547e7d467aca946a1a82630b4cd7add3c Text-content-length: 44 Text-content-md5: 99d4d7e90996957d96afd3c79d8efaed Text-content-sha1: 48a24868c7d8e6bd279f442704fe1111fd872e49 Content-length: 44 SVN#" 4VMyou need to get past k-i Revision-number: 5274 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2005-02-08T12:40:51.824780Z K 7 svn:log V 76 Mention that a common reason for keys' being rejected is dodgy permissions. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c91315d39082ea498ebf9e42173ce134 Text-delta-base-sha1: 4ce92bd88024accabaf7240b58af1996427381c7 Text-content-length: 152 Text-content-md5: 5d258d2bf4aea75bc00f635a8e99b3fa Text-content-sha1: ecaffaeb0c14bfce887692b5297c5c12a2e51d69 Content-length: 152 SVNdf .8,Common errors include having the wrong permissions or ownership set on the public key or the user's home directory on the server Revision-number: 5275 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2005-02-08T13:24:49.753436Z K 7 svn:log V 46 Summary: PSFTP should have a "prompt" command K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/psftp-prompt Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 490 Text-content-md5: a5d7365fabb933598c445a8d865b3f98 Text-content-sha1: 12bb2283020166ab9d98aaffd881289347c3e2b8 Content-length: 500 PROPS-END SVN\\\Summary: PSFTP should have a "prompt" command Class: wish Difficulty: fun Priority: low Present-in: 2005-02-07 Content-type: text/plain From an e-mail: One helpful feature of the "classic" ftp client is the "prompt" command, which toggles interactive prompting on multiple commands. I.e. while it is sometimes to simply send all of *.pl, it is sometimes useful to only send a few, but easier to just type "mput *.pl" and then answer "yes" for those few that should be sent. Revision-number: 5276 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2005-02-08T14:13:57.301766Z K 7 svn:log V 63 We _really_ don't need to hear about WSAECONNABORTED any more. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5a25d77ea06d9d6b637de056c37c7e9f Text-delta-base-sha1: 79d868267925bc0cbe860b2124fa286bfffe7e84 Text-content-length: 488 Text-content-md5: 2d65657c03c17754ca5ea8594656fa88 Text-content-sha1: 0232aea962e6eb340e812df24d8db099443a24e4 Content-length: 488 SVNzJLuL qS{faq-connaborted} Do you want to hear about \q{Software caused connection abort}? In the documentation for PuTTY 0.53 and 0.53b, we mentioned that we'd like to hear about any occurrences of this error. Since the release of PuTTY 0.54, however, we've been convinced that this error doesn't indicate that PuTTY's doing anything wrong, and we don't need to hear about further occurrences. See \k{errors-connaborted} for our current documentation of this error Revision-number: 5277 Prop-content-length: 142 Content-length: 142 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-08T23:36:39.662225Z K 7 svn:log V 42 Remove sergei.cc mirrors at admin request PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3d0d7ac6b26151b48373d03d6f34c4a9 Text-delta-base-sha1: f00fff56475c1ad29010126fb76261aefad8485a Text-content-length: 32 Text-content-md5: 6284e6d10352e0d63405c7a09126fac9 Text-content-sha1: dd31aa6cc240104a00386cb3725ba1fa945150be Content-length: 32 SVN9l1Ml Revision-number: 5278 Prop-content-length: 119 Content-length: 119 K 7 svn:log V 19 Missing {Question} K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-09T15:42:28.025463Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2d65657c03c17754ca5ea8594656fa88 Text-delta-base-sha1: 0232aea962e6eb340e812df24d8db099443a24e4 Text-content-length: 81 Text-content-md5: 361d3705a9f7d57c31bf35baaafe2f8a Text-content-sha1: 15fdafd2eeaea01f2df86d943a2055ca884d3dee Content-length: 81 SVNJT 85{Question} Do you want to hear about \q{Software caused Revision-number: 5279 Prop-content-length: 321 Content-length: 321 K 7 svn:log V 220 Improve documentation of the SCP wildcard safety issue: in particular, mention that doing an SCP wildcard download into a clean directory is adequate protection against a malicious server trying to overwrite your files. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-02-09T15:57:07.467680Z PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: abbb09ef3ced74f0e16a1fca3659c02a Text-delta-base-sha1: 08260e6cb8de049f68da43380b0d85c2ea4ef981 Text-content-length: 409 Text-content-md5: 50aa0bd6ff144694ca295bc780e74740 Text-content-sha1: a928a932886d7522cd6bcc48f8b37c3b585b256d Content-length: 409 SVN oyE m\YDI\cq{terminal.c} when we requested a file called \cq{*.c}. If this is a wildcard, consider upgrading to SSH 2 or using the \cq{-unsafe} option. Renaming of this Alternatively, do any such download in a newly created empty directory. (Even in \q{unsafe} mode, PSCP will still protect you against the server trying to get out of that directory using pathnames including \cq{..}.) Revision-number: 5280 Prop-content-length: 423 Content-length: 423 K 7 svn:log V 323 Add some host key dialogue boxes. These still look a little rough around the edges and need to have all their controls properly aligned and spaced according to the HI guidelines. Also, fix store_host_key() so that it replaces a host key correctly when the host key has changed and the user opts to update the cached one. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-02-09T21:18:44.853409Z PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 40aed5db1ee69f4b13e83c9ac02f7cc4 Text-delta-base-sha1: 0276e1343e8db524bde8083a5406f7b9b55cec21 Text-content-length: 1200 Text-content-md5: ee983df56bd7b9cad9f60e409ab61d02 Text-content-sha1: 50d0ca75fce092cd0a866dd70f9210834cd43b9d Content-length: 1200 SVNI [k?0Cpappname; Str255 pfingerprint; Str255 pkeytype; Session *s = frontend; int ret, alertret; c2pstrcpy(pappname, appname); c2pstrcpy(pkeytype, keytype); c2pstrcpy(pfingerprint, fingerprint)ParamText(pappname, pkeytype, pfingerprint, NULL); alertret=CautionAlert(wWrong, NULL); if (alertret == 9) { /* Cancel */ goto cancel; } else if (alertret == 8) { /* Connect Just Once */ } else { /* Update Key */ store_host_key(host, port, keytype, keystr); } } if (ret == 1) { /* key was absent */ ParamText(pkeytype, pfingerprint, pappname, NULL); alertret=CautionAlert(wAbsent, NULL); if (alertret == 8) { /* Cancel */ goto cancel; } else if (alertret == 7) { /* Connect Just Once */ } else { /* Update Key */ store_host_key(host, port, keytype, keystr); } } return; cancel: /* * User chose "Cancel". Unfortunately, if I tear the * connection down here, Bad Things happen when I return. I * think this function should actually return something * telling the SSH code to abandon the connection. */ return; Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fd0ded366be316ab6b69357c0f76064b Text-delta-base-sha1: 9a836305ec6159c07dc57fcf7abc9eaece14138d Text-content-length: 2875 Text-content-md5: 0266f00e45b7071cc0fb6c4b8945af80 Text-content-sha1: 4645416704bdff51c6fb5b23fd26c492f39a3092 Content-length: 2875 SVNCrRBAbsent host key */ resource 'ALRT' (wAbsent, "absent", purgeable) { {32, 67, 332, 435}, wAbsent, beepStages, alertPositionMainScreen }; resource 'DITL' (wAbsent, "absent", purgeable) { { /* array DITLarray: 8 elements */ /* [1] */ {11, 72, 60, 357}, StaticText { disabled, "The server's host key is not cached. You " "have no guarantee that the server is the " "computer you think it is." }, /* [2] */ {65, 71, 113, 355}, StaticText { disabled, "The server's ^0 key fingerprint is:\n^1" }, /* [3] */ {121, 70, 172, 354}, StaticText { disabled, "If you trust this host, hit Add Key to add " "the key to ^2's cache and carry on " "connecting." }, /* [4] */ {178, 70, 226, 354}, StaticText { disabled, "If you want to carry on connecting just " "once, without adding the key to the cache, " "select Just Once." }, /* [5] */ {233, 69, 281, 353}, StaticText { disabled, "If you do not trust this host, hit Cancel " "to abandon the connection." }, /* [6] */ {285, 70, 303, 139}, Button { enabled, "Add Key" }, /* [7] */ {285, 214, 305, 288}, Button { enabled, "Just Once" }, /* [8] */ {284, 295, 304, 354}, Button { enabled, "Cancel" } } }; /* Wrong host key */ resource 'ALRT' (wWrong, "wrong", purgeable) { {32, 67, 422, 435}, wWrong, beepStages, alertPositionMainScreen }; resource 'DITL' (wWrong, "wrong", purgeable) { { /* array DITLarray: 9 elements */ /* [1] */ {7, 74, 23, 358}, StaticText { disabled, "WARNING - POTENTIAL SECURITY BREACH!" }, /* [2] */ {32, 72, 131, 357}, StaticText { disabled, "The server's host key does not match the " "one ^0 has cached. This means that either " "the server administrator has changed " "the host key, or you have actually connected " "to another computer pretending to be the " "server." }, /* [3] */ {142, 72, 190, 356}, StaticText { disabled, "The new ^1 key fingerprint is:\n^2" }, /* [4] */ {190, 73, 238, 357}, StaticText { disabled, "If you were expecting this change and " "trust the new key, hit Update Key to update " "^0's cache and continue connecting." }, /* [5] */ {246, 74, 294, 358}, StaticText { disabled, "If you want to carry on connecting just " "once, without adding the key to the cache, " "select Just Once." }, /* [6] */ {301, 74, 349, 358}, StaticText { disabled, "If you do not trust this host, hit Cancel " "to abandon the connection. This is the " "ONLY guaranteed safe choice." }, /* [7] */ {361, 76, 379, 163}, Button { enabled, "Update Key" }, /* [8] */ {360, 215, 380, 289}, Button { enabled, "Just Once" }, /* [9] */ {360, 298, 380, 357}, Button { enabled, "Cancel Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: baf7f9a19f4a0106a405d8912a5d1ad9 Text-delta-base-sha1: b1a6eb8ea57f1b6891683130c27d9f9475485ff2 Text-content-length: 76 Text-content-md5: 6d6d44955032712e722613547e563758 Text-content-sha1: a925493c7ffa0d25324a6569b794884c2705e00a Content-length: 76 SVNM 7=Y<#define wAbsent 135 #define wWrong 136 Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f138768c6750c93eeb7668a1ad339c3 Text-delta-base-sha1: 0cb72fa7348da85e9ae511687554af9437ccc06a Text-content-length: 237 Text-content-md5: 1f77f20fbbd8c09c9b20c95307afaaa5 Text-content-sha1: 43e018a98816f251138eff0bd22873eb5e7667a0 Content-length: 237 SVNl9J ;_ Handle reshandl reshandle = Get1NamedResource(FOUR_CHAR_CODE('TEXT'), presname); if (reshandle != NULL) { /* The resource exists, we're replacing a host key */ RemoveResource(reshandle); } Revision-number: 5281 Prop-content-length: 197 Content-length: 197 K 8 svn:date V 27 2005-02-10T00:16:59.721438Z K 7 svn:log V 97 Slightly gratuitous logeventf() crusade and purge of fixed-length buffers. Also a bonus sfree(). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cec0c0af4d9b0bccd80bebd0d18c994c Text-delta-base-sha1: 7148de03da214d3df27a59397dd5f73d679965ce Text-content-length: 2059 Text-content-md5: 75268f9842091d2ccd8a12e7d9b59ef5 Text-content-sha1: 42a2d4d3af120918c3a16de06bf8b59656ecb449 Content-length: 2059 SVN..nHwX8#Y&g+logeventf(ssh, "Server version: %s", s->vstring); sfreelogeventf(ssh, "Pageant has %d SSH1 keys", s->nkeys); for (s->keyi = 0; s->keyi < s->nkeys; s->keyi++) { logeventf(ssh, "Trying Pageant key #%d", s->keyi);char *msg = dupprintf("Key is of wrong type (%s)", key_type_to_str(type)); logevent(msg); c_write_str(ssh, msg); c_write_str(ssh, "\r\n"); sfree(msg_DATA, ss, len, PKTT_OTHER, PKT_END); } else { /* * The server has _both_ * BUG_CHOKES_ON_SSH1_IGNORE and * BUG_NEEDS_SSH1_PLAIN_PAXi+.JRU,^{a^pXXYT} cI}W[45Kqlogeventf(ssh, "Rejected remote port open request for %s:%d", pf.dhost, port); } else { logeventf(ssh, "Received remote port open request for %s:%d", pf.dhost, portlogeventf(ssh, "Port open failed: %s", essh->exitcode = ssh_pkt_getuint32(pktin); logeventf(ssh, "Server sent command exit status %d", ssh->exitcodemsg; int msglen; ssh_pkt_getstring(pktin, &msg, &msglen); logeventf(ssh, "Remote debug message: %.*s", msglen, msglogeventf(ssh, "Forwarded connection refused by server: %s [%.*s]", reasons[reason_code], reason_length, reason_stringlogeventf(ssh, "Pageant has %d SSH2 keys", s->nkeys); for (s->keyi = 0; s->keyi < s->nkeys; s->keyi++) { void *vret; logeventf(ssh, "Trying Pageant key #%d", s->keyi);msg_channel_data; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_channel_eof; ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_channel_close; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh2_msg_channel_open_confirmation; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_channel_open_failure; ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = ssh2_msg_channel_request; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_cha[@8qI$7logeventf(ssh, "Remote debug message: %.*s", msglen, msg Revision-number: 5282 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2005-02-10T01:03:08.140183Z K 7 svn:log V 147 ssh_setup_portfwd() should usually be looking at the new cfg, not the old one, so that changes to port visibility are honoured in new forwardings. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 75268f9842091d2ccd8a12e7d9b59ef5 Text-delta-base-sha1: 42a2d4d3af120918c3a16de06bf8b59656ecb449 Text-content-length: 348 Text-content-md5: 3706ea0859bac399f8588f5aa431885d Text-content-sha1: add6ba9dfe68e49ee22c85241d663d43cd3b7b84 Content-length: 348 SVN7 m3"&Np/* XXX: ssh->cfg.rport_acceptall may not represent * what was used to open the original connection, * since it's reconfigurable. */cfg->@?@dispatch[SSH2_MSG_CHANNEL_REQUEST] = ssh2_msg_channel_request; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_cha Revision-number: 5283 Prop-content-length: 243 Content-length: 243 K 8 svn:date V 27 2005-02-10T01:04:06.048841Z K 7 svn:log V 142 Document effect of settings changes on existing connections/forwardings. Also mention that service names can be used instead of port numbers. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d3c765120c7eb669ee56eaf85aad6846 Text-delta-base-sha1: a5c18c4834cf23ca555ff6fd427efe6645258335 Text-content-length: 1115 Text-content-md5: 46ff121fe8a94207f18356a4ab0472de Text-content-sha1: ea79e61d3e0433b945bd34ee5fa0c90cf3396a57 Content-length: 1115 SVNYr6go:Mqi;In place of port numbers, you can enter service names, if they are known to the local system. For instance, in the \q{Destination} box, you could enter \c{popserver.example.com:pop3} (see \k{using-changesettings}). If you delete a local or dynamic port forwarding in mid-session, PuTTY will stop listening for connections on that port, so it can be re-used by another If you delete a forwarding, any existing connections established using that forwarding remain open. Similarly, changes to global settings such as \q{Local ports accept connections from other hosts} only take effect on new forwardings MDD ost} The source port for a forwarded connection usually does not accept connections from any machine except the SSH client or server machine itself (for local and remote forwardings respectively). There are controls in the Tunnels panel to change this: \b The \q{Local ports accept connections from other hosts} option allows you to set up local-to-remote port forwardings in such a way that machines other than your client PC can connect to the forw Revision-number: 5284 Prop-content-length: 197 Content-length: 197 K 8 svn:date V 27 2005-02-10T01:25:50.563611Z K 7 svn:log V 97 Mention saving mid-session and some of its wrinkles. Formatting tweaks in the same general area. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 46ff121fe8a94207f18356a4ab0472de Text-delta-base-sha1: ea79e61d3e0433b945bd34ee5fa0c90cf3396a57 Text-content-length: 715 Text-content-md5: 81cd81060974e4108121a1e1ee8daf29 Text-content-sha1: 89fa2509a2041e95ffb595ef9fcb9ba7223b3ac2 Content-length: 715 SVNDc#c;\lcont{}lcont{ You can also save settings in mid-session, from the \q{Change Settings} dialog. Settings changed since the start of the session will be saved with their current values; as well as settings changed through the dialog, this includes changes in window size, window title changes sent by the server, and so on. }.MIIMxisting connections established using that forwarding remain open. Similarly, changes to global settings such as \q{Local ports accept connections from other hosts} only take effect on new forwardings. \S{config-ssh-portfwd-localhost} Controlling the visibility of forwarded ports \cfg{winhelp-topic}{ssh.tunnels.portfwd.localh Revision-number: 5285 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2005-02-10T11:56:52.579916Z K 7 svn:log V 17 mirrors.bevc.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6284e6d10352e0d63405c7a09126fac9 Text-delta-base-sha1: dd31aa6cc240104a00386cb3725ba1fa945150be Text-content-length: 84 Text-content-md5: a09594768eceb733e5d2f4656771041e Text-content-sha1: c6a2737e401fc491711cd60f7cefc0c78b570377 Content-length: 84 SVNl`9.A84mirrors.bevc.net/putty/">mirrors.bevc.net in Slovenia Revision-number: 5286 Prop-content-length: 245 Content-length: 245 K 8 svn:date V 27 2005-02-10T19:39:27.658391Z K 7 svn:log V 144 Mention the SSH-2 GSSAPI draft. Attempt to review the salient features of the various patches we've been sent. Other fleshing out and tweaking. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f1501ec2530ed4778db54a7d038c1d25 Text-delta-base-sha1: 8651a999b8671fd4c4e7170de0c2d620cd6083b3 Text-content-length: 1796 Text-content-md5: f31ff17e86befcf0a09d68b16bdaf95d Text-content-sha1: d049d3f02715d7e1f83a2aa1f8d4db3ede55ef45 Content-length: 1796 SVN)_I[VxhSummary: Support for GSSAPI (for Kerberos, GSI, etc) Class: wish Priority: low Difficulty: taxing Content-type: text/x-html-body

      We occasionally get requests for Kerberos and/or GSSAPI support.

      This looks complicated and messy, and isn't that important to us, so we're rather unlikely to add it ourselves.

      Any proposed solution should take into account our design guidelines to be even considered for inclusion. In particular, some submissions have not taken into account PuTTY's cross-platform nature; there is an expired Internet-Draft (draft-ietf-secsh-gsskeyex-08) describing GSSAPI key exchange and user authentication. (Some of the patches here appear to be based on earlier versions of this specification, for instance the userauth method "gssapi".)

      p>Patches we've seen:

        MIT Kerberos library; Win2K/XP can use Microsoft SSPI.
      • Another patch (unreviewed): 1067597353.3fa23e29bf70c@webmail.technion.ac.il
        User authentication; secur32.lib (Windows) / krb5-config (Unix)
      • Another patch here adds support for GSSAPI user authentication using the MIT Kerberos library. (A previous version of this patch has been reviewed and found wanting.)
      • Yet another patch, at vintela.com
        3-term BSD licence; GSSAPI (Kerberos-specific?) user authentication using MS SSPI; not thoroughly reviewed but doesn't look hopeful
      Revision-number: 5287 Prop-content-length: 112 Content-length: 112 K 7 svn:log V 12 missing K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-11T12:26:26.894529Z PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f31ff17e86befcf0a09d68b16bdaf95d Text-delta-base-sha1: d049d3f02715d7e1f83a2aa1f8d4db3ede55ef45 Text-content-length: 22 Text-content-md5: 8e6ab32543b725b8e75b84871a4cc2aa Text-content-sha1: e852a72fc23d50b3a9a2cdaa19c85c2078764999 Content-length: 22 SVN [6[/ Revision-number: 5288 Prop-content-length: 245 Content-length: 245 K 7 svn:log V 145 Tidy up the host key alerts a little, and swap the Just Once and Cancel buttons so that they appear in the standard action and cancel positions. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-02-11T18:01:59.731586Z PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ee983df56bd7b9cad9f60e409ab61d02 Text-delta-base-sha1: 50d0ca75fce092cd0a866dd70f9210834cd43b9d Text-content-length: 111 Text-content-md5: 9022d0f635fbf677c446f805b4c44711 Text-content-sha1: 91363c6b5bc4ca788dfa6b67ce4b6ec326c373cf Content-length: 111 SVNCBB|k)=C'g8) { /* Cancel */ goto cancel; } else if (alertret == 97 Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0266f00e45b7071cc0fb6c4b8945af80 Text-delta-base-sha1: 4645416704bdff51c6fb5b23fd26c492f39a3092 Text-content-length: 778 Text-content-md5: 317e65f7976d8f7f5afec11f6b3dbef3 Text-content-sha1: 2413b69f0246caafee123466f041679af5b5b226 Content-length: 778 SVNrs\ "$CGr.|8+ iP}C IokJ[ 5moq7, 67, 33702, 113, 355}, StaticText { disabled, "The server's ^0 key fingerprint is:\n^1" }, /* [3] */ {121, 72272, 2775, 72, 295, 139}, Button { enabled, "Add Key" }, /* [7] */ {275, 217, 295, 277}, Button { enabled, "Cancel" }, /* [8] */ {275, 290, 295, 360}, Button { enabled, "Just Once10, 72, 263622, 294, 3586] */ {301, 72, 349, 358 This is the " "ONLY guaranteed safe choice." }, /* [7] */ {360, 72, 380, 163}, Button { enabled, "Update Key" }, /* [8] */ {360, 217, 380, 277}, Button { enabled, "Cancel" }, /* [9] */ {360, 290, 380, 360}, Button { enabled, "Just Once Revision-number: 5289 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:19.981235Z PROPS-END Revision-number: 5290 Prop-content-length: 110 Content-length: 110 K 8 svn:date V 27 2005-02-11T22:52:04.120595Z K 7 svn:log V 10 lk to FAQ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/osc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5df81ccf9e1bc5e4c018cd4a1c32e57a Text-delta-base-sha1: 0d97fb26f8baf1342ae5ab7920216c489771dd61 Text-content-length: 66 Text-content-md5: 7d51c208a2c5a654f7aba6ba1f37205a Text-content-sha1: c9d78331bf0d246562e79b05692a4da24ae8f58e Content-length: 66 SVN3U -FbQ the FAQ). Revision-number: 5291 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2005-02-13T00:00:59.217833Z K 7 svn:log V 46 Display panel titles and grouping box titles. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4930e5d08eba031ed648b6be2f2d4435 Text-delta-base-sha1: eec333e99af844f4d40c2d81c5048f10b66c4076 Text-content-length: 517 Text-content-md5: 008ed4a7b7225106332e9f1215e4514f Text-content-sha1: 632f20f81ce600d3dfe63222473eeafd4e55b8f6 Content-length: 517 SVNN> j(j,"/* Draw a title, if we have one. */ if (!s->boxname && s->boxtitle) { union control c; c.text.label = dupstr(s->boxtitle); macctrl_text(mcs, window, &cols[0], &c); /* FIXME: should be highlighted, centred or boxed */ } /* Start a containing box, if we have a boxname. */ /* FIXME: draw a box, not just its title */ if (s->boxname && *s->boxname && s->boxtitle) { union control c; c.text.label = dupstr(s->boxtitle); macctrl_text(mcs, window, &cols[0], &c); } Revision-number: 5292 Prop-content-length: 263 Content-length: 263 K 8 svn:date V 27 2005-02-14T07:41:41.054743Z K 7 svn:log V 162 Saw uxcfg.c in half down the middle, to separate out config changes that apply to all Unix-like systems from those which apply specifically to the GTK front end. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6763505dfa783e9a093b17306ba89159 Text-delta-base-sha1: 970889263a5f5e94388528531f7a9f7700edce17 Text-content-length: 66 Text-content-md5: efa766ed0f68155796122a3611058c0c Text-content-sha1: 07236e18431bed01eb245ead2d509321b39a666a Content-length: 66 SVN_f -)Ogtkcfg uxcfg uxucs uxprint + xkeysym Node-path: putty/unix/gtkcfg.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 4622 Text-content-md5: 5319843c8da0e8e2a86bc668ef30eb35 Text-content-sha1: aa886c01c1989a1aab6522f7d8447f72d6a51147 Content-length: 4632 PROPS-END SVN/* * gtkcfg.c - the GTK-specific parts of the PuTTY configuration * box. */ #include #include #include "putty.h" #include "dialog.h" #include "storage.h" static void about_handler(union control *ctrl, void *dlg, void *data, int event) { if (event == EVENT_ACTION) { about_box(ctrl->generic.context.p); } } void gtk_setup_config_box(struct controlbox *b, int midsession, void *win) { struct controlset *s, *s2; union control *c; int i; if (!midsession) { /* * Add the About button to the standard panel. */ s = ctrl_getset(b, "", "", ""); c = ctrl_pushbutton(s, "About", 'a', HELPCTX(no_help), about_handler, P(win)); c->generic.column = 0; } /* * GTK makes it rather easier to put the scrollbar on the left * than Windows does! */ s = ctrl_getset(b, "Window", "scrollback", "Control the scrollback in the window"); ctrl_checkbox(s, "Scrollbar on left", 'l', HELPCTX(no_help), dlg_stdcheckbox_handler, I(offsetof(Config,scrollbar_on_left))); /* * Really this wants to go just after `Display scrollbar'. See * if we can find that control, and do some shuffling. */ for (i = 0; i < s->ncontrols; i++) { c = s->ctrls[i]; if (c->generic.type == CTRL_CHECKBOX && c->generic.context.i == offsetof(Config,scrollbar)) { /* * Control i is the scrollbar checkbox. * Control s->ncontrols-1 is the scrollbar-on-left one. */ if (i < s->ncontrols-2) { c = s->ctrls[s->ncontrols-1]; memmove(s->ctrls+i+2, s->ctrls+i+1, (s->ncontrols-i-2)*sizeof(union control *)); s->ctrls[i+1] = c; } break; } } /* * X requires three more fonts: bold, wide, and wide-bold; also * we need the fiddly shadow-bold-offset control. This would * make the Window/Appearance panel rather unwieldy and large, * so I think the sensible thing here is to _move_ this * controlset into a separate Window/Fonts panel! */ s2 = ctrl_getset(b, "Window/Appearance", "font", "Font settings"); /* Remove this controlset from b. */ for (i = 0; i < b->nctrlsets; i++) { if (b->ctrlsets[i] == s2) { memmove(b->ctrlsets+i, b->ctrlsets+i+1, (b->nctrlsets-i-1) * sizeof(*b->ctrlsets)); b->nctrlsets--; break; } } ctrl_settitle(b, "Window/Fonts", "Options controlling font usage"); s = ctrl_getset(b, "Window/Fonts", "font", "Fonts for displaying non-bold text"); ctrl_fontsel(s, "Font used for ordinary text", 'f', HELPCTX(no_help), dlg_stdfontsel_handler, I(offsetof(Config,font))); ctrl_fontsel(s, "Font used for wide (CJK) text", 'w', HELPCTX(no_help), dlg_stdfontsel_handler, I(offsetof(Config,widefont))); s = ctrl_getset(b, "Window/Fonts", "fontbold", "Fonts for displaying bolded text"); ctrl_fontsel(s, "Font used for bolded text", 'b', HELPCTX(no_help), dlg_stdfontsel_handler, I(offsetof(Config,boldfont))); ctrl_fontsel(s, "Font used for bold wide text", 'i', HELPCTX(no_help), dlg_stdfontsel_handler, I(offsetof(Config,wideboldfont))); ctrl_checkbox(s, "Use shadow bold instead of bold fonts", 'u', HELPCTX(no_help), dlg_stdcheckbox_handler, I(offsetof(Config,shadowbold))); ctrl_text(s, "(Note that bold fonts or shadow bolding are only" " used if you have not requested bolding to be done by" " changing the text colour.)", HELPCTX(no_help)); ctrl_editbox(s, "Horizontal offset for shadow bold:", 'z', 20, HELPCTX(no_help), dlg_stdeditbox_handler, I(offsetof(Config,shadowboldoffset)), I(-1)); /* * Markus Kuhn feels, not totally unreasonably, that it's good * for all applications to shift into UTF-8 mode if they notice * that they've been started with a LANG setting dictating it, * so that people don't have to keep remembering a separate * UTF-8 option for every application they use. Therefore, * here's an override option in the Translation panel. */ s = ctrl_getset(b, "Window/Translation", "trans", "Character set translation on received data"); ctrl_checkbox(s, "Override with UTF-8 if locale says so", 'l', HELPCTX(translation_utf8_override), dlg_stdcheckbox_handler, I(offsetof(Config,utf8_override))); } Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 52dcaafdbbca23ea319305b0b4fca09d Text-delta-base-sha1: d657ac8ebeadf3b39124e0e03623c4eccad0eca9 Text-content-length: 33 Text-content-md5: 824495e9a5abea0e7ba73808b2dc2d80 Text-content-sha1: f235fc884ced707c782168dea534dd5eb39037cf Content-length: 33 SVNe f/6 gtk Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e0aa838688431cf80b9eb4bb1a838b6 Text-delta-base-sha1: 4f34ce25c556f0f87e8273421504dacf04b8db4a Text-content-length: 42 Text-content-md5: 7fb8b2e810463712f1941c76405d1b2e Text-content-sha1: 59db889c4121bbb787014eb7dfa557b2ebd1ed64 Content-length: 42 SVNnM + a gtkcfg.c */ void gtk Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1493210bc9d9eb5a400ca45354dd5c4f Text-delta-base-sha1: a6d94ce5301f24cfe2558d98076668f98931004d Text-content-length: 53 Text-content-md5: 87b2f4587ffc93ebe29b19ea8a41b7c6 Text-content-sha1: 066de053ccbba0b7502041e5f5e202bcca6f18e6 Content-length: 53 SVNf6f]qQwo; union control *c; Revision-number: 5293 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2005-02-14T07:44:50.551192Z K 7 svn:log V 98 Oh, and (there's always one) remove the unnecessary extra parameter from unix_setup_config_box(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 824495e9a5abea0e7ba73808b2dc2d80 Text-delta-base-sha1: f235fc884ced707c782168dea534dd5eb39037cf Text-content-length: 25 Text-content-md5: 91f0f559e2d2686531eab9962fcce28a Text-content-sha1: d83f4496093f1d948bc5fbf4e862eb39c0c4db6c Content-length: 25 SVN [9c Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fb8b2e810463712f1941c76405d1b2e Text-delta-base-sha1: 59db889c4121bbb787014eb7dfa557b2ebd1ed64 Text-content-length: 20 Text-content-md5: e1e3fb791665156fc4f4575dbabef8cc Text-content-sha1: c1d91682a06e55791c6363cb2e7b068d93c945e6 Content-length: 20 SVNM? (% Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 87b2f4587ffc93ebe29b19ea8a41b7c6 Text-delta-base-sha1: 066de053ccbba0b7502041e5f5e202bcca6f18e6 Text-content-length: 20 Text-content-md5: f24a55e82f457d601b6cba69bd075228 Text-content-sha1: bc6ccc66f7c1a1369537bb5fcc26ff819b25832d Content-length: 20 SVN u Revision-number: 5294 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2005-02-14T08:19:36.053114Z K 7 svn:log V 40 putty.trexle.com mv carbonstudios.co.uk K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a09594768eceb733e5d2f4656771041e Text-delta-base-sha1: c6a2737e401fc491711cd60f7cefc0c78b570377 Text-content-length: 176 Text-content-md5: 9246b56f83158681b34959c83abdfc5c Text-content-sha1: 8f780297b6418b41e136c2bfe11869757e03f5ac Content-length: 176 SVN`R:Ou2IxIx @putty.carbonstudios.co.uk/">putty.carbonstudiosputty.trexle.com/">putty.trexle.comwww.mirrormonster.com/putty-ssh/">mirrormonster.com Revision-number: 5295 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2005-02-14T08:55:55.739365Z K 7 svn:log V 84 Given that this used to work, and now doesn't, I think we can classify it as a bug. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win95-resolution Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0532fc0907f55fc988eb12a86009ea81 Text-delta-base-sha1: 01dfa91a7e4c4ddc2d41ab7909327ceeca81200e Text-content-length: 29 Text-content-md5: a0ad007fbb47b0cbb97b2370fee795c8 Text-content-sha1: 722de42660183e0a29daaf6157c0c55753a3d151 Content-length: 29 SVNHS L}KClass: bug Revision-number: 5296 Prop-content-length: 206 Content-length: 206 K 8 svn:date V 27 2005-02-14T11:07:52.207031Z K 7 svn:log V 105 WSAECONNABORTED: Soften claims + emphasise applicability to established connections, based on KB 819124. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d258d2bf4aea75bc00f635a8e99b3fa Text-delta-base-sha1: ecaffaeb0c14bfce887692b5297c5c12a2e51d69 Text-content-length: 68 Text-content-md5: c70e9b58895ad1cc5819603ca4216ffa Text-content-sha1: 5c865967c636f4bd8510a1fcd45b751218b6e51a Content-length: 68 SVNfi /Cwokills an established connection for some reason Revision-number: 5297 Prop-content-length: 505 Content-length: 505 K 8 svn:date V 27 2005-02-14T11:43:27.437577Z K 7 svn:log V 404 Martin Prikryl points out that we weren't always initialising new "addrinfo" members of Windows SockAddr_tag; particular in sk_nonamelookup() (proxy resolution at far end) this was causing trouble. Make sure they _always_ start out NULL (since the Windows getaddrinfo() documentation doesn't make any claims about initialisation), and also initialise 'naddresses' in sk_nonamelookup() for good measure. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 13e05706b017f909b671b84241dd421a Text-delta-base-sha1: 9862984f7dec8135fda3e14b90ef0c526d798418 Text-content-length: 162 Text-content-md5: 36b900fe3ad7110d8199dcb641c3c6e0 Text-content-sha1: b6896d2d681d8192cf626aaa620fc54b26491091 Content-length: 162 SVN.3E"DMJd#ifndef NO_IPV6 ret->ai = ret->ais = NULL; #endif#ifndef NO_IPV6 ret->ai = ret->ais = NULL; #endif ret->naddresses = 0 Revision-number: 5298 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2005-02-14T13:08:07.713263Z K 7 svn:log V 33 Have looked at the code slightly K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win95-resolution Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0ad007fbb47b0cbb97b2370fee795c8 Text-delta-base-sha1: 722de42660183e0a29daaf6157c0c55753a3d151 Text-content-length: 157 Text-content-md5: 35e5d8085da28ab0b686b450b97d1e74 Text-content-sha1: b38c3c3545c3acff76bb84c47564ffbde778c4bc Content-length: 157 SVNS_ HAI (JTN) have had a brief look at the 0.56 name resolution code and can't see anything obviously wrong or potentially dubious about it Revision-number: 5299 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2005-02-14T15:03:32.044527Z K 7 svn:log V 136 Initialise (struct Socket_tag).connected in sk_newlistener() since Valgrind complained. (I _think_ this is the correct initialisation.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c651b322cb93d59874998cb3d7d4dacb Text-delta-base-sha1: 89346953079a39f3d3e49a7ca3108acd01f3e9a5 Text-content-length: 47 Text-content-md5: 749bc221ebf6b20670e91ff265d5b139 Text-content-sha1: de36467cf477eb0833c7de0978f1eb3a203d630b Content-length: 47 SVN$< LZJ ret->connected = 0 Revision-number: 5300 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2005-02-14T15:30:09.717759Z K 7 svn:log V 98 Initialise (struct Socket_tag).connected in sk_register(). Again, the value could do with review. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 749bc221ebf6b20670e91ff265d5b139 Text-delta-base-sha1: de36467cf477eb0833c7de0978f1eb3a203d630b Text-content-length: 46 Text-content-md5: 7602a95107477c0eaa6695fdb850ed78 Text-content-sha1: 6387586fea0d6b35ab2d80377601d43b0ec5fb6c Content-length: 46 SVNconnected = 1 Revision-number: 5301 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:20.645312Z PROPS-END Revision-number: 5302 Prop-content-length: 347 Content-length: 347 K 7 svn:log V 246 Extra note on "connection reset by peer" on Windows. Note default circumstances of cipher warning. (I haven't bothered with the similar kex warning since it doesn't come up in the default configuration, and is in any case unlikely to be common.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-15T12:35:59.738626Z PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c70e9b58895ad1cc5819603ca4216ffa Text-delta-base-sha1: 5c865967c636f4bd8510a1fcd45b751218b6e51a Text-content-length: 268 Text-content-md5: 0b371a8ab5c0e573ea2a1f4bfcfa3966 Text-content-sha1: 0a2b0981a49978bf2b3cdecfa27f150cfb1e87d5 Content-length: 268 SVNiZmFA'W By default, PuTTY puts up this warning only for single-DES encryptionNote that Windows can produce this error in some circumstances without seeing a connection reset from the server, for instance if the connection to the network is lost Revision-number: 5303 Prop-content-length: 516 Content-length: 516 K 7 svn:log V 415 The terminal window can now indicate that PuTTY is busy in various ways, by changing its mouse pointer. Currently this is only used in the (slightly- arbitrarily-defined) "heavy" bits of SSH-2 key exchange. We override pointer hiding while PuTTY is busy, but preserve pointer-hiding state. Not yet implemented on the Mac. Also switch to frobbing window-class cursor in Windows rather than relying on SetCursor(). K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-15T17:05:58.214603Z PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0244035630018454c18c2f7e06295d94 Text-delta-base-sha1: 202d8316245b711a37f2601423e475be21fb59f1 Text-content-length: 147 Text-content-md5: d5f3354aa9f6f40347aa2b3dbcb176d2 Text-content-sha1: 90388d4e7ddf5b1338f912f217070301d186020b Content-length: 147 SVN_b y~yktUsed by backend to indicate busy-ness */ void set_busy_status(void *frontend, int status) { /* FIXME do something */ Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e9551635b1e77f70a787be3b92426790 Text-delta-base-sha1: 7ddac9939baa64a8f97b98779935b0868f9ce7db Text-content-length: 507 Text-content-md5: 4dd4fa43017ab69ae7020610964e2575 Text-content-sha1: 783bbf2840a45dd88ab36117c402b2dab2598784 Content-length: 507 SVN]?_Z_W/* Hint from backend to frontend about time-consuming operations. * Initial state is assumed to be BUSY_NOT. */ enum { BUSY_NOT, /* Not busy, all user interaction OK */ BUSY_WAITING, /* Waiting for something; local event loops still running so some local interaction (e.g. menus) OK, but network stuff is suspended */ BUSY_CPU /* Locally busy (e.g. crypto); user interaction suspended */ }; void set_busy_status(void *frontend, int status Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3706ea0859bac399f8588f5aa431885d Text-delta-base-sha1: add6ba9dfe68e49ee22c85241d663d43cd3b7b84 Text-content-length: 776 Text-content-md5: 73992950a585d5a36cefac906f246734 Text-content-sha1: 2014a53c880de61f6d7676c6c3ae2056c1356dcb Content-length: 776 SVN&J7A?.Ch%}et_busy_status(ssh->frontend, BUSY_CPU); /* this can take a whileset_busy_status(ssh->frontend, BUSY_WAITING); /* wait for server */et_busy_status(ssh->frontend, BUSY_CPU); /* cogitate *//* We assume everything from now on will be quick, and it might * involve user interaction. */ set_busy_status(ssh->frontend, BUSY_NOT?%ff?data; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_channel_eof; ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_channel_close; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh2_msg_channel_open_confirmation; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_channel_open_failure; ssh->packet_ Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8113eb17c2b9b9a889b5cd853b79e6f2 Text-delta-base-sha1: 90acae5250b00c13ea24f46ff2b6ab1fa8d4af6e Text-content-length: 1686 Text-content-md5: 96c3e28dda3f65c963e9da4d90351606 Text-content-sha1: b057fdb5b6a0fe716cd93d3edefd9898590623df Content-length: 1686 SVN<-TKT[SsoB%,JE{>>/{waitint busy_statusupdate_mouseptr(struct gui_data *inst) { switch (inst->busy_status) { case BUSY_NOT: if (!inst->mouseptr_visible) { gdk_window_set_cursor(inst->area->window, inst->blankcursor); } else if (send_raw_mouse) { gdk_window_set_cursor(inst->area->window, inst->rawcursor); } else { gdk_window_set_cursor(inst->area->window, inst->textcursor); } break; case BUSY_WAITING: /* XXX can we do better? */ case BUSY_CPU: /* We always display these cursors. */ gdk_window_set_cursor(inst->area->window, inst->waitcursor); break; default: assert(0); }nst->mouseptr_visible = show; update_mouseptr(inst)void set_busy_status(void *frontend, int status) { struct gui_data *inst = (struct gui_data *)frontend; inst->busy_status = status; update_mouseptr(inst)update_mouseptr(inst); } void request_resize(void *frontend, int w, int h inst->busy_status = BUSY_NOT;)>specialsitem2 = menuitem; gtk_widget_hide(inst->specialsitem1); gtk_widget_hide(inst->specialsitem2); MKMENUITEM("Clear Scrollback", clear_scrollback_menuitem); MKMENUITEM("Reset Terminal", reset_terminal_menuitem); MKMENUITEM("Copy All", copy_all_menuitem); MKMENUITEM(NULL, NULL); s = dupcat("About ", appname, NULL); MKMENUITEM(s, about_menuitem); sfree(s); #undef MKMENUITEM } inst->textcursor = make_mouse_ptr(inst, GDK_XTERM); inst->rawcursor = make_mouse_ptr(inst, GDK_LEFT_PTR); inst->waitcursor = make_mouse_ptr(inst, GDK_WATCH); inst->blankcursor = make_mouse_ptr(inst, -1); make_mouse_ptr(inst, -2); / Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 70caca0cf9d341b9d5c8ed49b2c56056 Text-delta-base-sha1: aac4e5647a39ba62ec715c93aee847b879048021 Text-content-length: 66 Text-content-md5: 4f463fbcc981cd9b9c922b6afce74134 Text-content-sha1: 57777dd4721df89dd530aa8dd036d109600e1658 Content-length: 66 SVN,b -~7uset_busy_status(void *frontend, int status) { Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 93ee748a494deae17fe2ef17a5f8c121 Text-delta-base-sha1: 2d90da834aa3e8e937d5f45a56089c1d90f1f6dc Text-content-length: 66 Text-content-md5: ebc4cd35cb3590f9740b00461175ae7a Text-content-sha1: eebb763df7fd8be9dc91bdc6a7b0fa2ba1272c40 Content-length: 66 SVNQ -v.mset_busy_status(void *frontend, int status) { Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f467f462cc4a090030144c412409efa9 Text-delta-base-sha1: a52c7e194330af552b70392319df3cdc8b05635c Text-content-length: 2383 Text-content-md5: 4f362555e56cfec9f53e8005e02f62ec Text-content-sha1: e7df9e2e14205b0bfebd67d27d17e6ca8d10745f Content-length: 2383 SVN,a|XA & Zi+4,int busy_status = BUSY_NOTstatic void update_mouse_pointer(void) { LPTSTR curstype; int force_visible = FALSE; static int forced_visible = FALSE; switch (busy_status) { case BUSY_NOT: if (send_raw_mouse) curstype = IDC_ARROW; else curstype = IDC_IBEAM; break; case BUSY_WAITING: curstype = IDC_APPSTARTING; /* this may be an abuse */ force_visible = TRUE; break; case BUSY_CPU: curstype = IDC_WAIT; force_visible = TRUE; break; default: assert(0); } { HCURSOR cursor = LoadCursor(NULL, curstype); SetClassLong(hwnd, GCL_HCURSOR, (LONG)cursor); SetCursor(cursor); /* force redraw of cursor at current posn */ } if (force_visible != forced_visible) { /* We want some cursor shapes to be visible always. * Along with show_mouseptr(), this manages the ShowCursor() * counter such that if we switch back to a non-force_visible * cursor, the previous visibility state is restored. */ ShowCursor(force_visible); forced_visible = force_visible; } } void set_busy_status(void *frontend, int status) { busy_status = status; update_mouse_pointer();update_mouse_pointer(/* NB that the counter in ShowCursor() is also frobbed by * update_mouse_pointer() */Qq Q" HLMEIG"[code]); return p - output; } if (cfg.funky_type == FUNKY_SCO && /* SCO function keys */ code >= 11 && code <= 34) { char codes[] = "MNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@[\\]^_`{"; int index = 0; switch (wParam) { case VK_F1: index = 0; break; case VK_F2: index = 1; break; case VK_F3: index = 2; break; case VK_F4: index = 3; break; case VK_F5: index = 4; break; case VK_F6: index = 5; break; case VK_F7: index = 6; break; case VK_F8: index = 7; break; case VK_F9: index = 8; break; case VK_F10: index = 9; break; case VK_F11: index = 10; break; case VK_F12: index = 11; break; } if (keystate[VK_SHIFT] & 0x80) index += 12; if (keystate[VK_CONTROL] & 0x80) index += 24; p += sprintf((char *) p, "\x1B[%c", codes[index]); return p - output; } if (cfg.funky_type == FUNKY_SCO && /* SCO small keypad */ code >= 1 && code <= 6) { char codes[] = "HL.FIG"; if (code == 3) { *p++ = '\x Revision-number: 5304 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2005-02-15T19:10:44.219265Z K 7 svn:log V 122 Martin Radford points out that the default action for the host key confirmation dialogs should be "cancel", not "accept". K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a64c9391bbc2d892a9030c6520757da3 Text-delta-base-sha1: 38125d30cf6bad78a39b70489158dfe4b6a3dc5e Text-content-length: 70 Text-content-md5: 7f66601e1b99cda65dec0d28e5ce88e5 Text-content-sha1: 773963a2e1091ea5f2c8b59140e3b1b1a102425d Content-length: 70 SVN3 x(xxU> | MB_DEFBUTTON3 | MB_DEFBUTTON3 Revision-number: 5305 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2005-02-15T19:22:47.994090Z K 7 svn:log V 65 Add a couple of other sensible button defaults in MessageBox()s. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f66601e1b99cda65dec0d28e5ce88e5 Text-delta-base-sha1: 773963a2e1091ea5f2c8b59140e3b1b1a102425d Text-content-length: 64 Text-content-md5: 64af9e438f60d4b2ca345512be223b14 Text-content-sha1: fce983e63b3ab239478a977b96c4318aab39530f Content-length: 64 SVN3S hhhcP | MB_DEFBUTTON2 | MB_DEFBUTTON3 Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f362555e56cfec9f53e8005e02f62ec Text-delta-base-sha1: e7df9e2e14205b0bfebd67d27d17e6ca8d10745f Text-content-length: 81 Text-content-md5: a77917d0a1cc022ec9361bedb0ad7669 Text-content-sha1: 4a8e3aabec64627fe884cb57a3583f31abdae88c Content-length: 81 SVN ?-A | MB_DEFBUTTON2) qqr *) p, "\x1B%c", Revision-number: 5306 Prop-content-length: 229 Content-length: 229 K 7 svn:log V 128 Confirmed that the third instance is seeing the same error as the other two. Confirmed that this is still banjoed in snapshots. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-15T19:27:46.358691Z PROPS-END Node-path: putty-wishlist/data/win95-resolution Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35e5d8085da28ab0b686b450b97d1e74 Text-delta-base-sha1: b38c3c3545c3acff76bb84c47564ffbde778c4bc Text-content-length: 36 Text-content-md5: 1b01d3fc4f7520ac99e171deea567914 Text-content-sha1: d90a2735ca743fea8030fea798136d38ab3bad42 Content-length: 36 SVN_a |X 2005-02-14 Revision-number: 5307 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2005-02-15T20:46:03.806464Z K 7 svn:log V 15 putty.rdsbv.ro K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9246b56f83158681b34959c83abdfc5c Text-delta-base-sha1: 8f780297b6418b41e136c2bfe11869757e03f5ac Text-content-length: 113 Text-content-md5: b5bca191cf040d72b8facd2f8a0e8ce2 Text-content-sha1: b567834e3bcd10550d40e41568cf82e4b42d9344 Content-length: 113 SVNRIQAI{gkrdsbv.ro/mirrors/putty/">putty.rdsbv.ro in Romanialxnt.info/">putty.lxnt.info Revision-number: 5308 Prop-content-length: 692 Content-length: 692 K 8 svn:date V 27 2005-02-15T21:45:50.056767Z K 7 svn:log V 591 Initial checkin of a native Mac OS X port, sharing most of its code with the Unix port and layering a Cocoa GUI on top. The basics all work: there's a configuration panel and a terminal window, the timing interface works and the select interface functions. The same application can run both SSH (or other network) connections and local pty sessions, and multiple sessions in the same process are fully supported. However, it's horribly unfinished in a wide variety of other ways; anyone interested is invited to read README.OSX and wince at the length and content of its `unfinished' list. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: efa766ed0f68155796122a3611058c0c Text-delta-base-sha1: 07236e18431bed01eb245ead2d509321b39a666a Text-content-length: 516 Text-content-md5: 5250a789bb09df80d863c904fecb8f69 Text-content-sha1: 4a328674ddadc304561225b7cbece28b72291900 Content-length: 516 SVNf7AS}$Hy'cr]:;A Fo!makefile osx macosx/Makefile # Source directories. !srcdir charset/ !srcdir windows/ !srcdir unix/ !srcdir mac/ !srcdir macosx!begin osx CFLAGS += -DMACOSXuxcfg uxucs uxprint timing GTKTERM = UXTERM gtkwin gtkcfg gtkdlg gtkcols gtkpanel xkeysym OSXTERM = UXTERM osxwin osxdlg osxctrlsOSXMISC = MISC uxstore uxsel osxsel uxnetGTKGTKGTK PuTTY : [MX] osxmain OSXTERM OSXMISC CHARSET BE_ALL NONSSH UXSSH + ux_x11 uxpty uxsignal testback Node-path: putty/macosx Node-kind: dir Node-action: add Prop-content-length: 64 Content-length: 64 K 10 svn:ignore V 32 *.app puttygen plink psftp pscp PROPS-END Node-path: putty/macosx/Makefile Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 41639 Text-content-md5: 26201f56b4af202010ed8e852b699a2d Text-content-sha1: 6621a2c1d45c1dfa58c5d384533710927dfaf67c Content-length: 41649 PROPS-END SVN# Makefile for putty under Mac OS X. # # This file was created by `mkfiles.pl' from the `Recipe' file. # DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead. # # Extra options you can set: # # - VER=-DSNAPSHOT=1999-01-25 # Generates executables whose About box report them as being a # development snapshot. # # - VER=-DRELEASE=0.43 # Generates executables whose About box report them as being a # release version. # # - COMPAT=-DAUTO_WINSOCK # Causes PuTTY to assume that includes its own WinSock # header file, so that it won't try to include . # # - COMPAT=-DWINSOCK_TWO # Causes the PuTTY utilities to include instead of # , except Plink which _needs_ WinSock 2 so it already # does this. # # - COMPAT=-DNO_SECURITY # Disables Pageant's use of , which is not available # with some development environments (such as older versions of # the Cygwin/mingw GNU toolchain). This means that Pageant # won't care about the local user ID of processes accessing it; a # version of Pageant built with this option will therefore refuse # to run under NT-series OSes on security grounds (although it # will run fine on Win95-series OSes where there is no access # control anyway). # # - COMPAT=-DNO_MULTIMON # Disables PuTTY's use of , which is not available # with some development environments. This means that PuTTY's # full-screen mode (configurable to work on Alt-Enter) will # not behave usefully in a multi-monitor environment. # # Note that this definition is always enabled in the Cygwin # build, since at the time of writing this is # known not to be available in Cygwin. # # - COMPAT=-DNO_IPV6 # Disables PuTTY's ability to make IPv6 connections, enabling # it to compile under development environments which do not # support IPv6 in their header files. # # - COMPAT=-DMSVC4 # - RCFL=-DMSVC4 # Makes a couple of minor changes so that PuTTY compiles using # MSVC 4. You will also need /DNO_SECURITY and /DNO_MULTIMON. # # - RCFL=-DASCIICTLS # Uses ASCII rather than Unicode to specify the tab control in # the resource file. Probably most useful when compiling with # Cygnus/mingw32, whose resource compiler may have less of a # problem with it. # # - XFLAGS=-DTELNET_DEFAULT # Causes PuTTY to default to the Telnet protocol (in the absence # of Default Settings and so on to the contrary). Normally PuTTY # will default to SSH. # # - XFLAGS=-DDEBUG # Causes PuTTY to enable internal debugging. # # - XFLAGS=-DMALLOC_LOG # Causes PuTTY to emit a file called putty_mem.log, logging every # memory allocation and free, so you can track memory leaks. # # - XFLAGS=-DMINEFIELD # Causes PuTTY to use a custom memory allocator, similar in # concept to Electric Fence, in place of regular malloc(). Wastes # huge amounts of RAM, but should cause heap-corruption bugs to # show up as GPFs at the point of failure rather than appearing # later on as second-level damage. # CC = $(TOOLPATH)gcc CFLAGS = -O2 -Wall -Werror -g -I.././ -I../charset/ -I../windows/ -I../unix/ \ -I../mac/ -I../macosx/ MLDFLAGS = -framework Cocoa ULDFLAGS = all: PuTTY plink pscp psftp puttygen CFLAGS += -DMACOSX PuTTY.app: mkdir -p $@ PuTTY.app/Contents: PuTTY.app mkdir -p $@ PuTTY.app/Contents/MacOS: PuTTY.app/Contents mkdir -p $@ PuTTY: PuTTY.app/Contents/MacOS/PuTTY $(PuTTY_extra) PuTTY.app/Contents/MacOS/PuTTY: PuTTY.app/Contents/MacOS be_all.o config.o \ cproxy.o dialog.o fromucs.o ldisc.o ldiscucs.o localenc.o \ logging.o macenc.o mimeenc.o minibidi.o misc.o osxctrls.o \ osxdlg.o osxmain.o osxsel.o osxwin.o pinger.o portfwd.o \ proxy.o raw.o rlogin.o sbcs.o sbcsdat.o settings.o slookup.o \ ssh.o sshaes.o sshblowf.o sshbn.o sshcrc.o sshcrcda.o \ sshdes.o sshdh.o sshdss.o sshmd5.o sshpubk.o sshrand.o \ sshrsa.o sshsh512.o sshsha.o sshzlib.o telnet.o terminal.o \ testback.o time.o timing.o toucs.o tree234.o utf8.o ux_x11.o \ uxagentc.o uxcfg.o uxmisc.o uxnet.o uxnoise.o uxprint.o \ uxproxy.o uxpty.o uxsel.o uxsignal.o uxstore.o uxucs.o \ version.o wcwidth.o wildcard.o x11fwd.o xenc.o $(CC) $(MLDFLAGS) -o $@ be_all.o config.o cproxy.o dialog.o \ fromucs.o ldisc.o ldiscucs.o localenc.o logging.o macenc.o \ mimeenc.o minibidi.o misc.o osxctrls.o osxdlg.o osxmain.o \ osxsel.o osxwin.o pinger.o portfwd.o proxy.o raw.o rlogin.o \ sbcs.o sbcsdat.o settings.o slookup.o ssh.o sshaes.o \ sshblowf.o sshbn.o sshcrc.o sshcrcda.o sshdes.o sshdh.o \ sshdss.o sshmd5.o sshpubk.o sshrand.o sshrsa.o sshsh512.o \ sshsha.o sshzlib.o telnet.o terminal.o testback.o time.o \ timing.o toucs.o tree234.o utf8.o ux_x11.o uxagentc.o \ uxcfg.o uxmisc.o uxnet.o uxnoise.o uxprint.o uxproxy.o \ uxpty.o uxsel.o uxsignal.o uxstore.o uxucs.o version.o \ wcwidth.o wildcard.o x11fwd.o xenc.o plink: be_all.o cmdline.o cproxy.o ldisc.o logging.o misc.o pinger.o \ portfwd.o proxy.o raw.o rlogin.o settings.o ssh.o sshaes.o \ sshblowf.o sshbn.o sshcrc.o sshcrcda.o sshdes.o sshdh.o \ sshdss.o sshmd5.o sshpubk.o sshrand.o sshrsa.o sshsh512.o \ sshsha.o sshzlib.o telnet.o time.o timing.o tree234.o \ ux_x11.o uxagentc.o uxcons.o uxmisc.o uxnet.o uxnoise.o \ uxplink.o uxproxy.o uxsel.o uxsignal.o uxstore.o version.o \ wildcard.o x11fwd.o $(CC) $(ULDFLAGS) -o $@ be_all.o cmdline.o cproxy.o ldisc.o \ logging.o misc.o pinger.o portfwd.o proxy.o raw.o rlogin.o \ settings.o ssh.o sshaes.o sshblowf.o sshbn.o sshcrc.o \ sshcrcda.o sshdes.o sshdh.o sshdss.o sshmd5.o sshpubk.o \ sshrand.o sshrsa.o sshsh512.o sshsha.o sshzlib.o telnet.o \ time.o timing.o tree234.o ux_x11.o uxagentc.o uxcons.o \ uxmisc.o uxnet.o uxnoise.o uxplink.o uxproxy.o uxsel.o \ uxsignal.o uxstore.o version.o wildcard.o x11fwd.o pscp: be_none.o cmdline.o cproxy.o int64.o logging.o misc.o pinger.o \ portfwd.o proxy.o pscp.o settings.o sftp.o ssh.o sshaes.o \ sshblowf.o sshbn.o sshcrc.o sshcrcda.o sshdes.o sshdh.o \ sshdss.o sshmd5.o sshpubk.o sshrand.o sshrsa.o sshsh512.o \ sshsha.o sshzlib.o time.o timing.o tree234.o uxagentc.o \ uxcons.o uxmisc.o uxnet.o uxnoise.o uxproxy.o uxsel.o \ uxsftp.o uxstore.o version.o wildcard.o x11fwd.o $(CC) $(ULDFLAGS) -o $@ be_none.o cmdline.o cproxy.o int64.o \ logging.o misc.o pinger.o portfwd.o proxy.o pscp.o \ settings.o sftp.o ssh.o sshaes.o sshblowf.o sshbn.o sshcrc.o \ sshcrcda.o sshdes.o sshdh.o sshdss.o sshmd5.o sshpubk.o \ sshrand.o sshrsa.o sshsh512.o sshsha.o sshzlib.o time.o \ timing.o tree234.o uxagentc.o uxcons.o uxmisc.o uxnet.o \ uxnoise.o uxproxy.o uxsel.o uxsftp.o uxstore.o version.o \ wildcard.o x11fwd.o psftp: be_none.o cmdline.o cproxy.o int64.o logging.o misc.o pinger.o \ portfwd.o proxy.o psftp.o settings.o sftp.o ssh.o sshaes.o \ sshblowf.o sshbn.o sshcrc.o sshcrcda.o sshdes.o sshdh.o \ sshdss.o sshmd5.o sshpubk.o sshrand.o sshrsa.o sshsh512.o \ sshsha.o sshzlib.o time.o timing.o tree234.o uxagentc.o \ uxcons.o uxmisc.o uxnet.o uxnoise.o uxproxy.o uxsel.o \ uxsftp.o uxstore.o version.o wildcard.o x11fwd.o $(CC) $(ULDFLAGS) -o $@ be_none.o cmdline.o cproxy.o int64.o \ logging.o misc.o pinger.o portfwd.o proxy.o psftp.o \ settings.o sftp.o ssh.o sshaes.o sshblowf.o sshbn.o sshcrc.o \ sshcrcda.o sshdes.o sshdh.o sshdss.o sshmd5.o sshpubk.o \ sshrand.o sshrsa.o sshsh512.o sshsha.o sshzlib.o time.o \ timing.o tree234.o uxagentc.o uxcons.o uxmisc.o uxnet.o \ uxnoise.o uxproxy.o uxsel.o uxsftp.o uxstore.o version.o \ wildcard.o x11fwd.o puttygen: cmdgen.o import.o misc.o notiming.o sshaes.o sshbn.o sshdes.o \ sshdss.o sshdssg.o sshmd5.o sshprime.o sshpubk.o sshrand.o \ sshrsa.o sshrsag.o sshsh512.o sshsha.o time.o tree234.o \ uxcons.o uxgen.o uxmisc.o uxnoise.o uxstore.o version.o $(CC) $(ULDFLAGS) -o $@ cmdgen.o import.o misc.o notiming.o sshaes.o \ sshbn.o sshdes.o sshdss.o sshdssg.o sshmd5.o sshprime.o \ sshpubk.o sshrand.o sshrsa.o sshrsag.o sshsh512.o sshsha.o \ time.o tree234.o uxcons.o uxgen.o uxmisc.o uxnoise.o \ uxstore.o version.o be_all.o: ../be_all.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< be_none.o: ../be_none.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< be_nossh.o: ../be_nossh.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< cmdgen.o: ../cmdgen.c ../putty.h ../ssh.h ../puttyps.h ../network.h \ ../misc.h ../puttymem.h ../int64.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../tree234.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< cmdline.o: ../cmdline.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< config.o: ../config.c ../putty.h ../dialog.h ../storage.h ../puttyps.h \ ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< cproxy.o: ../cproxy.c ../putty.h ../ssh.h ../network.h ../proxy.h \ ../puttyps.h ../misc.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< dialog.o: ../dialog.c ../putty.h ../dialog.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< fromucs.o: ../charset/fromucs.c ../charset/charset.h ../charset/internal.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< gtkcfg.o: ../unix/gtkcfg.c ../putty.h ../dialog.h ../storage.h ../puttyps.h \ ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< gtkcols.o: ../unix/gtkcols.c ../unix/gtkcols.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< gtkdlg.o: ../unix/gtkdlg.c ../unix/gtkcols.h ../unix/gtkpanel.h ../putty.h \ ../storage.h ../dialog.h ../tree234.h ../puttyps.h \ ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< gtkpanel.o: ../unix/gtkpanel.c ../unix/gtkpanel.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< gtkwin.o: ../unix/gtkwin.c ../putty.h ../terminal.h ../puttyps.h \ ../network.h ../misc.h ../tree234.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< import.o: ../import.c ../putty.h ../ssh.h ../misc.h ../puttyps.h \ ../network.h ../puttymem.h ../int64.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../tree234.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< int64.o: ../int64.c ../int64.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< ldisc.o: ../ldisc.c ../putty.h ../terminal.h ../ldisc.h ../puttyps.h \ ../network.h ../misc.h ../tree234.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< ldiscucs.o: ../ldiscucs.c ../putty.h ../terminal.h ../ldisc.h ../puttyps.h \ ../network.h ../misc.h ../tree234.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< localenc.o: ../charset/localenc.c ../charset/charset.h ../charset/internal.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< logging.o: ../logging.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< mac.o: ../mac/mac.c ../mac/macresid.h ../putty.h ../ssh.h ../terminal.h \ ../mac/mac.h ../puttyps.h ../network.h ../misc.h \ ../puttymem.h ../int64.h ../tree234.h ../charset/charset.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macabout.o: ../mac/macabout.c ../putty.h ../mac/mac.h ../mac/macresid.h \ ../puttyps.h ../network.h ../misc.h ../charset/charset.h \ ../tree234.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h \ ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macctrls.o: ../mac/macctrls.c ../putty.h ../mac/mac.h ../mac/macresid.h \ ../dialog.h ../tree234.h ../puttyps.h ../network.h ../misc.h \ ../charset/charset.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h \ ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macdlg.o: ../mac/macdlg.c ../putty.h ../dialog.h ../mac/mac.h \ ../mac/macresid.h ../storage.h ../puttyps.h ../network.h \ ../misc.h ../charset/charset.h ../tree234.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macenc.o: ../charset/macenc.c ../charset/charset.h ../charset/internal.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macevlog.o: ../mac/macevlog.c ../putty.h ../mac/mac.h ../mac/macresid.h \ ../terminal.h ../puttyps.h ../network.h ../misc.h \ ../charset/charset.h ../tree234.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macmisc.o: ../mac/macmisc.c ../putty.h ../mac/mac.h ../ssh.h ../puttyps.h \ ../network.h ../misc.h ../charset/charset.h ../tree234.h \ ../puttymem.h ../int64.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macnet.o: ../mac/macnet.c ../putty.h ../network.h ../mac/mac.h ../ssh.h \ ../puttyps.h ../misc.h ../charset/charset.h ../tree234.h \ ../puttymem.h ../int64.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macnoise.o: ../mac/macnoise.c ../putty.h ../ssh.h ../storage.h ../puttyps.h \ ../network.h ../misc.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macpgen.o: ../mac/macpgen.c ../mac/macpgrid.h ../putty.h ../ssh.h \ ../mac/mac.h ../puttyps.h ../network.h ../misc.h \ ../puttymem.h ../int64.h ../charset/charset.h ../tree234.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macpgkey.o: ../mac/macpgkey.c ../putty.h ../mac/mac.h ../mac/macpgrid.h \ ../ssh.h ../puttyps.h ../network.h ../misc.h \ ../charset/charset.h ../tree234.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macstore.o: ../mac/macstore.c ../putty.h ../storage.h ../mac/mac.h \ ../mac/macresid.h ../puttyps.h ../network.h ../misc.h \ ../charset/charset.h ../tree234.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macterm.o: ../mac/macterm.c ../mac/macresid.h ../putty.h \ ../charset/charset.h ../mac/mac.h ../terminal.h ../puttyps.h \ ../network.h ../misc.h ../tree234.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< macucs.o: ../mac/macucs.c ../putty.h ../terminal.h ../misc.h ../mac/mac.h \ ../puttyps.h ../network.h ../tree234.h ../puttymem.h \ ../charset/charset.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< mimeenc.o: ../charset/mimeenc.c ../charset/charset.h ../charset/internal.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< minibidi.o: ../minibidi.c ../misc.h ../puttymem.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< misc.o: ../misc.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< mtcpnet.o: ../mac/mtcpnet.c ../putty.h ../network.h ../mac/mac.h \ ../puttyps.h ../misc.h ../charset/charset.h ../tree234.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< nocproxy.o: ../nocproxy.c ../putty.h ../network.h ../proxy.h ../puttyps.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< notiming.o: ../notiming.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< osxctrls.o: ../macosx/osxctrls.m ../putty.h ../dialog.h ../macosx/osxclass.h \ ../tree234.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../windows/winhelp.h \ ../charset/charset.h $(CC) -x objective-c $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< osxdlg.o: ../macosx/osxdlg.m ../putty.h ../storage.h ../dialog.h \ ../macosx/osxclass.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) -x objective-c $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< osxmain.o: ../macosx/osxmain.m ../putty.h ../macosx/osxclass.h ../puttyps.h \ ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) -x objective-c $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< osxsel.o: ../macosx/osxsel.m ../putty.h ../macosx/osxclass.h ../puttyps.h \ ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) -x objective-c $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< osxwin.o: ../macosx/osxwin.m ../putty.h ../terminal.h ../macosx/osxclass.h \ ../puttyps.h ../network.h ../misc.h ../tree234.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../windows/winhelp.h \ ../charset/charset.h $(CC) -x objective-c $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< otnet.o: ../mac/otnet.c ../putty.h ../network.h ../mac/mac.h ../puttyps.h \ ../misc.h ../charset/charset.h ../tree234.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< pinger.o: ../pinger.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< portfwd.o: ../portfwd.c ../putty.h ../ssh.h ../puttyps.h ../network.h \ ../misc.h ../puttymem.h ../int64.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../tree234.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< pproxy.o: ../pproxy.c ../putty.h ../network.h ../proxy.h ../puttyps.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< proxy.o: ../proxy.c ../putty.h ../network.h ../proxy.h ../puttyps.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< pscp.o: ../pscp.c ../putty.h ../psftp.h ../ssh.h ../sftp.h ../storage.h \ ../puttyps.h ../network.h ../misc.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< psftp.o: ../psftp.c ../putty.h ../psftp.h ../storage.h ../ssh.h ../sftp.h \ ../int64.h ../puttyps.h ../network.h ../misc.h ../puttymem.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< raw.o: ../raw.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< rlogin.o: ../rlogin.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sbcs.o: ../charset/sbcs.c ../charset/charset.h ../charset/internal.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sbcsdat.o: ../charset/sbcsdat.c ../charset/charset.h ../charset/internal.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< settings.o: ../settings.c ../putty.h ../storage.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sftp.o: ../sftp.c ../misc.h ../int64.h ../tree234.h ../sftp.h ../puttymem.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sizetip.o: ../windows/sizetip.c ../putty.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< slookup.o: ../charset/slookup.c ../charset/charset.h ../charset/internal.h \ ../charset/enum.c ../charset/sbcsdat.c ../charset/utf8.c $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< ssh.o: ../ssh.c ../putty.h ../tree234.h ../ssh.h ../puttyps.h ../network.h \ ../misc.h ../puttymem.h ../int64.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshaes.o: ../sshaes.c ../ssh.h ../puttymem.h ../network.h ../int64.h \ ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshblowf.o: ../sshblowf.c ../ssh.h ../puttymem.h ../network.h ../int64.h \ ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshbn.o: ../sshbn.c ../misc.h ../ssh.h ../puttymem.h ../network.h ../int64.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshcrc.o: ../sshcrc.c ../ssh.h ../puttymem.h ../network.h ../int64.h \ ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshcrcda.o: ../sshcrcda.c ../misc.h ../ssh.h ../puttymem.h ../network.h \ ../int64.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshdes.o: ../sshdes.c ../ssh.h ../puttymem.h ../network.h ../int64.h \ ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshdh.o: ../sshdh.c ../ssh.h ../puttymem.h ../network.h ../int64.h ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshdss.o: ../sshdss.c ../ssh.h ../misc.h ../puttymem.h ../network.h \ ../int64.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshdssg.o: ../sshdssg.c ../misc.h ../ssh.h ../puttymem.h ../network.h \ ../int64.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshmd5.o: ../sshmd5.c ../ssh.h ../puttymem.h ../network.h ../int64.h \ ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshprime.o: ../sshprime.c ../ssh.h ../puttymem.h ../network.h ../int64.h \ ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshpubk.o: ../sshpubk.c ../putty.h ../ssh.h ../misc.h ../puttyps.h \ ../network.h ../puttymem.h ../int64.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../tree234.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshrand.o: ../sshrand.c ../putty.h ../ssh.h ../puttyps.h ../network.h \ ../misc.h ../puttymem.h ../int64.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../tree234.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshrsa.o: ../sshrsa.c ../ssh.h ../misc.h ../puttymem.h ../network.h \ ../int64.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshrsag.o: ../sshrsag.c ../ssh.h ../puttymem.h ../network.h ../int64.h \ ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshsh512.o: ../sshsh512.c ../ssh.h ../puttymem.h ../network.h ../int64.h \ ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshsha.o: ../sshsha.c ../ssh.h ../puttymem.h ../network.h ../int64.h \ ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< sshzlib.o: ../sshzlib.c ../ssh.h ../puttymem.h ../network.h ../int64.h \ ../misc.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< stricmp.o: ../mac/stricmp.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< telnet.o: ../telnet.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< terminal.o: ../terminal.c ../putty.h ../terminal.h ../puttyps.h ../network.h \ ../misc.h ../tree234.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< testback.o: ../testback.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< time.o: ../time.c $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< timing.o: ../timing.c ../putty.h ../tree234.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< toucs.o: ../charset/toucs.c ../charset/charset.h ../charset/internal.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< tree234.o: ../tree234.c ../puttymem.h ../tree234.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< utf8.o: ../charset/utf8.c ../charset/charset.h ../charset/internal.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< ux_x11.o: ../unix/ux_x11.c ../putty.h ../ssh.h ../puttyps.h ../network.h \ ../misc.h ../puttymem.h ../int64.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../tree234.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxagentc.o: ../unix/uxagentc.c ../putty.h ../misc.h ../tree234.h \ ../puttymem.h ../puttyps.h ../network.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxcfg.o: ../unix/uxcfg.c ../putty.h ../dialog.h ../storage.h ../puttyps.h \ ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxcons.o: ../unix/uxcons.c ../putty.h ../storage.h ../ssh.h ../puttyps.h \ ../network.h ../misc.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxgen.o: ../unix/uxgen.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxmisc.o: ../unix/uxmisc.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxnet.o: ../unix/uxnet.c ../putty.h ../network.h ../tree234.h ../puttyps.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxnoise.o: ../unix/uxnoise.c ../putty.h ../ssh.h ../storage.h ../puttyps.h \ ../network.h ../misc.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxplink.o: ../unix/uxplink.c ../putty.h ../storage.h ../tree234.h \ ../puttyps.h ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxprint.o: ../unix/uxprint.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxproxy.o: ../unix/uxproxy.c ../tree234.h ../putty.h ../network.h ../proxy.h \ ../puttyps.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxpterm.o: ../unix/uxpterm.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxpty.o: ../unix/uxpty.c ../putty.h ../tree234.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxputty.o: ../unix/uxputty.c ../putty.h ../storage.h ../puttyps.h \ ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxsel.o: ../unix/uxsel.c ../putty.h ../tree234.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxsftp.o: ../unix/uxsftp.c ../putty.h ../psftp.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxsignal.o: ../unix/uxsignal.c $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxstore.o: ../unix/uxstore.c ../putty.h ../storage.h ../tree234.h \ ../puttyps.h ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< uxucs.o: ../unix/uxucs.c ../putty.h ../charset/charset.h ../terminal.h \ ../misc.h ../puttyps.h ../network.h ../tree234.h \ ../puttymem.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../windows/winhelp.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< version.o: ../version.c $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< vsnprint.o: ../mac/vsnprint.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< wcwidth.o: ../wcwidth.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< wildcard.o: ../wildcard.c ../putty.h ../puttyps.h ../network.h ../misc.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< wincfg.o: ../windows/wincfg.c ../putty.h ../dialog.h ../storage.h \ ../puttyps.h ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< wincons.o: ../windows/wincons.c ../putty.h ../storage.h ../ssh.h \ ../puttyps.h ../network.h ../misc.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winctrls.o: ../windows/winctrls.c ../putty.h ../misc.h ../dialog.h \ ../puttyps.h ../network.h ../puttymem.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< windefs.o: ../windows/windefs.c ../putty.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< windlg.o: ../windows/windlg.c ../putty.h ../ssh.h ../windows/win_res.h \ ../storage.h ../dialog.h ../puttyps.h ../network.h ../misc.h \ ../puttymem.h ../int64.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../tree234.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< window.o: ../windows/window.c ../putty.h ../terminal.h ../storage.h \ ../windows/win_res.h ../puttyps.h ../network.h ../misc.h \ ../tree234.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winmisc.o: ../windows/winmisc.c ../putty.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winnet.o: ../windows/winnet.c ../putty.h ../network.h ../tree234.h \ ../puttyps.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winnoise.o: ../windows/winnoise.c ../putty.h ../ssh.h ../storage.h \ ../puttyps.h ../network.h ../misc.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winpgen.o: ../windows/winpgen.c ../putty.h ../ssh.h ../puttyps.h \ ../network.h ../misc.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winpgnt.o: ../windows/winpgnt.c ../putty.h ../ssh.h ../misc.h ../tree234.h \ ../puttyps.h ../network.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winpgntc.o: ../windows/winpgntc.c ../putty.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winplink.o: ../windows/winplink.c ../putty.h ../storage.h ../tree234.h \ ../puttyps.h ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winprint.o: ../windows/winprint.c ../putty.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winsftp.o: ../windows/winsftp.c ../putty.h ../psftp.h ../puttyps.h \ ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winstore.o: ../windows/winstore.c ../putty.h ../storage.h ../puttyps.h \ ../network.h ../misc.h ../windows/winstuff.h \ ../mac/macstuff.h ../macosx/osx.h ../unix/unix.h \ ../puttymem.h ../tree234.h ../windows/winhelp.h \ ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< wintime.o: ../windows/wintime.c ../putty.h ../puttyps.h ../network.h \ ../misc.h ../windows/winstuff.h ../mac/macstuff.h \ ../macosx/osx.h ../unix/unix.h ../puttymem.h ../tree234.h \ ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winucs.o: ../windows/winucs.c ../putty.h ../terminal.h ../misc.h \ ../puttyps.h ../network.h ../tree234.h ../puttymem.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< winutils.o: ../windows/winutils.c ../misc.h ../puttymem.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< x11fwd.o: ../x11fwd.c ../putty.h ../ssh.h ../tree234.h ../puttyps.h \ ../network.h ../misc.h ../puttymem.h ../int64.h \ ../windows/winstuff.h ../mac/macstuff.h ../macosx/osx.h \ ../unix/unix.h ../windows/winhelp.h ../charset/charset.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< xenc.o: ../charset/xenc.c ../charset/charset.h ../charset/internal.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< xkeysym.o: ../unix/xkeysym.c ../misc.h ../puttymem.h $(CC) $(COMPAT) $(FWHACK) $(XFLAGS) $(CFLAGS) -c $< clean: rm -f *.o *.dmg rm -rf *.app Node-path: putty/macosx/README.OSX Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2987 Text-content-md5: 650278efdf46dffc724df8bd898b9c40 Text-content-sha1: a50677ed6de72b9ddfe017d166d8077809f9367d Content-length: 2997 PROPS-END SVNThis directory contains a Mac OS X port of PuTTY/pterm, running as a native Aqua GUI application. THIS PORT IS CURRENTLY UNFINISHED AND EXPERIMENTAL. You are welcome to use it, but don't be surprised at unexpected behaviour. I'm not kidding. In particular, I have not yet decided where OS X PuTTY should store its configuration data. Options include storing it in ~/.putty to be compatible with Unix PuTTY, storing it wherever is compatible with Mac Classic PuTTY, storing it in a natively OS X location, or sorting out the `config-locations' wishlist item and doing all three. Therefore, if you start using this port and create a whole load of saved sessions, you should not be surprised if a future version of the port decides to look somewhere completely different for the data and therefore loses them all. If that happens, don't say you weren't warned! Even more importantly, the alert box that confirms host keys is not yet implemented, and the application will bomb out and exit if it should be needed. This means you cannot make an SSH connection to a new host using the GUI PuTTY in this port: you must first run `plink' (which should be exactly identical to the version in the Unix port) and tell it to confirm the host key. Other ways in which the port is currently unfinished include: - terminal display is horribly slow - fatal errors are currently output via printf, which is obviously wrong for a GUI application - fonts aren't configurable - several features are unimplemented in the terminal display: underlining, non-solid-block cursors, double-width and double-height line attributes, bold as font rather than as colour, wide (CJK) characters, combining characters. - there's no scrollbar - terminal window resizing isn't implemented yet - proper window placement (cascading down and right from the starting position, plus remembering previous window positions per the Apple HIG) is not implemented - close-on-exit isn't implemented - warn-on-close isn't implemented - SessionWindow's dealloc method does nothing yet, so leaks memory - use of Alt+numberpad to enter arbitrary numeric character codes is not yet supported - cut and paste isn't supported - there's no Meta key yet. (I think it will have to be Command rather than Option since the latter is necessary to send some characters, including the rather important # on Apple UK keyboards; but trapping Command- and sending it to the window rather than the application menu requires me to make a positive effort of some sort and I haven't got round to it yet.) - there's no specials menu - currently no support for server-side window management requests (i.e. escape sequences to minimise or maximise the window, request or change its position and size, change its title etc) - window title is currently fixed - no Event Log - no mid-session Change Settings - no icon (surprisingly important in an OS X app!) Node-path: putty/macosx/osx.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 851 Text-content-md5: f6810cc07088bf383c120adebce1a831 Text-content-sha1: 9699ad45eb7ff8922e08bd46acf5830d971d749b Content-length: 861 PROPS-END SVNEEE#ifndef PUTTY_OSX_H #define PUTTY_OSX_H /* * Cocoa defines `FontSpec' itself, so we must change its name. * (Arrgh.) */ #define FontSpec FontSpec_OSX_Proof /* * Define the various compatibility symbols to make uxpty.c compile * correctly on OS X. */ #define BSD_PTYS #define OMIT_UTMP #define HAVE_NO_SETRESUID #define NOT_X_WINDOWS /* * OS X is largely just Unix, so we can include most of this * unchanged. */ #include "unix.h" /* * Functions exported by osxsel.m. (Both of these functions are * expected to be called in the _main_ thread: the select subthread * is an implementation detail of osxsel.m and ideally should not * be visible at all outside it.) */ void osxsel_init(void); /* call this to kick things off */ void osxsel_process_results(void); /* call this on receipt of a netevent */ #endif Node-path: putty/macosx/osxclass.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2183 Text-content-md5: dab6e17cc8dc8354b623388dfad9182c Text-content-sha1: a36890d4754e0174e851a7745e4dc68828eee114 Content-length: 2193 PROPS-END SVNyyy/* * Header file for the Objective-C parts of Mac OS X PuTTY. This * file contains the class definitions, which would cause compile * failures in the pure C modules if they appeared in osx.h. */ #ifndef PUTTY_OSXCLASS_H #define PUTTY_OSXCLASS_H #include "putty.h" /* * The application controller class, defined in osxmain.m. */ @interface AppController : NSObject { NSTimer *timer; } - (void)newSessionConfig:(id)sender; - (void)newTerminal:(id)sender; - (void)newSessionWithConfig:(id)cfg; - (void)setTimer:(long)next; @end extern AppController *controller; /* * The SessionWindow class, defined in osxwin.m. */ @class SessionWindow; @class TerminalView; @interface SessionWindow : NSWindow { Terminal *term; TerminalView *termview; struct unicode_data ucsdata; void *logctx; Config cfg; void *ldisc; Backend *back; void *backhandle; } - (id)initWithConfig:(Config)cfg; - (void)drawStartFinish:(BOOL)start; - (void)setColour:(int)n r:(float)r g:(float)g b:(float)b; - (Config *)cfg; - (void)doText:(wchar_t *)text len:(int)len x:(int)x y:(int)y attr:(unsigned long)attr lattr:(int)lattr; - (int)fromBackend:(const char *)data len:(int)len isStderr:(int)is_stderr; @end /* * The ConfigWindow class, defined in osxdlg.m. */ @class ConfigWindow; @interface ConfigWindow : NSWindow { NSOutlineView *treeview; struct controlbox *ctrlbox; struct sesslist sl; void *dv; Config cfg; } - (id)initWithConfig:(Config)cfg; @end /* * Functions exported by osxctrls.m. (They have to go in this * header file and not osx.h, because some of them have Cocoa class * types in their prototypes.) */ #define HSPACING 12 /* needed in osxdlg.m and osxctrls.m */ #define VSPACING 8 void *fe_dlg_init(void *data, NSWindow *window, NSObject *target, SEL action); void fe_dlg_free(void *dv); void create_ctrls(void *dv, NSView *parent, struct controlset *s, int *minw, int *minh); int place_ctrls(void *dv, struct controlset *s, int leftx, int topy, int width); /* returns height used */ void select_panel(void *dv, struct controlbox *b, const char *name); #endif /* PUTTY_OSXCLASS_H */ Node-path: putty/macosx/osxctrls.m Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 44408 Text-content-md5: bb273cf98888d4059f2f5bb7d174c572 Text-content-sha1: 682d8080533e9ec7d14d7a59183f8768c10cfc2e Content-length: 44418 PROPS-END SVNggg/* * osxctrls.m: OS X implementation of the dialog.h interface. */ #import #include "putty.h" #include "dialog.h" #include "osxclass.h" #include "tree234.h" /* * Still to be implemented: * * - file selectors (NSOpenPanel / NSSavePanel) * * - font selectors * - colour selectors * * both of these have a conceptual oddity in Cocoa that * you're only supposed to have one per application. But I * currently expect to be able to have multiple PuTTY config * boxes on screen at once; what happens if you trigger the * font selector in each one at the same time? * * if it comes to that, the _font_ selector can probably be * managed by other means: nobody is forcing me to implement * a font selector using a `Change...' button. The portable * dialog interface gives me the flexibility to do this how I * want. * * The colour selector interface, in its present form, is * more interesting and _if_ a radical change of plan is * required then it may stretch across the interface into the * portable side. * * Before I do anything rash I should start by looking at the * Mac Classic port and see how it's done there, on the basis * that Apple seem reasonably unlikely to have invented this * crazy restriction specifically for OS X. * * - focus management * * I tried using makeFirstResponder to give keyboard focus, * but it appeared not to work. Try again, and work out how * it should be done. * * also look into tab order. Currently pressing Tab suggests * that only edit boxes and list boxes can get the keyboard * focus, and that buttons (in all their forms) are unable to * be driven by the keyboard. Find out for sure. * * - dlg_error_msg * * this may run into the usual aggro with modal dialog boxes. */ /* * For Cocoa control layout, I need a two-stage process. In stage * one, I allocate all the controls and measure their natural * sizes, which allows me to compute the _minimum_ width and height * of a given section of dialog. Then, in stage two, I lay out the * dialog box as a whole, decide how much each section of the box * needs to receive, and assign it its final size. */ /* * As yet unsolved issues [FIXME]: * * - Sometimes the height returned from create_ctrls and the * height returned from place_ctrls differ. Find out why. It may * be harmless (e.g. results of NSTextView being odd), but I * want to know. * * - NSTextViews are indented a bit. It'd be nice to put their * left margin at the same place as everything else's. * * - I don't yet know whether we even _can_ support tab order or * keyboard shortcuts. If we can't, then fair enough, we can't. * But if we can, we should. * * - I would _really_ like to know of a better way to correct * NSButton's stupid size estimates than by subclassing it and * overriding sizeToFit with hard-wired sensible values! * * - Speaking of stupid size estimates, the amount by which I'm * adjusting a titled NSBox (currently equal to the point size * of its title font) looks as if it isn't _quite_ enough. * Figure out what the real amount should be and use it. * * - I don't understand why there's always a scrollbar displayed * in each list box. I thought I told it to autohide scrollers? * * - Why do I have to fudge list box heights by adding one? (Might * it be to do with the missing header view?) */ /* * Subclass of NSButton which corrects the fact that the normal * one's sizeToFit method persistently returns 32 as its height, * which is simply a lie. I have yet to work out a better * alternative than hard-coding the real heights. */ @interface MyButton : NSButton { int minht; } @end @implementation MyButton - (id)initWithFrame:(NSRect)r { self = [super initWithFrame:r]; minht = 25; return self; } - (void)setButtonType:(NSButtonType)t { if (t == NSRadioButton || t == NSSwitchButton) minht = 18; else minht = 25; [super setButtonType:t]; } - (void)sizeToFit { NSRect r; [super sizeToFit]; r = [self frame]; r.size.height = minht; [self setFrame:r]; } @end /* * Class used as the data source for NSTableViews. */ @interface MyTableSource : NSObject { tree234 *tree; } - (id)init; - (void)add:(const char *)str withId:(int)id; - (int)getid:(int)index; - (void)swap:(int)index1 with:(int)index2; - (void)removestr:(int)index; - (void)clear; @end @implementation MyTableSource - (id)init { self = [super init]; tree = newtree234(NULL); return self; } - (void)dealloc { char *p; while ((p = delpos234(tree, 0)) != NULL) sfree(p); freetree234(tree); [super dealloc]; } - (void)add:(const char *)str withId:(int)id { addpos234(tree, dupprintf("%d\t%s", id, str), count234(tree)); } - (int)getid:(int)index { char *p = index234(tree, index); return atoi(p); } - (void)removestr:(int)index { char *p = delpos234(tree, index); sfree(p); } - (void)swap:(int)index1 with:(int)index2 { char *p1, *p2; if (index1 > index2) { int t = index1; index1 = index2; index2 = t; } /* delete later one first so it doesn't affect index of earlier one */ p2 = delpos234(tree, index2); p1 = delpos234(tree, index1); /* now insert earlier one before later one for the inverse reason */ addpos234(tree, p2, index1); addpos234(tree, p1, index2); } - (void)clear { char *p; while ((p = delpos234(tree, 0)) != NULL) sfree(p); } - (int)numberOfRowsInTableView:(NSTableView *)aTableView { return count234(tree); } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { int j = [[aTableColumn identifier] intValue]; char *p = index234(tree, rowIndex); while (j >= 0) { p += strcspn(p, "\t"); if (*p) p++; j--; } return [NSString stringWithCString:p length:strcspn(p, "\t")]; } @end /* * Object to receive messages from various control classes. */ @class Receiver; struct fe_dlg { NSWindow *window; NSObject *target; SEL action; tree234 *byctrl; tree234 *bywidget; tree234 *boxes; void *data; /* passed to portable side */ Receiver *rec; }; @interface Receiver : NSObject { struct fe_dlg *d; } - (id)initWithStruct:(struct fe_dlg *)aStruct; @end struct fe_ctrl { union control *ctrl; NSButton *button, *button2; NSTextField *label, *editbox; NSComboBox *combobox; NSButton **radiobuttons; NSTextView *textview; NSPopUpButton *popupbutton; NSTableView *tableview; NSScrollView *scrollview; int nradiobuttons; void *privdata; int privdata_needs_free; }; static int fe_ctrl_cmp_by_ctrl(void *av, void *bv) { struct fe_ctrl *a = (struct fe_ctrl *)av; struct fe_ctrl *b = (struct fe_ctrl *)bv; if (a->ctrl < b->ctrl) return -1; if (a->ctrl > b->ctrl) return +1; return 0; } static int fe_ctrl_find_by_ctrl(void *av, void *bv) { union control *a = (union control *)av; struct fe_ctrl *b = (struct fe_ctrl *)bv; if (a < b->ctrl) return -1; if (a > b->ctrl) return +1; return 0; } struct fe_box { struct controlset *s; id box; }; static int fe_boxcmp(void *av, void *bv) { struct fe_box *a = (struct fe_box *)av; struct fe_box *b = (struct fe_box *)bv; if (a->s < b->s) return -1; if (a->s > b->s) return +1; return 0; } static int fe_boxfind(void *av, void *bv) { struct controlset *a = (struct controlset *)av; struct fe_box *b = (struct fe_box *)bv; if (a < b->s) return -1; if (a > b->s) return +1; return 0; } struct fe_backwards { /* map Cocoa widgets back to fe_ctrls */ id widget; struct fe_ctrl *c; }; static int fe_backwards_cmp_by_widget(void *av, void *bv) { struct fe_backwards *a = (struct fe_backwards *)av; struct fe_backwards *b = (struct fe_backwards *)bv; if (a->widget < b->widget) return -1; if (a->widget > b->widget) return +1; return 0; } static int fe_backwards_find_by_widget(void *av, void *bv) { id a = (id)av; struct fe_backwards *b = (struct fe_backwards *)bv; if (a < b->widget) return -1; if (a > b->widget) return +1; return 0; } static struct fe_ctrl *fe_ctrl_new(union control *ctrl) { struct fe_ctrl *c; c = snew(struct fe_ctrl); c->ctrl = ctrl; c->button = c->button2 = nil; c->label = nil; c->editbox = nil; c->combobox = nil; c->textview = nil; c->popupbutton = nil; c->tableview = nil; c->scrollview = nil; c->radiobuttons = NULL; c->nradiobuttons = 0; c->privdata = NULL; c->privdata_needs_free = FALSE; return c; } static void fe_ctrl_free(struct fe_ctrl *c) { if (c->privdata_needs_free) sfree(c->privdata); sfree(c->radiobuttons); sfree(c); } static struct fe_ctrl *fe_ctrl_byctrl(struct fe_dlg *d, union control *ctrl) { return find234(d->byctrl, ctrl, fe_ctrl_find_by_ctrl); } static void add_box(struct fe_dlg *d, struct controlset *s, id box) { struct fe_box *b = snew(struct fe_box); b->box = box; b->s = s; add234(d->boxes, b); } static id find_box(struct fe_dlg *d, struct controlset *s) { struct fe_box *b = find234(d->boxes, s, fe_boxfind); return b ? b->box : NULL; } static void add_widget(struct fe_dlg *d, struct fe_ctrl *c, id widget) { struct fe_backwards *b = snew(struct fe_backwards); b->widget = widget; b->c = c; add234(d->bywidget, b); } static struct fe_ctrl *find_widget(struct fe_dlg *d, id widget) { struct fe_backwards *b = find234(d->bywidget, widget, fe_backwards_find_by_widget); return b ? b->c : NULL; } void *fe_dlg_init(void *data, NSWindow *window, NSObject *target, SEL action) { struct fe_dlg *d; d = snew(struct fe_dlg); d->window = window; d->target = target; d->action = action; d->byctrl = newtree234(fe_ctrl_cmp_by_ctrl); d->bywidget = newtree234(fe_backwards_cmp_by_widget); d->boxes = newtree234(fe_boxcmp); d->data = data; d->rec = [[Receiver alloc] initWithStruct:d]; return d; } void fe_dlg_free(void *dv) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c; struct fe_box *b; while ( (c = delpos234(d->byctrl, 0)) != NULL ) fe_ctrl_free(c); freetree234(d->byctrl); while ( (c = delpos234(d->bywidget, 0)) != NULL ) sfree(c); freetree234(d->bywidget); while ( (b = delpos234(d->boxes, 0)) != NULL ) sfree(b); freetree234(d->boxes); [d->rec release]; sfree(d); } @implementation Receiver - (id)initWithStruct:(struct fe_dlg *)aStruct { self = [super init]; d = aStruct; return self; } - (void)buttonPushed:(id)sender { struct fe_ctrl *c = find_widget(d, sender); assert(c && c->ctrl->generic.type == CTRL_BUTTON); c->ctrl->generic.handler(c->ctrl, d, d->data, EVENT_ACTION); } - (void)checkboxChanged:(id)sender { struct fe_ctrl *c = find_widget(d, sender); assert(c && c->ctrl->generic.type == CTRL_CHECKBOX); c->ctrl->generic.handler(c->ctrl, d, d->data, EVENT_VALCHANGE); } - (void)radioChanged:(id)sender { struct fe_ctrl *c = find_widget(d, sender); int j; assert(c && c->radiobuttons); for (j = 0; j < c->nradiobuttons; j++) if (sender != c->radiobuttons[j]) [c->radiobuttons[j] setState:NSOffState]; c->ctrl->generic.handler(c->ctrl, d, d->data, EVENT_VALCHANGE); } - (void)popupMenuSelected:(id)sender { struct fe_ctrl *c = find_widget(d, sender); c->ctrl->generic.handler(c->ctrl, d, d->data, EVENT_VALCHANGE); } - (void)controlTextDidChange:(NSNotification *)notification { id widget = [notification object]; struct fe_ctrl *c = find_widget(d, widget); assert(c && c->ctrl->generic.type == CTRL_EDITBOX); c->ctrl->generic.handler(c->ctrl, d, d->data, EVENT_VALCHANGE); } - (void)controlTextDidEndEditing:(NSNotification *)notification { id widget = [notification object]; struct fe_ctrl *c = find_widget(d, widget); assert(c && c->ctrl->generic.type == CTRL_EDITBOX); c->ctrl->generic.handler(c->ctrl, d, d->data, EVENT_REFRESH); } - (void)tableViewSelectionDidChange:(NSNotification *)notification { id widget = [notification object]; struct fe_ctrl *c = find_widget(d, widget); assert(c && c->ctrl->generic.type == CTRL_LISTBOX); c->ctrl->generic.handler(c->ctrl, d, d->data, EVENT_SELCHANGE); } - (BOOL)tableView:(NSTableView *)aTableView shouldEditTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { return NO; /* no editing permitted */ } - (void)listDoubleClicked:(id)sender { struct fe_ctrl *c = find_widget(d, sender); assert(c && c->ctrl->generic.type == CTRL_LISTBOX); c->ctrl->generic.handler(c->ctrl, d, d->data, EVENT_ACTION); } - (void)dragListButton:(id)sender { struct fe_ctrl *c = find_widget(d, sender); int direction, row, nrows; assert(c && c->ctrl->generic.type == CTRL_LISTBOX && c->ctrl->listbox.draglist); if (sender == c->button) direction = -1; /* up */ else direction = +1; /* down */ row = [c->tableview selectedRow]; nrows = [c->tableview numberOfRows]; if (row + direction < 0 || row + direction >= nrows) { NSBeep(); return; } [[c->tableview dataSource] swap:row with:row+direction]; [c->tableview reloadData]; [c->tableview selectRow:row+direction byExtendingSelection:NO]; c->ctrl->generic.handler(c->ctrl, d, d->data, EVENT_VALCHANGE); } @end void create_ctrls(void *dv, NSView *parent, struct controlset *s, int *minw, int *minh) { struct fe_dlg *d = (struct fe_dlg *)dv; int ccw[100]; /* cumulative column widths */ int cypos[100]; int ncols; int wmin = 0, hmin = 0; int i, j, cw, ch; NSRect rect; NSFont *textviewfont = nil; int boxh = 0, boxw = 0; if (!s->boxname && s->boxtitle) { /* This controlset is a panel title. */ NSTextField *tf; tf = [[NSTextField alloc] initWithFrame:NSMakeRect(0,0,1,1)]; [tf setEditable:NO]; [tf setSelectable:NO]; [tf setBordered:NO]; [tf setDrawsBackground:NO]; [tf setStringValue:[NSString stringWithCString:s->boxtitle]]; [tf sizeToFit]; rect = [tf frame]; [parent addSubview:tf]; /* * I'm going to store this NSTextField in the boxes tree, * because I really can't face having a special tree234 * mapping controlsets to panel titles. */ add_box(d, s, tf); *minw = rect.size.width; *minh = rect.size.height; return; } if (*s->boxname) { /* * Create an NSBox to contain this subset of controls. */ NSBox *box; NSRect tmprect; box = [[NSBox alloc] initWithFrame:NSMakeRect(0,0,1,1)]; if (s->boxtitle) [box setTitle:[NSString stringWithCString:s->boxtitle]]; else [box setTitlePosition:NSNoTitle]; add_box(d, s, box); tmprect = [box frame]; [box setContentViewMargins:NSMakeSize(20,20)]; [box setFrameFromContentFrame:NSMakeRect(100,100,100,100)]; rect = [box frame]; [box setFrame:tmprect]; boxh = (int)(rect.size.height - 100); boxw = (int)(rect.size.width - 100); [parent addSubview:box]; if (s->boxtitle) boxh += [[box titleFont] pointSize]; /* * All subsequent controls will be placed within this box. */ parent = box; } ncols = 1; ccw[0] = 0; ccw[1] = 100; cypos[0] = 0; /* * Now iterate through the controls themselves, create them, * and add their width and height to the overall width/height * calculation. */ for (i = 0; i < s->ncontrols; i++) { union control *ctrl = s->ctrls[i]; struct fe_ctrl *c; int colstart = COLUMN_START(ctrl->generic.column); int colspan = COLUMN_SPAN(ctrl->generic.column); int colend = colstart + colspan; int ytop, wthis; switch (ctrl->generic.type) { case CTRL_COLUMNS: for (j = 1; j < ncols; j++) if (cypos[0] < cypos[j]) cypos[0] = cypos[j]; assert(ctrl->columns.ncols < lenof(ccw)); ccw[0] = 0; for (j = 0; j < ctrl->columns.ncols; j++) { ccw[j+1] = ccw[j] + (ctrl->columns.percentages ? ctrl->columns.percentages[j] : 100); cypos[j] = cypos[0]; } ncols = ctrl->columns.ncols; continue; /* no actual control created */ case CTRL_TABDELAY: /* * I'm currently uncertain that we can implement tab * order in OS X. */ continue; /* no actual control created */ } c = fe_ctrl_new(ctrl); add234(d->byctrl, c); cw = ch = 0; switch (ctrl->generic.type) { case CTRL_BUTTON: case CTRL_CHECKBOX: { NSButton *b; b = [[MyButton alloc] initWithFrame:NSMakeRect(0, 0, 1, 1)]; [b setBezelStyle:NSRoundedBezelStyle]; if (ctrl->generic.type == CTRL_CHECKBOX) [b setButtonType:NSSwitchButton]; [b setTitle:[NSString stringWithCString:ctrl->generic.label]]; if (ctrl->button.isdefault) [b setKeyEquivalent:@"\r"]; else if (ctrl->button.iscancel) [b setKeyEquivalent:@"\033"]; [b sizeToFit]; rect = [b frame]; [parent addSubview:b]; [b setTarget:d->rec]; if (ctrl->generic.type == CTRL_CHECKBOX) [b setAction:@selector(checkboxChanged:)]; else [b setAction:@selector(buttonPushed:)]; add_widget(d, c, b); c->button = b; cw = rect.size.width; ch = rect.size.height; } break; case CTRL_EDITBOX: { int editp = ctrl->editbox.percentwidth; int labelp = editp == 100 ? 100 : 100 - editp; NSTextField *tf; NSComboBox *cb; tf = [[NSTextField alloc] initWithFrame:NSMakeRect(0,0,1,1)]; [tf setEditable:NO]; [tf setSelectable:NO]; [tf setBordered:NO]; [tf setDrawsBackground:NO]; [tf setStringValue:[NSString stringWithCString:ctrl->generic.label]]; [tf sizeToFit]; rect = [tf frame]; [parent addSubview:tf]; c->label = tf; cw = rect.size.width * 100 / labelp; ch = rect.size.height; if (ctrl->editbox.has_list) { cb = [[NSComboBox alloc] initWithFrame:NSMakeRect(0,0,1,1)]; [cb setStringValue:@"x"]; [cb sizeToFit]; rect = [cb frame]; [parent addSubview:cb]; c->combobox = cb; } else { if (ctrl->editbox.password) tf = [NSSecureTextField alloc]; else tf = [NSTextField alloc]; tf = [tf initWithFrame:NSMakeRect(0,0,1,1)]; [tf setEditable:YES]; [tf setSelectable:YES]; [tf setBordered:YES]; [tf setStringValue:@"x"]; [tf sizeToFit]; rect = [tf frame]; [parent addSubview:tf]; c->editbox = tf; [tf setDelegate:d->rec]; add_widget(d, c, tf); } if (editp == 100) { /* the edit box and its label are vertically separated */ ch += VSPACING + rect.size.height; } else { /* the edit box and its label are horizontally separated */ if (ch < rect.size.height) ch = rect.size.height; } if (cw < rect.size.width * 100 / editp) cw = rect.size.width * 100 / editp; } break; case CTRL_TEXT: { NSTextView *tv; int testwid; if (!textviewfont) { NSTextField *tf; tf = [[NSTextField alloc] init]; textviewfont = [tf font]; [tf release]; } testwid = (ccw[colend] - ccw[colstart]) * 3; tv = [[NSTextView alloc] initWithFrame:NSMakeRect(0,0,testwid,1)]; [tv setEditable:NO]; [tv setSelectable:NO]; //[tv setBordered:NO]; [tv setDrawsBackground:NO]; [tv setFont:textviewfont]; [tv setString: [NSString stringWithCString:ctrl->generic.label]]; rect = [tv frame]; [tv sizeToFit]; [parent addSubview:tv]; c->textview = tv; cw = rect.size.width; ch = rect.size.height; } break; case CTRL_RADIO: { NSTextField *tf; int j; if (ctrl->generic.label) { tf = [[NSTextField alloc] initWithFrame:NSMakeRect(0,0,1,1)]; [tf setEditable:NO]; [tf setSelectable:NO]; [tf setBordered:NO]; [tf setDrawsBackground:NO]; [tf setStringValue: [NSString stringWithCString:ctrl->generic.label]]; [tf sizeToFit]; rect = [tf frame]; [parent addSubview:tf]; c->label = tf; cw = rect.size.width; ch = rect.size.height; } else { cw = 0; ch = -VSPACING; /* compensate for next advance */ } c->nradiobuttons = ctrl->radio.nbuttons; c->radiobuttons = snewn(ctrl->radio.nbuttons, NSButton *); for (j = 0; j < ctrl->radio.nbuttons; j++) { NSButton *b; int ncols; b = [[MyButton alloc] initWithFrame:NSMakeRect(0,0,1,1)]; [b setBezelStyle:NSRoundedBezelStyle]; [b setButtonType:NSRadioButton]; [b setTitle:[NSString stringWithCString:ctrl->radio.buttons[j]]]; [b sizeToFit]; rect = [b frame]; [parent addSubview:b]; c->radiobuttons[j] = b; [b setTarget:d->rec]; [b setAction:@selector(radioChanged:)]; add_widget(d, c, b); /* * Add to the height every time we place a * button in column 0. */ if (j % ctrl->radio.ncolumns == 0) { ch += rect.size.height + VSPACING; } /* * Add to the width by working out how many * columns this button spans. */ if (j == ctrl->radio.nbuttons - 1) ncols = (ctrl->radio.ncolumns - (j % ctrl->radio.ncolumns)); else ncols = 1; if (cw < rect.size.width * ctrl->radio.ncolumns / ncols) cw = rect.size.width * ctrl->radio.ncolumns / ncols; } } break; case CTRL_FILESELECT: case CTRL_FONTSELECT: { NSTextField *tf; NSButton *b; int kh; tf = [[NSTextField alloc] initWithFrame:NSMakeRect(0,0,1,1)]; [tf setEditable:NO]; [tf setSelectable:NO]; [tf setBordered:NO]; [tf setDrawsBackground:NO]; [tf setStringValue:[NSString stringWithCString:ctrl->generic.label]]; [tf sizeToFit]; rect = [tf frame]; [parent addSubview:tf]; c->label = tf; cw = rect.size.width; ch = rect.size.height; tf = [NSTextField alloc]; tf = [tf initWithFrame:NSMakeRect(0,0,1,1)]; if (ctrl->generic.type == CTRL_FILESELECT) { [tf setEditable:YES]; [tf setSelectable:YES]; [tf setBordered:YES]; } else { [tf setEditable:NO]; [tf setSelectable:NO]; [tf setBordered:NO]; [tf setDrawsBackground:NO]; } [tf setStringValue:@"x"]; [tf sizeToFit]; rect = [tf frame]; [parent addSubview:tf]; c->editbox = tf; kh = rect.size.height; if (cw < rect.size.width * 4 / 3) cw = rect.size.width * 4 / 3; b = [[MyButton alloc] initWithFrame:NSMakeRect(0, 0, 1, 1)]; [b setBezelStyle:NSRoundedBezelStyle]; if (ctrl->generic.type == CTRL_FILESELECT) [b setTitle:@"Browse..."]; else [b setTitle:@"Change..."]; // [b setKeyEquivalent:somethingorother]; // [b setTarget:somethingorother]; // [b setAction:somethingorother]; [b sizeToFit]; rect = [b frame]; [parent addSubview:b]; c->button = b; if (kh < rect.size.height) kh = rect.size.height; ch += VSPACING + kh; if (cw < rect.size.width * 4) cw = rect.size.width * 4; } break; case CTRL_LISTBOX: { int listp = ctrl->listbox.percentwidth; int labelp = listp == 100 ? 100 : 100 - listp; NSTextField *tf; NSPopUpButton *pb; NSTableView *tv; NSScrollView *sv; if (ctrl->generic.label) { tf = [[NSTextField alloc] initWithFrame:NSMakeRect(0,0,1,1)]; [tf setEditable:NO]; [tf setSelectable:NO]; [tf setBordered:NO]; [tf setDrawsBackground:NO]; [tf setStringValue: [NSString stringWithCString:ctrl->generic.label]]; [tf sizeToFit]; rect = [tf frame]; [parent addSubview:tf]; c->label = tf; cw = rect.size.width; ch = rect.size.height; } else { cw = 0; ch = -VSPACING; /* compensate for next advance */ } if (ctrl->listbox.height == 0) { pb = [[NSPopUpButton alloc] initWithFrame:NSMakeRect(0,0,1,1)]; [pb sizeToFit]; rect = [pb frame]; [parent addSubview:pb]; c->popupbutton = pb; [pb setTarget:d->rec]; [pb setAction:@selector(popupMenuSelected:)]; add_widget(d, c, pb); } else { assert(listp == 100); if (ctrl->listbox.draglist) { int bi; listp = 75; for (bi = 0; bi < 2; bi++) { NSButton *b; b = [[MyButton alloc] initWithFrame:NSMakeRect(0, 0, 1, 1)]; [b setBezelStyle:NSRoundedBezelStyle]; if (bi == 0) [b setTitle:@"Up"]; else [b setTitle:@"Down"]; [b sizeToFit]; rect = [b frame]; [parent addSubview:b]; if (bi == 0) c->button = b; else c->button2 = b; [b setTarget:d->rec]; [b setAction:@selector(dragListButton:)]; add_widget(d, c, b); if (cw < rect.size.width * 4) cw = rect.size.width * 4; } } sv = [[NSScrollView alloc] initWithFrame: NSMakeRect(20,20,10,10)]; [sv setBorderType:NSLineBorder]; tv = [[NSTableView alloc] initWithFrame:[sv frame]]; [[tv headerView] setFrame:NSMakeRect(0,0,0,0)]; [sv setDocumentView:tv]; [parent addSubview:sv]; [sv setHasVerticalScroller:YES]; [sv setAutohidesScrollers:YES]; [tv setAllowsColumnReordering:NO]; [tv setAllowsColumnResizing:NO]; [tv setAllowsMultipleSelection:ctrl->listbox.multisel]; [tv setAllowsEmptySelection:YES]; [tv setAllowsColumnSelection:YES]; [tv setDataSource:[[MyTableSource alloc] init]]; rect = [tv frame]; /* * For some reason this consistently comes out * one short. Add one. */ rect.size.height = (ctrl->listbox.height+1)*[tv rowHeight]; [sv setFrame:rect]; c->tableview = tv; c->scrollview = sv; [tv setDelegate:d->rec]; [tv setTarget:d->rec]; [tv setDoubleAction:@selector(listDoubleClicked:)]; add_widget(d, c, tv); } if (c->tableview) { int ncols, *percentages; int hundred = 100; if (ctrl->listbox.ncols) { ncols = ctrl->listbox.ncols; percentages = ctrl->listbox.percentages; } else { ncols = 1; percentages = &hundred; } for (j = 0; j < ncols; j++) { NSTableColumn *col; col = [[NSTableColumn alloc] initWithIdentifier: [NSNumber numberWithInt:j]]; [c->tableview addTableColumn:col]; } } if (labelp == 100) { /* the list and its label are vertically separated */ ch += VSPACING + rect.size.height; } else { /* the list and its label are horizontally separated */ if (ch < rect.size.height) ch = rect.size.height; } if (cw < rect.size.width * 100 / listp) cw = rect.size.width * 100 / listp; } break; } /* * Update the width and height data for the control we've * just created. */ ytop = 0; for (j = colstart; j < colend; j++) { if (ytop < cypos[j]) ytop = cypos[j]; } for (j = colstart; j < colend; j++) cypos[j] = ytop + ch + VSPACING; if (hmin < ytop + ch) hmin = ytop + ch; wthis = (cw + HSPACING) * 100 / (ccw[colend] - ccw[colstart]); wthis -= HSPACING; if (wmin < wthis) wmin = wthis; } if (*s->boxname) { /* * Add a bit to the width and height for the box. */ wmin += boxw; hmin += boxh; } //printf("For controlset %s/%s, returning w=%d h=%d\n", // s->pathname, s->boxname, wmin, hmin); *minw = wmin; *minh = hmin; } int place_ctrls(void *dv, struct controlset *s, int leftx, int topy, int width) { struct fe_dlg *d = (struct fe_dlg *)dv; int ccw[100]; /* cumulative column widths */ int cypos[100]; int ncols; int i, j, ret; int boxh = 0, boxw = 0; if (!s->boxname && s->boxtitle) { /* Size and place the panel title. */ NSTextField *tf = find_box(d, s); NSRect rect; rect = [tf frame]; [tf setFrame:NSMakeRect(leftx, topy-rect.size.height, width, rect.size.height)]; return rect.size.height; } if (*s->boxname) { NSRect rect, tmprect; NSBox *box = find_box(d, s); assert(box != NULL); tmprect = [box frame]; [box setFrameFromContentFrame:NSMakeRect(100,100,100,100)]; rect = [box frame]; [box setFrame:tmprect]; boxw = rect.size.width - 100; boxh = rect.size.height - 100; if (s->boxtitle) boxh += [[box titleFont] pointSize]; topy -= boxh; width -= boxw; } ncols = 1; ccw[0] = 0; ccw[1] = 100; cypos[0] = topy; ret = 0; /* * Now iterate through the controls themselves, placing them * appropriately. */ for (i = 0; i < s->ncontrols; i++) { union control *ctrl = s->ctrls[i]; struct fe_ctrl *c; int colstart = COLUMN_START(ctrl->generic.column); int colspan = COLUMN_SPAN(ctrl->generic.column); int colend = colstart + colspan; int xthis, ythis, wthis, ch; NSRect rect; switch (ctrl->generic.type) { case CTRL_COLUMNS: for (j = 1; j < ncols; j++) if (cypos[0] > cypos[j]) cypos[0] = cypos[j]; assert(ctrl->columns.ncols < lenof(ccw)); ccw[0] = 0; for (j = 0; j < ctrl->columns.ncols; j++) { ccw[j+1] = ccw[j] + (ctrl->columns.percentages ? ctrl->columns.percentages[j] : 100); cypos[j] = cypos[0]; } ncols = ctrl->columns.ncols; continue; /* no actual control created */ case CTRL_TABDELAY: continue; /* nothing to do here, move along */ } c = fe_ctrl_byctrl(d, ctrl); ch = 0; ythis = topy; for (j = colstart; j < colend; j++) { if (ythis > cypos[j]) ythis = cypos[j]; } xthis = (width + HSPACING) * ccw[colstart] / 100; wthis = (width + HSPACING) * ccw[colend] / 100 - HSPACING - xthis; xthis += leftx; switch (ctrl->generic.type) { case CTRL_BUTTON: case CTRL_CHECKBOX: rect = [c->button frame]; [c->button setFrame:NSMakeRect(xthis,ythis-rect.size.height,wthis, rect.size.height)]; ch = rect.size.height; break; case CTRL_EDITBOX: { int editp = ctrl->editbox.percentwidth; int labelp = editp == 100 ? 100 : 100 - editp; int lheight, theight, rheight, ynext, editw; NSControl *edit = (c->editbox ? c->editbox : c->combobox); rect = [c->label frame]; lheight = rect.size.height; rect = [edit frame]; theight = rect.size.height; if (editp == 100) rheight = lheight; else rheight = (lheight < theight ? theight : lheight); [c->label setFrame: NSMakeRect(xthis, ythis-(rheight+lheight)/2, (wthis + HSPACING) * labelp / 100 - HSPACING, lheight)]; if (editp == 100) { ynext = ythis - rheight - VSPACING; rheight = theight; } else { ynext = ythis; } editw = (wthis + HSPACING) * editp / 100 - HSPACING; [edit setFrame: NSMakeRect(xthis+wthis-editw, ynext-(rheight+theight)/2, editw, theight)]; ch = (ythis - ynext) + theight; } break; case CTRL_TEXT: [c->textview setFrame:NSMakeRect(xthis, 0, wthis, 1)]; [c->textview sizeToFit]; rect = [c->textview frame]; [c->textview setFrame:NSMakeRect(xthis, ythis-rect.size.height, wthis, rect.size.height)]; ch = rect.size.height; break; case CTRL_RADIO: { int j, ynext; if (c->label) { rect = [c->label frame]; [c->label setFrame:NSMakeRect(xthis,ythis-rect.size.height, wthis,rect.size.height)]; ynext = ythis - rect.size.height - VSPACING; } else ynext = ythis; for (j = 0; j < ctrl->radio.nbuttons; j++) { int col = j % ctrl->radio.ncolumns; int ncols; int lx,rx; if (j == ctrl->radio.nbuttons - 1) ncols = ctrl->radio.ncolumns - col; else ncols = 1; lx = (wthis + HSPACING) * col / ctrl->radio.ncolumns; rx = ((wthis + HSPACING) * (col+ncols) / ctrl->radio.ncolumns) - HSPACING; /* * Set the frame size. */ rect = [c->radiobuttons[j] frame]; [c->radiobuttons[j] setFrame: NSMakeRect(lx+xthis, ynext-rect.size.height, rx-lx, rect.size.height)]; /* * Advance to next line if we're in the last * column. */ if (col + ncols == ctrl->radio.ncolumns) ynext -= rect.size.height + VSPACING; } ch = (ythis - ynext) - VSPACING; } break; case CTRL_FILESELECT: case CTRL_FONTSELECT: { int ynext, eh, bh, th, mx; rect = [c->label frame]; [c->label setFrame:NSMakeRect(xthis,ythis-rect.size.height, wthis,rect.size.height)]; ynext = ythis - rect.size.height - VSPACING; rect = [c->editbox frame]; eh = rect.size.height; rect = [c->button frame]; bh = rect.size.height; th = (eh > bh ? eh : bh); mx = (wthis + HSPACING) * 3 / 4 - HSPACING; [c->editbox setFrame: NSMakeRect(xthis, ynext-(th+eh)/2, mx, eh)]; [c->button setFrame: NSMakeRect(xthis+mx+HSPACING, ynext-(th+bh)/2, wthis-mx-HSPACING, bh)]; ch = (ythis - ynext) + th + VSPACING; } break; case CTRL_LISTBOX: { int listp = ctrl->listbox.percentwidth; int labelp = listp == 100 ? 100 : 100 - listp; int lheight, theight, rheight, ynext, listw, xlist; NSControl *list = (c->scrollview ? (id)c->scrollview : (id)c->popupbutton); if (ctrl->listbox.draglist) { assert(listp == 100); listp = 75; } rect = [list frame]; theight = rect.size.height; if (c->label) { rect = [c->label frame]; lheight = rect.size.height; if (labelp == 100) rheight = lheight; else rheight = (lheight < theight ? theight : lheight); [c->label setFrame: NSMakeRect(xthis, ythis-(rheight+lheight)/2, (wthis + HSPACING) * labelp / 100 - HSPACING, lheight)]; if (labelp == 100) { ynext = ythis - rheight - VSPACING; rheight = theight; } else { ynext = ythis; } } else { ynext = ythis; rheight = theight; } listw = (wthis + HSPACING) * listp / 100 - HSPACING; if (labelp == 100) xlist = xthis; else xlist = xthis+wthis-listw; [list setFrame: NSMakeRect(xlist, ynext-(rheight+theight)/2, listw, theight)]; /* * Size the columns for the table view. */ if (c->tableview) { int ncols, *percentages; int hundred = 100; int cpercent = 0, cpixels = 0; NSArray *cols; if (ctrl->listbox.ncols) { ncols = ctrl->listbox.ncols; percentages = ctrl->listbox.percentages; } else { ncols = 1; percentages = &hundred; } cols = [c->tableview tableColumns]; for (j = 0; j < ncols; j++) { NSTableColumn *col = [cols objectAtIndex:j]; int newcpixels; cpercent += percentages[j]; newcpixels = listw * cpercent / 100; [col setWidth:newcpixels-cpixels]; cpixels = newcpixels; } } ch = (ythis - ynext) + theight; if (c->button) { int b2height, centre; int bx, bw; /* * Place the Up and Down buttons for a drag list. */ assert(c->button2); rect = [c->button frame]; b2height = VSPACING + 2 * rect.size.height; centre = ynext - rheight/2; bx = (wthis + HSPACING) * 3 / 4; bw = wthis - bx; bx += leftx; [c->button setFrame: NSMakeRect(bx, centre+b2height/2-rect.size.height, bw, rect.size.height)]; [c->button2 setFrame: NSMakeRect(bx, centre-b2height/2, bw, rect.size.height)]; } } break; } for (j = colstart; j < colend; j++) cypos[j] = ythis - ch - VSPACING; if (ret < topy - (ythis - ch)) ret = topy - (ythis - ch); } if (*s->boxname) { NSBox *box = find_box(d, s); assert(box != NULL); [box sizeToFit]; if (s->boxtitle) { NSRect rect = [box frame]; rect.size.height += [[box titleFont] pointSize]; [box setFrame:rect]; } ret += boxh; } //printf("For controlset %s/%s, returning ret=%d\n", // s->pathname, s->boxname, ret); return ret; } void select_panel(void *dv, struct controlbox *b, const char *name) { struct fe_dlg *d = (struct fe_dlg *)dv; int i, j, hidden; struct controlset *s; union control *ctrl; struct fe_ctrl *c; NSBox *box; for (i = 0; i < b->nctrlsets; i++) { s = b->ctrlsets[i]; if (*s->pathname) { hidden = !strcmp(s->pathname, name) ? NO : YES; if ((box = find_box(d, s)) != NULL) { [box setHidden:hidden]; } else { for (j = 0; j < s->ncontrols; j++) { ctrl = s->ctrls[j]; c = fe_ctrl_byctrl(d, ctrl); if (!c) continue; if (c->label) [c->label setHidden:hidden]; if (c->button) [c->button setHidden:hidden]; if (c->button2) [c->button2 setHidden:hidden]; if (c->editbox) [c->editbox setHidden:hidden]; if (c->combobox) [c->combobox setHidden:hidden]; if (c->textview) [c->textview setHidden:hidden]; if (c->tableview) [c->tableview setHidden:hidden]; if (c->scrollview) [c->scrollview setHidden:hidden]; if (c->popupbutton) [c->popupbutton setHidden:hidden]; if (c->radiobuttons) { int j; for (j = 0; j < c->nradiobuttons; j++) [c->radiobuttons[j] setHidden:hidden]; } break; } } } } } void dlg_radiobutton_set(union control *ctrl, void *dv, int whichbutton) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); int j; assert(c->radiobuttons); for (j = 0; j < c->nradiobuttons; j++) [c->radiobuttons[j] setState: (j == whichbutton ? NSOnState : NSOffState)]; } int dlg_radiobutton_get(union control *ctrl, void *dv) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); int j; assert(c->radiobuttons); for (j = 0; j < c->nradiobuttons; j++) if ([c->radiobuttons[j] state] == NSOnState) return j; return 0; /* should never reach here */ } void dlg_checkbox_set(union control *ctrl, void *dv, int checked) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); assert(c->button); [c->button setState:(checked ? NSOnState : NSOffState)]; } int dlg_checkbox_get(union control *ctrl, void *dv) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); assert(c->button); return ([c->button state] == NSOnState); } void dlg_editbox_set(union control *ctrl, void *dv, char const *text) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); if (c->editbox) { [c->editbox setStringValue:[NSString stringWithCString:text]]; } else { assert(c->combobox); [c->combobox setStringValue:[NSString stringWithCString:text]]; } } void dlg_editbox_get(union control *ctrl, void *dv, char *buffer, int length) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); NSString *str; if (c->editbox) { str = [c->editbox stringValue]; } else { assert(c->combobox); str = [c->combobox stringValue]; } if (!str) str = @""; /* The length parameter to this method doesn't include a trailing NUL */ [str getCString:buffer maxLength:length-1]; } void dlg_listbox_clear(union control *ctrl, void *dv) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); if (c->tableview) { [[c->tableview dataSource] clear]; [c->tableview reloadData]; } else { [c->popupbutton removeAllItems]; } } void dlg_listbox_del(union control *ctrl, void *dv, int index) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); if (c->tableview) { [[c->tableview dataSource] removestr:index]; [c->tableview reloadData]; } else { [c->popupbutton removeItemAtIndex:index]; } } void dlg_listbox_addwithid(union control *ctrl, void *dv, char const *text, int id) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); if (c->tableview) { [[c->tableview dataSource] add:text withId:id]; [c->tableview reloadData]; } else { [c->popupbutton addItemWithTitle:[NSString stringWithCString:text]]; [[c->popupbutton lastItem] setTag:id]; } } void dlg_listbox_add(union control *ctrl, void *dv, char const *text) { dlg_listbox_addwithid(ctrl, dv, text, -1); } int dlg_listbox_getid(union control *ctrl, void *dv, int index) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); if (c->tableview) { return [[c->tableview dataSource] getid:index]; } else { return [[c->popupbutton itemAtIndex:index] tag]; } } int dlg_listbox_index(union control *ctrl, void *dv) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); if (c->tableview) { return [c->tableview selectedRow]; } else { return [c->popupbutton indexOfSelectedItem]; } } int dlg_listbox_issel(union control *ctrl, void *dv, int index) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); if (c->tableview) { return [c->tableview isRowSelected:index]; } else { return [c->popupbutton indexOfSelectedItem] == index; } } void dlg_listbox_select(union control *ctrl, void *dv, int index) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); if (c->tableview) { [c->tableview selectRow:index byExtendingSelection:NO]; } else { [c->popupbutton selectItemAtIndex:index]; } } void dlg_text_set(union control *ctrl, void *dv, char const *text) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); assert(c->textview); [c->textview setString:[NSString stringWithCString:text]]; } void dlg_filesel_set(union control *ctrl, void *dv, Filename fn) { /* FIXME */ } void dlg_filesel_get(union control *ctrl, void *dv, Filename *fn) { /* FIXME */ } void dlg_fontsel_set(union control *ctrl, void *dv, FontSpec fn) { /* FIXME */ } void dlg_fontsel_get(union control *ctrl, void *dv, FontSpec *fn) { /* FIXME */ } void dlg_update_start(union control *ctrl, void *dv) { /* FIXME */ } void dlg_update_done(union control *ctrl, void *dv) { /* FIXME */ } void dlg_set_focus(union control *ctrl, void *dv) { /* FIXME */ } union control *dlg_last_focused(union control *ctrl, void *dv) { return NULL; /* FIXME */ } void dlg_beep(void *dv) { NSBeep(); } void dlg_error_msg(void *dv, char *msg) { /* FIXME */ } void dlg_end(void *dv, int value) { struct fe_dlg *d = (struct fe_dlg *)dv; [d->target performSelector:d->action withObject:[NSNumber numberWithInt:value]]; } void dlg_coloursel_start(union control *ctrl, void *dv, int r, int g, int b) { /* FIXME */ } int dlg_coloursel_results(union control *ctrl, void *dv, int *r, int *g, int *b) { return 0; /* FIXME */ } void dlg_refresh(union control *ctrl, void *dv) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c; if (ctrl) { if (ctrl->generic.handler != NULL) ctrl->generic.handler(ctrl, d, d->data, EVENT_REFRESH); } else { int i; for (i = 0; (c = index234(d->byctrl, i)) != NULL; i++) { assert(c->ctrl != NULL); if (c->ctrl->generic.handler != NULL) c->ctrl->generic.handler(c->ctrl, d, d->data, EVENT_REFRESH); } } } void *dlg_get_privdata(union control *ctrl, void *dv) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); return c->privdata; } void dlg_set_privdata(union control *ctrl, void *dv, void *ptr) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); c->privdata = ptr; c->privdata_needs_free = FALSE; } void *dlg_alloc_privdata(union control *ctrl, void *dv, size_t size) { struct fe_dlg *d = (struct fe_dlg *)dv; struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl); /* * This is an internal allocation routine, so it's allowed to * use smalloc directly. */ c->privdata = smalloc(size); c->privdata_needs_free = TRUE; return c->privdata; } Node-path: putty/macosx/osxdlg.m Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 9229 Text-content-md5: 9989054bc6a05ae693bea914d20a1886 Text-content-sha1: debb8f74f8e1c0cdfbf30a447a52909963d8c2b5 Content-length: 9239 PROPS-END SVN/* * osxdlg.m: various PuTTY dialog boxes for OS X. */ #import #include "putty.h" #include "storage.h" #include "dialog.h" #include "osxclass.h" /* * The `ConfigWindow' class is used to start up a new PuTTY * session. */ @class ConfigTree; @interface ConfigTree : NSObject { NSString **paths; int *levels; int nitems, itemsize; } - (void)addPath:(char *)path; @end @implementation ConfigTree - (id)init { self = [super init]; paths = NULL; levels = NULL; nitems = itemsize = 0; return self; } - (void)addPath:(char *)path { if (nitems >= itemsize) { itemsize += 32; paths = sresize(paths, itemsize, NSString *); levels = sresize(levels, itemsize, int); } paths[nitems] = [[NSString stringWithCString:path] retain]; levels[nitems] = ctrl_path_elements(path) - 1; nitems++; } - (void)dealloc { int i; for (i = 0; i < nitems; i++) [paths[i] release]; sfree(paths); sfree(levels); [super dealloc]; } - (id)iterateChildren:(int)index ofItem:(id)item count:(int *)count { int i, plevel; if (item) { for (i = 0; i < nitems; i++) if (paths[i] == item) break; assert(i < nitems); plevel = levels[i]; i++; } else { i = 0; plevel = -1; } if (count) *count = 0; while (index > 0) { if (i >= nitems || levels[i] != plevel+1) return nil; if (count) (*count)++; do { i++; } while (i < nitems && levels[i] > plevel+1); index--; } return paths[i]; } - (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item { return [self iterateChildren:index ofItem:item count:NULL]; } - (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { int count = 0; /* pass nitems+1 to ensure we run off the end */ [self iterateChildren:nitems+1 ofItem:item count:&count]; return count; } - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { return [self outlineView:outlineView numberOfChildrenOfItem:item] > 0; } - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { /* * Trim off all path elements except the last one. */ NSArray *components = [item componentsSeparatedByString:@"/"]; return [components objectAtIndex:[components count]-1]; } @end @implementation ConfigWindow - (id)initWithConfig:(Config)aCfg { NSScrollView *scrollview; NSTableColumn *col; ConfigTree *treedata; int by = 0, mby = 0; int wmin = 0; int hmin = 0; int panelht = 0; get_sesslist(&sl, TRUE); ctrlbox = ctrl_new_box(); setup_config_box(ctrlbox, &sl, FALSE /*midsession*/, aCfg.protocol, 0 /* protcfginfo */); unix_setup_config_box(ctrlbox, FALSE /*midsession*/); cfg = aCfg; /* structure copy */ self = [super initWithContentRect:NSMakeRect(0,0,300,300) styleMask:(NSTitledWindowMask | NSMiniaturizableWindowMask | NSClosableWindowMask) backing:NSBackingStoreBuffered defer:YES]; [self setTitle:@"PuTTY Configuration"]; [self setIgnoresMouseEvents:NO]; dv = fe_dlg_init(&cfg, self, self, @selector(configBoxFinished:)); scrollview = [[NSScrollView alloc] initWithFrame:NSMakeRect(20,20,10,10)]; treeview = [[NSOutlineView alloc] initWithFrame:[scrollview frame]]; [scrollview setBorderType:NSLineBorder]; [scrollview setDocumentView:treeview]; [[self contentView] addSubview:scrollview]; [scrollview setHasVerticalScroller:YES]; [scrollview setAutohidesScrollers:YES]; /* FIXME: the below is untested. Test it then remove this notice. */ [treeview setAllowsColumnReordering:NO]; [treeview setAllowsColumnResizing:NO]; [treeview setAllowsMultipleSelection:NO]; [treeview setAllowsEmptySelection:NO]; [treeview setAllowsColumnSelection:YES]; treedata = [[[ConfigTree alloc] init] retain]; col = [[NSTableColumn alloc] initWithIdentifier:nil]; [treeview addTableColumn:col]; [treeview setOutlineTableColumn:col]; [[treeview headerView] setFrame:NSMakeRect(0,0,0,0)]; /* * Create the controls. */ { int i; char *path = NULL; for (i = 0; i < ctrlbox->nctrlsets; i++) { struct controlset *s = ctrlbox->ctrlsets[i]; int mw, mh; if (!*s->pathname) { create_ctrls(dv, [self contentView], s, &mw, &mh); by += 20 + mh; if (wmin < mw + 40) wmin = mw + 40; } else { int j = path ? ctrl_path_compare(s->pathname, path) : 0; if (j != INT_MAX) { /* add to treeview, start new panel */ char *c; /* * We expect never to find an implicit path * component. For example, we expect never to * see A/B/C followed by A/D/E, because that * would _implicitly_ create A/D. All our path * prefixes are expected to contain actual * controls and be selectable in the treeview; * so we would expect to see A/D _explicitly_ * before encountering A/D/E. */ assert(j == ctrl_path_elements(s->pathname) - 1); c = strrchr(s->pathname, '/'); if (!c) c = s->pathname; else c++; [treedata addPath:s->pathname]; path = s->pathname; panelht = 0; } create_ctrls(dv, [self contentView], s, &mw, &mh); if (wmin < mw + 3*20+150) wmin = mw + 3*20+150; panelht += mh + 20; if (hmin < panelht - 20) hmin = panelht - 20; } } } { int i; NSRect r; [treeview setDataSource:treedata]; for (i = [treeview numberOfRows]; i-- ;) [treeview expandItem:[treeview itemAtRow:i] expandChildren:YES]; [treeview sizeToFit]; r = [treeview frame]; if (hmin < r.size.height) hmin = r.size.height; } [self setContentSize:NSMakeSize(wmin, hmin+60+by)]; [scrollview setFrame:NSMakeRect(20, 40+by, 150, hmin)]; [treeview setDelegate:self]; mby = by; /* * Now place the controls. */ { int i; char *path = NULL; panelht = 0; for (i = 0; i < ctrlbox->nctrlsets; i++) { struct controlset *s = ctrlbox->ctrlsets[i]; if (!*s->pathname) { by -= VSPACING + place_ctrls(dv, s, 20, by, wmin-40); } else { if (!path || strcmp(s->pathname, path)) panelht = 0; panelht += VSPACING + place_ctrls(dv, s, 2*20+150, 40+mby+hmin-panelht, wmin - (3*20+150)); path = s->pathname; } } } select_panel(dv, ctrlbox, [[treeview itemAtRow:0] cString]); [treeview reloadData]; dlg_refresh(NULL, dv); [self center]; /* :-) */ return self; } - (void)configBoxFinished:(id)object { int ret = [object intValue]; /* it'll be an NSNumber */ if (ret) { [controller performSelectorOnMainThread: @selector(newSessionWithConfig:) withObject:[NSData dataWithBytes:&cfg length:sizeof(cfg)] waitUntilDone:NO]; } [self close]; } - (void)outlineViewSelectionDidChange:(NSNotification *)notification { const char *path = [[treeview itemAtRow:[treeview selectedRow]] cString]; select_panel(dv, ctrlbox, path); } - (BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item { return NO; /* no editing! */ } @end /* ---------------------------------------------------------------------- * Various special-purpose dialog boxes. */ int askappend(void *frontend, Filename filename) { return 0; /* FIXME */ } void askalg(void *frontend, const char *algtype, const char *algname) { fatalbox("Cipher algorithm dialog box not supported yet"); return; /* FIXME */ } void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; /* * Verify the key. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) return; /* * FIXME FIXME FIXME. I currently lack any sensible means of * asking the user for a verification non-application-modally, * _or_ any means of closing just this connection if the answer * is no (the Unix and Windows ports just exit() in this * situation since they're one-connection-per-process). * * What I need to do is to make this function optionally- * asynchronous, much like the interface to agent_query(). It * can either run modally and return a result directly, _or_ it * can kick off a non-modal dialog, return a `please wait' * status, and the dialog can call the backend back when the * result comes in. Also, in either case, the aye/nay result * wants to be passed to the backend so that it can tear down * the connection if the answer was nay. * * For the moment, I simply bomb out if we have an unrecognised * host key. This makes this port safe but not very useful: you * can only use it at all if you already have a host key cache * set up by running the Unix port. */ fatalbox("Host key dialog box not supported yet"); } void old_keyfile_warning(void) { /* * This should never happen on OS X. We hope. */ } void about_box(void *window) { /* FIXME */ } Node-path: putty/macosx/osxmain.m Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 8876 Text-content-md5: 1d53749bbccf5819312dd82917d0fb2a Text-content-sha1: 61b83fd0172bd649fe6fc8b0b84269616237d11f Content-length: 8886 PROPS-END SVN/* * osxmain.m: main-program file of Mac OS X PuTTY. */ #import #define PUTTY_DO_GLOBALS /* actually _define_ globals */ #include "putty.h" #include "osxclass.h" /* ---------------------------------------------------------------------- * Global variables. */ AppController *controller; /* ---------------------------------------------------------------------- * Miscellaneous elements of the interface to the cross-platform * and Unix PuTTY code. */ const char platform_x11_best_transport[] = "unix"; char *platform_get_x_display(void) { return NULL; } FontSpec platform_default_fontspec(const char *name) { FontSpec ret; /* FIXME */ return ret; } Filename platform_default_filename(const char *name) { Filename ret; if (!strcmp(name, "LogFileName")) strcpy(ret.path, "putty.log"); else *ret.path = '\0'; return ret; } char *platform_default_s(const char *name) { return NULL; } int platform_default_i(const char *name, int def) { if (!strcmp(name, "CloseOnExit")) return 2; /* maps to FORCE_ON after painful rearrangement :-( */ return def; } char *x_get_default(const char *key) { return NULL; /* this is a stub */ } void modalfatalbox(char *p, ...) { /* FIXME: proper OS X GUI stuff */ va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } void fatalbox(char *p, ...) { /* FIXME: proper OS X GUI stuff */ va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } void cmdline_error(char *p, ...) { va_list ap; fprintf(stderr, "%s: ", appname); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } /* * Clean up and exit. */ void cleanup_exit(int code) { /* * Clean up. */ sk_cleanup(); random_save_seed(); exit(code); } /* ---------------------------------------------------------------------- * Tiny extension to NSMenuItem which carries a payload of a `void * *', allowing several menu items to invoke the same message but * pass different data through it. */ @interface DataMenuItem : NSMenuItem { void *payload; } - (void)setPayload:(void *)d; - (void *)getPayload; @end @implementation DataMenuItem - (void)setPayload:(void *)d { payload = d; } - (void *)getPayload { return payload; } @end /* ---------------------------------------------------------------------- * Utility routines for constructing OS X menus. */ NSMenu *newmenu(const char *title) { return [[[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:[NSString stringWithCString:title]] autorelease]; } NSMenu *newsubmenu(NSMenu *parent, const char *title) { NSMenuItem *item; NSMenu *child; item = [[[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:[NSString stringWithCString:title] action:NULL keyEquivalent:@""] autorelease]; child = newmenu(title); [item setEnabled:YES]; [item setSubmenu:child]; [parent addItem:item]; return child; } id initnewitem(NSMenuItem *item, NSMenu *parent, const char *title, const char *key, id target, SEL action) { unsigned mask = NSCommandKeyMask; if (key[strcspn(key, "-")]) { while (*key && *key != '-') { int c = tolower((unsigned char)*key); if (c == 's') { mask |= NSShiftKeyMask; } else if (c == 'o' || c == 'a') { mask |= NSAlternateKeyMask; } key++; } if (*key) key++; } item = [[item initWithTitle:[NSString stringWithCString:title] action:NULL keyEquivalent:[NSString stringWithCString:key]] autorelease]; if (*key) [item setKeyEquivalentModifierMask: mask]; [item setEnabled:YES]; [item setTarget:target]; [item setAction:action]; [parent addItem:item]; return item; } NSMenuItem *newitem(NSMenu *parent, char *title, char *key, id target, SEL action) { return initnewitem([NSMenuItem allocWithZone:[NSMenu menuZone]], parent, title, key, target, action); } /* ---------------------------------------------------------------------- * AppController: the object which receives the messages from all * menu selections that aren't standard OS X functions. */ @implementation AppController - (id)init { self = [super init]; timer = NULL; return self; } - (void)newTerminal:(id)sender { id win; Config cfg; do_defaults(NULL, &cfg); cfg.protocol = -1; /* PROT_TERMINAL */ win = [[SessionWindow alloc] initWithConfig:cfg]; [win makeKeyAndOrderFront:self]; } - (void)newSessionConfig:(id)sender { id win; Config cfg; do_defaults(NULL, &cfg); win = [[ConfigWindow alloc] initWithConfig:cfg]; [win makeKeyAndOrderFront:self]; } - (void)newSessionWithConfig:(id)vdata { id win; Config cfg; NSData *data = (NSData *)vdata; assert([data length] == sizeof(cfg)); [data getBytes:&cfg]; win = [[SessionWindow alloc] initWithConfig:cfg]; [win makeKeyAndOrderFront:self]; } - (NSMenu *)applicationDockMenu:(NSApplication *)sender { NSMenu *menu = newmenu("Dock Menu"); /* * FIXME: Add some useful things to this, probably including * the saved session list. */ return menu; } - (void)timerFired:(id)sender { long now, next; assert(sender == timer); /* `sender' is the timer itself, so its userInfo is an NSNumber. */ now = [(NSNumber *)[sender userInfo] longValue]; [sender invalidate]; timer = NULL; if (run_timers(now, &next)) [self setTimer:next]; } - (void)setTimer:(long)next { long interval = next - GETTICKCOUNT(); float finterval; if (interval <= 0) interval = 1; /* just in case */ finterval = interval / (float)TICKSPERSEC; if (timer) { [timer invalidate]; } timer = [NSTimer scheduledTimerWithTimeInterval:finterval target:self selector:@selector(timerFired:) userInfo:[NSNumber numberWithLong:next] repeats:NO]; } @end void timer_change_notify(long next) { [controller setTimer:next]; } /* ---------------------------------------------------------------------- * Annoyingly, it looks as if I have to actually subclass * NSApplication if I want to catch NSApplicationDefined events. So * here goes. */ @interface MyApplication : NSApplication { } @end @implementation MyApplication - (void)sendEvent:(NSEvent *)ev { if ([ev type] == NSApplicationDefined) osxsel_process_results(); [super sendEvent:ev]; } @end /* ---------------------------------------------------------------------- * Main program. Constructs the menus and runs the application. */ int main(int argc, char **argv) { NSAutoreleasePool *pool; NSMenu *menu; NSMenuItem *item; NSImage *icon; pool = [[NSAutoreleasePool alloc] init]; icon = [NSImage imageNamed:@"NSApplicationIcon"]; [MyApplication sharedApplication]; [NSApp setApplicationIconImage:icon]; controller = [[[AppController alloc] init] autorelease]; [NSApp setDelegate:controller]; [NSApp setMainMenu: newmenu("Main Menu")]; menu = newsubmenu([NSApp mainMenu], "Apple Menu"); [NSApp setServicesMenu:newsubmenu(menu, "Services")]; [menu addItem:[NSMenuItem separatorItem]]; item = newitem(menu, "Hide PuTTY", "h", NSApp, @selector(hide:)); item = newitem(menu, "Hide Others", "o-h", NSApp, @selector(hideOtherApplications:)); item = newitem(menu, "Show All", "", NSApp, @selector(unhideAllApplications:)); [menu addItem:[NSMenuItem separatorItem]]; item = newitem(menu, "Quit", "q", NSApp, @selector(terminate:)); [NSApp setAppleMenu: menu]; menu = newsubmenu([NSApp mainMenu], "File"); item = newitem(menu, "New", "n", NULL, @selector(newSessionConfig:)); item = newitem(menu, "New Terminal", "t", NULL, @selector(newTerminal:)); item = newitem(menu, "Close", "w", NULL, @selector(performClose:)); menu = newsubmenu([NSApp mainMenu], "Window"); [NSApp setWindowsMenu: menu]; item = newitem(menu, "Minimise Window", "m", NULL, @selector(performMiniaturize:)); // menu = newsubmenu([NSApp mainMenu], "Help"); // item = newitem(menu, "PuTTY Help", "?", NSApp, @selector(showHelp:)); /* * Start up the sub-thread doing select(). */ osxsel_init(); /* * Start up networking. */ sk_init(); /* * FIXME: To make initial debugging more convenient I'm going * to start by opening a session window unconditionally. This * will probably change later on. */ [controller newSessionConfig:nil]; [NSApp run]; [pool release]; return 0; } Node-path: putty/macosx/osxsel.m Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 8932 Text-content-md5: 851c7abc7c845a993dd060f3eb49611b Text-content-sha1: 7033f38a2c35a16a3203c35d37480e8a9f21cda0 Content-length: 8942 PROPS-END SVNVVV/* * osxsel.m: OS X implementation of the front end interface to uxsel. */ #import #include #include "putty.h" #include "osxclass.h" /* * The unofficial Cocoa FAQ at * * http://www.alastairs-place.net/cocoa/faq.txt * * says that Cocoa has the native ability to be given an fd and * tell you when it becomes readable, but cannot tell you when it * becomes _writable_. This is unacceptable to PuTTY, which depends * for correct functioning on being told both. Therefore, I can't * use the Cocoa native mechanism. * * Instead, I'm going to resort to threads. I start a second thread * whose job is to do selects. At the termination of every select, * it posts a Cocoa event into the main thread's event queue, so * that the main thread gets select results interleaved with other * GUI operations. Communication from the main thread _to_ the * select thread is performed by writing to a pipe whose other end * is one of the file descriptors being selected on. (This is the * only sensible way, because we have to be able to interrupt a * select in order to provide a new fd list.) */ /* * In more detail, the select thread must: * * - start off by listening to _just_ the pipe, waiting to be told * to begin a select. * * - when it receives the `start' command, it should read the * shared uxsel data (which is protected by a mutex), set up its * select, and begin it. * * - when the select terminates, it should write the results * (perhaps minus the inter-thread pipe if it's there) into * shared memory and dispatch a GUI event to let the main thread * know. * * - the main thread will then think about it, do some processing, * and _then_ send a command saying `now restart select'. Before * sending that command it might easily have tinkered with the * uxsel structures, which is why it waited before sending it. * * - EOF on the inter-thread pipe, of course, means the process * has finished completely, so the select thread terminates. * * - The main thread may wish to adjust the uxsel settings in the * middle of a select. In this situation it first writes the new * data to the shared memory area, then notifies the select * thread by writing to the inter-thread pipe. * * So the upshot is that the sequence of operations performed in * the select thread must be: * * - read a byte from the pipe (which may block) * * - read the shared uxsel data and perform a select * * - notify the main thread of interesting select results (if any) * * - loop round again from the top. * * This is sufficient. Notifying the select thread asynchronously * by writing to the pipe will cause its select to terminate and * another to begin immediately without blocking. If the select * thread's select terminates due to network data, its subsequent * pipe read will block until the main thread is ready to let it * loose again. */ static int osxsel_pipe[2]; static NSLock *osxsel_inlock; static fd_set osxsel_rfds_in; static fd_set osxsel_wfds_in; static fd_set osxsel_xfds_in; static int osxsel_inmax; static NSLock *osxsel_outlock; static fd_set osxsel_rfds_out; static fd_set osxsel_wfds_out; static fd_set osxsel_xfds_out; static int osxsel_outmax; static int inhibit_start_select; /* * NSThread requires an object method as its thread procedure, so * here I define a trivial holding class. */ @class OSXSel; @interface OSXSel : NSObject { } - (void)runThread:(id)arg; @end @implementation OSXSel - (void)runThread:(id)arg { char c; fd_set r, w, x; int n, ret; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; while (1) { /* * Read one byte from the pipe. */ ret = read(osxsel_pipe[0], &c, 1); if (ret <= 0) return; /* terminate the thread */ /* * Now set up the select data. */ [osxsel_inlock lock]; memcpy(&r, &osxsel_rfds_in, sizeof(fd_set)); memcpy(&w, &osxsel_wfds_in, sizeof(fd_set)); memcpy(&x, &osxsel_xfds_in, sizeof(fd_set)); n = osxsel_inmax; [osxsel_inlock unlock]; FD_SET(osxsel_pipe[0], &r); if (n < osxsel_pipe[0]+1) n = osxsel_pipe[0]+1; /* * Perform the select. */ ret = select(n, &r, &w, &x, NULL); /* * Detect the one special case in which the only * interesting fd was the inter-thread pipe. In that * situation only we are interested - the main thread will * not be! */ if (ret == 1 && FD_ISSET(osxsel_pipe[0], &r)) continue; /* just loop round again */ /* * Write the select results to shared data. * * I _think_ we don't need this data to be lock-protected: * it won't be read by the main thread until after we send * a message indicating that we've finished writing it, and * we won't start another select (hence potentially writing * it again) until the main thread notifies us in return. * * However, I'm scared of multithreading and not totally * convinced of my reasoning, so I'm going to lock it * anyway. */ [osxsel_outlock lock]; memcpy(&osxsel_rfds_out, &r, sizeof(fd_set)); memcpy(&osxsel_wfds_out, &w, sizeof(fd_set)); memcpy(&osxsel_xfds_out, &x, sizeof(fd_set)); osxsel_outmax = n; [osxsel_outlock unlock]; /* * Post a message to the main thread's message queue * telling it that select data is available. */ [NSApp postEvent:[NSEvent otherEventWithType:NSApplicationDefined location:NSMakePoint(0,0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil subtype:0 data1:0 data2:0] atStart:NO]; } [pool release]; } @end void osxsel_init(void) { uxsel_init(); if (pipe(osxsel_pipe) < 0) { fatalbox("Unable to set up inter-thread pipe for select"); } [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:[[[OSXSel alloc] init] retain] withObject:nil]; /* * Also initialise (i.e. clear) the input fd_sets. Need not * start a select just yet - the select thread will block until * we have at least one fd for it! */ FD_ZERO(&osxsel_rfds_in); FD_ZERO(&osxsel_wfds_in); FD_ZERO(&osxsel_xfds_in); osxsel_inmax = 0; /* * Initialise the mutex locks used to protect the data passed * between threads. */ osxsel_inlock = [[[NSLock alloc] init] retain]; osxsel_outlock = [[[NSLock alloc] init] retain]; } static void osxsel_start_select(void) { char c = 'g'; /* for `Go!' :-) but it's never used */ if (!inhibit_start_select) write(osxsel_pipe[1], &c, 1); } int uxsel_input_add(int fd, int rwx) { /* * Add the new fd to the appropriate input fd_sets, then write * to the inter-thread pipe. */ [osxsel_inlock lock]; if (rwx & 1) FD_SET(fd, &osxsel_rfds_in); else FD_CLR(fd, &osxsel_rfds_in); if (rwx & 2) FD_SET(fd, &osxsel_wfds_in); else FD_CLR(fd, &osxsel_wfds_in); if (rwx & 4) FD_SET(fd, &osxsel_xfds_in); else FD_CLR(fd, &osxsel_xfds_in); if (osxsel_inmax < fd+1) osxsel_inmax = fd+1; [osxsel_inlock unlock]; osxsel_start_select(); /* * We must return an `id' which will be passed back to us at * the time of uxsel_input_remove. Since we have no need to * store ids in that sense, we might as well go with the fd * itself. */ return fd; } void uxsel_input_remove(int id) { /* * Remove the fd from all the input fd_sets. In this * implementation, the simplest way to do that is to call * uxsel_input_add with rwx==0! */ uxsel_input_add(id, 0); } /* * Function called in the main thread to process results. It will * have to read the output fd_sets, go through them, call back to * uxsel with the results, and then write to the inter-thread pipe. * * This function will have to be called from an event handler in * osxmain.m, which will therefore necessarily contain a small part * of this mechanism (along with calling osxsel_init). */ void osxsel_process_results(void) { int i; /* * We must write to the pipe to start a fresh select _even if_ * there were no changes. So for efficiency, we set a flag here * which inhibits uxsel_input_{add,remove} from writing to the * pipe; then once we finish processing, we clear the flag * again and write a single byte ourselves. It's cleaner, * because it wakes up the select thread fewer times. */ inhibit_start_select = TRUE; [osxsel_outlock lock]; for (i = 0; i < osxsel_outmax; i++) { if (FD_ISSET(i, &osxsel_xfds_out)) select_result(i, 4); } for (i = 0; i < osxsel_outmax; i++) { if (FD_ISSET(i, &osxsel_rfds_out)) select_result(i, 1); } for (i = 0; i < osxsel_outmax; i++) { if (FD_ISSET(i, &osxsel_wfds_out)) select_result(i, 2); } [osxsel_outlock unlock]; inhibit_start_select = FALSE; osxsel_start_select(); } Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 27709 Text-content-md5: c06c1acebbcd27d5c46f4ce3763baad6 Text-content-sha1: 61f8fcab740bc3a5abc9e36efe9c162309ab5ff5 Content-length: 27719 PROPS-END SVN,,,/* * osxwin.m: code to manage a session window in Mac OS X PuTTY. */ #import #include "putty.h" #include "terminal.h" #include "osxclass.h" /* Colours come in two flavours: configurable, and xterm-extended. */ #define NCFGCOLOURS (lenof(((Config *)0)->colours)) #define NEXTCOLOURS 240 /* 216 colour-cube plus 24 shades of grey */ #define NALLCOLOURS (NCFGCOLOURS + NEXTCOLOURS) /* * The key component of the per-session data is the SessionWindow * class. A pointer to this is used as the frontend handle, to be * passed to all the platform-independent subsystems that require * one. */ @interface TerminalView : NSImageView { NSFont *font; NSImage *image; Terminal *term; Config cfg; NSColor *colours[NALLCOLOURS]; float fw, fasc, fdesc, fh; } - (void)drawStartFinish:(BOOL)start; - (void)setColour:(int)n r:(float)r g:(float)g b:(float)b; - (void)doText:(wchar_t *)text len:(int)len x:(int)x y:(int)y attr:(unsigned long)attr lattr:(int)lattr; @end @implementation TerminalView - (BOOL)isFlipped { return YES; } - (id)initWithTerminal:(Terminal *)aTerm config:(Config)aCfg { float w, h; self = [self initWithFrame:NSMakeRect(0,0,100,100)]; term = aTerm; cfg = aCfg; /* * Initialise the fonts we're going to use. * * FIXME: for the moment I'm sticking with exactly one default font. */ font = [NSFont userFixedPitchFontOfSize:0]; /* * Now determine the size of the primary font. * * FIXME: If we have multiple fonts, we may need to set fasc * and fdesc to the _maximum_ asc and desc out of all the * fonts, _before_ adding them together to get fh. */ fw = [font widthOfString:@"A"]; fasc = [font ascender]; fdesc = -[font descender]; fh = fasc + fdesc; fh = (int)fh + (fh > (int)fh); /* round up, ickily */ /* * Use this to figure out the size of the terminal view. */ w = fw * term->cols; h = fh * term->rows; /* * And set our size and subimage. */ image = [[NSImage alloc] initWithSize:NSMakeSize(w,h)]; [image setFlipped:YES]; [self setImage:image]; [self setFrame:NSMakeRect(0,0,w,h)]; term_invalidate(term); return self; } - (void)drawStartFinish:(BOOL)start { if (start) [image lockFocus]; else [image unlockFocus]; } - (void)doText:(wchar_t *)text len:(int)len x:(int)x y:(int)y attr:(unsigned long)attr lattr:(int)lattr { int nfg, nbg, rlen, widefactor; float ox, oy, tw, th; NSDictionary *attrdict; /* FIXME: TATTR_COMBINING */ nfg = ((attr & ATTR_FGMASK) >> ATTR_FGSHIFT); nbg = ((attr & ATTR_BGMASK) >> ATTR_BGSHIFT); if (attr & ATTR_REVERSE) { int t = nfg; nfg = nbg; nbg = t; } if (cfg.bold_colour && (attr & ATTR_BOLD)) { if (nfg < 16) nfg |= 8; else if (nfg >= 256) nfg |= 1; } if (cfg.bold_colour && (attr & ATTR_BLINK)) { if (nbg < 16) nbg |= 8; else if (nbg >= 256) nbg |= 1; } if (attr & TATTR_ACTCURS) { nfg = 260; nbg = 261; } if (attr & ATTR_WIDE) { widefactor = 2; /* FIXME: what do we actually have to do about wide characters? */ } else { widefactor = 1; } /* FIXME: ATTR_BOLD without cfg.bold_colour */ if ((lattr & LATTR_MODE) != LATTR_NORM) { x *= 2; if (x >= term->cols) return; if (x + len*2*widefactor > term->cols) len = (term->cols-x)/2/widefactor;/* trim to LH half */ rlen = len * 2; } else rlen = len; /* FIXME: how do we actually implement double-{width,height} lattrs? */ ox = x * fw; oy = y * fh; tw = rlen * widefactor * fw; th = fh; /* * Set the clipping rectangle. */ [[NSGraphicsContext currentContext] saveGraphicsState]; [NSBezierPath clipRect:NSMakeRect(ox, oy, tw, th)]; attrdict = [NSDictionary dictionaryWithObjectsAndKeys: colours[nfg], NSForegroundColorAttributeName, colours[nbg], NSBackgroundColorAttributeName, font, NSFontAttributeName, nil]; /* * Create an NSString and draw it. * * Annoyingly, although our input is wchar_t which is four * bytes wide on OS X and terminal.c supports 32-bit Unicode, * we must convert into the two-byte type `unichar' to store in * NSString, so we lose display capability for extra-BMP stuff * at this point. */ { NSString *string; unichar *utext; int i; utext = snewn(len, unichar); for (i = 0; i < len; i++) utext[i] = (text[i] >= 0x10000 ? 0xFFFD : text[i]); string = [NSString stringWithCharacters:utext length:len]; [string drawAtPoint:NSMakePoint(ox, oy) withAttributes:attrdict]; sfree(utext); } /* * Restore the graphics state from before the clipRect: call. */ [[NSGraphicsContext currentContext] restoreGraphicsState]; /* * And flag this area as needing display. */ [self setNeedsDisplayInRect:NSMakeRect(ox, oy, tw, th)]; } - (void)setColour:(int)n r:(float)r g:(float)g b:(float)b { assert(n >= 0 && n < lenof(colours)); colours[n] = [[NSColor colorWithDeviceRed:r green:g blue:b alpha:1.0] retain]; } @end @implementation SessionWindow - (id)initWithConfig:(Config)aCfg { NSRect rect = { {0,0}, {0,0} }; cfg = aCfg; /* structure copy */ init_ucs(&ucsdata, cfg.line_codepage, cfg.utf8_override, CS_UTF8, cfg.vtmode); term = term_init(&cfg, &ucsdata, self); logctx = log_init(self, &cfg); term_provide_logctx(term, logctx); term_size(term, cfg.height, cfg.width, cfg.savelines); termview = [[[TerminalView alloc] initWithTerminal:term config:cfg] autorelease]; /* * Now work out the size of the window. */ rect = [termview frame]; rect.origin = NSMakePoint(0,0); rect.size.width += 2 * cfg.window_border; rect.size.height += 2 * cfg.window_border; /* * Set up a backend. */ { int i; back = &pty_backend; for (i = 0; backends[i].backend != NULL; i++) if (backends[i].protocol == cfg.protocol) { back = backends[i].backend; break; } } { const char *error; char *realhost = NULL; error = back->init(self, &backhandle, &cfg, cfg.host, cfg.port, &realhost, cfg.tcp_nodelay, cfg.tcp_keepalives); if (error) { fatalbox("%s\n", error); /* FIXME: connection_fatal at worst */ } if (realhost) sfree(realhost); /* FIXME: do something with this */ } /* * Create a line discipline. (This must be done after creating * the terminal _and_ the backend, since it needs to be passed * pointers to both.) */ ldisc = ldisc_create(&cfg, term, back, backhandle, self); /* * FIXME: Set up a scrollbar. */ self = [super initWithContentRect:rect styleMask:(NSTitledWindowMask | NSMiniaturizableWindowMask | NSClosableWindowMask) backing:NSBackingStoreBuffered defer:YES]; [self setTitle:@"PuTTY"]; [self setIgnoresMouseEvents:NO]; /* * Put the terminal view in the window. */ rect = [termview frame]; rect.origin = NSMakePoint(cfg.window_border, cfg.window_border); [termview setFrame:rect]; [[self contentView] addSubview:termview]; /* * Set up the colour palette. */ palette_reset(self); /* * FIXME: Only the _first_ document window should be centred. * The subsequent ones should appear down and to the right of * it, probably using the cascade function provided by Cocoa. * Also we're apparently required by the HIG to remember and * reuse previous positions of windows, although I'm not sure * how that works if the user opens more than one of the same * session type. */ [self center]; /* :-) */ return self; } - (void)dealloc { /* * FIXME: Here we must deallocate all sorts of stuff: the * terminal, the backend, the ldisc, the logctx, you name it. * Do so. */ [super dealloc]; } - (void)drawStartFinish:(BOOL)start { [termview drawStartFinish:start]; } - (void)setColour:(int)n r:(float)r g:(float)g b:(float)b { [termview setColour:n r:r g:g b:b]; } - (void)doText:(wchar_t *)text len:(int)len x:(int)x y:(int)y attr:(unsigned long)attr lattr:(int)lattr { /* Pass this straight on to the TerminalView. */ [termview doText:text len:len x:x y:y attr:attr lattr:lattr]; } - (Config *)cfg { return &cfg; } - (void)keyDown:(NSEvent *)ev { NSString *s = [ev characters]; int i; int n = [s length], c = [s characterAtIndex:0], m = [ev modifierFlags]; int cm = [[ev charactersIgnoringModifiers] characterAtIndex:0]; wchar_t output[32]; char coutput[32]; int use_coutput = FALSE, special = FALSE, start, end; printf("n=%d c=U+%04x cm=U+%04x m=%08x\n", n, c, cm, m); /* * FIXME: Alt+numberpad codes. */ /* * Shift and Ctrl with PageUp/PageDown for scrollback. */ if (n == 1 && c == NSPageUpFunctionKey && (m & NSShiftKeyMask)) { term_scroll(term, 0, -term->rows/2); return; } if (n == 1 && c == NSPageUpFunctionKey && (m & NSControlKeyMask)) { term_scroll(term, 0, -1); return; } if (n == 1 && c == NSPageDownFunctionKey && (m & NSShiftKeyMask)) { term_scroll(term, 0, +term->rows/2); return; } if (n == 1 && c == NSPageDownFunctionKey && (m & NSControlKeyMask)) { term_scroll(term, 0, +1); return; } /* * FIXME: Shift-Ins for paste? Or is that not Maccy enough? */ /* * FIXME: Alt (Option? Command?) prefix in general. * * (Note that Alt-Shift-thing will work just by looking at * charactersIgnoringModifiers; but Alt-Ctrl-thing will need * processing properly, and Alt-as-in-Option won't happen at * all. Hmmm.) * * (Note also that we need to be able to override menu key * equivalents before this is particularly useful.) */ start = 1; end = start; /* * Ctrl-` is the same as Ctrl-\, unless we already have a * better idea. */ if ((m & NSControlKeyMask) && n == 1 && cm == '`' && c == '`') { output[1] = '\x1c'; end = 2; } /* We handle Return ourselves, because it needs to be flagged as * special to ldisc. */ if (n == 1 && c == '\015') { coutput[1] = '\015'; use_coutput = TRUE; end = 2; special = TRUE; } /* Control-Shift-Space is 160 (ISO8859 nonbreaking space) */ if (n == 1 && (m & NSControlKeyMask) && (m & NSShiftKeyMask) && cm == ' ') { output[1] = '\240'; end = 2; } /* Control-2, Control-Space and Control-@ are all NUL. */ if ((m & NSControlKeyMask) && n == 1 && (cm == '2' || cm == '@' || cm == ' ') && c == cm) { output[1] = '\0'; end = 2; } /* We don't let MacOS tell us what Backspace is! We know better. */ if (cm == 0x7F && !(m & NSShiftKeyMask)) { coutput[1] = cfg.bksp_is_delete ? '\x7F' : '\x08'; end = 2; use_coutput = special = TRUE; } /* For Shift Backspace, do opposite of what is configured. */ if (cm == 0x7F && (m & NSShiftKeyMask)) { coutput[1] = cfg.bksp_is_delete ? '\x08' : '\x7F'; end = 2; use_coutput = special = TRUE; } /* Shift-Tab is ESC [ Z. Oddly, this combination generates ^Y by * default on MacOS! */ if (cm == 0x19 && (m & NSShiftKeyMask) && !(m & NSControlKeyMask)) { end = 1; output[end++] = '\033'; output[end++] = '['; output[end++] = 'Z'; } /* * NetHack keypad mode. */ if (cfg.nethack_keypad && (m & NSNumericPadKeyMask)) { wchar_t *keys = NULL; switch (cm) { case '1': keys = L"bB"; break; case '2': keys = L"jJ"; break; case '3': keys = L"nN"; break; case '4': keys = L"hH"; break; case '5': keys = L".."; break; case '6': keys = L"lL"; break; case '7': keys = L"yY"; break; case '8': keys = L"kK"; break; case '9': keys = L"uU"; break; } if (keys) { end = 2; if (m & NSShiftKeyMask) output[1] = keys[1]; else output[1] = keys[0]; goto done; } } /* * Application keypad mode. */ if (term->app_keypad_keys && !cfg.no_applic_k && (m & NSNumericPadKeyMask)) { int xkey = 0; switch (cm) { case NSClearLineFunctionKey: xkey = 'P'; break; case '=': xkey = 'Q'; break; case '/': xkey = 'R'; break; case '*': xkey = 'S'; break; /* * FIXME: keypad - and + need to be mapped to ESC O l * and ESC O k, or ESC O l and ESC O m, depending on * xterm function key mode, and I can't remember which * goes where. */ case '\003': xkey = 'M'; break; case '0': xkey = 'p'; break; case '1': xkey = 'q'; break; case '2': xkey = 'r'; break; case '3': xkey = 's'; break; case '4': xkey = 't'; break; case '5': xkey = 'u'; break; case '6': xkey = 'v'; break; case '7': xkey = 'w'; break; case '8': xkey = 'x'; break; case '9': xkey = 'y'; break; case '.': xkey = 'n'; break; } if (xkey) { if (term->vt52_mode) { if (xkey >= 'P' && xkey <= 'S') { output[end++] = '\033'; output[end++] = xkey; } else { output[end++] = '\033'; output[end++] = '?'; output[end++] = xkey; } } else { output[end++] = '\033'; output[end++] = 'O'; output[end++] = xkey; } goto done; } } /* * Next, all the keys that do tilde codes. (ESC '[' nn '~', * for integer decimal nn.) * * We also deal with the weird ones here. Linux VCs replace F1 * to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but * does replace Home and End (1~ and 4~) by ESC [ H and ESC O w * respectively. */ { int code = 0; switch (cm) { case NSF1FunctionKey: code = (m & NSShiftKeyMask ? 23 : 11); break; case NSF2FunctionKey: code = (m & NSShiftKeyMask ? 24 : 12); break; case NSF3FunctionKey: code = (m & NSShiftKeyMask ? 25 : 13); break; case NSF4FunctionKey: code = (m & NSShiftKeyMask ? 26 : 14); break; case NSF5FunctionKey: code = (m & NSShiftKeyMask ? 28 : 15); break; case NSF6FunctionKey: code = (m & NSShiftKeyMask ? 29 : 17); break; case NSF7FunctionKey: code = (m & NSShiftKeyMask ? 31 : 18); break; case NSF8FunctionKey: code = (m & NSShiftKeyMask ? 32 : 19); break; case NSF9FunctionKey: code = (m & NSShiftKeyMask ? 33 : 20); break; case NSF10FunctionKey: code = (m & NSShiftKeyMask ? 34 : 21); break; case NSF11FunctionKey: code = 23; break; case NSF12FunctionKey: code = 24; break; case NSF13FunctionKey: code = 25; break; case NSF14FunctionKey: code = 26; break; case NSF15FunctionKey: code = 28; break; case NSF16FunctionKey: code = 29; break; case NSF17FunctionKey: code = 31; break; case NSF18FunctionKey: code = 32; break; case NSF19FunctionKey: code = 33; break; case NSF20FunctionKey: code = 34; break; } if (!(m & NSControlKeyMask)) switch (cm) { case NSHomeFunctionKey: code = 1; break; #ifdef FIXME case GDK_Insert: case GDK_KP_Insert: code = 2; break; #endif case NSDeleteFunctionKey: code = 3; break; case NSEndFunctionKey: code = 4; break; case NSPageUpFunctionKey: code = 5; break; case NSPageDownFunctionKey: code = 6; break; } /* Reorder edit keys to physical order */ if (cfg.funky_type == FUNKY_VT400 && code <= 6) code = "\0\2\1\4\5\3\6"[code]; if (term->vt52_mode && code > 0 && code <= 6) { output[end++] = '\033'; output[end++] = " HLMEIG"[code]; goto done; } if (cfg.funky_type == FUNKY_SCO && /* SCO function keys */ code >= 11 && code <= 34) { char codes[] = "MNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@[\\]^_`{"; int index = 0; switch (cm) { case NSF1FunctionKey: index = 0; break; case NSF2FunctionKey: index = 1; break; case NSF3FunctionKey: index = 2; break; case NSF4FunctionKey: index = 3; break; case NSF5FunctionKey: index = 4; break; case NSF6FunctionKey: index = 5; break; case NSF7FunctionKey: index = 6; break; case NSF8FunctionKey: index = 7; break; case NSF9FunctionKey: index = 8; break; case NSF10FunctionKey: index = 9; break; case NSF11FunctionKey: index = 10; break; case NSF12FunctionKey: index = 11; break; } if (m & NSShiftKeyMask) index += 12; if (m & NSControlKeyMask) index += 24; output[end++] = '\033'; output[end++] = '['; output[end++] = codes[index]; goto done; } if (cfg.funky_type == FUNKY_SCO && /* SCO small keypad */ code >= 1 && code <= 6) { char codes[] = "HL.FIG"; if (code == 3) { output[1] = '\x7F'; end = 2; } else { output[end++] = '\033'; output[end++] = '['; output[end++] = codes[code-1]; } goto done; } if ((term->vt52_mode || cfg.funky_type == FUNKY_VT100P) && code >= 11 && code <= 24) { int offt = 0; if (code > 15) offt++; if (code > 21) offt++; if (term->vt52_mode) { output[end++] = '\033'; output[end++] = code + 'P' - 11 - offt; } else { output[end++] = '\033'; output[end++] = 'O'; output[end++] = code + 'P' - 11 - offt; } goto done; } if (cfg.funky_type == FUNKY_LINUX && code >= 11 && code <= 15) { output[end++] = '\033'; output[end++] = '['; output[end++] = '['; output[end++] = code + 'A' - 11; goto done; } if (cfg.funky_type == FUNKY_XTERM && code >= 11 && code <= 14) { if (term->vt52_mode) { output[end++] = '\033'; output[end++] = code + 'P' - 11; } else { output[end++] = '\033'; output[end++] = 'O'; output[end++] = code + 'P' - 11; } goto done; } if (cfg.rxvt_homeend && (code == 1 || code == 4)) { if (code == 1) { output[end++] = '\033'; output[end++] = '['; output[end++] = 'H'; } else { output[end++] = '\033'; output[end++] = 'O'; output[end++] = 'w'; } goto done; } if (code) { char buf[20]; sprintf(buf, "\x1B[%d~", code); for (i = 0; buf[i]; i++) output[end++] = buf[i]; goto done; } } /* * Cursor keys. (This includes the numberpad cursor keys, * if we haven't already done them due to app keypad mode.) */ { int xkey = 0; switch (cm) { case NSUpArrowFunctionKey: xkey = 'A'; break; case NSDownArrowFunctionKey: xkey = 'B'; break; case NSRightArrowFunctionKey: xkey = 'C'; break; case NSLeftArrowFunctionKey: xkey = 'D'; break; } if (xkey) { /* * The arrow keys normally do ESC [ A and so on. In * app cursor keys mode they do ESC O A instead. * Ctrl toggles the two modes. */ if (term->vt52_mode) { output[end++] = '\033'; output[end++] = xkey; } else if (!term->app_cursor_keys ^ !(m & NSControlKeyMask)) { output[end++] = '\033'; output[end++] = 'O'; output[end++] = xkey; } else { output[end++] = '\033'; output[end++] = '['; output[end++] = xkey; } goto done; } } done: /* * Failing everything else, send the exact Unicode we got from * OS X. */ if (end == start) { if (n > lenof(output)-start) n = lenof(output)-start; /* _shouldn't_ happen! */ for (i = 0; i < n; i++) { output[i+start] = [s characterAtIndex:i]; } end = n+start; } if (use_coutput) { assert(special); assert(end < lenof(coutput)); coutput[end] = '\0'; ldisc_send(ldisc, coutput+start, -2, TRUE); } else { luni_send(ldisc, output+start, end-start, TRUE); } } - (int)fromBackend:(const char *)data len:(int)len isStderr:(int)is_stderr { return term_data(term, is_stderr, data, len); } @end int from_backend(void *frontend, int is_stderr, const char *data, int len) { SessionWindow *win = (SessionWindow *)frontend; return [win fromBackend:data len:len isStderr:is_stderr]; } void frontend_keypress(void *handle) { /* FIXME */ } void connection_fatal(void *frontend, char *p, ...) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME: proper OS X GUI stuff */ va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } void notify_remote_exit(void *frontend) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } void ldisc_update(void *frontend, int echo, int edit) { //SessionWindow *win = (SessionWindow *)frontend; /* * In a GUI front end, this need do nothing. */ } void update_specials_menu(void *frontend) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } /* * This is still called when mode==BELL_VISUAL, even though the * visual bell is handled entirely within terminal.c, because we * may want to perform additional actions on any kind of bell (for * example, taskbar flashing in Windows). */ void beep(void *frontend, int mode) { //SessionWindow *win = (SessionWindow *)frontend; if (mode != BELL_VISUAL) NSBeep(); } int char_width(Context ctx, int uc) { /* * Under X, any fixed-width font really _is_ fixed-width. * Double-width characters will be dealt with using a separate * font. For the moment we can simply return 1. */ return 1; } void palette_set(void *frontend, int n, int r, int g, int b) { SessionWindow *win = (SessionWindow *)frontend; if (n >= 16) n += 256 - 16; if (n > NALLCOLOURS) return; [win setColour:n r:r/255.0 g:g/255.0 b:b/255.0]; /* * FIXME: do we need an OS X equivalent of set_window_background? */ } void palette_reset(void *frontend) { SessionWindow *win = (SessionWindow *)frontend; Config *cfg = [win cfg]; /* This maps colour indices in cfg to those used in colours[]. */ static const int ww[] = { 256, 257, 258, 259, 260, 261, 0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 }; int i; for (i = 0; i < NCFGCOLOURS; i++) { [win setColour:ww[i] r:cfg->colours[i][0]/255.0 g:cfg->colours[i][1]/255.0 b:cfg->colours[i][2]/255.0]; } for (i = 0; i < NEXTCOLOURS; i++) { if (i < 216) { int r = i / 36, g = (i / 6) % 6, b = i % 6; [win setColour:i+16 r:r/5.0 g:g/5.0 b:b/5.0]; } else { int shade = i - 216; float fshade = (shade + 1) / (float)(NEXTCOLOURS - 216 + 1); [win setColour:i+16 r:fshade g:fshade b:fshade]; } } /* * FIXME: do we need an OS X equivalent of set_window_background? */ } Context get_ctx(void *frontend) { SessionWindow *win = (SessionWindow *)frontend; /* * Lock the drawing focus on the image inside the TerminalView. */ [win drawStartFinish:YES]; [[NSGraphicsContext currentContext] setShouldAntialias:YES]; /* * Cocoa drawing functions don't take a graphics context: that * parameter is implicit. Therefore, we'll use the frontend * handle itself as the context, on the grounds that it's as * good a thing to use as any. */ return frontend; } void free_ctx(Context ctx) { SessionWindow *win = (SessionWindow *)ctx; [win drawStartFinish:NO]; } void do_text(Context ctx, int x, int y, wchar_t *text, int len, unsigned long attr, int lattr) { SessionWindow *win = (SessionWindow *)ctx; [win doText:text len:len x:x y:y attr:attr lattr:lattr]; } void do_cursor(Context ctx, int x, int y, wchar_t *text, int len, unsigned long attr, int lattr) { SessionWindow *win = (SessionWindow *)ctx; Config *cfg = [win cfg]; int active, passive; if (attr & TATTR_PASCURS) { attr &= ~TATTR_PASCURS; passive = 1; } else passive = 0; if ((attr & TATTR_ACTCURS) && cfg->cursor_type != 0) { attr &= ~TATTR_ACTCURS; active = 1; } else active = 0; [win doText:text len:len x:x y:y attr:attr lattr:lattr]; /* * FIXME: now draw the various cursor types (both passive and * active underlines and vertical lines, plus passive blocks). */ } /* * Minimise or restore the window in response to a server-side * request. */ void set_iconic(void *frontend, int iconic) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } /* * Move the window in response to a server-side request. */ void move_window(void *frontend, int x, int y) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } /* * Move the window to the top or bottom of the z-order in response * to a server-side request. */ void set_zorder(void *frontend, int top) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } /* * Refresh the window in response to a server-side request. */ void refresh_window(void *frontend) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } /* * Maximise or restore the window in response to a server-side * request. */ void set_zoomed(void *frontend, int zoomed) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } /* * Report whether the window is iconic, for terminal reports. */ int is_iconic(void *frontend) { //SessionWindow *win = (SessionWindow *)frontend; return NO; /* FIXME */ } /* * Report the window's position, for terminal reports. */ void get_window_pos(void *frontend, int *x, int *y) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } /* * Report the window's pixel size, for terminal reports. */ void get_window_pixels(void *frontend, int *x, int *y) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } /* * Return the window or icon title. */ char *get_window_title(void *frontend, int icon) { //SessionWindow *win = (SessionWindow *)frontend; return NULL; /* FIXME */ } void set_title(void *frontend, char *title) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } void set_icon(void *frontend, char *title) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } void set_sbar(void *frontend, int total, int start, int page) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } void get_clip(void *frontend, wchar_t ** p, int *len) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } void write_clip(void *frontend, wchar_t * data, int len, int must_deselect) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } void request_paste(void *frontend) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } void set_raw_mouse_mode(void *frontend, int activate) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } void request_resize(void *frontend, int w, int h) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ } void sys_cursor(void *frontend, int x, int y) { //SessionWindow *win = (SessionWindow *)frontend; /* * This is probably meaningless under OS X. FIXME: find out for * sure. */ } void logevent(void *frontend, const char *string) { //SessionWindow *win = (SessionWindow *)frontend; /* FIXME */ printf("logevent: %s\n", string); } int font_dimension(void *frontend, int which)/* 0 for width, 1 for height */ { //SessionWindow *win = (SessionWindow *)frontend; return 1; /* FIXME */ } void set_busy_status(void *frontend, int status) { /* * We need do nothing here: the OS X `application is busy' * beachball pointer appears _automatically_ when the * application isn't responding to GUI messages. */ } Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7807e4cab21f409fe9d6a66742248113 Text-delta-base-sha1: 1062aaee9621f2da93439166556b6d1e7dd10e5c Text-content-length: 3223 Text-content-md5: 043b256e64f259a62d4fd9e67fe0403c Text-content-sha1: 0ccd75da88b0650276aa9196c2de70b51711683d Content-length: 3223 SVNF`AGDNJvV@M[pJz \u mUfUHN)HHE7MWT5dxNW&9d`>wR~xb~]m!% or $i eq "[MX]") and defined $prog) { $type = substr($i,1,(length $i)-2 or "x.m" (depending on # which one exists)!~ /\./) { $file = "$j.c"; $file = "$j.m" unless &findfile($file),"osx; my $i; my $outdir = undef(defined $outdir ? $outdir . $name : undef)if ($i !~ /\./) { ($x = $otmpl) =~ s/X/$i/; } push @ret, $x if $x ne ""; } return join " ", @ret; } sub special { my ($prog, $suffixif (substr($i, (length $i) - (length $suffix)) eq $suffix) { push @ret, $i; } } return (scalar @ret) ? (join " ", @ret) : undef":$types:", ":$type:"":$types:", ":$type:":X::C")); print "\n\n"; foreach $p (&prognames("G::C")); print "\n\n"; foreach $p (&prognames("G:::C")); print "\n\n"; foreach $p (&prognames("G::::U")); print "\n\n"; foreach $p (&prognames("X:::C")); print "\n\n"; foreach $p (&prognames("G: if (defined $makefiles{'osx'}) { $dirpfx = &dirpfx($makefiles{'osx'}, "/"); ##-- Mac OS X makefile open OUT, ">$makefiles{'osx'}"; select OUT; print "# Makefile for $project_name under Mac OS XgCC = \$(TOOLPATH)gcc\n". "\n". &splitline("CFLAGS = -O2 -Wall -Werror -g " . (join " ", map {"-I$dirpfx$_"} @srcdirs))."\n". "MLDFLAGS = -framework Cocoa\n". "ULDFLAGS =\n". &splitline("all:" . join "", map { " $_" } &progrealnames("MX:U")) . "\n" . $makefile_extra{'osx'} . "\n"; foreach $p (&prognames("MX")) { ($prog, $type) = split ",", $p; $objstr = &objects($p, "X.o", undef, undef); $icon = &special($p, ".icns"); $infoplist = &special($p, "info.plist"); print "${prog}.app:\n\tmkdir -p \$\@\n"; print "${prog}.app/Contents: ${prog}.app\n\tmkdir -p \$\@\n"; print "${prog}.app/Contents/MacOS: ${prog}.app/Contents\n\tmkdir -p \$\@\n"; $targets = "${prog}.app/Contents/MacOS/$prog"; if (defined $icon) { print "${prog}.app/Contents/Resources: ${prog}.app/Contents\n\tmkdir -p \$\@\n"; print "${prog}.app/Contents/Resources/${prog}.icns: ${prog}.app/Contents/Resources $icon\n\tcp $icon \$\@\n"; $targets .= " ${prog}.app/Contents/Resources/${prog}.icns"; } if (defined $infoplist) { print "${prog}.app/Contents/Info.plist: ${prog}.app/Contents/Resources $infoplist\n\tcp $infoplist \$\@\n"; $targets .= " ${prog}.app/Contents/Info.plist"; } $targets .= " \$(${prog}_extra)"; print &splitline("${prog}: $targets", 69) . "\n\n"; print &splitline("${prog}.app/Contents/MacOS/$prog: ". "${prog}.app/Contents/MacOSMLDFLAGS) -o \$@p (&prognames("ULDFLAGS) -o \$@undef, $dirpfx, "/ "\n"; $firstdep = $d->{deps}->[0]; if ($firstdep =~ /\.c$/) { print "\t\$(CC) \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c \$<\n"; } elsif ($firstdep =~ /\.m$/) { print "\t\$(CC) -x objective-c \$(COMPAT) \$(FWHACK) \$(XFLAGS) \$(CFLAGS) -c \$<\n"; } } print "\nclean:\n". "\trm -f *.o *.dmg\n". "\trm -rf *.app\n"; Node-path: putty/puttyps.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7733521efb0e0761561d051ab1694808 Text-delta-base-sha1: ad1848981b1faefa0df889aa9563692dd5c4e5c0 Text-content-length: 96 Text-content-md5: 468379bc2e352aa861f3656333ea04fe Text-content-sha1: b758c441c63045eafacab9a87befec3d862cdc2e Content-length: 96 SVN3\O Oif defined(MACOSX) #include "osx.h" #else #include "unix.h" #endif #endif Revision-number: 5309 Prop-content-length: 506 Content-length: 506 K 7 svn:log V 405 The Windows host key dialogs now have a `Help' button that should give appropriate context help, iff the help file is present. (Shame it's prey to `winhelp-crash'.) (I've perpetrated a widening of visibility of `hwnd'; the alternative, putting it into a frontend handle, seemed too likely to cause maintenance trouble if we don't also _use_ that frontend handle everywhere we now use the global `hwnd'.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-15T22:23:47.944504Z PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b371a8ab5c0e573ea2a1f4bfcfa3966 Text-delta-base-sha1: 0a2b0981a49978bf2b3cdecfa27f150cfb1e87d5 Text-content-length: 110 Text-content-md5: 9edebf10d4c688a7e62d1dd7bb66f9f9 Text-content-sha1: 6c50bd4c62ea592c64e9d61cff5294318f7d039e Content-length: 110 SVNZ3Sq{ntf\cfg{winhelp-topic}{errors.hostkey.absent\cfg{winhelp-topic}{errors.hostkey.changed Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 64af9e438f60d4b2ca345512be223b14 Text-delta-base-sha1: fce983e63b3ab239478a977b96c4318aab39530f Text-content-length: 1772 Text-content-md5: b6a578588036ea1fd1385612a28ce433 Text-content-sha1: 220e2ac647886a1162f4f23589a29b5f9271cd61 Content-length: 1772 SVNS.0/?+z*u<(f~(u^/* Helper function for verify_ssh_host_key(). */ static VOID CALLBACK verify_ssh_host_key_help(LPHELPINFO lpHelpInfo) { if (help_path) { char *context = NULL; #define CHECK_CTX(name) \ do { \ if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \ context = WINHELP_CTX_ ## name; \ } while (0) CHECK_CTX(errors_hostkey_absent); CHECK_CTX(errors_hostkey_changed); #undef CHECK_CTX if (context) { char *cmd = dupprintf("JI(`',`%s')", context); WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); sfree(cmd); requested_help = TRUE; } }UINT help_button = 0; MSGBOXPARAMS mbox; /* * We use MessageBoxIndirect() because it allows us to specify a * callback function for the Help button. */ mbox.cbSize = sizeof(mbox); mbox.hwndOwner = hwnd; mbox.lpfnMsgBoxCallback = &verify_ssh_host_key_help; mbox.dwLanguageId = LANG_NEUTRAL; /* Do we have a help file? */ if (help_path) help_button = MB_HELPmbox.lpszText = dupprintf(wrongmsg, appname, keytype, fingerprint, appname); mbox.lpszCaption = dupprintf(mbtitle, appname); mbox.dwContextHelpId = HELPCTXID(errors_hostkey_changed); mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 | help_button; mbret = MessageBoxIndirect(&mbox); sfree((void *)mbox.lpszText); sfree((void *)mbox.lpszCaptionmbox.lpszText = dupprintf(absentmsg, keytype, fingerprint, appname); mbox.lpszCaption = dupprintf(mbtitle, appname); mbox.dwContextHelpId = HELPCTXID(errors_hostkey_absent); mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 | help_button; mbret = MessageBoxIndirect(&mbox); sfree((void *)mbox.lpszText); sfree((void *)mbox.lpszCaption Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a77917d0a1cc022ec9361bedb0ad7669 Text-delta-base-sha1: 4a8e3aabec64627fe884cb57a3583f31abdae88c Text-content-length: 59 Text-content-md5: 45facf449888011c700aeafbfe54b9ac Text-content-sha1: 176100dcf8a2cdb01f0f6c8f94df484ef7b22cda Content-length: 59 SVN ?.Rr *) p, "\x1B%c", "pp Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f71289efc11191a7ee8b57ea6802382 Text-delta-base-sha1: 72e3228e019a2973b9a71a4469812a8670b9040e Text-content-length: 634 Text-content-md5: da32863436852b9d25906c495b498ace Text-content-sha1: c8012bb868a97e31623b8e269f16cfa9440f987f Content-length: 634 SVNEH dMda/* * winhelp.h - define Windows Help context names. These match up with * the \cfg{winhelp-topic} directives in the Halibut source. */ /* These are used in the cross-platform configuration dialog code. /* These are used in Windows-specific bits of the frontend. * We (ab)use "help context identifiers" (dwContextId) to identify them. */ #define HELPCTXID(x) WINHELP_CTXID_ ## x #define WINHELP_CTX_errors_hostkey_absent "errors.hostkey.absent" #define WINHELP_CTXID_errors_hostkey_absent 1 #define WINHELP_CTX_errors_hostkey_changed "errors.hostkey.changed" #define WINHELP_CTXID_errors_hostkey_changed 2 Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 55d45f809ab67fb65a789a6e3299a012 Text-delta-base-sha1: ab13541602b3276a52bf99dfc9b320ea737364c7 Text-content-length: 126 Text-content-md5: e325c0b40cc73d49a74ad542383a4c62 Text-content-sha1: b3cd7ed93842c8d4178a742674ea450abd59c3d7 Content-length: 126 SVNE hDhwindows that can be running during a * PuTTY session. */ GLOBAL HWND hwnd; /* the main terminal window Revision-number: 5310 Prop-content-length: 324 Content-length: 324 K 7 svn:log V 224 Grouping boxes for the configuration dialogue. The System 7 version is completely untested so far, but the Appearance Manager version works and looks plausible. There are still some HI Guideline spacing issues to address. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-02-15T22:41:00.488596Z PROPS-END Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 317e65f7976d8f7f5afec11f6b3dbef3 Text-delta-base-sha1: 2413b69f0246caafee123466f041679af5b5b226 Text-content-length: 63 Text-content-md5: 27a6af535a6fcb1fc07284a5bcfb7773 Text-content-sha1: c0adfb7bbe1d6742a81aef248e7dc1ed2c87550b Content-length: 63 SVNs) &edata 'CDEF' (CDEF_GroupBox) { $"43 Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 008ed4a7b7225106332e9f1215e4514f Text-delta-base-sha1: 632f20f81ce600d3dfe63222473eeafd4e55b8f6 Text-content-length: 2551 Text-content-md5: f822d03e67185cc27d85570635e6e6c8 Text-content-sha1: 3b448ad77b072b85db03c450dcd1ef3c0c32b255 Content-length: 2551 SVN>>{nnn!)-V?hVJcr rj_"um~9LNuz*$d@qM, MACCTRL_GROUPBOX struct { struct macctrl_generic generic; ControlRef tbctrl; } groupbox; }; struct mac_layoutstate { Point pos; Point boxpos; char *boxnamestatic void macctrl_groupstatic pascal SInt32 macctrl_sys7_groupbox_cdef(SInt16, ControlRef, cdef = (PatchCDEF)GetResource(kControlDefProcResourceType, CDEF_GroupBox); (*cdef)->theUPP = NewControlDefProc(macctrl_sys7_group/* Start a containing box, if we have a boxname. */ if (s->boxname && *s->boxname) { curstate->boxpos = curstate->pos; if (s->boxtitle) { curstate->boxname = s->boxtitle; curstate->pos.v += 10; /* XXX determine font height */ } else { curstate->boxname = NULL; } curstate->pos.v += 6; curstate->pos.h += 12; curstate->width -= 24; }*ctrl = snew(union control); ctrl->generic.handler = NULL; ctrl->text.label = dupstr(s->boxtitle); macctrl_text(mcs, window, curstate, ctrl); /* FIXME: should be highlighted, centred or boxed */ } cols[0] = *curstate; ncols = 1; if (s->boxname && *s->boxname) { union control *ctrl = snew(union control); /* We're coming out of a box, so set the width back */ curstate->pos.h -= 12; curstate->width += 24; /* And draw the box to the original width */ macctrl_groupbox(mcs, window, curstate, ctrl); } case MACCTRL_GROUPBOX: hideshow(mc->groupbox#if !TARGET_API_MAC_CARBON static pascal SInt32 macctrl_sys7_groupbox_cdef(SInt16 variant, ControlRef control, ControlDefProcMessage msg, SInt32 param) { RgnHandle rgn; Rect rectPenPat(&qd.gray); FrameRect(&rectstatic void macctrl_group (union macctrl); Str255 ptitle; Rect r; r.top = curstate->boxpos.v; r.left = curstate->boxpos.h; r.bottom = curstate->pos.v; r.right = curstate->boxpos.h + curstate->width; mc->generic.type = MACCTRL_GROUPBOX; mc->generic.privdata = NULL; mc->generic.ctrl = ctrl; mc->generic.ctrl->generic.handler = NULL; if (curstate->boxname) c2pstrcpy(ptitle, curstate->boxname); else c2pstrcpy(ptitle, ""); if (mac_gestalts.apprvers >= 0x100) { /* Appearance Manager */ mc->groupbox.tbctrl = NewControl(window, &r, ptitle, FALSE, 0, 0, 1, kControlGroupBoxTextTitleProc, (long)mc); } else { mc->groupbox.tbctrl = NewControl(window, &r, ptitle, FALSE, 0, 0, 1, SYS7_GROUPBOX_PROC, (long)mc); } add234(mcs->byctrl, mc)} Node-path: putty/mac/macresid.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d6d44955032712e722613547e563758 Text-delta-base-sha1: a925493c7ffa0d25324a6569b794884c2705e00a Text-content-length: 98 Text-content-md5: 731029013dc62cc2efdbd72408acdf7e Text-content-sha1: ce814c08c501666bf6999f054be52f6f85ce82ad Content-length: 98 SVNMQMQ#define CDEF_GroupBox 132 #define SYS7_GROUPBOX_PROC (CDEF_GroupBox << 4) Revision-number: 5311 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2005-02-15T23:39:57.950230Z K 7 svn:log V 21 Update on Mac ports. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 361d3705a9f7d57c31bf35baaafe2f8a Text-delta-base-sha1: 15fdafd2eeaea01f2df86d943a2055ca884d3dee Text-content-length: 409 Text-content-md5: bfe457aa5fa65a411b021787b9278d7b Text-content-sha1: 1fb9f393914c592daca66e9e4eed07f93e07a293 Content-length: 409 SVNTp ~<~6are several answers to this question: \b The Unix/Gtk port is already fully working under Mac OS X as an X11 application. \b A native (Cocoa) Mac OS X port is in progress. It's just about usable, but is of nowhere near release quality yet, and is likely to behave in unexpected ways. \b A separate port to the classic Mac OS (pre-OSX) is also in progress; it too is not ready yet Revision-number: 5312 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2005-02-15T23:40:09.654731Z K 7 svn:log V 20 Update on Mac ports K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0515e0876194ecabe4f854399eb7c268 Text-delta-base-sha1: 4427fd60797c20c0f6dd11efd4a10e72cefcb786 Text-content-length: 471 Text-content-md5: 11cd94f62a4dd948998f9408089c273d Text-content-sha1: 0fd1c2655cc580ae6c782534db24ec6cac6b3781 Content-length: 471 SVNJ)=S^)jare ports to classic Mac OS and Mac OS X in progress. They're both at the just-about-usable stage, but are a long way from release, and things might behave unexpectedly and change without warning. See: Revision-number: 5313 Prop-content-length: 126 Content-length: 126 K 7 svn:log V 26 Add precise crash details K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-15T23:57:24.908419Z PROPS-END Node-path: putty-wishlist/data/winhelp-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: baaa1adef8e4b76456a5e31c60ba6463 Text-delta-base-sha1: 19018de6ae0828b28d91dc7ddae5072f2c512f02 Text-content-length: 302 Text-content-md5: c0de10d637b36ba5b1205c0f1a3811f6 Text-content-sha1: a0bdacc56da8f6c0353351adf9fbc025c3c55c99 Content-length: 302 SVNC^C The precise crash (on Win98SE at least) is: "WINHLP32 caused an invalid page fault in module WINHLP32.EXE at 0167:004099ba." (A Google Groups search finds an apparently unrelated reference, so it's not just us.) Revision-number: 5314 Prop-content-length: 236 Content-length: 236 K 8 svn:date V 27 2005-02-16T01:47:10.538518Z K 7 svn:log V 135 Minor reorganisations to WinHelp support. (Done as part of a - failed - attempt to fix `winhelp-crash', but we may as well keep them.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 45facf449888011c700aeafbfe54b9ac Text-delta-base-sha1: 176100dcf8a2cdb01f0f6c8f94df484ef7b22cda Text-content-length: 93 Text-content-md5: fd109e76232d05c179826e0e92451cef Text-content-sha1: ee7ea222b2512b686b2a80e156cbf69f5821d333 Content-length: 93 SVN" *+`PUTTY_HELP_FILEPUTTY_HELP_CONTENTSp| p "\x1B%c", " Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc33fa4925da1406e4bbcde3a5dd3f13 Text-delta-base-sha1: c9a8787ddef973ee5662b3d068074a55e46bda4b Text-content-length: 802 Text-content-md5: 73635deab605acd21306eb499e0f3523 Text-content-sha1: 54aa7840bc02dd163027571b8fde5d881dd110ab Content-length: 802 SVN}KI:^r_qdt>xS#%Zh_I|v}topictopic = "puttygen.generatetopic = "puttygen.pastekeytopic = "puttygen.fingerprinttopic = "puttygen.commenttopic = "puttygen.passphrase"; break; case IDC_LOADSTATIC: case IDC_LOAD: topic = "puttygen.load"; break; case IDC_SAVESTATIC: case IDC_SAVE: topic = "puttygen.savepriv"; break; case IDC_SAVEPUB: topic = "puttygen.savepubtopic = "puttygen.keytypetopic = "puttygen.bitstopic = "puttygen.conversions"; break; } if (topic) { char *cmd = dupprintf("JI(`',`%s')", topic); WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); sfree(PUTTY_HELP_FILE Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a6cc5849e3b8d32aa276d716b01a22e8 Text-delta-base-sha1: 5dc3f61d4d4539091bb988d18e949850fa0ff805 Text-content-length: 429 Text-content-md5: 50e3de7c410414745a4f74ec24e40b0c Text-content-sha1: 08f8dcb904f71c2dd87f30e1ad022a20f5a691ca Content-length: 429 SVN:j e{S4(topic = NULL; switch (id) { case 100: topic = "pageant.keylist"; break; case 101: topic = "pageant.addkey"; break; case 102: topic = "pageant.remkey"; break; } if (topic) { char *cmd = dupprintf("JI(`',`%s')", topic); WinHelp(main_hwnd, help_path, HELP_COMMAND, (DWORD)cmd); sfree(PUTTY_HELP_FILE Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e325c0b40cc73d49a74ad542383a4c62 Text-delta-base-sha1: b3cd7ed93842c8d4178a742674ea450abd59c3d7 Text-content-length: 88 Text-content-md5: 4e4581680ae95f850d462db9ca419c4f Text-content-sha1: 62a3a97d3cedf94c3b46943c18aac1da0fccf6d3 Content-length: 88 SVNE BeBkZPUTTY_HELP_FILE "putty.hlp" #define PUTTY_HELP_CONTENTS "putty.cnt Revision-number: 5315 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2005-02-16T02:53:04.199541Z K 7 svn:log V 38 Mind-numbing detail of investigations K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winhelp-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c0de10d637b36ba5b1205c0f1a3811f6 Text-delta-base-sha1: a0bdacc56da8f6c0353351adf9fbc025c3c55c99 Text-content-length: 1352 Text-content-md5: c6d614e3db20bf59a9fd3d1ef6f4e59b Text-content-sha1: ffefe118539e06b0a17d9f5bd7447ee55827d293 Content-length: 1352 SVN^:-r~C/or from Explorer, works fine (and generates a hidden putty.GID file), and subsequently to that, context help works too.
    • If all the files (including .GID) are moved to a different path, things break again.
    • Deleting the hidden putty.GID file doesn't appear to cause other instances not to break, but it can break a previously-working installation if other help files are accessed in the meantime.
    • The two installations can be copies of each other and still cause trouble.

    Things I've tried, in desperation:

    • Fiddling with the precise macro we pass to HELP_COMMAND. Changing from JI to JumpId, or filling in the first argument (JI(`putty.hlp',`foo.bar')) makes no difference.
    • This page claims there is an undocumented uCommand value to give to WinHelp() - HELP_TOPIC_ID = 259 - which would avoid the need to use the JI macro at all. However, I've had no luck with it ("The topic does not exist. Contact your application vendor for an updated Help file. (129)") A newsgroup post reports it as broken on Win98.
    Revision-number: 5316 Prop-content-length: 233 Content-length: 233 K 7 svn:log V 132 Oops! Didn't mean to check in the OS X Makefile; that is of course built by mkfiles.pl just like all the rest. Well spotted, Jacob. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-02-16T09:01:45.488229Z PROPS-END Node-path: putty/macosx Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 73 Content-length: 73 K 10 svn:ignore V 41 Makefile *.app puttygen plink psftp pscp PROPS-END Node-path: putty/macosx/Makefile Node-action: delete Revision-number: 5317 Prop-content-length: 279 Content-length: 279 K 8 svn:date V 27 2005-02-16T11:44:44.650136Z K 7 svn:log V 178 Simon suggests a better solution to valgrind's complaining about (struct Socket_tag).connected -- it should be entirely irrelevant to listening sockets. Valgrind is still happy. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7602a95107477c0eaa6695fdb850ed78 Text-delta-base-sha1: 6387586fea0d6b35ab2d80377601d43b0ec5fb6c Text-content-length: 351 Text-content-md5: b19198d1b98839561b36dcca1c73b369 Text-content-sha1: cb8659ed82d2876d35a9683ea3e7e6e500758c15 Content-length: 351 SVNTj8wmw?| E /* irrelevant for listening sockets */s->listener) { rwx |= 1; /* read == accept */ } else { if (!s->connected) rwx |= 2; /* write == connect */ if (s->connected && !s->frozen) rwx |= 1 | 4; /* read, except */ if (bufchain_size(&s->output_data)) rwx |= 2; /* write */ } Revision-number: 5318 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2005-02-16T11:56:27.840790Z K 7 svn:log V 55 Fix a minor valgrind issue in dynamic port-forwarding. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73992950a585d5a36cefac906f246734 Text-delta-base-sha1: 2014a53c880de61f6d7676c6c3ae2056c1356dcb Text-content-length: 126 Text-content-md5: 28a9e252c0ff59552a08e10034f547e4 Text-content-sha1: fb6ee85a2609a2a095a8f2c645dbf40b63b9ac41 Content-length: 126 SVN Zhost[0] = 0; dports[0] = 0%K&%EL_EXTENDED_DATA] = ssh2_msg_channel_ Revision-number: 5319 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2005-02-16T12:13:27.631135Z K 7 svn:log V 68 portfwd validation was sometimes not picking up a blank source port K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4d7ddc2fc91663ae0816d657e5e06b5c Text-delta-base-sha1: 6fc4eb44a11644f8cca25ce868b017c4d900b016 Text-content-length: 27 Text-content-md5: cb64832d129adc77269de4754fbe068b Text-content-sha1: 2d80c2f78ff1a2fd2f019ef6859d3b63342a3c76 Content-length: 27 SVN|| >=?i Revision-number: 5320 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2005-02-16T14:00:09.601625Z K 7 svn:log V 24 Ref a couple of patches K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7c9888accf21b5b899bfe2694e99b64c Text-delta-base-sha1: 09b295ee922372b2cd37c9d10a596cfaf4f4ed55 Text-content-length: 347 Text-content-md5: 251f9fb9798141c9e5365afe3dc58689 Text-content-sha1: d8e6acc2e9b4205b46be05e7303029fbbfe5d51d Content-length: 347 SVNw?HwH

    Some patches we've seen:

    • <300242548@web.de>
      Patch with extended key file format that uses external (PuTTY-specific?) DLL
    • <200409231510.55383.kstef@mtppi.org>
      Patches against PuTTY/Pageant 0.55 to use PKCS#11 libraries (tested with OpenSC)
    Revision-number: 5321 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2005-02-16T15:02:59.852292Z K 7 svn:log V 46 Summary: Bubble-babble encoding for host keys K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/bubble-babble Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 768 Text-content-md5: 822ac9994089ebc981a41628b00ed71c Text-content-sha1: 773538d77c3d73eb41a1c5b27e121b417b0ab886 Content-length: 778 PROPS-END SVNrrrSummary: Bubble-babble encoding for host keys Class: wish Difficulty: fun Priority: low Content-type: text/x-html-body

    Perhaps we should display the "bubble-babble" encoding for host key fingerprints, as well as the hexadecimal one, since several other implementations support it.

    Bubble-babble is specified in an expired Internet-Draft (draft-huima-babble-01), archived on the IETF SECSH mailing list. There are various implementations around, such as Digest::BubbleBabble.pm.

    Should we display both formats always, or let it be configurable? If the latter, per-session, or global? Revision-number: 5322 Prop-content-length: 396 Content-length: 396 K 8 svn:date V 27 2005-02-16T23:30:10.144786Z K 7 svn:log V 296 On the Mac, support for setting the line codepage and for combining characters. I've just used libcharset in macucs.c since there seemed little reason not to, and implemented combining characters by naive overprinting. It's not yet a lot of use without the ability to select a font, of course. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/macstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1cf46d659e5c15d989c1644adb94bca6 Text-delta-base-sha1: 806799b3bed9ef7c6b4bb16a16e542aad128c27b Text-content-length: 98 Text-content-md5: 4f146eb884144602a1bb8943e3734bf5 Text-content-sha1: fc9db6d117c7d4c4066a8e738cfca1f327edb7fe Content-length: 98 SVN&s L1v0#include "charset.h" #define CP_UTF8 CS_UTF8 /* from libcharset */ Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d5f3354aa9f6f40347aa2b3dbcb176d2 Text-delta-base-sha1: 90388d4e7ddf5b1338f912f217070301d186020b Text-content-length: 568 Text-content-md5: e10125d2e9165917179bdd40de225b3b Text-content-sha1: ebf63064cd5187295e1849c06e9ac35988885191 Content-length: 568 SVNb50zN5Svwop0bf|do_text_internal(Context, int, int, wchar_t *, int, unsigned long, intstatic void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len, /* * Wrapper that handles combining characters.if (attr & TATTR_COMBINING) { unsigned long a = 0; attr &= ~TATTR_COMBINING; while (len--) { do_text_internal(ctx, x, y, text, 1, attr | a, lattr); text++; a = TATTR_COMBINING; } } else do_text_internal(ctx, x, y, text, len, attr, lattr);if (!(a->attr & TATTR_COMBINING)) Node-path: putty/mac/macucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e42b54237197f6ef969639c7d9a4bfc7 Text-delta-base-sha1: 6acb7e0f81fade6b1766979d6820b6b2ee79de27 Text-content-length: 795 Text-content-md5: f9927dec33284a6ea58a70343abcb9ff Text-content-sha1: c989c310dfa326faa5e872a3b13d6362eb83ae04 Content-length: 795 SVN- sp3uaQP?0@hh/* $Idcharset.h" #include "terminal.h" #include "misc.h" #include "mac.h" /* * Mac Unicode-handling routines. * * BJH: * I (OSD) am unsure any of the above is necessary if we just use * libcharsets->ucsdata.line_codepage = decode_codepage(s->cfg.line_codepage) if (!*cp_name) return CS_NONE; /* use font encoding */ return charset_from_localenc(cp_name); } char const *cp_enumerate (int index) { int charset; if (index == 0) return "Use font encoding"; charset = charset_localenc_nth(index-1); if (charset == CS_NONE) return NULL; return charset_to_localenc(charset); } char const *cp_name(int codepage) { if (codepage == CS_NONE) return "Use font encoding"; return charset_to_localenc(codepage); } Revision-number: 5323 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2005-02-16T23:54:10.769254Z K 7 svn:log V 60 Info from Jason Robertson <421392C1.13000.F00A0A@localhost> K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/netscreen-command Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1244640afd7d454ae973b7b42937180b Text-delta-base-sha1: c3d53892dec520eeccab6d188d0d65dc7a3071a6 Text-content-length: 157 Text-content-md5: cf01d5db40cd7bfd1d8ec5d9a9bc07fc Text-content-sha1: fc2acc4d037f1568e2c3a8c8f09a0136d571bd6a Content-length: 157 SVN 

    We've had one report that this applies to Netscreen 4.x and previous, but that it works fine in newer versions (as well as SSH-2). Revision-number: 5324 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2005-02-17T01:47:01.689533Z K 7 svn:log V 64 ssh_do_close() was only closing about half the channels. Fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 28a9e252c0ff59552a08e10034f547e4 Text-delta-base-sha1: fb6ee85a2609a2a095a8f2c645dbf40b63b9ac41 Text-content-length: 311 Text-content-md5: dc4e39af2142f37954feef1fad3eb887 Text-content-sha1: d52f1bfe06dec5a375ab5844e45e73a2f4f7df9a Content-length: 311 SVN3y'|67wm- and X-forwarded channels going * through this connection. */ if (ssh->channels) { while (NULL != (c = index234(ssh->channels, 0)) /* moving next one to index 0 */d * BUG_NEEDS_SSH1_PLAIN_PAKgKcket_dispatch[SSH2_MSG_CHANN Revision-number: 5325 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2005-02-17T02:00:01.257763Z K 7 svn:log V 84 ssh_do_close() should close any listening sockets associated with port-forwardings. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc4e39af2142f37954feef1fad3eb887 Text-delta-base-sha1: d52f1bfe06dec5a375ab5844e45e73a2f4f7df9a Text-content-length: 1239 Text-content-md5: 0400d81c40cf75aa70dc666e53f7ae4f Text-content-sha1: 70f20b68f1bfaf1dbe8100dda04d7b09e74e5c4d Content-length: 1239 SVN~d~X /* * Go through port-forwardings, and close any associated * listening sockets. */ if (ssh->portfwds) { struct ssh_portfwd *pf; while (NULL != (pf = index234(ssh->portfwds, 0))) { /* Dispose of any listening socket. */ if (pf->local) pfd_terminate(pf->local); del234(ssh->portfwds, pf); /* moving next one to index 0 */ free_portfwd(pf v while (len < sizeof(string)) { string[len++] = (char) random_byte(); } } else { ss = s->password; } logevent("Sending length-padded password"); send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD, PKT_INT, len, PKT_DATA, ss, len, PKTT_OTHER, PKT_END); } else { /* * The server has _both_ * BUG_CHOKES_ON_SSH1_IGNORE and gq gtuint32(pktin); bufchain_init(&ssh->mainchan->v.v2.outbuffer); add234(ssh->channels, ssh->mainchan); update_specials_menu(ssh->frontend); logevent("Opened channel for session"); } else ssh->mainchan = NULL; /* * Now we have a channel, make dispatch table entries for * general channel-based messages. */ ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = ssh->pa Revision-number: 5326 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:24.403614Z PROPS-END Revision-number: 5327 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:24.413855Z PROPS-END Revision-number: 5328 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 The 3rd system has confirmed that they have WinSock 2 installed K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-17T12:55:02.636029Z PROPS-END Node-path: putty-wishlist/data/win95-resolution Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1b01d3fc4f7520ac99e171deea567914 Text-delta-base-sha1: d90a2735ca743fea8030fea798136d38ab3bad42 Text-content-length: 53 Text-content-md5: dd173a84077df2c7a066b35a3d4e70a1 Text-content-sha1: 64cd0d478f5844f55c39b221cd5cb35c270e193d Content-length: 53 SVNaqpX ll (WinSock 2 is installed) Revision-number: 5329 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2005-02-17T17:38:23.671509Z K 7 svn:log V 77 Dickon Champion reports that a VMS SSH server uses these too. Bump priority. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 28e8a1bd3365037717a410b410fe516e Text-delta-base-sha1: 0eed24debc8a2fd2eda1d7914ebac4eb0d9eb60c Text-content-length: 75 Text-content-md5: ffbcac42e798ab63e104008c40f85954 Text-content-sha1: b431d1c2c8b465962df4190224ed5535870ee71e Content-length: 75 SVN/22PkSEimedium There is a VMS server which uses them too. Revision-number: 5330 Prop-content-length: 685 Content-length: 685 K 8 svn:date V 27 2005-02-17T18:34:24.715457Z K 7 svn:log V 584 Revamp interface to verify_ssh_host_key() and askalg(). Each of them now returns an integer: 0 means cancel the SSH connection and 1 means continue with it. Additionally, they can return -1, which means `front end has set an asynchronous alert box in motion, please wait to be called back with the result', and each one is passed a callback function pointer and context for this purpose. I have not yet done the same to askappend() yet, because it will take a certain amount of reorganisation of logging.c. Importantly, this checkin means the host key dialog box now works on OS X. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9022d0f635fbf677c446f805b4c44711 Text-delta-base-sha1: 91363c6b5bc4ca788dfa6b67ce4b6ec326c373cf Text-content-length: 1288 Text-content-md5: 934f97ac6946309c2f541b3a2de13e29 Text-content-sha1: 9e2fd5dd3bfd793c8f0bc83d2d71d7a014578f8e Content-length: 1288 SVNT1IP}WqO"7m!f:Tint verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint, void (*callback)(void *ctx, int result), void *ctxe alert shouldn't be modal, it should be movable modal, or * a sheet in Aqua. Also, PuTTY might be in the background, in * which case we should use the Notification Manager to wake up * the user. In any case, we shouldn't hold up processing of * other connections' data just because this one's waiting for * the user { /* success - key matched OK */ return 1; } else if (ret == 2) { return 0; } else if (alertret == 9) { /* Connect Just Once */ return 1; } else { /* Update Key */ store_host_key(host, port, keytype, keystr); return 1; } } else /* ret == 1 */ { return 0; } else if (alertret == 8) { /* Connect Just Once */ return 1; } else { /* Update Key */ store_host_key(host, port, keytype, keystr); return 1; } } } int askalg(void *frontend, const char *algtype, const char *algname, void (*callback)(void *ctx, int result), void *ctx) { return 0; Node-path: putty/macosx/README.OSX Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 650278efdf46dffc724df8bd898b9c40 Text-delta-base-sha1: a50677ed6de72b9ddfe017d166d8077809f9367d Text-content-length: 20 Text-content-md5: 5bf3cf779a48de1b3c33ca7187706ed7 Text-content-sha1: 62c961dd2fc52a264549229ea75f26726e599e99 Content-length: 20 SVN# ]FW Node-path: putty/macosx/osxclass.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dab6e17cc8dc8354b623388dfad9182c Text-delta-base-sha1: a36890d4754e0174e851a7745e4dc68828eee114 Text-content-length: 192 Text-content-md5: 7860137f84a1511dba101daac8c2bcb1 Text-content-sha1: 36888184c253d0c27fa0f3da4129e29349965928 Content-length: 192 SVNy #uPsg8A void (*alert_callback)(void *, int); void *alert_ctx- (void)startAlert:(NSAlert *)alert withCallback:(void (*)(void *, int))callback andCtx:(void *)ctx Node-path: putty/macosx/osxdlg.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9989054bc6a05ae693bea914d20a1886 Text-delta-base-sha1: debb8f74f8e1c0cdfbf30a447a52909963d8c2b5 Text-content-length: 3894 Text-content-md5: ced74ccc7c2e4c2f2ffef373fde96a1c Text-content-sha1: 5eefb1e6ae173150a1e5e9587e6b1a7754425a51 Content-length: 3894 SVNm?|idstruct algstate { void (*callback)(void *ctx, int result); void *ctx; }; static void askalg_callback(void *ctx, int result) { struct algstate *state = (struct algstate *)ctx; state->callback(state->ctx, result == 0); sfree(state); } int askalg(void *frontend, const char *algtype, const char *algname, void (*callback)(void *ctx, int result), void *ctx) { static const char msg[] = "The first %s supported by the server is " "%s, which is below the configured warning threshold.\n" "Continue with connection?"; char *text; SessionWindow *win = (SessionWindow *)frontend; struct algstate *state; NSAlert *alert; text = dupprintf(msg, algtype, algname); state = snew(struct algstate); state->callback = callback; state->ctx = ctx; alert = [NSAlert alloc]; [alert setInformativeText:[NSString stringWithCString:text]]; [alert addButtonWithTitle:@"Yes"]; [alert addButtonWithTitle:@"No"]; [win startAlert:alert withCallback:askalg_callback andCtx:state]; return -1; } struct hostkeystate { char *host, *keytype, *keystr; int port; void (*callback)(void *ctx, int result); void *ctx; }; static void verify_ssh_host_key_callback(void *ctx, int result) { struct hostkeystate *state = (struct hostkeystate *)ctx; if (result == NSAlertThirdButtonReturn) /* `Accept' */ store_host_key(state->host, state->port, state->keytype, state->keystr); state->callback(state->ctx, result != NSAlertFirstButtonReturn); sfree(state->host); sfree(state->keytype); sfree(state->keystr); sfree(state); } int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint, void (*callback)(void *ctx, int result), void *ctx) { static const char absenttxt[] = "The server's host key is not cached. You have no guarantee " "that the server is the computer you think it is.\n" "The server's %s key fingerprint is:\n" "%s\n" "If you trust this host, press \"Accept\" to add the key to " "PuTTY's cache and carry on connecting.\n" "If you want to carry on connecting just once, without " "adding the key to the cache, press \"Connect Once\".\n" "If you do not trust this host, press \"Cancel\" to abandon the " "connection."; static const char wrongtxt[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has " "cached. This means that either the server administrator " "has changed the host key, or you have actually connected " "to another computer pretending to be the server.\n" "The new %s key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key, " "press \"Accept\" to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating " "the cache, press \"Connect Once\".\n" "If you want to abandon the connection completely, press " "\"Cancel\" to cancel. Pressing \"Cancel\" is the ONLY guaranteed " "safe choice."; int ret; char *text; SessionWindow *win = (SessionWindow *)frontend; struct hostkeystate *state; NSAlert *aler 1; text = dupprintf((ret == 2 ? wrongtxt : absenttxt), keytype, fingerprint); state = snew(struct hostkeystate); state->callback = callback; state->ctx = ctx; state->host = dupstr(host); state->port = port; state->keytype = dupstr(keytype); state->keystr = dupstr(keystr); alert = [[NSAlert alloc] init]; [alert setInformativeText:[NSString stringWithCString:text]]; [alert addButtonWithTitle:@"Cancel"]; [alert addButtonWithTitle:@"Connect Once"]; [alert addButtonWithTitle:@"Accept"]; [win startAlert:alert withCallback:verify_ssh_host_key_callback andCtx:state]; return -1 Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c06c1acebbcd27d5c46f4ce3763baad6 Text-delta-base-sha1: 61f8fcab740bc3a5abc9e36efe9c162309ab5ff5 Text-content-length: 642 Text-content-md5: 1395afec2e9297cbf4b68da509926312 Text-content-sha1: 49c1675c8b3f3af8c76b8d5c53ca79869ef442c2 Content-length: 642 SVN,["}[:APq}t zacallbacks. */ void *agent_response; int agent_response_len; int user_response; /* * The SSH connection can be set as `frozen', meaning we are * not currently accepting incoming data from the network. This * is slightly more serious than setting the _socket_ as * frozen, because we may already have had data passed to us * from the network which we need to delay processing until * after the freeze is lifted, so we also need a bufchain to * store that data. */ int frozen; bufchain queued_incoming_dataprocess_incoming_data(Ssh ssh, unsigned char **data, int *datalen) { struct Packet *pktin = ssh->s_rdpkt(ssh, data, datalen); if (pktin) { ssh->protocol(ssh, NULL, 0, pktin); ssh_free_packet(pktin); } } static void ssh_queue_incoming_data(Ssh ssh, unsigned char **data, int *datalen) { bufchain_add(&ssh->queued_incoming_data, *data, *datalen); *data += *datalen; *datalen = 0; } static void ssh_process_queued_incoming_data(Ssh ssh) { void *vdata; unsigned char *data; int len, origlen; while (!ssh->frozen && bufchain_size(&ssh->queued_incoming_data)) { bufchain_prefix(&ssh->queued_incoming_data, &vdata, &len); data = vdata; origlen = len; while (!ssh->frozen && len > 0) ssh_process_incoming_data(ssh, &data, &len); if (origlen > len) bufchain_consume(&ssh->queued_incoming_data, origlen - len); } } static void ssh_set_frozen(Ssh ssh, int frozen) { sk_set_frozen(ssh->s, frozen); ssh->frozen = frozen /* * Process queued data if there is any. */ ssh_process_queued_incoming_data(ssh); while (1) { while (datalen > 0) { if (ssh->frozen) ssh_queue_incoming_data(ssh, &data, &datalen); ssh_process_incoming_data(ssh, &data, &datalen); sh_set_frozen(ssh, 1); } else if (!ssh->v1_throttle_count && old_count) { ssh_set_frozen(sshdialog_callback(void *sshv, int ret) { Ssh ssh = (Ssh) sshv; ssh->user_response = ret; if (ssh->version == 1) do_ssh1_login(ssh, NULL, -1, NULL); else do_ssh2_transport(ssh, NULL, -1, NULL); /* * This may have unfrozen the SSH connection, so do a * queued-data run. */ ssh_process_queued_incoming_data(ssh int dlgret ssh_set_frozen(ssh, 1); s->dlgret = verify_ssh_host_key(ssh->frontend, ssh->savedhost, ssh->savedport, "rsa", keystr, fingerprint, ssh_dialog_callback, ssh); sfree(keystr); if (s->dlgret < 0) { do { crReturn(0); if (pktin) { bombout(("Unexpected data from server while waiting" " for user host key response")); crStop(0); } } while (pktin || inlen > 0); s->dlgret = ssh->user_response; } ssh_set_frozen(ssh, 0); if (s->dlgret == 0) { ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); }sh_set_frozen(ssh, 1); s->dlgret = askalg(ssh->frontend, "cipher", cipher_string, ssh_dialog_callback, ssh); if (s->dlgret < 0user response")); crStop(0); } } while (pktin || inlen > 0); s->dlgret = ssh->user_response; } ssh_set_frozen(ssh, 0); if (s->dlgret == 0) { ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); }O!x8.az5[ByRBr|`n!(hrough! */ } else { if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { /* * Defence against traffic analysis: we send a * whole bunch of packets containing strings of * different lengths. One of these strings is the * password, in a SSH1_CMSG_AUTH_PASSWORD packet. * The others are all random data in * SSH1_MSG_IGNORE packets. This way a passive * listener can't tell which is the password, and * hence can't deduce the password length. * * Anybody with a password length greater than 16 * bytes is going to have enough entropy in their * password that a listener won't find it _that_ * much help to know how long it is. So what we'll * do is: * * - if password length < 16, we send 15 packets * containing string lengths 1 through 15 * * - otherwise, we let N be the nearest multiple * of 8 below the password length, and send 8 * packets containing string lengths N through * N+7. This won't obscure the order of * magnitude of the password length, but it will * introduce a bit of extra uncertainty. * * A few servers (the old 1.2.18 through 1.2.22) * can't deal with SSH1_MSG_IGNORE. For these * servers, we need an alternative defence. We make * use of the fact that the password is interpreted * as a C string: so we can append a NUL, then some * random data. * * One server (a Cisco one) can deal with neither * SSH1_MSG_IGNORE _nor_ a padded password string. * For this server we are left with no defences * against password length sniffing. */ if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) { /* * The server can deal with SSH1_MSG_IGNORE, so * we can use the primary defence. */ int bottom, top, pwlen, i; char *randomstr; pwlen = strlen(s->password); if (pwlen < 16) { bottom = 0; /* zero length passwords are OK! :-) */ top = 15; } else { bottom = pwlen & ~7; top = bottom + 7; } assert(pwlen >= bottom && pwlen <= top); randomstr = snewn(top + 1, char); for (i = bottom; i <= top; i++) { if (i == pwlen) { defer_packet(ssh, s->pwpkt_type, PKTT_PASSWORD, PKT_STR, s->password, PKTT_OTHER, PKT_END); } else { for (j = 0; j < i; j++) { do { randomstr[j] = random_byte(); } while (randomstr[j] == '\0'); } randomstr[i] = '\0'; defer_packet(ssh, SSH1_MSG_IGNORE, PKT_STR, randomstr, PKT_END); } } logevent("Sending password with camouflage packets"); ssh_pkt_defersend(ssh); sfree(randomstr); } else if (!(ssh->remote_bugs & BUG_NEEDS_SSH1_PLAIN_PASSWORD)) { /* * The server can't deal with SSH1_MSG_IGNORE * but can deal with padded passwords, so we * can use the secondary defence. */ char string[64]; char *ss; int len; len = strlen(s->password); if (len < sizeof(string)) { ss = string; strcpy(string, s->password); len++; /* cover the zero byte */ int dlgret; int guessok ssh_set_frozen(ssh, 1); s->dlgret = askalg(ssh->frontend, "key-exchange algorithm", ssh->kex->name, ssh_dialog_callback, ssh); if (s->dlgret < 0) { do { crReturn(0); if (pktin) { bombout(("Unexpected data from server while" " waiting for user response")); crStop(0); } } while (pktin || inlen > 0); s->dlgret = ssh->user_response; } ssh_set_frozen(ssh, 0); if (s->dlgret == 0) { ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); }s->s->guessok = s-> ssh_set_frozen(ssh, 1); s->dlgret = askalg(ssh->frontend, "client-to-server cipher", s->cscipher_tobe->name, ssh_dialog_callback, ssh); if (s->dlgret < 0) { do { crReturn(0); if (pktin) { bombout(("Unexpected data from server while" " waiting for user response")); crStop(0); } } while (pktin || inlen > 0); s->dlgret = ssh->user_response; } ssh_set_frozen(ssh, 0); if (s->dlgret == 0) { ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); } ssh_set_frozen(ssh, 1); s->dlgret = askalg(ssh->frontend, "server-to-client cipher", s->sccipher_tobe->name, ssh_dialog_callback, ssh); if (s->dlgret < 0) { do { crReturn(0); if (pktin) { bombout(("Unexpected data from server while" " waiting for user response")); crStop(0); } } while (pktin || inlen > 0); s->dlgret = ssh->user_response; } ssh_set_frozen(ssh, 0); if (s->dlgret == 0) { ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); }s->sh_set_frozen(ssh, 1); s->dlgret = verify_ssh_host_key(ssh->frontend, ssh->savedhost, ssh->savedport, ssh->hostkey->keytype, s->keystr, s->fingerprint, ssh_dialog_callback, ssh); if (s->dlgret < 0) { do { crReturn(0); if (pktin) { bombout(("Unexpected data from server while waiting" " for user host key response")); crStop(0); } } while (pktin || inlen > 0); s->dlgret = ssh->user_response; } ssh_set_frozen(ssh, 0); if (s->dlgret == 0) { ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); crStop(0); }q=CT8Fh6ZBIT(sigdata+p, 20); p += 4; } memcpy(sigdata+p, ssh->v2_session_id, 20); p += 20; memcpy(sigdata+p, s->pktout->data + 5, s->pktout->length - 5); p += s->pktout->length - 5; assert(p == sigdata_len); sigblob = key->alg->sign(key->data, (char *)sigdata, sigdata_len, &sigblob_len); ssh2_add_sigblob(ssh, s->pktout, pkblob, pkblob_len, sigblob, sigblob_len); sfree(pkblob); sfree(sigblob); sfree(sigdata); ssh2_pkt_send(ssh, s->pktout); s->type = AUTH_TYPE_PUBLICKEY; key->alg->freekey(key->data); } } else if (s->method == AUTH_PASSWORD) { /* * We pad out the password packet to 256 bytes to make * it harder for an attacker to find the length of the * user's password. * * Anyone using a password longer than 256 bytes * probably doesn't have much to worry about from * people who find out how long their password is! */ s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); s->pktout->forcepad = 256; ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(s->pktout, "password"); ssh2_pkt_addbool(s->pktout, FALSE); dont_log_password(ssh, s->pktout, PKTLOG_BLANK); ssh2_pkt_addstring(s->pktout, s->password); memset(s->password, 0, sizeof(s->password)); end_log_omission(ssh, s->pktout); ssh2_pkt_send(ssh, s->pktout); logevent("Sent password"); s->type = AUTH_TYPE_PASSWORD; } else if (s->method == AUTH_KEYBOARD_INTERACTIVE) { if (s->curr_prompt == 0) { s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_INFO_RESPONSE); s->pktout->forcepad = 256; ssh2_pkt_adduint32(s->pktout, s->num_prompts); } if (s->need_pw) { /* only add pw if we just got one! */ dont_log_password(ssh, s->pktout, PKTLOG_BLANK); ssh2_pkt_addstring(s->pktout, s->password); memset(s->password, 0, sizeof(s->password)); end_log_omission(ssh, s->pktout); s->curr_prompt++; } if (s->curr_prompt >= s->num_prompts) { ssh2_pkt_send(ssh, s->pktout); } else { /* * If there are prompts remaining, we set * `gotit' so that we won't attempt to get * another packet. Then we go back round the * loop and will end up retrieving another * prompt out of the existing packet. Funky or * what? */ s->gotit = TRUE; } s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE; } else { c_write_str(ssh, "No supported authentication methods" " left to try!\r\n"); logevent("No supported authentications offered." " Disconnecting"); s->pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(s->pktout, SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(s->pktout, "No supported authentication" " methods available"); ssh2_pkt_addstring(s->pktout, "en"); /* language tag */ ssh2_pkt_send_noqueue(ssh, s->pktout); ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); crStopV; } } } while (!s->we_are_in); /* * Now we're authenticated for the connection protocol. The * connection protocol will automatically have started at this * point; there's no need to send SERVICE_REQUEST. */ ssh->channels = newtree234(ssh_channelcmp); /* * Set up handlers for some connection protocol messages, so we * don't have to handle them repeatedly in this coroutine. */ ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = ssh2_msg_channel_window_adjust; ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = ssh2_msg_global_request; /* * Create the main session channel. */ if (!ssh->cfg.ssh_no_shell) { ssh->mainchan = snew(struct ssh_channel); ssh->mainchan->ssh = ssh; ssh->mainchan->localid = alloc_channel_id(ssh); s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring(s->pktout, "session"); ssh2_pkt_adduint32(s->pktout, ssh->mainchan->localid); ssh->mainchan->v.v2.locwindow = OUR_V2_WINSIZE; ssh2_pkt_adduint32(s->pktout, ssh->mainchan->v.v2.locwindow);/* our window size */ ssh2_pkt_adduint32(s->pktout, OUR_V2_MAXPKT); /* our max pkt size */ ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) { bombout(("Server refused to open a session")); crStopV; /* FIXME: error data comes back in FAILURE packet */ } if (ssh_pkt_getuint32(pktin) != ssh->mainchan->localid) { bombout(("Server's channel confirmation cited wrong channel")); crStopV; } ssh->mainchan->remoteid = ssh_pkt_getuint32(pktin); ssh->mainchan->halfopen = FALSE; ssh->mainchan->type = CHAN_MAINSESSION; ssh->mainchan->closes = 0; ssh->mainchan->v.v2.remwindow = ssh_pkt_getuint32(pktin); ssh->mainchan->v.v2.remmaxpkt = ssh_pkt_ge bufchain_init(&ssh->queued_incoming_data); ssh->frozen = FALSEbufchain_clear(&ssh->queued_incoming_data Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 91f0f559e2d2686531eab9962fcce28a Text-delta-base-sha1: d83f4496093f1d948bc5fbf4e862eb39c0c4db6c Text-content-length: 659 Text-content-md5: 5086f968155e3690e88f064b38393fb4 Text-content-sha1: 7d2cccf5f28c95030f98f58427a966d292ea97e9 Content-length: 659 SVNC,YSPD_^rx{fO@Tint verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint, void (*callback)(void *ctx, int result), void *ctx 1 return 0; /* do not continue with connection */ else { if (ret == 2) store_host_key(host, port, keytype, keystr); return 1; /* continue with connection */ }int askalg(void *frontend, const char *algtype, const char *algname, void (*callback)(void *ctx, int result), void *ctx 1; } else { return 0 Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f463fbcc981cd9b9c922b6afce74134 Text-delta-base-sha1: 57777dd4721df89dd530aa8dd036d109600e1658 Text-content-length: 482 Text-content-md5: cfaed72f9444bca306d8dcf41bd07abe Text-content-sha1: 1b8a058f212172c6d1428bb936a1a7df85e417ea Content-length: 482 SVNbr<4J8%3\Uk@Ha{w$z*`int char *keystr, char *fingerprint, void (*callback)(void *ctx, int result), void *ctx 1return 0return 0 return 1; } else { fprintf(stderr, abandoned); return 0int askalg(void *frontend, const char *algtype, const char *algname, void (*callback)(void *ctx, int result), void *ctxreturn 0 1; } else { fprintf(stderr, abandoned); return 0 Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ebc4cd35cb3590f9740b00461175ae7a Text-delta-base-sha1: eebb763df7fd8be9dc91bdc6a7b0fa2ba1272c40 Text-content-length: 516 Text-content-md5: dc173f396464f776aac47a4051ae0813 Text-content-sha1: ece2126e39f496199891ab65909d15aa8329111d Content-length: 516 SVNQo<<}Pn W.H.N@@n8int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint, void (*callback)(void *ctx, int result), void *ctx 1 return 0 return 0 return 1; } else { fprintf(stderr, abandoned); return 0int, void (*callback)(void *ctx, int result), void *ctxreturn 0 1; } else { fprintf(stderr, abandoned); return 0 Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b6a578588036ea1fd1385612a28ce433 Text-delta-base-sha1: 220e2ac647886a1162f4f23589a29b5f9271cd61 Text-content-length: 402 Text-content-md5: 7169b0c2791dec991821cf5c557a7edd Text-content-sha1: c846911188dc8193d500060adab73a8632971659 Content-length: 402 SVN77MrJv^cAo{'Txint char *keystr, char *fingerprint, void (*callback)(void *ctx, int result), void *ctx 1return 0; return 1return 0; return 1int askalg(void *frontend, const char *algtype, const char *algname, void (*callback)(void *ctx, int result), void *ctx 1; else return 0 Revision-number: 5331 Prop-content-length: 290 Content-length: 290 K 7 svn:log V 189 Ahem. Actually _checking_ that asynchronous askalg() worked would have been helpful. Since async verify_ssh_host_key() worked, I didn't think anything else could go wrong. How wrong I was. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-02-17T18:56:37.678930Z PROPS-END Node-path: putty/macosx/osxdlg.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ced74ccc7c2e4c2f2ffef373fde96a1c Text-delta-base-sha1: 5eefb1e6ae173150a1e5e9587e6b1a7754425a51 Text-content-length: 71 Text-content-md5: 2a7e0192daf0ba4ee026e8a870d54876 Text-content-sha1: 2c8169007154c741d8bea4994589041d745baf85 Content-length: 71 SVNm ,&D'uxNSAlertFirstButtonReturn[NSAlert alloc] init Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1395afec2e9297cbf4b68da509926312 Text-delta-base-sha1: 49c1675c8b3f3af8c76b8d5c53ca79869ef442c2 Text-content-length: 653 Text-content-md5: 9119aeb825a8c2510a270ce428d7369b Text-content-sha1: bf114f0f881ab70f79e00c1ab2b5a91f711ca6df Content-length: 653 SVN*q~q;][self performSelectorOnMainThread: @selector(alertSheetDidFinishEnding:) withObject:[NSNumber numberWithInt:returnCode] waitUntilDone:NO]; } - (void)alertSheetDidFinishEnding:(id)object { int returnCode = [object intValue]; void (*this_callback)(void *, int); void *this_ctx; /* * We must save the values of our alert_callback and alert_ctx * fields, in case they are set up again by the callback * function! */ this_callback = alert_callback; this_ctx = alert_ctx; alert_ctx = NULL; this_callback(this_ctx, returnCode); /* transfers ownership of ctx */ Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ed4842c32896bafab872e75fae875d10 Text-delta-base-sha1: 7bd22c00ef2ca0d8c3362711d521001a7e90c776 Text-content-length: 2425 Text-content-md5: 05ce5a62b5ad91aae58c63d979d9d24e Text-content-sha1: db86a15f758db87da1ac587cb1e0a2ba03b28b31 Content-length: 2425 SVNi==hWE?z%KWZ~KbI~KA0W^_kex, warn_cscipher, warn_sccipher int ignorepkt, *preferreds->warn_kex = s->warn_cscipher = s->warn_sccipher = FALSE; preferred = NULL_kex = TRUE; } else { if (!preferred) preferred = k->name; if (in_commasep_string(k->name, str, len)) ssh->kex = k; } if (ssh->kex) break; first_in_commasep_string(preferred_cscipher = TRUE break;_sccipher = TRUE break;s->ignorepkt = ssh2_pkt_getbool(pktin) && !s->guessok; if (s->warn_kex) { ssh_set_frozen(ssh, 1); s->dlgret = askalg(ssh->frontend, "key-exchange algorithm", ssh->kex->name, ssh_dialog_callback, ssh); if (s->dlgret < 0) { do { crReturn(0); if (pktin) { bombout(("Unexpected data from server while" " waiting for user response")); crStop(0); } } while (pktin || inlen > 0); s->dlgret = ssh->user_response; } ssh_set_frozen(ssh, 0); if (s->dlgret == 0) { ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); } } if (s->warn_cscipher) { ssh_set_frozen(ssh, 1); s->dlgret = askalg(ssh->frontend, "client-to-server cipher", s->cscipher_tobe->name, ssh_dialog_callback, ssh); if (s->dlgret < 0) { do { crReturn(0); if (pktin) { bombout(("Unexpected data from server while" " waiting for user response")); crStop(0); } } while (pktin || inlen > 0); s->dlgret = ssh->user_response; } ssh_set_frozen(ssh, 0); if (s->dlgret == 0) { ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); } } if (s->warn_sccipher) { ssh_set_frozen(ssh, 1); s->dlgret = askalg(ssh->frontend, "server-to-client cipher", s->sccipher_tobe->name, ssh_dialog_callback, ssh); if (s->dlgret < 0) { do { crReturn(0); if (pktin) { bombout(("Unexpected data from server while" " waiting for user response")); crStop(0); } } while (pktin || inlen > 0); s->dlgret = ssh->user_response; } ssh_set_frozen(ssh, 0); if (s->dlgret == 0) { ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); } } if (s->ignorepkt=KK=ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) { PUT_32 Revision-number: 5332 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:25.326512Z PROPS-END Revision-number: 5333 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:25.335883Z PROPS-END Revision-number: 5334 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:25.345377Z PROPS-END Revision-number: 5335 Prop-content-length: 431 Content-length: 431 K 8 svn:date V 27 2005-02-17T19:31:32.242487Z K 7 svn:log V 330 Adjust the semantics of cfg.remote_cmd_ptr: it is now NULL when cfg.remote_cmd is to be used, rather than actually pointing at cfg.remote_cmd. This change restores the ability to structure-copy Configs without breaking them. (Though of course this is only a temporary solution: really what wants doing is to fix `config-struct'.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cb64832d129adc77269de4754fbe068b Text-delta-base-sha1: 2d80c2f78ff1a2fd2f019ef6859d3b63342a3c76 Text-content-length: 29 Text-content-md5: b042f52a94feadc81a98fe1eb0917ad9 Text-content-sha1: 2f5ea55d1f274931de2f15aac055d87e3ca60158 Content-length: 29 SVN|e 4,PNULL; Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ea881d96d475930160db389f7b4dd14a Text-delta-base-sha1: 81ab88611e483d7573f291b97f33719373a1cb98 Text-content-length: 27 Text-content-md5: 34c8d379366c5c5cf56147d62657f4c2 Text-content-sha1: 43cb638d67e3c57c487488b6ae80c827227dcfb6 Content-length: 27 SVNzo p{NULL Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 05ce5a62b5ad91aae58c63d979d9d24e Text-delta-base-sha1: db86a15f758db87da1ac587cb1e0a2ba03b28b31 Text-content-length: 189 Text-content-md5: 7106d4279c3314633db281eb311975ca Text-content-sha1: af42c37524ec540bb87da4c67dcf825bf051be1a Content-length: 189 SVN %tgr if (!cmd) cmd = ssh->cfg.remote_cmdYS`o~7Q p = 0; if (!( if (!cmd) cmd = ssh->cfg.remote_cmd; } Revision-number: 5336 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:25.668778Z PROPS-END Revision-number: 5337 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:25.679371Z PROPS-END Revision-number: 5338 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:25.689920Z PROPS-END Revision-number: 5339 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:25.700576Z PROPS-END Revision-number: 5340 Prop-content-length: 154 Content-length: 154 K 10 svn:author V 4 owen K 8 svn:date V 27 2005-02-18T09:22:55.112972Z K 7 svn:log V 55 We have a host key database, just not a very good one. PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9a05e90b8ab56842fec4b74af8b50a3e Text-delta-base-sha1: c8cf743dcc2f5190f6935f32347bc236369a423d Text-content-length: 117 Text-content-md5: 478274a47d3e6c080abcf9375e4e83fa Text-content-sha1: c893856fb2cee58d876d6a58644ccdaaf2d82046 Content-length: 117 SVNp5YnXHl&J * The host key database is currently limited by its implementation to 2727 host keys Revision-number: 5341 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:25.908209Z PROPS-END Revision-number: 5342 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:25.918037Z PROPS-END Revision-number: 5343 Prop-content-length: 162 Content-length: 162 K 7 svn:log V 62 A few more fixes in the new asynchronous-alert-box mechanism. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-02-18T18:19:28.385015Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7106d4279c3314633db281eb311975ca Text-delta-base-sha1: af42c37524ec540bb87da4c67dcf825bf051be1a Text-content-length: 184 Text-content-md5: c779b52568bcdccc1a04e1410fdb6a2d Text-content-sha1: cb3e9f21e4caeb5a01721b1d831f465ba819b6fc Content-length: 184 SVN f fif (ssh->s) %PPe0 /* we're t crStop( crStop( crStop(Y 4Y = snewn(sigdata_len, unsigned char); Revision-number: 5344 Prop-content-length: 777 Content-length: 777 K 7 svn:log V 676 Add asynchronous callback capability to the askappend() alert box. This was harder than verify_ssh_host_key() and askalg() put together, because: (a) askappend() can be called at any time, since it's a side effect of data-logging functions. Therefore there can be an unfinished askappend() alert at any time, and hence the OS X front end has to be prepared to _queue_ other alerts which occur during that time. (b) logging.c has to do something with data that comes in while it's waiting for an answer to askappend(). It buffers it until it knows what the user wants done with it. This involved something of a reorganisation of logging.c. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-02-18T18:33:31.991718Z PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 52d0cddedad7aad1e12283e4f6b6669b Text-delta-base-sha1: 8b2132799d9c610669435a75e1a9e389a508e848 Text-content-length: 5794 Text-content-md5: 3b39b5fe35d637ed3017bb69f4c6b27d Text-content-sha1: 333e28a980ab7c70cdeedc5b9c0ed7a7bb30feb5 Content-length: 5794 SVNxjV@B<''7^G@O@|r.ZSO{RLL?aenum { CLOSED, OPENING, OPEN, ERROR } state; bufchain queueInternal wrapper function which must be called for _all_ output * to the log file. It takes care of opening the log file if it * isn't open, buffering data if it's in the process of being * opened asynchronously, etc. */ static void logwrite(struct LogContext *ctx, void *data, int len) { /* * In state CLOSED, we call logfopen, which will set the state * to one of OPENING, OPEN or ERROR. Hence we process all of * those three _after_ processing CLOSED. */ if (ctx->state == CLOSED) logfopen(ctx); if (ctx->state == OPENING) { bufchain_add(&ctx->queue, data, len); } else if (ctx->state == OPEN) { assert(ctx->lgfp); fwrite(data, 1, len, ctx->lgfp); } /* else ERROR, so ignore the write */ } /* * Convenience wrapper on logwrite() which printf-formats the * string. */ static void logprintf(struct LogContext *ctx, const char *fmt, ...) { va_list ap; char *data; va_start(ap, fmt); data = dupvprintf(fmt, ap); va_end(ap); logwrite(ctx, data, strlen(data)); sfree(data);state == OPEN) fflush(ctx->lgfp); } static void logfopen_callback(void *handle, int modebuf[256], *event; struct tm tm; const char *fmode; if (mode == 0) { ctx->state = ERROR; /* disable logging */ } else { fmode = (mode == 1 ? "a" : "w"); ctx->lgfp = f_open(ctx->currlogfilename, fmode); if (ctx->lgfp) ctx->state = OPEN; else ctx->state = ERROR; } if (ctx->state == OPEN) { /* Write header line into log file. */ tm = ltime(); strftime(buf, 24, "%Y.%m.%d %H:%M:%S", &tm); logprintf(ctx, "=~=~=~=~=~=~=~=~=~=~=~= PuTTY log %s" " =~=~=~=~=~=~=~=~=~=~=~=\r\n", buf); } event = dupprintf("%s session log (%s mode) to file: %s", (mode == 0 ? "Disabled writing" : mode == 1 ? "Appending" : "Writing new"), (ctx->cfg.logtype == LGTYP_ASCII ? "ASCII" : ctx->cfg.logtype == LGTYP_DEBUG ? "raw" : ctx->cfg.logtype == LGTYP_PACKETS ? "SSH packets" : "unknown"), filename_to_str(&ctx->currlogfilename)); logevent(ctx->frontend, event); sfree(event); /* * Having either succeeded or failed in opening the log file, * we should write any queued data out. */ assert(ctx->state != OPENING); /* make _sure_ it won't be requeued */ while (bufchain_size(&ctx->queue)) { void *data; int len; bufchain_prefix(&ctx->queue, &data, &len); logwrite(ctx, data, len); bufchain_consume(&ctx->queue, len); } } /* * Open the log file. Takes care of detecting an already-existing * file and asking the user whether they want to append, overwrite * or cancel logging. */ void logfopenstruct tm tm; int mode; /* Prevent repeat calls */ if (ctx->state != CLOSED) return; if (!ctx->cfg.logtype) return;fclose(ctx->lgfp); if (ctx->cfg.logxfovr != LGXF_ASK) { mode = ((ctx->cfg.logxfovr == LGXF_OVR) ? 2 : 1); } else mode = askappend(ctx->frontend, ctx->currlogfilename, logfopen_callback, ctx); } else mode = 2; /* create == overwrite */ if (mode < 0) ctx->state = OPENING; else logfopen_callback(ctx, mode); /* open the file */ ctx->state = CLOSED; } logwrite(ctx, &c, 1); }logprintf(ctx int p = 0, b = 0, omitted = 0; int output_pos = 0; /* NZ if pending output in dumpdata */ if (ctx->cfg.logtype != LGTYP_PACKETS) return; /* Packet header. */ logprintf(ctx, "%s packet type %d / 0x%02x (%s)\r\n", direction == PKT_INCOMING ? "Incoming" : "Outgoing", type, type, texttype); /* * Output a hex/ASCII dump of the packet body, blanking/omitting * parts as specified. */ while (p < len) { int blktype; /* Move to a current entry in the blanking array. */ while ((b < n_blanks) && (p >= blanks[b].offset + blanks[b].len)) b++; /* Work out what type of blanking to apply to * this byte. */ blktype = PKTLOG_EMIT; /* default */ if ((b < n_blanks) && (p >= blanks[b].offset) && (p < blanks[b].offset + blanks[b].len)) blktype = blanks[b].type; /* If we're about to stop omitting, it's time to say how * much we omitted. */ if ((blktype != PKTLOG_OMIT) && omitted) { logprintf(ctx, " (%d byte%s omitted)\r\n", omitted, (omitted==1?"":"s")); omitted = 0; } /* (Re-)initialise dumpdata as necessary * (start of row, or if we've just stopped omitting) */ if (!output_pos && !omitted) sprintf(dumpdata, " %08x%*s\r\n", p-(p%16), 1+3*16+2+16, ""); /* Deal with the current byte. */ if (blktype == PKTLOG_OMIT) { omitted++; } else { int c; if (blktype == PKTLOG_BLANK) { c = 'X'; sprintf(smalldata, "XX"); } else { /* PKTLOG_EMIT */ c = ((unsigned char *)data)[p]; sprintf(smalldata, "%02x", c); } dumpdata[10+2+3*(p%16)] = smalldata[0]; dumpdata[10+2+3*(p%16)+1] = smalldata[1]; dumpdata[10+1+3*16+2+(p%16)] = (isprint(c) ? c : '.'); output_pos = (p%16) + 1; } p++; /* Flush row if necessary */ if (((p % 16) == 0) || (p == len) || omitted) { if (output_pos) { strcpy(dumpdata + 10+1+3*16+2+output_pos, "\r\n"); logwrite(ctx, dumpdata, strlen(dumpdata)); output_pos = 0; } } } /* Tidy up */ if (omitted) logprintf(ctx, " (%d byte%s omitted)\r\n", omitted, (omitted==1?"":"s")); logflush(ctx);state = CLOSED; ctx->frontend = frontend; ctx->cfg = *cfg; /* STRUCTURE COPY */ bufchain_init(&ctx->queue); return ctx; } void log_fre logfclose(ctx); bufchain_clear(&ctx->queue Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e10125d2e9165917179bdd40de225b3b Text-delta-base-sha1: ebf63064cd5187295e1849c06e9ac35988885191 Text-content-length: 84 Text-content-md5: a846d5435959ab4dac8353388cd27a2f Text-content-sha1: a72deb4204e06f86fc6333e24e9d17f232de17e8 Content-length: 84 SVN5p ; * , void (*callback)(void *ctx, int result), void *ctx Node-path: putty/macosx/osxclass.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7860137f84a1511dba101daac8c2bcb1 Text-delta-base-sha1: 36888184c253d0c27fa0f3da4129e29349965928 Text-content-length: 461 Text-content-md5: 0322241ddd969a7294da0ba550061ff4 Text-content-sha1: 30f1b3ae98f58fb27cba373d414334b7c4057316 Content-length: 461 SVN .v{t3o1struct alert_queue { struct alert_queue *next; NSAlert *alert; void (*callback)(void *, int); void *ctx; };/* * The following two members relate to the currently active * alert sheet, if any. They are NULL if there isn't one. */ void (*alert_callback)(void *, int); void *alert_ctx; /* This queues future alerts that need to be shown. */ struct alert_queue *alert_qhead, *alert_qtail Node-path: putty/macosx/osxdlg.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2a7e0192daf0ba4ee026e8a870d54876 Text-delta-base-sha1: 2c8169007154c741d8bea4994589041d745baf85 Text-content-length: 1034 Text-content-md5: 3da93316bb6f8e860bce7c85a85ed510 Text-content-sha1: 965394f14c27bfb227748ece3e403fd4ae005978 Content-length: 1034 SVN /df0PyzE6:P;struct appendstate { void (*callback)(void *ctx, int result); void *ctx; }; static void askappend_callback(void *ctx, int result) { struct appendstate *state = (struct appendstate *)ctx; state->callback(state->ctx, (result == NSAlertFirstButtonReturn ? 2 : result == NSAlertSecondButtonReturn ? 1 : 0)); sfree(state); } int askappend(void *frontend, Filename filename, void (*callback)(void *ctx, int result), void *ctx) { static const char msgtemplate[] = "The session log file \"%s\" already exists. " "You can overwrite it with a new session log, " "append your session log to the end of it, " "or disable session logging for this session."; appendstate *state; NSAlert *alert; text = dupprintf(msgtemplate, filename.path); state = snew(struct appendOverwrite"]; [alert addButtonWithTitle:@"Append"]; [alert addButtonWithTitle:@"Disable"]; [win startAlert:alert withCallback:askappend_callback andCtx:state]; return -1; Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9119aeb825a8c2510a270ce428d7369b Text-delta-base-sha1: bf114f0f881ab70f79e00c1ab2b5a91f711ca6df Text-content-length: 1319 Text-content-md5: a8bd9bb45ba04a39804ee18752c7000d Text-content-sha1: 6e5a9d46b95566c95865bf7db12fe5bc0893bbae Content-length: 1319 SVN*0}>S=Pg ;o back->provide_logctx(backhandle, logctx);if (alert_ctx || alert_qhead) { /* * Queue this alert to be shown later. */ struct alert_queue *qitem = snew(struct alert_queue); qitem->next = NULL; qitem->alert = alert; qitem->callback = callback; qitem->ctx = ctx; if (alert_qtail) alert_qtail->next = qitem; else alert_qhead = qitem; alert_qtail = qitem; } else { alert_callback = callback; alert_ctx = ctx; /* NB this is assumed to need freeing! */ [alert beginSheetModalForWindow:self modalDelegate:self didEndSelector:@selector(alertSheetDidEnd:returnCode:contextInfo:) contextInfo:NULL]; } alert_callback(alert_ctx, returnCode); /* transfers ownership of ctx */ /* * If there's an alert in our queue (either already or because * the callback just queued it), start it. */ if (alert_qhead) { struct alert_queue *qnext; alert_callback = alert_qhead->callback; alert_ctx = alert_qhead->ctx; [alert_qhead->alert beginSheetModalForWindow:self modalDelegate:self didEndSelector:@selector(alertSheetDidEnd:returnCode:contextInfo:) contextInfo:NULL]; qnext = alert_qhead->next; sfree(alert_qhead); alert_qhead = qnext; if (!qnext) alert_qtail = NULL; } else { alert_ctx = NULL; } Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 605735cb7224186621e10d558650d65a Text-delta-base-sha1: 86e856dd5c1a917c91a7c47763ea2197d940f4b6 Text-content-length: 330 Text-content-md5: 646cd6bddee9919887a501b179f2a0c5 Text-content-sha1: 0a2564e21dbc18fd530e65c196785d68084976cd Content-length: 330 SVN/..G.9v/* * askappend can return four values: * * - 2 means overwrite the log file * - 1 means append to the log file * - 0 means cancel logging for this session * - -1 means please wait. */ int askappend(void *frontend, Filename filename, void (*callback)(void *ctx, int result), void *ctx Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5086f968155e3690e88f064b38393fb4 Text-delta-base-sha1: 7d2cccf5f28c95030f98f58427a966d292ea97e9 Text-content-length: 84 Text-content-md5: fdcebc8fa802e05b2f498c64fd6492cc Text-content-sha1: 1b01b93f0465dd68534205b1f3b7e349bdc23ba0 Content-length: 84 SVNC~ ;jYj, void (*callback)(void *ctx, int result), void *ctx Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cfaed72f9444bca306d8dcf41bd07abe Text-delta-base-sha1: 1b8a058f212172c6d1428bb936a1a7df85e417ea Text-content-length: 80 Text-content-md5: c8e2239d06996d9039b24b9658829e40 Text-content-sha1: 80228e4e5f615a3a654b8614c39fd1f2d5456cda Content-length: 80 SVNr- ;0B0, void (*callback)(void *ctx, int result), void *ctx Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc173f396464f776aac47a4051ae0813 Text-delta-base-sha1: ece2126e39f496199891ab65909d15aa8329111d Text-content-length: 31 Text-content-md5: 584702d844a75dff630e87924dd8a777 Text-content-sha1: a7f1e7b3bf9eff27c3cd9dffb66ee2f817d0108f Content-length: 31 SVNo*z5[, Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7169b0c2791dec991821cf5c557a7edd Text-delta-base-sha1: c846911188dc8193d500060adab73a8632971659 Text-content-length: 84 Text-content-md5: b0936260b7ab2f075c2256d6ddc7cf70 Text-content-sha1: 33023f91f1a847315884f56066515c0cc3702ff8 Content-length: 84 SVN7r ;y>y, void (*callback)(void *ctx, int result), void *ctx Revision-number: 5345 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2005-02-18T18:35:30.252540Z K 7 svn:log V 71 Add plain-Unix binaries to the `make clean' list in the OS X makefile. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 043b256e64f259a62d4fd9e67fe0403c Text-delta-base-sha1: 0ccd75da88b0650276aa9196c2de70b51711683d Text-content-length: 78 Text-content-md5: da10811bc4966dda339cc302bcd77274 Text-content-sha1: 5d61568ba5e8847942d562c2d426eca0bb4583dd Content-length: 78 SVN` 7#9'". (join "", map { " $_" } &progrealnames("U")) . "\n"; Revision-number: 5346 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:26.496567Z PROPS-END Revision-number: 5347 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:26.506800Z PROPS-END Revision-number: 5348 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:26.517178Z PROPS-END Revision-number: 5349 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:26.528658Z PROPS-END Revision-number: 5350 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:26.545041Z PROPS-END Revision-number: 5351 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2005-02-18T21:42:05.629078Z K 7 svn:log V 24 Note existence of patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ffbcac42e798ab63e104008c40f85954 Text-delta-base-sha1: b431d1c2c8b465962df4190224ed5535870ee71e Text-content-length: 185 Text-content-md5: c7276a701993dafcace9336baf6dbe5a Text-content-sha1: f20f34e5fafc78985b804bbb918706a35ece2906 Content-length: 185 SVN2X&2&

    Update, 2005-02-18: I have a candidate implementation for this now, but it's not yet checked in pending testing (I don't have a suitable SSH-2 server). Revision-number: 5352 Prop-content-length: 184 Content-length: 184 K 7 svn:log V 84 New enum constant ERROR clashed with a macro in MinGW's wingdi.h. Use uglier names. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-18T22:03:15.855826Z PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b39b5fe35d637ed3017bb69f4c6b27d Text-delta-base-sha1: 333e28a980ab7c70cdeedc5b9c0ed7a7bb30feb5 Text-content-length: 627 Text-content-md5: f8a9b202513f2ec3854cd16ec25493b9 Text-content-sha1: 2f3c3791ed5d5bde3faac414a4fd7fe036314766 Content-length: 627 SVNjC$I|`&p{w'rH6[/^Ku)UwsL_CLOSED, L_OPENING, L_OPEN, L_L_CLOSED, we call logfopen, which will set the state * to one of L_OPENING, L_OPEN or L_ERROR. Hence we process all of * those three _after_ processing L_CLOSED. */ if (ctx->state == L_CLOSED) logfopen(ctx); if (ctx->state == L_OPENING) { bufchain_add(&ctx->queue, data, len); } else if (ctx->state == L_OPEN) { assert(ctx->lgfp); fwrite(data, 1, len, ctx->lgfp); } /* else L_L_L_L_OPEN; else ctx->state = L_ERROR; } if (ctx->state == L_L_OPENING);L_L_L_L_ Revision-number: 5353 Prop-content-length: 226 Content-length: 226 K 8 svn:date V 27 2005-02-19T01:20:16.178491Z K 7 svn:log V 125 Log file open mode lost a "b" in r5344. Windows at least needs log files to be written in binary mode with the current code. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f8a9b202513f2ec3854cd16ec25493b9 Text-delta-base-sha1: 2f3c3791ed5d5bde3faac414a4fd7fe036314766 Text-content-length: 29 Text-content-md5: 615615d2d612422652709a5c618a83c0 Text-content-sha1: efe390460d4ded7826233669d443eb61c659568e Content-length: 29 SVN Y7_b" : "wb Revision-number: 5354 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2005-02-19T14:48:36.374831Z K 7 svn:log V 65 Oops; missed out a crStop in the new host key verification code. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c779b52568bcdccc1a04e1410fdb6a2d Text-delta-base-sha1: cb3e9f21e4caeb5a01721b1d831f465ba819b6fc Text-content-length: 104 Text-content-md5: bbea810876434fc64fe045ed0a6f459e Text-content-sha1: b0388504884114a095d63c0ec8aee0c6d643a1da Content-length: 104 SVN d crStop(p break;  4; sigdata Revision-number: 5355 Prop-content-length: 210 Content-length: 210 K 8 svn:date V 27 2005-02-19T15:53:26.717825Z K 7 svn:log V 110 Grey the titles of group boxes when the config box is not frontmost. Edit box values still fail to be greyed. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f822d03e67185cc27d85570635e6e6c8 Text-delta-base-sha1: 3b448ad77b072b85db03c450dcd1ef3c0c32b255 Text-content-length: 92 Text-content-md5: 2b8dcda216154d0a4602255c96df0464 Text-content-sha1: 6fa362e16d7dfedbdf25c73d89a2207fbd76663d Content-length: 92 SVN>AA) case MACCTRL_GROUPBOX: HiliteControl(mc->popup.tbctrl, state) Revision-number: 5356 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2005-02-19T21:56:25.228138Z K 7 svn:log V 60 Correct some comments based on feedback from Thomas Dickey. K 10 svn:author V 3 ben PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 42f0b02d6aff40baa67c0f0977c48648 Text-delta-base-sha1: b8fd255681f6b0fcfff149ac1d0947914443bf86 Text-content-length: 139 Text-content-md5: 767dd179a81bd5e262ef4b315ffeef85 Text-content-sha1: 8859238498c643be9dd3f9284cf33bf97a7d6cb7 Content-length: 139 SVN'BYeYp m w aixterm-style brightaind reports. */ if (term->esc_narg]" (B Revision-number: 5357 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2005-02-19T22:04:14.085730Z K 7 svn:log V 23 http://putty.zvuk.net/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b5bca191cf040d72b8facd2f8a0e8ce2 Text-delta-base-sha1: b567834e3bcd10550d40e41568cf82e4b42d9344 Text-content-length: 91 Text-content-md5: 52fe15276aad0d6da65e5d5c19034cb5 Text-content-sha1: 25018ecbf4c667e8ed3499aed486ca2462dbe9c6 Content-length: 91 SVNI3 C]C6putty.zvuk.net/">putty.zvuk.net in Bulgaria. Revision-number: 5358 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Additional robustness to SFTP packet parsing and memory allocation. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-02-20T10:30:05.122128Z PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7ef7bd0360d42361ac90babc77577869 Text-delta-base-sha1: 20c6ae79fde0e6c43b17b55478dec03c6b966a46 Text-content-length: 468 Text-content-md5: eddbe291efc0da48f57748b6e345f9a3 Text-content-sha1: 41d82f130f4e89351571258495e70590faa0d093 Content-length: 468 SVNZ"&laV~!=`z>=limitsn, size_t size) { void *p; if (n > INT_MAX / size) { p = NULL; } else { size *= n; n, size_t size) { void *p; if (n > INT_MAX / size) { p = NULL; } else { size *= n; if (!ptr) { #ifdef MINEFIELD p = minefield_c_malloc(size); #else p = malloc(size); #endif } else { #ifdef MINEFIELD p = minefield_c_realloc(ptr, size); #else p = realloc(ptr, size); #endif } } Node-path: putty/puttymem.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69da60e61c0b5a13d4c7f9380cf8f598 Text-delta-base-sha1: 6d34f79f0fcd6a7c30cbcd78325aaacbf43aca7d Text-content-length: 702 Text-content-md5: 1c91c93d015c4f03fe5c766c2b4c2d98 Text-content-sha1: 5c28469836c98218d3632e11c7ea8727c8f11c83 Content-length: 702 SVNUG N Br>,1)) #define snmalloc(z,s) (mlog(__FILE__,__LINE__), safemalloc(z,s)) #define srealloc(y,z) (mlog(__FILE__,__LINE__), saferealloc(y,z,1)) #define snrealloc(y,z) (mlog(__FILE__,__LINE__), saferealloc(y,z,s)) #define sfree(z) (mlog(__FILE__,__LINE__), safefree(z)) void mlog(char *, int); #else #define smalloc(z) safemalloc(z,1) #define snmalloc safemalloc #define srealloc(y,z) saferealloc(y,z,1) #define snrealloc saferealloc #define sfree safefree #endif void *safemalloc(size_t, size_t); void *saferealloc(void *, size_tnmalloc(1, sizeof(type))) #define snewn(n, type) ((type *)snmalloc((n), sizeof(type))) #define sresize(ptr, n, type) ((type *)snrealloc((ptr), (n), Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 81c21bd189a54d88f8e8dc433b00b2fa Text-delta-base-sha1: 825569ae812d758cc1d2ce9c241f570b76e5cbbb Text-content-length: 5087 Text-content-md5: b4b73b9d9ca485410db32436d86f56a8 Text-content-sha1: 1bca5ba01aac0ecae773679ea9507456104ed29b Content-length: 5087 SVNUM5HcM6^f u $zQ{"?wLba'z T+#~^RB]z0M>-n0M>U2+.Yhmunsigned length, maxlen; unsignedint sftp_pkt_getbyte(struct sftp_packet *pkt, unsigned char *ret) { if (pkt->length - pkt->savedpos < 1) return 0; *ret1; } static int sftp_pkt_getuint32(struct sftp_packet *pkt, unsigned long *ret) { if (pkt->length - pkt->savedpos < 4) return 0; *ret = GET_32BIT(pkt->data + pkt->savedpos); pkt->savedpos += 4; return 1; } static int sftp_pkt_getstring(struct sftp_packet *pkt, 0; *length = GET_32BIT(pkt->data + pkt->savedpos); pkt->savedpos += 4; if (pkt->length - pkt->savedpos < *length || *length < 0) { *length = 0; return 0; } *p = pkt->data + pkt->savedpos; pkt->savedpos += *length; return 1; } static int sftp_pkt_getattrs(struct sftp_packet *pkt, struct fxp_attrs *ret) { if (!sftp_pkt_getuint32(pkt, &ret->flags)) return 0; if (ret->flags & SSH_FILEXFER_ATTR_SIZE) { unsigned long hi, lo; if (!sftp_pkt_getuint32(pkt, &hi) || !sftp_pkt_getuint32(pkt, &lo)) return 0; ret->size = uint64_make(hi, lo); } if (ret->flags & SSH_FILEXFER_ATTR_UIDGID) { if (!sftp_pkt_getuint32(pkt, &ret->uid) || !sftp_pkt_getuint32(pkt, &ret->gid)) return 0; } if (ret->flags & SSH_FILEXFER_ATTR_PERMISSIONS) { if (!sftp_pkt_getuint32(pkt, &ret->permissions)) return 0; } if (ret->flags & SSH_FILEXFER_ATTR_ACMODTIME) { if (!sftp_pkt_getuint32(pkt, &ret->atime) || !sftp_pkt_getuint32(pkt, &ret->mtime)) return 0; } if (ret->flags & SSH_FILEXFER_ATTR_EXTENDED) { unsigned long count; if (!sftp_pkt_getuint32(pkt, &count)) return 0if (!sftp_pkt_getstring(pkt, &str, &len) || !sftp_pkt_getstring(pkt, &str, &len)) return 0; } } return 1 unsigned char ucif (!sftp_pkt_getbyte(pkt, &uc)) { sftp_pkt_free(pkt); return NULL; } else { pkt->type = uc; } return pkt;f (!sftp_pkt_getuint32(pktin, &id)) { fxp_internal_error("did not receive a valid SFTP packet\n"); return NULL; }unsigned long ul; if (!sftp_pkt_getuint32(pktin, &ul)) { fxp_error_message = "malformed FXP_STATUS packet"; fxp_errtype = -1; } else { fxp_errtype = ul; if (fxp_errtype < 0 || fxp_errtype >= sizeof(messages) / sizeof(*messages)) fxp_error_message = "unknown error code"; else fxp_error_message = messages[fxp_errtype]; }unsigned longif (!sftp_pkt_getuint32(pktin, &remotever)) { fxp_internal_error("malformed FXP_VERSION packet"); sftp_pkt_free(pktin); return 0; }unsigned long count; char *path; int len; if (!sftp_pkt_getuint32(pktin, &count) || count != 1) { fxp_internal_error("REALPATH did not return name count of 1\n"); sftp_pkt_free(pktin); return NULL; } if (!sftp_pkt_getstring(pktin, &path, &len)if (!sftp_pkt_getstring(pktin, &hstring, &len)if (!sftp_pkt_getstring(pktin, &hstring, &len)) { fxp_internal_error("OPENDIRif (!sftp_pkt_getattrs(pktin, attrs)) { fxp_internal_error("malformed SSH_FXP_ATTRS packet"); sftp_pkt_free(pktin); return 0; } sftp_pkt_free(pktin); return 1if (!sftp_pkt_getattrs(pktin, attrs)) { fxp_internal_error("malformed SSH_FXP_ATTRS packet"); sftp_pkt_free(pktin); return 0; } sftp_pkt_free(pktin); return 1if (!sftp_pkt_getstring(pktin, &str, &rlen)) { fxp_internal_error("READ returned malformed SSH_FXP_DATA packet"); sftp_pkt_free(pktin); return -1; }unsigned long i; /* * Sanity-check the number of names. Minimum is obviously * zero. Maximum is the remaining space in the packet * divided by the very minimum length of a name, which is * 12 bytes (4 for an empty filename, 4 for an empty * longname, 4 for a set of attribute flags indicating that * no other attributes are supplied). */ if (!sftp_pkt_getuint32(pktin, &i) || i > (pktin->length-pktin->savedpos)/12) { fxp_internal_error("malformed FXP_NAME packet"); sftp_pkt_free(pktin); return NULL; } /* * Ensure the implicit multiplication in the snewn() call * doesn't suffer integer overflow and cause us to malloc * too little space. */ if (i > INT_MAX / sizeof(struct fxp_name)) { fxp_internal_error("unreasonably large FXP_NAME packet"); sftp_pkt_free(pktin); return NULL; } ret = snew(struct fxp_names); ret->nnames = i; ret->names = snewn(ret->nnames, struct fxp_name); for (i = 0; i < ret->nnames; i++) { char *str1, *str2; int len1, len2; if (!sftp_pkt_getstring(pktin, &str1, &len1) || !sftp_pkt_getstring(pktin, &str2, &len2) || !sftp_pkt_getattrs(pktin, &ret->names[i].attrs)) { fxp_internal_error("malformed FXP_NAME packet"); while (i--) { sfree(ret->names[i].filename); sfree(ret->names[i].longname); } sfree(ret->names); sfree(ret); sfree(pktin); return NULL; } ret->names[i].filename = mkstr(str1, len1); ret->names[i].longname = mkstr(str2, len2 Node-path: putty-branch-0.56/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a30b9d839b227074b8c7df7997c2fee Text-delta-base-sha1: d42006e698f23cdd6f9dcf9fd7eddf1316811073 Text-content-length: 468 Text-content-md5: d3067c191d8a0f67383eedbcff58e025 Text-content-sha1: a5f1e334d3970d492eb78ea2bf0575c1ef80505b Content-length: 468 SVN\"&naV!?`|>?limitsn, size_t size) { void *p; if (n > INT_MAX / size) { p = NULL; } else { size *= n; n, size_t size) { void *p; if (n > INT_MAX / size) { p = NULL; } else { size *= n; if (!ptr) { #ifdef MINEFIELD p = minefield_c_malloc(size); #else p = malloc(size); #endif } else { #ifdef MINEFIELD p = minefield_c_realloc(ptr, size); #else p = realloc(ptr, size); #endif } } Node-path: putty-branch-0.56/puttymem.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69da60e61c0b5a13d4c7f9380cf8f598 Text-delta-base-sha1: 6d34f79f0fcd6a7c30cbcd78325aaacbf43aca7d Text-content-length: 702 Text-content-md5: 1c91c93d015c4f03fe5c766c2b4c2d98 Text-content-sha1: 5c28469836c98218d3632e11c7ea8727c8f11c83 Content-length: 702 SVNUG N Br>,1)) #define snmalloc(z,s) (mlog(__FILE__,__LINE__), safemalloc(z,s)) #define srealloc(y,z) (mlog(__FILE__,__LINE__), saferealloc(y,z,1)) #define snrealloc(y,z) (mlog(__FILE__,__LINE__), saferealloc(y,z,s)) #define sfree(z) (mlog(__FILE__,__LINE__), safefree(z)) void mlog(char *, int); #else #define smalloc(z) safemalloc(z,1) #define snmalloc safemalloc #define srealloc(y,z) saferealloc(y,z,1) #define snrealloc saferealloc #define sfree safefree #endif void *safemalloc(size_t, size_t); void *saferealloc(void *, size_tnmalloc(1, sizeof(type))) #define snewn(n, type) ((type *)snmalloc((n), sizeof(type))) #define sresize(ptr, n, type) ((type *)snrealloc((ptr), (n), Node-path: putty-branch-0.56/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cdd922e39b55c1feaa7e5eb4e9f07bf9 Text-delta-base-sha1: bc574cb644725f2d9759b9861f38620caa733b92 Text-content-length: 5087 Text-content-md5: 8c2f8d1d3bb73572fa83bb0a13fa0794 Text-content-sha1: 07134bca249e2501996107e9a512f13317c31fbd Content-length: 5087 SVN5HcM6^f u $zQ{"?wLba'z T+#~^RB]z0M>-n0M>U2+.Y+munsigned length, maxlen; unsignedint sftp_pkt_getbyte(struct sftp_packet *pkt, unsigned char *ret) { if (pkt->length - pkt->savedpos < 1) return 0; *ret1; } static int sftp_pkt_getuint32(struct sftp_packet *pkt, unsigned long *ret) { if (pkt->length - pkt->savedpos < 4) return 0; *ret = GET_32BIT(pkt->data + pkt->savedpos); pkt->savedpos += 4; return 1; } static int sftp_pkt_getstring(struct sftp_packet *pkt, 0; *length = GET_32BIT(pkt->data + pkt->savedpos); pkt->savedpos += 4; if (pkt->length - pkt->savedpos < *length || *length < 0) { *length = 0; return 0; } *p = pkt->data + pkt->savedpos; pkt->savedpos += *length; return 1; } static int sftp_pkt_getattrs(struct sftp_packet *pkt, struct fxp_attrs *ret) { if (!sftp_pkt_getuint32(pkt, &ret->flags)) return 0; if (ret->flags & SSH_FILEXFER_ATTR_SIZE) { unsigned long hi, lo; if (!sftp_pkt_getuint32(pkt, &hi) || !sftp_pkt_getuint32(pkt, &lo)) return 0; ret->size = uint64_make(hi, lo); } if (ret->flags & SSH_FILEXFER_ATTR_UIDGID) { if (!sftp_pkt_getuint32(pkt, &ret->uid) || !sftp_pkt_getuint32(pkt, &ret->gid)) return 0; } if (ret->flags & SSH_FILEXFER_ATTR_PERMISSIONS) { if (!sftp_pkt_getuint32(pkt, &ret->permissions)) return 0; } if (ret->flags & SSH_FILEXFER_ATTR_ACMODTIME) { if (!sftp_pkt_getuint32(pkt, &ret->atime) || !sftp_pkt_getuint32(pkt, &ret->mtime)) return 0; } if (ret->flags & SSH_FILEXFER_ATTR_EXTENDED) { unsigned long count; if (!sftp_pkt_getuint32(pkt, &count)) return 0if (!sftp_pkt_getstring(pkt, &str, &len) || !sftp_pkt_getstring(pkt, &str, &len)) return 0; } } return 1 unsigned char ucif (!sftp_pkt_getbyte(pkt, &uc)) { sftp_pkt_free(pkt); return NULL; } else { pkt->type = uc; } return pkt;f (!sftp_pkt_getuint32(pktin, &id)) { fxp_internal_error("did not receive a valid SFTP packet\n"); return NULL; }unsigned long ul; if (!sftp_pkt_getuint32(pktin, &ul)) { fxp_error_message = "malformed FXP_STATUS packet"; fxp_errtype = -1; } else { fxp_errtype = ul; if (fxp_errtype < 0 || fxp_errtype >= sizeof(messages) / sizeof(*messages)) fxp_error_message = "unknown error code"; else fxp_error_message = messages[fxp_errtype]; }unsigned longif (!sftp_pkt_getuint32(pktin, &remotever)) { fxp_internal_error("malformed FXP_VERSION packet"); sftp_pkt_free(pktin); return 0; }unsigned long count; char *path; int len; if (!sftp_pkt_getuint32(pktin, &count) || count != 1) { fxp_internal_error("REALPATH did not return name count of 1\n"); sftp_pkt_free(pktin); return NULL; } if (!sftp_pkt_getstring(pktin, &path, &len)if (!sftp_pkt_getstring(pktin, &hstring, &len)if (!sftp_pkt_getstring(pktin, &hstring, &len)) { fxp_internal_error("OPENDIRif (!sftp_pkt_getattrs(pktin, attrs)) { fxp_internal_error("malformed SSH_FXP_ATTRS packet"); sftp_pkt_free(pktin); return 0; } sftp_pkt_free(pktin); return 1if (!sftp_pkt_getattrs(pktin, attrs)) { fxp_internal_error("malformed SSH_FXP_ATTRS packet"); sftp_pkt_free(pktin); return 0; } sftp_pkt_free(pktin); return 1if (!sftp_pkt_getstring(pktin, &str, &rlen)) { fxp_internal_error("READ returned malformed SSH_FXP_DATA packet"); sftp_pkt_free(pktin); return -1; }unsigned long i; /* * Sanity-check the number of names. Minimum is obviously * zero. Maximum is the remaining space in the packet * divided by the very minimum length of a name, which is * 12 bytes (4 for an empty filename, 4 for an empty * longname, 4 for a set of attribute flags indicating that * no other attributes are supplied). */ if (!sftp_pkt_getuint32(pktin, &i) || i > (pktin->length-pktin->savedpos)/12) { fxp_internal_error("malformed FXP_NAME packet"); sftp_pkt_free(pktin); return NULL; } /* * Ensure the implicit multiplication in the snewn() call * doesn't suffer integer overflow and cause us to malloc * too little space. */ if (i > INT_MAX / sizeof(struct fxp_name)) { fxp_internal_error("unreasonably large FXP_NAME packet"); sftp_pkt_free(pktin); return NULL; } ret = snew(struct fxp_names); ret->nnames = i; ret->names = snewn(ret->nnames, struct fxp_name); for (i = 0; i < ret->nnames; i++) { char *str1, *str2; int len1, len2; if (!sftp_pkt_getstring(pktin, &str1, &len1) || !sftp_pkt_getstring(pktin, &str2, &len2) || !sftp_pkt_getattrs(pktin, &ret->names[i].attrs)) { fxp_internal_error("malformed FXP_NAME packet"); while (i--) { sfree(ret->names[i].filename); sfree(ret->names[i].longname); } sfree(ret->names); sfree(ret); sfree(pktin); return NULL; } ret->names[i].filename = mkstr(str1, len1); ret->names[i].longname = mkstr(str2, len2 Revision-number: 5359 Prop-content-length: 159 Content-length: 159 K 7 svn:log V 59 Couple of additional fixes for the more embarrassing bugs. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-02-20T10:31:07.234899Z PROPS-END Node-path: putty-branch-0.56/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 81af4413f63b668a8338dc9e92821129 Text-delta-base-sha1: 6ccabccf93b1c48747a2681b70530b8c9beb24b3 Text-content-length: 851 Text-content-md5: b23cba7e3fddea200dbe85f5a82fa964 Text-content-sha1: 772e6bd36b3ac618db213a135e8fcf2d69e361d3 Content-length: 851 SVNuc Rint ssh2_pkt_getbool int always_display; /* XXX maybe we should actually take notice of this */ always_display = ssh2_pkt_getbool(ssh);4UOaX}m)pX>p<?Vlogevent("X11 forwarding enabled"); ssh->X11_fwd_enabled = TRUE; } } 1" " destinationstatic char *sportdesc; static char *sportdesc; { ssh2_pkt_addstring(ssh, saddr); } else if (ssh->cfg.rport_acceptall) { ssh2_pkt_addstring(ssh, "0.0.0.0"); } else { ssh2_pkt_addstring(ssh, "127.0.0.1"); }~kkda_ctx) { crcda_free_context(ssh->crcda_ctx); ssh->crcda_ctx = NULL; } if (ssh->s) ssh_do_close(ssh); sfree(ssh); } /* * Reconfigure the SSH backend. * * Currently, this function does nothing very useful. In future, Node-path: putty-branch-0.56/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c7045bbdd73eb8406cdcdbe7646dd15 Text-delta-base-sha1: c3573a8324cc47c82ef13f8797df72386ab8659e Text-content-length: 24 Text-content-md5: 7c491b5c69c0d337b0bcfe61336c5aa5 Text-content-sha1: b62a7c349821b85b6088fadac7594ab1783788d8 Content-length: 24 SVNFB 1ret Revision-number: 5360 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2005-02-20T10:41:39.755039Z K 7 svn:log V 26 Tag 0.57 release sources. K 10 svn:author V 5 simon PROPS-END Node-path: putty-0.57 Node-kind: dir Node-action: add Node-copyfrom-rev: 5359 Node-copyfrom-path: putty-branch-0.56 Revision-number: 5361 Prop-content-length: 250 Content-length: 250 K 8 svn:date V 27 2005-02-20T10:51:02.468557Z K 7 svn:log V 149 Bump version numbers. (Forgot to do this _before_ dropping the 0.57 tag, but that's OK because SVN doesn't distinguish tags from branches anyway...) K 10 svn:author V 5 simon PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0354dac1614437ebfd65cec07b74744d Text-delta-base-sha1: 0532c7f82a1931f3f7aab776bab10618ec3e2e2e Text-content-length: 15 Text-content-md5: 18cd9fa87084c6932c6100347ab9aec9 Text-content-sha1: d481c30a7e4b84bed6e1a7cead54396a8987091b Content-length: 15 SVN0.57 Node-path: putty/mac/version.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e35d53531e93ba7e6893dd47c92b579 Text-delta-base-sha1: 60a014e521df37f0755f408abd82ac3cce53f718 Text-content-length: 20 Text-content-md5: ab635ddff4154a9269e82900c08fab46 Text-content-sha1: 5bdaea9a2094adbd4fffde90b94f23f6ab7003fd Content-length: 20 SVN77mIn7 Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b92ec17feb7769f6eded47a931daf4b2 Text-delta-base-sha1: 89ae7f5a9a89210f83dbfdbfc0fd6847e53e3e4e Text-content-length: 22 Text-content-md5: 099545e49d34882acbfe2e939be3a067 Text-content-sha1: f3cf852ff18092c299a3166742d98615c182a69d Content-length: 22 SVN XGY7 Node-path: putty-0.57/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0354dac1614437ebfd65cec07b74744d Text-delta-base-sha1: 0532c7f82a1931f3f7aab776bab10618ec3e2e2e Text-content-length: 15 Text-content-md5: 18cd9fa87084c6932c6100347ab9aec9 Text-content-sha1: d481c30a7e4b84bed6e1a7cead54396a8987091b Content-length: 15 SVN0.57 Node-path: putty-0.57/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 880fc314dfcdf5e4ad3fa0252466a614 Text-delta-base-sha1: 31f37aecebab3e33b27271635c0c0d67e9bd6530 Text-content-length: 37 Text-content-md5: 7eee351d0c0479039319253e5c64bf90 Text-content-sha1: cd5d8b804750b61d6e0d6a94f313b8823f361d50 Content-length: 37 SVNb- PCN\versionid $Id7 Node-path: putty-0.57/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ee033a49c4e0ce121f01d6bb5f6837b Text-delta-base-sha1: 5fc37b55adaafe7dbea28ee9981f557cc3b6fb34 Text-content-length: 37 Text-content-md5: 09648e9f063d3ad8b716df824c2a173f Text-content-sha1: 893d0339bda85cb97e442947583800d263d1c96c Content-length: 37 SVN< =B<\versionid $Id7 Node-path: putty-0.57/mac/version.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e35d53531e93ba7e6893dd47c92b579 Text-delta-base-sha1: 60a014e521df37f0755f408abd82ac3cce53f718 Text-content-length: 20 Text-content-md5: ab635ddff4154a9269e82900c08fab46 Text-content-sha1: 5bdaea9a2094adbd4fffde90b94f23f6ab7003fd Content-length: 20 SVN77mIn7 Node-path: putty-0.57/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f049844d1355bac2febd62e3867a572 Text-delta-base-sha1: 0fef9ff10c0a5c5d01f10498fc55b32b4663264c Text-content-length: 2097 Text-content-md5: c35948318eccbb0edd64c1bec2930f4b Text-content-sha1: 888d265a8a37eca3239024a9da17e370f7e932c1 Content-length: 2097 SVNV/vE@uMj?F]fyy; -*- no -*- ; putty.iss ; ; -- Inno Setup installer script for PuTTY and its related tools. ; ; TODO for future releases: ; ; - It would be neighbourly to set up an [UninstallRun] entry that ran ; some close cousin of `putty -cleanup', only it should prompt first ; in case the user wants to keep stuff. And make the `leave it alone' ; button the DEFAULT. And perhaps warn that on NT-style systems not ; everything will be caught by this. ; ; - The Quick Launch bar is an interesting thought. Certainly a fair ; number of people actually _believe_ my silly joke about how PuTTY ; is the only thing that makes Windows usable, so perhaps they'd like ; that. Unchecked by default, though, I think. ; * does this need to be conditional on the Windows version? [Setup] AppName=PuTTY AppVerName=PuTTY version 0.57 DefaultDirName={pf}\PuTTY DefaultGroupName=PuTTY UninstallDisplayIcon={app}\putty.exe ChangesAssociations=yes Compression=zip/9 [Files] Source: "putty.exe"; DestDir: "{app}" Source: "pageant.exe"; DestDir: "{app}" Source: "puttygen.exe"; DestDir: "{app}" Source: "pscp.exe"; DestDir: "{app}" Source: "psftp.exe"; DestDir: "{app}" Source: "plink.exe"; DestDir: "{app}" Source: "website.url"; DestDir: "{app}" Source: "doc\putty.hlp"; DestDir: "{app}" Source: "doc\putty.cnt"; DestDir: "{app}" Source: "LICENCE"; DestDir: "{app}" Source: "README.txt"; DestDir: "{app}"; Flags: isreadme [Icons] Name: "{group}\PuTTY Manual"; Filename: "{app}\putty.hlp"; Tasks: startmenu Name: "{group}\PuTTY Web Site"; Filename: "{app}\website.url"; Tasks: startmenu Name: "{group}\PSFTP"; Filename: "{app}\psftp.exe"; Tasks: startmenu Name: "{group}\PuTTYgen"; Filename: "{app}\puttygen.exe"; Tasks: startmenu Name: "{group}\Pageant"; Filename: "{app}\pageant.exe"; Tasks: startmenu [Tasks] Name: startmenu; Description: "Create a &Start Menu group" Name: desktopicon; Description: "Create a &desktop icon for PuTTY" Name: associate; Description: "&Associate .PPK files (PuTTY Private Key) with Pageant" [Registry] Node-path: putty-branch-0.56/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0354dac1614437ebfd65cec07b74744d Text-delta-base-sha1: 0532c7f82a1931f3f7aab776bab10618ec3e2e2e Text-content-length: 15 Text-content-md5: 18cd9fa87084c6932c6100347ab9aec9 Text-content-sha1: d481c30a7e4b84bed6e1a7cead54396a8987091b Content-length: 15 SVN0.57 Node-path: putty-branch-0.56/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 880fc314dfcdf5e4ad3fa0252466a614 Text-delta-base-sha1: 31f37aecebab3e33b27271635c0c0d67e9bd6530 Text-content-length: 37 Text-content-md5: 7eee351d0c0479039319253e5c64bf90 Text-content-sha1: cd5d8b804750b61d6e0d6a94f313b8823f361d50 Content-length: 37 SVNb- PCN\versionid $Id7 Node-path: putty-branch-0.56/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ee033a49c4e0ce121f01d6bb5f6837b Text-delta-base-sha1: 5fc37b55adaafe7dbea28ee9981f557cc3b6fb34 Text-content-length: 37 Text-content-md5: 09648e9f063d3ad8b716df824c2a173f Text-content-sha1: 893d0339bda85cb97e442947583800d263d1c96c Content-length: 37 SVN< =B<\versionid $Id7 Node-path: putty-branch-0.56/mac/version.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e35d53531e93ba7e6893dd47c92b579 Text-delta-base-sha1: 60a014e521df37f0755f408abd82ac3cce53f718 Text-content-length: 20 Text-content-md5: ab635ddff4154a9269e82900c08fab46 Text-content-sha1: 5bdaea9a2094adbd4fffde90b94f23f6ab7003fd Content-length: 20 SVN77mIn7 Node-path: putty-branch-0.56/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f049844d1355bac2febd62e3867a572 Text-delta-base-sha1: 0fef9ff10c0a5c5d01f10498fc55b32b4663264c Text-content-length: 2097 Text-content-md5: 752ad719e5fdf43c8e2837ac55b6af39 Text-content-sha1: a1f92fe2455bd30af81e1833f403ba4980304974 Content-length: 2097 SVNV/vE@uMj?F]fyy; -*- no -*- ; putty.iss ; ; -- Inno Setup installer script for PuTTY and its related tools. ; ; TODO for future releases: ; ; - It would be neighbourly to set up an [UninstallRun] entry that ran ; some close cousin of `putty -cleanup', only it should prompt first ; in case the user wants to keep stuff. And make the `leave it alone' ; button the DEFAULT. And perhaps warn that on NT-style systems not ; everything will be caught by this. ; ; - The Quick Launch bar is an interesting thought. Certainly a fair ; number of people actually _believe_ my silly joke about how PuTTY ; is the only thing that makes Windows usable, so perhaps they'd like ; that. Unchecked by default, though, I think. ; * does this need to be conditional on the Windows version? [Setup] AppName=PuTTY AppVerName=PuTTY version 0.56 DefaultDirName={pf}\PuTTY DefaultGroupName=PuTTY UninstallDisplayIcon={app}\putty.exe ChangesAssociations=yes Compression=zip/9 [Files] Source: "putty.exe"; DestDir: "{app}" Source: "pageant.exe"; DestDir: "{app}" Source: "puttygen.exe"; DestDir: "{app}" Source: "pscp.exe"; DestDir: "{app}" Source: "psftp.exe"; DestDir: "{app}" Source: "plink.exe"; DestDir: "{app}" Source: "website.url"; DestDir: "{app}" Source: "doc\putty.hlp"; DestDir: "{app}" Source: "doc\putty.cnt"; DestDir: "{app}" Source: "LICENCE"; DestDir: "{app}" Source: "README.txt"; DestDir: "{app}"; Flags: isreadme [Icons] Name: "{group}\PuTTY Manual"; Filename: "{app}\putty.hlp"; Tasks: startmenu Name: "{group}\PuTTY Web Site"; Filename: "{app}\website.url"; Tasks: startmenu Name: "{group}\PSFTP"; Filename: "{app}\psftp.exe"; Tasks: startmenu Name: "{group}\PuTTYgen"; Filename: "{app}\puttygen.exe"; Tasks: startmenu Name: "{group}\Pageant"; Filename: "{app}\pageant.exe"; Tasks: startmenu [Tasks] Name: startmenu; Description: "Create a &Start Menu group" Name: desktopicon; Description: "Create a &desktop icon for PuTTY" Name: associate; Description: "&Associate .PPK files (PuTTY Private Key) with Pageant" [Registry] Revision-number: 5362 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2005-02-20T11:34:46.449504Z K 7 svn:log V 36 README.txt needs CRLF line endings. K 10 svn:author V 5 simon PROPS-END Node-path: putty/README.txt Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 38 Content-length: 38 K 13 svn:eol-style V 4 CRLF PROPS-END Revision-number: 5363 Prop-content-length: 343 Content-length: 343 K 8 svn:date V 27 2005-02-20T12:54:10.095099Z K 7 svn:log V 243 Support the drop-down menu part of the editbox control (combobox). This cuts and pastes a lot of code from macctrl_popup, which perhaps should be consolidated. Also change the effective line codepage when it is changed with Change Settings. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b8dcda216154d0a4602255c96df0464 Text-delta-base-sha1: 6fa362e16d7dfedbdf25c73d89a2207fbd76663d Text-content-length: 2978 Text-content-md5: b0b9712a738bcccc3f42cfdbb437217a Text-content-sha1: cdc68c949639c8e753c3ca2c313e7d3e466cb474 Content-length: 2978 SVN\7cOYaA2Sy8"J0.by<[Je ;rBHtvoWtX\w.}|UnAIv`9 0q'<4\,3/4rLAu}|&3PgTFQ5 ControlRef tbbutton; MenuRef menu; int menuid; unsigned int nids; int *idsif (mc->editbox.tbbutton != NULL) hideshow(mc->editbox.tbbutton, butbounds; static int nextmenuid = MENU_MIN; int menuid; MenuRef menu if (ctrl->editbox.has_list) { butbounds = bounds; butbounds.left = butbounds.right - 20; bounds.right -= 26; /* enough for 6 px gap and a button */ } if (ctrl->editbox.has_list) { while (GetMenuHandle(nextmenuid) != NULL) if (++nextmenuid >= MENU_MAX) nextmenuid = MENU_MIN; menuid = nextmenuid++; menu = NewMenu(menuid, "\pdummy"); if (menu == NULL) goto nomenu; mc->editbox.menu = menu; mc->editbox.menuid = menuid; InsertMenu(menu, kInsertHierarchicalMenu); mc->editbox.nids = 0; mc->editbox.ids = NULL; mc->editbox.tbbutton = NewControl(window, &butbounds, NULL, FALSE, popupTitleLeftJust, menuid, 0, popupMenuProc + popupFixedWidth, (long)mc); } nomenu: if (mc->editbox.tbbutton != NULL) HiliteControl(mc->editbox.tbbuttonEDITBOX && control == mc->editbox.tbbutton) { dlg_editbox_set(mc->generic.ctrl, mcs, cp_enumerate(dlg_listbox_index(mc->generic.ctrl, mcs))); ctrlevent(mcs, mc, EVENT_VALCHANGE)EDITBOX: if (control == mc->editbox.tbbutton) { dlg_editbox_set(mc->generic.ctrl, mcs, cp_enumerate(dlg_listbox_index(mc->generic.ctrl, mcs))); ctrlevent(mcs, mc, EVENT_VALCHANGE); }edit_clearMenuRef menu = mc->editboxeditbox.nids = 0; sfree(mc->editbox.ids); mc->editbox.ids = NULL; SetControlMaximum(mc->editbox.tbbutton case CTRL_EDITBOX: dlg_macedit_clear(ctrl, dlg)edit_del MenuRef menu = mc->editboxeditbox.ids != NULL) memcpy(mc->editbox.ids + index, mc->editbox.ids + index + 1, (mc->editbox.nids - index - 1) * sizeof(*mc->editbox.ids)); SetControlMaximum(mc->editbox.tbbutton case CTRL_EDITBOX: dlg_macedit_del(ctrl, dlg, index)static void dlg_macediMenuRef menu = mc->editboxeditbox.tbbutton, CountMenuItems(menu)); } case CTRL_EDITBOX: dlg_macediediteditbox.menu; unsigned int index; if (mc == NULL) return; dlg_macedit_add(ctrl, dlg, text); index = CountMenuItems(menu) - 1; if (mc->editbox.nids <= index) { mc->editbox.nids = index + 1; mc->editbox.ids = sresize(mc->editbox.ids, mc->editbox.nids, int); } mc->editbox case CTRL_EDITBOX: dlg_macedi case CTRL_EDITBOX: assert(mc->editbox.ids != NULL && mc->editbox.nids > index); return mc->editbox.ids[index]; case CTRL_EDITBOX: return GetControlValue(mc->editbox.tbbutton) - 1; } return -1; } int dlg_listbox_issel case CTRL_EDITBOX: return GetControlValue(mc->editbox.tbbutton) - 1 == index; case CTRL_EDITBOX: SetControlValue(mc->editbox.tbbutton, index + 1) Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b1157cb9c85f605a2d17e89b41477ac Text-delta-base-sha1: d0924a4ecfd1e6666954fb0daedd8cc3b33064be Text-content-length: 60 Text-content-md5: ef90ec05212b4ba51251deb5eaa5103d Text-content-sha1: 0b8fba3fc87a3ac537b0ce50fc286f0e29dd86bb Content-length: 60 SVN/` '#Reinitialise line codepage */ init_ucs Revision-number: 5364 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2005-02-20T15:48:22.379545Z K 7 svn:log V 14 0.57 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7ae943620f0eb30428f4b2cc25b4e28f Text-delta-base-sha1: 49ec5b38ededb6b60f2a532999d986319d748ddd Text-content-length: 90 Text-content-md5: 8b5c032b65ee19a91dab139b4352ec82 Text-content-sha1: 297d8c342046e110cd3b4c58df04db35598b4710 Content-length: 90 SVNtC DUD*Jtemp /~sgtatham/putty/0.57/ http://the.earth.li/~sgtatham/putty/0.57 Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 54ef41e09c02d3f2305140f9ff9cc9c3 Text-delta-base-sha1: c397e65fedc737749edbbb4135c192a81a128b8b Text-content-length: 545 Text-content-md5: 5c11bec0186612059f9406d368c1a599 Text-content-sha1: 61197c21aa54b50ee9ed633458fa927d02c24de2 Content-length: 545 SVN6c U.7 (released 2005-02-20):

    • Security fix: a vulnerability discovered by iDEFENSE, potentially allowing arbitrary code execution on an SFTP client by a malicious SFTP server (but only after host key verification), has been fixed.
    • Fixed small bug with X forwarding to local displays.
    • Fixed crashing bug with remote port forwarding.
    • Fixed handling of SSH2 debug messages (embarrassingly, a bug introduced when fixing the previous vulnerability - it was more secure but didn't work any more!).
    Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 768944d61d2ee6a933d9c46149cdad2e Text-delta-base-sha1: 0cfd13ce8b8ddce1453c0c9caccf723e55ec7b2c Text-content-length: 215 Text-content-md5: 6176587262eea6f391e5f904edb5d831 Text-content-sha1: 99d4a75ea1381a733f9a994059fd6adb01e1021d Content-length: 215 SVN885! "X@j7U(T|O@Q>Fr77-installer.exe">putty-0.57-installerx86/putty-0.577-installerx86/putty-0.577.tar.gz">putty-0.57.tar.gzputty-0.57.tar.gzputty-0.57.tar.gzputty-0.57 Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f7b4d02802f387d69cb829539fb24a5 Text-delta-base-sha1: 93ae1464f11fdd0788219a85c52c762038f099c0 Text-content-length: 22 Text-content-md5: 0c1c7f88a9624b3c51b26b80bbaaa19a Text-content-sha1: 3363f438f53e8ac41cd5c5783c38999050b840b9 Content-length: 22 SVN[[ >7 Revision-number: 5365 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 Things fixed in 0.57. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-20T15:51:25.023378Z PROPS-END Node-path: putty-wishlist/data/ssh-remote-tunnel-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ea2d0217b808b67aeee9234ba0495f1a Text-delta-base-sha1: f8b66b765a25b0a470e12d9008f5b0abfe6b657e Text-content-length: 26 Text-content-md5: 415d2830cf953253f6affddba2bf1830 Text-content-sha1: 5570975fd8078c13fcd485b34684c98982ffbe07 Content-length: 26 SVN   ~ 0.57 Node-path: putty-wishlist/data/vuln-sftp-readdir Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2125 Text-content-md5: 92e62ca0281c3a62a749394ee2b99803 Text-content-sha1: 4172c88e31bed8dec6e30a5ff559c4e80e18506e Content-length: 2135 PROPS-END SVN???Summary: Vulnerability: crafted SFTP FXP_READDIR reply may allow remote code execution Class: vulnerability Difficulty: fun Priority: high Present-in: 0.56 Fixed-in: 0.57 Content-type: text/x-html-body

    Many versions of PSFTP and PSCP prior to 0.57 have a heap corruption vulnerability in their treatment of the response to the FXP_READDIR command (enumerate entries in a directory) in the SSH File Transfer Protocol (SFTP).

    In order for this vulnerability to be exploited, the user connect to a malicious server and issue a ls or dir command to PSFTP, or supply the -ls command-line option to PSCP.

    (Note however that the vulnerability kicks in after host key verification, so the host key of the server has to have been accepted to get this far.)

    SFTP is always used by PSFTP; it is also used by PSCP if available (depending on server behaviour). It can be used in both SSH-2 and SSH-1 (again, depending on server behaviour). Thus, a malicious server can exploit this in all invocations of PSFTP and PSCP, unless the -scp option is supplied to PSCP.

    This bug was discovered by an anonymous contributor to iDEFENSE's Vulnerability Contributor Program. It will be documented in a forthcoming iDEFENSE advisory.

    Vulnerability details: In response to an FXP_READDIR request, the server returns a count of directory entries, followed by the entries themselves. In sftp.c:fxp_readdir_recv(), this count was passed to snewn() to allocate memory, where it was used as a multiplier for an internal structure size. With a sufficiently large count, an integer overflow could be provoked in snewn(), such that insufficient memory could silently be malloc()'d. fxp:readdir_recv() would then read server-supplied data into this buffer, leading to a heap corruption with server-controlled contents, and hence potentially to execution of arbitrary code. Node-path: putty-wishlist/data/vuln-sftp-string Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1970 Text-content-md5: 2162204cddf60243183d79526003a0e6 Text-content-sha1: 28a25116697a7d311e7985339ed48099713aaa2f Content-length: 1980 PROPS-END SVN$$$Summary: Vulnerability: crafted SFTP string may allow remote code execution Class: vulnerability Difficulty: fun Priority: high Present-in: 0.56 Fixed-in: 0.57 Content-type: text/x-html-body

    Many versions of PSFTP and PSCP prior to 0.57 have a heap corruption vulnerability in their treatment of string fields in the SSH File Transfer Protocol (SFTP).

    Since a string field is present in the server's response to the FXP_OPEN request, this vulnerability can be triggered by simply connecting to a malicious SFTP server.

    (Note however that the vulnerability kicks in after host key verification, so the host key of the server has to have been accepted to get this far.)

    SFTP is always used by PSFTP; it is also used by PSCP if available (depending on server behaviour). It can be used in both SSH-2 and SSH-1 (again, depending on server behaviour). Thus, a malicious server can exploit this in all invocations of PSFTP and PSCP, unless the -scp option is supplied to PSCP.

    This bug was discovered by an anonymous contributor to iDEFENSE's Vulnerability Contributor Program. It will be documented in a forthcoming iDEFENSE advisory.

    (The Unix version of PuTTYgen can and does run in a batch mode, as we use /dev/random there, which is assumed to be a sufficiently good source of randomness and doesn't require us to interact with the user.) Revision-number: 5016 Prop-content-length: 807 Content-length: 807 K 8 svn:date V 27 2004-12-20T09:27:44.087853Z K 7 svn:log V 706 The end condition in the binary search loop in the new getType() was incorrect. I must have written that binary search idiom a hundred times, so it's rather embarrassing that I can't _automatically_ get it right! This was causing all kinds of characters to be classified as ON when they should have been various other classes. Also while I'm here, I've added another test case to utf8.txt (a small piece of Arabic within a predominantly L->R line), and also supplied a means to compile minibidi.c with -DTEST_GETTYPE to produce a command-line character class lookup tool. (Not sure what use that'll be _other_ than debugging this precise problem, but I don't like to throw it away now I've written it :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e17954f559f9199503d735e0f9f23eca Text-delta-base-sha1: ed32b93fc028c483846a9b0663b8ccb7781a7008 Text-content-length: 1064 Text-content-md5: 0fa47f30650a7f437e08dc3a293b6282 Text-content-sha1: 07c066c4fb75c6bef05652c154cd3f4057b7069b Content-length: 1064 SVN(.l{For standalone compilation in a testing mode. * Still depends on the PuTTY headers for snewn and sfree, but can avoid * _linking_ with any other PuTTY code. */ #ifdef TEST_GETTYPE #define safemalloc malloc #define safefree free #endif1 #ifdef TEST_GETTYPE #include #include int main(int argc, char **argv) { static const struct { int type; char *name; } typetoname[] = { #define TYPETONAME(X) { X , #X } TYPETONAME(L), TYPETONAME(LRE), TYPETONAME(LRO), TYPETONAME(R), TYPETONAME(AL), TYPETONAME(RLE), TYPETONAME(RLO), TYPETONAME(PDF), TYPETONAME(EN), TYPETONAME(ES), TYPETONAME(ET), TYPETONAME(AN), TYPETONAME(CS), TYPETONAME(NSM), TYPETONAME(BN), TYPETONAME(B), TYPETONAME(S), TYPETONAME(WS), TYPETONAME(ON), #undef TYPETONAME }; int i; for (i = 1; i < argc; i++) { unsigned long chr = strtoul(argv[i], NULL, 0); int type = getType(chr); assert(typetoname[type].type == type); printf("U+%04x: %s\n", chr, typetoname[type].name); } return 0; } #endif Node-path: putty/testdata/utf8.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ae5952f6321a065ef619581dc99bbdd Text-delta-base-sha1: 02e561a2d6c93f6a73e6f4a050086258414366f9 Text-content-length: 86 Text-content-md5: 88f14f5e4bd84d939c35a367d46ccb5f Text-content-sha1: 74fd10426e973c617d8165dc92b68e7a2f8d7ec8 Content-length: 86 SVN9~E9EMixed LTR and RTL text: جرير رضي back to LTR. Revision-number: 5017 Prop-content-length: 736 Content-length: 736 K 8 svn:date V 27 2004-12-22T10:21:50.956225Z K 7 svn:log V 635 In my revamp of cursor handling I had assumed that you were supposed to call _either_ do_text() _or_ do_cursor() on a given character cell. In fact you're supposed to call do_text() no matter what, and then call do_cursor() as well if it's got the cursor on it, since do_cursor() _only_ draws the actual cursor, which often doesn't also cause the text to get drawn. I'm half tempted to change this in the interface, retire do_cursor() as an external function and relegate it to an internal function in each front end, and require that do_text() must fully process all cursor attributes it is passed. However, I haven't done this yet. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb5356f39f84ee6d92fb48ec1781af8c Text-delta-base-sha1: a7047a78c2fd32cb0f9c078faade56037b0593e3 Text-content-length: 380 Text-content-md5: a48a9a7faae8ec782b184d1ec66ac3c1 Text-content-sha1: f59b2fc91fdc8fe83b111a333c665813c568308b Content-length: 380 SVN"Fe%V!do_text(ctx, start, i, ch, ccount, attr, ldata->lattr); if (attr & (TATTR_ACTCURS | TATTR_PASCURS)) do_cursor(ctx, start, i, ch, ccount, attr, do_text(ctx, start, i, ch, ccount, attr, ldata->lattr); if (attr & (TATTR_ACTCURS | TATTR_PASCURS)) do_cursor(ctx, start, i, ch, ccount, attr, Revision-number: 5018 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2004-12-22T10:53:58.499153Z K 7 svn:log V 118 Support diffie-hellman-group14-sha1 group exchange. Tested against locally built OpenSSH 3.9, and seems to work fine. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bf3ecb420fbd21a00412d369b63dae8c Text-delta-base-sha1: 7e59e9caff98e1cfaceed1aa08a5d24452d945bf Text-content-length: 590 Text-content-md5: cfd2f8c9c35f3f0b82946b1eff1bf0cd Text-content-sha1: fc5acf1587a88f92cfe02c5a567e7edb312a0233 Content-length: 590 SVNdVpWtbx ); translatec(SSH2_MSG_KEXDH_REPLY, SSH2_PKTCTX_DHGROUP_group14, &ssh_diffiehellman_group1,'EI]`+G_STDERR_DATA, string, stringlen!ssh->kex->pdataex; ssh->kex_ctx = dh_setup_group(ssh->kex); s->kex_init_value = SSH2_MSG_KEXDH_INIT; s->kex_reply_value = SSH2_MSG_KEXDH_REPLY; logeventf(ssh, "Using Diffie-Hellman with standard group \"%s\"", ssh->kex->groupname)}ruu} CHAN_SOCKDATA: pfd_unthrottle(c->u.pfd.s); break; } } } } } crFinishV; } /* * Handler Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ccdb0720db95be18ee3225684d4dc99 Text-delta-base-sha1: 917ecc6a7c7f4ec4747263b904ebd59c951c3bd4 Text-content-length: 424 Text-content-md5: afa7562649cddea387522967b305231e Text-content-sha1: bec772f2a2691f0c25af2bffdf305389c83ec09b Content-length: 424 SVNFB(ZQVpFortunately, all our KEXes are basically * Diffie-Hellman at the moment, so in this structure I simply * parametrise the DH exchange a bit. */ char *name, *groupname; const unsigned char *pdata, *gdata;/* NULL means use group exchange */ int plen, glen_group1; extern const struct ssh_kex ssh_diffiehellman_group14(const struct ssh_kex *kex); void *dh_setup_gex Node-path: putty/sshdh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c8bd3892f585405b556a1d7cb9dfd68 Text-delta-base-sha1: 4188d9627919a3398bbcee1f200ea05750312187 Text-content-length: 1888 Text-content-md5: 335d19d2a1a103bb704f2ff75972cabd Text-content-sha1: 15375eb976b908dfddf810525ee26eab8209809d Content-length: 1888 SVNGr7q5 p X#PsT#include "ssh.h" /* * The primes used in the group1 and group14 key exchange. */ static const unsigned char P1static const unsigned char P144, 0x5B, 0x3D, 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; /* * The generator g = 2 (used for both group1 and group14). */ static const unsigned char G[] = { 2 }; const struct ssh_kex ssh_diffiehellman_group1 = { "diffie-hellman-group1-sha1", "group1", P1, G, lenof(P1), lenof(G) }; const struct ssh_kex ssh_diffiehellman_group14 = { "diffie-hellman-group14-sha1", "group14", P14, G, lenof(P14), lenof(G) }; const struct ssh_kex ssh_diffiehellman_gex = { "diffie-hellman-group-exchange-sha1", NULL, NULL, NULL, 0, 0 a standard group. */ void *dh_setup_group(const struct ssh_kex *kex) { struct dh_ctx *ctx = snew(struct dh_ctx); ctx->p = bignum_from_bytes(kex->pdata, kex->plen); ctx->g = bignum_from_bytes(kex->gdata, kex->glen); dh_init(ctx); return ctx; } /* * Initialise DH for a server-supplied group. */ void *dh_setup_gex Revision-number: 5019 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:12:52.988000Z PROPS-END Revision-number: 5020 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2004-12-22T22:45:24.472400Z K 7 svn:log V 35 putty.tanis.dk carbonstudios.co.uk K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8edb69ad5d086f533bfeaedf7ddbd98d Text-delta-base-sha1: 7061f8ded5469a6cf4d49826c466f6be11e607d1 Text-content-length: 183 Text-content-md5: 5550ab5d2c1b9f89640506afbb828cda Text-content-sha1: 63dcb6bc069936c09c658bacc69248809a7df447 Content-length: 183 SVN4"KM<S<S<3Ox5putty.tanis.dk/">putty.tanismirrors.sunsite.dk/putty/">mirrors.sunsitecofman.dk/">putty.cofmancarbonstudios.co.uk/putty/">carbonstudios Revision-number: 5021 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2004-12-22T23:17:02.508292Z K 7 svn:log V 117 Fix potential access of freed data (only if we couldn't create the second of two registry keys, so pretty unlikely). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dde3e4600ebce8199a30011b1bf2e929 Text-delta-base-sha1: 42a41568cd244d19049abd983153c1e288855012 Text-content-length: 69 Text-content-md5: e553d421e0dca3982d8a1c91b89810ff Text-content-sha1: 7e690848e4bbce44f8ad676836d62e6c6e81fdba Content-length: 69 SVN+</asfree(p); return NULL; } sfree(p); Revision-number: 5022 Prop-content-length: 671 Content-length: 671 K 8 svn:date V 27 2004-12-23T02:24:07.069566Z K 7 svn:log V 570 Add a preference list for SSH-2 key exchange algorithms, on a new "Kex" panel (which will gain more content anon). Retire BUG_SSH2_DH_GEX and add a backwards-compatibility wart, since we never did find a way of automatically detecting this alleged server bug, and in any case there was only ever one report (<3D91F3B5.7030309@inwind.it>, FWIW). Also generalise askcipher() to a new askalg() (thus touching all the front-ends). I've made some attempt to document what SSH key exchange is and why you care, but it could use some review for clarity (and outright lies). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d3ae0675023d3b2504e9329362e5c26 Text-delta-base-sha1: 5435080003c0071206e6949e3e6063bf54677097 Text-content-length: 1309 Text-content-md5: 65cc2dda8d49fe7a6c69bfe52aad507a Text-content-sha1: 3a4507b4e37cdd0987e9fc2678ccd75ff8fee487 Content-length: 1309 SVNy'hLo,]T{ eSi`kexlistif (event == EVENT_REFRESH) { int i; static const struct { char *s; int k; } kexes[] = { { "Diffie-Hellman group 1", KEX_DHGROUP1 }, { "Diffie-Hellman group 14", KEX_DHGROUP14 }, { "Diffie-Hellman group exchange", KEX_DHGEX }, { "-- warn below here --", KEX_WARN } }; /* Set up the "kex preference" box. */ /* (kexlist assumed to contain all algorithms) */ dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < KEX_MAX; i++) { int k = cfg->ssh_kexlist[i]; int j; char *kstr = NULL; for (j = 0; j < (sizeof kexes) / (sizeof kexes[0]); j++) { if (kexes[j].k == k) { kstr = kexes[j].s; break; } } dlg_listbox_addwithid(ctrl, dlg, kstr, kKEX_MAX; i++) cfg->ssh_kexKex panel. */ ctrl_settitle(b, "Connection/SSH/Kex", "Options controlling SSH key exchange"); s = ctrl_getset(b, "Connection/SSH/Kex", "main", "Key exchange algorithm options"); c = ctrl_draglist(s, "Algorithm selection policy", 's', HELPCTX(ssh_kexlist), kexlist_handler, P(NULL)); c->listbox.height = 5; #if 0 s = ctrl_getset(b, "Connection/SSH/Kex", "repeat", "Options controlling key re-exchange"); /* FIXME: at least time and data size */ #endif Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c98216cc0e4f550f26deacbab69f6b2b Text-delta-base-sha1: f5c86f6a0609f9b2e3681547c728f3aeb210f68b Text-content-length: 5406 Text-content-md5: 5056a0005d85b11b72445d29bb97f480 Text-content-sha1: fcff002d879d622d9a5ddadd9f2a17c5fc7b2ed7 Content-length: 5406 SVNJJ#kex} The Kex panel \# FIXME: This whole section is draft. Feel free to revise. The Kex panel (short for \q{key exchange}) allows you to configure options related to SSH-2 key exchange. Key exchange occurs at the start of an SSH connection (and occasionally thereafter); it establishes a shared secret that is used as the basis for all of SSH's security features. It is therefore very important for the security of the connection that the key exchange is secure. Key exchange is a cryptographically intensive process; if either the client or the server is a relatively slow machine, the slower methods may take several tens of seconds to complete. If connection startup is too slow, or the connection hangs periodically, you may want to try changing these settings. If you don't understand what any of this means, it's safe to leave these settings alone. This entire panel is only relevant to SSH protocol version 2; none of these settings affect SSH-1 at all. \S{config-ssh-kex-order} Key exchange algorithm selection \cfg{winhelp-topic}{ssh.kex.order} PuTTY supports a variety of SSH-2 key exchange methods, and allows you to choose which one you prefer to use; configuration is similar to cipher selection (see \k{config-ssh-encryption}). PuTTY currently supports the following varieties of Diffie-Hellman key exchange: \b \q{Group 14}: a well-known 2048-bit group. \b \q{Group 1}: a well-known 1024-bit group. This is less secure \#{FIXME better words} than group 14, but may be faster with slow client or server machines, and may be the only method supported by older server software. \b \q{Group exchange}: with this method, instead of using a fixed group, PuTTY requests that the server suggest a group to use for key exchange; the server can avoid groups known to be weak, and possibly invent new ones over time, without any changes required to PuTTY's configuration. We recommend use of this method, if possible. If the first algorithm PuTTY finds is below the \q{warn below here} line, you will see a warning box when you make the connection, similar to that for cipher selection (see \k{config-ssh-encryption}). \# [Repeat key exchange bumph when config is added:] If the session key negotiated at connection startup is used too much or for too long, it may become feasible to mount attacks against the SSH connection. Therefore, the SSH protocol specifies that a new key exchange should take place every so often. \# While this renegotiation is taking place, no data can pass through the SSH connection, so it may appear to \q{freeze}. (The occurrence of repeat key exchange is noted in the Event Log; see \k{using-eventlog}.) Usually the same algorithm is used as at the start of the connection, with a similar overhead. \# [When options are added to frob how often this happens, we should hardcode the values recommended by the drafts -- 1 hour, 1GB -- in this documentation, in case PuTTY's defaults are obscured by Default Settings etc. Assuming we think they're good advice, that is.](''ac2} \q{Miscomputes SSH2 HMAC keys} \cfg{winhelp-topic}{ssh.bugs.hmac2} Versions 2.3.0 and below of the SSH server software from \cw{ssh.com} compute the keys for their HMAC message authentication codes incorrectly. A typical symptom of this problem is that PuTTY dies unexpectedly at the beginning of the session, saying \q{Incorrect MAC received on packet}. If this bug is detected, PuTTY will compute its HMAC keys in the same way as the buggy server, so that communication will still be possible. If this bug is enabled when talking to a correct server, communication will fail. This is an SSH2-specific bug. \S{config-ssh-bug-derivekey2} \q{Miscomputes SSH2 encryption keys} \cfg{winhelp-topic}{ssh.bugs.derivekey2} Versions below 2.0.11 of the SSH server software from \cw{ssh.com} compute the keys for the session encryption incorrectly. This problem can cause various error messages, such as \q{Incoming packet was garbled on decryption}, or possibly even \q{Out of memory}. If this bug is detected, PuTTY will compute its encryption keys in the same way as the buggy server, so that communication will still be possible. If this bug is enabled when talking to a correct server, communication will fail. This is an SSH2-specific bug. \S{config-ssh-bug-sig} \q{Requires padding on SSH2 RSA signatures} \cfg{winhelp-topic}{ssh.bugs.rsapad2} Versions below 3.3 of OpenSSH require SSH2 RSA signatures to be padded with zero bytes to the same length as the RSA key modulus. The SSH2 draft specification says that an unpadded signature MUST be accepted, so this is a bug. A typical symptom of this problem is that PuTTY mysteriously fails RSA authentication once in every few hundred attempts, and falls back to passwords. If this bug is detected, PuTTY will pad its signatures in the way OpenSSH expects. If this bug is enabled when talking to a correct server, it is likely that no damage will be done, since correct servers usually still accept padded signatures because they're used to talking to OpenSSH. This is an SSH2-specific bug. \S{config-ssh-bug-pksessid2} \q{Misuses the session ID in PK auth} \cfg{winhelp-topic}{ssh.bugs.pksessid2} Versions below 2.3 of OpenSSH require SSH2 public-key authentication to be done slightly differently: the data to be signed by the client contains the session ID formatted in a Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e0ab7012f6b882c0c68d1d053c86795 Text-delta-base-sha1: aa4f3763d0bffb26c3fd93859ca5cf23d0c1eaf5 Text-content-length: 92 Text-content-md5: bf4f3412f94e1511d6b1152afbfa1307 Text-content-sha1: 91289291f539228f8b350c3f492034bf8bb7136c Content-length: 92 SVNhJ B1wq/* $Idalg(void *frontend, const char *algtype, const char *algname Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9c6780f04fcd7f0e97811826c1238445 Text-delta-base-sha1: 84c2ed0efd6635e9bf4ab991cc62b907fd033f77 Text-content-length: 236 Text-content-md5: cce9c6b3f64843fcda0bef8a9c6d346d Text-content-sha1: 49f38764895b45bbefc4f9b9d97ac105242d5c00 Content-length: 236 SVNGp@CpM&yiWqPw-2 key exchange algorithms */ KEX_WARN, KEX_DHGROUP1, KEX_DHGROUP14, KEX_DHGEX, KEX_MAXssh_kexlist[KEX_MAX]alg(void *frontend, const char *algtype, const char *algname Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7352d63d37f285bab1d37ca72e6b9439 Text-delta-base-sha1: 0e7068a3183e0bcabf96d59c076c10c46b2df835 Text-content-length: 913 Text-content-md5: 9173eca6c939b3c0136c44bf4388b008 Text-content-sha1: 391f901a64ac026a5963d048eee13b09b3b69242 Content-length: 913 SVN,Wt_s=9D3q,e.C /* The cipher order given here is the default order. */const struct keyval kexnames[] = { { "dh-gex-sha1", KEX_DHGEX }, { "dh-group14-sha1", KEX_DHGROUP14 }, { "dh-group1-sha1", KEX_DHGROUP1 }, { "WARN", KEX_WARNprefs(sesskey, "KEX", kexnames, KEX_MAX, cfg->ssh_kex{ /* Backward-compatibility: we used to have an option to * disable gex under the "bugs" panel after one report of * a server which offered it then choked, but we never got * a server version string or any other reports. */ char *default_kexes; gppi(sesskey, "BugDHGEx2", 0, &i); i = 2-i; if (i == FORCE_ON) default_kexes = "dh-group14-sha1,dh-group1-sha1,WARN,dh-gex-sha1"; else default_kexes = "dh-gex-sha1,dh-group14-sha1,dh-group1-sha1,WARN"; gprefs(sesskey, "KEX", default_kexes, kexnames, KEX_MAX, cfg->ssh_kexlist); } Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cfd2f8c9c35f3f0b82946b1eff1bf0cd Text-delta-base-sha1: fc5acf1587a88f92cfe02c5a567e7edb312a0233 Text-content-length: 3147 Text-content-md5: 6ea572593833fd1902f2abc486603e77 Text-content-sha1: 00f658ca31032f47b86d384d425ffd9576080781 Content-length: 3147 SVN"7C:v];kY'f/* 64 was BUG_SSH2_DH_GEX, now spare */alg(ssh->frontend, "cipher", cipher_stringG_STDERR_DATA, string, stringlen); if (!ssh->v1_stdout_throttling && bufsize > SSH1_BUFFER_LIMIT) { ssh->v1_stdout_throttling = 1; ssh1_throttle(ssh, +1); } } static void ssh1_smsg_x11_open(Ssh ssh, struct Packet *pktin) { /* Remote side is trying to open a channel to talk to our * X-Server. Give them back a local channel number. t>IfQMv$`o?x6hMw+\5rjr5Lrjkdh-BJpJ1=kex; const struct ssh_kex *preferred_kex[KEX_MAXkey exchange. (NULL => warn below here) */ s->n_preferred_kex = 0; for (i = 0; i < KEX_MAX; i++) { switch (ssh->cfg.ssh_kexlist[i]) { case KEX_DHGEX: s->preferred_kex[s->n_preferred_kex++] = &ssh_diffiehellman_gex; break; case KEX_DHGROUP14: s->preferred_kex[s->n_preferred_kex++] = &ssh_diffiehellman_group14; break; case KEX_DHGROUP1: s->preferred_kex[s->n_preferred_kex++] = &ssh_diffiehellman_group1KEX_MAX - 1) { s->preferred_kex[s->n_preferred_kex++] = NULL; } break; } } }ommalistcommalist_started = 0; for (i = 0; i < s->n_preferred_kex; i++) { const struct ssh_kex *k = s->preferred_kex[i]; if (!k) continue; /* warning flag */ if (commalist_started) ssh2_pkt_addstring_str(s->pktout, ","); ssh2_pkt_addstring_str(s->pktout, s->preferred_kex[i]->name); commalist_started = 1; } /* List server host keyommalistommalistommalistommalist /* warning flag */ for (j = 0; j < c->nciphers; j++) { if (commalistommalists->warn = 0; for (i = 0; i < s->n_preferred_kex; i++) { const struct ssh_kex *k = s->preferred_kex[i]; if (!k) { s->warn = 1; } else if (in_commasep_string(k->name, str, len)) { ssh->kex = k; } if (ssh->kex) { if (s->warn) askalg(ssh->frontend, "key-exchange algorithm", ssh->kex->name); break; } } if (!ssh->kex) { bombout(("Couldn't agree a key exchange algorithm (available: %s)", str ? str : "(null)")); crStop(0);alg(ssh->frontend, "client-to-server cipher", s->cscipher_tobe->namealg(ssh->frontend, "server-to-client cipher", s->sccipher_tobe->namerr. */ ssh2_add_channel_data(ssh->mainchan, (char *)in, inlen); s->try_send = TRUE; } if (s->try_send) { int i; struct ssh_channel *c; /* * Try to send data on all channels if we can. */ for (i = 0; NULL != (c = index234(ssh->channels, i)); i++) { int bufsize; if (c->closes) continue; /* don't send on closing channels */ bufsize = ssh2_try_send(c); if (bufsize == 0) { switch (c->type) { case CHAN_MAINSESSION: /* stdin need not receive an unthrottle * notification since it will be polled */ break; case CHAN_X11: x11_unthrottle(c->u.x11.s); break; case CHAN_AGENT: /* agent sockets are request/response and need no * buffer management */ break; case Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4321ba2f9947d03763cef316cf116381 Text-delta-base-sha1: 94703a56c0e9b69ab8d264b3edf3c887f2a531a6 Text-content-length: 259 Text-content-md5: d6e128e679b08e6074b28a446dcaa37f Text-content-sha1: 04a073aa21ec8fec2fd543f3f17b0f794a085112 Content-length: 259 SVNlM[eI.aq_n~algorithm is acceptable (since it was * below the configured 'warn' threshold). */ void askalg(void *frontend, const char *algtype, const char *algname) { static const char msg[] = "The first %salgtype, algname); Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ca3229ff49ee19c437dbc2da074a9fbd Text-delta-base-sha1: ffd78562ff46c80c35b4331db1c6575d5d199319 Text-content-length: 319 Text-content-md5: 70caca0cf9d341b9d5c8ed49b2c56056 Text-content-sha1: aac4e5647a39ba62ec715c93aee847b879048021 Content-length: 319 SVN~,UI0QR talgorithm is acceptable (since it was * below the configured 'warn' threshold). */ void askalg(void *frontend, const char *algtype, const char *algname) { static const char msg[] = "The first %s algtype, algname); cleanup_exit(1); } fprintf(stderr, msg, algtype, alg Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 01d656bf6a4e302996f304f4e279998d Text-delta-base-sha1: e3457231237c3877fb30e6d1c92c0169d2b7ea8d Text-content-length: 205 Text-content-md5: 93ee748a494deae17fe2ef17a5f8c121 Text-content-sha1: 2d90da834aa3e8e937d5f45a56089c1d90f1f6dc Content-length: 205 SVNm !qJwFX70KR58algorithm/ void askalg(void *frontend, const char *algtype, const char *algname algtype, algname); cleanup_exit(1); } fprintf(stderr, msg, algtype, alg Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bd843c9a975a6e5978decf06d3c4e89c Text-delta-base-sha1: a77b06b777c419f18458c5d7469004cfafcc01af Text-content-length: 303 Text-content-md5: 6a623be6693077450952bb2863fe1641 Text-content-sha1: b16ad07cceafd34a98795fc3377317ac4bc701e9 Content-length: 303 SVNv C]yJ8algorithm is acceptable (since it was * below the configured 'warn' threshold). */ void askalg(void *frontend, const char *algtype, const char *algname) { static const char mbtitle[] = "%s Security Alert"; static const char msg[] = "The first %salgtype, alg Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 46fd662079e4bf01ba63db220b272591 Text-delta-base-sha1: b9635e671aad14cef7a024b8254b03fb369e8eee Text-content-length: 46 Text-content-md5: ffcec004976b72716234e30d0704647d Text-content-sha1: b2d788f201ac00492fc9f28c7ab8d43d749ac844 Content-length: 46 SVNOI EO+0kexlist "ssh.kex.order Revision-number: 5023 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2004-12-23T05:54:09.326035Z K 7 svn:log V 58 Minimally document "repeat key exchange" special command. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ffeadfed542eb862c6dea0b23e4a44b8 Text-delta-base-sha1: 671d973d288834cb7fe1f79ff138bf6f17d16da0 Text-content-length: 275 Text-content-md5: 55615133fbf31a3a5ac6b772c9e8efd6 Text-content-sha1: e381c90b5f4657e0c1bb853b1e337a36c5a407d5 Content-length: 275 SVNXZ xxcuRepeat key exchange, SSH special command}Repeat key exchange \lcont{ Only available in SSH-2. Forces a repeat key exchange immediately (and resets associated timers and counters). \#{For more information about repeat key exchanges, see \k{FIXME}.} Revision-number: 5024 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2004-12-23T13:28:50.952921Z K 7 svn:log V 18 Link to gnupg.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/keys.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4db142a29f2d61e88fb03d34c176b3d0 Text-delta-base-sha1: 0d2dc238b4863ae6f833d51312f29287b014be45 Text-content-length: 302 Text-content-md5: 8f168788214ec417cab1de3fa0056765 Text-content-sha1: 14c4bdb54b185528d7dad0b5738a1a4d466e7808 Content-length: 302 SVN< >h0 GnuPG signatures for all the PuTTY files distributed from this web site, so that users can be confident that the files have not been tampered with. On this page we provide our public keys, and explain our signature policy so you can have an Revision-number: 5025 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2004-12-23T13:30:57.736057Z K 7 svn:log V 69 Mention the download.com trojan, since no-one's objected to my text. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 246c68900a9ec9bd31795d340b5606da Text-delta-base-sha1: 1e6848ccfdb104033714aa91afb5325fc7d46191 Text-content-length: 589 Text-content-md5: 6f7b4d02802f387d69cb829539fb24a5 Text-content-sha1: 93ae1464f11fdd0788219a85c52c762038f099c0 Content-length: 589 SVN[ 55%r2-23 Trojan PuTTY installer circulating

    Vulnerability details: If a string length that would read off the end of the SFTP packet was supplied, sftp.c:sftp_pkt_getstring() would not return a pointer to the string, but would return the server-supplied string length. fxp_open_recv() would then call mkstr() with that length; with a carefully crafted length field, mkstr() would malloc(0) due to an integer overflow, and then memcpy() data from *NULL to that location, leading to a heap corruption. (The data copied to the heap is not trivially server-controlled, but it can't be ruled out on all platforms.) Node-path: putty-wishlist/data/x11-local-display-broken Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 93acc7f5a5b06b34a537198c26d19ae5 Text-delta-base-sha1: ddf9f0bf05cd28110873ebb2e02e0a277f0fd4df Text-content-length: 26 Text-content-md5: 87214b36bbe84334eabfdab9abbe538c Text-content-sha1: 69c31c8aadc7f6bd4fa5fd50f7f0547f8b85e09b Content-length: 26 SVNlq $H$ 0.57 Revision-number: 5366 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2005-02-20T16:08:50.197274Z K 7 svn:log V 96 Add a front-page news item for 0.57, and links to the wishlist from both that and changes.html. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c11bec0186612059f9406d368c1a599 Text-delta-base-sha1: 61197c21aa54b50ee9ed633458fa927d02c24de2 Text-content-length: 453 Text-content-md5: 03bfa125b20ba0ea7661313959820246 Text-content-sha1: e468210061eae80eb4bb29ae103d3c9aa04c227c Content-length: 453 SVNcR **#@es: two vulnerabilities discovered by iDEFENSE, potentially allowing arbitrary code execution on an SFTP client by a malicious SFTP server (but only after host key verification), have been fixed. See vuln-sftp-readdir, vuln-sftp-string Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c1c7f88a9624b3c51b26b80bbaaa19a Text-delta-base-sha1: 3363f438f53e8ac41cd5c5783c38999050b840b9 Text-content-length: 500 Text-content-md5: e93bf88dbc876772a80b02e1f09994fb Text-content-sha1: e8f5e15b6c7db4a7cc64928c9621b872a4d3f6ff Content-length: 500 SVN[C \~\ir5-02-20 SECURITY HOLE, fixed in PuTTY 0.57

    PuTTY 0.57, released today, fixes two security holes which can allow a malicious SFTP server to execute code of its choice on a PSCP or PSFTP client connecting to it. We recommend everybody upgrade to 0.57 as soon as possible. Revision-number: 5367 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2005-02-20T16:14:26.555271Z K 7 svn:log V 128 Fiddly things involving pruning .svn directories, not mentioning CVS, line endings etc. which I had to fix just before release. K 10 svn:author V 5 simon PROPS-END Node-path: putty-0.57/README.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c1519ebfb2ee75babf68c276c1721c9 Text-delta-base-sha1: 34b24901845d04fb6bb405fe171f2f1de59ae82f Text-content-length: 1266 Text-content-md5: 92768ec65f0365f73833c8035c10abaa Text-content-sha1: 69d6f41ca15b049c9f71690f540bff226b8f4396 Content-length: 1266 SVNcccPuTTY README ============ This is the README file for the PuTTY installer distribution. If you're reading this, you've probably just run our installer and installed PuTTY on your system. What should I do next? ---------------------- If you want to use PuTTY to connect to other computers, or use PSFTP to transfer files, you should just be able to run them from the Start menu. If you want to use the command-line-only file transfer utility PSCP, you will probably want to put the PuTTY installation directory on your PATH. How you do this depends on your version of Windows. On Windows NT and 2000, you can set it using Control Panel > System; on Windows 95 you will need to edit AUTOEXEC.BAT. Consult your Windows manuals for details. What do I do if it doesn't work? -------------------------------- The PuTTY home web site is http://www.chiark.greenend.org.uk/~sgtatham/putty/ Here you will find our list of known bugs and pending feature requests. If your problem is not listed in there, or in the FAQ, or in the manuals, read the Feedback page to find out how to report bugs to us. PLEASE read the Feedback page carefully: it is there to save you time as well as us. Do not send us one-line bug reports telling us `it doesn't work'. Node-path: putty-0.57/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 76a8ae84d193c75b22bbf76b34a09181 Text-delta-base-sha1: 248766fd3678cb5ff1bc9eb2d6fde56b432581be Text-content-length: 119 Text-content-md5: f062afa596ae34f5d120b3634d9eb01c Text-content-sha1: d78e3784011d0fce20d27acfd6a48f604aaf4e3f Content-length: 119 SVN]U ]%=OS \versionid $Idwww.tartarus.org/~simon-anonsvn/viewcvs.cgi/putty/contrib/kh2reg.py?view=markup Node-path: putty-0.57/mksrcarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7b4d2beb2bb90854b9a690c4a61928d0 Text-delta-base-sha1: d8cad84d5ba707210b1bfa2913fdb6dfbbd0072b Text-content-length: 22 Text-content-md5: c980d85301ef773d4b31b09d8d7577f9 Text-content-sha1: 9cd7679089db1d5c08585997b8ae5fc1c48852ed Content-length: 22 SVNvUD2svn Node-path: putty-0.57/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3dcf3c4e9645c5f562f4ed2b9144ad0c Text-delta-base-sha1: 3eb51720da8cf184e35af0b677f5f7af6fbb1473 Text-content-length: 33 Text-content-md5: bd10f4d6d759ba7c03aab6f488bac6ac Text-content-sha1: 2e8615998640da4abf91334b18ba243a58697bbd Content-length: 33 SVN6i`NqEsvnsvn Node-path: putty-branch-0.56/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 76a8ae84d193c75b22bbf76b34a09181 Text-delta-base-sha1: 248766fd3678cb5ff1bc9eb2d6fde56b432581be Text-content-length: 119 Text-content-md5: f062afa596ae34f5d120b3634d9eb01c Text-content-sha1: d78e3784011d0fce20d27acfd6a48f604aaf4e3f Content-length: 119 SVN]U ]%=OS \versionid $Idwww.tartarus.org/~simon-anonsvn/viewcvs.cgi/putty/contrib/kh2reg.py?view=markup Node-path: putty-branch-0.56/mksrcarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7b4d2beb2bb90854b9a690c4a61928d0 Text-delta-base-sha1: d8cad84d5ba707210b1bfa2913fdb6dfbbd0072b Text-content-length: 22 Text-content-md5: c980d85301ef773d4b31b09d8d7577f9 Text-content-sha1: 9cd7679089db1d5c08585997b8ae5fc1c48852ed Content-length: 22 SVNvUD2svn Node-path: putty-branch-0.56/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3dcf3c4e9645c5f562f4ed2b9144ad0c Text-delta-base-sha1: 3eb51720da8cf184e35af0b677f5f7af6fbb1473 Text-content-length: 33 Text-content-md5: bd10f4d6d759ba7c03aab6f488bac6ac Text-content-sha1: 2e8615998640da4abf91334b18ba243a58697bbd Content-length: 33 SVN6i`NqEsvnsvn Revision-number: 5368 Prop-content-length: 176 Content-length: 176 K 7 svn:log V 76 Nits: s/are/were/; only promise development features in next "full" release K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-20T16:36:13.478061Z PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 03bfa125b20ba0ea7661313959820246 Text-delta-base-sha1: e468210061eae80eb4bb29ae103d3c9aa04c227c Text-content-length: 46 Text-content-md5: 9545530648445b63c7cf058eea4e76c2 Text-content-sha1: b30b623fb22d0dc5d335334b6136ee6c5068fa78 Content-length: 46 SVNR] ,As_fullfullwe Revision-number: 5369 Prop-content-length: 211 Content-length: 211 K 7 svn:log V 110 Another failure to crStop(0) on user abort, this time for SSH-1 cipher askalg(). That should be the last one. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-20T21:00:16.484355Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bbea810876434fc64fe045ed0a6f459e Text-delta-base-sha1: b0388504884114a095d63c0ec8aee0c6d643a1da Text-content-length: 93 Text-content-md5: 07aec841a2e1aee99e061ad217842e70 Text-content-sha1: 91c3d5802b34bf9ac87342845b34d4c4e5326c18 Content-length: 93 SVN c crStop( s0); } * gdata_len -= Revision-number: 5370 Prop-content-length: 1018 Content-length: 1018 K 7 svn:log V 917 On Windows, MessageBoxIndirect() was sometimes failing to pop up the host key dialog and returning an unexpected value (0), causing everything to silently behave as if the user had said "allow this connection but don't store host key"! Initialising (MSGBOXPARAMS).hInstance seems to have cured this (although the MSDN docs seemed to indicate it wouldn't be used) -- if so, it's been broken since r5309 on 2004-02-15 -- but since this was something of a Heisenbug, and the behaviour was so catastrophic when MessageBoxIndirect() behaved oddly, I've rearranged the code to default to cancelling, and added an assertion for visibility. (Windows PuTTY still seems to be broken wrt servers that send NEWKEYS while we're waiting for the user, which happens to include the "SSH-2.0-2.4.1 SSH Secure Shell OpenVMS V1.0" I'm testing against. I don't know why. The above bug may also have been limited to this circumstance.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-20T23:00:17.170763Z PROPS-END Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b0936260b7ab2f075c2256d6ddc7cf70 Text-delta-base-sha1: 33023f91f1a847315884f56066515c0cc3702ff8 Text-content-length: 246 Text-content-md5: 1548ffe1e4ffd04196204a5069c8dd5c Text-content-sha1: 22e88a3680ce62c7c64a729558830ee515963243 Content-length: 246 SVNrx(@-|!o[jInstance = hinstassert(mbret==IDYES || mbret==IDNO || mbret==IDCANCELNO) return 1; return 0assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCELNO) return 1; return 0 Revision-number: 5371 Prop-content-length: 279 Content-length: 279 K 8 svn:date V 27 2005-02-20T23:26:47.952227Z K 7 svn:log V 178 Change "are you sure you want to close this window" default back to what it was ("yes"). Partly because it was inconsistent with gtkdlg.c, and partly because it was annoying me. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fd109e76232d05c179826e0e92451cef Text-delta-base-sha1: ee7ea222b2512b686b2a80e156cbf69f5821d333 Text-content-length: 43 Text-content-md5: caebc3127c977b26651d7008b76d6c25 Text-content-sha1: 84b2e6470a76653081f493fbbe165ca3d327b158 Content-length: 43 SVN G8H1||| Revision-number: 5372 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2005-02-21T12:23:49.542459Z K 7 svn:log V 30 Mention vulnerable snapshots. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-sftp-readdir Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 92e62ca0281c3a62a749394ee2b99803 Text-delta-base-sha1: 4172c88e31bed8dec6e30a5ff559c4e80e18506e Text-content-length: 58 Text-content-md5: 7173fe834494a2b4cea26479a0a49dc7 Text-content-sha1: f57c6a9d4732a557a743f2f01ca739747efbf353 Content-length: 58 SVN?U %* 2005-02-20 Fixed-in: 0.57 2005-02-21 Node-path: putty-wishlist/data/vuln-sftp-string Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2162204cddf60243183d79526003a0e6 Text-delta-base-sha1: 28a25116697a7d311e7985339ed48099713aaa2f Text-content-length: 58 Text-content-md5: bc1ddd5fb6b72aff706c35afd94d81b8 Text-content-sha1: 40871271e0b0e634353679427f436a102e3b90d8 Content-length: 58 SVN$: % 2005-02-20 Fixed-in: 0.57 2005-02-21 Revision-number: 5373 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2005-02-21T12:33:25.324898Z K 7 svn:log V 31 Fix HTML glitch (thanks Kroz). K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/vuln-sftp-readdir Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7173fe834494a2b4cea26479a0a49dc7 Text-delta-base-sha1: f57c6a9d4732a557a743f2f01ca739747efbf353 Text-content-length: 22 Text-content-md5: 408625aed11c06fa0b3108de263899f6 Text-content-sha1: 01ee8c0a067ca695f4086774437fdb4debd0ba2f Content-length: 22 SVNUV 5 5/ Revision-number: 5374 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 25 mirror.mons-new-media.de K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-21T15:20:01.199228Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 52fe15276aad0d6da65e5d5c19034cb5 Text-delta-base-sha1: 25018ecbf4c667e8ed3499aed486ca2462dbe9c6 Text-content-length: 81 Text-content-md5: 83b8d159f56d517acaa5a050d78604e5 Text-content-sha1: 153f14b45c23881d2247a575f21e30015f050f81 Content-length: 81 SVN3660M50mirror.mons-new-media.de/putty/">mirror.mons-new-media Revision-number: 5375 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2005-02-21T18:13:51.194840Z K 7 svn:log V 77 Make sure that auth->xdmseen is initialised (to NULL) even if it's not used. K 10 svn:author V 3 ben PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 61fc098f60414f846de2a790e60e9ca5 Text-delta-base-sha1: 1b497c2285b6b2973e692380edf841e7ab1b557d Text-content-length: 42 Text-content-md5: df5776e069afd9dcaa2564d5deccaf26 Text-content-sha1: 9a41bb8bee75f775d6e5adc8507329b8fe486a6b Content-length: 42 SVNMd ^q\ auth->xdmseen = NULL Revision-number: 5376 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 17 putty.deb1an.net K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-21T18:53:18.966886Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 83b8d159f56d517acaa5a050d78604e5 Text-delta-base-sha1: 153f14b45c23881d2247a575f21e30015f050f81 Text-content-length: 52 Text-content-md5: 27ce91c99f5b14c95cf18bf708e42d7a Text-content-sha1: 9e8c150b5d9425093a3c2658055216a2e2226b4b Content-length: 52 SVN6$cOxY]deb1an.net/">putty.deb1an Revision-number: 5377 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2005-02-21T21:02:35.460083Z K 7 svn:log V 41 Advisory released, and other references. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-sftp-readdir Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 408625aed11c06fa0b3108de263899f6 Text-delta-base-sha1: 01ee8c0a067ca695f4086774437fdb4debd0ba2f Text-content-length: 486 Text-content-md5: 957e95062aca51ef642b516bc7761cd7 Text-content-sha1: 76d4d5b5d524352ea2fcf716a7f11fe54b6e4b00 Content-length: 486 SVNV_I# .ISis documented in iDEFENSE's advisory 02.21.05. It is also mentioned in an advisory by Secunia, numbered SA14333, and has been assigned OSVDB ID 14002 Node-path: putty-wishlist/data/vuln-sftp-string Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc1ddd5fb6b72aff706c35afd94d81b8 Text-delta-base-sha1: 40871271e0b0e634353679427f436a102e3b90d8 Text-content-length: 486 Text-content-md5: 17fb5f505afdb15af28cd13767692390 Text-content-sha1: 0c95fd0778fa5ba1ed3d711c8177fe1501ac7332 Content-length: 486 SVN:CI9 DI!is documented in iDEFENSE's advisory 02.21.05. It is also mentioned in an advisory by Secunia, numbered SA14333, and has been assigned OSVDB ID 14003 Revision-number: 5378 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2005-02-21T23:14:11.020548Z K 7 svn:log V 64 Remove some mirrors with up-to-date web pages but old binaries. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 27ce91c99f5b14c95cf18bf708e42d7a Text-delta-base-sha1: 9e8c150b5d9425093a3c2658055216a2e2226b4b Text-content-length: 191 Text-content-md5: f283dc131e4050ba13b27ab48ab18173 Text-content-sha1: 49aa34c0a50f722419cd7d41e70522f2975ddf56 Content-length: 191 SVN$v-'NJ:RseCf;hM?kgt.org/">putty.kgtputty.huewenet.de/">putty.huewenet.deMirrors.OmniComp.Org/PuTTY/">mirrors.omnicomp.orgputtyssh.org/">puttyssh.org Revision-number: 5379 Prop-content-length: 191 Content-length: 191 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-21T23:34:41.074649Z K 7 svn:log V 91 Ahem. Fix my hostkey dialog fix so that storing the host key doesn't close the connection. PROPS-END Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1548ffe1e4ffd04196204a5069c8dd5c Text-delta-base-sha1: 22e88a3680ce62c7c64a729558830ee515963243 Text-content-length: 102 Text-content-md5: f83ae1980eaa058bc2cda5c32a8e40c2 Text-content-sha1: 4f408b605f168eee8cbc249a45864a311cef2be0 Content-length: 102 SVNx LFL~z { store_host_key(host, port, keytype, keystr); return 1; } else Revision-number: 5380 Prop-content-length: 240 Content-length: 240 K 8 svn:date V 27 2005-02-21T23:43:49.776212Z K 7 svn:log V 139 Rearrange verify_ssh_host_key() for robustness in the face of strangeness, in the same manner as windows/windlg.c (but tested this time :) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fdcebc8fa802e05b2f498c64fd6492cc Text-delta-base-sha1: 1b01b93f0465dd68534205b1f3b7e349bdc23ba0 Text-content-length: 264 Text-content-md5: 25da37c3114f5c87b6834f19871153b2 Text-content-sha1: a0c8404ad9de81b628104efc740a97bf0bf69ba5 Content-length: 264 SVN~ulln2) { store_host_key(host, port, keytype, keystr); return 1; /* continue with connection */ } else if (ret == 1) return 1; /* continue with connection */ return 0; /* do not continue with connection */ Revision-number: 5381 Prop-content-length: 107 Content-length: 107 K 8 svn:date V 27 2005-02-22T14:58:04.916330Z K 7 svn:log V 8 CVE ID. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-sftp-readdir Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 957e95062aca51ef642b516bc7761cd7 Text-delta-base-sha1: 76d4d5b5d524352ea2fcf716a7f11fe54b6e4b00 Text-content-length: 263 Text-content-md5: adff0bf993034a10882d0c47de78fa62 Text-content-sha1: cee2dd7be63368936dedeb1c26428c9937342cf0 Content-length: 263 SVN_$d@IFs_m TAlong with `vuln-sftp-string', it is , mentioned in Secunia's advisory SA14333, and has been assigned. It has also been individually assigned Node-path: putty-wishlist/data/vuln-sftp-string Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 17fb5f505afdb15af28cd13767692390 Text-delta-base-sha1: 0c95fd0778fa5ba1ed3d711c8177fe1501ac7332 Text-content-length: 356 Text-content-md5: 2d4d23f9adcaaada24c255e3cfaa986e Text-content-sha1: d7af51f5fcf53ec5f4d449bb1b0c482ca4e221cf Content-length: 356 SVNC EVK\zYjAlong with `vuln-sftp-readdir', it is , mentioned in Secunia's advisory SA14333, and has been assigned CVE ID CAN-2005-0467. It has also been individually assigned Revision-number: 5382 Prop-content-length: 136 Content-length: 136 K 7 svn:log V 36 mirror.drem.org.uk + reinstatements K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-22T23:14:47.332768Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f283dc131e4050ba13b27ab48ab18173 Text-delta-base-sha1: 49aa34c0a50f722419cd7d41e70522f2975ddf56 Text-content-length: 251 Text-content-md5: 4a038e37560deb88a9127123efe4ed7c Text-content-sha1: a12f11faea96875cd2359b67a20ae50c87aa5240 Content-length: 251 SVNvg'FT~J>wA?A?B4miscellaneousmirror.org/">putty.miscellaneousputty.huewenet.de/">putty.huewenet.demirror.drem.org.uk/putty/">mirror.drem.org.uk in the UKwww.sourcekeg.co.uk/putty/">sourcekeg.co.uk in the UK Revision-number: 5383 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2005-02-22T23:19:24.671789Z K 7 svn:log V 99 Tweak the Windows source archives to be the same way round as everything else. Tweak descriptions. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6176587262eea6f391e5f904edb5d831 Text-delta-base-sha1: 99d4a75ea1381a733f9a994059fd6adb01e1021d Text-content-length: 287 Text-content-md5: e2516b65a567f9bae042f01c7e227eca Text-content-sha1: 36233ac00ac1fc6da9a823a8c728b2d8870f2f7d Content-length: 287 SVN8(6[tWkx[COznC

  • Development source code for Windows
    Source zipputty-src.zip">putty-src.zip for the above file
    MD5sums Revision-number: 5384 Prop-content-length: 272 Content-length: 272 K 8 svn:date V 27 2005-02-22T23:30:09.740898Z K 7 svn:log V 171 Remove the two logevent calls passing NULL as the first argument. This was copied straight from winnet.c and I don't believe it's _ever_ been valid in the Unix front end. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b19198d1b98839561b36dcca1c73b369 Text-delta-base-sha1: cb8659ed82d2876d35a9683ea3e7e6e500758c15 Text-content-length: 184 Text-content-md5: 92e61ea34935321a5c1041dc2556acd8 Text-content-sha1: 2a464bb300f6e86037fabecd80fbad74804980e7 Content-length: 184 SVNjU9 =oY{ /* * We return plug_closing(s->plug, ret == 0 ? "Internal networking trouble" : strerror(errno), errno, 0 Revision-number: 5385 Prop-content-length: 155 Content-length: 155 K 7 svn:log V 56 A first attempt at listening sockets in Open Transport. K 10 svn:author V 4 owen K 8 svn:date V 27 2005-02-22T23:40:47.657839Z PROPS-END Node-path: putty/mac/mac.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fd6d65f9bb58f7959bb8ee33dfa0aa86 Text-delta-base-sha1: 0c0b67b1fa07f2528dcde4b934287478b4fd0119 Text-content-length: 25 Text-content-md5: 7e749e25fa38f9104399db3745989681 Text-content-sha1: d9d152115f8b999006706e6217ea6e84d629632b Content-length: 25 SVNB=DJ Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 33d9e8dac99c1c057c73f3126e2867b5 Text-delta-base-sha1: bd87ce68fc9c6ef8186be2082fd7a3b6b4147e24 Text-content-length: 40 Text-content-md5: c7365de6a99817e268df2c7bd52d02a2 Text-content-sha1: 64d7b73b4a7ee5687f27b68a90750d1cf056e34b Content-length: 40 SVN/DY+T2}, address_fami Node-path: putty/mac/macstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1f77f20fbbd8c09c9b20c95307afaaa5 Text-delta-base-sha1: 43e018a98816f251138eff0bd22873eb5e7667a0 Text-content-length: 57 Text-content-md5: 2ff9b8ed18aa24ef73ca31ef2ed57588 Text-content-sha1: 6a99fadc10e1174d17d650c1648af4738a422375 Content-length: 57 SVN9<ZorUdnew(struct enum_settings_state Node-path: putty/mac/mtcpnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c03bdcff129501fe4805591e4067e5a5 Text-delta-base-sha1: 76069f428705afa2c947ec975de03bd0a6820aed Text-content-length: 41 Text-content-md5: cc256163e09b394ae8aeadd1fa1b1073 Text-content-sha1: 1ec3e785125ab4a389b98fd39d6dc9aad420bad0 Content-length: 41 SVNH\ 1/, int address_fami Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30728376d38e36b9708f2edca9e73330 Text-delta-base-sha1: 4d7838250609781fc03c94a99bdd8be3231fd0d4 Text-content-length: 1794 Text-content-md5: 03b30ddd9f6954beb05104e6a3b4065c Text-content-sha1: bc552c481602bc767a75701622e7c02018688430 Content-length: 1794 SVN>8LMiQc,T;KwVanteZ,`t=Tstatic void ot_listenacceptsrcaddr, int port, Plug plug, int local_host_only, int address_family Actual_Socket ret; EndpointRef ep; OSStatus err; InetAddress addr; TBind tbindlocal_host_only; ret->pending_error = 0; ret->oobinline = 0; ret->oobpending = FALSE; ret->listener = 1; /* Open Endpoint, configure it for TCP over anything, and load the * tilisten module to serialize multiple simultaneous * connections. */ ep = OTOpenEndpoint(OTCreateConfiguration("tilisten,set SO_REUSEADDR */ OTInitInetAddress(&addr, port, kOTAnyInetAddress); /* XXX: pay attention to local_host_only */ tbind.addr.buf = (UInt8 *) &addr; tbind.addr.len = sizeof(addr); tbind.qlen = 10; err = OTBind(ep, &tbind, NULL); /* XXX: check qlen we got */ if (err) { ret->error = err; return (Socket) ret; } if (ret->next != NULL) ret->next->prev = &ret->next; ot.socklist = ret; return (Socket) ret case T_LISTEN: /* Connection attempt */ ot_listenacceptvoid ot_listenaccept(Actual_Socket s) { OTResult o; OSStatus err; InetAddress remoteaddr; TCall tcall; EndpointRef ep; tcall.addr.maxlen = sizeof(InetAddress); tcall.addr.buf = (unsigned char *)&remoteaddr; tcall.opt.maxlen = 0; tcall.opt.buf = NULL; tcall.udata.maxlen = 0; tcall.udata.buf = NULL; o = OTListen(s->ep, &tcall); if (o != kOTNoError) return; /* We've found an incoming connection, accept it */ ep = OTOpenEndpoint(OTCreateConfiguration("tcp"), 0, NULL, &err); o = OTAccept(s->ep, ep, &tcall); if (plug_accepting(s->plug, ep)) { OTUnbind(ep); OTCloseProvider(ep); } } Revision-number: 5386 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2005-02-23T09:25:39.959061Z K 7 svn:log V 91 Fallout from my change in the semantics of cfg.remote_cmd_ptr. Spotted by Alano na Alania. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a192d2991c2c915a56d1a9635650e81f Text-delta-base-sha1: be2c580cdbca4ebe9307b90505c087f02d46cc97 Text-content-length: 66 Text-content-md5: 8db27334e580484d101d280d72d8bca9 Text-content-sha1: dd7ce580bebe4913de1e007abf6947db3135ae5f Content-length: 66 SVNM&3z]@cfg.remote_cmd_ptr && !*cfg.remote_cmd Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: acda038d1364d72ff741e2dfc368ccca Text-delta-base-sha1: dd63af961fb9241a0991c0ce47a54027bfb88e89 Text-content-length: 66 Text-content-md5: f18fb5179b977d5ddbe6d0d9c2868c75 Text-content-sha1: 006df649bf92214105c1aab332e16d8e25e58671 Content-length: 66 SVN6&', =Icfg.remote_cmd_ptr && !*cfg.remote_cmd Revision-number: 5387 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2005-02-23T11:56:47.494848Z K 7 svn:log V 44 Fix lks to putty-snapshot.tar.gz signatures K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e2516b65a567f9bae042f01c7e227eca Text-delta-base-sha1: 36233ac00ac1fc6da9a823a8c728b2d8870f2f7d Text-content-length: 90 Text-content-md5: f38b1d40a1e7810b576a915c1fd39a79 Text-content-sha1: e87478dddd2072b7386535cb6547e35cea4f2e41 Content-length: 90 SVN(&<K<www.tartarus.org/~simon/putty-unix/putty-snapshot.tar.gzunix Revision-number: 5388 Prop-content-length: 254 Content-length: 254 K 8 svn:date V 27 2005-02-23T21:19:53.993465Z K 7 svn:log V 154 Support for setting some options like keepalive, oobinline, nodelay, and SO_REUSEADDR for ot_newlistener(). Also handle remote-initiated disconnections. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/otnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 03b30ddd9f6954beb05104e6a3b4065c Text-delta-base-sha1: bc552c481602bc767a75701622e7c02018688430 Text-content-length: 1379 Text-content-md5: e3b369855dbce47150c7226f3ac1ded2 Text-content-sha1: d404c7b16766ee491ffa1af7296aba60cb373a46 Content-length: 1379 SVN3$93ZU`blK#2x^)=Zint nodelay, keepalive; int privport, portstatic void ot_setoption(EndpointRef, OTXTILevel, OTXTIName, UInt32); void ot_poll(void); nodelay = nodelay; ret->keepalive = keepalivif (ret->oobinline) ot_setoption(ep, INET_TCP, TCP_OOBINLINE, T_YES); if (ret->nodelay) ot_setoption(ep, INET_TCP, TCP_NODELAY, T_YES); if (ret->keepalive) { ot_setoption(ep, INET_TCP, TCP_KEEPALIVE, T_YES); }ot_setoption(ep, INET_IP, IP_REUSEADDR, T_YES); case T_ORDREL: /* Orderly disconnect */ plug_closing(s->plug, NULL, 0, 0); break; case T_DISCONNECT: /* Abortive disconnect*/ plug_closing(s->plug, NULL, 0, 0 static void ot_setoption(EndpointRef ep, OTXTILevel level, OTXTIName name, UInt32 value) { TOption option; TOptMgmt request; TOptMgmt result; if (name == TCP_KEEPALIVE) { option.len = sizeof(struct t_kpalive); option.value[1] = T_UNSPEC; } else option.len = kOTFourByteOptionSize; option.level = level; option.name = name; option.status = 0; option.value[0] = value; request.opt.buf = (unsigned char *) &option; request.opt.len = sizeof(option); request.flags = T_NEGOTIATE; result.opt.buf = (unsigned char *) &option; result.opt.maxlen = sizeof(option); OTOptionManagement(ep, &request, &result); } Revision-number: 5389 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2005-02-24T01:51:31.219531Z K 7 svn:log V 23 today's reinstatements K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a038e37560deb88a9127123efe4ed7c Text-delta-base-sha1: a12f11faea96875cd2359b67a20ae50c87aa5240 Text-content-length: 91 Text-content-md5: 5f63a42d5adc77f80ec92697282c37c7 Text-content-sha1: 13763e568e1081a6c49f20a7fdc22cf66c6c7bef Content-length: 91 SVNg>6'T:'M{'@mirrorplus.org/">putty.mirrorplusdiis.net/putty/">diis Revision-number: 5390 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:30.221999Z PROPS-END Revision-number: 5391 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:30.231738Z PROPS-END Revision-number: 5392 Prop-content-length: 155 Content-length: 155 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-24T20:28:10.292449Z K 7 svn:log V 55 Some copyright dates that were missed in the Mac port. PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 82c081094250f2eaff1b5af4e6345aaa Text-delta-base-sha1: 509ee4be5ab31f730b4cbaadab0027f7cba2b378 Text-content-length: 62 Text-content-md5: 2a485870cf9cc666e7c311087a81f62d Text-content-sha1: c9cf6b9e8a14abaeb0a23a1d0d7a0784d281b0f1 Content-length: 62 SVN>Q?usrkSmac/macpgen.runix/gtkdlg. Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 27a6af535a6fcb1fc07284a5bcfb7773 Text-delta-base-sha1: c0adfb7bbe1d6742a81aef248e7dc1ed2c87550b Text-content-length: 29 Text-content-md5: af7e36a9d8417bc342d1ae08494a2a3d Text-content-sha1: ab0b60db34156200cbcb542020d4082a9aeba315 Content-length: 29 SVN),   2005 Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5189c5fd5f554f7337d162ed7bf977a Text-delta-base-sha1: 9cd9638feb71b9576bae295c4f4703dd8564af60 Text-content-length: 41 Text-content-md5: d045ed0c2cb1a9746e4d4a5ce94fd161 Text-content-sha1: 73d435d247089e4cdad721e5f13b9799aefe286f Content-length: 41 SVNpF 54[j*F/* $Id20055 Revision-number: 5393 Prop-content-length: 172 Content-length: 172 K 7 svn:log V 72 Add RT_MANIFEST arguments to dependencies for Windows resource objects. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-24T22:45:50.473221Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da10811bc4966dda339cc302bcd77274 Text-delta-base-sha1: 5d61568ba5e8847942d562c2d426eca0bb4583dd Text-content-length: 270 Text-content-md5: 5e129a3ebd45adefab4d3252efe1dd0d Text-content-sha1: 434efc2adb820252adc067a755d419ab5ba86976 Content-length: 270 SVNVlwkQn%: # - a line # ending `ICON "filename"'; # - a line ending `RT_MANIFEST "filename"'. # Files included by this method are not added to @scanlist because #(RT_MANIFEST|ICON)\s+\"([^\"]+)\"\s*$/ and do { push @{$further{$file}}, $2 Revision-number: 5394 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2005-02-25T09:59:24.852364Z K 7 svn:log V 68 Per Gunnar Floe spotted a reversed test in sftp_cleanup_requests(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b4b73b9d9ca485410db32436d86f56a8 Text-delta-base-sha1: 1bca5ba01aac0ecae773679ea9507456104ed29b Text-content-length: 25 Text-content-md5: 254ba3394d66223067f1dcf1ab57dec1 Text-content-sha1: e1fb09c36a85951077091411bdeaec110b652b31 Content-length: 25 SVNMM /! Revision-number: 5395 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 putty.mirror.nextit.nl is serving up old binaries too. Removed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-25T13:58:42.094912Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f63a42d5adc77f80ec92697282c37c7 Text-delta-base-sha1: 13763e568e1081a6c49f20a7fdc22cf66c6c7bef Text-content-length: 22 Text-content-md5: 79d07377a1ff3242fc7d2c2e82a9aa43 Text-content-sha1: a42f0de1db7e992fcddbe2ce2bfbeee1ba495514 Content-length: 22 SVN>= SjT Revision-number: 5396 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2005-02-25T14:11:44.940009Z K 7 svn:log V 27 putty.servicez.org is back K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 79d07377a1ff3242fc7d2c2e82a9aa43 Text-delta-base-sha1: a42f0de1db7e992fcddbe2ce2bfbeee1ba495514 Text-content-length: 60 Text-content-md5: 765b521ac92b54d34d853f9d5296f60c Text-content-sha1: bc8c6e7234946d3f2c5ca7e8c61ee3d0566976c6 Content-length: 60 SVN=6!hX{Uhservicez.org/">putty.servicez.org Revision-number: 5397 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2005-02-25T21:26:30.134976Z K 7 svn:log V 80 Makefile.lcc mentions version.o instead of .obj (not that it matters, probably) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5250a789bb09df80d863c904fecb8f69 Text-delta-base-sha1: 4a328674ddadc304561225b7cbece28b72291900 Text-content-length: 23 Text-content-md5: f90e37e81ad1c510b4727fbf658ae3a6 Text-content-sha1: 7b6de34cc6f994d3de9125ccbb50dca4bec4db6b Content-length: 23 SVN IOIbj Revision-number: 5398 Prop-content-length: 311 Content-length: 311 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-26T00:41:36.463832Z K 7 svn:log V 210 We weren't correctly discounting "." and ".." when they came from FindFirstFile(), with hilarious consequences for recursive transfers in PSFTP. (PSCP appears to behave fine; it does its own "."/".." removal.) PROPS-END Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e3f38e1371e598394a61144da503b4e Text-delta-base-sha1: 091bc0aa3c0c9b95327030c157ad0a120be9aacb Text-content-length: 445 Text-content-md5: 6f6103fba2e4f41b808850b528e5f8aa Text-content-sha1: c5164e4636c5013bf84c578e9cdbe6746a24f1c2 Content-length: 445 SVNNZpgSXvdo { if (!dir->name) { WIN32_FIND_DATA fdat; int ok = FindNextFile(dir->h, &fdat); if (!ok) return NULL; else dir->name = dupstr(fdat.cFileName); } assert(dir->name); if (dir->name[0] == '.' && (dir->name[1] == '\0' || (dir->name[1] == '.' && dir->name[2] == '\0'))) { sfree(dir->name); dir->name = NULL; } } while (!dir->name);close_directory(DirHandle Revision-number: 5399 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:30.618336Z PROPS-END Revision-number: 5400 Prop-content-length: 292 Content-length: 292 K 7 svn:log V 191 Sort out close-on-exit, connection_fatal(), fatalbox(), and [SessionWindow dealloc] (which was required in order to avoid segfaulting when a redraw timer fired for a closed session window!). K 10 svn:author V 5 simon K 8 svn:date V 27 2005-02-26T13:37:07.202288Z PROPS-END Node-path: putty/macosx/README.OSX Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5bf3cf779a48de1b3c33ca7187706ed7 Text-delta-base-sha1: 62c961dd2fc52a264549229ea75f26726e599e99 Text-content-length: 1045 Text-content-md5: 001bb1a03ef7f9f728b15474672bef9c Text-content-sha1: 9da1897850566498ca8dd8fc2daf569ff57cd652 Content-length: 1045 SVN#{!hg$4jQrj9Missing terminal window features -------------------------------- - terminal display is horribly slowMissing alert box features -------------------------- - warn-on-close isn't implemented Missing input features ----------------------'d like to at least have the possibility of using Command rather than Option as the Meta key, since the latter is necessary to send some characters, including the rather important # on Apple UK keyboards; but trapping Command- and sending it to the window rather than the application menu requires me to make a positive effort of some sort and I haven't got round to it yet. For those Mac users who consider their Command key sacrosanct, don't worry, this option _will_ be configurable and _will_ be off by default.) - there's no specials menu Missing terminal emulation features -----------------------------------Other missing features ---------------------- - SessionWindow's dealloc method does nothing yet, so leaks memory Node-path: putty/macosx/osxclass.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0322241ddd969a7294da0ba550061ff4 Text-delta-base-sha1: 30f1b3ae98f58fb27cba373d414334b7c4057316 Text-content-length: 92 Text-content-md5: 24e03504b1c783ed235fe3de8de731ae Text-content-sha1: 0cd77eedaccc35154e461863a333efd1d33883f0 Content-length: 92 SVNaAvrp8`int exited- (void)endSession:(int)clean; - (void)notifyRemoteExit Node-path: putty/macosx/osxdlg.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3da93316bb6f8e860bce7c85a85ed510 Text-delta-base-sha1: 965394f14c27bfb227748ece3e403fd4ae005978 Text-content-length: 524 Text-content-md5: 129047b02b1ca4955341b93a1096abc6 Text-content-sha1: 30384f9402cca5b8889913159debdda62226d764 Content-length: 524 SVN/Rr~kb@static void connection_fatal_callback(void *ctx, int result) { SessionWindow *win = (SessionWindow *)ctx; [win endSession:FALSE]; } void connection_fatal(void *frontend, char *p, ...) { SessionWindow *win = (SessionWindow *)frontend; va_list ap; char *msg; NSAlert *alert; va_start(ap, p); msg = dupvprintf(p, ap); va_end(apmsg]]; [alert addButtonWithTitle:@"Proceed"]; [win startAlert:alert withCallback:connection_fatal_callback andCtx:win]; } Node-path: putty/macosx/osxmain.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1d53749bbccf5819312dd82917d0fb2a Text-delta-base-sha1: 61b83fd0172bd649fe6fc8b0b84269616237d11f Text-content-length: 1090 Text-content-md5: 9ab053f9bedccebbdb4275f1bf30b2ef Text-content-sha1: bfa5a501272948fab15fd18a60b1bf370db88d5f Content-length: 1090 SVN} *G* static void commonfatalbox(char *p, va_list ap) { char errorbuf[2048]; NSAlert *alert; /* * We may have come here because we ran out of memory, in which * case it's entirely likely that that further memory * allocations will fail. So (a) we use vsnprintf to format the * error message rather than the usual dupvprintf; and (b) we * have a fallback way to get the message out via stderr if * even creating an NSAlert fails. */ vsnprintf(errorbuf, lenof(errorbuf), p, ap); alert = [NSAlert alloc]; if (!alert) { fprintf(stderr, "fatal error (and NSAlert failed): %s\n", errorbuf); } else { alert = [[alert init] autorelease]; [alert addButtonWithTitle:@"Terminate"]; [alert setInformativeText:[NSString stringWithCString:errorbuf]]; [alert runModal]; } exit(1); } void fatalbox(char *p, ...) { va_list ap; va_start(ap, p); commonfatalbox(p, ap); va_end(ap); } void modalfatalbox(char *p, ...) { va_list ap; va_start(ap, p); commonfatalbox(p, ap); va_end(ap Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a8bd9bb45ba04a39804ee18752c7000d Text-delta-base-sha1: 6e5a9d46b95566c95865bf7db12fe5bc0893bbae Text-content-length: 831 Text-content-md5: c353f1f082f9c4643e9e13acc6a48804 Text-content-sha1: edc4c4896b0a4e18e42a68d728be374d234be834 Content-length: 831 SVN0+)!_&s`| uuexited = FALSE;if (term) term_free(term); if (logctx) log_free(logctx); if (back) back->free(backhandle); if (ldisc) ldisc_free(ldisc//- (void)notifyRemoteExit { int exitcode; if (!exited && (exitcode = back->exitcode(backhandle)) >= 0) [self endSession:(exitcode == 0)]; } - (void)endSession:(int)clean { exited = TRUE; if (ldisc) { ldisc_free(ldisc); ldisc = NULL; } if (back) { back->free(backhandle); backhandle = NULL; back = NULL; //FIXME: update specials menu; } if (cfg.close_on_exit == FORCE_ON || (cfg.close_on_exit == AUTO && clean)) [self close]; // FIXME: else show restart menu itemnotify_remote_exit(void *frontend) { SessionWindow *win = (SessionWindow *)frontend; [win notifyRemoteExit]; Revision-number: 5401 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2005-02-26T13:39:10.280313Z K 7 svn:log V 53 Explain the status of arcfour, and include my patch. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/arcfour Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 5161 Text-content-md5: f0568998721919da4b20482251466ba4 Text-content-sha1: c00ff1145578ec5c1e100c2e7b8d7b8b2d9841b1 Content-length: 5171 PROPS-END SVNSummary: The "arcfour" cipher isn't supported Class: wish Difficulty: fun Priority: low Content-type: text/plain PuTTY doesn't support the "arcfour" (RC4) cipher in SSH2. Arcfour is notable for being sunstantially faster than any cipher that PuTTY currently supports. Unfortunately, the way it's specified for SSH2, without discarding the first 1024 bytes of keystream, it's rather weaker than it could be (though not dangerously so). On the other hand, not being a CBC-mode block cipher, it doesn't suffer from the problems described in ssh2-cbc-weakness. Using arcfour (or any other stream cipher) in SSH1 would be a very bad idea. The lack of a MAC makes it very easy for an attacker to modify the data stream. There's a patch to add arcfour support to PuTTY below, but unless there seems to be some actual demand for it, we plan to leave it out until there's a secure way of using arcfour with SSH2. Index: ssharcf.c =================================================================== --- ssharcf.c (revision 0) +++ ssharcf.c (revision 0) @@ -0,0 +1,88 @@ +/* + * Arcfour (RC4) implementation for PuTTY. + * + * Coded from Schneier. + */ + +#include +#include "ssh.h" + +typedef struct { + unsigned char i, j, s[256]; +} ArcfourContext; + +static void arcfour_block(void *handle, unsigned char *blk, int len) +{ + ArcfourContext *ctx = (ArcfourContext *)handle; + unsigned k; + unsigned char tmp, i, j, *s; + + s = ctx->s; + i = ctx->i; j = ctx->j; + for (k = 0; k < len; k++) { + i = (i + 1) & 0xff; + j = (j + s[i]) & 0xff; + tmp = s[i]; s[i] = s[j]; s[j] = tmp; + blk[k] ^= s[(s[i]+s[j]) & 0xff]; + } + ctx->i = i; ctx->j = j; +} + +static void arcfour_setkey(ArcfourContext *ctx, unsigned char const *key, + unsigned keybytes) +{ + unsigned char tmp, k[256], *s; + unsigned i, j; + + s = ctx->s; + assert(keybytes <= 256); + ctx->i = ctx->j = 0; + for (i = 0; i < 256; i++) { + s[i] = i; + k[i] = key[i % keybytes]; + } + j = 0; + for (i = 0; i < 256; i++) { + j = (j + s[i] + k[i]) & 0xff; + tmp = s[i]; s[i] = s[j]; s[j] = tmp; + } +} + +/* -- Interface with PuTTY -- */ + +static void *arcfour_make_context(void) +{ + return snew(ArcfourContext); +} + +static void arcfour_free_context(void *handle) +{ + sfree(handle); +} + +static void arcfour_key(void *handle, unsigned char *key) +{ + ArcfourContext *ctx = (ArcfourContext *)handle; + arcfour_setkey(ctx, key, 16); +} + +static void arcfour_iv(void *handle, unsigned char *key) +{ + +} + +const struct ssh2_cipher ssh_arcfour_ssh2 = { + arcfour_make_context, arcfour_free_context, arcfour_iv, arcfour_key, + arcfour_block, arcfour_block, + "arcfour", + 1, 128, "Arcfour" +}; + +static const struct ssh2_cipher *const arcfour_list[] = { + &ssh_arcfour_ssh2 +}; + +const struct ssh2_ciphers ssh2_arcfour = { + sizeof(arcfour_list) / sizeof(*arcfour_list), + arcfour_list +}; Index: settings.c =================================================================== --- settings.c (revision 5399) +++ settings.c (working copy) @@ -17,6 +17,7 @@ { "aes", CIPHER_AES }, { "blowfish", CIPHER_BLOWFISH }, { "3des", CIPHER_3DES }, + { "arcfour", CIPHER_ARCFOUR }, { "WARN", CIPHER_WARN }, { "des", CIPHER_DES } }; Index: ssh.c =================================================================== --- ssh.c (revision 5399) +++ ssh.c (working copy) @@ -4929,6 +4929,9 @@ case CIPHER_AES: s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_aes; break; + case CIPHER_ARCFOUR: + s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_arcfour; + break; case CIPHER_WARN: /* Flag for later. Don't bother if it's the last in * the list. */ Index: ssh.h =================================================================== --- ssh.h (revision 5399) +++ ssh.h (working copy) @@ -233,6 +233,7 @@ extern const struct ssh2_ciphers ssh2_des; extern const struct ssh2_ciphers ssh2_aes; extern const struct ssh2_ciphers ssh2_blowfish; +extern const struct ssh2_ciphers ssh2_arcfour; extern const struct ssh_kex ssh_diffiehellman_group1; extern const struct ssh_kex ssh_diffiehellman_group14; extern const struct ssh_kex ssh_diffiehellman_gex; Index: Recipe =================================================================== --- Recipe (revision 5399) +++ Recipe (working copy) @@ -205,7 +205,7 @@ # SSH back end (putty, plink, pscp, psftp). SSH = ssh sshcrc sshdes sshmd5 sshrsa sshrand sshsha sshblowf + sshdh sshcrcda sshpubk sshzlib sshdss x11fwd portfwd - + sshaes sshsh512 sshbn wildcard pinger + + sshaes sshsh512 sshbn wildcard pinger ssharcf WINSSH = SSH winnoise winpgntc UXSSH = SSH uxnoise uxagentc MACSSH = SSH macnoise Index: putty.h =================================================================== --- putty.h (revision 5399) +++ putty.h (working copy) @@ -252,6 +252,7 @@ CIPHER_BLOWFISH, CIPHER_AES, /* (SSH 2 only) */ CIPHER_DES, + CIPHER_ARCFOUR, CIPHER_MAX /* no. ciphers (inc warn) */ }; Revision-number: 5402 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2005-02-26T15:13:13.965148Z K 7 svn:log V 41 Fix segfault on forcible window closure. K 10 svn:author V 5 simon PROPS-END Node-path: putty/macosx/README.OSX Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 001bb1a03ef7f9f728b15474672bef9c Text-delta-base-sha1: 9da1897850566498ca8dd8fc2daf569ff57cd652 Text-content-length: 116 Text-content-md5: 61a8a54d53cf8535bb7522dc98243428 Text-content-sha1: bd3ed305ad619bb2c841cf2a6a0baf7f39f7ea1f Content-length: 116 SVN{kUq[Uele - mouse activity isn't supported (neither cut-and-paste nor xterm mouse tracking) Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c353f1f082f9c4643e9e13acc6a48804 Text-delta-base-sha1: edc4c4896b0a4e18e42a68d728be374d234be834 Text-content-length: 257 Text-content-md5: 157c9b63939be61421367ce8428cd3c4 Text-content-sha1: 035514152d135756f1c6efe970a062c9f988ffa3 Content-length: 257 SVN+ ffback) back->free(backhandle); if (ldisc) ldisc_free(ldisc); /* ldisc must be freed before term, since ldisc_free expects term * still to be around. */ if (logctx) log_free(logctx); if (term) term_free(term Revision-number: 5403 Prop-content-length: 407 Content-length: 407 K 7 svn:log V 306 The comment that Private-Hash: was not allowed in DSS PuTTY-User-Key-File-1 keys was apparently incorrect; prior to r1413, it was both allowed, and generated for passphraseless keys. Remove it and associated validation so that people are able to load such keys into PuTTYgen to upgrade them, as suggested. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-26T15:50:29.976607Z PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: acd7db7978a040c2087304c8f1d62355 Text-delta-base-sha1: 26bd8994bb907c6687fe56d28086216f37754608 Text-content-length: 193 Text-content-md5: 48a33134c9543ac8db8c96f57fa258ba Text-content-sha1: f9acc2f579622c58f9a981ed995cb4667c1c9afb Content-length: 193 SVN#G! !5pe>the Private-MAC: field can be replaced * with a Private-Hash: field which is a plain SHA-1 hash instead of * an HMAC (this was generated for unencrypted keys). Revision-number: 5404 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2005-02-26T17:30:41.734301Z K 7 svn:log V 116 Allow mkfiles.pl to put multiple verbatim sections in a Makefile, and use one of these for the MacOSX CFLAGS tweak. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f90e37e81ad1c510b4727fbf658ae3a6 Text-delta-base-sha1: 7b6de34cc6f994d3de9125ccbb50dca4bec4db6b Text-content-length: 26 Text-content-md5: 10f23cee05847326d7b7493093177c61 Text-content-sha1: e1732a9c8456447ee92d103733e39f7199c1cd98 Content-length: 26 SVN [?[ vars Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e129a3ebd45adefab4d3252efe1dd0d Text-delta-base-sha1: 434efc2adb820252adc067a755d419ab5ba86976 Text-content-length: 691 Text-content-md5: fc57f98c4d590e76287f9648522626a3 Text-content-sha1: ff9c553296bef42ccf579e3def7a0ce91ac893f3 Content-length: 691 SVNVx- XZ-O^,?1Z.{\5"1D3eu.KBw/+5*M=B7 $sect = $_[2] ? $_[2] : "end"; $divert = \($makefile_extra{$_[1]}->{$sect})/verbatim$makefile_extra{'cygwin'}->{'vars'} . "\n". ".SUFFIXES:->{'end$makefile_extra{'borland'}->{'vars'} ->{'end$makefile_extra{'vc'}->{'vars'} . "\n". ->{'end$makefile_extra{'gtk'}->{'vars'} .->{'end. $makefile_extra{'lcc'}->{'vars'} ->{'end"\n" . $makefile_extra{'osx'}->{'vars'} . "\n" . &splitline("all:" . join "", map { " $_" } &progrealnames("MX:U")) . "\n"; foreach $p (&prognames("MX".$makefile_extra{'osx'}->{'end'}; Revision-number: 5405 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2005-02-26T17:43:47.691448Z K 7 svn:log V 115 Pull out the common compiler-specific workarounds and so on from individual resource files into windows/rcstuff.h. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d570f70543a1f6d326ef419144bf7e2f Text-delta-base-sha1: c26f9a0bbc6703db2dfd97d5fa3f2d929ec7a84b Text-content-length: 79 Text-content-md5: 7b56b3081784f770d40bb2d891d4abf0 Text-content-sha1: c578017e87da9609c6c7b9f61ec2584b1d3ad233 Content-length: 79 SVNlN>\/* * Windows resources for Pageant. */ #include "rcstuff.h" Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d67c5f8132c34680a60f1504d506cfe5 Text-delta-base-sha1: f65f60395b42afa907bcb57dba0bcfa4b2edc485 Text-content-length: 80 Text-content-md5: 62f9c5a65c50781cc8dd4ae8bc43ba66 Text-content-sha1: 848b3dacb3cbe4cbc07acfaf965b9434b9b01140 Content-length: 80 SVN ?D\/* * Windows resources for PuTTYgen. */ #include "rcstuff.h" Node-path: putty/windows/rcstuff.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 636 Text-content-md5: 4ea334b82b0397c6972e68efe085c37b Text-content-sha1: b81f8faba171369ac45b88aadfaff9916950b5d6 Content-length: 646 PROPS-END SVNnnn/* * Miscellaneous stuff to include in all .rc files. */ #ifndef PUTTY_RCSTUFF_H #define PUTTY_RCSTUFF_H #ifdef __LCC__ #include #else /* Some compilers, like Borland, don't have winresrc.h */ #ifndef NO_WINRESRC_H #ifndef MSVC4 #include #else #include #endif #endif #endif /* end #ifdef __LCC__ */ /* Some systems don't define this, so I do it myself if necessary */ #ifndef TCS_MULTILINE #define TCS_MULTILINE 0x0200 #endif /* Likewise */ #ifndef RT_MANIFEST #define RT_MANIFEST 24 #endif #ifdef MINGW32_FIX #define EDITTEXT EDITTEXT "", #endif #endif /* PUTTY_RCSTUFF_H */ Node-path: putty/windows/win_res.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73ad4eeec97af3d7601e96da8b303eb7 Text-delta-base-sha1: ecf580c1845de6f25cbd6b9a73146b5573cc08f7 Text-content-length: 91 Text-content-md5: f2102323c8696eff79611e3e2e08c68a Text-content-sha1: f69a52bceeddd538c1aa794f1e45c2cc90ec4f2e Content-length: 91 SVNmRII d/* * Windows resources for PuTTY and PuTTYtel. */ #include "rcstuff.h" Revision-number: 5406 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2005-02-27T00:03:11.759642Z K 7 svn:log V 16 putty.sit.to.it K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 765b521ac92b54d34d853f9d5296f60c Text-delta-base-sha1: bc8c6e7234946d3f2c5ca7e8c61ee3d0566976c6 Text-content-length: 69 Text-content-md5: d455f558a988277baeeaa315bb641073 Text-content-sha1: 373d4b7864dc1aee852e0d331ecad3c1b3dc8f9e Content-length: 69 SVN6 .89}putty.sit.to.it/">putty.sit.to.it in Italy Revision-number: 5407 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2005-02-27T13:53:08.029019Z K 7 svn:log V 38 Warn on close. Also warn before use. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 478274a47d3e6c080abcf9375e4e83fa Text-delta-base-sha1: c893856fb2cee58d876d6a58644ccdaaf2d82046 Text-content-length: 199 Text-content-md5: 77aa515a15a8faeed44ba19abcd0c5a8 Text-content-sha1: 9573f2e09ecfc74a0ef1a1d1f693dc6abe5e0b11 Content-length: 199 SVN5Q,U,:SThis is a port of PuTTY to the Classic Mac OS. It is a work in progress and should be considered unfinished and insecure. Unless you know what you're doing, don't use it. Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a846d5435959ab4dac8353388cd27a2f Text-delta-base-sha1: a72deb4204e06f86fc6333e24e9d17f232de17e8 Text-content-length: 307 Text-content-md5: 89543453cf7d9a5a0e7b0220471898bc Text-content-sha1: a679c242b4406404aa0e201ca1d6e98bb1816c58 Content-length: 307 SVNpB[int alertret; Session *s = mac_windowsession(window); if (s->cfg.warn_on_close) { ParamText("\pAre you sure you want to close this session?", NULL, NULL, NULL); alertret=CautionAlert(wQuestion, NULL); if (alertret == 2) { /* Cancel */ return; } } Revision-number: 5408 Prop-content-length: 413 Content-length: 413 K 8 svn:date V 27 2005-02-27T23:01:11.175037Z K 7 svn:log V 312 Improvements to PuTTYgen error reporting: - will now display a reason when it fails to load a key - uses existing error return from native keys - import.c had a lot of error descriptions which weren't going anywhere; since the strings are probably taking up space in the binary, we may as well use them K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 87e35b9124249316fff7a2bf9f776f87 Text-delta-base-sha1: b42e7e8088889f4dcb6f711b7d23343dc589240d Text-content-length: 211 Text-content-md5: 6f75f53a3a4a005d75305c40deb44f52 Text-content-sha1: 47c5768aad9ee912c0abd0003569487178e4b2e3 Content-length: 211 SVN?6860, &error); if (ssh2key) { if (ssh2key != SSH2_WRONG_PASSPHRASE) error = NULL; else error = "wrong passphrase"; } else if (!error) error = "unknown error"; Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a9fc7baad25de42d400f71a56735ca51 Text-delta-base-sha1: 2d8937c5f0bbc3b9a99d6643099c48ef037e39c3 Text-content-length: 1258 Text-content-md5: 156088c6409584677c3a0d224d661f0a Text-content-sha1: 91797c3deda3eabd40f31df27b05851cb45c0557 Content-length: 1258 SVN'4,l,^ vLy$ cko|  |4Xbm]Pu.l$)84~geb>DR\.urx-k!x;c4AZ[.h 7^_YP 0) { flags=GetWindowLong(hwnd, BOXFLAGS); if (!(flags & DF_END) && !IsDialogMessage(hwnd, &msg)) DispatchMessage(&msg); if (flags & DF_END) break; } if (gm == 0) PostQuitMessage(msg.wParam); /* We got a WM_QUIT, pass it on */ ret=GetWindowLong(hwnd, BOXRESULT); DestroyWindow(hwnd); return ret; } static void SaneEndDialog(HWND hwnd, int ret) { SetWindowLong(hwnd, BOXRESULT, ret); SetWindowLong(hwnd, BOXFLAGS, DF_END) Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1fd1d7be4519ad0cc1085b4d66559c20 Text-delta-base-sha1: 2bef54eb3199da0b50d34ef7e5e04f197771ab41 Text-content-length: 20 Text-content-md5: 7af13baaf91674206b193b383e702bf0 Text-content-sha1: a00215390095494fb1db569db8745dc844e090b3 Content-length: 20 SVNod T Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e4581680ae95f850d462db9ca419c4f Text-delta-base-sha1: 62a3a97d3cedf94c3b46943c18aac1da0fccf6d3 Text-content-length: 20 Text-content-md5: 54fee57673e02b1b0310ce3e6443278e Text-content-sha1: 3f0900437943cb64d6879c9789f0989ce54e966a Content-length: 20 SVN +W; Revision-number: 5411 Prop-content-length: 179 Content-length: 179 K 7 svn:log V 79 PSFTP now needs wildcard.o, and was only getting it by luck. Make it explicit. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-02-28T00:17:09.423442Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 10f23cee05847326d7b7493093177c61 Text-delta-base-sha1: e1732a9c8456447ee92d103733e39f7199c1cd98 Text-content-length: 62 Text-content-md5: fad3b3d7c7e84c5126e344f13c05dc2f Text-content-sha1: a7fc90e1d2abe903794242aebb3775198b6999a3 Content-length: 62 SVN<#,3m2wildcard WINMISC +wildcard Revision-number: 5412 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2005-02-28T00:27:56.397345Z K 7 svn:log V 33 reinstate putty.mirror.nextit.nl K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d455f558a988277baeeaa315bb641073 Text-delta-base-sha1: 373d4b7864dc1aee852e0d331ecad3c1b3dc8f9e Text-content-length: 68 Text-content-md5: d16ed8a744e369be2e5f2e172b3fa421 Text-content-sha1: 0f50c6db4fc9da961539c55c3ac7dcf06cb57e1b Content-length: 68 SVN!)<Yxcputty.mirror.nextit.n Revision-number: 5413 Prop-content-length: 363 Content-length: 363 K 8 svn:date V 27 2005-02-28T02:40:43.419928Z K 7 svn:log V 262 Fix for `pageant-dirhandle': a new wrapper functions `request_file()' maintains a separate CWD for the file requester, so that when the Open File box is not open Pageant should stay where it was started. (Also some other minor cleanups in this area of Pageant.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a1188c60c16bcee39876590d86a1e95e Text-delta-base-sha1: 34c548121a1fa6b026773511033bdf0995c50919 Text-content-length: 671 Text-content-md5: 10ac4a372c698162c07ca247239a5f45 Text-content-sha1: 71741b3702a7745abd1f50964ec82b7ac0af79ab Content-length: 671 SVN4.2_F6/]t @' yAs/* CWD for "add key" file requester. */ static filereq *keypath = NULL*filelist = snewn(8192, char); if (!keypath) keypath = filereq_new(); memset(&of, 0, sizeof(of)); of.hwndOwner = main_hwnd; of.lpstrFilter = FILTER_KEY_FILES8192; of.lpstrFileTitlerequest_file(keypath, &of, TRUE, FALSEchar *dir = filelist; char *filewalker = filelist + strlen(dir) + 1; while (*filewalker != '\0') { char *filename = dupcat(dir, "\\", filewalker, NULL); add_keyfile(filename_from_str(filename)); sfree(filename); filewalker += strlen(filewalker) + 1keypath) filereq_free(keypath); Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 54fee57673e02b1b0310ce3e6443278e Text-delta-base-sha1: 3f0900437943cb64d6879c9789f0989ce54e966a Text-content-length: 228 Text-content-md5: a2b3dfd6bb9e8379140c30d66b1a2ca3 Text-content-sha1: 370a484475cb39b265655338851ed8c59474fcd9 Content-length: 228 SVNO LmLltypedef struct filereq_tag filereq; /* cwd for file requester */ BOOL request_file(filereq *state, OPENFILENAME *of, int preserve, int save); filereq *filereq_new(void); void filereq_free(filereq *state); Node-path: putty/windows/winutils.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 32668a82e18f9001c057a670a33903f4 Text-delta-base-sha1: 3d0a4a20d8ad8bb79fb56405e4a2efd62947bbf5 Text-content-length: 1876 Text-content-md5: 50b1c0756b5cf5e02d883755b69f15ce Text-content-sha1: 6d5805560ac85f03114d4591d083f4263e901fca Content-length: 1876 SVNU1~m~Vkr9#include #include "winstuff.h" * split_into_argv()GetOpenFileName/GetSaveFileName tend to muck around with the process' * working directory on at least some versions of Windows. * Here's a wrapper that gives more control over this, and hides a little * bit of other grottiness. */ struct filereq_tag { TCHAR cwd[PATH_MAX]; }; /* * `of' is expected to be initialised with most interesting fields, but * this function does some administrivia. (assume `of' was memset to 0) * save==1 -> GetSaveFileName; save==0 -> GetOpenFileName * `state' is optional. */ BOOL request_file(filereq *state, OPENFILENAME *of, int preserve, int save) { TCHAR cwd[PATH_MAX]; /* process CWD */ BOOL ret; /* Get process CWD */ if (preserve) { DWORD r = GetCurrentDirectory(lenof(cwd), cwd); if (r == 0 || r >= lenof(cwd)) /* Didn't work, oh well. Stop trying to be clever. */ preserve = 0; } /* Open the file requester, maybe setting lpstrInitialDir */ { #ifdef OPENFILENAME_SIZE_VERSION_400 of->lStructSize = OPENFILENAME_SIZE_VERSION_400; #else of->lStructSize = sizeof(*of); #endif of->lpstrInitialDir = (state && state->cwd[0]) ? state->cwd : NULL; /* Actually put up the requester. */ ret = save ? GetSaveFileName(of) : GetOpenFileName(of); } /* Get CWD left by requester */ if (state) { DWORD r = GetCurrentDirectory(lenof(state->cwd), state->cwd); if (r == 0 || r >= lenof(state->cwd)) /* Didn't work, oh well. */ state->cwd[0] = '\0'; } /* Restore process CWD */ if (preserve) /* If it fails, there's not much we can do. */ (void) SetCurrentDirectory(cwd); return ret; } filereq *filereq_new(void) { filereq *ret = snew(filereq); ret->cwd[0] = '\0'; return ret; } void filereq_free(filereq *state) { sfree(state); } Node-path: putty-wishlist/data/pageant-dirhandle Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 101f8c1565c601c746ca9cbb150a5240 Text-delta-base-sha1: c4f1a475d0f4b55ac630648de0874cb9105d2ae8 Text-content-length: 609 Text-content-md5: 0e9d1c15c07743adb0c2750a1ed7b7a5 Text-content-sha1: 6833b330d6b2f95af6e5fde9042d5447aea3129a Content-length: 609 SVNrs JHaG6Fixed-in: 2005-03-01Update, 2005-02-28 (JTN): I've implemented a wrapper to GetOpenFileName() which maintains a separate CWD for the file requester and for the process as a whole (which should appear in snapshots >=r5413), so this should be fixed now. I haven't tested it with anything that objects to having a process in a particular directory, nor with anything potentially awkward like UNCs, but the docs suggest it should work. (A simpler solution would have been to use OFN_NOCHANGEDIR, but that would have changed the UI behaviour.) Revision-number: 5414 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2005-02-28T02:51:51.862988Z K 7 svn:log V 146 Make things other than Pageant use request_file(), why not, although all of its funkiness is switched off so the behaviour is the same as before. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 79aef269903b7edcdbafa92559e12f93 Text-delta-base-sha1: 8fe0869730b4b5900a404fd8c7d490c47db6d34e Text-content-length: 188 Text-content-md5: 83f6d6020ec797cb6be0bfeebaafecc4 Text-content-sha1: 6db0cb994a9476ea75c94e4d6f59160705507ab6 Content-length: 188 SVN(=NAx memset(&of, 0, sizeof(of));Title = ctrl->fileselect.title; of.Flags = 0; if (request_file(NULL, &of, FALSE, ctrl->fileselect.for_writing) Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ccf903f9530e12a4416934b46dfb3846 Text-delta-base-sha1: 265a36bc389c02e3c0c8625fa1ccb9de30ead0f8 Text-content-length: 112 Text-content-md5: 05666cafdb309d53fa340b51cdd00ffe Text-content-sha1: 4fb266c391ac8738a86c529169a064f04e80a07f Content-length: 112 SVNr*RpwRP"Title = dlgtitle; of.Flags = 0; return request_file(NULL, &of, FALSE, save Revision-number: 5415 Prop-content-length: 469 Content-length: 469 K 8 svn:date V 27 2005-03-01T00:00:09.912637Z K 7 svn:log V 368 Move the MessageBox-with-help function out into winutils.c, although it's still only used for the host key popups. Side-effects: - requested_help is a winstuff.h global - Pageant now defines winstuff.h globals (Also, my previous fix to my improved host-key dialogs only got the "changed" case, not the "unknown" case. Some days I shouldn't be let near a keyboard.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 29fcb68a5d5dc670628563a852520a31 Text-delta-base-sha1: d1c2cc5e5afeb9b42545f1413aeca8ee38f58cef Text-content-length: 729 Text-content-md5: c741cd865a51487e4f3ce2f0d6823a8c Text-content-sha1: 4be885d7e10bcea9cc1c0434c099dd1b68b60e6f Content-length: 729 SVN).=oYa u%XaBE#BbGchar *text = dupprintf(wrongmsg, appname, keytype, fingerprint, appname); char *caption = dupprintf(mbtitle, appname); mbret = message_box(text, caption, MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3, HELPCTXID(errors_hostkey_changed)); assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL); sfree(text); sfree(cchar *text = dupprintf(absentmsg, keytype, fingerprint, appname); char *caption = dupprintf(mbtitle, appname); mbret = message_box(text, caption, MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3, HELPCTXID(errors_hostkey_absent)); assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL); sfree(text); sfree(c Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da32863436852b9d25906c495b498ace Text-delta-base-sha1: c8012bb868a97e31623b8e269f16cfa9440f987f Text-content-length: 68 Text-content-md5: dec8145346c23f3181fb882f7ce7583d Text-content-sha1: 8771e03bb4fcc77ba6235cc6476ad2964bb10cba Content-length: 68 SVNH) o dd#define WINHELP_CTX_MAXLEN 80ID_no_help 0 Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 05666cafdb309d53fa340b51cdd00ffe Text-delta-base-sha1: 4fb266c391ac8738a86c529169a064f04e80a07f Text-content-length: 23 Text-content-md5: a74856d89d120bce70e965104ba6b65b Text-content-sha1: 90f95e89691c24e4ae156a189d6522d18a8a6edb Content-length: 23 SVN* <RX Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 10ac4a372c698162c07ca247239a5f45 Text-delta-base-sha1: 71741b3702a7745abd1f50964ec82b7ac0af79ab Text-content-length: 52 Text-content-md5: 3dce06198543e83fb1df305ce021919c Text-content-sha1: 108ac38ffc10b3de4740b9d1dec7b893e4dccace Content-length: 52 SVN.D*define PUTTY_DO_GLOBALS Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a2b3dfd6bb9e8379140c30d66b1a2ca3 Text-delta-base-sha1: 370a484475cb39b265655338851ed8c59474fcd9 Text-content-length: 128 Text-content-md5: 00c685757947a8fc3c591e504e103c22 Text-content-sha1: 85180d3efa6789f3cd8f9d0b34b866978ab1f1ee Content-length: 128 SVNO8d2 0K7GLOBAL int requested_helpint message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid Node-path: putty/windows/winutils.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 50b1c0756b5cf5e02d883755b69f15ce Text-delta-base-sha1: 6d5805560ac85f03114d4591d083f4263e901fca Text-content-length: 1523 Text-content-md5: 8a992490981a5ab038eadda421563f71 Text-content-sha1: 20a9da168a765f606c3dbf0380a0cadd2396ee84 Content-length: 1523 SVNr XzX nMessage box with optional context help. */ /* Callback function to launch context help. */ static VOID CALLBACK message_box_help_callback(LPHELPINFO lpHelpInfo) { if (help_path) { char *context = NULL; #define CHECK_CTX(name) \ do { \ if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \ context = WINHELP_CTX_ ## name; \ } while (0) CHECK_CTX(errors_hostkey_absent); CHECK_CTX(errors_hostkey_changed); #undef CHECK_CTX if (context) { /* We avoid using malloc, in case we're in a situation where * it would be awkward to do so. */ char cmd[WINHELP_CTX_MAXLEN+10]; sprintf(cmd, "JI(`',`%.*s')", WINHELP_CTX_MAXLEN, context); WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); requested_help = TRUE; } } } int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid) { MSGBOXPARAMS mbox; /* * We use MessageBoxIndirect() because it allows us to specify a * callback function for the Help button. */ mbox.cbSize = sizeof(mbox); /* FIXME: assumes global hwnd and hinst are always the Right Thing; * are they? */ mbox.hInstance = hinst; mbox.hwndOwner = hwnd; mbox.lpfnMsgBoxCallback = &message_box_help_callback; mbox.dwLanguageId = LANG_NEUTRAL; mbox.lpszText = text; mbox.lpszCaption = caption; mbox.dwContextHelpId = helpctxid; mbox.dwStyle = style; if (helpctxid != 0 && help_path) mbox.dwStyle |= MB_HELP; return MessageBoxIndirect(&mbox Revision-number: 5416 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2005-03-01T00:33:18.536397Z K 7 svn:log V 51 Make it clearer that `-m' is only usable with SSH. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2d9f37843960faea73cae6dc945c8626 Text-delta-base-sha1: 84ff3fef95afbf7efa0fa1c0310a944d7507d7cd Text-content-length: 67 Text-content-md5: 8daebf019f6ca57a6f51cd209a893c44 Text-content-sha1: c2176bcd41758199eaf25408c60742a6c4a3c9dc Content-length: 67 SVNnn)!hQ<2m file read remote command(s) from file Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8db27334e580484d101d280d72d8bca9 Text-delta-base-sha1: dd7ce580bebe4913de1e007abf6947db3135ae5f Text-content-length: 69 Text-content-md5: 507ce7153f88349f8168fc13623b8745 Text-content-sha1: 3d77dfe8781deb5d60106e006e18cdd9e7259fa0 Content-length: 69 SVNMM)HEUxm file read remote command(s) from file Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f18fb5179b977d5ddbe6d0d9c2868c75 Text-delta-base-sha1: 006df649bf92214105c1aab332e16d8e25e58671 Text-content-length: 69 Text-content-md5: c425577f1f1e910a8d70a5d7b2df4131 Text-content-sha1: 5ecbb6ad8c66cfa5ba554012ff5b747aba1cd9f4 Content-length: 69 SVN66)-Hkm file read remote command(s) from file Revision-number: 5417 Prop-content-length: 524 Content-length: 524 K 7 svn:log V 423 Add context help to a couple of message boxes. Unfortunately the ones I wanted to get to -- "software caused connection abort" and friends -- are going to be more involved (probably requiring some cross-platform notion of help contexts), and these ones hardly seem worth the effort. Still, I've done it now. Side-effect: Pageant now uses the same `hinst' and `hwnd' globals as everything else. Tested basic functionality. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-01T01:16:57.399653Z PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9edebf10d4c688a7e62d1dd7bb66f9f9 Text-delta-base-sha1: 6c50bd4c62ea592c64e9d61cff5294318f7d039e Text-content-length: 82 Text-content-md5: 09dd9caea04d41600d0bf029ad41abf8 Text-content-sha1: 098ebb611dcf9d8d0e704c96ab8f71cdd4b03d58 Content-length: 82 SVN3Y3Ydi oIjcant-load-key\cfg{winhelp-topic}{errors.cantloadkey Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 071bcd23592d61a29faba72cd55051af Text-delta-base-sha1: 3a55f68b897d8b25f5b69267fed5a4753b9a0be3 Text-content-length: 53 Text-content-md5: 2ad2ce1d0c6584dbaca31fcb7f96dce0 Text-content-sha1: 82597912977d02163203f22ee20f4b2ebc397b00 Content-length: 53 SVN& Q9G\cfg{winhelp-topic}{options. Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: caebc3127c977b26651d7008b76d6c25 Text-delta-base-sha1: 84b2e6470a76653081f493fbbe165ca3d327b158 Text-content-length: 166 Text-content-md5: 7a0bb2bb8ff2acc8f2f3c100ff82ba30 Text-content-sha1: d29061d80aad255cea2d61eede038e5234443297 Content-length: 166 SVN[a'[Px;%Ehwnd = NULLmessage_box(s1, s2, MB_YESNO | MB_ICONWARNING, HELPCTXID(option_cleanup)||+= sprintf((char *) p, Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dec8145346c23f3181fb882f7ce7583d Text-delta-base-sha1: 8771e03bb4fcc77ba6235cc6476ad2964bb10cba Text-content-length: 268 Text-content-md5: 5720a8eebd202348cf526c5df51bf62a Text-content-sha1: 74b98cee4beb79c072927036ea4e198aa2bc05a4 Content-length: 268 SVN{ s } C/* Maximum length for WINHELP_CTX_foo strings */#define WINHELP_CTX_errors_cantloadkey "errors.cantloadkey" #define WINHELP_CTXID_errors_cantloadkey 3 #define WINHELP_CTX_option_cleanup "options.cleanup" #define WINHELP_CTXID_option_cleanup 4 Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a74856d89d120bce70e965104ba6b65b Text-delta-base-sha1: 90f95e89691c24e4ae156a189d6522d18a8a6edb Text-content-length: 242 Text-content-md5: 02069a3a83b46dd27f7b5c6fdcf735e3 Text-content-sha1: a265f42e0623b9b67b1919a01c743b318b7070f3 Content-length: 242 SVNZGS\\Jg_/message_box(msg, "PuTTYgen Error", MB_OK | MB_ICONERROR, HELPCTXID(errors_cantloadkey)message_box(msg, "PuTTYgen Error", MB_OK | MB_ICONERROR, HELPCTXID(errors_cantloadkey) hwnd = NULL Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3dce06198543e83fb1df305ce021919c Text-delta-base-sha1: 108ac38ffc10b3de4740b9d1dec7b893e4dccace Text-content-length: 867 Text-content-md5: f1fbb905e6d8af320aeb569692d1c0aa Text-content-sha1: 28a96a809bb235359d004b4baca825819e226c00 Content-length: 867 SVNiBX+ 7:vP2pT $TTco?S'a" |4}5e:o'}BDV}{_s;3HThinst*msg = dupprintf("Couldn't load this key (%s)", key_type_to_str(type)); message_box(msg, APPNAME, MB_OK | MB_ICONERROR, HELPCTXID(errors_cantloadkey)); sfree(msgmessage_box(msg, APPNAME, MB_OK | MB_ICONERROR, HELPCTXID(errors_cantloadkey)message_box(msg, APPNAME, MB_OK | MB_ICONERROR, HELPCTXID(errors_cantloadkey)hinstmessage_box(msg, APPNAME, MB_OK | MB_ICONERROR, HELPCTXID(errors_cantloadkey)hinsthinsthinsthinst = inst; hwnd = NULLkeylist = NULL; hwnd = CreateWindow(APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, NULL, NULL, inst, NULL); /* Set up a system tray icon */ AddTrayIcon( Node-path: putty/windows/winutils.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a992490981a5ab038eadda421563f71 Text-delta-base-sha1: 20a9da168a765f606c3dbf0380a0cadd2396ee84 Text-content-length: 147 Text-content-md5: cb9fcfac13a5c5125abb2bd48c7f2812 Text-content-sha1: 46c4d5780a0574fd0509e730e804306279cc63b4 Content-length: 147 SVNru#k \ CHECK_CTX(errors_cantloadkey); CHECK_CTX(option_cleanupAssumes the globals `hinst' and `hwnd' have sensible values. Revision-number: 5418 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:32.442800Z PROPS-END Revision-number: 5419 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2005-03-01T12:00:34.917040Z K 7 svn:log V 16 Fix broken line K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d16ed8a744e369be2e5f2e172b3fa421 Text-delta-base-sha1: 0f50c6db4fc9da961539c55c3ac7dcf06cb57e1b Text-content-length: 26 Text-content-md5: e22338c7def69036b07ffdf85685081f Text-content-sha1: e89a0459f7fda7f7d7e4ef322b0550d3bb72bc2a Content-length: 26 SVN! dYzc> Revision-number: 5420 Prop-content-length: 296 Content-length: 296 K 8 svn:date V 27 2005-03-01T12:19:58.473807Z K 7 svn:log V 195 VC didn't like PATH_MAX. Use MAX_PATH instead. (This macro is mentioned in MSDN's SetCurrentDirectory() documentation, although I haven't found a statement of where it's supposed to be defined.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winutils.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cb9fcfac13a5c5125abb2bd48c7f2812 Text-delta-base-sha1: 46c4d5780a0574fd0509e730e804306279cc63b4 Text-content-length: 50 Text-content-md5: 6f4c10f3af09acab75c6101d74640350 Text-content-sha1: e5d8077aa980fd849089132f6fb2215878708ecf Content-length: 50 SVN~}L.kMAX_PATHMAX_PATH Revision-number: 5421 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 Reinstate hardcore.lt K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-01T12:25:55.421278Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e22338c7def69036b07ffdf85685081f Text-delta-base-sha1: e89a0459f7fda7f7d7e4ef322b0550d3bb72bc2a Text-content-length: 75 Text-content-md5: dd11fe02d814fa3c01c4229d9bd96cae Text-content-sha1: 7145cde159c0b72bb2d8963fef2f73af8ea823db Content-length: 75 SVN 0sA'yhardcore.lt/putty/">hardcore.lt in Lithuania Revision-number: 5422 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2005-03-01T15:18:34.297713Z K 7 svn:log V 104 Mention `-cleanup' caveats on multi-user systems. Mention installer in faq-cleanup. Fix indexing snafu. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bfe457aa5fa65a411b021787b9278d7b Text-delta-base-sha1: 1fb9f393914c592daca66e9e4eed07f93e07a293 Text-content-length: 314 Text-content-md5: 588031271f609a81ab4a2ec1717a93d0 Text-content-sha1: 41e7a24b658abb9afaedd7a709f165d126682291 Content-length: 314 SVNp988 (Note that this only removes settings for the currently logged-in user on \i{multi-user systems}.) If PuTTY was installed from the installer package, it will also appear in \q{Add/Remove Programs}. Uninstallation does not currently remove the above-mentioned registry entries and file Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ad2ce1d0c6584dbaca31fcb7f96dce0 Text-delta-base-sha1: 82597912977d02163203f22ee20f4b2ebc397b00 Text-content-length: 240 Text-content-md5: dbc0262f687c3b9b8ced7dc81d252025 Text-content-sha1: 2cdaaca3ef7c0e837fffe80d68d0910ff7311323 Content-length: 240 SVN&/TTSSi{random seed file} from the local machine (after confirming with the user). Note that on \i{multi-user systems}, \c{-cleanup} only removes registry entries and files associated with the currently logged-in user Revision-number: 5423 Prop-content-length: 766 Content-length: 766 K 7 svn:log V 665 Update Inno Setup script. Tested with IS 5.0.8 on Win98SE; I think there are a few things that will faze whatever we're using currently (2.0.19 or thereabouts?), but nothing desperately modern. (NB, the 0.57 putty.iss works fine with 5.0.8 and the installer is even 40k smaller.) Notable changes: - Uninstallation now runs a variant of `putty -cleanup'. The variance is only in the text displayed; the user is still prompted, and the default action is (now) "keep" in both cases. - Optionally add an icon in the Quick Launch bar. - Make desktop item optionally for all users. (not tested) - "Create a Start Menu group" now handled via IS' own mechanism. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-01T21:34:21.839931Z PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2a485870cf9cc666e7c311087a81f62d Text-delta-base-sha1: c9cf6b9e8a14abaeb0a23a1d0d7a0784d281b0f1 Text-content-length: 59 Text-content-md5: 4b59dbf82cf052b8c7f494e09b33437b Text-content-sha1: 8b8f495cb6f7fdb1d57b043667d4c1d34d4db64d Content-length: 59 SVNQw &]t] (_three_ times, on consecutive lines) Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 099545e49d34882acbfe2e939be3a067 Text-delta-base-sha1: f3cf852ff18092c299a3166742d98615c182a69d Text-content-length: 2665 Text-content-md5: 4220b579089111cb155ed94d7394d7bd Text-content-sha1: 6d39166d73618e0e0eed16345af515f3954186fc Content-length: 2665 SVN H@ EtYf#^je;+might be nice to have an option to add PSCP, Plink and PSFTP to ; the PATH. This is probably only practical on NT-class systems; I ; believe doing this on 9x would require mucking around with ; AUTOEXEC.BAT. ; ; - Maybe a "custom" installation might be useful? Hassle with icons, ; though. [Setup] AppName=PuTTY AppVerName=PuTTY version 0.57 VersionInfoTextVersion=Release 0.57 AppVersion=0.57 ;FIXME -- enable this when we've got it going for individual EXEs too ; and are committed to the version numbering scheme. ;VersionInfoVersion=0.57.0.0 AppPublisher=Simon Tatham AppPublisherURL=http://www.chiark.greenend.org.uk/~sgtatham/putty/ AppReadmeFile={app}\README.txt;ChangesEnvironment=yes -- when PATH munging is sorted (probably) Compression=zip/9 AllowNoIcons=yesComment: "SSH, Telnet and Rlogin client"; Name: "{group}\PuTTY Manual"; Filename: "{app}\putty.hlp" Name: "{group}\PuTTY Web Site"; Filename: "{app}\website.url" Name: "{group}\PSFTP"; Filename: "{app}\psftp.exe"; Comment: "Command-line interactive SFTP client" Name: "{group}\PuTTYgen"; Filename: "{app}\puttygen.exe"; Comment: "PuTTY SSH key generation utility" Name: "{group}\Pageant"; Filename: "{app}\pageant.exe"; Comment: "PuTTY SSH authentication agent" Name: "{commondesktop}\PuTTY"; Filename: "{app}\putty.exe"; Tasks: desktopicon\common Name: "{userdesktop}\PuTTY"; Filename: "{app}\putty.exe"; Tasks: desktopicon\user ; Putting this in {commonappdata} doesn't seem to work, on 98SE at least. Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\PuTTY"; Filename: "{app}\putty.exe"; Tasks: quicklaunchicon [Tasks] Name: desktopicon; Description: "Create a &desktop icon for PuTTY"; GroupDescription: "Additional icons:"; Flags: unchecked Name: desktopicon\common; Description: "For all users"; GroupDescription: "Additional icons:"; Flags: exclusive unchecked Name: desktopicon\user; Description: "For the current user only"; GroupDescription: "Additional icons:"; Flags: exclusive unchecked Name: quicklaunchicon; Description: "Create a &Quick Launch icon for PuTTY (current user only)"; GroupDescription: "Additional icons:"; Flags: unchecked Name: associate; Description: "&Associate .PPK files (PuTTY Private Key) with Pageant and PuTTYgen"; GroupDescription: "Other tasks:; Add to PATH on NT-class OS? [UninstallRun] ; -cleanup-during-uninstall is an undocumented option that tailors the ; message displayed. Filename: "{app}\putty.exe"; Parameters: "-cleanup-during-uninstall"; RunOnceId: "PuTTYCleanup"; StatusMsg: "Cleaning up saved sessions etc (optional)..." Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a0bb2bb8ff2acc8f2f3c100ff82ba30 Text-delta-base-sha1: d29061d80aad255cea2d61eede038e5234443297 Text-content-length: 2152 Text-content-md5: f231a2f91c8ddde1b87f0a3ead876d27 Text-content-sha1: 84a7ba13d6fbb0ba196d59bfd9769b1c71de6e62 Content-length: 2152 SVN^tCr/k@ || !strcmp(p, "-cleanup-during-uninstall/* Are we being invoked from an uninstaller? */ if (!strcmp(p, "-cleanup-during-uninstall")) { s1 = dupprintf("Remove saved sessions and random seed file?\n" "\n" "If you hit Yes, ALL Registry entries associated\n" "with %s will be removed, as well as the\n" "random seed file. THIS PROCESS WILL\n" "DESTROY YOUR SAVED SESSIONS.\n" "(This only affects the currently logged-in user.)\n" "\n" "If you hit No, uninstallation will proceed, but\n" "saved sessions etc will be left on the machine.", appname); s2 = dupprintf("%s Uninstallation", appname); } else { s1 = dupprintf("This procedure will remove ALL Registry entries\n" "associated with %s, and will also remove\n" "the random seed file. (This only affects the\n" "currently logged-in user.)\n" "\n" "THIS PROCESS WILL DESTROY YOUR SAVED SESSIONS.\n" "Are you really sure you want to continue?", appname); s2 = dupprintf("%s Warning", appname); } if (message_box(s1, s2, MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2gUUcase VK_F13: code = 25; break; case VK_F14: code = 26; break; case VK_F15: code = 28; break; case VK_F16: code = 29; break; case VK_F17: code = 31; break; case VK_F18: code = 32; break; case VK_F19: code = 33; break; case VK_F20: code = 34; break; } if ((shift_state&2) == 0) switch (wParam) { case VK_HOME: code = 1; break; case VK_INSERT: code = 2; break; case VK_DELETE: code = 3; break; case VK_END: code = 4; break; case VK_PRIOR: code = 5; break; case VK_NEXT: code = 6; break; } /* Reorder edit keys to physical order */ if (cfg.funky_type == FUNKY_VT400 && code <= 6) code = "\0\2\1\4\5\3\6"[code]; if (term->vt52_mode && code > 0 && code <= 6) { p Revision-number: 5424 Prop-content-length: 431 Content-length: 431 K 10 svn:author V 4 owen K 8 svn:date V 27 2005-03-01T21:38:06.004007Z K 7 svn:log V 331 Close on exit. I'm not entirely happy with the distribution of this across mac_closeterm() and notify_remote_exit() but it will do for now. Also, "PuTTY (inactive)" looks strange as a Mac window title in a way it doesn't on Unix or Windows. Perhaps we should find another way of indicating that a window contains a dead session? PROPS-END Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 934f97ac6946309c2f541b3a2de13e29 Text-delta-base-sha1: 9e2fd5dd3bfd793c8f0bc83d2d71d7a014578f8e Text-content-length: 883 Text-content-md5: 56c2c9b78d63f0ab642dea48209cf937 Text-content-sha1: 136f589db66fa6a0368451bf6e3ddff7868a0b83 Content-length: 883 SVNT,I'VWad&J?rontend, char *fmt, ...) { va_list ap; Str255 stuff; Session *s = frontend s->session_closed = TRUE; if (s->cfg.close_on_exit == FORCE_ON) mac_closewindow(s->windowrontend) { Session *s = frontend; int exitcode; if (!s->session_closed && (exitcode = s->back->exitcode(s->backhandle)) >=0) { s->session_closed = TRUE; if (s->cfg.close_on_exit == FORCE_ON || (s->cfg.close_on_exit == AUTO && exitcode == 0)) { mac_closewindow(s->window); return; } /* The session's dead */ if (s->ldisc) { ldisc_free(s->ldisc); s->ldisc = NULL; } if (s->back) { s->back->free(s->backhandle); s->backhandle = NULL; s->back = NULL; update_specials_menu(s); } { char title[100]; sprintf(title, "%.70s (inactive)", appname); set_title(s, title); } } Node-path: putty/mac/mac.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e749e25fa38f9104399db3745989681 Text-delta-base-sha1: d9d152115f8b999006706e6217ea6e84d629632b Text-content-length: 73 Text-content-md5: d866de54c564743c9755eff405eb22cb Text-content-sha1: 5bcc64f60056406f6fcf0672aacc508e2b7e3f47 Content-length: 73 SVNN 4 /* Session closed flag */ int session_closed Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef90ec05212b4ba51251deb5eaa5103d Text-delta-base-sha1: 0b8fba3fc87a3ac537b0ce50fc286f0e29dd86bb Text-content-length: 39 Text-content-md5: 78811afce3170101a4ee30ed485ad2a1 Text-content-sha1: 5926b65ab697c2ffd9ee8d172139245016df573d Content-length: 39 SVN`| i_ s->session_closed Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 89543453cf7d9a5a0e7b0220471898bc Text-delta-base-sha1: a679c242b4406404aa0e201ca1d6e98bb1816c58 Text-content-length: 110 Text-content-md5: fedf9db8a0d36ee624dbcf1ce5a97861 Text-content-sha1: dfebab035c9b46a21b131a6432777908a8a1e77b Content-length: 110 SVNBuMnn& && !s->session_closedif (s->ldisc) ldisc_free(s->ldisc); if (s->back) Revision-number: 5425 Prop-content-length: 184 Content-length: 184 K 7 svn:log V 84 Summary: Add path to PuTTY programs to PATH in Windows installer Difficulty: tricky K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-01T21:54:56.920127Z PROPS-END Node-path: putty-wishlist/data/installer-addpath Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 831 Text-content-md5: 07de84618a469f8a380a03594893f69c Text-content-sha1: ae39547fcb55a9dafc71103a5c0b559ee119397f Content-length: 841 PROPS-END SVN111Summary: Add path to PuTTY programs to PATH in Windows installer Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body

    We occasionally get asked to add an option in the Windows installer package to add the command-line programs such as PSCP and Plink to the system PATH.

    • On Win95/98/Me, this probably involves automatically modifying AUTOEXEC.BAT, which is probably not something we want to go anywhere near.
    • On NT-class systems, it's a bit better, as we can do this by modifying a Registry entry, and even prod running programs to pick it up. However, it's probably not possible to do this in a reversible way, so it would probably stay on the PATH even after uninstallation, which is bad. (We haven't actually tried this yet.)
    Revision-number: 5426 Prop-content-length: 173 Content-length: 173 K 8 svn:date V 27 2005-03-01T22:15:52.633505Z K 7 svn:log V 73 Summary: Add VERSIONINFO resource to Windows binaries Difficulty: tricky K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-versioninfo Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2000 Text-content-md5: b113c4ed4f6136a7088193976a9ee4d7 Text-content-sha1: 394fc5a66831ce1b88baa7b687cb7568f195022f Content-length: 2010 PROPS-END SVNBBBSummary: Add VERSIONINFO resource to Windows binaries Class: wish Difficulty: tricky Priority: medium Content-type: text/x-html-body

    A number of people have asked us to include a VERSIONINFO resource in the Windows binaries we ship, declaring a version number.

    • Some people find it more convenient to look at the file properties to identify a binary than to run it.
    • Some remote auditing tools apparently pick up on this information.
    • It also affects Inno Setup's behaviour.

    Such a version numbering scheme needs to take into account our daily snapshots, and thus to be updated in an automated way.

    We do have a complete patch to do this, but it breaks on Visual C, whose resource compiler doesn't accept C-style string concatenation with macros ("foo" MACRO "bar"), unlike the other toolchains we support. (If anyone knows of a way to do this in VC, we'd be interested to hear from you.) The alternative approach is to generate the .rc files from a Perl script or similar, which is suboptimal in a number of regards.

    (The PuTTY binaries also contain XML application manifests to improve appearance on Windows XP; these contain a mandatory version number, which is currently hard-coded to 1.0.0.0. This should probably be corrected too, although we don't currently know of anything that looks at this version number.)

    Mailing list references:

    • <10a901c4c0f3$777e2c40$7e01a8c0@firma.elfin.pl>
    • <481131084.20040804120755@tgbyte.de>
    • <A7716A9BADA071448E43F17F12D9EEE02AA0BC@dc1mailbox02.mpls.digitalriver.com>
    • <20050225212543.GP27241@chiark.greenend.org.uk> (patch that works for everything except VC)
    Revision-number: 5427 Prop-content-length: 332 Content-length: 332 K 8 svn:date V 27 2005-03-01T23:48:45.495895Z K 7 svn:log V 231 Fix off-by-one in memory management of PPK reading routine, which could cause 1-byte buffer overflow when reading .PPK files with long lines (>=128 bytes in header value -- probably only happened in practice in the comment field). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48a33134c9543ac8db8c96f57fa258ba Text-delta-base-sha1: f9acc2f579622c58f9a981ed995cb4667c1c9afb Text-content-length: 25 Text-content-md5: 4a14036217ae37f45b0b4875e0ede85a Text-content-sha1: c76be949888f86f456466c1ba6476a93fd7d6290 Content-length: 25 SVNGH  ; = Revision-number: 5428 Prop-content-length: 255 Content-length: 255 K 8 svn:date V 27 2005-03-02T00:13:52.624218Z K 7 svn:log V 154 Summary: Long lines in PPK files (e.g. long key comments) can cause crash Present-in: 0.52 0.53 0.53b 0.54 0.55 0.56 0.57 2005-03-01 Fixed-in: 2005-03-02 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ppk-longline-crash Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1215 Text-content-md5: 303e6949aac6c1330a8f390ea3025572 Text-content-sha1: b441593bbace5723d2fc1d40e70b8d3dcdf393d9 Content-length: 1225 PROPS-END SVN111Summary: Long lines in PPK files (e.g. long key comments) can cause crash Class: bug Difficulty: fun Priority: high Present-in: 0.52 0.53 0.53b 0.54 0.55 0.56 0.57 2005-03-01 Fixed-in: 2005-03-02 Content-type: text/x-html-body

    Long lines in PuTTY SSH-2 private key (.PPK) files could cause a one-byte buffer overflow, potentially leading to a crash. ("Long" here means header values or other lines of 128 characters or more.)

    In practice, this is most likely to occur if a very long comment field is specified - I don't think there are any other circumstances under which PuTTYgen will generate keys with lines that long.

    Although this fault has been present ever since SSH-2 public-key support was added to PuTTY, the report that led to its discovery indicated that it only failed in 0.57. This may be down to a change in the compiler version we used between 0.56 and 0.57.

    Until the next release, if you want to continue to use release versions of the PuTTY tools, a workaround is to load any affected key into a snapshot version of PuTTYgen, trim the key comment, and then save the key back out - it should then work with 0.57 tools. (The key format hasn't changed since 0.57.) Revision-number: 5429 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2005-03-02T00:31:33.343079Z K 7 svn:log V 21 rm incorrect comment K 10 svn:author V 5 jacob PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a14036217ae37f45b0b4875e0ede85a Text-delta-base-sha1: c76be949888f86f456466c1ba6476a93fd7d6290 Text-content-length: 24 Text-content-md5: 47ff296d83e8d874994e493d14dc80d7 Text-content-sha1: 9e79d50c2fb8c4f5a6d021ea2f6396a3f0d500fa Content-length: 24 SVNH0 t< Revision-number: 5430 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2005-03-02T00:46:22.942554Z K 7 svn:log V 27 nit: confusing punctuation K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f1fbb905e6d8af320aeb569692d1c0aa Text-delta-base-sha1: 28a96a809bb235359d004b4baca825819e226c00 Text-content-length: 23 Text-content-md5: 0feb4e640f0ffdd7dbc9ad0c0e1e55d4 Text-content-sha1: 360aad199fa311ca5783fc581f43a0ada49ad9b1 Content-length: 23 SVNih +=, Revision-number: 5431 Prop-content-length: 112 Content-length: 112 K 7 svn:log V 12 missing K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-02T00:53:08.211831Z PROPS-END Node-path: putty-wishlist/data/winhelp-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c6d614e3db20bf59a9fd3d1ef6f4e59b Text-delta-base-sha1: ffefe118539e06b0a17d9f5bd7447ee55827d293 Text-content-length: 22 Text-content-md5: 6be5153d1c5941ac8b5d2da2801b721d Text-content-sha1: 37ffd05281467195d653b83bf46d598333351b90 Content-length: 22 SVN:; '/ Revision-number: 5432 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2005-03-02T15:53:50.701632Z K 7 svn:log V 113 More confusing "(BYTE *) & val" style punctuation. I blame GNU indent, although its confusion is understandable. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02069a3a83b46dd27f7b5c6fdcf735e3 Text-delta-base-sha1: a265f42e0623b9b67b1919a01c743b318b7070f3 Text-content-length: 25 Text-content-md5: cdc2f2da88b1128829da3d3c9b3d8688 Text-content-sha1: 11c54c87305abe5e39af9e82b7d363e34be04a54 Content-length: 25 SVNZY N O Node-path: putty/windows/winpgntc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e7acb8f58b26de2b36b4e0fdab740f7 Text-delta-base-sha1: 62e962c364146e2875cefcf4ffbed1ac14622bcb Text-content-length: 20 Text-content-md5: 0bb88a922d04552a69606788e97786bc Text-content-sha1: 122154375e02459a2838e45de8840f4bf91a7966 Content-length: 20 SVNa` kul Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e553d421e0dca3982d8a1c91b89810ff Text-delta-base-sha1: 7e690848e4bbce44f8ad676836d62e6c6e81fdba Text-content-length: 25 Text-content-md5: 48605c957fb3e563081e0bea2a4648da Text-content-sha1: 299bd1f125f98bf4e6a4d90c4fa2d885e6f710fd Content-length: 25 SVNTEU Revision-number: 5433 Prop-content-length: 182 Content-length: 182 K 8 svn:date V 27 2005-03-02T22:24:50.538511Z K 7 svn:log V 82 Add some signatures from people I trust to the website's copy of the master keys. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/keys/master-dsa.asc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 87dc4c6bc06cf4c647ca3c61720d751b Text-delta-base-sha1: fc326444a2247a94855010afb52e37be8f5be9b0 Text-content-length: 508 Text-content-md5: b5cb9de2f0978be5388577cf8e5c4fcc Text-content-sha1: b5a5a5765898ba35483bf97aaa1c744cec1225bc Content-length: 508 SVN_ ey:+$;-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.62JAJUDBRA73YHz wxaOuiP1rdsBAZ1GA/0bjgVBM65h5Po3Djg3+HpAIYUJrVgT7BZY+iobolwqGXRA vJGv8UosuzPtaTsAZjHhQIrdbvy/4xp3HZJvAnwMN27gisHVD8zzYLPfQzWErOP3 NfYJblXmWZeepNCu3rf/5IQnyJPLvaCe+KkuDoFWTXkLxSdpApl2uOJKcJy+Doic BBABAgAGBQI+IedfAAoJEJ15V3Qa0gbrvXMEALaakWTqlVfLlN9Hh2oZGsVPzEoo 9HLoXv9jweP55NwoUGZtJvtLjPp0FQT6VZASTbqVMYyZYPtJ4ZAVRsZCgch1wmwb +2qe/ghpv94NNLsLKmF08SRylE6QzjwLd3yoT9YQc+rKktK9YXoHp1+cq3scTcsD fVHR9H0peG/QuBDR =9onP Node-path: putty-website/keys/master-rsa.asc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aa53a5245e3a80f8656aca26cdf40f9d Text-delta-base-sha1: ca208696fea3efa8eae2dce0d35cf642737753f0 Text-content-length: 508 Text-content-md5: 677da63302b116f73e04fc33b5e41bb6 Text-content-sha1: 80f8518fb974144284f1fd02aebcafb826e90007 Content-length: 508 SVN9 e0:+$r-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.6KJAJUDBRA7zLrFwxaOuiP1 rdsBAeZDBADY5ibXmTv624eVEHoPtIK9/yrnjJzDv8Bs4mo9G9y1uxzSvyMkhkrx Q39HSVHc2JHnPBo7QEQqpaiSgj2NLsszXK7aHmWjPKX/Lm+ORXycKc8E6MGX8H0O BAN5k0lZPfWhHMyurzvBL5lS8dqqyxwtVfFIxzrwkyHQVSfMLThjoIicBBABAgAG BQI+IecZAAoJEJ15V3Qa0gbrgFYEAIKpI1kFvezKVyqdg+S/HPAvFPqnpLW+vkOH wI0chCpVXcqCLiQzn6gvCWzUnQGjyPwzXyTsUEmRvNtcAs6bx0q+vK1hEajNzLEe hSW6wq+qhLOyFkAsJE+Ee4BaZnm/Cq8/85phzQgzoqEgUh0qt0d6vWD0/Mjw+LNN s2h2aPzR =mIPo Node-path: putty-website/keys.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8f168788214ec417cab1de3fa0056765 Text-delta-base-sha1: 14c4bdb54b185528d7dad0b5738a1a4d466e7808 Text-content-length: 25 Text-content-md5: a4440877f6010b34bf2dd8f8b7442245 Text-content-sha1: 94e6114fdbafd58b4f2c7e8dd494a53b65d870f1 Content-length: 25 SVNlistbox.tbup != NULL) hideshow(mc->listbox.tbup); if (mc->listbox.tbdown != NULL) hideshow(mc->listbox.tbdown, upbounds, downctrl->listbox.draglist) { upbounds = downbounds = bounds; upbounds.left = upbounds.right - 58; upbounds.bottom = upbounds.top + 20; downbounds.left = downbounds.right - 58; downbounds.top = upbounds.bottom + 6; downbounds.bottom = downbounds.top + 20; bounds.right -= 64; /* enough for 6 px gap and a button */ } if (ctrl->listbox.draglist) { mc->listbox.tbup = NewControl(window, &upbounds, "\pUp", FALSE, 0, 0, 1, pushButProc, (long)mc); mc->listbox.tbdown = NewControl(window, &downbounds, "\pDown", FALSE, 0, 0, 1, pushButProc, (long)mc); } if (mc->listbox.tbup != NULL) HiliteControl(mc->listbox.tbup, state); if (mc->listbox.tbdown != NULL) HiliteControl(mc->listbox.tbdown if (mc->generic.type == MACCTRL_LISTBOX && control == mc->listbox.tbup) draglist_up(mc, mcs); if (mc->generic.type == MACCTRL_LISTBOX && control == mc->listbox.tbdown) draglist_down(mc, mcs);if (control == mc->listbox.tbup) draglist_up(mc, mcs); if (control == mc->listbox.tbdown) draglist_down(mc, mcs); static void draglist_move(union macctrl *mc, struct macctrls *mcs, int direction) { ListBounds bounds; Cell cell = {0, 0}; char current[255]; char new[255]; short curlength = 255; short newlength = 255; int curid, newid; int index = dlg_listbox_index(mc->generic.ctrl, mcs); if ((index < 0) || (index == 0 && direction < 0) || (index == bounds.bottom-1 && direction > 0)) { SysBeep(30); return; } /* Swap the contents of the selected and target list cells */ cell.v = index; LGetCell(current, &curlength, cell, mc->listbox.list); current[curlength] = '\0'; cell.v += direction; LGetCell(new, &newlength, cell, mc->listbox.list); new[newlength] = '\0'; cell.v = index; LSetCell(new, newlength, cell, mc->listbox.list); cell.v += direction; LSetCell(current, curlength, cell, mc->listbox.list); /* Move the selection to the target list cell */ cell.v = index; LSetSelect(FALSE, cell, mc->listbox.list); cell.v += direction; LSetSelect(TRUE, cell, mc->listbox.list); DrawOneControl(mc->listbox.tbctrl); /* Swap the ids of the list cells */ curid = mc->listbox.ids[index]; newid = mc->listbox.ids[index + direction]; mc->listbox.ids[index] = newid; mc->listbox.ids[index + direction] = curid; ctrlevent(mcs, mc, EVENT_VALCHANGE); } static void draglist_up(union macctrl *mc, struct macctrls *mcs) { draglist_move(mc, mcs, -1); } static void draglist_down(union macctrl *mc, struct macctrls *mcs) { draglist_move(mc, mcs, +1); } Revision-number: 5435 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:34.186560Z PROPS-END Revision-number: 5436 Prop-content-length: 240 Content-length: 240 K 8 svn:date V 27 2005-03-03T13:07:25.377023Z K 7 svn:log V 141 Explicitly set MIN and TIME when in raw mode to request single characters with no timeout. This seems to make Plink work better on Solaris. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 507ce7153f88349f8168fc13623b8745 Text-delta-base-sha1: 3d77dfe8781deb5d60106e006e18cdd9e7259fa0 Text-content-length: 66 Text-content-md5: 5474abe30f779d3ffcef35eaa4f23202 Text-content-sha1: d4826af60001f030c7b2885116766eb5d688132f Content-length: 66 SVNMz +HF mode.c_cc[VMIN] = 1; mode.c_cc[VTIME] = 0 Revision-number: 5437 Prop-content-length: 106 Content-length: 106 K 8 svn:date V 27 2005-03-03T22:01:37.145906Z K 7 svn:log V 7 CVE ID K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/vuln-modpow Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 28fdc39dc8086605c2c01862a5ecc78e Text-delta-base-sha1: 757fb603f8f4a0e1fcb334538eeb1c4a1c39aa7d Text-content-length: 120 Text-content-md5: 79df2e067c30b32eeb8bb35b46ecc3ba Text-content-sha1: 6ea080d5ad52a4a6390debe3beb93c27d9f35cf4 Content-length: 120 SVN o dTd7U CVE ID CAN-2004-1440 and Revision-number: 5438 Prop-content-length: 225 Content-length: 225 K 7 svn:log V 124 Fix minor imprecisions in cfg->portfwd[] bounds checking (which erred on the side of rejecting input, not buffer overflow). K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-04T01:02:53.538402Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b042f52a94feadc81a98fe1eb0917ad9 Text-delta-base-sha1: 2f5ea55d1f274931de2f15aac055d87e3ca60158 Text-content-length: 33 Text-content-md5: ffbe0cfa605d17739463913057301d84 Text-content-sha1: bd1ecc3696a3f56e0924c2489301108fcce63647 Content-length: 33 SVNedzN|J= Revision-number: 5439 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2005-03-04T01:20:20.185286Z K 7 svn:log V 45 rm some magic numbers in ssh_setup_portfwd() K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 07aec841a2e1aee99e061ad217842e70 Text-delta-base-sha1: 91c3d5802b34bf9ac87342845b34d4c4e5326c18 Text-content-length: 146 Text-content-md5: 35d5f29e64bbddf87600258ec957521a Text-content-sha1: 9c107b7290cbd2222f65d9fb2a0584f4365304da Content-length: 146 SVN+uOx$Jmqlenof(sports)-1lenof(host)-1lenof(dports)-1*L"*SIONID) si Revision-number: 5440 Prop-content-length: 317 Content-length: 317 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-04T01:54:56.108759Z K 7 svn:log V 216 Fix potential fault where -L/-R/-D could accept a string too long for our portfwd[] array. (Not sure what would happen in this case, mind.) Also modify -L/-R/-D code to cope with IPv4/IPv6 tunnels in saved settings. PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 122deada845d28baaf11d73472b02130 Text-delta-base-sha1: 464173628ba7c5b9269d3a5c5b017e2c9a003918 Text-content-length: 403 Text-content-md5: ba46604bd6cd367df2739886b5ee140f Text-content-sha1: a335df6663a56032b755fc5a1282ed7f03d004c3 Content-length: 403 SVN',uRrv?o8existing forwards, find end of list */ while (*ptr) { while (*ptr) ptr++; ptr++; } i = ptr - cfg->portfwd; ptr[0] = p[1]; /* insert a 'L', 'R' or 'D' at the start */ ptr++; if (1 + strlen(fwd) + 2 > sizeof(cfg->portfwd) - i) { cmdline_error("out of space for port forwardings"); return ret; } strncpy(ptr, fwd, sizeof(cfg->portfwd) - i - 22nd Revision-number: 5441 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:34.604840Z PROPS-END Revision-number: 5442 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:34.619412Z PROPS-END Revision-number: 5443 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2005-03-05T15:04:48.438475Z K 7 svn:log V 42 Fixes for NO_IPV6 compilation under Unix. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 92e61ea34935321a5c1041dc2556acd8 Text-delta-base-sha1: 2a464bb300f6e86037fabecd80fbad74804980e7 Text-content-length: 62 Text-content-md5: 66044c352abd34d90a9127e25c47eb84 Text-content-sha1: 55980c399f33cb7d65dff1f5f19516dca9689669 Content-length: 62 SVNU< %_8} addr = (struct sockaddr *)& Revision-number: 5444 Prop-content-length: 232 Content-length: 232 K 8 svn:date V 27 2005-03-05T15:05:18.877032Z K 7 svn:log V 131 Platform-independent fixes for NO_IPV6 compilation (prevent segfaults on trying to access pfd->addressfamily which doesn't exist). K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ffbe0cfa605d17739463913057301d84 Text-delta-base-sha1: bd1ecc3696a3f56e0924c2489301108fcce63647 Text-content-length: 153 Text-content-md5: fcc77f98bac958839f0991c5fc7edee5 Text-content-sha1: b7bc7d48052f25b09da734954af86594f9cd9616 Content-length: 153 SVNd((dm_Qo3?!qS#ifndef NO_IPV6 union control *addressfamily; #endif#ifndef NO_IPV6 #endif#ifndef NO_IPV6#endif Revision-number: 5445 Prop-content-length: 424 Content-length: 424 K 7 svn:log V 323 Make sure we do notify_remote_exit(ssh->frontend) _before_ connection_fatal(), since the latter is entitled to destroy the backend so `ssh' may no longer be valid once it returns. For the Unix port, switch exit(0) to gtk_main_quit() in notify_remote_exit(), so that we don't exit before the subsequent connection_fatal()! K 10 svn:author V 5 simon K 8 svn:date V 27 2005-03-05T17:56:28.998118Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35d5f29e64bbddf87600258ec957521a Text-delta-base-sha1: 9c107b7290cbd2222f65d9fb2a0584f4365304da Text-content-length: 123 Text-content-md5: 198830325fff9bc253a10b94ed3f2723 Text-content-sha1: 02195c6ae482c9bf383dca0a124f3c79a98d6922 Content-length: 123 SVN7Q^!need_notify) notify_remote_exit(ssh->frontend);(LMLS Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 96c3e28dda3f65c963e9da4d90351606 Text-delta-base-sha1: b057fdb5b6a0fe716cd93d3edefd9898590623df Text-content-length: 80 Text-content-md5: 4dccea1d6df7726e11a3306391c796e3 Text-content-sha1: e4305963b159d0de87248d9072f6087d6591a264 Content-length: 80 SVN "4*Pgtk_main_quit(); /* just go)/) inst- Revision-number: 5446 Prop-content-length: 380 Content-length: 380 K 7 svn:log V 279 Over-enthusiastic assertions in the port forwarding code removed. Port forwardings are set up before initialising the last few details of the main shell session, so ssh->state can reasonably hold values other than SSH_STATE_SESSION and SSH_STATE_CLOSED during calls to sshfwd_*. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-03-05T18:14:57.548754Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 198830325fff9bc253a10b94ed3f2723 Text-delta-base-sha1: 02195c6ae482c9bf383dca0a124f3c79a98d6922 Text-content-length: 312 Text-content-md5: a450f64b823bdf2762b9f24f3d6259c1 Text-content-sha1: 4f1c7bc349a0e24359899c6aa3765b5f4f17152d Content-length: 312 SVNo%it!.b== SSH_STATE_CLOSED) return;== SSH_STATE_CLOSED) return 0;== SSH_STATE_CLOSED) return;SSIONID) sigdata_len -= 4; sigdata = snewn(sigdata_len, unsigned char); p = 0; iM77 Revision-number: 5447 Prop-content-length: 408 Content-length: 408 K 8 svn:date V 27 2005-03-06T14:48:22.735618Z K 7 svn:log V 307 I'm sick and tired of the persistent reports of lineptr() failing its `line != NULL' assertion, so I've replaced the assertion with a call to fatalbox() giving oodles of information. I may still not be able to reproduce it, but at least next time it happens we should see a decent amount of debugging data! K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 767dd179a81bd5e262ef4b315ffeef85 Text-delta-base-sha1: 8859238498c643be9dd3f9284cf33bf97a7d6cb7 Text-content-length: 1138 Text-content-md5: 6b3232cd5228823e8a2158091271ad20 Text-content-sha1: 071610af18f11f262e5b720270089c0e5e1f6b8c Content-length: 1138 SVNV Qif (line != NULL) { fatalbox("line==NULL in terminal.c\n" "lineno=%d y=%d w=%d h=%d\n" "count(scrollback=%p)=%d\n" "count(screen=%p)=%d\n" "count(alt=%p)=%d alt_sblines=%d\n" "whichtree=%p treeindex=%d\n\n" "Please contact " "and pass on the above information.", lineno, y, term->cols, term->rows, term->scrollback, count234(term->scrollback), term->screen, count234(term->screen), term->alt_screen, count234(term->alt_screen), term->alt_sblines, whichtree, treeindex); }"E##" } } set_erase_char(term); } break; case 's': /* save cursor */ save_cursor(term, TRUE); break; case 'u': /* restore cursor */ save_cursor(term, FALSE); seen_disp_event(term); break; case 't': /* DECSLPP: set page size - ie window height */ /* * VT340/VT420 sequence DECSLPP, DEC only allows values * 24/25/36/48/72/144 other emulators (eg dtterm) use * illegal values (eg first arg 1..9) for window changing * and reports. */ if (term->esc_narg Revision-number: 5448 Prop-content-length: 141 Content-length: 141 K 7 svn:log V 41 Fix sense of test in previous checkin :) K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-06T15:00:45.834124Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6b3232cd5228823e8a2158091271ad20 Text-delta-base-sha1: 071610af18f11f262e5b720270089c0e5e1f6b8c Text-content-length: 43 Text-content-md5: 88afe8947efebfa70cdc1c7d9be8b242 Text-content-sha1: af57a805c7d74e1723bcccd703c81e4dc1726f19 Content-length: 43 SVN _ `=EEE Revision-number: 5449 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2005-03-06T15:45:09.634471Z K 7 svn:log V 33 Mention diagnostics in snapshots K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc909cd800c82f60d1a998b216e7c72a Text-delta-base-sha1: 2ebbea3b9607471e07031a5164dcd152aba4810f Text-content-length: 198 Text-content-md5: e80467aa1adc5ce1cbcd38c55fc4744b Text-content-sha1: a49f0944a8abb253cb323af6ddf73abcfb1cf9b6 Content-length: 198 SVN8m //>z(Update: if you're seeing this consistently, please try a development snapshot 2005-03-07 or later, which has some extra diagnostics to help us track this down. Ta.) Revision-number: 5450 Prop-content-length: 423 Content-length: 423 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-06T16:38:19.342612Z K 7 svn:log V 322 Add notification when using the various auth methods with server-supplied prompts, to make it more obvious if a server is attempting to spoof a local passphrase prompt. I believe an alert user could have spotted this in all cases in SSH-2, although perhaps not in SSH-1. (But they'd have to have enabled TIS/CryptoCard.) PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a450f64b823bdf2762b9f24f3d6259c1 Text-delta-base-sha1: 4f1c7bc349a0e24359899c6aa3765b5f4f17152d Text-content-length: 549 Text-content-md5: 2d07016214a3c5fc1197c3834463d23c Text-content-sha1: 5b0318f4dcd22f0b7356f5f1e709502c3879332b Content-length: 549 SVNk%"Y6c_write_str(ssh, "Using TIS authentication.\r\n");c_write_str(ssh, "Using CryptoCard authentication.\r\n");4qtCXq if (pktin->type != SSH1_SMSG_SUCCESS) { bombout(("Bizarre response to RSA authentication response")); crStopc_write_str(ssh, "Using keyboard-interactive authentication.\r\n");7n777ssh->remote_bugs & BUG_SSH2_PK_SESSIONID) sigdata_len -= 4; sigdata = snewn(sigdata_len, unsigned char); p = 0; i Revision-number: 5451 Prop-content-length: 510 Content-length: 510 K 7 svn:log V 409 `What commands can I type into my PuTTY session' is probably the single most frequently asked thing which isn't in the FAQ (it's in feedback.but instead), so let's add it. I'm uncertain that the people who mail us asking things like `how do I read my email' and `how do I access $database' will successfully recognise this more general question as one which includes their specific one, but it's worth a try. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-03-07T14:07:19.791378Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 588031271f609a81ab4a2ec1717a93d0 Text-delta-base-sha1: 41e7a24b658abb9afaedd7a709f165d126682291 Text-content-length: 1676 Text-content-md5: 4586b85e9bee52e1afd0303ab418a5da Text-content-sha1: 562fa5c45556a529ca0a8ca96ee141cd5339dad6 Content-length: 1676 SVNo-ok$commands}{Question} What commands can I type into my PuTTY terminal window? This is not a question you should be asking \e{us}. You need to read the manuals, or ask the administrator, of \e{the computer you have connected to}. PuTTY does not process the commands you type into it. It's only a communications tool. It makes a connection to another computer; it passes the commands you type to that other computer; and it passes the other computer's responses back to you. Therefore, the precise range of commands you can use will not depend on PuTTY, but on what kind of computer you have connected to and what software is running on it. The PuTTY team cannot help you with that. (Think of PuTTY as being a bit like a telephone. If you phone somebody up and you don't know what language to speak to make them understand you, it isn't \e{the telephone company}'s job to find that out for you. We just provide the means for you to get in touch; making yourself understood is somebody else's problem.) If you are unsure of where to start looking for the administrator of your server, a good place to start might be to remember how you found out the host name in the PuTTY configuration. If you were given that host name by e-mail, for example, you could try asking the person who sent you that e-mail. If your company's IT department provided you with ready-made PuTTY saved sessions, then that IT department can probably also tell you something about what commands you can type during those sessions. But the PuTTY maintainer team does not administer any server you are likely to be connecting to, and cannot help you with questions of this type. Revision-number: 5452 Prop-content-length: 272 Content-length: 272 K 8 svn:date V 27 2005-03-07T16:40:11.301888Z K 7 svn:log V 171 Charlie at work points out that the screen FAQ contains a different - and probably better - solution to the screen-vs-alt-screen issue. Reference it and describe the fix. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4586b85e9bee52e1afd0303ab418a5da Text-delta-base-sha1: 562fa5c45556a529ca0a8ca96ee141cd5339dad6 Text-content-length: 280 Text-content-md5: b94b1cdf9e2824509972ef02c282cfe5 Text-content-sha1: 15ec461f50a15632ae8bc7586d4eb816ca318719 Content-length: 280 SVN|?|I>Alternatively, you can tell \c{screen} itself not to use the alternate screen: the \W{http://www4.informatik.uni-erlangen.de/~jnweiger/screen-faq.html}{\c{screen} FAQ} suggests adding the line \cq{termcapinfo xterm ti@:te@} to your \cw{.screenrc} file. Revision-number: 5453 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:36.030944Z PROPS-END Revision-number: 5454 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:36.051698Z PROPS-END Revision-number: 5455 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:36.064094Z PROPS-END Revision-number: 5456 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2005-03-08T00:30:51.301493Z K 7 svn:log V 84 Summary: Ability to bypass user authentication in SSH-2 Class: wish Difficulty: fun K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/bypass-ssh2-userauth Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 978 Text-content-md5: 9d21e08fa509ea6218e0ef89715ac910 Text-content-sha1: 887208930b5cd2932e8276000ba093cd7863ac5a Content-length: 988 PROPS-END SVNDDDSummary: Ability to bypass user authentication in SSH-2 Class: wish Difficulty: fun Priority: low Content-type: text/x-html-body

    In principle, it should be possible in SSH-2 to bypass the user authentication stage entirely, and ask for the ssh-connection service (which provides shells, port-forwarding and so on) directly, rather than through the ssh-userauth service.

    Currently, PuTTY is hardcoded to try ssh-userauth, and will bomb out if that is not supported. It should be trivial to add an option to try ssh-connection instead. (Perhaps we should also try it if ssh-userauth is refused?)

    We probably won't add this unless someone asks for it. (At least one person has expressed an interest in using SSH purely for transport.)

    (This isn't relevant to SSH-1, which doesn't have the modularity of SSH-2.) Revision-number: 5457 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:36.114795Z PROPS-END Revision-number: 5458 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:36.125836Z PROPS-END Revision-number: 5459 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:36.136035Z PROPS-END Revision-number: 5460 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:36.147053Z PROPS-END Revision-number: 5461 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2005-03-08T14:20:38.677285Z K 7 svn:log V 22 Miscellaneous tweaks. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 81cd81060974e4108121a1e1ee8daf29 Text-delta-base-sha1: 89fa2509a2041e95ffb595ef9fcb9ba7223b3ac2 Text-content-length: 345 Text-content-md5: 75f0ec1f8ab0e47fb7f465fff0e588a8 Text-content-sha1: 6fa181428a6114eb0446f59d6bd24cdf19358992 Content-length: 345 SVN( J6J_cj b m for interactive connections If you have a private key in another format that you want to use with PuTTY, see \k{puttygen-conversions}willy sure that server-side programs can no longer access the service at your end of the port forwarding. If you delete a forwarding, any e Revision-number: 5462 Prop-content-length: 242 Content-length: 242 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-08T16:44:53.168553Z K 7 svn:log V 141 Summary: Reports of crashes on unclean close (related to port forwarding?) Class: bug Present-in: 0.55 0.56 2004-11-29 2005-01-16 2005-01-24 PROPS-END Node-path: putty-wishlist/data/unclean-close-crash Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2256 Text-content-md5: eefe6785cac688293d8e5d0c3ca8e394 Text-content-sha1: 51294c682b1866b434a730e09b2543a432c06167 Content-length: 2266 PROPS-END SVNBBBSummary: Reports of crashes on unclean close (related to port forwarding?) Class: bug Present-in: 0.55 0.56 2004-11-29 2005-01-16 2005-01-24 Content-type: text/x-html-body

    We are getting persistent reports of PuTTY crashing when a session is closed uncleanly, for instance by a network error such as "software caused connection abort". This limits the usefulness of the ability to restart dead sessions that was introduced in recent releases.

    (Some people are apparently in the habit of hibernating their machines with active PuTTY connections. When the machines come back up, the network connections are likely to be invalid, so PuTTY throws a network error and gives the same problem.)

    Many (all?) of the reports indicate that port-forwarding is in use. We've not yet been able to reproduce it.

    Reports:

    • OF9474F5EC.6EF0B984-ON80256E55.00617997-80256E55.0061B13F@plasmon.co.uk
      0.53b; pfd; NULL ptr ref?
    • 4073CD52.8090404@attunity.co.il
      0.53+(0.53b, 0.54?); pfd; SCCA
      debug info -- apparent use of bogus ssh
    • 6.1.2.0.2.20040922120006.01a98a18@imap.hut.fi
      0.55; pfd; network error; sending on port causes crash
    • 20041117185616.1516.qmail@web41502.mail.yahoo.com
      0.56; pfd; SCCA; PuTTY using excessive CPU
    • E1CYwFK-0003zT-00@ixion.tartarus.org
      0.56, r4918(2004-11-29); pfd; SCCA
      also assertion ssh.c:3365 ssh->state == SSH_STATE_CLOSED
    • 200501090053.j090roW0028426@q7.q7.com
      0.56, 2005-01-16; pfd; SCCA; tunnels still open; Dr Watson
    • 41F4C327.20905@hybrid.fi
      0.56 and 2005-01-24; pfd; SCCA; stack backtrace (apparent use of bogus ssh)
      also sees assertion ssh.c:3365 ssh->state == SSH_STATE_CLOSED with 0.56
    • 20050128171423.GB719@firebyte.bytnar.net
      0.55/0.56; pfd; SCCA
      also SOCKS connections not killed (fixed in 2005-02-18)
    • 200411010710.iA17AJAW014641@smtp.hispeed.ch
      0.56; XPSP1; SSH server disconnect ("connection timed out" is fine!)

    Possibly related code activity:

    • access of freed ssh->channels fixed r4946, s/s 2004-12-03
    • leaving channels/listening sockets lying around fixed r5325, s/s 2005-02-18
    Revision-number: 5463 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2005-03-08T17:11:33.281624Z K 7 svn:log V 65 Summary: Dead keys don't work on Unix Class: semi-bug + add xref K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/multi-key Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 84f2e52aee2915714848a1701fa1fd7a Text-delta-base-sha1: 9d5b432f3decd915ea02ec336d86b59c68f5fc25 Text-content-length: 355 Text-content-md5: 0eaca95e00ad024a9b62196b9e859dfc Text-content-sha1: cebc094c938ece797fd167887b43eb4d1510dcf1 Content-length: 355 SVNC-Q\Qx-html-body

    E1Cp2HC-0004Ni-00@chiark.greenend.org.uk:

     The Multi_Key (that is the X Compose key) doesn't appear to work in
    pterm.  In other applications if I type "<Multi_Key> ' e" then I get
    an e-acute whereas in pterm I just get 'e.

    (See also `unix-dead-keys'.) Node-path: putty-wishlist/data/unix-dead-keys Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 546 Text-content-md5: 1563d5cb821ea3217e9e0fd4bdca38f8 Text-content-sha1: d29745fd746360134b52d7c3b6f2170142f8f366 Content-length: 556 PROPS-END SVNSummary: Dead keys don't work on Unix Class: semi-bug Content-type: text/x-html-body

    We've had a number of reports that dead keys don't work in the Gtk build:

    • Debian bug #221786
    • 200409221846.43055.lukesh@k-net.cz
    • FD9631DC343F5C4991BBA3B984359CEC0DF3CF@postak.sit.k-net.cz

    This would probably get fixed quicker if someone were to tell us how to support this, and/or send a patch.

    (See also `multi-key'.) Revision-number: 5464 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2005-03-08T17:44:20.003284Z K 7 svn:log V 26 reference comment in code K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/multi-key Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0eaca95e00ad024a9b62196b9e859dfc Text-delta-base-sha1: cebc094c938ece797fd167887b43eb4d1510dcf1 Text-content-length: 172 Text-content-md5: 27df247b532db5e610478233d0b54e0c Text-content-sha1: 260a84421ad226662365f8a9f3ebfdca5931ec3d Content-length: 172 SVN-N nKbunix/gtkwin.c:key_event() contains the following comment:

    /*
     * NYI: Compose key (!!! requires Unicode faff before even trying)
     */
    
    Revision-number: 5465
    Prop-content-length: 130
    Content-length: 130
    
    K 7
    svn:log
    V 30
    putty.mirror1.wefixtech.co.uk
    
    K 10
    svn:author
    V 5
    jacob
    K 8
    svn:date
    V 27
    2005-03-08T18:18:51.364364Z
    PROPS-END
    
    Node-path: putty-website/mirrors.html
    Node-kind: file
    Node-action: change
    Text-delta: true
    Text-delta-base-md5: dd11fe02d814fa3c01c4229d9bd96cae
    Text-delta-base-sha1: 7145cde159c0b72bb2d8963fef2f73af8ea823db
    Text-content-length: 119
    Text-content-md5: d9fcb7f34ed567f389861813e00917a6
    Text-content-sha1: 379fbd4d0d01091582508d3a53629c894cf09775
    Content-length: 119
    
    SVN_g_Q:mirror1.wefixtech.co.uk/">putty.mirror1.wefixtech.co.uk in the US. [sic]
    
    Revision-number: 5466
    Prop-content-length: 138
    Content-length: 138
    
    K 7
    svn:log
    V 38
    Remove mirrors that still serve 0.56.
    
    K 10
    svn:author
    V 5
    jacob
    K 8
    svn:date
    V 27
    2005-03-08T18:35:44.993127Z
    PROPS-END
    
    Node-path: putty-website/mirrors.html
    Node-kind: file
    Node-action: change
    Text-delta: true
    Text-delta-base-md5: d9fcb7f34ed567f389861813e00917a6
    Text-delta-base-sha1: 379fbd4d0d01091582508d3a53629c894cf09775
    Text-content-length: 42
    Text-content-md5: f794a6a6859258f13720bc73dbc22c59
    Text-content-sha1: f93cd186f19d55aeab906ee579a2860a02229849
    Content-length: 42
    
    SVNK51
    8}91X?
    
    Revision-number: 5467
    Prop-content-length: 139
    Content-length: 139
    
    K 8
    svn:date
    V 27
    2005-03-08T18:41:40.243821Z
    K 7
    svn:log
    V 39
    rm mirrors.sunsite.dk, as binaries 404
    
    K 10
    svn:author
    V 5
    jacob
    PROPS-END
    
    Node-path: putty-website/mirrors.html
    Node-kind: file
    Node-action: change
    Text-delta: true
    Text-delta-base-md5: f794a6a6859258f13720bc73dbc22c59
    Text-delta-base-sha1: f93cd186f19d55aeab906ee579a2860a02229849
    Text-content-length: 22
    Text-content-md5: a1df9e6c20e0e97f2106e7379998417a
    Text-content-sha1: 4229d53d87e1c086b0caaf86dd31c398ab1eea2f
    Content-length: 22
    
    SVNKT	Qz
    
    Revision-number: 5468
    Prop-content-length: 486
    Content-length: 486
    
    K 8
    svn:date
    V 27
    2005-03-08T23:06:15.075502Z
    K 7
    svn:log
    V 385
    Ben Hutchings reports that new PuTTY instances created from the saved
    sessions menu (etc) can inherit listening sockets, and that this sometimes
    causes trouble. Can't reproduce any problems myself, but let's only allow
    inheritance when absolutely necessary -- Duplicate Session -- in which
    case there's already going to be trouble with two processes trying to
    listen on the same port.
    
    K 10
    svn:author
    V 5
    jacob
    PROPS-END
    
    Node-path: putty/windows/window.c
    Node-kind: file
    Node-action: change
    Text-delta: true
    Text-delta-base-md5: f231a2f91c8ddde1b87f0a3ead876d27
    Text-delta-base-sha1: 84a7ba13d6fbb0ba196d59bfd9769b1c71de6e62
    Text-content-length: 422
    Text-content-md5: b3c8340fb27a4762fc3292d4c0d74540
    Text-content-sha1: e1e4537576c22ca5c33ca712991e683ed1735d23
    Content-length: 422
    
    SVN$Ls4o^m9B*BOOL inherit_handlesinherit_handles = TRUE;inherit_handles = FALSE;
    			freecl = TRUE;
    		    } else
    			break;
    		} else /* IDM_NEWSESS */ {
    		    cl = NULL;
    		    inherit_handles = FALSE;
    		}inherit_handlesg{gode = (keystate[VK_SHIFT] & 0x80 ? 34 : 21);
    	    break;
    	  case VK_F11:
    	    code = 23;
    	    break;
    	  case VK_F12:
    	    code = 24;
    	    break;
    	  
    
    Revision-number: 5469
    Prop-content-length: 151
    Content-length: 151
    
    K 8
    svn:date
    V 27
    2005-03-08T23:21:00.343539Z
    K 7
    svn:log
    V 51
    reinstate mirrors.sunsite.dk as mirrors.dotsrc.org
    
    K 10
    svn:author
    V 5
    jacob
    PROPS-END
    
    Node-path: putty-website/mirrors.html
    Node-kind: file
    Node-action: change
    Text-delta: true
    Text-delta-base-md5: a1df9e6c20e0e97f2106e7379998417a
    Text-delta-base-sha1: 4229d53d87e1c086b0caaf86dd31c398ab1eea2f
    Text-content-length: 126
    Text-content-md5: f01e91eb4cfc45e96b85c37c609e63ba
    Text-content-sha1: 7c520ef7b36de599b56f2d66819ce40e7913c7da
    Content-length: 126
    
    SVNTaffx\mirrors.dotsrc.org/putty/">mirrors.dotsrc.org in Denmark. (formerly sunsite.dk)
    
    Revision-number: 5470
    Prop-content-length: 134
    Content-length: 134
    
    K 7
    svn:log
    V 34
    Mention AllowOverride for Apache.
    
    K 10
    svn:author
    V 5
    jacob
    K 8
    svn:date
    V 27
    2005-03-08T23:35:03.923300Z
    PROPS-END
    
    Node-path: putty-website/mirrors.html
    Node-kind: file
    Node-action: change
    Text-delta: true
    Text-delta-base-md5: f01e91eb4cfc45e96b85c37c609e63ba
    Text-delta-base-sha1: 7c520ef7b36de599b56f2d66819ce40e7913c7da
    Text-content-length: 266
    Text-content-md5: 4bd1e182cc9bbf46a1ce493485a9d12e
    Text-content-sha1: 749f1285a51a97ed471a2ee3ce3e493cf44ce0d3
    Content-length: 266
    
    SVNaap!pPYou may need to configure Apache to honour the
    .htaccess file with a directive such as
    AllowOverride. If you do not use Apache, you will have to
    reproduce this behaviour in some other way suitable for your own web
    
    
    Revision-number: 5471
    Prop-content-length: 123
    Content-length: 123
    
    K 7
    svn:log
    V 23
    Today's reinstatements
    
    K 10
    svn:author
    V 5
    jacob
    K 8
    svn:date
    V 27
    2005-03-10T00:31:54.244338Z
    PROPS-END
    
    Node-path: putty-website/mirrors.html
    Node-kind: file
    Node-action: change
    Text-delta: true
    Text-delta-base-md5: 4bd1e182cc9bbf46a1ce493485a9d12e
    Text-delta-base-sha1: 749f1285a51a97ed471a2ee3ce3e493cf44ce0d3
    Text-content-length: 146
    Text-content-md5: 53c68ce2c8c3ebdc76f457df69be3592
    Text-content-sha1: b9450b845cc00d68bd40267a414d522fa92dcb3d
    Content-length: 146
    
    SVNaXm5O~2;A@tmmirror.nucleardog.com/putty/">mirror.nucleardog.comcoolzero.info/">putty.coolzero.info in the Netherlands
    
    Revision-number: 5472
    Prop-content-length: 115
    Content-length: 115
    
    K 7
    svn:log
    V 15
    updated status
    
    K 10
    svn:author
    V 5
    jacob
    K 8
    svn:date
    V 27
    2005-03-10T03:55:10.421606Z
    PROPS-END
    
    Node-path: putty-wishlist/data/ssh2-password-expiry
    Node-kind: file
    Node-action: change
    Text-delta: true
    Text-delta-base-md5: c7276a701993dafcace9336baf6dbe5a
    Text-delta-base-sha1: f20f34e5fafc78985b804bbb918706a35ece2906
    Text-content-length: 257
    Text-content-md5: 092b597378f3eca8c893ff8ac5cf5acf
    Text-content-sha1: fd4fd2209cf70910662f40178a045120684acd6c
    Content-length: 257
    
    SVNX7nIn3-10: I've been working on this, but the
    work has highlighted some changes needed in the structure of the
    authentication code. Since this will be rather disruptive, we
    probably won't resume work on this until after the next release.
    
    
    Revision-number: 5473
    Prop-content-length: 129
    Content-length: 129
    
    K 8
    svn:date
    V 27
    2005-03-10T04:32:29.006934Z
    K 7
    svn:log
    V 29
    Further thoughts re spoofing
    
    K 10
    svn:author
    V 5
    jacob
    PROPS-END
    
    Node-path: putty-wishlist/data/gui-auth
    Node-kind: file
    Node-action: change
    Text-delta: true
    Text-delta-base-md5: de50fcb8a451e903a5ee0f32281f2a49
    Text-delta-base-sha1: abbbb24aba941b3262c2c179982fb4909f054ceb
    Text-content-length: 280
    Text-content-md5: 5bfc914d5d6ab8c001c221b244bd2f8a
    Text-content-sha1: 3c95942ba777f35d7a33a9add99a6997ced7624c
    Content-length: 280
    
    SVNo$o (Although we need to clearly distinguish local prompts such
    as key passphrases from remote prompts, especially keyboard-interactive,
    where the server would like to control as much of the prompt window
    as possible. Not sure of the best way to do this yet.)
    
    Revision-number: 5474
    Prop-content-length: 136
    Content-length: 136
    
    K 8
    svn:date
    V 27
    2005-03-10T04:33:56.904763Z
    K 7
    svn:log
    V 36
    Martin Prikryl suggests "add_path".
    
    K 10
    svn:author
    V 5
    jacob
    PROPS-END
    
    Node-path: putty-wishlist/data/installer-addpath
    Node-kind: file
    Node-action: change
    Text-delta: true
    Text-delta-base-md5: 07de84618a469f8a380a03594893f69c
    Text-delta-base-sha1: ae39547fcb55a9dafc71103a5c0b559ee119397f
    Text-content-length: 125
    Text-content-md5: b65c2d70202bcfbce366e1c264331f81
    Text-content-sha1: e15c0505d329cff47c3ea9d71001c22e02b148f7
    Content-length: 125
    
    SVN1l1l
    

    One suggested solution is to use add_path. Revision-number: 5475 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 2005-03-10T10:07:27.670263Z K 7 svn:log V 199 Protect against multiple Change Settings dialogues. We should probably also arrange to switch to an existing Change Settings if the user selects the menu item and we already have a Change Settings. K 10 svn:author V 4 owen PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4dccea1d6df7726e11a3306391c796e3 Text-delta-base-sha1: e4305963b159d0de87248d9072f6087d6591a264 Text-content-length: 333 Text-content-md5: 0a02872e024fa030ff6166182250f954 Text-content-sha1: f24e6919190d814d65db71c94bc19ffcd1a05e6a Content-length: 333 SVNcP4kT int reconfiguring;if (inst->reconfiguring) return; else inst->reconfiguring = TRUE inst->reconfiguring = FALSE/>/menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->specialsmenu); inst->specialsitem1 = menuitem; MKMENUITEM(NULL, NULL); Revision-number: 5476 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:37.191884Z PROPS-END Revision-number: 5477 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:37.202333Z PROPS-END Revision-number: 5478 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2005-03-10T11:55:27.305487Z K 7 svn:log V 67 Discussion with `imp' on Mono suggested this possible new feature. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/two-way-keepalives Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1907 Text-content-md5: 27cc4fc05ab0076478d1b2dcba859e75 Text-content-sha1: ed91e1d4bd84c1502b2f306b963ce4dda427a7c2 Content-length: 1917 PROPS-END SVNeeeSummary: An alternative form of keepalive which is two-way Class: wish Priority: low Difficulty: fun Content-type: text/x-html-body

    Anecdotal evidence suggests that at least one type of router is not fooled by PuTTY's current SSH keepalive mechanism (sending SSH_MSG_IGNORE): it ignores them and disconnects idle sessions regardless. I asked the user in question to experiment with using repeat key exchanges as an alternative form of keepalive, and that turned out to work fine.

    This leads me to suspect that the router has noticed that the SSH_MSG_IGNORE keepalives only transfer data in the client-to-server direction: although TCP packets must come back the other way carrying acks, no actual data is transferred down the TCP connection from server to client. Rekeys transfer real data in both directions, so they work better for this purpose. (However, they're very CPU-intensive compared to what a keepalive ought to be.)

    It wouldn't be very difficult to rig up an alternative form of keepalive, at least in SSH-2, which requested an actual response from the server. The obvious approach would be to invent a spurious SSH_MSG_GLOBAL_REQUEST ID which no servers would understand, so that they would respond with SSH_MSG_REQUEST_FAILURE. Much like the OpenSSH "client alive" feature, in fact.

    I envisage this being implemented as a checkbox with wording something along the lines of "Use two-way keepalives where available"; then we could implement it in SSH-2 immediately, and add it to other back end protocols if and when we thought up ways to do it. (For example, it's not entirely impossible that there might be some fiddly way to make it work in Telnet, perhaps by periodically sending IAC WILL followed by a non-existent option number; but I haven't tried it and can't be sure.) Revision-number: 5479 Prop-content-length: 192 Content-length: 192 K 10 svn:author V 5 simon K 8 svn:date V 27 2005-03-10T16:18:51.220714Z K 7 svn:log V 92 Support multiple anchor name types now that Jacob has enhanced Halibut to be able to do so. PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d5c63223a5a11ce7fb114034ce3d30cf Text-delta-base-sha1: b9bf4203898429e8f55f5fc71ec19dd50260a3d6 Text-content-length: 51 Text-content-md5: c700d00e6fede650916958a308fa7384 Text-content-sha1: 69c59398d274da825bb0c1e1289bc301dc44b3d0 Content-length: 51 SVN\ _}html-template-fragment}{%k}{%b Revision-number: 5480 Prop-content-length: 392 Content-length: 392 K 8 svn:date V 27 2005-03-10T16:36:05.997593Z K 7 svn:log V 291 Consistently use a single notation to refer to SSH protocol versions, as discussed. Use Barrett and Silverman's convention of "SSH-1" for SSH protocol version 1 and "SSH-2" for protocol 2 ("SSH1"/"SSH2" refer to ssh.com implementations in this scheme). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f75f53a3a4a005d75305c40deb44f52 Text-delta-base-sha1: 47c5768aad9ee912c0abd0003569487178e4b2e3 Text-content-length: 147 Text-content-md5: e6c824bda055432df5c0305840fcefa8 Text-content-sha1: cafd4da1f2f4e8a31d32c9b802232701cd13047d Content-length: 147 SVN)F@l$y):HAnwX\?[-2 server, you might prefer PSFTP (see \k{psftp}) for interactive use. PSFTP does not in general work with SSH---2) where possible, which does not suffer from this security flaw. If you are talking to an SSH---- Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f2ef3d3ca7f4c3d4e9170e90c5626301 Text-delta-base-sha1: 8701d41a418715fbc9ab528a971bb80131af0849 Text-content-length: 99 Text-content-md5: 616533ebed8abae25bee2da4c686a706 Text-content-sha1: 8e2d92b8b3cfa00fb9cee229c79c05fad9abbf77 Content-length: 99 SVNDD JqJ ;-2 only. (PSCP will also use this protocol if it can, but there is an SSH- Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: abb8b74896e6cb89d992fc9b089dd2b4 Text-delta-base-sha1: 95abfdb17f1c5d34e1a9518780f5feab8f2156c9 Text-content-length: 445 Text-content-md5: 8627c49c1e0ff4f85abaee01ba30d3ff Text-content-sha1: 276da08f1b6a22037cac107ce7e616c34e3ec7d0 Content-length: 445 SVN>Eq>3@_soSRC< S t2$3WnXF]u^ef6F[dtJ-1 protocol. \b An RSA key for use with the SSH-2 protocol. \b A DSA key for use with the SSH-2 protocol. The SSH-1 protocol only supports RSA keys; if you will be connecting using the SSH--------------2 keys come in different formats, the export options are not available if you have generated an SSH----1 and SSH- Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dbc0262f687c3b9b8ced7dc81d252025 Text-delta-base-sha1: 2cdaaca3ef7c0e837fffe80d68d0910ff7311323 Text-content-length: 156 Text-content-md5: e71a4284e9b5bdf70a81a7917e75e057 Text-content-sha1: 7319e4973f5fcece8a83920a4fda0cf1de3d6ccf Content-length: 156 SVN/3t-J@k# #-2 protocol, and not all SSH--1 is unable to support it for remote-to-local ports, while SSH--1}1 or version \I{SSH- Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 156088c6409584677c3a0d224d661f0a Text-delta-base-sha1: 91797c3deda3eabd40f31df27b05851cb45c0557 Text-content-length: 94 Text-content-md5: 2750de23ec9b2f43bc89bd35c97db591 Text-content-sha1: 00875d3ef59e1729da84645f59e10bc46dd4363f Content-length: 94 SVN ?k_k$J[n IOV\(S]&\-----SSH-SSH-SSH-- Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0e55cf03d9dbb7310ead154bb76b531 Text-delta-base-sha1: 36709148e94e6b7e1caa82cf5d8daf1728d0538e Text-content-length: 26 Text-content-md5: 13b81644c5b07a81e4e4bc3ca1952954 Text-content-sha1: b41f55bfdfb5c04c015fb5aa9a099c2c0f7f6439 Content-length: 26 SVNss Z[- Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0dd8a76f71ae0ed7fba8881646c46a60 Text-delta-base-sha1: 50cedd5a1990a5dbe831a3496ca8c6a4e1aefa01 Text-content-length: 26 Text-content-md5: 5a2a80838fb1acd9ce0e51ec83af3401 Text-content-sha1: 95e72369a93432a1869cd5245d7aa94e42114f18 Content-length: 26 SVNqr 898- Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 646cd6bddee9919887a501b179f2a0c5 Text-delta-base-sha1: 0a2564e21dbc18fd530e65c196785d68084976cd Text-content-length: 81 Text-content-md5: f64ba0a025fa7245d4ba11e2d8cea971 Text-content-sha1: 23670ead4a703169a6a80179f4c9bface1999501 Content-length: 81 SVN.5$ bkAl*-#f% -1 and SSH---unrecommended SSH-- Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2d07016214a3c5fc1197c3834463d23c Text-delta-base-sha1: 5b0318f4dcd22f0b7356f5f1e709502c3879332b Text-content-length: 819 Text-content-md5: 49c3d9d14e3e2721f38ba8304b4f64ac Text-content-sha1: c14924b6e9319b29fd81cb8b153c78d999ecbdf6 Content-length: 819 SVN ndmQypGq 9NP aYwCPkG~&Epk`[.;{r/m+G6Yhow?f%75cl'OQw+Ie}ubCWSm89W-----1 and SSH-2 * use this structure in different ways, reflecting SSH-2's * altogether saner approach to port forwarding. * * In SSH---1 this structure is indexed by destination * host:port pair, whereas in SSH--SSH-1 and SSH---------1 and SSH---------------1 and SSH--------_09 ;5Dzy?s}2z/I)=rb/wB go and try password */ } else-------------n" 7E6EL{yJ+Ct->length - 5 + 4 + 20; if (--SSH-- Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f778a28fdc179d421860853cb561c43c Text-delta-base-sha1: 630d79df436295c9a4c3d8b46ef6ec647733ba65 Text-content-length: 269 Text-content-md5: 81108f5819517315a98c779fb529f3ec Text-content-sha1: 626f5bd19363fe4dc5e208a00daf60e49b26c472 Content-length: 269 SVN).'Z4 E~!}6:9pSSH-SSH-2 */ void (*setkey) (void *, unsigned char *key);/* for SSH-2--1 and OpenSSH's SSH-2. */ #define SSH_AGENT_FAILURE 5 #define SSH_AGENT_SUCCESS 6 /* * OpenSSH's SSH-- Node-path: putty/sshblowf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 44a39b171b57a8ad42042bb25590e40f Text-delta-base-sha1: 3d854ae2fad04d4b466eb1a13bd06053b9256b5d Text-content-length: 26 Text-content-md5: 595fff79a27f03e4eb50a81d5df16c7e Text-content-sha1: 17594ee30b7a5acc9c741da59e846b63c9ac1f50 Content-length: 26 SVNBC 44- Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f51fc1d8f9d1853cb31932e25e26173 Text-delta-base-sha1: 593904b71d1594175be967fdfc7a63d0f472d320 Text-content-length: 67 Text-content-md5: 3c314251857fc324ae7cf98bb1c30a6e Text-content-sha1: 03c80b53b6f530677dfa0337ff9944e6780e47f9 Content-length: 67 SVNqv"q[t"Rws oSSH-SSH-SSH-SSH-SSH- Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 95fde56de2b3c113649be883edc1f207 Text-delta-base-sha1: d1d18c1f51a61d97598f5f5f3e0f5d15cffcfeba Text-content-length: 45 Text-content-md5: 663e1c207eab812ee6b06d2373fefe44 Text-content-sha1: 5afcc3a17fb359cde26dd515d727e83964aa57e9 Content-length: 45 SVNqtkHkJ3q--SSH- Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 47ff296d83e8d874994e493d14dc80d7 Text-delta-base-sha1: 9e79d50c2fb8c4f5a6d021ea2f6396a3f0d500fa Text-content-length: 291 Text-content-md5: 26e2c491b9c7253a2e6206034b0b3460 Text-content-sha1: cc8364fbd939bb876bf4674a1aa054cfaae66b35 Content-length: 291 SVN080e]DsA8IyBFD\NbSSH-------1 private key"; break; case SSH_KEYTYPE_SSH2: return "PuTTY SSH-2 private key"; break; case SSH_KEYTYPE_OPENSSH: return "OpenSSH SSH-2 private key"; break; case SSH_KEYTYPE_SSHCOM: return "ssh.com SSH- Node-path: putty/sshsha.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ee2cff525a3df3652a4f46b1776e97c9 Text-delta-base-sha1: b3bf778f17c56f87ba4f3f17ddd162c8253bdee8 Text-content-length: 55 Text-content-md5: cee7edb1e5b8f73cba376050fc470237 Text-content-sha1: 7f23477d42de89b64ea0b18af4f0e4aafee91bb2 Content-length: 55 SVN^_'8&/* * SHA1 hash algorithm. Used in SSH- Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 88afe8947efebfa70cdc1c7d9be8b242 Text-delta-base-sha1: af57a805c7d74e1723bcccd703c81e4dc1726f19 Text-content-length: 50 Text-content-md5: 3d91b2bdff5e70f90a95f4f021829955 Text-content-sha1: 9908ba960eb025858b1ea7ffe9f73dd38d38783c Content-length: 50 SVNEG.-- Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c8e2239d06996d9039b24b9658829e40 Text-delta-base-sha1: 80228e4e5f615a3a654b8614c39fd1f2d5456cda Text-content-length: 22 Text-content-md5: b24c54b2e70a8074cc19714b57e3e05c Text-content-sha1: 6b57e1629d59f746d1e4a695de48ed77d60d9a31 Content-length: 22 SVN-- _M`- Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 584702d844a75dff630e87924dd8a777 Text-delta-base-sha1: a7f1e7b3bf9eff27c3cd9dffb66ee2f817d0108f Text-content-length: 22 Text-content-md5: 31a77e03c9a3df44738a42a0a32c2f06 Text-content-sha1: 354ccb6761d2deef334cde07a4cb971fae8e3346 Content-length: 22 SVN** (- Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c741cd865a51487e4f3ce2f0d6823a8c Text-delta-base-sha1: 4be885d7e10bcea9cc1c0434c099dd1b68b60e6f Text-content-length: 26 Text-content-md5: d77b0b999456a90cf200ad7841d8fad7 Text-content-sha1: 1acca210579ca9d602bb85d4daa71aea1fd14f80 Content-length: 26 SVN ^&_- Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cdc2f2da88b1128829da3d3c9b3d8688 Text-delta-base-sha1: 11c54c87305abe5e39af9e82b7d363e34be04a54 Text-content-length: 222 Text-content-md5: 85407b78e0dcbc530ae6221e70fa34c1 Text-content-sha1: 6cc644a628a485862d731709f529443c39fdcbf1 Content-length: 222 SVNYa')-H.IE= LTdu--&1 key (RSA)"); AppendMenu(menu1, MF_ENABLED, IDC_KEYSSH2RSA, "SSH---&1 (RSA)", IDC_KEYSSH1, "SSH-2 &RSA", IDC_KEYSSH2RSA, "SSH--%d key in an SSH- Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0feb4e640f0ffdd7dbc9ad0c0e1e55d4 Text-delta-base-sha1: 360aad199fa311ca5783fc581f43a0ada49ad9b1 Text-content-length: 80 Text-content-md5: 4a36c63e423dc0091850b278aa91a8bc Text-content-sha1: 1782018fc329ac10e366a1b4642ade525a079cea Content-length: 80 SVNho; 4OM[50I@_ -------- Revision-number: 5481 Prop-content-length: 392 Content-length: 392 K 8 svn:date V 27 2005-03-10T16:36:42.854392Z K 7 svn:log V 291 Consistently use a single notation to refer to SSH protocol versions, as discussed. Use Barrett and Silverman's convention of "SSH-1" for SSH protocol version 1 and "SSH-2" for protocol 2 ("SSH1"/"SSH2" refer to ssh.com implementations in this scheme). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/arcfour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f0568998721919da4b20482251466ba4 Text-delta-base-sha1: c00ff1145578ec5c1e100c2e7b8d7b8b2d9841b1 Text-content-length: 43 Text-content-md5: 49de473e14e310e6be55bc4035873fd6 Text-content-sha1: 2e028f4a1381eeb83e3b23a524406c2ece162a42 Content-length: 43 SVN))'<)c ---- Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e6ab32543b725b8e75b84871a4cc2aa Text-delta-base-sha1: e852a72fc23d50b3a9a2cdaa19c85c2078764999 Text-content-length: 22 Text-content-md5: ab7be6ee0ae9b694eda253288fe6f81e Text-content-sha1: 5c396c47308d74e65942f1df7787bf8b7adab72a Content-length: 22 SVN V K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9545530648445b63c7cf058eea4e76c2 Text-delta-base-sha1: b30b623fb22d0dc5d335334b6136ee6c5068fa78 Text-content-length: 119 Text-content-md5: bd69d8719b2b7c77a0aa6fb712993668 Text-content-sha1: 44711df98cc60b908b5a1fd51413f2ac2392774b Content-length: 119 SVN]i\DfD*E5J^-]7 pA2d:ag,fJ-------------- Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e93bf88dbc876772a80b02e1f09994fb Text-delta-base-sha1: e8f5e15b6c7db4a7cc64928c9621b872a4d3f6ff Text-content-length: 27 Text-content-md5: 6a392141aa7185f058b36c86d0264149 Text-content-sha1: e3bf8f18ddfe2c559459609bec0d85bb9bd038e5 Content-length: 27 SVNCD8YxK- Revision-number: 5483 Prop-content-length: 224 Content-length: 224 K 8 svn:date V 27 2005-03-10T17:04:26.946512Z K 7 svn:log V 125 Make it clear that even when using SSH 2, you only need the SSH-2 pubkey format if you're actually using the SSH-2 protocol. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8627c49c1e0ff4f85abaee01ba30d3ff Text-delta-base-sha1: 276da08f1b6a22037cac107ce7e616c34e3ec7d0 Text-content-length: 406 Text-content-md5: db218f63a923f960ce3d2716d3af8abb Text-content-sha1: ebe3c851f0e04a98f6a0d7e9c1c1306d9a965979 Content-length: 406 SVNERzzYlproduct and is using SSH-2, you need to save a \e{public} key file from PuTTYgen (see \k{puttygen-savepub}), and copy that into the \c{.ssh2} directory on the server. Then you should go into that \c{.ssh2} directory, and edit (or create) a file called \c{authorization}. In this file you should put a line like \c{Key mykey.pub}, with \c{mykey.pub} replaced by the name of your Revision-number: 5484 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2005-03-10T17:06:29.072718Z K 7 svn:log V 69 Fix an "SSH v1" that Jacob missed (because it spanned a line break). K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f5f5a77cb76cc59525e4c5a96f4ef71 Text-delta-base-sha1: c88aad22ac2cd202648188bf314493afbea3b778 Text-content-length: 44 Text-content-md5: 955043d3649a833083affb6d7e891447 Text-content-sha1: 53730a86aacd584617f93fd8dc3d5b20d99cb5e6 Content-length: 44 SVN 8C=-1, a<;; Revision-number: 5485 Prop-content-length: 210 Content-length: 210 K 8 svn:date V 27 2005-03-10T17:08:00.521384Z K 7 svn:log V 111 When we're quoting user-interface text from PuTTY 0.51, we probably shouldn't correct its spelling of "SSH-2". K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1f6f492a00f710e8d21df4a21b5ff046 Text-delta-base-sha1: 288f762fcdd20ecd2bb5713c6b0e2d982e824f0c Text-content-length: 25 Text-content-md5: 34ed82e15ac3119e89f01c38950773b9 Text-content-sha1: 3c166c433390c2d473017263ff1995c5bb419b37 Content-length: 25 SVN K7L Revision-number: 5486 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2005-03-10T17:08:37.479690Z K 7 svn:log V 63 Expand "v" to "version" when discussing SSH protocol versions. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/man-putt.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3d490be41b2a929e1695e1b06d1bbe82 Text-delta-base-sha1: a7aabca67cdea799520c9219639c2206639fad0d Text-content-length: 33 Text-content-md5: 09b15e7f72a198a4b3ff522deeba3569 Text-content-sha1: 5cc5c1e1c518e4d38321e39e793e4c0f97aff61e Content-length: 33 SVNSY GMersion 1 or Revision-number: 5487 Prop-content-length: 412 Content-length: 412 K 8 svn:date V 27 2005-03-10T20:11:27.472975Z K 7 svn:log V 311 Thanks to D H Becker for sending in an icon. I'd have liked to have written a script which would generate the various graphical components of the PuTTY icon suite at any given resolution and then used that to generate the OS X icon as well as all the others, but I can always do that later; this'll do for now. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fad3b3d7c7e84c5126e344f13c05dc2f Text-delta-base-sha1: a7fc90e1d2abe903794242aebb3775198b6999a3 Text-content-length: 39 Text-content-md5: 48c6dc81ed3144d0dbdf3f7e3a444c6c Text-content-sha1: 1628ab3495e91426e8a35d4b5728c2d05a3a1b67 Content-length: 39 SVN CFBundleIconFile PuTTY.icns Node-path: putty/macosx/putty.icns Node-kind: file Node-action: add Prop-content-length: 59 Text-delta: true Text-content-length: 44813 Text-content-md5: 2803458e804ff4c6fe08318f425aa387 Text-content-sha1: 3b2a9d22ebd9766a620076d0de442cefd74f104e Content-length: 44872 K 13 svn:mime-type V 24 application/octet-stream PROPS-END SVN|||icnsics#His32P aokkh:[xrv`I{]$^E}&rI%r{ y?e~uEQ3'> ey==Nq`t{k:*M3;5#'\CW$V P{;|%<'2, q~qtZGE Br{{}{w wԗlD <455"$: aokkh:[xrv`I{]$^E}&rI%r{ y?e~uEQ3'> ey==Nq`t{k:*M3;5#'\CW$V P{;|%<'2, q~qtZGE Br{{}{w wԗlD <455"$:Z_^^a;ZJEEkUOig5\eEQ/]r=yqxZ#H(]ZZK8&yXjh_V vZCET}-L%+,4$_  + 9>*,$$n *,%ʩV *,Y +! X *O!!6c濆E  GrnmniZ6 rg-6tcs_ %ހ ˰qx[֫ txX ^teg iiYEBBET}     #ƂXb -L3U +  Y *,Y *,F9Y */q]Y 3P X %3P!"6cUU%濆E  TDtmiZ6 rg5w tc cǚ s_  >yqxZ#H(]ZZK8&yXjh_V vZCET}-L%+,4$_  + 9>*,$$n *,%ʩV *,Y +! X *O!!6c濆E  GrnmniZ6 rg-6tcs_ %ހ ˰qx[֫ txX ^teg iiYEBBET}     #ȂXb -I(&,@A(?V .&{~p[ +8q{x[ +?9p{[ +Ka;{[ 3$5{Z 75~e 4ƒE  [}j[UTX8 rg tc s_  qxZ#L O%yX ˄PMYh* ,yZDCCET} -I25?L1   .&{L!I +: ;n +7xqĉX +8w[ .&,{Z ,T~eƒE  IqZTVVUUVTX8 rg-6tcɁ s_ %ހ ˰qx[֫ txX ^teg iiYEBBET}  l8mkB%!,,''''''''''('C%!h&G*'%&f:!,:'5'C"''''''''*''('((C% Fڼ$=+'',!7=ich#H??ih32 0/UFDEDJVK# >ۆZ Rԋ] kstqvςjU 0LuV *FvV 5UuV 5 ")TuV 5 bqTuV 5 TuV 8, UuV -W QuV CtU !' ',++),s~_ K ֬}~X  УL\~E +.NFKOF@ >HFl%R׀m䡀0~"-,5*dhedab`d1) A{t|5Y2޼~c}2JQBS/~R0552?ukmuC(y &S{ ӯ_ \{D'jk`YSP0MX _hSOPPOUjvb 1xov~~{2T6!D'"(2=@=2"6S 4 ^3i ;3ޑ q^ k83ސ x>0t03ސ $ ym/3ސ yp/3ޑenyp/3ގ1;yp/4ဉ yo/ 2/(++*))+*'E||2&ֆǐyw, 淖m, 5xj" ,JB@ A?AO+*XvJ2\ )vdbe c^qvaTvڕo_ׄۂԜjl^~ڤU53535Ucx`&nө2 2d=v^P^p, $*'&&,8@9(&KB/UFDEDJVK# >ۆZ Rԋ] kstqvςjU 0LuV *FvV 5UuV 5 ")TuV 5 bqTuV 5 TuV 8, UuV -W QuV CtU !' ',++),s~_ K ֬}~X  УL\~E +.NFKOF@ >HFl%R׀m䡀0~"-,5*dhedab`d1) A{t|5Y2޼~c}2JQBS/~R0552?ukmuC(y &S{ ӯ_ \{D'jk`YSP0MX _hSOPPOUjvb 1xov~~{2T6!D'"(2=@=2"6S 4 ^3i ;3ޑ q^ k83ސ x>0t03ސ $ ym/3ސ yp/3ޑenyp/3ގ1;yp/4ဉ yo/ 2/(++*))+*'E||2&ֆǐyw, 淖m, 5xj" ,JB@ A?AO+*XvJ2\ )vdbe c^qvaTvڕo_ׄۂԜjl^~ڤU53535Ucx`&nө2 2d=v^P^p, $*'&&,8@9(&KB/UFDEDJVK# >Z Rԋ] _SRQPUхjU ,&&auV ({xV Z 40MswV ITuwV J1vwV  pl /vwV ,EO +vwV .%ƀvwV  "vvU *  u_  y~X ʻK\~E ;ZOLIA;;<;IFl% m䡀0 dhedab`d1{t|5 ޼~c}2JQB ?O0552?ukmuCxֱ_ \{Db_[Z[^?ihSOPPOUjvb 1uVS\[X\h>)@'"(2=@=2"6S 4%5ioD%4jCn73m/>t03n*iʠtn/3n4  ~ހsq/3o)ƅtq/4k BÆtq/ 6Z0%sĆtp/ 3ޏ=ͅw}2&ϊxw,Ʌ ưn+ 5xj" ,KB<;< ;@P,*XvJ2\ )vdbe c^qvaTvڕo_ׄۂԜjl^~ڤU53535Ucx`&nө2 2d=v^P^p, $*'&&,8@9(&KBh8mk  xsi78122222222}2n"406+WӴn Bv "522220C$:1)ң$W-222222222222225"/323/tW-31wj/z1g[ax it32FK   %5=:41 48==;93( 'Fdqm`[ `iookh\I0%Ku kG,  .WܙȽ^: (?e òiC"  (Kt ǭeB# ?t ͯ{x~x^?! W֚Ġ~hhqp[?! e۱œxcdop\?" jtSQRSThϽygirq[?" iɃ<0X~lpwr[>! la 4hotys[>! nV&\pt{s[>! m[ ,`ot{s[>! ke 7kosys[>! jj=oosys[>! jj=oosys[>! jj=oosys[>! jj=oosys[>! jj =oosys[>! jj?\eS=oosys[>! jj-s͏*=oosys[>! jj @v=oosys[>! jj Tӄ(=oosys[>! jj %rՃ)=oosys[>! jj 8փ'=oosys[>! jj K݇$=oosys[>! jki%=oosys[>! jn  7.=oosys[>! jn Sݖ2=oosys[>! jc &pܔ,=oosys[>!  nD  :ޒ, 8losys[>! #wlO0-dosys[>! ${}%!k3(`osys[>! e` 55 5iosys[>! 0+K =1W~pu~w^@! $i D ;QZ[k|r{gE!  8 G 'cxr~kF!K H  4׌«vpw{aB!#h J  ;ֽyojh]G/  9 N 1иp\K;'#;MUXTE. O S!lЏõmM2 Dm{S- %h UNy}_;   6,:nǠ{]= K  2KqӨ~ccnp[?" !b $,?CBA@BPeƚrZ[in\A#  5}u0%/56;>;87:?;3( #kֳr_amo\@" G֬u;oЇӁշujmur[?! !_ˏE e͵xspww_A#  4~ Ʉ6 .dϸsnoshF%  Fo(9qѹwkimtlH'  !\_;oщɸohhls}aC$     3{לM 0dòqedjpsvtdK3%5=:41/+Dˉ:  &W`NUbq{h_dqyvo`J3#' 'Fdqm`[[XK2Eu+9H\|vS2 ,=Sn~iajxtaJ0 )%KuS% jtSQRSTSRQSW\agji\E% %rʁ2  /2+ $'*,-,*'$#0<=3! iɃ< )vm!      la*yVnV,}ڛA m[ -ц0  ke3s ! jj FOmѲmovr[>! jj Mݖ: Gϭnpwr[>! jj Qv#(corxs[>! jjUQ;posys[>! jj Y< Bsosys[>! jj Zܙ5Arosys[>! jj Z{$>posys[>! jj 1g=oosys[>! jjBZ =oosys[>! jj5G =oosys[>! jj&,=oosys[>! ke 8losys[>! m[ -dosys[>! nV(`osys[>! la 5iosys[>! hƂ=1W~pu~w^@!dx[Z[k|r{gE!^׵xr~kF!T«vpw{aB!Fֽyojh]G/ =sиp\K;'#;MUXTE. 5b՝õmM2 Dm{S-  )Lq}_;   5ee5 :nǠ{]=  3hj52KqӨ~ccnp[?" +@hѡoRMIEB@ABCBA@BPeƚrZ[in\A#  +OuΫֳr_amo\@" @vӁѡӁշujmur[?! T͵xspww_A# ]ϸsnoshF% \ѹwkimtlH' VԽƒɀՉɸohhls}aC$ Vɭ qedjpsvtdK3 [ˬ qbUNUbq{h_dqyvo`J3#]б nS=, ,=Sn~iajxtaJ0  Wͱ `A( (A`sjpyxeK0  N Z;"";Z|xteJ0 E~ո aF1  1FamO0 :kǽ o]NC;CN]oɿ`8   +Ns~ ~|voic^[^ciouuv|xJ .EZdaYWVVWXZ\^`aba`^\XQOSg[/  %29855665 45568;AEIMOMIEA92/3BXlo[> $'*,-,*'$#0<=3!        %5=:41 48==;93( 'Fdqm`[ `iookh\I0%Ku kG,  .WܙȽ^: (?e òiC"  (Kt ǭeB# ?t ͯ{x~x^?! W֚Ġ~hhqp[?! e۱œxcdop\?" jtSQRSThϽygirq[?" iɃ<0X~lpwr[>! la 4hotys[>! nV&\pt{s[>! m[ ,`ot{s[>! ke 7kosys[>! jj=oosys[>! jj=oosys[>! jj=oosys[>! jj=oosys[>! jj =oosys[>! jj?\eS=oosys[>! jj-s͏*=oosys[>! jj @v=oosys[>! jj Tӄ(=oosys[>! jj %rՃ)=oosys[>! jj 8փ'=oosys[>! jj K݇$=oosys[>! jki%=oosys[>! jn  7.=oosys[>! jn Sݖ2=oosys[>! jc &pܔ,=oosys[>!  nD  :ޒ, 8losys[>! #wlO0-dosys[>! ${}%!k3(`osys[>! e` 55 5iosys[>! 0+K =1W~pu~w^@! $i D ;QZ[k|r{gE!  8 G 'cxr~kF!K H  4׌«vpw{aB!#h J  ;ֽyojh]G/  9 N 1иp\K;'#;MUXTE. O S!lЏõmM2 Dm{S- %h UNy}_;   6,:nǠ{]= K  2KqӨ~ccnp[?" !b $,?CBA@BPeƚrZ[in\A#  5}u0%/56;>;87:?;3( #kֳr_amo\@" G֬u;oЇӁշujmur[?! !_ˏE e͵xspww_A#  4~ Ʉ6 .dϸsnoshF%  Fo(9qѹwkimtlH'  !\_;oщɸohhls}aC$     3{לM 0dòqedjpsvtdK3%5=:41/+Dˉ:  &W`NUbq{h_dqyvo`J3#' 'Fdqm`[[XK2Eu+9H\|vS2 ,=Sn~iajxtaJ0 )%KuS% jtSQRSTSRQSW\agji\E% %rʁ2  /2+ $'*,-,*'$#0<=3! iɃ< )vm!      la*yVnV,}ڛA m[ -ц0  ke3s ! jj FOmѲmovr[>! jj Mݖ: Gϭnpwr[>! jj Qv#(corxs[>! jjUQ;posys[>! jj Y< Bsosys[>! jj Zܙ5Arosys[>! jj Z{$>posys[>! jj 1g=oosys[>! jjBZ =oosys[>! jj5G =oosys[>! jj&,=oosys[>! ke 8losys[>! m[ -dosys[>! nV(`osys[>! la 5iosys[>! hƂ=1W~pu~w^@!dx[Z[k|r{gE!^׵xr~kF!T«vpw{aB!Fֽyojh]G/ =sиp\K;'#;MUXTE. 5b՝õmM2 Dm{S-  )Lq}_;   5ee5 :nǠ{]=  3hj52KqӨ~ccnp[?" +@hѡoRMIEB@ABCBA@BPeƚrZ[in\A#  +OuΫֳr_amo\@" @vӁѡӁշujmur[?! T͵xspww_A# ]ϸsnoshF% \ѹwkimtlH' VԽƒɀՉɸohhls}aC$ Vɭ qedjpsvtdK3 [ˬ qbUNUbq{h_dqyvo`J3#]б nS=, ,=Sn~iajxtaJ0  Wͱ `A( (A`sjpyxeK0  N Z;"";Z|xteJ0 E~ո aF1  1FamO0 :kǽ o]NC;CN]oɿ`8   +Ns~ ~|voic^[^ciouuv|xJ .EZdaYWVVWXZ\^`aba`^\XQOSg[/  %29855665 45568;AEIMOMIEA92/3BXlo[> $'*,-,*'$#0<=3!        %5=:41 48==;93( 'Fdqm`[ `iookh\I0%Ku kG,  .WܙȽ^: (?e òiC"  (Kt ǭeB# ?t ͯ{x~x^?! WΙơ~hhqp[?! eಕ{Ǡycdop\?" jvPI@62Hpġ|girq[?" iʅ=%N~lpwr[>! l\  !Iv~otys[>! nܢI,/5;BEB;5/,>_{pt{s[>! mۜE&Tqvvq|xot{s[>! kۚFT Ȁƺvosys[>! jؖD .y׊ ĭƤ~tosys[>! jؔA4ݞU25! jؕB2͉/ [ ȣ}tosys[>! jڗE -uцl(Ĥuosys[>! jژE +pɄ֘Måuosys[>! jژE )mǃς5 åuosys[>! jژE (lǂu&åuosys[>! jژE *oȀ ]%åuosys[>! jڗE2}ѭx;:åuosys[>! jؕB>|Coåuosys[>! jؔAGx* ]åuosys[>! jؖDFy%^åuosys[>! jۜJ:uXdåuosys[>! jݤS %>-aåuosys[>! j[ Uåuosys[>! j\Påuosys[>!  nM Tåuosys[>! #wՀ%Råuosys[>! ${~-Jåuosys[>!  e`!Håuosys[>! 5.LǨupu~w^@!  Gͫur{gE! CЭur~kF! :ȩupw{aB! ;ϻ{ojh]G/  5܍p\K;'#;MUXTE.  'rûmM2 Dm{S-  S{~_;  :nǠ{]=  2KqӨ~ccnp[?" ,?CBA@BPeƚrZ[in\A# %kֳr_amo\@" $tЇӁշujmur[?! ,{͵xspww_A#  0|ϸsnoshF%  2xѹwkimtlH'  4lԉɸohhls}aC$    5hqedjpsvtdK3%5=:41/+  jvPI@621//159>CJR[caO. %..($'*,-,*'$#0<=3! iʅ=          l\  nܢI,/5;B4   mۜE&Tqvn5  &  kۚFT{+ AQG2 jؖD .y׊@  &\}`C$ jؔA4B   ,^lH' jؕB2ݛ: ;\whF% jڗE -uчؔ2  Ttus}y_A# jژE ,qɆ, -qnqxs[>! jژE ,qɅs( >movr[>! jژE ,qɄy$K}npwr[>! jژE ,qɃއ'"gɯworxs[>! jژE ,qɁɆ)*Τ~tosys[>! jژE ,qɁƂ. 0У|tosys[>! jژE ,qɁޟE  ;ͣ}tosys[>! jژE ,qɁv#^Ǥuosys[>! jژE ,qɀT  5åuosys[>! jژE ,qɀ> C¥uosys[>! jژE ,qɀ2 U¥uosys[>! jژE ,qɀ2 "cåuosys[>! kؕ@ %mǀ= 1xåuosys[>! m֍5cÀe Jåuosys[>! nՊ/^€a2 &Iåuosys[>! lג< "jƁ ƥåuosys[>! ha2,Iւ Ǩupu~w^@! d˔ojͫur{gE! ^ǰܛЭur~kF! Tȩupw{aB! Fϻ{ojh]G/  =sݙp\K;'#;MUXTE.  5bǼmM2 Dm{S-  )Lq~_;   5ee5 :nǠ{]=  3hj52KqӨ~ccnp[?" +@hѡoRMIEB@ABCBA@BPeƚrZ[in\A#  +OuΫֳr_amo\@" @vӁѡӁշujmur[?! T͵xspww_A# ]ϸsnoshF% \ѹwkimtlH' VԽƒɀՉɸohhls}aC$ Vɭ qedjpsvtdK3 [ˬ qbUNUbq{h_dqyvo`J3#]б nS=, ,=Sn~iajxtaJ0  Wͱ `A( (A`sjpyxeK0  N Z;"";Z|xteJ0 E~ո aF1  1FamO0 :kǽ o]NC;CN]oɿ`8   +Ns~ ~|voic^[^ciouuv|xJ .EZdaYWVVWXZ\^`aba`^\XQOSg[/  %29855665 45568;AEIMOMIEA92/3BXlo[> $'*,-,*'$#0<=3!     t8mk@,bҙ\$,bҙ\$G|f'$pktou Revision-number: 5491 Prop-content-length: 436 Content-length: 436 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-11T15:52:59.868769Z K 7 svn:log V 335 Retire MINGW32_FIX. It was a fix for a blatant bug in MinGW's windres, which was fixed in CVS in 2000 (I think); and we now depend on MinGW much more recent than that for various other reasons. I've tested with my current MinGW (around 2.0.0 vintage) and the original symptoms (dodgy characters in edit boxes) don't appear to show up. PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fc57f98c4d590e76287f9648522626a3 Text-delta-base-sha1: ff9c553296bef42ccf579e3def7a0ce91ac893f3 Text-content-length: 23 Text-content-md5: cc99362e436fc2e181e2f8214792f846 Text-content-sha1: 967add503335f796094fafca22124b6d398d0dfc Content-length: 23 SVNm e| Node-path: putty/windows/rcstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ea334b82b0397c6972e68efe085c37b Text-delta-base-sha1: b81f8faba171369ac45b88aadfaff9916950b5d6 Text-content-length: 44 Text-content-md5: 84edb831c5974a36f43bd762a9d53e96 Text-content-sha1: 3508a867450444f8189b3e2bd853369c6ccee231 Content-length: 44 SVNn1endif /* PUTTY_RCSTUFF_H */ Revision-number: 5492 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2005-03-11T17:41:53.806571Z K 7 svn:log V 18 Further thoughts. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/terminal-modes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8d5e2b90b41b493eb41f4c519bfc11af Text-delta-base-sha1: 1be7b6167bcaac39b081397870f9a75cb15ad348 Text-content-length: 481 Text-content-md5: 7fd71e6a085d6c32e3985f9f4c92a39d Text-content-sha1: ce0d833dcdc54ac04df7d49270d6f80576e2e714 Content-length: 481 SVN%gC5&SSH-1 and SSH-lso, various servers do not have sane defaults for various terminal modes. (Neither SSH nor POSIX define any defaults; they leave them up to the implementation, so such servers are within their rights.) Therefore PuTTY should probably send suitable values for certain modes by default, and in any case allow users to tweak them. (Often stty on the server can be used as a workaround, but some servers may not have this ability.) Revision-number: 5493 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2005-03-11T18:17:50.641563Z K 7 svn:log V 15 download24.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 53c68ce2c8c3ebdc76f457df69be3592 Text-delta-base-sha1: b9450b845cc00d68bd40267a414d522fa92dcb3d Text-content-length: 68 Text-content-md5: 973ebc7438ebca1cdba4267d2225a956 Text-content-sha1: e148a7a7a3860ba02048913005ed11ba730fda2a Content-length: 68 SVNXK)EJ~Ewww.download24.org/putty/">download24.org Revision-number: 5494 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2005-03-11T18:36:53.017546Z K 7 svn:log V 112 Administrivia: after the recent FAQ renumbering, update all the FAQ links, hopefully so they won't break again. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/function-keys Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b7325938631305e85bb1ad88a92a2eec Text-delta-base-sha1: 14aedb5ce55bda76c742393a35e4fa9b27776d3f Text-content-length: 64 Text-content-md5: 8bfe0abbaf7cf814235900be880c8cbf Text-content-sha1: a9246b2df56cf8a36d6c5c23441bfdc99c47ff8b Content-length: 64 SVNT +j the FAQ Node-path: putty-wishlist/data/osc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7d51c208a2c5a654f7aba6ba1f37205a Text-delta-base-sha1: c9d78331bf0d246562e79b05692a4da24ae8f58e Text-content-length: 35 Text-content-md5: bc75f37322b6f9ac8a92fec4a5cae66f Text-content-sha1: 0ec586fee8015fdd3d946a6a054b63b97c70241b Content-length: 35 SVNU\ \rcfaq-puttyputty Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 11cd94f62a4dd948998f9408089c273d Text-delta-base-sha1: 0fd1c2655cc580ae6c782534db24ec6cac6b3781 Text-content-length: 50 Text-content-md5: f8a361749c6983b47fce2b81574d0bb5 Text-content-sha1: eb5706fb8144dcc362fe8e006a830d1243bf8d2d Content-length: 50 SVN)/" faq-mac-port">FAQ entry Node-path: putty-wishlist/data/port-unix Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a859e4eb8c7eb4be1283ec71334a70d2 Text-delta-base-sha1: 843d807018ce1de8ac61911cfefa57e0dea341ff Text-content-length: 50 Text-content-md5: 67e9e7327dbda8c2cb14dfb6e0dc0b4b Text-content-sha1: 139281eaff5ccb8b9148e242acdf2a71e5575246 Content-length: 50 SVNxK WV" the PuTTY FAQ. Node-path: putty-wishlist/data/remember-password Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1998269872722af0e204986ac97fe5d2 Text-delta-base-sha1: ada95ed32de2d1d7329db4aa0d03a5bf5cc48c7c Text-content-length: 60 Text-content-md5: 7150d5bfc6ad30af1713f8936e7373a4 Text-content-sha1: 1fd04b23270524396498d6f424c5d801afcda9a6 Content-length: 60 SVNy,M../faq.html#faq-password-remember">FAQ. Node-path: putty-wishlist/data/startup-fullscreen Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b1a7e8c770ddb3fa6dd3ac6cf89410d4 Text-delta-base-sha1: dba54065b19ebdee95dbc46d3b3179f6a7620875 Text-content-length: 45 Text-content-md5: 2f0c6f1654579870be35ee9b4e84e98b Text-content-sha1: 87f17cb9f534ef3732b338dac89c4e8a1afe455d Content-length: 45 SVNS*  M../faq.html#faq-startmax Node-path: putty-wishlist/data/term-reset-title Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 46270dc63d2a07b570370b8ba0eeb34c Text-delta-base-sha1: 74fadb7623d53bd0adb74bbef8f6efa7735e2b06 Text-content-length: 52 Text-content-md5: 4097d5ab9f831ac0be960a842a6bcddc Text-content-sha1: dd2e7bb20bcb52be7d230e82c62bb6afb2469a0b Content-length: 52 SVNn ^p(../faq.html#faq-wintitle">trash Node-path: putty-wishlist/data/unicode-mappings Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 890ee8d02e279e3d13ebe004e53e29a1 Text-delta-base-sha1: 4063d7122c98a8335b4847279c79660138111df3 Text-content-length: 54 Text-content-md5: a0e69f2c5b73cb8a5d44ae04669e3e23 Text-content-sha1: 46c2b25325e75950ceac5f8488754d60c0ed88e8 Content-length: 54 SVNvL !%p gratemyl.comwww.download24.org/putty/">download24.org Revision-number: 5497 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2005-03-11T23:50:11.347463Z K 7 svn:log V 18 putty.giga.com.br K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f51e99bec970927428ed0ab90c4b8f8 Text-delta-base-sha1: df3aa9e1e406514feb98f1639b29147e5527d596 Text-content-length: 72 Text-content-md5: 793141f3c5900d9edb848d9faa6a613d Text-content-sha1: 25cd7f685fa7c2635ecd6163e793ceb192f5bd72 Content-length: 72 SVN:(-cAWcgiga.com.br/">putty.giga.com.br in Brazil Revision-number: 5498 Prop-content-length: 358 Content-length: 358 K 7 svn:log V 257 Add ability to specify Subversion rev "r1234" as version in appropriate fields. It's probably not fair to our users to put it in "fixed-in", at least not on its own, but it's supported; it's more likely to be useful (to us) in "absent-in" and "present-in". K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-14T01:24:34.142565Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 80ff045a32a79941967b4ae1337223f3 Text-delta-base-sha1: ddf7cd6535fcb81fd6937193d75b965d1e4232b8 Text-content-length: 1229 Text-content-md5: 20e4e890524dd9daf347caeb2b47f887 Text-content-sha1: c10a4bc80718db9108528a1c4f925dc703204f73 Content-length: 1229 SVN_? KR@1!Cze/revs - it's used to # automatically mark bugs which were fixed before the relevant # snapshot date/rev as also being fixed in a release. # (Date and/or rev are only necessary for releases made since # these capabilities were added to this script - older releases # are all explicitly marked in the wishlist data.) # Obviously branch releases need special handling here. @releases = ( [ "0.54", "2004-02-12" ], [ "0.55", "2004-08-02" ], [ "0.56", "2004-10-13" ], # branch date -- released on 2004-10-26 [ "0.57", "2004-10-13" ] # released on 2005-02-20, from 0.56 branch # [ "0.58", "YYYY-MM-DD", "rXXXX" ] : populate with trunk revmap { my ($rel, $rel_date, $rel_revFor revisions we have to compare numerically. if (($ver =~ m/^\d{4}-\d{2}-\d{2}$/ and $ver le $rel_date) or (defined($rel_rev) and $ver =~ m/^r\d+$/ and substr($ver,1) <= substr($rel_rev,1))) { # We add the release version in parentheses so that it's # distinguishable from one in the source data. push @extra_fixed, "($rel)"; } || $ver =~ m/^r\d+$/) Node-path: putty-wishlist/control/spec Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1d3fc6525cce22b48c739037bc172e4c Text-delta-base-sha1: 84134379b022386cc4394448d52c2712454f67ce Text-content-length: 62 Text-content-md5: 8d61ffb163fc67d8e31d3e1681fc7d21 Text-content-sha1: 4d76e1c60f5a12734374bae068a7b100a11b9a87 Content-length: 62 SVNy: ),e r1234 Indicates a Subversion revision Revision-number: 5499 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Summary: x86 bignum optimisation for more compilers Class: semi-bug K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-14T01:43:44.335944Z PROPS-END Node-path: putty-wishlist/data/optimise-bignum-x86 Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 654 Text-content-md5: b2e1848e27370f1e14e4e48647746108 Text-content-sha1: c309f9e301020552be747f5db8c133ee4e04fae3 Content-length: 664 PROPS-END SVNSummary: x86 bignum optimisation for more compilers Class: semi-bug Difficulty: tricky Priority: medium sshbn.c contains conditionally-activated optimised code for x86 processors which uses 32-bit chunks instead of 16-bit ones, and a small amount of inline assembler to force fast arithmetic with these chunks. This makes a noticeable difference to bignum operations such as at SSH connection setup. We only have appropriate compiler goop for GCC currently, so this code will only be activated on many Linux/Unix x86 builds and MinGW/Cygwin Windows builds; in particular, it's not in our standard builds, which are done with MS Visual C. Revision-number: 5500 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2005-03-14T01:49:02.783068Z K 7 svn:log V 72 Add note about other processors (particularly Mac), and rename to suit. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/optimise-bignum Node-kind: file Node-action: add Node-copyfrom-rev: 5499 Node-copyfrom-path: putty-wishlist/data/optimise-bignum-x86 Text-copy-source-md5: b2e1848e27370f1e14e4e48647746108 Text-copy-source-sha1: c309f9e301020552be747f5db8c133ee4e04fae3 Text-delta: true Text-delta-base-md5: b2e1848e27370f1e14e4e48647746108 Text-delta-base-sha1: c309f9e301020552be747f5db8c133ee4e04fae3 Text-content-length: 493 Text-content-md5: ef9fb5e1605cda0e77b9475c88ec6659 Text-content-sha1: 92914bb967b9a0b039332b38e2f35385e965db5c Content-length: 493 SVNg XC1Summary: Bignum optimisation for more x86 compilers / more processo/x86 currently, so this code will only be activated on many Linux/Unix x86 builds and MinGW/Cygwin Windows builds; in particular, it's not in our standard Windows builds, which are done with MS Visual C. It would be nice if we could enable the C bit of the optimisation on more processors. In particular, it might be handy on the Mac port, if any of the slower Mac processors can get anything out of it. Node-path: putty-wishlist/data/optimise-bignum-x86 Node-action: delete Revision-number: 5501 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2005-03-14T01:51:17.052764Z K 7 svn:log V 25 Mention ser2net for Unix K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd1d71faeae257932592dbb0cebc21c2 Text-delta-base-sha1: aee2d58d9bfffb5adf40e8f50a2f8b786c67b766 Text-content-length: 107 Text-content-md5: 4ab041d665827cfbe6da1583a75baefe Text-content-sha1: aa0cf1c4f59eb3b99cb6f1c78cceb9e747003e43 Content-length: 107 SVNb;ZaZ Similarly, on Unix, you could use ser2net. Revision-number: 5502 Prop-content-length: 137 Content-length: 137 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-14T01:56:39.665198Z K 7 svn:log V 37 Consistent indenting in option specs PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 602051be87f0bde5ce7d7d174a229f91 Text-delta-base-sha1: 595c3b4bcd26d57b18b696bb5287bf63b6149d21 Text-content-length: 209 Text-content-md5: f862a94af12f270bdbb85c619d988ea7 Text-content-sha1: de1246600ce4fad04335a113bcc003d3a4565c5a Content-length: 209 SVN~~ 6I6 { WILL, WONT, DO, DONT, TELOPT_OLD_ENVIRON, OPTINDEX_OENV, INACTIVE }; static const struct Opt o_nenv = { WILL, WONT, DO, DONT, TELOPT_NEW_ENVIRON, OPTINDEX_NENV, REQUESTED Revision-number: 5503 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2005-03-14T15:01:16.515300Z K 7 svn:log V 33 Yes, it breaks PuTTYtel as well. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/pterm-logtype-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a30fdec8be25dbd13c4d26d37556c21 Text-delta-base-sha1: fb5c9fa62fb54828f1fc6412a4eafbb1e84c2070 Text-content-length: 90 Text-content-md5: f53d54287e98b04e24946edad6afc5f1 Text-content-sha1: de8a6931dc3be493a247e0d34484249a32939416 Content-length: 90 SVN EtJ< can't represent the saved setting in its dialogue box. T settings. Revision-number: 5504 Prop-content-length: 216 Content-length: 216 K 7 svn:log V 115 Summary: Double-byte character set (CJK, &c) display is broken Class: semi-bug Difficulty: tricky Priority: medium K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-14T16:00:19.178025Z PROPS-END Node-path: putty-wishlist/data/dbcs-breakage Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2697 Text-content-md5: 170aeefd4ef250f64669b01b719775de Text-content-sha1: ea6c41c6d7ac9b788b8c22e20729ad90cd3d4db4 Content-length: 2707 PROPS-END SVN{{{Summary: Double-byte character set (CJK, &c) display is broken Class: semi-bug Difficulty: tricky Priority: medium Content-type: text/x-html-body

    We've had a report that Korean display got a lot worse in the snapshots between r5002 and r5003 <000001c513c9$e63ae1e0$aa000059@ktd>. Quoth Simon:

    Looking at the code, I think I can see why this is happening. This is to do with RDB's idea that when the user selects `use font encoding' and a font with a DBCS encoding, the terminal code should simply store the individual bytes in individual character cells and rely on do_text() being passed a string of these so that TextOut() can reconstitute pairs of DBCS bytes into double-width characters.

    As far as I can tell, terminal.c does not mark the first byte of a DBCS character stored in this way. Therefore, the mechanism is fundamentally dependent on a do_text() run happening to begin at the correct point mod 2! Hence the comment in the mail referenced above, which said that there was already some breakage when the cursor moved over a double-byte character - the half-character under the cursor cannot be properly redrawn. Owing to `font-overflow', though, when you move the cursor over a double-byte character we now redraw a lot of text to the right of that as well, and if the cursor is on the first half of the character then this is bound to be incorrect mod 2; so the problem shows up a lot more readily. I'd bet that the same breakage could have been seen in previous versions if the window was covered and re-exposed when the cursor was in a problem position.

    A real fix for this would involve implementing proper DBCS support, by detecting DBCS lead bytes in the terminal.c input data stream and storing both bytes in the same character cell using the existing UCSWIDE mechanism. I have occasionally wondered about doing this: I envisage that we would co-opt the top half of the unsigned long space (never used by any flavour of Unicode/UCS ever) to provide more than enough fake character encodings for the purpose.

    Of course, if we were going to support DBCSes in terminal.c it would also be good to be able to support them properly, by translating them to Unicode on input.

    Summary: I think this has always been broken, and now it's merely more obviously broken. I regret the effect on CJK users who had found the previous behaviour worked just about well enough, but I don't think a hurried fix is in the general interest.

    Revision-number: 5505 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2005-03-15T10:43:29.797387Z K 7 svn:log V 24 Fix pterm-logtype-crash K 10 svn:author V 4 owen PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f3990265e1a705882a990dcc3982cb71 Text-delta-base-sha1: 8def2a230adbd04ad65dda000a270ae6c4131af1 Text-content-length: 797 Text-content-md5: f6d99e2bfe3d887c7f6315d7bc927a6c Text-content-sha1: c87059a6beae06170f506bfc15c31f33c865c9a5 Content-length: 797 SVN="m7E*S-'!!iTloggingbuttons This function works just like the standard radio-button handler, * but it has to fall back to "no logging" in situations where the * configured logging type isn't applicable. */ if (event == EVENT_REFRESH) { for (button = 0; button < ctrl->radio.nbuttons; button++) if (cfg->logtype == ctrl->radio.buttondata[button].i) break; /* We fell off the end, so we lack the configured logging type */ if (button == ctrl->radio.nbuttons) { button=0; cfg->logtype=LGTYP_NONE; } button = dlg_radiobutton_get(ctrl, dlg); assert(button >= 0 && button < ctrl->radio.nbuttons); cfg->logtype = ctrl->radio.buttondata[button].i;loggingbuttons Revision-number: 5506 Prop-content-length: 112 Content-length: 112 K 10 svn:author V 4 owen K 8 svn:date V 27 2005-03-15T10:52:43.592341Z K 7 svn:log V 13 Mark as done PROPS-END Node-path: putty-wishlist/data/pterm-logtype-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f53d54287e98b04e24946edad6afc5f1 Text-delta-base-sha1: de8a6931dc3be493a247e0d34484249a32939416 Text-content-length: 39 Text-content-md5: 93c1e54b08f93afdf1f0ee6116ead79f Text-content-sha1: 8b0d129b9e967fb958961592e48abb7ba28390a8 Content-length: 39 SVN`$_Fixed-in: 2005-03-16 Revision-number: 5507 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:41.452773Z PROPS-END Revision-number: 5508 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2005-03-15T20:34:08.890538Z K 7 svn:log V 59 Add protection against multiple Change Settings dialogues. K 10 svn:author V 4 owen PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b3c8340fb27a4762fc3292d4c0d74540 Text-delta-base-sha1: e1e4537576c22ca5c33ca712991e683ed1735d23 Text-content-length: 281 Text-content-md5: 74404484c1d2fd9b99e103bff039f478 Text-content-sha1: 96b56583f7fd640fe109068a1e6e2caafff30cf2 Content-length: 281 SVNk^?\^qstatic int reconfiguringif (reconfiguring) break; else reconfiguring = TRUE reconfiguring = FALSE{puu{19); break; case VK_F9: code = (keystate[VK_SHIFT] & 0x80 ? 33 : 20); break; case VK_F10: c Revision-number: 5509 Prop-content-length: 126 Content-length: 126 K 10 svn:author V 4 owen K 8 svn:date V 27 2005-03-15T20:40:01.725358Z K 7 svn:log V 27 Fixed on Unix and Windows. PROPS-END Node-path: putty-wishlist/data/multi-changesettings-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 92052fa298494d09347e51d955963e57 Text-delta-base-sha1: 29ca9c3e9c31f561cbc26710dfc0a06d492477de Text-content-length: 289 Text-content-md5: a3c06511bfde28430307e0b65a4a5ad9 Text-content-sha1: b2e44f1ef3933891230ecedd8ff921488c157fa3 Content-length: 289 SVNOZ dlcvfixed-in: 2005-03-16As of 2005-03-16, this should be the case in both the Unix and Windows ports. In neither case is this done particularly elegantly; we should (but don't) arrange to give focus to an existing Change Settings window if the menu item is reselected. Revision-number: 5510 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2005-03-15T23:06:55.068937Z K 7 svn:log V 16 putty.tolix.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 793141f3c5900d9edb848d9faa6a613d Text-delta-base-sha1: 25cd7f685fa7c2635ecd6163e793ceb192f5bd72 Text-content-length: 54 Text-content-md5: aba8b66e556caff2746817f95542aacf Text-content-sha1: 291151c49683cf279a443ac40496a85e2fdab46b Content-length: 54 SVN(xI86rtolix.org/">putty.tolix.org Revision-number: 5511 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2005-03-16T13:13:44.300025Z K 7 svn:log V 36 Telnet option-negotiation can loop. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/telnet-option-loop Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 634 Text-content-md5: 800e3c5fca61ce3adec49ecd10a40e77 Text-content-sha1: 11a28a8d6fe4297e0e35dbaff4f34555e95dc8b7 Content-length: 644 PROPS-END SVNlllSummary: PuTTY violates RFC-854 option-loop prevention Class: bug Priority: medium Difficulty: fun Present-in: 0.57 Content-type: text/plain RFC 854 includes the following rule to prevent option-negotiation loops: b. If a party receives what appears to be a request to enter some mode it is already in, the request should not be acknowledged. This non-response is essential to prevent endless loops in the negotiation. It is required that a response be sent to requests for a change of mode -- even if the mode is not changed. PuTTY gets this wrong for options that it doesn't support. Revision-number: 5512 Prop-content-length: 328 Content-length: 328 K 8 svn:date V 27 2005-03-16T13:20:02.999010Z K 7 svn:log V 227 Fix `telnet-option-loop', I think. (Untested except to check it compiles, since I don't have a suitably awkward server to run it against; but Ben reviewed the patch before checkin so we can share the blame if it doesn't work.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f862a94af12f270bdbb85c619d988ea7 Text-delta-base-sha1: de1246600ce4fad04335a113bcc003d3a4565c5a Text-content-length: 236 Text-content-md5: 707dbe985cae2c8c88ab5f45215e2abc Text-content-sha1: e6f96cac1ab8f970d4020dff9529df15a2f0afc4 Content-length: 236 SVN~/ QbQ|If the request was positive (WILL or DO), we send * a negative ack to indicate refusal. If the request was * negative (WONT / DONT), we must do nothing. */ if (cmd == WILL || cmd == DO) Node-path: putty-wishlist/data/telnet-option-loop Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 800e3c5fca61ce3adec49ecd10a40e77 Text-delta-base-sha1: 11a28a8d6fe4297e0e35dbaff4f34555e95dc8b7 Text-content-length: 38 Text-content-md5: 5a5e6e77c21a3813799fdc59680599e0 Text-content-sha1: d3f6e517bb7e6114cb2d140deb055e7cda30f3e1 Content-length: 38 SVNltzrFixed-in: 2005-03-1 Revision-number: 5513 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:41.757607Z PROPS-END Revision-number: 5514 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2005-03-16T16:09:44.778381Z K 7 svn:log V 44 faq-savedsettings: mention Default Settings K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 34ed82e15ac3119e89f01c38950773b9 Text-delta-base-sha1: 3c166c433390c2d473017263ff1995c5bb419b37 Text-content-length: 95 Text-content-md5: 10ceff0b37a3b8302f281c5e72b01d4c Text-content-sha1: 4f495e20b48152554365aa8b7dc2bfb53fd0654a Content-length: 95 SVNK FsFpYou can also change the default settings that are used for new session Revision-number: 5515 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2005-03-16T16:34:11.460040Z K 7 svn:log V 17 PieTTY, Le Putty K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4297735070e6bf9c31681717559adb3d Text-delta-base-sha1: 042c105adcf2ecfac6989862720963dcba09b39c Text-content-length: 275 Text-content-md5: c47a47603aa438bf1f6e11fc4ba4a08d Text-content-sha1: 37a1d4740593f9cc0437ffb4832d9a262026b19b Content-length: 275 SVN=M {Q{ Le Putty, a fork with Z-modem support and other tweaks
  • PieTTY, a fork with CJK/transparency/URL recognition etc (no source?) Revision-number: 5516 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2005-03-16T16:40:29.371584Z K 7 svn:log V 59 My patch for the SDCTR modes in draft-ietf-secsh-newmodes. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-ctr-modes Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 6379 Text-content-md5: 814dabcc42d8ef0e53e9aefc4620b767 Text-content-sha1: dff0155f1d4cbb6d345579276c8346b34737418c Content-length: 6389 PROPS-END SVN]]]Summary: SSH-2 CTR modes Difficulty: fun Class: wish Priority: low Content-type: text/plain The currently-expired Internet Draft, draft-ietf-secsh-newmodes-02.txt, specifies a new symmetric-encryption mode for SSH that doesn't suffer from the flaws described in ssh2-cbc-weakness. Implementing these isn't hard -- there's a patch below -- but we should perhaps at least wait until the draft looks likely to become an RFC. Index: sshaes.c =================================================================== --- sshaes.c (revision 5502) +++ sshaes.c (working copy) @@ -1083,6 +1083,32 @@ memcpy(ctx->iv, iv, sizeof(iv)); } +static void aes_sdctr(unsigned char *blk, int len, AESContext *ctx) +{ + word32 iv[4], b[4], tmp; + int i; + + assert((len & 15) == 0); + + memcpy(iv, ctx->iv, sizeof(iv)); + + while (len > 0) { + memcpy(b, iv, sizeof(b)); + aes_encrypt(ctx, b); + for (i = 0; i < 4; i++) { + tmp = GET_32BIT_MSB_FIRST(blk + 4 * i); + PUT_32BIT_MSB_FIRST(blk + 4 * i, tmp ^ b[i]); + } + for (i = 3; i >= 0; i--) + if ((iv[i] = (iv[i] + 1) & 0xffffffff) != 0) + break; + blk += 16; + len -= 16; + } + + memcpy(ctx->iv, iv, sizeof(iv)); +} + static void *aes_make_context(void) { return snew(AESContext); @@ -1131,6 +1157,12 @@ aes_decrypt_cbc(blk, len, ctx); } +static void aes_ssh2_sdctr(void *handle, unsigned char *blk, int len) +{ + AESContext *ctx = (AESContext *)handle; + aes_sdctr(blk, len, ctx); +} + void aes256_encrypt_pubkey(unsigned char *key, unsigned char *blk, int len) { AESContext ctx; @@ -1149,6 +1181,27 @@ memset(&ctx, 0, sizeof(ctx)); } +static const struct ssh2_cipher ssh_aes128_ctr = { + aes_make_context, aes_free_context, aes_iv, aes128_key, + aes_ssh2_sdctr, aes_ssh2_sdctr, + "aes128-ctr", + 16, 128, "AES-128 SDCTR" +}; + +static const struct ssh2_cipher ssh_aes192_ctr = { + aes_make_context, aes_free_context, aes_iv, aes192_key, + aes_ssh2_sdctr, aes_ssh2_sdctr, + "aes192-ctr", + 16, 192, "AES-192 SDCTR" +}; + +static const struct ssh2_cipher ssh_aes256_ctr = { + aes_make_context, aes_free_context, aes_iv, aes256_key, + aes_ssh2_sdctr, aes_ssh2_sdctr, + "aes256-ctr", + 16, 256, "AES-256 SDCTR" +}; + static const struct ssh2_cipher ssh_aes128 = { aes_make_context, aes_free_context, aes_iv, aes128_key, aes_ssh2_encrypt_blk, aes_ssh2_decrypt_blk, @@ -1199,11 +1252,14 @@ }; static const struct ssh2_cipher *const aes_list[] = { + &ssh_aes256_ctr, &ssh_aes256, &ssh_rijndael256, &ssh_rijndael_lysator, + &ssh_aes192_ctr, &ssh_aes192, &ssh_rijndael192, + &ssh_aes128_ctr, &ssh_aes128, &ssh_rijndael128, }; Index: sshblowf.c =================================================================== --- sshblowf.c (revision 5502) +++ sshblowf.c (working copy) @@ -413,6 +413,32 @@ ctx->iv1 = iv1; } +static void blowfish_msb_sdctr(unsigned char *blk, int len, + BlowfishContext * ctx) +{ + word32 b[2], iv0, iv1, tmp; + + assert((len & 7) == 0); + + iv0 = ctx->iv0; + iv1 = ctx->iv1; + + while (len > 0) { + blowfish_encrypt(iv0, iv1, b, ctx); + tmp = GET_32BIT_MSB_FIRST(blk); + PUT_32BIT_MSB_FIRST(blk, tmp ^ b[0]); + tmp = GET_32BIT_MSB_FIRST(blk + 4); + PUT_32BIT_MSB_FIRST(blk + 4, tmp ^ b[1]); + if ((iv0 = (iv0 + 1) & 0xffffffff) == 0) + iv1 = (iv1 + 1) & 0xffffffff; + blk += 8; + len -= 8; + } + + ctx->iv0 = iv0; + ctx->iv1 = iv1; +} + static void blowfish_setkey(BlowfishContext * ctx, const unsigned char *key, short keybytes) { @@ -542,6 +568,13 @@ blowfish_msb_decrypt_cbc(blk, len, ctx); } +static void blowfish_ssh2_sdctr(void *handle, unsigned char *blk, + int len) +{ + BlowfishContext *ctx = (BlowfishContext *)handle; + blowfish_msb_sdctr(blk, len, ctx); +} + const struct ssh_cipher ssh_blowfish_ssh1 = { blowfish_ssh1_make_context, blowfish_free_context, blowfish_sesskey, blowfish_ssh1_encrypt_blk, blowfish_ssh1_decrypt_blk, @@ -555,7 +588,15 @@ 8, 128, "Blowfish" }; +static const struct ssh2_cipher ssh_blowfish_ssh2_ctr = { + blowfish_make_context, blowfish_free_context, blowfish_iv, blowfish_key, + blowfish_ssh2_sdctr, blowfish_ssh2_sdctr, + "blowfish-ctr", + 8, 128, "Blowfish SDCTR" +}; + static const struct ssh2_cipher *const blowfish_list[] = { + &ssh_blowfish_ssh2_ctr, &ssh_blowfish_ssh2 }; Index: sshdes.c =================================================================== --- sshdes.c (revision 5502) +++ sshdes.c (working copy) @@ -744,6 +744,35 @@ scheds->iv1 = iv1; } +static void des_sdctr3(unsigned char *dest, const unsigned char *src, + unsigned int len, DESContext * scheds) +{ + word32 b[2], iv0, iv1, tmp; + unsigned int i; + + assert((len & 7) == 0); + + iv0 = scheds->iv0; + iv1 = scheds->iv1; + for (i = 0; i < len; i += 8) { + des_encipher(b, iv0, iv1, &scheds[2]); + des_decipher(b, b[0], b[1], &scheds[1]); + des_encipher(b, b[0], b[1], &scheds[0]); + tmp = GET_32BIT_MSB_FIRST(src); + PUT_32BIT_MSB_FIRST(dest, tmp ^ b[0]); + src += 4; + dest += 4; + tmp = GET_32BIT_MSB_FIRST(src); + PUT_32BIT_MSB_FIRST(dest, tmp ^ b[0]); + src += 4; + dest += 4; + if ((iv0 = (iv0 + 1) & 0xffffffff) == 0) + iv1 = (iv1 + 1) & 0xffffffff; + } + scheds->iv0 = iv0; + scheds->iv1 = iv1; +} + static void *des3_make_context(void) { return snewn(3, DESContext); @@ -827,6 +856,12 @@ des_cbc3_decrypt(blk, blk, len, keys); } +static void des3_ssh2_sdctr(void *handle, unsigned char *blk, int len) +{ + DESContext *keys = (DESContext *) handle; + des_sdctr3(blk, blk, len, keys); +} + static void des_ssh2_encrypt_blk(void *handle, unsigned char *blk, int len) { DESContext *keys = (DESContext *) handle; @@ -941,6 +976,13 @@ 8, 168, "triple-DES" }; +static const struct ssh2_cipher ssh_3des_ssh2_ctr = { + des3_make_context, des3_free_context, des3_iv, des3_key, + des3_ssh2_sdctr, des3_ssh2_sdctr, + "3des-ctr", + 8, 168, "triple-DES SDCTR" +}; + /* * Single DES in SSH-2. "des-cbc" is marked as HISTORIC in * draft-ietf-secsh-assignednumbers-04.txt, referring to @@ -964,6 +1006,7 @@ }; static const struct ssh2_cipher *const des3_list[] = { + &ssh_3des_ssh2_ctr, &ssh_3des_ssh2 }; Revision-number: 5517 Prop-content-length: 302 Content-length: 302 K 8 svn:date V 27 2005-03-17T19:49:51.959510Z K 7 svn:log V 201 The structural reorganisation of ssh.c (r4909) caused ssh2_try_send() to no longer be run after receiving WINDOW_ADJUSTs. I believe this is likely to have been the cause of recent PSCP hanging issues. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2dced733eac93e51f03278f008040000 Text-delta-base-sha1: a689ac87912110af8b0e9c7d08970050f256824e Text-content-length: 1488 Text-content-md5: d36623dbacc9b3b25b2ffc968fbed09c Text-content-sha1: e41fdf27f0ab873abf0f631c727a32e7f36fb028 Content-length: 1488 SVNE3k,/Z\ static void ssh2_try_send_and_unthrottle(struct ssh_channel *c) { int bufsize; if (c->closes) return; /* don't send on closing channels */ bufsize = ssh2_try_send(c); if (bufsize == 0) { switch (c->type) { case CHAN_MAINSESSION: /* stdin need not receive an unthrottle * notification since it will be polled */ break; case CHAN_X11: x11_unthrottle(c->u.x11.s); break; case CHAN_AGENT: /* agent sockets are request/response and need no * buffer management */ break; case CHAN_SOCKDATA: pfd_unthrottle(c->u.pfd.s); break; } } { c->v.v2.remwindow += ssh_pkt_getuint32(pktin); ssh2_try_send_and_unthrottle(c); }(,<`H ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(s->pktout, "publickey"); /* method */ ssh2_pkt_addbool(s->pktout, TRUE); ssh2_pkt_addstring(s->pktout, key->alg->name); pkblob = key->alg->public_blob(key->data, &pkblob_len); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, (char *)pkblob, pkblob_len); /* * The data to be signed is: * * string session-id * * followed by everything so far placed in the * outgoing packet. */ sigdata_len = s- ssh2_try_send_and_unthrottle(c); Revision-number: 5518 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2005-03-17T20:01:28.375238Z K 7 svn:log V 54 Hung-Te Lin's fix for intermittent WM_PAINT problems. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 74404484c1d2fd9b99e103bff039f478 Text-delta-base-sha1: 96b56583f7fd640fe109068a1e6e2caafff30cf2 Text-content-length: 3544 Text-content-md5: 6487b45ffd696dbbb87e93370208a414 Text-content-sha1: bb4060337a6f2e2a0bf28b8169c8418556773aec Content-length: 3544 SVNOE3|?p?/* * We have to be careful about term_paint(). It will * set a bunch of character cells to INVALID and then * call do_paint(), which will redraw those cells and * _then mark them as done_. This may not be accurate: * when painting in WM_PAINT context we are restricted * to the rectangle which has just been exposed - so if * that only covers _part_ of a character cell and the * rest of it was already visible, that remainder will * not be redrawn at all. Accordingly, we must not * paint any character cell in a WM_PAINT context which * already has a pending update due to terminal output. * The simplest solution to this - and many, many * thanks to Hung-Te Lin for working all this out - is * not to do any actual painting at _all_ if there's a * pending terminal update: just mark the relevant * character cells as INVALID and wait for the * scheduled full update to sort it out. * * I have a suspicion this isn't the _right_ solution. * An alternative approach would be to have terminal.c * separately track what _should_ be on the terminal * screen and what _is_ on the terminal screen, and * have two completely different types of redraw (one * for full updates, which syncs the former with the * terminal itself, and one for WM_PAINT which syncs * the latter with the former); yet another possibility * would be to have the Windows front end do what the * GTK one already does, and maintain a bitmap of the * current terminal appearance so that WM_PAINT becomes * completely trivial. However, this should do for now. */!term->window_update_pendingpAQQp+ = 3; *p++ = 0; return -2; } if (wParam == VK_PAUSE) { /* Break/Pause */ *p++ = 26; *p++ = 0; return -2; } /* Control-2 to Control-8 are special */ if (shift_state == 2 && wParam >= '2' && wParam <= '8') { *p++ = "\000\033\034\035\036\037\177"[wParam - '2']; return p - output; } if (shift_state == 2 && (wParam == 0xBD || wParam == 0xBF)) { *p++ = 0x1F; return p - output; } if (shift_state == 2 && wParam == 0xDF) { *p++ = 0x1C; return p - output; } if (shift_state == 3 && wParam == 0xDE) { *p++ = 0x1E; /* Ctrl-~ == Ctrl-^ in xterm at least */ return p - output; } if (shift_state == 0 && wParam == VK_RETURN && term->cr_lf_return) { *p++ = '\r'; *p++ = '\n'; return p - output; } /* * Next, all the keys that do tilde codes. (ESC '[' nn '~', * for integer decimal nn.) * * We also deal with the weird ones here. Linux VCs replace F1 * to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but * does replace Home and End (1~ and 4~) by ESC [ H and ESC O w * respectively. */ code = 0; switch (wParam) { case VK_F1: code = (keystate[VK_SHIFT] & 0x80 ? 23 : 11); break; case VK_F2: code = (keystate[VK_SHIFT] & 0x80 ? 24 : 12); break; case VK_F3: code = (keystate[VK_SHIFT] & 0x80 ? 25 : 13); break; case VK_F4: code = (keystate[VK_SHIFT] & 0x80 ? 26 : 14); break; case VK_F5: code = (keystate[VK_SHIFT] & 0x80 ? 28 : 15); break; case VK_F6: code = (keystate[VK_SHIFT] & 0x80 ? 29 : 17); break; case VK_F7: code = (keystate[VK_SHIFT] & 0x80 ? 31 : 18); break; case VK_F8: code = (keystate[VK_SHIFT] & 0x80 ? 32 : Revision-number: 5519 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2005-03-18T12:25:40.035283Z K 7 svn:log V 16 Another report. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/host-key-sig-verify-fail Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3bc39fffcab098334f7904bfd295f638 Text-delta-base-sha1: 7c9bc7abde5d34af204355b0fe79e5a4941c1d38 Text-content-length: 191 Text-content-md5: 9122a15d34efe5c40a1b0fbd85a2eab9 Text-content-sha1: 089f1714b46338ea60fb2743795cdffbfc62094f Content-length: 191 SVNb{ (qb{0.56 2005-01-31 0.57li><200503171416120713.0B297B13@mail.liveplaylearn.com>
    0.56/0.57, "OpenSSH_3.4p1"
    With packet log, as yet not analysed Revision-number: 5520 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2005-03-18T12:58:39.719656Z K 7 svn:log V 76 I believe MAC/CRC errors can be caused by network corruption, in principle. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9596b21d491aefbe141bdf591c27178f Text-delta-base-sha1: ccfff52a27966244654986d8445eef7b3a28a812 Text-content-length: 51 Text-content-md5: 62e1600372e2abcccae449612783f26d Text-content-sha1: acc1cd2ea2dac5138c4273a971ec0927815b5a29 Content-length: 51 SVNZg 4E, in the server, or in between Revision-number: 5521 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2005-03-18T19:47:21.714905Z K 7 svn:log V 115 After we thaw a frozen socket, we apparently need to restart the WSAAsyncSelect or else Windows loses read events. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 36b900fe3ad7110d8199dcb641c3c6e0 Text-delta-base-sha1: b6896d2d681d8192cf626aaa620fc54b26491091 Text-content-length: 129 Text-content-md5: da414f04534361ad001abc5fc43943c7 Text-content-sha1: 509534ac3210398c77b40361465278c8ea34c6a3 Content-length: 129 SVN3X ggbQ) { do_select(s->s, 1); if (s->frozen_readable) { char c; p_recv(s->s, &c, 1, MSG_PEEK); } Revision-number: 5522 Prop-content-length: 300 Content-length: 300 K 8 svn:date V 27 2005-03-18T20:32:10.613379Z K 7 svn:log V 199 Some updates: - our keys have been on the keyservers for a while (don't know if we uploaded them, but someone did) - we've acquired some signatures; also note existence of useless signatures K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/keys.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a4440877f6010b34bf2dd8f8b7442245 Text-delta-base-sha1: 94e6114fdbafd58b4f2c7e8dd494a53b65d870f1 Text-content-length: 479 Text-content-md5: 3eb02b6fa533d6c3edca8ef13ce25ca2 Text-content-sha1: 125e15a52a71ed1d6bab6bdfa262457c0b331389 Content-length: 479 SVNAC G3GIxhave collected a few third-party signatures on the Master Keys, in order to increase the chances that you can find a suitable trust path to them. We intend to collect more. (Note that the keys on the keyservers appear to have also collected some signatures from people who haven't performed any verification of the Master Keys.)

    We have uploaded our various keys to public keyservers, so that even if you don't know any of the people who have signed Revision-number: 5523 Prop-content-length: 212 Content-length: 212 K 8 svn:date V 27 2005-03-18T20:53:35.523634Z K 7 svn:log V 111 I think we can probably be said to have more or less completed the process of setting up the signature regime. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/keys.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3eb02b6fa533d6c3edca8ef13ce25ca2 Text-delta-base-sha1: 125e15a52a71ed1d6bab6bdfa262457c0b331389 Text-content-length: 29 Text-content-md5: 113c82e3467458745a1b6ba2b754574d Text-content-sha1: eb0dec2b6c80022e082ee23b5fe3298b39a5eb83 Content-length: 29 SVNC$ ;have set Revision-number: 5524 Prop-content-length: 887 Content-length: 887 K 7 svn:log V 786 Try to make our PGP signing more useful: * All the PuTTY tools for Windows and Unix now contain the fingerprints of the Master Keys. The method for accessing them is crude but universal: a new "-pgpfp" command-line option. (Except Unix PuTTYgen, which takes "--pgpfp" just to be awkward.) * Move the key policy discussion from putty-website/keys.html to putty/doc/pgpkeys.but, and autogenerate the former from the latter. Also tweak the text somewhat and include the fingerprints of the Master Keys themselves. (I've merged the existing autogeneration scripts into a single new one; I've left the old scripts and keys.html around until such time as the webmonster reviews the changes and plumbs in the new script; he should remove the old files then.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-19T02:26:58.581519Z PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e6c824bda055432df5c0305840fcefa8 Text-delta-base-sha1: cafd4da1f2f4e8a31d32c9b802232701cd13047d Text-content-length: 255 Text-content-md5: 95c33a56860a02ce2801f8ffc0b032e1 Text-content-sha1: c41dd4e838ea271f442b82248465d6e777d63fec Content-length: 255 SVN) dd( else if (!strcmp(opt, "-pgpfp")) { /* support "-pgpfp" for consistency with others */ pgp_fingerprints(); nogo = TRUE; Node-path: putty/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 166929d27830a149ced8eddc25f02385 Text-delta-base-sha1: af638210cd0250959c0b691cd789ec7f49d89e06 Text-content-length: 29 Text-content-md5: 013c63bc623c13e73aa2b4e917b1fd4a Text-content-sha1: 0b75f5b359017174436bb92e71dd19d450f13a02 Content-length: 29 SVN\d > pgpkeys Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9148644abf36128ce1db6b5dd7b2da66 Text-delta-base-sha1: db73a0b78f9a7c3a5367e5d57d637d33bbd9e8d7 Text-content-length: 42 Text-content-md5: 0183f6ad8d5257749f4b557c978b11a4 Text-content-sha1: c64274a34582508b9277943be39a44a22d3c9789 Content-length: 42 SVN 7 ZHD\IM{-pgpfp} \c{-pgpfp Node-path: putty/doc/man-pg.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a053b966e8de6d805f90754e2052663b Text-delta-base-sha1: c6e514c1a89793c93bd71d91902eebcc947e4b67 Text-content-length: 338 Text-content-md5: 311dc63807ca0f6952cdbe83e619c31f Text-content-sha1: 5d525ba3fff33deac84a2fe0aa1254f336b71f52 Content-length: 338 SVNb :H:EThe following options do not run PuTTYgen as normal, but print informational messages and then quit: \dt \cw{\-\-help} \dd Display a message summarizing the available options. \dt \cw{\-\-pgpfp} \dd Display the fingerprints of the PuTTY PGP Master Keys, to aid in verifying new files released by the PuTTY team Node-path: putty/doc/man-pl.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 411888d2cdff62e0e4a6f6df8e115195 Text-delta-base-sha1: 38a5bf729d1b307c3c14f8b569198a72bfbe7442 Text-content-length: 156 Text-content-md5: 40db39df7ff5fe3283b4ffc960909e2f Text-content-sha1: c58215cbccc0e86b332879d1fcad96069ae06408 Content-length: 156 SVN| R6Fpgpfp} \dd Display the fingerprints of the PuTTY PGP Master Keys and exit, to aid in verifying new files released by the PuTTY team Node-path: putty/doc/man-pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cd4b29d3861b5f9b5615e624f3395ab Text-delta-base-sha1: 62d44cd1a8663332f290a88e68b4ba4a6a979586 Text-content-length: 156 Text-content-md5: 0c7d57b655928ac52d7856639f939334 Text-content-sha1: 35076f952b94708ca949a5a43732f47a03943928 Content-length: 156 SVNBR F:pgpfp} \dd Display the fingerprints of the PuTTY PGP Master Keys and exit, to aid in verifying new files released by the PuTTY team Node-path: putty/doc/man-psft.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9f2cc24863a8872b3924c85a5ab835dd Text-delta-base-sha1: 7ffb34a71b3de3dc9a40c75541c5b0de2a75b655 Text-content-length: 156 Text-content-md5: ff8fdec394a2027c2a5fdaea25c95167 Text-content-sha1: 3df83d91017b2522c39a299cf6ae2852b8f99e3c Content-length: 156 SVN g%[pgpfp} \dd Display the fingerprints of the PuTTY PGP Master Keys and exit, to aid in verifying new files released by the PuTTY team Node-path: putty/doc/man-ptel.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b1a717d5c8188a9855c9bc32c485fa3b Text-delta-base-sha1: 5af01dfe1dd246671321f1bc1c5306c2b914676e Text-content-length: 145 Text-content-md5: 4fe068485d28504310704bdbe9e42029 Text-content-sha1: 0eb6b702c87e9a0b4c6367f5755bb7ee7ab09588 Content-length: 145 SVNCK {{H{pgpfp} \dd Display the fingerprints of the PuTTY PGP Master Keys, to aid in verifying new files released by the PuTTY team Node-path: putty/doc/man-pter.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99998a3166fda47809ebc7c6e7556671 Text-delta-base-sha1: e08599042093846d54a10f729ff578defd846b37 Text-content-length: 159 Text-content-md5: 54dbd339491b9bf3ad103ff5d0005520 Text-content-sha1: 6bd2dd48ead7cc4e4aad0c2887bc0c6a3f3d8d60 Content-length: 159 SVN9A NoJdt \cw{\-pgpfp} \dd Display the fingerprints of the PuTTY PGP Master Keys, to aid in verifying new files released by the PuTTY team Node-path: putty/doc/man-putt.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 09b15e7f72a198a4b3ff522deeba3569 Text-delta-base-sha1: 5cc5c1e1c518e4d38321e39e793e4c0f97aff61e Text-content-length: 145 Text-content-md5: 7d30de1650ab3aa3221af2c36514a223 Text-content-sha1: 769b1fdbc9bbf35c62b7a6122f1095a2d1aa5843 Content-length: 145 SVNYa {{Wpgpfp} \dd Display the fingerprints of the PuTTY PGP Master Keys, to aid in verifying new files released by the PuTTY team Node-path: putty/doc/pgpkeys.but Node-kind: file Node-action: add Node-copyfrom-rev: 5523 Node-copyfrom-path: putty-website/keys.html Text-copy-source-md5: 113c82e3467458745a1b6ba2b754574d Text-copy-source-sha1: eb0dec2b6c80022e082ee23b5fe3298b39a5eb83 Text-delta: true Text-delta-base-md5: 113c82e3467458745a1b6ba2b754574d Text-delta-base-sha1: eb0dec2b6c80022e082ee23b5fe3298b39a5eb83 Text-content-length: 3068 Text-content-md5: ca345bb2a4bd31765cb1dd0780cd8f84 Text-content-sha1: e26e71f78ec15fc9f67beccb82570a2fd251106c Content-length: 3068 SVN$QS0womXJ/b-A<#8^{Sff=f@%eO c\define{versionidpgpkeys} \versionid $Id$ \A{pgpkeys} PuTTY download keys and signatures \cfg{winhelp-topic}{pgpfingerprints} We create \i{PGP signatures} for all the PuTTY files distributed from our web site, so that users can be confident that the files have not been tampered with. Here we identifyThis description is provided as both a web page on the PuTTY site, and an appendix in the PuTTY manual. As of the next release, all of the PuTTY executables will contain \#{XXX-REMOVE-BEFORE-RELEASE: fix this up for forthcoming release As of release 0.58, all of the PuTTY executables contain} fingerprint material (usually accessed via the \i\c{-pgpfp} command-line option), such that if you have an executable you trust, you can use it to establish a trust path, for instance to a newer version downloaded from the Internet. (Note that none of the keys, signatures, etc mentioned here have anything to do with keys used with SSH - they are purely for verifying the origin of files distributed by the PuTTY team.) \H{pgpkeys-pubkey} Public keys \W{http://www.gnupg.org/}{GnuPG} and PGP2, and also a set of DSA keys compatible with GnuPG. In each format, we have three keys: \b A Development Snapshots key, used to sign the nightly builds. \b A Releases key, used to sign actual releases. \b A Master Key. The Master Key is used to sign the other two keys, and they sign it in return. Therefore, we have six public keys in total: \b RSA: \lcont{ \b \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/keys/master-rsa.asc}{Master Key} \lcont{ 1024-bit; fingerprint: \cw{8F\_15\_97\_DA\_25\_30\_AB\_0D\_\_88\_D1\_92\_54\_11\_CF\_0C\_4C} } \b \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/keys/release-rsa.asc}{Release key} \b \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/keys/snapshot-rsa.asc}{Snapshot key} } \b DSA: \lcont{ \b \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/keys/master-dsa.asc}{Master Key} \lcont{ 1024-bit; fingerprint: \cw{313C\_3E76\_4B74\_C2C5\_F2AE\_\_83A8\_4F5E\_6DF5\_6A93\_B34E} } \b \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/keys/release-dsa.asc}{Release key} \b \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/keys/snapshot-dsa.asc}{Snapshot key} } \H{pgpkeys-security} Security details \S{pgpkeys-snapshot} The Development Snapshots keys These keys are stored \e{without passphrases}Therefore, a signature from one of the Development Snapshots keys \e{DOES} protect you against: \b People tampering with the PuTTY binaries between the PuTTY web site and you. But it \e{DOES NOT} protect you against: \b People tampering with the binaries before they are uploaded to the independent Unix box. \b \b Somebody getting root on the Unix box. \S{pgpkeys-release} The Releases keys The Release keys have passphrases and we can be more careful about how we use them. \S{pgpkeys-master} The Master Keys \e{ever}, should be the signatures on the other keys. at the time of writing. Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8daebf019f6ca57a6f51cd209a893c44 Text-delta-base-sha1: c2176bcd41758199eaf25408c60742a6c4a3c9dc Text-content-length: 81 Text-content-md5: b164e8d5633f84d89f5fa5ced1951fbc Text-content-sha1: 841081fd2b5f8d5ebb6dd018313716c80a7a28ea Content-length: 81 SVNn* <X and exit \c -pgpfp print PGP key fingerprints and exit Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e07a5717ba9ed183fcae4e34f9e0d68b Text-delta-base-sha1: cc47e0504f7768c54412fe829f4155de2fe285f8 Text-content-length: 121 Text-content-md5: 1fdc79704e2a58e464836fd1e0c7871a Text-content-sha1: 221af6c75bd0760f1c5e167fa6260177eec773c5 Content-length: 121 SVNo+^^,CV print version information and exit \c -pgpfp print PGP key fingerprints and exit Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 23bf7fe5468030ee8120a731d2bf17f7 Text-delta-base-sha1: 7a9a74759d48ce9710cac10c9b00f760ea628d01 Text-content-length: 302 Text-content-md5: 332c201dcfe6e5729ed45b4fbb18b9e6 Text-content-sha1: 0997feacdfd785ab32537d5d106e7296a355d048 Content-length: 302 SVN3K3 \S2{using-cmdline-pgpfp} \i\c{-pgpfp}: display PGP key fingerprints This option causes the PuTTY tools not to run as normal, but instead to display the fingerprints of the PuTTY PGP Master Keys, in order to aid with verifying new versions. See \k{pgpkeys} for more information. Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 13b81644c5b07a81e4e4bc3ca1952954 Text-delta-base-sha1: b41f55bfdfb5c04c015fb5aa9a099c2c0f7f6439 Text-content-length: 252 Text-content-md5: 2bab06403bf10e92a619f4ed6ceef0df Text-content-sha1: 34a5ae3537ed0446308aea807c6c6b54584eb0af Content-length: 252 SVNs(S)lY$g5>V print version information and exit\n"); printf(" -pgpfp print PGP key fingerprints and exit } else if (strcmp(argv[i], "-pgpfp") == 0) { pgp_fingerprints(); return Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5a2a80838fb1acd9ce0e51ec83af3401 Text-delta-base-sha1: 95e72369a93432a1869cd5245d7aa94e42114f18 Text-content-length: 254 Text-content-md5: c1d53e031d896b8e404314351e17ce13 Text-content-sha1: 455311f2b1be84f25ab4f935605a3821864d8083 Content-length: 254 SVNr'U{lf9/i fV print version information and exit\n"); printf(" -pgpfp print PGP key fingerprints and exit } else if (strcmp(argv[i], "-pgpfp") == 0) { pgp_fingerprints(); return 1 Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f64ba0a025fa7245d4ba11e2d8cea971 Text-delta-base-sha1: 23670ead4a703169a6a80179f4c9bface1999501 Text-content-length: 437 Text-content-md5: e50d3f462d1bc9efbd17613b005f2115 Text-content-sha1: 3b1b04c5a3b54488f2099bf32a548ecd3c7ac22d Content-length: 437 SVN5X/Sc * Fingerprints of the PGP master keys that can be used to establish a trust * path between an executable and other files. */ #define PGP_RSA_MASTER_KEY_FP \ "8F 15 97 DA 25 30 AB 0D 88 D1 92 54 11 CF 0C 4C" #define PGP_DSA_MASTER_KEY_FP \ "313C 3E76 4B74 C2C5 F2AE 83A8 4F5E 6DF5 6A93 B34Efrontend (windlg.c etc) */ void logevent(void *frontend, const char *); void pgp_fingerprints(void Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0a02872e024fa030ff6166182250f954 Text-delta-base-sha1: f24e6919190d814d65db71c94bc19ffcd1a05e6a Text-content-length: 231 Text-content-md5: 25d14c79f9baf4e23d751ebf8b0c5132 Text-content-sha1: b3b84314bca2da15b74adbea88a5b13caddee22e Content-length: 231 SVNaa } else if (!strcmp(p, "-pgpfp")) { pgp_fingerprints(); exit(1); >\\>Log", event_log_menuitem); MKMENUITEM("Special Commands", NULL); inst->specialsmenu = gtk_ Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fac966952813a9fe0ef4f4f038ecc426 Text-delta-base-sha1: 3a6dd04c643aeb1f7b4f7c0557fb41a9775ee8cb Text-content-length: 650 Text-content-md5: ec8f5d4540c935333599ea0437f6742c Text-content-sha1: 0a16fae45c0514c8b07e89e24f583d30ea04adce Content-length: 650 SVN=4w=w /* * Display the fingerprints of the PGP Master Keys to the user. * (This is here rather than in uxcons because it's appropriate even for * Unix GUI apps.) */ void pgp_fingerprints(void) { fputs("These are the fingerprints of the PuTTY PGP Master Keys. They can\n" "be used to establish a trust path from this executable to another\n" "one. See the manual for more information.\n" "(Note: these fingerprints have nothing to do with SSH!)\n" "\n" "PuTTY Master Key (RSA), 1024-bit:\n" " " PGP_RSA_MASTER_KEY_FP "\n" "PuTTY Master Key (DSA), 1024-bit:\n" " " PGP_DSA_MASTER_KEY_FP "\n", stdout); } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5474abe30f779d3ffcef35eaa4f23202 Text-delta-base-sha1: d4826af60001f030c7b2885116766eb5d688132f Text-content-length: 211 Text-content-md5: 23418f34f3fc70db8e296205e52b2f8c Text-content-sha1: 1cb9e1b481d44f8b86ded546c4cae7e65aee2481 Content-length: 211 SVNz03GJGi.L and exit\n"); printf(" -pgpfp print PGP key fingerprints and exit } else if (!strcmp(p, "-pgpfp")) { pgp_fingerprints(); exit(1 Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 31a77e03c9a3df44738a42a0a32c2f06 Text-delta-base-sha1: 354ccb6761d2deef334cde07a4cb971fae8e3346 Text-content-length: 557 Text-content-md5: 5d041bd634b02caef7094bb698298006 Text-content-sha1: b9b2c61afe5ffa3c029d93adef9bef7878bdb21f Content-length: 557 SVN*E /* * Display the fingerprints of the PGP Master Keys to the user. */ void pgp_fingerprints(void) { fputs("These are the fingerprints of the PuTTY PGP Master Keys. They can\n" "be used to establish a trust path from this executable to another\n" "one. See the manual for more information.\n" "(Note: these fingerprints have nothing to do with SSH!)\n" "\n" "PuTTY Master Key (RSA), 1024-bit:\n" " " PGP_RSA_MASTER_KEY_FP "\n" "PuTTY Master Key (DSA), 1024-bit:\n" " " PGP_DSA_MASTER_KEY_FP "\n", stdout Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6487b45ffd696dbbb87e93370208a414 Text-delta-base-sha1: bb4060337a6f2e2a0bf28b8169c8418556773aec Text-content-length: 182 Text-content-md5: f1b0b95670df815257933fb0e694c08a Text-content-sha1: 35b97bff6d74ed446d30660ae63128d77bd07c68 Content-length: 182 SVN >8 (!strcmp(p, "-pgpfp")) { pgp_fingerprints(); exit(1ANNA; } if (wParam == VK_CANCEL && shift_state == 2) { /* Ctrl-Break */ *p+ Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5720a8eebd202348cf526c5df51bf62a Text-delta-base-sha1: 74b98cee4beb79c072927036ea4e198aa2bc05a4 Text-content-length: 113 Text-content-md5: 4316ab4728c1a769117ed532e4cf1c2d Text-content-sha1: 382192917c9141129ba12bcf935304eb0e1078a1 Content-length: 113 SVN{[`{`#define WINHELP_CTX_pgp_fingerprints "pgpfingerprints" #define WINHELP_CTXID_pgp_fingerprints 5 Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85407b78e0dcbc530ae6221e70fa34c1 Text-delta-base-sha1: 6cc644a628a485862d731709f529443c39fdcbf1 Text-content-length: 327 Text-content-md5: 83f17f3d53226ea83ab6d7be6c10bb9b Text-content-sha1: 8ab6587faf414a58e80b2cb2cbc4b34f06e5492f Content-length: 327 SVNaL&1K&qpsplit_into_argv(cmdline, &argc, &argv, NULL); if (argc > 0) { if (!strcmp(argv[0], "-pgpfp")) { pgp_fingerprints(); exit(1); } else { /* * Assume the first argument to be a private key file, and * attempt to load it. */ cmdline_keyfile = argv[0]; } Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a36c63e423dc0091850b278aa91a8bc Text-delta-base-sha1: 1782018fc329ac10e366a1b4642ade525a079cea Text-content-length: 1938 Text-content-md5: c87691cbef8577f5a8488281112d97f9 Text-content-sha1: bf7b4eeee13a9242716327638fde79aa641044bc Content-length: 1938 SVNoe)-4ce1U_agent_exists(); /* * Initialise storage for RSA keys. */ if (!already_running) { rsakeys = newtree234(cmpkeys_rsa); ssh2keys = newtree234(cmpkeys_ssh2);pgpfp")) { pgp_fingerprints(); if (advapi) FreeLibrary(advapi); return 1; } else if (!prev) { wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = inst; wndclass.hIcon = LoadIcon(inst, MAKEINTRESOURCE(IDI_MAINICON)); wndclass.hCursor = LoadCursor(NULL, IDC_IBEAM); wndclass.hbrBackground = GetStockObject(BLACK_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = APPNAME; RegisterClass(&wndclass); } keylist = NULL; hwnd = CreateWindow(APPNAME, APPNAME, WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, NULL, NULL, inst, NULL); /* Set up a system tray icon */ AddTrayIcon(hwnd); /* Accelerators used: nsvkxa */ systray_menu = CreatePopupMenu(); if (putty_path) { session_menu = CreateMenu(); AppendMenu(systray_menu, MF_ENABLED, IDM_PUTTY, "&New Session"); AppendMenu(systray_menu, MF_POPUP | MF_ENABLED, (UINT) session_menu, "&Saved Sessions"); AppendMenu(systray_menu, MF_SEPARATOR, 0, 0); } AppendMenu(systray_menu, MF_ENABLED, IDM_VIEWKEYS, "&View Keys"); AppendMenu(systray_menu, MF_ENABLED, IDM_ADDKEY, "Add &Key"); AppendMenu(systray_menu, MF_SEPARATOR, 0, 0); if (help_path) AppendMenu(systray_menu, MF_ENABLED, IDM_HELP, "&Help"); AppendMenu(systray_menu, MF_ENABLED, IDM_ABOUT, "&About"); AppendMenu(systray_menu, MF_SEPARATOR, 0, 0); AppendMenu(systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit"); initial_menuitems_count = GetMenuItemCount(session_menu); /* Set the default menu item. */ SetMenuDefaultItem(systray_menu, IDM_VIEWKEYS, FALSE); ShowWindow(hwnd, SW_HIDE); Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c425577f1f1e910a8d70a5d7b2df4131 Text-delta-base-sha1: 5ecbb6ad8c66cfa5ba554012ff5b747aba1cd9f4 Text-content-length: 211 Text-content-md5: 72e7e2d227a2d566153f0aef5fd8bfd7 Text-content-sha1: e27babb65c9bda2f40d9b90e4db1e881cb2e0ce0 Content-length: 211 SVN6l3@J2@iGo and exit\n"); printf(" -pgpfp print PGP key fingerprints and exit } else if (!strcmp(p, "-pgpfp")) { pgp_fingerprints(); exit(1 Node-path: putty/windows/winutils.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f4c10f3af09acab75c6101d74640350 Text-delta-base-sha1: e5d8077aa980fd849089132f6fb2215878708ecf Text-content-length: 664 Text-content-md5: 83208949db8f65d34b2e19cc82f9349a Text-content-sha1: 31161d813f08810e56cbd1e81a12be4ac700708b Content-length: 664 SVNq:)HQ eputty CHECK_CTX(pgp_fingerprintsDisplay the fingerprints of the PGP Master Keys to the user. */ void pgp_fingerprints(void) { message_box("These are the fingerprints of the PuTTY PGP Master Keys. They can\n" "be used to establish a trust path from this executable to another\n" "one. See the manual for more information.\n" "(Note: these fingerprints have nothing to do with SSH!)\n" "\n" "PuTTY Master Key (RSA), 1024-bit:\n" " " PGP_RSA_MASTER_KEY_FP "\n" "PuTTY Master Key (DSA), 1024-bit:\n" " " PGP_DSA_MASTER_KEY_FP, "PGP fingerprints", MB_ICONINFORMATION | MB_OK, HELPCTXID(pgp_fingerprints) Node-path: putty-website/autogen.pl Node-kind: file Node-action: add Node-copyfrom-rev: 5421 Node-copyfrom-path: putty-website/feedback.pl Text-copy-source-md5: 14c6fa70530f532baaf5ff02ed43666a Text-copy-source-sha1: 9f11c7f7a118e3cd9d18a9e456cb6cdb5adbd95b Text-delta: true Text-delta-base-md5: 14c6fa70530f532baaf5ff02ed43666a Text-delta-base-sha1: 9f11c7f7a118e3cd9d18a9e456cb6cdb5adbd95b Text-content-length: 1654 Text-content-md5: a0fe5ae69f77744edde962fcd2e63aff Text-content-sha1: 32f04c88d119f71b573721376bd8e19b6cdc2a1b Content-length: 1654 SVNfNO1\7.X< y#!/usr/bin/perl # usage: autogen.pl eg. autogen.pl faq.html @files = ( [ "faq.html", "AppendixA.html", "FAQ", "PuTTY FAQ" ], [ "feedback.html", "AppendixB.html", "Feedback", "PuTTY Feedback and Bug Reporting" ], [ "keys.html", "AppendixE.html", "Keys", "PuTTY Download Keys and Signatures" ] ); foreach (@files) { ($dstfn, $srcfn, $sect, $title) = @$_ if ($ARGV[0] eq $_->[0]); } die "must specify a valid page" unless defined($dstfn); print << "EOF"; $title$title</h1> <p align=center> EOF print lnk("./", "Home") . " |\n" . lnk("licence.html", "Licence") . " |\n" . lnk("faq.html", "FAQ") . " |\n" . lnk("docs.html", "Docs") . " |\n" . lnk("download.html", "Download") . " |\n" . lnk("keys.html", "Keys") . " |\n" . lnk("links.html", "Links") . "<br>\n" . lnk("mirrors.html", "Mirrors") . " |\n" . lnk("maillist.html", "Updates") . " |\n" . lnk("feedback.html", "Feedback") . " |\n" . lnk("changes.html", "Changes") . " |\n" . lnk("wishlist/", "Wishlist") . " |\n" . lnk("team.html", "Team") . "</p>\n"; sub lnk { ($dst, $capt) = @_; if ($capt eq $sect) { return "<b>$capt</b>"; } else { return "<a href=\"$dst\">$capt</a>"; } } open FILE, $ENV{"HOME"} . "/pub/putty/doc/" . $srcfn s/<a href="([^"s#^\Qhttp://www.chiark.greenend.org.uk/~sgtatham/putty/\E(.+)#$1# or /\// or /^news:/ or /^mailto:/ or /^#/ or s/^\Q$srcfn\E// or s#^#http://www.tartarus.org/~simon/puttydoc\/# Revision-number: 5525 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 58 Set SVN properties on udp.but the same as everything else K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-19T02:29:57.556757Z PROPS-END Node-path: putty/doc/udp.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Revision-number: 5526 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2005-03-19T03:05:44.148885Z K 7 svn:log V 93 More compact display for the key links/fingerprints. Still not ideal, but it'll probably do. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pgpkeys.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ca345bb2a4bd31765cb1dd0780cd8f84 Text-delta-base-sha1: e26e71f78ec15fc9f67beccb82570a2fd251106c Text-content-length: 442 Text-content-md5: 661ae8e57a4dba460e73b449bd03133b Text-content-sha1: 58701e1b56842469a4dc43535a13a11f4f8b288b Content-length: 442 SVN��Q=! �z�0�[%�cf5�[2�]w�@\W{http://www.chiark.greenend.org.uk/~sgtatham/putty/keys/master-rsa.asc}{Master Key}, \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/keys/release-rsa.asc}{Release key}, \lcont{ Master Key: DSA: \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/keys/master-dsa.asc}{Master Key}, \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/keys/release-dsa.asc}{Release key}, \lcont{ Master Key: Revision-number: 5527 Prop-content-length: 513 Content-length: 513 K 8 svn:date V 27 2005-03-19T16:34:58.337725Z K 7 svn:log V 412 Work around lcc's annoying (but, even more annoyingly, legitimate) refusal to allow comparison of function pointers. Unfortunately this still doesn't cause PuTTY to compile on my lcc installation, because the GetCharacterPlacement stuff in exact_textout() is missing from its header files. This may have been fixed in a future version (I'm using lcc-win32 version 3.8 from December 2003), but I haven't checked. K 10 svn:author V 5 simon PROPS-END Node-path: putty/timing.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 11431750b7a7bf8861f51fd1cc8fcc42 Text-delta-base-sha1: 768070937d5af12149b4ae7ebb09eb1007733a1f Text-content-length: 255 Text-content-md5: 39d035ea88e76a4b4cd498f0046b1818 Text-content-sha1: 51e97b727ee9cc83663551c926a59cb4e03110e6 Content-length: 255 SVN��W;b���\�L� J#ifdef __LCC__ /* lcc won't let us compare function pointers. Legal, but annoying. */ { int c = memcmp(&a->fn, &b->fn, sizeof(a->fn)); if (c < 0) return -1; else if (c > 0) return +1; } #else #endif Revision-number: 5528 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2005-03-19T19:02:53.431087Z K 7 svn:log V 153 If it's available, try to use clock_gettime(CLOCK_MONOTONIC) rather than gettimeofday(), since the former shouldn't warp when the user resets the clock. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec8f5d4540c935333599ea0437f6742c Text-delta-base-sha1: 0a16fae45c0514c8b07e89e24f583d30ea04adce Text-content-length: 480 Text-content-md5: 2f5be952d21927f3b7ef90691d07a4ca Text-content-sha1: 416d1413e5d2441d50a7efcb69c72f42199699ea Content-length: 480 SVN��4^B�[�&�A?��4time.h> #include <sys/time.h> #include <sys/types.h> #include <pwd.h> #include "putty.h" /* * We want to use milliseconds rather than microseconds or nanoseconds, * word so it can be used for keepalives. */ unsigned long getticks(void) { struct timeval tv; #ifdef CLOCK_MONOTONIC struct timespec ts; if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; #endif gettimeofday(&tv, NULL); Revision-number: 5529 Prop-content-length: 328 Content-length: 328 K 8 svn:date V 27 2005-03-19T19:23:49.533745Z K 7 svn:log V 229 Revert last change: Some versions of the GNU C Library (notably SUSE glibc-2.3.3-118 and Debian libc6 2.3.2.ds1-20) have clock_gettime() and CLOCK_MONOTONIC in their headers, but not in libc itself, which we can't detect easily. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f5be952d21927f3b7ef90691d07a4ca Text-delta-base-sha1: 416d1413e5d2441d50a7efcb69c72f42199699ea Text-content-length: 368 Text-content-md5: ec8f5d4540c935333599ea0437f6742c Text-content-sha1: 0a16fae45c0514c8b07e89e24f583d30ea04adce Content-length: 368 SVN��^4 Y�[�Y��^sys/time.h> #include <sys/types.h> #include <pwd.h> #include "putty.h" unsigned long getticks(void) { struct timeval tv; gettimeofday(&tv, NULL); /* * We want to use milliseconds rather than microseconds, * because we need a decent number of them to fit into a 32-bit * word so it can be used for keepalives. */ Revision-number: 5530 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2005-03-20T12:56:29.891627Z K 7 svn:log V 30 putty.mirrors.php-homepage.de K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aba8b66e556caff2746817f95542aacf Text-delta-base-sha1: 291151c49683cf279a443ac40496a85e2fdab46b Text-content-length: 88 Text-content-md5: 8b885f5eda39bc57496952ab9ba2be5f Text-content-sha1: 956faec275837304933cc9ac82aa1d98abce3a78 Content-length: 88 SVN��=�3��J{�_3putty.mirrors.php-homepage.de/">putty.mirrors.php-homepage.de Revision-number: 5531 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2005-03-20T17:17:50.513008Z K 7 svn:log V 19 putty.saranair.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b885f5eda39bc57496952ab9ba2be5f Text-delta-base-sha1: 956faec275837304933cc9ac82aa1d98abce3a78 Text-content-length: 78 Text-content-md5: 3d3a8385747ade6358e780ad1d630b26 Text-content-sha1: 8fb085d021d6a7e5dcbb6e4ac47462157a62935e Content-length: 78 SVN�� 7�o��e4putty.saranair.com/">putty.saranair.com</a> in Thailand Revision-number: 5532 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2005-03-20T22:28:13.928937Z K 7 svn:log V 96 Add comments about default processing in DialogProc/WindowProc, since I often forget the rules. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d77b0b999456a90cf200ad7841d8fad7 Text-delta-base-sha1: 1acca210579ca9d602bb85d4daa71aea1fd14f80 Text-content-length: 159 Text-content-md5: afadf76c34e09e150b04341972d01ad3 Text-content-sha1: ab06f11292a4c93d326de813211985d26c99feac Content-length: 159 SVN�� �<��L9 (Being a dialog procedure, in general it returns 0 if the default * dialog processing should be performed, and 1 if it should not.) Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f1b0b95670df815257933fb0e694c08a Text-delta-base-sha1: 35b97bff6d74ed446d30660ae63128d77bd07c68 Text-content-length: 320 Text-content-md5: b509e14ff5de1cfead5bc8a9dab9850a Text-content-sha1: a1e8d48070c51ceb37c605145b8de433ae5fa27a Content-length: 320 SVN�����D��7?/* * Any messages we don't process completely above are passed through to * DefWindowProc() for default processing. */� ��; return p - output; } if (wParam == VK_SPACE && shift_state == 3) { /* Ctrl-Shift-Space */ *p++ = 160; return p - output Revision-number: 5533 Prop-content-length: 303 Content-length: 303 K 7 svn:log V 202 Improvement for IME font display from Hung-Te Lin. Not tested, but it appears only to affect Glenn Maynard's r1406 code from <20011006170741.A23470@zewt.org> and nothing else, so seems harmless enough. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-21T01:05:38.370058Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b509e14ff5de1cfead5bc8a9dab9850a Text-delta-base-sha1: a1e8d48070c51ceb37c605145b8de433ae5fa27a Text-content-length: 836 Text-content-md5: ed03603a848d9980ad9bc29205409ed4 Text-content-sha1: fd8b5115df2fc991900adbd7cc45e0ae6319a16f Content-length: 836 SVN���� �2��J�zSelectObject(hdc, fonts[FONT_NORMAL]); GetTextMetrics(hdc, &tm); GetObject(fonts[FONT_NORMAL], sizeof(LOGFONT), &lfontSTARTCOMPOSITION: { HIMC hImc = ImmGetContext(hwnd); ImmSetCompositionFont(hImc, &lfont); ImmReleaseContext(hwnd, hImc); return p - output; } if (wParam == VK_SPACE && shift_state == 3) { /* Ctrl-Shift-Space */ *p++ = 160; return p - output; } if (wParam == VK_CANCEL && shift_state == 2) { /* Ctrl-Break */ *p++ = 3; *p++ = 0; return -2; } if (wParam == VK_PAUSE) { /* Break/Pause */ *p++ = 26; *p++ = 0; return -2; } /* Control-2 to Control-8 are special */ if (shift_state == 2 && wParam >= '2' && wParam <= '8') { *p++ = "\000\033\034\035\036\037\177"[wParam - '2']; ��� Revision-number: 5534 Prop-content-length: 431 Content-length: 431 K 8 svn:date V 27 2005-03-21T01:51:22.999550Z K 7 svn:log V 330 Trim application manifests as much as MS' documentation and Owen's experiments on XP allow while still having the desired effect -- this allows removal of some fibs. Also, change version number to 0.0.0.0 in preparation for `win-versioninfo' (not that we found anything that took any notice of the version number declared here). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/pageant.mft Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 86486a86dc0237ac625307f5a25dabd6 Text-delta-base-sha1: c6310738dfebd3321a3c27df665bcef363d3919c Text-content-length: 239 Text-content-md5: 27d462d215c764fb7f17199ebe36c060 Text-content-sha1: 99d0851ce91cd93310ac6875ce1bc0b7d3c9255b Content-length: 239 SVN��p W� �W�*Ftype="win32" name="Pageant" version="0.0.0.0"/> <dependency> <dependentAssembly> <!-- Load Common Controls 6 instead of 5 to get WinXP native- looking controls in the client area. -- Node-path: putty/windows/putty.mft Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f5778c606c2ba21e8a3e8c3581f1b95 Text-delta-base-sha1: 6efed928aacfc8d1858ddb74b26cd09ff31eeaf1 Text-content-length: 237 Text-content-md5: 5cc1bb4ea167edddf13194e236aef19c Text-content-sha1: 024abfb8bed1bcc353a0462b7569f08c019b6cc1 Content-length: 237 SVN��h U� �U�*>type="win32" name="PuTTY" version="0.0.0.0"/> <dependency> <dependentAssembly> <!-- Load Common Controls 6 instead of 5 to get WinXP native- looking controls in the client area. -- Node-path: putty/windows/puttygen.mft Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4298e9220a8f1e5020ccb77b39372f8d Text-delta-base-sha1: 7623bd0ca9c71663cdf4058ca52354529f2ddd76 Text-content-length: 240 Text-content-md5: fb58f0be488b47ddf0221ccd868eb026 Text-content-sha1: a875121d7ea5c2a11d0dbfba1d09c2acb5ccaee9 Content-length: 240 SVN��j X� �X�*@type="win32" name="PuTTYgen" version="0.0.0.0"/> <dependency> <dependentAssembly> <!-- Load Common Controls 6 instead of 5 to get WinXP native- looking controls in the client area. -- Revision-number: 5535 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 44 Update WinSCP URL, thanks to Martin Prikyl. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-03-21T13:29:54.772516Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c47a47603aa438bf1f6e11fc4ba4a08d Text-delta-base-sha1: 37a1d4740593f9cc0437ffb4832d9a262026b19b Text-content-length: 20 Text-content-md5: d76a46219ef04ace32b66c6aa16827e4 Text-content-sha1: 5762272f41a330db165b64c03d920720d338e84d Content-length: 20 SVN��MA ��`��al Revision-number: 5536 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2005-03-21T13:46:16.176687Z K 7 svn:log V 62 Martin Trautmann spotted a bare char being passed to isspace. K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eddbe291efc0da48f57748b6e345f9a3 Text-delta-base-sha1: 41d82f130f4e89351571258495e70590faa0d093 Text-content-length: 52 Text-content-md5: 47bbf56d3ef04e975757ed1bcb9d076c Text-content-sha1: d892a95b408fd3194180257baf4fe215b414ff0c Content-length: 52 SVN��. ��� *suf && isspace((unsigned char) Revision-number: 5537 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 mirrors.ee.teiath.gr K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-21T15:49:24.660069Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3d3a8385747ade6358e780ad1d630b26 Text-delta-base-sha1: 8fb085d021d6a7e5dcbb6e4ac47462157a62935e Text-content-length: 90 Text-content-md5: 7c7989d86b6888671c5cad2bb669424b Text-content-sha1: 915ef9edec2a1947ff983e8950d52288be20cfb2 Content-length: 90 SVN�� ?�S��A@�2Ymirrors.ee.teiath.gr/putty/">mirrors.ee.teiath.gr</a> in Greece Revision-number: 5538 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2005-03-21T17:43:59.719101Z K 7 svn:log V 26 Mention PUTTY.RND by name K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 10ceff0b37a3b8302f281c5e72b01d4c Text-delta-base-sha1: 4f495e20b48152554365aa8b7dc2bfb53fd0654a Text-content-length: 344 Text-content-md5: 2b1a91b88a0985c3865033987a12e9c9 Text-content-sha1: 14902a5d58e2ee66ab37940fac36856d277b5ec0 Content-length: 344 SVN��Kl<��<�!*a file called \i\c{PUTTY.RND} in your Windows home directory (\c{%HOMEDRIVE%\\%HOMEPATH%}), or in the actual Windows directory (such as \c{C:\\WINDOWS}) if the home directory doesn't exist, for example if you're using Win95. If you want to change the location of the random number seed file, you can put your chosen Revision-number: 5539 Prop-content-length: 275 Content-length: 275 K 8 svn:date V 27 2005-03-21T22:20:22.405425Z K 7 svn:log V 174 Hung-Te Lin spotted that the `multi-changesettings-crash' workaround for Windows would prevent a user opening Change Settings if they'd cancelled a previous Change Settings. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ed03603a848d9980ad9bc29205409ed4 Text-delta-base-sha1: fd8b5115df2fc991900adbd7cc45e0ae6319a16f Text-content-length: 450 Text-content-md5: f98b44bf0d6b17752f820f31839d158b Text-content-sha1: e5c9540cbd918a6a76adaee2ebf9a61939913aab Content-length: 450 SVN����8�v��+v0�Nq�YX = FALSE int reconfig_result; if (reconfiguring) break; else reconfiguring = TRUE; GetWindowText(hwnd, cfg.wintitle, sizeof(cfg.wintitle)); prev_cfg = cfg; reconfig_result = !do_reconfig(hwnd, back ? back->cfg_info(backhandle) : 0); reconfiguring = FALSE; if (!reconfig_result�dOO�� && wParam <= '8') { *p++ = "\000\033\034\035\036\037\177"[wParam - '2']; Revision-number: 5540 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 We have a packet log + exchange hash to check out. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-22T02:00:00.758862Z PROPS-END Node-path: putty-wishlist/data/host-key-sig-verify-fail Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9122a15d34efe5c40a1b0fbd85a2eab9 Text-delta-base-sha1: 089f1714b46338ea60fb2743795cdffbfc62094f Text-content-length: 148 Text-content-md5: 942381cb2ad03c39d31fd814a0af9c6d Text-content-sha1: c886b1bde42d16b3f323001db428c82672e4735d Content-length: 148 SVN��{9 ~�H��s]~<tt><200503181604010835.10B29C1C@mail.liveplaylearn.com>: <br>Packet log and exchange hash, as yet not analysed </ul> Revision-number: 5541 Prop-content-length: 111 Content-length: 111 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-22T20:50:01.724254Z K 7 svn:log V 11 workaround PROPS-END Node-path: putty-wishlist/data/dbcs-breakage Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 170aeefd4ef250f64669b01b719775de Text-delta-base-sha1: ea6c41c6d7ac9b788b8c22e20729ad90cd3d4db4 Text-content-length: 203 Text-content-md5: 2c5602a8608ff0847ebccce44d9e6ba0 Text-content-sha1: 9bfee4a39523164784b6655881974e0b3ffc318b Content-length: 203 SVN��{38�{�8 <p> UTF-8 mode should work reasonably well. A workaround is to use UTF-8 if possible (perhaps via something such as <a href="http://www.pps.jussieu.fr/~jch/software/luit/">luit</a>). Revision-number: 5542 Prop-content-length: 194 Content-length: 194 K 8 svn:date V 27 2005-03-22T23:20:23.696694Z K 7 svn:log V 94 Add an option to use wcwidth_cjk() instead of wcwidth(), as several people have asked for it. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f6d99e2bfe3d887c7f6315d7bc927a6c Text-delta-base-sha1: c87059a6beae06170f506bfc15c31f33c865c9a5 Text-content-length: 257 Text-content-md5: a6adf442955f32dcef891a6b9270ba8d Text-content-sha1: 9d72ad9a317f3e063fd6e8c3413a67d973dff4cf Content-length: 257 SVN��pd�`�d�,V = ctrl_getset(b, "Window/Translation", "tweaks", NULL); ctrl_checkbox(s, "Treat CJK ambiguous characters as wide", 'w', HELPCTX(translation_cjk_ambig_wide), dlg_stdcheckbox_handler, I(offsetof(Config,cjk_ambig_wide) Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c884fc49e9cd6a909bc68ed390bfbc81 Text-delta-base-sha1: 54bb3d00fc4e2d47e7e11ec06772bdacd2245eeb Text-content-length: 1690 Text-content-md5: 4ba7fc12ab30cc3fa86fb4820ccf2abc Text-content-sha1: 42bdf936a858da60a6732ab3e1735929fad18053 Content-length: 1690 SVN����/�(�/�)jk-ambig-wide} \q{Treat CJK ambiguous characters as wide} \cfg{winhelp-topic}{translation.cjkambigwide} There are \I{East Asian Ambiguous characters}some Unicode characters whose width is not well-defined. In most contexts, such characters should be treated as single-width for the purposes of wrapping and so on; however, in some CJK contexts, they are better treated as double-width for historical reasons, and some server-side applications may expect them to be displayed as such. Setting this option will cause PuTTY to take the double-width interpretation. If you use legacy CJK applications, and you find your lines are wrapping in the wrong places, or you are having other display problems, you might want to play with this setting. This option only has any effect in UTF-8 mode (see \k{config-charset})�G==�G�ssion using \q{Change Settings} (see \k{using-changesettings}). If you delete a local or dynamic port forwarding in mid-session, PuTTY will stop listening for connections on that port, so it can be re-used by another program. If you delete a remote port forwarding, note that: \b The SSH-1 protocol contains no mechanism for asking the server to stop listening on a remote port. \b The SSH-2 protocol does contain such a mechanism, but not all SSH servers support it. (In particular, OpenSSH does not support it in any version earlier than 3.9.) If you ask to delete a remote port forwarding and PuTTY cannot make the server actually stop listening on the port, it will instead just start refusing incoming connections on that port. Therefore, although the port cannot be reused by another program, you can at least be reasona Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e50d3f462d1bc9efbd17613b005f2115 Text-delta-base-sha1: 3b1b04c5a3b54488f2099bf32a548ecd3c7ac22d Text-content-length: 92 Text-content-md5: 1ce2e0c7d1b5e12beee6f692d1131338 Text-content-sha1: 83b2d718b0f22b9064842309bbfeaa83790ff68d Content-length: 92 SVN��|<��� �{cjk_ambig_wideint wcwidth_cjk(wchar_t ucs); int wcswidth_cjk Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 34c8d379366c5c5cf56147d62657f4c2 Text-delta-base-sha1: 43cb638d67e3c57c487488b6ae80c827227dcfb6 Text-content-length: 101 Text-content-md5: 1445fac0e486a916a4e11f6550af1a7b Text-content-sha1: 974e8ff33d9d4a7a81770f4b05dcd8fa89f641f2 Content-length: 101 SVN��onG�8��?�0?CJKAmbigWide", cfg->cjk_ambig_widCJKAmbigWide", 0, &cfg->cjk_ambig_wide Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3d91b2bdff5e70f90a95f4f021829955 Text-delta-base-sha1: 9908ba960eb025858b1ea7ffe9f73dd38d38783c Text-content-length: 196 Text-content-md5: 13a61a1a4ee04f8a8dc70d80bc9d7130 Text-content-sha1: d936a8d71750bc70d1fb9d5cff6bb5a706eaccba Content-length: 196 SVN����U�1�U�zD(term->cfg.cjk_ambig_wide ? wcwidth_cjk((wchar_t) c) : wcwidth((wchar_t) c)�G BB�G� << ATTR_BGSHIFT); i += 2; } break; Node-path: putty/testdata/utf8.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 88f14f5e4bd84d939c35a367d46ccb5f Text-delta-base-sha1: 74fd10426e973c617d8165dc92b68e7a2f8d7ec8 Text-content-length: 112 Text-content-md5: 24dcd378184f54fc2d6512c147909be1 Text-content-sha1: ae313dd90bf76b4f8310ca7ab008987273f35bbf Content-length: 112 SVN��~]_�~�_ East Asian Ambiguous characters: ¼½¾¼½¾¼½¾¼½¾¼½¾¼½¾¼½¾¼½¾¼½¾¼½¾ Node-path: putty/wcwidth.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e06cdd56c7eac9b0d581a1e7941ad45e Text-delta-base-sha1: 2c7b9fd889a623c978d02b2038a453b5f9422a76 Text-content-length: 25 Text-content-md5: 29672a76731a71d259d26d854e3abf22 Text-content-sha1: 531081e0139b49fa1a95680cb5bee0f77fe12a6e Content-length: 25 SVN��B��s��p"�" Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b242fdced0dc57b044226fdd7c9fc751 Text-delta-base-sha1: 00deb03e82ae92fe52a4cff795bb003c751f3989 Text-content-length: 34 Text-content-md5: 85456b153a00d29fda6af13a08ecbe91 Text-content-sha1: 8344e307dae9615e636a50f297abfdcb65fc051b Content-length: 34 SVN��T# ���y[tweaks", NULL Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4316ab4728c1a769117ed532e4cf1c2d Text-delta-base-sha1: 382192917c9141129ba12bcf935304eb0e1078a1 Text-content-length: 59 Text-content-md5: d4706eac04d5802040cda738905bbd59 Text-content-sha1: 74fdfe5ac481b4a05afc5ac1b13bd85d580c0ed3 Content-length: 59 SVN��[% &� ��shjk_ambig_wide "translation.cjkambigwid Revision-number: 5543 Prop-content-length: 166 Content-length: 166 K 7 svn:log V 66 Fix my fix (r5539) to the `multi-changesettings-crash' fix. Ahem. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-22T23:25:21.225187Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f98b44bf0d6b17752f820f31839d158b Text-delta-base-sha1: e5c9540cbd918a6a76adaee2ebf9a61939913aab Text-content-length: 43 Text-content-md5: e97f10c35cb9fa9d51b183d7f0e71f40 Text-content-sha1: a8fa47781b8d7ee7e428e08d0f690a9c89052960 Content-length: 43 SVN���� �o��p �dc��c Revision-number: 5544 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2005-03-23T00:35:48.683049Z K 7 svn:log V 23 Some wcwidth() musings K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/wcwidth-cjk Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 651 Text-content-md5: 6197386a9a012b82dec42d1056037817 Text-content-sha1: 467623f5b3e80ed0a2cc1560171c7a6da76e16bb Content-length: 661 PROPS-END SVN���}}}Summary: Checkbox to enable use of wcwidth_cjk() Class: wish Difficulty: fun Priority: medium Fixed-in: 2005-03-23 Content-type: text/x-html-body <p> In <a href="http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c">Markus Kuhn's <tt>wcwidth.c</tt></a>, which PuTTY uses, there is a variant of <code>wcwidth()</code> that treats certain characters of ambiguous width as being double-width, rather than single-width as the default version does. <p> Currently the variant version is commented out and not used. We've had a few requests to add an option to use this variant, though. <p> Patch: <20041103083134.GA68873@svm.csie.ntu.edu.tw> Node-path: putty-wishlist/data/wcwidth-upgrade Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 3255 Text-content-md5: f2ac81200303594fb43ea5f81ddeb02c Text-content-sha1: c263cba4bd92b8a06a08c7268ba68bcee9a08aaa Content-length: 3265 PROPS-END SVN���)))Summary: Upgrade wcwidth() to Markus Kuhn's latest version Class: semi-bug Difficulty: fun Priority: low Content-type: text/x-html-body <p> Inside PuTTY is a function called <code>wcwidth()</code>, which tells us the display width of a given <a href="http://www.unicode.org/">Unicode</a> code point (e.g., single-width, zero-width/combining, or double-width). <p> The version we use is a freely available implementation from Markus Kuhn which dates from 2001-Sep or before. There is a <a href="http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c">newer version</a> of Markus Kuhn's implementation available; it appears to be dated 2003-05-20, be based on Unicode 4.0, and include some code points <a href="unicode-more-planes.html">outside the BMP</a>, which our version doesn't. <p> The status of some existing code points seems to have changed. Therefore, feedback on whether this upgrade is a good or bad idea would be much appreciated. <p> Ignoring changes to <code>wcwidth_cjk()</code> output (we've <a href="wcwidth-cjk.html">only just started using it</a>, so an upgrade won't affect existing users, although it may make the new option more or less useful), and U+10000 onwards, the changes are: <p><pre>/* Combining Diacritical Marks */ 6,9c6,9 < 0300-034E 0 < 034F-035F 1 < 0360-0362 0 < 0363-0482 1 --- > 0300-0357 0 > 0358-035C 1 > 035D-036F 0 > 0370-0482 1 /* <a href="bidi.html">Arabic</a> */ 25,27c25,31 < 05C5-064A 1 < 064B-0655 0 < 0656-066F 1 --- > 05C5-05FF 1 > 0600-0603 0 > 0604-060F 1 > 0610-0615 0 > 0616-064A 1 > 064B-0658 0 > 0659-066F 1 /* Gurmukhi */ 65,66c69,70 < 09E4-0A01 1 < 0A02-0A02 0 --- > 09E4-0A00 1 > 0A01-0A02 0 /* Gujarati */ 87c91,93 < 0ACE-0B00 1 --- > 0ACE-0AE1 1 > 0AE2-0AE3 0 > 0AE4-0B00 1 /* Kannada */ 113c119,121 < 0C57-0CBE 1 --- > 0C57-0CBB 1 > 0CBC-0CBC 0 > 0CBD-0CBE 1 /* Tagalog, Hanunoo, Buhid, Tagbanwa, Khmer */ 176c184,194 < 1200-17B6 1 --- > 1200-1711 1 > 1712-1714 0 > 1715-1731 1 > 1732-1734 0 > 1735-1751 1 > 1752-1753 0 > 1754-1771 1 > 1772-1773 0 > 1774-17B3 1 > 17B4-17B5 0 > 17B6-17B6 1 /* more Khmer, Mongolian */ 182,184c200,204 < 17D4-180A 1 < 180B-180E 0 < 180F-18A8 1 --- > 17D4-17DC 1 > 17DD-17DD 0 > 17DE-180A 1 > 180B-180D 0 > 180E-18A8 1 /* Limbu */ 186c206,214 < 18AA-200A 1 --- > 18AA-191F 1 > 1920-1922 0 > 1923-1926 1 > 1927-1928 0 > 1929-1931 1 > 1932-1932 0 > 1933-1938 1 > 1939-193B 0 > 193C-200A 1 /* General Punctuation */ 190c218,220 < 202F-2069 1 --- > 202F-205F 1 > 2060-2063 0 > 2064-2069 1 /* Combining Diacritical Marks for Symbols, Miscellaneous Technical, */ /* CJK Symbols and Punctuation */ 193,199c223,227 < 20D0-20E3 0 < 20E4-2E7F 1 < 2E80-3009 2 < 300A-300B 1 < 300C-3019 2 < 301A-301B 1 < 301C-3029 2 --- > 20D0-20EA 0 > 20EB-2328 1 > 2329-232A 2 > 232B-2E7F 1 > 2E80-3029 2 /* Variation Selectors */ 212c240,242 < FB1F-FE1F 1 --- > FB1F-FDFF 1 > FE00-FE0F 0 > FE10-FE1F 1 /* Halfwidth and Fullwidth Forms */ 218,219c248,249 < FF00-FF5F 2 < FF60-FFDF 1 --- > FF00-FF60 2 > FF61-FFDF 1</pre> Revision-number: 5545 Prop-content-length: 573 Content-length: 573 K 8 svn:date V 27 2005-03-23T01:08:18.326633Z K 7 svn:log V 472 Another fix from Hung-Te Lin; apparently in some IMEs (such as "MS NewPhonetics"), move events (arrow keys) were being doubled up, apparently because we turned both KEYDOWN and KEYUP events into new KEYDOWN events. I don't claim to understand the precise effect of this patch :( but I'm reasonably confident that it only affects IME users, and experimentally it doesn't seem to break anything obvious, so if piaip says it makes things better that's good enough for me :) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e97f10c35cb9fa9d51b183d7f0e71f40 Text-delta-base-sha1: a8fa47781b8d7ee7e428e08d0f690a9c89052960 Text-content-length: 452 Text-content-md5: 5f4e2bb780e3c383debbf39702e96a97 Text-content-sha1: cf0d8cc2d0392e0e6cd82fa146125bba0654170b Content-length: 452 SVN���� �l� � k /* IME PROCESS key */ if (message == WM_KEYDOWN) { MSG m; m.hwnd = hwnd; m.message = WM_KEYDOWN; m.wParam = wParam; m.lParam = lParam & 0xdfff; TranslateMessage(&m); } else break; /* pass to Windows for default processing */�cm �c�use */ *p++ = 26; *p++ = 0; return -2; } /* Control-2 to Control-8 are special */ if (shift_state == 2 && wParam >= '2' Revision-number: 5546 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Apparently screen can also insulate us from DBCSs. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-23T01:26:56.230038Z PROPS-END Node-path: putty-wishlist/data/dbcs-breakage Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c5602a8608ff0847ebccce44d9e6ba0 Text-delta-base-sha1: 9bfee4a39523164784b6655881974e0b3ffc318b Text-content-length: 79 Text-content-md5: 425e8afd0fb76553f9094b8a742102c9 Text-content-sha1: 366a223397931c65b9626f05a979d74db3a11d64 Content-length: 79 SVN��3o?�0� or <a href="http://www.gnu.org/software/screen/">screen</a>). Revision-number: 5547 Prop-content-length: 588 Content-length: 588 K 7 svn:log V 487 `wcwidth-upgrade': upgrade to latest wcwidth.c from Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c>. This is identified both internally and in HTTP headers as 2003-05-20, for Unicode 4.0. Only changes from upstream are to make mk_wcwidth_cjk() non-static and to #include "putty.h" for prototypes. The status of some code points has changed; see the wishlist item. We've had some feedback from the CJK and Arabic communities that upgrading is probably the right thing to do. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-23T20:04:08.696652Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ce2e0c7d1b5e12beee6f692d1131338 Text-delta-base-sha1: 83b2d718b0f22b9064842309bbfeaa83790ff68d Text-content-length: 139 Text-content-md5: 776624aa52e1519a4999a0fc0d6e5a38 Text-content-sha1: ac3ceb8ba27573e4c84e71b517c30709be186ee6 Content-length: 139 SVN��| q�q�q�&Vmk_wcwidth(wchar_t ucs); int mk_wcswidth(const wchar_t *pwcs, size_t n); int mk_wcwidth_cjk(wchar_t ucs); int mk_ Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 13a61a1a4ee04f8a8dc70d80bc9d7130 Text-delta-base-sha1: d936a8d71750bc70d1fb9d5cff6bb5a706eaccba Text-content-length: 87 Text-content-md5: 1fc04bdd11ebddd1d1502844b1a6357e Text-content-sha1: 045b62005516241d1f0f079e779423ca323dd0f3 Content-length: 87 SVN���� &�R��rmk_wcwidth_cjk((wchar_t) c) : mk_� � �0xFF) Node-path: putty/wcwidth.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 29672a76731a71d259d26d854e3abf22 Text-delta-base-sha1: 531081e0139b49fa1a95680cb5bee0f77fe12a6e Text-content-length: 8705 Text-content-md5: cd22188cbf200dd3cde37dddcb526b64 Text-content-sha1: 483ce42a281c9c32f21c215b2900bd3bdf1c4ddd Content-length: 8705 SVN��@�t�PS�"�W&�h~�df$�6J�#_�vKG�8}�k7�n0�M8M�pg�W�+r�7�62`�7n�r;�X-/* * This is an implementation of wcwidth() and wcswidth() (defined in * IEEE Std 1002.1-2001) for Unicode. * * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html * * In fixed-width output devices, Latin characters all occupy a single * "cell" position of equal width, whereas ideographic CJK characters * occupy two such cells. Interoperability between terminal-line * applications and (teletype-style) character terminals using the * UTF-8 encoding requires agreement on which character should advance * the cursor by how many cell positions. No established formal * standards exist at present on which Unicode character shall occupy * how many cell positions on character terminals. These routines are * a first attempt of defining such behavior based on simple rules * applied to data provided by the Unicode Consortium. * * For some graphical characters, the Unicode standard explicitly * defines a character-cell width via the definition of the East Asian * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes. * In all these cases, there is no ambiguity about which width a * terminal shall use. For characters in the East Asian Ambiguous (A) * class, the width choice depends purely on a preference of backward * compatibility with either historic CJK or Western practice. * Choosing single-width for these characters is easy to justify as * the appropriate long-term solution, as the CJK practice of * displaying these characters as double-width comes from historic * implementation simplicity (8-bit encoded characters were displayed * single-width and 16-bit ones double-width, even for Greek, * Cyrillic, etc.) and not any typographic considerations. * * Much less clear is the choice of width for the Not East Asian * (Neutral) class. Existing practice does not dictate a width for any * of these characters. It would nevertheless make sense * typographically to allocate two character cells to characters such * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be * represented adequately with a single-width glyph. The following * routines at present merely assign a single-cell width to all * neutral characters, in the interest of simplicity. This is not * entirely satisfactory and should be reconsidered before * establishing a formal standard in this area. At the moment, the * decision which Not East Asian (Neutral) characters should be * represented by double-width glyphs cannot yet be answered by * applying a simple rule from the Unicode database content. Setting * up a proper standard for the behavior of UTF-8 character terminals * will require a careful analysis not only of each Unicode character, * but also of each presentation form, something the author of these * routines has avoided to do so far. * * http://www.unicode.org/unicode/reports/tr11/ * * Markus Kuhn -- 2003-05-20 (Unicode 4.0) * * Permission to use, copy, modify, and distribute this software * for any purpose and without fee is hereby granted. The author * disclaims all warranties with regard to this software. * * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c */ #include <wchar.h> #include "putty.h" /* for prototypes */ struct interval { int first; intwoSOFT HYPHEN (U+00AD) has a column width of 1-wmk_/* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ static const struct interval combining[] = { { 0x0300, 0x0357 }, { 0x035D, 0x036F00, 0x0603 }, { 0x0610, 0x0615 }, { 0x064B, 0x0658 }, { 0x0670, 0x0670 }, { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0AE2, 0x0AE3C, 0x0CBC }, { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 }, { 0x206A, 0x206F }, { 0x20D0, 0x20EA }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, { 0x1D167, 0x1D169 }, { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, { 0xE0100, 0xE01EFucs == 0x2329 || ucs == 0x232a || (ucs >= 0x2e80 && ucs <= 0xa4cf60d) || (ucs >= 0x30000 && ucs <= 0x3fffd))); } int mk_mk_wcwidth /* * The following functions are the same as mk_wcwidth() and * mk_wcwidth_cjk(), except that spacing characters in the East Asian * Ambiguous (A) category as defined in Unicode Technical Report #11 * have a column width of 2. This variant might be useful for users of * CJK legacy encodings who want to migrate to UCS without changing * the traditional terminal character-width behaviour. It is not * otherwise recommended for general use. */ int mk_, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c"E, 0x00AEB4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 }, { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, { 0x203B, 0x203B }, { 0x203E, 0x203E16, 0x2116 }, { 0x2121, 0x2122 }, { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 }, { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B }, { 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, { 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E }, { 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 }, { 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F }, { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, { 0x24EB, 0x254B }, { 0x2550, 0x2573 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x2614, 0x2615 }, { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0xE000, 0xF8FF }, { 0xFFFD, 0xFFFD }, { 0xF0000, 0xFFFFD }, { 0x100000, 0x10mk_wcwidth(ucs); } int mk_mk_ Node-path: putty-wishlist/data/wcwidth-upgrade Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f2ac81200303594fb43ea5f81ddeb02c Text-delta-base-sha1: c263cba4bd92b8a06a08c7268ba68bcee9a08aaa Text-content-length: 152 Text-content-md5: 62ffb00bcf94043909c6041efe73d73d Text-content-sha1: 81b909d086e7d99f5cac5afee0149e17d0e58be3 Content-length: 152 SVN��);~�i��jhj�j?Fixed-in: 2005-03-2401-12. There is a <a href="http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c">newer version</a> of Markus  Revision-number: 5548 Prop-content-length: 236 Content-length: 236 K 7 svn:log V 135 Since Markus Kuhn no longer explicitly places wcwidth.c in the public domain, it'd probably be generous to list him in the copyrights. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-23T20:23:07.823669Z PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c144dfa0c72df54dfb8b10c03fff7d2a Text-delta-base-sha1: 6a48cd2eb63e3cd72a75b37c61a99b40a8d511d8 Text-content-length: 38 Text-content-md5: bc1e9c3a9224aed1bc6cda1c400ce9f6 Text-content-sha1: cb4dcee0335ed00730d291d20e68052032ed30b8 Content-length: 38 SVN��cp �[��_Markus Kuhn, and Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ade0a4d0b6aa9c9cedb9fbeb510492dd Text-delta-base-sha1: 0921b6f2cb92589d259033364909360ddb32a125 Text-content-length: 32 Text-content-md5: 91e20d7a2eb77600d76471794386297a Text-content-sha1: 6fd141a9d1f4e68b8e5e256435da3ce4c35796e0 Content-length: 32 SVN��)6 �!�� Markus Kuhn Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: af7e36a9d8417bc342d1ae08494a2a3d Text-delta-base-sha1: ab0b60db34156200cbcb542020d4082a9aeba315 Text-content-length: 180 Text-content-md5: 74afef6eed0145c0ddaa2b011a03a82b Text-content-sha1: 787cb12f61aa6f687ca36e96d7d23f318e06e444 Content-length: 180 SVN��,B�O��[Q " "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry, " "Justin Bradford, Ben Harris, Malcolm Smith, Markus Kuhn, and " " Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d045ed0c2cb1a9746e4d4a5ce94fd161 Text-delta-base-sha1: 73d435d247089e4cdad721e5f13b9799aefe286f Text-content-length: 104 Text-content-md5: 5b568439800dd09d2521cf7473abb4a7 Text-content-sha1: 3799872fe7978154864c4f5fb0d2aa88055e10ee Content-length: 104 SVN��FkM�x��KxL�[k " "Justin Bradford, Ben Harris, Malcolm Smith, Markus Kuhn, and " " Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25da37c3114f5c87b6834f19871153b2 Text-delta-base-sha1: a0c8404ad9de81b628104efc740a97bf0bf69ba5 Text-content-length: 42 Text-content-md5: 491307defe188d034642b43952c77c8c Text-content-sha1: 24a3108ce3740e46ceebaf1d6f00097d6d6bb0c5 Content-length: 42 SVN��u �y��|yMarkus Kuhn, " " Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7b56b3081784f770d40bb2d891d4abf0 Text-delta-base-sha1: c578017e87da9609c6c7b9f61ec2584b1d3ad233 Text-content-length: 77 Text-content-md5: 5c3a15df7f6a3d012322daa59f684db3 Text-content-sha1: c20c68ccada76c6fd968dd0001e6bfcdb5d7ccee Content-length: 77 SVN��N[ 8�S��P~Markus Kuhn,", 1003, 10, 42, 206, 8 LTEXT "and CORE Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 62f9c5a65c50781cc8dd4ae8bc43ba66 Text-delta-base-sha1: 848b3dacb3cbe4cbc07acfaf965b9434b9b01140 Text-content-length: 77 Text-content-md5: 2c9ea00dcad2f5c9a6dd52f47fe467be Text-content-sha1: 396c66e1c3d4544b3032677eb9555c47a9045243 Content-length: 77 SVN�� 8���Q2Markus Kuhn,", 1003, 10, 42, 206, 8 LTEXT "and CORE Node-path: putty/windows/win_res.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f2102323c8696eff79611e3e2e08c68a Text-delta-base-sha1: f69a52bceeddd538c1aa794f1e45c2cc90ec4f2e Text-content-length: 77 Text-content-md5: 7123fb671e688a41787d437f59efe70b Text-content-sha1: da4161e8c30a2dc85000915b390efcb15611fcfa Content-length: 77 SVN��R_ 8�Y��NMarkus Kuhn,", 1003, 10, 42, 206, 8 LTEXT "and CORE Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4c8682f64651a9ebc9cdfe32a6eaca9f Text-delta-base-sha1: 7e880662c078ac9bbc56c2f86304acb5e9716afb Text-content-length: 38 Text-content-md5: 83fcca07462c8473763af6d1150e6cd9 Text-content-sha1: 292efa0f37040b64f504f6c1a884d2e83b7a8efa Content-length: 38 SVN��_l ���BMarkus Kuhn, and Revision-number: 5549 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 27 Fix comment re dmemdumpl() K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-24T01:01:24.318195Z PROPS-END Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e1c94d839434694bd980231cf3dad5b4 Text-delta-base-sha1: cafeb8a5979d29f47d0c662f16a58d3dee335691 Text-content-length: 38 Text-content-md5: e4b62f0eb7228985b776c95715a85561 Text-content-sha1: b9a685a0d3ae6c6e9934d777847c23cf6ec495be Content-length: 38 SVN�� ���the memory addres Revision-number: 5550 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2005-03-24T02:22:21.018436Z K 7 svn:log V 110 In fact, I'll document the wrinkle with "plink -load", rather than just wittering about it on a mailing list. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b164e8d5633f84d89f5fa5ced1951fbc Text-delta-base-sha1: 841081fd2b5f8d5ebb6dd018313716c80a7a28ea Text-content-length: 319 Text-content-md5: 018ba42e3e7ead321758f9af8beed84f Text-content-sha1: be299d83b16dbb72af915fb0d7583ce7c35d7e9d Content-length: 319 SVN��*S '�a�'�K_(You can also use the \c{-load} command-line option to load a saved session; see \k{using-cmdline-load}. If you use \c{-load}, the saved session exists, and it specifies a hostname, you cannot also specify a \c{host} or \c{user@host} argument - it will be treated as part of the remote command.) Revision-number: 5551 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2005-03-24T10:41:10.492932Z K 7 svn:log V 89 blowfish-ctr uses a 256-bit key, unlike blowfish-cbc. Update the patch to reflect this. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-ctr-modes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 814dabcc42d8ef0e53e9aefc4620b767 Text-delta-base-sha1: dff0155f1d4cbb6d345579276c8346b34737418c Text-content-length: 24 Text-content-md5: 75dbedded2cb37f617adb28031ef28c8 Text-content-sha1: 49d9bc4b21a63d47ba4e792514ca873755ed7434 Content-length: 24 SVN��]] �W��Z256 Revision-number: 5552 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2005-03-25T12:36:37.517571Z K 7 svn:log V 89 blowfish_key() wants a 128-bit key, so define blowfish256_key() for blowfish-ctr to use. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-ctr-modes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 75dbedded2cb37f617adb28031ef28c8 Text-delta-base-sha1: 49d9bc4b21a63d47ba4e792514ca873755ed7434 Text-content-length: 400 Text-content-md5: 33a6e287313bbc18df891b68b9694875 Text-content-sha1: 2f7a1ee9e7542e2d71d5bb59c568e204a9a4bd79 Content-length: 400 SVN��]5f���_�8#�(]�X27498,6 +524,12 @@ blowfish_setkey(ctx, key, 16); } +static void blowfish256_key(void *handle, unsigned char *key) +{ + BlowfishContext *ctx = (BlowfishContext *)handle; + blowfish_setkey(ctx, key, 32); +} + static void blowfish_iv(void *handle, unsigned char *key) { BlowfishContext *ctx = (BlowfishContext *)handle; @@ -542,6 +57494256 Revision-number: 5553 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2005-03-25T18:33:09.199824Z K 7 svn:log V 47 Add Bryan Kadzban's suggestions regarding AWE. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/virtuallock Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d1f1fc58d35c153c0fbe4dba87110c98 Text-delta-base-sha1: e5f8f6e6ba59fe998ad9ebba9fce205727d54ad6 Text-content-length: 2385 Text-content-md5: afb027c33ab5883d75412aaaa326f0ba Text-content-sha1: 0f27336e1c54548efecbfa35ff12d17f82bafee9 Content-length: 2385 SVN��^>�^�> Bryan Kadzban adds: <blockquote><pre> But I found an entry in a blogs.msdn.com blog (yes, I know... ;-)) that points to a way to accomplish the same goals. It says you can use the AWE APIs (Address Windowing Extensions) to get a page of physical memory that the kernel will never page to the swap file. There are a couple downsides, though. Number one, it's only supported on Windows 2000 and up (2K Pro/Server, XP, and Server 2003). Number two, the user has to have the "Lock pages into memory" privilege enabled on their account on the local machine. By default (on 2K Pro at least), the user list on this privilege is blank, which means that *nobody* has the needed privileges. Admins would have to assign the privilege at install time, or pageant (or the ssh backend itself, actually... I wonder if that would be useful?) would not be able to allocate these pages. It could still fall back to normal allocation in that case, though. Number three, you have to go and manually enable the SE_LOCK_MEMORY_NAME privilege in your code before using AllocatedUserPhysicalPages. But that's not too difficult, and there's actually a sample that shows how to do it all. The API reference is available online at MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/add ress_windowing_extensions.asp and the sample is available also: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/awe _example.asp I might be able to provide a patch to implement this, if I reread both winpgnt.c and its supporting files a lot between now and when I hear back from you. Right now, there's no obvious (to me) place in there where this method of allocating memory should go. Maybe what's needed is a generic "void *alloc_locked_pages(count)" function, that would be implemented in the various OS specific backends? Unix would malloc(count*sysconf(_SC_PAGESIZE)), then mlock(). Windows would go through all these contortions (on 2K and higher) or just malloc (on 9x or NT4). Of course this would have to be documented also, so that callers know that if they're running on 9x or NT4, the memory may not be locked. Which means that it may not be worth doing it, either. And obviously a different free()-type function would be required too. </pre></blockquote> <p>Message-ID: <42436579.9020707@kadzban.is-a-geek.net> Revision-number: 5554 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:46.300164Z PROPS-END Revision-number: 5555 Prop-content-length: 148 Content-length: 148 K 7 svn:log V 50 Summary: Accept wildcards on Pageant command line K 10 svn:author V 3 ben K 8 svn:date V 27 2005-03-28T13:23:09.807184Z PROPS-END Node-path: putty-wishlist/data/pageant-wildcard Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 434 Text-content-md5: c5fd77f1f2d5914331b52ccde33e8edd Text-content-sha1: e473990afc87040a8a366d3a85904c5a9ad7ad13 Content-length: 444 PROPS-END SVN���$$$Summary: Accept wildcards on Pageant command line Difficulty: fun Priority: medium Content-type: text/plain It's been suggested that Pageant's command-line handling (on Windows) should include the usual wildcard expansion. This would allow for doing something like "pageant keys/*.ppk" at login to load all the user's keys at once at login. This seems like a good idea. Message-ID: <200503181634.LAA25372@smart.net> Revision-number: 5556 Prop-content-length: 773 Content-length: 773 K 7 svn:log V 672 Render timing.c robust in the face of strangeness. The strangenesses in question vary per OS: on Windows the problem is that WM_TIMER sometimes goes off too early, so that GetTickCount() is right and the callback time is wrong, whereas on Unix the problem is that my GETTICKCOUNT implementation comes from the system clock which means it can change suddenly and non-monotonically if the sysadmin is messing about (meaning that the timing of callbacks from GTK or select timeouts is _more_ likely to be right than GETTICKCOUNT). This checkin provides band-aid workarounds for both problems, which aren't pretty but ought to at least prevent catastrophic assertion failure. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-03-28T17:48:24.285578Z PROPS-END Node-path: putty/timing.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 39d035ea88e76a4b4cd498f0046b1818 Text-delta-base-sha1: 51e97b727ee9cc83663551c926a59cb4e03110e6 Text-content-length: 2110 Text-content-md5: 6f14fabc8dad64276224cb06b79b826d Text-content-sha1: 1d010acfde2b438c9c14ac03d45a2f9d743c2b8c Content-length: 2110 SVN��;A�(�w�RB'�) /* * Just in case our various defences against timing skew fail * us: if we try to schedule a timer that's already in the * past, we instead schedule it for the immediate future. */ if (when - now <= 0) when = now + 1#ifdef TIMING_SYNC /* * In this ifdef I put some code which deals with the * possibility that `anow' disagrees with GETTICKCOUNT by a * significant margin. Our strategy for dealing with it differs * depending on platform, because on some platforms * GETTICKCOUNT is more likely to be right whereas on others * `anow' is a better gold standard. */ { long tnow = GETTICKCOUNT(); if (tnow + TICKSPERSEC/50 - anow < 0 || anow + TICKSPERSEC/50 - tnow < 0 ) { #if defined TIMING_SYNC_ANOW /* * If anow is accurate and the tick count is wrong, * this is likely to be because the tick count is * derived from the system clock which has changed (as * can occur on Unix). Therefore, we resolve this by * inventing an offset which is used to adjust all * future output from GETTICKCOUNT. * * A platform which defines TIMING_SYNC_ANOW is * expected to have also defined this offset variable * in (its platform-specific adjunct to) putty.h. * Therefore we can simply reference it here and assume * that it will exist. */ tickcount_offset += anow - tnow; #elif defined TIMING_SYNC_TICKCOUNT /* * If the tick count is more likely to be accurate, we * simply use that as our time value, which may mean we * run no timers in this call (because we got called * early), or alternatively it may mean we run lots of * timers in a hurry because we were called late. */ anow = tnow; #else /* * Any platform which defines TIMING_SYNC must also define one of the two * auxiliary symbols TIMING_SYNC_ANOW and TIMING_SYNC_TICKCOUNT, to * indicate which measurement to trust when the two disagree. */ #error TIMING_SYNC definition incomplete #endif } } #endif Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e1e3fb791665156fc4f4575dbabef8cc Text-delta-base-sha1: c1d91682a06e55791c6363cb2e7b068d93c945e6 Text-content-length: 252 Text-content-md5: 704c3925f476ceaec57bc68c32925fa1 Text-content-sha1: bc0020ee5119b1dc1f92f29cd8af9aaeac3f56cb Content-length: 252 SVN��?$ d�f�d�Ze/* getticks() works using gettimeofday(), so it's vulnerable to system clock * changes causing chaos. Therefore, we provide a compensation mechanism. */ #define TIMING_SYNC #define TIMING_SYNC_ANOW extern long tickcount_offset; Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec8f5d4540c935333599ea0437f6742c Text-delta-base-sha1: 0a16fae45c0514c8b07e89e24f583d30ea04adce Text-content-length: 81 Text-content-md5: a77e4a9b8a38e644cbde9193275a5bcd Text-content-sha1: 946780970903706f4abfaa6e08dac0693a43ceab Content-length: 81 SVN��4w3�G��k9�B"�Pdstdliblong tickcount_offset = 0; + tickcount_offset Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 23418f34f3fc70db8e296205e52b2f8c Text-delta-base-sha1: 1cb9e1b481d44f8b86ded546c4cae7e65aee2481 Text-content-length: 642 Text-content-md5: c88e844315c5b60231adc96db9ea312b Text-content-sha1: 4045300b786ee325f6feb1a5ddfddec1c2d5270d Content-length: 642 SVN��0� h�1�h�gI { long newnow = GETTICKCOUNT(); /* * Check to see whether the system clock has * changed massively during the select. */ if (newnow - now < 0 || newnow - now > next - now) { /* * If so, look at the elapsed time in the * select and use it to compute a new * tickcount_offset. */ long othernow = now + tv.tv_sec * 1000 + tv.tv_usec / 1000; /* So we'd like GETTICKCOUNT to have returned othernow, * but instead it return newnow. Hence ... */ tickcount_offset += othernow - newnow; now = othernow; } else { now = newnow; } } Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a3617295ca723809ed6080a0c793d7f Text-delta-base-sha1: f471aa1d74242c579c64437ff9ed971049be498c Text-content-length: 640 Text-content-md5: 346412aee7d9d15df380d22a85e379e7 Text-content-sha1: d388d73bf02dff987d5febab9afff3df03b19abb Content-length: 640 SVN��E h�0�h�}H { long newnow = GETTICKCOUNT(); /* * Check to see whether the system clock has * changed massively during the select. */ if (newnow - now < 0 || newnow - now > next - now) { /* * If so, look at the elapsed time in the * select and use it to compute a new * tickcount_offset. */ long othernow = now + tv.tv_sec * 1000 + tv.tv_usec / 1000; /* So we'd like GETTICKCOUNT to have returned othernow, * but instead it return newnow. Hence ... */ tickcount_offset += othernow - newnow; now = othernow; } else { now = newnow; } } Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 00c685757947a8fc3c591e504e103c22 Text-delta-base-sha1: 85180d3efa6789f3cd8f9d0b34b866978ab1f1ee Text-content-length: 300 Text-content-md5: 7081ea927000f4e5a5649481aa0e1b9d Text-content-sha1: 01b47b8b90c1c1beedd16efc2c90024b5535c60e Content-length: 300 SVN��8T �,��$On some versions of Windows, it has been known for WM_TIMER to * occasionally get its callback time simply wrong, and call us * back several minutes early. Defining these symbols enables * compensation code in timing.c. */ #define TIMING_SYNC #define TIMING_SYNC_TICKCOUNT Revision-number: 5557 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:46.613177Z PROPS-END Revision-number: 5558 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:46.623139Z PROPS-END Revision-number: 5559 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:46.633142Z PROPS-END Revision-number: 5560 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:46.643133Z PROPS-END Revision-number: 5561 Prop-content-length: 284 Content-length: 284 K 8 svn:date V 27 2005-03-29T13:10:33.027189Z K 7 svn:log V 183 After we receive EOF on stdin, we should clear ssh->send_ok so that we stop trying to read anything further from stdin. Otherwise we send a continuous stream of SSH2_MSG_CHANNEL_EOF. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d36623dbacc9b3b25b2ffc968fbed09c Text-delta-base-sha1: e41fdf27f0ab873abf0f631c727a32e7f36fb028 Text-content-length: 137 Text-content-md5: 501d0ce3fe14a0631d3d4f6167a5283a Text-content-sha1: a1312f132deef70b655e326d2b2730f0cfbc4a08 Content-length: 137 SVN����������������,| O�c�O�Jb ssh->send_ok = 0; /* now stop trying to read from stdin */ Revision-number: 5562 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2005-03-29T14:24:14.041677Z K 7 svn:log V 99 Small markup fixes I just noticed, mostly use of literal double quotes where \q{} would be better. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b1a91b88a0985c3865033987a12e9c9 Text-delta-base-sha1: 14902a5d58e2ee66ab37940fac36856d277b5ec0 Text-content-length: 317 Text-content-md5: 7d620dc6a29ecea395adfbb0470da04a Text-content-sha1: 8bcb575a4646639477e7d92e2b418b1c73a8ee6f Content-length: 317 SVN��l{��t�8f�*B\q{Assertion failed! Expression: (len & 15) == 0} in \cw{sshaes.c}, or \q{Out of memory}, or crashes) \b SSH-2 with 3DES (PuTTY says \q{Incorrect MAC received on packet}) \b SSH-1 with Blowfish (PuTTY says \q{Incorrect CRC received on packet}\q{Couldn't load private key from ...} Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 39eec0c7f3a0425e96eab4be5d175335 Text-delta-base-sha1: 46edf6cf10084cac8b1fd0f42795817eb494b62f Text-content-length: 86 Text-content-md5: cfbb477e9e97aadf51aa9b9f5d81024a Text-content-sha1: 686131def2be57bfb3eddb4409e12d90cc7452f6 Content-length: 86 SVN��,. ?�U��\q{About PuTTY} option from the System menu. Please \e{do not} Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 91e20d7a2eb77600d76471794386297a Text-delta-base-sha1: 6fd141a9d1f4e68b8e5e256435da3ce4c35796e0 Text-content-length: 48 Text-content-md5: 00271dde476584b4998e5af53f536150 Text-content-sha1: 7d3cbf97b53a9dbdf02b302bdea053c9c5f55832 Content-length: 48 SVN��6:�G��;Q�#\q{Software}\q{AS IS} Revision-number: 5563 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2005-03-29T15:07:58.516008Z K 7 svn:log V 67 Summary: Auto-scrolling while selecting should have variable speed K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/autoscroll-accel Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 391 Text-content-md5: 7ae75cd2c83baac159d016c2354db6e2 Text-content-sha1: aae8db3e52b74e1a2b98ea16c7882d6db6f9187c Content-length: 401 PROPS-END SVN���yyySummary: Auto-scrolling while selecting should have variable speed Class: wish Difficulty: fun Priority: medium Content-type: text/plain A present, if term_mouse() gets a drag event above or below the window, it scrolls the window by one line. It would be better if the amount of scrolling were proportional to the distance by which the mouse pointer was outside the window. Revision-number: 5564 Prop-content-length: 520 Content-length: 520 K 8 svn:date V 27 2005-03-30T08:27:54.076278Z K 7 svn:log V 419 <1112163342.018492.101240@f14g2000cwb.googlegroups.com> on comp.security.ssh contains a Dr Watson log which looks to me as if `unclean-close-crash' occurred due to a rekey timer going off after the session had closed. Hence, ssh2_timer() now avoids doing anything if the session is already closed, and also ssh_do_close() proactively calls expire_timer_context(). Between those I think they ought to solve the problem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 501d0ce3fe14a0631d3d4f6167a5283a Text-delta-base-sha1: a1312f132deef70b655e326d2b2730f0cfbc4a08 Text-content-length: 194 Text-content-md5: 621a20c2c39001a2a9aa869306dfbefc Text-content-sha1: 5c31a71a3aee9532bc85b9632ada6d74d57f33a0 Content-length: 194 SVN���� �-��:'expire_timer_context(ssh)����a�lic key.\r\n"); continue; �|MF���nit(SSH2_MSG_USERAUTH_REQUEST); ssh->state == SSH_STATE_CLOSED) return Revision-number: 5565 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2005-03-30T10:20:31.262903Z K 7 svn:log V 27 faq-timeout: update for XP K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7d620dc6a29ecea395adfbb0470da04a Text-delta-base-sha1: 8bcb575a4646639477e7d92e2b418b1c73a8ee6f Text-content-length: 170 Text-content-md5: 4792b176eb640e65b7db8a979111729e Text-content-sha1: 54cd84b34c3709ebec47dd32db0a41d58a26929b Content-length: 170 SVN��{d�8��+R�L}M�4G, 2000, or XP, the registry key to create or changesand \W{http://support.microsoft.com/default.aspx?scid=kb;en-us;314053}{314053 Revision-number: 5566 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 2005-03-30T14:50:28.538296Z K 7 svn:log V 198 I've just switched over to using Jacob's new autogen.pl for the FAQ, Feedback and Keys pages. Therefore, the old scripts for the former two are obsolete, and so is the static version of the latter. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 123 Content-length: 123 K 10 svn:ignore V 91 old*.html 0.* wishlist faq.html feedback.html keys.html putty-cvs.tar.gz putty-svn.dump.gz PROPS-END Node-path: putty-website/feedback.pl Node-action: delete Node-path: putty-website/keys.html Node-action: delete Node-path: putty-website/faq.pl Node-action: delete Revision-number: 5567 Prop-content-length: 255 Content-length: 255 K 7 svn:log V 154 Summary: Crashes with moderately large clipboard operations Class: bug Present-in: 0.56 2004-11-26 2004-11-29 2004-12-27 2005-02-22 2005-03-18 2005-03-28 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-30T14:56:09.316922Z PROPS-END Node-path: putty-wishlist/data/large-clipboard-crash Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1097 Text-content-md5: 0c6f718935bff22dd50b3eb0b9e57305 Text-content-sha1: 1373621b70978433546e1b24bbbc12d03ae75b04 Content-length: 1107 PROPS-END SVN���;;;Summary: Crashes with moderately large clipboard operations Class: bug Present-in: 0.56 2004-11-26 2004-11-29 2004-12-27 2005-02-22 2005-03-18 2005-03-28 Content-type: text/x-html-body <p> We've had some reports of crashes when moderately large clipboard operations (hundreds or thousands of lines, or approx 32k+) are performed. We've not been able to reproduce this ourselves. Some reports indicate that it might be specific to certain servers. <p> Typically this is associated with use of the "Copy All to Clipboard" menu action, but apparently it can happen with ordinary mouse-button copy-and-paste too. <ul> <li><tt>s19e0a69.037@dohprimo.ccf.health.nsw.gov.au</tt> <br>0.53 and 0.56 "Out of memory", >400 lines (ish); "T64 Unix" <li><tt>41D261A2.4060806@lucent.com</tt> <br>0.56 "Out of memory", snapshots crash; HP-UX 11 and SunOS 5 <br>Dr Watson, registry settings, logs <li><tt>549E069FE8AE6E4C95E0420E534FCD010324DA7C@exchgob7.corp.dir.ameren.com</tt> <br>Cisco PIX firewalls, Clear Scrollback, Copy All to Clipboard <br>Limited XP error report information </ul> Revision-number: 5568 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2005-03-30T15:13:55.179416Z K 7 svn:log V 16 Another report. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/large-clipboard-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c6f718935bff22dd50b3eb0b9e57305 Text-delta-base-sha1: 1373621b70978433546e1b24bbbc12d03ae75b04 Text-content-length: 304 Text-content-md5: 224e989a957dccd3b82c8da241b7765b Text-content-sha1: 02b7106b32fc61497d06cb5cf8783828cb94c549 Content-length: 304 SVN��;]�V�� R�Sh3 0.54 2004-06-01<a href="http://groups.google.com/groups?as_umsgid=Rb8vc.137%24vO1.1200%40nnrp1.uunet.ca">Rb8vc.137$vO1.1200@nnrp1.uunet.ca</a></tt> (news) / <tt>E1BVqZq-000837-00@chiark.greenend.org.uk</tt> (mail) <br>0.54 + snapshot; OpenSSH; "clear scrollback" implicated? Revision-number: 5569 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2005-03-30T15:23:57.025961Z K 7 svn:log V 98 Summary: Failed assertion: count234(term->scrollback) <= newsavelines Class: bug Present-in: 0.55 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/assert-fail-newsavelines Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 649 Text-content-md5: 548ae1d9779e6349d6fa602841f8d138 Text-content-sha1: ce2b9979c107da3c05faadcf4da020e39dd5d674 Content-length: 659 PROPS-END SVN���{{{Summary: Failed assertion: count234(term->scrollback) <= newsavelines Class: bug Present-in: 0.55 <p> We've had occasional reports of the failure of the following assertion: <p>terminal.c:559 (0.55) <br>count234(term->scrollback) <= newsavelines <p> All the reports we've had seem to also include a CPU-intensive delay at connection startup (possibly at other times too). <p> We've not been able to reproduce this ourselves. <ul> <li><tt>OFA8A74C15.A4B5BE13-ON65256EF4.00210ED6-80256EF4.003C2FE1@in.ibm.com</tt> <br>Telnet <li><tt>2872.66.167.58.15.1094144958.squirrel@66.167.58.15</tt> <br>0.55, "09-02-2004"; SSH </ul> Revision-number: 5570 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 25 Digest of today's report K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-30T15:28:58.982082Z PROPS-END Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e80467aa1adc5ce1cbcd38c55fc4744b Text-delta-base-sha1: a49f0944a8abb253cb323af6ddf73abcfb1cf9b6 Text-content-length: 346 Text-content-md5: 3b70f9d5aa0a3ecae8552fe97bab1fcd Text-content-sha1: 882fa3cd8c8137bdb01cba04f72ad02d4ece4b98 Content-length: 346 SVN��m.;�E�l�AO�+Bp> We've had one report since we added diagnostics which indicates that <tt>screen</tt> doesn't contain enough entries. However, we haven't thought of a plausible mechanism for <tt>screen</tt> or <tt>alt_screen</tt> to end up undersizedli><tt>f37cdb910503291851a052bd9@mail.gmail.com</tt> <br>with diagnostic info Revision-number: 5571 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2005-03-30T16:16:52.054881Z K 7 svn:log V 70 reinstate putty.be, putty.nl new putty.linuxrs.com.br, asiamirror.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7c7989d86b6888671c5cad2bb669424b Text-delta-base-sha1: 915ef9edec2a1947ff983e8950d52288be20cfb2 Text-content-length: 198 Text-content-md5: 7678dccfddcc6bbf37e182b7355b3a5d Text-content-sha1: e3864595d85cb9338723054f38d58a5aaf2231fb Content-length: 198 SVN��8, � ��P8�P�V{�jc�Rp�WS�A@�U0www.putty.be/">putty.belinuxrs.com.br/">putty.linuxrswww.asiamirror.net/putty/">asiamirror.netwww.putty.nl/">putty.nl</a> in the Netherlands Revision-number: 5572 Prop-content-length: 445 Content-length: 445 K 7 svn:log V 344 Two new items. `unicode-normalisation' is a loose end in `unicode-combining' which I thought merited moving out into its own entry since it has different difficulty characteristics and dependencies; `x11-ipv6-breakage' is (I think) the one remaining NONREPRODUCIBLE oddity in my list of things that need wishlist entries before releasing 0.58. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-03-30T19:05:07.377191Z PROPS-END Node-path: putty-wishlist/data/unicode-normalisation Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1067 Text-content-md5: 170dd59fff932a29deff2f931c1d33cb Text-content-sha1: dd26a6b427cbba256eda6bf0027f254ab0f3cdd2 Content-length: 1077 PROPS-END SVN���Summary: Apply Unicode normalisation to combining characters Class: wish Priority: low Difficulty: tricky Depends: mdpi Content-type: text/x-html-body <p> The bug <a href="unicode-combining.html">unicode-combining</a> is marked as fixed. However, it mentioned that the sequence of code points occupying a character cell ought to be maintained in Normalisation Form C (see <a href="http://www.unicode.org/unicode/reports/tr15/">UAX #15</a>). This has not yet been done, although combining character support is complete in all other respects. <p> I was originally convinced of the need for normalisation simply because it was what <code>xterm</code> did. I'm now less certain, and I wonder if it ought to be configurable (and if so whether the particular normalisation form in use ought to be configurable too). <p> Regardless, this is a big job, and in particular it will require considerable code size increase since normalisation is a job needing large tables. Therefore, I fear it will have to wait until we have <a href="mdpi.html">mdpi</a> done. Node-path: putty-wishlist/data/x11-ipv6-breakage Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1238 Text-content-md5: adaf2d45e2acbcd1a61a95c34e11fcce Text-content-sha1: 6a05bf49c2bb4651762efcbd9d707db10c9d714b Content-length: 1248 PROPS-END SVN���HHHSummary: Reported X forwarding breakage due to IPv6 Class: bug Priority: medium Difficulty: taxing Present-in: 2005-02-10 Content-type: text/x-html-body <p> We've had one report that X forwarding in PuTTY broke after we integrated the IPv6 code. Presumably the IPv6 changes have had some sort of side effect on the local network connection between PuTTY and the X server, but it isn't clear what since we haven't been able to reproduce it. <p> We received this report by email (<code><41E6F012.2040105@ressukka.net></code>). Details include: <ul> <li> The symptom at the remote end is that X applications report "X connection to localhost:10.0 broken (explicit kill or server shutdown)". <li> The X display in the PuTTY configuration is the PuTTY default (equivalent to <code>localhost:0</code>). The reporter found that requesting <code>127.0.0.1:0</code> instead worked, although not consistently. (This leads me to wonder whether "<code>localhost</code>" might have been resolving to an IPv6 address on the system in question.) <li> The X server was xorg 6.8.1 from Cygwin. <li> Windows version was XP SP2. </ul> <p> If anyone is able to reproduce this or shed some light on possible causes, we'd be grateful. Revision-number: 5573 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 2005-03-30T19:33:24.441474Z K 7 svn:log V 198 Further fix for lcc-win32. The PuTTY suite now compiles fine for me using lcc-win32 v3.8 (compilation date Mar 2 2005 18:40:17) provided I pass COMPAT="-DNO_IPV6 -DNO_MULTIMON" on the command line. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f4e2bb780e3c383debbf39702e96a97 Text-delta-base-sha1: cf0d8cc2d0392e0e6cd82fa146125bba0654170b Text-content-length: 702 Text-content-md5: cea8db77f0a9519f4f56f820a19f8128 Text-content-sha1: c67faa893913e81d86023b94756916e988b8c8fa Content-length: 702 SVN����R�4�R�zK#ifdef __LCC__ /* * The LCC include files apparently don't supply the * GCP_RESULTSW type, but we can make do with GCP_RESULTS * proper: the differences aren't important to us (the only * variable-width string parameter is one we don't use anyway). */ GCP_RESULTS gcpr; #else GCP_RESULTSW gcpr; #endif�m(;;�m�/ *p++ = 0; return p - output; } if (wParam == VK_SPACE && shift_state == 3) { /* Ctrl-Shift-Space */ *p++ = 160; return p - output; } if (wParam == VK_CANCEL && shift_state == 2) { /* Ctrl-Break */ *p++ = 3; *p++ = 0; return -2; } if (wParam == VK_PAUSE) { /* Break/Pa Revision-number: 5574 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 XXX-REMOVE-BEFORE-RELEASE: check docs too K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-31T09:02:07.455044Z PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4b59dbf82cf052b8c7f494e09b33437b Text-delta-base-sha1: 8b8f495cb6f7fdb1d57b043667d4c1d34d4db64d Text-content-length: 119 Text-content-md5: 9a5da1ee8ddbb4f8e2b69a3dbd0cdbff Text-content-sha1: f8db390abb0b0fa93a29a84f3a17612af12768d8 Content-length: 119 SVN��w a�f�a�Q&(including the documentation) and remove anything tagged with a comment containing the word Revision-number: 5575 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2005-03-31T09:28:41.438260Z K 7 svn:log V 13 Content-type K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/assert-fail-newsavelines Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 548ae1d9779e6349d6fa602841f8d138 Text-delta-base-sha1: ce2b9979c107da3c05faadcf4da020e39dd5d674 Text-content-length: 49 Text-content-md5: 2c2417c0d8f420cd8045053a0b133ae2 Text-content-sha1: 8024ca721252facccc5031ef3f56bd00d8bae159 Content-length: 49 SVN��{�b��aContent-type: text/x-html-body Revision-number: 5576 Prop-content-length: 112 Content-length: 112 K 7 svn:log V 12 Prioritise. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-31T09:29:37.030291Z PROPS-END Node-path: putty-wishlist/data/assert-fail-newsavelines Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c2417c0d8f420cd8045053a0b133ae2 Text-delta-base-sha1: 8024ca721252facccc5031ef3f56bd00d8bae159 Text-content-length: 33 Text-content-md5: 306cb0b034b768062a50716d2842486c Text-content-sha1: 59b1e2c5c8293fd9a2b6c220c3e9285f03a59708 Content-length: 33 SVN��+�S��JPiority: medium Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b70f9d5aa0a3ecae8552fe97bab1fcd Text-delta-base-sha1: 882fa3cd8c8137bdb01cba04f72ad02d4ece4b98 Text-content-length: 33 Text-content-md5: aa2b965e9f942e2494f5bb74ab6fa6de Text-content-sha1: 008d28f4f5890df2c6f65e2cdfdaf169dcfd1da3 Content-length: 33 SVN��.?�M��dJiority: medium Node-path: putty-wishlist/data/large-clipboard-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 224e989a957dccd3b82c8da241b7765b Text-delta-base-sha1: 02b7106b32fc61497d06cb5cf8783828cb94c549 Text-content-length: 33 Text-content-md5: 1e78dcd000694584412f1e09b0262f20 Text-content-sha1: 6df7ebe816e0f3da838841fc1511fea120f0bbb0 Content-length: 33 SVN��]n�I��Fiority: medium Revision-number: 5577 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2005-03-31T09:33:05.047332Z K 7 svn:log V 15 unclosed <tt>s K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/host-key-sig-verify-fail Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 942381cb2ad03c39d31fd814a0af9c6d Text-delta-base-sha1: c886b1bde42d16b3f323001db428c82672e4735d Text-content-length: 155 Text-content-md5: 1dd19f831b1cbd985b457672f30dd94d Text-content-sha1: 1f825cb51cf0c42477985b6681efead9ce902563 Content-length: 155 SVN��9Mz���H�,gp�@y</tt></tt></tt> <br>0.56/0.57, "OpenSSH_3.4p1" <br><tt><200503181604010835.10B29C1C@mail.liveplaylearn.com></tt> Revision-number: 5578 Prop-content-length: 110 Content-length: 110 K 8 svn:date V 27 2005-03-31T09:33:35.051131Z K 7 svn:log V 10 Classify. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pageant-wildcard Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5fd77f1f2d5914331b52ccde33e8edd Text-delta-base-sha1: e473990afc87040a8a366d3a85904c5a9ad7ad13 Text-content-length: 77 Text-content-md5: 2a877c739b8529b18a566d87926e141d Text-content-sha1: c2fbc5eb19808b66f8c115b73f48f820e4692e99 Content-length: 77 SVN��$0=�s1Summary: Accept wildcards on Pageant command line Class: wish Revision-number: 5579 Prop-content-length: 103 Content-length: 103 K 8 svn:date V 27 2005-03-31T09:34:15.285968Z K 7 svn:log V 4 <p> K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/virtuallock Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: afb027c33ab5883d75412aaaa326f0ba Text-delta-base-sha1: 0f27336e1c54548efecbfa35ff12d17f82bafee9 Text-content-length: 24 Text-content-md5: 137d2b7a49882e8e1469fff99db3b49d Text-content-sha1: 641e8974ae2b5303a2363e62cb8d0a633843ac42 Content-length: 24 SVN�� �_��>^<p> Revision-number: 5580 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2005-03-31T10:56:13.833650Z K 7 svn:log V 63 tools.ietf.org provides stable references for the SSH-2 drafts K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d76a46219ef04ace32b66c6aa16827e4 Text-delta-base-sha1: 5762272f41a330db165b64c03d920720d338e84d Text-content-length: 1041 Text-content-md5: 9e7c5f6887ff169d11a2fda0c77d78f2 Text-content-sha1: 725b700ac6a05403af83c3c9f20e30a9bff96000 Content-length: 1041 SVN��A y�i�y�, <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-architecture/">architecture</a>, <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-transport/">transport</a>, <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-userauth/">userauth</a>, <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-connect/">connect</a>, <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-assignednumbers/">assignednumbers</a> <li><a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-dh-group-exchange/">dh-group-exchange</a> <li><a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-auth-kbdinteract/">auth-kbdinteract</a> <li><a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-break/">break</a> <li><a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-fingerprint/">fingerprint</a> <li><a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-publickeyfile/">publickeyfile</a> <li><a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-filexfer/">filexfer</a> Revision-number: 5581 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2005-03-31T11:23:48.107289Z K 7 svn:log V 52 Cross-link unicode-combining, unicode-normalisation K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unicode-combining Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 320d2bb12196f8a1cba68b0c73c2bfc5 Text-delta-base-sha1: 143b4c0fc657e0c57cfb75a9f8521f0ed5ce8356 Text-content-length: 125 Text-content-md5: 8d52f75f5d2f4a3f6592a61e20f17fc0 Text-content-sha1: 39fc660ae1d2cca8e76247d49e7ba38d539351c2 Content-length: 125 SVN��6"l�6�lNormalisation is not yet implemented; see <a href="unicode-normalisation.html">`unicode-normalisation'</a>. Node-path: putty-wishlist/data/unicode-normalisation Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 170dd59fff932a29deff2f931c1d33cb Text-delta-base-sha1: dd26a6b427cbba256eda6bf0027f254ab0f3cdd2 Text-content-length: 37 Text-content-md5: 5538887f6e468f0214e0c104712258ab Text-content-sha1: 4619dabe63666877db4607a43db4c3590eb944d6 Content-length: 37 SVN��/�w��&w unicode-combining Revision-number: 5582 Prop-content-length: 185 Content-length: 185 K 7 svn:log V 85 Use tools.ietf.org references for SSH-2 I-Ds that we haven't implemented at all yet. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-03-31T11:29:02.256302Z PROPS-END Node-path: putty-wishlist/data/agentfwd-ssh.com Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e80d3f430f2ae0eb1d61f5b4f7f2bfec Text-delta-base-sha1: c2b6122dd2285432910aa5198d5c60ddfe0ab408 Text-content-length: 93 Text-content-md5: 0302c54d48449b6872581ab7e39a98d1 Text-content-sha1: 2068abbbaece435a41384ed067c2f1f1f2ceb4b6 Content-length: 93 SVN��L�8�Ltools.ietf.org/wg/secsh/draft-ietf-secsh-agent/">draft-ietf-secsh-agent</a> Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ab7be6ee0ae9b694eda253288fe6f81e Text-delta-base-sha1: 5c396c47308d74e65942f1df7787bf8b7adab72a Text-content-length: 126 Text-content-md5: 3a26763760f3ac658c1716f818da67dc Text-content-sha1: 2ef7f4b535bd7d4789d70af5815f87f35ad72b1b Content-length: 126 SVN��X h�u�h�{<a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-gsskeyex/">draft-ietf-secsh-gsskeyex</a></tt>) Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a644ee084bc25ca8d5d8ebbd56d7cea0 Text-delta-base-sha1: 455652277c03954f8de3317cab48dafdc2df3547 Text-content-length: 163 Text-content-md5: 1a039d489d743a31a83264e7d902d5b7 Text-content-sha1: 27ed1f3ec581f30693954f2dc5414387a3085e98 Content-length: 163 SVN��F8 �� .<a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-scp-sftp-ssh-uri/">draft-ietf-secsh-scp-sftp-ssh-uri</a>, but that draft has expired Node-path: putty-wishlist/data/subsystem-publickey Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d2ee9a2b5564288ab68fad1adf248f8e Text-delta-base-sha1: 0fc954a4de07ca742efde3fcea9c1dd0766ce9c3 Text-content-length: 125 Text-content-md5: d3c1317331140734aff9deb2e5360a73 Text-content-sha1: 8f3c030871f7d4fe7a954e263e3ed1e89539f8bc Content-length: 125 SVN��L! g� �g�-tools.ietf.org/wg/secsh/draft-ietf-secsh-publickey-subsystem/">draft-ietf-secsh-publickey-subsystem</a> Revision-number: 5583 Prop-content-length: 323 Content-length: 323 K 7 svn:log V 222 Beef up the `unfinished and experimental' warnings for the two Mac ports, mentioning in particular that even if you downloaded a _release_ source archive these particular ports are not considered to be of release quality. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-03-31T12:25:48.267737Z PROPS-END Node-path: putty/mac/README.mac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 77aa515a15a8faeed44ba19abcd0c5a8 Text-delta-base-sha1: 9573f2e09ecfc74a0ef1a1d1f693dc6abe5e0b11 Text-content-length: 148 Text-content-md5: 6d9250d550ba8f1938e64a891d981fe6 Text-content-sha1: 41fd9c0b20c478c4a407ceb0778ba8a94c33723c Content-length: 148 SVN��QS ~�Q�~�MIt is not considered to be of release quality, even if you found it (and you're reading this) in a PuTTY release source archiv Node-path: putty/macosx/README.OSX Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fc78517d954bf0beac1680026d9bf28 Text-delta-base-sha1: 3e42127f63cc06dc46478b6973e79f84434373e4 Text-content-length: 244 Text-content-md5: 105316dd51fd379d2b193120daf0dc63 Text-content-sha1: 9999cbc5abcbb5fc455f6a9e7762504486bf1129 Content-length: 244 SVN��6? \��\�LjIt is _not_ considered to be of release quality, even if you've found it (and are reading this) in a PuTTY release source archive. You are welcome to try using it, but don't be surprised at unexpected behaviour. I'm not Revision-number: 5584 Prop-content-length: 268 Content-length: 268 K 7 svn:log V 167 FAQ entry on rekeys: Jacob would like to pre-emptively try to avoid the possibility of people falling back to SSH-1 just because it gets rid of the irritating delays. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-03-31T13:45:41.635544Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4792b176eb640e65b7db8a979111729e Text-delta-base-sha1: 54cd84b34c3709ebec47dd32db0a41d58a26929b Text-content-length: 805 Text-content-md5: 8f1ac2eeb76a94fd21320025ea4609c0 Text-content-sha1: 269ce062fb9262be9ea7fba2b2ef879ff5156ad0 Content-length: 805 SVN��dp �?� �(<S{faq-rekey}{Question} My SSH-2 session \I{locking up, SSH-2 sessions}locks up for a few seconds every so often. Recent versions of PuTTY automatically initiate \i{repeat key exchange} once per hour, to improve session security. If your client or server machine is slow, you may experience this as a delay of anything up to thirty seconds or so. These \I{delays, in SSH-2 sessions}delays are inconvenient, but they are there for your protection. If they really cause you a problem, you can choose to turn off periodic rekeying using the \q{Kex} configuration panel (see \k{config-ssh-kex}), but be aware that you will be sacrificing security for this. (Falling back to SSH-1 would also remove the delays, but would lose a \e{lot} more security still. We do not recommend it.) Revision-number: 5585 Prop-content-length: 625 Content-length: 625 K 8 svn:date V 27 2005-03-31T18:52:21.603099Z K 7 svn:log V 524 Add text to the troubleshooting chapter about the errors that can be caused when an active connection times out due to outgoing data exceeding its maximum number of retries, and mention that this can occur even when you didn't think you'd sent anything due to rekeys and/or keepalives. Unix generates ETIMEDOUT in this situation. Windows, it turns out after doing an actual experiment by disabling my firewall, generates ECONNABORTED! So _that's_ what it means under Windows. I wish I'd done this experiment years ago now. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 62e1600372e2abcccae449612783f26d Text-delta-base-sha1: acc1cd2ea2dac5138c4273a971ec0927815b5a29 Text-content-length: 1261 Text-content-md5: d0d8e744059fc76b04cbe1e4b17a2245 Text-content-sha1: 802a3e6a568c77d60c546d2dc6811280a9661700 Content-length: 1261 SVN��gMM��\�7�07qindows also generates this error if it has given up on the machine at the other end of the connection ever responding to it. If the network between your client and server goes down and your client then tries to send some data, Windows will make several attempts to send the data and will then give up and kill the connection. In particular, this can occur even if you didn't type anything, if you are using SSH-2 and PuTTY attempts a key re-exchange. (See \k{config-ssh-kex-rekey} for more about key re-exchange.) (It can also occur if you are using keepalives in your connection. Other people have reported that keepalives \e{fix} this error for them. See \k{config-keepalive} for a discussion of the pros and cons of keepalives.) Unix also generates this error when it tries to send data down a connection and contact with the server has been completely lost during a connection. (There is a delay of minutes before Unix gives up on receiving a reply from the server.) This can occur if you type things into PuTTY while the network is down, but it can also occur if PuTTY decides of its own accord to send data: due to a repeat key exchange in SSH-2 (see \k{config-ssh-kex-rekey}) or due to keepalives (\k{config-keepalive}). Revision-number: 5586 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2005-03-31T22:09:06.943130Z K 7 svn:log V 6 Patch K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/optimise-bignum Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef9fb5e1605cda0e77b9475c88ec6659 Text-delta-base-sha1: 92914bb967b9a0b039332b38e2f35385e965db5c Text-content-length: 87 Text-content-md5: 48c28d922022fe3025dc2d07b5a2ef9a Text-content-sha1: aa7fef9adf8dc44ba261d7ad1a7d8591351724b7 Content-length: 87 SVN��g-F�g�F Patch for MSVC (unreviewed): <20050331164047.GA24174@clipper.ens.fr> Revision-number: 5587 Prop-content-length: 279 Content-length: 279 K 7 svn:log V 178 sk_address_is_local() was ignoring the possibility that a SockAddr might have an IPv4 address in `ai' rather than in `addresses'. Thanks to Martin Prikryl for pointing this out. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-04-01T08:46:26.885384Z PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da414f04534361ad001abc5fc43943c7 Text-delta-base-sha1: 509534ac3210398c77b40361465278c8ea34c6a3 Text-content-length: 361 Text-content-md5: 0d3734a0d47505c5582d9029b2335129 Text-content-sha1: fea47f1f0beba1e71d8b2ec8faf77cfa96e9c2bd Content-length: 361 SVN��X~L�L�L�fr#ifndef NO_IPV6 if (addr->ai) { return ipv4_is_local_addr(((struct sockaddr_in *)addr->ai->ai_addr) ->sin_addr); } else #endif { struct in_addr a; assert(addr->addresses && addr->curraddr < addr->naddresses); a.s_addr = p_htonl(addr->addresses[addr->curraddr]); return ipv4_is_local_addr(a); } Revision-number: 5588 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2005-04-01T13:09:38.553568Z K 7 svn:log V 16 Thoughts on UI. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/terminal-modes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fd71e6a085d6c32e3985f9f4c92a39d Text-delta-base-sha1: ce0d833dcdc54ac04df7d49270d6f80576e2e714 Text-content-length: 2423 Text-content-md5: 2342cd6bd2fa14796dde7dca9e980df1 Text-content-sha1: 27154f461481721082ceacc3bea356ca4dfbe7a4 Content-length: 2423 SVN��gNR�h�P�tz�b:L�>Jtechnically within their rights, although I (JTN) consider them buggy nonethelesA complete UI for terminal modes would be a noticeable amount of work. However, given the underspecification of the area, it seems necessary to avoid breaking as many systems as are fixed. Here's a sketch: <p><pre> Mode: [DSUSP [v]] Value: ( ) Auto (o) This: [^Q ] __________ _________ [Mode______|Value____] [INTR ^C ] [ Add ] [KILL ] [ECHO (auto) ] [ Remove ] [ ]</pre> <ul> <li>"Mode" is a drop-down list of all terminal modes. <br>(I will probably use the POSIX names rather than trying to invent our own; similarly, I won't attempt to document them all, although I would probably mention some "notable" ones.) <li>The main listbox is a subset of all the terminal modes. If a mode is not on this list, no value will be sent. <br>(It allows multiple selections for easy removal of lots of modes.) <li>"Auto" asks the frontend for a value. The frontend has the opportunity to say "dunno, don't send anything". Examples: <ul> <li>For PuTTY proper, ERASE would look at the configured backspace character. <li>For PuTTY proper, the echoing/editing suggestion above. <li>For Plink on Unix, "auto" means "look at your local terminal, and propagate that". <li>Unix GUI tools probably shouldn't propagate modes from any controlling terminal. (After all, <tt>xterm</tt> doesn't.) <li>For obscure things on which PuTTY has no opinion, e.g. SWTCH, PuTTY will say "dunno" and hence nothing will be sent, whereas Unix Plink will return whatever the local terminal has. </ul> <li>The "value" textbox will take a string input and not validate it particularly; it will be interpreted by the backend. <ul> <li>Special characters will have the usual sort of "^C" interpretation going on. To indicate "no value" (255 in SSH), I'll probably use the empty string. </ul> <li>The default setting will have most (all?) of these present and set to "auto", leaving the decision on whether it's sensible to send a value to the frontend. (Might leave out some things such as PENDIN where it's not clear that they're useful.) </ul> <p> Configurable options in this area might also be directly usable by the pty back end in pterm. <p> Possibly also Telnet to some extentPerhaps that's better handled by separate UI, though. Revision-number: 5589 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2005-04-01T13:25:13.304706Z K 7 svn:log V 75 #ifdef out expensive combining-character/scrollback diagnostics (for now). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1fc04bdd11ebddd1d1502844b1a6357e Text-delta-base-sha1: 045b62005516241d1f0f079e779423ca323dd0f3 Text-content-length: 890 Text-content-md5: f48a8abec35768fe2bed9c7a5b6c1e3d Text-content-sha1: fdb81e5b6c0fbb4e9f9487978d803353cb64ea3e Content-length: 890 SVN����L�J�L�1 �M=�6E�E6�:�WxQ�:� H�E �v 6#ifdef TERM_CC_DIAGS /* * Diagnostic function: verify that a termline has a correct * combining character structure. * * This is a performance-intensive check, so it's no longer enabled * by default#endif#ifdef TERM_CC_DIAGS cc_check(line); #endif#ifdef TERM_CC_DIAGS cc_check(line); #endif#ifdef TERM_CC_DIAGS cc_check(destline); #endif#ifdef TERM_CC_DIAGS cc_check(line); #endifThis is a bit performance-heavy for production code. */ #ifdef TERM_CC_DIAGS#endif /* TERM_CC_DIAGS */#ifdef TERM_CC_DIAGS cc_check(line); #endif#ifdef TERM_CC_DIAGS cc_check(line); #endif0xFF) << ATTR_BGSHIFT); i += 2; } break; } } set_erase_char(term); } break; case 's': /* save cursor */ save_c�Y��Y6 Revision-number: 5590 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2005-04-01T20:22:16.277258Z K 7 svn:log V 53 Summary: Support short reads in SFTP Class: semi-bug K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/fxp-short-reads Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1152 Text-content-md5: 3a6d284ba263f8e2104b20576678dd15 Text-content-sha1: 65350513187e4cf733f7c5e143bc7f2be4a0389b Content-length: 1162 PROPS-END SVN���rrrSummary: Support short reads in SFTP Class: semi-bug Content-type: text/x-html-body <p> In the SSH file transfer protocol (SFTP), there is the possibility of the server returning less data than we asked for in response to a read request (SSH_FXP_READ). <p> Currently, the SFTP implementation in PSFTP/PSCP will barf if this happens other than at EOF ("error while reading: received a short buffer from FXP_READ, but not at EOF"). The filexfer draft at the time seemed to indicate that this was an exceptional condition that only applied to "special" files. However, on closer examination, its "guarantee" of no short reads appears not to be reliable. <p> We've had one report of this causing trouble with an OpenVMS server that likes to return ZIP files in 512-byte chunks due to the nature of the underlying filesystem (whereas we ask for 4k chunks). <p> Since PSFTP/PSCP usually <a href="sftp-slow.html">has several requests outstanding</a> at any one time, dealing with this properly requires a strategy for dealing with fragmentation and reassembly. (But this shouldn't be too bad as we already deal with out-of-order responses.) Revision-number: 5591 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2005-04-01T20:27:50.361710Z K 7 svn:log V 21 Adaptation, paranoia K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/fxp-short-reads Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3a6d284ba263f8e2104b20576678dd15 Text-delta-base-sha1: 65350513187e4cf733f7c5e143bc7f2be4a0389b Text-content-length: 325 Text-content-md5: eee0dba5c00b5b9ecf0ac6e6ee0506fb Text-content-sha1: 03f5b1f9f142e678551784d01470a6c7ec999a19 Content-length: 325 SVN��r ,���`*ve We may also want to attempt to adapt to the server's apparent preferred block size, although we should be prepared for this adaptation to fail. <p> All this should probably be implemented in as paranoid a manner as possible to avoid the server being able to cause unbounded buffering at our end. Revision-number: 5592 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2005-04-04T13:44:45.093468Z K 7 svn:log V 108 NULL needs to be cast to void * when passed to a variadic function like execl(). Spotted by Damien Miller. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c60eca2d749ad45b1540067088dc4546 Text-delta-base-sha1: 10f1e8e4b3e9763ce9584839fa82a5f4802cc787 Text-content-length: 29 Text-content-md5: be5e64fbb36482e6dbd5dd1e6f669053 Text-content-sha1: 972d4ba5c36a97ea8aa08e9e4b69f7b857d51394 Content-length: 29 SVN��EM �{��J{(void *) Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c63609c861adade68ee0be9aa79839ed Text-delta-base-sha1: 6be3c5c3d6d970bc226a2262a435741f690c6412 Text-content-length: 33 Text-content-md5: a7490e5ed6962cba7e0c34f8a957459c Text-content-sha1: c7c04cc8de716968a938ff3276a960f1fd46f73f Content-length: 33 SVN��x� �7��A7(void *) Revision-number: 5593 Prop-content-length: 319 Content-length: 319 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-05T18:01:32.446555Z K 7 svn:log V 218 Index the complete PuTTY manual. This was a bit rushed, and could doubtless be improved. Also fix a couple of things I noted on the way, including: - "pscp -ls" wasn't documented - Windows XP wasn't mentioned enough PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c700d00e6fede650916958a308fa7384 Text-delta-base-sha1: 69c59398d274da825bb0c1e1289bc301dc44b3d0 Text-content-length: 136 Text-content-md5: a375b5d1f652dba2ac0a1b140147bfaa Text-content-sha1: 2daebd759f22f2d0ac6d562a336af7cb931e274b Content-length: 136 SVN��%l�b�N�*�H:\i{Unix version}; the Unix version has features not described here; and the \i \I{man pages for PuTTY tools} Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ba7fc12ab30cc3fa86fb4820ccf2abc Text-delta-base-sha1: 42bdf936a858da60a6732ab3e1735929fad18053 Text-content-length: 16102 Text-content-md5: 06440d3fb1629d1b9949b8e63d14312f Text-content-sha1: fca1a70e38ea118adfb413b03df233f309570a62 Content-length: 16102 SVN����_i�g��H|�M�qf�O:�+�7a� (�D<�! �-;�p�i�Y�um�`t�nb�d`S�� �d�Y�(� T�"k�&�9Qv�`��?-�_v�xl�Pv�k?�4DZ�I�mW�WM�R#[�J�bO�FI�P-�[�p�k&�V#�9��]L_�|�.e�|�]�4�HL �#�</H�|+�c7�"'v�"�55h�Y!X�@�HW�)/�5d�!%�U�C�qU�aL�@�j]�`�Qy�nZ�Ka"�F�'d��'9�:j�&-�r^�V`_��t!�xb�f�I �9vR�%m�/�oZ�qk]�^#`�qYr� �u3�@�-_��@�f^�@Q� �+�28�-e�s�-�Cs� '^�T�Ea�]=�v*�M$�x��k�>a�W�avx�31S�k�9z�//�(X�y�o$��3� ,�rz�|�R�n`�8S�v�!�tLb�xe�Ef�m:�}1*�W&�/�%J�#�J8�<�dT�MAT�kZ�zZ�+S� h�[�7p�F4� � �C�"c���:�_?�#�R3E�Q<�r�(�U�:e� .�`=B�/�[?_�FU�V'�m�o�C~�z�!X�KVJ�bc�M\�8�1E�i|�d�Ar�G3�q�2)�bl�Q:�-O�p �& �J>Y�ZL�^0�"�t;�);�2q�!9�u��H�+p�$�"p�Sz �N%�oG�+�K�LX�(7�!f��z<�^9�a(��.�5\i{configuration options}\i{host name}\i{IP address}\I{raw TCP connections}raw connection, a \i{Telnet} connection, an \i{Rlogin} connection or an \i{SSH}\i{port number}\ii{Loading and storing saved sessions}\i{Default Settings}\i{Registry}\ii{Close Window}\i{terminal window}\i{log file}\i{Log SSH packet data}I{log file, flushing}\i{SSH packet log}\i{terminal emulation}\ii{Auto wrap mode}\i{control sequence}\i{DEC Origin Mode} is a minor option which controls how PuTTY interprets cursor-position \i{control sequence}s sent by the server. The server can send a control sequence that restricts the \i{scrolling region}\i{cursor coordinates}\i{CR} and \i{LF}, to start a \i{new line}\I{stair-stepping}stepped effect on the screen, like \i{background colour}\i{clear screen}\i{control sequences}\i{blinking text}\I{background colour, bright}bolded background colour. Blinking text can be turned on and off by \i{control sequence}answerback} \q{\ii{Answerback}\i{enquiry character}\ii{Local echo}\I{remote echo}echo them back to you; \ii{Local line editing}\i{local echo} (\k{config-localecho}). This makes it ideal for use in raw mode \#{FIXME} or when connecting to \i{MUD}s or \i{talker}\ii{Remote-controlled printing}\i{keyboard} in PuTTY. \S{config-backspace} Changing the action of the \ii{Backspace key}\i{Control-H}\i{Control-?}i\I{Home and End keys} \cfg{winhelp-topic}{keyboard.homeend} The Unix terminal emulator \ii\i{function keys} and \i{keypad}\i{Linux virtual console}. \b In \I{xterm}\i{VT400}\i{VT100+} mode, the function keys generate \c{ESC OP} through to \c{ESC O[} \b In \i{SCO}\i{Application Cursor Keys}\i{Application Keypad}\i{NumLock}\i{NetHack keypad mode}\i{Num Lock} is on. We don't know why. \S{config-compose} Enabling a DEC-like \ii{Compose key}\i{accented characters}\i{Application key}, it acts as a Compose key in PuTTY. Alternatively, if you enable the \q{\i{AltGr}\i{AltGr}\i{terminal bell}\i{Windows Default Beep}\I{terminal bell, disabling}disables the bell completely. In this mode, the server can send as many Control-G characters as it likes and \ii{Visual bell}\i{PC speaker}} is self-explanatory. \b \q{Play a custom \i{sound file}\ii{Taskbar}/\I{window caption}caption \i{bell overload}\I{terminal bell, disabling} have no effect at all, so the rest of your binary file will be sent to the screen in silence. After a period of five seconds during which no further bells are received, the overload feature will turn itself off again \i{terminal emulation}\I{Application Keypad}Application keypad mode (see \k{config-appkeypad}) and \I{Application Cursor Keys}\i{mouse reporting} \cfg{winhelp-topic}{features.mouse} PuTTY allows the server to send \i{control codes} that let it take over the mouse and use it for purposes other than \i{copy and paste}. Applications which use this feature include the text-mode web browser \i\c{links}, the Usenet newsreader \i\c{trn} version 4, and the file manager \i\i{terminal resizing}\i{alternate screen}\i{window title}\i{window title}\i{security hazard}\i{destructive backspace}\i{character set}\I{BitchX}\i{Arabic text shaping}\i{Unicode}\i{display becomes corrupted}\i{bidirectional text}\i{Arabic} or \i{Hebrew}\i{display becomes corrupted}\i{PuTTY window}. \S{config-winsize} Setting the \I{window size}size of the PuTTY window \cfg{winhelp-topic}{window.size} The \q{\ii{Rows}} and \q{\ii{Columns}} boxes let you set the PuTTY window to a precise size. Of course you can also \I{window resizing}drag the window to a new size \I{window resizing}\i{font size}\i{maximise}\i{scrollback}\i{scrollbar}\i{full-screen}\i{alternate screen}\I{PuTTY window}PuTTY's window. \S{config-cursor} Controlling the appearance of the \i{cursor}\ii{Cursor blinks}\i{font}\I{font size}size, the PuTTY terminal window uses to display the text in the session. You will be width fonts.) \S{config-mouseptr} \q{Hide \i{mouse pointer}\i{window border}\I{PuTTY window}PuTTY's window. \S{config-title} Controlling the \i{window title}\i{host name}\i{control sequence} \c{xterm} sequence to modify the \I{icon title}\I{window caption}caption will change into the server-supplied icon title if you \i{minimise}\i{closing window}} \cfg{winhelp-topic}{behaviour.closewarn} If you press the \i{Close button}\i{ALT-F4}} \cfg{winhelp-topic}{behaviour.altf4} By default, pressing ALT-F4 causes the \I{closing window}window to close (or a warning box to appear; see \k{config-warnonclose}). If you disable the \q{Window closes on ALT-F4} option, then pressing ALT-F4 will simply send a key sequence to the server. \S{config-altspace} \q{\ii{System menu} appears on \i{ALT-Space}\i{accessibility}\i{Dragon NaturallySpeaking}\ii{System menu} appears on \i{Alt}\i{always on top}\ii{Full screen}\ii{System menu}\i{character set}\i{locale}\i{ISO-8859}\i{Win125x}\i{CP437}}. \b PuTTY also supports \i{Unicode} mode, in which the data coming from the server is interpreted as being in the \i{UTF-8}\i{code page}\i{CP866}\i{CJK}\I{character width}width is not well-defined. In most contexts, such characters should be treated as single-width for the purposes of \I{wrapping, terminal}wrapping and so on; however, in some CJK contexts, they are better treated as double-width for historical reasons, and some server-side applications may expect them to be displayed as such. Setting this option will \i{UTF-8} mode (see \k{config-charset}). \S{config-cyr} \q{\i{Caps Lock} acts as \i{Cyrillic}\i{Russian}\i{line-drawing characters}\i{control sequence}\i{font}\i{Unicode}\i{copy and paste}\i{Unicode}\i{ASCII}\i{copy and paste} work in the PuTTY window. \S{config-rtfpaste} Pasting in \i{Rich Text Format}\i{font}\i{left button} \I{selecting text}selects, the \i{right button} extends an existing selection, and the \i{middle button}\I{adjusting a selection}extends a selection. If you have a \i{three-button mouse}\i{context menu}\i{control codes} that let it \I{mouse reporting}take over the mouse and use it for purposes other than \i{copy and paste}\i{rectangular selection}\i{word-by-word selection}\i{double-click}\i{character classes} are: \b Class 0 contains \i{white space} and control characters. \b Class 1 contains most \i{punctuation}\i{control sequence}s H{config-colours} The Colours panel The Colours panel allows you to control PuTTY's use of \i{colour}. \S{config-ansicolour} \q{Allow terminal to specify \i{ANSI colours}\i{control sequence}\i{256-colour mode}i\i{control sequence} indicating that some text should be displayed in \i{bold}, PuTTY can handle this two ways. It can either change the \i{font}\i{logical palettes}\i{8-bit colour}\i{system colours}I{default background}\I{default foreground}\q{Default Background/Foreground} and \I{cursor colour}\i{bold text}\i{terminal window}\i{RGB values}\i{cursor colour}, the \i{default foreground} and \I{default background}background, and the precise shades of all the \I{ANSI colours}ANSI configurable colours (black, red, green, yellow, blue, magenta, cyan, and white). You can also modify the precise shades used for the \i{bold} versions of these colours; these are used to display bold text if you have selected \q{Bolded text is a different colour}, and can also be used \i{connection}. \S{config-keepalive} Using \i{keepalives}\i{routers} and \i{firewalls}\i{idle connections}\i{breaks in connectivity}\i{SSH-1}\i{Nagle's algorithm}\i{bandwidth}\i{interactive connections}. \S{config-tcp-keepalives} \q{Enable \i{TCP keepalives}\i{half-open connections}I{Internet protocol version}\i{IPv4} and \i{IPv6}\i{Internet address}, it will use whichever protocol that address implies. If you provide a \i{hostname}\ii{Auto-login username}\ii{Terminal-type}\i{control sequence}ii\ii{Terminal speed}\i{bandwidth}\i{environment variables}\i{SSH-2}\ii{Proxy}\i{port forwarding}I{HTTP proxy}\q{HTTP} allows you to proxy your connections through a \i{SOCKS server}I{Telnet proxy}\q{Telnet} allows you to tell i\c{localhost}, and any \i{loopback IP address}\I{proxy DNS}\I{proxy DNS}\ii{Name resolution}\i{DNS}\I{proxy username}Username and \I{proxy password}password \cfg{winhelp-topic}{proxy.auth} If your proxy requires \I{proxy authentication}authentication, you can enter a username and a password in the \q{Username} and \q{Password} boxes. \I{security hazard}Note that if you save your session, the proxy password will be \I{plaintext password}I{HTTP basic}\q{basic}, where the password is sent to the proxy in \I{plaintext password}plain \i{Telnet proxy}\i{Telnet}\i{environment variables}\i{BSD} or \i{RFC}i\cw{NEW_ENVIRON}, which behaved exactly like the original \i\i{Telnet negotiation}I{active Telnet negotiation}\e{active} mode, PuTTY starts to send negotiations as soon as the connection is opened. \b In \I{passive Telnet negotiation}\e{passive} mode, PuTTY will wait to negotiate until it sees a \i{Telnet proxy} server. If you have confusing trouble with a \i{firewall}\i{Telnet special commands}\i{Telnet New Line}\i{new line}\i{Rlogin}I{local username in Rlogin}i\I{passwordless login}\I{privileged port}port numbers below 1024, and \i{spoof} your username in an Rlogin \i{Windows user name}\i{SSH}\ii{Remote command}} box. \S{config-ssh-pty} \I{pseudo-terminal allocation}\q{Don't allocate a pseudo-terminal} \cfg{winhelp-topic}{ssh.nopty} When connecting to a \i{Unix} system, most \I{interactive connections}interactive shell sessions are run in a \e{pseudo-terminal}, which allows the Unix system to pretend it's talking to a real physical terminal device but allows the SSH server to catch all the data coming from that fake device \I{remote shell}shell or \I{remote command}\i{port forwarding}, and your user account on the server does not have the ability to run a shell. This feature is only available in \i{SSH protocol version 2}\i{compression}\i{bandwidth} connection. \S{config-ssh-prot} \q{Preferred \i{SSH protocol version}} \cfg{winhelp-topic}{ssh.protocol} This allows you to select whether you would like to use \i{SSH protocol version 1} or \I{SSH-2}\ii{Encryption}\i{encryption algorithm}\i{AES} (Rijndael) - 256, 192, or 128-bit CBC (SSH-2 only) \b \i{Blowfish} - 128-bit CBC \b \ii{Triple-DES} - 168-bit CBC \b \ii{Single-DES}\i{key exchange}\i{shared secret}\ii{Key exchange algorithm}\i{Diffie-Hellman key exchange}\ii{Group exchange}\ii{Repeat key exchange}\i{keepalives}\i{firewalls}\i{integrity}, and to a lesser extent, \i{confidentiality}\i{authentication} options for SSH sessions. \S{config-ssh-tis} \q{Attempt \I{TIS authentication}TIS or \i{CryptoCard authentication}\I{challenge/response authentication}challenge/response forms of authentication available in SSH protocol version 1 only. You might use them if you were using \i{S/Key} \i{one-time passwords}, for example, or if you had a physical \i{security token} that generated \i{keyboard-interactive authentication}\I{challenge/response authentication}challenge/response mechanisms such as \i{S/Key}, but it can also be used for (for example) asking the user for a \I{password expiry}new password when the old one \i{agent forwarding}\i{Pageant}\i{changes of username}\i{OpenSSH}\ii{Private key}\i{public key authentication}\i{PPK}\i{forwarding of X11}\i{X11 authentication}ii\I{po�I{ F�f��ml�T`�N;� "� 7�F�KH�/!�Ec�+�u3�SH�i%� a�Lm�1E�B �VjO�}rt forwarding}The Tunnels panel \cfg{winhelp-topic}{ssh.tunnels.portfwd} The Tunnels panel allows you to configure tunnelling of arbitrary connection types through an SSH connection. Port forwarding allows you to tunnel other types of \i{network connection} down an SSH session. See \k{using-port-forwarding} for a general discussion of port forwarding and how it works. The port forwarding section in the Tunnels panel shows a list of all the port forwardings that PuTTY will try to set up when it connects to the server. By default no port forwardings are set up, so this list is empty. To add a port forwarding: \b Set one of the \q{Local} or \q{Remote} radio buttons, depending on whether you want to \I{local port forwarding}forward a local port to a remote destination (\q{Local}) or \I{remote port forwarding}forward a remote port to a local destination (\q{Remote}). Alternatively, select \q{Dynamic} if you want PuTTY to \I{dynamic port forwarding}provide a local SOCKS 4/4A/5 proxy on a local port. \b Enter a source \i{port number} into the \q{Source port} box. For local forwardings, PuTTY will listen on this port of your PC. For remote forwardings, your SSH server will listen on this port of the remote machine. Note that most servers will not allow you to listen on \I{privileged port}port numbers less than 1024. \b If you have selected \q{Local} or \q{Remote} (this step is not needed with \q{Dynamic}), enter a hostname and port number separated by a colon, in the \q{Destination} box. Connections received on the source port will be directed to this destination. For example, to connect to a POP-3 server, you might enter \c{popserver.example.com:110}. \b Click the \q{Add} button. Your forwarding details should appear in the list box. To remove a port forwarding, simply select its details in the list box, and click the \q{Remove} button. In the \q{Source port} box, you can also optionally enter an \I{listen address}IP address to listen on, by specifying (for instance) \c{127.0.0.5:79}. See \k{using-port-forwarding} for more information on how this works and its restrictions. In place of port numbers, you can enter \i{service names}, if they are known to the local system. For instance, in the \q{Destination} box, you could enter \c{popserver.example.com:pop3}. You can modify the currently active set of port forwardings in mid-se\i{OpenSSH}\I{localhost}SSH client or server machine itself (for local and remote forwardings respectively). There are \i{OpenSSH}\i{Internet protocol version}\i{IPv4} or \i{IPv6}\i{Linux}\I{SSH server bugs}\i{ignore message}\i{password camouflage}\i{RSA}\i{Pageant}\i{HMAC} \i{message authentication code}\i{encryption}i\i{RSA} \i{signatures}} \cfg{winhelp-topic}{ssh.bugs.rsapad2} Versions below 3.3 of \i{OpenSSH}\i{session ID} in SSH-2 PK auth} \cfg{winhelp-topic}{ssh.bugs.pksessid2} Versions below 2.3 of \i{OpenSSH} require SSH-2 \i{public-key authentication}\i{repeat key exchange}\ii{Storing configuration in a file}\i{Registry}. However, you can work around this with a couple of \i{batch file} Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d0d8e744059fc76b04cbe1e4b17a2245 Text-delta-base-sha1: 802a3e6a568c77d60c546d2dc6811280a9661700 Text-content-length: 397 Text-content-md5: fa4c0c7fd100c918071865f0e553925d Text-content-sha1: e09931332cc947ee0511ab09ab25e06ad6023e1f Content-length: 397 SVN��MH9N�=J�z ��.�cB�q2�r*� )G�t�Px�}`�la\define{versioniderrors} \versionid $Id$ \C{errors} Common \i{error messages}\i{SSH-2}\i{port forwardings}\ii{single-DES}\i{OpenSSH} (or \i{Sun SSH}\ii{Out of memory}\i{OpenSSH}\i{login scripts}\ii{Internal error}}, \q{\ii{Internal fault}}, \q{\ii{Assertion failed}\i{CRC}\i{firewall} or a \i{NAT router}\i{Unix} Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8f1ac2eeb76a94fd21320025ea4609c0 Text-delta-base-sha1: 269ce062fb9262be9ea7fba2b2ef879ff5156ad0 Text-content-length: 1473 Text-content-md5: ca05999d4db6a6d63e7e84a873cab4d4 Text-content-sha1: cfcf49d1fa067ea60a6b4d982995533a53915bc2 Content-length: 1473 SVN��p:�8U�$~�W,�{�B�#S�{�N�e�]�Lj�9<�Gu�~I�X�%t�!A�oN�E�Y�8i�H�8t�a;�#�Z�lU�<�#b�O�D�fr�qd�I\�)2�r`�Mb�g9w�x �a �ys��o�zv\define{versionidfaq} \versionid $Id$ \A{faq} PuTTY \i{FAQ}\I{supported features}In general, if you want to know if PuTTY supports a particular \i{local echo}\i{remember my password}\I{verifying the host key}i\i{ASCII}\I{Unix version}i\i{Gtk}\i{Windows 3.1}\i{Win32s}\I{Mac OS}\i{terminal type}\i{control sequences}i\i{Registry}\I{commands on the server}What commands can I type into my PuTTY \i{maximise}\i{Windows shortcut}\i{copy and paste}\I{spaces in filenames}How do I use PSCP to copy a file whose \ii{Message Authentication Code}\i{startup scripts}\ii{Colours}\i{Windows 95} says it can't find \i\ii{Out of memory}\ii{Out of memory}} and dies. This is almost always caused by your \i{login scripts}\i{background colour}\ii{Auto Wrap}\I{idle connections}idle for a while. Some types of \i{firewall}, and almost any router doing Network Address Translation (\i{NAT}\I{breaks in connectivity}network connectivity is \i{window title}\i{OpenSSH}\i{Red Hat Linux}\i{UTF-8}\i{alternate screen}\i{Windows XP}\i{localhost} addresses other than \cw{127.0.0.1} to forward services such as \i{SMB} and \i{Windows Terminal Services}\i{OpenSSH}\i{clean up}\i{DSA}\i{OpenSSH} Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cfbb477e9e97aadf51aa9b9f5d81024a Text-delta-base-sha1: 686131def2be57bfb3eddb4409e12d90cc7452f6 Text-content-length: 251 Text-content-md5: 5555369a2af8712efb5ebcea1fcae058 Text-content-sha1: cdc04985d30be2dee44032ed9f2aadf98dfda678 Content-length: 251 SVN��.P*C\�tS�xS�9`�W)�-�B�N`\define{versionidfeedback} \versionid $Id$ \A{feedback} \ii{Feedback} and \i{bug reporting}\i{mailing list}\i{development snapshots}\i{version of PuTTY}\i{patch}\ii{Support requests}\i{web site} Node-path: putty/doc/gs.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 47be4fc62b53ac0e2169b656bd567043 Text-delta-base-sha1: aead8d483564b752b929e019fb7d3a9a14cd34fa Text-content-length: 192 Text-content-md5: f06f38f934fdf97fab9d4d52fb0e5a4c Text-content-sha1: 67af81255548b0334dfd627788fbf9648cac1306 Content-length: 192 SVN��V"�y��P�\�1z\�Mo�^=\i{dialog box}\i{host name}\I{host key fingerprint}fingerprint, you should make sure the one PuTTY shows you is on the \I{commands on the server} Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0183f6ad8d5257749f4b557c978b11a4 Text-delta-base-sha1: c64274a34582508b9277943be39a44a22d3c9789 Text-content-length: 22025 Text-content-md5: 6058709f640674c1f9f111fb30108836 Text-content-sha1: 7f8a770c18b61d90163ae03af32f777d18c1ee9a Content-length: 22025 SVN��7 d1�@��\::�x,�Rfc�q1R�28�1bX�@ q�/DJ�Nmh�4-�}i�lXh\IM{Unix version} Unix version of PuTTY tools \IM{Unix version} Linux version of PuTTY tools \IM{Unix} Unix \IM{Unix} Linux \IM{Command Prompt}{command prompt window}{MS-DOS Prompt}{console window} Command Prompt \IM{Command Prompt}{command prompt window}{MS-DOS Prompt}{console window} MS-DOS Prompt \IM{Command Prompt}{command prompt window}{MS-DOS Prompt}{console window} console window \IM{spoof}{spoofed}{spoofing} spoofing host key fingerprint} fingerprint, of SSH host key \IM{host key fingerprint} host key fingerprint (SSH) \IM{host key fingerprint} SSH host key fingerprintcommands on the server}{remote command} commands on the server \IM{commands on the server}{remote command} remote commands \IM{commands on the server}{remote command} server, commands on{changes of username} different user names \IM{different usernames}{changes of username} changing user names \IM{different usernames}{changes of username} user names, different \IM{different usernames}{changes of username} login names, different \IM{different usernames}{changes of username} account MUD}{MUDs} MUDs \IM{talker}{talker systems} talker systems \IM{security hazard}{security risk} security hazard \IM{SSH-1}{SSH protocol version 1} SSH-1 \IM{SSH-2}{SSH protocol version 2} SSH-2 \IM{terminal window}{PuTTY window} terminal window \IM{terminal window}{PuTTY window} PuTTY terminal window \IM{terminal window}{PuTTY window} window, terminathree-button mouse} three-button mouse \IM{three-button mouse} mouse, three-button \IM{left mouse button}{left button} left mouse button \IM{middle mouse button}{middle button} middle mouse button \IM{right mouse button}{right button} right mouse button \IM{selecting words}{word-by-word selection} selecting whole words \IM{selecting words}{word-by-word selection} words, selecting \IM{selecting lines} selecting whole lines \IM{selecting lines} lines, selectingextending a selection \IM{adjusting a selection} selection, adjusting \IM{right mouse button, with Ctrl} right mouse button, with Ctrl \IM{right mouse button, with Ctrl} Ctrl, with right mouse button \IM{system menu} system menu \IM{system menu} window menu \IM{context menu} context menu \IM{context menu} right mouse button menu \IM{Telnet special commands} Telnet special commands \IM{Telnet special commands} special commands, in Telnet \IM{SSH special commands} SSH special commands \IM{SSH special commands} special commands, in SSH \IM{Repeat key exchange, SSH special command} Repeat key exchange, SSH special command \IM{Repeat key exchange, SSH special command} key exchange, forcing repeat \IM{Repeat key exchange, SSH special command} SSH key exchange, forcing repeat \IM{accented characters} accented characters \IM{accented characters} characters, accented \IM{line-drawing characters} line-drawing characters \IM{line-drawing characters} box-drawing characters \IM{line-drawing characters} characters, line-drawing \IM{line-drawing characters} ANSI graphicslocal port forwarding} local-to-remote port forwarding \IM{remote port forwarding} remote-to-local port forwarding \IM{dynamic port forwarding} dynamic port forwarding \IM{dynamic port forwarding} SOCKS port forwardInternet protocol version} Internet Protocol version \IM{Internet protocol version} version, of Internet ProtocolWindows shortcut} Windows shortcut \IM{Windows shortcut} shortcut, Windowsutty @sessionname} \c{putty @sessionname} \IM{putty @sessionname} \c{@sessionname} command-line argument{username} login name \IM{login name}{username} user name \IM{login name}{username} account name \IM{reading commands from a file} reading commands from a file \IM{reading commands from a file} commands, reading from a file \IM{agent forwarding} agent forwarding \IM{agent forwarding} authentication{forwarding of X11} X11 forwarding \IM{X11 forwarding}{forwarding of X11} SSH X11 forwarding \IM{X11 forwarding}{forwarding of X11} forwarding, of X11 \IM{X11 authentication} X11 authentication \IM{X11 authentication} authentication (random seed file) \IM{putty.rnd} \c{putty.rnd} (random seed file) \IM{suppressing remote shell} remote shell, suppressing \IM{suppressing remote shell} shell, remote, suppressing \IM{SSH protocol version} SSH protocol version \IM{SSH protocol version} protocol version, SSH \IM{SSH protocol version} version, of SSH protocol \IM{PPK} \cw{PPK} file \IM{PPK} private key file, PuTTY \IM{PGP key fingerprint} PGP key fingerprint \IM{PGP key fingerprint} fingerprint, of PGP key \IM{verifying new versions} verifying new versions of PuTTY \IM{verifying new versions} new version, verifying \IM{verifying new versions} upgraded version, verifying \IM{connection}{network connection} network connection \IM{connection}{network connection} connection, network \IM{host name}{hostname} host name \IM{host name}{hostname} DNS name \IM{host name}{hostname} server name \IM{IP address}{Internet address} IP address \IM{IP address}{Internet address} address, IP \IM{localhost} \c{localhost} \IM{loopback IP address}{loopback address} loopback IP address \IM{loopback IP address}{loopback address} IP address, loopback \IM{listen address} listen address \IM{listen address} bind address \IM{DNS} DNS \IM{DNS} Domain Name System \IM{name resolution} name resolution \IM{name resolution} DNS resolution \IM{name resolution} host name resolution \IM{name resolution} server name resolution \IM{loading and storing saved sessions} sessions, loading and storing \IM{loading and storing saved sessions} settings, loading and storing \IM{loading and storing saved sessions} saving settings \IM{loading and storing saved sessions} storing settings \IM{loading and storing saved sessions} loading settings \IM{Default Settings} Default Settings \IM{Default Settings} settings, default \IM{Registry} Registry (Windows) \IM{Registry} Windows Registry \IM{inactive window} inactive window \IM{inactive window} window, inactive \IM{inactive window} terminal window, inactive \IM{Log SSH packet data} SSH packet log \IM{Log SSH packet data} packet log, SSH \IM{auto wrap mode}{auto wrap} auto wrap mode \IM{auto wrap mode}{auto wrap} wrapping, automatic \IM{auto wrap mode}{auto wrap} line wrapping, automatic \IM{control sequence}{control codes} control sequences \IM{control sequence}{control codes} terminal control sequences \IM{control sequence}{control codes} escape sequences \IM{cursor coordinates} cursor coordinates \IM{cursor coordinates} coordinates, cursor \IM{CR} CR (Carriage Return) \IM{CR} Carriage Return \IM{LF} LF (Line Feed) \IM{LF} Line Feed \IM{clear screen} clear screen \IM{clear screen} erase screen \IM{clear screen} screen, clearing \IM{blinking text} blinking text \IM{blinking text} flashing text \IM{answerback} answerback string \IM{local echo} local echo \IM{local echo} echo, local \IM{remote echo} remote echo \IM{remote echo} echo, remote \IM{local line editing} local line editing \IM{local line editing} line editing, local \IM{remote-controlled printing} ANSI printing \IM{remote-controlled printing} remote-controlled printing \IM{remote-controlled printing} printing, remote-controlled \IM{Home and End keys} Home key \IM{Home and End keys} End key \IM{keypad} keypad, numeric \IM{keypad} numeric keypad \IM{Application Cursor Keys} Application Cursor Keys \IM{Application Cursor Keys} cursor keys, \q{Application} mode \IM{Application Keypad} Application Keypad \IM{Application Keypad} keypad, \q{Application} mode \IM{Application Keypad} numeric keypad, \q{Application} mode \IM{Num Lock}{NumLock} Num Lock \IM{NetHack keypad mode} NetHack keypad mode \IM{NetHack keypad mode} keypad, NetHack mode \IM{compose key} Compose key \IM{compose key} DEC Compose key \IM{terminal bell} terminal bell \IM{terminal bell} bell, terminal \IM{terminal bell} beep, terminal \IM{terminal bell} feep \IM{Windows Default Beep} Windows Default Beep sound \IM{Windows Default Beep} Default Beep sound, Windows \IM{terminal bell, disabling} terminal bell, disabling \IM{terminal bell, disabling} bell, disabling \IM{visual bell} visual bell \IM{visual bell} bell, visual \IM{PC speaker} PC speaker \IM{PC speaker} beep, with PC speaker \IM{sound file} sound file \IM{sound file} \cw{WAV} file \IM{bell overload} bell overload mode \IM{bell overload} terminal bell overload mode \IM{mouse reporting} mouse reporting \IM{mouse reporting} \c{xterm} mouse reporting \IM{links} \c{links} (web browser) \IM{mc} \c{mc} \IM{mc} Midnight Commander \IM{terminal resizing}{window resizing} terminal resizing \IM{terminal resizing}{window resizing} window resizing \IM{terminal resizing}{window resizing} resizing, terminal \IM{destructive backspace} destructive backspace \IM{destructive backspace} non-destructive backspace \IM{destructive backspace} backspace, destructive \IM{Arabic text shaping} Arabic text shaping \IM{Arabic text shaping} shaping, of Arabic text \IM{Unicode} Unicode \IM{Unicode} ISO-10646 (Unicode) \IM{ASCII} ASCII \IM{ASCII} US-ASCII \IM{bidirectional text} bidirectional text \IM{bidirectional text} right-to-left text \IM{display becomes corrupted} display corruption \IM{display becomes corrupted} corruption, of display \IM{rows} rows, in terminal window \IM{columns} columns, in terminal window \IM{window size} window size \IM{window size} size, of window \IM{font size} font size \IM{font size} size, of font \IM{full screen}{full-screen} full-screen mode \IM{cursor blinks} blinking cursor \IM{cursor blinks} flashing cursor \IM{cursor blinks} cursor, blinking \IM{font} font \IM{font} typeface \IM{minimise} minimise window \IM{minimise} window, minimising \IM{maximise} maximise window \IM{maximise} window, maximising \IM{closing window}{close window} closing window \IM{closing window}{close window} window, closing \IM{Dragon NaturallySpeaking} Dragon NaturallySpeaking \IM{Dragon NaturallySpeaking} NaturallySpeaking \IM{AltGr} \q{AltGr} key \IM{Alt} \q{Alt} key \IM{CJK} CJK \IM{CJK} Chinese \IM{CJK} Japanese \IM{CJK} Korean \IM{East Asian Ambiguous characters} East Asian Ambiguous characters \IM{East Asian Ambiguous characters} CJK ambiguous characters \IM{character width} character width \IM{character width} single-width character \IM{character width} double-width character \IM{Rich Text Format} Rich Text Format \IM{Rich Text Format} RTF \IM{bold}{bold text} bold text \IM{colour}{colours} colour \IM{8-bit colour} 8-bit colour \IM{8-bit colour} colour, 8-bit \IM{system colours} system colours \IM{system colours} colours, system \IM{ANSI colours} ANSI colours \IM{ANSI colours} colours, ANSI \IM{cursor colour} cursor colour \IM{cursor colour} colour, of cursor \IM{default background} background colour, default \IM{default background} colour, background, default \IM{default foreground} foreground colour, default \IM{default foreground} colour, foreground, default \IM{TERM} \cw{TERM} environment variable \IM{logical palettes} logical palettes \IM{logical palettes} palettes, logical \IM{breaks in connectivity} connectivity, breaks in \IM{breaks in connectivity} intermittent connectivity \IM{idle connections} idle connections \IM{idle connections} timeout, of connections \IM{idle connections} connections, idle \IM{interactive connections}{interactive session} interactive connections \IM{interactive connections}{interactive session} connections, interactive \IM{keepalives} keepalives, application \IM{Nagle's algorithm} Nagle's algorithm \IM{Nagle's algorithm} \cw{TCP_NODELAY} \IM{TCP keepalives} TCP keepalives \IM{TCP keepalives} keepalives, TCP \IM{TCP keepalives} \cw{SO_KEEPALIVE} \IM{half-open connections} half-open connections \IM{half-open connections} connections, half-open \IM{auto-login username} user name, for auto-login \IM{auto-login username} login name, for auto-login \IM{auto-login username} account name, for auto-login \IM{terminal emulation}{terminal-type} terminal emulation \IM{terminal emulation}{terminal-type} emulation, terminal \IM{terminal speed} terminal speed \IM{terminal speed} speed, terminal \IM{terminal speed} baud rate, of terminal \IM{environment variables} environment variables \IM{environment variables} variables, environment \IM{proxy} proxy server \IM{proxy} server, proxy \IM{HTTP proxy} HTTP proxy \IM{HTTP proxy} proxy, HTTP \IM{HTTP proxy} server, HTTP \IM{HTTP proxy} \cw{CONNECT} proxy (HTTP) \IM{SOCKS server} SOCKS proxy \IM{SOCKS server} server, SOCKS \IM{SOCKS server} proxy, SOCKS \IM{Telnet proxy} Telnet proxy \IM{Telnet proxy} TCP proxy \IM{Telnet proxy} ad-hoc proxy \IM{Telnet proxy} proxy, Telnet \IM{proxy DNS} proxy DNS \IM{proxy DNS} DNS, with proxy \IM{proxy DNS} name resolution, with proxy \IM{proxy DNS} host name resolution, with proxy \IM{proxy DNS} server name resolution, with proxy \IM{proxy username} proxy user name \IM{proxy username} user name, for proxy \IM{proxy username} login name, for proxy \IM{proxy username} account name, for proxy \IM{proxy password} proxy password \IM{proxy password} password, for proxy \IM{proxy authentication} proxy authentication \IM{proxy authentication} authentication, to proxy \IM{HTTP basic} HTTP \q{basic} authentication \IM{HTTP basic} \q{basic} authentication (HTTP) \IM{plaintext password} plain text password \IM{plaintext password} password, plain text \IM{Telnet negotiation} Telnet option negotiation \IM{Telnet negotiation} option negotiation, Telnet \IM{Telnet negotiation} negotiation, of Telnet options \IM{firewall}{firewalls} firewalls \IM{NAT router}{NAT} NAT routers \IM{NAT router}{NAT} routers, NAT \IM{NAT router}{NAT} Network Address Translation \IM{NAT router}{NAT} IP masquerading \IM{Telnet New Line} Telnet New Line \IM{Telnet New Line} new line, in Telnet \IM{.rhosts} \c{.rhosts} file \IM{.rhosts} \q{rhosts} file \IM{passwordless login} passwordless login \IM{passwordless login} login, passwordless \IM{Windows user name} local user name, in Windows \IM{Windows user name} user name, local, in Windows \IM{Windows user name} login name, local, in Windows \IM{Windows user name} account name, local, in Windows \IM{local username in Rlogin} local user name, in Rlogin \IM{local username in Rlogin} user name, local, in Rlogin \IM{local username in Rlogin} login name, local, in Rlogin \IM{local username in Rlogin} account name, local, in Rlogin \IM{privileged port} privileged port \IM{privileged port} low-numbered port \IM{privileged port} port, privileged \IM{remote shell} shell, remote \IM{remote shell} remote shell \IM{encryption}{encrypted}{encrypt} encryption \IM{encryption algorithm} encryption algorithm \IM{encryption algorithm} cipher algorithm \IM{encryption algorithm} symmetric-key algorithm \IM{encryption algorithm} algorithm, encryption \IM{AES} AES \IM{AES} Advanced Encryption Standard \IM{AES} Rijndael \IM{triple-DES} triple-DES \IM{single-DES} single-DES \IM{single-DES} DES \IM{key exchange} key exchange \IM{key exchange} kex \IM{shared secret} shared secret \IM{shared secret} secret, shared \IM{key exchange algorithm} key exchange algorithm \IM{key exchange algorithm} algorithm, key exchange \IM{Diffie-Hellman key exchange} Diffie-Hellman key exchange \IM{Diffie-Hellman key exchange} key exchange, Diffie-Hellman \IM{group exchange} Diffie-Hellman group exchange \IM{group exchange} group exchange, Diffie-Hellman \IM{repeat key exchange} repeat key exchange \IM{repeat key exchange} key exchange, repeat \IM{challenge/response authentication} challenge/response authentication \IM{challenge/response authentication} authentication, challenge/response \IM{security token} security token \IM{security token} token, security \IM{one-time passwords} one-time passwords \IM{one-time passwords} password, one-time \IM{keyboard-interactive authentication} keyboard-interactive authentication \IM{keyboard-interactive authentication} authentication, keyboard-interactive \IM{password expiry} password expiry \IM{password expiry} expiry, of passwords \IM{public key authentication}{public-key authentication} public key authentication \IM{public key authentication}{public-key authentication} RSA authentication \IM{public key authentication}{public-key authentication} DSA authentication \IM{public key authentication}{public-key authentication} authentication, public key \IM{MIT-MAGIC-COOKIE-1} \cw{MIT-MAGIC-COOKIE-1} \IM{MIT-MAGIC-COOKIE-1} magic cookie \IM{MIT-MAGIC-COOKIE-1} cookie, magic \IM{SSH server bugs} SSH server bugs \IM{SSH server bugs} bugs, in SSH servers \IM{ignore message} SSH \q{ignore} messages \IM{ignore message} \q{ignore} messages, in SSH \IM{message authentication code} message authentication code \IM{message authentication code} MAC (message authentication code) \IM{signatures} signature \IM{signatures} digital signature \IM{storing configuration in a file} storing settings in a file \IM{storing configuration in a file} saving settings in a file \IM{storing configuration in a file} loading settings from a file \IM{transferring files} transferring files \IM{transferring files} files, transferring \IM{receiving files}{download a file} receiving files \IM{receiving files}{download a file} files, receiving \IM{receiving files}{download a file} downloading files \IM{sending files}{upload a file} sending files \IM{sending files}{upload a file} files, sending \IM{sending files}{upload a file} uploading files \IM{listing files} listing files \IM{listing files} files, listing \IM{wildcard}{wildcards} wildcards \IM{wildcard}{wildcards} glob (wildcard) \IM{PATH} \c{PATH} environment variable \IM{SFTP} SFTP \IM{SFTP} SSH file transfer protocol \IM{-unsafe} \c{-unsafe} PSCP command-line option \IM{-ls-PSCP} \c{-ls} PSCP command-line option \IM{-p-PSCP} \c{-p} PSCP command-line option \IM{-q-PSCP} \c{-q} PSCP command-line option \IM{-r-PSCP} \c{-r} PSCP command-line option \IM{-batch-PSCP} \c{-batch} PSCP command-line option \IM{-sftp} \c{-sftp} PSCP command-line option \IM{-scp} \c{-scp} PSCP command-line option \IM{return value} return value \IM{return value} exit value \IM{-b-PSFTP} \c{-b} PSFTP command-line option \IM{-bc-PSFTP} \c{-bc} PSFTP command-line option \IM{-be-PSFTP} \c{-be} PSFTP command-line option \IM{-batch-PSFTP} \c{-batch} PSFTP command-line option \IM{spaces in filenames} spaces in filenames \IM{spaces in filenames} filenames containing spaces \IM{working directory} working directory \IM{working directory} current working directory \IM{resuming file transfers} resuming file transfers \IM{resuming file transfers} files, resuming transfer of \IM{changing permissions on files} changing permissions on files \IM{changing permissions on files} permissions on files, changing \IM{changing permissions on files} files, changing permissions on \IM{changing permissions on files} modes of files, changing \IM{changing permissions on files} access to files, changing \IM{deleting files} deleting files \IM{deleting files} files, deleting \IM{deleting files} removing files \IM{create a directory} creating directories \IM{create a directory} directories, creating \IM{remove a directory} removing directories \IM{remove a directory} directories, removing \IM{remove a directory} deleting directories \IM{rename remote files} renaming files \IM{rename remote files} files, renaming and moving \IM{rename remote files} moving files \IM{local Windows command} local Windows command \IM{local Windows command} Windows command \IM{PLINK_PROTOCOL} \c{PLINK_PROTOCOL} environment variable \IM{-batch-plink} \c{-batch} Plink command-line option \IM{-s-plink} \c{-s} Plink command-line option \IM{subsystem} subsystem, SSH \IM{subsystem} SSH subsystem \IM{batch file}{batch files} batch files \IM{CVS_RSH} \c{CVS_RSH} environment variable \IM{DSA} DSA \IM{DSA} Digital Signature Standard \IM{public-key algorithm} public-key algorithm \IM{public-key algorithm} asymmetric key algorithm \IM{public-key algorithm} algorithm, public-key \IM{generating keys} generating key pairs \IM{generating keys} creating key pairs \IM{generating keys} key pairs, generating \IM{generating keys} public keys, generating \IM{generating keys} private keys, generating \IM{authorized_keys file}{authorized_keys} \cw{authorized_keys} file \IM{key fingerprint} fingerprint, of SSH authentication key \IM{key fingerprint} public key fingerprint (SSH) \IM{key fingerprint} SSH public key fingerprint \IM{SSH-2 public key format} SSH-2 public key file format \IM{SSH-2 public key format} public key file, SSH-2 \IM{OpenSSH private key format} OpenSSH private key file format \IM{OpenSSH private key format} private key file, OpenSSH \IM{ssh.com private key format} \cw{ssh.com} private key file format \IM{ssh.com private key format} private key file, \cw{ssh.com} \IM{importing keys} importing private keys \IM{importing keys} loading private keys \IM{export private keys} exporting private keys \IM{export private keys} saving private keys \IM{.ssh} \c{.ssh} directory \IM{.ssh2} \c{.ssh2} directory \IM{authentication agent} authentication agent \IM{authentication agent} agent, authentication \IM{-c-pageant} \c{-c} Pageant command-line option \IM{FAQ} FAQ \IM{FAQ} Frequently Asked Questions \IM{supported features} supported features \IM{supported features} features, supported \IM{remember my password} storing passwords \IM{remember my password} password, storing \IM{login scripts}{startup scripts} login scripts \IM{login scripts}{startup scripts} startup scripts \IM{WS2_32.DLL} \cw{WS2_32.DLL} \IM{WS2_32.DLL} WinSock version 2 \IM{Red Hat Linux} Red Hat Linux \IM{Red Hat Linux} Linux, Red Hat \IM{SMB} SMB \IM{SMB} Windows file sharing \IM{clean up} clean up after PuTTY \IM{clean up} uninstalling \IM{version of PuTTY} version, of PuTTY \IM{PGP signatures} PGP signatures, of PuTTY binaries \IM{PGP signatures} signatures, of PuTTY binaries Node-path: putty/doc/intro.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ffefbd611fb71a3fa4da3289c122ab3 Text-delta-base-sha1: ea8db0b64c2146e53f645941edd2460c50145aeb Text-content-length: 193 Text-content-md5: 9aee148cbb4e05bc9c3e6689dd83bc8b Text-content-sha1: 8dfb549d3ffe7da3f299016e1e65d4fb73b37ca1 Content-length: 193 SVN��s"�w�� �D9�&�B�b\i{command-line interface}\i{talker systems} and \i{MUDs}\i{web server}\i{bulletin board system}\I{passwordless login}log in to the server without Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 00271dde476584b4998e5af53f536150 Text-delta-base-sha1: 7d3cbf97b53a9dbdf02b302bdea053c9c5f55832 Text-content-length: 114 Text-content-md5: 4eb7f3acd8e0a3049a000134a82d5291 Text-content-sha1: 63f83aaeab690f2030327c1962c4c33838ceedc2 Content-length: 114 SVN��:Caa�bX\define{versionidlicence} \versionid $Id$ \A{licence} PuTTY \ii{Licence} PuTTY is \i{copyright} Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ccbea9529170e7d6aebc1057cf4902b Text-delta-base-sha1: e7baed954b7856c8fb372661935cf37df71ef122 Text-content-length: 841 Text-content-md5: a06d9ccb86ef85d3c0c8c1664a5d8604 Text-content-sha1: 8dda60fa581141748fb5417283fc8c1a376e7790 Content-length: 841 SVN��7HJsG�r!��u3K�l`�KO�w�a.�^�a �!j� �#\define{versionidpageant} \versionid $Id$ \C{pageant} Using \i{Pageant} for authentication \cfg{winhelp-topic}{pageant.general} Pageant is an SSH \i{authentication agent}. It holds your \i{private key}s in memory, already decoded, so that you can use them often \I{passwordless login}without needing to type a \i{passphrase}\i{PPK}\ii{System tray}\I{key fingerprint}fingerprint for the public key. This should be the same i\I{command-line arguments}specifying instructions on its command line. If you're starting Pageant from the Windows GUI, you can arrange this by editing the properties of the \i{Windows shortcut} that it was I{-c-pageant}\c{-c} option followed by the command, \i{agent forwarding}\i{OpenSSH}. The \ii\I{security risk}\i{swap file} Node-path: putty/doc/pgpkeys.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 661ae8e57a4dba460e73b449bd03133b Text-delta-base-sha1: 58701e1b56842469a4dc43535a13a11f4f8b288b Text-content-length: 76 Text-content-md5: c01729305ef1175823e6de9472224d88 Text-content-sha1: fc9b5620820967edbe65c43ce0ec61d09b96e633 Content-length: 76 SVN��=n1���"�#\I{verifying new versions}\I{PGP key fingerprint} Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 018ba42e3e7ead321758f9af8beed84f Text-delta-base-sha1: be299d83b16dbb72af915fb0d7583ce7c35d7e9d Text-content-length: 484 Text-content-md5: d0cb7627c1ade2ca45876073d786f298 Text-content-sha1: 6bd6a017c4c30a018c77d0560650e8210a383590 Content-length: 484 SVN��S"J�Z��j_�x]�*h�EX�?'�!s�s� �fC�(�m8�/$\i{Plink}\i{automated operations}\i{interactive session}, 2000, and XP, To set your \c{PATH} more permanently on Windows NT, 2000, and XP, use the Environment tab of the System Control Panel. On Windows 95, 98, and ME, you will need to edit your \i\c{AUTOEXEC.BAT} to include a \c{set} \i{control codes}i\i{public-key authentication}I{-batch-plink}\c{-batch}: disable all I{-s-plink}\i{subsystem}i Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1fdc79704e2a58e464836fd1e0c7871a Text-delta-base-sha1: 221af6c75bd0760f1c5e167fa6260177eec773c5 Text-content-length: 1546 Text-content-md5: da0630e0a2be026003437d98324d2e09 Text-content-sha1: ff91d5ba882397fec4ca8cfe7cb2e4a3bbfbf437 Content-length: 1546 SVN��+Ug�O�q�a8�^"�w "�8�-K�2x�3I�2�{8�a2�n� �:�<^ �B;�E{�>�C�Nx�`C�'�kc�}X�=n\i{PSCP} to transfer files securely \i{PSCP}, the PuTTY Secure Copy client, is a tool for \i{transferring files}, 2000, and XP,\i{Start Menu}2000, and XP, use the Environment tab of the System Control Panel. On Windows 95, 98, and ME, you will need to edit your \i\c{AUTOEXEC.BAT} to include a \c{set} \I{receiving files}\I{sending files}\i{wildcards}\I{security risk}fundamental insecurity in the old-style \i{SCP protocol}\i{SFTP}i\i{login name}I{hostname}\i{home directory}ls}\I{-ls-PSCP}\c{-ls} \I{listing files}list remote files If the \c{-ls} option is given, no files are transferred; instead, remote files are listed. Only a hostname specification and optional remote file specification need be given. For example: \c pscp -ls fred@example.com:dir1 The SCP protocol does not contain within itself a means of listing files. If SCP is in use, this option therefore assumes that the server responds appropriately to the command \c{ls\_-la}; therefore, it may not work with all servers. If SFTP is in use, this option should work with all servers. \S2{pscp-usage-options-p}\I{-p-PSCP}\c{-p} \i{preserve file attributes}I{-q-PSCPI{-r-PSCPI{-batch-PSCPi\c{-sftp}, \i\i{SCP protocol} does not have a written specification and leaves a lot of detail to the server platform. \ii{Wildcards}\i{SFTP}\ii{Return value} PSCP returns an \i\i{batch file}\i{public key authentication} Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 616533ebed8abae25bee2da4c686a706 Text-delta-base-sha1: 8e2d92b8b3cfa00fb9cee229c79c05fad9abbf77 Text-content-length: 1621 Text-content-md5: 6e99a869e1cba89d25d4bc02ea7f0441 Text-content-sha1: edf9b5a768c5a24e5065d78a2fcc383e82f34e44 Content-length: 1621 SVN��D]iB�M>�,�wM�EC�y�;~�8�NE�?%�d4��� %� 7�h�= �OU�o-�2)�d�qq� y�q�py|�\(��6�^�vR�=�kV�S�/z�X>�/\define{versionidpsftp} \versionid $Id$ \C{psftp} Using \i{PSFTP}\i{transferring files}\i{SFTP}iI{-b-PSFTP}\I{batch scripts in PSFTP}specify a set of commands in advance and have them executed automatically. The \c{-b} option allows you to do this. You use it with a file name containing batch commands. For example, you might create a file called \c{myscript.scr} containing lines like I{-bc-PSFTP}I{-be-PSFTP} \I{-batch-PSFTP}\c{-batch}: avoid \I{quoting, in PSFTP}\I{spaces in filenames}file names that \e{contain} spaces. In order to do this, you can surround the file name with double quotes. This works equally well for local file names and \i{wildcards}\i{POSIX}\i{working directory}\i{working directory}\i{download a file}\i{recursive}\i{upload a file}\i{recursive}\i{wildcard}\i{resuming file transfers}\I{listing files}\I{changing permissions on files}PSFTP \I{read permission}\c{r} (permission to read the file), \I{write permission}\c{w} (permission to write to the file), and \I{execute permission}\c{x} (permission to execute the file, or in the case of a directory, permission to access files within the \i{Unix}\i{set-user-ID bit}\i{set-group-ID bit}\i{sticky bit}\I{deleting files}delete a file on the server, type \c{del} and then the filename \i{create a directory}\i{remove a directory}\i{rename remote files}\i{local Windows command}\i{public key authentication} Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db218f63a923f960ce3d2716d3af8abb Text-delta-base-sha1: ebe3c851f0e04a98f6a0d7e9c1c1306d9a965979 Text-content-length: 1908 Text-content-md5: ef499568a893b153af99677c97a8c1ce Text-content-sha1: 66fa5fe26cecda53af37b74c02907cbf57eb6bc0 Content-length: 1908 SVN��Rc9,�p��f �nC�`,N�]T�0�Sa�,=�bq@��j�qy �Nb�?�?b�7(/�[x�Z[�'8x�:�<M�aZ� �B �Wu�^p�U�p�O\ii{Public key authentication}ii\e{key pair}, consisting of a \i{public key} (which everybody is allowed to know) and a \i{private key} (which you keep secret and do not give to anybody). The private key is able to generate \ii\e{encrypted} when it is stored on your local machine, using a \i{passphrase}i\i{Pageant}\i{public-key algorithm} available. The most common is \i{RSA}, but others exist, notably \i{DSA}\i{PuTTYgen}\I{generating keys}generates pairs of public and private keys to be used with PuTTY, PSCP, and Plink, as well as the PuTTY authentication agent, Pageant (see \k{pageant}). PuTTYgen generates \i{RSA} key for use with the SSH-1 protocol. \b An RSA key for use with the SSH-2 protocol. \b A \i{DSA} \I{security risk}\i{DSA} has an intrinsic weakness which makes it very easy to create a signature which contains enough information to give \ii{Key fingerprint}\i{passphrase}\i{encrypt}\i{passwordless login}log in without having to type a passphrase every time, you should consider using Pageant (\k{pageant}) so that your decrypted key is only held in memory \i{DiceWare}\i{PPK}\I{SSH-2 public key format}standard format for storing public keys on disk. Some SSH servers (such as \i\cw{ssh.com}'s) \i{authorized_keys file}\i{OpenSSH}\I{OpenSSH private key format}OpenSSH and \I{ssh.com private key format}\cw{ssh.com} have I{importing keys}\q{Import} command from the \q{Conversions} menu, PuTTYgen can load SSH-2 private keys in OpenSSH's format and \cw{ssh.com}'s format. Once you have loaded one of these key types, you can then save it back out as a PuTTY-format key (\c{*.\i{PPK}}) so that you can use \i{export private keys}i\c{.ssh} directory and open the file \i\i{OpenSSH}ii Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 332c201dcfe6e5729ed45b4fbb18b9e6 Text-delta-base-sha1: 0997feacdfd785ab32537d5d106e7296a355d048 Text-content-length: 2886 Text-content-md5: 5e97d9de1f55c284f9dc6c1a96285585 Text-content-sha1: 203d04b6af21282c4a6a6e08c4276ca29638766d Content-length: 2886 SVN��K-}:���!!=� Vn�><�%v�;$�A^�U+�[ �o|�Ts�U�'z�3�F�jm�Ug�NT�S6�P$� �+��+ I�lg�S�Dul�J�]ib�p��p<� ,R�q5�b�mg� W�v(#\i{terminal window}\i{three-button mouse} and have set it up; see \k{config-mouse}). (Pressing \i{Shift-Ins}, or selecting \q{Paste} from the \I{right mouse button, with Ctrl}Ctrl+right-click \i{context menu} \I{selecting words}select a whole word. If you double-click, hold down the second click, and drag the mouse, PuTTY will select a sequence of whole words. (You can adjust precisely what PuTTY considers to be part of a word; see \k{config-charclasses}.) If you \e{triple}-click, or \i{triple-click} and drag, then PuTTY will \I{selecting lines}select a whole line or \I{mouse reporting}handle mouse clicks in the PuTTY window itself. If this happens, the \i{mouse pointer} will turn into an arrow, and using the mouse to copy and paste will only work if \i{scrollbar}\i{context menu}\i{PuTTY window}\I{Telnet special commands}special commands are \I{SSH special commands}special \ii{IGNORE message}\i{repeat key exchange}\i{terminal emulation}\i{system menu}q{Logging} panel\i{control sequence}q{Translation} paneli{\q{X display location}\I{X11 authentication}authentication to connect, \i{network connection}\i{POP-3}\I{local port forwarding}connect from your local machine to a port on a remote server, you need to: \b Choose a \i{port number}\I{remote port forwarding}forwarded back to your PC as a connection to a \I{privileged port}SOCKS\I{localhost}SSH client or server machine itself (for local and remote forwardings respectively). There are \i{OpenSSH}\I{listen address}listen on. Typically a Windows machine can be asked to listen on any single IP address in the \cw{127.*.*.*} range, and all of these are \i{loopback address}es available only to the local machine. So if you forward (for example) \c{127.0.0.5:79} to a remote machine's \i\cw{finger} port, then you should be able to run commands such as \i{Default Settings}\i{Windows shortcut}\I{local port forwarding}forward a local port (say 5110) to a remote destination (say \cw{popserver.example.com} port 110), you can write something like \I{remote port forwarding}remote port to a local destination, just use the \c{-R} \I{listen address}specify an IP address for the listening end of the tunnel, prepend it to the argument: \c plink -L 127.0.0.5:23:localhost:23 myhost To set up \I{dynamic port forwarding}SOCKS-based dynamic port forwarding on a local port, use the \c{-D} option. For this one you only have to pass the port \I{reading commands from a file}read a remote command or script from a file The \i\c{-m} option performs a similar function to the \q{\ii{Remote command}\i{PPK}\i{PGP key fingerprint}\i{verifying new versions} Revision-number: 5594 Prop-content-length: 162 Content-length: 162 K 7 svn:log V 62 Add versionid for index. Also plumb in pgpkeys.but versionid. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-05T18:03:13.264910Z PROPS-END Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6058709f640674c1f9f111fb30108836 Text-delta-base-sha1: 7f8a770c18b61d90163ae03af32f777d18c1ee9a Text-content-length: 60 Text-content-md5: 0cdda56e4baf66e2fafd8be975f26105 Text-content-sha1: 01a120f3c4b7d15ad758c3ce1ca555deb01811f1 Content-length: 60 SVN�� 6)� �\define{versionidindex} \versionid $Id$ Node-path: putty/doc/vids.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85ed80cc34fa02f19ec72cb8ef568bae Text-delta-base-sha1: dc386021eef990d754bbf7ba76e793e8c49dd9e2 Text-content-length: 52 Text-content-md5: 9636b80f7def588263f746281f163da3 Text-content-sha1: 8776707128ed5ebad4132f390b9eb68a02cd3af6 Content-length: 52 SVN��Rv$�R� \versionidpgpkeys \versionidindex Revision-number: 5595 Prop-content-length: 277 Content-length: 277 K 8 svn:date V 27 2005-04-05T18:11:31.054504Z K 7 svn:log V 176 Add target to build `info' file. We probably already require a new enough version of Halibut that this isn't a problem; nevertheless, I've put it in a separate target for now. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 95 Content-length: 95 K 10 svn:ignore V 63 *.html *.txt *.cnt *.hlp *.gid *.GID *.log *.1 *.info vstr.but PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 013c63bc623c13e73aa2b4e917b1fd4a Text-delta-base-sha1: 0b75f5b359017174436bb92e71dd19d450f13a02 Text-content-length: 78 Text-content-md5: 4e51c2f6f3c6de81a528364e890b537f Text-content-sha1: 9359419dbd1329817a34a9cfaa990c9197ddee50 Content-length: 78 SVN��d 8�}��jqputty.info: $(INPUTS) $(HALIBUT) --info*.info vstr.but Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a375b5d1f652dba2ac0a1b140147bfaa Text-delta-base-sha1: 2daebd759f22f2d0ac6d562a336af7cb931e274b Text-content-length: 77 Text-content-md5: 39d1598209313d350db94bca7aebbcba Text-content-sha1: de11c5587bf47671e24c30367dc2226a6d26a5a3 Content-length: 77 SVN��%b3�+��q#�info-max-file-size}{0\cfg{info-filename}{putty.info Revision-number: 5596 Prop-content-length: 145 Content-length: 145 K 7 svn:log V 45 add XXX-REMOVE-BEFORE-RELEASE re uninstaller K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-05T18:15:41.351058Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ca05999d4db6a6d63e7e84a873cab4d4 Text-delta-base-sha1: cfcf49d1fa067ea60a6b4d982995533a53915bc2 Text-content-length: 114 Text-content-md5: 9c80007a5dd6c6d1e6efce94670991b2 Text-content-sha1: 527a3bf34cdeb2a83e57e68ae13337cb729a3c4e Content-length: 114 SVN��: X�"�X�# \#{XXX-REMOVE-BEFORE-RELEASE - replace with: Older versions of the uninstaller do not} Revision-number: 5597 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2005-04-05T18:38:26.353388Z K 7 svn:log V 28 tweak wording in "pscp -ls" K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da0630e0a2be026003437d98324d2e09 Text-delta-base-sha1: ff91d5ba882397fec4ca8cfe7cb2e4a3bbfbf437 Text-content-length: 26 Text-content-md5: 31c5c455d31fa45a679f8de0d5698347 Text-content-sha1: 258bd410caa86725acf729eaefda55adf15b6bfd Content-length: 26 SVN��UL �l��[z this Revision-number: 5598 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2005-04-05T19:36:25.373055Z K 7 svn:log V 62 Version number and other tweakings prior to the 0.58 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9a5da1ee8ddbb4f8e2b69a3dbd0cdbff Text-delta-base-sha1: f8db390abb0b0fa93a29a84f3a17612af12768d8 Text-content-length: 56 Text-content-md5: 3b0b680d6a0b00bffc4c30103cc055f7 Text-content-sha1: 129770eaac451c50090e9671695bc9a29ce39f32 Content-length: 56 SVN��; #�#��u#, and again in a subsequent comment Node-path: putty/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18cd9fa87084c6932c6100347ab9aec9 Text-delta-base-sha1: d481c30a7e4b84bed6e1a7cead54396a8987091b Text-content-length: 15 Text-content-md5: 5b0f16e753f5ebc4f4fa972d605b9390 Text-content-sha1: 65a8d5a49fe8f7f66a774f7f3e27266db99f8b6a Content-length: 15 SVN��0.58 Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9c80007a5dd6c6d1e6efce94670991b2 Text-delta-base-sha1: 527a3bf34cdeb2a83e57e68ae13337cb729a3c4e Text-content-length: 67 Text-content-md5: dfc08ff072ad93ea39d6b13a3dcee48e Text-content-sha1: 1cdb1b53db550f57b47b6f4d0bd78f4aa6b10f45 Content-length: 67 SVN��A *�"��u Older versions of the uninstaller do not Node-path: putty/doc/pgpkeys.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c01729305ef1175823e6de9472224d88 Text-delta-base-sha1: fc9b5620820967edbe65c43ce0ec61d09b96e633 Text-content-length: 278 Text-content-md5: e0faa72c83d8c5235e899861d43b6542 Text-content-sha1: ee932a1acc7c3329503ea7abac6fd795291547b6 Content-length: 278 SVN��ni ~�0�~�;3release 0.58, all of the PuTTY executables contain fingerprint material (usually accessed via the \i\c{-pgpfp} command-line option), such that if you have an executable you trust, you can use it to establish a trust path, for instance to a newer version Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d0cb7627c1ade2ca45876073d786f298 Text-delta-base-sha1: 6bd6a017c4c30a018c77d0560650e8210a383590 Text-content-length: 23 Text-content-md5: 4ece168231041e26681c0a711f560c2f Text-content-sha1: de26358862ea671e11d874a0fd417782c00c0bf9 Content-length: 23 SVN��"" ���58 Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 31c5c455d31fa45a679f8de0d5698347 Text-delta-base-sha1: 258bd410caa86725acf729eaefda55adf15b6bfd Text-content-length: 23 Text-content-md5: 05bf6167afa2a73e36ba9d219cc5e8c0 Text-content-sha1: 893b356bc135926cc2dae1bd49bb11215e81effa Content-length: 23 SVN��LL ���G58 Node-path: putty/mac/version.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ab635ddff4154a9269e82900c08fab46 Text-delta-base-sha1: 5bdaea9a2094adbd4fffde90b94f23f6ab7003fd Text-content-length: 20 Text-content-md5: ef93e1e18e8251e3df9c20c43c76d690 Text-content-sha1: eda365cca3074ae13f3508bf2c81aae668d5f65e Content-length: 20 SVN��77�m��In8 Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4220b579089111cb155ed94d7394d7bd Text-delta-base-sha1: 6d39166d73618e0e0eed16345af515f3954186fc Text-content-length: 83 Text-content-md5: c5ab53eb27b41aef1bdc7410f30dac47 Text-content-sha1: a8b7b26a3b658aae0532c6c4b0fa958749b4ba8c Content-length: 83 SVN��HH8�x��/�zN8 VersionInfoTextVersion=Release 0.58 AppVersion=0.588 Revision-number: 5599 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 27 Tag release 0.58 of PuTTY. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-04-05T19:36:51.614611Z PROPS-END Node-path: putty-0.58 Node-kind: dir Node-action: add Node-copyfrom-rev: 5598 Node-copyfrom-path: putty Revision-number: 5600 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2005-04-05T21:03:07.258763Z K 7 svn:log V 34 Website updates for 0.58 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b5c032b65ee19a91dab139b4352ec82 Text-delta-base-sha1: 297d8c342046e110cd3b4c58df04db35598b4710 Text-content-length: 90 Text-content-md5: 7964e351c20cf1ae6e963959a2e8ed0d Text-content-sha1: cc816aa4321633e9599ff2a867fb92eeda1f8615 Content-length: 90 SVN��C D�$�D�*temp /~sgtatham/putty/0.58/ http://the.earth.li/~sgtatham/putty/0.58 Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bd69d8719b2b7c77a0aa6fb712993668 Text-delta-base-sha1: 44711df98cc60b908b5a1fd51413f2ac2392774b Text-content-length: 1707 Text-content-md5: 58b2ede27f9fba396140650fc1cf3474 Text-content-sha1: 25ff7ee191f5614419e88949f27649e09c16fa09 Content-length: 1707 SVN��i �_��188 (released 2005-04-05): <ul> <li> Wildcards (<code>mput</code>/<code>mget</code>) and recursive file transfer in PSFTP. <li> You can now save your session details from the Change Settings dialog box, <em>after</em> you've started your session. <li> Various improvements to Unicode support, including: <ul> <li> support for right-to-left and bidirectional text (Arabic, Hebrew etc). Thanks to <a href="http://www.arabeyes.org/"><code>arabeyes.org</code></a> for design and most of the implementation. <li> support for Arabic text shaping, again thanks to <code>arabeyes.org</code>. <li>support for Unicode combining characters. </ul> <li> Support for the <code>xterm</code> 256-colour control sequences. <li> Port forwardings can now be reconfigured in mid-session. <li> Support for IPv6. Thanks to <a href="http://unfix.org/"><code>unfix.org</code></a> for having patiently maintained the patch for this until we were finally ready to integrate it. <li> More configurability and flexibility in SSH-2 key exchange. In particular, PuTTY can now initiate repeat key exchange during the session, which means that if your server doesn't initiate it (OpenSSH is known not to bother) you can still have the cryptographic benefits. <li> Bug fix: display artefacts caused by characters overflowing their character cell should now all be gone. (This would probably have bothered Windows ClearType users more than anyone else.) <li> Bug fix: keepalives are now supported everywhere. (Previously they were supported by Windows GUI PuTTY, but were missing in Plink, PSFTP and the Unix port.) <li> Miscellaneous improvements for CJK/IME users; many thanks to Hung-Te Lin for assistance. </ul> Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f38b1d40a1e7810b576a915c1fd39a79 Text-delta-base-sha1: e87478dddd2072b7386535cb6547e35cea4f2e41 Text-content-length: 215 Text-content-md5: ca9c7610f55df20ab88569d1eacc3c13 Text-content-sha1: 6840ff8be1b44038ac2e67fa6844884b75eb4adf Content-length: 215 SVN��&&5�!�� "�X@�j7�U��(�T|�O@�Q>�4r88-installer.exe">putty-0.58-installerx86/putty-0.588-installerx86/putty-0.588.tar.gz">putty-0.58.tar.gzputty-0.58.tar.gzputty-0.58.tar.gzputty-0.58 Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a392141aa7185f058b36c86d0264149 Text-delta-base-sha1: e3bf8f18ddfe2c559459609bec0d85bb9bd038e5 Text-content-length: 22 Text-content-md5: 512e858d911da9406c12e9a5d6b1e109 Text-content-sha1: a63ca82580e799e27f39ed41341ec30fb47674b9 Content-length: 22 SVN��DD ���'8 Revision-number: 5601 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2005-04-05T21:06:27.182746Z K 7 svn:log V 31 Add a date/rev entry for 0.58. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 20e4e890524dd9daf347caeb2b47f887 Text-delta-base-sha1: c10a4bc80718db9108528a1c4f925dc703204f73 Text-content-length: 123 Text-content-md5: dc8e2d3f97febc0a06265adf781ec982 Text-content-sha1: cde0317508f234b7bfeb4264f51c1aaba75cd5f4 Content-length: 123 SVN��?e b�:�b�Iv, # released on 2005-02-20, from 0.56 branch [ "0.58", "2005-04-05", "r5599" ] # [ "0.59 Revision-number: 5602 Prop-content-length: 178 Content-length: 178 K 7 svn:log V 78 PJB points out that StarNetSSH is based on PuTTY. (We did already know this.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-05T22:29:07.330628Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e7c5f6887ff169d11a2fda0c77d78f2 Text-delta-base-sha1: 725b700ac6a05403af83c3c9f20e30a9bff96000 Text-content-length: 118 Text-content-md5: 279828cd205d0be1f23670926555e113 Text-content-sha1: 9a235020994d5ecefbeee8087de2f9e45d839639 Content-length: 118 SVN��p `�\�`�4Zli><a href="http://www.starnet.com/"> StarNetSSH</a>, an integration with the X-Win32 X server Revision-number: 5603 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 feedback from Jeremy Chadwick K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-06T11:08:26.804618Z PROPS-END Node-path: putty-wishlist/data/win-redraw Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8248779967a1adbf925f1402c04addb7 Text-delta-base-sha1: 0c63cbc5fa03448b10d167d986e36f343844998a Text-content-length: 362 Text-content-md5: 7f7183d55e14fc5b0a5020004f073a29 Text-content-sha1: 77dcff6198becd6c009976bc37656f946933de57 Content-length: 362 SVN��e: T �fzGSummary: Window redraw problems on Windows (white areas) Class: semi-bug Difficulty: taxing Priority: medium Present-in: 0.56 2005-01-13 0.58li>0.58 and previous; various video cards, XP Pro / 2000 Pro, many machines <br>Correlated with "East Asian Languages" in Region Options <br><tt>20050319141100.GA68401@parodius.com</tt> et al </ul> Revision-number: 5604 Prop-content-length: 471 Content-length: 471 K 8 svn:date V 27 2005-04-06T22:16:42.350434Z K 7 svn:log V 370 `xp-wont-run': Apparently my application-manifest trims of r5534 aren't acceptable on all versions of XP. Bah. Revert to pre-r5534 format (but keep version number as 0.0.0.0). People who've had this problem have reported putty.mft to make it go away. NB, putting these updated manifests alongside the executable (e.g. as `putty.exe.manifest') is also reported to work. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/pageant.mft Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 27d462d215c764fb7f17199ebe36c060 Text-delta-base-sha1: 99d0851ce91cd93310ac6875ce1bc0b7d3c9255b Text-content-length: 338 Text-content-md5: c22a1ba545670580c79abea56721a243 Text-content-sha1: dc179f3fad20486794ac1c8e4aa29ed94026df8e Content-length: 338 SVN�� 3�%�"�e$�M= Do not attempt to do anything clever with it, as some versions of Windows are very sensitive to the exact format. Hence, some facts below are fibsversion="0.0.0.0" processorArchitecture="x86" name="Pageant" type="win32" /> <description>PuTTY SSH authentication agent</description Node-path: putty/windows/putty.mft Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5cc1bb4ea167edddf13194e236aef19c Text-delta-base-sha1: 024abfb8bed1bcc353a0462b7569f08c019b6cc1 Text-content-length: 344 Text-content-md5: 7e778c29e973b600435e3a98aeec471f Text-content-sha1: b22c0dc49bb018687e2148efe48daa8eb9d3a3f6 Content-length: 344 SVN��9�%�"�e$�M; Do not attempt to do anything clever with it, as some versions of Windows are very sensitive to the exact format. Hence, some facts below are fibsversion="0.0.0.0" processorArchitecture="x86" name="PuTTY" type="win32" /> <description>A network client and terminal emulator</description Node-path: putty/windows/puttygen.mft Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb58f0be488b47ddf0221ccd868eb026 Text-delta-base-sha1: a875121d7ea5c2a11d0dbfba1d09c2acb5ccaee9 Text-content-length: 336 Text-content-md5: 1dea2ab853440cf860c57a240d1ed4c5 Text-content-sha1: 03d41efcb8748d38c17b35d7ce621a002b3cc875 Content-length: 336 SVN�� 1�%�"�e$�M> Do not attempt to do anything clever with it, as some versions of Windows are very sensitive to the exact format. Hence, some facts below are fibsversion="0.0.0.0" processorArchitecture="x86" name="PuTTYgen" type="win32" /> <description>SSH key generator for PuTTY</description Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 951 Text-content-md5: 49f319f32144d7bb9b7cc9cb72fa0368 Text-content-sha1: 059ee5526713d880754ecc776e21e096af803f76 Content-length: 961 PROPS-END SVN���)))Summary: Fails to run on some versions of Windows XP Class: bug Difficulty: fun Priority: high Absent-in: 0.57 Present-in: 0.58 Fixed-in: 2005-04-07 r5604 Content-type: text/x-html-body <p> We've had some reports that PuTTY utterly fails to run on at least some versions of Windows XP, with the following error message: <p> <blockquote> The application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem. </blockquote> <p> I believe this is likely due to a trim I (JTN) made to the <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sbscs/setup/application_manifests.asp">application manifests</a>; we tested it on one XP install but it seems not all XP installs are born equal, although we're not sure what the discriminating factor is yet. <p> If so, it will affect the graphical utilities only (PuTTY, PuTTYtel, PuTTYgen, and Pageant). Revision-number: 5605 Prop-content-length: 444 Content-length: 444 K 7 svn:log V 345 Implement SDCTR modes, as defined in the newmodes draft. This adds aes128-ctr, aes192-ctr, and aes256-ctr. blowfish-ctr and 3des-ctr are present but disabled, since I haven't tested them yet. In addition, change the user-visible names of ciphers (as displayed in the Event Log) to include the mode name and, in Blowfish's case, the key size. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-04-06T23:27:08.215562Z PROPS-END Node-path: putty/sshaes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 324526f2c0a1a69bb2cb5b91044020f5 Text-delta-base-sha1: c397047a8a4d2ed0a30d905783b78003028e67cb Text-content-length: 1146 Text-content-md5: 5833e05362c490643233f88f81296138 Text-content-sha1: 354ee8e82a1064138da0dd41bf94adfa17bedc4c Content-length: 1146 SVN��hp|�1�U�ij�Uw�1�b*�(8�N==�O7H�D4�Hx�H@�R�RZ�R,�c~f�aes_sdctr(unsigned char *blk, int len, AESContext *ctx) { word32 iv[4], b[4], tmpmemcpy(b, iv, sizeof(b)); aes_encrypt(ctx, b); for (i = 0; i < 4; i++) { tmp = GET_32BIT_MSB_FIRST(blk + 4 * i); PUT_32BIT_MSB_FIRST(blk + 4 * i, tmp ^ b[i]); } for (i = 3; i >= 0; i--) if ((iv[i] = (iv[i] + 1) & 0xffffffff) != 0) breakstatic void aes_ssh2_sdctrsdctr_ctrsdctr, aes_ssh2_sdctr, "aes128-ctr", 16, 128, "AES-128 SDCTR" }; static const struct ssh2_cipher ssh_aes192_ctr = { aes_make_context, aes_free_context, aes_iv, aes192_key, aes_ssh2_sdctr, aes_ssh2_sdctr, "aes192-ctr", 16, 192, "AES-192 SDCTR" }; static const struct ssh2_cipher ssh_aes256_ctsdctr, aes_ssh2_sdctr, "aes256-ctr", 16, 256, "AES-256 SDCTR" }; CBC CBC CBC CBC CBC CBC CBC" }; static const struct ssh2_cipher *const aes_list[] = { &ssh_aes256_ctr, &ssh_aes256, &ssh_rijndael256, &ssh_rijndael_lysator, &ssh_aes192_ctr, &ssh_aes192, &ssh_rijndael192, &ssh_aes128_ctr Node-path: putty/sshblowf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 595fff79a27f03e4eb50a81d5df16c7e Text-delta-base-sha1: 17594ee30b7a5acc9c741da59e846b63c9ac1f50 Text-content-length: 971 Text-content-md5: 97158e4a10550a116054ec614d1a0af1 Text-content-sha1: bab4e21e01aabccc1c2cd7bf49572b13ab3cb645 Content-length: 971 SVN��CTNo���K~�`=�_�f�_|�f_�'�U1�lC�L=:�2msb_sdctrb[2], iv0, iv1, tmpblowfish_encrypt(iv0, iv1, b, ctx); tmp = GET_32BIT_MSB_FIRST(blk); PUT_32BIT_MSB_FIRST(blk, tmp ^ b[0]); tmp = GET_32BIT_MSB_FIRST(blk + 4); PUT_32BIT_MSB_FIRST(blk + 4, tmp ^ b[1]); if ((iv0 = (iv0 + 1) & 0xffffffff) == 0) iv1 = (iv1 + 1) & 0xffffffff256_keyblowfish_setkey(ctx, key, 32static void blowfish_ssh2_sdctrsdctr-128 CBC-128 CBC" }; static const struct ssh2_cipher ssh_blowfish_ssh2_ctr256_key, blowfish_ssh2_sdctr, blowfish_ssh2_sdctr, "blowfish-ctr", 8, 256, "Blowfish-256 SDCTR" }; /* * "blowfish-ctr" is disabled because it hasn't had any interoperability * testing, which is in turn because I couldn't find another implementation * to test against. Once it's been tested, it can be enabled in standard * builds. */ static const struct ssh2_cipher *const blowfish_list[] = { /* &ssh_blowfish_ssh2_ctr, */ Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 663e1c207eab812ee6b06d2373fefe44 Text-delta-base-sha1: 5afcc3a17fb359cde26dd515d727e83964aa57e9 Text-content-length: 1083 Text-content-md5: bfb3ebac3e9cc14af51592cb1eaacd97 Text-content-sha1: ebb3f23a982558390b274512095e2cde6ab3560b Content-length: 1083 SVN��t[Id�S��l���d2�mxP�e�VuH�b�ides_sdctr3b[2], iv0, iv1, tmpdes_encipher(b, iv0, iv1, &scheds[2]); des_decipher(b, b[0], b[1], &scheds[1]); des_encipher(b, b[0], b[1], &scheds[0]); tmp = GET_32BIT_MSB_FIRST(src); PUT_32BIT_MSB_FIRST(dest, tmp ^ b[0]); src += 4; dest += 4; tmp = GET_32BIT_MSB_FIRST(src); PUT_32BIT_MSB_FIRST(dest, tmp ^ b[0]); src += 4; dest += 4; if ((iv0 = (iv0 + 1) & 0xffffffff) == 0) iv1 = (iv1 + 1) & 0xffffffff3_ssh2_sdctrsdctr3 CBC" }; static const struct ssh2_cipher ssh_3des_ssh2_ctr = { des3_make_context, des3_free_context, des3_iv, des3_key, des3_ssh2_sdctr, des3_ssh2_sdctr, "3des-ctr", 8, 168, "triple-DES SDCTR CBC CBC" }; /* * "3des-ctr" is disabled because it hasn't had any interoperability * testing, which is in turn because I couldn't find another implementation * to test against. Once it's been tested, it can be enabled in standard * builds. */ static const struct ssh2_cipher *const des3_list[] = { /* &ssh_3des_ssh2_ctr, */ inner-CBC CBC" }; Revision-number: 5606 Prop-content-length: 201 Content-length: 201 K 8 svn:date V 27 2005-04-06T23:32:54.397463Z K 7 svn:log V 100 "Priority: high" is at good a reason as "difficulty != fun" to emphasise fixed bugs in the summary. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc8e2d3f97febc0a06265adf781ec982 Text-delta-base-sha1: cde0317508f234b7bfeb4264f51c1aaba75cd5f4 Text-content-length: 370 Text-content-md5: 0dac66434945c79e54e0a23e3c0b99b6 Text-content-sha1: 0e70a62145287f4151fe96a1532f722a2f22d198 Content-length: 370 SVN��epE�D��aH�j-�q:�+:impimpfixed bugs ordered by importance sub printbugs_imp_ordered { my ($buglist) = @_; my @tmp = @$buglist; my @impbugs = grep( || (defined($bugs{$_}->{hdrs}->{priority}) && $bugs{$_}->{hdrs}->{priority} eq "high")), @tmp); subtractbugs(\@tmp, printbugs(\@imp Revision-number: 5607 Prop-content-length: 452 Content-length: 452 K 8 svn:date V 27 2005-04-06T23:40:30.023352Z K 7 svn:log V 353 Remove support for the "rijndael256-cbc", "rijndael192-cbc", and "rijndael128-cbc" names for AES. These are in the IANA namespace, but never appeared in any secsh-transport draft, and no version of OpenSSH has supported them without also supporting the aes*-cbc names. "rijndael-cbc@lysator.liu.se" gets to live because it's in the private namespace. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshaes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5833e05362c490643233f88f81296138 Text-delta-base-sha1: 354ee8e82a1064138da0dd41bf94adfa17bedc4c Text-content-length: 126 Text-content-md5: d25eef2655a9372bd17937a045697f43 Text-content-sha1: da29cbc009e1a995b5d2d07744779e1eebb95f95 Content-length: 126 SVN��h$Y�A��vs�*AQ�j~_lysator_lysator, &ssh_aes192_ctr, &ssh_aes192, &ssh_aes128_ctr, &ssh_aes Revision-number: 5608 Prop-content-length: 182 Content-length: 182 K 8 svn:date V 27 2005-04-07T01:32:41.346188Z K 7 svn:log V 82 In get_sesslist(), when freeing, set freed members to NULL on general principles. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1445fac0e486a916a4e11f6550af1a7b Text-delta-base-sha1: 974e8ff33d9d4a7a81770f4b05dcd8fa89f641f2 Text-content-length: 73 Text-content-md5: d4c0451974c241af8f90508a8c140505 Text-content-sha1: 7e4b7bff18c367df25de953cd8288b834fe33fae Content-length: 73 SVN��n6�f� list->buffer = NULL; list->sessions = NULL; } } Revision-number: 5609 Prop-content-length: 811 Content-length: 811 K 8 svn:date V 27 2005-04-07T01:36:28.665845Z K 7 svn:log V 710 If a new session was saved from Change Settings, a side-effect on Windows was that the global `sesslist' got out of sync with the saved-sessions submenu, causing the latter to launch the wrong sessions. Also, Change Settings wasn't getting a fresh session list, so if the set of sessions had changed since session startup it wouldn't reflect that (at least until a session was saved). Fixed (on all platforms). Therefore, since the global sesslist didn't seem to be useful, I've got rid of it; config.c creates one as needed, as do the frontends. (Not tried compiling Mac changes.) Also, we now build the saved-sessions submenu on demand on Windows and Unix. (This should probably also be done on the Mac.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a6adf442955f32dcef891a6b9270ba8d Text-delta-base-sha1: 9d72ad9a317f3e063fd6e8c3413a67d973dff4cf Text-content-length: 457 Text-content-md5: 47cb9f78f49bbd2b9b1245b6016622b1 Text-content-sha1: 0664d8722f9561aeee66c0bb78af2ae05c1d3138 Content-length: 457 SVN��pZ>}�U��JV�_8� U�[w�T�2F�x�r:�,D.sessions[i], "Default Settings"); load_settings(ssd->sesslist.sessions[i], !isdef, cfg); if (!isdef) { strncpy(savedsession, ssd->sesslist..nsessions; i++) dlg_listbox_add(ctrl, dlg, ssd->sesslist...&ssd->sesslist, FALSE); get_sesslist(&.sessions[i]); get_sesslist(&ssd->sesslist, FALSE); get_sesslist(&int midsession, get_sesslist(&ssd->sesslist, TRUE) Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 78811afce3170101a4ee30ed485ad2a1 Text-delta-base-sha1: 5926b65ab697c2ffd9ee8d172139245016df573d Text-content-length: 86 Text-content-md5: fb42f97ba209ad4692ef9d5682aadf50 Text-content-sha1: 92228594b92af8e1f295ca702a7b53030e701a14 Content-length: 86 SVN��|)<�S��cx�7Es->ctrlbox = ctrl_new_box(); setup_config_box(s->ctrlbox Node-path: putty/macosx/osxclass.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 24e03504b1c783ed235fe3de8de731ae Text-delta-base-sha1: 0cd77eedaccc35154e461863a333efd1d33883f0 Text-content-length: 20 Text-content-md5: 1ecdee3c213bb37ee5e76a286efccc9d Text-content-sha1: d85b0b7d4a881405e7a7a59aa4745a96de476638 Content-length: 20 SVN��aI ��e��d} Node-path: putty/macosx/osxdlg.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 129047b02b1ca4955341b93a1096abc6 Text-delta-base-sha1: 30384f9402cca5b8889913159debdda62226d764 Text-content-length: 75 Text-content-md5: f339c345f64a7cebcfd8d22d014485c2 Text-content-sha1: 695a38beba57bcd8b0161e48603734a53c8f9e8d Content-length: 75 SVN��R/ 6�*��Octrlbox = ctrl_new_box(); setup_config_box(ctrlbox Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 776624aa52e1519a4999a0fc0d6e5a38 Text-delta-base-sha1: ac3ceb8ba27573e4c84e71b517c30709be186ee6 Text-content-length: 48 Text-content-md5: e2bc98bdafbd0bb2c0d684ea94058b48 Text-content-sha1: 7aa0188e69935afad2c345856a4bccd4fbaa9aab Content-length: 48 SVN��m �n��h int midsession, Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 491307defe188d034642b43952c77c8c Text-delta-base-sha1: 24a3108ce3740e46ceebaf1d6f00097d6d6bb0c5 Text-content-length: 42 Text-content-md5: 601a4ba5d5d4c901b8b7b674699a1bd4 Text-content-sha1: 1c27bef4489a8545280d7e7b49d0bfb5025a49a6 Content-length: 42 SVN��-��g��z�i�g�| Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25d14c79f9baf4e23d751ebf8b0c5132 Text-delta-base-sha1: b3b84314bca2da15b74adbea88a5b13caddee22e Text-content-length: 1380 Text-content-md5: 0524ec6eaf283f3ae0d4a2fff3d6bd79 Text-content-sha1: c73eb446d95d20c29d4d7fc81dddcb48392a0c2b Content-length: 1380 SVN����&�W��Pz%�L|�g<Nstatic void update_savedsess_menu(GtkMenuItem *menustruct sesslist sesslist; int i; gtk_container_foreach(GTK_CONTAINER(inst->sessionsmenu), (GtkCallback)gtk_widget_destroy, NULL); get_sesslist(&sesslist, TRUE); for (i = 1; i < sesslist.nsessions; i++) { GtkWidget *menuitem = gtk_menu_item_new_with_label(sesslist.sessions[i]); gtk_container_add(GTK_CONTAINER(inst->sessionsmenu), menuitem); gtk_widget_show(menuitem); gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", dupstr(sesslist.sessions[i])); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(saved_session_menuitem), inst); gtk_signal_connect(GTK_OBJECT(menuitem), "destroy", GTK_SIGNAL_FUNC(saved_session_freedata), inst); } get_sesslist(&sesslist, FALSE); /* free up */ } void update_specials_menuinst->sessionsmenu = gtk_menu_new(); /* sessionsmenu will be updated when��� it's invoked */ /* XXX is this the right way to do dynamic menus in Gtk? */ MKMENUITEM("Saved Sessions", update_savedsess_menu); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->sessionsmenu); } MKMENUITEM(NULL, NULL); MKMENUITEM("Change Settings", change_settings_menuitem); MKMENUITEM(NULL, NULL); if (use_event_log) MKMENUITEM("Event Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: afadf76c34e09e150b04341972d01ad3 Text-delta-base-sha1: ab06f11292a4c93d326de813211985d26c99feac Text-content-length: 53 Text-content-md5: 2f3e4e0070caeededa611a6e475cee60 Text-content-sha1: 8d2a37fc124b27aefce7ae0952589f7d607bc4dc Content-length: 53 SVN�� s!�s��D0�9� ��\1ret = Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cea8db77f0a9519f4f56f820a19f8128 Text-delta-base-sha1: c67faa893913e81d86023b94756916e988b8c8fa Text-content-length: 1735 Text-content-md5: bc18e1ce4448a06c4bbf98cb35fb09f4 Text-content-sha1: 90b4e41bdd7ae43bb42785beea1c8fff2c6fc96d Content-length: 1735 SVN����< �E��,B�*`�FU�O&�1vK�~� static void update_savedsess_menu(voidstatic HMENU savedsess_menu; Config cfg; /* exported to windlg.c */ static struct sesslist sesslist; /* for saved-session menum; intavedsess_menu = CreateMenu(); get_sesslist(&sesslist, TRUE); update_savedsess_menu(avedsess_menu, Refresh the saved-session submenu from `sesslist'. */ static void update_savedsess_menu(void) { int i; while (DeleteMenu(savedsess_menu, 0, MF_BYPOSITION)) ; /* skip sesslist.sessions[0] == Default Settings */ for (i = 1; i < ((sesslist.nsessions <= MENU_SAVED_MAX+1) ? sesslist.nsessions : MENU_SAVED_MAX+1); i++) AppendMenu(savedsess_menu, MF_ENABLED, IDM_SAVED_MIN + (i-1)*MENU_SAVED_STEP, sesslist.sessions[i])INITMENUPOPUP: if ((HMENU)wParam == savedsess_menu) { /* About to pop up Saved Sessions sub-menu. * Refresh the session list. */ get_sesslist(&sesslist, FALSE); /* free */ get_sesslist(&sesslist, TRUE); update_savedsess_menu(); return 0; } break�(__�(�ar *) p, "\x1BO%c", xkey); return p - output; } } if (wParam == VK_BACK && shift_state == 0) { /* Backspace */ *p++ = (cfg.bksp_is_delete ? 0x7F : 0x08); *p++ = 0; return -2; } if (wParam == VK_BACK && shift_state == 1) { /* Shift Backspace */ /* We do the opposite of what is configured */ *p++ = (cfg.bksp_is_delete ? 0x08 : 0x7F); *p++ = 0; return -2; } if (wParam == VK_TAB && shift_state == 1) { /* Shift tab */ *p++ = 0x1B; *p++ = '['; *p++ = 'Z'; return p - output; } if (wParam == VK_SPACE && shift_state == 2) { /* Ctrl-Space * Revision-number: 5610 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2005-04-07T01:42:36.550054Z K 7 svn:log V 88 Add keyboard accelerators for IPv4/IPv6 selections options. (Also for `window_border'.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 47cb9f78f49bbd2b9b1245b6016622b1 Text-delta-base-sha1: 0664d8722f9561aeee66c0bb78af2ae05c1d3138 Text-content-length: 207 Text-content-md5: c5e84428854f341ceefcad7341bdae19 Text-content-sha1: 3635535f8c6509027044c86235d5248829fcbd35 Content-length: 207 SVN��Z"%�L��6WM�rU�|^'e''u', I(ADDRTYPE_UNSPEC), "IPv4", '4', I(ADDRTYPE_IPV4), "IPv6", '6''u', I(ADDRTYPE_UNSPEC), "IPv4", '4', I(ADDRTYPE_IPV4), "IPv6", '6' Revision-number: 5611 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2005-04-07T11:40:53.619269Z K 7 svn:log V 22 PuTTY for Symbian UIQ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 279828cd205d0be1f23670926555e113 Text-delta-base-sha1: 9a235020994d5ecefbeee8087de2f9e45d839639 Text-content-length: 113 Text-content-md5: 2cb0945f60010d3760155c66b193b478 Text-content-sha1: eb6d4054aac0b2aa1e2785551a85c8f99d7bb164 Content-length: 113 SVN��p- [�)�[�)GSymbian</a> (Nokia) <li><a href="http://matrix.tmit.bme.hu/putty/"> PuTTY for Symbian UIQ Revision-number: 5612 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2005-04-07T12:00:01.600567Z K 7 svn:log V 80 Oops, forgot to credit Ahmad Khalifa of arabeyes.org for the bidi/shaping work. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc1e9c3a9224aed1bc6cda1c400ce9f6 Text-delta-base-sha1: cb4dcee0335ed00730d291d20e68052032ed30b8 Text-content-length: 53 Text-content-md5: c7d246ddcea995c7de7fda096339875d Text-content-sha1: 78d29552146d1f3cf9493f6c658da5421adcf6ea Content-length: 53 SVN��p �[��lAhmad Khalifa, Markus Kuhn, and Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4eb7f3acd8e0a3049a000134a82d5291 Text-delta-base-sha1: 63f83aaeab690f2030327c1962c4c33838ceedc2 Text-content-length: 49 Text-content-md5: 5753a03dde01c4c08c73bf6ccc5f1d26 Text-content-sha1: db0a1c9fc4365d28eb347dd72c325d2ecb5af735 Content-length: 49 SVN��CR �*�� 7Ahmad Khalifa, Markus Kuhn, Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 74afef6eed0145c0ddaa2b011a03a82b Text-delta-base-sha1: 787cb12f61aa6f687ca36e96d7d23f318e06e444 Text-content-length: 64 Text-content-md5: 6903653742ce5e0a71badbfa8b36554a Text-content-sha1: 47762f5455f4d3bb380eec5be669f20b050396e6 Content-length: 64 SVN��BQ '�O��[gAhmad Khalifa, Markus " "Kuhn, and Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b568439800dd09d2521cf7473abb4a7 Text-delta-base-sha1: 3799872fe7978154864c4f5fb0d2aa88055e10ee Text-content-length: 60 Text-content-md5: 3023c1af31c0b8825f085c4453108a60 Text-content-sha1: b23c56c5bd1f7dae376c8e99562ee4bfc618487d Content-length: 60 SVN��kz '�x��[Ahmad Khalifa, Markus " "Kuhn, and Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 601a4ba5d5d4c901b8b7b674699a1bd4 Text-delta-base-sha1: 1c27bef4489a8545280d7e7b49d0bfb5025a49a6 Text-content-length: 57 Text-content-md5: e43108795378667a208c76f2f65e6f10 Text-content-sha1: 2ec46631c1ee6973038ddbfd2324c8b27257e039 Content-length: 57 SVN��-< � ��|1Ahmad Khalifa, " "Markus Kuhn, Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c3a15df7f6a3d012322daa59f684db3 Text-delta-base-sha1: c20c68ccada76c6fd968dd0001e6bfcdb5d7ccee Text-content-length: 83 Text-content-md5: 4ab0cb34497a2c4a4247c6dc1e43b087 Text-content-sha1: 25a6df12db0401eedc6f99a8117a9d1f1574f6fc Content-length: 83 SVN��[j >�S��YAhmad Khalifa,", 1003, 10, 42, 206, 8 LTEXT "Markus Kuhn, Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c9ea00dcad2f5c9a6dd52f47fe467be Text-delta-base-sha1: 396c66e1c3d4544b3032677eb9555c47a9045243 Text-content-length: 83 Text-content-md5: 66c3e7010f204c2e6dda8aec578b6fca Text-content-sha1: f669b43645d48baef0b650996b848a42757023f3 Content-length: 83 SVN�� >���Z6Ahmad Khalifa,", 1003, 10, 42, 206, 8 LTEXT "Markus Kuhn, Node-path: putty/windows/win_res.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7123fb671e688a41787d437f59efe70b Text-delta-base-sha1: da4161e8c30a2dc85000915b390efcb15611fcfa Text-content-length: 83 Text-content-md5: 8a2cf0ee333bf16aabb1fdc5b3d91faa Text-content-sha1: b867982db91d2cebe5108b49f900047759c14b75 Content-length: 83 SVN��_n >�Y��WAhmad Khalifa,", 1003, 10, 42, 206, 8 LTEXT "Markus Kuhn, Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 83fcca07462c8473763af6d1150e6cd9 Text-delta-base-sha1: 292efa0f37040b64f504f6c1a884d2e83b7a8efa Text-content-length: 53 Text-content-md5: 6081525e1a8b3bf067d1c37759baddfb Text-content-sha1: 135704a8b33c2054041f358e3161a49ccc803666 Content-length: 53 SVN��l{ ���B*Ahmad Khalifa, Markus Kuhn, and Revision-number: 5613 Prop-content-length: 301 Content-length: 301 K 8 svn:date V 27 2005-04-07T12:38:17.011895Z K 7 svn:log V 200 I always get a lot of personal mail about PuTTY when I send out a release announcement, because people reply directly to the putty-announce mail. I should remember to set a Reply-To header next time. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b0b680d6a0b00bffc4c30103cc055f7 Text-delta-base-sha1: 129770eaac451c50090e9671695bc9a29ce39f32 Text-content-length: 113 Text-content-md5: b5c0e227eb8b21bf05f454e54fb21101 Text-content-sha1: 309143a3839f09e820490567c0f6c35f18f47838 Content-length: 113 SVN��; [�7�[� 1 * Set a Reply-To on the mail so that people don't keep replying to my personal address Revision-number: 5614 Prop-content-length: 777 Content-length: 777 K 8 svn:date V 27 2005-04-07T22:33:42.908787Z K 7 svn:log V 676 Tone down canonical-name resolution when using getaddrinfo(). Previously we were doing a forward+reverse lookup, which seems above and beyond the call of duty, especially given that getaddrinfo() can be persuaded to return a canonical name (this is what unix/uxnet.c does). Unfortunately, I'm unable to test this at all as Win98 doesn't have getaddrinfo(); hopefully I'll be able to find a mug with a modern version of Windows to check it's not completely broken. I think the effects of this are mostly cosmetic -- the canonical name is used for window titles (and some people have been annoyed at the new behaviour), other displays, and probably also for proxy exclusions. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0d3734a0d47505c5582d9029b2335129 Text-delta-base-sha1: fea47f1f0beba1e71d8b2ec8faf77cfa96e9c2bd Text-content-length: 208 Text-content-md5: a7dadeb1aca30fa350f0d704afaa3a82 Text-content-sha1: bdab9b43ca8ecec6b053f2577c03a9b2a603a05c Content-length: 208 SVN��~r/�3��U,�;Chints.ai_flags = AI_CANONNAMEif (ret->ai->ai_canonname) strncpy(realhost, ret->ai->ai_canonname, lenof(realhost)); else strncpy(realhost, host, lenof(realhost)); Revision-number: 5615 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2005-04-07T23:20:53.334453Z K 7 svn:log V 43 Update with current status and workarounds K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49f319f32144d7bb9b7cc9cb72fa0368 Text-delta-base-sha1: 059ee5526713d880754ecc776e21e096af803f76 Text-content-length: 1782 Text-content-md5: 24e7d0c5ad258443ca5c9a2a8ecb2c8c Text-content-sha1: f75b9e1969f239900c30269bf13b02e098874107 Content-length: 1782 SVN��)T�I�z�98x�>kba few reports that PuTTY 0.58 utterly fails to run on some (but not all) versions of Windows XP, with the following error (Reinstalling PuTTY does not fix the problem.) <p> It's not clear to us precisely which variants of XP are affected. We've only had four reports so far; the information we've seen indicates that the problem is with older, unpatched versions of XP. <p> If you run into this, please try one of the workarounds below, which have worked for everyone so far. If that doesn't work for you, <em>please</em> tell us, or it will likely continue to be broken. <p><ul> <li>A separate manifest file. If you download the following files, rename them as indicated, and put them in the same directory as the relevant 0.58 executable, they should override the application manifests and allow them to run. <br>(Note that this is only a temporary workaround; faffing with extra files will not be required in the long term.) <ul> <li><tt><a href="http://www.tartarus.org/~simon-anonsvn/viewcvs.cgi/*checkout*/putty/windows/putty.mft?rev=5604">putty.mft</a></tt>: rename to <tt>putty.exe.manifest</tt> (or <tt>puttytel.exe.manifest</tt>) <li><tt><a href="http://www.tartarus.org/~simon-anonsvn/viewcvs.cgi/*checkout*/putty/windows/puttygen.mft?rev=5604">puttygen.mft</a></tt>: rename to <tt>puttygen.exe.manifest</tt> <li> <li><tt><a href="http://www.tartarus.org/~simon-anonsvn/viewcvs.cgi/*checkout*/putty/windows/pageant.mft?rev=5604">pageant.mft</a></tt>: rename to <tt>pageant.exe.manifest</tt> </ul> <li>A development snapshot with updated application manifests. (Although note that we're likely to do destabilising things to the snapshots soon, so this may not be a good long-term solution, depending on what state they're in.) </ul> Revision-number: 5616 Prop-content-length: 106 Content-length: 106 K 8 svn:date V 27 2005-04-07T23:33:17.605950Z K 7 svn:log V 7 Tweaks K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 24e7d0c5ad258443ca5c9a2a8ecb2c8c Text-delta-base-sha1: f75b9e1969f239900c30269bf13b02e098874107 Text-content-length: 100 Text-content-md5: 4b04bae61c7d680f3f048f4c0884a27f Text-content-sha1: a34d7547dbeb08944fb7ad21e80d58b2e0cd5093 Content-length: 100 SVN��fE�`�E�!N�Z;�FN(SP1), but it seems not all XP installs are born equal in this regard Revision-number: 5617 Prop-content-length: 183 Content-length: 183 K 8 svn:date V 27 2005-04-07T23:44:44.682427Z K 7 svn:log V 83 Summary: Windows Unicode font linking broken Absent-in: 0.56 0.57 Present-in: 0.58 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-font-linking Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1439 Text-content-md5: 035a4a32610f7a8e9198a37e24802c78 Text-content-sha1: e4a3968090e84d30ac209f8eac9dfb290ab8f3d3 Content-length: 1449 PROPS-END SVN���Summary: Windows Unicode font linking broken Class: bug Difficulty: tricky Priority: medium Absent-in: 0.56 0.57 Present-in: 0.58 Content-type: text/x-html-body <p> We've had one report that 0.58 breaks Windows' "font linking". This is a mechanism provided by vaguely modern Windows (by "Uniscribe/MLang", apparently) to transparently use multiple fonts as fallbacks to provide the best coverage of the vast Unicode space. <p> The symptom is that some Unicode characters that were correctly displayed in 0.57 will be displayed as blank spaces in 0.58. If those spaces are copied and pasted elsewhere, the original text will be recovered. Only characters that are actually in the currently font will be displayed correctly. <p> This is likely a side-effect of the <a href="bidi.html">bidirectional and Arabic shaping</a> changes. One of the first changes to support this was the creation of <code>exact_textout()</code>, which stops Windows from doing its own bidi/shaping transformations, so that we can do them ourselves. It looks like font linking is a casualty of this. <p> Suggestions for how to modify <code>exact_textout()</code> to allow font linking (and any other advanced rendering features we may have inadvertently clobbered) while preserving the properties we need would be most welcome. <p> A workaround is to use a fixed-width font that directly supports all the characters you need, if you can find one. Revision-number: 5618 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:51.852210Z PROPS-END Revision-number: 5619 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 58 mirror.sg.depaul.edu putty.gonorar.com putty.mirroring.de K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-09T14:12:26.114777Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7678dccfddcc6bbf37e182b7355b3a5d Text-delta-base-sha1: e3864595d85cb9338723054f38d58a5aaf2231fb Text-content-length: 179 Text-content-md5: 701b6ac9785b4c2c9b962c661ff43ab9 Text-content-sha1: 18ad1a4b9622d7ade4b4174a84fcf2305f8c8612 Content-length: 179 SVN��8"���My��O~�I~�M>�6ing.de/">putty.mirroringgonorar.com/">putty.gonorar.com.sg.depaul.edu/pub/putty/">mirror.sg.depaul.eduputty.tolix.org/">putty.tolix Revision-number: 5620 Prop-content-length: 322 Content-length: 322 K 8 svn:date V 27 2005-04-09T18:33:18.985430Z K 7 svn:log V 221 Summary: pterm's relationship to saved sessions should be clarified Class: semi-bug I've claimed in here that pterm's semi-support for PuTTY saved sessions is accidental. If I'm wrong about this, please update suitably. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pterm-settings Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 791 Text-content-md5: b197183d9a1d3822b2d1900e69a27b1f Text-content-sha1: 87d9a7452d13cca6467edf722f46ac6ce4313bf6 Content-length: 801 PROPS-END SVN���  Summary: pterm's relationship to saved sessions should be clarified Class: semi-bug Present-in: 0.55 0.56 0.57 0.58 Content-type: text/x-html-body <p> The documented way to configure <tt>pterm</tt> is by using command-line arguments and/or X resources. <p> However, <tt>pterm</tt> also currently takes notice of PuTTY saved sessions in <tt>~/.putty</tt>, including Default Settings, and responds to the <tt>-load</tt> command-line option. Since 0.58, the saved sessions have also been visible on the Change Settings dialog. <p> This semi-support is more or less by accident. It's not clear that it's the right thing to do, it may be buggy or broken in various regards, and it may go away in future. <p> We should either support this properly and document it, or remove it. Revision-number: 5621 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2005-04-09T23:02:55.854110Z K 7 svn:log V 140 Add WS_VSCROLL style to drop-down non-combo boxes, to add a scroll bar if needed. (Doesn't affect the appearance of any existing controls.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 83f6d6020ec797cb6be0bfeebaafecc4 Text-delta-base-sha1: 6db0cb994a9476ea75c94e4d6f59160705507ab6 Text-content-length: 55 Text-content-md5: 4779e3954de953009bfe058a9243540f Text-content-sha1: a43798457af1b9cfd9aee5f1ce74df7927db405e Content-length: 55 SVN��=W�v��$t�' WS_VSCROLL WS_VSCROLL Revision-number: 5622 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2005-04-10T13:23:47.956315Z K 7 svn:log V 27 Ben's alternative approach K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-font-linking Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 035a4a32610f7a8e9198a37e24802c78 Text-delta-base-sha1: e4a3968090e84d30ac209f8eac9dfb290ab8f3d3 Text-content-length: 364 Text-content-md5: 89670e9d62a1d8f93b039e6c04c6d0fa Text-content-sha1: 8ed24022028a18336c89e24cae3624ec2fdbd57b Content-length: 364 SVN��l U��U�yBen suggests another approach to defusing <code>ExtTextOut()</code>: feed it Arabic presentation forms (which we do already) and also explicit Unicode directional overrides to force LTR rendering. (This does commit us to potentially having to find workarounds for any other cleverness that Windows' font engine might choose to impose on us.) Revision-number: 5623 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2005-04-11T00:09:02.008695Z K 7 svn:log V 15 another report K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4b04bae61c7d680f3f048f4c0884a27f Text-delta-base-sha1: a34d7547dbeb08944fb7ad21e80d58b2e0cd5093 Text-content-length: 24 Text-content-md5: 4026cddc64a40bbbe3d4e60676bca14a Text-content-sha1: 74543c6e0529d65c8ac4543de5d8945987d46455 Content-length: 24 SVN��ff ���aive Revision-number: 5624 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2005-04-11T00:39:41.105036Z K 7 svn:log V 23 huygens.linux4geeks.de K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 701b6ac9785b4c2c9b962c661ff43ab9 Text-delta-base-sha1: 18ad1a4b9622d7ade4b4174a84fcf2305f8c8612 Text-content-length: 118 Text-content-md5: 04b60bdd7524e33309772d391227081e Text-content-sha1: 80b8c3a2e82917746bf5cd0543a65cedc4ad7a6d Content-length: 118 SVN��V���P~�P~�huygens.linux4geeks.de/putty/">huygens.linux4geeks.demirroring.de/">putty.mirroring.de Revision-number: 5625 Prop-content-length: 132 Content-length: 132 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-11T11:58:35.633835Z K 7 svn:log V 32 -unagi.xs4all.nl +cuba.calyx.nl PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04b60bdd7524e33309772d391227081e Text-delta-base-sha1: 80b8c3a2e82917746bf5cd0543a65cedc4ad7a6d Text-content-length: 65 Text-content-md5: 69779a63ff8ab5ad81a349c915e9f2a2 Text-content-sha1: cc68ec6fd4a5374642aaedb207862dc9d521bb4e Content-length: 65 SVN��~&�o��Ux��cuba.calyx.nl/~oink/putty/">cuba.calyx Revision-number: 5626 Prop-content-length: 405 Content-length: 405 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-11T16:23:35.043224Z K 7 svn:log V 304 Retire winctrls.c:multiedit() in favour of a new simpler function for a single full-width edit box. multiedit()'s extra functionality has been superseded by the "columns" mechanism, and it didn't allow an edit box to be created with no label. Also add no-label capability to a couple of other controls. PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4779e3954de953009bfe058a9243540f Text-delta-base-sha1: a43798457af1b9cfd9aee5f1ce74df7927db405e Text-content-length: 757 Text-content-md5: db5dd872dfb440b79fdac85224e3a743 Text-content-sha1: 7c930915bfdc77cd714cd89e3caf3234326ed51e Content-length: 757 SVN��W[Y�Z�e�r+@�n1S�g5�r+@�65�#�^h^�Yy�##�Tu�h�jL�OA static line, followed by a full-width edit box. */ void editboxfw(struct ctlpos *cp, int password, char *text, int staticid, int editid) { RECT r; r.left = GAPBETWEEN; r.right = cp->width; if (text) {cp->ypos += STATICHEIGHT + GAPWITHIN; } r.top = cp->ypos (password ? ES_PASSWORD : 0), WS_EX_CLIENTEDGE, "", editid); cp->ypos +=if (text) {cp->ypos += STATICHEIGHT + GAPWITHIN; } r.top = cp->ypos cp->ypos +=if (stextdoctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); cp->ypos += STATICHEIGHT; }if (stexteditboxfw(&pos, ctrl->editbox.password, escaped, base_id, base_id+1 Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7081ea927000f4e5a5649481aa0e1b9d Text-delta-base-sha1: 01b47b8b90c1c1beedd16efc2c90024b5535c60e Text-content-length: 109 Text-content-md5: b7420eb6eb6446da5c5779df801c0d72 Text-content-sha1: 226b974705b0c4ad4273b3463bf7cba3c2718acb Content-length: 109 SVN��T} W��W�Deditboxfw(struct ctlpos *cp, int password, char *text, int staticid, int editid Revision-number: 5627 Prop-content-length: 208 Content-length: 208 K 8 svn:date V 27 2005-04-11T16:24:58.250863Z K 7 svn:log V 107 Factor out the code to read and write the Environment and PortForwardings mappings into two new functions. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4c0451974c241af8f90508a8c140505 Text-delta-base-sha1: 7e4b7bff18c367df25de953cd8288b834fe33fae Text-content-length: 1432 Text-content-md5: 204e29572dd3f335092adb319a461170 Text-content-sha1: 7e133259300a49a9764de33bcd9da0c50821a9aa Content-length: 1432 SVN��1*`�I�<�BH�O#D�?N�t,J�%w/* * Read a set of name-value pairs in the format we occasionally use: * NAME\tVALUE\0NAME\tVALUE\0\0 in memory * NAME=VALUE,NAME=VALUE, in storage * `def' is in the storage format. */ static void gppmap(void *handle, char *name, char *def, char *val, int len) { char *buf = snewn(2*len, char), *p, *q; gpps(handle, name, def, buf, 2*len); p = buf; q = val; while (*p) { while (*p && *p != ',') { int c = *p++; if (c == '=') c = '\t'; if (c == '\\') c = *p++; *q++ = c; } if (*p == ',') p++; *q++ = '\0'; } *q = '\0'; sfree(buf); } /* * Write a set of name/value pairs in the above format. */ static void wmap(void *handle, char const *key, char const *value, int len) { char *buf = snewn(2*len, char), *p; const char *q; p = buf; q = value; while (*q) { while (*q) { int c = *q++; if (c == '=' || c == ',' || c == '\\') *p++ = '\\'; if (c == '\t') c = '='; *p++ = c; } *p++ = ','; q++; } *p = '\0'; write_setting_s(handle, key, buf); sfree(bu wmap(sesskey, "Environment", cfg->environmt, lenof(cfg->environmt));wmap(sesskey, "PortForwardings", cfg->portfwd, lenof(cfg->portfwd)); gppmap(sesskey, "Environment", "", cfg->environmt, lenof(cfg->environmt));gppmap(sesskey, "PortForwardings", "", cfg->portfwd, lenof(cfg->portfwd)); Revision-number: 5628 Prop-content-length: 146 Content-length: 146 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-11T17:37:02.528263Z K 7 svn:log V 46 Comment: change "window.c" to "the front end" PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e2bc98bdafbd0bb2c0d684ea94058b48 Text-delta-base-sha1: 7aa0188e69935afad2c345856a4bccd4fbaa9aab Text-content-length: 39 Text-content-md5: 0907a17379fe6211eb975c4ec0c294ff Text-content-sha1: af8206a26633c88a16d9ebf15e6259b9a507a0b0 Content-length: 39 SVN��mr �y��lthe front end Revision-number: 5629 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:52.398929Z PROPS-END Revision-number: 5630 Prop-content-length: 104 Content-length: 104 K 7 svn:log V 5 typo K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-12T15:22:53.617120Z PROPS-END Node-path: putty-wishlist/data/win-font-linking Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 89670e9d62a1d8f93b039e6c04c6d0fa Text-delta-base-sha1: 8ed24022028a18336c89e24cae3624ec2fdbd57b Text-content-length: 20 Text-content-md5: 76f30b005cb25d80e65bdee45790a276 Text-content-sha1: 2ff202b974007096b33d6e37c5419ae7ec8d7abf Content-length: 20 SVN��lj ��0��:2 Revision-number: 5631 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 replace putty.saranair.com with putty.thaiweb.net at admin request K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-12T17:53:45.470466Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69779a63ff8ab5ad81a349c915e9f2a2 Text-delta-base-sha1: cc68ec6fd4a5374642aaedb207862dc9d521bb4e Text-content-length: 54 Text-content-md5: d76015cc284dbb0c2be47dc18f89ed2a Text-content-sha1: f5dbf215a3a352a60d3f88c6d9ae3743bb0c9469 Content-length: 54 SVN��~| �|��athaiweb.net/">putty.thaiweb.net Revision-number: 5632 Prop-content-length: 266 Content-length: 266 K 8 svn:date V 27 2005-04-12T20:04:56.923298Z K 7 svn:log V 165 Unify GET_32BIT()/PUT_32BIT() et al from numerous source files into misc.h. I've done a bit of testing (not exhaustive), and I don't _think_ I've broken anything... K 10 svn:author V 5 jacob PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2750de23ec9b2f43bc89bd35c97db591 Text-delta-base-sha1: 00875d3ef59e1729da84645f59e10bc46dd4363f Text-content-length: 23 Text-content-md5: 16664c1a579af46246ce5d93923ca0d2 Text-content-sha1: 1aaeb03d5493e597ab996adca7a25b88b1c46246 Content-length: 23 SVN�� E ��i��\/ Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e4b62f0eb7228985b776c95715a85561 Text-delta-base-sha1: b9a685a0d3ae6c6e9934d777847c23cf6ec495be Text-content-length: 1549 Text-content-md5: 553f6ec07b210ec1f62645bc627071a7 Text-content-sha1: 5bb57eccbb74f432c5a19e26941fcd97be6cd5fb Content-length: 1549 SVN�� z��zdefine GET_32BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8) | \ ((unsigned long)(unsigned char)(cp)[2] << 16) | \ ((unsigned long)(unsigned char)(cp)[3] << 24)) #define PUT_32BIT_LSB_FIRST(cp, value) ( \ (cp)[0] = (unsigned char)(value), \ (cp)[1] = (unsigned char)((value) >> 8), \ (cp)[2] = (unsigned char)((value) >> 16), \ (cp)[3] = (unsigned char)((value) >> 24) ) #define GET_16BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8)) #define PUT_16BIT_LSB_FIRST(cp, value) ( \ (cp)[0] = (unsigned char)(value), \ (cp)[1] = (unsigned char)((value) >> 8) ) #define GET_32BIT_MSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ ((unsigned long)(unsigned char)(cp)[2] << 8) | \ ((unsigned long)(unsigned char)(cp)[3])) #define GET_32BIT(cp) GET_32BIT_MSB_FIRST(cp) #define PUT_32BIT_MSB_FIRST(cp, value) ( \ (cp)[0] = (unsigned char)((value) >> 24), \ (cp)[1] = (unsigned char)((value) >> 16), \ (cp)[2] = (unsigned char)((value) >> 8), \ (cp)[3] = (unsigned char)(value) ) #define PUT_32BIT(cp, value) PUT_32BIT_MSB_FIRST(cp, value) #define GET_16BIT_MSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 8) | \ ((unsigned long)(unsigned char)(cp)[1])) #define PUT_16BIT_MSB_FIRST(cp, value) ( \ (cp)[0] = (unsigned char)((value) >> 8), \ (cp)[1] = (unsigned char)(value) ) #endif Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 50a2a6912d144671200b4dacf1bfc826 Text-delta-base-sha1: f231e9000a330282c8dc5fdd07ca9ecf91e87311 Text-content-length: 20 Text-content-md5: 9bd1bed6dadecaf05a554ba58ac0ff04 Text-content-sha1: f1504add5344ad21c0898430594d8a391a17bfd0 Content-length: 20 SVN��6r ����\Z Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 254ba3394d66223067f1dcf1ab57dec1 Text-delta-base-sha1: e1fb09c36a85951077091411bdeaec110b652b31 Text-content-length: 23 Text-content-md5: 86fd4934f8a3c3f97e3b9e7aa093b296 Text-content-sha1: 6d83149e76650dcd36a9c7179430327dec784384 Content-length: 23 SVN��M ��^��. Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 621a20c2c39001a2a9aa869306dfbefc Text-delta-base-sha1: 5c31a71a3aee9532bc85b9632ada6d74d57f33a0 Text-content-length: 712 Text-content-md5: a287b9bb94db6cc5e371814d768c2a3f Text-content-sha1: cf96054d0fee4bf0b3ad947b954da760b3c8ab52 Content-length: 712 SVN���� A�p��O1Alic key.\r\n"); continue; /* go and try password */ } else if (pktin->type != SSH1_SMSG_SUCCESS) { bombout(("Bizarre response to RSA authentication response")); crStop(0); } break; /* we're through! */ } else { if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { /* * Defence against traffic analysis: we send a * whole bunch of packets containing strings of * different lengths. One of these string���@�?A�_@TRUE); ssh2_pkt_addstring(s->pktout, key->alg->name); pkblob = key->alg->public_blob(key->data, &pkblob_len); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_da�M �� A Node-path: putty/sshaes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d25eef2655a9372bd17937a045697f43 Text-delta-base-sha1: da29cbc009e1a995b5d2d07744779e1eebb95f95 Text-content-length: 23 Text-content-md5: 0f60c8dbfa52edd705cdb87166a5ddd6 Text-content-sha1: 7673548f032f4731738a80142c9cff04f30b5edf Content-length: 23 SVN��$ ��#��q3 Node-path: putty/sshblowf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 97158e4a10550a116054ec614d1a0af1 Text-delta-base-sha1: bab4e21e01aabccc1c2cd7bf49572b13ab3cb645 Text-content-length: 23 Text-content-md5: 0c8a50dd0f7bd10fb95f10ddb9ac2e47 Text-content-sha1: 226e4ed71ad5e39e0643ee482ad8a9a35865a5cd Content-length: 23 SVN��T4 ��+�� K Node-path: putty/sshcrcda.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1da5117b787a57d5cd0ed9cb118b5e78 Text-delta-base-sha1: 62cdf08132eefa68ef93049140508f2eeb30c4fe Text-content-length: 20 Text-content-md5: 48ad6bf07c17cbd0b0c713e4654ff139 Text-content-sha1: d2be59498beab4e83966426c32e78f0f129ed8f3 Content-length: 20 SVN��#9 ��U��d? Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bfb3ebac3e9cc14af51592cb1eaacd97 Text-delta-base-sha1: ebb3f23a982558390b274512095e2cde6ab3560b Text-content-length: 58 Text-content-md5: 28a49c1a0dd2aca9b9efbb065180856b Text-content-sha1: 1fc30343c7d240c6a8f1e83a9ff23e4328400fc3 Content-length: 58 SVN��[K�u��_�f�=static void des_cbc_en Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cdbb609974ddfcbb99a5fdc96ff51a46 Text-delta-base-sha1: 66877af0a5f81dd0f965a411643374c61f8e9771 Text-content-length: 52 Text-content-md5: e598f83ed8d1bc958d575160fdeb5a30 Text-content-sha1: 94ba68a61b6ef8ae04996b9706abeb1cd06c74c8 Content-length: 52 SVN��m,�`�� ��&Gstatic void sha_mpint(SHA Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 26e2c491b9c7253a2e6206034b0b3460 Text-delta-base-sha1: cc8364fbd939bb876bf4674a1aa054cfaae66b35 Text-content-length: 23 Text-content-md5: 1ad55bff7df9210e3771c81313dae3b0 Text-content-sha1: bf94f289a85c673dadadb5bf13cb3c18d8031d91 Content-length: 23 SVN��84 ��|��8� Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35b7c51cbac461abef44762c33980c89 Text-delta-base-sha1: e441c8787d621fe517f32be784b892e89e4c8998 Text-content-length: 23 Text-content-md5: 4f5f1cbdba873e28d964d166e8ec81ba Text-content-sha1: 7cfdb8212c88f41f3795d69fd57152dcb9372147 Content-length: 23 SVN��2q ����T^ Node-path: putty/unix/uxagentc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4b89f49dca31bc0aae18f523f4d838be Text-delta-base-sha1: 46fe94f36e70457ced48bf8b0f56d7b6f9bd78e5 Text-content-length: 20 Text-content-md5: 9817b9ef054f9a127bc809c3978ab6d6 Text-content-sha1: bd6e064f49c762e4db3b772af6a5f4e52d392fd7 Content-length: 20 SVN��\t ��o��W Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 66044c352abd34d90a9127e25c47eb84 Text-delta-base-sha1: 55980c399f33cb7d65dff1f5f19516dca9689669 Text-content-length: 24 Text-content-md5: 3940662681979dbe7bc4d1cbd84ac358 Text-content-sha1: 3cae0b917768016d366e9505360b09ccae22dc1d Content-length: 24 SVN��< ��#��wE Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c87691cbef8577f5a8488281112d97f9 Text-delta-base-sha1: bf7b4eeee13a9242716327638fde79aa641044bc Text-content-length: 23 Text-content-md5: 1af58990abe7c91fd8814a41b111d5ff Text-content-sha1: b5155b58f0dc220fa61b4792c61535abf84463a7 Content-length: 23 SVN��E ��3��t Node-path: putty/windows/winpgntc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0bb88a922d04552a69606788e97786bc Text-delta-base-sha1: 122154375e02459a2838e45de8840f4bf91a7966 Text-content-length: 20 Text-content-md5: 79317577e31037a8e947f428b420e6d9 Text-content-sha1: 9a93acb16d101d5ccc7635314812890520ddbfd3 Content-length: 20 SVN��`x ��5��C Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df5776e069afd9dcaa2564d5deccaf26 Text-delta-base-sha1: 9a41bb8bee75f775d6e5adc8507329b8fe486a6b Text-content-length: 20 Text-content-md5: a54328a687bddc81bfa4a948d0889a47 Text-content-sha1: 5bf2df855afecb9bcba5b33fe7a5a59f894f73f9 Content-length: 20 SVN��dH ��L��|h Revision-number: 5633 Prop-content-length: 232 Content-length: 232 K 7 svn:log V 133 Implement my experimental arcfour modes. The 256-bit version is disabled until I can test it against someone else's implementation. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-04-14T22:58:29.469752Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48c6dc81ed3144d0dbdf3f7e3a444c6c Text-delta-base-sha1: 1628ab3495e91426e8a35d4b5728c2d05a3a1b67 Text-content-length: 29 Text-content-md5: e106471511c3eeb86b12a8fdda8bf5af Text-content-sha1: 5c3b071acd6376c7f7bd6fa6a0f08acfdd0e8a6c Content-length: 29 SVN��RZ ���3 ssharcf Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5e84428854f341ceefcad7341bdae19 Text-delta-base-sha1: 3635535f8c6509027044c86235d5248829fcbd35 Text-content-length: 61 Text-content-md5: c48d9b11fa236ced6b64f4ef3237bf82 Text-content-sha1: 22d347be1145fec90c6d0fa7e1ae3fc21e79a402 Content-length: 61 SVN��"S %�,�� Arcfour (SSH-2 only)", CIPHER_ARCFOUR Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06440d3fb1629d1b9949b8e63d14312f Text-delta-base-sha1: fca1a70e38ea118adfb413b03df233f309570a62 Text-content-length: 151 Text-content-md5: 0dc2ed91ceec5044ae033ae3d840450d Text-content-sha1: 25dc83c6b9fb4cc83ab879eec1fafd3ba5eac466 Content-length: 151 SVN���� -�?��*Arcfour} (RC4) - 256 or 128-bit stream cipher�I BB�I� be sure you know what you're doing. \H{config-ssh-portfwd} \I{po Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fa4c0c7fd100c918071865f0e553925d Text-delta-base-sha1: e09931332cc947ee0511ab09ab25e06ad6023e1f Text-content-length: 35 Text-content-md5: 87c36b5167e9240396c5ee797e447b50 Text-content-sha1: e6bad18b73b06e91e7a11342d8ca2eab6a28e800 Content-length: 35 SVN��" �@��T>and \i{Arcfour Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0cdda56e4baf66e2fafd8be975f26105 Text-delta-base-sha1: 01a120f3c4b7d15ad758c3ce1ca555deb01811f1 Text-content-length: 58 Text-content-md5: d28afb8b4bd18dced1cdadf6573badbd Text-content-sha1: 072df2321dca8b62b17093f1f6386ce48187dfce Content-length: 58 SVN��6] !�*��$Arcfour} Arcfour \IM{Arcfour} RC4 Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0907a17379fe6211eb975c4ec0c294ff Text-delta-base-sha1: af8206a26633c88a16d9ebf15e6259b9a507a0b0 Text-content-length: 31 Text-content-md5: 0fcdcf090a2bcf646faf3c558a9cc0c6 Text-content-sha1: ac6eeb902290cb98e0465e1176bcd0dc3c246f69 Content-length: 31 SVN��r �H��7;ARCFOUR Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 204e29572dd3f335092adb319a461170 Text-delta-base-sha1: 7e133259300a49a9764de33bcd9da0c50821a9aa Text-content-length: 51 Text-content-md5: a6f60ecf922a46318ecfd89f4c57122d Text-content-sha1: 77754190e6a59abe5b2050fc45d24fa8792cc530 Content-length: 51 SVN��1W �h��T]arcfour", CIPHER_ARCFOUR Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a287b9bb94db6cc5e371814d768c2a3f Text-delta-base-sha1: cf96054d0fee4bf0b3ad947b954da760b3c8ab52 Text-content-length: 242 Text-content-md5: efc99207e037bd7b5a57db3972e5c993 Text-content-sha1: 54d26acb15489fbd6da2c982dabd18b59e6b51d8 Content-length: 242 SVN�����������I�v�I�v1�KNARCFOUR: s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_arcfour� sgg� �ic_blob(key->data, &pkblob_len); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_da Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 81108f5819517315a98c779fb529f3ec Text-delta-base-sha1: 626f5bd19363fe4dc5e208a00daf60e49b26c472 Text-content-length: 43 Text-content-md5: 90c6e24e196a3cde96a5203b3ffe2cd7 Text-content-sha1: 92d1696cdb0672b37d60ff4dbbe06564699f049a Content-length: 43 SVN��.] �b��eI2_ciphers ssh2_arcfour Node-path: putty/ssharcf.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 3041 Text-content-md5: 77c401f24509e333f13bab2831ed77bf Text-content-sha1: ca033b85b72e5a49ab4fe4e43e7d28446541b3a3 Content-length: 3051 PROPS-END SVN���SSS/* * Arcfour (RC4) implementation for PuTTY. * * Coded from Schneier. */ #include <assert.h> #include "ssh.h" typedef struct { unsigned char i, j, s[256]; } ArcfourContext; static void arcfour_block(void *handle, unsigned char *blk, int len) { ArcfourContext *ctx = (ArcfourContext *)handle; unsigned k; unsigned char tmp, i, j, *s; s = ctx->s; i = ctx->i; j = ctx->j; for (k = 0; k < len; k++) { i = (i + 1) & 0xff; j = (j + s[i]) & 0xff; tmp = s[i]; s[i] = s[j]; s[j] = tmp; blk[k] ^= s[(s[i]+s[j]) & 0xff]; } ctx->i = i; ctx->j = j; } static void arcfour_setkey(ArcfourContext *ctx, unsigned char const *key, unsigned keybytes) { unsigned char tmp, k[256], *s; unsigned i, j; s = ctx->s; assert(keybytes <= 256); ctx->i = ctx->j = 0; for (i = 0; i < 256; i++) { s[i] = i; k[i] = key[i % keybytes]; } j = 0; for (i = 0; i < 256; i++) { j = (j + s[i] + k[i]) & 0xff; tmp = s[i]; s[i] = s[j]; s[j] = tmp; } } /* -- Interface with PuTTY -- */ /* * We don't implement Arcfour in SSH-1 because it's utterly insecure in * several ways. See CERT Vulnerability Notes VU#25309, VU#665372, * and VU#565052. * * We don't implement the "arcfour" algorithm in SSH-2 because it doesn't * stir the cipher state before emitting keystream, and hence is likely * to leak data about the key. */ static void *arcfour_make_context(void) { return snew(ArcfourContext); } static void arcfour_free_context(void *handle) { sfree(handle); } static void arcfour_stir(ArcfourContext *ctx) { unsigned char *junk = snewn(1536, unsigned char); memset(junk, 0, 1536); arcfour_block(ctx, junk, 1536); memset(junk, 0, 1536); sfree(junk); } static void arcfour128_key(void *handle, unsigned char *key) { ArcfourContext *ctx = (ArcfourContext *)handle; arcfour_setkey(ctx, key, 16); arcfour_stir(ctx); } static void arcfour256_key(void *handle, unsigned char *key) { ArcfourContext *ctx = (ArcfourContext *)handle; arcfour_setkey(ctx, key, 32); arcfour_stir(ctx); } static void arcfour_iv(void *handle, unsigned char *key) { } const struct ssh2_cipher ssh_arcfour128_ssh2 = { arcfour_make_context, arcfour_free_context, arcfour_iv, arcfour128_key, arcfour_block, arcfour_block, "arcfour128-draft-00@putty.projects.tartarus.org", 1, 128, "Arcfour-128" }; const struct ssh2_cipher ssh_arcfour256_ssh2 = { arcfour_make_context, arcfour_free_context, arcfour_iv, arcfour256_key, arcfour_block, arcfour_block, "arcfour256-draft-00@putty.projects.tartarus.org", 1, 256, "Arcfour-256" }; /* * arcfour256-draft-00@putty.projects.tartarus.org is as-yet untested * against any other implementation, and hence is commented out. */ static const struct ssh2_cipher *const arcfour_list[] = { /* &ssh_arcfour256_ssh2, */ &ssh_arcfour128_ssh2, }; const struct ssh2_ciphers ssh2_arcfour = { sizeof(arcfour_list) / sizeof(*arcfour_list), arcfour_list }; Revision-number: 5634 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2005-04-15T10:11:50.381909Z K 7 svn:log V 45 Add a description of this in case we forget. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/256-colours-match-xterm Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 404 Text-content-md5: b6e2d1854e4108e3ff4927ca50623829 Text-content-sha1: cc5899c2b0a91b7e5976af70eb2b4d94dfaad942 Content-length: 414 PROPS-END SVN���Summary: 256 colour mode does not match xterm's colours exactly Class: semi-bug Priority: low Difficulty: fun Present-in: 0.58 Content-type: text/plain The RGB values of the colours used by the xterm 256 colour sequences are not exactly the same as those used by xterm itself. They probably should be. The 256colres.pl script in the xterm distribution generates the relevant RGB values. Revision-number: 5635 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2005-04-15T10:19:58.070510Z K 7 svn:log V 26 More background for this. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/256-colours-match-xterm Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b6e2d1854e4108e3ff4927ca50623829 Text-delta-base-sha1: cc5899c2b0a91b7e5976af70eb2b4d94dfaad942 Text-content-length: 135 Text-content-md5: dc46aeba65d7cf66a1b9068acf2dc07c Text-content-sha1: 603b8a0cca9815e38917edb1f539ad034f0ebbd8 Content-length: 135 SVN��|v��v (I believe the values we use were originally from xterm; xterm's values probably changed in patch #166, 2002/03/25.) Revision-number: 5636 Prop-content-length: 159 Content-length: 159 K 7 svn:log V 61 Index "Event Log", "system menu", and "context menu" better. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-04-15T13:11:27.955810Z PROPS-END Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d28afb8b4bd18dced1cdadf6573badbd Text-delta-base-sha1: 072df2321dca8b62b17093f1f6386ce48187dfce Text-content-length: 182 Text-content-md5: 745ba5d28aa8dc6caec41ae90aa47227 Text-content-sha1: d5482d11baa6fb6a30e0c83bd7fd9f442d6e199b Content-length: 182 SVN��]n���P~ �xemenu, systemmenu, context \IM{context menu} right mouse button menu \IM{Event Log} Event Log \IM{Event Log} PuTTY Event Log \IM{Event Log} Log, Event Revision-number: 5637 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2005-04-16T11:58:49.001780Z K 7 svn:log V 15 Another report K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4026cddc64a40bbbe3d4e60676bca14a Text-delta-base-sha1: 74543c6e0529d65c8ac4543de5d8945987d46455 Text-content-length: 193 Text-content-md5: 5b8f68d9db46fbb1a748668c00864554 Text-content-sha1: cff1df653f824d26d2036cee13ee10c20a94a150 Content-length: 193 SVN��f )��)�sssix reports so far; the information we've seen indicates that the problem is with older, unpatched versions of XP (one report indicated it went away upon upgrade to SP2) Revision-number: 5638 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2005-04-16T17:41:20.999491Z K 7 svn:log V 78 New debian.phys.hacettepe.edu.tr, mirror99.com Revived signal42.com, ip97.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d76015cc284dbb0c2be47dc18f89ed2a Text-delta-base-sha1: f5dbf215a3a352a60d3f88c6d9ae3743bb0c9469 Text-content-length: 399 Text-content-md5: 36bee7578ade1c8c4833620e0ff39eda Text-content-sha1: f6809a736216205ef191d0d5222933bb9777e331 Content-length: 399 SVN��|Z8I�f�O�K+�O}�4v�I}�[*�I}�O}�U}�I}�ydebian.phys.hacettepe.edu.tr/putty/">debian.phys.hacettepe.edu.tr</a> in Turkeymirror99.com/">putty.mirror99.comwww.ip97.com/mirrors/putty/">ip97.comsignal42.com/mirrors/putty/">signal42.comwww.tprinteractive.com/goldeneye/putty/">tprinteractive.comnobandwidth.net/">putty.nobandwidth.nets.redwire.net/">putty.mirrors.redwire.net Revision-number: 5639 Prop-content-length: 218 Content-length: 218 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-18T08:22:46.740972Z K 7 svn:log V 117 Summary: Canonical hostname (in title bar) uses reverse lookup on Windows Class: semi-bug Fixed-in: r5614 2005-04-08 PROPS-END Node-path: putty-wishlist/data/win-canonical-hostname Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 817 Text-content-md5: 1b51179a996434d28292e6ab7c2f6151 Text-content-sha1: 6c7f3fbee1fb68e2dfec219eab086742c0f54a21 Content-length: 827 PROPS-END SVN���###Summary: Canonical hostname (in title bar) uses reverse lookup on Windows Class: semi-bug Difficulty: fun Absent-in: 0.57 Present-in: 0.58 Fixed-in: r5614 2005-04-08 Content-type: text/x-html-body <p> As a side-effect of <a href="ipv6.html">IPv6 support</a>, on modern versions of Windows, the hostname displayed in the title bar has changed - it is now the result of a forward and reverse lookup, whereas before it was whatever the OS regarded as a "canonical name" (usually the input hostname resolution of CNAMEs/search paths). <p> This seems overenthusiastic, and bugs some people, so it's been reverted to the previous behaviour. <p> The title bar is the main use of the canonical name, so this is largely a cosmetic change. (It may also be used for some other things such as proxy exclusions.) Revision-number: 5640 Prop-content-length: 302 Content-length: 302 K 8 svn:date V 27 2005-04-18T10:01:57.496768Z K 7 svn:log V 201 Recent CTR mode changes stopped OS X PuTTY from compiling, because -Werror objects at various static data items being defined but not used. Ifdef some things out to restore warning-free compilability. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshblowf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c8a50dd0f7bd10fb95f10ddb9ac2e47 Text-delta-base-sha1: 226e4ed71ad5e39e0643ee482ad8a9a35865a5cd Text-content-length: 280 Text-content-md5: 80986b198b555e3e86f536c563149fe4 Text-content-sha1: 760f5e827dd6a0c9c43ba1982e0259815d7a592a Content-length: 280 SVN��4Q<N�r��q�_u�j�7m�E#�qg�.WC�##ifndef ENABLE_BLOWFISH_SSH2_CTR#endif static void blowfish_iv#ifndef ENABLE_BLOWFISH_SSH2_CTR#endif#ifndef ENABLE_BLOWFISH_SSH2_CTR#endif#ifndef ENABLE_BLOWFISH_SSH2_CTR &ssh_blowfish_ssh2_ctr, #endif Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 28a49c1a0dd2aca9b9efbb065180856b Text-delta-base-sha1: 1fc30343c7d240c6a8f1e83a9ff23e4328400fc3 Text-content-length: 132 Text-content-md5: 33a1f9a6d005736c916975a065f03d9f Text-content-sha1: a84cbabbdc5adceb4dee3694206e0e6cd198c20b Content-length: 132 SVN��K]�X��LW�"�{P#ifndef ENABLE_3DES_SSH2_CTR#endif#ifndef ENABLE_3DES_SSH2_CTR &ssh_3des_ssh2_ctr, #endif Revision-number: 5641 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2005-04-18T12:21:53.521371Z K 7 svn:log V 75 Add a comment describing `dummyitem' in prefslist and associated problems. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db5dd872dfb440b79fdac85224e3a743 Text-delta-base-sha1: 7c930915bfdc77cd714cd89e3caf3234326ed51e Text-content-length: 196 Text-content-md5: 4856dad9848ff482ca443442c494d16e Text-content-sha1: c4c2fbce19659ea606e8553027190d8c6ed9cbb8 Content-length: 196 SVN��['�^�'��[/* Add a dummy item to make pl_itemfrompt() work * better. * FIXME: this causes scrollbar glitches if the count of * listbox contains >= its height. */ Revision-number: 5642 Prop-content-length: 322 Content-length: 322 K 7 svn:log V 221 Add ability to construct SSH-1 packets incrementally (not used yet). I've added this to support `terminal-modes', but since this unifies some SSH-1 and SSH-2 packet construction code, it saves a few hundred bytes. Bonus. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-18T21:09:58.781771Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: efc99207e037bd7b5a57db3972e5c993 Text-delta-base-sha1: 54d26acb15489fbd6da2c982dabd18b59e6b51d8 Text-content-length: 7521 Text-content-md5: ae9bba2433eaee4d589d8b8c22e00d20 Text-content-sha1: 4c337ab1e4dd30ca49a83632393700154d5593b9 Content-length: 7521 SVN����EQ�L��Jx�'��o"a�WV�jz�u4�O{�40�c+�H>y�(e�uvl�e,r�fX�BQ�7h�A�rb�tF�z?]�7.a�Hd�"?�|z1_pkt_init(int pkt_type); static struct Packet *ssh2_pkt_init(int pkt_type); static void ssh_pkt_ensure(struct Packet *, int length); static void ssh_pkt_adddata(struct Packet *, void *data, int len); static void ssh_pkt_addbyte(struct Packet *, unsigned char value); static void ssh2_pkt_addbool(struct Packet *, unsigned char value); static void ssh_pkt_adduint32(struct Packet *, unsigned long value); static void ssh_pkt_addstring_start(struct Packet *); static void ssh_pkt_addstring_str(struct Packet *, char *data); static void ssh_pkt_addstring(struct Packet *, char *data); static unsigned char *ssh2_mpint_fmt(Bignum b, int *len); static void ssh1_pkt_addmp(struct Packet *, Bignum b /* length of `data' actually used */ long forcepad; /* SSH-2: force padding to at least this length */ int type; /* only used for incoming packets */ unsigned long sequence; /* SSH-2 incoming sequence number */ unsigned char *data; /* allocated storage */ unsigned char *body; /* offset of payload within `data' */ long savedpos; /* temporary index into `data' (for strings) */ long maxlen; /* amount of storage allocated for `data' */ long encrypted_len; body =int s_wrpkt_prepare(Ssh ssh, struct Packet *pkt, int *offset_p) { int pad, biglen, i, pktoffsif (ssh->logctx) log_packet(ssh->logctx, PKT_OUTGOING, pkt->data[12], ssh1_pkt_type(pkt->data[12]), pkt->body, pkt->length - (pkt->body - pkt->data)data + 12, pkt->length - 12, &compblk, &complen); memcpy(pkt->data + 12, compblk, complen); sfree(compblk); pkt->length = complen + 12; } ssh_pkt_ensure(pkt, pkt->length + 4); /* space for CRC */ pkt->length += 4; len = pkt->length - 4 - 8; /* len(type+data+CRC) */ pad = 8 - (len % 8); pktoffs = 8 - pad; biglen = len + pad; /* len(padding+type+data+CRC) */ for (i = pktoffs; i < 4+8; i++) pkt->data[i] = random_byte(); crc = crc32_compute(pkt->data + pktoffs + 4, biglen - 4); /* all ex len */ PUT_32BIT(pkt->data + pktoffs + 4 + biglen - 4, crc); PUT_32BIT(pkt->data + pktoffs, len); if (ssh->cipher) ssh->cipher->encrypt(ssh->v1_cipher_ctx, pkt->data + pktoffs + 4, biglen); if (offset_p) *offset_p = pktoffs; return biglen + 4; /* len(length+padding+type+data+CRC) */ } static void s_wrpkt(Ssh ssh, struct Packet *pkt) { int len, backlog, offset; len = s_wrpkt_prepare(ssh, pkt, &offset); backlog = sk_write(ssh->s, (char *)pkt->data + offset ssh_free_packet(pkt); } static void s_wrpkt_defer(Ssh ssh, struct Packet *pkt) { int len, offset; len = s_wrpkt_prepare(ssh, pkt, &offse pkt->data + offset, len); ssh->deferred_len += len; ssh_free_packet(pkt); } /* * Construct a SSH-1 packet with the specified contents. * (This all-at-once interface used to be the only one, but now SSH-1 * packets can also be constructed incrementally.) */ static struct Packet *construct_packet(Ssh ssh, int pkttype, va_list ap) { int argtype; Bignum bn; struct Packet *pkt; pkt = ssh1_pkt_init(pkttype); while ((argtype = va_arg(ap, int)) != PKT_END) { unsigned char *argp, argchar; unsigned long argint; int arglen, int); ssh_pkt_adduint32(pkt, argint), int); ssh_pkt_addbyte(pkt, argchar); break; case PKT_DATA: argp = va_arg(ap, unsigned char *); arglen = va_arg(ap, int); ssh_pkt_adddata(pkt, argp, arglen); break; case PKT_STR: argp = va_arg(ap, unsigned char *); ssh_pkt_addstring(pkt, argp); break; case PKT_BIGNUM: bn = va_arg(ap, Bignum); ssh1_pkt_addmp(pkt; va_start(ap, pkttype); pkt = construct_packet(ssh, pkttype, ap); va_end(ap); s_wrpkt(ssh, ; va_start(ap, pkttype); pkt = construct_packet(ssh, pkttype, ap); va_end(ap); s_wrpkt_defer(ssh, Packet construction functions. Mostly shared between SSH-1 and SSH-2. */ static void ssh_pkt_ensure(struct Packet *pkt, int length) { if (pkt->maxlen < length) { unsigned char *body = pkt->body; int offset = body ? pkt->data - body : 0; pkt->maxlen = length + 256; pkt->data = sresize(pkt->data, pkt->maxlen + APIEXTRA, unsigned char); if (body) pkt->body = pkt->data + offset; } } static void sshassert(pkt->body); pkt->blanks[pkt->nblanks-1].offset = pkt->length - (pkt->body - pkt->data)_pkt_ensure(pkt, pkt->length); memcpy(pkt->data + pkt->length - len, data, len); } static void ssh_pkt_addbyte(struct Packet *pkt, unsigned char byte) { ssh_pkt_adddata(pkt, &byte, 1); } static void ssh2_pkt_addbool(struct Packet *pkt, unsigned char value) { ssh_pkt_adddata(pkt, &value, 1); } static void ssh_pkt_adddata(pkt, x, 4); } static void ssh_pkt_addstring_start(struct Packet *pkt) { ssh_pkt_adduint32(pkt, 0); pkt->savedpos = pkt->length; } static void ssh_pkt_addstring_str(struct Packet *pkt, char *data) { ssh_pkt_addstring_data(struct Packet *pkt, char *data, int len) { ssh_pkt_addstring(struct Packet *pkt, char *data) { ssh_pkt_addstring_start(pkt); ssh_pkt_addstring_str(pkt, data); } static void ssh1_pkt_addmp(struct Packet *pkt, Bignum b) { int len = ssh1_bignum_length(b); unsigned char *data = snewn(len, char); (void) ssh1_write_bignum(data, b); ssh_pkt_adddata(pkt, data, len); sfree(_pkt_addstring_start(pkt); ssh_pkt_addstring_data(pkt, (char *)p, len); sfree(p); } static struct Packet *ssh1_pkt_init(int pkt_type) { struct Packet *pkt = ssh_new_packet(); pkt->length = 4 + 8; /* space for length + max padding */ ssh_pkt_addbyte(pkt, pkt_type); pkt->body = pkt->data + pkt->length; return pkt; } /* For legacy code (SSH-1 and -2 packet construction used to be separate) */ #define ssh2_pkt_ensure(pkt, length) ssh_pkt_ensure(pkt, length) #define ssh2_pkt_adddata(pkt, data, len) ssh_pkt_adddata(pkt, data, len) #define ssh2_pkt_addbyte(pkt, byte) ssh_pkt_addbyte(pkt, byte) #define ssh2_pkt_adduint32(pkt, value) ssh_pkt_adduint32(pkt, value) #define ssh2_pkt_addstring_start(pkt) ssh_pkt_addstring_start(pkt) #define ssh2_pkt_addstring_str(pkt, data) ssh_pkt_addstring_str(pkt, data) #define ssh2_pkt_addstring_data(pkt, data, len) ssh_pkt_addstring_data(pkt, data, len) #define ssh2_pkt_addstring(pkt, data) ssh_pkt_addstring(pkt, data) _pkt_addbyte(pkt, (unsigned char) pkt_type); pkt->body = pkt->data + pkt->length; return pktbody, pkt->length - (pkt->body - pkt->data)��� �v�rd */ } else if (pktin->type != SSH1_SMSG_SUCCESS) { bombout(("Bizarre response to RSA authentication response")); crStop(0); } break; /* we're through! */ } else { if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { /* * Defence against traffic analysis: we send a * whole bunch of packets containing strings of * different lengths. One of these string�s} �s�send it. */ s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(s->pktout, "publickey"); /* method */ ssh2_pkt_addbool(s->pktout, TRUE); ssh2_pkt_addstring(s->pktout, key->alg->name); pkblob = key->alg->publ Revision-number: 5643 Prop-content-length: 277 Content-length: 277 K 8 svn:date V 27 2005-04-19T13:27:21.374129Z K 7 svn:log V 176 Remove "none" from the MACs we offer to support in SSH-2. (It was at the end, after the REQUIRED "hmac-sha1".) This has been present since SSH-2 support was introduced (r569). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae9bba2433eaee4d589d8b8c22e00d20 Text-delta-base-sha1: 4c337ab1e4dd30ca49a83632393700154d5593b9 Text-content-length: 989 Text-content-md5: 8e6eba25851949231bd869f50574e66e Text-content-sha1: fe4e9176098745a3903157cb540a6f090099adcf Content-length: 989 SVN����L�� � `?const static struct ssh_mac *macs[] = { &ssh_sha1, &ssh_md5 }; const static struct ssh_mac *buggymacs[] = { &ssh_sha1_buggy, &ssh_md5rd */ } else if (pktin->type != SSH1_SMSG_SUCCESS) { bombout(("Bizarre response to RSA authentication response")); crStop(0); } break; /* we're through! */ } else { if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { /* * Defence against traffic analysis: we send a * whole bunch of packets containing strings of * different lengths. One of these strings is the * password, in a SSH1_CMSG_AUTH_PASSWORD packet. * The others are all random data in * SSH1_MSG_IGNORE packets. This way a passive * listener can't tell which i���@�A?�qw�`asend it. */TRUE); ssh2_pkt_addstring(s->pktout, key->alg->name); pkblob = key->alg->public_blob(key->data, &pkblob_lenkblob, pkblob_len); /* * The data to be s�}>��>? Revision-number: 5644 Prop-content-length: 224 Content-length: 224 K 8 svn:date V 27 2005-04-19T14:23:42.702711Z K 7 svn:log V 123 Summary: Entering wrong SSH-1 key passphrase causes PuTTY crash Class: bug Priority: high Absent-in: 0.57 Present-in: 0.58 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh1-bad-passphrase-crash Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 917 Text-content-md5: c584dd0ef573eb9361ee0d519c2b4f6f Text-content-sha1: 8aee6d857ccf9699803de21ac76aaabc7f29d62c Content-length: 927 PROPS-END SVN���Summary: Entering wrong SSH-1 key passphrase causes PuTTY crash Class: bug Difficulty: fun Priority: high Absent-in: 0.57 Present-in: 0.58 Content-type: text/x-html-body <p> When using public-key authentication in SSH-1, entering an incorrect passphrase in the PuTTY window will cause PuTTY to crash. Correct passphrases or Pageant authentication are fine, as is SSH-2. <p> I believe this is caused by <code>do_ssh1_login()</code> using its argument <code>pktin</code> in the auth loop condition. When prompting for a password in GUI PuTTY, that argument can become <code>NULL</code> due to coroutine mechanics. Prior to 0.58 we didn't use the argument. If so, this was probably introduced around r4898, and won't affect Plink/PSCP/PSFTP. <p> This looks similar to a problem blocking <a href="ssh2-password-expiry.html">`ssh2-password-expiry'</a>, so should probably be looked into at the same time. Revision-number: 5645 Prop-content-length: 120 Content-length: 120 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-19T14:38:11.981192Z K 7 svn:log V 20 A few more reports. PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b8f68d9db46fbb1a748668c00864554 Text-delta-base-sha1: cff1df653f824d26d2036cee13ee10c20a94a150 Text-content-length: 33 Text-content-md5: 44b1efb29ec066735dc4d3c65327cf04 Text-content-sha1: f475f7c6dc096024575834100dfa59c1b2245198 Content-length: 33 SVN��& ���a trickle of Revision-number: 5646 Prop-content-length: 240 Content-length: 240 K 8 svn:date V 27 2005-04-19T18:58:29.115575Z K 7 svn:log V 139 Pull out parsing of ^C style strings from the terminal answerback code to its own function, since I'll be wanting it for `terminal-modes'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 47bbf56d3ef04e975757ed1bcb9d076c Text-delta-base-sha1: d892a95b408fd3194180257baf4fe215b414ff0c Text-content-length: 881 Text-content-md5: b1910254f977c726a24560fa97a35429 Text-content-sha1: 69c30d416fe89ac4e59b910bce4346aa2ff4ee7e Content-length: 881 SVN��.U�@�U�X@�# * Parse a ^C style character specification. * Returns NULL in `next' if we didn't recognise it as a control character, * in which case `c' should be ignored. * The precise current parsing is an oddity inherited from the terminal * answerback-string parsing code. All sequences are two characters, * starting with '^'. The ones that are worth keeping are probably: * ^? 127 * ^@A-Z[\]^_ 0-31 * a-z 1-26 * ~ ^ escape */ char ctrlparse(char *s, char **next) { char c = 0; if (*s != '^') { *next = NULL; return c; } else { s++; if (*s == '\0') { *next = NULL; return c; } else if (*s >= 'a' && *s <= 'z') { c = (*s - ('a' - 1)); } else if ((*s >= '@' && *s <= '_') || *s == '?' || (*s & 0x80)) { c = ('@' ^ *s); } else if (*s == '~') { c = '^'; } s++; *next = s; return c Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 553f6ec07b210ec1f62645bc627071a7 Text-delta-base-sha1: 5bb57eccbb74f432c5a19e26941fcd97be6cd5fb Text-content-length: 56 Text-content-md5: b887abb93e2f62da8c27047196724ab7 Text-content-sha1: a4fc0d15ccf6e1188d3e97165aca9a92b578e563 Content-length: 56 SVN�� 0 #���xchar ctrlparse(char *s, char **next Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f48a8abec35768fe2bed9c7a5b6c1e3d Text-delta-base-sha1: fdb81e5b6c0fbb4e9f9487978d803353cb64ea3e Text-content-length: 457 Text-content-md5: 02df31a7034303260c6b6cb71e3aefb5 Text-content-sha1: 7cf50a93894ae5b99707a0d5580cf2e9b15b6712 Content-length: 457 SVN������U�I7Clenof(term->cfg.answerback)], *s, *d; for (s = term->cfg.answerback, d = abuf; *s;) { char *n; char c = ctrlparse(s, &n); if (n) { *d++ = c; s = n; } else { *d++ = *s++; }ursor(term, TRUE); break; case 'u': /* restore cursor */ save_cursor(term, FALSE); seen_disp_event(term); break; case 't': /* DECSLPP: set page size - ie window �Y��C Revision-number: 5647 Prop-content-length: 273 Content-length: 273 K 7 svn:log V 172 Invent a way of specifying control characters numerically in ctrlparse(): ^<27>, ^<0x1B>, ^<033>. (This doesn't tread on any syntax that already had a non-null behaviour.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-19T19:18:14.463298Z PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b1910254f977c726a24560fa97a35429 Text-delta-base-sha1: 69c30d416fe89ac4e59b910bce4346aa2ff4ee7e Text-content-length: 666 Text-content-md5: 6e30d32bbb2b60141db538bb9ac93883 Text-content-sha1: 125aee50c8e1a6970400b2cf40295484770d1926 Content-length: 666 SVN�� q�[�\�un.�\ug�C@�*fstart with ^; all except * ^<123> are two characters. The ones that are worth keeping are probably: * ^? 127 * ^@A-Z[\]^_ 0-31 * a-z 1-26 * <num> specified by number (decimal, 0octal, 0xHEX) } else { s++; if (*s == '\0') { *next = NULL; } else if (*s == '<') { s++; c = (char)strtol(s, next, 0); if ((*next == s) || (**next != '>')) { c = 0; *next = NULL; } else (*next)++; } else if (*s >= 'a' && *s <= 'z') { c = (*s - ('a' - 1)); *next = s+1 *next = s+1; } else if (*s == '~') { c = '^'; *next = s+1; } } return c; } /* Revision-number: 5648 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 25 putty.spijoprod.net (fr) K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-20T18:48:21.137332Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 36bee7578ade1c8c4833620e0ff39eda Text-delta-base-sha1: f6809a736216205ef191d0d5222933bb9777e331 Text-content-length: 99 Text-content-md5: 1c454d2e6aacc30175f7722b76a1026d Text-content-sha1: a507f444066e4e5f885bf3f1844d77912be9a05d Content-length: 99 SVN��ZL K��K�yaputty.spijoprod.net/">putty.spijoprod.net</a> in France<!--MIRRORSTATUS-->. Revision-number: 5649 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2005-04-20T20:57:00.673319Z K 7 svn:log V 120 Enable arcfour256-draft-00@putty.projects.tartarus.org, since I've now tested it against an independent implementation. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssharcf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 77c401f24509e333f13bab2831ed77bf Text-delta-base-sha1: ca033b85b72e5a49ab4fe4e43e7d28446541b3a3 Text-content-length: 105 Text-content-md5: 7a592a42c10707516a1997112336ce5f Text-content-sha1: 6a71117abf28c1b8a9852526f55d50bfe96a2e64 Content-length: 105 SVN��SB S�_�S�Cstatic const struct ssh2_cipher *const arcfour_list[] = { &ssh_arcfour256_ssh2, Revision-number: 5650 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2005-04-20T21:29:57.126069Z K 7 svn:log V 44 Minimally document our support of aes*-ctr. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0dc2ed91ceec5044ae033ae3d840450d Text-delta-base-sha1: 25dc83c6b9fb4cc83ab879eec1fafd3ba5eac466 Text-content-length: 56 Text-content-md5: bbb11b078f2738a6d7915fca86c7b8ae Text-content-sha1: 7ae64db5c18e37e7e3f24d5c78d40bde3f5414c1 Content-length: 56 SVN���� �'��Q&SDCTR or�  � �ou should Revision-number: 5651 Prop-content-length: 220 Content-length: 220 K 8 svn:date V 27 2005-04-20T22:47:29.879568Z K 7 svn:log V 121 Simon (accidentally, I think) enabled 3des-ctr and blowfish-ctr. Turn them back off again since they're still untested. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshblowf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 80986b198b555e3e86f536c563149fe4 Text-delta-base-sha1: 760f5e827dd6a0c9c43ba1982e0259815d7a592a Text-content-length: 42 Text-content-md5: 6d13004608b354e93008ecf92bc84c32 Text-content-sha1: c86269bcbf08c26bcdb67e73c31b8a87bf17ff74 Content-length: 42 SVN��QM��u��#v�!�D<�P Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 33a1f9a6d005736c916975a065f03d9f Text-delta-base-sha1: a84cbabbdc5adceb4dee3694206e0e6cd198c20b Text-content-length: 30 Text-content-md5: 99255c85afe6b186baa6ba1d79aeb95c Text-content-sha1: b49d1ed5b8dc4d92b59d200699ef703b2cd2dd65 Content-length: 30 SVN����[��\�2^ Revision-number: 5652 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2005-04-20T22:52:54.459343Z K 7 svn:log V 106 Ifdef out the actual code supporting 3des-ctr and blowfish-ctr, since GCC now notices that it isn't used. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshblowf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d13004608b354e93008ecf92bc84c32 Text-delta-base-sha1: c86269bcbf08c26bcdb67e73c31b8a87bf17ff74 Text-content-length: 69 Text-content-md5: b163ef96aa6bac837fadb0653c1dd86b Text-content-sha1: 919a435c211cb42c125a8201fbf697f02105e49e Content-length: 69 SVN��Mt%�^��-]�D #ifdef ENABLE_BLOWFISH_SSH2_CTR#endif Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99255c85afe6b186baa6ba1d79aeb95c Text-delta-base-sha1: b49d1ed5b8dc4d92b59d200699ef703b2cd2dd65 Text-content-length: 170 Text-content-md5: af0102a253c467d94da434578cee7d8e Text-content-sha1: 99a7653624e6bd4e855daa5c6b9e31c8cb0fd922 Content-length: 170 SVN��T }�7��Z6�M�d?�y#ifdef ENABLE_3DES_SSH2_CTR#endif#ifdef ENABLE_3DES_SSH2_CTR static void des3_ssh2_sdctrsdctr3(blk, blk, len, keys); } #endif Revision-number: 5653 Prop-content-length: 428 Content-length: 428 K 8 svn:date V 27 2005-04-21T13:57:08.088455Z K 7 svn:log V 327 First crack at `terminal-modes' in SSH. PuTTY now sends ERASE by default, Unix Plink sends everything sensible it can find, and it's fully configurable from the GUI. I'm not entirely sure about the precise set of modes that Unix Plink should look at; informed tweaks are welcome. Also the Mac bits are guesses (but trivial). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c48d9b11fa236ced6b64f4ef3237bf82 Text-delta-base-sha1: 22d347be1145fec90c6d0fa7e1ae3fc21e79a402 Text-content-length: 4695 Text-content-md5: d71b95431bb5bdc585387d80bf8cb0b9 Text-content-sha1: 7d5b425223eeac8f98c41a0d59d2821c64c4bd51 Content-length: 4695 SVN��S0D��(�R}.�f[�l�)c�_#�l3�B�=� Fttymodes_data { union control *modelist, *valradio, *valbox; union control *addbutton, *rembutton, *listbox; }; static void ttymodes_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; struct ttymodes_data *td = (struct ttymodetd->listbox) { char *p = cfg->ttymodes; dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); while (*p) { int tabpos = strchr(p, '\t') - p; char *disp = dupprintf("%.*s\t%s", tabpos, p, (p[tabpos+1] == 'A') ? "(auto)" : p+tabpos+2); dlg_listbox_add(ctrl, dlg, disp); p += strlen(p) + 1; sfree(disp); } dlg_update_done(ctrl, dlg); } else if (ctrl == td->modelistttymodes[i]; i++) dlg_listbox_add(ctrl, dlg, ttymodes[i]); dlg_listbox_select(ctrl, dlg, 0); /* *shrug* */ dlg_update_done(ctrl, dlg); } else if (ctrl == td->valradio) { dlg_radiobutton_set(ctrl, dlg, 0); } } else if (event == EVENT_ACTION) { if (ctrl == td->addbutton) { int ind = dlg_listbox_index(td->modelist, dlg); if (ind >= 0) { char type = dlg_radiobutton_get(td->valradio, dlg) ? 'V' : 'A'; int slen, left; char *p, str[lenof(cfg->ttymodes)]; /* Construct new entry */ memset(str, 0, lenof(str)); strncpy(str, ttymodes[ind], lenof(str)-3); slen = strlen(str); str[slen] = '\t'; str[slen+1] = type; slen += 2; if (type == 'V') { dlg_editbox_get(td->valbox, dlg, str+slen, lenof(str)-slen); } /* Find end of list, deleting any existing instance */ p = cfg->ttymodes; left = lenof(cfg->ttymodes); while (*p) { int t = strchr(p, '\t') - p; if (t == strlen(ttymodes[ind]) && strncmp(p, ttymodes[ind], t) == 0) { memmove(p, p+strlen(p)+1, left - (strlen(p)+1)); continue; } left -= strlen(p) + 1; p += strlen(p) + 1; } /* Append new entry */ memset(p, 0, left); strncpy(p, str, left - 2); dlg_refresh(td->listbox, dlg); } else dlg_beep(dlg); } else if (ctrl == td->rembutton) { char *p = cfg->ttymodes; int i = 0, len = lenof(cfg->ttymodes); while (*p) { if (dlg_listbox_issel(td->listbox, dlg, i)) { memmove(p, p+strlen(p)+1, len - (strlen(p)+1)); i++; continue; } len -= strlen(p) + 1; p += strlen(p) + 1; i++; } memset(p, 0, lenof(cfg->ttymodes) - len); dlg_refresh(td->listbox, dlg); }ttymodes_data *tTTY panel. */ ctrl_settitle(b, "Connection/SSH/TTY", "Remote terminal settings"); s = ctrl_getset(b, "Connection/SSH/TTY", "sshtty", NULL s = ctrl_getset(b, "Connection/SSH/TTY", "ttymodes", "Terminal modes"); td = (struct ttymodes_data *) ctrl_alloc(b, sizeof(struct ttymodes_data)); ctrl_columns(s, 2, 75, 25); c = ctrl_text(s, "Terminal modes to send:", HELPCTX(ssh_ttymodes)); c->generic.column = 0; tssh_ttymodes), ttymodes_handler, P(td)); td->rembutton->generic.column = 1; td->rembutton->generic.tabdelay = 1; ctrl_columns(s, 1, 100); td->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT, HELPCTX(ssh_ttymodes), ttymodes_handler, P(td)); td->listbox->listbox.multisel = 1; td->listbox->listbox.height = 4; td->listbox->listbox.ncols = 2; td->listbox->listbox.percentages = snewn(2, int); td->listbox->listbox.percentages[0] = 40; td->listbox->listbox.percentages[1] = 60; ctrl_tabdelay(s, td->rembutton); ctrl_columns(s, 2, 75, 25); td->modelist = ctrl_droplist(s, "Mode:", 'm', 67, HELPCTX(ssh_ttymodes), ttymodes_handler, P(td)); td->modelist->generic.column = 0; td->addbutton = ctrl_pushbutton(s, "Add", 'd', HELPCTX(ssh_ttymodes), ttymodes_handler, P(td)); td->addbutton->generic.column = 1; td->addbutton->generic.tabdelay = 1; ctrl_columns(s, 1, 100); /* column break */ /* Bit of a hack to get the value radio buttons and * edit-box on the same row. */ ctrl_columns(s, 3, 25, 50, 25); c = ctrl_text(s, "Value:", HELPCTX(ssh_ttymodes)); c->generic.column = 0; td->valradio = ctrl_radiobuttons(s, NULL, NO_SHORTCUT, 2, HELPCTX(ssh_ttymodes), ttymodes_handler, P(td), "Auto", NO_SHORTCUT, P(NULL), "This:", NO_SHORTCUT, P(NULL), NULL); td->valradio->generic.column = 1; td->valbox = ctrl_editbox(s, NULL, NO_SHORTCUT, 100, HELPCTX(ssh_ttymodes), ttymodes_handler, P(td), P(NULL)); td->valbox->generic.column = 2; ctrl_tabdelay(s, td->addbutton); Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bbb11b078f2738a6d7915fca86c7b8ae Text-delta-base-sha1: 7ae64db5c18e37e7e3f24d5c78d40bde3f5414c1 Text-content-length: 6464 Text-content-md5: ce8452c6770bd3b44a63578682ef30bd Text-content-sha1: a7243ef1ffac5268d3951f6f532e840a2e2234c8 Content-length: 6464 SVN����&Q��V�x�)�UUO�1 'over SSH, PuTTY by default tells the server the value of this option (see \k{config-ttymodes}), so you may find that the Backspace key does the right thing either way. Similarly, if you are connecting to a \i{Unix}againtty} The TTY panel The TTY panel lets you configure the remote pseudo-terminalttymodes} Sending \i{terminal modes} \cfg{winhelp-topic}{ssh.ttymodes} The SSH protocol allows the client to send \q{terminal modes} for the remote pseudo-terminal. These usually control the server's expectation of the local terminal's behaviour. If your server does not have sensible defaults for these modes, you may find that changing them here helps. If you don't understand any of this, it's safe to leave these settings alone. (None of these settings will have any effect if no pseudo-terminal is requested or allocated.) You can add or modify a mode by selecting it from the drop-down list, choosing whether it's set automatically or to a specific value with the radio buttons and edit box, and hitting \q{Add}. A mode (or several) can be removed from the list by selecting them and hitting \q{Remove}. The effect of the mode list is as follows: \b If a mode is not on the list, it will not be specified to the server under any circumstances. \b If a mode is on the list: \lcont{ \b If the \q{Auto} option is selected, the PuTTY tools will decide whether to specify that mode to the server, and if so, will send a sensible value. \lcont{ PuTTY proper will send modes that it has an opinion on (currently only the code for the Backspace key, \cw{ERASE}). Plink on Unix will propagate appropriate modes from the local terminal, if any. } \b If a value is specified, it will be sent to the server under all circumstances. The precise syntax of the value box depends on the mode. } By default, all of the available modes are listed as \q{Auto}, which should do the right thing in most circumstances. The precise effect of each setting, if any, is up to the server. Their names come from \i{POSIX} and other Unix systems, and they are most likely to have a useful effect on such systems. (These are the same settings that can usually be changed using the \i\c{stty} command once logged in to such servers.) Some notable modes are described below; for fuller explanations, see your server documentation. \b \I{ERASE special character}\cw{ERASE} is the character that when typed by the user will delete one space to the left. When set to \q{Auto} (the default setting), this follows the setting of the local Backspace key in PuTTY (see \k{config-backspace}). \lcont{ This and other \i{special character}s are specified using \c{^C} notation for Ctrl-C, and so on. Use \c{^<27>} or \c{^<0x1B>} to specify a character numerically, and \c{^~} to get a lit�=))��eral \c{^}. Other non-control characters are denoted by themselves. Leaving the box entirely blank indicates that \e{no} character should be assigned to the specified function, although this may not be supported by all servers. } \b \I{QUIT special character}\cw{QUIT} is a special character that usually forcefully ends the current process on the server (\cw{SIGQUIT}). On many servers its default setting is Ctrl-backslash (\c{^\\}), which is easy to accidentally invoke on many keyboards. If this is getting in your way, you may want to change it to another character or turn it off entirely. \b Boolean modes such as \cw{ECHO} and \cw{ICANON} can be specified in PuTTY in a variety of ways, such as \cw{true}/\cw{false}, \cw{yes}/\cw{no}, and \cw{0}/\cw{1}. \b Terminal speeds are configured elsewhere; see \k{config-termspeed}. \H{config-ssh-x11} The X11 panel \cfg{winhelp-topic}{ssh.tunnels.x11} The X11 panel allows you to configure \i{forwarding of X11} over an SSH connection. If your server lets you run X Window System applications, X11 forwarding allows you to securely give those applications access to a local X display on your PC. To enable X11 forwarding, check the \q{Enable X11 forwarding} box. If your X display is somewhere unusual, you will need to enter its location in the \q{X display location} box; if this is left blank, PuTTY will try to find a sensible default in the environment, or use the primary local display (\c{:0}) if that fails. See \k{using-x-forwarding} for more information about X11 forwarding. \S{config-ssh-x11auth} Remote \i{X11 authentication} \cfg{winhelp-topic}{ssh.tunnels.x11auth} If you are using X11 forwarding, the virtual X server created on the SSH server machine will be protected by authorisation data. This data is invented, and checked, by PuTTY. The usual authorisation method used for this is called \i\cw{MIT-MAGIC-COOKIE-1}. This is a simple password-style protocol: the X client sends some cookie data to the server, and the server checks that it matches the real cookie. The cookie data is sent over an unencrypted X11 connection; so if you allow a client on a third machine to access the virtual X server, then the cookie will be sent in the clear. PuTTY offers the alternative protocol \i\cw{XDM-AUTHORIZATION-1}. This is a cryptographically authenticated protocol: the data sent by the X client is different every time, and it depends on the IP address and port of the client's end of the connection and is also stamped with the current time. So an eavesdropper who captures an \cw{XDM-AUTHORIZATION-1} string cannot immediately re-use it for their own X connection. PuTTY's support for \cw{XDM-AUTHORIZATION-1} is a somewhat experimental feature, and may encounter several problems: \b Some X clients probably do not even support \cw{XDM-AUTHORIZATION-1}, so they will not know what to do with the data PuTTY has provided. \b This authentication mechanism will only work in SSH-2. In SSH-1, the SSH server does not tell the client the source address of a forwarded connection in a machine-readable format, so it's impossible to verify the \cw{XDM-AUTHORIZATION-1} data. \b You may find this feature causes problems with some SSH servers, which will not clean up \cw{XDM-AUTHORIZATION-1} data after a session, so that if you then connect to the same server using a client which only does \cw{MIT-MAGIC-COOKIE-1} and are allocated the same remote display number, you might find that out-of-date authentication data is still present on your server and your X connections fail. PuTTY's default is \cw{MIT-MAGIC-COOKIE-1}. If you change it, y Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 745ba5d28aa8dc6caec41ae90aa47227 Text-delta-base-sha1: d5482d11baa6fb6a30e0c83bd7fd9f442d6e199b Text-content-length: 256 Text-content-md5: e43ac4397ca72a78c8a99e5e6422c9e5 Text-content-sha1: dd14b571f3b243882d49661ae51615abc9e4a1f1 Content-length: 256 SVN��nY e�(�e�L"ERASE special character} \cw{ERASE}, special character \IM{ERASE special character} \cw{VERASE}, special character \IM{QUIT special character} \cw{QUIT}, special character \IM{QUIT special character} \cw{VQUIT}, special character Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fedf9db8a0d36ee624dbcf1ce5a97861 Text-delta-base-sha1: dfebab035c9b46a21b131a6432777908a8a1e77b Text-content-length: 150 Text-content-md5: 7e4281ecd536a5f77be5ace5e2780a85 Text-content-sha1: 7d87832f75bba70705a8c25f1378a1982fc2c286 Content-length: 150 SVN��uu |�^�|�Zchar *get_ttymode(void *frontend, const char *mode) { Session *s = frontend; return term_get_ttymode(s->term, mode); Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 157c9b63939be61421367ce8428cd3c4 Text-delta-base-sha1: 035514152d135756f1c6efe970a062c9f988ffa3 Text-content-length: 202 Text-content-md5: 0f90420ad379fb90b6671837dbc91aa1 Text-content-sha1: 4e87dfd5012f3ee3c8458bea6fb9bc8ed7ce25bb Content-length: 202 SVN��A.�2�.�a.char *get_ttymode(void *frontend, const char *mode) { SessionWindow *win = (SessionWindow *)ctx; Terminal *term = [win term]; return term_get_ttymode(term, mode); Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0fcdcf090a2bcf646faf3c558a9cc0c6 Text-delta-base-sha1: ac6eeb902290cb98e0465e1176bcd0dc3c246f69 Text-content-length: 363 Text-content-md5: 666d94268ab95ce67bb1cdf9d107f726 Text-content-sha1: d7c93d217ed296384e437557b0d4b3d02d4d767e Content-length: 363 SVN��W =����w.�F�5Qxtern const char *const ttymodes[]ttymodes[768]; /* MODE\tVvalue\0MODE\tA\0\0 *//* Get a sensible value for a tty mode. NULL return = don't set. * Otherwise, returned value should be freed by caller. */ char *get_ttymode(void *frontend, const char *modechar *term_get_ttymode(Terminal *term, const char *mode Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a6f60ecf922a46318ecfd89f4c57122d Text-delta-base-sha1: 77754190e6a59abe5b2050fc45d24fa8792cc530 Text-content-length: 1455 Text-content-md5: 761409e63cef78bfbee40c405e128b72 Text-content-sha1: 7571e45dd14916869c67cd8bbb1f7edb2fc43500 Content-length: 1455 SVN��We�t��goF�S �w`/* * All the terminal modes that we know about for the "TerminalModes" * setting. (Also used by config.c for the drop-down list.) * This is currently precisely the same as the set in ssh.c, but could * in principle differ if other backends started to support tty modes * (e.g., the pty backend). */ const char *const ttymodes[] = { "INTR", "QUIT", "ERASE", "KILL", "EOF", "EOL", "EOL2", "START", "STOP", "SUSP", "DSUSP", "REPRINT", "WERASE", "LNEXT", "FLUSH", "SWTCH", "STATUS", "DISCARD", "IGNPAR", "PARMRK", "INPCK", "ISTRIP", "INLCR", "IGNCR", "ICRNL", "IUCLC", "IXON", "IXANY", "IXOFF", "IMAXBEL", "ISIG", "ICANON", "XCASE", "ECHO", "ECHOE", "ECHOK", "ECHONL", "NOFLSH", "TOSTOP", "IEXTEN", "ECHOCTL", "ECHOKE", "PENDIN", "OPOST", "OLCUC", "ONLCR", "OCRNL", "ONOCR", "ONLRET", "CS7", "CS8", "PARENB", "PARODD", NULL wmap(sesskey, "TerminalModes", cfg->ttymodes, lenof(cfg->ttymodes) { /* This hardcodes a big set of defaults in any new saved * sessions. Let's hope we don't change our mind. */ int i; char *def = dupstr(""); /* Default: all set to "auto" */ for (i = 0; ttymodes[i]; i++) { char *def2 = dupprintf("%s%s=A,", def, ttymodes[i]); sfree(def); def = def2; } gppmap(sesskey, "TerminalModes", def, cfg->ttymodes, lenof(cfg->ttymodes)); sfree(def); } Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e6eba25851949231bd869f50574e66e Text-delta-base-sha1: fe4e9176098745a3903157cb540a6f090099adcf Text-content-length: 15448 Text-content-md5: d90312a2a75d373583d1233d62c3a780 Text-content-sha1: 15e2d1e08e8b19493b6a93ba3c39b1dcafa50890 Content-length: 15448 SVN����t�X�e� V�(^/* * Codes for terminal modes. * Most of these are the same in SSH-1 and SSH-2. * This list is derived from draft-ietf-secsh-connect-25 and * SSH-1 RFC-1.2.31. */ static const struct { const char* const mode; int opcode; enum { TTY_OP_CHAR, TTY_OP_BOOL } type; } ssh_ttymodes[] = { /* "V" prefix discarded for special characters relative to SSH specs */ { "INTR", 1, TTY_OP_CHAR }, { "QUIT", 2, TTY_OP_CHAR }, { "ERASE", 3, TTY_OP_CHAR }, { "KILL", 4, TTY_OP_CHAR }, { "EOF", 5, TTY_OP_CHAR }, { "EOL", 6, TTY_OP_CHAR }, { "EOL2", 7, TTY_OP_CHAR }, { "START", 8, TTY_OP_CHAR }, { "STOP", 9, TTY_OP_CHAR }, { "SUSP", 10, TTY_OP_CHAR }, { "DSUSP", 11, TTY_OP_CHAR }, { "REPRINT", 12, TTY_OP_CHAR }, { "WERASE", 13, TTY_OP_CHAR }, { "LNEXT", 14, TTY_OP_CHAR }, { "FLUSH", 15, TTY_OP_CHAR }, { "SWTCH", 16, TTY_OP_CHAR }, { "STATUS", 17, TTY_OP_CHAR }, { "DISCARD", 18, TTY_OP_CHAR }, { "IGNPAR", 30, TTY_OP_BOOL }, { "PARMRK", 31, TTY_OP_BOOL }, { "INPCK", 32, TTY_OP_BOOL }, { "ISTRIP", 33, TTY_OP_BOOL }, { "INLCR", 34, TTY_OP_BOOL }, { "IGNCR", 35, TTY_OP_BOOL }, { "ICRNL", 36, TTY_OP_BOOL }, { "IUCLC", 37, TTY_OP_BOOL }, { "IXON", 38, TTY_OP_BOOL }, { "IXANY", 39, TTY_OP_BOOL }, { "IXOFF", 40, TTY_OP_BOOL }, { "IMAXBEL", 41, TTY_OP_BOOL }, { "ISIG", 50, TTY_OP_BOOL }, { "ICANON", 51, TTY_OP_BOOL }, { "XCASE", 52, TTY_OP_BOOL }, { "ECHO", 53, TTY_OP_BOOL }, { "ECHOE", 54, TTY_OP_BOOL }, { "ECHOK", 55, TTY_OP_BOOL }, { "ECHONL", 56, TTY_OP_BOOL }, { "NOFLSH", 57, TTY_OP_BOOL }, { "TOSTOP", 58, TTY_OP_BOOL }, { "IEXTEN", 59, TTY_OP_BOOL }, { "ECHOCTL", 60, TTY_OP_BOOL }, { "ECHOKE", 61, TTY_OP_BOOL }, { "PENDIN", 62, TTY_OP_BOOL }, /* XXX is this a real mode? */ { "OPOST", 70, TTY_OP_BOOL }, { "OLCUC", 71, TTY_OP_BOOL }, { "ONLCR", 72, TTY_OP_BOOL }, { "OCRNL", 73, TTY_OP_BOOL }, { "ONOCR", 74, TTY_OP_BOOL }, { "ONLRET", 75, TTY_OP_BOOL }, { "CS7", 90, TTY_OP_BOOL }, { "CS8", 91, TTY_OP_BOOL }, { "PARENB", 92, TTY_OP_BOOL }, { "PARODD", 93, TTY_OP_BOOL } }; /* Miscellaneous other tty-related constants. */ #define SSH_TTY_OP_END 0 /* The opcodes for ISPEED/OSPEED differ between SSH-1 and SSH-2. */ #define SSH1_TTY_OP_ISPEED 192 #define SSH1_TTY_OP_OSPEED 193 #define SSH2_TTY_OP_ISPEED 128 #define SSH2_TTY_OP_OSPEED 129 /* Helper functions for parsing tty-related config. */ static unsigned int ssh_tty_parse_specchar(char *s) { unsigned int ret; if (*s) { char *next = NULL; ret = ctrlparse(s, &next); if (!next) ret = s[0]; } else { ret = 255; /* special value meaning "don't set" */ } return ret; } static unsigned int ssh_tty_parse_boolean(char *s) { if (stricmp(s, "yes") == 0 || stricmp(s, "on") == 0 || stricmp(s, "true") == 0 || stricmp(s, "+") == 0) return 1; /* true */ else if (stricmp(s, "no") == 0 || stricmp(s, "off") == 0 || stricmp(s, "false") == 0 || stricmp(s, "-") == 0) return 0; /* false */ else return (atoi(s) != 0); }/* Helper function for common bits of parsing cfg.ttymodes. */ static void parse_ttymodes(Ssh ssh, char *modes, void (*do_mode)(void *data, char *mode, char *val), void *data) { while (*modes) { char *t = strchr(modes, '\t'); char *m = snewn(t-modes+1, char); char *val; strncpy(m, modes, t-modes); m[t-modes] = '\0'; if (*(t+1) == 'A') val = get_ttymode(ssh->frontend, m); else val = dupstr(t+2); if (val) do_mode(data, m, val); sfree(m); sfree(val); modes += strlen(modes) + 1; }���,lz�(�S�P&� t>�x[N�Mmpt, "Passphrase for key \"%.100s\": ", comment); sfree(comment); } /* * Show password prompt, having first obtained it via a TIS * or CryptoCard exchange if we're doing TIS or CryptoCard * authentication. */ if (ssh_get_line) { if (!ssh_get_line(s->prompt, s->password, sizeof(s->password), TRUE)) { /* * get_line failed to get a password (for example * because one was supplied on the command line * which has already failed to work). Terminate. */ send_packet(ssh, SSH1_MSG_DISCONNECT, PKT_STR, "No more passwords available to try", PKT_END); logevent("Unable to authenticate"); connection_fatal(ssh->frontend, "Unable to authenticate"); ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); crStop(1); } } else { /* Prompt may have come from server. We've munged it a bit, so * we know it to be zero-terminated at least once. */ int ret; /* need not be saved over crReturn */ c_write_untrusted(ssh, s->prompt, strlen(s->prompt)); s->pos = 0; setup_userpass_input(ssh, s->password, sizeof(s->password), 0); do { crWaitUntil(!pktin); ret = process_userpass_input(ssh, in, inlen); } while (ret == 0); if (ret < 0) cleanup_exit(0); c_write_str(ssh, "\r\n"); } tryauth: if (s->pwpkt_type == SSH1_CMSG_AUTH_RSA) { /* * Try public key authentication with the specified * key file. */ s->tried_publickey = 1; { const char *error = NULL; int ret = loadrsakey(&ssh->cfg.keyfile, &s->key, s->password, &error); if (ret == 0) { c_write_str(ssh, "Couldn't load private key from "); c_write_str(ssh, filename_to_str(&ssh->cfg.keyfile)); c_write_str(ssh, " ("); c_write_str(ssh, error); c_write_str(ssh, ").\r\n"); continue; /* go and try password */ } if (ret == -1) { c_write_str(ssh, "Wrong passphrase.\r\n"); s->tried_publickey = 0; continue; /* try again */ } } /* * Send a public key attempt. */ send_packet(ssh, SSH1_CMSG_AUTH_RSA, PKT_BIGNUM, s->key.modulus, PKT_END); crWaitUntil(pktin); if (pktin->type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused our public key.\r\n"); continue; /* go and try password */ } if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) { bombout(("Bizarre response to offer of public key")); crStop(0); } { int i; unsigned char buffer[32]; Bignum challenge, response; if ((challenge = ssh1_pkt_getmp(pktin)) == NULL) { bombout(("Server's RSA challenge was badly formatted")); crStop(0); } response = rsadecrypt(challenge, &s->key); freebn(s->key.private_exponent);/* burn the evidence */ for (i = 0; i < 32; i++) { buffer[i] = bignum_byte(response, 31 - i); } MD5Init(&md5c); MD5Update(&md5c, buffer, 32); MD5Update(&md5c, s->session_id, 16); MD5Final(buffer, &md5c); send_packet(ssh, SSH1_CMSG_AUTH_RSA_RESPONSE, PKT_DATA, buffer, 16, PKT_END); freebn(challenge); freebn(response); } crWaitUntil(pktin); if (pktin->type == SSH1_SMSG_FAILURE) { if (flags & FLAG_VERBOSE) c_write_str(ssh, "Failed to authenticate with" " our public key.\r\n"); continue; /* go and try password */ } else if (pktin->type != SSH1_SMSG_SUCCESS) { bombout(("Bizarre response to RSA authentication response")); crStop(0); } break; /* we're through! */ } else { if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { /* * Defence against traffic analysis: we send a * whole bunch of packets containing strings of * different lengths. One of these strings is the * password, in a SSH1_CMSG_AUTH_PASSWORD packet. * The others are all random data in * SSH1_MSG_IGNORE packets. This way a passive * listener can't tell which i/* Helper function to deal with sending tty modes for REQUEST_PTY */ static void ssh1_send_ttymode(void *data, char *mode, char *val) { struct Packet *pktout = (struct Packet *)data; int i = 0; unsigned int arg = 0; while (strcmp(mode, ssh_ttymodes[i].mode) != 0) i++; if (i == lenof(ssh_ttymodes)) return; switch (ssh_ttymodes[i].type) { case TTY_OP_CHAR: arg = ssh_tty_parse_specchar(val); break; case TTY_OP_BOOL: arg = ssh_tty_parse_boolean(val); break; } ssh2_pkt_addbyte(pktout, ssh_ttymodes[i].opcode); ssh2_pkt_addbyte(pktout, arg); } struct Packet *pkt;pkt = ssh1_pkt_init(SSH1_CMSG_REQUEST_PTY); ssh_pkt_addstring(pkt, ssh->cfg.termtype); ssh_pkt_adduint32(pkt, ssh->term_height); ssh_pkt_adduint32(pkt, ssh->term_width); ssh_pkt_adduint32(pkt, 0); /* width in pixels */ ssh_pkt_adduint32(pkt, 0); /* height in pixels */ parse_ttymodes(ssh, ssh->cfg.ttymodes, ssh1_send_ttymode, (void *)pkt); ssh_pkt_addbyte(pkt, SSH1_TTY_OP_ISPEED); ssh_pkt_adduint32(pkt, ssh->ispeed); ssh_pkt_addbyte(pkt, SSH1_TTY_OP_OSPEED); ssh_pkt_adduint32(pkt, ssh->ospeed); ssh_pkt_addbyte(pkt, SSH_TTY_OP_END); s_wrpkt(ssh, pkt Helper function to deal with sending tty modes for "pty-req" */ static void ssh2_send_ttymode(void *data, char *mode, char *val) { struct Packet *pktout = (struct Packet *)data; int i = 0; unsigned int arg = 0; while (strcmp(mode, ssh_ttymodes[i].mode) != 0) i++; if (i == lenof(ssh_ttymodes)) return; switch (ssh_ttymodes[i].type) { case TTY_OP_CHAR: arg = ssh_tty_parse_specchar(val); break; case TTY_OP_BOOL: arg = ssh_tty_parse_boolean(val); break; } ssh2_pkt_addbyte(pktout, ssh_ttymodes[i].opcode); ssh2_pkt_adduint32(pktout, arg);�>�5�g�b\ s->gotit = TRUE; logevent("Keyboard-interactive authentication refused"); s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET; s->kbd_inter_refused = TRUE; /* don't try it again */ continue; } c_write_str(ssh, "Using keyboard-interactive authentication.\r\n"); s->kbd_inter_running = TRUE; s->curr_prompt = 0; } if (s->kbd_inter_running) { s->method = AUTH_KEYBOARD_INTERACTIVE; s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE; ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh->pkt_ctx |= SSH2_PKTCTX_KBDINTER; if (s->curr_prompt == 0) { /* * We've got a fresh USERAUTH_INFO_REQUEST. * Display header data, and start going through * the prompts. */ char *name, *inst, *lang; int name_len, inst_len, lang_len; ssh_pkt_getstring(pktin, &name, &name_len); ssh_pkt_getstring(pktin, &inst, &inst_len); ssh_pkt_getstring(pktin, &lang, &lang_len); if (name_len > 0) { c_write_untrusted(ssh, name, name_len); c_write_str(ssh, "\r\n"); } if (inst_len > 0) { c_write_untrusted(ssh, inst, inst_len); c_write_str(ssh, "\r\n"); } s->num_prompts = ssh_pkt_getuint32(pktin); } /* * If there are prompts remaining in the packet, * display one and get a response. */ if (s->curr_prompt < s->num_prompts) { char *prompt; int prompt_len; ssh_pkt_getstring(pktin, &prompt, &prompt_len); if (prompt_len > 0) { static const char trunc[] = "<prompt truncated>: "; static const int prlen = sizeof(s->pwprompt) - lenof(trunc); if (prompt_len > prlen) { memcpy(s->pwprompt, prompt, prlen); strcpy(s->pwprompt + prlen, trunc); } else { memcpy(s->pwprompt, prompt, prompt_len); s->pwprompt[prompt_len] = '\0'; } } else { strcpy(s->pwprompt, "<server failed to send prompt>: "); } s->echo = ssh2_pkt_getbool(pktin); s->need_pw = TRUE; } else s->need_pw = FALSE; } if (!s->method && s->can_passwd) { s->method = AUTH_PASSWORD; ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh->pkt_ctx |= SSH2_PKTCTX_PASSWORD; sprintf(s->pwprompt, "%.90s@%.90s's password: ", s->username, ssh->savedhost); s->need_pw = TRUE; } if (s->need_pw) { if (ssh_get_line) { if (!ssh_get_line(s->pwprompt, s->password, sizeof(s->password), TRUE)) { /* * get_line failed to get a password (for * example because one was supplied on the * command line which has already failed to * work). Terminate. */ s->pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(s->pktout,SSH2_DISCONNECT_BY_APPLICATION); ssh2_pkt_addstring(s->pktout, "No more passwords available" " to try"); ssh2_pkt_addstring(s->pktout, "en"); /* language tag */ ssh2_pkt_send_noqueue(ssh, s->pktout); logevent("Unable to authenticate"); connection_fatal(ssh->frontend, "Unable to authenticate"); ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); crStopV; } } else { int ret; /* need not be saved across crReturn */ c_write_untrusted(ssh, s->pwprompt, strlen(s->pwprompt)); ssh->send_ok = 1; setup_userpass_input(ssh, s->password, sizeof(s->password), s->echo); do { crWaitUntilV(!pktin); ret = process_userpass_input(ssh, in, inlen); } while (ret == 0); if (ret < 0) cleanup_exit(0); c_write_str(ssh, "\r\n"); } } if (s->method == AUTH_PUBLICKEY_FILE) { /* * We have our passphrase. Now try the actual authentication. */ struct ssh2_userkey *key; const char *error = NULL; key = ssh2_load_userkey(&ssh->cfg.keyfile, s->password, &error); if (key == SSH2_WRONG_PASSPHRASE || key == NULL) { if (key == SSH2_WRONG_PASSPHRASE) { c_write_str(ssh, "Wrong passphrase\r\n"); s->tried_pubkey_config = FALSE; } else { c_write_str(ssh, "Unable to load private key ("); c_write_str(ssh, error); c_write_str(ssh, ")\r\n"); s->tried_pubkey_config = TRUE; } /* Send a spurious AUTH_NONE to return to the top. */ s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(s->pktout, "none"); /* method */ ssh2_pkt_send(ssh, s->pktout); s->type = AUTH_TYPE_NONE; } else { unsigned char *pkblob, *sigblob, *sigdata; int pkblob_len, sigblob_len, sigdata_len; int p; /* * We have loaded the private key and the server * has announced that it's willing to accept it. * Hallelujah. Generate a signature and send it. */ s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(s->pktout, "publickey"); /* method */ ssh2_pkt_addbool(s->pktout, TRUE); ssh2_pkt_addstring(s->pktout, key->alg->name); pkblob = key->alg->public_blob(key->data, &pkblob_len); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, (char *)pkblob, pkblob_len); /* * The data to be sparse_ttymodes(ssh, ssh->cfg.ttymodes, ssh2_send_ttymode, (void *)s->pktout); ssh2_pkt_addbyte(s->pktout, SSH2_TTY_OP_ISPEED); ssh2_pkt_adduint32(s->pktout, ssh->ispeed); ssh2_pkt_addbyte(s->pktout, SSH2_TTY_OP_OSPEED); Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02df31a7034303260c6b6cb71e3aefb5 Text-delta-base-sha1: 7cf50a93894ae5b99707a0d5580cf2e9b15b6712 Text-content-length: 423 Text-content-md5: 53c78d12775924e04ffc770a774f6e00 Text-content-sha1: 4a9e3a088a803265935a1f8c20a2c3b58382271c Content-length: 423 SVN����������� /* * Provide "auto" settings for remote tty modes, suitable for an * application with a terminal window. */ char *term_get_ttymode(Terminal *term, const char *mode) { char *val = NULL; if (strcmp(mode, "ERASE") == 0) { val = term->cfg.bksp_is_delete ? "^?" : "^H"; } /* FIXME: perhaps we should set ONLCR based on cfg.lfhascr as well? */ return dupstr(val); } Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0524ec6eaf283f3ae0d4a2fff3d6bd79 Text-delta-base-sha1: c73eb446d95d20c29d4d7fc81dddcb48392a0c2b Text-content-length: 362 Text-content-md5: 779d3edb1d95a67d50d4046e7b003b45 Text-content-sha1: 7072a5196f8bb803692af10cde3fa3efaa45f780 Content-length: 362 SVN���� �{��hwchar *get_ttymode(void *frontend, const char *mode) { struct gui_data *inst = (struct gui_data *)frontend; return term_get_ttymode(inst->term, mode);�?!!��MKMENUITEM("Duplicate Session", dup_session_menuitem); if (saved_sessions) { inst->sessionsmenu = gtk_menu_new(); /* sessionsmenu will be updated when Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c88e844315c5b60231adc96db9ea312b Text-delta-base-sha1: 4045300b786ee325f6feb1a5ddfddec1c2d5270d Text-content-length: 4464 Text-content-md5: 620f518d473747eb971b79d5c91a9021 Text-content-sha1: eba30ba89ccf59a94e6a9adab62a28077fb4045e Content-length: 4464 SVN���:D���Y�vSD�B�oatic int local_tty = 0; /* do we have a local tty? */ static if (!local_tty) return/* Solaris sets these to unhelpful values */ mode.c_cc[VMIN] = 1; mode.c_cc[VTIME] = 0; /* FIXME: perhaps what we do with IXON/IXOFF should be an * argument to ldisc_update(), to allow implementation of SSH-2 * "xon-xoff" and Rlogin's equivalent? */ mode.c_iflag &= ~IXON; mode.c_iflag &= ~IXOFF; } tcsetattr(0, TCSANOW, &mode); } /* Helper function to extract a special character from a termios. */ static char *get_ttychar(struct termios *t, int index) { cc_t c = t->c_cc[index]; #if defined(_POSIX_VDISABLE) if (c == _POSIX_VDISABLE) return dupprintf(""); #endif return dupprintf("^<%d>", c); } char *get_ttymode(void *frontend, const char *mode) { /* * Propagate appropriate terminal modes from the local terminal, * if any. */ if (!local_tty) return NULL; #define GET_CHAR(ourname, uxname) \ do { \ if (strcmp(mode, ourname) == 0) \ return get_ttychar(&orig_termios, uxname); \ } while(0) #define GET_BOOL(ourname, uxname, uxmemb, transform) \ do { \ if (strcmp(mode, ourname) == 0) { \ int b = (orig_termios.uxmemb & uxname) != 0; \ transform; \ return dupprintf("%d", b); \ } \ } while (0) /* * Modes that want to be the same on all terminal devices involved. */ /* All the special characters supported by SSH */ #if defined(VINTR) GET_CHAR("INTR", VINTR); #endif #if defined(VQUIT) GET_CHAR("QUIT", VQUIT); #endif #if defined(VERASE) GET_CHAR("ERASE", VERASE); #endif #if defined(VKILL) GET_CHAR("KILL", VKILL); #endif #if defined(VEOF) GET_CHAR("EOF", VEOF); #endif #if defined(VEOL) GET_CHAR("EOL", VEOL); #endif #if defined(VEOL2) GET_CHAR("EOL2", VEOL2); #endif #if defined(VSTART) GET_CHAR("START", VSTART); #endif #if defined(VSTOP) GET_CHAR("STOP", VSTOP); #endif #if defined(VSUSP) GET_CHAR("SUSP", VSUSP); #endif #if defined(VDSUSP) GET_CHAR("DSUSP", VDSUSP); #endif #if defined(VREPRINT) GET_CHAR("REPRINT", VREPRINT); #endif #if defined(VWERASE) GET_CHAR("WERASE", VWERASE); #endif #if defined(VLNEXT) GET_CHAR("LNEXT", VLNEXT); #endif #if defined(VFLUSH) GET_CHAR("FLUSH", VFLUSH); #endif #if defined(VSWTCH) GET_CHAR("SWTCH", VSWTCH); #endif #if defined(VSTATUS) GET_CHAR("STATUS", VSTATUS); #endif #if defined(VDISCARD) GET_CHAR("DISCARD", VDISCARD); #endif /* Modes that "configure" other major modes. These should probably be * considered as user preferences. */ /* Configuration of ICANON */ #if defined(ECHOK) GET_BOOL("ECHOK", ECHOK, c_lflag, ); #endif #if defined(ECHOKE) GET_BOOL("ECHOKE", ECHOKE, c_lflag, ); #endif #if defined(ECHOE) GET_BOOL("ECHOE", ECHOE, c_lflag, ); #endif #if defined(ECHONL) GET_BOOL("ECHONL", ECHONL, c_lflag, ); #endif #if defined(XCASE) GET_BOOL("XCASE", XCASE, c_lflag, ); #endif /* Configuration of ECHO */ #if defined(ECHOCTL) GET_BOOL("ECHOCTL", ECHOCTL, c_lflag, ); #endif /* Configuration of IXON/IXOFF */ #if defined(IXANY) GET_BOOL("IXANY", IXANY, c_iflag, ); #endif /* * Modes that want to be set in only one place, and that we have * squashed locally. */ #if defined(ISIG) GET_BOOL("ISIG", ISIG, c_lflag, ); #endif #if defined(ICANON) GET_BOOL("ICANON", ICANON, c_lflag, ); #endif #if defined(ECHO) GET_BOOL("ECHO", ECHO, c_lflag, ); #endif #if defined(IXON) GET_BOOL("IXON", IXON, c_iflag, ); #endif #if defined(IXOFF) GET_BOOL("IXOFF", IXOFF, c_iflag, ); #endif /* * We do not propagate the following modes: * - Parity/serial settings, which are a local affair and don't * make sense propagated over SSH's 8-bit byte-stream. * IGNPAR PARMRK INPCK CS7 CS8 PARENB PARODD * - Things that want to be enabled in one place that we don't * squash locally. * IUCLC OLCUC * - Status bits. * PENDIN * - Things I don't know what to do with. (FIXME) * ISTRIP IMAXBEL NOFLSH TOSTOP IEXTEN OPOST * INLCR IGNCR ICRNL ONLCR OCRNL ONOCR ONLRET */ #undef GET_CHAR #undef GET_BOOL /* Fall through to here for unrecognised names, or ones that are * unsupported on this platform */ return NULL; } void cleanup_termios(void) { if (local_tty) local_tty = (tcgetattr(0, &orig_termios) == 0 Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 346412aee7d9d15df380d22a85e379e7 Text-delta-base-sha1: d388d73bf02dff987d5febab9afff3df03b19abb Text-content-length: 89 Text-content-md5: bcb90a9e0c59d3e0c502bbc6bf7d5c87 Text-content-sha1: 67f0f060d9676a38167040d1ab090bcc30dc84fe Content-length: 89 SVN��[ C�a�C�7^char *get_ttymode(void *frontend, const char *mode) { return NULL; Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc18e1ce4448a06c4bbf98cb35fb09f4 Text-delta-base-sha1: 90b4e41bdd7ae43bb42785beea1c8fff2c6fc96d Text-content-length: 235 Text-content-md5: f7468c9be3dfcb9dcb6aec920b038b52 Text-content-sha1: c80504145a905b67e5f9ac1f6443171ba8978fc5 Content-length: 235 SVN���� ^�k�^�7gchar *get_ttymode(void *frontend, const char *mode) { return term_get_ttymode(term, mode);�ibb��", xkey); else p += sprintf((char *) p, "\x1B?%c", xkey); } else p += sprintf((ch Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4706eac04d5802040cda738905bbd59 Text-delta-base-sha1: 74fdfe5ac481b4a05afc5ac1b13bd85d580c0ed3 Text-content-length: 43 Text-content-md5: 816e5e4cd40cf66e291f1756184617ff Text-content-sha1: 10d764f70b974e0df39d049d997c9c3cd35207af Content-length: 43 SVN��%U �W��h=ttymodes "ssh.ttymodes Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 72e7e2d227a2d566153f0aef5fd8bfd7 Text-delta-base-sha1: e27babb65c9bda2f40d9b90e4db1e881cb2e0ce0 Text-content-length: 92 Text-content-md5: d557b7d80166fc4ef7e94fd266c23eb1 Text-content-sha1: 8bbc6e45a9ddee804a8df86c66ac0c0d7f3eb426 Content-length: 92 SVN��l2 C�v�C�yschar *get_ttymode(void *frontend, const char *mode) { return NULL; Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f6103fba2e4f41b808850b528e5f8aa Text-delta-base-sha1: c5164e4636c5013bf84c578e9cdbe6746a24f1c2 Text-content-length: 95 Text-content-md5: 0430ff347d7b28abf26348b723d653d5 Text-content-sha1: d497a7bbf18217b3599ab8d6186fdba354f15a82 Content-length: 95 SVN��UD��D�O~�0_char *get_ttymode(void *frontend, const char *mode) { return NULL; } Node-path: putty-wishlist/data/terminal-modes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2342cd6bd2fa14796dde7dca9e980df1 Text-delta-base-sha1: 27154f461481721082ceacc3bea356ca4dfbe7a4 Text-content-length: 291 Text-content-md5: fdddc4558807770c7dff4d041c7e2d44 Text-content-sha1: 68df5744bae1627ca61147cdd42fbc8c39c2acaf Content-length: 291 SVN��N\�i��mh�OmFixed-in: r5653 2005-04-22 <p> <em>Update, 2005-04-21:</em> this is basically done. I haven't implemented any cleverness with echo or line editing (although doing so should now be a minimal amount of work), and it's SSH-only; nothing for pterm, or Telnet/Rlogin. Revision-number: 5654 Prop-content-length: 338 Content-length: 338 K 7 svn:log V 237 Change proxy-dns `Auto' default for SOCKS5 from local DNS to remote DNS. SOCKS5 should always be able to do this, and I suspect our not doing so dates from when the SOCKS proxy types were under a single configuration option (pre-r3168). K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-22T00:00:49.991355Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ce8452c6770bd3b44a63578682ef30bd Text-delta-base-sha1: a7243ef1ffac5268d3951f6f532e840a2e2234c8 Text-content-length: 134 Text-content-md5: bc6bcec98953453a2962ebb543fcb573 Text-content-sha1: 8ac0100ca89abc9dc365085603110ab82089d3a3 Content-length: 134 SVN����P��P�], HTTP, and SOCKS5 proxies will have host names passed straight to them; SOCKS4 �=G �=� get a lit Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b24de40732816f483eaee88ddd9a2229 Text-delta-base-sha1: bd5d12a33f8eb40b62bcf647dca1bdfbf792044e Text-content-length: 55 Text-content-md5: 4e900c03c3cb2e7b4485dd9761ce6c96 Text-content-sha1: daf0c0c40d30286109ec9e8219bcb5a444df8a24 Content-length: 55 SVN��c ���pscfg->proxy_type != PROXY_SOCKS4 Revision-number: 5655 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 29 Stir in process ID at start. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-04-22T15:47:28.932493Z PROPS-END Node-path: putty/windows/winnoise.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 235d5bb01439e9a477e72bd5d14f31fd Text-delta-base-sha1: 0907db6fcf2f96dbb45053eb6b84692f42c30d01 Text-content-length: 98 Text-content-md5: 0a2cd72de1f807554adcfb88413017d1 Text-content-sha1: 774b8e0a0789c70db4557fe7f689e2e092c46931 Content-length: 98 SVN��EB�<��=6�6m�T:DWORD pidpid = GetCurrentProcessId(); func(&pid, sizeof(pid)); Revision-number: 5656 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2005-04-22T21:25:01.032699Z K 7 svn:log V 43 putty.3wsi.net (replaces penguin.3wsi.net) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c454d2e6aacc30175f7722b76a1026d Text-delta-base-sha1: a507f444066e4e5f885bf3f1844d77912be9a05d Text-content-length: 69 Text-content-md5: ad51f7c9edb57944012f97b367ad0c1b Text-content-sha1: 201b0fcbcab45cac714ddc4692e50069a85df9fd Content-length: 69 SVN��L7*�n��A�^n3wsi.net/">putty.3wsi.net</a> in Indonesia Revision-number: 5657 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2005-04-23T15:12:57.842345Z K 7 svn:log V 42 We now have some sort of Arcfour support. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/arcfour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49de473e14e310e6be55bc4035873fd6 Text-delta-base-sha1: 2e028f4a1381eeb83e3b23a524406c2ece162a42 Text-content-length: 196 Text-content-md5: faa73dec907d69114abe98bd7154aad4 Text-content-sha1: 69c1443feddef785f2a100cbcc922cfd66983795 Content-length: 196 SVN�� -�q��dpFixed-in: 2005-04-22<b>Update:</b> Ben Harris has written an Internet-Draft describing a way of using Arcfour reasonably securely with SSH-2, and PuTTY now implements this. Revision-number: 5658 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2005-04-23T15:16:02.090883Z K 7 svn:log V 27 Update for current status. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-ctr-modes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 33a6e287313bbc18df891b68b9694875 Text-delta-base-sha1: 2f7a1ee9e7542e2d71d5bb59c568e204a9a4bd79 Text-content-length: 302 Text-content-md5: 81fb4a1cfc2d27c45935ad49bfd515c9 Text-content-sha1: 669f364c0f3f50055f45d1bf7f4d483412a4342f Content-length: 302 SVN��5 �|Summary: SSH-2 CTR modes Difficulty: fun Class: wish Priority: medium Content-type: text/plain The Internet Draft, draft-ietf-secsh-newmodes-03The AES modes are now implemented in PuTTY (as of 2005-04-07), but 3des-ctr and blowfish-ctr await successful interoperability testing. Revision-number: 5659 Prop-content-length: 437 Content-length: 437 K 8 svn:date V 27 2005-04-23T16:22:51.980235Z K 7 svn:log V 338 Now that we've got at least some SDCTR modes working (and aes256-ctr is our default preferred cipher), add code to inject SSH_MSG_IGNOREs to randomise the IV when using CBC-mode ciphers. Each cipher has a flag to indicate whether it needs this workaround, and the SSH packet output maze has gained some extra complexity to implement it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d90312a2a75d373583d1233d62c3a780 Text-delta-base-sha1: 15e2d1e08e8b19493b6a93ba3c39b1dcafa50890 Text-content-length: 3116 Text-content-md5: c9d7b4ac9e19fdf6265d788e1aa7dad2 Text-content-sha1: 7b84e9283fea950a3c5a8efd1c2a63bea044f7a3 Content-length: 3116 SVN����/b�w� �/x_�~"k�a+�y �  * When using a CBC-mode cipher, it's necessary to ensure that an * attacker can't provide data to be encrypted using an IV that they * know. We ensure this by prefixing each packet that might contain * user data with an SSH_MSG_IGNORE. This is done using the deferral * mechanism, so in this case send_noqueue() ends up redirecting to * defer_noqueue(). If you don't like this inefficiency, don't use * CBC. */ static void ssh2_pkt_defer_noqueue(Ssh, struct Packet *, int); static void ssh_pkt_defersend(Ssh);if (ssh->cscipher != NULL && (ssh->cscipher->flags & SSH_CIPHER_IS_CBC)) { /* We need to send two packets, so use the deferral mechanism. */ ssh2_pkt_defer_noqueue(ssh, pkt, FALSE); ssh_pkt_defersend(ssh); return; }, int noignore) { int len; if (ssh->cscipher != NULL && (ssh->cscipher->flags & SSH_CIPHER_IS_CBC) && ssh->deferred_len == 0 && !noignore) { /* * Interpose an SSH_MSG_IGNORE to ensure that user data don't * get encrypted with a known IV. */ struct Packet *ipkt = ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_defer_noqueue(ssh, ipkt, TRUE); } , FALSE, FALSE���[[�%�llenge, challengelen); strncpy(s->prompt + challengelen, memchr(s->prompt, '\n', challengelen) ? "" : "\r\nResponse: ", sizeof(s->prompt) - challengelen); s->prompt[sizeof(s->prompt) - 1] = '\0'; } } if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { sprintf(s->prompt, "%.90s@%.90s's password: ", s->username, ssh->savedhost); } if (s->pwpkt_type == SSH1_CMSG_AUTH_RSA) { char *comment = NULL; int type; if (flags & FLAG_VERBOSE) c_write_str(ssh, "Trying public key authentication.\r\n"); logeventf(ssh, "Trying public key \"%s\"", filename_to_str(&ssh->cfg.keyfile)); type = key_type(&ssh->cfg.keyfile); if (type != SSH_KEYTYPE_SSH1) { char *msg = dupprintf("Key is of wrong type (%s)", key_type_to_str(type)); logevent(msg); c_write_str(ssh, msg); c_write_str(ssh, "\r\n"); sfree(msg); s->tried_publickey = 1; continue; } if (!rsakey_encrypted(&ssh->cfg.keyfile, &comment)) { if (flags & FLAG_VERBOSE) c_write_str(ssh, "No passphrase required.\r\n"); goto tryauth; } sprintf(s->pro�q|*�Cf�P��sprintf(s->pwprompt, "Passphrase for key \"%.100s\": ", comment); s->need_pw = TRUE; } else { s->need_pw = FALSE; } if (flags & FLAG_VERBOSE) { c_write_str(ssh, "Authenticating with public key \""); c_write_str(ssh, comment); c_write_str(ssh, "\"\r\n"); } s->method = AUTH_PUBLICKEY_FILE; } } if (!s->method && s->can_keyb_inter && !s->kbd_inter_refused && !s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST)keyboard-interactive"); /* method */ ssh2_pkt_addstring(s->pktout, ""); /* lang */ ssh2_pkt_addstring(s->pktout, ""); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_USERAUTH_INFO_REQUEST) { if (pktin->type == SSH2_MSG_USERAUTH_FAILURE) Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 90c6e24e196a3cde96a5203b3ffe2cd7 Text-delta-base-sha1: 92d1696cdb0672b37d60ff4dbbe06564699f049a Text-content-length: 68 Text-content-md5: 5f341dcd67c60562d40b49e9bb481434 Text-content-sha1: 45328aae0f7a090595bd4c1f344de00a9164ea60 Content-length: 68 SVN��] /�H��Cunsigned int flags; #define SSH_CIPHER_IS_CBC 1 Node-path: putty/sshaes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f60c8dbfa52edd705cdb87166a5ddd6 Text-delta-base-sha1: 7673548f032f4731738a80142c9cff04f30b5edf Text-content-length: 138 Text-content-md5: 52335b49be9eea1bba9e6cf046a4f72d Text-content-sha1: b18c3519337a89ce7340621d7cba5b9a931f7bdb Content-length: 138 SVN��i6G���H�HE�P �NY�N%�iq�<X000SSH_CIPHER_IS_CBCSSH_CIPHER_IS_CBCSSH_CIPHER_IS_CBCSSH_CIPHER_IS_CBC Node-path: putty/ssharcf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a592a42c10707516a1997112336ce5f Text-delta-base-sha1: 6a71117abf28c1b8a9852526f55d50bfe96a2e64 Text-content-length: 29 Text-content-md5: ccd692283e444a6f188e88c1ef52aace Text-content-sha1: 3a1a00d7a697a4f850b2380e6fc71125e1122b50 Content-length: 29 SVN��BH�Y��vW�wK00 Node-path: putty/sshblowf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b163ef96aa6bac837fadb0653c1dd86b Text-delta-base-sha1: 919a435c211cb42c125a8201fbf697f02105e49e Text-content-length: 50 Text-content-md5: d52a21e082b1c634950ead6cf429bfea Text-content-sha1: 12d3146c2be442bc4be804feb923d2aa8cca5518 Content-length: 50 SVN��t �F��D�!SSSH_CIPHER_IS_CBC0 Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: af0102a253c467d94da434578cee7d8e Text-delta-base-sha1: 99a7653624e6bd4e855daa5c6b9e31c8cb0fd922 Text-content-length: 98 Text-content-md5: 1e7ad5569933b39a330c2953b608c8f5 Text-content-sha1: 2e1936256bc75d79f0c2229e4e357e0adb359ad3 Content-length: 98 SVN��T!4� ��h�m�\ �pdSSH_CIPHER_IS_CBC0SSH_CIPHER_IS_CBCSSH_CIPHER_IS_CBC Revision-number: 5660 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:57.495509Z PROPS-END Revision-number: 5661 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:57.505878Z PROPS-END Revision-number: 5662 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:57.516300Z PROPS-END Revision-number: 5663 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 29 I believe this is now fixed. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-04-23T17:10:18.611950Z PROPS-END Node-path: putty-wishlist/data/ssh2-cbc-weakness Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 68b2d48a39743b30afdb1179f23ff12b Text-delta-base-sha1: 86532e3480be73e656725b7f2f58bebfff2894bc Text-content-length: 219 Text-content-md5: 15b9e5cf16a877faf3415fd54266e25f Text-content-sha1: a9d41fd90c5587061e70f56dbedec0610066bcfa Content-length: 219 SVN��rb>���<*�R Fixed-in: 2005-04-24something analogous to SSH-CTRIV-CBC or SSH-EIV-CBC. <p>Implementing this in PuTTY was fairly easy, and gives us decent security until CTR modes are widespread. It does Revision-number: 5664 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:57.568747Z PROPS-END Revision-number: 5665 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:57.579645Z PROPS-END Revision-number: 5666 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:57.590009Z PROPS-END Revision-number: 5667 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:57.601863Z PROPS-END Revision-number: 5668 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2005-04-24T13:40:54.039176Z K 7 svn:log V 28 This is now Priority: high. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 092b597378f3eca8c893ff8ac5cf5acf Text-delta-base-sha1: fd4fd2209cf70910662f40178a045120684acd6c Text-content-length: 30 Text-content-md5: b87cbe3aeca257ca02568b8b64c4f822 Text-content-sha1: 8af726d2fe0b118bd1fb5278c30ec0add25464bd Content-length: 30 SVN��7) �P��OVhigh0.58. Revision-number: 5669 Prop-content-length: 376 Content-length: 376 K 8 svn:date V 27 2005-04-24T14:43:00.485853Z K 7 svn:log V 277 On some systems (NetBSD 1.6 and Solaris 9, at least), GCC doesn't understand the semantics of assert(0) and believes it can return. Add a gratuitous exit(1) to convince it that this won't happen, and hence quell a couple of warnings about variables' being used uninitialised. K 10 svn:author V 3 ben PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 16664c1a579af46246ce5d93923ca0d2 Text-delta-base-sha1: 1aaeb03d5493e597ab996adca7a25b88b1c46246 Text-content-length: 168 Text-content-md5: 63d5d8e55e23efc937a8063ecb45bec4 Text-content-sha1: 76be0f3a2d6734fff0c67d3e9e3ba7a849fc9eee Content-length: 168 SVN��EQ�)�B�?%B�e` exit(1); /* XXX: GCC doesn't understand assert() on some systems. exit(1); /* XXX: GCC doesn't understand assert() on some systems. Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3940662681979dbe7bc4d1cbd84ac358 Text-delta-base-sha1: 3cae0b917768016d366e9505360b09ccae22dc1d Text-content-length: 94 Text-content-md5: edff7f1efd68de990616cf4888a558a6 Text-content-sha1: f2c12db70382e63cd6e26568d92d3b1ba90017b6 Content-length: 94 SVN��` E�3�E�h2 exit(1); /* XXX: GCC doesn't understand assert() on some systems. */ Revision-number: 5670 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:57.792252Z PROPS-END Revision-number: 5671 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:57.819276Z PROPS-END Revision-number: 5672 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:57.830776Z PROPS-END Revision-number: 5673 Prop-content-length: 430 Content-length: 430 K 7 svn:log V 331 Add a mechanism for using autoconf to detect the quirks of Unix systems rather than relying on the user to edit the Makefile. Makefile.gtk still works as well as it ever did, but now we get a Makefile.in alongside it. mkunxarc.sh now relies on autoconf and friends to build the configure script for the Unix source distribution. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-04-25T15:55:06.850119Z PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 065c170c6c2ee2be9cd25fd1bd508439 Text-delta-base-sha1: 86320db4fad46153bf3537bf3d34816b01725112 Text-content-length: 279 Text-content-md5: 6af1a29702a60ee3eb608a54303226d7 Text-content-sha1: d706dbd2c0166f3996fd3f5924625ca52747741f Content-length: 279 SVN��0;y�-��9p�{5configurescript. To use it, change into the `unix' subdirectory, run `./configure' and then `make'. - unix/Makefile.gtk is for non-autoconfigured builds. This makefile expects you to change into the `unix' subdirectory, then run `make -f Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e106471511c3eeb86b12a8fdda8bf5af Text-delta-base-sha1: 5c3b071acd6376c7f7bd6fa6a0f08acfdd0e8a6c Text-content-length: 40 Text-content-md5: 9c7000e3b490477f4bbe7b11841e0a49 Text-content-sha1: 40723581ceaa643bcae7a4729a2003670987c1ae Content-length: 40 SVN��Zx �>��'3ac unix/Makefile.in Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cc99362e436fc2e181e2f8214792f846 Text-delta-base-sha1: 967add503335f796094fafca22124b6d398d0dfc Text-content-length: 844 Text-content-md5: d974df79162f0c31efcac2a80a2be451 Text-content-sha1: e4b1a506f761195a515696bc9ff455e733e81bb3 Content-length: 844 SVN��m<-���,M�=�X?e�G�gacac'}) { $dirpfx = &dirpfx($makefiles{'ac'}, "/"); ##-- Unix/autoconf makefile open OUT, ">$makefiles{'ac'}"; select OUT; print "# Makefile.in for $project_name under Unix with AutoconfCC = \@CC\@\n". "\n". &splitline("CFLAGS = \@CFLAGS\@ \@CPPFLAGS\@ \@DEFS\@ \@GTK_CFLAGS\@ " . (join " ", map {"-I$dirpfx$_"} @srcdirs))."\n". "XLDFLAGS = \@LDFLAGS\@ \@LIBS\@ \@GTK_LIBS\@\n". "ULDFLAGS = \@LDFLAGS\@ \@LIBS\@\n". "INSTALL=\@INSTALL\@\@prefix\@\n", "exec_prefix=\@exec_prefix\@\n", "bindir=\@bindir\@\n", "mandir=\@mandir\@. "all: \@all_targets\@\n". &splitline("all-cli:" . join "", map { " $_" } &progrealnames("U"))."\n". &splitline("all-gtk:" . join "", map { " $_" } &progrealnames("X"))."\n"; print " Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae4a46f78cda207e4915b91a354e9bf4 Text-delta-base-sha1: 6cd2b11b737cbb5001a4c9c9ffc1bac3c6cc4bb8 Text-content-length: 201 Text-content-md5: b7990a53b25c8536700f1d874e0d92b6 Text-content-sha1: 60623f676c285f7c3fb03de5a0f211592c3f75f1 Content-length: 201 SVN��o" 1�?�1�2=# Track down automake's copy of install-sh cp `aclocal --print-ac-dir | sed 's/aclocal$/automake/'`/install-sh unix/. (cd unix && autoreconf && rm -rf aclocal.m4 autom4te.cache Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 199 Content-length: 199 K 10 svn:ignore V 166 Makefile.gtk Makefile.in Makefile aclocal.m4 autom4te.cache config.status configure local plink pterm putty puttytel psftp pscp puttygen uxconfig.in uxconfig.h *.log PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 950 Text-content-md5: 0560adedf3ebf9bc5fcc2030edebccad Text-content-sha1: 4f4c9a201423d2789db708033aafd43ada5804eb Content-length: 960 PROPS-END SVN���(((# To compile this into a configure script, you need: # * Autoconf 2.50 or newer # * Gtk (for $prefix/share/aclocal/gtk.m4) # * Automake (for aclocal) # If you've got them, running "autoreconf" should work. AC_INIT AC_CONFIG_FILES([Makefile]) AC_CONFIG_HEADERS([uxconfig.h:uxconfig.in]) AC_PROG_INSTALL AC_PROG_CC if test "X$GCC" = Xyes; then CFLAGS="$CFLAGS -Wall -Werror" fi AM_PATH_GTK([1.2.0], [all_targets="all-cli all-gtk"], [all_targets="all-cli"]) AC_SUBST([all_targets]) AC_SEARCH_LIBS([socket], [xnet]) AC_CHECK_FUNCS([getaddrinfo ptsname pututline setresuid strsignal]) AC_OUTPUT AH_BOTTOM([ /* Convert autoconf definitions to ones that PuTTY wants. */ #ifndef HAVE_GETADDRINFO # define NO_IPV6 #endif #ifndef HAVE_SETRESUID # define HAVE_NO_SETRESUID #endif #ifndef HAVE_STRSIGNAL # define HAVE_NO_STRSIGNAL #endif #ifndef HAVE_PUTUTLINE # define OMIT_UTMP #endif #ifndef HAVE_PTSNAME # define BSD_PTYS #endif ]) Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 704c3925f476ceaec57bc68c32925fa1 Text-delta-base-sha1: bc0020ee5119b1dc1f92f29cd8af9aaeac3f56cb Text-content-length: 151 Text-content-md5: 5d2409c2a3a2cc54fe77c93389957aab Text-content-sha1: 277ee158fdc36f9b0123876c09212d3a09b635f8 Content-length: 151 SVN��$�{)#ifndef PUTTY_UNIX_H #define PUTTY_UNIX_H #ifdef HAVE_CONFIG_H # include "uxconfig.h" /* Space to hide it from mkfiles.pl */ #endif Revision-number: 5674 Prop-content-length: 231 Content-length: 231 K 8 svn:date V 27 2005-04-25T16:36:43.358045Z K 7 svn:log V 132 Move generation of the "configure" script into its own script so that people who check the code out of Subversion can get it to go. K 10 svn:author V 3 ben PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6af1a29702a60ee3eb608a54303226d7 Text-delta-base-sha1: d706dbd2c0166f3996fd3f5924625ca52747741f Text-content-length: 179 Text-content-md5: c367fe00231592d35ab7b5beedbaec53 Text-content-sha1: 3fac859b0af5d6a421bb0d3c756b6f3284abe119 Content-length: 179 SVN��;W �e��Wd The Unix `configure' script and its various requirements are generated by the shell script `mkauto.sh', which requires GNU Autoconf, GNU Automake, and Gtk Node-path: putty/mkauto.sh Node-kind: file Node-action: add Prop-content-length: 36 Text-delta: true Text-content-length: 369 Text-content-md5: 8a636a02364e2c952172a86558860afa Text-content-sha1: e901ac9481c4ab720956d7bc8796890e0142e931 Content-length: 405 K 14 svn:executable V 1 * PROPS-END SVN���ccc#! /bin/sh # This script makes the autoconf mechanism for the Unix port work. # It's separate from mkfiles.pl because it won't work (and isn't needed) # on a non-Unix system. # Track down automake's copy of install-sh cp `aclocal --print-ac-dir | sed 's/aclocal$/automake/'`/install-sh unix/. (cd unix && autoreconf && rm -rf aclocal.m4 autom4te.cache) Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b7990a53b25c8536700f1d874e0d92b6 Text-delta-base-sha1: 60623f676c285f7c3fb03de5a0f211592c3f75f1 Text-content-length: 33 Text-content-md5: 9ab4276ac4aa38897014802fb55b25cb Text-content-sha1: 12f1c2c3d38f54c0446a54e23601dfaa95b3b89e Content-length: 33 SVN��"| �?��1qsh mkauto.sh Revision-number: 5675 Prop-content-length: 303 Content-length: 303 K 8 svn:date V 27 2005-04-25T17:21:08.268018Z K 7 svn:log V 204 uxpty.c uses non-X/Open facilities (notably strsignal()), so don't define _XOPEN_SOURCE. We do still need _GNU_SOURCE in order to get grantpt() on GNU systems. This allows uxpty.c to compile on NetBSD. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a7490e5ed6962cba7e0c34f8a957459c Text-delta-base-sha1: c7c04cc8de716968a938ff3276a960f1fd46f73f Text-content-length: 59 Text-content-md5: 3da119f7f82140a40f02b3b08334161e Text-content-sha1: 496076ffb0966c9fa23e8adf11dcfd262c7069ae Content-length: 59 SVN���G(�a/* * Pseudo-tty backend for pterm. */ Revision-number: 5676 Prop-content-length: 401 Content-length: 401 K 8 svn:date V 27 2005-04-25T18:51:15.914160Z K 7 svn:log V 302 Check for <sys/sockio.h> and include it in uxnet.c if we find it. It's necessary on Solaris if we want to use SIOCATMARK. Using sockatmark() might be preferable, but despite being notionally standard it's missing on Solaris 9 and Mac OS X 10.3.9, whereas everyone seems to have SIOCATMARK somewhere. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0560adedf3ebf9bc5fcc2030edebccad Text-delta-base-sha1: 4f4c9a201423d2789db708033aafd43ada5804eb Text-content-length: 58 Text-content-md5: 067509861cec1a80c1b2d5dcc70ee4d7 Text-content-sha1: e41b0b9b4997c44c50f44e272fa7f587d821288e Content-length: 58 SVN��(P %����+}C_CHECK_HEADERS([sys/sockio.h],,,[ ]) Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: edff7f1efd68de990616cf4888a558a6 Text-delta-base-sha1: f2c12db70382e63cd6e26568d92d3b1ba90017b6 Text-content-length: 131 Text-content-md5: 8140f83e71eef0352981158467f96db9 Text-content-sha1: 71a83e1f15cc643ef544762e929ae71a2cb127c2 Content-length: 131 SVN��`L j�3�j�/1/* Solaris needs <sys/sockio.h> for SIOCATMARK. */ #ifdef HAVE_SYS_SOCKIO_H #include <sys/sockio.h> #endif Revision-number: 5677 Prop-content-length: 304 Content-length: 304 K 7 svn:log V 205 Ask GDK to give us reasonable approximations if it can't get precisely the colours we asked it for. This means that I can run pterm on an 8-bit PseudoColor display even if I have another program running. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-04-25T22:46:08.543550Z PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 779d3edb1d95a67d50d4046e7b003b45 Text-delta-base-sha1: 7072a5196f8bb803692af10cde3fa3efaa45f780 Text-content-length: 44 Text-content-md5: 3e3fffb1414d952b70b2dde028efe7cf Text-content-sha1: 5f232610c8e80bc64c0fd69198c2968201a506cb Content-length: 44 SVN�������mTRUM�?>��> Revision-number: 5678 Prop-content-length: 370 Content-length: 370 K 8 svn:date V 27 2005-04-25T23:28:25.216949Z K 7 svn:log V 271 Use pututxline() in place of pututline(), since the former is standardised by X/Open and actually seems to be more common (NetBSD has it). Also use updwtmpx() rather than directly writing to the wtmpx file, though more for reasons of aesthetics than anything practical. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 067509861cec1a80c1b2d5dcc70ee4d7 Text-delta-base-sha1: e41b0b9b4997c44c50f44e272fa7f587d821288e Text-content-length: 110 Text-content-md5: 621edc495cb8fc6ee662aad1f933c62d Text-content-sha1: 3b0813749b76d0560edabcec0f5f4c1f0d03ab3e Content-length: 110 SVN��PN�&�G�2#�_�LAC_CHECK_HEADERS([utmpx.h],,,[ #include <sys/types.h> #include <utmp.h>UTMPX_H Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3da119f7f82140a40f02b3b08334161e Text-delta-base-sha1: 496076ffb0966c9fa23e8adf11dcfd262c7069ae Text-content-length: 1135 Text-content-md5: 85773ffbee866e97248a58fa4308f046 Text-content-sha1: ef73a9f0bfa4952ba09a8d031f6eb1636847e9bb Content-length: 1135 SVN��G</2�)�5�d�:t�8K�N�V�2def HAVE_UTMPX_H #include <utmpx.h> #endif #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif /* updwtmpx() needs the name of the wtmp file. Try to find it. */ #ifndef WTMPX_FILE #ifdef _PATH_WTMPX #define WTMPX_FILE _PATH_WTMPX #else #define WTMPX_FILE "/var/log/wtmpx" #endif #endif xstruct timeval tv * Apparently there are some architectures where (struct * utmpx).ut_tv is not essentially struct timeval (e.g. Linux * amd64). Hence the temporary. */ gettimeofday(&tv, NULL); utmp_entry.ut_tv.tv_sec = tv.tv_sec; utmp_entry.ut_tv.tv_usec = tv.tv_usec; setutxent(); pututxline(&utmp_entry); endutxent(); updwtmpx(WTMPX_FILE, &utmp_entry);struct timeval tvgettimeofday(&tv, NULL); utmp_entry.ut_tv.tv_sec = tv.tv_sec; utmp_entry.ut_tv.tv_usec = tv.tv_usec; updwtmpx(WTMPX_FILE, &utmp_entry); memset(utmp_entry.ut_line, 0, lenof(utmp_entry.ut_line)); utmp_entry.ut_tv.tv_sec = 0; utmp_entry.ut_tv.tv_usec = 0; setutxent(); pututxline(&utmp_entry); endutxent(); Revision-number: 5679 Prop-content-length: 327 Content-length: 327 K 8 svn:date V 27 2005-04-25T23:57:45.460840Z K 7 svn:log V 228 Squash OPOST locally when we're not in line-editing mode, and propagate the other output flags with SSH. This means that when I log into a remote system using Plink and then run "stty -onlcr" I get the expected stair-stepping. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 620f518d473747eb971b79d5c91a9021 Text-delta-base-sha1: eba30ba89ccf59a94e6a9adab62a28077fb4045e Text-content-length: 533 Text-content-md5: 2f93971b4910fb4329c194740182c816 Text-content-sha1: 2d843c931f119797e70d39b0321210f00c11fc7f Content-length: 533 SVN��:=h�[�x�"�G�H�- mode.c_oflag |= OPOST; } else { mode.c_iflag &= ~ICRNL; mode.c_lflag &= ~(ISIG | ICANON); mode.c_oflag &= ~OPOST /* Configuration of OPOST */ #if defined(ONLCR) GET_BOOL("ONLCR", ONLCR, c_oflag, ); #endif #if defined(OCRNL) GET_BOOL("OCRNL", OCRNL, c_oflag, ); #endif #if defined(ONOCR) GET_BOOL("ONOCR", ONOCR, c_oflag, ); #endif #if defined(ONLCR) GET_BOOL("ONLRET", ONLRET, c_o#if defined(OPOST) GET_BOOL("OPOST", OPOST, c_o * INLCR IGNCR ICRNL Revision-number: 5680 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2005-04-26T00:03:50.080634Z K 7 svn:log V 124 According to the termio(7I) on Solaris, OLCUC is overridden by OPOST, so we should send it with the SSH terminal modes too. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f93971b4910fb4329c194740182c816 Text-delta-base-sha1: 2d843c931f119797e70d39b0321210f00c11fc7f Text-content-length: 81 Text-content-md5: 21e76a934e937352dcbb8c49669888af Text-content-sha1: cb65bdcb3cc9b08ace9196c55c71c97a8edd62f3 Content-length: 81 SVN��=z5����ir�\aLCUC) GET_BOOL("OLCUC", OLCUC, c_oflag, ); #endif Revision-number: 5681 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:58.302957Z PROPS-END Revision-number: 5682 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:58.313304Z PROPS-END Revision-number: 5683 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:58.324311Z PROPS-END Revision-number: 5684 Prop-content-length: 273 Content-length: 273 K 8 svn:date V 27 2005-04-27T08:09:32.013035Z K 7 svn:log V 172 mkunxarc.sh is supposed to be silent, so I'm having it discard the stderr output from mkauto.sh. (I debated discarding it within mkauto.sh itself, but decided against it.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9ab4276ac4aa38897014802fb55b25cb Text-delta-base-sha1: 12f1c2c3d38f54c0446a54e23601dfaa95b3b89e Text-content-length: 33 Text-content-md5: 9b5b81cc68fffac9cc0dd452f5e0b9a2 Text-content-sha1: 18588ba51942aab799cb99b7bdbff4648106c57c Content-length: 33 SVN��| �K��1K 2>/dev/null Revision-number: 5685 Prop-content-length: 326 Content-length: 326 K 8 svn:date V 27 2005-04-27T11:10:54.021445Z K 7 svn:log V 227 In SSH-2 mode, PuTTY wasn't sending KEXINIT until it had received one from the server, which led to stalemate if the server did the same. PuTTY now sends KEXINIT proactively as soon as it's worked out that it's talking SSH-2. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c9d7b4ac9e19fdf6265d788e1aa7dad2 Text-delta-base-sha1: 7b84e9283fea950a3c5a8efd1c2a63bea044f7a3 Text-content-length: 264 Text-content-md5: 3a7429c7b8f585c8c3cad70581ccf04c Text-content-sha1: 4f4e840103005aaadc661169795da85e394e7980 Content-length: 264 SVN����A�!�A� if (ssh->version = 2) do_ssh2_transport(ssh, NULL, -1, NULL���DD�<� sizeof(s->prompt) - 1;/* prevent overrun */ memcpy(s->prompt, cha�q5DD�q� if (ssh2_userkey_encrypted(&ssh->cfg.keyfile, &comment)) { Revision-number: 5686 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:58.578570Z PROPS-END Revision-number: 5687 Prop-content-length: 138 Content-length: 138 K 10 svn:author V 3 ben K 8 svn:date V 27 2005-04-27T12:39:52.673420Z K 7 svn:log V 40 Use the correct key order for 3des-ctr. PROPS-END Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e7ad5569933b39a330c2953b608c8f5 Text-delta-base-sha1: 2e1936256bc75d79f0c2229e4e357e0adb359ad3 Text-content-length: 111 Text-content-md5: abf78abc5f49e81ca7d0ce34bb7bd1e6 Text-content-sha1: c0340bcb8badd01baa0ed9356a58c59090ae74a1 Content-length: 111 SVN�� U��U�+e0]); des_decipher(b, b[0], b[1], &scheds[1]); des_encipher(b, b[0], b[1], &scheds[2 Revision-number: 5688 Prop-content-length: 183 Content-length: 183 K 8 svn:date V 27 2005-04-27T13:44:02.737510Z K 7 svn:log V 83 Add the backward-compatibility whinge to the general wailing and gnashing of teeth K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/function-keys Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8bfe0abbaf7cf814235900be880c8cbf Text-delta-base-sha1: a9246b2df56cf8a36d6c5c23441bfdc99c47ff8b Text-content-length: 441 Text-content-md5: c98e4d6c35ff5a8877f6d16cf5ac3c4f Text-content-sha1: aa94c80d7b568ec726ded86ab69bb563f25809de Content-length: 441 SVN��T} !��!�Bn particular, we have no way of knowing whether removing any of our existing options will break people's worlds, even if the thing they claim to emulate (e.g., <tt>xterm</tt>, <tt>rxvt</tt> has since changed its mind about its key sequences. So we can't just update the existing mappings to reflect the bleeding-edge versions of emulated software; we need to retain the capability to use the old mappings in some form Revision-number: 5689 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2005-04-27T15:35:47.877872Z K 7 svn:log V 30 Declare this basically fixed. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/unix-portability Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2bba36778be0d89b0e4cbe8e970d12d6 Text-delta-base-sha1: c2da56b02ff99c570aeef56c4c4c7515b4e082ff Text-content-length: 301 Text-content-md5: ade604b011aa6901e20f9b000c5aca01 Text-content-sha1: cd5402073837b41419ee0e38cd438d77b0b88e36 Content-length: 301 SVN��ay�e��J�kFixed-in: 2005-04-26 <p> People occasionally send us patches to make the Unix port more portable. <p> We're now using Autoconf to help with inter-Unix portability. <p> Here are some of the patches we received before that. Some of them may still be relevant <b>fixed</b Revision-number: 5690 Prop-content-length: 276 Content-length: 276 K 8 svn:date V 27 2005-04-27T15:42:10.803561Z K 7 svn:log V 177 Rather than checking for <sys/sockio.h>, just include it if our other attempts at finding SIOCATMARK have failed. This removes one of our Autoconf tests, which is always nice. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 621edc495cb8fc6ee662aad1f933c62d Text-delta-base-sha1: 3b0813749b76d0560edabcec0f5f4c1f0d03ab3e Text-content-length: 20 Text-content-md5: 038b77283ba8d7cd18572d7dcc7acc1e Text-content-sha1: 35d6169a3625bd6232404348b6b2bd9ccb2df481 Content-length: 20 SVN��g ����V8 Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8140f83e71eef0352981158467f96db9 Text-delta-base-sha1: 71a83e1f15cc643ef544762e929ae71a2cb127c2 Text-content-length: 39 Text-content-md5: 7f904a16dbb6f88293d121866138abca Text-content-sha1: 050fb07676280f86e080f51c6a28415dc2320ea6 Content-length: 39 SVN��LF �i��N~ndef SOCKATMARK Revision-number: 5691 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:58.784897Z PROPS-END Revision-number: 5692 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2005-04-27T19:27:54.859678Z K 7 svn:log V 24 A couple more thoughts. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/scripting Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5bbb324d5f042ee3ff1c114bb20c2376 Text-delta-base-sha1: 7c188fa8b2549e990550ed2b7e5f634979ed970a Text-content-length: 463 Text-content-md5: dbfe68025bbdf16d18c34ef8515570ea Text-content-sha1: f565ebcc805eff41b3a3880ae352ff2a046ca2a9 Content-length: 463 SVN��I4�(� �m&'li> Implementing <a href="key-mapping.html">key-mapping</a> fully generally. <li> Performing arbitrary transformations on clipboard contents. <p> It's been suggested by several people that using the underlying OS's built-in scripting mechanisms might help. A problem with this is that it prevents PuTTY scripts being portable between OSes, which in turn means that we can't use the scripting language to implement any of PuTTY itself. Revision-number: 5693 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:58.941693Z PROPS-END Revision-number: 5694 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:13:58.952760Z PROPS-END Revision-number: 5695 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2005-04-27T20:30:47.833096Z K 7 svn:log V 51 Make palette changes use "best match" colours too. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3e3fffb1414d952b70b2dde028efe7cf Text-delta-base-sha1: 5f232610c8e80bc64c0fd69198c2968201a506cb Text-content-length: 44 Text-content-md5: c5d243fbae8e1d2163ab5ba5fabdbe3e Text-content-sha1: 187fdf980fc1b1e7eeee42c1d1755a936d14b764 Content-length: 44 SVN�����r�� vTRUK�>=��= Revision-number: 5696 Prop-content-length: 382 Content-length: 382 K 8 svn:date V 27 2005-04-27T21:09:45.491460Z K 7 svn:log V 283 On 1bpp displays, ignore colour attributes. This makes pterm minimally useful there, though (e.g.) switching to using reverse video for the cursor would probably also help. Displays with other silly depths (e.g. 2bpp) aren't catered for, but I suspect they're rare in the X world. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5d243fbae8e1d2163ab5ba5fabdbe3e Text-delta-base-sha1: 187fdf980fc1b1e7eeee42c1d1755a936d14b764 Text-content-length: 479 Text-content-md5: ea88f4ff911e76fe590be9a387d1e876 Text-content-sha1: 2b72972d3f954b97c2025f80b999f4c8848b1013 Content-length: 479 SVN����/�M�/�z int monochrome = gtk_widget_get_visual(dctx->inst->area)->depth == 1; if (attr & TATTR_COMBINING) { ncombining = len; len = 1; } else ncombining = 1; nfg = ((monochrome ? ATTR_DEFFG : (attr & ATTR_FGMASK)) >> ATTR_FGSHIFT); nbg = ((monochrome ? ATTR_DEFBG : (attr & ATTR_BGMASK)�=?�=�UITEM("Restart Session", restart_session_menuitem); inst->restartitem = menuitem; gtk_widget_hide(inst->restartitem); MK Revision-number: 5697 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2005-04-27T21:22:40.004456Z K 7 svn:log V 36 Tiny manual CSE of previous commit. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ea88f4ff911e76fe590be9a387d1e876 Text-delta-base-sha1: 2b72972d3f954b97c2025f80b999f4c8848b1013 Text-content-length: 45 Text-content-md5: a1885ee69c55c809178f447817118604 Text-content-sha1: 87ae974812e6159a5fae4781f60e1634b3b0f93c Content-length: 45 SVN���� �x��~UITEM(�?9��9 Revision-number: 5698 Prop-content-length: 254 Content-length: 254 K 8 svn:date V 27 2005-04-27T21:42:51.573401Z K 7 svn:log V 155 On monochrome displays, display the cursor in reverse video so that it's visible on reversed out text. This only applies to active block cursors for now. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a1885ee69c55c809178f447817118604 Text-delta-base-sha1: 87ae974812e6159a5fae4781f60e1634b3b0f93c Text-content-length: 211 Text-content-md5: 4e47b9abce077ab84c6bb49bbebfa3f3 Text-content-sha1: 9db3add715c7f4eeaac6ab63b9749971c606cf7e Content-length: 211 SVN����e��@�%�jX!!(attr & ATTR_REVERSE) ^ (monochrome && (attr & TATTR_ACTCURS))(attr & TATTR_ACTCURS) && !monochrome�9w>�9�ITEM("New Session", new_session_menuitem); MKMENUITEM( Revision-number: 5699 Prop-content-length: 523 Content-length: 523 K 8 svn:date V 27 2005-04-28T08:21:04.348011Z K 7 svn:log V 424 Fix two more stupid bugs in 3des-ctr: - We were using the first word of each block of keystream block twice and the second not at all. - We were incrementing the high-order word of the counter after every block rather than the low-order one. With those fixed, our 3des-ctr implementation interoperates with the one in Moussh. Thanks to der Mouse for his help with the testing. 3des-ctr is now enabled by default. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: abf78abc5f49e81ca7d0ce34bb7bd1e6 Text-delta-base-sha1: c0340bcb8badd01baa0ed9356a58c59090ae74a1 Text-content-length: 332 Text-content-md5: dda48ea20012d0d20766c1f57da0f471 Text-content-sha1: adbfa29ef687cbc959fde6497a4804055f24271a Content-length: 332 SVN��:�7��ev�?N�M2�dw�r?�NM�9"�{static void des_sdctr31]); src += 4; dest += 4; if ((iv1 = (iv1 + 1) & 0xffffffff) == 0) iv0 = (iv0 + 1) & 0xffffffff; } scheds->iv0 = iv0; scheds->iv1 = iv1; }static void des3_ssh2_sdctrsdctr3(blk, blk, len, keys); } &ssh_3des_ssh2_ctr, Revision-number: 5700 Prop-content-length: 245 Content-length: 245 K 8 svn:date V 27 2005-04-28T08:24:46.322584Z K 7 svn:log V 146 In blowfish-ctr mode, increment the counter in the correct order. Thanks to der Mouse for spotting the same error in my 3des-ctr implementation. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshblowf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d52a21e082b1c634950ead6cf429bfea Text-delta-base-sha1: 12d3146c2be442bc4be804feb923d2aa8cca5518 Text-content-length: 74 Text-content-md5: 164112d7fcd3a5c68db4cdb383eb1aae Text-content-sha1: 9fca193e93e27188ae47de3e11f93dfe91b2c56d Content-length: 74 SVN�� 1���;O1 = (iv1 + 1) & 0xffffffff) == 0) iv0 = (iv0 Revision-number: 5701 Prop-content-length: 215 Content-length: 215 K 7 svn:log V 116 Enable blowfish-ctr by default. It's been tested and found working. Thanks to der Mouse for help with the testing. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-04-28T08:56:03.151412Z PROPS-END Node-path: putty/sshblowf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 164112d7fcd3a5c68db4cdb383eb1aae Text-delta-base-sha1: 9fca193e93e27188ae47de3e11f93dfe91b2c56d Text-content-length: 155 Text-content-md5: 50dc06cd19283dbdea58dcb56d2f81c9 Text-content-sha1: af18f58bcf97dd8cef22043de8969c02500cd04d Content-length: 155 SVN�� V7W�^��,~�h1�9�a[�6\�W�sW�y static const struct ssh2_cipher *const blowfish_list[] = { &ssh_blowfish_ssh2_ctr, Revision-number: 5702 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2005-04-28T09:00:50.820022Z K 7 svn:log V 68 Remove comment explaining why 3des-ctr is disabled, since it isn't. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dda48ea20012d0d20766c1f57da0f471 Text-delta-base-sha1: adbfa29ef687cbc959fde6497a4804055f24271a Text-content-length: 24 Text-content-md5: 7144b5af66a4cbc5489849f0acf34457 Text-content-sha1: 0c0e08e18b5b06d5702870e6b47c4bd2114ad55a Content-length: 24 SVN�� ��N��I; Revision-number: 5703 Prop-content-length: 144 Content-length: 144 K 10 svn:author V 3 ben K 8 svn:date V 27 2005-04-28T09:03:16.803303Z K 7 svn:log V 46 Minimally document 3des-ctr and blowfish-ctr. PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc6bcec98953453a2962ebb543fcb573 Text-delta-base-sha1: 8ac0100ca89abc9dc365085603110ab82089d3a3 Text-content-length: 188 Text-content-md5: a10a0baefea55950c7a6cb4911248f4b Text-content-sha1: 1eb4ae5ffca1f8e03ec98f80ce2ea886ce1f362b Content-length: 188 SVN���� ]�O�]�Tx256-bit SDCTR (SSH-2 only) or 128-bit CBC \b \ii{Triple-DES} - 168-bit SDCTR (SSH-2 only) or�G{4�G�>} to specify a character numerically, and \c{^~} to Revision-number: 5704 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 31 CTR modes are now implemented. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-04-28T12:04:43.069997Z PROPS-END Node-path: putty-wishlist/data/ssh2-ctr-modes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 81fb4a1cfc2d27c45935ad49bfd515c9 Text-delta-base-sha1: 669f364c0f3f50055f45d1bf7f4d483412a4342f Text-content-length: 146 Text-content-md5: 151782b5f58b9ea685c3912449a45081 Text-content-sha1: 6906cc23fab076d1da37d1bae2dfd2d84700ed40 Content-length: 146 SVN�� }�_��2^iFixed-in: 2005-04-29relevant ones (3des-ctr, aes128-ctr, aes192-ctr, aes256-ctr, blowfish-ctr) are now implemented in PuTTY. Revision-number: 5705 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.445825Z PROPS-END Revision-number: 5706 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.464526Z PROPS-END Revision-number: 5707 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.478169Z PROPS-END Revision-number: 5708 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.493087Z PROPS-END Revision-number: 5709 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.507960Z PROPS-END Revision-number: 5710 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.527316Z PROPS-END Revision-number: 5711 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.545597Z PROPS-END Revision-number: 5712 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.560817Z PROPS-END Revision-number: 5713 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.578921Z PROPS-END Revision-number: 5714 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.596693Z PROPS-END Revision-number: 5715 Prop-content-length: 251 Content-length: 251 K 8 svn:date V 27 2005-04-30T14:26:46.538642Z K 7 svn:log V 152 Fix stupid typo that probably utterly broke SSH-1 support, and caused compiles with GCC to fail. Not sure how it survived long enough to test, really. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3a7429c7b8f585c8c3cad70581ccf04c Text-delta-base-sha1: 4f4e840103005aaadc661169795da85e394e7980 Text-content-length: 61 Text-content-md5: ec4f37f277044224ee9c3f650728a793 Text-content-sha1: be5852cc55e1810cecfa1c0330502d8bd7ed9c8d Content-length: 61 SVN���� ��4��L3�����=�56�5� Revision-number: 5716 Prop-content-length: 367 Content-length: 367 K 8 svn:date V 27 2005-04-30T14:30:07.235181Z K 7 svn:log V 268 Unlike the AES and Blowfish code, our implementations of the various DES modes of operation all took separate source and destination pointers. They were never called with those pointers different, though, so reduce them to a single pointer like everything else uses. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7144b5af66a4cbc5489849f0acf34457 Text-delta-base-sha1: 0c0e08e18b5b06d5702870e6b47c4bd2114ad55a Text-content-length: 1668 Text-content-md5: 93142330a9b79034ff54ba7ef3189817 Text-content-sha1: d14c0b2b9fe8ce34143e62216bc6eb355305a425 Content-length: 1668 SVN��]H-� ��k>!�L>�%N�Z-�yJi�N7� E�?�I~�u7�?f�uh�m{�D�m?�-p�&"�dz�)g�q?�.9�Ul�ZF�Z%�:� %�It�q?�6ablkblk); iv1 ^= GET_32BIT_MSB_FIRST(blk + 4); des_encipher(out, iv0, iv1, sched); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_MSB_FIRST(blk, iv0); PUT_32BIT_MSB_FIRST(blk + 4, iv1); blk += 8; } sched->iv0 = iv0; sched->iv1 = iv1; } static void des_cbc_decrypt(unsigned char *blkblk); xR = GET_32BIT_MSB_FIRST(blk + 4)blk, iv0); PUT_32BIT_MSB_FIRST(blk + 4, iv1); blk += 8blk, unsigned int len, DESContext * scheds) { des_cbc_encrypt(blk, len, &scheds[0]); des_cbc_decrypt(blk, len, &scheds[1]); des_cbc_encrypt(blk, len, &scheds[2]); } static void des_cbc3_encrypt(unsigned char *blkiv0 ^= GET_32BIT_MSB_FIRST(blk); iv1 ^= GET_32BIT_MSB_FIRST(blk + 4)blk, iv0); PUT_32BIT_MSB_FIRST(blk + 4, iv1); blk += 83cbc_decrypt(unsigned char *blk, unsigned int len, DESContext * scheds) { des_cbc_decrypt(blk, len, &scheds[2]); des_cbc_encrypt(blk, len, &scheds[1]); des_cbc_decrypt(blk, len, &scheds[0]); } static void des_cbc3_decrypt(unsigned char *blkblk); xR = GET_32BIT_MSB_FIRST(blk + 4)blk, iv0); PUT_32BIT_MSB_FIRST(blk + 4, iv1); blk += 8blkblk); PUT_32BIT_MSB_FIRST(blk, tmp ^ b[0]); blk += 4; tmp = GET_32BIT_MSB_FIRST(blk); PUT_32BIT_MSB_FIRST(blk, tmp ^ b[1]); blklen, keys); } static void des3_de3cbc_decrypt(len, keys); } static void des3_ssh2_sdctrsdctr3(len, keys); } static void des_ssh2_dedecrypt(24, &dc); } void des_dedecrypt(len, keys); } static void des_dedecrypt( Revision-number: 5717 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.980117Z PROPS-END Revision-number: 5718 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:00.992233Z PROPS-END Revision-number: 5719 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2005-04-30T16:13:11.156888Z K 7 svn:log V 92 X11 authentication data are generally sensitive, so blank them from packet logs by default. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec4f37f277044224ee9c3f650728a793 Text-delta-base-sha1: be5852cc55e1810cecfa1c0330502d8bd7ed9c8d Text-content-length: 176 Text-content-md5: 063f5f6ed1891d3b9645bc3e2c8f6a4c Text-content-sha1: 4b413e8be75eb242de32608f1c388df517d696fe Content-length: 176 SVN����������������6 w�>�w�V`dont_log_password(ssh, s->pktout, PKTLOG_BLANK); ssh2_pkt_addstring(s->pktout, data); end_log_omission(ssh, s->pktout Revision-number: 5720 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2005-04-30T17:08:48.319920Z K 7 svn:log V 123 Also blank X authentication data when using SSH-1, and add a comment explaining why this may not be sufficient to hide it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 063f5f6ed1891d3b9645bc3e2c8f6a4c Text-delta-base-sha1: 4b413e8be75eb242de32608f1c388df517d696fe Text-content-length: 1149 Text-content-md5: 6790263d7c53df4dcbf61e42875b43d8 Text-content-sha1: a1170dc35ffeabbc78ab2597febae3ef1a500eca Content-length: 1149 SVN������������c�0� a�z�n$/* * Note that while we blank the X authentication data here, we don't * take any special action to blank the start of an X11 channel, * so using MIT-MAGIC-COOKIE-1 and actually opening an X connection * without having session blanking enabled is likely to leak your * cookie into the log. */ PKTT_PASSWORD, PKT_STR, data, PKTT_OTHER PKTT_PASSWORD, PKT_STR, data, PKTT_OTHER� +n�>�0�O<fered public key"); crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_USERAUTH_PK_OK) { s->gotit = TRUE; s->type = AUTH_TYPE_PUBLICKEY_OFFER_LOUD; continue; /* key refused; give up on it */ } logevent("Offer of public key accepted"); /* * Actually attempt a serious authentication using * the key. *//* * Note that while we blank the X authentication data here, we don't * take any special action to blank the start of an X11 channel, * so using MIT-MAGIC-COOKIE-1 and actually opening an X connection * without having session blanking enabled is likely to leak your * cookie into the log. */ Revision-number: 5721 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.363258Z PROPS-END Revision-number: 5722 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.375686Z PROPS-END Revision-number: 5723 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.386110Z PROPS-END Revision-number: 5724 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.396855Z PROPS-END Revision-number: 5725 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.408572Z PROPS-END Revision-number: 5726 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.420539Z PROPS-END Revision-number: 5727 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.431814Z PROPS-END Revision-number: 5728 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.444384Z PROPS-END Revision-number: 5729 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.472607Z PROPS-END Revision-number: 5730 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.484880Z PROPS-END Revision-number: 5731 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.497102Z PROPS-END Revision-number: 5732 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.507013Z PROPS-END Revision-number: 5733 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.518687Z PROPS-END Revision-number: 5734 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.531679Z PROPS-END Revision-number: 5735 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.542734Z PROPS-END Revision-number: 5736 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.553325Z PROPS-END Revision-number: 5737 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.563244Z PROPS-END Revision-number: 5738 Prop-content-length: 209 Content-length: 209 K 8 svn:date V 27 2005-05-03T15:46:09.021841Z K 7 svn:log V 110 Mention that we think our trimmed manifests were valid. Explicitly mention that running 0.57 is a workaround. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 44b1efb29ec066735dc4d3c65327cf04 Text-delta-base-sha1: f475f7c6dc096024575834100dfa59c1b2245198 Text-content-length: 153 Text-content-md5: 7f64e108e223e3f9a27c055c29ab2462 Text-content-sha1: c0d3009b247b0af7a012ce1e238529a4d49d30d1 Content-length: 153 SVN��&' ���@�&�@the trimmed version conformed to Microsoft's specifications, and<p> Alternatively, PuTTY 0.57 doesn't suffer from this problem. Revision-number: 5739 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.665636Z PROPS-END Revision-number: 5740 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.697888Z PROPS-END Revision-number: 5741 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.708153Z PROPS-END Revision-number: 5742 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.718840Z PROPS-END Revision-number: 5743 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.729594Z PROPS-END Revision-number: 5744 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.739766Z PROPS-END Revision-number: 5745 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:02.749943Z PROPS-END Revision-number: 5746 Prop-content-length: 186 Content-length: 186 K 7 svn:log V 86 Another reason for this <B419E15B0DE17C4BB4912FC88E05A8D8016D7575@finmail13.nordic.x> K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-04T13:37:27.195501Z PROPS-END Node-path: putty-wishlist/data/avoid-msgbox Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b0b54b4046d7bfaa014380567a3589dd Text-delta-base-sha1: ef9c68a4b0d26435f563835a166a13453d7a5ee8 Text-content-length: 145 Text-content-md5: 9a200d1d6d46251d88a80e6095956382 Text-content-sha1: f3ee1edfcaf65e2c6e661c9bde91d61d7d01fe63 Content-length: 145 SVN��{ {�^�{�"](For instance, if a network connection dies, apparently the message boxes get in the way of WinXP's "close group" feature.) Revision-number: 5747 Prop-content-length: 129 Content-length: 129 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-04T13:47:54.139370Z K 7 svn:log V 29 Convert rest of item to HTML PROPS-END Node-path: putty-wishlist/data/arcfour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: faa73dec907d69114abe98bd7154aad4 Text-delta-base-sha1: 69c1443feddef785f2a100cbcc922cfd66983795 Text-content-length: 74 Text-content-md5: 197f28f6f5d053cec7222995c335bfc3 Text-content-sha1: d42378796dfe467197925b33d9a51b5e65d419f2 Content-length: 74 SVN��*�k��C�"H�hx-html-body Fixed-in: 2005-04-22 <p><p>p> Revision-number: 5748 Prop-content-length: 327 Content-length: 327 K 8 svn:date V 27 2005-05-05T22:37:54.772152Z K 7 svn:log V 226 Implement `bypass-ssh2-userauth', since from correspondence it sounds like there are servers which could in principle operate in this mode, although I don't know if any do in practice. (Hence, I haven't been able to test it.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d71b95431bb5bdc585387d80bf8cb0b9 Text-delta-base-sha1: 7d5b425223eeac8f98c41a0d59d2821c64c4bd51 Text-content-length: 216 Text-content-md5: 1c86c8b726801b7c54bcd22dfa29a3ff Text-content-sha1: 55476efb4cb8f52cea5598f8123fc9d5dc110c1a Content-length: 216 SVN��0!<��<�^Rain", NULL); ctrl_checkbox(s, "Bypass authentication entirely (SSH-2 only)", 'b', HELPCTX(ssh_auth_bypass), dlg_stdcheckbox_handler, I(offsetof(Config,ssh_no_userauth)) Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a10a0baefea55950c7a6cb4911248f4b Text-delta-base-sha1: 1eb4ae5ffca1f8e03ec98f80ce2ea886ce1f362b Text-content-length: 1363 Text-content-md5: feea546d3c28f4469cf0b71346aaefef Text-content-sha1: 404e2b9bc8ef94252bc4083a665888f574a58916 Content-length: 1363 SVN���� �� �uqnoauth} \q{Bypass authentication entirely} \cfg{winhelp-topic}{ssh.auth.bypass} In SSH-2, it is possible to establish a connection without using SSH's mechanisms to identify or authenticate oneself to the server. Some servers may prefer to handle authentication in the data channel, for instance, or may simply require no authentication whatsoever. By default, PuTTY assumes the server requires authentication (most do), and thus must provide a username. If you find you are getting unwanted username prompts, you could try checking this option. This option only affects SSH-2 connections. SSH-1 connections always require an authentication step�{�{� they are most likely to have a useful effect on such systems. (These are the same settings that can usually be changed using the \i\c{stty} command once logged in to such servers.) Some notable modes are described below; for fuller explanations, see your server documentation. \b \I{ERASE special character}\cw{ERASE} is the character that when typed by the user will delete one space to the left. When set to \q{Auto} (the default setting), this follows the setting of the local Backspace key in PuTTY (see \k{config-backspace}). \lcont{ This and other \i{special character}s are specified using \c{^C} notation for Ctrl-C, and so on. Use \c{^<27>} or \c{^<0x1B Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 666d94268ab95ce67bb1cdf9d107f726 Text-delta-base-sha1: d7c93d217ed296384e437557b0d4b3d02d4d767e Text-content-length: 85 Text-content-md5: 6c7dede4578e7a892f2081508baae0c0 Text-content-sha1: 0379330267cd4868055f0dd90041885fa3b2bafe Content-length: 85 SVN��W =�n��ubssh_no_userauth; /* bypass "ssh-userauth" (SSH-2 only) Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 761409e63cef78bfbee40c405e128b72 Text-delta-base-sha1: 7571e45dd14916869c67cd8bbb1f7edb2fc43500 Text-content-length: 98 Text-content-md5: 4098866516e313563b008a7e54d8f4f1 Text-content-sha1: e1c570dc42e14ca4759c04feae9dd64e646759ba Content-length: 98 SVN��e`D���%m�i|SshNoAuth", cfg->ssh_no_userauthSshNoAuth", 0, &cfg->ssh_no_userauth Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6790263d7c53df4dcbf61e42875b43d8 Text-delta-base-sha1: a1170dc35ffeabbc78ab2597febae3ef1a500eca Text-content-length: 1364 Text-content-md5: b7f91eb579e375cdc6a3a0229760785d Text-content-sha1: 5f48780fe6115bb3383bb222a975d7f714e4b880 Content-length: 1364 SVN�����������j���<E�:�4Ddone_service_reqs->done_service_req = FALSE; s->we_are_in = FALSE; if (!ssh->cfg.ssh_no_userauth) { /* * Request userauth protocol, and await a response to it. */ s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST); ssh2_pkt_addstring(s->pktout, "ssh-userauth"); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type == SSH2_MSG_SERVICE_ACCEPT) s->done_service_req = TRUE; } if (!s->done_service_req) { /* * Request connection protocol directly, without authentication. */ s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST); ssh2_pkt_addstring(s->pktout, "ssh-connection"); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type == SSH2_MSG_SERVICE_ACCEPT) { s->we_are_in = TRUE; /* no auth required */ } else { bombout(("Server refused service request")); crStopV; }while (!s->we_are_in)�+&�CE�Y�K�z1publickey"); /* method */ ssh2_pkt_addbool(s->pktout, FALSE); /* no signature included */ ssh2_pkt_addstring(s->pktout, algorithm); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, (char *)pub_blob, pub_blob_len); ssh2_pkt_send(ssh, s->pktout); logevent("Of /* * Now the connection protocol has started, one way or another Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 816e5e4cd40cf66e291f1756184617ff Text-delta-base-sha1: 10d764f70b974e0df39d049d997c9c3cd35207af Text-content-length: 44 Text-content-md5: c61750f459ef9ee472df731ecfbac3fa Text-content-sha1: 5bd76b0558cf615743a3958a2740a8d7bc16bd8b Content-length: 44 SVN��U �Z��;bypass "ssh.auth.bypass Node-path: putty-wishlist/data/bypass-ssh2-userauth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d21e08fa509ea6218e0ef89715ac910 Text-delta-base-sha1: 887208930b5cd2932e8276000ba093cd7863ac5a Text-content-length: 39 Text-content-md5: 2efd9a0f9e33f1b59d583382c98a1acd Text-content-sha1: 24d55ab7613041c9c6c8bf8d97930d63ca8c0baf Content-length: 39 SVN��DY�b��caFixed-in: 2005-05-06 Revision-number: 5749 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2005-05-05T22:47:30.203917Z K 7 svn:log V 46 Correct apparent misspelling of `SIOCATMARK'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f904a16dbb6f88293d121866138abca Text-delta-base-sha1: 050fb07676280f86e080f51c6a28415dc2320ea6 Text-content-length: 27 Text-content-md5: d95522af2325e689a0d24f54805bf345 Text-content-sha1: c80b3128bc8f0c899a7f2e799f9fe931ddb5649c Content-length: 27 SVN��FF �o��TrIOC Revision-number: 5750 Prop-content-length: 117 Content-length: 117 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-05T23:24:06.479978Z K 7 svn:log V 17 Add PuttyConfer. PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2cb0945f60010d3760155c66b193b478 Text-delta-base-sha1: eb6d4054aac0b2aa1e2785551a85c8f99d7bb164 Text-content-length: 142 Text-content-md5: b1ffdb8c3e12cecda97f18dd0c574c80 Text-content-sha1: 329ab1566bb49b4bd889652dbe20121944c9888f Content-length: 142 SVN��-G x�S�x�|1thiago.joi.com.br/andre/puttyconfer.html"> PuttyConfer</a>, for importing, exporting, and mass modification of PuTTY Revision-number: 5751 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2005-05-05T23:38:18.761738Z K 7 svn:log V 28 neacm.fe.up.pt abderian.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ad51f7c9edb57944012f97b367ad0c1b Text-delta-base-sha1: 201b0fcbcab45cac714ddc4692e50069a85df9fd Text-content-length: 244 Text-content-md5: 4e92f927681c3821c43b3208731f54db Text-content-sha1: def3b3f662912a7ddcac874d91cb096ddcc78a89 Content-length: 244 SVN��7'?�;��A@�A@�*-�R}�R}�M}�5neacm.fe.up.pt/pub/putty/">neacm.fe.up.pt</a> in Portugalgaesi.org/">putty.gaesi.org</a> in Portugalwww.abderian.com/putty/">abderian.mirror99.com/">putty.mirror99.gonorar.com/">putty.gonorar Revision-number: 5752 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2005-05-06T10:19:34.449538Z K 7 svn:log V 31 Add `install-sh' to svn:ignore K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 210 Content-length: 210 K 10 svn:ignore V 177 Makefile.gtk Makefile.in Makefile aclocal.m4 autom4te.cache config.status configure install-sh local plink pterm putty puttytel psftp pscp puttygen uxconfig.in uxconfig.h *.log PROPS-END Revision-number: 5753 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:03.585040Z PROPS-END Revision-number: 5754 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:03.595388Z PROPS-END Revision-number: 5755 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:03.607813Z PROPS-END Revision-number: 5756 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:03.618843Z PROPS-END Revision-number: 5757 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:03.630413Z PROPS-END Revision-number: 5758 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:03.640758Z PROPS-END Revision-number: 5759 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:03.651520Z PROPS-END Revision-number: 5760 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2005-05-07T16:09:03.283309Z K 7 svn:log V 147 Simon points out that there can be multiple proxy connections, which will inform the design of this feature. Also expand some of the other points. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy-password-prompt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b9fa2e07be64539f09808002369521b Text-delta-base-sha1: 851ec8ee97375e5f02a46f0d8c457c66f7719149 Text-content-length: 1656 Text-content-md5: 293be3f537a828ab41a1c9a0082a81b5 Text-content-sha1: e14a9ae0792b79dccf5d54674ba30b05de4e1977 Content-length: 1656 SVN��~N66 �r�x�kq�b#I�;�`/T�ca�'h�\"vnummary: Should be able to prompt for a proxy password Class: wish Priority: medium Difficulty: tricky Content-type: text/x-html-body <p><p> Note that PuTTY can make multiple connections through a proxy (for instance for connections initiated by SSH port-forwarding). Since we may not have a convenient channel to interact with the user at the time a proxy connection is initiated, we'll have to prompt for the credentials before making a connection, and cache them in memory for the duration of the session. <p>. This means that if you get your password wrong, you won't be prompted to retry (you'll have to <a href="reuse-windows">restart the session</a> or something similar). Similarly, we can't quietly attempt to log in without a password and then prompt the user only when necessary; the user has to be able to specify whether authentication should be attempted, and if it is, they <em>will</em> be prompted. <p><em>think</em> any of them support the sending of username but no password (as opposed to an empty password). <p> Therefore I think this change to the proxy authentication UI should suffice: <p><pre></pre> <p> and would map onto proxy types as follows: <ul> <li>telnet: if checked, <tt>%user</tt> and <tt>%pass</tt> as specified, otherwise zero-length <br>(could be generous and only prompt for <tt>%user</tt> and <tt>%pass</tt> if they appear in the command string) <li><li>SOCKS5: if checked, user/pass as specified, otherwise don't attempt auth <li><li>proxy command: similar to telnet </ul> <p><a href="proxy-logging">`proxy-logging'</a> too. <p> Revision-number: 5761 Prop-content-length: 131 Content-length: 131 K 7 svn:log V 31 Missing suffixes + quirkafleeg K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-07T16:13:12.676611Z PROPS-END Node-path: putty-wishlist/data/proxy-password-prompt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 293be3f537a828ab41a1c9a0082a81b5 Text-delta-base-sha1: e14a9ae0792b79dccf5d54674ba30b05de4e1977 Text-content-length: 38 Text-content-md5: 62e6b20dbb2cff9fcce82bbe6def2c60 Text-content-sha1: 541e9fb980403b304c0031d3c2cbbd8faf3d2f82 Content-length: 38 SVN��NW �U�|W�{SS.html.html Revision-number: 5762 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2005-05-08T11:47:59.523634Z K 7 svn:log V 93 Fix what looks like a cut-and-paste error which was stopping Unix Plink building on MacOS X. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 21e76a934e937352dcbb8c49669888af Text-delta-base-sha1: cb65bdcb3cc9b08ace9196c55c71c97a8edd62f3 Text-content-length: 27 Text-content-md5: 82d15fd11333a316d6745c298ef310b0 Text-content-sha1: 443db9e14e4b7f638679b7092ccfc40fa6bda22e Content-length: 27 SVN��z{ ���jRET Revision-number: 5763 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2005-05-09T12:53:37.749750Z K 7 svn:log V 36 Richard B points out a broken link. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/win-canonical-hostname Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1b51179a996434d28292e6ab7c2f6151 Text-delta-base-sha1: 6c7f3fbee1fb68e2dfec219eab086742c0f54a21 Text-content-length: 128 Text-content-md5: 88af40ee1b37419fed10163eee2a9f42 Text-content-sha1: b4d30a9d14844c11c75a6735003d70191eab66dc Content-length: 128 SVN��#) j�k�j�TO-build.html">IPv6 support</a>, on modern versions of Windows, the hostname displayed in the title bar has Revision-number: 5764 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2005-05-09T13:27:51.373914Z K 7 svn:log V 59 Make Makefile.gtk build again on Linux (assume <utmpx.h>). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85773ffbee866e97248a58fa4308f046 Text-delta-base-sha1: ef73a9f0bfa4952ba09a8d031f6eb1636847e9bb Text-content-length: 38 Text-content-md5: ad3d97abaca68f2b26bb2a8d84b10206 Text-content-sha1: 667e81c4e3acda5741c7569d28eeb026772007f8 Content-length: 38 SVN��<: �)��9ndef OMIT_UTMP Revision-number: 5765 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 s/public/private/ spotted by Walter Cleverly. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-09T21:01:11.500109Z PROPS-END Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a06d9ccb86ef85d3c0c8c1664a5d8604 Text-delta-base-sha1: 8dda60fa581141748fb5417283fc8c1a376e7790 Text-content-length: 27 Text-content-md5: c956288cc3c3b4dc8e13e3a2c87b626a Text-content-sha1: 72c300d0c88eb139d68460585677b850eac7a975 Content-length: 27 SVN��HI ���Drivate Revision-number: 5766 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:04.096300Z PROPS-END Revision-number: 5767 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:04.106502Z PROPS-END Revision-number: 5768 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:04.118062Z PROPS-END Revision-number: 5769 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:04.128585Z PROPS-END Revision-number: 5770 Prop-content-length: 349 Content-length: 349 K 7 svn:log V 248 Summary: Crash with SSH keyboard-interactive packet with multiple prompts Priority: high Absent-in: 0.57 Present-in: 0.58 2005-05-11 Since this turns out to be a regression rather than an "it never worked", I should treat it as a higher priority. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-12T11:58:42.680288Z PROPS-END Node-path: putty-wishlist/data/ki-multiprompt-crash Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 622 Text-content-md5: 6a56cd5f62d1cd838d32a0e16fe6dbc4 Text-content-sha1: b573e4ef28a74ad572dcd0cffe2173d01f4405d0 Content-length: 632 PROPS-END SVN���```Summary: Crash with SSH keyboard-interactive packet with multiple prompts Class: bug Difficulty: tricky Priority: high Absent-in: 0.57 Present-in: 0.58 2005-05-11 Content-type: text/x-html-body <p> In an SSH-2 session, if PuTTY is presented with a single `keyboard-interactive' packet containing multiple prompts, it will crash after the first prompt. This only affects PuTTY proper; the non-GUI tools (PSCP, PSFTP, Plink) should work fine. <p> This problem has the same root cause as <a href="ssh1-bad-passphrase-crash.html">`ssh1-bad-passphrase-crash'</a>, and should be fixed by the same rearrangement. Revision-number: 5771 Prop-content-length: 346 Content-length: 346 K 7 svn:log V 245 Remove link to unfix.org IPv6 build now that it's in the main code. (Also the win6.jp guy linked to from here seems to have decided that our code is good enough and stopped work on his fork.) The link's still in the wishlist if anyone wants it. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-12T13:02:03.348801Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b1ffdb8c3e12cecda97f18dd0c574c80 Text-delta-base-sha1: 329ab1566bb49b4bd889652dbe20121944c9888f Text-content-length: 20 Text-content-md5: 8469aceaebc73d0c742deb68f658d480 Text-content-sha1: 11f059b66b32a18db03c0a6f7c85ac2c38ca45ad Content-length: 20 SVN��G �� ��wP Revision-number: 5772 Prop-content-length: 306 Content-length: 306 K 8 svn:date V 27 2005-05-12T15:09:35.537169Z K 7 svn:log V 205 Use the packet dispatch table to handle USERAUTH_BANNER messages, which should hopefully solve `drop-banner'. I haven't been able to test the failure case, but the behaviour with OpenSSH appears no worse. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b7f91eb579e375cdc6a3a0229760785d Text-delta-base-sha1: 5f48780fe6115bb3383bb222a975d7f714e4b880 Text-content-length: 2151 Text-content-md5: a129cc61ac759820a55598dcba08aed8 Text-content-sha1: 78caa75a8fde1ee86192378a4b2873c31642d660 Content-length: 2151 SVN����B�L�B�rGbufchain banner; /* accumulates banners during do_ssh2_authconn */���*4G�%�� k�#1�* s�:zenge"); if (challengelen > sizeof(s->prompt) - 1) challengelen * Buffer banner messages for later display at some convenient point. */ static void ssh2_msg_userauth_banner(Ssh ssh, struct Packet *pktin) { /* Arbitrary limit to prevent unbounded inflation of buffer */ if (bufchain_size(&ssh->banner) <= 131072) { char *banner = NULL; int size = 0; ssh_pkt_getstring(pktin, &banner, &size); if (banner) bufchain_add(&ssh->banner, banner, sizebufchain_init(&ssh->banner); ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = ssh2_msg_userauth_banner/* * Now is a convenient point to spew any banner material * that we've accumulated. (This should ensure that when * we exit the auth loop, we haven't any left to deal * with.) */ { int size = bufchain_size(&ssh->banner)size && (flags & (FLAG_VERBOSE | FLAG_INTERACTIVE))) { char *banner = snewn(size, char); bufchain_fetch(&ssh->banner, banner, size); c_write_untrusted(ssh, banner, size); sfree(banner); } bufchain_clear(&ssh->banner�&-L�b��Ea s->authed = TRUE; break; } else { logevent ("Pageant failed to answer challenge"); sfree(s->ret); } } } if (s->authed) continue; } sfree(s->response); } if (!s->method && s->can_pubkey && s->publickey_blob && !s->tried_pubkey_config) { unsigned char *pub_blob; char *algorithm, *comment; int pub_blob_len; s->tried_pubkey_config = TRUE; ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh->pkt_ctx |= SSH2_PKTCTX_PUBLICKEY; /* * Try the public key supplied in the configuration. * * First, offer the public blob to see if the server is * willing to accept it. */ pub_blob = (unsigned char *)ssh2_userkey_loadpub(&ssh->cfg.keyfile, &algorithm, &pub_blob_len, NULL); if (pub_blob) { s->pktout = ssh2_pkt_init ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = NULL; Node-path: putty-wishlist/data/drop-banner Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: afa6e7715eded428f45d125a3988b42e Text-delta-base-sha1: 3471d7a7db0d7b18c1dec1764c17bc26a1557b58 Text-content-length: 420 Text-content-md5: cd7a19e31aace71c0c0e7ffd6950bd4e Text-content-sha1: 92e3c4536fde594769cac5958f242b527590b5fb Content-length: 420 SVN��y ���iwFixed-in: 2005-05-13 <p> <em>Update:</em> this should now be fixed (using the "alternative solution" above). I've not got access to a server that I can actually test against, however. The original problem report was against <a href="http://www.bitvise.com/winsshd.html">WinSSHD</a>; if someone can confirm that the problem still exists with 0.58 but is fixed in the snapshots, that'd be useful. Revision-number: 5773 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:04.588229Z PROPS-END Revision-number: 5774 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:04.600121Z PROPS-END Revision-number: 5775 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:04.611076Z PROPS-END Revision-number: 5776 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:04.621590Z PROPS-END Revision-number: 5777 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:04.631831Z PROPS-END Revision-number: 5778 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:04.642811Z PROPS-END Revision-number: 5779 Prop-content-length: 352 Content-length: 352 K 8 svn:date V 27 2005-05-14T22:01:10.001029Z K 7 svn:log V 253 Add experimental support for detecting BREAK on input and propagating it as TS_BRK on output. This is tested to the extent that other data survive the escaping performed by PARMRK, at least on my system. Actual passing on of BREAK is as-yet untested. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 82d15fd11333a316d6745c298ef310b0 Text-delta-base-sha1: 443db9e14e4b7f638679b7092ccfc40fa6bda22e Text-content-length: 2354 Text-content-md5: d8422869033df868d57ffebedf10073e Text-content-sha1: c06d77585ba069d71268417469a13126e57a205d Content-length: 2354 SVN��{  ��_�0 v�I9�y /* * Mark parity errors and (more important) BREAK on input. This * is more complex than it need be because POSIX-2001 suggests * that escaping of valid 0xff in the input stream is dependent on * IGNPAR being clear even though marking of BREAK isn't. NetBSD * 2.0 goes one worse and makes it dependent on INPCK too. We * deal with this by forcing these flags into a useful state and * then faking the state in which we found them in from_tty() if * we get passed a parity or framing error. */ mode.c_iflag = (mode.c_iflag | INPCK | PARMRK) & ~IGNPAR;/* * Handle data from a local tty in PARMRK format. */ static void from_tty(void *buf, unsigned len) { char *p, *q, *end; static enum {NORMAL, FF, FF00} state = NORMAL; p = buf; end = buf + len; while (p < end) { switch (state) { case NORMAL: if (*p == '\xff') { p++; state = FF; } else { q = memchr(p, '\xff', end - p); if (q == NULL) q = end; back->send(backhandle, p, q - p); p = q; } break; case FF: if (*p == '\xff') { back->send(backhandle, p, 1); p++; state = NORMAL; } else if (*p == '\0') { p++; state = FF00; } else abort(); break; case FF00: if (*p == '\0') { back->special(backhandle, TS_BRK); } else { /* * Pretend that PARMRK wasn't set. This involves * faking what INPCK and IGNPAR would have done if * we hadn't overridden them. Unfortunately, we * can't do this entirely correctly because INPCK * distinguishes between framing and parity * errors, but PARMRK format represents both in * the same way. We assume that parity errors are * more common than framing errors, and hence * treat all input errors as being subject to * INPCK. */ if (orig_termios.c_iflag & INPCK) { /* If IGNPAR is set, we throw away the character. */ if (!(orig_termios.c_iflag & IGNPAR)) { /* PE/FE get passed on as NUL. */ *p = 0; back->send(backhandle, p, 1); } } else { /* INPCK not set. Assume we got a parity error. */ back->send(backhandle, p, 1); } } p++; state = NORMAL; } }if (local_tty) from_tty(buf, ret); else Revision-number: 5780 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2005-05-14T22:23:20.904456Z K 7 svn:log V 106 Summary: When stdout and stderr are ttys, plink's messages stair-step (more complicated than I'd thought) K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/unix-stderr-opost Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 956 Text-content-md5: 30c7c95d3ff9a81a13cc47b90d899726 Text-content-sha1: fce5591d3672ef6c9df11beb69343fdb112e0e5d Content-length: 966 PROPS-END SVN���...Summary: When stdout and stderr are ttys, plink's messages stair-step Class: bug Absent-in: 0.58 Present-in: 2005-04-27 Difficulty: tricky Priority: medium Content-type: text/plain When running in a terminal and requesting a pty on the server, the Unix port of Plink turns off OPOST. It does this to ensure that if an application on the server turns off OPOST in its pty and sends a bare LF, that will make it all the way to Plink's terminal. This, though, causes the problem that if Plink's stderr goes to the same terminal as its stout (the usual situation), Plink's own messages, sent to stderr, won't get their '\n's translated to CRLF. The fix for this is to turn on OPOST around any internally-generated writes to stderr. This is easier said than done since there are many writes to stderr in uxcons.c, and at least one in logging.c. In addition, the writes from (e.g.) ssh.c of application data should probably not be affected. Revision-number: 5781 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:05.898950Z PROPS-END Revision-number: 5782 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:05.910278Z PROPS-END Revision-number: 5783 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:05.921420Z PROPS-END Revision-number: 5784 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:05.936352Z PROPS-END Revision-number: 5785 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:05.950102Z PROPS-END Revision-number: 5786 Prop-content-length: 223 Content-length: 223 K 7 svn:log V 122 Don't try and set up reconfigured port-forwardings if the connection isn't yet ready for them. Spotted by Martin Dushkov. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-16T08:31:05.496033Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a129cc61ac759820a55598dcba08aed8 Text-delta-base-sha1: 78caa75a8fde1ee86192378a4b2873c31642d660 Text-content-length: 77 Text-content-md5: ba3b198d77baecf8ff858e5f0f9d4825 Text-content-sha1: 89a944121463deb18517d55d7265d92c3a6b22ce Content-length: 77 SVN����������������-A �6��w6if (ssh->portfwds) Revision-number: 5787 Prop-content-length: 294 Content-length: 294 K 8 svn:date V 27 2005-05-16T14:41:08.293601Z K 7 svn:log V 193 connection_fatal() should be called after ssh_closing() and other accesses to `ssh', since it potentially frees it and potentially doesn't return. Only affected a couple of rare circumstances. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ba3b198d77baecf8ff858e5f0f9d4825 Text-delta-base-sha1: 89a944121463deb18517d55d7265d92c3a6b22ce Text-content-length: 454 Text-content-md5: f7d407eff600df1dca8458218f930f9c Text-content-sha1: 2b1a44614a5482b76492ba6d070abb7760ff3530 Content-length: 454 SVN�����������u�n�|��xk�cssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); connection_fatal(ssh->frontend, "Unable to authenticate"ssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); connection_fatal(ssh->frontend, "%s", buf s->authed = �A �R�Hyssh->close_expected = TRUE; ssh_closing((Plug)ssh, NULL, 0, 0); connection_fatal(ssh->frontend, "Unable to authenticate" Revision-number: 5788 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:06.564206Z PROPS-END Revision-number: 5789 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:06.574326Z PROPS-END Revision-number: 5790 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:06.584599Z PROPS-END Revision-number: 5791 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:06.595018Z PROPS-END Revision-number: 5792 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:06.604798Z PROPS-END Revision-number: 5793 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:06.615570Z PROPS-END Revision-number: 5794 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:06.625611Z PROPS-END Revision-number: 5795 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2005-05-17T13:58:01.598683Z K 7 svn:log V 74 Escape HTML special characters in headers (spotted by Daniel Meidlinger). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0dac66434945c79e54e0a23e3c0b99b6 Text-delta-base-sha1: 0e70a62145287f4151fe96a1532f722a2f22d198 Text-content-length: 471 Text-content-md5: 2addedf0084d9f3ff55a5615891f5dcb Text-content-sha1: 59afd58b30cdfd1459b83f45cb0930340d6ee918 Content-length: 471 SVN��ph*�7�D�~R��n'�~6 my $txt = html_escape($hdrs->{$h}); print HTML $txt $body = html_escape($body)my $summary = html_escape($bugs{$bugname}->{hdrs}->{summary}summarysummary</a></b>\n]; } else { return qq[<li><a href="$bugname.html">$bugname: ] . qq[$summary</a>\n]; } } sub html_escape { my ($s) = @_; $s =~ s/&/&/g; $s =~ s/</</g; $s =~ s/>/>/g; return $s; } Revision-number: 5796 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.089510Z PROPS-END Revision-number: 5797 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.099758Z PROPS-END Revision-number: 5798 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.110483Z PROPS-END Revision-number: 5799 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.121267Z PROPS-END Revision-number: 5800 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.132583Z PROPS-END Revision-number: 5801 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.144077Z PROPS-END Revision-number: 5802 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.154627Z PROPS-END Revision-number: 5803 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.166609Z PROPS-END Revision-number: 5804 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.177748Z PROPS-END Revision-number: 5805 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.188616Z PROPS-END Revision-number: 5806 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.200833Z PROPS-END Revision-number: 5807 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.211436Z PROPS-END Revision-number: 5808 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.222831Z PROPS-END Revision-number: 5809 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.236340Z PROPS-END Revision-number: 5810 Prop-content-length: 276 Content-length: 276 K 8 svn:date V 27 2005-05-19T17:07:01.835189Z K 7 svn:log V 175 Add in a <!--MIRRORWARNING--> hook to all the web pages (.html and autogenerated) in order that we can tweak the rsync-able copy to distinguish mirrors from the primary site. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 58b2ede27f9fba396140650fc1cf3474 Text-delta-base-sha1: 25ff7ee191f5614419e88949f27649e09c16fa09 Text-content-length: 43 Text-content-md5: 60e279a846e7550ee75184303d966b24 Text-content-sha1: d02803dc4e9f7eec489b733ad1daf02b846ef955 Content-length: 43 SVN�� 5 �*��x(<!--MIRRORWARNING-- Node-path: putty-website/docs.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cf6d2753d27f2b8dd93b82629d59be42 Text-delta-base-sha1: a12abc2fca9c2931ca0c59bcf571fda038078474 Text-content-length: 40 Text-content-md5: 8ac613bd9decc49582739995f6a3174e Text-content-sha1: de1262235ca77945e8a78883be22c22fc914e39c Content-length: 40 SVN��_t �:��'8<!--MIRRORWARNING-- Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ca9c7610f55df20ab88569d1eacc3c13 Text-delta-base-sha1: 6840ff8be1b44038ac2e67fa6844884b75eb4adf Text-content-length: 43 Text-content-md5: a439bb02b917f58a7735317c6f8146c5 Text-content-sha1: 6eac9cfc13ff9032be5412b72eca902261c16321 Content-length: 43 SVN��&; �q��7o<!--MIRRORWARNING-- Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 512e858d911da9406c12e9a5d6b1e109 Text-delta-base-sha1: a63ca82580e799e27f39ed41341ec30fb47674b9 Text-content-length: 40 Text-content-md5: 85700290ede7fbb8a849aef8a79800e8 Text-content-sha1: d081bc3a60374245cbf0badc1884be90e8676e64 Content-length: 40 SVN��DY �H��~F<!--MIRRORWARNING-- Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6081525e1a8b3bf067d1c37759baddfb Text-delta-base-sha1: 135704a8b33c2054041f358e3161a49ccc803666 Text-content-length: 40 Text-content-md5: 839cd5054b78661a21ba04994a0c5454 Text-content-sha1: a18ee1745b3d91a4b37916bd759cc76e90fe8c8d Content-length: 40 SVN��{ �$��Y"<!--MIRRORWARNING-- Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8469aceaebc73d0c742deb68f658d480 Text-delta-base-sha1: 11f059b66b32a18db03c0a6f7c85ac2c38ca45ad Text-content-length: 40 Text-content-md5: 60b104e5c95778faa8447f2113e818d1 Text-content-sha1: b0e1d5dfc726caf4e7763a005acb7fa29bfd293f Content-length: 40 SVN�� � ��c<!--MIRRORWARNING-- Node-path: putty-website/maillist.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 58c2e5252c580c2e45bbfcf61798519c Text-delta-base-sha1: cf504f3441651803fdd19d236acf9418baaff6cf Text-content-length: 40 Text-content-md5: 67f8b44e8920754d25ff05b2d50975f6 Text-content-sha1: 3c3ead006e317f445005181afb68091fa1fda90d Content-length: 40 SVN��=R �$��"<!--MIRRORWARNING-- Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e92f927681c3821c43b3208731f54db Text-delta-base-sha1: def3b3f662912a7ddcac874d91cb096ddcc78a89 Text-content-length: 43 Text-content-md5: 2689ea3d92bd2bb14f29f1d21f72e378 Text-content-sha1: 9050384af346bd58ad878a899b1ef68563848aa4 Content-length: 43 SVN��. �6��e4<!--MIRRORWARNING-- Node-path: putty-website/team.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 44294672de70ea6f100c062128d9e940 Text-delta-base-sha1: 42da80bf8dc41a1d1dbeb4bb17ab63377d030740 Text-content-length: 40 Text-content-md5: 6c06fd8dec2db9886d53e9a8384f068f Text-content-sha1: 97f573b6bbce993c4119a82e79358816c12089ca Content-length: 40 SVN�� �.��_,<!--MIRRORWARNING-- Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2addedf0084d9f3ff55a5615891f5dcb Text-delta-base-sha1: 59afd58b30cdfd1459b83f45cb0930340d6ee918 Text-content-length: 72 Text-content-md5: 9da6caf0edb5336bd6df5be3f02433e3 Text-content-sha1: 013a1eccc9e7aaf69ac7dcc095562e96c49c5088 Content-length: 72 SVN��h&�f��q?�lU�)?<!--MIRRORWARNING--<!--MIRRORWARNING-- Revision-number: 5811 Prop-content-length: 258 Content-length: 258 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-19T22:06:22.971607Z K 7 svn:log V 157 Summary: Reports of SSH-1 trouble with port/X11 forwarding Absent-in: 0.55 0.57 Present-in: 0.58 2005-05-19 ("Incorrect CRC", "Extremely large packet" etc) PROPS-END Node-path: putty-wishlist/data/ssh1-fwd-trouble Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 957 Text-content-md5: 9d208d96a802093f2230747e4d3aa5d1 Text-content-sha1: eb9ef9132dd15dbac727c1452b5c308702c235a6 Content-length: 967 PROPS-END SVN���///Summary: Reports of SSH-1 trouble with port/X11 forwarding Absent-in: 0.55 0.57 Present-in: 0.58 2005-05-19 Content-type: text/x-html-body <p> We've had several reports of SSH-1 connections in PuTTY 0.58 bombing out with various error messages when port- or X11 forwarding is in use. The problems do not show up with SSH-2. <p> We haven't reproduced this ourselves yet, and don't know where the problem might lie. <p> Error messages reported include: <ul> <li>"Incorrect CRC received on packet" <li>"Extremely large packet length from server suggests data stream corruption" <li>"Out of memory" <ul> <p> Reports: <ul> <li><tt>42551C05.3060504@ecs.soton.ac.uk</tt> <br>"redhat 8"/OpenSSH_3.4p1, "redhat enterpise 3"/OpenSSH_3.6.1p2 <li><tt>200505121422.j4CEMaqj012603@r2d2.charthouse.co.uk</tt> <li><tt>A4EC8EBB0E93C5458D3039EB62A66D917069B3@pscdalpexch02.perotsystems.net</tt> <br>HP-UX 11.0/OpenSSH_3.5p1, Solaris 8/OpenSSH_3.6.1p1 </ul> Revision-number: 5812 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 2005-05-20T10:09:29.330999Z K 7 svn:log V 9 HTML fix K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh1-fwd-trouble Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d208d96a802093f2230747e4d3aa5d1 Text-delta-base-sha1: eb9ef9132dd15dbac727c1452b5c308702c235a6 Text-content-length: 22 Text-content-md5: aa9231fb08fdedfbcb0aa16890be0fa3 Text-content-sha1: 976ed72510ce4626fd083e48d8a19e30fbdfe12e Content-length: 22 SVN��/0 �W��XW/ Revision-number: 5813 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2005-05-20T10:40:35.285611Z K 7 svn:log V 30 New reports and other updates K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/host-key-sig-verify-fail Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1dd19f831b1cbd985b457672f30dd94d Text-delta-base-sha1: 1f825cb51cf0c42477985b6681efead9ce902563 Text-content-length: 886 Text-content-md5: 738307fa1b7291b99a9b2a6f4e25b358 Text-content-sha1: 8586447ff4b41c14cbc99a32ba549cd1939103c4 Content-length: 886 SVN��MbO���4�`^�z7 0.58, or perhaps data corruption in between. They've been difficult to reproduce. <p> To determine for sure whether the problem lies in PuTTY or not, we need extra information from a diagnostic build which we can provide, as well as the ordinary SSH packet logDepended on where session was run from (firewall/proxy probs?) (unfortunately this was the wrong diagnostic) <li><tt>CFB553FDAA2A5342BB3383CF908AFD4601E0D9EE@dewdfe21.wdf.sap.corp</tt> <br>0.58; "SSH-2.0-SAP"; connecting to 127.0.0.1:22 <li><tt>240156E724FD4B43B5D4EA0F86C6BC8A80D512@fsmail3.is.tcu.edu</tt> <br>0.58; "SSH-2.0-4.1.2 SSH Secure Shell Toolkit" <li><tt>f3d578550505160904747bb411@mail.gmail.com</tt> <br>0.57; SSH server was running on port 21 in a restricted environment, and other protocols reported corruption; this went away when moving to port 443 </ul> Revision-number: 5814 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.525155Z PROPS-END Revision-number: 5815 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2005-05-20T21:52:07.813914Z K 7 svn:log V 43 Minor memory leak spotted by Mikhail Kruk. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48605c957fb3e563081e0bea2a4648da Text-delta-base-sha1: 299bd1f125f98bf4e6a4d90c4fa2d885e6f710fd Text-content-length: 194 Text-content-md5: a8481a4e3cc421d5decfc8d706b3110b Text-content-sha1: 8ac7f0e4806fdfbaac903c63f261cb8ddc37ebf2 Content-length: 194 SVN��# *�H�*�1h== ERROR_SUCCESS) { RegSetValueEx(rkey, regname, 0, REG_SZ, key, strlen(key) + 1); RegCloseKey(rkey); } /* else key does not exist in registry */ sfree(regname Revision-number: 5816 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.616270Z PROPS-END Revision-number: 5817 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 Chosen/predictable ordering for headers on individual bug pages. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-21T13:26:37.321220Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9da6caf0edb5336bd6df5be3f02433e3 Text-delta-base-sha1: 013a1eccc9e7aaf69ac7dcc095562e96c49c5088 Text-content-length: 460 Text-content-md5: dd0897e55243357f28a7b3ba35601540 Text-content-sha1: 9bc4a152acdad34de9d4be8c0f4e3f250499d2fb Content-length: 460 SVN��V%�^��\ZM�Mz!�*h my $ctype = ($hdrs->{"content-type"} or "text/plainmy $do_hdr = sub { my ($h) = @_; my($desc); $h eq "content-type" && return; my $hdrs2 = { %$hdrs }; foreach $h (qw/summary class difficulty depends blocks priority absent-in present-in fixed-in/) { if (exists($hdrs2->{$h})) { &$do_hdr($h); delete $hdrs2->{$h}; } } foreach $h (keys %$hdrs2) { &$do_hdr($h); } if ($ctype Revision-number: 5818 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:07.928815Z PROPS-END Revision-number: 5819 Prop-content-length: 279 Content-length: 279 K 8 svn:date V 27 2005-05-21T14:16:43.609519Z K 7 svn:log V 178 Use {Get,Set}WindowLongPtr() instead of {Get,Set}WindowLong() for compatibility with 64-bit Windows. Untested on 64-bit, but it doesn't appear to have broken anything on 32-bit. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4856dad9848ff482ca443442c494d16e Text-delta-base-sha1: c4c2fbce19659ea606e8553027190d8c6ed9cbb8 Text-content-length: 130 Text-content-md5: 93a63628b0ebd8ea096b53341a354106 Text-content-sha1: e66fef12d6f15a2e5b7afa12d7513bed8fc4a364 Content-length: 130 SVN��`�z��R�3RPtr(hwnd, DWLPPtr(hwnd, DWLP_MSGRESULT, DL_MOVECURSOR); else SetWindowLongPtr(hwnd, DWLP Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f3e4e0070caeededa611a6e475cee60 Text-delta-base-sha1: 8d2a37fc124b27aefce7ae0952589f7d607bc4dc Text-content-length: 375 Text-content-md5: bebc106b0ed96889b3fe1c89bf304699 Text-content-sha1: cbe1d73a49129b1d8310f5cc7b991db0b7901651 Content-length: 375 SVN��s54�-��F.�&�}%��"�K�k��ru�q2*sizeof(LONG_PTR)Ptr(hwnd, BOXFLAGS, 0); /* flags */ SetWindowLongPtrPtrPtrPtr(hwnd, BOXRESULT, ret); SetWindowLongPtrPtr(hwnd, GWLP_USERDATA, 0); if (help_path) SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | Ptr(hwnd, GWLPPtr(hwnd, GWLP Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f7468c9be3dfcb9dcb6aec920b038b52 Text-delta-base-sha1: c80504145a905b67e5f9ac1f6443171ba8978fc5 Text-content-length: 262 Text-content-md5: 13e716f56068f86303ebfe987ccebf48 Text-content-sha1: b65fdb9b42fae1625994b3d20e03feb2ef2b93eb Content-length: 262 SVN�����V�F�rM�%OPtr(hwnd, GWL_STYLE); LONG nexflag, exflag = GetWindowLongPtrPtr(hwnd, GWL_STYLE, nflg); if (nexflag != exflag) SetWindowLongPtr�i)�6��6�7E�)|�(%�M) p, "\x1B%cPtrPtrPtrPtrPtr Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 83f17f3d53226ea83ab6d7be6c10bb9b Text-delta-base-sha1: 8ab6587faf414a58e80b2cb2cbc4b34f06e5492f Text-content-length: 333 Text-content-md5: 8242193a7644a1ce87b607e9219f9d0b Text-content-sha1: 7c2187cdcf1216f8b62b8e27554c07bad7c9e3fb Content-length: 333 SVN��LtSl�]�L�~-�kE�H:�H �x^�^`� H�\�~u� }�9Ptr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | Ptr(hwnd, GWLP_USERDATA, (LONG_PTRPtr(hwnd, GWLPPtr(hwnd, GWLPPtr(hwnd, GWLPPtr(hwnd, GWLPPtr(hwnd, GWLPPtr(hwnd, GWLPPtr(hwnd, GWLPPtr(hwnd, GWLPPtr(hwnd, GWLP Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1af58990abe7c91fd8814a41b111d5ff Text-delta-base-sha1: b5155b58f0dc220fa61b4792c61535abf84463a7 Text-content-length: 103 Text-content-md5: b712c6760fc2f9b7d545da5dd3f2eb46 Text-content-sha1: f12d712d30063c17d1a4d39240946afcfcad49f5 Content-length: 103 SVN��EAL�5�L�@Ptr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b7420eb6eb6446da5c5779df801c0d72 Text-delta-base-sha1: 226b974705b0c4ad4273b3463bf7cba3c2718acb Text-content-length: 56 Text-content-md5: 5c0341702c69d1c4528250aadd06f6a4 Text-content-sha1: b7ce41c6f5b56d19005e8f9dc014428c8ed9d20b Content-length: 56 SVN��} #���U((DLGWINDOWEXTRA + sizeof(LONG_PTR)) Revision-number: 5820 Prop-content-length: 266 Content-length: 266 K 8 svn:date V 27 2005-05-21T14:35:21.045779Z K 7 svn:log V 165 Add NO_MANIFESTS option to Windows build, as the manifests apparently cause trouble for 64-bit Windows builds. Also flag the build flags that only apply to Windows. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9c7000e3b490477f4bbe7b11841e0a49 Text-delta-base-sha1: 40723581ceaa643bcae7a4729a2003670987c1ae Text-content-length: 462 Text-content-md5: 8a966ee4ea305d607924c912680b8b67 Text-content-sha1: cb9565887f6aef41ebef103877dd5e0e1d9ad7ee Content-length: 462 SVN��x6 �*��%*�:O� �F#�^L�1*�.[�o (Windows only) (Windows only) (Windows only) (Windows only)MANIFESTS (Windows only) # Disables inclusion of XML application manifests in the PuTTY # binaries. This may be necessary to build for 64-bit Windows; # the manifests are only included to use the XP GUI style on # Windows XP, and the architecture tags are a lie on 64-bit (Windows only) (Windows only) (Windows only) Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ab0cb34497a2c4a4247c6dc1e43b087 Text-delta-base-sha1: 25a6df12db0401eedc6f99a8117a9d1f1574f6fc Text-content-length: 92 Text-content-md5: 8be423a0a6bf6677a18e0b2713341996 Text-content-sha1: 1fdbdcef2e3d195f5b59760db4f5bcb6f76d4d03 Content-length: 92 SVN��jK�N�K#ifndef NO_MANIFESTS 1 RT_MANIFEST "pageant.mft" #endif /* NO_MANIFESTS */ Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 66c3e7010f204c2e6dda8aec578b6fca Text-delta-base-sha1: f669b43645d48baef0b650996b848a42757023f3 Text-content-length: 93 Text-content-md5: 93807774b6f202fc69a2574f486875da Text-content-sha1: ce40bdbcac3783a10d69c22e5254f8e9d59c208f Content-length: 93 SVN��NL��L#ifndef NO_MANIFESTS 1 RT_MANIFEST "puttygen.mft" #endif /* NO_MANIFESTS */ Node-path: putty/windows/win_res.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a2cf0ee333bf16aabb1fdc5b3d91faa Text-delta-base-sha1: b867982db91d2cebe5108b49f900047759c14b75 Text-content-length: 90 Text-content-md5: 1422362f62f0ade67141f519351b0a2c Text-content-sha1: 820b069f7f56a1072b746c9152578d506158a4a3 Content-length: 90 SVN��nI�T�I#ifndef NO_MANIFESTS 1 RT_MANIFEST "putty.mft" #endif /* NO_MANIFESTS */ Revision-number: 5821 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 Fix documentation of NO_MANIFESTS (oops). K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-21T15:09:36.146875Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a966ee4ea305d607924c912680b8b67 Text-delta-base-sha1: cb9565887f6aef41ebef103877dd5e0e1d9ad7ee Text-content-length: 25 Text-content-md5: d58946bd1ff1d404add92e28278f18dd Text-content-sha1: 7a46e06002e87d72db449346d5967b81ed7166c5 Content-length: 25 SVN�� ���RCFL Revision-number: 5822 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2005-05-21T15:31:01.741242Z K 7 svn:log V 27 Oops, missed one in r5810. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/autogen.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0fe5ae69f77744edde962fcd2e63aff Text-delta-base-sha1: 32f04c88d119f71b573721376bd8e19b6cdc2a1b Text-content-length: 40 Text-content-md5: 391aa098db62c0711b23d2852d29b295 Text-content-sha1: 9850629ef9d04da68388a2b4642de497d1539143 Content-length: 40 SVN��f{ �_�� ]<!--MIRRORWARNING-- Revision-number: 5823 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2005-05-21T15:46:44.499012Z K 7 svn:log V 48 Add a style for the "this is a mirror" warning. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/sitestyle.css Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9525627d389463219a0791b995d2d92 Text-delta-base-sha1: aff11c9c1d5bb434de70fe4ffa16d7547ce1e7f0 Text-content-length: 52 Text-content-md5: 18d909bfa906c3d25eaef14d3137ef26 Text-content-sha1: cd8a6bca72556f8eed8c8be550ae271b8d2f05bd Content-length: 52 SVN�� /$� � .mirrorwarning {font-size: small;} Revision-number: 5824 Prop-content-length: 758 Content-length: 758 K 8 svn:date V 27 2005-05-21T16:49:27.913544Z K 7 svn:log V 657 Factor out all local SSH disconnections into a new function ssh_disconnect(), and add the ability to treat a local disconnection as "unclean" -- notably, if we can't agree any authentication methods to even try; someone was complaining that the PuTTY window by default just disappears for no apparent reason in this circumstance. Also, use appropriate disconnect codes for those SSH2_MSG_DISCONNECT messages that we do send. I don't think I've seriously broken any user-visible behaviour, but the way that connection-close distinctions are transmitted to the front-end is shaky (or so it seems to me), so there may be non-ideal changes on some platforms. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f7d407eff600df1dca8458218f930f9c Text-delta-base-sha1: 2b1a44614a5482b76492ba6d070abb7760ff3530 Text-content-length: 3726 Text-content-md5: f5c2a8a0ee760efe2c74b8664f5798b9 Text-content-sha1: 2025e9904d420c041253c1cd7ce09a2d4abfcec7 Content-length: 3726 SVN����<W�t��cr�w{� Hs�#FU�J>J�FD� int clean_exit) { if (!ssh->close_expected) error_msg = "Server unexpectedly closed network connection"; else error_msg = "Server logevent(error_msg); if (!ssh->close_expected || !ssh->clean_exit) connection_fatal(ssh->frontend, "%s", error_msg);Client-initiated disconnection. Send a DISCONNECT if `wire_reason' * non-NULL, otherwise just close the connection. `client_reason' == NULL * => log `wire_reason'. */ static void ssh_disconnect(Ssh ssh, char *client_reason, char *wire_reason, int code, int clean_exit) { char *error; if (!client_reason) client_reason = wire_reason; if (client_reason) error = dupprintf("Disconnected: %s", client_reason); else error = dupstr("Disconnected"); if (wire_reason) { if (ssh->version == 1) { send_packet(ssh, SSH1_MSG_DISCONNECT, PKT_STR, wire_reason, PKT_END); } else if (ssh->version == 2) { struct Packet *pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT); ssh2_pkt_adduint32(pktout, code); ssh2_pkt_addstring(pktout, wire_reason); ssh2_pkt_addstring(pktout, "en"); /* language tag */ ssh2_pkt_send_noqueue(ssh, pktout); } } ssh->close_expected = TRUE; ssh->clean_exit = clean_exit; ssh_closing((Plug)ssh, error, 0, 0); sfree(error ssh_disconnect(ssh, "User aborted at host key verification", NULL, 0, TRUE_disconnect(ssh, "User aborted at cipher warning", NULL, 0, TRUEssh_disconnect(ssh, "No username provided", NULL, 0, TRUE���SuJ�Z��Mj�]uG�J�fJ�>>T�I��y-�.R�!, '\n', challengelen) ? "": "\r\nResponse: ", (sizeof s->prompt) - challengelen); s->prompt[(sizeof s->prompt) - 1] = '\0'; } } if (ssh->cfg.try_tis_auth && (s->supported_auths_mask & (1 << SSH1_AUTH_CCARD)) && !s->ccard_auth_refused) { s->pwpkt_type = SSH1_CMSG_AUTH_CCARD_RESPONSE; logevent("Requested CryptoCard authentication"); send_packet(ssh, SSH1_CMSG_AUTH_CCARD, PKT_END); crWaitUntil(pktin); if (pktin->type != SSH1_SMSG_AUTH_CCARD_CHALLENGE) { logevent("CryptoCard authentication declined"); c_write_str(ssh, "CryptoCard authentication refused.\r\n"); s->ccard_auth_refused = 1; continue; } else { char *challenge; int challengelen; ssh_pkt_getstring(pktin, &challenge, &challengelen); if (!challenge) { bombout(("CryptoCard challenge packet was badly formed")); crStop(0); } c_write_str(ssh, "Using CryptoCard authentication.\r\n"); logevent("Received CryptoCard challsh_disconnect(ssh, NULL, "Unable to authenticate", 0, FALSE_disconnect(ssh, NULL, NULL, 0, TRUE_disconnect(ssh, "User aborted at kex warning", NULL, 0, TRUE_disconnect(ssh, "User aborted at cipher warning", NULL, 0, TRUE_disconnect(ssh, "User aborted at cipher warning", NULL, 0, TRUE ssh_disconnect(ssh, "User aborted at host key verification", NULL, 0, TRUEsh_disconnect(ssh, "All channels closed", NULL, 0, TRUE*buf = dupprintf("Received channel request for nonexistent" " channel %d", localid); ssh_disconnect(ssh, NULL, buf, SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE); sfree(ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE�+oQ���v�xV�rm�RL GET_32BIT(s->ret + 5)); ssh2_pkt_send(ssh, s->pktout); s->authed = sh_disconnect(ssh, NULL, "Unable to authenticate", SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER, FALSEssh_disconnect(ssh, NULL, "No supported authentication methods available", SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE, FALSEclean_exit Revision-number: 5825 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:08.704266Z PROPS-END Revision-number: 5826 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:08.714558Z PROPS-END Revision-number: 5827 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:08.724632Z PROPS-END Revision-number: 5828 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:08.735399Z PROPS-END Revision-number: 5829 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:08.746260Z PROPS-END Revision-number: 5830 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:08.757889Z PROPS-END Revision-number: 5831 Prop-content-length: 145 Content-length: 145 K 7 svn:log V 45 Deprecate wget mirroring in favour of rsync. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-22T13:11:59.697340Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2689ea3d92bd2bb14f29f1d21f72e378 Text-delta-base-sha1: 9050384af346bd58ad878a899b1ef68563848aa4 Text-content-length: 1113 Text-content-md5: d691566b6d19507e576739b63f67245a Text-content-sha1: bce3b462ef2d1ca598d5b4e9aeaf152400d48345 Content-length: 1113 SVN��.+5�:�P�Wxe�eISince <code>rsync</code> is incremental, there should be no reason not to update frequently, although currently there's no point in doing so more often than once a day. In any case, we would recommend updating no less often than once a week, in order to fetch any urgent updates such as security bugfixes. You can also subscribe to our We used to support an alternative method of mirroring using GNU wget, and provided a sample shell script. This is now <em>deprecated</em> in favour of <code>rsync</code>, for the following reasons: <ul> <li><code>rsync</code> uses less bandwidth; <li>the <code>rsync</code> method moves all the post-processing complexity to our end, so we can implement changes and deal with bugs much more easily - and in particular, it allows us to insert a note to the effect that the mirrored site is a mirror site to reduce general confusion;<!-- he's in the army --> <li>we've had trouble in the past with mirroring <code>wget</code>s going mad and eating all our host's bandwidth/CPU, which <code>rsync</code> hasn't yet done, to our knowledge. </ul> Node-path: putty-website/mirror-wget.sh Node-action: delete Revision-number: 5832 Prop-content-length: 112 Content-length: 112 K 8 svn:date V 27 2005-05-22T13:29:12.111679Z K 7 svn:log V 12 xmlcity.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d691566b6d19507e576739b63f67245a Text-delta-base-sha1: bce3b462ef2d1ca598d5b4e9aeaf152400d48345 Text-content-length: 73 Text-content-md5: 7a31197b1ab13c5abc4c460c1513bcd6 Text-content-sha1: d9f1ababa727efcaf0df83a531e2d5f65fb962e0 Content-length: 73 SVN��+'.���N��www.xmlcity.org/softwaremirror/putty/">xmlcity Revision-number: 5833 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:08.919331Z PROPS-END Revision-number: 5834 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2005-05-22T13:43:38.853594Z K 7 svn:log V 51 amongthemortals.com is now domain-squatted, remove K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a31197b1ab13c5abc4c460c1513bcd6 Text-delta-base-sha1: d9f1ababa727efcaf0df83a531e2d5f65fb962e0 Text-content-length: 22 Text-content-md5: 9bd21a74106fcb2578c5380a9cc2e415 Text-content-sha1: 623ccbe7fd87f22710d44bb8c0229eaef751e3fd Content-length: 22 SVN��' ����  Revision-number: 5835 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:09.063679Z PROPS-END Revision-number: 5836 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:09.075713Z PROPS-END Revision-number: 5837 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:09.087296Z PROPS-END Revision-number: 5838 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:09.098735Z PROPS-END Revision-number: 5839 Prop-content-length: 242 Content-length: 242 K 8 svn:date V 27 2005-05-23T12:41:21.388009Z K 7 svn:log V 141 Miscellaneous updates: - note Visual Foo version requirements - note which things are done for you in our source snapshots - other tweaks K 10 svn:author V 5 jacob PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c367fe00231592d35ab7b5beedbaec53 Text-delta-base-sha1: 3fac859b0af5d6a421bb0d3c756b6f3284abe119 Text-content-length: 949 Text-content-md5: 4cf3f4f82ce7319b4c33f332eb229efd Text-content-sha1: a49bf39a8f2fbdf2ee2f6bef4716a4fe928511fd Content-length: 949 SVN��W/z��S�-*�#,�X{#� \�U�@�ILast time we checked, PuTTY built with vanilla VC7, or VC6 with the Platform SDK Note that Unix PuTTY has mostly only been tested on Linux so far; portability problems such as BSD-style ptys or different header file requirements are expected -- Both Unix Makefiles have an `install' target. Note that by default it tries to install `man' pages, which you may need to have built using Halibut first -- The Unix `configure' script and its various requirements are generated by the shell script `mkauto.sh', which requires GNU Autoconf, GNU Automake, and Gtk; if you've got the source from Subversion rather than using one of our source snapshots, you'll need to run this yourselfbuilt from the Halibut (`.but') files in the `doc' subdirectory using `doc/Makefile'. If you aren't using one of our source snapshots, you'll need to do this yourself. Halibut can be found at Revision-number: 5840 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2005-05-24T13:16:49.900504Z K 7 svn:log V 75 Summary: Paste from tunneled Remote Desktop session into PuTTY causes hang K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rdesktop-paste-hang Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1137 Text-content-md5: 7f454276f4cb35ea68dd39d744430110 Text-content-sha1: acff1be77ad4e4f0c0f368ef6c22be5dba2c8618 Content-length: 1147 PROPS-END SVN���cccSummary: Paste from tunneled Remote Desktop session into PuTTY causes hang Difficulty: taxing Present-in: 0.53b 2004-02-12 0.56 0.57 0.58 Content-type: text/x-html-body <p> We've had a few reports that the following scenario causes PuTTY to hang ("Not responding"): <ol> <li>Set up a PuTTY session with a tunnel for a Remote Desktop session. <li>Copy text from the Remote Desktop session. <li>Paste it into the PuTTY session running the tunnel. </ol> Closing the Remote Desktop session apparently unwedges PuTTY. <p> This sounds like a classic deadlock. However, we haven't been able to reproduce it ourselves (with XP SP1). <p> A workaround is apparently to paste into some other application before pasting into PuTTY. <p> Reports: <ul> <li><tt><000001c3f126$ee1b8ca0$6401a8c0@COMPAQ></tt> <br>MS Win XP Home Edition, 5.1.2600 SP 1 Build 2600; 0.53b, 2004-02-12 <li><tt><20050108235307.GA44292@donnex.net></tt> <br>"windows xp sp2 pro swedish version"; 0.56 "and dev" <li><tt><Pine.LNX.4.44.0505231927410.25150-100000@smurfette.trifocus.net></tt> <br>"windowsxp pro service pack 2"; 0.57, 0.58 </ul> Revision-number: 5841 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:09.531081Z PROPS-END Revision-number: 5842 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:09.542548Z PROPS-END Revision-number: 5843 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2005-05-25T22:01:01.944514Z K 7 svn:log V 69 Apparently only happens when copying from certain apps such as mIRC. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rdesktop-paste-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f454276f4cb35ea68dd39d744430110 Text-delta-base-sha1: acff1be77ad4e4f0c0f368ef6c22be5dba2c8618 Text-content-length: 246 Text-content-md5: 14c3079753c70661e72e29eb29c38260 Text-content-sha1: ef2e34b95b16564212828532019f2bfad43dc88d Content-length: 246 SVN��c: ]�r�>�kq There's some indication that it only happens when pasting from certain applications on the Remote Desktop end (<a href="http://www.mirc.com/">mIRC</a> is one such), which could explain that; only happens with mIRC </ul> Revision-number: 5844 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:09.802682Z PROPS-END Revision-number: 5845 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:09.813836Z PROPS-END Revision-number: 5846 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:09.824447Z PROPS-END Revision-number: 5847 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:09.836313Z PROPS-END Revision-number: 5848 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2005-05-27T10:43:54.197981Z K 7 svn:log V 23 Musings on ssh-askpass K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/gui-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5bfc914d5d6ab8c001c221b244bd2f8a Text-delta-base-sha1: 3c95942ba777f35d7a33a9add99a6997ced7624c Text-content-length: 245 Text-content-md5: 1f193e6d90a1a7fc6b165c9e7e153a6b Text-content-sha1: f0d7ca74685ccc25a3f48eb32d31daa15f780cf2 Content-length: 245 SVN��v ]�u�]�$oOn Windows, Plink can create dialog boxes despite being a console-mode program. On Unix, we wouldn't want to add a dependency to Gtk to Plink just for this; perhaps we can implement the <code>ssh-askpass</code> interface. Revision-number: 5849 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2005-05-27T12:20:16.722966Z K 7 svn:log V 65 Remove definitely-broken (as opposed to just unreachable) sites. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9bd21a74106fcb2578c5380a9cc2e415 Text-delta-base-sha1: 623ccbe7fd87f22710d44bb8c0229eaef751e3fd Text-content-length: 162 Text-content-md5: 2a86402f9c654b4c737b7c36dcc6c3d2 Text-content-sha1: 65b6042eea78498393f6b0997026915228c51c72 Content-length: 162 SVN��^;Z�U��So�1�X8�G@� }�-�E�S�3_�Mx�$nmolioner.dk/">putty.molionerwigen.net/putty/">wigen.net</a> in Norwaydiis.net/putty/">diis Revision-number: 5850 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2005-05-27T14:20:14.742075Z K 7 svn:log V 52 Remove some mirrors that still list 0.57 as current K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2a86402f9c654b4c737b7c36dcc6c3d2 Text-delta-base-sha1: 65b6042eea78498393f6b0997026915228c51c72 Text-content-length: 121 Text-content-md5: 4dfc8f9f943d28c7faf5f5c85823f934 Text-content-sha1: 9fdc7cfef266796ffe8efe685c7be8f3dfc8b225 Content-length: 121 SVN��^51;�Y��T�Vw�R;�f �.e�R<�X}�D�$:giga.com.br/">putty.gigaputty.archive.hk/">putty.archive.hk Revision-number: 5851 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2005-05-28T01:30:31.777455Z K 7 svn:log V 59 Reinstate putty.planetmirror.com, mirror.mons-new-media.de K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4dfc8f9f943d28c7faf5f5c85823f934 Text-delta-base-sha1: 9fdc7cfef266796ffe8efe685c7be8f3dfc8b225 Text-content-length: 146 Text-content-md5: 4b7fc5bc6bbe3ee8c62d3e0f9d3685c1 Text-content-sha1: ae5b651c15a086a4a7dbcbe347fe6f96660e6a56 Content-length: 146 SVN��53q�Y��C�+Y�{:planetmirror.com/">putty.planetmirror.com</a> in Australmirror.mons-new-media.de/putty/">mirror.mons-new-media.de Revision-number: 5852 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:10.166889Z PROPS-END Revision-number: 5853 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2005-05-28T13:46:04.148375Z K 7 svn:log V 62 Remove a couple of mistaken references to Telnet in comments. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f5c2a8a0ee760efe2c74b8664f5798b9 Text-delta-base-sha1: 2025e9904d420c041253c1cd7ce09a2d4abfcec7 Text-content-length: 66 Text-content-md5: ae4b765225791dd169093e6c79b78889 Text-content-sha1: bed80a844ab1cfac8fbf5a6c1eb936bed81f7461 Content-length: 66 SVN����������������+!�f��l�SSH Revision-number: 5854 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:10.317165Z PROPS-END Revision-number: 5855 Prop-content-length: 132 Content-length: 132 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-29T01:07:21.734371Z K 7 svn:log V 32 reinstate mirror.nucleardog.com PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4b7fc5bc6bbe3ee8c62d3e0f9d3685c1 Text-delta-base-sha1: ae5b651c15a086a4a7dbcbe347fe6f96660e6a56 Text-content-length: 92 Text-content-md5: 829f2cc211336b2a355b6722dace8446 Text-content-sha1: 733890f90c5b6918fac1b0d8c0e0daa3b63113e8 Content-length: 92 SVN��3/@��@�I�� &mirror.nucleardog.com/putty/">mirror.nucleardog.com</a> in Canad Revision-number: 5856 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2005-05-29T01:26:06.417653Z K 7 svn:log V 76 Note that we now have a report with the DH private value in the packet log. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/host-key-sig-verify-fail Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 738307fa1b7291b99a9b2a6f4e25b358 Text-delta-base-sha1: 8586447ff4b41c14cbc99a32ba549cd1939103c4 Text-content-length: 233 Text-content-md5: ce16c03dea89e70c7c5ac4ab6914f076 Text-content-sha1: 40cd026b4943a025d6497cbdcb2555713a902d4a Content-length: 233 SVN��b3V�]�Vli><tt><4257734F.4060406@koncar-institut.hr> <br>0.57, OpenSSH_3.8.1p1 <br><tt><4296E722.7090106@koncar-institut.hr></tt>: <br><em>SSH packet log with DH private value</em> (to be analysed) </ul> Revision-number: 5857 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.292867Z PROPS-END Revision-number: 5858 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.303983Z PROPS-END Revision-number: 5859 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.314662Z PROPS-END Revision-number: 5860 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.325268Z PROPS-END Revision-number: 5861 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.335277Z PROPS-END Revision-number: 5862 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.345948Z PROPS-END Revision-number: 5863 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.356109Z PROPS-END Revision-number: 5864 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.366712Z PROPS-END Revision-number: 5865 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.392735Z PROPS-END Revision-number: 5866 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.410090Z PROPS-END Revision-number: 5867 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.424571Z PROPS-END Revision-number: 5868 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.440899Z PROPS-END Revision-number: 5869 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.457556Z PROPS-END Revision-number: 5870 Prop-content-length: 330 Content-length: 330 K 7 svn:log V 229 213.239.211.243 has timed out every time I've tried it in the past week or so. Remove it (usually I keep these in case they're in fact very useful mirrors, but this one is in Germany which is well-provided for and is a bare IP). K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-05-30T19:42:35.793151Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 829f2cc211336b2a355b6722dace8446 Text-delta-base-sha1: 733890f90c5b6918fac1b0d8c0e0daa3b63113e8 Text-content-length: 61 Text-content-md5: fb7b905ae1c5188c6ff7f9f2c13dd9d2 Text-content-sha1: 45626926f4144393ac96f351096b8eb5992bedbe Content-length: 61 SVN��/7"�P��M?�x7putty.obengelb.de/">putty.obengelb Revision-number: 5871 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.621733Z PROPS-END Revision-number: 5872 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.631738Z PROPS-END Revision-number: 5873 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:12.642549Z PROPS-END Revision-number: 5874 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2005-05-31T10:51:39.908816Z K 7 svn:log V 36 Hye-Shik Chang's iPuTTY/HangulPuTTY K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60b104e5c95778faa8447f2113e818d1 Text-delta-base-sha1: b0e1d5dfc726caf4e7763a005acb7fa29bfd293f Text-content-length: 138 Text-content-md5: 5377e40938a3b34981f9562e9b0561ef Text-content-sha1: 84434a1c7665aba8111dafa50f7eb046c93cb7a6 Content-length: 138 SVN�� t�c�t�HNkldp.net/projects/iputty/"> iPuTTY/HangulPuTTY</a>, an internationalised fork with an emphasis on Korean support Revision-number: 5875 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.070473Z PROPS-END Revision-number: 5876 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.081084Z PROPS-END Revision-number: 5877 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.091543Z PROPS-END Revision-number: 5878 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.105043Z PROPS-END Revision-number: 5879 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.115723Z PROPS-END Revision-number: 5880 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.126836Z PROPS-END Revision-number: 5881 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2005-05-31T12:45:04.523383Z K 7 svn:log V 38 PickIconDlg() is now documented by MS K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/session-icon Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f29a684fd0f23d2505b90008669ab2fb Text-delta-base-sha1: 5a97c08d08d955b14a763211f4efc6cefcb1ad6d Text-content-length: 182 Text-content-md5: 35312835ad759f822e383c15a2fa3c3c Text-content-sha1: 789145a1e6660550bd7f4996c74b39f8176b6b29 Content-length: 182 SVN��b_ �K��vlinterface (only <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnapiover/html/api-overview.asp">recently documented</a>) to get at Revision-number: 5882 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.466543Z PROPS-END Revision-number: 5883 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.477359Z PROPS-END Revision-number: 5884 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.487533Z PROPS-END Revision-number: 5885 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.498374Z PROPS-END Revision-number: 5886 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.509562Z PROPS-END Revision-number: 5887 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.520614Z PROPS-END Revision-number: 5888 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:13.532012Z PROPS-END Revision-number: 5889 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2005-06-01T00:10:40.441492Z K 7 svn:log V 31 reinstate putty.linuxrs.com.br K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb7b905ae1c5188c6ff7f9f2c13dd9d2 Text-delta-base-sha1: 45626926f4144393ac96f351096b8eb5992bedbe Text-content-length: 57 Text-content-md5: 02e1182adcab679c88da2692df1d3fe4 Text-content-sha1: 5ea7c1e51c880c6b3b0a1166ed91638b40b30461 Content-length: 57 SVN��7+�Y��Vq�^Ylinuxrs.com.br/">putty.linuxrs Revision-number: 5890 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.037619Z PROPS-END Revision-number: 5891 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.048243Z PROPS-END Revision-number: 5892 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.058546Z PROPS-END Revision-number: 5893 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.070619Z PROPS-END Revision-number: 5894 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2005-06-01T11:06:54.663275Z K 7 svn:log V 26 Update + further thoughts K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/i18n Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b351d343660a2482bf60a31b4e58aab5 Text-delta-base-sha1: efbcad11b59a336950e337e5864dedc1f66367a0 Text-content-length: 598 Text-content-md5: 48fc2683b9c95c5a7d207a0116a683b1 Text-content-sha1: 73fa272dcf63cc0f42cbcfbc7ccd146448253e64 Content-length: 598 SVN��V`C��Crequire portability to non-Windows environments). <p> (Having special markup for strings à la <a href="http://www.gnu.org/software/gettext/">gettext</a> may be useful in other ways; for instance, IIRC WinCE requires all UI strings to be marked up as wide-character strings with <code>L"foo"</code>. We could hide this behind the same markup we use for l10n.) <p> In the meantime, people are welcome to create translated versions of PuTTY, but these would have to be maintained as a fork of the PuTTY code since there's no clean way to integrate them into the core code. Revision-number: 5895 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.142949Z PROPS-END Revision-number: 5896 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.154475Z PROPS-END Revision-number: 5897 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.165411Z PROPS-END Revision-number: 5898 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.175721Z PROPS-END Revision-number: 5899 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.186530Z PROPS-END Revision-number: 5900 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.197033Z PROPS-END Revision-number: 5901 Prop-content-length: 128 Content-length: 128 K 7 svn:log V 28 +putty.hosting-concepts.com K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-06-01T22:58:11.967531Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02e1182adcab679c88da2692df1d3fe4 Text-delta-base-sha1: 5ea7c1e51c880c6b3b0a1166ed91638b40b30461 Text-content-length: 76 Text-content-md5: 02f8edb08597e7d6322225a6fe521fdf Text-content-sha1: efe1fc3dbad4f828903be36d01146bd02cf91529 Content-length: 76 SVN��+41�.��X:�}.hosting-concepts.com/">putty.hosting-concepts.com Revision-number: 5902 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.344267Z PROPS-END Revision-number: 5903 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:14.354344Z PROPS-END Revision-number: 5904 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2005-06-02T21:57:19.207175Z K 7 svn:log V 29 reinstate putty.infowave.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02f8edb08597e7d6322225a6fe521fdf Text-delta-base-sha1: efe1fc3dbad4f828903be36d01146bd02cf91529 Text-content-length: 72 Text-content-md5: 1183dbe9f5b9acb528bde9def02765ea Text-content-sha1: 8d94904e66dfc14e72c4dd54c0a148aa651fbb4d Content-length: 72 SVN��4#-�u��B��?uinfowave.org/">putty.infowave.org</a> in Kore Revision-number: 5905 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.453342Z PROPS-END Revision-number: 5906 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.465416Z PROPS-END Revision-number: 5907 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.476618Z PROPS-END Revision-number: 5908 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.487202Z PROPS-END Revision-number: 5909 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.497592Z PROPS-END Revision-number: 5910 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 66 Plink should have a "-f" option, maybe. Suggested by Sun Yijiang. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-06-04T15:59:00.046749Z PROPS-END Node-path: putty-wishlist/data/plink-background Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 438 Text-content-md5: e01bc458e42b0b9a8ec80b341cb13271 Text-content-sha1: 54a93c5c488beb36cda6898364bcb8ea3dae8429 Content-length: 448 PROPS-END SVN���(((Summary: Plink option to background after authentication Class: wish Difficulty: tricky Priority: low Content-type: text/plain OpenSSH has a "-f" option which causes it to fork into the background after authentication. Plink should probably have this too. Its implementation wouldn't be terribly complex on Unix, though it would need an "authentication complete" callback from the backend. I have no idea about Windows. Revision-number: 5911 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.554011Z PROPS-END Revision-number: 5912 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.576184Z PROPS-END Revision-number: 5913 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.586809Z PROPS-END Revision-number: 5914 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.597584Z PROPS-END Revision-number: 5915 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.609342Z PROPS-END Revision-number: 5916 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.620405Z PROPS-END Revision-number: 5917 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.631612Z PROPS-END Revision-number: 5918 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.641942Z PROPS-END Revision-number: 5919 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.653120Z PROPS-END Revision-number: 5920 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.664264Z PROPS-END Revision-number: 5921 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.674375Z PROPS-END Revision-number: 5922 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.684617Z PROPS-END Revision-number: 5923 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.695140Z PROPS-END Revision-number: 5924 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.705930Z PROPS-END Revision-number: 5925 Prop-content-length: 115 Content-length: 115 K 7 svn:log V 15 Another report K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-06-08T09:16:28.261110Z PROPS-END Node-path: putty-wishlist/data/large-clipboard-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e78dcd000694584412f1e09b0262f20 Text-delta-base-sha1: 6df7ebe816e0f3da838841fc1511fea120f0bbb0 Text-content-length: 299 Text-content-md5: c3f5dca7278a1a0952f2eadaeb158bd8 Text-content-sha1: ab8c88db5d3326f90f5d954ff8e7049cee0dbd74 Content-length: 299 SVN��n| �?��+> 0.58 2005-06-0li><tt>6D4E54434B6EF845B7A53AC02468BE9A0D3110@fflon-exc02.hq.ffastfill.com</tt> <br>Telnet to Cisco, change scrollback from 2000 to 20000 lines, issue a command ~4500 lines, "Copy All to Clipboard" => crash <br>screenshot of some of XP's crash info </ul> Revision-number: 5926 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.759863Z PROPS-END Revision-number: 5927 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2005-06-08T09:37:42.631671Z K 7 svn:log V 37 Some more detail on various reports. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/large-clipboard-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c3f5dca7278a1a0952f2eadaeb158bd8 Text-delta-base-sha1: ab8c88db5d3326f90f5d954ff8e7049cee0dbd74 Text-content-length: 175 Text-content-md5: b5f80d85c94aee6d087742aef93bec72 Text-content-sha1: e22cdf45114735f4df8fd2a02446e86002bc94ab Content-length: 175 SVN��|( ��p�(}�(%�.NSSH to "T64 Unix" <li><tt>41D261A2.4060806@lucent.com</tt> <br>0.56 "Out of memory", snapshots crash; Telnet to (SSH-1)0.58 / 2005-06-08; t Revision-number: 5928 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:15.813507Z PROPS-END Revision-number: 5929 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2005-06-08T15:14:47.853646Z K 7 svn:log V 56 Double-free on mkdir error, spotted by Brian Hartsock. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c1d53e031d896b8e404314351e17ce13 Text-delta-base-sha1: 455311f2b1be84f25ab4f935605a3821864d8083 Text-content-length: 25 Text-content-md5: 7e25c6bc10f9fc6c262027dd342e9fae Text-content-sha1: 1e9261beba98bc254dc1099c76893c75b7686e54 Content-length: 25 SVN��' ��]��9n Revision-number: 5930 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2005-06-08T17:00:56.754402Z K 7 svn:log V 30 Another report + misc updates K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rdesktop-paste-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 14c3079753c70661e72e29eb29c38260 Text-delta-base-sha1: ef2e34b95b16564212828532019f2bfad43dc88d Text-content-length: 402 Text-content-md5: 97c99acb86c459d44d461f10f8efa570 Text-content-sha1: 94edd8e7c6267be255cc99de9b0c25e01299dfa9 Content-length: 402 SVN��:r�,�m�?,�7~UThis looks plausible if Terminal Services defers sending clipboard data over the network until it's requested; PuTTY does all the operations involved in a paste without explicitly checking for and dealing with any network activity. <p> local application and re-copy from there before li><tt><7b9f25e50506080824205a0732@mail.gmail.com></tt> <br>0.58 on 98SE </ul> Revision-number: 5931 Prop-content-length: 368 Content-length: 368 K 7 svn:log V 267 "SanskritFritz" points out that digits at the start of RTF pastes were being eaten by the trailing "\f0" on the RTF preamble. The RTF spec (1.0 and 1.6) suggests that adding a space should defuse this situation and be otherwise harmless, and it works for me (Win98). K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-06-09T10:05:29.784566Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 13e716f56068f86303ebfe987ccebf48 Text-delta-base-sha1: b65fdb9b42fae1625994b3d20e03feb2ef2b93eb Text-content-length: 42 Text-content-md5: d21f205c889d67b16c6042c3a042e1e4 Text-content-sha1: 1dce1082b39b1c04e001b67ce69bb0ba8ea90b84 Content-length: 42 SVN��������� �>��F> Revision-number: 5932 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2005-06-09T15:28:55.317178Z K 7 svn:log V 16 Link to `less'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/horiz-scroll Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c06c7a7c043f00d9207951f3c1987214 Text-delta-base-sha1: 0e4cc407d81a2046d905274fe51d27cf62ba8fac Text-content-length: 91 Text-content-md5: cda6f00bd6e99a696ecae43a33baafe4 Text-content-sha1: 1919effdb897f8828a5420f0e41a22f67140abbb Content-length: 91 SVN��Bw F�l�F�E}a href="http://www.greenwoodsoftware.com/less/"><code>less</code></a> Revision-number: 5933 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2005-06-09T16:28:27.363904Z K 7 svn:log V 11 More info. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rdesktop-paste-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 97c99acb86c459d44d461f10f8efa570 Text-delta-base-sha1: 94edd8e7c6267be255cc99de9b0c25e01299dfa9 Text-content-length: 560 Text-content-md5: b824197c6dd75875c5660d58c1595732 Text-content-sha1: e7eab4dbb4327b37ae728061bacaf732eabc585c Content-length: 560 SVN��q��=�&w.�#jIt seems that the data is only hauled over the network once; if it's pasted into another local applicaton and then pasted into the tunnelling PuTTY without re-selecting, it works (at least with XP Pro SP2 as the server). <p> However, we haven't been able to reproduce it ourselves (with XP SP1). We've had one report (or could just turn out to be a mistaken correlation caused by the effect mentioned above). <p> Another workaround is apparently to paste into some other local application client; server is XP Pro SP2 </ul> Revision-number: 5934 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2005-06-09T17:04:05.407763Z K 7 svn:log V 17 frankenhuizen.nl K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1183dbe9f5b9acb528bde9def02765ea Text-delta-base-sha1: 8d94904e66dfc14e72c4dd54c0a148aa651fbb4d Text-content-length: 69 Text-content-md5: 9dfa833d6feca6cd55eb0fa3db050c3d Text-content-sha1: 846bf5e279ecfb1eca0eb2e9cc174d8a1560d15d Content-length: 69 SVN��#"*���[7�www.frankenhuizen.nl/putty/">frankenhuizen Revision-number: 5935 Prop-content-length: 393 Content-length: 393 K 8 svn:date V 27 2005-06-09T17:43:33.492825Z K 7 svn:log V 292 We're still getting reports of `xp-wont-run'; people clearly aren't finding it, so put it on the front page. Also remove all news more than six months old. (I think we've probably atoned for the security holes now; anyone who's still using pre-0.56 probably isn't going to get the message.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85700290ede7fbb8a849aef8a79800e8 Text-delta-base-sha1: d081bc3a60374245cbf0badc1884be90e8676e64 Text-content-length: 420 Text-content-md5: c1674052ff26b607f827a6a20055d37d Text-content-sha1: 8f05b44c4f52478c6fe7001bf9eabb4391b2172e Content-length: 420 SVN��Ye���/�@6-09 Problems with 0.58 and Windows XP</b> <p> We're getting occasional but persistent reports that the latest release, 0.58, fails to run on some versions of Windows XP (particularly pre-SP2), giving an "application configuration is incorrect" error message. The cause is known, and a variety of workarounds are described on the associated <a href="wishlist/xp-wont-run.html">bug page</a>. Revision-number: 5936 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:16.358315Z PROPS-END Revision-number: 5937 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:16.369261Z PROPS-END Revision-number: 5938 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:16.379709Z PROPS-END Revision-number: 5939 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:16.390775Z PROPS-END Revision-number: 5940 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:16.416810Z PROPS-END Revision-number: 5941 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:16.427641Z PROPS-END Revision-number: 5942 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 Update for the current situation. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-06-11T12:54:02.125383Z PROPS-END Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aa2b965e9f942e2494f5bb74ab6fa6de Text-delta-base-sha1: 008d28f4f5890df2c6f65e2cdfdaf169dcfd1da3 Text-content-length: 719 Text-content-md5: 8431170b0c26d6f74f1618e5af22b2ae Text-content-sha1: 889ff591e1641399e4fa4d08c798c8cb945905da Content-length: 719 SVN��? 7�R?�xGSummary: Bombs out with line==NULL in terminal.cWe receive occasional reports of PuTTY crashing out with <code>line==NULL</code> in <code>terminal.c:lineptr()</code>. However, we haven't been able to reproduce the problem ourselves. <p> In recent versions of PuTTY (0.58 and up), the error takes the form of one or more error boxes saying "line==NULL in terminal.c" and giving some diagnostic information, along with an exhortation to contact us. <p> In versions of PuTTY before snapshot 2005-03-07, the error is instead a failure of an assertion in <code>terminal.c</code> that <code>line != NULL</code> (the precise line number has changed a lot due to the extensive terminal re-engineering Revision-number: 5943 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2005-06-11T12:56:50.279264Z K 7 svn:log V 62 Add the speculative suggestion of a link between these three. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/assert-fail-newsavelines Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 306cb0b034b768062a50716d2842486c Text-delta-base-sha1: 59b1e2c5c8293fd9a2b6c220c3e9285f03a59708 Text-content-length: 221 Text-content-md5: 2f2619e283ba1e965033bec0ea11e0e6 Text-content-sha1: 392a35f6496e5a5b403629613623bda5a644f433 Content-length: 221 SVN��+s E�e�E�Ibp> (Possibly related, although we've no hard evidence for this: <a href="assert-line-not-null.html">`assert-line-not-null'</a> and <a href="large-clipboard-crash.html">`large-clipboard-crash'</a>.) Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8431170b0c26d6f74f1618e5af22b2ae Text-delta-base-sha1: 889ff591e1641399e4fa4d08c798c8cb945905da Text-content-length: 229 Text-content-md5: 658c332e539e90b13ec537d64593fcc5 Text-content-sha1: 1669f1d67aa9dc2f7b06947d154c4b75abef2d7e Content-length: 229 SVN��Q M��M�|p> (Possibly related, although we've no hard evidence for this: <a href="assert-fail-newsavelines.html">`assert-fail-newsavelines'</a> and <a href="large-clipboard-crash.html">`large-clipboard-crash'</a>.) Node-path: putty-wishlist/data/large-clipboard-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b5f80d85c94aee6d087742aef93bec72 Text-delta-base-sha1: e22cdf45114735f4df8fd2a02446e86002bc94ab Text-content-length: 227 Text-content-md5: 28f11e782563070f6429c510ed99257e Text-content-sha1: 6584a2ae4f74e171d2e9951c485aad6f2a7de202 Content-length: 227 SVN��(v K��K�p> (Possibly related, although we've no hard evidence for this: <a href="assert-line-not-null.html">`assert-line-not-null'</a> and <a href="assert-fail-newsavelines.html">`assert-fail-newsavelines'</a>.) Revision-number: 5944 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 Add a link to the actual I-D. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-06-11T13:25:54.654811Z PROPS-END Node-path: putty-wishlist/data/arcfour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 197f28f6f5d053cec7222995c335bfc3 Text-delta-base-sha1: d42378796dfe467197925b33d9a51b5e65d419f2 Text-content-length: 226 Text-content-md5: d12571c0b06efe1d7032258e45f264d1 Text-content-sha1: 1bd3ff642ed600d92dee638fa842efbac5260e67 Content-length: 226 SVN�� L�3�Ly(currently <a href="http://www.ietf.org/internet-drafts/draft-harris-ssh-arcfour-fixes-02.txt">draft-harris-ssh-arcfour-fixes-02</a>) describing a way of using Arcfour reasonably securely with SSH-2, and Revision-number: 5945 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2005-06-11T13:29:30.843187Z K 7 svn:log V 39 Mark `disconnect' as fixed (long ago). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/disconnect Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 269445292e12d9f43edb2f7c5ff4f1c7 Text-delta-base-sha1: f7bb971be9965e89bcee50d28ddde4e4c30588f1 Text-content-length: 39 Text-content-md5: ac8f7f98376e6ba8aebdfdb48beb3bcc Text-content-sha1: cea92eb68b8b0a1e3779039e357139485c59725f Content-length: 39 SVN��f{�g���fFixed-in: 2005-01-12 Revision-number: 5946 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2005-06-11T13:33:39.864198Z K 7 svn:log V 43 Mention third-party efforts on Links page. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/gui-sftp Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a1b0d0e98c8e9635982b0c815e9e0c4 Text-delta-base-sha1: fdcb3fbdb8537f2cfa4923197fb16c7804c8292d Text-content-length: 138 Text-content-md5: 466e9d6b165ceafc80ef74012230b951 Text-content-sha1: c3e98917d6391f21c5a9e0153b31ae2267a65817 Content-length: 138 SVN��-&y�-�y <p> Some third-party file transfer clients using PuTTY code can be found on our <a href="../links.html">Links page</a>. Revision-number: 5947 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2005-06-11T13:40:28.092971Z K 7 svn:log V 45 Mention Vintela PuTTY (another GSSAPI patch) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5377e40938a3b34981f9562e9b0561ef Text-delta-base-sha1: 84434a1c7665aba8111dafa50f7eb046c93cb7a6 Text-content-length: 140 Text-content-md5: 1585ef8b471ca6a2b3bd39785a73ebc7 Text-content-sha1: 798efd0ee87690281678040ce950df1f10c50b2b Content-length: 140 SVN��6 v�*�v� rc.vintela.com/topics/putty/"> Vintela PuTTY</a>, another patch for <a href="wishlist/kerberos-gssapi.html">GSSAPI Revision-number: 5948 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2005-06-11T13:56:39.320129Z K 7 svn:log V 103 The "theoretical" workaround turns out to be practical. <48CD2FC0-02B2-4008-BFB9-018942ACED35@mimectl> K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-ftp Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f9fea7874ea25900a8aed315f1351fc2 Text-delta-base-sha1: fca9641c377efa5cb7108bfd844ea7e67b25c06e Text-content-length: 94 Text-content-md5: d3389a94d54c56f65558b4463a600b01 Text-content-sha1: db106bf68f9ce649cc8d063a8d5d09481108b5fd Content-length: 94 SVN��]c I�(�I�rkAs a special case, a SOCKSified FTP client can work with PuTTY's existing Revision-number: 5949 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2005-06-11T14:07:00.625756Z K 7 svn:log V 91 `save-scrollback' as a possible solution for `log-timestamp' in the case of terminal logs. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/log-timestamp Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c4506b3bf5012f01930f877893cb1d8 Text-delta-base-sha1: a280711278aef62d414323e8b00f874a66585607 Text-content-length: 330 Text-content-md5: e421c6a2c2b5e348b49793daa149e103 Text-content-sha1: b804ec24c33fe87267bb0bbb4149ac57feaa8cda Content-length: 330 SVN��XW 2�I�]�\{UContent-type: text/x-html-body <p> Timestamps would occasionally be useful in the log files PuTTY produces. <p> Deciding where to put timestamps in SSH packet logs is trivial -- packet starts and Event Log entries. <p> (See <a href="save-scrollback.html">`save-scrollback'</a> for a possible solution.) Node-path: putty-wishlist/data/save-scrollback Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 96e9a34c927960c9c8ad31ddd8a54a07 Text-delta-base-sha1: ed6e9a8fb4c0252db1326e2953b196e76a5b260e Text-content-length: 187 Text-content-md5: 5af76806670590517e508bf17629029d Text-content-sha1: 71c17dbe48034edf81002b1016623da1a967accb Content-length: 187 SVN��Fn(�F�( <p> This also has the advantage that each row written to the log file can sensibly be timestamped, which people <a href="log-timestamp.html">occasionally ask for</a>. Revision-number: 5950 Prop-content-length: 107 Content-length: 107 K 8 svn:date V 27 2005-06-11T14:12:39.113939Z K 7 svn:log V 8 HTMLify K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-ctr-modes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 151782b5f58b9ea685c3912449a45081 Text-delta-base-sha1: 6906cc23fab076d1da37d1bae2dfd2d84700ed40 Text-content-length: 235 Text-content-md5: 2a25d09ca7e81a8fd9df4b4cbafc9693 Text-content-sha1: ac6f1938ccfbc669c84c69d2212fce67f01a3b09 Content-length: 235 SVN��P�t��b*�m!Content-type: text/x-html-body <p> The Internet Draft <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-newmodes">draft-ietf-secsh-newmodes</a> <a href="ssh2-cbc-weakness.html">ssh2-cbc-weakness</a>. Revision-number: 5951 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2005-06-11T14:23:51.140619Z K 7 svn:log V 33 Some suggestions we've received. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-persistent-bell Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73442983367f0f6c58bd61db72100365 Text-delta-base-sha1: 67355583eacaa6ab7477e74cca2c25529f1c8abd Text-content-length: 380 Text-content-md5: e71ac8023fd1d8aff949cebbbaeca6d7 Text-content-sha1: 775aec2c9b07b3d3342e050f0e5e6ff2d8d27eb8 Content-length: 380 SVN��:#i�:�i <p> <em>Update:</em> some suggestions we've received: <ul> <li>Apparently there is an <code>URGENT</code> hint somewhere that some taskbar-based window managers take notice of. <li>There's been a suggestion that some window managers take notice of beeps in managed windows (but it's not clear that the apps in question aren't using the above mechanism). </ul> Revision-number: 5952 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2005-06-11T14:25:05.585189Z K 7 svn:log V 65 Remove a couple of entries that seem rather specialised/trivial. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/virtual-serial Node-action: delete Node-path: putty-wishlist/data/errmsg-full-stops Node-action: delete Revision-number: 5953 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:17.598541Z PROPS-END Revision-number: 5954 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:17.609867Z PROPS-END Revision-number: 5955 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:17.621437Z PROPS-END Revision-number: 5956 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:17.632257Z PROPS-END Revision-number: 5957 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:17.643912Z PROPS-END Revision-number: 5958 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:17.654623Z PROPS-END Revision-number: 5959 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:17.686225Z PROPS-END Revision-number: 5960 Prop-content-length: 295 Content-length: 295 K 7 svn:log V 194 We should wait until the Rlogin server indicates that it's happy to receive window-size notifications before we send them. This clears up a problem where the first password entry always failed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-06-14T14:48:17.922746Z PROPS-END Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 27a5192b6975ca0bc7fa250a6196e74e Text-delta-base-sha1: d2caa7553947c10210a917b01196dbb1c0e4272e Text-content-length: 126 Text-content-md5: 31f226ba9b12eb5045a628b721c5f2eb Text-content-sha1: 2c59161a8dfc4967090c8432f443b93bacda14ac Content-length: 126 SVN���!R�u��j�D��CC�w��%wcansiz { rlogin->cansize = 1; }rlogin->cansize = 0 || !rlogin->cansize Revision-number: 5961 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 29 Another couple of reports :( K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-06-14T19:50:25.874388Z PROPS-END Node-path: putty-wishlist/data/portfwd-corrupt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9ae2741600ec6f40e8a8f1c1ee8b360b Text-delta-base-sha1: 0860c2a29d2c1e067456d097fb87bc8d79def925 Text-content-length: 691 Text-content-md5: 252066bf64748c2ff6998b1bfe90290e Text-content-sha1: 617b15db6638615cf523fb77793fa43fd4addfa2 Content-length: 691 SVN��I` �[��i[ 0.58li><code>D9304F864F1759059287F365@[192.168.0.10]</code> <br>0.53b, 0.58, 2005-06-12:r5952 to OpenSSH 3.9p1 <br>Using SOCKS dynamic forwarding to forward FTP, upload corrupts files (resulting file is shorter than expected); FTP progress bar goes suspiciously fast for first 1-200k of a 500k file <br>Other SOCKS servers behave fine; `get' is fine; static port forwarding is fine <li><code>6.0.0.22.2.20050614193231.01fda408@195.70.37.56</code> <br>0.58 to Debian OpenSSH <br>Remote-to-local tunnel for JetDirect (local printer port 9100) <br>Files under 8k: OK <br>Files over 8k: all data in PuTTY's log, but not all gets to the printer <br>Logs available </ul> Revision-number: 5962 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2005-06-14T23:20:42.380284Z K 7 svn:log V 84 Detection of "auth-agent@openssh.com" was too liberal. Spotted by Ben Rudiak-Gould. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae4b765225791dd169093e6c79b78889 Text-delta-base-sha1: bed80a844ab1cfac8fbf5a6c1eb936bed81f7461 Text-content-length: 62 Text-content-md5: 598c8dd5a332258907af5009e03c4d9d Text-content-sha1: 0a9e803c090d122cb7824cb7c22a3dd77a20593d Content-length: 62 SVN����������� �r�� s22�!"�!� Revision-number: 5963 Prop-content-length: 259 Content-length: 259 K 8 svn:date V 27 2005-06-15T21:05:29.807585Z K 7 svn:log V 158 Summary: PuTTY doesn't permit half-closed connections Class: bug I suspect this is what's behind at least some of the reports of port-forwarding corruption. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/half-closed Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1027 Text-content-md5: e2d9fbde22eae4dfc07d900eae68cb09 Text-content-sha1: e7f1d23eb84470c297aac0fab227c5c5ef209d4d Content-length: 1037 PROPS-END SVN���uuuSummary: PuTTY doesn't permit half-closed connections Class: bug Difficulty: tricky Priority: medium Present-in: 0.58 Content-type: text/x-html-body <p> By and large, where there are full-duplex connections in PuTTY, it doesn't currently support the notion of a <em>half-closed</em> connection - that is, end-of-file has been indicated in one direction, but data is still flowing in the other direction. This applies to actual TCP sockets and also SSH channels. <p> What usually happens is that PuTTY abruptly closes a socket/channel as soon as it sees EOF in either direction. <p> I suspect this is leading to data loss in some circumstances (so may be a/the cause of <a href="portfwd-corrupt.html">`portfwd-corrupt'</a>). <p> What probably needs to be done is to decouple EOFs in either direction, and to sprinkle use of <code>shutdown()</code> and EOF notifications such as <code>SSH1_MSG_CHANNEL_CLOSE</code> and <code>SSH2_MSG_CHANNEL_EOF</code> throughout the code. This is a noticeable amount of work. Node-path: putty-wishlist/data/portfwd-corrupt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 252066bf64748c2ff6998b1bfe90290e Text-delta-base-sha1: 617b15db6638615cf523fb77793fa43fd4addfa2 Text-content-length: 535 Text-content-md5: b9fcc7929e8b77e5bde3bfd9063ced9f Text-content-sha1: 0ee933dd730a697c17439d66f46f3900a1fe3573 Content-length: 535 SVN��`Mw�e�I�W^.�F<em>Update, 2005-06-15:</em> I (JTN) have reproduced loss of trailing data with a remote-to-local SSH-2 port forwarding, where a burst data is sent from remote to local followed immediately by EOF. I suspect that PuTTY's <a href="half-closed.html">lack of support for half-closed connections</a> is to blame in at least this case <br>It looks like something other than PuTTY was modifying the attachments (possibly in addition to PuTTY), so we aren't able to extract useful information from this report. Revision-number: 5964 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2005-06-17T09:56:33.766733Z K 7 svn:log V 50 draft-ietf-secsh-scp-sftp-ssh-uri: is alive again K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1a039d489d743a31a83264e7d902d5b7 Text-delta-base-sha1: 27ed1f3ec581f30693954f2dc5414387a3085e98 Text-content-length: 31 Text-content-md5: d417f151fec61cedf4641a9d1c4f94fa Text-content-sha1: 0647695d5e114ba2c0b3576d202294b9611fa7c9 Content-length: 31 SVN��8 ���~has been. Revision-number: 5965 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.590429Z PROPS-END Revision-number: 5966 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.601329Z PROPS-END Revision-number: 5967 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.612144Z PROPS-END Revision-number: 5968 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.623147Z PROPS-END Revision-number: 5969 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.633200Z PROPS-END Revision-number: 5970 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.643279Z PROPS-END Revision-number: 5971 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.654141Z PROPS-END Revision-number: 5972 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.664908Z PROPS-END Revision-number: 5973 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.675967Z PROPS-END Revision-number: 5974 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.686705Z PROPS-END Revision-number: 5975 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:18.697543Z PROPS-END Revision-number: 5976 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2005-06-19T13:57:50.160521Z K 7 svn:log V 103 Move comment about ECHO and LINE input modes to a more sensible position. Spotted by Ben Rudiak-Gould. K 10 svn:author V 3 ben PROPS-END Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d557b7d80166fc4ef7e94fd266c23eb1 Text-delta-base-sha1: 8bbc6e45a9ddee804a8df86c66ac0c0d7f3eb426 Text-content-length: 32 Text-content-md5: 7dc2ce124c9674158d7f9f8b53b9f567 Text-content-sha1: 8a3f8bdb5d024cea3396809a75f44c6d8a37687e Content-length: 32 SVN��22��h��&}�h�# Revision-number: 5977 Prop-content-length: 133 Content-length: 133 K 10 svn:author V 3 ben K 8 svn:date V 27 2005-06-19T14:03:05.033856Z K 7 svn:log V 35 We should use WM_APP, not WM_USER. PROPS-END Node-path: putty-wishlist/data/wm-app Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 450 Text-content-md5: aed2f210b93c88746dd01707a3009a93 Text-content-sha1: 275806fec239ad6adabcc08c56af00aa71a2c390 Content-length: 460 PROPS-END SVN���444Summary: PuTTY should use WP_APP, not WM_USER Class: bug Difficulty: fun Priority: medium Content-type: text/plain Ben Rudiak-Gould mentions: >App-private window messages are supposed to be numbered from WM_APP. WM_USER >is for window-class-specific messages. You should probably use WM_APP >instead of WM_XUSER, though I doubt it will matter in practice. This should be a trivial change for someone who can test builds on Windows. Revision-number: 5978 Prop-content-length: 271 Content-length: 271 K 8 svn:date V 27 2005-06-19T14:17:24.794372Z K 7 svn:log V 172 A major purpose of PuTTY's memory-allocation functions is to succeed or die trying, so there's no need to check their return values for NULL. Spotted by Ben Rudiak-Gould. K 10 svn:author V 3 ben PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2bab06403bf10e92a619f4ed6ceef0df Text-delta-base-sha1: 34a5ae3537ed0446308aea807c6c6b54584eb0af Text-content-length: 23 Text-content-md5: d4815d9848ffa9d514f51d5c5c51eb9b Text-content-sha1: a17840e375e434acd9f438aff88f68655b29e964 Content-length: 23 SVN��(x �� ��XP Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 598c8dd5a332258907af5009e03c4d9d Text-delta-base-sha1: 0a9e803c090d122cb7824cb7c22a3dd77a20593d Text-content-length: 459 Text-content-md5: 021d7b301a69f7e5d81e3beb6461a866 Text-content-sha1: 588c5501a6f5c87461ca4a7643e27a09be249511 Content-length: 459 SVN����!;�n��w�PB�?B�Q/;, '\n', challengelen) ? "": "\r\nResponse: ", (sizeof s->prompt) - challengelen); s->prompt[(sizeof s->prompt) - 1] = '\0'; } } if (ssh->cfg.try_tis_auth && (s->suppor��� ;�E;; GET_32BIT(s->ret + 5)); ssh2_pkt_send(ssh, s->pktout); s->authed = TRUE; break; } else { logevent ("Pageant failed to answer challenge"); sfree(s�"g��g; Revision-number: 5979 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:19.186995Z PROPS-END Revision-number: 5980 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:19.197818Z PROPS-END Revision-number: 5981 Prop-content-length: 510 Content-length: 510 K 8 svn:date V 27 2005-06-20T13:56:30.462689Z K 7 svn:log V 411 Make the sanity-checks on the size of incoming packets much stricter. We now enforce the following: * Packet must have at least one byte of payload and four bytes of padding. * Total packet length must not exceed 35000 bytes compressed. * Total packet length including length field must be a multiple of cipher block size (or eight bytes). The feebleness of our old checks was noticed by Ben Rudiak-Gould. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 021d7b301a69f7e5d81e3beb6461a866 Text-delta-base-sha1: 588c5501a6f5c87461ca4a7643e27a09be249511 Text-content-length: 265 Text-content-md5: 6dfe04a6a0f97a6d33d828d0ea0dad73 Text-content-sha1: a48ed817fafdbfb0dc55b9fdaa2050fea392f6d1 Content-length: 265 SVN����X�1�X�wOlen > 35000 || st->pad < 4 || st->len - st->pad < 1 || (st->len + 4) % st->cipherblk !=���:�F�'; } } if (ssh->cfg.try_tis_auth && (s->suppor�g!:�g� ("Pageant failed to answer challenge"); sfree(s Revision-number: 5982 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:19.511557Z PROPS-END Revision-number: 5983 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:19.522653Z PROPS-END Revision-number: 5984 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:19.533781Z PROPS-END Revision-number: 5985 Prop-content-length: 153 Content-length: 153 K 7 svn:log V 53 Another reason: GUI PuTTYgen won't block batch files K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-06-21T15:31:37.369718Z PROPS-END Node-path: putty-wishlist/data/puttygen-batch Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ed572135dbdfb43783a551abd4132230 Text-delta-base-sha1: 8e75930c1541736235191c77006b094ee646a485 Text-content-length: 358 Text-content-md5: a3b04ac1083bc75d7060e54f7dd15547 Text-content-sha1: 34de80127d8595cfb8ebd70784cec6401431e788 Content-length: 358 SVN��~T N�%�N�aAnother reason that the current Windows PuTTYgen is unsuited to batch use is that as a Windows GUI application, it will not block the batch file but be launched off asynchronously. Even ignoring the randomness issue (which can be ignored for automated format conversions, for instance), a separate console application would be require Revision-number: 5986 Prop-content-length: 1906 Content-length: 1906 K 8 svn:date V 27 2005-06-21T20:13:48.735987Z K 7 svn:log V 1804 Fix an apparently-harmless error spotted by Ben Rudiak-Gould: do_ssh2_transport() was returning the wrong value for rekeys after the first. This apparent error was introduced in r4901, but we can't see any reason for the change to have been made. If it turns out to be a mistake to revert it, I'm sure we'll find out. Here for posterity is Simon's analysis: | A lot of the return values from do_ssh2_transport appear to be vestigial: it | used to be that a zero return from do_ssh2_transport meant it had handled the | packet internally, and a 1 return meant the packet wasn't a transport-layer | one and needed to pass on to do_ssh2_authconn. Since r4901, however, the | layer discrimination is done based on the message type ranges, and the only | remaining dependency on the return value from do_ssh2_transport is a special | case in ssh2_protocol which detects the first 1 return and makes the | initialisation call to do_ssh2_authconn. | | Therefore, the gratuitous 1 return on every key exchange as a result of the | confusing if statement is simply ignored in ssh2_protocol (because | ssh->protocol_initial_phase_done is already TRUE). So the remaining question | was, why does the _lack_ of that 1 return not cause a problem, if the if's | sense is indeed reversed? | | The answer is that 1 is still returned, just not by the crReturn inside the | if statement. It's returned by the next crReturn, just after | wait_for_rekey(). Which suggests that in fact, the if statement has the | correct sense, but the crReturn inside it has the wrong value - it should be | returning _zero_, to indicate that every NEWKEYS after the first one is | uninteresting to the authconn code, and on the very first run through that | doesn't happen and the NEWKEYS gets all the way to the crReturn(1) later on. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6dfe04a6a0f97a6d33d828d0ea0dad73 Text-delta-base-sha1: a48ed817fafdbfb0dc55b9fdaa2050fea392f6d1 Text-content-length: 59 Text-content-md5: b1ee4c6b77ae8caf1d5708b4416a28d7 Text-content-sha1: 4cbb09fe7a8c1e3a386c235cf3ebf812771ca518 Content-length: 59 SVN����������� �n��o0�!!��!� Revision-number: 5987 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:19.787519Z PROPS-END Revision-number: 5988 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:19.798344Z PROPS-END Revision-number: 5989 Prop-content-length: 714 Content-length: 714 K 8 svn:date V 27 2005-06-22T10:00:09.031736Z K 7 svn:log V 615 Improve IPA representation of "PuTTY", as suggested by John Lunney. My rationale (as mailed to him): I think you're right. I got the pronunciation there from the second edition of the OED and my Collins dictionary at home, both of which believe that "pretty" is pronounced /'prItI/, but, at least to me, those two vowels are different. Both of them think that /i/ doesn't occur in English words, the vowel in "beat" being /i:/. The third edition of the OED, though, adds /i/ as an English vowel in its pronunciation guide, with "happy" as an example of its use. I'll update the FAQ following your suggestion. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dfc08ff072ad93ea39d6b13a3dcee48e Text-delta-base-sha1: 1cdb1b53db550f57b47b6f4d0bd78f4aa6b10f45 Text-content-length: 24 Text-content-md5: 94ede23906a9ce3d83b0ca2cf064b86b Text-content-sha1: 6c1431e4eb0f9f5144ae4246dffa239e3fbd2cfb Content-length: 24 SVN��A9 �5�>i Revision-number: 5990 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.605148Z PROPS-END Revision-number: 5991 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.616358Z PROPS-END Revision-number: 5992 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.626561Z PROPS-END Revision-number: 5993 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.640645Z PROPS-END Revision-number: 5994 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.651472Z PROPS-END Revision-number: 5995 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.662015Z PROPS-END Revision-number: 5996 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.672785Z PROPS-END Revision-number: 5997 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.685019Z PROPS-END Revision-number: 5998 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.695787Z PROPS-END Revision-number: 5999 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.706421Z PROPS-END Revision-number: 6000 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.718384Z PROPS-END Revision-number: 6001 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.728987Z PROPS-END Revision-number: 6002 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.739838Z PROPS-END Revision-number: 6003 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.750638Z PROPS-END Revision-number: 6004 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.762398Z PROPS-END Revision-number: 6005 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.773342Z PROPS-END Revision-number: 6006 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.784015Z PROPS-END Revision-number: 6007 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.794319Z PROPS-END Revision-number: 6008 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.804341Z PROPS-END Revision-number: 6009 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.814821Z PROPS-END Revision-number: 6010 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.825847Z PROPS-END Revision-number: 6011 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.838212Z PROPS-END Revision-number: 6012 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.848365Z PROPS-END Revision-number: 6013 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.858998Z PROPS-END Revision-number: 6014 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.869438Z PROPS-END Revision-number: 6015 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.879597Z PROPS-END Revision-number: 6016 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.889912Z PROPS-END Revision-number: 6017 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2005-06-25T17:11:25.207616Z K 7 svn:log V 37 mirror.zonekeep.com putty.jwenet.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9dfa833d6feca6cd55eb0fa3db050c3d Text-delta-base-sha1: 846bf5e279ecfb1eca0eb2e9cc174d8a1560d15d Text-content-length: 219 Text-content-md5: c80c04e0b2131fcb5467b478abe6c612 Text-content-sha1: d37edb50a99a341187b378fd4ed196136f9abf0c Content-length: 219 SVN��"8�A��M@�M@�s/putty.jwenet.net/">putty.jwenet.net</a> in the US<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a href="http://mirror.zonekeep.com/putty/">mirror.zonekeepwww.abderian.com/putty/">abderian Revision-number: 6018 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:20.999477Z PROPS-END Revision-number: 6019 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2005-06-25T19:18:24.763720Z K 7 svn:log V 62 Summary: PuTTY interacts badly with Windows' automatic tiling K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/win-tile Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 975 Text-content-md5: e07da3d9c99500e7b19e71ad67adabe7 Text-content-sha1: fa3e9518dc06090af1cb871ab2cc09a6de035728 Content-length: 985 PROPS-END SVN���AAASummary: PuTTY interacts badly with Windows' automatic tiling Class: bug Difficulty: tricky Priority: medium Content-type: text/plain From an e-mail: It would be nice if PuTTY worked better with Windows' taskbar's "Tile Windows Horizontally/Vertically" context menu option. For simplicity let's say you have only two PuTTY windows open. And you right click the task bar and choose "Tile Horizontally". The PuTTY windows don't act the same as say, Notepad, would. Their size doesn't change yet they are positioned properly (one at the top and the other halfway down the screen). Try it with two Notepad windows (or pretty much any program) to see the difference. I assume it's because of PuTTY's strict resizing limitation -- based on the font in the terminal window. It would be great if window sizes were automatically resized to as be close as possible to what's requested of them by a system-wide "Tile Horizontally/Vertically" instruction. Revision-number: 6020 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2005-06-25T19:22:13.859383Z K 7 svn:log V 59 Quote session name in command line example for robustness. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 94ede23906a9ce3d83b0ca2cf064b86b Text-delta-base-sha1: 6c1431e4eb0f9f5144ae4246dffa239e3fbd2cfb Text-content-length: 37 Text-content-md5: 841110e76d2bea82b62369e4ca5f3c3b Text-content-sha1: 0d0298f61d67f1dcdf3239f6208f905dd3ab270a Content-length: 37 SVN��9; �K��eT"mysession" Revision-number: 6021 Prop-content-length: 297 Content-length: 297 K 7 svn:log V 198 In local-to-remote copies, abort if fxp_init() fails, rather than ploughing on and trying to transfer files, which caused a null-pointer deference. Thanks to Fernando Najera for reporting the bug. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-06-25T21:43:09.336850Z PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4815d9848ffa9d514f51d5c5c51eb9b Text-delta-base-sha1: a17840e375e434acd9f438aff88f68655b29e964 Text-content-length: 125 Text-content-md5: 4f38e22fc14ae7dc7eec7046fb084c58 Text-content-sha1: 5fc92f1214af175d5f1dd02407d2a3a2db15b925 Content-length: 125 SVN��x"N�F��kJ�5�R�sint 1 return 0;if (scp_source_setup(targ, targetshouldbedirectory)) return Revision-number: 6022 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.491021Z PROPS-END Revision-number: 6023 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.506784Z PROPS-END Revision-number: 6024 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.528747Z PROPS-END Revision-number: 6025 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.541356Z PROPS-END Revision-number: 6026 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.552459Z PROPS-END Revision-number: 6027 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.569003Z PROPS-END Revision-number: 6028 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.583749Z PROPS-END Revision-number: 6029 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.600531Z PROPS-END Revision-number: 6030 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.616523Z PROPS-END Revision-number: 6031 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.657293Z PROPS-END Revision-number: 6032 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.673355Z PROPS-END Revision-number: 6033 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.688265Z PROPS-END Revision-number: 6034 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.708950Z PROPS-END Revision-number: 6035 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.734028Z PROPS-END Revision-number: 6036 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.753013Z PROPS-END Revision-number: 6037 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:23.768643Z PROPS-END Revision-number: 6038 Prop-content-length: 289 Content-length: 289 K 7 svn:log V 188 Try to make it slightly clearer that TIS/CryptoCard are generic, since SSH:TDGv2 seems to think that TIS is only relevant to its original application (whose name eludes me at the moment). K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-06-29T18:20:17.153075Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: feea546d3c28f4469cf0b71346aaefef Text-delta-base-sha1: 404e2b9bc8ef94252bc4083a665888f574a58916 Text-content-length: 387 Text-content-md5: 1bc19fc403d875a49dae1174ad6d801f Text-content-sha1: 91c4e40df97dcdfde25acd7e8b21b2f7310ec7d2 Content-length: 387 SVN����8�2�8�L(despite their names) generic forms of simple \I{challenge/response authentication}challenge/response authentication available in SSH protocol version 1 only. You might use them if you were using \i{S/Key} \i{one-time passwords}, for example, or if you had a physical \i{security token} that generated responses �3��X} and other Unix systems, and Revision-number: 6039 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2005-06-29T18:51:33.943030Z K 7 svn:log V 17 putty.rorrim.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c80c04e0b2131fcb5467b478abe6c612 Text-delta-base-sha1: d37edb50a99a341187b378fd4ed196136f9abf0c Text-content-length: 212 Text-content-md5: ef02001d102a4d698e554679a002a252 Text-content-sha1: 9232b3285584ff626fcdd25eef88b0ec1c79aac7 Content-length: 212 SVN��s)� ��N��N��J?�J?� yputty.rorrim.org/">putty.rorrimwww.xmlcity.org/softwaremirror/putty/">xmlcityhuygens.linux4geeks.de/putty/">huygens.linux4geeks.deputty.mirroring.de/">putty.mirroring.de Revision-number: 6040 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.586619Z PROPS-END Revision-number: 6041 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.597942Z PROPS-END Revision-number: 6042 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.609293Z PROPS-END Revision-number: 6043 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.619974Z PROPS-END Revision-number: 6044 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.652276Z PROPS-END Revision-number: 6045 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.662920Z PROPS-END Revision-number: 6046 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.674570Z PROPS-END Revision-number: 6047 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.686513Z PROPS-END Revision-number: 6048 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.697696Z PROPS-END Revision-number: 6049 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.709763Z PROPS-END Revision-number: 6050 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.721543Z PROPS-END Revision-number: 6051 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.733356Z PROPS-END Revision-number: 6052 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.743859Z PROPS-END Revision-number: 6053 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.754587Z PROPS-END Revision-number: 6054 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.766336Z PROPS-END Revision-number: 6055 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.779164Z PROPS-END Revision-number: 6056 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.790606Z PROPS-END Revision-number: 6057 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.801890Z PROPS-END Revision-number: 6058 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.813326Z PROPS-END Revision-number: 6059 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.825328Z PROPS-END Revision-number: 6060 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.837730Z PROPS-END Revision-number: 6061 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.848504Z PROPS-END Revision-number: 6062 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.859865Z PROPS-END Revision-number: 6063 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.871286Z PROPS-END Revision-number: 6064 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.882081Z PROPS-END Revision-number: 6065 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.910460Z PROPS-END Revision-number: 6066 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:25.922341Z PROPS-END Revision-number: 6067 Prop-content-length: 212 Content-length: 212 K 8 svn:date V 27 2005-07-05T21:15:23.357282Z K 7 svn:log V 113 Piers Finlayson reports that "DigiSSH_2.0" chokes (in a new and exciting manner) on rekeys. Add it to the list. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b1ee4c6b77ae8caf1d5708b4416a28d7 Text-delta-base-sha1: 4cbb09fe7a8c1e3a386c235cf3ebf812771ca518 Text-content-length: 155 Text-content-md5: 5f0807799750e43e183e11c57b8acc71 Text-content-sha1: 3d498ed91e2d2d9a9e494189276fddfc02a78845 Content-length: 155 SVN���� �%��BDigiSSH_2.0", imp) || ���#�]�rompt[(sizeof s->prompt) - 1] = '\0�!D#�!�eak; } else { logevent Revision-number: 6068 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:26.411117Z PROPS-END Revision-number: 6069 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:26.424951Z PROPS-END Revision-number: 6070 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:26.435243Z PROPS-END Revision-number: 6071 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2005-07-06T11:53:37.633524Z K 7 svn:log V 37 Couple more reports. (No real news.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh1-fwd-trouble Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aa9231fb08fdedfbcb0aa16890be0fa3 Text-delta-base-sha1: 976ed72510ce4626fd083e48d8a19e30fbdfe12e Text-content-length: 138 Text-content-md5: d9d3d5b560e99b50ea1a255d30a3d9a7 Text-content-sha1: 3593fb1828418bca4237c9d632dcbc19835a1d4f Content-length: 138 SVN��0$y�+�yli><tt>DPEHJNMCEDBKMLLEIMIKOEPMDCAA.jochen.hiller@gmx.net</tt> <li><tt>20050706114453.DB572CA45@cpmail.cp.net</tt> </ul> Revision-number: 6072 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:26.602998Z PROPS-END Revision-number: 6073 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2005-07-06T14:25:23.442761Z K 7 svn:log V 43 More details on the ssh-askpass interface. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/gui-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1f193e6d90a1a7fc6b165c9e7e153a6b Text-delta-base-sha1: f0d7ca74685ccc25a3f48eb32d31daa15f780cf2 Text-content-length: 534 Text-content-md5: f05cf2bd98fbb43cabd4dea73b905193 Text-content-sha1: ab2dc5c811348ea5f8f1b090ad4777d29b55cba2 Content-length: 534 SVN��v4 ~��~�$Rwe can probably implement the <code>ssh-askpass</code> interface, although it would look a bit naff (existing passphrase requesters mention OpenSSH in the dialog caption, and only allow one prompt at a time). <ul> <li>For reference, the <code>ssh-askpass</code> interface is rather simple: a prompt (may contain newlines) is optionally passed in as the first argument, the passphrase is spit out on stdout with a newline, and exit status is zero for success and non-zero for failure or user cancellation. </ul> Revision-number: 6074 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:26.661350Z PROPS-END Revision-number: 6075 Prop-content-length: 161 Content-length: 161 K 7 svn:log V 61 Missing argument in MALLOC_LOG version of snrealloc() macro. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-07-06T18:26:41.533813Z PROPS-END Node-path: putty/puttymem.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c91c93d015c4f03fe5c766c2b4c2d98 Text-delta-base-sha1: 5c28469836c98218d3632e11c7ea8727c8f11c83 Text-content-length: 23 Text-content-md5: 0c1d2f6aa95ceb8fa19f8643a0706fc2 Text-content-sha1: 1d286f689c8381bff933197bb8eec49fd54d2206 Content-length: 23 SVN��GI �m��Zm,s Revision-number: 6076 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:26.826967Z PROPS-END Revision-number: 6077 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:26.837446Z PROPS-END Revision-number: 6078 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:26.848131Z PROPS-END Revision-number: 6079 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:26.858370Z PROPS-END Revision-number: 6080 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 Add links to Peter Koch's smartcard patch. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-07-07T20:49:56.504133Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1585ef8b471ca6a2b3bd39785a73ebc7 Text-delta-base-sha1: 798efd0ee87690281678040ce950df1f10c50b2b Text-content-length: 129 Text-content-md5: fe8782af5286b8bc1f018c001e9b4afc Text-content-sha1: 0eac4b7fc1abc622403031a319452f989c7c208d Content-length: 129 SVN��6F k�E�k� opensc.org/files/contrib/"> PuTTYcard</a>, a patch for <a href="wishlist/smartcard-auth.html">smartcard Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 251f9fb9798141c9e5365afe3dc58689 Text-delta-base-sha1: d8e6acc2e9b4205b46be05e7303029fbbfe5d51d Text-content-length: 110 Text-content-md5: 85c26039abb3c914f27d684c91968852 Text-content-sha1: 8a0f90a5f36485be1bbb4b7e2e778ffab018a237 Content-length: 110 SVN��? X� �X�5 br>(patch can be found at <a href="http://www.opensc.org/files/contrib/">opensc.org</a>) Revision-number: 6081 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2005-07-07T23:46:34.779279Z K 7 svn:log V 74 Clarify what's going on with the various smartcard patches at opensc.org. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fe8782af5286b8bc1f018c001e9b4afc Text-delta-base-sha1: 0eac4b7fc1abc622403031a319452f989c7c208d Text-content-length: 195 Text-content-md5: 559798c3ccb1aa4ed1118e12eb86c9f4 Text-content-sha1: fb5a199a420562665160cd0ccdc31ca1b8cc8c0b Content-length: 195 SVN��Fj +�1�+�8Several different patches for <a href="wishlist/smartcard-auth.html">smartcard support</a> can be found at <a href="http://www.opensc.org/files/contrib/">opensc.org Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85c26039abb3c914f27d684c91968852 Text-delta-base-sha1: 8a0f90a5f36485be1bbb4b7e2e778ffab018a237 Text-content-length: 363 Text-content-md5: 195fa5aa51beb457ba4105029c8e2836 Text-content-sha1: fd80a4e4eb2c71ef563b3aec5feaee1ae97e4bbf Content-length: 363 SVN�� M�%��#qs�wZli>These patches can be found in <a href="http://www.opensc.org/files/contrib/">opensc.org's contrib directory</a>.A compiled binary called PuTTYcard can <em>also</em> be found in <a href="http://www.opensc.org/files/contrib/">opensc.org's contrib directory</a>, although confusingly it apparently doesn't <em>use</em> OpenSC. </ul> Revision-number: 6082 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2005-07-08T14:11:56.981764Z K 7 svn:log V 35 putty.cs.utah.edu putty.fast.co.nz K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef02001d102a4d698e554679a002a252 Text-delta-base-sha1: 9232b3285584ff626fcdd25eef88b0ec1c79aac7 Text-content-length: 180 Text-content-md5: d1450767ead39942e986b787677ed9a2 Text-content-sha1: 9df59a492eabe30efd080e3e5b8b1ed85bbf1803 Content-length: 180 SVN��s% �k��0�I@�9.�(Kputty.fast.co.nz/">putty.fast.co.nz</a> in New Zealandcs.utah.edu/">putty.cs.utah.educs.utah.edu/pub/putty/">putty.cs.utah.edu</a> in the US Revision-number: 6083 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:27.105387Z PROPS-END Revision-number: 6084 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2005-07-09T12:13:10.946850Z K 7 svn:log V 13 HTML cockups K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 195fa5aa51beb457ba4105029c8e2836 Text-delta-base-sha1: fd80a4e4eb2c71ef563b3aec5feaee1ae97e4bbf Text-content-length: 95 Text-content-md5: e7fe65e700f73e3778afe376b742e871 Text-content-sha1: 5677fa69f1738cccefab0be2744638471c825216 Content-length: 95 SVN�� @�K��}K�^f�0\</tt>br>These patches can. <li><tt><300242548@web.de></tt> Revision-number: 6085 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2005-07-09T15:49:36.813143Z K 7 svn:log V 11 Add `tsb'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ab041d665827cfbe6da1583a75baefe Text-delta-base-sha1: aa0cf1c4f59eb3b99cb6f1c78cceb9e747003e43 Text-content-length: 177 Text-content-md5: 5e7c98c1e1f24d7ec2d7f782aa18b3c0 Text-content-sha1: e8cfd14e23fd70e2e219f695b116036ca69ceee8 Content-length: 177 SVN��;T �a��Yb Another possibility is <a href="http://www.elifulkerson.com/projects/telnet-serial-bridge.php">tsb</a>, which apparently works on Win9x/Me as well. <p> Revision-number: 6086 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:27.727412Z PROPS-END Revision-number: 6087 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:27.738262Z PROPS-END Revision-number: 6088 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:27.748598Z PROPS-END Revision-number: 6089 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2005-07-12T20:30:40.413337Z K 7 svn:log V 53 Problem localised somewhat, thanks to Jochen Hiller. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh1-fwd-trouble Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d9d3d5b560e99b50ea1a255d30a3d9a7 Text-delta-base-sha1: 3593fb1828418bca4237c9d632dcbc19835a1d4f Text-content-length: 207 Text-content-md5: dc10a04e9122217b260d378900a5bd0e Text-content-sha1: 9a6a145c0fb8eb4a3990bb7afba60f37c720bbc6 Content-length: 207 SVN��$3�O��[� 2005-02-17 Present-in: 2005-02-18. A correspondent has found that the problem appeared between 2005-02-17 and 2005-02-18, which implies that something between r5324:5335 broke it Revision-number: 6090 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:27.803046Z PROPS-END Revision-number: 6091 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:27.815313Z PROPS-END Revision-number: 6092 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:27.826192Z PROPS-END Revision-number: 6093 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:27.847923Z PROPS-END Revision-number: 6094 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:27.858807Z PROPS-END Revision-number: 6095 Prop-content-length: 271 Content-length: 271 K 8 svn:date V 27 2005-07-15T11:47:28.947778Z K 7 svn:log V 170 Patch from Colin Watson: we were sometimes passing stack storage to putenv(), which is Bad (in his case, it caused TERM to end up unset). Use malloc()'d storage instead. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ad3d97abaca68f2b26bb2a8d84b10206 Text-delta-base-sha1: 667e81c4e3acda5741c7569d28eeb026772007f8 Text-content-length: 416 Text-content-md5: 867abf43bb40d4daf3ce4ad50d4d4195 Text-content-sha1: 2ffc882694989a1a31e024de1071cf3652bc4206 Content-length: 416 SVN��:N|��8�U|D�{?*term_env_var = dupprintf("TERM=%s", cfg->termtype); putenv(term_env_var); /* We mustn't free term_env_var, as putenv links it into the * environment in place. */*windowid_env_var = dupprintf("WINDOWID=%ld", windowid); putenv(windowid_env_var); /* We mustn't free windowid_env_var, as putenv links it into the * environment in place. */ Revision-number: 6096 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.724821Z PROPS-END Revision-number: 6097 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.757560Z PROPS-END Revision-number: 6098 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.769433Z PROPS-END Revision-number: 6099 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.781023Z PROPS-END Revision-number: 6100 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.793061Z PROPS-END Revision-number: 6101 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.803565Z PROPS-END Revision-number: 6102 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.814875Z PROPS-END Revision-number: 6103 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.833310Z PROPS-END Revision-number: 6104 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.843902Z PROPS-END Revision-number: 6105 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.855839Z PROPS-END Revision-number: 6106 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.879560Z PROPS-END Revision-number: 6107 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:28.890666Z PROPS-END Revision-number: 6108 Prop-content-length: 139 Content-length: 139 K 7 svn:log V 39 heavysystems.com putty.hostingzero.com K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-07-17T13:24:41.233973Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d1450767ead39942e986b787677ed9a2 Text-delta-base-sha1: 9df59a492eabe30efd080e3e5b8b1ed85bbf1803 Text-content-length: 148 Text-content-md5: 50e1e78a4dd6f335cc118bb69bf0b461 Text-content-sha1: bbe2538746607b0cbfb5fdaf6894b988d981cd42 Content-length: 148 SVN��%k�%��M:�n�M:�M�,yhostingzero.com/">putty.hostingzerowww.heavysystems.com/putty/">heavysystemsputty.jwenet.net/">putty.jwenet Revision-number: 6109 Prop-content-length: 375 Content-length: 375 K 8 svn:date V 27 2005-07-17T13:37:58.621230Z K 7 svn:log V 274 This is getting silly; nearly 25% of our mirrors are now in the US. Discourage more strongly mirrors in well-served areas in the Feedback section. Also, duplicate that text on the Mirrors page, along with a request to tell us the country (since lots of people still don't). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5555369a2af8712efb5ebcea1fcae058 Text-delta-base-sha1: cdc04985d30be2dee44032ed9f2aadf98dfda678 Text-content-length: 330 Text-content-md5: 2250440c818212eb3088d634e0924d22 Text-content-sha1: 97494ef1bd5c91926c022fd111bbaa4fa1fc1d68 Content-length: 330 SVN��Pk(�'��h&s�4\#{This paragraph also in putty-website/mirrors.html}(However, if you're in a region that is already well served by mirrors, you should consider whether yet another one will be worth the effort.) Please don't bother asking us for permission before setting up a mirror. You already have permission Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 50e1e78a4dd6f335cc118bb69bf0b461 Text-delta-base-sha1: bbe2538746607b0cbfb5fdaf6894b988d981cd42 Text-content-length: 574 Text-content-md5: df25b544584e5e846daa086022f52a08 Text-content-sha1: 87d87eddfdae579ea9b7b7a2306a4a0740116535 Content-length: 574 SVN��x�B��s?�*g!-- This paragraph also in putty/doc/feedback.but --> <p> Mirrors of the PuTTY web site are welcome, especially in regions not well covered by existing mirrors. (However, if you're in a region that is already well served by mirrors, you should consider whether yet another one will be worth the effort.) Please don't bother asking us for permission before setting up a mirror. You already have permission.Once you've set up your mirror, mail us with its address and the country it's in. However, before notifying us, please do test that Revision-number: 6110 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:29.540479Z PROPS-END Revision-number: 6111 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:29.551561Z PROPS-END Revision-number: 6112 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:29.564131Z PROPS-END Revision-number: 6113 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:29.575351Z PROPS-END Revision-number: 6114 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:29.585693Z PROPS-END Revision-number: 6115 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:29.597988Z PROPS-END Revision-number: 6116 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:29.609440Z PROPS-END Revision-number: 6117 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:29.619957Z PROPS-END Revision-number: 6118 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:29.632025Z PROPS-END Revision-number: 6119 Prop-content-length: 115 Content-length: 115 K 7 svn:log V 15 putty.lamer.sk K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-07-18T23:44:19.226521Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df25b544584e5e846daa086022f52a08 Text-delta-base-sha1: 87d87eddfdae579ea9b7b7a2306a4a0740116535 Text-content-length: 66 Text-content-md5: 2d32c379b8148e0698aceffadc8fde61 Text-content-sha1: eb70e22ddbe0387ad8130c78b2db375e3ed73658 Content-length: 66 SVN��xb'�/��C�I/lamer.sk/">putty.lamer.sk</a> in Slovak Revision-number: 6120 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.151939Z PROPS-END Revision-number: 6121 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.162568Z PROPS-END Revision-number: 6122 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.176134Z PROPS-END Revision-number: 6123 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.187536Z PROPS-END Revision-number: 6124 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.198294Z PROPS-END Revision-number: 6125 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.210055Z PROPS-END Revision-number: 6126 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.222866Z PROPS-END Revision-number: 6127 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.235002Z PROPS-END Revision-number: 6128 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2005-07-23T18:03:11.800050Z K 7 svn:log V 104 Firm up conclusions about affected systems. Add Dutch and German versions of message as Google-fodder. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f64e108e223e3f9a27c055c29ab2462 Text-delta-base-sha1: c0d3009b247b0af7a012ce1e238529a4d49d30d1 Text-content-length: 689 Text-content-md5: 90cee8d7161424c75a64c0b0d8bfc24c Text-content-sha1: 83638b9c4338a73d53d7be6ca592f8a2669342fc Content-length: 689 SVN��'^�?��r\�)R�t3or (in German): <blockquote> Diese Anwendung konnte nicht gestartet werden, weil die Anwenungskonfiguration nicht korrekt ist. Zur Problembehebung sollten Sie die Anwendung neu installiere n. </blockquote> <p>or (in Dutch): <blockquote> De toepassing kan niet worden gestart omdat de configuratie van de toepassing onjuist is. Het opnieuw installeren van de toepassing kan die probleem oplossen. </blockquote> <p> (Reinstalling PuTTY does not fix the problem.) <p> As far as we can tell, this problem only affects Windows XP systems that don't have Service Pack 2 installed. In particular, we've had one report that installing SP2 solved the problem Revision-number: 6129 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.408364Z PROPS-END Revision-number: 6130 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2005-07-23T18:23:20.461001Z K 7 svn:log V 54 Summary: Multiple askappend dialogue boxes on Windows K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/win-askappend-multi Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 481 Text-content-md5: f537f17480bba5c149bcdd19b86d761a Text-content-sha1: b989bc14366f617571a97fbeba96d33965259df3 Content-length: 491 PROPS-END SVN���SSSSummary: Multiple askappend dialogue boxes on Windows Present-in: 0.58 Class: bug Content-type: text/plain Priority: medium According to a report: When PuTTY is set up to log (printable or all session data), and the option "Ask the user every time" is selected, two dialog boxes titled "PuTTY Log to File" questioning whether to overwrite, append, or cancel logging appeared. After answering both dialog boxes, the PuTTY terminal no longer displays incoming data. Revision-number: 6131 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2005-07-23T19:04:01.763079Z K 7 svn:log V 32 Robert Schultz's p < q problem. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/rsa-import-primeorder Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 563 Text-content-md5: d993d1acc93c186e77838afa2792cf04 Text-content-sha1: 62b354266f9c6de0e58ef845d84f5c3c3137534b Content-length: 573 PROPS-END SVN���%%%Summary: PuTTYgen shouldn't insist that p > q in imported OpenSSH RSA private keys Class: bug Priority: medium Present-in: 0.58 Difficulty: tricky Content-type: text/x-html-body <p> OpenSSH-format RSA private keys (also known as PEM format) contain a base64-encoded PKCS#1 RSAPrivateKey. When generated by OpenSSL, these always have p > q, but this isn't actually required by PKCS#1. At present, PuTTYgen will reject keys where p < q, but it should accept them and make whatever changes are necessary to have them work with PuTTY's RSA code. Revision-number: 6132 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2005-07-23T19:16:44.642295Z K 7 svn:log V 26 Add implementation notes. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/rsa-import-primeorder Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d993d1acc93c186e77838afa2792cf04 Text-delta-base-sha1: 62b354266f9c6de0e58ef845d84f5c3c3137534b Text-content-length: 792 Text-content-md5: d3ed2dd3bf68d70b0419c3a1393762a6 Text-content-sha1: 8625c229bb9dc3287894da5ed51a3a205f406c6c Content-length: 792 SVN��%A�<� these always have p > q, but this isn't actually required by PKCS#1. At present, PuTTYgen will reject keys where p < q, but it should accept them and make whatever changes are necessary to have them work with PuTTY's RSA code. <p> This is not <em>quite</em> trivial to do in the current PuTTY code organisation, since the OpenSSH import code does not actually convert the input key to bignum format; it just massages it into one of the other private key blob formats and feeds that to an import function in sshrsa.c. In order to reverse the order of the primes, it would have to compute the new <code>iqmp</code> value, which would involve a conversion to bignums and back. Still not impossible by any means, but I'd guess more like a thirty-line job than three. Revision-number: 6133 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.730278Z PROPS-END Revision-number: 6134 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.743331Z PROPS-END Revision-number: 6135 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.754204Z PROPS-END Revision-number: 6136 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.765297Z PROPS-END Revision-number: 6137 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.776843Z PROPS-END Revision-number: 6138 Prop-content-length: 468 Content-length: 468 K 7 svn:log V 369 draft-ietf-secsh-transport-24 says that only "SSH-" at the start of a line marks a version string. It's a bit vague about the definition of a line, but I think it's reasonable to assume that they'll end with LF. Change do_ssh_init() to ignore "SSH-" anywhere else. This makes the existing state machine overkill, so replace it with something a little more readable. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-07-24T13:46:14.285395Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f0807799750e43e183e11c57b8acc71 Text-delta-base-sha1: 3d498ed91e2d2d9a9e494189276fddfc02a78845 Text-content-length: 668 Text-content-md5: afa39b20f5893457a7ece5dbb918dfdb Text-content-sha1: 0420995858f4973a150b86878c76f55c21d6c756 Content-length: 668 SVN����7�V��s a line beginning with the string "SSH-" in the input. */ for (;;) { if (c != 'S') goto no; crReturn(1); if (c != 'S') goto no; crReturn(1); if (c != 'H') goto no; crReturn(1); if (c != '-') goto no; break; no: while (c != '\012') crReturn(1); crReturn(1);rompt[(sizeof s->prompt) - 1] = '\0'; } } if (ssh->cfg.try_tis_auth && (s->supported_auths_mask & (1 << SSH1_AUTH_CCARD)) && !s->ccard_auth_re��� �aeak; } else { logevent ("Pageant failed to answer challenge"); sfree(s->ret); } } } if (s->authed) continue; �D%��% Revision-number: 6139 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:30.915929Z PROPS-END Revision-number: 6140 Prop-content-length: 139 Content-length: 139 K 7 svn:log V 39 -abderian.com +piotrkosoft.netinet.net K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-07-25T22:56:24.363589Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2d32c379b8148e0698aceffadc8fde61 Text-delta-base-sha1: eb70e22ddbe0387ad8130c78b2db375e3ed73658 Text-content-length: 100 Text-content-md5: b60fae5069727ccc122acee0ddbab673 Text-content-sha1: 557a39eb321b149422e4a63e9339880c53c555c9 Content-length: 100 SVN��b�C�.�C�I=�.�-5piotrkosoft.netinet.net/pub/mirrors/putty/">piotrkosoft.netinet.net Revision-number: 6141 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2005-07-27T13:11:19.764973Z K 7 svn:log V 18 putty.udstudio.hu K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b60fae5069727ccc122acee0ddbab673 Text-delta-base-sha1: 557a39eb321b149422e4a63e9339880c53c555c9 Text-content-length: 72 Text-content-md5: 802831a4715edb69d790ce797b4af500 Text-content-sha1: daeb2c2b3773355d6959f178f6450181c5f491a7 Content-length: 72 SVN���o-� ��B�v udstudio.hu/">putty.udstudio.hu</a> in Hungar Revision-number: 6142 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.368852Z PROPS-END Revision-number: 6143 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.393262Z PROPS-END Revision-number: 6144 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.403674Z PROPS-END Revision-number: 6145 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.413436Z PROPS-END Revision-number: 6146 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.423544Z PROPS-END Revision-number: 6147 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.433562Z PROPS-END Revision-number: 6148 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.444036Z PROPS-END Revision-number: 6149 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.454608Z PROPS-END Revision-number: 6150 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.464728Z PROPS-END Revision-number: 6151 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.475070Z PROPS-END Revision-number: 6152 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.485877Z PROPS-END Revision-number: 6153 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:31.496917Z PROPS-END Revision-number: 6154 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2005-08-02T20:14:01.975238Z K 7 svn:log V 30 Add link to Windows x64 build K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 559798c3ccb1aa4ed1118e12eb86c9f4 Text-delta-base-sha1: fb5a199a420562665160cd0ccdc31ca1b8cc8c0b Text-content-length: 91 Text-content-md5: b90241f2e4f1eef8377d4b4e8ead6a71 Text-content-sha1: 5584133d0f5b272f30fe4fa5786e76ec0b0647f7 Content-length: 91 SVN��jE E�,�E�Tww.kelley.ca/amd64/"> x64 build of PuTTY</a> (for Windows on AMD64) Revision-number: 6155 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.310003Z PROPS-END Revision-number: 6156 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.321555Z PROPS-END Revision-number: 6157 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.332737Z PROPS-END Revision-number: 6158 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.343265Z PROPS-END Revision-number: 6159 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.355258Z PROPS-END Revision-number: 6160 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.367366Z PROPS-END Revision-number: 6161 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.379048Z PROPS-END Revision-number: 6162 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.407771Z PROPS-END Revision-number: 6163 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.418697Z PROPS-END Revision-number: 6164 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.463122Z PROPS-END Revision-number: 6165 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.475129Z PROPS-END Revision-number: 6166 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.486601Z PROPS-END Revision-number: 6167 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.498834Z PROPS-END Revision-number: 6168 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.510509Z PROPS-END Revision-number: 6169 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.531226Z PROPS-END Revision-number: 6170 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.541969Z PROPS-END Revision-number: 6171 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.553097Z PROPS-END Revision-number: 6172 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.563802Z PROPS-END Revision-number: 6173 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.579271Z PROPS-END Revision-number: 6174 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.590296Z PROPS-END Revision-number: 6175 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.600893Z PROPS-END Revision-number: 6176 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.612078Z PROPS-END Revision-number: 6177 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.627077Z PROPS-END Revision-number: 6178 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.640075Z PROPS-END Revision-number: 6179 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.650496Z PROPS-END Revision-number: 6180 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:32.662368Z PROPS-END Revision-number: 6181 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2005-08-10T18:04:51.792320Z K 7 svn:log V 67 Summary: On Windows, parent session doesn't close until child does K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/dup-sessions-dont-close Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1326 Text-content-md5: 85c5f7b11ed7f8032b1049f731551016 Text-content-sha1: 99fe824833e05e3b13e785604354b3d2a702919b Content-length: 1336 PROPS-END SVN���  Summary: On Windows, parent session doesn't close until child does Class: semi-bug Difficulty: fun Present-in: 0.58 2005-07-11 2005-08-04 Content-type: text/x-html-body <p> On Win2K/XP, if a session B is started via "Duplicate Session" from a previous session A, the connection associated with A doesn't go away on the server until session B is closed (the TCP connection remains up as seen by <tt>netstat</tt> on both client and server). This can cause processes to hang around, especially if session A is closed rudely (with Alt-F4, for example). <p> This isn't observed on Win98. <p> This is presumably the sort of inheritance of handles/sockets that r5468 was supposed to deal with. In 0.57 (prior to that change), the same occurs with "New Session" too, which lends support to that theory. (I didn't observe this with 0.58, although there is a <a href="http://groups.google.com/groups?selm=1118856270.523545.40240%40g14g2000cwa.googlegroups.com">report</a> of it happening even there with 0.58 on XP.) <p> We might want to make all our sockets non-inheritable with <code>DuplicateHandle()</code>/<code>CloseHandle()</code>. (I haven't found documentation of how you get a handle from a socket, but I've been assured that a socket <em>is</em> a handle, and can just be passed in with appropriate casts.) Revision-number: 6182 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 2005-08-10T18:10:19.656123Z K 7 svn:log V 9 Add 0.57 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/dup-sessions-dont-close Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85c5f7b11ed7f8032b1049f731551016 Text-delta-base-sha1: 99fe824833e05e3b13e785604354b3d2a702919b Text-content-length: 20 Text-content-md5: 452cc31f40dbc0f6ed2a33d8a0d5fa2d Text-content-sha1: b07df3a13316563e408438cee2aebc3c6557a4b7 Content-length: 20 SVN�� %�r��2n7 Revision-number: 6183 Prop-content-length: 385 Content-length: 385 K 8 svn:date V 27 2005-08-10T18:31:24.478272Z K 7 svn:log V 284 Ben Rudiak-Gould points out that we should be using WM_APP as the base for our app-private window messages, which is considerably higher than the WM_XUSER we arbitrarily chose. (This isn't known to be causing any actual problems. The fix seems not to have obviously broken anything.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d21f205c889d67b16c6042c3a042e1e4 Text-delta-base-sha1: 1dce1082b39b1c04e001b67ce69bb0ba8ea90b84 Text-content-length: 129 Text-content-md5: 27a554103301ddc155acb31e9cb46ada Text-content-sha1: afb5b743180dbbc6018036d08c231147c14e7504 Content-length: 129 SVN���� W�}�Q�,TAPP + 2) #define WM_FULLSCR_ON_MAX (WM_APP + 3) #define WM_AGENT_CALLBACK (WM_APP) p, "��� Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8242193a7644a1ce87b607e9219f9d0b Text-delta-base-sha1: 7c2187cdcf1216f8b62b8e27554c07bad7c9e3fb Text-content-length: 27 Text-content-md5: c8a5edd7fc0970ab42dabc79ead6980f Text-content-sha1: f1292356d51286fdcd5c210f647a404ca59f728b Content-length: 27 SVN��tr � ��dAPP Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b712c6760fc2f9b7d545da5dd3f2eb46 Text-delta-base-sha1: f12d712d30063c17d1a4d39240946afcfcad49f5 Text-content-length: 75 Text-content-md5: 3ecc5b084ac3d975c9da6df65b4ed8aa Text-content-sha1: 05bc774e078320012d6c08047df5892f80f33ce0 Content-length: 75 SVN��A 3���a`SYSTRAY (WM_APP + 6) #define WM_SYSTRAY2 (WM_APP Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7dc2ce124c9674158d7f9f8b53b9f567 Text-delta-base-sha1: 8a3f8bdb5d024cea3396809a75f44c6d8a37687e Text-content-length: 27 Text-content-md5: 16dc375adbe5b5b990f23e99643d4a1d Text-content-sha1: ad5dea930f34d40d7902554ffaa3847da7ffaa43 Content-length: 27 SVN��20 �7��v<APP Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c0341702c69d1c4528250aadd06f6a4 Text-delta-base-sha1: b7ce41c6f5b56d19005e8f9dc014428c8ed9d20b Text-content-length: 49 Text-content-md5: 22631b28bc8325b094b0a491ff43500c Text-content-sha1: 8c92de6a1cec7f75e567b6c9ea535578ee99c643 Content-length: 49 SVN�� �E��2\#define WM_NETEVENT (WM_APP Node-path: putty-wishlist/data/wm-app Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aed2f210b93c88746dd01707a3009a93 Text-delta-base-sha1: 275806fec239ad6adabcc08c56af00aa71a2c390 Text-content-length: 45 Text-content-md5: 15d9f0fb3d7949da41531f101a1a2781 Text-content-sha1: 549e99ec06daa6db99c9bf76111fdd32755fae5c Content-length: 45 SVN��4O�Z��[YFixed-in: r6183 2005-08-11 Revision-number: 6184 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.424971Z PROPS-END Revision-number: 6185 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.440495Z PROPS-END Revision-number: 6186 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.463107Z PROPS-END Revision-number: 6187 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.486905Z PROPS-END Revision-number: 6188 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.518192Z PROPS-END Revision-number: 6189 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.540995Z PROPS-END Revision-number: 6190 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.561001Z PROPS-END Revision-number: 6191 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.574077Z PROPS-END Revision-number: 6192 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.587785Z PROPS-END Revision-number: 6193 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.601205Z PROPS-END Revision-number: 6194 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.626976Z PROPS-END Revision-number: 6195 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 73 Another observation of the same assertion, but maybe not the same cause. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-08-20T19:49:39.248254Z PROPS-END Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 658c332e539e90b13ec537d64593fcc5 Text-delta-base-sha1: 1669f1d67aa9dc2f7b06947d154c4b75abef2d7e Text-content-length: 512 Text-content-md5: f8d0f712218ccec7f23d89052cd8f506 Text-content-sha1: 7953722c15484efa3c37ef04ea76a18b4c7f486c Content-length: 512 SVN��Q> h�2�h�$-One user (1124367194.23192.240954800@webmail.messagingengine.com) has found a reliable cause of what may be the same bug: <blockquote> <p>I am using bblean blackbox for windows as a shell on windows XP SP2, and whenever I rollup a maximized putty window the following fatal error results: <pre> line==NULL in terminal.c lineno=4621 y=0 w=93 h=0 count(scrollback=003B0F60)=200 count(screen=00CFA2B8)=0 count(alt=003B0F70)=0 alt_sblines=0 whichtree=00CFA2B8 treeindex=0 </pre> </blockquote> Revision-number: 6196 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2005-08-20T20:32:46.545275Z K 7 svn:log V 70 rekeying with a non-cached host key doesn't work as well as it could. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/hostkey-rekey Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 520 Text-content-md5: dc3cae9a8cf7edb1595aeb07cd8e2548 Text-content-sha1: 4707862d07ee12b276e04fed0978a7aa5b48d8c4 Content-length: 530 PROPS-END SVN���zzzSummary: If the host key isn't saved, rekeys cause another warning Class: bug Difficulty: fun Priority: medium Present-in: 0.58 Content-type: text/plain If the user answers "no" to the "cache host key?" prompt, they get asked again at the next rekey. This is a little silly -- PuTTY should remember the host key it didn't save, and only whinge if the key has changed. What PuTTY should do if a different key for the host has turned up in the cache in the meantime is left as an exercise for the reader. Revision-number: 6197 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.729132Z PROPS-END Revision-number: 6198 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.740030Z PROPS-END Revision-number: 6199 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:34.751024Z PROPS-END Revision-number: 6200 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2005-08-22T20:07:46.976007Z K 7 svn:log V 149 Florian Gaab reports that freeSSHd 1.0.7, which claims a "softwareversion" of "WeOnlyDo-1.2.6", mishandles repeat key exchange. Add it to the list. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: afa39b20f5893457a7ece5dbb918dfdb Text-delta-base-sha1: 0420995858f4973a150b86878c76f55c21d6c756 Text-content-length: 167 Text-content-md5: e9bd8219c8f711a739efc2f47a4d3d73 Text-content-sha1: ed279e3aa3694a231ae41878d4e19b9123502e52 Content-length: 167 SVN���� �Q��J || wc_match("WeOnlyDo-1.2.6���&�Z�AUTH_CCARD)) && !s->ccard_auth_re�%K&�%�} if (s->authed) continue; Revision-number: 6201 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2005-08-22T20:37:13.725713Z K 7 svn:log V 92 Add support for generating project files for use with Dev-C++, contributed by Florian Gaab. K 10 svn:author V 3 ben PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cf3f4f82ce7319b4c33f332eb229efd Text-delta-base-sha1: a49bf39a8f2fbdf2ee2f6bef4716a4fe928511fd Text-content-length: 78 Text-content-md5: 79e5c9ed20aae141ae8d8b271011726f Text-content-sha1: b525418e945e9fd6548598d365f17adc0d14e658 Content-length: 78 SVN��5�g��My�/f - Inside the windows/DEVCPP subdirectory are Dev-C++ Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d58946bd1ff1d404add92e28278f18dd Text-delta-base-sha1: 7a46e06002e87d72db449346d5967b81ed7166c5 Text-content-length: 56 Text-content-md5: c2f1dd02f0991538475768afc9ee05c3 Text-content-sha1: 74830f92b8d707074042704d365bafd5f0773df9 Content-length: 56 SVN��; #��� !makefile devcppproj windows/DEVCPP Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d974df79162f0c31efcac2a80a2be451 Text-delta-base-sha1: e4b1a506f761195a515696bc9ff455e733e81bb3 Text-content-length: 6617 Text-content-md5: 3fab06b90171b82e9644cc285e007db0 Text-content-sha1: 9ce0df7ce8f022b474a42b549c237f72747c3d56 Content-length: 6617 SVN��<5���j�F�rJ�^<��_,�*TSdevcppproj","gtk","ac","mpw", "osx", create_vcvc if (defined $makefiles{'devcppproj'}) { $dirpfx = &dirpfx($makefiles{'devcppproj'}, "\\"); $orig_dir = cwd; ##-- Dev-C++ 5 to prevent any posibility of misinterpreted line endings. # I don't know if Dev-C++ is as touchy as MSVC with LF-only line # endings. But however, CRLF line endings are the common way on # Win32 machines where Dev-C++ is running. # Hence, in order for mkfiles.pl to generate CRLF project files # even when run from Unix, I make sure all files are binary and #devcppproj'} if(! -d $makefiles{'devcppproj'}); chdir $makefiles{'devcppproj'}; @deps = &deps("X.obj", "X.res", $dirpfx, "\\", "devcppproj"); %all_object_deps = map {$_->{obj} => $_->{deps}} @deps; # Make dir names FAT/NTFS compatible my @srcdirs = @srcdirs; for ($i=0; $i<@srcdirs; $i++) { $srcdirs[$i] =~ s/\//\\/g; $srcdirs[$i] =~ s/\\$//; } create_devcpp_project(\%all_object_deps, $progname); } sub create_devcpp_project { my ($all_object_deps, $progname) = @_; # Construct program's dependency info (Taken from 'vcproj', seems to work right here, too.) %seen_objects = (); %lib_files = (); %source_files = (); %header_files = (); %resource_files = (); @object_files = split " ", &objects($progname, "X.obj", "X.res", "X.lib"); foreach $object_file (@object_files) { next if defined $seen_objects{$object_file}; $seen_objects{$object_file} = 1; if($object_file =~ /\.lib$/io) { $lib_files{$object_file} = 1; next; } $object_deps = $all_object_deps{$object_file}; foreach $object_dep (@$object_deps) { if($object_dep =~ /\.c$/io) { $source_files{$object_dep} = 1; next; } if($object_dep =~ /\.h$/io) { $header_files{$object_dep} = 1; next; } if($object_dep =~ /\.(rc|ico)$/io) { $resource_files{$object_dep} = 1; next; } } } $libs = join " ", sort keys %lib_files; @source_files = sort keys %source_files; @header_files = sort keys %header_files; @resources = sort keys %resource_files; ($windows_project, $type) = split ",", $progname; mkdir $windows_project if(! -d $windows_project); chdir $windows_project; $subsys = ($type eq "G") ? "0" : "1"; # 0 = Win32 GUI, 1 = Win32 Console open OUT, ">$windows_project.dev"; binmode OUT; select OUT; print "# DEV-C++ 5 Project File - $windows_project.dev\r\n". "# ** DO NOT EDIT **\r\n". "\r\n". # No difference between DEBUG and RELEASE here as in 'vcproj', because # Dev-C++ does not support mutiple compilation profiles in one single project. # (At least I can say this for Dev-C++ 5 Beta) "[Project]\r\n". "FileName=$windows_project.dev\r\n". "Name=$windows_project\r\n". "Ver=1\r\n". "IsCpp=1\r\n". "Type=$subsys\r\n". # Multimon is disabled here, as Dev-C++ (Version 5 Beta) does not have multimon.h "Compiler=-W -D__GNUWIN32__ -DWIN32 -DNDEBUG -D_WINDOWS -DNO_MULTIMON -D_MBCS_\@\@_\r\n". "CppCompiler=-W -D__GNUWIN32__ -DWIN32 -DNDEBUG -D_WINDOWS -DNO_MULTIMON -D_MBCS_\@\@_\r\n". "Includes=" . (join ";", map {"..\\..\\$dirpfx$_"} @srcdirs) . "\r\n". "Linker=-ladvapi32 -lcomctl32 -lcomdlg32 -lgdi32 -limm32 -lshell32 -luser32 -lwinmm -lwinspool_\@\@_\r\n". "Libs=\r\n". "UnitCount=" . (@source_files + @header_files + @resources) . "\r\n". "Folders=\"Header Files\",\"Resource Files\",\"Source Files\"\r\n". "ObjFiles=\r\n". "PrivateResource=${windows_project}_private.rc\r\n". "ResourceIncludes=..\\..\\..\\WINDOWS\r\n". "MakeIncludes=\r\n". "Icon=\r\n". # It's ok to leave this blank. "ExeOutput=\r\n". "ObjectOutput=\r\n". "OverrideOutput=0\r\n". "OverrideOutputName=$windows_project.exe\r\n". "HostApplication=\r\n". "CommandLine=\r\n". "UseCustomMakefile=0\r\n". "CustomMakefile=\r\n". "IncludeVersionInfo=0\r\n". "SupportXPThemes=0\r\n". "CompilerSet=0\r\n". "CompilerSettings=0000000000000000000000\r\n". "\r\n"; $unit_count = 1; foreach $source_file (@source_files) { print "[Unit$unit_count]\r\n". "FileName=..\\..\\$source_file\r\n". "Folder=Source Files\r\n". "Compile=1\r\n". "CompileCpp=0\r\n". "Link=1\r\n". "Priority=1000\r\n". "OverrideBuildCmd=0\r\n". "BuildCmd=\r\n". "\r\n"; $unit_count++; } foreach $header_file (@header_files) { print "[Unit$unit_count]\r\n". "FileName=..\\..\\$header_file\r\n". "Folder=Header Files\r\n". "Compile=1\r\n". "CompileCpp=1\r\n". # Dev-C++ want's to compile all header files with both compilers C and C++. It does not hurt. "Link=1\r\n". "Priority=1000\r\n". "OverrideBuildCmd=0\r\n". "BuildCmd=\r\n". "\r\n"; $unit_count++; } foreach $resource_file (@resources) { if ($resource_file =~ /.*\.(ico|cur|bmp|dlg|rc2|rct|bin|rgs|gif|jpg|jpeg|jpe)/io) { # Default filter as in 'vcproj' $Compile = "0"; # Don't compile images and other binary resource files $CompileCpp = "0"; } else { $Compile = "1"; $CompileCpp = "1"; # Dev-C++ want's to compile all .rc files with both compilers C and C++. It does not hurt. } print "[Unit$unit_count]\r\n". "FileName=..\\..\\$resource_file\r\n". "Folder=Resource Files\r\n". "Compile=$Compile\r\n". "CompileCpp=$CompileCpp\r\n". "Link=0\r\n". "Priority=1000\r\n". "OverrideBuildCmd=0\r\n". "BuildCmd=\r\n". "\r\n"; $unit_count++; } #Note: By default, [VersionInfo] is not used. print "[VersionInfo]\r\n". "Major=0\r\n". "Minor=0\r\n". "Release=1\r\n". "Build=1\r\n". "LanguageID=1033\r\n". "CharsetID=1252\r\n". "CompanyName=\r\n". "FileVersion=0.1\r\n". "FileDescription=\r\n". "InternalName=\r\n". "LegalCopyright=\r\n". "LegalTrademarks=\r\n". "OriginalFilename=$windows_project.exe\r\n". "ProductName=$windows_project\r\n". "ProductVersion=0.1\r\n". "AutoIncBuildNr=0\r\n"; select STDOUT; close OUT; chdir ".."; } } Revision-number: 6202 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.052463Z PROPS-END Revision-number: 6203 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.063401Z PROPS-END Revision-number: 6204 Prop-content-length: 182 Content-length: 182 K 7 svn:log V 84 draft-ietf-secsh-fingerprint has been subsumed into draft-ietf-secsh-publickeyfile. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-08-23T13:11:49.159780Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b90241f2e4f1eef8377d4b4e8ead6a71 Text-delta-base-sha1: 5584133d0f5b272f30fe4fa5786e76ec0b0647f7 Text-content-length: 54 Text-content-md5: 8c7dff76da347c5c5c39bd2fe62f9640 Text-content-sha1: cd8405f2d38202cc02fd4886fb12b73743bc809a Content-length: 54 SVN��Eh�D��F��Apublickeyfile/">publickeyfile Revision-number: 6205 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2005-08-23T13:24:50.202232Z K 7 svn:log V 61 RFC 1123 includes some Telnet stuff we pay attention to too. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c7dff76da347c5c5c39bd2fe62f9640 Text-delta-base-sha1: cd8405f2d38202cc02fd4886fb12b73743bc809a Text-content-length: 102 Text-content-md5: 6b054bae38979a44c3163bd490d381e8 Text-content-sha1: c143819fe815cc35bf5daacd50fefd7aefbfe6a5 Content-length: 102 SVN��hf P�s�P�#E123.txt"> RFC 1123: Requirements for Internet Hosts -- Application and Support Revision-number: 6206 Prop-content-length: 240 Content-length: 240 K 8 svn:date V 27 2005-08-23T14:13:13.562145Z K 7 svn:log V 139 Summary: Reports of PSFTP hanging/consuming 100% CPU Absent-in: 0.56 Present-in: 0.58 2005-08-11 I've now reproduced something like this. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-hang Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1679 Text-content-md5: 925bf01c86d042538de51416f9b34633 Text-content-sha1: e76788f5fee316eb130f9173ed9154ffd2d8c019 Content-length: 1689 PROPS-END SVN���Summary: Reports of PSFTP hanging/consuming 100% CPU Absent-in: 0.56 Present-in: 0.58 2005-08-11 We've had several reports of PSFTP 0.58 hanging or consuming lots of CPU. Possibly this only happens when it's started from Explorer, rather than the Command Prompt. I wasn't able to reproduce this on Win98; however, on Win2K SP4, a PSFTP instance started from a shortcut (including from the start menu) seems to just sit there and munch CPU when asked to "open <sessname>", whereas the same binary started from cmd.exe works fine. No output is seen even if the shortcut invokes "psftp -v". (Seen with 0.58 and 2005-08-11:r6183.) External reports & sketchy notes: * 17762650.1119449356166.JavaMail.root@wamui-cedar.atl.sa.earthlink.net XP Pro, 0.58 run, "open [server]", username/password then responds sluggish (3mins for "exit") * C22F646F6265F94A919BC05D7726FAAF01228820@CHZHBEXC12.ch.kworld.kpmg.com XP - sometimes - 0.58 (not "older") only when more than one psftp session? * 005e01c5a75e$f590d040$06c8a8c0@PETER 0.58, not 0.56 consumes CPU for several mins before starting to xfer; thereafter OK * F8B9B12641FB6B4FAC761BDEF9D63B040616284E@tlv-ex-01.adprod.bmc.com Win2K SP4 - "several computers" (machine specific?); 0.58 start from cmd.exe - OK; from Explorer - hangs hangs after username; sometimes recovers, but slow get/put * E1DcmyG-00029Z-00@ixion.tartarus.org 0.58 on XP SP2 ok from cmd.exe, not from Explorer; hangs between username/password Possibly related?: * eed4e9ec05062811354a7ba1a8@mail.gmail.com XP SP2; 2005-06-28:r6024 hang on bye/exit/quit (command prompt, batch file) from connected Revision-number: 6207 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2005-08-23T15:37:01.708288Z K 7 svn:log V 14 gamehound.net K 10 svn:author V 4 owen PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 802831a4715edb69d790ce797b4af500 Text-delta-base-sha1: daeb2c2b3773355d6959f178f6450181c5f491a7 Text-content-length: 108 Text-content-md5: 062b221aa2271cd0f2903caf11ed4b47 Text-content-sha1: 67ad5da388a391ce8f458c6cb9861b1172aae71a Content-length: 108 SVN��og T�N�T�E*li> <!--HTTPMIRROR--><a href="http://www.gamehound.net/mirrors/putty/">gamehound.net Revision-number: 6208 Prop-content-length: 112 Content-length: 112 K 7 svn:log V 12 More detail K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-08-23T18:06:27.624115Z PROPS-END Node-path: putty-wishlist/data/psftp-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 925bf01c86d042538de51416f9b34633 Text-delta-base-sha1: e76788f5fee316eb130f9173ed9154ffd2d8c019 Text-content-length: 235 Text-content-md5: 98ddb8a280f7bb85379d33bd78348212 Text-content-sha1: c57d0f6bdcaafad661921f30d852e72fbc985b05 Content-length: 235 SVN��tO�D��BD?�b 0.57 2004-12-23, or from Explorer not via a shortcut, works fine. No output is seen even if the shortcut invokes "psftp -v". Same problem if the shortcut specifies the session directly. (Seen with 0.58 and Revision-number: 6209 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.838072Z PROPS-END Revision-number: 6210 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.848965Z PROPS-END Revision-number: 6211 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.860510Z PROPS-END Revision-number: 6212 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.870367Z PROPS-END Revision-number: 6213 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.901998Z PROPS-END Revision-number: 6214 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.912206Z PROPS-END Revision-number: 6215 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.922240Z PROPS-END Revision-number: 6216 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.933105Z PROPS-END Revision-number: 6217 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.943695Z PROPS-END Revision-number: 6218 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.953884Z PROPS-END Revision-number: 6219 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.964377Z PROPS-END Revision-number: 6220 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:35.975709Z PROPS-END Revision-number: 6221 Prop-content-length: 442 Content-length: 442 K 7 svn:log V 341 I think this should fix various problems with queued incoming data not being processed and incoming data being processed out of order, which I suspect is the cause of `ssh1-fwd-trouble' as noted by Gevan Dutton. I'm not able to test the failure case, but it doesn't seem to have obviously broken anything in the cases I have tested, anyway. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-08-26T21:17:49.113682Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e9bd8219c8f711a739efc2f47a4d3d73 Text-delta-base-sha1: ed279e3aa3694a231ae41878d4e19b9123502e52 Text-content-length: 1617 Text-content-md5: be037da6156441b93ef40aac80a9afaa Text-content-sha1: 74111eccbf698e05873c3e8532a0acee6b31e435 Content-length: 1617 SVN�����V��; while (1) { while (bufchain_size(&ssh->queued_incoming_data) > 0 || datalen > 0) { if (ssh->frozen) { ssh_queue_incoming_data(ssh, &data, &datalen); /* This uses up all data and cannot cause anything interesting * to happen; indeed, for anything to happen at all, we must * return, so break out. */ break; } else if (bufchain_size(&ssh->queued_incoming_data) > 0) { /* This uses up some or all data, and may freeze the * session. */ ssh_process_queued_incoming_data(ssh); } else { /* This uses up some or all data, and may freeze the * session. */ ssh_process_incoming_data(ssh, &data, &datalen); } /* FIXME this is probably EBW. */ if (ssh->state == SSH_STATE_CLOSED) return; } /* We're out of data. Go and get some more. */��� ?�s%?�N�/* Prompt heuristic comes from OpenSSH */ strncpy(s->prompt + challengelen, memchr(s->prompt, '\n', challengelen) ? "": "\r\nResponse: ", (sizeof s->prompt) - challengelen); s->prompt[(sizeof s->prompt) - 1] = '\0'; } } if (ssh->cfg.try_tis_auth && (s->supported_auths_mask & (1 << SSH1_�K}22�K� sfree(s->agentreq); if (s->ret) { if (s->ret[4] == SSH2_AGENT_SIGN_RESPONSE) { logevent("Sending Pageant's response"); ssh2_add_sigblob(ssh, s->pktout, s->pkblob, s->pklen, s->ret + 9, GET_32BIT(s->ret + 5)); ssh2_pkt_send(ssh, s->pktout); s->authed = TRUE; break; } else { logevent ("Pageant failed to answer challenge"); sfree(s->ret); } } Revision-number: 6222 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:36.402950Z PROPS-END Revision-number: 6223 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:36.413680Z PROPS-END Revision-number: 6224 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:36.425264Z PROPS-END Revision-number: 6225 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:36.485536Z PROPS-END Revision-number: 6226 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:36.496659Z PROPS-END Revision-number: 6227 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:36.508307Z PROPS-END Revision-number: 6228 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:36.519954Z PROPS-END Revision-number: 6229 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:36.531460Z PROPS-END Revision-number: 6230 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2005-08-29T00:20:15.864330Z K 7 svn:log V 54 Gevan Dutton reports that r6221 did in fact fix this. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh1-fwd-trouble Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc10a04e9122217b260d378900a5bd0e Text-delta-base-sha1: 9a6a145c0fb8eb4a3990bb7afba60f37c720bbc6 Text-content-length: 330 Text-content-md5: 00d44fdfafc152f42643c5db20d4dfdf Text-content-sha1: 2c29b83a684a8e295f5fe39908da84d364755b61 Content-length: 330 SVN��m 1�a!�[hSummary: Reports of SSH-1 trouble, particularlyFixed-in: r6221 2005-08-27<em>Update:</em> we've made a change which is reported to have fixed this. (It turns out that use of port forwarding wasn't absolutely necessary to cause this problem.) Thanks to Gevan Dutton for pointing us in the right direction. Revision-number: 6231 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2005-08-29T00:22:28.584399Z K 7 svn:log V 33 Oh, and it was definitely a bug. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh1-fwd-trouble Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 00d44fdfafc152f42643c5db20d4dfdf Text-delta-base-sha1: 2c29b83a684a8e295f5fe39908da84d364755b61 Text-content-length: 28 Text-content-md5: cc6d9541a94e40a480e6683fcf1ae1cb Text-content-sha1: fc505e84d9f5afc7c3556003b31fe94a5dafba2d Content-length: 28 SVN��mx �I��&GClass: bu Revision-number: 6232 Prop-content-length: 206 Content-length: 206 K 8 svn:date V 27 2005-08-29T00:30:21.651855Z K 7 svn:log V 105 Summary: SSH data can get stuck in a queue if session frozen during close Gevan Dutton's other problem. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh-stuck-queue Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 844 Text-content-md5: 4efce57f4c99395a382ccb766ec0e73e Text-content-sha1: 9d4e556d39bf3170ba3f316dc432d21c7f3e8f1c Content-length: 854 PROPS-END SVN���>>>Summary: SSH data can get stuck in a queue if session frozen during close Present-in: 0.58 Class: bug Content-type: text/x-html-body <p> If an SSH connection is frozen (an internal state) over a close, incoming data can end up stuck in <code>ssh->queued_incoming_data</code> and never processed, since that buffer is only examined when new incoming data comes in from the network. In general, it may be being processed rather later than it could be. <p> There's been a report that this shows up in real life when receiving lots of data down an SSH-1 connection, where <code>ssh1_throttle()</code> is called. <br><tt><OF39FE4940.43DB4418-ONCC257067.000BF4DD-CC257067.000F5220@bnz.co.nz> <p> <code>ssh_set_frozen()</code> should probably signal something, but I'm not sure enough of the control flow to know quite what. Revision-number: 6233 Prop-content-length: 173 Content-length: 173 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-08-29T00:34:03.000632Z K 7 svn:log V 73 More versions of WeOnlyDo have the rekey bug (but they've fixed it now). PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: be037da6156441b93ef40aac80a9afaa Text-delta-base-sha1: 74111eccbf698e05873c3e8532a0acee6b31e435 Text-content-length: 227 Text-content-md5: dd1f6d462e4ccc96bc17b9f6e660e502 Text-content-sha1: 577e068284448a2b694c1c8b9168892e0cb4b513 Content-length: 227 SVN����X�X�X�Pp/* All versions <= 1.2.6 (they changed their format in 1.2.7) */ wc_match("WeOnlyDo-*��� �+�Msived TIS�}=@@�}� s->retlen = ssh->agent_response_len; } s->ret = vret; Revision-number: 6234 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:36.986440Z PROPS-END Revision-number: 6235 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:36.997972Z PROPS-END Revision-number: 6236 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:37.008913Z PROPS-END Revision-number: 6237 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:37.150744Z PROPS-END Revision-number: 6238 Prop-content-length: 139 Content-length: 139 K 7 svn:log V 39 One day I'll learn to close HTML tags. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-08-30T11:38:06.063140Z PROPS-END Node-path: putty-wishlist/data/ssh-stuck-queue Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4efce57f4c99395a382ccb766ec0e73e Text-delta-base-sha1: 9d4e556d39bf3170ba3f316dc432d21c7f3e8f1c Text-content-length: 26 Text-content-md5: 6d331f26151b4dd3b175d7bb6ce9e3a7 Text-content-sha1: 63a29a62e6a8bb2713948a4c7a83b68f4095bc57 Content-length: 26 SVN��>C �8��8</tt> Revision-number: 6239 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:37.205038Z PROPS-END Revision-number: 6240 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:37.216104Z PROPS-END Revision-number: 6241 Prop-content-length: 338 Content-length: 338 K 8 svn:date V 27 2005-08-30T20:38:57.184628Z K 7 svn:log V 239 Beginnings of support for multiple exchange hashes in SSH-2: rather than storing a SHA-1 hash of the client and server version strings, store the strings themselves so we can feed them through the appropriate hash when we know what it is. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd1f6d462e4ccc96bc17b9f6e660e502 Text-delta-base-sha1: 577e068284448a2b694c1c8b9168892e0cb4b513 Text-content-length: 885 Text-content-md5: 9199205394a386df007b7e360d789b3c Text-content-sha1: c62c051963fbcd34f5676ce1b95b1813e47bf09c Content-length: 885 SVN����\�0��rL�a='�! char *v_c, *v_s; SHA_State exhash size_t len; len = strcspn(verstring, "\015\012"); ssh->v_c = snewn(len + 1, char); memcpy(ssh->v_c, verstring, len); ssh->v_c[len] = 0; len = strcspn(s->vstring, "\015\012"); ssh->v_s = snewn(len + 1, char); memcpy(ssh->v_s, s->vstring, len); ssh->v_s[len] = 0; ���I��� �7ite_str(ssh, "Using TIS authentication.\r\n"); logevent("ReceSHA_Init(&ssh->exhash); sha_string(&ssh->exhash, ssh->v_c, strlen(ssh->v_c)); sha_string(&ssh->exhash, ssh->v_s, strlen(ssh->v_s))�==g,�<��_*�;om server" " while waiting for agent" " response")); crStopV; } } while (pktin || inlen > 0); vret = ssh->agent_response; v_c = NULL; ssh->v_ssfree(ssh->v_c); sfree(ssh->v_s Revision-number: 6242 Prop-content-length: 279 Content-length: 279 K 8 svn:date V 27 2005-08-30T22:39:35.585521Z K 7 svn:log V 180 Further progress in the direction of variable exchange hashes -- stash the outgoing KEXINIT, and only start generating the exchange hash once we know which KEX method we're using. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9199205394a386df007b7e360d789b3c Text-delta-base-sha1: c62c051963fbcd34f5676ce1b95b1813e47bf09c Text-content-length: 908 Text-content-md5: 5141c0c4bdc010e4df7c12ab3e28bbef Text-content-sha1: 9e12df6d3118b84a4f1daa4b7690dba915e6733c Content-length: 908 SVN�����������Z�a��a^}�e>7� void *our_kexinit; int our_kexinitlens->our_kexinitlen = s->pktout->length - 5; s->our_kexinit = snewn(s->our_kexinitlen, unsigned char); memcpy(s->our_kexinit, s->pktout->data + 5, s->our_kexinitlen); ssh2_pkt_send_noqueue(ssh, s->pktout); if (!pktin) crWaitUntil(pktinSHA_Init(&ssh->exhash); sha_string(&ssh->exhash, ssh->v_c, strlen(ssh->v_c)); sha_string(&ssh->exhash, ssh->v_s, strlen(ssh->v_s)); sha_string(&ssh->exhash, s->our_kexinit, s->our_kexinitlen); sfree(s->our_kexinit); if (pktin->length > 5) sha_string(&ssh->exhash, pktin->data + 5, pktin->length - 5); �=aa�=�o) flags word. */ PUT_32BIT(s->q, 0); if (!agent_query(s->agentreq, s->len + 4, &vret, &s->retlen, ssh_agent_callback, ssh)) { do { crReturnV; if (pktin) { bombout(("Unexpected data fr Revision-number: 6243 Prop-content-length: 424 Content-length: 424 K 8 svn:date V 27 2005-08-31T11:40:01.921996Z K 7 svn:log V 323 Update draft number. Note that we still don't/won't support "arcfour". Note that we don't yet support the IANA names "arcfour256" and "arcfour128". (Is IESG approval sufficient for us to add these, or do we have to wait for RFC-editor? I get the impression that the IANA registry will be updated soon after IESG approval.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/arcfour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d12571c0b06efe1d7032258e45f264d1 Text-delta-base-sha1: 1bd3ff642ed600d92dee638fa842efbac5260e67 Text-content-length: 460 Text-content-md5: 84759398f26c6b7cca1b5c8fef991f92 Text-content-sha1: 11ffbeec2337a02ee412144ab2fa4d4979122011 Content-length: 460 SVN��% 4� ��f3 3.txt">draft-harris-ssh-arcfour-fixes-03 Note that this document defines the "arcfour256" and "arcfour128" ciphers; PuTTY still does not support the less secure "arcfour" cipher, and we have no plans to make it do so. (In fact it currently only supports those ciphers under private names defined in an earlier draft: "arcfour256-draft-00@putty.projects.tartarus.org" and so on. If the draft is approved, we should add the IETF names.) Revision-number: 6244 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:37.729068Z PROPS-END Revision-number: 6245 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:37.739925Z PROPS-END Revision-number: 6246 Prop-content-length: 233 Content-length: 233 K 7 svn:log V 132 Explicitly note that "remote command" semantics typically involve the server closing the connection after the command has executed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-08-31T16:14:21.229214Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1bc19fc403d875a49dae1174ad6d801f Text-delta-base-sha1: 91c4e40df97dcdfde25acd7e8b21b2f7310ec7d2 Text-content-length: 193 Text-content-md5: 00b0426a3b93e86249d2dcc939b03c25 Text-content-sha1: 765574a81879bd5eec2ae446d7eaa7b83c1af8ec Content-length: 193 SVN���� I���I�7}Note that most servers will close the session after executing the command�3LL�3� of each setting, if any, is up to the server. Their names come from \i{POSI Revision-number: 6247 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:38.002477Z PROPS-END Revision-number: 6248 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:38.013367Z PROPS-END Revision-number: 6249 Prop-content-length: 268 Content-length: 268 K 8 svn:date V 27 2005-08-31T19:11:19.634621Z K 7 svn:log V 169 Rename ssh_md5 and ssh_sha1 to ssh_hmac_md5 and ssh_hmac_sha1 respectively. This is to make room for a hash abstraction that's likely to want to use ssh_sha1, at least. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5141c0c4bdc010e4df7c12ab3e28bbef Text-delta-base-sha1: 9e12df6d3118b84a4f1daa4b7690dba915e6733c Text-content-length: 209 Text-content-md5: f3908208cf3643ce9e69edf281ebfde2 Text-content-sha1: ab8acc2cb97d00fc25e0f51c95b5db4e9b0b40b0 Content-length: 209 SVN����l�,�l�hhmac_sha1, &ssh_hmac_md5 }; const static struct ssh_mac *buggymacs[] = { &ssh_hmac_sha1_buggy, &ssh_hmac����l�rStop(0); } c_wr�2��And finally the (zer Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f341dcd67c60562d40b49e9bb481434 Text-delta-base-sha1: 45328aae0f7a090595bd4c1f344de00a9164ea60 Text-content-length: 124 Text-content-md5: 0544296bb046a4d132c5658fe8be0939 Text-content-sha1: 3f0a90434e04b8a55112be1f66237d64a7e67b59 Content-length: 124 SVN��! f�@�f�{hmac_md5; extern const struct ssh_mac ssh_hmac_sha1; extern const struct ssh_mac ssh_hmac_sha1_buggy; Node-path: putty/sshmd5.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3657669b423215c4cfb61adb588eb544 Text-delta-base-sha1: 91d6f76cc9eb686f6c3be401b91ddd9e0197a952 Text-content-length: 25 Text-content-md5: 38055193a3eb1d9dbcad42159910d47e Text-content-sha1: ffa837e89c730cb2f8948d9bdad3d7252ce1bbb2 Content-length: 25 SVN�� �}��|hmac Node-path: putty/sshsha.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cee7edb1e5b8f73cba376050fc470237 Text-delta-base-sha1: 7f23477d42de89b64ea0b18af4f0e4aafee91bb2 Text-content-length: 35 Text-content-md5: 732eb06d4cc873f4669c5e7b6eeeeadc Text-content-sha1: 7ce07b16f6f2655f3edd56604df8c35c4b90e194 Content-length: 35 SVN��_i���$�%:hmachmac Revision-number: 6250 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:38.311476Z PROPS-END Revision-number: 6251 Prop-content-length: 195 Content-length: 195 K 8 svn:date V 27 2005-08-31T20:43:06.035791Z K 7 svn:log V 97 Add infrastructure for supporting multiple hashes in key exchange. Nothing very surprising here. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f3908208cf3643ce9e69edf281ebfde2 Text-delta-base-sha1: ab8acc2cb97d00fc25e0f51c95b5db4e9b0b40b0 Text-content-length: 3555 Text-content-md5: cc11c2a236870a8dc1671577f433ac94 Text-content-sha1: 67cc3cabb07ef5c48c79657e0d2062b19d83439e Content-length: 3555 SVN����1e�Y��9c�> �L7��W7�void *int v2_session_id_lenhash state. */ static void hash_string(const struct ssh_hash *h, void *s, void *str, int len) { unsigned char lenblk[4]; PUT_32BIT(lenblk, len); h->bytes(s, lenblk, 4); h->bytes(s, str, len); } static void hash_uint32(const struct ssh_hash *h, void *h->bhash_mpint(const struct ssh_hash *h, void *hash_string(h, ���j"X�4�J�Ab�Z}O�P.�m�"Q�:u�%2~�%T�^D�k5�j3� 0�y=); if (!challenge) { bombout(("TIS challenge packet was badly formed")); c char chr, unsigned char *keyspace) { const struct ssh_hash *h = ssh->kex->hash; void *s; /* First hlen bytes. */ s = h->init(); if (!(ssh->remote_bugs & BUG_SSH2_DERIVEKEY)) hash_mpint(h, s, K); h->bytes(s, H, h->hlen); h->bytes(s, &chr, 1); h->bytes(s, ssh->v2_session_id, ssh->v2_session_id_len); h->final(s, keyspace); /* Next hlen bytes. */ s = h->init(); if (!(ssh->remote_bugs & BUG_SSH2_DERIVEKEY)) hash_mpint(h, s, K); h->bytes(s, H, h->hlen); h->bytes(s, keyspace, h->hlen); h->final(s, keyspace + h->hlenssh->exhash = ssh->kex->hash->init(); hash_string(ssh->kex->hash, ssh->exhash, ssh->v_c, strlen(ssh->v_c)); hash_string(ssh->kex->hash, ssh->exhash, ssh->v_s, strlen(ssh->v_s)); hash_string(ssh->kex->hash, ssh->exhash, hash_string(ssh->kex->hash, ssh->exhash, pktin->data + 5, pktin->length - 5);hlen-bit entropy, since they're based on * a hash. So cap the key size at hlen bits. */ if (s->nbits > ssh->kex->hash->hlen * 8) s->nbits = ssh->kex->hash->hlen * 8hash_string(ssh->kex->hash, ssh->exhash, s->hostkeydata, s->hostkeylen); if (ssh->kex == &ssh_diffiehellman_gex) { hash_uint32(ssh->kex->hash, ssh->exhash, s->pbits); hash_mpint(ssh->kex->hash, ssh->exhash, s->p); hash_mpint(ssh->kex->hash, ssh->exhash, s->g); } hash_mpint(ssh->kex->hash, ssh->exhash, s->e); hash_mpint(ssh->kex->hash, ssh->exhash, s->f); hash_mpint(ssh->kex->hash, ssh->exhash, s->K); assert(ssh->kex->hash->hlen <= sizeof(s->exchange_hash)); ssh->kex->hash->final(ssh->kex->hash->hlen ssh->kex->hash->hlenassert(sizeof(s->exchange_hash) <= sizeof(ssh->v2_session_id)); memcpy(ssh->v2_session_id, s->exchange_hash, sizeof(s->exchange_hash)); assert(ssh->v2_session_id_len <= sizeof(ssh->v2_session_id)); ssh->v2_session_id_len = ssh->kex->hash->hlen'C',keyspace); ssh->cscipher->setkey(ssh->cs_cipher_ctx, keyspace); ssh2_mkkey(ssh,s->K,s->exchange_hash,'A',keyspace); ssh->cscipher->setiv(ssh->cs_cipher_ctx, keyspace); ssh2_mkkey(ssh,s->K,s->exchange_hash ssh->v2_session_id_len�2!�G��0J�d|A�Em+ 4; *s->q++ = SSH2_AGENTC_SIGN_REQUEST; PUT_32BIT(s->q, s->pklen); s->q += 4; memcpy(s->q, s->pkblob, s->pklen); s->q += s->pklen; PUT_32BIT(s->q, s->siglen); s->q += 4; /* Now the data to be signed... */ if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) { PUT_32BIT(s->q, ssh->v2_session_id_len); s->q += 4; } memcpy(s->q, ssh->v2_session_id, ssh->v2_session_id_len); s->q += ssh->v2_session_id_len; memcpy(s->q, s->pktout->data + 5, s->pktout->length - 5); s->q += s->pktout->length - 5; /* ssh->v2_session_id_lenssh->v2_session_id_len ssh->v2_session_id_len); p += ssh->v2_session_id_len Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0544296bb046a4d132c5658fe8be0939 Text-delta-base-sha1: 3f0a90434e04b8a55112be1f66237d64a7e67b59 Text-content-length: 299 Text-content-md5: 586b3b6a9bc459eedc2aaef7e6b2b250 Text-content-sha1: 706a50d2397ed8999d68270946d24e9e455bb852 Content-length: 299 SVN��!P�I�Z�J<�B�u,hash { void *(*init)(void); /* also allocates context */ void (*bytes)(void *, void *, int); void (*final)(void *, unsigned char *); /* also frees context */ int hlen; /* output length in bytes */ }; const struct ssh_hash *hashhash ssh_sha1 Node-path: putty/sshdh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 335d19d2a1a103bb704f2ff75972cabd Text-delta-base-sha1: 15375eb976b908dfddf810525ee26eab8209809d Text-content-length: 65 Text-content-md5: 94147557216ca0d4db61fbb4f737a058 Text-content-sha1: 2e395e1bbf7d8514837411d24b1ea6860545c645 Content-length: 65 SVN��r!� �� �x�g , &ssh_sha1, &ssh_sha1, &ssh_sha1 Node-path: putty/sshsha.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 732eb06d4cc873f4669c5e7b6eeeeadc Text-delta-base-sha1: 7ce07b16f6f2655f3edd56604df8c35c4b90e194 Text-content-length: 528 Text-content-md5: 0b8e67dcd3502c645508edd1fd10b0de Text-content-sha1: c77f70fe0b6b0c547f09463577be2b37b3fcfd35 Content-length: 528 SVN��iat�Z�t�O>�D% * Thin abstraction for things where hashes are pluggable. */ static void *sha1_init(void) { SHA_State *s; s = snew(SHA_State); SHA_Init(s); return s; } static void sha1_bytes(void *handle, void *p, int len) { SHA_State *s = handle; SHA_Bytes(s, p, len); } static void sha1_final(void *handle, unsigned char *output) { SHA_State *s = handle; SHA_Final(s, output); sfree(s); } const struct ssh_hash ssh_sha1 = { sha1_init, sha1_bytes, sha1_final, 20 }; Revision-number: 6252 Prop-content-length: 341 Content-length: 341 K 7 svn:log V 242 SHA-256 implementation, for use in future KEX algorithms, in particular diffie-hellman-group-exchange-sha256, which the last DHGEX draft defined. Code lifted from Simon's "crypto" directory, with changes to make it look more like sshsh512.c. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-08-31T21:48:22.798194Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c2f1dd02f0991538475768afc9ee05c3 Text-delta-base-sha1: 74830f92b8d707074042704d365bafd5f0773df9 Text-content-length: 24 Text-content-md5: cf7823e8f3af7afafe1172d5829c1f94 Text-content-sha1: 416b3f10d5ebf41868c62add5b9399e1dfba9ab2 Content-length: 24 SVN��;D �g��Za256 Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 586b3b6a9bc459eedc2aaef7e6b2b250 Text-delta-base-sha1: 706a50d2397ed8999d68270946d24e9e455bb852 Text-content-length: 293 Text-content-md5: 028634a2e09a2e68bf3d269e6cfa23ba Text-content-sha1: cd2530495bd1b5ee57e4082f0270dae46c2500ac Content-length: 293 SVN��PR��6��O9R�X�u[typedef struct { uint32 h[8256_State; void SHA256_Init(SHA256_State * s); void SHA256_Bytes(SHA256_State * s, const void *p, int len); void SHA256_Final(SHA256_State * s, unsigned char *output); void SHA256_Simple(const void *p, int len,hash ssh_sha256 Node-path: putty/sshsh256.c Node-kind: file Node-action: add Prop-content-length: 87 Text-delta: true Text-content-length: 7159 Text-content-md5: 6244414f64d7b520288d811c610fcf4f Text-content-sha1: 2e7f1f518c58e9c1ec1f13abbc88dd5d0fcdbf38 Content-length: 7246 K 13 svn:eol-style V 6 native K 12 svn:keywords V 23 Author Date Id Revision PROPS-END SVN���iii/* * SHA-256 algorithm as described at * * http://csrc.nist.gov/cryptval/shs.html */ typedef unsigned int uint32; /* ---------------------------------------------------------------------- * Core SHA256 algorithm: processes 16-word blocks into a message digest. */ #define ror(x,y) ( ((x) << (32-y)) | (((uint32)(x)) >> (y)) ) #define shr(x,y) ( (((uint32)(x)) >> (y)) ) #define Ch(x,y,z) ( ((x) & (y)) ^ (~(x) & (z)) ) #define Maj(x,y,z) ( ((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)) ) #define bigsigma0(x) ( ror((x),2) ^ ror((x),13) ^ ror((x),22) ) #define bigsigma1(x) ( ror((x),6) ^ ror((x),11) ^ ror((x),25) ) #define smallsigma0(x) ( ror((x),7) ^ ror((x),18) ^ shr((x),3) ) #define smallsigma1(x) ( ror((x),17) ^ ror((x),19) ^ shr((x),10) ) typedef struct { uint32 h[8]; } SHA256_Core_State; void SHA256_Core_Init(SHA256_Core_State *s) { s->h[0] = 0x6a09e667; s->h[1] = 0xbb67ae85; s->h[2] = 0x3c6ef372; s->h[3] = 0xa54ff53a; s->h[4] = 0x510e527f; s->h[5] = 0x9b05688c; s->h[6] = 0x1f83d9ab; s->h[7] = 0x5be0cd19; } void SHA256_Block(SHA256_Core_State *s, uint32 *block) { uint32 w[80]; uint32 a,b,c,d,e,f,g,h; static const int k[] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, }; int t; for (t = 0; t < 16; t++) w[t] = block[t]; for (t = 16; t < 64; t++) w[t] = smallsigma1(w[t-2]) + w[t-7] + smallsigma0(w[t-15]) + w[t-16]; a = s->h[0]; b = s->h[1]; c = s->h[2]; d = s->h[3]; e = s->h[4]; f = s->h[5]; g = s->h[6]; h = s->h[7]; for (t = 0; t < 64; t+=8) { uint32 t1, t2; #define ROUND(j,a,b,c,d,e,f,g,h) \ t1 = h + bigsigma1(e) + Ch(e,f,g) + k[j] + w[j]; \ t2 = bigsigma0(a) + Maj(a,b,c); \ d = d + t1; h = t1 + t2; ROUND(t+0, a,b,c,d,e,f,g,h); ROUND(t+1, h,a,b,c,d,e,f,g); ROUND(t+2, g,h,a,b,c,d,e,f); ROUND(t+3, f,g,h,a,b,c,d,e); ROUND(t+4, e,f,g,h,a,b,c,d); ROUND(t+5, d,e,f,g,h,a,b,c); ROUND(t+6, c,d,e,f,g,h,a,b); ROUND(t+7, b,c,d,e,f,g,h,a); } s->h[0] += a; s->h[1] += b; s->h[2] += c; s->h[3] += d; s->h[4] += e; s->h[5] += f; s->h[6] += g; s->h[7] += h; } /* ---------------------------------------------------------------------- * Outer SHA256 algorithm: take an arbitrary length byte string, * convert it into 16-word blocks with the prescribed padding at * the end, and pass those blocks to the core SHA256 algorithm. */ #define BLKSIZE 64 typedef struct { SHA256_Core_State core; unsigned char block[BLKSIZE]; int blkused; uint32 lenhi, lenlo; } SHA256_State; void SHA256_Init(SHA256_State *s) { SHA256_Core_Init(&s->core); s->blkused = 0; s->lenhi = s->lenlo = 0; } void SHA256_Bytes(SHA256_State *s, const void *p, int len) { unsigned char *q = (unsigned char *)p; uint32 wordblock[16]; uint32 lenw = len; int i; /* * Update the length field. */ s->lenlo += lenw; s->lenhi += (s->lenlo < lenw); if (s->blkused && s->blkused+len < BLKSIZE) { /* * Trivial case: just add to the block. */ memcpy(s->block + s->blkused, q, len); s->blkused += len; } else { /* * We must complete and process at least one block. */ while (s->blkused + len >= BLKSIZE) { memcpy(s->block + s->blkused, q, BLKSIZE - s->blkused); q += BLKSIZE - s->blkused; len -= BLKSIZE - s->blkused; /* Now process the block. Gather bytes big-endian into words */ for (i = 0; i < 16; i++) { wordblock[i] = ( ((uint32)s->block[i*4+0]) << 24 ) | ( ((uint32)s->block[i*4+1]) << 16 ) | ( ((uint32)s->block[i*4+2]) << 8 ) | ( ((uint32)s->block[i*4+3]) << 0 ); } SHA256_Block(&s->core, wordblock); s->blkused = 0; } memcpy(s->block, q, len); s->blkused = len; } } void SHA256_Final(SHA256_State *s, void *output) { int i; int pad; unsigned char c[64]; unsigned char *digest = (unsigned char *)output; uint32 lenhi, lenlo; if (s->blkused >= 56) pad = 56 + 64 - s->blkused; else pad = 56 - s->blkused; lenhi = (s->lenhi << 3) | (s->lenlo >> (32-3)); lenlo = (s->lenlo << 3); memset(c, 0, pad); c[0] = 0x80; SHA256_Bytes(s, &c, pad); c[0] = (lenhi >> 24) & 0xFF; c[1] = (lenhi >> 16) & 0xFF; c[2] = (lenhi >> 8) & 0xFF; c[3] = (lenhi >> 0) & 0xFF; c[4] = (lenlo >> 24) & 0xFF; c[5] = (lenlo >> 16) & 0xFF; c[6] = (lenlo >> 8) & 0xFF; c[7] = (lenlo >> 0) & 0xFF; SHA256_Bytes(s, &c, 8); for (i = 0; i < 8; i++) { digest[i*4+0] = (s->core.h[i] >> 24) & 0xFF; digest[i*4+1] = (s->core.h[i] >> 16) & 0xFF; digest[i*4+2] = (s->core.h[i] >> 8) & 0xFF; digest[i*4+3] = (s->core.h[i] >> 0) & 0xFF; } } void SHA256_Simple(const void *p, int len, unsigned char *output) { SHA256_State s; SHA256_Init(&s); SHA256_Bytes(&s, p, len); SHA256_Final(&s, output); } #ifdef TEST #include <stdio.h> #include <stdlib.h> #include <assert.h> int main(void) { unsigned char digest[32]; int i, j, errors; struct { const char *teststring; unsigned char digest[32]; } tests[] = { { "abc", { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad, } }, { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1, } }, }; errors = 0; for (i = 0; i < sizeof(tests) / sizeof(*tests); i++) { SHA256_Simple(tests[i].teststring, strlen(tests[i].teststring), digest); for (j = 0; j < 32; j++) { if (digest[j] != tests[i].digest[j]) { fprintf(stderr, "\"%s\" digest byte %d should be 0x%02x, is 0x%02x\n", tests[i].teststring, j, tests[i].digest[j], digest[j]); errors++; } } } printf("%d errors\n", errors); return 0; } #endif Revision-number: 6253 Prop-content-length: 179 Content-length: 179 K 7 svn:log V 81 Don't bother compiling SHA-256 for now -- I need to think a bit before I use it. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-08-31T22:32:05.275466Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cf7823e8f3af7afafe1172d5829c1f94 Text-delta-base-sha1: 416b3f10d5ebf41868c62add5b9399e1dfba9ab2 Text-content-length: 20 Text-content-md5: c2f1dd02f0991538475768afc9ee05c3 Text-content-sha1: 74830f92b8d707074042704d365bafd5f0773df9 Content-length: 20 SVN��D; ��g��Tp Revision-number: 6254 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:39.638112Z PROPS-END Revision-number: 6255 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:39.648853Z PROPS-END Revision-number: 6256 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:39.660168Z PROPS-END Revision-number: 6257 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:39.670499Z PROPS-END Revision-number: 6258 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:39.681544Z PROPS-END Revision-number: 6259 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:39.691927Z PROPS-END Revision-number: 6260 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2005-09-02T10:51:09.111183Z K 7 svn:log V 54 Check ssh->v2_session_id_len _after_ assigning to it. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cc11c2a236870a8dc1671577f433ac94 Text-delta-base-sha1: 67cc3cabb07ef5c48c79657e0d2062b19d83439e Text-content-length: 167 Text-content-md5: 6e73711bb844627bf265522680672ed8 Text-content-sha1: f1992e0130878b98882e5e3c0697db8341964c6f Content-length: 167 SVN�����������l�Z�l�:Fssh->v2_session_id_len = ssh->kex->hash->hlen; assert(ssh->v2_session_id_len <= sizeof(ssh->v2_session_id))�!!��!� Revision-number: 6261 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:39.976608Z PROPS-END Revision-number: 6262 Prop-content-length: 270 Content-length: 270 K 8 svn:date V 27 2005-09-03T13:41:43.407738Z K 7 svn:log V 171 Restructure things so that a single entry in the KEX preference list can correspond to multiple SSH-2 KEX algorithms. We already do the equivalent for cipher algorithms. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e73711bb844627bf265522680672ed8 Text-delta-base-sha1: f1992e0130878b98882e5e3c0697db8341964c6f Text-content-length: 614 Text-content-md5: 1cec08c0b9119ce4dd94ce72f2058c63 Text-content-sha1: 17f0f0782f6ab6475e1a6c7bfb315e41b0a1af43 Content-length: 614 SVN�����������7!�7��%7k�u[�D��_�M�- �JXeses *k = s->preferred_kex[i]; if (!k) continue; /* warning flag */ for (j = 0; j < k->nkexekes *k = s->preferred_kex[i]; if (!k) { s->warn_kex = TRUE; } else { for (j = 0; j < k->nkexes; j++) { if (!preferred) preferred = k->list[j]->name; if (in_commasep_string(k->list[j]->name, str, len)) { ssh->kex = k->list[j]; break; } }!ssh->kex->pdata!ssh->kex->pdata�!^^�!�>agentreq = snewn(4 + s->len, char); PUT_32BIT(s->agentreq, s->len); s->q = s->agentreq Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 028634a2e09a2e68bf3d269e6cfa23ba Text-delta-base-sha1: cd2530495bd1b5ee57e4082f0270dae46c2500ac Text-content-length: 207 Text-content-md5: ed6582fcbf4fc98319b0ba8bedcebd9d Text-content-sha1: 57a4cf1b02fae5539ec6a110139f424fcb4244b6 Content-length: 207 SVN��R&0�v��es�kgkexes { int nkexes; const struct ssh_kex *const *listes ssh_diffiehellman_group1; extern const struct ssh_kexes ssh_diffiehellman_group14; extern const struct ssh_kexes Node-path: putty/sshdh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 94147557216ca0d4db61fbb4f737a058 Text-delta-base-sha1: 2e395e1bbf7d8514837411d24b1ea6860545c645 Text-content-length: 1004 Text-content-md5: 5f1b1b0077840ab8fdbe32129e2c54b0 Text-content-sha1: 3fd8aad067231c8f7a9c05110b13ebd5efd1b587 Content-length: 1004 SVN��'O���`=�g,static const struct ssh_kex ssh_diffiehellman_group1_shastatic const struct ssh_kex *const group1_list[] = { &ssh_diffiehellman_group1_sha1 }; const struct ssh_kexes ssh_diffiehellman_group1 = { sizeof(group1_list) / sizeof(*group1_list), group1_list }; static const struct ssh_kex ssh_diffiehellman_group14_sha1 = { "diffie-hellman-group14-sha1", "group14", P14, G, lenof(P14), lenof(G), &ssh_sha1 }; static const struct ssh_kex *const group14_list[] = { &ssh_diffiehellman_group14_sha1 }; const struct ssh_kexes ssh_diffiehellman_group14 = { sizeof(group14_list) / sizeof(*group14_list), group14_list }; static const struct ssh_kex ssh_diffiehellman_gex_sha1 = { "diffie-hellman-group-exchange-sha1", NULL, NULL, NULL, 0, 0, &ssh_sha1 }; static const struct ssh_kex *const gex_list[] = { &ssh_diffiehellman_gex_sha1 }; const struct ssh_kexes ssh_diffiehellman_gex = { sizeof(gex_list) / sizeof(*gex_list), gex_list Revision-number: 6263 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2005-09-03T17:03:49.589249Z K 7 svn:log V 106 Now that my arcfour-fixes draft has been approved by the IESG, use the IANA-assigned names for its modes. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssharcf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ccd692283e444a6f188e88c1ef52aace Text-delta-base-sha1: 3a1a00d7a697a4f850b2380e6fc71125e1122b50 Text-content-length: 25 Text-content-md5: 0db6fc0856a88003238043c96d7d9320 Text-content-sha1: e8697ea98759045a0338d7aadf56f520735625f4 Content-length: 25 SVN��H~��%��RJ�A Revision-number: 6264 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2005-09-03T17:29:28.797162Z K 7 svn:log V 21 Mention xp-wont-run. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 841110e76d2bea82b62369e4ca5f3c3b Text-delta-base-sha1: 0d0298f61d67f1dcdf3239f6208f905dd3ab270a Text-content-length: 491 Text-content-md5: 954687f503fa563545f03cb7dd08b493 Text-content-sha1: e37b0e10fbff4057fac47da7fcb05c17b7fa03ca Content-length: 491 SVN��;HI� ���AI�3S{faq-xpwontrun}{Question} PuTTY fails to start up. Windows claims that \q{the application configuration is incorrect}. This is caused by a bug in certain versions of \i{Windows XP} which is triggered by PuTTY 0.58. It can be avoided by installing Service Pack 2, by using a different version of PuTTY, or by installing a special \i{manifest file} alongside the PuTTY executable. Txp-wont-run}{\q{xp-wont-run}} entry in PuTTY's wishlist has more details. Revision-number: 6265 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:40.196563Z PROPS-END Revision-number: 6266 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 29 Update my information a bit. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-09-03T19:53:52.327251Z PROPS-END Node-path: putty-website/team.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6c06fd8dec2db9886d53e9a8384f068f Text-delta-base-sha1: 97f573b6bbce993c4119a82e79358816c12089ca Text-content-length: 86 Text-content-md5: 7f89c259f62e14576d17c957da90904f Text-content-sha1: abf1582dd0d1dd9aacd684b80423fc810200549e Content-length: 86 SVN�� - @��@�f:did a lot of the early work on the (still unfinished) Macintosh Revision-number: 6267 Prop-content-length: 267 Content-length: 267 K 7 svn:log V 166 IETF names are implemented. Update Fixed-in (since this is the first version that will interoperate with OpenSSH 4.2, for instance -- mention that). Improve summary. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-09-03T20:14:11.514880Z PROPS-END Node-path: putty-wishlist/data/arcfour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 84759398f26c6b7cca1b5c8fef991f92 Text-delta-base-sha1: 11ffbeec2337a02ee412144ab2fa4d4979122011 Text-content-length: 198 Text-content-md5: 3642fb91390b2d92cd35869fcbe263ba Text-content-sha1: 4ab33b49b2f9047681e1f6b580920b63e13b390f Content-length: 198 SVN��%I)�q�A �n}\Summary: The Arcfour9-04<p> (Support was first added in 2005-04-22, but uonly Only from 2005-09-04 do we support the IETF names, which also appear in OpenSSH from 4.2.) Revision-number: 6268 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:40.571392Z PROPS-END Revision-number: 6269 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:40.593918Z PROPS-END Revision-number: 6270 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:40.604663Z PROPS-END Revision-number: 6271 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:40.615697Z PROPS-END Revision-number: 6272 Prop-content-length: 387 Content-length: 387 K 8 svn:date V 27 2005-09-04T14:53:39.258401Z K 7 svn:log V 288 Add support for diffie-hellman-group-exchange-sha256. Tested against a patched OpenSSH server. This is controlled by the same user settings as diffie-hellman-group-exchange-sha1, which may not be optimal, especially given that they're both referred to as dh-gex-sha1 in saved sessions. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c2f1dd02f0991538475768afc9ee05c3 Text-delta-base-sha1: 74830f92b8d707074042704d365bafd5f0773df9 Text-content-length: 24 Text-content-md5: cf7823e8f3af7afafe1172d5829c1f94 Text-content-sha1: 416b3f10d5ebf41868c62add5b9399e1dfba9ab2 Content-length: 24 SVN��;D �g��Za256 Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1cec08c0b9119ce4dd94ce72f2058c63 Text-delta-base-sha1: 17f0f0782f6ab6475e1a6c7bfb315e41b0a1af43 Text-content-length: 70 Text-content-md5: a94d53b8e08654dc3168344d4b292f5d Text-content-sha1: 15b2d978e843b79ab4dc89b2ed4307aa686145c1 Content-length: 70 SVN���� ���o32��� ���w 32���� Node-path: putty/sshdh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f1b1b0077840ab8fdbe32129e2c54b0 Text-delta-base-sha1: 3fd8aad067231c8f7a9c05110b13ebd5efd1b587 Text-content-length: 123 Text-content-md5: 8b9fa1cd94100b85c150191529ab3b69 Text-content-sha1: b9bf27866dc8117a83d2420a7925dee1da465052 Content-length: 123 SVN��'__�)�[�do�s4256 = { "diffie-hellman-group-exchange-sha256", NULL, NULL, NULL, 0, 0, &ssh_sha256256, Revision-number: 6273 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2005-09-05T14:04:18.241404Z K 7 svn:log V 79 Summary: Implement "diffie-hellman-group-exchange-sha256" Fixed-in: 2005-09-05 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/dh-gex-sha256 Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 535 Text-content-md5: 4eb7f205b4ea490007b12691e319c810 Text-content-sha1: 05c83b2a5df9c7b6237353615b3687dc7c858914 Content-length: 545 PROPS-END SVN���  Summary: Implement "diffie-hellman-group-exchange-sha256" Class: wish Difficulty: tricky Content-type: text/x-html-body Fixed-in: 2005-09-05 <p> Diffie-Hellman group exchange was implemented in PuTTY some years ago (it's been present since 0.52). <p> However, the final version of <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-dh-group-exchange/">draft-ietf-secsh-dh-group-exchange</a> added a new key exchange method relative to earlier drafts, using SHA-256 instead of SHA-1. We should implement that too. Revision-number: 6274 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:41.048960Z PROPS-END Revision-number: 6275 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:41.061233Z PROPS-END Revision-number: 6276 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:41.071849Z PROPS-END Revision-number: 6277 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:41.083318Z PROPS-END Revision-number: 6278 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 35 Mention 64-bit Windows on wishlist K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-09-07T18:18:30.039894Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6b054bae38979a44c3163bd490d381e8 Text-delta-base-sha1: c143819fe815cc35bf5daacd50fefd7aefbfe6a5 Text-content-length: 71 Text-content-md5: d65e73d98b04305f7dad44353474d737 Text-content-sha1: 0008b3234c53166a7474858d0580dd08d3183ab7 Content-length: 71 SVN��f 2�`��vp<a href="wishlist/win64.html">Windows on AMD64</a> Node-path: putty-wishlist/data/win64 Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 434 Text-content-md5: 20ed7fb1161ec4637782ac925ea95fe1 Text-content-sha1: 8b52f37b9ea603e47ffa0576f54880faf9565aa0 Content-length: 444 PROPS-END SVN���$$$Summary: Support builds for 64-bit Windows Class: wish Difficulty: fun Priority: low Fixed-in: r5821 2005-05-22 Content-type: text/x-html-body <p> It's occasionally been pointed out that PuTTY doesn't compile/run cleanly for 64-bit Windows. <p> This should now be fixed. (You'll need to build with the <code>NO_MANIFESTS</code> build flag.) <p> (Note that we have no plans to provide native 64-bit builds ourselves.) Revision-number: 6279 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:41.279491Z PROPS-END Revision-number: 6280 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:41.292102Z PROPS-END Revision-number: 6281 Prop-content-length: 158 Content-length: 158 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-09-08T17:50:33.987373Z K 7 svn:log V 58 SetClassLong() hassle; what's the point of a win64 build? PROPS-END Node-path: putty-wishlist/data/win64 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 20ed7fb1161ec4637782ac925ea95fe1 Text-delta-base-sha1: 8b52f37b9ea603e47ffa0576f54880faf9565aa0 Text-content-length: 457 Text-content-md5: cbbd7203321ae1b96708c32c7e83a2a5 Text-content-sha1: 210c5822482237de5867e434d4a3e7733ea774f3 Content-length: 457 SVN��$X6�"�6 Even ignoring the fact that we don't have appropriate hardware/compilers, it's not clear what advantage there is to be had from running PuTTY in native 64-bit mode.) <p> <em>Update:</em> it looks like the call to <code>SetClassLong()</code> in <code>window.c:update_mouse_pointer()</code> should also be fixed. Unfortunately, <a href="http://www.mingw.org/">MinGW</a> doesn't yet support the replacement <code>SetClassLongPtr()</code>. Revision-number: 6282 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:41.542785Z PROPS-END Revision-number: 6283 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:41.555090Z PROPS-END Revision-number: 6284 Prop-content-length: 266 Content-length: 266 K 7 svn:log V 167 Implement hmac-sha1-96. It's RECOMMENDED in the current transport draft, and we don't have any strong reason not to implement it, for all that it's rather pointless. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-09-10T16:19:53.513897Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a94d53b8e08654dc3168344d4b292f5d Text-delta-base-sha1: 15b2d978e843b79ab4dc89b2ed4307aa686145c1 Text-content-length: 168 Text-content-md5: 1cb87c0f658877f7874529c25f6e1210 Text-content-sha1: 6a8e01101e1dbd1f5ab9e429d71e8c469eb6aee2 Content-length: 168 SVN�����A��d5�Msha1_96sha1_96���,�T�t_getstring(pktin, &challenge, &challengelen�+,��gn */ s->len += 4; /* flags */ s- Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ed6582fcbf4fc98319b0ba8bedcebd9d Text-delta-base-sha1: 57a4cf1b02fae5539ec6a110139f424fcb4244b6 Text-content-length: 114 Text-content-md5: 359b639d1d420f3861cc6d1dea426225 Text-content-sha1: 92c544075ed83658f94bcb7af0e9c19f206e4b15 Content-length: 114 SVN��& Z�+�Z�#extern const struct ssh_mac ssh_hmac_sha1_96; extern const struct ssh_mac ssh_hmac_sha1_96 Node-path: putty/sshsha.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b8e67dcd3502c645508edd1fd10b0de Text-delta-base-sha1: c77f70fe0b6b0c547f09463577be2b37b3fcfd35 Text-content-length: 625 Text-content-md5: c9277ccc1451aa54345d622ed1e18f9a Text-content-sha1: b9d83b05b3ee0fb3d8df3a640bbeed17706f27d3 Content-length: 625 SVN��a!H��f�I.�Iy�HRstatic void sha1_96_generate(void *handle, unsigned char *blk, int len, unsigned long seq) { unsigned char full[20]; sha1_do_hmac(handle, blk, len, seq, full); memcpy(blk + len, full, 12); } static int sha1_961296 = { sha1_make_context, sha1_free_context, sha1_key, sha1_96_generate, sha1_96_verify, "hmac-sha1-96", 12, "HMAC-SHA1-96 const struct ssh_mac ssh_hmac_sha1_96_buggy = { sha1_make_context, sha1_free_context, sha1_key_buggy, sha1_96_generate, sha1_96_verify, "hmac-sha1-96", 12, "bug-compatible HMAC-SHA1-96" }; Revision-number: 6285 Prop-content-length: 219 Content-length: 219 K 7 svn:log V 120 Mention relationship between terminal types, keyboard sequences, and termcap/terminfo. Suggested by Joachim Durchholz. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-09-10T17:36:52.394640Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 00b0426a3b93e86249d2dcc939b03c25 Text-delta-base-sha1: 765574a81879bd5eec2ae446d7eaa7b83c1af8ec Text-content-length: 1471 Text-content-md5: f74e12665db94dbad6ac42304d27b4eb Text-content-sha1: 449b66e111f864446b6eeb1359e81a4caeef8cb7 Content-length: 1471 SVN���� D�g��%tC�o�2\ii{Terminal-type} The correct state for many of these settings depends on what the server to which PuTTY is connecting expects. With a \i{Unix} server, this is likely to depend on the \i\c{termcap} or \i\c{terminfo} entry it uses, which in turn is likely to be controlled by the \q{\ii{Terminal-type} string} setting in the Connection panel; see \k{config-termtype} for details. If none of the settings here seems to help, you may find \k{faq-keyboard} to be useful On a \i{Unix} server, this selects an entry from the \i\c{termcap} or \i\c{terminfo} database that tells applications what \i{control sequences} to send to the terminal, and what character sequences to expect the \i{keyboard} to generate�899�� circumstances. \b If a mode is on the list: \lcont{ \b If the \q{Auto} option is selected, the PuTTY tools will decide whether to specify that mode to the server, and if so, will send a sensible value. \lcont{ PuTTY proper will send modes that it has an opinion on (currently only the code for the Backspace key, \cw{ERASE}). Plink on Unix will propagate appropriate modes from the local terminal, if any. } \b If a value is specified, it will be sent to the server under all circumstances. The precise syntax of the value box depends on the mode. } By default, all of the available modes are listed as \q{Auto}, which should do the right thing in most circumstances. The precise effect Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 954687f503fa563545f03cb7dd08b493 Text-delta-base-sha1: e37b0e10fbff4057fac47da7fcb05c17b7fa03ca Text-content-length: 199 Text-content-md5: 972ff2ba63afc10583223d964b8c0841 Text-content-sha1: 63988f1c7b739a931efbec0f6521b50c26124616 Content-length: 199 SVN��Hf�)�F�g��pX\i{keyboard} stops working once PuTTY displays the \i{password prompt}\I{keyboard}\i{function keys} don't do what I \i{Unix} system is to type the command \i Revision-number: 6286 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.103280Z PROPS-END Revision-number: 6287 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.114563Z PROPS-END Revision-number: 6288 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.132695Z PROPS-END Revision-number: 6289 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.167873Z PROPS-END Revision-number: 6290 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.180533Z PROPS-END Revision-number: 6291 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.192124Z PROPS-END Revision-number: 6292 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.203410Z PROPS-END Revision-number: 6293 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.242729Z PROPS-END Revision-number: 6294 Prop-content-length: 344 Content-length: 344 K 8 svn:date V 27 2005-09-12T15:45:29.184004Z K 7 svn:log V 245 When the first element in a preference list was unrecognised, PuTTY would hang when reading it because strtok() kept getting the full list passed in. Fix this, and add an assert() for an assumption documented in a comment while I'm in the area. K 10 svn:author V 3 ben PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4098866516e313563b008a7e54d8f4f1 Text-delta-base-sha1: e1c570dc42e14ca4759c04feae9dd64e646759ba Text-content-length: 140 Text-content-md5: c37095c9d3297309f3a8a7eb8f53ccb7 Text-content-sha1: 5ebffa637896cf684291da31e028fe159a8365c2 Content-length: 140 SVN��`1d�W��L�lN�d�hxassert.h>char *tokarg = commalisttokarg, ","); /* sorry */ tokarg = NULL;assert(mapping[i].v < 32); Revision-number: 6295 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2005-09-12T15:54:17.257473Z K 7 svn:log V 52 Hang when saved settings contain an unknown cipher. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/unknown-cipher-hang Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 397 Text-content-md5: b984792cd3d1526a98c5d80d9c8438ed Text-content-sha1: 6ab750b1d02eed09693f09c78a47ee87a551f468 Content-length: 407 PROPS-END SVN���Summary: PuTTY hangs if a saved session's preferred cipher is unknown Present-in: 0.58 Fixed-in: r6294 2005-09-13 Class: bug Priority: medium Difficulty: fun Content-type: text/plain If a saved session has as its preferred cipher or key-exchange mechanism one that isn't recognised by PuTTY (e.g. having been emitted by a newer version), PuTTY hangs when loading the saved session. Revision-number: 6296 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2005-09-12T16:00:33.025490Z K 7 svn:log V 43 + newmodes, draft-harris-ssh-arcfour-fixes K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d65e73d98b04305f7dad44353474d737 Text-delta-base-sha1: 0008b3234c53166a7474858d0580dd08d3183ab7 Text-content-length: 232 Text-content-md5: ce0d12503f11e016728ed93918b489a0 Text-content-sha1: 1a1c6513daff7a5743b6f9595e4bc5406127c955 Content-length: 232 SVN��` P�b�P�.Zli>parts of <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-newmodes/">newmodes</a> <li><a href="http://tools.ietf.org/wg/secsh/draft-harris-ssh-arcfour-fixes-03.txt">draft-harris-ssh-arcfour-fixes Revision-number: 6297 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.487868Z PROPS-END Revision-number: 6298 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.499150Z PROPS-END Revision-number: 6299 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.533515Z PROPS-END Revision-number: 6300 Prop-content-length: 259 Content-length: 259 K 8 svn:date V 27 2005-09-12T21:44:44.370779Z K 7 svn:log V 160 Add content-types in META tags so as to set the character-set correctly. This is unlikely to affect real browsers, but will stop the W3C validator complaining. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/autogen.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 391aa098db62c0711b23d2852d29b295 Text-delta-base-sha1: 9850629ef9d04da68388a2b4642de497d1539143 Text-content-length: 89 Text-content-md5: c94cca8e9cec700d53b8b16b8c3c2592 Text-content-sha1: e00754ce13b829d2dc5c10f5ba3b1038907a11ab Content-length: 89 SVN��{B C�4�C�K0meta http-equiv="content-type" content="text/html; charset=US-ASCII Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60e279a846e7550ee75184303d966b24 Text-delta-base-sha1: d02803dc4e9f7eec489b733ad1daf02b846ef955 Text-content-length: 92 Text-content-md5: 8b9f42fb4633716439ccf073aec60a2b Text-content-sha1: 9f7c887443a88cacb08175149977e2e4be9ed7d8 Content-length: 92 SVN��5| C�u�C�Dqmeta http-equiv="content-type" content="text/html; charset=US-ASCII Node-path: putty-website/docs.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ac613bd9decc49582739995f6a3174e Text-delta-base-sha1: de1262235ca77945e8a78883be22c22fc914e39c Text-content-length: 89 Text-content-md5: 0a5ec4aeed622cf62599296edfdcdf64 Text-content-sha1: cbe0a17eba7aa5a57e584bb102d8ba2cbcf7c128 Content-length: 89 SVN��t; C�}�C�{ymeta http-equiv="content-type" content="text/html; charset=US-ASCII Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a439bb02b917f58a7735317c6f8146c5 Text-delta-base-sha1: 6eac9cfc13ff9032be5412b72eca902261c16321 Text-content-length: 93 Text-content-md5: c3d12b0475f655fa638db918bced632c Text-content-sha1: 9be1fb17c81bf9cfa0a056a141e2809ff80b73d2 Content-length: 93 SVN��; D�9�D�6meta http-equiv="content-type" content="text/html; charset=US-ASCII" Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c1674052ff26b607f827a6a20055d37d Text-delta-base-sha1: 8f05b44c4f52478c6fe7001bf9eabb4391b2172e Text-content-length: 89 Text-content-md5: df9ff43e11b4902573c2715e02ccd33f Text-content-sha1: 05f63afceecc9dee7e69ff7d6ea18ddd76303ac8 Content-length: 89 SVN��e, C��C�e�meta http-equiv="content-type" content="text/html; charset=US-ASCII Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 839cd5054b78661a21ba04994a0c5454 Text-delta-base-sha1: a18ee1745b3d91a4b37916bd759cc76e90fe8c8d Text-content-length: 89 Text-content-md5: 4e7bec7f2e62751ea96b87fb83b3e103 Text-content-sha1: 25debdc1f46574944364301e6c1edcff603db897 Content-length: 89 SVN��W C�r�C�"nmeta http-equiv="content-type" content="text/html; charset=US-ASCII Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ce0d12503f11e016728ed93918b489a0 Text-delta-base-sha1: 1a1c6513daff7a5743b6f9595e4bc5406127c955 Text-content-length: 89 Text-content-md5: 4a9c9c505afdf06e83cffd1848ef5ef2 Text-content-sha1: 9c4bea93422c69278510d2573799e23404d6d591 Content-length: 89 SVN��`' C�p�C�tlmeta http-equiv="content-type" content="text/html; charset=US-ASCII Node-path: putty-website/maillist.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 67f8b44e8920754d25ff05b2d50975f6 Text-delta-base-sha1: 3c3ead006e317f445005181afb68091fa1fda90d Text-content-length: 89 Text-content-md5: e56642684272e21701c35bc39a9768ed Text-content-sha1: bf86778a84cdc11a352f96b4d3b12b593fc87450 Content-length: 89 SVN��R C�r�C�dnmeta http-equiv="content-type" content="text/html; charset=US-ASCII Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 062b221aa2271cd0f2903caf11ed4b47 Text-delta-base-sha1: 67ad5da388a391ce8f458c6cb9861b1172aae71a Text-content-length: 92 Text-content-md5: f7682795246b0fdb1832fe66538288ce Text-content-sha1: 6cf7803af25183c33446869614eb6eee11777a86 Content-length: 92 SVN��g. C�{�C�pwmeta http-equiv="content-type" content="text/html; charset=US-ASCII Node-path: putty-website/team.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f89c259f62e14576d17c957da90904f Text-delta-base-sha1: abf1582dd0d1dd9aacd684b80423fc810200549e Text-content-length: 89 Text-content-md5: 41a0697518788dc8c38f687c67c150ea Text-content-sha1: 8b61410660f7ca0a1dad57df88fbf987146f3b0b Content-length: 89 SVN��-t C�w�C�:smeta http-equiv="content-type" content="text/html; charset=US-ASCII Revision-number: 6301 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2005-09-12T21:46:26.325875Z K 7 svn:log V 54 Add META tags to output to declare the character set. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd0897e55243357f28a7b3ba35601540 Text-delta-base-sha1: 9bc4a152acdad34de9d4be8c0f4e3f250499d2fb Text-content-length: 166 Text-content-md5: d11dbe46872feaa3a3efb256bc716d08 Text-content-sha1: 160f578f70c89ceabfe21649c32cec3a54f919cf Content-length: 166 SVN��Vd�#�C�8C�Smeta http-equiv="content-type" content="text/html; charset=US-ASCIImeta http-equiv="content-type" content="text/html; charset=US-ASCII Revision-number: 6302 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2005-09-13T14:12:16.548693Z K 7 svn:log V 37 Apparently the OS X port is stalled. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 972ff2ba63afc10583223d964b8c0841 Text-delta-base-sha1: 63988f1c7b739a931efbec0f6521b50c26124616 Text-content-length: 118 Text-content-md5: 96a25ec510bb8f2482a227d70f2924e9 Text-content-sha1: a8c7428eb86b452bb8786ad4846d3e05e23bed31 Content-length: 118 SVN��f1X� ��qH�_has been started Currently it's unlikely to be completed unless someone steps in to help Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f8a361749c6983b47fce2b81574d0bb5 Text-delta-base-sha1: eb5706fb8144dcc362fe8e006a830d1243bf8d2d Text-content-length: 171 Text-content-md5: 7f65b56a2a6b821bfa31dc764ac5e460 Text-content-sha1: 2a6d5a956e2b31977e37e1f815a1fc03fe5ddca3 Content-length: 171 SVN��/& �7v�\SSummary: Port to the Mac OSes <p> At this point, the native Mac OS X port is unlikely to be completed unless someone else steps in to do it. <p> Revision-number: 6303 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:42.840580Z PROPS-END Revision-number: 6304 Prop-content-length: 247 Content-length: 247 K 7 svn:log V 148 Nothing seems to use the "int64" type, and it apparently causes conflicts on some platform, so remove it. Thanks to Mike Protts for spotting this. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-09-13T19:24:35.668889Z PROPS-END Node-path: putty/int64.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5bba3030ec7344cda4a24c2462bcb995 Text-delta-base-sha1: 9f3c4e6a20b360e752217ee27d67ad2f70ed1006 Text-content-length: 19 Text-content-md5: 7adec33cf61a7f51d56abcd13e6fe67a Text-content-sha1: b663181a482a85f7919d13376deab45b7994d2c9 Content-length: 19 SVN��$���� Revision-number: 6305 Prop-content-length: 188 Content-length: 188 K 7 svn:log V 90 A couple of places in sk_newlistener were using AF_INET6 even with NO_IPV6. Correct them. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-09-13T19:54:01.917871Z PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d95522af2325e689a0d24f54805bf345 Text-delta-base-sha1: c80b3128bc8f0c899a7f2e799f9fe931ddb5649c Text-content-length: 144 Text-content-md5: b694efc1348663c5cb0883affc8b6940 Text-content-sha1: be5ea771e34bbdc9139ea3f2bb9ea437ec18fb7a Content-length: 144 SVN��F|h�p�S�$�G4�Lz#ifndef NO_IPV6 address_family == ADDRTYPE_IPV6 ? AF_INET6 : #endif #ifndef NO_IPV6#endif Revision-number: 6306 Prop-content-length: 185 Content-length: 185 K 7 svn:log V 87 Some hosts don't have TIOCSCTTY. Don't try to use it on them. Patch from Mike Protts. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-09-13T19:57:37.470396Z PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 867abf43bb40d4daf3ce4ad50d4d4195 Text-delta-base-sha1: 2ffc882694989a1a31e024de1071cf3652bc4206 Text-content-length: 79 Text-content-md5: 59fbb32590cfdc59b77454f79548570d Text-content-sha1: 99d07fada6676ef5bce167b16b6c1f91552228a4 Content-length: 79 SVN��Nf 6�~��2#ifdef TIOCSCTTY ioctl(slavefd, TIOCSCTTY, 1); #endif Revision-number: 6307 Prop-content-length: 315 Content-length: 315 K 8 svn:date V 27 2005-09-13T20:08:25.678092Z K 7 svn:log V 216 The ANSI-C constant FILENAME_MAX is ludicrously small on some systems. Use the POSIX PATH_MAX if it exists, and fall back to 1024 otherwise. We should really allocate filenames dynamically if PATH_MAX isn't defined. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 258bd15c1dc9e38b7600d1b521589683 Text-delta-base-sha1: adfc5cf2060a7bce94db57fb0e13c83ed3fa6f69 Text-content-length: 446 Text-content-md5: 18818fdb476e1d3928b5d9567ff60d84 Text-content-sha1: c19d0a678694836e11fc18947d2a660abf449944 Content-length: 446 SVN��xlF�\��*NP�ev�Mf�A>�b2��ZG�,�N�5_�^,�(�Pc�>�%f�[�|limits#ifdef PATH_MAX #define FNLEN PATH_MAX #else #define FNLEN 1024 /* XXX */ #endifNLENNLENNLEN - len); } filename[FNLENNLENNLENNLENNLENNLENNLEN) { fullpath[len] = '/'; strncpy(fullpath+len+1, de->d_name, FNLEN-(len+1)); fullpath[FNLENNLENNLEN], tmpfilename[FNLENNLENNLENNLENNLEN Revision-number: 6308 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2005-09-13T20:17:10.549626Z K 7 svn:log V 188 When asked to malloc zero bytes, malloc one byte instead. This ensures that we get a unique pointer rather than NULL (which ANSI C otherwise permits). Problem pointed out by Mike Protts. K 10 svn:author V 3 ben PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e30d32bbb2b60141db538bb9ac93883 Text-delta-base-sha1: 125aee50c8e1a6970400b2cf40295484770d1926 Text-content-length: 45 Text-content-md5: db0ba663daede7cdff6e794eb7f7a513 Text-content-sha1: 8e53bf14a8ed365f09e9b4a5031a2101e1502125 Content-length: 45 SVN�� $ �X��4V if (size == 0) size = 1 Revision-number: 6309 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.243581Z PROPS-END Revision-number: 6310 Prop-content-length: 329 Content-length: 329 K 8 svn:date V 27 2005-09-14T10:53:39.446691Z K 7 svn:log V 230 Some systems (HP-UX) don't yet have <sys/select.h>, putting select() in <sys/time.h>. Cope with this. Where <sys/select.h> _is_ available, though, use it (since it's where POSIX puts select()). Problem reported by Mike Protts. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 038b77283ba8d7cd18572d7dcc7acc1e Text-delta-base-sha1: 35d6169a3625bd6232404348b6b2bd9ccb2df481 Text-content-length: 100 Text-content-md5: 4f350dea6add9e4c0860fd7aa9334d20 Text-content-sha1: 5ecea82297475f51fff83c9a362af164ee52f911 Content-length: 100 SVN��g3 M���NB sys/select#ifndef HAVE_SYS_SELECT_H # define HAVE_NO_SYS_SELECT_H #endif ]) Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d8422869033df868d57ffebedf10073e Text-delta-base-sha1: c06d77585ba069d71268417469a13126e57a205d Text-content-length: 92 Text-content-md5: b2c59bf201f8b4ba095fdef3bc04bd5f Text-content-sha1: 81ec60e63eec35a8938dd31a4a5d88958cd67c65 Content-length: 92 SVN�� C C�+�C�U4time.h> #ifndef HAVE_NO_SYS_SELECT_H #include <sys/select.h> #endif Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bcb90a9e0c59d3e0c502bbc6bf7d5c87 Text-delta-base-sha1: 67f0f060d9676a38167040d1ab090bcc30dc84fe Text-content-length: 80 Text-content-md5: 1640151bcbf7ffaa996fc2511e9b6ccb Text-content-sha1: 24914f11255cbbe938a23ccd5c1b643d5985e1c2 Content-length: 80 SVN��[ ;���>#ifndef HAVE_NO_SYS_SELECT_H #include <sys/select.h> #endif Revision-number: 6311 Prop-content-length: 210 Content-length: 210 K 7 svn:log V 111 AIX 5.1 has <utmpx.h> but no updwtmpx(). Treat the latter as a reason to OMIT_UTMP. Reported by Mike Protts. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-09-14T11:00:34.643277Z PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f350dea6add9e4c0860fd7aa9334d20 Text-delta-base-sha1: 5ecea82297475f51fff83c9a362af164ee52f911 Text-content-length: 86 Text-content-md5: f760351c2c3c19c49d70eb5d51738356 Text-content-sha1: 3d07dbeedb5ed226a836cb269708af13fff01936 Content-length: 86 SVN��3];���� ( updwtmpx !defined(HAVE_UTMPX_H) || !defined(HAVE_UPDWTMPX) Revision-number: 6312 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.368733Z PROPS-END Revision-number: 6313 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2005-09-16T13:40:27.888246Z K 7 svn:log V 63 Catch-up: Brazil: +1 Bulgaria: +1 Canada: +1 US: +3 -1 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f7682795246b0fdb1832fe66538288ce Text-delta-base-sha1: 6cf7803af25183c33446869614eb6eee11777a86 Text-content-length: 572 Text-content-md5: ba9c41edbebcb5c0ed03fbfd30eaff71 Text-content-sha1: 09abe741d173b1e5e917a0ceb3d6eaffd3d3896f Content-length: 572 SVN��.S[� ��O3�b �A��A��dp�B~�p[�M?�O@�R?�R?�I@�,/�M?�M?�}1ehdbrasil.net/">putty.ehdbrasil.netzloba.ath.cx/">putty.zloba.ath.cx</a> in Bulgariadeb1an.net/">putty.deb1an.net</a> in Bulgariaputty.paracoda.com/">putty.paracoda.com</a> in Canadastatic.namesdatabase.com/putty/">static.namesdatabasemirrors.wehost4u.net/putty/">mirrors.wehost4u.netcyberiusnetwork.com/">putty.cyberiusnetwork.hostingzero.com/">putty.hostingzero.cs.utah.edu/">putty.cs.utah.eduwww.mirrormonster.com/putty-ssh/">mirrormonsterwww.ip97.com/mirrors/putty/">ip97 Revision-number: 6314 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.470510Z PROPS-END Revision-number: 6315 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.493172Z PROPS-END Revision-number: 6316 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.832728Z PROPS-END Revision-number: 6317 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.845512Z PROPS-END Revision-number: 6318 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.857072Z PROPS-END Revision-number: 6319 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.868340Z PROPS-END Revision-number: 6320 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.879177Z PROPS-END Revision-number: 6321 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.890699Z PROPS-END Revision-number: 6322 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.901474Z PROPS-END Revision-number: 6323 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.912521Z PROPS-END Revision-number: 6324 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.924024Z PROPS-END Revision-number: 6325 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.935270Z PROPS-END Revision-number: 6326 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.946378Z PROPS-END Revision-number: 6327 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.957443Z PROPS-END Revision-number: 6328 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.968682Z PROPS-END Revision-number: 6329 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.979716Z PROPS-END Revision-number: 6330 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:43.990175Z PROPS-END Revision-number: 6331 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:44.000560Z PROPS-END Revision-number: 6332 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2005-09-19T14:34:01.797924Z K 7 svn:log V 72 Mention that sessions can be saved from "Change Settings" in using.but. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e97d9de1f55c284f9dc6c1a96285585 Text-delta-base-sha1: 203d04b6af21282c4a6a6e08c4276ca29638766d Text-content-length: 165 Text-content-md5: 0d3749ddd0d20ae3fca7e9f5e8a9d41d Text-content-sha1: 87c381258d19c7cf90b69d7f0356a62d0d351fd2 Content-length: 165 SVN��-: �w� �9tYou can save the current settings to a saved session for future use from this dialog box. See \k{config-saving} for more on saved sessions Revision-number: 6333 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2005-09-19T15:23:25.081835Z K 7 svn:log V 52 Reports of trouble with VMS probably caused by this K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/da-response Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4475d5dbefdb2d09982c7c98e3e310d0 Text-delta-base-sha1: d020285f250516bf4dc024a388dba5f6aaefa41c Text-content-length: 109 Text-content-md5: 26892b6aa386b91aa2d6a97c9bd0a1a6 Text-content-sha1: 20c148986037bbd1dc882f13246fd3475dff2a07 Content-length: 109 SVN��4\�4�\ There have been several reports of our inaccurate response causing trouble with VMS hosts. Revision-number: 6334 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2005-09-20T13:23:52.162081Z K 7 svn:log V 14 +active.co.il K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ba9c41edbebcb5c0ed03fbfd30eaff71 Text-delta-base-sha1: 09abe741d173b1e5e917a0ceb3d6eaffd3d3896f Text-content-length: 80 Text-content-md5: a8f5242f22eedc2d4bbe4741e60f9bcc Text-content-sha1: 68e490c0c1854f55e8a145681c2cb0b15d7f5904 Content-length: 80 SVN��5�f��B@�$lwww.active.co.il/mirrorpu/">active.co.il</a> in Israe Revision-number: 6335 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:45.296542Z PROPS-END Revision-number: 6336 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:45.316992Z PROPS-END Revision-number: 6337 Prop-content-length: 340 Content-length: 340 K 8 svn:date V 27 2005-09-21T14:53:32.457930Z K 7 svn:log V 240 Platform-independent support for zooming around session list by typing in the session name box. Thwarted on Unix by GTK not automatically scrolling the listbox to the selected item, but we can fix that in the platform-specific side later. K 10 svn:author V 4 owen PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c86c8b726801b7c54bcd22dfa29a3ff Text-delta-base-sha1: 55476efb4cb8f52cea5598f8123fc9d5dc110c1a Text-content-length: 474 Text-content-md5: 736d749c2df3ca304da9c68b421f2b49 Text-content-sha1: a0d484a52da23ff635ca07b1c337ebc78973e96e Content-length: 474 SVN��!`:�]��g\�b? int top, bottom, halfway, i; top = ssd->sesslist.nsessions; bottom = -1; while (top-bottom > 1) { halfway = (top+bottom)/2; i = strcmp(savedsession, ssd->sesslist.sessions[halfway]); if (i <= 0 ) { top = halfway; } else { bottom = halfway; } } if (top == ssd->sesslist.nsessions) { top -= 1; } dlg_listbox_select(ssd->listbox, dlg, top Revision-number: 6338 Prop-content-length: 202 Content-length: 202 K 10 svn:author V 5 simon K 8 svn:date V 27 2005-09-21T17:09:07.001304Z K 7 svn:log V 101 dlg_listbox_select() now scrolls the list box to ensure that the item it's just selected is visible. PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e43108795378667a208c76f2f65e6f10 Text-delta-base-sha1: 2ec46631c1ee6973038ddbfd2324c8b27257e039 Text-content-length: 1106 Text-content-md5: df48db7bad562f74dd47d2ed6f036f5c Text-content-sha1: 4f9a1977fac3ef8c36fb61d4be301b8ff1ed1705 Content-length: 1106 SVN��<$0�T�0�{�9 int nitems; GList *items; gdouble newtop, newbot; gtk_list_select_item(GTK_LIST(uc->list), index); /* * Scroll the list box if necessary to ensure the newly * selected item is visible. */ items = gtk_container_children(GTK_CONTAINER(uc->list)); nitems = g_list_length(items); if (nitems > 0) { int modified = FALSE; g_list_free(items); newtop = uc->adj->lower + (uc->adj->upper - uc->adj->lower) * index / nitems; newbot = uc->adj->lower + (uc->adj->upper - uc->adj->lower) * (index+1) / nitems; if (uc->adj->value > newtop) { modified = TRUE; uc->adj->value = newtop; } else if (uc->adj->value < newbot - uc->adj->page_size) { modified = TRUE; uc->adj->value = newbot - uc->adj->page_size; } if (modified) gtk_adjustment_value_changed(uc->adj); } } } void dlg_text Revision-number: 6339 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:45.621428Z PROPS-END Revision-number: 6340 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:45.632618Z PROPS-END Revision-number: 6341 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2005-09-24T13:51:06.507326Z K 7 svn:log V 18 putty.yandros.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a8f5242f22eedc2d4bbe4741e60f9bcc Text-delta-base-sha1: 68e490c0c1854f55e8a145681c2cb0b15d7f5904 Text-content-length: 74 Text-content-md5: 702db32a6e863aa29e0b5e2c57143292 Text-content-sha1: 45119023e3a941999472aede17b4d97579d07cbe Content-length: 74 SVN��q/���A��lyandros.net/">putty.yandros.net</a> in Malaysia Revision-number: 6342 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.495168Z PROPS-END Revision-number: 6343 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.506374Z PROPS-END Revision-number: 6344 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2005-09-24T16:17:30.995301Z K 7 svn:log V 26 Add DEVCPP to svn:ignore. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 248 Content-length: 248 K 10 svn:ignore V 215 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp *.tds *.td2 *.map Makefile.bor Makefile.cyg Makefile.vc Makefile.lcc MSVC DEVCPP *.log *.GID local Output *.DSA *.RSA *.cnt *.hlp .bmake PROPS-END Revision-number: 6345 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.545331Z PROPS-END Revision-number: 6346 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2005-09-24T16:34:55.499931Z K 7 svn:log V 40 XML manifests now state version 0.0.0.0 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-versioninfo Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4b35f5f6b0e04e993022f76a2ddbab4 Text-delta-base-sha1: ae4b62d84133da1af3d66f14d5f23906d3d7d54e Text-content-length: 224 Text-content-md5: 505e1f68ddf710dd92077849763307c2 Text-content-sha1: 920060faf0027a232276306f25444bd447d776eb Content-length: 224 SVN��*W H�8�H�WS. While in current code this is hard-coded to 0.0.0.0, in some older versions it was set to 1.0.0.0. This isn't ideal, although we don't currently know of anything that actually looks at this version Revision-number: 6347 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.607077Z PROPS-END Revision-number: 6348 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.618119Z PROPS-END Revision-number: 6349 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.628755Z PROPS-END Revision-number: 6350 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.639437Z PROPS-END Revision-number: 6351 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.651348Z PROPS-END Revision-number: 6352 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.662759Z PROPS-END Revision-number: 6353 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.673572Z PROPS-END Revision-number: 6354 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.685499Z PROPS-END Revision-number: 6355 Prop-content-length: 258 Content-length: 258 K 7 svn:log V 157 A first stab at guidance for those lost souls who email us asking for login names and/or passwords. Feel free to hack. (NB, renumbers a section of the FAQ.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-09-24T18:33:06.413931Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 96a25ec510bb8f2482a227d70f2924e9 Text-delta-base-sha1: a8c7428eb86b452bb8786ad4846d3e05e23bed31 Text-content-length: 1284 Text-content-md5: 266d721513d299db5379300388fd654b Text-content-sha1: fabc999c545d2c79e0f4a94107c781c121e40de8 Content-length: 1284 SVN��1)g�V�g�lElogin}{Question} What login name / password should I use? This is not a question you should be asking \e{us}. PuTTY is a communications tool, for making connections to other computers. We maintain the tool; we \e{don't} administer any computers that you're likely to be able to use, in the same way that the people who make web browsers aren't responsible for most of the content you can view in them. \#{FIXME: less technical analogy?} We cannot help with questions of this sort. If you know the name of the computer you want to connect to, but don't know what login name or password to use, you should talk to whoever administers that computer. If you don't know who that is, see the next question for some possible ways to find out. \# FIXME: some people ask us to provide them with a login name apparently as random members of the public rather than in the belief that we run a server belonging to an organisation they already have some relationship with. Not sure what to say to such people. \S{faq-commands}{Question} \I{commands on the server}What commands can I type into my PuTTY terminal window? Again, this is not a question you should be asking \e{us}. You need to read the manuals, or ask the administrator, of \e{the computer you have Revision-number: 6356 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2005-09-24T18:41:17.796525Z K 7 svn:log V 27 Add NET2COM + re-organise. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e7c98c1e1f24d7ec2d7f782aa18b3c0 Text-delta-base-sha1: e8cfd14e23fd70e2e219f695b116036ca69ceee8 Text-content-length: 467 Text-content-md5: d9ce4a8f405ce2f9fee2bda380d5d6bd Text-content-sha1: d76213e5a1eebe73fc5f3ee1725170f952858254 Content-length: 467 SVN��Tg3�,�p� U�}y9you could use third-party software to turn the serial connection into a telnet connection. Some possibilities include: <ul> <li><a href="http://www.greenend.org.uk/steve/software/wconsd.c">wconsd</a>, for NT-class Windows systems. <ul><li>S</ul> <li><li><a href="http://www.digibit.org/phpBB2/dload.php?action=category&cat_id=1">NET2COM</a>, also for Windows. <li><a href="http://ser2net.sourceforge.net/">ser2net</a>, for Unix. </ul> Revision-number: 6357 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.845484Z PROPS-END Revision-number: 6358 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:46.856395Z PROPS-END Revision-number: 6359 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2005-09-29T11:27:42.805242Z K 7 svn:log V 36 putty.ayush.org putty.freemirror.de K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 702db32a6e863aa29e0b5e2c57143292 Text-delta-base-sha1: 45119023e3a941999472aede17b4d97579d07cbe Text-content-length: 102 Text-content-md5: e7c01299ca26c9a861dba8774c17fcaa Text-content-sha1: 77db7d9570253666d17fc6034ee97f3ae722e7a8 Content-length: 102 SVN��qNA�.��S�R.�I=�q�freemirror.de/">putty.freemirrorputty.ayush.org/">putty.ayush.org Revision-number: 6360 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:47.145557Z PROPS-END Revision-number: 6361 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:47.155844Z PROPS-END Revision-number: 6362 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2005-09-30T14:42:24.563127Z K 7 svn:log V 14 Minor tweaks. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 90cee8d7161424c75a64c0b0d8bfc24c Text-delta-base-sha1: 83638b9c4338a73d53d7be6ca592f8a2669342fc Text-content-length: 343 Text-content-md5: c894422e91b1bbd74e8f4f1a52b875f2 Text-content-sha1: 1535d9dfb97d321db261b9924bc6e1524c098ba4 Content-length: 343 SVN��^P8�9��\ �Vreports that installing SP2 solves the problem. <p> This ist affects only the graphical utilitiesli>A previous version of PuTTY, if you don't need the new features and bugfixes in 0.58. (Note that all releases before 0.57 have known security problems, so if you're going to do this you should use 0.57.) </ul> Revision-number: 6363 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2005-09-30T14:54:03.106207Z K 7 svn:log V 47 Mention SSH-2 rekeys in the keepalive section. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f74e12665db94dbad6ac42304d27b4eb Text-delta-base-sha1: 449b66e111f864446b6eeb1359e81a4caeef8cb7 Text-content-length: 401 Text-content-md5: 99f6dabae1d03143f71a6d8a80c284a6 Text-content-sha1: db217b9a06fdf87c773e1b87baf72c40f87005a2 Content-length: 401 SVN����?�V�?�kt(Other types of periodic network activity can cause this activity; in particular, SSH-2 re-keys can have this effect. See \k{config-ssh-kex-rekey}.) Therefore, you might find that keepalives�8Y!!�8�ecting them and hitting \q{Remove}. The effect of the mode list is as follows: \b If a mode is not on the list, it will not be specified to the server under any Revision-number: 6364 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:47.391886Z PROPS-END Revision-number: 6365 Prop-content-length: 234 Content-length: 234 K 10 svn:author V 5 simon K 8 svn:date V 27 2005-10-01T11:40:26.499130Z K 7 svn:log V 133 A swathe of new FAQ questions, along the general theme of `will you sign something for us / give us assurances / give us indemnity'. PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 266d721513d299db5379300388fd654b Text-delta-base-sha1: fabc999c545d2c79e0f4a94107c781c121e40de8 Text-content-length: 8424 Text-content-md5: 419716dc4f462090825afae4030dead5 Text-content-sha1: 9bdd966c62e7df3e4374605f9c633c18394aa6c1 Content-length: 8424 SVN��)xL�Z�L�RWS{faq-indemnity}{Question} Can you sign an agreement indemnifying us against security problems in PuTTY? No! A vendor of physical security products (e.g. locks) might plausibly be willing to accept financial liability for a product that failed to perform as advertised and resulted in damage (e.g. valuables being stolen). The reason they can afford to do this is because they sell a \e{lot} of units, and only a small proportion of them will fail; so they can meet their financial liability out of the income from all the rest of their sales, and still have enough left over to make a profit. Financial liability is intrinsically linked to selling your product for money. There are two reasons why PuTTY is not analogous to a physical lock in this context. One is that software products don't exhibit random variation: \e{if} PuTTY has a security hole (which does happen, although we do our utmost to prevent it and to respond quickly when it does), every copy of PuTTY will have the same hole, so it's likely to affect all the users at the same time. So even if our users were all paying us to use PuTTY, we wouldn't be able to \e{simultaneously} pay every affected user compensation in excess of the amount they had paid us in the first place. It just wouldn't work. The second, much more important, reason is that PuTTY users \e{don't} pay us. The PuTTY team does not have an income; it's a volunteer effort composed of people spending their spare time to try to write useful software. We aren't even a company or any kind of legally recognised organisation. We're just a bunch of people who happen to do some stuff in our spare time. Therefore, to ask us to assume financial liability is to ask us to assume a risk of having to pay it out of our own \e{personal} pockets: out of the same budget from which we buy food and clothes and pay our rent. That's more than we're willing to give. We're already giving a lot of our spare \e{time} to developing software for free; if we had to pay our own \e{money} to do it as well, we'd start to wonder why we were bothering. Free software fundamentally does not work on the basis of financial guarantees. Your guarantee of the software functioning correctly is simply that you have the source code and can check it before you use it. If you want to be sure there aren't any security holes, do a security audit of the PuTTY code, or hire a security engineer if you don't have the necessary skills yourself: instead of trying to ensure you can get compensation in the event of a disaster, try to ensure there isn't a disaster in the first place. If you \e{really} want financial security, see if you can find a security engineer who will take financial responsibility for the correctness of their review. (This might be less likely to suffer from the everything-failing-at-once problem mentioned above, because such an engineer would probably be reviewing a lot of \e{different} products which would tend to fail independently.) Failing that, see if you can persuade an insurance company to insure you against security incidents, and if the insurer demands it as a condition then get our code reviewed by a security engineer they're happy with. \S{faq-permission-form}{Question} Can you sign this form granting us permission to use/distribute PuTTY? If your form contains any clause along the lines of \q{the undersigned represents and warrants}, we're not going to sign it. This is particularly true if it asks us to warrant that PuTTY is secure; see \k{faq-indemnity} for more discussion of this. But it doesn't really matter what we're supposed to be warranting: even if it's something we already believe is true, such as that we don't infringe any third-party copyright, we will not sign a document accepting any legal or financial liability. This is simply because the PuTTY development project has no income out of which to satisfy that liability, or pay legal costs, should it become necessary. We cannot afford to be sued. We are assuring you that \e{we have done our best}; if that isn't good enough for you, tough. The existing PuTTY licence document already gives you permission to use or distribute PuTTY in pretty much any way which does not involve pretending you wrote it or suing us if it goes wrong. We think that really ought to be enough for anybody. See also \k{faq-permission-general} for another reason why we don't want to do this sort of thing. \S{faq-permission-future}{Question} Can you write us a formal notice of permission to use PuTTY? We could, in principle, but it isn't clear what use it would be. If you think there's a serious chance of one of the PuTTY copyright holders suing you (which we don't!), you would presumably want a signed notice from \e{all} of them; and we couldn't provide that even if we wanted to, because many of the copyright holders are people who contributed some code in the past and with whom we subsequently lost contact. Therefore the best we would be able to do \e{even in theory} would be to have the core development team sign the document, which wouldn't guarantee you that some other copyright holder might not sue. See also \k{faq-permission-general} for another reason why we don't want to do this sort of thing. \S{faq-permission-general}{Question} Can you sign \e{anything} for us? Not unless there's an incredibly good reason. We are generally unwilling to set a precedent that involves us having to enter into individual agreements with PuTTY users. We estimate that we have literally \e{millions} of users, and we absolutely would not have time to go round signing specific agreements with every one of them. So if you want us to sign something specific for you, you might usefully stop to consider whether there's anything special that distinguishes you from 999,999 other users, and therefore any reason we should be willing to sign something for you without it setting such a precedent. If your company policy requires you to have an individual agreement with the supplier of any software you use, then your company policy is simply not well suited to using popular free software, and we urge you to consider this as a flaw in your policy. \S{faq-permission-assurance}{Question} If you won't sign anything, can you give us some sort of assurance that you won't make PuTTY closed-source in future? Yes and no. If what you want is an assurance that some \e{current version} of PuTTY which you've already downloaded will remain free, then you already have that assurance: it's called the PuTTY Licence. It grants you permission to use, distribute and copy the software to which it applies; once we've granted that permission (which we have), we can't just revoke it. On the other hand, if you want an assurance that \e{future} versions of PuTTY won't be closed-source, that's more difficult. We could in principle sign a document stating that we would never release a closed-source PuTTY, but that wouldn't assure you that we \e{would} keep releasing \e{open}-source PuTTYs: we would still have the option of ceasing to develop PuTTY at all, which would surely be even worse for you than making it closed-source! (And we almost certainly wouldn't \e{want} to sign a document guaranteeing that we would actually continue to do development work on PuTTY; we certainly wouldn't sign it for free. Documents like that are called contracts of employment, and are generally not signed except in return for a sizeable salary.) If we \e{were} to stop developing PuTTY, or to decide to make all future releases closed-source, then you would still be free to copy the last open release in accordance with the current licence, and in particular you could start your own fork of the project from that release. If this happened, I confidently predict that \e{somebody} would do that, and that some kind of a free PuTTY would continue to be developed. There's already precedent for that sort of thing happening in free software. We can't guarantee that somebody \e{other than you} would do it, of course; you might have to do it yourself. But we can assure you that there would be nothing \e{preventing} anyone from continuing free development if we stopped. (Finally, we can also confidently predict that if we made PuTTY closed-source and someone made an open-source fork, most people would switch to the latter. Therefore, it would be pretty stupid of us to try it.) Revision-number: 6366 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:47.613371Z PROPS-END Revision-number: 6367 Prop-content-length: 500 Content-length: 500 K 8 svn:date V 27 2005-10-01T12:36:46.348773Z K 7 svn:log V 399 Split out SVN_REV from SNAPSHOT define. This is to support `win-versioninfo', but since Simon's made the corresponding change to the build process, this bit needs checking in now (it should be harmless). (The documentation in Recipe is slightly out of date; with luck I'll be checking in `win-versioninfo' changes soon, and I can't be bothered to disentangle the relevant changes in the meantime.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/version.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 147d7c7792c996020a79637a5adb429f Text-delta-base-sha1: b40a3617b182601dd8b7657f650a821967094ffc Text-content-length: 269 Text-content-md5: 1416c7c6543e825d008e61e7bcab1525 Text-content-sha1: 1a3e5102e020d97ef6f44bc49a66b6c30b988219 Content-length: 269 SVN��`r v�d�v�H#if defined SVN_REV #define SNAPSHOT_TEXT STR(SNAPSHOT) ":r" STR(SVN_REV) #else #define SNAPSHOT_TEXT STR(SNAPSHOT) #endif char ver[] = "Development snapshot " SNAPSHOT_TEXT; char sshver[] = "PuTTY-Snapshot-" SNAPSHOT_TEXT; #undef SNAPSHOT_TEXT Revision-number: 6368 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:47.650487Z PROPS-END Revision-number: 6369 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:47.661099Z PROPS-END Revision-number: 6370 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:47.672763Z PROPS-END Revision-number: 6371 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2005-10-02T11:24:57.803696Z K 7 svn:log V 85 "Tom" points out a way to hide the PuTTY-bugs-filter bit of the Google search query. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d11dbe46872feaa3a3efb256bc716d08 Text-delta-base-sha1: 160f578f70c89ceabfe21649c32cec3a54f919cf Text-content-length: 165 Text-content-md5: 5e9f4bdef0569e9f8ce9f90eed155504 Text-content-sha1: f4d2bb7b856c19b6ecc9f91c32c8f9b9f46fe0f9 Content-length: 165 SVN��d �l� �Thidden" name="hq" value="+"last revision of this bug record""> <input type="text" name="q" size="50" maxlength="255" value=" Revision-number: 6372 Prop-content-length: 106 Content-length: 106 K 8 svn:date V 27 2005-10-03T10:24:06.772326Z K 7 svn:log V 7 thinko K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99f6dabae1d03143f71a6d8a80c284a6 Text-delta-base-sha1: db217b9a06fdf87c773e1b87baf72c40f87005a2 Text-content-length: 53 Text-content-md5: 71159464ff4c31a5734680b8298950b7 Text-content-sha1: 2be21f22491ca10099095e72e976b274cebba958 Content-length: 53 SVN���� ���hbehaviour�YZ�Y�l Revision-number: 6373 Prop-content-length: 291 Content-length: 291 K 7 svn:log V 190 UTF-8 processing was discarding a valid character which interrupted an otherwise legal sequence, if that valid character was the last thing in a term_out() run. Spotted by Egmont Koblinger. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-10-03T11:38:30.403553Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 53c78d12775924e04ffc770a774f6e00 Text-delta-base-sha1: 4a9e3a088a803265935a1f8c20a2c3b58382271c Text-content-length: 69 Text-content-md5: 84f47b951eb544250d05524413ad32e2 Text-content-sha1: 94115707df68d13924ea6c35009786d9ebba2288 Content-length: 69 SVN���� ���[unget != -1�&��ze - ie window Revision-number: 6374 Prop-content-length: 1133 Content-length: 1133 K 8 svn:date V 27 2005-10-04T14:13:28.153692Z K 7 svn:log V 1031 `win-versioninfo': all builds of all Windows binaries now contain a VERSIONINFO resource. The versioning scheme is described in windows/version.rc2. Some .rc files are now #included in others. In order to keep MSVC project files working, these have been renamed to .rc2; there may exist a better solution. (This checkin also includes the documentation tweak missing from r6367.) Testing performed: - MinGW (cross-compiler): works - VC nmake: works (tested with VC6) - VC project files: builds with VERSIONINFO resource (no VER variable though) - Borland: an old version of this patch was tested with it and more or less worked, except that some of the VERSIONINFO strings were apparently not terminated properly. Not attempted to work around this. - LCC: not tested. Some fixes are in there from the last time we tried this, but then the build ultimately failed and I haven't tried this since that was fixed. - Dev-C++: untested. (Haven't done anything special.) - Unix Gtk/autoconf Makefiles work as before. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b5c0e227eb8b21bf05f454e54fb21101 Text-delta-base-sha1: 309143a3839f09e820490567c0f6c35f18f47838 Text-content-length: 457 Text-content-md5: 5cb23abd6e822b21aee3a121fe1df895 Text-content-sha1: abb408c5d846f4814c46b99716693faf274712ca Content-length: 457 SVN��L�(��=�D&�bG�~2windows/version.rc2 + the copyright date appears once only.Windows resource file (used to generate the binary bit of the VERSIONINFO resources -- the strings are supplied by the usual means): - putty/windows/version.rc2 (BASE_VERSION; NB, _comma_-separated) The Mac resource file (used to generate the binary bit of the 'vers' resource, and sanity-check the version info reported on the files by Windows Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cf7823e8f3af7afafe1172d5829c1f94 Text-delta-base-sha1: 416b3f10d5ebf41868c62add5b9399e1dfba9ab2 Text-content-length: 1052 Text-content-md5: bef0e7c82fbcf10004a872432d2ba45b Text-content-sha1: b61836126d6ba9c6eff6c8a250f35baa9212574e Content-length: 1052 SVN��Dg1_�E�/�:�~Hf�X:�w�H F� �="/DSNAPSHOT=1999-01-25 /DSVN_REV=1234" # Generates executables whose About box report them as being a # development snapshot. SVN_REV is a Subversion revision number bcc32 $(VER) $(CFLAGS) /c ..\version.c !end !specialobj borland version !begin lcc version.obj: FORCEAdd VER to Windows resource targets, and force them to be rebuilt every # time, on the assumption that they will contain version information. !begin vc vars RCFLAGS = $(RCFLAGS) $(VER) !end !begin cygwin vars # XXX GNU-ism, but it's probably all right for a Cygwin/MinGW Makfile. RCFLAGS += $(patsubst -D%,--define %,$(VER)) !end !begin borland vars # Borland doesn't support +=. This probably shouldn't work, but seems to. RCFLAGS = $(RCFLAGS) $(VER) !end !begin lcc vars RCFLAGS += $(VER) !end !forceobj putty.res !forceobj puttytel.res !forceobj plink.res !forceobj pscp.res !forceobj psftp.res !forceobj pageant.res !forceobj puttygen.resputty.res LIBS puttytel : [G] GUITERM NONSSH BE_NOSSH WINMISC puttytelft Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3fab06b90171b82e9644cc285e007db0 Text-delta-base-sha1: 9ce0df7ce8f022b474a42b549c237f72747c3d56 Text-content-length: 2443 Text-content-md5: 58793dcf9ee47828d5eb3f6dbcf10588 Text-content-sha1: a56d16b8b5e07bb2fd97b2cbf6a3e092a2e50b74 Content-length: 2443 SVN��w`�6�C�04�oQ�2>�hvR�l4��<8P�vZ�F�Y�A�wZ�=EJ�!N�,�v�vFY�^�l �Y�^� W���Y8�d� jT�JX�;�^G�g+\�0j�o/# # FIXME: no attempt made to handle !forceobj in the project filesforceobj") { $forceobj{$_[1]} = 1; next; obj_orig => $i([=" ])\/D/\1if ($forceobj{$d->{obj_orig}}) { printf ("%s: FORCE\n", $d->{obj}); } else { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; }. "FORCE:([=" ])\/D/\1# Resource compilation flags\n". "RCFLAGS = -DNO_WINRESRC_H -DWIN32 -D_WIN32\$(RCFLAGS)if ($forceobj{$d->{obj_orig}}) { printf("%s: FORCE\n", $d->{obj}); } else { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; }. "\n". "FORCE:\n". "\t-rem dummy commandRCFLAGS = -DWIN32 -D_WIN32 -DWINVER=0x0400 $extradeps = $forceobj{$d->{obj_orig}} ? ["*.c","*.h","*.rc"] : []; print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @$extradeps, @{$d->{deps}})),\$(RCFLAGS)([=" ])\/D/\1if ($forceobj{$d->{obj_orig}}) { printf("%s: FORCE\n", $d->{obj}); } else { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; }print "\nFORCE:([=" ])\/D/\1if ($forceobj{$d->{obj_orig}}) { printf("%s: FORCE\n", $d->{obj}); } else { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; }print "\nFORCE: (FIXME further massaging?) ($_ = $help) =~ s/([=" ])\/D/\1([=" ])\/D/\1# Resource compilation flags\n". "RCFLAGS = if ($forceobj{$d->{obj_orig}}) { printf("%s: FORCE\n", $d->{obj}); } else { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; } print &splitline("\tlrc \$(RCFL) -r \$(RCFLAGS) ". . "\n". "FORCE:([=" ])\/D/\1if ($forceobj{$d->{obj_orig}}) { printf("%s: FORCE\n", $d->{obj}); } else { print &splitline(sprintf("%s: %s", $d->{obj}, join " ", @{$d->{deps}})), "\n"; }. "\trm -rf *.app\n"; "\n". "FORCE: Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8be423a0a6bf6677a18e0b2713341996 Text-delta-base-sha1: 1fdbdcef2e3d195f5b59760db4f5bcb6f76d4d03 Text-content-length: 118 Text-content-md5: e34c2ae5654a9fc7fb15aae707f21390 Text-content-sha1: 486f5da7eae22e6c3698fc49b73b7158cae67ceb Content-length: 118 SVN��}]�@�I�=�ML#define APPNAME "Pageant" #define APPDESC "PuTTY SSH authentication agentnclude "version.rc2" Node-path: putty/windows/plink.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a4f6e7df7066180cf02df9f0e8b8dea8 Text-delta-base-sha1: c9dd6df3ed1161f08be3dbc37676f171d6ad0223 Text-content-length: 168 Text-content-md5: 9a692856fe521b31e05eda00d0717125 Text-content-sha1: 06e832e3e0105e9982dc8ae2455897e4b67214dd Content-length: 168 SVN��#include "rcstuff.h" #define APPNAME "Plink" #define APPDESC "Command-line SSH, Telnet, and Rlogin client" 200 ICON "putty.ico" #include "version.rc2" Node-path: putty/windows/pscp.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 024a69b7abec99f61efa1b5c073bf483 Text-delta-base-sha1: a688c50ad7b7268fa3d7bbc5b2678eceb257b2e7 Text-content-length: 151 Text-content-md5: a3e15f458edaa23320c099cf3f9be775 Text-content-sha1: 50934a9c61ddf65aed1e4f79f851c9cf1961a53b Content-length: 151 SVN��  #include "rcstuff.h" #define APPNAME "PSCP" #define APPDESC "Command-line SCP/SFTP client" 200 ICON "pscp.ico" #include "version.rc2" Node-path: putty/windows/psftp.rc Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 160 Text-content-md5: 5a78819d72687fb5613c129c41b1ef20 Text-content-sha1: 148685f565d96c8e8f37549d344dfbfab643d120 Content-length: 170 PROPS-END SVN���#include "rcstuff.h" #define APPNAME "PSFTP" #define APPDESC "Command-line interactive SFTP client" 200 ICON "pscp.ico" #include "version.rc2" Node-path: putty/windows/putty.rc Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 206 Text-content-md5: d28d06be5036065824255731b18a6b1a Text-content-sha1: a4c1e28f9814cc9924d0b4156f3e433ee98d9877 Content-length: 216 PROPS-END SVN���@@@#include "rcstuff.h" #define APPNAME "PuTTY" #define APPDESC "SSH, Telnet and Rlogin client" #include "win_res.rc2" #ifndef NO_MANIFESTS 1 RT_MANIFEST "putty.mft" #endif /* NO_MANIFESTS */ Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 93807774b6f202fc69a2574f486875da Text-delta-base-sha1: ce40bdbcac3783a10d69c22e5254f8e9d59c208f Text-content-length: 121 Text-content-md5: 1386d21143ca8f49700d5897cdfd5aec Text-content-sha1: a814b5b118bce02ff6a8d7dbc81c1da0233709a7 Content-length: 121 SVN��N5`�A�L�F>�N�#define APPNAME "PuTTYgen" #define APPDESC "PuTTY SSH key generation utilitynclude "version.rc2" Node-path: putty/windows/puttytel.rc Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 216 Text-content-md5: aa005c2def554d0eb36cfbb309a4b34a Text-content-sha1: 0fbd8013be66e99a6b96b985d57f5dfb686352e9 Content-length: 226 PROPS-END SVN���JJJ#include "rcstuff.h" #define APPNAME "PuTTYtel" #define APPDESC "Telnet and Rlogin client" #include "win_res.rc2" #ifndef NO_MANIFESTS /* FIXME */ 1 RT_MANIFEST "putty.mft" #endif /* NO_MANIFESTS */ Node-path: putty/windows/rcstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 84edb831c5974a36f43bd762a9d53e96 Text-delta-base-sha1: 3508a867450444f8189b3e2bd853369c6ccee231 Text-content-length: 372 Text-content-md5: 0be6118f28d46488e1e95311bf626e8e Text-content-sha1: 92073905948ffc02cbd29e121b2c6fffc2d4d60b Content-length: 372 SVN��1ua��a/* LCC is the offender here. */ #ifndef VS_FF_DEBUG #define VS_FF_DEBUG 1 #endif #ifndef VS_FF_PRERELEASE #define VS_FF_PRERELEASE 2 #endif #ifndef VS_FF_PRIVATEBUILD #define VS_FF_PRIVATEBUILD 8 #endif #ifndef VOS__WINDOWS32 #define VOS__WINDOWS32 4 #endif #ifndef VFT_APP #define VFT_APP 1 #endif #endif /* PUTTY_RCSTUFF_H */ Node-path: putty/windows/version.rc2 Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 3592 Text-content-md5: 979419d0678a819f3099278d0c920128 Text-content-sha1: f06fe6e1918b2a5921a254a4120d15c79267e6d1 Content-length: 3602 PROPS-END SVN���zzz/* * Standard Windows version information. * (For inclusion in other .rc files with appropriate macro definitions.) * FIXME: This file is called '.rc2' rather than '.rc' to avoid MSVC trying * to compile it on its own when using the project files. Nicer solutions * welcome. */ /* * Binary versions in Windows are major.minor.build.revision. Each * component is 16-bit. * Here we have: * major.minor * PuTTY version number (e.g. 0.58). (We've made a policy decision * that these will be numeric from now on.) * Present in releases and snapshots (for the sake of monotonicity * in version numbers). * build * In releases, always 0. * In snapshots, nearest Subversion revision. (It shouldn't be * assumed that only one binary will have a given build number, of * course.) * revision * Reserved; always 0. * * Examples of these version numbers: * Release: 0.58.0.0 (but 0.58 didn't have a VERSIONINFO resource) * Snapshot: 0.58.6356.0 (between 0.58 and the next release) * Local: 0.0.0.0 */ /* * Mechanics of version naming/numbering. * (This is a ripoff of ../version.c.) */ #define STR1(x) #x #define STR(x) STR1(x) /* We keep this around even for snapshots, for monotonicity of version * numbering. It needs to be kept up to date. NB _comma_-separated. */ #define BASE_VERSION 0,58 #if defined SNAPSHOT /* Make SVN_REV mandatory for snapshots, to avoid issuing binary * version numbers that look like full releases. */ #if (!defined SVN_REV) || (SVN_REV == 0) #error SVN_REV not defined/nonzero for snapshot build #endif #define VERSION_TEXT "Development snapshot " STR(SNAPSHOT) ":r" STR(SVN_REV) #define BINARY_VERSION BASE_VERSION,SVN_REV,0 #elif defined RELEASE #define VERSION_TEXT "Release " STR(RELEASE) #define BINARY_VERSION BASE_VERSION,0,0 #else /* We can't reliably get the same date and time as version.c, so * we won't bother trying. */ #define VERSION_TEXT "Unidentified build" #define BINARY_VERSION 0,0,0,0 #endif /* * The actual VERSIONINFO resource. */ VS_VERSION_INFO VERSIONINFO /* (None of this "fixed" info appears to be trivially user-visible on * Win98SE. The binary version does show up on Win2K.) */ FILEVERSION BINARY_VERSION PRODUCTVERSION BINARY_VERSION /* version of whole suite */ FILEFLAGSMASK VS_FF_DEBUG | VS_FF_PRERELEASE | VS_FF_PRIVATEBUILD FILEFLAGS 0x0L #if defined DEBUG | VS_FF_DEBUG #endif #if defined SNAPSHOT | VS_FF_PRERELEASE #elif !defined RELEASE | VS_FF_PRIVATEBUILD #endif FILEOS VOS__WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0x0L /* n/a for VFT_APP */ BEGIN /* (On Win98SE and Win2K, we can see most of this on the Version tab * in the file properties in Explorer.) */ BLOCK "StringFileInfo" BEGIN /* "lang-charset" LLLLCCCC = (UK English, Unicode) */ BLOCK "080904B0" BEGIN VALUE "CompanyName", "Simon Tatham" /* required :/ */ VALUE "ProductName", "PuTTY suite" VALUE "FileDescription", APPDESC VALUE "InternalName", APPNAME VALUE "OriginalFilename", APPNAME VALUE "FileVersion", VERSION_TEXT VALUE "ProductVersion", VERSION_TEXT VALUE "LegalCopyright", "Copyright \251 1997-2005 Simon Tatham." #if (!defined SNAPSHOT) && (!defined RELEASE) /* Only if VS_FF_PRIVATEBUILD. */ VALUE "PrivateBuild", VERSION_TEXT /* NBI */ #endif END END BLOCK "VarFileInfo" BEGIN /* Once again -- same meanings -- apparently necessary */ VALUE "Translation", 0x809, 1200 END END #undef VERSION_TEXT #undef BASE_VERSION #undef BINARY_VERSION Node-path: putty/windows/win_res.rc2 Node-kind: file Node-action: add Node-copyfrom-rev: 6373 Node-copyfrom-path: putty/windows/win_res.rc Text-copy-source-md5: 1422362f62f0ade67141f519351b0a2c Text-copy-source-sha1: 820b069f7f56a1072b746c9152578d506158a4a3 Text-delta: true Text-delta-base-md5: 1422362f62f0ade67141f519351b0a2c Text-delta-base-sha1: 820b069f7f56a1072b746c9152578d506158a4a3 Text-content-length: 493 Text-content-md5: e3fdc356789a96408a3c230da1c85ee4 Text-content-sha1: 9894a4305e754e22cafb07b5052084ddd821cdf5 Content-length: 493 SVN��fYD� I/* * Windows resources shared between PuTTY and PuTTYtel, to be #include'd * after defining appropriate macros. * Note that many of these strings mention PuTTY. Due to restrictions in * VC's handling of string concatenation, this can't easily be fixed. * It's fixed up at runtime. * FIXME: This file is called '.rc2' rather than '.rc' to avoid MSVC trying * to compile it on its own when using the project files. Nicer solutions * welcome. */ nclude "version.rc2" Node-path: putty/windows/win_res.rc Node-action: delete Node-path: putty-wishlist/data/win-versioninfo Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 505e1f68ddf710dd92077849763307c2 Text-delta-base-sha1: 920060faf0027a232276306f25444bd447d776eb Text-content-length: 584 Text-content-md5: a7f93df1dad17cfad7fb1ccebf1d035e Text-content-sha1: 3e72499c9da9d40890821f8a08b3899ade111d6b Content-length: 584 SVN��W)�f��e^�v47Fixed-in: 2005-10-05<em>Update, 2005-10-05:</em> after wrestling with various toolchains, we've finally checked in something that appears to work with the Windows compilers we've tried. We reserve the right to back it out if it causes trouble four-component version number. We don't attempt to keep this in sync with the VERSIONINFO resource. In current code this is hard-coded to 0.0.0.0, although in some older versions it was set to 1.0.0.0. This isn't ideal, although we don't currently know of anything that actually looks at this version number.) Revision-number: 6375 Prop-content-length: 153 Content-length: 153 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-10-04T14:17:26.687509Z K 7 svn:log V 53 Add link to description of version numbering scheme. PROPS-END Node-path: putty-wishlist/data/win-versioninfo Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a7f93df1dad17cfad7fb1ccebf1d035e Text-delta-base-sha1: 3e72499c9da9d40890821f8a08b3899ade111d6b Text-content-length: 228 Text-content-md5: 78b5b1abc1e5198d68f031fea703298b Text-content-sha1: 1e5f0ec6f9ef45450758061f4ebc07bbaf0962b1 Content-length: 228 SVN��p L�w�L�-pThe meaning of the binary version number (e.g., 0.58.6356.0) is described in <tt><a href="http://tartarus.org/~simon-anonsvn/viewcvs.cgi/putty/windows/version.rc2?view=markup">windows/version.rc2</a></tt> Revision-number: 6376 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:48.345575Z PROPS-END Revision-number: 6377 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2005-10-06T15:05:47.651653Z K 7 svn:log V 49 Problem with Cisco servers and password padding. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-cisco-pw-pad Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1272 Text-content-md5: e80af5459d1bf1bfb6c16c38e2959b77 Text-content-sha1: e0d7b2fe04fd189247e1edc61ec84db3fdc9f9c8 Content-length: 1282 PROPS-END SVN���jjjSummary: Cisco SSH-2 servers can't handle over-padded packets Category: wish Absent-in: 0.55 Present-in: 0.58 Difficult: tricky Priority: low Content-type: text/x-html-body <p> It appears that the SSH-2 server in some versions of Cisco CatOS (version string "SSH-2.0-Cisco-1.25") is unable to cope with the <a href="http://www.tartarus.org/~simon-anonsvn/viewcvs.cgi?rev=5122&view=rev">additional padding</a> that PuTTY puts on packets containing passwords in order to mask their length. This additional padding is permitted by the SSH-2 specification, which merely requires: <pre> random padding Arbitrary-length padding, such that the total length of (packet_length || padding_length || payload || random padding) is a multiple of the cipher block size or 8, whichever is larger. There MUST be at least four bytes of padding. The padding SHOULD consist of random bytes. The maximum amount of padding is 255 bytes. </pre> <p>This can be solved by reverting to sending an SSH_MSG_IGNORE immediately after the password, either for all connections or just when talking to broken Cisco servers. Alternatively, we could just accept guessable password lengths when talking to broken servers. Revision-number: 6378 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:48.430067Z PROPS-END Revision-number: 6379 Prop-content-length: 171 Content-length: 171 K 7 svn:log V 71 Failed to call set_erase_char() after processing SCO colour sequences. K 10 svn:author V 5 simon K 8 svn:date V 27 2005-10-08T09:09:50.390123Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 84f47b951eb544250d05524413ad32e2 Text-delta-base-sha1: 94115707df68d13924ea6c35009786d9ebba2288 Text-content-length: 94 Text-content-md5: 9e090a145c7dd98b0ad5334d522e448c Text-content-sha1: 27d9c6e729656477fa85e80af58e8eac329b907c Content-length: 94 SVN���������&`0�b��<]� set_erase_char(term) set_erase_char(term) Revision-number: 6380 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 54 Mention TuTTY where it implements something we don't. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-10-08T19:32:48.355223Z PROPS-END Node-path: putty-wishlist/data/many-sessions Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5ad4a63b2471298329baf23c54c8e52d Text-delta-base-sha1: f758dbf06fac704aebd2b5ea10e1fc9f0d528e90 Text-content-length: 104 Text-content-md5: 47144b8d58c6e8a81611bacb42365dee Text-content-sha1: c6339ac73f38b8fc0101b77d7582717eec5cf63b Content-length: 104 SVN��pB R�G�R�)G <a href="http://putty.dwalin.ru/">TuTTY</a> apparently does something like this. Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d9ce4a8f405ce2f9fee2bda380d5d6bd Text-delta-base-sha1: d76213e5a1eebe73fc5f3ee1725170f952858254 Text-content-length: 92 Text-content-md5: 83d40aa7ede98f09768c66d7c752e0f7 Text-content-sha1: bdab9419d889222a6a6b1182ae78a9f71b0b9f56 Content-length: 92 SVN��g4 F�8�F�61<a href="http://putty.dwalin.ru/">TuTTY</a> has a serial backend patch Node-path: putty-wishlist/data/session-icon Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35312835ad759f822e383c15a2fa3c3c Text-delta-base-sha1: 789145a1e6660550bd7f4996c74b39f8176b6b29 Text-content-length: 96 Text-content-md5: fc149aed654f6801ec4f9a8301d57dbf Text-content-sha1: 2facebfdd744c50045711bd2e4b34a5ecb3c3e42 Content-length: 96 SVN��_/ J�P�J�J<a href="http://putty.dwalin.ru">TuTTY</a> implements something like this. Node-path: putty-wishlist/data/sgr-as-colours Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 05438190ed8f2db91746be4f9740fca3 Text-delta-base-sha1: 157fb27d6a48f1a47d96ed4faafe1616a3406b7a Text-content-length: 98 Text-content-md5: 145c5e9b9cfe06e447e39da7d1343ac6 Text-content-sha1: 6592fe9d534c06d9eb2fc00f45493dc3e677a554 Content-length: 98 SVN��m>Q�m�Q <p> <a href="http://putty.dwalin.ru/">TuTTY</a> implements underline-as-colour. Revision-number: 6381 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2005-10-08T19:36:12.981979Z K 7 svn:log V 27 Mention TuTTY and plaunch. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a9c9c505afdf06e83cffd1848ef5ef2 Text-delta-base-sha1: 9c4bea93422c69278510d2573799e23404d6d591 Text-content-length: 182 Text-content-md5: 16172b4adc269e64dc138db3491bc5d7 Text-content-sha1: 32f4c037820a63df9e7079a8aba634515d193c73 Content-length: 182 SVN��'�r�_�Y]�1vputty.dwalin.ru/"> TuTTY</a>, a fork with several extra features, including a serial backend.putty.dwalin.ru/?plaunch"> plaunch</a>, another programs Revision-number: 6382 Prop-content-length: 110 Content-length: 110 K 8 svn:date V 27 2005-10-08T19:48:32.741741Z K 7 svn:log V 10 Grammaro. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 16172b4adc269e64dc138db3491bc5d7 Text-delta-base-sha1: 32f4c037820a63df9e7079a8aba634515d193c73 Text-content-length: 20 Text-content-md5: f4cce4bb24019298e3fdf0c334f3256a Text-content-sha1: 1fa20e2d41ba14e370c911ea04351cfee9a8aa8e Content-length: 20 SVN�� ��c��1d Revision-number: 6383 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:48.801058Z PROPS-END Revision-number: 6384 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:48.812681Z PROPS-END Revision-number: 6385 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:48.825790Z PROPS-END Revision-number: 6386 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:48.837656Z PROPS-END Revision-number: 6387 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2005-10-12T13:47:54.326157Z K 7 svn:log V 38 putty.ev1helps.net putty.nedmirror.nl K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7c01299ca26c9a861dba8774c17fcaa Text-delta-base-sha1: 77db7d9570253666d17fc6034ee97f3ae722e7a8 Text-content-length: 102 Text-content-md5: 4167e48f65da7d00f1350d6ffbba404b Text-content-sha1: 0edaf6f576adb8d6e203ff7232bb419c3e7d03e7 Content-length: 102 SVN��N7A�b��U��b�M|�[sputty.nedmirror.nl/">putty.nedmirrorev1helps.net/">putty.ev1helps Revision-number: 6388 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:49.224016Z PROPS-END Revision-number: 6389 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:49.236184Z PROPS-END Revision-number: 6390 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:49.247604Z PROPS-END Revision-number: 6391 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:49.258575Z PROPS-END Revision-number: 6392 Prop-content-length: 176 Content-length: 176 K 7 svn:log V 78 Make SSH_MSG_DISCONNECT reasons less scary (without removing useful content). K 10 svn:author V 3 ben K 8 svn:date V 27 2005-10-13T21:51:38.915840Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1cb87c0f658877f7874529c25f6e1210 Text-delta-base-sha1: 6a8e01101e1dbd1f5ab9e429d71e8c469eb6aee2 Text-content-length: 939 Text-content-md5: 3c945e0bb1e2edfd8b31263ebc3121d2 Text-content-sha1: 58ef025f1f9b4a45c87623fea59638dc55230b75 Content-length: 939 SVN�����l� �mahost not allowed to connect", "protocol error", "key exchange failed", "host authentication failed", "mac error", "compression error", "service not available", "protocol version not supported", "host key not verifiable", "connection lost", "by application", "too many connections", "auth cancelled by user", "no more auth methods available", "illegal user namet_getstring(pktin, &challenge, &challengelen); if (!challenge) { bombout(("TIS challenge packet was badly formed")); crStop(0); } c_write_str(ssh, "Using TIS authentication.\r\n"); logevent("Received TIS c���a�)8�v agn */ s->len += 4; /* flags */ s->agentreq = snewn(4 + s->len, char); PUT_32BIT(s->agentreq, s->len); s->q = s->agentreq + 4; *s->q++ = SSH2_AGENTC_SIGN_REQUEST; PUT_32BIT(s->q, s->pklen); s->q += 4;�+J��Ja Revision-number: 6393 Prop-content-length: 219 Content-length: 219 K 7 svn:log V 120 Fix 256-colours-match-xterm, based on 256colres.pl from xterm-205. Largely untested -- may not even compile on Windows. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-10-13T21:56:43.955163Z PROPS-END Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f90420ad379fb90b6671837dbc91aa1 Text-delta-base-sha1: 4e87dfd5012f3ee3c8458bea6fb9bc8ed7ce25bb Text-content-length: 228 Text-content-md5: f8bc145548be89b9e295e2745058106e Text-content-sha1: 1efdde122885396ce0be86c8e185f3956f1e7657 Content-length: 228 SVN��AwH�b�H�Mtr = r ? r*40+55 : 0; g = g ? b*40+55 : 0; b = b ? b*40+55 : 0; [win setColour:i+16 r:r/255.0 g:g/255.0 b:b/255.0]; } else { int shade = i - 216; float fshade = (shade * 10 + 8) / 255.0 Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e47b9abce077ab84c6bb49bbebfa3f3 Text-delta-base-sha1: 9db3add715c7f4eeaac6ab63b9749971c606cf7e Text-content-length: 287 Text-content-md5: c66b3a60ccf2700054804f524f4fe04b Text-content-sha1: 23d84b03b3e4cac535bcf273b376312c01b185d3 Content-length: 287 SVN����X��X� W? r * 0x2828 + 0x3737 : 0; inst->cols[i+16].green = g ? g * 0x2828 + 0x3737 : 0; inst->cols[i+16].blue = b ? b + 0x2828 + 0x3737 : 0; } else { int shade = i - 216; shade = shade * 0x0a0a + 0x0808�w�w�if (new_session) MKMENU Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 27a554103301ddc155acb31e9cb46ada Text-delta-base-sha1: afb5b743180dbbc6018036d08c231147c14e7504 Text-content-length: 232 Text-content-md5: ccb0fb93b0643c379280ea223e40e9ae Text-content-sha1: 642a9ed2a0e219c746a0deeb636f222b47e932c1 Content-length: 232 SVN����7�|�7�M0? r * 40 + 55 : 0; defpal[i+16].rgbtGreen = g ? g * 40 + 55 : 0; defpal[i+16].rgbtBlue = b ? b * 40 + 55 : 0; } else { int shade = i - 216; shade = shade * 10 + 8���, " Revision-number: 6394 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2005-10-13T21:57:22.862237Z K 7 svn:log V 23 I think this is fixed. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/256-colours-match-xterm Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc46aeba65d7cf66a1b9068acf2dc07c Text-delta-base-sha1: 603b8a0cca9815e38917edb1f539ad034f0ebbd8 Text-content-length: 45 Text-content-md5: e56f910671e82fd1cdb27d6d81b63e92 Text-content-sha1: cc9188decadfe1462d5b1443250f4ce7b9ea848c Content-length: 45 SVN��|���~~Fixed-in: 2005-10-14 r6393 Revision-number: 6395 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 36 ANother instance, from Colin Keith. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-10-13T22:02:12.433684Z PROPS-END Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f8d0f712218ccec7f23d89052cd8f506 Text-delta-base-sha1: 7953722c15484efa3c37ef04ea76a18b4c7f486c Text-content-length: 296 Text-content-md5: 0bcb6229ef08ac06472ce4e7b1aac360 Text-content-sha1: 89203d8cdcaedcb1ca79daabaf50d1acd2c3c7b3 Content-length: 296 SVN��>P �(��&li><tt>20051013140345.GA9964@dot.oreally.co.uk</tt> <br>0.58 on Win2K+SP4 <br><pre> line==NULL in terminal.c lineno=5376 y=65 w=182 h=65 count(scrollback=00890758)=2 count(screen=008BE508)=65 count(alt=00890768)=65 alt_sblines=64 whichtree=008BE508 treeindex=65 </pre> Revision-number: 6396 Prop-content-length: 186 Content-length: 186 K 7 svn:log V 88 Possible bug in IPv6 address interpretation. I've asked the reporter for more details. K 10 svn:author V 3 ben K 8 svn:date V 27 2005-10-13T22:15:22.098386Z PROPS-END Node-path: putty-wishlist/data/ipv6-scoped-addr Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 345 Text-content-md5: f43dd2895cab8d69ab4c2789dcb0e5c5 Text-content-sha1: d432569cad3735b60df6577738092b30942d1262 Content-length: 355 PROPS-END SVN���KKKSummary: On Windows, IPv6 scoped addresses don't work Content-type: text/plain Priority: low Class: bug It's been reported that IPv6 scoped addresses, such as fe80::200:e2ff:fe65:9ce%4, don't work correctly on Windows XP Home + XP2. SecureCRT does work, which suggests that we might just need to invoke getaddrinfo() differently. Revision-number: 6397 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2005-10-13T22:26:06.490521Z K 7 svn:log V 54 Add a link to PuTTY SC, courtesy of Edouard LAFARGUE. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f4cce4bb24019298e3fdf0c334f3256a Text-delta-base-sha1: 1fa20e2d41ba14e370c911ea04351cfee9a8aa8e Text-content-length: 109 Text-content-md5: f26be10b12e1e3bde2d16443ffda37cf Text-content-sha1: aee36da6c66648de066041c7278d8df3e75d3f81 Content-length: 109 SVN��� W�o�W�:Zwww.joebar.ch/puttysc/">PuTTY SC</a>, another patch for smartcard support (no source) Revision-number: 6398 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2005-10-13T22:28:19.417706Z K 7 svn:log V 18 Mention PuTTY SC. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7fe65e700f73e3778afe376b742e871 Text-delta-base-sha1: 5677fa69f1738cccefab0be2744638471c825216 Text-content-length: 130 Text-content-md5: 8f6d42bd735a3e06045fa608a9571b73 Text-content-sha1: 261281cd130b43a697d9abe37b74ec90bc1de334 Content-length: 130 SVN��q��qli><a href="http://www.joebar.ch/puttysc/">PuTTY SC</a> uses PKCS#11, and doesn't seem to have any source. </ul> Revision-number: 6399 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2005-10-13T22:51:44.876118Z K 7 svn:log V 34 Tweak to r6392: spell "MAC" thus. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c945e0bb1e2edfd8b31263ebc3121d2 Text-delta-base-sha1: 58ef025f1f9b4a45c87623fea59638dc55230b75 Text-content-length: 59 Text-content-md5: be99e8f09ed19275e92e8f029bb6ec9d Text-content-sha1: 5b981e8773a259a058d4597bf6cf704b3491b0a9 Content-length: 59 SVN���� �b��eMAC��������JJ��J� Revision-number: 6400 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:51.342080Z PROPS-END Revision-number: 6401 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2005-10-15T10:53:15.529013Z K 7 svn:log V 57 Some more details from the submitter, and tests on Unix. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ipv6-scoped-addr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f43dd2895cab8d69ab4c2789dcb0e5c5 Text-delta-base-sha1: d432569cad3735b60df6577738092b30942d1262 Text-content-length: 144 Text-content-md5: d05f2f03f932254b0192f73c30868c5a Text-content-sha1: 5c3d1285d6af2e83a3a139d557c2fb6a581080d7 Content-length: 144 SVN��KDw�h��g�bhPresent-in: 2005-10-14The error is "Network error: No route to host" Scoped addresses work on Unix (NetBSD at least). Revision-number: 6402 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:51.424175Z PROPS-END Revision-number: 6403 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:51.457599Z PROPS-END Revision-number: 6404 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:51.470263Z PROPS-END Revision-number: 6405 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:51.481446Z PROPS-END Revision-number: 6406 Prop-content-length: 156 Content-length: 156 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-10-18T18:29:11.528735Z K 7 svn:log V 56 putty.adcserver.com.ar putty.internoc.nl putty.hoxt.com PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4167e48f65da7d00f1350d6ffbba404b Text-delta-base-sha1: 0edaf6f576adb8d6e203ff7232bb419c3e7d03e7 Text-content-length: 171 Text-content-md5: 2aed04daa9ae11770c72ab4833456904 Text-content-sha1: 7b3e7049b42a2717f8c67cb8a36150903505ece9 Content-length: 171 SVN��7�<�N�Y�[z� h�M�Kladcserver.com.ar/">putty.adcserver.com.ar</a> in Argentina<!--MIRRORSTATUS-->.internoc.nl/">putty.internochoxt.com/">putty.hoxt Revision-number: 6407 Prop-content-length: 137 Content-length: 137 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-10-18T19:31:29.357201Z K 7 svn:log V 37 Reference Justin Bradford's patches. PROPS-END Node-path: putty-wishlist/data/async-dns Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5222ec83cee8e483d760db8930b23c15 Text-delta-base-sha1: fb127ac89309df3ac878c91381f9806e6c841ed8 Text-content-length: 172 Text-content-md5: c4917f521e7a03ec0cd191628329c0e4 Text-content-sha1: 819d2de75e1df6a2941eda309897dedc86286dff Content-length: 172 SVN��?X�?� <p> <a href="http://dillgroup.ucsf.edu/~justin/putty/adns/">Patch</a> (unreviewed): <tt>Pine.LNX.4.60.0510092209320.31985@maxwell.compbio.ucsf.edu</tt> Revision-number: 6408 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 Mention Centrify's GSSAPI-enabled version. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-10-19T16:12:32.578499Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f26be10b12e1e3bde2d16443ffda37cf Text-delta-base-sha1: aee36da6c66648de066041c7278d8df3e75d3f81 Text-content-length: 173 Text-content-md5: 487fea2691ee7c24ef1f1cc1d35b109a Text-content-sha1: 526e94a101164e821cc64799874fbe41ad545e87 Content-length: 173 SVN���6 �[��F:www.centrify.com/resources/putty.asp">Centrify PuTTY</a> provides <a href="wishlist/kerberos-gssapi.html">GSSAPI support</a> via the Windows SSPI Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3a26763760f3ac658c1716f818da67dc Text-delta-base-sha1: 2ef7f4b535bd7d4789d70af5815f87f35ad72b1b Text-content-length: 271 Text-content-md5: 87b07820a22b7bf38f532cc3059b6a34 Text-content-sha1: 47ff58cca2b2b6a5ba578ee59707310f7bae1399 Content-length: 271 SVN��XT|�X�| <p> Binary-only versions: <ul> <li> Centrify provide a <a href="http://www.centrify.com/resources/putty.asp">modified version of PuTTY</a> which uses the Windows SSPI for GSSAPI support. It includes features specific to their other products. </ul> Revision-number: 6409 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:51.722836Z PROPS-END Revision-number: 6410 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:51.735018Z PROPS-END Revision-number: 6411 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2005-10-22T09:48:00.029888Z K 7 svn:log V 19 putty.alb-tech.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2aed04daa9ae11770c72ab4833456904 Text-delta-base-sha1: 7b3e7049b42a2717f8c67cb8a36150903505ece9 Text-content-length: 74 Text-content-md5: 0804322990b031806d1dac018df19fe2 Text-content-sha1: d443c8372a6c034db40fc11d6b298f96be3833eb Content-length: 74 SVN��/�:��A@�W:alb-tech.org/">putty.alb-tech.org</a> in Kosovo Revision-number: 6412 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.049018Z PROPS-END Revision-number: 6413 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.060490Z PROPS-END Revision-number: 6414 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.072953Z PROPS-END Revision-number: 6415 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.085385Z PROPS-END Revision-number: 6416 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.096789Z PROPS-END Revision-number: 6417 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.112935Z PROPS-END Revision-number: 6418 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.125633Z PROPS-END Revision-number: 6419 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.137052Z PROPS-END Revision-number: 6420 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.147742Z PROPS-END Revision-number: 6421 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.180432Z PROPS-END Revision-number: 6422 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.190941Z PROPS-END Revision-number: 6423 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.201192Z PROPS-END Revision-number: 6424 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.211601Z PROPS-END Revision-number: 6425 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 29 witter about `config-struct' K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-10-24T13:27:24.533683Z PROPS-END Node-path: putty-wishlist/data/dup-sessions-dont-close Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 452cc31f40dbc0f6ed2a33d8a0d5fa2d Text-delta-base-sha1: b07df3a13316563e408438cee2aebc3c6557a4b7 Text-content-length: 204 Text-content-md5: dfeb8d98c75f534fd3188bf7bce6b033 Text-content-sha1: 29f61d83608a0b096cff82e07bc9533bcede5117 Content-length: 204 SVN��%^9�%�9 <p> When <a href="config-struct.html">`config-struct'</a> is implemented, it might be possible to avoid passing strange handles about entirely, which might avoid this sort of problem. Revision-number: 6426 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2005-10-24T13:35:49.016380Z K 7 svn:log V 45 Ramble about a separate application + tweaks K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/multiple-connections Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df4a19ac98e4fcaaeadc9bc07b84db5c Text-delta-base-sha1: d8e82490ab499d50b23910bb46b8b86650de7a6c Text-content-length: 589 Text-content-md5: ab6672a8741d33dd57ff2e03ec5bcb29 Text-content-sha1: ce56290e883bdc17d24f2a915358b8f46c2729c4 Content-length: 589 SVN��4*�G��;Gh�jN=�2, MDI (like Firefox or kterm). <p> This would involve a fair amount of reorganisation to set up. For a startReally, the approach we'd prefer is a separate application that can swallow instances of PuTTY and provide the tabbing interface. That way, you're not necessarily restricted to just grouping PuTTY instances together; you could in principle bundle a PuTTY instance with a Notepad and a Firefox, say. (This is another way of saying that the deficiency isn't specific to PuTTY, but is a lack of flexibility in the policies of most window managers.) Revision-number: 6427 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2005-10-25T13:39:41.634041Z K 7 svn:log V 114 Summary: Terminal display freezes when saturated with input data Class: semi-bug Absent-in: 0.57 Present-in: 0.58 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/terminal-saturate-freeze Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 463 Text-content-md5: d0bca8d02e0f649d5ea218c9b57eda74 Text-content-sha1: 6ee11a29d765b62a50555b2615bbf7035e1c65af Content-length: 473 PROPS-END SVN���AAASummary: Terminal display freezes when saturated with input data Class: semi-bug Absent-in: 0.57 Present-in: 0.58 Content-type: text/x-html-body <p> Apparently the PuTTY terminal's display behaviour has changed when it's being saturated with input data. It used to update the terminal every once in a while (although not IIRC on every single bit of data), whereas now it can apparently freeze until the flow abates (but still munches lots of CPU). Revision-number: 6428 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 56 Comment explaining back->sendok() semantics from Simon. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-10-26T20:58:01.003854Z PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6c7dede4578e7a892f2081508baae0c0 Text-delta-base-sha1: 0379330267cd4868055f0dd90041885fa3b2bafe Text-content-length: 117 Text-content-md5: c5d5115bb7835027a50a233e75c47f38 Text-content-sha1: df0f17cbd8a91c1f4d1298a392fe214846107f2b Content-length: 117 SVN��  \��\�/* If back->sendok() returns FALSE, data sent to it from the frontend * may be lost. */ Revision-number: 6429 Prop-content-length: 420 Content-length: 420 K 8 svn:date V 27 2005-10-26T22:18:11.600770Z K 7 svn:log V 319 Fix an error I introduced into SSH packet logging in r5642: some outgoing packets over about 256 bytes would be logged with 12 bytes of preceding garbage. (But the rest of the packet was logged in its entirety. This holds for packets where (int(len/256)%2)==1, with an appropriate fudge factor applied to `len'.) Ahem. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: be99e8f09ed19275e92e8f029bb6ec9d Text-delta-base-sha1: 5b981e8773a259a058d4597bf6cf704b3491b0a9 Text-content-length: 417 Text-content-md5: 73b4e722446bcc64b08a1aea3a75f232 Text-content-sha1: 77a24f6969c8b4f585e318d15da1bd3dce1ef207 Content-length: 417 SVN����K� ��f;�Bwbody - pkt->data /* space for packet length + padding length */ pkt->forcepad = 0; ssh_pkt_addbyte(pkt, (unsigned char) pkt_type); pkt->body = pkt->data + pkt->length; /* after packet type */���GG�9�e_str(ssh, "Using TIS authentication.\r\n"); logevent("Received TIS c�JGG�J�= SSH2_AGENTC_SIGN_REQUEST; PUT_32BIT(s->q, s->pklen); s->q += 4; Revision-number: 6430 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.858440Z PROPS-END Revision-number: 6431 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.869128Z PROPS-END Revision-number: 6432 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:54.879607Z PROPS-END Revision-number: 6433 Prop-content-length: 251 Content-length: 251 K 8 svn:date V 27 2005-10-30T13:42:36.942566Z K 7 svn:log V 150 Add ability for ssh2_userkey_loadpub() to return the key comment. (Not actually used currently, but it makes life easier for a patch I'm working on.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 95c33a56860a02ce2801f8ffc0b032e1 Text-delta-base-sha1: c41dd4e838ea271f442b82248465d6e777d63fec Text-content-length: 30 Text-content-md5: dda0fe593eafe00992674d75a97f46f7 Text-content-sha1: 99e1529f5f7ce0e3cbcebc8790f1200c8668241b Content-length: 30 SVN�� �X��8VNULL Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73b4e722446bcc64b08a1aea3a75f232 Text-delta-base-sha1: 77a24f6969c8b4f585e318d15da1bd3dce1ef207 Text-content-length: 70 Text-content-md5: d3cc163321b45b5ce561ad7fa3815393 Text-content-sha1: f1ed8ca3e467dbe60647cdf8dd97cbaf37aeae89 Content-length: 70 SVN����������� ��1��O+� ���~->q++ , Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 359b639d1d420f3861cc6d1dea426225 Text-delta-base-sha1: 92c544075ed83658f94bcb7af0e9c19f206e4b15 Text-content-length: 46 Text-content-md5: d739b3183d33fc1158827ad88b2db1ec Text-content-sha1: fd80923eb4920bd98ec8048551c2c37497375881 Content-length: 46 SVN��! ���lhar **commentptr, Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ad55bff7df9210e3771c81313dae3b0 Text-delta-base-sha1: bf94f289a85c673dadadb5bf13cb3c18d8031d91 Text-content-length: 203 Text-content-md5: 6599ab9026481ed78447869dcdd34dbc Text-content-sha1: 536402b5a6d79ece26fec8f9d6d9c54d453d5751 Content-length: 203 SVN��4!�0��F.�?rt�AW�pDhar **commentptr, char *commentcomment = read_body(fp)) == NULL) goto error; if (commentptr) *commentptr = comment; else sfree(comment) Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ecc5b084ac3d975c9da6df65b4ed8aa Text-delta-base-sha1: 05bc774e078320012d6c08047df5892f80f33ce0 Text-content-length: 34 Text-content-md5: ea1d75d8db1978fca308845e266ea72c Text-content-sha1: 0ee2ad88cacbdfcdbe9efd070c66d1c93bed2a54 Content-length: 34 SVN�� �u��!t NULL Revision-number: 6434 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2005-10-30T15:16:42.327675Z K 7 svn:log V 77 Allow rsakey_pubblob() to return the key comment. (like r6433 but for SSH-1) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dda0fe593eafe00992674d75a97f46f7 Text-delta-base-sha1: 99e1529f5f7ce0e3cbcebc8790f1200c8668241b Text-content-length: 40 Text-content-md5: 8513ac5801246aee449fa21673910071 Text-content-sha1: e30a0a6399eb347bd87c6f9cda8e1201124e2bcb Content-length: 40 SVN��# �?��V>NULL, Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d3cc163321b45b5ce561ad7fa3815393 Text-delta-base-sha1: f1ed8ca3e467dbe60647cdf8dd97cbaf37aeae89 Text-content-length: 97 Text-content-md5: d61591af27aea8bc999d5641f0bd1d39 Text-content-sha1: 2940652b950dab50390e1f7597e6b346841188e5 Content-length: 97 SVN���� �:��:9 NULL��� �s� } c_writ�* ��eq + 4; *s Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d739b3183d33fc1158827ad88b2db1ec Text-delta-base-sha1: fd80923eb4920bd98ec8048551c2c37497375881 Text-content-length: 40 Text-content-md5: 02208dd2a31842722eb540c3eca879e6 Text-content-sha1: 90e9d09749afa2ef49281caa3ea55b097b917455 Content-length: 40 SVN��!4 �}��&{har **commentptr, Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6599ab9026481ed78447869dcdd34dbc Text-delta-base-sha1: 536402b5a6d79ece26fec8f9d6d9c54d453d5751 Text-content-length: 57 Text-content-md5: 9e5c41384499908dd1d9e1ca6800f382 Text-content-sha1: f184d7c6ff9fb4834a0fc10a27b68345ea4543a4 Content-length: 57 SVN�����!�W+har **commentptr,commentptr Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ea1d75d8db1978fca308845e266ea72c Text-delta-base-sha1: 0ee2ad88cacbdfcdbe9efd070c66d1c93bed2a54 Text-content-length: 28 Text-content-md5: 0b851911ea4fd4ae3bb2cc855fdb5260 Text-content-sha1: 12f67f2dc4e5d4b15c1ad9a2a69e39edf22a0071 Content-length: 28 SVN�� & �&��|$NULL Revision-number: 6435 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 37 Fixes to make r6434 actually useful. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-10-30T16:28:45.643413Z PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e5c41384499908dd1d9e1ca6800f382 Text-delta-base-sha1: f184d7c6ff9fb4834a0fc10a27b68345ea4543a4 Text-content-length: 161 Text-content-md5: 585c0dad9bf74479be18eb4f4d29460e Text-content-sha1: 95ffcb7b0dc05c27e9df277e89526ea2f5fe5ad5 Content-length: 161 SVN��>�d���VEdupstr(comment); if (key) key->comment = comment; else sfree(comment); if (pub_only) { ret = 1; goto end; } Revision-number: 6436 Prop-content-length: 291 Content-length: 291 K 7 svn:log V 190 In Unix PuTTYgen, existing SSH-1 key comments were coming out as "(null)" for operations not performing decryption (e.g., "puttygen rsa1.ppk -L") (A use for r6434 -- wasn't expecting that.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-10-30T19:13:43.010360Z PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8513ac5801246aee449fa21673910071 Text-delta-base-sha1: e30a0a6399eb347bd87c6f9cda8e1201124e2bcb Text-content-length: 75 Text-content-md5: 2c349bec603e547f9adb581606fe42bc Text-content-sha1: 7ac1d38cc49b10231c4e6e82f2e916c81ad3ff74 Content-length: 75 SVN��#:*�>��:M� &origcomment,dupstr(origcomment) Revision-number: 6437 Prop-content-length: 1241 Content-length: 1241 K 8 svn:date V 27 2005-10-30T20:24:09.474934Z K 7 svn:log V 1139 Revamp SSH authentication code so that user interaction is more abstracted out; replace loops structured around a single interaction per loop with less tortuous code (fixes: `ki-multiprompt-crash', `ssh1-bad-passphrase-crash'; makes `ssh2-password-expiry' and `proxy-password-prompt' easier). The new interaction abstraction has a lot of fields that are unused in the current code (things like window captions); this is groundwork for `gui-auth'. However, ssh.c still writes directly to stderr; that may want to be fixed. In the GUI apps, user interaction is moved to terminal.c. This should make it easier to fix things like UTF-8 username entry, although I haven't attempted to do so. Also, control character filtering can be tailored to be appropriate for individual front-ends; so far I don't promise anything other than not having made it any worse. I've tried to test this fairly exhaustively (although Mac stuff is untested, as usual). It all seems to basically work, but I bet there are new bugs. (One I know about is that you can no longer make the PuTTY window go away with a ^D at the password prompt; this should be fixed.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c349bec603e547f9adb581606fe42bc Text-delta-base-sha1: 7ac1d38cc49b10231c4e6e82f2e916c81ad3ff74 Text-content-length: 2023 Text-content-md5: d2966f437f8a418f6ee2c1b73adb38b0 Text-content-sha1: 3caf9ac39fa7dcb7a073999efd422009b874e67e Content-length: 2023 SVN��:c'2�!�+�`<�X9�W+F�9userpass_input() are replaced with the * diagnostic function below, so that I can run tests in an * automated manner and provide their interactive passphrase * userpass_input console_get_userpass_input_diagnostic int nprompts, promptsgot; const char *prompts[3]; int console_get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { size_t i; int ret = 1; for (i = 0; i < p->n_prompts; i++) { if (promptsgot < nprompts) { assert(strlen(prompts[promptsgot]) < p->prompts[i]->result_len); strcpy(p->prompts[i]->result, prompts[promptsgot++]); } else { promptsgot++; /* track number of requests anyway */ ret = 0; } } return ret;rompts_t *p = new_prompts(NULL); int ret; p->to_server = FALSE; p->name = dupstr("SSH key passphrase"); add_prompt(p, dupstr("Enter passphrase to load key: "), FALSE, 512); ret = console_get_userpass_input(p, NULL, 0); assert(ret >= 0); if (!ret) { free_prompts(p); perror("puttygen: unable to read passphrase"); return 1; } else { passphrase = dupstr(p->prompts[0]->result); free_prompts(p)prompts_t *p = new_prompts(NULL); int ret; p->to_server = FALSE; p->name = dupstr("New SSH key passphrase"); add_prompt(p, dupstr("Enter passphrase to save key: "), FALSE, 512); add_prompt(p, dupstr("Re-enter passphrase to verify: "), FALSE, 512); ret = console_get_userpass_input(p, NULL, 0); assert(ret >= 0); if (!ret) { free_prompts(p); perror("puttygen: unable to read new passphrase"); return 1; } else { if (strcmp(p->prompts[0]->result, p->prompts[1]->result)) { free_prompts(p); fprintf(stderr, "puttygen: passphrases do not match\n"); return 1; } if (passphrase) { memset(passphrase, 0, strlen(passphrase)); sfree(passphrase); } passphrase = dupstr(p->prompts[0]->result); free_prompts(p); if (!*passphrase) { sfree(passphrase); passphrase = NULL; } Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ba46604bd6cd367df2739886b5ee140f Text-delta-base-sha1: a335df6663a56032b755fc5a1282ed7f03d004c3 Text-content-length: 1027 Text-content-md5: ef7570ad6d35ee3bc8df6678b29ec5fd Text-content-sha1: 2f1d78ddecb408653a6e79cbe2b705047c625e19 Content-length: 1027 SVN��,jf�P�f�9�0|static char *cmdline_password = NULL; /* * Similar interface to get_userpass_input(), except that here a -1 * return means that we aren't capable of processing the prompt and * someone else should do it. */ int cmdline_get_passwd_input(prompts_t *p, unsigned char *in, int inlen) { static int tried_once = 0; /* * We only handle prompts which don't echo (which we assume to be * passwords), and (currently) we only cope with a password prompt * that comes in a prompt-set on its own. */ if (!cmdline_password || in || p->n_prompts != 1 || p->prompts[0]->echo) { return -1; } /* * If we've tried once, return utter failure (no more passwords left * to try). */ if (tried_once) return 0; strncpy(p->prompts[0]->result, cmdline_password, p->prompts[0]->result_len); p->prompts[0]->result[p->prompts[0]->result_len-1] = '\0'; memset(cmdline_password, 0, strlen(cmdline_password)); tried_once = 1; return 1; Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e4281ecd536a5f77be5ace5e2780a85 Text-delta-base-sha1: 7d87832f75bba70705a8c25f1378a1982fc2c286 Text-content-length: 179 Text-content-md5: be1334d7419c65e0769d08dc4f7284d9 Text-content-sha1: fd6175f321042f19215886cf0193927374e1a60b Content-length: 179 SVN��u �(��Vint get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { Session *s = p->frontend; return term_get_userpass_input(s->term, p, in, in Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f8bc145548be89b9e295e2745058106e Text-delta-base-sha1: 1efdde122885396ce0be86c8e185f3956f1e7657 Text-content-length: 239 Text-content-md5: 73ed8358a2a90e770364cce19585c710 Text-content-sha1: db52faf47c360494685ecc57a483fcde4835d3d7 Content-length: 239 SVN��wOS�I�S�3Dint get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { SessionWindow *win = (SessionWindow *)p->frontend; Terminal *term = [win term]; return term_get_userpass_input(term, p, in, inlen) Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db0ba663daede7cdff6e794eb7f7a513 Text-delta-base-sha1: 8e53bf14a8ed365f09e9b4a5031a2101e1502125 Text-content-length: 1053 Text-content-md5: 443400729bc8f428fd84edc6b94eff21 Text-content-sha1: 5c6a8c90671e044d9ab7c9823e28c96f37822bd6 Content-length: 1053 SVN��$*���R/�=gprompts_t *new_prompts(void *frontend) { prompts_t *p = snew(prompts_t); p->prompts = NULL; p->n_prompts = 0; p->frontend = frontend; p->data = NULL; p->to_server = TRUE; /* to be on the safe side */ p->name = p->instruction = NULL; p->name_reqd = p->instr_reqd = FALSE; return p; } void add_prompt(prompts_t *p, char *promptstr, int echo, size_t len) { prompt_t *pr = snew(prompt_t); unsigned char *result = snewn(len, unsigned char); pr->prompt = promptstr; pr->echo = echo; pr->result = result; pr->result_len = len; p->n_prompts++; p->prompts = sresize(p->prompts, p->n_prompts, prompt_t *); p->prompts[p->n_prompts-1] = pr; } void free_prompts(prompts_t *p) { size_t i; for (i=0; i < p->n_prompts; i++) { prompt_t *pr = p->prompts[i]; memset(pr->result, 0, pr->result_len); /* burn the evidence */ sfree(pr->result); sfree(pr->prompt); sfree(pr); } sfree(p->prompts); sfree(p->name); sfree(p->instruction); sfree(p) Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f38e22fc14ae7dc7eec7046fb084c58 Text-delta-base-sha1: 5fc92f1214af175d5f1dd02407d2a3a2db15b925 Text-content-length: 337 Text-content-md5: 489554e15234f9c91f5617d49c687df6 Text-content-sha1: 0b759298fc219f40e4a8ffe14791c0441b5a7e11 Content-length: 337 SVN��!0�n�0�4k�OEint from_backend_untrusted(void *frontend_handle, const char *data, int len) { /* * No "untrusted" output should get here (the way the code is * currently, it's all diverted by FLAG_STDERR). */ assert(!"Unexpected call to from_backend_untrusted()"); return 0; /* not reached */ Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e25c6bc10f9fc6c262027dd342e9fae Text-delta-base-sha1: 1e9261beba98bc254dc1099c76893c75b7686e54 Text-content-length: 903 Text-content-md5: 145e48c899db7802dedfa7aabdd1759c Text-content-sha1: 5497cad5a44524aca7a4b2b64f30225cc23d0e75 Content-length: 903 SVN��4\�h�,�a0�:�(nfrom_backend_untrusted(void *frontend_handle, const char *data, int len) { /* * No "untrusted" output should get here (the way the code is * currently, it's all diverted by FLAG_STDERR). */ assert(!"Unexpected call to from_backend_untrusted()"); return 0; /* not reached */ /* FIXME: leave this to ssh.c? */ int ret; prompts_t *p = new_prompts(NULL); p->to_server = TRUE; p->name = dupstr("SSH login name"); add_prompt(p, dupstr("login as: "), TRUE, lenof(cfg.username)); ret = get_userpass_input(p, NULL, 0); assert(ret >= 0); if (!ret) { free_prompts(p); fprintf(stderr, "psftp: no username, aborting\n"); cleanup_exit(1); } else { memcpy(cfg.username, p->prompts[0]->result, lenof(cfg.username)); free_prompts(p) Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5d5115bb7835027a50a233e75c47f38 Text-delta-base-sha1: df0f17cbd8a91c1f4d1298a392fe214846107f2b Text-content-length: 2719 Text-content-md5: 34e5bcc1fe87909c2d219dcde1977047 Text-content-sha1: 76596816e529a2cfb94f62660f46ab486c542ec8 Content-length: 2719 SVN��[EL��"�p�xZq�hO�6]�HL�qE�a$H�_"Mechanism for getting text strings such as usernames and passwords * from the front-end. * The fields are mostly modelled after SSH's keyboard-interactive auth. * FIXME We should probably mandate a character set/encoding (probably UTF-8). * * Since many of the pieces of text involved may be chosen by the server, * the caller must take care to ensure that the server can't spoof locally- * generated prompts such as key passphrase prompts. Some ground rules: * - If the front-end needs to truncate a string, it should lop off the * end. * - The front-end should filter out any dangerous characters and * generally not trust the strings. (But \n is required to behave * vaguely sensibly, at least in `instruction', and ideally in * `prompt[]' too.) */ typedef struct { char *prompt; int echo; char *result; /* allocated/freed by caller */ size_t result_len; } prompt_t; typedef struct { /* * Indicates whether the information entered is to be used locally * (for instance a key passphrase prompt), or is destined for the wire. * This is a hint only; the front-end is at liberty not to use this * information (so the caller should ensure that the supplied text is * sufficient). */ int to_server; char *name; /* Short description, perhaps for dialog box title */ int name_reqd; /* Display of `name' required or optional? */ char *instruction; /* Long description, maybe with embedded newlines */ int instr_reqd; /* Display of `instruction' required or optional? */ size_t n_prompts; prompt_t **prompts; void *frontend; void *data; /* slot for housekeeping data, managed by * get_userpass_input(); initially NULL */ } prompts_t; prompts_t *new_prompts(void *frontend); void add_prompt(prompts_t *p, char *promptstr, int echo, size_t len); /* Burn the evidence. (Assumes _all_ strings want free()ing.) */ void free_prompts(prompts_t *p);int from_backend_untrusted(void *frontend/* * >0 = `got all results, carry on' * 0 = `user cancelled' (FIXME distinguish "give up entirely" and "next auth"?) * <0 = `please call back later with more in/inlen' */ int get_userpass_input(prompts_t *p, unsigned char *in, int inlenint term_data_untrusted(Terminal *int term_get_userpass_input(Terminal *term, prompts_t *p, unsigned char *in, int inlen */ frontends (wincons.c, uxcons.c) * that aren't equivalents to things in windlg.c et al. */ extern int console_batch_mode; int console_get_userpass_input(prompts_t *p, unsigned char *in, int inlenint cmdline_get_passwd_input(prompts_t *p, unsigned char *in, int inlen) Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d61591af27aea8bc999d5641f0bd1d39 Text-delta-base-sha1: 2940652b950dab50390e1f7597e6b346841188e5 Text-content-length: 24475 Text-content-md5: 313b179a3b3b6c858a2433c2a86e8c3d Text-content-sha1: 5c21580b7079022dc1d7ccc0f7c4d2fadb70cee5 Content-length: 24475 SVN����OR�O�Z�UM�AZ� k�d D�R.D�QD�NR�<)V�[m$/* Maximum length of passwords/passphrases (arbitrary) */ #define SSH_MAX_PASSWORD_LEN 100_stderr(int trusted, const char *buf, int len) { int i; for (i = 0; i < len; i++) if (buf[i] != '\r' && (trusted || buf[i] & 0x60)) fputc(buf[i], stderr); } static void c_write(Ssh ssh, const char *buf, int len) { if (flags & FLAG_STDERR) c_write_stderr(1, buf, len); else from_backend(ssh->frontend, 1, buf, len); } static void c_write_untrusted(Ssh ssh, const char *buf, int len) { if (flags & FLAG_STDERR) c_write_stderr(0, buf, len); else from_backend_untrusted(ssh->frontend, buf, len);*publickey_comment; int publickey_encrypted; prompts_t *cur_prompt /* FIXME eh? */ { if (!*ssh->cfg.username) { int ret; /* need not be kept over crReturn */ s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = TRUE; s->cur_prompt->name = dupstr("SSH login name"); add_prompt(s->cur_prompt, dupstr("login as: "), TRUE, lenof(s->username)); ret = get_userpass_input(s->cur_prompt, NULL, 0); while (ret < 0) { ssh->send_ok = 1; crWaitUntil(!pktin); ret = get_userpass_input(s->cur_prompt, in, inlen); ssh->send_ok = 0; } if (!ret) { /* * Failed to get a username. Terminate. */ free_prompts(s->cur_prompt); ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE); crStop(0); } memcpy(s->username, s->cur_prompt->prompts[0]->result, lenof(s->username)); free_prompts(s->cur_prompt);*userlog = dupprintf(c_write_str(ssh, userlog); c_write_str(ssh, "\r\n"); } sfree(userlog); * Load the public half of any configured keyfile for later use. */ if (!filename_is_null(ssh->cfg.keyfile)) { int keytype; logeventf(ssh, "Reading private key file \"%.150s\"", filename_to_str(&ssh->cfg.keyfile)); keytype = key_type(&ssh->cfg.keyfile); if (keytype == SSH_KEYTYPE_SSH1) { const char *error; if (rsakey_pubblob(&ssh->cfg.keyfile, &s->publickey_blob, &s->publickey_bloblen, &s->publickey_comment, &error)) { s->publickey_encrypted = rsakey_encrypted(&ssh->cfg.keyfile, NULL); } else { char *msgbuf; logeventf(ssh, "Unable to load private key (%s)", error); msgbuf = dupprintf("Unable to load private key file " "\"%.150s\" (%s)\r\n", filename_to_str(&ssh->cfg.keyfile), error); c_write_str(ssh, msgbuf); sfree(msgbuf); s->publickey_blob = NULL; } } else { char *msgbuf; logeventf(ssh, "Unable to use this key file (%s)", key_type_to_str(keytype)); msgbuf = dupprintf("Unable to use key file \"%.150s\"" " (%s)\r\n", filename_to_str(&ssh->cfg.keyfile), key_type_to_str(keytype)); c_write_str(ssh, msgbuf); sfree(msgbuf); s->publickey_blob = NULL; }s->publickey_blob && !s->tried_publickey) { /* * Try public key authentication with the specified * key file. */ int got_passphrase; /* need not be kept over crReturn */ if (flags & FLAG_VERBOSE) c_write_str(ssh, "Trying public key authentication.\r\n"); logeventf(ssh, "Trying public key \"%s\"", filename_to_str(&ssh->cfg.keyfile)); s->tried_publickey = 1; got_passphrase = FALSE; while (!got_passphrase) { /* * Get a passphrase, if necessary. */ char *passphrase = NULL; /* only written after crReturn */ const char *error; if (!s->publickey_encrypted) { if (flags & FLAG_VERBOSE) c_write_str(ssh, "No passphrase required.\r\n"); passphrase = NULL; } else { int ret; /* need not be kept over crReturn */ s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = FALSE; s->cur_prompt->name = dupstr("SSH key passphrase"); add_prompt(s->cur_prompt, dupprintf("Passphrase for key \"%.100s\": ", s->publickey_comment), FALSE, SSH_MAX_PASSWORD_LEN); ret = get_userpass_input(s->cur_prompt, NULL, 0); while (ret < 0) { ssh->send_ok = 1; crWaitUntil(!pktin); ret = get_userpass_input(s->cur_prompt, in, inlen); ssh->send_ok = 0; } if (!ret) { /* Failed to get a passphrase. Terminate. */ free_prompts(s->cur_prompt); ssh_disconnect(ssh, NULL, "Unable to authenticate", 0, TRUE); crStop(0); } passphrase = dupstr(s->cur_prompt->prompts[0]->result); free_prompts(s->cur_prompt); } /* * Try decrypting key with passphrase. */ ret = loadrsakey(&ssh->cfg���[g�l/�Or/�L �^*h�Eg�&*�Z�v8�B)�ACd�xg�RW;��Ui�`F�$#�T �=I���U2g�D+.keyfile, &s->key, passphrase, &error); if (passphrase) { memset(passphrase, 0, strlen(passphrase)); sfree(passphrase); } if (ret == 1) { /* Correct passphrase. */ got_passphrase = TRUE; } else got_passphrase = FALSE; break; /* go and try something else */ } else if (ret == -1) { c_write_str(ssh, "Wrong passphrase.\r\n"); /* FIXME */ s->tried_publickey = 0; got_passphrase = FALSE; /* and try again */ } } if (got_passphrase) { /* * Send a public key attempt. */ send_packet(ssh, SSH1_CMSG_AUTH_RSA, PKT_BIGNUM, s->key.modulus, PKT_END); crWaitUntil(pktin); if (pktin->type == SSH1_SMSG_FAILURE) { c_write_str(ssh, "Server refused our public key.\r\n"); continue; /* go and try password */ } if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) { bombout(("Bizarre response to offer of public key")); crStop(0); } { int i; unsigned char buffer[32]; Bignum challenge, response; if ((challenge = ssh1_pkt_getmp(pktin)) == NULL) { bombout(("Server's RSA challenge was badly formatted")); crStop(0); } response = rsadecrypt(challenge, &s->key); freebn(s->key.private_exponent);/* burn the evidence */ for (i = 0; i < 32; i++) { buffer[i] = bignum_byte(response, 31 - i); } MD5Init(&md5c); MD5Update(&md5c, buffer, 32); MD5Update(&md5c, s->session_id, 16); MD5Final(buffer, &md5c); send_packet(ssh, SSH1_CMSG_AUTH_RSA_RESPONSE, PKT_DATA, buffer, 16, PKT_END); freebn(challenge); freebn(response); } crWaitUntil(pktin); if (pktin->type == SSH1_SMSG_FAILURE) { if (flags & FLAG_VERBOSE) c_write_str(ssh, "Failed to authenticate with" " our public key.\r\n"); continue; /* go and try password */ } else if (pktin->type != SSH1_SMSG_SUCCESS) { bombout(("Bizarre response to RSA authentication response")); crStop(0); } break; /* we're through! */ } } /* * Otherwise, try various forms of password-like authentication. */ s->cur_prompt = new_prompts(ssh->frontend); TIS)) && !s->tis_auth_refused) { s->pwpkt_type = SSH1_CMSG_AUTH_TIS_RESPONSE; logevent("Requested TIS authentication"); send_packet(ssh, SSH1_CMSG_AUTH_TISTIS_CHALLENGE) { logevent("TIS authentication declined"); if (flags & FLAG_INTERACTIVE) c_write_str(ssh, "TIS authentication refused.\r\n"); s->tis_auth_refused = 1; continue; } else { char *challenge; int challengelen; char *instr_suf, *promptTIS challenge packet was badly formed")); crStop(0); } logevent("Received TIS challenge"); s->cur_prompt->to_server = TRUE; s->cur_prompt->name = dupstr("SSH TIS authentication"); /* Prompt heuristic comes from OpenSSH */ if (memchr(challenge, '\n', challengelen)) { instr_suf = dupstr(""); prompt = dupprintf("%.*s", challengelen, challenge); } else { instr_suf = dupprintf("%.*s", challengelen, challenge); prompt = dupstr("Response: "); } s->cur_prompt->instruction = dupprintf("Using TIS authentication.%s%s", (*instr_suf) ? "\n" : "", instr_suf); s->cur_prompt->instr_reqd = TRUE; add_prompt(s->cur_prompt, prompt, FALSE, SSH_MAX_PASSWORD_LEN); sfree(instr_suf) char *instr_suf, *promptlogevent("Received CryptoCard challenge"); s->cur_prompt->to_server = TRUE; s->cur_prompt->name = dupstr("SSH CryptoCard authentication"); s->cur_prompt->name_reqd = FALSE; /* Prompt heuristic comes from OpenSSH */ if (memchr(challenge, '\n', challengelen)) { instr_suf = dupstr(""); prompt = dupprintf("%.*s", challengelen, challenge); } else { instr_suf = dupprintf("%.*s", challengelen, challenge); prompt = dupstr("Response: "); } s->cur_prompt->instruction = dupprintf("Using CryptoCard authentication.%s%s", (*instr_suf) ? "\n" : "", instr_suf); s->cur_prompt->instr_reqd = TRUE; add_prompt(s->cur_prompt, prompt, FALSE, SSH_MAX_PASSWORD_LEN); sfree(instr_suf); } } if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { s->cur_prompt->to_server = TRUE; s->cur_prompt->name = dupstr("SSH password"); add_prompt(s->cur_prompt, dupprintf("%.90s@%.90s's password: ", s->username, ssh->savedhost), FALSE, SSH_MAX_PASSWORD_LEN{ int ret; /* need not be kept over crReturn */ ret = get_userpass_input(s->cur_prompt, NULL, 0); while (ret < 0) { ssh->send_ok = 1; crWaitUntil(!pktin); ret = get_userpass_input(s->cur_prompt, in, inlen); ssh->send_ok = 0; } if (!ret) { /* * Ffree_prompts(s->cur_prompt); ssh_disconnect(ssh, NULL, "Unable to authenticate", 0, TRUE); crStop(0); } } if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { /* * Defence against traffic analysis: we send a * whole bunch of packets containing strings of * different lengths. One of these strings is the * password, in a SSH1_CMSG_AUTH_PASSWORD packet. * The others are all random data in * SSH1_MSG_IGNORE packets. This way a passive * listener can't tell which is the password, and * hence can't deduce the password length. * * Anybody with a password length greater than 16 * bytes is going to have enough entropy in their * password that a listener won't find it _that_ * much help to know how long it is. So what we'll * do is: * * - if password length < 16, we send 15 packets * containing string lengths 1 through 15 * * - otherwise, we let N be the nearest multiple * of 8 below the password length, and send 8 * packets containing string lengths N through * N+7. This won't obscure the order of * magnitude of the password length, but it will * introduce a bit of extra uncertainty. * * A few servers (the old 1.2.18 through 1.2.22) * can't deal with SSH1_MSG_IGNORE. For these * servers, we need an alternative defence. We make * use of the fact that the password is interpreted * as a C string: so we can append a NUL, then some * random data. * * One server (a Cisco one) can deal with neither * SSH1_MSG_IGNORE _nor_ a padded password string. * For this server we are left with no defences * against password length sniffing. */ if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) { /* * The server can deal with SSH1_MSG_IGNORE, so * we can use the primary defence. */ int bottom, top, pwlen, i; char *randomstr; pwlen = strlen(s->cur_prompt->prompts[0]->result); if (pwlen < 16) { bottom = 0; /* zero length passwords are OK! :-) */ top = 15; } else { bottom = pwlen & ~7; top = bottom + 7; } assert(pwlen >= bottom && pwlen <= top); randomstr = snewn(top + 1, char); for (i = bottom; i <= top; i++) { if (i == pwlen) { defer_packet(ssh, s->pwpkt_type, PKTT_PASSWORD, PKT_STR, s->cur_prompt->prompts[0]->result, PKTT_OTHER, PKT_END); } else { for (j = 0; j < i; j++) { do { randomstr[j] = random_byte(); } while (randomstr[j] == '\0'); } randomstr[i] = '\0'; defer_packet(ssh, SSH1_MSG_IGNORE, PKT_STR, randomstr, PKT_END); } } logevent("Sending password with camouflage packets"); ssh_pkt_defersend(ssh); sfree(randomstr); } /* * The server can't deal with SSH1_MSG_IGNORE * but can deal with padded passwords, so we * can use the secondary defence. */ char string[64]; char *ss; int len; len = strlen(s->cur_prompt->prompts[0]->result); if (len < sizeof(string)) { ss = string; strcpy(string, s->cur_prompt->prompts[0]->result); len++; /* cover the zero byte */ while (len < sizeof(string)) { string[len++] = (char) random_byte(); } } else { ss = s->cur_prompt->prompts[0]->result; } logevent("Sending length-padded password"); send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD, PKT_INT, len, PKT_DATA, ss, len, PKTT_OTHER, PKT_END); } else { /* * The server has _both_ * BUG_CHOKES_ON_SSH1_IGNORE and * BUG_NEEDS_SSH1_PLAIN_PASSWORD. There is * therefore nothing we can do. */ int len; len = strlen(s->cur_prompt->prompts[0]->result); logevent("Sending unpadded password"); send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD, PKT_INT, len, PKT_DATA, s->cur_prompt->prompts[0]->result, len, PKTT_OTHER, PKT_END); } } else { send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD, PKT_STR, s->cur_prompt->prompts[0]->result, PKTT_OTHER, PKT_END); } logevent("Sent password"); free_prompts(s->cur_prompt/* Clear up */ if (s->publickey_blob) { sfree(s->publickey_blob); sfree(s->publickey_comment);efused; int we_are_in; prompts_t *cur_prompt; int num_prompts; char username[100]; int got_username; void *publickey_blob; int publickey_bloblen; int publickey_encrypted; char *publickey_algorithm; char *publickey_commentMisc one-time setup for authentication. */ s->publickey_blob = NULL; if (!s->we_are_in) { /* * Load the public half of any configured public key file * for later use. const char *error; s->publickey_blob = ssh2_userkey_loadpub(&ssh->cfg.keyfile, &s->publickey_algorithm, &s->publickey_bloblen, &s->publickey_comment, &error); if (s->publickey_blob) { s->publickey_encrypted = ssh2_userkey_encrypted(&ssh->cfg.keyfile, NULL); } else { char *msgbuf; logeventf(ssh, "Unable to load private key (%s)", error); msgbuf = dupprintf("Unable to load private key file " "\"%.150s\" (%s)\r\n", filename_to_str(&ssh->cfg.keyfile), error); c_write_str(ssh, msgbuf); sfree(msgbuf); } nt ret; /* need not be kept over crReturn */ s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = TRUE; s->cur_prompt->name = dupstr("SSH login name"); add_prompt(s->cur_prompt, dupstr("login as: "), TRUE, lenof(s->username)); ret = get_userpass_input(s->cur_prompt, NULL, 0); while (ret < 0) { ssh->send_ok = 1; crWaitUntilV(!pktin); ret = get_userpass_input(s->cur_prompt, in, inlen); ssh->send_ok = 0; } if (!ret) { /* * get_userpass_input() failed to get a username. * Terminate. */ free_prompts(s->cur_prompt); ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE); crStopV; } memcpy(s->username, s->cur_prompt->prompts[0]->result, lenof(s->username)); free_prompts(s->cur_prompt)efused = FALSEsh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; if (s->can_pubkey && agent_exists() && !s->tried_agent) { �*sI!�Z|�d�K�J6�!� =�d:�h.$�r{�m��?s�r>�,x� R�wV.�B3�v".�I7�f1�>H��/qi�@jout, TRUE); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen); s->siglen = s->pktout->length - 5 + 4 + ssh->v2_session_id_len; s->siglen -= 4; s->len = 1; /* message type */ s->len += 4 + s->pklen; /* key blob */ s->len += 4 + s->siglen; /* data to sign */ s->len += 4; /* flags */ s->agentreq = snewn(4 + s->len, char); PUT_32BIT(s->agentreq, s->len); s->q = s->agentr } else if (s->can_pubkey && s->publickey_blob && !s->tried_pubkey_config) { struct ssh2_userkey *key; /* not live over crReturn */ char *passphrase; /* not live over crReturn */PUBLICKEY; s->tried_pubkey_config = TRUE /* service requested */ ssh2_pkt_addstring(s->pktout, "publickey"); /* method */ ssh2_pkt_addbool(s->pktout, FALSE); /* no signature included */ ssh2_pkt_addstring(s->pktout, s->publickey_algorithm); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, (char *)s->publickey_blob, s->publickey_bloblen); ssh2_pkt_send(ssh, s->pktout); logevent("Offered public key"); crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_USERAUTH_PK_OK) { /* Key refused. Give up. */ s->gotit = TRUE; /* reconsider message next loop */ s->type = AUTH_TYPE_PUBLICKEY_OFFER_LOUD; continue; /* process this new message */ } s->method = AUTH_PUBLICKEY_FILE; logevent("Offer of public key accepted"); /* * Actually attempt a serious authentication using * the key. */ if (flags & FLAG_VERBOSE) { c_write_str(ssh, "Authenticating with public key \""); c_write_str(ssh, s->publickey_comment); c_write_str(ssh, "\"\r\n"); } key = NULL; while (!key) { const char *error; /* not live over crReturn */ if (s->publickey_encrypted) { /* * Get a passphrase from the user. */ int ret; /* need not be kept over crReturn */ s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = FALSE; s->cur_prompt->name = dupstr("SSH key passphrase"); add_prompt(s->cur_prompt, dupprintf("Passphrase for key \"%.100s\": ", s->publickey_comment), FALSE, SSH_MAX_PASSWORD_LEN); ret = get_userpass_input(s->cur_prompt, NULL, 0); while (ret < 0) { ssh->send_ok = 1; crWaitUntilV(!pktin); ret = get_userpass_input(s->cur_prompt, in, inlen); ssh->send_ok = 0; } if (!ret) { /* Failed to get a passphrase. Terminate. */ free_prompts(s->cur_prompt); ssh_disconnect(ssh, NULL, "Unable to authenticate", SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER, TRUE); crStopV; } passphrase = dupstr(s->cur_prompt->prompts[0]->result); free_prompts(s->cur_prompt); } else { passphrase = NULL; /* no passphrase needed */ } /* * Try decrypting the key. */ key = ssh2_load_userkey(&ssh->cfg.keyfile, passphrase, &error); if (passphrase) { /* burn the evidence */ memset(passphrase, 0, strlen(passphrase)); sfree(passphrase); } if (key == SSH2_WRONG_PASSPHRASE || key == NULL) { if (passphrase && (key == SSH2_WRONG_PASSPHRASE)) { c_write_str(ssh, "Wrong passphrase\r\n"); key = NULL; /* and loop again */ } else { c_write_str(ssh, "Unable to load private key ("); c_write_str(ssh, error); c_write_str(ssh, ")\r\n"); key = NULL; break; /* try something else */ } } } if (key) /* service requested */ ssh2_pkt_addstring(s->pktout, "publickey"); /* method */ ssh2_pkt_addbool(s->pktout, TRUE); /* signature follows */ ssh2_pkt_addstring(s->pktout, key->alg->name); pkblob = key->alg->public_blob(key->data, if (ssh->remote_bugs & BUG_SSH2_PK_SESSIONID) sigdata_len -= 4; sigdata = snewn(sigdata_len, unsigned char); p = 0; if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) { PUT_32BIT(sigdata+p, ssh->v2_session_id_len); p += 4; p += s->pktout->length - 5; } else if (s->can_keyb_inter && !s->kbd_inter_refused) { /* * Keyboard-interactive authentication. */ char *name, *inst, *lang; int name_len, inst_len, lang_len; int i; /* service requested */ ssh2_pkt_addstring(s->pktout, "keyboard-interactive"); /* method */ ssh2_pkt_addstring(s->pktout, ""); /* lang */ ssh2_pkt_addstring(s->pktout, ""); /* submethods *//* Server is not willing to do keyboard-interactive * at all. Give up on it entirely. */ s->gotit = TRUE; if (pktin->type == SSH2_MSG_USERAUTH_FAILURE) /* * We've got a fresh USERAUTH_INFO_REQUEST. * Get the preamble and start building a prompt. */ ssh_pkt_getstring(pktin, &name, &name_len); ssh_pkt_getstring(pktin, &inst, &inst_len); ssh_pkt_getstring(pktin, &lang, &lang_len); s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = TRUE; if (name_len) { /* FIXME: better prefix to distinguish from * local prompts? */ s->cur_prompt->name = dupprintf("SSH server: %.*s", name_len, name); s->cur_prompt->name_reqd = TRUE; } else { s->cur_prompt->name = dupstr("SSH server authentication"); s->cur_prompt->name_reqd = FALSE; } s->cur_prompt->instruction = dupprintf("Using keyboard-interactive authentication.%s%.*s", inst_len ? "\n" : "", inst_len, inst); s->cur_prompt->instr_reqd = TRUE; /* * Get the prompts from the packet. */ s->num_prompts = ssh_pkt_getuint32(pktin); for (i = 0; i < s->num_prompts; i++) { char *prompt; int prompt_len; int echo; static char noprompt[] = "<server failed to send prompt>: "; ssh_pkt_getstring(pktin, &prompt, &prompt_len); echo = ssh2_pkt_getbool(pktin); if (!prompt_len) { prompt = noprompt; prompt_len = lenof(noprompt)-1; } add_prompt(s->cur_prompt, dupprintf("%.*s", prompt_len, prompt), echo, SSH_MAX_PASSWORD_LEN); } /* * Get the user's responses. */ if (s->num_prompts) { int ret; /* not live over crReturn */ ret = get_userpass_input(s->cur_prompt, NULL, 0); while (ret < 0) { ssh->send_ok = 1; crWaitUntilV(!pktin); ret = get_userpass_input(s->cur_prompt, in, inlen); ssh->send_ok = 0; } if (!ret) { /* * Failed to get responses. Terminate. */ free_prompts(s->cur_prompt);TRUE); crStopV; } } /* * Send the responses to the server. */ s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_INFO_RESPONSE); s->pktout->forcepad = 256; ssh2_pkt_adduint32(s->pktout, s->num_prompts); for (i=0; i < s->num_prompts; i++) { dont_log_password(ssh, s->pktout, PKTLOG_BLANK); ssh2_pkt_addstring(s->pktout, s->cur_prompt->prompts[i]->result); end_log_omission(ssh, s->pktout); } ssh2_pkt_send(ssh, s->pktout); s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE; /*FIXME?*/ } else if (s->can_passwd) { /* * Plain old password authentication. */ int ret; /* not live over crReturn */ s->method = AUTH_PASSWORD;PASSWORD; s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = TRUE; s->cur_prompt->name = dupstr("SSH password"); add_prompt(s->cur_prompt, dupprintf("%.90s@%.90s's password: ", s->username, ssh->savedhost), FALSE, SSH_MAX_PASSWORD_LEN); ret = get_userpass_input(s->cur_prompt, NULL, 0); while (ret < 0) { ssh->send_ok = 1; crWaitUntilV(!pktin); ret = get_userpass_input(s->cur_prompt, in, inlen); ssh->send_ok = 0; } if (!ret) { /* * Failed to get responses. Terminate. */ free_prompts(s->cur_prompt); ssh_disconnect(ssh, NULL, "Unable to authenticate", SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER, TRUE); crStopV; } /* * Send the password packet. s->cur_prompt->prompts[0]->result); free_prompts(s->cur_prompt /*FIXME?*/ } else { } } } ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = NULL; /* Clear up various bits and pieces from authentication. */ if (s->publickey_blob) { sfree(s->publickey_blob); sfree(s->publickey_comment); } Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e090a145c7dd98b0ad5334d522e448c Text-delta-base-sha1: 27d9c6e729656477fa85e80af58e8eac329b907c Text-content-length: 3536 Text-content-md5: 1fc8c29c2b9fdf14fe539646c27a497f Text-content-sha1: 35a29754ae14f244a4c35b3ca2392761e6afd8a4 Content-length: 3536 SVN���������`!��i�T 8/* * Write untrusted data to the terminal. * The only control character that should be honoured is \n (which * will behave as a CRLF). */ int term_data_untrusted(Terminal *term, const char *data, int len) { int i; /* FIXME: more sophisticated checking? */ for (i = 0; i < len; i++) { if (data[i] == '\n') term_data(term, 1, "\r\n", 2); else if (data[i] & 0x60) term_data(term, 1, data + i, 1); } return 0; /* assumes that term_data() always returns 0 */ struct term_userpass_state { size_t curr_prompt; int done_prompt; /* printed out prompt yet? */ size_t pos; /* cursor position */ }; /* * Process some terminal data in the course of username/password * input. */ int term_get_userpass_input(Terminal *term, prompts_t *p, unsigned char *in, int inlen) { struct term_userpass_state *s = (struct term_userpass_state *)p->data; if (!s) { /* * First call. Set some stuff up. */ p->data = s = snew(struct term_userpass_state); s->curr_prompt = 0; s->done_prompt = 0; /* We only print the `name' caption if we have to... */ if (p->name_reqd && p->name) { size_t l = strlen(p->name); term_data_untrusted(term, p->name, l); if (p->name[l-1] != '\n') term_data_untrusted(term, "\n", 1); } /* ...but we always print any `instruction'. */ if (p->instruction) { size_t l = strlen(p->instruction); term_data_untrusted(term, p->instruction, l); if (p->instruction[l-1] != '\n') term_data_untrusted(term, "\n", 1); } /* * Zero all the results, in case we abort half-way through. */ { int i; for (i = 0; i < p->n_prompts; i++) memset(p->prompts[i]->result, 0, p->prompts[i]->result_len); } } while (s->curr_prompt < p->n_prompts) { prompt_t *pr = p->prompts[s->curr_prompt]; int finished_prompt = 0; if (!s->done_prompt) { term_data_untrusted(term, pr->prompt, strlen(pr->prompt)); s->done_prompt = 1; s->pos = 0; } /* Breaking out here ensures that the prompt is printed even * if we're now waiting for user data. */ if (!in || !inlen) break; /* FIXME: should we be using local-line-editing code instead? */ while (!finished_prompt && inlen) { char c = *in++; inlen--; switch (c) { case 10: case 13: term_data(term, 0, "\r\n", 2); pr->result[s->pos] = '\0'; pr->result[pr->result_len - 1] = '\0'; /* go to next prompt, if any */ s->curr_prompt++; s->done_prompt = 0; finished_prompt = 1; /* break out */ break; case 8: case 127: if (s->pos > 0) { if (pr->echo) term_data(term, 0, "\b \b", 3); s->pos--; } break; case 21: case 27: while (s->pos > 0) { if (pr->echo) term_data(term, 0, "\b \b", 3); s->pos--; } break; case 3: case 4: /* Immediate abort. */ term_data(term, 0, "\r\n", 2); sfree(s); return 0; /* user abort */ default: /* * This simplistic check for printability is disabled * when we're doing password input, because some people * have control characters in their passwords. */ if ((!pr->echo || (c >= ' ' && c <= '~') || ((unsigned char) c >= 160)) && s->pos < pr->result_len - 1) { pr->result[s->pos++] = c; if (pr->echo) term_data(term, 0, &c, 1); } break; } } } if (s->curr_prompt < p->n_prompts) { return -1; /* more data required */ } else { sfree(s); return +1; /* all done */ } } Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c66b3a60ccf2700054804f524f4fe04b Text-delta-base-sha1: 23d84b03b3e4cac535bcf273b376312c01b185d3 Text-content-length: 931 Text-content-md5: ed934471d41d58381dd714908b7ff2f7 Text-content-sha1: a59c3a005a66a35eecc9add0da7a891be5cdb12d Content-length: 931 SVN�����]�D�A@Q�MXint from_backend_untrusted(void *frontend, const char *data, int lenreturn term_data_untrusted(inst->term, data, len); } int get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { struct gui_data *inst = (struct gui_data *)p->frontend; int ret; ret = cmdline_get_passwd_input(p, in, inlen); if (ret == -1) ret = term_get_userpass_input(inst->term, p, in, inlen); return ret�n[[�� *menuitem; char *s; extern const int use_event_log, new_session, saved_sessions; inst->menu = gtk_menu_new(); #define MKMENUITEM(title, func) do { \ menuitem = title ? gtk_menu_item_new_with_label(title) : \ gtk_menu_item_new(); \ gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \ gtk_widget_show(menuitem); \ if (func != NULL) \ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \ GTK_SIGNAL_FUNC(func), inst); \ } while (0) Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b24c54b2e70a8074cc19714b57e3e05c Text-delta-base-sha1: 6b57e1629d59f746d1e4a695de48ed77d60d9a31 Text-content-length: 1617 Text-content-md5: 88c006a97a5264d5ed6e6e28bcaa78b7 Text-content-sha1: 981c9d2cb8701addb4684d3bb6a327a5c007d4c8 Content-length: 1617 SVN��-H2�<��iv"�q<static void console_data_untrusted(const char *data, int len) { int i; for (i = 0; i < len; i++) if ((data[i] & 0x60) || (data[i] == '\n')) fputc(data[i], stdout); fflush(stdout); } int console_get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { size_t curr_prompt; /* * Zero all the results, in case we abort half-way through. */ { int i; for (i = 0; i < p->n_prompts; i++) memset(p->prompts[i]->result, 0, p->prompts[i]->result_len); } if (console_batch_mode) return 0; /* * Preamble. */ /* We only print the `name' caption if we have to... */ if (p->name_reqd && p->name) { size_t l = strlen(p->name); console_data_untrusted(p->name, l); if (p->name[l-1] != '\n') console_data_untrusted("\n", 1); } /* ...but we always print any `instruction'. */ if (p->instruction) { size_t l = strlen(p->instruction); console_data_untrusted(p->instruction, l); if (p->instruction[l-1] != '\n') console_data_untrusted("\n", 1); } for (curr_prompt = 0; curr_prompt < p->n_prompts; curr_prompt++) { struct termios oldmode, newmode; int i; prompt_t *pr = p->prompts[curr_prompt]; tcgetattr(0, &oldmode); newmode = oldmode; newmode.c_lflag |= ISIG | ICANON; if (!pr->echoconsole_data_untrusted(pr->prompt, strlen(pr->prompt)); i = read(0, pr->result, pr->result_len - 1); tcsetattr(0, TCSANOW, &oldmode); if (i > 0 && pr->result[i-1] == '\n') i--; pr->result[i] = '\0'; if (!pr->echo) fputs("\n", stdout); } return 1; /* success */ Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b2c59bf201f8b4ba095fdef3bc04bd5f Text-delta-base-sha1: 81ec60e63eec35a8938dd31a4a5d88958cd67c65 Text-content-length: 553 Text-content-md5: bf44949b2e6a067423d96ce193abb71b Text-content-sha1: e4e562f99b73c079d52d6b19dede7ebef4256cc7 Content-length: 553 SVN��C, �W� �R�3int from_backend_untrusted(void *frontend_handle, const char *data, int len) { /* * No "untrusted" output should get here (the way the code is * currently, it's all diverted by FLAG_STDERR). */ assert(!"Unexpected call to from_backend_untrusted()"); return 0; /* not reached */ } int get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { int ret; ret = cmdline_get_passwd_input(p, in, inlen); if (ret == -1) ret = console_get_userpass_input(p, in, inlen); return ret Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1640151bcbf7ffaa996fc2511e9b6ccb Text-delta-base-sha1: 24914f11255cbbe938a23ccd5c1b643d5985e1c2 Text-content-length: 240 Text-content-md5: f72a60f163ecb19d8c68f041f6bf4273 Text-content-sha1: a948e477703fcfcaebd08dc3f82bf1d881954c43 Content-length: 240 SVN��r X�c�X�7`int get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { int ret; ret = cmdline_get_passwd_input(p, in, inlen); if (ret == -1) ret = console_get_userpass_input(p, in, inlen); return ret; Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d041bd634b02caef7094bb698298006 Text-delta-base-sha1: b9b2c61afe5ffa3c029d93adef9bef7878bdb21f Text-content-length: 2011 Text-content-md5: c3d22ed7072c64a9b8e3c91554fa8086 Text-content-sha1: ce9688d6de9d2f5c503807160122aface33e83a5 Content-length: 2011 SVN��E"=�y�:�p>�|Istatic void console_data_untrusted(HANDLE hout, const char *data, int len) { DWORD dummy; /* FIXME: control-character filtering */ WriteFile(hout, data, len, &dummy, NULL); } int console_get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { HANDLE hin, hout; size_t curr_prompt; /* * Zero all the results, in case we abort half-way through. */ { int i; for (i = 0; i < p->n_prompts; i++) memset(p->prompts[i]->result, 0, p->prompts[i]->result_len); } if (console_batch_mode) return 0; hin = GetStdHandle(STD_INPUT_HANDLE); hout = GetStdHandle(STD_OUTPUT_HANDLE); if (hin == INVALID_HANDLE_VALUE || hout == INVALID_HANDLE_VALUE) { fprintf(stderr, "Cannot get standard input/output handles\n"); cleanup_exit(1); } /* * Preamble. */ /* We only print the `name' caption if we have to... */ if (p->name_reqd && p->name) { size_t l = strlen(p->name); console_data_untrusted(hout, p->name, l); if (p->name[l-1] != '\n') console_data_untrusted(hout, "\n", 1); } /* ...but we always print any `instruction'. */ if (p->instruction) { size_t l = strlen(p->instruction); console_data_untrusted(hout, p->instruction, l); if (p->instruction[l-1] != '\n') console_data_untrusted(hout, "\n", 1); } for (curr_prompt = 0; curr_prompt < p->n_prompts; curr_prompt++) { DWORD savemode, newmode, i = 0; prompt_t *pr = p->prompts[curr_prompt]; BOOL r; GetConsoleMode(hin, &savemode); newmode = savemode | ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT; if (!pr->echoconsole_data_untrusted(hout, pr->prompt, strlen(pr->prompt)); r = ReadFile(hin, pr->result, pr->result_len - 1, &i, NULL); SetConsoleMode(hin, savemode); if ((int) i > pr->result_len) i = pr->result_len - 1; else i = i - 2; pr->result[i] = '\0'; if (!pr->echo) { DWORD dummy; WriteFile(hout, "\r\n", 2, &dummy, NULL); } } return 1; /* success */ Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ccb0fb93b0643c379280ea223e40e9ae Text-delta-base-sha1: 642a9ed2a0e219c746a0deeb636f222b47e932c1 Text-content-length: 385 Text-content-md5: 1cd5816dc1cad7b6081f6ad447bf1cb3 Text-content-sha1: a673277eead45c0028106a29fb3df9aeb8f730c3 Content-length: 385 SVN���������\U�/�U�X*int from_backend_untrusted(void *frontend, const char *data, int len) { return term_data_untrusted(term, data, len); } int get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { int ret; ret = cmdline_get_passwd_input(p, in, inlen); if (ret == -1) ret = term_get_userpass_input(term, p, in, inlen); return ret Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 16dc375adbe5b5b990f23e99643d4a1d Text-delta-base-sha1: ad5dea930f34d40d7902554ffaa3847da7ffaa43 Text-content-length: 553 Text-content-md5: 9c0478ba3afc00a374e5d8e4f07d69e0 Text-content-sha1: ebe6799c43be820fbfc2565334f6dcc46d68daca Content-length: 553 SVN��0 �� �V�& int from_backend_untrusted(void *frontend_handle, const char *data, int len) { /* * No "untrusted" output should get here (the way the code is * currently, it's all diverted by FLAG_STDERR). */ assert(!"Unexpected call to from_backend_untrusted()"); return 0; /* not reached */ } int get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { int ret; ret = cmdline_get_passwd_input(p, in, inlen); if (ret == -1) ret = console_get_userpass_input(p, in, inlen); return ret Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0430ff347d7b28abf26348b723d653d5 Text-delta-base-sha1: d497a7bbf18217b3599ab8d6186fdba354f15a82 Text-content-length: 244 Text-content-md5: b1796700ebc623ebd823433485edfbef Text-content-sha1: 3c7c85598c81e28a6ef2b87a76607236640aec63 Content-length: 244 SVN��U0V�X�V�R�0%int get_userpass_input(prompts_t *p, unsigned char *in, int inlen) { int ret; ret = cmdline_get_passwd_input(p, in, inlen); if (ret == -1) ret = console_get_userpass_input(p, in, inlen); return ret Node-path: putty-wishlist/data/ki-multiprompt-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a56cd5f62d1cd838d32a0e16fe6dbc4 Text-delta-base-sha1: b573e4ef28a74ad572dcd0cffe2173d01f4405d0 Text-content-length: 303 Text-content-md5: be692b31862b3c387e4b0317c6217d83 Text-content-sha1: 1c28b23e7721f92a906c1fd26931b97491bca511 Content-length: 303 SVN��`x �#��?!Fixed-in: 2005-10-3 <p> <em>Update, 2005-10-31:</em> I believe this should now be fixed, but I don't have convenient access to any SSH servers which have this property to verify that. If you have been seeing this problem, please try a snapshot and let us know whether it works. Node-path: putty-wishlist/data/ssh1-bad-passphrase-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c584dd0ef573eb9361ee0d519c2b4f6f Text-delta-base-sha1: 8aee6d857ccf9699803de21ac76aaabc7f29d62c Text-content-length: 41 Text-content-md5: 59b45d85936cc97704f61497a2f6ddd1 Text-content-sha1: ee32cbffcf786be2dda3c54070d0eba25e57075f Content-length: 41 SVN�� � ��} Fixed-in: 2005-10-31 Revision-number: 6438 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2005-10-30T20:28:26.612559Z K 7 svn:log V 21 Note effect of r6437 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b87cbe3aeca257ca02568b8b64c4f822 Text-delta-base-sha1: 8af726d2fe0b118bd1fb5278c30ec0add25464bd Text-content-length: 157 Text-content-md5: 201ed8a5805fc81d433ebb31035b1e42 Text-content-sha1: aa95fbf1982821c0175d8ad90c914bd6d4d9afa3 Content-length: 157 SVN��)3 �)� <p> <em>Update, 2005-10-31:</em> the disruptive changes alluded to above have finally been made (r6437), so this should now be feasible. Revision-number: 6439 Prop-content-length: 126 Content-length: 126 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-10-30T20:31:28.428187Z K 7 svn:log V 26 Improve Summary slightly. PROPS-END Node-path: putty-wishlist/data/ssh2-ctr-modes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2a25d09ca7e81a8fd9df4b4cbafc9693 Text-delta-base-sha1: ac6f1938ccfbc669c84c69d2212fce67f01a3b09 Text-content-length: 41 Text-content-md5: b3ef7ac7525fc056da099fb560cd4406 Text-content-sha1: a63c1cf1b2305a31b15ab9fcdcae339058075fb3 Content-length: 41 SVN���Summary: SSH-2 CTR cipher Revision-number: 6440 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 2005-10-30T20:33:51.197741Z K 7 svn:log V 9 typo, lk K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/arcfour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3642fb91390b2d92cd35869fcbe263ba Text-delta-base-sha1: 4ab33b49b2f9047681e1f6b580920b63e13b390f Text-content-length: 82 Text-content-md5: ac96bb441c6872df84fcc3e3fb80475f Text-content-sha1: 5007b5781b56c3d10c393cd811bc881371bf17fc Content-length: 82 SVN��In7�j��Rk�{Nb<a href="ssh2-cbc-weakness.html">ssh2-cbc-weakness</a> Revision-number: 6441 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2005-10-31T14:03:38.110732Z K 7 svn:log V 23 Fix confirmed, hurrah. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ki-multiprompt-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: be692b31862b3c387e4b0317c6217d83 Text-delta-base-sha1: 1c28b23e7721f92a906c1fd26931b97491bca511 Text-content-length: 58 Text-content-md5: eae377f1ebd273fb2b3e17051be9fcb7 Text-content-sha1: 6b6285d9785f04a0b25856e9cdaea702e91551d2 Content-length: 58 SVN��xe*�;�and we've had one report confirming that. Revision-number: 6442 Prop-content-length: 224 Content-length: 224 K 8 svn:date V 27 2005-10-31T22:43:51.373663Z K 7 svn:log V 123 (do_ssh2_authconn_state).method is redundant since r6427; remove. Remove FIXMEs from .type assignments, as they look fine. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 313b179a3b3b6c858a2433c2a86e8c3d Text-delta-base-sha1: 5c21580b7079022dc1d7ccc0f7c4d2fadb70cee5 Text-content-length: 141 Text-content-md5: b47bc6ef0bf397b5e28e913392948e71 Text-content-sha1: 0612fd903b9a0b2932825d6a6af104114b6cc48b Content-length: 141 SVN����������� �r��p�sjout, TRUE);�sv#&�~�>�J@� s� �V*�h type = AUTH_TYPE_KEYBOARD_INTERACTIVE; Revision-number: 6443 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2005-11-02T00:00:13.339309Z K 7 svn:log V 40 putty.mirror.jt.org putty.citytower.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0804322990b031806d1dac018df19fe2 Text-delta-base-sha1: d443c8372a6c034db40fc11d6b298f96be3833eb Text-content-length: 173 Text-content-md5: ef5a754b66341a515af480da789aff3f Text-content-sha1: 607864ccbf1dcaa8d35a1a3b1592227edfc5cccc Content-length: 173 SVN��w�S��\o�Xs�Xs�Rs�D=citytower.com/">putty.citytowermirror.jt.org/">putty.mirror.jt.orginternoc.nl/">putty.internoc.nlnedmirror.nl/">putty.nedmirror.nl Revision-number: 6444 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2005-11-02T23:15:43.274092Z K 7 svn:log V 96 When a userpass interaction has finished, make sure the 'prompts' structure is safe for re-use. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1fc8c29c2b9fdf14fe539646c27a497f Text-delta-base-sha1: 35a29754ae14f244a4c35b3ca2392761e6afd8a4 Text-content-length: 74 Text-content-md5: 910cfa93810e831f148509d1250d1381 Text-content-sha1: a92e25223e03b11efbd9a399319ccae5c36f0d0b Content-length: 74 SVN���������(�1��6-%`p->data = NULLp->data = NULL Revision-number: 6445 Prop-content-length: 209 Content-length: 209 K 8 svn:date V 27 2005-11-04T14:49:22.217660Z K 7 svn:log V 108 Fix for `ssh2-password-expiry'. Success case tested. (Much easier since r6437, and actually works to boot.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b47bc6ef0bf397b5e28e913392948e71 Text-delta-base-sha1: 0612fd903b9a0b2932825d6a6af104114b6cc48b Text-content-length: 3961 Text-content-md5: 7c793a921de598f5e93c686044c411a1 Text-content-sha1: 17f0090ca78518eed26a0a614945e22336dd15a3 Content-length: 3961 SVN�����������<�$��[!�[.�jchar *password" "type %d",tring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen); s->siglen = s->pktout->length - 5 + 4 + ssh->v2_session_id_len;�vF2��h%�q~8�Tn� }�/D�C~l�o8l�qlr�[2 �i int changereq_first_time; /* * Squirrel away the password. (We may need it later if * asked to change it.) */ s->password = dupstr(s->cur_prompt->prompts[0]->result); free_prompts(s->cur_prompt); s->password /* * Wait for next packet, in case it's a password change * request. */ crWaitUntilV(pktin); changereq_first_time = TRUE; while (pktin->type == SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ) { /* * We're being asked for a new password * (perhaps not for the first time). * Loop until the server accepts it. */ int got_new = FALSE; /* not live over crReturn */ char *prompt; /* not live over crReturn */ int prompt_len; /* not live over crReturn */ { char *msg; if (changereq_first_time) msg = "Server requested password change"; else msg = "Server rejected new password"; logevent(msg); c_write_str(ssh, msg); c_write_str(ssh, "\r\n"); } ssh_pkt_getstring(pktin, &prompt, &prompt_len); s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = TRUE; s->cur_prompt->name = dupstr("New SSH password"); s->cur_prompt->instruction = dupprintf("%.*s", prompt_len, prompt); s->cur_prompt->instr_reqd = TRUE; add_prompt(s->cur_prompt, dupstr("Enter new password: "), FALSE, SSH_MAX_PASSWORD_LEN); add_prompt(s->cur_prompt, dupstr("Confirm new password: "), FALSE, SSH_MAX_PASSWORD_LEN); /* * Loop until the user manages to enter the same * password twice. */ while (!got_new) { * Failed to get responses. Terminate. */ /* burn the evidence */ free_prompts(s->cur_prompt); memset(s->password, 0, strlen(s->password)); sfree(s->password); ssh_disconnect(ssh, NULL, /* * Check the two passwords match. */ got_new = (strcmp(s->cur_prompt->prompts[0]->result, s->cur_prompt->prompts[1]->result) == 0); if (!got_new) /* They don't. Silly user. */ c_write_str(ssh, "Passwords do not match\r\n"); } /* * Send the new password (along with the old one). * (see above for padding rationale) */ s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); s->pktout->forcepad = 256 /* service requested */ ssh2_pkt_addstring(s->pktout, "password"); ssh2_pkt_addbool(s->pktout, TRUE); s->password); ssh2_pkt_addstring(s->pktout, s->cur_prompt->prompts[0]->result); free_prompts(s->cur_prompt); end_log_omission(ssh, s->pktout); ssh2_pkt_send(ssh, s->pktout); logevent("Sent new password"); /* * Now see what the server has to say about it. * (If it's CHANGEREQ again, it's not happy with the * new password.) */ crWaitUntilV(pktin); changereq_first_time = FALSE; } /* * We need to reexamine the current pktin at the top * of the loop. Either: * - we weren't asked to change password at all, in * which case it's a SUCCESS or FAILURE with the * usual meaning * - we sent a new password, and the server was * either OK with it (SUCCESS or FAILURE w/partial * success) or unhappy with the _old_ password * (FAILURE w/o partial success) * In any of these cases, we go back to the top of * the loop and start again. */ s->gotit = TRUE; /* * We don't need the old password any more, in any * case. Burn the evidence. */ memset(s->password, 0, strlen(s->password)); sfree(s->password) Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 201ed8a5805fc81d433ebb31035b1e42 Text-delta-base-sha1: aa95fbf1982821c0175d8ad90c914bd6d4d9afa3 Text-content-length: 356 Text-content-md5: 591d8dc84262ac71949c0996e036afc4 Text-content-sha1: 660ffca3719a956f006a09d44ed4ffc5c95792fb Content-length: 356 SVN��3rD���=x�m?2Fixed-in: r6445 2005-11-05riginally we weren't aware of any SSH servers which sent this message. The following have since come to light: <ul> <li><li>VanDyke's Windows server (according to a message on IETF secsh) <li>ssh.com on OpenVMS </ul> <p> <em>Update, 2005-11-05:</em> this is now implemented, and partially tested. Revision-number: 6446 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2005-11-04T23:21:42.561357Z K 7 svn:log V 106 Placate a compiler warning introduced in r6437. (I forgot we usually compile with -Werror on Unix, oops.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7c793a921de598f5e93c686044c411a1 Text-delta-base-sha1: 17f0090ca78518eed26a0a614945e22336dd15a3 Text-content-length: 193 Text-content-md5: c5717450029ca71342a2b1f60856f8b5 Text-content-sha1: 3ecf5cc3081318033c76cb283f5147192e035f34 Content-length: 193 SVN����������� A�O�A�pK else { assert(0 && "unexpected return from loadrsakey()");�WEE��->siglen = s->pktout->length - 5 + 4 + ssh->v2_session_id_len; Revision-number: 6447 Prop-content-length: 136 Content-length: 136 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-11-04T23:31:11.074506Z K 7 svn:log V 36 Fix minor hiccup in SSH-1 p-k auth. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5717450029ca71342a2b1f60856f8b5 Text-delta-base-sha1: 3ecf5cc3081318033c76cb283f5147192e035f34 Text-content-length: 114 Text-content-md5: da23e5681bf689eb6088e0bb2a1fd15f Text-content-sha1: 2c55e2072e8d8d5e4f5777ebd8fba1427b738d32 Content-length: 114 SVN�����������.�|��B�"d�rsomething elsesomething else->siglen = s->pkto�WE��E Revision-number: 6448 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 2005-11-05T11:56:38.860700Z K 7 svn:log V 161 Stop slandering OpenSSH, at their request :-) (I'm pretty sure the previous wording was accurate for _some_ versions of OpenSSH, but they've been hard at work.) K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b9f42fb4633716439ccf073aec60a2b Text-delta-base-sha1: 9f7c887443a88cacb08175149977e2e4be9ed7d8 Text-content-length: 76 Text-content-md5: 8ae8009e330655e36c315ad0e95fca23 Text-content-sha1: d3fc0090da5130dc51feb7559991ef0046f76078 Content-length: 76 SVN��|w 4�4��m (some servers don't bother) you can still have the Revision-number: 6449 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:58.259469Z PROPS-END Revision-number: 6450 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:58.274561Z PROPS-END Revision-number: 6451 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2005-11-09T23:19:33.084213Z K 7 svn:log V 136 I broke the ability to cope with multiple consecutive k-i INFO_REQUESTS in r6437. This ought to be better (but I can't test that case). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da23e5681bf689eb6088e0bb2a1fd15f Text-delta-base-sha1: 2c55e2072e8d8d5e4f5777ebd8fba1427b738d32 Text-content-length: 2793 Text-content-md5: 5625a3d14fb2a29d873ecb94b9b56132 Text-content-sha1: b922625a7a58628c9f4ae5b247f8f4a9df205f68 Content-length: 2793 SVN����������������E),���%Hf�4nm�/Y��"�}H (or, bizarrely but legally, accepts the * user without actually issuing any prompts). *Loop while the server continues to send INFO_REQUESTs. */ while (pktin->type == SSH2_MSG_USERAUTH_INFO_REQUEST) { char *name, *inst, *lang; int name_len, inst_len, lang_len; int i; /* * We've got a fresh USERAUTH_INFO_REQUEST. * Get the preamble and start building a prompt. */ ssh_pkt_getstring(pktin, &name, &name_len); ssh_pkt_getstring(pktin, &inst, &inst_len); ssh_pkt_getstring(pktin, &lang, &lang_len); s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = TRUE; if (name_len) { /* FIXME: better prefix to distinguish from * local prompts? */ s->cur_prompt->name = dupprintf("SSH server: %.*s", name_len, name); s->cur_prompt->name_reqd = TRUE; } else { s->cur_prompt->name = dupstr("SSH server authentication"); s->cur_prompt->name_reqd = FALSE; } /* FIXME: ugly to print "Using..." in prompt _every_ * time round. Can this be done more subtly? */ s->cur_prompt->instruction = dupprintf("Using keyboard-interactive authentication.%s%.*s", inst_len ? "\n" : "", inst_len, inst); s->cur_prompt->instr_reqd = TRUE; /* * Get the prompts from the packet. */ s->num_prompts = ssh_pkt_getuint32(pktin); for (i = 0; i < s->num_prompts; i++) { char *prompt; int prompt_len; int echo; static char noprompt[] = "<server failed to send prompt>: "; ssh_pkt_getstring(pktin, &prompt, &prompt_len); echo = ssh2_pkt_getbool(pktin); if (!prompt_len) { prompt = noprompt; prompt_len = lenof(noprompt)-1; } add_prompt(s->cur_prompt, dupprintf("%.*s", prompt_len, prompt), echo, SSH_MAX_PASSWORD_LEN); } /* * Get the user's responses. */ if (s->num_prompts) { int ret; /* not live over crReturn */free_prompts(s->cur_prompt } /* * Send the responses to the server. */ s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_INFO_RESPONSE); s->pktout->forcepad = 256; ssh2_pkt_adduint32(s->pktout, s->num_prompts); for (i=0; i < s->num_prompts; i++) { dont_log_password(ssh, s->pktout, PKTLOG_BLANK); ssh2_pkt_addstring(s->pktout, s->cur_prompt->prompts[i]->result); end_log_omission(ssh, s->pktout); } ssh2_pkt_send(ssh, s->pktout); /* * Get the next packet in case it's another * INFO_REQUEST. */ crWaitUntilV(pktin); } /* * We should have SUCCESS or FAILURE now. */ s->gotit = TRU Revision-number: 6452 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:58.572855Z PROPS-END Revision-number: 6453 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:58.585797Z PROPS-END Revision-number: 6454 Prop-content-length: 167 Content-length: 167 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-11-13T12:13:09.852889Z K 7 svn:log V 67 Oops, used \I where I meant \i. I think this is the only instance. PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 71159464ff4c31a5734680b8298950b7 Text-delta-base-sha1: 2be21f22491ca10099095e72e976b274cebba958 Text-content-length: 43 Text-content-md5: 1f529bbef8a4dcd5d9e6dc88b57727ad Text-content-sha1: 9f74f59952d25f9f25427046904697eba48b76b0 Content-length: 43 SVN���� �0��O1i�ZZ��Z� Revision-number: 6455 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:59.074214Z PROPS-END Revision-number: 6456 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:59.085641Z PROPS-END Revision-number: 6457 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:59.098529Z PROPS-END Revision-number: 6458 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:59.152173Z PROPS-END Revision-number: 6459 Prop-content-length: 674 Content-length: 674 K 8 svn:date V 27 2005-11-13T16:06:41.428042Z K 7 svn:log V 573 r6437 broke the case where Pageant is running but contains no SSH-2 keys that the SSH-2 server is happy with. Fixed, and since I'm here, fix `pubkeyfile-and-pageant' as well (for SSH-1 and SSH-2). Also, in SSH-2, we now reexamine "methods that can continue" for every Pageant key offer, which is technically more correct although it seems unlikely that it was causing any real problems. (It's not entirely pretty, but neither was the old code. We could probably do with some sort of abstraction for public/private keys to avoid carting lots of fiddly bits of data around.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1f529bbef8a4dcd5d9e6dc88b57727ad Text-delta-base-sha1: 9f74f59952d25f9f25427046904697eba48b76b0 Text-content-length: 543 Text-content-md5: a7e4f4d1437c2b27d5f93b9d1641821c Text-content-sha1: 1a3bacbd868486fc98997614f050aac4fb15eed2 Content-length: 543 SVN����v�h�v�"eIf a key file is specified here, and \i{Pageant} is running (see \k{pageant}), PuTTY will first try asking Pageant to authenticate with that key, and ignore any other keys Pageant may have. If that fails, PuTTY will ask for a passphrase as normal�ZSyy�Z�.) You can add or modify a mode by selecting it from the drop-down list, choosing whether it's set automatically or to a specific value with the radio buttons and edit box, and hitting \q{Add}. A mode (or several) can be removed from the list by se Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 87c36b5167e9240396c5ee797e447b50 Text-delta-base-sha1: e6bad18b73b06e91e7a11342d8ca2eab6a28e800 Text-content-length: 666 Text-content-md5: 438aaff2af288c11c4709ade13212b8c Text-content-sha1: d03aafd4c092c6c2489b53c04c3c69e219817f59 Content-length: 666 SVN��"|�c��F�n�l6protocol error This can easily happen if you are using Pageant and have a large number of keys loaded into it, since these servers count each offer of a public key as an authentication attempt. This can be worked around by specifying the key that's required for the authentication in the PuTTY configuration (see \k{config-ssh-privkey}; PuTTY will ignore any other keys Pageant may have, but will ask Pageant to do the authentication, so that you don't have to type your passphrase. On the server, this can be worked around by disabling public-key authentication or (for Sun SSH only) by increasing \c{MaxAuthTries} in \c{sshd_config} Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5625a3d14fb2a29d873ecb94b9b56132 Text-delta-base-sha1: b922625a7a58628c9f4ae5b247f8f4a9df205f68 Text-content-length: 7163 Text-content-md5: 73c6cd7bfbd6c1200d74f16a0d65e572 Text-content-sha1: b1462acb61833e210c16169e81375d7d997342cf Content-length: 7163 SVN����^��� _�b�T-unsigned char *pkblob = s->p;if (s->publickey_blob) { if (!memcmp(pkblob, s->publickey_blob, s->publickey_bloblen)) { logeventf(ssh, "Pageant key #%d matches " "configured key file", s->keyi); s->tried_publickey = 1; } else /* Skip non-configured key */ continue; } logeventf(ssh, "Trying Pageant key #%d", s->keyi); if (s->publickey_blob && !s->tried_publickey) logevent("Configured key file not in Pageant"���O�b��!gu�oR�rQ�:*�X7:�C�~G��6xj�X4IULL, "Unable to authenticate", 0, TRUE); crStop(0); } passphrase = dupstr(s->cur_prompt->prompts[0]->result); free_prompts(s->cur_prompt); } /* * Try decrypting key with passphrase. */ ret = loadrsakey(&ssh->cfgdoneagent_request[5], *agent_response, *agentp; int agent_responselen; unsigned char *pkblob_in_agent; int keyi, nkeys Arrange to be able to deal with any BANNERs that come in. * (We do this now as packets may come in during the next bit.) */ /* * Find out about any keys Pageant has (but if there's a * public key configured, filter out all others). */ s->nkeys = 0; s->agent_response = NULL; s->pkblob_in_agent = NULL; if (agent_exists()) { void *r; logevent("Pageant is running. Requesting keys."); /* Request the keys held by the agent. */ PUT_32BIT(s->agent_request, 1); s->agent_request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; if (!agent_query(s->agent_request, 5, &r, &s->agent_responselen, ssh_agent_callback, ssh)) { do { crReturnVagent response")); crStopV; } } while (pktin || inlen > 0); r = ssh->agent_response; s->agent_responselen = ssh->agent_response_len; } s->agent_response = (unsigned char *) r; if (s->agent_response && s->agent_responselen >= 5 && s->agent_response[4] == SSH2_AGENT_IDENTITIES_ANSWER) { int keyi; unsigned char *p; p = s->agent_response + 5; s->nkeys = GET_32BIT(p); p += 4; logeventf(ssh, "Pageant has %d SSH-2 keys", s->nkeys); if (s->publickey_blob) { /* See if configured key is in agent. */ for (keyi = 0; keyi < s->nkeys; keyi++) { s->pklen = GET_32BIT(p); if (s->pklen == s->publickey_bloblen && !memcmp(p+4, s->publickey_blob, s->publickey_bloblen)) { logeventf(ssh, "Pageant key #%d matches " "configured key file", keyi); s->keyi = keyi; s->pkblob_in_agent = p; break; } p += 4 + s->pklen; p += GET_32BIT(p) + 4; /* comment */ } if (!s->pkblob_in_agent) { logevent("Configured key file not in Pageant"); s->nkeys = 0; } }kbd_inter_refused = FALSE; /* Reset agent request state. */ s->done_agent = FALSE; if (s->agent_response) { if (s->pkblob_in_agent) { s->agentp = s->pkblob_in_agent; } else { s->agentp = s->agent_response + 5 + 4; s->keyi = 0; } }!s->done_agent && s->nkeys) { /* * Attempt public-key authentication using a key from Pageant. */logeventf(ssh, "Trying Pageant key #%d", s->keyi); /* Unpack key from agent response */ s->pklen = GET_32BIT(s->agentp); s->agentp += 4; s->pkblob = (char *)s->agentp; s->agentp += s->pklen; s->alglen = GET_32BIT(s->pkblob); s->alg = s->pkblob + 4; s->commentlen = GET_32BIT(s->agentp); s->agentp += 4; s->commentp = (char *)s->agentp; s->agentp += s->commentlen; /* s->agentp now points at next key, if any */ /* See if server will accept it */ s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pk�)r$W*�7;�PvU�u\"�_ �@it_addstring(s->pktout, "ssh-connection"); /* service requested */ ssh2_pkt_addstring(s->pktout, "publickey"); /* method */ ssh2_pkt_addbool(s->pktout, FALSE); /* no signature included */ ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen); ssh2_pkt_send(ssh, s->pktout); s->type = AUTH_TYPE_PUBLICKEY_OFFER_QUIET; crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_USERAUTH_PK_OK) { /* Offer of key refused. */ s->gotit = TRUE; } else { void *vret; if (flags & FLAG_VERBOSE) { c_write_str(ssh, "Authenticating with " "public key \""); c_write(ssh, s->commentp, s->commentlen); c_write_str(ssh, "\" from agent\r\n"); } /* * Server is willing to accept the key. * Construct a SIGN_REQUEST /* method */ ssh2_pkt_addbool(s->pktout, TRUE); /* signature included */ ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen); /* Ask agent for signature. */ s->sig->siglen -= 4; s->len = 1; /* message type */ s->len += 4 + s->pklen; /* key blob */ s->len += 4 + s->siglen; /* data to sign */ s->len += 4; /* flags */ s->agentreq = snewn(4 + s->len, char); PUT_32BIT(s->agentreq, s->len); s->q = s->agentreq + 4; *s->q++ = SSH2_AGENTC_SIGN_REQUEST; PUT_32BIT(s->q, s->pklen); s->q += 4; memcpy(s->q, s->pkblob, s->pklen); s->q += s->pklen; PUT_32BIT(s->q, s->siglen); s->q += 4; /* Now the data to be signed... */ if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) { PUT_32BIT(s->q, ssh->v2_session_id_len); s->q += 4; } memcpy(s->q, ssh->v2_session_id, ssh->v2_session_id_len); s->q += ssh->v2_session_id_len; memcpy(s->q, s->pktout->data + 5, s->pktout->length - 5); s->q += s->pktout->length - 5; /* And finally the (zero) flags word. */ PUT_32BIT(s->q, 0); if (!agent_query(s->agentreq, s->len + 4, &vret, &s->retlen, ssh_agent_callback, ssh)) { do { crReturnV; if (pktin) { bombout(("Unexpected data from server" " while waiting for agent" " response")); crStopV; } } while (pktin || inlen > 0); vret = ssh->agent_response; s->retlen = ssh->agent_response_len; } s->ret = vret; sfree(s->agentreq); if (s->ret) { if (s->ret[4] == SSH2_AGENT_SIGN_RESPONSE) { logevent("Sending Pageant's response"); ssh2_add_sigblob(ssh, s->pktout, s->pkblob, s->pklen, s->ret + 9, GET_32BIT(s->ret + 5)); ssh2_pkt_send(ssh, s->pktout); s->type = AUTH_TYPE_PUBLICKEY; } else { /* FIXME: less drastic response */ bombout(("Pageant failed to answer challenge")); crStopV; } } } /* Do we have any keys left to try? */ if (s->pkblob_in_agent) { s->done_agent = TRUE; s->tried_pubkey_config = TRUE; } else { s->keyi++; if (s->keyi >= s->nkeys) s->done_agent = TRUE; } if (s->agent_response) sfree(s->agent_response); Node-path: putty-wishlist/data/pubkeyfile-and-pageant Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d3f954100eee76e14e1c5169c302cf13 Text-delta-base-sha1: 935390114bd00be2ef98805519dc3671507d203c Text-content-length: 631 Text-content-md5: 6cb4fbdbed4f748da159ddfbbf24cc20 Text-content-sha1: 3dc4609b3b1faabaf7a9f16f1b569f3e8ece8cf7 Content-length: 631 SVN��%*]�~��O=CFixed-in: r6459 2005-11-14 Content-type: text/x-html-body <p> When Pageant is running and a keypair is explicitly specified (via <code>-i</code>, configuration or whatever), PuTTY will try authenticating with all the keys in Pageant regardless. This isn't ideal for various reasons the <a href="http://www.tartarus.org/~simon/puttydoc/Chapter10.html#errors-toomanyauth">errors chapter</a> of the PuTTY manual. <p> <em>Update, 2005-11-14:</em> If Pageant is running and a keyfile is specified, PuTTY will now only try Pageant authentication with that key; it will ignore any other keys Pageant may have. Revision-number: 6460 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2005-11-13T21:56:23.810320Z K 7 svn:log V 35 + putty.triplemind.com | ayush.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef5a754b66341a515af480da789aff3f Text-delta-base-sha1: 607864ccbf1dcaa8d35a1a3b1592227edfc5cccc Text-content-length: 272 Text-content-md5: f61a53c518c545e7828d1ccdcc0d6f5d Text-content-sha1: 10801307a1ea7c1a742f9242f2c68e289954dd88 Content-length: 272 SVN��wj'[�)��Pz�s)�I?�M?�I?�M?�w�triplemind.com/">putty.triplemind.comwww.ayush.org/putty/">ayush.orgstatic.namesdatabase.com/putty/">static.namesdatabasemirrors.wehost4u.net/putty/">mirrors.wehost4u.netputty.cyberiusnetwork.com/">putty.cyberiusnetwork Revision-number: 6461 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2005-11-14T09:41:42.233880Z K 7 svn:log V 27 Missing close parenthesis. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 438aaff2af288c11c4709ade13212b8c Text-delta-base-sha1: d03aafd4c092c6c2489b53c04c3c69e219817f59 Text-content-length: 22 Text-content-md5: 3efcfa5eed1735cce58929ec343cb03c Text-content-sha1: 4f030b1773d15a1b3c04dce15be480c4cad7eddc Content-length: 22 SVN�� �y��y) Revision-number: 6462 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 Mention PuTTYCS ("PuTTY Command Sender"). K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-11-14T17:25:49.962517Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 487fea2691ee7c24ef1f1cc1d35b109a Text-delta-base-sha1: 526e94a101164e821cc64799874fbe41ad545e87 Text-content-length: 173 Text-content-md5: d55797078ee5462f0d4cef0af388ce8e Text-content-sha1: 9a240828fabb2629688b56defb6e852d83b9ffe0 Content-length: 173 SVN��6^�N��N �lJ millardsoftware.com/puttycs"> PuTTY Command Sender</a>, for sending commands to and otherwise manipulating multiple PuTTY windows at once Node-path: putty-wishlist/data/terminal-fanout Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 883011849369ee2a86f4771e012d399f Text-delta-base-sha1: 82842bb10a908ddd8c5cef5cecefcabfe72e3330 Text-content-length: 145 Text-content-md5: 158615ea3393e112ef59e3fa9471f312 Text-content-sha1: ee841120eaffdcd2bb86ab534132e0d075d7afa5 Content-length: 145 SVN�� {�y�{�!sA Windows application which implements something like this is <a href="http://www.millardsoftware.com/puttycs">PuTTYCS</a>. Revision-number: 6463 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:14:59.539921Z PROPS-END Revision-number: 6464 Prop-content-length: 190 Content-length: 190 K 7 svn:log V 90 +mirror-putty.lapapa.com.ar +mirror-putty.lapapa.cl +putty.dcc.fc.up.pt -putty.deb1an.net K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-11-19T21:15:03.745647Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f61a53c518c545e7828d1ccdcc0d6f5d Text-delta-base-sha1: 10801307a1ea7c1a742f9242f2c68e289954dd88 Text-content-length: 263 Text-content-md5: a160b88d12db794a8e6ad3a923f6cf5a Text-content-sha1: 67f795a1f5d4b54cffe4438cee6153c40ddf7b00 Content-length: 263 SVN��jh)P�6�H�A@�%<�Uz�x9�A@�7�o{mirror-putty.lapapa.com.ar/">mirror-putty.lapapa.com.ar</a> in Argentinazvuk.net/">putty.zvukmirror-putty.lapapa.cl/">mirror-putty.lapapa.cl</a> in Chileputty.dcc.fc.up.pt/">putty.dcc.fc.up.pt</a> in Portugal Revision-number: 6465 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2005-11-20T18:41:37.745516Z K 7 svn:log V 20 putty.interunix.net K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a160b88d12db794a8e6ad3a923f6cf5a Text-delta-base-sha1: 67f795a1f5d4b54cffe4438cee6153c40ddf7b00 Text-content-length: 78 Text-content-md5: e92a2f98193aa18ab013ff2657523e7a Text-content-sha1: 593681a20f5029b0e3d4e71c67fce96900067b00 Content-length: 78 SVN��h\3�t��A��ttinterunix.net/">putty.interunix.net</a> in Malaysia Revision-number: 6466 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2005-11-20T20:30:58.742289Z K 7 svn:log V 41 We have too many US mirrors. Lose a few. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e92a2f98193aa18ab013ff2657523e7a Text-delta-base-sha1: 593681a20f5029b0e3d4e71c67fce96900067b00 Text-content-length: 123 Text-content-md5: b2b33f4366a4e816f07d9ea1e7f29f66 Text-content-sha1: df69d9a1727d34b6cb2ff7c707f23a57d013a46a Content-length: 123 SVN��\P�)��I��M|�r�[_�,0gonorar.com/">putty.gonorar.commirror.sg.depaul.edu/pub/putty/">mirror.sg.depaul Revision-number: 6467 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 29 Add info from Justin Foutts. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-11-22T22:57:31.494755Z PROPS-END Node-path: putty-wishlist/data/host-key-sig-verify-fail Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ce16c03dea89e70c7c5ac4ab6914f076 Text-delta-base-sha1: 40cd026b4943a025d6497cbdcb2555713a902d4a Text-content-length: 622 Text-content-md5: 7083821f019a46ccede1cc9eb41692e4 Text-content-sha1: 644e1faa0ad1f8079bd6e202cdda8c775cd46d4e Content-length: 622 SVN��3} U�9��oDNseveral <p> One interesting report had both this SSH-2 failure, and the SSH-1 failure "Incorrect CRC received on packet", occurring reproducibly on the <em>same</em> machine, and no other. Some further digging into the SSH-1 problem by our correspondent indicated that PuTTY's <tt>rsaencrypt()</tt> function was playing up; and they found that with their compiler ("Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86") adding <tt>/Od</tt> (disable all optimisations) made the problem go away. <br><tt><20051108211710.79855.qmail@web52815.mail.yahoo.com></tt> et seq Revision-number: 6468 Prop-content-length: 110 Content-length: 110 K 7 svn:log V 10 HTML oops K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-11-23T10:34:47.494931Z PROPS-END Node-path: putty-wishlist/data/host-key-sig-verify-fail Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7083821f019a46ccede1cc9eb41692e4 Text-delta-base-sha1: 644e1faa0ad1f8079bd6e202cdda8c775cd46d4e Text-content-length: 26 Text-content-md5: 320e310a4c210d2e2a64fdd6751930d4 Text-content-sha1: ca18d869e07d0457c02ff2de48e824c935313d3e Content-length: 26 SVN��} � ��r </tt> Revision-number: 6469 Prop-content-length: 461 Content-length: 461 K 8 svn:date V 27 2005-11-23T21:26:05.872471Z K 7 svn:log V 360 An MSVC version of the 16->32-bit bignum optimisation, derived from part of a patch by Lionel Fourquaux. Seems to be about a factor of four improvement (see wishlist item for details). I don't claim to understand this in detail, so I can't vouch for its correctness, but it didn't fall over immediately. It also produces some compiler warnings, unfortunately. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c314251857fc324ae7cf98bb1c30a6e Text-delta-base-sha1: 03c80b53b6f530677dfa0337ff9944e6780e47f9 Text-content-length: 634 Text-content-md5: ee9ea9bcd68356c0a72a45652964d88d Text-content-sha1: 94a993c8074567711e91b2f06d90e46078975aab Content-length: 634 SVN��v{X�%�c�(|u�V if defined _MSC_VER && defined _M_IX86 typedef unsigned __int32 BignumInt; typedef unsigned __int64typedef struct { unsigned __int32 quot; unsigned __int32 remd; } msvc_quorem; static __declspec(naked) msvc_quorem __stdcall msvc_divmod( unsigned __int32 hi, unsigned __int32 lo, unsigned __int32 w) { __asm { mov edx, dword ptr [esp+4] mov eax, dword ptr [esp+8] div dword ptr [esp+12] ret 12 }; } #define DIVMOD_WORD(q, r, hi, lo, w) do { \ const msvc_quorem qr = msvc_divmod((hi), (lo), (w)); \ (q) = qr.quot; (r) = qr.remd; \ } while (0 Node-path: putty-wishlist/data/optimise-bignum Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48c28d922022fe3025dc2d07b5a2ef9a Text-delta-base-sha1: aa7fef9adf8dc44ba261d7ad1a7d8591351724b7 Text-content-length: 875 Text-content-md5: 2ea1cab87f3b66ae9bbcb9997b710d50 Text-content-sha1: 623d59bcff575fd1133e08525ab08d4e10718d91 Content-length: 875 SVN��-0HC�"�|#�JSummary: Enable bignum optimisation for Windows Visual C builds Class: semi-bug Difficulty: tricky Priority: medium Fixed-in: r6469 2005-11-24 Content-type: text/x-html-body <p> <tt>sshbn.c</tt><p><p><p> <em>Update, 2005-11-23:</em> part of a patch from Lionel Fourquaux that enables this optimisation has now been applied. Since this fixes the overwhelmingly common case, I'm going to declare this fixed, although patches for other compilers/platforms are still welcome. <p> Here's an example of the improvement with r6468, on a slow (P233) client connecting to a fast (Athlon 1800) server: <table> <tr> <th></th> <th>DH group exchange</th> <th>4096-bit RSA2 user auth</th> </tr> <tr> <th>Vanilla VC</th> <td>11s/10s/11s</td> <td>123s/123s/123s</td> </tr> <tr> <th>Optimised VC</th> <td>3s/3s/3s</td> <td>34s/34s/34s</td> </tr> </table> Revision-number: 6470 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2005-11-25T23:27:40.039985Z K 7 svn:log V 118 Replace stats with representative ones where both builds come from the same compiler. (Slightly better, if anything!) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/optimise-bignum Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ea1cab87f3b66ae9bbcb9997b710d50 Text-delta-base-sha1: 623d59bcff575fd1133e08525ab08d4e10718d91 Text-content-length: 228 Text-content-md5: 29ef4cc1b20fb6a6a321337d335d153a Text-content-sha1: ebb0ed774563a5811e13162e99e9fb666657f4a3 Content-length: 228 SVN��0L K�X�L�)comparing r6460 with r6469 (built with the same compiler), on a slow (P233) 2s/11s/11s</td> <td>124s/124s/123s</td> </tr> <tr> <th>Optimised VC</th> <td>3s/3s/3s</td> <td>31s/30s/31s</td> </tr> </table> Revision-number: 6471 Prop-content-length: 104 Content-length: 104 K 8 svn:date V 27 2005-11-26T13:47:59.442593Z K 7 svn:log V 5 typo K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/wm-app Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15d9f0fb3d7949da41531f101a1a2781 Text-delta-base-sha1: 549e99ec06daa6db99c9bf76111fdd32755fae5c Text-content-length: 44 Text-content-md5: 81b7045ab1c937c85058e846ed30581a Text-content-sha1: 9c8f4100b67e417761ba05f8594c3b8c8fd0322d Content-length: 44 SVN��OO�3Summary: PuTTY should use WM Revision-number: 6472 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2005-11-26T17:58:02.544803Z K 7 svn:log V 60 Reference portaPuTTY, which turned up on comp.security.ssh. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d55797078ee5462f0d4cef0af388ce8e Text-delta-base-sha1: 9a240828fabb2629688b56defb6e852d83b9ffe0 Text-content-length: 121 Text-content-md5: 2b908cadfadfd38b7e43addbbc4de097 Text-content-sha1: 091b53f8c4ed5c886afcfb5ea40b335d31d1f728 Content-length: 121 SVN��^V c�o�c�Zsocialistsushi.com/portaputty">portaPuTTY</a>, a version which (only) uses files for data storage Revision-number: 6473 Prop-content-length: 183 Content-length: 183 K 8 svn:date V 27 2005-12-01T16:41:49.936537Z K 7 svn:log V 83 SSH-2 rekey bug compatibility setting wasn't being saved (but _was_ being loaded). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c37095c9d3297309f3a8a7eb8f53ccb7 Text-delta-base-sha1: 5ebffa637896cf684291da31e028fe159a8365c2 Text-content-length: 54 Text-content-md5: 393c4a0dc65c541bdcab000b764d8c52 Text-content-sha1: 2f9f67a74e9b9c13a50fcceca4cdd8595584750e Content-length: 54 SVN��1r � ��IhBugRekey2", 2-cfg->sshbug_rekey Node-path: putty-wishlist/data/ssh-bug-rekey2-notsaved Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 965 Text-content-md5: efeac6135864b397a0b84eb64bca9240 Text-content-sha1: e5e6b307e12aa4fb1d72c5b4eb27adff5ae52452 Content-length: 975 PROPS-END SVN���777Summary: SSH-2 rekey bug-compatibility setting not saved Class: bug Difficulty: fun Present-in: 0.58 Fixed-in: r6473 2005-12-02 Content-type: text/x-html-body <p> In 0.58, a new SSH bug-compatibility mode was added to PuTTY: <a href="http://www.tartarus.org/~simon/puttydoc/Chapter4.html#config-ssh-bug-rekey">"Handles SSH-2 key re-exchange badly"</a>. <p> However, in 0.58, attempts to save any setting other than "Auto" fail - the setting stays at "Auto". (Apparently there is some NetApp server - "Data ONTAP" - that needs this mode and isn't picked up by our heuristics.) This is fixed in the development snapshots. <p> If the setting is present in the saved settings, 0.58 will happily load it, so a workaround for 0.58 users is to use a snapshot just to save the setting to the desired value, and then revert to using 0.58. (Alternatively, you could edit the setting manually; its name is <tt>BugRekey2</tt> with values 0=Auto, 1=Off, 2=On.) Revision-number: 6474 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2005-12-02T00:01:23.065630Z K 7 svn:log V 33 putty.silentflame.com netamo.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b2b33f4366a4e816f07d9ea1e7f29f66 Text-delta-base-sha1: df69d9a1727d34b6cb2ff7c707f23a57d013a46a Text-content-length: 155 Text-content-md5: 16fe1a28c0807cdb2e093fce98573b17 Text-content-sha1: d03a48cb1bc38e7a48d7374c06da890c56caaf66 Content-length: 155 SVN��g}���_FO� ~www.netamo.com/putty/">netamo.com</a> in Spainputty.silentflame.com/">putty.silentflame.com</a> in the UK<!--MIRRORSTATUS-->. Revision-number: 6475 Prop-content-length: 448 Content-length: 448 K 7 svn:log V 347 Improvements from Spyros Blanas to the MSVC optimisations of r6469: don't do a function call for each divmod, and don't rely on details of the calling convention. (This didn't actually make any measurable difference to runtime in any of my tests, but we may as well keep it as it's neater.) Also document some general caveats of the divmod macro. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-12-06T23:18:27.843012Z PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ee9ea9bcd68356c0a72a45652964d88d Text-delta-base-sha1: 94a993c8074567711e91b2f06d90e46078975aab Text-content-length: 1205 Text-content-md5: 4599aa7fda426636abc1e03a6712f2a2 Text-content-sha1: ab9b0d5544e4a7a7a4bd4285f6157553598f005a Content-length: 1205 SVN��{{ ��n�l�#0�8C/* * Usage notes: * * Do not call the DIVMOD_WORD macro with expressions such as array * subscripts, as some implementations object to this (see below). * * Note that none of the division methods below will cope if the * quotient won't fit into BIGNUM_INT_BITS. Callers should be careful * to avoid this case. * If this condition occurs, in the case of the x86 DIV instruction, * an overflow exception will occur, which (according to a correspondent) * will manifest on Windows as something like * 0xC0000095: Integer overflow * The C variant won't give the right answer, either. *//* Note: MASM interprets array subscripts in the macro arguments as * assembler syntax, which gives the wrong answer. Don't supply them. * <http://msdn2.microsoft.com/en-us/library/bf1dw62z.aspx> */ #define DIVMOD_WORD(q, r, hi, lo, w) do { \ __asm mov edx, hi \ __asm mov eax, lo \ __asm div w \ __asm mov r, edx \ __asm mov q, eax \ } while/* Macro doesn't want an array subscript expression passed * into it (see definition), so use a temporary. */ BignumInt tmplo = a[i]; DIVMOD_WORD(q, r, h, tmplo Revision-number: 6476 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2005-12-07T00:24:45.188703Z K 7 svn:log V 151 Institutional failure to memset() things pointed at rather than pointers. Things should now be zeroed and memory not leaked. Spotted by Brant Thomsen. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 63d5d8e55e23efc937a8063ecb45bec4 Text-delta-base-sha1: 76be0f3a2d6734fff0c67d3e9e3ba7a849fc9eee Text-content-length: 153 Text-content-md5: 355a41ef069fd9698be2d129acfbdc57 Text-content-sha1: 2bf239682260da222235150d811c31c401ec830c Content-length: 153 SVN��QQ,`�<��[L�7�8L�/�^S�Aret, 0, sizeof(*key, 0, sizeof(*key, 0, sizeof(*ret, 0, sizeof(*key, 0, sizeof(*key, 0, sizeof(* Revision-number: 6477 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2005-12-07T18:01:40.278166Z K 7 svn:log V 186 Apparently some SSH servers object to our claiming port-forwarded connections to be from IP "client-side-connection". Claiming "0.0.0.0" instead seems to work. Spotted by Brant Thomsen. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73c6cd7bfbd6c1200d74f16a0d65e572 Text-delta-base-sha1: b1462acb61833e210c16169e81375d7d997342cf Text-content-length: 252 Text-content-md5: 0255de5def1f79efcb7007e2977a0a9d Text-content-sha1: 5eb30a633154fd80af32576b6052e5ead54d3daf Content-length: 252 SVN����������������r}@� �@�4> The "originator IP address" is syntactically a numeric * IP address, and some servers (e.g., Tectia) get upset * if it doesn't match this syntax. */ ssh2_pkt_addstring(pktout, "0.0.0.0 Node-path: putty-wishlist/data/portfwd-invalid-origin Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 952 Text-content-md5: 25176c8460fefd4904f0a4d9acdd4e0f Text-content-sha1: e57c13958368afedf6273615fd823c9739ff66fb Content-length: 962 PROPS-END SVN���***Summary: Some servers reject SSH-2 tunnels due to invalid originator IP address Class: semi-bug Difficulty: fun Present-in: 0.58 Fixed-in: r6477 2005-12-08 Content-type: text/x-html-body <p> In SSH-2, the local-to-remote port-forwarding request is defined by <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-connect/">secsh-connect</a> to contain an "originator IP address" and "originator port", which identify to the server where the connection the client received came from. <p> PuTTY has always taken the view that this is none of the server's business, and sent the bogus IP address <tt>client-side-connection</tt> and port 0. <p> Apparently, some servers take exception to this and refuse the forwarding. Specifically, a problem was reported with <a href="http://www.ssh.com/products/tectia/server/">SSH Tectia Server (T)</a> for Windows, version 5.0.0-844. Using <tt>0.0.0.0</tt> instead appears to mollify this server. Revision-number: 6478 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2005-12-08T16:34:50.064681Z K 7 svn:log V 6 tweak K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-invalid-origin Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25176c8460fefd4904f0a4d9acdd4e0f Text-delta-base-sha1: e57c13958368afedf6273615fd823c9739ff66fb Text-content-length: 99 Text-content-md5: 99206d38083ec741b0c8780a1d368a41 Text-content-sha1: aa1c2ebef7d3fa73f4f14b3334a172dca520257b Content-length: 99 SVN��*D M�7�M�@j(with some justification) and refuse the forwarding. Specifically, a problem Revision-number: 6479 Prop-content-length: 417 Content-length: 417 K 8 svn:date V 27 2005-12-09T20:04:19.871917Z K 7 svn:log V 316 A few small changes to make the PuTTY source base more usable as a basis for other terminal-involving applications: a stub implementation of the printing interface, an additional function in notiming.c, and also I've renamed the front-end function beep() to do_beep() so as not to clash with beep() in lib[n]curses. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: be1334d7419c65e0769d08dc4f7284d9 Text-delta-base-sha1: fd6175f321042f19215886cf0193927374e1a60b Text-content-length: 28 Text-content-md5: f0f1992234cc8f5ab7932574057e0a8f Text-content-sha1: 9e6677302671e20e54a0611061b14e30a4da898b Content-length: 28 SVN�� �&��p&do_ Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73ed8358a2a90e770364cce19585c710 Text-delta-base-sha1: db52faf47c360494685ecc57a483fcde4835d3d7 Text-content-length: 28 Text-content-md5: b0101ff2410bec1743332153888193d6 Text-content-sha1: d31266da392a4303b1fd32c7e9ccc0fc90478b34 Content-length: 28 SVN��OR �+��$+do_ Node-path: putty/noprint.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 636 Text-content-md5: a4571d492be98e5f83ebccd21bcf8a53 Text-content-sha1: f21c563bf34ddc755cf9ba68c5948a4497168753 Content-length: 646 PROPS-END SVN���nnn/* * Stub implementation of the printing interface for PuTTY, for the * benefit of non-printing terminal applications. */ #include <assert.h> #include <stdio.h> #include "putty.h" struct printer_job_tag { int dummy; }; printer_job *printer_start_job(char *printer) { return NULL; } void printer_job_data(printer_job *pj, void *data, int len) { } void printer_finish_job(printer_job *pj) { } printer_enum *printer_start_enum(int *nprinters_ptr) { *nprinters_ptr = 0; return NULL; } char *printer_get_name(printer_enum *pe, int i) { return NULL; } void printer_finish_enum(printer_enum *pe) { } Node-path: putty/notiming.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ac362fb4d33967e24beb8ad6d85d312 Text-delta-base-sha1: 57424264154abd866a8114860d91c7d869bca6ec Text-content-length: 401 Text-content-md5: c9fe17d454b003915273b35e39b7670a Text-content-sha1: 4cd9e8a4cb1131b0e8edc380f9164646b373b98a Content-length: 401 SVN��!H |R�LU/* * notiming.c: stub version of timing API. * * Used in any tool which needs a subsystem linked against the * timing API but doesn't want to actually provide timing. For * example, key generation tools need the random number generator, * but they don't want the hassle of calling noise_regular() at * regular intervals - and they void expire_timer_context(void *ctx) { } Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 34e5bcc1fe87909c2d219dcde1977047 Text-delta-base-sha1: 76596816e529a2cfb94f62660f46ab486c542ec8 Text-content-length: 29 Text-content-md5: 4492cd23fceef7cc7eca1349cb678d53 Text-content-sha1: c00f27de45977d59339e07de3a5abfe78f59c5a0 Content-length: 29 SVN��[^ �W��Wdo_ Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 910cfa93810e831f148509d1250d1381 Text-delta-base-sha1: a92e25223e03b11efbd9a399319ccae5c36f0d0b Text-content-length: 49 Text-content-md5: 8d9842f377edb12ff2b3c609ded75a1b Text-content-sha1: 06e18cbe721fefabe72571ddc394561c2e6244db Content-length: 49 SVN���� �<��A<do_�(+�(� si Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ed934471d41d58381dd714908b7ff2f7 Text-delta-base-sha1: a59c3a005a66a35eecc9add0da7a891be5cdb12d Text-content-length: 46 Text-content-md5: a43b77e5bf3ebd7267b7aaf2fa09b0f7 Text-content-sha1: 04e7ef669c6e34cd14731c67e1d6dfce80de9f2f Content-length: 46 SVN���� �:��C:do_�nq�n�get Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1cd5816dc1cad7b6081f6ad447bf1cb3 Text-delta-base-sha1: a673277eead45c0028106a29fb3df9aeb8f730c3 Text-content-length: 44 Text-content-md5: 4389d1604aee705413905cd8c7c952f7 Text-content-sha1: ace6869f2c09a3307f7bcda36b22c7e7ca3aefe1 Content-length: 44 SVN���������\_ �|��`|do_ Revision-number: 6480 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:01.835484Z PROPS-END Revision-number: 6481 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:01.848469Z PROPS-END Revision-number: 6482 Prop-content-length: 118 Content-length: 118 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-12-10T12:08:00.136879Z K 7 svn:log V 18 Bunch of mirrors. PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 16fe1a28c0807cdb2e093fce98573b17 Text-delta-base-sha1: d03a48cb1bc38e7a48d7374c06da890c56caaf66 Text-content-length: 248 Text-content-md5: 9fada6bc5037620fac576216df2c2ae0 Text-content-sha1: a655c1e2a46f6719fe662f4b7720f762de75933d Content-length: 248 SVN��g-.<�5��P{�K5�IE�M7�|�M>�M�urxedio.de/">putty.xedio.deputty.vargonen.net/">putty.vargonen.net</a> in Turkeygreenfabric.com/mirror-putty/">greenfabricwww.metrofreenet.org/putty/">metrofreenetputty.hoxt.com/">putty.hoxt Revision-number: 6483 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 2005-12-11T13:55:24.812156Z K 7 svn:log V 9 putty.se K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9fada6bc5037620fac576216df2c2ae0 Text-delta-base-sha1: a655c1e2a46f6719fe662f4b7720f762de75933d Text-content-length: 59 Text-content-md5: b17d4c5b08de1734de202c3e435075a7 Text-content-sha1: 2825a3c56163c514082a83436ef55c32f61162e6 Content-length: 59 SVN��- $�S��www.putty.se/">putty.se</a> in Swede Revision-number: 6484 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2005-12-12T13:04:33.653456Z K 7 svn:log V 42 PuTTY SC does have source code available. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b908cadfadfd38b7e43addbbc4de097 Text-delta-base-sha1: 091b53f8c4ed5c886afcfb5ea40b335d31d1f728 Text-content-length: 98 Text-content-md5: 55d843d2505def2cafa25238ab9ba8a2 Text-content-sha1: f6a60ec4cba95872027e615f9a754d7a478e65a4 Content-length: 98 SVN��VJG�=�G�G$�Wjoebar.ch/puttysc/">PuTTY SC</a>, another patch for smartcard support Revision-number: 6485 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:02.229594Z PROPS-END Revision-number: 6486 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:02.241448Z PROPS-END Revision-number: 6487 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:02.252497Z PROPS-END Revision-number: 6488 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:02.265928Z PROPS-END Revision-number: 6489 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:02.278229Z PROPS-END Revision-number: 6490 Prop-content-length: 116 Content-length: 116 K 7 svn:log V 16 Another report. K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-12-12T20:05:29.665480Z PROPS-END Node-path: putty-wishlist/data/assert-fail-newsavelines Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f2619e283ba1e965033bec0ea11e0e6 Text-delta-base-sha1: 392a35f6496e5a5b403629613623bda5a644f433 Text-content-length: 203 Text-content-md5: c9f9e48f1e6d04d89025645152f50578 Text-content-sha1: f55083ca14897308efee5f94dbc37a2fab15c531 Content-length: 203 SVN��s^.�r��rO�86Z 0.58, :454 (0.58) <br>count234(term->scrollback) <= newsavelines <p> Most ofli><tt>F0652A9934B81649B13293685D1945E90199B261@WHQNT60.AAM.NET</tt> <br>0.58, SSH </ul> Revision-number: 6491 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2005-12-12T20:11:26.354579Z K 7 svn:log V 70 Summary: Reset terminal state when restarting session Class: semi-bug K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/restart-reset-terminal Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 892 Text-content-md5: cbf47b1b9f0a445445718da5c68ab52d Text-content-sha1: e35d0ef7c8ed072e06ed1f6226a86980a324020d Content-length: 902 PROPS-END SVN���nnnSummary: Reset terminal state when restarting session Class: semi-bug Difficulty: fun Priority: medium Content-type: text/x-html-body <p> PuTTY now has the ability to <a href="reuse-windows.html">reuse terminal windows</a> with the `Restart Session' option. However, the terminal may be in some bad state (cursor off, black text on black background, or whatever), or the prompts for the new session may appear in the middle of the previous session's output. <p> We could put more effort into sanitising the terminal state, while keeping the previous session's info on screen for reference. Suggested actions (to take place when the new session starts): <ul> <li>Reset all attributes to defaults (colours, bold, cursor, character set etc etc); <li>Move cursor to the first column; <li>Move cursor to after the last "used" row on the screen, scrolling down if necessary. </ul> Revision-number: 6492 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2005-12-13T12:33:04.973917Z K 7 svn:log V 77 The "Windows GUI application" thing turned out to be a pretty feeble excuse. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/puttygen-batch Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a3b04ac1083bc75d7060e54f7dd15547 Text-delta-base-sha1: 34de80127d8595cfb8ebd70784cec6401431e788 Text-content-length: 607 Text-content-md5: e5a047903127c7c61c5aebb057268d13 Text-content-sha1: 5abc0ef6e634747060d6af65ddcc09c612266eac Content-length: 607 SVN��TM G�&�G�`tlso, since Windows PuTTYgen is a GUI application, even ignoring the randomness issue (which can be ignored for automated format conversions, for instance), using it from a batch file is slightly tricky. Normally, it will not block the batch file, but this can be dealt with with <tt>START /WAIT</tt>. Also, it probably won't be able to interact with the console, so it's not clear how it can indicate errors (let alone ask for passphrases). (Is the exit code accessible to a batch file when using <tt>START /WAIT</tt>?) These problems might necessitate a separate console application Revision-number: 6493 Prop-content-length: 188 Content-length: 188 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-12-13T12:39:46.656806Z K 7 svn:log V 88 Further update in light of Simon's comments re cmdgen (I was leaning that way already). PROPS-END Node-path: putty-wishlist/data/puttygen-batch Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e5a047903127c7c61c5aebb057268d13 Text-delta-base-sha1: 5abc0ef6e634747060d6af65ddcc09c612266eac Text-content-length: 394 Text-content-md5: 108ed5d033f27ae8e820146d40de208f Text-content-sha1: 026defc251afd68bf66569c3c277b266950e3739 Content-length: 394 SVN��My r�'�r�`mould be dealt with with <tt>START /WAIT</tt>. <p> However, it's still not clear how such a setup might e.g. indicate errors (given that it probably won't be able to interact with the console). Since we already <em>have</em> a command-line PuTTYgen (for Unix), it might be better to just port that to Windows as a console application, disabling key generation on the way Revision-number: 6494 Prop-content-length: 257 Content-length: 257 K 8 svn:date V 27 2005-12-15T11:37:39.593449Z K 7 svn:log V 156 A thread about this on rgrn (<w0j*-qf6q@news.chiark.greenend.org.uk>) has prompted me to add more detail to this entry about the various problematic cases. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/meta-bit Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: be801356496992c461f6802c82ee17ed Text-delta-base-sha1: d92918b11d54fbf4c61147fc865b30f365b826c5 Text-content-length: 945 Text-content-md5: ddb732e219afa369a0f79f348d72157b Text-content-sha1: 067f124861cfe08ac68946cf0393c30738c690ad Content-length: 945 SVN��K{ �`��IInteresting questions about this include: <ul> <li> What should happen if the user presses Meta plus a key which transmits multiple characters (such as a function key). BJH thinks the best move is probably to have Meta produce no additional effect in this case. <li> What should happen if the terminal is in a multi-byte character set. Presumably in UTF-8 mode Meta-a should not produce the single byte 0xE1, on the basis that applications ought at least to be able to expect the input data to be valid UTF-8! Should it instead produce the UTF-8 encoding of U+00E1? What if we subsequently support MB character sets other than UTF-8, in which U+00E1 might not be a representable character? <li> What should happen if the key pressed with Meta <em>already</em> has the high bit set: French keyboards, for example, produce some accented characters by single keypresses. Is the high bit toggled, or merely forced to 1? </ul> Revision-number: 6495 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:02.736269Z PROPS-END Revision-number: 6496 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2005-12-15T22:45:48.922363Z K 7 svn:log V 43 putty.spiegelserver.com putty.hkmirror.org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b17d4c5b08de1734de202c3e435075a7 Text-delta-base-sha1: 2825a3c56163c514082a83436ef55c32f61162e6 Text-content-length: 179 Text-content-md5: 2ceac72be49c418dda9810fe6d780b57 Text-content-sha1: 4d9d9fce2f2f076ac7e47d028a6d432206ca6122 Content-length: 179 SVN�� {�5��N@�_/�A��A��}spiegelserver.com/">putty.spiegelserverhkmirror.org/">putty.hkmirror.org</a> in Hong Kongarchive.hk/">putty.archive.hk</a> in Hong Kong Revision-number: 6497 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2005-12-16T16:43:28.300486Z K 7 svn:log V 62 Mention compile-time directives and where they're documented. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 79e5c9ed20aae141ae8d8b271011726f Text-delta-base-sha1: b525418e945e9fd6548598d365f17adc0d14e658 Text-content-length: 259 Text-content-md5: c08a98e382ab8318b3ff0c61ba656c02 Text-content-sha1: a9de25694853a561a01ffe9038b97055e75c598b Content-length: 259 SVN�� k�/�k�k-There are various compile-time directives that you can use to disable or modify certain features; it may be necessary to do this in some environments. They are documented in `Recipe', and in comments in many of the generated Makefiles. Revision-number: 6498 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2005-12-18T14:56:41.062451Z K 7 svn:log V 35 Another report, another workaround K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/black-pointer Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 690d4ffc9ac7226d67582b39ac998051 Text-delta-base-sha1: 6d7baa9e0e9662de83062265c08721209bc3efcf Text-content-length: 388 Text-content-md5: 03124f086b9d7bfa6eac2f894d4d4e08 Text-content-sha1: f8fa8517a90b128300f80722fb66c14d9c5d4b3f Content-length: 388 SVN��aPf���#b�@! 0.5li> <Pine.GSO.4.64.0512161443510.18707@brains.eng.cse.dmu.ac.uk> <i>et seq.</i>:<br> <ul> <li>Windows XP <li>PuTTY 0.58 <li>Setting background to 0,0,1 or 1,1,1 (see below) didn't help <li>Using accessibility wiazard to set "inverting cursor" didn't help <li>Using accessibility wizard to set black cursor with white outline gave something usable Revision-number: 6499 Prop-content-length: 251 Content-length: 251 K 8 svn:date V 27 2005-12-18T16:57:00.401265Z K 7 svn:log V 150 CP866 is popular and small. Add it to both the general and PuTTY implementations of libcharset, since we've had at least one request for it in PuTTY. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/charset/charset.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ba4a86b97197c1621a02d7105398a4f Text-delta-base-sha1: 535b60c780c349c33ca2430b463d93194bef8252 Text-content-length: 24 Text-content-md5: 55b7537173fa138ab2c42580adc88db6 Text-content-sha1: 31fc4f7ad6a5cff51e42639605e6d265115b77e2 Content-length: 24 SVN��w �S��/H866 Node-path: putty/charset/localenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e204058323cfe9027f300fc0c4ab8e26 Text-delta-base-sha1: d9b29be8652f71e9d49646d215909e19c4c3ef63 Text-content-length: 35 Text-content-md5: da348d574a2c614026013bd1d5fdfdb6 Text-content-sha1: 0a24edad7aba159b0ffabae5de14b9f4558080d9 Content-length: 35 SVN��Sq �]��M866", CS_CP866 Node-path: putty/charset/mimeenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8d9c19fa70f2905065933bd0b809a8cd Text-delta-base-sha1: a1af791f8fd7f78fc6c2c0a97b9f235a34c2e620 Text-content-length: 121 Text-content-md5: 60896157e6ef01c224569bd282b92375 Text-content-sha1: fc38e6704eb7b881b2df9abb777df5e28f531bcb Content-length: 121 SVN��ZI c�c�c�WIBM866", CS_CP866 }, { "cp866", CS_CP866 }, { "866", CS_CP866 }, { "csIBM866", CS_CP866 Node-path: putty/charset/sbcs.dat Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 249b38e167bb3e00a3268da148322a0b Text-delta-base-sha1: afac556daf392b33a8485434a3fb280c6f6f5dbc Text-content-length: 232 Text-content-md5: 39336bdc0359f05efc37b48603bcd6d1 Text-content-sha1: 1c3e2c3f480652ce16b14f71eb9df80d975a037c Content-length: 232 SVN�� .,�{��!{�?�>O�rx�K@I�z 866charset CS_CP8660430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043a 043b 043c 043d 043e 043f44f 0401 0451 0404 0454 0407 0457 040e 045e 00b0 2219 00b7 221a 2116 00a4 Node-path: putty/charset/xenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a31f3f641627b46b33f582d88d24393 Text-delta-base-sha1: 3c1d64a3b33254d8521c57e3db06318c22d264cc Text-content-length: 41 Text-content-md5: 18e930734f475a7cf9ddde9da3920076 Text-content-sha1: 3f1d0841293d264662afb3a5c83d08663c294227 Content-length: 41 SVN��c ���h{ibm-cp866", CS_CP866 Revision-number: 6500 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2005-12-18T17:05:21.826584Z K 7 svn:log V 50 Update status of this library wrt other variants. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/charset/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69a31f5f2c2799e7ebe865fb3431d644 Text-delta-base-sha1: c3cdbc61b11960a8016e0ee00e7ec3802c2d252c Text-content-length: 595 Text-content-md5: 78cb805f95fbbb94a0ba9d1fb3f553ec Text-content-sha1: e11a7f463e2d5d5e3ba7cdbe175177476c82bcc2 Content-length: 595 SVN��bo@�/�@This is a variant of a library that's currently used in some other programs such as Timber and Halibut. At some future date, we would like to merge the two libraries, so that all programs use the same libcharset. It is therefore a _strong_ design goal that this library should remain perfectly general, and not tied to particulars of PuTTY. It must not reference any code outside its own subdirectory; it should not have PuTTY-specific helper routines added to it unless they can be documented in a general manner which might make them useful in other circumstances as well. Revision-number: 6501 Prop-content-length: 110 Content-length: 110 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-12-21T13:56:26.636614Z K 7 svn:log V 10 "Tricky." PROPS-END Node-path: putty-wishlist/data/fxp-short-reads Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eee0dba5c00b5b9ecf0ac6e6ee0506fb Text-delta-base-sha1: 03f5b1f9f142e678551784d01470a6c7ec999a19 Text-content-length: 88 Text-content-md5: a13d565506b0c86df81f242140882e16 Text-content-sha1: bc92a92e7772e10805a2d1d2b600f25b4335a7fa Content-length: 88 SVN��/GG�h4Summary: Support short reads in SFTP Class: semi-bug Difficulty: tricky Revision-number: 6502 Prop-content-length: 144 Content-length: 144 K 10 svn:author V 5 jacob K 8 svn:date V 27 2005-12-21T14:19:16.370403Z K 7 svn:log V 44 Note about flushing the info thus preserved PROPS-END Node-path: putty-wishlist/data/resize-no-truncate Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f31cd61371f074a59387252675e3c5fe Text-delta-base-sha1: a8477d5d999017c6859eee62c417f2ddb2467f4b Text-content-length: 163 Text-content-md5: c8ac60a8c193820adb5a485271a0c721 Text-content-sha1: 9eb8ebc92c7001a87bc68edf53c9c8a50f5adde8 Content-length: 163 SVN��# �� ��There should probably be <em>some</em> way of flushing the info off the side of the screen, though; probably the `Clear Scrollback' command Revision-number: 6503 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2005-12-21T14:24:26.319184Z K 7 svn:log V 17 mayhem -> tricky K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/puttygen-batch Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 108ed5d033f27ae8e820146d40de208f Text-delta-base-sha1: 026defc251afd68bf66569c3c277b266950e3739 Text-content-length: 25 Text-content-md5: 06209b45c2d889dc6cee5d91083af575 Text-content-sha1: 3a2d3529e5874d111eaaf41ccab61a59ab555108 Content-length: 25 SVN��yy�A��2Gtricky Revision-number: 6504 Prop-content-length: 303 Content-length: 303 K 8 svn:date V 27 2005-12-21T15:38:18.122793Z K 7 svn:log V 202 Summary: Ability to run without terminal window (for forwarding etc) Class: wish Difficulty: tricky I can't believe this wasn't already listed, given how often we're asked for it, but I can't find it. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/no-terminal-window Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1940 Text-content-md5: 0f4fab6d5d757d833e37138a093e6d79 Text-content-sha1: 014d475ed2fa50bd933820e5af5e18e5ff956c07 Content-length: 1950 PROPS-END SVN���Summary: Ability to run without terminal window (for forwarding etc) Class: wish Difficulty: tricky Priority: medium Content-type: text/x-html-body <p> Every so often we get requests to be able to run PuTTY or Plink without any sort of terminal window at all. The usual use case is SSH being used only for port-forwarding (tunnelling). <p> (In SSH-2, we can already run <a href="http://www.tartarus.org/~simon/puttydoc/Chapter4.html#config-ssh-noshell">without requesting a shell</a>, but we still put up a terminal window (in PuTTY) or keep the console open (in Plink).) <p> The main issue that needs to be addressed is one of user interaction. For a start, where will passwords and such be entered? (We could only permit authentication which doesn't require user interaction, but that seems a bit naff.) <a href="gui-auth.html">`gui-auth'</a> may be a solution to this. <p> Another issue in a similar vein is control after the session has started. Currently, one uses the terminal window to add/remove tunnels or to terminate the session; one would need some other way to access these at least some of these control functions, such as (on Windows) a system tray icon. <p> It's not entirely clear whether this is best done by modifying PuTTY, modifying Plink (unlikely), or creating an entirely new application dedicated to such "headless" operation. (Re the last option, see also <a href="ssh2-generality.html">`ssh2-generality'</a>.) <p> It may be possible to do this with the tools as they stand. I'd be surprised if there wasn't some application that could hide Plink's console window in a system tray icon, or something like that, but I don't know of one (please let us know if you do). This would be fine if the only control required after session startup was to kill the entire session. <p> There are a number of third-party applications based on PuTTY which address this sort of use case; see the Links page. Revision-number: 6505 Prop-content-length: 306 Content-length: 306 K 8 svn:date V 27 2005-12-21T15:40:32.579397Z K 7 svn:log V 205 Misc maintenance: - remove patch ref as now implemented that bit - mention equivalent features in OpenSSH - wonder whether a separate "server" application is a good idea - link to `no-terminal-window' K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-generality Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 27439cd5fcaa22e5421e6d3618ed3e03 Text-delta-base-sha1: a72c6c77e5e4996318b6b18097d779e41cfe334f Text-content-length: 561 Text-content-md5: 219cc252b88104d19d2a79e576a05b99 Text-content-sha1: 465e68a651f7ded7e52c358d4902c0e49bb7b39c Content-length: 561 SVN��P{���x+�s*�E <a href="no-terminal-window.html">terminal window</a> - similar to the "connection multiplexing" feature in recent versions of OpenSSH - using the same sort of inter-process communication as with Pageant. Needs careful implementation to avoid opening security holes. <p> Would we want the server part of such a feature implemented in all the PuTTY utilities, or only in a dedicated application, perhaps one created for <a href="no-terminal-window.html">`no-terminal-window'</a>?(PuTTY will still put up a terminal window.) Revision-number: 6506 Prop-content-length: 416 Content-length: 416 K 7 svn:log V 315 Add the results of investigating xterm's behaviour in complex corner cases. (Also I've removed the patches from this bug entry, on the grounds that they dated from 2003 and looked sufficiently out of date as to be unhelpful. We can always dig them out of the source control history if we do turn out to need them.) K 10 svn:author V 5 simon K 8 svn:date V 27 2005-12-23T15:15:34.433926Z PROPS-END Node-path: putty-wishlist/data/meta-bit Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ddb732e219afa369a0f79f348d72157b Text-delta-base-sha1: 067f124861cfe08ac68946cf0393c30738c690ad Text-content-length: 2017 Text-content-md5: 50820e22c8b6f243d525474389378905 Text-content-sha1: d758e6046539e717b4d154fcd8a09942494a459d Content-length: 2017 SVN��{LN�~�NSGT, 2005-12-23: I've just investigated xterm's answers to these questions. xterm itself has relatively little understanding of complex character sets: it operates either in "conventional 8bit mode" or in UTF-8 mode. In the former, the character set is assumed to be single-byte and the Meta key translates each low-half character into its high-half counterpart in the obvious way. In the latter mode, the Meta key translates ASCII into ISO-8859-1 and then encodes it as UTF-8 (so that, for example, Meta-a sends C3 A1 which is the UTF-8 encoding of U+00E1). xterm supports all other character sets by interposing "luit", which means that whether a Meta combination generates anything in (say) Shift-JIS will depend entirely on whether the relevant Unicode value between U+0080 and U+00FF is representable in the target character set. Meanwhile, Meta appears to do nothing at all if combined with anything <em>not</em> in the 00-7F range, be it a character outside that range or a multi-character sequence from a function key. <p>This all seems a bit chaotic: I had to work hard to get xterm to demonstrate both modes to me, although I got there in the end. Based on my findings, I think a possible specification for PuTTY which would offer all of xterm's functionality would be to have a three-way switch governing the behaviour of the Alt key. In the default mode, Alt/Meta generates a prefix ESC as it always has done. In the second mode (analogous to xterm's UTF-8 mode), it maps ASCII into the top half of ISO 8859-1, translating that as appropriate for the line codepage (so that some Meta combinations will generate nothing in some character sets) and affects nothing else at all. In the third mode (analogous to xterm's 8bit mode), it maps the low half of an SBCS into the high half, no matter what SBCS is chosen. We'd have to invent something arbitrary for the third mode to do if the line codepage were not an SBCS; probably the most sensible option is to fall back to the second mode. Revision-number: 6507 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:03.617434Z PROPS-END Revision-number: 6508 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:03.628892Z PROPS-END Revision-number: 6509 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:03.652438Z PROPS-END Revision-number: 6510 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2005-12-29T12:55:42.987961Z K 7 svn:log V 17 scapegoat.ath.cx K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ceac72be49c418dda9810fe6d780b57 Text-delta-base-sha1: 4d9d9fce2f2f076ac7e47d028a6d432206ca6122 Text-content-length: 85 Text-content-md5: 5b6fcabe5c23b1a753acb78b8eba5ec8 Text-content-sha1: ef55aeaa427b4d6941119d991dd5820710eef152 Content-length: 85 SVN��{t >�)�� nscapegoat.ath.cx/mirror/putty/">scapegoat.ath.cx</a> in Poland Revision-number: 6511 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:03.810070Z PROPS-END Revision-number: 6512 Prop-content-length: 105 Content-length: 105 K 7 svn:log V 6 RFCs! K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-01-07T21:20:36.892947Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 55d843d2505def2cafa25238ab9ba8a2 Text-delta-base-sha1: f6a60ec4cba95872027e615f9a754d7a478e65a4 Text-content-length: 877 Text-content-md5: 1323f58c5be4a6be2b6bfd14d50bb9e1 Text-content-sha1: 01cb09fa17f49c4ee6635aef252b4a7cb7a231c2 Content-length: 877 SVN��J A�+��Y0�O<�n� ? specifications: <ul> <li><a href="http://www.ietf.org/rfc/rfc4250.txt">RFC 4250</a> (formerly <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-assignednumbers/">assignednumbers</a>) <li><a href="http://www.ietf.org/rfc/rfc4251.txt">RFC 4251</a> (formerly) <li><a href="http://www.ietf.org/rfc/rfc4252.txt">RFC 4252</a> (formerly <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-userauth/">userauth</a>) <li><a href="http://www.ietf.org/rfc/rfc4253.txt">RFC 4253</a> (formerly <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-transport/">transport</a>) <li><a href="http://www.ietf.org/rfc/rfc4254.txt">RFC 4254</a> (formerly) </ulwww.ietf.org/rfc/rfc4256.txt">RFC 4256</a> (formerly <a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-auth-kbdinteract/">auth-kbdinteract</a>) Revision-number: 6513 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 17 It's a new year. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-01-08T18:18:11.273874Z PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c7d246ddcea995c7de7fda096339875d Text-delta-base-sha1: 78d29552146d1f3cf9493f6c658da5421adcf6ea Text-content-length: 44 Text-content-md5: 60f404fcca9f7f2950f8fe187bd66752 Text-content-sha1: de20a241c0ce5d3b98fe5690495dd1c3d404c4dc Content-length: 44 SVN���cPuTTY is copyright 1997-2006 Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 39d1598209313d350db94bca7aebbcba Text-delta-base-sha1: de11c5587bf47671e24c30367dc2226a6d26a5a3 Text-content-length: 22 Text-content-md5: 8e5a65f966d8f01695e34559ae66e40c Text-content-sha1: 8e9ab98f9a237e3f0fe30963efcc6d75c16684c1 Content-length: 22 SVN��bb �R��S6 Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5753a03dde01c4c08c73bf6ccc5f1d26 Text-delta-base-sha1: db0a1c9fc4365d28eb347dd72c325d2ecb5af735 Text-content-length: 20 Text-content-md5: 301f1189a17e9471a9b09d9f9929af40 Text-content-sha1: 2971c95b5049ac909a4e89dcf1c32080aa675e75 Content-length: 20 SVN��RR�j��gk6 Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6903653742ce5e0a71badbfa8b36554a Text-delta-base-sha1: 47762f5455f4d3bb380eec5be669f20b050396e6 Text-content-length: 34 Text-content-md5: 38615e3beeaf1fa285cc5113b7a33094 Text-content-sha1: d0dbf14df398f277cebf33e6a186b19e31b9f268 Content-length: 34 SVN��QQ���a�_r66 Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3023c1af31c0b8825f085c4453108a60 Text-delta-base-sha1: b23c56c5bd1f7dae376c8e99562ee4bfc618487d Text-content-length: 29 Text-content-md5: d0f7dc557ad14bf7c9c89352af7cc786 Text-content-sha1: 0f1e1a6bda604bff792cb894aabd0b01136e6815 Content-length: 29 SVN��zz�>��[?�_66 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df48db7bad562f74dd47d2ed6f036f5c Text-delta-base-sha1: 4f9a1977fac3ef8c36fb61d4be301b8ff1ed1705 Text-content-length: 34 Text-content-md5: 413c39c6e082d2b75e1ab63f4056a215 Text-content-sha1: 60fbd16b3dea84d2dde4e53319fd1667d58c5761 Content-length: 34 SVN��$$�9��B:�'}66 Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e34c2ae5654a9fc7fb15aae707f21390 Text-delta-base-sha1: 486f5da7eae22e6c3698fc49b73b7158cae67ceb Text-content-length: 29 Text-content-md5: 365d3e982d7c7abbd42a536eec17041e Text-content-sha1: 13c7772fa27dc982908e7871c73b1d41f45d600d Content-length: 29 SVN��}}�-��L.�{66 Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1386d21143ca8f49700d5897cdfd5aec Text-delta-base-sha1: a814b5b118bce02ff6a8d7dbc81c1da0233709a7 Text-content-length: 29 Text-content-md5: 606b22d3fe4f7b81bd5ff8359838bd1e Text-content-sha1: 862abe8fdf1a742f2a0ec776ba43afe0c3b3e40e Content-length: 29 SVN��55�d��Le�266 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 979419d0678a819f3099278d0c920128 Text-delta-base-sha1: f06fe6e1918b2a5921a254a4120d15c79267e6d1 Text-content-length: 22 Text-content-md5: eae156c95ea2f561e90d2900b184c66a Text-content-sha1: c1fcb9cbf7c4653a8be82903dabce1728f6b6f28 Content-length: 22 SVN��zz ���u6 Node-path: putty/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e3fdc356789a96408a3c230da1c85ee4 Text-delta-base-sha1: 9894a4305e754e22cafb07b5052084ddd821cdf5 Text-content-length: 29 Text-content-md5: 9321ce36a7140fafad3a744e060638c4 Text-content-sha1: 5be935d8c1ec52fc1b7a50ff9f3514d37be0472a Content-length: 29 SVN��ff�k��Cl�6066 Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e7bec7f2e62751ea96b87fb83b3e103 Text-delta-base-sha1: 25debdc1f46574944364301e6c1edcff603db897 Text-content-length: 22 Text-content-md5: fa25cb1d2704e8af34b3df3666ab8527 Text-content-sha1: 33cb9a1672b3bf15490150bc59ad662bfea72f1a Content-length: 22 SVN��WW �+��+,6 Revision-number: 6514 Prop-content-length: 147 Content-length: 147 K 7 svn:log V 49 Use the same style for SSH-2 RFCs as for others. K 10 svn:author V 3 ben K 8 svn:date V 27 2006-01-09T17:50:48.412417Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1323f58c5be4a6be2b6bfd14d50bb9e1 Text-delta-base-sha1: 01cb09fa17f49c4ee6635aef252b4a7cb7a231c2 Text-content-length: 806 Text-content-md5: d4fca0009519988250da5f9392c79605 Text-content-sha1: ef05c53fd04b650b40e701918945336345d535dc Content-length: 806 SVN�� \�*�%� b� rfc/rfc4250.txt"> RFC 4250: The Secure Shell (SSH) Protocol Assigned Numbers</a> <li><a href="http://www.ietf.org/rfc/rfc4251.txt"> RFC 4251: The Secure Shell (SSH) Protocol Architecture</a> <li><a href="http://www.ietf.org/rfc/rfc4252.txt"> RFC 4252: The Secure Shell (SSH) Authentication Protocol</a> <li><a href="http://www.ietf.org/rfc/rfc4253.txt"> RFC 4253: The Secure Shell (SSH) Transport Layer Protocol</a> <li><a href="http://www.ietf.org/rfc/rfc4254.txt"> RFC 4254: The Secure Shell (SSH) Connection Protocol</a> <li><a href="http://www.ietf.org/rfc/rfc4256.txt"> RFC 4256: Generic Message Exchange Authentication for the Secure Shell Protocol (SSH)</a<a href="http://tools.ietf.org/wg/secsh/draft-ietf-secsh-dh-group-exchange/">dh-group-exchange</a> Revision-number: 6515 Prop-content-length: 124 Content-length: 124 K 7 svn:log V 25 Fix zero-rows-cols-crash K 10 svn:author V 4 owen K 8 svn:date V 27 2006-01-10T20:02:22.750886Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8d9842f377edb12ff2b3c609ded75a1b Text-delta-base-sha1: 06e18cbe721fefabe72571ddc394561c2e6244db Text-content-length: 323 Text-content-md5: 78b43fb5e6ddc7875c3a0795685501b3 Text-content-sha1: 470caffe63acbf7c0a966801c9eeec9593bf4944 Content-length: 323 SVN�����\��V/* Behave sensibly if we're given zero (or negative) rows/cols */ if (newrows < 1) newrows = 1; if (newcols < 1) newcols = 1;�+7 �+�case 'u': /* restore cursor */ save_cursor(term, FALSE); seen_disp_event(term); break; case 't': /* DECSLPP: set page Revision-number: 6516 Prop-content-length: 104 Content-length: 104 K 8 svn:date V 27 2006-01-10T20:07:33.351664Z K 7 svn:log V 6 Fixed K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/zero-rows-cols-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0e12a6b23400830c7c6d6968f95d4fab Text-delta-base-sha1: 6948a8b91f6dcf009784707e9e6ca10caed7e7a3 Text-content-length: 39 Text-content-md5: 8f3ea74c3aac489541b69c3dcf6ace10 Text-content-sha1: 1cddbd0342157fc862c93e6865cdb87c3429adf5 Content-length: 39 SVN��Ti�l��ikFixed-in: 2006-01-10 Revision-number: 6517 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2006-01-10T22:46:42.144591Z K 7 svn:log V 29 Closing this, as threatened. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/keymap-switch Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fcf90ef6d92f110e4341af33468a20ac Text-delta-base-sha1: d125a581f6a978fbd76b99b3f04564b8d8cb3ff7 Text-content-length: 33 Text-content-md5: 9ad4a85fd2cab9343e61abefe2cf4090 Text-content-sha1: 1e60d88e6716c1d9cc6f550b810030746c9e2326 Content-length: 33 SVN��Q`�x��ZwFixed-in: 0.52 Revision-number: 6518 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2006-01-10T23:20:13.118264Z K 7 svn:log V 34 Some XP info, possibly unhelpful. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/fullscreen-taskbar Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e3b710588c4df924aab368ed9a9c468 Text-delta-base-sha1: b496758b9d51f54db86179bdce2623a386675372 Text-content-length: 285 Text-content-md5: 30c52c534fdf1e91e3dd27a48bd6f013 Text-content-sha1: b73a1cd1c4f232ad6e738ce35fa2d99652f2f686 Content-length: 285 SVN��  � � OSD: On WinXP, the behaviour differs depending on whether the taskbar is set to "always on top". If this is set, the taskbar disappears a fraction of a second after PuTTY goes full screen. If "always on top" is not set, a fullscreen PuTTY covers it immediately. Revision-number: 6519 Prop-content-length: 230 Content-length: 230 K 8 svn:date V 27 2006-01-11T23:42:02.780988Z K 7 svn:log V 130 Configurable font quality on Windows. (Together with a little bit of macro stuff to cope with the inadequacy of VC++ 6 headers.) K 10 svn:author V 4 owen PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4492cd23fceef7cc7eca1349cb678d53 Text-delta-base-sha1: c00f27de45977d59339e07de3a5abfe78f59c5a0 Text-content-length: 116 Text-content-md5: 3389095ac3f5adf00dc566ac71c2964f Text-content-sha1: 8daf3e806c123e7c6d88991d4f1d0f09352ff961 Content-length: 116 SVN��^?U��E���Inum { FQ_DEFAULT, FQ_ANTIALIASED, FQ_NONANTIALIASED, FQ_CLEARTYPEint font_quality Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 393c4a0dc65c541bdcab000b764d8c52 Text-delta-base-sha1: 2f9f67a74e9b9c13a50fcceca4cdd8595584750e Text-content-length: 97 Text-content-md5: 3592e2449e9b70732c7d77e1c6f8f0ec Text-content-sha1: 18a9bb0ac9e5ed0f7fd6c42e136245bd29cd0c28 Content-length: 97 SVN��rtC�*��Y�.DQuality", cfg->font_qualityQuality", FQ_DEFAULT, &cfg->font_quality Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85456b153a00d29fda6af13a08ecbe91 Text-delta-base-sha1: 8344e307dae9615e636a50f297abfdcb65fc051b Text-content-length: 485 Text-content-md5: bb29b65716a642b896b25c220ea043d6 Text-content-sha1: dc2da3e233a3b41f9a2e68b927ebfb6c3ab0bc42 Content-length: 485 SVN��# M�5�M�"onfigurable font quality settings for Windows. */ s = ctrl_getset(b, "Window/Appearance", "font", "Font settings"); ctrl_radiobuttons(s, "Font quality:", 'q', 2, HELPCTX(appearance_font), dlg_stdradiobutton_handler, I(offsetof(Config, font_quality)), "Antialiased", I(FQ_ANTIALIASED), "Non-Antialiased", I(FQ_NONANTIALIASED), "ClearType", I(FQ_CLEARTYPE), "Default", I(FQ_DEFAULT), NULL Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4389d1604aee705413905cd8c7c952f7 Text-delta-base-sha1: ace6869f2c09a3307f7bcda36b22c7e7ca3aefe1 Text-content-length: 237 Text-content-md5: 01a221ade641f717d556a06bcceab16e Text-content-sha1: 5c049ff68f25918bd4b2f09ff656cd6dbfce108b Content-length: 237 SVN����a� ��k�P�[TFONT_QUALITY(cfg.font_quality)FONT_QUALITY(cfg.font_quality)font_quality != prev_cfg.font_quality�_0QQ�_�rm->vt52_mode) { if (xkey >= 'P' && xkey <= 'S') p += sprintf((char *) p Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 22631b28bc8325b094b0a491ff43500c Text-delta-base-sha1: 8c92de6a1cec7f75e567b6c9ea535578ee99c643 Text-content-length: 701 Text-content-md5: e0c3cacfb77a7b269b4cbde5c53166cb Text-content-sha1: c3ddd5b37d98ec862e79a2c85a060b64a4165303 Content-length: 701 SVN��d %�e�%�Z9ifndef CLEARTYPE_QUALITY #define CLEARTYPE_QUALITY 5 #endif #define FONT_QUALITY(fq) ( \ (fq) == FQ_DEFAULT ? DEFAULT_QUALITY : \ (fq) == FQ_ANTIALIASED ? ANTIALIASED_QUALITY : \ (fq) == FQ_NONANTIALIASED ? NONANTIALIASED_QUALITY : \ CLEARTYPE_QUALITY) /* VC++ 6 doesn't have GetWindowLongPtr and friends. Degrade nicely. */ #ifndef GWLP_USERDATA #define GetWindowLongPtr GetWindowLong #define SetWindowLongPtr SetWindowLong #define GWLP_USERDATA GWL_USERDATA #define DWLP_MSGRESULT DWL_MSGRESULT #endif #define BOXFLAGS DLGWINDOWEXTRA #ifdef LONG_PTR #define BOXRESULT (DLGWINDOWEXTRA + sizeof(LONG_PTR)) #else #define BOXRESULT (DLGWINDOWEXTRA + 4) #endif Revision-number: 6520 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 28 VC6 doesn't define LONG_PTR K 10 svn:author V 4 owen K 8 svn:date V 27 2006-01-11T23:43:04.149410Z PROPS-END Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bebc106b0ed96889b3fe1c89bf304699 Text-delta-base-sha1: cbe1d73a49129b1d8310f5cc7b991db0b7901651 Text-content-length: 150 Text-content-md5: 6e189b0db533b64b128baf0d701a70c4 Text-content-sha1: 9c0c9768771ba7a92ee2348aeaff69130a78674d Content-length: 150 SVN��c }��}�^@#ifdef LONG_PTR wc.cbWndExtra = DLGWINDOWEXTRA + 2*sizeof(LONG_PTR); #else wc.cbWndExtra = DLGWINDOWEXTRA + 8; #endif Revision-number: 6521 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 30 Font quality done on Windows. K 10 svn:author V 4 owen K 8 svn:date V 27 2006-01-11T23:44:38.960933Z PROPS-END Node-path: putty-wishlist/data/font-quality Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cbf171b98b660c43e93db58e2c70bd09 Text-delta-base-sha1: 2498081498d773325068fd726bc668f2dcccd722 Text-content-length: 41 Text-content-md5: 3012e1b56c59430ecce3d4a597110eb4 Text-content-sha1: cdc61d9aed0af6cbe0fb3c42db590061e8486bc2 Content-length: 41 SVN��1F ���#Fixed-in: 2006-01-12 Revision-number: 6522 Prop-content-length: 139 Content-length: 139 K 7 svn:log V 39 Another RFC (with an unhelpful title). K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-01-12T10:23:45.844597Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4fca0009519988250da5f9392c79605 Text-delta-base-sha1: ef05c53fd04b650b40e701918945336345d535dc Text-content-length: 243 Text-content-md5: b7f8b34079c8287f902b65f4d0134d61 Text-content-sha1: bbcaa46b19252fe5e44a39123de263477ec6255b Content-length: 243 SVN��\dV�r�V�`�Arfc/rfc4344.txt"> RFC 4344: The Secure Shell (SSH) Transport Layer Encryption Modes</a> (in part) <li><a href="http://www.ietf.org/html.charters/secsh-charter.html"> IETF Secure Shell working group</a> drafts Revision-number: 6523 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2006-01-16T11:11:55.129374Z K 7 svn:log V 23 Polish PuTTY has moved K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b7f8b34079c8287f902b65f4d0134d61 Text-delta-base-sha1: bbcaa46b19252fe5e44a39123de263477ec6255b Text-content-length: 39 Text-content-md5: a227c810c164eb4ecd310b81e8f35f58 Text-content-sha1: 1e42975b2b6113e0e2f401ad90001ba6ada481bc Content-length: 39 SVN��d^ �{��Qputty.grzybicki.pl Revision-number: 6524 Prop-content-length: 208 Content-length: 208 K 8 svn:date V 27 2006-01-16T11:24:58.122271Z K 7 svn:log V 107 Kent Wick points out that the MD5 program link 3l.com is broken; removed (I can't find a new home for it). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c3d12b0475f655fa638db918bced632c Text-delta-base-sha1: 9be1fb17c81bf9cfa0a056a141e2809ff80b73d2 Text-content-length: 93 Text-content-md5: 1bb74c3a9302ed3b2bd4fefc0d97b38a Text-content-sha1: e0078a01079e019dd039949e5c5f53cae232cdc2 Content-length: 93 SVN��" D��D�?C. (This MD5 program is also cryptographically signed by its author.) Revision-number: 6525 Prop-content-length: 290 Content-length: 290 K 7 svn:log V 189 Summary: Implement SSH-2 RSA key exchange http://www.ietf.org/internet-drafts/draft-harris-ssh-rsa-kex-06.txt Now that it's in the RFC Editor's queue, it's probably safe to check it in... K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-01-17T12:39:56.828886Z PROPS-END Node-path: putty-wishlist/data/ssh2-rsa-kex Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 537 Text-content-md5: b5153e510dc425121e3a1408f9e0da11 Text-content-sha1: dabf18f0127f4793e72b1c8ed5998b175d4cc86e Content-length: 547 PROPS-END SVN���  Summary: Implement SSH-2 RSA key exchange Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body <p> <a href="http://www.ietf.org/internet-drafts/draft-harris-ssh-rsa-kex-06.txt">draft-harris-ssh-rsa-kex</a> (in the <a href="http://www.rfc-editor.org/queue.html">RFC Editor's queue</a> at the time of writing) defines a means to use RSA key exchange in SSH-2 (similar to SSH-1's key exchange, but without the other disadvantages of SSH-1). This might be particularly suitable for slow client systems. Revision-number: 6526 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2006-01-21T13:06:26.743632Z K 7 svn:log V 35 greenfabric.com actually in the US K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b6fcabe5c23b1a753acb78b8eba5ec8 Text-delta-base-sha1: ef55aeaa427b4d6941119d991dd5820710eef152 Text-content-length: 75 Text-content-md5: 4ca194bebd565b16a7d90481ff7bfe4b Text-content-sha1: 481f10c622ce2cfde0a068523e3d3f8dc5497e5c Content-length: 75 SVN��tt*�.��|%�M{�S!greenfabric.com/mirror-putty/">greenfabric Revision-number: 6527 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2006-01-23T21:13:30.158366Z K 7 svn:log V 47 Argue that it's probably not worth the hassle. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/idn Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b45267587e588c39dec0216ace6a39ca Text-delta-base-sha1: 4a2833ab9f44a9092c637e0ea06e90066b3d22b6 Text-content-length: 620 Text-content-md5: 8fccf3d6775c11a28ed5b411252da5af Text-content-sha1: 170b61cd3f250b73d4ad21237033377b36ea9e07 Content-length: 620 SVN��nGY�n�Y <p> It's not clear that IDN support in PuTTY is worth the developer effort or the binary space, given that (presumably) you can just type <tt>xn--</tt>whatever into the "host name" box. With (say) a web browser, it is normal to want to access lots of different web sites you've never visited before, whose addresses you've got off a cereal packet, and so on; the domain name is a relatively important part of the process. With PuTTY, you typically access a small number of sites with which you have prior arrangements, and often you just put the domain name into a saved session and forget about it. Revision-number: 6528 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2006-01-24T11:08:34.498798Z K 7 svn:log V 33 s/PuTTY/PuTTYgen/ in two places. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef499568a893b153af99677c97a8c1ce Text-delta-base-sha1: 66fa5fe26cecda53af37b74c02907cbf57eb6bc0 Text-content-length: 35 Text-content-md5: 0cc7e997185867f24fa82f7112bc4c2c Text-content-sha1: e649c18b9ba42077518b26c38e4b05caff75a55e Content-length: 35 SVN��ci���y�Rgengen Revision-number: 6529 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2006-01-24T11:14:48.019243Z K 7 svn:log V 48 draft-harris-ssh-arcfour-fixes is now RFC 4345. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a227c810c164eb4ecd310b81e8f35f58 Text-delta-base-sha1: 1e42975b2b6113e0e2f401ad90001ba6ada481bc Text-content-length: 135 Text-content-md5: b4462d14ab48bac420e0beb6edd01ced Text-content-sha1: 039090845d531781842f07544a9db25efd358b20 Content-length: 135 SVN��^tl�s�l�oQ�&8rfc/rfc4345.txt"> RFC 4345: Improved Arcfour Modes for the Secure Shell (SSH) Transport Layer Protocol</a> Node-path: putty-wishlist/data/arcfour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ac96bb441c6872df84fcc3e3fb80475f Text-delta-base-sha1: 5007b5781b56c3d10c393cd811bc881371bf17fc Text-content-length: 114 Text-content-md5: d8c91c5fdee80655581633a0be1d2268 Text-content-sha1: 31ea31527695f2f6d26ff8a3db0866ee3f633031 Content-length: 114 SVN��nI \�U�\�V (draft-harris-ssh-arcfour-fixes, now <a href="http://www.ietf.org/rfc/rfc4345.txt">RFC 4345 Revision-number: 6530 Prop-content-length: 194 Content-length: 194 K 8 svn:date V 27 2006-01-24T22:47:43.480995Z K 7 svn:log V 94 +securehost.com +putty.mirroarrr.de +putty.n9.ru |putty.huewenet.de -> putty.huewebrothers.de K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ca194bebd565b16a7d90481ff7bfe4b Text-delta-base-sha1: 481f10c622ce2cfde0a068523e3d3f8dc5497e5c Text-content-length: 213 Text-content-md5: 149f38f974f589af4b037d1ce24fd0fa Text-content-sha1: e98ef7580864cc1a3e503c6476cf66d207821ae1 Content-length: 213 SVN��tS,�k��E�>q�S��5�S��9%�Iy�Xsecurehost.com/mirror/putty/">securehost.com</a> in the Bahamaswww.putty.mirroarrr.de/">putty.mirroarrrbrothers.de/">putty.huewebrothersn9.ru/">putty.n9.ru Revision-number: 6531 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2006-01-25T15:55:22.919565Z K 7 svn:log V 32 Original submitter confirms fix K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/drop-banner Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cd7a19e31aace71c0c0e7ffd6950bd4e Text-delta-base-sha1: 92e3c4536fde594769cac5958f242b527590b5fb Text-content-length: 144 Text-content-md5: 280ace677234f83dbae646117bbcc23c Text-content-sha1: 10a79ed38c2c63bc5b78a4bad141c2b4128978a1 Content-length: 144 SVN��f�g�Our original correspondent (using the <a href="http://www.bitvise.com/winsshd.html">WinSSHD</a> server) has confirmed the fix. Revision-number: 6532 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2006-01-25T21:20:23.364222Z K 7 svn:log V 17 Can't reproduce. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/xp-stickykeys-breaks-capslock Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec244f617d479ed9529adac172ef7b0d Text-delta-base-sha1: ad94128a2aa4e3ff408b84647ab380deb39ab610 Text-content-length: 147 Text-content-md5: fa8cee6c144eed71ab55fbbafc23be25 Text-content-sha1: 2abc05820c0ff4056f626b0d11e806c6119e9ce1 Content-length: 147 SVN��cc��c��OSD: I can't now reproduce this with XP SP2 and any version of PuTTY including the versions it was originally reported against. Revision-number: 6533 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2006-01-25T22:46:33.355885Z K 7 svn:log V 137 Don't explicitly open the logfile on startup; it'll automatically be opened by logwrite() as necessary. Should fix win-askappend-multi. K 10 svn:author V 4 owen PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 01a221ade641f717d556a06bcceab16e Text-delta-base-sha1: 5c049ff68f25918bd4b2f09ff656cd6dbfce108b Text-content-length: 131 Text-content-md5: 4513b6f141afa625bfafed6161cfa9be Text-content-sha1: 283b570a3df807f82bd16ccafdf6bb19aa9003d4 Content-length: 131 SVN����X� ��bXrm->vt52_mode) { if (xkey >= 'P' && xkey <= 'S') p += sprintf((char *) p, "\x1B�0X��XX Revision-number: 6534 Prop-content-length: 115 Content-length: 115 K 7 svn:log V 15 I'm convinced. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-01-27T10:57:08.332032Z PROPS-END Node-path: putty-wishlist/data/win-askappend-multi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f537f17480bba5c149bcdd19b86d761a Text-delta-base-sha1: b989bc14366f617571a97fbeba96d33965259df3 Text-content-length: 39 Text-content-md5: 743f4584b6266dbafe0afe955979c4a4 Text-content-sha1: db202f8830f1f3d887531d33428c1284bf8e0b5d Content-length: 39 SVN��Sh�k��ijFixed-in: 2006-01-26 Revision-number: 6535 Prop-content-length: 366 Content-length: 366 K 7 svn:log V 265 Somewhat gruesome tweak to use SetClassLongPtr where available and degrade nicely elsewhere, which should fix `win64' _properly_. Tested on recent-ish MinGW (with GetWindowLongPtr but not GetClassLongPtr), and VC++ 6.0 with a recent SDK, but not with vanilla VC++. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-01-27T20:49:59.106232Z PROPS-END Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e189b0db533b64b128baf0d701a70c4 Text-delta-base-sha1: 9c0c9768771ba7a92ee2348aeaff69130a78674d Text-content-length: 80 Text-content-md5: bebc106b0ed96889b3fe1c89bf304699 Text-content-sha1: cbe1d73a49129b1d8310f5cc7b991db0b7901651 Content-length: 80 SVN��c 8���^ wc.cbWndExtra = DLGWINDOWEXTRA + 2*sizeof(LONG_PTR); Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4513b6f141afa625bfafed6161cfa9be Text-delta-base-sha1: 283b570a3df807f82bd16ccafdf6bb19aa9003d4 Text-content-length: 84 Text-content-md5: 628fb71bb4261d04b6b8bea538edc0a9 Text-content-sha1: 4435cb4e45631610459cd8ea626bb0b923d1f7d6 Content-length: 84 SVN���� !�n��qPtr(hwnd, GCLP_HCURSOR, (LONG_PTR�X`�X�p, "\x1B Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e0c3cacfb77a7b269b4cbde5c53166cb Text-delta-base-sha1: c3ddd5b37d98ec862e79a2c85a060b64a4165303 Text-content-length: 1069 Text-content-md5: bd28950b833ab796601024960a508e63 Text-content-sha1: 3440e34a918ece4e879b85291aff8089fec41a7f Content-length: 1069 SVN��dd �u��Z * Where we can, we use GetWindowLongPtr and friends because they're * more useful on 64-bit platforms, but they're a relatively recent * innovation, missing from VC++ 6 and older MinGW. Degrade nicely. * (NB that on some systems, some of these things are available but * not others...) */ #ifndef GCLP_HCURSOR /* GetClassLongPtr and friends */ #undef GetClassLongPtr #define GetClassLongPtr GetClassLong #undef SetClassLongPtr #define SetClassLongPtr SetClassLong #define GCLP_HCURSOR GCL_HCURSOR /* GetWindowLongPtr and friends */ #undef GetWindowLongPtr #define GetWindowLongPtr GetWindowLong #undef SetWindowLongPtr #define SetWindowLongPtr SetWindowLong #undef GWLP_USERDATA #define GWLP_USERDATA GWL_USERDATA #undef DWLP_MSGRESULT #define DWLP_MSGRESULT DWL_MSGRESULT /* Since we've clobbered the above functions, we should clobber the * associated type regardless of whether it's defined. */ #undef LONG_PTR #define LONG_PTR LONG #endif #define BOXFLAGS DLGWINDOWEXTRA #define BOXRESULT (DLGWINDOWEXTRA + sizeof(LONG_PTR)) Node-path: putty-wishlist/data/win64 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cbbd7203321ae1b96708c32c7e83a2a5 Text-delta-base-sha1: 210c5822482237de5867e434d4a3e7733ea774f3 Text-content-length: 34 Text-content-md5: 10195023165e3efb5f09a1627ac78cd2 Text-content-sha1: c5e1a7c49d1846a43db465841fdda0ad7cf0e635 Content-length: 34 SVN��XI�`��Zo6535 2006-01-28 Revision-number: 6536 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:05.980365Z PROPS-END Revision-number: 6537 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:05.990840Z PROPS-END Revision-number: 6538 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:06.002838Z PROPS-END Revision-number: 6539 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2006-02-01T10:34:56.236246Z K 7 svn:log V 26 Another day, another RFC. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b4462d14ab48bac420e0beb6edd01ced Text-delta-base-sha1: 039090845d531781842f07544a9db25efd358b20 Text-content-length: 135 Text-content-md5: 0f918281bd3aaa2012c18d09fe31f86c Text-content-sha1: 3f088fc2de4cb2f27bccd06264952e116e07293f Content-length: 135 SVN��tg�u�K�;F�E<�A335.txt"> RFC 4335: The Secure Shell (SSH) Session Channel Break Extensionpublickeyfile/">publickeyfil Revision-number: 6540 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:06.847440Z PROPS-END Revision-number: 6541 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:06.869009Z PROPS-END Revision-number: 6542 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:06.884226Z PROPS-END Revision-number: 6543 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2006-02-08T13:04:28.320620Z K 7 svn:log V 75 Summary: Window close button disabled after login on Windows XP Class: bug K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/close-button-disabled Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 761 Text-content-md5: 8e8db99de5e02f025dd7ca9c83eb8803 Text-content-sha1: 251794ee9908bcdc9b35c9f7b0b1f326ad4e49cc Content-length: 771 PROPS-END SVN���kkkSummary: Window close button disabled after login on Windows XP Class: bug Present-in: 0.58 2006-02-08 r6542 Content-type: text/x-html-body <p> We've had a couple of reports that the `Close' button (the `X' on the top right of the window) is disabled on PuTTY windows, as is the corresponding window/context menu entry. <p> Reports indicate that the close button is greyed sometime during authentication. <p> All the reports so far have been on Windows XP, which none of the team use on a regular basis. <p> Reports: <ul> <li><tt>907bea850601101820q7fe3d254u53a5c20ebb5e291a@mail.gmail.com</tt> <br>WinXP, after password <li><tt>17385.23341.166602.254784@brand.scrye.com</tt> <br>WinXP, X11 forwarding, Duplicate Session, after username </ul> Revision-number: 6544 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:06.958877Z PROPS-END Revision-number: 6545 Prop-content-length: 177 Content-length: 177 K 7 svn:log V 77 Rename this bug to be more appropriate. (It's not been on the web for long.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-02-09T23:01:39.020263Z PROPS-END Node-path: putty-wishlist/data/virt-dim-menu-trouble Node-kind: file Node-action: add Node-copyfrom-rev: 6544 Node-copyfrom-path: putty-wishlist/data/close-button-disabled Text-copy-source-md5: 8e8db99de5e02f025dd7ca9c83eb8803 Text-copy-source-sha1: 251794ee9908bcdc9b35c9f7b0b1f326ad4e49cc Node-path: putty-wishlist/data/close-button-disabled Node-action: delete Revision-number: 6546 Prop-content-length: 348 Content-length: 348 K 8 svn:date V 27 2006-02-09T23:06:57.840375Z K 7 svn:log V 247 Users of Virtual Dimension are reporting that the "Close" menu item and button tend to get disabled on login. After a suggestion by "Tkil", change the way we handle the specials menu to be robust against the window menu being externally modified. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 628fb71bb4261d04b6b8bea538edc0a9 Text-delta-base-sha1: 4435cb4e45631610459cd8ea626bb0b923d1f7d6 Text-content-length: 1195 Text-content-md5: 6c846de380c0e4c5a30606f29c7d509d Text-content-sha1: d7c33355e676f7e10ef05096621b81e00d0ed461 Content-length: 1195 SVN����LA�I�� GE�_g�fd�8 �u�4]�j|�gj�Wn�E;q#define IDM_SPECIALSEP 0x020 = NULL; static HMENU specials_menu = NULL; static int n_specials = 0new_menunew_menunew_menu, MF_SEPARATOR, 0, 0); break; case TS_SUBMENU: assert(nesting < 2); nesting++; saved_menu = new_menu; /* XXX lame stacking */ new_menu = CreatePopupMenu(); AppendMenu(saved_menu, MF_POPUP | MF_ENABLED, (UINT) new_menu, specials[i].name); break; case TS_EXITMENU: nesting--; if (nesting) { new_menunew_menunew_menu = NULL; n_specials = 0; } for (j = 0; j < lenof(popup_menus); j++) { if (specials_menu specials_menu, MF_BYCOMMAND); DeleteMenu(popup_menus[j].menu, IDM_SPECIALSEP, MF_BYCOMMAND); } if (specials) { InsertMenu(popup_menus[j].menu, IDM_SHOWLOG, MF_BYCOMMAND | MF_POPUP | MF_ENABLED, (UINT) new_menu, "S&pecial Command"); InsertMenu(popup_menus[j].menu, IDM_SHOWLOG, MF_BYCOMMAND | MF_SEPARATOR, IDM_SPECIALSEP, 0); } specials_menu = new_menu;p, "\x1B%c", xkey); else p += sprintf((char *) p, "\x1B?%c", xkey); } else p += sprintf((char *)�`o��oq Node-path: putty-wishlist/data/virt-dim-menu-trouble Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e8db99de5e02f025dd7ca9c83eb8803 Text-delta-base-sha1: 251794ee9908bcdc9b35c9f7b0b1f326ad4e49cc Text-content-length: 678 Text-content-md5: a5a3bb9bf715e2c73bd0eb61b60241d1 Text-content-sha1: bfddcf7bfcbae2e169e18b1f651cada2b8b8d57c Content-length: 678 SVN��kp �p?R�rySummary: Window close button disabled with Virtual Dimensionfrom users of <a href="http://virt-dimension.sourceforge.net/">Virtual Dimension</a> that the `Close' button (the `X' on the top right of the window) is disabled on PuTTY windows, as is the corresponding window/context menu entry. Reports indicate that the close button is greyed sometime during authentication. <p> It looks like the way PuTTY is manipulating the window menu (which it does after a successful SSH login, to update the "Special Commands" menu) is clashing with the way Virtual Dimension is manipulating the same menu. r6546 changes the way we handle the "Special Commands" menu Revision-number: 6547 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2006-02-10T20:57:40.253651Z K 7 svn:log V 121 Oops. Since r6546, old "Special Commands" menus weren't being deleted from the context menu, and they tended to pile up. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6c846de380c0e4c5a30606f29c7d509d Text-delta-base-sha1: d7c33355e676f7e10ef05096621b81e00d0ed461 Text-content-length: 104 Text-content-md5: 8ff50c1919abfe723ed6f9a8a6a5bc8c Text-content-sha1: 4887f395d180ebc6a382d933d3e1757df27e267c Content-length: 104 SVN����.�%��N@�2~�-Pnew_menu) { } specials_menu = new_menu;�or�o� *) Revision-number: 6548 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2006-02-10T22:49:13.998638Z K 7 svn:log V 41 Link directly to draft on RFC queue page K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-rsa-kex Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b5153e510dc425121e3a1408f9e0da11 Text-delta-base-sha1: dabf18f0127f4793e72b1c8ed5998b175d4cc86e Text-content-length: 46 Text-content-md5: 497d1f7b3d51a7a8f2403d143e170854 Text-content-sha1: 6ae484cccbc2198ad07a7b69ca2027b7a03359b3 Content-length: 46 SVN�� $ ���p#draft-harris-ssh-rsa-kex Revision-number: 6549 Prop-content-length: 367 Content-length: 367 K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-02-11T18:00:23.613034Z K 7 svn:log V 266 A zero-length return from platform_get_x_display() (for instance, a zero-length DISPLAY variable in the environment) caused an assertion failure when X11 forwarding was attempted. Fixed (now treated the same as a NULL return, e.g., a non-existent DISPLAY variable). PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a54328a687bddc81bfa4a948d0889a47 Text-delta-base-sha1: 5bf2df855afecb9bcba5b33fe7a5a59f894f73f9 Text-content-length: 30 Text-content-md5: 2c899ade28ea7f73543091170ee853c8 Text-content-sha1: 27c1931adb939668b7549cd8c580ed74aa3694ce Content-length: 30 SVN��HQ �I��I || !*ret Revision-number: 6550 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2006-02-11T18:29:55.458429Z K 7 svn:log V 74 Failure to connect to a Unix-domain socket could cause a segfault. Fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b694efc1348663c5cb0883affc8b6940 Text-delta-base-sha1: be5ea771e34bbdc9139ea3f2bb9ea437ec18fb7a Text-content-length: 149 Text-content-md5: 834a87a6c852f80b7b3582e061c99b7d Text-content-sha1: c7b1e6bef9dcaf57545e4f4a9a2a5d51951ade1c Content-length: 149 SVN��|; {�.��&w && = ret->ais = NULL; #else ret->addresses = NULL; ret->curraddr = ret->naddresses = 0; #endif return ret; } Revision-number: 6551 Prop-content-length: 323 Content-length: 323 K 7 svn:log V 222 Don Heap spotted that our heuristics for dealing with IPv6 literal addresses in the PSCP command line were bogus, giving "remote to remote not supported" errors with filenames like '[].txt'. Made the heuristic less bogus. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-02-11T19:10:01.189888Z PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 489554e15234f9c91f5617d49c687df6 Text-delta-base-sha1: 0b759298fc219f40e4a8ffe14791c0441b5a7e11 Text-content-length: 378 Text-content-md5: 6cf33de0fc69bfa99438fded14cfecf4 Text-content-sha1: acd417123535e3f488eccdec7a3eca765b464ae5 Content-length: 378 SVN��!fZ���M,Z�:g (str[0] != '[' && str[1] == ':')) return (NULL); while (*str != '\0' && *str != ':' && *str != '/' && *str != '\\') { if (*str == '[') { /* Skip over IPv6 literal addresses * (eg: 'jeroen@[2001:db8::1]:myfile.txt') */ char *ipv6_end = strchr(str, ']'); if (ipv6_end) { str = ipv6_end; } } str++; } Revision-number: 6552 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2006-02-11T19:29:30.418027Z K 7 svn:log V 115 One of the reporters turns out to be trying to use 9999999999, 99999999999, or 999999999999 lines of scrollback(!) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/assert-fail-newsavelines Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c9f9e48f1e6d04d89025645152f50578 Text-delta-base-sha1: f55083ca14897308efee5f94dbc37a2fab15c531 Text-content-length: 203 Text-content-md5: 842e90045f04d306285f3e33cb410107 Text-content-sha1: b0135ffad034410abc6bd5608b9862933c8fac72 Content-length: 203 SVN��^8�W�8<br>Apparently this person was attempting to use 9999999999 lines of scrollback or thereabouts. Don't Do That, Then. (I suppose we should be robust against that sort of thing.) </ul> Revision-number: 6553 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2006-02-11T19:52:41.548871Z K 7 svn:log V 138 Reproduced, with _negative_ scrollback setting; and on Windows at least, a large positive scrollback can end up as a negative one. *sigh* K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/assert-fail-newsavelines Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 842e90045f04d306285f3e33cb410107 Text-delta-base-sha1: b0135ffad034410abc6bd5608b9862933c8fac72 Text-content-length: 712 Text-content-md5: e5f34ed924073a39fd2e0aaa2911d6bb Text-content-sha1: ee9e41a423c8be5b6b681eac84fddceaadbc9a2b Content-length: 712 SVN��W /�H��`vThe only way we've found to reproduce this assertion failure is by configuring a <em>negative</em> number of lines in the scrollback. If the magnitude of the negative number is large, we see the delay at startup too. <p> On some platforms (including Windows), a very large <em>positive</em> scrollback setting can end up treated as a negative one, triggering this. This can happen for scrollback sizes of 2<sup>31</sup> (2147483648) or greater. (You'd probably run out of physical memory before filling up such a ridiculously large scrollback buffer!) So don't do that, then. <p> We should probably be robust against silly configurations like thi, very large scrollback setting </ul> Revision-number: 6554 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2006-02-11T20:46:32.711177Z K 7 svn:log V 26 More mirrors (de, ie, uk) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 149f38f974f589af4b037d1ce24fd0fa Text-delta-base-sha1: e98ef7580864cc1a3e503c6476cf66d207821ae1 Text-content-length: 345 Text-content-md5: 4b5989e85fc2bce350ba9006fd239e71 Text-content-sha1: 904be12dc13031875416082591023b69a160767f Content-length: 345 SVN��S8-�-��J}�J}�-� �O:�I@�L=�Zyputty.linux-mirror.org/">putty.linux-mirror.orgwww.very-clever.com/putty/">very-clever.computty.oss-mirror.org/">putty.oss-mirror.org</a> in Irelandwww.forgottencity.co.uk/puttymirror/">forgottencityputty.silentflame.com/">putty.silentflame.commirror.drem.org.uk/putty/">mirror.drem.org Revision-number: 6555 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2006-02-13T22:18:17.416861Z K 7 svn:log V 77 Preserve more attributes of text copied as RTF. Thanks to Stephen Balousek. K 10 svn:author V 4 owen PROPS-END Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f0f1992234cc8f5ab7932574057e0a8f Text-delta-base-sha1: 9e6677302671e20e54a0611061b14e30a4da898b Text-content-length: 31 Text-content-md5: 4c888cf6bd0ffda80cf2583251262a97 Text-content-sha1: 62072d46bdb2e5f48f5d1ef6f678b1e2c1133a6e Content-length: 31 SVN��$ ��� *attr Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b0101ff2410bec1743332153888193d6 Text-delta-base-sha1: d31266da392a4303b1fd32c7e9ccc0fc90478b34 Text-content-length: 74 Text-content-md5: 9d255fa2bad15cb39c7bed1398587a77 Text-content-sha1: 20d7631245595fef8d9c2bddec54ee0b3958fa6f Content-length: 74 SVN��R],�|��R|�codata, int *arttr, int len, int must_deselect Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3389095ac3f5adf00dc566ac71c2964f Text-delta-base-sha1: 8daf3e806c123e7c6d88991d4f1d0f09352ff961 Text-content-length: 25 Text-content-md5: 5dce159e14301caf4840febb31fe9171 Text-content-sha1: 62f075d846c7867221f9b749107572a3d967e23f Content-length: 25 SVN��?F ��S��sL Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 78b43fb5e6ddc7875c3a0795685501b3 Text-delta-base-sha1: 470caffe63acbf7c0a966801c9eeec9593bf4944 Text-content-length: 606 Text-content-md5: 08399e3a4e5f76c6b0470414de165d5a Text-content-sha1: f87ca3b9f5c6f45bd7a0ed8e16c47ff3af815ab1 Content-length: 606 SVN���������7"-�^�.�4h�c�W$�:y� . int *attrbuf; /* Attribute buffer */ int *attrptr; int attr; buflen = 5120; /* Default size */ workbuf = snewn(buflen, wchar_t); attrbuf = buflen ? snewn(buflen, int) : 0; wbptr = workbuf; /* start filling here */ attrptr = attrbuf; attr = ldata->chars[x].att attrbuf = sresize(attrbuf, buflen, int); attrptr = attrbuf + wblen; } wblen++; *wbptr++ = *p; *attrptr++ = attr *attrptr++ = 0attr Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a43b77e5bf3ebd7267b7aaf2fa09b0f7 Text-delta-base-sha1: 04e7ef669c6e34cd14731c67e1d6dfce80de9f2f Text-content-length: 56 Text-content-md5: 5b8db30f4176271f96b308ee76e9cc22 Text-content-sha1: 9e39d01f8fc853e3a4dcb2573155302429516c2f Content-length: 56 SVN���� ���\*attr�q| �q� { GtkWid Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ff50c1919abfe723ed6f9a8a6a5bc8c Text-delta-base-sha1: 4887f395d180ebc6a382d933d3e1757df27e267c Text-content-length: 5090 Text-content-md5: 5ceecd5ff124c195b6912bcbf6b7e45f Text-content-sha1: dfcf80a5d84bcb447c0bbc6877d73619a035ed96 Content-length: 5090 SVN���������rY3�W��XQ6�j'U�o�)"y�s�h *attr int fgcolour, lastfgcolour = 0; int bgcolour, lastbgcolour = 0; int attrBold, lastAttrBold = 0; int attrUnder, lastAttrUnder = 0; int palette[NALLCOLOURS]; int numcoloursrtflen = sprintf(rtf, "{\\rtf1\\ansi\\deff0{\\fonttbl\\f0\\fmodern %s;}\\f0\\fs%d", cfg.font.name, cfg.font.height*2); /* * Add colour palette * {\colortbl ;\red255\green0\blue0;\red0\green0\blue128;} */ /* * First - Determine all colours in use * o Foregound and background colours share the same palette */ if (attr) { memset(palette, 0, sizeof(palette)); for (i = 0; i < (len-1); i++) { fgcolour = ((attr[i] & ATTR_FGMASK) >> ATTR_FGSHIFT); bgcolour = ((attr[i] & ATTR_BGMASK) >> ATTR_BGSHIFT); if (attr[i] & ATTR_REVERSE) { int tmpcolour = fgcolour; /* Swap foreground and background */ fgcolour = bgcolour; bgcolour = tmpcolour; } if (bold_mode == BOLD_COLOURS && (attr[i] & ATTR_BOLD)) { if (fgcolour < 8) /* ANSI colours */ fgcolour += 8; else if (fgcolour >= 256) /* Default colours */ fgcolour ++; } if (attr[i] & ATTR_BLINK) { if (bgcolour < 8) /* ANSI colours */ bgcolour += 8; else if (bgcolour >= 256) /* Default colours */ bgcolour ++; } palette[fgcolour]++; palette[bgcolour]++; } /* * Next - Create a reduced palette */ numcolours = 0; for (i = 0; i < NALLCOLOURS; i++) { if (palette[i] != 0) palette[i] = ++numcolours; } /* * Finally - Write the colour table */ rtf = sresize(rtf, rtfsize + (numcolours * 25), char); strcat(rtf, "{\\colortbl ;"); rtflen = strlen(rtf); for (i = 0; i < NALLCOLOURS; i++) { if (palette[i] != 0) { rtflen += sprintf(&rtf[rtflen], "\\red%d\\green%d\\blue%d;", defpal[i].rgbtRed, defpal[i].rgbtGreen, defpal[i].rgbtBlue); } } strcpy(&rtf[rtflen], "}"); rtflen ++; } } /* * Set text attributes */ if (attr) { if (rtfsize < rtflen + 64) { rtfsize = rtflen + 512; rtf = sresize(rtf, rtfsize, char); } /* * Determine foreground and background colours */ fgcolour = ((attr[tindex] & ATTR_FGMASK) >> ATTR_FGSHIFT); bgcolour = ((attr[tindex] & ATTR_BGMASK) >> ATTR_BGSHIFT); if (attr[tindex] & ATTR_REVERSE) { int tmpcolour = fgcolour; /* Swap foreground and background */ fgcolour = bgcolour; bgcolour = tmpcolour; } if (bold_mode == BOLD_COLOURS && (attr[tindex] & ATTR_BOLD)) { if (fgcolour < 8) /* ANSI colours */ fgcolour += 8; else if (fgcolour >= 256) /* Default colours */ fgcolour ++; } if (attr[tindex] & ATTR_BLINK) { if (bgcolour < 8) /* ANSI colours */ bgcolour += 8; else if (bgcolour >= 256) /* Default colours */ bgcolour ++; } /* * Collect other attributes */ if (bold_mode != BOLD_COLOURS) attrBold = attr[tindex] & ATTR_BOLD; else attrBold = 0; attrUnder = attr[tindex] & ATTR_UNDER; /* * Reverse video * o If video isn't reversed, ignore colour attributes for default foregound * or background. * o Special case where bolded text is displayed using the default foregound * and background colours - force to bolded RTF. */ if (!(attr[tindex] & ATTR_REVERSE)) { if (bgcolour >= 256) /* Default color */ bgcolour = -1; /* No coloring */ if (fgcolour >= 256) { /* Default colour */ if (bold_mode == BOLD_COLOURS && (fgcolour & 1) && bgcolour == -1) attrBold = ATTR_BOLD; /* Emphasize text with bold attribute */ fgcolour = -1; /* No coloring */ } } /* * Write RTF text attributes */ if (lastfgcolour != fgcolour) { lastfgcolour = fgcolour; rtflen += sprintf(&rtf[rtflen], "\\cf%d ", (fgcolour >= 0) ? palette[fgcolour] : 0); } if (lastbgcolour != bgcolour) { lastbgcolour = bgcolour; rtflen += sprintf(&rtf[rtflen], "\\highlight%d ", (bgcolour >= 0) ? palette[bgcolour] : 0); } if (lastAttrBold != attrBold) { lastAttrBold = attrBold; rtflen += sprintf(&rtf[rtflen], "%s", attrBold ? "\\b " : "\\b0 "); } if (lastAttrUnder != attrUnder) { lastAttrUnder = attrUnder; rtflen += sprintf(&rtf[rtflen], "%s", attrUnder ? "\\ul " : "\\ulnone "); } } rtf[rtflen++] = '}'; /* Terminate RTF stream */ rtf[rtflen++] = '\0'; rtf[rtflen++] = '\0'memcpy(lock3, rtf, rtflen Revision-number: 6556 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2006-02-13T22:22:33.015858Z K 7 svn:log V 29 Note changes to RTF pasting. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/paste-fidelity Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 868c35a6c217ad3dc778cd3e2e6fe2d0 Text-delta-base-sha1: bdf3c28c813646b5cb3b89e210813f025bd7ce19 Text-content-length: 115 Text-content-md5: 4470320d9207cfe5232536e663870282 Text-content-sha1: 0d41c3c27cd02545a4b180bf54197d182f7ce679 Content-length: 115 SVN��r ]��]�<strong>Update:</strong> Since r6555 pasting in RTF now includes colour and style information Revision-number: 6557 Prop-content-length: 152 Content-length: 152 K 10 svn:author V 4 owen K 8 svn:date V 27 2006-02-13T22:25:59.271127Z K 7 svn:log V 53 RTF pasting now includes colours and style. Say so. PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a7e4f4d1437c2b27d5f93b9d1641821c Text-delta-base-sha1: 1a3bacbd868486fc98997614f050aac4fb15eed2 Text-content-length: 231 Text-content-md5: 5375f783ad2c8a7de8dabff060778e49 Text-content-sha1: 4e7f8ec90bc04392a7f0ac5f7dcf19fc3ee7f405 Content-length: 231 SVN����3�q��oM�mQThe effect of this is, \i{colour}, and style (e.g. bold, underline) PuTTY was using to display it.) You can add or modify a mode by selecting it from the drop-down list, choosin�S��Q Revision-number: 6558 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 44 Typo in r6555 spotted by Daniel Meidlinger. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-02-14T13:14:08.494424Z PROPS-END Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d255fa2bad15cb39c7bed1398587a77 Text-delta-base-sha1: 20d7631245595fef8d9c2bddec54ee0b3958fa6f Text-content-length: 61 Text-content-md5: 3511add8c99581ec7e463df266046765 Text-content-sha1: 36f9e3d784c71d912ebea7264d3a3d16a8169095 Content-length: 61 SVN��]\���R|�czttr, int len, int must_deselect Revision-number: 6559 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2006-02-14T20:22:11.796860Z K 7 svn:log V 23 Fix confirmed, hurrah. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/virt-dim-menu-trouble Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a5a3bb9bf715e2c73bd0eb61b60241d1 Text-delta-base-sha1: bfddcf7bfcbae2e169e18b1f651cada2b8b8d57c Text-content-length: 271 Text-content-md5: 3250cde54bb44947d36a0c49d8fc03fa Text-content-sha1: dfd5896dfbca88b235eae3c71c886954bf1c9168 Content-length: 271 SVN��pw x�j��i^Fixed-in: r6546 2006-02-10, which has been confirmed to make the problem go away. <p> (See also a <a href="http://sourceforge.net/tracker/index.php?func=detail&aid=1375233&group_id=74581&atid=541421">problem report</a> against Virtual Dimension.) Revision-number: 6560 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:08.557810Z PROPS-END Revision-number: 6561 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:08.570790Z PROPS-END Revision-number: 6562 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:08.583804Z PROPS-END Revision-number: 6563 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:08.610875Z PROPS-END Revision-number: 6564 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:08.622723Z PROPS-END Revision-number: 6565 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:08.635040Z PROPS-END Revision-number: 6566 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:08.647994Z PROPS-END Revision-number: 6567 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2006-02-18T21:16:34.505781Z K 7 svn:log V 49 The reproducible case is probably a red herring. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0bcb6229ef08ac06472ce4e7b1aac360 Text-delta-base-sha1: 89203d8cdcaedcb1ca79daabaf50d1acd2c3c7b3 Text-content-length: 318 Text-content-md5: b4fdb7b969ff1a60749333ce824e1a96 Text-content-sha1: a68c99629aa7f5d179787b594eabf4f19643d63f Content-length: 318 SVN��P? &��&�=reported a firing of the same assertion with PuTTY 0.58. However, as their screen is apparently zero rows high (presumably due to their window manager), this pathological case is probably a problem that's now protected against via <a href="zero-rows-cols-crash.html">`zero-rows-cols-crash'</a>. Revision-number: 6568 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Pointer type correction in term_clrsb(). (Harmless, as it happens.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-02-18T22:30:10.586210Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 08399e3a4e5f76c6b0470414de165d5a Text-delta-base-sha1: f87ca3b9f5c6f45bd7a0ed8e16c47ff3af815ab1 Text-content-length: 61 Text-content-md5: 36624419493f9decc3234e07897288b5 Text-content-sha1: ca258ef98ba35171143bf29e693e591108465435 Content-length: 61 SVN���� �#��P+unsigned char�"'�"� Revision-number: 6569 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2006-02-18T22:37:28.221047Z K 7 svn:log V 56 Zero-rows now confirmed not to cause this in snapshots. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b4fdb7b969ff1a60749333ce824e1a96 Text-delta-base-sha1: a68c99629aa7f5d179787b594eabf4f19643d63f Text-content-length: 32 Text-content-md5: 372cdf333f89cc863319bdcda262fa8c Text-content-sha1: 1a34d2f6548be69478f2e2cbceebec56c5cc45a6 Content-length: 32 SVN��?7���"�}Bailure Revision-number: 6570 Prop-content-length: 536 Content-length: 536 K 8 svn:date V 27 2006-02-19T01:37:45.473370Z K 7 svn:log V 435 At last, a fix for `large-clipboard-crash'. A growable buffer was only being grown for actual text, not for newlines or trailing NULs. A large run of empty lines could lead to newlines overflowing the buffer (> 100 should be enough to guarantee this on all platforms, after the initial 5k size of the buffer). Also fix some valgrind in the same area (was probably harmless), and a memory leak introduced by the RTF attribute pasting. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 36624419493f9decc3234e07897288b5 Text-delta-base-sha1: ca258ef98ba35171143bf29e693e591108465435 Text-content-length: 1411 Text-content-md5: deeaffc4e93d393f56dd93a88a473c59 Text-content-sha1: 939180cc3be8cb83d81a9b1a3e1fc217e77cc4a0 Content-length: 1411 SVN���������'d41�3�4�X.V�W�1h�,p�hhO� /* * Helper routine for clipme(): growing buffer. */ typedef struct { int buflen; /* amount of allocated space in textbuf/attrbuf */ int bufpos; /* amount of actual data */ wchar_t *textbuf; /* buffer for copied text */ wchar_t *textptr; /* = textbuf + bufpos (current insertion point) */ int *attrbuf; /* buffer for copied attributes */ int *attrptr; /* = attrbuf + bufpos */ } clip_workbuf; static void clip_addchar(clip_workbuf *b, wchar_t chr, int attr) { if (b->bufpos >= b->buflen) { b->buflen += 128; b->textbuf = sresize(b->textbuf, b->buflen, wchar_t); b->textptr = b->textbuf + b->bufpos; b->attrbuf = sresize(b->attrbuf, b->buflen, int); b->attrptr = b->attrbuf + b->bufpos; } *b->textptr++ = chr; *b->attrptr++ = attr; b->bufpos++clip_workbuf buf; int old_top_x; int attr; buf.buflen = 5120; buf.bufpos = 0; buf.textptr = buf.textbuf = snewn(buf.buflen, wchar_t); buf.attrptr = buf.attrbuf = snewn(buf.buflen, int); nlpos.x && clip_addchar(&buf, *p, attr); clip_addchar(&buf, sel_nl[i], 0);clip_addchar(&buf, 0, 0); #endif /* Finally, transfer all that to the clipboard. */ write_clip(term->frontend, buf.textbuf, buf.attrbuf, buf.bufpos, desel); sfree(buf.textbuf); sfree(buf.attr Node-path: putty-wishlist/data/large-clipboard-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 28f11e782563070f6429c510ed99257e Text-delta-base-sha1: 6584a2ae4f74e171d2e9951c485aad6f2a7de202 Text-content-length: 576 Text-content-md5: 8909f06c726719cfe9e009a7c70390bb Text-content-sha1: 76bd8fbe9c05ca6d4a7dea5fefcb480f6d7c3a90 Content-length: 576 SVN��v-&O�;�rO=Summary: Crashes with large clipboard operations containing lots of blank spaceFixed-in: r6570 2006-02-20are performed. Typically this is associated with use of the "Copy All to Clipboard" menu action, but it can happen with ordinary mouse-button copy-and-paste too. <p> It turns out that PuTTY can crash when attempting to copy a large (> 5 kilobyte) chunk of text containing a significant number of consecutive empty lines. (More than 100 after the 5k mark would likely guarantee a crash or other misbehaviour, but it could happen with fewer.) Revision-number: 6571 Prop-content-length: 244 Content-length: 244 K 7 svn:log V 143 I don't think the cause of `large-clipboard-crash' can be directly responsible for these, although heap memory corruption could cause trouble. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-02-19T01:47:57.730847Z PROPS-END Node-path: putty-wishlist/data/assert-fail-newsavelines Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e5f34ed924073a39fd2e0aaa2911d6bb Text-delta-base-sha1: ee9e41a423c8be5b6b681eac84fddceaadbc9a2b Text-content-length: 20 Text-content-md5: d81b820c4d322ce017c8f02d6778f608 Text-content-sha1: 4e653f0a637f9e4194753f78da50c178ce1db055 Content-length: 20 SVN��W ��S��? Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 372cdf333f89cc863319bdcda262fa8c Text-delta-base-sha1: 1a34d2f6548be69478f2e2cbceebec56c5cc45a6 Text-content-length: 20 Text-content-md5: b435b9c5794481a267903e4ed44751d8 Text-content-sha1: 1732c35ac8cc6db8c3a507b9602930c6ac167c8d Content-length: 20 SVN��7r ����dS Revision-number: 6572 Prop-content-length: 390 Content-length: 390 K 7 svn:log V 289 Introduce a new checkbox and command-line option to inhibit use of Pageant for local authentication. (This is a `don't use Pageant for authentication at session startup' button rather than a `pretend Pageant doesn't exist' button: that is, agent forwarding is independent of this option.) K 10 svn:author V 5 simon K 8 svn:date V 27 2006-02-19T12:05:12.784131Z PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef7570ad6d35ee3bc8df6678b29ec5fd Text-delta-base-sha1: 2f1d78ddecb408653a6e79cbe2b705047c625e19 Text-content-length: 328 Text-content-md5: 686921457e7c9ce21c2061daf73a7678 Text-content-sha1: 2d96eb4c21c0494e953557cb1151b8c63254b81c Content-length: 328 SVN��j8 0�V�0�28agent") || !strcmp(p, "-pagent") || !strcmp(p, "-pageant")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); cfg->tryagent = TRUE; } if (!strcmp(p, "-noagent") || !strcmp(p, "-nopagent") || !strcmp(p, "-nopageant")) { RETURN(1); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); cfg->tryagent = FALSE Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 736d749c2df3ca304da9c68b421f2b49 Text-delta-base-sha1: a0d484a52da23ff635ca07b1c337ebc78973e96e Text-content-length: 159 Text-content-md5: 02d418aec6cfe36522fb623ef2235687 Text-content-sha1: ff14e58b239c48f6f818cf3573085d9d3eda8d2e Content-length: 159 SVN��`���_authentication using Pageant", 'p', HELPCTX(ssh_auth_pageant), dlg_stdcheckbox_handler, I(offsetof(Config,tryagent)) Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5375f783ad2c8a7de8dabff060778e49 Text-delta-base-sha1: 4e7f8ec90bc04392a7f0ac5f7dcf19fc3ee7f405 Text-content-length: 1368 Text-content-md5: f688b01d235495563a8251d9d848fc21 Text-content-sha1: 41135c6fc04b72318c2921e346e30bd534a8d0f8 Content-length: 1368 SVN���� �s� �aryagent} \q{Attempt authentication using Pageant} \cfg{winhelp-topic}{ssh.auth.pageant} If this option is enabled, then PuTTY will look for Pageant (the SSH private-key storage agent) and attempt to authenticate with any suitable public keys Pageant currently holds. This behaviour is almost always desirable, and is therefore enabled by default. In rare cases you might need to turn it off in order to force authentication by some non-public-key method such as passwords. This option can also be controlled using the \c{-noagent} command-line option. See \k{using-cmdline-agentauth}. See \k{pageant} for more information about Pageant in general���(see \k{plink}) it is the usual way of working. \S{config-ttymodes} Sending \i{terminal modes} \cfg{winhelp-topic}{ssh.ttymodes} The SSH protocol allows the client to send \q{terminal modes} for the remote pseudo-terminal. These usually control the server's expectation of the local terminal's behaviour. If your server does not have sensible defaults for these modes, you may find that changing them here helps. If you don't understand any of this, it's safe to leave these settings alone. (None of these settings will have any effect if no pseudo-terminal is requested or allocated.) You can add or modify a mode by selecting it from the drop-down list, choosin Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c956288cc3c3b4dc8e13e3a2c87b626a Text-delta-base-sha1: 72c300d0c88eb139d68460585677b850eac7a975 Text-content-length: 186 Text-content-md5: 098bf941c3da7ba5bce81838fdaf359c Text-content-sha1: 0e2a8be8391850382e7893771a5aa022af620f1e Content-length: 186 SVN��Im "�&�"�%$(PuTTY can be configured not to try to use Pageant, but it will try by default. See \k{config-ssh-tryagent} and \k{using-cmdline-agentauth} for more information.) Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0d3749ddd0d20ae3fca7e9f5e8a9d41d Text-delta-base-sha1: 87c381258d19c7cf90b69d7f0356a62d0d351fd2 Text-content-length: 466 Text-content-md5: 51c06e4d5a59739a71a57ec5f7e95758 Text-content-sha1: 71dd2e60f29ca286061883d913ed37fb027184a5 Content-length: 466 SVN��:S1� �1�c@�auth} \i\c{-agent} and \i\c{-noagent}: control use of Pageant for authentication The \c{-agent} option turns on SSH authentication using Pageant, and \c{-noagent} turns it off. These options are only meaningful if you are using SSH. See \k{pageant} for general information on \i{Pageant} These options are equivalent to the agent authentication checkbox in the Auth panel of the PuTTY configuration box (see \k{config-ssh-tryagent Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5dce159e14301caf4840febb31fe9171 Text-delta-base-sha1: 62f075d846c7867221f9b749107572a3d967e23f Text-content-length: 32 Text-content-md5: f72e48045c0be9f222022afc6d3d0694 Text-content-sha1: 5198d27857a4ad2791d1ddf410f1d8c9183a10c0 Content-length: 32 SVN��FX �}��Sstryagent Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3592e2449e9b70732c7d77e1c6f8f0ec Text-delta-base-sha1: 18a9bb0ac9e5ed0f7fd6c42e136245bd29cd0c28 Text-content-length: 82 Text-content-md5: 8756210a781256da286df72f10983344 Text-content-sha1: 1f0472c8e78852e81164e15d825a265357880df0 Content-length: 82 SVN��t_4�M��,�ZTryAgent", cfg->tryagentTryAgent", 1, &cfg->tryagent Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0255de5def1f79efcb7007e2977a0a9d Text-delta-base-sha1: 5eb30a633154fd80af32576b6052e5ead54d3daf Text-content-length: 167 Text-content-md5: 91ba2985656daffc0ca2d320892d920e Text-content-sha1: 5a57a556f023edd3be53520bb63aadcd82f3318d Content-length: 167 SVN���� ���cssh->cfg.tryagent && ��� M�3���Assh_disconnect(ssh, Nssh->cfg.tryagent && agent_exists() && ssh->cfg.tryagent�}< ��o.�M0 Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bf44949b2e6a067423d96ce193abb71b Text-delta-base-sha1: e4e562f99b73c079d52d6b19dede7ebef4256cc7 Text-content-length: 22 Text-content-md5: 209683614fa8df60f465de436c52658c Text-content-sha1: 8a46a3bb2e818fd3e3109f3b6081d3f254d768b4 Content-length: 22 SVN��, ����o= Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c61750f459ef9ee472df731ecfbac3fa Text-delta-base-sha1: 5bd76b0558cf615743a3958a2740a8d7bc16bd8b Text-content-length: 46 Text-content-md5: 5c7738eee06e6d7b21c7a33eb64e83cc Text-content-sha1: 4c7e2725a854a5eaa45cdb7d7bb295befafa84e1 Content-length: 46 SVN�� C �@��j!pageant "ssh.auth.pageant Revision-number: 6573 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:09.744689Z PROPS-END Revision-number: 6574 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2006-02-19T12:52:28.968452Z K 7 svn:log V 47 Fix up documentation/usage messages for r6572. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ece168231041e26681c0a711f560c2f Text-delta-base-sha1: de26358862ea671e11d874a0fd417782c00c0bf9 Text-content-length: 98 Text-content-md5: 21ed57b375b6a90fcf777f476908682a Text-content-sha1: ed7cdfd3060ed92b1c7d47439e66ff11371002a2 Content-length: 98 SVN��"mF���ND�AaXXnoagent disable use of Pageant \c -agent enable use of Pageant Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 05bf6167afa2a73e36ba9d219cc5e8c0 Text-delta-base-sha1: 893b356bc135926cc2dae1bd49bb11215e81effa Text-content-length: 98 Text-content-md5: 2307216169ecd933ce8ab61b7644739d Text-content-sha1: 87f61a5f58d5b35ff787850f665a1b58802b563f Content-length: 98 SVN��LF���6D�4XXnoagent disable use of Pageant \c -agent enable use of Pageant Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 51c06e4d5a59739a71a57ec5f7e95758 Text-delta-base-sha1: 71dd2e60f29ca286061883d913ed37fb027184a5 Text-content-length: 32 Text-content-md5: 2fc40f6c41fa7c7ba5d00ffede399537 Text-content-sha1: 84424702b8034faa1a40e80d1860ec125691178b Content-length: 32 SVN��S�A��A�1". Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6cf33de0fc69bfa99438fded14cfecf4 Text-delta-base-sha1: acd417123535e3f488eccdec7a3eca765b464ae5 Text-content-length: 108 Text-content-md5: 02ae18e31b4151a124d5432fac9f9582 Text-content-sha1: 3c3a12b6538eb2718a203f74e2e54037a0b5862a Content-length: 108 SVN��fM R�P�R�+;noagent disable use of Pageant\n"); printf(" -agent enable use of Pageant Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 145e48c899db7802dedfa7aabdd1759c Text-delta-base-sha1: 5497cad5a44524aca7a4b2b64f30225cc23d0e75 Text-content-length: 108 Text-content-md5: e114ec47ac56de7e50ce1b95943235b9 Text-content-sha1: aa262113e009ec17e8c612e389796f4b609ef323 Content-length: 108 SVN��4 R�i�R�`Tnoagent disable use of Pageant\n"); printf(" -agent enable use of Pageant Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 209683614fa8df60f465de436c52658c Text-delta-base-sha1: 8a46a3bb2e818fd3e3109f3b6081d3f254d768b4 Text-content-length: 106 Text-content-md5: 75076ab1f831bfbb07fc510c19f1f36d Text-content-sha1: 0c58b1d44eeec67b66e90487ab4f0f19420edf64 Content-length: 106 SVN��i R�Q�R�F<noagent disable use of Pageant\n"); printf(" -agent enable use of Pageant Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9c0478ba3afc00a374e5d8e4f07d69e0 Text-delta-base-sha1: ebe6799c43be820fbfc2565334f6dcc46d68daca Text-content-length: 106 Text-content-md5: fd15da3937b082c0930735ee74bfd012 Text-content-sha1: 74cd7f9b7bf3e640e6a3542c8844709fdfe10aba Content-length: 106 SVN��� R��R�}noagent disable use of Pageant\n"); printf(" -agent enable use of Pageant Revision-number: 6575 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:09.923028Z PROPS-END Revision-number: 6576 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2006-02-19T14:10:02.845151Z K 7 svn:log V 32 Add/tweak a couple of comments. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f72e48045c0be9f222022afc6d3d0694 Text-delta-base-sha1: 5198d27857a4ad2791d1ddf410f1d8c9183a10c0 Text-content-length: 210 Text-content-md5: e2e6971d83442802a670bf579ebde9e4 Text-content-sha1: 43f9ff8c0c32ce5f203062e81564aac3b3e8e7d2 Content-length: 210 SVN��Xk 7��7�; /* this line wraps to next */ #define LATTR_WRAPPED2 0x00000020UL /* with WRAPPED: CJK wide character wrapped to next line, so last single-width cell is empty */ Node-path: putty/terminal.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 93d5395981178b523d7fc4e05687b977 Text-delta-base-sha1: 882e3aceb3a622f6239d41a0b72bd0ba6dbd6927 Text-content-length: 115 Text-content-md5: 30d88cc04b542b213f88ed14c98b910f Text-content-sha1: a45e012bc9708a1a85341fa445585fc9dbf96853 Content-length: 115 SVN��G ]�d�]�Eof .scrollback that can be retrieved onto the terminal ("temporary scrollback") Revision-number: 6577 Prop-content-length: 217 Content-length: 217 K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-02-19T14:59:48.050846Z K 7 svn:log V 116 Fix `restart-reset-terminal': terminal now restored to a sensible state when reusing a window to restart a session. PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e2e6971d83442802a670bf579ebde9e4 Text-delta-base-sha1: 43f9ff8c0c32ce5f203062e81564aac3b3e8e7d2 Text-content-length: 30 Text-content-md5: 4c73e9f260dc9612610fba3a0aeb26c3 Text-content-sha1: 7be9febaa1108173e387253276cad27ab6490163 Content-length: 30 SVN��kp �j��j, int Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: deeaffc4e93d393f56dd93a88a473c59 Text-delta-base-sha1: 939180cc3be8cb83d81a9b1a3e1fc217e77cc4a0 Text-content-length: 1232 Text-content-md5: 279470c336c5054a5aa3466d0b95988c Text-content-sha1: 7e20baa897dceebdea5940b95433c02607593281 Content-length: 1232 SVN����9z�v��)l�/J�5�.m�*0�_Z�L9int find_last_nonempty_line(Terminal *, tree234 *static void scroll(Terminal *, int, int, int, int If 'clear' is false, don't actually clear the primary screen, and * position the cursor below the last non-blank line (scrolling if * necessary). */ static void power_on(Terminal *term, int clear) {if (clear) erase_lots(term, FALSE, TRUE, TRUE); term->curs.y = find_last_nonempty_line(term, term->screen) + 1; if (term->curs.y == term->rows) { term->curs.y--; scroll(term, 0, term->rows - 1, 1, TRUE); } } else { term->curs.y = 0; } term->curs.x = 0;, int clear) { power_on(term, clear, TRUE, TRUE�d_{{�d�rgs[i+2] & 0xFF) << ATTR_FGSHIFT); i += 2; } break; case 48: /* xterm 256-colour mode */ if (i+2 < term->esc_nargs && term->esc_args[i+1] == 5) { term->curr_attr &= ~ATTR_BGMASK; term->curr_attr |= ((term->esc_args[i+2] & 0xFF) << ATTR_BGSHIFT); i += 2; } break; } } set_erase_char(term); } break; case 's': /* save cursor */ save_cursor(term, TRUE); break; Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b8db30f4176271f96b308ee76e9cc22 Text-delta-base-sha1: 9e39d01f8fc853e3a4dcb2573155302429516c2f Text-content-length: 118 Text-content-md5: 1c208b820c009ae4be0b5c817477a278 Text-content-sha1: 2c29d39f8ae38fee032ae41941f3c33f3da6689e Content-length: 118 SVN����"�R��R�ya, TRUEterm_pwron(inst->term, FALSE�|"&�|�rl+rightclick context menu. */ Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5ceecd5ff124c195b6912bcbf6b7e45f Text-delta-base-sha1: dfcf80a5d84bcb447c0bbc6877d73619a035ed96 Text-content-length: 111 Text-content-md5: b0342c308919d46f6d04a8ecc5461103 Text-content-sha1: 9286b393069e4814ea894e54fc4629cdb56717e3 Content-length: 111 SVN������� �? term_pwron(term, FALSE, TRUE�Yz!�Y� } else p += sprintf((char Node-path: putty-wishlist/data/restart-reset-terminal Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cbf47b1b9f0a445445718da5c68ab52d Text-delta-base-sha1: e35d0ef7c8ed072e06ed1f6226a86980a324020d Text-content-length: 45 Text-content-md5: abd514cca0b4266fe0944f212895ae2e Text-content-sha1: 117786915df255d497f140bddb8eb8cdc7b715ea Content-length: 45 SVN��n �g��fFixed-in: r6577 2006-02-20 Revision-number: 6578 Prop-content-length: 176 Content-length: 176 K 7 svn:log V 76 Various tweaks and additions re smartcard patches from Andreas Jellinghaus. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-02-19T16:32:43.842606Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f918281bd3aaa2012c18d09fe31f86c Text-delta-base-sha1: 3f088fc2de4cb2f27bccd06264952e116e07293f Text-content-length: 64 Text-content-md5: 7441c382713a475b2cf08ccf2944029c Text-content-sha1: 76cc6ea3dea3a5adff53ade1d8bbb243a8971b63 Content-length: 64 SVN��- +���-project.org/files/contrib/">opensc-project Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8f6d42bd735a3e06045fa608a9571b73 Text-delta-base-sha1: 261281cd130b43a697d9abe37b74ec90bc1de334 Text-content-length: 257 Text-content-md5: f47390718c09377d32a52204591a1537 Text-content-sha1: 55ac271e8560f2f22a7ca754db591fd8f9981d3f Content-length: 257 SVN��^�9��O9+�X?�P2-project-project.org/files/contrib/">opensc-project.org's contrib directory</a>. The <a href="http://www.opensc-project.org/scb/">Smart Card Bundle</a> contains a packaged version-project.org/files/contrib/">opensc-project Revision-number: 6579 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2006-02-19T22:37:31.487408Z K 7 svn:log V 50 Daniel Meidlinger points out a redundant test :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 91ba2985656daffc0ca2d320892d920e Text-delta-base-sha1: 5a57a556f023edd3be53520bb63aadcd82f3318d Text-content-length: 82 Text-content-md5: 450c810df93d26682ccb4218d2f2678d Text-content-sha1: 8883d47ab2275d2d4684b15ea22eb51b17fec2be Content-length: 82 SVN����������� �k����QUEST); ssh2_pkt_ad�<' ��Zg�Mo Revision-number: 6580 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:10.750821Z PROPS-END Revision-number: 6581 Prop-content-length: 307 Content-length: 307 K 8 svn:date V 27 2006-02-20T19:54:17.388942Z K 7 svn:log V 206 Alain Guibert points out that ESC]P sequences were erroneously accepting 'G' as a hex digit. (The _first_ digit of the sequence intentionally goes up further than F, but the remaining ones shouldn't have.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 279470c336c5054a5aa3466d0b95988c Text-delta-base-sha1: 7e20baa897dceebdea5940b95433c02607593281 Text-content-length: 41 Text-content-md5: 1c0170fa677359a7d01d2a6b55fc5172 Text-content-sha1: 77cdbeb8cc4e0d71fb40e36ec0927a9310385206 Content-length: 41 SVN���������__ �X��Y5 Revision-number: 6582 Prop-content-length: 318 Content-length: 318 K 7 svn:log V 217 Do proper select-for-write on ptys. Currently, pasting a sufficiently large string into pterm in any circumstances in which it's echoed back to the terminal will cause a deadlock once the pty's write buffer fills up. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-02-23T13:38:44.023360Z PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 59fbb32590cfdc59b77454f79548570d Text-delta-base-sha1: 99d07fada6676ef5bce167b16b6c1f91552228a4 Text-content-length: 1428 Text-content-md5: b9686fe4c199af283e0aaea04b12f267 Text-content-sha1: fb4ec99bd9f54afb0b7253dd9800a175a7eec53d Content-length: 1428 SVN��f\F@�+��B�]�e�^�sr�Ydk�$X)�0r/�eassert bufchain output_datastatic void pty_try_writ{ /* * Set the pty master into non-blocking mode. */ int i = 1; ioctl(pty->master_fd, FIONBIO, &i); } bufchain_init(&pty->output_data else if (event == 2) { /* * Attempt to send data down the pty. */ pty_try_write(pty); int rwx; rwx = 1; /* always want to read from pty */ if (bufchain_size(&pty->output_data)) rwx |= 2; /* might also want to write to it */ uxsel_set(pty->master_fd, rwxstatic void pty_try_write(Pty pty) { void *data; int len, ret; assert(pty->master_fd >= 0); while (bufchain_size(&pty->output_data) > 0) { bufchain_prefix(&pty->output_data, &data, &len); ret = write(pty->master_fd, data, len); if (ret < 0 && (errno == EWOULDBLOCK)) { /* * We've sent all we can for the moment. */ break; } if (ret < 0) { perror("write pty master"); exit(1); } bufchain_consume(&pty->output_data, ret); } pty_uxsel_setup /* ignore all writes if fd closed */ bufchain_add(&pty->output_data, buf, len); pty_try_write(pty); return bufchain_size(&pty->output_data) Revision-number: 6583 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2006-02-25T14:13:46.414593Z K 7 svn:log V 184 Alain Guibert points out that palette changes weren't causing the space between the text area and the window border to be refreshed. Fixed on Windows. Gtk still has a similar problem. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b0342c308919d46f6d04a8ecc5461103 Text-delta-base-sha1: 9286b393069e4814ea894e54fc4629cdb56717e3 Text-content-length: 428 Text-content-md5: 48a59e46241dcb1e66c54777abcfe44f Text-content-sha1: c79890a0e87b8b0a16b0fbc050cdef059a0ddfc6 Content-length: 428 SVN���������zy�6�`�H.� n else { if (n == (ATTR_DEFBG>>ATTR_BGSHIFT)) /* If Default Background changes, we need to ensure any * space between the text area and the window border is * redrawn. */ InvalidateRect(hwnd, NULL, TRUE else { /* Default Background may have changed. Ensure any space between * text area and window border is redrawn. */ InvalidateRect(hwnd, NULL, TRUE Revision-number: 6584 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2006-02-26T21:25:28.014826Z K 7 svn:log V 147 Update the status of my investigations. (I just found myself writing almost precisely the same code as I tried in 2004, with the same results :( ) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/window-placement Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 26841348cecb6996c7d4bb5c19de997d Text-delta-base-sha1: f9d979ae806a7056baa6e39b7bf37a76b4f67217 Text-content-length: 199 Text-content-md5: b8fe1c9f54f86ccd62d283ae2d517ef1 Text-content-sha1: 292c576cd3f2ab70e1c1204b669606f078d98c2a Content-length: 199 SVN��g94��46-Feb-26: I've done some experimenting with this change, but it seems to have a few unexpected interactions with the rest of our resize code (which needs an overhaul in any case). Revision-number: 6585 Prop-content-length: 1116 Content-length: 1116 K 8 svn:date V 27 2006-02-27T22:27:49.367993Z K 7 svn:log V 1014 Batch of miscellaneous tweaks to the Windows installer: - Now we've fixed `win-versioninfo', choose some sensible outcomes from the installer's comparisons of binary version numbers. Also, give the installer _itself_ a matching binary version. In particular, without this change, it would not have been possible to downgrade PuTTY -- it would have silently left the "newer" files in place. Now it will make some fuss, but permit it. - Also remove descriptions from shortcuts, on the grounds that the binaries have embedded descriptions now. (Although I've not checked whether those are actually visible in the Start Menu.) - At the request of various people (e.g., PJB), add flags so that if files are in use at the time the (un)installer is run, replacement is deferred to the next restart. (The user may be prompted to restart, which isn't ideal; see comments). This is supposed to make centrally-pushed silent upgrades more robust. - Note some limitations of the installer. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5cb23abd6e822b21aee3a121fe1df895 Text-delta-base-sha1: abb408c5d846f4814c46b99716693faf274712ca Text-content-length: 54 Text-content-md5: 3872f18c00aff9e5320485a01633d461 Text-content-sha1: 7eecbe36a14fffd828065e0f134a9da20f39ffbb Content-length: 54 SVN��L( !�K��<four_ times, on consecutive lines Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5ab53eb27b41aef1bdc7410f30dac47 Text-delta-base-sha1: a8b7b26a3b658aae0532c6c4b0fa958749b4ba8c Text-content-length: 2350 Text-content-md5: 2c1df58ba95e190c88589e335e8226c3 Text-content-sha1: c0e15a6727fb61830bc73b05f8aad37b61cf4869 Content-length: 2350 SVN��H&|�C}�y8�7�.wq� {�!'; -*- no -*- ; $Id$See wish `installer-addpath'. ; ; - Maybe a "custom" installation might be useful? Hassle with ; UninstallDisplayIcon,; We flag all files with "restartreplace" et al primarily for the benefit ; of unattended un/installations/upgrades, when the user is running one ; of the apps at a time. Without it, the operation will fail noisily in ; this situation. ; This does mean that the user will be prompted to restart their machine ; if any of the files _were_ open during installation (or, if /VERYSILENT ; is used, the machine will be restarted automatically!). The /NORESTART ; flag avoids this. ; It might be nicer to have a "no worries, replace the file next time you ; reboot" option, but the developers have no interest in adding one. ; NB: apparently, using long (non-8.3) filenames with restartreplace is a ; bad idea. (Not that we do.) Source: "putty.exe"; DestDir: "{app}"; Flags: promptifolder replacesameversion restartreplace uninsrestartdelete Source: "pageant.exe"; DestDir: "{app}"; Flags: promptifolder replacesameversion restartreplace uninsrestartdelete Source: "puttygen.exe"; DestDir: "{app}"; Flags: promptifolder replacesameversion restartreplace uninsrestartdelete Source: "pscp.exe"; DestDir: "{app}"; Flags: promptifolder replacesameversion restartreplace uninsrestartdelete Source: "psftp.exe"; DestDir: "{app}"; Flags: promptifolder replacesameversion restartreplace uninsrestartdelete Source: "plink.exe"; DestDir: "{app}"; Flags: promptifolder replacesameversion restartreplace uninsrestartdelete Source: "website.url"; DestDir: "{app}"; Flags: restartreplace uninsrestartdelete Source: "..\doc\putty.hlp"; DestDir: "{app}"; Flags: restartreplace uninsrestartdelete Source: "..\doc\putty.cnt"; DestDir: "{app}"; Flags: restartreplace uninsrestartdelete Source: "..\LICENCE"; DestDir: "{app}"; Flags: restartreplace uninsrestartdelete Source: "..\README.txt"; DestDir: "{app}"; Flags: isreadme restartreplace uninsrestartdelete [Icons] Name: "{group}\PuTTY"; Filename: "{app}\putty.exe" Name: "{group}\PuTTYgen"; Filename: "{app}\puttygen.exe" Name: "{group}\Pageant"; Filename: "{app}\pageant.exe; XXX: it would be nice if this task weren't run if a silent uninstall is ; requested, but "skipifsilent" is disallow Revision-number: 6586 Prop-content-length: 210 Content-length: 210 K 8 svn:date V 27 2006-02-27T22:30:38.661473Z K 7 svn:log V 109 Change XXX-REMOVE-BEFORE-RELEASE to XXX-REVIEW-BEFORE-RELEASE to allow more general changes to be queued up. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3872f18c00aff9e5320485a01633d461 Text-delta-base-sha1: 7eecbe36a14fffd828065e0f134a9da20f39ffbb Text-content-length: 204 Text-content-md5: d10133924bff5e230487d2aafb5bd1c8 Text-content-sha1: 21c17669f3276b784449c5b277b84bc7868c2c06 Content-length: 204 SVN��(} 4�M�4�|,, and the website, and review anything tagged with a comment containing the word XXX-REVIEW-BEFORE-RELEASE. (Any such comments should state clearly what needs to be done.) Revision-number: 6587 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2006-02-27T23:55:07.010806Z K 7 svn:log V 37 Fix a memory leak in key generation. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/sshprime.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cfd126d710b33bd91a6ffb57fe2cc1f0 Text-delta-base-sha1: 1ce434aa908d5c0a710e7fcbfca8eb1f24c81881 Text-content-length: 30 Text-content-md5: 19ee5eecf9e35503f385352f4801a2ed Text-content-sha1: 1f197056e6b7c800410525e142650584be3b67ca Content-length: 30 SVN��! ���}wqp); Revision-number: 6588 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2006-03-02T19:28:31.299898Z K 7 svn:log V 11 PuTTY Tray K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7441c382713a475b2cf08ccf2944029c Text-delta-base-sha1: 76cc6ea3dea3a5adff53ade1d8bbb243a8971b63 Text-content-length: 139 Text-content-md5: 06bd171ecb7a8c567c337cca3263bda2 Text-content-sha1: 38c86423f82708284f30c74582f1ef9c123e7792 Content-length: 139 SVN��-7 u�i�u�YTwww.xs4all.nl/~whaa/putty/"> PuTTY Tray</a> minimises to the <a href="wishlist/system-tray.html">system tray</a>. Revision-number: 6589 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:12.413901Z PROPS-END Revision-number: 6590 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:12.511434Z PROPS-END Revision-number: 6591 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:12.526222Z PROPS-END Revision-number: 6592 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:12.549535Z PROPS-END Revision-number: 6593 Prop-content-length: 410 Content-length: 410 K 8 svn:date V 27 2006-03-08T18:10:12.768327Z K 7 svn:log V 309 David Damerell tells me I should be using Ctrl-hjklyubn rather than Shift-hjklyubn for batch movement in NetHack, because they have subtly different behaviour within the game and the Ctrl-moves are more useful. Unfortunately, PuTTY's NetHack keypad mode doesn't support Ctrl-moves. Therefore, it does now :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c208b820c009ae4be0b5c817477a278 Text-delta-base-sha1: 2c29d39f8ae38fee032ae41941f3c33f3da6689e Text-content-length: 787 Text-content-md5: 06181b4cf0b019523f80b4fd7b5624bc Text-content-sha1: 8494a5ff99418497a902f2339a225656f32154d8 Content-length: 787 SVN�����F��;]\002"; break; case GDK_KP_2: case GDK_KP_Down: keys = "jJ\012"; break; case GDK_KP_3: case GDK_KP_Page_Down: keys = "nN\016"; break; case GDK_KP_4: case GDK_KP_Left: keys = "hH\010"; break; case GDK_KP_5: case GDK_KP_Begin: keys = "..."; break; case GDK_KP_6: case GDK_KP_Right: keys = "lL\014"; break; case GDK_KP_7: case GDK_KP_Home: keys = "yY\031"; break; case GDK_KP_8: case GDK_KP_Up: keys = "kK\013"; break; case GDK_KP_9: case GDK_KP_Page_Up: keys = "uU\025"; break; } if (keys) { end = 2; if (event->state & GDK_CONTROL_MASK) output[1] = keys[2]; else �" hh�"�ASK); gtk_widget_show(inst->window); set_window_background(inst); /* * Set up the Ct Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48a59e46241dcb1e66c54777abcfe44f Text-delta-base-sha1: c79890a0e87b8b0a16b0fbc050cdef059a0ddfc6 Text-content-length: 670 Text-content-md5: ab96aeda3bd1c9781af95a7bff14eb01 Text-content-sha1: 10b472cc0c8254f68560a7bce04bec8f477ef527 Content-length: 670 SVN����8�1��5�@"bB\002\002"[shift_state & 3]; return p - output; case VK_NUMPAD2: *p++ = "jJ\012\012"[shift_state & 3]; return p - output; case VK_NUMPAD3: *p++ = "nN\016\016"[shift_state & 3]; return p - output; case VK_NUMPAD4: *p++ = "hH\010\010"[shift_state & 3]"lL\014\014"[shift_state & 3]; return p - output; case VK_NUMPAD7: *p++ = "yY\031\031"[shift_state & 3]; return p - output; case VK_NUMPAD8: *p++ = "kK\013\013"[shift_state & 3]; return p - output; case VK_NUMPAD9: *p++ = "uU\025\025"[shift_state & 3]�30��e p += sprintf((char *) p, "\x1B?%c", xkey); Revision-number: 6594 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2006-03-08T18:15:16.848722Z K 7 svn:log V 53 Oh, and update the docs for NetHack keypad mode too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f688b01d235495563a8251d9d848fc21 Text-delta-base-sha1: 41135c6fc04b72318c2921e346e30bd534a8d0f8 Text-content-length: 457 Text-content-md5: 2c2ab8c9b0a3b444a8b3530e4f700706 Text-content-sha1: e7f5feabec643f2c29b4d917a779541b14d98bdd Content-length: 457 SVN����-� �-�FMIn addition, pressing Shift or Ctrl with the keypad keys generate the Shift- or Ctrl-keys you would expect (e.g. keypad-7 generates \cq{y}, so Shift-keypad-7 generates \cq{Y} and Ctrl-keypad-7 generates Ctrl-Y); these commands tell NetHack to keep moving you in the same direction until you encounter � mm��n a pseudo-terminal. In PuTTY, this is generally only useful for very specialist purposes; although in Plink Revision-number: 6595 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2006-03-08T23:16:52.652144Z K 7 svn:log V 33 Flesh out `-m' caveats slightly. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2fc40f6c41fa7c7ba5d00ffede399537 Text-delta-base-sha1: 84424702b8034faa1a40e80d1860ec125691178b Text-content-length: 397 Text-content-md5: 946d64093a58c704c227dce2182df90f Text-content-sha1: 173d7e5548b854a422601665d62629bb51b03d94 Content-length: 397 SVN��el��l�M5�&b With some servers (particularly Unix systems), you can even put multiple lines in this file and execute more than one command in sequence, or a whole shell script; but this is arguably an abuse, and cannot be expected to work on all servers. In particular, it is known \e{not} to work with certain \q{embedded} servers, such as \i{Cisco} routers. This option is Revision-number: 6596 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2006-03-11T00:35:20.718231Z K 7 svn:log V 23 now a major motion RFC K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-rsa-kex Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 497d1f7b3d51a7a8f2403d143e170854 Text-delta-base-sha1: 6ae484cccbc2198ad07a7b69ca2027b7a03359b3 Text-content-length: 382 Text-content-md5: bc8f717fcaf786a4a4c0a114f006a956 Text-content-sha1: 2d0d9619d8d43f4fb2d2843f624c689907e9a646 Content-length: 382 SVN��$k��krfc/rfc4432.txt">RFC 4432</a> (formerly draft-harris-ssh-rsa-kex) defines a means to use RSA key exchange in SSH-2 (similar to SSH-1's key exchange, but without the other disadvantages of SSH-1). This might be particularly suitable for slow client systems. <p> There is a patch somewhere. We should find another implementation to test it against, and commit it. Revision-number: 6597 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2006-03-11T14:21:08.477096Z K 7 svn:log V 19 Reinstate putty.nl K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4b5989e85fc2bce350ba9006fd239e71 Text-delta-base-sha1: 904be12dc13031875416082591023b69a160767f Text-content-length: 47 Text-content-md5: 869edc537210eaa07968b8a774447f40 Text-content-sha1: ac9cf3f130380ec02f1b57312027d992b4bd6b08 Content-length: 47 SVN��8!�F��[~�lLwww.putty.nl/">putty Revision-number: 6598 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2006-03-11T14:33:17.246994Z K 7 svn:log V 42 Mention full-colour/attribute copy/paste. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/print-screen Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3365b2f6873caa7ec43a265ea4cf762e Text-delta-base-sha1: ca523ef9898287265449ea7cfb47304f4ca9d8ee Text-content-length: 131 Text-content-md5: a784868094ecd580cce06ad68e28495e Text-content-sha1: 8c76fb9a2788311a308c6a3ee1a60b34b0879fcc Content-length: 131 SVN��! m�>�m�c>(Since r6555 / 2006-02-14, PuTTY has supported copying text with a full set of colours and other attributes.) Revision-number: 6599 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2006-03-11T19:00:35.908177Z K 7 svn:log V 26 Link to "ctrl-tab" patch. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/multiple-connections Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ab6672a8741d33dd57ff2e03ec5bcb29 Text-delta-base-sha1: ce56290e883bdc17d24f2a915358b8f46c2729c4 Text-content-length: 333 Text-content-md5: d04c9c5ef2b574b2990c027fc50e03bc Text-content-sha1: ee5286fbb5b3b6cce4e936001adb3b0977ef62ac Content-length: 333 SVN��R:��: <p> A related suggestion is that separate PuTTY windows could know about each other, and a key combination such as Ctrl-Tab could switch between just PuTTY windows. A (scary) patch implementing this can be found <a href="http://hp.vector.co.jp/authors/VA024651/#PuTTYctrltab_top">here</a> (web page in Japanese). Revision-number: 6600 Prop-content-length: 172 Content-length: 172 K 8 svn:date V 27 2006-03-11T19:04:58.910045Z K 7 svn:log V 72 Link to PuTTYkj as an example of Windows-specific internationalisation. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/i18n Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48fc2683b9c95c5a7d207a0116a683b1 Text-delta-base-sha1: 73fa272dcf63cc0f42cbcfbc7ccd146448253e64 Text-content-length: 158 Text-content-md5: b59101351d215fed7317f5292f25cba5 Text-content-sha1: 0883672016e2a584094f6e9595232eadfecad265 Content-length: 158 SVN��`f �L��L; for an example of a patch implementing this approach, see <a href="http://hp.vector.co.jp/authors/VA024651/#PuTTYkj_top">PuTTYkj</a> Revision-number: 6601 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:13.137393Z PROPS-END Revision-number: 6602 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2006-03-12T14:53:18.130948Z K 7 svn:log V 91 Fix inadvertent O(N^2) loop within do_paint() which I just discovered when profiling IPBT. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c0170fa677359a7d01d2a6b55fc5172 Text-delta-base-sha1: 77cdbeb8cc4e0d71fb40e36ec0927a9310385206 Text-content-length: 182 Text-content-md5: 41a16410f1c2032452457d0649bd7816 Text-content-sha1: 790dbc75d7a47b73d29991e093c40f310cc8a804 Content-length: 182 SVN���������_| �V� �Bif (!dirtyrect) { for (k = laststart; k < j; k++) term->disptext[i]->chars[k].attr |= ATTR_INVALID; dirtyrect = TRUE; } Revision-number: 6603 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:13.575431Z PROPS-END Revision-number: 6604 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:13.586802Z PROPS-END Revision-number: 6605 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2006-03-12T15:39:19.652258Z K 7 svn:log V 53 Log the hash used for DH kex (now there's a choice). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 450c810df93d26682ccb4218d2f2678d Text-delta-base-sha1: 8883d47ab2275d2d4684b15ea22eb51b17fec2be Text-content-length: 159 Text-content-md5: 83e192019a896bf605c9819e6681be75 Text-content-sha1: e27c194689f82691bb7f8e657c1d0833a5683de3 Content-length: 159 SVN�����������_��_� %f(ssh, "Doing Diffie-Hellman key exchange with hash %s", ssh->kex->hash->text_name�'b ��2�MZ Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02208dd2a31842722eb540c3eca879e6 Text-delta-base-sha1: 90e9d09749afa2ef49281caa3ea55b097b917455 Text-content-length: 43 Text-content-md5: 3b30128f70e5fab062f7420005084eb1 Text-content-sha1: d6c4d6a0818607957bfd5f96fccd139e9e8559de Content-length: 43 SVN��4I �w��>v char *text_name; Node-path: putty/sshsh256.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6244414f64d7b520288d811c610fcf4f Text-delta-base-sha1: 2e7f1f518c58e9c1ec1f13abbc88dd5d0fcdbf38 Text-content-length: 921 Text-content-md5: f970f302a0af9ba4bad794149d6e1758 Text-content-sha1: ad1aa049377befaedab623c7425710fda6d3a7e6 Content-length: 921 SVN��ii:S�]��D��1B�yL�sJ�J�ZH�uj{�Jn$�36#include "ssh.h" /* void SHA256_Core_Init(SHA256void SHA256_Init(SHA256_State *s) { SHA256_Core_Init(ssunsigned char *digest) { int i; int pad; unsigned char c[64]h[i] >> 24) & 0xFF; digest[i*4+1] = (s->h[i] >> 16) & 0xFF; digest[i*4+2] = (s->h[i] >> 8) & 0xFF; digest[i*4+3] = (s->/* * Thin abstraction for things where hashes are pluggable. */ static void *sha256_init(void) { SHA256_State *s; s = snew(SHA256_State); SHA256_Init(s); return s; } static void sha256_bytes(void *handle, void *p, int len) { SHA256_State *s = handle; SHA256_Bytes(s, p, len); } static void sha256_final(void *handle, unsigned char *output) { SHA256_State *s = handle; SHA256_Final(s, output); sfree(s); } const struct ssh_hash ssh_sha256 = { sha256_init, sha256_bytes, sha256_final, 32, "SHA-256" }; Node-path: putty/sshsha.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c9277ccc1451aa54345d622ed1e18f9a Text-delta-base-sha1: b9d83b05b3ee0fb3d8df3a640bbeed17706f27d3 Text-content-length: 37 Text-content-md5: d810a0a16f907825eecec2012b4d9c08 Text-content-sha1: 9a2b8a3971df9c86117c766b326b874089a37d28 Content-length: 37 SVN��!* �K��O>�, "SHA-1" }; Revision-number: 6606 Prop-content-length: 238 Content-length: 238 K 8 svn:date V 27 2006-03-12T19:24:05.920054Z K 7 svn:log V 137 Dimitry Andric spotted that DH gex with SHA-256 was overflowing a buffer. Fixed, and added paranoia so that this shouldn't happen again. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 83e192019a896bf605c9819e6681be75 Text-delta-base-sha1: e27c194689f82691bb7f8e657c1d0833a5683de3 Text-content-length: 2370 Text-content-md5: 58c9cea6007860c6933d369db15a5553 Text-content-sha1: cf07375ac449b58fac02cb0736c0bf6caf4b651d Content-length: 2370 SVN���� �6��58SSH2_KEX_MAX_HASH_LEN���O8�w�/�7x�1�+U~�o7P�n"!�v<~�oiP�nT!�!ns->cur_prompt); (Currently assumes 2 lots of any hash are sufficient to generate * keys/IVs for any cipher/MAC. SSH2_MKKEY_ITERS documents this assumption.) */ #define SSH2_MKKEY_ITERS (2)SSH2_KEX_MAX_HASH_LENKEXSSH2_KEX_MAX_HASH_LEN * SSH2_MKKEY_ITERS]; assert(sizeof(keyspace) >= ssh->kex->hash->hlen * SSH2_MKKEY_ITERS); ssh2_mkkey(ssh,s->K,s->exchange_hash,'C',keyspace); assert((ssh->cscipher->keylen+7) / 8 <= ssh->kex->hash->hlen * SSH2_MKKEY_ITERSassert(ssh->cscipher->blksize <= ssh->kex->hash->hlen * SSH2_MKKEY_ITERSassert(ssh->csmac->len <= ssh->kex->hash->hlen * SSH2_MKKEY_ITERS); ssh->csmac->setkey(ssh->cs_mac_ctx, keyspace); memset(keyspace, 0, sizeof(keyspace)SSH2_KEX_MAX_HASH_LEN * SSH2_MKKEY_ITERS]; assert(sizeof(keyspace) >= ssh->kex->hash->hlen * SSH2_MKKEY_ITERS); ssh2_mkkey(ssh,s->K,s->exchange_hash,'D',keyspace); assert((ssh->sccipher->keylen+7) / 8 <= ssh->kex->hash->hlen * SSH2_MKKEY_ITERSassert(ssh->sccipher->blksize <= ssh->kex->hash->hlen * SSH2_MKKEY_ITERSassert(ssh->scmac->len <= ssh->kex->hash->hlen * SSH2_MKKEY_ITERS); ssh->scmac->setkey(ssh->sc_mac_ctx, keyspace); memset(keyspace, 0, sizeof(keyspace)�bSff� w�Mkey = in_commasep_string("publickey", methods, methlen); s->can_passwd = in_commasep_string("password", methods, methlen); s->can_keyb_inter = ssh->cfg.try_ki_auth && in_commasep_string("keyboard-interactive", methods, methlen); } ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; if (s->can_pubkey && !s->done_agent && s->nkeys) { /* * Attempt public-key authentication using a key from Pageant. */ ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; ssh->pkt_ctx |= SSH2_PKTCTX_PUBLICKEY; logeventf(ssh, "Trying Pageant key #%d", s->keyi); /* Unpack key from agent response */ s->pklen = GET_32BIT(s->agentp); s->agentp += 4; s->pkblob = (char *)s->agentp; s->agentp += s->pklen; s->alglen = GET_32BIT(s->pkblob); s->alg = s->pkblob + 4; s->commentlen = GET_32BIT(s->agentp); s->agentp += 4; s->commentp = (char *)s->agentp; s->agentp += s->commentlen; /* s->agentp now points at next key, if any */ /* See if server will accept it */ Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b30128f70e5fab062f7420005084eb1 Text-delta-base-sha1: d6c4d6a0818607957bfd5f96fccd139e9e8559de Text-content-length: 140 Text-content-md5: d4c79b4c739226a8e3166c70192afeb6 Text-content-sha1: c0f13c9c0e1a49dff8aece1dae8b3fbf78ef0e26 Content-length: 140 SVN��I? t��t�= /* The maximum length of any hash algorithm used in kex. (bytes) */ #define SSH2_KEX_MAX_HASH_LEN (32) /* SHA-256 */ Node-path: putty-wishlist/data/dh-gex-sha256 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4eb7f205b4ea490007b12691e319c810 Text-delta-base-sha1: 05c83b2a5df9c7b6237353615b3687dc7c858914 Text-content-length: 123 Text-content-md5: d27c496f234e74cae46e8a79aa8177dc Text-content-sha1: d7ffe7e21fea13659f0eb60055508d52cfd17970 Content-length: 123 SVN�� sj� �j <p> (<em>Update:</em> Note that this support was liable to crash in snapshots before r6006, 2006-03-13.) Revision-number: 6607 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2006-03-12T19:24:37.584305Z K 7 svn:log V 21 Correct revision no. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/dh-gex-sha256 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d27c496f234e74cae46e8a79aa8177dc Text-delta-base-sha1: d7ffe7e21fea13659f0eb60055508d52cfd17970 Text-content-length: 34 Text-content-md5: e4668ce6baf36cb38191e7bb60a371d4 Text-content-sha1: ed6910f43948032dd0fe94549234ae7f801e1464 Content-length: 34 SVN��ss�a�606, 2006-03-13.) Revision-number: 6608 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 54 DH GEX is now RFC 4419 (for all intents and purposes) K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-03-12T20:21:19.499705Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06bd171ecb7a8c567c337cca3263bda2 Text-delta-base-sha1: 38c86423f82708284f30c74582f1ef9c123e7792 Text-content-length: 85 Text-content-md5: 245c738629319806679734ad73f25588 Text-content-sha1: a7849a5ac551645fd5e737e48294d3d03c93cf09 Content-length: 85 SVN��7c;���q;�"rfc/rfc4419.txt"> RFC 4419: Diffie-Hellman Group Exchange Revision-number: 6609 Prop-content-length: 162 Content-length: 162 K 7 svn:log V 62 Equivalent of r6583 window-border palette-change fix for Gtk. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-03-12T22:17:46.706878Z PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06181b4cf0b019523f80b4fd7b5624bc Text-delta-base-sha1: 8494a5ff99418497a902f2339a225656f32154d8 Text-content-length: 913 Text-content-md5: ff9f3b9aa9a26596f3e355d0bd50e75f Text-content-sha1: 09654be71d2d0b43ce2aa9aa82224126e4080bbc Content-length: 913 SVN����R�<�\�Qr�D@v�] { /* Default Background changed. Ensure space between text area and * window border is redrawn */ set_window_background(inst); draw_backing_rect(inst); gtk_widget_queue_draw(inst->area); } } void palette_rese/* Since Default Background may have changed, ensure that space * between text area and window border is refreshed. */ set_window_background(inst); if (inst->area) { draw_backing_rect(inst); gtk_widget_queue_draw(inst->area); }� � �K_SIGNAL_FUNC(selection_clear), inst); if (inst->cfg.scrollbar) gtk_signal_connect(GTK_OBJECT(inst->sbar_adjust), "value_changed", GTK_SIGNAL_FUNC(scrollbar_moved), inst); gtk_widget_add_events(GTK_WIDGET(inst->area), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_M Revision-number: 6610 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2006-03-14T11:21:59.748587Z K 7 svn:log V 101 Pageant docs didn't mention that you could load keys into an existing Pageant from the command line. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pageant.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 098bf941c3da7ba5bce81838fdaf359c Text-delta-base-sha1: 0e2a8be8391850382e7893771a5aa022af620f1e Text-content-length: 254 Text-content-md5: 77858f7ffc1f3cd9df2d906a90dc62b0 Text-content-sha1: e77d47d1db2ffd8bf60abed690afb2a710030262 Content-length: 254 SVN��mR_�&��#O�L!If Pageant is already running, invoking it again with the options below causes actions to be performed with the existing instance, not a new oneIf Pageant is already running, this syntax loads keys into the existing Pageant Revision-number: 6611 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2006-03-14T22:01:27.932860Z K 7 svn:log V 23 Fix minor memory leak. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff9f3b9aa9a26596f3e355d0bd50e75f Text-delta-base-sha1: 09654be71d2d0b43ce2aa9aa82224126e4080bbc Text-content-length: 78 Text-content-md5: fce77469bbc01d06504921b623cf6f69 Text-content-sha1: d1ad821558ab1ababb6a097492ec95bcd462d61d Content-length: 78 SVN���� �A��.<sfree(realhost); � #� �ar_event", GT Revision-number: 6612 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:14.296708Z PROPS-END Revision-number: 6613 Prop-content-length: 246 Content-length: 246 K 7 svn:log V 145 Explicitly add linking to our website to the "asking permission for things" section. Replace the FAQ text with a summary + link to feedback.but. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-03-15T14:31:39.944311Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 419716dc4f462090825afae4030dead5 Text-delta-base-sha1: 9bdd966c62e7df3e4374605f9c633c18394aa6c1 Text-content-length: 190 Text-content-md5: b50d448f642e2e95dfebabad7275cc63 Text-content-sha1: 5355bd461cc8439824dcadd64a62828f8f0f2083 Content-length: 190 SVN��x "�I�"�"VFor most things, you need not bother asking us explicitly for permission; our licence already grants you permission. See \k{feedback-permission} for more details Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2250440c818212eb3088d634e0924d22 Text-delta-base-sha1: 97494ef1bd5c91926c022fd111bbaa4fa1fc1d68 Text-content-length: 409 Text-content-md5: 0ad33a99f64fd431c00eec9f27f61960 Text-content-sha1: 059f5a1d860094f0726325e637936273fd007f12 Content-length: 409 SVN��k t��n�s�yr, but do not insist, that you offer your own first-line technical support, to answer questions about the interaction of PuTTY with your environment. If your users mail us directly, we won't be able to tell them anything useful about your If you just want to link to our web site, just go ahead. (It's not clear that we \e{could} stop you doing this, even if we wanted to!) Revision-number: 6614 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:14.461590Z PROPS-END Revision-number: 6615 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:14.555187Z PROPS-END Revision-number: 6616 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:14.566472Z PROPS-END Revision-number: 6617 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2006-03-23T12:55:30.858742Z K 7 svn:log V 20 Mention workaround. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d417f151fec61cedf4641a9d1c4f94fa Text-delta-base-sha1: 0647695d5e114ba2c0b3576d202294b9611fa7c9 Text-content-length: 208 Text-content-md5: db00b926f6b24ef5bcb50ea94ff2d554 Text-content-sha1: 3e63c7f4522582dfcf140177e5421dce7c1b4a25 Content-length: 208 SVN�� H=� �=<p> In the meantime, this <a href="http://msdn.microsoft.com/workshop/networking/pluggable/overview/appendix_a.asp">workaround</a> from Microsoft's site can be adapted to work with PuTTY. Revision-number: 6618 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2006-03-29T17:55:40.683907Z K 7 svn:log V 54 Update size when going from maximised to full screen. K 10 svn:author V 4 owen PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ab96aeda3bd1c9781af95a7bff14eb01 Text-delta-base-sha1: 10b472cc0c8254f68560a7bce04bec8f477ef527 Text-content-length: 186 Text-content-md5: 61be9c0bfa6095455bcfa3bbc9ee62b6 Text-content-sha1: e126a2979bb69f96f767115cd14db178e4d0f0ff Content-length: 186 SVN����H��H�2J* term->cols != win_width || font_height * term->rows != win_height�3} ?�[��cP elsWe may have changed size as a result */ reset_window(0 Revision-number: 6619 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2006-03-31T09:26:59.504750Z K 7 svn:log V 33 ECCN / FIPS - we can't be arsed. K 10 svn:author V 4 owen PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b50d448f642e2e95dfebabad7275cc63 Text-delta-base-sha1: 5355bd461cc8439824dcadd64a62828f8f0f2083 Text-content-length: 864 Text-content-md5: 5d599a8793b5b6c928491cf9b8c64735 Text-content-sha1: 06a0b409b7242b08887461dfea7ac85a641dbc80 Content-length: 864 SVN�� TD�>�D�R;S{faq-export-cert}{Question} Can you provide us with export control information / FIPS certification for PuTTY? Some people have asked us for an Export Control Classification Number (ECCN) for PuTTY. We don't know whether we have one, and as a team of free software developers based in the UK we don't have the time, money, or effort to deal with US bureaucracy to investigate any further. We believe that PuTTY falls under 5D002 on the US Commerce Control List, but that shouldn't be taken as definitive. If you need to know more you should seek professional legal advice. The same applies to any other country's legal requirements and restrictions. Similarly, some people have asked us for FIPS certification of the PuTTY tools. Unless someone else is prepared to do the necessary work and pay any costs, we can't provide this. Revision-number: 6620 Prop-content-length: 115 Content-length: 115 K 7 svn:log V 16 Alpha NT to go. K 10 svn:author V 4 owen K 8 svn:date V 27 2006-03-31T10:38:54.178951Z PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df9ff43e11b4902573c2715e02ccd33f Text-delta-base-sha1: 05f63afceecc9dee7e69ff7d6ea18ddd76303ac8 Text-content-length: 337 Text-content-md5: e94a64b58db4d798b52b7dabc1cca6e4 Text-content-sha1: 4e769cbf427b4356a879d3404cf0f70c950aeabe Content-length: 337 SVN��,q 9�Z�9�^N6-03-31 Proposed withdrawal of Alpha NT PuTTY</b> <p> From the next release, we propose to stop providing binaries for PuTTY on Windows NT on the Alpha processor. Our own original need for PuTTY on Alpha NT has gone, and our logs suggest that nobody else now uses it. If this is a problem for you, let us know. Revision-number: 6621 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:14.841141Z PROPS-END Revision-number: 6622 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2006-04-04T22:02:00.889191Z K 7 svn:log V 13 + it, cz, us K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 869edc537210eaa07968b8a774447f40 Text-delta-base-sha1: ac9cf3f130380ec02f1b57312027d992b4bd6b08 Text-content-length: 219 Text-content-md5: 8ddbaac4dd383d10eecb186a62a9f75d Text-content-sha1: 625448ed60f2d94b9e1287ad5e975cd89ec65fd6 Content-length: 219 SVN��!�(%�.��^6�U.�A��A��er�I=�JWsh.cvut.cz/">putty.sh.cvutserverdedicato.com/">putty.serverdedicato.com</a> in Italyinfowave.org/">putty.infowave.org</a> in Koreaftp.wayne.edu/putty/">ftp.wayne.edu Revision-number: 6623 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2006-04-04T23:07:22.828771Z K 7 svn:log V 26 spiegelserver.com -> .org K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ddbaac4dd383d10eecb186a62a9f75d Text-delta-base-sha1: 625448ed60f2d94b9e1287ad5e975cd89ec65fd6 Text-content-length: 82 Text-content-md5: 0962d36a3297115eb2ec24828dcc2653 Text-content-sha1: 220a24d25e321835523ba58ce74d0c9f233e373d Content-length: 82 SVN����1���U:�P?�rorg/">putty.spiegelservexedio.de/">putty.xedio.de Revision-number: 6624 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:15.159815Z PROPS-END Revision-number: 6625 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 Summary: Present HTTP proxy interface to dynamic port forwarding K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-04-05T22:33:20.887179Z PROPS-END Node-path: putty-wishlist/data/http-proxy-server Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 561 Text-content-md5: 03d52dad7ca7d1640377b2e796a162c1 Text-content-sha1: bc5c67c21d64c714997da0c8d781301208ef41f3 Content-length: 571 PROPS-END SVN���###Summary: Present HTTP proxy interface to dynamic port forwarding Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body <p> <a href="portfwd-dynamic.html">Dynamic port forwarding</a> presents a SOCKS proxy interface. It might be nice to have the option of presenting an HTTP proxy interface instead, since some clients support that interface and not SOCKS. <p> A potential difficulty is that it's not clear how much of the large and sprawling HTTP specification we would need to implement in order to interoperate usefully. Revision-number: 6626 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:15.216027Z PROPS-END Revision-number: 6627 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:15.228298Z PROPS-END Revision-number: 6628 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:15.239819Z PROPS-END Revision-number: 6629 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:15.250036Z PROPS-END Revision-number: 6630 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:15.260737Z PROPS-END Revision-number: 6631 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:15.273311Z PROPS-END Revision-number: 6632 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:15.287577Z PROPS-END Revision-number: 6633 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:15.300871Z PROPS-END Revision-number: 6634 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2006-04-07T21:42:30.669313Z K 7 svn:log V 186 Remove login name prompt from PSFTP. ssh.c will prompt for a login name as required, and doing so in psftp.c before we've even made a connection is incorrect wrt `bypass-ssh2-userauth'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e114ec47ac56de7e50ce1b95943235b9 Text-delta-base-sha1: aa262113e009ec17e8c612e389796f4b609ef323 Text-content-length: 24 Text-content-md5: 8b832256a9b1d429b02ba215b95b1c29 Text-content-sha1: ebeac1ccb84b4d4af57c41cb31f9428bf3f62df0 Content-length: 24 SVN��D ��m��WD Revision-number: 6635 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2006-04-13T21:06:04.225612Z K 7 svn:log V 33 Another report. Still a mystery. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/x11-ipv6-breakage Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: adaf2d45e2acbcd1a61a95c34e11fcce Text-delta-base-sha1: 6a05bf49c2bb4651762efcbd9d707db10c9d714b Text-content-length: 870 Text-content-md5: c4b7cd10b101baa5f671a0f27476d7a3 Text-content-sha1: a2caff3833dd3b7fd0b106de41135ae6993775cd Content-length: 870 SVN��HAH�y�0�S�i^ 0.58 Content-type: text/x-html-body <p> We've had a couple of reports of X forwarding breakage related to IPv6. <p> One report implied that X forwarding in PuTTY broke rightAnother report (<code><4E2CCFB2C8CC5244939D17374DC28E0003444974@ing.com></code>): <ul> <li>Windows XP Pro SP1 <li>Connecting via an HTTP proxy <li>Same symptom ("explicit kill or server shutdown") <li>Using <code>127.0.0.1:0</code> doesn't help at all <li>X server doesn't matter (tried Exceed, Cygwin) <li>Still happens with "latest development snapshot" (2006-04) <li>Uninstalling IPv6 made the problem go away <li>PuTTY Event Log entries (approximate): <br><pre>2006-04-12 12:44:08 Received X11 connect request from 127.0.0.1:39241 2006-04-12 12:44:08 Opening X11 forward connection succeeded 2006-04-12 12:44:08 Forwarded X11 connection terminated</pre> Revision-number: 6636 Prop-content-length: 451 Content-length: 451 K 8 svn:date V 27 2006-04-13T21:18:09.823745Z K 7 svn:log V 350 Everywhere we print an fxp_error(), try to make it clear what we were trying to do at the time. (A lot of these say just "canonify:". This isn't a nice thing to show to a user, but I don't believe canonify() will ever return failure due to a server error, so users shouldn't actually see it, and it means we have a chance of tracing it if reported.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b832256a9b1d429b02ba215b95b1c29 Text-delta-base-sha1: ebeac1ccb84b4d4af57c41cb31f9428bf3f62df0 Text-content-length: 192 Text-content-md5: 0da8a8aea0ed83e6163bc8992fae5add Text-content-sha1: 349e6ba2a2c32bb2b7741acbc84d20cac7515d15 Content-length: 192 SVN��D=Pc�A��C?���j��v�t� �-!�L�-O�'z�%open for readopen for writecanonifycanonifycanonifycanonifycanonifycanonifycanonifycanonifycanonify Revision-number: 6637 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2006-04-16T11:11:15.529731Z K 7 svn:log V 47 PocketPuTTY has moved and released source code K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 245c738629319806679734ad73f25588 Text-delta-base-sha1: a7849a5ac551645fd5e737e48294d3d03c93cf09 Text-content-length: 95 Text-content-md5: 43791b2e22cc4fce027556bd0b348971 Text-content-sha1: 9ef1a36a43e6b14c4e7968f44fc84cf5d2d3f304 Content-length: 95 SVN��cID�}�D�d�yjpocketputty.net/"> PocketPuTTY</a>, a port for Windows Mobile 2003 Revision-number: 6638 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 27 PocketPuTTY website moved. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-04-16T11:15:20.472238Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d599a8793b5b6c928491cf9b8c64735 Text-delta-base-sha1: 06a0b409b7242b08887461dfea7ac85a641dbc80 Text-content-length: 69 Text-content-md5: a549b3d4aad88ab3733744551a4ac806 Text-content-sha1: 66ae476846a5da87a275ed7d155e0b7c6ebb778c Content-length: 69 SVN��TR -�S��Rwww.pocketputty.net/}\c{http://www.pocketputt Revision-number: 6639 Prop-content-length: 190 Content-length: 190 K 8 svn:date V 27 2006-04-23T18:26:03.626520Z K 7 svn:log V 90 Sprinkle some header comments in various files in an attempt to explain what they're for. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 686921457e7c9ce21c2061daf73a7678 Text-delta-base-sha1: 2d96eb4c21c0494e953557cb1151b8c63254b81c Text-content-length: 110 Text-content-md5: f329e648a25472f4e97b75f56f8e6f9a Text-content-sha1: 61ccee6e06aa59205cf8648bedf1a9dffb554c50 Content-length: 110 SVN��8]]�8�/* * cmdline.c - command-line parsing shared between many of the * PuTTY applications */ Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 615615d2d612422652709a5c618a83c0 Text-delta-base-sha1: efe390460d4ded7826233669d443eb61c659568e Text-content-length: 44 Text-content-md5: 68843bc17c1c68012c4ddc0601649a1c Text-content-sha1: 503655afb53ca985335f9c4185b6e65c9fa13af5 Content-length: 44 SVN��4��/* * Session logging. */ Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b887abb93e2f62da8c27047196724ab7 Text-delta-base-sha1: a4fc0d15ccf6e1188d3e97165aca9a92b578e563 Text-content-length: 46 Text-content-md5: 7b0a6fb38bc5abc98ee6443e5506dca4 Text-content-sha1: 381951b2954e42d9dc7e1a7de6b285a6b5670717 Content-length: 46 SVN��0N�0�/* * Header for misc.c. */ Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9bd1bed6dadecaf05a554ba58ac0ff04 Text-delta-base-sha1: f1504add5344ad21c0898430594d8a391a17bfd0 Text-content-length: 48 Text-content-md5: 8d5ecdd4330e14240e15201a4462808a Text-content-sha1: b47457c120d3ead83d1fa02fd53bd51ab1921ab5 Content-length: 48 SVN��r �r�/* * SSH port forwarding. */ Node-path: putty/puttyps.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 468379bc2e352aa861f3656333ea04fe Text-delta-base-sha1: b758c441c63045eafacab9a87befec3d862cdc2e Text-content-length: 81 Text-content-md5: 21e0c7bbaabf09f395f2510cf7310479 Text-content-sha1: 812f595c7c04acb34fd1a7963ca61e67d6c15088 Content-length: 81 SVN��\@@�\�/* * Find the platform-specific header for this platform. */ Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 28f24fdd7b7c6dfc67a2173eb52e2f5f Text-delta-base-sha1: 056f6c3da12851d28130954487556e2aada76ef1 Text-content-length: 42 Text-content-md5: 95284f835a04b2abc2143dfb50dd77e5 Text-content-sha1: 352f9fd77bdc7eb3dd1b108895f9656498286bac Content-length: 42 SVN��)��/* * "Raw" backend. */ Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 31f226ba9b12eb5045a628b721c5f2eb Text-delta-base-sha1: 2c59161a8dfc4967090c8432f443b93bacda14ac Text-content-length: 43 Text-content-md5: 4fee78bcb79bf1c08eede98b8d270ad0 Text-content-sha1: fa6351456e670179b6f585b52d33ecf349163531 Content-length: 43 SVN������/* * Rlogin backend. */ Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 58c9cea6007860c6933d369db15a5553 Text-delta-base-sha1: cf07375ac449b58fac02cb0736c0bf6caf4b651d Text-content-length: 125 Text-content-md5: 2b75133a667c418a592eefa5ecd142b5 Text-content-sha1: cb22c2e2a8f25b5ba6bba0bb9059314eff14f925 Content-length: 125 SVN�����h�/* * SSH backend. */ ����h�ate. */ free_prompts(�Sk�S�red"); } s->can_pub Node-path: putty/sshdh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b9fa1cd94100b85c150191529ab3b69 Text-delta-base-sha1: b9bf27866dc8117a83d2420a7925dee1da465052 Text-content-length: 68 Text-content-md5: b0db7b5019b9f6c0431411d3665eee4e Text-content-sha1: f67e79dd2543fdb8a7b7178ed18a8cf7554b751d Content-length: 68 SVN��_4�_�/* * Diffie-Hellman implementation for PuTTY. */ Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e598f83ed8d1bc958d575160fdeb5a30 Text-delta-base-sha1: 94ba68a61b6ef8ae04996b9706abeb1cd06c74c8 Text-content-length: 84 Text-content-md5: 264f3c7c696a8a521cfa8f8b5040379a Text-content-sha1: 896da586b5b74410e38bb2d1ace31efa1850d0c8 Content-length: 84 SVN��,l@@�,�/* * Digital Signature Standard implementation for PuTTY. */ Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 707dbe985cae2c8c88ab5f45215e2abc Text-delta-base-sha1: e6f96cac1ab8f970d4020dff9529df15a2f0afc4 Text-content-length: 46 Text-content-md5: 9f652f133f6738644166e1acbf24e277 Text-content-sha1: 7f0ece109f6e246acb81016dee351156c8f7ce1d Content-length: 46 SVN��/J�/�/* * Telnet backend. */ Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 41a16410f1c2032452457d0649bd7816 Text-delta-base-sha1: 790dbc75d7a47b73d29991e093c40f310cc8a804 Text-content-length: 96 Text-content-md5: a66578040e54227eb593fd43985ff4e3 Text-content-sha1: f7a4a68afadba1804b84a5ab94137a1fb4027f0b Content-length: 96 SVN�����b�/* * Terminal emulator. */ �|�|�attr |= ((term->esc_a Node-path: putty/windows/sizetip.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c86af30d03fa765946a7ffd0642d31dd Text-delta-base-sha1: 78a680fb4fafb9303325e4fc267e4d990401cf79 Text-content-length: 84 Text-content-md5: 30ed6c54b4444ecf4a19b580e082556b Text-content-sha1: 3e4364eee6ba576384ddf5db636614beac9ad7d9 Content-length: 84 SVN��/rCC�/�/* * sizetip.c - resize tips for PuTTY(tel) terminal window. */ Node-path: putty/windows/win_res.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 398e0c61a5af9f8b92bfdadb527a5d60 Text-delta-base-sha1: 97138145f0991d49cb4eecf66eba9f36851e9ec5 Text-content-length: 93 Text-content-md5: a935cf144ce53f12f2ef640c22a96eb9 Text-content-sha1: b0850e802c45b220624db00629eb63a912b01f0c Content-length: 93 SVN��jLL��/* * win_res.h - constants shared between win_res.rc2 and the C code. */ Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c3d22ed7072c64a9b8e3c91554fa8086 Text-delta-base-sha1: ce9688d6de9d2f5c503807160122aface33e83a5 Text-content-length: 33 Text-content-md5: f1b6a256cf90bab279855ce0bf492317 Text-content-sha1: 2a5f47d181bce2f4a94f71eafd6ede79f1cb14e0 Content-length: 33 SVN��"#�/* * wincons.c - Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bebc106b0ed96889b3fe1c89bf304699 Text-delta-base-sha1: cbe1d73a49129b1d8310f5cc7b991db0b7901651 Text-content-length: 102 Text-content-md5: 51fd0cbda144ae2a38fc3bee00555c75 Text-content-sha1: 630c1ebeffcc3b8c6ec24453a2a178785cef3d49 Content-length: 102 SVN��pRR��/* * windlg.c - dialogs for PuTTY(tel), including the configuration dialog. */ Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 61be9c0bfa6095455bcfa3bbc9ee62b6 Text-delta-base-sha1: e126a2979bb69f96f767115cd14db178e4d0f0ff Text-content-length: 270 Text-content-md5: 3007b622f78a6d2df2c5d489749d05a0 Text-content-sha1: 39bc4d224229efdc92a7a0f1d8bcee47160845dc Content-length: 270 SVN����tt� �/* * window.c - the PuTTY(tel) main program, which runs a PuTTY terminal * emulator and backend in a window. */ �}qtt�}� { if (term->vt52_mode) { if (xkey >= 'P' && xkey <= 'S') p += sprintf((char *) p, "\x1B%c", xkey); Node-path: putty/windows/wintime.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d8a5a7898412f68e15bdf2f877690ca Text-delta-base-sha1: e904f4f2432399b1c5870ddb3d609f31e6dd1708 Text-content-length: 99 Text-content-md5: f082d73de5272b6a8d08da1234501f33 Text-content-sha1: 9244575a73f45d73ca18b6a155d01aab12b55a6b Content-length: 99 SVN��GRR�G�/* * wintime.c - Avoid trouble with time() returning (time_t)-1 on Windows. */ Revision-number: 6640 Prop-content-length: 230 Content-length: 230 K 8 svn:date V 27 2006-04-23T19:18:49.353953Z K 7 svn:log V 129 Where one autogenerated page references another, tweak the href so that it references the website version, not the docs version. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/autogen.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c94cca8e9cec700d53b8b16b8c3c2592 Text-delta-base-sha1: e00754ce13b829d2dc5c10f5ba3b1038907a11ab Text-content-length: 228 Text-content-md5: 5ebfdddd70cad8d82cea5f88bde7bc0b Text-content-sha1: d18a1b67aca8cfb5a41ab16b174786d9ba53a055 Content-length: 228 SVN��BID�|��D|�B@<?if ( ) { return $_; } else { foreach my $file (@files) { return $_ if s#^\Q$file->[1]\E#$file->[0]#; } s#^#http://www.tartarus.org/~simon/puttydoc\/#; return $_; } Revision-number: 6641 Prop-content-length: 489 Content-length: 489 K 8 svn:date V 27 2006-04-26T23:01:06.907009Z K 7 svn:log V 388 sbcsgen.pl was giving different results on different machines in the case where two SBCS code points mapped to a single Unicode point. Changed so that by default it favours the lower SBCS code point. On ixion, this highlighted ambiguities in CS_MAC_THAI, CS_MAC_SYMBOL, and CS_VISCII. Guessed at a preference for the first two and added "sortpriority" directives. (No idea about VISCII.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/charset/sbcs.dat Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 39336bdc0359f05efc37b48603bcd6d1 Text-delta-base-sha1: 1c3e2c3f480652ce16b14f71eb9df80d975a037c Text-content-length: 482 Text-content-md5: 40ee83fde71f0c9b60f3853e808a39fa Text-content-sha1: b421294d40c409e7caab629a5db3b28dfbfa1c66 Content-length: 482 SVN�� 0$�-��>*A���.j�+��[?�HX Many of the positions 80-9F in Mac OS Thai are for presentation forms of other characters. When converting from Unicode, we use `sortpriority' to avoid them. Positions E2-E4 in Mac OS Symbol are for sans-serif variants of other characters. Similarly, we avoid themsortpriority 83-8C -1 sortpriority 8F-8F -1 sortpriority 92-9C -1sortpriority E2-E4 -12200 0023 2203 0025 0026 220d 0028 0029 2217 002b 002c 2212 Node-path: putty/charset/sbcsgen.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 220109a7c6307fb40f635c5a988c7c7b Text-delta-base-sha1: a5765c94cd57036368e0574f895546cbba1f2436 Text-content-length: 161 Text-content-md5: a8744758627ac46816e3d54ca2e14a82 Text-content-sha1: 5dd50f8923b876096d590caebb26a8d3ab382776 Content-length: 161 SVN��:j �b� �;($a->[1] == $b->[1] ? $b->[2] <=> $a->[2] : $a->[1] <=> $b->[1]) || $a->[0] <=> $b->[0 Revision-number: 6642 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:16.458934Z PROPS-END Revision-number: 6643 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:16.469691Z PROPS-END Revision-number: 6644 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2006-04-29T14:22:26.447154Z K 7 svn:log V 19 Mention WinTabber. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 43791b2e22cc4fce027556bd0b348971 Text-delta-base-sha1: 9ef1a36a43e6b14c4e7968f44fc84cf5d2d3f304 Text-content-length: 186 Text-content-md5: efa6823f6d5454dba57c0c0d6cd9a5b8 Text-content-sha1: ab2b390c6a4b473a93edbebeacf8a35aa9f9c2b4 Content-length: 186 SVN��Iy "�e�"�rWli><a href="http://www.wintabber.com/"> WinTabber</a> allows PuTTY sessions (and other programs) to be captured into a single tabbed window on Windows 2000/XP Node-path: putty-wishlist/data/multiple-connections Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d04c9c5ef2b574b2990c027fc50e03bc Text-delta-base-sha1: ee5286fbb5b3b6cce4e936001adb3b0977ef62ac Text-content-length: 143 Text-content-md5: 3210d6fc486e5de775be2825c3b57579 Text-content-sha1: e9837a1ed13e504f638b1f7c2cfee5daf10675a3 Content-length: 143 SVN��RN y��y�<ul> <li><a href="http://www.wintabber.com/">WinTabber</a> is an implementation of this concept for Windows 2000/XP. </ul> Revision-number: 6645 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:16.935881Z PROPS-END Revision-number: 6646 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:16.947611Z PROPS-END Revision-number: 6647 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:16.959502Z PROPS-END Revision-number: 6648 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:16.971718Z PROPS-END Revision-number: 6649 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:16.984155Z PROPS-END Revision-number: 6650 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:16.995717Z PROPS-END Revision-number: 6651 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:17.008333Z PROPS-END Revision-number: 6652 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:17.019018Z PROPS-END Revision-number: 6653 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:17.031014Z PROPS-END Revision-number: 6654 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:17.041604Z PROPS-END Revision-number: 6655 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:17.052387Z PROPS-END Revision-number: 6656 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:17.063670Z PROPS-END Revision-number: 6657 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:17.076231Z PROPS-END Revision-number: 6658 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:17.088506Z PROPS-END Revision-number: 6659 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:17.100844Z PROPS-END Revision-number: 6660 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:17.112989Z PROPS-END Revision-number: 6661 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2006-05-07T15:26:10.873736Z K 7 svn:log V 13 erdihost.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0962d36a3297115eb2ec24828dcc2653 Text-delta-base-sha1: 220a24d25e321835523ba58ce74d0c9f233e373d Text-content-length: 100 Text-content-md5: add518abd03ee19d694717b872b02e02 Text-content-sha1: 94d72474095baf6818c1596eab74ea26b357567a Content-length: 100 SVN���oD���A��R��|erdihost.com/putty/">erdihost.com</a> in Puerto Ricon9.ru/">putty.n9 Revision-number: 6662 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 32 Update reference to RFC status. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-05-07T18:27:36.605074Z PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 87b07820a22b7bf38f532cc3059b6a34 Text-delta-base-sha1: 47ff58cca2b2b6a5ba578ee59707310f7bae1399 Text-content-length: 154 Text-content-md5: 7a9417041be42b06d31d636e47c57c9a Text-content-sha1: 9273cbeb7506fdb1a32ac7481b3e1a2822af6756 Content-length: 154 SVN��T}�L�F�sq�? <a href="http://www.ietf.org/rfc/rfc4462.txt">RFC 4462</a> (formerly es GSSAPI key exchange and user authentication in SSH-2. Revision-number: 6663 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.334029Z PROPS-END Revision-number: 6664 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.344383Z PROPS-END Revision-number: 6665 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.355134Z PROPS-END Revision-number: 6666 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.366083Z PROPS-END Revision-number: 6667 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.377447Z PROPS-END Revision-number: 6668 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.388519Z PROPS-END Revision-number: 6669 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.399635Z PROPS-END Revision-number: 6670 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.411073Z PROPS-END Revision-number: 6671 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.422918Z PROPS-END Revision-number: 6672 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.433940Z PROPS-END Revision-number: 6673 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.536144Z PROPS-END Revision-number: 6674 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.551132Z PROPS-END Revision-number: 6675 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.562437Z PROPS-END Revision-number: 6676 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:18.574155Z PROPS-END Revision-number: 6677 Prop-content-length: 236 Content-length: 236 K 7 svn:log V 135 I think this applies to more cases than when a session is closed, and in particular is probably what's behind Nigel Tingle's symptoms. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-05-11T21:46:49.380083Z PROPS-END Node-path: putty-wishlist/data/ssh-stuck-queue Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d331f26151b4dd3b175d7bb6ce9e3a7 Text-delta-base-sha1: 63a29a62e6a8bb2713948a4c7a83b68f4095bc57 Text-content-length: 765 Text-content-md5: 1402462b34eeac3b7fbcffca81148688 Text-content-sha1: 7b5a4b37f14d6555d6ed8149211d7f26b576d954 Content-length: 765 SVN��Cpb�DP�4Summary: SSH data can get stuck in a queue if session throttled Present-in: 0.58 Class: bug Content-type: text/x-html-body <p> If an SSH connection is throttled ("frozen"), incoming data can end up stuck in <code>ssh->queued_incoming_data</code> and not processed until more data arrives from the network (or ever, if the socket has closed in the meantime), since that buffer is only examined when new data arrives. In general, queued data may be being processed rather later than it could be. <p> For instance, <tt>cat</tt>'ing a large text file might hang, only to resume when a key is pressed (which will result in outgoing and then incoming traffic)Another likely report of this problem: <br><tt><4460FE84.10303@bytte.plus.com Revision-number: 6678 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2006-05-11T22:47:01.865452Z K 7 svn:log V 78 Note that the solution is already partially present. (I remember that one...) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh-stuck-queue Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1402462b34eeac3b7fbcffca81148688 Text-delta-base-sha1: 7b5a4b37f14d6555d6ed8149211d7f26b576d954 Text-content-length: 94 Text-content-md5: fb4431ea600579acf07ffc4f6e15ff83 Text-content-sha1: 202fb29aac1c3fa5b06db07904f1875050425450 Content-length: 94 SVN��p=M�p�M(This is already done in some places, e.g., <tt>ssh_dialog_callback()</tt>.) Revision-number: 6679 Prop-content-length: 145 Content-length: 145 K 7 svn:log V 46 pty_init should put _something_ into realhost K 10 svn:author V 4 owen K 8 svn:date V 27 2006-05-12T11:02:28.420616Z PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9686fe4c199af283e0aaea04b12f267 Text-delta-base-sha1: fb4ec99bd9f54afb0b7253dd9800a175a7eec53d Text-content-length: 52 Text-content-md5: e8b6065c3199a572920b6d3c3c1f8623 Text-content-sha1: d3e2d64cc4e4b9a0c4111049522c32ae6ef0de93 Content-length: 52 SVN��\~ ���`|*realhost = dupprintf("\0") Revision-number: 6680 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.265899Z PROPS-END Revision-number: 6681 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.278634Z PROPS-END Revision-number: 6682 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.290669Z PROPS-END Revision-number: 6683 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.304150Z PROPS-END Revision-number: 6684 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.316408Z PROPS-END Revision-number: 6685 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.328591Z PROPS-END Revision-number: 6686 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.339958Z PROPS-END Revision-number: 6687 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.352006Z PROPS-END Revision-number: 6688 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.363481Z PROPS-END Revision-number: 6689 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.375187Z PROPS-END Revision-number: 6690 Prop-content-length: 241 Content-length: 241 K 7 svn:log V 140 Bring this up to date, by removing the repeated references to remove-statics not having been done yet. Also reformat nicely while I'm here. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-05-17T09:57:07.858726Z PROPS-END Node-path: putty-wishlist/data/dll-frontend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b7d4edec708a0f3379fbf455d50eacf3 Text-delta-base-sha1: cb716243d6d431fcded9779073967e0e9d1951fe Text-content-length: 2729 Text-content-md5: 5b54dd64e916c512b01dfbf8fb0039a9 Text-content-sha1: 6f408c068b3206727ee5600dff50e0b90b96f6a2 Content-length: 2729 SVN��*6$y���@�0]�8(� _'�r.x-html-fragment <p><p><p> When I hear "DLL for PuTTY"<pre></pre> <p>... and so on. So you'd end up with `<code>SSH_Channel</code>' handles which worked a little like file handles - you could do a blocking read on a particular one of them, for example, or wait until one of a selection of them became ready. (If you wanted to wait for data from either an SSH channel or a Windows-side object, interfacing between this sort of <code>select()</code> and the Windows equivalents might be fun, but I'm sure it could be worked out. Perhaps an API function which would hand you a Windows event object that would get set when one of the channels was active.) <p>The biggest immediate problems I see with it are: <ul> <li> PuTTY needs its own event loop, so that it can respond to server- side requests (such as repeat key exchange and server-side pings) in the SSH connection it's managing. This might not be easy to integrate with whatever kind of event loop the calling program is using - if indeed it's using an event loop at all; the kind of code I quote above would probably much rather stay sequential than become event-driven with explicit state. Hence I think the simplest way to arrange this is to have the DLL spawn a thread to manage PuTTY's own network event loop, which can then run without interfering with what the rest of the program is doing. That way, the calling program could call the send-data function, go off and do its own thing for a while, and then come back and see if data had come back for it to read yet. <li> (On the other hand, if the caller <em>did</em> want to integrate PuTTY into their own event loop so that they received immediate notification when data came in, that would be another thing we'd want to allow them to do. Perhaps allowing them to provide an event object which we could set when particular things happened might be a useful approach.) <li> The DLL interface would need careful design. In particular, what should happen about interactive prompts - passwords, passphrases, host key verification, and so on? Should all of those things be fatal errors (limiting the DLL to being used in a context where unattended login is possible), or what? I think it would be a mistake to have this sort of prompt go directly to the user; it would probably be better to notify the calling program in some way, and leave it to decide how to handle it. (Although perhaps providing helper routines that gave standard dialog boxes for these prompts might also be an interesting option.) </ul> <p> However, none of those issues is insurmountable, and once they're taken care of I don't see why a DLL providing an API like the <code>plink.c</code>. Revision-number: 6691 Prop-content-length: 135 Content-length: 135 K 10 svn:author V 5 simon K 8 svn:date V 27 2006-05-17T10:06:18.220992Z K 7 svn:log V 35 Rats. Misspelled text/x-html-body. PROPS-END Node-path: putty-wishlist/data/dll-frontend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b54dd64e916c512b01dfbf8fb0039a9 Text-delta-base-sha1: 6f408c068b3206727ee5600dff50e0b90b96f6a2 Text-content-length: 25 Text-content-md5: 3e4dc7824fc70415789f59ea34da39c6 Text-content-sha1: 85be4f36e81ae5ac9985026227232603c471aba9 Content-length: 25 SVN��62 ���'body Revision-number: 6692 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2006-05-17T10:34:13.885612Z K 7 svn:log V 84 I've explained this once too often. Stick it on the wishlist for general reference. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/key-formats-natively Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 4109 Text-content-md5: b5805a64de15c271d77eee3b1829fbe8 Text-content-sha1: 7b85f09d1f4b32baf93a456e5f89c43908bbdba9 Content-length: 4119 PROPS-END SVN���Summary: Ability to use OpenSSH and ssh.com SSH-2 private keys directly (without first converting with PuTTYgen) Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body <p> We are occasionally asked if PuTTY could acquire the ability to use foreign private key formats. The PuTTY <em>suite</em> supports these key formats, in the sense that PuTTYgen can load and save them and convert them into PuTTY's own PPK key format; but a conversion step is required, because PuTTY itself does not include the foreign key import code. <p> I'm unwilling to do this, because I designed the PPK format rather carefully with some specific design goals in mind, and PuTTY in its current form actually depends on those design goals. The advantages of the PuTTY key format are: <ul> <li> <b>Public half of key is stored in plaintext</b>. OpenSSH's private key format encrypts the entire key file, so that the client has to ask you for your passphrase before it can do anything with the key at all. In particular, this means it has to ask for your passphrase before it can even <em>offer</em> the public key to the server for authentication. PuTTY's format stores the public key in plaintext and only encrypts the private half, which means that it can automatically send the public key to the server and determine whether the server is willing to accept authentications with that key, and it will only ever ask for a passphrase if it really needs to. <p> I think OpenSSH will read a <code>.pub</code> file for this purpose if it appears alongside the private key file, but this is a source of confusion as often as convenience (I've seen people replace a private key file and leave an out-of-date <code>.pub</code> alongside it, and then be very confused by the resulting SSH authentication process!). <li> <b>Key is fully tamperproofed</b>. Key formats which store the public key in plaintext can be vulnerable to a tampering attack, in which the public half of the key is modified in such a way that signatures made with the doctored key leak information about the private half. For this reason, PuTTY's key format contains a MAC (Message Authentication Code), keyed off the passphrase, and covering the public <em>and</em> private halves of the key. Thus, we provide the convenience of having the public key available in plaintext but we also instantly detect any attempt at a tampering attack, giving a combination of security and convenience which I do not believe is found in any other key format. As a side benefit, the MAC also covers the key's comment, preventing any possible mischief that might be possible if someone were to swap two keys and interchange the comments. <p> OpenSSH's approach of keeping the public key encrypted <em>might</em> also provide some security against this type of attack, but it's unclear that it provides proper protection: encryption designed for confidentiality often leaves ways in which the encrypted data can be usefully modified by an attacker. For real integrity protection you want a real dedicated MAC, which is designed to do precisely that. </ul> <p> So in order to support non-PPK key formats in PuTTY, we would have to revamp the public-key authentication code considerably, to make it a lot more flexible about when it asked the user for a passphrase. This would also lead to confusing subtle differences in operation depending on the key type in use; supporting OpenSSH's <code>.pub</code> files would also introduce the same failure mode as OpenSSH exhibits when the two files get out of sync; and for all of this coding effort on our part and potential UI-level chaos, we would be providing users with the ability to decrease the security of their private keys without even necessarily being aware of it. <p> Therefore, our current intention is not to implement this feature, and our recommendation is that people convert foreign private key formats to PPK in order to use them with PuTTY. This is not too difficult now that we have a Unix command-line port of PuTTYgen, which should make it feasible to automate such conversion. Revision-number: 6693 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2006-05-17T12:06:08.190685Z K 7 svn:log V 71 Link to new `key-formats-natively' wishlist item from appropriate FAQ. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a549b3d4aad88ab3733744551a4ac806 Text-delta-base-sha1: 66ae476846a5da87a275ed7d155e0b7c6ebb778c Text-content-length: 101 Text-content-md5: 967359e4da78394e7cf26683facb2aa4 Text-content-sha1: ac08618e642e86a52cc07f6b60fef46706314d77 Content-length: 101 SVN��RYG�7��@�C�7 (sekey-formats-natively.html}{the wishlist entry} for reasons why not) Revision-number: 6694 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.945253Z PROPS-END Revision-number: 6695 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.957990Z PROPS-END Revision-number: 6696 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.974510Z PROPS-END Revision-number: 6697 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:19.987552Z PROPS-END Revision-number: 6698 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.000734Z PROPS-END Revision-number: 6699 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.017329Z PROPS-END Revision-number: 6700 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.030780Z PROPS-END Revision-number: 6701 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.064679Z PROPS-END Revision-number: 6702 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.076750Z PROPS-END Revision-number: 6703 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.114247Z PROPS-END Revision-number: 6704 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.137858Z PROPS-END Revision-number: 6705 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.148871Z PROPS-END Revision-number: 6706 Prop-content-length: 453 Content-length: 453 K 8 svn:date V 27 2006-05-18T14:29:51.808538Z K 7 svn:log V 352 Link to PuTTY 0.57 archive directory. (Really, I'd like to link to all the old versions from the Changes page, but ideally there should be warning messages in place for versions with known security holes, via .htaccess or similar. Also, we should ensure that the rsync mirrors always point back to our site for these links, as they are not mirrored.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c894422e91b1bbd74e8f4f1a52b875f2 Text-delta-base-sha1: 1535d9dfb97d321db261b9924bc6e1524c098ba4 Text-content-length: 101 Text-content-md5: 22d3723e94af0c4e4074a44b37f55283 Text-content-sha1: da1ae201bb17b7cfb00f15ba0b344a5c69320e5e Content-length: 101 SVN��PT�A�T <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/0.57">0.57</a>.) </ul> Revision-number: 6707 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.256418Z PROPS-END Revision-number: 6708 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.268044Z PROPS-END Revision-number: 6709 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.279138Z PROPS-END Revision-number: 6710 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.290894Z PROPS-END Revision-number: 6711 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.304406Z PROPS-END Revision-number: 6712 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.316882Z PROPS-END Revision-number: 6713 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.330700Z PROPS-END Revision-number: 6714 Prop-content-length: 295 Content-length: 295 K 8 svn:date V 27 2006-05-21T12:20:42.201913Z K 7 svn:log V 194 Port r6710 from puzzles: Patch from Ben Hutchings to prevent an ugly special case in &splitline in which a line is `split' into a line ending in a backslash followed by a completely blank line. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 58793dcf9ee47828d5eb3f6dbcf10588 Text-delta-base-sha1: a56d16b8b5e07bb2fd97b2cbf6a3e092a2e50b74 Text-content-length: 74 Text-content-md5: a8b9c72c8d4d3f96a9c58b9c7ea3fc91 Text-content-sha1: 667a91fc2c07a0fc5f031b4009f39b170f1c6151 Content-length: 74 SVN��w 2�9��&Q; $result .= " ${splitchar}\n\t\t" if $2 ne '' Revision-number: 6715 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.509661Z PROPS-END Revision-number: 6716 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 Minor mission creep resulting from a suggestion by Dean Earley. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-05-24T14:56:52.768648Z PROPS-END Node-path: putty-wishlist/data/key-mapping Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 831da3300b80f519c8d2bb69939f4639 Text-delta-base-sha1: 663d87f70f9342f17274a9b613fe0fa11ff1c8c6 Text-content-length: 541 Text-content-md5: be949f47c7b3be6d2e75d32af46d8b45 Text-content-sha1: f412914ee863977f20065a795871b98787f1ca9c Content-length: 541 SVN��' �� <p> <b>SGT, 2006-05-24</b>: A user suggests that it would be nice when using some server-side applications (<code>irssi</code> in particular) to be able to configure the mouse scroll wheel to send scroll-up and scroll-down keypresses to the server. This seems to me to be best implemented by having a general key remapping layer and making it able to remap mouse events as well as key events. (This would also allow users to disable or reconfigure the normal mouse button behaviour as well if they disliked the default.) Revision-number: 6717 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2006-05-26T12:45:21.162571Z K 7 svn:log V 124 Make it clearer that `psftp -b' doesn't return to the interactive prompt if the script doesn't end with an explicit `quit'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e99a869e1cba89d25d4bc02ea7f0441 Text-delta-base-sha1: edf9b5a768c5a24e5065d78a2fcc383e82f34e44 Text-content-length: 95 Text-content-md5: 30a5e12b48e62348986be420052bb708 Text-content-sha1: 3d076b3472e76c0d53798d15dead7599b68577e5 Content-length: 95 SVN��XA�5��=A�GUPSFTP will terminate after it finishes executing the batch script Revision-number: 6718 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.879042Z PROPS-END Revision-number: 6719 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.891594Z PROPS-END Revision-number: 6720 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.903821Z PROPS-END Revision-number: 6721 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:20.915405Z PROPS-END Revision-number: 6722 Prop-content-length: 268 Content-length: 268 K 8 svn:date V 27 2006-06-02T08:46:34.726820Z K 7 svn:log V 167 Lionel Fourquaux offers this very simple patch to speed up SFTP, simply by upping the packet sizes and maximum in-flight packet count. Got to be worth a try, I think! K 10 svn:author V 5 simon PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02ae18e31b4151a124d5432fac9f9582 Text-delta-base-sha1: 3c3a12b6538eb2718a203f74e2e54037a0b5862a Text-content-length: 97 Text-content-md5: a203b4d8e090497030ec8c00fe6f04a1 Text-content-sha1: bddcdd92424286ce1ef8761d3bc1639ae7022571 Content-length: 97 SVN��MO G��G��M32768]; unsigned long blksize; int read; blksize = 32768 Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 86fd4934f8a3c3f97e3b9e7aa093b296 Text-delta-base-sha1: 6d83149e76650dcd36a9c7179430327dec784384 Text-content-length: 43 Text-content-md5: db00b97afe12dd37d34620c096eb0837 Text-content-sha1: b2cd900fa5c26ef23a702f4990d061607d843bfb Content-length: 43 SVN��  �2��*6�(d04857632768 Revision-number: 6723 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2006-06-02T14:29:48.765223Z K 7 svn:log V 53 Jordan Abel's suggestion of a UTF-8-plus-VT100 mode. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/utf8-plus-vt100 Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1593 Text-content-md5: 37518afed25b06a99d1dd3edcd8399d8 Text-content-sha1: 3c036cf493c395f67e81a6758efb64f24ce148c2 Content-length: 1603 PROPS-END SVN���+++Summary: Simultaneous support for UTF-8 and enough ISO-2022 sequences for VT100 line drawing Class: wish Priority: low Difficulty: fun Content-type: text/x-html-body <p> It's been suggested that it might be nice for PuTTY to support the traditional VT100 line drawing behaviour (using ISO-2022 escape sequences such as ESC ( B, ESC ) 0, SO and SI) in the same mode as also supporting UTF-8. This would allow it to simultaneously support legacy applications which ran on a VT100 and hence never output any character value above 0x7F, and modern UTF-8-aware applications. <p> Markus Kuhn <a href="http://www.cl.cam.ac.uk/~mgk25/unicode.html#term">thinks this is wrong</a> ("While a terminal emulator is in UTF-8 mode, any ISO 2022 escape sequences [...] are ignored"), and I (SGT) am inclined to agree, not least because the lack of easily corruptible ISO 2022 state is a useful defence against the confusion caused by accidentally spewing binary files into your standard output. On the other hand, I can see the potential utility of being able to run two classes of plausibly common application without needing a mode switch or <code>luit</code>. So I think that if we do this at all (which isn't clear, hence priority "low"), it should be a configurable option. <p> BJH points out that ISO 2022 requires that when we return from UTF-8 (by ESC % @) the ISO-2022 state must be the same as when we left, so if we did this then we'd have to keep a separate pseudo-ISO-2022 state inside the UTF-8 mode (and discard it on ESC % @, rather than preserving it until the next ESC % G). Revision-number: 6724 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:21.166607Z PROPS-END Revision-number: 6725 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2006-06-03T12:44:10.018061Z K 7 svn:log V 32 Various new/reinstated mirrors. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: add518abd03ee19d694717b872b02e02 Text-delta-base-sha1: 94d72474095baf6818c1596eab74ea26b357567a Text-content-length: 361 Text-content-md5: 886ec55dbb373fa8e42a9abfcfa36aeb Text-content-sha1: 3d2d6c432aa66bf555d204cd2d0124b96182c398 Content-length: 361 SVN��obF�6��B@�o<�Z5�P?�+�D>�|=�M�=9�I��GpG�Pputty.wnpower.com/">putty.wnpower.com</a> in Argentinbemirror.org/">putty.bevisiolab.de/">putty.visiolab.decbn.net.id/">putty.cbn.net.id</a> in Indoneputty.leetnet.com/">putty.leetnetrtin.bz/">putty.rtin.bzutron.blogeek.org/pub/mirrors/putty/">neutron.blogeek.org</a> in France Revision-number: 6726 Prop-content-length: 245 Content-length: 245 K 8 svn:date V 27 2006-06-10T10:51:13.355198Z K 7 svn:log V 144 Summary: Clipboard operations unreliable in mouse reporting mode ...because the mouse release can be sent to the server if Shift isn't pressed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/raw-mouse-copy Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 533 Text-content-md5: 5b881ee9145241d262f572c074d8aef1 Text-content-sha1: 13fad151f1dc5e1bf3972fdcee991a74cf4fec9d Content-length: 543 PROPS-END SVN���Summary: Clipboard operations unreliable in mouse reporting mode Class: bug Difficulty: fun Present-in: 0.58 2006-06-10 Content-type: text/x-html-body <p> When the terminal is in "mouse reporting" mode, and Shift is used to override this for clipboard operations, text is not reliably copied to the clipboard. <p> In particular, if the Shift key is released before the mouse button being used for selection is released, the copy operation does not happen -- the mouse release event is reported to the server instead. Revision-number: 6727 Prop-content-length: 284 Content-length: 284 K 7 svn:log V 183 Do not send raw mouse events in the middle of a selection operation, even if we otherwise would (for instance, if Shift is released before the mouse button being used for selection). K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-06-11T12:56:52.676940Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a66578040e54227eb593fd43985ff4e3 Text-delta-base-sha1: f7a4a68afadba1804b84a5ab94137a1fb4027f0b Text-content-length: 467 Text-content-md5: 878cd1b8b31625bcf437d5f45d20a1a7 Text-content-sha1: 725437db0d6b09732ba58f8bfc868087a4eb3c8b Content-length: 467 SVN���������3&�P�&�=]/* * If we're in the middle of a selection operation, we ignore raw * mouse mode until it's done (we must have been not in raw mouse * mode when it started). * This makes use of Shift for selection reliable, and avoids the * host seeing mouse releases for which they never saw corresponding * presses. */ if (raw_mouse && (term->selstate != ABOUT_TO) && (term->selstate != DRAGGING) Node-path: putty-wishlist/data/raw-mouse-copy Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b881ee9145241d262f572c074d8aef1 Text-delta-base-sha1: 13fad151f1dc5e1bf3972fdcee991a74cf4fec9d Text-content-length: 45 Text-content-md5: 45d2705aac2c7b2414d1f2278ff6a21f Text-content-sha1: 36de461dd21d9048db10290ba3cc34f2c33b6767 Content-length: 45 SVN��"�x��wFixed-in: r6727 2006-06-12 Revision-number: 6728 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:21.534620Z PROPS-END Revision-number: 6729 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 35 Add RFC reference for this syntax. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-06-14T22:26:24.432821Z PROPS-END Node-path: putty-wishlist/data/ipv6-scoped-addr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d05f2f03f932254b0192f73c30868c5a Text-delta-base-sha1: 5c3d1285d6af2e83a3a139d557c2fb6a581080d7 Text-content-length: 45 Text-content-md5: 8c78c7e38eb2083ba5ad61792489d97a Text-content-sha1: a105740995bacad8492a1b8631925b4900dc294d Content-length: 45 SVN��D\ �-��- (as defined in RFC4007) Revision-number: 6730 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2006-06-16T13:09:47.105274Z K 7 svn:log V 36 Update status of our PocketPC port. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 967359e4da78394e7cf26683facb2aa4 Text-delta-base-sha1: ac08618e642e86a52cc07f6b60fef46706314d77 Text-content-length: 192 Text-content-md5: 6a0ee94d3713f26daa696c0b28060e8c Text-content-sha1: 2c11b353da314fe575ca655066c7627d931009ec Content-length: 192 SVN��Y %�E�%� 9We have done some work on such a port, but it only reached an early stage, and certainly not a useful one. It's no longer being actively worked on. However, there's Revision-number: 6731 Prop-content-length: 345 Content-length: 345 K 7 svn:log V 244 Robert Evans spotted that bignum_decimal() failed to cope with being given a zero input. This shouldn't matter for PuTTY, as these routines are only used in PuTTYgen, to output SSH-1 format public key exponents/moduli, which should be nonzero. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-06-17T12:02:03.270179Z PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4599aa7fda426636abc1e03a6712f2a2 Text-delta-base-sha1: ab9b0d5544e4a7a7a4bd4285f6157553598f005a Text-content-length: 204 Text-content-md5: 9b84fe6ea6b0633ad915b50b404d18b2 Text-content-sha1: 06b8991aa5aece8856dabc8ca863bc30b6970306 Content-length: 204 SVN��{h0�@�0�x * i=0 (i.e., x=0) is an irritating special case. */ i = bignum_bitcount(x); if (!i) ndigits = 1; /* x = 0 */ else ndigits = (28 * i + 92) / 93; Revision-number: 6732 Prop-content-length: 178 Content-length: 178 K 7 svn:log V 78 When Unix PuTTYgen gives brief usage information, it should mention "--help"! K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-06-17T13:01:04.241751Z PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d2966f437f8a418f6ee2c1b73adb38b0 Text-delta-base-sha1: 3caf9ac39fa7dcb7a073999efd422009b874e67e Text-content-length: 156 Text-content-md5: 710755c02f97cbdbb827bbe18afe0b7b Text-content-sha1: d3ba8373faab9ac86761097c97a126574aaf738b Content-length: 156 SVN��cP$k�Y��V]P�;-�h�z�e~int standalone if (standalone) fprintf(stderr, "Use \"puttygen --help\" for more detail.FALSETRUETRUE Revision-number: 6733 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:21.910466Z PROPS-END Revision-number: 6734 Prop-content-length: 247 Content-length: 247 K 7 svn:log V 146 In the config dialog, clip RGB values to [0..255] rather than reducing them mod 256. Document that the RGB values can be edited, and their range. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-06-20T21:10:33.487559Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02d418aec6cfe36522fb623ef2235687 Text-delta-base-sha1: ff14e58b239c48f6f818cf3573085d9d3eda8d2e Text-content-length: 91 Text-content-md5: 66172dee3685657571ce70332d55aaa8 Text-content-sha1: 90a7c2607a80d3b893b4302187a40b2881b8f1db Content-length: 91 SVN��?@�F�@�9L; if (cval > 255) cval = 255; if (cval < 0) cval = 0 Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c2ab8c9b0a3b444a8b3530e4f700706 Text-delta-base-sha1: e7f5feabec643f2c29b4d917a779541b14d98bdd Text-content-length: 277 Text-content-md5: 72c7ee587fbd92b253b1aaaea9370fd8 Text-content-sha1: 9155345c8313c54fc244292d77cdf1243c70b251 Content-length: 277 SVN����t�(�t�d( (You may also edit the RGB values directly in the edit boxes, if you wish; each value is an integer from 0 to 255.)� �tt� � fake device and send it back to the client. Occasionally you might find you have a need to run a session \e{not} i Revision-number: 6735 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:22.064504Z PROPS-END Revision-number: 6736 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:22.079137Z PROPS-END Revision-number: 6737 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:22.091069Z PROPS-END Revision-number: 6738 Prop-content-length: 137 Content-length: 137 K 7 svn:log V 37 Mention Dietrich Raisin's PuttyTabs. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-06-22T21:47:42.851765Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: efa6823f6d5454dba57c0c0d6cd9a5b8 Text-delta-base-sha1: ab2b390c6a4b473a93edbebeacf8a35aa9f9c2b4 Text-content-length: 106 Text-content-md5: 5f8b54bbe8eeaa34dc6e0cfdbd9aaf6b Text-content-sha1: 66809f4b52de8aebfbf734d46279ac3878d6d1c6 Content-length: 106 SVN��yo T�1�T�jraisin.de/putty-tabs/putty-tabs.html"> PuttyTabs</a>, a floating tab bar for PuTTY Node-path: putty-wishlist/data/multiple-connections Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3210d6fc486e5de775be2825c3b57579 Text-delta-base-sha1: e9837a1ed13e504f638b1f7c2cfee5daf10675a3 Text-content-length: 380 Text-content-md5: 9ce8db14f9858cf2aac4ba5b63ea14e3 Text-content-sha1: 61fdd9ce2fb6459d55c65dd67804e7c1ac4f5e57 Content-length: 380 SVN��N7 d��d�;There are also a couple of third-party tools to do this sort of thing: <ul> <li><a href="http://www.raisin.de/putty-tabs/putty-tabs.html">PuttyTabs</a> provides a floating tab bar to switch between PuTTY windows. <li><a href="http://spoox.org/projects/twsc/">TWSC</a> provides a menu of open terminal windows (PuTTY and some other terminal programs). </ul> Revision-number: 6739 Prop-content-length: 267 Content-length: 267 K 8 svn:date V 27 2006-06-22T22:33:07.664965Z K 7 svn:log V 166 Mention the occasional requests we get to convert Unicode into ASCII on incoming pastes (usually when Unix commands are pasted from an auto-corrected Word document). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unicode-mappings Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0e69f2c5b73cb8a5d44ae04669e3e23 Text-delta-base-sha1: 46c2b25325e75950ceac5f8488754d60c0ed88e8 Text-content-length: 502 Text-content-md5: 20686bc05ad2bd917bc464bc1205ed2a Text-content-sha1: f35e2e2ed6952efcd5695a2526bb6bcec897e706 Content-length: 502 SVN��L*c�G�cul> <li> Although, in fact, a similar feature could be useful for clipboard operations. We occasionally get complaints about Unix commands pasting incorrectly into PuTTY from Microsoft Word documents; it turns out that Word has "auto-corrected" ordinary quotes to smart ones, hyphens to en dashes, and so on; and when these are pasted into a Unix shell, they tend to come out as dots. So some people would find compatibility mappings on incoming pastes useful, at least. </ul> </ul> Revision-number: 6740 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2006-06-23T09:42:09.584323Z K 7 svn:log V 62 I don't seem to be convincingly looking after Win95 any more. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/team.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 41a0697518788dc8c38f687c67c150ea Text-delta-base-sha1: 8b61410660f7ca0a1dad57df88fbf987146f3b0b Text-content-length: 20 Text-content-md5: 15328e5ece2a6729d4a296a246261af2 Text-content-sha1: d7727bf50d8634f5a7803a7bf80f7886159c47b1 Content-length: 20 SVN��tR ����D0 Revision-number: 6741 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:22.349678Z PROPS-END Revision-number: 6742 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:22.361008Z PROPS-END Revision-number: 6743 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:22.372918Z PROPS-END Revision-number: 6744 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:22.385946Z PROPS-END Revision-number: 6745 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:22.398309Z PROPS-END Revision-number: 6746 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 Mention PuTTY Session Manager K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-06-26T22:46:39.586593Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f8b54bbe8eeaa34dc6e0cfdbd9aaf6b Text-delta-base-sha1: 66809f4b52de8aebfbf734d46279ac3878d6d1c6 Text-content-length: 121 Text-content-md5: 4dfab9775a676e8a8ce24b56ff26a0ea Text-content-sha1: 5ad8fea15beb3b2d9277f70bfe2601cef9cdc4fc Content-length: 121 SVN��ogZ�-�Z�<�v1�.Aputtysm.sourceforge.net/"> PuTTY Session Manager</a>, for organising and launching saved Revision-number: 6747 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2006-06-29T12:58:28.049242Z K 7 svn:log V 63 Correct line-wrap issue breaking word in German error message. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 22d3723e94af0c4e4074a44b37f55283 Text-delta-base-sha1: da1ae201bb17b7cfb00f15ba0b344a5c69320e5e Text-content-length: 33 Text-content-md5: 7bc137e18cd42f64f2f293732c13681e Text-content-sha1: d706017dced577473205330c3170bf3d6fb8ca43 Content-length: 33 SVN�� � ��| installiere Revision-number: 6748 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2006-06-29T16:18:46.458184Z K 7 svn:log V 64 Note typo in original German error message (per Philip Newton). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7bc137e18cd42f64f2f293732c13681e Text-delta-base-sha1: d706017dced577473205330c3170bf3d6fb8ca43 Text-content-length: 189 Text-content-md5: 81eacc678cf87219d645c5e4e9714179 Text-content-sha1: 3952172cc588c94e762dee9a2549f0c2cd95ca50 Content-length: 189 SVN��; %�*�%�l((the word 'Anwenungskonfiguration' is apparently a misspelling which occurs in the original error message; it should apparently be 'Anwen<b>d</b>ungskonfiguration'.) Revision-number: 6749 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:22.587938Z PROPS-END Revision-number: 6750 Prop-content-length: 327 Content-length: 327 K 7 svn:log V 226 Random Unix puttygen improvements highlighted by a post to comp.security.ssh: - fix diagnostic if keyfile and '-t' both specified - add diagnostic for generating a key but discarding the private part - document '-q' option K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-07-07T14:18:47.580062Z PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 710755c02f97cbdbb827bbe18afe0b7b Text-delta-base-sha1: d3ba8373faab9ac86761097c97a126574aaf738b Text-content-length: 453 Text-content-md5: 4e46198484673cfa4fce01ea02876edb Text-content-sha1: 42f867e8c183a6748a94a23fd1ede56eb012b607 Content-length: 453 SVN��P0�e��_c�r5�l(m�u[ [ -qq quiet: do not display progress barfile) { fprintf(stderr, "puttygen: cannot both load and generate a key\n"); return 1; } /* * We must save the private part when generating a new key. */ if (keytype != NOKEYGEN && (outtype != PRIVATE && outtype != OPENSSH && outtype != SSHCOM)) { fprintf(stderr, "puttygen: this would generate a new key but " "discard the private part Node-path: putty/doc/man-pg.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 311dc63807ca0f6952cdbe83e619c31f Text-delta-base-sha1: 5d525ba3fff33deac84a2fe0aa1254f336b71f52 Text-content-length: 216 Text-content-md5: a9a1a7627c8942900369cd58eb0c75b2 Text-content-sha1: 2e6bbd9b38b70373072020ef3f42df88e4dff357 Content-length: 216 SVN��I0���I� �T1�'x [ -q ] \e bb iiiiiiiiiii bb\dt \cw{\-q} \dd Suppress the progress display when generating a new keyh},V}, \cw{\-\-version} \dd Display the version of PuTTYgen Revision-number: 6751 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:22.667230Z PROPS-END Revision-number: 6752 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2006-07-07T20:56:22.273093Z K 7 svn:log V 103 Spell out more explicitly what needs to be done with vanilla VC6, since it seems to be becoming a FAQ. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c08a98e382ab8318b3ff0c61ba656c02 Text-delta-base-sha1: a9de25694853a561a01ffe9038b97055e75c598b Text-content-length: 179 Text-content-md5: 2d40b30762825487f713474a6ebc87dc Text-content-sha1: f9431e92126ce46b796418e0eec7dfee73ea58fe Content-length: 179 SVN�� �7��=Han up-to-date Platform SDK. (It is possible to build with vanilla VC6, but you'll have to remove some functionality with directives such as NO_IPV6.) Revision-number: 6753 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.290621Z PROPS-END Revision-number: 6754 Prop-content-length: 107 Content-length: 107 K 8 svn:date V 27 2006-07-11T20:08:52.367021Z K 7 svn:log V 8 +fr, nl K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 886ec55dbb373fa8e42a9abfcfa36aeb Text-delta-base-sha1: 3d2d6c432aa66bf555d204cd2d0124b96182c398 Text-content-length: 148 Text-content-md5: e904f773e66af34de6642102d1055345 Text-content-sha1: c5fe63ec2b493ebe6f3691b0c763c98ec9b427fa Content-length: 148 SVN��b/j�*��A@�A@�*�[7�6,fredprod.com/">putty.fredprod.com</a> in Francecict.fr/">putty.cict.fr</a> in Franceosmirror.nl/">putty.os Revision-number: 6755 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.527822Z PROPS-END Revision-number: 6756 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.542197Z PROPS-END Revision-number: 6757 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.557714Z PROPS-END Revision-number: 6758 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.568781Z PROPS-END Revision-number: 6759 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.580799Z PROPS-END Revision-number: 6760 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.594503Z PROPS-END Revision-number: 6761 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.608985Z PROPS-END Revision-number: 6762 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.621342Z PROPS-END Revision-number: 6763 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2006-07-21T19:49:50.159836Z K 7 svn:log V 60 Add the SSH version string of the server we tested against. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 591d8dc84262ac71949c0996e036afc4 Text-delta-base-sha1: 660ffca3719a956f006a09d44ed4ffc5c95792fb Text-content-length: 129 Text-content-md5: 23eab3a3e5955c46a5663e6f5821eecb Text-content-sha1: 6d7d6fccf5e31358a7fa3deead8bb63970886a97 Content-length: 129 SVN��rL l��l�XAt least some versions of ssh.com on OpenVMS, e.g., <br><tt>SSH-2.0-3.2.0 SSH Secure Shell OpenVMS V5.5</tt> Revision-number: 6764 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.758022Z PROPS-END Revision-number: 6765 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.769357Z PROPS-END Revision-number: 6766 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.781762Z PROPS-END Revision-number: 6767 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.794329Z PROPS-END Revision-number: 6768 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.805722Z PROPS-END Revision-number: 6769 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.817643Z PROPS-END Revision-number: 6770 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.829480Z PROPS-END Revision-number: 6771 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:23.842006Z PROPS-END Revision-number: 6772 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2006-07-24T10:20:04.572350Z K 7 svn:log V 23 Name VanDyke's server. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 23eab3a3e5955c46a5663e6f5821eecb Text-delta-base-sha1: 6d7d6fccf5e31358a7fa3deead8bb63970886a97 Text-content-length: 29 Text-content-md5: 4a1604deeae1079b6c8fea5eecbb1683 Text-content-sha1: 0a3bbbfb6bf8dbee1396e883c9f6d5e8297e8957 Content-length: 29 SVN��LT �\��p\, VShell Revision-number: 6773 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2006-07-24T10:23:17.894400Z K 7 svn:log V 11 MyEntunnel K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4dfab9775a676e8a8ce24b56ff26a0ea Text-delta-base-sha1: 5ad8fea15beb3b2d9277f70bfe2601cef9cdc4fc Text-content-length: 121 Text-content-md5: 1fc41ba16d5e3de7a1cde7b816beee2f Text-content-sha1: 4dafa2aec375a3a1a3cfaef41b8af0729458e631 Content-length: 121 SVN��g_ c�|�c��gnemesis2.qx.net/software-myentunnel.php"> MyEntunnel</a>, for maintaining SSH tunnels using Plink Revision-number: 6774 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:24.075568Z PROPS-END Revision-number: 6775 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:24.086962Z PROPS-END Revision-number: 6776 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:24.132677Z PROPS-END Revision-number: 6777 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:24.145053Z PROPS-END Revision-number: 6778 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2006-08-05T13:48:53.542858Z K 7 svn:log V 28 Some extra int64 functions. K 10 svn:author V 4 owen PROPS-END Node-path: putty/int64.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d5dd4bdb81e182ef2b646a5b40c5e58b Text-delta-base-sha1: 53a6bcb57bf2e7ab5c7751ef825a3f3a734487c4 Text-content-length: 921 Text-content-md5: a5772f18596272135ace2b2259169d68 Text-content-sha1: 235c66d1bb149db373419c9cf401e3675894216d Content-length: 921 SVN��JP�J� uint64 uint64_subtract(uint64 x, uint64 y) { x.lo -= y.lo; x.hi -= y.hi + (x.lo > ~y.lo ? 1 : 0); return x; } double uint64_to_double(uint64 x) { return (4294967296.0 * x.hi) + (double)x.lo; } uint64 uint64_shift_right(uint64 x, int shift) { if (shift < 32) { x.lo >>= shift; x.lo |= (x.hi << (32-shift)); x.hi >>= shift; } else { x.lo = x.hi >> (shift-32); x.hi = 0; } return x; } uint64 uint64_shift_left(uint64 x, int shift) { if (shift < 32) { x.hi <<= shift; x.hi |= (x.lo >> (32-shift)); x.lo <<= shift; } else { x.hi = x.lo << (shift-32); x.lo = 0; } return x; } uint64 uint64_from_decimal(char *str) { uint64 ret; ret.hi = ret.lo = 0; while (*str >= '0' && *str <= '9') { ret = uint64_add(uint64_shift_left(ret, 3), uint64_shift_left(ret, 1)); ret = uint64_add32(ret, *str - '0'); str++; } return ret; } Node-path: putty/int64.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7adec33cf61a7f51d56abcd13e6fe67a Text-delta-base-sha1: b663181a482a85f7919d13376deab45b7994d2c9 Text-content-length: 240 Text-content-md5: ad636f146df7f9445e11afbb7aac9c5f Text-content-sha1: 5e31f28aedc4440ffae53ea9b153e7ebca40ad8e Content-length: 240 SVN��r]��]uint64 uint64_subtract(uint64 x, uint64 y); double uint64_to_double(uint64 x); uint64 uint64_shift_right(uint64 x, int shift); uint64 uint64_shift_left(uint64 x, int shift); uint64 uint64_from_decimal(char *str); #endif Revision-number: 6779 Prop-content-length: 304 Content-length: 304 K 8 svn:date V 27 2006-08-05T16:34:19.690112Z K 7 svn:log V 205 large-files is embarrassing these days, so I think it should be fixed for 0.59. win-font-linking was a regression in 0.58, and encourages people to use 0.57, which is bad, so it should be fixed for 0.59. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/large-files Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 71b39233d18c7ca8a11f50899e4bf78a Text-delta-base-sha1: 60c46ceb490ffa23e2efe45d1d322013b8050a60 Text-content-length: 23 Text-content-md5: 50b7839dd4d5664a87056b5495ae5bcf Text-content-sha1: 8fbfd7add18f692c4173212035a91541328b155b Content-length: 23 SVN��QO�Z��q`high Node-path: putty-wishlist/data/win-font-linking Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 76f30b005cb25d80e65bdee45790a276 Text-delta-base-sha1: 2ff202b974007096b33d6e37c5419ae7ec8d7abf Text-content-length: 23 Text-content-md5: 79d1ab7179bf8e87390d6fa097110481 Text-content-sha1: 428ab42e7cda7a334be4cc9c8b515c57d974a1a1 Content-length: 23 SVN��jh�U��[high Revision-number: 6780 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:24.455617Z PROPS-END Revision-number: 6781 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:24.467519Z PROPS-END Revision-number: 6782 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:24.480006Z PROPS-END Revision-number: 6783 Prop-content-length: 368 Content-length: 368 K 7 svn:log V 268 Large file support for psftp and pscp on both Windows and Unix. On Unix we set _FILE_OFFSET_BITS to 64 on the compiler command line (via mkfiles.pl), and on Windows we use SetFilePointer and GetFileSize to cope with 64-bit sizes where possible. Not tested on Win9x. K 10 svn:author V 4 owen K 8 svn:date V 27 2006-08-12T15:20:19.187546Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a8b9c72c8d4d3f96a9c58b9c7ea3fc91 Text-delta-base-sha1: 667a91fc2c07a0fc5f031b4009f39b170f1c6151 Text-content-length: 55 Text-content-md5: 335a9591333ba3503c43ee83a7d6e8f4 Text-content-sha1: 650460d95fa52f9f5bca15b12c5a6f0751da8eed Content-length: 55 SVN��- �p�� q " -D _FILE_OFFSET_BITS=64 Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a203b4d8e090497030ec8c00fe6f04a1 Text-delta-base-sha1: bddcdd92424286ce1ef8761d3bc1639ae7022571 Text-content-length: 2745 Text-content-md5: 6aa01a8d922e279983c178f29d4912d9 Text-content-sha1: 394cfa60755e3bc4b4dcbe35aa0f377664d56d14 Content-length: 2745 SVN��O]Bh�^��Z�Fz�] �!�4q�`X�1k� <%�e1M��>$�8n[�sL�bK�2R�ry�M�Xw�[p�tx�1�l|�ji^�P��3<�jz�8#include "int64fputc(c, streamint64 size, uint64 double donedbl; double sizedbl; elap = (unsigned long) difftime(now, start); if (now > start) ratebs = (float) (uint64_to_double(done) / elap); else ratebs = (float) uint64_to_double(done); if (ratebs < 1.0) eta = (unsigned long) (uint64_to_double(uint64_subtract(size, done))); else { eta = (unsigned long) ((uint64_to_double(uint64_subtract(size, done)) / ratebs)); } donedbl = uint64_to_double(done); sizedbl = uint64_to_double(size); pct = (int) (100 * (donedbl * 1.0 / sizedbl)); { char donekb[40]; /* divide by 1024 to provide kB */ uint64_decimal(uint64_shift_right(done, 10), donekb); len = printf("\r%-25.25s | %s kB | %5.1f kB/s | ETA: %8s | %3d%%", name, donekbuint64_compare(done, size) == 0int64char sizestr[40]; uint64_decimal(size, sizestr); sprintf(buf, "C%04o %s ", modes, sizestrint64uint64_make(0,0);act->size = attrs.size; } else act->size = uint64_make(ULONG_MAX,ULONG_MAX){ char sizestr[40]; if (sscanf(act->buf, "%o %s %n", &act->mode, sizestr, &i) != 2) bump("Protocol error: Illegal file descriptor format"); act->size = uint64_from_decimal(sizestr); act->name = act->buf + i; return 0; }int64int64 i; uint64 { char sizestr[40]; uint64_decimal(size, sizestr); tell_user(stderr, "Sending file %s, size=%s", last, sizestr); } if (scp_send_filename(last, size, 0644)) return; stat_bytes = uint64_make(0,0); stat_starttime = time(NULL); stat_lasttime = 0; for (i = uint64_make(0,0); uint64_compare(i,size) < 0; i = uint64_add32(i,4096)) { char transbuf[4096]; int j, k = 4096; if (uint64_compare(uint64_add32(i, k),size) > 0) /* i + k > size */ k = (uint64_subtract(size, i)).lo; /* k = size - i; */= uint64_add32(stat_bytes, k); if (time(NULL) != stat_lasttime || (uint64_compare(uint64_add32(i, k), size) == 0)int64 received; int wrerror = 0; uint64uint64_make(0, 0)uint64_make(0, 0); while (uint64_compare(received,act.size) < 0) { char transbuf[32768]; uint64 blksize; int read; blksize = uint64_make(0, 32768); if (uint64_compare(blksize,uint64_subtract(act.size,received)) > 0) blksize = uint64_subtract(act.size,received); read = scp_recv_filedata(transbuf, (int)blksize.lo= uint64_add32(stat_bytes,read); if (time(NULL) > stat_lasttime || uint64_compare(uint64_add32(received, read), act.size) == 0= uint64_add32(received, read) Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0da8a8aea0ed83e6163bc8992fae5add Text-delta-base-sha1: 349e6ba2a2c32bb2b7741acbc84d20cac7515d15 Text-content-length: 905 Text-content-md5: a40310e7d0b259e9dbb3d942a4611a04 Text-content-sha1: eee9dff295910d922d4020f9069888532e072a86 Content-length: 905 SVN��=XT'�Y��2am�kkB�N7.�gf�&q� �6@�wm�R]�1R�R}�MpWFile *fileile = open_existing_wfile(outfname, NULL); } else { file = open_new_file(outfname); } if (!filechar decbuf[30]; if (seek_file(file, uint64_make(0,0) , FROM_END) == -1) { printf("reget: cannot restart %s - file too large\n", outfname); sftp_register(req = fxp_close_send(fhfxp_close_recv(pktin, rreq); return 0; } offset = get_file_posn(file); uint64_decimal(offset, decbuf); printf("reget: restarting at file position %s\n", decbufwrite_to_file(file, buf + wpos, len - wposclose_wfile(fileRFile *fileile = open_existing_file(fname, NULL, NULL, NULL); if (!file if (seek_file((WFile *)file, offset, FROM_START) != 0) seek_file((WFile *)file, uint64_make(0,0), FROMread_from_file(file, buffer, sizeof(buffer)close_rfile(file); return ret Node-path: putty/psftp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b7ea805c45f9bb1931a65268984c967 Text-delta-base-sha1: 1ad470205428023a059112c173affd8c62244619 Text-content-length: 374 Text-content-md5: 468bc0f1fd530dffbe188d264dc36485 Text-content-sha1: 04c40bb3f35b2650b9e7deaaee03ea5326c58c63 Content-length: 374 SVN��#-M�c��4_�dq�i>=�|'nclude "int64.h" writing * it.int64 *size, unsigned long *mtime, unsigned long *atime); WFile *open_existing_wfile(char *name, uint64 *siz/* Seek offset bytes through file */ enum { FROM_START, FROM_CURRENT, FROM_END }; int seek_file(WFile *f, uint64 offset, int whence); /* Get file position */ uint64 get_file_posn(WFile *f); Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f72a60f163ecb19d8c68f041f6bf4273 Text-delta-base-sha1: a948e477703fcfcaebd08dc3f82bf1d881954c43 Text-content-length: 1542 Text-content-md5: 0c68594e45b42baee593a4a0840cefc8 Text-content-sha1: 17c4532f3e817b40638db8eeca5acf2fc4fed35d Content-length: 1542 SVN��rm5E���H}�]4�;�:LS�2z+�)qx�]#include "int64int64 { if (sizeof(statbuf.st_size) == 8) { size->hi = statbuf.st_size >> 32; size->lo = (long) statbuf.st_size; } else { *size = uint64_make(0, statbuf.st_size); } } WFile *open_existing_wfile(char *name, uint64 *size) { int fd; WFile *ret; fd = open(name, O_APPEND | O_WRONLY); if (fd < 0) return NULL; ret = snew(WFile); ret->fd = fd; if (sizof(statbuf.st_size) == 8) { size->hi = statbuf.st_size >> 32; size->lo = (long) statbuf.st_size; } else { *size = uint64_make(0, statbuf.st_size); } }/* Seek offset bytes through file, from whence, where whence is FROM_START, FROM_CURRENT, or FROM_END */ int seek_file(WFile *f, uint64 offset, int whence) { off_t fileofft; int lseek_whence; if (sizeof(off_t) == 8) { fileofft = ((off_t) offset.hi << 32) + offset.lo; } else { fileofft = offset.lo; } switch (whence) { case FROM_START: lseek_whence = SEEK_SET; break; case FROM_CURRENT: lseek_whence = SEEK_CUR; break; case FROM_END: lseek_whence = SEEK_END; break; default: return -1; } return lseek(f->fd, fileofft, lseek_whence) >= 0 ? 0 : -1; } uint64 get_file_posn(WFile *f) { off_t fileofft; uint64 ret; fileofft = lseek(f->fd, (off_t) 0, SEEK_CUR); if (sizeof(off_t) == 8) { ret.hi = fileofft >> 32; ret.lo = (long) fileofft; } else { ret = uint64_make(0, fileofft); } return ret Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b1796700ebc623ebd823433485edfbef Text-delta-base-sha1: 3c7c85598c81e28a6ef2b87a76607236640aec63 Text-content-length: 1010 Text-content-md5: 15af831368aed8673ebfa1cb80b2def8 Text-content-sha1: 6e7b81700926651a515d54f0af108c42ddf20f5e Content-length: 1010 SVN��0B*;���[�w�#.|�uvL�;1�fJ#include "int64.h"int64 size->lo=GetFileSize(h, &(size->hi)WFile *open_existing_wfile(char *name, uint64 *size) { HANDLE h; WFile *ret; h = CreateFile(name, GENERIC_WRITEWFile); ret->h = h; if (size) size->lo=GetFileSize(h, &(size->hi))/* Seek offset bytes through file, from whence, where whence is FROM_START, FROM_CURRENT, or FROM_END */ int seek_file(WFile *f, uint64 offset, int whence) { DWORD movemethod; switch (whence) { case FROM_START: movemethod = FILE_BEGIN; break; case FROM_CURRENT: movemethod = FILE_CURRENT; break; case FROM_END: movemethod = FILE_END; break; default: return -1; } SetFilePointer(f->h, offset.lo, &(offset.hi), movemethod); if (GetLastError() != NO_ERROR) return -1; else return 0; } uint64 get_file_posn(WFile *f) { uint64 ret; ret.hi = 0L; ret.lo = SetFilePointer(f->h, 0L, &(ret.hi), FILE_CURRENT); return ret Revision-number: 6784 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2006-08-12T15:26:39.674864Z K 7 svn:log V 26 Large file support added. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/large-files Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 50b7839dd4d5664a87056b5495ae5bcf Text-delta-base-sha1: 8fbfd7add18f692c4173212035a91541328b155b Text-content-length: 204 Text-content-md5: 5730f2c431a86c7d6090e15ce7d0c91b Text-content-sha1: a1821a5bf37bc1ab95039d20cc924fdbca985404 Content-length: 204 SVN��O 3���B Fixed-in: 2006-08-13 <p> 2006-08-13: I (OSD) have checked in a pile of stuff which should allow large file support where possible. On Windows, this basically means NT and above. Revision-number: 6785 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2006-08-14T13:37:24.627427Z K 7 svn:log V 49 We get warnings from GCC 4, and should fix this. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/gcc4-warnings Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 442 Text-content-md5: 8da39453fb3f622f9957a81ba100b43b Text-content-sha1: d349eac448818122a6515423e01a2bd1c228740b Content-length: 452 PROPS-END SVN���,,,Summary: Compiling the Unix version with GCC4 generates warnings Class: bug Priority: medium Present-in: 0.58 Content-type: text/x-html-body <p>PuTTY doesn't build cleanly using GCC 4 on Unix because we turn on <tt>-Wall</tt> and <tt>-Werror</tt>. Most of the problems are the usual ones to do with signenedness of pointer targets. Debian bug #<a href="http://bugs.debian.org/287960">287960</a> has some details and patches. Revision-number: 6786 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2006-08-14T13:51:56.783172Z K 7 svn:log V 76 It's been reported that setting window titles gets the character set wrong. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/title-charset Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 565 Text-content-md5: a64397593aca1404395d6ad054d9dac9 Text-content-sha1: eb9cb676452eb42b719a1ffca51c625c42561e0c Content-length: 575 PROPS-END SVN���'''Summary: Window title escape sequences not interpreted in line charset Class: bug Priority: medium Content-type: text/x-html-body <p>PuTTY does not display unicode characters correctly in the title bar. When charset is set to UTF-8 from PuTTY and locales on the remote computer are en_US.UTF-8, unicode characters are shown as they vere latin chars. <p>Also reported to Ubuntu as <a href="https://launchpad.net/distros/ubuntu/+source/putty/+bug/48781">bug 48781</a>, where it's suggested that <a href="port-unix-gtk2.html">using GTK2</a> will help. Revision-number: 6787 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:24.913844Z PROPS-END Revision-number: 6788 Prop-content-length: 904 Content-length: 904 K 8 svn:date V 27 2006-08-15T12:45:21.939404Z K 7 svn:log V 803 Aha! At long last I've managed to reproduce the intermittent problem I've been having with the cursor sometimes restoring to the wrong place when screen(1) terminates. The offending sequence of escape sequences goes ESC 7 (save cursor), ESC [?47h (switch to alternate screen), ESC 7 (save cursor _again_), do some stuff, ESC 8 (restore cursor), run screen session for a bit, ESC [?47l (return to main screen), ESC 8 (restore cursor). The final ESC 8 is expected to restore the cursor to where it was saved by the initial ESC 7. Translation: the ESC 7 saved cursor state is part of the state we must swap out when switching to the alternate screen. In other words, we need to track _four_ cursor positions: active and saved, on each of main and alternate screen. Previously we were tracking only three. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 878cd1b8b31625bcf437d5f45d20a1a7 Text-delta-base-sha1: 725437db0d6b09732ba58f8bfc868087a4eb3c8b Text-content-length: 2293 Text-content-md5: 12d283359d319debff2ccdf380ddf203 Text-content-sha1: 000e8e6addac93d620d834055603c9255b6656b4 Content-length: 2293 SVN����,`�w��(Y�0�OK�gm�Lmsavecurs.x = term->alt_ term->save_wnext = term->alt_term->alt_save_cset = 0; term->alt_utf = term->utf = term->save_utf = term->alt_save_utf = 0; term->utf_state = 0; term->alt_sco_acs = term->sco_acs = term->save_sco_acs = term->alt_save_sco_acs = 0; term->cset_attr[0] = term->cset_attr[1] = term->save_csattr = term->alt_pos tp tp = term->savecurs; if (!reset && !keep_cur_pos) term->savecurs = term->alt_savecurs; term->alt_savecurs = tp; t = term->save_cset; if (!reset && !keep_cur_pos) term->save_cset = term->alt_save_cset; term->alt_save_cset = t; t = term->save_csattr; if (!reset && !keep_cur_pos) term->save_csattr = term->alt_save_csattr; term->alt_save_csattr = t; t = term->save_utf; if (!reset && !keep_cur_pos) term->save_utf = term->alt_save_utf; term->alt_save_utf = t; t = term->save_wnext; if (!reset && !keep_cur_pos) term->save_wnext = term->alt_save_wnext; term->alt_save_wnext = t; t = term->save_sco_acs; if (!reset && !keep_cur_pos) term->save_sco_acs = term->alt_save_sco_acs; term->alt_save�3z B*�}�3� ATTR_FGSHIFT); break; case 39: /* default-foreground */ term->curr_attr &= ~ATTR_FGMASK; term->curr_attr |= ATTR_DEFFG; break; case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: /* background */ term->curr_attr &= ~ATTR_BGMASK; term->curr_attr |= (term->esc_args[i] - 40)<<ATTR_BGSHIFT; break; case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 107: /* aixterm-style bright background */ term->curr_attr &= ~ATTR_BGMASK; term->curr_attr |= ((term->esc_args[i] - 100 + 8) << ATTR_BGSHIFT); break; case 49: /* default-background */ term->curr_attr &= ~ATTR_BGMASK; term->curr_attr |= ATTR_DEFBG; break; case 3FGMASK; term->curr_ Revision-number: 6789 Prop-content-length: 720 Content-length: 720 K 8 svn:date V 27 2006-08-15T20:29:02.246837Z K 7 svn:log V 619 Shifts left and right by 32 were tripping a gcc warning (fatal with -Werror, of course) about shifting by more than the range of a data type. They only appeared in `if' statements testing sizeof(off_t), but gcc warns even when the code is unreachable. I've removed the conditional code (the general case should still work even on 32-bit machines), and hacked each shift by 32 into a pair of shifts by 16. Note that the gcc warning is not just a helpful indication that you may be using the wrong data type; it's actually pointing out ANSI- undefined behaviour in shifting a signed integer beyond the size of its type. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c68594e45b42baee593a4a0840cefc8 Text-delta-base-sha1: 17c4532f3e817b40638db8eeca5acf2fc4fed35d Text-content-length: 304 Text-content-md5: cb00763da9b1c37d75ba1bc3e21ca763 Text-content-sha1: e349499ab2a6e922ef241d3251cfac71301bd1ce Content-length: 304 SVN��m�J�N�;K�i�b�m� *size = uint64_make((statbuf.st_size >> 16) >> 16, statbuf.st_size);*size = uint64_make((statbuf.st_size >> 16) >> 16, statbuf.st_size);fileofft = (((off_t) offset.hi << 16) << 16) + offset.lo;ret = uint64_make((fileofft >> 16) >> 16, fileofft); Revision-number: 6790 Prop-content-length: 159 Content-length: 159 K 7 svn:log V 60 Window titles not interpreted according to current charset. K 10 svn:author V 4 owen K 8 svn:date V 27 2006-08-15T22:08:33.601915Z PROPS-END Node-path: putty-wishlist/data/window-title-charset Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 400 Text-content-md5: f4320a78752aa62a64f15c5568e81e0e Text-content-sha1: d7129a36b2fe40feb7e0f495cefe141db04095ca Content-length: 410 PROPS-END SVN���Summary: Window titles not interpreted according to current charset Class: semi-bug Priority: medium Difficulty: fun If an escape sequence (e.g. OSC 0) sets the window title bar, the text in the escape sequence is just sent to the window system for display. We should make sure it is interpreted according to whatever character set / codepage the terminal emulator is currently using. Revision-number: 6791 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 35 Er, ahem. Other half of r6788. :-/ K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-15T22:48:01.917001Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 12d283359d319debff2ccdf380ddf203 Text-delta-base-sha1: 000e8e6addac93d620d834055603c9255b6656b4 Text-content-length: 279 Text-content-md5: 92442c325176493cdbaab741b3a268a1 Text-content-sha1: c6b9033b89a3df9a6c57ec501079a223e25a2404 Content-length: 279 SVN�����4��b)u�ij term->alt_attr; if (!reset && !keep_cur_pos) term->save_attr = term->alt_save_attr; term->alt_save_�z' \�Q9O�z�style bright ((term->esc_args[i] - 90 + 8) << Node-path: putty/terminal.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30d88cc04b542b213f88ed14c98b910f Text-delta-base-sha1: a45e012bc9708a1a85341fa445585fc9dbf96853 Text-content-length: 220 Text-content-md5: 14630571ae7a0477a0fa15f7a1e0023e Text-content-sha1: f26e4e585f6a5c0c20834b3376d885d5ff357792 Content-length: 220 SVN��Q D�=�D�P6/* ESC 7 saved state for the alternate screen */ pos alt_savecurs; int alt_save_attr; int alt_save_cset, alt_save_csattr; int alt_save_utf, alt_save_wnext; int alt_save_sco_acs Revision-number: 6792 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:25.494387Z PROPS-END Revision-number: 6793 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:25.505891Z PROPS-END Revision-number: 6794 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:25.517039Z PROPS-END Revision-number: 6795 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:25.528486Z PROPS-END Revision-number: 6796 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:25.565523Z PROPS-END Revision-number: 6797 Prop-content-length: 814 Content-length: 814 K 7 svn:log V 713 New piece of Windows infrastructure: winhandl.c takes Plink's thread-based approach to stdin and stdout, wraps it in a halfway sensible API, and makes it a globally available service across all network tools. There is no direct functionality enhancement from this checkin: winplink.c now talks to the new API instead of doing it all internally, but does nothing different as a result. However, this should lay the groundwork for several diverse pieces of work in future: pipe-based ProxyCommand on Windows, a serial port back end, and (hopefully) a pipe-based means of communicating with Pageant, which should have sensible blocking behaviour and hence permit asynchronous agent requests and decrypt-on-demand. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-25T22:10:16.403442Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bef0e7c82fbcf10004a872432d2ba45b Text-delta-base-sha1: b61836126d6ba9c6eff6c8a250f35baa9212574e Text-content-length: 29 Text-content-md5: e47732585d10a4e04afc84482e362072 Text-content-sha1: 6f69ba90d5372318f719a52dfe186c4cd43dee55 Content-length: 29 SVN��gp ���cwinhandl Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3007b622f78a6d2df2c5d489749d05a0 Text-delta-base-sha1: 39bc4d224229efdc92a7a0f1d8bcee47160845dc Text-content-length: 966 Text-content-md5: 604fee8b980d54c2c2cfb96773f6fe28 Text-content-sha1: a1df7e6f437560961a66e38d972ef322b12e6ecc Content-length: 966 SVN����E��h�TK]�fSwhile (1) { HANDLE *handles; int nhandles, n; handles = handle_get_events(&nhandles); n = MsgWaitForMultipleObjects(nhandles, handles, FALSE, INFINITE, QS_ALLINPUT); if ((unsigned)(n - WAIT_OBJECT_0) < (unsigned)nhandles) { handle_got_event(handles[n - WAIT_OBJECT_0]); sfree(handles); continue; } sfree(handles); if (GetMessage(&msg, NULL, 0, 0) != 1) break; do { if (msg.message == WM_QUIT) goto finished; /* two-level break */ } while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)); /* The messages seem unreliable; especially if we're being tricky */ term_set_focus(term, GetForegroundWindow() == hwnd); net_pending_errors(); } finished:�q8GG�q� case VK_SUBTRACT: if (cfg.funky_type == FUNKY_XTERM) xkey = 'm'; break; case VK_RETURN: if (HIWORD(lParam) & KF_EXTENDED) xkey = 'M'; break; } if (xkey) Node-path: putty/windows/winhandl.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 13192 Text-content-md5: 780d9c569d8b8330c8e3824447b7ab98 Text-content-sha1: b318bcb4ec75f5428fb7886c509b132e516d1491 Content-length: 13202 PROPS-END SVN���zzz/* * winhandl.c: Module to give Windows front ends the general * ability to deal with consoles, pipes, serial ports, or any other * type of data stream accessed through a Windows API HANDLE rather * than a WinSock SOCKET. * * We do this by spawning a subthread to continuously try to read * from the handle. Every time a read successfully returns some * data, the subthread sets an event object which is picked up by * the main thread, and the main thread then sets an event in * return to instruct the subthread to resume reading. * * Output works precisely the other way round, in a second * subthread. The output subthread should not be attempting to * write all the time, because it hasn't always got data _to_ * write; so the output thread waits for an event object notifying * it to _attempt_ a write, and then it sets an event in return * when one completes. */ /* * TODO: * * - could do with some sort of private-data field in each handle * structure. */ #include <assert.h> #include "putty.h" /* ---------------------------------------------------------------------- * Generic definitions. */ /* * Maximum amount of backlog we will allow to build up on an input * handle before we stop reading from it. */ #define MAX_BACKLOG 32768 struct handle_generic { /* * Initial fields common to both handle_input and handle_output * structures. * * The three HANDLEs are set up at initialisation time and are * thereafter read-only to both main thread and subthread. * `moribund' is only used by the main thread; `done' is * written by the main thread before signalling to the * subthread. `defunct' and `busy' are used only by the main * thread. */ HANDLE h; /* the handle itself */ HANDLE ev_to_main; /* event used to signal main thread */ HANDLE ev_from_main; /* event used to signal back to us */ int moribund; /* are we going to kill this soon? */ int done; /* request subthread to terminate */ int defunct; /* has the subthread already gone? */ int busy; /* operation currently in progress? */ }; /* ---------------------------------------------------------------------- * Input threads. */ /* * Data required by an input thread. */ struct handle_input { /* * Copy of the handle_generic structure. */ HANDLE h; /* the handle itself */ HANDLE ev_to_main; /* event used to signal main thread */ HANDLE ev_from_main; /* event used to signal back to us */ int moribund; /* are we going to kill this soon? */ int done; /* request subthread to terminate */ int defunct; /* has the subthread already gone? */ int busy; /* operation currently in progress? */ /* * Data set by the input thread before signalling ev_to_main, * and read by the main thread after receiving that signal. */ char buffer[4096]; /* the data read from the handle */ DWORD len; /* how much data that was */ int readret; /* lets us know about read errors */ /* * Callback function called by this module when data arrives on * an input handle. */ handle_inputfn_t gotdata; }; /* * The actual thread procedure for an input thread. */ static DWORD WINAPI handle_input_threadfunc(void *param) { struct handle_input *ctx = (struct handle_input *) param; while (1) { ctx->readret = ReadFile(ctx->h, ctx->buffer, sizeof(ctx->buffer), &ctx->len, NULL); if (!ctx->readret) ctx->len = 0; SetEvent(ctx->ev_to_main); if (!ctx->len) break; WaitForSingleObject(ctx->ev_from_main, INFINITE); if (ctx->done) break; /* main thread told us to shut down */ } return 0; } /* * This is called after a succcessful read, or from the * `unthrottle' function. It decides whether or not to begin a new * read operation. */ static void handle_throttle(struct handle_input *ctx, int backlog) { assert(!ctx->defunct); /* * If there's a read operation already in progress, do nothing: * when that completes, we'll come back here and be in a * position to make a better decision. */ if (ctx->busy) return; /* * Otherwise, we must decide whether to start a new read based * on the size of the backlog. */ if (backlog < MAX_BACKLOG) { SetEvent(ctx->ev_from_main); ctx->busy = TRUE; } } /* ---------------------------------------------------------------------- * Output threads. */ /* * Data required by an output thread. */ struct handle_output { /* * Copy of the handle_generic structure. */ HANDLE h; /* the handle itself */ HANDLE ev_to_main; /* event used to signal main thread */ HANDLE ev_from_main; /* event used to signal back to us */ int moribund; /* are we going to kill this soon? */ int done; /* request subthread to terminate */ int defunct; /* has the subthread already gone? */ int busy; /* operation currently in progress? */ /* * Data set by the main thread before signalling ev_from_main, * and read by the input thread after receiving that signal. */ char *buffer; /* the data to write */ DWORD len; /* how much data there is */ /* * Data set by the input thread before signalling ev_to_main, * and read by the main thread after receiving that signal. */ DWORD lenwritten; /* how much data we actually wrote */ int writeret; /* return value from WriteFile */ /* * Data only ever read or written by the main thread. */ bufchain queued_data; /* data still waiting to be written */ /* * Callback function called when the backlog in the bufchain * drops. */ handle_outputfn_t sentdata; }; static DWORD WINAPI handle_output_threadfunc(void *param) { struct handle_output *ctx = (struct handle_output *) param; while (1) { WaitForSingleObject(ctx->ev_from_main, INFINITE); if (ctx->done) { SetEvent(ctx->ev_to_main); break; } ctx->writeret = WriteFile(ctx->h, ctx->buffer, ctx->len, &ctx->lenwritten, NULL); SetEvent(ctx->ev_to_main); if (!ctx->writeret) break; } return 0; } static void handle_try_output(struct handle_output *ctx) { void *senddata; int sendlen; if (!ctx->busy && bufchain_size(&ctx->queued_data)) { bufchain_prefix(&ctx->queued_data, &senddata, &sendlen); ctx->buffer = senddata; ctx->len = sendlen; SetEvent(ctx->ev_from_main); ctx->busy = TRUE; } } /* ---------------------------------------------------------------------- * Unified code handling both input and output threads. */ struct handle { int output; union { struct handle_generic g; struct handle_input i; struct handle_output o; } u; }; static tree234 *handles_by_evtomain; static int handle_cmp_evtomain(void *av, void *bv) { struct handle *a = (struct handle *)av; struct handle *b = (struct handle *)bv; if ((unsigned)a->u.g.ev_to_main < (unsigned)b->u.g.ev_to_main) return -1; else if ((unsigned)a->u.g.ev_to_main > (unsigned)b->u.g.ev_to_main) return +1; else return 0; } static int handle_find_evtomain(void *av, void *bv) { HANDLE *a = (HANDLE *)av; struct handle *b = (struct handle *)bv; if ((unsigned)*a < (unsigned)b->u.g.ev_to_main) return -1; else if ((unsigned)*a > (unsigned)b->u.g.ev_to_main) return +1; else return 0; } struct handle *handle_input_new(HANDLE handle, handle_inputfn_t gotdata) { struct handle *h = snew(struct handle); h->output = FALSE; h->u.i.h = handle; h->u.i.ev_to_main = CreateEvent(NULL, FALSE, FALSE, NULL); h->u.i.ev_from_main = CreateEvent(NULL, FALSE, FALSE, NULL); h->u.i.gotdata = gotdata; h->u.i.busy = FALSE; h->u.i.defunct = FALSE; h->u.i.moribund = FALSE; h->u.i.done = FALSE; if (!handles_by_evtomain) handles_by_evtomain = newtree234(handle_cmp_evtomain); add234(handles_by_evtomain, h); CreateThread(NULL, 0, handle_input_threadfunc, &h->u.i, 0, NULL); handle_throttle(&h->u.i, 0); /* start first read operation */ return h; } struct handle *handle_output_new(HANDLE handle, handle_outputfn_t sentdata) { struct handle *h = snew(struct handle); h->output = TRUE; h->u.o.h = handle; h->u.o.ev_to_main = CreateEvent(NULL, FALSE, FALSE, NULL); h->u.o.ev_from_main = CreateEvent(NULL, FALSE, FALSE, NULL); h->u.o.busy = FALSE; h->u.o.defunct = FALSE; h->u.o.moribund = FALSE; h->u.o.done = FALSE; bufchain_init(&h->u.o.queued_data); h->u.o.sentdata = sentdata; if (!handles_by_evtomain) handles_by_evtomain = newtree234(handle_cmp_evtomain); add234(handles_by_evtomain, h); CreateThread(NULL, 0, handle_output_threadfunc, &h->u.i, 0, NULL); return h; } int handle_write(struct handle *h, const void *data, int len) { assert(h->output); bufchain_add(&h->u.o.queued_data, data, len); handle_try_output(&h->u.o); return bufchain_size(&h->u.o.queued_data); } HANDLE *handle_get_events(int *nevents) { HANDLE *ret; struct handle *h; int i, n, size; /* * Go through our tree counting the handle objects currently * engaged in useful activity. */ ret = NULL; n = size = 0; if (handles_by_evtomain) { for (i = 0; (h = index234(handles_by_evtomain, i)) != NULL; i++) { if (h->u.g.busy) { if (n >= size) { size += 32; ret = sresize(ret, size, HANDLE); } ret[n++] = h->u.g.ev_to_main; } } } *nevents = n; return ret; } static void handle_destroy(struct handle *h) { if (h->output) bufchain_clear(&h->u.o.queued_data); CloseHandle(h->u.g.ev_from_main); CloseHandle(h->u.g.ev_to_main); del234(handles_by_evtomain, h); sfree(h); } void handle_free(struct handle *h) { /* * If the handle is currently busy, we cannot immediately free * it. Instead we must wait until it's finished its current * operation, because otherwise the subthread will write to * invalid memory after we free its context from under it. */ assert(h && !h->u.g.moribund); if (h->u.g.busy) { /* * Just set the moribund flag, which will be noticed next * time an operation completes. */ h->u.g.moribund = TRUE; } else if (h->u.g.defunct) { /* * There isn't even a subthread; we can go straight to * handle_destroy. */ handle_destroy(h); } else { /* * The subthread is alive but not busy, so we now signal it * to die. Set the moribund flag to indicate that it will * want destroying after that. */ h->u.g.moribund = TRUE; h->u.g.done = TRUE; SetEvent(h->u.g.ev_from_main); } } void handle_got_event(HANDLE event) { struct handle *h; assert(handles_by_evtomain); h = find234(handles_by_evtomain, &event, handle_find_evtomain); if (!h) { /* * This isn't an error condition. If two or more event * objects were signalled during the same select operation, * and processing of the first caused the second handle to * be closed, then it will sometimes happen that we receive * an event notification here for a handle which is already * deceased. In that situation we simply do nothing. */ return; } if (h->u.g.moribund) { /* * A moribund handle is already treated as dead from the * external user's point of view, so do nothing with the * actual event. Just signal the thread to die if * necessary, or destroy the handle if not. */ if (h->u.g.done) { handle_destroy(h); } else { h->u.g.done = TRUE; SetEvent(h->u.g.ev_from_main); } return; } if (!h->output) { int backlog; h->u.i.busy = FALSE; /* * A signal on an input handle means data has arrived. */ if (h->u.i.len == 0) { /* * EOF, or (nearly equivalently) read error. */ h->u.i.gotdata(h, NULL, (h->u.i.readret ? 0 : -1)); h->u.i.defunct = TRUE; } else { backlog = h->u.i.gotdata(h, h->u.i.buffer, h->u.i.len); handle_throttle(&h->u.i, backlog); } } else { h->u.o.busy = FALSE; /* * A signal on an output handle means we have completed a * write. Call the callback to indicate that the output * buffer size has decreased, or to indicate an error. */ if (!h->u.o.writeret) { /* * Write error. Send a negative value to the callback, * and mark the thread as defunct (because the output * thread is terminating by now). */ h->u.o.sentdata(h, -1); h->u.o.defunct = TRUE; } else { bufchain_consume(&h->u.o.queued_data, h->u.o.lenwritten); h->u.o.sentdata(h, bufchain_size(&h->u.o.queued_data)); handle_try_output(&h->u.o); } } } void handle_unthrottle(struct handle *h, int backlog) { assert(!h->output); handle_throttle(&h->u.i, backlog); } int handle_backlog(struct handle *h) { assert(h->output); return bufchain_size(&h->u.o.queued_data); } Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fd15da3937b082c0930735ee74bfd012 Text-delta-base-sha1: 74cd7f9b7bf3e640e6a3542c8844709fdfe10aba Text-content-length: 2630 Text-content-md5: dc0eaf5313cbaf1eebbeed693efeb077 Text-content-sha1: d0bfcbaadc9450d1012b3e8aa3d185015e4e8684 Content-length: 2630 SVN���rLl�A��Pab�rH�;Y�z� &�1B�-Nl�Bi�mH]�R.struct handle *stdin_handle, *stdout_handle, *stderr_handle; DWORD orig_console_mode; int connopenint from_backend(void *frontend_handle, int is_stderr, const char *data, int len) { if (is_stderr) { handle_write(stderr_handle, data, len); } else { handle_write(stdout_handle, data, len); } return handle_backlog(stdout_handle) + handle_backlog(stderr_handle)stdin_gotdata(struct handle *h, void *data, int len) { if (len < 0) { /* * Special case: report read error. */ fprintf(stderr, "Unable to read from standard input\n"); cleanup_exit(0); } noise_ultralight(len); if (connopen && back->socket(backhandle) != NULL) { if (len > 0) { return back->send(backhandle, data, len); } else { back->special(backhandle, TS_EOF); return 0; } } else return 0; } void stdouterr_sent(struct handle *h, int new_backlog) { if (new_backlog < 0) { /* * Special case: report write error. */ fprintf(stderr, "Unable to write to standard %s\n", (h == stdout_handle ? "output" : "error")); cleanup_exit(0); } if (connopen && back->socket(backhandle) != NULL) { back->unthrottle(backhandle, (handle_backlog(stdout_handle) + handle_backlog(stderr_handle))); } } int main(int argc, char **argv) { int sending; int portnumber = -1; SOCKET *sklist; int skcount, sksize/* * Pass the output handles to the handle-handling subsystem. * (The input one we leave until we're through the * authentication process.) */ stdout_handle = handle_output_new(outhandle, stdouterr_sent); stderr_handle = handle_output_new(errhandle, stdouterr_sent); main_thread_id = GetCurrentThreadId(); sending = FALSE; now = GETTICKCOUNT(); while (1) { int nhandles; HANDLE *handles; int n; DWORD ticks; if (!sending && back->sendok(backhandle)) { stdin_handle = handle_input_new(inhandle, stdin_gotdata); senhandles = handle_get_events(&nhandles); handles = sresize(handles, nhandles+1, HANDLE); handles[nhandles] = netevent; n = MsgWaitForMultipleObjects(nhandles+1, handles, FALSE, ticks, QS_POSTMESSAGE); if ((unsigned)(n - WAIT_OBJECT_0) < (unsigned)nhandles) { handle_got_event(handles[n - WAIT_OBJECT_0]); } else if (n == WAIT_OBJECT_0 + nhandlesnhandles + 1sfree(handles); if (sending) handle_unthrottle(stdin_handle, back->sendbuffer(backhandle)); if ((!connopen || back->socket(backhandle) == NULL) && handle_backlog(stdout_handle) + handle_backlog(stderr_handle Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15af831368aed8673ebfa1cb80b2def8 Text-delta-base-sha1: 6e7b81700926651a515d54f0af108c42ddf20f5e Text-content-length: 549 Text-content-md5: 2ec0135695b9dcb8fb30e40412c73e55 Text-content-sha1: 5d7142e3c9ddac63a3cb4701fa179325358896e3 Content-length: 549 SVN��B'r�2�B� _D�L U�r7�#�#, nhandles, nallhandles; long next, ticks; HANDLE *handles = handle_get_events(&nhandles); handles = sresize(handles, nhandles+2, HANDLE); nallhandles = nhandles; handles[nallhandles++] = netevent; if (other_event) handles[nallhandles++nallhandles, handles, FALSE, ticks, QS_POSTMESSAGE); if ((unsigned)(n - WAIT_OBJECT_0) < (unsigned)nhandles) { handle_got_event(handles[n - WAIT_OBJECT_0]); } else if (n == WAIT_OBJECT_0 + nhandlessfree(handles);nhandles Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bd28950b833ab796601024960a508e63 Text-delta-base-sha1: 3440e34a918ece4e879b85291aff8089fec41a7f Text-content-length: 628 Text-content-md5: 9fb8b65292622d721299dc421b622932 Text-content-sha1: ddb87384cc43c8dd20e48f6f473bd54266dafc2e Content-length: 628 SVN��dJ \�&�\�HExports from winhandl.c. */ struct handle; typedef int (*handle_inputfn_t)(struct handle *h, void *data, int len); typedef void (*handle_outputfn_t)(struct handle *h, int new_backlog); struct handle *handle_input_new(HANDLE handle, handle_inputfn_t gotdata); struct handle *handle_output_new(HANDLE handle, handle_outputfn_t sentdata); int handle_write(struct handle *h, const void *data, int len); HANDLE *handle_get_events(int *nevents); void handle_free(struct handle *h); void handle_got_event(HANDLE event); void handle_unthrottle(struct handle *h, int backlog); int handle_backlog(struct handle *h Revision-number: 6798 Prop-content-length: 240 Content-length: 240 K 7 svn:log V 139 Small tweak to the new handle API: provide a `privdata' field in each handle structure, set on initialisation and readable by an API call. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-26T07:41:15.144555Z PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 780d9c569d8b8330c8e3824447b7ab98 Text-delta-base-sha1: b318bcb4ec75f5428fb7886c509b132e516d1491 Text-content-length: 437 Text-content-md5: 7d0c58a9863e1ea76cce0ffe069d4bcd Text-content-sha1: a9f41308c43e41f25ba8f3ca5bdb019bcc6d6da4 Content-length: 437 SVN��z=l�y��#aB��B�2� 1B�o7�l"�l �Qt�;?M void *privdata; /* for client to remember who they are void *privdata; /* for client to remember who they are void *privdata; /* for client to remember who they are, void *priv h->u.i.privdata = privdata, void *privh->u.o.privdata = privdata void *handle_get_privdata(struct handle *h) { return h->u.g.privdata; } Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc0eaf5313cbaf1eebbeed693efeb077 Text-delta-base-sha1: d0bfcbaadc9450d1012b3e8aa3d185015e4e8684 Text-content-length: 114 Text-content-md5: 5735dc83aadb88ffc3053b2648897984 Text-content-sha1: 3aaf39e64c82dffecf318fb02a92f64fa38ed53f Content-length: 114 SVN��rT��N�Q�d, NULL); stderr_handle = handle_output_new(errhandle, stdouterr_sent, NULL, NULL Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9fb8b65292622d721299dc421b622932 Text-delta-base-sha1: ddb87384cc43c8dd20e48f6f473bd54266dafc2e Text-content-length: 168 Text-content-md5: b9ca848278fc22d3581dce125f9ce965 Text-content-sha1: a4e725580e9bdf715d62ffc26f9089633f1cf9f4 Content-length: 168 SVN��J  �'�r�p�Yq, void *privdata); struct handle *handle_output_new(HANDLE handle, handle_outputfn_t sentdata, void *privvoid *handle_get_privdata Revision-number: 6799 Prop-content-length: 286 Content-length: 286 K 7 svn:log V 185 Bug fix: since the input thread does not wait for the event object until _after_ its first read, we should not start by signalling that object in order to trigger the first read. Ahem. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-26T08:15:53.848843Z PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7d0c58a9863e1ea76cce0ffe069d4bcd Text-delta-base-sha1: a9f41308c43e41f25ba8f3ca5bdb019bcc6d6da4 Text-content-length: 49 Text-content-md5: f3631089b6d57e1ea5e0c9738aa74771 Text-content-sha1: 6fa0baa28e7c0f1f6a0a383c9b8f5a5ac6624923 Content-length: 49 SVN��P�,��,E�a9 h->u.i.busy = TRUE; Revision-number: 6800 Prop-content-length: 327 Content-length: 327 K 8 svn:date V 27 2006-08-26T08:37:42.281421Z K 7 svn:log V 226 Always initialise the `addresses' field of a SockAddr to NULL, because it gets unconditionally sfree()d in sk_addr_free(). This just bit me when running under the MSVC debugger; not sure how it hasn't bitten anyone until now! K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a7dadeb1aca30fa350f0d704afaa3a82 Text-delta-base-sha1: bdab9b43ca8ecec6b053f2577c03a9b2a603a05c Text-content-length: 66 Text-content-md5: e1b66f311648987a1f327b6f49b90d3d Text-content-sha1: 454bc80a538248552ce7308ddb6fd4e157e94968 Content-length: 66 SVN��r($���Uz�-E->addresses = NULL;addresses = NULL; Revision-number: 6801 Prop-content-length: 433 Content-length: 433 K 8 svn:date V 27 2006-08-26T09:21:52.833819Z K 7 svn:log V 332 Return a non-zero exit code in the event of a fatal-error SSH session termination. `Close window only on clean exit' was not working properly on Unix in the absence of this: notify_remote_exit() was being called and ssh_return_exitcode was returning zero, causing gtk_main_quit() to be called, _before_ connection_fatal() happened. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b75133a667c418a592eefa5ecd142b5 Text-delta-base-sha1: cb22c2e2a8f25b5ba6bba0bb9059314eff14f925 Text-content-length: 126 Text-content-md5: 225b958617da98df244db73af8d0e952 Text-content-sha1: 34fb29ff7f4c3de56d946f0342e734c894c13cd6 Content-length: 126 SVN���� �g�� c#include <limits����l�a passphrase. Termin�k ���Pauthentication requiINT_MAX Revision-number: 6802 Prop-content-length: 385 Content-length: 385 K 7 svn:log V 284 Start using notify_remote_exit() in the Windows front end, in place of the previous ad-hockery which depended on the return value from select_result() and hence which will not adapt sensibly to a world in which the primary session is something local rather than a network connection. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-26T10:04:46.494189Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 604fee8b980d54c2c2cfb96773f6fe28 Text-delta-base-sha1: a1df7e6f437560961a66e38d972ef322b12e6ecc Text-content-length: 1287 Text-content-md5: 8fca76f7f20df0064b8fae50b38324d9 Text-content-sha1: 32b18d09aa4c529bcbc2d66fc47f433d6cfba141 Content-length: 1287 SVN����E�J��G<�>�8�L;�E�_h�4 e� $c�zhlimitsmust_close_session,if (must_close_session) close_session( if (must_close_session) close_session();must_close_session = TRUEselect_result(wParam, lParam); reentering = 0; { int exitcode; if (!session_closed && (exitcode = back->exitcode(backhandle)) >= 0(cfg.close_on_exit == AUTO && exitcode != INT_MAX)) { PostQuitMessage(0); } else { must_close_session = TRUE; session_closed = TRUE; /* exitcode == INT_MAX indicates that the connection was closed * by a fatal error, so an error box will be coming our way and * we should not generate this informational one. */ if (exitcode != INT_MAX) MessageBox(hwnd, "Connection closed by remote host", appname, MB_OK | MB_ICONINFORMATION); } } �8V�8�key = 'n'; break; case VK_ADD: if (cfg.funky_type == FUNKY_XTERM) { if (shift_state) xkey = 'l'; else xkey = 'k'; } else if (shift_state) xkey = 'm'; else xkey = 'l'; break; case VK_DIVIDE: if (cfg.funky_type == FUNKY_XTERM) xkey = 'o'; break; case VK_MULTIPLY: if (cfg.funky_type == FUNKY_XTERM) xkey = 'j'; break; Revision-number: 6803 Prop-content-length: 261 Content-length: 261 K 8 svn:date V 27 2006-08-26T10:17:39.143216Z K 7 svn:log V 160 On cleanup, PSCP and PSFTP should explicitly check that the back end is still running rather than relying on ssh_sftp_loop_iteration() to return a bogus value. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6aa01a8d922e279983c178f29d4912d9 Text-delta-base-sha1: 394cfa60755e3bc4b4dcbe35aa0f377664d56d14 Text-content-length: 59 Text-content-md5: fb5afc990cacb80c5b2311868ed6646b Text-content-sha1: dffa508aabd5d79aed8cf8a008fdbdb2d89e3c27 Content-length: 59 SVN��]� #���Aback->exitcode(backhandle) >= 0 || Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a40310e7d0b259e9dbb3d942a4611a04 Text-delta-base-sha1: eee9dff295910d922d4020f9069888532e072a86 Text-content-length: 60 Text-content-md5: de3f9d61fb785af511fbf8f7c0c2f80b Text-content-sha1: ad256564c58af82fa44c199ec552b3f0464ab858 Content-length: 60 SVN��X{ #���Tback->exitcode(backhandle) >= 0 || Revision-number: 6804 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2006-08-26T10:18:31.650967Z K 7 svn:log V 89 Cleanups to reduce dependency on Windows SFTP tools always having a real network socket. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ec0135695b9dcb8fb30e40412c73e55 Text-delta-base-sha1: 5d7142e3c9ddac63a3cb4701fa179325358896e3 Text-content-length: 513 Text-content-md5: 1bd9653a8778c183ae1806ef0e5a7a97 Text-content-sha1: 5e8baa0b5035eae88339f3561909e2a07591316b Content-length: 513 SVN��[.G�I��zI�_�}z9�]m�ef�@v�>S, netindex, otherindexif (netevent) handles[netindex = nallhandles++] = netevent; else netindex = -1; if (other_event) handles[otherindex = nallhandles++] = other_event; else otherindex = -1;etindex >= 0 && n == WAIT_OBJECT_0 + netindexindex >= 0 && n == WAIT_OBJECT_0 + otherindexp_WSAEventSelect == NULL) { fd_set readfds; int ret; long now = GETTICKCOUNT(); if (sftp_ssh_socket == INVALID_SOCKET) return -1; /* doom */ Revision-number: 6805 Prop-content-length: 371 Content-length: 371 K 8 svn:date V 27 2006-08-26T10:19:23.640357Z K 7 svn:log V 270 Another bug fix: always set the busy flag when telling a subthread to do something, otherwise handle_get_events will forget to tell the front end to check for that subthread finishing. This applies even when we're only setting `busy' to tell the subthread to terminate! K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f3631089b6d57e1ea5e0c9738aa74771 Text-delta-base-sha1: 6fa0baa28e7c0f1f6a0a383c9b8f5a5ac6624923 Text-content-length: 49 Text-content-md5: e5ce5ece44f4525a904b9da248a649ab Text-content-sha1: b17a08f471631ffe88c346bb1c1427a00ff94545 Content-length: 49 SVN��P~���(�".h->u.g.busyh->u.g.busy Revision-number: 6806 Prop-content-length: 282 Content-length: 282 K 8 svn:date V 27 2006-08-26T10:20:16.543753Z K 7 svn:log V 181 ProxyCommand support for Windows, using the new winhandl.c API. Seems a bit clunky when I actually try to use it - not sure why - but I think all the actual functionality is there. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e47732585d10a4e04afc84482e362072 Text-delta-base-sha1: 6f69ba90d5372318f719a52dfe186c4cd43dee55 Text-content-length: 40 Text-content-md5: 1dcc0826b91a3e6efabed77c9c831583 Text-content-sha1: 2ac377071e966cfe794a815ff2885863bcbb7124 Content-length: 40 SVN��p} �&��D,winproxy + Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bb29b65716a642b896b25c220ea043d6 Text-delta-base-sha1: dc2da3e233a3b41f9a2e68b927ebfb6c3ab0bc42 Text-content-length: 629 Text-content-md5: 292bd324d6591140271f811f747e5e93 Text-content-sha1: ede87540bbc0d72d39a4771a29006df402c8e480 Content-length: 629 SVN�� 'B��l�&�U>�x�q�^' � /* * Windows supports a local-command proxy. This also means we * must adjust the text on the `Telnet command' control. */ if (!midsession) { int i; s = ctrl_getset(b, "Connection/Proxy", "basics", NULL)proxy_typ++1] = dupstr("Local1] = I(PROXY_CMD); break; } } EDITBOX && c->generic.context.i == offsetof(Config, proxy_telnet_command)) { assert(c->generic.handler == dlg_stdeditbox_handler); sfree(c->generic.label); c->generic.label = dupstr("Telnet command, or local" " proxy command"); break; } } } Node-path: putty/windows/winproxy.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 5486 Text-content-md5: ab1f157302f1fa81e45898f313fa37dd Text-content-sha1: 4f94b9e9f3cad984e20feb1388279be96c59cb97 Content-length: 5496 PROPS-END SVN���```/* * winproxy.c: Windows implementation of platform_new_connection(), * supporting an OpenSSH-like proxy command via the winhandl.c * mechanism. */ #include <stdio.h> #include <assert.h> #define DEFINE_PLUG_METHOD_MACROS #include "tree234.h" #include "putty.h" #include "network.h" #include "proxy.h" typedef struct Socket_localproxy_tag *Local_Proxy_Socket; struct Socket_localproxy_tag { const struct socket_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ HANDLE to_cmd_H, from_cmd_H; struct handle *to_cmd_h, *from_cmd_h; char *error; Plug plug; void *privptr; }; int localproxy_gotdata(struct handle *h, void *data, int len) { Local_Proxy_Socket ps = (Local_Proxy_Socket) handle_get_privdata(h); if (len < 0) { return plug_closing(ps->plug, "Read error from local proxy command", 0, 0); } else if (len == 0) { return plug_closing(ps->plug, NULL, 0, 0); } else { return plug_receive(ps->plug, 1, data, len); } } void localproxy_sentdata(struct handle *h, int new_backlog) { Local_Proxy_Socket ps = (Local_Proxy_Socket) handle_get_privdata(h); plug_sent(ps->plug, new_backlog); } static Plug sk_localproxy_plug (Socket s, Plug p) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; Plug ret = ps->plug; if (p) ps->plug = p; return ret; } static void sk_localproxy_close (Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; handle_free(ps->to_cmd_h); handle_free(ps->from_cmd_h); CloseHandle(ps->to_cmd_H); CloseHandle(ps->from_cmd_H); sfree(ps); } static int sk_localproxy_write (Socket s, const char *data, int len) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; return handle_write(ps->to_cmd_h, data, len); } static int sk_localproxy_write_oob(Socket s, const char *data, int len) { /* * oob data is treated as inband; nasty, but nothing really * better we can do */ return sk_localproxy_write(s, data, len); } static void sk_localproxy_flush(Socket s) { /* Local_Proxy_Socket ps = (Local_Proxy_Socket) s; */ /* do nothing */ } static void sk_localproxy_set_private_ptr(Socket s, void *ptr) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; ps->privptr = ptr; } static void *sk_localproxy_get_private_ptr(Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; return ps->privptr; } static void sk_localproxy_set_frozen(Socket s, int is_frozen) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; /* * FIXME */ } static const char *sk_localproxy_socket_error(Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; return ps->error; } Socket platform_new_connection(SockAddr addr, char *hostname, int port, int privport, int oobinline, int nodelay, int keepalive, Plug plug, const Config *cfg) { char *cmd; static const struct socket_function_table socket_fn_table = { sk_localproxy_plug, sk_localproxy_close, sk_localproxy_write, sk_localproxy_write_oob, sk_localproxy_flush, sk_localproxy_set_private_ptr, sk_localproxy_get_private_ptr, sk_localproxy_set_frozen, sk_localproxy_socket_error }; Local_Proxy_Socket ret; HANDLE us_to_cmd, us_from_cmd, cmd_to_us, cmd_from_us; SECURITY_ATTRIBUTES sa; STARTUPINFO si; PROCESS_INFORMATION pi; if (cfg->proxy_type != PROXY_CMD) return NULL; cmd = format_telnet_command(addr, port, cfg); { char *msg = dupprintf("Starting local proxy command: %s", cmd); /* We're allowed to pass NULL here, because we're part of the Windows * front end so we know logevent doesn't expect any data. */ logevent(NULL, msg); sfree(msg); } ret = snew(struct Socket_localproxy_tag); ret->fn = &socket_fn_table; ret->plug = plug; ret->error = NULL; /* * Create the pipes to the proxy command, and spawn the proxy * command process. */ sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; /* default */ sa.bInheritHandle = TRUE; if (!CreatePipe(&us_from_cmd, &cmd_to_us, &sa, 0)) { ret->error = dupprintf("Unable to create pipes for proxy command"); return (Socket)ret; } if (!CreatePipe(&cmd_from_us, &us_to_cmd, &sa, 0)) { CloseHandle(us_from_cmd); CloseHandle(cmd_to_us); ret->error = dupprintf("Unable to create pipes for proxy command"); return (Socket)ret; } si.cb = sizeof(si); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = NULL; si.dwFlags = STARTF_USESTDHANDLES; si.cbReserved2 = 0; si.lpReserved2 = NULL; si.hStdInput = cmd_from_us; si.hStdOutput = cmd_to_us; si.hStdError = NULL; CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); CloseHandle(cmd_from_us); CloseHandle(cmd_to_us); ret->to_cmd_H = us_to_cmd; ret->from_cmd_H = us_from_cmd; ret->from_cmd_h = handle_input_new(ret->from_cmd_H, localproxy_gotdata, ret); ret->to_cmd_h = handle_output_new(ret->to_cmd_H, localproxy_sentdata, ret); /* We are responsible for this and don't need it any more */ sk_addr_free(addr); return (Socket) ret; } Revision-number: 6807 Prop-content-length: 233 Content-length: 233 K 8 svn:date V 27 2006-08-26T10:58:13.167553Z K 7 svn:log V 132 We _can_ have handle_throttle() called on defunct handles after all, so it should just do nothing rather than failing an assertion. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e5ce5ece44f4525a904b9da248a649ab Text-delta-base-sha1: b17a08f471631ffe88c346bb1c1427a00ff94545 Text-content-length: 46 Text-content-md5: dc2a69428d0b11330ca6df34fce997a3 Text-content-sha1: 458e5fe70013da96dab017faff00e100c5a35f32 Content-length: 46 SVN��~ � ��`if (ctx->defunct) return Revision-number: 6808 Prop-content-length: 335 Content-length: 335 K 8 svn:date V 27 2006-08-26T10:59:09.697574Z K 7 svn:log V 234 It's critically important that the local proxy process should not inherit _our_ ends of its I/O pipes! Otherwise, closing our copy of those handles does not cause it to see EOF on its stdin, because it's holding the pipe open itself. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ab1f157302f1fa81e45898f313fa37dd Text-delta-base-sha1: 4f94b9e9f3cad984e20feb1388279be96c59cb97 Text-content-length: 142 Text-content-md5: 9af5e9568d30c8a3b9870f710db553b7 Text-content-sha1: 75cbc7df24ef140b58a751b5eba472527db12258 Content-length: 142 SVN��`` x��x�ISetHandleInformation(us_to_cmd, HANDLE_FLAG_INHERIT, 0); SetHandleInformation(us_from_cmd, HANDLE_FLAG_INHERIT, 0); Revision-number: 6809 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2006-08-26T11:33:57.128131Z K 7 svn:log V 6 Done! K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/proxy-command Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a9079a16bbc3d2eec1b5d987b4dccdf7 Text-delta-base-sha1: 99c802e7130f351ce6665d7c891e19f31e23ee67 Text-content-length: 184 Text-content-md5: b5009dd465d75174cbea6bf69a74e3b5 Text-content-sha1: d8d1434fdd72a247f9b96fa96546c0e7d7eaa281 Content-length: 184 SVN��a" !�S��.RFixed-in: 2006-08-27 r6808b>SGT, 2006-08-26</b>: I've just implemented this for Windows (Unix has supported it since 2003) and it seems to be basically working. Revision-number: 6810 Prop-content-length: 462 Content-length: 462 K 8 svn:date V 27 2006-08-27T08:03:19.159337Z K 7 svn:log V 361 The `socket' function in the backends is only ever checked to see if it's NULL. Since we already have one back end (uxpty) which doesn't in fact talk to a network socket, and may well have more soon, I'm replacing this TCP/IP-centric function with a nice neutral `connected' function returning a boolean. Nothing else about its semantics has currently changed. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb5afc990cacb80c5b2311868ed6646b Text-delta-base-sha1: dffa508aabd5d79aed8cf8a008fdbdb2d89e3c27 Text-content-length: 73 Text-content-md5: 9592977ce6697ff95cf3b41398f6c78b Text-content-sha1: 5aa95f8cf11c02d877b0b3edc6684361f517bd5b Content-length: 73 SVN���v*�~���6Jconnected(backhandle)connected(backhandle) Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: de3f9d61fb785af511fbf8f7c0c2f80b Text-delta-base-sha1: ad256564c58af82fa44c199ec552b3f0464ab858 Text-content-length: 80 Text-content-md5: 52f20e93505f3f02f7f37153bd1d3b29 Text-content-sha1: 8e7df0ca34591f769f3735adbad0feec590da7d8 Content-length: 80 SVN��{q*�=��g �H>�[ connected(backhandle)connected(backhandle) Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4c73e9f260dc9612610fba3a0aeb26c3 Text-delta-base-sha1: 7be9febaa1108173e387253276cad27ab6490163 Text-content-length: 39 Text-content-md5: 51a51655fdfb966cde5224518f6ef987 Text-content-sha1: c9664da88254d37d4c21657b19614f0a5bcb5b0a Content-length: 39 SVN��pq �4��.Bint (*connected Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 95284f835a04b2abc2143dfb50dd77e5 Text-delta-base-sha1: 352f9fd77bdc7eb3dd1b108895f9656498286bac Text-content-length: 124 Text-content-md5: 42a7152157dd2bdaeb7b6296e8d6c09c Text-content-sha1: 06b344af6ae82699c9da2de8a0d7021cb985bfd4 Content-length: 124 SVN��)4`�?�W��int raw_connected(void *handle) { Raw raw = (Raw) handle; return raw->s != NULLconnected Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4fee78bcb79bf1c08eede98b8d270ad0 Text-delta-base-sha1: fa6351456e670179b6f585b52d33ecf349163531 Text-content-length: 139 Text-content-md5: 89240c6e4a44e115dedf8103f70d0b31 Text-content-sha1: 882b8e6f0e978a949a665b4665a73bf79f1f4aba Content-length: 139 SVN��&o��f�yv�&uint rlogin_connected(void *handle) { Rlogin rlogin = (Rlogin) handle; return rlogin->s != NULLconnected Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 225b958617da98df244db73af8d0e952 Text-delta-base-sha1: 34fb29ff7f4c3de56d946f0342e734c894c13cd6 Text-content-length: 161 Text-content-md5: e0459485741fb94187d410eab9cb1ef3 Text-content-sha1: 46fba4821b8479bebf42e58e434e41588fb16e46 Content-length: 161 SVN����������������`��W�{k�lint ssh_connected(void *handle) { Ssh ssh = (Ssh) handle; return ssh->s != NULLconnected Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9f652f133f6738644166e1acbf24e277 Text-delta-base-sha1: 7f0ece109f6e246acb81016dee351156c8f7ce1d Text-content-length: 144 Text-content-md5: 3597e51a3c49fa7ffa28cf7535a6b0ed Text-content-sha1: 98fd0ea59c04d2ad1a7c5671f56d6f59d16ca19d Content-length: 144 SVN��JUo�F�f�y$�'#int telnet_connected(void *handle) { Telnet telnet = (Telnet) handle; return telnet->s != NULLconnected Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 75076ab1f831bfbb07fc510c19f1f36d Text-delta-base-sha1: 0c58b1d44eeec67b66e90487ab4f0f19420edf64 Text-content-length: 109 Text-content-md5: 6c9d6784b8fa697e80f9b7b38cccb7cd Text-content-sha1: 478966b9b259ba3ef1094fd390c54ce695f95500 Content-length: 109 SVN��i[F�o��# �TF�/:connected(backhandle)connected(backhandle)!back->connected(backhandle) Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e8b6065c3199a572920b6d3c3c1f8623 Text-delta-base-sha1: d3e2d64cc4e4b9a0c4111049522c32ae6ef0de93 Text-content-length: 125 Text-content-md5: b2d36f2224c4e20b99fa13289c56fd9d Text-content-sha1: 03a93dabcacc9a14c52fc356045ac2d1b9e2bf2d Content-length: 125 SVN��~Z\�y�S�ts�mint pty_connected(void *handle) { /* Pty pty = (Pty)handle; */ return TRUE;connected Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5735dc83aadb88ffc3053b2648897984 Text-delta-base-sha1: 3aaf39e64c82dffecf318fb02a92f64fa38ed53f Text-content-length: 106 Text-content-md5: 56391a1631ac3a4d7704b36ae74440ea Text-content-sha1: df5ca026aff89feff1ac7028a66626e854223251 Content-length: 106 SVN��vF�9��8S�'%�lconnected(backhandle)connected(backhandle)!back->connected(backhandle) Revision-number: 6811 Prop-content-length: 253 Content-length: 253 K 8 svn:date V 27 2006-08-27T08:34:04.473192Z K 7 svn:log V 152 Call console_provide_logctx _before_ initialising the back end, so that logevent() will go to stderr in -v mode even during the back end init function. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56391a1631ac3a4d7704b36ae74440ea Text-delta-base-sha1: df5ca026aff89feff1ac7028a66626e854223251 Text-content-length: 129 Text-content-md5: e7fb70073f4c08d89791221ddd37377e Text-content-sha1: 3be86db3de163a23c04a2b53598e96e9b4ca4413 Content-length: 129 SVN��v}c�]�B�W�+Klogctx = log_init(NULL, &cfg); console_provide_logctx(logctx);back->provide_logctx(backhandle, Revision-number: 6812 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2006-08-27T09:53:34.948552Z K 7 svn:log V 26 Remove spurious #include. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winutils.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 83208949db8f65d34b2e19cc82f9349a Text-delta-base-sha1: 31161d813f08810e56cbd1e81a12be4ac700708b Text-content-length: 23 Text-content-md5: df251440cda59accf7f9dc7465e18c46 Text-content-sha1: 2620f2b1b116edc4cc0a89cd073acf23dc10225e Content-length: 23 SVN��} �� ��t Revision-number: 6813 Prop-content-length: 1115 Content-length: 1115 K 8 svn:date V 27 2006-08-27T10:00:36.801300Z K 7 svn:log V 1013 Grow some nasty warts on the side of winhandl.c, in preparation for a serial port backend: - In order to do simultaneous reading and writing on the same HANDLE, you must enable overlapped access and pass an OVERLAPPED structure to each ReadFile and WriteFile call. This would make sense if it were an optional thing I could do if I wanted to do the reading and writing in the same thread, but making it mandatory even if I'm doing them in _different_ threads is just annoying and arbitrary. - Serial ports occasionally return length 0 from ReadFile, for no particularly good reason. Fortunately serial ports also don't have a real EOF condition to speak of, so ignoring EOFs is actually a viable response in spite of sounding utterly gross. Hence, handle_{input,output}_new() now accept a flags parameter, which includes a flag to enable the OVERLAPPED bureaucracy and a flag to cause EOFs to be ignored on input handles. The current clients of winhandl.c do not use either of these. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc2a69428d0b11330ca6df34fce997a3 Text-delta-base-sha1: 458e5fe70013da96dab017faff00e100c5a35f32 Text-content-length: 1214 Text-content-md5: c3ac29c07e31bae618e14ead2dbac861 Text-content-sha1: 514cf4644b9e776fdc0954d993bc1b151f24d907 Content-length: 1214 SVN��BDn�W�� >�iX�(l�E&�$�o(�P�1e��O3at initialisation and then read-only. */ int flags; OVERLAPPED ovl, *povl; if (ctx->flags & HANDLE_FLAG_OVERLAPPED) povl = &ovl; else povl = NULL; while (1) { if (povl) memset(povl, 0, sizeof(OVERLAPPED)); ctx->readret = ReadFile(ctx->h, ctx->buffer, sizeof(ctx->buffer), &ctx->len, povl); if (povl && !ctx->readret && GetLastError() == ERROR_IO_PENDING) ctx->readret = GetOverlappedResult(ctx->h, povl, &ctx->len, TRUE); if (!ctx->readret) ctx->len = 0; if (ctx->readret && ctx->len == 0 && (ctx->flags & HANDLE_FLAG_IGNOREEOF)) continueat initialisation and then read-only. */ int flags; OVERLAPPED ovl, *povl; if (ctx->flags & HANDLE_FLAG_OVERLAPPED) povl = &ovl; else povl = NULLif (povl) memset(povl, 0, sizeof(OVERLAPPED)); ctx->writeret = WriteFile(ctx->h, ctx->buffer, ctx->len, &ctx->lenwritten, povl); if (povl && !ctx->writeret && GetLastError() == ERROR_IO_PENDING) ctx->writeret = GetOverlappedResult(ctx->h, povl, &ctx->lenwritten, TRUE); , int flags h->u.i.flags = flags, int flags h->u.o.flags = flags Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7fb70073f4c08d89791221ddd37377e Text-delta-base-sha1: 3be86db3de163a23c04a2b53598e96e9b4ca4413 Text-content-length: 120 Text-content-md5: b40e45f85687b0416a4441e8557830ee Text-content-sha1: 7eb38602893a9afcd7c3a9efb57c0da3a9a22c27 Content-length: 120 SVN��}Z��N�Z� s, 0); stderr_handle = handle_output_new(errhandle, stdouterr_sent, NULL, 0, 0 Node-path: putty/windows/winproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9af5e9568d30c8a3b9870f710db553b7 Text-delta-base-sha1: 75cbc7df24ef140b58a751b5eba472527db12258 Text-content-length: 136 Text-content-md5: ade26cb0b2e616239286465a18e5983c Text-content-sha1: e5150132e7b2e2e7057967e536673d53c54789d5 Content-length: 136 SVN��`w r��r��` ret, 0); ret->to_cmd_h = handle_output_new(ret->to_cmd_H, localproxy_sentdata, ret, 0 Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9ca848278fc22d3581dce125f9ce965 Text-delta-base-sha1: a4e725580e9bdf715d62ffc26f9089633f1cf9f4 Text-content-length: 119 Text-content-md5: 2a25d1b6598e457f5a9e2f356a969aad Text-content-sha1: 997b85c6443b9775ef699d5f222caaa6e9067e14 Content-length: 119 SVN�� wV�C�@�yB�b;�#define HANDLE_FLAG_OVERLAPPED 1 #define HANDLE_FLAG_IGNOREEOF 2, int flags, int flags Revision-number: 6814 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2006-08-27T11:55:30.393790Z K 7 svn:log V 93 Now that Local proxy type exists on both Unix and Windows, document it and associated stuff. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 72c7ee587fbd92b253b1aaaea9370fd8 Text-delta-base-sha1: 9155345c8313c54fc244292d77cdf1243c70b251 Text-content-length: 1693 Text-content-md5: aedf16b6116e3bc1022b57270b56b4a9 Text-content-sha1: a140acce4808a4c016f6f83c7234dd5bd683fc1d Content-length: 1693 SVN����47�B��Eo�hC�_+�$ O�x$h�#Mandb Selecting \I{Local proxy}\q{Local} allows you to specify an arbitrary command on the local machine to act as a proxy. When the session is started, instead of creating a TCP connection, PuTTY runs the command (specified in \k{config-proxy-command}), and uses its standard input and output streams. \lcont{ This could be used, for instance, to talk to some kind of network proxy that PuTTY does not natively support; or you could tunnel a connection over something other than TCP/IP entirely. }/Localor Localf you are using the \i{Local proxy} type, the local command to run is specifiedhe strings \c{%proxyhost} and \c{%proxyport} will be replaced by the host details specified on the \e{Proxy} panel, if any (this is most likely to be useful for the Local proxy type). To get a literal \c{%} sign, enter \c{%%}. If a�����uTTY, see \k{puttygen-conversions}. If a key file is specified here, and \i{Pageant} is running (see \k{pageant}), PuTTY will first try asking Pageant to authenticate with that key, and ignore any other keys Pageant may have. If that fails, PuTTY will ask for a passphrase as normal. \H{config-ssh-tty} The TTY panel The TTY panel lets you configure the remote pseudo-terminal. \S{config-ssh-pty} \I{pseudo-terminal allocation}\q{Don't allocate a pseudo-terminal} \cfg{winhelp-topic}{ssh.nopty} When connecting to a \i{Unix} system, most \I{interactive connections}interactive shell sessions are run in a \e{pseudo-terminal}, which allows the Unix system to pretend it's talking to a real physical terminal device but allows the SSH server to catch all the data coming from that Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e43ac4397ca72a78c8a99e5e6422c9e5 Text-delta-base-sha1: dd14b571f3b243882d49661ae51615abc9e4a1f1 Text-content-length: 113 Text-content-md5: 824f8a294766c6cd90037d0478a3a30f Text-content-sha1: 401508154162efdcb2de99a4732ad7b32a8c9281 Content-length: 113 SVN��Y6 W�p�W�ojLocal proxy} local proxy \IM{Local proxy} proxy command \IM{Local proxy} command, proxy Revision-number: 6815 Prop-content-length: 1275 Content-length: 1275 K 8 svn:date V 27 2006-08-28T10:35:12.752528Z K 7 svn:log V 1173 Support for Windows PuTTY connecting straight to a local serial port in place of making a network connection. This has involved a couple of minor infrastructure changes: - New dlg_label_change() function in the dialog.h interface, which alters the label on a control. Only used, at present, to switch the Host Name and Port boxes into Serial Line and Speed, which means that any platform not implementing serial connections (i.e. currently all but Windows) does not need to actually do anything in this function. Yet. - New small piece of infrastructure: cfg_launchable() determines whether a Config structure describes a session ready to be launched. This was previously determined by seeing if it had a non-empty host name, but it has to check the serial line as well so there's a centralised function for it. I haven't gone through all front ends and arranged for this function to be used everywhere it needs to be; so far I've only checked Windows. - Similarly, cfg_dest() returns the destination of a connection (host name or serial line) in a text format suitable for putting into messages such as `Unable to connect to %s'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1dcc0826b91a3e6efabed77c9c831583 Text-delta-base-sha1: 2ac377071e966cfe794a815ff2885863bcbb7124 Text-content-length: 243 Text-content-md5: b614be979c26ae10cf971df8e3c5c290 Text-content-sha1: 3bd4f65d6f882f9eb9f42aa7dc9fec1132c7978e Content-length: 243 SVN��}I�:��S7��@�Q;�q ser# More backend sets, with the additional Windows serial-port module. W_BE_ALL = be_all_s winser cproxy W_BE_NOSSH = be_nos_s winserW_BE_ALL WINMISC putty.res LIBS puttytel : [G] GUITERM NONSSH W_W_ Node-path: putty/be_all_s.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 971 Text-content-md5: 2262758f55d1ff6cc7402b55052dedf3 Text-content-sha1: b9e205a59a034d08a9f941d4304f116f6e6b4299 Content-length: 981 PROPS-END SVN���===/* * Linking module for PuTTY proper: list the available backends * including ssh, plus the serial backend. */ #include <stdio.h> #include "putty.h" /* * This appname is not strictly in the right place, since Plink * also uses this module. However, Plink doesn't currently use any * of the dialog-box sorts of things that make use of appname, so * it shouldn't do any harm here. I'm trying to avoid having to * have tiny little source modules containing nothing but * declarations of appname, for as long as I can... */ const char *const appname = "PuTTY"; #ifdef TELNET_DEFAULT const int be_default_protocol = PROT_TELNET; #else const int be_default_protocol = PROT_SSH; #endif struct backend_list backends[] = { {PROT_SSH, "ssh", &ssh_backend}, {PROT_TELNET, "telnet", &telnet_backend}, {PROT_RLOGIN, "rlogin", &rlogin_backend}, {PROT_RAW, "raw", &raw_backend}, {PROT_SERIAL, "serial", &serial_backend}, {0, NULL} }; Node-path: putty/be_nos_s.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 647 Text-content-md5: 35dc291fbaaf8768d1851fb61376adc9 Text-content-sha1: c7e1bd9a65221b8d5e0979422bb4ddcb241790ee Content-length: 657 PROPS-END SVN���yyy/* * Linking module for PuTTYtel: list the available backends not * including ssh. */ #include <stdio.h> #include "putty.h" const int be_default_protocol = PROT_TELNET; const char *const appname = "PuTTYtel"; struct backend_list backends[] = { {PROT_TELNET, "telnet", &telnet_backend}, {PROT_RLOGIN, "rlogin", &rlogin_backend}, {PROT_RAW, "raw", &raw_backend}, {PROT_SERIAL, "serial", &serial_backend}, {0, NULL} }; /* * Stub implementations of functions not used in non-ssh versions. */ void random_save_seed(void) { } void random_destroy_seed(void) { } void noise_ultralight(unsigned long data) { } Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 66172dee3685657571ce70332d55aaa8 Text-delta-base-sha1: 90a7c2607a80d3b893b4302187a40b2881b8f1db Text-content-length: 3658 Text-content-md5: a486ce5052477c8d6a97396a454b5d42 Text-content-sha1: a4203f3216ebbb27e430c944b7df06400992eb9b Content-length: 3658 SVN��?YKq�z�I�@� �FB�h!�=�Y[�Y>X�*<t�~<�vI#define HOST_BOX_TITLE "Host Name (or IP address)" #define PORT_BOX_TITLE "Port" static void config_host_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; /* * This function works just like the standard edit box handler, * only it has to choose the control's label and text from two * different places depending on the protocol. */ if (event == EVENT_REFRESH) { if (cfg->protocol == PROT_SERIAL) { /* * This label text is carefully chosen to contain an n, * since that's the shortcut for the host name control. */ dlg_label_change(ctrl, dlg, "Serial line"); dlg_editbox_set(ctrl, dlg, cfg->serline); } else { dlg_label_change(ctrl, dlg, HOST_BOX_TITLE); dlg_editbox_set(ctrl, dlg, cfg->host); } } else if (event == EVENT_VALCHANGE) { if (cfg->protocol == PROT_SERIAL) dlg_editbox_get(ctrl, dlg, cfg->serline, lenof(cfg->serline)); else dlg_editbox_get(ctrl, dlg, cfg->host, lenof(cfg->host)); } } static void config_port_handler(union control *ctrl, void *dlg, void *data, int event) { Config *cfg = (Config *)data; char buf[80]; /* * This function works just like the standard edit box handler, * only it has to choose the control's label and text from two * different places depending on the protocol. */ if (event == EVENT_REFRESH) { if (cfg->protocol == PROT_SERIAL) { /* * This label text is carefully chosen to contain a p, * since that's the shortcut for the port control. */ dlg_label_change(ctrl, dlg, "Speed"); sprintf(buf, "%d", cfg->serspeed); } else { dlg_label_change(ctrl, dlg, PORT_BOX_TITLE); sprintf(buf, "%d", cfg->port); } dlg_editbox_set(ctrl, dlg, buf); } else if (event == EVENT_VALCHANGE) { dlg_editbox_get(ctrl, dlg, buf, lenof(buf)); if (cfg->protocol == PROT_SERIAL) cfg->serspeed = atoi(buf); else cfg->port = atoi(buf); } } struct hostport { union control *host, *port; }; /* * We export this function so that platform-specific config * routines can use it to conveniently identify the protocol radio * buttons in order to add to them. */ void config_struct hostport *hp = (struct hostport *)ctrl->radio.context.p; , and refresh both host and port boxes when. We * expect the context parameter to point at a hostport * structure giving the `union control's for both } } dlg_refresh(hp->host, dlg); dlg_refresh(hp->port, dlg);_launchable(cfg) !cfg_launchable(cfg)cfg_launchable(cfg)truct hostport *hp = (struct hostport *) ctrl_alloc(b, sizeof(struct hostport)); int i, gotssh; s = ctrl_getset(b, "Session", "hostport", "Specify the destination you want to connect to"); ctrl_columns(s, 2, 75, 25); c = ctrl_editbox(s, HOST_BOX_TITLE, 'n', 100, HELPCTX(session_hostname), config_host_handler, I(0), I(0)); c->generic.column = 0; hp->host = c; c = ctrl_editbox(s, PORT_BOX_TITLE, 'p', 100, HELPCTX(session_hostname), config_port_handler, I(0), I(0)); c->generic.column = 1; hp->port = c; ctrl_columns(s, 1, 100); gotssh = FALSE; for (i = 0; backends[i].name; i++) if (backends[i].protocol == PROT_SSH) { gotssh = TRUE; break; } if (!gotssh) { ctrl_radiobuttons(s, "Connection type:", NO_SHORTCUT, 3, HELPCTX(session_hostname), config_protocolbuttons_handler, P(hpConnection type:", NO_SHORTCUT, 4, HELPCTX(session_hostname), config_protocolbuttons_handler, P(hp Node-path: putty/dialog.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6031a216436653a1c8e5290f66bf72a1 Text-delta-base-sha1: 2ebd62c82bf9fbb78f9a7a5804b3923e452b83ee Text-content-length: 136 Text-content-md5: 2f7dc1af2fc178abc6b67acdb7c2b237 Text-content-sha1: 176d67115b802da6a5d2512495092cb8e8cd0c41 Content-length: 136 SVN��.% n�k�n�LbChange the label text on a control. */ void dlg_label_change(union control *ctrl, void *dlg, char const *text Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aedf16b6116e3bc1022b57270b56b4a9 Text-delta-base-sha1: a140acce4808a4c016f6f83c7234dd5bd683fc1d Text-content-length: 4296 Text-content-md5: 9f364024ab1939bbf2587d88f3819b06 Text-content-sha1: 488f0bcc8a95f4573c977c396efbf0e19359c47e Content-length: 4296 SVN����O�0��#8@�^]Connection type, an \i{SSH} connection, or a connection to a local \i{serial line}. (See \k{which-one} for a summary of the differences between SSH, Telnet and rlogin; see \k{using-rawprot} for an explanation of \q{raw} connections; see \k{using-serial} for information about using a serial line.) \b The \q{Port} box lets you specify which \i{port number} on the server to connect to. If you select Telnet, Rlogin, or SSH, this box will be filled in automatically to the usual value, and you will only need to change it if you have an unusual server. If you select Raw mode, you will almost certainly need to fill in the \q{Port} box yourself. If you select \q{Serial} from the \q{Connection type} radio buttons, the \q{Host Name} and \q{Port} boxes are replaced by \q{Serial line} and \q{Speed}; see \k{config-serial} for more details of these�X;E�D�v�Y7th.privkey} This box is where you enter the name of your private key file if you are using \i{public key authentication}. See \k{pubkey} for information about public key authentication in SSH. This key must be in PuTTY's native format (\c{*.\i{PPK}}). If you have a private key in another format that you want to use with Pserial} The Serial panel The \i{Serial} panel allows you to configure options that only apply when PuTTY is connecting to a local \I{serial port}\i{serial line}. \S{config-serial-line} Selecting a serial line to connect to \cfg{winhelp-topic}{serial.line} The \q{Serial line to connect to} box allows you to choose which serial line you want PuTTY to talk to, if your computer has more than one serial port. On Windows, the first serial line is called \cw{COM1}, and if there is a second it is called \cw{COM2}, and so on. This configuration setting is also visible on the Session panel, where it replaces the \q{Host Name} box (see \k{config-hostname}) if the connection type is set to \q{Serial}. \S{config-serial-speed} Selecting the speed of your serial line \cfg{winhelp-topic}{serial.speed} The \q{Speed} box allows you to choose the speed (or \q{baud rate}) at which to talk to the serial line. Typical values might be 9600, 19200, 38400 or 57600. Which one you need will depend on the device at the other end of the serial cable; consult the manual for that device if you are in doubt. This configuration setting is also visible on the Session panel, where it replaces the \q{Port} box (see \k{config-hostname}) if the connection type is set to \q{Serial}. \S{config-serial-databits} Selecting the number of data bits \cfg{winhelp-topic}{serial.databits} The \q{Data bits} box allows you to choose how many data bits are transmitted in each byte sent or received through the serial line. Typical values are 7 or 8. \S{config-serial-stopbits} Selecting the number of stop bits \cfg{winhelp-topic}{serial.stopbits} The \q{Stop bits} box allows you to choose how many stop bits are used in the serial line protocol. Typical values are 1, 1.5 or 2. \S{config-serial-parity} Selecting the serial parity checking scheme \cfg{winhelp-topic}{serial.parity} The \q{Parity} box allows you to choose what type of parity checking is used on the serial line. The settings are: \b \q{None}: no parity bit is sent at all. \b \q{Odd}: an extra parity bit is sent alongside each byte, and arranged so that the total number of 1 bits is odd. \b \q{Even}: an extra parity bit is sent alongside each byte, and arranged so that the total number of 1 bits is even. \b \q{Mark}: an extra parity bit is sent alongside each byte, and always set to 1. \b \q{Space}: an extra parity bit is sent alongside each byte, and always set to 0. \S{config-serial-flow} Selecting the serial flow control scheme \cfg{winhelp-topic}{serial.flow} The \q{Flow control} box allows you to choose what type of flow control checking is used on the serial line. The settings are: \b \q{None}: no flow control is done. Data may be lost if either side attempts to send faster than the serial line permits. \b \q{XON/XOFF}: flow control is done by sending XON and XOFF characters within the data stream. \b \q{RTS/CTS}: flow control is done using the RTS and CTS wires on the serial line. \b \q{DSR/DTR}: flow control is done using the DSR and DTR wires on the serial line Node-path: putty/doc/gs.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f06f38f934fdf97fab9d4d52fb0e5a4c Text-delta-base-sha1: 67af81255548b0334dfd627788fbf9648cac1306 Text-content-length: 204 Text-content-md5: f2990098b4bfd3ac229d81c60b47a2dd Text-content-sha1: 9ff8b87393c50b2e11d1b5a0aa3ddb581aa95940 Content-length: 204 SVN��V}.���|�M Connection type The fifth option, \e{Serial}, is used for connecting to a local serial line, and works somewhat differently: see \k{using-serial} for more information on this Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 946d64093a58c704c227dce2182df90f Text-delta-base-sha1: 173d7e5548b854a422601665d62629bb51b03d94 Text-content-length: 1650 Text-content-md5: 26104577bf896aac4d7c57f17064470c Text-content-sha1: a0a45b35b3408cf9c40bb725508a97b7b5de93a0 Content-length: 1650 SVN��eIV��V�cserial} Connecting to a local serial line PuTTY can connect directly to a local serial line as an alternative to making a network connection. In this mode, text typed into the PuTTY window will be sent straight out of your computer's serial port, and data received through that port will be displayed in the PuTTY window. You might use this mode, for example, if your serial port is connected to another computer which has a serial connection. To make a connection of this type, simply select \q{Serial} from the \q{Connection type} radio buttons on the \q{Session} configuration panel (see \k{config-hostname}). The \q{Host Name} and \q{Port} boxes will transform into \q{Serial line} and \q{Speed}, allowing you to specify which serial line to use (if your computer has more than one) and what speed (baud rate) to use when transferring data. For further configuration options (data bits, stop bits, parity, flow control), you can use the \q{Serial} configuration panel (see \k{config-serial}). After you start up PuTTY in serial mode, you might find that you have to make the first move, by sending some data out of the serial line in order to notify the device at the other end that someone is there for it to talk to. This probably depends on the device. If you start up a PuTTY serial session and nothing appears in the window, try pressing Return a few times and see if that helps. A serial line provides no well defined means for one end of the connection to notify the other that the connection is finished. Therefore, PuTTY in serial mode will remain connected until you close the window using the close butt Node-path: putty/mac/macctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e69d7c8b2ce541370e35a4730fd7ac16 Text-delta-base-sha1: 05d4ded2fad42cfc14170f4d66459c70b1cc3fe1 Text-content-length: 371 Text-content-md5: 9caa9ae5ea0608bf3325eb1f0ef516d5 Text-content-sha1: 88de1ac1b5bd73c59a3785a7872e8fbdf523a745 Content-length: 371 SVN��H# Y� �Y> void dlg_label_change(union control *ctrl, void *dlg, char const *text) { /* * This function is currently only used by the config box to * switch the labels on the host and port boxes between serial * and network modes. Since the Mac port does not have a serial * back end, this function can safely do nothing. */ } Node-path: putty/macosx/osxctrls.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bb273cf98888d4059f2f5bb7d174c572 Text-delta-base-sha1: 682d8080533e9ec7d14d7a59183f8768c10cfc2e Text-content-length: 382 Text-content-md5: 23cc38f094a99b0fb47deab174afd25e Text-content-sha1: 26fad5b554cbc7f0088cb8bc6d60d363802c267a Content-length: 382 SVN��gVb��b�Xlabel_change(union control *ctrl, void *dlg, char const *text) { /* * This function is currently only used by the config box to * switch the labels on the host and port boxes between serial * and network modes. Since OS X does not (yet?) have a serial * back end, this function can safely do nothing for the * moment. */ Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 443400729bc8f428fd84edc6b94eff21 Text-delta-base-sha1: 5c6a8c90671e044d9ab7c9823e28c96f37822bd6 Text-content-length: 419 Text-content-md5: a0b3d24ec6ff723233a3095cb15a0ec0 Text-content-sha1: 12174fd6c84c8f51816c1a87c6ec3f5941073b8d Content-length: 419 SVN��*:�*� /* * Determine whether or not a Config structure represents a session * which can sensibly be launched right now. */ int cfg_launchable(const Config *cfg) { if (cfg->protocol == PROT_SERIAL) return cfg->serline[0] != 0; else return cfg->host[0] != 0; } char const *cfg_dest(const Config *cfg) { if (cfg->protocol == PROT_SERIAL) return cfg->serline; else return cfg->host; } Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 51a51655fdfb966cde5224518f6ef987 Text-delta-base-sha1: c9664da88254d37d4c21657b19614f0a5bcb5b0a Text-content-length: 648 Text-content-md5: de3f5215bd8eca32848976be31fdb39b Text-content-sha1: 710bad74d41b8ff05135cb07c49f4062267bb33a Content-length: 648 SVN��qV%U����S�F^�t2�c, /* PROT_SERIAL is supported on a subset of platforms, but it doesn't * hurt to define it globally. */ PROT_SERIALnum { SER_PAR_NONE, SER_PAR_ODD, SER_PAR_EVEN, SER_PAR_MARK, SER_PAR_SPACE }; enum { SER_FLOW_NONE, SER_FLOW_XONXOFF, SER_FLOW_RTSCTS, SER_FLOW_DSRDTRSerial port options */ char serline[256]; int serspeed; int serdatabits, serstopbits; int serparity; int serflowint cfg_launchable(const Config *cfg); char const *cfg_dest(const Config *cfg); /* * Exports from sercfg.c. */ void ser_setup_config_box(struct controlbox *b, int midsession); Node-path: putty/sercfg.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 5076 Text-content-md5: 6864b5e936cef7af30cfbb828562de19 Text-content-sha1: d9760ea6205f1bcfdd2818177dc83cb8e8e2e395 Content-length: 5086 PROPS-END SVN���FFF/* * sercfg.c - the serial-port specific parts of the PuTTY * configuration box. Centralised as cross-platform code because * more than one platform will want to use it, but not part of the * main configuration. The expectation is that each platform's * local config function will call out to ser_setup_config_box() if * it needs to set up the standard serial stuff. (Of course, it can * then apply local tweaks after ser_setup_config_box() returns, if * it needs to.) */ #include <assert.h> #include <stdlib.h> #include "putty.h" #include "dialog.h" #include "storage.h" static void serial_parity_handler(union control *ctrl, void *dlg, void *data, int event) { static const struct { const char *name; int val; } parities[] = { {"None", SER_PAR_NONE}, {"Odd", SER_PAR_ODD}, {"Even", SER_PAR_EVEN}, {"Mark", SER_PAR_MARK}, {"Space", SER_PAR_SPACE}, }; int i; Config *cfg = (Config *)data; if (event == EVENT_REFRESH) { dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < lenof(parities); i++) dlg_listbox_addwithid(ctrl, dlg, parities[i].name, parities[i].val); for (i = 0; i < lenof(parities); i++) if (cfg->serparity == parities[i].val) dlg_listbox_select(ctrl, dlg, i); dlg_update_done(ctrl, dlg); } else if (event == EVENT_SELCHANGE) { int i = dlg_listbox_index(ctrl, dlg); if (i < 0) i = SER_PAR_NONE; else i = dlg_listbox_getid(ctrl, dlg, i); cfg->serparity = i; } } static void serial_flow_handler(union control *ctrl, void *dlg, void *data, int event) { static const struct { const char *name; int val; } flows[] = { {"None", SER_FLOW_NONE}, {"XON/XOFF", SER_FLOW_XONXOFF}, {"RTS/CTS", SER_FLOW_RTSCTS}, {"DSR/DTR", SER_FLOW_DSRDTR}, }; int i; Config *cfg = (Config *)data; if (event == EVENT_REFRESH) { dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < lenof(flows); i++) dlg_listbox_addwithid(ctrl, dlg, flows[i].name, flows[i].val); for (i = 0; i < lenof(flows); i++) if (cfg->serflow == flows[i].val) dlg_listbox_select(ctrl, dlg, i); dlg_update_done(ctrl, dlg); } else if (event == EVENT_SELCHANGE) { int i = dlg_listbox_index(ctrl, dlg); if (i < 0) i = SER_PAR_NONE; else i = dlg_listbox_getid(ctrl, dlg, i); cfg->serflow = i; } } void ser_setup_config_box(struct controlbox *b, int midsession) { struct controlset *s; union control *c; /* * Add the serial back end to the protocols list at the top of * the config box. */ s = ctrl_getset(b, "Session", "hostport", "Specify your connection by host name or IP address"); { int i; extern void config_protocolbuttons_handler(union control *, void *, void *, int); for (i = 0; i < s->ncontrols; i++) { c = s->ctrls[i]; if (c->generic.type == CTRL_RADIO && c->generic.handler == config_protocolbuttons_handler) { c->radio.nbuttons++; c->radio.ncolumns++; c->radio.buttons = sresize(c->radio.buttons, c->radio.nbuttons, char *); c->radio.buttons[c->radio.nbuttons-1] = dupstr("Serial"); c->radio.buttondata = sresize(c->radio.buttondata, c->radio.nbuttons, intorptr); c->radio.buttondata[c->radio.nbuttons-1] = I(PROT_SERIAL); if (c->radio.shortcuts) { c->radio.shortcuts = sresize(c->radio.shortcuts, c->radio.nbuttons, char); c->radio.shortcuts[c->radio.nbuttons-1] = NO_SHORTCUT; } } } } /* * Entirely new Connection/Serial panel for serial port * configuration. */ ctrl_settitle(b, "Connection/Serial", "Options controlling local serial lines"); if (!midsession) { /* * We don't permit switching to a different serial port in * midflight, although we do allow all other * reconfiguration. */ s = ctrl_getset(b, "Connection/Serial", "serline", "Select a serial line"); ctrl_editbox(s, "Serial line to connect to", 'l', 40, HELPCTX(serial_line), dlg_stdeditbox_handler, I(offsetof(Config,serline)), I(sizeof(((Config *)0)->serline))); } s = ctrl_getset(b, "Connection/Serial", "sercfg", "Configure the serial line"); ctrl_editbox(s, "Speed (baud)", 's', 40, HELPCTX(serial_speed), dlg_stdeditbox_handler, I(offsetof(Config,serspeed)), I(-1)); ctrl_editbox(s, "Data bits", 'b', 40, HELPCTX(serial_databits), dlg_stdeditbox_handler,I(offsetof(Config,serdatabits)),I(-1)); /* * Stop bits come in units of one half. */ ctrl_editbox(s, "Stop bits", 't', 40, HELPCTX(serial_stopbits), dlg_stdeditbox_handler,I(offsetof(Config,serstopbits)),I(-2)); ctrl_droplist(s, "Parity", 'p', 40, HELPCTX(serial_parity), serial_parity_handler, I(0)); ctrl_droplist(s, "Flow control", 'f', 40, HELPCTX(serial_flow), serial_flow_handler, I(0)); } Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8756210a781256da286df72f10983344 Text-delta-base-sha1: 1f0472c8e78852e81164e15d825a265357880df0 Text-content-length: 776 Text-content-md5: 755557f7ed00237476ad3b1bb63d0d2a Text-content-sha1: 273427e1ace6aadf4ad4e3a212b6e0916154373f Content-length: 776 SVN��_Hc�7�z�q4i�=" write_setting_s(sesskey, "SerialLine", cfg->serline); write_setting_i(sesskey, "SerialSpeed", cfg->serspeed); write_setting_i(sesskey, "SerialDataBits", cfg->serdatabits); write_setting_i(sesskey, "SerialStopHalfbits", cfg->serstopbits); write_setting_i(sesskey, "SerialParity", cfg->serparity); write_setting_i(sesskey, "SerialFlowControl", cfg->serflow gpps(sesskey, "SerialLine", "", cfg->serline, sizeof(cfg->serline)); gppi(sesskey, "SerialSpeed", 9600, &cfg->serspeed); gppi(sesskey, "SerialDataBits", 8, &cfg->serdatabits); gppi(sesskey, "SerialStopHalfbits", 2, &cfg->serstopbits); gppi(sesskey, "SerialParity", 0, &cfg->serparity); gppi(sesskey, "SerialFlowControl", 0, &cfg->serflow Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 413c39c6e082d2b75e1ab63f4056a215 Text-delta-base-sha1: 60fbd16b3dea84d2dde4e53319fd1667d58c5761 Text-content-length: 382 Text-content-md5: eb657abf294a03198d315681685dad0b Text-content-sha1: e9ebfbdbe21e7643465b051a9161340d4a141c35 Content-length: 382 SVN��$a�1�a��$label_change(union control *ctrl, void *dlg, char const *text) { /* * This function is currently only used by the config box to * switch the labels on the host and port boxes between serial * and network modes. Since Unix does not (yet) have a serial * back end, this function can safely do nothing for the * moment. */ Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 292bd324d6591140271f811f747e5e93 Text-delta-base-sha1: ede87540bbc0d72d39a4771a29006df402c8e480 Text-content-length: 124 Text-content-md5: b09d95917ab842de17bec528fc16255c Text-content-sha1: a2a35eb3ffe3097aaf8267411e7108d12c844f96 Content-length: 124 SVN�� rk��k /* * Serial back end is available on Windows. */ ser_setup_config_box(b, midsession); } Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 93a63628b0ebd8ea096b53341a354106 Text-delta-base-sha1: e66fef12d6f15a2e5b7afa12d7513bed8fc4a364 Text-content-length: 1137 Text-content-md5: 6a462cc214181d4c5a167204f8906b9c Text-content-sha1: 2d61583f2e5ed5953457d2ada5d5320fc6524973 Content-length: 1137 SVN��IE�w�L�6.�Zm�:Wonst char *text, char shortcut) { char *ret; char const *p; charlabel_changechar *escaped = NULL; int id = -1; assert(c); switch (c->ctrl->generic.type) { case CTRL_EDITBOX: escaped = shortcut_escape(text, c->ctrl->editbox.shortcut); id = c->base_id; break; case CTRL_RADIO: escaped = shortcut_escape(text, c->ctrl->radio.shortcut); id = c->base_id; break; case CTRL_CHECKBOX: escaped = shortcut_escape(text, ctrl->checkbox.shortcut); id = c->base_id; break; case CTRL_BUTTON: escaped = shortcut_escape(text, ctrl->button.shortcut); id = c->base_id; break; case CTRL_LISTBOX: escaped = shortcut_escape(text, ctrl->listbox.shortcut); id = c->base_id; break; case CTRL_FILESELECT: escaped = shortcut_escape(text, ctrl->fileselect.shortcut); id = c->base_id; break; case CTRL_FONTSELECT: escaped = shortcut_escape(text, ctrl->fontselect.shortcut); id = c->base_id; break; default: assert(!"Can't happen"); break; } if (escaped) { SetDlgItemText(dp->hwnd, id, escaped); sfree(escaped); } Node-path: putty/windows/windefs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c56fe4aa6038a0a2d00634883c7dc966 Text-delta-base-sha1: cf563519f86db9ed4ebfe7e9c1016e80b4f19f21 Text-content-length: 76 Text-content-md5: 5e602fc91c226e328c0057d639eda669 Text-content-sha1: 2643a53f32f099248881c9eeee14f9913471df52 Content-length: 76 SVN��<y 8�f��[aif (!strcmp(name, "SerialLine")) return dupstr("COM1"); Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8fca76f7f20df0064b8fae50b38324d9 Text-delta-base-sha1: 32b18d09aa4c529bcbc2d66fc47f433d6cfba141 Text-content-length: 58 Text-content-md5: 427ffd322897e549be1d8fd0c0d29659 Text-content-sha1: 82abb4e16798a4fef2581bbf8d5123642d408965 Content-length: 58 SVN���� �0��E5_dest(&cfg)�V\�V� x Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c7738eee06e6d7b21c7a33eb64e83cc Text-delta-base-sha1: 4c7e2725a854a5eaa45cdb7d7bb295befafa84e1 Text-content-length: 320 Text-content-md5: 210b88f7e823b162b53ae71ae2d3763a Text-content-sha1: 4f7332543dd6ecfda128de1493f50b637c05086b Content-length: 320 SVN��Cm (�i�(�\g#define WINHELP_CTX_serial_line "serial.line" #define WINHELP_CTX_serial_speed "serial.speed" #define WINHELP_CTX_serial_databits "serial.databits" #define WINHELP_CTX_serial_stopbits "serial.stopbits" #define WINHELP_CTX_serial_parity "serial.parity" #define WINHELP_CTX_serial_flow "serial.flow Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b40e45f85687b0416a4441e8557830ee Text-delta-base-sha1: 7eb38602893a9afcd7c3a9efb57c0da3a9a22c27 Text-content-length: 120 Text-content-md5: 342301630f1ed124a7f0f3192cf98176 Text-content-sha1: 9d0a3ba92a4831ba3aaae4299a99214292439fe4 Content-length: 120 SVN��(O�;�� D�ib�T�rcfg_launchable(&cfg)!cfg_launchable(&cfg2)cfg_launchable(&cfg)_launchable(&cfg) Node-path: putty/windows/winser.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 9544 Text-content-md5: abe2de2869d4fd3cdc1c1e2a767d8b40 Text-content-sha1: 92ad2d5a82d97447132414a18da59cedff7fabb7 Content-length: 9554 PROPS-END SVN���:::/* * Serial back end (Windows-specific). */ /* * TODO: * * - sending breaks? * + looks as if you do this by calling SetCommBreak(handle), * then waiting a bit, then doing ClearCommBreak(handle). A * small job for timing.c, methinks. * * - why are we dropping data when talking to judicator? */ #include <stdio.h> #include <stdlib.h> #include <limits.h> #include "putty.h" #define SERIAL_MAX_BACKLOG 4096 typedef struct serial_backend_data { HANDLE port; struct handle *out, *in; void *frontend; int bufsize; } *Serial; static void serial_terminate(Serial serial) { if (serial->out) { handle_free(serial->out); serial->out = NULL; } if (serial->in) { handle_free(serial->in); serial->in = NULL; } if (serial->port) { CloseHandle(serial->port); serial->port = NULL; } } static int serial_gotdata(struct handle *h, void *data, int len) { Serial serial = (Serial)handle_get_privdata(h); if (len <= 0) { const char *error_msg; /* * Currently, len==0 should never happen because we're * ignoring EOFs. However, it seems not totally impossible * that this same back end might be usable to talk to named * pipes or some other non-serial device, in which case EOF * may become meaningful here. */ if (len == 0) error_msg = "End of file reading from serial device"; else error_msg = "Error reading from serial device"; serial_terminate(serial); notify_remote_exit(serial->frontend); logevent(serial->frontend, error_msg); connection_fatal(serial->frontend, "%s", error_msg); return 0; /* placate optimiser */ } else { return from_backend(serial->frontend, 0, data, len); } } static void serial_sentdata(struct handle *h, int new_backlog) { Serial serial = (Serial)handle_get_privdata(h); if (new_backlog < 0) { const char *error_msg = "Error writing to serial device"; serial_terminate(serial); notify_remote_exit(serial->frontend); logevent(serial->frontend, error_msg); connection_fatal(serial->frontend, "%s", error_msg); } else { serial->bufsize = new_backlog; } } static const char *serial_configure(Serial serial, HANDLE serport, Config *cfg) { DCB dcb; COMMTIMEOUTS timeouts; /* * Set up the serial port parameters. If we can't even * GetCommState, we ignore the problem on the grounds that the * user might have pointed us at some other type of two-way * device instead of a serial port. */ if (GetCommState(serport, &dcb)) { char *msg; const char *str; /* * Boilerplate. */ dcb.fBinary = TRUE; dcb.fDtrControl = DTR_CONTROL_ENABLE; dcb.fDsrSensitivity = FALSE; dcb.fTXContinueOnXoff = FALSE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fErrorChar = FALSE; dcb.fNull = FALSE; dcb.fRtsControl = RTS_CONTROL_ENABLE; dcb.fAbortOnError = FALSE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; /* * Configurable parameters. */ dcb.BaudRate = cfg->serspeed; msg = dupprintf("Configuring baud rate %d", cfg->serspeed); logevent(serial->frontend, msg); sfree(msg); dcb.ByteSize = cfg->serdatabits; msg = dupprintf("Configuring %d data bits", cfg->serdatabits); logevent(serial->frontend, msg); sfree(msg); switch (cfg->serstopbits) { case 2: dcb.StopBits = ONESTOPBIT; str = "1"; break; case 3: dcb.StopBits = ONE5STOPBITS; str = "1.5"; break; case 4: dcb.StopBits = TWOSTOPBITS; str = "2"; break; default: return "Invalid number of stop bits (need 1, 1.5 or 2)"; } msg = dupprintf("Configuring %s data bits", str); logevent(serial->frontend, msg); sfree(msg); switch (cfg->serparity) { case SER_PAR_NONE: dcb.Parity = NOPARITY; str = "no"; break; case SER_PAR_ODD: dcb.Parity = ODDPARITY; str = "odd"; break; case SER_PAR_EVEN: dcb.Parity = EVENPARITY; str = "even"; break; case SER_PAR_MARK: dcb.Parity = MARKPARITY; str = "mark"; break; case SER_PAR_SPACE: dcb.Parity = SPACEPARITY; str = "space"; break; } msg = dupprintf("Configuring %s parity", str); logevent(serial->frontend, msg); sfree(msg); switch (cfg->serflow) { case SER_FLOW_NONE: str = "no"; break; case SER_FLOW_XONXOFF: dcb.fOutX = dcb.fInX = TRUE; str = "XON/XOFF"; break; case SER_FLOW_RTSCTS: dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; dcb.fOutxCtsFlow = TRUE; str = "RTS/CTS"; break; case SER_FLOW_DSRDTR: dcb.fDtrControl = DTR_CONTROL_HANDSHAKE; dcb.fOutxDsrFlow = TRUE; str = "DSR/DTR"; break; } msg = dupprintf("Configuring %s flow control", str); logevent(serial->frontend, msg); sfree(msg); if (!SetCommState(serport, &dcb)) return "Unable to configure serial port"; timeouts.ReadIntervalTimeout = 1; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.ReadTotalTimeoutConstant = 0; timeouts.WriteTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 0; if (!SetCommTimeouts(serport, &timeouts)) return "Unable to configure serial timeouts"; } return NULL; } /* * Called to set up the serial connection. * * Returns an error message, or NULL on success. * * Also places the canonical host name into `realhost'. It must be * freed by the caller. */ static const char *serial_init(void *frontend_handle, void **backend_handle, Config *cfg, char *host, int port, char **realhost, int nodelay, int keepalive) { Serial serial; HANDLE serport; const char *err; serial = snew(struct serial_backend_data); serial->port = NULL; serial->out = serial->in = NULL; *backend_handle = serial; serial->frontend = frontend_handle; { char *msg = dupprintf("Opening serial device %s", host); logevent(serial->frontend, msg); } serport = CreateFile(cfg->serline, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (serport == INVALID_HANDLE_VALUE) return "Unable to open serial port"; err = serial_configure(serial, serport, cfg); if (err) return err; serial->port = serport; serial->out = handle_output_new(serport, serial_sentdata, serial, HANDLE_FLAG_OVERLAPPED); serial->in = handle_input_new(serport, serial_gotdata, serial, HANDLE_FLAG_OVERLAPPED | HANDLE_FLAG_IGNOREEOF); *realhost = dupstr(cfg->serline); return NULL; } static void serial_free(void *handle) { Serial serial = (Serial) handle; serial_terminate(serial); sfree(serial); } static void serial_reconfig(void *handle, Config *cfg) { Serial serial = (Serial) handle; const char *err; err = serial_configure(serial, serial->port, cfg); /* * FIXME: what should we do if err returns something? */ } /* * Called to send data down the serial connection. */ static int serial_send(void *handle, char *buf, int len) { Serial serial = (Serial) handle; if (serial->out == NULL) return 0; serial->bufsize = handle_write(serial->out, buf, len); return serial->bufsize; } /* * Called to query the current sendability status. */ static int serial_sendbuffer(void *handle) { Serial serial = (Serial) handle; return serial->bufsize; } /* * Called to set the size of the window */ static void serial_size(void *handle, int width, int height) { /* Do nothing! */ return; } /* * Send serial special codes. */ static void serial_special(void *handle, Telnet_Special code) { /* * FIXME: serial break? XON? XOFF? */ return; } /* * Return a list of the special codes that make sense in this * protocol. */ static const struct telnet_special *serial_get_specials(void *handle) { /* * FIXME: serial break? XON? XOFF? */ return NULL; } static int serial_connected(void *handle) { return 1; /* always connected */ } static int serial_sendok(void *handle) { return 1; } static void serial_unthrottle(void *handle, int backlog) { Serial serial = (Serial) handle; if (serial->in) handle_unthrottle(serial->in, backlog); } static int serial_ldisc(void *handle, int option) { /* * Local editing and local echo are off by default. */ return 0; } static void serial_provide_ldisc(void *handle, void *ldisc) { /* This is a stub. */ } static void serial_provide_logctx(void *handle, void *logctx) { /* This is a stub. */ } static int serial_exitcode(void *handle) { Serial serial = (Serial) handle; if (serial->port != NULL) return -1; /* still connected */ else /* Exit codes are a meaningless concept with serial ports */ return INT_MAX; } /* * cfg_info for Serial does nothing at all. */ static int serial_cfg_info(void *handle) { return 0; } Backend serial_backend = { serial_init, serial_free, serial_reconfig, serial_send, serial_sendbuffer, serial_size, serial_special, serial_get_specials, serial_connected, serial_exitcode, serial_sendok, serial_ldisc, serial_provide_ldisc, serial_provide_logctx, serial_unthrottle, serial_cfg_info, 1 }; Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2a25d1b6598e457f5a9e2f356a969aad Text-delta-base-sha1: 997b85c6443b9775ef699d5f222caaa6e9067e14 Text-content-length: 89 Text-content-md5: 3fe4cb8f5b76188b2a6de30e2345db5c Text-content-sha1: 4946b1c0946f65ca800ef585525910245b24ac47 Content-length: 89 SVN��w8H�p�H/* * Exports from winser.c. */ extern Backend serial_backend; #endif Revision-number: 6816 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2006-08-28T10:36:23.162610Z K 7 svn:log V 6 Done! K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 83d40aa7ede98f09768c66d7c752e0f7 Text-delta-base-sha1: bdab9419d889222a6a6b1182ae78a9f71b0b9f56 Text-content-length: 115 Text-content-md5: e0702b70a22c1b48d88adc61ea43db73 Text-content-sha1: 392af378a329bd8f208d7cf76c06528d4a5ab4d2 Content-length: 115 SVN��4 ^�s��BrDFixed-in: 2006-08-29 r6815 <p> <b>SGT, 2006-08-28</b>: I believe this is basically there now. Revision-number: 6817 Prop-content-length: 160 Content-length: 160 K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-28T11:13:56.762262Z K 7 svn:log V 60 Fix line endings (svn:eol-style properties and actual CRs). PROPS-END Node-path: putty/be_all_s.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/be_nos_s.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/noprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/notiming.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/pinger.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/sercfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 6864b5e936cef7af30cfbb828562de19 Text-delta-base-sha1: d9760ea6205f1bcfdd2818177dc83cb8e8e2e395 Text-content-length: 4710 Text-content-md5: c85b57cb05909a624c5a6289f3768ae3 Text-content-sha1: 5aa5082192f3962d33e72d97035212f93c2dddfd Content-length: 4750 K 13 svn:eol-style V 6 native PROPS-END SVN��FC}�C�V�E|J�T8&/* * sercfg.c - the serial-port specific parts of the PuTTY * configuration box. Centralised as cross-platform code because * main configuration. The expectation is that each platform's * local config function will call out to ser_setup_config_box() if * it needs to set up the standard serial stuff. (Of course, it can * then apply local tweaks after ser_setup_config_box() returns, if * it needs to.) */ #include <assert.h> #include <stdlib.h> #include "putty.h" #include "dialog.h" #include "storage.h" static void serial_parity_handler(union control *ctrl, void *dlg, void *data, int event) { static const struct { const char *name; int val; } parities[] = { {"None", SER_PAR_NONE}, {"Odd", SER_PAR_ODD}, {"Even", SER_PAR_EVEN}, {"Mark", SER_PAR_MARK}, {"Space", SER_PAR_SPACE}, }; int i; Config *cfg = (Config *)data; if (event == EVENT_REFRESH) { dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < lenof(parities); i++) dlg_listbox_addwithid(ctrl, dlg, parities[i].name, parities[i].val); for (i = 0; i < lenof(parities); i++) if (cfg->serparity == parities[i].val) dlg_listbox_select(ctrl, dlg, i); dlg_update_done(ctrl, dlg); } else if (event == EVENT_SELCHANGE) { int i = dlg_listbox_index(ctrl, dlg); if (i < 0) i = SER_PAR_NONE; else i = dlg_listbox_getid(ctrl, dlg, i); cfg->serparity = i; } } static void serial_flow_handler(union control *ctrl, void *dlg, void *data, int event) { static const struct { const char *name; int val; } flows[] = { {"None", SER_FLOW_NONE}, {"XON/XOFF", SER_FLOW_XONXOFF}, {"RTS/CTS", SER_FLOW_RTSCTS}, {"DSR/DTR", SER_FLOW_DSRDTR}, }; int i; Config *cfg = (Config *)data; if (event == EVENT_REFRESH) { dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < lenof(flows); i++) dlg_listbox_addwithid(ctrl, dlg, flows[i].name, flows[i].val); for (i = 0; i < lenof(flows); i++) if (cfg->serflow == flows[i].val) dlg_listbox_select(ctrl, dlg, i); dlg_update_done(ctrl, dlg); } else if (event == EVENT_SELCHANGE) { int i = dlg_listbox_index(ctrl, dlg); if (i < 0) i = SER_PAR_NONE; else i = dlg_listbox_getid(ctrl, dlg, i); cfg->serflow = i; } } void ser_setup_config_box(struct controlbox *b, int midsession) { struct controlset *s; union control *c; /* * Add the serial back end to the protocols list at the top of * the config box. */ s = ctrl_getset(b, "Session", "hostport", "Specify your connection by host name or IP address"); { int i; void *, int); for (i = 0; i < s->ncontrols; i++) { c = s->ctrls[i]; if (c->generic.type == CTRL_RADIO && c->generic.handler == config_protocolbuttons_handler) { c->radio.nbuttons++; c->radio.ncolumns++; c->radio.buttons = sresize(c->radio.buttons, c->radio.nbuttons, char *); c->radio.buttons[c->radio.nbuttons-1] = dupstr("Serial"); c->radio.buttondata = sresize(c->radio.buttondata, c->radio.nbuttons, intorptr); c->radio.buttondata[c->radio.nbuttons-1] = I(PROT_SERIAL); if (c->radio.shortcuts) { c->radio.shortcuts = sresize(c->radio.shortcuts, c->radio.nbuttons, char); c->radio.shortcuts[c->radio.nbuttons-1] = NO_SHORTCUT; } } } } /* * Entirely new Connection/Serial panel for serial port * configuration. */ ctrl_settitle(b, "Connection/Serial", "Options controlling local serial lines"); if (!midsession) { /* * We don't permit switching to a different serial port in * midflight, although we do allow all other * reconfiguration. */ s = ctrl_getset(b, "Connection/Serial", "serline", "Select a serial line"); ctrl_editbox(s, "Serial line to connect to", 'l', 40, HELPCTX(serial_line), dlg_stdeditbox_handler, I(offsetof(Config,serline)), I(sizeof(((Config *)0)->serline))); } ctrl_editbox(s, "Speed (baud)", 's', 40, HELPCTX(serial_speed), dlg_stdeditbox_handler, I(offsetof(Config,serspeed)), I(-1)); ctrl_editbox(s, "Data bits", 'b', 40, HELPCTX(serial_databits), dlg_stdeditbox_handler,I(offsetof(Config,serdatabits)),I(-1)); /* * Stop bits come in units of one half. */ ctrl_editbox(s, "Stop bits", 't', 40, HELPCTX(serial_stopbits), dlg_stdeditbox_handler,I(offsetof(Config,serstopbits)),I(-2)); ctrl_droplist(s, "Parity", 'p', 40, HELPCTX(serial_parity), serial_parity_handler, I(0)); ctrl_droplist(s, "Flow control", 'f', 40, HELPCTX(serial_flow), serial_flow_handler, I(0)); } Node-path: putty/ssharcf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/time.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/timing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/unix/gtkcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/windows/rcstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/windows/winproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: ade26cb0b2e616239286465a18e5983c Text-delta-base-sha1: e5150132e7b2e2e7057967e536673d53c54789d5 Text-content-length: 5352 Text-content-md5: 484e1be101daa2292e00519240ef4f4d Text-content-sha1: 66d34b1ffc975a4a433dd8f30c43aba2201899c4 Content-length: 5392 K 13 svn:eol-style V 6 native PROPS-END SVN��w Rj�L9h/* * winproxy.c: Windows implementation of platform_new_connection(), * supporting an OpenSSH-like proxy command via the winhandl.c * mechanism. */ #include <stdio.h> #include <assert.h> #define DEFINE_PLUG_METHOD_MACROS #include "tree234.h" #include "putty.h" #include "network.h" #include "proxy.h" typedef struct Socket_localproxy_tag *Local_Proxy_Socket; struct Socket_localproxy_tag { const struct socket_function_table *fn; /* the above variable absolutely *must* be the first in this structure */ HANDLE to_cmd_H, from_cmd_H; struct handle *to_cmd_h, *from_cmd_h; char *error; Plug plug; void *privptr; }; int localproxy_gotdata(struct handle *h, void *data, int len) { Local_Proxy_Socket ps = (Local_Proxy_Socket) handle_get_privdata(h); if (len < 0) { return plug_closing(ps->plug, "Read error from local proxy command", 0, 0); } else if (len == 0) { return plug_closing(ps->plug, NULL, 0, 0); } else { return plug_receive(ps->plug, 1, data, len); } } void localproxy_sentdata(struct handle *h, int new_backlog) { Local_Proxy_Socket ps = (Local_Proxy_Socket) handle_get_privdata(h); plug_sent(ps->plug, new_backlog); } static Plug sk_localproxy_plug (Socket s, Plug p) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; Plug ret = ps->plug; if (p) ps->plug = p; return ret; } static void sk_localproxy_close (Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; handle_free(ps->to_cmd_h); handle_free(ps->from_cmd_h); CloseHandle(ps->to_cmd_H); CloseHandle(ps->from_cmd_H); sfree(ps); } static int sk_localproxy_write (Socket s, const char *data, int len) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; return handle_write(ps->to_cmd_h, data, len); } static int sk_localproxy_write_oob(Socket s, const char *data, int len) { /* * oob data is treated as inband; nasty, but nothing really * better we can do */ return sk_localproxy_write(s, data, len); } static void sk_localproxy_flush(Socket s) { /* Local_Proxy_Socket ps = (Local_Proxy_Socket) s; */ /* do nothing */ } static void sk_localproxy_set_private_ptr(Socket s, void *ptr) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; ps->privptr = ptr; } static void *sk_localproxy_get_private_ptr(Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; return ps->privptr; } static void sk_localproxy_set_frozen(Socket s, int is_frozen) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; /* * FIXME */ } static const char *sk_localproxy_socket_error(Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; return ps->error; } Socket platform_new_connection(SockAddr addr, char *hostname, int port, int privport, int oobinline, int nodelay, int keepalive, Plug plug, const Config *cfg) { char *cmd; static const struct socket_function_table socket_fn_table = { sk_localproxy_plug, sk_localproxy_close, sk_localproxy_write, sk_localproxy_write_oob, sk_localproxy_flush, sk_localproxy_set_private_ptr, sk_localproxy_get_private_ptr, sk_localproxy_set_frozen, sk_localproxy_socket_error }; Local_Proxy_Socket ret; HANDLE us_to_cmd, us_from_cmd, cmd_to_us, cmd_from_us; SECURITY_ATTRIBUTES sa; STARTUPINFO si; PROCESS_INFORMATION pi; if (cfg->proxy_type != PROXY_CMD) return NULL; cmd = format_telnet_command(addr, port, cfg); { char *msg = dupprintf("Starting local proxy command: %s", cmd); /* We're allowed to pass NULL here, because we're part of the Windows * front end so we know logevent doesn't expect any data. */ logevent(NULL, msg); sfree(msg); } ret = snew(struct Socket_localproxy_tag); ret->fn = &socket_fn_table; ret->plug = plug; ret->error = NULL; /* * Create the pipes to the proxy command, and spawn the proxy * command process. */ sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; /* default */ sa.bInheritHandle = TRUE; if (!CreatePipe(&us_from_cmd, &cmd_to_us, &sa, 0)) { ret->error = dupprintf("Unable to create pipes for proxy command"); return (Socket)ret; } if (!CreatePipe(&cmd_from_us, &us_to_cmd, &sa, 0)) { CloseHandle(us_from_cmd); CloseHandle(cmd_to_us); ret->error = dupprintf("Unable to create pipes for proxy command"); return (Socket)ret; } SetHandleInformation(us_to_cmd, HANDLE_FLAG_INHERIT, 0); SetHandleInformation(us_from_cmd, HANDLE_FLAG_INHERIT, 0); si.cb = sizeof(si); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = NULL; si.dwFlags = STARTF_USESTDHANDLES; si.cbReserved2 = 0; si.lpReserved2 = NULL; si.hStdInput = cmd_from_us; si.hStdOutput = cmd_to_us; si.hStdError = NULL; CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); CloseHandle(cmd_from_us); CloseHandle(cmd_to_us); ret->to_cmd_H = us_to_cmd; ret->from_cmd_H = us_from_cmd; ret, 0); ret->to_cmd_h = handle_output_new(ret->to_cmd_H, localproxy_sentdata, ret, 0); /* We are responsible for this and don't need it any more */ sk_addr_free(addr); return (Socket) ret; } Node-path: putty/windows/winser.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: abe2de2869d4fd3cdc1c1e2a767d8b40 Text-delta-base-sha1: 92ad2d5a82d97447132414a18da59cedff7fabb7 Text-content-length: 9079 Text-content-md5: 3ba1ff6d3eead92761925b832274ff6a Text-content-sha1: 1570116690bceee2a5c72a063f7f821e5d1c5ad0 Content-length: 9119 K 13 svn:eol-style V 6 native PROPS-END SVN��:. ag�M6z/* * Serial back end (Windows-specific). */ /* * TODO: * * - sending breaks? * + looks as if you do this by calling SetCommBreak(handle), * then waiting a bit, then doing ClearCommBreak(handle). A * small job for timing.c, methinks. * * - why are we dropping data when talking to judicator? */ #include <stdio.h> #include <stdlib.h> #include <limits.h> #include "putty.h" #define SERIAL_MAX_BACKLOG 4096 typedef struct serial_backend_data { HANDLE port; struct handle *out, *in; void *frontend; int bufsize; } *Serial; static void serial_terminate(Serial serial) { if (serial->out) { handle_free(serial->out); serial->out = NULL; } if (serial->in) { handle_free(serial->in); serial->in = NULL; } if (serial->port) { CloseHandle(serial->port); serial->port = NULL; } } static int serial_gotdata(struct handle *h, void *data, int len) { Serial serial = (Serial)handle_get_privdata(h); if (len <= 0) { const char *error_msg; /* * Currently, len==0 should never happen because we're * ignoring EOFs. However, it seems not totally impossible * that this same back end might be usable to talk to named * pipes or some other non-serial device, in which case EOF * may become meaningful here. */ if (len == 0) error_msg = "End of file reading from serial device"; else error_msg = "Error reading from serial device"; serial_terminate(serial); notify_remote_exit(serial->frontend); logevent(serial->frontend, error_msg); connection_fatal(serial->frontend, "%s", error_msg); return 0; /* placate optimiser */ } else { return from_backend(serial->frontend, 0, data, len); } } static void serial_sentdata(struct handle *h, int new_backlog) { Serial serial = (Serial)handle_get_privdata(h); if (new_backlog < 0) { const char *error_msg = "Error writing to serial device"; serial_terminate(serial); notify_remote_exit(serial->frontend); logevent(serial->frontend, error_msg); connection_fatal(serial->frontend, "%s", error_msg); } else { serial->bufsize = new_backlog; } } static const char *serial_configure(Serial serial, HANDLE serport, Config *cfg) { DCB dcb; COMMTIMEOUTS timeouts; /* * Set up the serial port parameters. If we can't even * GetCommState, we ignore the problem on the grounds that the * user might have pointed us at some other type of two-way * device instead of a serial port. */ if (GetCommState(serport, &dcb)) { char *msg; const char *str; /* * Boilerplate. */ dcb.fBinary = TRUE; dcb.fDtrControl = DTR_CONTROL_ENABLE; dcb.fDsrSensitivity = FALSE; dcb.fTXContinueOnXoff = FALSE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fErrorChar = FALSE; dcb.fNull = FALSE; dcb.fRtsControl = RTS_CONTROL_ENABLE; dcb.fAbortOnError = FALSE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; /* * Configurable parameters. */ dcb.BaudRate = cfg->serspeed; msg = dupprintf("Configuring baud rate %d", cfg->serspeed); logevent(serial->frontend, msg); sfree(msg); dcb.ByteSize = cfg->serdatabits; msg = dupprintf("Configuring %d data bits", cfg->serdatabits); logevent(serial->frontend, msg); sfree(msg); switch (cfg->serstopbits) { case 2: dcb.StopBits = ONESTOPBIT; str = "1"; break; case 3: dcb.StopBits = ONE5STOPBITS; str = "1.5"; break; case 4: dcb.StopBits = TWOSTOPBITS; str = "2"; break; default: return "Invalid number of stop bits (need 1, 1.5 or 2)"; } msg = dupprintf("Configuring %s data bits", str); logevent(serial->frontend, msg); sfree(msg); switch (cfg->serparity) { case SER_PAR_NONE: dcb.Parity = NOPARITY; str = "no"; break; case SER_PAR_ODD: dcb.Parity = ODDPARITY; str = "odd"; break; case SER_PAR_EVEN: dcb.Parity = EVENPARITY; str = "even"; break; case SER_PAR_MARK: dcb.Parity = MARKPARITY; str = "mark"; break; case SER_PAR_SPACE: dcb.Parity = SPACEPARITY; str = "space"; break; } msg = dupprintf("Configuring %s parity", str); logevent(serial->frontend, msg); sfree(msg); switch (cfg->serflow) { case SER_FLOW_NONE: str = "no"; break; case SER_FLOW_XONXOFF: dcb.fOutX = dcb.fInX = TRUE; str = "XON/XOFF"; break; case SER_FLOW_RTSCTS: dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; dcb.fOutxCtsFlow = TRUE; str = "RTS/CTS"; break; case SER_FLOW_DSRDTR: dcb.fDtrControl = DTR_CONTROL_HANDSHAKE; dcb.fOutxDsrFlow = TRUE; str = "DSR/DTR"; break; } msg = dupprintf("Configuring %s flow control", str); logevent(serial->frontend, msg); sfree(msg); if (!SetCommState(serport, &dcb)) return "Unable to configure serial port"; timeouts.ReadIntervalTimeout = 1; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.ReadTotalTimeoutConstant = 0; timeouts.WriteTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 0; if (!SetCommTimeouts(serport, &timeouts)) return "Unable to configure serial timeouts"; } return NULL; } /* * Called to set up the serial connection. * * Returns an error message, or NULL on success. * * Also places the canonical host name into `realhost'. It must be * freed by the caller. */ Config *cfg, char *host, int port, char **realhost, int nodelay, int keepalive) { Serial serial; HANDLE serport; const char *err; serial = snew(struct serial_backend_data); serial->port = NULL; serial->out = serial->in = NULL; *backend_handle = serial; serial->frontend = frontend_handle; { char *msg = dupprintf("Opening serial device %s", host); logevent(serial->frontend, msg); } serport = CreateFile(cfg->serline, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (serport == INVALID_HANDLE_VALUE) return "Unable to open serial port"; err = serial_configure(serial, serport, cfg); if (err) return err; serial->port = serport; serial->out = handle_output_new(serport, serial_sentdata, serial, HANDLE_FLAG_OVERLAPPED); serial->in = handle_input_new(serport, serial_gotdata, serial, HANDLE_FLAG_OVERLAPPED | HANDLE_FLAG_IGNOREEOF); *realhost = dupstr(cfg->serline); return NULL; } static void serial_free(void *handle) { Serial serial = (Serial) handle; serial_terminate(serial); sfree(serial); } static void serial_reconfig(void *handle, Config *cfg) { Serial serial = (Serial) handle; const char *err; err = serial_configure(serial, serial->port, cfg); /* * FIXME: what should we do if err returns something? */ } /* * Called to send data down the serial connection. */ static int serial_send(void *handle, char *buf, int len) { Serial serial = (Serial) handle; if (serial->out == NULL) return 0; serial->bufsize = handle_write(serial->out, buf, len); return serial->bufsize; } /* * Called to query the current sendability status. */ static int serial_sendbuffer(void *handle) { Serial serial = (Serial) handle; return serial->bufsize; } /* * Called to set the size of the window */ static void serial_size(void *handle, int width, int height) { /* Do nothing! */ return; } /* * Send serial special codes. */ static void serial_special(void *handle, Telnet_Special code) { /* * FIXME: serial break? XON? XOFF? */ return; } /* * Return a list of the special codes that make sense in this * protocol. */ static const struct telnet_special *serial_get_specials(void *handle) { /* * FIXME: serial break? XON? XOFF? */ return NULL; } static int serial_connected(void *handle) { return 1; /* always connected */ } static int serial_sendok(void *handle) { return 1; } static void serial_unthrottle(void *handle, int backlog) { Serial serial = (Serial) handle; if (serial->in) handle_unthrottle(serial->in, backlog); } static int serial_ldisc(void *handle, int option) { /* * Local editing and local echo are off by default. */ return 0; } static void serial_provide_ldisc(void *handle, void *ldisc) { /* This is a stub. */ } static void serial_provide_logctx(void *handle, void *logctx) { /* This is a stub. */ } static int serial_exitcode(void *handle) { Serial serial = (Serial) handle; if (serial->port != NULL) return -1; /* still connected */ else /* Exit codes are a meaningless concept with serial ports */ return INT_MAX; } /* * cfg_info for Serial does nothing at all. */ static int serial_cfg_info(void *handle) { return 0; } Backend serial_backend = { serial_init, serial_free, serial_reconfig, serial_send, serial_sendbuffer, serial_size, serial_special, serial_get_specials, serial_connected, serial_exitcode, serial_sendok, serial_ldisc, serial_provide_ldisc, serial_provide_logctx, serial_unthrottle, serial_cfg_info, 1 }; Node-path: putty/windows/wintime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Content-length: 40 K 13 svn:eol-style V 6 native PROPS-END Revision-number: 6818 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 Forgot to initialise serial->bufsize to zero. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-28T11:32:12.025146Z PROPS-END Node-path: putty/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ba1ff6d3eead92761925b832274ff6a Text-delta-base-sha1: 1570116690bceee2a5c72a063f7f821e5d1c5ad0 Text-content-length: 40 Text-content-md5: 609e94f61ebaea3483e911d73c48f584 Text-content-sha1: 5c318c67a3312d5cd3ec7b107bf702c5ea646311 Content-length: 40 SVN��.G �S��aMserial->bufsize = 0 Revision-number: 6819 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 25 Fix small event log bug. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-28T11:33:51.141421Z PROPS-END Node-path: putty/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 609e94f61ebaea3483e911d73c48f584 Text-delta-base-sha1: 5c318c67a3312d5cd3ec7b107bf702c5ea646311 Text-content-length: 33 Text-content-md5: 64fbca157d29703ded09b2094a8eb175 Text-content-sha1: 30017cc966428d9905c386ea6937f51c4fac4bcb Content-length: 33 SVN��GO �i��Zmcfg->serline Revision-number: 6820 Prop-content-length: 321 Content-length: 321 K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-28T13:08:15.009948Z K 7 svn:log V 220 Because not all OSes will support the same set of serial port options, here's a slight change to the API of ser_setup_config_box() to make it filter its parity and flow control options using platform-supplied bit masks. PROPS-END Node-path: putty/sercfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c85b57cb05909a624c5a6289f3768ae3 Text-delta-base-sha1: 5aa5082192f3962d33e72d97035212f93c2dddfd Text-content-length: 750 Text-content-md5: d5a417da7fe49a2c28481437003c0ee2 Text-content-sha1: c632f58ce91f1f0ecc3a3b4fb5fa634c521a3a6a Content-length: 750 SVN��802���!�s�'z�Ls�Q/�0��g1mask = ctrl->listbox.context.i; int i, jparities); i++) { if (mask & (1 << i)) dlg_listbox_addwithid(ctrl, dlg, parities[i].name, parities[i].val); } for (i = j = 0; i < lenof(parities); i++) { if (cfg->serparity == parities[i].val) dlg_listbox_select(ctrl, dlg, j); if (mask & (1 << i)) j++; }mask = ctrl->listbox.context.i; int i, j { if (mask & (1 << i)) dlg_listbox_addwithid(ctrl, dlg, flows[i].name, flows[i].val); } for (i = j = 0; i < lenof(flows); i++) { if (cfg->serflow == flows[i].val) dlg_listbox_select(ctrl, dlg, j); if (mask & (1 << i)) j++; }, int parity_mask, int flow_maskparity_maskflow_mask)); } Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b09d95917ab842de17bec528fc16255c Text-delta-base-sha1: a2a35eb3ffe3097aaf8267411e7108d12c844f96 Text-content-length: 33 Text-content-md5: c40a5dbf2848bc026c6172700d075a6e Text-content-sha1: 6f15a8a907cee00bb6234712d9d5648e276d11fd Content-length: 33 SVN��r~�m�, 0x1F, 0x0F); } Revision-number: 6821 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2006-08-28T13:08:50.129723Z K 7 svn:log V 40 ... and here's the rest of r6820. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: de3f5215bd8eca32848976be31fdb39b Text-delta-base-sha1: 710bad74d41b8ff05135cb07c49f4062267bb33a Text-content-length: 62 Text-content-md5: 0b69408697fba5200a4b91617007872d Text-content-sha1: 7cc17f84962cf27340c7408940e7386b2e0816af Content-length: 62 SVN��V{ %�q��eq, int parity_mask, int flow_mask Revision-number: 6822 Prop-content-length: 536 Content-length: 536 K 8 svn:date V 27 2006-08-28T14:29:02.934326Z K 7 svn:log V 435 Serial back end for Unix. Due to hardware limitations (no Linux box I own has both an X display and a working serial port) I have been unable to give this the full testing it deserves; I've managed to demonstrate the basic functionality of Unix Plink talking to a serial port, but I haven't been able to test the GTK front end. I have no reason to think it will fail, but I'll be more comfortable once somebody has actually tested it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b614be979c26ae10cf971df8e3c5c290 Text-delta-base-sha1: 3bd4f65d6f882f9eb9f42aa7dc9fec1132c7978e Text-content-length: 317 Text-content-md5: 73b176ad789c1fcab7b9fb54d599daaf Text-content-sha1: 13afce56bc5ebf78cb73eb7d3ff0ed4d88c9f63a Content-length: 317 SVN��( �s��/om�R|�o� �.�TCser# And with the Unix serial-port module. U_BE_ALL = be_all_s uxser cproxy U_BE_NOSSH = be_nos_s uxser nocproxyU_U_BE_NOSSH + uxstore uxsignal CHARSET uxputty NONSSH UXMISC plink : [U] uxplink uxcons NONSSH UXSSH U_BE_ALL logging UXMISC uxsignal +U_ Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eb657abf294a03198d315681685dad0b Text-delta-base-sha1: e9ebfbdbe21e7643465b051a9161340d4a141c35 Text-content-length: 1598 Text-content-md5: f335d761f796f8aaec13dd9faba264a4 Text-content-sha1: f29b0c45154d678b5fed3e743feb210f83097b38 Content-length: 1598 SVN��dL��� y�|z�`8@� �X�mk�eT�~7�3�@�\0��pa�i�&lWidget *label; /* for dlg_label_changevoid shortcut_highlight(GtkWidget *label, int ch switch (uc->ctrl->generic.type) { case CTRL_BUTTON: gtk_label_set_text(GTK_LABEL(uc->toplevel), text); shortcut_highlight(uc->toplevel, ctrl->button.shortcut); break; case CTRL_CHECKBOX: gtk_label_set_text(GTK_LABEL(uc->toplevel), text); shortcut_highlight(uc->toplevel, ctrl->checkbox.shortcut); break; case CTRL_RADIO: gtk_label_set_text(GTK_LABEL(uc->label), text); shortcut_highlight(uc->label, ctrl->radio.shortcut); break; case CTRL_EDITBOX: gtk_label_set_text(GTK_LABEL(uc->label), text); shortcut_highlight(uc->label, ctrl->editbox.shortcut); break; case CTRL_FILESELECT: gtk_label_set_text(GTK_LABEL(uc->label), text); shortcut_highlight(uc->label, ctrl->fileselect.shortcut); break; case CTRL_FONTSELECT: gtk_label_set_text(GTK_LABEL(uc->label), text); shortcut_highlight(uc->label, ctrl->fontselect.shortcut); break; case CTRL_LISTBOX: gtk_label_set_text(GTK_LABEL(uc->label), text); shortcut_highlight(uc->label, ctrl->listbox.shortcut); break; default: assert(!"This shouldn't happen"); break; } uc->label uc->label = label uc->label = label uc->label = ww uc->label = labeldlg_refresh(NULL, sp->dpstatic void shortcut_highlight(GtkWidget *labelw, int chvoid shortcut_add(struct Shortcuts *scs, GtkWidget *labelw, int chr, int action, void *ptr) {shortcut_highlight(labelw, chr); Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fce77469bbc01d06504921b623cf6f69 Text-delta-base-sha1: d1ad821558ab1ababb6a097492ec95bcd462d61d Text-content-length: 212 Text-content-md5: 5726ab74dc056c8326354fb9de46204e Text-content-sha1: 9a9b1c960aceb82e49482760231dbc48cfb97d7f Content-length: 212 SVN����X���=}�iIif (!strcmp(name, "SerialLine")) return dupstr("/dev/ttyS0");cfg_launchable(&inst->cfg)�#qNN�#�ion_get), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_cle Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d2409c2a3a2cc54fe77c93389957aab Text-delta-base-sha1: 277ee158fdc36f9b0123876c09212d3a09b635f8 Text-content-length: 89 Text-content-md5: 07ae0994982f2bf5840198651092ebd7 Text-content-sha1: 193258364a7f7f8f27517e1e50dd7274ceb25768 Content-length: 89 SVN��@H�x�H/* * Exports from winser.c. */ extern Backend serial_backend; #endif Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f24a55e82f457d601b6cba69bd075228 Text-delta-base-sha1: bc6ccc66f7c1a1369537bb5fcc26ff819b25832d Text-content-length: 314 Text-content-md5: 706d116f0a2701e6525ab0a33fcb9e78 Text-content-sha1: 40e6b64d91a7b718a1b9e15397dc28a610c00758 Content-length: 314 SVN��5'��' /* * Serial back end is available on Unix. However, we have to * mask out a couple of the configuration options: mark and * space parity are not conveniently supported, and neither is * DSR/DTR flow control. */ ser_setup_config_box(b, midsession, 0x07, 0x07); } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6c9d6784b8fa697e80f9b7b38cccb7cd Text-delta-base-sha1: 478966b9b259ba3ef1094fd390c54ce695f95500 Text-content-length: 165 Text-content-md5: b8081ae3c4a675c64d573f15c2ede522 Text-content-sha1: 04f8a4f2f8fcbb3c26c36b2f9ace46f13ce48590 Content-length: 165 SVN��[6z�A��#:� f�i�dwif (!strcmp(name, "SerialLine")) return dupstr("/dev/ttyS0"cfg_launchable(&cfg)!cfg_launchable(&cfg2)cfg_launchable(&cfg) Node-path: putty/unix/uxser.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 10600 Text-content-md5: 52efc9efc7d33876b9a38a2135733630 Text-content-sha1: aa1731df59a7b9055515a5261f2eec0e0fddff9a Content-length: 10610 PROPS-END SVN���ZZZ/* * Serial back end (Unix-specific). */ /* * TODO: * * - send break. */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <limits.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> #include "putty.h" #include "tree234.h" #define SERIAL_MAX_BACKLOG 4096 typedef struct serial_backend_data { void *frontend; int fd; int finished; int inbufsize; bufchain output_data; } *Serial; /* * We store our serial backends in a tree sorted by fd, so that * when we get an uxsel notification we know which backend instance * is the owner of the serial port that caused it. */ static int serial_compare_by_fd(void *av, void *bv) { Serial a = (Serial)av; Serial b = (Serial)bv; if (a->fd < b->fd) return -1; else if (a->fd > b->fd) return +1; return 0; } static int serial_find_by_fd(void *av, void *bv) { int a = *(int *)av; Serial b = (Serial)bv; if (a < b->fd) return -1; else if (a > b->fd) return +1; return 0; } static tree234 *serial_by_fd = NULL; static int serial_select_result(int fd, int event); static void serial_uxsel_setup(Serial serial); static void serial_try_write(Serial serial); static const char *serial_configure(Serial serial, Config *cfg) { struct termios options; int bflag, bval; const char *str; char *msg; if (serial->fd < 0) return "Unable to reconfigure already-closed serial connection"; tcgetattr(serial->fd, &options); /* * Find the appropriate baud rate flag. */ #define SETBAUD(x) (bflag = B ## x, bval = x) #define CHECKBAUD(x) do { if (cfg->serspeed >= x) SETBAUD(x); } while (0) SETBAUD(50); #ifdef B75 CHECKBAUD(75); #endif #ifdef B110 CHECKBAUD(110); #endif #ifdef B134 CHECKBAUD(134); #endif #ifdef B150 CHECKBAUD(150); #endif #ifdef B200 CHECKBAUD(200); #endif #ifdef B300 CHECKBAUD(300); #endif #ifdef B600 CHECKBAUD(600); #endif #ifdef B1200 CHECKBAUD(1200); #endif #ifdef B1800 CHECKBAUD(1800); #endif #ifdef B2400 CHECKBAUD(2400); #endif #ifdef B4800 CHECKBAUD(4800); #endif #ifdef B9600 CHECKBAUD(9600); #endif #ifdef B19200 CHECKBAUD(19200); #endif #ifdef B38400 CHECKBAUD(38400); #endif #ifdef B57600 CHECKBAUD(57600); #endif #ifdef B76800 CHECKBAUD(76800); #endif #ifdef B115200 CHECKBAUD(115200); #endif #ifdef B230400 CHECKBAUD(230400); #endif #undef CHECKBAUD #undef SETBAUD cfsetispeed(&options, bflag); cfsetospeed(&options, bflag); msg = dupprintf("Configuring baud rate %d", bval); logevent(serial->frontend, msg); sfree(msg); options.c_cflag &= ~CSIZE; switch (cfg->serdatabits) { case 5: options.c_cflag |= CS5; break; case 6: options.c_cflag |= CS6; break; case 7: options.c_cflag |= CS7; break; case 8: options.c_cflag |= CS8; break; default: return "Invalid number of data bits (need 5, 6, 7 or 8)"; } msg = dupprintf("Configuring %d data bits", cfg->serdatabits); logevent(serial->frontend, msg); sfree(msg); if (cfg->serstopbits >= 4) { options.c_cflag |= CSTOPB; } else { options.c_cflag &= ~CSTOPB; } msg = dupprintf("Configuring %d stop bits", (options.c_cflag & CSTOPB ? 2 : 1)); logevent(serial->frontend, msg); sfree(msg); options.c_cflag &= ~(IXON|IXOFF); if (cfg->serflow == SER_FLOW_XONXOFF) { options.c_cflag |= IXON | IXOFF; str = "XON/XOFF"; } else if (cfg->serflow == SER_FLOW_RTSCTS) { #ifdef CRTSCTS options.c_cflag |= CRTSCTS; #endif #ifdef CNEW_RTSCTS options.c_cflag |= CNEW_RTSCTS; #endif str = "RTS/CTS"; } else str = "no"; msg = dupprintf("Configuring %s flow control", str); logevent(serial->frontend, msg); sfree(msg); /* Parity */ if (cfg->serparity == SER_PAR_ODD) { options.c_cflag |= PARENB; options.c_cflag |= PARODD; str = "odd"; } else if (cfg->serparity == SER_PAR_EVEN) { options.c_cflag |= PARENB; options.c_cflag &= ~PARODD; str = "even"; } else { options.c_cflag &= ~PARENB; str = "no"; } msg = dupprintf("Configuring %s parity", str); logevent(serial->frontend, msg); sfree(msg); options.c_cflag |= CLOCAL | CREAD; options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_oflag &= ~OPOST; options.c_cc[VMIN] = 1; options.c_cc[VTIME] = 0; if (tcsetattr(serial->fd, TCSANOW, &options) < 0) return "Unable to configure serial port"; return NULL; } /* * Called to set up the serial connection. * * Returns an error message, or NULL on success. * * Also places the canonical host name into `realhost'. It must be * freed by the caller. */ static const char *serial_init(void *frontend_handle, void **backend_handle, Config *cfg, char *host, int port, char **realhost, int nodelay, int keepalive) { Serial serial; const char *err; serial = snew(struct serial_backend_data); *backend_handle = serial; serial->frontend = frontend_handle; serial->finished = FALSE; serial->inbufsize = 0; bufchain_init(&serial->output_data); { char *msg = dupprintf("Opening serial device %s", cfg->serline); logevent(serial->frontend, msg); } serial->fd = open(cfg->serline, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); if (serial->fd < 0) return "Unable to open serial port"; err = serial_configure(serial, cfg); if (err) return err; *realhost = dupstr(cfg->serline); if (!serial_by_fd) serial_by_fd = newtree234(serial_compare_by_fd); add234(serial_by_fd, serial); serial_uxsel_setup(serial); return NULL; } static void serial_close(Serial serial) { if (serial->fd >= 0) { close(serial->fd); serial->fd = -1; } } static void serial_free(void *handle) { Serial serial = (Serial) handle; serial_close(serial); bufchain_clear(&serial->output_data); sfree(serial); } static void serial_reconfig(void *handle, Config *cfg) { Serial serial = (Serial) handle; const char *err; err = serial_configure(serial, cfg); /* * FIXME: what should we do if err returns something? */ } static int serial_select_result(int fd, int event) { Serial serial; char buf[4096]; int ret; int finished = FALSE; serial = find234(serial_by_fd, &fd, serial_find_by_fd); if (!serial) return 1; /* spurious event; keep going */ if (event == 1) { ret = read(serial->fd, buf, sizeof(buf)); if (ret == 0) { /* * Shouldn't happen on a real serial port, but I'm open * to the idea that there might be two-way devices we * can treat _like_ serial ports which can return EOF. */ finished = TRUE; } else if (ret < 0) { perror("read serial port"); exit(1); } else if (ret > 0) { serial->inbufsize = from_backend(serial->frontend, 0, buf, ret); serial_uxsel_setup(serial); /* might acquire backlog and freeze */ } } else if (event == 2) { /* * Attempt to send data down the pty. */ serial_try_write(serial); } if (finished) { serial_close(serial); serial->finished = TRUE; notify_remote_exit(serial->frontend); } return !finished; } static void serial_uxsel_setup(Serial serial) { int rwx = 0; if (serial->inbufsize <= SERIAL_MAX_BACKLOG) rwx |= 1; if (bufchain_size(&serial->output_data)) rwx |= 2; /* might also want to write to it */ uxsel_set(serial->fd, rwx, serial_select_result); } static void serial_try_write(Serial serial) { void *data; int len, ret; assert(serial->fd >= 0); while (bufchain_size(&serial->output_data) > 0) { bufchain_prefix(&serial->output_data, &data, &len); ret = write(serial->fd, data, len); if (ret < 0 && (errno == EWOULDBLOCK)) { /* * We've sent all we can for the moment. */ break; } if (ret < 0) { perror("write serial port"); exit(1); } bufchain_consume(&serial->output_data, ret); } serial_uxsel_setup(serial); } /* * Called to send data down the serial connection. */ static int serial_send(void *handle, char *buf, int len) { Serial serial = (Serial) handle; if (serial->fd < 0) return 0; bufchain_add(&serial->output_data, buf, len); serial_try_write(serial); return bufchain_size(&serial->output_data); } /* * Called to query the current sendability status. */ static int serial_sendbuffer(void *handle) { Serial serial = (Serial) handle; return bufchain_size(&serial->output_data); } /* * Called to set the size of the window */ static void serial_size(void *handle, int width, int height) { /* Do nothing! */ return; } /* * Send serial special codes. */ static void serial_special(void *handle, Telnet_Special code) { /* * FIXME: serial break? XON? XOFF? */ return; } /* * Return a list of the special codes that make sense in this * protocol. */ static const struct telnet_special *serial_get_specials(void *handle) { /* * FIXME: serial break? XON? XOFF? */ return NULL; } static int serial_connected(void *handle) { return 1; /* always connected */ } static int serial_sendok(void *handle) { return 1; } static void serial_unthrottle(void *handle, int backlog) { Serial serial = (Serial) handle; serial->inbufsize = backlog; serial_uxsel_setup(serial); } static int serial_ldisc(void *handle, int option) { /* * Local editing and local echo are off by default. */ return 0; } static void serial_provide_ldisc(void *handle, void *ldisc) { /* This is a stub. */ } static void serial_provide_logctx(void *handle, void *logctx) { /* This is a stub. */ } static int serial_exitcode(void *handle) { Serial serial = (Serial) handle; if (serial->fd >= 0) return -1; /* still connected */ else /* Exit codes are a meaningless concept with serial ports */ return INT_MAX; } /* * cfg_info for Serial does nothing at all. */ static int serial_cfg_info(void *handle) { return 0; } Backend serial_backend = { serial_init, serial_free, serial_reconfig, serial_send, serial_sendbuffer, serial_size, serial_special, serial_get_specials, serial_connected, serial_exitcode, serial_sendok, serial_ldisc, serial_provide_ldisc, serial_provide_logctx, serial_unthrottle, serial_cfg_info, 1 }; Revision-number: 6823 Prop-content-length: 529 Content-length: 529 K 8 svn:date V 27 2006-08-28T15:12:37.790935Z K 7 svn:log V 428 New command-line option in Plink (and PuTTY, though it's less useful there): `plink host -nc host2:port' causes the SSH connection's main channel to be replaced with a direct-tcpip connection to the specified destination. This feature is mainly designed for use as a local proxy: setting your local proxy command to `plink %proxyhost -nc %host:%port' lets you tunnel SSH over SSH with a minimum of fuss. Works on all platforms. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f329e648a25472f4e97b75f56f8e6f9a Text-delta-base-sha1: 61ccee6e06aa59205cf8648bedf1a9dffb554c50 Text-content-length: 519 Text-content-md5: 4a3d8241dd8e98ecee58b49d6907c415 Text-content-sha1: d07c90bd3278ab9f873da83d9e1847d75209614b Content-length: 519 SVN��]j�0��O?4�t!(!strcmp(p, "-nc"))) { char *host, *portp; RETURN(2 host = portp = value; while (*portp && *portp != ':') portp++; if (*portp) { unsigned len = portp - host; if (len >= sizeof(cfg->ssh_nc_host)) len = sizeof(cfg->ssh_nc_host) - 1; strncpy(cfg->ssh_nc_host, value, len); cfg->ssh_nc_host[sizeof(cfg->ssh_nc_host) - 1] = '\0'; cfg->ssh_nc_port = atoi(portp+1); } else { cmdline_error("-nc expects argument of form 'host:port'"); return ret; } Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9f364024ab1939bbf2587d88f3819b06 Text-delta-base-sha1: 488f0bcc8a95f4573c977c396efbf0e19359c47e Text-content-length: 551 Text-content-md5: 959dc01bb0afb258a74f64101ab3a7b6 Text-content-sha1: 34f58e11612cacb0a86838484cebf6893909b4ba Content-length: 551 SVN����z�y�z� w If you want your local proxy command to make a secondary SSH connection to a proxy host and then tunnel the primary connection over that, you might well want the \c{-nc} command-line option in Plink. See \k{using-cmdline-ncmode} for more information�XT||�X� server complains. If you know your server can cope with it, you can enable the \q{Allow attempted changes of username} option to modify PuTTY's behaviour. \S{config-ssh-privkey} \q{\ii{Private key} file for authentication} \cfg{winhelp-topic}{ssh.au Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 26104577bf896aac4d7c57f17064470c Text-delta-base-sha1: a0a45b35b3408cf9c40bb725508a97b7b5de93a0 Text-content-length: 1909 Text-content-md5: 18d67da944256ca5754228cc78c0fefa Text-content-sha1: 3d2327fa41866eb4813b227ac17691833170e444 Content-length: 1909 SVN��I5P�(�e� k�5ncmode} \I{-nc}\c{-nc}: make a \i{remote network connection} in place of a remote shell or command The \c{-nc} option prevents Plink (or PuTTY) from attempting to start a shell or command on the remote server. Instead, it will instruct the remote server to open a network connection to a host name and port number specified by you, and treat that network connection as if it were the main session. You specify a host and port as an argument to the \c{-nc} option, with a colon separating the host name from the port number, like this: \c plink host1.example.com -nc host2.example.com:1234 You might want to use this feature if you needed to make an SSH connection to a target host which you can only reach by going through a proxy host, and rather than using port forwarding you prefer to use the local proxy feature (see \k{config-proxy-type} for more about local proxies). In this situation you might select \q{Local} proxy type, set your local proxy command to be \cq{plink %proxyhost -nc %host:%port}, enter the target host name on the Session panel, and enter the directly reachable proxy host name on the Proxy pane It is not available in the file transfer tools PSCP and PSFTP. It is available in PuTTY itself, although it is unlikely to be very useful in any tool other than Plink. Also, \c{-nc} uses the same server functionality as port forwarding, so it will not work if your server administrator has disabled port forwarding. (The option is named \c{-nc} after the Unix program \W{http://www.vulnwatch.org/netcat/}\c{nc}, short for \q{netcat}. The command \cq{plink host1 -nc host2:port} is very similar in functionality to \cq{plink host1 nc host2 port}, which invokes \c{nc} on the server and tells it to connect to the specified destination. However, Plink's built-in \c{-nc} option does not depend on the \c{nc} program being installed on the server.) Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b69408697fba5200a4b91617007872d Text-delta-base-sha1: 7cc17f84962cf27340c7408940e7386b2e0816af Text-content-length: 158 Text-content-md5: 8478de948ea7e95a28d045dde63a2c70 Text-content-sha1: 1cd77eb46b8b8af255128fbfa135a99373c341b8 Content-length: 158 SVN��{ ���ichar ssh_nc_host[512]; /* host to connect to in `nc' mode */ int ssh_nc_port; /* port to connect to in `nc' mode Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e0459485741fb94187d410eab9cb1ef3 Text-delta-base-sha1: 46fba4821b8479bebf42e58e434e41588fb16e46 Text-content-length: 910 Text-content-md5: 7586f4babeac0d26cbb27bd656a5dd8a Text-content-sha1: 313cd0e10938b92d3a8d07be73a807663346be21 Content-length: 910 SVN���� 4�l��``ncmode; /* is primary channel direct-tcpip?���@@�@�ssh->send_ok = 0; } if (!ret) { /* Failed to get �<`@�7�*�KP�s"~�(Z�yK�KK�N�8�}9�A2�!i�S�7Y"Further authentication required\r\n"); logevent("Further ssh->cfg.ssh_no_shell) { ssh->mainchan = NULL; } else if (*ssh->cfg.ssh_nc_host) { /* * Just start a direct-tcpip channel and use it as the main * channel. */direct-tcpip /* our max pkt size */ ssh2_pkt_addstring(s->pktout, ssh->cfg.ssh_nc_host); ssh2_pkt_adduint32(s->pktout, ssh->cfg.ssh_nc_s->pktout, "0.0.0.0"); ssh2_pkt_adduint32(s->pktout, 0); ssh2_pkt_send(ssh, s->pktout); direct-tcpip channeldirect-tcpip channel in place of session"); ssh->ncmode = TRUE; } else ssh->ncmode = FALSE; }!ssh->ncmode!ssh->ncmodencmode!ssh->ncmode && !ssh->ncmode Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b8081ae3c4a675c64d573f15c2ede522 Text-delta-base-sha1: 04f8a4f2f8fcbb3c26c36b2f9ace46f13ce48590 Text-content-length: 46 Text-content-md5: bc93e6890fd5aeb894ffea13643f1f73 Text-content-sha1: 60c166c9b837990f604f5bed4c6f5fab5463c7b6 Content-length: 46 SVN��6K �P��fP && !*cfg.ssh_nc_host Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 342301630f1ed124a7f0f3192cf98176 Text-delta-base-sha1: 9d0a3ba92a4831ba3aaae4299a99214292439fe4 Text-content-length: 44 Text-content-md5: aa2c6f97eb9c26bdc8d11ab3dbe7e7d8 Text-content-sha1: 799a680d84a35567953ec0607b3369e6b6e21080 Content-length: 44 SVN��(= �d��Dd && !*cfg.ssh_nc_host Revision-number: 6824 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2006-08-28T17:41:02.189516Z K 7 svn:log V 50 Missed a couple of instances of cfg_launchable(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 427ffd322897e549be1d8fd0c0d29659 Text-delta-base-sha1: 82abb4e16798a4fef2581bbf8d5123642d408965 Text-content-length: 109 Text-content-md5: ede644d6ce4e5322290a96589e572304 Text-content-sha1: dbc2aac7de4e9b74593f9da5ad4b11d31274080e Content-length: 109 SVN����(�f��-o�E%cfg_launchable(&cfg)cfg_launchable(&cfg)�\r�\� case VK_DECIMAL: Revision-number: 6825 Prop-content-length: 185 Content-length: 185 K 7 svn:log V 85 Minor tweaks to -nc: - log host:port in event log - add -nc to Plink usage message K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-08-28T17:47:43.981287Z PROPS-END Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 21ed57b375b6a90fcf777f476908682a Text-delta-base-sha1: ed7cdfd3060ed92b1c7d47439e66ff11371002a2 Text-content-length: 87 Text-content-md5: 969d197dfc07b5bfdd5aeb2730d4f8ee Text-content-sha1: 2850bb6aa307758fd442b14228f81019c444a466 Content-length: 87 SVN��m< A�T�A�'F\c -nc host:port \c open tunnel in place of session Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7586f4babeac0d26cbb27bd656a5dd8a Text-delta-base-sha1: 313cd0e10938b92d3a8d07be73a807663346be21 Text-content-length: 329 Text-content-md5: bcd5f9ec59f70de151fccda1b66d5046 Text-content-sha1: 828ecdc8a84f630ada6c5af2cc19fc5d58f2034c Content-length: 329 SVN����������������<A~��~�b��a�/ logeventf(ssh, "Opening direct-tcpip channel to %s:%d in place of session", ssh->cfg.ssh_nc_host, ssh->cfg.ssh_nc_portThere's nothing meaningful to put in the originator * fields, but some servers insist on syntactically correct * information Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc93e6890fd5aeb894ffea13643f1f73 Text-delta-base-sha1: 60c166c9b837990f604f5bed4c6f5fab5463c7b6 Text-content-length: 108 Text-content-md5: 13360ebc2d1d1a9c4b4b90ae436e8d56 Text-content-sha1: 7c708e1ed1c44285d072830bdc6806d83f0e9066 Content-length: 108 SVN��K6 T�A�T�!*printf(" -nc host:port\n"); printf(" open tunnel in place of session Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aa2c6f97eb9c26bdc8d11ab3dbe7e7d8 Text-delta-base-sha1: 799a680d84a35567953ec0607b3369e6b6e21080 Text-content-length: 108 Text-content-md5: a7fc3696a7f1c7a47cab8a5b9cfefdf8 Text-content-sha1: 7b4f8e865c85e864df6b5c352f7131374a2c1ba0 Content-length: 108 SVN��=( T�0�T�$printf(" -nc host:port\n"); printf(" open tunnel in place of session Revision-number: 6826 Prop-content-length: 291 Content-length: 291 K 8 svn:date V 27 2006-08-28T18:16:49.381180Z K 7 svn:log V 190 Apparently it helps for an OVERLAPPED structure to contain a valid event handle. This seems to have fixed _some_, but not all, of the curious data loss issues in the Windows serial backend. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c3ac29c07e31bae618e14ead2dbac861 Text-delta-base-sha1: 514cf4644b9e776fdc0954d993bc1b151f24d907 Text-content-length: 449 Text-content-md5: f3959b1d25b36fcd3ba7d809c3e248a8 Text-content-sha1: 6509d2ad323e207490bfba989b241c32528c52fa Content-length: 449 SVN��B�9��Q��N4�F| HANDLE oev; if (ctx->flags & HANDLE_FLAG_OVERLAPPED) { povl = &ovl; oev = CreateEvent(NULL, TRUE, FALSE, NULL); } else { povl = NULL; } while (1) { if (povl) { memset(povl, 0, sizeof(OVERLAPPED)); povl->hEvent = oev; } { WaitForSingleObject(povl->hEvent, INFINITE); ctx->readret = GetOverlappedResult(ctx->h, povl, &ctx->len, FALSE); }if (povl) CloseHandle(oev); Revision-number: 6827 Prop-content-length: 617 Content-length: 617 K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-28T18:26:50.411108Z K 7 svn:log V 516 Reading 4K at a time from a serial port turns out to be a bit unfriendly in an interactive session, because at 19200 baud it takes nearly two seconds to receive that much data, and as long as the data is flowing continuously Windows waits until it has a full buffer. So here's another annoying flag in the winhandl API, which restricts reads to length 1 so that serial output shows up as it appears. (I tried this yesterday, but without the OVERLAPPED fix in r6826 it behaved very erratically. It now seems solid.) PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f3959b1d25b36fcd3ba7d809c3e248a8 Text-delta-base-sha1: 6509d2ad323e207490bfba989b241c32528c52fa Text-content-length: 151 Text-content-md5: 34fe40671829f8228921b8ea0474fa2c Text-content-sha1: b410fe5a3b1b143b225f75a73bd6f298912dca2f Content-length: 151 SVN��mu�I��G_�T� z int readlenif (ctx->flags & HANDLE_FLAG_UNITBUFFER) readlen = 1; else readlen = sizeof(ctx->buffer);readlen Node-path: putty/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 64fbca157d29703ded09b2094a8eb175 Text-delta-base-sha1: 30017cc966428d9905c386ea6937f51c4fac4bcb Text-content-length: 52 Text-content-md5: 99682a4d2753b9d91f3a9857c2f59137 Text-content-sha1: 4b527d086ea6656d9449fc8895ba384cf7b4f011 Content-length: 52 SVN��On �<��< | HANDLE_FLAG_UNITBUFFER Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3fe4cb8f5b76188b2a6de30e2345db5c Text-delta-base-sha1: 4946b1c0946f65ca800ef585525910245b24ac47 Text-content-length: 53 Text-content-md5: b35ab9fc8150a5beafd2e5fc0ad55598 Text-content-sha1: 5418c656b5a23e9a9ae1686b710b9a18afa03116 Content-length: 53 SVN��8Y ���5#define HANDLE_FLAG_UNITBUFFER 3 Revision-number: 6828 Prop-content-length: 259 Content-length: 259 K 8 svn:date V 27 2006-08-28T18:27:54.533895Z K 7 svn:log V 158 Eep! Next bit flag after 1 and 2 is _4_, not 3. Perhaps it's time I stopped coding and went and sat down quietly and tried not to touch anything for a while. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b35ab9fc8150a5beafd2e5fc0ad55598 Text-delta-base-sha1: 5418c656b5a23e9a9ae1686b710b9a18afa03116 Text-content-length: 22 Text-content-md5: df0dd31347648f788f3064eb3a63540a Text-content-sha1: c8effa52538307b4098861d0b6af90e31aa7c8e0 Content-length: 22 SVN��YY �#��5$4 Revision-number: 6829 Prop-content-length: 418 Content-length: 418 K 8 svn:date V 27 2006-08-28T18:36:11.812807Z K 7 svn:log V 317 That OVERLAPPED fix seems to have made flow control useful as well (presumably Windows's serial buffer is actually _filling up_, causing an XOFF to be sent, now that my dodgy I/O code isn't causing it to leak). So I think I'll switch the default flow control to XON/XOFF, since it actually seems to do something now. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 755557f7ed00237476ad3b1bb63d0d2a Text-delta-base-sha1: 273427e1ace6aadf4ad4e3a212b6e0916154373f Text-content-length: 113 Text-content-md5: 29fd6b46119545a11390b53c317aed18 Text-content-sha1: 3081b370cdc591c55bd8d4581633dc17108eebd4 Content-length: 113 SVN��Hb W�?�W�L|SER_PAR_NONE, &cfg->serparity); gppi(sesskey, "SerialFlowControl", SER_FLOW_XONXOFF Revision-number: 6830 Prop-content-length: 402 Content-length: 402 K 8 svn:date V 27 2006-08-28T19:09:28.494123Z K 7 svn:log V 301 Apparently MsgWaitForMultipleObjects doesn't always return the values one might expect, which means that GetMessage() was occasionally blocking the process. That appears to be the last of the annoying data loss issues, so I think the Windows serial back end actually looks vaguely reliable now. Phew. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ede644d6ce4e5322290a96589e572304 Text-delta-base-sha1: dbc2aac7de4e9b74593f9da5ad4b11d31274080e Text-content-length: 153 Text-content-md5: 1cceae7051477eda2d1c7accd3ef0d05 Text-content-sha1: 60b8b558d2f2837a7cf9d9e43ecdcc6c700f0f58 Content-length: 153 SVN����h�U��W �lwhile (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) case VK_DECIMAL: xkey = 'n'; break; �r:��:8 Revision-number: 6831 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2006-08-29T09:18:09.301550Z K 7 svn:log V 186 Inhibit the Serial configuration panel in mid-session if the session isn't a serial one. In particular, this causes pterm not to fail an assertion if you select `Change Settings'. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f335d761f796f8aaec13dd9faba264a4 Text-delta-base-sha1: f29b0c45154d678b5fed3e743feb210f83097b38 Text-content-length: 41 Text-content-md5: ed7d0b666bf536fb824b7d870942f9cb Text-content-sha1: 4486eab29fd4592866b169ca6f6d0ceeeaf4530c Content-length: 41 SVN�� �c��c, cfg->protocol Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 07ae0994982f2bf5840198651092ebd7 Text-delta-base-sha1: 193258364a7f7f8f27517e1e50dd7274ceb25768 Text-content-length: 35 Text-content-md5: f1c4ce6a1bd0db7c75ca82bb90fe1799 Text-content-sha1: 280538206e15df2aaf615f15387e551e24a60c76 Content-length: 35 SVN��@N �W��iW, int protocol Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 706d116f0a2701e6525ab0a33fcb9e78 Text-delta-base-sha1: 40e6b64d91a7b718a1b9e15397dc28a610c00758 Text-content-length: 89 Text-content-md5: fb244ae95c6869cff5813f94fd6ca081 Text-content-sha1: c6202224510227b609ffa6270ef55ca801efa3cb Content-length: 89 SVN��5y@�u�� u7~, int protocolif (!midsession || (protocol == PROT_SERIAL)) Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c40a5dbf2848bc026c6172700d075a6e Text-delta-base-sha1: 6f15a8a907cee00bb6234712d9d5648e276d11fd Text-content-length: 142 Text-content-md5: 5feceab5c82fb12b64b754520c69dce2 Text-content-sha1: c8e56e598a10f9090ee73b3d76b2d6afd6c5a096 Content-length: 142 SVN��~B w�0��0i, int protocolif (!midsession || (protocol == PROT_SERIAL)) ser_setup_config_box(b, midsession, 0x1F, 0x0F); } Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 51fd0cbda144ae2a38fc3bee00555c75 Text-delta-base-sha1: 630c1ebeffcc3b8c6ec24453a2a178785cef3d49 Text-content-length: 86 Text-content-md5: 9b66034de08ed6fb756ce08879642a7c Text-content-sha1: 2f40c06d4bc2e273b19f795a680f320124a46cd3 Content-length: 86 SVN��p+���;{�.9� r�u{, 0C, cfg.protocol Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df0dd31347648f788f3064eb3a63540a Text-delta-base-sha1: c8effa52538307b4098861d0b6af90e31aa7c8e0 Text-content-length: 35 Text-content-md5: 0b7b984ed15b47ec1b3a39b5101257ef Text-content-sha1: d0495b7aaf36f312dd83732195e7d9e9b6869e3f Content-length: 35 SVN��Yg �m��lm, int protocol Revision-number: 6832 Prop-content-length: 181 Content-length: 181 K 7 svn:log V 81 Support for sending serial breaks, in both the Windows and Unix serial backends. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-29T18:20:57.505337Z PROPS-END Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 52efc9efc7d33876b9a38a2135733630 Text-delta-base-sha1: aa1731df59a7b9055515a5261f2eec0e0fddff9a Text-content-length: 466 Text-content-md5: 0d0baa618aac791b57c061608f9f2671 Text-content-sha1: e2a8a7c34bbf3b4a8bf3eecfe6bccfa93440c97b Content-length: 466 SVN��ZO+�PLZ�27�.wu�tf/* * Serial back end (Unix-specific)/* * Specials are always available. */ update_specials_menu(serial->frontendSerial serial = (Serial) handle; if (serial->fd >= 0 && code == TS_BRK) { tcsendbreak(serial->fd, 0); logevent(serial->frontend, "Sending serial break at user request"); } static const struct telnet_special specials[] = { {"Break", TS_BRK}, {NULL, TS_EXITMENU} }; return specials Node-path: putty/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99682a4d2753b9d91f3a9857c2f59137 Text-delta-base-sha1: 4b527d086ea6656d9449fc8895ba384cf7b4f011 Text-content-length: 1456 Text-content-md5: 21693dd2dcd48191d628a1b175dd7ade Text-content-sha1: 9af6d16a1843583f24eb720079b583ca73d88384 Content-length: 1456 SVN��nP<h�o8�l%A�]�$fZ��t| �ml;�. u�uy/* * Serial back end (Windows-specific). long clearbreak_time; int break_in_progressif (serial->break_in_progress) ClearCommBreak(serial->port);serial->break_in_progress = FALSE/* * Specials are always available. */ update_specials_menu(serial->frontendexpire_timer_contextstatic void serbreak_timer(void *ctx, long now) { Serial serial = (Serial)ctx; if (now >= serial->clearbreak_time && serial->port) { ClearCommBreak(serial->port); serial->break_in_progress = FALSE; logevent(serial->frontend, "Finished serial break"); }Serial serial = (Serial) handle; if (serial->port && code == TS_BRK) { logevent(serial->frontend, "Starting serial break at user request"); SetCommBreak(serial->port); /* * To send a serial break on Windows, we call SetCommBreak * to begin the break, then wait a bit, and then call * ClearCommBreak to finish it. Hence, I must use timing.c * to arrange a callback when it's time to do the latter. * * SUS says that a default break length must be between 1/4 * and 1/2 second. FreeBSD apparently goes with 2/5 second, * and so will I. */ serial->clearbreak_time = schedule_timer(TICKSPERSEC * 2 / 5, serbreak_timer, serial); serial->break_in_progress = TRUE; } static const struct telnet_special specials[] = { {"Break", TS_BRK}, {NULL, TS_EXITMENU} }; return specials Revision-number: 6833 Prop-content-length: 592 Content-length: 592 K 7 svn:log V 491 The Windows HANDLE type, despite being a `void *', does not actually behave like a pointer. In particular, the right thing to set a HANDLE to to indicate that it's invalid is INVALID_HANDLE_VALUE, not NULL. Crack down on sloppy use of NULL HANDLEs across all Windows code. (There is one oddity, which is that {Create,Open}FileMapping are documented to return a NULL HANDLE instead of INVALID_HANDLE_VALUE on failure. Shrug. If MS want to be inconsistent, I suppose I have to live with it.) K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-29T18:32:44.620180Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1cceae7051477eda2d1c7accd3ef0d05 Text-delta-base-sha1: 60b8b558d2f2837a7cf9d9e43ecdcc6c700f0f58 Text-content-length: 221 Text-content-md5: 9f7b3fde762bda0d7227e9337c11664b Text-content-sha1: c9dfd5a63d5febafb464ed04ac8a20efc96a6d3d Content-length: 221 SVN���� �4� �AINVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, sizeof(Config), NULL); if (filemap && filemap != INVALID_HANDLE_VALUE�:^$�:� xkey = 'n'; break; Node-path: putty/windows/winpgntc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 79317577e31037a8e947f428b420e6d9 Text-delta-base-sha1: 9a93acb16d101d5ccc7635314812890520ddbfd3 Text-content-length: 71 Text-content-md5: dce558c87f70a31c809a4025d63bee97 Text-content-sha1: 6dd48d5faeac5ee885d65d2c26f336dd52f0bb07 Content-length: 71 SVN��x" 2�P�� Xfilemap == NULL || filemap == INVALID_HANDLE_VALUE Node-path: putty/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 21693dd2dcd48191d628a1b175dd7ade Text-delta-base-sha1: 9af6d16a1843583f24eb720079b583ca73d88384 Text-content-length: 122 Text-content-md5: 0179ba9211771513327d6b27e872ecda Text-content-sha1: c2325cc6d64be4e75843de9bc8dc60a29d16ef1c Content-length: 122 SVN��PT�2��s2�d)�2� G != INVALID_HANDLE_VALUEINVALID_HANDLE_VALUEINVALID_HANDLE_VALUEINVALID_HANDLE_VALUE Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1bd9653a8778c183ae1806ef0e5a7a97 Text-delta-base-sha1: 5e8baa0b5035eae88339f3561909e2a07591316b Text-content-length: 126 Text-content-md5: c3ae4ae47458efefd2078511cef106c1 Text-content-sha1: 4a5b249b4d00dd16c348edacf418a7792b76c943 Content-length: 126 SVN��[+X�j��n�]v�VS�.-INVALID_HANDLE_VALUE != INVALID_HANDLE_VALUE != INVALID_HANDLE_VALUEINVALID_HANDLE_VALUE Revision-number: 6834 Prop-content-length: 292 Content-length: 292 K 7 svn:log V 191 Explicitly closing logctx on various kinds of error exit means that the log file gets fclosed properly and the critical last few messages might be recoverable from the log file more often... K 10 svn:author V 5 simon K 8 svn:date V 27 2006-08-29T18:50:07.292366Z PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 13360ebc2d1d1a9c4b4b90ae436e8d56 Text-delta-base-sha1: 7c708e1ed1c44285d072830bdc6806d83f0e9066 Text-content-length: 269 Text-content-md5: 4f58b7ed387ede67b38e7b3f78087359 Text-content-sha1: e65bdc3f39fd2389a0119ba11e1e5a29d7b74e05 Content-length: 269 SVN��6$[���.^D�P<D�cD� e�=y*logctx; void if (logctx) { log_free(logctx); logctx = NULL; }if (logctx) { log_free(logctx); logctx = NULL; }if (logctx) { log_free(logctx); logctx = NULL; } Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a7fc3696a7f1c7a47cab8a5b9cfefdf8 Text-delta-base-sha1: 7b4f8e865c85e864df6b5c352f7131374a2c1ba0 Text-content-length: 244 Text-content-md5: 447839cf0857255ead2ec7127fe2c50c Text-content-sha1: 0e9ec62f96e7c63208e2dfebe24b629b7085a650 Content-length: 244 SVN��(L�p�D�PkD�c6D�if (logctx) { log_free(logctx); logctx = NULL; }if (logctx) { log_free(logctx); logctx = NULL; }if (logctx) { log_free(logctx); logctx = NULL; } Revision-number: 6835 Prop-content-length: 1142 Content-length: 1142 K 8 svn:date V 27 2006-08-29T19:07:11.944850Z K 7 svn:log V 1040 New logging mode, which records the exact bytes sent over the wire in an SSH connection _in addition_ to the decrypted packets. This will hopefully come in useful for debugging wire data corruption issues: you can strace the server, enable this mode in the client, and compare the sent and received data. I'd _like_ to have this mode also log Diffie-Hellman private exponents, session IDs, encryption and MAC keys, so that the resulting log file could be used to independently verify the correctness of all cryptographic operations performed by PuTTY. However, I haven't been able to convince myself that the security implications are acceptable. (It doesn't matter that this information would permit an attacker to decrypt the session, because the _already_ decrypted session is stored alongside it in the log file. And I'm not planning, under any circumstances, to log users' private keys. But gaining access to the log file while the session was still running would permit an attacker to _hijack_ the session, and that's the iffy bit.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a486ce5052477c8d6a97396a454b5d42 Text-delta-base-sha1: a4203f3216ebbb27e430c944b7df06400992eb9b Text-content-length: 655 Text-content-md5: fddfcc35de0eddf491638e113bdf072b Text-content-sha1: 30d303190ad5b9d7d9f06da7d9097e1f2b73fdf9 Content-length: 655 SVN��Ywj�`�"�dhH�I, *sshrawlogname; if ((midsession && protocol == PROT_SSH) || (!midsession && backends[3].name != NULL)) { sshlogname = "SSH packets"; sshrawlogname = "SSH packets and raw data"; } else { sshlogname = NULL; /* this will disable both buttons */ sshrawlogname = NULL; /* this will just placate optimisers */ } ctrl_radiobuttons(s, "Session logging:", NO_SHORTCUT, 2None", 't', I(LGTYP_NONE), "Printable output", 'p', I(LGTYP_ASCII), "All session output", 'l', I(LGTYP_DEBUG), sshlogname, 's', I(LGTYP_PACKETS), sshrawlogname, 'r', I(LGTYP_SSHRAW Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 68843bc17c1c68012c4ddc0601649a1c Text-delta-base-sha1: 503655afb53ca985335f9c4185b6e65c9fa13af5 Text-content-length: 642 Text-content-md5: 9a734b8b840f5a4cad33006771eb9983 Text-content-sha1: cddef9b4e392327076ef11e4e4228278281e381b Content-length: 642 SVN��4]�I��n<p�cb=�ctx->cfg.logtype == LGTYP_SSHRAW ? "SSH raw data && ctx->cfg.logtype != LGTYP_SSHRAW) return; logprintf(ctx, "Event Log: %s\r\n", event); logflush(ctx!(ctx->cfg.logtype == LGTYP_SSHRAW || (ctx->cfg.logtype == LGTYP_PACKETS && texttype))) return; /* Packet header. */ if (texttype) logprintf(ctx, "%s packet type %d / 0x%02x (%s)\r\n", direction == PKT_INCOMING ? "Incoming" : "Outgoing", type, type, texttype); else logprintf(ctx, "%s raw data\r\n", direction == PKT_INCOMING ? "Incoming" : "Outgoing" Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8478de948ea7e95a28d045dde63a2c70 Text-delta-base-sha1: 1cd77eb46b8b8af255128fbfa135a99373c341b8 Text-content-length: 79 Text-content-md5: 99706ac5fdacc0b9d81b43dfe24c2249 Text-content-sha1: bba3299458bd161ae7fe4cee889203114fcdb883 Content-length: 79 SVN��A 7�3��W/#define LGTYP_SSHRAW 4 /* logmode: SSH raw data Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bcd5f9ec59f70de151fccda1b66d5046 Text-delta-base-sha1: 828ecdc8a84f630ada6c5af2cc19fc5d58f2034c Text-content-length: 1073 Text-content-md5: d9c710e0ade101dff0fea2cab0f7be5a Text-content-sha1: 29b7b2563a9c2bc14e7a6be3b232af6fdf4dca94 Content-length: 1073 SVN����K"�1�$�&�Iy�S1�iy�'y�hM�`n�|\�`Sx�K.int s_write(Ssh ssh, void *data, int len) { log_packet(ssh->logctx, PKT_OUTGOING, -1, NULL, data, len, 0, NULL); return sk_write(ssh->s, (char *)data, len);_write(ssh, pkt->data + offset, len)_write(ssh, pkt->data, len)pkt->encrypted_len_write(ssh, ssh->deferred_send_data,_write(ssh; /* Log raw data, if we're in that mode. */ log_packet(ssh->logctx, PKT_INCOMING, -1, NULL, data, datalen, 0, NULL); ����y�100s\": ", s->publickey_comment), FALSE, SSH_MAX_PASSWORD_LEN); ret = get_userpass_input(s->cur_prompt, NULL, 0); while (ret < 0) { ssh->send_ok = 1; crWaitUntil(!pktin); ret = get_userpass_input(s->cur_prompt, in, inlen); �AH�A�denied"); if (s->type == AUTH_TYPE_PASSWORD && ssh->cfg.change_username) { /* XXX perhaps we should allow * keyboard-interactive to do this too? */ s->we_are_in = FALSE; break; } } } else { c_write_str(ssh, Revision-number: 6836 Prop-content-length: 387 Content-length: 387 K 8 svn:date V 27 2006-08-29T21:46:56.520541Z K 7 svn:log V 286 Updates for today's changes: - changes to Logging panel - breaks in serial backend (Plus, completely unrelated, an index term entry related to port forwarding which seems to have been sitting around for ages, possibly waiting for me to think about `see also' index terms in Halibut.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 959dc01bb0afb258a74f64101ab3a7b6 Text-delta-base-sha1: 34f58e11612cacb0a86838484cebf6893909b4ba Text-content-length: 2031 Text-content-md5: acc5e8ed1b03b60aade7cc8af9530e72 Text-content-sha1: e0ba7240f0ee82e0d243a061c96e40e17b33e4ba Content-length: 2031 SVN����0�7�y�lQ�ZBJ�d`!�^f�HXD�jZ: \b \q{None}. This is the default option; in this mode PuTTY will not create a log file at all. \b \q{Printable outputAI{SSH packet log}\q{SSH packets}. In this mode (which is only used by SSH (as well as \i{Event Log} entries). You might need this to debug a network-level problem, or more likely to send to the PuTTY authors as part of a bug report. \e{BE WARNED} that if you log in using a password, the password can appear in the log file; see \k{config-logssh} for options that may help to remove sensitive material from the log file before you send it to anyone else. \b \q{SSH packets and raw data}. In this mode, as well as the decrypted packets (as in the previous mode), the \e{raw} (encrypted, compressed, etc) packets are \e{also} logged. This could be useful to diagnose corruption in transit. (The same caveats as the previous mode apply, of course.)decrypted password fields are removed from the log of transmitted packets. (This includes any user responses to challenge-response authentication methods such as \q{keyboard-interactive}.) This does not include X11 authentication decrypted \q{session data} is omitted; this is defined as data in terminal sessions and in forwarded channels (TCP, X11, and authentication agent). This will usually substantially reduce the size �T9<��K�!3u have sent one username, it will reject attempts to try to authenticate as another user. (Depending on the version of OpenSSH, it may quietly return failure for all login attempts, or it may send an error message.) For this reason, PuTTY will by default not prompt you for your username more than once, in case the\I{port forwarding, changing mid-session}modify the currently active set of port forwardings in mid-session using \q{Change Settings} (see \k{using-changesettings}). If you delete a local or dynamic port forwarding in mid-session, PuTTY will stop listening for connections on that port, so it can be re-used by another program. If Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 824f8a294766c6cd90037d0478a3a30f Text-delta-base-sha1: 401508154162efdcb2de99a4732ad7b32a8c9281 Text-content-length: 504 Text-content-md5: b3365de595a4f8faa37aead287fe29f5 Text-content-sha1: c5759477d3e5fac05ed56ba367041ec7a5974bc9 Content-length: 504 SVN��6YX��'�t �{;port forwarding, changing mid-session} port forwarding in SSH, changing mid-session \IM{port forwarding, changing mid-session} SSH port forwarding, changing mid-session \IM{port forwarding, changing mid-session} forwarding ports in SSH, changing mid-session \IM{port forwarding, changing mid-session} tunnelling using SSH, changing mid-session \IM{port forwarding, changing mid-session} SSH tunnelling, changing mid-sessionSSH packet log} SSH packet log \IM{SSH packet log Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18d67da944256ca5754228cc78c0fefa Text-delta-base-sha1: 3d2327fa41866eb4813b227ac17691833170e444 Text-content-length: 190 Text-content-md5: bad5255cf2c9357fe00ea21c3bcf943e Text-content-sha1: 99c02478780b1902943920ed4a8078d44d51e497 Content-length: 190 SVN��53���(�9k�v?q{break} signal, SSH, and serial connections With a serial connection, the only available special command is \I{Break, serial special command}\q{Break}. Revision-number: 6837 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 35 Darn, this isn't completely fixed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-09-02T22:10:47.490073Z PROPS-END Node-path: putty-wishlist/data/win-askappend-multi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 743f4584b6266dbafe0afe955979c4a4 Text-delta-base-sha1: db202f8830f1f3d887531d33428c1284bf8e0b5d Text-content-length: 283 Text-content-md5: 188ccbfebdcfe08de3bde07449aa1e11 Text-content-sha1: 78abeaee68765de4eb521ba8288649473977044f Content-length: 283 SVN��hn �i�Summary: Logging dialog box duplicated, and can cause session to hang Present-in: 0.58 2006-09-02 Class: bug Content-type: text/plain The double dialog box was fixed in 2006-01-26, but the session hang remains. (It's particularly evident with Telnet sessions.) Revision-number: 6838 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2006-09-02T22:11:40.921464Z K 7 svn:log V 37 Add another version I've seen it in. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-askappend-multi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 188ccbfebdcfe08de3bde07449aa1e11 Text-delta-base-sha1: 78abeaee68765de4eb521ba8288649473977044f Text-content-length: 23 Text-content-md5: f9cbc6534de127e703f08cb6f655a88d Text-content-sha1: cb282e0d5f8f349377b5f93333ebb4e66d771c5e Content-length: 23 SVN��ny�]��V2-01 Revision-number: 6839 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2006-09-02T23:27:59.481940Z K 7 svn:log V 84 `window-title-charset' and `title-charset' are the same bug; merge (to the former). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/window-title-charset Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f4320a78752aa62a64f15c5568e81e0e Text-delta-base-sha1: d7129a36b2fe40feb7e0f495cefe141db04095ca Text-content-length: 508 Text-content-md5: a3f5e309c24b942a362325abdcf73121 Text-content-sha1: f16ab137ca1513846a202c24b0e55074c370252f Content-length: 508 SVN��`�K�s�km�bug Priority: medium Difficulty: fun Content-type: text/x-html-body <p> If an escape sequence (e.g. <tt>OSC 0</tt> <p> For instance, when charset is set to UTF-8 from PuTTY and locales on the remote computer are en_US.UTF-8, unicode characters are shown as they vere latin chars. <p> Also reported to Ubuntu as <a href="https://launchpad.net/distros/ubuntu/+source/putty/+bug/48781">bug 48781</a>, where it's suggested that <a href="port-unix-gtk2.html">using GTK2</a> will help Node-path: putty-wishlist/data/title-charset Node-action: delete Revision-number: 6840 Prop-content-length: 154 Content-length: 154 K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-09-03T10:38:50.122669Z K 7 svn:log V 54 Narrowed down when this appeared to a couple of days. PROPS-END Node-path: putty-wishlist/data/win-askappend-multi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f9cbc6534de127e703f08cb6f655a88d Text-delta-base-sha1: cb282e0d5f8f349377b5f93333ebb4e66d771c5e Text-content-length: 68 Text-content-md5: 4f9edfb73a9be67fb29bb5a72d9d1f77 Text-content-sha1: 932e3fbba42e29b174536a40f9c3bbb0cb577a2e Content-length: 68 SVN��y1�F��(QAbsent-in: 0.57 2005-02-18 Present-in: 2005-02-21 Revision-number: 6841 Prop-content-length: 120 Content-length: 120 K 7 svn:log V 20 Add change numbers. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-09-03T10:40:34.669105Z PROPS-END Node-path: putty-wishlist/data/win-askappend-multi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f9edfb73a9be67fb29bb5a72d9d1f77 Text-delta-base-sha1: 932e3fbba42e29b174536a40f9c3bbb0cb577a2e Text-content-length: 43 Text-content-md5: 799fc50c85d68630e47eb19369283e39 Text-content-sha1: c39794bdcf737a095eec3830b553abff640e20fb Content-length: 43 SVN��+�`��3l r5338 Present-in: r5371 Revision-number: 6842 Prop-content-length: 138 Content-length: 138 K 7 svn:log V 38 Narrowed it down to a single checkin. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-09-03T11:22:45.727453Z PROPS-END Node-path: putty-wishlist/data/win-askappend-multi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 799fc50c85d68630e47eb19369283e39 Text-delta-base-sha1: c39794bdcf737a095eec3830b553abff640e20fb Text-content-length: 96 Text-content-md5: 178078fb8baff2ac878616115bd15227 Text-content-sha1: bcc323ababb013ee63137d18ddaa811e73a0efa4 Content-length: 96 SVN��+c L�d��3x43 Present-in: r5344 This appeared in r5344 (asynchronous askappend() box). Revision-number: 6843 Prop-content-length: 296 Content-length: 296 K 8 svn:date V 27 2006-09-03T12:55:16.559927Z K 7 svn:log V 195 Add a mini-rant to the top comment explaining why threads are required. (I just tried getting rid of them; it worked fine for serial ports, but not for anything else. The Windows I/O API sucks.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 34fe40671829f8228921b8ea0474fa2c Text-delta-base-sha1: b410fe5a3b1b143b225f75a73bd6f298912dca2f Text-content-length: 681 Text-content-md5: c6045e1853cd4bf99b85b49ee0c4da47 Text-content-sha1: 156cfcb235f2a60dc0959783aed87c8272dad979 Content-length: 681 SVN��m �v��zs * (It's terribly annoying having to spawn a subthread for each * direction of each handle. Technically it isn't necessary for * serial ports, since we could use overlapped I/O within the main * thread and wait directly on the event objects in the OVERLAPPED * structures. However, we can't use this trick for some types of * file handle at all - for some reason Windows restricts use of * OVERLAPPED to files which were opened with the overlapped flag - * and so we must use threads for those. This being the case, it's * simplest just to use threads for everything rather than trying * to keep track of multiple completely separate mechanisms.) Revision-number: 6844 Prop-content-length: 808 Content-length: 808 K 8 svn:date V 27 2006-09-03T14:31:34.018383Z K 7 svn:log V 707 Support for an alternative mechanism for displaying wide characters under X: instead of having two separate fixed-width fonts one of which is twice the width of the other, you can instead have a single font in which some characters are twice as wide as others. This is implemented very simply: if you specify a wide font, it will be used for wide characters, and if you don't then the normal font will be used for wide characters (so they'd better _be_ wide in that font, or there'll be trouble). I got this idea from Jed, whose latest version supports UTF-8 and requires a font of this type. If there are going to be X fonts like that kicking around, there will doubtless be people who want to use them. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5726ab74dc056c8326354fb9de46204e Text-delta-base-sha1: 9a9b1c960aceb82e49482760231dbc48cfb97d7f Text-content-length: 319 Text-content-md5: 4072884737d2cf13e6ff167425e2531c Text-content-sha1: 26eb9a7d78ededc353e4d08bd2a65bec6710d032 Content-length: 319 SVN����/�^��g8�  && (fontid & 2)) { /* * We've been given ATTR_WIDE, but have no wide font. * Fall back to the non-wide font. */ fontid &= ~2 So we * display�qO^^�q� gtk_signal_connect(GTK_OBJECT(inst->area), "selection_get", GTK_SIGNAL_FUNC(select Revision-number: 6845 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2006-09-05T21:39:30.726145Z K 7 svn:log V 103 Slight change to password expiry UI for the benefit of Cisco servers, which are as usual slightly odd. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d9c710e0ade101dff0fea2cab0f7be5a Text-delta-base-sha1: 29b7b2563a9c2bc14e7a6be3b232af6fdf4dca94 Text-content-length: 1261 Text-content-md5: 1568ce71a0437eb7eb9f2b30e658e5a0 Text-content-sha1: 6dcc6f85bd17849c7aca68376b7c92dc6c926e1b Content-length: 1261 SVN����������������H1%�P��+H`�E��up�bf/* * There's no explicit requirement in the protocol * for the "old" passwords in the original and * password-change messages to be the same, and * apparently some Cisco kit supports password change * by the user entering a blank password originally * and the real password subsequently, so, * reluctantly, we prompt for the old password again. * * (On the other hand, some servers don't even bother * to check this field.) */ add_prompt(s->cur_prompt, dupstr("Current password (blank for previously entered password): "), FALSE, SSH_MAX_PASSWORD_LEN)If the user specified a new original password * (IYSWIM), overwrite any previously specified * one. * (A side effect is that the user doesn't have to * re-enter it if they louse up the new password.) */ if (s->cur_prompt->prompts[0]->result[0]) { memset(s->password, 0, strlen(s->password)); /* burn the evidence */ sfree(s->password); s->password = dupstr(s->cur_prompt->prompts[0]->result); } /* * Check the two new1]->result, s->cur_prompt->prompts[21 Revision-number: 6846 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2006-09-05T21:41:38.755184Z K 7 svn:log V 85 I seem to have slightly funted Plink's display of banners etc in r6437, oops. Fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1568ce71a0437eb7eb9f2b30e658e5a0 Text-delta-base-sha1: 6dcc6f85bd17849c7aca68376b7c92dc6c926e1b Text-content-length: 126 Text-content-md5: eaf4b534a77b4f5380819efc008d0f9d Text-content-sha1: ca2f295619e8e88759f31356820d52a850f81f91 Content-length: 126 SVN���� �B��$H== '\n' || (buf[i] & 0x60)����l�sphrase for key \"%.�1E�1� logevent("Access Revision-number: 6847 Prop-content-length: 148 Content-length: 148 K 7 svn:log V 48 CSI 3 J now clears the scrollback, as in xterm. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-09-05T22:08:00.150466Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 92442c325176493cdbaab741b3a268a1 Text-delta-base-sha1: c6b9033b89a3df9a6c57ec501079a223e25a2404 Text-content-length: 436 Text-content-md5: c18b98b85e65e4f0cdfd9cf7d70eb0f0 Text-content-sha1: 7996c2492409dfae3ec2d620bb22f6dffa096c11 Content-length: 436 SVN����n�.�n�d; if (i == 3) { /* Erase Saved Lines (xterm) * This follows Thomas Dickey's xterm. */ term_clrsb(term); } else { i++; if (i > 3) i = 0; erase_lots(term, FALSE, !!(i & 2), !!(i & 1)); }�'=�'� break; case 90: case 91: case 92: case 93: case 94: case 95: case 96: case 97: /* aixterm- Node-path: putty-wishlist/data/term-clear-scrollback Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b1c5a2cfbfdb1f2adf23353aea7b01b Text-delta-base-sha1: 38a102e0a406f9d57c943093f6ba8f4d6a8b8488 Text-content-length: 145 Text-content-md5: 8b050ecff9acb32e44d7062117d3da45 Text-content-sha1: ac59cfaca04a9924a6aca1b0b383193fa2a833b6 Content-length: 145 SVN��&Jw�`��o_]�LFixed-in: r6847 2006-09-06li><em>Update, 2006-09-06:</em> this sequence is implemented in PuTTY as of today's snapshot. Revision-number: 6848 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2006-09-05T22:09:51.377763Z K 7 svn:log V 22 Note effect of r6845. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-password-expiry Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a1604deeae1079b6c8fea5eecbb1683 Text-delta-base-sha1: 0a3bbbfb6bf8dbee1396e883c9f6d5e8297e8957 Text-content-length: 193 Text-content-md5: 5c389d4c0bd899f2102c147c259722b5 Text-content-sha1: 2ab3dee8e0d213c4fcaa21b737ba37470caa78ea Content-length: 193 SVN��T.�T�. <p> <em>Update, 2006-09-06:</em> the UI has been slightly modified to accommodate Cisco servers, which allow a password change to be requested by entering a blank password. Revision-number: 6849 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:34.128432Z PROPS-END Revision-number: 6850 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:34.138865Z PROPS-END Revision-number: 6851 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-06T12:15:34.150169Z PROPS-END Revision-number: 6852 Prop-content-length: 126 Content-length: 126 K 7 svn:log V 26 Another file-storing fork K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-09-06T20:50:37.140302Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1fc41ba16d5e3de7a1cde7b816beee2f Text-delta-base-sha1: 4dafa2aec375a3a1a3cfaef41b8af0729458e631 Text-content-length: 94 Text-content-md5: ce93135051b920982cec00f201c2b4d8 Text-content-sha1: 81b907e29e79f71cc41cab0b2a2b3984d6eaacf8 Content-length: 94 SVN��_< H�4�H�@jakub.kotrla.net/putty/">Another version</a> that stores data in files Revision-number: 6853 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-12T23:31:02.082636Z PROPS-END Revision-number: 6854 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-13T23:31:11.418779Z PROPS-END Revision-number: 6855 Prop-content-length: 201 Content-length: 201 K 8 svn:date V 27 2006-09-15T14:44:21.583999Z K 7 svn:log V 100 Note that the dynamic-tunnel proxy does not support UDP, since we get asked about this quite often. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: acc5e8ed1b03b60aade7cc8af9530e72 Text-delta-base-sha1: e0ba7240f0ee82e0d243a061c96e40e17b33e4ba Text-content-length: 148 Text-content-md5: 773e1dc36fe0f2b36f7dbc7c3f16dbc3 Text-content-sha1: bf4d1dcf0e05446785a64e127886b31e06d41125 Content-length: 148 SVN���������9$ k�9�k��9 (note that this proxy only supports TCP connections; the SSH protocol does not support forwarding \i{UDP}) Revision-number: 6856 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-19T23:31:15.473213Z PROPS-END Revision-number: 6857 Prop-content-length: 332 Content-length: 332 K 7 svn:log V 231 Fix breakage of `Restart Session' in r6802. When restarting the session, we were clearing the new session_closed flag, but failing to clear must_close_session; with that set, the session was being opened but immediately re-closed. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-09-21T11:48:32.126070Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9f7b3fde762bda0d7227e9337c11664b Text-delta-base-sha1: c9dfd5a63d5febafb464ed04ac8a20efc96a6d3d Text-content-length: 100 Text-content-md5: a9287ae3fdd0b8b7ee950e3feeae7bed Text-content-sha1: 30ecf14f80f4e176f51e60f64b1d415a3929d1c7 Content-length: 100 SVN���� �:��+5must_close_session = FALSE;�^~ �^� break; case VK_DECIMAL: Revision-number: 6858 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-24T23:31:02.550284Z PROPS-END Revision-number: 6859 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-25T23:31:03.671760Z PROPS-END Revision-number: 6860 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-25T23:31:03.755643Z PROPS-END Revision-number: 6861 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-09-29T23:31:02.215483Z PROPS-END Revision-number: 6862 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-02T23:31:04.349251Z PROPS-END Revision-number: 6863 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-02T23:31:04.442098Z PROPS-END Revision-number: 6864 Prop-content-length: 209 Content-length: 209 K 8 svn:date V 27 2006-10-02T20:52:57.331816Z K 7 svn:log V 108 IXON and IXOFF belong in _iflag_, not cflag! While I'm here, be more reliable in clearing of RTS/CTS flags. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0d0baa618aac791b57c061608f9f2671 Text-delta-base-sha1: e2a8a7c34bbf3b4a8bf3eecfe6bccfa93440c97b Text-content-length: 222 Text-content-md5: fa7c0a1c162138f936376650f9855abc Text-content-sha1: 1ed43b057658cfa75d342249c47f06f0a33b46e3 Content-length: 222 SVN��OE F�v�F� Fiflag &= ~(IXON|IXOFF); #ifdef CRTSCTS options.c_cflag &= ~CRTSCTS; #endif #ifdef CNEW_RTSCTS options.c_cflag &= ~CNEW_RTSCTS; #endif if (cfg->serflow == SER_FLOW_XONXOFF) { options.c_i Revision-number: 6865 Prop-content-length: 324 Content-length: 324 K 8 svn:date V 27 2006-10-03T17:16:26.616122Z K 7 svn:log V 223 Disable a bunch of undesirable termios flags. ICRNL, in particular, is liable to have been set on serial ports previously used as terminal devices, and definitely wants not to be set on serial ports being used for callout. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fa7c0a1c162138f936376650f9855abc Text-delta-base-sha1: 1ed43b057658cfa75d342249c47f06f0a33b46e3 Text-content-length: 197 Text-content-md5: 7a4dd6784f7cba5704382f639c32a291 Text-content-sha1: 135b535450123c9a17d57b9e2eee5e12f68a1128 Content-length: 197 SVN��Ec -�*�-� 9iflag &= ~(ISTRIP | IGNCR | INLCR | ICRNL #ifdef IUCLC | IUCLC #endif ); options.c_oflag &= ~(OPOST #ifdef ONLCR | ONLCR #endif | OCRNL | ONOCR | ONLRET) Revision-number: 6866 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-06T23:31:28.326284Z PROPS-END Revision-number: 6867 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-06T23:31:28.382919Z PROPS-END Revision-number: 6868 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-06T23:31:28.393733Z PROPS-END Revision-number: 6869 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-08T23:31:03.278172Z PROPS-END Revision-number: 6870 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-08T23:31:03.357173Z PROPS-END Revision-number: 6871 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-11T23:31:34.664110Z PROPS-END Revision-number: 6872 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-17T23:31:01.754598Z PROPS-END Revision-number: 6873 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-22T23:31:00.852607Z PROPS-END Revision-number: 6874 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-22T23:31:00.940139Z PROPS-END Revision-number: 6875 Prop-content-length: 119 Content-length: 119 K 7 svn:log V 19 Some more mirrors. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-10-22T19:11:56.635585Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e904f773e66af34de6642102d1055345 Text-delta-base-sha1: c5fe63ec2b493ebe6f3691b0c763c98ec9b427fa Text-content-length: 770 Text-content-md5: 20385ab01d39535c475c1bf1961b88ba Text-content-sha1: 567195cb6513c66dab1ca6d9d2c012d82d954ec0 Content-length: 770 SVN��/fzz�r��J��S��S��!r�R4�R4�s�A@�A@� {�X��[~�s�}7�`h�L~�I}�H�M@�I��/4�bMlinux4all.homelinux.net/">putty.linux4all.homelinux.netputty.phpmail.de/">putty.phpmailaalener-mirror.de/">putty.aalener-mirrorin51.com/">putty.in51.cominternet.bs/">putty.internet.bsftp.kaist.ac.kr/pub/putty/">kaist.ac.kr</a> in Koreainfowave.org/">putty.infowave.org</a> in Koreajl-projects.com/">putty.jl-projects.comosmirror.nl/">putty.osmirrorputty.geosdreams.info/">putty.geosdreams.info</a> in Polandputty.tx.se/">putty.txputty.oregon.me.uk/">putty.oregon.memirror.thekeelecentre.com/putty/">mirror.thekeelecentre.combbnx.net/">putty.bbnxputty.leetnet.com/">putty.leetnet.comftp.mipt.ru/mirror/putty/">ftp.mipt.ru</a> in Russia Revision-number: 6876 Prop-content-length: 577 Content-length: 577 K 8 svn:date V 27 2006-10-22T19:51:28.443906Z K 7 svn:log V 476 Minor semantic tweak to bug-compatibility modes: make BUG_NEEDS_SSH1_PLAIN_PASSWORD do exactly what it says on the tin, independent of whether BUG_CHOKES_ON_SSH1_IGNORE is set. This is invisible in the default configuration, as all servers marked as having the second bug have the first one too, but it would allow one to manually configure PuTTY to cope with a SSH-1 server that got upset by ignore messages during authentication, but was fine with their use as keepalives. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 773e1dc36fe0f2b36f7dbc7c3f16dbc3 Text-delta-base-sha1: bf4d1dcf0e05446785a64e127886b31e06d41125 Text-content-length: 406 Text-content-md5: b078973b899846b5cb97e89e199e94ce Text-content-sha1: 82fd2a88c9f16bdbd12cafbfd4c8cd37ce3f57ef Content-length: 406 SVN���������$c�.�=��P&�~& \I{password camouflage}hide the password packet in SSH-1, so that a listener cannot tell the length of the user's password; it also uses ignore messages for connection \i{keepalives} (see assume that neither ignore messages nor padding are acceptable, and that it thus has no choice but to send the user's password with no form of camouflage, so that an Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eaf4b534a77b4f5380819efc008d0f9d Text-delta-base-sha1: ca2f295619e8e88759f31356820d52a850f81f91 Text-content-length: 1599 Text-content-md5: 50af623c753cf4ecb2e272e9ed48b155 Text-content-sha1: 29fb3ea5989dd1a43e25f9ff7ebd438a12330c86 Content-length: 1599 SVN����A�Q�A�nL/* * General notes on server version strings: * - Not all servers reporting "Cisco-1.25" have all the bugs listed * here -- in particular, we've heard of one that's perfectly happy * with SSH1_MSG_IGNOREs -- but this string never seems to change, * so we can't distinguish them. */���`F�i�� �K�$, "No passphrase required.\r\n"); passphrase = NULL; } else { int ret; /* need not be kept over crReturn */ s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = FALSE; s->cur_prompt->name = dupstr("SSH key passphrase"); add_prompt(s->cur_prompt, dupprintf("Pascan't deal with SSH1_MSG_IGNORE, at * least in this context. For these servers, we need * an alternative defence. We make use of the fact * that the password is interpreted as a C string: * so we can append a NUL, then some random data. * * A few servers can deal with neither SSH1_MSG_IGNORE * here _nor_ a padded password string. * For these servers && !(ssh->remote_bugs & BUG_NEEDS_SSH1_PLAIN_PASSWORDis believed unable to cope with * any of our password camouflage methods�E DD�E� if (s->type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD) c_write_str(ssh, "Server refused our key\r\n"); logevent("Server refused public key"); } else if (s->type==AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET) { /* server declined keyboard-interactive; ignore */ } else { c_write_str(ssh, "Access denied\r\n"); Revision-number: 6877 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2006-10-22T20:19:55.324873Z K 7 svn:log V 122 Spotted by Tim Kosse: we were returning an incorrect path in canonify() when we couldn't get any sense out of the server. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 52f20e93505f3f02f7f37153bd1d3b29 Text-delta-base-sha1: 8e7df0ca34591f769f3735adbad0feec590da7d8 Text-content-length: 217 Text-content-md5: bcf590ed00350065299c3f1ba99f7877 Text-content-sha1: 1e0b6cfdd39146ce0df5537f01e90d63dee9b987 Content-length: 217 SVN��qr >�H�>�l { /* Even that failed. Restore our best guess at the * constructed filename and give up */ fullname[i] = '/'; /* restore slash and last component */ return fullname; } Revision-number: 6878 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2006-10-24T13:57:44.725246Z K 7 svn:log V 29 Another good reason for this K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/proxy-password-prompt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 62e6b20dbb2cff9fcce82bbe6def2c60 Text-delta-base-sha1: 541e9fb980403b304c0031d3c2cbbd8faf3d2f82 Text-content-length: 126 Text-content-md5: 55eaea4d52e32c601ba179a6544c58ad Text-content-sha1: 28fc0dfa079fdcbe71c2fdfa46a5b5b58ba688e7 Content-length: 126 SVN��W@ h�z�h�^y This would also make use of authentication schemes where the password is always changing more practical Revision-number: 6879 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-26T23:31:11.763257Z PROPS-END Revision-number: 6880 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-28T23:31:03.209423Z PROPS-END Revision-number: 6881 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-30T00:31:03.396612Z PROPS-END Revision-number: 6882 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-30T00:31:03.510778Z PROPS-END Revision-number: 6883 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-30T00:31:03.520358Z PROPS-END Revision-number: 6884 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-10-30T00:31:03.530336Z PROPS-END Revision-number: 6885 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2006-10-31T16:59:56.674428Z K 7 svn:log V 18 Tiny comment fix. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9a734b8b840f5a4cad33006771eb9983 Text-delta-base-sha1: cddef9b4e392327076ef11e4e4228278281e381b Text-content-length: 23 Text-content-md5: 1e3dd65d5cec663addb94ec98c35353e Text-content-sha1: 4a73879de9023e38264e158705a905eece48ac8a Content-length: 23 SVN�� �s��sss Revision-number: 6886 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2006-10-31T21:07:07.213085Z K 7 svn:log V 28 Patch for Windows for UTF-8 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/window-title-charset Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a3f5e309c24b942a362325abdcf73121 Text-delta-base-sha1: f16ab137ca1513846a202c24b0e55074c370252f Text-content-length: 136 Text-content-md5: cb228b87ff237dadf37613e8d14b4d8b Text-content-sha1: 5fe21cf10b754b21b907015a1f0dcfd0babab62b Content-length: 136 SVN��w��w <p> Patch for Windows to interpret window title as UTF-8 (unreviewed): <tt><454617EB.2080900@yahoo.com.au></tt> Revision-number: 6887 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2006-10-31T22:55:13.890169Z K 7 svn:log V 67 Summary: Variable expansion in configured window title Class: wish K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/window-title-keywords Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1024 Text-content-md5: ea6692634ebc9dcdacc9c16a3a1a9817 Text-content-sha1: 58b08bf6bed55261aa2b8b3143ac6184c9186435 Content-length: 1034 PROPS-END SVN���rrrSummary: Variable expansion in configured window title Class: wish Difficulty: fun Priority: medium Content-type: text/x-html-body <p> Some sort of variable expansion in the window title as configured in PuTTY, with keywords for things like hostname, username, and so on. <p> One slightly special keyword would be one expanding to whatever the server set the window title to. (Some people have software that tracks window titles, so would like a guaranteed-constant bit while allowing the server to influence the title.) This would obviously require some change to the default behaviour where a server-specified title completely overrides what's in the configuration -- perhaps triggered by the presence of this keyword. <p> (It seems a bit of a shame to invent yet another random incompatible micro-language instead of adding variable expansion / <a href="scripting.html">scripting</a> consistently across the entire interface, but we're unlikely to get around to even designing the latter any time soon.) Revision-number: 6888 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-02T00:32:32.368768Z PROPS-END Revision-number: 6889 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-02T00:32:32.458779Z PROPS-END Revision-number: 6890 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2006-11-08T00:55:13.252466Z K 7 svn:log V 54 Administrivia: most SSH-2 specs are no longer drafts. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b078973b899846b5cb97e89e199e94ce Text-delta-base-sha1: 82fd2a88c9f16bdbd12cafbfd4c8cd37ce3f57ef Text-content-length: 65 Text-content-md5: 5ff279abffd1996e0d569b224b570315 Text-content-sha1: 5a4244935be351beba46f251e29836b424061e73 Content-length: 65 SVN���� �e��Dk�L4specu have � ��A�AN Revision-number: 6891 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-09T00:31:11.380741Z PROPS-END Revision-number: 6892 Prop-content-length: 417 Content-length: 417 K 7 svn:log V 316 Subject: Remote terminal spew can lock out local GUI Class: bug Absent-in: 0.57 Present-in: 2004-12-23 0.58 Priority: high I can reproduce this, at least with a telnet connection. I have a candidate suspect for the change that caused this that I noticed a while ago, but I haven't time to track it down right now. K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-11-08T14:24:51.154837Z PROPS-END Node-path: putty-wishlist/data/spew-lockup Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 566 Text-content-md5: 87bb2b8f3dead9e769f7c9ffe47edf7a Text-content-sha1: 1c5cb5f9e10c1936773b955cd54854a3f9d332f9 Content-length: 576 PROPS-END SVN���(((Subject: Remote terminal spew can lock out local GUI Class: bug Absent-in: 0.57 Present-in: 2004-12-23 0.58 Priority: high <p> If the remote server floods us with terminal data enthusiastically enough, the local GUI can be completely locked out (at least on Windows). The appearance is that PuTTY appears to hang: it consumes as much CPU as it can, the window does not update, and the GUI (keyboard, menus etc) is unresponsive. If and when the stream of data abates, PuTTY becomes responsive again. <p> This crept in somewhere between 0.57 and 0.58. Revision-number: 6893 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2006-11-08T14:48:16.901815Z K 7 svn:log V 31 This might be a Vista blocker. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-randseed-location Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f9ea14953a77f93672020eddf76c902 Text-delta-base-sha1: d7d6ff9f88beee6ed5d972bf136c2aaa88430d76 Text-content-length: 170 Text-content-md5: 6de44bbce071615a0d29eb9db8db5b6c Text-content-sha1: 3bad533bae7e0478b79dd170ef52ee7576fa7ed7 Content-length: 170 SVN��, �l��-rhigh <p> <em>Update, 2006-11-08:</em> it's been suggested that this might stop PuTTY running as a standard user in Windows Vista. Bumped priority. Revision-number: 6894 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-09T00:31:11.878270Z PROPS-END Revision-number: 6895 Prop-content-length: 410 Content-length: 410 K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-11-08T21:15:30.164957Z K 7 svn:log V 309 There's been an increase in people posting non-SSH PuTTY-related questions to comp.security.ssh, posting queries that are clearly about PuTTY to newsgroups without actually mentioning PuTTY, and so on. They may have been directed there by this document :( Add a futile attempt to instil a sense of etiquette. PROPS-END Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0ad33a99f64fd431c00eec9f27f61960 Text-delta-base-sha1: 059f5a1d860094f0726325e637936273fd007f12 Text-content-length: 159 Text-content-md5: b56ed11a86491fcb53c3b3fc5fa04666 Text-content-sha1: 9d4a2e72301957835100cb5a23873420be60b5d6 Content-length: 159 SVN��  ����}Please use the newsgroup most appropriate to your query, and remember that these are general newsgroups, not specifically about PuTTY Revision-number: 6896 Prop-content-length: 112 Content-length: 112 K 8 svn:date V 27 2006-11-09T11:14:50.323280Z K 7 svn:log V 12 Formatting! K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/spew-lockup Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 87bb2b8f3dead9e769f7c9ffe47edf7a Text-delta-base-sha1: 1c5cb5f9e10c1936773b955cd54854a3f9d332f9 Text-content-length: 167 Text-content-md5: 458d7ea3c09174da860710177d2ca69e Text-content-sha1: f15ee1debfbd2d2a48de31a9865c75600071bb9a Content-length: 167 SVN��(B�.zSummary: Remote terminal spew can lock out local GUI Class: bug Absent-in: 0.57 Present-in: 2004-12-23 0.58 Priority: high Content-type: x-html-body Revision-number: 6897 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-10T00:31:06.413311Z PROPS-END Revision-number: 6898 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-10T00:31:06.424454Z PROPS-END Revision-number: 6899 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-10T00:31:06.435454Z PROPS-END Revision-number: 6900 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-10T00:31:06.446242Z PROPS-END Revision-number: 6901 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-10T00:31:06.456904Z PROPS-END Revision-number: 6902 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-10T00:31:06.484526Z PROPS-END Revision-number: 6903 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-10T00:31:06.494773Z PROPS-END Revision-number: 6904 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2006-11-15T11:48:07.634170Z K 7 svn:log V 39 Link to faq-cleanup from faq-settings. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a0ee94d3713f26daa696c0b28060e8c Text-delta-base-sha1: 2c11b353da314fe575ca655066c7627d931009ec Text-content-length: 89 Text-content-md5: ddeab78003bb77320d2dab4ba11fa9aa Text-content-sha1: 58a398f06ba74544426cba8443143fa1566041c3 Content-length: 89 SVN�� K ?� ��lYou can ask PuTTY to delete all this data; see \k{faq-cleanup}. Revision-number: 6905 Prop-content-length: 125 Content-length: 125 K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-11-15T12:56:48.102222Z K 7 svn:log V 25 publickeyfile now an RFC PROPS-END Node-path: putty/doc/man-pg.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a9a1a7627c8942900369cd58eb0c75b2 Text-delta-base-sha1: 2e6bbd9b38b70373072020ef3f42df88e4dff357 Text-content-length: 34 Text-content-md5: 946a376817c7e66bdd170987766d859e Text-content-sha1: 066e1c955dfb9923710911207a03a4e0ad0da027 Content-length: 34 SVN��IB ���.by RFC 4716, Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0cc7e997185867f24fa82f7112bc4c2c Text-delta-base-sha1: e649c18b9ba42077518b26c38e4b05caff75a55e Text-content-length: 105 Text-content-md5: a46649b2fbb80e0f65285716c28ebad0 Text-content-sha1: 6741403c90c5b82ccbf99709229c67cc71b308c4 Content-length: 105 SVN��i` Q�K�Q�D%RFC 4716 specifies a \I{SSH-2 public key format}standard format for storing SSH-2 Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ce93135051b920982cec00f201c2b4d8 Text-delta-base-sha1: 81b907e29e79f71cc41cab0b2a2b3984d6eaacf8 Text-content-length: 102 Text-content-md5: 959200f85196997e226033ec9f3f4cda Text-content-sha1: 59c5b79fa136f79873f9c67cc8e6a73e0dd7f2d2 Content-length: 102 SVN��<LK��K�=]�A{rfc/rfc4716.txt"> RFC 4716: The Secure Shell (SSH) Public Key File Format Revision-number: 6906 Prop-content-length: 224 Content-length: 224 K 8 svn:date V 27 2006-11-15T23:12:20.333549Z K 7 svn:log V 123 (Config).remote_cmd2[512] was added in r1208, but it wasn't used then and isn't now, so presumably never has been. Remove. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99706ac5fdacc0b9d81b43dfe24c2249 Text-delta-base-sha1: bba3299458bd161ae7fe4cee889203114fcdb883 Text-content-length: 33 Text-content-md5: 6501a65affd90f8babff30ea94e8b28f Text-content-sha1: 8f7cb3e970e7d5bf20bfbed78ca973b7d6418205 Content-length: 33 SVN��A`���}�/_ptr Revision-number: 6907 Prop-content-length: 356 Content-length: 356 K 8 svn:date V 27 2006-11-15T23:42:22.269319Z K 7 svn:log V 255 Chris Boucher spotted that after "-nc" was added (r6823), cfg->ssh_nc_host was not always initialised, which could lead to spurious attempts to open a bogus channel (typically refused: "FATAL ERROR: Server refused to open a direct-tcpip channel"). Fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 29fd6b46119545a11390b53c317aed18 Text-delta-base-sha1: 3081b370cdc591c55bd8d4581633dc17108eebd4 Text-content-length: 55 Text-content-md5: 1a2c81d31455caf1e0beb94dbe8324aa Text-content-sha1: e4080036d17d18bd5323cf186912d9935507dff0 Content-length: 55 SVN��b �f��~d cfg->ssh_nc_host[0] = '\0' Revision-number: 6908 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-19T00:31:03.999932Z PROPS-END Revision-number: 6909 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2006-11-18T15:05:05.545834Z K 7 svn:log V 73 What we think of zlib@openssh.com, derived from conversation last night. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/zlib-openssh Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1292 Text-content-md5: 8b74b40902d5135a89da35e0d4f597d3 Text-content-sha1: f02064df7ed8770746532633c7a8c52f6bc720e7 Content-length: 1302 PROPS-END SVN���~~~Summary: Support for "zlib@openssh.com" Class: wish Difficulty: tricky Priority: medium Content-type: text/plain OpenSSH 4.2 introduces a variety of ZLIB compression called "zlib@openssh.com" which delays starting compression until after the server has sent SSH_MSG_USERAUTH_ACCEPT. As far as we can tell, this is inherently subject to a race condition, since the client can't know whether the server has sent that message, and hence whether it should be transmitting compressed or uncompressed packets. After the client has received USERAUTH_ACCEPT, of course, it knows that the server has sent it and can safely send compressed packets. This suggests that the following implementation would be safe (assuming throughout that the user has requested compression): 1: Before USERAUTH_ACCEPT is received, advertise "zlib,none" in KEXINIT. 2: If an incoming KEXINIT includes "zlib@openssh.com", remember that. 3: After receiving USERAUTH_ACCEPT, if the current compression algorithm is "none" and KEXINIT contained "zlib@openssh.com", initiate key re-exchange. 4: In KEXINITs after receiving USERAUTH_ACCEPT, advertise "zlib,zlib@openssh.com,none". There's no need for PuTTY to stop supporting "zlib", since by the time we send NEWKEYS, we've authenticated the server. Revision-number: 6910 Prop-content-length: 1329 Content-length: 1329 K 8 svn:date V 27 2006-11-18T15:10:48.312051Z K 7 svn:log V 1227 Reinstate as much of the Windows font-linking behaviour as I can easily manage, by adopting a hybrid approach to Unicode text display. The old approach of simply calling ExtTextOutW provided font linking without us having to lift a finger, but didn't do the right thing when it came to bidirectional or Arabic-shaped text. Arabeyes' replacement exact_textout() supported the latter, but turned out to break the former (with no warning from the Windows API documentation, so it's not their fault). So now I've got a second wrapper layer called general_textout(), which splits the input string into substrings based on bidi character class. Any character liable to cause bidi or shaping behaviour if fed straight to ExtTextOutW is instead fed through Arabeyes' exact_textout(), but the rest is fed straight to ExtTextOutW as it used to be. The effect appears to be that font linking is restored for all characters _except_ Arabic and other bidi scripts, which means in particular that we are no longer in a state of regression over 0.57. (0.57 would have done font linking on Arabic as well, but would also have misbidied it, so we've merely exchanged one failure mode for another slightly less harmful one in that situation.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e2f54e920e1b6b560aa79b64cecb8d7 Text-delta-base-sha1: 1df61b6367691c34f2668353d9700a14897fe0e6 Text-content-length: 1435 Text-content-md5: 798672a9f585241be58610f5d2689af9 Text-content-sha1: 2d91d9e26ba328cba17074292b49daf820c29905 Content-length: 1435 SVN��+4~�9�~�}.Function exported to front ends to allow them to identify * bidi-active characters (in case, for example, the platform's * text display function can't conveniently be prevented from doing * its own bidi and so special treatment is required for characters * that would cause the bidi algorithm to activate). * * This function is passed a single Unicode code point, and returns * nonzero if the presence of this code point can possibly cause * the bidi algorithm to do any reordering. Thus, any string * composed entirely of characters for which is_rtl() returns zero * should be safe to pass to a bidi-active platform display * function without fear. * * (is_rtl() must therefore also return true for any character * which would be affected by Arabic shaping, but this isn't * important because all such characters are right-to-left so it * would have flagged them anyway.) */ int is_rtl(int c) { /* * After careful reading of the Unicode bidi algorithm (URL as * given at the top of this file) I believe that the only * character classes which can possibly cause trouble are R, * AL, RLE and RLO. I think that any string containing no * character in any of those classes will be displayed * uniformly left-to-right by the Unicode bidi algorithm. */ const int mask = (1<<R) | (1<<AL) | (1<<RLE) | (1<<RLO); return mask & (1 << (getType(c))) Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6501a65affd90f8babff30ea94e8b28f Text-delta-base-sha1: 8f7cb3e970e7d5bf20bfbed78ca973b7d6418205 Text-content-length: 41 Text-content-md5: b785ff56e01dcee33bb0c82511cfa3cd Text-content-sha1: 40e6802c4fb41c34ec71e976f0907a0d0601f1d6 Content-length: 41 SVN��`s �y��jvint is_rtl(int c Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a9287ae3fdd0b8b7ee950e3feeae7bed Text-delta-base-sha1: 30ecf14f80f4e176f51e60f64b1d415a3929d1c7 Text-content-length: 4785 Text-content-md5: a5bb88390be0e3540c27083a7c07429d Text-content-sha1: 98a0fb09600d2a7f1a318c9639178d0a1c875889 Content-length: 4785 SVN����E�j�=�?^�<The exact_textout() wrapper, unfortunately, destroys the useful * Windows `font linking' behaviour: automatic handling of Unicode * code points not supported in this font by falling back to a font * which does contain them. Therefore, we adopt a multi-layered * approach: for any potentially-bidi text, we use exact_textout(), * and for everything else we use a simple ExtTextOut as we did * before exact_textout() was introduced. */ static void general_textout(HDC hdc, int x, int y, CONST RECT *lprc, unsigned short *lpString, UINT cbCount, CONST INT *lpDx, int opaque) { int i, j, xp, xn; RECT newrc; #ifdef FIXME_REMOVE_BEFORE_CHECKIN int k; debug(("general_textout: %d,%d", x, y)); for(k=0;k<cbCount;k++)debug((" U+%04X", lpString[k])); debug(("\n rect: [%d,%d %d,%d]", lprc->left, lprc->top, lprc->right, lprc->bottom)); debug(("\n")); #endif xp = xn = x; for (i = 0; i < cbCount ;) { int rtl = is_rtl(lpString[i]); xn += lpDx[i]; for (j = i+1; j < cbCount; j++) { if (rtl != is_rtl(lpString[j])) break; xn += lpDx[j]; } /* * Now [i,j) indicates a maximal substring of lpString * which should be displayed using the same textout * function. */ if (rtl) { newrc.left = lprc->left + xp - x; newrc.right = lprc->left + xn - x; newrc.top = lprc->top; newrc.bottom = lprc->bottom; #ifdef FIXME_REMOVE_BEFORE_CHECKIN { int k; debug((" exact_textout: %d,%d", xp, y)); for(k=0;k<j-i;k++)debug((" U+%04X", lpString[i+k])); debug(("\n rect: [%d,%d %d,%d]\n", newrc.left, newrc.top, newrc.right, newrc.bottom)); } #endif exact_textout(hdc, xp, y, &newrc, lpString+i, j-i, lpDx+i, opaque); } else { #ifdef FIXME_REMOVE_BEFORE_CHECKIN { int k; debug((" ExtTextOut : %d,%d", xp, y)); for(k=0;k<j-i;k++)debug((" U+%04X", lpString[i+k])); debug(("\n rect: [%d,%d %d,%d]\n", newrc.left, newrc.top, newrc.right, newrc.bottom)); } #endif newrc.left = lprc->left + xp - x; newrc.right = lprc->left + xn - x; newrc.top = lprc->top; newrc.bottom = lprc->bottom; ExtTextOutW(hdc, xp, y, ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0), &newrc, lpString+i, j-i, lpDx+i); } i = j; xp = xn; } #ifdef FIXME_REMOVE_BEFORE_CHECKIN debug(("general_textout: done, xn=%d\n", xn)); #endif assert(xn - x == lprc->right - lprc->leftgeneral_textout(hdc, x, y - font_height * (lattr == LATTR_BOT) + text_adjust, &line_box, wbuf, len, IpDx, !(attr & TATTR_COMBINING));�~022�~� if (left_alt && wParam == VK_RETURN && cfg.fullscreenonaltenter && (cfg.resize_action != RESIZE_DISABLED)) { if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) != KF_REPEAT) flip_full_screen(); return -1; } /* Control-Numlock for app-keypad mode switch */ if (wParam == VK_PAUSE && shift_state == 2) { term->app_keypad_keys ^= 1; return 0; } /* Nethack keypad */ if (cfg.nethack_keypad && !left_alt) { switch (wParam) { case VK_NUMPAD1: *p++ = "bB\002\002"[shift_state & 3]; return p - output; case VK_NUMPAD2: *p++ = "jJ\012\012"[shift_state & 3]; return p - output; case VK_NUMPAD3: *p++ = "nN\016\016"[shift_state & 3]; return p - output; case VK_NUMPAD4: *p++ = "hH\010\010"[shift_state & 3]; return p - output; case VK_NUMPAD5: *p++ = shift_state ? '.' : '.'; return p - output; case VK_NUMPAD6: *p++ = "lL\014\014"[shift_state & 3]; return p - output; case VK_NUMPAD7: *p++ = "yY\031\031"[shift_state & 3]; return p - output; case VK_NUMPAD8: *p++ = "kK\013\013"[shift_state & 3]; return p - output; case VK_NUMPAD9: *p++ = "uU\025\025"[shift_state & 3]; return p - output; } } /* Application Keypad */ if (!left_alt) { int xkey = 0; if (cfg.funky_type == FUNKY_VT400 || (cfg.funky_type <= FUNKY_LINUX && term->app_keypad_keys && !cfg.no_applic_k)) switch (wParam) { case VK_EXECUTE: xkey = 'P'; break; case VK_DIVIDE: xkey = 'Q'; break; case VK_MULTIPLY: xkey = 'R'; break; case VK_SUBTRACT: xkey = 'S'; break; } if (term->app_keypad_keys && !cfg.no_applic_k) switch (wParam) { case VK_NUMPAD0: xkey = 'p'; break; case VK_NUMPAD1: xkey = 'q'; break; case VK_NUMPAD2: xkey = 'r'; break; case VK_NUMPAD3: xkey = 's'; break; case VK_NUMPAD4: xkey = 't'; break; case VK_NUMPAD5: xkey = 'u'; break; case VK_NUMPAD6: xkey = 'v'; break; case VK_NUMPAD7: xkey = 'w'; break; case VK_NUMPAD8: xkey = 'x'; break; case VK_NUMPAD9: xkey = 'y'; Revision-number: 6911 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2006-11-18T15:21:51.548988Z K 7 svn:log V 36 I've done something about this now. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/win-font-linking Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 79d1ab7179bf8e87390d6fa097110481 Text-delta-base-sha1: 428ab42e7cda7a334be4cc9c8b515c57d974a1a1 Text-content-length: 725 Text-content-md5: 1fbe2d10ed88a3413d09461a2c118de6 Text-content-sha1: ef37f9b0304c4fbc2f08e9e2d02e8d26bd483c0c Content-length: 725 SVN��h 7����U�TFixed-in: r6910 2006-11-19W <p> <b>SGT, 2006-11-18</b>: I've just implemented an alternative workaround, which is to only use <code>exact_textout()</code> for those characters liable to cause unwanted bidi behaviour if passed straight to <code>ExtTextOutW</code>. So now everything <em>other</em> than right-to-left scripts is handled directly by <code>ExtTextOutW</code>, as it used to be, meaning that everything which 0.57 handled completely correctly should once again be handled completely correctly. <p> We still don't support font linking for bidi text, but this is no longer a regression over 0.57 because 0.57 would merely have done something <em>else</em> wrong when given bidi text. Revision-number: 6912 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-19T00:31:05.084949Z PROPS-END Revision-number: 6913 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-19T00:31:05.094590Z PROPS-END Revision-number: 6914 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-21T00:31:08.257828Z PROPS-END Revision-number: 6915 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-22T00:31:08.733124Z PROPS-END Revision-number: 6916 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-24T00:31:02.829115Z PROPS-END Revision-number: 6917 Prop-content-length: 536 Content-length: 536 K 8 svn:date V 27 2006-11-23T14:32:11.227964Z K 7 svn:log V 435 I've just discovered that using the saved sessions menu from Unix PuTTY causes the child process to inherit a lot of socket fds from its parent, which is a pain if one of them then ends up holding open a listening socket which the parent was using for port forwarding after the parent itself is dead. Therefore, this checkin sprinkles FD_CLOEXEC throughout the Unix platform directory wherever there looks like being a long-lived fd. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxagentc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9817b9ef054f9a127bc809c3978ab6d6 Text-delta-base-sha1: bd6e064f49c762e4db3b772af6a5f4e52d392fd7 Text-content-length: 75 Text-content-md5: 88a2296722fc9a9bbd3b6d21c7d5eecf Text-content-sha1: fd621c044b9b132f732b56fa4d76442bb3e2816f Content-length: 75 SVN��t.0���0�1C#include <fcntlfcntl(sock, F_SETFD, FD_CLOEXEC); Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 834a87a6c852f80b7b3582e061c99b7d Text-delta-base-sha1: c7b1e6bef9dcaf57545e4f4a9a2a5d51951ade1c Text-content-length: 90 Text-content-md5: c8384507a8262b235c4f84bd14a79c7a Text-content-sha1: 2ece0feb1ab397f0b069547e4f0dbf5fd52ef1d9 Content-length: 90 SVN��;<�G��NA�2 fcntl(s, F_SETFD, FD_CLOEXEC);fcntl(s, F_SETFD, FD_CLOEXEC); Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b2d36f2224c4e20b99fa13289c56fd9d Text-delta-base-sha1: 03a93dabcacc9a14c52fc356045ac2d1b9e2bf2d Text-content-length: 245 Text-content-md5: d707abcaac07f61b5c7722d089161523 Text-content-sha1: f3667395ba74edb413f04a7acd8593ae49468f0c Content-length: 245 SVN��ZO�g�e�z�> �A { pty->slave_fd = open(pty->name, O_RDWR); fcntl(pty->slave_fd, F_SETFD, FD_CLOEXEC); } fcntl(pty->master_fd, F_SETFD, FD_CLOEXEC);fcntl(pty->master_fd, F_SETFD, FD_CLOEXEC); Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a4dd6784f7cba5704382f639c32a291 Text-delta-base-sha1: 135b535450123c9a17d57b9e2eee5e12f68a1128 Text-content-length: 59 Text-content-md5: 03408471a1809c13c3d6658eb997dd53 Text-content-sha1: 5c7b7de151fff40b4d6d632f9fe4139a76ac1247 Content-length: 59 SVN��c &���Y fcntl(serial->fd, F_SETFD, FD_CLOEXEC) Revision-number: 6918 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2006-11-24T11:59:23.298987Z K 7 svn:log V 72 IPv6 support appears broken on Vista. <4566A810.9040400@garysoft.co.uk> K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/vista-ipv6 Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1221 Text-content-md5: b6c4ccad221f0d259269cb312c66e4c2 Text-content-sha1: 48250a8d23b08f27d8579cac2c4c60bf94bda50a Content-length: 1231 PROPS-END SVN���777Summary: IPv6 support doesn't work in Windows Vista Class: bug Difficulty: taxing Priority: medium Content-type: text/x-html-body <p>We've had a report that PuTTY's IPv6 support doesn't work in Windows Vista (x86 RTM version from MSDN), and it always falls back to IPv4: <blockquote> <p>As far as I can see, connections via IPv4 work exactly as they should. With IPv6, however, it would appear that regardless of the mode I specify (either Auto or IPv6 on the Connection section of the configuration, that PuTTY always connects to the relevant IPv4 socket at the remote end, and never the IPv6 socket. This is also repeatable using the command line: i.e. <code>putty -6 -ssh my.host.name</code> also connects via IPv4. <p>It is also not possible, using Vista, to connect to an IPv6 address literal either via the PuTTY user interface itself or the command line. In my case I was trying to connect to my server 2001:8b0:127::2 but this was refused with the error message 'Unable to open connection to server 2001:8b0:127::2 gethostbyname: unknown error' <p>(I understand that Microsoft have changed the Winsock interface in Vista so this may have some bearing on the problem.) </blockquote> Revision-number: 6919 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-25T00:31:04.917366Z PROPS-END Revision-number: 6920 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-25T00:31:04.927680Z PROPS-END Revision-number: 6921 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-26T00:31:04.216924Z PROPS-END Revision-number: 6922 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-26T00:31:04.345621Z PROPS-END Revision-number: 6923 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-26T00:31:04.366465Z PROPS-END Revision-number: 6924 Prop-content-length: 113 Content-length: 113 K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-11-28T11:57:11.754247Z K 7 svn:log V 13 Content-Type PROPS-END Node-path: putty-wishlist/data/spew-lockup Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 458d7ea3c09174da860710177d2ca69e Text-delta-base-sha1: f15ee1debfbd2d2a48de31a9865c75600071bb9a Text-content-length: 32 Text-content-md5: 7dd65f7c3c42ed3c9f78057fb23d07fa Text-content-sha1: 52e3ec7c982d367304da352d9741dfef51824cf2 Content-length: 32 SVN��BG ���9 Type: text/ Revision-number: 6925 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-29T00:31:03.748921Z PROPS-END Revision-number: 6926 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2006-11-28T21:51:54.519096Z K 7 svn:log V 41 Correct an embarrassingly wrong comment. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshzlib.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 83153799abcff7cb341ee9b2ac149ab6 Text-delta-base-sha1: 109487d4819412a1f3fab31baec9df8bbc906c8d Text-content-length: 140 Text-content-md5: 9b1b14689efc4d8d98048372c4957c17 Text-content-sha1: 95ac80ecd803dc36e013e093150a78174017ae2f Content-length: 140 SVN��#q�^�q�T@two more * zero bits (BTYPE=00). Of course these are in the * wrong order (00 0), not that it matters Revision-number: 6927 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-29T00:31:03.919009Z PROPS-END Revision-number: 6928 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2006-11-29T12:26:02.124751Z K 7 svn:log V 24 Link to Internet-Draft. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/zlib-openssh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b74b40902d5135a89da35e0d4f597d3 Text-delta-base-sha1: f02064df7ed8770746532633c7a8c52f6bc720e7 Text-content-length: 633 Text-content-md5: cfcd5b9b3d1a593f7af03f60597d6371 Text-content-sha1: e5108b9529de65a1d346acdb70b30a9b15467ae5 Content-length: 633 SVN��~IV�k��+q!�d%�yx-html-body <p>(It is specified in <a href="http://tools.ietf.org/html/draft-miller-secsh-compression-delayed">draft-miller-secsh-compression-delayed</a>, currently -00.) <p> <ol> <li>Before USERAUTH_ACCEPT is received, advertise "zlib,none" in KEXINIT.</li> <li>If an incoming KEXINIT includes "zlib@openssh.com", remember that.</li> <li>After receiving USERAUTH_ACCEPT, if the current compression algorithm is "none" and KEXINIT contained "zlib@openssh.com", initiate key re-exchange.</li> <li>In KEXINITs after receiving USERAUTH_ACCEPT, advertise "zlib,zlib@openssh.com,none".</li> </ol> <p> Revision-number: 6929 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-11-30T00:31:30.321672Z PROPS-END Revision-number: 6930 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2006-11-30T18:50:04.532030Z K 7 svn:log V 25 Import Debian bug 400804 K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/puttygen-unix-perms Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 816 Text-content-md5: 2ae3f9ac494bd7e695b9f52b8419c092 Text-content-sha1: 43b298d0562a6d7559920bb3c12879f48442d4ff Content-length: 826 PROPS-END SVN���"""Summary: puttygen can create world-readable private keys Class: bug Difficulty: fun Priority: medium Present-in: 0.58 Content-type: text/x-html-body From <a href="http://bugs.debian.org/400804">Debian bug 400804</a>: <blockquote> <p>When i run puttygen (either to create a new key, or to translate an openssh-style key), the emitted ppk file (the putty private key) is created with the standard umask, which by default in debian leaves things world-readable. <p>this is in contrast to ssh-keygen from the openssh suite, which creates private keys with group and other permissions all off, no matter what the current umask. <p>I think that ssh-keygen's approach is what people expect and intend when it comes to public keys, and it's a better idea to make these things safe-by-default. </blockquote> Revision-number: 6931 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-01T00:31:05.473000Z PROPS-END Revision-number: 6932 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-02T00:31:20.884123Z PROPS-END Revision-number: 6933 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-02T00:31:21.131131Z PROPS-END Revision-number: 6934 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-02T00:31:21.287900Z PROPS-END Revision-number: 6935 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-02T00:31:21.405428Z PROPS-END Revision-number: 6936 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-02T00:31:21.447749Z PROPS-END Revision-number: 6937 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-02T00:31:21.462563Z PROPS-END Revision-number: 6938 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-02T00:31:21.472590Z PROPS-END Revision-number: 6939 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.525175Z PROPS-END Revision-number: 6940 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.661118Z PROPS-END Revision-number: 6941 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.676096Z PROPS-END Revision-number: 6942 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.687775Z PROPS-END Revision-number: 6943 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.697870Z PROPS-END Revision-number: 6944 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.708962Z PROPS-END Revision-number: 6945 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.719599Z PROPS-END Revision-number: 6946 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.730637Z PROPS-END Revision-number: 6947 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.741729Z PROPS-END Revision-number: 6948 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.751696Z PROPS-END Revision-number: 6949 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.762947Z PROPS-END Revision-number: 6950 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.773049Z PROPS-END Revision-number: 6951 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.783187Z PROPS-END Revision-number: 6952 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.793795Z PROPS-END Revision-number: 6953 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.804431Z PROPS-END Revision-number: 6954 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.814965Z PROPS-END Revision-number: 6955 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-03T00:31:28.825416Z PROPS-END Revision-number: 6956 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-04T00:31:12.154379Z PROPS-END Revision-number: 6957 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-05T00:31:03.273402Z PROPS-END Revision-number: 6958 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-05T00:31:03.350592Z PROPS-END Revision-number: 6959 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-05T00:31:03.361136Z PROPS-END Revision-number: 6960 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-05T00:31:03.385264Z PROPS-END Revision-number: 6961 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-06T00:31:02.885639Z PROPS-END Revision-number: 6962 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-06T00:31:02.963012Z PROPS-END Revision-number: 6963 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-06T00:31:02.992095Z PROPS-END Revision-number: 6964 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-06T00:31:03.014232Z PROPS-END Revision-number: 6965 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-06T00:31:03.023893Z PROPS-END Revision-number: 6966 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-06T00:31:03.034022Z PROPS-END Revision-number: 6967 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-07T00:31:02.197836Z PROPS-END Revision-number: 6968 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-08T00:31:03.793759Z PROPS-END Revision-number: 6969 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-08T00:31:03.916686Z PROPS-END Revision-number: 6970 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-08T00:31:03.940653Z PROPS-END Revision-number: 6971 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:03.243061Z PROPS-END Revision-number: 6972 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:03.319387Z PROPS-END Revision-number: 6973 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:03.329248Z PROPS-END Revision-number: 6974 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:03.339105Z PROPS-END Revision-number: 6975 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:03.348806Z PROPS-END Revision-number: 6976 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:03.358806Z PROPS-END Revision-number: 6977 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:03.370571Z PROPS-END Revision-number: 6978 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2006-12-09T15:44:31.200090Z K 7 svn:log V 100 Set FD_CLOEXEC in a little convenience function that does the right thing with F_GETFD and F_SETFD. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f1c4ce6a1bd0db7c75ca82bb90fe1799 Text-delta-base-sha1: 280538206e15df2aaf615f15387e551e24a60c76 Text-content-length: 48 Text-content-md5: 1f74e2ee894ff029c125d5dfb0ebc4f6 Text-content-sha1: 6fc26bf9f881b2d6178d9d03db7d1a65ef689519 Content-length: 48 SVN��Np ���C uxmisc.c */ int cloexec(in Node-path: putty/unix/uxagentc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 88a2296722fc9a9bbd3b6d21c7d5eecf Text-delta-base-sha1: fd621c044b9b132f732b56fa4d76442bb3e2816f Text-content-length: 33 Text-content-md5: 19b5d552085934cc7736798784efbc62 Text-content-sha1: a38369b19f59af20a1a55004d19e6aeab881253e Content-length: 33 SVN��. �\��3{cloexec(sock Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a77e4a9b8a38e644cbde9193275a5bcd Text-delta-base-sha1: 946780970903706f4abfaa6e08dac0693a43ceab Text-content-length: 290 Text-content-md5: 6dee1d320fa4271f5231b35d6d6a7cc2 Text-content-sha1: 80cc67aafbedccb6d706f4ba8806739592c08fab Content-length: 290 SVN��w\�N)R/* * PuTTY miscellaneous Unix stuff */ #include <fcntl.h> /* * Set FD_CLOEXEC on a file descriptor */ int cloexec(int fd) { int fdflags; fdflags = fcntl(fd, F_GETFD); if (fdflags == -1) return -1; return fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC); } Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c8384507a8262b235c4f84bd14a79c7a Text-delta-base-sha1: 2ece0feb1ab397f0b069547e4f0dbf5fd52ef1d9 Text-content-length: 48 Text-content-md5: f6b9cca35f2f26994b555e259386098e Text-content-sha1: a786c980aa7ef83389ebb236d7e4ece2517bc45a Content-length: 48 SVN��]�G��Pc�4Ocloexec(scloexec(s Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d707abcaac07f61b5c7722d089161523 Text-delta-base-sha1: f3667395ba74edb413f04a7acd8593ae49468f0c Text-content-length: 101 Text-content-md5: 4e1fb4b9d351185c86f111aa647c291e Text-content-sha1: 791411483124e4441f48d4a864565b342b5c059a Content-length: 101 SVN��NA���D�@�lcloexec(pty->slave_fdcloexec(pty->master_fdcloexec(pty->master_fd Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 03408471a1809c13c3d6658eb997dd53 Text-delta-base-sha1: 5c7b7de151fff40b4d6d632f9fe4139a76ac1247 Text-content-length: 39 Text-content-md5: 148d691de81b3e96d9302d1b6c642626 Text-content-sha1: 22bca88b8a0e5c55db8d3c8e2a2e75721ec9bca0 Content-length: 39 SVN��} ���Z6cloexec(serial->fd Revision-number: 6979 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:04.120937Z PROPS-END Revision-number: 6980 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:04.131156Z PROPS-END Revision-number: 6981 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:04.142324Z PROPS-END Revision-number: 6982 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:04.152707Z PROPS-END Revision-number: 6983 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:04.162569Z PROPS-END Revision-number: 6984 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-10T00:31:04.172995Z PROPS-END Revision-number: 6985 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-11T00:31:05.614373Z PROPS-END Revision-number: 6986 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-11T00:31:05.701200Z PROPS-END Revision-number: 6987 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-11T00:31:05.719513Z PROPS-END Revision-number: 6988 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-11T00:31:05.730053Z PROPS-END Revision-number: 6989 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-12T00:31:00.239543Z PROPS-END Revision-number: 6990 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-12T00:31:00.360594Z PROPS-END Revision-number: 6991 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-12T00:31:00.371325Z PROPS-END Revision-number: 6992 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-12T00:31:00.381126Z PROPS-END Revision-number: 6993 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-12T00:31:00.392007Z PROPS-END Revision-number: 6994 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-13T00:31:02.140611Z PROPS-END Revision-number: 6995 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-13T00:31:02.231903Z PROPS-END Revision-number: 6996 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2006-12-15T23:25:51.688788Z K 7 svn:log V 42 Mapping SFTP to drive letter, not likely. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/sftp-as-drive Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 469 Text-content-md5: 2d6ca47fcbd629eac4983696e53b71a6 Text-content-sha1: c1a10089ba96151a30cef204d7dff4d9d77a76ef Content-length: 479 PROPS-END SVN���GGGSummary: Present SFTP as a mapped drive or file system Class: wish Difficulty: tricky Priority: never Content-type: text/plain It's sometimes suggested that PSFTP would be more useful if it could present an SFTP connection as a mapped drive in Windows. This would be useful, but it would also be a lot of effort, would involve lots of nasty windows-specific low-level code, and would be quite a long way from PuTTY's core mission of terminal emulation. Revision-number: 6997 Prop-content-length: 119 Content-length: 119 K 10 svn:author V 3 ben K 8 svn:date V 27 2006-12-15T23:28:48.609108Z K 7 svn:log V 21 Bug report from Owen PROPS-END Node-path: putty-wishlist/data/unix-connreset-spin Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 944 Text-content-md5: 15ca4c185c51ef55b3f17bcea52587bc Text-content-sha1: 60ba077afa877040b4d906857fe6c5df26d57511 Content-length: 954 PROPS-END SVN���"""Summary: Unix PuTTY spins in tight loop after abnormal exit Class: bug Priority: medium Present-in: 2006-11-29 Content-type: text/plain PuTTY (development snapshot 2006-11-29) on Linux spins on the CPU after a connection has been terminated unexpectedly. (In this case, displaying a PuTTY Fatal Error dialogue box with a "Connection Reset by Peer" message in it.) stracing the putty process when it's in this state produces lots of: poll([{fd=3, events=POLLIN}, {fd=7, events=POLLIN}, {fd=5, events=POLLIN|POLLPRI, revents=POLLNVAL}], 3, -1) = 1 gettimeofday({1165238007, 805859}, NULL) = 0 gettimeofday({1165238007, 805953}, NULL) = 0 ioctl(3, FIONREAD, [0]) = 0 poll([{fd=3, events=POLLIN}, {fd=7, events=POLLIN}, {fd=5, events=POLLIN|POLLPRI, revents=POLLNVAL}], 3, -1) = 1 gettimeofday({1165238007, 806293}, NULL) = 0 gettimeofday({1165238007, 806386}, NULL) = 0 ioctl(3, FIONREAD, [0]) = 0 Revision-number: 6998 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2006-12-15T23:45:46.257792Z K 7 svn:log V 59 My thoughts on tun@openssh.com, as recorded some time ago. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/tun-openssh Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 583 Text-content-md5: 1238c9344dbf2b11b7c89deef9470a9b Text-content-sha1: 69c152a2b40f6b2d9b4c09b1861a7b1d16ad1049 Content-length: 593 PROPS-END SVN���999Summary: OpenSSH-compatible tun VPN support Class: wish Priority: never Difficulty: taxing Content-type: text/x-html-body <p>OpenSSH has a crude VPN system based on sending raw IP packets over an SSH channel. We're unlikely to implement this in PuTTY because: <ul><li>The protocol appears to have no documentation other than the OpenSSH source code. <li>From what we've been able to work out of the protocol from the sources, it's ugly and depends on the boundaries between network packets being represented by boundaries between SSH_MSG_CHANNEL_DATA messages. </ul> Revision-number: 6999 Prop-content-length: 416 Content-length: 416 K 7 svn:log V 315 I've just noticed that this page downplays the hassle involved in arranging for a Windows PuTTY to support multiple connections per process at all. Although `remove-statics' is long since done, it only covers the cross-platform code, and the Windows _front end_ still has just as many statics as ever, if not more. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-12-16T08:45:06.205036Z PROPS-END Node-path: putty-wishlist/data/multiple-connections Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9ce8db14f9858cf2aac4ba5b63ea14e3 Text-delta-base-sha1: 61fdd9ce2fb6459d55c65dd67804e7c1ac4f5e57 Text-content-length: 914 Text-content-md5: 7e65f4a79d6710d6696e9331291f7802 Text-content-sha1: bc74cb9acf49ec274a65a2afa042c987fd2839c4 Content-length: 914 SVN��7 z�&�z�{<For a start, this involves arranging to be able to run more than one connection within the same PuTTY process. The cross-platform parts of this work are long since done (see <a href="remove-statics.html">remove-statics</a>), but the Windows front end still uses a great many static variables within itself. So to even consider doing this work would mean a significant amount of restructuring of the Windows code. <p> In addition I'd want a strong guarantee of reliability (if one session crashes, can it avoid taking the other nine down?). Also I'd want to be able to configure PuTTY to be just the way it is now, because not everybody likes the idea of all their sessions being bound together in a single window; and finally I'd want to be convinced that the code size increase wouldn't be excessive. This is close to having priority "never", in fact, unless someone can convince me it's Revision-number: 7000 Prop-content-length: 903 Content-length: 903 K 8 svn:date V 27 2006-12-17T11:16:07.341286Z K 7 svn:log V 802 Initial support for HTML Help. All the ad-hoc help-file finding code and various calls to WinHelp() have been centralised into a new file winhelp.c, which in turn has been modified to detect a .CHM file as well as .HLP and select between them as appropriate. It explicitly tries to load HHCTRL.OCX and use GetProcAddress, meaning that it _should_ still work correctly on pre-HTML-Help platforms, falling gracefully back to WinHelp, but although I tested this by temporarily renaming my own HHCTRL.OCX I haven't yet been able to test it on a real HTML-Help-free platform. Also in this checkin: a new .but file and docs makefile changes to make it convenient to build the sources for a .CHM. As yet, owing to limitations of Halibut's CHM support, I'm not able to write a .CHM directly, more's the pity. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73b176ad789c1fcab7b9fb54d599daaf Text-delta-base-sha1: 13afce56bc5ebf78cb73eb7d3ff0ed4d88c9f63a Text-content-length: 70 Text-content-md5: c4e7b6a3f2a85f93a9772cc7f8cd36d5 Text-content-sha1: 23b76aa3620f4249e4e40c44dd03113d9bcb68d3 Content-length: 70 SVN��D�A��eA� "�-�o0 winhelp htmlhelpwinhelpwinhelp Node-path: putty/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e51c2f6f3c6de81a528364e890b537f Text-delta-base-sha1: 9359419dbd1329817a34a9cfaa990c9197ddee50 Text-content-length: 120 Text-content-md5: 3d5aad6feb45e55d73da5bc8ac712d93 Text-content-sha1: 440e1596710cff0898cc83f6c2f7737dc06976f9 Content-length: 120 SVN�� a�1�P�o/chm: putty.hhp putty.hhp: $(INPUTS) chm.but $(HALIBUT) --html $(INPUTS) chm.but *.hh[pck] *.chm Node-path: putty/doc/chm.but Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 637 Text-content-md5: df3a6bff0e30746fce5521285018764f Text-content-sha1: 4f4a2744e1bf911ed099d7045da98f84ab4a0036 Content-length: 647 PROPS-END SVN���ooo\# File containing the magic HTML configuration directives to create \# an MS HTML Help project. We put this on the end of the PuTTY \# docs build command line to build the HHP and friends. \cfg{html-leaf-level}{infinite} \cfg{html-leaf-contains-contents}{false} \cfg{html-suppress-navlinks}{true} \cfg{html-suppress-address}{true} \cfg{html-contents-filename}{index.html} \cfg{html-template-filename}{%k.html} \cfg{html-template-fragment}{%k} \cfg{html-mshtmlhelp-chm}{putty.chm} \cfg{html-mshtmlhelp-project}{putty.hhp} \cfg{html-mshtmlhelp-contents}{putty.hhc} \cfg{html-mshtmlhelp-index}{putty.hhk} \versionid $Id$ Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a462cc214181d4c5a167204f8906b9c Text-delta-base-sha1: 2d61583f2e5ed5953457d2ada5d5320fc6524973 Text-content-length: 82 Text-content-md5: 51938f07408b662d4a83d1b7f5572a48 Text-content-sha1: d19bb4072cc61d27e730a62d036406be0bb98d24 Content-length: 82 SVN��Iv2�Z��^^� =some hlaunch_help(hwnd, c->ctrl->generic.helpctx.p Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b66034de08ed6fb756ce08879642a7c Text-delta-base-sha1: 2f40c06d4bc2e273b19f795a680f320124a46cd3 Text-content-length: 256 Text-content-md5: 134ab020ca77164d9453800eed989dd9 Text-content-sha1: e0e376b33bb0c4b7310d469fc5742a7f890f60cd Content-length: 256 SVN��,*H����5�6�T�e��#was_help() if (!winctrl_context_help(&dp, hwnd, ((LPHELPINFO)lParam)->iCtrlId)) MessageBeep(0); break; case WM_CLOSE: quit_help(hwnd);launch_help(hwnd, NULL);has_help(has_help( Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a5bb88390be0e3540c27083a7c07429d Text-delta-base-sha1: 98a0fb09600d2a7f1a318c9639178d0a1c875889 Text-content-length: 863 Text-content-md5: 58d3f233c05ae251781cfc74b2a85263 Text-content-sha1: 6ef0bca9d043d8592316611ef7ab5a501e6eb6b0 Content-length: 863 SVN����$�$��=Z�2�KP�z]init_help();as_help() shutdown_help();launch_help(hwnd, NULL if (left_alt && wParam == VK_RETURN && cfg.fullscreenonaltenter && (cfg.resize_action != RESIZE_DISABLED)) { if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) != KF_REPEAT) flip_full_screen(); return -1; } /* Control-Numlock for app-keypad mode switch */ if (wParam == VK_PAUSE && shift_state == 2) { term->app_keypad_keys ^= 1; return 0; } /* Nethack keypad */ if (cfg.nethack_keypad && !left_alt) { switch (wParam) { case VK_NUMPAD1: *p++ = "bB\002\002"[shift_state & 3]; return p - output; case VK_NUMPAD2: *p++ = "jJ\012\012"[shift_state & 3]; return p - output; case VK_NUMPAD3: *p++ = "nN\016\016"[shift_state & 3]; return p - output; case VK_NUMPAD4:�0S��S] Node-path: putty/windows/winhelp.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2962 Text-content-md5: 2eccbb789ace488571f5216d59e20729 Text-content-sha1: 9f561e120d3a88efc285560d4d6ee0c2fd03d963 Content-length: 2972 PROPS-END SVN���/* * winhelp.c: centralised functions to launch Windows help files, * and to decide whether to use .HLP or .CHM help in any given * situation. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include "putty.h" #include <htmlhelp.h> typedef HWND (CALLBACK *htmlhelp_t)(HWND, LPCSTR, UINT, DWORD); static char *help_path, *chm_path; static int help_has_contents; static int requested_help; static DWORD html_help_cookie; static htmlhelp_t htmlhelp; void init_help(void) { char b[2048], *p, *q, *r; FILE *fp; GetModuleFileName(NULL, b, sizeof(b) - 1); r = b; p = strrchr(b, '\\'); if (p && p >= r) r = p+1; q = strrchr(b, ':'); if (q && q >= r) r = q+1; strcpy(r, PUTTY_HELP_FILE); if ( (fp = fopen(b, "r")) != NULL) { help_path = dupstr(b); fclose(fp); } else help_path = NULL; strcpy(r, PUTTY_HELP_CONTENTS); if ( (fp = fopen(b, "r")) != NULL) { help_has_contents = TRUE; fclose(fp); } else help_has_contents = FALSE; strcpy(r, PUTTY_CHM_FILE); if ( (fp = fopen(b, "r")) != NULL) { chm_path = dupstr(b); fclose(fp); } else chm_path = NULL; if (chm_path) { HINSTANCE dllHH = LoadLibrary("hhctrl.ocx"); if (dllHH) { htmlhelp = (htmlhelp_t)GetProcAddress(dllHH, "HtmlHelpA"); if (!htmlhelp) FreeLibrary(dllHH); } if (htmlhelp) htmlhelp(NULL, NULL, HH_INITIALIZE, (DWORD)&html_help_cookie); else chm_path = NULL; } } void shutdown_help(void) { if (chm_path) htmlhelp(NULL, NULL, HH_UNINITIALIZE, html_help_cookie); } int has_help(void) { /* * FIXME: it would be nice here to disregard help_path on * platforms that didn't have WINHLP32. But that's probably * unrealistic, since even Vista will have it if the user * specifically downloads it. */ return (help_path || chm_path); } void launch_help(HWND hwnd, const char *topic) { if (topic) { int colonpos = strcspn(topic, ":"); if (chm_path) { char *fname; assert(topic[colonpos] != '\0'); fname = dupprintf("%s::/%s.html>main", chm_path, topic + colonpos + 1); htmlhelp(hwnd, fname, HH_DISPLAY_TOPIC, 0); sfree(fname); } else if (help_path) { char *cmd = dupprintf("JI(`',`%.*s')", colonpos, topic); WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); sfree(cmd); } } else { if (chm_path) { htmlhelp(hwnd, chm_path, HH_DISPLAY_TOPIC, 0); } else if (help_path) { WinHelp(hwnd, help_path, help_has_contents ? HELP_FINDER : HELP_CONTENTS, 0); } } requested_help = TRUE; } void quit_help(HWND hwnd) { if (requested_help) { if (chm_path) { htmlhelp(NULL, NULL, HH_CLOSE_ALL, 0); } else if (help_path) { WinHelp(hwnd, help_path, HELP_QUIT, 0); } requested_help = FALSE; } } Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 210b88f7e823b162b53ae71ae2d3763a Text-delta-base-sha1: 4f7332543dd6ecfda128de1493f50b637c05086b Text-content-length: 10095 Text-content-md5: 9ddff474265593cdef1b5db77593ffa4 Text-content-sha1: 61275659ee3896bb7c7e31fa59ff0956c26656e6 Content-length: 10095 SVN��mYM�#� �C�p�D?�H{�G:�Hy2�F=I�E>�Y|��x!�k|�e]:config-hostname" #define WINHELP_CTX_session_saved "session.saved:config-saving" #define WINHELP_CTX_session_coe "session.coe:config-closeonexit" #define WINHELP_CTX_logging_main "logging.main:config-logging" #define WINHELP_CTX_logging_filename "logging.filename:config-logfilename" #define WINHELP_CTX_logging_exists "logging.exists:config-logfileexists" #define WINHELP_CTX_logging_flush "logging.flush:config-logflush" #define WINHELP_CTX_logging_ssh_omit_password "logging.ssh.omitpassword:config-logssh" #define WINHELP_CTX_logging_ssh_omit_data "logging.ssh.omitdata:config-logssh" #define WINHELP_CTX_keyboard_backspace "keyboard.backspace:config-backspace" #define WINHELP_CTX_keyboard_homeend "keyboard.homeend:config-homeend" #define WINHELP_CTX_keyboard_funkeys "keyboard.funkeys:config-:config-appkeypad" #define WINHELP_CTX_keyboard_appcursor "keyboard.appcursor:config-appcursor" #define WINHELP_CTX_keyboard_nethack "keyboard.nethack:config-nethack" #define WINHELP_CTX_keyboard_compose "keyboard.compose:config-compose" #define WINHELP_CTX_keyboard_ctrlalt "keyboard.ctrlalt:config-ctrlalt" #define WINHELP_CTX_features_application "features.application:config-features-application" #define WINHELP_CTX_features_mouse "features.mouse:config-features-mouse" #define WINHELP_CTX_features_resize "features.resize:config-features-resize" #define WINHELP_CTX_features_altscreen "features.altscreen:config-features-altscreen" #define WINHELP_CTX_features_retitle "features.retitle:config-features-retitle" #define WINHELP_CTX_features_qtitle "features.qtitle:config-features-qtitle" #define WINHELP_CTX_features_dbackspace "features.dbackspace:config-features-dbackspace" #define WINHELP_CTX_features_charset "features.charset:config-features-charset" #define WINHELP_CTX_features_arabicshaping "features.arabicshaping:config-features-shaping" #define WINHELP_CTX_features_bidi "features.bidi:config-features-bidi" #define WINHELP_CTX_terminal_autowrap "terminal.autowrap:config-autowrap" #define WINHELP_CTX_terminal_decom "terminal.decom:config-decom" #define WINHELP_CTX_terminal_lfhascr "terminal.lfhascr:config-crlf" #define WINHELP_CTX_terminal_bce "terminal.bce:config-erase" #define WINHELP_CTX_terminal_blink "terminal.blink:config-blink" #define WINHELP_CTX_terminal_answerback "terminal.answerback:config-answerback" #define WINHELP_CTX_terminal_localecho "terminal.localecho:config-localecho" #define WINHELP_CTX_terminal_localedit "terminal.localedit:config-localedit" #define WINHELP_CTX_terminal_printing "terminal.printing:config-printing" #define WINHELP_CTX_bell_style "bell.style:config-bellstyle" #define WINHELP_CTX_bell_taskbar "bell.taskbar:config-belltaskbar" #define WINHELP_CTX_bell_overload "bell.overload:config-bellovl" #define WINHELP_CTX_window_size "window.size:config-winsize" #define WINHELP_CTX_window_resize "window.resize:config-winsizelock" #define WINHELP_CTX_window_scrollback "window.scrollback:config-scrollback" #define WINHELP_CTX_window_erased "window.erased:config-erasetoscrollback" #define WINHELP_CTX_behaviour_closewarn "behaviour.closewarn:config-warnonclose" #define WINHELP_CTX_behaviour_altf4 "behaviour.altf4:config-altf4" #define WINHELP_CTX_behaviour_altspace "behaviour.altspace:config-altspace" #define WINHELP_CTX_behaviour_altonly "behaviour.altonly:config-altonly" #define WINHELP_CTX_behaviour_alwaysontop "behaviour.alwaysontop:config-alwaysontop" #define WINHELP_CTX_behaviour_altenter "behaviour.altenter:config-fullscreen" #define WINHELP_CTX_appearance_cursor "appearance.cursor:config-cursor" #define WINHELP_CTX_appearance_font "appearance.font:config-font" #define WINHELP_CTX_appearance_title "appearance.title:config-title" #define WINHELP_CTX_appearance_hidemouse "appearance.hidemouse:config-mouseptr" #define WINHELP_CTX_appearance_border "appearance.border:config-win:config-:config-:config-:config-keepalive" #define WINHELP_CTX_connection_nodelay "connection.nodelay:config-nodelay" #define WINHELP_CTX_connection_ipversion "connection.ipversion:config-address-family:config-tcp-keepalives" #define WINHELP_CTX_proxy_type "proxy.type:config-proxy-type" #define WINHELP_CTX_proxy_main "proxy.main:config-proxy" #define WINHELP_CTX_proxy_exclude "proxy.exclude:config-proxy-exclude" #define WINHELP_CTX_proxy_dns "proxy.dns:config-proxy-dns" #define WINHELP_CTX_proxy_auth "proxy.auth:config-proxy-auth" #define WINHELP_CTX_proxy_command "proxy.command:config-proxy-command" #define WINHELP_CTX_telnet_environ "telnet.environ:config-environ" #define WINHELP_CTX_telnet_oldenviron "telnet.oldenviron:config-oldenviron" #define WINHELP_CTX_telnet_passive "telnet.passive:config-ptelnet" #define WINHELP_CTX_telnet_specialkeys "telnet.specialkeys:config-telnetkey" #define WINHELP_CTX_telnet_newline "telnet.newline:config-telnetnl" #define WINHELP_CTX_rlogin_localuser "rlogin.localuser:config-rlogin-localuser" #define WINHELP_CTX_ssh_nopty "ssh.nopty:config-ssh-pty" #define WINHELP_CTX_ssh_ttymodes "ssh.ttymodes:config-ttymodes" #define WINHELP_CTX_ssh_noshell "ssh.noshell:config-ssh-noshell" #define WINHELP_CTX_ssh_ciphers "ssh.ciphers:config-ssh-encryption" #define WINHELP_CTX_ssh_protocol "ssh.protocol:config-ssh-prot" #define WINHELP_CTX_ssh_command "ssh.command:config-command" #define WINHELP_CTX_ssh_compress "ssh.compress:config-ssh-comp" #define WINHELP_CTX_ssh_kexlist "ssh.kex.order:config-ssh-kex-order" #define WINHELP_CTX_ssh_kex_repeat "ssh.kex.repeat:config-ssh-kex-rekey" #define WINHELP_CTX_ssh_auth_bypass "ssh.auth.bypass:config-ssh-noauth" #define WINHELP_CTX_ssh_auth_privkey "ssh.auth.privkey:config-ssh-privkey" #define WINHELP_CTX_ssh_auth_agentfwd "ssh.auth.agentfwd:config-ssh-agentfwd" #define WINHELP_CTX_ssh_auth_changeuser "ssh.auth.changeuser:config-ssh-changeuser" #define WINHELP_CTX_ssh_auth_pageant "ssh.auth.pageant:config-ssh-tryagent" #define WINHELP_CTX_ssh_auth_tis "ssh.auth.tis:config-ssh-tis" #define WINHELP_CTX_ssh_auth_ki "ssh.auth.ki:config-ssh-ki" #define WINHELP_CTX_selection_buttons "selection.buttons:config-mouse" #define WINHELP_CTX_selection_shiftdrag "selection.shiftdrag:config-mouseshift" #define WINHELP_CTX_selection_rect "selection.rect:config-rectselect" #define WINHELP_CTX_selection_charclasses "selection.charclasses:config-charclasses" #define WINHELP_CTX_selection_linedraw "selection.linedraw:config-linedrawpaste" #define WINHELP_CTX_selection_rtf "selection.rtf:config-rtfpaste" #define WINHELP_CTX_colours_ansi "colours.ansi:config-ansicolour" #define WINHELP_CTX_colours_xterm256 "colours.xterm256:config-xtermcolour" #define WINHELP_CTX_colours_bold "colours.bold:config-boldcolour" #define WINHELP_CTX_colours_system "colours.system:config-syscolour" #define WINHELP_CTX_colours_logpal "colours.logpal:config-logpalette" #define WINHELP_CTX_colours_config "colours.config:config-colourcfg" #define WINHELP_CTX_translation_codepage "translation.codepage:config-charset" #define WINHELP_CTX_translation_cjk_ambig_wide "translation.cjkambigwide:config-cjk-ambig-wide" #define WINHELP_CTX_translation_cyrillic "translation.cyrillic:config-cyr" #define WINHELP_CTX_translation_linedraw "translation.linedraw:config-linedraw" #define WINHELP_CTX_ssh_tunnels_x11 "ssh.tunnels.x11:config-ssh-x11" #define WINHELP_CTX_ssh_tunnels_x11auth "ssh.tunnels.x11auth:config-ssh-:config-ssh-:config-ssh-portfwd-localhost" #define WINHELP_CTX_ssh_tunnels_portfwd_ipversion "ssh.tunnels.portfwd.ipversion:config-ssh-portfwd-address-family" #define WINHELP_CTX_ssh_bugs_ignore1 "ssh.bugs.ignore1:config-ssh-bug-ignore1" #define WINHELP_CTX_ssh_bugs_plainpw1 "ssh.bugs.plainpw1:config-ssh-bug-plainpw1" #define WINHELP_CTX_ssh_bugs_rsa1 "ssh.bugs.rsa1:config-ssh-bug-rsa1" #define WINHELP_CTX_ssh_bugs_hmac2 "ssh.bugs.hmac2:config-ssh-bug-hmac2" #define WINHELP_CTX_ssh_bugs_derivekey2 "ssh.bugs.derivekey2:config-ssh-bug-derivekey2" #define WINHELP_CTX_ssh_bugs_rsapad2 "ssh.bugs.rsapad2:config-ssh-bug-sig" #define WINHELP_CTX_ssh_bugs_pksessid2 "ssh.bugs.pksessid2:config-ssh-bug-pksessid2" #define WINHELP_CTX_ssh_bugs_rekey2 "ssh.bugs.rekey2:config-ssh-bug-rekey" #define WINHELP_CTX_serial_line "serial.line:config-serial-line" #define WINHELP_CTX_serial_speed "serial.speed:config-serial-speed" #define WINHELP_CTX_serial_databits "serial.databits:config-serial-databits" #define WINHELP_CTX_serial_stopbits "serial.stopbits:config-serial-stopbits" #define WINHELP_CTX_serial_parity "serial.parity:config-serial-parity" #define WINHELP_CTX_serial_flow "serial.flow:config-serial-flow" #define WINHELP_CTX_pageant_general "pageant.general:pageant" #define WINHELP_CTX_pageant_keylist "pageant.keylist:pageant-mainwin-keylist" #define WINHELP_CTX_pageant_addkey "pageant.addkey:pageant-mainwin-addkey" #define WINHELP_CTX_pageant_remkey "pageant.remkey:pageant-mainwin-remkey" #define WINHELP_CTX_pgpfingerprints "pgpfingerprints:pgpkeys" #define WINHELP_CTX_puttygen_general "puttygen.general:pubkey-puttygen" #define WINHELP_CTX_puttygen_keytype "puttygen.keytype:puttygen-keytype" #define WINHELP_CTX_puttygen_bits "puttygen.bits:puttygen-strength" #define WINHELP_CTX_puttygen_generate "puttygen.generate:puttygen-generate" #define WINHELP_CTX_puttygen_fingerprint "puttygen.fingerprint:puttygen-fingerprint" #define WINHELP_CTX_puttygen_comment "puttygen.comment:puttygen-comment" #define WINHELP_CTX_puttygen_passphrase "puttygen.passphrase:puttygen-passphrase" #define WINHELP_CTX_puttygen_savepriv "puttygen.savepriv:puttygen-savepriv" #define WINHELP_CTX_puttygen_savepub "puttygen.savepub:puttygen-savepub" #define WINHELP_CTX_puttygen_pastekey "puttygen.pastekey:puttygen-pastekey" #define WINHELP_CTX_puttygen_load "puttygen.load:puttygen-load" #define WINHELP_CTX_puttygen_conversions "puttygen.conversions:puttygen-conversions:errors-hostkey-:errors-hostkey-wrong:errors-cant-load-key" #define WINHELP_CTXID_errors_cantloadkey 3 #define WINHELP_CTX_option_cleanup "options.cleanup:using-:pgpkeys" #define WINHELP_CTXID_pgp_fingerprints 5 Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c8a5edd7fc0970ab42dabc79ead6980f Text-delta-base-sha1: f1292356d51286fdcd5c210f647a404ca59f728b Text-content-length: 1094 Text-content-md5: 80aa3c5ccd894eff1125b8d3f2aa1708 Text-content-sha1: cdff007bff7bf4fe5557e62789fee90f7bd20f1d Content-length: 1094 SVN��rm{=�8��'@�v�1�#�A�ec�f[�kW�ET�a.t�*e�a!� x�J �p5�}#�MU as_help()as_help() launch_help(hwnd, WINHELP_CTX_puttygen_general);WINHELP_CTX_puttygen_generateWINHELP_CTX_puttygen_pastekeyWINHELP_CTX_puttygen_fingerprintWINHELP_CTX_puttygen_commentWINHELP_CTX_puttygen_passphraseWINHELP_CTX_puttygen_load; break; case IDC_SAVESTATIC: case IDC_SAVE: topic = WINHELP_CTX_puttygen_savepriv; break; case IDC_SAVEPUB: topic = WINHELP_CTX_puttygen_savepubWINHELP_CTX_puttygen_keytypeWINHELP_CTX_puttygen_bitsWINHELP_CTX_puttygen_conversions; break; } if (topic) { launch_help(hwnd, topic) quit_help(hwnd); EndDialog(hwnd, 1); return 0; } return 0; } void cleanup_exit(int code) { shutdown_help(); exit(code); int retinit_help(); = DialogBox(hinst, MAKEINTRESOURCE(201), NULL, MainDlgProc) != IDOK; cleanup_exit(ret); return ret; /* just in case optimiser complains */ } Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b851911ea4fd4ae3bb2cc855fdb5260 Text-delta-base-sha1: 12f67f2dc4e5d4b15c1ad9a2a69e39edf22a0071 Text-content-length: 616 Text-content-md5: 753a36a517ce2c489dc9401fcee060ce Text-content-sha1: 89306536d34d3427e1b46337122f37f4179f7335 Content-length: 616 SVN��&$L�w���,6�H:�k�kz�<)�2d�o%�MI�ogas_help() launch_help(hwnd, WINHELP_CTX_pageant_general);WINHELP_CTX_pageant_keylist; break; case 101: topic = WINHELP_CTX_pageant_addkey; break; case 102: topic = WINHELP_CTX_pageant_remkey; break; } if (topic) { launch_help(hwnd, topic) launch_help(hwnd, WINHELP_CTX_pageant_general); quit_help(hwnd); { shutdown_help(); exit(code); init_help();as_help() cleanup_exit(msg.wParam); return msg.wParam; /* just in case optimiser complains */ } Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b7b984ed15b47ec1b3a39b5101257ef Text-delta-base-sha1: d0495b7aaf36f312dd83732195e7d9e9b6869e3f Text-content-length: 224 Text-content-md5: c847d652ce176430d1deb7d5d4ca33ae Text-content-sha1: ffc0dd0beb7738657823c51b80bf1e36e51decdb Content-length: 224 SVN��gLB�q��_a/�:-CHM_FILE "putty.chmHelp file stuff in winhelp.c. */ void init_help(void); void shutdown_help(void); int has_help(void); void launch_help(HWND hwnd, const char *topic); void quit_help(HWND hwnd) Node-path: putty/windows/winutils.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df251440cda59accf7f9dc7465e18c46 Text-delta-base-sha1: 2620f2b1b116edc4cc0a89cd073acf23dc10225e Text-content-length: 452 Text-content-md5: 752c2c2eebd7dbc297f3fa8656c516b5 Text-content-sha1: 295b694f51775bd8cd27365291e0efece4d6af9b Content-length: 452 SVN��}n#� ��6�;Bchar *context = NULL; #define CHECK_CTX(name) \ do { \ if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \ context = WINHELP_CTX_ ## name; \ } while (0) CHECK_CTX(errors_hostkey_absent); CHECK_CTX(errors_hostkey_changed); CHECK_CTX(errors_cantloadkey); CHECK_CTX(option_cleanup); CHECK_CTX(pgp_fingerprints); #undef CHECK_CTX if (context) launch_help(hwnd, context);as_help() Revision-number: 7001 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2006-12-17T17:46:12.673960Z K 7 svn:log V 35 Sort out line-endings on new file. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winhelp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 40 Text-delta: true Text-delta-base-md5: 2eccbb789ace488571f5216d59e20729 Text-delta-base-sha1: 9f561e120d3a88efc285560d4d6ee0c2fd03d963 Text-content-length: 2840 Text-content-md5: df0b904f65fc04477ce191c9b19f57a4 Text-content-sha1: 71bcde9ab3a39e1836ebe8172f49ce3573661725 Content-length: 2880 K 13 svn:eol-style V 6 native PROPS-END SVN��  /* * winhelp.c: centralised functions to launch Windows help files, * and to decide whether to use .HLP or .CHM help in any given * situation. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include "putty.h" #include <htmlhelp.h> typedef HWND (CALLBACK *htmlhelp_t)(HWND, LPCSTR, UINT, DWORD); static char *help_path, *chm_path; static int help_has_contents; static int requested_help; static DWORD html_help_cookie; static htmlhelp_t htmlhelp; void init_help(void) { char b[2048], *p, *q, *r; FILE *fp; GetModuleFileName(NULL, b, sizeof(b) - 1); r = b; p = strrchr(b, '\\'); if (p && p >= r) r = p+1; q = strrchr(b, ':'); if (q && q >= r) r = q+1; strcpy(r, PUTTY_HELP_FILE); if ( (fp = fopen(b, "r")) != NULL) { help_path = dupstr(b); fclose(fp); } else help_path = NULL; strcpy(r, PUTTY_HELP_CONTENTS); if ( (fp = fopen(b, "r")) != NULL) { help_has_contents = TRUE; fclose(fp); } else help_has_contents = FALSE; strcpy(r, PUTTY_CHM_FILE); if ( (fp = fopen(b, "r")) != NULL) { chm_path = dupstr(b); fclose(fp); } else chm_path = NULL; if (chm_path) { HINSTANCE dllHH = LoadLibrary("hhctrl.ocx"); if (dllHH) { htmlhelp = (htmlhelp_t)GetProcAddress(dllHH, "HtmlHelpA"); if (!htmlhelp) FreeLibrary(dllHH); } if (htmlhelp) htmlhelp(NULL, NULL, HH_INITIALIZE, (DWORD)&html_help_cookie); else chm_path = NULL; } } void shutdown_help(void) { if (chm_path) htmlhelp(NULL, NULL, HH_UNINITIALIZE, html_help_cookie); } int has_help(void) { /* * FIXME: it would be nice here to disregard help_path on * platforms that didn't have WINHLP32. But that's probably * unrealistic, since even Vista will have it if the user * specifically downloads it. */ return (help_path || chm_path); } void launch_help(HWND hwnd, const char *topic) { if (topic) { int colonpos = strcspn(topic, ":"); if (chm_path) { char *fname; assert(topic[colonpos] != '\0'); fname = dupprintf("%s::/%s.html>main", chm_path, topic + colonpos + 1); htmlhelp(hwnd, fname, HH_DISPLAY_TOPIC, 0); sfree(fname); } else if (help_path) { char *cmd = dupprintf("JI(`',`%.*s')", colonpos, topic); WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); sfree(cmd); } } else { if (chm_path) { htmlhelp(hwnd, chm_path, HH_DISPLAY_TOPIC, 0); } else if (help_path) { WinHelp(hwnd, help_path, help_has_contents ? HELP_FINDER : HELP_CONTENTS, 0); } } requested_help = TRUE; } void quit_help(HWND hwnd) { if (requested_help) { if (chm_path) { htmlhelp(NULL, NULL, HH_CLOSE_ALL, 0); } else if (help_path) { WinHelp(hwnd, help_path, HELP_QUIT, 0); } requested_help = FALSE; } } Revision-number: 7002 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 32 Minor style tweaks for the CHM. K 10 svn:author V 5 simon K 8 svn:date V 27 2006-12-19T10:28:44.362020Z PROPS-END Node-path: putty/doc/chm.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df3a6bff0e30746fce5521285018764f Text-delta-base-sha1: 4f4a2744e1bf911ed099d7045da98f84ab4a0036 Text-content-length: 132 Text-content-md5: 966929f7190302107d198d654560ec81 Text-content-sha1: 5c88b04ac956acd7006c9319c14117cfaa03ce31 Content-length: 132 SVN��oSs�`�scfg{html-body-end}{} \cfg{html-head-end}{<link rel="stylesheet" type="text/css" href="chm.css">} \versionid $Id$ Node-path: putty/doc/chm.css Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 268 Text-content-md5: ea32a6e79ab25e35da1ab4080691691e Text-content-sha1: ea8f1bf4e6f9e36eeec2ecf9bd8383c8eb34eb4e Content-length: 278 PROPS-END SVN���~~~/* Stylesheet for a Windows .CHM help file */ body { font-size: 75%; font-family: Verdana, Arial, Helvetica, Sans-Serif; } h1 { font-weight: bold; font-size: 150%; } h2 { font-weight: bold; font-size: 130%; } h3 { font-weight: bold; font-size: 120%; } Revision-number: 7003 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-22T00:31:09.795084Z PROPS-END Revision-number: 7004 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2006-12-21T20:00:18.119177Z K 7 svn:log V 80 Jeroen Massar kindly volunteered to have his contact details added to this bug. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/vista-ipv6 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b6c4ccad221f0d259269cb312c66e4c2 Text-delta-base-sha1: 48250a8d23b08f27d8579cac2c4c60bf94bda50a Text-content-length: 279 Text-content-md5: 507c53c5a7ed7acdfdd62b4d0c1de290 Text-content-sha1: f7442b0aff997c65bb31e88d689a33f0616f847b Content-length: 279 SVN��7;�7� <p><b>SGT, 2006-12-21</b>: Jeroen Massar <<a href="mailto:jeroen@unfix.org">jeroen@unfix.org</a>>, the author of PuTTY's IPv6 code, is investigating this. Users experiencing this bug might like to contact him and see if they can help solve the mystery. Revision-number: 7005 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 putty.stoic.jp, vine.stoic.jp K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-12-22T23:59:52.030379Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 20385ab01d39535c475c1bf1961b88ba Text-delta-base-sha1: 567195cb6513c66dab1ca6d9d2c012d82d954ec0 Text-content-length: 186 Text-content-md5: 15091bdf8036d6d31bebfdd33d1ca5ad Text-content-sha1: 3705fae34302cf58d8588977f715fa76c0837e66 Content-length: 186 SVN��f@ �Q��Pputty.stoic.jp/">putty.stoic.jp</a> in Japan<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a href="http://vine.stoic.jp/mirrors/putty/">vine.stoic.jp</a> in Japan Revision-number: 7006 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-24T00:31:08.965144Z PROPS-END Revision-number: 7007 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2006-12-23T09:04:27.896606Z K 7 svn:log V 110 After discussion with Jeroen Massar, here's a patch (mostly his) which we think fixes the vista-ipv6 problem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e3dd65d5cec663addb94ec98c35353e Text-delta-base-sha1: 4a73879de9023e38264e158705a905eece48ac8a Text-content-length: 119 Text-content-md5: a67f778c4dc8d09a9475c27ff8abfd3e Text-content-sha1: b0731b7b3ed35d1e6377c14584e0cc3076c34d22 Content-length: 119 SVN��w a�B�a�T=/* If we don't have a context yet (eg winnet.c init) then skip entirely */ if (!ctx) return; Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f1b6a256cf90bab279855ce0bf492317 Text-delta-base-sha1: 2a5f47d181bce2f4a94f71eafd6ede79f1cb14e0 Text-content-length: 20 Text-content-md5: 04fc8971d7bfcb88d774c32b67c0fcfb Text-content-sha1: 2ce5286916f637f2ea50d8e384383055b893a30b Content-length: 20 SVN��# ��<��RQ Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e1b66f311648987a1f327b6f49b90d3d Text-delta-base-sha1: 454bc80a538248552ce7308ddb6fd4e157e94968 Text-content-length: 2800 Text-content-md5: 705cab991e84f979ef7a352211f2d258 Text-content-sha1: 2eedf979a3af5db336636b7d7741701b7f1e3193 Content-length: 2800 SVN��(ML�+��QS$�vg�e|^�lD#�<B]�}_�P�[n&�!1�y/module ? (t_##name) GetProcAddress(module, #name) : NULLDECL_WINSOCK_FUNCTION(static, char *, gai_strerror, (int ecode)); DECL_WINSOCK_FUNCTION(static, int, WSAAddressToStringA, (LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFO, LPTSTR, LPDWORD)); #endif static HMODULE winsock_module = NULL; static WSADATA wsadata; #ifndef NO_IPV6 static HMODULE winsock2_module = NULL; static HMODULE wship6_module = NULL; #endif int sk_startup(int hi, int lo) { WORD winsock_ver; winsock_ver = MAKEWORD(hi, lo); if (p_WSAStartup(winsock_ver, &wsadata)) { return FALSE; } if (LOBYTE(wsadata.wVersion) != LOBYTE(winsock_ver)) { return FALSE; } #ifdef NET_SETUP_DIAGNOSTICS { char buf[80]; sprintf(buf, "Using WinSock %d.%d", hi, lo); logevent(NULL, buf); } #endif return TRUE; } void sk_init(void) { winsock2_module =/* Check if we have getaddrinfo in Winsock */ if (GetProcAddress(winsock_module, "getaddrinfo") != NULL) { #ifdef NET_SETUP_DIAGNOSTICS logevent(NULL, "Native WinSock IPv6 support detected"); #endif GET_WINSOCK_FUNCTION(winsock_module, getaddrinfo); GET_WINSOCK_FUNCTION(winsock_module, freeaddrinfo); GET_WINSOCK_FUNCTION(winsock_module, getnameinfo); GET_WINSOCK_FUNCTION(winsock_module, gai_strerror); } else { /* Fall back to wship6.dll for Windows 2000 */ wship6_module = LoadLibrary("wship6.dll"); if (wship6_module) { #ifdef NET_SETUP_DIAGNOSTICS logevent(NULL, "WSH IPv6 support detected"); #endif GET_WINSOCK_FUNCTION(wship6_module, getaddrinfo); GET_WINSOCK_FUNCTION(wship6_module, freeaddrinfo); GET_WINSOCK_FUNCTION(wship6_module, getnameinfo); GET_WINSOCK_FUNCTION(wship6_module, gai_strerror); } else { #ifdef NET_SETUP_DIAGNOSTICS logevent(NULL, "No IPv6 support detected"); #endif } } GET_WINSOCK_FUNCTION(winsock2_module, WSAAddressToStringA); #else #ifdef NET_SETUP_DIAGNOSTICS logevent(NULL, "PuTTY was built without IPv6 support"); #endif/* Try to get the best WinSock version we can get */ if (!sk_startup(2,2) && !sk_startup(2,0) && !sk_startup(1,1)) { fatalbox("Unable to initialise WinSock"#ifdef NET_SETUP_DIAGNOSTICS logevent(NULL, "Using getaddrinfo() for resolving"); #endif#ifdef NET_SETUP_DIAGNOSTICS logevent(NULL, "Using gethostbyname() for resolving"); #endif&&p_gai_strerror ? p_gai_strerror(err)if (p_WSAAddressToStringA) { p_WSAAddressToStringA(addr->ai->ai_addr, addr->ai->ai_addrlen, NULL, buf, &buflen); } else strncpy(buf, "IPv6", buflen); a6.sin6_flowinfo = ((struct sockaddr_in6 *) sock->addr->ai->ai_addr)->sin6_flowinfo; a6.sin6_scope_id = ((struct sockaddr_in6 *) sock->addr->ai->ai_addr)->sin6_scope_id Revision-number: 7008 Prop-content-length: 124 Content-length: 124 K 7 svn:log V 24 Believed fixed. (Phew!) K 10 svn:author V 5 simon K 8 svn:date V 27 2006-12-23T09:06:02.309994Z PROPS-END Node-path: putty-wishlist/data/vista-ipv6 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 507c53c5a7ed7acdfdd62b4d0c1de290 Text-delta-base-sha1: f7442b0aff997c65bb31e88d689a33f0616f847b Text-content-length: 266 Text-content-md5: de9660b7e166dd04ed62f8e56149c7e5 Text-content-sha1: 2eed071bdc3a0d85fdf5027f0932aec883735239 Content-length: 266 SVN��;@ s�R��{QYFixed-in: 2006-12-24 r70074</b>: Jeroen Massar, the original author of PuTTY's IPv6 code, has supplied a patch which fixes this. Users experiencing this bug might like to download a post-r7007 snapshot and make sure the problem has gone away. Revision-number: 7009 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-25T00:31:09.759753Z PROPS-END Revision-number: 7010 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-25T00:31:09.843924Z PROPS-END Revision-number: 7011 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2006-12-24T16:20:44.465634Z K 7 svn:log V 61 Update the PuTTY and Puzzles web sites to include .CHM help. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/docs.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0a5ec4aeed622cf62599296edfdcdf64 Text-delta-base-sha1: cbe0a17eba7aa5a57e584bb102d8ba2cbcf7c128 Text-content-length: 210 Text-content-md5: 45f8615d14bf09ee2bd19aeecc046299 Text-content-sha1: d799574aaf6087896059dd3d26bce22c73f6d85b Content-length: 210 SVN��;/�~�K�kZ�F@�5 file</a>. (Modern HTMLHelp is not supported in the current release PuTTY.)-snapshots/putty.chm">The Windows Help file</a> (HTMLHelp format, not supported by Win95).old-style Revision-number: 7012 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2006-12-24T16:25:30.038117Z K 7 svn:log V 104 Add some CHM-related stuff to the release checklist. Don't want to forget about it when the time comes. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d10133924bff5e230487d2aafb5bd1c8 Text-delta-base-sha1: 21c17669f3276b784449c5b277b84bc7868c2c06 Text-content-length: 551 Text-content-md5: 5e143de4f8d3d5bd9d575067e659e158 Text-content-sha1: 1d98325003df95e0da8acf725279998ee77d3eee Content-length: 551 SVN��}]���)k�M0change into the doc subdir + run `make VERSION="PuTTY release 0.XX" chm', then run `hhc putty.hhp' to build the .CHM + then move the .CHM somewhere else so `make clean' doesn't blow it away + then run `make clean' + then `make VERSION="PuTTY release 0.XX"' + FOR NEXT RELEASE ONLY: update the docs page so that it links to the release .chm as well as the release .hlp and .cnt. Remove this checklist item after it's done; it won't need doing again in the subsequent release. Revision-number: 7013 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-25T00:31:10.269360Z PROPS-END Revision-number: 7014 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-27T00:31:04.392491Z PROPS-END Revision-number: 7015 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-27T00:31:04.495385Z PROPS-END Revision-number: 7016 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-27T00:31:04.521443Z PROPS-END Revision-number: 7017 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-27T00:31:04.533349Z PROPS-END Revision-number: 7018 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2006-12-26T23:08:27.732637Z K 7 svn:log V 40 Jeroen Massar says he's fixed this too. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/ipv6-scoped-addr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c78c7e38eb2083ba5ad61792489d97a Text-delta-base-sha1: a105740995bacad8492a1b8631925b4900dc294d Text-content-length: 693 Text-content-md5: d0a6bd0d58cdd9cbd76d4e1fec60f1a2 Text-content-sha1: 0beb186afa10b0691bebe826d29eb9c269672f4c Content-length: 693 SVN��\"#��#Fixed-in: 2006-12-24 r7007 Content-type: text/x-html-body <p>It's been reported that IPv6 scoped addresses (as defined in RFC4007), such as <code>fe80::200:e2ff:fe65:9ce%4</code>, don't work correctly on Windows XP Home + XP2. The error is "Network error: No route to host". SecureCRT does work, which suggests that we might just need to invoke <code>getaddrinfo()</code> differently. Scoped addresses work on Unix (NetBSD at least). <p><b>SGT, 2006-12-24</b>: Jeroen Massar, the original author of PuTTY's IPv6 code, has supplied a patch which fixes this. Users experiencing this bug might like to download a post-r7007 snapshot and make sure the problem has gone away. Revision-number: 7019 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-28T00:31:06.057134Z PROPS-END Revision-number: 7020 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-28T00:31:06.140789Z PROPS-END Revision-number: 7021 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-28T00:31:06.155396Z PROPS-END Revision-number: 7022 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-28T00:31:06.174739Z PROPS-END Revision-number: 7023 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-28T00:31:06.196220Z PROPS-END Revision-number: 7024 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-28T00:31:06.206295Z PROPS-END Revision-number: 7025 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-28T00:31:06.216145Z PROPS-END Revision-number: 7026 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-28T00:31:06.226549Z PROPS-END Revision-number: 7027 Prop-content-length: 235 Content-length: 235 K 8 svn:date V 27 2006-12-28T10:38:46.994126Z K 7 svn:log V 134 `make mostlyclean', to remove everything directly Halibut-generated but not the CHM. It'll come in useful during the release process. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e143de4f8d3d5bd9d575067e659e158 Text-delta-base-sha1: 1d98325003df95e0da8acf725279998ee77d3eee Text-content-length: 100 Text-content-md5: 74d4907d9e72c82d8c1e21d28171e783 Text-content-sha1: 1696ad9658a677e27f041254a202b45172746bce Content-length: 100 SVN��]H N� �N�onrun `make mostlyclean' (destroys the hhc input files but _not_ the .CHM) Node-path: putty/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3d5aad6feb45e55d73da5bc8ac712d93 Text-delta-base-sha1: 440e1596710cff0898cc83f6c2f7737dc06976f9 Text-content-length: 120 Text-content-md5: cc699c6b3738590c2679612b669254a5 Text-content-sha1: 8bd95485452d09486cec8abaa0f4c73c9d09d088 Content-length: 120 SVN��! d�6�dzmostlyclean: rm -f *.html *.txt *.hlp *.cnt *.1 *.info vstr.but *.hh[pck] clean: mostlyclean rm -f Revision-number: 7028 Prop-content-length: 346 Content-length: 346 K 8 svn:date V 27 2006-12-28T10:39:56.742079Z K 7 svn:log V 245 Nearly forgot: add the .CHM to the PuTTY installer. This involves making the manual shortcut in the Start menu point to one or other of the two help files depending on the version of Windows; fortunately Inno Setup has no difficulty doing that. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c1df58ba95e190c88589e335e8226c3 Text-delta-base-sha1: c0e15a6727fb61830bc73b05f8aad37b61cf4869 Text-content-length: 287 Text-content-md5: 63d0776d5e7da883f0b1a4df56e8f7e2 Text-content-sha1: d6bafe91a0c35a946de0dab90b58a8d3bac916dd Content-length: 287 SVN��2�F��^q~� chm; We have to fall back from the .chm to the older .hlp file on some Windows ; versions. Name: "{group}\PuTTY Manual"; Filename: "{app}\putty.chm"; MinVersion: 4.1,5.0 Name: "{group}\PuTTY Manual"; Filename: "{app}\putty.hlp"; OnlyBelowVersion: 4.1,5.0 Revision-number: 7029 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2006-12-28T11:51:52.795256Z K 7 svn:log V 71 I've looked into this, and currently my belief is that it's a GTK bug. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/unix-connreset-spin Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15ca4c185c51ef55b3f17bcea52587bc Text-delta-base-sha1: 60ba077afa877040b4d906857fe6c5df26d57511 Text-content-length: 2009 Text-content-md5: 69c11c426e4190fff811642f1e912b92 Text-content-sha1: adf68dd8f7375bfae7bb6912bf1b8a3d9cdaa0c2 Content-length: 2009 SVN��"hF�"�F SGT, 2006-12-28: I've looked briefly into this. I can reproduce it easily: the simplest way is to make an SSH connection to a Linux box, type `ps j $$' to find out the parent PID of the bash process (i.e. the user half of the privilege-separated sshd) and kill it. Examining the full strace shows that the reason poll() is repeatedly returning POLLNVAL on that fd is because it was closed shortly before that. So we've closed the fd, but not removed it from GDK's input loop. Or have we? Applying the following diagnostic patch... Index: uxsel.c =================================================================== --- uxsel.c (revision 7026) +++ uxsel.c (working copy) @@ -71,6 +71,7 @@ oldfd = find234(fds, newfd, NULL); if (oldfd) { +printf("uxsel_input_remove %d %d\n", fd, oldfd->id); uxsel_input_remove(oldfd->id); del234(fds, oldfd); sfree(oldfd); @@ -78,12 +79,14 @@ add234(fds, newfd); newfd->id = uxsel_input_add(fd, rwx); +printf("uxsel_input_add %d %d\n", fd, newfd->id); } void uxsel_del(int fd) { struct fd *oldfd = find234(fds, &fd, uxsel_fd_findcmp); if (oldfd) { +printf("uxsel_input_remove %d %d\n", fd, oldfd->id); uxsel_input_remove(oldfd->id); del234(fds, oldfd); sfree(oldfd); ... shows that we actually _do_ call gdk_input_remove() for that fd before entering the tight loop, and yet somehow the GDK event loop is still checking it. Also, setting a breakpoint on fd_input_func() in gtkwin.c indicates that GDK's event loop is not repeatedly calling it - i.e. that POLLNVAL is _not_ being passed to user code, but is entirely contained within GDK. In other words, I'm reasonably sure this is a bug in GDK or Glib, not in PuTTY. And since PuTTY is still running on GDK 1.2, it seems quite possible that the bug might already be fixed in later versions. Therefore, we probably ought to (finally) get round to porting to GTK 2.x, and see if the problem has gone away, before devoting any more effort to this issue. Revision-number: 7030 Prop-content-length: 373 Content-length: 373 K 10 svn:author V 5 simon K 8 svn:date V 27 2006-12-28T15:47:53.195946Z K 7 svn:log V 272 I'm not sure why I added htmlhelp.lib to the PuTTY link lines in r7000. I was probably half asleep. Actually, it's completely unnecessary to bind to it at link time, because we load it at run time in order to continue working as before on Win95. So I'm removing it again. PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c4e7b6a3f2a85f93a9772cc7f8cd36d5 Text-delta-base-sha1: 23b76aa3620f4249e4e40c44dd03113d9bcb68d3 Text-content-length: 20 Text-content-md5: 7ab43e7c8bbd5edfe9ce1153be339be4 Text-content-sha1: 71d8bbf5a1fe81c3e2c9e07fc4831d96b32c2214 Content-length: 20 SVN��D7 ��.�� ; Revision-number: 7031 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-29T00:31:14.744593Z PROPS-END Revision-number: 7032 Prop-content-length: 417 Content-length: 417 K 8 svn:date V 27 2006-12-28T20:56:01.978436Z K 7 svn:log V 316 Add a NO_HTMLHELP option, and enable it by default in the Cygwin Makefile, since even the latest version of w32api (3.6) shows no sign of HTMLHelp support. (This touches mkfiles.pl because that's where the details of what Cygwin doesn't support are kept currently. This may be deliberate, so I haven't changed it.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7ab43e7c8bbd5edfe9ce1153be339be4 Text-delta-base-sha1: 71d8bbf5a1fe81c3e2c9e07fc4831d96b32c2214 Text-content-length: 249 Text-content-md5: b45436ece33686b5240dd4f90b3444c9 Text-content-sha1: 95564a24f42783b0f2c38ce73fbfb9e020faa020 Content-length: 249 SVN��7}Q�o�L�E=|�v7� 5�w@COMPAT=/DNO_HTMLHELP (Windows only) # Disables PuTTY's use of <htmlhelp. The resulting binary # will only look for an old-style WinHelp file (.HLP/.CNT), and # will ignore any .CHM filehtmlhelpe Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 335a9591333ba3503c43ee83a7d6e8f4 Text-delta-base-sha1: 650460d95fa52f9f5bca15b12c5a6f0751da8eed Text-content-length: 37 Text-content-md5: 77a29016e644b0c3361a9213ed3cb1bd Text-content-sha1: 127ac1788ec3be9d0216e668fecb60781dbf254e Content-length: 37 SVN��-; �^��P]-DNO_HTMLHELP Node-path: putty/windows/winhelp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df0b904f65fc04477ce191c9b19f57a4 Text-delta-base-sha1: 71bcde9ab3a39e1836ebe8172f49ce3573661725 Text-content-length: 1057 Text-content-md5: 41eede11c3c9314eb1f0befdd548808e Text-content-sha1: 4ef3825d282de30ed38eb1392a67e00f48fe9f67 Content-length: 1057 SVN�� 5`�}�Q�i�<�/�%D�k9�)%{�Gs�b'fndef NO_HTMLHELP #include <htmlhelp.h> #endif /* NO_HTMLHELP */ static int requested_help; static char *help_path; static int help_has_contents; #ifndef NO_HTMLHELP typedef HWND (CALLBACK *htmlhelp_t)(HWND, LPCSTR, UINT, DWORD); static char *chm_path; static DWORD html_help_cookie; static htmlhelp_t htmlhelp; #endif /* NO_HTMLHELP */#ifndef NO_HTMLHELP#endif /* NO_HTMLHELP */ } void shutdown_help(void) { #ifndef NO_HTMLHELP if (chm_path) htmlhelp(NULL, NULL, HH_UNINITIALIZE, html_help_cookie); #endif /* NO_HTMLHELP */ #ifndef NO_HTMLHELP || chm_path #endif /* NO_HTMLHELP */ ); } void launch_help(HWND hwnd, const char *topic) { if (topic) { int colonpos = strcspn(topic, ":"); #ifndef NO_HTMLHELP #endif /* NO_HTMLHELP */ #ifndef NO_HTMLHELP if (chm_path) { htmlhelp(hwnd, chm_path, HH_DISPLAY_TOPIC, 0); } else #endif /* NO_HTMLHELP */ #ifndef NO_HTMLHELP if (chm_path) { htmlhelp(NULL, NULL, HH_CLOSE_ALL, 0); } else #endif /* NO_HTMLHELP */ Revision-number: 7033 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-29T00:31:15.007914Z PROPS-END Revision-number: 7034 Prop-content-length: 361 Content-length: 361 K 8 svn:date V 27 2006-12-29T14:35:34.416261Z K 7 svn:log V 260 Colin Watson points out that there was no need for me to write the custom Panels container widget for the PuTTY config box, since the perfectly standard GtkNotebook does the same job. Hence, let's remove Panels completely in favour of doing it the proper way. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b45436ece33686b5240dd4f90b3444c9 Text-delta-base-sha1: 95564a24f42783b0f2c38ce73fbfb9e020faa020 Text-content-length: 20 Text-content-md5: c88c9fe0f1233711d27c8b93c2fe035b Text-content-sha1: 3519b9e3944635fc7286d167b1e86b1cf43e0540 Content-length: 20 SVN��}t �� ��h Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ed7d0b666bf536fb824b7d870942f9cb Text-delta-base-sha1: 4486eab29fd4592866b169ca6f6d0ceeeaf4530c Text-content-length: 632 Text-content-md5: 9121bfe9eceb1f2e9ad59bc935ceb901 Text-content-sha1: 12d38735319953778774df080955121ca70df4cb Content-length: 632 SVN��}37�)��}?�;B�_( �;�=�=QGtkNotebook gint page_num; page_num = gtk_notebook_page_num(sp->panels, sp->panel); gtk_notebook_set_page(sp->panels, page_numgtk_notebook_new(); gtk_notebook_set_show_tabs(GTK_NOTEBOOK(panels), FALSE); gtk_notebook_set_show_border(GTK_NOTEBOOK(panels), FALSEwidget_show(panelvbox); gtk_notebook_append_page(GTK_NOTEBOOK(panels), panelvbox, NULL); if (first) { gint page_num; page_num = gtk_notebook_page_num(GTK_NOTEBOOK(panels), panelvbox); gtk_notebook_set_page(GTK_NOTEBOOK(panels), page_numGTK_NOTEBOOK Node-path: putty/unix/gtkpanel.c Node-action: delete Node-path: putty/unix/gtkpanel.h Node-action: delete Revision-number: 7035 Prop-content-length: 432 Content-length: 432 K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-12-29T16:38:52.361464Z K 7 svn:log V 331 Use va_copy() where available. This should fix a segfault in vsnprintf() on AMD 64 Linux. (This has been sitting in my checkout for ages and hasn't obviously caused any trouble -- I think I was waiting to get round to trying it with VC6, which I haven't yet. There are some notes in comments on further tweaks that could be made.) PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0b3d24ec6ff723233a3095cb15a0ec0 Text-delta-base-sha1: 12174fd6c84c8f51816c1a87c6ec3f5941073b8d Text-content-length: 1008 Text-content-md5: faae744f2abd4e13a4fb2c728e18e9b7 Text-content-sha1: 1894c9ec0617af91b4ffd9521990a1f5985197b6 Content-length: 1008 SVN��:GP�z� �BE�; vsnprintf is not available on all * platforms. There's an ifdef to use `_vsnprintf', which seems * to be the local name for it on Windows. Other platforms may * lack it completely, in which case it'll be time to rewrite * this function in a totally different way#ifdef va_copy /* Use the `va_copy' macro mandated by C99, if present. * XXX some environments may have this as __va_copy() */ va_list aq; va_copy(aq, ap); len = vsnprintf(buf, size, fmt, aq); va_end(aq); #else /* Ugh. No va_copy macro, so do something nasty. * Technically, you can't reuse a va_list like this: it is left * unspecified whether advancing a va_list pointer modifies its * value or something it points to, so on some platforms calling * vsnprintf twice on the same va_list might fail hideously * (indeed, it has been observed to). * XXX the autoconf manual suggests that using memcpy() will give * "maximum portability". */ len = vsnprintf(buf, size, fmt, ap); #endif Revision-number: 7036 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-30T00:31:10.087582Z PROPS-END Revision-number: 7037 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2006-12-29T16:44:24.845527Z K 7 svn:log V 84 Note more prominently that setting cursor colour to (1,1,1) doesn't help everybody. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/black-pointer Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 03124f086b9d7bfa6eac2f894d4d4e08 Text-delta-base-sha1: f8fa8517a90b128300f80722fb66c14d9c5d4b3f Text-content-length: 88 Text-content-md5: d82abc6cf405ad8f5fca43e46a005d45 Text-content-sha1: 23f078e266caf6df987e011ecc4c91e331336030 Content-length: 88 SVN��PG�P�G <p> However, we have had reports of the above workaround not helping. Revision-number: 7038 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-30T00:31:10.313033Z PROPS-END Revision-number: 7039 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-30T00:31:10.335819Z PROPS-END Revision-number: 7040 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2006-12-31T00:31:07.747648Z PROPS-END Revision-number: 7041 Prop-content-length: 390 Content-length: 390 K 10 svn:author V 5 jacob K 8 svn:date V 27 2006-12-30T23:00:14.540562Z K 7 svn:log V 289 Patch from Colin Watson intended to give a clean Unix compile with GCC 4. (Since we choose to compile with -Werror, this is particularly important.) I haven't yet checked that the resulting source actually compiles cleanly with GCC 4, hence not marking `gcc4-warnings' as fixed just yet. PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e46198484673cfa4fce01ea02876edb Text-delta-base-sha1: 42f867e8c183a6748a94a23fd1ede56eb012b607 Text-content-length: 110 Text-content-md5: d45b675f60f25eb4dd3f4d0b50ec046e Text-content-sha1: 9c48372f86872c7375b5f543669fb17eee7e674d Content-length: 110 SVN��0]B���w�. �N�`Punsignedunsigned char *ssh2blob = NULL; charunsigned unsigned Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: faae744f2abd4e13a4fb2c728e18e9b7 Text-delta-base-sha1: 1894c9ec0617af91b4ffd9521990a1f5985197b6 Text-content-length: 46 Text-content-md5: 284e8cf1e48af3f43a43e000a435a5da Text-content-sha1: 70fc4fa09f44ed10117c35161cc7d9008d8b0841 Content-length: 46 SVN��G5 �G��Urchar *result = snewn(len, Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 50af623c753cf4ecb2e272e9ed48b155 Text-delta-base-sha1: 29fb3ea5989dd1a43e25f9ff7ebd438a12330c86 Text-content-length: 182 Text-content-md5: c7a96bd5d90af348cb4c503fe31be8e5 Text-content-sha1: b63918a0a2d74e08bc5d3a7fb140a5ddc470806b Content-length: 182 SVN����L�(��W%�<�Zchar *sargpsargp = va_arg(ap, char *); ssh_pkt_addstring(pkt, sunsigned����p� c_write_str(ssh� � �_OFFER_QUIET) { Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4c79b4c739226a8e3166c70192afeb6 Text-delta-base-sha1: c0f13c9c0e1a49dff8aece1dae8b3fbf78ef0e26 Text-content-length: 157 Text-content-md5: 28f378caae07c18ed4c2b53685f33319 Text-content-sha1: 3fcfdb93ce361007fa5349d2bc8d3bab3c8cee08 Content-length: 157 SVN��?L �[��nQunsigned char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm, int *pub_blob_len, char **commentptr, Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 585c0dad9bf74479be18eb4f4d29460e Text-delta-base-sha1: 95ffcb7b0dc05c27e9df277e89526ea2f5fe5ad5 Text-content-length: 165 Text-content-md5: 9d48e60dc6ed86c3358a517efe2d9bca Text-content-sha1: e99914aa21227f9d4652149aee43280fc0d0464f Content-length: 165 SVN��>C� ��H�mQunsigned char *ssh2_userkey_loadpub(const Filename *filename, char **algorithm, int *pub_blob_len, char **commentptr, Node-path: putty/sshzlib.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b1b14689efc4d8d98048372c4957c17 Text-delta-base-sha1: 95ac80ecd803dc36e013e093150a78174017ae2f Text-content-length: 60 Text-content-md5: 78188ba29b0d06bee1158a3368899588 Text-content-sha1: ca3c8ca51e26c8f638fff8492ebe5fbbcc5758b1 Content-length: 60 SVN��#W $�L��g<distance = 0; /* appease compiler */ Node-path: putty/tree234.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: baa406cbdb0c176d5fd4f6ed29304832 Text-delta-base-sha1: 648039b1e2759e0618c5dae59d1b08cc5d0c595e Text-content-length: 99 Text-content-md5: 2667a2a270720052dd9dbd322c0eb58f Text-content-sha1: 2c6bc106131abdae37ffbea25ebe63b140bdbe14 Content-length: 99 SVN��_/ J�$�J�A = NULL; /* placate gcc; will always be set below since t->root != NULL */ Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9121bfe9eceb1f2e9ad59bc935ceb901 Text-delta-base-sha1: 12d38735319953778774df080955121ca70df4cb Text-content-length: 42 Text-content-md5: fb88104a4beab7e308838aec6c9512c2 Text-content-sha1: c70de2d9e28eb10dc5a0840626b9f1cffd628c77 Content-length: 42 SVN��} ���o(unsigned char *) Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4072884737d2cf13e6ff167425e2531c Text-delta-base-sha1: 26eb9a7d78ededc353e4d08bd2a65bec6710d032 Text-content-length: 765 Text-content-md5: a0ccbb264d790efc3adcf362adff6c97 Text-content-sha1: 168207b52021ab68b5bce82bab517fa86de57759 Content-length: 765 SVN����al���k�J�J�J�J�J�J�J�c �6m� #�hD�-�munsigned char empty[] = "";empty, 0);1, XA_STRING, 8, PropModeAppend, empty, 0);2, XA_STRING, 8, PropModeAppend, empty, 0);3, XA_STRING, 8, PropModeAppend, empty, 0);4, XA_STRING, 8, PropModeAppend, empty, 0);5, XA_STRING, 8, PropModeAppend, empty, 0);6, XA_STRING, 8, PropModeAppend, empty, 0);7, XA_STRING, 8, PropModeAppend, empty(unsigned char *)(unsigned char *)(unsigned char *)inst->pasteout_data, ; unsigned int(int)w; if (flags & HeightValue) cfg->height = (int)�O`�O�motion_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_received", GTK_SIGNAL_FUNC(selection_received), inst); Revision-number: 7042 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-01T00:31:06.634015Z PROPS-END Revision-number: 7043 Prop-content-length: 1001 Content-length: 1001 K 8 svn:date V 27 2006-12-31T15:33:33.324512Z K 7 svn:log V 900 Patch inspired by one from Daniel Silverstone in Debian bug #229232: We now have an option where a remote window title query returns a well-formed response containing the empty string. This should keep stop any server-side application that was expecting a response from hanging, while not permitting the response to be influenced by an attacker. We also retain the ability to stay schtum. The existing checkbox has thus grown into a set of radio buttons. I've changed the default to the "empty string" response, even in the backward- compatibility mode of loading old settings, which is a change in behaviour; any users who want the old behaviour back will have to explicitly select it. I think this is probably the Right Thing. (The only drawback I can think of is that an attacker could still potentially use the relevant fixed strings for mischief, but we already have other, similar reports.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fddfcc35de0eddf491638e113bdf072b Text-delta-base-sha1: 30d303190ad5b9d7d9f06da7d9097e1f2b73fdf9 Text-content-length: 333 Text-content-md5: 1670937de2aec1f895173a430740c5a9 Text-content-sha1: 7120bd82c3e75820d997612117dc602fa1895188 Content-length: 333 SVN��w0�.�0�&Qradiobuttons(s, "Response to remote title query (SECURITY):", 'q', 3, HELPCTX(features_qtitle), dlg_stdradiobutton_handler, I(offsetof(Config,remote_qtitle_action)), "None", I(TITLE_NONE), "Empty string", I(TITLE_EMPTY), "Window title", I(TITLE_REAL), NULL Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5ff279abffd1996e0d569b224b570315 Text-delta-base-sha1: 5a4244935be351beba46f251e29836b424061e73 Text-content-length: 1359 Text-content-md5: 0bc3a73c72325a607c16bb478f11ffaa Text-content-sha1: a64b7d6313b4a0490b9995ac19fa3f01c236e660 Content-length: 1359 SVN����,�>��G!�Response toset it to \q{Window title} unless you \e{really} know what you are doing. There are three settings for this option: \dt \q{None} \dd PuTTY makes no response whatsoever to the relevant escape sequence. This may upset server-side software that is expecting some sort of response. \dt \q{Empty string} \dd PuTTY makes a well-formed response, but leaves it blank. Thus, server-side software that expects a response is kept happy, but an attacker cannot influence the response string. This is probably the setting you want if you have no better ideas. \dt \q{Window title} \dd PuTTY responds with the actual window title. This is dangerous for the reasons described above�mkk��h enabling this option; see \k{pageant-security} for details. \S{config-ssh-changeuser} \q{Allow attempted \i{changes of username} in SSH-2} \cfg{winhelp-topic}{ssh.auth.changeuser} In the SSH-1 protocol, it is impossible to change username after failing to authenticate. So if you mis-type your username at the PuTTY \q{login as:} prompt, you will not be able to change it except by restarting PuTTY. The SSH-2 protocol \e{does} allow changes of username, in principle, but does not make it mandatory for SSH-2 servers to accept them. In particular, \i{OpenSSH} does not accept a change of username; once you have Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b785ff56e01dcee33bb0c82511cfa3cd Text-delta-base-sha1: 40e6802c4fb41c34ec71e976f0907a0d0601f1d6 Text-content-length: 172 Text-content-md5: 60ecdffcd71c9e5f6c24f7388251ac47 Text-content-sha1: cebc170686d7137b51d3f261c8587a837a1a2268 Content-length: 172 SVN��sX �v�O�Cc�`Actions on remote window title query */ TITLE_NONE, TITLE_EMPTY, TITLE_REALremote_qtitle_action; /* remote win title query action Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1a2c81d31455caf1e0beb94dbe8324aa Text-delta-base-sha1: e4080036d17d18bd5323cf186912d9935507dff0 Text-content-length: 516 Text-content-md5: 37a2080534ee2270a164141e03fbaa72 Text-content-sha1: 1dbe6a8f026e895cf0ae2ef75094a8673fcc6cd9 Content-length: 516 SVN��c�x�� 5�cRemoteQTitleAction", cfg->remote_qtitle_action{ /* Backward compatibility */ int no_remote_qtitle; gppi(sesskey, "NoRemoteQTitle", 1, &no_remote_qtitle); /* We deliberately interpret the old setting of "no response" as * "empty string". This changes the behaviour, but hopefully for * the better; the user can always recover the old behaviour. */ gppi(sesskey, "RemoteQTitleAction", no_remote_qtitle ? TITLE_EMPTY : TITLE_REAL, &cfg->remote_qtitle_action); } Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c18b98b85e65e4f0cdfd9cf7d70eb0f0 Text-delta-base-sha1: 7996c2492409dfae3ec2d620bb22f6dffa096c11 Text-content-length: 508 Text-content-md5: 1acbe116a7fbe4bb40df122fa23319a0 Text-content-sha1: 6b4f9c59ffd0a0332a1960d349f82c89fbd3a106 Content-length: 508 SVN���� � ��V har *EMPTY_WINDOW_TITLE = "";�=@%�S�B�k$C�]`rgs[i] - 30)<<ATTR_FGSHIFT; term->cfg.remote_qtitle_action != TITLE_NONE) { if(term->cfg.remote_qtitle_action == TITLE_REAL) p = get_window_title(term->frontend, TRUE); else p = EMPTY_WINDOW_TITLEterm->cfg.remote_qtitle_action != TITLE_NONE) { if(term->cfg.remote_qtitle_action == TITLE_REAL) p = get_window_title(term->frontend, FALSE); else p = EMPTY_WINDOW_TITLE Revision-number: 7044 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-01T00:31:08.016722Z PROPS-END Revision-number: 7045 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-01T00:31:08.027537Z PROPS-END Revision-number: 7046 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-02T00:31:36.865974Z PROPS-END Revision-number: 7047 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-02T00:31:37.146855Z PROPS-END Revision-number: 7048 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2007-01-01T21:19:14.060290Z K 7 svn:log V 17 It's a new year. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60f404fcca9f7f2950f8fe187bd66752 Text-delta-base-sha1: de20a241c0ce5d3b98fe5690495dd1c3d404c4dc Text-content-length: 44 Text-content-md5: f1fbc9578354b488efd1c7e276855c6a Text-content-sha1: a069392e138032b7ebb156bad71035146916821f Content-length: 44 SVN���cPuTTY is copyright 1997-2007 Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e5a65f966d8f01695e34559ae66e40c Text-delta-base-sha1: 8e9ab98f9a237e3f0fe30963efcc6d75c16684c1 Text-content-length: 22 Text-content-md5: ae2e559e89459aca31584490de6be723 Text-content-sha1: ef6e036b2e0000059dd9c927e031b5407df597cc Content-length: 22 SVN��bb �R��S7 Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 301f1189a17e9471a9b09d9f9929af40 Text-delta-base-sha1: 2971c95b5049ac909a4e89dcf1c32080aa675e75 Text-content-length: 20 Text-content-md5: 69cf461deda899f6ef43c2bad9b2360f Text-content-sha1: 226c039abd18be2bab19aa9a55a2c29d257d5ebb Content-length: 20 SVN��RR�j��gk7 Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 38615e3beeaf1fa285cc5113b7a33094 Text-delta-base-sha1: d0dbf14df398f277cebf33e6a186b19e31b9f268 Text-content-length: 34 Text-content-md5: eb035ee3ac46f6e5673b8085af08866d Text-content-sha1: 85295411504f5f7aab64e230f3677418be4eeb58 Content-length: 34 SVN��QQ���a�_r77 Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d0f7dc557ad14bf7c9c89352af7cc786 Text-delta-base-sha1: 0f1e1a6bda604bff792cb894aabd0b01136e6815 Text-content-length: 29 Text-content-md5: c643709f47ef54cad73b910cb1cb704f Text-content-sha1: 5db16b1df9961d4d91ae49a258d71b8f975e8b30 Content-length: 29 SVN��zz�>��[?�_77 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb88104a4beab7e308838aec6c9512c2 Text-delta-base-sha1: c70de2d9e28eb10dc5a0840626b9f1cffd628c77 Text-content-length: 34 Text-content-md5: 44bbeab4c1a85e5d98f536301bbc8f91 Text-content-sha1: 3ac31b916eb57890529bfcbd787ce365d380a681 Content-length: 34 SVN�����B�8V77 Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 365d3e982d7c7abbd42a536eec17041e Text-delta-base-sha1: 13c7772fa27dc982908e7871c73b1d41f45d600d Text-content-length: 29 Text-content-md5: eed999c3618a3e06fe2fc32f10d00864 Text-content-sha1: 92be40d5c6e712a15b3c4a6c232e0a912fe868ae Content-length: 29 SVN��}}�-��L.�{77 Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 606b22d3fe4f7b81bd5ff8359838bd1e Text-delta-base-sha1: 862abe8fdf1a742f2a0ec776ba43afe0c3b3e40e Text-content-length: 29 Text-content-md5: 06893a82f8936510f3d7e3b9664cc139 Text-content-sha1: fcfaec65fbbe114d6dc544b667765167bb96b2f9 Content-length: 29 SVN��55�d��Le�277 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eae156c95ea2f561e90d2900b184c66a Text-delta-base-sha1: c1fcb9cbf7c4653a8be82903dabce1728f6b6f28 Text-content-length: 22 Text-content-md5: 1b7cafca411c4e5584ee0bc116bc1df9 Text-content-sha1: 9626bee0128f729a21557994b6e0535953674d7b Content-length: 22 SVN��zz ���u7 Node-path: putty/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9321ce36a7140fafad3a744e060638c4 Text-delta-base-sha1: 5be935d8c1ec52fc1b7a50ff9f3514d37be0472a Text-content-length: 29 Text-content-md5: 6d7506f4d7bd721e0027b5c91e7faf1a Text-content-sha1: a76ade4bfdcb2b659155944a4fae41bfcb25f8d1 Content-length: 29 SVN��ff�k��Cl�6077 Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fa25cb1d2704e8af34b3df3666ab8527 Text-delta-base-sha1: 33cb9a1672b3bf15490150bc59ad662bfea72f1a Text-content-length: 22 Text-content-md5: 5ac44c2aaaf2425bfc71c1ee97dd16e5 Text-content-sha1: 8fd95f81f94df2791918a9cc9f60596596283674 Content-length: 22 SVN��WW �+��+,7 Revision-number: 7049 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-02T00:31:39.772528Z PROPS-END Revision-number: 7050 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-03T00:31:14.881330Z PROPS-END Revision-number: 7051 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-03T00:31:14.971994Z PROPS-END Revision-number: 7052 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-04T00:31:25.239605Z PROPS-END Revision-number: 7053 Prop-content-length: 234 Content-length: 234 K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-03T19:47:20.514557Z K 7 svn:log V 133 Colin's preliminary GTK2 patch has allowed me to confirm that this is indeed a bug in GTK1 and not our fault. Added a Depends: line. PROPS-END Node-path: putty-wishlist/data/unix-connreset-spin Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69c11c426e4190fff811642f1e912b92 Text-delta-base-sha1: adf68dd8f7375bfae7bb6912bf1b8a3d9cdaa0c2 Text-content-length: 281 Text-content-md5: 151d27e0c9bd35fd08a6a02555fc1c0c Text-content-sha1: 5529b90645a50b03f85b46fcfecdfb499bb056a6 Content-length: 281 SVN��hk �o��znkDepends: port-unix-gtk2 SGT, 2007-01-03: Indeed, this is now confirmed as a GTK problem, and moreover one which is already fixed in GTK 2. Colin Watson has submitted a preliminary patch to build PuTTY against GTK 2, and the problem goes away if you do that. Revision-number: 7054 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2007-01-03T20:17:06.719545Z K 7 svn:log V 87 More testing. It definitely seems to only happen when PSFTP is launched from Explorer. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 98ddb8a280f7bb85379d33bd78348212 Text-delta-base-sha1: c57d0f6bdcaafad661921f30d852e72fbc985b05 Text-content-length: 419 Text-content-md5: 585df031fb86116397890a8b115e05a0 Text-content-sha1: 7ec5246659bc7bbadd4f50e110ea1654fae6a401 Content-length: 419 SVN��tg o�Q� gSummary: PSFTP hangs/consumes 100% CPU when launched from Explorer Absent-in: 0.56 0.57 2004-12-23 Present-in: 0.58 2005-08-11 2007-01-03 We've had several reports of PSFTP 0.58 hanging or consuming lots of CPU. It appears that this only happens when it's started from Explorer or the Start Menu, rather than the Command Prompt (which suggests an obvious workaround) Also reproduced on WinXP. Revision-number: 7055 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2007-01-03T23:10:56.709713Z K 7 svn:log V 117 `terminal-saturate-freeze' and `spew-lockup' are the same bug! Keep the latter. (Both raised by me, embarrassingly.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/spew-lockup Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7dd65f7c3c42ed3c9f78057fb23d07fa Text-delta-base-sha1: 52e3ec7c982d367304da352d9741dfef51824cf2 Text-content-length: 611 Text-content-md5: 15d07fa3d7f76ff96428a27b5f238cc7 Text-content-sha1: 4658c2f8926c65ce363e1852d71561eb8ec52bde Content-length: 611 SVN��GeH�I!1�TsbSummary: Remote terminal spew can freeze terminal andit can saturate us with input data, completely locking out the local GUI (at least on Windows). The appearance is that PuTTY appears to hang: it consumes as much CPU as it can, the terminal display does not update, and the GUI (keyboard, menus etc) is unresponsive. If and when the stream of data abates, <p> I (JTN) seem to recall noticing that some code which periodically gave the GUI a chance to update disappeared in some upheaval or other, but I didn't follow it up at the time and haven't got round to digging it up again. Node-path: putty-wishlist/data/terminal-saturate-freeze Node-action: delete Revision-number: 7056 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2007-01-03T23:21:35.898430Z K 7 svn:log V 14 Update to RFC K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/banner-escape-codes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8249196671f81ac80299d84576dbb8d7 Text-delta-base-sha1: 49125de26f898799c1d09d29c7c7e2f25889a053 Text-content-length: 304 Text-content-md5: e77c6dfa8a3998d4dc8f604154840800 Text-content-sha1: feeb627a23ea1490cc8eea23be4afdc0cd76f571 Content-length: 304 SVN��|M ���/MSSH-2 authentication specification, <a href="http://www.ietf.org/rfc/rfc4252.txt">RFC 4252</a>, states, in the section about <code>SSH_MSG_USERAUTH_BANNER</code>: <blockquote> If the 'message' string is displayed, control character filtering, discussed in [SSH-ARCH], Revision-number: 7057 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 70 Come to think of it, if this isn't our fault it's at most a semi-bug. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-03T23:34:43.318003Z PROPS-END Node-path: putty-wishlist/data/unix-connreset-spin Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 151d27e0c9bd35fd08a6a02555fc1c0c Text-delta-base-sha1: 5529b90645a50b03f85b46fcfecdfb499bb056a6 Text-content-length: 24 Text-content-md5: ef75748236d26d0d4b03c7b16a3cc7b7 Text-content-sha1: 2b4a85e3122e86442dd5f2acf54ebe3a129f25f5 Content-length: 24 SVN��kp�C��(Csemi- Revision-number: 7058 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-05T00:31:11.929217Z PROPS-END Revision-number: 7059 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 2007-01-05T18:43:58.150973Z K 7 svn:log V 161 Francois L'Archeveque spotted that the variable `winsock2_module' only exists when compiling for IPv6, so we shouldn't try assigning to it the rest of the time. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 705cab991e84f979ef7a352211f2d258 Text-delta-base-sha1: 2eedf979a3af5db336636b7d7741701b7f1e3193 Text-content-length: 76 Text-content-md5: c9bf919ab5f981f10aaf06e7a952d20a Text-content-sha1: 5beddb2e105d8d10eb27e134d99672631dbfaccb Content-length: 76 SVN��Ml 4�C��uX#ifndef NO_IPV6 winsock2_module = #endif Revision-number: 7060 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-07T00:31:12.111998Z PROPS-END Revision-number: 7061 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-07T00:31:12.192596Z PROPS-END Revision-number: 7062 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-07T00:31:12.203025Z PROPS-END Revision-number: 7063 Prop-content-length: 972 Content-length: 972 K 8 svn:date V 27 2007-01-06T18:15:35.581367Z K 7 svn:log V 871 Shiny new script which constructs the various icons for the PuTTY suite. In a dramatic break with tradition, I'm actually checking in the resulting icon files as well as the script that generates them, because the script requires Python and ImageMagick and I don't think it's reasonable to require that much extra infrastructure on everyone checking out from Subversion. The new icons should be _almost_ indistinguishable from the old ones, at least at the 32x32 resolution. The immediately visible change is that all the icons now come in 16x16, 32x32 and 48x48 formats, in both 16 colours and monochrome, instead of an ad-hoc mixture of whichever ones I could be bothered to draw. The same code can also be adapted to generate icons for the GTK port (although icons for the running programs don't seem to be supported by GTK 1 - another reason to upgrade to GTK 2!). K 10 svn:author V 5 simon PROPS-END Node-path: putty/icons Node-kind: dir Node-action: add Prop-content-length: 54 Content-length: 54 K 10 svn:ignore V 22 *.png *.ico *.xpm *.c PROPS-END Node-path: putty/icons/Makefile Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2564 Text-content-md5: 243309e42a255ad643dba3ba82e58992 Text-content-sha1: 511e355c0f399bd660a4e762cc705dfa9a8eb1c3 Content-length: 2574 PROPS-END SVN���vvv# Makefile for the PuTTY icon suite. ICONS = putty puttycfg puttygen pscp pageant pterm ptermcfg SIZES = 16 32 48 MODE = # override to -it on command line for opaque testing PNGS = $(foreach I,$(ICONS),$(foreach S,$(SIZES),$(I)-$(S).png)) MONOPNGS = $(foreach I,$(ICONS),$(foreach S,$(SIZES),$(I)-$(S)-mono.png)) TRUEPNGS = $(foreach I,$(ICONS),$(foreach S,$(SIZES),$(I)-$(S)-true.png)) ICOS = putty.ico puttygen.ico pscp.ico pageant.ico pageants.ico puttycfg.ico CICONS = xpmputty.c xpmpucfg.c xpmpterm.c xpmptcfg.c base: icos cicons all: pngs monopngs base # truepngs currently disabled by default pngs: $(PNGS) monopngs: $(MONOPNGS) truepngs: $(TRUEPNGS) icos: $(ICOS) cicons: $(CICONS) $(PNGS): %.png: mkicon.py ./mkicon.py $(MODE) $(join $(subst -, ,$(basename $@)),_icon) $@ $(MONOPNGS): %.png: mkicon.py ./mkicon.py -2 $(MODE) $(join $(subst -, ,$(subst -mono,,$(basename $@))),_icon) $@ $(TRUEPNGS): %.png: mkicon.py ./mkicon.py -T $(MODE) $(join $(subst -, ,$(subst -true,,$(basename $@))),_icon) $@ putty.ico: putty-16.png putty-32.png putty-48.png \ putty-16-mono.png putty-32-mono.png putty-48-mono.png ./icon.pl -4 $(filter-out %-mono.png, $^) -1 $(filter %-mono.png, $^) > $@ puttycfg.ico: puttycfg-16.png puttycfg-32.png puttycfg-48.png \ puttycfg-16-mono.png puttycfg-32-mono.png puttycfg-48-mono.png ./icon.pl -4 $(filter-out %-mono.png, $^) -1 $(filter %-mono.png, $^) > $@ puttygen.ico: puttygen-16.png puttygen-32.png puttygen-48.png \ puttygen-16-mono.png puttygen-32-mono.png puttygen-48-mono.png ./icon.pl -4 $(filter-out %-mono.png, $^) -1 $(filter %-mono.png, $^) > $@ pageant.ico: pageant-16.png pageant-32.png pageant-48.png \ pageant-16-mono.png pageant-32-mono.png pageant-48-mono.png ./icon.pl -4 $(filter-out %-mono.png, $^) -1 $(filter %-mono.png, $^) > $@ pageants.ico: pageant-16.png pageant-16-mono.png ./icon.pl -4 $(filter-out %-mono.png, $^) -1 $(filter %-mono.png, $^) > $@ pscp.ico: pscp-16.png pscp-32.png pscp-48.png \ pscp-16-mono.png pscp-32-mono.png pscp-48-mono.png ./icon.pl -4 $(filter-out %-mono.png, $^) -1 $(filter %-mono.png, $^) > $@ xpmputty.c: putty-16.png putty-32.png putty-48.png ./cicon.pl main_icon $^ > $@ xpmpucfg.c: puttycfg-16.png puttycfg-32.png puttycfg-48.png ./cicon.pl cfg_icon $^ > $@ xpmpterm.c: pterm-16.png pterm-32.png pterm-48.png ./cicon.pl main_icon $^ > $@ xpmptcfg.c: ptermcfg-16.png ptermcfg-32.png ptermcfg-48.png ./cicon.pl cfg_icon $^ > $@ clean: rm -f *.png *.ico *.c Node-path: putty/icons/cicon.pl Node-kind: file Node-action: add Prop-content-length: 36 Text-delta: true Text-content-length: 875 Text-content-md5: 353218248cd4a7e4db9c7282a7d07816 Text-content-sha1: 6aa53f84fe612d4259f320cfec0ca1690c98cb79 Content-length: 911 K 14 svn:executable V 1 * PROPS-END SVN���]]]#!/usr/bin/perl # Given a list of input PNGs, create a C source file file # containing a const array of XPMs, under the name `xpm_icon'. $k = 0; @xpms = (); foreach $f (@ARGV) { # XPM format is generated directly by ImageMagick, so that's easy # enough. We just have to adjust the declaration line so that it # has the right name, linkage and storage class. @lines = (); open XPM, "convert $f xpm:- |"; push @lines, $_ while <XPM>; close XPM; die "XPM from $f in unexpected format\n" unless $lines[1] =~ /^static.*\{$/; $lines[1] = "static const char *const xpm_icon_$k"."[] = {\n"; $k++; push @xpms, @lines, "\n"; } # Now output. foreach $line (@xpms) { print $line; } print "const char *const *const xpm_icons[] = {\n"; for ($i = 0; $i < $k; $i++) { print " xpm_icon_$i,\n"; } print "};\n"; print "const int n_xpm_icons = $k;\n"; Node-path: putty/icons/icon.pl Node-kind: file Node-action: add Prop-content-length: 36 Text-delta: true Text-content-length: 8601 Text-content-md5: 0cbc8e87242e13906d1860701ac27dff Text-content-sha1: 801e00e9b03ca9fff0368b6a7a09745b62495612 Content-length: 8637 K 14 svn:executable V 1 * PROPS-END SVN���  #!/usr/bin/perl # Take a collection of input image files and convert them into a # multi-resolution Windows .ICO icon file. # # The input images can be treated as having four different colour # depths: # # - 24-bit true colour # - 8-bit with custom palette # - 4-bit using the Windows 16-colour palette (see comment below # for details) # - 1-bit using black and white only. # # The images can be supplied in any input format acceptable to # ImageMagick, but their actual colour usage must already be # appropriate for the specified mode; this script will not do any # substantive conversion. So if an image intended to be used in 4- # or 1-bit mode contains any colour not in the appropriate fixed # palette, that's a fatal error; if an image to be used in 8-bit # mode contains more than 256 distinct colours, that's also a fatal # error. # # Command-line syntax is: # # icon.pl -depth imagefile [imagefile...] [-depth imagefile [imagefile...]] # # where `-depth' is one of `-24', `-8', `-4' or `-1', and tells the # script how to treat all the image files given after that option # until the next depth option. For example, you might execute # # icon.pl -24 48x48x24.png 32x32x24.png -8 32x32x8.png -1 monochrome.png # # to build an icon file containing two differently sized 24-bit # images, one 8-bit image and one black and white image. # # Windows .ICO files support a 1-bit alpha channel on all these # image types. That is, any pixel can be either opaque or fully # transparent, but not partially transparent. The alpha channel is # separate from the main image data, meaning that `transparent' is # not required to take up a palette entry. (So an 8-bit image can # have 256 distinct _opaque_ colours, plus transparent pixels as # well.) If the input images have alpha channels, they will be used # to determine which pixels of the icon are transparent, by simple # quantisation half way up (e.g. in a PNG image with an 8-bit alpha # channel, alpha values of 00-7F will be mapped to transparent # pixels, and 80-FF will become opaque). # The Windows 16-colour palette consists of: # - the eight corners of the colour cube (000000, 0000FF, 00FF00, # 00FFFF, FF0000, FF00FF, FFFF00, FFFFFF) # - dim versions of the seven non-black corners, at 128/255 of the # brightness (000080, 008000, 008080, 800000, 800080, 808000, # 808080) # - light grey at 192/255 of full brightness (C0C0C0). %win16pal = ( "\x00\x00\x00\x00" => 0, "\x00\x00\x80\x00" => 1, "\x00\x80\x00\x00" => 2, "\x00\x80\x80\x00" => 3, "\x80\x00\x00\x00" => 4, "\x80\x00\x80\x00" => 5, "\x80\x80\x00\x00" => 6, "\xC0\xC0\xC0\x00" => 7, "\x80\x80\x80\x00" => 8, "\x00\x00\xFF\x00" => 9, "\x00\xFF\x00\x00" => 10, "\x00\xFF\xFF\x00" => 11, "\xFF\x00\x00\x00" => 12, "\xFF\x00\xFF\x00" => 13, "\xFF\xFF\x00\x00" => 14, "\xFF\xFF\xFF\x00" => 15, ); @win16pal = sort { $win16pal{$a} <=> $win16pal{$b} } keys %win16pal; # The black and white palette consists of black (000000) and white # (FFFFFF), obviously. %win2pal = ( "\x00\x00\x00\x00" => 0, "\xFF\xFF\xFF\x00" => 1, ); @win2pal = sort { $win16pal{$a} <=> $win2pal{$b} } keys %win2pal; @hdr = (); @dat = (); $depth = undef; foreach $_ (@ARGV) { if (/^-(24|8|4|1)$/) { $depth = $1; } elsif (defined $depth) { &readicon($_, $depth); } else { $usage = 1; } } if ($usage || length @hdr == 0) { print "usage: icon.pl ( -24 | -8 | -4 | -1 ) image [image...]\n"; print " [ ( -24 | -8 | -4 | -1 ) image [image...] ...]\n"; exit 0; } # Now write out the output icon file. print pack "vvv", 0, 1, scalar @hdr; # file-level header $filepos = 6 + 16 * scalar @hdr; for ($i = 0; $i < scalar @hdr; $i++) { print $hdr[$i]; print pack "V", $filepos; $filepos += length($dat[$i]); } for ($i = 0; $i < scalar @hdr; $i++) { print $dat[$i]; } sub readicon { my $filename = shift @_; my $depth = shift @_; my $pix; my $i; my %pal; # Determine the icon's width and height. my $w = `identify -format %w $filename`; my $h = `identify -format %h $filename`; # Read the file in as RGBA data. We flip vertically at this # point, to avoid having to do it ourselves (.BMP and hence # .ICO are bottom-up). my $data = []; open IDATA, "convert -flip -depth 8 $filename rgba:- |"; push @$data, $rgb while (read IDATA,$rgb,4,0) == 4; close IDATA; # Check we have the right amount of data. $xl = $w * $h; $al = scalar @$data; die "wrong amount of image data ($al, expected $xl) from $filename\n" unless $al == $xl; # Build the alpha channel now, so we can exclude transparent # pixels from the palette analysis. We replace transparent # pixels with undef in the data array. # # We quantise the alpha channel half way up, so that alpha of # 0x80 or more is taken to be fully opaque and 0x7F or less is # fully transparent. Nasty, but the best we can do without # dithering (and don't even suggest we do that!). my $x; my $y; my $alpha = ""; for ($y = 0; $y < $h; $y++) { my $currbyte = 0, $currbits = 0; for ($x = 0; $x < (($w+31)|31)-31; $x++) { $pix = ($x < $w ? $data->[$y*$w+$x] : "\x00\x00\x00\xFF"); my @rgba = unpack "CCCC", $pix; $currbyte <<= 1; $currbits++; if ($rgba[3] < 0x80) { if ($x < $w) { $data->[$y*$w+$x] = undef; } $currbyte |= 1; # MS has the alpha channel inverted :-) } else { # Might as well flip RGBA into BGR0 while we're here. if ($x < $w) { $data->[$y*$w+$x] = pack "CCCC", $rgba[2], $rgba[1], $rgba[0], 0; } } if ($currbits >= 8) { $alpha .= pack "C", $currbyte; $currbits -= 8; } } } # For an 8-bit image, check we have at most 256 distinct # colours, and build the palette. %pal = (); if ($depth == 8) { my $palindex = 0; foreach $pix (@$data) { next unless defined $pix; $pal{$pix} = $palindex++ unless defined $pal{$pix}; } die "too many colours in 8-bit image $filename\n" unless $palindex <= 256; } elsif ($depth == 4) { %pal = %win16pal; } elsif ($depth == 1) { %pal = %win2pal; } my $raster = ""; if ($depth < 24) { # For a non-24-bit image, flatten the image into one palette # index per pixel. $pad = 32 / $depth; # number of pixels to pad scanline to 4-byte align $pmask = $pad-1; for ($y = 0; $y < $h; $y++) { my $currbyte = 0, $currbits = 0; for ($x = 0; $x < (($w+$pmask)|$pmask)-$pmask; $x++) { $currbyte <<= $depth; $currbits += $depth; if ($x < $w && defined ($pix = $data->[$y*$w+$x])) { if (!defined $pal{$pix}) { die "illegal colour value $pix at pixel $i in $filename\n"; } $currbyte |= $pal{$pix}; } if ($currbits >= 8) { $raster .= pack "C", $currbyte; $currbits -= 8; } } } } else { # For a 24-bit image, reverse the order of the R,G,B values # and stick a padding zero on the end. # # (In this loop we don't need to bother padding the # scanline out to a multiple of four bytes, because every # pixel takes four whole bytes anyway.) for ($i = 0; $i < scalar @$data; $i++) { if (defined $data->[$i]) { $raster .= $data->[$i]; } else { $raster .= "\x00\x00\x00\x00"; } } $depth = 32; # and adjust this } # Prepare the icon data. First the header... my $data = pack "VVVvvVVVVVV", 40, # size of bitmap info header $w, # icon width $h*2, # icon height (x2 to indicate the subsequent alpha channel) 1, # 1 plane (common to all MS image formats) $depth, # bits per pixel 0, # no compression length $raster, # image size 0, 0, 0, 0; # resolution, colours used, colours important (ignored) # ... then the palette ... if ($depth <= 8) { my $ncols = (1 << $depth); my $palette = "\x00\x00\x00\x00" x $ncols; foreach $i (keys %pal) { substr($palette, $pal{$i}*4, 4) = $i; } $data .= $palette; } # ... the raster data we already had ready ... $data .= $raster; # ... and the alpha channel we already had as well. $data .= $alpha; # Prepare the header which will represent this image in the # icon file. my $header = pack "CCCCvvV", $w, $h, # width and height (this time the real height) 1 << $depth, # number of colours, if less than 256 0, # reserved 1, # planes $depth, # bits per pixel length $data; # size of real icon data push @hdr, $header; push @dat, $data; } Node-path: putty/icons/mkicon.py Node-kind: file Node-action: add Prop-content-length: 36 Text-delta: true Text-content-length: 29737 Text-content-md5: 4596b2f25c4e24f123a7425d6393f451 Text-content-sha1: 14eae603f43910aba8f2259474a6938d04249ed7 Content-length: 29773 K 14 svn:executable V 1 * PROPS-END SVN���#!/usr/bin/env python import math # Python code which draws the PuTTY icon components at a range of # sizes. # TODO # ---- # # - use of alpha blending # + try for variable-transparency borders # # - can we integrate the Mac icons into all this? Do we want to? def pixel(x, y, colour, canvas): canvas[(int(x),int(y))] = colour def overlay(src, x, y, dst): x = int(x) y = int(y) for (sx, sy), colour in src.items(): dst[sx+x, sy+y] = blend(colour, dst.get((sx+x, sy+y), cT)) def finalise(canvas): for k in canvas.keys(): canvas[k] = finalisepix(canvas[k]) def bbox(canvas): minx, miny, maxx, maxy = None, None, None, None for (x, y) in canvas.keys(): if minx == None: minx, miny, maxx, maxy = x, y, x+1, y+1 else: minx = min(minx, x) miny = min(miny, y) maxx = max(maxx, x+1) maxy = max(maxy, y+1) return (minx, miny, maxx, maxy) def topy(canvas): miny = {} for (x, y) in canvas.keys(): miny[x] = min(miny.get(x, y), y) return miny def render(canvas, minx, miny, maxx, maxy): w = maxx - minx h = maxy - miny ret = [] for y in range(h): ret.append([outpix(cT)] * w) for (x, y), colour in canvas.items(): if x >= minx and x < maxx and y >= miny and y < maxy: ret[y-miny][x-minx] = outpix(colour) return ret # Code to actually draw pieces of icon. These don't generally worry # about positioning within a canvas; they just draw at a standard # location, return some useful coordinates, and leave composition # to other pieces of code. sqrthash = {} def memoisedsqrt(x): if not sqrthash.has_key(x): sqrthash[x] = math.sqrt(x) return sqrthash[x] BR, TR, BL, TL = range(4) # enumeration of quadrants for border() def border(canvas, thickness, squarecorners): # I haven't yet worked out exactly how to do borders in a # properly alpha-blended fashion. # # When you have two shades of dark available (half-dark H and # full-dark F), the right sequence of circular border sections # around a pixel x starts off with these two layouts: # # H F # HxH FxF # H F # # Where it goes after that I'm not entirely sure, but I'm # absolutely sure those are the right places to start. However, # every automated algorithm I've tried has always started off # with the two layouts # # H HHH # HxH HxH # H HHH # # which looks much worse. This is true whether you do # pixel-centre sampling (define an inner circle and an outer # circle with radii differing by 1, set any pixel whose centre # is inside the inner circle to F, any pixel whose centre is # outside the outer one to nothing, interpolate between the two # and round sensibly), _or_ whether you plot a notional circle # of a given radius and measure the actual _proportion_ of each # pixel square taken up by it. # # It's not clear what I should be doing to prevent this. One # option is to attempt error-diffusion: Ian Jackson proved on # paper that if you round each pixel's ideal value to the # nearest of the available output values, then measure the # error at each pixel, propagate that error outwards into the # original values of the surrounding pixels, and re-round # everything, you do get the correct second stage. However, I # haven't tried it at a proper range of radii. # # Another option is that the automated mechanisms described # above would be entirely adequate if it weren't for the fact # that the human visual centres are adapted to detect # horizontal and vertical lines in particular, so the only # place you have to behave a bit differently is at the ends of # the top and bottom row of pixels in the circle, and the top # and bottom of the extreme columns. # # For the moment, what I have below is a very simple mechanism # which always uses only one alpha level for any given border # thickness, and which seems to work well enough for Windows # 16-colour icons. Everything else will have to wait. thickness = memoisedsqrt(thickness) if thickness < 0.9: darkness = 0.5 else: darkness = 1 if thickness < 1: thickness = 1 thickness = round(thickness - 0.5) + 0.3 dmax = int(round(thickness)) if dmax < thickness: dmax = dmax + 1 cquadrant = [[0] * (dmax+1) for x in range(dmax+1)] squadrant = [[0] * (dmax+1) for x in range(dmax+1)] for x in range(dmax+1): for y in range(dmax+1): if max(x, y) < thickness: squadrant[x][y] = darkness if memoisedsqrt(x*x+y*y) < thickness: cquadrant[x][y] = darkness bvalues = {} for (x, y), colour in canvas.items(): for dx in range(-dmax, dmax+1): for dy in range(-dmax, dmax+1): quadrant = 2 * (dx < 0) + (dy < 0) if (x, y, quadrant) in squarecorners: bval = squadrant[abs(dx)][abs(dy)] else: bval = cquadrant[abs(dx)][abs(dy)] if bvalues.get((x+dx,y+dy),0) < bval: bvalues[(x+dx,y+dy)] = bval for (x, y), value in bvalues.items(): if not canvas.has_key((x,y)): canvas[(x,y)] = dark(value) def sysbox(size): canvas = {} # The system box of the computer. height = int(round(3*size)) width = int(round(17*size)) depth = int(round(2*size)) highlight = int(round(1*size)) bothighlight = int(round(0.49*size)) floppystart = int(round(19*size)) # measured in half-pixels floppyend = int(round(29*size)) # measured in half-pixels floppybottom = height - bothighlight floppyrheight = 0.7 * size floppyheight = int(round(floppyrheight)) if floppyheight < 1: floppyheight = 1 floppytop = floppybottom - floppyheight # The front panel is rectangular. for x in range(width): for y in range(height): grey = 3 if x < highlight or y < highlight: grey = grey + 1 if x >= width-highlight or y >= height-bothighlight: grey = grey - 1 if y < highlight and x >= width-highlight: v = (highlight-1-y) - (x-(width-highlight)) if v < 0: grey = grey - 1 elif v > 0: grey = grey + 1 if y >= floppytop and y < floppybottom and \ 2*x+2 > floppystart and 2*x < floppyend: if 2*x >= floppystart and 2*x+2 <= floppyend and \ floppyrheight >= 0.7: grey = 0 else: grey = 2 pixel(x, y, greypix(grey/4.0), canvas) # The side panel is a parallelogram. for x in range(depth): for y in range(height+1): pixel(x+width, y-(x+1), greypix(0.5), canvas) # The top panel is another parallelogram. for x in range(width-1): for y in range(depth): grey = 3 if x >= width-1 - highlight: grey = grey + 1 pixel(x+(y+1), -(y+1), greypix(grey/4.0), canvas) # And draw a border. border(canvas, size, []) return canvas def monitor(size): canvas = {} # The computer's monitor. height = int(round(9.55*size)) width = int(round(11*size)) surround = int(round(1*size)) botsurround = int(round(2*size)) sheight = height - surround - botsurround swidth = width - 2*surround depth = int(round(2*size)) highlight = int(round(math.sqrt(size))) shadow = int(round(0.55*size)) # The front panel is rectangular. for x in range(width): for y in range(height): if x >= surround and y >= surround and \ x < surround+swidth and y < surround+sheight: # Screen. sx = (float(x-surround) - swidth/3) / swidth sy = (float(y-surround) - sheight/3) / sheight shighlight = 1.0 - (sx*sx+sy*sy)*0.27 pix = bluepix(shighlight) if x < surround+shadow or y < surround+shadow: pix = blend(cD, pix) # sharp-edged shadow on top and left else: # Complicated double bevel on the screen surround. # First, the outer bevel. We compute the distance # from this pixel to each edge of the front # rectangle. list = [ (x, +1), (y, +1), (width-1-x, -1), (height-1-y, -1) ] # Now sort the list to find the distance to the # _nearest_ edge, or the two joint nearest. list.sort() # If there's one nearest edge, that determines our # bevel colour. If there are two joint nearest, our # bevel colour is their shared one if they agree, # and neutral otherwise. outerbevel = 0 if list[0][0] < list[1][0] or list[0][1] == list[1][1]: if list[0][0] < highlight: outerbevel = list[0][1] # Now, the inner bevel. We compute the distance # from this pixel to each edge of the screen # itself. list = [ (surround-1-x, -1), (surround-1-y, -1), (x-(surround+swidth), +1), (y-(surround+sheight), +1) ] # Now we sort to find the _maximum_ distance, which # conveniently ignores any less than zero. list.sort() # And now the strategy is pretty much the same as # above, only we're working from the opposite end # of the list. innerbevel = 0 if list[-1][0] > list[-2][0] or list[-1][1] == list[-2][1]: if list[-1][0] >= 0 and list[-1][0] < highlight: innerbevel = list[-1][1] # Now we know the adjustment we want to make to the # pixel's overall grey shade due to the outer # bevel, and due to the inner one. We break a tie # in favour of a light outer bevel, but otherwise # add. grey = 3 if outerbevel > 0 or outerbevel == innerbevel: innerbevel = 0 grey = grey + outerbevel + innerbevel pix = greypix(grey / 4.0) pixel(x, y, pix, canvas) # The side panel is a parallelogram. for x in range(depth): for y in range(height): pixel(x+width, y-x, greypix(0.5), canvas) # The top panel is another parallelogram. for x in range(width): for y in range(depth-1): pixel(x+(y+1), -(y+1), greypix(0.75), canvas) # And draw a border. border(canvas, size, [(0,int(height-1),BL)]) return canvas def computer(size): # Monitor plus sysbox. m = monitor(size) s = sysbox(size) x = int(round((2+size/(size+1))*size)) y = int(round(4*size)) mb = bbox(m) sb = bbox(s) xoff = sb[0] - mb[0] + x yoff = sb[3] - mb[3] - y overlay(m, xoff, yoff, s) return s def lightning(size): canvas = {} # The lightning bolt motif. # We always want this to be an even number of pixels in span. width = round(7*size) * 2 height = round(8*size) * 2 # The outer edge of each side of the bolt goes to this point. outery = round(8.4*size) outerx = round(11*size) # And the inner edge goes to this point. innery = height - 1 - outery innerx = round(7*size) for y in range(int(height)): list = [] if y <= outery: list.append(width-1-int(outerx * float(y) / outery + 0.3)) if y <= innery: list.append(width-1-int(innerx * float(y) / innery + 0.3)) y0 = height-1-y if y0 <= outery: list.append(int(outerx * float(y0) / outery + 0.3)) if y0 <= innery: list.append(int(innerx * float(y0) / innery + 0.3)) list.sort() for x in range(int(list[0]), int(list[-1]+1)): pixel(x, y, cY, canvas) # And draw a border. border(canvas, size, [(int(width-1),0,TR), (0,int(height-1),BL)]) return canvas def document(size): canvas = {} # The document used in the PSCP/PSFTP icon. width = round(13*size) height = round(16*size) lineht = round(1*size) if lineht < 1: lineht = 1 linespc = round(0.7*size) if linespc < 1: linespc = 1 nlines = int((height-linespc)/(lineht+linespc)) height = nlines*(lineht+linespc)+linespc # round this so it fits better # Start by drawing a big white rectangle. for y in range(int(height)): for x in range(int(width)): pixel(x, y, cW, canvas) # Now draw lines of text. for line in range(nlines): # Decide where this line of text begins. if line == 0: start = round(4*size) elif line < 5*nlines/7: start = round((line - (nlines/7)) * size) else: start = round(1*size) if start < round(1*size): start = round(1*size) # Decide where it ends. endpoints = [10, 8, 11, 6, 5, 7, 5] ey = line * 6.0 / (nlines-1) eyf = math.floor(ey) eyc = math.ceil(ey) exf = endpoints[int(eyf)] exc = endpoints[int(eyc)] if eyf == eyc: end = exf else: end = exf * (eyc-ey) + exc * (ey-eyf) end = round(end * size) liney = height - (lineht+linespc) * (line+1) for x in range(int(start), int(end)): for y in range(int(lineht)): pixel(x, y+liney, cK, canvas) # And draw a border. border(canvas, size, \ [(0,0,TL),(int(width-1),0,TR),(0,int(height-1),BL), \ (int(width-1),int(height-1),BR)]) return canvas def hat(size): canvas = {} # The secret-agent hat in the Pageant icon. topa = [6]*9+[5,3,1,0,0,1,2,2,1,1,1,9,9,10,10,11,11,12,12] topa = [round(x*size) for x in topa] botl = round(topa[0]+2.4*math.sqrt(size)) botr = round(topa[-1]+2.4*math.sqrt(size)) width = round(len(topa)*size) # Line equations for the top and bottom of the hat brim, in the # form y=mx+c. c, of course, needs scaling by size, but m is # independent of size. brimm = 1.0 / 3.75 brimtopc = round(4*size/3) brimbotc = round(10*size/3) for x in range(int(width)): xs = float(x) * (len(topa)-1) / (width-1) xf = math.floor(xs) xc = math.ceil(xs) topf = topa[int(xf)] topc = topa[int(xc)] if xf == xc: top = topf else: top = topf * (xc-xs) + topc * (xs-xf) top = math.floor(top) bot = round(botl + (botr-botl) * x/(width-1)) for y in range(int(top), int(bot)): pixel(x, y, cK, canvas) # Now draw the brim. for x in range(int(width)): brimtop = brimtopc + brimm * x brimbot = brimbotc + brimm * x for y in range(int(math.floor(brimtop)), int(math.ceil(brimbot))): tophere = max(min(brimtop - y, 1), 0) bothere = max(min(brimbot - y, 1), 0) grey = bothere - tophere # Only draw brim pixels over pixels which are (a) part # of the main hat, and (b) not right on its edge. if canvas.has_key((x,y)) and \ canvas.has_key((x,y-1)) and \ canvas.has_key((x,y+1)) and \ canvas.has_key((x-1,y)) and \ canvas.has_key((x+1,y)): pixel(x, y, greypix(grey), canvas) return canvas def key(size): canvas = {} # The key in the PuTTYgen icon. keyheadw = round(9.5*size) keyheadh = round(12*size) keyholed = round(4*size) keyholeoff = round(2*size) # Ensure keyheadh and keyshafth have the same parity. keyshafth = round((2*size - (int(keyheadh)&1)) / 2) * 2 + (int(keyheadh)&1) keyshaftw = round(18.5*size) keyhead = [round(x*size) for x in [12,11,8,10,9,8,11,12]] squarepix = [] # Ellipse for the key head, minus an off-centre circular hole. for y in range(int(keyheadh)): dy = (y-(keyheadh-1)/2.0) / (keyheadh/2.0) dyh = (y-(keyheadh-1)/2.0) / (keyholed/2.0) for x in range(int(keyheadw)): dx = (x-(keyheadw-1)/2.0) / (keyheadw/2.0) dxh = (x-(keyheadw-1)/2.0-keyholeoff) / (keyholed/2.0) if dy*dy+dx*dx <= 1 and dyh*dyh+dxh*dxh > 1: pixel(x + keyshaftw, y, cy, canvas) # Rectangle for the key shaft, extended at the bottom for the # key head detail. for x in range(int(keyshaftw)): top = round((keyheadh - keyshafth) / 2) bot = round((keyheadh + keyshafth) / 2) xs = float(x) * (len(keyhead)-1) / round((len(keyhead)-1)*size) xf = math.floor(xs) xc = math.ceil(xs) in_head = 0 if xc < len(keyhead): in_head = 1 yf = keyhead[int(xf)] yc = keyhead[int(xc)] if xf == xc: bot = yf else: bot = yf * (xc-xs) + yc * (xs-xf) for y in range(int(top),int(bot)): pixel(x, y, cy, canvas) if in_head: last = (x, y) if x == 0: squarepix.append((x, int(top), TL)) if x == 0: squarepix.append(last + (BL,)) if last != None and not in_head: squarepix.append(last + (BR,)) last = None # And draw a border. border(canvas, size, squarepix) return canvas def linedist(x1,y1, x2,y2, x,y): # Compute the distance from the point x,y to the line segment # joining x1,y1 to x2,y2. Returns the distance vector, measured # with x,y at the origin. vectors = [] # Special case: if x1,y1 and x2,y2 are the same point, we # don't attempt to extrapolate it into a line at all. if x1 != x2 or y1 != y2: # First, find the nearest point to x,y on the infinite # projection of the line segment. So we construct a vector # n perpendicular to that segment... nx = y2-y1 ny = x1-x2 # ... compute the dot product of (x1,y1)-(x,y) with that # vector... nd = (x1-x)*nx + (y1-y)*ny # ... multiply by the vector we first thought of... ndx = nd * nx ndy = nd * ny # ... and divide twice by the length of n. ndx = ndx / (nx*nx+ny*ny) ndy = ndy / (nx*nx+ny*ny) # That gives us a displacement vector from x,y to the # nearest point. See if it's within the range of the line # segment. cx = x + ndx cy = y + ndy if cx >= min(x1,x2) and cx <= max(x1,x2) and \ cy >= min(y1,y2) and cy <= max(y1,y2): vectors.append((ndx,ndy)) # Now we have up to three candidate result vectors: (ndx,ndy) # as computed just above, and the two vectors to the ends of # the line segment, (x1-x,y1-y) and (x2-x,y2-y). Pick the # shortest. vectors = vectors + [(x1-x,y1-y), (x2-x,y2-y)] bestlen, best = None, None for v in vectors: vlen = v[0]*v[0]+v[1]*v[1] if bestlen == None or bestlen > vlen: bestlen = vlen best = v return best def spanner(size): canvas = {} # The spanner in the config box icon. headcentre = 0.5 + round(4*size) headradius = headcentre + 0.1 headhighlight = round(1.5*size) holecentre = 0.5 + round(3*size) holeradius = round(2*size) holehighlight = round(1.5*size) shaftend = 0.5 + round(25*size) shaftwidth = round(2*size) shafthighlight = round(1.5*size) cmax = shaftend + shaftwidth # Define three line segments, such that the shortest distance # vectors from any point to each of these segments determines # everything we need to know about where it is on the spanner # shape. segments = [ ((0,0), (holecentre, holecentre)), ((headcentre, headcentre), (headcentre, headcentre)), ((headcentre+headradius/math.sqrt(2), headcentre+headradius/math.sqrt(2)), (cmax, cmax)) ] for y in range(int(cmax)): for x in range(int(cmax)): vectors = [linedist(a,b,c,d,x,y) for ((a,b),(c,d)) in segments] dists = [memoisedsqrt(vx*vx+vy*vy) for (vx,vy) in vectors] # If the distance to the hole line is less than # holeradius, we're not part of the spanner. if dists[0] < holeradius: continue # If the distance to the head `line' is less than # headradius, we are part of the spanner; likewise if # the distance to the shaft line is less than # shaftwidth _and_ the resulting shaft point isn't # beyond the shaft end. if dists[1] > headradius and \ (dists[2] > shaftwidth or x+vectors[2][0] >= shaftend): continue # We're part of the spanner. Now compute the highlight # on this pixel. We do this by computing a `slope # vector', which points from this pixel in the # direction of its nearest edge. We store an array of # slope vectors, in polar coordinates. angles = [math.atan2(vy,vx) for (vx,vy) in vectors] slopes = [] if dists[0] < holeradius + holehighlight: slopes.append(((dists[0]-holeradius)/holehighlight,angles[0])) if dists[1]/headradius < dists[2]/shaftwidth: if dists[1] > headradius - headhighlight and dists[1] < headradius: slopes.append(((headradius-dists[1])/headhighlight,math.pi+angles[1])) else: if dists[2] > shaftwidth - shafthighlight and dists[2] < shaftwidth: slopes.append(((shaftwidth-dists[2])/shafthighlight,math.pi+angles[2])) # Now we find the smallest distance in that array, if # any, and that gives us a notional position on a # sphere which we can use to compute the final # highlight level. bestdist = None bestangle = 0 for dist, angle in slopes: if bestdist == None or bestdist > dist: bestdist = dist bestangle = angle if bestdist == None: bestdist = 1.0 sx = (1.0-bestdist) * math.cos(bestangle) sy = (1.0-bestdist) * math.sin(bestangle) sz = math.sqrt(1.0 - sx*sx - sy*sy) shade = sx-sy+sz / math.sqrt(3) # can range from -1 to +1 shade = 1.0 - (1-shade)/3 pixel(x, y, yellowpix(shade), canvas) # And draw a border. border(canvas, size, []) return canvas # Functions to draw entire icons by composing the above components. def xybolt(c1, c2, size, boltoffx=0, boltoffy=0): # Two unspecified objects and a lightning bolt. canvas = {} w = h = round(32 * size) bolt = lightning(size) # Position c2 against the top right of the icon. bb = bbox(c2) assert bb[2]-bb[0] <= w and bb[3]-bb[1] <= h overlay(c2, w-bb[2], 0-bb[1], canvas) # Position c1 against the bottom left of the icon. bb = bbox(c1) assert bb[2]-bb[0] <= w and bb[3]-bb[1] <= h overlay(c1, 0-bb[0], h-bb[3], canvas) # Place the lightning bolt artistically off-centre. (The # rationale for this positioning is that it's centred on the # midpoint between the centres of the two monitors in the PuTTY # icon proper, but it's not really feasible to _base_ the # calculation here on that.) bb = bbox(bolt) assert bb[2]-bb[0] <= w and bb[3]-bb[1] <= h overlay(bolt, (w-bb[0]-bb[2])/2 - round((1-boltoffx)*size), \ (h-bb[1]-bb[3])/2 - round((2-boltoffy)*size), canvas) return canvas def putty_icon(size): return xybolt(computer(size), computer(size), size) def puttycfg_icon(size): w = h = round(32 * size) s = spanner(size) canvas = putty_icon(size) # Centre the spanner. bb = bbox(s) overlay(s, (w-bb[0]-bb[2])/2, (h-bb[1]-bb[3])/2, canvas) return canvas def puttygen_icon(size): return xybolt(computer(size), key(size), size, boltoffx=2) def pscp_icon(size): return xybolt(document(size), computer(size), size, boltoffx=1) def pterm_icon(size): # Just a really big computer. canvas = {} w = h = round(32 * size) c = computer(size * 1.4) # Centre c in the return canvas. bb = bbox(c) assert bb[2]-bb[0] <= w and bb[3]-bb[1] <= h overlay(c, (w-bb[0]-bb[2])/2, (h-bb[1]-bb[3])/2, canvas) return canvas def ptermcfg_icon(size): w = h = round(32 * size) s = spanner(size) canvas = pterm_icon(size) # Centre the spanner. bb = bbox(s) overlay(s, (w-bb[0]-bb[2])/2, (h-bb[1]-bb[3])/2, canvas) return canvas def pageant_icon(size): # A biggish computer, in a hat. canvas = {} w = h = round(32 * size) c = computer(size * 1.3) ht = hat(size) cbb = bbox(c) hbb = bbox(ht) # Determine the relative y-coordinates of the computer and hat. # We just centre the one on the other. xrel = (cbb[0]+cbb[2]-hbb[0]-hbb[2])/2 # Determine the relative y-coordinates of the computer and hat. # We do this by sitting the hat as low down on the computer as # possible without any computer showing over the top. To do # this we first have to find the minimum x coordinate at each # y-coordinate of both components. cty = topy(c) hty = topy(ht) yrelmin = None for cx in cty.keys(): hx = cx - xrel assert hty.has_key(hx) yrel = cty[cx] - hty[hx] if yrelmin == None: yrelmin = yrel else: yrelmin = min(yrelmin, yrel) # Overlay the hat on the computer. overlay(ht, xrel, yrelmin, c) # And centre the result in the main icon canvas. bb = bbox(c) assert bb[2]-bb[0] <= w and bb[3]-bb[1] <= h overlay(c, (w-bb[0]-bb[2])/2, (h-bb[1]-bb[3])/2, canvas) return canvas # Test and output functions. import os import sys def testrun(func, fname): canvases = [] for size in [0.5, 0.6, 1.0, 1.2, 1.5, 4.0]: canvases.append(func(size)) wid = 0 ht = 0 for canvas in canvases: minx, miny, maxx, maxy = bbox(canvas) wid = max(wid, maxx-minx+4) ht = ht + maxy-miny+4 block = [] for canvas in canvases: minx, miny, maxx, maxy = bbox(canvas) block.extend(render(canvas, minx-2, miny-2, minx-2+wid, maxy+2)) p = os.popen("convert -depth 8 -size %dx%d rgb:- %s" % (wid,ht,fname), "w") assert len(block) == ht for line in block: assert len(line) == wid for r, g, b, a in line: # Composite on to orange. r = int(round((r * a + 255 * (255-a)) / 255.0)) g = int(round((g * a + 128 * (255-a)) / 255.0)) b = int(round((b * a + 0 * (255-a)) / 255.0)) p.write("%c%c%c" % (r,g,b)) p.close() def drawicon(func, width, fname, orangebackground = 0): canvas = func(width / 32.0) finalise(canvas) minx, miny, maxx, maxy = bbox(canvas) assert minx >= 0 and miny >= 0 and maxx <= width and maxy <= width block = render(canvas, 0, 0, width, width) p = os.popen("convert -depth 8 -size %dx%d rgba:- %s" % (width,width,fname), "w") assert len(block) == width for line in block: assert len(line) == width for r, g, b, a in line: if orangebackground: # Composite on to orange. r = int(round((r * a + 255 * (255-a)) / 255.0)) g = int(round((g * a + 128 * (255-a)) / 255.0)) b = int(round((b * a + 0 * (255-a)) / 255.0)) a = 255 p.write("%c%c%c%c" % (r,g,b,a)) p.close() args = sys.argv[1:] orangebackground = test = 0 colours = 1 # 0=mono, 1=16col, 2=truecol doingargs = 1 realargs = [] for arg in args: if doingargs and arg[0] == "-": if arg == "-t": test = 1 elif arg == "-it": orangebackground = 1 elif arg == "-2": colours = 0 elif arg == "-T": colours = 2 elif arg == "--": doingargs = 0 else: sys.stderr.write("unrecognised option '%s'\n" % arg) sys.exit(1) else: realargs.append(arg) if colours == 0: # Monochrome. cK=cr=cg=cb=cm=cc=cP=cw=cR=cG=cB=cM=cC=cD = 0 cY=cy=cW = 1 cT = -1 def greypix(value): return [cK,cW][int(round(value))] def yellowpix(value): return [cK,cW][int(round(value))] def bluepix(value): return cK def dark(value): return [cT,cK][int(round(value))] def blend(col1, col2): if col1 == cT: return col2 else: return col1 pixvals = [ (0x00, 0x00, 0x00, 0xFF), # cK (0xFF, 0xFF, 0xFF, 0xFF), # cW (0x00, 0x00, 0x00, 0x00), # cT ] def outpix(colour): return pixvals[colour] def finalisepix(colour): return colour elif colours == 1: # Windows 16-colour palette. cK,cr,cg,cy,cb,cm,cc,cP,cw,cR,cG,cY,cB,cM,cC,cW = range(16) cT = -1 cD = -2 # special translucent half-darkening value used internally def greypix(value): return [cK,cw,cw,cP,cW][int(round(4*value))] def yellowpix(value): return [cK,cy,cY][int(round(2*value))] def bluepix(value): return [cK,cb,cB][int(round(2*value))] def dark(value): return [cT,cD,cK][int(round(2*value))] def blend(col1, col2): if col1 == cT: return col2 elif col1 == cD: return [cK,cK,cK,cK,cK,cK,cK,cw,cK,cr,cg,cy,cb,cm,cc,cw,cD,cD][col2] else: return col1 pixvals = [ (0x00, 0x00, 0x00, 0xFF), # cK (0x80, 0x00, 0x00, 0xFF), # cr (0x00, 0x80, 0x00, 0xFF), # cg (0x80, 0x80, 0x00, 0xFF), # cy (0x00, 0x00, 0x80, 0xFF), # cb (0x80, 0x00, 0x80, 0xFF), # cm (0x00, 0x80, 0x80, 0xFF), # cc (0xC0, 0xC0, 0xC0, 0xFF), # cP (0x80, 0x80, 0x80, 0xFF), # cw (0xFF, 0x00, 0x00, 0xFF), # cR (0x00, 0xFF, 0x00, 0xFF), # cG (0xFF, 0xFF, 0x00, 0xFF), # cY (0x00, 0x00, 0xFF, 0xFF), # cB (0xFF, 0x00, 0xFF, 0xFF), # cM (0x00, 0xFF, 0xFF, 0xFF), # cC (0xFF, 0xFF, 0xFF, 0xFF), # cW (0x00, 0x00, 0x00, 0x80), # cD (0x00, 0x00, 0x00, 0x00), # cT ] def outpix(colour): return pixvals[colour] def finalisepix(colour): # cD is used internally, but can't be output. Convert to cK. if colour == cD: return cK return colour else: # True colour. cK = (0x00, 0x00, 0x00, 0xFF) cr = (0x80, 0x00, 0x00, 0xFF) cg = (0x00, 0x80, 0x00, 0xFF) cy = (0x80, 0x80, 0x00, 0xFF) cb = (0x00, 0x00, 0x80, 0xFF) cm = (0x80, 0x00, 0x80, 0xFF) cc = (0x00, 0x80, 0x80, 0xFF) cP = (0xC0, 0xC0, 0xC0, 0xFF) cw = (0x80, 0x80, 0x80, 0xFF) cR = (0xFF, 0x00, 0x00, 0xFF) cG = (0x00, 0xFF, 0x00, 0xFF) cY = (0xFF, 0xFF, 0x00, 0xFF) cB = (0x00, 0x00, 0xFF, 0xFF) cM = (0xFF, 0x00, 0xFF, 0xFF) cC = (0x00, 0xFF, 0xFF, 0xFF) cW = (0xFF, 0xFF, 0xFF, 0xFF) cD = (0x00, 0x00, 0x00, 0x80) cT = (0x00, 0x00, 0x00, 0x00) def greypix(value): value = max(min(value, 1), 0) return (int(round(0xFF*value)),) * 3 + (0xFF,) def yellowpix(value): value = max(min(value, 1), 0) return (int(round(0xFF*value)),) * 2 + (0, 0xFF) def bluepix(value): value = max(min(value, 1), 0) return (0, 0, int(round(0xFF*value)), 0xFF) def dark(value): value = max(min(value, 1), 0) return (0, 0, 0, int(round(0xFF*value))) def blend(col1, col2): r1,g1,b1,a1 = col1 r2,g2,b2,a2 = col2 r = int(round((r1*a1 + r2*(0xFF-a1)) / 255.0)) g = int(round((g1*a1 + g2*(0xFF-a1)) / 255.0)) b = int(round((b1*a1 + b2*(0xFF-a1)) / 255.0)) a = int(round((255*a1 + a2*(0xFF-a1)) / 255.0)) return r, g, b, a def outpix(colour): return colour if colours == 2: # True colour with no alpha blending: we still have to # finalise half-dark pixels to black. def finalisepix(colour): if colour[3] > 0: return colour[:3] + (0xFF,) return colour else: def finalisepix(colour): return colour if test: testrun(eval(realargs[0]), realargs[1]) else: drawicon(eval(realargs[0]), int(realargs[1]), realargs[2], orangebackground) Node-path: putty/windows/pageant.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c20e7258f00f854018808c30d31dcbd Text-delta-base-sha1: 219f03de1754f86888c796e7c3a209c4a76665ab Text-content-length: 3485 Text-content-md5: b1796f404730c97c08323c5c4ae7778a Text-content-sha1: 373d58cc77753c5e2bd191d626bab5287d08f2c8 Content-length: 3485 SVN��6n.c|�[<L�u;�N@�<@�M@ �N@�N@)�������(��f��� �������00���h��v�������� �� ���0�� ��00���0�� ��(������ ����������ww��x�����wwwx����x����x����x����x��������������������������w���������������������������������������������������������(��� ���@����������x����wwwww��x����wwwwwwwwwx��������������w����w����wwwwwww����x�������Lx�������Lx�������Lx�������Lx�������Lx�������Lx�������Lx�������DDDDDDx�������x��������wwwww�����������ww��������������������������������������������������p�����������������������x�����������x�������������������������������������������c������?����c(���0���`����������w�������wwwwwwww����x������wwwwwwwwwwwwwwx������wwwwwwwwwwwwwwx����������x�����wwwwwwwwwwwwww������w�����������ww������ww�������wwwwwwwwwxww�������wwwwwwwwwx����������������������������������������������������������������������������������������������������������������������������������������������������������DDDDDDDD�����������x������������������������wwwwwwwwp���������������wwwww�������������������wwpp�������������������������������������������������������x����������������x���������������������������������������������������������������������������������?�������������������������������������������������������������������������������������������������������������������������������������������?�����?�����?�������������������������������0��������(������ ���������@����������������������������?��?��� ����0��0��0��0�����������������������������������������������������������(��� ���@���������������������������������������������������������������|���������������������������������������������������������������������������c������?����c(���0���`���������������������������������������������������?������������������_���������������������������������������������������������������������������������������������������������������������������������������������������������?��������������������������������������������������������������������������������������?�������������������������������������������������������������������������������������������������������������������������������������������?�����?�����?�������������������������������0�������� Node-path: putty/windows/pageants.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fe0b946e4fcf82c5462e395b52615006 Text-delta-base-sha1: cbb00a9216fb9cb4be47454a1b94bb3f1770a07d Text-content-length: 437 Text-content-md5: 3f3aa13573ca20285dc94cfff45cf136 Text-content-sha1: c198349b613de870d45af9678527cc7408c55231 Content-length: 437 SVN��>~"�\+g�������(��&���������N��(������ ���������ww��x�����wwwx����x����x����x����x��������������������������w���������������������������������������������������������(������ ���������@����������������������������?��?��� ����0��0��0��0����������������������������������������������������������� Node-path: putty/windows/pscp.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 401b5a0ee63cc6d9d0346d2c1270f718 Text-delta-base-sha1: 14176796b0ca4e635d0a4757f80ea1198d1de089 Text-content-length: 3533 Text-content-md5: e483fa39b0c0d14bab60893dbc72fd6b Text-content-sha1: 0fceb391ea2551289f2770e313007eb5811cca0c Content-length: 3533 SVN��>n! |�Z<M�;�Sz�]k\�b<��������(��f��� �������00���h��v�������� �� ���0�� ��00���0�� ��(������ ������������������������������������������� ��� ���x���D����K���������������������������������������������������������������(��� ���@���������� ���������������������� x�������� www������ x������������������ �������� ���������@ Lj���������L Lj���������L Lj���������LLj���������L�Lj���������LLj���������DDDDG����������������������������������(���0���`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������ ������������������������������� ������������������������������� ������������� ���������������������������������������������� ������������������� ���������� w���w����������𻻻wwwww��������� x��������������������p��������w����������px �����������pwwwww��������������������������L ψ��������������L ψ��������������L�ψ��������������L ψ��������������Lψ��������������L�ψ��������������Lψ��������������Lψ��������������DDDDDDO����������������������������x��������������wwwwwwww���������������wwwwwwwwx���������������������������������������������������������������������������������������������������������������������������?�������������������������������������������������������������������������������������������������������?��(������ ���������@�������������������������������c������G���k���D���{���������(���������������������������������������������������������(��� ���@���������������������������������������x����@|����@ ����a��<��s\����@����C����<������o�0p�p�p�p��p��p��p������������������������������������������������(���0���`���������������������������������������������~������~�����������`�����`����������`�8�����`�8����������p?�����p?����������|s�����|u����������` 8�����`�����h�����`�����`���������������������������������/����7����;��������� g~��������������������������G�����'�����������������������������������������������������������������������������������������������������������������������������������������������?�������������������������������������������������������������������������������������������������������?�� Node-path: putty/windows/putty.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1eeb6033797eebd2e3781a4228a05e22 Text-delta-base-sha1: 7615b8c192f81b6416b8ede7d82bad03eb6992ea Text-content-length: 4093 Text-content-md5: d77f9e561314ece1a5dd7b0873c8d5de Text-content-sha1: bb915cbc030a7e4a30e6f362650fbff3858ac516 Content-length: 4093 SVN��vnnn�������(��f��� �������00���h��v�������� �� ���0�� ��00���0�� ��(������ �������������������������������������������������������������������������ww�����www���ǀ����Lǀ����G���������������w���KG����ĸ����H�������������������������?��?�����������������������(��� ���@���������������������������������������������������������������������������������wwww�x������wwwwwwwx�������������p��������������x��������x���������x���������x��������� x���������x��������� �x��������� x���������DD x�������������������www ���������������wx���������wwww������x������ ����������������������������� Lj���������@ Lj���������L�Lj���������L Lj���������L Lj���������LLj���������DDDDG�������������������wwwwwx�����������������������������?�?�?�?�?�?�?�?�����������������������(���0���`����������������������������������������������������������������������������������������x����������wwwwwx���x���������wwwwwwwwwwx������������������x����������w�������������������w�����������wwwwwwwx������������������������������������������������������������������������������������������ �������������������������� ��������������DD@D������������� x����������������������������wwwww x��������������wwwwp w�������������������������������������������� ������������������� ��������� ww���w����������wwwwww��������� x�����������������������������w����������p �����������wwwwww��������������������������L ψ��������������L ψ��������������L�ψ��������������L ψ��������������Lψ��������������L�ψ��������������Lψ��������������Lψ��������������DDDDDDO����������������������������x��������������wwwwwwww���������������wwwwwwwwx��������������������������������������������������������������������������?����?����?����?����?����?����?����?����?����?����?����?����?�������������������������������������������������������������������������������������������������������������?��(������ ���������@�������������������������������`��?������)��6��>������X��(����������������������?��?�����������������������(��� ���@���������������������������������������� ��p������C�3������<�?�������`p�0p�p�p��p��p��p������������������?�?�?�?�?�?�?�?�����������������������(���0���`������������������������������������������������������������0���������|�����������������������������������������������������π����w���������� �����������������߀����?��������.���������� ~��������7�������� �����������������������������������������������������������������������������������������������������������?����?����?����?����?����?����?����?����?����?����?����?����?�������������������������������������������������������������������������������������������������������������?�� Node-path: putty/windows/puttycfg.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7595dddf6c3bef49e18ba68cddce4437 Text-delta-base-sha1: ebf8073296accd6f1057063131ba8f4ff2289843 Text-content-length: 4093 Text-content-md5: 884a8ceb053abdceb53855baed2485a7 Text-content-sha1: 6eca6e89b7ce32826c9814c60342442901f125d4 Content-length: 4093 SVN��vnnn�������(��f��� �������00���h��v�������� �� ���0�� ��00���0�� ��(������ �������������������������������������������������������������������������ww;�www��ǀ;��L���H;���3�����3;�3;�;w KG��ĸ���;H�� �������������������������������������������������(��� ���@���������������������������������������������������������������������������������wwww�x������wwwwwwwx���������0���p��������;����x��3���x��;����x��3����x�;����� x�3�����x;������ �x3������ x;�������DD p3�������;��������www�3������������;x��������3�wwww�����; x�����3��������3; ��333����;� Lj����@ Lj���;�L�Lj���;��;�L Lj������;�L Lj�����;�LLj�����3��DDDDG������������������wwwwwx���������������������������� �8�0� ?����������������������� ��� � ��<���(���0���`����������������������������������������������������������������������������������������x����������wwwwwx���x���������wwwwwwwwwwx�����������������x����3����w������������;����w���3����wwwwwwwx��;��������3�������;��������3�������;��������3��������;������� �3�������;�������� �3��������DD@D;��������� x3����������;�����������wwwww �3�����������wwwwp ;�������������������3������������������;����������������� 3���������;ww���w���������3wwwwww�������; x�������3��������; ��������w����03 ���333;�wwwwww��3;�������3��L ψ�����3��L ψ�����;� ���L�ψ����;���;��L ψ�������;��Lψ���������;���L�ψ���������;���Lψ��������;���Lψ��������3���DDDDDDO������������������ �����x��������������wwwwwwww���������������wwwwwwwwx������������������������������������������������������?��������������������?�����>�?����<�����8�����0���� ��������������������?������������������������������������������������������������������������������������8�����x����8����8����x����x����x��������������������������?��(������ ���������@�������������������������������f��?����0��(`��4����F��>��&X��(�� ������������������������������������������������(��� ���@���������������������������������������� �0px�C�3<�x����<�'�w���=`p0ppp��p��p�p���������������� �8�0� ?����������������������� ��� � ��<���(���0���`����������������������������������������������������������0�����|�����?��������������������������?����������q�������������������������?߀��������{�����������~�����7���� ���� ����������������������<���`����������������������������������������������?��������������������?�����>�?����<�����8�����0���� ��������������������?������������������������������������������������������������������������������������8�����x����8����8����x����x����x��������������������������?�� Node-path: putty/windows/puttygen.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 42b6ba5e5c543bac15811a1768e0f6fe Text-delta-base-sha1: 071b7f309749c0546ddf19dc43313011a50c40b7 Text-content-length: 3617 Text-content-md5: 70a2f1d996aafff0b461ef722c0314cc Text-content-sha1: 06d573c0823d565cc2ec954cdbeb2a38e644e9fd Content-length: 3617 SVN��~ny{�[+N�b,�V*�b,��������(��f��� �������00���h��v�������� �� ���0�� ��00���0�� ��(������ ���������ww�����www���Dǀ����KG����ĸ������������������ 303330 �0333300�����3�0�����3���������������������?��?��?����������������������������(��� ���@����������wwww�x������wwwwwwwx�������������p��������������x��������x���������x���������x��������� x���������x��������� �x������������������DDD �������������������wwww ���������������������������������������������������?�?�?�?�?�?�?�?�� �������������(���0���`�����������������x����������wwwwwx���x���������wwwwwwwwwwx������������������x����������w�������������������w�����������wwwwwwwx������������������������������������������������������������������������������������������ �������������������������� ��������������DDDD@������������� ����������������������������wwwwwww ���������������wwwwwwp ���������������������������������������������� ������������������� ������������������� ��������������������������������������� ��������������0��������33�����0���0��������3333����0���0���� ��33330���3���30������333333���3�3�30�������333333���33030������ 333333���333330�������330�0��3333333333333�33���0��33333333333333 3���0��3333333333333303���0��333333333333333�3���0����������������3330�0�����������������333333������������������333333������������������333333������������������33330�������������������3333���������������������33��������������������������������������������������������������������������?����?����?����?����?����?����?����?����?����?����?����?����?���������������<�<?��>�p��?��?��H?���?����?��������������x������x������x������x���������������������?��(������ ���������@�������������������������������`��?��!��%��"���=����D��Tn�������2���������������������?��?��?����������������������������(��� ���@���������������������������������������� ��p�����#�� ������������ A0436? ??B��f������������������������?�?�?�?�?�?�?�?�� �������������(���0���`������������������������������������������������������������0���������|�������������������������������������������O�����7����ۀ���������������������������p������������������������������0����?��3?��{���߆��/������������������?������?������?���������������������������������������������������������������������������?����?����?����?����?����?����?����?����?����?����?����?����?���������������<�<?��>�p��?��?��H?���?����?��������������x������x������x������x���������������������?�� Revision-number: 7064 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2007-01-06T18:27:00.933036Z K 7 svn:log V 71 No, I tell a lie: GTK 1 _does_ support icons, at least partially. Ooh. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 44bbeab4c1a85e5d98f536301bbc8f91 Text-delta-base-sha1: 3ac31b916eb57890529bfcbd787ce365d380a681 Text-content-length: 298 Text-content-md5: c6a6e67c9cf04d97f9ea37d07e82bd1d Text-content-sha1: 5871db5fc472d3268f47ad4f6414e9e3c59a8d7f Content-length: 298 SVN���i��c{�BL{ /* in gtkwin.c */ extern void set_window_icon(GtkWidget *window, const char *const *const *icon, int n_icon); extern const char *const *const cfg_icon[]; extern const int n_cfg_icon; set_window_icon(window, cfg_icon, n_cfg_icon); } Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0ccbb264d790efc3adcf362adff6c97 Text-delta-base-sha1: 168207b52021ab68b5bce82bab517fa86de57759 Text-content-length: 1570 Text-content-md5: 64c972eb75824a3f98804190dba42db7 Text-content-sha1: e34cc36277ccc2c64a4bc6f4954b2b52a94f7332 Content-length: 1570 SVN����8� �8�L6�plset_window_icon(GtkWidget *window, const char *const *const *icon, int n_icon) { GdkPixmap *iconpm; #if GTK_CHECK_VERSION(2,0,0) GList *iconlist; int n; #endif if (!n_icon) return; gtk_widget_realize(window); iconpm = gdk_pixmap_create_from_xpm_d(window->window, NULL, NULL, (gchar **)icon[0]); gdk_window_set_icon(window->window, NULL, iconpm, NULL); #if GTK_CHECK_VERSION(2,0,0) iconlist = NULL; for (n = 0; n < n_icon; n++) { iconlist = g_list_append(iconlist, gdk_pixbuf_new_from_xpm_data((const gchar **) icon[n])); } gdk_window_set_icon_list(window->window, iconlist); #endif } void update_specials_menu�`0$�a� �[, inst); gtk_signal_connect(GTK_OBJECT(inst->window), "focus_out_event", GTK_SIGNAL_FUNC(focus_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "configure_event", GTK_SIGNAL_FUNC(configure_area), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "expose_event", GTK_SIGNAL_FUNC(expose_area), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "button_press_event", GTK_SIGNAL_FUNC(button_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "button_release_event", GTK_SIGNAL_FUNC(button_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "motion_notify_event", GTK_SIGNAL_FUNC({ extern const char *const *const main_icon[]; extern const int n_main_icon; set_window_icon(inst->window, main_icon, n_main_icon); } Node-path: putty/unix/xpmptcfg.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 4837 Text-content-md5: 86c6459d1e553a604600a4e923587b02 Text-content-sha1: c66fb58a4730b125d9bdf2f03b92b6e874117bdc Content-length: 4847 PROPS-END SVN���WWW/* XPM */ static const char *const cfg_icon_0[] = { /* columns rows colors chars-per-pixel */ "16 16 9 1", " c black", ". c navy", "X c blue", "o c #808000", "O c yellow", "+ c #808080", "@ c #C0C0C0", "# c gray100", "$ c None", /* pixels */ "$$$ $$$$$$$$$$$", "$$ OO $$$$$$$$$$", "$ $ oO $$$$", " o #+oO+##@+ $$$", " oO+.OO.XX@+ $$$", "$ oOOOO.XX@+ $$$", "$$ oooOO.X@+ $$$", "$$ +..oOO.@+ $$$", "$$ #XX.oOO++ $$$", "$$ @@@@+oOO $$", "$ ++++++ oOO++ $", " ########+oOO $", " #@@@@@+++ oOO $", "$ oOO ", "$$$$$$$$$$$$ oO ", "$$$$$$$$$$$$$ $" }; /* XPM */ static const char *const cfg_icon_1[] = { /* columns rows colors chars-per-pixel */ "32 32 9 1", " c black", ". c navy", "X c blue", "o c #808000", "O c yellow", "+ c #808080", "@ c #C0C0C0", "# c gray100", "$ c None", /* pixels */ "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$ OO $$$$$$$$$$$$$$$$$$$$$$", "$$$$$ ooOO $$$$$$$$$$$$$$$$$$$$$", "$$$$$$ ooOO $$$$$$$$", "$$ $$$ oOO @@@@@@@@@@@+ $$$$$$$", "$ oO $ oOOO @@@@@@@@@++ $$$$$$$", "$ oOO oOOOO #######@+++ $$$$$$$", "$$ oOOOOOOO ........@+++ $$$$$$$", "$$ ooOOOOOOO XXXXXXX@+++ $$$$$$$", "$$$ ooooooOOO XXXXXX@+++ $$$$$$$", "$$$$ oo ooOOO XXXXX@+++ $$$$$$$", "$$$$$ X ooOOO XXXX@+++ $$$$$$$", "$$$$$ #.XX ooOOO XXX@+++ $$$$$$$", "$$$$$ #.XXX ooOOO XX@+++ $$$$$$$", "$$$$$ #.XXXX ooOOO X@+++ $$$$$$$", "$$$$$ #.XXXXX ooOOO @+++ $$$$$$$", "$$$$$ ######## ooOOO +++ $$$$$$$", "$$$$$ #@@@@@@@@ ooOOO + $$$", "$$$$ @+++++++++ ooOOO @@@@#+ $$", "$$$ @ ooOOO @@#++ $$", "$$ @@@@@@@@@@@@@@@ ooOOO #+++ $$", "$ ################# ooOOO +++ $$", "$ #@@@@@@@@@@@@@@@@@ ooOOO ++ $$", "$ #@@@@@@@@@@@@+ ooOOO $$$", "$ @+++++++++++++++++++ ooOOO $$$", "$$ ooOOO $$", "$$$$$$$$$$$$$$$$$$$$$$$$ ooO $$$", "$$$$$$$$$$$$$$$$$$$$$$$$$ o $$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" }; /* XPM */ static const char *const cfg_icon_2[] = { /* columns rows colors chars-per-pixel */ "48 48 9 1", " c black", ". c navy", "X c blue", "o c #808000", "O c yellow", "+ c #808080", "@ c #C0C0C0", "# c gray100", "$ c None", /* pixels */ "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$ OO $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$ oOOOO $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$ ooOOO $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$ ooOOO $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$ oOOO $$$$$$$$$$$", "$$$ $$$$$$ oOOO @@@@@@@@@@@@@@@@@@@+ $$$$$$$$$$", "$$ oO $$$$$ oOOOO @@@@@@@@@@@@@@@@@++ $$$$$$$$$$", "$$ ooO $$$ oOOOO @@@@@@@@@@@@@@@@+++ $$$$$$$$$$", "$$$ oOO OOOOO ###############@++++ $$$$$$$$$$", "$$$ ooOOOOOOOOOOO +++++++++++++@+++++ $$$$$$$$$$", "$$$ ooOOOOOOOOOOOO ............#+++++ $$$$$$$$$$", "$$$$ oooOOOOoOOOOOO XXXXXXXXXXX#+++++ $$$$$$$$$$", "$$$$$ oooooooOOOOOOO XXXXXXXXXX#+++++ $$$$$$$$$$", "$$$$$$ oo ooOOOOOOO XXXXXXXXX#+++++ $$$$$$$$$$", "$$$$$$$$$ + ooOOOOOOO XXXXXXXX#+++++ $$$$$$$$$$", "$$$$$$$$$ #+. ooOOOOOOO XXXXXXX#+++++ $$$$$$$$$$", "$$$$$$$$$ #+.X ooOOOOOOO XXXXXX#+++++ $$$$$$$$$$", "$$$$$$$$$ #+.XX ooOOOOOOO XXXXX#+++++ $$$$$$$$$$", "$$$$$$$$$ #+.XXX ooOOOOOOO XXXX#+++++ $$$$$$$$$$", "$$$$$$$$$ #+.XXXX ooOOOOOOO XXX#+++++ $$$$$$$$$$", "$$$$$$$$$ #+.XXXXX ooOOOOOOO XX#+++++ $$$$$$$$$$", "$$$$$$$$$ #+.XXXXXX ooOOOOOOO X#+++++ $$$$$$$$$$", "$$$$$$$$$ #+.XXXXXXX ooOOOOOOO #+++++ $$$$$$$$$$", "$$$$$$$$$ #+.XXXXXXXX ooOOOOOOO +++++ $$$$$$$$$$", "$$$$$$$$$ #@########## ooOOOOOOO ++++ $$$$$$$$$$", "$$$$$$$$ #@@@@@@@@@@@@ ooOOOOOOO ++ $$$$", "$$$$$$$ @ #@@@@@@@@@@@@@ ooOOOOOOO @@@@@##+ $$$", "$$$$$$ @@ @++++++++++++++ ooOOOOOOO @@@@##++ $$$", "$$$$$ @@@ ooOOOOOOO @@##+++ $$$", "$$$$ @@@@@@@@@@@@@@@@@@@@@@ ooOOOOOOO ##++++ $$$", "$$$ ######################## ooOOOOOOO @++++ $$$", "$$$ ######################### ooOOOOOOO ++++ $$$", "$$$ ##@@@@@@@@@@@@@@@@@@@@@@@@ ooOOOOOOO +++ $$$", "$$$ ##@@@@@@@@@@@@@@@@@@@@@@@@@ ooOOOOOOO + $$$$", "$$$ ##@@@@@@@@@@@@@@@@@@ ooOOOOOOO $$$$$", "$$$ @@+++++++++++++++++++++++++++ ooOOOOOOO $$$$", "$$$$ ooOOOOOOO $$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ooOOOOO $$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ooOOO $$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ooO $$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ o $$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" }; const char *const *const cfg_icon[] = { cfg_icon_0, cfg_icon_1, cfg_icon_2, }; const int n_cfg_icon = 3; Node-path: putty/unix/xpmpterm.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 4746 Text-content-md5: 1d13ff1e59ee451ba2f3eb11662be689 Text-content-sha1: 913043ef92518c7e8518b31fb6c3f7d2d7cbc8ff Content-length: 4756 PROPS-END SVN���|||/* XPM */ static const char *const main_icon_0[] = { /* columns rows colors chars-per-pixel */ "16 16 6 1", " c black", ". c blue", "X c #808080", "o c #C0C0C0", "O c gray100", "+ c None", /* pixels */ "++++++++++++++++", "++++++++++++++++", "+++ ++++", "++ OOOOOOOoX +++", "++ O......oX +++", "++ O......oX +++", "++ O......oX +++", "++ O......oX +++", "++ O......oX +++", "++ ooooooooX ++", "+ XXXXXXXXXXOX +", " OOOOOOOOOOOoX +", " OoooooXXXXoXX +", "+ ++", "++++++++++++++++", "++++++++++++++++" }; /* XPM */ static const char *const main_icon_1[] = { /* columns rows colors chars-per-pixel */ "32 32 7 1", " c black", ". c navy", "X c blue", "o c #808080", "O c #C0C0C0", "+ c gray100", "@ c None", /* pixels */ "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@ @@@@@@@@", "@@@@@@@ OOOOOOOOOOOOOOOo @@@@@@@", "@@@@@@ OOOOOOOOOOOOOOOoo @@@@@@@", "@@@@@ ++++++++++++++Oooo @@@@@@@", "@@@@@ +.............Oooo @@@@@@@", "@@@@@ +.XXXXXXXXXXXXOooo @@@@@@@", "@@@@@ +.XXXXXXXXXXXXOooo @@@@@@@", "@@@@@ +.XXXXXXXXXXXXOooo @@@@@@@", "@@@@@ +.XXXXXXXXXXXXOooo @@@@@@@", "@@@@@ +.XXXXXXXXXXXXOooo @@@@@@@", "@@@@@ +.XXXXXXXXXXXXOooo @@@@@@@", "@@@@@ +.XXXXXXXXXXXXOooo @@@@@@@", "@@@@@ +.XXXXXXXXXXXXOooo @@@@@@@", "@@@@@ ++++++++++++++Oooo @@@@@@@", "@@@@@ +OOOOOOOOOOOOOooo @@@", "@@@@ Oooooooooooooooo OOOO+o @@", "@@@ O OOOO+oo @@", "@@ OOOOOOOOOOOOOOOOOOOOOO+ooo @@", "@ +++++++++++++++++++++++Oooo @@", "@ +OOOOOOOOOOOOOOOOOOOOOOoooo @@", "@ +OOOOOOOOOOOOo oOOooo @@@", "@ Ooooooooooooooooooooooooo @@@@", "@@ @@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" }; /* XPM */ static const char *const main_icon_2[] = { /* columns rows colors chars-per-pixel */ "48 48 7 1", " c black", ". c navy", "X c blue", "o c #808080", "O c #C0C0C0", "+ c gray100", "@ c None", /* pixels */ "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@ @@@@@@@@@@@", "@@@@@@@@@@@@ OOOOOOOOOOOOOOOOOOOOOOOo @@@@@@@@@@", "@@@@@@@@@@@ OOOOOOOOOOOOOOOOOOOOOOOoo @@@@@@@@@@", "@@@@@@@@@@ OOOOOOOOOOOOOOOOOOOOOOOooo @@@@@@@@@@", "@@@@@@@@@ ++++++++++++++++++++++Ooooo @@@@@@@@@@", "@@@@@@@@@ +ooooooooooooooooooooOooooo @@@@@@@@@@", "@@@@@@@@@ +o...................+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@@", "@@@@@@@@@ +O++++++++++++++++++++ooooo @@@@@@@@@@", "@@@@@@@@ +OOOOOOOOOOOOOOOOOOOOOoooo @@@@", "@@@@@@@ O +OOOOOOOOOOOOOOOOOOOOOooo OOOOO++o @@@", "@@@@@@ OO Oooooooooooooooooooooooo OOOOO++oo @@@", "@@@@@ OOO OOOOO++ooo @@@", "@@@@ OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO++oooo @@@", "@@@ +++++++++++++++++++++++++++++++++++Ooooo @@@", "@@@ ++++++++++++++++++++++++++++++++++Oooooo @@@", "@@@ ++OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooo @@@", "@@@ ++OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooo @@@@", "@@@ ++OOOOOOOOOOOOOOOOOO oOOOoooo @@@@@", "@@@ OOooooooooooooooooooooooooooooooooooo @@@@@@", "@@@@ @@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" }; const char *const *const main_icon[] = { main_icon_0, main_icon_1, main_icon_2, }; const int n_main_icon = 3; Node-path: putty/unix/xpmpucfg.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 4837 Text-content-md5: 067a730bf0fc3adc1454cc4cacd36e97 Text-content-sha1: e722a22c3be049f1af264a4d6a9f9986ea10b11b Content-length: 4847 PROPS-END SVN���WWW/* XPM */ static const char *const cfg_icon_0[] = { /* columns rows colors chars-per-pixel */ "16 16 9 1", " c black", ". c navy", "X c blue", "o c #808000", "O c yellow", "+ c #808080", "@ c #C0C0C0", "# c gray100", "$ c None", /* pixels */ "$$$ $ $$$", "$$ OO #####@+ $$", "$ $ oO+XXX.++ $$", " o $ oO.X.O++ $$", " oO OO .O.@+ $", "$ oOOOOoO+@@+++ ", "$$ oooOOoO ++@+ ", "$$ oooOO +++++ ", "$ ##+OooOO $", "$ #.O..+oOO $$$$", "$ +O.XX@ oOO $$$", "$ +.XXX@+ oOO $$", "$ @@@@@@++ oOO $", " ++++++++@+ oOO ", " #@@@@+++++ oO ", "$ $$ $" }; /* XPM */ static const char *const cfg_icon_1[] = { /* columns rows colors chars-per-pixel */ "32 32 9 1", " c black", ". c navy", "X c blue", "o c #808000", "O c yellow", "+ c #808080", "@ c #C0C0C0", "# c gray100", "$ c None", /* pixels */ "$$$$$$$$$$$$$$$$ $$$$", "$$$$$$ $$$$$$$ @@@@@@@@@@@+ $$$", "$$$$$ OO $$$$ ##########@++ $$$", "$$$$$ ooOO $$$ #.........@++ $$$", "$$$$$$ ooOO $$ #.XXXXXXXX@++ $$$", "$$ $$$ oOO $$ #.XXXX XX@++ $$$", "$ oO $$ oOOO $ #.XXX O XX@++ $$$", "$ oOO oOOOO $ #.X O XXX@++ $$$", "$$ oOOOOOOO $$ #. OO XXXX@++ $$$", "$$ ooOOOOOOO $ # OO XXXXX@++ $$$", "$$$ ooooooOOO OO ######@++ $", "$$$$ oo ooOOO OO +++++++++ @#+ ", "$$$$$$ $ ooOOO @#++ ", "$$$$$$$$$$ ooOOO OOO #######@++ ", "$$$$$$$$$ O ooOOO @@@@@@@@+++ ", "$$$$$ ooOOO @@+ +@++ $", "$$$$ @@@@@@@ ooOOO $$", "$$$ ####### OO ooOOO $$$$$$$$$$$", "$$$ #..... OO @ ooOOO $$$$$$$$$$", "$$$ #.XXX OO X@+ ooOOO $$$$$$$$$", "$$$ #.XX O XX@++ ooOOO $$$$$$$$", "$$$ #.X O XXXX@++ ooOOO $$$$$$$", "$$$ #.X XXXXX@++ $ ooOOO $$$$$$", "$$$ #.XXXXXXXX@++ $$ ooOOO $$$$$", "$$$ #.XXXXXXXX@++ $$$ ooOOO $$$$", "$$$ ##########@++ $$ ooOOO $$$", "$$ @+++++++++++ @#+ $$ ooOOO $$", "$ @ @#++ $$$ ooO $$$", " ################@++ $$$$ o $$$$", " #@@@@@@@@@@@@@@@+++ $$$$$ $$$$$", " #@@@@@@@@+ +@++ $$$$$$$$$$$$", "$ $$$$$$$$$$$$$" }; /* XPM */ static const char *const cfg_icon_2[] = { /* columns rows colors chars-per-pixel */ "48 48 9 1", " c black", ". c navy", "X c blue", "o c #808000", "O c yellow", "+ c #808080", "@ c #C0C0C0", "# c gray100", "$ c None", /* pixels */ "$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$", "$$$$$$$$$$$$$$$$$$$$$$$ @@@@@@@@@@@@@@@@@+ $$$$$", "$$$$$$$$$ $$$$$$$$$$$ @@@@@@@@@@@@@@@@@++ $$$$$", "$$$$$$$$ OO $$$$$$$ ################@+++ $$$$$", "$$$$$$$$ oOOOO $$$$$$ #++++++++++++++@++++ $$$$$", "$$$$$$$$$ ooOOO $$$$$ #+.............#++++ $$$$$", "$$$$$$$$$$ ooOOO $$$$ #+.XXXXXXXXXXXX#++++ $$$$$", "$$$$$$$$$$$ oOOO $$$$ #+.XXXXXXXXXXXX#++++ $$$$$", "$$$ $$$$$$ oOOO $$$$ #+.XXXXXXX XXX#++++ $$$$$", "$$ oO $$$$$ oOOOO $$$ #+.XXXXXX O XXX#++++ $$$$$", "$$ ooO $$$$ oOOOO $$$ #+.XXXXX O XXXX#++++ $$$$$", "$$$ oOO OOOOO $$$$ #+.XXX O XXXXX#++++ $$$$$", "$$$ ooOOOOOOOOOOO $$$ #+.XX OO XXXXXX#++++ $$$$$", "$$$ ooOOOOOOOOOOOO $$ #+.X OO XXXXXXX#++++ $$$$$", "$$$$ oooOOOOoOOOOOO $ #@ OO #########++++ $", "$$$$$ oooooooOOOOOOO # OOO @@@@@@@@@@+++ @@##+ ", "$$$$$$ oo ooOOOOOOO OO +++++++++++++ @@##++ ", "$$$$$$$$$ $ ooOOOOOOO O @@##+++ ", "$$$$$$$$$$$$$ ooOOOOOOO ##############@+++ ", "$$$$$$$$$$$$$$ ooOOOOOOO OOOO ############@++++ ", "$$$$$$$$$$$$$$$ ooOOOOOOO O @@@@@@@@@@@@@+++++ ", "$$$$$$$$$$$$$$$ ooOOOOOOO @@@@@+ @@++++ $", "$$$$$$$$$$$$$$ OO ooOOOOOOO +++++++++++++++++ $$", "$$$$$$$$$$$$$$$ ooOOOOOOO $$$", "$$$$$$$ ooOOOOOOO $$$$$$$$$$$$$$$$$$", "$$$$$$ @@@@@@@@@@ O ooOOOOOOO $$$$$$$$$$$$$$$$$", "$$$$$ @@@@@@@@@@ OOO ooOOOOOOO $$$$$$$$$$$$$$$$", "$$$$ ########## OO #@ ooOOOOOOO $$$$$$$$$$$$$$$", "$$$$ #++++++++ OO ++@++ ooOOOOOOO $$$$$$$$$$$$$$", "$$$$ #+...... OO ...#+++ ooOOOOOOO $$$$$$$$$$$$$", "$$$$ #+.XXXX O XXXX#++++ ooOOOOOOO $$$$$$$$$$$$", "$$$$ #+.XXX O XXXXXX#++++ ooOOOOOOO $$$$$$$$$$$", "$$$$ #+.XX O XXXXXXX#++++ $ ooOOOOOOO $$$$$$$$$$", "$$$$ #+.XX XXXXXXXX#++++ $$ ooOOOOOOO $$$$$$$$$", "$$$$ #+.XXXXXXXXXXXX#++++ $$$ ooOOOOOOO $$$$$$$$", "$$$$ #+.XXXXXXXXXXXX#++++ $$$$ ooOOOOOOO $$$$$$$", "$$$$ #+.XXXXXXXXXXXX#++++ $$$$$ ooOOOOOOO $$$$$$", "$$$$ #+.XXXXXXXXXXXX#++++ $$$$$$ ooOOOOOOO $$$$$", "$$$$ #@##############++++ $$$ ooOOOOOOO $$$$", "$$$ #@@@@@@@@@@@@@@@+++ @@##+ $$$ ooOOOOOOO $$$", "$$ @ @+++++++++++++++++ @@##++ $$$$ ooOOOOO $$$$", "$ @@ @@##+++ $$$$$ ooOOO $$$$$", " #########################@+++ $$$$$$ ooO $$$$$$", " ########################@++++ $$$$$$$ o $$$$$$$", " ##@@@@@@@@@@@@@@@@@@@@@@+++++ $$$$$$$$ $$$$$$$$", " ##@@@@@@@@@@@@+ @@++++ $$$$$$$$$$$$$$$$$$", " @@+++++++++++++++++++++++++ $$$$$$$$$$$$$$$$$$$", "$ $$$$$$$$$$$$$$$$$$$$" }; const char *const *const cfg_icon[] = { cfg_icon_0, cfg_icon_1, cfg_icon_2, }; const int n_cfg_icon = 3; Node-path: putty/unix/xpmputty.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 4800 Text-content-md5: c66b393aa30a6b54a11af90a4a3776d3 Text-content-sha1: 4d5471c9f8c55a7431c2ed32464fcbbbaf108206 Content-length: 4810 PROPS-END SVN���222/* XPM */ static const char *const main_icon_0[] = { /* columns rows colors chars-per-pixel */ "16 16 8 1", " c black", ". c navy", "X c blue", "o c yellow", "O c #808080", "+ c #C0C0C0", "@ c gray100", "# c None", /* pixels */ "###### ###", "##### @@@@@+O ##", "##### @XXX.OO ##", "##### @XX.oOO ##", "##### @..o.+O #", "##### OooO++OOO ", "#### oooo OO+O ", "## oooo OOOOOO ", "# @@OooOO #", "# @.o..+O ######", "# Oo.XX+O ######", "# O.XXX+O #####", "# ++++++OOO ####", " OOOOOOOO+O ####", " @++++OOOOO ####", "# #####" }; /* XPM */ static const char *const main_icon_1[] = { /* columns rows colors chars-per-pixel */ "32 32 8 1", " c black", ". c navy", "X c blue", "o c yellow", "O c #808080", "+ c #C0C0C0", "@ c gray100", "# c None", /* pixels */ "################ ####", "############### +++++++++++O ###", "############## @@@@@@@@@@+OO ###", "############## @.........+OO ###", "############## @.XXXXXXXX+OO ###", "############## @.XXXX XX+OO ###", "############## @.XXX o XX+OO ###", "############## @.X o XXX+OO ###", "############## @. oo XXXX+OO ###", "############## @ oo XXXXX+OO ###", "############## oo @@@@@@+OO #", "############# ooo OOOOOOOOO +@O ", "############ ooo +@OO ", "########## oooooooo @@@@@@@+OO ", "######### oooooooo ++++++++OOO ", "##### ooo +++O O+OO #", "#### +++++++ ooo ##", "### @@@@@@@ oo O ##############", "### @..... oo +OO ##############", "### @.XXX oo X+OO ##############", "### @.XX o XX+OO ##############", "### @.X o XXXX+OO ##############", "### @.X XXXXX+OO ##############", "### @.XXXXXXXX+OO ##############", "### @.XXXXXXXX+OO ##############", "### @@@@@@@@@@+OO ############", "## +OOOOOOOOOOO +@O ###########", "# + +@OO ###########", " @@@@@@@@@@@@@@@@+OO ###########", " @+++++++++++++++OOO ###########", " @++++++++O O+OO ############", "# #############" }; /* XPM */ static const char *const main_icon_2[] = { /* columns rows colors chars-per-pixel */ "48 48 8 1", " c black", ". c navy", "X c blue", "o c yellow", "O c #808080", "+ c #C0C0C0", "@ c gray100", "# c None", /* pixels */ "######################## ######", "####################### +++++++++++++++++O #####", "###################### +++++++++++++++++OO #####", "##################### @@@@@@@@@@@@@@@@+OOO #####", "##################### @OOOOOOOOOOOOOO+OOOO #####", "##################### @O.............@OOOO #####", "##################### @O.XXXXXXXXXXXX@OOOO #####", "##################### @O.XXXXXXXXXXXX@OOOO #####", "##################### @O.XXXXXXX XXX@OOOO #####", "##################### @O.XXXXXX o XXX@OOOO #####", "##################### @O.XXXXX o XXXX@OOOO #####", "##################### @O.XXX o XXXXX@OOOO #####", "##################### @O.XX oo XXXXXX@OOOO #####", "##################### @O.X oo XXXXXXX@OOOO #####", "##################### @+ oo @@@@@@@@@OOOO #", "#################### @ ooo ++++++++++OOO ++@@O ", "################### + oo OOOOOOOOOOOOO ++@@OO ", "################## + oo ++@@OOO ", "################# @ ooo @@@@@@@@@@@@@@+OOO ", "################# oooooooooo @@@@@@@@@@@@+OOOO ", "################# ooooooooo +++++++++++++OOOOO ", "############### ooooooooo +++++O ++OOOO #", "############## oooooooooo OOOOOOOOOOOOOOOOOOO ##", "############### ooo ###", "####### oo #######################", "###### ++++++++++ oo ++O ######################", "##### ++++++++++ ooo ++OO ######################", "#### @@@@@@@@@@ oo @+OOO ######################", "#### @OOOOOOOO oo OO+OOOO ######################", "#### @O...... oo ...@OOOO ######################", "#### @O.XXXX o XXXX@OOOO ######################", "#### @O.XXX o XXXXXX@OOOO ######################", "#### @O.XX o XXXXXXX@OOOO ######################", "#### @O.XX XXXXXXXX@OOOO ######################", "#### @O.XXXXXXXXXXXX@OOOO ######################", "#### @O.XXXXXXXXXXXX@OOOO ######################", "#### @O.XXXXXXXXXXXX@OOOO ######################", "#### @O.XXXXXXXXXXXX@OOOO ######################", "#### @+@@@@@@@@@@@@@@OOOO ##################", "### @+++++++++++++++OOO ++@@O #################", "## + +OOOOOOOOOOOOOOOOO ++@@OO #################", "# ++ ++@@OOO #################", " @@@@@@@@@@@@@@@@@@@@@@@@@+OOO #################", " @@@@@@@@@@@@@@@@@@@@@@@@+OOOO #################", " @@++++++++++++++++++++++OOOOO #################", " @@++++++++++++O ++OOOO ##################", " ++OOOOOOOOOOOOOOOOOOOOOOOOO ###################", "# ####################" }; const char *const *const main_icon[] = { main_icon_0, main_icon_1, main_icon_2, }; const int n_main_icon = 3; Revision-number: 7065 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 I think this change to Recipe was accidentally omitted from r7064. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-01-06T20:01:30.288866Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c88c9fe0f1233711d27c8b93c2fe035b Text-delta-base-sha1: 3519b9e3944635fc7286d167b1e86b1cf43e0540 Text-content-length: 97 Text-content-md5: 3d6bb545173d2ddce4e518848b32da9a Text-content-sha1: 8e863d81987700a17151feae512358693d4f4a26 Content-length: 97 SVN��t5A����v"�\ xpmpterm xpmptcfg xpmputty + xpmpucfg xpmputty xpmpucfg Revision-number: 7066 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-07T00:31:13.231578Z PROPS-END Revision-number: 7067 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-07T00:31:13.241752Z PROPS-END Revision-number: 7068 Prop-content-length: 430 Content-length: 430 K 8 svn:date V 27 2007-01-07T10:17:12.621380Z K 7 svn:log V 329 Tweak the icon script, and the generated icons, to more closely match the original icons. (Apparently I managed to introduce errors while transcribing the originals for detailed analysis.) While I'm at it, add the obviously useful `make install' target in icons/Makefile, and fix the svn:ignore property on the icons directory. K 10 svn:author V 5 simon PROPS-END Node-path: putty/icons Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 54 Content-length: 54 K 10 svn:ignore V 22 *.png *.ico *.xpm *.c PROPS-END Node-path: putty/icons/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 243309e42a255ad643dba3ba82e58992 Text-delta-base-sha1: 511e355c0f399bd660a4e762cc705dfa9a8eb1c3 Text-content-length: 87 Text-content-md5: cbab694b58302ae291f857e574e45857 Text-content-sha1: fb1e7d0e43b71f9e785c31f3cf05b9112e7af67e Content-length: 87 SVN��v9 A�;�A�=9install: icos cicons cp $(ICOS) ../windows cp $(CICONS) ../unix Node-path: putty/icons/mkicon.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4596b2f25c4e24f123a7425d6393f451 Text-delta-base-sha1: 14eae603f43910aba8f2259474a6938d04249ed7 Text-content-length: 570 Text-content-md5: 0ce9b40223760cb99d053faf8ab95a5a Text-content-sha1: aac40270971ba4b8c51c0b651cd50af7293e4ac8 Content-length: 570 SVN��CZR�u��^u�eM�S2�g%�9�_5�MO��F0� aK�HC�} �*)�DT, out={}out["borderthickness"] = thickness, out={}.6*size)) width = int(round(16.511*size)) out["sysboxheight"] = height): pixel(x+width, y-(x+1), out.49out = {} m = monitor(size) s = sysbox(size, out) x = int(round((2+size/(size+1))*size)) y = int(out["sysboxheight"] + out["borderthickness"]height, # and an odd number in width. width = round(7*size) * 2 - 1+ round(boltoffx*size), \ (h-bb[1]-bb[3])/2 + round((boltoffy-22 Node-path: putty/unix/xpmptcfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 86c6459d1e553a604600a4e923587b02 Text-delta-base-sha1: c66fb58a4730b125d9bdf2f03b92b6e874117bdc Text-content-length: 2548 Text-content-md5: 49a2e90f7550d17b0513629d4c45e4ea Text-content-sha1: 1d533aaedf07c71ec4e77c6541c6a68a68b85f4d Content-length: 2548 SVN��WW&B���]:T�gk�\Uk�sT�tc $$$$", "$ +oO+###@+ $$$", " o #.oO.XX@@@+oOO++ $$", "$ +++++ oOO #+ $", " #######+oOO++ $", " #@@@@@++ oOO $", " @+++++ $$$$$$", "$$ $$$ oOO @@@@@@@@@@@@@+ $$$$$", "$ oO $$ oOOO @@@@@@@@@@@++ $$$$$", "$ oOO oOOOO #########@+++ $$$$$", "$$ oOOOOOOO ..........@+++ $$$$$", "$$ ooOOOOOOO XXXXXXXXX@+++ $$$$$", "$$$ ooooooOOO XXXXXXXX@+++ $$$$$", "$$$$ oo ooOOO XXXXXXX@+++ $$$$$", "$$$$$$ . ooOOO XXXXXX@+++ $$$$$", "$$$$$$ #.X ooOOO XXXXX@+++ $$$$$", "$$$$$$ #.XX ooOOO XXXX@+++ $$$$$", "$$$$$$ #.XXX ooOOO XXX@+++ $$$$$", "$$$$$$ #.XXXX ooOOO XX@+++ $$$$$", "$$$$$$ ####### ooOOO #@+++ $$$", "$$$$$ #@@@@@@@ ooOOO +++ @#+ $$", "$$$$ @ @++++++++ ooOOO + @#++ $$", "$$$ @@ ooOOO @#+++ $$", "$$ ############### ooOOO @+++ $$", "$$ #@@@@@@@@@@@@@@@ ooOOO +++ $$", "$$ #@@@@@@@@@@@@@@@@ ooOOO + $$$", "$$ #@@@@@@@@@@@@+ ooOOO $$$$", "$$ @++++++++++++++++++ ooOOO $$$", "$$$ $$$$$$$$$$", "$$$ $$$$$$ oOOO @@@@@@@@@@@@@@@@@@@@+ $$$$$$$$$", "$$ oO $$$$$ oOOOO @@@@@@@@@@@@@@@@@@++ $$$$$$$$$", "$$ ooO $$$ oOOOO @@@@@@@@@@@@@@@@@+++ $$$$$$$$$", "$$$ oOO OOOOO ################@++++ $$$$$$$$$", "$$$ ooOOOOOOOOOOO ++++++++++++++@+++++ $$$$$$$$$", "$$$ ooOOOOOOOOOOOO .............#+++++ $$$$$$$$$", "$$$$ oooOOOOoOOOOOO XXXXXXXXXXXX#+++++ $$$$$$$$$", "$$$$$ oooooooOOOOOOO XXXXXXXXXXX#+++++ $$$$$$$$$", "$$$$$$ oo ooOOOOOOO XXXXXXXXXX#+++++ $$$$$$$$$", "$$$$$$$$$ + ooOOOOOOO XXXXXXXXX#+++++ $$$$$$$$$", "$$$$$$$$$ #+. ooOOOOOOO XXXXXXXX#+++++ $$$$$$$$$", "$$$$$$$$$ #+.X ooOOOOOOO XXXXXXX#+++++ $$$$$$$$$", "$$$$$$$$$ #+.XX ooOOOOOOO XXXXXX#+++++ $$$$$$$$$", "$$$$$$$$$ #+.XXX ooOOOOOOO XXXXX#+++++ $$$$$$$$$", "$$$$$$$$$ #+.XXXX ooOOOOOOO XXXX#+++++ $$$$$$$$$", "$$$$$$$$$ #+.XXXXX ooOOOOOOO XXX#+++++ $$$$$$$$$", "$$$$$$$$$ #+.XXXXXX ooOOOOOOO XX#+++++ $$$$$$$$$", "$$$$$$$$$ #+.XXXXXXX ooOOOOOOO X#+++++ $$$$$$$$$", "$$$$$$$$$ #+.XXXXXXXX ooOOOOOOO #+++++ $$$$$$$$$", "$$$$$$$$ #@########## ooOOOOOOO +++++ $$$$$", "$$$$$$$ @ #@@@@@@@@@@@@ ooOOOOOOO +++ @@##+ $$$$", "$$$$$$ @@ #@@@@@@@@@@@@@ ooOOOOOOO + @@##++ $$$$", "$$$$$ @@@ @++++++++++++++ ooOOOOOOO @@##+++ $$$$", "$$$$ @@@@ ooOOOOOOO ##++++ $$$$", "$$$ ####################### ooOOOOOOO @++++ $$$$", "$$$ ######################## ooOOOOOOO ++++ $$$$", "$$$ ##@@@@@@@@@@@@@@@@@@@@@@@ ooOOOOOOO +++ $$$$", "$$$ ##@@@@@@@@@@@@@@@@@@@@@@@@ ooOOOOOOO ++ $$$$", "$$$ ##@@@@@@@@@@@@@@@@@@@@@@@@@ ooOOOOOOO $ @@++++++++++++++++++++++++++++ ooOOOOOOO $$$", "$$$$ Node-path: putty/unix/xpmpterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1d13ff1e59ee451ba2f3eb11662be689 Text-delta-base-sha1: 913043ef92518c7e8518b31fb6c3f7d2d7cbc8ff Text-content-length: 2614 Text-content-md5: 6c66230c7026af3df6b66a0feef41cee Text-content-sha1: 198ec2fbd30e3aa6b56eb81fe80e675f662377fb Content-length: 2614 SVN��||(�c��Yw� ^*�~��+&6�B;�3I oXXXXXXXXXXX ++", "+ +@ @@@@@@", "@@@@@@@@ OOOOOOOOOOOOOOOOo @@@@@", "@@@@@@@ OOOOOOOOOOOOOOOOoo @@@@@", "@@@@@@ +++++++++++++++Oooo @@@@@", "@@@@@@ +..............Oooo @@@@@", "@@@@@@ +.XXXXXXXXXXXXXOooo @@@@@", "@@@@@@ +.XXXXXXXXXXXXXOooo @@@@@", "@@@@@@ +.XXXXXXXXXXXXXOooo @@@@@", "@@@@@@ +.XXXXXXXXXXXXXOooo @@@@@", "@@@@@@ +.XXXXXXXXXXXXXOooo @@@@@", "@@@@@@ +.XXXXXXXXXXXXXOooo @@@@@", "@@@@@@ +.XXXXXXXXXXXXXOooo @@@@@", "@@@@@@ +.XXXXXXXXXXXXXOooo @@@@@", "@@@@@@ +++++++++++++++Oooo @@@", "@@@@@ +OOOOOOOOOOOOOOooo O+o @@", "@@@@ O Ooooooooooooooooo O+oo @@", "@@@ OO O+ooo @@", "@@ ++++++++++++++++++++++Oooo @@", "@@ +OOOOOOOOOOOOOOOOOOOOOoooo @@", "@@ +OOOOOOOOOOOOOOOOOOOOOooo @@@", "@@ +OOOOOOOOOOOOo oOoo @@@@", "@@ Ooooooooooooooooooooooo @@@@@", "@@@ @@@@@@@@@@", "@@@@@@@@@@@@ OOOOOOOOOOOOOOOOOOOOOOOOo @@@@@@@@@", "@@@@@@@@@@@ OOOOOOOOOOOOOOOOOOOOOOOOoo @@@@@@@@@", "@@@@@@@@@@ OOOOOOOOOOOOOOOOOOOOOOOOooo @@@@@@@@@", "@@@@@@@@@ +++++++++++++++++++++++Ooooo @@@@@@@@@", "@@@@@@@@@ +oooooooooooooooooooooOooooo @@@@@@@@@", "@@@@@@@@@ +o....................+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@@ +o.XXXXXXXXXXXXXXXXXXX+ooooo @@@@@@@@@", "@@@@@@@@ +O+++++++++++++++++++++ooooo @@@@@", "@@@@@@@ O +OOOOOOOOOOOOOOOOOOOOOOoooo OO++o @@@@", "@@@@@@ OO +OOOOOOOOOOOOOOOOOOOOOOooo OO++oo @@@@", "@@@@@ OOO Ooooooooooooooooooooooooo OO++ooo @@@@", "@@@@ OOOO OO++oooo @@@@", "@@@ ++++++++++++++++++++++++++++++++++Ooooo @@@@", "@@@ +++++++++++++++++++++++++++++++++Oooooo @@@@", "@@@ ++OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooo @@@@", "@@@ ++OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooo @@@@", "@@@ ++OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooo @@@@@", "@@@ ++OOOOOOOOOOOOOOOOOO oOOoooo @@@@@@", "@@@ OOoooooooooooooooooooooooooooooooooo @@@@@@@", "@@@ OOooooooooooooooooooooooooooooooooo @@@@@@@@", "@@@@ Node-path: putty/unix/xpmpucfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 067a730bf0fc3adc1454cc4cacd36e97 Text-delta-base-sha1: e722a22c3be049f1af264a4d6a9f9986ea10b11b Text-content-length: 3104 Text-content-md5: 19e16a2c82eb990b7da21e240073d145 Text-content-sha1: 008c8419cd50b05789dd7076c908f014796187b8 Content-length: 3104 SVN��WW+i�z�1�g+�A�Ly�bS�H$ $$", "$$ OO #####@+ $", "$ $ oO #XX..@+ $", " o $ oO+X.O.@+ $", " oO OO .O.X@+ $", "$ oOOOOoO++@@+ $", "$$ oooOOoOO +++ ", "$ # oooOO +++++ ", "$ #X..ooOO +++ $", "$ #X.O. oOO $$", "$ #.O.X@ oOO $$$", "$ @++@@@+ oOO $$", "$ ++++++++ oOO $", " #####++++ oOO ", " @+++++++ $$ oO ", "$ $$O ######@++ ", "$$$$$ O ooOOO O @@@@@@@+++ ", "$$$$ @@@@@ ooOOO @@+ +@++ $", "$$$ ######### ooOOO +++++++++ $$", "$$$ #....... O ooOOO $$$", "$$$ #.XXXXX OO ooOOO $$$$$$$$$$", "$$$ #.XXXX OO @+ ooOOO $$$$$$$$$", "$$$ #.XXX O X@++ ooOOO $$$$$$$$", "$$$ #.XX O XXX@++ ooOOO $$$$$$$", "$$$ #.XX XXXX@++ $ ooOOO $$$$$$", "$$$ #.XXXXXXXX@++ $$ ooOOO $$$$$", "$$$ ##########@++ $ ooOOO $$$$", "$$ @+++++++++++ @#+ $ ooOOO $$$", "$ @ @#++ $$ ooOOO $$", " ################@++ $$$ ooO $$$", " #@@@@@@@@@@@@@@@+++ $$$$ o $$$$", " #@@@@@@@@+ +@++ $$$$$$ $$$$$", " @++++++++++++++++ $$$$$$$$$$$$$", "$ $$ $$$$$", "$$$$$$$$$$$$$$$$$$$$$$$$ @@@@@@@@@@@@@@@@@+ $$$$", "$$$$$$$$$ $$$$$$$$$$$$ @@@@@@@@@@@@@@@@@++ $$$$", "$$$$$$$$ OO $$$$$$$$ ################@+++ $$$$", "$$$$$$$$ oOOOO $$$$$$$ #++++++++++++++@++++ $$$$", "$$$$$$$$$ ooOOO $$$$$$ #+.............#++++ $$$$", "$$$$$$$$$$ ooOOO $$$$$ #+.XXXXXXXXXXXX#++++ $$$$", "$$$$$$$$$$$ oOOO $$$$$ #+.XXXXXXXXXXXX#++++ $$$$", "$$$ $$$$$$ oOOO $$$$$ #+.XXXXXXX XXX#++++ $$$$", "$$ oO $$$$$ oOOOO $$$$ #+.XXXXXX O XXX#++++ $$$$", "$$ ooO $$$$ oOOOO $$$$ #+.XXXXX O XXXX#++++ $$$$", "$$$ oOO OOOOO $$$$$ #+.XXX O XXXXX#++++ $$$$", "$$$ ooOOOOOOOOOOO $$$$ #+.XX OO XXXXXX#++++ $$$$", "$$$ ooOOOOOOOOOOOO $$$ #+.X OO XXXXXXX#++++ $$$$", "$$$$ oooOOOOoOOOOOO $$ #@ OO #########++++ $", "$$$$$ oooooooOOOOOOO # OOO @@@@@@@@@@+++ @##+ ", "$$$$$$ oo ooOOOOOOO OO +++++++++++++ @##++ ", "$$$$$$$$$ $ ooOOOOOOO OO @##+++ ", "$$$$$$$$$$$$$ ooOOOOOOO ############@+++ ", "$$$$$$$$$$$$$$ ooOOOOOOO OOOOOO ##########@++++ ", "$$$$$$$$$$$$$$$ ooOOOOOOO OOO @@+ @++++ $", "$$$$$$$$$$$$$$$$ ooOOOOOOO O ++++++++++++++++ $$", "$$$$$$$$$$$$$$$ O ooOOOOOOO ++++++++++++++++ $$$", "$$$$$$$$$$$$$$$$ ooOOOOOOO $@@ ooOOOOOOO $$$$$$$$$$$$$$$$$", "$$$$$ @@@@@@@@@@@@ OO ooOOOOOOO $$$$$$$$$$$$$$$$", "$$$$ ############ OO ooOOOOOOO $$$$$$$$$$$$$$$", "$$$$ #++++++++++ OO @++ ooOOOOOOO $$$$$$$$$$$$$$", "$$$$ #+........ OO .#+++ ooOOOOOOO $$$$$$$$$$$$$", "$$$$ #+.XXXXXX O XX#++++ ooOOOOOOO $$$$$$$$$$$$", "$$$$ #+.XXXXX O XXXX#++++ ooOOOOOOO $$$$$$$$$$$", "$$$$ #+.XXXX O XXXXX#++++ $ ooOOOOOOO $$$$$$$$$$", "$$$$ #+.XXXX $$$$ ooOOOOOOO $$$$", "$$$ #@@@@@@@@@@@@@@@+++ @##+ $$$$ ooOOOOOOO $$$", "$$ @ @+++++++++++++++++ @##++ $$$$$ ooOOOOO $$$$", "$ @@ @##+++ $$$$$$ ooOOO $$$$$", " ########################@+++ $$$$$$$ ooO $$$$$$", " #######################@++++ $$$$$$$$ o $$$$$$$", " ##@@@@@@@@@@@@+ @++++ $$$$$$$$$$ $$$$$$$$", " @@++++++++++++++++++++++++ $$$$$$$$$$$$$$$$$$$$", " @@+++++++++++++++++++++++ $$$$$$$$$$$$$$$$$$$$$", "$ $$ Node-path: putty/unix/xpmputty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c66b393aa30a6b54a11af90a4a3776d3 Text-delta-base-sha1: 4d5471c9f8c55a7431c2ed32464fcbbbaf108206 Text-content-length: 2901 Text-content-md5: ded95d2706d8659440c538cd6ba4a850 Text-content-sha1: 53dc4cd2facc420c2d141c00a3edc14b20942b67 Content-length: 2901 SVN��22*�l�1�Y:�T�}*�8S�# ##", "###### @@@@@+O #", "###### @XX..+O #", "###### @X.o.+O #", "###### O.o.X+O #", "###### ooOO++O #", "## ooooo OOO ", "# @Oooooo OOOOO ", "# @X..oo OOOO #", "# @X.o.OO ##", "# @.o.X+O ######", "# +OO+++O ######", "# OOOOOOOO #####", " @@@@@OOOO #####", " +OOOOOOO ######", "# ##o @@@@@@+OO ", "##### ooooooooo +++++++OOO ", "#### +++++ ooo ++O O+OO #", "### @@@@@@@@@ ooo OOOOOOOOOOO ##", "### @....... oo ###", "### @.XXXXX oo OO ##############", "### @.XXXX oo +OO ##############", "### @.XXX o X+OO ##############", "### @.XX o XXX+OO ##############", "### @.XX +OOOOOOOOOOOOOOOO #############", "# ## #####", "######################## +++++++++++++++++O ####", "####################### +++++++++++++++++OO ####", "###################### @@@@@@@@@@@@@@@@+OOO ####", "###################### @OOOOOOOOOOOOOO+OOOO ####", "###################### @O.............@OOOO ####", "###################### @O.XXXXXXXXXXXX@OOOO ####", "###################### @O.XXXXXXXXXXXX@OOOO ####", "###################### @O.XXXXXXX XXX@OOOO ####", "###################### @O.XXXXXX o XXX@OOOO ####", "###################### @O.XXXXX o XXXX@OOOO ####", "###################### @O.XXX o XXXXX@OOOO ####", "###################### @O.XX oo XXXXXX@OOOO ####", "###################### @O.X oo XXXXXXX@OOOO ####", "###################### @+ oo @@@@@@@@@OOOO #", "##################### @ ooo ++++++++++OOO +@@O ", "#################### + oo OOOOOOOOOOOOO +@@OO ", "################### + oo +@@OOO ", "################## @ ooo @@@@@@@@@@@@+OOO ", "################## ooooooooooo @@@@@@@@@@+OOOO ", "################## oooooooooo ++O +OOOO #", "################ oooooooooo OOOOOOOOOOOOOOOO ##", "############### ooooooooooo OOOOOOOOOOOOOOOO ###", "################ ooo ####", "####### oo ######################", "###### ++++++++++++ oo O ######################", "##### ++++++++++++ ooo OO ######################", "#### @@@@@@@@@@@@ oo OOO ######################", "#### @OOOOOOOOOO oo +OOOO ######################", "#### @O........ oo .@OOOO ######################", "#### @O.XXXXXX o XX@OOOO ######################", "#### @O.XXXXX o XXXX@OOOO ######################", "#### @O.XXXX o XXXXX@OOOO ######################", "#### @O.XXXX ###################", "### @+++++++++++++++OOO +@@O ##################", "## + +OOOOOOOOOOOOOOOOO +@@OO ##################", "# ++ +@@OOO ##################", " @@@@@@@@@@@@@@@@@@@@@@@@+OOO ##################", " @@@@@@@@@@@@@@@@@@@@@@@+OOOO ##################", " @@++++++++++++O +OOOO ###################", " ++OOOOOOOOOOOOOOOOOOOOOOOO ####################", " ++OOOOOOOOOOOOOOOOOOOOOOO #####################", "# ## Node-path: putty/windows/pageant.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b1796f404730c97c08323c5c4ae7778a Text-delta-base-sha1: 373d58cc77753c5e2bd191d626bab5287d08f2c8 Text-content-length: 2406 Text-content-md5: be197a4eab467dce31110634bd181453 Text-content-sha1: 4c05b78a286db41ebb5cd7b53ce93b5c5d06f0b5 Content-length: 2406 SVN��nnI�W��fh�=[�G/ �!p'�M@�A�~p�k[�h�~p��x������������������������������wwwww�������wwwwwwwww����x�����p�������������x��������������Lj��������Lj��������Lj��������Lj��������Lj��������Lj��������Lj��������DDDDDG����������������������������?��������������������������c������?����c������������������������������������������������x��������x��������wwwwwww����x�������wwwwwwwwwwwwx�������������x�������wp������������������px��������pwwwwwwwww���������wwwwwwwww��������������������Lψ�����������Lψ�����������Lψ�����������Lψ�����������Lψ�����������Lψ�����������Lψ�����������Lψ�����������Lψ�����������Lψ�����������DDDDDDDDO����������������������p�������������wwwwwwwp����������������wwwww�������������������wp�������������������������������������������������������������?������?������?������?�����?�����?�����������������������������������������������������������������������������(������ ���������@��������������������������������� ����0��0��0��0������������������������������������������������������������|�������������������������������������������������?��������������������������c������?����c(���0���`�����������������������������������������������������������������������~�������������?���o߀���/���������� ����� ����� ����� ����� ����� ����� ����� ����� ����� ����� ���������������������������������������������������������������������?������?������?������?�����?�����?����������������������������������������������������������������������������� Node-path: putty/windows/pageants.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3f3aa13573ca20285dc94cfff45cf136 Text-delta-base-sha1: c198349b613de870d45af9678527cc7408c55231 Text-content-length: 182 Text-content-md5: 8d625fa7c671ca0f445c720bc26696b0 Text-content-sha1: 088a361c69c1677244c59100b27a535d7146c3bf Content-length: 182 SVN��~~���f(�g|��x�������������� ����0��0��0��0����������������������������������������������������������� Node-path: putty/windows/pscp.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e483fa39b0c0d14bab60893dbc72fd6b Text-delta-base-sha1: 0fceb391ea2551289f2770e313007eb5811cca0c Text-content-length: 2063 Text-content-md5: 626fca4d1fb9aa915d138b00d0b0801d Text-content-sha1: 6f7dfa4f54eedfe7dfe20b0b84ee5f9dd0a08c47 Content-length: 2063 SVN��nn<G���Z|�q~3�"�~@� | �D@�lL4� |v��������� x����KLx����Ĵx����Dx����x����������������������������������������������������(��� ���@������������������ x��������www������x������ ����������������������������� Lj���������@ Lj���������L�Lj���������L Lj���������L ������������������������������ x��������������x��������� �������������p ������������������������������ wwwwx�����������p ������������� ������������� ������������� �������������������������� ������������� ���������������������������������������DDDDDD�������������x���������������������������wwwwwwwwx��������������wwwwwwww��������������������������������������������������?���������������������������������������������������������������������������������������������������������(������ ���������@�������������������������������c������G���k���D���s|���������L��,�� ���������������������������������������������������(��� ���@���������������������������������������x����@|����@ ����a��<��s\����@����C���<�?�������`p�0p�p�p��p��p��p������������������������������������?����|������������ �~��������w������������������������C��������������������������������������������������������������������?��������������������������������������������������������������������������������������������������������� Node-path: putty/windows/putty.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d77f9e561314ece1a5dd7b0873c8d5de Text-delta-base-sha1: bb915cbc030a7e4a30e6f362650fbff3858ac516 Text-content-length: 2894 Text-content-md5: 1c2f624065a25403ca4a4fd8f1f4df4f Text-content-sha1: 7a996aa963a992c3941cac091da24a0623af7d0a Content-length: 2894 SVN��nnE}�V�N�Z|�{�W!D�G<*�-f�B@O�L:�H<n�L:h�����������xw����ǀ����KH����D��������� x����KLx����Ĵx����Dx����x������������?�������?��?������������������������(��� ���@�������������������x��������� x��������� x��������� x������������������DDD ����������𻰈���ww�� x��������www������?������������?�?�?�?�?�?������������������x����������wwwwwx�������������x�������������������w������������������������������wwwwwwwx�������������� �������������������������� ��������������DDD@������������� x����������������������������wwwwww ��������������wwwwwp ��������������������������������������������� ���������������������������������������� x��������������x��������� �������������p ������������������������������ wwwwx�����������p ������������� ������������� ������������� �������������������������� ������������� DDDDDD�������������x���������������������������wwwwwwwwx��������������wwwwwwww����������������������������?�������������������������������������������?����?����?����?����?���������������������������������������������������������������������������������������������������������(������ ���������@���������������������������������@��'��)��$��#<��/�������L��,�� �����������?�������?��?������������������������(��� ���@����������������������������������������� ��p����C�#�� ���<�?�������`p�0p�p�p��p��p��p��������?������������?�?�?�?�?�?���������������������������������������������������������������0���������x����������������������������������������������π����o��������݀���������������������������?����|������������ �~��������w������������������������C����������������������������������������������?�������������������������������������������?����?����?����?����?��������������������������������������������������������������������������������������������������������� Node-path: putty/windows/puttycfg.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 884a8ceb053abdceb53855baed2485a7 Text-delta-base-sha1: 6eca6e89b7ce32826c9814c60342442901f125d4 Text-content-length: 2989 Text-content-md5: 5e88c69afd58007ff275912f612136b8 Text-content-sha1: 9bf00e95747079343dd08bdebf4e388d9b2ef6bd Content-length: 2989 SVN��nn9h�V�N�Z|#�W!D�G<*�-w�u:e�H<n�u:?��;���xw;�����K@;���D3��3;�3;�;x� KLx��Ĵx���;Dx�� x���������y���0�����������������������������������(��� ���@�������������������������wwww�x������wwwwwwwx���0����;���p��������3���x�;����x��3����x�;������x�3����� x;������ x3������ x;��������3�������DDD ;��������3���ww�;x��������3www�����; ?������������0� ?������������������������x����������wwwwwx�������������x������������3����w������������;�������3����wwwwwwwx��;������� �3�������;�������� �3��������DDD@;��������� x3����������;�����������wwwwww 3�����������wwwwwp;�������������������3������������������;������������������3����������; ���������3x�����������; x�������3���������; �����������03�����333;� wwwwx��3;�p ����3�� ����3�� ����;� ��� ���;���;��������;�� ��������;��� ��������;����������;����������3���DDDDDD����������x������ �������������������wwwwwwwwx��������������wwwwwwww����������������������������?�������������������������?��������������������������������������������������������������������� ����������<�����|����<����<����|����|����|���������������������������(������ ���������@���������������������������������L��'��)0��$`�� ��!��b��>��&L��,�� ��������y���0�����������������������������������(��� ���@����������������������������������������0 �xpC�#�<� x��<�'�{���=`p0ppp��p��p�p�������?������������0� ?�������������������������������������������������������������������0�����x�����?���������������������������?���n���������������������������������?����|����~�������~������w���������� ��C���������������<���`����������������������?�������������������������?��������������������������������������������������������������������� ����������<�����|����<����<����|����|����|��������������������������� Node-path: putty/windows/puttygen.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 70a2f1d996aafff0b461ef722c0314cc Text-delta-base-sha1: 06d573c0823d565cc2ec954cdbeb2a38e644e9fd Text-content-length: 1966 Text-content-md5: fa7a6a44e871aaf2082fe62d2c9121ed Text-content-sha1: af139ad98db248b8c55f601e86fc6741158cf53a Content-length: 1966 SVN��nnYI�V� �&`�|�V"M�>E*�-Z�RI�L:U�[�c`�SI�L:U�[�����������ww����KG����ĸ�����K��������� ���30333�003333 �0�����00�����3������������?�������?�x��������� x������������������ �������������������DDDD ���������p��������www�� ������������������������?������������?�?�?�?�?�?�����������������x����������wwwwwx�������������x�������������������w������������������������������wwwwwwwx �������������������������� ��������������������������DDDDD �������������������������� ���������������wwwwwwwp��������������wwwwwww������������������������ ����������������������������������������� ������������������� �������������������������������������� ?�������������������������������������������?����?����?������������������?��<�?��>�0(������ ���������@���������������������������������@��3��%��"���!��7��A��T��*�����&������������?�������?���� ��p����� ������p����� A0436? ??B��f��������������?������������?�?�?�?�?�?������ �������������(���0���`������������������������������������������������������������0���������x���������������������������������������O�����'�����������������������������`�������8������������������������?�������������������������������������������?����?����?������������������?��<�?��>�0 Revision-number: 7069 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-08T00:31:10.543743Z PROPS-END Revision-number: 7070 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-08T00:31:10.562643Z PROPS-END Revision-number: 7071 Prop-content-length: 339 Content-length: 339 K 8 svn:date V 27 2007-01-07T12:40:21.071854Z K 7 svn:log V 238 Reinstate RDB's pending_netevent mechanism, which was removed in r4906 in the process of adding the new timing code. It seems to have been what was previously preventing spew-lockup, and still seems to prevent it now I've put it back in. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 58d3f233c05ae251781cfc74b2a85263 Text-delta-base-sha1: 6ef0bca9d043d8592316611ef7ab5a501e6eb6b0 Text-content-length: 1364 Text-content-md5: ebb99f8a83ce6b55c496d4db2928995a Text-content-sha1: 47160c109080995ed4e5892c88dc78bec35a1d78 Content-length: 1364 SVN����4L�%��`G�6�N� e�VR�Gint pending_netevent = 0; static WPARAM pend_netevent_wParam = 0; static LPARAM pend_netevent_lParam = 0; static void enact_pending_netevent(voidif (pending_netevent) enact_pending_netevent(pending_netevent(voidpending_netevent = FALSE; reentering = 1; select_result(pend_netevent_wParam, pend_netevent_/* Notice we can get multiple netevents, FD_READ, FD_WRITE etc * but the only one that's likely to try to overload us is FD_READ. * This means buffering just one is fine. */ if (pending_netevent) enact_pending_netevent(); pending_netevent = TRUE; pend_netevent_wParam = wParam; pend_netevent_lParam = lParam; if (WSAGETSELECTEVENT(lParam) != FD_READ) enact_pending_netevent(); �S22�S�REPEAT) flip_full_screen(); return -1; } /* Control-Numlock for app-keypad mode switch */ if (wParam == VK_PAUSE && shift_state == 2) { term->app_keypad_keys ^= 1; return 0; } /* Nethack keypad */ if (cfg.nethack_keypad && !left_alt) { switch (wParam) { case VK_NUMPAD1: *p++ = "bB\002\002"[shift_state & 3]; return p - output; case VK_NUMPAD2: *p++ = "jJ\012\012"[shift_state & 3]; return p - output; case VK_NUMPAD3: *p++ = "nN\016\016"[shift_state & 3]; return p - output; case VK_NUMPAD4: Node-path: putty-wishlist/data/spew-lockup Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15d07fa3d7f76ff96428a27b5f238cc7 Text-delta-base-sha1: 4658c2f8926c65ce363e1852d71561eb8ec52bde Text-content-length: 267 Text-content-md5: 3846f1187da3750faeeabede5f874780 Text-content-sha1: 53af49752efe5d020817420a0a5d92cc551ffb1e Content-length: 267 SVN��eY s����fYFixed-in: 2007-01-08 r7071 <p> <b>SGT, 2007-01-07</b>: I think this came in at r4906, when I removed the <code>pending_netevent</code> mechanism in the process of setting up the new timing infrastructure. Putting it back in seems to solve it. Revision-number: 7072 Prop-content-length: 354 Content-length: 354 K 7 svn:log V 253 Greater leniency when importing private key files: accept both CRLF and LF, and don't object if the final line of the key lacks a newline. Also, while I'm here, switch to using fgetline() throughout so as not to have to do nasty buffer-size ad-hockery. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-07T14:20:28.525114Z PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 355a41ef069fd9698be2d129acfbdc57 Text-delta-base-sha1: 2bf239682260da222235150d811c31c401ec830c Text-content-length: 2696 Text-content-md5: ca85fc1851c7b91083d06aac34dbc89c Text-content-sha1: 320a80af72e15f875ed276b5f046c14622157d22 Content-length: 2696 SVN��Q/i�Q�D�eJ�v:3�\*u�F9�,�%o�"o�}<�x>�0�gmM�v�w:�be�:9�}4�mN�W�Po�8>I�dm * Strip trailing CRs and LFs at the end of a line of text. */ void strip_crlf(char *str) { char *p = str + strlen(str); while (p > str && (p[-1] == '\r' || p[-1] == '\n')) *--p = '\0'*line = NULL if (!(line = fgetline(fp))) { errmsg = "unexpected end of file"; goto error; } strip_crlf(line); if (0 != strncmp(line, "-----BEGIN ", 11) || 0 != strcmp(line+strlen(line)-16, "PRIVATE KEY-----")) { errmsg = "file does not begin with OpenSSH key header"; goto error; } if (!strcmp(line, "-----BEGIN RSA PRIVATE KEY-----")) ret->type = OSSH_RSA; else if (!strcmp(line, "-----BEGIN DSA PRIVATE KEY----- memset(line, 0, strlen(line)); sfree(line); line = NULL; headers_done = 0; while (1) { if (!(line = fgetline(fp))) { errmsg = "unexpected end of file"; goto error; } strip_crlf(line); if (0 == strncmp(line, "-----END ", 9) && 0 == strcmp(line+strlen(line)-16, "PRIVATE KEY-----")) break; /* done */ if ((p = strchr(lineline")) ret->encrypted = 1; } else if (!strcmp(lineline memset(line, 0, strlen(line)); sfree(line); line = NULL;if (line) { memset(line, 0, strlen(line)); sfree(line); line = NULL; }*line = NULL; int hdrstart, len(line = fgetline(fp))) { errmsg = "unexpected end of file"; goto error; } strip_crlf(line); if (0 != strcmp(line, "---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----")) { errmsg = "file does not begin with ssh.com key header"; goto error; } memset(line, 0, strlen(line)); sfree(line); line = NULL; headers_done = 0; while (1) { if (!(line = fgetline(fp))) { errmsg = "unexpected end of file"; goto error; } strip_crlf(line); if (!strcmp(line, "---- END SSH2 ENCRYPTED PRIVATE KEY ----")) break; /* done */ if ((p = strchr(linehdrstart = p - line; len = hdrstart + strlen(line+hdrstart); assert(!line[len]); while (line[len-1] == '\\') { char *line2; int line2len; line2 = fgetline(fp); if (!line2 strip_crlf(line2); line2len = strlen(line2); line = sresize(line, len + line2len + 1, char); strcpy(line + len - 1, line2); len += line2len - 1; assert(!line[len]); memset(line2, 0, strlen(line2)); sfree(line2); line2 = NULL; } p = line + hdrstart; strip_crlf(p); if (!strcmp(lineline memset(line, 0, strlen(line)); sfree(line); line = NULL;line) { memset(line, 0, strlen(line)); sfree(line); line = NULL; } Revision-number: 7073 Prop-content-length: 288 Content-length: 288 K 8 svn:date V 27 2007-01-07T14:30:24.277158Z K 7 svn:log V 187 Fix ssh2-cisco-pw-pad by reverting r5122. However, I've kept the ability to easily re-enable the r5122 behaviour, in case we need to conditionally switch between the two at a later date. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c7a96bd5d90af348cb4c503fe31be8e5 Text-delta-base-sha1: b63918a0a2d74e08bc5d3a7fb140a5ddc470806b Text-content-length: 6119 Text-content-md5: cc8a0eba11fc531b763630fb5a94929b Text-content-sha1: 7280af2d21a51c120b58aeca410f4023ec3a286b Content-length: 6119 SVN����5�U��ti�d5�pf packet whose length needs to be disguised (typically * passwords or keyboard-interactive responses). */ static void ssh2_pkt_send_with_padding(Ssh ssh, struct Packet *pkt, int padsize) { #if 0 if (0) { /* * The simplest way to do this is to adjust the * variable-length padding field in the outgoing packet. * * Currently compiled out, because some Cisco SSH servers * don't like excessively padded packets (bah, why's it * always Cisco?) */ pkt->forcepad = padsize; ssh2_pkt_send(ssh, pkt); } else #endif { /* * If we can't do that, however, an alternative approach is * to use the pkt_defer mechanism to bundle the packet * tightly together with an SSH_MSG_IGNORE such that their * combined length is a constant. So first we construct the * final form of this packet and defer its sending. */ ssh2_pkt_defer(ssh, pkt); /* * Now construct an SSH_MSG_IGNORE which includes a string * that's an exact multiple of the cipher block size. (If * the cipher is NULL so that the block size is * unavailable, we don't do this trick at all, because we * gain nothing by it.) */ if (ssh->cscipher) { int stringlen, i; stringlen = (256 - ssh->deferred_len); stringlen += ssh->cscipher->blksize - 1; stringlen -= (stringlen % ssh->cscipher->blksize); if (ssh->cscomp) { /* * Temporarily disable actual compression, so we * can guarantee to get this string exactly the * length we want it. The compression-disabling * routine should return an integer indicating how * many bytes we should adjust our string length * by. */ stringlen -= ssh->cscomp->disable_compression(ssh->cs_comp_ctx); } pkt = ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(pkt); for (i = 0; i < stringlen; i++) { char c = (char) random_byte(); ssh2_pkt_addstring_data(pkt, &c, 1); } ssh2_pkt_defer(ssh, pkt); } ssh_pkt_defersend(ssh); }���**�V� } } while (pktin || inlen > 0); vret = ssh->agent_response; retlen = ssh->agent_response_len; } else sfree(agentreq); ret = vret; if (ret) { if (ret[4] == SSH1_AGENT_RSA_RESPONSE) { logevent("Sending Pageant's response"); send_packet(ssh, SSH1_CMSG_AUTH_RSA_RESPONSE, PKT_DATA, ret + 5, 16, PKT_END); sfree(ret); crWaitUntil(pktin); if (pktin->type == SSH1_SMSG_SUCCESS) { logevent ("Pageant's response accepted"); if (flags & FLAG_VERBOSE) { c_write_str(ssh, "Authenticated using" " RSA key \""); c_write(ssh, s->commentp, s->commentlen); c_write_str(ssh, "\" from agent\r\n"); } s->authed = TRUE; } else logevent ("Pageant's response not accepted"); } else { logevent ("Pageant failed to answer challenge"); sfree(ret); } } else { logevent("No reply received from Pageant"); } } freebn(s->key.exponent); freebn(s->key.modulus); freebn(s->challenge); if (s->authed) break; } sfree(s->response); if (s->publickey_blob && !s->tried_publickey) logevent("Configured key file not in Pageant"); } if (s->authed) break; } if (s->publickey_blob && !s->tried_publickey) { /* * Try public key authentication with the specified * key file. */ int got_passphrase; /* need not be kept over crReturn */ if (flags & FLAG_VERBOSE) c_write_str(ssh, "Trying public key authentication.\r\n"); logeventf(ssh, "Trying public key \"%s\"", filename_to_str(&ssh->cfg.keyfile)); s->tried_publickey = 1; got_passphrase = FALSE; while (!got_passphrase) { /* * Get a passphrase, if necessary. */ char *passphrase = NULL; /* only written after crReturn */ const char *error; if (!s->publickey_encrypted) { if (flags & FLAG_VERBOSE) �2 *�^��� (��Fm�IB�u,�i0 the banner will screw up processing on the * output of (say) plink.) */ if (size && (flags & (FLAG_VERBOSE | FLAG_INTERACTIVE))) { char *banner = snewn(size, char); bufchain_fetch(&ssh->banner, banner, size); c_write_untrusted(ssh, banner, size); sfree(banner); } bufchain_clear(&ssh->banner); } if (pktin->type == SSH2_MSG_USERAUTH_SUCCESS) { logevent("Access granted"); s->we_are_in = TRUE; break; } if (pktin->type != SSH2_MSG_USERAUTH_FAILURE) { bombout(("Strange packet received during authentication: " "type %d", pktin->type)); crStopV; } s->gotit = FALSE; /* * OK, we're now sitting on a USERAUTH_FAILURE message, so * we can look at the string in it and know what we can * helpfully try next. */ if (pktin->type == SSH2_MSG_USERAUTH_FAILURE) { char *methods; int methlen; ssh_pkt_getstring(pktin, &methods, &methlen); if (!ssh2_pkt_getbool(pktin)) { /* * We have received an unequivocal Access * Denied. This can translate to a variety of * messages: * * - if we'd just tried "none" authentication, * it's not worth printing anything at all * * - if we'd just tried a public key _offer_, * the message should be "Server refused our * key" (or no message at all if the key * came from Pageant) * * - if we'd just tried anything else, the * message really should be "Access denied". * * Additionally, if we'd just tried password * authentication, we should break out of this * whole loop so as to go back to the username * prompt (iff we're configured to allow * username change attempts). */ if (s->type == AUTH_TYPE_NONE) { /* do nothing */ } else if (s->type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD || s->type == AUTH_TYPE_PUBLICKEY_with_padding(ssh, s->pktout, 256_with_padding(ssh, s->pktout, 256_with_padding(ssh, s->pktout, 256 Node-path: putty-wishlist/data/ssh2-cisco-pw-pad Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e80af5459d1bf1bfb6c16c38e2959b77 Text-delta-base-sha1: e0d7b2fe04fd189247e1edc61ec84db3fdc9f9c8 Text-content-length: 151 Text-content-md5: 49353fad6dd7018965863e6725e0ca6d Text-content-sha1: 5431965e7e8eb15445e7d2b97bfd698f02ae2f77 Content-length: 151 SVN��jl �n��}mgFixed-in: 2007-01-08 r7073 <p> <b>SGT, 2007-01-07</b>: I've now reverted to the IGNORE message universally, which should fix it. Revision-number: 7074 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2007-01-07T14:41:46.564348Z K 7 svn:log V 6 Typo. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-cisco-pw-pad Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49353fad6dd7018965863e6725e0ca6d Text-delta-base-sha1: 5431965e7e8eb15445e7d2b97bfd698f02ae2f77 Text-content-length: 22 Text-content-md5: 51b031c2d21a5b448271012c812d3a7b Text-content-sha1: 0bf9c2cc781f4d876d6c6e0e8a9790196638ec9c Content-length: 22 SVN��lm ���Zy Revision-number: 7075 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2007-01-07T15:22:14.491605Z K 7 svn:log V 40 Link to Ubuntu and NetBSD packages too. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e9f4bdef0569e9f8ce9f90eed155504 Text-delta-base-sha1: f4d2bb7b856c19b6ecc9f91c32c8f9b9f46fe0f9 Text-content-length: 390 Text-content-md5: 00ac3d9a0e55dd4abe6c241f15117ace Text-content-sha1: bee2ee8c931a019d4b73422306e6f000ac3033fe Content-length: 390 SVN��A l�H�l� zre are other sites tracking bugs and feature requests in downstream packages of the Unix port, some of which undoubtedly apply to our code: <a href="http://packages.qa.debian.org/p/putty.html">Debian</a>, <a href="https://launchpad.net/ubuntu/+source/putty">Ubuntu</a>, <a href="ftp://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/security/putty/README.html">NetBSD</a> Revision-number: 7076 Prop-content-length: 327 Content-length: 327 K 8 svn:date V 27 2007-01-08T18:54:49.088195Z K 7 svn:log V 226 Have one call to from_backend() per call to do_telnet_read(), instead of the previous rate of one per character. In `Flush log file frequently' mode, the latter was causing excessive slowdown due to fflush()ing once per byte. K 10 svn:author V 5 simon PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3597e51a3c49fa7ffa28cf7535a6b0ed Text-delta-base-sha1: 98fd0ea59c04d2ad1a7c5671f56d6f59d16ca19d Text-content-length: 527 Text-content-md5: f9698c839aa20edcfb639947afce6372 Text-content-sha1: 996b5261e94ee76c13fb970d22e373a25922881a Content-length: 527 SVN��U)X�]�o� V �`��z'K�5 (Telnet telnet, char *buf, int len) { int backlog; backlog = from_backend(telnet->frontend, 0, buf, len char *outbuf = NULL; int outbuflen = 0, outbufsize = 0; #define ADDTOBUF(c) do { \ if (outbuflen >= outbufsize) { \ outbufsize = outbuflen + 256; \ outbuf = sresize(outbuf, outbufsize, char); \ } \ outbuf[outbuflen++] = (c); \ } while (0)ADDTOBUF(ADDTOBUF( if (outbuflen) c_write(telnet, outbuf, outbuflen); sfree(outbuf); Revision-number: 7077 Prop-content-length: 936 Content-length: 936 K 8 svn:date V 27 2007-01-08T19:38:39.330428Z K 7 svn:log V 835 The remaining issue in `win-askappend-multi' appears to have been caused by the MessageBox() internal message loop eating WinSock FD_READ notifications, which then don't reappear afterwards because you have to explicitly prod a socket in order to get a repeat notification on it. Hence, here's a piece of infrastructure which seems to sort it out: a new winnet.c function called socket_reselect_all(), whose function is to go through all currently active sockets and re-run WSAAsyncSelect() on them, causing repeat notifications for anything we might have missed. I call this after every call to MessageBox(), and that seems to solve the problem. (The problem was actually masked in very recent revisions, probably by the reinstatement of pending_netevent in r7071. However, I don't believe that was a complete fix. This should be.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 134ab020ca77164d9453800eed989dd9 Text-delta-base-sha1: e0e376b33bb0c4b7310d469fc5742a7f890f60cd Text-content-length: 130 Text-content-md5: 63bfa8380b9971495314a3b66ba375c4 Text-content-sha1: 479ca3c497d2ff2c7ad28e5890ff48bba1d1a18b Content-length: 130 SVN��,a�#��7�DIocket_reselect_all(ocket_reselect_all(ocket_reselect_all(); sfree(msg); sfree(title); } Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c9bf919ab5f981f10aaf06e7a952d20a Text-delta-base-sha1: 5beddb2e105d8d10eb27e134d99672631dbfaccb Text-content-length: 292 Text-content-md5: 1c3abeca9cca2f102eb7444a902f49ce Text-content-sha1: 0630c4bfa37927255f29e61831ea49f596b8a465 Content-length: 292 SVN��l���U�Ke+�@, #else if (s->localhost_only && !ipv4_is_local_addr(isa.sin_addr)) #endif {void socket_reselect_all(void) { Actual_Socket s; int i; for (i = 0; (s = index234(sktree, i)) != NULL; i++) { if (!s->frozen) do_select(s->s, 1); } Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c847d652ce176430d1deb7d5d4ca33ae Text-delta-base-sha1: ffc0dd0beb7738657823c51b80bf1e36e51decdb Text-content-length: 57 Text-content-md5: e1c19968121c4566c11c9312d3a2b48f Text-content-sha1: cc858d0605c365e4be63e4ab71f64b74d291a206 Content-length: 57 SVN��Lt $���>extern void socket_reselect_all(void Revision-number: 7078 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2007-01-08T19:39:13.712772Z K 7 svn:log V 16 Believed fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/win-askappend-multi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 178078fb8baff2ac878616115bd15227 Text-delta-base-sha1: bcc323ababb013ee63137d18ddaa811e73a0efa4 Text-content-length: 95 Text-content-md5: 34c31ef8bc46532d335642a547139d1f Text-content-sha1: 6baf300a360dba925ae78875c9fc7afe12da48e7 Content-length: 95 SVN��c- I���EFixed-in: 2007-01-09 r7077 SGT, 2007-01-08: Should now be fixed (r7077). Revision-number: 7079 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2007-01-09T11:39:51.598586Z K 7 svn:log V 6 Typo. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 00ac3d9a0e55dd4abe6c241f15117ace Text-delta-base-sha1: bee2ee8c931a019d4b73422306e6f000ac3033fe Text-content-length: 25 Text-content-md5: 6af05c8a8dbd232487cbc8b2a7f603c0 Text-content-sha1: 02fcedb3019c20cf79512d382f05535c356f3b23 Content-length: 25 SVN��AA ���:to Revision-number: 7080 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2007-01-09T13:23:57.394162Z K 7 svn:log V 52 Aha, _that's_ why this was listed as uncategorised. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/ssh2-cisco-pw-pad Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 51b031c2d21a5b448271012c812d3a7b Text-delta-base-sha1: 0bf9c2cc781f4d876d6c6e0e8a9790196638ec9c Text-content-length: 84 Text-content-md5: 7a7f504e342cd58ccea9c31d3f901b54 Text-content-sha1: 0d60145b08dedaa343a6eb57dae811cb197ed31e Content-length: 84 SVN��mjCC�'FSummary: Cisco SSH-2 servers can't handle over-padded packets Class Revision-number: 7081 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2007-01-09T14:14:05.406648Z K 7 svn:log V 47 Perhaps this'll help with issues like r7080 :) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6af05c8a8dbd232487cbc8b2a7f603c0 Text-delta-base-sha1: 02fcedb3019c20cf79512d382f05535c356f3b23 Text-content-length: 30 Text-content-md5: e7b0dfae7817dd7dd0f3cac76faea553 Text-content-sha1: e59e4734ec735dce347f882ef428593839ce5d9d Content-length: 30 SVN��A@ ���%lassifi Revision-number: 7082 Prop-content-length: 957 Content-length: 957 K 7 svn:log V 856 Fix `win-randseed-location': use SHGetFolderPath() to find the Application Data directory in preference to the old-fashioned attempt to find the user's home directory, and use the _local- machine_ Application Data directory in preference even to that. SHGetFolderPath() is called via GetProcAddress, so this degrades gracefully on old Windowses. (Tested myself on Win95.) As part of this change, we now search for a location for the seed file separately for reading and writing, so that installing the new PuTTY should cause a seamless migration as the old seed file is read from the old location and then a new one written to the new location. `putty -cleanup' attempts to delete the seed file from _all_ affected locations. Naturally, a user-specified seed file path in the Registry still takes priority over all other means of finding the location. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-09T18:05:17.512085Z PROPS-END Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a8481a4e3cc421d5decfc8d706b3110b Text-delta-base-sha1: 8ac7f0e4806fdfbaac903c63f261cb8ddc37ebf2 Text-content-length: 3680 Text-content-md5: 6e459ed4ad57fc635856b95ea2459ee0 Text-content-sha1: 88ecbc44dd2c2bb49b6afa45828adb1898aa2afb Content-length: 3680 SVN��#-1"�E�`�eT�!i�OV�'i�n'M�JY#include <shlobj.h> #ifndef CSIDL_APPDATA #define CSIDL_APPDATA 0x001a #endif #ifndef CSIDL_LOCAL_APPDATA #define CSIDL_LOCAL_APPDATA 0x001c #endif static const char *const puttystr = PUTTY_REG_POS "\\Sessions"; static const char hex[16] = "0123456789ABCDEF"; static int tried_shgetfolderpath = FALSE; static HMODULE shell32_module = NULL; typedef HRESULT (WINAPI *p_SHGetFolderPath_t) (HWND, int, HANDLE, DWORD, LPTSTR); static p_SHGetFolderPath_t p_SHGetFolderPath = NULLOpen (or delete) the random seed file. */ enum { DEL, OPEN_R, OPEN_W }; static int try_random_seed(char const *path, int action, HANDLE *ret) { if (action == DEL) { remove(path); *ret = INVALID_HANDLE_VALUE; return FALSE; /* so we'll do the next ones too */ } *ret = CreateFile(path, action == OPEN_W ? GENERIC_WRITE : GENERIC_READ, action == OPEN_W ? 0 : (FILE_SHARE_READ | FILE_SHARE_WRITE), NULL, action == OPEN_W ? CREATE_ALWAYS : OPEN_EXISTING, action == OPEN_W ? FILE_ATTRIBUTE_NORMAL : 0, NULL); return (*ret != INVALID_HANDLE_VALUE); } static HANDLE access_random_seed(int action) { HKEY rkey; DWORD type, size; HANDLE rethandle; char seedpath[2 * MAX_PATH + 10] = "\0"; /* * Iterate over a selection of possible random seed paths until * we find one that works. * * We do this iteration separately for reading and writing, * meaning that we will automatically migrate random seed files * if a better location becomes available (by reading from the * best location in which we actually find one, and then * writing to the best location in which we can _create_ one). */ /* * First, try the location specified by the user in the * Registry, if any. */ size = sizeof(seedpath); if (*seedpath && try_random_seed(seedpath, action, &rethandle)) return rethandle; } /* * Next, try the user's local Application Data directory, * followed by their non-local one. This is found using the * SHGetFolderPath function, which won't be present on all * versions of Windows. */ if (!tried_shgetfolderpath) { shell32_module = LoadLibrary("SHELL32.DLL"); if (shell32_module) { p_SHGetFolderPath = (p_SHGetFolderPath_t) GetProcAddress(shell32_module, "SHGetFolderPathA"); } } if (p_SHGetFolderPath) { if (SUCCEEDED(p_SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, seedpath))) { strcat(seedpath, "\\PUTTY.RND"); if (try_random_seed(seedpath, action, &rethandle)) return rethandle; } if (SUCCEEDED(p_SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, seedpath))) { strcat(seedpath, "\\PUTTY.RND"); if (try_random_seed(seedpath, action, &rethandle)) return rethandle; } } /* * Failing that, try %HOMEDRIVE%%HOMEPATH% as a guess at the * user's home directory. */ != 0) { strcat(seedpath, "\\PUTTY.RND"); if (try_random_seed(seedpath, action, &rethandle)) return rethandle; } } /* * And finally, fall back to C:\WINDOWS. */ GetWindowsDirectory(seedpath, sizeof(seedpath)); strcat(seedpath, "\\PUTTY.RND"); if (try_random_seed(seedpath, action, &rethandle)) return rethandle; /* * If even that failed, give up. */ return INVALID_HANDLE_VALUE; } void read_random_seed(noise_consumer_t consumer) { HANDLE seedf = access_random_seed(OPEN_R = access_random_seed(OPEN_W, in all of its possible * locations. */ access_random_seed(DEL Revision-number: 7083 Prop-content-length: 106 Content-length: 106 K 7 svn:log V 7 Fixed. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-09T18:05:53.891094Z PROPS-END Node-path: putty-wishlist/data/win-randseed-location Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6de44bbce071615a0d29eb9db8db5b6c Text-delta-base-sha1: 3bad533bae7e0478b79dd170ef52ee7576fa7ed7 Text-content-length: 45 Text-content-md5: f193ca0c4e4448b892d05e5d0abb0ed0 Text-content-sha1: 3844feada24c3e76ec060cea71ef25880a3ae490 Content-length: 45 SVN��,G�q��<pFixed-in: 2007-01-10 r7082 Revision-number: 7084 Prop-content-length: 636 Content-length: 636 K 8 svn:date V 27 2007-01-09T18:14:30.951170Z K 7 svn:log V 535 Fix `puttygen-unix-perms': f_open(), PuTTY's wrapper on fopen, now takes a third argument which is TRUE if the file is being opened for writing and wants to be created in such a way that it's readable only to the owner. This is used when saving private keys. While I'm here, I also use this option when writing session logs, on the general principle that they probably contain _something_ sensitive. The new argument is only supported on Unix, for the moment. (I think writing owner-accessible-only files is the default on Windows.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d45b675f60f25eb4dd3f4d0b50ec046e Text-delta-base-sha1: 9c48372f86872c7375b5f543669fb17eee7e674d Text-content-length: 60 Text-content-md5: 3bf93446f44e2885d8d835ada3c82624 Text-content-sha1: fbdce4d1fbc304ef692e8a140bd44fd3ce8153d0 Content-length: 60 SVN��]r����2�E, FALSE, FALSE, FALSE Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ca85fc1851c7b91083d06aac34dbc89c Text-delta-base-sha1: 320a80af72e15f875ed276b5f046c14622157d22 Text-content-length: 82 Text-content-md5: 5010245651454c14240dff767f3ef046 Text-content-sha1: eb08d18cddf0313c10a3b9ef158dbc70b90d6091 Content-length: 82 SVN��/I+�2��J6���%|�!�#6�VY, FALSE, TRUE, FALSE, TRUE Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a67f778c4dc8d09a9475c27ff8abfd3e Text-delta-base-sha1: b0731b7b3ed35d1e6377c14584e0cc3076c34d22 Text-content-length: 40 Text-content-md5: 74b0eee30aca665bf638eb713f430353 Text-content-sha1: 425dfa2175d9c697d61894f26bd687b5638d748d Content-length: 40 SVN��w �0��0�0G, TRUE, FALSE Node-path: putty/mac/macmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c46528cd5543ceba42c31d8d74e7476 Text-delta-base-sha1: ddfa48e4066f4331412baba30e3b7df91e91f963 Text-content-length: 36 Text-content-md5: e2de896e81a954b941280cff2e6e2bbc Text-content-sha1: f99e937222c505a5fd4b45278d702a6d79285feb Content-length: 36 SVN��$ ��� , int is_privat Node-path: putty/mac/macstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f146eb884144602a1bb8943e3734bf5 Text-delta-base-sha1: fc9db6d117c7d4c4066a8e738cfca1f327edb7fe Text-content-length: 26 Text-content-md5: 45f61a8a6156c38c119adf6f8751face Text-content-sha1: 95579ca7b86c47cb6fe72e7e8973241cc36429d2 Content-length: 26 SVN��sx ���T, int Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d48e60dc6ed86c3358a517efe2d9bca Text-delta-base-sha1: e99914aa21227f9d4652149aee43280fc0d0464f Text-content-length: 151 Text-content-md5: 7eec9ae5d59f9d1ba35def33e7d1f585 Text-content-sha1: 185b13f53d5a033db03f7f2dee2e1154b9406c93 Content-length: 151 SVN��C�M=�1��81�Fi�k1�$�j>�z(�$(�m�13�d�f�A, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1f74e2ee894ff029c125d5dfb0ebc4f6 Text-delta-base-sha1: 6fc26bf9f881b2d6178d9d03db7d1a65ef689519 Text-content-length: 70 Text-content-md5: b95e2d8dd79f71443e622fc057c41695 Text-content-sha1: c7dfa4537de6045a48dfdbd30a61497f98062bd1 Content-length: 70 SVN��p` 1����/AFILE *f_open(struct Filename, char const *, int); Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6dee1d320fa4271f5231b35d6d6a7cc2 Text-delta-base-sha1: 80cc67aafbedccb6d706f4ba8806739592c08fab Text-content-length: 390 Text-content-md5: d666e209e30e476b4041296302e0a5d2 Text-content-sha1: b089d1d16a10503d4f39c06ab0b473d40b95a505 Content-length: 390 SVN��\Y o�n��|`iassert FILE *f_open(struct Filename filename, char const *mode, int is_private) { if (!is_private) { return fopen(filename.path, mode); } else { assert(mode[0] == 'w'); /* is_private is meaningless for read */ int fd = open(filename.path, O_WRONLY | O_CREAT | O_TRUNC, 0700); if (fd < 0) return NULL; return fdopen(fd, mode); } } Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e1c19968121c4566c11c9312d3a2b48f Text-delta-base-sha1: cc858d0605c365e4be63e4ab71f64b74d291a206 Text-content-length: 31 Text-content-md5: e271f30dce49103cc5086c658bfa139b Text-content-sha1: 9892d54909536a8c09a6c6dc8af2db5a77acbfbc Content-length: 31 SVN��t �d��c, isprivat Revision-number: 7085 Prop-content-length: 106 Content-length: 106 K 8 svn:date V 27 2007-01-09T18:14:51.551109Z K 7 svn:log V 7 Fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/puttygen-unix-perms Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ae3f9ac494bd7e695b9f52b8419c092 Text-delta-base-sha1: 43b298d0562a6d7559920bb3c12879f48442d4ff Text-content-length: 45 Text-content-md5: 9c6fa3a5e6a6521c164ae7784fc71338 Text-content-sha1: 9089f5601c9062b370499af4aaf75080cf0187e2 Content-length: 45 SVN��"=�v��-uFixed-in: 2007-01-10 r7084 Revision-number: 7086 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 Get rid of all the MSVC warnings. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-09T18:24:07.888554Z PROPS-END Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db00b97afe12dd37d34620c096eb0837 Text-delta-base-sha1: b2cd900fa5c26ef23a702f4990d061607d843bfb Text-content-length: 91 Text-content-md5: a83eda4dd091da5e06e20dabe5fc45dc Text-content-sha1: 20a24720cc13e8bb9a17d070c510ddb084510594 Content-length: 91 SVN��*6�t��gt�v�}(int)(int)(pkt->length - pkt->savedpos)(unsigned long) Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cc8a0eba11fc531b763630fb5a94929b Text-delta-base-sha1: 7280af2d21a51c120b58aeca410f4023ec3a286b Text-content-length: 174 Text-content-md5: 04eac6856d20c1e583b2b6c8cfb202d7 Text-content-sha1: ea02ea8730d1442d82cccc498d268c9b8264d82c Content-length: 174 SVN�����������#/�q��Aq�72�Pj�:(unsigned)(unsigned) (unsigned)(unsigned)�H.��er _anyway_, and moreover the printing of * Node-path: putty/ssharcf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0db6fc0856a88003238043c96d7d9320 Text-delta-base-sha1: e8697ea98759045a0338d7aadf56f520735625f4 Text-content-length: 26 Text-content-md5: e25fdf2995d2d337d05155153a587533 Text-content-sha1: 0674ecc27149b7588eca721c2b262e54239d46ec Content-length: 26 SVN��~ �!��]!(int) Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b84fe6ea6b0633ad915b50b404d18b2 Text-delta-base-sha1: 06b8991aa5aece8856dabc8ca863bc30b6970306 Text-content-length: 826 Text-content-md5: 61ee46d87f640e7f36558ab0edec7198 Text-content-sha1: 13404b83364f544128469ac1e1ea96544a8563c8 Content-length: 826 SVN��h| ���"2�QT�%�|B�G>�E�FJ�>� N�x��.F�2K�\ti�/�hM�",w�#6�/Y�`(unsigned)(t >> BIGNUM_INT_BITS)(int)(int)(int)(int)(int)(int)(int)(int)(int)(BIGNUM_INT_BYTES * bn[0])(int)(BIGNUM_INT_BITS * bn[0])(int)(BIGNUM_INT_BITS * bn[0])(int)ret[0]; i++) { ai = ai1; ai1 = (i + shiftw + 1 <= (int)(int)a[0] ? a[mlen - i] : 0); workspace[1 * mlen + i] = (mlen - i <= (int)(int)addend[0]) rlen = addend[0] + 1; ret = newbn(rlen); maxspot = 0; for (i = 1; i <= (int)(int)ret[0] ? ret[i] : 0); carry += (i <= (int)(int)ret[0]; i++) { carry += addend & BIGNUM_INT_MASK; carry += (i <= (int)(int)newx[0]; i++) { BignumInt aword = (i <= (int)modulus[0] ? modulus[i] : 0); BignumInt bword = (i <= (int)(int)(int) Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1acbe116a7fbe4bb40df122fa23319a0 Text-delta-base-sha1: 6b4f9c59ffd0a0332a1960d349f82c89fbd3a106 Text-content-length: 46 Text-content-md5: 807bc8d6aec3811aa5d48d58e9622121 Text-content-sha1: cc57dfd7d31994bc0729842c1acb02eaba814ce7 Content-length: 46 SVN���������@E �V��jV(int) Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04fc8971d7bfcb88d774c32b67c0fcfb Text-delta-base-sha1: 2ce5286916f637f2ea50d8e384383055b893a30b Text-content-length: 26 Text-content-md5: d241270b62d83c28fc66717b955fbc8f Text-content-sha1: 5e40b3c57bbc0ee7983f8b7eeab8e1cf62d42e3f Content-length: 26 SVN�� � �� (int) Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 51938f07408b662d4a83d1b7f5572a48 Text-delta-base-sha1: d19bb4072cc61d27e730a62d036406be0bb98d24 Text-content-length: 25 Text-content-md5: 750bd04ff7c89d6b6273983c151428bd Text-content-sha1: 94daac70061fbe523bf66b87be971225a7fcde80 Content-length: 25 SVN��vg ��N��] Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ebb99f8a83ce6b55c496d4db2928995a Text-delta-base-sha1: 47160c109080995ed4e5892c88dc78bec35a1d78 Text-content-length: 116 Text-content-md5: b8db61f9be0141c3d18b60b854246d99 Text-content-sha1: 6f3c2982e265d8235548d752d9b53363749e8cac Content-length: 116 SVN����"���3�R8�v �f�(UINT)(int)(int)(unsigned)���KF_UP | KF_REPEAT)) != KF_ Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c899ade28ea7f73543091170ee853c8 Text-delta-base-sha1: 27c1931adb939668b7549cd8c580ed74aa3694ce Text-content-length: 71 Text-content-md5: 79276dae85fc22f31c42e86cdc959624 Text-content-sha1: 5c4891a9224046b4512de5228b39e4f12899f5e0 Content-length: 71 SVN��Q 2�y��Wz = 0; /* initialise to placate optimiser */ Revision-number: 7087 Prop-content-length: 641 Content-length: 641 K 7 svn:log V 540 MinGW needs an extra symbol _WIN32_IE defined to a particular value before it'll let you see an identifier (SHGFP_TYPE_CURRENT) referenced since r7082. (Actually, you need a pretty recent w32api before it's there at all.) Morally, this should be defined for all toolchains, not just MinGW/Cygwin, but I'll leave that to people who have those toolchains. <http://msdn2.microsoft.com/en-us/library/aa383745.aspx> Also add some other comments on our use of this API (since it's a horrible one that I suspect will come back and haunt us...) K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-01-09T23:47:15.499822Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3d6bb545173d2ddce4e518848b32da9a Text-delta-base-sha1: 8e863d81987700a17151feae512358693d4f4a26 Text-content-length: 233 Text-content-md5: f6348406b551a29ddbaf2c606414dafd Text-content-sha1: bdfd40f24290413cde34e77131fea70c7942e3b6 Content-length: 233 SVN��5 Q�F�Q�x=Random symbols. !begin cygwin vars # _WIN32_IE is required to expose identifiers that only make sense on # systems with IE5+ installed, such as some arguments to SHGetFolderPath(). CFLAGS += -D_WIN32_IE=0x0500 Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e459ed4ad57fc635856b95ea2459ee0 Text-delta-base-sha1: 88ecbc44dd2c2bb49b6afa45828adb1898aa2afb Text-content-length: 328 Text-content-md5: 679bf23bec6de5562c278db89c056df7 Text-content-sha1: a350e1901284956cec23f48ea3e2e7f260452600 Content-length: 328 SVN��-] .�|�.�3z/* This is likely only to bear fruit on systems with IE5+ * installed, or WinMe/2K+. There is some faffing with * SHFOLDER.DLL we could do to try to find an equivalent * on older versions of Windows if we cared enough. * However, the invocation below requires IE5+ anyway, * so stuff that. */ Node-path: putty-wishlist/data/win-randseed-location Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f193ca0c4e4448b892d05e5d0abb0ed0 Text-delta-base-sha1: 3844feada24c3e76ec060cea71ef25880a3ae490 Text-content-length: 456 Text-content-md5: b5e320f08eb3716ab8efeb063970bd72 Text-content-sha1: 7ab6187720be622e5fcce0092774b121a62a2e36 Content-length: 456 SVN��G)�F�h�Kv�dc'. (To use this function with the maximal range of old Windows versions, considerable faffing is required.) <p> (If this is fixed, <p> <em>Update, 2007-01-09:</em> we now consider keeping <code>PUTTY.RND</code> in a path returned from <a href="http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/functions/shgetfolderpath.asp"><code>SHGetFolderPath()</code></a> on reasonably modern versions of Windows. Revision-number: 7088 Prop-content-length: 273 Content-length: 273 K 7 svn:log V 172 Various SSH-related things were appearing in the PuTTYtel configuration dialog, probably since the addition of the serial backend. Use a more robust check for SSH support. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-01-10T00:16:53.776588Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1670937de2aec1f895173a430740c5a9 Text-delta-base-sha1: 7120bd82c3e75820d997612117dc602fa1895188 Text-content-length: 463 Text-content-md5: caf4ca553ff8de9be8a5f6bea48a3d80 Text-content-sha1: 67358bb27814ff304e32ec9d9fb87c7c9035bec5 Content-length: 463 SVN��9�L�+�i'�Q"�)�QU��4�\L�c@�I;/* * Convenience function: determine whether this binary supports a * given backend. */ static int have_backend(int protocol) { struct backend_list *p = backends; for (p = backends; p->name; p++) { if (p->protocol == protocol) return 1; } return 0; } static void config_hosif (!have_backend(PROT_SSH)have_backend(PROT_SSH)have_backend(PROT_SSH)have_backend(PROT_SSH) Revision-number: 7089 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2007-01-10T00:46:45.828876Z K 7 svn:log V 63 According to Frank Dijcks, this cast makes OpenWatcom happier. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b8db61f9be0141c3d18b60b854246d99 Text-delta-base-sha1: 6f3c2982e265d8235548d752d9b53363749e8cac Text-content-length: 59 Text-content-md5: 20be41e739063ffb5974d1cf8b95f4da Text-content-sha1: 08a9550a726b342e5364ddc5e95e92706c812104 Content-length: 59 SVN���� �{��}{(void *)�'��ram) & ( Revision-number: 7090 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2007-01-10T00:54:08.151416Z K 7 svn:log V 23 Miscellaneous updates. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2d40b30762825487f713474a6ebc87dc Text-delta-base-sha1: f9431e92126ce46b796418e0eec7dfee73ea58fe Text-content-length: 497 Text-content-md5: 70752deb2513c4c37ac5c3e07b41a669 Text-content-sha1: 9fba5aa5919b98ba4f3f01376ca60e6a1d783649 Content-length: 497 SVN��O E�g��@q�Z0X�X F�1^reports Version 1.3 is reported to work You'll probably need quite a recent version of the w32api package. Note that by default the multiple monitor and HTML Help support are excluded from the Cygwin build, since at the time of writing Cygwin The PuTTY team actively use Makefile.vc and Makefile.cyg, so we'll probably notice problems with those toolchains fairly quickly. Please report any problems with the other toolchains mentioned above Revision-number: 7091 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2007-01-10T20:26:07.180387Z K 7 svn:log V 62 Localised to a single checkin ("New timing infrastructure."). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 585df031fb86116397890a8b115e05a0 Text-delta-base-sha1: 7ec5246659bc7bbadd4f50e110ea1654fae6a401 Text-content-length: 279 Text-content-md5: 4bd87a843d3bf2005a8fe29716f3be99 Text-content-sha1: fdeedf9c0086187166db33f83b091a7b1ef51b72 Content-length: 279 SVN��g8z�C�M�nn-� ZClass: bug Absent-in: 0.56 0.57 2004-11-27 r4904 Present-in: r4906 2004-11-28(PSCP actually suffers from the same issue if started from a shortcut with a set of arguments that invokes network activity, although people are less likely to notice that.) Revision-number: 7092 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-12T00:31:04.406959Z PROPS-END Revision-number: 7093 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-12T00:31:04.490203Z PROPS-END Revision-number: 7094 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-12T00:31:04.519765Z PROPS-END Revision-number: 7095 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-12T00:31:04.533505Z PROPS-END Revision-number: 7096 Prop-content-length: 138 Content-length: 138 K 7 svn:log V 38 Ben confirms this is currently fixed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-01-12T10:55:59.528356Z PROPS-END Node-path: putty-wishlist/data/gcc4-warnings Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8da39453fb3f622f9957a81ba100b43b Text-delta-base-sha1: d349eac448818122a6515423e01a2bd1c228740b Text-content-length: 123 Text-content-md5: 5d1ac67f0f415a60b59b07f596e36522 Text-content-sha1: a5ac06f751855ef510336411149b8393ef922707 Content-length: 123 SVN��, f�n��?mRFixed-in: 2007-01-10 <p> <em>Update:</em> The 2007-01-10 snapshot compiled cleanly with GCC 4.1.2ish. Revision-number: 7097 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2007-01-12T20:00:32.422909Z K 7 svn:log V 27 Remove redundant sentence. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2307216169ecd933ce8ab61b7644739d Text-delta-base-sha1: 87f61a5f58d5b35ff787850f665a1b58802b563f Text-content-length: 20 Text-content-md5: bc48378874b5de4f3feb571b24c2466a Text-content-sha1: 6c8744c40dac73d741c9d3d478e87c1d807619e0 Content-length: 20 SVN��` ����OH Revision-number: 7098 Prop-content-length: 416 Content-length: 416 K 8 svn:date V 27 2007-01-12T23:35:46.789018Z K 7 svn:log V 315 Experimental fix for `psftp-hang'. (Experimental only in that I haven't thought about it very hard; it's a plausible fix for the observed cause of the extreme CPU usage, being that we were asking to be notified of Windows messages and then not dealing with them, plausibly leading to a loop. Works for me, anyway.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c3ae4ae47458efefd2078511cef106c1 Text-delta-base-sha1: 4a5b249b4d00dd16c348edacf418a7792b76c943 Text-content-length: 78 Text-content-md5: 1c94451d073f14592444a3662854a87e Text-content-sha1: a1236e9b4fe32e90b674867e6712cf0828643910 Content-length: 78 SVN��+ 9�m��l?WaitForMultipleObjects(nallhandles, handles, FALSE, ticks Revision-number: 7099 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-14T00:31:12.445196Z PROPS-END Revision-number: 7100 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-14T00:31:12.531386Z PROPS-END Revision-number: 7101 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-14T00:31:12.549003Z PROPS-END Revision-number: 7102 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-14T00:31:12.576918Z PROPS-END Revision-number: 7103 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-14T00:31:12.603505Z PROPS-END Revision-number: 7104 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2007-01-13T16:13:56.975560Z K 7 svn:log V 22 Believed to be fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4bd87a843d3bf2005a8fe29716f3be99 Text-delta-base-sha1: fdeedf9c0086187166db33f83b091a7b1ef51b72 Text-content-length: 46 Text-content-md5: c9feccecae53e962e28ce3e7309a507b Text-content-sha1: 239f426ae11ff2d52618f7c526e6bc22b3666bee Content-length: 46 SVN��8S �,��*Fixed-in: r7098 2007-01-1 Revision-number: 7105 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-14T00:31:12.826920Z PROPS-END Revision-number: 7106 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-15T00:31:08.201122Z PROPS-END Revision-number: 7107 Prop-content-length: 925 Content-length: 925 K 7 svn:log V 824 Remove the loops that close all open fds before running a subprocess. They were intended to make sure the child process didn't inherit anything embarrassing or inconvenient from us, such as the master end of its own pty, but now we instead do this by making sure to set all our own fds to not-FD_CLOEXEC on creation. This should fix Debian bug #357520. (This doesn't seem to work _quite_ right in uxproxy.c's invocation of a local proxy command: both ends of a GTK internal pipe end up in the child process's fd space. This appears to be another GTK 1 bug, inasmuch as it goes away when I build with Colin's preliminary GTK 2 patch; for the moment I think leaving that pipe lying around is probably less harmful than hampering the proxy process's ability to use extra fds by prior arrangement with PuTTY's parent process.) K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-14T13:44:07.666757Z PROPS-END Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: be5e64fbb36482e6dbd5dd1e6f669053 Text-delta-base-sha1: 972d4ba5c36a97ea8aa08e9e4b69f7b857d51394 Text-content-length: 136 Text-content-md5: 1a6e36b28b05b4aeb8e16ef59653bbf9 Text-content-sha1: 750ec84bfaeb86ec902b7caf95cc5b607e678121 Content-length: 136 SVN��M i����L5�&' cloexec(to_cmd_pipe[1]); cloexec(from_cmd_pipe[0]);close(to_cmd_pipe[0]); close(from_cmd_pipe[1] Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e1fb4b9d351185c86f111aa647c291e Text-delta-base-sha1: 791411483124e4441f48d4a864565b342b5c059a Text-content-length: 241 Text-content-md5: b3d11958b93e14e6e8ce643d68455bd2 Text-content-sha1: 446b9eafd2a4baa1edc9a9f6b40ad73456abdf8d Content-length: 241 SVN��Nz&=�O��wJ�I�EW�u�3cloexec(pipefd[0]); cloexec(pipefd[1]);close(slavefd) { if (pipe(pty_signal_pipe) < 0) { perror("pipe"); exit(1); } cloexec(pty_signal_pipe[0]); cloexec(pty_signal_pipe[1] Revision-number: 7108 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2007-01-14T21:50:44.874656Z K 7 svn:log V 91 I've just realised that the data-logging options only work in PuTTY proper. Document this. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0bc3a73c72325a607c16bb478f11ffaa Text-delta-base-sha1: a64b7d6313b4a0490b9995ac19fa3f01c236e660 Text-content-length: 517 Text-content-md5: 4cb0b9623d8ae5f096030719397edae2 Text-content-sha1: d8e05f80ed0c74c85c5c2a7ea4417838465ab20f Content-length: 517 SVN���� j�H�j�NFNote that the non-SSH logging options (\q{Printable output} and \q{All session output}) only work with PuTTY proper; in programs without terminal emulation (such as Plink), they will have no effect, even if enabled via saved settings.�mYll�m� \i{Pageant}. If you are not running Pageant, this option will do nothing. See \k{pageant} for general information on Pageant, and \k{pageant-forward} for information on agent forwarding. Note that there is a security risk involved wit Revision-number: 7109 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-16T00:31:09.200088Z PROPS-END Revision-number: 7110 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-16T00:31:09.311320Z PROPS-END Revision-number: 7111 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-16T00:31:09.321144Z PROPS-END Revision-number: 7112 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-16T00:31:09.331122Z PROPS-END Revision-number: 7113 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-16T00:31:09.358919Z PROPS-END Revision-number: 7114 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-16T00:31:09.373978Z PROPS-END Revision-number: 7115 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-16T00:31:09.384689Z PROPS-END Revision-number: 7116 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-17T00:31:19.013773Z PROPS-END Revision-number: 7117 Prop-content-length: 503 Content-length: 503 K 8 svn:date V 27 2007-01-16T18:48:47.368402Z K 7 svn:log V 402 Fold up the `SSH' branch of the treeview by default; it's getting quite big and tends to hide the existence of the `Serial' config panel. This is implemented by folding up every branch of depth 2 or more, which with any luck might turn out to be general enough to carry over unchanged if other branches start expanding. Then again, we may have to fiddle with it again when that time comes; who knows? K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c6a6e67c9cf04d97f9ea37d07e82bd1d Text-delta-base-sha1: 5871db5fc472d3268f47ad4f6414e9e3c59a8d7f Text-content-length: 267 Text-content-md5: 938b4312789308564fdbd8382cd10a75 Text-content-sha1: e1194f84cc839b91d4fcd9213c4dd3b1b647f20d Content-length: 267 SVN��9,Q���mj�vr9�v�T�c{�BT if (j < 2) gtk_tree_item_expand(treeitemlevels[j-1]); else gtk_tree_item_collapsewidget_show(tree); Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 63bfa8380b9971495314a3b66ba375c4 Text-delta-base-sha1: 479ca3c497d2ff2c7ad28e5890ff48bba1d1a18b Text-content-length: 63 Text-content-md5: a55f9a42bec20241c7310f80d64ffdf8 Text-content-sha1: 49b0a31bd984a1245b72cc486609bf79895064c4 Content-length: 63 SVN�� '�k�� u(level > 1 ? TVE_COLLAPSE : TVE_EXPAND) Revision-number: 7118 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2007-01-16T19:26:24.210033Z K 7 svn:log V 49 Add more ifdefs to make uxser.c compile on OS X. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 148d691de81b3e96d9302d1b6c642626 Text-delta-base-sha1: 22bca88b8a0e5c55db8d3c8e2a2e75721ec9bca0 Text-content-length: 124 Text-content-md5: d4462343eac364792fd9516ef523f596 Text-content-sha1: 5a5ba12c6adf9052b440dbfeb9c1f4be0829326d Content-length: 124 SVN��}G f�:�f�'V#ifdef OCRNL | OCRNL #endif #ifdef ONOCR | ONOCR #endif #ifdef ONLRET | ONLRET #endif Revision-number: 7119 Prop-content-length: 191 Content-length: 191 K 7 svn:log V 91 At least, I have the technology to fix `beepind-win2k'. Tested on Win98, Win2K, and WinXP. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-01-16T20:54:58.512703Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f6348406b551a29ddbaf2c606414dafd Text-delta-base-sha1: bdfd40f24290413cde34e77131fea70c7942e3b6 Text-content-length: 194 Text-content-md5: 258b1c995a90c442f49196af4c8049f0 Text-content-sha1: 0c3818d7c37806644d80015265651bac5c916732 Content-length: 194 SVN��&�{�&�R1�!n# WINVER etc perform a similar function for FlashWindowEx(). CFLAGS += -D_WIN32_IE=0x0500 CFLAGS += -DWINVER=0x0500 -D_WIN32_WINDOWS=0x0410 -D_WIN32_WINNT=0x0500 !end Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 20be41e739063ffb5974d1cf8b95f4da Text-delta-base-sha1: 08a9550a726b342e5364ddc5e95e92706c812104 Text-content-length: 1803 Text-content-md5: c62aea07faf68bf38e045bc5323b39c0 Text-content-sha1: 0e54e53ca8bdb529b7601bf9035eb0788a635973 Content-length: 1803 SVN����,����'static void init_flashwindowinit_flashwindow�'�t�t�Zp_�fI�:mfg.resize_action != RESIZE_DISABLED)) { if ((HIWORD(lPatypedef BOOL (WINAPI *p_FlashWindowEx_t)(PFLASHWINFO); static p_FlashWindowEx_t p_FlashWindowEx = NULL; static void init_flashwindow(void) { HMODULE user32_module = LoadLibrary("USER32.DLL"); if (user32_module) { p_FlashWindowEx = (p_FlashWindowEx_t) GetProcAddress(user32_module, "FlashWindowEx"); } } static BOOL flash_window_ex(DWORD dwFlags, UINT uCount, DWORD dwTimeout) { if (p_FlashWindowEx) { FLASHWINFO fi; fi.cbSize = sizeof(fi); fi.hwnd = hwnd; fi.dwFlags = dwFlags; fi.uCount = uCount; fi.dwTimeout = dwTimeout; return (*p_FlashWindowEx)(&fi); } else return FALSE; /* shrug *//* * Timer for platforms where we must maintain window flashing manually * (e.g., Win95). */flashing = 0; if (p_FlashWindowEx) flash_window_ex(FLASHW_STOP, 0, 0); else FlashWindow(hwnd, FALSE); } } else if (mode == 2) { /* start */ if (!flashing) { flashing = 1; if (p_FlashWindowEx) { /* For so-called "steady" mode, we use uCount=2, which * seems to be the traditional number of flashes used * by user notifications (e.g., by Explorer). * uCount=0 appears to enable continuous flashing, per * "flashing" mode, although I haven't seen this * documented. */ flash_window_ex(FLASHW_ALL | FLASHW_TIMER, (cfg.beep_ind == B_IND_FLASH ? 0 : 2), 0 /* system cursor blink rate */); /* No need to schedule timer */ } else { FlashWindow(hwnd, TRUE); next_flash = schedule_timer(450, flash_window_timer, hwnd); } } } else if ((mode == 1) && (cfg.beep_ind == B_IND_FLASH)) { /* maintain */ if (flashing && !p_FlashWindowEx Node-path: putty-wishlist/data/beepind-win2k Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e15e368775dca5e755436995d4340928 Text-delta-base-sha1: fe1a77f6fac395d9a67a2d380c4bd9afe9de5eae Text-content-length: 212 Text-content-md5: 5390646de7ff8d51fc32364bc9829ab1 Text-content-sha1: 6e9717585ee7deef882394da158d9a250e4d4ed7 Content-length: 212 SVN��:8�[���Z�'_Fixed-in: r7119 2007-01-17Where <tt>FlashWindowEx()</tt> is available, `steady' mode flashes the window the conventional number of times and then leaves the taskbar entry highlighted. Revision-number: 7120 Prop-content-length: 266 Content-length: 266 K 8 svn:date V 27 2007-01-16T21:32:02.206376Z K 7 svn:log V 165 Update WINVER to 0x500 to avoid build failures from Jacob's FlashWindow changes. Also fiddle with the <multimon.h> include, which was subtly broken in turn by that. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 77a29016e644b0c3361a9213ed3cb1bd Text-delta-base-sha1: 127ac1788ec3be9d0216e668fecb60781dbf254e Text-content-length: 52 Text-content-md5: a6a8bb2326c004c5b6e6d6737f1ef626 Text-content-sha1: 666f217358f6c93ccbf317ef676d47051ca8fa8c Content-length: 52 SVN��;;�:��=�Nm500500 /DWINVER=0x500 Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c62aea07faf68bf38e045bc5323b39c0 Text-delta-base-sha1: 0e54e53ca8bdb529b7601bf9035eb0788a635973 Text-content-length: 123 Text-content-md5: afe47d3734d9d37eb507947ea3c1e3ec Text-content-sha1: 1b740e820496cf73a2ba6b99c24f5fb6c7f0a8a8 Content-length: 123 SVN����K�j��,g�`ifndef NO_MULTIMON #define COMPILE_MULTIMON_STUBS #endifnclude <multimon.h>���c Revision-number: 7121 Prop-content-length: 310 Content-length: 310 K 8 svn:date V 27 2007-01-17T18:38:45.658495Z K 7 svn:log V 209 Flag user cancellation of authentication as a clean exit, so that it will close the window even in `close window only on clean exit' mode. Also, while I'm here, arrange a suitable exit code for "exit-signal". K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04eac6856d20c1e583b2b6c8cfb202d7 Text-delta-base-sha1: ea02ea8730d1442d82cccc498d268c9b8264d82c Text-content-length: 4548 Text-content-md5: 56acd88f4d7241b0226fa129e2944012 Text-content-sha1: ea3cf2046785ed2f5fe424280235f348b7a66b26 Content-length: 4548 SVN����`�{��wP� r#include <signalssh->close_expected && ssh->clean_exit && ssh->exitcode < 0) ssh->exitcode = 0;���~n�)��)#�6H9�z}xpected data from server" " while waiting for agent" " response")); crStop(0); ssh->exitcode = 128; /* means `unknown signal' */ ssh->exitcode = 128 + signum /* * Really hideous method of translating the * signal description back into a locally * meaningful number. */ if (0) ; #ifdef SIGABRT else if (siglen == lenof("ABRT")-1 && !memcmp(sig, "ABRT", siglen)) ssh->exitcode = 128 + SIGABRT; #endif #ifdef SIGALRM else if (siglen == lenof("ALRM")-1 && !memcmp(sig, "ALRM", siglen)) ssh->exitcode = 128 + SIGALRM; #endif #ifdef SIGFPE else if (siglen == lenof("FPE")-1 && !memcmp(sig, "FPE", siglen)) ssh->exitcode = 128 + SIGFPE; #endif #ifdef SIGHUP else if (siglen == lenof("HUP")-1 && !memcmp(sig, "HUP", siglen)) ssh->exitcode = 128 + SIGHUP; #endif #ifdef SIGILL else if (siglen == lenof("ILL")-1 && !memcmp(sig, "ILL", siglen)) ssh->exitcode = 128 + SIGILL; #endif #ifdef SIGINT else if (siglen == lenof("INT")-1 && !memcmp(sig, "INT", siglen)) ssh->exitcode = 128 + SIGINT; #endif #ifdef SIGKILL else if (siglen == lenof("KILL")-1 && !memcmp(sig, "KILL", siglen)) ssh->exitcode = 128 + SIGKILL; #endif #ifdef SIGPIPE else if (siglen == lenof("PIPE")-1 && !memcmp(sig, "PIPE", siglen)) ssh->exitcode = 128 + SIGPIPE; #endif #ifdef SIGQUIT else if (siglen == lenof("QUIT")-1 && !memcmp(sig, "QUIT", siglen)) ssh->exitcode = 128 + SIGQUIT; #endif #ifdef SIGSEGV else if (siglen == lenof("SEGV")-1 && !memcmp(sig, "SEGV", siglen)) ssh->exitcode = 128 + SIGSEGV; #endif #ifdef SIGTERM else if (siglen == lenof("TERM")-1 && !memcmp(sig, "TERM", siglen)) ssh->exitcode = 128 + SIGTERM; #endif #ifdef SIGUSR1 else if (siglen == lenof("USR1")-1 && !memcmp(sig, "USR1", siglen)) ssh->exitcode = 128 + SIGUSR1; #endif #ifdef SIGUSR2 else if (siglen == lenof("USR2")-1 && !memcmp(sig, "USR2", siglen)) ssh->exitcode = 128 + SIGUSR2; #endif else ssh->exitcode = 128;�HQ �H�V(!pktin); ret = get_userpass_input(s->cur_prompt, in, inlen); ssh->send_ok = 0; } if (!ret) { /* * get_userpass_input() failed to get a username. * Terminate. */ free_prompts(s->cur_prompt); ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE); crStopV; } memcpy(s->username, s->cur_prompt->prompts[0]->result, lenof(s->username)); free_prompts(s->cur_prompt); } else { char *stuff; strncpy(s->username, ssh->cfg.username, sizeof(s->username)); s->username[sizeof(s->username)-1] = '\0'; if ((flags & FLAG_VERBOSE) || (flags & FLAG_INTERACTIVE)) { stuff = dupprintf("Using username \"%s\".\r\n", s->username); c_write_str(ssh, stuff); sfree(stuff); } } s->got_username = TRUE; /* * Send an authentication request using method "none": (a) * just in case it succeeds, and (b) so that we know what * authentication methods we can usefully try next. */ ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK; s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST); ssh2_pkt_addstring(s->pktout, s->username); ssh2_pkt_addstring(s->pktout, "ssh-connection");/* service requested */ ssh2_pkt_addstring(s->pktout, "none"); /* method */ ssh2_pkt_send(ssh, s->pktout); s->type = AUTH_TYPE_NONE; s->gotit = FALSE; s->we_are_in = FALSE; s->tried_pubkey_config = FALSE; s->kbd_inter_refused = FALSE; /* Reset agent request state. */ s->done_agent = FALSE; if (s->agent_response) { if (s->pkblob_in_agent) { s->agentp = s->pkblob_in_agent; } else { s->agentp = s->agent_response + 5 + 4; s->keyi = 0; } } while (1) { /* * Wait for the result of the last authentication request. */ if (!s->gotit) crWaitUntilV(pktin); /* * Now is a convenient point to spew any banner material * that we've accumulated. (This should ensure that when * we exit the auth loop, we haven't any left to deal * with.) */ { int size = bufchain_size(&ssh->banner); /* * Don't show the banner if we're operating in * non-verbose non-interactive mode. (It's probably * a script, which means nobody will read the * bann Revision-number: 7122 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2007-01-17T23:21:57.722078Z K 7 svn:log V 48 putty.cyberiusnetwork.com -> putty.grephead.com K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15091bdf8036d6d31bebfdd33d1ca5ad Text-delta-base-sha1: 3705fae34302cf58d8588977f715fa76c0837e66 Text-content-length: 137 Text-content-md5: de85e29c50bd61a4595a7f95f745fed7 Text-content-sha1: 74112e584195234b666ac392a6db51166f91ccd4 Content-length: 137 SVN��@2_���S�S�J?�Msgrephead.com/">putty.grepheadhostingzero.com/">putty.hostingzerocs.utah.edu/">putty.cs.utah.edu Revision-number: 7123 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2007-01-17T23:31:07.963438Z K 7 svn:log V 25 w3.omnitech.net is gone. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: de85e29c50bd61a4595a7f95f745fed7 Text-delta-base-sha1: 74112e584195234b666ac392a6db51166f91ccd4 Text-content-length: 24 Text-content-md5: 7545e9911381fcbad0f962b0773b6c3f Text-content-sha1: f2204331aa56e17e11be12136e28cdabbb837df3 Content-length: 24 SVN��2B ��{��Gk Revision-number: 7124 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-20T00:31:08.932913Z PROPS-END Revision-number: 7125 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2007-01-19T14:33:56.496723Z K 7 svn:log V 186 Move README.txt into windows subdir. It's specific to the Windows installer, so it seems unnecessarily confusing to have it in the top level of the source distribution alongside README. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/README.txt Node-kind: file Node-action: add Node-copyfrom-rev: 7121 Node-copyfrom-path: putty/README.txt Text-copy-source-md5: 1c1519ebfb2ee75babf68c276c1721c9 Text-copy-source-sha1: 34b24901845d04fb6bb405fe171f2f1de59ae82f Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 63d0776d5e7da883f0b1a4df56e8f7e2 Text-delta-base-sha1: d6bafe91a0c35a946de0dab90b58a8d3bac916dd Text-content-length: 20 Text-content-md5: b81d2d8e38cf3ef5b664b993f047679a Text-content-sha1: 1e9a98cbfa04c34da4c70a1609646f32ecf4b98f Content-length: 20 SVN��2/ ���� Node-path: putty/README.txt Node-action: delete Revision-number: 7126 Prop-content-length: 226 Content-length: 226 K 8 svn:date V 27 2007-01-20T14:13:57.293999Z K 7 svn:log V 127 Don't use C99 mid-block declarations and don't do arithmetic on void *. This helps with compilations on ancient Sun compilers. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d666e209e30e476b4041296302e0a5d2 Text-delta-base-sha1: b089d1d16a10503d4f39c06ab0b473d40b95a505 Text-content-length: 104 Text-content-md5: c5990d6331ef0c00cc1b5eddf4ea77f4 Text-content-sha1: ff14791ebc16e1c735c63f024cabd76b60e4d56f Content-length: 104 SVN��Y^ R��R�Rint fd; assert(mode[0] == 'w'); /* is_private is meaningless for read */ Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f58b7ed387ede67b38e7b3f78087359 Text-delta-base-sha1: e65bdc3f39fd2389a0119ba11e1e5a29d7b74e05 Text-content-length: 80 Text-content-md5: b21031d9488c5d03f8d9e3d0ed3d3baf Text-content-sha1: 70a619219ae9a7c379c3abd4be3e65068e9b6149 Content-length: 80 SVN��% 8�g��vbuf, unsigned len) { char *p, *q, *end, *buf = vbuf Revision-number: 7127 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2007-01-20T16:14:13.603275Z K 7 svn:log V 52 Mention more versions of Windows. (Not Vista, yet.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/README.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c1519ebfb2ee75babf68c276c1721c9 Text-delta-base-sha1: 34b24901845d04fb6bb405fe171f2f1de59ae82f Text-content-length: 171 Text-content-md5: fc0d6a3437f5c9f7db8f931290ab14ea Text-content-sha1: 622b06012ae3fe312d5765096e3fad849a3561db Content-length: 171 SVN�� �b��"c, 2000, and XP, you can set it using Control Panel > System; on Windows 95, 98, and Me, you will need to edit AUTOEXEC.BAT. Consult your Windows Revision-number: 7128 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-21T00:31:05.890307Z PROPS-END Revision-number: 7129 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-21T00:31:05.900243Z PROPS-END Revision-number: 7130 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2007-01-20T20:05:46.159456Z K 7 svn:log V 61 Fix compiles on GCC 3.3, which doesn't know about assert(0); K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56acd88f4d7241b0226fa129e2944012 Text-delta-base-sha1: ea3cf2046785ed2f5fe424280235f348b7a66b26 Text-content-length: 168 Text-content-md5: 4640f23cb729a2af8d5c74b161addf7a Text-content-sha1: a1b1842c952404fbc14bd599feacb79ce835daff Content-length: 168 SVN����������� 6���9 got_passphrase = FALSE; /* placate optimisers */�Q 9�Q� while (ret < 0) { ssh->send_ok = 1; crWaitUntil Revision-number: 7131 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2007-01-20T22:13:33.295225Z K 7 svn:log V 41 Reformat and be generally more positive. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/puttygen-batch Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06209b45c2d889dc6cee5d91083af575 Text-delta-base-sha1: 3a2d3529e5874d111eaaf41ccab61a59ab555108 Text-content-length: 1042 Text-content-md5: 3e414ba0cb6cf715b6b59f20b9b460b8 Text-content-sha1: a376163439bff7f96c9198b1823fab5cd3d7ad52 Content-length: 1042 SVN��ys�:�W�2i�=<re are a few wrinkles to this: <ul> <li> <p> For generating keys, interaction would still be required; there isn't a source of sufficiently good randomness on Windows, so for key generation we make the user generate some by waving the mouse around. <p> It would be possible to pare the interaction down to the bare minimum (mouse-waving and perhaps passphrase entry); this might make PuTTYgen suitable for use in an installation procedure, which specifies the parameters and does something with the resulting keypair. </li> <li> <p> The randomness issue can be ignored for some operations, such as automated format conversions. However, Windows PuTTYgen is currently a GUI application, which makes using it from a batch file slightly tricky. Normally, it will not block the batch file, but this can be dealt with with <tt>START /WAIT</tt>; but it's still not clear how such a setup might e.g. indicate errors (given that it probably won't be able to interact with the console). <p> (The Unix versio</li> </ul> Revision-number: 7132 Prop-content-length: 348 Content-length: 348 K 8 svn:date V 27 2007-01-21T23:34:35.811966Z K 7 svn:log V 247 Fix Plink, the serial backend, and local-proxy support on Win98SE (at least), which have been broken since r6797. (At least some versions of Win9x are gratuitously picky about the arguments to CreateThread(), requiring lpThreadId not to be NULL.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c6045e1853cd4bf99b85b49ee0c4da47 Text-delta-base-sha1: 156cfcb235f2a60dc0959783aed87c8272dad979 Text-content-length: 159 Text-content-md5: 49b9167450e46ccb6802de3ddb5e8724 Text-content-sha1: 52169d5fd5189b4beb8468a9c7f01cef1e34a0d3 Content-length: 159 SVN��sx����G3�[y�)X DWORD in_threadid; /* required for Win9x */&in_threadid DWORD out_threadid; /* required for Win9x */&out_threadid Revision-number: 7133 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2007-01-21T23:34:51.874589Z K 7 svn:log V 69 Fix several bugs that stopped %proxyport from doing anything useful. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e900c03c3cb2e7b4485dd9761ce6c96 Text-delta-base-sha1: daf0c0c40d30286109ec9e8219bcb5a444df8a24 Text-content-length: 45 Text-content-md5: 3623e255f0708fd0e18b01e59f4e3370 Text-content-sha1: 753cdea81418b91d7bc76ffc0985759c68337923 Content-length: 45 SVN�� �h��bi� L�9g99ppor Revision-number: 7134 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 We can't sensibly detect this problem in NetApps. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-01-22T12:39:07.098389Z PROPS-END Node-path: putty-wishlist/data/ssh-bug-rekey2-notsaved Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: efeac6135864b397a0b84eb64bca9240 Text-delta-base-sha1: e5e6b307e12aa4fb1d72c5b4eb27adff5ae52452 Text-content-length: 51 Text-content-md5: 788e38c62eb3bd8028b436e7623f3820 Text-content-sha1: a1dcb1a6e77600bb323da9cea0567e8e9b0dac2f Content-length: 51 SVN��7> ���5can't be distinguished by our Revision-number: 7135 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2007-01-22T14:04:33.916014Z K 7 svn:log V 25 Improve error reporting. K 10 svn:author V 5 simon PROPS-END Node-path: putty/icons/icon.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0cbc8e87242e13906d1860701ac27dff Text-delta-base-sha1: 801e00e9b03ca9fff0368b6a7a09745b62495612 Text-content-length: 155 Text-content-md5: d4693bfd5e9f9ffbd0be4e43c42e2537 Text-content-sha1: 0d0d8cd8d44741641e97d543f5d71a47658f2656 Content-length: 155 SVN�� a �7��'d $pixhex = sprintf "%02x%02x%02x", unpack "CCC", $pix; die "illegal colour value $pixhex at pixel ($x,$y) Revision-number: 7136 Prop-content-length: 279 Content-length: 279 K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-22T18:02:06.353226Z K 7 svn:log V 178 Add an icon for the PuTTY installer. Design concept (and noticing that Inno Setup had an option to specify an icon) by Jacob; detailed artwork and translation into Python by me. PROPS-END Node-path: putty/icons/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cbab694b58302ae291f857e574e45857 Text-delta-base-sha1: fb1e7d0e43b71f9e785c31f3cf05b9112e7af67e Text-content-length: 632 Text-content-md5: ae089a40dfbb49fc747a1a827d9abb67 Text-content-sha1: a1f36fadce63fe636723dd74ac6852ab41cad111 Content-length: 632 SVN��96V�a��ra�tO9� installer \ installer# Because the installer icon makes heavy use of brown when drawing # the cardboard box, it's worth having 8-bit versions of it in # addition to the 4- and 1-bit ones. installer.ico: installer-16.png installer-32.png installer-48.png \ installer-16-mono.png installer-32-mono.png \ installer-48-mono.png \ installer-16-true.png installer-32-true.png \ installer-48-true.png ./icon.pl -8 $(filter %-true.png, $^) \ -4 $(filter-out %-true.png, $(filter-out %-mono.png, $^)) \ Node-path: putty/icons/mkicon.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0ce9b40223760cb99d053faf8ab95a5a Text-delta-base-sha1: aac40270971ba4b8c51c0b651cd50af7293e4ac8 Text-content-length: 3668 Text-content-md5: 9b84d9cd91f066476c52a2e69c24461f Text-content-sha1: 7edd6d3a4a7412c438786385bda9251466bbfdeb Content-length: 3668 SVN��C^B�N� �vL�(B�*d�S�BU�D�]Y/�5def box(size, back): canvas = {} # The back side of the cardboard box in the installer icon. boxwidth = round(15 * size) boxheight = round(12 * size) boxdepth = round(4 * size) boxfrontflapheight = round(5 * size) boxrightflapheight = round(3 * size) # Three shades of basically acceptable brown, all achieved by # halftoning between two of the Windows-16 colours. I'm quite # pleased that was feasible at all! dark = halftone(cr, cK) med = halftone(cr, cy) light = halftone(cr, cY) # We define our halftoning parity in such a way that the black # pixels along the RHS of the visible part of the box back # match up with the one-pixel black outline around the # right-hand side of the box. In other words, we want the pixel # at (-1, boxwidth-1) to be black, and hence the one at (0, # boxwidth) too. parityadjust = int(boxwidth) % 2 # The entire back of the box. if back: for x in range(int(boxwidth + boxdepth)): ytop = max(-x-1, -boxdepth-1) ybot = min(boxheight, boxheight+boxwidth-1-x) for y in range(int(ytop), int(ybot)): pixel(x, y, dark[(x+y+parityadjust) % 2], canvas) # Even when drawing the back of the box, we still draw the # whole shape, because that means we get the right overall size # (the flaps make the box front larger than the box back) and # it'll all be overwritten anyway. # The front face of the box. for x in range(int(boxwidth)): for y in range(int(boxheight)): pixel(x, y, med[(x+y+parityadjust) % 2], canvas) # The right face of the box. for x in range(int(boxwidth), int(boxwidth+boxdepth)): ybot = boxheight + boxwidth-x ytop = ybot - boxheight for y in range(int(ytop), int(ybot)): pixel(x, y, dark[(x+y+parityadjust) % 2], canvas) # The front flap of the box. for y in range(int(boxfrontflapheight)): xadj = int(round(-0.5*y)) for x in range(int(xadj), int(xadj+boxwidth)): pixel(x, y, light[(x+y+parityadjust) % 2], canvas) # The right flap of the box. for x in range(int(boxwidth), int(boxwidth + boxdepth + boxrightflapheight + 1)): ytop = max(boxwidth - 1 - x, x - boxwidth - 2*boxdepth - 1) ybot = min(x - boxwidth - 1, boxwidth + 2*boxrightflapheight - 1 - x) for y in range(int(ytop), int(ybot+1)): pixel(x, y, med[(x+y+parityadjust) % 2], canvas) # And draw a border. border(canvas, size, [(0, int(boxheight)-1, BL)]) return canvas def boxback(size): return box(size, 1) def boxfront(size): return box(size, 0), aux={}aux["c2pos"] = (w-bb[2], 0-bb[1]aux["c1pos"] = (0-bb[0], h-bb[3]installer_icon(size): aret = {} # The box back goes behind the lightning bolt. canvas = xybolt(boxback(size), computer(size), size, boltoffx=-2, boltoffy=+1, aux=aret) # But the box front goes over the top, so that the lightning # bolt appears to come _out_ of the box. Here it's useful to # know the exact coordinates where xybolt placed the box back, # so we can overlay the box front exactly on top of it. c1x, c1y = aret["c1pos"] overlay(boxfront(size), c1x, c1y, canvas) return canvas def halftone(col1, col2): return (col1, col2) def halftone(col1, col2): return (col1, col2) def halftone(col1, col2): r1,g1,b1,a1 = col1 r2,g2,b2,a2 = col2 colret = (int(r1+r2)/2, int(g1+g2)/2, int(b1+b2)/2, int(a1+a2)/2) return (colret, colret) Node-path: putty/windows/installer.ico Node-kind: file Node-action: add Prop-content-length: 59 Text-delta: true Text-content-length: 11492 Text-content-md5: af0c3b18a9d93dd45fc0bdab2fce6d11 Text-content-sha1: 6597cec3f3179b3b59e2341738f566596aca626f Content-length: 11551 K 13 svn:mime-type V 24 application/octet-stream PROPS-END SVN���VVV��� �����h����� ��������00�����������(��N�� �����v��00���h��^!��������'�� ���0��v(��00���0��)��(������ ���������������������������������@���@����� �������� ���///�___��{�����������}������y�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������� ���������  ��������� ��������� ��������� �������������������������������������������������������(��� ���@���������������������������������@���@��������������������������������������y������������{������������������������������|���v���r����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������������� ������������������������������������������ �������������������������������������� ������������������� !"����������������������������������������������������������������������������������������������?���������������������������(���0���`���������� �����������������������@���@�����������������������������������u������������������������x������������z������������������|������������������������{���v���t���q���n�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������� ������������������������������ ���������������������������� ��! "����������������������������#$%%��&'����������������������������# $((($ !)����������������������������#$%%%$&'���������������������������� * ! "����������������������������+++++,-./�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(������ ��������������������������������������������������������������������������1111�������1111�� ��0�����0�110� ���� �0��������x����KLx����Lx����x����������������������������������������������(��� ���@����������������������������������������������������������������������������������1111111���������������1111111�������������1111111������������1111111����� �����1������������10����� �������������1110������������ �110������������0ww����� ����x������������������������� ���������� Lj����������Lj���������L Lj���������L Lj���������LLj���������LLj���������DDDDG�������������������wwwwwx�������������������������������������?���������������������������(���0���`������������������������������������������������������������������������������������������11111111111�����������������������11111111111���������������������11111111111�������������������11111111111������������������11111111111����������������11����������������1�������� ��������110����������������1110������� �������������������111110����������������11110�������� ���������������110���������� ������������� �0����������������������� wx����������������x�������������������� �������������������������������wwwwwx����������� ������������� ��������������������������� �������������������������������������������������������������������������������DDDDDD�������������x���������������������������wwwwwwwwx��������������wwwwwwww���������������������������������������������������?��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(������ ���������@����������������������������*��@��*��U@��*��T���*�����������L�� ���������������������������������������������(��� ���@������������������������������������� �U@� �U@� �U@� �UU@�*�UD�*�UU���*�@� �<�?�������p� p�p��p��p��p��p��������������������������?���������������������������(���0���`��������������������������������������������UUP��������UUP��������UUP��������UUP��������UUP����*����UUP����*����UUP@��� ���UUQP��� ���UUUT������ �����U�����0�����T�����������P����/��������|����8���� ������~�������������o�����������������������������������������������������������������������������������������?�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b81d2d8e38cf3ef5b664b993f047679a Text-delta-base-sha1: 1e9a98cbfa04c34da4c70a1609646f32ecf4b98f Text-content-length: 48 Text-content-md5: 9df763c297cc4a73d29ec501e7a5c0bb Text-content-sha1: cede3110aaf20b764bb2460cb4c2afa1c4ccd872 Content-length: 48 SVN��/L ���SetupIconFile=installer.ico Revision-number: 7137 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2007-01-22T23:08:45.834330Z K 7 svn:log V 45 Add Portuguese translation of error message. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 81eacc678cf87219d645c5e4e9714179 Text-delta-base-sha1: 3952172cc588c94e762dee9a2549f0c2cd95ca50 Text-content-length: 211 Text-content-md5: 4c94d44e64032bbc84f670781175844e Text-content-sha1: 353ab2b5834d8105c489726cd1244fc4e99800d2 Content-length: 211 SVN��; ;�"�;�-or (in Portuguese): <blockquote> Falha na inicialização do aplicativo devido a configuração incorreta. A reinstalação do aplicativo pode resolver o problema Revision-number: 7138 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2007-01-22T23:52:08.959873Z K 7 svn:log V 26 Couple of French mirrors. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7545e9911381fcbad0f962b0773b6c3f Text-delta-base-sha1: f2204331aa56e17e11be12136e28cdabbb837df3 Text-content-length: 202 Text-content-md5: 5247fc11ec912afeae1ff3dd310173eb Text-content-sha1: d2e98535eab01fab70fd1bf7357453dec627cff5 Content-length: 202 SVN��B!�*��C?�C?�5*�yIwandis.com/">putty.wandis.com</a> in Franmiroir-francais.fr/">putty.miroir-francais.fr</a> in Franmiroir-francais.fr/pub/putty/">miroir-francais.fr</a> in France Revision-number: 7139 Prop-content-length: 197 Content-length: 197 K 7 svn:log V 97 Checklist updates for the upcoming release, mostly to do with the retirement of the Alpha build. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-23T11:15:56.680307Z PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 74d4907d9e72c82d8c1e21d28171e783 Text-delta-base-sha1: 1696ad9658a677e27f041254a202b45172746bce Text-content-length: 900 Text-content-md5: 6f49362787bd0d8437d4eb1a7dd43133 Text-content-sha1: 2a303eae15c4a3e2aa28b3fb6a68a13ef981c992 Content-length: 900 SVN��HS@8�Q��XM(�e�M�Y �i|}�j~�_}�*ov�w`�j^ putty.zip: all the .exe files except PuTTYtel, and the .hlp, .cnt and .chm files. + zip -k putty.zip `ls *.exe | grep -v puttytel` putty.hlp putty.cnt putty.chman md5sums file in the top-level directory. + The md5sums files need not list the .DSA and .RSA signatures. Easiest thing is to run (gpg --clearsign). for t in DSA RSA; do gpg --load-extension=idea --clearsign -u "Releases ($t)" -o md5sums.$t md5sumsthe md5sums file0.59 ONLY: update the docs page so that it links to the release .chm as well as the release .hlp and .cnt. Remove this checklist item after it's done; it won't need doing again in the subsequent release. + FOR 0.59 ONLY: update the Download page to remove all the Alpha links. Remove this checklist item after it's done; it won't need doing again Revision-number: 7140 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2007-01-23T11:38:11.642925Z K 7 svn:log V 74 Mention the potential networked-CHM problem in the post-installer README. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/README.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fc0d6a3437f5c9f7db8f931290ab14ea Text-delta-base-sha1: 622b06012ae3fe312d5765096e3fad849a3561db Text-content-length: 339 Text-content-md5: d94333b14f9aa47d5359cae69eab9285 Text-content-sha1: 27eb0e5308aa53370fe20f2bdff1f1d5d271dc52 Content-length: 339 SVN��W ;� �;�Some versions of Windows will refuse to run HTML Help files (.CHM) if they are installed on a network drive. If you have installed PuTTY on a network drive, you might want to check that the help file works properly. If not, see http://support.microsoft.com/kb/896054 for information on how to solve this problem Revision-number: 7141 Prop-content-length: 182 Content-length: 182 K 8 svn:date V 27 2007-01-23T14:12:42.530787Z K 7 svn:log V 82 Mention XXX-REVIEW-BEFORE-RELEASE in the same place as XXX-REMOVE-BEFORE-RELEASE. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f49362787bd0d8437d4eb1a7dd43133 Text-delta-base-sha1: 2a303eae15c4a3e2aa28b3fb6a68a13ef981c992 Text-content-length: 65 Text-content-md5: 3ecb4dc11a41246e7a53e3b1d93d2bc2 Text-content-sha1: 2960a645a0149514824b424c84d031b6fe191d3d Content-length: 65 SVN��St ,�*��5s XXX-REMOVE-BEFORE-RELEASE or XXX-REVIEW Revision-number: 7142 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2007-01-24T11:20:14.103946Z K 7 svn:log V 54 faq-xpwontrun wants tweaking before the next release. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ddeab78003bb77320d2dab4ba11fa9aa Text-delta-base-sha1: 58a398f06ba74544426cba8443143fa1566041c3 Text-content-length: 310 Text-content-md5: 2fcd214272d7d0acc374af09dce8ba6a Text-content-sha1: 6534cd1ba5223f5531b4bcaa1a8b21893ababa88 Content-length: 310 SVN��KU �<�A�$>L�A�'$ \#{XXX-REVIEW-BEFORE-RELEASE: This entry should be changed on the point of the next release, so that it makes it into the release documentation. I suggest replacing the following text:} \#{with this: This was fixed in 0.59. } \#{XXX-REVIEW-BEFORE-RELEASE: END} T Revision-number: 7143 Prop-content-length: 321 Content-length: 321 K 8 svn:date V 27 2007-01-24T13:53:28.874747Z K 7 svn:log V 220 The direct link between the terminal and the back end via term_provide_resize_fn() was not being broken when the back end was destroyed on session termination, causing resizing an inactive PuTTY to be a segfault hazard. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 807bc8d6aec3811aa5d48d58e9622121 Text-delta-base-sha1: cc57dfd7d31994bc0729842c1acb02eaba814ce7 Text-content-length: 69 Text-content-md5: f2b235aa520dec33bbdec09a41c70fbb Text-content-sha1: aef2a75ef75561a57481b50124f955e862bfc36f Content-length: 69 SVN���� �N��%Nresize_fn && �ER �E� (term->esc_a Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 64c972eb75824a3f98804190dba42db7 Text-delta-base-sha1: e34cc36277ccc2c64a4bc6f4954b2b52a94f7332 Text-content-length: 158 Text-content-md5: da52e44957f8c3ddc73e8bc83fc4c1bb Text-content-sha1: 7b1d9ec29a4c767acdd3d25d86105e5f67f6f932 Content-length: 158 SVN���� :�X��nV term_provide_resize_fn(inst->term, NULL, NULL)�R<��ow), "focus_in_event", GTK_SIGNAL_FUNC(focus_event) Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: afe47d3734d9d37eb507947ea3c1e3ec Text-delta-base-sha1: 1b740e820496cf73a2ba6b99c24f5fb6c7f0a8a8 Text-content-length: 139 Text-content-md5: 5a9d5bf9d6b3ee77187aa7ee08b2cf2f Text-content-sha1: de1b9cb71b9e0f8baa0f8126d99ae33f86789a25 Content-length: 139 SVN���� 0�e��kc term_provide_resize_fn(term, NULL, NULL)�72��== VK_RETURN && cfg.fullscreenonaltenter && ( Revision-number: 7144 Prop-content-length: 293 Content-length: 293 K 8 svn:date V 27 2007-01-24T17:19:34.730997Z K 7 svn:log V 192 Add more explicit comments on how to use @releases. Weed out duplicates from the implicit Fixed-in: entries (this has been made more obvious by our putting both dates and Subversion revs in). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7b0dfae7817dd7dd0f3cac76faea553 Text-delta-base-sha1: e59e4734ec735dce347f882ef428593839ce5d9d Text-content-length: 577 Text-content-md5: 46ce55d02c8136ebf780fc73366b94cd Text-content-sha1: 964c9f837bf03637c294fe886f4e833fdfdf6542 Content-length: 577 SVN��@J�^�B�3�B �AA�D|or on the relevant # snapshot date/rev as also being fixed in a release. # For trunk releases, the date and rev of the checkin for the # release tag will do. # For branch releases, you probably want the date/rev of the branch; # you're presumably going to explicitly mark up the fixes that were # back-ported to the branchmy %extra_fixed_hmy $relstr = "($rel)"; if (!exists($extra_fixed_h{$relstr})) { $extra_fixed_h{$relstr} = 1; push @extra_fixed, $relstr; } Revision-number: 7145 Prop-content-length: 133 Content-length: 133 K 7 svn:log V 33 Add .CHM to the ignore property. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-24T20:00:19.419742Z PROPS-END Node-path: putty/doc Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 101 Content-length: 101 K 10 svn:ignore V 69 *.html *.txt *.cnt *.hlp *.gid *.GID *.chm *.log *.1 *.info vstr.but PROPS-END Revision-number: 7146 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2007-01-24T20:16:33.702828Z K 7 svn:log V 68 Version number bumps, and associated changes, for the 0.59 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b0f16e753f5ebc4f4fa972d605b9390 Text-delta-base-sha1: 65a8d5a49fe8f7f66a774f7f3e27266db99f8b6a Text-content-length: 15 Text-content-md5: 53cf7cfb0f75dfdf7585dcdea153e015 Text-content-sha1: a5d01d52a3f9be402473a71b5b1e5ac0dcbdbbb6 Content-length: 15 SVN��0.59 Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2fcd214272d7d0acc374af09dce8ba6a Text-delta-base-sha1: 6534cd1ba5223f5531b4bcaa1a8b21893ababa88 Text-content-length: 84 Text-content-md5: ff54e4a45458118af46c570ad522e5b8 Text-content-sha1: 9e2fe26cf4995e074b4ea2c536976de2d1eb1e9a Content-length: 84 SVN��U>6� ��A�'. is triggered by PuTTY 0.58. This was fixed in 0.59. T Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 969d197dfc07b5bfdd5aeb2730d4f8ee Text-delta-base-sha1: 2850bb6aa307758fd442b14228f81019c444a466 Text-content-length: 23 Text-content-md5: 93f457616aa33e16b8061906499be04f Text-content-sha1: 172057f3145051c21afd8a8eb77485aa1dca7976 Content-length: 23 SVN��<< ���"59 Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc48378874b5de4f3feb571b24c2466a Text-delta-base-sha1: 6c8744c40dac73d741c9d3d478e87c1d807619e0 Text-content-length: 23 Text-content-md5: f63b99c6a88097b9122cfd36f0c0cbe7 Text-content-sha1: 4fdfdef8216b4a7a7b4077b16b201133e1186e86 Content-length: 23 SVN��`` ���[59 Node-path: putty/mac/version.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef93e1e18e8251e3df9c20c43c76d690 Text-delta-base-sha1: eda365cca3074ae13f3508bf2c81aae668d5f65e Text-content-length: 20 Text-content-md5: 480a0be883ad6f3cc9898dd62b8a2779 Text-content-sha1: 10ab459e10b4ad307629c1aea170929ab5f84adb Content-length: 20 SVN��77�m��In9 Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9df763c297cc4a73d29ec501e7a5c0bb Text-delta-base-sha1: cede3110aaf20b764bb2460cb4c2afa1c4ccd872 Text-content-length: 102 Text-content-md5: 0e24be26ad3b36ce173442301510cf3b Text-content-sha1: 6a32c2f0e0354a0a2122efc56868a6d413211137 Content-length: 102 SVN��LL P��P�hd9 VersionInfoTextVersion=Release 0.59 AppVersion=0.59 VersionInfoVersion=0.59 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1b7cafca411c4e5584ee0bc116bc1df9 Text-delta-base-sha1: 9626bee0128f729a21557994b6e0535953674d7b Text-content-length: 22 Text-content-md5: 0fef52ecc4ed7e18a52f5e786f4e4860 Text-content-sha1: 1a7bc84d5eadf59e095021f5946d3a6c71ecb985 Content-length: 22 SVN��zz �\��]9 Revision-number: 7147 Prop-content-length: 122 Content-length: 122 K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-24T20:17:01.708730Z K 7 svn:log V 22 Tag for 0.59 release. PROPS-END Node-path: putty-0.59 Node-kind: dir Node-action: add Node-copyfrom-rev: 7146 Node-copyfrom-path: putty Revision-number: 7148 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2007-01-24T21:29:00.679913Z K 7 svn:log V 38 Website changes for the 0.59 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7964e351c20cf1ae6e963959a2e8ed0d Text-delta-base-sha1: cc816aa4321633e9599ff2a867fb92eeda1f8615 Text-content-length: 98 Text-content-md5: 410343d1f7a2a80e1bed603b28378b06 Text-content-sha1: f29e60c58034846f358c9da9fe9e848b120872e8 Content-length: 98 SVN��G�s�D��h�MEtemp /~sgtatham/putty/0.59/ http://the.earth.li/~sgtatham/putty/0.59chm Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ae8009e330655e36c315ad0e95fca23 Text-delta-base-sha1: d3fc0090da5130dc51feb7559991ef0046f76078 Text-content-length: 3645 Text-content-md5: 09d47fcc633903afecdca0752c9f09a9 Text-content-sha1: 7dc30f1278b931fff5b4709c65cf34bb70b1e618 Content-length: 3645 SVN��w+ "�;�"�N)9 (released 2007-01-24): <ul> <li> PuTTY can now connect to local serial ports as well as making network connections. <li> Windows PuTTY now supports "local proxying", where a network connection is replaced by a local command. (Unix PuTTY has supported this since it was first released in 0.54.) Also, Plink has gained a "<code>-nc</code>" mode where the primary channel is replaced by an SSH tunnel, which makes it particularly useful as the local command to run. <li> Improved speed of SSH on Windows (particularly SSH-2 key exchange and public-key authentication). <li> Improved SFTP throughput. <li> Various cryptographic improvements in SSH-2, including SDCTR cipher modes, a workaround for a weakness in CBC cipher modes, and Diffie-Hellman group exchange with SHA-256. <li> Support for the Arcfour cipher in SSH-2. <li> Support for sending terminal modes in SSH. <li> When Pageant is running and an SSH key is specified in the configuration, PuTTY will now only try Pageant authentication with that key. This gets round a problem where some servers would only allow a limited number of keys to be offered before disconnecting. <li> Support for SSH-2 password expiry mechanisms, and various other improvements and bugfixes in authentication. <li> A change to the SSH-2 password camouflage mechanism in 0.58 upset some Cisco servers, so we have reverted to the old method. <li> The Windows version now comes with documentation in HTML Help format. (Windows Vista does not support the older WinHelp format. However, we still provide documentation in that format, since Win95 does not support HTML Help.) <li> On Windows, when pasting as RTF, attributes of the selection such as colours and formatting are also pasted. <li> Ability to configure font quality on Windows (including antialiasing and ClearType). <li> The terminal is now restored to a sensible state when reusing a window to restart a session. <li> We now support an escape sequence invented by xterm which lets the server clear the scrollback (CSI 3 J). This is useful for applications such as terminal locking programs. <li> Improvements to the Unix port: <ul> <li> now compiles cleanly with GCC 4 <li> now has a <code>configure</code> script, and should be portable to more platforms </ul> <li> Bug fix: 0.58 utterly failed to run on some installations of Windows XP. <li> Bug fix: PSCP and PSFTP now support large files (greater than 4 gigabytes), provided the underlying operating system does too. <li> Bug fix: PSFTP (and PSCP) sometimes ran slowly and consumed lots of CPU when started directly from Windows Explorer. <li> Bug fix: on Windows, some Unicode characters that were displayed correctly in 0.57 were displayed as blanks in 0.58. <li> Bug fix: if the remote server saturated PuTTY with data, PuTTY could become unresponsive. <li> Bug fix: certain large clipboard operations could cause PuTTY to crash. <li> Bug fix: SSH-1 connections tended to crash, particularly when using port forwarding. <li> Bug fix: SSH Tectia Server would reject SSH-2 tunnels from PuTTY due to a malformed request. <li> Bug fix: SSH-2 login banner messages were being dropped silently under some circumstances. <li> Bug fix: the cursor could end up in the wrong place when a server-side application used the alternate screen. <li> Bug fix: on Windows, PuTTY now tries harder to find a suitable place to store its random seed file <code>PUTTY.RND</code> (previously it was tending to end up in <code>C:\</code> or <code>C:\WINDOWS</code>). <li> Bug fix: IPv6 should now work on Windows Vista. <li> Numerous other bugfixes, as usual. </ul> <p>These features we Node-path: putty-website/docs.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 45f8615d14bf09ee2bd19aeecc046299 Text-delta-base-sha1: d799574aaf6087896059dd3d26bce22c73f6d85b Text-content-length: 578 Text-content-md5: 719e2b097660d3dbdb1a30e11e6de045 Text-content-sha1: f15a471f4e6b0621b73a98726e47a6668b90dac0 Content-length: 578 SVN��U��3�d$�Ik�7\chm">The Windows Help file</a> (HTMLHelp format, not supported by Win95). <li> <a href="http://the.earth.li/~sgtatham/putty/latest/putty.hlp">The old-style Windows Help file</a>, Note that some versions of Windows will refuse to run HTML Help files (<code>.CHM</code>) if they are installed on a network drive. If you have installed PuTTY on a network drive, you might want to check that the help file works properly. If not, see <a href="http://support.microsoft.com/kb/896054">MS KB 896054</a> for information on how to solve this problem. Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1bb74c3a9302ed3b2bd4fefc0d97b38a Text-delta-base-sha1: e0078a01079e019dd039949e5c5f53cae232cdc2 Text-content-length: 516 Text-content-md5: 1e0e39fac2e28f1edafbc94d46c24330 Text-content-sha1: 652cdd682c29e3b760c3c54f2bd101c3616045be Content-length: 516 SVN��"n���V�6{�k)�G?�T@�Yv�U@�K?�X<�j3�Z>�Y �F{�1��o�C��V?�u:�ou�4�T@�O��Q��4n9, XP and VistaZip file:.zip">putty.zipx86x86/puttyx86/putty.zip.DSA">(DSA sig)</a></td> </tr> <tr> <td colspan=4><b>A Windows installer for everything except PuTTYtel</b></td> </tr> <tr> <td>Installer:9-installer.exe">putty-0.59-installerx86/putty-0.599-installerutty-0.59, XP and VistaZip file9.tar.gz">putty-0.59.tar.gzputty-0.59.tar.gzputty-0.59.tar.gzputty-0.59 Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e94a64b58db4d798b52b7dabc1cca6e4 Text-delta-base-sha1: 4e769cbf427b4356a879d3404cf0f70c950aeabe Text-content-length: 170 Text-content-md5: 4cc23293222e47794b5eba0a186c1047 Text-content-sha1: c201b85ed0cd55a8009b9e314b3b2e26ada9b619 Content-length: 170 SVN��qA�x��ay�HN�X97-01-24 PuTTY 0.59 is released</b> <p> PuTTY 0.59 is out (finally!), and as previously announced we no longer provide Alpha binaries. Revision-number: 7149 Prop-content-length: 131 Content-length: 131 K 7 svn:log V 31 Add 0.59 to the releases list. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-24T21:29:19.043801Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 46ce55d02c8136ebf780fc73366b94cd Text-delta-base-sha1: 964c9f837bf03637c294fe886f4e833fdfdf6542 Text-content-length: 75 Text-content-md5: 96c1f81cc0f03be50aa811b61c3f0290 Text-content-sha1: f4e65779ba805698cc7c3af8519e83e2240c0e4c Content-length: 75 SVN��Jq 3�Y��ee, [ "0.59", "2007-01-25", "r7147" ] # [ "0.60 Revision-number: 7150 Prop-content-length: 168 Content-length: 168 K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-24T21:33:07.687880Z K 7 svn:log V 68 Forgot to mention the font linking limitations on the Changes page. PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 09d47fcc633903afecdca0752c9f09a9 Text-delta-base-sha1: 7dc30f1278b931fff5b4709c65cf34bb70b1e618 Text-content-length: 298 Text-content-md5: 0b174de68529a7f5b34923c74d30c93e Text-content-sha1: 2e4b1a9221f92a7c4ac28a66b71f5215bda7f80c Content-length: 298 SVN��+O �i��WTfont linking (the automatic use of other fonts on the system to provide Unicode characters not present in the selected one) should now work again on Windows, after being broken in 0.58. (However, it unfortunately still won't work for Arabic and other right-to-left text.) Revision-number: 7151 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 Post-release corrections to the checklist. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-24T21:43:11.367812Z PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ecb4dc11a41246e7a53e3b1d93d2bc2 Text-delta-base-sha1: 2960a645a0149514824b424c84d031b6fe191d3d Text-content-length: 46 Text-content-md5: a50cd2623da59a378cb6ac3fe7fc7400 Text-content-sha1: 20f0a4bf97a7b804b4da6ccad49faa2aca44c580 Content-length: 46 SVN��tX�2��Y;�/�?5, .cnt and .chm Revision-number: 7152 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2007-01-24T22:31:49.837966Z K 7 svn:log V 43 Update in the light of the recent release. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4c94d44e64032bbc84f670781175844e Text-delta-base-sha1: 353ab2b5834d8105c489726cd1244fc4e99800d2 Text-content-length: 194 Text-content-md5: 1679ea8385cedacb735dbf41cf7631ad Text-content-sha1: 8d21c4c90d27f9af308ea603edbb440be4f2d5de Content-length: 194 SVN�� x%�2�%�cq�>Iwe recommend upgrading to PuTTY 0.59 or later, which do not suffer from this problem. <p> If you really <em>must</em> use 0.58, you can still fix the problem with a Revision-number: 7153 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2007-01-25T00:14:01.584558Z K 7 svn:log V 68 We may as well update the website icon to match the other new ones. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/icons/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae089a40dfbb49fc747a1a827d9abb67 Text-delta-base-sha1: a1f36fadce63fe636723dd74ac6852ab41cad111 Text-content-length: 127 Text-content-md5: a4090bf5d1bfe6bf8dfc5b6716d34e39 Text-content-sha1: 291b0321af1401cf5ea35557e46576aa342100d6 Content-length: 127 SVN��6# i�@�i�z<# Icon for the website. (This isn't linked into "make all".) website.ico: putty-16.png ./icon.pl -4 $^ > Node-path: putty-website/putty.ico Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b249f1cfd526b9c1e72b311cc11cc57b Text-delta-base-sha1: fcde31e4d64473e9f2fa48250d6029d8984bea42 Text-content-length: 245 Text-content-md5: 23017c137c03160aa343a3f2e9d5ac16 Text-content-sha1: f71bf7ee68e5a0fea1d8cab55385b492a754fa44 Content-length: 245 SVN��>>b�\+7�������(�����(������ ��������������������xw����ǀ����KH����D��������� x����KLx����Ĵx����Dx����x������������?�������?��?������������������������ Revision-number: 7154 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2007-01-25T10:20:27.161776Z K 7 svn:log V 60 Paul-Andre Panon points out that PuTTY SC does have source. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f47390718c09377d32a52204591a1537 Text-delta-base-sha1: 55ac271e8560f2f22a7ca754db591fd8f9981d3f Text-content-length: 24 Text-content-md5: 51d35c4a3599d8894a04ef8ae6a075f9 Text-content-sha1: f35e745db8637697a3093137076e5fbb8fbd8ac2 Content-length: 24 SVN��i�a�. </ul> Revision-number: 7155 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2007-01-25T18:11:06.508068Z K 7 svn:log V 126 net2com has changed its URL, although really, now 0.59 is out with native serial support, it hardly seems important any more. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/serial-backend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e0702b70a22c1b48d88adc61ea43db73 Text-delta-base-sha1: 392af378a329bd8f208d7cf76c06528d4a5ab4d2 Text-content-length: 54 Text-content-md5: e5b2d8512bd5acb19064baa522a4a7b0 Text-content-sha1: 63da1a8d6175db3b80a4ffc5f33358d360771e67 Content-length: 54 SVN��{ !�*��0csourceforge.net/projects/net2com/ Revision-number: 7156 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2007-01-25T19:21:54.218687Z K 7 svn:log V 58 Create a branch on which to develop a GTK2 port of PuTTY. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2 Node-kind: dir Node-action: add Node-copyfrom-rev: 7155 Node-copyfrom-path: putty Revision-number: 7157 Prop-content-length: 281 Content-length: 281 K 7 svn:log V 180 Commit Colin Watson's original GTK2 patch, exactly as mailed to me on 1st January except that I've had to fiddle with it a bit to take account of r7117 having happened since then. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-25T19:33:29.565493Z PROPS-END Node-path: putty-gtk2/unix/gtkcols.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c27be5b591a08f7f24ab5dbcbd6a901 Text-delta-base-sha1: 9636f5dd1724852f15de4b518049e828b90f3ca8 Text-content-length: 1001 Text-content-md5: 410d1d158286d535087539fab2024775 Text-content-sha1: 215df8d9dbcb6e49a28dd35bdfd04dd958432181 Content-length: 1001 SVN��'tcx�b��:a��-!n�2 �,0|�13�4c�$�59�imv�3� k�[�� #include <gtk/gtk.h>#if !GTK_CHECK_VERSION(2,0,0)#endif#if !GTK_CHECK_VERSION(2,0,0) static gint columns_focus(GtkContainer *container, GtkDirectionType dir); #endif#if !GTK_CHECK_VERSION(2,0,0) static gint (*columns_inherited_focus)(GtkContainer *container, GtkDirectionType direction); #endif#if !GTK_CHECK_VERSION(2,0,0) widget_class->draw = columns_draw; widget_class->expose_event = columns_expose; #endif#if !GTK_CHECK_VERSION(2,0,0)#endif#if !GTK_CHECK_VERSION(2,0,0)#endif#if GTK_CHECK_VERSION(2,0,0) gtk_container_set_focus_chain(container, cols->taborder); #endif break; } } #if GTK_CHECK_VERSION(2,0,0) gtk_container_set_focus_chain(GTK_CONTAINER(cols), cols->taborder); #endif#if GTK_CHECK_VERSION(2,0,0) gtk_container_set_focus_chain(GTK_CONTAINER(cols), cols->taborder); #endif break; } } #if !GTK_CHECK_VERSION(2,0,0)#endif Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 938b4312789308564fdbd8382cd10a75 Text-delta-base-sha1: e1194f84cc839b91d4fcd9213c4dd3b1b647f20d Text-content-length: 4909 Text-content-md5: 2d1f4e8c47b276f50409f7adf74eb146 Text-content-sha1: c3bd4fcd21713d739d6bbc0374074288e562d08c Content-length: 4909 SVN��91.p�z�W�'I�]Ki�`&}�AT�7.�B3~�Qt�DD�j3� Z�~�* �6�N9�9/�:}�c|�P9�(��%k� >M�]c�~�/�*`�rI.�h�9U�_sX�h�zd�S�P:�K�]%D�N/�J{�}�Sx�\]List is deprecated and we should switch to GtkTreeView instead * (done for GtkTree); union control *currfocus, *lastfocus; #if !GTK_CHECK_VERSION(2,0,0) GtkWidget *currtreeitem, **treeitems; int ntreeitems; #endif#if GTK_CHECK_VERSION(2,0,0) enum { TREESTORE_PATH, TREESTORE_PARAMS, TREESTORE_NUM }; #endifwindow = dp->cancelbutton = NULL; #if !GTK_CHECK_VERSION(2,0,0) dp->treeitems = NULL; dp->currtreeitem = NULL; #endif#if !GTK_CHECK_VERSION(2,0,0) sfree(dp->treeitems); #endif#if GTK_CHECK_VERSION(2,0,0) gtk_widget_grab_focus(uc->list); #else gtk_container_focus(GTK_CONTAINER(uc->list), GTK_DIR_TAB_FORWARD); #endif#if GTK_CHECK_VERSION(2,0,0) gtk_color_selection_set_has_opacity_control(GTK_COLOR_SELECTION(ccs->colorsel), FALSE); #else#endifonst char *name = gtk_file_selection_get_filename onst#if !GTK_CHECK_VERSION(2,0,0) gchar *spacings[] = { "c", "m", NULL }; #endif const gchar *fontname = gtk_entry_get_text(GTK_ENTRY(uc->entry)); /* TODO: In GTK 2, this only seems to offer client-side fonts. */#if !GTK_CHECK_VERSION(2,0,0)#endif gdk_font_ref(font); #if GTK_CHECK_VERSION(2,0,0) edge = GTK_WIDGET(uc->list)->style->ythickness; #else edge = GTK_WIDGET(uc->list)->style->klass->ythickness; #endif; #if !GTK_CHECK_VERSION(2,0,0) GtkWidget *treeitem; #endif struct Shortcuts shortcuts; }; #if GTK_CHECK_VERSION(2,0,0) static void treeselection_changed(GtkTreeSelection *treeselection, gpointer data) { struct selparam *sps = (struct selparam *)data, *sp; GtkTreeModel *treemodel; GtkTreeIter treeiter; gint spindex; gint page_num; if (!gtk_tree_selection_get_selected(treeselection, &treemodel, &treeiter)) return; gtk_tree_model_get(treemodel, &treeiter, TREESTORE_PARAMS, &spindex, -1); sp = &sps[spindex]} #else#endif static void window_destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } #if !GTK_CHECK_VERSION(2,0,0)#endif int win#if GTK_CHECK_VERSION(2,0,0) gtk_widget_grab_focus(sc->widget); #else tree_grab_focus(dp); #endif#if GTK_CHECK_VERSION(2,0,0) gtk_widget_grab_focus(sc->uc->list); #else#endif } break; } break; } } return FALSE; } #if !GTK_CHECK_VERSION(2,0,0)#endifobject_sink(GTK_OBJECT(listitem)#if GTK_CHECK_VERSION(2,0,0) GtkTreeStore *treestore; GtkCellRenderer *treerenderer; GtkTreeViewColumn *treecolumn; GtkTreeSelection *treeselection; GtkTreeIter treeiterlevels[8]; #else GtkTreeItem *treeitemlevels[8]; GtkTree *treelevels[8]; #endif#if GTK_CHECK_VERSION(2,0,0) treestore = gtk_tree_store_new (TREESTORE_NUM, G_TYPE_STRING, G_TYPE_INT); tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(treestore)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE); treerenderer = gtk_cell_renderer_text_new(); treecolumn = gtk_tree_view_column_new_with_attributes ("Label", treerenderer, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), treecolumn); treeselection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); gtk_tree_selection_set_mode(treeselection, GTK_SELECTION_BROWSE); gtk_container_add(GTK_CONTAINER(treescroll), tree); #else tree = gtk_tree_new(#endif#if GTK_CHECK_VERSION(2,0,0) GtkTreeIter treeiter; #else GtkWidget *treeitem; #endif assert(j-1 < level); #if GTK_CHECK_VERSION(2,0,0) if (j > 0) /* treeiterlevels[j-1] will always be valid because we * don't allow implicit path components; see above. */ gtk_tree_store_append(treestore, &treeiter, &treeiterlevels[j-1]); else gtk_tree_store_append(treestore, &treeiter, NULL); gtk_tree_store_set(treestore, &treeiter, TREESTORE_PATH, c, TREESTORE_PARAMS, nselparams, -1); treeiterlevels[j] = treeiter; #else treeitem = gtk_tree_item_new_with_label(cif (first) gtk_tree_select_child(GTK_TREE(tree), treeitem); selparams[nselparams].treeitem = treeitem; #endif level = j+1; nselparams++;#if GTK_CHECK_VERSION(2,0,0) gtk_tree_view_expand_all(GTK_TREE_VIEW(tree)); g_signal_connect(G_OBJECT(treeselection), "changed", G_CALLBACK(treeselection_changed), selparams); #else#endif dp.data = cfg; dlg_refresh(NULL, &dp); dp.shortcuts = &selparams[0].shortcuts; #if !GTK_CHECK_VERSION(2,0,0) dp.currtreeitem = dp.treeitems[0]; #endif#if !GTK_CHECK_VERSION(2,0,0) gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(treescroll), tree); #endifobject_sink(GTK_OBJECT(label) Node-path: putty-gtk2/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da52e44957f8c3ddc73e8bc83fc4c1bb Text-delta-base-sha1: 7b1d9ec29a4c767acdd3d25d86105e5f67f6f932 Text-content-length: 1403 Text-content-md5: 524e184bf6fd44bae6f5bf244d1c51e2 Text-content-sha1: 6066753aece9e0e09249add38979d66eef28eeb7 Content-length: 1403 SVN����NJ���qG�k�zF�vdb�U�R�cQ�12�]a�Fvzoomed _gtk_container_dequeue_resize_handler(GTK_CONTAINER(inst->window)); gtk_container_dequeue_resize_handler(GTK_CONTAINER(inst->window)); { cursor_font = gdk_font_load("cursor"); if (cursor_font) gdk_font_ref(cursor_font); }gdk_font_ref(inst->fonts[0]);gdk_font_ref(inst->fonts[1]);gdk_font_ref(inst->fonts[2]);gdk_font_ref(inst->fonts[3]);f (!inst->font_width) { /* Maybe this is a 16-bit font? If so, GDK 2 actually expects a * pointer to an XChar2b. This is pretty revolting. Can Pango do * this more neatly even for server-side fonts? */ XChar2b space; space.byte1 = 0; space.byte2 = ' '; inst->font_width = gdk_text_width(inst->fonts[0], (const gchar *)&space, 2); }�RDD�R�>window), GTK_WIN_POS_NONE); gtk_widget_set_uposition(GTK_WIDGET(inst->window), x, y); } gtk_signal_connect(GTK_OBJECT(inst->window), "destroy", GTK_SIGNAL_FUNC(destroy), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "delete_event", GTK_SIGNAL_FUNC(delete_window), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "key_press_event", GTK_SIGNAL_FUNC(key_event), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "key_release_event", GTK_SIGNAL_FUNC(key_event), inst); gtk_signal_connect(GTK_OBJECT(inst->wind Revision-number: 7158 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2007-01-25T19:36:11.582812Z K 7 svn:log V 126 Add Colin to the licence. (I must remember to add him to the licence on the website, when we merge this back into the trunk.) K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f1fbc9578354b488efd1c7e276855c6a Text-delta-base-sha1: a069392e138032b7ebb156bad71035146916821f Text-content-length: 32 Text-content-md5: 528e816de4b89bcd86a7379c9e201067 Text-content-sha1: 8de499eef42ec880e636d7c36289d8d94db5245a Content-length: 32 SVN�� �w�� tColin Watso Node-path: putty-gtk2/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69cf461deda899f6ef43c2bad9b2360f Text-delta-base-sha1: 226c039abd18be2bab19aa9a55a2c29d257d5ebb Text-content-length: 42 Text-content-md5: c93ad2e81fbd3129e8e5a6c2efcb3420 Text-content-sha1: 6c3580c0daac04b34e562677e810f11d8d169ec9 Content-length: 42 SVN��R` �?�� F Kuhn, Colin Watson, Node-path: putty-gtk2/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eb035ee3ac46f6e5673b8085af08866d Text-delta-base-sha1: 85295411504f5f7aab64e230f3677418be4eeb58 Text-content-length: 36 Text-content-md5: 397300c3c89a5eca16adf916bf35aebf Text-content-sha1: 4fd3d72cb9bbf6aff35dfa98e6a2d51ec6314c48 Content-length: 36 SVN��Q_ �r��boColin Watso Node-path: putty-gtk2/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c643709f47ef54cad73b910cb1cb704f Text-delta-base-sha1: 5db16b1df9961d4d91ae49a258d71b8f975e8b30 Text-content-length: 32 Text-content-md5: faf566c69a7b127eb215fc38a033adb9 Text-content-sha1: df3803ca654a0bc35dbca724bf01c078874a9199 Content-length: 32 SVN��z ���bColin Watso Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2d1f4e8c47b276f50409f7adf74eb146 Text-delta-base-sha1: c3bd4fcd21713d739d6bbc0374074288e562d08c Text-content-length: 36 Text-content-md5: 92c4bf79d15b94fd2f11b3299ebe9ef3 Text-content-sha1: d7e20b1bd6962a85baecfa4b34351cfaa0b2600d Content-length: 36 SVN��1? �$��!Colin Watso Node-path: putty-gtk2/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eed999c3618a3e06fe2fc32f10d00864 Text-delta-base-sha1: 92be40d5c6e712a15b3c4a6c232e0a912fe868ae Text-content-length: 32 Text-content-md5: 46bb969e47b1f313551616cf7f7c3020 Text-content-sha1: 6ae552f11814f181f6e7d785360037016bfcdab7 Content-length: 32 SVN��} �]��#ZColin Watso Node-path: putty-gtk2/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06893a82f8936510f3d7e3b9664cc139 Text-delta-base-sha1: fcfaec65fbbe114d6dc544b667765167bb96b2f9 Text-content-length: 32 Text-content-md5: c2feabf7e7a51dc9ed38710155ecf7cc Text-content-sha1: a9b5297e1557bd7590d72e579d24e4fadf66b979 Content-length: 32 SVN��5C ���$Colin Watso Node-path: putty-gtk2/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d7506f4d7bd721e0027b5c91e7faf1a Text-delta-base-sha1: a76ade4bfdcb2b659155944a4fae41bfcb25f8d1 Text-content-length: 32 Text-content-md5: c57b54051ea5f025dd90553efc9a6cc4 Text-content-sha1: 919636c1cd31dd4a807788b0ecbd4bf7573ff7d6 Content-length: 32 SVN��ft ���WColin Watso Revision-number: 7159 Prop-content-length: 233 Content-length: 233 K 7 svn:log V 132 Tweak the GTK Makefile to build with GTK2 by default, while leaving a means (`make GTK_CONFIG=gtk-config') of falling back to GTK1. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-25T19:44:12.412689Z PROPS-END Node-path: putty-gtk2/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a6a8bb2326c004c5b6e6d6737f1ef626 Text-delta-base-sha1: 666f217358f6c93ccbf317ef676d47051ca8fa8c Text-content-length: 552 Text-content-md5: fdf40207bbf97ebd45235dd6e1b4aec4 Text-content-sha1: 6fe6c93db6451f6a802287cd8d46c643140ebffe Content-length: 552 SVN��;u�r�(�h\��;# You can manually set this to `gtk-config' or `pkg-config gtk+-1.2'\n". "# (depending on what works on your system) if you want to enforce\n". "# building with GTK 1.2, or you can set it to `pkg-config gtk+-2.0'\n". "# if you want to enforce 2.0. The default is to try 2.0 and fall back\n". "# to 1.2 if it isn't found.\n". "GTK_CONFIG = sh -c 'pkg-config gtk+-2.0 \$\$0 2>/dev/null || gtk-config \$\$0'\$(GTK_CONFIG) --cflags`"). " -D _FILE_OFFSET_BITS=64\n". "XLDFLAGS = `\$(GTK_CONFIG) Revision-number: 7160 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2007-01-25T19:45:50.257502Z K 7 svn:log V 78 Fix the incorrect layout of the buttons at the bottom of the main config box. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 92c4bf79d15b94fd2f11b3299ebe9ef3 Text-delta-base-sha1: d7e20b1bd6962a85baecfa4b34351cfaa0b2600d Text-content-length: 3046 Text-content-md5: f92be6b599cd40e44ba599d557a2d098 Text-content-sha1: b1f73082287f8ca18914821a68da2407173ebf1b Content-length: 3046 SVN��?4+-�3�4�L<o�R/�j]�$�(void set_dialog_action_area(GtkDialog *dlg, GtkWidget *w) { #if !GTK_CHECK_VERSION(2,0,0) /* * In GTK 1, laying out the buttons at the bottom of the * configuration box is nice and easy, because a GtkDialog's * action_area is a GtkHBox which stretches to cover the full * width of the dialog. So we just put our Columns widget * straight into that hbox, and it ends up just where we want * it. */, TRUE, TRUE, 0); #else /* * In GTK 2, the action area is now a GtkHButtonBox and its * layout behaviour seems to be different: it doesn't stretch * to cover the full width of the window, but instead finds its * own preferred width and right-aligns that within the window. * This isn't what we want, because we have both left-aligned * and right-aligned buttons coming out of the above call to * layout_ctrls(), and right-aligning the whole thing will * result in the former being centred and looking weird. * * So instead we abandon the dialog's action area completely: * we gtk_widget_hide() it in the below code, and we also call * gtk_dialog_set_has_separator() to remove the separator above * it. We then insert our own action area into the end of the * dialog's main vbox, and add our own separator above that. * * (Ideally, if we were a native GTK app, we would use the * GtkHButtonBox's _own_ innate ability to support one set of * buttons being right-aligned and one left-aligned. But to do * that here, we would have to either (a) pick apart our cross- * platform layout structures and treat them specially for this * particular set of controls, which would be painful, or else * (b) develop a special and simpler cross-platform * representation for these particular controls, and introduce * special-case code into all the _other_ platforms to handle * it. Neither appeals. Therefore, I regretfully discard the * GTKHButtonBox and go it alone.) */ GtkWidget *align; align = gtk_alignment_new(0, 0, 1, 1); gtk_container_add(GTK_CONTAINER(align), w); /* * The purpose of this GtkAlignment is to provide padding * around the buttons. The padding we use is twice the padding * used in our GtkColumns, because we nest two GtkColumns most * of the time (one separating the tree view from the main * controls, and another for the main controls themselves). */ gtk_alignment_set_padding(GTK_ALIGNMENT(align), 8, 8, 8, 8); gtk_widget_show(align); gtk_box_pack_end(GTK_BOX(dlg->vbox), align, FALSE, TRUE, 0); w = gtk_hseparator_new(); gtk_box_pack_end(GTK_BOX(dlg->vbox), w, FALSE, TRUE, 0); gtk_widget_show(w); gtk_widget_hide(dlg->action_area); gtk_dialog_set_has_separator(dlg, FALSE); #endif set_dialog_action_area(GTK_DIALOG(window), wset_dialog_action_area(GTK_DIALOG(window), wset_dialog_action_area(GTK_DIALOG(window), w Revision-number: 7161 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 2007-01-25T19:47:36.734006Z K 7 svn:log V 161 A nasty GTK signal cascade was causing any edit box whose contents was modified on session load to be blanked. More details in the comment in dlg_editbox_set(). K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f92be6b599cd40e44ba599d557a2d098 Text-delta-base-sha1: b1f73082287f8ca18914821a68da2407173ebf1b Text-content-length: 2174 Text-content-md5: 17301bd2e23fce07c05784087aa3475b Text-content-sha1: b7581649829332223be8d918d9857851cd6c8efe Content-length: 2174 SVN��4`�v��k�3u�*tB�,T�E�}9�n ]�PE�H��ZR�}R�gMentrysig;gboolean listitem_single_key(GtkWidget *item, GdkEventKey *event, gpointer data); static gboolean listitem_multi_key(GtkWidget *item, GdkEventKey *event, gpointer data); static gboolean listitem_button(GtkWidget *item, GdkEventButton *event, /* * GTK 2 implements gtk_entry_set_text by means of two separate * operations: first delete the previous text leaving the empty * string, then insert the new text. This causes two calls to * the "changed" signal. * * The first call to "changed", if allowed to proceed normally, * will cause an EVENT_VALCHANGE event on the edit box, causing * a call to dlg_editbox_get() which will read the empty string * out of the GtkEntry - and promptly write it straight into * the Config structure, which is precisely where our `text' * pointer is probably pointing, so the second editing * operation will insert that instead of the string we * originally asked for. * * Hence, we must block our "changed" signal handler for the * duration of this call to gtk_entry_set_text. */ g_signal_handler_block(uc->entry, uc->entrysig); gtk_entry_set_text(GTK_ENTRY(uc->entry), text); g_signal_handler_unblock(uc->entry, uc->entrysiggboolean editbox_key(GtkWidget *widget, GdkEventKey *event, booleangboolean editbox_lostfocus(GtkWidget *ed, GdkEventFocus *event, ed)); uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_REFRESH); return FALSE; } static gboolean listitem_key(GtkWidget *item, GdkEventKey *event, gpointer data,gboolean listitem_single_key(GtkWidget *item, GdkEventKey *event, gpointer data) { return listitem_key(item, event, data, FALSE); } static gboolean listitem_multi_key(GtkWidget *item, GdkEventKey *event, gboolean listitem_button(GtkWidget *item, GdkEventButton *event, uc->entrysig = gtk_signal_connect(GTK_OBJECT(uc->entry), "changed", uc->entrysig = gtk_signal_connect(GTK_OBJECT(uc->entry), "changed", Revision-number: 7162 Prop-content-length: 144 Content-length: 144 K 7 svn:log V 44 Begin tracking a TODO list for this branch. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-25T19:56:05.729835Z PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2177 Text-content-md5: a4471c3c109959cadd1751fd1e9b12a0 Text-content-sha1: a0eace92f5c2c2d8ecb1831df40f42b3f1cef3d8 Content-length: 2187 PROPS-END SVN���sssTODO for PuTTY GTK2 port before merging back into main trunk code ----------------------------------------------------------------- Items from Colin's original mail: - Font handling is the biggie. Current problems with it: * The GTK2 font selection dialog only mentions client-side fonts, but the actual text display code can't cope with them. + Clearly one or the other needs to be fixed: the font selection dialog certainly needs to agree with the fonts actually available in the program. + I want to keep being able to use my server-side fonts. + People used to GTK2 applications will probably want to use their client-side fonts. * Also, the GTK2 font selection dialog doesn't allow filtering to monospaced fonts only (and gnome-terminal, for example, just has to cope if the user selects a proportional font). + We can live with this problem if we really have to, but it'd be nice not to have to. * Colin's idea is that we should simply cook up a font selection dialog entirely of our own, which handles both client- _and_ server-side fonts, and correspondingly soup up the text display code to deal with whichever it's given (if necessary by switching between two totally separate pieces of code). This sounds like a sensible plan to me, or at least the most sensible response to a generally insane situation. - The call to _gtk_container_dequeue_resize_handler wants revisiting, and preferably removing in favour of a cleaner way to do the job. - gtkcols.c is currently a minimal-work GTK2 port of my original GTK1 implementation. Someone should go through it and compare it to a real GTK2 container class, to make sure there aren't any large chunks we should have reimplemented and haven't, or indeed that we shouldn't have reimplemented and have. - Uses of GtkList should be replaced with the non-deprecated GtkTreeView. Other items: - The host key security alert dialog box is coming up the right size but totally blank! Find out why and fix it. At point of merge: - Mention Colin in the website's licence page. Revision-number: 7163 Prop-content-length: 141 Content-length: 141 K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-25T19:59:55.943530Z K 7 svn:log V 41 Another TODO item. (There's always one.) PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a4471c3c109959cadd1751fd1e9b12a0 Text-delta-base-sha1: a0eace92f5c2c2d8ecb1831df40f42b3f1cef3d8 Text-content-length: 239 Text-content-md5: 7e3608bbc0c9d91f19654b7c4ecbf96f Text-content-sha1: 666d9a66cd6b21dd2ea52d2264f05bf9babea7ba Content-length: 239 SVN��sN X�/�X�G, - Since Colin's patch was originally prepared I committed r7117 (fold up treeview branches at depth 2 or greater), and this is not currently replicated in the GTK2 version of the treeview code. It should be Revision-number: 7164 Prop-content-length: 627 Content-length: 627 K 8 svn:date V 27 2007-01-26T07:28:55.605661Z K 7 svn:log V 526 Stop calling gdk_input_add() with a zero flags word. If we don't want to know about any input events on a socket, it's simpler not to call gdk_input_add() on it at all. I hesitate to say `fixes', but ... this change _causes to go away_ the weird problem I had with blank host key dialogs. I have no understanding of the chain of cause and effect between gdk_input_add with zero flags and missing redraw events, but it seems like a change I should make anyway, so I'm going to do so and hope the problem doesn't come back :-/ K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e3608bbc0c9d91f19654b7c4ecbf96f Text-delta-base-sha1: 666d9a66cd6b21dd2ea52d2264f05bf9babea7ba Text-content-length: 20 Text-content-md5: 48587bb05a3fbbaca08595927a4f7fa6 Text-content-sha1: 41f0a949cdcf4aeff9e1f4cb65d598fc4756fb2d Content-length: 20 SVN��NX ��<��2 Node-path: putty-gtk2/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 524e184bf6fd44bae6f5bf244d1c51e2 Text-delta-base-sha1: 6066753aece9e0e09249add38979d66eef28eeb7 Text-content-length: 230 Text-content-md5: 8736311e046d8d005c28692743e707ab Text-content-sha1: fec38c922bf7f2bc5ca288491ef8cee9db159c70 Content-length: 230 SVN���� �� �Yyif (flags) return gdk_input_add(fd, flags, fd_input_func, NULL); else return -1; } void uxsel_input_remove(int id) { if (id > 0) �D.��ght; gtk_window_set_position(GTK_WINDOW(inst- Revision-number: 7165 Prop-content-length: 203 Content-length: 203 K 7 svn:log V 102 Collapse tree view branches deeper than level 2, bringing the GTK2 tree code into line with the GTK1. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-26T08:01:47.761247Z PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48587bb05a3fbbaca08595927a4f7fa6 Text-delta-base-sha1: 41f0a949cdcf4aeff9e1f4cb65d598fc4756fb2d Text-content-length: 19 Text-content-md5: ae38b2cfee6aea434f154a7ac235e4d3 Text-content-sha1: a032a48c06f9a76f8e517954320611f8503b1d99 Content-length: 19 SVN��Xo��+��D Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 17301bd2e23fce07c05784087aa3475b Text-delta-base-sha1: b7581649829332223be8d918d9857851cd6c8efe Text-content-length: 410 Text-content-md5: b2b5df36e9d34e416156b64304a9964f Text-content-sha1: e2cb34f264ec5d5aaea01e7b1dd158af334c6639 Content-length: 410 SVN��Uw�@�w�a?�=S treeindices[j]++; treeindices[j+1] = -1; if (j > 0) { GtkTreePath *path; path = gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), &treeiterlevels[j-1]); if (j < 2) gtk_tree_view_expand_row(GTK_TREE_VIEW(tree), path, FALSE); else gtk_tree_view_collapse_row(GTK_TREE_VIEW(tree), path); gtk_tree_path_free(path); } Revision-number: 7166 Prop-content-length: 192 Content-length: 192 K 8 svn:date V 27 2007-01-26T08:03:07.302381Z K 7 svn:log V 92 Er, whoops. Remove two lines from a previous attempt at r7165, which broke the build. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b2b5df36e9d34e416156b64304a9964f Text-delta-base-sha1: e2cb34f264ec5d5aaea01e7b1dd158af334c6639 Text-content-length: 25 Text-content-md5: d8c03e7f2b5377b202b8700e9eaf94e1 Text-content-sha1: b55546c6bf842b45a3e140b2ed5598107a8167da Content-length: 25 SVN��U' ��C��dq Revision-number: 7167 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-27T00:31:20.992170Z PROPS-END Revision-number: 7168 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2007-01-26T14:06:08.630402Z K 7 svn:log V 104 Kai Jourdan spotted a rather embarrassing double-free, and Minefield confirms that it's a real problem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5a9d5bf9d6b3ee77187aa7ee08b2cf2f Text-delta-base-sha1: de1b9cb71b9e0f8baa0f8126d99ae33f86789a25 Text-content-length: 62 Text-content-md5: c4a34c5c86a6aacc5199352ea5f148ae Text-content-sha1: 4f8feafb66086a73c7c3bb3305d4503a244c4013 Content-length: 62 SVN���� ���n else �7?�7� wParam Revision-number: 7169 Prop-content-length: 253 Content-length: 253 K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-26T14:11:56.154312Z K 7 svn:log V 152 If I'd tested under Minefield before releasing, r7168 would have been committed before the release. Therefore, stick it on the checklist for next time. PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a50cd2623da59a378cb6ac3fe7fc7400 Text-delta-base-sha1: 20f0a4bf97a7b804b4da6ccad49faa2aca44c580 Text-content-length: 257 Text-content-md5: 930d914cc4845ed8739ddd91ade34395 Text-content-sha1: 28c6f53757d101fb0651d617575e3edad868f541 Content-length: 257 SVN��XC i��i�W - Also, do some testing of the Windows version with Minefield, and of the Unix version with valgrind or efence or both. In particular, any headline features for the release should get a workout with memory checking enabled! Revision-number: 7170 Prop-content-length: 400 Content-length: 400 K 8 svn:date V 27 2007-01-26T19:43:15.163359Z K 7 svn:log V 299 Switch round the order of CFLAGS and XFLAGS, so that the latter comes last on the compiler command line. This makes it easier to override the normal compile options (since conflicting command-line options usually follow a last-wins policy) in order to compile (for example) the Unix version -g -O0. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a6a8bb2326c004c5b6e6d6737f1ef626 Text-delta-base-sha1: 666f217358f6c93ccbf317ef676d47051ca8fa8c Text-content-length: 172 Text-content-md5: 0739ccea9ded9968cdce5ed120d7661c Text-content-sha1: 024cffe603c206922e9330bad950df2ad78c7de9 Content-length: 172 SVN��;;?`���.#�B]�/+�^f�f�tc�{c�sj�RiCFLAGS) \$(XCFLAGS) \$(XCFLAGS) \$(XCFLAGS) \$(XCFLAGS) \$(XCFLAGS) \$(XCFLAGS) \$(XCFLAGS) \$(X Revision-number: 7171 Prop-content-length: 372 Content-length: 372 K 8 svn:date V 27 2007-01-26T20:00:32.887353Z K 7 svn:log V 271 Changed my mind about r7164. Instead of checking for zero flags inside one single uxsel front end, better to do it centrally and avoid passing zero flags on to the front end in the first place. I'm sure other similarly structured front ends could get confused by it too. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8736311e046d8d005c28692743e707ab Text-delta-base-sha1: fec38c922bf7f2bc5ca288491ef8cee9db159c70 Text-content-length: 183 Text-content-md5: 0cf85e2d2b9ade4e57b419978ad6d74c Text-content-sha1: 515dbe55c919e286dec9275c414b57cb3f0f36e0 Content-length: 183 SVN���� ��r�Y'assert(flags); return gdk_input_add(fd, flags, fd_input_func, NULL); } void uxsel_input_remove(int id) { ght; gtk_window_set_positi�D)��) Node-path: putty-gtk2/unix/uxsel.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7ad0fd9ca120d3edfa932546eb11fb2 Text-delta-base-sha1: 5e06b16873d11b69003a5a1a0e03deb30e49ec3e Text-content-length: 218 Text-content-md5: 669098f1e34cd3bc0c880a18b18e42cb Text-content-sha1: 29d74c70de371ab9081b0e943ea43123a576e47c Content-length: 218 SVN��(0 B�]�B�; uxsel_del(fd); if (rwx) { newfd = snew(struct fd); newfd->fd = fd; newfd->rwx = rwx; newfd->callback = callback; newfd->id = uxsel_input_add(fd, rwx); add234(fds, newfd); } Revision-number: 7172 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-28T00:31:16.993734Z PROPS-END Revision-number: 7173 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2007-01-27T17:21:06.298800Z K 7 svn:log V 70 Move the TODO items from the top of gtkdlg.c into the main TODO file. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae38b2cfee6aea434f154a7ac235e4d3 Text-delta-base-sha1: a032a48c06f9a76f8e517954320611f8503b1d99 Text-content-length: 236 Text-content-md5: 3b74b133b2d83112de8f2050714ac7b5 Text-content-sha1: a8d560252d21f56ddde25caf64fc48d73265d849 Content-length: 236 SVN��oP���% 96Things to do before deciding a merge is feasible - Investigate the shortcut mechanism in GTK2's GtkLabel, and see if it's worth switching to it from the current ad-hockery. Things to do at point of actual Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d8c03e7f2b5377b202b8700e9eaf94e1 Text-delta-base-sha1: b55546c6bf842b45a3e140b2ed5598107a8167da Text-content-length: 22 Text-content-md5: 909b6dc24e04446ffc1fcfbad4562b9d Text-content-sha1: 1a14a251d7ea5e5f1b95565489a0d7fec37b58c2 Content-length: 22 SVN��' ��I��MZ Revision-number: 7174 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2007-01-27T17:47:48.254614Z K 7 svn:log V 51 Better not forget to make sure GTK1 doesn't break. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b74b133b2d83112de8f2050714ac7b5 Text-delta-base-sha1: a8d560252d21f56ddde25caf64fc48d73265d849 Text-content-length: 92 Text-content-md5: 779292f0aa2f4835b54192f0ddcc10fe Text-content-sha1: db7e9c35b44746d17dd80df22e95e13e007b2123 Content-length: 92 SVN��k G�I�G�[9once GTK2 development is complete: - Make sure we haven't broken GTK1 Revision-number: 7175 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-28T00:31:17.926674Z PROPS-END Revision-number: 7176 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-29T00:31:17.895306Z PROPS-END Revision-number: 7177 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-29T00:31:18.040681Z PROPS-END Revision-number: 7178 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-01-29T00:31:18.071266Z PROPS-END Revision-number: 7179 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2007-01-29T20:10:51.873003Z K 7 svn:log V 101 In the cases where Setup asks to restart the computer, explain exactly why this is deemed necessary. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0e24be26ad3b36ce173442301510cf3b Text-delta-base-sha1: 6a32c2f0e0354a0a2122efc56868a6d413211137 Text-content-length: 990 Text-content-md5: ba39a768c6b11792c231ea48b10c126a Text-content-sha1: 28a30ef22b407ea017abc2d412df74c1272ea918 Content-length: 990 SVN��L G�]��sY" Last tested with Inno Setup 5.0.8 [Messages] ; Since it's possible for the user to be asked to restart their computer, ; we should override the default messages to explain exactly why, so they ; can make an informed decision. (Especially as 95% of users won't need or ; want to restart; see rant above.) FinishedRestartLabel=One or more [name] programs are still running. Setup will not replace these program files until you restart your computer. Would you like to restart now? ; This message is popped up in a message box on a /SILENT install. FinishedRestartMessage=One or more [name] programs are still running.%nSetup will not replace these program files until you restart your computer.%n%nWould you like to restart now? ; ...and this comes up if you try to uninstall. UninstalledAndNeedsRestart=One or more %1 programs are still running.%nThe program files will not be removed until your computer is restarted.%n%nWould you like to restart now? Revision-number: 7180 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2007-01-29T20:39:22.959928Z K 7 svn:log V 16 putty.matrix.is K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5247fc11ec912afeae1ff3dd310173eb Text-delta-base-sha1: d2e98535eab01fab70fd1bf7357453dec627cff5 Text-content-length: 67 Text-content-md5: db8f75d27d1e522efcf6a5c02e0b036c Text-content-sha1: 6b814ea9e60059024a32c36f59e3dd0452b61d2e Content-length: 67 SVN��j&���F~�gmatrix.is/">putty.matrix.is</a> in Ice Revision-number: 7181 Prop-content-length: 232 Content-length: 232 K 7 svn:log V 131 Sync up the HTML boilerplate of all the web pages (real and imaginary). (Some of them were missing the link to the shortcut icon.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-01-30T20:13:34.503570Z PROPS-END Node-path: putty-website/autogen.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5ebfdddd70cad8d82cea5f88bde7bc0b Text-delta-base-sha1: d18a1b67aca8cfb5a41ab16b174786d9ba53a055 Text-content-length: 61 Text-content-md5: f23850c7503e0a4d54b357dc805b2dce Text-content-sha1: 3cbd5f0c9dbd3123bf254c6e7b535ddbe15af0da Content-length: 61 SVN��Iu (�4��0link rel="shortcut icon" href="putty.ico Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 96c1f81cc0f03be50aa811b61c3f0290 Text-delta-base-sha1: f4e65779ba805698cc7c3af8519e83e2240c0e4c Text-content-length: 131 Text-content-md5: 78c0b55006f0a2f53d7111ea8d83e8fe Text-content-sha1: 1b3757ed47588ee896656526d6b011511f143451 Content-length: 131 SVN��q[b���pf�k� flink rel="shortcut icon" href="$baseurl/putty.icolink rel="shortcut icon" href="$baseurl/putty.ico Revision-number: 7182 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2007-01-30T20:51:02.402336Z K 7 svn:log V 57 Disconnections from "RomSShell_4.31" on Foundry routers. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-romsshell-badpacket Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1063 Text-content-md5: 4292e4f1d332931f83b0105a3bb5a483 Text-content-sha1: 90c2081b6475b9f5c1be59774d903a62bbd0f7aa Content-length: 1073 PROPS-END SVN���Summary: RomSShell disconnects us with "Bad packet content" Class: semi-bug Difficulty: taxing Priority: medium Present-in: 0.59 Absent-in: 0.58 Content-type: text/x-html-body <p> Connecting to a Foundry router fails: <pre> > 2007-01-29 09:37:53 Server version: SSH-2.0-RomSShell_4.31 [...] > 2007-01-29 09:37:53 Initialised triple-DES CBC client->server encryption > 2007-01-29 09:37:53 Initialised HMAC-SHA1 client->server MAC algorithm > 2007-01-29 09:37:53 Initialised triple-DES CBC server->client encryption > 2007-01-29 09:37:53 Initialised HMAC-SHA1 server->client MAC algorithm > 2007-01-29 09:37:53 Received disconnect message (protocol error) > 2007-01-29 09:37:53 Disconnection message text: Bad packet content </pre> We have yet to see an SSH packet log of this occurring, so it's not clear what the problem is, but our best guess is that RomSShell is having problems with the empty SSH_MSG_IGNORE that we send before each packet in CBC mode. <p> Ref: 000601c743cd$ff7e6a60$9823650a@DRMCKAY Revision-number: 7183 Prop-content-length: 133 Content-length: 133 K 7 svn:log V 35 The infamous crashing bug in 0.59. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-01-30T21:13:11.575423Z PROPS-END Node-path: putty-wishlist/data/win-handle-double-free Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 440 Text-content-md5: 19afd4642a088a29baf71240a36abbb8 Text-content-sha1: 9e01e76d1606ef5d79715fe67c30d9f36ba13cea Content-length: 450 PROPS-END SVN���***Summary: Crashes on Windows with serial backend Class: bug Present-in: 0.59 Absent-in: 0.58 Fixed-in: r7168 2007-01-27 Difficulty: fun Priority: high Content-type: text/x-html-body <p>PuTTY frequently crashes when using the serial port backend. This is caused by a double free in the depths of the Windows handle code, so it should also affect the use of proxy commands on Windows. It's fixed in the development snapshots. Revision-number: 7184 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2007-01-31T10:55:26.851996Z K 7 svn:log V 38 This only affects PuTTY and PuTTYtel. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-handle-double-free Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 19afd4642a088a29baf71240a36abbb8 Text-delta-base-sha1: 9e01e76d1606ef5d79715fe67c30d9f36ba13cea Text-content-length: 267 Text-content-md5: 514ed6504c701bffc78f456625917e1e Text-content-sha1: 389c7e6d23b83de7e2181c621f7f88cb5746a839 Content-length: 267 SVN��*7x�?�x(and PuTTYtel) frequently crash when using the serial port backend. This is caused by a double free in the depths of the Windows handle code, so it should also affect the use of proxy commands on Windows. It's fixed in the development snapshots. Revision-number: 7185 Prop-content-length: 195 Content-length: 195 K 8 svn:date V 27 2007-01-31T11:48:21.936736Z K 7 svn:log V 95 Richard Bell points out that Default Settings can be made launchable, with unpleasant results. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/defaults-launchable Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1468 Text-content-md5: c7b435e22f45801daeec665c6035a52b Text-content-sha1: dedca36859332c96ec7d032bcb5ce21795cbcbcd Content-length: 1478 PROPS-END SVN���...Summary: "Default Settings" can be launchable, leading to confusion Class: bug Difficulty: tricky Priority: high Content-type: text/x-html-body <p> When PuTTY loads a saved session, it will under some circumstances automatically launch it if it's launchable. "Launchable" used to simply mean that it actually specified a host name to connect to, but due to <a href="serial-backend.html">the serial port backend</a> it's now a more complex criterion. <p> The original intention of the PuTTY configuration storage was that "Default Settings" should never describe a session which is launchable, which is why we don't permit a host name to be saved in the default settings. (People occasionally complain about this.) <p> However, due to an oversight, it <em>is</em> now possible to have Default Settings describe a launchable session: simply set "Protocol" to "Serial", and have the "Serial line" box non-blank (as it is by default). This leads to undesirable behaviour. <p> I'm not sure how best to fix this. Restricting what can be stored in Default Settings so that even serial-based defaults are forced not to be launchable seems to me like the wrong answer. Perhaps the right answer is actually to go through the code and ensure that Default Settings in particular is never automatically launched <em>even if launchable</em>. If we do that, then perhaps we could also repeal the restriction on having a default host name saved in Default Settings. Revision-number: 7186 Prop-content-length: 421 Content-length: 421 K 7 svn:log V 320 Colin Watson has fixed the disgusting icons on GTK1. His patch appears to merely fix the background colour (arranging for it to have transparency rather than being on some kind of default grey background), but it turns out to also fix the strange blurry behaviour I see in the GNOME Taskbar, for no very obvious reason. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-01-31T12:30:48.751978Z PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da52e44957f8c3ddc73e8bc83fc4c1bb Text-delta-base-sha1: 7b1d9ec29a4c767acdd3d25d86105e5f67f6f932 Text-content-length: 126 Text-content-md5: c95d28c96d293896ea034f41a4083de4 Text-content-sha1: 03e1f413a532087034157c8dab5fbc0d5b3e98a9 Content-length: 126 SVN����(�7��<5�Yu� R GdkBitmap *iconmask&iconmaskiconmask�Rt"�R�gnal_connect(GTK_OBJECT(inst->wind Revision-number: 7187 Prop-content-length: 106 Content-length: 106 K 8 svn:date V 27 2007-01-31T20:53:14.877318Z K 7 svn:log V 7 Tweaks K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/defaults-launchable Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c7b435e22f45801daeec665c6035a52b Text-delta-base-sha1: dedca36859332c96ec7d032bcb5ce21795cbcbcd Text-content-length: 188 Text-content-md5: ec12d4b4ca1791887bb41ef93972aa95 Text-content-sha1: 4ef16096c36bcdb4aa67df6aaccd04c4006c14d5 Content-length: 188 SVN��.O �q��Yp��eIAbsent-in: 0.58 Present-in: 0.59; in particular, PuTTY launched with no arguments will try to start up a session instead of bringing up the configuration dialog Revision-number: 7188 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-01T00:31:09.080806Z PROPS-END Revision-number: 7189 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-01T00:31:09.119551Z PROPS-END Revision-number: 7190 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-01T00:31:09.129892Z PROPS-END Revision-number: 7191 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-01T00:31:09.141156Z PROPS-END Revision-number: 7192 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-01T00:31:09.163359Z PROPS-END Revision-number: 7193 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-01T00:31:09.173704Z PROPS-END Revision-number: 7194 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2007-02-01T22:40:46.397781Z K 7 svn:log V 16 Add some links. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-romsshell-badpacket Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4292e4f1d332931f83b0105a3bb5a483 Text-delta-base-sha1: 90c2081b6475b9f5c1be59774d903a62bbd0f7aa Text-content-length: 173 Text-content-md5: 122828b6b4216ef1ad6e4feb5c1d87f3 Text-content-sha1: a23f12cce2a49c2f1bcbc0f39e469ce304d8373d Content-length: 173 SVN��s ����]< <a href="http://www.allegrosoft.com/romcli.html">RomSShell</a> is having problems with the <a href="ssh2-cbc-weakness.html">empty SSH_MSG_IGNORE</a> Revision-number: 7195 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2007-02-01T23:08:24.619620Z K 7 svn:log V 18 putty.fagioli.biz K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db8f75d27d1e522efcf6a5c02e0b036c Text-delta-base-sha1: 6b814ea9e60059024a32c36f59e3dd0452b61d2e Text-content-length: 72 Text-content-md5: 666f5ea195dfd30e76fcd87eb2bc3281 Text-content-sha1: 2f140e921cdd8117b731717a2fbaa7297d5834b0 Content-length: 72 SVN��jW,�/��A@�;/fagioli.biz/">putty.fagioli.biz</a> in Italy Revision-number: 7196 Prop-content-length: 228 Content-length: 228 K 7 svn:log V 127 Swap order of `Columns' and `Rows' in the config dialog, to make it consistent with sizetip.c (and more nebulous conventions). K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-02-01T23:24:30.517898Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: caf4ca553ff8de9be8a5f6bea48a3d80 Text-delta-base-sha1: 67358bb27814ff304e32ec9d9fb87c7c9035bec5 Text-content-length: 92 Text-content-md5: e009d0633b3197bcf88395ddb856e2cf Text-content-sha1: 2a227183f9029741e9bef075e2296728e7de751b Content-length: 92 SVN��6�.��V7�#�3]Columns", 'mwidth)), I(-1)); c->generic.column = 0 Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cb0b9623d8ae5f096030719397edae2 Text-delta-base-sha1: d8e05f80ed0c74c85c5c2a7ea4417838465ab20f Text-content-length: 66 Text-content-md5: 8f19f81d3e32091cebc505bc3837da2f Text-content-sha1: 8f8fa6df8d67b75bdc17f4ec2db84c1a4856a505 Content-length: 66 SVN���� �q��w Columns}} and \q{\ii{Row�YY��Y� Revision-number: 7197 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2007-02-03T12:40:38.709459Z K 7 svn:log V 81 Institute a policy on confirmation-email spam filtering. That policy is `Don't'. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/maillist.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e56642684272e21701c35bc39a9768ed Text-delta-base-sha1: bf86778a84cdc11a352f96b4d3b12b593fc87450 Text-content-length: 521 Text-content-md5: ede62c1e6ed822e34bba4fce7c2a55b2 Text-content-sha1: 64120afe452c9916716336fa60c402cbbcaf776d Content-length: 521 SVN�� q�#�q�}Please do not subscribe an address to the PuTTY-announce list if it has a spam filter which requires the sender to confirm incoming messages. The PuTTY team does not have the time to reply to all such confirmation requests. If we receive confirmation messages in response to a release announcement, <em>we will ignore them</em>, and you won't receive the mail. It is your responsibility to ensure that an address subscribed to PuTTY-announce can receive mail from it without our personal attention Revision-number: 7198 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-04T00:31:04.523016Z PROPS-END Revision-number: 7199 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-04T00:31:04.542167Z PROPS-END Revision-number: 7200 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-04T00:31:04.570658Z PROPS-END Revision-number: 7201 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-04T00:31:04.580725Z PROPS-END Revision-number: 7202 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-04T00:31:04.607079Z PROPS-END Revision-number: 7203 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:11.540190Z PROPS-END Revision-number: 7204 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:11.640482Z PROPS-END Revision-number: 7205 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 Build script for PuTTY using bob. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-02-04T11:17:45.065156Z PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2280 Text-content-md5: 68498c56b20ae527a30542a85f57a513 Text-content-sha1: e5fad6e7e61cb63161a9dcfc8ce1b06330d32200 Content-length: 2290 PROPS-END SVN���ZZZ# -*- sh -*- # Build script to construct a full distribution directory of PuTTY. # Set up the arguments for the main make command. set Makeargs ifneq "$(RELEASE)" "" set Makeargs VER="-DRELEASE=$(RELEASE)" ifneq "$(SNAPSHOT)" "" set Makeargs VER="-DSNAPSHOT=$(SNAPSHOT)" ifneq "$(XFLAGS)" "" set Makeargs $(makeargs) XFLAGS="$(XFLAGS)" ifneq "$(MAKEARGS)" "" set Makeargs $(makeargs) $(MAKEARGS) # Set up the version string for the docs build. set Docmakeargs ifneq "$(RELEASE)" "" set Docmakeargs VERSION="PuTTY release $(RELEASE)" ifneq "$(SNAPSHOT)" "" set Docmakeaargs VERSION="PuTTY development snapshot $(SNAPSHOT)" # Set up the version string for the installer. set Iversion ifneq "$(RELEASE)" "" set Iversion $(RELEASE) ifneq "$(SNAPSHOT)" "" set Iversion $(SNAPSHOT) # FIXME: what about the static version numbers in putty.iss? in putty do ./mksrcarc.sh in putty do ./mkunxarc.sh $(RELEASE) in putty do perl mkfiles.pl in putty/doc do make $(Docmakeargs) putty.hlp in putty/doc do make $(Docmakeargs) chm delegate windows # FIXME: Cygwin alternative? in putty/windows do cmd /c 'vcvars32 & nmake -f Makefile.vc $(Makeargs)' # Ignore exit code from hhc, in favour of seeing whether the .chm # file was created. (Yuck; but hhc appears to return non-zero # exit codes on whim.) in putty/doc do hhc putty.hhp; test -f putty.chm in putty/windows do iscc putty.iss return putty/windows/*.exe return putty/doc/putty.chm return putty/windows/Output/setup.exe enddelegate in putty/doc do make mostlyclean in putty/doc do make $(Docmakeargs) in putty/windows do zip -k -j putty.zip `ls *.exe | grep -v puttytel` ../doc/putty.chm ../doc/putty.hlp ../doc/putty.cnt in putty/doc do zip puttydoc.zip *.html deliver putty/windows/*.exe x86/$@ deliver putty/windows/putty.zip x86/$@ deliver putty/windows/Output/setup.exe x86/putty-$(Iversion)-installer.exe deliver putty/doc/puttydoc.zip $@ deliver putty/doc/putty.chm $@ deliver putty/doc/putty.hlp $@ deliver putty/doc/putty.cnt $@ deliver putty/doc/puttydoc.txt $@ deliver putty/doc/*.html htmldoc/$@ deliver putty/putty-src.zip $@ deliver putty/*.tar.gz $@ # Building the md5sums file is most easily done in the destination # directory. in-dest . do md5sum `\find * -type f -print` > md5sums Node-path: putty/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cc699c6b3738590c2679612b669254a5 Text-delta-base-sha1: 8bd95485452d09486cec8abaa0f4c73c9d09d088 Text-content-length: 125 Text-content-md5: 5a5861f2c372c198172ae73daf751a26 Text-content-sha1: 0771178e1677fce7a84dec7ba6097cf5b8e21591 Content-length: 125 SVN��! g�}�g�:g# During formal builds it's useful to be able to build this one alone. putty.hlp: $(INPUTS) $(HALIBUT) Revision-number: 7206 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:11.953559Z PROPS-END Revision-number: 7207 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2007-02-04T12:02:52.555305Z K 7 svn:log V 74 State explicitly that development docs may describe development features. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/docs.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 719e2b097660d3dbdb1a30e11e6de045 Text-delta-base-sha1: f15a471f4e6b0621b73a98726e47a6668b90dac0 Text-content-length: 86 Text-content-md5: 16ffbd051fb3f92ed11f37b1b273cded Text-content-sha1: 2b3b07f30f95a2f2c83d8dc736368ab8a8d2ad6f Content-length: 86 SVN��U @�h�@�mh (which may describe features not present in the latest release) Revision-number: 7208 Prop-content-length: 403 Content-length: 403 K 7 svn:log V 302 Document \\.\COM10 faff on Windows. References: <http://msdn2.microsoft.com/en-us/library/aa363858.aspx> (CreateFile() docs) describes the use of \\.\ <http://msdn2.microsoft.com/en-us/library/aa365247.aspx> ("Naming a File") lists the reserved filenames (COM1-COM9, LPT1-LPT9, CON, PRN, AUX, NUL) K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-02-04T12:12:52.106664Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8f19f81d3e32091cebc505bc3837da2f Text-delta-base-sha1: 8f8fa6df8d67b75bdc17f4ec2db84c1a4856a505 Text-content-length: 266 Text-content-md5: 8bb77f03ff78612ff26f64c9ad3e0761 Text-content-sha1: 0eb78e36bd981ba7bb2e66b8802227e0610086bf Content-length: 266 SVN���������Ys^�T�^�Ai\cw{COM1}, and if there is a second it is called \cw{COM2}, and so on. A serial line with a name other than \cw{COM1} to \cw{COM9} can be specified by prefixing its name with \cw{\\\\.\\} - for instance, \cw{\\\\.\\COM10} Revision-number: 7209 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:12.293082Z PROPS-END Revision-number: 7210 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:12.303669Z PROPS-END Revision-number: 7211 Prop-content-length: 801 Content-length: 801 K 8 svn:date V 27 2007-02-04T12:30:39.423257Z K 7 svn:log V 700 Version management updates for the new bob build script. There's now a fourth class of PuTTY version tags in addition to release, snapshot and unidentified: we now have `Custom build r1234', indicating a build made from that SVN revision in a context other than that of a dated snapshot. The build script generates these when it doesn't know what else to do; `unidentified builds' will now only occur when you run nmake from the command line. Also, the build script now generates sensible version data in the installer to match this. So I _think_ we should now be set to use bob to generate installer builds of the nightly snapshots, although of course I'll have to wait until tomorrow to test one. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 68498c56b20ae527a30542a85f57a513 Text-delta-base-sha1: e5fad6e7e61cb63161a9dcfc8ce1b06330d32200 Text-content-length: 1722 Text-content-md5: 49e7273657d4f45c4ee8c1b8b661ee56 Text-content-sha1: ae37d56a146cbb8806c447686319a080c1953aca Content-length: 1722 SVN��Zv��)�@ #�3GF�ay VER="-DSVN_REV=$(revision)" ifneq "$(RELEASE)" "" set Makeargs $(Makeargs) VER="-DRELEASE=$(RELEASE)" ifneq "$(date)" "" set Makeargs $(Makeargs) VER="-DSNAPSHOT=$(date VERSION="PuTTY revision $(revision)" ifneq "$(RELEASE)" "" set Docmakeargs VERSION="PuTTY release $(RELEASE)" ifneq "$(date)" "" set Docmakeaargs VERSION="PuTTY development snapshot $(date)" # Set up the various version strings for the installer. set Iversion r$(revision) set Iname PuTTY revision $(revision) set Ivertext Revision $(revision) set Irev $(revision) ifneq "$(RELEASE)" "" set Iversion $(RELEASE) ifneq "$(RELEASE)" "" set Iname PuTTY version $(RELEASE) ifneq "$(RELEASE)" "" set Ivertext Release $(RELEASE) ifneq "$(RELEASE)" "" set Irev ifneq "$(date)" "" set Iversion $(date):r$(revision) ifneq "$(date)" "" set Iname PuTTY development snapshot $(date):r$(revision) ifneq "$(date)" "" set Ivertext Development snapshot $(date):r$(revision) # Set up the version string for the installer. set Iversion r$(revision) ifneq "$(RELEASE)" "" set Iversion $(RELEASE) ifneq "$(date)" "" set Iversion $(date):r$(revision) # Munge the installer script locally so that it reports the version # we're really building. in putty/windows do perl -i~ -pe 'BEGIN{$$a=shift@ARGV;}s/^(AppVerName=).*$$/$$1$$a/' '$(Iname)' putty.iss in putty/windows do perl -i~ -pe 'BEGIN{$$a=shift@ARGV;}s/^(VersionInfoTextVersion=).*$$/$$1$$a/' '$(Ivertext)' putty.iss in putty/windows do perl -i~ -pe 'BEGIN{$$a=shift@ARGV;}s/^(AppVersion=).*$$/$$1$$a/' '$(Iversion)' putty.iss in putty/windows do perl -i~ -pe 'BEGIN{$$a=shift@ARGV;$$a=~s/M//;}s/^(VersionInfoVersion=\d+\.\d+\.)\d+(\.\d+)\r?$$/$$1$$a$$2/' '$(Irev)' putty.iss Node-path: putty/version.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1416c7c6543e825d008e61e7bcab1525 Text-delta-base-sha1: 1a3e5102e020d97ef6f44bc49a66b6c30b988219 Text-content-length: 130 Text-content-md5: fa1ba53ce29b03d0dd69edfe4bf0e839 Text-content-sha1: 954986bef1b25427f63636c18d8c4b0493ea9885 Content-length: 130 SVN��re l�L�l�-Eif defined SVN_REV char ver[] = "Custom build r" STR(SVN_REV); char sshver[] = "PuTTY-Custom-r" STR(SVN_REV Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0fef52ecc4ed7e18a52f5e786f4e4860 Text-delta-base-sha1: 1a7bc84d5eadf59e095021f5946d3a6c71ecb985 Text-content-length: 136 Text-content-md5: b16dff2fc1875f4ef18973ef2e078e3f Text-content-sha1: d13654f50d97af89a09ce2c16207fe574f498dca Content-length: 136 SVN��zs r�=�r�D6if defined SVN_REV #define VERSION_TEXT "Custom build r" STR(SVN_REV) #define BINARY_VERSION BASE_VERSION,SVN_REV Revision-number: 7212 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 40 PuTTY builds should save the map files. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-02-04T12:37:20.124347Z PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49e7273657d4f45c4ee8c1b8b661ee56 Text-delta-base-sha1: ae37d56a146cbb8806c447686319a080c1953aca Text-content-length: 51 Text-content-md5: cfdc6a3aedad0755a2a2d2472ffb72a4 Text-content-sha1: e510d05b49806db2e5055221699736267400ff8b Content-length: 51 SVN��v;�2��r"�wwindows/*.map*.map maps- Revision-number: 7213 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:12.926323Z PROPS-END Revision-number: 7214 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:12.947618Z PROPS-END Revision-number: 7215 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:12.958244Z PROPS-END Revision-number: 7216 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:12.969614Z PROPS-END Revision-number: 7217 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:12.979770Z PROPS-END Revision-number: 7218 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:13.008796Z PROPS-END Revision-number: 7219 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T00:31:13.020927Z PROPS-END Revision-number: 7220 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2007-02-05T08:02:01.772076Z K 7 svn:log V 80 Fix errors in $(Makeargs) which only occur when building development snapshots. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cfdc6a3aedad0755a2a2d2472ffb72a4 Text-delta-base-sha1: e510d05b49806db2e5055221699736267400ff8b Text-content-length: 254 Text-content-md5: d9687a69ffa429b6b15b7d6ff9b360dc Text-content-sha1: a2b208f0d8fc77312a92dd7dd41282e142a13b6c Content-length: 254 SVN��;A`� �4�*9�+ver -DSVN_REV=$(revision) ifneq "$(RELEASE)" "" set Makever $(Makever) -DRELEASE=$(RELEASE) ifneq "$(date)" "" set Makever $(Makever) -DSNAPSHOT=$(date) set Makeargs VER="$(Makevervcvars32 \& nmake -f Makefile.vc $(Makeargs) Revision-number: 7221 Prop-content-length: 278 Content-length: 278 K 7 svn:log V 177 Be slightly more forgiving about the nature of SVN_REV; bob will be reliable at defining it, and it's useful to be able to pass `1234M'- type revisions in for testing purposes. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-02-05T08:02:53.616157Z PROPS-END Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b16dff2fc1875f4ef18973ef2e078e3f Text-delta-base-sha1: d13654f50d97af89a09ce2c16207fe574f498dca Text-content-length: 33 Text-content-md5: 519262d20d53a760ccdc7a8d2c22112a Text-content-sha1: dfe8fa699d062a48f8f6ee390de474f4de9d7e77 Content-length: 33 SVN��sZ �m��andef SVN_REV Revision-number: 7222 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T14:40:25.578832Z PROPS-END Revision-number: 7223 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T14:40:25.590131Z PROPS-END Revision-number: 7224 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T14:40:25.601638Z PROPS-END Revision-number: 7225 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-05T14:40:25.612169Z PROPS-END Revision-number: 7226 Prop-content-length: 432 Content-length: 432 K 8 svn:date V 27 2007-02-05T12:49:24.316463Z K 7 svn:log V 331 Fixes for snapshot building using bob. All of releases, snapshots and custom svn builds should now have appropriately named Unix source archives and installer binaries, plus .htaccess files providing redirects to them from totally standard filenames. I _think_ this now makes it feasible to switch the nightly builds to using bob. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d9687a69ffa429b6b15b7d6ff9b360dc Text-delta-base-sha1: a2b208f0d8fc77312a92dd7dd41282e142a13b6c Text-content-length: 1280 Text-content-md5: 8957ead53b7e9ed15885c76d6fff7c0a Text-content-sha1: 8aced78e472ed5532f65fdda29418243222974c2 Content-length: 1280 SVN��A 6>�R��P�0?�<nE�M*�ev�UbH�:"@module puttyersion string for the Unix source archive. set Unxver r$(revision) ifneq "$(RELEASE)" "" set Unxver $(RELEASE) ifneq "$(date)" "" set Unxver $(date)set Ifilename putty-$(Iversion)-installer.exe 0 ifneq "$(RELEASE)" "" set Ifilename putty-$(RELEASE)-installer.exeifneq "$(date)" "" set Ifilename putty-$(date)-installer.exeUnxverputty.zip x86/$@ deliver putty/windows/Output/setup.exe x86/$(Ifilename) # Now deliver the map files _after_ we do that, so we don't md5sum # them gratuitously. deliver putty/windows/*.map maps-x86/$@ # And construct .htaccess files. One in the top-level directory, # setting the MIME types for Windows help files and providing an # appropriate link to the source archive: in-dest . do echo "AddType application/octet-stream .chm" > .htaccess in-dest . do echo "AddType application/octet-stream .hlp" >> .htaccess in-dest . do echo "AddType application/octet-stream .cnt" >> .htaccess in-dest . do set -- putty*.tar.gz; echo RedirectMatch temp '(.*/)'putty.tar.gz '$$1'"$$1" >> .htaccess # And one in the x86 directory, providing a link for the installer. in-dest x86 do set -- putty*installer.exe; echo RedirectMatch temp '(.*/)'putty-installer.exe '$$1'"$$1" > .htaccess Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b5b81cc68fffac9cc0dd452f5e0b9a2 Text-delta-base-sha1: 18588ba51942aab799cb99b7bdbff4648106c57c Text-content-length: 173 Text-content-md5: f86fc61c64a9c462a502fdc311961540 Text-content-sha1: 60b1653e5b7b854e498ff165b4f92748572b9072 Content-length: 173 SVN��2�a�f�?a�; of the form `r1234' to have it tagged as a # custom build. Otherwise it'll be tagged as unidentifiedr*) arcsuffix="-$1" ver="-DSVN_REV Revision-number: 7227 Prop-content-length: 337 Content-length: 337 K 8 svn:date V 27 2007-02-05T13:53:48.452877Z K 7 svn:log V 236 Script to generate signatures on the various PuTTY build outputs. Saves me having to remember all the fiddly gpg arguments every time. Should be usable for both releases (with manual passphrase input) and snapshots (run automatically). K 10 svn:author V 5 simon PROPS-END Node-path: putty/sign.sh Node-kind: file Node-action: add Prop-content-length: 36 Text-delta: true Text-content-length: 736 Text-content-md5: 6df67e30e5f20ffd41cb7de2a516b37e Text-content-sha1: 6b6b016fc25456682ffc6fffaa1314a869fe5947 Content-length: 772 K 14 svn:executable V 1 * PROPS-END SVN���RRR#!/bin/sh # Generate GPG signatures on a PuTTY release/snapshot directory as # delivered by Buildscr. # Usage: sign.sh <builddir> <keytype> # e.g. sign.sh build.out Snapshots # or sign.sh 0.60 Releases set -e sign() { # Check for the prior existence of the signature, so we can # re-run this script if it encounters an error part way # through. echo "----- Signing $2 with '$keyname'" test -f "$3" || \ gpg --load-extension=idea "$1" -u "$keyname" -o "$3" "$2" } cd "$1" for t in DSA RSA; do keyname="$2 ($t)" echo "===== Signing with '$keyname'" for i in putty*src.zip putty*.tar.gz x86/*.exe x86/*.zip; do sign --detach-sign "$i" "$i.$t" done sign --clearsign md5sums md5sums.$t done Revision-number: 7228 Prop-content-length: 292 Content-length: 292 K 8 svn:date V 27 2007-02-05T14:23:34.118468Z K 7 svn:log V 191 HTTP redirects for the variably-named signatures as well as their base files. (The signatures aren't actually _generated_ by bob, of course, but the redirects are harmless in their absence.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8957ead53b7e9ed15885c76d6fff7c0a Text-delta-base-sha1: 8aced78e472ed5532f65fdda29418243222974c2 Text-content-length: 354 Text-content-md5: 96757f559edef4ce54abfbadfe52debb Text-content-sha1: 0ccec2795a2d91439ed8ab4e110a15d9eb6b6be5 Content-length: 354 SVN�� W J�P��=OJfor k in '' .DSA .RSA; do echo RedirectMatch temp '(.*/)'putty.tar.gz$$k '$$1'"$$1$$k" >> .htaccess; done # And one in the x86 directory, providing a link for the installer. in-dest x86 do set -- putty*installer.exe; for k in '' .DSA .RSA; do echo RedirectMatch temp '(.*/)'putty-installer.exe$$k '$$1'"$$1$$k" >> .htaccess; done Revision-number: 7229 Prop-content-length: 210 Content-length: 210 K 7 svn:log V 109 Fiddle further with .htaccess: add some $s on the ends of the regexps to stop them matching the wrong files. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-02-05T15:01:28.063039Z PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 96757f559edef4ce54abfbadfe52debb Text-delta-base-sha1: 0ccec2795a2d91439ed8ab4e110a15d9eb6b6be5 Text-content-length: 31 Text-content-md5: 0850ceebed787aefd043c0f2e8cca197 Text-content-sha1: 464fded4121cade1517551da74b9bcd049223f53 Content-length: 31 SVN��W]�U��`U"5\$$\$$ Revision-number: 7230 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-06T08:06:05.776970Z PROPS-END Revision-number: 7231 Prop-content-length: 452 Content-length: 452 K 7 svn:log V 351 Avoid passing modified SVN revision numbers (of the form 1234M) to parts of the versioning code which might not like them. As a result of this checkin, bob builds from modified SVN working copies will still announce themselves as revision nnnnM in the textual version strings, but their binary version in the Windows VERSIONINFO will now be 0.0.0.0. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-02-05T18:07:11.865628Z PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0850ceebed787aefd043c0f2e8cca197 Text-delta-base-sha1: 464fded4121cade1517551da74b9bcd049223f53 Text-content-length: 83 Text-content-md5: 3b9a359ef2fa936cc5709ac29d42991c Text-content-sha1: d733cd642d1de552ee0f72f473edf9a8651d020a Content-length: 83 SVN��]% >�=��*3!numeric $(revision))" "yes" set Makever $(Makever) -DMODIFIED Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 519262d20d53a760ccdc7a8d2c22112a Text-delta-base-sha1: dfe8fa699d062a48f8f6ee390de474f4de9d7e77 Text-content-length: 238 Text-content-md5: e9b1d4a3d9c5871ba6e61bd7faf9aecb Text-content-sha1: 35ad86c470e26d90318c2d3c406ed7a34be6a90d Content-length: 238 SVN��ZRP��h�:2h�Bifdef MODIFIED #define BINARY_VERSION 0,0,0,0 #else #define BINARY_VERSION BASE_VERSION,SVN_REV,0 #endififdef MODIFIED #define BINARY_VERSION 0,0,0,0 #else #define BINARY_VERSION BASE_VERSION,SVN_REV,0 #endif Revision-number: 7232 Prop-content-length: 248 Content-length: 248 K 7 svn:log V 147 When calling TIOCSCTTY, it helps to pass it an fd that's still open, instead of one we closed two lines earlier. I apparently broke this in r7107. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-02-05T20:04:33.555416Z PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b3d11958b93e14e6e8ce643d68455bd2 Text-delta-base-sha1: 446b9eafd2a4baa1edc9a9f6b40ad73456abdf8d Text-content-length: 26 Text-content-md5: a6764647709241c1a9e5e11dc561306d Text-content-sha1: ea95096f6a0065b2b2ea9c612a508aeb208e7989 Content-length: 26 SVN��zt �6��==0 Revision-number: 7233 Prop-content-length: 129 Content-length: 129 K 10 svn:author V 5 simon K 8 svn:date V 27 2007-02-05T20:14:17.464778Z K 7 svn:log V 29 Ahem; other half of r7232... PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a6764647709241c1a9e5e11dc561306d Text-delta-base-sha1: ea95096f6a0065b2b2ea9c612a508aeb208e7989 Text-content-length: 26 Text-content-md5: 9dbc286f969dd3d6264fcd55391d8a0b Text-content-sha1: 50d2f097340dcef19369cad2e25dd17a92e001d5 Content-length: 26 SVN��tn �l��s0 Revision-number: 7234 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2007-02-05T22:42:43.125170Z K 7 svn:log V 29 We've seen a packet log now. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-romsshell-badpacket Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 122828b6b4216ef1ad6e4feb5c1d87f3 Text-delta-base-sha1: a23f12cce2a49c2f1bcbc0f39e469ce304d8373d Text-content-length: 1166 Text-content-md5: ff93eeee414cc65307cf6588a43cf34b Text-content-sha1: 8f85c57b4282363065e8d9b31d6d49d66361c3c1 Content-length: 1166 SVN��sGo�Y��)^��Vkjricky <p> More detail from an SSH packet log of a different session (same RomSShell version string; "Foundry BigIron16 running 2.3.0aT145"): <pre> Outgoing packet type 21 / 0x15 (SSH2_MSG_NEWKEYS) Event Log: Initialised triple-DES CBC client->server encryption Event Log: Initialised HMAC-SHA1 client->server MAC algorithm Incoming packet type 21 / 0x15 (SSH2_MSG_NEWKEYS) Event Log: Initialised triple-DES CBC server->client encryption Event Log: Initialised HMAC-SHA1 server->client MAC algorithm Outgoing packet type 2 / 0x02 (SSH2_MSG_IGNORE) Outgoing packet type 5 / 0x05 (SSH2_MSG_SERVICE_REQUEST) 00000000 00 00 00 0c 73 73 68 2d 75 73 65 72 61 75 74 68 ....ssh-userauth Incoming packet type 1 / 0x01 (SSH2_MSG_DISCONNECT) 00000000 00 00 00 02 00 00 00 12 42 61 64 20 70 61 63 6b ........Bad pack 00000010 65 74 20 63 6f 6e 74 65 6e 74 00 00 00 00 et content.... </pre> <p> O (since it's complaining after seeing the first of these). We haven't tried making diagnostic builds to verify this yet. <p> Refs: 000601c743cd$ff7e6a60$9823650a@DRMCKAY, 2AB5541EB33172459EE430FFB66B1EE901C0F465@BN-EXCH01.nuance.com Revision-number: 7235 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-06T09:31:14.077787Z PROPS-END Revision-number: 7236 Prop-content-length: 366 Content-length: 366 K 8 svn:date V 27 2007-02-06T13:57:27.918356Z K 7 svn:log V 267 When emitting SSH_MSG_IGNORE to protect against known-IV attacks on CBC, remember to put an empty string in it rather than sending a completely empty packet. This should help with those servers (notably RomSShell) that actually check the contents of SSH_MSG_IGNORE. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4640f23cb729a2af8d5c74b161addf7a Text-delta-base-sha1: a1b1842c952404fbc14bd599feacb79ce835daff Text-content-length: 146 Text-content-md5: 7b5d0e6cb6ec66bdfe6a14d236746578 Text-content-sha1: 0c52c0150ba0d2da86c29ae259e39e975143ecd8 Content-length: 146 SVN���� �[��Naddstring_start(ipkt���!�_�f (pktin) { bombout(("Une� +!� �ss_input(s->cur_prompt, NULL, 0); Revision-number: 7237 Prop-content-length: 113 Content-length: 113 K 10 svn:author V 3 ben K 8 svn:date V 27 2007-02-06T14:09:07.745432Z K 7 svn:log V 15 Fixed, I hope. PROPS-END Node-path: putty-wishlist/data/ssh2-romsshell-badpacket Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff93eeee414cc65307cf6588a43cf34b Text-delta-base-sha1: 8f85c57b4282363065e8d9b31d6d49d66361c3c1 Text-content-length: 299 Text-content-md5: ff492733306bd13968ad37dd5450adc7 Text-content-sha1: 9d8ffd501b7c322441d469edea17d0cdf504c6d8 Content-length: 299 SVN��G}���w�~�Z�sTFixed-in: r7236 2007-02-07It would appear This is perfectly reasonable, since SSH_MSG_IGNORE packets are meant to contain strings, which need four length bytes at the start. As of r7236, PuTTY sends packets containing empty strings instead, which should help Revision-number: 7238 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2007-02-06T14:34:17.504828Z K 7 svn:log V 24 This'll be a bug, then. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-romsshell-badpacket Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff492733306bd13968ad37dd5450adc7 Text-delta-base-sha1: 9d8ffd501b7c322441d469edea17d0cdf504c6d8 Text-content-length: 18 Text-content-md5: 54335cabe0b67ac252f7eb5cfb043f8c Text-content-sha1: 953ffc2636bb37b8d2d493f009177b7958abe06e Content-length: 18 SVN��}x��C��5H Revision-number: 7239 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-07T00:35:18.104881Z PROPS-END Revision-number: 7240 Prop-content-length: 230 Content-length: 230 K 10 svn:author V 3 ben K 8 svn:date V 27 2007-02-06T22:35:09.541421Z K 7 svn:log V 131 Small tweak: since England and Wales have the same law, it's reasonable to claim the PuTTY is legal across the whole jurisdiction. PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e0e39fac2e28f1edafbc94d46c24330 Text-delta-base-sha1: 652cdd682c29e3b760c3c54f2bd101c3616045be Text-content-length: 35 Text-content-md5: ad768d96ccdbc96129d188103d16867a Text-content-sha1: 350f0b3c1f7db2b13708cbf7a7c8b46c3bd5e6d0 Content-length: 35 SVN�� ���tWales and in Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cc23293222e47794b5eba0a186c1047 Text-delta-base-sha1: c201b85ed0cd55a8009b9e314b3b2e26ada9b619 Text-content-length: 33 Text-content-md5: 007dfec280df08c77819a29ae4bcba9e Text-content-sha1: 78b368cf7f517a891183029a6a25ed71449fe446 Content-length: 33 SVN��AN �8�� 7Wales and in Revision-number: 7241 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2007-02-06T22:39:15.818308Z K 7 svn:log V 126 `installer.ico' doesn't fit into 8.3, so gets truncated to INSTALLE.ICO in the Windows source Zips. Rename to `puttyins.ico'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/icons/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a4090bf5d1bfe6bf8dfc5b6716d34e39 Text-delta-base-sha1: 291b0321af1401cf5ea35557e46576aa342100d6 Text-content-length: 289 Text-content-md5: a31a059bd309c41f5dbdad2c33aaba5c Text-content-sha1: 85a66609b5206d6e7229aae1ae39840e5e148a47 Content-length: 289 SVN��#�b��|k�po�puttyinsputtyinsputtyins.ico: puttyins-16.png puttyins-32.png puttyins-48.png \ puttyins-16-mono.png puttyins-32-mono.png \ puttyins-48-mono.png \ puttyins-16-true.png puttyins-32-true.png \ puttyins Node-path: putty/icons/mkicon.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b84d9cd91f066476c52a2e69c24461f Text-delta-base-sha1: 7edd6d3a4a7412c438786385bda9251466bbfdeb Text-content-length: 33 Text-content-md5: 2c7e27df3925858cde4f811b2e537e33 Text-content-sha1: 4f17518b349e485f2a9adef7dfe39fac9f89a103 Content-length: 33 SVN��^] �;��Dputtyins Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ba39a768c6b11792c231ea48b10c126a Text-delta-base-sha1: 28a30ef22b407ea017abc2d412df74c1272ea918 Text-content-length: 29 Text-content-md5: 9f7e4774f2c0939b99b5368e80373910 Text-content-sha1: 2e85145ce66fcd4ef9bf2c2bc19118578c514b67 Content-length: 29 SVN�� �S��;\puttyins Node-path: putty/windows/puttyins.ico Node-kind: file Node-action: add Node-copyfrom-rev: 7233 Node-copyfrom-path: putty/windows/installer.ico Text-copy-source-md5: af0c3b18a9d93dd45fc0bdab2fce6d11 Text-copy-source-sha1: 6597cec3f3179b3b59e2341738f566596aca626f Node-path: putty/windows/installer.ico Node-action: delete Revision-number: 7242 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-07T00:35:18.691422Z PROPS-END Revision-number: 7243 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-07T00:35:18.701123Z PROPS-END Revision-number: 7244 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-07T00:35:18.736215Z PROPS-END Revision-number: 7245 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-07T00:35:18.749320Z PROPS-END Revision-number: 7246 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-07T00:35:18.759298Z PROPS-END Revision-number: 7247 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-08T00:35:18.899426Z PROPS-END Revision-number: 7248 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-08T00:35:19.055419Z PROPS-END Revision-number: 7249 Prop-content-length: 212 Content-length: 212 K 8 svn:date V 27 2007-02-08T09:24:08.449320Z K 7 svn:log V 111 The big payoff from bob (from my POV at least): the PuTTY release procedure is now a huge amount less painful. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 930d914cc4845ed8739ddd91ade34395 Text-delta-base-sha1: 28c6f53757d101fb0651d617575e3edad868f541 Text-content-length: 714 Text-content-md5: dd0c16eca0cd132134ce5a6e100100f1 Text-content-sha1: 4fad9e0e61995f41acc74754b22db129494dc034 Content-length: 714 SVN��C+�6�:�6q�?Build the release: `bob putty-0.XX RELEASE=0.XX'. This should generate a basically valid release directory as `build.out'. - Do a bit of checking that the release binaries basically work, report their version numbers accurately, and so on. Test the installer and the Unix source tarball. - Move the release link maps out of the build directory and save them somewhere more useful. Currently I keep these on ixion, in src/putty/local/maps-<version>. - Sign the release: type `./sign.sh build.out Releases', and enter the passphrases a lot of times: for i in `find . -name '*.*SA'`; do case $i in *md5sums*) gpg --verify $i;; *) gpg --verify $i ${i%%.?SA} Revision-number: 7250 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-09T00:35:24.330539Z PROPS-END Revision-number: 7251 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-09T00:35:24.340583Z PROPS-END Revision-number: 7252 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-09T00:35:24.350600Z PROPS-END Revision-number: 7253 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-09T00:35:24.361399Z PROPS-END Revision-number: 7254 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-09T00:35:24.373069Z PROPS-END Revision-number: 7255 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-09T00:35:24.384454Z PROPS-END Revision-number: 7256 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-09T00:35:24.395975Z PROPS-END Revision-number: 7257 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-09T00:35:24.406782Z PROPS-END Revision-number: 7258 Prop-content-length: 518 Content-length: 518 K 8 svn:date V 27 2007-02-08T18:53:11.994854Z K 7 svn:log V 417 I've changed my mind about the PuTTY build script. It now delivers the release directory into a _subdirectory_ of the main build.out, and delivers the link maps and sign.sh alongside it. That simplifies both the nightly snapshot cron job (which now doesn't have to carefully move the maps out of the release directory or go looking in strange places for sign.sh) and my release procedure (for much the same reasons). K 10 svn:author V 5 simon PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b9a359ef2fa936cc5709ac29d42991c Text-delta-base-sha1: d733cd642d1de552ee0f72f473edf9a8651d020a Text-content-length: 1133 Text-content-md5: fc573250dc18be0f6f00dd0e5d186934 Text-content-sha1: 4372e4e138098dbaebb494c208267e1d746899a9 Content-length: 1133 SVN��%fB�'�$�]#�6/f�S;�# Deliver the actual PuTTY release directory into a subdir `putty'. deliver putty/windows/*.exe putty/x86/$@ deliver putty/windows/putty.zip putty/x86/$@ deliver putty/windows/Output/setup.exe putty/x86/$(Ifilename) deliver putty/doc/puttydoc.zip putty/$@ deliver putty/doc/putty.chm putty/$@ deliver putty/doc/putty.hlp putty/$@ deliver putty/doc/putty.cnt putty/$@ deliver putty/doc/puttydoc.txt putty/$@ deliver putty/doc/*.html putty/htmldoc/$@ deliver putty/putty-src.zip putty/$@ deliver putty/*.tar.gz putty/$@ # Deliver the map files alongside the `proper' release deliverables. deliver putty/windows/*.map maps-x86/$@ # Deliver sign.sh, so that whoever has just built PuTTY (the # snapshot scripts or me, depending) can conveniently sign it with # whatever key they want. deliver putty/sign.shputty do md5sum `\find * -type f -print` > md5sumsputty do echo "AddType application/octet-stream .chm" >> .htaccess in-dest putty do echo "AddType application/octet-stream .hlp" >> .htaccess in-dest putty do echo "AddType application/octet-stream .cnt" >> .htaccess in-dest puttyputty/ Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd0c16eca0cd132134ce5a6e100100f1 Text-delta-base-sha1: 4fad9e0e61995f41acc74754b22db129494dc034 Text-content-length: 418 Text-content-md5: 2052c8f8fd54cc66535124ef30169c78 Text-content-sha1: 2c724b50c836378e0dc75d75c05fb795fa9fab28 Content-length: 418 SVN��9�&�W�32,�]> `build.out/putty', and provide link maps and sign.sh alongside that in build.outSave the link maps. Currently I keep these on ixion, in src/putty/local/maps-<version>. - Sign the release: in the `build.out' directory, type `./sign.sh putty Releases', and enter the passphrases a lot of times. - Now the whole release directory should be present and correct. Upload it Revision-number: 7259 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-09T00:35:24.594547Z PROPS-END Revision-number: 7260 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2007-02-09T13:08:46.380888Z K 7 svn:log V 13 Workarounds. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/defaults-launchable Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec12d4b4ca1791887bb41ef93972aa95 Text-delta-base-sha1: 4ef16096c36bcdb4aa67df6aaccd04c4006c14d5 Text-content-length: 620 Text-content-md5: 8d46f1c4e0743607793f484b088d5c46 Text-content-sha1: bc1854815cf70ee0dc55abe7d7506da6a0d030e9 Content-length: 620 SVN��O(Y�O�Y <p> In the meantime, if you get into this situation, the following workarounds are available: <ul> <li>If you're happy editing the Registry: <ol> <li>Run <tt>REGEDIT.EXE</tt>. <li>Go to <tt>HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\Default%20Settings</tt> <li>Change the value of the '<tt>Protocol</tt>' key from '<tt>serial</tt>' to '<tt>ssh</tt>'. </ol> </li> <li>If you don't mind <em>losing all your saved sessions</em>, you can use <tt>putty -cleanup</tt>. See <a href="http://the.earth.li/~sgtatham/putty/0.59/htmldoc/Chapter3.html#using-cleanup">the documentation</a>. </li> </ul> Revision-number: 7261 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-11T00:35:21.291587Z PROPS-END Revision-number: 7262 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-11T00:35:21.371278Z PROPS-END Revision-number: 7263 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-11T00:35:21.409363Z PROPS-END Revision-number: 7264 Prop-content-length: 195 Content-length: 195 K 8 svn:date V 27 2007-02-10T16:38:25.483734Z K 7 svn:log V 95 More svn:ignores. I'm constantly amazed that I keep not having put in all the useful ones yet! K 10 svn:author V 5 simon PROPS-END Node-path: putty Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 310 Content-length: 310 K 10 svn:ignore V 277 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp *.tds *.td2 *.map Makefile.bor Makefile.cyg Makefile.vc Makefile.lcc MSVC *.log *.GID local Output pageant plink pscp psftp putty puttytel puttygen *.DSA *.RSA *.cnt *.hlp .bmake build.log build.out PROPS-END Node-path: putty/doc Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 119 Content-length: 119 K 10 svn:ignore V 87 *.html *.txt *.cnt *.hlp *.gid *.GID *.chm *.log *.1 *.info vstr.but *.hhp *.hhc *.hhk PROPS-END Revision-number: 7265 Prop-content-length: 652 Content-length: 652 K 8 svn:date V 27 2007-02-10T17:02:41.179183Z K 7 svn:log V 551 Avoid launching a session from the Default Settings, even if they do represent a launchable session, unless the user can be construed to have really meant it. This means: - starting up PuTTY when the Default Settings are launchable still brings up the config box, and you have to hit Open to actually launch that session - double-clicking on Default Settings from the config box will load them but not launch them. On the other hand: - explicitly loading the Default Settings on the command line using `-load' _does_ still launch them. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e009d0633b3197bcf88395ddb856e2cf Text-delta-base-sha1: 2a227183f9029741e9bef075e2296728e7de751b Text-content-length: 457 Text-content-md5: 8d48c209b9680247fd9fe8caf26fc33b Text-content-sha1: 52e300b04794ce99d0abd528f95a08de95fc8cb2 Content-length: 457 SVN��R'� ��y �Y'�;}�@\�~, int *maybe_launch if (maybe_launch) *maybe_launch = TRUE; } else { savedsession[0] = '\0'; if (maybe_launch) *maybe_launch = FALSEnt mbl = FALSE;, &mbl) && (mbl && nt mbl = FALSE; if (!load_selected_session(ssd, savedsession, dlg, &cfg2, &mbl)) { dlg_beep(dlg); return; } /* If at this point we have a valid session, go! */ if (mbl && cfg_launchable(&cfg2) Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c95d28c96d293896ea034f41a4083de4 Text-delta-base-sha1: 03e1f413a532087034157c8dab5fbc0d5b3e98a9 Text-content-length: 121 Text-content-md5: f6760e8e45eff3a1df2dd7f43bdcfa06 Text-content-sha1: 2867e3879055f5663077dab07189af3aea8d1541 Content-length: 121 SVN���� 8�m��[ (!loaded_session || !cfg_launchable(&inst->cfg)) && �t�t�_event), inst); gtk_si Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c4a34c5c86a6aacc5199352ea5f148ae Text-delta-base-sha1: 4f8feafb66086a73c7c3bb3305d4503a244c4013 Text-content-length: 117 Text-content-md5: ded4f82905eb4c18d7ed01b5e5bcc65a Text-content-sha1: e8851d5c36d31d3e5acfad04690fe86ac2c9032d Content-length: 117 SVN���� 2�{��S(!loaded_session || !cfg_launchable(&cfg)) && �?Y�?�rn -1; } if (left_alt && Revision-number: 7266 Prop-content-length: 359 Content-length: 359 K 8 svn:date V 27 2007-02-10T17:12:06.780257Z K 7 svn:log V 258 Since we're now able to cope with Default Settings describing a launchable session without getting confused by it, we can relax the restriction on storing a host name in DS, which has attracted a steady stream of complaints over the past six or seven years. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8d48c209b9680247fd9fe8caf26fc33b Text-delta-base-sha1: 52e300b04794ce99d0abd528f95a08de95fc8cb2 Text-content-length: 28 Text-content-md5: 25282b642c4b7dd18863210737be68d4 Text-content-sha1: 06e306a063a53af3be3e3a677edae3292cf8c515 Content-length: 28 SVN��RB����j �S Node-path: putty/mac/macdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb42f97ba209ad4692ef9d5682aadf50 Text-delta-base-sha1: 92228594b92af8e1f295ca702a7b53030e701a14 Text-content-length: 30 Text-content-md5: a0ba25dc20d1e6477cb367207d2b7af3 Text-content-sha1: ca821defdefd6ca530642a0c07b484984880f2ac Content-length: 30 SVN��)��Y��Y_�#>�Bg Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60ecdffcd71c9e5f6c24f7388251ac47 Text-delta-base-sha1: cebc170686d7137b51d3f261c8587a837a1a2268 Text-content-length: 182 Text-content-md5: e14a3787a3387ab5c50fa0cb600db24d Text-content-sha1: 0f51a3d307d42887ee8273f83a60a4534d009365 Content-length: 182 SVN��X$�B��HConfig * cfg); void save_open_settings(void *sesskey, Config *cfg); void load_settings(char *section, Config * cfg); void load_open_settings(void *sesskey Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 37a2080534ee2270a164141e03fbaa72 Text-delta-base-sha1: 1dbe6a8f026e895cf0ae2ef75094a8673fcc6cd9 Text-content-length: 426 Text-content-md5: 57aef8aec93a43b7f7045247a36828c7 Text-content-sha1: a6738c5294da6dce0582222f9fd2878b04eeebf3 Content-length: 426 SVN��4+q�Z��)gh�=$�lnM�V=�t$�M7cfg); close_settings_w(sesskey); return NULL; } void save_open_settings(void *sesskey, Config *cfg) { int i; char *p; write_setting_i(sesskey, "Present", 1); write_setting_s(sesskey, "HostName", cfg->host);cfg); close_settings_r(sesskey); } void load_open_settings(void *sesskeygpps(sesskey, "HostName", "", cfg->host, sizeof(cfg->host)); Revision-number: 7267 Prop-content-length: 106 Content-length: 106 K 8 svn:date V 27 2007-02-10T17:14:47.432659Z K 7 svn:log V 7 Fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/defaults-launchable Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8d46f1c4e0743607793f484b088d5c46 Text-delta-base-sha1: bc1854815cf70ee0dc55abe7d7506da6a0d030e9 Text-content-length: 710 Text-content-md5: 7910bd5f394e7a1fd52a6d004314ca24 Text-content-sha1: e3c9d1fcfcb804677c7ec6241b13463054b73a6d Content-length: 710 SVN��(V -���Fixed-in: 2007-02-11 r7265 <p> <b>SGT, 2007-02-10</b>: Should now be fixed, by the method described above: Default Settings may describe a launchable session but is never actually launched unless PuTTY is sure the user really meant it. In particular, merely starting PuTTY doesn't launch the session described by DS, and neither does double-clicking DS from the saved sessions menu. Hitting Open once you've loaded it still works, and using "<code>-load</code>" still works. Also, as mentioned above, I've relaxed the restriction on storing a host name in DS, on the basis that since one type of launchable session is now permitted in DS there's no reason not to permit the other too. Revision-number: 7268 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-11T00:35:23.370380Z PROPS-END Revision-number: 7269 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-12T00:36:14.448800Z PROPS-END Revision-number: 7270 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-12T00:36:14.565221Z PROPS-END Revision-number: 7271 Prop-content-length: 105 Content-length: 105 K 8 svn:date V 27 2007-02-11T18:09:03.546317Z K 7 svn:log V 6 Typo. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fc573250dc18be0f6f00dd0e5d186934 Text-delta-base-sha1: 4372e4e138098dbaebb494c208267e1d746899a9 Text-content-length: 20 Text-content-md5: 971be4f95a3971e41de9dfe88a07ea4f Text-content-sha1: e877d64b09ca4f23d933d597b89650eac368899b Content-length: 20 SVN��fe ��d��e Revision-number: 7272 Prop-content-length: 170 Content-length: 170 K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-02-11T18:13:56.302461Z K 7 svn:log V 70 chm.but contains $Id$ but didn't have a svn:keywords property. Fixed. PROPS-END Node-path: putty/doc/chm.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Revision-number: 7273 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2007-02-11T20:27:05.446250Z K 7 svn:log V 79 Note that htmlhelp.h from HTML Help Workshop works perfectly well with Cygwin. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 258b1c995a90c442f49196af4c8049f0 Text-delta-base-sha1: 0c3818d7c37806644d80015265651bac5c916732 Text-content-length: 100 Text-content-md5: 46a3884ed62da7c9d54a8643befb5a65 Text-content-sha1: 18e9309528b9386ce3ce4160af636ad8971686e1 Content-length: 100 SVN��b N�+�N�i+ (although you can use # the htmlhelp.h supplied with HTML Help Workshop) Revision-number: 7274 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2007-02-11T23:42:37.469839Z K 7 svn:log V 31 Less broken link for SECSH WG. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 959200f85196997e226033ec9f3f4cda Text-delta-base-sha1: 59c5b79fa136f79873f9c67cc8e6a73e0dd7f2d2 Text-content-length: 45 Text-content-md5: fcbc72c2ec01e0b5f4ad40bba6bac2ef Text-content-sha1: edb85bf91d00d9c11eb8374f9b25b7ea1285be48 Content-length: 45 SVN��L7 �g��8tools.ietf.org/wg/secsh/ Revision-number: 7275 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-13T00:35:43.054388Z PROPS-END Revision-number: 7276 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-13T00:35:43.158694Z PROPS-END Revision-number: 7277 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-13T00:35:43.169441Z PROPS-END Revision-number: 7278 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-13T00:35:43.194550Z PROPS-END Revision-number: 7279 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-14T00:35:22.850118Z PROPS-END Revision-number: 7280 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-14T00:35:22.954160Z PROPS-END Revision-number: 7281 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-14T00:35:22.964721Z PROPS-END Revision-number: 7282 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-14T00:35:22.989333Z PROPS-END Revision-number: 7283 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-14T00:35:22.999104Z PROPS-END Revision-number: 7284 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-14T00:35:23.033833Z PROPS-END Revision-number: 7285 Prop-content-length: 459 Content-length: 459 K 7 svn:log V 358 It turns out that HH_INITIALIZE and HH_UNINITIALIZE are optional, and are for putting HTML Help into "single-threaded" mode. Furthermore, this requires extra work from the application (message pumping via HH_PRETRANSLATEMESSAGE). Thus, remove them and run Help in a secondary thread. This means that keyboard input into the Index and Search tabs now works. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-02-13T22:57:19.410634Z PROPS-END Node-path: putty/windows/winhelp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 41eede11c3c9314eb1f0befdd548808e Text-delta-base-sha1: 4ef3825d282de30ed38eb1392a67e00f48fe9f67 Text-content-length: 257 Text-content-md5: e896e00c2343ed38167acbaa5694b2de Text-content-sha1: 2ac05a30fd6523aab9ac608956ddfb94a7d4887c Content-length: 257 SVN�� 2d���$!d�(a!htmlhelp) chm_path = NULL; } #endif /* NO_HTMLHELP */ } void shutdown_help(void) { /* Nothing to do currently. * (If we were running HTML Help single-threaded, this is where we'd * call HH_UNINITIALIZE.) Revision-number: 7286 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-14T00:35:23.492975Z PROPS-END Revision-number: 7287 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-15T00:35:31.523199Z PROPS-END Revision-number: 7288 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2007-02-15T13:44:21.880953Z K 7 svn:log V 38 Various changes for migration to bob. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/autogen.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f23850c7503e0a4d54b357dc805b2dce Text-delta-base-sha1: 3cbd5f0c9dbd3123bf254c6e7b535ddbe15af0da Text-content-length: 60 Text-content-md5: f7ea2c0f7a2d125aca92512a3d84c993 Text-content-sha1: 621a0377d4383b8dc762d33e32720d49cbcba583 Content-length: 60 SVN��u,�X�-snapshots/htmldoc\/#; return $_; } } Node-path: putty-website/docs.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 16ffbd051fb3f92ed11f37b1b273cded Text-delta-base-sha1: 2b3b07f30f95a2f2c83d8dc736368ab8a8d2ad6f Text-content-length: 125 Text-content-md5: 9d946acb0fbc98d183f82c8956c04039 Text-content-sha1: c85fdfca6b781a482c0ef4a021eeb97f76c6fe09 Content-length: 125 SVN��@#O�b��ge�\u�ft�*)�qV�KJ-snapshots-snapshotswww.tartarus.org/~simon/putty-snapshots-snapshots-snapshots Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ad768d96ccdbc96129d188103d16867a Text-delta-base-sha1: 350f0b3c1f7db2b13708cbf7a7c8b46c3bd5e6d0 Text-content-length: 459 Text-content-md5: 9f8885f7b37ce53471e137fd5f12cbb1 Text-content-sha1: 6732f095885cf119cfadba49e2a35390c1cc5674 Content-length: 459 SVN�� Xe���v@�]"�c�t-�ta�G�o_p�L;�b<�{!�k/�U@�6�c�FJ�X;p> (The filename of the development snapshot installer contains the snapshot date, so it will change every night. It is not offered by www.tartarus.org/~simon/putty-snapshots/x86/putty-installer.exe">putty<version>-installer.exe</a></td> <td-installer-installer.exesnapshots/puttysnapshots/putty.tar.gzputty svn://ixion.tartarus.org/main/putty</code>. Revision-number: 7289 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2007-02-15T13:44:39.017390Z K 7 svn:log V 65 Add `KiTTY'. (Also, while I'm here, update the entry for TuTTY.) K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fcbc72c2ec01e0b5f4ad40bba6bac2ef Text-delta-base-sha1: edb85bf91d00d9c11eb8374f9b25b7ea1285be48 Text-content-length: 366 Text-content-md5: 59a1358813d33604e4a36a49dc91722b Text-content-sha1: dba5cf087aa2403f137a4fc5efc9f2b2a8707d47 Content-length: 366 SVN��7P����  backend (this dates from before PuTTY had its own)kitty.9bis.com/"> KiTTY</a>, a (Windows-only) fork with several features including storing your password, minimising to the <a href="wishlist/system-tray.html">system tray</a>, and automatically sending a command (as if typed at the keyboard) after successful session startup Revision-number: 7290 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2007-02-15T23:27:29.253310Z K 7 svn:log V 56 LICENCE in the installer should have CP/M line endings. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 971be4f95a3971e41de9dfe88a07ea4f Text-delta-base-sha1: e877d64b09ca4f23d933d597b89650eac368899b Text-content-length: 142 Text-content-md5: 1dca39040ff9e76e106c39d3b7bd4481 Text-content-sha1: 91ad74ca9e8154d342a5b7d2bd71a0db38bb37f7 Content-length: 142 SVN��e_ x�E�x�"C# Windowsify LICENCE, since it's going in the Windows installer. in putty do perl -i~ -pe 'y/\015//d;s/$$/\015/' LICENCE Revision-number: 7291 Prop-content-length: 292 Content-length: 292 K 8 svn:date V 27 2007-02-16T18:44:07.830798Z K 7 svn:log V 191 r7265 broke the legacy `putty @sessionname' construction, which I wouldn't care about except for the fact that it's still used to implement the Saved Sessions menu item in PuTTY and Pageant. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ded4f82905eb4c18d7ed01b5e5bcc65a Text-delta-base-sha1: e8851d5c36d31d3e5acfad04690fe86ac2c9032d Text-content-length: 183 Text-content-md5: 847e8f38bbb87fcb6a3d4679ee9b6f82 Text-content-sha1: 9d416f0baa2965832f4bd0cfd56e6e3839c9cf79 Content-length: 183 SVN���� E�~�E�=| loaded_session = TRUE; /* allow it to be launched directly */�Y GG�Y�pace) { SendMessage(hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0); retu Revision-number: 7292 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 Unbreak "Duplicate session" on Windows, in a similar way to r7291. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-02-17T17:44:24.285683Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 847e8f38bbb87fcb6a3d4679ee9b6f82 Text-delta-base-sha1: 9d416f0baa2965832f4bd0cfd56e6e3839c9cf79 Text-content-length: 88 Text-content-md5: d1316f135088686d200f00d38b98d170 Text-content-sha1: c19890a39f7d2bd6e3d069abdfb376c1613230a4 Content-length: 88 SVN���� ���W loaded_session = TRUE� 9� � == VK_SPACE && cfg.alt_s Revision-number: 7293 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2007-02-17T22:15:57.373787Z K 7 svn:log V 112 ssh2_set_window checks whether the channel is being closed, so there's no need to check that before calling it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7b5d0e6cb6ec66bdfe6a14d236746578 Text-delta-base-sha1: 0c52c0150ba0d2da86c29ae259e39e975143ecd8 Text-content-length: 56 Text-content-md5: 77692b862c59e1ce370d98865751f4e0 Text-content-sha1: 7fc2407cf2fd95132d1286000d5c2ae52f002ab6 Content-length: 56 SVN����������������+u ��y��|/ Revision-number: 7294 Prop-content-length: 252 Content-length: 252 K 7 svn:log V 153 Use preprocessor trickery to make the signal translation mechanism a little less hideous. The output of the preprocessor should be basically unchanged. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-02-17T22:33:11.019775Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 77692b862c59e1ce370d98865751f4e0 Text-delta-base-sha1: 7fc2407cf2fd95132d1286000d5c2ae52f002ab6 Text-content-length: 1641 Text-content-md5: 67a60a51d072171009af33be79afb187 Text-content-sha1: 32a975c6687878ddb7c4f5024c4d2c55f659de61 Content-length: 1641 SVN����������� �M�9�C=�Z8�vfdefine TRANSLATE_SIGNAL(s) \ else if (siglen == lenof(#s)-1 && !memcmp(sig, #s, siglen)) \ ssh->exitcode = 128 + SIG ## s #ifdef SIGABRT TRANSLATE_SIGNAL(ABRT); #endif #ifdef SIGALRM TRANSLATE_SIGNAL(ALRM); #endif #ifdef SIGFPE TRANSLATE_SIGNAL(FPE); #endif #ifdef SIGHUP TRANSLATE_SIGNAL(HUP); #endif #ifdef SIGILL TRANSLATE_SIGNAL(ILL); #endif #ifdef SIGINT TRANSLATE_SIGNAL(INT); #endif #ifdef SIGKILL TRANSLATE_SIGNAL(KILL); #endif #ifdef SIGPIPE TRANSLATE_SIGNAL(PIPE); #endif #ifdef SIGQUIT TRANSLATE_SIGNAL(QUIT); #endif #ifdef SIGSEGV TRANSLATE_SIGNAL(SEGV); #endif #ifdef SIGTERM TRANSLATE_SIGNAL(TERM); #endif #ifdef SIGUSR1 TRANSLATE_SIGNAL(USR1); #endif #ifdef SIGUSR2 TRANSLATE_SIGNAL(USR2); #endif #undef TRANSLATE_SIGNALVget_userpass_input() failed to get a username. * Terminate. */ free_prompts(s->cur_prompt); ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE); crStopV; } memcpy(s->username, s->cur_prompt->prompts[0]->result, lenof(s->username)); free_prompts(s->cur_prompt); } else { char *stuff; strncpy(s->username, ssh->cfg.username, sizeof(s->username)); s->username[sizeof(s->username)-1] = '\0'; if ((flags & FLAG_VERBOSE) || (flags & FLAG_INTERACTIVE)) { stuff = dupprintf("Using username \"%s\".\r\n", s->username); c_write_str(ssh, stuff); sfree(stuff); } } s->got_username = TRUE; /* * Send an authentication request using method "none": (a) * just in case it succeed�u>��>7 Revision-number: 7295 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2007-02-18T14:02:39.463915Z K 7 svn:log V 78 Ctrl-Break now sends a Break signal (previously it was equivalent to Ctrl-C). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bad5255cf2c9357fe00ea21c3bcf943e Text-delta-base-sha1: 99c02478780b1902943920ed4a8078d44d51e497 Text-content-length: 99 Text-content-md5: 2e46cb20603c1c09fd2c43ff11554f72 Text-content-sha1: 68abccaffa2513152dbb6f854357bcfced15cc48 Content-length: 99 SVN��3 J�f�J�T_\q{break} signal can also be invoked from the keyboard with \i{Ctrl-Break} Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f6760e8e45eff3a1df2dd7f43bdcfa06 Text-delta-base-sha1: 2867e3879055f5663077dab07189af3aea8d1541 Text-content-length: 171 Text-content-md5: 3eccef7a8c61f69644522f6c4f274180 Text-content-sha1: bc83e7b79896ff530283c5f8ff941d56e8a0cf79 Content-length: 171 SVN����p�d��V|L�Vsends a Break special to the backendif (inst->back) inst->back->special(inst->backhandle, TS_BRK); return� ��NAL_FUNC(key Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d1316f135088686d200f00d38b98d170 Text-delta-base-sha1: c19890a39f7d2bd6e3d069abdfb376c1613230a4 Text-content-length: 339 Text-content-md5: 083eb40c1125dcb4b5ac3dd23420d8e2 Text-content-sha1: 1a94f0b7a91f7789522b850d80f45bfcc482a310 Content-length: 339 SVN�������^"�0, zero to drop the message, * -1 to forward the message to Windows, or another negative number * to indicate a NUL-terminated "special" string. */�9 I�2��`Yaram == VK_F4 && cfg.alt_f4) { return -1; } if (left_alt && wParamif (back) back->special(backhandle, TS_BRK); return 0 Node-path: putty-wishlist/data/break-key Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 874 Text-content-md5: c6f5886629ba5015a811ae414f541d13 Text-content-sha1: 6b851768b3b8584411f50a6d51cba1c080202ce4 Content-length: 884 PROPS-END SVN���\\\Subject: Ctrl-Break to send break signal instead of ^C Class: wish Difficulty: fun Priority: medium Fixed-in: r7295 2007-02-19 Content-type: text/x-html-body <p> Most of PuTTY's backends support some sort of "break" signal. Currently, the only way to send this signal is via the "Special Commands" menu. While it is possible to access this from the keyboard with appropriate configuration, it isn't very convenient. Many people would have a use for a more convenient shortcut, especially since the addition of <a href="serial-backend.html">serial line support</a>. <p> The traditional key sequence for sending this signal from a PC keyboard is Ctrl-Break. Currently, this sends ^C in PuTTY. It doesn't seem like a great loss to reassign it to sending a "break" signal. <p> The previous behaviour of the Ctrl-Break key sequence can be accessed using Ctrl-C. Revision-number: 7296 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2007-02-18T15:59:38.490468Z K 7 svn:log V 79 Bring the OS X front end up to date with recent changes to the main code base. K 10 svn:author V 5 simon PROPS-END Node-path: putty/macosx/osxclass.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ecdee3c213bb37ee5e76a286efccc9d Text-delta-base-sha1: d85b0b7d4a881405e7a7a59aa4745a96de476638 Text-content-length: 101 Text-content-md5: 5d2f2d5c715334a4c8e8802641cc6aa2 Text-content-sha1: d5c336b380f08468ec35e8471057b9017d067065 Content-length: 101 SVN��IJ� ��$� )int)fromBackendUntrusted:(const char *)data len:(int)len- (Terminal *)term Node-path: putty/macosx/osxdlg.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f339c345f64a7cebcfd8d22d014485c2 Text-delta-base-sha1: 695a38beba57bcd8b0161e48603734a53c8f9e8d Text-content-length: 36 Text-content-md5: 7b2abdab40a4ff0eec85569eb4af4b98 Text-content-sha1: c25d49a657c4f1cb5fe2b19a4484419f80ebf97f Content-length: 36 SVN��/> �[��T[, aCfg.protocol Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3511add8c99581ec7e463df266046765 Text-delta-base-sha1: 36f9e3d784c71d912ebea7264d3a3d16a8169095 Text-content-length: 252 Text-content-md5: 7996fdf137fe73af65cc61a829c6b109 Text-content-sha1: 1eb9957fd9ed9cdc498d9210ef1030ed21abcc1c Content-length: 252 SVN��\/(F�[�^�:G�P}�n5�'C�omint)fromBackendUntrusted:(const char *)data len:(int)len { return term_data_untrusted(term- (Terminal *)term { return term;from_backend_untrusted(void *frontendUntrusted:data len:lenfrontend Node-path: putty/testback.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7829eef16a7aaafb3a07725e790cdbc0 Text-delta-base-sha1: 5a058390df131d9a0b65def499fd826085e3ff34 Text-content-length: 128 Text-content-md5: 396e08dac22b2fb20f0dd06efd8b623c Text-content-sha1: ba24976651695edb52c4cc8a863e9356c5b7522e Content-length: 128 SVN��!T�>��1P�!��A!�int null_connectedconnectedconnectedint null_connected(void *handle) { return 0 Revision-number: 7297 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 70 Allow dlg_listbox_index() to be called on multi-selection list boxes. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-02-18T19:50:41.691910Z PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 750bd04ff7c89d6b6273983c151428bd Text-delta-base-sha1: 94daac70061fbe523bf66b87be971225a7fcde80 Text-content-length: 252 Text-content-md5: e632554f7e47fb0ef51b72e3d6a12a61 Text-content-sha1: e2e3319d349c4c6a446411c7b3fe199041415e7e Content-length: 252 SVN��g#`��`�?(); if (c->ctrl->listbox.multisel) { assert(c->ctrl->listbox.height != 0); /* not combo box */ ret = SendDlgItemMessage(dp->hwnd, c->base_id+1, LB_GETSELCOUNT, 0, 0); if (ret == LB_ERR || ret > 1) return -1; } Revision-number: 7298 Prop-content-length: 510 Content-length: 510 K 7 svn:log V 409 In controls where a list of entries is manipulated by Add/Remove buttons (SSH tunnels, TTY modes, and environment variables), when the Remove button is pressed, populate the edit controls from the entry that has just been deleted. Several users have requested this, as it makes editing an entry easier (read- modify-write) in the cases where order is unimportant, and also provides a degree of undo-ability. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-02-18T19:56:16.036486Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25282b642c4b7dd18863210737be68d4 Text-delta-base-sha1: 06e306a063a53af3be3e3a677edae3292cf8c515 Text-content-length: 1912 Text-content-md5: 354e26b5e1545dec8b198194ef81c0b6 Text-content-sha1: f613f51cd5ed68b7948c8467bdf54c8f81dfd5d0 Content-length: 1912 SVN��B$46�<�?�eh�RM<�<3�So�g3�=nt multisel = dlg_listbox_index(td->listbox, dlg) < 0; if (dlg_listbox_issel(td->listbox, dlg, i)) { if (!multisel) { /* Populate controls with entry we're about to * delete, for ease of editing. * (If multiple entries were selected, don't * touch the controls.) */ char *val = strchr(p, '\t'); if (val) { int ind = 0; val++; while (ttymodes[ind]) { if (strlen(ttymodes[ind]) == val-p-1 && !strncmp(ttymodes[ind], p, val-p-1)) break; ind++; } dlg_listbox_select(td->modelist, dlg, ind); dlg_radiobutton_set(td->valradio, dlg, (*val == 'V')); dlg_editbox_set(td->valbox, dlg, val+1); } }, *str/* Populate controls with the entry we're about to delete * for ease of editing */ str = p; p = strchr(p, '\t'); if (!p) goto disaster; *p = '\0'; dlg_editbox_set(ed->varbox, dlg, str); p++; str = p; dlg_editbox_set(ed->valbox, dlg, str); p = strchr(p, '\0'); if (!p) goto disaster, *src, *dst; char dir/* Populate the controls with the entry we're about to * delete, for ease of editing. */ { static const char *const afs = "A46"; char *afp = strchr(afs, *p); int idx = afp ? afp-afs : 0; if (afp) p++; #ifndef NO_IPV6 dlg_radiobutton_set(pfd->addressfamily, dlg, idx); #endif } { static const char *const dirs = "LRD"; dir = *p; dlg_radiobutton_set(pfd->direction, dlg, strchr(dirs, dir) - dirs); } p++; if (dir != 'D') { src = p; p = strchr(p, '\t'); if (!p) goto disaster2; *p = '\0'; p++; dst = p; } else { src = p; dst = ""; } p = strchr(p, '\0'); if (!p) goto disaster2; dlg_editbox_set(pfd->sourcebox, dlg, src); dlg_editbox_set(pfd->destbox, dlg, dst) Revision-number: 7299 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2007-02-18T22:05:45.996112Z K 7 svn:log V 101 This reordering of the Unix Makefiles (requested by Michael Shigorin) allows use of -Wl,--as-needed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0739ccea9ded9968cdce5ed120d7661c Text-delta-base-sha1: 024cffe603c206922e9330bad950df2ad78c7de9 Text-content-length: 281 Text-content-md5: b21fc8221ba90ad4e6b2da8c6b25e7c0 Text-content-sha1: 0ad195af0daebf131de2d2ff70824640d667355c Content-length: 281 SVN��;R3X�0�X�Xx�hI@�N8�\?@�N8�:?�Xc\$(LDFLAGS) `gtk-config --libs`\n". "ULDFLAGS = \$(LDFLAGS)\n". "INSTALL=install-o \$@ " . $objstr . " \$(${type}LDFLAGS)-o \$@ " . $objstr . " \$(${type}LDFLAGS) Revision-number: 7300 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-20T00:35:37.584931Z PROPS-END Revision-number: 7301 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2007-02-19T11:42:12.780288Z K 7 svn:log V 19 s/Subject/Summary/ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/break-key Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c6f5886629ba5015a811ae414f541d13 Text-delta-base-sha1: 6b851768b3b8584411f50a6d51cba1c080202ce4 Text-content-length: 23 Text-content-md5: 868ca08e1d572cab61a52192bb603f53 Text-content-sha1: f2ab776da5e8951e7b0ce8c1deb7cd9ea4669d24 Content-length: 23 SVN��\\�USummary Revision-number: 7302 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-20T00:35:37.812184Z PROPS-END Revision-number: 7303 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-22T00:35:32.624855Z PROPS-END Revision-number: 7304 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.470915Z PROPS-END Revision-number: 7305 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.548845Z PROPS-END Revision-number: 7306 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.559480Z PROPS-END Revision-number: 7307 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.592045Z PROPS-END Revision-number: 7308 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.602437Z PROPS-END Revision-number: 7309 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.613711Z PROPS-END Revision-number: 7310 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.624470Z PROPS-END Revision-number: 7311 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.635218Z PROPS-END Revision-number: 7312 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.663762Z PROPS-END Revision-number: 7313 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.681136Z PROPS-END Revision-number: 7314 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-23T00:35:18.691882Z PROPS-END Revision-number: 7315 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-24T00:35:17.063950Z PROPS-END Revision-number: 7316 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2007-02-24T13:36:11.855392Z K 7 svn:log V 118 Gareth pointed out yesterday that the Unix terminal front end treats BELL_DISABLED as BELL_DEFAULT. How embarrassing. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3eccef7a8c61f69644522f6c4f274180 Text-delta-base-sha1: bc83e7b79896ff530283c5f8ff941d56e8a0cf79 Text-content-length: 56 Text-content-md5: e0778799501a4a8972c7898116b9fe12 Text-content-sha1: 01d873383ca2aea84080b2350b001c0d0742077a Content-length: 56 SVN���� �a��o== BELL_DEFAULT���G Revision-number: 7317 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-25T00:36:40.057945Z PROPS-END Revision-number: 7318 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-25T00:36:40.070107Z PROPS-END Revision-number: 7319 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-25T00:36:40.081889Z PROPS-END Revision-number: 7320 Prop-content-length: 194 Content-length: 194 K 7 svn:log V 94 "-noagent" and friends should be marked SAVEABLE, to ensure they're not clobbered by "-load". K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-02-24T22:43:57.443440Z PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a3d8241dd8e98ecee58b49d6907c415 Text-delta-base-sha1: d07c90bd3278ab9f873da83d9e1847d75209614b Text-content-length: 47 Text-content-md5: b60b3fae9189d141f392ac360c23199a Text-content-sha1: f93d7501e6749ae7b16edf5769a140b84f4a26b7 Content-length: 47 SVN��]y�m��-i�KSAVEABLE(0SAVEABLE(0 Revision-number: 7321 Prop-content-length: 355 Content-length: 355 K 8 svn:date V 27 2007-02-25T00:50:24.095754Z K 7 svn:log V 254 Since r7265, a user could not launch a PuTTY session to a specific host by simply specifying a hostname on the command line -- this would bring up the config dialog. Use a slightly more sophisticated notion of whether the user meant to launch a session. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e0778799501a4a8972c7898116b9fe12 Text-delta-base-sha1: 01d873383ca2aea84080b2350b001c0d0742077a Text-content-length: 842 Text-content-md5: 8653642291a0c3222ce5ea33b99b1aea Text-content-sha1: e2b3ca8a9062b0ebd7fd1d22f27f2b12a81edd7e Content-length: 842 SVN����&w�e��.d�I�w@� int *allow_launch, allow_launch/* By default, we bring up the config dialog, rather than launching * a session. This gets set to TRUE if something happens to change * that (e.g., a hostname is specified on the command-line). */ int allow_launch = FALSE; if (do_cmdline(argc, argv, 0, &allow_launch&allow_launch, inst, &inst->cfg)) exit(1); /* post-defaults, do everything */ cmdline_run_saved(&inst->cfg); if (loaded_session) allow_launch = TRUE; if ((!allow_launch�t g�O��� GTK_SIGNAL_FUNC(destroy), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "delete_event", GTK_SIGNAL_FUNC(delete_window), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "key_press_event", GTK_SIkey_release_event", GTK_SI Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b95e2d8dd79f71443e622fc057c41695 Text-delta-base-sha1: c7dfa4537de6045a48dfdbd30a61497f98062bd1 Text-content-length: 40 Text-content-md5: cc419d2bd653a4e5f395d7307dc1a85b Text-content-sha1: ea908104a5001bbfb5c710ce1a68c0dcfecb8600 Content-length: 40 SVN��`s ���X, int *allow_launch Node-path: putty/unix/uxpterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e19d0f56720d54fc0bb08150bd0d8253 Text-delta-base-sha1: 98d21308724bdaa45fd70e80e0aff1a8b532284f Text-content-length: 40 Text-content-md5: 72831b69597d5f7c7df9d7a848ea6262 Text-content-sha1: 9a0d963770053b5ee5f3c606751a42d732fa2be0 Content-length: 40 SVN��\o �3��)3, int *allow_launch Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c22149afced66581dc1edad4212de35 Text-delta-base-sha1: cf6d816c4449842eb22f815354d4ed4ecea1b0fe Text-content-length: 82 Text-content-md5: 9519f9b6759c0a032bd46ea6625b9057 Text-content-sha1: e4f6b001ce1ae73128fcfdcdcbee19bb36afb63b Content-length: 82 SVN��4p7�R��R�Rb, int *allow_launchif (got_host) *allow_launch = TRUE; Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 083eb40c1125dcb4b5ac3dd23420d8e2 Text-delta-base-sha1: 1a94f0b7a91f7789522b850d80f45bfcc482a310 Text-content-length: 779 Text-content-md5: 8d91fdaf91bccb823a1aae9e0723daa9 Text-content-sha1: 77b4a32de08de0e9baec941a35af9c8c150e1b7b Content-length: 779 SVN����!0�d�c� b�zR�wdg�[ /* By default, we bring up the config dialog, rather than launching * a session. This gets set to TRUE if something happens to change * that (e.g., a hostname is specified on the command-line). */ int allow_launch = FALSEallow_launch = TRUE; } else if (!do_config()) { cleanup_exit(0); } allow_launch = TRUE;loaded_session || got_host) allow_launch = TRUE; if ((!allow_launch || !cfg_launchable(&cfg)) &&�/��hwnd, WM_VSCROLL, SB_PAGEDOWN, 0); return 0; } if (wParam == VK_NEXT && shift_state == 2) { SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0); return 0; } if (wParam == VK_INSERT && shift_state == 1) { term_do_paste(term); return 0; } if (left_alt && wP Revision-number: 7322 Prop-content-length: 236 Content-length: 236 K 8 svn:date V 27 2007-02-25T00:51:38.749776Z K 7 svn:log V 135 Delay evaluating the "-pw" option, so we can criticise the user's choice of backend, bailing out if anything other than SSH is in use. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b60b3fae9189d141f392ac360c23199a Text-delta-base-sha1: f93d7501e6749ae7b16edf5769a140b84f4a26b7 Text-content-length: 303 Text-content-md5: 93dd7e271e443be973c654c12c648ec6 Text-content-sha1: f35a3cf7e83893397c85c092cae7afe6e312ad19 Content-length: 303 SVN��y �E��4ESAVEABLE(1); /* We delay evaluating this until after the protocol is decided, * so that we can warn if it's of no use with the selected protocol */ if (cfg->protocol != PROT_SSH) cmdline_error("The -pw option can only be used with the " "SSH protocol"); else Revision-number: 7323 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2007-02-25T02:15:20.974543Z K 7 svn:log V 68 Attempt to scrub -pw's argument in argv[], to make it less obvious. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 93dd7e271e443be973c654c12c648ec6 Text-delta-base-sha1: f35a3cf7e83893397c85c092cae7afe6e312ad19 Text-content-length: 375 Text-content-md5: c4ecc0de4f47d28798ac8438c9f75927 Text-content-sha1: 4b34b8e9772fcf929974a736e4382d08482ef941 Content-length: 375 SVN�� _��_�uthe -pw option can only be used with the " "SSH protocol"); else { cmdline_password = dupstr(value); /* Assuming that `value' is directly from argv, make a good faith * attempt to trample it, to stop it showing up in `ps' output * on Unix-like systems. Not guaranteed, of course. */ memset(value, 0, strlen(value)); } Revision-number: 7324 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.792624Z PROPS-END Revision-number: 7325 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.808279Z PROPS-END Revision-number: 7326 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.842606Z PROPS-END Revision-number: 7327 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.854457Z PROPS-END Revision-number: 7328 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.866813Z PROPS-END Revision-number: 7329 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.877835Z PROPS-END Revision-number: 7330 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.889368Z PROPS-END Revision-number: 7331 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.949242Z PROPS-END Revision-number: 7332 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.968626Z PROPS-END Revision-number: 7333 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.979918Z PROPS-END Revision-number: 7334 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:48.991666Z PROPS-END Revision-number: 7335 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:49.003581Z PROPS-END Revision-number: 7336 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-26T00:35:49.015181Z PROPS-END Revision-number: 7337 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-27T00:36:36.528670Z PROPS-END Revision-number: 7338 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-28T00:35:24.272074Z PROPS-END Revision-number: 7339 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-28T00:35:24.358242Z PROPS-END Revision-number: 7340 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-28T00:35:24.371391Z PROPS-END Revision-number: 7341 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-02-28T00:35:24.383992Z PROPS-END Revision-number: 7342 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2007-02-28T19:40:45.671773Z K 7 svn:log V 151 Subject: Make access to serial ports above COM9 easier on Windows Class: semi-bug (About automatically prepending \\.\ to serial line configuration.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-com10 Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1068 Text-content-md5: 57fef6679bb822286f360e2578adc20f Text-content-sha1: 993918daec76ba1c94b32c995b6ceebe9b17fa99 Content-length: 1078 PROPS-END SVN���Subject: Make access to serial ports above COM9 easier on Windows Class: semi-bug Difficulty: fun Priority: high Present-in: 0.59 Content-type: text/x-html-body <p> In PuTTY 0.59, if you need to use a serial port other than COM1 to COM9 inclusive, you have to add the magic prefix <tt>\\.\</tt> (for instance, <tt>\\.\COM10</tt>) - a fact not included in the 0.59 documentation (although we added it shortly afterwards). The same goes for more exotically named serial ports or similar entities. <p> After a suitable amount of soul-searching, it seems that it would not be unreasonable for PuTTY to automatically prepend <tt>\\.\</tt> to the serial-line string. (This works even for the traditional serial ports like COM1 - tested as far back as Win95.) <p> As a get-out in case someone finds something interesting to talk to that <em>doesn't</em> start with <tt>\\.\</tt>, we'll avoid adding the prefix iff the serial line string contains a backslash. (This will also mean that existing <tt>\\.\COM10</tt> style configurations will continue to work.) Revision-number: 7343 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-01T00:35:23.615431Z PROPS-END Revision-number: 7344 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-01T00:35:23.626693Z PROPS-END Revision-number: 7345 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2007-02-28T21:30:06.639822Z K 7 svn:log V 89 Prepend \\.\ to configured serial line string, to allow easy access to ports above COM9. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8bb77f03ff78612ff26f64c9ad3e0761 Text-delta-base-sha1: 0eb78e36bd981ba7bb2e66b8802227e0610086bf Text-content-length: 40 Text-content-md5: 176a1afaa97ecae509b85e6c2e33d909 Text-content-sha1: 144a0b055287960e59ca53428dccf0231af45787 Content-length: 40 SVN���������s[ ����@3 Node-path: putty/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0179ba9211771513327d6b27e872ecda Text-delta-base-sha1: c2325cc6d64be4e75843de9bc8dc60a29d16ef1c Text-content-length: 1424 Text-content-md5: a592af3e92db9e7d3b8119e96ef57678 Text-content-sha1: 78e0e3f90e4dea9fc72aae9dc1f2caf3b88f5d9b Content-length: 1424 SVN�� x�m�x�2f{ /* * Munge the string supplied by the user into a Windows filename. * * Windows supports opening a few "legacy" devices (including * COM1-9) by specifying their names verbatim as a filename to * open. (Thus, no files can ever have these names. See * <http://msdn2.microsoft.com/en-us/library/aa365247.aspx> * ("Naming a File") for the complete list of reserved names.) * * However, this doesn't let you get at devices COM10 and above. * For that, you need to specify a filename like "\\.\COM10". * This is also necessary for special serial and serial-like * devices such as \\.\WCEUSBSH001. It also works for the "legacy" * names, so you can do \\.\COM1 (verified as far back as Win95). * See <http://msdn2.microsoft.com/en-us/library/aa363858.aspx> * (CreateFile() docs). * * So, we believe that prepending "\\.\" should always be the * Right Thing. However, just in case someone finds something to * talk to that doesn't exist under there, if the serial line * contains a backslash, we use it verbatim. (This also lets * existing configurations using \\.\ continue working.) */ char *serfilename = dupprintf("%s%s", strchr(cfg->serline, '\\') ? "" : "\\\\.\\", cfg->serline); serport = CreateFile(serfilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); sfree(serfilename); } Node-path: putty-wishlist/data/win-com10 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 57fef6679bb822286f360e2578adc20f Text-delta-base-sha1: 993918daec76ba1c94b32c995b6ceebe9b17fa99 Text-content-length: 47 Text-content-md5: c2b6a6ea88d20fd2fd4a9013321ed7f8 Text-content-sha1: db02fe97cbd2e3ad64e910d6c6703792935a47eb Content-length: 47 SVN��9 ���Fixed-in: r7345 2007-03-01 Revision-number: 7346 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-01T00:35:23.992371Z PROPS-END Revision-number: 7347 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-01T00:35:24.003536Z PROPS-END Revision-number: 7348 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2007-02-28T23:31:49.143593Z K 7 svn:log V 89 Process -t/-T later than -m, so that they can override -m's default behaviour of no pty. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c4ecc0de4f47d28798ac8438c9f75927 Text-delta-base-sha1: 4b34b8e9772fcf929974a736e4382d08482ef941 Text-content-length: 60 Text-content-md5: 8be639c1f425347cd40b521e3d12f2c4 Text-content-sha1: 8c272ce511d00a51ff793618d1fd15292ad87f83 Content-length: 60 SVN�� '!����m1); /* lower priority than -m */1 Revision-number: 7349 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-02T00:35:41.358669Z PROPS-END Revision-number: 7350 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-02T00:35:41.437411Z PROPS-END Revision-number: 7351 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-02T00:35:41.448102Z PROPS-END Revision-number: 7352 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-02T00:35:41.459477Z PROPS-END Revision-number: 7353 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2007-03-01T15:12:55.948792Z K 7 svn:log V 28 s/Subject/Summary/, _again_ K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-com10 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c2b6a6ea88d20fd2fd4a9013321ed7f8 Text-delta-base-sha1: db02fe97cbd2e3ad64e910d6c6703792935a47eb Text-content-length: 23 Text-content-md5: f0b2c056df3eeda4dfa4d072301c6dce Text-content-sha1: 523cf5d14344c21903017fe3b96ca98a10160634 Content-length: 23 SVN��99�2Summary Revision-number: 7354 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-02T00:35:41.612218Z PROPS-END Revision-number: 7355 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-03T00:35:44.161587Z PROPS-END Revision-number: 7356 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-04T00:35:36.640776Z PROPS-END Revision-number: 7357 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2007-03-03T12:04:42.664947Z K 7 svn:log V 66 Initial notes on the problems with aes256-ctr and recent OpenSSL. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-aesctr-openssh Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 810 Text-content-md5: 4aa59506a75d468a2d0cdac82dbd0e49 Text-content-sha1: 4d6a0bb104a05440df00c8863ba82400b1ef216e Content-length: 820 PROPS-END SVN���Summary: Garbled packets from OpenSSH when using aes256-ctr Present-in: 0.59 Absent-in: 0.58 Content-type: text/x-html-body <p>There have been a couple of reports of PuTTY reporting "Incoming packet was garbled on decryption", and of OpenSSH's sshd reporting "Bad packet length" when using aes256-ctr. <p>Both reports involved "OpenSSH_4.5p1, OpenSSL 0.9.8e 23 Feb 2007", one on FreeBSD and one on Linux. <p>The following changes seem to make the problem go away: <ul><li>Using PuTTY 0.58 (no SDCTR support) <li>Using OpenSSL 0.9.8d <li>Using OpenSSH 3.5p1 (no SDCTR support) <li>Using Blowfish or 3DES instead of AES </ul> <p>Using OpenSSH 4.4 or 4.0 (both of which support SDCTR) seems not to help. <p> 00dc01c75a6f$1f4c6b00$1878a8c0@atlantisweb.dailyprice.de 45E59510.60303@noreply.suelze.de Revision-number: 7358 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2007-03-03T12:38:17.401410Z K 7 svn:log V 22 I've reproduced this. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-aesctr-openssh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4aa59506a75d468a2d0cdac82dbd0e49 Text-delta-base-sha1: 4d6a0bb104a05440df00c8863ba82400b1ef216e Text-content-length: 53 Text-content-md5: 92c7a0145e530050782c913d435e6ff6 Text-content-sha1: 1f64bc342df3268b151a01c053a95ca14bf418e0 Content-length: 53 SVN��B !�A��`<BJH has reproduced this on Viking Revision-number: 7359 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 52 Command-line tools should have -licence or similar. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-03-03T13:55:18.885271Z PROPS-END Node-path: putty-wishlist/data/cmdline-licence Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 451 Text-content-md5: 3a7fabae7352db00369d9ea78592269b Text-content-sha1: 61d8dd5e9933c4e393dae68d64ee7237678e5de6 Content-length: 461 PROPS-END SVN���555Summary: Command-line tools should have an option to display licence Category: wish Priority: medium Difficulty: fun Content-type: text/plain It would make it easier for people to abide by the terms of our licence if the various command-line tools had options to display the licence in the same way that the GUI tools have licence windows. This would mean that verbatim distributions of our binaries would automatically be conforming. Revision-number: 7360 Prop-content-length: 147 Content-length: 147 K 7 svn:log V 49 More notes -- this seems to be OpenSSH's problem K 10 svn:author V 3 ben K 8 svn:date V 27 2007-03-03T16:02:14.312732Z PROPS-END Node-path: putty-wishlist/data/ssh2-aesctr-openssh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 92c7a0145e530050782c913d435e6ff6 Text-delta-base-sha1: 1f64bc342df3268b151a01c053a95ca14bf418e0 Text-content-length: 538 Text-content-md5: 96b4b562f9238818f3480e8bfc531f24 Text-content-sha1: f4d2e031083f92bad2a850453c661546c5255729 Content-length: 538 SVN��B}�';>�,�[gSummary: Garbled packets from OpenSSH when using OpenSSL 0.9.8e when connecting to versions of OpenSSH built against OpenSSL 0.9.8e. This problem isn't specific to PuTTY -- using a version of OpenSSH built agains OpenSSL 0.9.8d and configuring it to use the same ciphers as PuTTY gives the same result. <p>The best workaround is to configure OpenSSH not to offer the "aes256-ctr", "aes192-ctr", or "arcfour256" ciphers. Failing that, configure PuTTY to prefer either triple-DES or Blowfish to AES and Arcfou Revision-number: 7361 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2007-03-03T16:07:12.771587Z K 7 svn:log V 36 Reference (new) OpenSSH bug record. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-aesctr-openssh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 96b4b562f9238818f3480e8bfc531f24 Text-delta-base-sha1: f4d2e031083f92bad2a850453c661546c5255729 Text-content-length: 128 Text-content-md5: cfb102af23a8c460b399fb4c95601f42 Text-content-sha1: c94edd82379b06932ee8a5abffa9ef240dec5894 Content-length: 128 SVN�� j�\�j�?Uis bug is in OpenSSH's Bugzilla as <a href="http://bugzilla.mindrot.org/show_bug.cgi?id=1291">Bug 1291</a> Revision-number: 7362 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-04T00:35:36.986851Z PROPS-END Revision-number: 7363 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-04T00:35:37.003178Z PROPS-END Revision-number: 7364 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-04T00:35:37.016765Z PROPS-END Revision-number: 7365 Prop-content-length: 166 Content-length: 166 K 7 svn:log V 68 Problem on LP64 Unix systems, reported indirectly by Peter Maydell. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-03-03T18:24:33.834981Z PROPS-END Node-path: putty-wishlist/data/unix-lp64 Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2733 Text-content-md5: d61d96b07d96e78fa06443a40b647efb Text-content-sha1: 08f88aefaa31b282a4653f5fe2c5b73100272f1c Content-length: 2743 PROPS-END SVN���Summary: PuTTY is broken on LP64 Unix systems Category: bug Priority: medium Present-in: 0.58 Difficulty: fun Content-type: text/x-html-body From <a href="http://bugs.debian.org/336390">Debian bug #336390</a>: <pre> Symptoms: I start pterm. It brings up its window, which is cleared to black with the cursor in the top left corner. After this, nothing happens: the expected shell prompt isn't printed. Pressing keys has no visible effect. When I click the mouse on the window or use the window manager to switch away this causes pterm to suddenly update, printing the shell prompt plus any characters corresponding to keys I had pressed earlier (and if say I had pressed 'ls<RET>' I also get the ls output now). ... Actual problem: The gtkwin.c timer code implicitly assumes sizeof(int)==sizeof(long). On alpha, long is 64 bit, so timer ticks as returned by GETTICKCOUNT() are 64 bits (and at time of writing well overflowing into the high word). However, we pass this through to the timer_trigger() routine with GINT_TO_POINTER() and then retrieve it with GPOINTER_TO_INT(). Unfortunately on alpha GPOINTER_TO_INT(x) is defined as ((gint) (glong) (x)), which truncates the count to 32 bits. The upshot is that the next timeout is scheduled for aeons in the future, and we never actually draw anything. Patch: ---begin--- --- gtkwin.c.orig 2005-10-29 22:58:37.000000000 +0100 +++ gtkwin.c 2005-10-30 00:22:57.000000000 +0100 @@ -1187,14 +1187,14 @@ static gint timer_trigger(gpointer data) { - long now = GPOINTER_TO_INT(data); + long now = (long)(data); long next; long ticks; if (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); timer_id = gtk_timeout_add(ticks > 0 ? ticks : 1, timer_trigger, - GINT_TO_POINTER(next)); + (gpointer)(next)); } /* @@ -1216,7 +1216,7 @@ ticks = 1; /* just in case */ timer_id = gtk_timeout_add(ticks, timer_trigger, - GINT_TO_POINTER(next)); + (gpointer)(next)); } void fd_input_func(gpointer data, gint sourcefd, GdkInputCondition condition) ---endit--- Disclaimer: works for me on the Alpha, but totally untested on 32 bit machines. Almost certainly won't work on systems where pointers are 32 bit but long is 64 bit. I think that we only ever have one outstanding timer (since timer_id is a single global, not an array), so we could just keep 'next' in a global, rather than trying to stuff it into a pointer and pull it back out again; maybe that'd be cleaner? Or we could force timer ticks to be 32 bit integers on all platforms... </pre> Revision-number: 7366 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-04T00:35:37.297717Z PROPS-END Revision-number: 7367 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-04T00:35:37.309169Z PROPS-END Revision-number: 7368 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-04T00:35:37.320981Z PROPS-END Revision-number: 7369 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-04T00:35:37.332076Z PROPS-END Revision-number: 7370 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2007-03-04T16:51:30.253866Z K 7 svn:log V 21 Various new mirrors. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 666f5ea195dfd30e76fcd87eb2bc3281 Text-delta-base-sha1: 2f140e921cdd8117b731717a2fbaa7297d5834b0 Text-content-length: 199 Text-content-md5: 50d2d3bb92f9c068f52edbbca8b2eea8 Text-content-sha1: b4338bf4ffc3369e05a7148ef116faba64153435 Content-length: 199 SVN��W,)�$��S/�/*�C~�S2�B�K{�Rmirror.cedratnet.com/putty/">mirror.cedratnetwww.over-net.ro/putty/">over-net.ro</a> in Romann9.ru/">putty.n9putty.paknet.org/">putty.paknet.org Revision-number: 7371 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2007-03-04T23:52:11.184093Z K 7 svn:log V 15 Update status. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh2-aesctr-openssh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cfb102af23a8c460b399fb4c95601f42 Text-delta-base-sha1: c94edd82379b06932ee8a5abffa9ef240dec5894 Text-content-length: 99 Text-content-md5: cb9210b488318f0adbd91829cb043745 Text-content-sha1: 2f490cd7cb808708a4fc4c4365ddd443d3d05d86 Content-length: 99 SVN��T M�H�M�?FIt is acknowledged to be a bug in OpenSSL 0.9.8e, and is fixed in OpenSSL CVS Revision-number: 7372 Prop-content-length: 118 Content-length: 118 K 7 svn:log V 18 putty.mayurca.com K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-03-05T01:21:46.196651Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 50d2d3bb92f9c068f52edbbca8b2eea8 Text-delta-base-sha1: b4338bf4ffc3369e05a7148ef116faba64153435 Text-content-length: 75 Text-content-md5: f4d10f58fff135952d1ec368891d10ec Text-content-sha1: 6268621292e9f1473a6bd71b0465ffd79c7b5f3a Content-length: 75 SVN��, 2� ��^Nputty.mayurca.com/">putty.mayurca.com</a> in Spain Revision-number: 7373 Prop-content-length: 163 Content-length: 163 K 7 svn:log V 63 Remove mirrors with 0.59 web pages but 0.58 binaries and docs. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-03-05T01:29:01.318940Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f4d10f58fff135952d1ec368891d10ec Text-delta-base-sha1: 6268621292e9f1473a6bd71b0465ffd79c7b5f3a Text-content-length: 95 Text-content-md5: 710e55c3602f4fb702ff3b127c935f1b Text-content-sha1: cf1fe7b8d4b14b1c08c8b159d83755e014d8aa9f Content-length: 95 SVN��#/�6��'�y5�#:�A@�^=�f3thaiweb.net/">putty.thaiweb.net</a> in Thailand Revision-number: 7374 Prop-content-length: 182 Content-length: 182 K 8 svn:date V 27 2007-03-05T01:34:55.409666Z K 7 svn:log V 82 Remove mirrors where the binaries/docs gave 404 or something similarly unhelpful. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 710e55c3602f4fb702ff3b127c935f1b Text-delta-base-sha1: cf1fe7b8d4b14b1c08c8b159d83755e014d8aa9f Text-content-length: 196 Text-content-md5: 219a099bcac9a17c4967d4d1b572725b Text-content-sha1: 32d9510783bd37a38e7f81c5888ba37933fbf559 Content-length: 196 SVN��0Ct�?��1:�fi�R}�1�X~�[��4�N~�~4�c8�j�archive.hk/">putty.archive.hkfluoline.net">putty.fluoline.nettelexs.nl/">putty.telexswww.putty.net.pl/">putty.net.pl Revision-number: 7375 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2007-03-05T01:41:31.155650Z K 7 svn:log V 48 Remove mirrors that were still serving up 0.58. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 219a099bcac9a17c4967d4d1b572725b Text-delta-base-sha1: 32d9510783bd37a38e7f81c5888ba37933fbf559 Text-content-length: 311 Text-content-md5: 24a4599cad4d09ea4481a2b2baf93382 Text-content-sha1: d68af9ad567b075a62a32237f33d53859c47bde0 Content-length: 311 SVN��0Ex1�#����,#�oK�d5�Q8�ly�O\�s�%t�Lt�b^�A��T|�Lz�Rz�<>�^q�h?�.!�7=�`Pleakage.org/">putty.leakage.orgputty.se/">puttykos.li/putty/">kos.li</a> in Switzerlandputty.carbonstudios.co.uk/">putty.carbonstudios.cowww.sourcekeg.co.uk/putty/">sourcekeg.co Revision-number: 7376 Prop-content-length: 284 Content-length: 284 K 8 svn:date V 27 2007-03-05T01:51:28.385546Z K 7 svn:log V 183 Remove mirrors that gave 404, 403, "parked domain" messages, "welcome to your new web server" messages, empty documents, and a variety of other things that weren't the PuTTY website. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 24a4599cad4d09ea4481a2b2baf93382 Text-delta-base-sha1: d68af9ad567b075a62a32237f33d53859c47bde0 Text-content-length: 269 Text-content-md5: 74737e923193369d352d02d237785a3f Text-content-sha1: 6c934958fbeb3e3501b261d53f987377c6eb787a Content-length: 269 SVN��Eb^!���o�{`�Z^�x#�# �5)�B�� ?�x:�n �L>�L>�Bx�$0�Mx�`6�#"wigen.net/putty/">wigen.net</a> in Norwaputty.carbonstudios.co.uk/">putty.carbonstudios.cowww.sourcekeg.co.uk/putty/">sourcekeg.coputty.jwenet.net/">putty.jwenet Revision-number: 7377 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2007-03-05T01:56:01.550778Z K 7 svn:log V 32 Remove mirrors giving NXDOMAIN. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 74737e923193369d352d02d237785a3f Text-delta-base-sha1: 6c934958fbeb3e3501b261d53f987377c6eb787a Text-content-length: 150 Text-content-md5: e21b7cc406ca927258cfcc15d20d112d Text-content-sha1: 4c201c5a5d40f40770814eca8a1385c17725fd8c Content-length: 150 SVN��bMAH�6��x9�X%�t�J}�]�S�{T�I^�@�|?�I?�9)putty.mirrorplus.org/">putty.mirrorplus.orgputty.rtin.bz/">putty.rtin.bz Revision-number: 7378 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2007-03-06T00:31:30.632983Z K 7 svn:log V 128 Summary: Support for host key fingerprints in DNS Class: wish I seem not to have ever checked this in. Last touched July 2006. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/sshfp-dns Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2645 Text-content-md5: f67d3e213405ddd1511cf0ed76910b6f Text-content-sha1: e48d7b766a291b92872edd6d78ef938f5dd619de Content-length: 2655 PROPS-END SVN���GGGSummary: Support for host key fingerprints in DNS Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body <p> We occasionally get requests to support reading SSH host key fingerprints from the DNS, as defined by <a href="http://www.ietf.org/rfc/rfc4255.txt">RFC 4255</a>. <p> To implement this, there are two major things to be dealt with: <ul> <li> Since the SSHFP DNS records are a type of record not natively supported by operating systems' resolvers, we'd firstly need access to the resolver at a level permitting us to query for SSHFP and parse the returned records directly (since I very much doubt we'd want to implement an entire resolver ourselves). <p> At least some operating systems provide some suitable facilities: <ul> <li> OpenSSH (for Unix), for example, uses a function called <tt>getrrsetbyname()</tt>, which appears to exist natively on <a href="http://www.openbsd.org/cgi-bin/man.cgi?query=getrrsetbyname&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html">OpenBSD</a>, and can perhaps also be provided by BIND9; <li>Portable OpenSSH also has a local version of this function based on the slightly lower-level <tt>res_query()</tt> in <tt>-lresolv</tt>, which is claimed to come from 4.3BSD and exists on at least Linux, NetBSD, and Solaris, so may be a better bet; <li>Similarly, recent versions of Windows (from 2000) provide <tt>DnsQuery()</tt>, which appears to be at the right level. </ul> </li> <li> More importantly, the RFC expects that the records should be accompanied by trusted DNSSEC signatures. Many common operating systems don't obviously appear to provide DNSSEC facilities to clients (although OpenBSD <tt>getrrsetbyname()</tt> claims to), and I don't think we'd want to attempt to implement the whole of DNSSEC signature verification in PuTTY. <p> If we can't trust the SSHFP records not to have been tampered with, they could only ever be used as a hint; for instance, to bring up a "host key has changed" dialog, or to mention in the "new host key" dialog. We wouldn't automatically accept a connection to an unknown host solely on the basis of an untrusted SSHFP record. (In fact, we might have to have use of DNS fingerprints off by default, to avoid the possible nuisance value of getting "host key changed" prompts based on DNS.) <p> Even if the OS did indicate that it had verified a DNSSEC signature, I think we'd want the decision of whether PuTTY <em>trusted</em> that signature to be configurable. </li> </ul> <p> All in all, on the platforms we support, what we could easily implement may not be useful enough to be worth the effort. Revision-number: 7379 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-07T00:36:31.678433Z PROPS-END Revision-number: 7380 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-07T00:36:31.752740Z PROPS-END Revision-number: 7381 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-08T00:35:36.010109Z PROPS-END Revision-number: 7382 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 32 Workaround is in OpenSSH 4.6p1. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-03-07T23:40:29.376401Z PROPS-END Node-path: putty-wishlist/data/ssh2-aesctr-openssh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cb9210b488318f0adbd91829cb043745 Text-delta-base-sha1: 2f490cd7cb808708a4fc4c4365ddd443d3d05d86 Text-content-length: 230 Text-content-md5: 1e9a0a8ba8ff29c3532473666c298356 Text-content-sha1: 64a47e112c23d9994f8f3843b90fdf559c2db040 Content-length: 230 SVN��T N��N�9 There is also a workaround in OpenSSH 4.6p1. <p>The best workaround in affected versions of OpenSSH is to configure sshd not to offer the "aes256-ctr", "aes192-ctr", or "arcfour256" ciphers. Failing that, Revision-number: 7383 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2007-03-07T23:50:46.966093Z K 7 svn:log V 18 putty.nocona.info K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e21b7cc406ca927258cfcc15d20d112d Text-delta-base-sha1: 4c201c5a5d40f40770814eca8a1385c17725fd8c Text-content-length: 126 Text-content-md5: 7faf0ea0d9dcae669b5b633309d20363 Text-content-sha1: bcd2ea83cf996b07a098a94520580fed6a873257 Content-length: 126 SVN��M=^� ��A@�A@�Sznocona.info/">putty.nocona.info</a> in Thailandthaiweb.net/">putty.thaiweb.net</a> in Thailand Revision-number: 7384 Prop-content-length: 178 Content-length: 178 K 7 svn:log V 80 Rewrite to take account of the fact that we know precisely what's going on now. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-03-08T15:42:32.906560Z PROPS-END Node-path: putty-wishlist/data/ssh2-aesctr-openssh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e9a0a8ba8ff29c3532473666c298356 Text-delta-base-sha1: 64a47e112c23d9994f8f3843b90fdf559c2db040 Text-content-length: 820 Text-content-md5: 8343552896c523ac39f04e948cc76c85 Text-content-sha1: fe0b3417497ac7f4ea9f5c2070f6663cd0c52755 Content-length: 820 SVN��m���U:S��N4PuTTY reportsefore 4.6p1 built against OpenSSL 0.9.8e. This is caused by a bug in OpenSSL 0.9.8e, and is not specific to PuTTY -- configuring an unaffected version of OpenSSH to use the same ciphers as PuTTY gives a similar<a href="http://cvs.openssl.org/chngview?cn=15978">fixed</a> in OpenSSL CVS and there is a workaround in OpenSSH 4.6p1. <p>For those people forced to run an older OpenSSH and OpenSSL 0.9.8e, the best workaround is to <a href="http://www.openbsd.org/cgi-bin/man.cgi?query=sshd_config">configure sshd</a> not to offer the "aes256-ctr", "aes192-ctr", or "arcfour256" ciphers. Failing that, <a href="http://the.earth.li/~sgtatham/putty/latest/htmldoc/Chapter4.html#config-ssh-encryption">configure PuTTY</a> to prefer either triple-DES or Blowfish to AES and Arcfour. Revision-number: 7385 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-12T00:36:36.482442Z PROPS-END Revision-number: 7386 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-12T00:36:36.593535Z PROPS-END Revision-number: 7387 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-12T00:36:36.605034Z PROPS-END Revision-number: 7388 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2007-03-11T12:40:06.058674Z K 7 svn:log V 21 Update link to docs. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/config-locations Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04615686357fad9848763f38f237a0be Text-delta-base-sha1: 0964c75c57dcf2ddc6ffa99eaddf540c5e414da3 Text-content-length: 65 Text-content-md5: ff69fe6458cfb58398a0ebbfb71003e0 Text-content-sha1: 4a8434f7cc5f2b1a75b1314a12b1a7e8fa27d962 Content-length: 65 SVN��1 ,�n��-snapshots/htmldoc/Chapter4.html#config-file Revision-number: 7389 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-13T00:35:26.764603Z PROPS-END Revision-number: 7390 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-13T00:35:26.844899Z PROPS-END Revision-number: 7391 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-13T00:35:26.855919Z PROPS-END Revision-number: 7392 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-13T00:35:26.867620Z PROPS-END Revision-number: 7393 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-13T00:35:26.880038Z PROPS-END Revision-number: 7394 Prop-content-length: 112 Content-length: 112 K 7 svn:log V 12 Now an RFC. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-03-13T10:06:32.833631Z PROPS-END Node-path: putty-wishlist/data/subsystem-publickey Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d3c1317331140734aff9deb2e5360a73 Text-delta-base-sha1: 8f3c030871f7d4fe7a954e263e3ed1e89539f8bc Text-content-length: 112 Text-content-md5: 0caec52ee6a8501b9edd334782b4daae Text-content-sha1: 04c49799d5426751621b920b9be13be379e84396 Content-length: 112 SVN��! Z� �Z�-twww.ietf.org/rfc/rfc4819.txt">RFC 4819</a> (formerly draft-ietf-secsh-publickey-subsystem) Revision-number: 7395 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-14T00:35:22.448060Z PROPS-END Revision-number: 7396 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2007-03-13T14:43:14.305570Z K 7 svn:log V 151 get_random_data() can return NULL (for instance, if we can't open /dev/random on Unix), yet cmdgen failed to deal with this. Spotted by Darren Tucker. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3bf93446f44e2885d8d835ada3c82624 Text-delta-base-sha1: fbdce4d1fbc304ef692e8a140bd44fd3ce8153d0 Text-content-length: 156 Text-content-md5: bcf7b05d2bd660b5395631f308f74691 Text-content-sha1: 436710a54ef9550f60c8bc75bf48fe466c71e89d Content-length: 156 SVN��ru �H��,Fif (!entropy) { fprintf(stderr, "puttygen: failed to collect entropy, " "could not generate key\n"); return 1; } Revision-number: 7397 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Summary: Configurable per-character and per-line delays Class: wish K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-03-13T15:16:54.115806Z PROPS-END Node-path: putty-wishlist/data/character-line-delay Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1413 Text-content-md5: a87f4bd9d2d76c730bd54cce137858bb Text-content-sha1: 043d124a9817c9122057967999be5b3580dda374 Content-length: 1423 PROPS-END SVN���wwwSummary: Configurable per-character and per-line delays Class: wish Difficulty: fun Priority: medium Content-type: text/x-html-body <p> We've had several requests for PuTTY to be able to impose rate limiting on data sent to the backend (remote device) -- particularly large pastes, but perhaps also interactive user input. When implemented in terminal software (e.g., Hyperterminal), there is traditionally a separate delay per-character and per-line (user pressed Return, or similar). Delay is typically configured in milliseconds. <p> This is apparently required for interoperation with some devices (for instance, some Cisco devices require a line delay of 10ms). <p> We've had quite a few requests for this since we added the <a href="serial-backend.html">serial backend</a>, but we also had requests even before that existed (to work around broken terminal servers that didn't pass on SSH flow control, among other things), so it clearly shouldn't be tied to the serial backend. (Although a per-character delay is likely to make the network backends hideously inefficient when transferring large volumes of data, due to per-packet overheads.) <p> (We do already have some mechanism for breaking up large pastes, as experience has shown that even with a reliable, flow-controlled network channel, sending massive amounts of data in one go tends to cause trouble. But it's not configurable.) Revision-number: 7398 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2007-03-16T12:53:06.741636Z K 7 svn:log V 13 + au, es, ua K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7faf0ea0d9dcae669b5b633309d20363 Text-delta-base-sha1: bcd2ea83cf996b07a098a94520580fed6a873257 Text-content-length: 229 Text-content-md5: a62c4ee75a9160766cb2d0c165b10892 Text-content-sha1: 81cd38ee5e1387cca71262a40dfe4b329e2e20cc Content-length: 229 SVN��=8�%��C>�M+�A@�jxN�;mirror.afoyi.com/putty/">mirror.afoyi.com</a> in Australnightlight.biz/">putty.nightlight.biz</a> in Spainputty.mirrors.org.ua/">putty.mirrors.org.ua</a> in Ukraine<!--MIRRORSTATUS-->. Revision-number: 7399 Prop-content-length: 123 Content-length: 123 K 7 svn:log V 23 Reinstate piotrkosoft. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-03-16T13:19:17.424051Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a62c4ee75a9160766cb2d0c165b10892 Text-delta-base-sha1: 81cd38ee5e1387cca71262a40dfe4b329e2e20cc Text-content-length: 156 Text-content-md5: 3db9b338f066c554a1256f023b0e1de2 Text-content-sha1: a16a4d2cbc65c7e0f6d216f269c5257bcbb6394b Content-length: 156 SVN��z}���PVJ� piotrkosoft.net/pub/mirrors/putty/">piotrkosoft.netpiotrkosoft.net/pub/mirrors/putty-releases/">piotrkosoft.net</a> in Poland Revision-number: 7400 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-17T00:35:26.571524Z PROPS-END Revision-number: 7401 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-18T00:35:20.747086Z PROPS-END Revision-number: 7402 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-19T00:35:19.793592Z PROPS-END Revision-number: 7403 Prop-content-length: 175 Content-length: 175 K 10 svn:author V 3 ben K 8 svn:date V 27 2007-03-19T12:05:34.435054Z K 7 svn:log V 77 Fix a stupid one-character typo that was breaking 256-colour support on GTK. PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8653642291a0c3222ce5ea33b99b1aea Text-delta-base-sha1: e2b3ca8a9062b0ebd7fd1d22f27f2b12a81edd7e Text-content-length: 40 Text-content-md5: a49db5a7fda06667c6503ceac000b614 Text-content-sha1: 7451d40d2a23127b7b0ac992e8af6bccbf16bdf9 Content-length: 40 SVN���� � ��t *�tt��t� Revision-number: 7404 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2007-03-19T12:11:34.257366Z K 7 svn:log V 45 Document (fixed) bug in GTKL 256col support. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/256-colours-broken-gtk Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 487 Text-content-md5: 073363b69da1e27becafc0bd72d4d8fc Text-content-sha1: bbff2b9678c7b3aecc7811b813e93338c2949be2 Content-length: 497 PROPS-END SVN���YYYSummary: Colours generated by 256-colour code are wrong on Unix Class: bug Difficulty: fun Priority: medium Present-in: 0.59 r6393 Absent-in: 0.58 r6392 Fixed-in: r7403 2007-03-20 Content-type: text/x-html-body <p>The fix for <a href="256-colours-match-xterm.html">256-colours-match-xterm</a> on Unix/GTK had a typo in, causing the colours to come out wrong. <a href="http://img256.imageshack.us/img256/2601/pterm256colorscy8.png">This image</a> demonstrates the problem. Revision-number: 7405 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-23T00:36:36.848896Z PROPS-END Revision-number: 7406 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-23T00:36:36.950433Z PROPS-END Revision-number: 7407 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-24T00:36:05.801221Z PROPS-END Revision-number: 7408 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-26T23:35:27.415046Z PROPS-END Revision-number: 7409 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-26T23:35:27.474935Z PROPS-END Revision-number: 7410 Prop-content-length: 174 Content-length: 174 K 7 svn:log V 76 Improve summary and mention that cryptlib objects to our old behaviour too. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-03-26T15:03:15.410230Z PROPS-END Node-path: putty-wishlist/data/ssh2-romsshell-badpacket Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 54335cabe0b67ac252f7eb5cfb043f8c Text-delta-base-sha1: 953ffc2636bb37b8d2d493f009177b7958abe06e Text-content-length: 124 Text-content-md5: 494e76825dbaac50110a19cb192627ce Text-content-sha1: d7b8601f236f4e9b692424df1aa12ddc0d2ac2c8 Content-length: 124 SVN��x' g�M;�sSummary: PuTTY emits invalid SSH_MSG_IGNORE packetscryptlib apparently complains about this bug as well Revision-number: 7411 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2007-03-26T15:50:26.510023Z K 7 svn:log V 52 Notes on how cryptlib is likely to report this bug. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-romsshell-badpacket Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 494e76825dbaac50110a19cb192627ce Text-delta-base-sha1: d7b8601f236f4e9b692424df1aa12ddc0d2ac2c8 Text-content-length: 301 Text-content-md5: 505c9e92a3f18a689e34c652373812af Text-content-sha1: 6b4359b1d57aa3540f114ee4caa96de196b48b05 Content-length: 301 SVN��' ���f�r4<a href="http://www.cs.auckland.ac.nz/~pgut001/cryptlib/">cryptlib</a> complains about this bug as well, probably returning CRYPT_ERROR_BADDATA and (in the next release) the message "Bad message payload length 0 for packet type 2", E1HVpbz-0002Zv-00@medusa01.cs.auckland.ac.nz Revision-number: 7412 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-27T23:35:31.189677Z PROPS-END Revision-number: 7413 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-27T23:35:31.263640Z PROPS-END Revision-number: 7414 Prop-content-length: 368 Content-length: 368 K 7 svn:log V 267 Patch from John Sullivan: process double-clicks in the session list box on button-up rather than button-down. The effect of this is that if a saved session is already selected in the list box and then you double-click it, it will open rather than beeping annoyingly. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-03-27T18:16:36.597792Z PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 938b4312789308564fdbd8382cd10a75 Text-delta-base-sha1: e1194f84cc839b91d4fcd9213c4dd3b1b647f20d Text-content-length: 920 Text-content-md5: ced82b598260ebe2e97a8226ccc31620 Text-content-sha1: 41fbf8b4a708e5f775acf5ee75a1995078ccab35 Content-length: 920 SVN��9z8R�w��hu �y }��L>�L>T���( int nclicks_press(GtkWidget *item, GdkEventButton *event, gpointer data); static int listitem_button_release(GtkWidget *item, GdkEventButton *event, _press), dp); gtk_signal_connect(GTK_OBJECT(listitem), "button_release_event", GTK_SIGNAL_FUNC(listitem_button_release_press(GtkWidget *item, GdkEventButton *event, struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(item)); switch (event->type) { default: case GDK_BUTTON_PRESS: uc->nclicks = 1; break; case GDK_2BUTTON_PRESS: uc->nclicks = 2; break; case GDK_3BUTTON_PRESS: uc->nclicks = 3; break; } return FALSE; } static int listitem_button_release(GtkWidget *item, GdkEventButton *event, struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(item)); if (uc->nclicks>1) { uc->nclicks = 0 Revision-number: 7415 Prop-content-length: 345 Content-length: 345 K 8 svn:date V 27 2007-03-27T18:49:59.805575Z K 7 svn:log V 244 Windows apparently sends ERROR_BROKEN_PIPE when a pipe we're reading from is closed normally from the writing end. This is ludicrous; if that situation isn't a natural EOF, _nothing_ is. So if we get that particular error, we pretend it's EOF. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49b9167450e46ccb6802de3ddb5e8724 Text-delta-base-sha1: 52169d5fd5189b4beb8468a9c7f01cef1e34a0d3 Text-content-length: 492 Text-content-md5: e76938a87399e7ecf7a4307f27d5057f Text-content-sha1: db9b92c6bc0d96c3f0303f7418c90f641af840ba Content-length: 492 SVN��sM��O�*<~�zy!ctx->readret) error = GetLastError(); if (povl && !ctx->readret && error { /* * Windows apparently sends ERROR_BROKEN_PIPE when a * pipe we're reading from is closed normally from the * writing end. This is ludicrous; if that situation * isn't a natural EOF, _nothing_ is. So if we get that * particular error, we pretend it's EOF. */ if (error == ERROR_BROKEN_PIPE) ctx->readret = 1; ctx->len = 0; } Revision-number: 7416 Prop-content-length: 395 Content-length: 395 K 7 svn:log V 294 In the wake of r7415, let's have some better error reporting. Instead of passing -1 to its gotdata and sentdata callbacks on error, winhandl.c will now pass the negation of the Windows error number; and the Plink front end will now format that into an error message and pass it on to the user. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-03-27T19:10:10.887161Z PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e76938a87399e7ecf7a4307f27d5057f Text-delta-base-sha1: db9b92c6bc0d96c3f0303f7418c90f641af840ba Text-content-length: 1090 Text-content-md5: f771bb4f71270413bff5d46ef180f82c Text-content-sha1: b991b3a5d59f5b48f7cf82a192311d636196699e Content-length: 1090 SVN��"Eq�>��(A�`d!�AS�z�X�k6��o2�L1�~errret,readret = ReadFile(ctx->h, ctx->buffer,readlen, &ctx->len, povl); if (!readret) ctx->readerr = GetLastError(); else ctx->readerr = 0; if (povl && !readret && ctx->readerr == ERROR_IO_PENDING) { WaitForSingleObject(povl->hEvent, INFINITE); readret = GetOverlappedResult(ctx->h, povl, &ctx->len, FALSE); if (!readret) ctx->readerr = GetLastError(); else ctx->readerr = 0; } if (!ctx->readerr == ERROR_BROKEN_PIPE) ctx->readerr = 0; ctx->len = 0; } if (err int writeretwriteret = WriteFile(ctx->h, ctx->buffer, ctx->len, &ctx->lenwritten, povl); if (!writeret) ctx->writeerr = GetLastError(); else ctx->writeerr = 0; if (povl && !writeret && GetLastError() == ERROR_IO_PENDING) { writeret = GetOverlappedResult(ctx->h, povl, &ctx->lenwritten, TRUE); if (!writeret) ctx->writeerr = GetLastError(); else ctx->writeerr = 0; } SetEvent(ctx->ev_to_main); if (!-h->u.i.readerrh->u.o.writeerrh->u.o.writeerr Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 447839cf0857255ead2ec7127fe2c50c Text-delta-base-sha1: 0e9ec62f96e7c63208e2dfebe24b629b7085a650 Text-content-length: 607 Text-content-md5: f7641e7c313a49a372864b78a566c17e Text-content-sha1: 04ceedc7b189de118011f19816022bb1e32affd1 Content-length: 607 SVN��+=�y�� /7�lchar buf[4096]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, -len, 0, buf, lenof(buf), NULL); buf[lenof(buf)-1] = '\0'; if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0'; fprintf(stderr, "Unable to read from standard input: %s\n", bufchar buf[4096]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, -new_backlog, 0, buf, lenof(buf), NULL); buf[lenof(buf)-1] = '\0'; if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0'; fprintf(stderr, "Unable to write to standard %s: %s\n", (h == stdout_handle ? "output" : "error"), buf Revision-number: 7417 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-28T23:35:14.747388Z PROPS-END Revision-number: 7418 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2007-03-28T11:46:02.923672Z K 7 svn:log V 58 Unverified report of a problem with "mput -r *" in PSFTP. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/psftp-missing-subdirs Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 940 Text-content-md5: bd70de807b9ab819db48c7035f7ba8d3 Text-content-sha1: 1b541a7202b15b648a927341e947c15ede3160a0 Content-length: 950 PROPS-END SVN���Summary: PSFTP "mput -r *" misses some items in subdirectories Class: bug Priority: medium Present-in: 0.59 Content-type: text/plain As reported to us: I think I have found a problem with mput -r * in PSFTP version 0.59. I'm running XP (32bit) with all service packs loaded. I'm experiencing a problem when I use mput -r * to upload my files to sourceforge.net. It uploads the files in the current directory, but in the subdirectories it only uploads the last file. example If my directory looks like this: index.html install.html usage.html en <- subdirectory index.html install.html usage.html images <- sub-subdirectory a.jpg b.jpg de <- another subdirectory index.html install.html usage.html images <- sub-subdirectory a.jpg b.jpg the following files get transferred only index.html usage.html install.html en/usage.html de/usage.html the sub-subdirectories are not processed at all. Revision-number: 7419 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2007-03-28T12:26:33.917586Z K 7 svn:log V 117 A bunch of recent reports, all with the serial backend, so probably not directly relevant to the underlying problem. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b435b9c5794481a267903e4ed44751d8 Text-delta-base-sha1: 1732c35ac8cc6db8c3a507b9602930c6ac167c8d Text-content-length: 1159 Text-content-md5: 798987dc5defe660a4ac72ca3b5ba268 Text-content-sha1: 814edfdadd5785a2b7c7a42367bd9b0129eb4827 Content-length: 1159 SVN��rac�]��6]M�e �l 0.58 0.59p> There seem to be a lot of reports of this error from people using the serial backend in 0.59, which suggests that it can be a symptom of <a href="win-handle-double-free.html">win-handle-double-free</a>.li><tt>D4EFE24E74186242BCFA48FB1BC47C2802E6681D@ore-mail2.ne.ad.ner.capgemini.com</tt> <br>0.59, using a serial port <br><pre> line==NULL in terminal.c lineno=4754 y=51 w=153 h=56 count(scrollback=003F1BF0)=382 count(screen=003F1C00)=56 count(alt=00B620C8)=56 alt_sblines=0 whichtree=003F1C00 treeindex=51 </pre> <li><tt>FA37BC94952941AC89BFF98CD9997327@jamesPC</tt> <br>Also a serial connection <br><pre> line==NULL in terminal.c lineno=4754 y=18 w=89 h=47 count(scrollback=011E1AA8)=200 count(screen=011E1AB8)=47 count(alt=011F9BF0)=47 alt_sblines=0 whichtree=011E1AB8 treeindex=18 </pre> <li><tt>53b8f8fe0703261035q65cafd48i4f2f2387996a07d9@mail.gmail.com</tt> <br>Using a serial port, so presumably 0.59 <br><pre> linux==NULL in terminal.c lineno=4754 y=10 w=80 h=24 count(scrollback=003A1C60)=200 count(screen=003A1C70)=24 count(alt=003A1F90)=24 alt_sblines=0 whichtree=003A1C70 treeindex=10 Revision-number: 7420 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2007-03-28T12:56:27.171487Z K 7 svn:log V 105 I invented this format, so you'd think I could remember that it's "Class", not "Category", wouldn't you? K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/cmdline-licence Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3a7fabae7352db00369d9ea78592269b Text-delta-base-sha1: 61d8dd5e9933c4e393dae68d64ee7237678e5de6 Text-content-length: 23 Text-content-md5: bf39931b12e3215a4833dc6a9aa7d2a1 Text-content-sha1: b7e178e670c3ea7e549bbae5e0c0ba92d0d7cfb2 Content-length: 23 SVN��52�F��hMlass Node-path: putty-wishlist/data/unix-lp64 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d61d96b07d96e78fa06443a40b647efb Text-delta-base-sha1: 08f88aefaa31b282a4653f5fe2c5b73100272f1c Text-content-length: 67 Text-content-md5: 2efe8ecfa59a5c5302f48bba78d29889 Text-content-sha1: 180b7608145c1208c637afe9b517b1c120ea0dc0 Content-length: 67 SVN��3�i6Summary: PuTTY is broken on LP64 Unix systems Class Revision-number: 7421 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 45 I think this is a bug that Simon just fixed. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-03-28T13:07:06.558432Z PROPS-END Node-path: putty-wishlist/data/win-plink-stdin-eof Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2517 Text-content-md5: 9e45fb670fce93a7890568af418bb979 Text-content-sha1: 210c70b2892524c4eb1ae2d36a2baeae34845489 Content-length: 2527 PROPS-END SVN���GGGSummary: Plink reports an error when it gets EOF from standard input Class: bug Priority: high Absent-in: 0.58 Present-in: 0.59 Fixed-in: r7415 2007-03-28 Content-type: text/x-html-body <p>From a report received (42994.55835.qm@web56205.mail.re3.yahoo.com): <pre> The following command is designed to pipe through a remote command back to the local host and demonstrates an issue found while using mercurial. I have looked through your existing bug list but failed to spot anything similar. dir | PLINK.EXE -v -ssh -l duncan -i "C:\Program Files\PuTTY\hugo.ppk" remote_host cat > tmp fails on 0.59 and 2007-03-21:r7403. works on 0.58. localhost : Win XP home edition SP2 all updates applied remote: suse linux 10.2 : SSH-2.0-OpenSSH_4.4 dir | "c:\Program Files\Putty\PLINK.EXE" -v -ssh -l duncan -i "C:\Program Files\PuTTY\hugo.ppk" cyclops cat > tmp Looking up host "cyclops" Connecting to 192.168.0.101 port 22 Server version: SSH-2.0-OpenSSH_4.4 We claim version: SSH-2.0-PuTTY_Snapshot_2007_03_21:r7403 Using SSH protocol version 2 Doing Diffie-Hellman group exchange Doing Diffie-Hellman key exchange with hash SHA-256 Host key fingerprint is: ssh-rsa 1024 18:d1:50:e9:e4:79:83:f5:42:6a:eb:52:5e:9b:06:dc Initialised AES-256 SDCTR client->server encryption Initialised HMAC-SHA1 client->server MAC algorithm Initialised AES-256 SDCTR server->client encryption Initialised HMAC-SHA1 server->client MAC algorithm Reading private key file "C:\Program Files\PuTTY\hugo.ppk" Using username "duncan". Offered public key Offer of public key accepted Authenticating with public key "imported-openssh-key" Access granted Opened channel for session Started a shell/command Unable to read from standard input </pre> This particular instance of "Unable to read from standard input" should be fixed now: <pre> > Does that fix the "Unable to read from standard input" bug? The answer, currently, is `I don't know'. It certainly fixes _a_ bug which gives rise to that error message: if you do something along the lines of echo -e 'wibble\nscrark' | plink foovax sort then you should now no longer get that error. However, I can't be sure that the same error when doing complicated things launched from a service is due to the same Windows error, so it might not fix all instances of the problem. This is why I also added more detailed error reporting to that error message, so that if any instances of the problem remain we'll have more information with which to investigate them. </pre> Revision-number: 7422 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-29T23:36:03.327490Z PROPS-END Revision-number: 7423 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-29T23:36:03.497904Z PROPS-END Revision-number: 7424 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-29T23:36:03.509458Z PROPS-END Revision-number: 7425 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-29T23:36:03.537007Z PROPS-END Revision-number: 7426 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-29T23:36:03.548713Z PROPS-END Revision-number: 7427 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-29T23:36:03.560214Z PROPS-END Revision-number: 7428 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-30T23:35:53.609057Z PROPS-END Revision-number: 7429 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-30T23:35:53.938542Z PROPS-END Revision-number: 7430 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-30T23:35:53.950854Z PROPS-END Revision-number: 7431 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-30T23:35:53.963213Z PROPS-END Revision-number: 7432 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-30T23:35:53.975205Z PROPS-END Revision-number: 7433 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-30T23:35:53.987252Z PROPS-END Revision-number: 7434 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-30T23:35:54.000498Z PROPS-END Revision-number: 7435 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-31T23:35:47.699790Z PROPS-END Revision-number: 7436 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-31T23:35:47.777546Z PROPS-END Revision-number: 7437 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-03-31T23:35:47.788657Z PROPS-END Revision-number: 7438 Prop-content-length: 220 Content-length: 220 K 8 svn:date V 27 2007-04-02T08:44:00.657497Z K 7 svn:log V 119 When the comments say `if we're in restart mode', the code in question should actually be conditional on restart mode! K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bcf590ed00350065299c3f1ba99f7877 Text-delta-base-sha1: 1e0b6cfdd39146ce0df5537f01e90d63dee9b987 Text-content-length: 1316 Text-content-md5: d19969ede1c89b548f78b1324987e358 Text-content-sha1: 74516335c0adb89ff971e6bf7a59aa3ceab7906b Content-length: 1316 SVN��r� �/�R�U if (restart) { while (i < nnames) { char *nextoutfname; int ret; if (outfname) nextoutfname = dir_file_cat(outfname, ournames[i]->filename); else nextoutfname = dupstr(ournames[i]->filename); ret = (file_type(nextoutfname) == FILE_TYPE_NONEXISTENT); sfree(nextoutfname); if (ret) break; i++; } if (i > 0) i--; } if (restart) { while (i < nnames) { char *nextoutfname; nextoutfname = dupcat(outfname, "/", ournames[i], NULL); sftp_register(req = fxp_stat_send(nextoutfname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_stat_recv(pktin, rreq, &attrs); sfree(nextoutfname); if (!result) break; i++; } if (i > 0) i--; } /* Revision-number: 7439 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-02T23:35:15.138068Z PROPS-END Revision-number: 7440 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-03T23:35:16.434421Z PROPS-END Revision-number: 7441 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-03T23:35:16.506330Z PROPS-END Revision-number: 7442 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-03T23:35:16.517422Z PROPS-END Revision-number: 7443 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-03T23:35:16.528286Z PROPS-END Revision-number: 7444 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-03T23:35:16.539464Z PROPS-END Revision-number: 7445 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-04T23:35:18.800221Z PROPS-END Revision-number: 7446 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-04T23:35:18.876787Z PROPS-END Revision-number: 7447 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-06T23:35:16.175247Z PROPS-END Revision-number: 7448 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-07T23:35:16.867091Z PROPS-END Revision-number: 7449 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-07T23:35:16.945218Z PROPS-END Revision-number: 7450 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-08T23:35:34.303539Z PROPS-END Revision-number: 7451 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-08T23:35:34.381967Z PROPS-END Revision-number: 7452 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-08T23:35:34.393636Z PROPS-END Revision-number: 7453 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-08T23:35:34.404675Z PROPS-END Revision-number: 7454 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-08T23:35:34.415857Z PROPS-END Revision-number: 7455 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-09T23:35:23.909556Z PROPS-END Revision-number: 7456 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-09T23:35:23.987609Z PROPS-END Revision-number: 7457 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-09T23:35:23.998347Z PROPS-END Revision-number: 7458 Prop-content-length: 135 Content-length: 135 K 7 svn:log V 37 A couple of things from recent mail. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-04-10T21:27:12.808829Z PROPS-END Node-path: putty-wishlist/data/pageant-load-fail Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 887 Text-content-md5: 4d645b3c600f956e5158a3f0b2f2ef35 Text-content-sha1: 7df2b923b92818641ba2d3cd2f1462e0af128318 Content-length: 897 PROPS-END SVN���iiiSummary: Pageant -c continues even if key load fails Class: bug Present-in: 0.59 Content-type: text/plain A user reports: Is there any way you can modify pageant to allow the -c command only to run if the key passed on the command line loaded successfully? This is the behaviour implied by the manual: You can arrange for Pageant to start another program once it has initialised itself and loaded any keys specified on its command line. This program (perhaps a PuTTY, or a WinCVS making use of Plink, or whatever) will then be able to use the keys Pageant has loaded. You do this by specifying the -c option followed by the command, like this: C:\PuTTY\pageant.exe d:\main.ppk -c C:\PuTTY\putty.exe However it continues to run the -c command even if the key fails to load (say if I press "cancel" when asked for a passphrase or even if the key file does not exist). Node-path: putty-wishlist/data/psftp-batch-interact Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 733 Text-content-md5: 99b5588c9dc5d0c6b09abe121a00dec3 Text-content-sha1: f87daa6650a1fca49ca554ea6d5011e2d397c722 Content-length: 743 PROPS-END SVN���OOOSummary: PSFTP: continue interactively after a batch script Class: wish Content-type: text/x-html-body <p>A user requests: <blockquote><p> I would like to be able to run a batch file and then _not_ exit, but instead simply continue interactively while still logged in to the host. The key reason is to be able to set default to a particular directory but then take interactive control. Allowing a batch file to run before the user takes control would be a general purpose way to do this. <p>I could image a command line option (-bu for Batch and continUe?), but a batch command (end ?) would tie into a possible general purpose <a href="scripting">scripting</a> capability at some time in the future. </blockquote> Revision-number: 7459 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2007-04-10T21:46:44.281414Z K 7 svn:log V 188 When we get an error writing to a local file, stop the download rather than pretending we just got -1 bytes. Not actually tested, but it looks pretty obvious. Bug reported by dking wang. K 10 svn:author V 3 ben PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d19969ede1c89b548f78b1324987e358 Text-delta-base-sha1: 74516335c0adb89ff971e6bf7a59aa3ceab7906b Text-content-length: 33 Text-content-md5: eae49dc1e7478d5c9ff130d2955f7339 Text-content-sha1: 35ebf8e3a489366ac11fbc0287df360399a3a024 Content-length: 33 SVN�� ��� break Revision-number: 7460 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2007-04-10T23:06:24.790917Z K 7 svn:log V 48 Random strange bug reported by Jeremy Chadwick. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/win-fixed-ttf-underline Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 3026 Text-content-md5: 5d731664673465fcf1019fe26995d800 Text-content-sha1: d5b8c20560149e3a67029f16d630e0ea066b8e0e Content-length: 3036 PROPS-END SVN���DDDSummary: When using some bitmap TrueType fonts, underlined characters vanish Present-in: 0.59 2007-04-10 Class: semi-bug Content-type: text/plain Reported by a user: This one's a bit hard to explain, so here it goes: Client: PuTTY 0.59, and current snapshots OS: Windows XP Professional SP2 Protocol: SSHv2 Server: FreeBSD 6.2-STABLE Quite a few people (myself included) use the famous xterm 6x13 terminal font on Windows (converted using Fontforge from the original 6x13.bdf to an OpenType/TTF Bitmap font) with PuTTY. This font contains a very large glyph set, and line drawing characters, thus is quite useful. All gylphs are shown correctly with this font... except for characters which should be displayed with underlines (ex: \e[4m). The underlines are shown, but the gylph is blank/empty. PuTTY does not appear to be "drawing its own underline" with this font -- yeah I've read the code, and this font does not suffer from the same problem "Courier New" 9pt does (see some of the debug output I added below). The font size selected must be 10pt. All other point sizes (9pt, 11pt, etc.) show the gylphs and show underlining. Of course, the font is intended to be used in 10pt... The PuTTY client "Translation" mode (e.g. ISO-8859-1, UTF-8, etc.) has no effect on this problem either -- it happens in all translations. The font metrics are indeed 6x13, and I've verified as such with some debugging code I threw into windows/window.c a few hours ago. The applicable font details: Primary font H=13, AW=6, MW=4 fonts[FONT_UNDERLINE] tmHeight = 13 tmAscent = 11 tmDescent = 2 tmInternalLeading = 0 tmExternalLeading = 1 tmAveCharWidth = 6 tmMaxCharWidth = 4 tmWeight = 500 tmOverhang = 0 tmItalic = 0 tmUnderlined = 0 tmStruckOut = 0 tmPitchAndFamily = 0x36 tmCharSet = 0 I'm ~99% positive this is not the result of a badly converted font. Other applications work just fine with this font: Wordpad, mIRC, Internet Explorer, and SecureCRT all function normally with this font, with underlining. Here's a screenshot of `man ls` which should speak for itself: http://jdc.parodius.com/putty_securecrt_6x13.png The font itself is available here: http://jdc.parodius.com/FixedMedium.ttf I have been hacking at the PuTTY code for the past 6 hours trying to figure out why this is happening, and I am completely stumped. The only thing I *have* found: In init_fonts(), forcing PuTTY to draw the underline itself and thus deleting fonts[FONT_UNDERLINE] causes the problem to disappear. I have no explanation for why. In windows/window.c around line 1481 -- before the if (bold_mode == BOLD_FONT) check... und_mode = UND_LINE; DeleteObject(fonts[FONT_UNDERLINE]); fonts[FONT_UNDERLINE] = 0; Again, don't know why this helps solve the issue, but it does. This isn't the correct "fix" obviously -- I'm just pointing it out to help track down the source of the problem (I hope). Revision-number: 7461 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-14T23:35:25.927866Z PROPS-END Revision-number: 7462 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-14T23:35:26.003807Z PROPS-END Revision-number: 7463 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-15T23:35:29.237252Z PROPS-END Revision-number: 7464 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-15T23:35:29.316023Z PROPS-END Revision-number: 7465 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2007-04-17T13:13:32.095331Z K 7 svn:log V 20 Update workarounds. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/defaults-launchable Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7910bd5f394e7a1fd52a6d004314ca24 Text-delta-base-sha1: e3c9d1fcfcb804677c7ec6241b13463054b73a6d Text-content-length: 527 Text-content-md5: d211da81bc48eb566a54b5dd72ced57c Text-content-sha1: 08d0c8a2ef4bc66b79ec0472a0f8955e6118b0c6 Content-length: 527 SVN��Vjr�o��Hr�{H <p> If you get into this situation, the following workarounds are available: <ul> <li>Download a development snapshot of PuTTY, which does not suffer from this problem. You will then be able to edit Default Settings so that PuTTY 0.59 does not attempt to launch a serial connection. (Although if you're using the serial backend, you are likely to need to carry on using a development snapshot in any case, as the serial support is <a href="win-handle-double-free.html">prone to crashes</a>.) </li> Revision-number: 7466 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2007-04-17T13:15:02.053984Z K 7 svn:log V 11 HTML oops. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/defaults-launchable Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d211da81bc48eb566a54b5dd72ced57c Text-delta-base-sha1: 08d0c8a2ef4bc66b79ec0472a0f8955e6118b0c6 Text-content-length: 20 Text-content-md5: 15398d203a2e4b896b1dd05e29268916 Text-content-sha1: 23b4645dac507e07d934d3c0acbbffb49af46f02 Content-length: 20 SVN��je ��q��tv Revision-number: 7467 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-18T23:35:31.303721Z PROPS-END Revision-number: 7468 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-18T23:35:31.413369Z PROPS-END Revision-number: 7469 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-19T23:36:00.620821Z PROPS-END Revision-number: 7470 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-19T23:36:00.710757Z PROPS-END Revision-number: 7471 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-19T23:36:00.722271Z PROPS-END Revision-number: 7472 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-20T23:35:25.926805Z PROPS-END Revision-number: 7473 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-20T23:35:26.004570Z PROPS-END Revision-number: 7474 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-20T23:35:26.016317Z PROPS-END Revision-number: 7475 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-20T23:35:26.028327Z PROPS-END Revision-number: 7476 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2007-04-22T08:56:31.576309Z K 7 svn:log V 22 Capitalisation error. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1dca39040ff9e76e106c39d3b7bd4481 Text-delta-base-sha1: 91ad74ca9e8154d342a5b7d2bd71a0db38bb37f7 Text-content-length: 28 Text-content-md5: 4ea5749cc4d428a70ac9829e37093b24 Text-content-sha1: 0d98916d6a04782f56a8763688e016aadafb4853 Content-length: 28 SVN��__�=��B>�^MM Revision-number: 7477 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 Avoid creating the Session/hostport control set in mid-session. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-04-22T14:39:01.803706Z PROPS-END Node-path: putty/sercfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d5a417da7fe49a2c28481437003c0ee2 Text-delta-base-sha1: c632f58ce91f1f0ecc3a3b4fb5fa634c521a3a6a Text-content-length: 334 Text-content-md5: ffbba5d8a969e83df1690ab9e1126f82 Text-content-sha1: a68f3f964d1e31a84b79095ef8f9758139f80006 Content-length: 334 SVN��85 6�@�6�?yif (!midsession) { int i; extern void config_protocolbuttons_handler(union control *, void *, void *, int); /* * Add the serial back end to the protocols list at the * top of the config box. */ s = ctrl_getset(b, "Session", "hostport", "Specify the destination you want to connect to"); Revision-number: 7478 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-26T23:35:28.224828Z PROPS-END Revision-number: 7479 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-26T23:35:28.295054Z PROPS-END Revision-number: 7480 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-26T23:35:28.306270Z PROPS-END Revision-number: 7481 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-27T23:35:30.641824Z PROPS-END Revision-number: 7482 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-27T23:35:30.706702Z PROPS-END Revision-number: 7483 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-28T23:35:27.461886Z PROPS-END Revision-number: 7484 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-28T23:35:27.534956Z PROPS-END Revision-number: 7485 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-28T23:35:27.546081Z PROPS-END Revision-number: 7486 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-28T23:35:27.557013Z PROPS-END Revision-number: 7487 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-04-29T23:35:29.067970Z PROPS-END Revision-number: 7488 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2007-04-29T11:28:54.004591Z K 7 svn:log V 41 Update version numbers for 0.60 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 53cf7cfb0f75dfdf7585dcdea153e015 Text-delta-base-sha1: a5d01d52a3f9be402473a71b5b1e5ac0dcbdbbb6 Text-content-length: 15 Text-content-md5: 8e4eb3bf839f0b4bc25c33a4f1128de9 Text-content-sha1: fe5825b67322733f9d2a32632d56c8811123aa49 Content-length: 15 SVN��0.60 Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 93f457616aa33e16b8061906499be04f Text-delta-base-sha1: 172057f3145051c21afd8a8eb77485aa1dca7976 Text-content-length: 23 Text-content-md5: d6cda9aa9e9af49dfff0344d8900bc71 Text-content-sha1: 06b34c87f8e65ae3cf79df6c00b9dc814014b74d Content-length: 23 SVN��<< ���"60 Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f63b99c6a88097b9122cfd36f0c0cbe7 Text-delta-base-sha1: 4fdfdef8216b4a7a7b4077b16b201133e1186e86 Text-content-length: 23 Text-content-md5: 097d40c854de4e52692e71d4af7c40d3 Text-content-sha1: 70185333f73942e8430e482be1a7497c7381e0ef Content-length: 23 SVN��`` ���[60 Node-path: putty/mac/version.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 480a0be883ad6f3cc9898dd62b8a2779 Text-delta-base-sha1: 10ab459e10b4ad307629c1aea170929ab5f84adb Text-content-length: 21 Text-content-md5: c8493cb6b5231c65fe371a8594e5143b Text-content-sha1: 27820f9860bee916c94e7b0843fa63b6b6cf1bf4 Content-length: 21 SVN��77�l��In60 Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9f7e4774f2c0939b99b5368e80373910 Text-delta-base-sha1: 2e85145ce66fcd4ef9bf2c2bc19118578c514b67 Text-content-length: 103 Text-content-md5: 88e545c609c6f5c19883a4c2b24b6eeb Text-content-sha1: 1a8359a84b6754e2a4d63e36776606cfc2372d67 Content-length: 103 SVN�� Q�<�Q� 60 VersionInfoTextVersion=Release 0.60 AppVersion=0.60 VersionInfoVersion=0.60 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e9b1d4a3d9c5871ba6e61bd7faf9aecb Text-delta-base-sha1: 35ad86c470e26d90318c2d3c406ed7a34be6a90d Text-content-length: 23 Text-content-md5: 47350c65d505f801b52d17ca05eff12a Text-content-sha1: 05ca86bf5c8d1cb3c11079c6ca5079b410006ab6 Content-length: 23 SVN��RR �[��u]60 Revision-number: 7489 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 25 Drop tag for PuTTY 0.60. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-04-29T11:29:15.003846Z PROPS-END Node-path: putty-0.60 Node-kind: dir Node-action: add Node-copyfrom-rev: 7488 Node-copyfrom-path: putty Revision-number: 7490 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 17 Update for 0.60. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-04-29T21:15:07.614903Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 78c0b55006f0a2f53d7111ea8d83e8fe Text-delta-base-sha1: 1b3757ed47588ee896656526d6b011511f143451 Text-content-length: 75 Text-content-md5: eb3f9fb8fcf2d483f6ea4ae62cb01d43 Text-content-sha1: 348b90d2994d8ea4e26faa661d9d3e5c6d202ad4 Content-length: 75 SVN��[ 3����O , [ "0.60", "2007-04-29", "r7489" ] # [ "0.61 Revision-number: 7491 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2007-04-29T21:20:41.696278Z K 7 svn:log V 26 Website changes for 0.60. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b174de68529a7f5b34923c74d30c93e Text-delta-base-sha1: 2e4b1a9221f92a7c4ac28a66b71f5215bda7f80c Text-content-length: 752 Text-content-md5: 82d4d1a8c305d47f7d6780922f8d2417 Text-content-sha1: ef4a8352e3aa72ed1af6207571332f84c8662fa3 Content-length: 752 SVN��O5 U�:�U�&)60 (released 2007-04-29): <ul> <li> Pressing Ctrl+Break now sends a serial break signal. <li> Serial ports higher than <code>COM9</code> now no longer need a leading <code>\\.\<code>. <li> You can now store a host name in the Default Settings. <li> Bug fix: serial connections and local proxies should no longer crash all the time. <li> Bug fix: configuring the default connection type to serial should no longer cause the configuration dialog to be skipped on startup. <li> Bug fix: "Unable to read from standard input" should now not happen, or if it still does it should produce more detailed diagnostics. <li> Bug fix: fixed some malformed SSH-2 packet generation. <li> Other minor bug fixes. </ul> <p>These features we Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9f8885f7b37ce53471e137fd5f12cbb1 Text-delta-base-sha1: 6732f095885cf119cfadba49e2a35390c1cc5674 Text-content-length: 219 Text-content-md5: c040ce7a60a8a0c96bb238dd7521c07c Text-content-sha1: 5be1a5d75383e5a8bedae3a14c313eab326f6cbd Content-length: 219 SVN�� 8�)��S+�]:�X:�ku�xb�T>�O>�Q�B>�A_6060-installer.exe">putty-0.60-installerutty-0.60-installerutty-0.606060.tar.gz">putty-0.60.tar.gzputty-0.60.tar.gzputty-0.60.tar.gzputty-0.60.tar.gz Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 007dfec280df08c77819a29ae4bcba9e Text-delta-base-sha1: 78b368cf7f517a891183029a6a25ed71449fe446 Text-content-length: 114 Text-content-md5: e8f8275c0d95aab01cb1bf5379f8b51b Text-content-sha1: 3e145c91dfba7ad29ba579fe7141fdaef3e32d14 Content-length: 114 SVN��N1V�w��qyT�s[604-29 PuTTY 0.60 is released</b> <p> PuTTY 0.60 is out, containing mostly bug fixes. Revision-number: 7492 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 17 Missing </code>. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-04-29T21:21:37.770648Z PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 82d4d1a8c305d47f7d6780922f8d2417 Text-delta-base-sha1: ef4a8352e3aa72ed1af6207571332f84c8662fa3 Text-content-length: 25 Text-content-md5: 342144eea9f5cfa70346e2abb3b75041 Text-content-sha1: d9807f911b87695afda49f03dba6f334eb0ebbc0 Content-length: 25 SVN��56 �l��Il/ Revision-number: 7493 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2007-04-30T13:18:07.524803Z K 7 svn:log V 24 Tweaks now 0.60 is out. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/defaults-launchable Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15398d203a2e4b896b1dd05e29268916 Text-delta-base-sha1: 23b4645dac507e07d934d3c0acbbffb49af46f02 Text-content-length: 152 Text-content-md5: 8524ed7b9283f90fc7345a08ac6cb534 Text-content-sha1: 7a1177cad5249a8dbaf6a7f4c3a157c5e79f132d Content-length: 152 SVN��eq|�"�o�t|�_and can't upgrade permanently to 0.60 or later, the following workarounds are available: <ul> <li>Download 0.600.60 or later Node-path: putty-wishlist/data/win-handle-double-free Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 514ed6504c701bffc78f456625917e1e Text-delta-base-sha1: 389c7e6d23b83de7e2181c621f7f88cb5746a839 Text-content-length: 22 Text-content-md5: 35e5ccd7580cd7629309b0f8a35c3429 Text-content-sha1: 662bdbe0adcd8f27ce1744ce8bfc4aaee9fac428 Content-length: 22 SVN��7"��0.60. Revision-number: 7494 Prop-content-length: 220 Content-length: 220 K 7 svn:log V 121 Create installations directories before installing into them, like GNU packages do. Problem reported by Manfred Pausch. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-04-30T20:09:58.094620Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 46a3884ed62da7c9d54a8643befb5a65 Text-delta-base-sha1: 18e9309528b9386ce3ce4160af636ad8971686e1 Text-content-length: 70 Text-content-md5: 5b855e0a9a4d5d7d780ba7e051c29058 Text-content-sha1: 08a1cb55c536e121d15f982ec26dd4aff7b28e68 Content-length: 70 SVN��b 1�}��g{mkdir -p $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir) Revision-number: 7495 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-01T23:36:00.809389Z PROPS-END Revision-number: 7496 Prop-content-length: 218 Content-length: 218 K 7 svn:log V 119 Add support for RFC 4432 RSA key exchange, the patch for which has been lying around in my home directory for _years_. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-04-30T22:09:26.290728Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b855e0a9a4d5d7d780ba7e051c29058 Text-delta-base-sha1: 08a1cb55c536e121d15f982ec26dd4aff7b28e68 Text-content-length: 144 Text-content-md5: 054753e7a3b7ec10653828ca3dcbeb8f Text-content-sha1: 7d25b914894af78a0d1527167a2bf6e364765f9d Content-length: 144 SVN��)o�(��{T�`�7^256 sshsh512 import winutils puttygen.res + tree234256 sshsh512 import puttygen.res time tree234 + uxgen256 Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 354e26b5e1545dec8b198194ef81c0b6 Text-delta-base-sha1: f613f51cd5ed68b7948c8467bdf54c8f81dfd5d0 Text-content-length: 57 Text-content-md5: cdb21f7bffbb243db5cd33b38f5ddbf1 Text-content-sha1: ef2b0c86120ce72d8be39b7140b29fd69cbc9735 Content-length: 57 SVN��$Q !� ��$�RSA-based key exchange", KEX_RSA Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 176a1afaa97ecae509b85e6c2e33d909 Text-delta-base-sha1: 144a0b055287960e59ca53428dccf0231af45787 Text-content-length: 449 Text-content-md5: 0a5c96c906a9f65d408bd7d556448305 Text-content-sha1: ec8c5d932b99154f852c01648334838a1bb0fa07 Content-length: 449 SVN����F��F�3n addition, PuTTY supports \i{RSA key exchange}, which requires much less computational effort on the part of the client, and somewhat less on the part of the server, than Diffie-Hellman key exchang�[&KK�[�rouble with it. \S{config-ssh-agentfwd} \q{Allow \i{agent forwarding}} \cfg{winhelp-topic}{ssh.auth.agentfwd} This option allows the SSH server to open forwarded connections back to your local copy of Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e14a3787a3387ab5c50fa0cb600db24d Text-delta-base-sha1: 0f51a3d307d42887ee8273f83a60a4534d009365 Text-content-length: 27 Text-content-md5: 969e99d33a8e1575dd1ab26d4162beca Text-content-sha1: 6270483d899e36e7554292c009b614fdd21074e6 Content-length: 27 SVN��$1 �2��|(RSA Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 57aef8aec93a43b7f7045247a36828c7 Text-delta-base-sha1: a6738c5294da6dce0582222f9fd2878b04eeebf3 Text-content-length: 61 Text-content-md5: 5496c28707aaaff8bdbbce5566dc5e70 Text-content-sha1: fd418a9927231b30dde2a699606c00bae54131b8 Content-length: 61 SVN��4Y�m��Yb�[:� rsa", KEX_RSArsarsa Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 67a60a51d072171009af33be79afb187 Text-delta-base-sha1: 32a975c6687878ddb7c4f5024c4d2c55f659de61 Text-content-length: 8914 Text-content-md5: 8f58f97ba0d0a740b45cd7b06aa35c95 Text-content-sha1: d8f66199d21af4e6a34a6e0594e81988b46efd20 Content-length: 8914 SVN����k�}�4�h�+R �nkKEXRSA_PUBKEY 30 /* 0x1e */ #define SSH2_MSG_KEXRSA_SECRET 31 /* 0x1f */ #define SSH2_MSG_KEXRSA_DONE 32 /* 0x20RSAKEX 0x0004c(SSH2_MSG_KEXRSA_PUBKEY, SSH2_PKTCTX_RSAKEX); translatec(SSH2_MSG_KEXRSA_SECRET, SSH2_PKTCTX_RSAKEX); translatec(SSH2_MSG_KEXRSA_DONE, SSH2_PKTCTX_RSAK���Ek'�Z��X0B�hmq�hP�r!&�1�a�n&��BIT(q, bignum_bitcount(s->key.modulus)); q += 4; q += ssh1_write_bignum(q, s->key.exponent); q += ssh1_write_bignum(q, s->key.modulus); q += ssh1_write_bignum(q, s->challenge); memcpy(q, s->session_id, 16); q += 16; PUT_32BIT(q, 1); /* response format */ if (!agent_query(agentreq, len + 4, &vret, &retlen, ssh_agent_callback, ssh)) { sfree(agentreq); do { crReturn(0); irsakeydata, *keystr, *fingerprint; int hostkeylen, siglen, rsakeylen; void *hkey; /* actual host key */ void *rsakey; /* for RSA kexRSA: s->preferred_kex[s->n_preferred_kex++] = &ssh_rsa_kexif (ssh->kex->main_type == KEXTYPE_DH) { /* XXX The lines below should be reindented before this is committed.*/hkey = ssh->hostkey->newkey(s->hostkeydata, dh_cleanup(ssh->kex_ctx); freebn(s->f); if (!ssh->kex->pdata) { freebn(s->g); freebn(s->p); } /* XXX end incorrectly-indented section */ } else { logeventf(ssh, "Doing RSA key exchange with hash %s", ssh->kex->hash->text_name); ssh->pkt_ctx |= SSH2_PKTCTX_RSAKEX; /* * RSA key exchange. First expect a KEXRSA_PUBKEY packet * from the server. */ crWaitUntil(pktin); if (pktin->type != SSH2_MSG_KEXRSA_PUBKEY) { bombout(("expected RSA public key packet from server")); crStop(0); } ssh_pkt_getstring(pktin, &s->hostkeydata, &s->hostkeylen); hash_string(ssh->kex->hash, ssh->exhash, s->hostkeydata, s->hostkeylen); s->hkey = ssh->hostkey->newkey(s->hostkeydata, s->hostkeylen); { char *keydata; ssh_pkt_getstring(pktin, &keydata, &s->rsakeylen); s->rsakeydata = snewn(s->rsakeylen, char); memcpy(s->rsakeydata, keydata, s->rsakeylen); } s->rsakey = ssh_rsakex_newkey(s->rsakeydata, s->rsakeylen); if (!s->rsakey) { sfree(s->rsakeydata); bombout(("unable to parse RSA public key from server")); crStop(0); } hash_string(ssh->kex->hash, ssh->exhash, s->rsakeydata, s->rsakeylen); /* * Next, set up a shared secret K, of precisely KLEN - * 2*HLEN - 49 bits, where KLEN is the bit length of the * RSA key modulus and HLEN is the bit length of the hash * we're using. */ { int klen = ssh_rsakex_klen(s->rsakey); int nbits = klen - (2*ssh->kex->hash->hlen*8 + 49); int i, byte = 0; unsigned char *kstr1, *kstr2, *outstr; int kstr1len, kstr2len, outstrlen; s->K = bn_power_2(nbits - 1); for (i = 0; i < nbits; i++) { if ((i & 7) == 0) { byte = random_byte(); } bignum_set_bit(s->K, i, (byte >> (i & 7)) & 1); } /* * Encode this as an mpint. */ kstr1 = ssh2_mpint_fmt(s->K, &kstr1len); kstr2 = snewn(kstr2len = 4 + kstr1len, unsigned char); PUT_32BIT(kstr2, kstr1len); memcpy(kstr2 + 4, kstr1, kstr1len); /* * Encrypt it with the given RSA key. */ outstrlen = (klen + 7) / 8; outstr = snewn(outstrlen, unsigned char); ssh_rsakex_encrypt(ssh->kex->hash, kstr2, kstr2len, outstr, outstrlen, s->rsakey); /* * And send it off in a return packet. */ s->pktout = ssh2_pkt_init(SSH2_MSG_KEXRSA_SECRET); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, outstr, outstrlen); ssh2_pkt_send_noqueue(ssh, s->pktout); hash_string(ssh->kex->hash, ssh->exhash, outstr, outstrlen); sfree(kstr2); sfree(kstr1); sfree(outstr); } ssh_rsakex_freekey(s->rsakey); crWaitUntil(pktin); if (pktin->type != SSH2_MSG_KEXRSA_DONE) { sfree(s->rsakeydata); bombout(("expected signature packet from server")); crStop(0); } ssh_pkt_getstring(pktin, &s->sigdata, &s->siglen); sfree(s->rsakeydata); } shared secret. */ freebn(s->K);�>,nn�>�1); s->agent_request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; if (!agent_query(s->agent_request, 5, &r, &s->agent_responselen, ssh_agent_callback, ssh)) { do { crReturnV; if (pktin) { bombout(("Unexpected data from server while" " waiting for agent response")); crStopV; } } while (pktin || inlen > 0); r = ssh->agent_response; s->agent_responselen = ssh->agent_response_len; } s->agent_response = (unsigned char *) r; if (s->agent_response && s->agent_responselen >= 5 && s->agent_response[4] == SSH2_AGENT_IDENTITIES_ANSWER) { int keyi; unsigned char *p; p = s->agent_response + 5; s->nkeys = GET_32BIT(p); p += 4; logeventf(ssh, "Pageant has %d SSH-2 keys", s->nkeys); if (s->publickey_blob) { /* See if configured key is in agent. */ for (keyi = 0; keyi < s->nkeys; keyi++) { s->pklen = GET_32BIT(p); if (s->pklen == s->publickey_bloblen && !memcmp(p+4, s->publickey_blob, s->publickey_bloblen)) { logeventf(ssh, "Pageant key #%d matches " "configured key file", keyi); s->keyi = keyi; s->pkblob_in_agent = p; break; } p += 4 + s->pklen; p += GET_32BIT(p) + 4; /* comment */ } if (!s->pkblob_in_agent) { logevent("Configured key file not in Pageant"); s->nkeys = 0; } } } } } /* * We repeat this whole loop, including the username prompt, * until we manage a successful authentication. If the user * types the wrong _password_, they can be sent back to the * beginning to try another username, if this is configured on. * (If they specify a username in the config, they are never * asked, even if they do give a wrong password.) * * I think this best serves the needs of * * - the people who have no configuration, no keys, and just * want to try repeated (username,password) pairs until they * type both correctly * * - people who have keys and configuration but occasionally * need to fall back to passwords * * - people with a key held in Pageant, who might not have * logged in to a particular machine before; so they want to * type a username, and then _either_ their key will be * accepted, _or_ they will type a password. If they mistype * the username they will want to be able to get back and * retype it! */ s->username[0] = '\0'; s->got_username = FALSE; while (!s->we_are_in) { /* * Get a username. */ if (s->got_username && !ssh->cfg.change_username) { /* * We got a username last time round this loop, and * with change_username turned off we don't try to get * it again. */ } else if (!*ssh->cfg.username) { int ret; /* need not be kept over crReturn */ s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = TRUE; s->cur_prompt->name = dupstr("SSH login name"); add_prompt(s->cur_prompt, dupstr("login as: "), TRUE, lenof(s->username)); ret = get_userpass_input(s->cur_prompt, NULL, 0); while (ret < 0) { ssh->send_ok = 1; crWaitUntilV(!pktin); ret = get_userpass_input(s->cur_prompt, in, inlen); ssh->send_ok = 0; } if (!ret) { /* * get_userpass_input() failed to get a username. * Terminate. */ free_prompts(s->cur_prompt); ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE); crStopV; } memcpy(s->username, s->cur_prompt->prompts[0]->result, lenof(s->username)); free_prompts(s->cur_prompt); } else { char *stuff; strncpy(s->username, ssh->cfg.username, sizeof(s->username)); s->username[sizeof(s->username)-1] = '\0'; if ((flags & FLAG_VERBOSE) || (flags & FLAG_INTERACTIVE)) { stuff = dupprintf("Using username \"%s\".\r\n", s->username); c_write_str(ssh, stuff); sfree(stuff); } } s->got_username = TRUE; /* * Send an authentication request using method "none": (a) * just in case it succeed Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 28f378caae07c18ed4c2b53685f33319 Text-delta-base-sha1: 3fcfdb93ce361007fa5349d2bc8d3bab3c8cee08 Text-content-length: 539 Text-content-md5: 4e4468209eda8d7385be923e1be7c60e Text-content-sha1: 84541c43a640bfb58b9d6ebbc7a9f759fabefd2e Content-length: 539 SVN��LSs�8�V�t4�B4�rZ/* * SSH2 RSA key exchange functions */ struct ssh_hash; void *ssh_rsakex_newkey(char *data, int len); void ssh_rsakex_freekey(void *key); int ssh_rsakex_klen(void *key); void ssh_rsakex_encrypt(const struct ssh_hash *h, unsigned char *in, int inlen, unsigned char *out, int outlen, void *keychar *name, *groupname; enum { KEXTYPE_DH, KEXTYPE_RSA } main_type; /* For DH */ const unsigned char *pdata, *gdata; /* NULL meanskexes ssh_rsa_k Node-path: putty/sshdh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b0db7b5019b9f6c0431411d3665eee4e Text-delta-base-sha1: f67e79dd2543fdb8a7b7178ed18a8cf7554b751d Text-content-length: 83 Text-content-md5: 6fa5178d7618e147013eb5e6712f6ea3 Text-content-sha1: 67c7bcfa672961dd331e632c942f6320486edb01 Content-length: 83 SVN��C,�3��p2�z!��h+KEXTYPE_DH,KEXTYPE_DH,KEXTYPE_DH,KEXTYPE_DH, Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f5f1cbdba873e28d964d166e8ec81ba Text-delta-base-sha1: 7cfdb8212c88f41f3795d69fd57152dcb9372147 Text-content-length: 4300 Text-content-md5: 9eaafbafed558594235e627a29e832fa Text-content-sha1: 928856adcdcd02d35241d71b678dd436289a8dc9 Content-length: 4300 SVN��q'6�q�6 void *ssh_rsakex_newkey(char *data, int len) { return rsa2_newkey(data, len); } void ssh_rsakex_freekey(void *key) { rsa2_freekey(key); } int ssh_rsakex_klen(void *key) { struct RSAKey *rsa = (struct RSAKey *) key; return bignum_bitcount(rsa->modulus); } static void oaep_mask(const struct ssh_hash *h, void *seed, int seedlen, void *vdata, int datalen) { unsigned char *data = (unsigned char *)vdata; unsigned count = 0; while (datalen > 0) { int i, max = (datalen > h->hlen ? h->hlen : datalen); void *s; unsigned char counter[4], hash[h->hlen]; PUT_32BIT(counter, count); s = h->init(); h->bytes(s, seed, seedlen); h->bytes(s, counter, 4); h->final(s, hash); count++; for (i = 0; i < max; i++) data[i] ^= hash[i]; data += max; datalen -= max; } } void ssh_rsakex_encrypt(const struct ssh_hash *h, unsigned char *in, int inlen, unsigned char *out, int outlen, void *key) { Bignum b1, b2; struct RSAKey *rsa = (struct RSAKey *) key; int k, i; char *p; const int HLEN = h->hlen; /* * Here we encrypt using RSAES-OAEP. Essentially this means: * * - we have a SHA-based `mask generation function' which * creates a pseudo-random stream of mask data * deterministically from an input chunk of data. * * - we have a random chunk of data called a seed. * * - we use the seed to generate a mask which we XOR with our * plaintext. * * - then we use _the masked plaintext_ to generate a mask * which we XOR with the seed. * * - then we concatenate the masked seed and the masked * plaintext, and RSA-encrypt that lot. * * The result is that the data input to the encryption function * is random-looking and (hopefully) contains no exploitable * structure such as PKCS1-v1_5 does. * * For a precise specification, see RFC 3447, section 7.1.1. * Some of the variable names below are derived from that, so * it'd probably help to read it anyway. */ /* k denotes the length in octets of the RSA modulus. */ k = (7 + bignum_bitcount(rsa->modulus)) / 8; /* The length of the input data must be at most k - 2hLen - 2. */ assert(inlen > 0 && inlen <= k - 2*HLEN - 2); /* The length of the output data wants to be precisely k. */ assert(outlen == k); /* * Now perform EME-OAEP encoding. First set up all the unmasked * output data. */ /* Leading byte zero. */ out[0] = 0; /* At position 1, the seed: HLEN bytes of random data. */ for (i = 0; i < HLEN; i++) out[i + 1] = random_byte(); /* At position 1+HLEN, the data block DB, consisting of: */ /* The hash of the label (we only support an empty label here) */ h->final(h->init(), out + HLEN + 1); /* A bunch of zero octets */ memset(out + 2*HLEN + 1, 0, outlen - (2*HLEN + 1)); /* A single 1 octet, followed by the input message data. */ out[outlen - inlen - 1] = 1; memcpy(out + outlen - inlen, in, inlen); /* * Now use the seed data to mask the block DB. */ oaep_mask(h, out+1, HLEN, out+HLEN+1, outlen-HLEN-1); /* * And now use the masked DB to mask the seed itself. */ oaep_mask(h, out+HLEN+1, outlen-HLEN-1, out+1, HLEN); /* * Now `out' contains precisely the data we want to * RSA-encrypt. */ b1 = bignum_from_bytes(out, outlen); b2 = modpow(b1, rsa->exponent, rsa->modulus); p = out; for (i = outlen; i--;) { *p++ = bignum_byte(b2, i); } freebn(b1); freebn(b2); /* * And we're done. */ } static const struct ssh_kex ssh_rsa_kex_sha1 = { "rsa1024-sha1", NULL, KEXTYPE_RSA, NULL, NULL, 0, 0, &ssh_sha1 }; static const struct ssh_kex ssh_rsa_kex_sha256 = { "rsa2048-sha256", NULL, KEXTYPE_RSA, NULL, NULL, 0, 0, &ssh_sha256 }; static const struct ssh_kex *const rsa_kex_list[] = { &ssh_rsa_kex_sha256, &ssh_rsa_kex_sha1 }; const struct ssh_kexes ssh_rsa_kex = { sizeof(rsa_kex_list) / sizeof(*rsa_kex_list), rsa_kex_list }; Revision-number: 7497 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-01T23:36:04.711279Z PROPS-END Revision-number: 7498 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-01T23:36:04.764537Z PROPS-END Revision-number: 7499 Prop-content-length: 284 Content-length: 284 K 8 svn:date V 27 2007-05-01T12:26:44.493896Z K 7 svn:log V 183 Reindent the section that was marked `XXX The lines below should be reindented before this is committed'. Unfortunately not before it was committed, but you can't have everything :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8f58f97ba0d0a740b45cd7b06aa35c95 Text-delta-base-sha1: d8f66199d21af4e6a34a6e0594e81988b46efd20 Text-content-length: 4656 Text-content-md5: 12e34c459d16d7efa1ecd913e745530b Text-content-sha1: e40c293a71b8c1b8e100c66b510cebf56116748e Content-length: 4656 SVN�����������*�C�6�A@2�BB�; /* * Work out the number of bits of key we will need from the * key exchange. We start with the maximum key length of * either cipher... */ { int csbits, scbits; csbits = s->cscipher_tobe->keylen; scbits = s->sccipher_tobe->keylen; s->nbits = (csbits > scbits ? csbits : scbits); } /* The keys only have hlen-bit entropy, since they're based on * a hash. So cap the key size at hlen bits. */ if (s->nbits > ssh->kex->hash->hlen * 8) s->nbits = ssh->kex->hash->hlen * 8; /* * If we're doing Diffie-Hellman group exchange, start by * requesting a group. */ if (!ssh->kex->pdata) { logevent("Doing Diffie-Hellman group exchange"); ssh->pkt_ctx |= SSH2_PKTCTX_DHGEX; /* * Work out how big a DH group we will need to allow that * much data. */ s->pbits = 512 << ((s->nbits - 1) / 64); s->pktout = ssh2_pkt_init(SSH2_MSG_KEX_DH_GEX_REQUEST); ssh2_pkt_adduint32(s->pktout, s->pbits); ssh2_pkt_send_noqueue(ssh, s->pktout); crWaitUntil(pktin); if (pktin->type != SSH2_MSG_KEX_DH_GEX_GROUP) { crStop(0); } s->p = ssh2_pkt_getmp(pktin); s->g = ssh2_pkt_getmp(pktin); if (!s->p || !s->g) { bombout(("unable to read mp-ints from incoming group packet")); crStop(0); } ssh->kex_ctx = dh_setup_gex(s->p, s->g); s->kex_init_value = SSH2_MSG_KEX_DH_GEX_INIT; s->kex_reply_value = SSH2_MSG_KEX_DH_GEX_REPLY; } else { ssh->pkt_ctx |= SSH2_PKTCTX_DHGROUP; ssh->kex_ctx = dh_setup_group(ssh->kex); s->kex_init_value = SSH2_MSG_KEXDH_INIT; s->kex_reply_value = SSH2_MSG_KEXDH_REPLY; ssh->kex->groupname); } logeventf(ssh, "Doing Diffie-Hellman key exchange with hash %s", ssh->kex->hash->text_name); /* * Now generate and send e for Diffie-Hellman. */ set_busy_status(ssh->frontend, BUSY_CPU); /* this can take a while */ s->e = dh_create_e(ssh->kex_ctx, s->nbits * 2); s->pktout = ssh2_pkt_init(s->kex_init_value); ssh2_pkt_addmp(s->pktout, s->e); ssh2_pkt_send_noqueue(ssh, s->pktout); set_busy_status(ssh->frontend, BUSY_WAITING); /* wait for server */ crWaitUntil(pktin); if (pktin->type != s->kex_reply_value) { bombout(("expected key exchange reply packet from server")); crStop(0); } set_busy_status(ssh->frontend, BUSY_CPU); /* cogitate */ ssh_pkt_getstring(pktin, &s->hostkeydata, &s->hostkeylen); s->hkey = ssh->hostkey->newkey(s->hostkeydata, s->hostkeylen); s->f = ssh2_pkt_getmp(pktin); if (!s->f) { bombout(("unable to parse key exchange reply packet")); crStop(0); } ssh_pkt_getstring(pktin, &s->sigdata, &s->siglen); s->K = dh_find_K(ssh->kex_ctx, s->f); /* We assume everything from now on will be quick, and it might * involve user interaction. */ set_busy_status(ssh->frontend, BUSY_NOT); hash_string(ssh->kex->hash, ssh->exhash, s->hostkeydata, s->hostkeylen); if (!ssh->kex->pdata) { hash_uint32(ssh->kex->hash, ssh->exhash, s->pbits); hash_mpint(ssh->kex->hash, ssh->exhash, s->p); hash_mpint(ssh->kex->hash, ssh->exhash, s->g); } hash_mpint(ssh->kex->hash, ssh->exhash, s->e); hash_mpint(ssh->kex->hash, ssh->exhash, s->f); dh_cleanup(ssh->kex_ctx); freebn(s->f); if (!ssh->kex->pdata) { freebn(s->g); freebn(s->p); }�,a55�,� " (%s)\r\n", filename_to_str(&ssh->cfg.keyfile), key_type_to_str(keytype)); c_write_str(ssh, msgbuf); sfree(msgbuf); s->publickey_blob = NULL; } } /* * Find out about any keys Pageant has (but if there's a * public key configured, filter out all others). */ s->nkeys = 0; s->agent_response = NULL; s->pkblob_in_agent = NULL; if (ssh->cfg.tryagent && agent_exists()) { void *r; logevent("Pageant is running. Requesting keys."); /* Request the keys held by the agent. */ PUT_32BIT(s->agent_request, Revision-number: 7500 Prop-content-length: 205 Content-length: 205 K 7 svn:log V 104 Since r7496, Pageant needs sshsh256 to build (although it doesn't need SHA-256 to actually do its job). K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-05-01T13:14:23.775435Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 054753e7a3b7ec10653828ca3dcbeb8f Text-delta-base-sha1: 7d25b914894af78a0d1527167a2bf6e364765f9d Text-content-length: 61 Text-content-md5: efc8090fec90b8bc70eb2232e84c7f61 Text-content-sha1: daded408733f8c64363a53548f4ad1c483634a32 Content-length: 61 SVN��)2 (�3��WR256 sshsh512 winutils + winmisc Revision-number: 7501 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-01T23:36:05.038191Z PROPS-END Revision-number: 7502 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-01T23:36:05.070922Z PROPS-END Revision-number: 7503 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2007-05-01T20:29:11.056605Z K 7 svn:log V 41 Make bounds of automatic array constant. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9eaafbafed558594235e627a29e832fa Text-delta-base-sha1: 928856adcdcd02d35241d71b678dd436289a8dc9 Text-content-length: 93 Text-content-md5: 14d0e55bba25f9b50d39d8904d7e82fb Text-content-sha1: 5944d4a9f8353b2452b94226d90df10bcefdbb8b Content-length: 93 SVN��'` C�M�C�PWSSH2_KEX_MAX_HASH_LEN]; assert(h->hlen <= SSH2_KEX_MAX_HASH_LEN); Revision-number: 7504 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-01T23:36:05.160564Z PROPS-END Revision-number: 7505 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-01T23:36:05.176068Z PROPS-END Revision-number: 7506 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-02T23:35:25.727599Z PROPS-END Revision-number: 7507 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-02T23:35:25.805967Z PROPS-END Revision-number: 7508 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-02T23:35:25.817028Z PROPS-END Revision-number: 7509 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-02T23:35:25.827557Z PROPS-END Revision-number: 7510 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-02T23:35:25.838578Z PROPS-END Revision-number: 7511 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-02T23:35:25.849203Z PROPS-END Revision-number: 7512 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-02T23:35:25.859862Z PROPS-END Revision-number: 7513 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-02T23:35:25.870761Z PROPS-END Revision-number: 7514 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-02T23:35:25.881706Z PROPS-END Revision-number: 7515 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-02T23:35:25.893257Z PROPS-END Revision-number: 7516 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-03T23:35:30.314277Z PROPS-END Revision-number: 7517 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-03T23:35:30.379866Z PROPS-END Revision-number: 7518 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-03T23:35:30.390570Z PROPS-END Revision-number: 7519 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-03T23:35:30.401456Z PROPS-END Revision-number: 7520 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-04T23:36:18.555684Z PROPS-END Revision-number: 7521 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-04T23:36:18.634581Z PROPS-END Revision-number: 7522 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.152901Z PROPS-END Revision-number: 7523 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.218486Z PROPS-END Revision-number: 7524 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.248371Z PROPS-END Revision-number: 7525 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.260249Z PROPS-END Revision-number: 7526 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.270926Z PROPS-END Revision-number: 7527 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.281658Z PROPS-END Revision-number: 7528 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.293792Z PROPS-END Revision-number: 7529 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.304860Z PROPS-END Revision-number: 7530 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.316817Z PROPS-END Revision-number: 7531 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.328704Z PROPS-END Revision-number: 7532 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.339632Z PROPS-END Revision-number: 7533 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.351491Z PROPS-END Revision-number: 7534 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.365190Z PROPS-END Revision-number: 7535 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.377288Z PROPS-END Revision-number: 7536 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.389558Z PROPS-END Revision-number: 7537 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.401769Z PROPS-END Revision-number: 7538 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.414646Z PROPS-END Revision-number: 7539 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.426595Z PROPS-END Revision-number: 7540 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-05T23:35:12.439806Z PROPS-END Revision-number: 7541 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-06T23:36:07.699463Z PROPS-END Revision-number: 7542 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-06T23:36:07.841624Z PROPS-END Revision-number: 7543 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2007-05-06T23:52:22.954864Z K 7 svn:log V 70 A few notes on the cipher selection UI, and how I think it should be. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/cipher-selection Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 3639 Text-content-md5: 12d79556e418a018d0eebdc035ff84ad Text-content-sha1: 597c4ad5ded75dc7e959ab653e1eb1a6462d5ccd Content-length: 3649 PROPS-END SVN���)))Summary: Cipher selection UI is messy and irrational Class: wish Present-in: 0.60 Content-type: text/plain NB: These are largely BJH's thoughts. The current UI for selecting crypto algorithms for SSH is a mess, and neither permits nor encourages the user to make rational choices between algorithms. Amongst other failings: * Algorithms of widely differing strengths are grouped together, so AES-128 and AES-256 are treated precisely the same. * The requested group size for DH GEX is fixed. * The selections for the various types of algorithm are entirely independent. * There's no choice of MAC algorithm at all. To my mind, the important aspect of cipher selection is how much security the user wants, and how much speed they're willing to lose to get it. I'd thus suggest having two basic controls: 1: desired security level, in bits. 2: option of preferring security over speed, or vice versa. In the case where the user prefers security, PuTTY would simply list all of its algorithms in order of decreasing security and warn if one below the threshold was used. Where the user prefers speed, PuTTY would list algorithms that match the security level in order of speed first, and then the rest in order of security, again warning if the requested level was not met. DH GEX parameters can be chosen either based on the user's selections or, more usefully, based on the algorithms actually negotiated. NIST Special Publication 800-57 provides convenient mapping between symmetric and asymmetric strengths. It suggests: 80 bits == 1024-bit RSA/DSA/DH 112 bits == 2048-bit RSA/DSA/DH 128 bits == 3072-bit RSA/DSA/DH 192 bits == 7680-bit RSA/DSA/DH 256 bits == 15360-bit RSA/DSA/DH In SSH-2, hashes are generally only required to be preimage-resistant, so they can be treated as having their full rated strength. Thus, we get the following strengths for the various algorithms: diffie-hellman-group-exchange-sha256 <= 256 (tunable) diffie-hellman-group-exchange-sha1 <= 160 (tunable) rsa2048-sha256 112 (<= 256 for longer keys) diffie-hellman-group14-sha1 112 rsa1024-sha1 80 (<= 160 for longer keys) diffie-hellman-group1-sha1 80 aes256-{cbc,ctr} 256 arcfour256 256 (but warn anyway) aes192-{cbc,ctr} 192 blowfish-{cbc,ctr} 128 aes128-{cbc,ctr} 128 arcfour128 128 (but warn anyway) 3des-{cbc,ctr} 112 des-cbc@ssh.com 56 hmac-sha1{,-96} 160 hmac-md5{,-96} 128 I think a reasonable default would be a minumum strength of 112 bits, since that can be fulfilled with only REQUIRED algorithms. Given PuTTY's historic tendancy towards AES-256, I'd also suggest preferring security over speed. TODO: How does the strength of the host key affect all this? TODO: Do we care about the difference between the strength against on-line attacks (MAC, hostkey) vs off-line attacks (KEX, cipher)? The NIST document provides security lifetimes for various strengths of algorithm, so a really high-level interface would be to ask the user how long they want their data kept secure for, check the current date, and use appropriate algorithms. I'm not sure making cipher selection date-sensitive is really wise, though, and NIST think 112 bits are enough until 2030 anyway. TODO: We probably need some finer options for control freaks (and new attacks). Revision-number: 7544 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2007-05-07T10:23:21.275136Z K 7 svn:log V 77 Document the problem Jacob spotted with rsa-kex and the KEX preference list. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-rsa-kex-pref Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 877 Text-content-md5: 4e7ff70a7c4b0853dfecaa536c30c7f2 Text-content-sha1: a473ed927d22c49b8c0f38a4e8bf0833c01f0e7e Content-length: 887 PROPS-END SVN���___Summary: RSA KEX ends up at the bottom of pref list on upgrade Class: bug Priority: high Difficulty: tricky Absent-in: 0.60 Present-in: 2007-05-07 Content-type: text/x-html-body <p>The addition of <a href="ssh2-rsa-kex.html">ssh2-rsa-kex</a> has caused a problem with the KEX algorithm preference list, in that while the new default list puts RSA ahead of WARN, loading a saved session from an older PuTTY version that didn't support RSA KEX will leave RSA after warn. This is an inherent consequence of the way <tt>gprefs()</tt> works. <p>Fixing the problem isn't trivial. In this case, it would probably be reasonable to promote RSA to just above WARN if it's absent, but there probably isn't a suitable general rule. Another approach would be to scrap the preference lists and have a better <a href="cipher-selection.html"> cipher selection</a> mechanism. Revision-number: 7545 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2007-05-07T10:40:48.695544Z K 7 svn:log V 72 Document the SSH-2 performance handbrake and what we could do about it. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-handbrake Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1394 Text-content-md5: d6615bed78cae65184bbf7fe71886722 Text-content-sha1: bd0785c28619e985bd769c7826a9f1d1150d796d Content-length: 1404 PROPS-END SVN���dddSummary: Fixed-size windows in SSH-2 artifically limit performance Class: semi-bug Difficulty: tricky Priority: medium Present-in: 0.60 Content-type: text/x-html-body <p>As Peter Gutmann has <a href="http://www.cs.auckland.ac.nz/~pgut001/pubs/app_sec.pdf">observed</a>, naive implementations of the SSH-2 sliding window protocol place an arbitrary limit on the throughput of each channel, limiting it to the product of the window size and the round-trip time. PuTTY is one such naive implementation. <p>There are various things that could be done to work around this. In an ideal world, PuTTY would measure the bandwidth-delay product of the link it's running over and use that to set the window so as to fully use the available bandwidth without completely breaking flow control. A rather simpler approach is possible where a connection only has (and only ever will have) one channel running over it, since in that case PuTTY can open the window fully and leave flow control to TCP. Happily, the applications in which the latter approach will work (PSFTP and PSCP) are also the ones in which it's most needed. <p>As something of an aside, it might also be helpful for PuTTY to indicate somehow to the server that it only plans to use a single channel on a connection so that the server can open its window fully too. Otherwise, we only get improved download performance. Revision-number: 7546 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2007-05-07T14:46:43.807445Z K 7 svn:log V 78 PSCP crashes when downloading a file that's growing. Reported by Ragnar Borg. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/pscp-sizechange-crash Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 487 Text-content-md5: 7b415487ab0d61718a96e3054b69d695 Text-content-sha1: 9991299ad84055ae0f7727861719ccae7aef57d6 Content-length: 497 PROPS-END SVN���YYYSummary: pscp suffers an assertion failure when a remote file changes size Class: bug Difficulty: tricky Priority: high Present-in: 0.60 2007-05-04 r7503 Content-type: text/plain When copying a file from a remote system whose size changes during a copy (for instance, an active log file), pscp suffers an assertion failure: Assertion failed: actuallen <= len, file ..\pscp.c, line 1523 001001c78e71$39889710$ac99c530$@com BAY124-DAV16037F706A79B2754694D3D4400@phx.gbl Revision-number: 7547 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-07T23:35:57.127713Z PROPS-END Revision-number: 7548 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-07T23:35:57.139103Z PROPS-END Revision-number: 7549 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-07T23:35:57.153041Z PROPS-END Revision-number: 7550 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-07T23:35:57.190067Z PROPS-END Revision-number: 7551 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-07T23:35:57.201518Z PROPS-END Revision-number: 7552 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-07T23:35:57.213124Z PROPS-END Revision-number: 7553 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-07T23:35:57.272638Z PROPS-END Revision-number: 7554 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-07T23:35:57.284694Z PROPS-END Revision-number: 7555 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2007-05-07T19:14:45.702840Z K 7 svn:log V 63 `pscp-sizechange-crash' already existed as `pscp-size-change'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pscp-size-change Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 95007d12e948f7dd91bdbf14c4ecd6f8 Text-delta-base-sha1: eca8c143ce6bda5b34f45e864f19d3524e267037 Text-content-length: 56 Text-content-md5: b8f18ca284699ba4c07fe3f53c6dc948 Text-content-sha1: ed9e7928a571a7b304cbd089ac9cab509816379d Content-length: 56 SVN��T`%�J��qcbug Difficulty: tricky Priority: high Node-path: putty-wishlist/data/pscp-sizechange-crash Node-action: delete Revision-number: 7556 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2007-05-07T19:21:38.402730Z K 7 svn:log V 57 Merge `ssh2-handbrake' into the existing `flow-control'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/flow-control Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fe50589e7400a016f1178161f1b05c9 Text-delta-base-sha1: 7cb5cc5baaf8f2a5f5e83642c8d32fd1261dbf4f Text-content-length: 1454 Text-content-md5: de6fe31dfbafde9c246fa728eccb69f2 Text-content-sha1: 73f6144f264468ec767c84f227224858dc89711c Content-length: 1454 SVN�� /�k�5�e$[�O<As Peter Gutmann has <a href="http://www.cs.auckland.ac.nz/~pgut001/pubs/app_sec.pdf">observed</a>, naive implementations of the SSH-2 sliding window protocol place an arbitrary limit on the throughput of each channel, limiting it to the product of the window size and the round-trip time (the so-called "SSH-2 handbrake"). PuTTY is one such naive implementation (it uses a fixed channel window size of 16k). <p>There are various things that could be done to work around this. In an ideal world, PuTTY would measure the bandwidth-delay product of the link it's running over and use that to set the window so as to fully use the available bandwidth without completely breaking flow control. A rather simpler approach is possible where a connection only has (and only ever will have) one channel running over it, since in that case PuTTY can open the window fully and leave flow control to TCP. Happily, the applications in which the latter approach will work (PSFTP and PSCP) are also the ones in which it's most needed. <p>As something of an aside, it might also be helpful for PuTTY to indicate somehow to the server that it only plans to use a single channel on a connection so that the server can open its window fully too. Otherwise, we only get improved download performance. <p> Of course, things become more complicated excesses of <a href="ssh2-generality.html">SSH-2 generality</a>). <p> Another approach: t Node-path: putty-wishlist/data/ssh2-handbrake Node-action: delete Revision-number: 7557 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2007-05-07T19:23:43.518979Z K 7 svn:log V 49 Bump Class and Priority (from `ssh2-handbrake'). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/flow-control Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: de6fe31dfbafde9c246fa728eccb69f2 Text-delta-base-sha1: 73f6144f264468ec767c84f227224858dc89711c Text-content-length: 63 Text-content-md5: 98440ddeea235d0f115c8acd026f6be4 Text-content-sha1: 27cb7d8dcd2774013a73511c1dc502fe72fafe40 Content-length: 63 SVN��/6,�O��;tsemi-bug Difficulty: tricky Priority: medium Revision-number: 7558 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-07T23:35:57.568407Z PROPS-END Revision-number: 7559 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 40 Probably time this was marked as fixed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-05-07T21:36:04.791728Z PROPS-END Node-path: putty-wishlist/data/ssh2-rsa-kex Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc8f717fcaf786a4a4c0a114f006a956 Text-delta-base-sha1: 2d0d9619d8d43f4fb2d2843f624c689907e9a646 Text-content-length: 45 Text-content-md5: e3c35842bfd5beda75c9e730b71fd718 Text-content-sha1: e5a91a4708bdad08f7c3c94aedbaa833b7871819 Content-length: 45 SVN��4�W��CVFixed-in: r7496 2007-05-01 Revision-number: 7560 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2007-05-08T11:52:41.838790Z K 7 svn:log V 29 Update version info in text. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pscp-size-change Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b8f18ca284699ba4c07fe3f53c6dc948 Text-delta-base-sha1: ed9e7928a571a7b304cbd089ac9cab509816379d Text-content-length: 181 Text-content-md5: cb8bf60e20cc0811ffb89050f906a655 Text-content-sha1: 0fabacbcf3d22dbe28ed3085b1b372b9d1fa8be5 Content-length: 181 SVN��`u �{��]{s, but that hasn't been possible since 0.550.55); you'll avoid the assertion, but I haven't checked that the file will be safely transferred in its entirety. Revision-number: 7561 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-08T23:35:22.997437Z PROPS-END Revision-number: 7562 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-08T23:35:23.014962Z PROPS-END Revision-number: 7563 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-08T23:35:23.026633Z PROPS-END Revision-number: 7564 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-09T23:35:38.466819Z PROPS-END Revision-number: 7565 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-09T23:35:38.558686Z PROPS-END Revision-number: 7566 Prop-content-length: 158 Content-length: 158 K 7 svn:log V 60 These days, you _can_ save a host name in Default Settings. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-05-09T21:35:24.616208Z PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0a5c96c906a9f65d408bd7d556448305 Text-delta-base-sha1: ec8c5d932b99154f852c01648334838a1bb0fa07 Text-content-length: 281 Text-content-md5: 71aaae34b1b21fd9719d17ff20fbdf5d Text-content-sha1: e83f2ef7d4933bb4738a45f65c03135cb8d7d54b Content-length: 281 SVN���� m���pmrouble with it. \S{config-ssh-agentfwd} \q{Allow \i{agent forwarding}} \cfg{winhelp-topic}{ssh.auth.agentfwd} This option allows the SSH server to open forwarded connections back to your local copy of \i{Pageant}. If you are not runni�&9��9m Revision-number: 7567 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-10T23:35:26.239782Z PROPS-END Revision-number: 7568 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-10T23:35:26.317906Z PROPS-END Revision-number: 7569 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-11T23:35:19.978400Z PROPS-END Revision-number: 7570 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:36.887708Z PROPS-END Revision-number: 7571 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:36.957207Z PROPS-END Revision-number: 7572 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:36.969111Z PROPS-END Revision-number: 7573 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:36.980519Z PROPS-END Revision-number: 7574 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:36.992048Z PROPS-END Revision-number: 7575 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:37.004115Z PROPS-END Revision-number: 7576 Prop-content-length: 107 Content-length: 107 K 8 svn:date V 27 2007-05-12T14:24:10.242843Z K 7 svn:log V 8 Update. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/black-pointer Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d82abc6cf405ad8f5fca43e46a005d45 Text-delta-base-sha1: 23f078e266caf6df987e011ecc4c91e331336030 Text-content-length: 1118 Text-content-md5: 38a6c4cd0e1b213ce5c317310f232ff7 Text-content-sha1: 3f192f4d6a1a5be097603d7754098a78a5216ea5 Content-length: 1118 SVN��A�r�� #�40.51 0.52 2002-12-28 0.58 0.60 <p> There have been sporadic reports of this for years, but they have become more frequent recently (2007), particularly associated with Windows Vista (but also <a href="http://osdir.com/ml/network.rdesktop.user/2005-03/msg00012.html">reported with rdesktop</a>). Some possible causes: <ul> <li> Perhaps on some installations, the I-beam pointer is black, rather than inverted. This wouldn't be very obvious with most Windows applications, with their light-coloured backgrounds, but would be obvious with PuTTY's default black background. We haven't personally seen this one, so it's pure speculation; please let us know if it turns out to be the case for you. <li> Even when the cursor <em>is</em> inverted, some video cards have an off-by-one error. In this case, a tiny change to PuTTY's background colour can help. See below. (We have had several reports where this did not help.) </ul> <p> In all cases, changing the Windows I-beam cursor to something chunkier (via Control Panel / Mouse / Pointers or similar) should give you something usable. <hr> Revision-number: 7577 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:37.231057Z PROPS-END Revision-number: 7578 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:37.242263Z PROPS-END Revision-number: 7579 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:37.254007Z PROPS-END Revision-number: 7580 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:37.265580Z PROPS-END Revision-number: 7581 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-12T23:36:37.277297Z PROPS-END Revision-number: 7582 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-13T23:35:20.023099Z PROPS-END Revision-number: 7583 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-14T23:35:19.422377Z PROPS-END Revision-number: 7584 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-15T23:36:08.097046Z PROPS-END Revision-number: 7585 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-16T23:35:31.464970Z PROPS-END Revision-number: 7586 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-16T23:35:31.553457Z PROPS-END Revision-number: 7587 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-16T23:35:31.564966Z PROPS-END Revision-number: 7588 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-16T23:35:31.576066Z PROPS-END Revision-number: 7589 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-16T23:35:31.587049Z PROPS-END Revision-number: 7590 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-16T23:35:31.598097Z PROPS-END Revision-number: 7591 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-16T23:35:31.609563Z PROPS-END Revision-number: 7592 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-16T23:35:31.622257Z PROPS-END Revision-number: 7593 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-16T23:35:31.633751Z PROPS-END Revision-number: 7594 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-17T23:35:26.805679Z PROPS-END Revision-number: 7595 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-17T23:35:26.890844Z PROPS-END Revision-number: 7596 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-17T23:35:26.901908Z PROPS-END Revision-number: 7597 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-17T23:35:26.913144Z PROPS-END Revision-number: 7598 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-17T23:35:26.923793Z PROPS-END Revision-number: 7599 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-18T23:35:42.891865Z PROPS-END Revision-number: 7600 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-19T23:35:43.137187Z PROPS-END Revision-number: 7601 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-20T23:36:00.330509Z PROPS-END Revision-number: 7602 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-21T23:35:37.016855Z PROPS-END Revision-number: 7603 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-21T23:35:37.161315Z PROPS-END Revision-number: 7604 Prop-content-length: 433 Content-length: 433 K 8 svn:date V 27 2007-05-22T18:37:17.619726Z K 7 svn:log V 332 Retire the e-gold link. Nobody's used it in years; I honestly don't know how I'd go about retrieving money from them any more because my last exchange transaction went through a company who subsequently turned out to be dodgy; and a user points out that e-gold is in legal trouble, which suggests that avoiding it is probably wise. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff54e4a45458118af46c570ad522e5b8 Text-delta-base-sha1: 9e2fe26cf4995e074b4ea2c536976de2d1eb1e9a Text-content-length: 110 Text-content-md5: 432b03d67a64a7733541127eb04b0841 Text-content-sha1: 0f54942fbffee142e4080c08d295461f72ab5d31 Content-length: 110 SVN��> T�c�T�TjIf you don't like PayPal, talk to us; we can probably arrange some alternative means Revision-number: 7605 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-27T23:35:58.495835Z PROPS-END Revision-number: 7606 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-27T23:35:58.583185Z PROPS-END Revision-number: 7607 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-27T23:35:58.595320Z PROPS-END Revision-number: 7608 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-28T23:35:59.301602Z PROPS-END Revision-number: 7609 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2007-05-29T20:01:32.548628Z K 7 svn:log V 103 Explicitly spell out that "incorrect MAC" type errors can be caused by data corruption in the network. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3efcfa5eed1735cce58929ec343cb03c Text-delta-base-sha1: 4f030b1773d15a1b3c04dce15be480c4cad7eddc Text-content-length: 442 Text-content-md5: 3e209fc0eb58627842827b00f1da407d Text-content-sha1: a2d6319079b801a88a0f52533f62cb88338564a6 Content-length: 442 SVN��7 "��"� In particular, if the network is corrupting data at the TCP level, it may only be obvious with cryptographic protocols such as SSH, which explicitly check the integrity of the transferred data and complain loudly if the checks fail. Corruption of protocols without integrity protection (such as HTTP) will manifest in more subtle failures (such as misdisplayed text or images in a web browser) which may not be noticed Revision-number: 7610 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2007-05-29T20:06:45.724349Z K 7 svn:log V 35 Index "MAC" a bit more thoroughly. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3e209fc0eb58627842827b00f1da407d Text-delta-base-sha1: a2d6319079b801a88a0f52533f62cb88338564a6 Text-content-length: 28 Text-content-md5: b8f7df0584b65c4ff9b568528cd12479 Text-content-sha1: 21f1656fd659e1c4a6ef76d99f68263d22bfa251 Content-length: 28 SVN��7; �V��^Y\i{MAC} Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b3365de595a4f8faa37aead287fe29f5 Text-delta-base-sha1: c5759477d3e5fac05ed56ba367041ec7a5974bc9 Text-content-length: 102 Text-content-md5: 158b2ea12fc33f7c7d8861693e1c1fd4 Text-content-sha1: 5ab304c4fb7b1c9701a468b7d6d7f3bd4d9596b6 Content-length: 102 SVN��Yi L�a�L�<{MAC} message authentication code (MAC) \IM{message authentication code}{MAC Revision-number: 7611 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-30T23:36:11.984491Z PROPS-END Revision-number: 7612 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-31T23:36:08.918834Z PROPS-END Revision-number: 7613 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-05-31T23:36:08.989371Z PROPS-END Revision-number: 7614 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-06-02T23:35:23.449475Z PROPS-END Revision-number: 7615 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-06-02T23:35:23.547192Z PROPS-END Revision-number: 7616 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2007-06-07T22:00:23.312424Z K 7 svn:log V 43 Link to transparency patch on x86code.com. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 59a1358813d33604e4a36a49dc91722b Text-delta-base-sha1: dba5cf087aa2403f137a4fc5efc9f2b2a8707d47 Text-content-length: 145 Text-content-md5: e07a0aacb56873c0fdc7b0f295b7513c Text-content-sha1: 8d585884b44454643e7ed5fb6830a998b3f609fa Content-length: 145 SVN��% {�a�{�IKx86code.com/putty-transparent.zip"> And another</a> (diff <a href="http://x86code.com/putty-transparent.diff">here</a>) Revision-number: 7617 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-06-15T23:35:32.187797Z PROPS-END Revision-number: 7618 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-06-18T23:35:36.803606Z PROPS-END Revision-number: 7619 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-06-19T23:35:21.115306Z PROPS-END Revision-number: 7620 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2007-06-19T23:25:15.962498Z K 7 svn:log V 33 New mirrors. Reinstate lamer.sk. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3db9b338f066c554a1256f023b0e1de2 Text-delta-base-sha1: a16a4d2cbc65c7e0f6d216f269c5257bcbb6394b Text-content-length: 527 Text-content-md5: f7b2c71e6788f20ca88dc4a74d55ad9f Text-content-sha1: a3f4d1c4f02141ff65926605d0594abac092b192 Content-length: 527 SVN��z][&�c��A@�Mw�2c�I<�3�[9�[9�X<�[9�98�g6�Q6�$�7��M:�M:�I1eu-by.org/putty/">eu-by.org</a> in Belarusspegulo.be/">putty.spegulogarmtech.lv/">putty.garmtech.lvnedzone.nl/">putty.nedzoneimtek.nl/">putty.imtekjl-projects.com/">putty.jl-projects.comosmirror.nl/">putty.osmirrormirrors.ptm.ro/putty/">mirrors.ptm.ro</a> in Romanialamer.sk/">putty.lamer.sks.xifos.net/putty/">mirrors.xifos.net</a> in the UKmirror.facebook.com/">putty.mirror.facebookwww.scriptycan.com/putty/">scriptycan Revision-number: 7621 Prop-content-length: 103 Content-length: 103 K 8 svn:date V 27 2007-06-20T19:08:42.022899Z K 7 svn:log V 4 +am K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f7b2c71e6788f20ca88dc4a74d55ad9f Text-delta-base-sha1: a3f4d1c4f02141ff65926605d0594abac092b192 Text-content-length: 76 Text-content-md5: 1f072e41704504aeee91ce5627be8ea9 Text-content-sha1: 78be178498ef12f9fc83e1f22a71db93c500c554 Content-length: 76 SVN��]H0�%��A�2+putty.daemon.am/">putty.daemon.am</a> in Armenia Revision-number: 7622 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-06-21T23:35:23.855648Z PROPS-END Revision-number: 7623 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2007-06-25T22:46:34.205422Z K 7 svn:log V 53 Andreas Paulsson reports that undating Vista helped. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/black-pointer Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 38a6c4cd0e1b213ce5c317310f232ff7 Text-delta-base-sha1: 3f192f4d6a1a5be097603d7754098a78a5216ea5 Text-content-length: 195 Text-content-md5: 207901b4f52371be4cb3cd74e15919f5 Text-content-sha1: b0817c184ea99a18f01f236f58e8213e31d525d6 Content-length: 195 SVN��1 +�J�+�<Fp> At least one user has found that updating Windows caused the problem to go away, suggesting that either Vista itself or a video driver had a relevant bug that got fixed Revision-number: 7624 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2007-06-26T20:21:56.541861Z K 7 svn:log V 77 Suggestion from Bradley -- allow use of corner other than top-left for menu. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/fullscreen-menu-corner Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 376 Text-content-md5: 5ca06eb7f82dff0451f0795538b78da9 Text-content-sha1: c9bab82bfc7e27d1de5dca1fa64b90fe82f03008 Content-length: 386 PROPS-END SVN���jjjSummary: Use other corners for menu in full-screen mode Class: wish Difficulty: fun Content-type: text/plain Maybe it should be possible to use corners of the screen other than the top-left to get at the system menu in full-screen mode on Windows. This would be nice for those people who use multiple monitors and have one to the left of the one with PuTTY on. Revision-number: 7625 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-06-29T23:35:19.196409Z PROPS-END Revision-number: 7626 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2007-06-30T18:17:12.012332Z K 7 svn:log V 47 Tong Ho points out a missing ssh_pkt_ensure(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 12e34c459d16d7efa1ecd913e745530b Text-delta-base-sha1: e40c293a71b8c1b8e100c66b510cebf56116748e Text-content-length: 277 Text-content-md5: e471a20a48dda5445ec61badeaf8ceec Text-content-sha1: 5d5032772a206e507f69107fb81dd195fff87782 Content-length: 277 SVN����F�Y�F�aWssh_pkt_ensure(pkt, complen + 2); /* just in case it's got bigger */���HH�8�en); q = agentreq + 4; *q++ = SSH1_AGENTC_RSA_CHALLENGE; PUT_32�a)HH�a�str(keytype)); msgbuf = dupprintf("Unable to use key file \"%.150s\"" Revision-number: 7627 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2007-06-30T18:18:20.193154Z K 7 svn:log V 113 Fix a couple of signedness compiler warnings, presumably due to me using a different version of gcc from before. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e471a20a48dda5445ec61badeaf8ceec Text-delta-base-sha1: 5d5032772a206e507f69107fb81dd195fff87782 Text-content-length: 75 Text-content-md5: 41735b8f4cc82d118c9496cad4f2ae6f Text-content-sha1: d93739f7a276b669b80e61d029fb6f8adf32b2e8 Content-length: 75 SVN����������� �t��t(char *)�)1�)�type_to_ Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 14d0e55bba25f9b50d39d8904d7e82fb Text-delta-base-sha1: 5944d4a9f8353b2452b94226d90df10bcefdbb8b Text-content-length: 33 Text-content-md5: 34b6c0a08ed78c362887fd42ca6a5d85 Text-content-sha1: 1287e18db02c40ebed06e3ad722657f7b582aef8 Content-length: 33 SVN��`h ���Z(char *) Revision-number: 7628 Prop-content-length: 302 Content-length: 302 K 8 svn:date V 27 2007-06-30T21:56:44.407769Z K 7 svn:log V 201 Rationalise access to, and content of, backends[] array. Should be no significant change in behaviour. (Well, entering usernames containing commas on Plink's command line will be a little harder now.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/be_all.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 57be9b687d6b3139088610c1cedbd147 Text-delta-base-sha1: 9a07830b2ef5da4fa8d222a31cfbdab960543d35 Text-content-length: 131 Text-content-md5: c41ed7e0275e9c1fbbd429d7be7ecebb Text-content-sha1: 87258d2d7fc28633146f7d2aae8ee106aba46922 Content-length: 131 SVN��vr��rBackend *backends[] = { &ssh_backend, &telnet_backend, &rlogin_backend, &raw_backend, NULL }; Node-path: putty/be_all_s.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2262758f55d1ff6cc7402b55052dedf3 Text-delta-base-sha1: b9e205a59a034d08a9f941d4304f116f6e6b4299 Text-content-length: 154 Text-content-md5: 6d72a7a07ada5a28a92a0c6d0a877bf7 Text-content-sha1: 127805c444dd6d3c65870b91a2ecd4155155450c Content-length: 154 SVN��=<�5�Backend *backends[] = { &ssh_backend, &telnet_backend, &rlogin_backend, &raw_backend, &serial_backend, NULL }; Node-path: putty/be_none.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f78e93473d379dbb1c74cd22748eb7d7 Text-delta-base-sha1: bf9dd4df0d77adfd9765b32755015fb341387d29 Text-content-length: 198 Text-content-md5: 394c1a1a9996d3051f157183eddd80b4 Text-content-sha1: fe1b0b31e9f2a5815c6dc82cd3d8a6ef06cc9f73 Content-length: 198 SVN��h777/* * Linking module for programs that do not support selection of backend * (such as pscp or pterm). */ #include <stdio.h> #include "putty.h" Backend *backends[] = { NULL }; Node-path: putty/be_nos_s.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35dc291fbaaf8768d1851fb61376adc9 Text-delta-base-sha1: c7e1bd9a65221b8d5e0979422bb4ddcb241790ee Text-content-length: 135 Text-content-md5: e8c4a53227397359b0e9ea14221fd881 Text-content-sha1: 3d7e363221b67328cdec6cd4ecdd60d5c2b350d2 Content-length: 135 SVN��y q�X�q�B7Backend *backends[] = { &telnet_backend, &rlogin_backend, &raw_backend, &serial_backend, NULL Node-path: putty/be_nossh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 620808fbee528cbdc733c4c268dc89f1 Text-delta-base-sha1: cb23efb16b24cd454845ebba0d331ad39e84ea7b Text-content-length: 114 Text-content-md5: 5e5f25f35469a5f4d64f8d60bfd96f87 Text-content-sha1: 4622c2472cd4d61a57acd0d45c7b224cb5367d80 Content-length: 114 SVN��Kv \�X�\�B Backend *backends[] = { &telnet_backend, &rlogin_backend, &raw_backend, NULL Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cdb21f7bffbb243db5cd33b38f5ddbf1 Text-delta-base-sha1: ef2b0c86120ce72d8be39b7140b29fd69cbc9735 Text-content-length: 156 Text-content-md5: 94c1c0df7c7c88e069bfd4f3f1b3862c Text-content-sha1: 89bdd3484f4eaaa910fb3f994d4df4281ef93267 Content-length: 156 SVN��QT1^�L��i<�Q7�@1� }�f�m�S~static void config_hosbackend_from_protobackend_from_protobackend_from_protobackend_from_proto Node-path: putty/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56c2c9b78d63f0ab642dea48209cf937 Text-delta-base-sha1: 136f589db66fa6a0368451bf6e3ddff7868a0b83 Text-content-length: 154 Text-content-md5: 7cfa4860a5c01feab981b4fe7345dcbf Text-content-sha1: d3e5e02a75d196633c5772521a12a06645ea1fb3 Content-length: 154 SVN��,] ��n���o=Backend *b = backend_from_proto(default_protocol); default_port = 0; /* illegal */ if (b) default_port = b->default_port; Node-path: putty/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4c888cf6bd0ffda80cf2583251262a97 Text-delta-base-sha1: 62072d46bdb2e5f48f5d1ef6f678b1e2c1133a6e Text-content-length: 60 Text-content-md5: 8317bf94608643f7406e25ac78fc74f5 Text-content-sha1: e1be163ea000a5464f7bd3f70041407eb7468d70 Content-length: 60 SVN��$. $���backend_from_proto(s->cfg.protocol); Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7996fdf137fe73af65cc61a829c6b109 Text-delta-base-sha1: 1eb9957fd9ed9cdc498d9210ef1030ed21abcc1c Text-content-length: 102 Text-content-md5: 16a64be6fd3976fda88017b60fb55813 Text-content-sha1: 80aeb9d59eded8d6841dd9419049642b5749424b Content-length: 102 SVN��/I M�0�M�Lcback = backend_from_proto(cfg.protocol); if (!back) back = &pty_backend; Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 969e99d33a8e1575dd1ab26d4162beca Text-delta-base-sha1: 6270483d899e36e7554292c009b614fdd21074e6 Text-content-length: 190 Text-content-md5: b45cb0b1093f88026699d113f163de24 Text-content-sha1: 1853c30c9aacb104fa1348f9f6757bc1c5fd5bcf Content-length: 190 SVN��1b��H� U�+char *name; int protocol; int default_port; }; extern Backend *Backend *backend_from_name(const char *name); Backend *backend_from_proto(int proto); Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 42a7152157dd2bdaeb7b6296e8d6c09c Text-delta-base-sha1: 06b344af6ae82699c9da2de8a0d7021cb985bfd4 Text-content-length: 46 Text-content-md5: bd7e80128642c5d99053b81626f02699 Text-content-sha1: b9716f0592ad807ab38e4e5a0cc66f6664ceeaae Content-length: 46 SVN��4M�/�"raw", PROT_RAW, 1 }; Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 89240c6e4a44e115dedf8103f70d0b31 Text-delta-base-sha1: 882b8e6f0e978a949a665b4665a73bf79f1f4aba Text-content-length: 52 Text-content-md5: a52bac411971bd9198c76aeca5a282fc Text-content-sha1: d8d0b0fd25c085ae095f5abcd75c537d19ddbd0c Content-length: 52 SVN��&E$�!�"rlogin", PROT_RLOGIN, 1 }; Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5496c28707aaaff8bdbbce5566dc5e70 Text-delta-base-sha1: fd418a9927231b30dde2a699606c00bae54131b8 Text-content-length: 743 Text-content-md5: cd8bf8f4866da08d4eaf0e463030fcce Text-content-sha1: 8e3864a9960532a741b1dd66e8f3e3d4a30a784f Content-length: 743 SVN��YP=�I�H�QGW�G�2'/* * Convenience functions to access the backends[] array * (which is only present in tools that manage settings). */ Backend *backend_from_name(const char *name) { Backend **p; for (p = backends; *p != NULL; p++) if (!strcmp((*p)->name, name)) return *p; return NULL; } Backend *backend_from_proto(int proto) { Backend **p; for (p = backends; *p != NULL; p++) if ((*p)->protocol == proto) return *p; return NULL; }{ const Backend *b = backend_from_proto(cfg->protocol); if (b) p = b->name; { const Backend *b = backend_from_name(prot); if (b) { cfg->protocol = b->protocol; gppi(sesskey, "PortNumber", default_port, &cfg->port); } Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 41735b8f4cc82d118c9496cad4f2ae6f Text-delta-base-sha1: d93739f7a276b669b80e61d029fb6f8adf32b2e8 Text-content-length: 82 Text-content-md5: 9a2b148bd1d47ead362d9afca7c5ab8d Text-content-sha1: 4d97f35cff63988badd600e5c055067f9727b3cd Content-length: 82 SVN����������������1J�+�"ssh", PROT_SSH, 22 }; Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f9698c839aa20edcfb639947afce6372 Text-delta-base-sha1: 996b5261e94ee76c13fb970d22e373a25922881a Text-content-length: 56 Text-content-md5: 601ecb8720c8c815745b0c9e538d141d Text-content-sha1: 83202d79b01a4b64786781087ffbb107f69958c0 Content-length: 56 SVN��3%��"telnet", PROT_TELNET, 23 }; Node-path: putty/testback.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 396e08dac22b2fb20f0dd06efd8b623c Text-delta-base-sha1: ba24976651695edb52c4cc8a863e9356c5b7522e Text-content-length: 47 Text-content-md5: 48c85ae8cb51288fbf23506db5368a10 Text-content-sha1: fc501783926a4ef0faf37ab6266bf28cf4a07519 Content-length: 47 SVN��4����| "null", -1"loop", -1 Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b21031d9488c5d03f8d9e3d0ed3d3baf Text-delta-base-sha1: 70a619219ae9a7c379c3abd4be3e65068e9b6149 Text-content-length: 530 Text-content-md5: c976fbcba416118d1dd4889787dee19f Text-content-sha1: 1e3137becb9c34909c9c26da76bb2058db915622 Content-length: 530 SVN��%+f�*�!�')6�I�+zf (p) { const Backend *b = backend_from_name(p); if (b) { default_protocol = cfg.protocol = b->protocol; default_port = cfg.port = b->default_port;const Backend *b; *r = '\0'; b = backend_from_name(p); if (b) { default_protocol = cfg.protocol = b->protocol; portnumber = b->default_port; } p = r + 1;back = backend_from_proto(cfg.protocol); if (back == NULL) { fprintf(stderr, "Internal fault: Unsupported protocol found\n"); return 1; Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9dbc286f969dd3d6264fcd55391d8a0b Text-delta-base-sha1: 50d2f097340dcef19369cad2e25dd17a92e001d5 Text-content-length: 43 Text-content-md5: bb0942b5321d9b0267e41abda124bedb Text-content-sha1: 7b78b044744b476ae84437815ce90a92713c7ddb Content-length: 43 SVN��n�i�"pty", -1, 1 }; Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9519f9b6759c0a032bd46ea6625b9057 Text-delta-base-sha1: e4f6b001ce1ae73128fcfdcdcbee19bb36afb63b Text-content-length: 244 Text-content-md5: 1704eda317f344af0ca4f6b6991cec0c Text-content-sha1: a875bfb2cff0a756650fd29918d2c0285b414a0c Content-length: 244 SVN��p# [� ��;=)Backend *back = backend_from_proto(cfg->protocol);Backend *b = backend_from_proto(default_protocol); default_port = 0; /* illegal */ if (b) default_port = b->default_port; } return pt_main(argc, argv); } Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4462343eac364792fd9516ef523f596 Text-delta-base-sha1: 5a5ba12c6adf9052b440dbfeb9c1f4be0829326d Text-content-length: 44 Text-content-md5: 396ed44ea498a670726e5f895aa9f49c Text-content-sha1: 20e7fa08136ca2d68d71e29fb3b71691b5d1df71 Content-length: 44 SVN��Gf�B� <"serial", PROT_SERIAL Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8d91fdaf91bccb823a1aae9e0723daa9 Text-delta-base-sha1: 77b4a32de08de0e9baec941a35af9c8c150e1b7b Text-content-length: 418 Text-content-md5: c3f47a047c1787da082e2a58e5a08840 Text-content-sha1: 3a0440ad10aa194fc4a6e44ae2e9e9422508d67e Content-length: 418 SVN����m�%��l9�~Gbackend_from_proto(cfg.protocol);Backend *b = backend_from_proto(default_protocol); default_port = 0; /* illegal */ if (b) default_port = b->default_port;hwnd, WM_VSCROLL, SB_PAGEDOWN, 0); return 0; } if (wParam == VK_NEXT && shift_state == 2) { SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0); return 0; } if (wParam == VK_INSERT && sh�/h��hG Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f7641e7c313a49a372864b78a566c17e Text-delta-base-sha1: 04ceedc7b189de118011f19816022bb1e32affd1 Text-content-length: 515 Text-content-md5: e629f4a8f4a7723c91fdf759a1fd20a1 Text-content-sha1: 7d55415e2430b6f35f1066ba28f2dd0db375e7e6 Content-length: 515 SVN��+9Y���{6�CG� "const Backend *b = backend_from_name(p); if (b) { default_protocol = cfg.protocol = b->protocol; default_port = cfg.port = b->default_port;const Backend *b; *r = '\0'; b = backend_from_name(p); if (b) { default_protocol = cfg.protocol = b->protocol; portnumber = b->default_port; } p = r + 1;back = backend_from_proto(cfg.protocol); if (back == NULL) { fprintf(stderr, "Internal fault: Unsupported protocol found\n"); return 1; Node-path: putty/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a592af3e92db9e7d3b8119e96ef57678 Text-delta-base-sha1: 78e0e3f90e4dea9fc72aae9dc1f2caf3b88f5d9b Text-content-length: 52 Text-content-md5: b0462ddd77fe380c5767d29490c69dad Text-content-sha1: 7d90ae0cbf6606e2cda925e9367fcc04c8706816 Content-length: 52 SVN��6$��"serial", PROT_SERIAL, 1 }; Revision-number: 7629 Prop-content-length: 183 Content-length: 183 K 8 svn:date V 27 2007-07-01T12:11:23.077811Z K 7 svn:log V 83 Reference CVE-2006-7162, note confusion in advisories, emphasise Unix specificity. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/puttygen-unix-perms Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9c6fa3a5e6a6521c164ae7784fc71338 Text-delta-base-sha1: 9089f5601c9062b370499af4aaf75080cf0187e2 Text-content-length: 357 Text-content-md5: eeae31060340af1d7b110cc2595d190d Text-content-sha1: 55b02e6c971747aeefb600ebfff989f05b6d2b80 Content-length: 357 SVN��=�K��-9Summary: Unix 0.59 This issue corresponds to <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-7162">CVE-2006-7162</a>. (Note that some versions of the advisories for this issue incorrectly state that 0.59 is vulnerable. For the avoidance of doubt, this issue only affects 0.58 and prior, and only the Unix version.) Revision-number: 7630 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 Organise links to other software into categories. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-07-01T13:32:13.015542Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e07a0aacb56873c0fdc7b0f295b7513c Text-delta-base-sha1: 8d585884b44454643e7ed5fb6830a998b3f609fa Text-content-length: 2341 Text-content-md5: 9e65558563f65e13bbf87f06566857a0 Text-content-sha1: 798560d0313728b895876e689032155f0b4692f5 Content-length: 2341 SVN��%x���K$�Y7�1��>� X�)c� n�K��Y7� Bf�Wbb�v)h�l� h�p�8�xA�}O�j�u7�nr� m�2�A,�cM�aD <li>Clients for various operating systemssshdos.sourceforge.net/"> SSHDOS</a>, SSH, SCP, SFTP and Telnet client for MS-DOS </ul> <li><a href="wishlist/gui-sftp.html">Frontends</a> for file transfer <ul>/ul> <li>Port forwarding and VPN</li> <ul>/ul> <li><a href="wishlist/i18n.html">Internationalised and localised</a> versions <ul>/ul> <li><a href="wishlist/kerberos-gssapi.html">Kerberos/GSSAPI support</a> <ul> <li><a href="http://www.certifiedsecuritysolutions.com/downloads.html"> certifiedsecuritysolutions.com</a> <li><a href="http://rc.vintela.com/topics/putty/"> Vintela PuTTY</a>GSSAPI support via the Windows SSPI (no source) </ul> <li><a href="wishlist/smartcard-auth.html">Smartcard support</a> <ul> <li>Several different patches PuTTY SC</a> </ul> <li><a href="wishlist/config-locations.html">Settings storage in files</a> <ul>/ul> <li><a href="wishlist/url-launching.html">URL recognition</a> <ul> <li><a href="http://www.groehn.net/nutty/"> Nutty</a> (not actively developed) </ul> <li>Minimise to the <a href="wishlist/system-tray.html">system tray</a> <ul> <li><a href="http://www.xs4all.nl/~whaa/putty/"> PuTTY Tray</a> </ul> <li><a href="wishlist/transparency.html">Transparency</a> <ul> <li><a href="http://cprogramming.hu/transputty/"> transputty</a> <li><a href="http://www.covidimus.net/projects/putty/putty.php"> Patch at covidimus.net</a> <li><a href="http://x86code.com/putty-transparent.zip"> Patch at x86code.com</a> (diff <a href="http://x86code.com/putty-transparent.diff">here</a>). </ul> <li>Various combinations of the above <ul> <a href="wishlist/serial-backend.html">serial backend</a> (this dates from before PuTTY had its own/ul> www.starnet.com/"> StarNetSSH</a>, an integration with the X-Win32 X server </ul> <h3>Other related software</h3> <ul> <li><a href="wishlist/gui-sftp.html">Frontends</a> for file transfer/ul> <li>Port forwarding and VPN</li> <ul>/ul> <li>Saved session management <ul>/ul> <li><a href="wishlist/multiple-connections.html">Multiple connection</a> management (including tabbing) <ul><a href="wishlist/terminal-fanout.html">multiple PuTTY windows at once</a> Revision-number: 7631 Prop-content-length: 268 Content-length: 268 K 8 svn:date V 27 2007-07-01T14:52:05.252245Z K 7 svn:log V 167 Cross-link from Links page and wishlist, and attempt to centralise URLs on the Links page so we they don't get out of sync. Various refreshments and additional links. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e65558563f65e13bbf87f06566857a0 Text-delta-base-sha1: 798560d0313728b895876e689032155f0b4692f5 Text-content-length: 1263 Text-content-md5: 5c0a9bacc0d843cb5ad475e5d6fecd27 Text-content-sha1: 0946e43faedd9b7aa40bac70521b566fef4b5408 Content-length: 1263 SVN��J��K�C�tL�A0�Z d�#sD�"�MH�<F�F+� (discontinued) <li>Another <a href="http://www.mobileyes.com/index.php?option=com_content&task=view&id=23&Itemid=51"> PuTTY for UIQ</a> <li><a href="http://coredump.fi/putty"> PuTTY for Symbian UIQ3PuTTYkj.html"> PuTTYjp</a>, with ISO-2022 supportthis code is now <a href="wishlist/bidi.html">included</a> in our releasesquest.com/topics/putty/"> Quest PuTTY</a> (formerly Vintela PuTTY) <li><a href="http://sweb.cz/v_t_m/#putty"> sweb.cz</a> patch for Windows and UnixThe <a href="http://www.opensc-project.org/scb/">Smart Card Bundle</a> is a packaged version of some of the patches found at <a href="http://www.opensc-project.org/files/contrib/">opensc-project.org</a> <li>PuTTYcard can <em>also</em> be found at <a href="http://www.opensc-project.org/files/contrib/">opensc-project.org</a>, but doesn't use OpenSC (updated <a href="http://www.cs.helsinki.fi/u/mxkoskin/">here</a>)web.gccazproducts/StarNetSSHSecure iXplorer, a GUI SFTP client; there are in <a href="http://www.i-tree.org/gpl/ixplorer.htm"> GPL</a> and <a href="http://www.i-tree.org/secixpro/index.htm"> commercial ("Pro")</a> versionspeople.defora.org/~khorben/projects/gputty/ Node-path: putty-wishlist/data/config-locations Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff69fe6458cfb58398a0ebbfb71003e0 Text-delta-base-sha1: 4a8434f7cc5f2b1a75b1314a12b1a7e8fa27d962 Text-content-length: 227 Text-content-md5: 29e94d7432bcee7ab4576c64ddd996cb Text-content-sha1: fce496e97468644dcc798d4c41437b2e16814b66 Content-length: 227 SVN��1P�1�P <p> Some people have got fed up waiting for us to sort the design issues out, and made forks of PuTTY which store settings in files; some of these can be found on our <a href="../links.html">Links page</a>. Node-path: putty-wishlist/data/i18n Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b59101351d215fed7317f5292f25cba5 Text-delta-base-sha1: 0883672016e2a584094f6e9595232eadfecad265 Text-content-length: 116 Text-content-md5: e42d53c971d63581f6abacdccbd900fe Text-content-sha1: f7ef1f49452a053a9f7dc588d8d5d6bd93afaff8 Content-length: 116 SVN��fnY��� S�myPuTTYjp on our <a href="../links.html">Links page</a> <a href="port-wince.html">WinCE</a> Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a9417041be42b06d31d636e47c57c9a Text-delta-base-sha1: 9273cbeb7506fdb1a32ac7481b3e1a2822af6756 Text-content-length: 217 Text-content-md5: 65b5ac478cbd77514ddbab5586d6850c Text-content-sha1: 71bea34b84e472b3e4a7d4298a21d7c0cfad8481 Content-length: 217 SVN��}]5�6��:�,a� q (links are on our <a href="../links.html">Links page</a>): <ul> <li>Certified Security Solutions have a patched version of PuTTYfrom sweb.cz: Quest PuTTY (formerly Vintela PuTTY) Node-path: putty-wishlist/data/many-sessions Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 47144b8d58c6e8a81611bacb42365dee Text-delta-base-sha1: c6339ac73f38b8fc0101b77d7582717eec5cf63b Text-content-length: 157 Text-content-md5: 23dc9fc0c2e175c0bb337dd1a3d998d1 Text-content-sha1: 579878e662a46a10a6ff2ceaf2b3cd1c5aa65e2e Content-length: 157 SVN��Bt�G��)@ <p> There are various third-party forks and tools which try to address this problem on our <a href="../links.html">Links page</a> Node-path: putty-wishlist/data/multiple-connections Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e65f4a79d6710d6696e9331291f7802 Text-delta-base-sha1: bc74cb9acf49ec274a65a2afa042c987fd2839c4 Text-content-length: 134 Text-content-md5: 718cbbb872ea5fe967f65e1d54611065 Text-content-sha1: 6c8651953c104fa7b6198a89e307db253cbd483c Content-length: 134 SVN��9k��_�I`�n-other third-party tools to do this sort of thing on our <a href="../links.html">Links page</a>.was once to Node-path: putty-wishlist/data/no-terminal-window Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f4fab6d5d757d833e37138a093e6d79 Text-delta-base-sha1: 014d475ed2fa50bd933820e5af5e18e5ff956c07 Text-content-length: 57 Text-content-md5: 0050c76a9e6a4565b501d2f12b3ba2de Text-content-sha1: 1e037f51d7bc885ede344ca06480e2b68d3ab63a Content-length: 57 SVN��")�y� <a href="../links.html">Links page</a>. Node-path: putty-wishlist/data/port-wince Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6b51f423334171e41e80143f582bedb7 Text-delta-base-sha1: 172e9fe90c89663d53b67b7692b20d94f3e8c0d2 Text-content-length: 85 Text-content-md5: f0ed1690cbf6573229a5e8e6ac5d7bb2 Text-content-sha1: c9add4db17c52e283608d02f532d88d15a345f2c Content-length: 85 SVN��~:<���C=�<Bcalled PocketPuTTY on our <a href="../links.html">Links page Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 51d35c4a3599d8894a04ef8ae6a075f9 Text-delta-base-sha1: f35e745db8637697a3093137076e5fbb8fbd8ac2 Text-content-length: 169 Text-content-md5: 8da43a62b8c3a7002dbfb331304a719f Text-content-sha1: 01cae47d644cb945a346a3bfe4df6544e064edab Content-length: 169 SVN��iM ���J�e; (links are on our <a href="../links.html">Links page</a>)re is a packaged version called the Smart Card BundlePuTTY SC uses PKCS#11. </ul> Node-path: putty-wishlist/data/system-tray Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cb98927e9a1da93b282097ffa3865da Text-delta-base-sha1: 0c32476593ac96c6affd8514e76a89da1212fac2 Text-content-length: 139 Text-content-md5: 22af5ea1daa20fc7468c141c3e0ca6b2 Text-content-sha1: ab5587c76d718faefff180785f7bc7d0349bbe5c Content-length: 139 SVN�� z��z <p> There are also third-party versions of PuTTY which do this directly; see our <a href="../links.html">Links page</a>. Node-path: putty-wishlist/data/terminal-fanout Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 158615ea3393e112ef59e3fa9471f312 Text-delta-base-sha1: ee841120eaffdcd2bb86ab534132e0d075d7afa5 Text-content-length: 84 Text-content-md5: 5a3e812dd1b34c72c61dae1d6b7fd3fd Text-content-sha1: 22173a5d2b2e832b8d80a620cd884982b306e89e Content-length: 84 SVN�� ?�7��&oPuTTY Command Sender, on our <a href="../links.html">Links page Node-path: putty-wishlist/data/url-launching Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30d02719cd7c997333a3e352e8e42cb3 Text-delta-base-sha1: 284ad757584e7c22b331babfc7b02f270cba8ad2 Text-content-length: 75 Text-content-md5: 8683f463ce68b3c0156599eada532947 Text-content-sha1: 8c27ec1001407280c1acfacc49342148bb6dfc20 Content-length: 75 SVN��!' 6���l5Nutty (see our <a href="../links.html">Links page</a>) Node-path: putty-wishlist/data/win-command-prompt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9a91e646e6b344e483acd2f0cff4cf71 Text-delta-base-sha1: be029d14c70726321b26ed689f20a04e353fc485 Text-content-length: 78 Text-content-md5: 5534b0701d1cff90c9d805af4748048b Text-content-sha1: 8dcd2aa90be3e352933cfe7d62c846922c60acb7 Content-length: 78 SVN�� } 9�O��uPuTTYcyg (link on <a href="../links.html">Links page</a>) Node-path: putty-wishlist/data/win64 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 10195023165e3efb5f09a1627ac78cd2 Text-delta-base-sha1: c5e1a7c49d1846a43db465841fdda0ad7cf0e635 Text-content-length: 95 Text-content-md5: d246efd665755211bb34e0719f3b5145 Text-content-sha1: 221e81a27929401e59e1ae0fe048b8942f4466ec Content-length: 95 SVN��IN�G�N There is a third-party build on our <a href="../links.html">Links page</a>.) Node-path: putty-wishlist/data/zmodem Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c8365d676032197e122a6aa0c73b9c8f Text-delta-base-sha1: 4f9c92b3c7f728e90da09393c6daa7b863a230b7 Text-content-length: 123 Text-content-md5: 201e9588fd5b1478853972f55cfaeea3 Text-content-sha1: 20d61d0138dbe56d62073fd3f174ec85d6a2a0ec Content-length: 123 SVN��[Ej�[�j <p> There is a third-party implementation called Le Putty on our <a href="../links.html">Links page</a>. Revision-number: 7632 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2007-07-01T14:54:36.324437Z K 7 svn:log V 27 We now implement RFC 4432. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c0a9bacc0d843cb5ad475e5d6fecd27 Text-delta-base-sha1: 0946e43faedd9b7aa40bac70521b566fef4b5408 Text-content-length: 52 Text-content-md5: ceddfe9809c126f578928f55e8be5475 Text-content-sha1: 370cb3b4f4b1f1706b9e45ebd664aac37b9650c4 Content-length: 52 SVN�� �k���432.txt"> RFC 4432: RSA Key Revision-number: 7633 Prop-content-length: 128 Content-length: 128 K 7 svn:log V 28 Mention our own Gtk 2 port. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-07-01T14:55:49.325633Z PROPS-END Node-path: putty-wishlist/data/port-unix-gtk2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 44a5996ed30929fa445d535a19713309 Text-delta-base-sha1: 8b995c15b0cb5e7783e90f10a54d3360372aee56 Text-content-length: 98 Text-content-md5: 65d28c184b8d95f8234b8d4355b64e34 Text-content-sha1: 09ff0192cb03277c4357be3bb50a39dfe74d5560 Content-length: 98 SVN��S$Q�S�Q We've also been working on this; see svn://ixion.tartarus.org/main/putty-gtk2 . Revision-number: 7634 Prop-content-length: 265 Content-length: 265 K 8 svn:date V 27 2007-07-01T15:41:09.203456Z K 7 svn:log V 164 Remove port number validation from Windows PuTTY -- it could cause unnecessary trouble with serial connections, and a port number of zero gets caught later anyway. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c3f47a047c1787da082e2a58e5a08840 Text-delta-base-sha1: 3a0440ad10aa194fc4a6e44ae2e9e9422508d67e Text-content-length: 293 Text-content-md5: a913cbd27281778834870484cc4d3e25 Text-content-sha1: 1416951eeb6dfdff222b3beb17126fb47806add0 Content-length: 293 SVN���� y�A��F:yift_state == 1) { term_do_paste(term); return 0; } if (left_alt && wParam == VK_F4 && cfg.alt_f4) { return -1; } if (left_alt && wParam == VK_SPACE && cfg.alt_space) { SendMessage(hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0); ret�ho��oy Revision-number: 7635 Prop-content-length: 452 Content-length: 452 K 7 svn:log V 351 Implement Marcin Bulandra's suggestion of only automatically updating the port number in the GUI when the connection type is changed if the current port number is the standard one for the current protocol. It's not perfect, but it should make the common case of tabbing through the Session panel easier when starting non-SSH connections on odd ports. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-07-01T15:47:31.171878Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 94c1c0df7c7c88e069bfd4f3f1b3862c Text-delta-base-sha1: 89bdd3484f4eaaa910fb3f994d4df4281ef93267 Text-content-length: 656 Text-content-md5: 4d907cf1b14a45f80d9f5333a3118286 Text-content-sha1: fac5d016d6853cd40db56f9cee183f4017e8efc3 Content-length: 656 SVN��T3p�*��f3p�3!Backend *ob = backend_from_proto(oldproto); Backend *nb = backend_from_proto(cfg->protocol); assert(ob); assert(nb); /* Iff the user hasn't changed the port from the protocol * default (if any), update it with the new protocol's * default. * (XXX: this isn't perfect; a default can become permanent * by going via the serial backend. However, it helps with * the common case of tabbing through the controls in order * and setting a non-default port.) */ if (cfg->port == ob->default_port && cfg->port > 0 && nb->default_port > 0) cfg->port = nb->default_port; Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bd7e80128642c5d99053b81626f02699 Text-delta-base-sha1: b9716f0592ad807ab38e4e5a0cc66f6664ceeaae Text-content-length: 21 Text-content-md5: 49a49f58bfe263c84c939bc9f9cd9dde Text-content-sha1: 646034945d0fdaa5cefc1f39e5cceebb8f8e486f Content-length: 21 SVN��MM�H�0 }; Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a52bac411971bd9198c76aeca5a282fc Text-delta-base-sha1: d8d0b0fd25c085ae095f5abcd75c537d19ddbd0c Text-content-length: 23 Text-content-md5: 7ea8592b5901979aaeb7443c077700a3 Text-content-sha1: 9d619a775c5ba6e2f82ac274e159b1c1db4d0a7c Content-length: 23 SVN��EG�@�513 }; Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bb0942b5321d9b0267e41abda124bedb Text-delta-base-sha1: 7b78b044744b476ae84437815ce90a92713c7ddb Text-content-length: 24 Text-content-md5: dda51288bc9330a9789a172d4187071e Text-content-sha1: b2775501ad7a947e004b36fccab8c332082e9c42 Content-length: 24 SVN�� �|�}0 Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 396ed44ea498a670726e5f895aa9f49c Text-delta-base-sha1: 20e7fa08136ca2d68d71e29fb3b71691b5d1df71 Text-content-length: 21 Text-content-md5: 33ff012a3438a52be040726ee90fc6d5 Text-content-sha1: 646a20ac5ce086f88209f46b2bc9af132abc8458 Content-length: 21 SVN��ff�a�0 }; Node-path: putty/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b0462ddd77fe380c5767d29490c69dad Text-delta-base-sha1: 7d90ae0cbf6606e2cda925e9367fcc04c8706816 Text-content-length: 21 Text-content-md5: 0900423a410f648429fb4afe0e807d81 Text-content-sha1: a73583522a80667f0f67cbe2939777c7660a77b6 Content-length: 21 SVN��66�1�0 }; Revision-number: 7636 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-07-05T23:35:48.390875Z PROPS-END Revision-number: 7637 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-07-10T23:35:20.635237Z PROPS-END Revision-number: 7638 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2007-07-14T20:19:47.528530Z K 7 svn:log V 42 A suggestion I just read (and then lost). K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/env-passthrough Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 356 Text-content-md5: e93bb06955dd59d516051cba6f64d3ae Text-content-sha1: 95f7d73092e7adb920f09baa5750dd83a255ee0d Content-length: 366 PROPS-END SVN���VVVSummary: Option to pass through certain environment variables Class: wish Difficulty: fun Priority: low Content-type: text/plain It's been suggested that it would be useful if PuTTY, in addition to being able to pass fixed values of environment variables to servers, could also pass through the values of variables from its own environment. Revision-number: 7639 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-07-18T23:35:24.136269Z PROPS-END Revision-number: 7640 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2007-07-18T22:25:00.902498Z K 7 svn:log V 29 Bug report from Jano Osusky. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/psftp-assert-lp64be Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 478 Text-content-md5: 632d6bcaf15a337f6c765d82075ca2fc Text-content-sha1: f0ff431f2cd995c13b0f1bf4546422dc557aa11e Content-length: 488 PROPS-END SVN���PPPSummary: PSFTP doesn't work on big-endian 64-bit systems Class: bug Difficulty: fun Present-in: 0.60 Content-type: text/plain When compiled as a 64-bit application on Solaris 10, PSFTP fails on assert (rreq == req) in file psftp.c, function do_sftp_init(). This doesn't happen if it's compiled 32-bit. A crude replacement of all instances of "unsigned long" with "uint32" (equivalent to "unsigned int") throughout psftp.c and psftp.h makes the problem go away. Revision-number: 7641 Prop-content-length: 110 Content-length: 110 K 8 svn:date V 27 2007-07-18T22:40:21.272197Z K 7 svn:log V 12 Prioritise. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/psftp-assert-lp64be Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 632d6bcaf15a337f6c765d82075ca2fc Text-delta-base-sha1: f0ff431f2cd995c13b0f1bf4546422dc557aa11e Text-content-length: 33 Text-content-md5: 8a0198a51e1d30d93fa2d58a64a168b3 Text-content-sha1: c398ab370b40752602414f2f48485751d73a976e Content-length: 33 SVN��Pa�V��}Siority: medium Revision-number: 7642 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2007-07-18T22:54:31.337082Z K 7 svn:log V 28 Update an outdated comment. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9a2b148bd1d47ead362d9afca7c5ab8d Text-delta-base-sha1: 4d97f35cff63988badd600e5c055067f9727b3cd Text-content-length: 70 Text-content-md5: 25b8a74b8565c6bdd1958fc6b78d2942 Text-content-sha1: 924a946094e618289445d7a4a4170cc774d0cd66 Content-length: 70 SVN���� ���jRecord����~� l�JL�J�y_ Revision-number: 7643 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-07-19T23:35:20.358382Z PROPS-END Revision-number: 7644 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-07-19T23:35:20.469902Z PROPS-END Revision-number: 7645 Prop-content-length: 454 Content-length: 454 K 7 svn:log V 355 Separate out the code for creating and sending SSH version strings so that in the SSH-2-only case, we can send it as soon as we connect rather than waiting for the server's one. Unfortunately, actually doing so will take a little more effort -- there are subtleties to do with having a working log context at the right moment that need to be sorted out. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-07-19T23:53:02.226300Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25b8a74b8565c6bdd1958fc6b78d2942 Text-delta-base-sha1: 924a946094e618289445d7a4a4170cc774d0cd66 Text-content-length: 2760 Text-content-md5: 2811c1203eadc4e29b6a5ec827473bba Text-content-sha1: 7c385a94300d9cea2983675094221dadc6fe4a9b Content-length: 2760 SVN����!A�P�a�L�[KY� [/* * Send an appropriate SSH version string. */ static void ssh_send_verstring(Ssh ssh, char *svers) { char *verstring; if (ssh->version == 2) { /* * Construct a v2 version string. */ verstring = dupprintf("SSH-2.0-%s\015\012", sshver); } else { /* * Construct a v1 version string. */ verstring = dupprintf("SSH-%s-%s\012", (ssh_versioncmp(svers, "1.5") <= 0 ? svers : "1.5"), sshver); } ssh_fix_verstring(verstring); if (ssh->version == 2) { size_t len; /* * Record our version string. */ len = strcspn(verstring, "\015\012"); ssh->v_c = snewn(len + 1, char); memcpy(ssh->v_c, verstring, len); ssh->v_c[len] = 0; } logeventf(ssh, "We claim version: %.*s", strcspn(verstring, "\015\012"), verstring); s_write(ssh, verstring, strlen(verstring)); sfree(verstring); * If the SSH version number's fixed, set it now, and if it's SSH-2, * send the version string too. * * XXX This isn't actually early enough to be useful, since we only * get here when the first incoming byte turns up. */ if (ssh->cfg.sshprot == 0) ssh->version = 1; if (ssh->cfg.sshprot == 3) { ssh->version = 2; ssh_send_verstring(ssh, NULL); }if (s->proto2 && (ssh->cfg.sshprot >= 2 || !s->proto1)) ssh->version = 2; else ssh->version = 1; logeventf(ssh, "Using SSH protocol version %d", ssh->version); /* Send the version string, if we haven't already */ if (ssh->cfg.sshprot != 3) ssh_send_verstring(ssh, s->version); if (ssh->version == 2) { size_t len; /* * Record their version string. */ len = strcspn(s->vstring, "\015\012"); ssh->v_s = snewn(len + 1, char); memcpy(ssh->v_s, s->vstring, len); ssh->v_s[len] = 0; /* * Initialise SSH-2 protocol. */ ssh->protocol = ssh2_protocol; ssh2_protocol_setup(ssh); ssh->s_rdpkt = ssh2_rdpkt; } else { /* * Initialise SSH-1 protocol. */ ssh->protocol = ssh1_protocol; ssh1_protocol_setup(ssh); ssh->s_rdpkt = ssh1_rdpkt; } if (ssh->version == 2) do_ssh2_transport(ssh, NULL, -1, NULL����h� count */ len += ssh1_bignum_length(s->key.exponent); len += ssh1_bignum_length(s->key.modulus); len += ssh1_bignum_length(s->challenge); len += 16; /* session id */ len += 4; /* response format */ agentreq = snewn(4 + len, char); PUT_32BIT(agentreq,�Ld�L�nable to load private key file " "\"%.150s\" (%s)\r\n", filename_to_str(&ssh->cfg.keyfile), error); c_write_str(ssh, msgbuf); sfree(msgbuf); } } else { char *msgbuf; logeventf(ssh, "Unable to use this key file (%s)", ke Revision-number: 7646 Prop-content-length: 428 Content-length: 428 K 7 svn:log V 329 Arrange that log_packet() isn't called for raw data logging if logctx is null. This allows us to send data in ssh_init(), albeit at the expense of its not being properly logged, so arrange to send the version string then if that's sensible, which should reduce the number of round-trips required to bring up an SSH-2 connection. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-07-21T13:43:57.658575Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2811c1203eadc4e29b6a5ec827473bba Text-delta-base-sha1: 7c385a94300d9cea2983675094221dadc6fe4a9b Text-content-length: 384 Text-content-md5: 127be8f3f48cb7faf0c8720d49cca116 Text-content-sha1: a1f822c9c4a4ef59039b132d8f5856984185788f Content-length: 384 SVN����/D�x��@x�wGU�C|�v6�2�A?]if (ssh->logctx) if (ssh->logctx) log_packet(ssh->logctx, PKT_INCOMING, -1, NULL, data, datalen, count */ len += ssh1_bignum_length(s->key.exponent); len += ssh1_bignum_length(s->key.���]�#]]nable to load private key file " "\"%.150s\" (%s)\r\n", filename_to_str�d��] Revision-number: 7647 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2007-07-21T21:39:36.804968Z K 7 svn:log V 213 Split pkt_ctx into a separate enumeration for each of kex and userauth instead of a bitfield for both. This doesn't gain much here, but it should make it easier to make things other than logging use the context. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 127be8f3f48cb7faf0c8720d49cca116 Text-delta-base-sha1: a1f822c9c4a4ef59039b132d8f5856984185788f Text-content-length: 1649 Text-content-md5: 59df2e4cb5a0ed3fbb878b97c2b9e162 Text-content-sha1: b6dc41c1d567a13aa4f7c8225fcb48825a0119a7 Content-length: 1649 SVN����?�D�y�/#n�Kv�;Ig�`kQ�!�E�'h�2typedef enum { SSH2_PKTCTX_NOKEX, SSH2_PKTCTX_DHGROUP, SSH2_PKTCTX_DHGEX, SSH2_PKTCTX_RSAKEX } Pkt_KCtx; typedef enum { SSH2_PKTCTX_NOAUTH, SSH2_PKTCTX_PUBLICKEY, SSH2_PKTCTX_PASSWORD, SSH2_PKTCTX_KBDINTER } Pkt_ACtx;k(x,ctx) if (type == x && (pkt_kctx == ctx)) return #x #define translatea(x,ctx) if (type == x && (pkt_actx ==Pkt_KCtx pkt_kctx, Pkt_ACtx pkt_ak(SSH2_MSG_KEXDH_INIT, SSH2_PKTCTX_DHGROUP); translatek(SSH2_MSG_KEXDH_REPLY, SSH2_PKTCTX_DHGROUP); translatek(SSH2_MSG_KEX_DH_GEX_REQUEST, SSH2_PKTCTX_DHGEX); translatek(SSH2_MSG_KEX_DH_GEX_GROUP, SSH2_PKTCTX_DHGEX); translatek(SSH2_MSG_KEX_DH_GEX_INIT, SSH2_PKTCTX_DHGEX); translatek(SSH2_MSG_KEX_DH_GEX_REPLY, SSH2_PKTCTX_DHGEX); translatek(SSH2_MSG_KEXRSA_PUBKEY, SSH2_PKTCTX_RSAKEX); translatek(SSH2_MSG_KEXRSA_SECRET, SSH2_PKTCTX_RSAKEX); translateka(SSH2_MSG_USERAUTH_PK_OK, SSH2_PKTCTX_PUBLICKEY); translatea(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, SSH2_PKTCTX_PASSWORD); translatea(SSH2_MSG_USERAUTH_INFO_REQUEST, SSH2_PKTCTX_KBDINTER); translateaPkt_KCtx pkt_kctx; Pkt_ACtx pkt_akctx, ssh->pkt_actx, kctx, ssh->pkt_a���#f�-��RI� �7-�\im_length(s->key.exponent); len += ssh1_bignum_length(s->key.kctx = SSH2_PKTCTX_NOKEXkctx kctx kctx �K5A���o1�=�\��% �|_� @�w "\"%.150s\" (%s)\r\n", filename_to_stractx = SSH2_PKTCTX_NOAUTHactx = SSH2_PKTCTX_NOAUTHactx actx actx actx kctx = SSH2_PKTCTX_NOKEX; ssh->pkt_actx = SSH2_PKTCTX_NOAUTH Revision-number: 7648 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2007-07-22T14:34:27.121994Z K 7 svn:log V 35 Note lack of proxy auto-detection. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 71aaae34b1b21fd9719d17ff20fbdf5d Text-delta-base-sha1: e83f2ef7d4933bb4738a45f65c03135cb8d7d54b Text-content-length: 550 Text-content-md5: 7626a37f27328c37f0915cb10a9f49d3 Text-content-sha1: 1445af2379d90a5fcf4bfdd00aeecc874360e514 Content-length: 550 SVN����y��y�mNote that unlike some software (such as web browsers), PuTTY does not attempt to automatically determine whether to use a proxy and (if so) which one to use for a given destination. If you need to use a proxy, it must always be explicitly configured�95||�9�u should have trouble with it. \S{config-ssh-agentfwd} \q{Allow \i{agent forwarding}} \cfg{winhelp-topic}{ssh.auth.agentfwd} This option allows the SSH server to open forwarded connections back to your local copy of \i{Pageant}. If you are not runni Revision-number: 7649 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2007-07-25T21:56:19.759011Z K 7 svn:log V 59 Anthony Thomson's strange problem with his Tandberg codec. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-dropbear-ignore Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1125 Text-content-md5: 29e3cc269f13dc65b9fa7dc22201e942 Text-content-sha1: 1648a11ce9fc7347da80e315b37e769d6cb4cf7f Content-length: 1135 PROPS-END SVN���WWWSummary: An embedded version of Dropbear gets confused by SSH_MSG_IGNORE Difficulty: taxing Absent-in: 0.58 Present-in: 0.60 Content-type: text/x-html-body <p>We've had a report of a problem with SSH-2 connections to a Tandberg video conferencing codec running what claims to be "dropbear_0.45". The codec announces itself as "TANDBERG Codec Release F6.0 NTSC / SW Release Date: 2007-04-27". <p>The connection ends up using a CBC cipher mode, and the codec drops the TCP connection after receiving the first empty SSH_MSG_IGNORE from PuTTY. This problem doesn't affect PuTTY 0.58 because it doesn't send such messages. A version of PuTTY clobbered to never send SSH_MSG_IGNORE works, as does 0.56 (modulo an independent bug), despite the latter's sending non-zero-size SSH_MSG_IGNOREs along with SSH_MSG_USERAUTH_REQUEST. <p>This problem doesn't seem to occur with vanilla <a href="http://matt.ucc.asn.au/dropbear/dropbear.html">Dropbear</a> 0.45. <p>A bug-compatibility option could be added to deal with this, but it's not very clear either what systems are affected or what the limits of the bug are. Revision-number: 7650 Prop-content-length: 116 Content-length: 116 K 7 svn:log V 18 A bug and a wish. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-07-26T22:20:00.276959Z PROPS-END Node-path: putty-wishlist/data/log-formatted Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 677 Text-content-md5: ea95cc2a0a3f709d4160ff25ced0b6f1 Text-content-sha1: cdc1970da99ddcb4b573cae04053fb7f4d54b700 Content-length: 687 PROPS-END SVN���Summary: Logging formatted terminal output Class: wish Difficulty: tricky Content-type: text/plain A user wrote: >Are you interested in adding a new "logging" option that would write >formatted output to the log file (as if it had been screen-scraped or >cut/pasted)? It's certainly something I think we ought to have. How would you suggest doing it? The obvious approach is to log each line as it gets pushed into the scrollback, but this might get a bit awkward when the window gets enlarged (which pulls lines back _out_ of the scrollback). It also wouldn't log full-screen applications that don't scroll the screen, but I'm not sure you'd want to. Node-path: putty-wishlist/data/pscp-start-hang Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 624 Text-content-md5: 2b33e019875669258b79d5b28c9f8820 Text-content-sha1: 05b3ea51d701e032d61335fecb078ecd944d4122 Content-length: 634 PROPS-END SVN���bbbSummary: PSCP can throw away the start of an SCP session and hang waiting for it Class: bug Priority: medium Difficulty: fun Content-type: text/plain If an SCP server sends data (the initial zero byte of an SCP session) too early, it can get processed by from_backend() before ssh_scp_recv() has started and hence before outptr is set. This causes the data to be discarded, and PSCP to hang forever waiting for the handshake it's already received. The obvious fix it to simply remove the check for (!outptr) in from_backend() and depend on the correct handling of (outlen == 0), but this hasn't been tested. Revision-number: 7651 Prop-content-length: 313 Content-length: 313 K 7 svn:log V 214 Don't throw away data that we receive before we're ready for it. Just save it up for later. This should prevent hangs when talking to particularly enthusiastic servers. Thanks to JCA for tracking this bug down. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-07-29T14:02:00.191648Z PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9592977ce6697ff95cf3b41398f6c78b Text-delta-base-sha1: 5aa95f8cf11c02d877b0b3edc6684361f517bd5b Text-content-length: 23 Text-content-md5: 9bf9cf06058001c083d6b2ae4dce4a60 Text-content-sha1: e9eee61e717db04f5b27c82a47cac0ec18cf723e Content-length: 23 SVN��v �� ��u Revision-number: 7652 Prop-content-length: 104 Content-length: 104 K 7 svn:log V 7 Fixed. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-07-29T14:04:48.972771Z PROPS-END Node-path: putty-wishlist/data/pscp-start-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b33e019875669258b79d5b28c9f8820 Text-delta-base-sha1: 05b3ea51d701e032d61335fecb078ecd944d4122 Text-content-length: 74 Text-content-md5: 28092fd04a6967ca03f675ac579adb64 Text-content-sha1: 545f994508c7e46ff2e01d52b3bc070deeb7ac38 Content-length: 74 SVN��bx 5���-Present-in: 0.58 0.59 0.60 Fixed-in: r7651 2007-07-30 Revision-number: 7653 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2007-07-29T14:17:26.626853Z K 7 svn:log V 47 Add a link to Peter Koch's sc-enabled Pageant. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ceddfe9809c126f578928f55e8be5475 Text-delta-base-sha1: 370cb3b4f4b1f1706b9e45ebd664aac37b9650c4 Text-content-length: 103 Text-content-md5: 325b079260a1732f524cfea8df814113 Text-content-sha1: ef0d73badaec3b0a45c173ef21a51a6c1bc5f0ec Content-length: 103 SVN��t O�H�O�]B<a href="http://smartcard-auth.de/ssh-en.html">A smartcard-enabled Pageant</a Revision-number: 7654 Prop-content-length: 140 Content-length: 140 K 10 svn:author V 3 ben K 8 svn:date V 27 2007-07-29T14:20:37.336693Z K 7 svn:log V 42 reference Peter Koch's smartcard pageant. PROPS-END Node-path: putty-wishlist/data/smartcard-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8da43a62b8c3a7002dbfb331304a719f Text-delta-base-sha1: 01cae47d644cb945a346a3bfe4df6544e064edab Text-content-length: 121 Text-content-md5: e5f2be70f0b88c0321c7bfa5fa06807d Text-content-sha1: 1779589bf3c6dbbcdf6de9b399efd238bec0c067 Content-length: 121 SVN��M8 e�0�e#*<tt><1673247798@web.de></tt> <br>... which was replaced by a directly smartcard-enabled Pageant Revision-number: 7655 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-07-31T23:35:19.067432Z PROPS-END Revision-number: 7656 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-07-31T23:35:19.154918Z PROPS-END Revision-number: 7657 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2007-08-02T20:14:05.968364Z K 7 svn:log V 51 Fix missing commas, thanks to Patrick J. LoPresti. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/terminfo Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ccb4f8af4a5800d06252279e15b552ab Text-delta-base-sha1: 6e8ad6146554cd276188f328ae9c0c16bdd5cb3e Text-content-length: 76 Text-content-md5: 0f4db8cc8ac597cbb5120621feabdcd3 Text-content-sha1: 3009ce6a986f0d8df0cfd85d9f8d4349018eb892 Content-length: 76 SVN��#)1� ��u6�x+, hpa=\E[%i%p1%dG, cud=\E[%p1%dB, cud1=\E[B, , Revision-number: 7658 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2007-08-02T20:27:15.189836Z K 7 svn:log V 47 Another awkward server, from Boudewijn Visser. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/portfwd-invalid-origin Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99206d38083ec741b0c8780a1d368a41 Text-delta-base-sha1: aa1c2ebef7d3fa73f4f14b3334a172dca520257b Text-content-length: 142 Text-content-md5: 818e5765f66a4f344abee58d24422fde Text-content-sha1: 6c9676850721e2118ba0c10a0c636cf2a637cc17 Content-length: 142 SVN��Dz x���~wh, and also with F-Secure SSH for Unix, version 3.1.0. Using <tt>0.0.0.0</tt> instead appears to mollify these servers. Revision-number: 7659 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2007-08-02T20:31:38.894654Z K 7 svn:log V 51 Explain how this is configured on the server side. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/zlib-openssh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cfcd5b9b3d1a593f7af03f60597d6371 Text-delta-base-sha1: e5108b9529de65a1d346acdb70b30a9b15467ae5 Text-content-length: 206 Text-content-md5: d9bf408ea144fe4edc2f6c702e2f80c7 Text-content-sha1: 336787881985bb1c0c67f8adc26e3f8b918b29c4 Content-length: 206 SVN��Iv1�&�1�)�A It's configured to use this by default (or with the "Compression delayed" option), but ordinary "zlib" compression can be reinstated with "Compression yes". <p> The new method Revision-number: 7660 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-04T23:35:18.224443Z PROPS-END Revision-number: 7661 Prop-content-length: 403 Content-length: 403 K 7 svn:log V 304 Tweak to window handling: Keep the local window in a signed integer, and arrange to handle usefully the case where the server sends us more data than it's allowed to. There's no danger of overflow, since the maximum is OUR_V2_WINSIZE and the minimum is -OUR_V2_MAXPKT (at least if the server is nice). K 10 svn:author V 3 ben K 8 svn:date V 27 2007-08-04T14:32:06.127707Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 59df2e4cb5a0ed3fbb878b97c2b9e162 Text-delta-base-sha1: b6dc41c1d567a13aa4f7c8225fcb48825a0119a7 Text-content-length: 569 Text-content-md5: faadf648437e18ea5c3f71c6cdee02c5 Text-content-sha1: 77c64bc7525a1727b13b5f983cf55e633dba10b3 Content-length: 569 SVN����C�=�C��E/* locwindow is signed so we can cope with excess data. */ int���~�h�C�91 + 4; /* message type, bit count */ len += ssh1_bignu If we are buffering too much, we may still * need to adjust the window if the server's * sent excess data. */ ssh2_set_window(c, bufsize < OUR_V2_WINSIZE ? OUR_V2_WINSIZE - bufsize : 0�Kx--�K�NULL); } else { char *msgbuf; logeventf(ssh, "Unable to load private key (%s)", error); msgbuf = dupprintf("Unable to load private key file " Revision-number: 7662 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-04T23:35:19.015606Z PROPS-END Revision-number: 7663 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2007-08-04T15:00:19.302035Z K 7 svn:log V 81 The semi-bug reported by wet_undies on comp.security.ssh and, I hope, now fixed. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-window-overrun Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 716 Text-content-md5: 86931b0ce084eb30af1b9b7de8208c3f Text-content-sha1: b8393a04336da2f18e556f996f9f138acf91e0ff Content-length: 726 PROPS-END SVN���>>>Summary: PuTTY is confused by servers that don't respect its window Class: semi-bug Priority: medium Difficulty: fun Present-in: 0.58 0.59 0.60 Fixed-in: r7661 2007-08-05 Content-type: text/plain If an SSH-2 server sends PuTTY more data than its window allows, PuTTY gets confused, and stops sending SSH_MSG_CHANNEL_WINDOW_ADJUST. While such servers are buggy, PuTTY should behave better. Simply dropping the connection would be unnecessarily rude, especially since overrunning the window is a recommended way to get better performance out of naive SSH-2 implementations. Better would be for PuTTY to send an extra WINDOW_ADJUST to retrospectively permit the excess data. This is what it now does. Revision-number: 7664 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-04T23:35:19.079139Z PROPS-END Revision-number: 7665 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-04T23:35:19.090554Z PROPS-END Revision-number: 7666 Prop-content-length: 256 Content-length: 256 K 8 svn:date V 27 2007-08-04T15:48:52.072948Z K 7 svn:log V 157 When omitting session data from logs, don't omit the length of the session data string. This isn't strictly necessary, but it makes the logs easier to use. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: faadf648437e18ea5c3f71c6cdee02c5 Text-delta-base-sha1: 77c64bc7525a1727b13b5f983cf55e633dba10b3 Text-content-length: 380 Text-content-md5: c7e78a857e168d548b854118bc0dfc47 Text-content-sha1: 6135e33c0795f7e246afbb35ab500c76cb6881c4 Content-length: 380 SVN����& �r��`s�L>�5l�O?�R-48; } else if (st->pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA) { do_blank = TRUE; blank_prefix = 12_INT, replylen, PKTT_DATA����6��8P�6'I�Z& _INT, len, PKTT_DATA PKT_INT, len, PKTT_DATAssh2_pkt_addstring_start(pktout); dont_log_data(ssh, pktout, PKTLOG_OMITNULL�xt��t Revision-number: 7667 Prop-content-length: 308 Content-length: 308 K 8 svn:date V 27 2007-08-04T16:04:08.879859Z K 7 svn:log V 209 Tweak window handling so that we send a window adjust if the window is half used up, rather than over half. That this increases the throughput of PSCP by 50% indicates just how broken our window handling is. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c7e78a857e168d548b854118bc0dfc47 Text-delta-base-sha1: 6135e33c0795f7e246afbb35ab500c76cb6881c4 Text-content-length: 61 Text-content-md5: dfddf9347ffa8a53d46ba3a0dc8e85a0 Text-content-sha1: 6ae7d94b7f5749dfc58a5886ec0f33bd253db52d Content-length: 61 SVN����������� ���b=�tu�t�L Revision-number: 7668 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-04T23:35:19.654867Z PROPS-END Revision-number: 7669 Prop-content-length: 153 Content-length: 153 K 7 svn:log V 55 "CR implies LF" patch, based on one from Paul Coldrey. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-08-04T19:16:46.013468Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4d907cf1b14a45f80d9f5333a3118286 Text-delta-base-sha1: fac5d016d6853cd40db56f9cee183f4017e8efc3 Text-content-length: 143 Text-content-md5: 8defc7277bf4940d4fd89c4d43726bea Text-content-sha1: 6a6165662f79e7cee7c438839dd24dfae352928f Content-length: 143 SVN��3Bt�$�t�* Implicit LF in every CR", 'f', HELPCTX(terminal_crhaslf), dlg_stdcheckbox_handler, I(offsetof(Config,crhaslf Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7626a37f27328c37f0915cb10a9f49d3 Text-delta-base-sha1: 1445af2379d90a5fcf4bfdd00aeecc874360e514 Text-content-length: 776 Text-content-md5: 33837b0e0ff168cc67c314419565fde2 Text-content-sha1: 72d76cf366451f232aaf5d3bdb29994b0e273832 Content-length: 776 SVN����P�\�G�&] �.Plfcr} \q{Implicit LF in every CR} \cfg{winhelp-topic}{terminal.crhaslfCR, and so the newly written line is overwritten by the following line. This option causes a line feed so that all lines are displayed.�57�5�h.ki} The SSH-2 equivalent of TIS authentication is called \q{keyboard-interactive}. It is a flexible authentication method using an arbitrary sequence of requests and responses; so it is not only useful for \I{challenge/response authentication}challenge/response mechanisms such as \i{S/Key}, but it can also be used for (for example) asking the user for a \I{password expiry}new password when the old one has expired. PuTTY leaves this option enabled by default, but supplies a switch to turn it off in case yo Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b45cb0b1093f88026699d113f163de24 Text-delta-base-sha1: 1853c30c9aacb104fa1348f9f6757bc1c5fd5bcf Text-content-length: 41 Text-content-md5: e3ed76ca4d4baa8e50f07c64f95a844f Text-content-sha1: 34ce003ff7ecd2aace8ea188b33f8e03d39c244d Content-length: 41 SVN��bs �S��Q int crhaslf Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cd8bf8f4866da08d4eaf0e463030fcce Text-delta-base-sha1: 8e3864a9960532a741b1dd66e8f3e3d4a30a784f Text-content-length: 86 Text-content-md5: 15ff18eb64bc4b361cf62c266bbaa0a7 Text-content-sha1: 6491a84d2a31e1b3e7b22b3c4f8700ba74620348 Content-length: 86 SVN��P?8�C��d"�`pCRImpliesLF", cfg->crhaslfCRImpliesLF", 0, &cfg->crhaslf Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f2b235aa520dec33bbdec09a41c70fbb Text-delta-base-sha1: aef2a75ef75561a57481b50124f955e862bfc36f Text-content-length: 373 Text-content-md5: d2668ddd65114264d5f73f281c06e9ad Text-content-sha1: 0def088878da134782561670bf35d35320449886 Content-length: 373 SVN����q�f��]6I�Le if (term->cfg.crhaslf) { else if (term->curs.y < term->rows - 1) term->curs.y++; }�R!OO�R� 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: /* foreground */ term->curr_attr &= ~ATTR_FGMASK; term->curr_attr |= Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9ddff474265593cdef1b5db77593ffa4 Text-delta-base-sha1: 61275659ee3896bb7c7e31fa59ff0956c26656e6 Text-content-length: 58 Text-content-md5: 04c8d62b502dbcba540bee8ca46e3a2f Text-content-sha1: ba3fc5e4bc9d8a84bb8644be5b55494ec1dcd968 Content-length: 58 SVN��Y %�Y��:crhaslf "terminal.crhaslf:config-lfcr Revision-number: 7670 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2007-08-04T19:23:44.360382Z K 7 svn:log V 39 Mention a new feature, for the record. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/crhaslf Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 250 Text-content-md5: 7101df415b669ded1426bf133b71748f Text-content-sha1: 84be5e133d246992e884365e0f777afca838f85b Content-length: 260 PROPS-END SVN���lllSummary: Add "Implicit LF with every CR" option Class: wish Priority: medium Difficulty: fun Content-type: text/plain Fixed-in: r7669 2007-08-04 Paul Coldrey sent us a patch for implying an LF into every CR, for symmetry. We liked it. Revision-number: 7671 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2007-08-04T20:29:02.745804Z K 7 svn:log V 50 I'm getting bored with explaining this by e-mail. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/inhibit-close Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1099 Text-content-md5: d507c8d2842ae3f0e0d78f5675fb5ca6 Text-content-sha1: 99800a06ec74a2a2d539da582014ce55e7693457 Content-length: 1109 PROPS-END SVN���===Summary: Ability to remove close box from window Class: wish Difficulty: fun Priority: never Content-type: text/x-html-body <p>We're frequently asked for an option to either remove the close button from PuTTY's window title, or to disable it. This is usually because some server to which PuTTY is connecting requires incoming sessions to be terminated in a particular way, and can't cope with the connection being dropped. We have no intention of implementing this. <p>If you have the user's co-operation, the "warn before closing window" option should be sufficient to prevent them accidentally closing the window. If you don't have their co-operation, then they could just use the Task Manager when the found that PuTTY's close button wasn't working. In neither of these cases would disabling the close button help significantly. <p>In any case, the server has to be able to cope gracefully with the loss of a connection, since this could happen in the event of PuTTY's, or the client computer's crashing. Once this is done, there should be no need to prevent PuTTY closing. Revision-number: 7672 Prop-content-length: 348 Content-length: 348 K 7 svn:log V 249 In the file-transfer applications, which only ever use the main channel, arrange to set the SSH-2 window size to something very large. This prevents the connection stalling when the window fills up, and means that PSCP receives data _much_ faster. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-08-04T22:14:19.162416Z PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9bf9cf06058001c083d6b2ae4dce4a60 Text-delta-base-sha1: e9eee61e717db04f5b27c82a47cac0ec18cf723e Text-content-length: 49 Text-content-md5: be54f02d961fe79ac16917c17c702942 Text-content-sha1: a80d7eff579befc3aaf339328c8ae7261e8edca4 Content-length: 49 SVN�� & �W��6U cfg.ssh_simple = TRUE Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eae49dc1e7478d5c9ff130d2955f7339 Text-delta-base-sha1: 35ebf8e3a489366ac11fbc0287df360399a3a024 Text-content-length: 50 Text-content-md5: fb486a83b805b75c0a8bef81a69abed8 Text-content-sha1: 592ce18bac76048390a7d3cfb6c4084370b071b7 Content-length: 50 SVN��: ����!~ cfg.ssh_simple = TRUE Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e3ed76ca4d4baa8e50f07c64f95a844f Text-delta-base-sha1: 34ce003ff7ecd2aace8ea188b33f8e03d39c244d Text-content-length: 221 Text-content-md5: e6cea7617e38f16d27e7d335359408a2 Text-content-sha1: ff2d906cef1a08a349f3c3e0dfc1eebae96645e1 Content-length: 221 SVN��s;@�R�@�)J * ssh_simple means that we promise never to open any channel other * than the main one, which means it can safely use a very large * window in SSH-2. */ int ssh_simple Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dfddf9347ffa8a53d46ba3a0dc8e85a0 Text-delta-base-sha1: 6ae7d94b7f5749dfc58a5886ec0f33bd253db52d Text-content-length: 871 Text-content-md5: 4862c6a8656065136dd4f98fb398ae4c Text-content-sha1: 93be7c86d8a89c3b3fc454a851514b9443fc7429 Content-length: 871 SVN�����5�f�q1�x�` * - OUR_V2_BIGWIN is the window size we advertise for the only * channel in a simple connectionBIGWIN 0x10000000, locmaxwin���`�:��kH� U�p]Server's RSA challenge was badly formatted")); crStop(0); } { char *agentreq, *q, *ret; void *vret; int len, retlen; len =c->v.v2.locmaxwinc->v.v2.locmaxwin ? c->v.v2.locmaxwinc->v.v2.locmaxwin�ud-y3�o�J�}�yJ�}� �dthm, &s->publickey_bloblen, &s->publickey_comment, &error); if (s->publickey_blob) { s->publickey_encrypted = ssh2_userkey_encrypted(&ssh->cfg.keyfile, NULssh->mainchan->v.v2.locmaxwin = ssh->cfg.ssh_simple ? OUR_V2_BIGWIN :ssh->mainchan->v.v2.locmaxwin = ssh->cfg.ssh_simple ? OUR_V2_BIGWIN : ssh->mainchan->v.v2.locmaxwinc->v.v2.locmaxwin Revision-number: 7673 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2007-08-04T22:17:36.652705Z K 7 svn:log V 58 This is partly sorted. Maybe this entry should be split. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/flow-control Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 98440ddeea235d0f115c8acd026f6be4 Text-delta-base-sha1: 27cb7d8dcd2774013a73511c1dc502fe72fafe40 Text-content-length: 93 Text-content-md5: 06112a41238edc88820995aa039a452f Text-content-sha1: 0d0616063674c08fa265efb77452498b302a9f3d Content-length: 93 SVN��6� G�s�G�FpPSCP and PSFTP do this as of r7672, and get decent download performance Revision-number: 7674 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2007-08-04T22:19:12.130983Z K 7 svn:log V 55 Remember to clear ssh_simple when initialising config. K 10 svn:author V 3 ben PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15ff18eb64bc4b361cf62c266bbaa0a7 Text-delta-base-sha1: 6491a84d2a31e1b3e7b22b3c4f8700ba74620348 Text-content-length: 48 Text-content-md5: 90a7591e893a58c705f69e790e045ea4 Text-content-sha1: 066ce49f8d6c911a337439c7571464e4f4c2f925 Content-length: 48 SVN��?\ �^��gXcfg->ssh_simple = FALSE Revision-number: 7675 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-05T23:35:28.834172Z PROPS-END Revision-number: 7676 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-05T23:35:28.935199Z PROPS-END Revision-number: 7677 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-05T23:35:28.946546Z PROPS-END Revision-number: 7678 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-05T23:35:28.957324Z PROPS-END Revision-number: 7679 Prop-content-length: 357 Content-length: 357 K 8 svn:date V 27 2007-08-05T14:18:43.830361Z K 7 svn:log V 258 Small window-handling tweaks. Set the default big window to 0x7fffffff bytes, and tweak ssh2_set_window() so it can cope with that. Also arrange to send a private channel message in simple mode to tell the server that it can safely use a large window too. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4862c6a8656065136dd4f98fb398ae4c Text-delta-base-sha1: 93be7c86d8a89c3b3fc454a851514b9443fc7429 Text-content-length: 604 Text-content-md5: 1775c827a5f5d2997117473af015e7c6 Text-content-sha1: fe75ed4b5f79a7e315de70bc86576746305570de Content-length: 604 SVN�������z�K It must be <= INT_MAX7fffffff���0�5��M== NULL) { bombout(("/ 2 >= c->v.v2.locwindow�d 0�1�|�r}�9+ &s->publickey_algoriif (ssh->cfg.ssh_simple) { /* * This message indicates to the server that we promise * not to try to run any other channel in parallel with * this one, so it's safe for it to advertise a very large * window and leave the flow control to TCP. ssh2_pkt_addstring(s->pktout, "simple@putty.projects.tartarus.org"); ssh2_pkt_addbool(s->pktout, 0); /* no reply */ ssh2_pkt_send(ssh, s->pktout); } Revision-number: 7680 Prop-content-length: 171 Content-length: 171 K 8 svn:date V 27 2007-08-05T14:19:56.935727Z K 7 svn:log V 73 Pull out the simple version into its own bug so we can mark it as fixed. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/flow-control Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06112a41238edc88820995aa039a452f Text-delta-base-sha1: 0d0616063674c08fa265efb77452498b302a9f3d Text-content-length: 220 Text-content-md5: 69fc4e525734017a84cf1bae66f9baf2 Text-content-sha1: 85dc57138bfe2dcc0a0ca6d58b95fd1f1965b5c5 Content-length: 220 SVN���x>�s�Q�E:m�~This is covered by <a href="flow-control-filexfer.html">flow-control-filexfer</a> This would only be valid where the SSH and TCP connections are coterminous, with no tunnelling taking place Node-path: putty-wishlist/data/flow-control-filexfer Node-kind: file Node-action: add Node-copyfrom-rev: 7673 Node-copyfrom-path: putty-wishlist/data/flow-control Text-copy-source-md5: 06112a41238edc88820995aa039a452f Text-copy-source-sha1: 0d0616063674c08fa265efb77452498b302a9f3d Text-delta: true Text-delta-base-md5: 06112a41238edc88820995aa039a452f Text-delta-base-sha1: 0d0616063674c08fa265efb77452498b302a9f3d Text-content-length: 247 Text-content-md5: 86aa2d4588fbba4f03dd4f090f5e795d Text-content-sha1: 6992f6fb91bc9cfa245d4603a09563340a77b4a8 Content-length: 247 SVN���,S���xg�:7� ;RFixed-in: r7679 2007-08-06 full generality of this problem is addressed in <a href="flow-control.html">flow-control</a>. A simplePSCP and PSFTP do both of these as of r7679, and get decent download performance. Revision-number: 7681 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2007-08-05T14:21:40.940617Z K 7 svn:log V 52 This should have a different title from its parent. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/flow-control-filexfer Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 86aa2d4588fbba4f03dd4f090f5e795d Text-delta-base-sha1: 6992f6fb91bc9cfa245d4603a09563340a77b4a8 Text-content-length: 82 Text-content-md5: c029bbf28306a71cf30a90ed3feeef80 Text-content-sha1: 184809be5ed965cf83d04b8b5bc747f71235ce46 Content-length: 82 SVN��,&AA�eGSummary: Be less clever with SSH-2 flow control in PSFTP and PSCP Revision-number: 7682 Prop-content-length: 171 Content-length: 171 K 10 svn:author V 3 ben K 8 svn:date V 27 2007-08-05T22:18:59.458772Z K 7 svn:log V 73 May as well reference an RFC rather than an Internet Draft where we can. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1775c827a5f5d2997117473af015e7c6 Text-delta-base-sha1: fe75ed4b5f79a7e315de70bc86576746305570de Text-content-length: 108 Text-content-md5: b4bb8e4591c854ddf205789ca894cb38 Text-content-sha1: 6b6b8e0a64f48a00b2a5aeb454c5107557deb240 Content-length: 108 SVN���� �5��0PRFC 4254== NULL) { bombo��� �J;�#] &s->publickey_a� y��y Revision-number: 7683 Prop-content-length: 398 Content-length: 398 K 7 svn:log V 299 Use "int" rather than "unsigned" as the argument to ssh2_set_window, not because it can ever be negative, but because we'll be comparing it with another int. This way, C's promotion rules don't bite us and we should stand slightly more chance of coping with broken servers that overrun our window. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-08-06T20:56:52.984731Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b4bb8e4591c854ddf205789ca894cb38 Text-delta-base-sha1: 6b6b8e0a64f48a00b2a5aeb454c5107557deb240 Text-content-length: 89 Text-content-md5: 0e0df29482705fc1e23fa6116e16db91 Text-content-sha1: 91e3631ec19ca7fcd5fba6fd178d40d74f3c3986 Content-length: 89 SVN����� ��nintut(("��� �p�}intlgorithm, �yo��o Revision-number: 7684 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2007-08-07T21:55:24.300812Z K 7 svn:log V 17 Update versions. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-window-overrun Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 86931b0ce084eb30af1b9b7de8208c3f Text-delta-base-sha1: b8393a04336da2f18e556f996f9f138acf91e0ff Text-content-length: 65 Text-content-md5: 0dc586a9124fda138cb1a55f63f2e5e3 Text-content-sha1: 9de88ee8dfb5b0ce011ee81ea67fe2f675af1853 Content-length: 65 SVN��>O ,���* r7682 2007-08-06 Fixed-in: r7683 2007-08-07 Revision-number: 7685 Prop-content-length: 264 Content-length: 264 K 8 svn:date V 27 2007-08-07T22:02:03.957870Z K 7 svn:log V 165 Correctly terminate nc target hostname when copying it. While we're here, use memcpy rather than strncpy when we've already worked out how much we're going to copy. K 10 svn:author V 3 ben PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8be639c1f425347cd40b521e3d12f2c4 Text-delta-base-sha1: 8c272ce511d00a51ff793618d1fd15292ad87f83 Text-content-length: 84 Text-content-md5: bb8f61abb56e4f8c7c2e6bdb54ed28f3 Text-content-sha1: 0882024d8703dbc54113a07fcfbe8bf0886278b8 Content-length: 84 SVN��' ?���L[memcpy(cfg->ssh_nc_host, value, len); cfg->ssh_nc_host[len Revision-number: 7686 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2007-08-07T22:05:31.220678Z K 7 svn:log V 39 Simple bug, with fix, from Josh Stone. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/cmdline-nc-garbage Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 893 Text-content-md5: bf7123efe7cfb85d5a36c28ad519cd27 Text-content-sha1: 7262a2f1967cf09b16fbacb548d35cfaa70801a5 Content-length: 903 PROPS-END SVN���oooSummary: -nc on the command line mangles the host name Class: bug Difficulty: fun Present-in: r7683 Fixed-in: r7685 2007-08-08 Content-type: text/plain From the original report: I just have a quick bug report and patch for you. I wasn't having any success getting plink to work as a local proxy for putty, so I tried plink verbosely on the command line. The troublesome output was something like: > plink host1 -v -nc host2:22 [...] Access granted Opening direct-tcpip channel to host2####:22 in place of session Server refused to open a direct-tcpip channel FATAL ERROR: Server refused to open a direct-tcpip channel ... where "####" was a bunch of garbage characters. It turns out that after the strncpy to ssh_nc_host, a '\0' is being written at the end of the entire array, rather than at the end of the hostname. A simple patch is attached, against putty SVN r7683. Revision-number: 7687 Prop-content-length: 193 Content-length: 193 K 7 svn:log V 95 A couple of people have asked for automatic log directory creation. I think it's a good idea. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-08-07T22:13:45.379693Z PROPS-END Node-path: putty-wishlist/data/log-mkdir Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 460 Text-content-md5: 8153f548195df103d0a8f50dc945496d Text-content-sha1: 9a6c39adacce4e07dee54e5b1a18baec5c6e9fc3 Content-length: 470 PROPS-END SVN���>>>Summary: Create directories for log files automatically Class: wish Difficulty: tricky Priority: medium Content-type: text/html <p>It would be good if PuTTY, when creating logfiles, could create any required parent directories if they don't already exist. This is mostly required for the case where the directory name includes some substitutions. Indeed, it might be reasonable to only create the directory if it's generated by a substitution. Revision-number: 7688 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2007-08-07T22:18:56.962164Z K 7 svn:log V 64 This can also show up with X forwarding (no rdesktop involved). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rdesktop-paste-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b824197c6dd75875c5660d58c1595732 Text-delta-base-sha1: e7eab4dbb4327b37ae728061bacaf732eabc585c Text-content-length: 229 Text-content-md5: 97fc1fe707da145bb518e0cd3609628a Text-content-sha1: 40749ca37db34462bdc673f0635ce9715b3ea6a7 Content-length: 229 SVN��qE M�a�M�ZThis deadlock can also show up when copying data from a tunnelled X session and pasting into the PuTTY session doing the tunnelling; this has been reported with Seagull Software BlueZoneX versions 7 and up Revision-number: 7689 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2007-08-07T22:20:56.125872Z K 7 svn:log V 37 Oh, and this is at least a semi-bug. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/rdesktop-paste-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 97fc1fe707da145bb518e0cd3609628a Text-delta-base-sha1: 40749ca37db34462bdc673f0635ce9715b3ea6a7 Text-content-length: 33 Text-content-md5: 3c6ee8a640f987f2054b4cb7ad762e2b Text-content-sha1: e299b7d22f7b2b880b83a56f6f8a3a0295b95d69 Content-length: 33 SVN��EU�^��i\Class: semi-bu Revision-number: 7690 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-18T23:35:20.613790Z PROPS-END Revision-number: 7691 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-18T23:35:20.710442Z PROPS-END Revision-number: 7692 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-18T23:35:20.721978Z PROPS-END Revision-number: 7693 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-18T23:35:20.732710Z PROPS-END Revision-number: 7694 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-18T23:35:20.753093Z PROPS-END Revision-number: 7695 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2007-08-18T14:24:50.351697Z K 7 svn:log V 56 Mention that Ctrl+C gives the old Ctrl+Break behaviour. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 342144eea9f5cfa70346e2abb3b75041 Text-delta-base-sha1: d9807f911b87695afda49f03dba6f334eb0ebbc0 Text-content-length: 84 Text-content-md5: f425b7ef0a9466215c05dabaf7eaa343 Text-content-sha1: 6d848dd46730b317a40a46b09e98f7378386c5d8 Content-length: 84 SVN��6r <���# (The previous behaviour can still be obtained with Ctrl+C.) Revision-number: 7696 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-21T23:35:38.297858Z PROPS-END Revision-number: 7697 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-21T23:35:38.391278Z PROPS-END Revision-number: 7698 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-21T23:35:38.425049Z PROPS-END Revision-number: 7699 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-24T23:35:25.777213Z PROPS-END Revision-number: 7700 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-25T23:35:23.173712Z PROPS-END Revision-number: 7701 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-25T23:35:23.275707Z PROPS-END Revision-number: 7702 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-25T23:35:23.293599Z PROPS-END Revision-number: 7703 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-25T23:35:23.305448Z PROPS-END Revision-number: 7704 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-08-28T23:35:28.029948Z PROPS-END Revision-number: 7705 Prop-content-length: 166 Content-length: 166 K 10 svn:author V 5 simon K 8 svn:date V 27 2007-09-03T19:09:56.116737Z K 7 svn:log V 66 ssh->mainchan can be NULL; try not to segfault in that situation. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0e0df29482705fc1e23fa6116e16db91 Text-delta-base-sha1: 91e3631ec19ca7fcd5fba6fd178d40d74f3c3986 Text-content-length: 119 Text-content-md5: 2b8b1a811bbf99061784f53900acd623 Text-content-sha1: 860ce6c110085e1316634d08e4a2bd0a3fa918f5 Content-length: 119 SVN����������������o >�4��Vif (ssh->mainchan) ssh2_set_window(ssh->mainchan, Revision-number: 7706 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2007-09-03T19:59:43.997554Z K 7 svn:log V 28 Suggestion from emauvaisfr. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/cmdline-edit-session Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 465 Text-content-md5: b33ca728bd71c5992de75f4a7c65d652 Text-content-sha1: edcc5f11470214e4bde06c6db78fc1035e9ca928 Content-length: 475 PROPS-END SVN���CCCSummary: Command-line option to edit a session rather than launching it Class: wish Difficulty: fun Priority: low Content-type: text/plain From a user: The feature I request would be a "-edit my_session" command line option. This option would open the PuTTY control panel, with the session "my_session" preloaded. (Like TuTTY does ;) And why not a "-delete my_session" command line option, that could do what it says (with a confirmation dialog) ? Revision-number: 7707 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2007-09-03T20:17:24.779685Z K 7 svn:log V 43 This was in the FAQ, but not the wishlist. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/sftp-ascii Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 406 Text-content-md5: 2a3098d5b558aa110dd09a9b2ef11ab8 Text-content-sha1: d7ba645999caeb80c63d1a4397942d00a05114e1 Content-length: 416 PROPS-END SVN���Summary: ASCII mode for SFTP Class: wish Priority: medium Difficulty: tricky Content-type: text/plain Until recently, the SCP and SFTP protocols had no notion of transferring a file in anything other than binary mode. (This is still true of SCP.) The current draft protocol spec of SFTP proposes a means of implementing ASCII transfer. At some point PSCP/PSFTP may implement this proposal. Revision-number: 7708 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2007-09-03T20:19:08.708256Z K 7 svn:log V 34 Update CSS Kerberized PuTTY link. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 325b079260a1732f524cfea8df814113 Text-delta-base-sha1: ef0d73badaec3b0a45c173ef21a51a6c1bc5f0ec Text-content-length: 99 Text-content-md5: 4fcbb120c9a2d35a6d5ffdddef27e171 Text-content-sha1: 765c41c60aad227d7fc0ccfb294da027af3badf9 Content-length: 99 SVN��tp K�k�K�::ss-security.com/cgi-bin/dnld_list.pl"> Certified Security Solutions, Inc. Revision-number: 7709 Prop-content-length: 159 Content-length: 159 K 10 svn:author V 3 ben K 8 svn:date V 27 2007-09-03T20:33:40.972416Z K 7 svn:log V 61 Suggest another ttymode we could usefully set automatically. PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d2668ddd65114264d5f73f281c06e9ad Text-delta-base-sha1: 0def088878da134782561670bf35d35320449886 Text-content-length: 96 Text-content-md5: a934acce0f9971903e6325b5f619ed92 Text-content-sha1: dd8534ac603a5d8659c0427e04d0ff596de91866 Content-length: 96 SVN���������!a 7�+��"/* FIXME: or ECHO and friends based on local echo state Revision-number: 7710 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2007-09-03T20:52:56.506007Z K 7 svn:log V 54 Avoid "unused variable" warning when NO_IPV6 defined. K 10 svn:author V 3 ben PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8defc7277bf4940d4fd89c4d43726bea Text-delta-base-sha1: 6a6165662f79e7cee7c438839dd24dfae352928f Text-content-length: 83 Text-content-md5: f5a54340a5c83ae10a6504a0a4613168 Text-content-sha1: 56f2a7256ace3a2c5a9cbdf5aa1be203b0e1e947 Content-length: 83 SVN��BY 9�A��_c#ifndef NO_IPV6 int idx = afp ? afp-afs : 0; #endif Revision-number: 7711 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2007-09-03T21:04:00.200750Z K 7 svn:log V 23 Bug reported by Aggro. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/sftp-close-status Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1581 Text-content-md5: 84842a1a9b0bcd3c4eb17996a280a9ff Text-content-sha1: 4f963338971714ea8fe981f7f3e18e2329eac5df Content-length: 1591 PROPS-END SVN���Summary: Psftp doesn't check return value for SSH2_FXP_CLOSE request Class: bug Priority: medium Difficulty: fun Present-in: 0.60 Content-type: text/plain From a user: Psftp doesn't check return value for SSH2_FXP_CLOSE request. The specifictaions of sftp protocol state: "The response to this request will be a SSH_FXP_STATUS message. One should note that on some server platforms even a close can fail. This can happen e.g. if the server operating system caches writes, and an error occurs while flushing cached writes during the close." http://www.openssh.org/txt/draft-ietf-secsh-filexfer-02.txt The server we use will identify failure when closing the file. Currently psftp doesn't give any indication of the failure. Psftp should check the return value and if close is not succesfull after writing to a file, user should be informed about failed file transfer operation. psftp -h PuTTY Secure File Transfer (SFTP) client Release 0.60 The problem happens at least on Windows, but I would assume that it affects all platforms. Unfortunately the only server I know that has this problem is not shared in public (only sold to certain group of organizations), so mentioning it wouldn't help as you wouldn't be able to test it anyway. But the problem should be quite trivial to fix without testing. The server in question doesn't overwrite old file if such exists with the same name, if closing fails. So please don't try to use stat() or similar to find out if the transfer was successful, even if close fails. If close fails, file is not transfered. Revision-number: 7712 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-09T23:35:18.107760Z PROPS-END Revision-number: 7713 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-09T23:35:18.217439Z PROPS-END Revision-number: 7714 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-09T23:35:18.257877Z PROPS-END Revision-number: 7715 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-09T23:35:18.284879Z PROPS-END Revision-number: 7716 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-10T23:35:18.300138Z PROPS-END Revision-number: 7717 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-10T23:35:18.374569Z PROPS-END Revision-number: 7718 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-11T23:35:21.114061Z PROPS-END Revision-number: 7719 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-13T23:35:23.880363Z PROPS-END Revision-number: 7720 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-13T23:35:23.990787Z PROPS-END Revision-number: 7721 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-14T23:35:18.109404Z PROPS-END Revision-number: 7722 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-16T23:35:20.874220Z PROPS-END Revision-number: 7723 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-19T23:35:19.564012Z PROPS-END Revision-number: 7724 Prop-content-length: 270 Content-length: 270 K 8 svn:date V 27 2007-09-20T21:07:24.599565Z K 7 svn:log V 171 In SSH-1, don't attempt password authentication unless the server has announced support for it. Instead exit with a fatal error (since password auth is our last resort). K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b8b1a811bbf99061784f53900acd623 Text-delta-base-sha1: 860ce6c110085e1316634d08e4a2bd0a3fa918f5 Text-content-length: 1046 Text-content-md5: eb13354478d88625df77548b0947fcad Text-content-sha1: cc9181354f41633849ba5a85472334291628b266 Content-length: 1046 SVN���� e�P�e�K=RHOSTS 1 /* 0x1 */ #define SSH1_AUTH_RSA 2 /* 0x2 */ #define SSH1_AUTH_PASSWORD 3 /* 0x3 */ #define SSH1_AUTH_RHOSTS_RSA 4 /* 0x4 */���P=��m�gE�I& crWaitUntil(pktin); if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) { logevent("Key refused"); continue; } logevent("Received RSA challenge"); if ((s->if ((s->supported_auths_mask & (1 << SSH1_AUTH_PASSWORD)) == 0) { bombout(("No supported authentication methods available")); crStop(0); }� � �y file * for later use. */ if (!filename_is_null(ssh->cfg.keyfile)) { int keytype; logeventf(ssh, "Reading private key file \"%.150s\"", filename_to_str(&ssh->cfg.keyfile)); keytype = key_type(&ssh->cfg.keyfile); if (keytype == SSH_KEYTYPE_SSH2) { const char *error; s->publickey_blob = ssh2_userkey_loadpub(&ssh->cfg.keyfile, &s->publickey_algorithm, Revision-number: 7725 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2007-09-20T21:08:31.721291Z K 7 svn:log V 29 Document a bug I just fixed. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh1-no-password Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 548 Text-content-md5: 407028c4e9f00d666a627caa71b738b7 Text-content-sha1: 32dc0d6e99c9c91d195e23bfed99092cac195a72 Content-length: 558 PROPS-END SVN���Summary: PuTTY tries password authentication even if the server says not to. Class: bug Difficulty: fun Present-in: 0.60 2007-09-20 Fixed-in: 2007-09-21 r7724 Content-type: text/plain If SSH_AUTH_PASSWORD is disabled on an SSH-1 server (e.g. by setting "PasswordAuthentication no" in OpenSSH), and PuTTY isn't configured to try any other authentication type, it sends a password anyway and reports that it failed. It should notice from SSH_MSG_PUBLIC_KEY that the server doesn't support password authentication, and not attempt it. Revision-number: 7726 Prop-content-length: 398 Content-length: 398 K 8 svn:date V 27 2007-09-20T21:33:21.536663Z K 7 svn:log V 299 Don't try SSH-1 RSA authentication unless the server has advertised support for it. It's possible that this obsolete's BUG_CHOKES_ON_RSA. Certainly the one SSH-1.5-Cisco-1.25 server I found was correctly not advertising RSA auth. For now, leave it in, because I'm not feeling entirely confident. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eb13354478d88625df77548b0947fcad Text-delta-base-sha1: cc9181354f41633849ba5a85472334291628b266 Text-content-length: 445 Text-content-md5: 988c86b5f7fd91e0937d9889fe81808b Text-content-sha1: 422873f950943bef834ce5cf83b00eb96c99cc21 Content-length: 445 SVN������`�}~�o if ((ssh->remote_bugs & BUG_CHOKES_ON_RSA)) s->supported_auths_mask &= ~(1 << SSH1_AUTH_RSA->supported_auths_mask & (1 << SSH1_AUTH_RSA)) == 0���rr��g Pageant key #%d", s->keyi); send_packet(ssh, SSH1_CMSG_AUTH_RSA, PKT_BIGNUM, s->key.modulus, PKT_END);�rr��/ s->publickey_blob = NULL; if (!s->we_are_in) { /* * Load the public half of any configured public ke Revision-number: 7727 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-21T23:35:35.139821Z PROPS-END Revision-number: 7728 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-09-21T23:35:35.247025Z PROPS-END Revision-number: 7729 Prop-content-length: 240 Content-length: 240 K 10 svn:author V 5 simon K 8 svn:date V 27 2007-09-21T18:04:08.959389Z K 7 svn:log V 139 Harvey Kwok observes that EnumPrinters() can sometimes fail to fill in its output parameters. Hence, we initialise them before calling it. PROPS-END Node-path: putty/windows/winprint.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f868f84898b4ac8fb9ddb1efc92976eb Text-delta-base-sha1: 0bfecca58d05227cf4cf9fcc8826167b0872bbe0 Text-content-length: 40 Text-content-md5: d2c663e745c35b39be7a47568d6d3744 Text-content-sha1: 271ab3b98277b411a74109f5c86e66e7a730ecd0 Content-length: 40 SVN�� �$��U/ = 0, nprinters = 0 Revision-number: 7730 Prop-content-length: 238 Content-length: 238 K 8 svn:date V 27 2007-09-22T13:55:25.398005Z K 7 svn:log V 139 Document "No supported authentication methods available", and make it clear that TIS/CryptoCard auth can be used for simple passwords too. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 33837b0e0ff168cc67c314419565fde2 Text-delta-base-sha1: 72d76cf366451f232aaf5d3bdb29994b0e273832 Text-content-length: 159 Text-content-md5: b8ac920f8e5eae67c964a9f7ac636f09 Text-content-sha1: 366b31bb3ee40dc54e81af3916dc1e869676e379 Content-length: 159 SVN����8���*� @ They can even be used to prompt for simple passwordmay�7m6�7�eractive authentication}} \cfg{winhelp-topic}{ssh.aut Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b8f7df0584b65c4ff9b568528cd12479 Text-delta-base-sha1: 21f1656fd659e1c4a6ef76d99f68263d22bfa251 Text-content-length: 311 Text-content-md5: 8df372909e9c5a885e50d27d656af48e Text-content-sha1: 8e5fa116f37bd96bfaf07736a901c85da6ab7ec7 Content-length: 311 SVN��;h ���1 no-auth} \q{No supported authentication methods available} This error indicates that PuTTY has run out of ways to authenticate you to an SSH server. This may be because PuTTY has TIS or keyboard-interactive authentication disabled, in which case \k{config-ssh-tis} and \k{config-ssh-ki Revision-number: 7731 Prop-content-length: 297 Content-length: 297 K 8 svn:date V 27 2007-09-23T17:19:40.578609Z K 7 svn:log V 196 Summary: PSCP/PSFTP hang on exit in some failure cases Class: bug Priority: high Initial analysis of the many reports we've had of this. Looks like it could be another side effect of winhandl.c. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pscp-psftp-fail-hang Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1617 Text-content-md5: 5504db18850ed69a99508a62371a0b8f Text-content-sha1: 41218ae4c8121c9fced1cdeafae2eef613181386 Content-length: 1627 PROPS-END SVN���CCCSummary: PSCP/PSFTP hang on exit in some failure cases Class: bug Priority: high Absent-in: 0.58 2006-08-13 Present-in: 2006-08-27 0.59 0.60 2007-09-23 Content-type: text/x-html-body <p> PSCP and PSFTP can hang on exit in various failure situations. Many of these involve the <tt>-batch</tt> option, which is embarrassing. For example: <ul> <li>User aborts at host key verification (or <tt>-batch</tt> is specified, which has the same effect). <li><tt>-batch</tt> is specified and no non-interactive authentication method is successful. </ul> <p> Interestingly, Plink does not appear to hang in similar situations (and nor does PuTTY proper). <p> PSCP/PSFTP do not hang in <em>all</em> failure situations -- for instance, they appear not to hang when interactive password authentication fails. <p> Looking at when this crept in, it might be another side-effect of the introduction of the <tt>winhandl.c</tt> mechanism. <p> Reports: <ul> <li>b56aaa9a0707310805j19d579edl771f744c76ce0eaa@mail.gmail.com <br>Suggests that it's hanging in <tt>WaitForMultipleObjects()</tt>, and gives a patch which checks for <tt>INVALID_SOCKET</tt> which makes the hanging stop. Not investigated. <li>3D5BAD49F3A5A041B739E301A5E337A5026C999F@CWYMSX06.Corp.Acxiom.net <li>000801c7adf0$2244f7d0$0200a8c0@lsdbotii <li>1ea6a0550705150757x5faba2a6y5f717f5f822d8451@mail.gmail.com <li>NDBBJBPCLJGMOADENDIAEEOECHAA.oru@opre.co.uk <li><a href="http://groups.google.com/groups?as_umsgid=1187014011.602670.71550%40g4g2000hsf.googlegroups.com">1187014011.602670.71550@g4g2000hsf.googlegroups.com</a> on comp.security.ssh </ul> Revision-number: 7732 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 Looks to be Windows-only (or at least, it doesn't happen on Unix). K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-09-23T17:24:47.694661Z PROPS-END Node-path: putty-wishlist/data/pscp-psftp-fail-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5504db18850ed69a99508a62371a0b8f Text-delta-base-sha1: 41218ae4c8121c9fced1cdeafae2eef613181386 Text-content-length: 160 Text-content-md5: dc1e3ac94556b6eb26cc6ca96aed7546 Text-content-sha1: 40abbd8ad83aab58b97f8c4de2ae8246eabe1ca8 Content-length: 160 SVN��CN �K��{Hon Windows can hang on exit in various failure situations. Many of these involve the <tt>-batch</tt> option, which is embarrassing. For Revision-number: 7733 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2007-09-23T23:31:46.379099Z K 7 svn:log V 21 Add puttycm.free.fr. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4fcbb120c9a2d35a6d5ffdddef27e171 Text-delta-base-sha1: 765c41c60aad227d7fc0ccfb294da027af3badf9 Text-content-length: 201 Text-content-md5: 99eb8e90a991a096596aca7060f43f29 Text-content-sha1: 17cfa1ddc53ed9d7fe500b9ce9bcaf314a615df8 Content-length: 201 SVN��p- /�c�/�Uli><a href="http://puttycm.free.fr/"> PuTTY Connection Mamager</a> captures PuTTY sessions in tabs, and provides auto-login via keyboard simulation among other features. Revision-number: 7734 Prop-content-length: 114 Content-length: 114 K 7 svn:log V 14 Misc updates. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-09-23T23:35:58.981761Z PROPS-END Node-path: putty-wishlist/data/multiple-connections Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 718cbbb872ea5fe967f65e1d54611065 Text-delta-base-sha1: 6c8651953c104fa7b6198a89e307db253cbd483c Text-content-length: 418 Text-content-md5: 657775903539df66592e5ce1da87aae4 Text-content-sha1: db9b2132fa76868fb867019430fe8bea0c4f0378 Content-length: 418 SVN��9]��;�^H�nKThe <a href="http://www.ipetitions.com/petition/putty-tabs/">most popular</a> UI is per-session tabs on the window, like Firefox or konsole. Other options include selection with Alt-F1, Alt-F2 etc (like the Linux console) or an an MDI-style application, with one large main window containing several session windowsp> There are now several third-party implementations of this concept on Revision-number: 7735 Prop-content-length: 1043 Content-length: 1043 K 8 svn:date V 27 2007-09-24T15:18:11.347189Z K 7 svn:log V 944 Add support for automatically tuning the SSH-2 window size for decent performance. The theory behind this is fairly simple, though the implementation turns out to be a little trickier than it looks. The basic idea is that when the connection isn't being limited by our ability to process data, we want to ensure that the window size _as seen by the server_ never drops to zero. Measuring the server's view of the window size is done by arranging for it to acknowledge every SSH_MSG_CHANNEL_WINDOW_ADJUST, or rather an SSH_MSG_CHANNEL_REQUEST sent just before it. That way we can tell when it its outgoing data stream it recieved the window adjustment, and thus how small the server's view of the window got. At present, we only ever increase the window size. In theory, we could arrange to reduce it again if the server's view of it seemed to be persistently too large, but my experiments suggest that getting this right will be tricky. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 988c86b5f7fd91e0937d9889fe81808b Text-delta-base-sha1: 422873f950943bef834ce5cf83b00eb96c99cc21 Text-content-length: 8455 Text-content-md5: daccd8a05c2f3bb64fcfea625f52a713 Text-content-sha1: 2ab46522585186808e5508497b6e7d3d38b8d30a Content-length: 8455 SVN������|��:little structure to keep track of outstanding WINDOW_ADJUSTs */ struct winadj { struct winadj *next; unsigned size; /* * remlocwin is the amount of local window that we think * the remote end had available to it after it sent the * last data packet or window adjust ack. */ int remlocwin; /* * These store the list of window adjusts that haven't * been acked. */ struct winadj *winadj_head, *winadj_tail; enum { THROTTLED, UNTHROTTLING, UNTHROTTLED } throttle_state���:W)�g�t�}gq�t5�n<�B � S|�[ s->commentlen) break; s->commentp = (char *)s->p; s->p += s->commentlen; ok = TRUE; } while (0); if (!ok) { logevent("Pageant key list packet was truncated"); break; } } if (s->publickey_blob) { if (!memcmp(pkblob, s->publickey_blob, s->publickey_bloblen)) { logeventf(ssh, "Pageant key #%d matches " "configured key file", s->keyi); s->tried_publickey = 1; } else /* Skip non-configured key */ continue; } logeventf(ssh, "Tryin struct winadj *wa; /* * In order to keep track of how much window the client * actually has available, we'd like it to acknowledge each * WINDOW_ADJUST. We can't do that directly, so we accompany * it with a CHANNEL_REQUEST that has to be acknowledged. * * This is only necessary if we're opening the window wide. * If we're not, then throughput is being constrained by * something other than the maximum window size anyway. * * We also only send this if the main channel has finished its * initial CHANNEL_REQUESTs and installed the default * CHANNEL_FAILURE handler, so as not to risk giving it * unexpected CHANNEL_FAILUREs. */ if (newwin == c->v.v2.locmaxwin && ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE]) { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_addstring(pktout, "winadj@putty.projects.tartarus.org"); ssh2_pkt_addbool(pktout, TRUE); ssh2_pkt_send(ssh, pktout); /* * CHANNEL_FAILURE doesn't come with any indication of * what message caused it, so we have to keep track of the * outstanding CHANNEL_REQUESTs ourselves. */ wa = snew(struct winadj); wa->size = newwin - c->v.v2.locwindow; wa->next = NULL; if (!c->v.v2.winadj_head) c->v.v2.winadj_head = wa; else c->v.v2.winadj_tail->next = wa; c->v.v2.winadj_tail = wa; if (c->v.v2.throttle_state != UNTHROTTLED) c->v.v2.throttle_state = UNTHROTTLING; } else { /* Pretend the WINDOW_ADJUST was acked immediately. */ c->v.v2.remlocwin = newwin; c->v.v2.throttle_state = THROTTLED; }failure(Ssh ssh, struct Packet *pktin) { /* * The only time this should get called is for "winadj@putty" * messages sent above. All other channel requests are either * sent with want_reply false or are sent before this handler gets * installed. */ unsigned i = ssh_pkt_getuint32(pktin); struct ssh_channel *c; struct winadj *wawa = c->v.v2.winadj_head; if (!wa) logevent("excess SSH_MSG_CHANNEL_FAILURE"); else { c->v.v2.winadj_head = wa->next; c->v.v2.remlocwin += wa->size; sfree(wa); /* * winadj messages are only sent when the window is fully open, * so if we get an ack of one, we know any pending unthrottle * is complete. */ if (c->v.v2.throttle_state == UNTHROTTLING) c->v.v2.throttle_state = UNTHROTTLEDc->v.v2.remlocwinit looks like the remote end hit the end of its window, * and we didn't want it to do that, think about using a * larger window. */ if (c->v.v2.remlocwin <= 0 && c->v.v2.throttle_state == UNTHROTTLED && c->v.v2.locmaxwin < 0x40000000) c->v.v2.locmaxwin += OUR_V2_WINSIZE;c->v.v2.remlocwin = OUR_V2_WINSIZE; c->v.v2.winadj_head = c->v.v2.winadj_tail = NULL; c->v.v2.throttle_state = UNTHROTTLED�02l�J�Y�+yY�y�W[/�!|�S;ut, c->remoteid); ssh2_pkt_adduint32(pktout, c->localid); ssh2_pkt_adduint32(pktout, c->v.v2.locwindow); ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */ ssh2_pkt_send(ssh, pktout); } } /* * Buffer banner messages for later display at some convenient point. */ static void ssh2_msg_userauth_banner(Ssh ssh, struct Packet *pktin) { /* Arbitrary limit to prevent unbounded inflation of buffer */ if (bufchain_size(&ssh->banner) <= 131072) { char *banner = NULL; int size = 0; ssh_pkt_getstring(pktin, &banner, &size); if (banner) bufchain_add(&ssh->banner, banner, size); } } /* Helper function to deal with sending tty modes for "pty-req" */ static void ssh2_send_ttymode(void *data, char *mode, char *val) { struct Packet *pktout = (struct Packet *)data; int i = 0; unsigned int arg = 0; while (strcmp(mode, ssh_ttymodes[i].mode) != 0) i++; if (i == lenof(ssh_ttymodes)) return; switch (ssh_ttymodes[i].type) { case TTY_OP_CHAR: arg = ssh_tty_parse_specchar(val); break; case TTY_OP_BOOL: arg = ssh_tty_parse_boolean(val); break; } ssh2_pkt_addbyte(pktout, ssh_ttymodes[i].opcode); ssh2_pkt_adduint32(pktout, arg); } /* * Handle the SSH-2 userauth and connection layers. */ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin) { struct do_ssh2_authconn_state { enum { AUTH_TYPE_NONE, AUTH_TYPE_PUBLICKEY, AUTH_TYPE_PUBLICKEY_OFFER_LOUD, AUTH_TYPE_PUBLICKEY_OFFER_QUIET, AUTH_TYPE_PASSWORD, AUTH_TYPE_KEYBOARD_INTERACTIVE, AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET } type; int done_service_req; int gotit, need_pw, can_pubkey, can_passwd, can_keyb_inter; int tried_pubkey_config, done_agent; int kbd_inter_refused; int we_are_in; prompts_t *cur_prompt; int num_prompts; char username[100]; char *password; int got_username; void *publickey_blob; int publickey_bloblen; int publickey_encrypted; char *publickey_algorithm; char *publickey_comment; unsigned char agent_request[5], *agent_response, *agentp; int agent_responselen; unsigned char *pkblob_in_agent; int keyi, nkeys; char *pkblob, *alg, *commentp; int pklen, alglen, commentlen; int siglen, retlen, len; char *q, *agentreq, *ret; int try_send; int num_env, env_left, env_ok; struct Packet *pktout; }; crState(do_ssh2_authconn_state); crBegin(ssh->do_ssh2_authconn_crstate); s->done_service_req = FALSE; s->we_are_in = FALSE; if (!ssh->cfg.ssh_no_userauth) { /* * Request userauth protocol, and await a response to it. */ s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST); ssh2_pkt_addstring(s->pktout, "ssh-userauth"); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type == SSH2_MSG_SERVICE_ACCEPT) s->done_service_req = TRUE; } if (!s->done_service_req) { /* * Request connection protocol directly, without authentication. */ s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST); ssh2_pkt_addstring(s->pktout, "ssh-connection"); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type == SSH2_MSG_SERVICE_ACCEPT) { s->we_are_in = TRUE; /* no auth required */ } else { bombout(("Server refused service request")); crStopV; } } /* Arrange to be able to deal with any BANNERs that come in. * (We do this now as packets may come in during the next bit.) */ bufchain_init(&ssh->banner); ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = ssh2_msg_userauth_banner; /* * Misc one-time setup for authentication. *mainchan->v.v2.remlocwin = ssh->cfg.ssh_simple ? OUR_V2_BIGWIN : OUR_V2_WINSIZE; ssh->mainchan->v.v2.winadj_head = NULL; ssh->mainchan->v.v2.winadj_tail = NULL; ssh->mainchan->v.v2.throttle_state = UNTHROTTLEDmainchan->v.v2.remlocwin = ssh->cfg.ssh_simple ? OUR_V2_BIGWIN : OUR_V2_WINSIZE; ssh->mainchan->v.v2.winadj_head = NULL; ssh->mainchan->v.v2.winadj_tail = NULL; ssh->mainchan->v.v2.throttle_state = UNTHROTTLEDAll the initial channel requests are done, so install the default * failure handler. */ ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_channel_failurec->v.v2.remlocwin = OUR_V2_WINSIZE; c->v.v2.winadj_head = c->v.v2.winadj_head = NULL; c->v.v2.throttle_state = UNTHROTTLED Revision-number: 7736 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 67 Summary: Unix Plink dies with SIGPIPE when a forwarded port closes K 10 svn:author V 3 ben K 8 svn:date V 27 2007-09-24T17:09:48.269110Z PROPS-END Node-path: putty-wishlist/data/unix-sigpipe Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 383 Text-content-md5: c39ae7499962d94487777132b0f342f9 Text-content-sha1: 320f49756467986dfaf207cbea474eb0dbd7b72c Content-length: 393 PROPS-END SVN���qqqSummary: Unix Plink dies with SIGPIPE when a forwarded port closes Present-in: r7735 Difficulty: fun Priority: medium Content-type: text/plain If I set up a remote-to-local port forwarding, and use "nc -l" on the local end and "nc" on the far end, killing the local "nc" causes Plink to die with SIGPIPE. It should just tidy up the forwarded connection and carry on. Revision-number: 7737 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2007-09-24T17:17:58.941458Z K 7 svn:log V 40 Updates now that I think this is fixed. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/flow-control Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69fc4e525734017a84cf1bae66f9baf2 Text-delta-base-sha1: 85dc57138bfe2dcc0a0ca6d58b95fd1f1965b5c5 Text-content-length: 929 Text-content-md5: 7815b685c1dffc8d159f946ec4441c37 Text-content-sha1: 66baf3026e43eb68f9cabe0c920c164f61f5763c Content-length: 929 SVN��xu~���0�VQd�V"Fixed-in: 2007-09-25 r7735As of 2007-09-25, PuTTY has much improved window handling. From the commit message: <blockquote> <p>The basic idea is that when the connection isn't being limited by our ability to process data, we want to ensure that the window size <em>as seen by the server</em> never drops to zero. Measuring the server's view of the window size is done by arranging for it to acknowledge every SSH_MSG_CHANNEL_WINDOW_ADJUST, or rather an SSH_MSG_CHANNEL_REQUEST sent just before it. That way we can tell when it its outgoing data stream it recieved the window adjustment, and thus how small the server's view of the window got. <p>At present, we only ever increase the window size. In theory, we could arrange to reduce it again if the server's view of it seemed to be persistently too large, but my experiments suggest that getting this right will be tricky. </blockquote> Revision-number: 7738 Prop-content-length: 353 Content-length: 353 K 8 svn:date V 27 2007-09-24T19:26:08.751563Z K 7 svn:log V 254 stdout and stderr should be made O_NONBLOCK so that we don't end up blocking the entire process because stdout is busy. Arguably, this shouldn't apply to stderr when we're printing our own error messages to it, but I'll leave that fix for another time. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c976fbcba416118d1dd4889787dee19f Text-delta-base-sha1: 1e3137becb9c34909c9c26da76bb2058db915622 Text-content-length: 391 Text-content-md5: 3bf736824426ffef6cfe3787dbcac214 Text-content-sha1: 9e19e18ecf0d752060bbde16ea14cf3f58959256 Content-length: 391 SVN��+f�>��t>N�z1 && errno != EWOULDBLOCK { int fl; /* * Make sure that stdout/err are non-blocking. */ if ((fl = fcntl(1, F_GETFL)) == -1 || fcntl(1, F_SETFL, fl | O_NONBLOCK) == -1) { perror("stdout"); exit(1); } if ((fl = fcntl(2, F_GETFL)) == -1 || fcntl(2, F_SETFL, fl | O_NONBLOCK) == -1) { perror("stderr"); exit(1); } } Revision-number: 7739 Prop-content-length: 108 Content-length: 108 K 8 svn:date V 27 2007-09-24T19:27:03.615359Z K 7 svn:log V 10 Classify. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/unix-sigpipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c39ae7499962d94487777132b0f342f9 Text-delta-base-sha1: 320f49756467986dfaf207cbea474eb0dbd7b72c Text-content-length: 29 Text-content-md5: 68bc17328e1b3fc30969d3fe8aa994bd Text-content-sha1: cae4eab7423e33106311b1687fe131c12e190395 Content-length: 29 SVN��q| �C��/BClass: bug Revision-number: 7740 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2007-09-24T19:27:33.061454Z K 7 svn:log V 79 Summary: Unix Plink should set O_NONBLOCK on stdout and stderr Already fixed. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/unix-plink-stdout-nonblock Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 438 Text-content-md5: 1d308c0d07c4d21d3e4b1049e7a45545 Text-content-sha1: 07d3357504b688686b4c66980b375b55872f7e23 Content-length: 448 PROPS-END SVN���(((Summary: Unix Plink should set O_NONBLOCK on stdout and stderr Class: bug Present-in: r7735 Fixed-in: r7738 Difficulty: fun Priority: medium Content-type: text/plain If stdout from Unix Plink is going to a FIFO, and the reader of that FIFO stops reading (say someone has ^Zed it), Plink hangs, stopping port-forwardings and so forth. This is silly, and seems to result from failing to set O_NONBLOCK on stdout and stderr. Revision-number: 7741 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2007-09-24T21:31:45.090657Z K 7 svn:log V 90 Manifest constants are good. Introduce plink to STD{IN,OUT,ERR}_FILENO, TRUE, and FALSE. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3bf736824426ffef6cfe3787dbcac214 Text-delta-base-sha1: 9e19e18ecf0d752060bbde16ea14cf3f58959256 Text-content-length: 656 Text-content-md5: ea003621dd083741ffae697b1d7fc876 Text-content-sha1: dd5ed4506656d13ccc4c2a1698474659ceda2060 Content-length: 656 SVN��ic�<��\=�J�e�>|�?M�T"�-wR� F� g� s��q�Wp�e-FALSESTDIN_FILENOSTDIN_FILENOSTDIN_FILENOSTDERR_FILENO : STDOUT_FILENOTRUE); } else { bufchain_add(&stdout_data, data, len); try_output(FALSESTDIN_FILENOSTDOUT_FILENO, F_GETFL)) == -1 || fcntl(STDOUT_FILENO, F_SETFL, fl | O_NONBLOCK) == -1) { perror("stdout"); exit(1); } if ((fl = fcntl(STDERR_FILENO, F_GETFL)) == -1 || fcntl(STDERR_FILENOSTDIN_FILENOSTDOUT_FILENOSTDERR_FILENOSTDIN_FILENOSTDIN_FILENOSTDOUT_FILENO, &wset)) { try_output(FALSE); } if (FD_ISSET(STDERR_FILENO, &wset)) { try_output(TRUE Revision-number: 7742 Prop-content-length: 460 Content-length: 460 K 8 svn:date V 27 2007-09-24T21:43:48.196495Z K 7 svn:log V 361 My changes in r7738 (O_NONBLOCK for Unix Plink) were half-arsed, and completely broke interactive logins. The problem, or at least one of the problems, was that in interactive use stdin, stdout, and stderr tend to be the same file, so setting O_NONBLOCK on the latter two also sets it on the former. Thus, we need to cope with all of them being non-blocking. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ea003621dd083741ffae697b1d7fc876 Text-delta-base-sha1: dd5ed4506656d13ccc4c2a1698474659ceda2060 Text-content-length: 28 Text-content-md5: 19912194203f85d6e30188a15c18150d Text-content-sha1: 983333048aaa0cba01f0cfe344372d6cc9154ec6 Content-length: 28 SVN��iR��{���Q Revision-number: 7743 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2007-09-24T21:44:50.880771Z K 7 svn:log V 15 Unfixed again. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/unix-plink-stdout-nonblock Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1d308c0d07c4d21d3e4b1049e7a45545 Text-delta-base-sha1: 07d3357504b688686b4c66980b375b55872f7e23 Text-content-length: 18 Text-content-md5: 22ba2357289693e56add7c9487e8a687 Text-content-sha1: b7c3853535afb0d9b52e54233e1e0ed24c621c88 Content-length: 18 SVN��(��\��<l Revision-number: 7744 Prop-content-length: 105 Content-length: 105 K 7 svn:log V 6 Typo. K 10 svn:author V 5 jacob K 8 svn:date V 27 2007-09-25T17:38:03.126289Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99eb8e90a991a096596aca7060f43f29 Text-delta-base-sha1: 17cfa1ddc53ed9d7fe500b9ce9bcaf314a615df8 Text-content-length: 117 Text-content-md5: 13135cfa23598467db734fc625d60ff6 Text-content-sha1: ad7dc619a3ea2d0cdd6c57c4916cf344f72ad716 Content-length: 117 SVN��-. ]��]�3znager</a> captures PuTTY sessions in tabs, and provides auto-login via keyboard simulation, Revision-number: 7745 Prop-content-length: 280 Content-length: 280 K 8 svn:date V 27 2007-09-29T12:27:45.101009Z K 7 svn:log V 181 Add support for resetting the terminal modes on stderr to something sensible before printing error messages to it. This should fix the stair-stepping in Plink's progress messages. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cc419d2bd653a4e5f395d7307dc1a85b Text-delta-base-sha1: ea908104a5001bbfb5c710ce1a68c0dcfecb8600 Text-content-length: 660 Text-content-md5: c10bbd509aa09592f608da008b785978 Text-content-sha1: 4877ea1643fabef35654c4824db82af7430ae3f4 Content-length: 660 SVN��stt�K�o�\G�Y * Unix-specific global flag * * FLAG_STDERR_TTY indicates that standard error might be a terminal and * might get its configuration munged, so anything trying to output plain * text (i.e. with newlines in it) will need to put it back into cooked * mode first. Applications setting this flag should also call * stderr_tty_init() before messing with any terminal modes, and can call * premsg() before outputting text to stderr and postmsg() afterwards. */ #define FLAG_STDERR_TTY 0x1000ings provided by uxcons.c */ struct termios; void stderr_tty_init(void); void premsg(struct termios *); void postmsg(struct termios * Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 88c006a97a5264d5ed6e6e28bcaa78b7 Text-delta-base-sha1: 981c9d2cb8701addb4684d3bb6a327a5c007d4c8 Text-content-length: 1150 Text-content-md5: 43119745f419a38485870b75d7c31b82 Text-content-sha1: 9fb797cd6b3dc66d1e14c9c21ca26f9affd794d3 Content-length: 1150 SVN��HKF,�a�G�_�+p�dW�53�KhO�,d�X�|cO� tr�6static struct termios orig_termios_stderr; static int stderr_is_a_tty; void stderr_tty_init() { /* Ensure that if stderr is a tty, we can get it back to a sane state. */ if ((flags & FLAG_STDERR_TTY) && isatty(STDERR_FILENO)) { stderr_is_a_tty = TRUE; tcgetattr(STDERR_FILENO, &orig_termios_stderr); } } void premsg(struct termios *cf) { if (stderr_is_a_tty) { tcgetattr(STDERR_FILENO, cf); tcsetattr(STDERR_FILENO, TCSADRAIN, &orig_termios_stderr); } } void postmsg(struct termios *cf) { if (stderr_is_a_tty) tcsetattr(STDERR_FILENO, TCSADRAIN, cf); } struct termios cfpremsg(&cf); postmsg(&cf); return 1; } else { fprintf(stderr, abandoned); postmsg(&cf struct termios cf; premsg(&cf);postmsg(&cf); return 1; } else { fprintf(stderr, abandoned); postmsg(&cf struct termios cf; premsg(&cf);postmsg(&cf);struct termios cf; premsg(&cf); fputs(message, stderr); postmsg(&cfstruct termios cf; premsg(&cf); if (console_logctx) log_eventlog(console_logctx, string); postmsg(&cf Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 19912194203f85d6e30188a15c18150d Text-delta-base-sha1: 983333048aaa0cba01f0cfe344372d6cc9154ec6 Text-content-length: 603 Text-content-md5: fccf1beac8b450d29de1eee9852f4a09 Text-content-sha1: fd09ff6d6eea16ef79437ab9910eefff0b467204 Content-length: 603 SVN��Re;��y�]�h]T�]�]�]�i]o�eY�;�?static struct termios orig_termios; void fatalbox(char *p, ...) { struct termios cf; va_list ap; premsg(&cf)postmsg(&cfmodalfatalbox(char *p, ...) { struct termios cf; va_list ap; premsg(&cf)postmsg(&cfstruct termios cf; va_list ap; premsg(&cf)postmsg(&cfmdline_error(char *p, ...) { struct termios cf; va_list ap; premsg(&cf); fprintf(stderr, "plinkpostmsg(&cf); exit(1); } static int local_tty = FALSE; /* do we have a local tty? */ | FLAG_STDERR_TTY; stderr_tty_init() Revision-number: 7746 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2007-09-29T12:30:36.993416Z K 7 svn:log V 26 Fixed, for the most part. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/unix-stderr-opost Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30c7c95d3ff9a81a13cc47b90d899726 Text-delta-base-sha1: fce5591d3672ef6c9df11beb69343fdb112e0e5d Text-content-length: 45 Text-content-md5: c945bf493b493d320d469b808511d151 Text-content-sha1: c57cf33261f1773b4a2f55bba84d323acefdc92f Content-length: 45 SVN��.I�x��7wFixed-in: r7745 2007-09-30 Revision-number: 7747 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2007-09-29T14:20:55.178298Z K 7 svn:log V 115 Now that PuTTY is actually using names "@putty.projects.tartarus.org", it seems like a good idea to document them. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5a5861f2c372c198172ae73daf751a26 Text-delta-base-sha1: 0771178e1677fce7a84dec7ba6097cf5b8e21591 Text-content-length: 29 Text-content-md5: 578c768b84cc0e67925bcf8cc47923bc Text-content-sha1: 6dce6506c89018b9ac84d4e7a604182e2cd0d072 Content-length: 29 SVN��' �&��y% sshname Node-path: putty/doc/sshnames.but Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2552 Text-content-md5: d506214304826b5b149b86b275ba9dc0 Text-content-sha1: e1b2a99c35fa1d7f131a14f9a40af3fc81fbed05 Content-length: 2562 PROPS-END SVN���jjj\define{versionidsshnames} \versionid $Id$ \A{sshnames} SSH-2 names specified for PuTTY There are various parts of the SSH-2 protocol where things are specified using a textual name. Names ending in \cw{@putty.projects.tartarus.org} are reserved for allocation by the PuTTY team. Allocated names are documented here. \H{sshnames-global} Connection protocol global request name This name can be sent in a \cw{SSH_MSG_GLOBAL_REQUEST} message. \dt \cw{simple@putty.projects.tartarus.org} \dd This is sent by a client to announce that it will not have more that one channel open at a time in the current connection. The intention is that the server, knowing this, can set the window on that one channel to something very large, and leave flow control to TCP. The format of the request is: \lcont{ \c byte SSH_MSG_GLOBAL_REQUEST \c uint32 recipient channel \c string "simple@putty.projects.tartarus.org" \c boolean want reply } \H{sshnames-channel} Connection protocol channel request name This name can be sent in a \cw{SSH_MSG_CHANNEL_REQUEST} message. \dt \cw{winadj@putty.project.tartarus.org} \dd PuTTY sends this request along with some \cw{SSH_MSG_CHANNEL_WINDOW_ADJUST} messages as part of its window-size tuning. It can be sent on any type of channel. Servers MUST treat it as an unrecognised request and respond with \cw{SSH_MSG_CHANNEL_FAILURE}. \H{sshnames-kex} Key exchange method names \dt \cw{rsa-sha1-draft-00@putty.projects.tartarus.org} \dt \cw{rsa-sha256-draft-00@putty.projects.tartarus.org} \dt \cw{rsa1024-sha1-draft-01@putty.projects.tartarus.org} \dt \cw{rsa1024-sha256-draft-01@putty.projects.tartarus.org} \dt \cw{rsa2048-sha256-draft-01@putty.projects.tartarus.org} \dt \cw{rsa1024-sha1-draft-02@putty.projects.tartarus.org} \dt \cw{rsa2048-sha512-draft-02@putty.projects.tartarus.org} \dt \cw{rsa1024-sha1-draft-03@putty.projects.tartarus.org} \dt \cw{rsa2048-sha256-draft-03@putty.projects.tartarus.org} \dt \cw{rsa1024-sha1-draft-04@putty.projects.tartarus.org} \dt \cw{rsa2048-sha256-draft-04@putty.projects.tartarus.org} \dd These appeared in various drafts of what eventually became RFC\_4432. They have been superseded by \cw{rsa1024-sha1} and \cw{rsa2048-sha256}. \H{sshnames-encrypt} Encryption algorithm names \dt \cw{arcfour128-draft-00@putty.projects.tartarus.org} \dt \cw{arcfour256-draft-00@putty.projects.tartarus.org} \dd These were used in drafts of what eventually became RFC\_4345. They have been superseded by \cw{arcfour128} and \cw{arcfour256}. Revision-number: 7748 Prop-content-length: 379 Content-length: 379 K 7 svn:log V 280 When writing session data to stdout or stderr, switch the relevant file descriptor into non-blocking mode temporarily, and correctly handle returns of EAGAIN from write(). This should fix unix-plink-stdout-nonblock, while avoiding EAGAIN turning up where we aren't expecting it. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-09-30T12:45:49.448947Z PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fccf1beac8b450d29de1eee9852f4a09 Text-delta-base-sha1: fd09ff6d6eea16ef79437ab9910eefff0b467204 Text-content-length: 434 Text-content-md5: c45dbe192da5ccc467d166c43125c23e Text-content-sha1: 985cc00d31f49b38db94ca42fc860ebea98ffb46 Content-length: 434 SVN��e( ���d, fl; if (bufchain_size(chain) == 0) return; bufchain_prefix(chain, &senddata, &sendlen); fl = fcntl(fd, F_GETFL); if (fl != -1 && !(fl & O_NONBLOCK)) fcntl(fd, F_SETFL, fl | O_NONBLOCK); ret = write(fd, senddata, sendlen); if (fl != -1 && !(fl & O_NONBLOCK)) fcntl(fd, F_SETFL, fl); if (ret > 0) bufchain_consume(chain, ret); else if (ret < 0 && errno != EAGAIN Revision-number: 7749 Prop-content-length: 104 Content-length: 104 K 7 svn:log V 7 Fixed. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-09-30T12:46:56.028026Z PROPS-END Node-path: putty-wishlist/data/unix-plink-stdout-nonblock Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 22ba2357289693e56add7c9487e8a687 Text-delta-base-sha1: b7c3853535afb0d9b52e54233e1e0ed24c621c88 Text-content-length: 45 Text-content-md5: f3365e85e2ea739ad7518124a67cd031 Text-content-sha1: f39c585f66489683439ed02b67ecbd5750bd5085 Content-length: 45 SVN��3�\��=[Fixed-in: r7748 2007-10-01 Revision-number: 7750 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 48 Set cfg.ssh_simple if there are no forwardings. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-09-30T14:14:29.240486Z PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c45dbe192da5ccc467d166c43125c23e Text-delta-base-sha1: 985cc00d31f49b38db94ca42fc860ebea98ffb46 Text-content-length: 346 Text-content-md5: f8d9ab3acf1ec03fc5d9d640c758f289 Text-content-sha1: f8886bbbd7b856eb51d10d7962dd29a9ed9f538e Content-length: 346 SVN��(u>�[�>�\LUnix Plink doesn't provide any way to add forwardings after the * connection is set up, so if there are none now, we can safely set * the "simple" flag. */ if (cfg.protocol == PROT_SSH && !cfg.x11_forward && !cfg.agentfwd && cfg.portfwd[0] == '\0' && cfg.portfwd[1] == '\0') cfg.ssh_simple = TRUE; Revision-number: 7751 Prop-content-length: 344 Content-length: 344 K 8 svn:date V 27 2007-09-30T19:42:31.692878Z K 7 svn:log V 245 Merge the looking up of channel numbers for SSH-2 channel messages into a single function which also handles checking that channels exist and are properly open. This should make PuTTY a little less tolerant of servers that send bogus messages. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: daccd8a05c2f3bb64fcfea625f52a713 Text-delta-base-sha1: 2ab46522585186808e5508497b6e7d3d38b8d30a Text-content-length: 1816 Text-content-md5: f74b5727c269905229ecff515e10e88f Text-content-sha1: 2795bdc6a6da8ac755070c3049da9b96e50cf905 Content-length: 1816 SVN�����������oz�d�l�aqM�iv�;`i�|aZ�PaQ�_R�m�(Bm�94�R4�y.�=�j{� v /* * Find the channel associated with a message. If there's no channel, * or it's not properly open, make a noise about it and return NULL. */ static struct ssh_channel *ssh2_channel_msg(Ssh ssh, struct Packet *pktin) { unsignedlocalid, ssh_channelfind); if (!c || (c->halfopen && pktin->type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION && pktin->type != SSH2_MSG_CHANNEL_OPEN_FAILURE)) { char *buf = dupprintf("Received %s for %s channel %u", ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx, pktin->type), c ? "half-open" : "nonexistent NULL; } return c;struct ssh_channel *c; struct winadj *wa; c = ssh2_channel_msg(ssh, pktin); if (!c) return;struct ssh_channel *c; c = ssh2_channel_msg(ssh, pktin); if (!c) return; if (struct ssh_channel *c; c = ssh2_channel_msg(ssh, pktin); if (!c) return;struct ssh_channel *c; c = ssh2_channel_msg(ssh, pktin); if (!c) return;struct ssh_channel *c; struct Packet *pktout; c = ssh2_channel_msg(ssh, pktin); if (!c) return;struct ssh_channel *c; struct Packet *pktout; c = ssh2_channel_msg(ssh, pktin); if (!c) return;reason_code; char *reason_string; int reason_length; struct ssh_channel *c; c = ssh2_channel_msg(ssh, pktin); if (!c) return;c = ssh2_channel_msg(ssh, pktin); if (!c) returnut, c->remoteid); ssh2_pkt_adduint32(pktout, c->localid); ssh2_pkt_adduint32(pktout, c->v.v2.locwindow); ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */ ssh2_pkt_send(ssh, pktout); } } /* * Buffer banner messages for later display at some convenient point. */�0�� Revision-number: 7752 Prop-content-length: 323 Content-length: 323 K 8 svn:date V 27 2007-10-01T21:11:11.821716Z K 7 svn:log V 224 Rather than rejecting spurious SSH_MSG_CHANNEL_SUCCESSes, and ignoring spurious SSH_MSG_CHANNEL_FAILUREs, treat them as the protocol errors they are and forcibly disconnect. Inspired by recent traffic on comp.security.ssh. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f74b5727c269905229ecff515e10e88f Text-delta-base-sha1: 2795bdc6a6da8ac755070c3049da9b96e50cf905 Text-content-length: 1767 Text-content-md5: 9e37e53ec1daefdfb12f28c922c76c79 Text-content-sha1: ce8b94020acc9838dc18a8484331fe6892cd523c Content-length: 1767 SVN�����������|�"�Y�:7�P�l��Msuccess(Ssh ssh, struct Packet *pktin) { /* * This should never get called. Allwa) ssh_disconnect(ssh, NULL, "Received SSH_MSG_CHANNEL_SUCCESS for " "\"winadj@putty.projects.tartarus.org\"", SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE); else ssh_disconnect(ssh, NULL, "Received unsolicited SSH_MSG_CHANNEL_SUCCESS", SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE) { ssh_disconnect(ssh, NULL, "Received unsolicited SSH_MSG_CHANNEL_FAILURE", SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE); return; } c->v.v2.winadj_head = wa->next; c->v.v2.remlocwin += wa->size; sfree(wa); /* * winadj messages are only sent when the window is fully open, so * if we get an ack of one, we know any pending unthrottle is * complete. */ if (c->v.v2.throttle_state == UNTHROTTLING) c->v.v2.throttle_state = UNTHROTTLED;� ~�M>h���:Vpktout); logeventf(ssh, "Rejected channel open: %s", error); sfree(c); } else { c->localid = alloc_channel_id(ssh); c->closes = 0; c->v.v2.locwindow = c->v.v2.locmaxwin = OUR_V2_WINSIZE; c->v.v2.remwindow = winsize; c->v.v2.remmaxpkt = pktsizetail = NULL; c->v.v2.throttle_state = UNTHROTTLED; bufchain_init(&c->v.v2.outbuffer); add234(ssh->channels, c); pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_adduint32(pktout, c->localid); ssh2_pkt_adduint32(pktout, c->v.v2.locwindow); ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */ ssh2_pkt_send(ssh, pktout); } } /* * Buffer banner messages for later display at some convenient point. */SUCCESS] = ssh2_msg_channel_success; Revision-number: 7753 Prop-content-length: 374 Content-length: 374 K 7 svn:log V 275 As far as I can see (at least in NetBSD) O_NONBLOCK and FIONBIO are equivalent, except that O_NONBLOCK is standardised and FIONBIO isn't. In consequence, replace our only use of FIONBIO with O_NONBLOCK. Inspired by Jonathan H N Chin, who had problems with this on Solaris. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-10-02T21:07:52.501855Z PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dda51288bc9330a9789a172d4187071e Text-delta-base-sha1: b2775501ad7a947e004b36fccab8c332082e9c42 Text-content-length: 157 Text-content-md5: 9ea78483f3c4d0a4050adbbb355173d8 Text-content-sha1: bdb35405037ab06621cfc84e4b10be9875e164e0 Content-length: 157 SVN��S ���L5fl; fl = fcntl(pty->master_fd, F_GETFL); if (fl != -1 && !(fl & O_NONBLOCK)) fcntl(pty->master_fd, F_SETFL, fl | O_NONBLOCK Revision-number: 7754 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2007-10-02T21:27:41.278413Z K 7 svn:log V 66 Problem with Xsun under Solaris 10 reported by Jonathan H N Chin. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/gtk-xsun-badatom Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 685 Text-content-md5: 9dab4eff226a04768285670ba936aed4 Text-content-sha1: a5fe7bbf1d2c3474af1db0a038f51c92066daec4 Content-length: 695 PROPS-END SVN���Summary: GTk port gives BadAtom errors when talking to Xsun Class: bug Present-in: 0.60 Difficulty: tricky Priority: medium Content-type: text/plain A problem reported when running PuTTY on Solaris 10: % : PROBLEM 2: pterm/putty exit when X server is /usr/openwin/bin/Xsun % /usr/local/bin/pterm Gdk-ERROR **: BadAtom (invalid Atom parameter) serial 3596 error_code 5 request_code 17 minor_code 0 % : putty falls over once you enter a hostname and press return % : (I guess that is when pterm gets started in this case?) % : the same binaries seem to work fine when displaying via SSH to % : a debian box running xserver-xorg_1:7.2-5 / fglrx-driver_8.38.6-2 Revision-number: 7755 Prop-content-length: 393 Content-length: 393 K 8 svn:date V 27 2007-10-02T21:43:53.783064Z K 7 svn:log V 294 More fixes to stdout and stderr. When the backlog on either clears, call the backend's unthrottle function. If we don't, we'll deadlock. While we're here, also pump as much data as possible out during each call to try_output(), rather than restricting ourselves to a single call to write(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f8d9ab3acf1ec03fc5d9d640c758f289 Text-delta-base-sha1: f8886bbbd7b856eb51d10d7962dd29a9ed9f538e Text-content-length: 866 Text-content-md5: 7b99ed9bf31c7cf44720ab9ab0fa5851 Text-content-sha1: 0ef135b5af375543e28bf16f9dc93d4f030d055f Content-length: 866 SVN��us(,�L��xP�p{8�`r'�Np�eint bufchain_size(&stdout_data) + bufchain_size(&stderr_data); do { bufchain_prefix(chain, &senddata, &sendlen); ret = write(fd, senddata, sendlen); if (ret > 0) bufchain_consume(chain, ret); } while (ret == sendlen && bufchain_size(chain) != 0); if (fl != -1 && !(fl & O_NONBLOCK)) fcntl(fd, F_SETFL, fl); if (ret < 0 && errno != EAGAIN) { perror(is_stderr ? "stderr: write" : "stdout: write"); exit(1); } return bufchain_size(&stdout_data) + bufchain_size(&stderr_data);f (is_stderr) { bufchain_add(&stderr_data, data, len); return try_output(TRUE); } else { bufchain_add(&stdout_data, data, len); return try_output(FALSE); }back->unthrottle(backhandle, try_output(FALSE)); } if (FD_ISSET(STDERR_FILENO, &wset)) { back->unthrottle(backhandle, try_output(TRUE) Revision-number: 7756 Prop-content-length: 361 Content-length: 361 K 8 svn:date V 27 2007-10-03T20:29:27.967188Z K 7 svn:log V 262 Take the code that does flow control in SSH-1, and make it work in SSH-2 as well. This won't be triggered in the usual case, but it's useful if the remote end ignores our window, or if we're in "simple" mode and setting the window far larger than is necessary. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e37e53ec1daefdfb12f28c922c76c79 Text-delta-base-sha1: ce8b94020acc9838dc18a8484331fe6892cd523c Text-content-length: 2570 Text-content-md5: 9af06b0328deead8b98f13cf72fff33f Text-content-sha1: 68ae0d0216e606728854cbccab6a557747c9d726 Content-length: 2570 SVN�����.��m�b �Be/* * True if this channel is causing the underlying connection to be * throttled. */ int throttling_conn; union {conn_throttle_conn(Ssh ssh, int adjust) { int old_count = ssh->conn_throttle_count; ssh->conn_throttle_count += adjust; assert(ssh->conn_throttle_count >= 0); if (ssh->conn_throttle_count && !old_count) { ssh_set_frozen(ssh, 1); } else if (!ssh->conn���E5Y��]�,�M�Tu�_X�%F�ze�"aP�r= GET_32BIT(s->p); s->p += 4; if (s->responselen - (s->p-s->response) < int buflimit; if (ssh->state == SSH_STATE_CLOSED) return; if (ssh->version == 1) { buflimit = SSH1_BUFFER_LIMIT; } else { buflimit = c->v.v2.locmaxwin; ssh2_set_window(c, bufsize < buflimit ? buflimit - bufsize : 0); } if (c->throttling_conn && bufsize <= buflimit) { c->throttling_conn = 0; ssh_throttle_conn(ssh, -1_throttle_connthrottling_connthrottling_connthrottling_connthrottling_connthrottling_conn && bufsize > SSH1_BUFFER_LIMIT) { c->throttling_conn = 1; ssh_throttle_conn /* * If we're either buffering way too much data, or if we're * buffering anything at all and we're in "simple" mode, * throttle the whole channel. */ if ((bufsize > c->v.v2.locmaxwin || (ssh->cfg.ssh_simple && bufsize > 0)) && !c->throttling_conn) { c->throttling_conn = 1; ssh_throttle_conn(ssh, +1); }�nHl:�Ix ���( �.#�hM�`#� � <�j#� "Agent forwarding is not enabled"; else { c->type = CHAN_AGENT; /* identify channel type */ c->u.a.lensofar = 0; } } else { error = "Unsupported channel type requested"; } c->remoteid = remid; c->halfopen = FALSE; if (error) { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURESSH2_OPEN_CONNECT_FAILED); ssh2_pkt_addstring(pktout, error); ssh2_pkt_addstring(pktout, "en"); /* language tag */ ssh2_pkt_send(ssh, throttling_conn = FALSEthrottling_conn = FALSEthrottling_conn = FALSEconnnt buflimit; _throttle_conn(ssh, -1); } } else { if (ssh->mainchan) { ssh2_set_window(ssh->mainchan, bufsize < ssh->mainchan->v.v2.locmaxwin ? ssh->mainchan->v.v2.locmaxwin - bufsize : 0); if (ssh->cfg.ssh_simple) buflimit = 0; else buflimit = ssh->mainchan->v.v2.locmaxwin; if (ssh->mainchan->throttling_conn && bufsize <= buflimit) { ssh->mainchan->throttling_conn = 0; ssh_throttle_conn(ssh, -1); } }throttling_conn = FALSE Revision-number: 7757 Prop-content-length: 246 Content-length: 246 K 8 svn:date V 27 2007-10-03T21:04:26.772436Z K 7 svn:log V 147 Factor out the increasingly complicated SSH-2 channel structure initialisation into its own function. Maintaining four copies was getting boring. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9af06b0328deead8b98f13cf72fff33f Text-delta-base-sha1: 68ae0d0216e606728854cbccab6a557747c9d726 Text-content-length: 1415 Text-content-md5: c0724212fa59c184ad14ca15448fdad0 Text-content-sha1: 9a04d8a6209e5b1af563ac6a55731bc585e8b0c9 Content-length: 1415 SVN�����������U�l�U�?bSet up most of a new ssh_channel for SSH-2. */ static void ssh2_channel_init(struct ssh_channel *c) { Ssh ssh = c->ssh; c->localid = alloc_channel_id(ssh); c->closes = 0; c->throttling_conn = FALSE; c->v.v2.locwindow = c->v.v2.locmaxwin = c->v.v2.remlocwin = ssh->cfg.ssh_simple ? OUR_V2_BIGWIN : OUR_V2_WINSIZE; c->v.v2.winadj_head = c->v.v2.winadj_tail = NULL; c->v.v2.throttle_state = UNTHROTTLED; bufchain_init(&c->v.v2.outbuffer);�nMZ_�c�P�6J�$*��g;�^&�0�V,A��'L�g;�&&w�D�Pcfg, realpf->pfrec->addressfamily); logeventf(ssh, "Attempting to forward remote port to " "%s:%d", realpf->dhost, realpf->dport); if (e != NULL) { logeventf(ssh, "Port open failed: %s", e); error = "Port open failed"; } else { logevent("Forwarded port opened successfully"); c->type = CHAN_SOCKDATA; } } } else if (typelen == 22 && !memcmp(type, "auth-agent@openssh.com", 22)) { if (!ssh->agentfwd_enabled) error = ssh2_channel_init(c); c->v.v2.remwindow = winsize; c->v.v2.remmaxpkt = pktsize2_channel_init(ssh->mainchan2_channel_init(ssh->mainchansession"); ssh2_pkt_adduint32(s->pktout, ssh->mainchan->localid)ssh2_channel_init(c); c->halfopen = TRUE; c->type = CHAN_SOCKDATA_DORMANT;/* identify channel type */ c->u.pfd.s = s Revision-number: 7758 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2007-10-03T21:06:00.395570Z K 7 svn:log V 86 snew() always returns non-NULL, so checking if its return value is NULL is pointless. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c0724212fa59c184ad14ca15448fdad0 Text-delta-base-sha1: 9a04d8a6209e5b1af563ac6a55731bc585e8b0c9 Text-content-length: 242 Text-content-md5: 417ea3f2622d6d96b27a752cb0a2f1e1 Text-content-sha1: 62bcd50726b7d671052bb41d8f527b108dd87c9e Content-length: 242 SVN����������������MI6�!�6�r[ c->ssh = ssh; ssh2_channel_init(c); c->halfopen = TRUE; c->type = CHAN_SOCKDATA_DORMANT;/* identify channel type */ c->u.pfd.s = s; add234(ssh->channels, c); Revision-number: 7759 Prop-content-length: 172 Content-length: 172 K 7 svn:log V 74 Replace mentions of SSH-2 I-Ds with references to the corresponding RFCs. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-10-03T21:21:18.406620Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 417ea3f2622d6d96b27a752cb0a2f1e1 Text-delta-base-sha1: 62bcd50726b7d671052bb41d8f527b108dd87c9e Text-content-length: 109 Text-content-md5: 78d2578496a0cac755f64e20d59e00d7 Text-content-sha1: c7638cd9f20a8668da7ec25483bc368719300eba Content-length: 109 SVN������������:��9�Xof RFC 4254RFC 4254�I@ �6��xQ &ssh->RFC 4254 Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 93142330a9b79034ff54ba7ef3189817 Text-delta-base-sha1: d14c0b2b9fe8ce34143e62216bc6eb355305a425 Text-content-length: 33 Text-content-md5: 20bbb8a93ad4cd5093839a7490a6f48b Text-content-sha1: bb24818b01593ce6b239050f4b6c66280114852c Content-length: 33 SVN��]> �K��krRFC 4250 Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 264f3c7c696a8a521cfa8f8b5040379a Text-delta-base-sha1: 896da586b5b74410e38bb2d1ace31efa1850d0c8 Text-content-length: 40 Text-content-md5: 2a549a206a18417111c91cab80c1fbb8 Text-content-sha1: a8c21d6849603f668d994fb41d4afdd789379886 Content-length: 40 SVN��ld �h��)w�H$RFC 4253RFC Revision-number: 7760 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.158337Z PROPS-END Revision-number: 7761 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.229558Z PROPS-END Revision-number: 7762 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.240814Z PROPS-END Revision-number: 7763 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.251934Z PROPS-END Revision-number: 7764 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.262612Z PROPS-END Revision-number: 7765 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.274755Z PROPS-END Revision-number: 7766 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.286098Z PROPS-END Revision-number: 7767 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.297822Z PROPS-END Revision-number: 7768 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.308743Z PROPS-END Revision-number: 7769 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.320843Z PROPS-END Revision-number: 7770 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-13T23:35:35.333680Z PROPS-END Revision-number: 7771 Prop-content-length: 254 Content-length: 254 K 8 svn:date V 27 2007-10-19T21:47:47.042521Z K 7 svn:log V 153 Marc TERRIER pointed out a couple of places that claim there is an X11 forwarding checkbox on the Tunnels panel, which hasn't been the case for a while. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e46cb20603c1c09fd2c43ff11554f72 Text-delta-base-sha1: 68abccaffa2513152dbb6f854357bcfced15cc48 Text-content-length: 105 Text-content-md5: 7fc9503568a47e3c78a331ee8e5e087b Text-content-sha1: f3fb0b4a91d8f930fff2b262d60ad98144b8b524 Content-length: 105 SVN��|D�h��loA�L5�lX11X11 panel of the PuTTY configuration box (see \k{config-ssh-x11}) Revision-number: 7772 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-27T23:35:28.770620Z PROPS-END Revision-number: 7773 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2007-10-27T16:05:02.786137Z K 7 svn:log V 62 Reset mouse reporting mode as part of resetting the terminal. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a934acce0f9971903e6325b5f619ed92 Text-delta-base-sha1: dd8534ac603a5d8659c0427e04d0ff596de91866 Text-content-length: 179 Text-content-md5: aaa77cd3a2459efe56d835122fdfdbcd Text-content-sha1: 2830f6c516ddbbd282a5d5ef95e9a47a9986e40b Content-length: 179 SVN����G�`�G�PY� =term->xterm_mouse = FALSE; set_raw_mouse_mode(term->frontend, FALSE�a:�a�erm->curr_attr &= ~ATTR_REVERSE; break; case Revision-number: 7774 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-29T00:35:21.788636Z PROPS-END Revision-number: 7775 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-29T00:35:21.876103Z PROPS-END Revision-number: 7776 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-29T00:35:21.886755Z PROPS-END Revision-number: 7777 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-29T00:35:21.899275Z PROPS-END Revision-number: 7778 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-29T00:35:21.911318Z PROPS-END Revision-number: 7779 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-29T00:35:21.922942Z PROPS-END Revision-number: 7780 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-30T00:35:24.565852Z PROPS-END Revision-number: 7781 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-30T00:35:24.637860Z PROPS-END Revision-number: 7782 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-31T00:35:28.192623Z PROPS-END Revision-number: 7783 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-31T00:35:28.283636Z PROPS-END Revision-number: 7784 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-10-31T00:35:28.295340Z PROPS-END Revision-number: 7785 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-11-02T00:36:05.807331Z PROPS-END Revision-number: 7786 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-11-02T00:36:06.110273Z PROPS-END Revision-number: 7787 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-11-06T00:35:35.598797Z PROPS-END Revision-number: 7788 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-11-06T00:35:35.777872Z PROPS-END Revision-number: 7789 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-11-25T00:35:24.093413Z PROPS-END Revision-number: 7790 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-11-25T00:35:24.219455Z PROPS-END Revision-number: 7791 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-11-25T00:35:24.233406Z PROPS-END Revision-number: 7792 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-11-26T00:35:21.257355Z PROPS-END Revision-number: 7793 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-11-26T00:35:21.429950Z PROPS-END Revision-number: 7794 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-11-26T00:35:21.446814Z PROPS-END Revision-number: 7795 Prop-content-length: 449 Content-length: 449 K 7 svn:log V 348 sktree is indexed on the numeric value of the socket structure's underlying WinSock SOCKET. Therefore, if we plan to modify the SOCKET in a socket, we must remove it from the tree before doing so, and put it back again afterwards. Otherwise it'll violate the tree's sorting order, and sooner or later someone will try to find it and get back NULL. K 10 svn:author V 5 simon K 8 svn:date V 27 2007-11-26T21:09:54.689865Z PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c3abeca9cca2f102eb7444a902f49ce Text-delta-base-sha1: 0630c4bfa37927255f29e61831ea49f596b8a465 Text-content-length: 486 Text-content-md5: 57cbe10df5bb6d6c4a68ca4d06911b3e Text-content-sha1: 90d139edf139307a3add2d3ba3bfeb7982f8b15b Content-length: 486 SVN��D;�Z��H�U~�if (a < b) return -1; if (a > b/* * Remove the socket from the tree before we overwrite its * internal socket id, because that forms part of the tree's * sorting criterion. We'll add it back before exiting this * function, whether we changed anything or not. */ del234(sktree, sock);err = 0; ret: /* * No matter what happened, put the socket back in the tree. */ add234(sktree, sock); Revision-number: 7796 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2007-11-28T20:45:50.837295Z K 7 svn:log V 28 Duplicate r7795 in uxnet.c. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f6b9cca35f2f26994b555e259386098e Text-delta-base-sha1: a786c980aa7ef83389ebb236d7e4ece2517bc45a Text-content-length: 488 Text-content-md5: d9727723ae8f766cde7d7822992680dd Text-content-sha1: 1d6066cddf7c23aa5f42df6911eb5f7e4e8da868 Content-length: 488 SVN��]@�X��II� u�";if (a < b) return -1; if (a > b) /* * Remove the socket from the tree before we overwrite its * internal socket id, because that forms part of the tree's * sorting criterion. We'll add it back before exiting this * function, whether we changed anything or not. */ del234(sktree, sock) ret: /* * No matter what happened, put the socket back in the tree. */ add234(sktree, sock); Revision-number: 7797 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-02T00:35:39.542436Z PROPS-END Revision-number: 7798 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-02T00:35:39.801710Z PROPS-END Revision-number: 7799 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:43.259420Z PROPS-END Revision-number: 7800 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:43.283031Z PROPS-END Revision-number: 7801 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:43.291191Z PROPS-END Revision-number: 7802 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:43.304212Z PROPS-END Revision-number: 7803 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:43.464277Z PROPS-END Revision-number: 7804 Prop-content-length: 324 Content-length: 324 K 7 svn:log V 225 Add a new bug-compatibility mode that limits the window size we'll advertise so that the server can't exceed our maximum packet size. Enable it for "1.36_sshlib GlobalSCAPE" which apparently sends oversize packets otherwise. K 10 svn:author V 3 ben K 8 svn:date V 27 2007-12-05T00:02:06.880825Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f5a54340a5c83ae10a6504a0a4613168 Text-delta-base-sha1: 56f2a7256ace3a2c5a9cbdf5aa1be203b0e1e947 Text-content-length: 190 Text-content-md5: 36c704b6b226034f423b0dcd833d734b Text-content-sha1: bf20dc67979d83633ddd3daf92d8e2fb9c503f87 Content-length: 190 SVN��Yw(�O�( ctrl_droplist(s, "Ignores SSH-2 maximum packet size", 'x', 20, HELPCTX(ssh_bugs_maxpkt2), sshbug_handler, I(offsetof(Config,sshbug_maxpkt2))); } } } Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b8ac920f8e5eae67c964a9f7ac636f09 Text-delta-base-sha1: 366b31bb3ee40dc54e81af3916dc1e869676e379 Text-content-length: 749 Text-content-md5: 21e9d31e25dde5a1e12809a3af6fa1f2 Text-content-sha1: e6b0fbbdca2578798ea0a3c9288fcf0eb53a2486 Content-length: 749 SVN���������m2A��A�^S{config-ssh-bug-maxpkt} \q{Ignores SSH-2 \i{maximum packet size}} \cfg{winhelp-topic}{ssh.bugs.maxpkt2} When an SSH-2 channel is set up, each end announces the maximum size of data packet that it is willing to receive for that channel. Some servers ignore PuTTY's announcement and send packets larger than PuTTY is willing to accept, causing it to report \q{Incoming packet was garbled on decryption}. If this bug is detected, PuTTY never allows the channel's \i{flow-control window} to grow large enough to allow the server to send an over-sized packet. If this bug is enabled when talking to a correct server, the session will work correctly, but download performance will be less than it could be Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e6cea7617e38f16d27e7d335359408a2 Text-delta-base-sha1: ff2d906cef1a08a349f3c3e0dfc1eebae96645e1 Text-content-length: 41 Text-content-md5: 0bb4830efcecf53b631fb759860abca4 Text-content-sha1: 98a4330faa819c5ee5c2f0e6268873564413021e Content-length: 41 SVN��;K �J��rI, sshbug_maxpkt Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 90a7591e893a58c705f69e790e045ea4 Text-delta-base-sha1: 066ce49f8d6c911a337439c7571464e4f4c2f925 Text-content-length: 119 Text-content-md5: 73fc0e393554a13607d23f95f4cb6592 Text-content-sha1: 378c7f5fead64891df018e6de2ae25e94eb165f4 Content-length: 119 SVN��\bW� ��ui� QBugMaxPkt2", 2-cfg->sshbug_maxpktgppi(sesskey, "BugMaxPkt2", 0, &i); cfg->sshbug_maxpkt Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 78d2578496a0cac755f64e20d59e00d7 Text-delta-base-sha1: c7638cd9f20a8668da7ec25483bc368719300eba Text-content-length: 1677 Text-content-md5: 4a7e16781c059bfad922fe18f7c6a8d9 Text-content-sha1: 5b4be37ecd760261145072f142a23ce9612c6749 Content-length: 1677 SVN����X�=��P<:�#define BUG_SSH2_MAXPKT 256 if (ssh->cfg.sshbug_maxpkt2 == FORCE_ON || (ssh->cfg.sshbug_maxpkt2 == AUTO && (wc_match("1.36_sshlib GlobalSCAPE", imp)))) { /* * This version ignores our makpkt and needs to be throttled. */ ssh->remote_bugs |= BUG_SSH2_MAXPKT; logevent("We believe remote version ignores SSH-2 maximum packet size���hc�I��O9bignum (s->p, s->responselen-(s->p-s->response), &s->key.exponent); if (n < 0) break; s->p += n; n = ssh1_read_bignum (s->p, s->responselen-(s->p-s->response), &s->key.modulus); if (n < 0) break; s->p += n; if (s->responselen - (s->p-s->response) < 4) break; s->commentlen If the remote end has a habit of ignoring maxpkt, limit the * window so that it has no choice (assuming it doesn't ignore the * window as well). */ if ((ssh->remote_bugs & BUG_SSH2_MAXPKT) && newwin > OUR_V2_MAXPKT) newwin = OUR_V2_MAXPKT; �@8xx�@� !memcmp(type, "forwarded-tcpip", 15)) { struct ssh_rportfwd pf, *realpf; char *dummy; int dummylen; ssh_pkt_getstring(pktin, &dummy, &dummylen);/* skip address */ pf.sport = ssh_pkt_getuint32(pktin); ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen); peerport = ssh_pkt_getuint32(pktin); realpf = find234(ssh->rportfwds, &pf, NULL); logeventf(ssh, "Received remote port %d open request " "from %s:%d", pf.sport, peeraddr, peerport); if (realpf == NULL) { error = "Remote port is not recognised"; } else { const char *e = pfd_newconnect(&c->u.pfd.s, realpf->dhost, realpf->dport, c, Revision-number: 7805 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2007-12-05T00:13:14.202638Z K 7 svn:log V 48 Document the server bug reported by Brad Baker. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-bug-maxpkt Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1941 Text-content-md5: aa75e57e2277b258cd23096b7b3e1870 Text-content-sha1: b4366471ef656d62718acb63c003f7fe6cf14e8a Content-length: 1951 PROPS-END SVN���Summary: Servers send oversize packets, leading to garbled packet errors Class: wish Difficulty: fun Priority: medium Absent-in: 0.60 Present-in: 2007-11-29 r7796 Fixed-in: 2007-12-06 r7804 Content-type: text/x-html-body <p>When using one SSH-2 server, identifying itself as "1.36_sshlib GlobalSCAPE", PuTTY reports "Incoming packet was garbled on decryption". This was originally <a href="http://forum.filezilla-project.org/viewtopic.php?f=2&t=4925">reported as a bug in FileZilla</a>, and turns out to be a bug in the server. <p>When PuTTY opens the data channel for the SFTP session, it sends SSH_MSG_CHANNEL_OPEN, and states a window size of 0x7FFFFFFF (2147483647) bytes but a maximum packet size of 0x4000 (32768). That is, the server is permitted to send almost any amount of data without requiring an SSH-level acknowledgment from PuTTY, but may not send an <em>individual packet</em> larger than 32768 bytes. <p>The server is disregarding the specified maximum packet size, and is sending a packet of 65548 bytes. PuTTY treats this as a decryption failure, since the most common reason for the packet length to be out of range is because there was a disagreement in the bulk encryption between client and server, causing the packet length field to decrypt to random garbage data. In fact that isn't the cause of the problem in this case, but PuTTY unfortunately can't determine that by itself. <p>This appears to have started happening as of r7672 in the PuTTY source base, which is when PSFTP began presenting a window size larger than its packet size. Prior to that, this server would not have generated too-large packets because it was honouring the window size limit. However, it is the server which is behaving incorrectly; PuTTY's change in behaviour is entirely legitimate. <p>PuTTY now detects this particular server software and limits the window size it advertises in order to work around the problem. Revision-number: 7806 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2007-12-05T00:28:22.793491Z K 7 svn:log V 56 Document maxpkt bug under garbled packet error message. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 21e9d31e25dde5a1e12809a3af6fa1f2 Text-delta-base-sha1: e6b0fbbdca2578798ea0a3c9288fcf0eb53a2486 Text-content-length: 42 Text-content-md5: 9143fe7aad6f6fa9356558003d9990c8 Text-content-sha1: 2558471fbcc7b25d78a3434a8dc5025f56842760 Content-length: 42 SVN���������23 �*��*2 Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8df372909e9c5a885e50d27d656af48e Text-delta-base-sha1: 8e5fa116f37bd96bfaf07736a901c85da6ab7ec7 Text-content-length: 211 Text-content-md5: dd2670da971b1366d268e6d0dddabfbe Text-content-sha1: bc73e65558da3467b84bd903d63b6608d818b28f Content-length: 211 SVN��h3 ;�w�;�g with the setting of \q{Miscomputes SSH-2 encryption keys} (see \k{config-ssh-bug-derivekey2}) or \q{Ignores SSH-2 maximum packet size} (see \k{config-ssh-bug-maxpkt2}) on the Bugs panel Revision-number: 7807 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:44.418430Z PROPS-END Revision-number: 7808 Prop-content-length: 141 Content-length: 141 K 8 svn:date V 27 2007-12-05T17:20:29.374552Z K 7 svn:log V 41 Belated commit of new redirect for 0.60. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 410343d1f7a2a80e1bed603b28378b06 Text-delta-base-sha1: f29e60c58034846f358c9da9fe9e848b120872e8 Text-content-length: 90 Text-content-md5: d334fe88d0c6ce45acde625bab030cd7 Text-content-sha1: d2ad0536b81fcbfc59f38562b5b4851e72be77f8 Content-length: 90 SVN��V D�B�D�P7temp /~sgtatham/putty/0.60/ http://the.earth.li/~sgtatham/putty/0.60 Revision-number: 7809 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2007-12-06T23:48:28.977314Z K 7 svn:log V 89 Update to mention rexec (which is practically the same) and where to get specifications. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/rsh-backend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bcd1ab6904d62ef72a83b9b6101a7268 Text-delta-base-sha1: 4a77a694d66d771b45ac23173d5685023f71d256 Text-content-length: 275 Text-content-md5: a38fe2cc7ba8b38b139b89e74c8db519 Text-content-sha1: 94006de0c9bcdeb2d272de67fab8a1e3daced6b7 Content-length: 275 SVN��|��|aSummary: rsh and rexec backends and rexec. The only difference between them is that rsh relies on privileged ports while rexec passes a password. Oh, and they run on different ports. The protocols are documented in the manual pages for rshd and rexecd. Revision-number: 7810 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:44.882923Z PROPS-END Revision-number: 7811 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:44.973094Z PROPS-END Revision-number: 7812 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:44.984493Z PROPS-END Revision-number: 7813 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:44.988078Z PROPS-END Revision-number: 7814 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:45.082894Z PROPS-END Revision-number: 7815 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2007-12-15T10:41:40.860834Z K 7 svn:log V 60 r7804 neglected to add a help context #define to winhelp.h. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04c8d62b502dbcba540bee8ca46e3a2f Text-delta-base-sha1: ba3fc5e4bc9d8a84bb8644be5b55494ec1dcd968 Text-content-length: 77 Text-content-md5: a0bfb7976729460f1bfcee1f5406c4c5 Text-content-sha1: 19fed566d8690f190377b9a802fe24bca8b501bb Content-length: 77 SVN��l 8�s��A\sh_bugs_maxpkt2 "ssh.bugs.maxpkt2:config-ssh-bug-maxpkt2 Revision-number: 7816 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:45.296206Z PROPS-END Revision-number: 7817 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:45.308557Z PROPS-END Revision-number: 7818 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-18T09:37:45.336668Z PROPS-END Revision-number: 7819 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-19T00:34:53.538705Z PROPS-END Revision-number: 7820 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-19T00:34:53.598344Z PROPS-END Revision-number: 7821 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-19T00:34:53.611636Z PROPS-END Revision-number: 7822 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-19T00:34:53.680840Z PROPS-END Revision-number: 7823 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2007-12-20T11:02:26.786992Z K 7 svn:log V 112 Add rel="nofollow" to all the mirror links, and make the text about new mirror sites significantly less fluffy. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1f072e41704504aeee91ce5627be8ea9 Text-delta-base-sha1: 78be178498ef12f9fc83e1f22a71db93c500c554 Text-content-length: 7060 Text-content-md5: c566d8e82f872c28ad64d87cd10059d4 Text-content-sha1: d5f2be9486e30b9199029e8fdad3cf50eff28b53 Content-length: 7060 SVN��Hp0U�{��_J�p(�l�vw�l�jq��Z�hY�f@�n%~�vs�nh�U�sZ �s:�q,�}� �$��+�n*�y�q�j�h�lu�p` �{<�m6�}"�q�st�f�nm�|Z�rU �z5�v.�v#�|�v|�tq�nd��Q�rP�A�=�p=�u,� �{'�l!�p}�pl�l[ �v5�n*�r �hu�t\ �o>�w,�l"�uu�qi�vY�rN��?�x>�|5�z0��)�y(� �|!�v�z�| �Hx�en�i:�}"�q�s�u��pt�nc�k2�n�ks�o]�uK�t?�n2�a�c�da �q4�q$� ��v"�u� ��u ��s�iq�oY �i3�i�@@�ws�oi�mWG�@@�};�g7�q�z �{�}��|�w��v�ct�{V�-P�x|�Ps^�`te�tn�e_�S|�ToA�W� s�|� �I&�Us <p> If you would like to set up another mirror, seerel="nofollow"rel="nofollow"rel="nofollow" href="http://mirror.afoyi.com/putty/">mirror.afoyi.com</a> in Australia<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://www.putty.be/">putty.be</a> in Belgium<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.giga.com.br/">putty.giga.com.br</a> in Brazil<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.zone-h.org/">putty.zone-h.org</a> in Estonia<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.cict.fr/">putty.cict.fr</a> in France<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.visiolab.de/">putty.visiolab.de</a> in Germany<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.xedio.de/">putty.xedio.de</a> in Germany<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.mirrorplus.org/">putty.mirrorplus.org</a> in Germany<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow" href="http://putty.huewebrothers.de/">putty.huewebrothers.de</a> in Germany<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.internet.bs/">putty.internet.bs</a> in Hong Kong<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.cbn.net.id/">putty.cbn.net.id</a> in Indonesia<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.fagioli.biz/">putty.fagioli.biz</a> in Italy<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow" href="http://ftp.kaist.ac.kr/pub/putty/">kaist.ac.kr</a> in Korea<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.ion.lu/">putty.ion.lu</a> in Luxembourg<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://www.putty.nl/">puttyrel="nofollow"rel="nofollow" href="http://putty.fupp.net/">putty.fupp.net</a> in Norway<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.n9.ru/">putty.n9.ru</a> in Russia<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.lamer.sk/">putty.lamer.sk</a> in Slovakia<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.nocona.info/">putty.nocona.info</a> in Thailand<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://ftp.wayne.edu/putty/">ftp.wayne.edu</a> in the US<!--MIRRORSTATUS-->. <li> <!--HTTPMIRROR--><a rel="nofollow"rel="nofollow"rel="nofollow" href="http://putty.grephead.com/">putty.grepheadrel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="http://mirror.zonekeep.com/putty/">mirror.zonekeeprel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow" href="ftp://cdot.senecac.on.ca/pub/software/putty">cdot.senecac.on.ca</a> in Canada. <li> <a rel="nofollow" href="ftp://miroir-francais.fr/pub/putty/">miroir-francais.fr</a> in France. <li> <a rel="nofollow"rel="nofollow" href="ftp://netmirror.org/putty/">netmirror.org</a> in Germany. <li> <a rel="nofollow"rel="nofollow" href="ftp://totem.fix.no/pub/mirrors/putty/">totem.fix.no</a> in Norway. <li> <a rel="nofollow"rel="nofollow"stable-release/">ftp.man.szczecin.pl</a> in Poland. <li> <a rel="nofollow" href="ftp://ftp.ds5.agh.edu.pl/pub/putty">ftp.ds5.agh.edu.pl</a> in Poland. <li> <a rel="nofollow" href="ftp://ftp.mipt.ru/mirror/putty/">ftp.mipt.ru</a> in Russia. <li> <a rel="nofollow"rel="nofollow" href="ftp://putty.dudcore.net/pub/">putty.dudcore.net</a> in the US. <li> <a rel="nofollow" href="ftp://diis.net/pub/mirror/putty/">diis.net</a> in the US. <li> <a rel="nofollow"rel="nofollow"rel="nofollow"rel="nofollow"ese two paragraphs also in putty/doc/feedback.but, with minor context changes --> <p> If you want to set up a mirror of the PuTTY website, go ahead and set one up. Please don't bother asking us for permission before setting up a mirror. You already have permission. <p> If the mirror is in a country where we don't already have plenty of mirrors, we may be willing to add it to the list on this page. Read the guidelines below, make sure your mirror works, and email us the information listed at the bottom of the page. <p> <b>NOTE</b>: We do not <em>promise</em> to list your mirror, or anyone's. We get a lot of mirror notifications, and yours may not happen to find its way to the top of the list. <p> <b>NOTE</b> also: as of 2007-12-20, we link to all our mirror sites using the <code>rel="nofollow"</code> attribute. Running a PuTTY mirror is not intended to be a cheap way to gain search rankings<code>wget</code> Revision-number: 7824 Prop-content-length: 194 Content-length: 194 K 8 svn:date V 27 2007-12-20T11:03:45.025572Z K 7 svn:log V 94 Make the text about our interest in new mirror sites significantly less fluffy and welcoming. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 432b03d67a64a7733541127eb04b0841 Text-delta-base-sha1: 0f54942fbffee142e4080c08d295461f72ab5d31 Text-content-length: 140 Text-content-md5: 546143ae55d9a624ee680db5999abb95 Text-content-sha1: c5cd182f4c5012941a7dabd8b97c306b79145dcb Content-length: 140 SVN�� @ r��r�>Mparticularly valuable mirror of the PuTTY web site, we might be interested in linking to you from our Mirrors page Node-path: putty/doc/feedback.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b56ed11a86491fcb53c3b3fc5fa04666 Text-delta-base-sha1: 9d4a2e72301957835100cb5a23873420be60b5d6 Text-content-length: 855 Text-content-md5: 17ea400ece123a5330d77decb666aaac Text-content-sha1: 046b97b4cbd6a6c95f5454aab45c01d6385662dd Content-length: 855 SVN��3�R�&�k{ �'m the next two paragraphs also on the Mirrors page itself, with \# minor context changes If you want to set up a mirror of the PuTTY website, go ahead and set one up.the mirror is in a country where we don't already have plenty of mirrors, we may be willing to add it to the list on our \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/mirrors.html}{mirrors page}. Read the guidelines on that page, make sure your mirror works, and email us the information listed at the bottom of the page. Note that we do not \e{promise} to list your mirror: we get a lot of mirror notifications and yours may not happen to find its way to the top of the list. Also note that we link to all our mirror sites using the \c{rel="nofollow"} attribute. Running a PuTTY mirror is not intended to be a cheap way to gain search rankings Revision-number: 7825 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-30T00:34:41.285299Z PROPS-END Revision-number: 7826 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-30T00:34:41.303589Z PROPS-END Revision-number: 7827 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2007-12-30T00:34:41.316914Z PROPS-END Revision-number: 7828 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-01-09T00:34:43.474200Z PROPS-END Revision-number: 7829 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2008-01-08T10:06:11.750985Z K 7 svn:log V 50 Update the SVN repository URLs for the new world. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c040ce7a60a8a0c96bb238dd7521c07c Text-delta-base-sha1: 5be1a5d75383e5a8bedae3a14c313eab326f6cbd Text-content-length: 96 Text-content-md5: 222e76d9a1fc49bcddbd25e5d85785b0 Text-content-sha1: 8f8323078c38036f32a1f0b78bf1e9a2b3b02fa6 Content-length: 96 SVN�� <� ��l7�V:�y'svn.tartarus.org/sgtsvn.tartarus.org/sgtsvn.tartarus.org/sgt Revision-number: 7830 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2008-01-08T10:07:00.359831Z K 7 svn:log V 49 Update the SVN repository URL for the new world. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/port-unix-gtk2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 65d28c184b8d95f8234b8d4355b64e34 Text-delta-base-sha1: 09ff0192cb03277c4357be3bb50a39dfe74d5560 Text-content-length: 50 Text-content-md5: d5504eedc5e216a2c5a43e4312382d3a Text-content-sha1: 57b438723adf31cd74524fe02c9220ba40cbd7a4 Content-length: 50 SVN��$!"��svn.tartarus.org/sgt/putty-gtk2 . Revision-number: 7831 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2008-01-08T16:12:43.787688Z K 7 svn:log V 68 Update wording: we've implemented Windows local proxies since then. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/port-knocking Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f4e115ff7d2b20ed270ff8f4a1eb3a72 Text-delta-base-sha1: c415ee394e454bb39ec5c760ca5c73ec60b182bd Text-content-length: 1025 Text-content-md5: 5fdb588fee494f894fd81544ce9cf603 Text-content-sha1: 11a178af555f307ad0c039026e8b805f5e6a43f3 Content-length: 1025 SVN��>^�Z�H�V2�zr�6`Write a small command-line application which performs the port knock, makes the connection, and then gateways the connection to its standard input and output: a port-knocking enabled equivalent of <a . Then invoke that using the "Local" proxy setting in PuTTY (works on both Windows and Unix). <li> Write a SOCKS server which understands your port knocking, and performs the appropriate knock before proxying any given connection. Point PuTTY at it using our existing SOCKS proxy support. <li> An even simpler approach: write a script which runs the knock program, and <em>then</em> launches PuTTY and tells it to connect to the appropriate host. The <a href="http://doorman.sourceforge.net/">doorman.sourceforge.net</a> client, for example, is intended to be used this way. <li> (Unix only) Construct a dynamic library which replaces the <code>connect</code>(2) system call so that it performs the knock first. Then you can use <code>LD_PRELOAD</code> to apply it to almost any application Revision-number: 7832 Prop-content-length: 161 Content-length: 161 K 7 svn:log V 61 Er, finish updating. I meant to remove that paragraph. Ahem. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-01-08T16:14:59.750699Z PROPS-END Node-path: putty-wishlist/data/port-knocking Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5fdb588fee494f894fd81544ce9cf603 Text-delta-base-sha1: 11a178af555f307ad0c039026e8b805f5e6a43f3 Text-content-length: 15 Text-content-md5: f3b8fc3dfd333dd0141dc830daa65da9 Text-content-sha1: 396e502c5df5032c7649eba6bbac665fd5a7ebb0 Content-length: 15 SVN��> �� � Revision-number: 7833 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-01-10T00:35:01.836562Z PROPS-END Revision-number: 7834 Prop-content-length: 122 Content-length: 122 K 7 svn:log V 22 Typo in winadj@ name. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-01-09T19:59:16.542006Z PROPS-END Node-path: putty/doc/sshnames.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d506214304826b5b149b86b275ba9dc0 Text-delta-base-sha1: e1b2a99c35fa1d7f131a14f9a40af3fc81fbed05 Text-content-length: 22 Text-content-md5: 86a93154e9d3e88499e32a40aacda6dc Text-content-sha1: 0586879cf1b16234582484e973170b3879ca3e7d Content-length: 22 SVN��jk �S��Ss Revision-number: 7835 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-01-14T00:34:48.120743Z PROPS-END Revision-number: 7836 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-01-16T00:34:45.452662Z PROPS-END Revision-number: 7837 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-01-18T00:34:41.429756Z PROPS-END Revision-number: 7838 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-01-18T00:34:41.482606Z PROPS-END Revision-number: 7839 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-01-23T00:34:53.209212Z PROPS-END Revision-number: 7840 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-01-23T00:34:53.346126Z PROPS-END Revision-number: 7841 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-05T00:34:51.841371Z PROPS-END Revision-number: 7842 Prop-content-length: 448 Content-length: 448 K 7 svn:log V 347 Update everything to use tartarus.org instead of www.tartarus.org (since James officially only supports tartarus.org these days). In many cases this just saves a redirect, but in the case of links to the snapshot documentation, which often use fragments, the redirect was losing the fragment. Also, fix the web SVN URL, as it was actually broken. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-02-10T13:51:57.741045Z PROPS-END Node-path: putty-website/autogen.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f7ea2c0f7a2d125aca92512a3d84c993 Text-delta-base-sha1: 621a0377d4383b8dc762d33e32720d49cbcba583 Text-content-length: 19 Text-content-md5: 71b8b86365c3c3d83e335b0bf0b28835 Text-content-sha1: 0ecad03a774e0c90bde70d02351d28f1ab15587e Content-length: 19 SVN�����;��E? Node-path: putty-website/docs.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d946acb0fbc98d183f82c8956c04039 Text-delta-base-sha1: c85fdfca6b781a482c0ef4a021eeb97f76c6fe09 Text-content-length: 185 Text-content-md5: 7d5989894e5ef43ed3f588694a654577 Text-content-sha1: 5e8d480e39b2b264eccf9915b7e1a319d7aeeec5 Content-length: 185 SVN��@(�E�m�:� =�g}�vX�nRtartarus.org/~simon/putty-snapshots/puttydoc.txt">The plain text version</a> (one file) <li> <a href="http://tartarus.org/~simon/putty-snapshots Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 222e76d9a1fc49bcddbd25e5d85785b0 Text-delta-base-sha1: 8f8323078c38036f32a1f0b78bf1e9a2b3b02fa6 Text-content-length: 480 Text-content-md5: ecac8b78cb0ded5336e615164abe09a7 Text-content-sha1: 012e835a48286a3936a19c57a77da370f91cfa8f Content-length: 480 SVN��l&+�l��Cp�^7�|�L�ai�{N�@M]�xr�Cn�^5�y�C^�{=�I<`�~m�Lo�a?�|$�C$�^k�UM�&�h1�P�5q�X*�/�v9�]3�@�GX�^#��NItartarus.org/~simon/putty-snapshots/x86/pscp.exe.RSA">(RSA sig)</a></td> <td><a href="http://tartarus.org/~simon/putty-snapshots/x86/plink.exe.RSA">(RSA sig)</a></td> <td><a href="http://tartarus.org/~simon/putty-snapshots/x86/pageant.exe.RSA">(RSA sig)</a></td> <td><a href="http://svn.tartarus.org Revision-number: 7843 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 Update web-SVN URL for kh2reg.py. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-02-10T14:00:51.060071Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 546143ae55d9a624ee680db5999abb95 Text-delta-base-sha1: c5cd182f4c5012941a7dabd8b97c306b79145dcb Text-content-length: 40 Text-content-md5: 961610436f68f2b5106dcd6f97fa59d9 Text-content-sha1: 9481f66ed3e1f6eb06a419c6b02ca1d154971b86 Content-length: 40 SVN��@% �S��B~svn.tartarus.org Revision-number: 7844 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2008-02-10T14:17:58.921452Z K 7 svn:log V 33 Update for new web SVN location. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eb3f9fb8fcf2d483f6ea4ae62cb01d43 Text-delta-base-sha1: 348b90d2994d8ea4e26faa661d9d3e5c6d202ad4 Text-content-length: 39 Text-content-md5: a8422b70e577e30517ce17600987c43b Text-content-sha1: ba080c8a8ab1fc6d3325528863e34260e7ebc732 Content-length: 39 SVN��g �K�� vsvn.tartarus.org Revision-number: 7845 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 56 Mass update of URLs reflecting changes to tartarus.org. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-02-10T14:42:39.235638Z PROPS-END Node-path: putty-wishlist/data/accept-host-keys Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 177cf0e408c4803eda23998ece4667f0 Text-delta-base-sha1: cb5b697a9c68e491239133e9c1fab26e8f49af77 Text-content-length: 37 Text-content-md5: 876a9f0c62a8f1cab6e8e5ec7ef23325 Text-content-sha1: dd64f78a1f9c8e73074fa5ab38072a49403785ff Content-length: 37 SVN�� �l��svn.tartarus.org Node-path: putty-wishlist/data/config-locations Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 29e94d7432bcee7ab4576c64ddd996cb Text-delta-base-sha1: fce496e97468644dcc798d4c41437b2e16814b66 Text-content-length: 20 Text-content-md5: 56771362b2e590b7cba0958a8ea5a858 Text-content-sha1: fc0bbaf88ac0aa30434c0152905f9db67556d3a2 Content-length: 20 SVN��} ��Q��,U Node-path: putty-wishlist/data/cryptoapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0acf3886c5ff2f9ca2e95b815b8ec5ee Text-delta-base-sha1: 2c167a55d222bdb21f6995acfee9fbb6a44e3414 Text-content-length: 37 Text-content-md5: 733498b6571f6e0b737165684abb358c Text-content-sha1: 199d1fafdb61ba6bc91bb85b9057d6029f29c64d Content-length: 37 SVN��|a �*��'Usvn.tartarus.org Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 65b5ac478cbd77514ddbab5586d6850c Text-delta-base-sha1: 71bea34b84e472b3e4a7d4298a21d7c0cfad8481 Text-content-length: 61 Text-content-md5: 20cdd84f89332fecd2227385cebbd5a7 Text-content-sha1: fef48fa83dbc1ccf2f2c6fad8f5daa4d7c3dd7d5 Content-length: 61 SVN��]h (���<!tartarus.org/~simon/putty-snapshots/html Node-path: putty-wishlist/data/no-terminal-window Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0050c76a9e6a4565b501d2f12b3ba2de Text-delta-base-sha1: 1e037f51d7bc885ede344ca06480e2b68d3ab63a Text-content-length: 61 Text-content-md5: d7c8f35823f419a7e8a5078bdb07e6e1 Text-content-sha1: 7c78552577c7f83d3c02685011f45260f1e79487 Content-length: 61 SVN��"- (����"tartarus.org/~simon/putty-snapshots/html Node-path: putty-wishlist/data/port-mac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f65b56a2a6b821bfa31dc764ac5e460 Text-delta-base-sha1: 2a6d5a956e2b31977e37e1f815a1fc03fe5ddca3 Text-content-length: 145 Text-content-md5: ec25dae06249f25f795379c8146f415a Text-content-sha1: e81743e58b6e996dae5caa57946a16d95fc8c547 Content-length: 145 SVN��&p {�h�{� svn.tartarus.org/putty/mac/README.mac?view=markup">mac/README.mac</a> (classic Mac OS) <li><a href="http://svn.tartarus.org Node-path: putty-wishlist/data/pscp-multi-remote-src Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 65aa4b9d8cc0ffdc9183d1b5d0728216 Text-delta-base-sha1: 120d9813a0ebf400dd0648066dded2d183c3d983 Text-content-length: 97 Text-content-md5: 120647f5ddee80c2736077ba11929e3a Text-content-sha1: 2a78f56286cbc1c9e05e41ac31467f3cf14ee707 Content-length: 97 SVN��Yo K�I�K�[~tartarus.org/~simon/putty-snapshots/htmldoc/Chapter5.html#pscp-usage-basics Node-path: putty-wishlist/data/pterm-scrollopt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3a10d8032098c0ad5c233a2ef5b9cbd2 Text-delta-base-sha1: f2c32e11bf91d1172664a2fa34dfc6a430d5dfb3 Text-content-length: 203 Text-content-md5: 9468867e8c8de39d38faa002c2ef931e Text-content-sha1: dd9ed340eae093ac2fb52c1670609f7e45935497 Content-length: 203 SVN��@8��8once had a patch to add scroll optimisation to pterm. I don't know where it's gone; last seen <a href="http://www.tartarus.org/~richard/putty-patches/#patch_pterm_scrollopt">here</a>. Node-path: putty-wishlist/data/pubkeyfile-and-pageant Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6cb4fbdbed4f748da159ddfbbf24cc20 Text-delta-base-sha1: 3dc4609b3b1faabaf7a9f16f1b569f3e8ece8cf7 Text-content-length: 61 Text-content-md5: c4ab7427d058ec1051c99fbe3c4ed7eb Text-content-sha1: a648778db8a78cfd0b063780b1c7ea4626cd1b33 Content-length: 61 SVN��*5 (�|��tartarus.org/~simon/putty-snapshots/html Node-path: putty-wishlist/data/ssh-bug-rekey2-notsaved Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 788e38c62eb3bd8028b436e7623f3820 Text-delta-base-sha1: a1dcb1a6e77600bb323da9cea0567e8e9b0dac2f Text-content-length: 61 Text-content-md5: 59a96f502a1623fb8d0121f4000f926b Text-content-sha1: 6a3cffe7a409f673280d667068f4bd1868d9849d Content-length: 61 SVN��>I (�r��/tartarus.org/~simon/putty-snapshots/html Node-path: putty-wishlist/data/ssh2-cisco-pw-pad Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a7f504e342cd58ccea9c31d3f901b54 Text-delta-base-sha1: 0d60145b08dedaa343a6eb57dae811cb197ed31e Text-content-length: 60 Text-content-md5: 135eb8a8ad61fe60b75ac9393dfd2db7 Text-content-sha1: 8e8bbc41d583534af477a7b9c6b6b59a1cb98ef6 Content-length: 60 SVN��jP '�]��Lsvn.tartarus.org/?view=rev&rev=5122 Node-path: putty-wishlist/data/ssh2.0.11-keyderive-nonbug Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 41b9795fe7552b2f8bef86f431409a97 Text-delta-base-sha1: ab8cdd47aed8086862931f944b0357fade173e9f Text-content-length: 37 Text-content-md5: 078b37ccfc05c00a324bee98df974a9f Text-content-sha1: 9f3a902978a5d4314900e3f622f2dfcd65b5bfb5 Content-length: 37 SVN��t � ��Z5svn.tartarus.org Node-path: putty-wishlist/data/unix-kex-packet Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fa9fbe38a980173e4e67ab0e49e369ba Text-delta-base-sha1: 77e01d463f3411ad64ad004e2c489305a914e629 Text-content-length: 37 Text-content-md5: 4b646b04aa585c149a62ec8758bb96a2 Text-content-sha1: 9df3773237ae25d763ab09c52eae5ace49558717 Content-length: 37 SVN��<! �.��cYsvn.tartarus.org Node-path: putty-wishlist/data/url-launching Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8683f463ce68b3c0156599eada532947 Text-delta-base-sha1: 8c27ec1001407280c1acfacc49342148bb6dfc20 Text-content-length: 61 Text-content-md5: 6b58208966099c3006d002f405c408a1 Text-content-sha1: 1e5c60aab75db6d9d4557f2aeb39a494947b8426 Content-length: 61 SVN��'2 (�"��h?tartarus.org/~simon/putty-snapshots/html Node-path: putty-wishlist/data/win-redraw Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f7183d55e14fc5b0a5020004f073a29 Text-delta-base-sha1: 77dcff6198becd6c009976bc37656f946933de57 Text-content-length: 20 Text-content-md5: 23fdef0fefa45f6edd5a7bf9f1283e61 Text-content-sha1: b87b3b6ca1b05ad5340a3d995b03af55ad9ec259 Content-length: 20 SVN��:6 ��v��@z Node-path: putty-wishlist/data/win-versioninfo Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 78b5b1abc1e5198d68f031fea703298b Text-delta-base-sha1: 1e5f0ec6f9ef45450758061f4ebc07bbaf0962b1 Text-content-length: 37 Text-content-md5: de5a0153e9dd94dae4a2aceaa169fc77 Text-content-sha1: b5bc4bf5c5e3a69a693b169ea3decd92cf142318 Content-length: 37 SVN��pY �X��qsvn.tartarus.org Node-path: putty-wishlist/data/xp-wont-run Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1679ea8385cedacb735dbf41cf7631ad Text-delta-base-sha1: 8d21c4c90d27f9af308ea603edbb440be4f2d5de Text-content-length: 80 Text-content-md5: e6023b843784908e06c898cc1551a595 Text-content-sha1: 1f1fccddbdc2ad3e80672bd342756f053dce6a0e Content-length: 80 SVN��x'0�V��$� P�tsvn.tartarus.orgsvn.tartarus.orgsvn.tartarus.org Revision-number: 7846 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-11T00:34:49.427528Z PROPS-END Revision-number: 7847 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-11T00:34:49.433612Z PROPS-END Revision-number: 7848 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-11T00:34:49.448295Z PROPS-END Revision-number: 7849 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-11T00:34:49.462834Z PROPS-END Revision-number: 7850 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-14T00:34:39.908414Z PROPS-END Revision-number: 7851 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-14T00:34:39.980018Z PROPS-END Revision-number: 7852 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-15T00:34:45.869719Z PROPS-END Revision-number: 7853 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-15T00:34:45.925775Z PROPS-END Revision-number: 7854 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-15T00:34:45.965458Z PROPS-END Revision-number: 7855 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-17T00:34:54.255935Z PROPS-END Revision-number: 7856 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-17T00:34:54.325768Z PROPS-END Revision-number: 7857 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-17T00:34:54.333888Z PROPS-END Revision-number: 7858 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-17T00:34:54.367545Z PROPS-END Revision-number: 7859 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-17T00:34:54.506084Z PROPS-END Revision-number: 7860 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-17T00:34:54.513870Z PROPS-END Revision-number: 7861 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-17T00:34:54.522085Z PROPS-END Revision-number: 7862 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-20T00:35:04.133403Z PROPS-END Revision-number: 7863 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-21T00:34:56.103955Z PROPS-END Revision-number: 7864 Prop-content-length: 365 Content-length: 365 K 8 svn:date V 27 2008-02-21T09:18:24.270182Z K 7 svn:log V 264 Aha, _that's_ why I've been periodically getting blocking-write problems using Unix PuTTY port forwarding. Sockets we create by connect() are immediately set into nonblocking mode by fcntl, but sockets we create by accept() were not. This trivial fix should help. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d9727723ae8f766cde7d7822992680dd Text-delta-base-sha1: 1d6066cddf7c23aa5f42df6911eb5f7e4e8da868 Text-content-length: 165 Text-content-md5: 482cefe01fa565730c807372f5fcaee2 Text-content-sha1: d269224642ed49fda811196d696225e6ccc22b7f Content-length: 165 SVN���Q��|Pq�FJ int fl; fl = fcntl(t, F_GETFL); if (fl != -1) fcntl(t, F_SETFL, fl | O_NONBLOCK); Revision-number: 7865 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-22T00:34:40.723325Z PROPS-END Revision-number: 7866 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-23T00:34:46.107760Z PROPS-END Revision-number: 7867 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-23T00:34:46.139500Z PROPS-END Revision-number: 7868 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-23T00:34:46.142851Z PROPS-END Revision-number: 7869 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-23T00:34:46.241532Z PROPS-END Revision-number: 7870 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-24T00:34:50.549257Z PROPS-END Revision-number: 7871 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-24T00:34:50.613571Z PROPS-END Revision-number: 7872 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-24T00:34:50.630256Z PROPS-END Revision-number: 7873 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-24T00:34:50.656043Z PROPS-END Revision-number: 7874 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-24T00:34:50.746270Z PROPS-END Revision-number: 7875 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-24T00:34:50.776915Z PROPS-END Revision-number: 7876 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2008-02-23T17:30:10.918206Z K 7 svn:log V 48 Another "Unable to read from standard input" :( K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-plink-stdin-eof Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e45fb670fce93a7890568af418bb979 Text-delta-base-sha1: 210c70b2892524c4eb1ae2d36a2baeae34845489 Text-content-length: 157 Text-content-md5: 8706f34c250e7879ddbc5acd12b7db54 Text-content-sha1: f6057cec68d96b99b71ceabb028c81a353e0d764 Content-length: 157 SVN��GQ �G� <p> It turns out there are more instances of this; see <a href="win-plink-stdin-handle-invalid.html">win-plink-stdin-handle-invalid</a>. Node-path: putty-wishlist/data/win-plink-stdin-handle-invalid Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 843 Text-content-md5: 56a10491456d1bee21bca6390d7e559d Text-content-sha1: ad6917035e8b27a016dc06c19eac4047098e3cce Content-length: 853 PROPS-END SVN���===Summary: Plink: "Unable to read from standard input: The handle is invalid." Class: bug Absent-in: 0.58 Present-in: 0.59 0.60 2007-06-29 Content-type: text/x-html-body <p> The "Unable to read from standard input" message is still with us; the reports we're getting from versions including the diagnostics added while investigating <a href="win-plink-stdin-eof.html">win-plink-stdin-eof</a> say "The handle is invalid". <p> All reports so far occur when Plink is run by some other program, and cannot be reproduced when the same command is run from the Windows command-line or Cygwin. <p> Reports: <ul> <li>4685675C.7030305@kavemalna.hu (rsync) <li>4da424620707191404i2efbff0che659f39e97f8cd84@mail.gmail.com (rsync) <li>46AA3477.1030701@bellsouth.net <li>66E3124EE70FB04A96C81EF18C6C18B306086FE3@ex1.globus (SQL server) </ul> Revision-number: 7877 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2008-02-23T18:05:37.086687Z K 7 svn:log V 87 Refresh iDEFENSE links (one of which was actually broken). Thanks to Ben Zass-Bangham. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f425b7ef0a9466215c05dabaf7eaa343 Text-delta-base-sha1: 6d848dd46730b317a40a46b09e98f7378386c5d8 Text-content-length: 144 Text-content-md5: bc98f2fdf05287d981289e91b943621f Text-content-sha1: 8ca6e4e982f9120d33e30c2f5f71787adf092704 Content-length: 144 SVN��r^r�]��dr�s See <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/vuln-ssh2-debug.html">vuln-ssh2-debug</a> Node-path: putty-wishlist/data/vuln-passwd-memdump Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f4d56223734980e2d5bb08fbc438e9af Text-delta-base-sha1: 5d0b330ed4c05a507186bff713d039804ec44390 Text-content-length: 86 Text-content-md5: 1ab4ada471d39e007ace9200d62ab96a Text-content-sha1: 9dd301014abf054da48d435f63f7820f5ae7cf7d Content-length: 86 SVN��+E @��@�fElabs.idefense.com/intelligence/vulnerabilities/display.php?id=24 Node-path: putty-wishlist/data/vuln-sftp-readdir Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: adff0bf993034a10882d0c47de78fa62 Text-delta-base-sha1: cee2dd7be63368936dedeb1c26428c9937342cf0 Text-content-length: 115 Text-content-md5: b7977bee98cc2134cd21f7b8b9c33777 Text-content-sha1: 08dde9a25d4102bbb51f969dd80269b34e7ea76d Content-length: 115 SVN��$W�u��$A�labs.idefense.com/vcp/labs.idefense.com/intelligence/vulnerabilities/display.php?id=201 Node-path: putty-wishlist/data/vuln-sftp-string Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2d4d23f9adcaaada24c255e3cfaa986e Text-delta-base-sha1: d7af51f5fcf53ec5f4d449bb1b0c482ca4e221cf Text-content-length: 115 Text-content-md5: 156f660d9ba98051cd79c1641082944c Text-content-sha1: 0fcf651bfbc296f914d1f0adb4fce8b9fdd01856 Content-length: 115 SVN�� iW� ��&-A�a)labs.idefense.com/vcp/labs.idefense.com/intelligence/vulnerabilities/display.php?id=201 Node-path: putty-wishlist/data/vuln-ssh2-debug Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fe27e375f941576b6047e21eb23ec477 Text-delta-base-sha1: f5b2732189ffdf484514d05940440c3a47f62716 Text-content-length: 114 Text-content-md5: f18eef41c27f614e22254f93c169a7fd Text-content-sha1: 6782f79e90b4a93cf81fec570490f5ef82da903e Content-length: 114 SVN��Y8W�I��akA�7"labs.idefense.com/vcp/labs.idefense.com/intelligence/vulnerabilities/display.php?id=155 Revision-number: 7878 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2008-02-23T18:10:09.772430Z K 7 svn:log V 42 People keep complaining about exit codes. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/exit-codes Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 409 Text-content-md5: 2c7466221f6679b42f5dbb45f15e87e8 Text-content-sha1: 71655b731f07e0320190a9ccf32619bb7f665b36 Content-length: 419 PROPS-END SVN���  Summary: Provide more useful exit codes Class: bug Content-type: text/x-html-body <p> A common complaint is that the exit codes of various PuTTY tools on various platforms aren't as useful as they might be. <p> We should review, fix, and document the exit codes of the various PuTTY tools (ensuring we disambiguate local status from the exit code provided by an SSH server, where applicable). Revision-number: 7879 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2008-02-23T18:15:13.449747Z K 7 svn:log V 68 Summary: Ability to specify a serial connection on the command-line K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/cmdline-serial Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 287 Text-content-md5: b3c2f7f6e1f1e2f58844f73a40b0831a Text-content-sha1: 48b4c8b1ee87ada84515c2e542a271798a497da5 Content-length: 297 PROPS-END SVN���Summary: Ability to specify a serial connection on the command-line Class: wish Difficulty: fun Content-type: text/x-html-body <p> It's not currently possible to access the <a href="serial-backend.html">serial backend</a> from the command-line, unlike the other backends. Revision-number: 7880 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2008-02-23T22:00:48.969273Z K 7 svn:log V 68 Tunnels: more explicit link from introductory to reference section. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fc9503568a47e3c78a331ee8e5e087b Text-delta-base-sha1: f3fb0b4a91d8f930fff2b262d60ad98144b8b524 Text-content-length: 100 Text-content-md5: dece884ea7291dc816ce116bc866c671 Text-content-sha1: d6f2a49cb8f79ffba647be4d82c39f58c1cca6a1 Content-length: 100 SVN��|GI�C�I�;AFor more options relating to port forwarding, see \k{config-ssh-portfwd}. Revision-number: 7881 Prop-content-length: 407 Content-length: 407 K 8 svn:date V 27 2008-02-23T22:23:00.373908Z K 7 svn:log V 306 Summary: Unix listening sockets (e.g., tunnels) are IPv6-only by default Priority: high (Someone's sent in a patch for this. There's an argument that instead of writing about this I should just apply the damn patch already, but I want to think about it first, and acknowledgement of this bug is overdue.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portfwd-addr-family Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1450 Text-content-md5: cdcf8fb3049b959f51b053ded0dd0e6f Text-content-sha1: d7ed3ac75d19b5f43bb98c9cb51f246bcf6684a3 Content-length: 1460 PROPS-END SVN���Summary: Unix listening sockets (e.g., tunnels) are IPv6-only by default Class: bug Difficulty: fun Priority: high Present-in: 0.60 Content-type: text/x-html-body <p> On a Unix system supporting IPv6, PuTTY will by default create listening sockets (e.g. for the local end of a local-to-remote tunnel) as IPv6-only. Attempts to connect to the port using IPv4 addresses (127.0.0.1) will fail, and often the same problem will occur with the name "localhost". This occurs for instance on Ubuntu Linux (so this is probably what's behind <a href="https://bugs.launchpad.net/ubuntu/+source/putty/+bug/67488">LP #67488</a>). <p> This contradicts the <a href="http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-portfwd-address-family">documentation</a> of the default "Auto" setting for tunnels, which states that "ticking 'Auto' should always give you a port which you can connect to using either protocol." <p> Unix PuTTY should ensure that listening sockets are valid for at least the address families specified in the configuration. <p> Workarounds: <ul> <li>Explicitly configure PuTTY to use an IPv4 listening socket (change 'Auto' to 'IPv4'). Of course, you won't then be able to connect to the tunnel endpoint with IPv6. <li>Leave the PuTTY configuration as it is, but explicitly connect to the IPv6 localhost address (<tt>::1</tt>). </ul> <p> Patch: 01f201c856d6$b4d335f0$020da8c0@JSD.jemmettsoftware.co.uk Revision-number: 7882 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2008-02-23T23:56:22.443356Z K 7 svn:log V 69 Attempt to clarify what the various IP version selection options do. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9143fe7aad6f6fa9356558003d9990c8 Text-delta-base-sha1: 2558471fbcc7b25d78a3434a8dc5025f56842760 Text-content-length: 617 Text-content-md5: 3af2b87862d62f5dabc909b5cd7157bc Text-content-sha1: 02388aea241924bbd9c994a29b9feca75468227f Content-length: 617 SVN����`�/�`�q4 The selected protocol will be used for most outgoing network connections (including connections to \I{proxy}proxies); however, tunnels have their own configuration, for which see \k{config-ssh-portfwd-address-family}. The �3R[� �w�orrect response in order to log in. If your server supports this, you should talk to your system administrator about precisely what form these challenges and responses take. \S{config-ssh-ki} \q{Attempt \i{keyboard-intThis overrides the general Internet protocol version preference on the Connection panel (see \k{config-address-family}) Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dece884ea7291dc816ce116bc866c671 Text-delta-base-sha1: d6f2a49cb8f79ffba647be4d82c39f58c1cca6a1 Text-content-length: 55 Text-content-md5: 2e8da65def94d1cf99866119f1fc89f4 Text-content-sha1: 160a97ff9d139e0a635682e67d4f0b74edf4b698 Content-length: 55 SVN��Ge �h��_h for most outgoing connections Revision-number: 7883 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 54 It's a new year (and we've even made a code checkin). K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-02-24T00:16:29.809957Z PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f1fbc9578354b488efd1c7e276855c6a Text-delta-base-sha1: a069392e138032b7ebb156bad71035146916821f Text-content-length: 44 Text-content-md5: e031befbc2f8d40e504a077cb0524cac Text-content-sha1: bef93bb2900eba9688afefd320d8a4d3612c2b8c Content-length: 44 SVN���cPuTTY is copyright 1997-2008 Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae2e559e89459aca31584490de6be723 Text-delta-base-sha1: ef6e036b2e0000059dd9c927e031b5407df597cc Text-content-length: 22 Text-content-md5: f6427d267fc1d44ce28e8389bda6808e Text-content-sha1: b2008090269a36c5582cab0906c1ff761c1fba1f Content-length: 22 SVN��bb �R��S8 Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69cf461deda899f6ef43c2bad9b2360f Text-delta-base-sha1: 226c039abd18be2bab19aa9a55a2c29d257d5ebb Text-content-length: 20 Text-content-md5: 7e595212f57b2d94b700c0c216ace466 Text-content-sha1: a4ef3df633f59509d8cb7a470ed47a61818dcf98 Content-length: 20 SVN��RR�j��gk8 Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eb035ee3ac46f6e5673b8085af08866d Text-delta-base-sha1: 85295411504f5f7aab64e230f3677418be4eeb58 Text-content-length: 34 Text-content-md5: b666950480868f06a35eab1e72103f2f Text-content-sha1: e388f6cf211892292420c6407b328142b32eb31c Content-length: 34 SVN��QQ���a�_r88 Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c643709f47ef54cad73b910cb1cb704f Text-delta-base-sha1: 5db16b1df9961d4d91ae49a258d71b8f975e8b30 Text-content-length: 29 Text-content-md5: 268263af9ac76fe2d95e35ccfa9e1152 Text-content-sha1: c8e1966f56c314cde15ba763725a4db549ce1124 Content-length: 29 SVN��zz�>��[?�_88 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ced82b598260ebe2e97a8226ccc31620 Text-delta-base-sha1: 41fbf8b4a708e5f775acf5ee75a1995078ccab35 Text-content-length: 34 Text-content-md5: 329acd856d77f19481233975cb3d5142 Text-content-sha1: 4220b9dafbfc1d6bc4aed8fb21a025f616d600e6 Content-length: 34 SVN��zz�~��B�8B88 Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eed999c3618a3e06fe2fc32f10d00864 Text-delta-base-sha1: 92be40d5c6e712a15b3c4a6c232e0a912fe868ae Text-content-length: 29 Text-content-md5: c782d7fc2026600ac157c1b4f3f7dd43 Text-content-sha1: 0a0234363b4b3decdde1624d7bea49467ce8549f Content-length: 29 SVN��}}�-��L.�{88 Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06893a82f8936510f3d7e3b9664cc139 Text-delta-base-sha1: fcfaec65fbbe114d6dc544b667765167bb96b2f9 Text-content-length: 29 Text-content-md5: deaf1c9a5c0d1927a6b2c6b93781e27f Text-content-sha1: 29e80ce3f9a2fe983570397f2b8269ef7e5025f9 Content-length: 29 SVN��55�d��Le�288 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 47350c65d505f801b52d17ca05eff12a Text-delta-base-sha1: 05ca86bf5c8d1cb3c11079c6ca5079b410006ab6 Text-content-length: 22 Text-content-md5: 33d8fd5758478ae860af352d9b3d6712 Text-content-sha1: 6e7f962b21e9a3d734e569c8ff291e6a7ec55765 Content-length: 22 SVN��RR �\��u]8 Node-path: putty/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d7506f4d7bd721e0027b5c91e7faf1a Text-delta-base-sha1: a76ade4bfdcb2b659155944a4fae41bfcb25f8d1 Text-content-length: 29 Text-content-md5: 18b40c9aedaedf206eb7f912b28f5643 Text-content-sha1: 9301e7df6e395f7e091f94bc9b9dfeef74f8b8bc Content-length: 29 SVN��ff�k��Cl�6088 Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5ac44c2aaaf2425bfc71c1ee97dd16e5 Text-delta-base-sha1: 8fd95f81f94df2791918a9cc9f60596596283674 Text-content-length: 22 Text-content-md5: 1263b4185437bdfdd1800adc1b26b6e4 Text-content-sha1: bcd72a8e679a8dc32f9d69a1f2def4e162269691 Content-length: 22 SVN��WW �+��+,8 Revision-number: 7884 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-25T00:34:49.624989Z PROPS-END Revision-number: 7885 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-25T00:34:49.657600Z PROPS-END Revision-number: 7886 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-25T00:34:49.660975Z PROPS-END Revision-number: 7887 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-25T00:34:49.730964Z PROPS-END Revision-number: 7888 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-25T00:34:49.734267Z PROPS-END Revision-number: 7889 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-25T00:34:49.811373Z PROPS-END Revision-number: 7890 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-26T00:34:50.379520Z PROPS-END Revision-number: 7891 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-26T00:34:50.408479Z PROPS-END Revision-number: 7892 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-26T00:34:50.411665Z PROPS-END Revision-number: 7893 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-26T00:34:50.463099Z PROPS-END Revision-number: 7894 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-26T00:34:50.543357Z PROPS-END Revision-number: 7895 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-26T00:34:50.546885Z PROPS-END Revision-number: 7896 Prop-content-length: 123 Content-length: 123 K 7 svn:log V 23 Expand on workarounds. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-02-25T23:57:50.325996Z PROPS-END Node-path: putty-wishlist/data/portfwd-addr-family Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cdcf8fb3049b959f51b053ded0dd0e6f Text-delta-base-sha1: d7ed3ac75d19b5f43bb98c9cb51f246bcf6684a3 Text-content-length: 123 Text-content-md5: 88295bbb7e258ceecf0243d4cf3e759e Text-content-sha1: 706aad9da2fec5a465a91b91a5f24302cd1bf74b Content-length: 123 SVN�� e�^�e�>^; if you need to be able to connect with both protocols, set up two tunnels with the same destination Revision-number: 7897 Prop-content-length: 112 Content-length: 112 K 7 svn:log V 12 Prioritise. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-02-26T00:19:05.457037Z PROPS-END Node-path: putty-wishlist/data/cmdline-serial Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b3c2f7f6e1f1e2f58844f73a40b0831a Text-delta-base-sha1: 48b4c8b1ee87ada84515c2e542a271798a497da5 Text-content-length: 35 Text-content-md5: 83041c57b9d32c6ecff49f90e77e0a72 Text-content-sha1: 50263c9fa2b49dabd3e831f60fc29ca61479903a Content-length: 35 SVN��"�`��2_Priority: medium Revision-number: 7898 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-27T00:34:54.394021Z PROPS-END Revision-number: 7899 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-27T00:34:54.437904Z PROPS-END Revision-number: 7900 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-27T00:34:54.441336Z PROPS-END Revision-number: 7901 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-27T00:34:54.485731Z PROPS-END Revision-number: 7902 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-27T00:34:54.601827Z PROPS-END Revision-number: 7903 Prop-content-length: 119 Content-length: 119 K 7 svn:log V 19 Couple more links. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-02-26T23:39:38.216682Z PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 13135cfa23598467db734fc625d60ff6 Text-delta-base-sha1: ad7dc619a3ea2d0cdd6c57c4916cf344f72ad716 Text-content-length: 300 Text-content-md5: 75f1ad4ee6f9e49928b4c02c13732e8e Text-content-sha1: a49444de01e8f3b16635455c1b62e38867815043 Content-length: 300 SVN��. ��S�`3�^\�(code.google.com/p/portaputty/">Another portaPuTTY</a> (same name, different code)<a href="wishlist/mud-client.html">MUD clients</a> <ul> <li><a href="http://elvenrunes.mine.nu/powtty/"> PowTTY</a> <li><a href="http://www.dforces.net/client/"> DF Client</a> Node-path: putty-wishlist/data/mud-client Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cebeef82395389aa5b3ecf99f4a7faf8 Text-delta-base-sha1: 824b46a37a48c8d0ad332a54be07c6eb0ff88815 Text-content-length: 188 Text-content-md5: 1927c8a263cd86b7def34fb298819ef5 Text-content-sha1: 1f71305502edc1a12af4adf4fbd80b96712d1787 Content-length: 188 SVN��VC)��)That doesn't stop other people from turning PuTTY into a MUD client, of course. Some third-party modifications are listed on our <a href="../links.html">Links page</a>. Revision-number: 7904 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-29T00:34:47.358816Z PROPS-END Revision-number: 7905 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-02-29T00:34:47.403059Z PROPS-END Revision-number: 7906 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-01T00:35:40.190941Z PROPS-END Revision-number: 7907 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-01T00:35:40.412843Z PROPS-END Revision-number: 7908 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-01T00:35:40.452493Z PROPS-END Revision-number: 7909 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-02T00:34:42.649271Z PROPS-END Revision-number: 7910 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-07T00:34:56.556781Z PROPS-END Revision-number: 7911 Prop-content-length: 911 Content-length: 911 K 7 svn:log V 810 Fix a cursor positioning infelicity. The scenario: I start a small, say 80x24, pterm. I do some work in it, generating plenty of scrollback, and eventually I `less' a file. `less' switches to the alt screen. Then I want more vertical space to look at the file, so I enlarge the window to more like 80x60. When I quit `less' and switch back to the primary screen, some scrollback has been pulled down into the screen, as expected - but the saved _cursor position_ is still at line 24, not at the bottom of the new terminal where the prompt it goes with has moved to. Solution: term_size() should adjust the alt-screen saved cursor positions as well as the normal cursor position. (Curiously, the problem doesn't happen on my home Debian box, even without this fix. It happens on my RH9 box at work, though.) K 10 svn:author V 5 simon K 8 svn:date V 27 2008-03-07T18:30:37.406540Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aaa77cd3a2459efe56d835122fdfdbcd Text-delta-base-sha1: 2830f6c516ddbbd282a5d5ef95e9a47a9986e40b Text-content-length: 1114 Text-content-md5: e82a5138266cb0c298250733c97f68bb Text-content-sha1: f82d311bf38fcf9ecfbf5633fd334a7582bf60bc Content-length: 1114 SVN����&b�u��Pc�3! �4?�r^ term->alt_y += 1; term->alt_ term->alt_y -= 1; term->alt_savecurs.x >= newcols) term->savecurs.x = newcols - 1; if (term->alt_savecurs.y < 0) term->alt_savecurs.y = 0; if (term->alt_savecurs.y >= newrows) term->alt_savecurs.y = newrows - 1; if (term->alt_savecurs.x >= newcols) term->alt_savecurs.x = newcolif (term->alt_y < 0) term->alt_y = 0; if (term->alt_y >= newrows) term->alt_y = newrows - 1; if (term->alt_x >= newcols) term->alt_�K00��; if (term->cfg.no_remote_charset) break; term->sco_acs = 2; break; case 22: /* disable bold */ compatibility2(OTHER, VT220); term->curr_attr &= ~ATTR_BOLD; break; case 24: /* disable underline */ compatibility2(OTHER, VT220); term->curr_attr &= ~ATTR_UNDER; break; case 25: /* disable blink */ compatibility2(OTHER, VT220); term->curr_attr &= ~ATTR_BLINK; break; case 27: /* disable reverse video */ compatibility2(OTHER, VT220); t Revision-number: 7912 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2008-03-09T14:42:58.880944Z K 7 svn:log V 31 lk wishlist/win-command-prompt K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 75f1ad4ee6f9e49928b4c02c13732e8e Text-delta-base-sha1: a49444de01e8f3b16635455c1b62e38867815043 Text-content-length: 93 Text-content-md5: a0a173315d685d3c75937c3390fa3f54 Text-content-sha1: 3df6fc58dde5cbcf7d65bf976c56d63b4e05f612 Content-length: 93 SVN�� : E��E�\- <a href="wishlist/win-command-prompt.html">PuTTY as a terminal</a> Revision-number: 7913 Prop-content-length: 229 Content-length: 229 K 8 svn:date V 27 2008-03-09T15:32:20.080997Z K 7 svn:log V 128 Under OS X Leopard, we seem not to consistently get the Tab key translated for us. Be prepared to do it manually as a fallback. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a49db5a7fda06667c6503ceac000b614 Text-delta-base-sha1: 7451d40d2a23127b7b0ac992e8af6bccbf16bdf9 Text-content-length: 543 Text-content-md5: 1790973b99c32b0695da29af44083bdd Text-content-sha1: 1914843e216053aff9b249ea551de68ddb6b5b66 Content-length: 543 SVN����v�j�v� e /* And normal Tab is Tab, if the keymap hasn't already told us. * (Curiously, at least one version of the MacOS 10.5 X server * doesn't translate Tab for us. */ if (event->keyval == GDK_Tab && end <= 1) { output[1] = '\t'; end = 2�to{{�t�ity & 2) y += gdk_screen_height() - req.height; gtk_window_set_position(GTK_WINDOW(inst->window), GTK_WIN_POS_NONE); gtk_widget_set_uposition(GTK_WIDGET(inst->window), x, y); } gtk_signal_connect(GTK_OBJECT(inst->window), "destroy", Revision-number: 7914 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2008-03-10T18:48:36.875376Z K 7 svn:log V 85 Merge out from trunk, to keep this branch viable. We are now up to date as of r7913. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2 Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 310 Content-length: 310 K 10 svn:ignore V 277 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp *.tds *.td2 *.map Makefile.bor Makefile.cyg Makefile.vc Makefile.lcc MSVC *.log *.GID local Output pageant plink pscp psftp putty puttytel puttygen *.DSA *.RSA *.cnt *.hlp .bmake build.log build.out PROPS-END Node-path: putty-gtk2/Buildscr Node-kind: file Node-action: add Node-copyfrom-rev: 7913 Node-copyfrom-path: putty/Buildscr Text-copy-source-md5: 4ea5749cc4d428a70ac9829e37093b24 Text-copy-source-sha1: 0d98916d6a04782f56a8763688e016aadafb4853 Node-path: putty-gtk2/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a50cd2623da59a378cb6ac3fe7fc7400 Text-delta-base-sha1: 20f0a4bf97a7b804b4da6ccad49faa2aca44c580 Text-content-length: 1062 Text-content-md5: 2052c8f8fd54cc66535124ef30169c78 Text-content-sha1: 2c724b50c836378e0dc75d75c05fb795fa9fab28 Content-length: 1062 SVN��X9���i�J&�hhq�T - Also, do some testing of the Windows version with Minefield, and of the Unix version with valgrind or efence or both. In particular, any headline features for the release should get a workout with memory checking enabled!Build the release: `bob putty-0.XX RELEASE=0.XX'. This should generate a basically valid release directory as `build.out/putty', and provide link maps and sign.sh alongside that in build.out. - Do a bit of checking that the release binaries basically work, report their version numbers accurately, and so on. Test the installer and the Unix source tarball. - Save the link maps. Currently I keep these on ixion, in src/putty/local/maps-<version>. - Sign the release: in the `build.out' directory, type `./sign.sh putty Releases', and enter the passphrases a lot of times. - Now the whole release directory should be present and correct. Upload it: for i in `find . -name '*.*SA'`; do case $i in *md5sums*) gpg --verify $i;; *) gpg --verify $i ${i%%.?SA} Node-path: putty-gtk2/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 53cf7cfb0f75dfdf7585dcdea153e015 Text-delta-base-sha1: a5d01d52a3f9be402473a71b5b1e5ac0dcbdbbb6 Text-content-length: 15 Text-content-md5: 8e4eb3bf839f0b4bc25c33a4f1128de9 Text-content-sha1: fe5825b67322733f9d2a32632d56c8811123aa49 Content-length: 15 SVN��0.60 Node-path: putty-gtk2/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 528e816de4b89bcd86a7379c9e201067 Text-delta-base-sha1: 8de499eef42ec880e636d7c36289d8d94db5245a Text-content-length: 44 Text-content-md5: abfb85ed5bf47462ec46c6a7045582b3 Text-content-sha1: 926e571f2a6c1446d88882872bb5792ad7c03275 Content-length: 44 SVN�� �qPuTTY is copyright 1997-2008 Node-path: putty-gtk2/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 258b1c995a90c442f49196af4c8049f0 Text-delta-base-sha1: 0c3818d7c37806644d80015265651bac5c916732 Text-content-length: 331 Text-content-md5: efc8090fec90b8bc70eb2232e84c7f61 Text-content-sha1: daded408733f8c64363a53548f4ad1c483634a32 Content-length: 331 SVN��2)�+�N�+�-�VQ�{S�`�7] (although you can use # the htmlhelp.h supplied with HTML Help Workshop)mkdir -p $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir)256 sshsh512 winutils + winmisc256 sshsh512 import winutils puttygen.res + tree234256 sshsh512 import puttygen.res time tree234 + uxgen256 Node-path: putty-gtk2/be_all.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 57be9b687d6b3139088610c1cedbd147 Text-delta-base-sha1: 9a07830b2ef5da4fa8d222a31cfbdab960543d35 Text-content-length: 131 Text-content-md5: c41ed7e0275e9c1fbbd429d7be7ecebb Text-content-sha1: 87258d2d7fc28633146f7d2aae8ee106aba46922 Content-length: 131 SVN��vr��rBackend *backends[] = { &ssh_backend, &telnet_backend, &rlogin_backend, &raw_backend, NULL }; Node-path: putty-gtk2/be_all_s.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2262758f55d1ff6cc7402b55052dedf3 Text-delta-base-sha1: b9e205a59a034d08a9f941d4304f116f6e6b4299 Text-content-length: 154 Text-content-md5: 6d72a7a07ada5a28a92a0c6d0a877bf7 Text-content-sha1: 127805c444dd6d3c65870b91a2ecd4155155450c Content-length: 154 SVN��=<�5�Backend *backends[] = { &ssh_backend, &telnet_backend, &rlogin_backend, &raw_backend, &serial_backend, NULL }; Node-path: putty-gtk2/be_none.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f78e93473d379dbb1c74cd22748eb7d7 Text-delta-base-sha1: bf9dd4df0d77adfd9765b32755015fb341387d29 Text-content-length: 198 Text-content-md5: 394c1a1a9996d3051f157183eddd80b4 Text-content-sha1: fe1b0b31e9f2a5815c6dc82cd3d8a6ef06cc9f73 Content-length: 198 SVN��h777/* * Linking module for programs that do not support selection of backend * (such as pscp or pterm). */ #include <stdio.h> #include "putty.h" Backend *backends[] = { NULL }; Node-path: putty-gtk2/be_nos_s.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35dc291fbaaf8768d1851fb61376adc9 Text-delta-base-sha1: c7e1bd9a65221b8d5e0979422bb4ddcb241790ee Text-content-length: 135 Text-content-md5: e8c4a53227397359b0e9ea14221fd881 Text-content-sha1: 3d7e363221b67328cdec6cd4ecdd60d5c2b350d2 Content-length: 135 SVN��y q�X�q�B7Backend *backends[] = { &telnet_backend, &rlogin_backend, &raw_backend, &serial_backend, NULL Node-path: putty-gtk2/be_nossh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 620808fbee528cbdc733c4c268dc89f1 Text-delta-base-sha1: cb23efb16b24cd454845ebba0d331ad39e84ea7b Text-content-length: 114 Text-content-md5: 5e5f25f35469a5f4d64f8d60bfd96f87 Text-content-sha1: 4622c2472cd4d61a57acd0d45c7b224cb5367d80 Content-length: 114 SVN��Kv \�X�\�B Backend *backends[] = { &telnet_backend, &rlogin_backend, &raw_backend, NULL Node-path: putty-gtk2/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3bf93446f44e2885d8d835ada3c82624 Text-delta-base-sha1: fbdce4d1fbc304ef692e8a140bd44fd3ce8153d0 Text-content-length: 156 Text-content-md5: bcf7b05d2bd660b5395631f308f74691 Text-content-sha1: 436710a54ef9550f60c8bc75bf48fe466c71e89d Content-length: 156 SVN��ru �H��,Fif (!entropy) { fprintf(stderr, "puttygen: failed to collect entropy, " "could not generate key\n"); return 1; } Node-path: putty-gtk2/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a3d8241dd8e98ecee58b49d6907c415 Text-delta-base-sha1: d07c90bd3278ab9f873da83d9e1847d75209614b Text-content-length: 724 Text-content-md5: bb8f61abb56e4f8c7c2e6bdb54ed28f3 Text-content-sha1: 0882024d8703dbc54113a07fcfbe8bf0886278b8 Content-length: 724 SVN��] *���j[*�^�-i�R�g�mpmemcpy(cfg->ssh_nc_host, value, len); cfg->ssh_nc_host[lenSAVEABLE(1); /* We delay evaluating this until after the protocol is decided, * so that we can warn if it's of no use with the selected protocol */ if (cfg->protocol != PROT_SSH) cmdline_error("the -pw option can only be used with the " "SSH protocol"); else { cmdline_password = dupstr(value); /* Assuming that `value' is directly from argv, make a good faith * attempt to trample it, to stop it showing up in `ps' output * on Unix-like systems. Not guaranteed, of course. */ memset(value, 0, strlen(value)); }SAVEABLE(0SAVEABLE(01); /* lower priority than -m */1 Node-path: putty-gtk2/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: caf4ca553ff8de9be8a5f6bea48a3d80 Text-delta-base-sha1: 67358bb27814ff304e32ec9d9fb87c7c9035bec5 Text-content-length: 3550 Text-content-md5: 36c704b6b226034f423b0dcd833d734b Text-content-sha1: bf20dc67979d83633ddd3daf92d8e2fb9c503f87 Content-length: 3550 SVN��w>�L��i<�Q7�1�fHp�V6� ��h � z�Y'�;}�(@�ep\� ~?�e6�R<�g$�Uh�S=4� $� <�fR�CDt�Bl�V7�#�T]�I=static void config_hosBackend *ob = backend_from_proto(oldproto); Backend *nb = backend_from_proto(cfg->protocol); assert(ob); assert(nb); /* Iff the user hasn't changed the port from the protocol * default (if any), update it with the new protocol's * default. * (XXX: this isn't perfect; a default can become permanent * by going via the serial backend. However, it helps with * the common case of tabbing through the controls in order * and setting a non-default port.) */ if (cfg->port == ob->default_port && cfg->port > 0 && nb->default_port > 0) cfg->port = nb->default_port;RSA-based key exchange", KEX_RSA, int *maybe_launch if (maybe_launch) *maybe_launch = TRUE; } else { savedsession[0] = '\0'; if (maybe_launch) *maybe_launch = FALSEnt mbl = FALSE;, &mbl) && (mbl && nt mbl = FALSE; if (!load_selected_session(ssd, savedsession, dlg, &cfg2, &mbl)) { dlg_beep(dlg); return; } /* If at this point we have a valid session, go! */ if (mbl && cfg_launchable(&cfg2)nt multisel = dlg_listbox_index(td->listbox, dlg) < 0; if (dlg_listbox_issel(td->listbox, dlg, i)) { if (!multisel) { /* Populate controls with entry we're about to * delete, for ease of editing. * (If multiple entries were selected, don't * touch the controls.) */ char *val = strchr(p, '\t'); if (val) { int ind = 0; val++; while (ttymodes[ind]) { if (strlen(ttymodes[ind]) == val-p-1 && !strncmp(ttymodes[ind], p, val-p-1)) break; ind++; } dlg_listbox_select(td->modelist, dlg, ind); dlg_radiobutton_set(td->valradio, dlg, (*val == 'V')); dlg_editbox_set(td->valbox, dlg, val+1); } }, *str/* Populate controls with the entry we're about to delete * for ease of editing */ str = p; p = strchr(p, '\t'); if (!p) goto disaster; *p = '\0'; dlg_editbox_set(ed->varbox, dlg, str); p++; str = p; dlg_editbox_set(ed->valbox, dlg, str); p = strchr(p, '\0'); if (!p) goto disaster, *src, *dst; char dir/* Populate the controls with the entry we're about to * delete, for ease of editing. */ { static const char *const afs = "A46"; char *afp = strchr(afs, *p); #ifndef NO_IPV6 int idx = afp ? afp-afs : 0; #endif if (afp) p++; #ifndef NO_IPV6 dlg_radiobutton_set(pfd->addressfamily, dlg, idx); #endif } { static const char *const dirs = "LRD"; dir = *p; dlg_radiobutton_set(pfd->direction, dlg, strchr(dirs, dir) - dirs); } p++; if (dir != 'D') { src = p; p = strchr(p, '\t'); if (!p) goto disaster2; *p = '\0'; p++; dst = p; } else { src = p; dst = ""; } p = strchr(p, '\0'); if (!p) goto disaster2; dlg_editbox_set(pfd->sourcebox, dlg, src); dlg_editbox_set(pfd->destbox, dlg, dst)backend_from_protobackend_from_protobackend_from_protoImplicit LF in every CR", 'f', HELPCTX(terminal_crhaslf), dlg_stdcheckbox_handler, I(offsetof(Config,crhaslfColumns", 'mwidth)), I(-1)); c->generic.column = 0backend_from_proto ctrl_droplist(s, "Ignores SSH-2 maximum packet size", 'x', 20, HELPCTX(ssh_bugs_maxpkt2), sshbug_handler, I(offsetof(Config,sshbug_maxpkt Node-path: putty-gtk2/doc Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 119 Content-length: 119 K 10 svn:ignore V 87 *.html *.txt *.cnt *.hlp *.gid *.GID *.chm *.log *.1 *.info vstr.but *.hhp *.hhc *.hhk PROPS-END Node-path: putty-gtk2/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cc699c6b3738590c2679612b669254a5 Text-delta-base-sha1: 8bd95485452d09486cec8abaa0f4c73c9d09d088 Text-content-length: 139 Text-content-md5: 578c768b84cc0e67925bcf8cc47923bc Text-content-sha1: 6dce6506c89018b9ac84d4e7a604182e2cd0d072 Content-length: 139 SVN��!'o�&��X%g�:g sshname# During formal builds it's useful to be able to build this one alone. putty.hlp: $(INPUTS) $(HALIBUT) Node-path: putty-gtk2/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae2e559e89459aca31584490de6be723 Text-delta-base-sha1: ef6e036b2e0000059dd9c927e031b5407df597cc Text-content-length: 22 Text-content-md5: f6427d267fc1d44ce28e8389bda6808e Text-content-sha1: b2008090269a36c5582cab0906c1ff761c1fba1f Content-length: 22 SVN��bb �R��S8 Node-path: putty-gtk2/doc/chm.but Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty-gtk2/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cb0b9623d8ae5f096030719397edae2 Text-delta-base-sha1: d8e05f80ed0c74c85c5c2a7ea4417838465ab20f Text-content-length: 2962 Text-content-md5: 3af2b87862d62f5dabc909b5cd7157bc Text-content-sha1: 02388aea241924bbd9c994a29b9feca75468227f Content-length: 2962 SVN����En���YpG�&J �4=� `�hy�F�6�*6lfcr} \q{Implicit LF in every CR} \cfg{winhelp-topic}{terminal.crhaslfCR, and so the newly written line is overwritten by the following line. This option causes a line feed so that all lines are displayed.Columns}} and \q{\ii{Row The selected protocol will be used for most outgoing network connections (including connections to \I{proxy}proxies); however, tunnels have their own configuration, for which see \k{config-ssh-portfwd-address-family}. The Note that unlike some software (such as web browsers), PuTTY does not attempt to automatically determine whether to use a proxy and (if so) which one to use for a given destination. If you need to use a proxy, it must always be explicitly configuredn addition, PuTTY supports \i{RSA key exchange}, which requires much less computational effort on the part of the client, and somewhat less on the part of the server, than Diffie-Hellman key exchang They can even be used to prompt for simple passwordmay be different every time) and must supply the c�Y'm��w�v B�W}�Sorrect response in order to log in. If your server supports this, you should talk to your system administrator about precisely what form these challenges and responses take. \S{config-ssh-ki} \q{Attempt \i{keyboard-interactive authentication}} \cfg{winhelp-topic}{ssh.auth.ki} The SSH-2 equivalent of TIS authentication is called \q{keyboard-interactive}. It is a flexible authentication method using an arbitrary sequence of requests and responses; so it is not only useful for \I{challenge/response authentication}challenge/response mechanisms such as \i{S/Key}, but it can also be used for (for example) asking the user for a \I{password expiry}new password when the old one has expired. PuTTY leaves this option enabled by default, but supplies a switch to turn it off in case you should have trouble with it. \S{config-ssh-agentfwd} \q{Allow \i{agent forwarding}} \cfg{winhelp-topic}{ssh.auth.agentfwd} This option allows the SSH server to open forwarded connections back to your local copy ofThis overrides the general Internet protocol version preference on the Connection panel (see \k{config-address-family})S{config-ssh-bug-maxpkt2} \q{Ignores SSH-2 \i{maximum packet size}} \cfg{winhelp-topic}{ssh.bugs.maxpkt2} When an SSH-2 channel is set up, each end announces the maximum size of data packet that it is willing to receive for that channel. Some servers ignore PuTTY's announcement and send packets larger than PuTTY is willing to accept, causing it to report \q{Incoming packet was garbled on decryption}. If this bug is detected, PuTTY never allows the channel's \i{flow-control window} to grow large enough to allow the server to send an over-sized packet. If this bug is enabled when talking to a correct server, the session will work correctly, but download performance will be less than it could bei Node-path: putty-gtk2/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3efcfa5eed1735cce58929ec343cb03c Text-delta-base-sha1: 4f030b1773d15a1b3c04dce15be480c4cad7eddc Text-content-length: 1015 Text-content-md5: dd2670da971b1366d268e6d0dddabfbe Text-content-sha1: bc73e65558da3467b84bd903d63b6608d818b28f Content-length: 1015 SVN��3O��r�5Y"� ;�no-auth} \q{No supported authentication methods available} This error indicates that PuTTY has run out of ways to authenticate you to an SSH server. This may be because PuTTY has TIS or keyboard-interactive authentication disabled, in which case \k{config-ssh-tis} and \k{config-ssh-ki}. \H{errors-crc} \q{Incorrect \i{CRC} received on packet} or \q{Incorrect \i{MAC}In particular, if the network is corrupting data at the TCP level, it may only be obvious with cryptographic protocols such as SSH, which explicitly check the integrity of the transferred data and complain loudly if the checks fail. Corruption of protocols without integrity protection (such as HTTP) will manifest in more subtle failures (such as misdisplayed text or images in a web browser) which may not be noticed with the setting of \q{Miscomputes SSH-2 encryption keys} (see \k{config-ssh-bug-derivekey2}) or \q{Ignores SSH-2 maximum packet size} (see \k{config-ssh-bug-maxpkt2}) on the Bugs panel Node-path: putty-gtk2/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff54e4a45458118af46c570ad522e5b8 Text-delta-base-sha1: 9e2fe26cf4995e074b4ea2c536976de2d1eb1e9a Text-content-length: 255 Text-content-md5: 961610436f68f2b5106dcd6f97fa59d9 Text-content-sha1: 9481f66ed3e1f6eb06a419c6b02ca1d154971b86 Content-length: 255 SVN��>%V�S��~r�MT�Tjsvn.tartarus.orgparticularly valuable mirror of the PuTTY web site, we might be interested in linking to you from our Mirrors pageIf you don't like PayPal, talk to us; we can probably arrange some alternative means Node-path: putty-gtk2/doc/feedback.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b56ed11a86491fcb53c3b3fc5fa04666 Text-delta-base-sha1: 9d4a2e72301957835100cb5a23873420be60b5d6 Text-content-length: 855 Text-content-md5: 17ea400ece123a5330d77decb666aaac Text-content-sha1: 046b97b4cbd6a6c95f5454aab45c01d6385662dd Content-length: 855 SVN��3�R�&�k{ �'m the next two paragraphs also on the Mirrors page itself, with \# minor context changes If you want to set up a mirror of the PuTTY website, go ahead and set one up.the mirror is in a country where we don't already have plenty of mirrors, we may be willing to add it to the list on our \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/mirrors.html}{mirrors page}. Read the guidelines on that page, make sure your mirror works, and email us the information listed at the bottom of the page. Note that we do not \e{promise} to list your mirror: we get a lot of mirror notifications and yours may not happen to find its way to the top of the list. Also note that we link to all our mirror sites using the \c{rel="nofollow"} attribute. Running a PuTTY mirror is not intended to be a cheap way to gain search rankings Node-path: putty-gtk2/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b3365de595a4f8faa37aead287fe29f5 Text-delta-base-sha1: c5759477d3e5fac05ed56ba367041ec7a5974bc9 Text-content-length: 102 Text-content-md5: 158b2ea12fc33f7c7d8861693e1c1fd4 Text-content-sha1: 5ab304c4fb7b1c9701a468b7d6d7f3bd4d9596b6 Content-length: 102 SVN��Yi L�a�L�<{MAC} message authentication code (MAC) \IM{message authentication code}{MAC Node-path: putty-gtk2/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c93ad2e81fbd3129e8e5a6c2efcb3420 Text-delta-base-sha1: 6c3580c0daac04b34e562677e810f11d8d169ec9 Text-content-length: 20 Text-content-md5: 29bfe12c6b6ce925f9b24446163ad961 Text-content-sha1: 0e48f1faa01bfdc680781ccbb2fa0526d27b1c0a Content-length: 20 SVN��``�j��uk8 Node-path: putty-gtk2/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 93f457616aa33e16b8061906499be04f Text-delta-base-sha1: 172057f3145051c21afd8a8eb77485aa1dca7976 Text-content-length: 23 Text-content-md5: d6cda9aa9e9af49dfff0344d8900bc71 Text-content-sha1: 06b34c87f8e65ae3cf79df6c00b9dc814014b74d Content-length: 23 SVN��<< ���"60 Node-path: putty-gtk2/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f63b99c6a88097b9122cfd36f0c0cbe7 Text-delta-base-sha1: 4fdfdef8216b4a7a7b4077b16b201133e1186e86 Text-content-length: 23 Text-content-md5: 097d40c854de4e52692e71d4af7c40d3 Text-content-sha1: 70185333f73942e8430e482be1a7497c7381e0ef Content-length: 23 SVN��`` ���[60 Node-path: putty-gtk2/doc/sshnames.but Node-kind: file Node-action: add Node-copyfrom-rev: 7913 Node-copyfrom-path: putty/doc/sshnames.but Text-copy-source-md5: 86a93154e9d3e88499e32a40aacda6dc Text-copy-source-sha1: 0586879cf1b16234582484e973170b3879ca3e7d Node-path: putty-gtk2/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bad5255cf2c9357fe00ea21c3bcf943e Text-delta-base-sha1: 99c02478780b1902943920ed4a8078d44d51e497 Text-content-length: 279 Text-content-md5: 2e8da65def94d1cf99866119f1fc89f4 Text-content-sha1: 160a97ff9d139e0a635682e67d4f0b74edf4b698 Content-length: 279 SVN��3e'b�f�J�8_�XI�t�<�_T\q{break} signal can also be invoked from the keyboard with \i{Ctrl-Break}X11For more options relating to port forwarding, see \k{config-ssh-portfwd}.X11 panel of the PuTTY configuration box (see for most outgoing connections Node-path: putty-gtk2/icons/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a4090bf5d1bfe6bf8dfc5b6716d34e39 Text-delta-base-sha1: 291b0321af1401cf5ea35557e46576aa342100d6 Text-content-length: 289 Text-content-md5: a31a059bd309c41f5dbdad2c33aaba5c Text-content-sha1: 85a66609b5206d6e7229aae1ae39840e5e148a47 Content-length: 289 SVN��#�b��|k�po�puttyinsputtyinsputtyins.ico: puttyins-16.png puttyins-32.png puttyins-48.png \ puttyins-16-mono.png puttyins-32-mono.png \ puttyins-48-mono.png \ puttyins-16-true.png puttyins-32-true.png \ puttyins Node-path: putty-gtk2/icons/mkicon.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b84d9cd91f066476c52a2e69c24461f Text-delta-base-sha1: 7edd6d3a4a7412c438786385bda9251466bbfdeb Text-content-length: 33 Text-content-md5: 2c7e27df3925858cde4f811b2e537e33 Text-content-sha1: 4f17518b349e485f2a9adef7dfe39fac9f89a103 Content-length: 33 SVN��^] �;��Dputtyins Node-path: putty-gtk2/mac/mac.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56c2c9b78d63f0ab642dea48209cf937 Text-delta-base-sha1: 136f589db66fa6a0368451bf6e3ddff7868a0b83 Text-content-length: 154 Text-content-md5: 7cfa4860a5c01feab981b4fe7345dcbf Text-content-sha1: d3e5e02a75d196633c5772521a12a06645ea1fb3 Content-length: 154 SVN��,] ��n���o=Backend *b = backend_from_proto(default_protocol); default_port = 0; /* illegal */ if (b) default_port = b->default_port; Node-path: putty-gtk2/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 397300c3c89a5eca16adf916bf35aebf Text-delta-base-sha1: 4fd3d72cb9bbf6aff35dfa98e6a2d51ec6314c48 Text-content-length: 34 Text-content-md5: 6ee8dc3c5d4c632626394c74c9a81a9f Text-content-sha1: 57209b5a9dfc25c62a63231c2b93d095180ff227 Content-length: 34 SVN��__���a�mr88 Node-path: putty-gtk2/mac/macdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb42f97ba209ad4692ef9d5682aadf50 Text-delta-base-sha1: 92228594b92af8e1f295ca702a7b53030e701a14 Text-content-length: 30 Text-content-md5: a0ba25dc20d1e6477cb367207d2b7af3 Text-content-sha1: ca821defdefd6ca530642a0c07b484984880f2ac Content-length: 30 SVN��)��Y��Y_�#>�Bg Node-path: putty-gtk2/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: faf566c69a7b127eb215fc38a033adb9 Text-delta-base-sha1: df3803ca654a0bc35dbca724bf01c078874a9199 Text-content-length: 29 Text-content-md5: b9eb688ebf96994c1b124c3966f98379 Text-content-sha1: 6bcacaddd8596ccf8acc446f743aa364276eacf6 Content-length: 29 SVN���>��[?�m88 Node-path: putty-gtk2/mac/macterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4c888cf6bd0ffda80cf2583251262a97 Text-delta-base-sha1: 62072d46bdb2e5f48f5d1ef6f678b1e2c1133a6e Text-content-length: 60 Text-content-md5: 8317bf94608643f7406e25ac78fc74f5 Text-content-sha1: e1be163ea000a5464f7bd3f70041407eb7468d70 Content-length: 60 SVN��$. $���backend_from_proto(s->cfg.protocol); Node-path: putty-gtk2/mac/version.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 480a0be883ad6f3cc9898dd62b8a2779 Text-delta-base-sha1: 10ab459e10b4ad307629c1aea170929ab5f84adb Text-content-length: 21 Text-content-md5: c8493cb6b5231c65fe371a8594e5143b Text-content-sha1: 27820f9860bee916c94e7b0843fa63b6b6cf1bf4 Content-length: 21 SVN��77�l��In60 Node-path: putty-gtk2/macosx/osxclass.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ecdee3c213bb37ee5e76a286efccc9d Text-delta-base-sha1: d85b0b7d4a881405e7a7a59aa4745a96de476638 Text-content-length: 101 Text-content-md5: 5d2f2d5c715334a4c8e8802641cc6aa2 Text-content-sha1: d5c336b380f08468ec35e8471057b9017d067065 Content-length: 101 SVN��IJ� ��$� )int)fromBackendUntrusted:(const char *)data len:(int)len- (Terminal *)term Node-path: putty-gtk2/macosx/osxdlg.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f339c345f64a7cebcfd8d22d014485c2 Text-delta-base-sha1: 695a38beba57bcd8b0161e48603734a53c8f9e8d Text-content-length: 36 Text-content-md5: 7b2abdab40a4ff0eec85569eb4af4b98 Text-content-sha1: c25d49a657c4f1cb5fe2b19a4484419f80ebf97f Content-length: 36 SVN��/> �[��T[, aCfg.protocol Node-path: putty-gtk2/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3511add8c99581ec7e463df266046765 Text-delta-base-sha1: 36f9e3d784c71d912ebea7264d3a3d16a8169095 Text-content-length: 335 Text-content-md5: 16a64be6fd3976fda88017b60fb55813 Text-content-sha1: 80aeb9d59eded8d6841dd9419049642b5749424b Content-length: 335 SVN��\I.�0�M�xc^�:G�P}�n5�'C�omback = backend_from_proto(cfg.protocol); if (!back) back = &pty_backend;int)fromBackendUntrusted:(const char *)data len:(int)len { return term_data_untrusted(term- (Terminal *)term { return term;from_backend_untrusted(void *frontendUntrusted:data len:lenfrontend Node-path: putty-gtk2/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fdf40207bbf97ebd45235dd6e1b4aec4 Text-delta-base-sha1: 6fe6c93db6451f6a802287cd8d46c643140ebffe Text-content-length: 432 Text-content-md5: ef5ed971ffebf66942be79421920630e Text-content-sha1: 54c4dc7c18ed9d84d7726b04cfd1f0e7bf7b2712 Content-length: 432 SVN��u f<���.#�B]�;+\�X2�h@�Nr�y�5 @�Nr�y� �t�{�s$�R#CFLAGS) \$(XCFLAGS) \$(XCFLAGS) \$(X\$(LDFLAGS) `\$(GTK_CONFIG) --libs`\n". "ULDFLAGS = \$(LDFLAGS)\n". "INSTALL=install-o \$@ " . $objstr . " \$(${type}LDFLAGS)CFLAGS) \$(X-o \$@ " . $objstr . " \$(${type}LDFLAGS)CFLAGS) \$(XCFLAGS) \$(XCFLAGS) \$(XCFLAGS) \$(X Node-path: putty-gtk2/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b5b81cc68fffac9cc0dd452f5e0b9a2 Text-delta-base-sha1: 18588ba51942aab799cb99b7bdbff4648106c57c Text-content-length: 173 Text-content-md5: f86fc61c64a9c462a502fdc311961540 Text-content-sha1: 60b1653e5b7b854e498ff165b4f92748572b9072 Content-length: 173 SVN��2�a�f�?a�; of the form `r1234' to have it tagged as a # custom build. Otherwise it'll be tagged as unidentifiedr*) arcsuffix="-$1" ver="-DSVN_REV Node-path: putty-gtk2/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9592977ce6697ff95cf3b41398f6c78b Text-delta-base-sha1: 5aa95f8cf11c02d877b0b3edc6684361f517bd5b Text-content-length: 54 Text-content-md5: be54f02d961fe79ac16917c17c702942 Text-content-sha1: a80d7eff579befc3aaf339328c8ae7261e8edca4 Content-length: 54 SVN��v&� ��Mu�6@ cfg.ssh_simple = TRUE Node-path: putty-gtk2/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bcf590ed00350065299c3f1ba99f7877 Text-delta-base-sha1: 1e0b6cfdd39146ce0df5537f01e90d63dee9b987 Text-content-length: 1363 Text-content-md5: fb486a83b805b75c0a8bef81a69abed8 Text-content-sha1: 592ce18bac76048390a7d3cfb6c4084370b071b7 Content-length: 1363 SVN��r:"#� �/�4�l/R�6�!Q if (restart) { while (i < nnames) { char *nextoutfname; int ret; if (outfname) nextoutfname = dir_file_cat(outfname, ournames[i]->filename); else nextoutfname = dupstr(ournames[i]->filename); ret = (file_type(nextoutfname) == FILE_TYPE_NONEXISTENT); sfree(nextoutfname); if (ret) break; i++; } if (i > 0) i--; } break if (restart) { while (i < nnames) { char *nextoutfname; nextoutfname = dupcat(outfname, "/", ournames[i], NULL); sftp_register(req = fxp_stat_send(nextoutfname)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); result = fxp_stat_recv(pktin, rreq, &attrs); sfree(nextoutfname); if (!result) break; i++; } if (i > 0) i--; } /* cfg.ssh_simple = TRUE Node-path: putty-gtk2/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60ecdffcd71c9e5f6c24f7388251ac47 Text-delta-base-sha1: cebc170686d7137b51d3f261c8587a837a1a2268 Text-content-length: 637 Text-content-md5: 0bb4830efcecf53b631fb759860abca4 Text-content-sha1: 98a4330faa819c5ee5c2f0e6268873564413021e Content-length: 637 SVN��XK*E�2��j(H�cX� b�6i�HRSAchar *name; int protocol; int default_port; }; extern Backend *, sshbug_maxpkt2; /* * ssh_simple means that we promise never to open any channel other * than the main one, which means it can safely use a very large * window in SSH-2. */ int ssh_simple int crhaslfBackend *backend_from_name(const char *name); Backend *backend_from_proto(int proto); char *save_settings(char *section, Config * cfg); void save_open_settings(void *sesskey, Config *cfg); void load_settings(char *section, Config * cfg); void load_open_settings(void *sesskey Node-path: putty-gtk2/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 42a7152157dd2bdaeb7b6296e8d6c09c Text-delta-base-sha1: 06b344af6ae82699c9da2de8a0d7021cb985bfd4 Text-content-length: 46 Text-content-md5: 49a49f58bfe263c84c939bc9f9cd9dde Text-content-sha1: 646034945d0fdaa5cefc1f39e5cceebb8f8e486f Content-length: 46 SVN��4M�/�"raw", PROT_RAW, 0 }; Node-path: putty-gtk2/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 89240c6e4a44e115dedf8103f70d0b31 Text-delta-base-sha1: 882b8e6f0e978a949a665b4665a73bf79f1f4aba Text-content-length: 54 Text-content-md5: 7ea8592b5901979aaeb7443c077700a3 Text-content-sha1: 9d619a775c5ba6e2f82ac274e159b1c1db4d0a7c Content-length: 54 SVN��&G&�!�"rlogin", PROT_RLOGIN, 513 }; Node-path: putty-gtk2/sercfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d5a417da7fe49a2c28481437003c0ee2 Text-delta-base-sha1: c632f58ce91f1f0ecc3a3b4fb5fa634c521a3a6a Text-content-length: 334 Text-content-md5: ffbba5d8a969e83df1690ab9e1126f82 Text-content-sha1: a68f3f964d1e31a84b79095ef8f9758139f80006 Content-length: 334 SVN��85 6�@�6�?yif (!midsession) { int i; extern void config_protocolbuttons_handler(union control *, void *, void *, int); /* * Add the serial back end to the protocols list at the * top of the config box. */ s = ctrl_getset(b, "Session", "hostport", "Specify the destination you want to connect to"); Node-path: putty-gtk2/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 37a2080534ee2270a164141e03fbaa72 Text-delta-base-sha1: 1dbe6a8f026e895cf0ae2ef75094a8673fcc6cd9 Text-content-length: 1385 Text-content-md5: 73fc0e393554a13607d23f95f4cb6592 Text-content-sha1: 378c7f5fead64891df018e6de2ae25e94eb165f4 Content-length: 1385 SVN��bqj�m��JbH�0*�)gh�$W� 5�.�7*�lnM�V=�P$�1;�[k�VE�K�~�M7rsa", KEX_RSA/* * Convenience functions to access the backends[] array * (which is only present in tools that manage settings). */ Backend *backend_from_name(const char *name) { Backend **p; for (p = backends; *p != NULL; p++) if (!strcmp((*p)->name, name)) return *p; return NULL; } Backend *backend_from_proto(int proto) { Backend **p; for (p = backends; *p != NULL; p++) if ((*p)->protocol == proto) return *p; return NULL; }cfg); close_settings_w(sesskey); return NULL; } void save_open_settings(void *sesskey, Config *cfg) { int i; char *p; write_setting_i(sesskey, "Present", 1); write_setting_s(sesskey, "HostName", cfg->host);{ const Backend *b = backend_from_proto(cfg->protocol); if (b) p = b->name; CRImpliesLF", cfg->crhaslfBugMaxPkt2", 2-cfg->sshbug_maxpktcfg); close_settings_r(sesskey); } void load_open_settings(void *sesskeygpps(sesskey, "HostName", "", cfg->host, sizeof(cfg->host));{ const Backend *b = backend_from_name(prot); if (b) { cfg->protocol = b->protocol; gppi(sesskey, "PortNumber", default_port, &cfg->port); } rsarsaCRImpliesLF", 0, &cfg->crhaslfBugMaxPkt2", 0, &i); cfg->sshbug_maxpkt2 = 2-i; cfg->ssh_simple = FALSE Node-path: putty-gtk2/sign.sh Node-kind: file Node-action: add Node-copyfrom-rev: 7913 Node-copyfrom-path: putty/sign.sh Text-copy-source-md5: 6df67e30e5f20ffd41cb7de2a516b37e Text-copy-source-sha1: 6b6b016fc25456682ffc6fffaa1314a869fe5947 Node-path: putty-gtk2/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4640f23cb729a2af8d5c74b161addf7a Text-delta-base-sha1: a1b1842c952404fbc14bd599feacb79ce835daff Text-content-length: 36423 Text-content-md5: 4a7e16781c059bfad922fe18f7c6a8d9 Text-content-sha1: 5b4be37ecd760261145072f142a23ce9612c6749 Content-length: 36423 SVN����{�P�e�@=4�hy�.�q5�An�K�;T�9kQ�u��n|�e�_:z�e+�~\�#S�`w��X�iY�zC�qAF�Y0� �#`�A�N:�]ca�Z<Y�KIU�CRh�af�Ef`�}(� IRHOSTS 1 /* 0x1 */ #define SSH1_AUTH_RSA 2 /* 0x2 */ #define SSH1_AUTH_PASSWORD 3 /* 0x3 */ #define SSH1_AUTH_RHOSTS_RSA 4 /* 0x4 */KEXRSA_PUBKEY 30 /* 0x1e */ #define SSH2_MSG_KEXRSA_SECRET 31 /* 0x1f */ #define SSH2_MSG_KEXRSA_DONE 32 /* 0x20typedef enum { SSH2_PKTCTX_NOKEX, SSH2_PKTCTX_DHGROUP, SSH2_PKTCTX_DHGEX, SSH2_PKTCTX_RSAKEX } Pkt_KCtx; typedef enum { SSH2_PKTCTX_NOAUTH, SSH2_PKTCTX_PUBLICKEY, SSH2_PKTCTX_PASSWORD, SSH2_PKTCTX_KBDINTER } Pkt_ACtx;#define BUG_SSH2_MAXPKT 256RFC 4254k(x,ctx) if (type == x && (pkt_kctx == ctx)) return #x #define translatea(x,ctx) if (type == x && (pkt_actx ==Pkt_KCtx pkt_kctx, Pkt_ACtx pkt_ak(SSH2_MSG_KEXDH_INIT, SSH2_PKTCTX_DHGROUP); translatek(SSH2_MSG_KEXDH_REPLY, SSH2_PKTCTX_DHGROUP); translatek(SSH2_MSG_KEX_DH_GEX_REQUEST, SSH2_PKTCTX_DHGEX); translatek(SSH2_MSG_KEX_DH_GEX_GROUP, SSH2_PKTCTX_DHGEX); translatek(SSH2_MSG_KEX_DH_GEX_INIT, SSH2_PKTCTX_DHGEX); translatek(SSH2_MSG_KEX_DH_GEX_REPLY, SSH2_PKTCTX_DHGEX); translatek(SSH2_MSG_KEXRSA_PUBKEY, SSH2_PKTCTX_RSAKEX); translatek(SSH2_MSG_KEXRSA_SECRET, SSH2_PKTCTX_RSAKEX); translatek(SSH2_MSG_KEXRSA_DONE, SSH2_PKTCTX_RSAKa(SSH2_MSG_USERAUTH_PK_OK, SSH2_PKTCTX_PUBLICKEY); translatea(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, SSH2_PKTCTX_PASSWORD); translatea(SSH2_MSG_USERAUTH_INFO_REQUEST, SSH2_PKTCTX_KBDINTER); translatea * - OUR_V2_BIGWIN is the window size we advertise for the only * channel in a simple connection. It must be <= INT_MAX. */ #define SSH1_BUFFER_LIMIT 32768 #define SSH_MAX_BACKLOG 32768 #define OUR_V2_WINSIZE 16384 #define OUR_V2_BIGWIN 0x7ffffffflittle structure to keep track of outstanding WINDOW_ADJUSTs */ struct winadj { struct winadj *next; unsigned size;/* * True if this channel is causing the underlying connection to be * throttled. */ int throttling_conn; union {/* locwindow is signed so we can cope with excess data. */ int locwindow, locmaxwin; /* * remlocwin is the amount of local window that we think * the remote end had available to it after it sent the * last data packet or window adjust ack. */ int remlocwin; /* * These store the list of window adjusts that haven't * been acked. */ struct winadj *winadj_head, *winadj_tail; enum { THROTTLED, UNTHROTTLING, UNTHROTTLED } throttle_stateintPkt_KCtx pkt_kctx; Pkt_ACtx pkt_actx; void *x11auth; int version; int conn48812kctx, ssh->pkt_actx, ssh_pkt_ensure(pkt, complen + 2); /* just in case it's got bigger */if (ssh->logctx) kctx, ssh->pkt_actx, pkt->data[5addstring_start(ipkt if (ssh->cfg.sshbug_maxpkt2 == FORCE_ON || (ssh->cfg.sshbug_maxpkt2 == AUTO && (wc_match("1.36_sshlib GlobalSCAPE", imp)))) { /* * This version ignores our makpkt and needs to be throttled. */ ssh->remote_bugs |= BUG_SSH2_MAXPKT; logevent("We believe remote version ignores SSH-2 maximum packet size/* * Send an appropriate SSH version string. */ static void ssh_send_verstring(Ssh ssh, char *svers) { char *verstring; if (ssh->version == 2) { /* * Construct a v2 version string. */ verstring = dupprintf("SSH-2.0-%s\015\012", sshver); } else { /* * Construct a v1 version string. */ verstring = dupprintf("SSH-%s-%s\012", (ssh_versioncmp(svers, "1.5") <= 0 ? svers : "1.5"), sshver); } ssh_fix_verstring(verstring); if (ssh->version == 2) { size_t len; /* * Record our version string. */ len = strcspn(verstring, "\015\012"); ssh->v_c = snewn(len + 1, char); memcpy(ssh->v_c, verstring, len); ssh->v_c[len] = 0; } logeventf(ssh, "We claim version: %.*s", strcspn(verstring, "\015\012"), verstring); s_write(ssh, verstring, strlen(verstring)); sfree(verstring);if (s->proto2 && (ssh->cfg.sshprot >= 2 || !s->proto1)) ssh->version = 2; else ssh->version = 1; logeventf(ssh, "Using SSH protocol version %d", ssh->version); /* Send the version string, if we haven't already */ if (ssh->cfg.sshprot != 3) ssh_send_verstring(ssh, s->version); if (ssh->version == 2) { size_t len; /* * Record their version string. */ len = strcspn(s->vstring, "\015\012"); ssh->v_s = snewn(len + 1, char); memcpy(ssh->v_s, s->vstring, len); ssh->v_s[len] = 0; /* * Initialise SSH-2 protocol. */ ssh->protocol = ssh2_protocol; ssh2_protocol_setup(ssh); ssh->s_rdpkt = ssh2_rdpkt; } else { /* * Initialise SSH-1 protocol. */ ssh->protocol = ssh1_protocol; ssh1_protocol_setup(ssh); ssh->s_rdpkt = ssh1_rdpkt; } if (ssh->version == 2) do_ssh2_transport(ssh, NULL, -1, NULLif (ssh->logctx) log_packet(ssh->logctx, PKT_INCOMING, -1, NULL, data, datalen, /* * If the SSH version number's fixed, set it now, and if it's SSH-2, * send the version string too. */ if (ssh->cfg.sshprot == 0) ssh->version = 1; if (ssh->cfg.sshprot == 3) { ssh->version = 2; ssh_send_verstring(ssh, NULL); } return NULL; } /* * Throttle or unthrottle the SSH connection. */ static void ssh_throttle_conn(Ssh ssh, int adjust) { int old_count = ssh->conn_throttle_count; ssh->conn_throttle_count += adjust; assert(ssh->conn_throttle_count >= 0); if (ssh->conn_throttle_count && !old_count) { ssh_set_frozen(ssh, 1); } else if (!ssh->conn_INT, replylen, PKTT_DATA if ((ssh->remote_bugs & BUG_CHOKES_ON_RSA)) s->supported_auths_mask &= ~(1 << SSH1_AUTH_RSA->supported_auths_mask & (1 << SSH1_AUTH_RSA)) == 0���U)Q�k;���N��'H� ]�,�F�Tn�_Q�%?�se�gZ�Y`��,;\�Yt�u?�N6G�L7;�G>c�1q�@�n�%qI�J_U�u��=(�` l�aj}�P@Q�>�BB �dx>�.m�(_m�Ry�g#�`5�Ky�Z�is�F�X�5w9�8bignum (s->p, s->responselen-(s->p-s->response), &s->key.exponent); if (n < 0) break; s->p += n; n = ssh1_read_bignum (s->p, s->responselen-(s->p-s->response), &s->key.modulus); if (n < 0) break; s->p += n; if (s->responselen - (s->p-s->response) < 4) break; s->commentlen = GET_32BIT(s->p); s->p += 4; if (s->responselen - (s->p-s->response) < s->commentlen) break; s->commentp = (char *)s->p; s->p += s->commentlen; ok = TRUE; } while (0); if (!ok) { logevent("Pageant key list packet was truncated"); break; } } if (s->publickey_blob) { if (!memcmp(pkblobs->keyi); s->tried_publickey = 1; } else /* Skip non-configured key */ continue; } logeventf(ssh, "Trying Pageant key #%d", s->keyi); send_packet(ssh, SSH1_CMSG_AUTH_RSA, PKT_BIGNUM, s->key.modulus, PKT_END); crWaitUntil(pktin); if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) { logevent("Key refused"); continue; } logevent("Received RSA challenge"); if ((s-> { char *agentreq, *q, *ret; void *vret; int len, retlen; len = 1 + 4; /* message type, bit count */ len += ssh1_bignum_length(s->key.exponent); len += ssh1_bignum_length(s->key.modulus); len += ssh1_bignum_length(s->challenge); len += 16; /* session id */ len += 4; /* response format */ agentreq = snewn(4 + len, char); PUT_32BIT(agentreq, len); q = agentreq + 4; *q++ = SSH1_AGENTC_RSA_CHALLENGE; PUT_32BIT(q, bignum_bitcount(s->key.modulus)); q += 4; q += ssh1_write_bignum(q, s->key.exponent); q += ssh1_write_bignum(q, s->key.modulus); q += ssh1_write_bignum(q, s->challenge); memcpy(q, s->session_id, 16); q += 16; PUT_32BIT(q, 1); /* response format */ if (!agent_query(agentreq, len + 4, &vret, &retlen, ssh_agent_callback, ssh)) { sfree(agentreq); do { crReturn(0); if (pktin) { bombout(("Uneif ((s->supported_auths_mask & (1 << SSH1_AUTH_PASSWORD)) == 0) { bombout(("No supported authentication methods available")); crStop(0); }_INT, len, PKTT_DATA int buflimit; if (ssh->state == SSH_STATE_CLOSED) return; if (ssh->version == 1) { buflimit = SSH1_BUFFER_LIMIT; } else { buflimit = c->v.v2.locmaxwin; ssh2_set_window(c, bufsize < buflimit ? buflimit - bufsize : 0); } if (c->throttling_conn && bufsize <= buflimit) { c->throttling_conn = 0; ssh_throttle_conn(ssh, -1_throttle_connthrottling_connthrottling_connthrottling_connthrottling_connthrottling_conn && bufsize > SSH1_BUFFER_LIMIT) { c->throttling_conn = 1; ssh_throttle_conn PKT_INT, len, PKTT_DATArsakeydata, *keystr, *fingerprint; int hostkeylen, siglen, rsakeylen; void *hkey; /* actual host key */ void *rsakey; /* for RSA kexkctx = SSH2_PKTCTX_NOKEXRSA: s->preferred_kex[s->n_preferred_kex++] = &ssh_rsa_kex; break; case KEXif (ssh->kex->main_type == KEXTYPE_DH) { /* * Work out the number of bits of key we will need from the * key exchange. We start with the maximum key length of * either cipher... */ { int csbits, scbits; csbits = s->cscipher_tobe->keylen; scbits = s->sccipher_tobe->keylen; s->nbits = (csbits > scbits ? csbits : scbits); } /* The keys only have hlen-bit entropy, since they're based on * a hash. So cap the key size at hlen bits. */ if (s->nbits > ssh->kex->hash->hlen * 8) s->nbits = ssh->kex->hash->hlen * 8; /* * If we're doing Diffie-Hellman group exchange, start by * requesting a group. */ if (!ssh->kex->pdata) { logevent("Doing Diffie-Hellman group exchange"); ssh->pkt_kctx = SSH2_PKTCTX_DHGEX; /* * Work out how big a DH group we will need to allow that * much data. */ s->pbits = 512 << ((s->nbits - 1) / 64); s->pktout = ssh2_pkt_init(SSH2_MSG_KEX_DH_GEX_REQUEST); ssh2_pkt_adduint32(s->pktout, s->pbits); ssh2_pkt_send_noqueue(ssh, s->pktout); crWaitUntil(pktin); if (pktin->type != SSH2_MSG_KEX_DH_GEX_GROUP) { bombout(("expected key exchange group packet from server")); crStop(0); } s->p = ssh2_pkt_getmp(pktin); s->g = ssh2_pkt_getmp(pktin); if (!s->p || !s->g) { bombout(("unable to read mp-ints from incoming group packet")); crStop(0); } ssh->kex_ctx = dh_setup_gex(s->p, s->g); s->kex_init_value = SSH2_MSG_KEX_DH_GEX_INIT; s->kex_reply_value = SSH2_MSG_KEX_DH_GEX_REPLY; } else { ssh->pkt_kctx = SSH2_PKTCTX_DHGROUP; ssh->kex_ctx = dh_setup_group(ssh->kex); s->kex_init_value = SSH2_MSG_KEXDH_INIT; s->kex_reply_value = SSH2_MSG_KEXDH_REPLY; logeventf(ssh, "Using Diffie-Hellman with standard group \"%s\"", ssh->kex->groupname); } logeventf(ssh, "Doing Diffie-Hellman key exchange with hash %s", ssh->kex->hash->text_name); /* * Now generate and send e for Diffie-Hellman. */ s->e = dh_create_e(ssh->kex_ctx, s->nbits * 2); s->pktout = ssh2_pkt_init(s->kex_init_value); ssh2_pkt_addmp(s->pktout, s->e); ssh2_pkt_send_noqueue(ssh, s->pktout); crWaitUntil(pktin); if (pktin->type != s->kex_reply_value) { bombout(("expected key exchange reply packet from server")); crStop(0); } set_busy_status(ssh->frontend, BUSY_CPU); /* cogitate */ ssh_pkt_getstring(pktin, &s->hostkeydata, &s->hostkeylen); s->f = ssh2_pkt_getmp(pktin); if (!s->f) { bombout(("unable to parse key exchange reply packet")); crStop(0); } ssh_pkt_getstring(pktin, &s->sigdata, &s->siglen); s->K = dh_find_K(ssh->kex_ctx, s->f); /* We assume everything from now on will be quick, and it might * involve user interaction. */ set_busy_status(ssh->frontend, BUSY_NOT); hash_string(ssh->kex->hash, ssh->exhash, s->hostkeydata, s->hostkeylen); if (!ssh->kex->pdata) { hash_uint32(ssh->kex->hash, ssh->exhash, s->pbits); hash_mpint(ssh->kex->hash, ssh->exhash, s->p); hash_mpint(ssh->kex->hash, ssh->exhash, s->g); } hash_mpint(ssh->kex->hash, ssh->exhash, s->e); hash_mpint(ssh->kex->hash, ssh->exhash, s->f); dh_cleanup(ssh->kex_ctx); freebn(s->f); if (!ssh->kex->pdata) { freebn(s->g); freebn(s->p); } } else { logeventf(ssh, "Doing RSA key exchange with hash %s", ssh->kex->hash->text_name); ssh->pkt_kctx = SSH2_PKTCTX_RSAKEX; /* * RSA key exchange. First expect a KEXRSA_PUBKEY packet * from the server. */ crWaitUntil(pktin); if (pktin->type != SSH2_MSG_KEXRSA_PUBKEY) { bombout(("expected RSA public key packet from server")); crStop(0); } ssh_pkt_getstring(pktin, &s->hostkeydata, &s->hostkeylen); hash_string(ssh->kex->hash, ssh->exhash, s->hostkeydata, s->hostkeylen); s->hkey = ssh->hostkey->newkey(s->hostkeydata, s->hostkeylen); { char *keydata; ssh_pkt_getstring(pktin, &keydata, &s->rsakeylen); s->rsakeydata = snewn(s->rsakeylen, char); memcpy(s->rsakeydata, keydata, s->rsakeylen); } s->rsakey = ssh_rsakex_newkey(s->rsakeydata, s->rsakeylen); if (!s->rsakey) { sfree(s->rsakeydata); bombout(("unable to parse RSA public key from server")); crStop(0); } hash_string(ssh->kex->hash, ssh->exhash, s->rsakeydata, s->rsakeylen); /* * Next, set up a shared secret K, of precisely KLEN - * 2*HLEN - 49 bits, where KLEN is the bit length of the * RSA key modulus and HLEN is the bit length of the hash * we're using. */ { int klen = ssh_rsakex_klen(s->rsakey); int nbits = klen - (2*ssh->kex->hash->hlen*8 + 49); int i, byte = 0; unsigned char *kstr1, *kstr2, *outstr; int kstr1len, kstr2len, outstrlen; s->K = bn_power_2(nbits - 1); for (i = 0; i < nbits; i++) { if ((i & 7) == 0) { byte = random_byte(); } bignum_set_bit(s->K, i, (byte >> (i & 7)) & 1); } /* * Encode this as an mpint. */ kstr1 = ssh2_mpint_fmt(s->K, &kstr1len); kstr2 = snewn(kstr2len = 4 + kstr1len, unsigned char); PUT_32BIT(kstr2, kstr1len); memcpy(kstr2 + 4, kstr1, kstr1len); /* * Encrypt it with the given RSA key. */ outstrlen = (klen + 7) / 8; outstr = snewn(outstrlen, unsigned char); ssh_rsakex_encrypt(ssh->kex->hash, kstr2, kstr2len, outstr, outstrlen, s->rsakey); /* * And send it off in a return packet. */ s->pktout = ssh2_pkt_init(SSH2_MSG_KEXRSA_SECRET); ssh2_pkt_addstring_start(s->pktout); ssh2_pkt_addstring_data(s->pktout, (char *)outstr, outstrlen); ssh2_pkt_send_noqueue(ssh, s->pktout); hash_string(ssh->kex->hash, ssh->exhash, outstr, outstrlen); sfree(kstr2); sfree(kstr1); sfree(outstr); } ssh_rsakex_freekey(s->rsakey); crWaitUntil(pktin); if (pktin->type != SSH2_MSG_KEXRSA_DONE) { sfree(s->rsakeydata); bombout(("expected signature packet from server")); crStop(0); } ssh_pkt_getstring(pktin, &s->sigdata, &s->siglen); sfree(s->rsakeydata); } shared secret. */ freebn(s->K);ssh2_pkt_addstring_start(pktout); dont_log_data(ssh, pktout, PKTLOG_OMITSet up most of a new ssh_channel for SSH-2. */ static void ssh2_channel_init(struct ssh_channel *c) { Ssh ssh = c->ssh; c->localid = alloc_channel_id(ssh); c->closes = 0; c->throttling_conn = FALSE; c->v.v2.locwindow = c->v.v2.locmaxwin = c->v.v2.remlocwin = ssh->cfg.ssh_simple ? OUR_V2_BIGWIN : OUR_V2_WINSIZE; c->v.v2.winadj_head = c->v.v2.winadj_tail = NULL; c->v.v2.throttle_state = UNTHROTTLED; bufchain_init(&c->v.v2.outbuffer);intIf the remote end has a habit of ignoring maxpkt, limit the * window so that it has no choice (assuming it doesn't ignore the * window as well). */ if ((ssh->remote_bugs & BUG_SSH2_MAXPKT) && newwin > OUR_V2_MAXPKT) newwin = OUR_V2_MAXPKT; / 2 >= c->v.v2.locwindow) { struct Packet *pktout; struct winadj *wa; /* * In order to keep track of how much window the client * actually has available, we'd like it to acknowledge each * WINDOW_ADJUST. We can't do that directly, so we accompany * it with a CHANNEL_REQUEST that has to be acknowledged. * * This is only necessary if we're opening the window wide. * If we're not, then throughput is being constrained by * something other than the maximum window size anyway. * * We also only send this if the main channel has finished its * initial CHANNEL_REQUESTs and installed the default * CHANNEL_FAILURE handler, so as not to risk giving it * unexpected CHANNEL_FAILUREs. */ if (newwin == c->v.v2.locmaxwin && ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE]) { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_addstring(pktout, "winadj@putty.projects.tartarus.org"); ssh2_pkt_addbool(pktout, TRUE); ssh2_pkt_send(ssh, pktout); /* * CHANNEL_FAILURE doesn't come with any indication of * what message caused it, so we have to keep track of the * outstanding CHANNEL_REQUESTs ourselves. */ wa = snew(struct winadj); wa->size = newwin - c->v.v2.locwindow; wa->next = NULL; if (!c->v.v2.winadj_head) c->v.v2.winadj_head = wa; else c->v.v2.winadj_tail->next = wa; c->v.v2.winadj_tail = wa; if (c->v.v2.throttle_state != UNTHROTTLED) c->v.v2.throttle_state = UNTHROTTLING; } else { /* Pretend the WINDOW_ADJUST was acked immediately. */ c->v.v2.remlocwin = newwin; c->v.v2.throttle_state = THROTTLED; }/* * Find the channel associated with a message. If there's no channel, * or it's not properly open, make a noise about it and return NULL. */ static struct ssh_channel *ssh2_channel_msg(Ssh ssh, struct Packet *pktin) { unsignedlocalid, ssh_channelfind); if (!c || (c->halfopen && pktin->type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION && pktin->type != SSH2_MSG_CHANNEL_OPEN_FAILURE)) { char *buf = dupprintf("Received %s for %s channel %u", ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx, pktin->type), c ? "half-open" : "nonexistent", localid); ssh_disconnect(ssh, NULL, buf, SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE); sfree(buf); return NULL; } return c; } static void ssh2_msg_channel_success(Ssh ssh, struct Packet *pktin) { /* * This should never get called. All channel requests are either * sent with want_reply false or are sent before this handler gets * installed. */ struct ssh_channel *c; struct winadj *wa; c = ssh2_channel_msg(ssh, pktin); if (!c) return; wa = c->v.v2.winadj_head; if (wa) ssh_disconnect(ssh, NULL, "Received SSH_MSG_CHANNEL_SUCCESS for " "\"winadj@putty.projects.tartarus.org\"", SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE); else ssh_disconnect(ssh, NULL, "Received unsolicited SSH_MSG_CHANNEL_SUCCESS", SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE); } static void ssh2_msg_channel_failure(Ssh ssh, struct Packet *pktin) { /* * The only time this should get called is for "winadj@putty" * messages sent above. All other channel requests are either * sent with want_reply false or are sent before this handler gets * installed. */ struct ssh_channel *c; struct winadj *wa; c = ssh2_channel_msg(ssh, pktin); if (!c) return; wa = c->v.v2.winadj_head; if (!wa) { ssh_disconnect(ssh, NULL, "Received unsolicited SSH_MSG_CHANNEL_FAILURE", SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE); return; } c->v.v2.winadj_head = wa->next; c->v.v2.remlocwin += wa->size; sfree(wa); /* * winadj messages are only sent when the window is fully open, so * if we get an ack of one, we know any pending unthrottle is * complete. */ if (c->v.v2.throttle_state == UNTHROTTLING) c->v.v2.throttle_state = UNTHROTTLED; } static void ssh2_msg_channel_window_adjust(Ssh ssh, struct Packet *pktin) { struct ssh_channel *c; c = ssh2_channel_msg(ssh, pktin); if (!c) return; if (struct ssh_channel *c; c = ssh2_channel_msg(ssh, pktin); if (!c) return;c->v.v2.remlocwinit looks like the remote end hit the end of its window, * and we didn't want it to do that, think about using a * larger window. */ if (c->v.v2.remlocwin <= 0 && c->v.v2.throttle_state == UNTHROTTLED && c->v.v2.locmaxwin < 0x40000000) c->v.v2.locmaxwin += OUR_V2_WINSIZE; If we are buffering too much, we may still * need to adjust the window if the server's * sent excess data. */ ssh2_set_window(c, bufsize < c->v.v2.locmaxwin ? c->v.v2.locmaxwin - bufsize : 0); /* * If we're either buffering way too much data, or if we're * buffering anything at all and we're in "simple" mode, * throttle the whole channel. */ if ((bufsize > c->v.v2.locmaxwin || (ssh->cfg.ssh_simple && bufsize > 0)) && !c->throttling_conn) { c->throttling_conn = 1; ssh_throttle_conn(ssh, +1); } } } static void ssh2_msg_channel_eof(Ssh ssh, struct Packet *pktin) { struct ssh_channel *c; c = ssh2_channel_msg(ssh, pktin); if (!c) return;struct ssh_channel *c; struct Packet *pktout; c = ssh2_channel_msg(ssh, pktin); if (!c) return;struct ssh_channel *c; struct Packet *pktout; c = ssh2_channel_msg(ssh, pktin); if (!c) return;ssh2_channel_msg(ssh, pktin); if (!c) return;c = ssh2_channel_msg(ssh, pktin); if (!c) return;of RFC 4254RFC 4254define TRANSLATE_SIGNAL(s) \ else if (siglen == lenof(#s)-1 && !memcmp(sig, #s, siglen)) \ ssh->exitcode = 128 + SIG ## s #ifdef SIGABRT TRANSLATE_SIGNAL(ABRT); #endif #ifdef SIGALRM TRANSLATE_SIGNAL(ALRM); #endif #ifdef SIGFPE TRANSLATE_SIGNAL(FPE); #endif #ifdef SIGHUP TRANSLATE_SIGNAL(HUP); #endif #ifdef SIGILL TRANSLATE_SIGNAL(ILL); #endif #ifdef SIGINT TRANSLATE_SIGNAL(INT); #endif #ifdef SIGKILL TRANSLATE_SIGNAL(KILL); #endif #ifdef SIGPIPE TRANSLATE_SIGNAL(PIPE); #endif #ifdef SIGQUIT TRANSLATE_SIGNAL(QUIT); #endif #ifdef SIGSEGV TRANSLATE_SIGNAL(SEGV); #endif #ifdef SIGTERM TRANSLATE_SIGNAL(TERM); #endif #ifdef SIGUSR1 TRANSLATE_SIGNAL(USR1); #endif #ifdef SIGUSR2 TRANSLATE_SIGNAL(USR2); #endif #undef TRANSLATE_SIGNAL� 85_E�z��o�#�\f�%q�|E�Ep�$_�4c�fe�u�4�'Ec�be�}�y{�y~�t{@�)v�>!�Pz6�gF� '<�gG�1S ~ !memcmp(type, "forwarded-tcpip", 15)) { struct ssh_rportfwd pf, *realpf; char *dummy; int dummylen; ssh_pkt_getstring(pktin, &dummy, &dummylen);/* skip address */ pf.sport = ssh_pkt_getuint32(pktin); ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen); peerport = ssh_pkt_getuint32(pktin); realpf = find234(ssh->rportfwds, &pf, NULL); logeventf(ssh, "Received remote port %d open request " "from %s:%d", pf.sport, peeraddr, peerport); if (realpf == NULL) { error = "Remote port is not recognised"; } else { const char *e = pfd_newconnect(&c->u.pfd.s, realpf->dhost, realpf->dport, c, &ssh->cfg, realpf->pfrec->addressfamily); logeventf(ssh, "Attempting to forward remote port to " "%s:%d", realpf->dhost, realpf->dport); if (e != NULL) { logeventf(ssh, "Port open failed: %s", e); error = "Port open failed"; } else { logevent("Forwarded port opened successfully"); c->type = CHAN_SOCKDATA; } } } else if (typelen == 22 && !memcmp(type, "auth-agent@openssh.com", 22)) { if (!ssh->agentfwd_enabled) error = "Agent forwarding is not enabled"; else { c->type = CHAN_AGENT; /* identify channel type */ c->u.a.lensofar = 0; } } else { error = "Unsupported channel type requested"; } c->remoteid = remid; c->halfopen = FALSE; if (error) { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURE); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_adduint32(pktout, SSH2_OPEN_CONNECT_FAILED); ssh2_pkt_addstring(pktout, error); ssh2_pkt_addstring(pktout, "en"); /* language tag */ ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Rejected channel open: %s", error); sfree(c); } else { ssh2_channel_init(c); c->v.v2.remwindow = winsize; c->v.v2.remmaxpkt = pktsize; add234(ssh->channels, c); pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_adduint32(pktout, c->localid); ssh2_pkt_adduint32(pktout, c->v.v2.locwindow); ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */ ssh2_pkt_send(ssh, pktout); } } /* * Buffer banner messages for later display at some convenient point. */ static void ssh2_msg_userauth_banner(Ssh ssh, struct Packet *pktin) { /* Arbitrary limit to prevent unbounded inflation of buffer */ if (bufchain_size(&ssh->banner) <= 131072) { char *banner = NULL; int size = 0; ssh_pkt_getstring(pktin, &banner, &size); if (banner) bufchain_add(&ssh->banner, banner, size); } } /* Helper function to deal with sending tty modes for "pty-req" */ static void ssh2_send_ttymode(void *data, char *mode, char *val) { struct Packet *pktout = (struct Packet *)data; int i = 0; unsigned int arg = 0; while (strcmp(mode, ssh_ttymodes[i].mode) != 0) i++; if (i == lenof(ssh_ttymodes)) return; switch (ssh_ttymodes[i].type) { case TTY_OP_CHAR: arg = ssh_tty_parse_specchar(val); break; case TTY_OP_BOOL: arg = ssh_tty_parse_boolean(val); break; } ssh2_pkt_addbyte(pktout, ssh_ttymodes[i].opcode); ssh2_pkt_adduint32(pktout, arg); } /* * Handle the SSH-2 userauth and connection layers. */ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, struct Packet *pktin) { struct do_ssh2_authconn_state { enum { AUTH_TYPE_NONE, AUTH_TYPE_PUBLICKEY, AUTH_TYPE_PUBLICKEY_OFFER_LOUD, AUTH_TYPE_PUBLICKEY_OFFER_QUIET, AUTH_TYPE_PASSWORD, AUTH_TYPE_KEYBOARD_INTERACTIVE, AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET } type; int done_service_req; int gotit, need_pw, can_pubkey, can_passwd, can_keyb_inter; int tried_pubkey_config, done_agent; int kbd_inter_refused; int we_are_in; prompts_t *cur_prompt; int num_prompts; char username[100]; char *password; int got_username; void *publickey_blob; int publickey_bloblen; int publickey_encrypted; char *publickey_algorithm; char *publickey_comment; unsigned char agent_request[5], *agent_response, *agentp; int agent_responselen; unsigned char *pkblob_in_agent; int keyi, nkeys; char *pkblob, *alg, *commentp; int pklen, alglen, commentlen; int siglen, retlen, len; char *q, *agentreq, *ret; int try_send; int num_env, env_left, env_ok; struct Packet *pktout; }; crState(do_ssh2_authconn_state); crBegin(ssh->do_ssh2_authconn_crstate); s->done_service_req = FALSE; s->we_are_in = FALSE; if (!ssh->cfg.ssh_no_userauth) { /* * Request userauth protocol, and await a response to it. */ s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST); ssh2_pkt_addstring(s->pktout, "ssh-userauth"); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type == SSH2_MSG_SERVICE_ACCEPT) s->done_service_req = TRUE; } if (!s->done_service_req) { /* * Request connection protocol directly, without authentication. */ s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST); ssh2_pkt_addstring(s->pktout, "ssh-connection"); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type == SSH2_MSG_SERVICE_ACCEPT) { s->we_are_in = TRUE; /* no auth required */ } else { bombout(("Server refused service request")); crStopV; } } /* Arrange to be able to deal with any BANNERs that come in. * (We do this now as packets may come in during the next bit.) */ bufchain_init(&ssh->banner); ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = ssh2_msg_userauth_banner; /* * Misc one-time setup for authentication. */ s->publickey_blob = NULL; if (!s->we_are_in) { /* * Load the public half of any configured public key file * for later use. */ if (!filename_is_null(ssh->cfg.keyfile)) { int keytype; logeventf(ssh, "Reading private key file \"%.150s\"", filename_to_str(&ssh->cfg.keyfile)); keytype = key_type(&ssh->cfg.keyfile); if (keytype == SSH_KEYTYPE_SSH2) { const char *error; s->publickey_blob = ssh2_userkey_loadpub(&ssh->cfg.keyfile, &s->publickey_algorithm, &s->publickey_bloblen, &s->publickey_comment, &error); if (s->publickey_blob) { s->publickey_encrypted = ssh2_userkey_encrypted(&ssh->cfg.keyfile, NULL); } else { char *msgbuf; logeventf(ssh, "Unable to load private key (%s)", error); msgbuf = dupprintf("Unable to load private key file " "\"%.150s\" (%s)\r\n", filename_to_str(&ssh->cfg.keyfile), error); c_write_str(ssh, msgbuf); sfree(msgbuf); } } else { char *msgbuf; logeventf(ssh, "Unable to use this key file (%s)", key_type_to_str(keytype)); msgbuf = dupprintf("Unable to use key file \"%.150s\"" " (%s)\r\n", filename_to_str(&ssh->cfg.keyfile), key_type_to_str(keytype)); c_write_str(ssh, msgbuf); sfree(msgbuf); s->publickey_blob = NULL; } } /* * Find out about any keys Pageant has (but if there's a * public key configured, filter out all others). */ s->nkeys = 0; s->agent_response = NULL; s->pkblob_in_agent = NULL; if (ssh->cfg.tryagent && agent_exists()) { void *r; logevent("Pageant is running. Requesting keys."); /* Request the keys held by the agent. */ PUT_32BIT(s->agent_request, 1); s->agent_request[4] = SSH2_AGENTC_REQUEST_IDENTITIES; if (!agent_query(s->agent_request, 5, &r, &s->agent_responselen, ssh_agent_callback, ssh)) { do { crReturnV; if (pktin) { bombout(("Unexpected data from server while" " waiting for agent response")); crStopV; } } while (pktin || inlen > 0); r = ssh->agent_response; s->agent_responselen = ssh->agent_response_len; } s->agent_response = (unsigned char *) r; if (s->agent_response && s->agent_responselen >= 5 && s->agent_response[4] == SSH2_AGENT_IDENTITIES_ANSWER) { int keyi; unsigned char *p; p = s->agent_response + 5; s->nkeys = GET_32BIT(p); p += 4; logeventf(ssh, "Pageant has %d SSH-2 keys", s->nkeys); if (s->publickey_blob) { /* See if configured key is in agent. */ for (keyi = 0; keyi < s->nkeys; keyi++) { s->pklen = GET_32BIT(p); if (s->pklen == s->publickey_bloblen && !memcmp(p+4, s->publickey_blob, s->publickey_bloblen)) { logeventf(ssh, "Pageant key #%d matches " "configured key file", keyi); s->keyi = keyi; s->pkblob_in_agent = p; break; } p += 4 + s->pklen; p += GET_32BIT(p) + 4; /* comment */ } if (!s->pkblob_in_agent) { logevent("Configured key file not in Pageant"); s->nkeys = 0; } } } } } /* * We repeat this whole loop, including the username prompt, * until we manage a successful authentication. If the user * types the wrong _password_, they can be sent back to the * beginning to try another username, if this is configured on. * (If they specify a username in the config, they are never * asked, even if they do give a wrong password.) * * I think this best serves the needs of * * - the people who have no configuration, no keys, and just * want to try repeated (username,password) pairs until they * type both correctly * * - people who have keys and configuration but occasionally * need to fall back to passwords * * - people with a key held in Pageant, who might not have * logged in to a particular machine before; so they want to * type a username, and then _either_ their key will be * accepted, _or_ they will type a password. If they mistype * the username they will want to be able to get back and * retype it! */ s->username[0] = '\0'; s->got_username = FALSE; while (!s->we_are_in) { /* * Get a username. */ if (s->got_username && !ssh->cfg.change_username) { /* * We got a username last time round this loop, and * with change_username turned off we don't try to get * it again. */ } else if (!*ssh->cfg.username) { int ret; /* need not be kept over crReturn */ s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = TRUE; s->cur_prompt->name = dupstr("SSH login name"); add_prompt(s->cur_prompt, dupstr("login as: "), TRUE, lenof(s->username)); ret = get_userpass_input(s->cur_prompt, NULL, 0);actx = SSH2_PKTCTX_NOAUTHactx = SSH2_PKTCTX_NOAUTHactx actx actx actx 2_channel_init(ssh->mainchanv.v2.remwindow = ssh_pkt_getuint32(pktin); ssh->mainchan->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin2_channel_init(ssh->mainchanv.v2.remwindow = ssh_pkt_getuint32(pktin); ssh->mainchan->v.v2.remmaxpkt = ssh_pkt_getuint32(pktinif (ssh->cfg.ssh_simple) { /* * This message indicates to the server that we promise * not to try to run any other channel in parallel with * this one, so it's safe for it to advertise a very large * window and leave the flow control to TCP. */simple@putty.projects.tartarus.org"); ssh2_pkt_addbool(s->pktout, 0); /* no reply */ ssh2_pkt_send(ssh, s->pktout); }All the initial channel requests are done, so install the default * failure handler. */ ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = ssh2_msg_channel_success; ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_channel_failurekctx = SSH2_PKTCTX_NOKEX; ssh->pkt_actx = SSH2_PKTCTX_NOAUTHconnRFC 4254 c->ssh = ssh; ssh2_channel_init(c); c->halfopen = TRUE; c->type = CHAN_SOCKDATA_DORMANT;/* identify channel type */ c->u.pfd.s = s; add234(ssh->channels, c);nt buflimit; _throttle_conn(ssh, -1); } } else { if (ssh->mainchan) { ssh2_set_window(ssh->mainchan, bufsize < ssh->mainchan->v.v2.locmaxwin ? ssh->mainchan->v.v2.locmaxwin - bufsize : 0); if (ssh->cfg.ssh_simple) buflimit = 0; else buflimit = ssh->mainchan->v.v2.locmaxwin; if (ssh->mainchan->throttling_conn && bufsize <= buflimit) { ssh->mainchan->throttling_conn = 0; ssh_throttle_conn(ssh, -1); } }"ssh", PROT_SSH Node-path: putty-gtk2/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 28f378caae07c18ed4c2b53685f33319 Text-delta-base-sha1: 3fcfdb93ce361007fa5349d2bc8d3bab3c8cee08 Text-content-length: 539 Text-content-md5: 4e4468209eda8d7385be923e1be7c60e Text-content-sha1: 84541c43a640bfb58b9d6ebbc7a9f759fabefd2e Content-length: 539 SVN��LSs�8�V�t4�B4�rZ/* * SSH2 RSA key exchange functions */ struct ssh_hash; void *ssh_rsakex_newkey(char *data, int len); void ssh_rsakex_freekey(void *key); int ssh_rsakex_klen(void *key); void ssh_rsakex_encrypt(const struct ssh_hash *h, unsigned char *in, int inlen, unsigned char *out, int outlen, void *keychar *name, *groupname; enum { KEXTYPE_DH, KEXTYPE_RSA } main_type; /* For DH */ const unsigned char *pdata, *gdata; /* NULL meanskexes ssh_rsa_k Node-path: putty-gtk2/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 93142330a9b79034ff54ba7ef3189817 Text-delta-base-sha1: d14c0b2b9fe8ce34143e62216bc6eb355305a425 Text-content-length: 33 Text-content-md5: 20bbb8a93ad4cd5093839a7490a6f48b Text-content-sha1: bb24818b01593ce6b239050f4b6c66280114852c Content-length: 33 SVN��]> �K��krRFC 4250 Node-path: putty-gtk2/sshdh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b0db7b5019b9f6c0431411d3665eee4e Text-delta-base-sha1: f67e79dd2543fdb8a7b7178ed18a8cf7554b751d Text-content-length: 83 Text-content-md5: 6fa5178d7618e147013eb5e6712f6ea3 Text-content-sha1: 67c7bcfa672961dd331e632c942f6320486edb01 Content-length: 83 SVN��C,�3��p2�z!��h+KEXTYPE_DH,KEXTYPE_DH,KEXTYPE_DH,KEXTYPE_DH, Node-path: putty-gtk2/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 264f3c7c696a8a521cfa8f8b5040379a Text-delta-base-sha1: 896da586b5b74410e38bb2d1ace31efa1850d0c8 Text-content-length: 40 Text-content-md5: 2a549a206a18417111c91cab80c1fbb8 Text-content-sha1: a8c21d6849603f668d994fb41d4afdd789379886 Content-length: 40 SVN��ld �h��)w�H$RFC 4253RFC Node-path: putty-gtk2/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f5f1cbdba873e28d964d166e8ec81ba Text-delta-base-sha1: 7cfdb8212c88f41f3795d69fd57152dcb9372147 Text-content-length: 4365 Text-content-md5: 34b6c0a08ed78c362887fd42ca6a5d85 Text-content-sha1: 1287e18db02c40ebed06e3ad722657f7b582aef8 Content-length: 4365 SVN��qhw�q�w void *ssh_rsakex_newkey(char *data, int len) { return rsa2_newkey(data, len); } void ssh_rsakex_freekey(void *key) { rsa2_freekey(key); } int ssh_rsakex_klen(void *key) { struct RSAKey *rsa = (struct RSAKey *) key; return bignum_bitcount(rsa->modulus); } static void oaep_mask(const struct ssh_hash *h, void *seed, int seedlen, void *vdata, int datalen) { unsigned char *data = (unsigned char *)vdata; unsigned count = 0; while (datalen > 0) { int i, max = (datalen > h->hlen ? h->hlen : datalen); void *s; unsigned char counter[4], hash[SSH2_KEX_MAX_HASH_LEN]; assert(h->hlen <= SSH2_KEX_MAX_HASH_LEN); PUT_32BIT(counter, count); s = h->init(); h->bytes(s, seed, seedlen); h->bytes(s, counter, 4); h->final(s, hash); count++; for (i = 0; i < max; i++) data[i] ^= hash[i]; data += max; datalen -= max; } } void ssh_rsakex_encrypt(const struct ssh_hash *h, unsigned char *in, int inlen, unsigned char *out, int outlen, void *key) { Bignum b1, b2; struct RSAKey *rsa = (struct RSAKey *) key; int k, i; char *p; const int HLEN = h->hlen; /* * Here we encrypt using RSAES-OAEP. Essentially this means: * * - we have a SHA-based `mask generation function' which * creates a pseudo-random stream of mask data * deterministically from an input chunk of data. * * - we have a random chunk of data called a seed. * * - we use the seed to generate a mask which we XOR with our * plaintext. * * - then we use _the masked plaintext_ to generate a mask * which we XOR with the seed. * * - then we concatenate the masked seed and the masked * plaintext, and RSA-encrypt that lot. * * The result is that the data input to the encryption function * is random-looking and (hopefully) contains no exploitable * structure such as PKCS1-v1_5 does. * * For a precise specification, see RFC 3447, section 7.1.1. * Some of the variable names below are derived from that, so * it'd probably help to read it anyway. */ /* k denotes the length in octets of the RSA modulus. */ k = (7 + bignum_bitcount(rsa->modulus)) / 8; /* The length of the input data must be at most k - 2hLen - 2. */ assert(inlen > 0 && inlen <= k - 2*HLEN - 2); /* The length of the output data wants to be precisely k. */ assert(outlen == k); /* * Now perform EME-OAEP encoding. First set up all the unmasked * output data. */ /* Leading byte zero. */ out[0] = 0; /* At position 1, the seed: HLEN bytes of random data. */ for (i = 0; i < HLEN; i++) out[i + 1] = random_byte(); /* At position 1+HLEN, the data block DB, consisting of: */ /* The hash of the label (we only support an empty label here) */ h->final(h->init(), out + HLEN + 1); /* A bunch of zero octets */ memset(out + 2*HLEN + 1, 0, outlen - (2*HLEN + 1)); /* A single 1 octet, followed by the input message data. */ out[outlen - inlen - 1] = 1; memcpy(out + outlen - inlen, in, inlen); /* * Now use the seed data to mask the block DB. */ oaep_mask(h, out+1, HLEN, out+HLEN+1, outlen-HLEN-1); /* * And now use the masked DB to mask the seed itself. */ oaep_mask(h, out+HLEN+1, outlen-HLEN-1, out+1, HLEN); /* * Now `out' contains precisely the data we want to * RSA-encrypt. */ b1 = bignum_from_bytes(out, outlen); b2 = modpow(b1, rsa->exponent, rsa->modulus); p = (char *)out; for (i = outlen; i--;) { *p++ = bignum_byte(b2, i); } freebn(b1); freebn(b2); /* * And we're done. */ } static const struct ssh_kex ssh_rsa_kex_sha1 = { "rsa1024-sha1", NULL, KEXTYPE_RSA, NULL, NULL, 0, 0, &ssh_sha1 }; static const struct ssh_kex ssh_rsa_kex_sha256 = { "rsa2048-sha256", NULL, KEXTYPE_RSA, NULL, NULL, 0, 0, &ssh_sha256 }; static const struct ssh_kex *const rsa_kex_list[] = { &ssh_rsa_kex_sha256, &ssh_rsa_kex_sha1 }; const struct ssh_kexes ssh_rsa_kex = { sizeof(rsa_kex_list) / sizeof(*rsa_kex_list), rsa_kex_list }; Node-path: putty-gtk2/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f9698c839aa20edcfb639947afce6372 Text-delta-base-sha1: 996b5261e94ee76c13fb970d22e373a25922881a Text-content-length: 56 Text-content-md5: 601ecb8720c8c815745b0c9e538d141d Text-content-sha1: 83202d79b01a4b64786781087ffbb107f69958c0 Content-length: 56 SVN��3%��"telnet", PROT_TELNET, 23 }; Node-path: putty-gtk2/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f2b235aa520dec33bbdec09a41c70fbb Text-delta-base-sha1: aef2a75ef75561a57481b50124f955e862bfc36f Text-content-length: 1654 Text-content-md5: e82a5138266cb0c298250733c97f68bb Text-content-sha1: f82d311bf38fcf9ecfbf5633fd334a7582bf60bc Content-length: 1654 SVN����C�`�G�PY�~=�P)�3g �4�B$�]6I�beterm->xterm_mouse = FALSE; set_raw_mouse_mode(term->frontend, FALSE term->alt_y += 1; term->alt_ term->alt_y -= 1; term->alt_savecurs.x >= newcols) term->savecurs.x = newcols - 1; if (term->alt_savecurs.y < 0) term->alt_savecurs.y = 0; if (term->alt_savecurs.y >= newrows) term->alt_savecurs.y = newrows - 1; if (term->alt_savecurs.x >= newcols) term->alt_savecurs.x = newcolif (term->alt_y < 0) term->alt_y = 0; if (term->alt_y >= newrows) term->alt_y = newrows - 1; if (term->alt_x >= newcols) term->alt_ if (term->cfg.crhaslf) { else if (term->curs.y < term->rows - 1) term->curs.y++; }�RKp9�\��S; if (term->cfg.no_remote_charset) break; term->sco_acs = 2; break; case 22: /* disable bold */ compatibility2(OTHER, VT220); term->curr_attr &= ~ATTR_BOLD; break; case 24: /* disable underline */ compatibility2(OTHER, VT220); term->curr_attr &= ~ATTR_UNDER; break; case 25: /* disable blink */ compatibility2(OTHER, VT220); term->curr_attr &= ~ATTR_BLINK; break; case 27: /* disable reverse video */ compatibility2(OTHER, VT220); term->curr_attr &= ~ATTR_REVERSE; break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: /* foreground */ term->curr_attr &= ~ATTR_FGMASK; term->curr_attr |= /* FIXME: or ECHO and friends based on local echo state Node-path: putty-gtk2/testback.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7829eef16a7aaafb3a07725e790cdbc0 Text-delta-base-sha1: 5a058390df131d9a0b65def499fd826085e3ff34 Text-content-length: 153 Text-content-md5: 48c85ae8cb51288fbf23506db5368a10 Text-content-sha1: fc501783926a4ef0faf37ab6266bf28cf4a07519 Content-length: 153 SVN��4&h�>��1P�{!���{!�H�int null_connectedconnected"null", -1connected"loop", -1int null_connected(void *handle) { return 0 Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 909b6dc24e04446ffc1fcfbad4562b9d Text-delta-base-sha1: 1a14a251d7ea5e5f1b95565489a0d7fec37b58c2 Text-content-length: 967 Text-content-md5: 8a3aad3b0320df6bafc4ae73c9280b06 Text-content-sha1: d7f57dad1f36f24adbf00e0872587d1ba0b71004 Content-length: 967 SVN���JY���d�� �[5�z�}};�|~�7|�1�P7�R int nclicks_press(GtkWidget *item, GdkEventButton *event, gpointer data); static gboolean listitem_button_release(GtkWidget *item, GdkEventButton *event, _press), dp); gtk_signal_connect(GTK_OBJECT(listitem), "button_release_event", GTK_SIGNAL_FUNC(listitem_button_release), dp);_press(GtkWidget *item, GdkEventButton *event, item)); switch (event->type) { default: case GDK_BUTTON_PRESS: uc->nclicks = 1; break; case GDK_2BUTTON_PRESS: uc->nclicks = 2; break; case GDK_3BUTTON_PRESS: uc->nclicks = 3; break; } return FALSE; } static gboolean listitem_button_release(GtkWidget *item, GdkEventButton *event, item)); if (uc->nclicks>1) { uc->nclicks = 088�<#kFL D"D(KE!DFJDL~DE~PPEND WIDTH"), "Overwrite", 'o', 1, 2Appenda', 0Disabld', -1NULL); sfree(message);btitlreturn mbret; } Node-path: putty-gtk2/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0cf85e2d2b9ade4e57b419978ad6d74c Text-delta-base-sha1: 515dbe55c919e286dec9275c414b57cb3f0f36e0 Text-content-length: 1725 Text-content-md5: 8b9098e8c541efe4ebb8e7a60cfdeeb9 Text-content-sha1: 1ff068649a11c1353c417d93d5c0032ae9d79103 Content-length: 1725 SVN����`!�d��V|L�@v�BY�U�/�.-�3[�< j�Z)��u-f�#@sends a Break special to the backendif (inst->back) inst->back->special(inst->backhandle, TS_BRK); return /* And normal Tab is Tab, if the keymap hasn't already told us. * (Curiously, at least one version of the MacOS 10.5 X server * doesn't translate Tab for us. */ if (event->keyval == GDK_Tab && end <= 1) { output[1] = '\t'; end = 2*== BELL_DEFAULT int *allow_launch, allow_launch GdkBitmap *iconmask&iconmask, NULL, (gchar **)icon[0]); gdk_window_set_icon(window->window, NULL, iconpm, iconmask/* By default, we bring up the config dialog, rather than launching * a session. This gets set to TRUE if something happens to change * that (e.g., a hostname is specified on the command-line). */ int allow_launch = FALSE; if (do_cmdline(argc, argv, 0, &allow_launch&allow_launchloaded_session) allow_launch = TRUE; if ((!allow_launch || !cfg_launchable(&inst->cfg)) && �)F�)� gtk_box_pack_start(inst->hbox, inst->sbar, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(inst->window), GTK_WIDGET(inst->hbox)); set_geom_hints(inst); gtk_widget_show(inst->area); if (inst->cfg.scrollbar) gtk_widget_show(inst->sbar); else gtk_widget_hide(inst->sbar); gtk_widget_show(GTK_WIDGET(inst->hbox)); if (inst->gotpos) { int x = inst->xpos, y = inst->ypos; GtkRequisition req; gtk_widget_size_request(GTK_WIDGET(inst->window), &req); if (inst->gravity & 1) x += gdk_screen_width() - req.width; if (inst->gravity & 2) y += gdk_screen_height() - req.height; gtk_window_set_positi Node-path: putty-gtk2/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b95e2d8dd79f71443e622fc057c41695 Text-delta-base-sha1: c7dfa4537de6045a48dfdbd30a61497f98062bd1 Text-content-length: 685 Text-content-md5: c10bbd509aa09592f608da008b785978 Text-content-sha1: 4877ea1643fabef35654c4824db82af7430ae3f4 Content-length: 685 SVN��`t�K�o�AG��Y * Unix-specific global flag * * FLAG_STDERR_TTY indicates that standard error might be a terminal and * might get its configuration munged, so anything trying to output plain * text (i.e. with newlines in it) will need to put it back into cooked * mode first. Applications setting this flag should also call * stderr_tty_init() before messing with any terminal modes, and can call * premsg() before outputting text to stderr and postmsg() afterwards. */ #define FLAG_STDERR_TTY 0x1000, int *allow_launchings provided by uxcons.c */ struct termios; void stderr_tty_init(void); void premsg(struct termios *); void postmsg(struct termios * Node-path: putty-gtk2/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 88c006a97a5264d5ed6e6e28bcaa78b7 Text-delta-base-sha1: 981c9d2cb8701addb4684d3bb6a327a5c007d4c8 Text-content-length: 1150 Text-content-md5: 43119745f419a38485870b75d7c31b82 Text-content-sha1: 9fb797cd6b3dc66d1e14c9c21ca26f9affd794d3 Content-length: 1150 SVN��HKF,�a�G�_�+p�dW�53�KhO�,d�X�|cO� tr�6static struct termios orig_termios_stderr; static int stderr_is_a_tty; void stderr_tty_init() { /* Ensure that if stderr is a tty, we can get it back to a sane state. */ if ((flags & FLAG_STDERR_TTY) && isatty(STDERR_FILENO)) { stderr_is_a_tty = TRUE; tcgetattr(STDERR_FILENO, &orig_termios_stderr); } } void premsg(struct termios *cf) { if (stderr_is_a_tty) { tcgetattr(STDERR_FILENO, cf); tcsetattr(STDERR_FILENO, TCSADRAIN, &orig_termios_stderr); } } void postmsg(struct termios *cf) { if (stderr_is_a_tty) tcsetattr(STDERR_FILENO, TCSADRAIN, cf); } struct termios cfpremsg(&cf); postmsg(&cf); return 1; } else { fprintf(stderr, abandoned); postmsg(&cf struct termios cf; premsg(&cf);postmsg(&cf); return 1; } else { fprintf(stderr, abandoned); postmsg(&cf struct termios cf; premsg(&cf);postmsg(&cf);struct termios cf; premsg(&cf); fputs(message, stderr); postmsg(&cfstruct termios cf; premsg(&cf); if (console_logctx) log_eventlog(console_logctx, string); postmsg(&cf Node-path: putty-gtk2/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f6b9cca35f2f26994b555e259386098e Text-delta-base-sha1: a786c980aa7ef83389ebb236d7e4ece2517bc45a Text-content-length: 633 Text-content-md5: 482cefe01fa565730c807372f5fcaee2 Text-content-sha1: d269224642ed49fda811196d696225e6ccc22b7f Content-length: 633 SVN��]'D�X��II� u�c;�|q�Fif (a < b) return -1; if (a > b) /* * Remove the socket from the tree before we overwrite its * internal socket id, because that forms part of the tree's * sorting criterion. We'll add it back before exiting this * function, whether we changed anything or not. */ del234(sktree, sock) ret: /* * No matter what happened, put the socket back in the tree. */ add234(sktree, sock); int fl; fl = fcntl(t, F_GETFL); if (fl != -1) fcntl(t, F_SETFL, fl | O_NONBLOCK); Node-path: putty-gtk2/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b21031d9488c5d03f8d9e3d0ed3d3baf Text-delta-base-sha1: 70a619219ae9a7c379c3abd4be3e65068e9b6149 Text-content-length: 2918 Text-content-md5: 7b99ed9bf31c7cf44720ab9ab0fa5851 Text-content-sha1: 0ef135b5af375543e28bf16f9dc93d4f030d055f Content-length: 2918 SVN��%s+,��y�]�h]T�]�]�]�i]o�eY���J�e�L>L�{��/{!�')6�I�Az>�,,� Y� z� ��q&�W,�e@static struct termios orig_termios; void fatalbox(char *p, ...) { struct termios cf; va_list ap; premsg(&cf)postmsg(&cfmodalfatalbox(char *p, ...) { struct termios cf; va_list ap; premsg(&cf)postmsg(&cfstruct termios cf; va_list ap; premsg(&cf)postmsg(&cfmdline_error(char *p, ...) { struct termios cf; va_list ap; premsg(&cf); fprintf(stderr, "plinkpostmsg(&cf); exit(1); } static int local_tty = FALSE; /* do we have a local tty? */STDIN_FILENOSTDIN_FILENOSTDIN_FILENO, TCSANOW, &orig_termios); } bufchain stdout_data, stderr_data; int try_output(int is_stderr) { bufchain *chain = (is_stderr ? &stderr_data : &stdout_data); int fd = (is_stderr ? STDERR_FILENO : STDOUT_FILENO); void *senddata; int sendlen, ret, fl; if (bufchain_size(chain) == 0) return bufchain_size(&stdout_data) + bufchain_size(&stderr_data); fl = fcntl(fd, F_GETFL); if (fl != -1 && !(fl & O_NONBLOCK)) fcntl(fd, F_SETFL, fl | O_NONBLOCK); do { bufchain_prefix(chain, &senddata, &sendlen); ret = write(fd, senddata, sendlen); if (ret > 0) bufchain_consume(chain, ret); } while (ret == sendlen && bufchain_size(chain) != 0); if (fl != -1 && !(fl & O_NONBLOCK)) fcntl(fd, F_SETFL, fl); if (ret < 0 && errno != EAGAIN return bufchain_size(&stdout_data) + bufchain_size(&stderr_data); } int from_backend(void *frontend_handle, int is_stderr, const char *data, int len) { if (is_stderr) { bufchain_add(&stderr_data, data, len); return try_output(TRUE); } else { bufchain_add(&stdout_data, data, len); return try_output(FALSE); } | FLAG_STDERR_TTY; stderr_tty_init()f (p) { const Backend *b = backend_from_name(p); if (b) { default_protocol = cfg.protocol = b->protocol; default_port = cfg.port = b->default_port;const Backend *b; *r = '\0'; b = backend_from_name(p); if (b) { default_protocol = cfg.protocol = b->protocol; portnumber = b->default_port; } p = r + 1;back = backend_from_proto(cfg.protocol); if (back == NULL) { fprintf(stderr, "Internal fault: Unsupported protocol found\n"); return 1;Unix Plink doesn't provide any way to add forwardings after the * connection is set up, so if there are none now, we can safely set * the "simple" flag. */ if (cfg.protocol == PROT_SSH && !cfg.x11_forward && !cfg.agentfwd && cfg.portfwd[0] == '\0' && cfg.portfwd[1] == '\0') cfg.ssh_simple = TRUE;STDIN_FILENOSTDIN_FILENOSTDOUT_FILENOSTDERR_FILENOSTDIN_FILENOSTDIN_FILENOSTDOUT_FILENO, &wset)) { back->unthrottle(backhandle, try_output(FALSE)); } if (FD_ISSET(STDERR_FILENO, &wset)) { back->unthrottle(backhandle, try_output(TRUE) Node-path: putty-gtk2/unix/uxpterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e19d0f56720d54fc0bb08150bd0d8253 Text-delta-base-sha1: 98d21308724bdaa45fd70e80e0aff1a8b532284f Text-content-length: 40 Text-content-md5: 72831b69597d5f7c7df9d7a848ea6262 Text-content-sha1: 9a0d963770053b5ee5f3c606751a42d732fa2be0 Content-length: 40 SVN��\o �3��)3, int *allow_launch Node-path: putty-gtk2/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b3d11958b93e14e6e8ce643d68455bd2 Text-delta-base-sha1: 446b9eafd2a4baa1edc9a9f6b40ad73456abdf8d Text-content-length: 243 Text-content-md5: 9ea78483f3c4d0a4050adbbb355173d8 Text-content-sha1: bdb35405037ab06621cfc84e4b10be9875e164e0 Content-length: 243 SVN��zSQ���5�|yfl; fl = fcntl(pty->master_fd, F_GETFL); if (fl != -1 && !(fl & O_NONBLOCK)) fcntl(pty->master_fd, F_SETFL, fl | O_NONBLOCK0, TIOCSCTTY, 1); #endif pgrp = getpid(); tcsetpgrp(0"pty", -1, 0 }; Node-path: putty-gtk2/unix/uxputty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c22149afced66581dc1edad4212de35 Text-delta-base-sha1: cf6d816c4449842eb22f815354d4ed4ecea1b0fe Text-content-length: 311 Text-content-md5: 1704eda317f344af0ca4f6b6991cec0c Text-content-sha1: a875bfb2cff0a756650fd29918d2c0285b414a0c Content-length: 311 SVN��4#� ��=�R�Zb)Backend *back = backend_from_proto(cfg->protocol);, int *allow_launchif (got_host) *allow_launch = TRUE;Backend *b = backend_from_proto(default_protocol); default_port = 0; /* illegal */ if (b) default_port = b->default_port; } return pt_main(argc, argv); } Node-path: putty-gtk2/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4462343eac364792fd9516ef523f596 Text-delta-base-sha1: 5a5ba12c6adf9052b440dbfeb9c1f4be0829326d Text-content-length: 52 Text-content-md5: 33ff012a3438a52be040726ee90fc6d5 Text-content-sha1: 646a20ac5ce086f88209f46b2bc9af132abc8458 Content-length: 52 SVN��Gf$�B�"serial", PROT_SERIAL, 0 }; Node-path: putty-gtk2/version.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1416c7c6543e825d008e61e7bcab1525 Text-delta-base-sha1: 1a3e5102e020d97ef6f44bc49a66b6c30b988219 Text-content-length: 130 Text-content-md5: fa1ba53ce29b03d0dd69edfe4bf0e839 Text-content-sha1: 954986bef1b25427f63636c18d8c4b0493ea9885 Content-length: 130 SVN��re l�L�l�-Eif defined SVN_REV char ver[] = "Custom build r" STR(SVN_REV); char sshver[] = "PuTTY-Custom-r" STR(SVN_REV Node-path: putty-gtk2/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 46bb969e47b1f313551616cf7f7c3020 Text-delta-base-sha1: 6ae552f11814f181f6e7d785360037016bfcdab7 Text-content-length: 29 Text-content-md5: 0048470d3a284beae6fdf1887bf28b37 Text-content-sha1: 1bbba2fc96472421c421ec04c8550ffe1d07f83b Content-length: 29 SVN�� �-��L.�{88 Node-path: putty-gtk2/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0e24be26ad3b36ce173442301510cf3b Text-delta-base-sha1: 6a32c2f0e0354a0a2122efc56868a6d413211137 Text-content-length: 1092 Text-content-md5: 88e545c609c6f5c19883a4c2b24b6eeb Text-content-sha1: 1a8359a84b6754e2a4d63e36776606cfc2372d67 Content-length: 1092 SVN��L �]��:YQ�Fd�3" Last tested with Inno Setup 5.0.860 VersionInfoTextVersion=Release 0.60 AppVersion=0.60 VersionInfoVersion=0.60puttyins [Messages] ; Since it's possible for the user to be asked to restart their computer, ; we should override the default messages to explain exactly why, so they ; can make an informed decision. (Especially as 95% of users won't need or ; want to restart; see rant above.) FinishedRestartLabel=One or more [name] programs are still running. Setup will not replace these program files until you restart your computer. Would you like to restart now? ; This message is popped up in a message box on a /SILENT install. FinishedRestartMessage=One or more [name] programs are still running.%nSetup will not replace these program files until you restart your computer.%n%nWould you like to restart now? ; ...and this comes up if you try to uninstall. UninstalledAndNeedsRestart=One or more %1 programs are still running.%nThe program files will not be removed until your computer is restarted.%n%nWould you like to restart now? Node-path: putty-gtk2/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c2feabf7e7a51dc9ed38710155ecf7cc Text-delta-base-sha1: a9b5297e1557bd7590d72e579d24e4fadf66b979 Text-content-length: 29 Text-content-md5: baa5ff7a284afa724d55ca9efdb362f3 Text-content-sha1: 1af4b0837f3284c18c4272d989eec694c906765a Content-length: 29 SVN��CC�d��Le�288 Node-path: putty-gtk2/windows/puttyins.ico Node-kind: file Node-action: add Node-copyfrom-rev: 7913 Node-copyfrom-path: putty/windows/puttyins.ico Text-copy-source-md5: af0c3b18a9d93dd45fc0bdab2fce6d11 Text-copy-source-sha1: 6597cec3f3179b3b59e2341738f566596aca626f Node-path: putty-gtk2/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0fef52ecc4ed7e18a52f5e786f4e4860 Text-delta-base-sha1: 1a7bc84d5eadf59e095021f5946d3a6c71ecb985 Text-content-length: 451 Text-content-md5: 33d8fd5758478ae860af352d9b3d6712 Text-content-sha1: 6e7f962b21e9a3d734e569c8ff291e6a7ec55765 Content-length: 451 SVN��zR�[��]�  �L8�u60ndef SVN_REVifdef MODIFIED #define BINARY_VERSION 0,0,0,0 #else #define BINARY_VERSION BASE_VERSION,SVN_REV,0 #endif #elif defined RELEASE #define VERSION_TEXT "Release " STR(RELEASE) #define BINARY_VERSION BASE_VERSION,0,0 #elif defined SVN_REV #define VERSION_TEXT "Custom build r" STR(SVN_REV) #ifdef MODIFIED #define BINARY_VERSION 0,0,0,0 #else #define BINARY_VERSION BASE_VERSION,SVN_REV,0 #endif8 Node-path: putty-gtk2/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c57b54051ea5f025dd90553efc9a6cc4 Text-delta-base-sha1: 919636c1cd31dd4a807788b0ecbd4bf7573ff7d6 Text-content-length: 29 Text-content-md5: 1b0b4b8219d3ba8acb0862ba492a3eb7 Text-content-sha1: d9aede5950aabdf673b02e05bdc5d116d6080ae9 Content-length: 29 SVN��tt�k��Cl�D088 Node-path: putty-gtk2/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 750bd04ff7c89d6b6273983c151428bd Text-delta-base-sha1: 94daac70061fbe523bf66b87be971225a7fcde80 Text-content-length: 252 Text-content-md5: e632554f7e47fb0ef51b72e3d6a12a61 Text-content-sha1: e2e3319d349c4c6a446411c7b3fe199041415e7e Content-length: 252 SVN��g#`��`�?(); if (c->ctrl->listbox.multisel) { assert(c->ctrl->listbox.height != 0); /* not combo box */ ret = SendDlgItemMessage(dp->hwnd, c->base_id+1, LB_GETSELCOUNT, 0, 0); if (ret == LB_ERR || ret > 1) return -1; } Node-path: putty-gtk2/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5a9d5bf9d6b3ee77187aa7ee08b2cf2f Text-delta-base-sha1: de1b9cb71b9e0f8baa0f8126d99ae33f86789a25 Text-content-length: 945 Text-content-md5: a913cbd27281778834870484cc4d3e25 Text-content-sha1: 1416951eeb6dfdff222b3beb17126fb47806add0 Content-length: 945 SVN����Gf�%��+9c�^b�eB� |�wc�g�o�z �^"�/.backend_from_proto(cfg.protocol); /* By default, we bring up the config dialog, rather than launching * a session. This gets set to TRUE if something happens to change * that (e.g., a hostname is specified on the command-line). */ int allow_launch = FALSEBackend *b = backend_from_proto(default_protocol); default_port = 0; /* illegal */ if (b) default_port = b->default_port; allow_launch = TRUE; /* allow it to be launched directly */ allow_launch = TRUE;loaded_session || got_host) allow_launch = TRUE; if ((!allow_launch || !cfg_launchable(&cfg) else , zero to drop the message, * -1 to forward the message to Windows, or another negative number * to indicate a NUL-terminated "special" string. */�7o _�0��`Wurn -1; } if (left_alt && wParam if (back) back->special(backhandle, TS_BRK); return 0 Node-path: putty-gtk2/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49b9167450e46ccb6802de3ddb5e8724 Text-delta-base-sha1: 52169d5fd5189b4beb8468a9c7f01cef1e34a0d3 Text-content-length: 1332 Text-content-md5: f771bb4f71270413bff5d46ef180f82c Text-content-sha1: b991b3a5d59f5b48f7cf82a192311d636196699e Content-length: 1332 SVN��s"Ec�>��(A�`d7�O</�z�X�X6��o�L�kerrret,readret = ReadFile(ctx->h, ctx->buffer,readlen, &ctx->len, povl); if (!readret) ctx->readerr = GetLastError(); else ctx->readerr = 0; if (povl && !readret && ctx->readerrreadret = GetOverlappedResult(ctx->h, povl, &ctx->len, FALSE); if (!readret) ctx->readerr = GetLastError(); else ctx->readerr = 0; } if (!readret) { /* * Windows apparently sends ERROR_BROKEN_PIPE when a * pipe we're reading from is closed normally from the * writing end. This is ludicrous; if that situation * isn't a natural EOF, _nothing_ is. So if we get that * particular error, we pretend it's EOF. */ if (ctx->readerr == ERROR_BROKEN_PIPE) ctx->readerr = 0; ctx->len = 0; } if (err int writeretwriteret = WriteFile(ctx->h, ctx->buffer, ctx->len, &ctx->lenwritten, povl); if (!writeret) ctx->writeerr = GetLastError(); else ctx->writeerr = 0; if (povl && !writeret && GetLastError() == ERROR_IO_PENDING) { writeret = GetOverlappedResult(ctx->h, povl, &ctx->lenwritten, TRUE); if (!writeret) ctx->writeerr = GetLastError(); else ctx->writeerr = 0; } SetEvent(ctx->ev_to_main); if (!-h->u.i.readerrh->u.o.writeerrh->u.o.writeerr Node-path: putty-gtk2/windows/winhelp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 41eede11c3c9314eb1f0befdd548808e Text-delta-base-sha1: 4ef3825d282de30ed38eb1392a67e00f48fe9f67 Text-content-length: 257 Text-content-md5: e896e00c2343ed38167acbaa5694b2de Text-content-sha1: 2ac05a30fd6523aab9ac608956ddfb94a7d4887c Content-length: 257 SVN�� 2d���$!d�(a!htmlhelp) chm_path = NULL; } #endif /* NO_HTMLHELP */ } void shutdown_help(void) { /* Nothing to do currently. * (If we were running HTML Help single-threaded, this is where we'd * call HH_UNINITIALIZE.) Node-path: putty-gtk2/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9ddff474265593cdef1b5db77593ffa4 Text-delta-base-sha1: 61275659ee3896bb7c7e31fa59ff0956c26656e6 Text-content-length: 120 Text-content-md5: a0bfb7976729460f1bfcee1f5406c4c5 Text-content-sha1: 19fed566d8690f190377b9a802fe24bca8b501bb Content-length: 120 SVN��Yl]�Y��u:�Acrhaslf "terminal.crhaslf:config-lfcrsh_bugs_maxpkt2 "ssh.bugs.maxpkt2:config-ssh-bug-maxpkt2 Node-path: putty-gtk2/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c3abeca9cca2f102eb7444a902f49ce Text-delta-base-sha1: 0630c4bfa37927255f29e61831ea49f596b8a465 Text-content-length: 486 Text-content-md5: 57cbe10df5bb6d6c4a68ca4d06911b3e Text-content-sha1: 90d139edf139307a3add2d3ba3bfeb7982f8b15b Content-length: 486 SVN��D;�Z��H�U~�if (a < b) return -1; if (a > b/* * Remove the socket from the tree before we overwrite its * internal socket id, because that forms part of the tree's * sorting criterion. We'll add it back before exiting this * function, whether we changed anything or not. */ del234(sktree, sock);err = 0; ret: /* * No matter what happened, put the socket back in the tree. */ add234(sktree, sock); Node-path: putty-gtk2/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 447839cf0857255ead2ec7127fe2c50c Text-delta-base-sha1: 0e9ec62f96e7c63208e2dfebe24b629b7085a650 Text-content-length: 1104 Text-content-md5: e629f4a8f4a7723c91fdf759a1fd20a1 Text-content-sha1: 7d55415e2430b6f35f1066ba28f2dd0db375e7e6 Content-length: 1104 SVN��9,�y�� /7�R�S6�C� zchar buf[4096]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, -len, 0, buf, lenof(buf), NULL); buf[lenof(buf)-1] = '\0'; if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0'; fprintf(stderr, "Unable to read from standard input: %s\n", bufchar buf[4096]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, -new_backlog, 0, buf, lenof(buf), NULL); buf[lenof(buf)-1] = '\0'; if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0'; fprintf(stderr, "Unable to write to standard %s: %s\n", (h == stdout_handle ? "output" : "error"), bufconst Backend *b = backend_from_name(p); if (b) { default_protocol = cfg.protocol = b->protocol; default_port = cfg.port = b->default_port;const Backend *b; *r = '\0'; b = backend_from_name(p); if (b) { default_protocol = cfg.protocol = b->protocol; portnumber = b->default_port; } p = r + 1;back = backend_from_proto(cfg.protocol); if (back == NULL) { fprintf(stderr, "Internal fault: Unsupported protocol found\n"); return 1; Node-path: putty-gtk2/windows/winprint.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f868f84898b4ac8fb9ddb1efc92976eb Text-delta-base-sha1: 0bfecca58d05227cf4cf9fcc8826167b0872bbe0 Text-content-length: 40 Text-content-md5: d2c663e745c35b39be7a47568d6d3744 Text-content-sha1: 271ab3b98277b411a74109f5c86e66e7a730ecd0 Content-length: 40 SVN�� �$��U/ = 0, nprinters = 0 Node-path: putty-gtk2/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0179ba9211771513327d6b27e872ecda Text-delta-base-sha1: c2325cc6d64be4e75843de9bc8dc60a29d16ef1c Text-content-length: 1461 Text-content-md5: 0900423a410f648429fb4afe0e807d81 Text-content-sha1: a73583522a80667f0f67cbe2939777c7660a77b6 Content-length: 1461 SVN��6 �m�x�-f{ /* * Munge the string supplied by the user into a Windows filename. * * Windows supports opening a few "legacy" devices (including * COM1-9) by specifying their names verbatim as a filename to * open. (Thus, no files can ever have these names. See * <http://msdn2.microsoft.com/en-us/library/aa365247.aspx> * ("Naming a File") for the complete list of reserved names.) * * However, this doesn't let you get at devices COM10 and above. * For that, you need to specify a filename like "\\.\COM10". * This is also necessary for special serial and serial-like * devices such as \\.\WCEUSBSH001. It also works for the "legacy" * names, so you can do \\.\COM1 (verified as far back as Win95). * See <http://msdn2.microsoft.com/en-us/library/aa363858.aspx> * (CreateFile() docs). * * So, we believe that prepending "\\.\" should always be the * Right Thing. However, just in case someone finds something to * talk to that doesn't exist under there, if the serial line * contains a backslash, we use it verbatim. (This also lets * existing configurations using \\.\ continue working.) */ char *serfilename = dupprintf("%s%s", strchr(cfg->serline, '\\') ? "" : "\\\\.\\", cfg->serline); serport = CreateFile(serfilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); sfree(serfilename); } "serial", PROT_SERIAL, 0 }; Node-path: putty-gtk2/windows/installer.ico Node-action: delete Revision-number: 7915 Prop-content-length: 201 Content-length: 201 K 7 svn:log V 100 Josef Hinteregger reports that Windows uses UTF-16 surrogates, which our front end doesn't support. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-03-11T09:53:28.820144Z PROPS-END Node-path: putty-wishlist/data/windows-utf16 Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2144 Text-content-md5: 36e616cb9ce28bb43c9b2f326e9c0a1c Text-content-sha1: 70abebe64d55bd247431da8a2f59f71fd6f8b2e8 Content-length: 2154 PROPS-END SVN���RRRSummary: Support UTF-16 on Windows Class: wish Difficulty: tricky Priority: low Content-type: text/x-html-body <p> Josef Hinteregger reports that the <code>CF_UNICODETEXT</code> data stored by Windows in the clipboard is encoded in UTF-16; that is, it can contain surrogate pairs representing characters outside the BMP. PuTTY does not currently interpret those pairs. Of course, if it did, it would also have to be able to write them out again when copying to the clipboard itself or talking to the Windows GDI text display primitives, etc. <p> I can see two sensible ways to solve this. One is to do translation to and from UTF-16 on the platform side of the front end interface, if necessary for a given platform. So: <ul> <li> Stop using platform-sized <code>wchar_t</code> anywhere in the front end interface: change the prototypes of <code>get_clip()</code>, <code>write_clip()</code>, <code>luni_send()</code> and <code>do_text()</code> (and any others I've missed) so that they use arrays of <code>unsigned int</code> (containing UTF-32) rather than <code>wchar_t</code>. <li> In the implementations of all those functions on the Windows front end, implement the appropriate translation between UTF-32 and UTF-16. <li> Any other platform front ends which use UTF-16 will need to be similarly modified. </ul> <p> The other option is to do the UTF-32/UTF-16 translation on the cross-platform side (<code>terminal.c</code> and <code>ldisc.c</code>), and have it enabled or disabled by a <code>#define</code> in each platform header file. (The <code>#define</code> is certainly necessary: partly because we shouldn't accept UTF-16 surrogate pairs coming from front ends which are supposed to be speaking UTF-32, on the usual grounds of not accepting redundant encodings, but mostly because <code>terminal.c</code> will obviously need to know whether to <em>send</em> surrogate pairs when sending Unicode data back to the front end!) <p> I'm currently inclined to the first option, because UTF-16 is nasty and I'd rather it complicated only those front ends that had to deal with it than that it complicated the core code. Revision-number: 7916 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-12T00:34:41.830664Z PROPS-END Revision-number: 7917 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-12T00:34:41.834023Z PROPS-END Revision-number: 7918 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-13T00:34:39.261320Z PROPS-END Revision-number: 7919 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-13T00:34:39.306831Z PROPS-END Revision-number: 7920 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-13T00:34:39.331491Z PROPS-END Revision-number: 7921 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-13T00:34:39.448770Z PROPS-END Revision-number: 7922 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-13T00:34:39.452103Z PROPS-END Revision-number: 7923 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-13T00:34:39.552306Z PROPS-END Revision-number: 7924 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-13T00:34:39.597462Z PROPS-END Revision-number: 7925 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-13T00:34:39.601184Z PROPS-END Revision-number: 7926 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-13T00:34:39.725076Z PROPS-END Revision-number: 7927 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-13T00:34:39.763824Z PROPS-END Revision-number: 7928 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-17T00:34:52.751221Z PROPS-END Revision-number: 7929 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-20T00:34:55.901515Z PROPS-END Revision-number: 7930 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2008-03-19T22:30:47.899103Z K 7 svn:log V 104 The front page calls the latest version "beta 0.60", so we probably ought to call it that here as well. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ecac8b78cb0ded5336e615164abe09a7 Text-delta-base-sha1: 012e835a48286a3936a19c57a77da370f91cfa8f Text-content-length: 28 Text-content-md5: 9cba9036bbe70a8dda85e2960fdd99cd Text-content-sha1: 112c1867b20bf2fb44396a0426c854865db90323 Content-length: 28 SVN��lq �'��E'beta Revision-number: 7931 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-20T00:34:56.186523Z PROPS-END Revision-number: 7932 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-21T00:35:03.963730Z PROPS-END Revision-number: 7933 Prop-content-length: 1428 Content-length: 1428 K 8 svn:date V 27 2008-03-22T11:40:23.423377Z K 7 svn:log V 1326 Refactor the font handling code: I've moved all the code that explicitly deals with GdkFont out into a new module, behind a polymorphic interface (done by ad-hoc explicit vtable management in C). This should allow me to drop in a Pango font handling module in parallel with the existing one, meaning that GTK2 PuTTY will be able to seamlessly switch between X11 server-side fonts and Pango client- side ones as the user chooses, or even use a mixture of the two (e.g. an X11 font for narrow characters and a Pango one for wide characters, or vice versa). In the process, incidentally, I got to the bottom of the `weird bug' mentioned in the old do_text_internal(). It's not a bug in gdk_draw_text_wc() as I had thought: it's simply that GdkWChar is a 32-bit type rather than a 16-bit one, so no wonder you have to specify twice the length to find all the characters in the string! However, there _is_ a bug in GTK2's gdk_draw_text_wc(), which causes it to strip off everything above the low byte of each GdkWChar, sigh. Solution to both problems is to use an array of the underlying Xlib type XChar2b instead, and pass it to gdk_draw_text() cast to gchar *. Grotty, but it works. (And it'll become significantly less grotty if and when we have to stop using the GDK font handling wrappers in favour of going direct to Xlib.) K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: efc8090fec90b8bc70eb2232e84c7f61 Text-delta-base-sha1: daded408733f8c64363a53548f4ad1c483634a32 Text-content-length: 25 Text-content-md5: 9a556a673cce4875bd56a7cdff554081 Text-content-sha1: 9aaef7812b4d00299ea03ab5b506faccd2b6c6b0 Content-length: 25 SVN��2: �g��Ocfont Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 12219 Text-content-md5: 0599d7b2d1af68c590152c6bd26ba1c7 Text-content-sha1: 1809753eea4cb5e4a68e52538531c20ae9a51a0a Content-length: 12229 PROPS-END SVN���---/* * Unified font management for GTK. * * PuTTY is willing to use both old-style X server-side bitmap * fonts _and_ GTK2/Pango client-side fonts. This requires us to * do a bit of work to wrap the two wildly different APIs into * forms the rest of the code can switch between seamlessly, and * also requires a custom font selector capable of handling both * types of font. */ #include <assert.h> #include <stdlib.h> #include <string.h> #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> #include <gdk/gdkx.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> #include "putty.h" #include "gtkfont.h" /* * To do: * * - import flags to do VT100 double-width, and import the icky * pixmap stretch code for it. * * - add the Pango back end! */ /* * Future work: * * - all the GDK font functions used in the x11font subclass are * deprecated, so one day they may go away. When this happens - * or before, if I'm feeling proactive - it oughtn't to be too * difficult in principle to convert the whole thing to use * actual Xlib font calls. */ /* * Ad-hoc vtable mechanism to allow font structures to be * polymorphic. * * Any instance of `unifont' used in the vtable functions will * actually be the first element of a larger structure containing * data specific to the subtype. This is permitted by the ISO C * provision that one may safely cast between a pointer to a * structure and a pointer to its first element. */ struct unifont_vtable { /* * `Methods' of the `class'. */ unifont *(*create)(char *name, int wide, int bold, int shadowoffset, int shadowalways); void (*destroy)(unifont *font); void (*draw_text)(GdkDrawable *target, GdkGC *gc, unifont *font, int x, int y, const char *string, int len, int wide, int bold); /* * `Static data members' of the `class'. */ const char *prefix; }; /* ---------------------------------------------------------------------- * GDK-based X11 font implementation. */ static void x11font_draw_text(GdkDrawable *target, GdkGC *gc, unifont *font, int x, int y, const char *string, int len, int wide, int bold); static unifont *x11font_create(char *name, int wide, int bold, int shadowoffset, int shadowalways); static void x11font_destroy(unifont *font); struct x11font { struct unifont u; /* * Actual font objects. We store a number of these, for * automatically guessed bold and wide variants. * * The parallel array `allocated' indicates whether we've * tried to fetch a subfont already (thus distinguishing NULL * because we haven't tried yet from NULL because we tried and * failed, so that we don't keep trying and failing * subsequently). */ GdkFont *fonts[4]; int allocated[4]; /* * `sixteen_bit' is true iff the font object is indexed by * values larger than a byte. That is, this flag tells us * whether we use gdk_draw_text_wc() or gdk_draw_text(). */ int sixteen_bit; /* * Font charsets. public_charset and real_charset can differ * for X11 fonts, because many X fonts use CS_ISO8859_1_X11. */ int public_charset, real_charset; /* * Data passed in to unifont_create(). */ int wide, bold, shadowoffset, shadowalways; }; static const struct unifont_vtable x11font_vtable = { x11font_create, x11font_destroy, x11font_draw_text, "x11" }; char *x11_guess_derived_font_name(GdkFont *font, int bold, int wide) { XFontStruct *xfs = GDK_FONT_XFONT(font); Display *disp = GDK_FONT_XDISPLAY(font); Atom fontprop = XInternAtom(disp, "FONT", False); unsigned long ret; if (XGetFontProperty(xfs, fontprop, &ret)) { char *name = XGetAtomName(disp, (Atom)ret); if (name && name[0] == '-') { char *strings[13]; char *dupname, *extrafree = NULL, *ret; char *p, *q; int nstr; p = q = dupname = dupstr(name); /* skip initial minus */ nstr = 0; while (*p && nstr < lenof(strings)) { if (*p == '-') { *p = '\0'; strings[nstr++] = p+1; } p++; } if (nstr < lenof(strings)) return NULL; /* XLFD was malformed */ if (bold) strings[2] = "bold"; if (wide) { /* 4 is `wideness', which obviously may have changed. */ /* 5 is additional style, which may be e.g. `ja' or `ko'. */ strings[4] = strings[5] = "*"; strings[11] = extrafree = dupprintf("%d", 2*atoi(strings[11])); } ret = dupcat("-", strings[ 0], "-", strings[ 1], "-", strings[ 2], "-", strings[ 3], "-", strings[ 4], "-", strings[ 5], "-", strings[ 6], "-", strings[ 7], "-", strings[ 8], "-", strings[ 9], "-", strings[10], "-", strings[11], "-", strings[12], NULL); sfree(extrafree); sfree(dupname); return ret; } } return NULL; } static int x11_font_width(GdkFont *font, int sixteen_bit) { if (sixteen_bit) { XChar2b space; space.byte1 = 0; space.byte2 = ' '; return gdk_text_width(font, (const gchar *)&space, 2); } else { return gdk_char_width(font, ' '); } } static unifont *x11font_create(char *name, int wide, int bold, int shadowoffset, int shadowalways) { struct x11font *xfont; GdkFont *font; XFontStruct *xfs; Display *disp; Atom charset_registry, charset_encoding; unsigned long registry_ret, encoding_ret; int pubcs, realcs, sixteen_bit; int i; font = gdk_font_load(name); if (!font) return NULL; xfs = GDK_FONT_XFONT(font); disp = GDK_FONT_XDISPLAY(font); charset_registry = XInternAtom(disp, "CHARSET_REGISTRY", False); charset_encoding = XInternAtom(disp, "CHARSET_ENCODING", False); pubcs = realcs = CS_NONE; sixteen_bit = FALSE; if (XGetFontProperty(xfs, charset_registry, ®istry_ret) && XGetFontProperty(xfs, charset_encoding, &encoding_ret)) { char *reg, *enc; reg = XGetAtomName(disp, (Atom)registry_ret); enc = XGetAtomName(disp, (Atom)encoding_ret); if (reg && enc) { char *encoding = dupcat(reg, "-", enc, NULL); pubcs = realcs = charset_from_xenc(encoding); /* * iso10646-1 is the only wide font encoding we * support. In this case, we expect clients to give us * UTF-8, which this module must internally convert * into 16-bit Unicode. */ if (!strcasecmp(encoding, "iso10646-1")) { sixteen_bit = TRUE; pubcs = realcs = CS_UTF8; } /* * Hack for X line-drawing characters: if the primary * font is encoded as ISO-8859-1, and has valid glyphs * in the first 32 char positions, it is assumed that * those glyphs are the VT100 line-drawing character * set. * * Actually, we'll hack even harder by only checking * position 0x19 (vertical line, VT100 linedrawing * `x'). Then we can check it easily by seeing if the * ascent and descent differ. */ if (pubcs == CS_ISO8859_1) { int lb, rb, wid, asc, desc; gchar text[2]; text[1] = '\0'; text[0] = '\x12'; gdk_string_extents(font, text, &lb, &rb, &wid, &asc, &desc); if (asc != desc) realcs = CS_ISO8859_1_X11; } sfree(encoding); } } xfont = snew(struct x11font); xfont->u.vt = &x11font_vtable; xfont->u.width = x11_font_width(font, sixteen_bit); xfont->u.ascent = font->ascent; xfont->u.descent = font->descent; xfont->u.height = xfont->u.ascent + xfont->u.descent; xfont->u.public_charset = pubcs; xfont->u.real_charset = realcs; xfont->fonts[0] = font; xfont->allocated[0] = TRUE; xfont->sixteen_bit = sixteen_bit; xfont->wide = wide; xfont->bold = bold; xfont->shadowoffset = shadowoffset; xfont->shadowalways = shadowalways; for (i = 1; i < lenof(xfont->fonts); i++) { xfont->fonts[i] = NULL; xfont->allocated[i] = FALSE; } return (unifont *)xfont; } static void x11font_destroy(unifont *font) { struct x11font *xfont = (struct x11font *)font; int i; for (i = 0; i < lenof(xfont->fonts); i++) if (xfont->fonts[i]) gdk_font_unref(xfont->fonts[i]); sfree(font); } static void x11_alloc_subfont(struct x11font *xfont, int sfid) { char *derived_name = x11_guess_derived_font_name (xfont->fonts[0], sfid & 1, !!(sfid & 2)); xfont->fonts[sfid] = gdk_font_load(derived_name); /* may be NULL */ xfont->allocated[sfid] = TRUE; sfree(derived_name); } static void x11font_draw_text(GdkDrawable *target, GdkGC *gc, unifont *font, int x, int y, const char *string, int len, int wide, int bold) { struct x11font *xfont = (struct x11font *)font; int sfid; int shadowbold = FALSE; wide -= xfont->wide; bold -= xfont->bold; /* * Decide which subfont we're using, and whether we have to * use shadow bold. */ if (xfont->shadowalways && bold) { shadowbold = TRUE; bold = 0; } sfid = 2 * wide + bold; if (!xfont->allocated[sfid]) x11_alloc_subfont(xfont, sfid); if (bold && !xfont->fonts[sfid]) { bold = 0; shadowbold = TRUE; sfid = 2 * wide + bold; if (!xfont->allocated[sfid]) x11_alloc_subfont(xfont, sfid); } if (!xfont->fonts[sfid]) return; /* we've tried our best, but no luck */ if (xfont->sixteen_bit) { /* * This X font has 16-bit character indices, which means * we expect our string to have been passed in UTF-8. */ XChar2b *xcs; wchar_t *wcs; int nchars, maxchars, i; /* * Convert the input string to wide-character Unicode. */ maxchars = 0; for (i = 0; i < len; i++) if ((unsigned char)string[i] <= 0x7F || (unsigned char)string[i] >= 0xC0) maxchars++; wcs = snewn(maxchars+1, wchar_t); nchars = charset_to_unicode((char **)&string, &len, wcs, maxchars, CS_UTF8, NULL, NULL, 0); assert(nchars <= maxchars); wcs[nchars] = L'\0'; xcs = snewn(nchars, XChar2b); for (i = 0; i < nchars; i++) { xcs[i].byte1 = wcs[i] >> 8; xcs[i].byte2 = wcs[i]; } gdk_draw_text(target, xfont->fonts[sfid], gc, x, y, (gchar *)xcs, nchars*2); if (shadowbold) gdk_draw_text(target, xfont->fonts[sfid], gc, x + xfont->shadowoffset, y, (gchar *)xcs, nchars*2); sfree(xcs); sfree(wcs); } else { gdk_draw_text(target, xfont->fonts[sfid], gc, x, y, string, len); if (shadowbold) gdk_draw_text(target, xfont->fonts[sfid], gc, x + xfont->shadowoffset, y, string, len); } } /* ---------------------------------------------------------------------- * Outermost functions which do the vtable dispatch. */ /* * This function is the only one which needs to know the full set * of font implementations available, because it has to try each * in turn until one works, or condition on an override prefix in * the font name. */ static const struct unifont_vtable *unifont_types[] = { &x11font_vtable, }; unifont *unifont_create(char *name, int wide, int bold, int shadowoffset, int shadowalways) { int colonpos = strcspn(name, ":"); int i; if (name[colonpos]) { /* * There's a colon prefix on the font name. Use it to work * out which subclass to try to create. */ for (i = 0; i < lenof(unifont_types); i++) { if (strlen(unifont_types[i]->prefix) == colonpos && !strncmp(unifont_types[i]->prefix, name, colonpos)) break; } if (i == lenof(unifont_types)) return NULL; /* prefix not recognised */ return unifont_types[i]->create(name+colonpos+1, wide, bold, shadowoffset, shadowalways); } else { /* * No colon prefix, so just go through all the subclasses. */ for (i = 0; i < lenof(unifont_types); i++) { unifont *ret = unifont_types[i]->create(name, wide, bold, shadowoffset, shadowalways); if (ret) return ret; } return NULL; /* font not found in any scheme */ } } void unifont_destroy(unifont *font) { font->vt->destroy(font); } void unifont_draw_text(GdkDrawable *target, GdkGC *gc, unifont *font, int x, int y, const char *string, int len, int wide, int bold) { font->vt->draw_text(target, gc, font, x, y, string, len, wide, bold); } Node-path: putty-gtk2/unix/gtkfont.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1353 Text-content-md5: d8bac1104de67eaaf08b23d68d7bb96e Text-content-sha1: 2e2b5582bd4073ed41955d2a6db06d071ecc5bb0 Content-length: 1363 PROPS-END SVN���;;;/* * Header file for gtkfont.c. Has to be separate from unix.h * because it depends on GTK data types, hence can't be included * from cross-platform code (which doesn't go near GTK). */ #ifndef PUTTY_GTKFONT_H #define PUTTY_GTKFONT_H /* * Exports from gtkfont.c. */ struct unifont_vtable; /* contents internal to gtkfont.c */ typedef struct unifont { const struct unifont_vtable *vt; /* * `Non-static data members' of the `class', accessible to * external code. */ /* * public_charset is the charset used when the user asks for * `Use font encoding'. * * real_charset is the charset used when translating text into * a form suitable for sending to unifont_draw_text(). * * They can differ. For example, public_charset might be * CS_ISO8859_1 while real_charset is CS_ISO8859_1_X11. */ int public_charset, real_charset; /* * Font dimensions needed by clients. */ int width, height, ascent, descent; } unifont; unifont *unifont_create(char *name, int wide, int bold, int shadowoffset, int shadowalways); void unifont_destroy(unifont *font); void unifont_draw_text(GdkDrawable *target, GdkGC *gc, unifont *font, int x, int y, const char *string, int len, int wide, int bold); #endif /* PUTTY_GTKFONT_H */ Node-path: putty-gtk2/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b9098e8c541efe4ebb8e7a60cfdeeb9 Text-delta-base-sha1: 1ff068649a11c1353c417d93d5c0032ae9d79103 Text-content-length: 9036 Text-content-md5: 2ef7001b06a1013ef4ddd0a3bf3bca5d Text-content-sha1: 99fda22d4b56418b504c3eb2b602d66edef489dc Content-length: 9036 SVN���wa]�b��^�F{�}�Yz�!S �99i�~�~*�M:�h}�|ac�E;F#include "gtkfontunif * FIXME: but is that also true of Pango?, boldbold = 1; fontid |= 1; } else { bold = 0; } if (!inst->fonts[fontid]) { int i; /* * Fall back through font ids with subsets of this one's * set bits, in order. */ for (i = fontid; i-- > 0 ;) { if (i & ~fontid) continue; /* some other bit is set */ if (inst->fonts[i]) { fontid = i; break; } } assert(inst->fonts[fontid]); /* we should at least have hit zero */gchar *gcs; /* * FIXME: this length is hardwired on the assumption that * conversions from wide to multibyte characters will * never generate more than 10 bytes for a single wide * character. */ gcs = snewn(len*10+1, gchar); for (combining = 0; combining < ncombining; combining++) { int mblen = wc_to_mb(inst->fonts[fontid]->real_charset, 0, text + combining, len, gcs, len*10+1, ".", NULL, NULL); unifont_draw_text(inst->pixmap, gc, inst->fonts[fontid]mblen, widefactor > 1, bold); } sfree(gvoid setup_fonts_ucs(struct gui_data *inst) { if (inst->fonts[0]) unifont_destroy(inst->fonts[0]); if (inst->fonts[1]) unifont_destroy(inst->fonts[1]); if (inst->fonts[2]) unifont_destroy(inst->fonts[2]); if (inst->fonts[3]) unifont_destroy(inst->fonts[3]); inst->fonts[0] = unifont_create(inst->cfg.font.name, FALSE, FALSE, inst->cfg.shadowboldoffset, inst->cfg.shadowbold if (inst->cfg.shadowbold || !inst->cfg.boldfont.name[0]) { inst->fonts[1] = NULL; } else { inst->fonts[1] = unifont_create(inst->cfg.boldfont.name, FALSE, TRUE, inst->cfg.shadowboldoffset, inst->cfg.shadowbold); if (!inst->fonts[1] } if (inst->cfg.widefont.name[0]) { inst->fonts[2] = unifont_create(inst->cfg.widefont.name, TRUE, FALSE, inst->cfg.shadowboldoffset, inst->cfg.shadowbold); if (!inst->fonts[2]) { fprintf(stderr, "%s: unable to load wide font \"%s\"\n", appname, inst->cfg.widefont.name); exit(1); } } else { inst->fonts[2] = NULL; } if (inst->cfg.shadowbold || !inst->cfg.wideboldfont.name[0]) { inst->fonts[3] = NULL; } else { inst->fonts[3] = unifont_create(inst->cfg.wideboldfont.name, TRUE, TRUE, inst->cfg.shadowboldoffset, inst->cfg.shadowbold); if (!inst->fonts[3]) { fprintf(stderr, "%s: unable to load wide bold font \"%s\"\n", appname, inst->cfg.boldfont.name); exit(1); } } inst->font_width = inst->fonts[0]->width; inst->font_height = inst->fonts[0]->height; inst->direct_to_font = init_ucs(&inst->ucsdata, inst->cfg.line_codepage, inst->cfg.utf8_override, inst->fonts[0]->public gtk_box_pack_start(inst->hbox, inst->sbar, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(inst->window), GTK_WIDGET(inst->hbox)); set_geom_hints(inst); gtk_widget_show(inst->area); if (inst->cfg.scrollbar) gtk_widget_show(inst->sbar); else gtk_widget_hide(inst->sbar); gtk_widget_show(GTK_WIDGET(inst->hbox)); if (inst->gotpos) { int x = inst->xpos, y = inst->ypos; GtkRequisition req; gtk_widget_size_request(GTK_WIDGET(inst->window), &req); if (inst->gravity & 1) x += gdk_screen_width() - req.width; if (inst->gravity & 2) y += gdk_screen_height() - req.height; gtk_window_set_position(GTK_WINDOW(inst->window), GTK_WIN_POS_NONE); gtk_widget_set_uposition(GTK_WIDGET(inst->window), x, y); } gtk_signal_connect(GTK_OBJECT(inst->window), "destroy", GTK_SIGNAL_FUNC(destroy), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "delete_event", GTK_SIGNAL_FUNC(delete_window), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "key_press_event", GTK_SIGNAL_FUNC(key_event), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "key_release_event", GTK_SIGNAL_FUNC(key_event), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "focus_in_event", GTK_SIGNAL_FUNC(focus_event), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "focus_out_event", GTK_SIGNAL_FUNC(focus_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "configure_event", GTK_SIGNAL_FUNC(configure_area), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "expose_event", GTK_SIGNAL_FUNC(expose_area), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "button_press_event", GTK_SIGNAL_FUNC(button_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "button_release_event", GTK_SIGNAL_FUNC(button_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "motion_notify_event", GTK_SIGNAL_FUNC(motion_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_received", GTK_SIGNAL_FUNC(selection_received), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_get", GTK_SIGNAL_FUNC(selection_get), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_clear_event", GTK_SIGNAL_FUNC(selection_clear), inst); if (inst->cfg.scrollbar) gtk_signal_connect(GTK_OBJECT(inst->sbar_adjust), "value_changed", GTK_SIGNAL_FUNC(scrollbar_moved), inst); gtk_widget_add_events(GTK_WIDGET(inst->area), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK); { extern const char *const *const main_icon[]; extern const int n_main_icon; set_window_icon(inst->window, main_icon, n_main_icon); } gtk_widget_show(inst->window); set_window_background(inst); /* * Set up the Ctrl+rightclick context menu. */ { GtkWidget *menuitem; char *s; extern const int use_event_log, new_session, saved_sessions; inst->menu = gtk_menu_new(); #define MKMENUITEM(title, func) do { \ menuitem = title ? gtk_menu_item_new_with_label(title) : \ gtk_menu_item_new(); \ gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \ gtk_widget_show(menuitem); \ if (func != NULL) \ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \ GTK_SIGNAL_FUNC(func), inst); \ } while (0) if (new_session) MKMENUITEM("New Session", new_session_menuitem); MKMENUITEM("Restart Session", restart_session_menuitem); inst->restartitem = menuitem; gtk_widget_hide(inst->restartitem); MKMENUITEM("Duplicate Session", dup_session_menuitem); if (saved_sessions) { inst->sessionsmenu = gtk_menu_new(); /* sessionsmenu will be updated when it's invoked */ /* XXX is this the right way to do dynamic menus in Gtk? */ MKMENUITEM("Saved Sessions", update_savedsess_menu); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->sessionsmenu); } MKMENUITEM(NULL, NULL); MKMENUITEM("Change Settings", change_settings_menuitem); MKMENUITEM(NULL, NULL); if (use_event_log) MKMENUITEM("Event Log", event_log_menuitem); MKMENUITEM("Special Commands", NULL); inst->specialsmenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->specialsmenu); inst->specialsitem1 = menuitem; MKMENUITEM(NULL, NULL); inst->specialsitem2 = menuitem; gtk_widget_hide(inst->specialsitem1); gtk_widget_hide(inst->specialsitem2); MKMENUITEM("Clear Scrollback", clear_scrollback_menuitem); MKMENUITEM("Reset Terminal", reset_terminal_menuitem); MKMENUITEM("Copy All", copy_all_menuitem); MKMENUITEM(NULL, NULL); s = dupcat("About ", appname, NULL); MKMENUITEM(s, about_menuitem); sfree(s); #undef MKMENUITEM } inst->textcursor = make_mouse_ptr(inst, GDK_XTERM); inst->rawcursor = make_mouse_ptr(inst, GDK_LEFT_PTR); inst->waitcursor = make_mouse_ptr(inst, GDK_WATCH); inst->blankcursor = make_mouse_ptr(inst, -1); make_mouse_ptr(inst, -2); /* clean up cursor font */ inst->currcursor = inst->textcursor; show_mouseptr(inst, 1); inst->eventlogstuff = eventlogstuff_new(); inst->term = term_init(&inst->cfg, &inst->ucsdata, inst); inst->logctx = log_init(inst, &inst->cfg); term_provide_logctx(inst->term, inst->logctx); uxsel_init(); term_size(inst->term, inst->cfg.height, inst->cfg.width, inst->cfg.savelines); start_backend(inst); ldisc_send(inst->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */ /* now we're reday to deal with the child exit handler being * called */ block_signal(SIGCHLD, 0); /* * Block SIGPIPE: if we attempt Duplicate Session or similar * and it falls over in some way, we certainly don't want * SIGPIPE terminating the main pterm/PuTTY. Note that we do * this _after_ (at least pterm) forks off its child process, * since the child wants SIGPIPE handled in the usual way. */ block_signal(SIGPIPE, 1); inst->exited = FALSE; gtk_main(); return 0; } Revision-number: 7934 Prop-content-length: 764 Content-length: 764 K 7 svn:log V 663 For convenience of debugging, and perhaps some real convenience at some point too: introduce a bunch of environment variables which can override Unix PuTTY's usual idea of where to find its dotfiles. Setting PUTTYDIR moves the entire ~/.putty directory; setting PUTTYSESSIONS, PUTTYSSHHOSTKEYS or PUTTYRANDOMSEED move specific things within that directory. While I'm here, also be prepared to fall back to password file lookups if $HOME is undefined (though we still use $HOME in preference when it is defined, because that's polite and useful). Also, on general principles, tweak the make_filename() function prototype so it doesn't rely on fixed-size buffers. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-03-22T12:01:16.047240Z PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18818fdb476e1d3928b5d9567ff60d84 Text-delta-base-sha1: c19d0a678694836e11fc18947d2a660abf449944 Text-content-length: 3996 Text-content-md5: e7e2e6bcca364c0f4244779cdcb58253 Text-content-sha1: 58ce8e5aafb07473b1406886f1e1423c5073673e Content-length: 3996 SVN��x+p �W��<JX�[c�;~\�n'�G �3ED� SD�}�.�TaR�_�`ji�M&�9N�A<pwdchar *make_filename(int index, const char *subname) { char *env, *tmp, *ret; /* * Allow override of the PuTTY configuration location, and of * specific subparts of it, by means of environment variables. */ if (index == INDEX_DIR) { struct passwd *pwd; env = getenv("PUTTYDIR"); if (env) return dupstr(env); env = getenv("HOME"); if (env) return dupprintf("%s/.putty", env); pwd = getpwuid(getuid()); if (pwd && pwd->pw_dir) return dupprintf("%s/.putty", pwd->pw_dir); return dupstr("/.putty"); } if (index == INDEX_SESSIONDIR) { env = getenv("PUTTYSESSIONS"); if (env) return dupstr(env); tmp = make_filename(INDEX_DIR, NULL); ret = dupprintf("%s/sessions", tmp); sfree(tmp); return ret; } if (index == INDEX_SESSION) { char *munged = mungestr(subname); tmp = make_filename(INDEX_SESSIONDIR, NULL); ret = dupprintf("%s/%s", tmp, munged); sfree(tmp); sfree(munged); return ret; } if (index == INDEX_HOSTKEYS) { env = getenv("PUTTYSSHHOSTKEYS"); if (env) return dupstr(env); tmp = make_filename(INDEX_DIR, NULL); ret = dupprintf("%s/sshhostkeys", tmp); sfree(tmp); return ret; } if (index == INDEX_HOSTKEYS_TMP) { tmp = make_filename(INDEX_HOSTKEYS, NULL); ret = dupprintf("%s.tmp", tmp); sfree(tmp); return ret; } if (index == INDEX_RANDSEED) { env = getenv("PUTTYRANDOMSEED"); if (env) return dupstr(env); tmp = make_filename(INDEX_DIR, NULL); ret = dupprintf("%s/randomseed", tmp); sfree(tmp); return ret; } tmp = make_filename(INDEX_DIR, NULL); ret = dupprintf("%s/ERROR", tmp); sfree(tmp); return ret; } void *open_settings_w(const char *sessionname, char **errmsg) { char *filenamefilename = make_filename(INDEX_SESSIONDIR, NULL); if (!mkdir(filename, 0700)) { char *filename2 = make_filename(INDEX_DIR, NULL); mkdir(filename2, 0700); sfree(filename2); mkdir(filename, 0700); } sfree(filename); filename = make_filename(sfree(filename); return NULL; /* can't open */ } sfree(filename);*filename; FILE *fp; char *line; tree234 *ret; filename = make_filename(INDEX_SESSION, sessionname); fp = fopen(filename, "r"); sfree(filename*filename; filename = make_filename(INDEX_SESSION, sessionname); unlink(filename); sfree(filename); } void *enum_settings_start(void) { DIR *dp; char *filename; filename = make_filename(INDEX_SESSIONDIR, NULL); dp = opendir(filename); sfree*fullpath; int maxlen, thislen, len; char *unmunged; fullpath = make_filename(INDEX_SESSIONDIR, NULL); maxlen = len = strlen(fullpath); while ( (de = readdir(dp)) != NULL ) { thislen = len + 1 + strlen(de->d_name); if (maxlen < thislen) { maxlen = thislen; fullpath = sresize(fullpath, maxlen+1, char); } fullpath[len] = '/'; strncpy(fullpath+len+1, de->d_name, thislen - (len+1)); fullpath[thislen] = '\0'; sfree(fullpath); return buffer; } sfree(fullpath);*filename; char *line; int ret; filename = make_filename(INDEX_HOSTKEYS, NULL); fp = fopen(filename, "r"); sfree(filename*filename, *tmpfilenametmpfilename = make_filename(INDEX_HOSTKEYS_TMP, NULL); wfp = fopen(tmpfilename, "w"); if (!wfp) { char *dir; dir = make_filename(INDEX_DIR, NULL); mkdir(dir, 0700); sfree(dir); wfp = fopen(tmpfilename, "w"); } if (!wfp) { sfree(tmpfilename); return; } filename = make_filename(tmpfilename); sfree(filename);*fname; fname = make_filename(INDEX_RANDSEED, NULL); fd = open(fname, O_RDONLY); sfree(fname*fname; fname = make_filename(*dir; dir = make_filename(INDEX_DIR, NULL); mkdir(dir, 0700); sfree(dir); sfree(fname); } void cleanup_all(void) { } Revision-number: 7935 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2008-03-22T12:02:55.084015Z K 7 svn:log V 121 Merge from trunk again (because I want the helpful diagnostic code in r7934 on this branch). Now up to date as of r7934. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18818fdb476e1d3928b5d9567ff60d84 Text-delta-base-sha1: c19d0a678694836e11fc18947d2a660abf449944 Text-content-length: 3996 Text-content-md5: e7e2e6bcca364c0f4244779cdcb58253 Text-content-sha1: 58ce8e5aafb07473b1406886f1e1423c5073673e Content-length: 3996 SVN��x+p �W��<JX�[c�;~\�n'�G �3ED� SD�}�.�TaR�_�`ji�M&�9N�A<pwdchar *make_filename(int index, const char *subname) { char *env, *tmp, *ret; /* * Allow override of the PuTTY configuration location, and of * specific subparts of it, by means of environment variables. */ if (index == INDEX_DIR) { struct passwd *pwd; env = getenv("PUTTYDIR"); if (env) return dupstr(env); env = getenv("HOME"); if (env) return dupprintf("%s/.putty", env); pwd = getpwuid(getuid()); if (pwd && pwd->pw_dir) return dupprintf("%s/.putty", pwd->pw_dir); return dupstr("/.putty"); } if (index == INDEX_SESSIONDIR) { env = getenv("PUTTYSESSIONS"); if (env) return dupstr(env); tmp = make_filename(INDEX_DIR, NULL); ret = dupprintf("%s/sessions", tmp); sfree(tmp); return ret; } if (index == INDEX_SESSION) { char *munged = mungestr(subname); tmp = make_filename(INDEX_SESSIONDIR, NULL); ret = dupprintf("%s/%s", tmp, munged); sfree(tmp); sfree(munged); return ret; } if (index == INDEX_HOSTKEYS) { env = getenv("PUTTYSSHHOSTKEYS"); if (env) return dupstr(env); tmp = make_filename(INDEX_DIR, NULL); ret = dupprintf("%s/sshhostkeys", tmp); sfree(tmp); return ret; } if (index == INDEX_HOSTKEYS_TMP) { tmp = make_filename(INDEX_HOSTKEYS, NULL); ret = dupprintf("%s.tmp", tmp); sfree(tmp); return ret; } if (index == INDEX_RANDSEED) { env = getenv("PUTTYRANDOMSEED"); if (env) return dupstr(env); tmp = make_filename(INDEX_DIR, NULL); ret = dupprintf("%s/randomseed", tmp); sfree(tmp); return ret; } tmp = make_filename(INDEX_DIR, NULL); ret = dupprintf("%s/ERROR", tmp); sfree(tmp); return ret; } void *open_settings_w(const char *sessionname, char **errmsg) { char *filenamefilename = make_filename(INDEX_SESSIONDIR, NULL); if (!mkdir(filename, 0700)) { char *filename2 = make_filename(INDEX_DIR, NULL); mkdir(filename2, 0700); sfree(filename2); mkdir(filename, 0700); } sfree(filename); filename = make_filename(sfree(filename); return NULL; /* can't open */ } sfree(filename);*filename; FILE *fp; char *line; tree234 *ret; filename = make_filename(INDEX_SESSION, sessionname); fp = fopen(filename, "r"); sfree(filename*filename; filename = make_filename(INDEX_SESSION, sessionname); unlink(filename); sfree(filename); } void *enum_settings_start(void) { DIR *dp; char *filename; filename = make_filename(INDEX_SESSIONDIR, NULL); dp = opendir(filename); sfree*fullpath; int maxlen, thislen, len; char *unmunged; fullpath = make_filename(INDEX_SESSIONDIR, NULL); maxlen = len = strlen(fullpath); while ( (de = readdir(dp)) != NULL ) { thislen = len + 1 + strlen(de->d_name); if (maxlen < thislen) { maxlen = thislen; fullpath = sresize(fullpath, maxlen+1, char); } fullpath[len] = '/'; strncpy(fullpath+len+1, de->d_name, thislen - (len+1)); fullpath[thislen] = '\0'; sfree(fullpath); return buffer; } sfree(fullpath);*filename; char *line; int ret; filename = make_filename(INDEX_HOSTKEYS, NULL); fp = fopen(filename, "r"); sfree(filename*filename, *tmpfilenametmpfilename = make_filename(INDEX_HOSTKEYS_TMP, NULL); wfp = fopen(tmpfilename, "w"); if (!wfp) { char *dir; dir = make_filename(INDEX_DIR, NULL); mkdir(dir, 0700); sfree(dir); wfp = fopen(tmpfilename, "w"); } if (!wfp) { sfree(tmpfilename); return; } filename = make_filename(tmpfilename); sfree(filename);*fname; fname = make_filename(INDEX_RANDSEED, NULL); fd = open(fname, O_RDONLY); sfree(fname*fname; fname = make_filename(*dir; dir = make_filename(INDEX_DIR, NULL); mkdir(dir, 0700); sfree(dir); sfree(fname); } void cleanup_all(void) { } Revision-number: 7936 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-23T00:34:38.635283Z PROPS-END Revision-number: 7937 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2008-03-22T18:11:17.581596Z K 7 svn:log V 184 Implemented a Pango back end. GTK 2 PuTTY can now switch seamlessly back and forth between X fonts and Pango fonts, provided you're willing to type in the names of the former by hand. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0599d7b2d1af68c590152c6bd26ba1c7 Text-delta-base-sha1: 1809753eea4cb5e4a68e52538531c20ae9a51a0a Text-content-length: 4711 Text-content-md5: a21c3a3444b2e0f83bfc1a3431ddb886 Text-content-sha1: 386a202bb8864a56a677fc349b1222a9c3d48073 Content-length: 4711 SVN��-~`z�0��+�3�l7Y�JP�wQ�yS�L�A?L�F?d�A?�#U�#O�lr�^m; import the icky * pixmap stretch code on to the X11 side, and do something * nicer in Pango. * * - unified font selector dialog, arrghGtkWidget *widget, , int cellwidth, int cellwidth); static unifont *x11font_create(GtkWidget *widget, char *name, GtkWidget *widget, char *name, , int cellwidthPango font implementation. */ static void pango int x, int y, const char *string, int len, int wide, int bold, int cellwidth); static unifont *pangofont_create(GtkWidget *widget, char *name, int wide, int bold, int shadowoffset, int shadowalways); static void pangofont_destroy(unifont *font); struct pangofont { struct unifont u; /* * Pango objects. */ PangoFontDescription *desc; PangoFontset *fset; /* * The containing widget. */ GtkWidget *widgbold, shadowoffset, shadowalways; }; static const struct unifont_vtable pangofont_vtable = { pangofont_create, pangofont_destroy, pangofont_draw_text, "pango" }; static unifont *pangofont_create(GtkWidget *widget, char *name, int wide, int bold, int shadowoffset, int shadowalways) { struct pangofont *pfont; PangoContext *ctx; PangoFontMap *map; PangoFontDescription *desc; PangoFontset *fset; PangoFontMetrics *metrics; desc = pango_font_description_from_string(name); if (!desc) return NULL; ctx = gtk_widget_get_pango_context(widget); if (!ctx) { pango_font_description_free(desc); return NULL; } map = pango_context_get_font_map(ctx); if (!map) { pango_font_description_free(desc); return NULL; } fset = pango_font_map_load_fontset(map, ctx, desc, pango_context_get_language(ctx)); if (!fset) { pango_font_description_free(desc); return NULL; } metrics = pango_fontset_get_metrics(fset); if (!metrics || pango_font_metrics_get_approximate_digit_width(metrics) == 0) { pango_font_description_free(desc); g_object_unref(fset); return NULL; } pfont = snew(struct pangofont); pfont->u.vt = &pangofont_vtable; pfont->u.width = PANGO_PIXELS(pango_font_metrics_get_approximate_digit_width(metrics)); pfont->u.ascent = PANGO_PIXELS(pango_font_metrics_get_ascent(metrics)); pfont->u.descent = PANGO_PIXELS(pango_font_metrics_get_descent(metrics)); pfont->u.height = pfont->u.ascent + pfont->u.descent; /* The Pango API is hardwired to UTF-8 */ pfont->u.public_charset = CS_UTF8; pfont->u.real_charset = CS_UTF8; pfont->desc = desc; pfont->fset = fset; pfont->widget = widget; pfont->bold = bold; pfont->shadowoffset = shadowoffset; pfont->shadowalways = shadowalways; return (unifont *)pfont; } static void pangofont_destroy(unifont *font) { struct pangofont *pfont = (struct pangofont *)font; pfont = pfont; /* FIXME */ pango_font_description_free(pfont->desc); g_object_unref(pfont->fset); sfree(font); } static void pango int x, int y, const char *string, int len, int wide, int bold, int cellwidth) { struct pangofont *pfont = (struct pangofont *)font; PangoLayout *layout; PangoRectangle rect; int shadowbold = FALSE; if (wide) cellwidth *= 2; y -= pfont->u.ascent; layout = pango_layout_new(gtk_widget_get_pango_context(pfont->widget)); pango_layout_set_font_description(layout, pfont->desc); if (bold > pfont->bold) { if (pfont->shadowalways) shadowbold = TRUE; else { PangoFontDescription *desc2 = pango_font_description_copy_static(pfont->desc); pango_font_description_set_weight(desc2, PANGO_WEIGHT_BOLD); pango_layout_set_font_description(layout, desc2); } } while (len > 0) { int clen; /* * Extract a single UTF-8 character from the string. */ clen = 1; while (clen < len && (unsigned char)string[clen] >= 0x80 && (unsigned char)string[clen] < 0xC0) clen++; pango_layout_set_text(layout, string, clen); pango_layout_get_pixel_extents(layout, NULL, &rect); gdk_draw_layout(target, gc, x + (cellwidth - rect.width)/2, y + (pfont->u.height - rect.height)/2, layout); if (shadowbold) gdk_draw_layout(target, gc, x + (cellwidth - rect.width)/2 + pfont->shadowoffset, y + (pfont->u.height - rect.height)/2, layout); len -= clen; string += clen; x += cellwidth; } g_object_unref(layout);pangofont_vtable, &x11font_vtable, }; unifont *unifont_create(GtkWidget *widget, widget, widget, , int cellwidth) { font->vt->draw_text(target, gc, font, x, y, string, len, wide, bold, cellwidth); } Node-path: putty-gtk2/unix/gtkfont.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d8bac1104de67eaaf08b23d68d7bb96e Text-delta-base-sha1: 2e2b5582bd4073ed41955d2a6db06d071ecc5bb0 Text-content-length: 89 Text-content-md5: b74c7da3836113766b281320e23b0675 Text-content-sha1: 76732248341b0236e01e40406a6b39eee6a32331 Content-length: 89 SVN��;] C���GtkWidget *widget, , int cellwidth); #endif /* PUTTY_GTKFONT_H */ Node-path: putty-gtk2/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ef7001b06a1013ef4ddd0a3bf3bca5d Text-delta-base-sha1: 99fda22d4b56418b504c3eb2b602d66edef489dc Text-content-length: 290 Text-content-md5: 04dbd109090c62460839bc801711ab0f Text-content-sha1: 5d11acfec1f5a6c6b884a97daac0f868e2153b59 Content-length: 290 SVN��wgHL�W��H:�V"�7x�_=�Rz�R �p�#��0G && inst->area->window) {, inst->font_widtharea, inst->cfg.font.name, area, inst->cfg.boldfont.name, FALSE, TRUarea, inst->cfg.widefont.name, area, inst->area = gtk_drawing_area_new( Revision-number: 7938 Prop-content-length: 335 Content-length: 335 K 8 svn:date V 27 2008-03-25T21:49:14.542052Z K 7 svn:log V 234 Unified font selector dialog box. _Extremely_ unfinished - there's a sizable TODO at the top of gtkfont.c - but it's basically functional enough to select fonts of both types, so I'm checking it in now before I accidentally break it. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a3aad3b0320df6bafc4ae73c9280b06 Text-delta-base-sha1: d7f57dad1f36f24adbf00e0872587d1ba0b71004 Text-content-length: 1157 Text-content-md5: 3efa52598ebc6dafac8852acf0849c30 Text-content-sha1: 291a754755c2300335a2294d0526d85ebeb5ab9d Content-length: 1157 SVN���=.I� ��c�)�KvL�G,�` <#include "gtkfontunifontsel *fontsel = (unifontsel *)gtk_object_get_data (GTK_OBJECT(button), "user-data"); struct uctrl *uc = (struct uctrl *)fontsel->user_data; char *name = unifontsel_get_name(fontsel); gtk_entry_set_text(GTK_ENTRY(uc->entry), name); sfree(unifontsel *fontsel = unifontsel_new("Select a font"); gtk_window_set_modal(fontsel->window, TRUE); unifontsel_set_name(fontsel, fontname); gtk_object_set_data(GTK_OBJECT(fontsel->ok_button), "user-data", (gpointer)fontsel); fontsel->user_data = uc; gtk_signal_connect(GTK_OBJECT(fontsel->ok_button), "clicked", (GTK_OBJECT(fontsel->ok_button), "clicked", GTK_SIGNAL_FUNC(unifontsel_destroy), (gpointer)fontsel); gtk_signal_connect_object(GTK_OBJECT(fontsel->cancel_button),"clicked", GTK_SIGNAL_FUNC(unifontsel_destroy), (gpointer)fontsel); gtk_widget_show(GTK_WIDGET(fontsel->window)PPEND WIDTH"), "Overwrite", 'o', 1, 2, "Append", 'a', 0, 1, "Disable", 'd', -1, 0, NULL); sfree(message); sfree(mbtitle); return mbret; } Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a21c3a3444b2e0f83bfc1a3431ddb886 Text-delta-base-sha1: 386a202bb8864a56a677fc349b1222a9c3d48073 Text-content-length: 40690 Text-content-md5: e1493ac59897d55c65b33ad4e7620f8d Text-content-sha1: 5a60774cef67edd4185b20ef1ed8c698c43f5a06 Content-length: 40690 SVN��~m3/�s��DD� k�u�|�/�X-W�7GZ�-�W-Z�hu6�L��N<W�8E�_<��7J�)�E-�Y-`�Q�l�l\�+8�$o�L2�N~#include "tree234.h" /* * TODO on fontsel * --------------- * * - implement the preview pane * * - extend the font style language for X11 fonts so that we * never get unexplained double size elements? Or, at least, so * that _my_ font collection never produces them; that'd be a * decent start. * * - decide what _should_ happen about font aliases. Should we * resolve them as soon as they're clicked? Or be able to * resolve them on demand, er, somehow? Or resolve them on exit * from the function? Or what? If we resolve on demand, should * we stop canonifying them on input, on the basis that we'd * prefer to let the user _tell_ us when to canonify them? * * - think about points versus pixels, harder than I already have * * - work out why the list boxes don't go all the way to the RHS * of the dialog box * * - develop a sensible sorting order for the font styles - * Regular / Roman / non-bold-or-italic should come at the top! * * - big testing and shakedown * - it would be nice if we could move the processing of * underline and VT100 double width into this module, so that * instead of using the ghastly pixmap-stretching technique * everywhere we could tell the Pango backend to scale its * fonts to double size properly and at full resolution. * However, this requires me to learn how to make Pango stretch * text to an arbitrary aspect ratio (for double-width only * text, which perversely is harder than DW+DH), and right now * I haven't the energy#define FONTFLAG_CLIENTSIDE 0x0001 #define FONTFLAG_SERVERSIDE 0x0002 #define FONTFLAG_SERVERALIAS 0x0004 #define FONTFLAG_NONMONOSPACED 0x0008 typedef void (*fontsel_add_entry)(void *ctx, const char *realfontname, const char *family, const char *charset, const char *style, int size, int flags, const struct unifont_vtable *fontclass);onstvoid (*enum_fonts)(GtkWidget *widget, fontsel_add_entry callback, void *callback_ctx); char *(*canonify_fontname)(GtkWidget *widget, const char *name, int *size); char *(*scale_fontname)(GtkWidget *widget, const char *name, int size); onst; static void x11font_destroy(unifont *font); static void x11font_enum_fonts(GtkWidget *widget, fontsel_add_entry callback, void *callback_ctx); static char *x11font_canonify_fontname(GtkWidget *widget, const char *name, int *size); static char *x11font_scale_fontname(GtkWidget *widget, const char *name, int sizex11font_enum_fonts, x11font_canonify_fontname, x11font_scale_fontname, "serveronststatic void x11font_enum_fonts(GtkWidget *widget, fontsel_add_entry callback, void *callback_ctx) { char **fontnames; char *tmp = NULL; int nnames, i, max, tmpsize; max = 32768; while (1) { fontnames = XListFonts(GDK_DISPLAY(), "*", max, &nnames); if (nnames >= max) { XFreeFontNames(fontnames); max *= 2; } else break; } tmpsize = 0; for (i = 0; i < nnames; i++) { if (fontnames[i][0] == '-') { /* * Dismember an XLFD and convert it into the format * we'll be using in the font selector. */ char *components[14]; char *p, *font, *style, *charset; int j, thistmpsize, fontsize, flags; thistmpsize = 3 * strlen(fontnames[i]) + 256; if (tmpsize < thistmpsize) { tmpsize = thistmpsize; tmp = sresize(tmp, tmpsize, char); } strcpy(tmp, fontnames[i]); p = tmp; for (j = 0; j < 14; j++) { if (*p) *p++ = '\0'; components[j] = p; while (*p && *p != '-') p++; } *p++ = '\0'; /* * Font name is made up of fields 0 and 1, in reverse * order with parentheses. (This is what the GTK 1.2 X * font selector does, and it seems to come out * looking reasonably sensible.) */ font = p; p += 1 + sprintf(p, "%s (%s)", components[1], components[0]); /* * Charset is made up of fields 12 and 13. */ charset = p; p += 1 + sprintf(p, "%s-%s", components[12], components[13]); /* * Style is a mixture of the weight, slant, set_width * and spacing fields (respectively 2, 3, 4 and 10) * with some strange formatting. (Again, cribbed * entirely from the GTK 1.2 font selector.) */ style = p; p += sprintf(p, "%s", components[2][0] ? components[2] : "regular"); if (!g_strcasecmp(components[3], "i")) p += sprintf(p, " italic"); else if (!g_strcasecmp(components[3], "o")) p += sprintf(p, " oblique"); else if (!g_strcasecmp(components[3], "ri")) p += sprintf(p, " reverse italic"); else if (!g_strcasecmp(components[3], "ro")) p += sprintf(p, " reverse oblique"); else if (!g_strcasecmp(components[3], "ot")) p += sprintf(p, " other-slant"); if (components[4][0] && g_strcasecmp(components[4], "normal")) p += sprintf(p, " %s", components[4]); if (!g_strcasecmp(components[10], "m")) p += sprintf(p, " [M]"); if (!g_strcasecmp(components[10], "c")) p += sprintf(p, " [C]"); /* * Size is in pixels, for our application, so we * derive it directly from the pixel size field, * number 6. */ fontsize = atoi(components[6]); /* * Flags: we need to know whether this is a monospaced * font, which we do by examining the spacing field * again. */ flags = FONTFLAG_SERVERSIDE; if (!strchr("CcMm", components[10][0])) flags |= FONTFLAG_NONMONOSPACED; /* * Not sure why, but sometimes the X server will * deliver dummy font types in which fontsize comes * out as zero. Filter those out. */ if (fontsize) callback(callback_ctx, fontnames[i], font, charset, style, fontsize, flags, &x11font_vtable); } else { /* * This isn't an XLFD, so it must be an alias. * Transmit it with mostly null data. * * It would be nice to work out if it's monospaced * here, but at the moment I can't see that being * anything but computationally hideous. Ah well. */ callback(callback_ctx, fontnames[i], fontnames[i], NULL, NULL, 0, FONTFLAG_SERVERALIAS, &x11font_vtable); } } XFreeFontNames(fontnames); } static char *x11font_canonify_fontname(GtkWidget *widget, const char *name, int *size) { /* * When given an X11 font name to try to make sense of for a * font selector, we must attempt to load it (to see if it * exists), and then canonify it by extracting its FONT * property, which should give its full XLFD even if what we * originally had was an alias. */ GdkFont *font = gdk_font_load(name); XFontStruct *xfs; Display *disp; Atom fontprop, fontprop2; unsigned long ret; if (!font) return NULL; /* didn't make sense to us, sorry */ gdk_font_ref(font); xfs = GDK_FONT_XFONT(font); disp = GDK_FONT_XDISPLAY(font); fontprop = XInternAtom(disp, "FONT", False); ) { unsigned long fsize = 12; fontprop2 = XInternAtom(disp, "PIXEL_SIZE", False); if (XGetFontProperty(xfs, fontprop2, &fsize)) { *size = fsize; gdk_font_unref(font); return dupstr(name); } } } gdk_font_unref(font); return NULL; /* something went wrong */ } static char *x11font_scale_fontname(GtkWidget *widget, const char *name, int size) { return NULL; /* shan't */onst; static void pangofont_destroy(unifont *font); static void pangofont_enum_fonts(GtkWidget *widget, fontsel_add_entry callback, void *callback_ctx); static char *pangofont_canonify_fontname(GtkWidget *widget, const char *name, int *size); static char *pangofont_scale_fontname(GtkWidget *widget, const char *name, int sizepangofont_enum_fonts, pangofont_canonify_fontname, pangofont_scale_fontname, "client" }; static unifont *pangofont_create(GtkWidget *widget, constpango_font_metrics_unref(metrics) * Dummy size value to be used when converting a * PangoFontDescription of a scalable font to a string for * internal use. */ #define PANGO_DUMMY_SIZE 12 static void pangofont_enum_fonts(GtkWidget *widget, fontsel_add_entry callback, void *callback_ctx) { PangoContext *ctx; PangoFontMap *map; PangoFontFamily **families; int i, nfamilies; /* * Find the active font map. */ ctx = gtk_widget_get_pango_context(widget); if (!ctx) return; map = pango_context_get_font_map(ctx); if (!map) return; /* * Ask the font map for a list of font families, and iterate * through them. */ pango_font_map_list_families(map, &families, &nfamilies); for (i = 0; i < nfamilies; i++) { PangoFontFamily *family = families[i]; const char *familyname; int flags; PangoFontFace **faces; int j, nfaces; /* * Set up our flags for this font family, and get the name * string. */ flags = FONTFLAG_CLIENTSIDE; if (!pango_font_family_is_monospace(family)) flags |= FONTFLAG_NONMONOSPACED; familyname = pango_font_family_get_name(family); /* * Go through the available font faces in this family. */ pango_font_family_list_faces(family, &faces, &nfaces); for (j = 0; j < nfaces; j++) { PangoFontFace *face = faces[j]; PangoFontDescription *desc; const char *facename; int *sizes; int k, nsizes, dummysize; /* * Get the face name string. */ facename = pango_font_face_get_face_name(face); /* * Set up a font description with what we've got so * far. We'll fill in the size field manually and then * call pango_font_description_to_string() to give the * full real name of the specific font. */ desc = pango_font_face_describe(face); /* * See if this font has a list of specific sizes. */ pango_font_face_list_sizes(face, &sizes, &nsizes); if (!sizes) { /* * Write a single entry with a dummy size. */ dummysize = PANGO_DUMMY_SIZE * PANGO_SCALE; sizes = &dummysize; nsizes = 1; } /* * If so, go through them one by one. */ for (k = 0; k < nsizes; k++) { char *fullname; pango_font_description_set_size(desc, sizes[k]); fullname = pango_font_description_to_string(desc); /* * Got everything. Hand off to the callback. * (The charset string is NULL, because only * server-side X fonts use it.) */ callback(callback_ctx, fullname, familyname, NULL, facename, (sizes == &dummysize ? 0 : PANGO_PIXELS(sizes[k])), flags, &pangofont_vtable); g_free(fullname); } if (sizes != &dummysize) g_free(sizes); pango_font_description_free(desc); } g_free(faces); } g_free(families); } static char *pangofont_canonify_fontname(GtkWidget *widget, const char *name, int *size) { /* * When given a Pango font name to try to make sense of for a * font selector, we must normalise it to PANGO_DUMMY_SIZE and * extract its original size (in pixels) into the `size' field. */ char *newname, *retname*size = PANGO_PIXELS(pango_font_description_get_size(desc)); pango_font_description_set_size(desc, PANGO_DUMMY_SIZE * PANGO_SCALE); newname = pango_font_description_to_string(desc); retname = dupstr(newname); g_free(newname); pango_font_metrics_unref(metrics); pango_font_description_free(desc); g_object_unref(fset); return retname; } static char *pangofont_scale_fontname(GtkWidget *widget, const char *name, int size) { PangoFontDescription *desc; char *newname, *retnamepango_font_description_set_size(desc, size * PANGO_SCALE); newname = pango_font_description_to_string(desc); retname = dupstr(newname); g_free(newname); pango_font_description_free(desc); return retname;Outermost functions which do the vtable dispatch. */ /* * Complete list of font-type subclasses. Listed in preference * order for unifont_create(). (That is, in the extremely unlikely * event that the same font name is valid as both a Pango and an * X11 font, it will be interpreted as the former in the absence * of an explicit type-disambiguating prefix.) /* * Function which takes a font name and processes the optional * scheme prefix. Returns the tail of the font name suitable for * passing to individual font scheme functions, and also provides * a subrange of the unifont_types[] array above. * * The return values `start' and `end' denote a half-open interval * in unifont_types[]; that is, the correct way to iterate over * them is * * for (i = start; i < end; i++) {...} */ static const char *unifont_do_prefix(const char *name, int *start, int *endus { *start = i; *end = i+1; return name + colonpos + 1; } } /* * None matched, so return an empty scheme list to prevent * any scheme from being called at all. */ *start = *end = 0; return name + colonpos + 1; } else { /* * No colon prefix, so just use all the subclasses. */ *start = 0; *end = lenof(unifont_types); return name; } } unifont *unifont_create(GtkWidget *widget, const char *name, int wide, int bold, int shadowoffset, int shadowalways) { int i, start, end; name = unifont_do_prefix(name, &start, &end); for (i = start; i < end; i++) { unifont *ret = unifont_types[i]->create(widget, name, wide, bold, shadowoffset, shadowalways); if (ret) return ret; } return NULL; /* font not found in any scheme */Implementation of a unified font selector. */ typedef struct fontinfo fontinfo; typedef struct unifontsel_internal { /* This must be the structure's first element, for cross-casting */ unifontsel u; GtkListStore *family_model, *style_model, *size_model; GtkWidget *family_list, *style_list, *size_entry, *size_list; GtkWidget *filter_buttons[4]; int filter_flags; tree234 *fonts_by_realname, *fonts_by_selorder; fontinfo *selected; int selsize; int inhibit_response; /* inhibit callbacks when we change GUI controls */ } unifontsel_internal; /* * The structure held in the tree234s. All the string members are * part of the same allocated area, so don't need freeing * separately. */ struct fontinfo { char *realname; char *family, *charset, *style; int size, flags; /* * Fallback sorting key, to permit multiple identical entries * to exist in the selorder tree. */ int index; /* * Indices mapping fontinfo structures to indices in the list * boxes. sizeindex is irrelevant if the font is scalable * (size==0). */ int familyindex, styleindex, sizeindex; /* * The class of font. */ const struct unifont_vtable *fontclass; }; static int fontinfo_realname_compare(void *av, void *bv) { fontinfo *a = (fontinfo *)av; fontinfo *b = (fontinfo *)bv; return g_strcasecmp(a->realname, b->realname); } static int fontinfo_realname_find(void *av, void *bv) { const char *a = (const char *)av; fontinfo *b = (fontinfo *)bv; return g_strcasecmp(a, b->realname); } static int strnullcasecmp(const char *a, const char *b) { int i; /* * If exactly one of the inputs is NULL, it compares before * the other one. */ if ((i = (!b) - (!a)) != 0) return i; /* * NULL compares equal. */ if (!a) return 0; /* * Otherwise, ordinary strcasecmp. */ return g_strcasecmp(a, b); } static int fontinfo_selorder_compare(void *av, void *bv) { fontinfo *a = (fontinfo *)av; fontinfo *b = (fontinfo *)bv; int i; if ((i = strnullcasecmp(a->family, b->family)) != 0) return i; if ((i = strnullcasecmp(a->charset, b->charset)) != 0) return i; if ((i = strnullcasecmp(a->style, b->style)) != 0) return i; if (a->size != b->size) return (a->size < b->size ? -1 : +1); if (a->index != b->index) return (a->index < b->index ? -1 : +1); return 0; } static void unifontsel_setup_familylist(unifontsel_internal *fs) { GtkTreeIter iter; int i, listindex, minpos = -1, maxpos = -1; char *currfamily = NULL; fontinfo *info; gtk_list_store_clear(fs->family_model); listindex = 0; /* * Search through the font tree for anything matching our * current filter criteria. When we find one, add its font * name to the list box. */ for (i = 0 ;; i++) { info = (fontinfo *)index234(fs->fonts_by_selorder, i); /* * info may be NULL if we've just run off the end of the * tree. We must still do a processing pass in that * situation, in case we had an unfinished font record in * progress. */ if (info && (info->flags &~ fs->filter_flags)) { info->familyindex = -1; continue; /* we're filtering out this font */ } if (!info || strnullcasecmp(currfamily, info->family)) { /* * We've either finished a family, or started a new * one, or both. */ if (currfamily) { gtk_list_store_append(fs->family_model, &iter); gtk_list_store_set(fs->family_model, &iter, 0, currfamily, 1, minpos, 2, maxpos+1, -1); listindex++; } if (info) { minpos = i; currfamily = info->family; } } if (!info) break; /* now we're done */ info->familyindex = listindex; maxpos = i; } } static void unifontsel_setup_stylelist(unifontsel_internal *fs, int start, int end) { GtkTreeIter iter; int i, listindex, minpos = -1, maxpos = -1, started = FALSE; char *currcs = NULL, *currstyle = NULL; fontinfo *info; gtk_list_store_clear(fs->style_model); listindex = 0; started = FALSE; /* * Search through the font tree for anything matching our * current filter criteria. When we find one, add its charset * and/or style name to the list box. */ for (i = start; i <= end; i++) { if (i == end) info = NULL; else info = (fontinfo *)index234(fs->fonts_by_selorder, i); /* * info may be NULL if we've just run off the end of the * relevant data. We must still do a processing pass in * that situation, in case we had an unfinished font * record in progress. */ if (info && (info->flags &~ fs->filter_flags)) { info->styleindex = -1; continue; /* we're filtering out this font */ } if (!info || !started || strnullcasecmp(currcs, info->charset) || strnullcasecmp(currstyle, info->style)) { /* * We've either finished a style/charset, or started a * new one, or both. */ started = TRUE; if (currstyle) { gtk_list_store_append(fs->style_model, &iter); gtk_list_store_set(fs->style_model, &iter, 0, currstyle, 1, minpos, 2, maxpos+1, 3, TRUE, -1); listindex++; } if (info) { minpos = i; if (info->charset && strnullcasecmp(currcs, info->charset)) { gtk_list_store_append(fs->style_model, &iter); gtk_list_store_set(fs->style_model, &iter, 0, info->charset, 1, -1, 2, -1, 3, FALSE, -1); listindex++; } currcs = info->charset; currstyle = info->style; } } if (!info) break; /* now we're done */ info->styleindex = listindex; maxpos = i; } } static const int unifontsel_default_sizes[] = { 10, 12, 14, 16, 20, 24, 32 }; static void unifontsel_setup_sizelist(unifontsel_internal *fs, int start, int end) { GtkTreeIter iter; int i, listindex; char sizetext[40]; fontinfo *info; gtk_list_store_clear(fs->size_model); listindex = 0; /* * Search through the font tree for anything matching our * current filter criteria. When we find one, add its font * name to the list box. */ for (i = start; i < end; i++) { info = (fontinfo *)index234(fs->fonts_by_selorder, i); if (info->flags &~ fs->filter_flags) { info->sizeindex = -1; continue; /* we're filtering out this font */ } if (info->size) { sprintf(sizetext, "%d", info->size); info->sizeindex = listindex; gtk_list_store_append(fs->size_model, &iter); gtk_list_store_set(fs->size_model, &iter, 0, sizetext, 1, i, 2, info->size, -1); listindex++; } else { int j; assert(i == start); assert(i+1 == end); for (j = 0; j < lenof(unifontsel_default_sizes); j++) { sprintf(sizetext, "%d", unifontsel_default_sizes[j]); gtk_list_store_append(fs->size_model, &iter); gtk_list_store_set(fs->size_model, &iter, 0, sizetext, 1, i, 2, unifontsel_default_sizes[j], -1); listindex++; } } } } static void unifontsel_set_filter_buttons(unifontsel_internal *fs) { int i; for (i = 0; i < lenof(fs->filter_buttons); i++) { int flagbit = GPOINTER_TO_INT(gtk_object_get_data (GTK_OBJECT(fs->filter_buttons[i]), "user-data")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fs->filter_buttons[i]), !!(fs->filter_flags & flagbit)); } } static void unifontsel_select_font(unifontsel_internal *fs, fontinfo *info, int size, int leftlist) { int index; int minval, maxval; GtkTreePath *treepath; GtkTreeIter iter; fs->inhibit_response = TRUE; fs->selected = info; fs->selsize = size; /* * Find the index of this fontinfo in the selorder list. */ index = -1; findpos234(fs->fonts_by_selorder, info, NULL, &index); assert(index >= 0); /* * Adjust the font selector flags and redo the font family * list box, if necessary. */ if (leftlist <= 0 && (fs->filter_flags | info->flags) != fs->filter_flags) { fs->filter_flags |= info->flags; unifontsel_set_filter_buttons(fs); unifontsel_setup_familylist(fs); } /* * Find the appropriate family name and select it in the list. */ assert(info->familyindex >= 0); treepath = gtk_tree_path_new_from_indices(info->familyindex, -1); gtk_tree_selection_select_path (gtk_tree_view_get_selection(GTK_TREE_VIEW(fs->family_list)), treepath); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(fs->family_list), treepath, NULL, FALSE, 0.0, 0.0); gtk_tree_model_get_iter(GTK_TREE_MODEL(fs->family_model), &iter, treepath); gtk_tree_path_free(treepath); /* * Now set up the font style list. */ gtk_tree_model_get(GTK_TREE_MODEL(fs->family_model), &iter, 1, &minval, 2, &maxval, -1); if (leftlist <= 1) unifontsel_setup_stylelist(fs, minval, maxval); /* * Find the appropriate style name and select it in the list. */ if (info->style) { assert(info->styleindex >= 0); treepath = gtk_tree_path_new_from_indices(info->styleindex, -1); gtk_tree_selection_select_path (gtk_tree_view_get_selection(GTK_TREE_VIEW(fs->style_list)), treepath); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(fs->style_list), treepath, NULL, FALSE, 0.0, 0.0); gtk_tree_model_get_iter(GTK_TREE_MODEL(fs->style_model), &iter, treepath); gtk_tree_path_free(treepath); /* * And set up the size list. */ gtk_tree_model_get(GTK_TREE_MODEL(fs->style_model), &iter, 1, &minval, 2, &maxval, -1); if (leftlist <= 2) unifontsel_setup_sizelist(fs, minval, maxval); /* * Find the appropriate size, and select it in the list. */ if (info->size) { assert(info->sizeindex >= 0); treepath = gtk_tree_path_new_from_indices(info->sizeindex, -1); gtk_tree_selection_select_path (gtk_tree_view_get_selection(GTK_TREE_VIEW(fs->size_list)), treepath); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(fs->size_list), treepath, NULL, FALSE, 0.0, 0.0); gtk_tree_path_free(treepath); size = info->size; } else { int j; for (j = 0; j < lenof(unifontsel_default_sizes); j++) if (unifontsel_default_sizes[j] == size) { treepath = gtk_tree_path_new_from_indices(j, -1); gtk_tree_view_set_cursor(GTK_TREE_VIEW(fs->size_list), treepath, NULL, FALSE); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(fs->size_list), treepath, NULL, FALSE, 0.0, 0.0); gtk_tree_path_free(treepath); } } /* * And set up the font size text entry box. */ { char sizetext[40]; sprintf(sizetext, "%d", size); gtk_entry_set_text(GTK_ENTRY(fs->size_entry), sizetext); } } else { if (leftlist <= 2) unifontsel_setup_sizelist(fs, 0, 0); gtk_entry_set_text(GTK_ENTRY(fs->size_entry), ""); } /* * Grey out the font size edit box if we're not using a * scalable font. */ gtk_entry_set_editable(GTK_ENTRY(fs->size_entry), fs->selected->size == 0); gtk_widget_set_sensitive(fs->size_entry, fs->selected->size == 0); fs->inhibit_response = FALSE; } static void unifontsel_button_toggled(GtkToggleButton *tb, gpointer data) { unifontsel_internal *fs = (unifontsel_internal *)data; int newstate = gtk_toggle_button_get_active(tb); int newflags; int flagbit = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(tb), "user-data")); if (newstate) newflags = fs->filter_flags | flagbit; else newflags = fs->filter_flags & ~flagbit; if (fs->filter_flags != newflags) { fs->filter_flags = newflags; unifontsel_setup_familylist(fs); } } static void unifontsel_add_entry(void *ctx, const char *realfontname, const char *family, const char *charset, const char *style, int size, int flags, const struct unifont_vtable *fontclass) { unifontsel_internal *fs = (unifontsel_internal *)ctx; fontinfo *info; int totalsize; char *p; totalsize = sizeof(fontinfo) + strlen(realfontname) + (family ? strlen(family) : 0) + (charset ? strlen(charset) : 0) + (style ? strlen(style) : 0) + 10; info = (fontinfo *)smalloc(totalsize); info->fontclass = fontclass; p = (char *)info + sizeof(fontinfo); info->realname = p; strcpy(p, realfontname); p += 1+strlen(p); if (family) { info->family = p; strcpy(p, family); p += 1+strlen(p); } else info->family = NULL; if (charset) { info->charset = p; strcpy(p, charset); p += 1+strlen(p); } else info->charset = NULL; if (style) { info->style = p; strcpy(p, style); p += 1+strlen(p); } else info->style = NULL; assert(p - (char *)info <= totalsize); info->size = size; info->flags = flags; info->index = count234(fs->fonts_by_selorder); /* * It's just conceivable that a misbehaving font enumerator * might tell us about the same font real name more than once, * in which case we should silently drop the new one. */ if (add234(fs->fonts_by_realname, info) != info) { sfree(info); return; } /* * However, we should never get a duplicate key in the * selorder tree, because the index field carefully * disambiguates otherwise identical records. */ add234(fs->fonts_by_selorder, info); } static void family_changed(GtkTreeSelection *treeselection, gpointer data) { unifontsel_internal *fs = (unifontsel_internal *)data; GtkTreeModel *treemodel; GtkTreeIter treeiter; int minval; fontinfo *info; if (fs->inhibit_response) /* we made this change ourselves */ return; if (!gtk_tree_selection_get_selected(treeselection, &treemodel, &treeiter)) return; gtk_tree_model_get(treemodel, &treeiter, 1, &minval, -1); info = (fontinfo *)index234(fs->fonts_by_selorder, minval); unifontsel_select_font(fs, info, info->size ? info->size : fs->selsize, 1); } static void style_changed(GtkTreeSelection *treeselection, gpointer data) { unifontsel_internal *fs = (unifontsel_internal *)data; GtkTreeModel *treemodel; GtkTreeIter treeiter; int minval; fontinfo *info; if (fs->inhibit_response) /* we made this change ourselves */ return; if (!gtk_tree_selection_get_selected(treeselection, &treemodel, &treeiter)) return; gtk_tree_model_get(treemodel, &treeiter, 1, &minval, -1); info = (fontinfo *)index234(fs->fonts_by_selorder, minval); unifontsel_select_font(fs, info, info->size ? info->size : fs->selsize, 2); } static void size_changed(GtkTreeSelection *treeselection, gpointer data) { unifontsel_internal *fs = (unifontsel_internal *)data; GtkTreeModel *treemodel; GtkTreeIter treeiter; int minval, size; fontinfo *info; if (fs->inhibit_response) /* we made this change ourselves */ return; if (!gtk_tree_selection_get_selected(treeselection, &treemodel, &treeiter)) return; gtk_tree_model_get(treemodel, &treeiter, 1, &minval, 2, &size, -1); info = (fontinfo *)index234(fs->fonts_by_selorder, minval); unifontsel_select_font(fs, info, info->size ? info->size : size, 3); } static void size_entry_changed(GtkEditable *ed, gpointer data) { unifontsel_internal *fs = (unifontsel_internal *)data; const char *text; int size; if (fs->inhibit_response) /* we made this change ourselves */ return; text = gtk_entry_get_text(GTK_ENTRY(ed)); size = atoi(text); if (size > 0) { assert(fs->selected->size == 0); unifontsel_select_font(fs, fs->selected, size, 3); } } unifontsel *unifontsel_new(const char *wintitle) { unifontsel_internal *fs = snew(unifontsel_internal); GtkWidget *table, *label, *w, *scroll; GtkListStore *model; GtkTreeViewColumn *column; int lists_height, font_width, style_width, size_width; int i; fs->inhibit_response = FALSE; { /* * Invent some magic size constants. */ GtkRequisition req; label = gtk_label_new("Quite Long Font Name (Foundry)"); gtk_widget_size_request(label, &req); font_width = req.width; lists_height = 14 * req.height; gtk_label_set_text(GTK_LABEL(label), "Italic Extra Condensed"); gtk_widget_size_request(label, &req); style_width = req.width; gtk_label_set_text(GTK_LABEL(label), "48000"); gtk_widget_size_request(label, &req); size_width = req.width; g_object_ref_sink(label); g_object_unref(label); } /* * Create the dialog box and initialise the user-visible * fields in the returned structure. */ fs->u.user_data = NULL; fs->u.window = GTK_WINDOW(gtk_dialog_new()); gtk_window_set_title(fs->u.window, wintitle); fs->u.cancel_button = gtk_dialog_add_button (GTK_DIALOG(fs->u.window), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); fs->u.ok_button = gtk_dialog_add_button (GTK_DIALOG(fs->u.window), GTK_STOCK_OK, GTK_RESPONSE_OK); gtk_widget_grab_default(fs->u.ok_button); /* * Now set up the internal fields, including in particular all * the controls that actually allow the user to select fonts. */ table = gtk_table_new(3, 8, FALSE); gtk_widget_show(table); gtk_table_set_col_spacings(GTK_TABLE(table), 8); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fs->u.window)->vbox), table, TRUE, TRUE, 0); label = gtk_label_new_with_mnemonic("_Font:"); gtk_widget_show(label); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); /* * The Font list box displays only a string, but additionally * stores two integers which give the limits within the * tree234 of the font entries covered by this list entry. */ model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); w = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(w), FALSE); gtk_label_set_mnemonic_widget(GTK_LABEL(label), w); gtk_widget_show(w); column = gtk_tree_view_column_new_with_attributes ("Font", gtk_cell_renderer_text_new(), "text", 0, (char *)NULL); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); gtk_tree_view_append_column(GTK_TREE_VIEW(w), column); g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(w))), "changed", G_CALLBACK(family_changed), fs); scroll = gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(scroll), w); gtk_widget_show(scroll); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_widget_set_size_request(scroll, font_width, lists_height); gtk_table_attach(GTK_TABLE(table), scroll, 0, 1, 1, 3, GTK_FILL, 0, 0, 0); fs->family_model = model; fs->family_list = w; label = gtk_label_new_with_mnemonic("_Style:"); gtk_widget_show(label); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, 0, 0, 0); /* * The Style list box can contain insensitive elements * (character set headings for server-side fonts), so we add * an extra column to the list store to hold that information. */ model = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_BOOLEAN); w = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(w), FALSE); gtk_label_set_mnemonic_widget(GTK_LABEL(label), w); gtk_widget_show(w); column = gtk_tree_view_column_new_with_attributes ("Style", gtk_cell_renderer_text_new(), "text", 0, "sensitive", 3, (char *)NULL); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); gtk_tree_view_append_column(GTK_TREE_VIEW(w), column); g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(w))), "changed", G_CALLBACK(style_changed), fs); scroll = gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(scroll), w); gtk_widget_show(scroll); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_widget_set_size_request(scroll, style_width, lists_height); gtk_table_attach(GTK_TABLE(table), scroll, 1, 2, 1, 3, GTK_FILL, 0, 0, 0); fs->style_model = model; fs->style_list = w; label = gtk_label_new_with_mnemonic("Si_ze:"); gtk_widget_show(label); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_FILL, 0, 0, 0); /* * The Size label attaches primarily to a text input box so * that the user can select a size of their choice. The list * of available sizes is secondary. */ fs->size_entry = w = gtk_entry_new(); gtk_label_set_mnemonic_widget(GTK_LABEL(label), w); gtk_widget_set_size_request(w, size_width, -1); gtk_widget_show(w); gtk_table_attach(GTK_TABLE(table), w, 2, 3, 1, 2, GTK_FILL, 0, 0, 0); g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(size_entry_changed), fs); model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); w = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(w), FALSE); gtk_widget_show(w); column = gtk_tree_view_column_new_with_attributes ("Size", gtk_cell_renderer_text_new(), "text", 0, (char *)NULL); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); gtk_tree_view_append_column(GTK_TREE_VIEW(w), column); g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(w))), "changed", G_CALLBACK(size_changed), fs); scroll = gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(scroll), w); gtk_widget_show(scroll); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_table_attach(GTK_TABLE(table), scroll, 2, 3, 2, 3, GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); fs->size_model = model; fs->size_list = w; /* * FIXME: preview widget */ i = 0; w = gtk_check_button_new_with_label("Show client-side fonts"); gtk_object_set_data(GTK_OBJECT(w), "user-data", GINT_TO_POINTER(FONTFLAG_CLIENTSIDE)); gtk_signal_connect(GTK_OBJECT(w), "toggled", GTK_SIGNAL_FUNC(unifontsel_button_toggled), fs); gtk_widget_show(w); fs->filter_buttons[i++] = w; gtk_table_attach(GTK_TABLE(table), w, 0, 3, 4, 5, GTK_FILL, 0, 0, 0); w = gtk_check_button_new_with_label("Show server-side fonts"); gtk_object_set_data(GTK_OBJECT(w), "user-data", GINT_TO_POINTER(FONTFLAG_SERVERSIDE)); gtk_signal_connect(GTK_OBJECT(w), "toggled", GTK_SIGNAL_FUNC(unifontsel_button_toggled), fs); gtk_widget_show(w); fs->filter_buttons[i++] = w; gtk_table_attach(GTK_TABLE(table), w, 0, 3, 5, 6, GTK_FILL, 0, 0, 0); w = gtk_check_button_new_with_label("Show server-side font aliases"); gtk_object_set_data(GTK_OBJECT(w), "user-data", GINT_TO_POINTER(FONTFLAG_SERVERALIAS)); gtk_signal_connect(GTK_OBJECT(w), "toggled", GTK_SIGNAL_FUNC(unifontsel_button_toggled), fs); gtk_widget_show(w); fs->filter_buttons[i++] = w; gtk_table_attach(GTK_TABLE(table), w, 0, 3, 6, 7, GTK_FILL, 0, 0, 0); w = gtk_check_button_new_with_label("Show non-monospaced fonts"); gtk_object_set_data(GTK_OBJECT(w), "user-data", GINT_TO_POINTER(FONTFLAG_NONMONOSPACED)); gtk_signal_connect(GTK_OBJECT(w), "toggled", GTK_SIGNAL_FUNC(unifontsel_button_toggled), fs); gtk_widget_show(w); fs->filter_buttons[i++] = w; gtk_table_attach(GTK_TABLE(table), w, 0, 3, 7, 8, GTK_FILL, 0, 0, 0); assert(i == lenof(fs->filter_buttons)); fs->filter_flags = FONTFLAG_CLIENTSIDE | FONTFLAG_SERVERSIDE; unifontsel_set_filter_buttons(fs); /* * Go and find all the font names, and set up our master font * list. */ fs->fonts_by_realname = newtree234(fontinfo_realname_compare); fs->fonts_by_selorder = newtree234(fontinfo_selorder_compare); for (i = 0; i < lenof(unifont_types); i++) unifont_types[i]->enum_fonts(GTK_WIDGET(fs->u.window), unifontsel_add_entry, fs); /* * And set up the initial font names list. */ unifontsel_setup_familylist(fs); fs->selected = NULL; return (unifontsel *)fs; } void unifontsel_destroy(unifontsel *fontsel) { unifontsel_internal *fs = (unifontsel_internal *)fontsel; fontinfo *info; freetree234(fs->fonts_by_selorder); while ((info = delpos234(fs->fonts_by_realname, 0)) != NULL) sfree(info); freetree234(fs->fonts_by_realname); gtk_widget_destroy(GTK_WIDGET(fs->u.window)); sfree(fs); } void unifontsel_set_name(unifontsel *fontsel, const char *fontname) { unifontsel_internal *fs = (unifontsel_internal *)fontsel; int i, start, end, size; const char *fontname2; fontinfo *info; /* * Provide a default if given an empty or null font name. */ if (!fontname || !*fontname) fontname = "fixed"; /* Pango zealots might prefer "Monospace 12" */ /* * Call the canonify_fontname function. */ fontname = unifont_do_prefix(fontname, &start, &end); for (i = start; i < end; i++) { fontname2 = unifont_types[i]->canonify_fontname (GTK_WIDGET(fs->u.window), fontname, &size); if (fontname2) break; } if (i == end) return; /* font name not recognised */ /* * Now look up the canonified font name in our index. */ info = find234(fs->fonts_by_realname, (char *)fontname2, fontinfo_realname_find); /* * If we've found the font, and its size field is either * correct or zero (the latter indicating a scalable font), * then we're done. Otherwise, try looking up the original * font name instead. */ if (!info || (info->size != size && info->size != 0)) { info = find234(fs->fonts_by_realname, (char *)fontname, fontinfo_realname_find); if (!info || info->size != size) return; /* font name not in our index */ } /* * Now we've got a fontinfo structure and a font size, so we * know everything we need to fill in all the fields in the * dialog. */ unifontsel_select_font(fs, info, size, 0); } char *unifontsel_get_name(unifontsel *fontsel) { unifontsel_internal *fs = (unifontsel_internal *)fontsel; char *name; assert(fs->selected); if (fs->selected->size == 0) { name = fs->selected->fontclass->scale_fontname (GTK_WIDGET(fs->u.window), fs->selected->realname, fs->selsize); if (name) return name; } return dupstr(fs->selected->realname); } Node-path: putty-gtk2/unix/gtkfont.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b74c7da3836113766b281320e23b0675 Text-delta-base-sha1: 76732248341b0236e01e40406a6b39eee6a32331 Text-content-length: 758 Text-content-md5: 0f07f918fc3213c63254c123e83752e3 Text-content-sha1: ec2c51dbbfdbbf3df0acf0a5a543508c8b1a8b6b Content-length: 758 SVN��]0Z�,�� 7F!<onst char *name, /* * Unified font selector dialog. I can't be bothered to do a * proper GTK subclassing today, so this will just be an ordinary * data structure with some useful members. * * (Of course, these aren't the only members; this structure is * contained within a bigger one which holds data visible only to * the implementation.) */ typedef struct unifontsel { void *user_data; /* settable by the user */ GtkWindow *window; GtkWidget *ok_button, *cancel_button; } unifontsel; unifontsel *unifontsel_new(const char *wintitle); void unifontsel_destroy(unifontsel *fontsel); void unifontsel_set_name(unifontsel *fontsel, const char *fontname); char *unifontsel_get_name(unifontsel *fontsel Revision-number: 7939 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2008-03-26T18:16:52.317482Z K 7 svn:log V 19 Placate optimiser. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e1493ac59897d55c65b33ad4e7620f8d Text-delta-base-sha1: 5a60774cef67edd4185b20ef1ed8c698c43f5a06 Text-content-length: 32 Text-content-md5: 7ea7689e4b0c566ef7ab73613f638b06 Text-content-sha1: b51748a44b69532862a5974a739ef922a090021e Content-length: 32 SVN��mt �h��h = NULL Revision-number: 7940 Prop-content-length: 426 Content-length: 426 K 7 svn:log V 325 Add ifdefs for older versions of GTK2 and Pango. Unfortunately, the latter require manual input to the Makefile, since the Pango developers in their unbounded wisdom (that is, unbounded below) didn't bother to start providing the PANGO_VERSION macros until release 1.16 - ten releases _after_ everything I'm trying to check! K 10 svn:author V 5 simon K 8 svn:date V 27 2008-03-26T18:30:20.740404Z PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3efa52598ebc6dafac8852acf0849c30 Text-delta-base-sha1: 291a754755c2300335a2294d0526d85ebeb5ab9d Text-content-length: 127 Text-content-md5: 96575f1b7eeeb5386e5fa6331b0b3973 Text-content-sha1: 077b20c01ba2dca3a0c2af6558322c5e4a48976e Content-length: 127 SVN��=ad�(�d�Uh#if GTK_CHECK_VERSION(2,4,0) gtk_alignment_set_padding(GTK_ALIGNMENT(align), 8, 8, 8, 8); #endif Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7ea7689e4b0c566ef7ab73613f638b06 Text-delta-base-sha1: b51748a44b69532862a5974a739ef922a090021e Text-content-length: 1753 Text-content-md5: 517fc3e748babc47e3128c540781b5c0 Text-content-sha1: fe945d371e4cae40826f7b73d00ad72943224d74 Content-length: 1753 SVN��twT�$��#:�Xa�"8�1Ux� 0�U;�,+�r�X:�hz�Xa�)8]� z�-h �-G#ifndef PANGO_PRE_1POINT6 PangoFontMap *map; #endif#ifndef PANGO_PRE_1POINT6#else fset = pango_context_load_fontset(ctx, desc, pango_context_get_language(ctx)); #endif#ifndef PANGO_PRE_1POINT6 PangoFontMap *map; #endif PangoFontFamily **families; int i, nfamilies; ctx = gtk_widget_get_pango_context(widget); if (!ctx) return; /* * Ask Pango for a list of font families, and iterate through * them. */ #ifndef PANGO_PRE_1POINT6 map = pango_context_get_font_map(ctx); if (!map) return; pango_font_map_list_families(map, &families, &nfamilies); #else pango_context_list_families(ctx, &families, &nfamilies); #endif#ifndef PANGO_PRE_1POINT4 /* * In very early versions of Pango, we can't tell * monospaced fonts from non-monospaced. */#endif#ifndef PANGO_PRE_1POINT4 pango_font_face_list_sizes(face, &sizes, &nsizes); #else /* * In early versions of Pango, that call wasn't * supported; we just have to assume everything is * scalable. */ sizes = NULL; #endif#ifndef PANGO_PRE_1POINT6 PangoFontMap *map; #endif#ifndef PANGO_PRE_1POINT6#else fset = pango_context_load_fontset(ctx, desc, pango_context_get_language(ctx)); #endiff (minval < 0) return; /* somehow a charset heading got clicked */#if GTK_CHECK_VERSION(2,10,0) g_object_ref_sink(label); g_object_unref(label); #else gtk_object_sink(GTK_OBJECT(label)); #endif Revision-number: 7941 Prop-content-length: 295 Content-length: 295 K 8 svn:date V 27 2008-03-26T20:20:25.947149Z K 7 svn:log V 194 Sort the styles of Pango font families into a sensible order, instead of alphabetical order. This is more than cosmetic: it's important because the first one in the list is selected by default. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 517fc3e748babc47e3128c540781b5c0 Text-delta-base-sha1: fe945d371e4cae40826f7b73d00ad72943224d74 Text-content-length: 1074 Text-content-md5: 6c89e5ab28cf30c450274525d8594df1 Text-content-sha1: 71e1444ca23a903f2195108006e8b0edd08ee967 Content-length: 1074 SVN��VVN�d��0]�G �Q�Ld�w.9�P�c�Nf�.|�P)�ph�{construct a stylekey for X11 fontsconst char *stylekey, NULL char stylekey[128]Construct the sorting key for font styles. */ { char *p = stylekey; int n; n = pango_font_description_get_weight(desc); /* Weight: normal, then lighter, then bolder */ if (n <= PANGO_WEIGHT_NORMAL) n = PANGO_WEIGHT_NORMAL - n; p += sprintf(p, "%4d", n); n = pango_font_description_get_style(desc); p += sprintf(p, " %2d", n); n = pango_font_description_get_stretch(desc); /* Stretch: closer to normal sorts earlier */ n = 2 * abs(PANGO_STRETCH_NORMAL - n) + (n < PANGO_STRETCH_NORMAL); p += sprintf(p, " %2d", n); n = pango_font_description_get_variant(desc); p += sprintf(p, " %2d", n); }stylekey, *stylekeykey, b->stylekeyconst char *stylekey, (stylekey ? strlen(stylekeyif (stylekey) { info->stylekey = p; strcpy(p, stylekey); p += 1+strlen(p); } else info->stylekey Revision-number: 7942 Prop-content-length: 152 Content-length: 152 K 7 svn:log V 52 Tune the sorting of the style list box for X fonts. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-03-26T21:33:10.663205Z PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6c89e5ab28cf30c450274525d8594df1 Text-delta-base-sha1: 71e1444ca23a903f2195108006e8b0edd08ee967 Text-content-length: 1467 Text-content-md5: 0b35c9d710f871f076f732058dac9237 Text-content-sha1: ba6e37f9f13b5bfb731280d887a5a7d486b25503 Content-length: 1467 SVN��V*&�d�� ~�9d@�ZA�<\�:stylekey, *charset; int j, weightkey, slantkey, setwidthkey; int thistmpsize, fontsize, flags; thistmpsize = 4quite a lot of the fields, * with some strange formatting. if (components[5][0]) p += sprintf(p, " %s", components[5]); /* * Style key is the same stuff as above, but with a * couple of transformations done on it to make it * sort more sensibly. */ p++; stylekey = p; if (!g_strcasecmp(components[2], "medium") || !g_strcasecmp(components[2], "regular") || !g_strcasecmp(components[2], "normal") || !g_strcasecmp(components[2], "book")) weightkey = 0; else if (!g_strncasecmp(components[2], "demi", 4) || !g_strncasecmp(components[2], "semi", 4)) weightkey = 1; else weightkey = 2; if (!g_strcasecmp(components[3], "r")) slantkey = 0; else if (!g_strncasecmp(components[3], "r", 1)) slantkey = 2; else slantkey = 1; if (!g_strcasecmp(components[4], "normal")) setwidthkey = 0; else setwidthkey = 1; p += sprintf(p, "%04d%04d%s%04d%04d%s%04d%04d%s%04d%s%04d%s", weightkey, strlen(components[2]), components[2], slantkey, strlen(components[3]), components[3], setwidthkey, strlen(components[4]), components[4], strlen(components[10]), components[10], strlen(components[5]), components[5]); assert(p - tmp < thistmpsizestylekey Revision-number: 7943 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-03-28T00:35:50.927070Z PROPS-END Revision-number: 7944 Prop-content-length: 492 Content-length: 492 K 8 svn:date V 27 2008-03-27T19:41:08.167681Z K 7 svn:log V 391 More consistent handling of X11 font aliases: we now don't resolve them automatically. If the user selects an alias in the font selector, they get that alias copied literally into the output font name string; when they return to the font selector, the alias is still selected. We still _can_ resolve aliases, but we only do it on demand: double-clicking one in the list box will do the job. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b35c9d710f871f076f732058dac9237 Text-delta-base-sha1: ba6e37f9f13b5bfb731280d887a5a7d486b25503 Text-content-length: 6057 Text-content-md5: 487c6b454fbc3c8c9a2a2b00ea9d86be Text-content-sha1: a12cd76d724deaeca144591b9167318500d32b2b Content-length: 6057 SVN��*+o�<�;�134�PY�U)�G~�#EI�%o�>�� �@ �wM�>H�J�Z3G�@�I�i`�C@�9sR�@�6&|�/U�n}�?kpreview pane fixes: * + better centring of text? (Garuda is a particularly oddly * behaved font in this respect; are its metrics going weird * for some reason?) * + pick a better few lines of preview text. Should take care * to use wide letters (MWmw) and narrow ones (ij). * + resize to fitconsistency and updating issues: * + the preview pane is empty when the dialog comes up * + we should attempt to preserve font size when switching * font family and style (it's currently OK as long as we're * moving between scalable fonts but falls down badly * otherwise) * * - generalised style and padding polish * + gtk_scrolled_window_set_shadow_type(foo, GTK_SHADOW_IN); * might be worth considering, int resolve_aliases, int resolve_aliases, int resolve_aliases wildcard. * * However, we must carefully avoid canonifying font * _aliases_, unless specifically asked to, because the font * selector treats them as worthwhile in their own rightewname = XGetAtomName(disp, (Atom)ret); if (new && fsize > 0) { *size = fsize; gdk_font_unref(font); return dupstr(name[0] == '-' || resolve_aliases ? newname : , int resolve_aliases, int resolve_aliasesGtkWidget *preview_area; GdkPixmap *preview_pixmap; int preview_width, preview_height; GdkColor preview_fg, preview_bg/* * Instantiate the font and draw some preview text. */ { unifont *font; char *sizename; sizename = info->fontclass->scale_fontname (GTK_WIDGET(fs->u.window), info->realname, fs->selsize); font = info->fontclass->create(GTK_WIDGET(fs->u.window), sizename ? sizename : info->realname, FALSE, FALSE, 0, 0); if (font && fs->preview_pixmap) { GdkGC *gc = gdk_gc_new(fs->preview_pixmap); gdk_gc_set_foreground(gc, &fs->preview_bg); gdk_draw_rectangle(fs->preview_pixmap, gc, 1, 0, 0, fs->preview_width, fs->preview_height); gdk_gc_set_foreground(gc, &fs->preview_fg); info->fontclass->draw_text(fs->preview_pixmap, gc, font, font->width, font->height, "hello, world", 12, FALSE, FALSE, font->width); gdk_gc_unref(gc); gdk_window_invalidate_rect(fs->preview_area->window, NULL, FALSE); } info->fontclass->destroy(font); sfree(sizename); }static void alias_resolve(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data) { unifontsel_internal *fs = (unifontsel_internal *)data; GtkTreeIter iter; int minval, newsize; fontinfo *info, *newinfo; char *newnamegtk_tree_model_get_iter(GTK_TREE_MODEL(fs->family_model), &iter, path); 1,&minval, -1); info = (fontinfo *)index234(fs->fonts_by_selorder, minval); if (info) { newname = info->fontclass->canonify_fontname (GTK_WIDGET(fs->u.window), info->realname, &newsize, TRUE); newinfo = find234(fs->fonts_by_realname, (char *)newname, fontinfo_realname_find); sfree(newname); if (!newinfo) return; /* font name not in our index */ if (newinfo == info) return; /* didn't change under canonification => not an alias */ unifontsel_select_font(fs, newinfo, newinfo->size ? newinfo->size : newsize, 1); } } static gint unifontsel_expose_area(GtkWidget *widget, GdkEventExpose *event, gpointer data) { unifontsel_internal *fs = (unifontsel_internal *)data; if (fs->preview_pixmap) { gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], fs->preview_pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); } return TRUE; } static gint unifontsel_configure_area(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { unifontsel_internal *fs = (unifontsel_internal *)data; GdkGC *gc; int ox, oy, nx, ny, x, y; /* * Enlarge the pixmap, but never shrink it. */ ox = fs->preview_width; oy = fs->preview_height; x = event->width; y = event->height; if (x > ox || y > oy) { GdkPixmap *newpm; nx = (x > ox ? x : ox); ny = (y > oy ? y : oy); newpm = gdk_pixmap_new(widget->window, nx, ny, -1); gc = gdk_gc_new(newpm); gdk_gc_set_foreground(gc, &fs->preview_bg); gdk_draw_rectangle(newpm, gc, 1, 0, 0, nx, ny); if (fs->preview_pixmap) { gdk_draw_pixmap(newpm, gc, fs->preview_pixmap, 0, 0, 0, 0, ox, oy); gdk_pixmap_unref(fs->preview_pixmap); } gdk_gc_unref(gc); fs->preview_pixmap = newpm; fs->preview_width = nx; fs->preview_height = ny; } gdk_window_invalidate_rect(widget->window, NULL, FALSE); return TRUE;previewpreview_height = 5 g_signal_connect(G_OBJECT(w), "row-activated", G_CALLBACK(alias_resolvefs->preview_area = gtk_drawing_area_new(); fs->preview_pixmap = NULL; fs->preview_width = 0; fs->preview_height = 0; fs->preview_fg.pixel = fs->preview_bg.pixel = 0; fs->preview_fg.red = fs->preview_fg.green = fs->preview_fg.blue = 0x0000; fs->preview_bg.red = fs->preview_bg.green = fs->preview_bg.blue = 0xFFFF; gdk_colormap_alloc_color(gdk_colormap_get_system(), &fs->preview_fg, FALSE, FALSE); gdk_colormap_alloc_color(gdk_colormap_get_system(), &fs->preview_bg, FALSE, FALSE); gtk_signal_connect(GTK_OBJECT(fs->preview_area), "expose_event", GTK_SIGNAL_FUNC(unifontsel_expose_area), fs); gtk_signal_connect(GTK_OBJECT(fs->preview_area), "configure_event", GTK_SIGNAL_FUNC(unifontsel_configure_area), fs); gtk_widget_set_size_request(fs->preview_area, 1, preview_height); gtk_widget_show(fs->preview_area); gtk_table_attach(GTK_TABLE(table), fs->preview_area, 0, 3, 3, 4, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0)if (fs->preview_pixmap) gdk_pixmap_unref(fs->preview_pixmap), FALSE Revision-number: 7945 Prop-content-length: 324 Content-length: 324 K 8 svn:date V 27 2008-03-27T19:53:28.670780Z K 7 svn:log V 223 Move the font-preview updating code out into a separate function so we can call it both when the drawing area changes size and when the selected font changes. As a result, the preview pane doesn't start off blank any more. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 487c6b454fbc3c8c9a2a2b00ea9d86be Text-delta-base-sha1: a12cd76d724deaeca144591b9167318500d32b2b Text-content-length: 1295 Text-content-md5: 76ded3ac853c9f2a6b721d79dba0d165 Text-content-sha1: ac9a5b7e527fc7fc9ffa4d4b4385352c59647286 Content-length: 1295 SVN��)X�R��_)�R�)"�]Z�{draw_preview_text(unifontsel_internal *fs) { unifont *font; char *sizename; fontinfo *info = fs->selected; sizename = info->fontclass->scale_fontname (GTK_WIDGET(fs->u.window), info->realname, fs->selsize); font = info->fontclass->create(GTK_WIDGET(fs->u.window), sizename ? sizename : info->realname, FALSE, FALSE, 0, 0); if (font && fs->preview_pixmap) { GdkGC *gc = gdk_gc_new(fs->preview_pixmap); gdk_gc_set_foreground(gc, &fs->preview_bg); gdk_draw_rectangle(fs->preview_pixmap, gc, 1, 0, 0, fs->preview_width, fs->preview_height); gdk_gc_set_foreground(gc, &fs->preview_fg); info->fontclass->draw_text(fs->preview_pixmap, gc, font, font->width, font->height, "hello, world", 12, FALSE, FALSE, font->width); gdk_gc_unref(gc); gdk_window_invalidate_rect(fs->preview_area->window, NULL, FALSE); } info->fontclass->destroy(font); sfree(sizename);unifontsel_draw_preview_text(fs);if (fs->preview_pixmap) gdk_pixmap_unref(fs->preview_pixmap); nx = (x > ox ? x : ox); ny = (y > oy ? y : oy); fs->preview_pixmap = gdk_pixmap_new(widget->window, nx, ny, -1); fs->preview_width = nx; fs->preview_height = ny; unifontsel_draw_preview_text(fs) Revision-number: 7946 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2008-03-28T20:08:12.798151Z K 7 svn:log V 31 Improve the preview pane text. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 76ded3ac853c9f2a6b721d79dba0d165 Text-delta-base-sha1: ac9a5b7e527fc7fc9ffa4d4b4385352c59647286 Text-content-length: 1225 Text-content-md5: 34db554eeb1d05bbeab7f4776d2d44e9 Text-content-sha1: dfe10bb78d223ae4580250bfb20d856461d39789 Content-length: 1225 SVN��v'�<��''�l&/* * The pangram used here is rather carefully constructed: * it contains a sequence of very narrow letters (`jil') * and a pair of adjacent very wide letters (`wm'). * * If the user selects a proportional font, it will be * coerced into fixed-width character cells when used in * the actual terminal window. We therefore display it the * same way in the preview pane, so as to show it the way * it will actually be displayed - and we deliberately * pick a pangram which will show the resulting miskerning * at its worst. * * We aren't trying to sell people these fonts; we're * trying to let them make an informed choice. Better that * they find out the problems with using proportional * fonts in terminal windows here than that they go to the * effort of selecting their font and _then_ realise it * was a mistake. */ info->fontclass->draw_text(fs->preview_pixmap, gc, font, 0, font->ascent, "bankrupt jilted showmen quiz convex fogey", 41, FALSE, FALSE, font->width); info->fontclass->draw_text(fs->preview_pixmap, gc, font, 0, font->ascent + font->height, "BANKRUPT JILTED SHOWMEN QUIZ CONVEX FOGEY", 41, Revision-number: 7947 Prop-content-length: 428 Content-length: 428 K 7 svn:log V 327 When the user switches between fonts using the font family or style selectors, preserve their most recent size selection as faithfully as possible. We do this by having a secondary size variable indicating what they _intend_, so we can come back to their intended size even after going through a font which doesn't include it. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-03-29T10:16:48.123408Z PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 34db554eeb1d05bbeab7f4776d2d44e9 Text-delta-base-sha1: dfe10bb78d223ae4580250bfb20d856461d39789 Text-content-length: 3778 Text-content-md5: 1697c963f206d8e5610259264a484478 Text-content-sha1: 304700de3f6c28d900610651359d8c610816ba73 Content-length: 3778 SVN��vd.�<�l�R1� SX�_Y�'4�]c�^&�" �1*�~Nh�@A�<z�}<�,p+�ie�'N�/u�E&� kadd a third line of sample text containing digits and punct * * - start drawing X fonts one character at a time, at least if * they're not fixed-width? Now we have that helpful pangram, * we should make it work for everyone. + work out why the list boxes don't go all the way to the * RHS of the dialog box, intendedf (font) { info->fontclass->draw_text(fs->preview_pixmap, gc, font, 0, font->ascent, "bankrupt jilted showmen quiz convex fogey", 41, FALSE, FALSE, font->width); info->fontclass->draw_text(fs->preview_pixmap, gc, font, 0, font->ascent + font->height, "BANKRUPT JILTED SHOWMEN QUIZ CONVEX FOGEY", 41, FALSE, FALSE, font->width); } if (font) , int size_is_explici if (size_is_explicit) fs->intendedfontinfo *update_for_intended_size(unifontsel_internal *fs, fontinfo *info) { fontinfo info2, *below, *above; int pos; /* * Copy the info structure. This doesn't copy its dynamic * string fields, but that's unimportant because all we're * going to do is to adjust the size field and use it in one * tree search. */ info2 = *info; info2.size = fs->intendedsize; /* * Search in the tree to find the fontinfo structure which * best approximates the size the user last requested. */ below = findrelpos234(fs->fonts_by_selorder, &info2, NULL, REL234_LE, &pos); above = index234(fs->fonts_by_selorder, pos+1); /* * See if we've found it exactly, which is an easy special * case. If we have, it'll be in `below' and not `above', * because we did a REL234_LE rather than REL234_LT search. */ if (!fontinfo_selorder_compare(&info2, below)) return below; /* * Now we've either found two suitable fonts, one smaller and * one larger, or we're at one or other extreme end of the * scale. Find out which, by NULLing out either of below and * above if it differs from this one in any respect but size * (and the disambiguating index field). Bear in mind, also, * that either one might _already_ be NULL if we're at the * extreme ends of the font list. */ if (below) { info2.size = below->size; info2.index = below->index; if (fontinfo_selorder_compare(&info2, below)) below = NULL; } if (above) { info2.size = above->size; info2.index = above->index; if (fontinfo_selorder_compare(&info2, above)) above = NULL; } /* * Now return whichever of above and below is non-NULL, if * that's unambiguous. */ if (!above) return below; if (!below) return above; /* * And now we really do have to make a choice about whether to * round up or down. We'll do it by rounding to nearest, * breaking ties by rounding up. */ if (above->size - fs->intendedsize <= fs->intendedsize - below->size) return above; else return belowinfo = update_for_intended_size(fs, info); if (!info) return; /* _shouldn't_ happen unless font list is completely funted */ if (!info->size) fs->selsize = fs->intendedsize; /* font is scalable */ unifontsel_select_font(fs, info, info->size ? info->size : fs->selsize, 1, FALSE); } static void stylinfo = update_for_intended_size(fs, info); if (!info) return; /* _shouldn't_ happen unless font list is completely funted */ if (!info->size) fs->selsize = fs->intendedsize; /* font is scalable */ unifontsel_select_font(fs, info, info->size ? info->size : fs->selsize, 2, FALSE, TRUE, TRUE 1, TRUE, TRUE Revision-number: 7948 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2008-03-29T10:25:45.188262Z K 7 svn:log V 50 Add the rest of ASCII to the font preview window. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1697c963f206d8e5610259264a484478 Text-delta-base-sha1: 304700de3f6c28d900610651359d8c610816ba73 Text-content-length: 1814 Text-content-md5: a300d4ed492efaafb03ee5d5449bf5db Text-content-sha1: feaeaf5cb5d9dca854d603306717a63a165426a6 Content-length: 1814 SVN��dN#e�<��^�M?� S|�%? + sort out the behaviour when resizingif (font) { /* * The pangram used here is rather carefully * constructed: it contains a sequence of very narrow * letters (`jil') and a pair of adjacent very wide * letters (`wm'). * * If the user selects a proportional font, it will be * coerced into fixed-width character cells when used * in the actual terminal window. We therefore display * it the same way in the preview pane, so as to show * it the way it will actually be displayed - and we * deliberately pick a pangram which will show the * resulting miskerning at its worst. * * We aren't trying to sell people these fonts; we're * trying to let them make an informed choice. Better * that they find out the problems with using * proportional fonts in terminal windows here than * that they go to the effort of selecting their font * and _then_ realise it was a mistake. */ /* * The ordering of punctuation here is also selected * with some specific aims in mind. I put ` and ' * together because some software (and people) still * use them as matched quotes no matter what Unicode * might say on the matter, so people can quickly * check whether they look silly in a candidate font. * The sequence #_@ is there to let people judge the * suitability of the underscore as an effectively * alphabetic character (since that's how it's often * used in practice, at least by programmers). */ info->fontclass->draw_text(fs->preview_pixmap, gc, font, 0, font->ascent + font->height * 2, "0123456789!?,.:;<>()[]{}\\/`'\"+*-=~#_@|%&^$", 42 Revision-number: 7949 Prop-content-length: 513 Content-length: 513 K 8 svn:date V 27 2008-03-29T10:48:16.427290Z K 7 svn:log V 412 Detect non-monospaced X fonts, and respond by drawing text one character at a time centred in its character cell, as we do for Pango. Gives much better results for those non-monospaced fonts which are usable as terminal fonts, and shows up the problems with the others more readily. (In particular, this means the preview pane in the font selector now warns you there will be trouble if you select such a font.) K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a300d4ed492efaafb03ee5d5449bf5db Text-delta-base-sha1: feaeaf5cb5d9dca854d603306717a63a165426a6 Text-content-length: 1831 Text-content-md5: f4e24c90760bfefd38a20103c8ea723c Text-content-sha1: 609cecfa260ae7a8ee79f2c0d7a6c697c88dc0ad Content-length: 1831 SVN��N-NK�<��xm:�IU�f�!r�Sy�'I\�?d�; �9� Hu�9`variable' is true iff the font is non-fixed-pitch. This * enables some code which takes greater care over character * positioning during text drawing. */ int variable00, spacing; unsigned long registry_ret, encoding_ret, spacing_ret; int pubcs, realcs, sixteen_bit, variable variable = TRUspacing = XInternAtom(disp, "SPACING", False); if (XGetFontProperty(xfs, spacing, &spacing_ret)) { char *spc; spc = XGetAtomName(disp, (Atom)spacing_ret); if (spc && strchr("CcMm", spc[0])) variable = FALSE;variable = variablereally_draw_text(GdkDrawable *target, GdkFont *font, GdkGC *gc, int x, int y, const gchar *string, int clen, int nchars, int shadowbold, int shadowoffset, int fontvariable, int cellwidth) { int step = clen * nchars, nsteps = 1, centre = FALSE; if (fontvariable) { /* * In a variable-pitch font, we draw one character at a * time, and centre it in the character cell. */ step = clen; nsteps = nchars; centre = TRUE; } while (nsteps-- > 0) { int X = x; if (centre) X += (cellwidth - gdk_text_width(font, string, step)) / 2; gdk_draw_text(target, font, gc, X, y, string, step); if (shadowbold) gdk_draw_text(target, font, gc, X + shadowoffset, y, string, step); x += cellwidth; string += step; } int mult = (wide ? 2 : 1)x11font_really_draw_text(target, xfont->fonts[sfid], gc, x, y, (gchar *)xcs, 2, nchars, shadowbold, xfont->shadowoffset, xfont->variable, cellwidth * mult); sfree(xcs); sfree(wcs); } else { x11font_really_draw_text(target, xfont->fonts[sfid], gc, x, y, string, 1, len, shadowbold, xfont->shadowoffset, xfont->variable, cellwidth * mult Revision-number: 7950 Prop-content-length: 120 Content-length: 120 K 8 svn:date V 27 2008-03-29T13:55:40.160397Z K 7 svn:log V 20 Cosmetic polishing. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f4e24c90760bfefd38a20103c8ea723c Text-delta-base-sha1: 609cecfa260ae7a8ee79f2c0d7a6c697c88dc0ad Text-content-length: 1052 Text-content-md5: fa21e76872e8cc057dd83d497a0a7f32 Text-content-sha1: e84c7b3151b80e4bda5d7016d50d02939b47faeb Content-length: 1052 SVN��-~S;�<�q��O�j.�_u�cVO�J.�8zO�J.�q!�F?�'generalised style and padding polish * + work out why the list boxes don't go all the way to the * RHS ofwscrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_IN GTK_EXPAND | GTK_FILLscrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_IN GTK_EXPAND | GTK_FILLscrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_INww = fs->preview_area; w = gtk_frame_new(NULL); gtk_container_add(GTK_CONTAINER(w), ww); gtk_widget_show(w); ww = w; /* GtkAlignment seems to be the simplest way to put padding round things */ w = gtk_alignment_new(0, 0, 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(w), 8, 8, 8, 8); gtk_container_add(GTK_CONTAINER(w), ww); gtk_widget_show(w); ww = w; w = gtk_frame_new("Preview of font"); gtk_container_add(GTK_CONTAINER(w), ww); gtk_widget_show(w); gtk_table_attach(GTK_TABLE(table), w8 Revision-number: 7951 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2008-03-29T13:55:51.081155Z K 7 svn:log V 68 Richard B points out another thing for the overall GTK2 to-do list. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 779292f0aa2f4835b54192f0ddcc10fe Text-delta-base-sha1: db7e9c35b44746d17dd80df22e95e13e007b2123 Text-content-length: 242 Text-content-md5: 66c5ae6ba3e44e95713c2e397a8427fc Text-content-sha1: 690084b1d7d28a9ff8c0e8fa6a65e2d44366dc84 Content-length: 242 SVN��kH Z�<�Z�29 - Update the autoconf build. Richard B says he had to replace AM_PATH_GTK([1.2.0], with AM_PATH_GTK_2_0([2.0.0], + also I'll need to detect early Pangoi and enable my magic switches in gtkfont.c Revision-number: 7952 Prop-content-length: 210 Content-length: 210 K 8 svn:date V 27 2008-03-29T13:59:31.207416Z K 7 svn:log V 109 Prevent NULL-dereferencing segfaults when the font selector is invoked with no valid font in the input text. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fa21e76872e8cc057dd83d497a0a7f32 Text-delta-base-sha1: e84c7b3151b80e4bda5d7016d50d02939b47faeb Text-content-length: 360 Text-content-md5: d52c27901841a92eb7282bbb3597853d Text-content-sha1: e3e4e1017b38c8ce7aa16d26ea02e2b8efebdd4b Content-length: 360 SVN��~4K�=�K�,R = NULL; fontinfo *info = fs->selected; if (info) { sizename = info->fontclass->scale_fontname (GTK_WIDGET(fs->u.window), info->realname, fs->selsize); font = info->fontclass->create(GTK_WIDGET(fs->u.window), sizename ? sizename : info->realname, FALSE, FALSE, 0, 0); } else font = NULL; Revision-number: 7953 Prop-content-length: 709 Content-length: 709 K 8 svn:date V 27 2008-03-29T14:21:25.013696Z K 7 svn:log V 608 Deal with the possibility of no valid font being selected at all during an entire run of unifontsel (because unifontsel_set_name was either not called at all, or called with a name that didn't correspond to any known font). In this situation we grey out the OK button until a valid font is selected, and we have unifontsel_get_name return NULL rather than failing an assertion if it should be called in that state. The current client code in gtkdlg.c should never encounter a NULL return, since it only calls it after the OK button is clicked, but I've stuck an assertion in there too on general principles. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 96575f1b7eeeb5386e5fa6331b0b3973 Text-delta-base-sha1: 077b20c01ba2dca3a0c2af6558322c5e4a48976e Text-content-length: 96 Text-content-md5: d8df977b7f36a1e11b289b43b0a1862d Text-content-sha1: edab4584987c3caec9176bc9dd3b43b7563e2c66 Content-length: 96 SVN��a+E�^�E�Yassert(name); /* should always be ok after OK pressed */ Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d52c27901841a92eb7282bbb3597853d Text-delta-base-sha1: e3e4e1017b38c8ce7aa16d26ea02e2b8efebdd4b Text-content-length: 236 Text-content-md5: 899f73651e157754d50d6ce8cb42370d Text-content-sha1: 38f34cae6041c80abdee770db61154e45511cd15 Content-length: 236 SVN��4kB� ��t��mGgtk_widget_set_sensitive(fs->u.ok_button, TRUE) fs->selsize = fs->intendedsize = 13; /* random default */ gtk_widget_set_sensitive(fs->u.ok_button, FALSE)if (!fs->selected) return NULL Revision-number: 7954 Prop-content-length: 608 Content-length: 608 K 8 svn:date V 27 2008-03-29T14:54:55.428587Z K 7 svn:log V 507 Aha, _that's_ why there was some unexplained space on the RHS of the font selector: I had got the row and column counts in gtk_table_new() back to front, so the space on the right was the padding around five empty table columns! (And apparently a GtkTable silently expands if you try to use rows that don't exist, which is why I hadn't already noticed.) Fixed that, and added some padding around the entire table. I think my font selector is now finished, except for any bug fixes that come up in testing. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 899f73651e157754d50d6ce8cb42370d Text-delta-base-sha1: 38f34cae6041c80abdee770db61154e45511cd15 Text-content-length: 285 Text-content-md5: a5229fa1ece451ce29b7a044981664a9 Text-content-sha1: cd91dc445f33941d30a793585cf32c0e9eb9ef33 Content-length: 285 SVN��k'h���%m]�^^j�?�vU�tw8, 3, FALSE); gtk_widget_show(table); gtk_table_set_col_spacings(GTK_TABLE(table), 8)table); gtk_widget_show(w); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(fs->u.window)->vbox), w/* * Preview widget. */ Revision-number: 7955 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2008-03-29T14:57:56.143045Z K 7 svn:log V 14 TODO updates. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 66c5ae6ba3e44e95713c2e397a8427fc Text-delta-base-sha1: 690084b1d7d28a9ff8c0e8fa6a65e2d44366dc84 Text-content-length: 760 Text-content-md5: 25c05e3061807ccecaaea937051b63d9 Text-content-sha1: db2580f8ad5406fc8b31481864e2abd5652d6614 Content-length: 760 SVN��H;P�;�^�V�l,�2Although I'm still stubbornly _supporting_ X11 fonts alongside Pango ones in defiance of standard GTK2 policy, it might be a good idea to at least switch the default font to Pango's Monospace 12, not least so that font aliases don't come up selected by default. Then again, perhaps keeping fixed as the default is more traditional. Hmm + trouble with this is that I have no idea what it's actually doing. Perhaps the thing to do is to debug through the GTK1 version and see when it gets called and what happens if I take it out? + and I'll probably also want to detect GTK2 vs GTK1 automatically - _and_ provide a command line switch on configure to select one manually Revision-number: 7956 Prop-content-length: 305 Content-length: 305 K 8 svn:date V 27 2008-03-29T15:44:32.923180Z K 7 svn:log V 204 Be more picky than Pango when validating a Pango font description string. Without this, Richard B reports that Pango 1.18 will treat _anything_ as valid, which means PuTTY can never fall back to X fonts. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a5229fa1ece451ce29b7a044981664a9 Text-delta-base-sha1: cd91dc445f33941d30a793585cf32c0e9eb9ef33 Text-content-length: 1401 Text-content-md5: 63c6d21537c6fa759cd25412c6af7985 Text-content-sha1: d019d41d4c095665499224d0bcec150e46fa1f30 Content-length: 1401 SVN��XG$� �k�mj,�dv� Z��x�'<�K��ef�Tf�c/* * This function is used to rigorously validate a * PangoFontDescription. Later versions of Pango have a nasty * habit of accepting _any_ old string as input to * pango_font_description_from_string and returning a font * description which can actually be used to display text, even if * they have to do it by falling back to their most default font. * This is doubtless helpful in some situations, but not here, * because we need to know if a Pango font string actually _makes * sense_ in order to fall back to treating it as an X font name * if it doesn't. So we check that the font family is actually one * supported by Pango. */ static int pangofont_check_desc_makes_sense(PangoContext *ctx, PangoFontDescription *desc) {, matched; /* * Ask Pango for a list of font families, and iterate through * them to see if one of them matches the family in the * PangoFontDescription FALSE matched = FALSE; for (i = 0; i < nfamilies; i++) { if (!g_strcasecmp(pango_font_family_get_name(families[i]), pango_font_description_get_family(desc))) { matched = TRUE; break; } } g_free(families); return matched; } { struct pangofont *pfont; if (!pangofont_check_desc_makes_sense(ctx, desc) if (!pangofont_check_desc_makes_sense(ctx, desc) Revision-number: 7957 Prop-content-length: 413 Content-length: 413 K 8 svn:date V 27 2008-03-29T20:02:12.495122Z K 7 svn:log V 312 I give up. I can't work out what the purpose of the call to gtk_container_dequeue_resize_handler in request_resize() was; everything seems to work fine without it. So I'm removing the nonportable GTK 2 instance of it, and if anything ever goes wrong as a result then I'll at least find out what the problem was. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25c05e3061807ccecaaea937051b63d9 Text-delta-base-sha1: db2580f8ad5406fc8b31481864e2abd5652d6614 Text-content-length: 20 Text-content-md5: 18e1710f3f9874bbcb91a9855ebf5be8 Text-content-sha1: ae4f8278ef3808dfbc821c01dbced89659c5cdb4 Content-length: 20 SVN��;T ����5 Node-path: putty-gtk2/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04dbd109090c62460839bc801711ab0f Text-delta-base-sha1: 5d11acfec1f5a6c6b884a97daac0f868e2153b59 Text-content-length: 1250 Text-content-md5: 2d21b5210f698c2356c2c0977fc98e17 Text-content-sha1: 2bd0d0dcce619515b9c627b877fedfa100f99f2b Content-length: 1250 SVN��g�3�r��d:3�w/* * I can no longer remember what this call to * gtk_container_dequeue_resize_handler is for. It was * introduced in r3092 with no comment, and the commit log * message was uninformative. I'm _guessing_ its purpose is to * prevent gratuitous resize processing on the window given * that we're about to resize it anyway, but I have no idea * why that's so incredibly vital. * * I've tried removing the call, and nothing seems to go * wrong. I've backtracked to r3092 and tried removing the * call there, and still nothing goes wrong. So I'm going to * adopt the working hypothesis that it's superfluous; I won't * actually remove it from the GTK 1.2 code, but I won't * attempt to replicate its functionality in the GTK 2 code * above. */g�WT/E E DH2DKH2G@DADKH2FUH2DfG%D-I8DEADG2V DCH(G)DQH( * called */ block_signal(SIGCHLD, 0); /* * B SIGPIPE: if we attempt Duplicate Session or similarand it falls over in some way,certainly don't want terminating the main p/PuTTY. Note thatdothis _after_ (at least) forks off its child process,sinceshandinusual., 1inst->exited = FALSEgtk_(return 0; } Revision-number: 7958 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2008-03-31T10:47:48.215298Z K 7 svn:log V 67 Explicit casts to placate OS X gcc's pedantic type-check warnings. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 63c6d21537c6fa759cd25412c6af7985 Text-delta-base-sha1: d019d41d4c095665499224d0bcec150e46fa1f30 Text-content-length: 255 Text-content-md5: f57cfd2cc75fa381122c1787e4d7c601 Text-content-sha1: ab729caa61a053e7ab5b119b507c29e3ec4c5b8f Content-length: 255 SVN��Xqb�c�b�,,(int)strlen(components[2]), components[2], slantkey, (int)strlen(components[3]), components[3], setwidthkey, (int)strlen(components[4]), components[4], (int)strlen(components[10]), components[10], (int) Revision-number: 7959 Prop-content-length: 326 Content-length: 326 K 8 svn:date V 27 2008-04-02T14:48:06.003443Z K 7 svn:log V 225 Update all the list box code in gtkdlg.c to use the new-style GTK2 GtkTreeView, GtkComboBox and GtkComboBoxEntry instead of the various old deprecated stuff. Immediate benefit: GTK2 natively supports real drag lists, hooray! K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/dialog.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f7dc1af2fc178abc6b67acdb7c2b237 Text-delta-base-sha1: 176d67115b802da6a5d2512495092cb8e8cd0c41 Text-content-length: 364 Text-content-md5: 7af24eed66258f399ec4bcdd7b74631a Text-content-sha1: ba96472a613cc0b0aa398e41dbb103050198d530 Content-length: 364 SVN��%nF���`C�d=�H] * Don't try setting has_list and password on the same * control; front ends are not required to support that * combination. * There should never be more than one column in a * drop-down list (one with height==0), because front ends * may have to implement it as a special case of an * editable combo box. */ Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18e1710f3f9874bbcb91a9855ebf5be8 Text-delta-base-sha1: ae4f8278ef3808dfbc821c01dbced89659c5cdb4 Text-content-length: 208 Text-content-md5: c7488916b61bd483133661aca90c43a5 Text-content-sha1: d01c0d5a2bde3e42a905cd9328e41503ff15eefe Content-length: 208 SVN��T;4�]��O,4�[y + In particular, I know I _have_ broken GTK1 by taking out all the GTK1-style list box code. Put it all back in under ifdefs, which will be unpleasant but necessary Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d8df977b7f36a1e11b289b43b0a1862d Text-delta-base-sha1: edab4584987c3caec9176bc9dd3b43b7563e2c66 Text-content-length: 13671 Text-content-md5: b085353ac30164880853ecdc67683afe Text-content-sha1: bfc5747b2c0da330cc05207dff8881db92c291bd Content-length: 13671 SVN��+)io�F��!E�Me�3��90�u7�h-<�p0C�P S�t�t=b�{l�t=s�v�t= �f?�c?u�+]�c?�2Q�k�V~Q�N@_��~�!�L?�J�-�`{�c�!�Pdf�QV�w5�\n�m)��m)Q�XL�i5�md�da�>q�S?�X�y>�Ovm�]*��LY�=�nw�YRfilesel, fontsel */ GtkWidget *combo; /* for combo box (either editable or not) */ GtkWidget *list; /* for list box (list, droplist, combo box) */ GtkListStore *listmodel; /* for all types of list box */ GtkWidget *button; /* for filesel, fontsel#define FLAG_UPDATING_LISTBOX 2int get_listitemheight(GtkWidget *widgetGtkWidget *entry; char *tmpstring; assert(uc->ctrl->generic.type == CTRL_EDITBOX); if (!uc->ctrl->editbox.has_list) { assert(uc->entry != NULL); entry = uc->entry; } else { assert(uc->combo != NULL); entry = gtk_bin_get_child(GTK_BIN(uc->combo)); } * Hence, we must take our own copy of the text before we do * this. */ tmpstring = dupstr(text); gtk_entry_set_text(GTK_ENTRY(entry), tmpstring); sfree(tmpstrin if (!uc->ctrl->editbox.has_list) { assert(uc->entry != NULL); strncpy(buffer, gtk_entry_get_text(GTK_ENTRY(uc->entry)), length); buffer[length-1] = '\0'; } else { assert(uc->combo != NULL); strncpy(buffer, gtk_combo_box_get_active_text(GTK_COMBO_BOX(uc->combo)), length); buffer[length-1] = '\0'; }listmodel != NULL); gtk_list_store_clear(uc->listmodel); } void dlg_listbox_dtkTreePath *path; GtkTreeIter iterlistmodel != NULL); path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_model_get_iter(GTK_TREE_MODEL(uc->listmodel), &iter, path); gtk_list_store_remove(uc->listmodel, &iter); gtk_tree_path_free(path); GtkTreeIter iter; int i, colslistmodel); dp->flags |= FLAG_UPDATING_LISTBOX;/* inhibit drag-list update function */ gtk_list_store_append(uc->listmodel, &iter); dp->flags &= ~FLAG_UPDATING_LISTBOX; gtk_list_store_set(uc->listmodel, &iter, 0, id, -1); /* * Now go through text and divide it into columns at the tabs, * as necessary. */ cols = (uc->ctrl->generic.type == CTRL_LISTBOX ? ctrl->listbox.ncols : 1); cols = cols ? cols : 1; for (i = 0; i < cols; i++) { int collen = strcspn(text, "\t"); char *tmpstr = snewn(collen+1, char); memcpy(tmpstr, text, collen); tmpstr[collen] = '\0'; gtk_list_store_set(uc->listmodel, &iter, i+1, tmpstr, -1); sfree(tmpstr); text += collen; if (*text) text++; } } int dlg_listbox_getidtkTreePath *path; GtkTreeIter iter; int retlistmodel != NULL); path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_model_get_iter(GTK_TREE_MODEL(uc->listmodel), &iter, path); gtk_tree_model_get(GTK_TREE_MODEL(uc->listmodel), &iter, 0, &ret, -1); gtk_tree_path_free(path); return ret /* * We have to do this completely differently for a combo box * (editable or otherwise) and a full-size list box. */ if (uc->combo) { /* * This API function already does the right thing in the * case of no current selection. */ return gtk_combo_box_get_active(GTK_COMBO_BOX(uc->combo)); } else { GtkTreeSelection *treesel; GtkTreePath *path; GList *sellist; gint *indices; int ret; assert(uc->list != NULL); treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(uc->list)); if (gtk_tree_selection_count_selected_rows(treesel) != 1) return -1; sellist = gtk_tree_selection_get_selected_rows(treesel, NULL); assert(sellist && sellist->data); path = sellist->data; if (gtk_tree_path_get_depth(path) != 1) { ret = -1; } else { indices = gtk_tree_path_get_indices(path); if (!indices) { ret = -1; } else { ret = indices[0]; } } g_list_foreach(sellist, (GFunc)gtk_tree_path_free, NULL); g_list_free(sellist); return ret; } /* * We have to do this completely differently for a combo box * (editable or otherwise) and a full-size list box. */ if (uc->combo) { /* * This API function already does the right thing in the * case of no current selection. */ return gtk_combo_box_get_active(GTK_COMBO_BOX(uc->combo)) == index; } else { GtkTreeSelection *treesel; GtkTreePath *path; int ret; assert(uc->list != NULL); treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(uc->list)); path = gtk_tree_path_new_from_indices(index, -1); ret = gtk_tree_selection_path_is_selected(treesel, path); gtk_tree_path_free(path); return ret /* * We have to do this completely differently for a combo box * (editable or otherwise) and a full-size list box. */ if (uc->combo) { gtk_combo_box_set_active(GTK_COMBO_BOX(uc->combo), index); } else { GtkTreeSelection *treesel; GtkTreePath *path; assert(uc->list != NULL); treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(uc->list)); path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_selection_select_path(treesel, path); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(uc->list), path, NULL, FALSE, 0.0, 0.0); gtk_tree_path_free(path); if (uc->entry) { /* Anything containing an edit box gets that focused. */ gtk_widget_grab_focus(uc->entry); } else if (uc->combo) { /* Failing that, there'll be a combo box. */ gtk_widget_grab_focus(uc->combo); } /* * There might be a combo box (drop-down list) here, or a * proper list box. */ if (uc->list) { gtk_widget_grab_focus(uc->list); } else if (uc->combo) { gtk_widget_grab_focus(uc->combo); void listbox_doubleclick(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *columtreeview)); if (uc) uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_ACTION); } static void droplist_selchange(GtkComboBox *combocombo)); if (uc) uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_SELCHANGE); } static void listbox_selchange(GtkTreeSelection *treeselection, GtkTreeView *tree = gtk_tree_selection_get_tree_view(treeselection); struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(tree)); if (uc) uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_SELCHANGE); } struct draglist_valchange_ctx { struct uctrl *uc; struct dlgparam *dp; }; static gboolean draglist_valchange(gpointer data) { struct draglist_valchange_ctx *ctx = (struct draglist_valchange_ctx *)data; ctx->uc->ctrl->generic.handler(ctx->uc->ctrl, ctx->dp, ctx->dp->data, EVENT_VALCHANGE); sfree(ctx); return FALSE; } static void listbox_reorder(GtkTreeModel *treemodel, GtkTreePath *path, GtkTreeIter *itergpointer tree; struct uctrl *uc; if (dp->flags & FLAG_UPDATING_LISTBOX) return; /* not a user drag operation */ tree = g_object_get_data(G_OBJECT(treemodel), "user-data"); uc = dlg_find_bywidget(dp, GTK_WIDGET(tree)); if (uc) { /* * We should cause EVENT_VALCHANGE on the list box, now * that its rows have been reordered. However, the GTK 2 * docs say that at the point this signal is received the * new row might not have actually been filled in yet. * * (So what smegging use is it then, eh? Don't suppose it * occurred to you at any point that letting the * application know _after_ the reordering was compelete * might be helpful to someone?) * * To get round this, I schedule an idle function, which I * hope won't be called until the main event loop is * re-entered after the drag-and-drop handler has finished * furtling with the list store. */ struct draglist_valchange_ctx *ctx = snew(struct draglist_valchange_ctx); ctx->uc = uc; ctx->dp = dp; g_idle_add(draglist_valchange, ctx); }combo = uc->list = NULL; uc->listmodel = NULL; uc->buttonuc->listmodel = gtk_list_store_new(2, G_TYPE_INT, G_TYPE_STRING); w = gtk_combo_box_entry_new_with_model (GTK_TREE_MODEL(uc->listmodel), 1); /* We cannot support password combo boxes. */ assert(!ctrl->editbox.password); uc->combo = w; uc->entrysig = gtk_signal_connect(GTK_OBJECT(uc->combo), "changed", GTK_SIGNAL_FUNC(editbox_changed), dp); gtk_signal_connect(GTK_OBJECT(uc->combo), "key_press_event", GTK_SIGNAL_FUNC(editbox_key), dp); gtk_signal_connect(GTK_OBJECT(uc->combo), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus), dp); gtk_signal_connect(GTK_OBJECT(uc->combo), "focus_out_event", GTK_SIGNAL_FUNC(editbox_lostfocus), dp) uc->entrysig = gtk_signal_connect(GTK_OBJECT(uc->entry), "changed", GTK_SIGNAL_FUNC(editbox_changed), dp); gtk_signal_connect(GTK_OBJECT(uc->entry), "key_press_event", GTK_SIGNAL_FUNC(editbox_key), dp); gtk_signal_connect(GTK_OBJECT(uc->entry), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus), dp); gtk_signal_connect(GTK_OBJECT(uc->entry), "focus_out_event", GTK_SIGNAL_FUNC(editbox_lostfocus), dp); } /* * First construct the list data store, with the right * number of columns. */ { GType *types; int i; int cols; cols = ctrl->listbox.ncols; cols = cols ? cols : 1; types = snewn(1 + cols, GType); types[0] = G_TYPE_INT; for (i = 0; i < cols; i++) types[i+1] = G_TYPE_STRING; uc->listmodel = gtk_list_store_newv(1 + cols, types); sfree(types); } /* * Drop-down lists are done completely differently. */ if (ctrl->listbox.height == 0) { GtkCellRenderer *cr; /* * Create a non-editable GtkComboBox (that is, not * its subclass GtkComboBoxEntry). */ w = gtk_combo_box_new_with_model (GTK_TREE_MODEL(uc->listmodel)); uc->combo = w; /* * Tell it how to render a list item (i.e. which * column to look at in the list model). */ cr = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(w), cr, TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(w), cr, "text", 1, NULL); /* * And tell it to notify us when the selection * changes. */ g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(droplist_selchange), dp); } else { GtkTreeSelection *sel; /* * Create the list box itself, its columns, and * its containing scrolled window. */ w = gtk_tree_view_new_with_model (GTK_TREE_MODEL(uc->listmodel)); g_object_set_data(G_OBJECT(uc->listmodel), "user-data", (gpointer)w); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(w), FALSE); sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(w)); gtk_tree_selection_set_mode (sel, ctrl->listbox.multisel ? GTK_SELECTION_MULTIPLE : GTK_SELECTION_SINGLE); uc->list = w; gtk_signal_connect(GTK_OBJECT(w), "row-activated", GTK_SIGNAL_FUNC(listbox_doubleclick), dp); g_signal_connect(G_OBJECT(sel), "changed", G_CALLBACK(listbox_selchange), dp); if (ctrl->listbox.draglist) { gtk_tree_view_set_reorderable(GTK_TREE_VIEW(w), TRUE); g_signal_connect(G_OBJECT(uc->listmodel), "row-inserted", G_CALLBACK(listbox_reorder), dp); } { int i; int cols; cols = ctrl->listbox.ncols; cols = cols ? cols : 1; for (i = 0; i < cols; i++) { GtkTreeViewColumn *column; /* * It appears that GTK 2 doesn't leave us any * particularly sensible way to honour the * "percentages" specification in the ctrl * structure. */ column = gtk_tree_view_column_new_with_attributes ("heading", gtk_cell_renderer_text_new(), "text", i+1, (char *)NULL); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_GROW_ONLY); gtk_tree_view_append_column(GTK_TREE_VIEW(w), column); } } { GtkWidget *scroll; scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_IN); gtk_widget_show(w); gtk_container_add(GTK_CONTAINER(scroll), w); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_widget_set_size_request (scroll, -1, ctrl->listbox.height * get_listitemheight(w)); w = scroll; } } if (ctrl->generic.label) { GtkWidget *label, *container; GtkRequisition req; label = gtk_label_new(ctrl->generic.label); shortcut_add(scs, label, ctrl->listbox.shortcut, SHORTCUT_FOCUS, w); container = columns_new(4); if (ctrl->listbox.percentwidth == 100) { columns_add(COLUMNS(container), w, 0, 1); } else { gint percentages[2]; percentages[1] = ctrl->listbox.percentwidth; percentages[0] = 100 - ctrl->listbox.percentwidth; columns_set_cols(COLUMNS(container), 2, percentages); columns_add(COLUMNS(container), w, 1, 1); /* Centre the label vertically. */ gtk_widget_size_request(w, &req); gtk_widget_set_usize(label, -1, req.height); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); } gtk_widget_show(label); gtk_widget_show(w); w = container; uc->label = label; } GtkWidget *w) { int height; GtkCellRenderer *cr = gtk_cell_renderer_text_new(); gtk_cell_renderer_get_size(cr, w, NULL, NULL, NULL, NULL, &height); g_object_ref(G_OBJECT(cr)); gtk_object_sink(GTK_OBJECT(cr)); g_object_unref(G_OBJECT(cr)); return &selparams[nselparams-1].shortcuts, sdp, &scs, s1assert(uc->list); gtk_tree_selection_unselect_all (gtk_tree_view_get_selection(GTK_TREE_VIEW(uc->list))) Revision-number: 7960 Prop-content-length: 491 Content-length: 491 K 8 svn:date V 27 2008-04-02T14:50:47.734914Z K 7 svn:log V 390 Enable the display of server-side font aliases by default in my font selector. I had previously been worried that the default of not showing aliases interacted badly with the default actual font _being_ specified as an alias. One of those defaults had to change, and I've decided which: `fixed' is staying as Unix PuTTY's default font in defiance of GTK2's vigorous encouragement of Pango. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c7488916b61bd483133661aca90c43a5 Text-delta-base-sha1: d01c0d5a2bde3e42a905cd9328e41503ff15eefe Text-content-length: 20 Text-content-md5: 8ec29ee8c7e94555f6a66e818139ea41 Text-content-sha1: 28572ed671b0d4d6e76cc05d6ccc68acf5fe8752 Content-length: 20 SVN��;W ��;�� Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f57cfd2cc75fa381122c1787e4d7c601 Text-delta-base-sha1: ab729caa61a053e7ab5b119b507c29e3ec4c5b8f Text-content-length: 49 Text-content-md5: 935f0770fe69307f4b4a46f8842dc8ae Text-content-sha1: bf1267cda3128691a972d55b9972f812aa267b06 Content-length: 49 SVN��q �;��6; | FONTFLAG_SERVERALIAS Revision-number: 7961 Prop-content-length: 690 Content-length: 690 K 8 svn:date V 27 2008-04-02T16:26:01.911466Z K 7 svn:log V 589 TODO update: I don't think it's worth switching to GTK2's native shortcut mechanism. The existing code doesn't use any deprecated calls, and translating shortcut text _into_ Pango markup just sounds too unpleasant to do if I don't actually have to. Not to mention that the documentation for the Pango markup language doesn't tell me how to distinguish a mnemonic underscore prefix from a literal underscore in label text, but I know my current code can get that right (the current config box talks about TCP_NODELAY and SO_KEEPALIVE in widget labels that also have functioning shortcuts). K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ec29ee8c7e94555f6a66e818139ea41 Text-delta-base-sha1: 28572ed671b0d4d6e76cc05d6ccc68acf5fe8752 Text-content-length: 20 Text-content-md5: a602f957436c893d22c4575ffa6f736d Text-content-sha1: c726c70c28523745a8fb7170db09ae69c7eb390f Content-length: 20 SVN��WV ��y��]z Revision-number: 7962 Prop-content-length: 500 Content-length: 500 K 10 svn:author V 5 simon K 8 svn:date V 27 2008-04-02T17:04:21.368952Z K 7 svn:log V 399 Another tedious chore off the to-do list. I've just checked over my custom Columns layout class to see what fiddly details of GTK2isation were yet to be done. It turns out that all the basic object management got moved out of GTK into a separate library, so that all the gtk_object_* calls are deprecated and g_object_* should be used instead; having done that, though, it all looks perfectly fine. PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a602f957436c893d22c4575ffa6f736d Text-delta-base-sha1: c726c70c28523745a8fb7170db09ae69c7eb390f Text-content-length: 20 Text-content-md5: c3bbbab49cb457f73d651bfcbf33d76c Text-content-sha1: 5a2a1867e6be422612de32c6a7e4f8ce53e04d64 Content-length: 20 SVN��V ��;��]y Node-path: putty-gtk2/unix/gtkcols.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 410d1d158286d535087539fab2024775 Text-delta-base-sha1: 215df8d9dbcb6e49a28dd35bdfd04dd958432181 Text-content-length: 1297 Text-content-md5: 2fdc91b4fabb7e2be81a2894b3490574 Text-content-sha1: 2b4f4c18a2dde6b780fb4a67e8858222a8332476 Content-length: 1297 SVN��t"a�z��.y�F&=� �,H#if !GTK_CHECK_VERSION(2,0,0)#else GType columns_get_type(void) { static GType columns_type = 0; if (!columns_type) { static const GTypeInfo columns_info = { sizeof(ColumnsClass), NULL, NULL, (GClassInitFunc) columns_class_init, NULL, NULL, sizeof(Columns), 0, (GInstanceInitFunc)columns_init, }; columns_type = g_type_register_static(GTK_TYPE_CONTAINER, "Columns", &columns_info, 0); } return columns_type; } #endif#if !GTK_CHECK_VERSION(2,0,0) GtkObjectClass *object_class = (GtkObjectClass *)klass; GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; GtkContainerClass *container_class = (GtkContainerClass *)klass; #else /* GObjectClass *object_class = G_OBJECT_CLASS(klass); */ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); GtkContainerClass *container_class = GTK_CONTAINER_CLASS(klass); #endif #if !GTK_CHECK_VERSION(2,0,0) parent_class = g_type_class_peek_parent(klass); #else parent_class = gtk_type_class(GTK_TYPE_CONTAINER); #endif#if !GTK_CHECK_VERSION(2,0,0) cols = gtk_type_new(columns_get_type()); #else cols = g_object_new(TYPE_COLUMNS, NULL); #endif Revision-number: 7963 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2008-04-02T17:09:53.268630Z K 7 svn:log V 91 It's nice to be able to run mkauto.sh from inside the unix subdir as well as from outside. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/mkauto.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a636a02364e2c952172a86558860afa Text-delta-base-sha1: e901ac9481c4ab720956d7bc8796890e0142e931 Text-content-length: 132 Text-content-md5: 9546dc5edbd31d19e3c6a99e4a1a51b1 Text-content-sha1: a68f576bbaaa138eccb2917da737445f92f9a400 Content-length: 132 SVN��cV n�2�n�6-It's nice to be able to run this from inside the unix subdir as # well as from outside. test -f unix.h && cd . Revision-number: 7964 Prop-content-length: 323 Content-length: 323 K 7 svn:log V 222 Update autoconf for GTK 2. We now check for both GTK2 and GTK1, and in the presence of GTK 2 we also check to see whether we have a prehistoric Pango (since Pango itself helpfully doesn't provide that functionality, bah). K 10 svn:author V 5 simon K 8 svn:date V 27 2008-04-02T17:32:17.060709Z PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c3bbbab49cb457f73d651bfcbf33d76c Text-delta-base-sha1: 5a2a1867e6be422612de32c6a7e4f8ce53e04d64 Text-content-length: 183 Text-content-md5: da1ca92bcef44b17f1bc791d14e43696 Text-content-sha1: 974457938bddacbb65f1bf50bb6f48f198cfedea Content-length: 183 SVN�� � ��_aleft to do - Merge to trunk. Colin is already mentioned in the licence in all the branched copies, but mention him in the _website's_ licence page too. Node-path: putty-gtk2/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f760351c2c3c19c49d70eb5d51738356 Text-delta-base-sha1: 3d07dbeedb5ed226a836cb269708af13fff01936 Text-content-length: 656 Text-content-md5: b6ad8af00275b4244daa9abc877d1faa Text-content-sha1: 7bd21ace9c30e197881685d2315ef49c0c77ac4c Content-length: 656 SVN��]u�W�X�5%# Look for both GTK 1 and GTK 2. AM_PATH_GTK([1.2.0], [gtk=1], [gtk=none]) AM_PATH_GTK_2_0([2.0.0], [gtk=2], []) if test "$gtk" = "none"; then all_targets="all-cli" else all_targets="all-cli all-gtk" fi if test "$gtk" = "2"; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$GTK_LIBS $LIBS" AC_CHECK_FUNCS([pango_font_family_is_monospace pango_font_map_list_families]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi#ifndef HAVE_PANGO_FONT_FAMILY_IS_MONOSPACE # define PANGO_PRE_1POINT4 #endif #ifndef HAVE_PANGO_FONT_MAP_LIST_FAMILIES # define PANGO_PRE_1POINT6 #endif ]) Revision-number: 7965 Prop-content-length: 409 Content-length: 409 K 8 svn:date V 27 2008-04-04T10:16:24.768716Z K 7 svn:log V 308 Rename a structure field to avoid clashing with one of the old GTK1 ones. (I'm going to merge the GTK1 list code back in under ifdefs, and I want none of the disputed structure fields to have the same names, so that I'll reliably be told by the compiler if I keep the wrong piece of code outside the ifdef.) K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b085353ac30164880853ecdc67683afe Text-delta-base-sha1: bfc5747b2c0da330cc05207dff8881db92c291bd Text-content-length: 386 Text-content-md5: beebba3b984ef534acb552a7d387fd93 Text-content-sha1: 8c44ac02746dce2fec4c20cdbc88397340b1ad6e Content-length: 386 SVN��)]\�i� �=�vx�D�:�D�V%�D�G�|c�! �X/�' �W6�button; /* for filesel, fontsel */ GtkWidget *combo; /* for combo box (either editable or not) */ GtkWidget *treeview;treeviewtreeviewtreeviewtreeviewtreeviewtreeviewtreeviewtreeview) { gtk_widget_grab_focus(uc->treeviewtreeviewtreeviewtreeviewtreeview Revision-number: 7966 Prop-content-length: 367 Content-length: 367 K 8 svn:date V 27 2008-04-04T10:56:26.357512Z K 7 svn:log V 266 Reinstate all the GTK1-specific code under ifdefs, and verify that we can now build and run successfully using both GTK1 and GTK2 by giving appropriate options to make. (Specifically, to override the default of GTK2 in favour of GTK1, "make GTK_CONFIG=gtk-config".) K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/GTK2.TODO Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da1ca92bcef44b17f1bc791d14e43696 Text-delta-base-sha1: 974457938bddacbb65f1bf50bb6f48f198cfedea Text-content-length: 146 Text-content-md5: 1dede5267d7222a8059302dcba86acbc Text-content-sha1: 85982123094497a3f4dd6d0666f8f0c374d89d85 Content-length: 146 SVN�� / |��|�rI apparently missed out a piece of code when doing the new GTK2 list box: shortcut activations for list boxes are missing Node-path: putty-gtk2/unix/gtkcols.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2fdc91b4fabb7e2be81a2894b3490574 Text-delta-base-sha1: 2b4f4c18a2dde6b780fb4a67e8858222a8332476 Text-content-length: 183 Text-content-md5: d92f4df3ae6575f1a9a2aae38611c26b Text-content-sha1: ac2940f0d7873875cbfe26cf1e8a330f1602a34d Content-length: 183 SVN�� �/��fZ�FA/* GtkObjectClass *object_class = (GtkObjectClass *)klass; */tk_type_class(GTK_TYPE_CONTAINER); #else parent_class = g_type_class_peek_parent(klass Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: beebba3b984ef534acb552a7d387fd93 Text-delta-base-sha1: 8c44ac02746dce2fec4c20cdbc88397340b1ad6e Text-content-length: 33737 Text-content-md5: 20d17b93474fffe28e71204e1738bb3e Text-content-sha1: 5068f14598da712194e266b23809414398ff35b1 Content-length: 33737 SVN��]�I��O�W�hr�xm�7d� J�}K�!G�?i|�*t�crL�{�crP�vqW�G|�Iqt�8�6R�?8�U�Vb�!8�D�h�Zw�rR�VC:�\�Fs_�0#�J�s�|8;�~6�S@�J6H�S@V�U5�\3�B��\3�B�m�w7�,�s38�Z>�C\�DY�#�5v~� K�9R�S!�\{N�\{P�`<K�`<:�mfb�mf�s�[3�Zi� a�Xk�Im#if !GTK_CHECK_VERSION(2,0,0) GtkWidget *list; /* for combobox, listbox */ GtkWidget *menu; /* for optionmenu (==droplist) */ GtkWidget *optmenu; /* also for optionmenu */ #else#endif#if !GTK_CHECK_VERSION(2,0,0) static gboolean listitem_single_key(GtkWidget *item, GdkEventKey *event, gpointer data); static gboolean listitem_multi_key(GtkWidget *item, GdkEventKey *event, gpointer data); static gboolean listitem_button_press(GtkWidget *item, GdkEventButton *event, gpointer data); static gboolean listitem_button_release(GtkWidget *item, GdkEventButton *event, gpointer data); static void menuitem_activate(GtkMenuItem *item, gpointer data); #endif#if !GTK_CHECK_VERSION(2,0,0) /* * In GTK 1, `entry' is valid for combo boxes and edit boxes * alike. */ assert(uc->entry != NULL); entry = uc->entry; #else /* * In GTK 2, combo boxes use a completely different widget. */#endif#if GTK_CHECK_VERSION(2,0,0) if (!uc->ctrl->editbox.has_list) { #endif#if GTK_CHECK_VERSION(2,0,0)#endif } #if !GTK_CHECK_VERSION(2,0,0) static void container_remove_and_destroy(GtkWidget *w, gpointer data) { GtkContainer *cont = GTK_CONTAINER(data); /* gtk_container_remove will unref the widget for us; we need not. */ gtk_container_remove(cont, w); } #endif #if !GTK_CHECK_VERSION(2,0,0) assert(uc->menu != NULL || uc->list != NULL); if (uc->menu) { gtk_container_foreach(GTK_CONTAINER(uc->menu), container_remove_and_destroy, GTK_CONTAINER(uc->menu)); } else { gtk_list_clear_items(GTK_LIST(uc->list), 0, -1); } #else assert(uc->listmodel != NULL); gtk_list_store_clear(uc->listmodel); #endif #if !GTK_CHECK_VERSION(2,0,0) assert(uc->menu != NULL || uc->list != NULL); if (uc->menu) { gtk_container_remove (GTK_CONTAINER(uc->menu), g_list_nth_data(GTK_MENU_SHELL(uc->menu)->children, index)); } else { gtk_list_clear_items(GTK_LIST(uc->list), index, index+1); } #else { GtkTreePath *path; GtkTreeIter iter; assert(uc->listmodel != NULL); path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_model_get_iter(GTK_TREE_MODEL(uc->listmodel), &iter, path); gtk_list_store_remove(uc->listmodel, &iter); gtk_tree_path_free(path); } #endif /* * This routine is long and complicated in both GTK 1 and 2, * and completely different. Sigh. */ #if !GTK_CHECK_VERSION(2,0,0) assert(uc->menu != NULL || uc->list != NULL); dp->flags |= FLAG_UPDATING_COMBO_LIST; if (uc->menu) { /* * List item in a drop-down (but non-combo) list. Tabs are * ignored; we just provide a standard menu item with the * text. */ GtkWidget *menuitem = gtk_menu_item_new_with_label(text); gtk_container_add(GTK_CONTAINER(uc->menu), menuitem); gtk_widget_show(menuitem); gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", GINT_TO_POINTER(id)); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(menuitem_activate), dp); } else if (!uc->entry) { /* * List item in a non-combo-box list box. We make all of * these Columns containing GtkLabels. This allows us to do * the nasty force_left hack irrespective of whether there * are tabs in the thing. */ GtkWidget *listitem = gtk_list_item_new(); GtkWidget *cols = columns_new(10); gint *percents; int i, ncols; /* Count the tabs in the text, and hence determine # of columns. */ ncols = 1; for (i = 0; text[i]; i++) if (text[i] == '\t') ncols++; assert(ncols <= (uc->ctrl->listbox.ncols ? uc->ctrl->listbox.ncols : 1)); percents = snewn(ncols, gint); percents[ncols-1] = 100; for (i = 0; i < ncols-1; i++) { percents[i] = uc->ctrl->listbox.percentages[i]; percents[ncols-1] -= percents[i]; } columns_set_cols(COLUMNS(cols), ncols, percents); sfree(percents); for (i = 0; i < ncols; i++) { int len = strcspn(text, "\t"); char *dup = dupprintf("%.*s", len, text); GtkWidget *label; text += len; if (*text) text++; label = gtk_label_new(dup); sfree(dup); columns_add(COLUMNS(cols), label, i, 1); columns_force_left_align(COLUMNS(cols), label); gtk_widget_show(label); } gtk_container_add(GTK_CONTAINER(listitem), cols); gtk_widget_show(cols); gtk_container_add(GTK_CONTAINER(uc->list), listitem); gtk_widget_show(listitem); if (ctrl->listbox.multisel) { gtk_signal_connect(GTK_OBJECT(listitem), "key_press_event", GTK_SIGNAL_FUNC(listitem_multi_key), uc->adj); } else { gtk_signal_connect(GTK_OBJECT(listitem), "key_press_event", GTK_SIGNAL_FUNC(listitem_single_key), uc->adj); } gtk_signal_connect(GTK_OBJECT(listitem), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus), dp); gtk_signal_connect(GTK_OBJECT(listitem), "button_press_event", GTK_SIGNAL_FUNC(listitem_button_press), dp); gtk_signal_connect(GTK_OBJECT(listitem), "button_release_event", GTK_SIGNAL_FUNC(listitem_button_release), dp); gtk_object_set_data(GTK_OBJECT(listitem), "user-data", GINT_TO_POINTER(id)); } else { /* * List item in a combo-box list, which means the sensible * thing to do is make it a perfectly normal label. Hence * tabs are disregarded. */ GtkWidget *listitem = gtk_list_item_new_with_label(text); gtk_container_add(GTK_CONTAINER(uc->list), listitem); gtk_widget_show(listitem); gtk_object_set_data(GTK_OBJECT(listitem), "user-data", GINT_TO_POINTER(id)); } dp->flags &= ~FLAG_UPDATING_COMBO_LIST; #else { GtkTreeIter iter; int i, cols; assert(uc->listmodel); dp->flags |= FLAG_UPDATING_LISTBOX;/* inhibit drag-list update */ gtk_list_store_append(uc->listmodel, &iter); dp->flags &= ~FLAG_UPDATING_LISTBOX; gtk_list_store_set(uc->listmodel, &iter, 0, id, -1); /* * Now go through text and divide it into columns at the tabs, * as necessary. */ cols = (uc->ctrl->generic.type == CTRL_LISTBOX ? ctrl->listbox.ncols : 1); cols = cols ? cols : 1; for (i = 0; i < cols; i++) { int collen = strcspn(text, "\t"); char *tmpstr = snewn(collen+1, char); memcpy(tmpstr, text, collen); tmpstr[collen] = '\0'; gtk_list_store_set(uc->listmodel, &iter, i+1, tmpstr, -1); sfree(tmpstr); text += collen; if (*text) text++; } } #endif } int dlg_listbox_getid#if !GTK_CHECK_VERSION(2,0,0) { GList *children; GtkObject *item; assert(uc->menu != NULL || uc->list != NULL); children = gtk_container_children(GTK_CONTAINER(uc->menu ? uc->menu : uc->list)); item = GTK_OBJECT(g_list_nth_data(children, index)); g_list_free(children); return GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(item), "user-data")); } #else { GtkTreePath *path; GtkTreeIter iter; int ret; assert(uc->listmodel != NULL); path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_model_get_iter(GTK_TREE_MODEL(uc->listmodel), &iter, path); gtk_tree_path_free(path); return ret; } #endif#if !GTK_CHECK_VERSION(2,0,0) { GList *children; GtkWidget *item, *activeitem; int i; int selected = -1; assert(uc->menu != NULL || uc->list != NULL); if (uc->menu) activeitem = gtk_menu_get_active(GTK_MENU(uc->menu)); else activeitem = NULL; /* unnecessarily placate gcc */ children = gtk_container_children(GTK_CONTAINER(uc->menu ? uc->menu : uc->list)); for (i = 0; children!=NULL && (item = GTK_WIDGET(children->data))!=NULL; i++, children = children->next) { if (uc->menu ? activeitem == item : GTK_WIDGET_STATE(item) == GTK_STATE_SELECTED) { if (selected == -1) selected = i; else selected = -2; } } g_list_free(children); return selected < 0 ? -1 : selected; } #else #endif#if !GTK_CHECK_VERSION(2,0,0) { GList *children; GtkWidget *item, *activeitem; assert(uc->ctrl->generic.type == CTRL_EDITBOX || uc->ctrl->generic.type == CTRL_LISTBOX); assert(uc->menu != NULL || uc->list != NULL); children = gtk_container_children(GTK_CONTAINER(uc->menu ? uc->menu : uc->list)); item = GTK_WIDGET(g_list_nth_data(children, index)); g_list_free(children); if (uc->menu) { activeitem = gtk_menu_get_active(GTK_MENU(uc->menu)); return item == activeitem; } else { return GTK_WIDGET_STATE(item) == GTK_STATE_SELECTED; } } #else #endif#if !GTK_CHECK_VERSION(2,0,0) assert(uc->optmenu != NULL || uc->list != NULL); if (uc->optmenu) { gtk_option_menu_set_history(GTK_OPTION_MENU(uc->optmenu), index); } else { int nitems; GList *items; gdouble newtop, newbot; gtk_list_select_item(GTK_LIST(uc->list), index); /* * Scroll the list box if necessary to ensure the newly * selected item is visible. */ items = gtk_container_children(GTK_CONTAINER(uc->list)); nitems = g_list_length(items); if (nitems > 0) { int modified = FALSE; g_list_free(items); newtop = uc->adj->lower + (uc->adj->upper - uc->adj->lower) * index / nitems; newbot = uc->adj->lower + (uc->adj->upper - uc->adj->lower) * (index+1) / nitems; if (uc->adj->value > newtop) { modified = TRUE; uc->adj->value = newtop; } else if (uc->adj->value < newbot - uc->adj->page_size) { modified = TRUE; uc->adj->value = newbot - uc->adj->page_size; } if (modified) gtk_adjustment_value_changed(uc->adj); } } #else #endif } void dlg_text #if GTK_CHECK_VERSION(2,0,0) #endif#if !GTK_CHECK_VERSION(2,0,0) /* * If the list is really an option menu, we focus it. * Otherwise we tell it to focus one of its children, which * appears to do the Right Thing. */ if (uc->optmenu) { gtk_widget_grab_focus(uc->optmenu); } else { assert(uc->list != NULL); gtk_container_focus(GTK_CONTAINER(uc->list), GTK_DIR_TAB_FORWARD); } #else#endif#if !GTK_CHECK_VERSION(2,0,0) /* * GTK 1 list box event handlers. */ static gboolean listitem_key(GtkWidget *item, GdkEventKey *event, gpointer data, int multiple) { GtkAdjustment *adj = GTK_ADJUSTMENT(data) || event->keyval == GDK_Page_Up || event->keyval == GDK_KP_Page_Up || event->keyval == GDK_Page_Down || event->keyval == GDK_KP_Page_Down) { /* * Up, Down, PgUp or PgDn have been pressed on a ListItem * in a list box. So, if the list box is single-selection: * * - if the list item in question isn't already selected, * we simply select it. * - otherwise, we find the next one (or next * however-far-away) in whichever direction we're going, * and select that. * + in this case, we must also fiddle with the * scrollbar to ensure the newly selected item is * actually visible. * * If it's multiple-selection, we do all of the above * except actually selecting anything, so we move the focus * and fiddle the scrollbar to follow it. */ GtkWidget *list = item->parent; gtk_signal_emit_stop_by_name(GTK_OBJECT(item), "key_press_event"); if (!multiple && GTK_WIDGET_STATE(item) != GTK_STATE_SELECTED) { gtk_list_select_child(GTK_LIST(list), item); } else { int direction = (event->keyval==GDK_Up || event->keyval==GDK_KP_Up || event->keyval==GDK_Page_Up || event->keyval==GDK_KP_Page_Up) ? -1 : +1; int step = (event->keyval==GDK_Page_Down || event->keyval==GDK_KP_Page_Down || event->keyval==GDK_Page_Up || event->keyval==GDK_KP_Page_Up) ? 2 : 1; int i, n; GList *children, *chead; chead = children = gtk_container_children(GTK_CONTAINER(list)); n = g_list_length(children); if (step == 2) { /* * Figure out how many list items to a screenful, * and adjust the step appropriately. */ step = 0.5 + adj->page_size * n / (adj->upper - adj->lower); step--; /* go by one less than that */ } i = 0; while (children != NULL) { if (item == children->data) break; children = children->next; i++; } while (step > 0) { if (direction < 0 && i > 0) children = children->prev, i--; else if (direction > 0 && i < n-1) children = children->next, i++; step--; } if (children && children->data) { if (!multiple) gtk_list_select_child(GTK_LIST(list), GTK_WIDGET(children->data)); gtk_widget_grab_focus(GTK_WIDGET(children->data)); gtk_adjustment_clamp_page (adj, adj->lower + (adj->upper-adj->lower) * i / n, adj->lower + (adj->upper-adj->lower) * (i+1) / n); } g_list_free(chead); } return TRUE; } return FALSE; } static gboolean listitem_single_key(GtkWidget *item, GdkEventKey *event, gpointer data) { return listitem_key(item, event, data, FALSE); } static gboolean listitem_multi_key(GtkWidget *item, GdkEventKey *event, gpointer data) { return listitem_key(item, event, data, TRUE); } static gboolean listitem_button_press(GtkWidget *item, GdkEventButton *event, struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(item)); switch (event->type) { default: case GDK_BUTTON_PRESS: uc->nclicks = 1; break; case GDK_2BUTTON_PRESS: uc->nclicks = 2; break; case GDK_3BUTTON_PRESS: uc->nclicks = 3; break; } return FALSE; } static gboolean listitem_button_release(GtkWidget *item, GdkEventButton *event, item)); if (uc->nclicks>1) { uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_ACTION); return TRUE; } return FALSE; } static void list_selchange(GtkList *listlist)); if (!uc) return; menuitem_activate(GtkMenuItem *itemGtkWidget *menushell = GTK_WIDGET(item)->parent; gpointer optmenu = gtk_object_get_data(GTK_OBJECT(menushell), "user-data"); struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(optmenu)); draglist_move(struct dlgparam *dp, struct uctrl *uc, int direction) { int index = dlg_listbox_index(uc->ctrl, dp); GList *children = gtk_container_children(GTK_CONTAINER(uc->list)); GtkWidget *child; if ((index < 0) || (index == 0 && direction < 0) || (index == g_list_length(children)-1 && direction > 0)) { gdk_beep(); return; } child = g_list_nth_data(children, index); gtk_widget_ref(child); gtk_list_clear_items(GTK_LIST(uc->list), index, index+1); g_list_free(children); children = NULL; children = g_list_append(children, child); gtk_list_insert_items(GTK_LIST(uc->list), children, index + direction); gtk_list_select_item(GTK_LIST(uc->list), index + directionvoid draglist_updraglist_move(dp, uc, -1); } static void draglist_downdraglist_move(dp, uc, +1); } #else /* !GTK_CHECK_VERSION(2,0,0) */ /* * GTK 2 list box event handlers. */#endif /* !GTK_CHECK_VERSION(2,0,0) */ #if !GTK_CHECK_VERSION(2,0,0) gpointer fontontsel), "user-data"); const char *name = gtk_font_selection_dialog_get_font_name (GTK_FONT_SELECTION_DIALOG(fontsel)); gtk_entry_set_text(GTK_ENTRY(uc->entry), name); #else #endif #if !GTK_CHECK_VERSION(2,0,0) /* * Use the GTK 1 standard font selector. */ gchar *spacings[] = { "c", "m", NULL }; GtkWidget *fontsel = gtk_font_selection_dialog_new("Select a font"); gtk_window_set_modal(GTK_WINDOW(fontsel), TRUE); gtk_font_selection_dialog_set_filter (GTK_FONT_SELECTION_DIALOG(fontsel), GTK_FONT_FILTER_BASE, GTK_FONT_ALL, NULL, NULL, NULL, NULL, spacings, NULL); if (!gtk_font_selection_dialog_set_font_name (GTK_FONT_SELECTION_DIALOG(fontsel), fontname)) { /* * If the font name wasn't found as it was, try opening * it and extracting its FONT property. This should * have the effect of mapping short aliases into true * XLFDs. */ GdkFont *font = gdk_font_load(fontname); if (font) { XFontStruct *xfs = GDK_FONT_XFONT(font); Display *disp = GDK_FONT_XDISPLAY(font); Atom fontprop = XInternAtom(disp, "FONT", False); unsigned long ret; gdk_font_ref(font); if (XGetFontProperty(xfs, fontprop, &ret)) { char *name = XGetAtomName(disp, (Atom)ret); if (name) gtk_font_selection_dialog_set_font_name (GTK_FONT_SELECTION_DIALOG(fontsel), name); } gdk_font_unref(font); } } gtk_object_set_data (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fontsel)->ok_button), "user-data", (gpointer)fontsel); gtk_object_set_data(GTK_OBJECT(fontsel), "user-data", (gpointer)uc); gtk_signal_connect (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fontsel)->ok_button), "clicked", GTK_SIGNAL_FUNC(fontsel_ok), (gpointer)dp); gtk_signal_connect_object (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fontsel)->ok_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)fontsel); gtk_signal_connect_object (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(fontsel)->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)fontsel); gtk_widget_show(fontsel); #else /* !GTK_CHECK_VERSION(2,0,0) */ /* * Use the unifontsel code provided in gtkfont.c. */ #endif /* !GTK_CHECK_VERSION(2,0,0) */ NULL; #if !GTK_CHECK_VERSION(2,0,0) uc->list = uc->menu = uc->optmenu = NULL; #else uc->combo = uc->treeview = NULL; uc->listmodel = NULL; #endif GtkWidget *signalobject; if (ctrl->editbox.has_list) { #if !GTK_CHECK_VERSION(2,0,0) /* * GTK 1 combo box. */ w = gtk_combo_new(); gtk_combo_set_value_in_list(GTK_COMBO(w), FALSE, TRUE); uc->entry = GTK_COMBO(w)->entry; uc->list = GTK_COMBO(w)->list; signalobject = uc->entry; #else /* * GTK 2 combo box. */signalobject = uc->combo; #endifsignalobject = w; } uc->entrysig = gtk_signal_connect(GTK_OBJECT(signalobject), "changed", GTK_SIGNAL_FUNC(editbox_changed), dp); gtk_signal_connect(GTK_OBJECT(signalobject), "key_press_event", GTK_SIGNAL_FUNC(editbox_key), dp); gtk_signal_connect(GTK_OBJECT(signalobject), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus), dp); gtk_signal_connect(GTK_OBJECT(signalobject), "focus_out_event", GTK_SIGNAL_FUNC(editbox_lostfocus), dp); gtk_signal_connect(GTK_OBJECT(signalobject), "focus_out_event", GTK_SIGNAL_FUNC(editbox_lostfocus), dp); #if !GTK_CHECK_VERSION(2,0,0) /* * GTK 1 list box setup. */ if (ctrl->listbox.height == 0) { uc->optmenu = w = gtk_option_menu_new(); uc->menu = gtk_menu_new(); gtk_option_menu_set_menu(GTK_OPTION_MENU(w), uc->menu); gtk_object_set_data(GTK_OBJECT(uc->menu), "user-data", (gpointer)uc->optmenu); gtk_signal_connect(GTK_OBJECT(uc->optmenu } else { uc->list = gtk_list_new(); if (ctrl->listbox.multisel == 2) { gtk_list_set_selection_mode(GTK_LIST(uc->list), GTK_SELECTION_EXTENDED); } else if (ctrl->listbox.multisel == 1) { gtk_list_set_selection_mode(GTK_LIST(uc->list), GTK_SELECTION_MULTIPLE); } else { gtk_list_set_selection_mode(GTK_LIST(uc->list), GTK_SELECTION_SINGLE); } w = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(w), uc->list); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(w), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); uc->adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW(w)); gtk_widget_show(uc->list); gtk_signal_connect(GTK_OBJECT(uc->list), "selection-changed", GTK_SIGNAL_FUNC(list_selchange), dp); gtk_signal_connect(GTK_OBJECT(uc->list /* * Adjust the height of the scrolled window to the * minimum given by the height parameter. * * This piece of guesswork is a horrid hack based * on looking inside the GTK 1.2 sources * (specifically gtkviewport.c, which appears to be * the widget which provides the border around the * scrolling area). Anyone lets me know how I can * do this in a way which isn't at risk from GTK * upgrades, I'd be grateful. */ { int edge; #if GTK_CHECK_VERSION(2,0,0) edge = GTK_WIDGET(uc->list)->style->ythickness; #else edge = GTK_WIDGET(uc->list)->style->klass->ythickness; #endif gtk_widget_set_usize(w, 10, 2*edge + (ctrl->listbox.height * get_listitemheight(w))); } if (ctrl->listbox.draglist) { /* * GTK doesn't appear to make it easy to * implement a proper draggable list; so * instead I'm just going to have to put an Up * and a Down button to the right of the actual * list box. Ah well. */ GtkWidget *cols, *button; static const gint percentages[2] = { 80, 20 }; cols = columns_new(4); columns_set_cols(COLUMNS(cols), 2, percentages); columns_add(COLUMNS(cols), w, 0, 1); gtk_widget_show(w); button = gtk_button_new_with_label("Up"); columns_add(COLUMNS(cols), button, 1, 1); gtk_widget_show(button); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(draglist_up), dp); gtk_signal_connect(GTK_OBJECT(button button = gtk_button_new_with_label("Down"); columns_add(COLUMNS(cols), button, 1, 1); gtk_widget_show(button); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(draglist_down), dp); gtk_signal_connect(GTK_OBJECT(button w = cols; } } if (ctrl->generic.label) { GtkWidget *label, *container; label = gtk_label_new(ctrl->generic.label); container = columns_new(4); if (ctrl->listbox.percentwidth == 100) { columns_add(COLUMNS(container), w, 0, 1); } else { gint percentages[2]; percentages[1] = ctrl->listbox.percentwidth; percentages[0] = 100 - ctrl->listbox.percentwidth; columns_set_cols(COLUMNS(container), 2, percentages); columns_add(COLUMNS(container), w, 1, 1); } gtk_widget_show(label); gtk_widget_show(w); shortcut_add(scs, label, ctrl->listbox.shortcut, SHORTCUT_UCTRL, uc); w = container; uc->label = label; } #else /* !GTK_CHECK_VERSION(2,0,0) */ /* * GTK 2 list box setup. */#endif /* !GTK_CHECK_VERSION(2,0,0) */ case CTRL_LISTBOX: #if !GTK_CHECK_VERSION(2,0,0) /* * If the list is really an option menu, we focus * and click it. Otherwise we tell it to focus one * of its children, which appears to do the Right * Thing. */ if (sc->uc->optmenu) { GdkEventButton bev; gint returnval; gtk_widget_grab_focus(sc->uc->optmenu); /* Option menus don't work using the "clicked" signal. * We need to manufacture a button press event :-/ */ bev.type = GDK_BUTTON_PRESS; bev.button = 1; gtk_signal_emit_by_name(GTK_OBJECT(sc->uc->optmenu), "button_press_event", &bev, &returnval); } else { assert(sc->uc->list != NULL); gtk_container_focus(GTK_CONTAINER(sc->uc->list), GTK_DIR_TAB_FORWARD); } #else /* * FIXME: apparently I forgot to put this back in * for GTK 2. Oops. */ #endif #if !GTK_CHECK_VERSION(2,0,0) GtkWidget *listitem = gtk_list_item_new_with_label("foo"); GtkRequisition req; gtk_widget_size_request(listitem, &req); gtk_object_sink(GTK_OBJECT(listitem)); return req.height; #else#endifdlg->action_area),]�SVGEAHLF4GmDwF4D�G$D<D[DLHrE&TI HrZEdGcF~FiD�F&F0D[EOFJD[DPE DMFEWKEF5F5F$DFQDEDXE�FbD*G4GlIR>DuE�DvKEDdJFGNPE^YsGE"DHFG%Q%J<S5ISF]E"E+F GdDzDL E DFHSF#EoHEF�E@IDnED$H K4lGGsEyFfE8HsFWEwDTGN0DrHIERDvFm%HL~JE)HDNpEsDDvKpGJvFHFtDgF%FE&FEQHGH8HOI[G~EHDbGEAGDEE D9G=GDgEKH}I1J5KaKEHrFAHjElEF*E>I@M:L|J@F DwDJ@L6DwFEG'EsDwLEG L&IKzhMJ/LIkDLG:LwFG=D6I GR\]DK@FDNE D.DHDuDWRcJ,FfODS@LjK?DGD]F*JF`DNULDbFGjG4W^evQ?D"FfG4J6@i[|KKtNAJ S_]sEJ0KyJPG[D�EdD_GeEcHJE.DDBDpJ3H{GDFdF/HrHKH�GIDiD QN:DnOH9E�HjM`DFtHLwF[G.FCGIH I(RhD E?M.JYF8G EjIEdEE DsEOD!HD@D+HG.QJEdrAG}D�GpFtG5EAD5D(DIE>GD>DZF8DZD9K1E-DNEzD,DLDtEtFwEhECFLD/F!D*D%GsD EGEfFHJIDEF8E9HG2DAEENE%D;EcE:DUDRD4DD7HLHJFKE#DnGnE.NaD%DWFKD:G DvE>I2DFFaJDG!DE!F?G!D@JD^DEH~DeE\E?OJ1EKDwFKDEDGHDwEDbD�F&EEyFAE E#G3EJDwFKDeEIDED@EeG FiD<EIEEMEBEJD*LDF6D�FCDE7F6I2EDHF"H JH>FH4F;RQDnNrFE5D DD_En_R'H{F7PvHKMwKtDzIFOoLGRHsPDsGDsDkD#G@D DrJdGODD&GK FsD1E\EUGL{L1N+EG6FVDCDD!GJ E2V6WQK6E3D E&JdEJDG]HDsDRDIE&GCE3GrD FdN<S0EyDdI!y,@O5oLEECG)TMF^'EJ]ZgDq@VIr bH(EJH@s\EHH-LG/IW K?ED@GnKDjH~HEnDkDGEsM%M%GiF E4DLwF=G_DWD9LwDgJ(DyG EWDD~DhO(IsH~L=E_W\VlWJFQEWFAI!J'D GNGUGsD H DD,E$D H>EfUO~DHE4G'F~E3HDzE3DE{FhD9D4D-EjWpD m G?X;@@JSSEEWFmFRGYF!D[EnD DDsN_E G2EH5HqJ_E F3DiMMM_OyOWD,LmGFL+D>EFLFG IFEEDE@E�G JDUFD5DEDDLJEDAFvDIoDDO`G3K6I#PoMHI9N\D,EnDAD<G/DMlV3X!HGNMKfFMHd LDzL5LDLmL+F J`GYPIHG JHETqFHHX@JL)NjD>L&HzFrK_HpG'OIL&DJIARNW&ERIY;D<J!N;I<KyDzEsHqGYELH�DF6ZLD`DbQpE)D}O)N<Db@IRO_DiD�@m`RKNfG'JyJsIADS"HqDHM^uEWGjEX@W3N<D<EOLPD<F~]uDwG~MLJ!FfIBNFyT!D4I7gD@Q4KcDQG5D FG_EcN3DCDHDFIH GiTMD6EKFaG7F KUEFE_J_DPTLD/KLxE;EBD3DJE_N*FFWHPX!TXjG=JDeHsGyE|HI}_F1G-L#FD"GZQK2J?T%DD&GZPKeGEVOJ bmK<VDqKDF<E DGE'F&G/G*J?E1FEM!LaFRDDIoHHPH>D8FQLLDtDsDtHLHFVEnG%GVFlS~ERDE"FVFgF1NaGpGF^4PRL DHGqG1HsW+E0UDUK]GqEGKED\GKEDbQ?D0EaE~R>K#D ]>D SYLOD TIV9ZEN)`=I6ZhE D3E;J�EEDtR#HZDmF>KEL.I6YHD!aZ[|mOLLZEGS5MsDED$F{E3G!D$FmDN7D!DSHhfMG@S|EHKTYEfD�ILGqG_G{ITIoM DE MG{D\KjO5GtDqDjGRODzFLmYFDHnP=IT"J8KRG(M}QcE}U"GRX H\dnH7G~\PDIflIBEE3\D_F5LlMeRMt~Oib;X`H~H{F=E|FMKYJHIG.VfINFPED>J;G=D%H{E3I�H1LF:@EHJ!D}MH\H8G2FG;ISG;DWFVG/NBH3KIHrH}GD}HGE#GI_GDGDLsGK*D F1GHHHG-D0KbK SxD5FJIDYLG-GeQ9MlDAL IMNLIHKG2IGD|DAQcD7D J7@R>M?F?E6E\DkF@DgEXK*GED DwJ,G D FKDYE6KDD!L&NuGUMdGUH/JGUP?HD8DzF9H FMCD|D D.J&HENT+HbDDEK[I&F2G7F$KnD!HaK&J"DEKJDF;D%QZTiGJN\FKD@Gitle, "Are you suwant to close this session?", string_width("Most of the above text")"Yes", 'y', +1, 1Non', -1, 0NULL); sfree(treturn; } int verify_ssh_host_key(void *frontend, char *, portkeytype,strfingerprint(*callback)ctxresult),) {tatic constabsenttxt[] = "The server's key is not cached. You have no guarantee " "thatcomputerthink it is.\n%s is:%sIfrusi, press \"Accept\"addtoPuTTY's and carry onnecting jonce, withoutaddC Once\"doCancelbandonon."wrongWARNING - POTENTIAL SECURITY BREACH!doematchone hasTmeanat eitheradministratorchange, oactuallyedo anopreo bnewwere expupdatontinubutletelyc. PONLYsafe choicet; /** V./ =str)if (= 0) /* succ-ed OK 1 = dupf(2 ? :)messagebox(GTK_WIDGET(get_window() Security Alert",a' 2ocex2) { store} else1)0;} * Ask whelalgorithmaable (sincewasbelowfigured 'warn' threshold). askalg*algname, msgfirstsuped b, whichC?msg,00oldfile_should nehappenUnix. Wpefatal__msgF Error",REASONABLY LONG LINE OF TEXT FOR BASIC SANITY"OKp, ...va_list apmsgva_start(ap, pmsgvp, ava_end(cleanup_exit(1GtkWidget *aboutbox =;__clicked(GtkButtb, gpoindatagtkdestroy(licencCopyright 1997-2008 Simon Tatham.\nors cRobert de Bath, Joris van Rantwijk, DelianDelchev, Andreas Schultz, Jeroen Massar, Wez Furlong, NicolB, Justin Bradford, Ben Harris, Malcolm SmiAhmad KhalifaMarkus Kuhn, Colin WatsCORE SDI S.Aermihereby gd, ge,ny persoobtaiaoftwarassociadocumens ("S"")deal iriinclulimisspy, modifeublish, dibute, scenand/orliesomitwhomis furniso sosubjfollowcondi:noticshalledrstantialTHE SOFTWARE IS PROVIDED ""AS IS"", WITHOUTWARRANTYANY KIND, EXPRESS OR IMPLIEDINCLUDBUT NOT LIMITED TO IESERCHANTABILITY, FITNA PARTICULARURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALLOPYRIGHT HOLDERS BE LIABLENY CLAIM, DAMAGESOR OTHERWHEIN AN ACTIONCONTRACTTORTWISE, ARISFROM, OFNNNEORUSDEALINGScap " L"sse!,,ISHSLICENCE" BOX ISN'T EXCESSIVELY TTHINw grab_focusdialog_new(ainer_serderAINER, 10"A "NDOWw__label("C"_SET_FLAGS(w,CAN_DEFAULTdefaultwbox_packBOXDIALOG->a_areaw, FALsignalOBJECT(w), "SIGNAL_FUNC)show(Viewvve5 Allredransien_pos,ruct eventstuffparen,ro *boxShortcuts scsdlgparam dunstctrlnts, negsizeselegns; }*es = ()es->dlg_(&d_ok_handler(dlg ata_) REFRESH; dlrfor (i = 0; i <; i++add,[i]}doneSELGEselIs a of* deliberdebecause somebedlaedopre-emptms->)Clenisseli)extrastrlen++ 2 >512sre,cpy=[++] = '\n'}_owGDK_PRIMARYCURRTIMEextern GdkAtomound__atomadd_tTYPE_ST, GtkSDgunfo,timmp->, 8(uned)gdkE u *ucDryboxuclg_find_by =#if !HECK_VERSION(2,0,0ucun_allLIST); #treevie TREE_VIEWndiTRUEe*w0 =(sssndeinit< lenofcs.sc)[]. = SHORTCUT_EMPTY =0get, columns(3, 34pushHELPCTX(no_help, P->.is =1x(s, NO_es.he= 1multisencol3percgsnewn(3[0251265 Loglaytrlsscs, ww1w1et_uw1, 20 +GIVWIDTHLOG"QUITE'COS SOG ENTRIESWIDE-1,dp.es=retvadp.refforpos_POS_CENTER")key__win)logmof(*log_dbuf[40]tm t >64;m=lstrf%Y-%m-%d %H:%M:%S\&tm + +++dFile templatelog \"%.*s\" already exists.can overwritaof itorgbmbLENAME_MAX.path"%s,SUITTHASKAPPEND "Dd} Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 935f0770fe69307f4b4a46f8842dc8ae Text-delta-base-sha1: bf1267cda3128691a972d55b9972f812aa267b06 Text-content-length: 393 Text-content-md5: 041a09f53f2aae7313a5ff8784a07c65 Text-content-sha1: a36f02fc2306574bfe920172d8410c6e7d475e1a Content-length: 393 SVN�� B9���h}�&q���O}�)n�[-�O}d�o#if GTK_CHECK_VERSION(2,0,0) (for GTK 2 only). */;#endif /* GTK_CHECK_VERSION(2,0,0) */#if GTK_CHECK_VERSION(2,0,0) &pangofont_vtable, #endif#if GTK_CHECK_VERSION(2,0,0)Implementation of a unified font selector. Used on GTK 2 only; * for GTK 1 we still use the standar #endif /* GTK_CHECK_VERSION(2,0,0) */ Revision-number: 7967 Prop-content-length: 341 Content-length: 341 K 8 svn:date V 27 2008-04-04T11:02:26.204224Z K 7 svn:log V 240 I apparently missed out a piece of code when doing the new GTK2 list box: shortcut activations for list boxes are missing. That's the last thing on the to-do list. We're now ready to merge back to the trunk, given only some final testing! K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 20d17b93474fffe28e71204e1738bb3e Text-delta-base-sha1: 5068f14598da712194e266b23809414398ff35b1 Text-content-length: 372 Text-content-md5: bdf031a25dc95829cb15dbda812360ce Text-content-sha1: 361d147a9a4fa6e54be4ba0587d128e127283604 Content-length: 372 SVN����M�p�M�CBif (sc->uc->treeview) { gtk_widget_grab_focus(sc->uc->treeview); } else if (sc->uc->combo) { gtk_widget_grab_focus(sc->uc->combo); gtk_combo_box_popup(GTK_COMBO_BOX(sc->uc->combo)); }�SN{{�S�char *title = dupcat(appname, " Exit Confirmation", NULL); int ret = messagebox(GTK_WIDGET(get_window(frontend)), t Node-path: putty-gtk2/unix/GTK2.TODO Node-action: delete Revision-number: 7968 Prop-content-length: 193 Content-length: 193 K 8 svn:date V 27 2008-04-04T11:37:06.899747Z K 7 svn:log V 93 Fix the jarring change of window size on expanding the SSH branch of the configuration tree. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bdf031a25dc95829cb15dbda812360ce Text-delta-base-sha1: 361d147a9a4fa6e54be4ba0587d128e127283604 Text-content-length: 2176 Text-content-md5: fd8caf23a59e5d9dd77c1217d21976ff Text-content-sha1: 9e35f0b8917bd83450a045bd78b50fdfe8edc6ff Content-length: 2176 SVN����2�-��*)T�E2�2#lse int depth; GtkTreePath *treepathselparams[nselparams].treepath = gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), &treeiterlevels[j-1]); /* * We are going to collapse all tree branches * at depth greater than 2, but not _yet_; see * the comment at the call to * gtk_tree_view_collapse_row below. */ gtk_tree_view_expand_row(GTK_TREE_VIEW(tree), selparams[nselparams].treepath, FALSE); selparams[nselparams].depth = j{ GtkRequisition req; int i; /* * We want our tree view to come up with all branches at * depth 2 or more collapsed. However, if we start off * with those branches collapsed, then the tree view's * size request will be calculated based on the width of * the collapsed tree. So instead we start with them all * expanded; then we ask for the current size request, * collapse the relevant rows, and force the width to the * value we just computed. This arranges that the tree * view is wide enough to have all branches expanded * safely. */ gtk_widget_size_request(tree, &req); for (i = 0; i < nselparams; i++) if (selparams[i].depth >= 2) gtk_tree_view_collapse_row(GTK_TREE_VIEW(tree), selparams[i].treepath); gtk_widget_set_size_request(tree, req.width, -1); } #endif�Ny�>+�k~^�N�ack_start(GTK_BOX(GTK_DIALOG(window)->vbox), w1, TRUE, TRUE, 0); gtk_widget_show(w1); dp.shortcuts = &scs; dp.lastfocus = NULL; dp.retval = 0; dp.window = window; gtk_window_set_modal(GTK_WINDOW(window), TRUE); if (parentwin) { set_transient_window_pos(parentwin, window); gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(parentwinwindow_destroy), NULLdp); gtk_main(); dlg_cleanup(&dp); ctrl_free_box(ctrlbox); return dp.retval; } static int string_width(char *text) { GtkWidget *label = gtk_label_new(text); GtkRequisition req; gtk_widget_size_request(label, &req); gtk_object_sink(GTK_OBJECT(label)); return req.width; } int reallyclose(void *frontend) { Revision-number: 7969 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2008-04-04T12:23:29.282344Z K 7 svn:log V 106 gtk_combo_box_get_active_text didn't appear until GTK 2.6; bodge around it for earlier versions of GTK 2. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fd8caf23a59e5d9dd77c1217d21976ff Text-delta-base-sha1: 9e35f0b8917bd83450a045bd78b50fdfe8edc6ff Text-content-length: 337 Text-content-md5: 4cf4bd61a19ec2954849e0f12c8ff031 Text-content-sha1: d1ea6e8f642489d44da33efc813edaf1b4a529bd Content-length: 337 SVN���� /��/�6U#if GTK_CHECK_VERSION(2,6,0) gtk_combo_box_get_active_text(GTK_COMBO_BOX(uc->combo)), #else gtk_entry_get_text (GTK_ENTRY(gtk_bin_get_child(GTK_BIN(uc->combo)))), #endif�ynuu�y� gtk_container_set_border_width(GTK_CONTAINER(w1), 10); gtk_widget_set_usize(w1, minwid+20, -1); gtk_box_p Revision-number: 7970 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2008-04-05T12:26:49.222037Z K 7 svn:log V 31 Fix misleading parameter name. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/man-pter.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 54dbd339491b9bf3ad103ff5d0005520 Text-delta-base-sha1: 6bd2dd48ead7cc4e4aad0c2887bc0c6a3f3d8d60 Text-content-length: 23 Text-content-md5: eef3e9a117715fa1edb2257a82b3d78f Text-content-sha1: 3f6fbe6f338d5ef70d872ac1d4186249e40fa872 Content-length: 23 SVN��A< ��x��D} Revision-number: 7971 Prop-content-length: 111 Content-length: 111 K 8 svn:date V 27 2008-04-05T12:49:00.283936Z K 7 svn:log V 11 PuTTY Menu K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0a173315d685d3c75937c3390fa3f54 Text-delta-base-sha1: 3df6fc58dde5cbcf7d65bf976c56d63b4e05f612 Text-content-length: 166 Text-content-md5: c0428b2db3be4874d33d3a7556fb8004 Text-content-sha1: 708a8a74fb3be282e61de68251f6a3b8a6c03cce Content-length: 166 SVN��:Q �G� �~<li><a href="http://www.ntsend.freeserve.co.uk/puttymenu.html"> PuTTY Menu</a>, for organising, launching, exporting, and importing saved Revision-number: 7972 Prop-content-length: 208 Content-length: 208 K 8 svn:date V 27 2008-04-05T12:53:32.046715Z K 7 svn:log V 107 Ensure the new `depth' and `treepath' structure fields in struct selparam are always properly initialised. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cf4bd61a19ec2954849e0f12c8ff031 Text-delta-base-sha1: d1ea6e8f642489d44da33efc813edaf1b4a529bd Text-content-length: 185 Text-content-md5: c894b4203d1ddcc13ea5d3d820d6f603 Text-content-sha1: 880a6447e74c2ecb374276f9a7045ccc254d5f18 Content-length: 185 SVN����T�e��Gb��Lselparams[nselparams].depth = j;} else { selparams[nselparams].treepath = NULL�n"4�n� = layout_ctrls(&dp, &scs, s1, GTK_WINDOW(window)); Revision-number: 7973 Prop-content-length: 1158 Content-length: 1158 K 8 svn:date V 27 2008-04-05T13:37:20.217312Z K 7 svn:log V 1056 In the new unified font handling, my strategy so far for combining client- and server-side fonts into a single namespace was mainly to hope there would naturally be no collisions, and to provide disambiguating "client:" and "server:" prefixes for manual use in emergencies. Jacob points out, however, that his system not only has a namespace clash but worse still the clash is at the name "fixed", which is our default font! So, modify my namespace policy to use the disambiguating prefixes everywhere by default, and use _unprefixed_ names only if the user types one in by hand. In particular, I've changed the keys used to store font names in Unix saved session files. Font names read from the new keys will be passed straight to the new unifont framework; font names read from the old keys will have "server:" prepended. So any existing configuration file for GTK1 PuTTY should now work reliably in GTK2 PuTTY and select the same font, even if that font is one on which your system (rather, your client+server combination) has a font namespace clash. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 041a09f53f2aae7313a5ff8784a07c65 Text-delta-base-sha1: a36f02fc2306574bfe920172d8410c6e7d475e1a Text-content-length: 2521 Text-content-md5: d04bf951dd7f650f20838ebdd8f1be3d Text-content-sha1: 177e5b6302839a1a3ba8f775ae1e73b296b9d740 Content-length: 2521 SVN��<�&�)�dN�A}�o9�L#�>o�#( �}H� @�6M�D~I��n/*�W!�_�Up�bD�L#�im��w5�4,�}�=�$'v� ],fit would be nice to have a display of the current font name, * and in particular whether it's client- or server-side, * during the progress of the font selector.#define FONTFLAG_SORT_MASK 0x0007 /* used to disambiguate font families */*flags,*flags, ,*flags, if (flags) { if (name[0] == '-' || resolve_aliases) *flags = FONTFLAG_SERVERSIDE; else *flags = FONTFLAG_SERVERALIAS; }*flags, ,*flags, ruct fontinfo_realname_find { const char *realname; int flags; };realname if ((i = strnullcasecmp(a->realname, b->realname)) != 0) return i; if ((a->flags & FONTFLAG_SORT_MASK) != (b->flags & FONTFLAG_SORT_MASK)) return ((a->flags & FONTFLAG_SORT_MASK) < (b->flags & FONTFLAG_SORT_MASK) ? -1 : +1); return 0; } static int fontinfo_realname_find(void *av, void *bv) { struct fontinfo_realname_find *a = (struct fontinfo_realname_find *)av; fontinfo *b = (fontinfo *)bv; int i; if ((i = strnullcasecmp(a->realname, b->realname)) != 0) return i; if ((a->flags & FONTFLAG_SORT_MASK) != (b->flags & FONTFLAG_SORT_MASK)) return ((a->flags & FONTFLAG_SORT_MASK) < (b->flags & FONTFLAG_SORT_MASK) ? -1 : +1); return 0/* * Font class comes immediately after family, so that fonts * from different classes with the same family */ if ((a->flags & FONTFLAG_SORT_MASK) != (b->flags & FONTFLAG_SORT_MASK)) return ((a->flags & FONTFLAG_SORT_MASK) < (b->flags & FONTFLAG_SORT_MASK) ? -1 : +1)int currflags = -1 || currflags != (info->flags & FONTFLAG_SORT_MASK currflags = info->flags & FONTFLAG_SORT_MASKint flags; struct fontinfo_realname_find f; &flags, TRUE); f.realname = newname; f.flags = flags; newinfo = find234(fs->fonts_by_realname, &f, fontinfo_realname_find); , flagsserver:fixed";&flags{ struct fontinfo_realname_find f; f.realname = fontname2; f.flags = flags; info = find234(fs->fonts_by_realname, &f, fontinfo_realname_find); }struct fontinfo_realname_find f; f.realname = fontname; f.flags = flags; info = find234(fs->fonts_by_realname, &f, { char *ret = dupcat(fs->selected->fontclass->prefix, ":", name, NULL); sfree(name); return ret; } } return dupcat(fs->selected->fontclass->prefix, ":", fs->selected->realname, NULL Node-path: putty-gtk2/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2d21b5210f698c2356c2c0977fc98e17 Text-delta-base-sha1: 2bd0d0dcce619515b9c627b877fedfa100f99f2b Text-content-length: 52 Text-content-md5: 747cf5f96fc053657842b012d75ca56d Text-content-sha1: cbd87e5a6e44ca4def187e2570e1b6b039dff4e2 Content-length: 52 SVN���� �4��E4server:�W^�W�ng Node-path: putty-gtk2/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7e2e6bcca364c0f4244779cdcb58253 Text-delta-base-sha1: 58ce8e5aafb07473b1406886f1e1423c5073673e Text-content-length: 1308 Text-content-md5: 8b3a87b9b0973332b62d6cecd4f1ed8a Text-content-sha1: 39ecf9a62c6a197a37ac80a5b72622915e66dd8e Content-length: 1308 SVN��+8|�o�e�v9�WT/* * In GTK1-only PuTTY, we used to store font names simply as a * valid X font description string (logical or alias), under a * bare key such as "Font". * * In GTK2 PuTTY, we have a prefix system where "client:" * indicates a Pango font and "server:" an X one; existing * configuration needs to be reinterpreted as having the * "server:" prefix, so we change the storage key from the * provided name string (e.g. "Font") to a suffixed one * ("FontName"). */ char *suffname = dupcat(name, "Name", NULL); if (read_setting_s(handle, suffname, result->name, sizeof(result->name))) { sfree(suffname); return TRUE; /* got new-style name */ } sfree(suffname); /* Fall back to old-style name. */ memcpy(result->name, "server:", 7); if (!read_setting_s(handle, name, result->name + 7, sizeof(result->name) - 7) || !result->name[7]) { result->name[0] = '\0'; return FALSE; } else { return TRUE; }/* * read_setting_fontspec had to handle two cases, but when * writing our settings back out we simply always generate the * new-style name. */ char *suffname = dupcat(name, "Name", NULL); write_setting_s(handle, suffname, result.name); sfree(suff Revision-number: 7974 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-07T23:34:50.448100Z PROPS-END Revision-number: 7975 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-07T23:34:50.492358Z PROPS-END Revision-number: 7976 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-07T23:34:50.495595Z PROPS-END Revision-number: 7977 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-07T23:34:50.524788Z PROPS-END Revision-number: 7978 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-08T23:34:45.403737Z PROPS-END Revision-number: 7979 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-08T23:34:45.473503Z PROPS-END Revision-number: 7980 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-08T23:34:45.476991Z PROPS-END Revision-number: 7981 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-09T23:35:09.541335Z PROPS-END Revision-number: 7982 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-09T23:35:09.599077Z PROPS-END Revision-number: 7983 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-10T23:35:29.607824Z PROPS-END Revision-number: 7984 Prop-content-length: 297 Content-length: 297 K 8 svn:date V 27 2008-04-11T13:28:38.235989Z K 7 svn:log V 196 Utterly hideous new approach to extracting install-sh from the autoconf/automake edifice, since my previous approach of guessing its pathname turns out not to work on at least one kind of system. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkauto.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a636a02364e2c952172a86558860afa Text-delta-base-sha1: e901ac9481c4ab720956d7bc8796890e0142e931 Text-content-length: 1252 Text-content-md5: be2f026486a820f52bc545f050d32af8 Text-content-sha1: e320d6e275cef64eb765b38a0079c9eb3be3ca5f Content-length: 1252 SVN��c& N�2�N&=Persuade automake to give us a copy of its install-sh. This is a # pain because I don't actually want to have to _use_ automake. # Instead, I construct a trivial unrelated automake project in a # temporary subdirectory, run automake so that it'll copy # install-sh into that directory, then copy it back out again. # Hideous, but it should work. mkdir automake-grievous-hack cat > automake-grievous-hack/hello.c << EOF #include <stdio.h> int main(int argc, char **argv) { printf("hello, world\n"); return 0; } EOF cat > automake-grievous-hack/Makefile.am << EOF bin_PROGRAMS = hello hello_SOURCES = hello.c EOF cat > automake-grievous-hack/configure.ac << EOF AC_INIT AM_INIT_AUTOMAKE(hello, 1.0) AC_CONFIG_FILES([Makefile]) AC_PROG_CC AC_OUTPUT EOF echo Some news > automake-grievous-hack/NEWS echo Some text > automake-grievous-hack/README echo Some people > automake-grievous-hack/AUTHORS echo Some changes > automake-grievous-hack/ChangeLog rm -f install-sh # this won't work if we accidentally have one _here_ (cd automake-grievous-hack && autoreconf -i && \ cp install-sh ../unix/install-sh) rm -rf automake-grievous-hack # That was the hard bit. Now run autoconf on our real configure.in. (cd unix && autoreconf Revision-number: 7985 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-12T23:35:10.728681Z PROPS-END Revision-number: 7986 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-12T23:35:10.783435Z PROPS-END Revision-number: 7987 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-12T23:35:10.830507Z PROPS-END Revision-number: 7988 Prop-content-length: 394 Content-length: 394 K 7 svn:log V 293 Just noticed that selecting "client:Bitstream Vera Sans Mono 10" in the font config box and then invoking the unifontsel causes the box to come up empty rather than populated with that font. Turns out that I completely forgot to have pangofont_canonify_fontname() return the flags word, ahem. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-04-13T07:48:10.782582Z PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d04bf951dd7f650f20838ebdd8f1be3d Text-delta-base-sha1: 177e5b6302839a1a3ba8f775ae1e73b296b9d740 Text-content-length: 54 Text-content-md5: 4117b92ed862ea0b0566e37f1d9fbe4b Text-content-sha1: 35665399bae0517ff000ea50568043f4afa10157 Content-length: 54 SVN��9 �7��f1*flags = FONTFLAG_CLIENTSIDE Revision-number: 7989 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-14T23:35:31.183989Z PROPS-END Revision-number: 7990 Prop-content-length: 326 Content-length: 326 K 7 svn:log V 225 Prevent assertion failure in the case where the user manipulates the filter checkboxes to filter the currently selected font out of the family list and then does something in one of the other list boxes or the size edit box. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-04-14T17:57:45.436753Z PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4117b92ed862ea0b0566e37f1d9fbe4b Text-delta-base-sha1: 35665399bae0517ff000ea50568043f4afa10157 Text-content-length: 480 Text-content-md5: 2afd5db61ad0a453240ca685ebe0be8c Text-content-sha1: 19dfc522796630752279a7ed8812c1f286fb6632 Content-length: 480 SVN��9:�C�{�P'?�Cvdeselect(unifontsel_internal *fs) { fs->selected = NULL; gtk_list_store_clear(fs->style_model); gtk_list_store_clear(fs->size_model); gtk_widget_set_sensitive(fs->u.ok_button, FALSE); gtk_widget_set_sensitive(fs->size_entry, FALSE) /* * If we've just filtered out the previously selected font, * deselect it thoroughly. */ if (fs->selected && fs->selected->familyindex < 0) unifontsel_deselect(fs); Revision-number: 7991 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2008-04-14T18:00:57.984904Z K 7 svn:log V 110 Oops; prevent further segfault during setup, which apparently only show up when building without debugging... K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2afd5db61ad0a453240ca685ebe0be8c Text-delta-base-sha1: 19dfc522796630752279a7ed8812c1f286fb6632 Text-content-length: 54 Text-content-md5: a3c924b7d4844024a0e5a04dcfc01278 Text-content-sha1: cf5eae8c4621d983e7081c6737da3c3f92fd7ec2 Content-length: 54 SVN���W��pU�2^ fs->selected = NULL Revision-number: 7992 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-22T23:35:56.121931Z PROPS-END Revision-number: 7993 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2008-04-26T18:45:06.710280Z K 7 svn:log V 15 Mention Vista. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 961610436f68f2b5106dcd6f97fa59d9 Text-delta-base-sha1: 9481f66ed3e1f6eb06a419c6b02ca1d154971b86 Text-content-length: 43 Text-content-md5: dfa0b1ba31915be0768c6ee0b14066d9 Text-content-sha1: e8f02a32f91e520af710d41f5536c99630dfb54f Content-length: 43 SVN��% �m��2000, XP, and Vista Revision-number: 7994 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-27T23:35:25.442323Z PROPS-END Revision-number: 7995 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-27T23:35:25.572882Z PROPS-END Revision-number: 7996 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-04-27T23:35:25.576721Z PROPS-END Revision-number: 7997 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-01T23:38:22.894690Z PROPS-END Revision-number: 7998 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-16T23:36:43.129474Z PROPS-END Revision-number: 7999 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-16T23:36:43.191210Z PROPS-END Revision-number: 8000 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-17T23:36:32.698617Z PROPS-END Revision-number: 8001 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-18T23:35:03.718040Z PROPS-END Revision-number: 8002 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-19T23:35:52.887829Z PROPS-END Revision-number: 8003 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-20T23:34:12.529282Z PROPS-END Revision-number: 8004 Prop-content-length: 177 Content-length: 177 K 8 svn:date V 27 2008-05-21T09:48:40.063897Z K 7 svn:log V 77 Update the FAQ to state more explicitly that PuTTY contains no OpenSSL code. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dfa0b1ba31915be0768c6ee0b14066d9 Text-delta-base-sha1: e8f02a32f91e520af710d41f5536c99630dfb54f Text-content-length: 85 Text-content-md5: 7418861832d01af957b33b1a63ef6a77 Text-content-sha1: ef8921f6e6c8cf95f7af278c3e302d0b1829cf14 Content-length: 85 SVN��N5�@��H@� or OpenSSL S.A; we share no code at all with OpenSSL Revision-number: 8005 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-23T23:34:47.383927Z PROPS-END Revision-number: 8006 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.234832Z PROPS-END Revision-number: 8007 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.418838Z PROPS-END Revision-number: 8008 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.422798Z PROPS-END Revision-number: 8009 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.426173Z PROPS-END Revision-number: 8010 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.461152Z PROPS-END Revision-number: 8011 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.464738Z PROPS-END Revision-number: 8012 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.468468Z PROPS-END Revision-number: 8013 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.472093Z PROPS-END Revision-number: 8014 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.621087Z PROPS-END Revision-number: 8015 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.711396Z PROPS-END Revision-number: 8016 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.739667Z PROPS-END Revision-number: 8017 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.800249Z PROPS-END Revision-number: 8018 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-26T23:34:17.849774Z PROPS-END Revision-number: 8019 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-27T23:34:06.994788Z PROPS-END Revision-number: 8020 Prop-content-length: 332 Content-length: 332 K 7 svn:log V 231 OS X Leopard, it turns out, has a new and exciting strategy for addressing X displays. Update PuTTY's display-name-to-Unix-socket- path translation code to cope with it, thus causing X forwarding to start working again on Leopard. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-05-28T19:23:57.074688Z PROPS-END Node-path: putty/mac/macnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c7365de6a99817e268df2c7bd52d02a2 Text-delta-base-sha1: 64d7b73b4a7ee5687f27b68a90750d1cf056e34b Text-content-length: 67 Text-content-md5: def54b19729808e73ad4bc811fc1c584 Text-content-sha1: b9509b9a615e563b62d502436eb50d02f4918a86 Content-length: 67 SVN��Dd /�K��jZconst char *display, int displaynum, Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e4468209eda8d7385be923e1be7c60e Text-delta-base-sha1: 84541c43a640bfb58b9d6ebbc7a9f759fabefd2e Text-content-length: 70 Text-content-md5: 843888a03601302c22dc5894f017eda5 Text-content-sha1: 23ddd676b5bfb335fa791260072b39ebc66b4004 Content-length: 70 SVN��Ss /� ��8const char *display, int displaynum, Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 482cefe01fa565730c807372f5fcaee2 Text-delta-base-sha1: d269224642ed49fda811196d696225e6ccc22b7f Text-content-length: 635 Text-content-md5: ccfc1e0488a41bd5feb53c3f5d7263a2 Text-content-sha1: cfd666d5552d53721a5e20d0eb8d836750627589 Content-length: 635 SVN��X�Z��i)�CTconst char *display, int displaynum, /* * Mac OS X Leopard uses an innovative X display naming * convention in which the entire display name is the path to * the Unix socket, including the trailing :0 which only * _looks_ like a display number. Heuristically, I think * detecting this by means of a leading slash ought to be * adequate. */ if (display[0] == '/') { n = snprintf(ret->hostname, sizeof ret->hostname, "%s", display); } else { n = snprintf(ret->hostname, sizeof ret->hostname, "%s%d", X11_UNIX_PATH, displaynum); } Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 57cbe10df5bb6d6c4a68ca4d06911b3e Text-delta-base-sha1: 90d139edf139307a3add2d3ba3bfeb7982f8b15b Text-content-length: 72 Text-content-md5: 8f59707ebc5d732a3b2f4b88256e51c5 Text-content-sha1: a8f8735309d9082c57e30c9c5f8b84551be817ac Content-length: 72 SVN��Dd /�k��Jzconst char *display, int displaynum, Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 79276dae85fc22f31c42e86cdc959624 Text-delta-base-sha1: 5c4891a9224046b4512de5228b39e4f12899f5e0 Text-content-length: 46 Text-content-md5: c08ebc7d04cc71ae4b385128c9b0635f Text-content-sha1: 7fa247f86060be8fc4aa1c3cd963b121f8bd7fd6 Content-length: 46 SVN�����r� || host[0] == '/', Revision-number: 8021 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 Merge from trunk up to r8020. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-05-28T19:28:17.753654Z PROPS-END Node-path: putty-gtk2/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 961610436f68f2b5106dcd6f97fa59d9 Text-delta-base-sha1: 9481f66ed3e1f6eb06a419c6b02ca1d154971b86 Text-content-length: 110 Text-content-md5: 7418861832d01af957b33b1a63ef6a77 Text-content-sha1: ef8921f6e6c8cf95f7af278c3e302d0b1829cf14 Content-length: 110 SVN��%NH�m��@�HH�2000, XP, and Vista or OpenSSL S.A; we share no code at all with OpenSSL Node-path: putty-gtk2/doc/man-pter.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 54dbd339491b9bf3ad103ff5d0005520 Text-delta-base-sha1: 6bd2dd48ead7cc4e4aad0c2887bc0c6a3f3d8d60 Text-content-length: 23 Text-content-md5: eef3e9a117715fa1edb2257a82b3d78f Text-content-sha1: 3f6fbe6f338d5ef70d872ac1d4186249e40fa872 Content-length: 23 SVN��A< ��x��D} Node-path: putty-gtk2/mac/macnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c7365de6a99817e268df2c7bd52d02a2 Text-delta-base-sha1: 64d7b73b4a7ee5687f27b68a90750d1cf056e34b Text-content-length: 67 Text-content-md5: def54b19729808e73ad4bc811fc1c584 Text-content-sha1: b9509b9a615e563b62d502436eb50d02f4918a86 Content-length: 67 SVN��Dd /�K��jZconst char *display, int displaynum, Node-path: putty-gtk2/mkauto.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9546dc5edbd31d19e3c6a99e4a1a51b1 Text-delta-base-sha1: a68f576bbaaa138eccb2917da737445f92f9a400 Text-content-length: 1252 Text-content-md5: ba690e257bd082c86c44f71b9a560ff5 Text-content-sha1: 112936aae96daa59a267ca34aa5b25abf3bdb7b9 Content-length: 1252 SVN��V N�%�N&0Persuade automake to give us a copy of its install-sh. This is a # pain because I don't actually want to have to _use_ automake. # Instead, I construct a trivial unrelated automake project in a # temporary subdirectory, run automake so that it'll copy # install-sh into that directory, then copy it back out again. # Hideous, but it should work. mkdir automake-grievous-hack cat > automake-grievous-hack/hello.c << EOF #include <stdio.h> int main(int argc, char **argv) { printf("hello, world\n"); return 0; } EOF cat > automake-grievous-hack/Makefile.am << EOF bin_PROGRAMS = hello hello_SOURCES = hello.c EOF cat > automake-grievous-hack/configure.ac << EOF AC_INIT AM_INIT_AUTOMAKE(hello, 1.0) AC_CONFIG_FILES([Makefile]) AC_PROG_CC AC_OUTPUT EOF echo Some news > automake-grievous-hack/NEWS echo Some text > automake-grievous-hack/README echo Some people > automake-grievous-hack/AUTHORS echo Some changes > automake-grievous-hack/ChangeLog rm -f install-sh # this won't work if we accidentally have one _here_ (cd automake-grievous-hack && autoreconf -i && \ cp install-sh ../unix/install-sh) rm -rf automake-grievous-hack # That was the hard bit. Now run autoconf on our real configure.in. (cd unix && autoreconf Node-path: putty-gtk2/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e4468209eda8d7385be923e1be7c60e Text-delta-base-sha1: 84541c43a640bfb58b9d6ebbc7a9f759fabefd2e Text-content-length: 70 Text-content-md5: 843888a03601302c22dc5894f017eda5 Text-content-sha1: 23ddd676b5bfb335fa791260072b39ebc66b4004 Content-length: 70 SVN��Ss /� ��8const char *display, int displaynum, Node-path: putty-gtk2/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 482cefe01fa565730c807372f5fcaee2 Text-delta-base-sha1: d269224642ed49fda811196d696225e6ccc22b7f Text-content-length: 635 Text-content-md5: ccfc1e0488a41bd5feb53c3f5d7263a2 Text-content-sha1: cfd666d5552d53721a5e20d0eb8d836750627589 Content-length: 635 SVN��X�Z��i)�CTconst char *display, int displaynum, /* * Mac OS X Leopard uses an innovative X display naming * convention in which the entire display name is the path to * the Unix socket, including the trailing :0 which only * _looks_ like a display number. Heuristically, I think * detecting this by means of a leading slash ought to be * adequate. */ if (display[0] == '/') { n = snprintf(ret->hostname, sizeof ret->hostname, "%s", display); } else { n = snprintf(ret->hostname, sizeof ret->hostname, "%s%d", X11_UNIX_PATH, displaynum); } Node-path: putty-gtk2/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 57cbe10df5bb6d6c4a68ca4d06911b3e Text-delta-base-sha1: 90d139edf139307a3add2d3ba3bfeb7982f8b15b Text-content-length: 72 Text-content-md5: 8f59707ebc5d732a3b2f4b88256e51c5 Text-content-sha1: a8f8735309d9082c57e30c9c5f8b84551be817ac Content-length: 72 SVN��Dd /�k��Jzconst char *display, int displaynum, Node-path: putty-gtk2/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 79276dae85fc22f31c42e86cdc959624 Text-delta-base-sha1: 5c4891a9224046b4512de5228b39e4f12899f5e0 Text-content-length: 46 Text-content-md5: c08ebc7d04cc71ae4b385128c9b0635f Text-content-sha1: 7fa247f86060be8fc4aa1c3cd963b121f8bd7fd6 Content-length: 46 SVN�����r� || host[0] == '/', Revision-number: 8022 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-31T23:34:17.113693Z PROPS-END Revision-number: 8023 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-31T23:34:17.273204Z PROPS-END Revision-number: 8024 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-31T23:34:17.276976Z PROPS-END Revision-number: 8025 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-31T23:34:17.280480Z PROPS-END Revision-number: 8026 Prop-content-length: 265 Content-length: 265 K 8 svn:date V 27 2008-05-31T13:29:32.713849Z K 7 svn:log V 164 On some systems, strncpy is a macro, and putting preprocessor directives in the middle of a macro invocation appears to be frowned on. Irritating, but there we go. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c894b4203d1ddcc13ea5d3d820d6f603 Text-delta-base-sha1: 880a6447e74c2ecb374276f9a7045ccc254d5f18 Text-content-length: 232 Text-content-md5: 64cbcae04380b0d49629a940962deb0c Text-content-sha1: 25b419a48118fa5e846749d5a4bfc77ebde86784 Content-length: 232 SVN����� � �Lx�U#if GTK_CHECK_VERSION(2,6,0) strncpy(buffer, gtk_combo_box_get_active_text(GTK_COMBO_BOX(uc->combo)), length); #else strncpy(buffer, length); #endif�">�"� gtk_widget_show(w0); w1 Revision-number: 8027 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-31T23:34:17.678887Z PROPS-END Revision-number: 8028 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-31T23:34:17.682567Z PROPS-END Revision-number: 8029 Prop-content-length: 140 Content-length: 140 K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-05-31T17:11:16.327420Z K 7 svn:log V 40 Update for `win-randseed-location' fix. PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7418861832d01af957b33b1a63ef6a77 Text-delta-base-sha1: ef8921f6e6c8cf95f7af278c3e302d0b1829cf14 Text-content-length: 148 Text-content-md5: 88d6fa37249e8caf9f204fa3c80c0e9c Text-content-sha1: 4ea244f64af26a9d2da1c95b389f7bef2f91f73b Content-length: 148 SVN��Ny��y� D; this is stored by default in the \q{Application Data} directory, or failing that, one of a number of fallback locations Revision-number: 8030 Prop-content-length: 483 Content-length: 483 K 8 svn:date V 27 2008-05-31T17:22:29.531626Z K 7 svn:log V 382 Apparently Vista's printf-like functions don't support %n by default. We could explicitly re-enable %n, but we only use it in one place, so take the path of least resistance and remove that single instance. This stops dupvprintf() getting stuck in a loop (a behaviour that's caused by a workaround for a broken libc). <http://msdn.microsoft.com/en-us/library/ms175782(VS.80).aspx> K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a7e16781c059bfad922fe18f7c6a8d9 Text-delta-base-sha1: 5b4be37ecd760261145072f142a23ce9612c6749 Text-content-length: 101 Text-content-md5: 85155558bb0baae7139454487332242b Text-content-sha1: 565a5092bee7bcffd2d902bf25ee9e598fc458d4 Content-length: 101 SVN����������������8( �!��:)�by� [�Fr.*s", .*msglen, msg Revision-number: 8031 Prop-content-length: 419 Content-length: 419 K 7 svn:log V 318 Re-jig the combo box handling ifdefs so that we can compile with GTK versions >= 2.0 (when the new list boxes came in) but < 2.4 (when the new combo boxes came in). Since some combo boxes are handled using the old list-box code, this means that the two lots of code can both be compiled in at once in some situations! K 10 svn:author V 5 simon K 8 svn:date V 27 2008-05-31T19:23:45.673491Z PROPS-END Node-path: putty-gtk2/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 64cbcae04380b0d49629a940962deb0c Text-delta-base-sha1: 25b419a48118fa5e846749d5a4bfc77ebde86784 Text-content-length: 6086 Text-content-md5: 6b5ee0db750d2b9c50ac0d330c8650d2 Text-content-sha1: 4c31b53a1378ce6b1dbf61090d31d083cb682600 Content-length: 6086 SVN����x�,�M�Jdn�zv�Do�#r� �acS�H6�4�'`� ='� !�V9I�i �G�iP�D| �xH�]*�,1j�z7]�b0p�N�<w�48d�(s�*$�5wJ�@(d�*o��9a�'L�2�s}�lqX�3`�k�CN�J=���x�#Mn�<3�(pN�2sq��c�!�pS� =�`H�8P�#At��y 4,0) GtkWidget *list; /* for listbox (in GTK1), combobox (<=GTK2.3)#endif #if GTK_CHECK_VERSION(2,0,0) GtkWidget *treeview; /* for listbox (GTK2), droplist+combo (>=2.4#endif #if !GTK_CHECK_VERSION(2,4,0)GTK_CHECK_VERSION(2,4,0) if (uc->combo) entry = gtk_bin_get_child(GTK_BIN(uc->combo)); else #endif entry = uc->entry; assert(entry != NULL);4,0) if (uc->combo) { return; } #endif if (uc->entry) { return; } assert(!"We shouldn't get here"); } #if !GTK_CHECK_VERSION(2,44,0) return; } if (uc->list) { gtk_list_clear_items(GTK_LIST(uc->list), 0, -1); return; } #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->listmodel) { gtk_list_store_clear(uc->listmodel); return; } #endif assert(!"We shouldn't get here");4,0) return; } if (uc->list) { gtk_list_clear_items(GTK_LIST(uc->list), index, index+1); return; } #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->listmodel) return; } #endif assert(!"We shouldn't get here"); dp->flags |= FLAG_UPDATING_COMBO_LIST; #if !GTK_CHECK_VERSION(2,4,0) goto done; } if (uc->list && uc->entry) goto done; } #endif #if !GTK_CHECK_VERSION(2,0,0) if (uc->list goto done; } #else if (uc->listmodel) { GtkTreeIter iter; int i, cols goto done; } #endif assert(!"We shouldn't get here"); done: dp->flags &= ~FLAG_UPDATING_COMBO_LIST; } int dlg_listbox_getid4,0) if (uc->menu || uc->list) { GList *children; GtkObject *item;ndif #if GTK_CHECK_VERSION(2,0,0) if (uc->listmodel) { GtkTreePath *path; GtkTreeIter iter; int ret assert(!"We shouldn't get here"); return -1; /* placate dataflow analysis */4,0) if (uc->menu || uc->list) { GList *children; GtkWidget *item, *activeitem; int i; int selected = -1#else #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->treeview)#endif assert(!"We shouldn't get here"); return -1; /* placate dataflow analysis */4,0) if (uc->menu || uc->list)#else == index; } #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->treeview)#endif assert(!"We shouldn't get here"); return -1; /* placate dataflow analysis */4,0) if (uc->optmenu) { gtk_option_menu_set_history(GTK_OPTION_MENU(uc->optmenu), index); return; } if (uc->list) return; } #else if (uc->combo) { gtk_combo_box_set_active(GTK_COMBO_BOX(uc->combo), index); return; } #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->treeview) { GtkTreeSelection *treesel; GtkTreePath *path; return; } #endif assert(!"We shouldn't get here"); } void dlg_text44,0) if (uc->optmenu) { gtk_widget_grab_focus(uc->optmenu); break; } #else if (uc->combo) { gtk_widget_grab_focus(uc->combo); break; } #endif #if !GTK_CHECK_VERSION(2,0,0) if (uc->list) { /* * For GTK-1 style list boxes, we tell it to focus one * of its children, which appears to do the Right * Thing. */ gtk_container_focus(GTK_CONTAINER(uc->list), GTK_DIR_TAB_FORWARD); break; } #else if (uc->treeview) { gtk_widget_grab_focus(uc->treeview); break; } #endif assert(!"We shouldn't get here");#if !GTK_CHECK_VERSION(2,4,0) static void menuitem_activate(GtkMenuItem *item#else#endif /* !GTK_CHECK_VERSION(2,44,0) uc->list = uc->menu = uc->optmenu = NULL; #else uc->combo = NULL; #endif #if GTK_CHECK_VERSION(2,0,0) 4GTK_CHECK_VERSION(2,0,0) /* * First construct the list data store, with the right * number of columns. */ # if !GTK_CHECK_VERSION(2,4,0) /* (For GTK 2.0 to 2.3, we do this for full listboxes only, * because combo boxes are still done the old GTK1 way.) */ if (ctrl->listbox.height > 0) # endif#endif /* * See if it's a drop-down list (non-editable combo * box). */ if (ctrl->listbox.height == 0) { #if !GTK_CHECK_VERSION(2,4,0) /* * GTK1 and early-GTK2 option-menu style of * drop-down list. */#else /* * Late-GTK2 style using a GtkComboBox. */#endif } else { #if !GTK_CHECK_VERSION(2,0,0) /* * GTK1-style full list box. */ edge = GTK_WIDGET(uc->list)->style->klass->ythickness;#else /* * GTK2 treeview-based full list box. */#endif 4,0) break; } #else if (sc->uc->combo) { gtk_widget_grab_focus(sc->uc->combo); gtk_combo_box_popup(GTK_COMBO_BOX(sc->uc->combo)); break; } #endif #if !GTK_CHECK_VERSION(2,0,0) if (sc->uc->list) { /* * For GTK-1 style list boxes, we tell it to * focus one of its children, which appears to * do the Right Thing. */ break; } #else if (sc->uc->treeview) { gtk_widget_grab_focus(sc->uc->treeview); break; } #endif assert(!"We shouldn't get here"); gtk_widget_show(w0); w1 = layout_ctrls(&dp, &scs, s1, GTK_WINDOW(window)); gtk_container_set_border_width(GTK_CONTAINER(w1), 10); gtk_widget_set_usize(w1, minwid+20, -1); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox), w1, TRUE, TRUE, 0); gtk_widget_show(w1); dp.shortcuts = &scs; dp.lastfocus = NULL; dp.retval = 0; dp.window = window; gtk_window_set_modal(GTK_WINDOW(window), TRUE); if (parentwin) { set_transient_window_pos(parentwin, window); gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(parentwin)); } else gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_widget_show(window); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL�>2 �kn�,_FUNC(window_destroy), NULL Node-path: putty-gtk2/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a3c924b7d4844024a0e5a04dcfc01278 Text-delta-base-sha1: cf5eae8c4621d983e7081c6737da3c3f92fd7ec2 Text-content-length: 388 Text-content-md5: f86ce9bba1a1068480a691e199251417 Text-content-sha1: 9856da966f01905a86613b9c4b8a18a34285781c Content-length: 388 SVN��z=9�h� �&��*�r�]���L@� #if defined PANGO_PRE_1POINT4 && !defined PANGO_PRE_1POINT6 #define PANGO_PRE_1POINT6 /* make life easier for pre-1.4 folk */ #endif;#if GTK_CHECK_VERSION(2,4,0)table); gtk_widget_show(w); #else w = table; #endif#if GTK_CHECK_VERSION(2,4,0)#endif ww = w; w = gtk_frame_new("Preview of font" Revision-number: 8032 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-05-31T23:34:18.564052Z PROPS-END Revision-number: 8033 Prop-content-length: 599 Content-length: 599 K 7 svn:log V 498 Been meaning to do this for years: introduce a configuration option to manually tweak the host name and port number under which the SSH host key is read and written. I've put it in the cross-platform Connection panel. Partly under the flimsy pretext that other backends _can_ use it if they so wish (and in fact it overrides the host name for title-bar purposes in all network backends, though it has no other effect in anything but SSH); but mostly because the SSH panel was too full already :-) K 10 svn:author V 5 simon K 8 svn:date V 27 2008-06-01T11:16:32.430876Z PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bb8f61abb56e4f8c7c2e6bdb54ed28f3 Text-delta-base-sha1: 0882024d8703dbc54113a07fcfbe8bf0886278b8 Text-content-length: 200 Text-content-md5: c839a3ff0447529d1dcee7468fe2188e Text-content-sha1: 67f76709a84897117dfc64b2994c604604c89f8e Content-length: 200 SVN�� Z 0�!�0� !strcmp(p, "-loghost")) { RETURN(2); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); SAVEABLE(0); strncpy(cfg->loghost, value, sizeof(cfg->loghost)); cfg->loghost[sizeof(cfg->loghost Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 36c704b6b226034f423b0dcd833d734b Text-delta-base-sha1: bf20dc67979d83633ddd3daf92d8e2fb9c503f87 Text-content-length: 341 Text-content-md5: 499ae87a6f36ead362288f5b60dc7ff1 Text-content-sha1: 0609355d4e79c4a5712bd84a58c691b20a272c03 Content-length: 341 SVN��w08� �8�m s = ctrl_getset(b, "Connection", "identity", "Logical name of remote host"); ctrl_editbox(s, "Logical name of remote host (e.g. for SSH key lookup):", 'm', 100, HELPCTX(connection_loghost), dlg_stdeditbox_handler, I(offsetof(Config,loghost)), I(sizeof(((Config *)0)->loghost))); Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3af2b87862d62f5dabc909b5cd7157bc Text-delta-base-sha1: 02388aea241924bbd9c994a29b9feca75468227f Text-content-length: 5298 Text-content-md5: 6015a4f9c0b6877d0bb16ae5364203f0 Text-content-sha1: ec05f9ed10e9037489cf352e4440ab04bcfcc873 Content-length: 5298 SVN����1� �1�C S{config-loghost} \I{logical host name}\q{Logical name of remote host} \cfg{winhelp-topic}{connection.loghost} This allows you to tell PuTTY that the host it will really end up connecting to is different from where it thinks it is making a network connection. You might use this, for instance, if you had set up an SSH port forwarding in one PuTTY session so that connections to some arbitrary port (say, \cw{localhost} port 10022) were forwarded to a second machine's SSH port (say, \cw{foovax} port 22), and then started a second PuTTY connecting to the forwarded port. In normal usage, the second PuTTY will access the host key cache under the host name and port it actually connected to (i.e. \cw{localhost} port 10022 in this example). Using the logical host name option, however, you can configure the second PuTTY to cache the host key under the name of the host \e{you} know that it's \e{really} going to end up talking to (here \c{foovax}). This can be useful if you expect to connect to the same actual server through many different channels (perhaps because your port forwarding arrangements keep changing): by consistently setting the logical host name, you can arrange that PuTTY will not keep asking you to reconfirm its host key. Conversely, if you expect to use the same local port number for port forwardings to lots of different servers, you probably didn't want any particular server's host key cached under that local port number. If you just enter a host name for this option, PuTTY will cache the SSH host key under the default SSH port for that host, irrespective of the port you really connected to (since the typical scenario is like the above example: you connect to a silly real port number and your connection ends up forwarded to the normal port-22 SSH server of some other machine). To override this, you can append a port number to the logical host name, separated by a colon. E.g. entering \cq{foovax:2200} as the logical host name will cause the host key to be cached as if you had connected to port 2200 of \c{foovax}. If you provide a host name using this option, it is also displayed in other locations which contain the remote host name, such as the default window title and the default SSH password prompt. This reflects the fact that this is the host you're \e{really} connecting to, which is more important than the mere means you happen to be using to contact that host. (This applies even if you're using a protocol other than SSH.)�UI4�q��mer wraps around. Unlike time-based rekeys, data-based rekeys won't occur when the SSH connection is idle, so they shouldn't cause the same problems. The SSH-1 protocol, incidentally, has even weaker integrity protection than SSH-2 without rekeys. \H{config-ssh-auth} The Auth panel The Auth panel allows you to configure \i{authentication} options for SSH sessions. \S{config-ssh-noauth} \q{Bypass authentication entirely} \cfg{winhelp-topic}{ssh.auth.bypass} In SSH-2, it is possible to establish a connection without using SSH's mechanisms to identify or authenticate oneself to the server. Some servers may prefer to handle authentication in the data channel, for instance, or may simply require no authentication whatsoever. By default, PuTTY assumes the server requires authentication (most do), and thus must provide a username. If you find you are getting unwanted username prompts, you could try checking this option. This option only affects SSH-2 connections. SSH-1 connections always require an authentication step. \S{config-ssh-tryagent} \q{Attempt authentication using Pageant} \cfg{winhelp-topic}{ssh.auth.pageant} If this option is enabled, then PuTTY will look for Pageant (the SSH private-key storage agent) and attempt to authenticate with any suitable public keys Pageant currently holds. This behaviour is almost always desirable, and is therefore enabled by default. In rare cases you might need to turn it off in order to force authentication by some non-public-key method such as passwords. This option can also be controlled using the \c{-noagent} command-line option. See \k{using-cmdline-agentauth}. See \k{pageant} for more information about Pageant in general. \S{config-ssh-tis} \q{Attempt \I{TIS authentication}TIS or \i{CryptoCard authentication}} \cfg{winhelp-topic}{ssh.auth.tis} TIS and CryptoCard authentication are (despite their names) generic forms of simple \I{challenge/response authentication}challenge/response authentication available in SSH protocol version 1 only. You might use them if you were using \i{S/Key} \i{one-time passwords}, for example, or if you had a physical \i{security token} that generated responses to authentication challenges. They can even be used to prompt for simple passwords. With this switch enabled, PuTTY will attempt these forms of authentication if the server is willing to try them. You will be presented with a challenge string (which may be different every time) and must supply the cIf the connection you are forwarding over SSH is itself a second SSH connection made by another copy of PuTTY, you might find the \q{logical host name} configuration option useful to warn PuTTY of which host key it should be expecting. See \k{config-loghost} for details of thi Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 158b2ea12fc33f7c7d8861693e1c1fd4 Text-delta-base-sha1: 5ab304c4fb7b1c9701a468b7d6d7f3bd4d9596b6 Text-content-length: 154 Text-content-md5: 4ba505e88a09b295c98918b2635e1491 Text-content-sha1: 4374b41a78d7fb559afd010e4ba23de6961e7896 Content-length: 154 SVN��im�i� \IM{logical host name} logical host name \IM{logical host name} host name, logical \IM{logical host name} host key, caching policy Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e8da65def94d1cf99866119f1fc89f4 Text-delta-base-sha1: 160a97ff9d139e0a635682e67d4f0b74edf4b698 Text-content-length: 724 Text-content-md5: 51368782f3add6925c9679fcf7dee4c8 Text-content-sha1: 3c7bbd60ee594f4d00c6fdf0c553006988b93512 Content-length: 724 SVN��e+.���M �"CIf the connection you are forwarding over SSH is itself a second SSH connection made by another copy of PuTTY, you might find the \q{logical host name} configuration option useful to warn PuTTY of which host key it should be expecting. See \k{config-loghost} for details of thisloghost} \i\c{-loghost}: specify a \i{logical host name} This option overrides PuTTY's normal SSH host key caching policy by telling it the name of the host you expect your connection to end up at (in cases where this differs from the location PuTTY thinks it's connecting to). It can be a plain host name, or a host name followed by a colon and a port number. See \k{config-loghost} for more detail on this Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0bb4830efcecf53b631fb759860abca4 Text-delta-base-sha1: 98a4330faa819c5ee5c2f0e6268873564413021e Text-content-length: 99 Text-content-md5: eac721d23ddbfa66ce5c26212fdd959e Text-content-sha1: 94afda87f2324de15c05adfd046edb36e2fdfaf4 Content-length: 99 SVN��K J� �J�0char loghost[512]; /* logical host being contacted, for host key check */ Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49a49f58bfe263c84c939bc9f9cd9dde Text-delta-base-sha1: 646034945d0fdaa5cefc1f39e5cceebb8f8e486f Text-content-length: 344 Text-content-md5: c59c1f6d97e716845f8232798f5e2211 Text-content-sha1: 6a18f668143f426c3a41160f0fe367a4adf23c2c Content-length: 344 SVN��M @�L�@�Fif (*cfg->loghost) { char *colon; sfree(*realhost); *realhost = dupstr(cfg->loghost); colon = strrchr(*realhost, ':'); if (colon) { /* * FIXME: if we ever update this aspect of ssh.c for * IPv6 literal management, this should change in line * with it. */ *colon++ = '\0'; } } Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7ea8592b5901979aaeb7443c077700a3 Text-delta-base-sha1: 9d619a775c5ba6e2f82ac274e159b1c1db4d0a7c Text-content-length: 338 Text-content-md5: 212ea78fecb64555eb1b092faa02ff73 Text-content-sha1: 2b0521292712efb3ae17e28bac7fa3069292f241 Content-length: 338 SVN��G :�:�:�.if (*cfg->loghost) { char *colon; sfree(*realhost); *realhost = dupstr(cfg->loghost); colon = strrchr(*realhost, ':'); if (colon) { /* * FIXME: if we ever update this aspect of ssh.c for * IPv6 literal management, this should change in line * with it. */ *colon++ = '\0'; } Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73fc0e393554a13607d23f95f4cb6592 Text-delta-base-sha1: 378c7f5fead64891df018e6de2ae25e94eb165f4 Text-content-length: 123 Text-content-md5: 5f493ccaebf1f109f114dcdfe9d9dc39 Text-content-sha1: cc4e8188290f9a9c773a62b174e6bfb06456f0b3 Content-length: 123 SVN��b_]�=��6'�Ss(sesskey, "LogHost", cfg->loghoss(sesskey, "LogHost", "", cfg->loghost, sizeof(cfg->loghost) Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85155558bb0baae7139454487332242b Text-delta-base-sha1: 565a5092bee7bcffd2d902bf25ee9e598fc458d4 Text-content-length: 1807 Text-content-md5: de9b72c0c37365257a8575435355a348 Text-content-sha1: 294da3586ce6e479b073b4bca02dc19a1ba387b6 Content-length: 1807 SVN����/�S��E}�94if (*ssh->cfg.loghost) { char *colon; ssh->savedhost = dupstr(ssh->cfg.loghost); ssh->savedport = 22; /* default ssh port */ /* * A colon suffix on savedhost also lets us affect * savedport. * * (FIXME: do something about IPv6 address literals here.) */ colon = strrchr(ssh->savedhost, ':'); if (colon) { *colon++ = '\0'; if (*colon) ssh->savedport = atoi(colon); } } else { ssh->savedhost = dupstr(host); if (port < 0) port = 22; /* default ssh port */ ssh->savedport = port; }/* * loghost, if configured, overrides realhost. */ if (*ssh->cfg.loghost) { sfree(*realhost); *realhost = dupstr(ssh->cfg.loghost��� }}�X{�+Bs->responselen = ssh->agent_response_len; } s->response = (unsigned char *) r; if (s->response && s->responselen >= 5 && s->response[4] == SSH1_AGENT_RSA_IDENTITIES_ANSWER) { s->p = s->response + 5; s->nkeys = GET_32BIT(s->p); s->p += 4; logeventf(ssh, "Pageant has %d SSH-1 keys", s->nkeys); for (s->keyi = 0; s->keyi < s->nkeys; s->keyi++) { unsigned char *pkblob = s->p; s->p += 4; { int n, ok = FALSE; do { /* do while (0) to make breaking easy */�(;�(�len] = '\0'; peerport = ssh_pkt_getuint32(pktin); logeventf(ssh, "Received X11 connect request from %s:%d", addrstr, peerport); if (!ssh->X11_fwd_enabled) error = "X11 forwarding is not enabled"; else if (x11_init(&c->u.x11.s, ssh->cfg.x11_display, c, ssh->x11auth, addrstr, peerport, &ssh->cfg) != NULL) { error = "Unable to open an X11 connection"; } else { logevent("Opening X11 forward connection succeeded"); c->type = CHAN_X11; } sfree(addrstr); } else if (typelen == 15 && Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 601ecb8720c8c815745b0c9e538d141d Text-delta-base-sha1: 83202d79b01a4b64786781087ffbb107f69958c0 Text-content-length: 426 Text-content-md5: 1bc5807ea1ad8255997eb8ab1aedbd98 Text-content-sha1: 2bb6a48f9fbea3c4b0deb8859e9ed2495c92d5f5 Content-length: 426 SVN��3G���/* * loghost overrides realhost, if specified. */ if (*telnet->cfg.loghost) { char *colon; sfree(*realhost); *realhost = dupstr(telnet->cfg.loghost); colon = strrchr(*realhost, ':'); if (colon) { /* * FIXME: if we ever update this aspect of ssh.c for * IPv6 literal management, this should change in line * with it. */ *colon++ = '\0'; } } Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0bfb7976729460f1bfcee1f5406c4c5 Text-delta-base-sha1: 19fed566d8690f190377b9a802fe24bca8b501bb Text-content-length: 74 Text-content-md5: f65a8520ff3c32c7147ddaf07684d0a1 Text-content-sha1: 25272cab427f8ee1cf77c91934bc9f2b6e7afc5c Content-length: 74 SVN��l7 5���q{connection_loghost "connection.loghost:config-loghost Revision-number: 8034 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2008-06-01T11:19:06.623472Z K 7 svn:log V 31 Merged from trunk up to r8033. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bb8f61abb56e4f8c7c2e6bdb54ed28f3 Text-delta-base-sha1: 0882024d8703dbc54113a07fcfbe8bf0886278b8 Text-content-length: 200 Text-content-md5: c839a3ff0447529d1dcee7468fe2188e Text-content-sha1: 67f76709a84897117dfc64b2994c604604c89f8e Content-length: 200 SVN�� Z 0�!�0� !strcmp(p, "-loghost")) { RETURN(2); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); SAVEABLE(0); strncpy(cfg->loghost, value, sizeof(cfg->loghost)); cfg->loghost[sizeof(cfg->loghost Node-path: putty-gtk2/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 36c704b6b226034f423b0dcd833d734b Text-delta-base-sha1: bf20dc67979d83633ddd3daf92d8e2fb9c503f87 Text-content-length: 341 Text-content-md5: 499ae87a6f36ead362288f5b60dc7ff1 Text-content-sha1: 0609355d4e79c4a5712bd84a58c691b20a272c03 Content-length: 341 SVN��w08� �8�m s = ctrl_getset(b, "Connection", "identity", "Logical name of remote host"); ctrl_editbox(s, "Logical name of remote host (e.g. for SSH key lookup):", 'm', 100, HELPCTX(connection_loghost), dlg_stdeditbox_handler, I(offsetof(Config,loghost)), I(sizeof(((Config *)0)->loghost))); Node-path: putty-gtk2/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3af2b87862d62f5dabc909b5cd7157bc Text-delta-base-sha1: 02388aea241924bbd9c994a29b9feca75468227f Text-content-length: 5298 Text-content-md5: 6015a4f9c0b6877d0bb16ae5364203f0 Text-content-sha1: ec05f9ed10e9037489cf352e4440ab04bcfcc873 Content-length: 5298 SVN����1� �1�C S{config-loghost} \I{logical host name}\q{Logical name of remote host} \cfg{winhelp-topic}{connection.loghost} This allows you to tell PuTTY that the host it will really end up connecting to is different from where it thinks it is making a network connection. You might use this, for instance, if you had set up an SSH port forwarding in one PuTTY session so that connections to some arbitrary port (say, \cw{localhost} port 10022) were forwarded to a second machine's SSH port (say, \cw{foovax} port 22), and then started a second PuTTY connecting to the forwarded port. In normal usage, the second PuTTY will access the host key cache under the host name and port it actually connected to (i.e. \cw{localhost} port 10022 in this example). Using the logical host name option, however, you can configure the second PuTTY to cache the host key under the name of the host \e{you} know that it's \e{really} going to end up talking to (here \c{foovax}). This can be useful if you expect to connect to the same actual server through many different channels (perhaps because your port forwarding arrangements keep changing): by consistently setting the logical host name, you can arrange that PuTTY will not keep asking you to reconfirm its host key. Conversely, if you expect to use the same local port number for port forwardings to lots of different servers, you probably didn't want any particular server's host key cached under that local port number. If you just enter a host name for this option, PuTTY will cache the SSH host key under the default SSH port for that host, irrespective of the port you really connected to (since the typical scenario is like the above example: you connect to a silly real port number and your connection ends up forwarded to the normal port-22 SSH server of some other machine). To override this, you can append a port number to the logical host name, separated by a colon. E.g. entering \cq{foovax:2200} as the logical host name will cause the host key to be cached as if you had connected to port 2200 of \c{foovax}. If you provide a host name using this option, it is also displayed in other locations which contain the remote host name, such as the default window title and the default SSH password prompt. This reflects the fact that this is the host you're \e{really} connecting to, which is more important than the mere means you happen to be using to contact that host. (This applies even if you're using a protocol other than SSH.)�UI4�q��mer wraps around. Unlike time-based rekeys, data-based rekeys won't occur when the SSH connection is idle, so they shouldn't cause the same problems. The SSH-1 protocol, incidentally, has even weaker integrity protection than SSH-2 without rekeys. \H{config-ssh-auth} The Auth panel The Auth panel allows you to configure \i{authentication} options for SSH sessions. \S{config-ssh-noauth} \q{Bypass authentication entirely} \cfg{winhelp-topic}{ssh.auth.bypass} In SSH-2, it is possible to establish a connection without using SSH's mechanisms to identify or authenticate oneself to the server. Some servers may prefer to handle authentication in the data channel, for instance, or may simply require no authentication whatsoever. By default, PuTTY assumes the server requires authentication (most do), and thus must provide a username. If you find you are getting unwanted username prompts, you could try checking this option. This option only affects SSH-2 connections. SSH-1 connections always require an authentication step. \S{config-ssh-tryagent} \q{Attempt authentication using Pageant} \cfg{winhelp-topic}{ssh.auth.pageant} If this option is enabled, then PuTTY will look for Pageant (the SSH private-key storage agent) and attempt to authenticate with any suitable public keys Pageant currently holds. This behaviour is almost always desirable, and is therefore enabled by default. In rare cases you might need to turn it off in order to force authentication by some non-public-key method such as passwords. This option can also be controlled using the \c{-noagent} command-line option. See \k{using-cmdline-agentauth}. See \k{pageant} for more information about Pageant in general. \S{config-ssh-tis} \q{Attempt \I{TIS authentication}TIS or \i{CryptoCard authentication}} \cfg{winhelp-topic}{ssh.auth.tis} TIS and CryptoCard authentication are (despite their names) generic forms of simple \I{challenge/response authentication}challenge/response authentication available in SSH protocol version 1 only. You might use them if you were using \i{S/Key} \i{one-time passwords}, for example, or if you had a physical \i{security token} that generated responses to authentication challenges. They can even be used to prompt for simple passwords. With this switch enabled, PuTTY will attempt these forms of authentication if the server is willing to try them. You will be presented with a challenge string (which may be different every time) and must supply the cIf the connection you are forwarding over SSH is itself a second SSH connection made by another copy of PuTTY, you might find the \q{logical host name} configuration option useful to warn PuTTY of which host key it should be expecting. See \k{config-loghost} for details of thi Node-path: putty-gtk2/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7418861832d01af957b33b1a63ef6a77 Text-delta-base-sha1: ef8921f6e6c8cf95f7af278c3e302d0b1829cf14 Text-content-length: 148 Text-content-md5: 88d6fa37249e8caf9f204fa3c80c0e9c Text-content-sha1: 4ea244f64af26a9d2da1c95b389f7bef2f91f73b Content-length: 148 SVN��Ny��y� D; this is stored by default in the \q{Application Data} directory, or failing that, one of a number of fallback locations Node-path: putty-gtk2/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 158b2ea12fc33f7c7d8861693e1c1fd4 Text-delta-base-sha1: 5ab304c4fb7b1c9701a468b7d6d7f3bd4d9596b6 Text-content-length: 154 Text-content-md5: 4ba505e88a09b295c98918b2635e1491 Text-content-sha1: 4374b41a78d7fb559afd010e4ba23de6961e7896 Content-length: 154 SVN��im�i� \IM{logical host name} logical host name \IM{logical host name} host name, logical \IM{logical host name} host key, caching policy Node-path: putty-gtk2/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e8da65def94d1cf99866119f1fc89f4 Text-delta-base-sha1: 160a97ff9d139e0a635682e67d4f0b74edf4b698 Text-content-length: 724 Text-content-md5: 51368782f3add6925c9679fcf7dee4c8 Text-content-sha1: 3c7bbd60ee594f4d00c6fdf0c553006988b93512 Content-length: 724 SVN��e+.���M �"CIf the connection you are forwarding over SSH is itself a second SSH connection made by another copy of PuTTY, you might find the \q{logical host name} configuration option useful to warn PuTTY of which host key it should be expecting. See \k{config-loghost} for details of thisloghost} \i\c{-loghost}: specify a \i{logical host name} This option overrides PuTTY's normal SSH host key caching policy by telling it the name of the host you expect your connection to end up at (in cases where this differs from the location PuTTY thinks it's connecting to). It can be a plain host name, or a host name followed by a colon and a port number. See \k{config-loghost} for more detail on this Node-path: putty-gtk2/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0bb4830efcecf53b631fb759860abca4 Text-delta-base-sha1: 98a4330faa819c5ee5c2f0e6268873564413021e Text-content-length: 99 Text-content-md5: eac721d23ddbfa66ce5c26212fdd959e Text-content-sha1: 94afda87f2324de15c05adfd046edb36e2fdfaf4 Content-length: 99 SVN��K J� �J�0char loghost[512]; /* logical host being contacted, for host key check */ Node-path: putty-gtk2/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49a49f58bfe263c84c939bc9f9cd9dde Text-delta-base-sha1: 646034945d0fdaa5cefc1f39e5cceebb8f8e486f Text-content-length: 344 Text-content-md5: c59c1f6d97e716845f8232798f5e2211 Text-content-sha1: 6a18f668143f426c3a41160f0fe367a4adf23c2c Content-length: 344 SVN��M @�L�@�Fif (*cfg->loghost) { char *colon; sfree(*realhost); *realhost = dupstr(cfg->loghost); colon = strrchr(*realhost, ':'); if (colon) { /* * FIXME: if we ever update this aspect of ssh.c for * IPv6 literal management, this should change in line * with it. */ *colon++ = '\0'; } } Node-path: putty-gtk2/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7ea8592b5901979aaeb7443c077700a3 Text-delta-base-sha1: 9d619a775c5ba6e2f82ac274e159b1c1db4d0a7c Text-content-length: 338 Text-content-md5: 212ea78fecb64555eb1b092faa02ff73 Text-content-sha1: 2b0521292712efb3ae17e28bac7fa3069292f241 Content-length: 338 SVN��G :�:�:�.if (*cfg->loghost) { char *colon; sfree(*realhost); *realhost = dupstr(cfg->loghost); colon = strrchr(*realhost, ':'); if (colon) { /* * FIXME: if we ever update this aspect of ssh.c for * IPv6 literal management, this should change in line * with it. */ *colon++ = '\0'; } Node-path: putty-gtk2/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73fc0e393554a13607d23f95f4cb6592 Text-delta-base-sha1: 378c7f5fead64891df018e6de2ae25e94eb165f4 Text-content-length: 123 Text-content-md5: 5f493ccaebf1f109f114dcdfe9d9dc39 Text-content-sha1: cc4e8188290f9a9c773a62b174e6bfb06456f0b3 Content-length: 123 SVN��b_]�=��6'�Ss(sesskey, "LogHost", cfg->loghoss(sesskey, "LogHost", "", cfg->loghost, sizeof(cfg->loghost) Node-path: putty-gtk2/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a7e16781c059bfad922fe18f7c6a8d9 Text-delta-base-sha1: 5b4be37ecd760261145072f142a23ce9612c6749 Text-content-length: 1858 Text-content-md5: de9b72c0c37365257a8575435355a348 Text-content-sha1: 294da3586ce6e479b073b4bca02dc19a1ba387b6 Content-length: 1858 SVN����/�S��E}�94if (*ssh->cfg.loghost) { char *colon; ssh->savedhost = dupstr(ssh->cfg.loghost); ssh->savedport = 22; /* default ssh port */ /* * A colon suffix on savedhost also lets us affect * savedport. * * (FIXME: do something about IPv6 address literals here.) */ colon = strrchr(ssh->savedhost, ':'); if (colon) { *colon++ = '\0'; if (*colon) ssh->savedport = atoi(colon); } } else { ssh->savedhost = dupstr(host); if (port < 0) port = 22; /* default ssh port */ ssh->savedport = port; }/* * loghost, if configured, overrides realhost. */ if (*ssh->cfg.loghost) { sfree(*realhost); *realhost = dupstr(ssh->cfg.loghost��� }}�X{�+Bs->responselen = ssh->agent_response_len; } s->response = (unsigned char *) r; if (s->response && s->responselen >= 5 && s->response[4] == SSH1_AGENT_RSA_IDENTITIES_ANSWER) { s->p = s->response + 5; s->nkeys = GET_32BIT(s->p); s->p += 4; logeventf(ssh, "Pageant has %d SSH-1 keys", s->nkeys); for (s->keyi = 0; s->keyi < s->nkeys; s->keyi++) { unsigned char *pkblob = s->p; s->p += 4; { int n, ok = FALSE; do { /* do while (0) to make breaking easy */�8;#+�!��:)�by� [�Frlen] = '\0'; peerport = ssh_pkt_getuint32(pktin); logeventf(ssh, "Received X11 connect request from %s:%d", addrstr, peerport); if (!ssh->X11_fwd_enabled) error = "X11 forwarding is not enabled"; else if (x11_init(&c->u.x11.s, ssh->cfg.x11_display, c, ssh->x11auth, addrstr, peerport, &ssh->cfg) != NULL) { error = "Unable to open an X11 connection"; } else { logevent("Opening X11 forward connection succeeded"); c->type = CHAN_X11; } sfree(addrstr); } else if (typelen == 15 && .*s", .*msglen, msg Node-path: putty-gtk2/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 601ecb8720c8c815745b0c9e538d141d Text-delta-base-sha1: 83202d79b01a4b64786781087ffbb107f69958c0 Text-content-length: 426 Text-content-md5: 1bc5807ea1ad8255997eb8ab1aedbd98 Text-content-sha1: 2bb6a48f9fbea3c4b0deb8859e9ed2495c92d5f5 Content-length: 426 SVN��3G���/* * loghost overrides realhost, if specified. */ if (*telnet->cfg.loghost) { char *colon; sfree(*realhost); *realhost = dupstr(telnet->cfg.loghost); colon = strrchr(*realhost, ':'); if (colon) { /* * FIXME: if we ever update this aspect of ssh.c for * IPv6 literal management, this should change in line * with it. */ *colon++ = '\0'; } } Node-path: putty-gtk2/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0bfb7976729460f1bfcee1f5406c4c5 Text-delta-base-sha1: 19fed566d8690f190377b9a802fe24bca8b501bb Text-content-length: 74 Text-content-md5: f65a8520ff3c32c7147ddaf07684d0a1 Text-content-sha1: 25272cab427f8ee1cf77c91934bc9f2b6e7afc5c Content-length: 74 SVN��l7 5���q{connection_loghost "connection.loghost:config-loghost Revision-number: 8035 Prop-content-length: 637 Content-length: 637 K 7 svn:log V 536 Update this wishlist item in several respects: - remove any hint of possibly supporting OpenSSH's IP-address based caching, since I've now looked into it and decided it's horrid. Hence this wishlist item is now solely about selecting between several host keys. - remove the bit about explicitly specifying the name under which to file a host key, since I've just implemented it - mention the recently reported problem if you "accept once" in PSFTP and then keep the session open for long enough to trigger a rekey. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-06-01T13:56:29.346628Z PROPS-END Node-path: putty-wishlist/data/hostkey-policy Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49b87683d10a96837f25dac9b2967b21 Text-delta-base-sha1: bac70ad14a2e00a36fdd86af42596cdffe7879a8 Text-content-length: 1510 Text-content-md5: a93d13bda3409e1c84d7bdfbf053ed62 Text-content-sha1: df58e0683cf7e99b819bb149fc3e847074daedf8 Content-length: 1510 SVN��}7S�d4Summary: Enhanced flexibility in SSH host key selectionSSH-2 host key selection policy currently involves a fixed preference order of RSA then DSA. I occasionally think it would be good to add a preference list to tweak the policy, either to put DSA first (if you're really mad) or to move DSA to below the "warn below this line" line. <p> When there's a choice of host keys available for a host, perhaps PuTTY should adjust its stated preferences so that the ones it already has cached come first. Need to think about that a bit. At the very least, when a new host key prompt is given, PuTTY should mention if it already has host keys for a host in other formats - particularly important when the <a href="ssh2-default.html">default protocol changes to SSH-2</a>, or a server that previously offered DSS keys starts supporting RSA too. <p> Finally, there's currently undesirable behaviour in PSFTP if you click "accept once" on a host key at startup and then leave the connection open for long enough to trigger a rekey timeout: since the host key has only been accepted once, PSFTP puts up the confirmation message again, in the middle of a command-line session, which is pretty nasty. Certainly at the very least we should treat "accept once" on a host key to mean accept for the whole of a <em>session</em> rather than for a single KEX; additionally, we probably ought to think about some sort of sensible behaviour if the host key we initially accepted has disappeared by rekey time. Revision-number: 8036 Prop-content-length: 188 Content-length: 188 K 7 svn:log V 88 Summary: Changing scrollback size when on alternate screen clears the screen Class: bug K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-06-02T21:43:16.059532Z PROPS-END Node-path: putty-wishlist/data/change-scrollback-altscr Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 357 Text-content-md5: 324722c545043e92f1ad8a864444995d Text-content-sha1: 781791f152f5a7aa2a69ef613caed95a52fb1411 Content-length: 367 PROPS-END SVN���WWWSummary: Changing scrollback size when on alternate screen clears the screen Class: bug Present-in: 0.56 0.59 0.60 2008-06-02 Content-type: text/x-html-body <p> Changing the number of lines of scrollback while in the alternate screen causes the screen to be cleared and the cursor to be moved to the top left. This probably shouldn't happen. Revision-number: 8037 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2008-06-04T23:05:48.550525Z K 7 svn:log V 58 At last, merge the putty-gtk2 branch back into the trunk! K 10 svn:author V 5 simon PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e031befbc2f8d40e504a077cb0524cac Text-delta-base-sha1: bef93bb2900eba9688afefd320d8a4d3612c2b8c Text-content-length: 32 Text-content-md5: abfb85ed5bf47462ec46c6a7045582b3 Text-content-sha1: 926e571f2a6c1446d88882872bb5792ad7c03275 Content-length: 32 SVN�� �w�� tColin Watso Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: efc8090fec90b8bc70eb2232e84c7f61 Text-delta-base-sha1: daded408733f8c64363a53548f4ad1c483634a32 Text-content-length: 25 Text-content-md5: 9a556a673cce4875bd56a7cdff554081 Text-content-sha1: 9aaef7812b4d00299ea03ab5b506faccd2b6c6b0 Content-length: 25 SVN��2: �g��Ocfont Node-path: putty/charset/macenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a21c49fabf4efd668c00b474da19690 Text-delta-base-sha1: 536b1b7dc527f3f3e6bb638a032536966a671d90 Text-content-length: 22 Text-content-md5: 69421b0b2bc4e1c4c3e458274f972cb7 Text-content-sha1: bebc73f143e64d2d9d7f1bad90c64de9e5233373 Content-length: 22 SVN��[.�(3/* $Id Node-path: putty/dialog.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f7dc1af2fc178abc6b67acdb7c2b237 Text-delta-base-sha1: 176d67115b802da6a5d2512495092cb8e8cd0c41 Text-content-length: 364 Text-content-md5: 7af24eed66258f399ec4bcdd7b74631a Text-content-sha1: ba96472a613cc0b0aa398e41dbb103050198d530 Content-length: 364 SVN��%nF���`C�d=�H] * Don't try setting has_list and password on the same * control; front ends are not required to support that * combination. * There should never be more than one column in a * drop-down list (one with height==0), because front ends * may have to implement it as a special case of an * editable combo box. */ Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e595212f57b2d94b700c0c216ace466 Text-delta-base-sha1: a4ef3df633f59509d8cb7a470ed47a61818dcf98 Text-content-length: 42 Text-content-md5: 29bfe12c6b6ce925f9b24446163ad961 Text-content-sha1: 0e48f1faa01bfdc680781ccbb2fa0526d27b1c0a Content-length: 42 SVN��R` �?�� F Kuhn, Colin Watson, Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b666950480868f06a35eab1e72103f2f Text-delta-base-sha1: e388f6cf211892292420c6407b328142b32eb31c Text-content-length: 36 Text-content-md5: 6ee8dc3c5d4c632626394c74c9a81a9f Text-content-sha1: 57209b5a9dfc25c62a63231c2b93d095180ff227 Content-length: 36 SVN��Q_ �r��boColin Watso Node-path: putty/mac/macabout.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1fdcb3a63c4d5954eb0475f51021f026 Text-delta-base-sha1: ff773f29e5655cdf892c1f4880ab2c8b10337fed Text-content-length: 22 Text-content-md5: 559a7f797e62f2f3486f55258189bd6a Text-content-sha1: 671040ba0306cc91d5954b8238fc149053ddc2f5 Content-length: 22 SVN��b�\5/* $Id Node-path: putty/mac/macpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 47224bea8e79c79141ad04ca4ab48398 Text-delta-base-sha1: 1f84dd8183495cd143fd48f9aba7e5f53d1de9bc Text-content-length: 22 Text-content-md5: fbafc883411ceebf99c5ea1a93038bf4 Text-content-sha1: 6290b1e84a0f51c95180ecc6e3d23cca615fb6a0 Content-length: 22 SVN��|N�H4/* $Id Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 268263af9ac76fe2d95e35ccfa9e1152 Text-delta-base-sha1: c8e1966f56c314cde15ba763725a4db549ce1124 Text-content-length: 32 Text-content-md5: b9eb688ebf96994c1b124c3966f98379 Text-content-sha1: 6bcacaddd8596ccf8acc446f743aa364276eacf6 Content-length: 32 SVN��z ���bColin Watso Node-path: putty/mac/macpgkey.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 788191568704cb5fc1951e0a88d5bac6 Text-delta-base-sha1: a17c25aebfb6f9ef933631d9b029f78f9312e3cc Text-content-length: 22 Text-content-md5: 820a51615baaf4342d495e367f7a2d07 Text-content-sha1: 3d133c47da1755109217672febd4f3b4d188307e Content-length: 22 SVN��!r�l5/* $Id Node-path: putty/mac/macpgrid.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ce273b82e8703e3f116dbf473689e3dd Text-delta-base-sha1: 549b2a038605424a424d0f7e94df441b93f81b07 Text-content-length: 22 Text-content-md5: 04d74ad8ebceaadebcdec556ff171c08 Text-content-sha1: 70eae076f461a8b18eb149466f8f031b782ba6a1 Content-length: 22 SVN��*{�u5/* $Id Node-path: putty/mkauto.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: be2f026486a820f52bc545f050d32af8 Text-delta-base-sha1: e320d6e275cef64eb765b38a0079c9eb3be3ca5f Text-content-length: 132 Text-content-md5: ba690e257bd082c86c44f71b9a560ff5 Text-content-sha1: 112936aae96daa59a267ca34aa5b25abf3bdb7b9 Content-length: 132 SVN��& n�2�n�y-It's nice to be able to run this from inside the unix subdir as # well as from outside. test -f unix.h && cd . Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b21fc8221ba90ad4e6b2da8c6b25e7c0 Text-delta-base-sha1: 0ad195af0daebf131de2d2ff70824640d667355c Text-content-length: 578 Text-content-md5: ef5ed971ffebf66942be79421920630e Text-content-sha1: 54c4dc7c18ed9d84d7726b04cfd1f0e7bf7b2712 Content-length: 578 SVN��R �r�(�qyv� G# You can manually set this to `gtk-config' or `pkg-config gtk+-1.2'\n". "# (depending on what works on your system) if you want to enforce\n". "# building with GTK 1.2, or you can set it to `pkg-config gtk+-2.0'\n". "# if you want to enforce 2.0. The default is to try 2.0 and fall back\n". "# to 1.2 if it isn't found.\n". "GTK_CONFIG = sh -c 'pkg-config gtk+-2.0 \$\$0 2>/dev/null || gtk-config \$\$0' . " `\$(GTK_CONFIG) --cflags`"). " -D _FILE_OFFSET_BITS=64\n". "XLDFLAGS = \$(LDFLAGS) `\$(GTK_CONFIG) Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f760351c2c3c19c49d70eb5d51738356 Text-delta-base-sha1: 3d07dbeedb5ed226a836cb269708af13fff01936 Text-content-length: 656 Text-content-md5: b6ad8af00275b4244daa9abc877d1faa Text-content-sha1: 7bd21ace9c30e197881685d2315ef49c0c77ac4c Content-length: 656 SVN��]u�W�X�5%# Look for both GTK 1 and GTK 2. AM_PATH_GTK([1.2.0], [gtk=1], [gtk=none]) AM_PATH_GTK_2_0([2.0.0], [gtk=2], []) if test "$gtk" = "none"; then all_targets="all-cli" else all_targets="all-cli all-gtk" fi if test "$gtk" = "2"; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$GTK_LIBS $LIBS" AC_CHECK_FUNCS([pango_font_family_is_monospace pango_font_map_list_families]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi#ifndef HAVE_PANGO_FONT_FAMILY_IS_MONOSPACE # define PANGO_PRE_1POINT4 #endif #ifndef HAVE_PANGO_FONT_MAP_LIST_FAMILIES # define PANGO_PRE_1POINT6 #endif ]) Node-path: putty/unix/gtkcols.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c27be5b591a08f7f24ab5dbcbd6a901 Text-delta-base-sha1: 9636f5dd1724852f15de4b518049e828b90f3ca8 Text-content-length: 2401 Text-content-md5: d92f4df3ae6575f1a9a2aae38611c26b Text-content-sha1: ac2940f0d7873875cbfe26cf1e8a330f1602a34d Content-length: 2401 SVN��' ji�b��:a��-!n��.W�13�4c�$�59�imv�3�D�vk�[�� #include <gtk/gtk.h>#if !GTK_CHECK_VERSION(2,0,0)#endif#if !GTK_CHECK_VERSION(2,0,0) static gint columns_focus(GtkContainer *container, GtkDirectionType dir); #endif#if !GTK_CHECK_VERSION(2,0,0)#else GType columns_get_type(void) { static GType columns_type = 0; if (!columns_type) { static const GTypeInfo columns_info = { sizeof(ColumnsClass), NULL, NULL, (GClassInitFunc) columns_class_init, NULL, NULL, sizeof(Columns), 0, (GInstanceInitFunc)columns_init, }; columns_type = g_type_register_static(GTK_TYPE_CONTAINER, "Columns", &columns_info, 0); } return columns_type; } #endif #if !GTK_CHECK_VERSION(2,0,0) static gint (*columns_inherited_focus)(GtkContainer *container, GtkDirectionType direction); #endif static void columns_class_init(ColumnsClass *klass) { #if !GTK_CHECK_VERSION(2,0,0) /* GtkObjectClass *object_class = (GtkObjectClass *)klass; */ GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; GtkContainerClass *container_class = (GtkContainerClass *)klass; #else /* GObjectClass *object_class = G_OBJECT_CLASS(klass); */ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); GtkContainerClass *container_class = GTK_CONTAINER_CLASS(klass); #endif #if !GTK_CHECK_VERSION(2,0,0) parent_class = gtk_type_class(GTK_TYPE_CONTAINER); #else parent_class = g_type_class_peek_parent(klass); #endif widget_class->map = columns_map; widget_class->unmap = columns_unmap; #if !GTK_CHECK_VERSION(2,0,0) widget_class->draw = columns_draw; widget_class->expose_event = columns_expose; #endif#if !GTK_CHECK_VERSION(2,0,0)#endif#if !GTK_CHECK_VERSION(2,0,0)#endif#if GTK_CHECK_VERSION(2,0,0) gtk_container_set_focus_chain(container, cols->taborder); #endif break; } } #if !GTK_CHECK_VERSION(2,0,0) cols = gtk_type_new(columns_get_type()); #else cols = g_object_new(TYPE_COLUMNS, NULL); #endif #if GTK_CHECK_VERSION(2,0,0) gtk_container_set_focus_chain(GTK_CONTAINER(cols), cols->taborder); #endif#if GTK_CHECK_VERSION(2,0,0) gtk_container_set_focus_chain(GTK_CONTAINER(cols), cols->taborder); #endif break; } } #if !GTK_CHECK_VERSION(2,0,0)#endif Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 329acd856d77f19481233975cb3d5142 Text-delta-base-sha1: 4220b9dafbfc1d6bc4aed8fb21a025f616d600e6 Text-content-length: 46818 Text-content-md5: 6b5ee0db750d2b9c50ac0d330c8650d2 Text-content-sha1: 4c31b53a1378ce6b1dbf61090d31d083cb682600 Content-length: 46818 SVN��z�#q�I��WR�%4�2<�cg�'i�67�;b�q}�AY�L3�o�fx�?]�N� !� `n�^:A�iv�kG�ix\�Ws�c9e�Lt{�e�c9�Lt�++�c9�LtX�u9�1C�S�VLq�8?~�Qv� FB�,�5E�}}�@�@�n?]�P1P�}}�mKN�|~�-�LP7�K�X�I}�I}A�J|v� :�~|�G}��J[�!$�Ch�ySE�,7�=a2�GzW�n��BK�)�(]�G�`$#�@�2R�nv�!8�4�;C�W �m;��m;Q�2^_�:>�c@|�Pz�i��fk��#@t�r�~`�]� O�O:F� �(T.�hD�9�A4G�vX�)�z%�SV?�P{�KZ^�tOf�NB/�J<�]}�F9�S4#include "gtkfontfilesel, fontsel */ GtkWidget *button; /* for filesel, fontsel */ #if !GTK_CHECK_VERSION(2,4,0) GtkWidget *list; /* for listbox (in GTK1), combobox (<=GTK2.3) */ GtkWidget *menu; /* for optionmenu (==droplist) */ GtkWidget *optmenu; /* also for optionmenu */ #else GtkWidget *combo; /* for combo box (either editable or not) */ #endif #if GTK_CHECK_VERSION(2,0,0) GtkWidget *treeview; /* for listbox (GTK2), droplist+combo (>=2.4) */ GtkListStore *listmodel; /* for all types of list box */ #endifentrysig;; union control *currfocus, *lastfocus; #if !GTK_CHECK_VERSION(2,0,0) GtkWidget *currtreeitem, **treeitems; int ntreeitems; #endif int retval; }; #define FLAG_UPDATING_COMBO_LIST 1 #define FLAG_UPDATING_LISTBOX 2#if GTK_CHECK_VERSION(2,0,0) enum { TREESTORE_PATH, TREESTORE_PARAMS, TREESTORE_NUM }; #endif#if !GTK_CHECK_VERSION(2,0,0) static gboolean listitem_single_key(GtkWidget *item, GdkEventKey *event, gpointer data); static gboolean listitem_multi_key(GtkWidget *item, GdkEventKey *event, gpointer data); static gboolean listitem_button_press(GtkWidget *item, GdkEventButton *event, gpointer data); static gboolean listitem_button_release(GtkWidget *item, GdkEventButton *event, gpointer data); #endif #if !GTK_CHECK_VERSION(2,4,0) static void menuitem_activate(GtkMenuItem *item, gpointer data); #endifint get_listitemheight(GtkWidget *widgetwindow = dp->cancelbutton = NULL; #if !GTK_CHECK_VERSION(2,0,0) dp->treeitems = NULL; dp->currtreeitem = NULL; #endif#if !GTK_CHECK_VERSION(2,0,0) sfree(dp->treeitems); #endifGtkWidget *entry; char *tmpstring; assert(uc->ctrl->generic.type == CTRL_EDITBOX); #if GTK_CHECK_VERSION(2,4,0) if (uc->combo) entry = gtk_bin_get_child(GTK_BIN(uc->combo)); else #endif entry = uc->entry; assert(entry != NULL); /* * GTK 2 implements gtk_entry_set_text by means of two separate * operations: first delete the previous text leaving the empty * string, then insert the new text. This causes two calls to * the "changed" signal. * * The first call to "changed", if allowed to proceed normally, * will cause an EVENT_VALCHANGE event on the edit box, causing * a call to dlg_editbox_get() which will read the empty string * out of the GtkEntry - and promptly write it straight into * the Config structure, which is precisely where our `text' * pointer is probably pointing, so the second editing * operation will insert that instead of the string we * originally asked for. * * Hence, we must take our own copy of the text before we do * this. */ tmpstring = dupstr(text); gtk_entry_set_text(GTK_ENTRY(entry), tmpstring); sfree(tmpstring #if GTK_CHECK_VERSION(2,4,0) if (uc->combo) { #if GTK_CHECK_VERSION(2,6,0) strncpy(buffer, gtk_combo_box_get_active_text(GTK_COMBO_BOX(uc->combo)), length); #else strncpy(buffer, gtk_entry_get_text (GTK_ENTRY(gtk_bin_get_child(GTK_BIN(uc->combo)))), length); #endif buffer[length-1] = '\0'; return; } #endif if (uc->entry) { strncpy(buffer, gtk_entry_get_text(GTK_ENTRY(uc->entry)), length); buffer[length-1] = '\0'; return; } assert(!"We shouldn't get here"); } #if !GTK_CHECK_VERSION(2,4,0)#endif #if !GTK_CHECK_VERSION(2,4,0) return; } if (uc->list) { gtk_list_clear_items(GTK_LIST(uc->list), 0, -1); return; } #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->listmodel) { gtk_list_store_clear(uc->listmodel); return; } #endif assert(!"We shouldn't get here"); #if !GTK_CHECK_VERSION(2,4,0) return; } if (uc->list) { gtk_list_clear_items(GTK_LIST(uc->list), index, index+1); return; } #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->listmodel) { GtkTreePath *path; GtkTreeIter iter; assert(uc->listmodel != NULL); path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_model_get_iter(GTK_TREE_MODEL(uc->listmodel), &iter, path); gtk_list_store_remove(uc->listmodel, &iter); gtk_tree_path_free(path); return; } #endif assert(!"We shouldn't get here"); /* * This routine is long and complicated in both GTK 1 and 2, * and completely different. Sigh. */ dp->flags |= FLAG_UPDATING_COMBO_LIST; #if !GTK_CHECK_VERSION(2,4,0) goto done; } if (uc->list && uc->entry) goto done; } #endif #if !GTK_CHECK_VERSION(2,0,0) if (uc->list goto done; } #else if (uc->listmodel) { GtkTreeIter iter; int i, cols; dp->flags |= FLAG_UPDATING_LISTBOX;/* inhibit drag-list update */ gtk_list_store_append(uc->listmodel, &iter); dp->flags &= ~FLAG_UPDATING_LISTBOX; gtk_list_store_set(uc->listmodel, &iter, 0, id, -1); /* * Now go through text and divide it into columns at the tabs, * as necessary. */ cols = (uc->ctrl->generic.type == CTRL_LISTBOX ? ctrl->listbox.ncols : 1); cols = cols ? cols : 1; for (i = 0; i < cols; i++) { int collen = strcspn(text, "\t"); char *tmpstr = snewn(collen+1, char); memcpy(tmpstr, text, collen); tmpstr[collen] = '\0'; gtk_list_store_set(uc->listmodel, &iter, i+1, tmpstr, -1); sfree(tmpstr); text += collen; if (*text) text++; } goto done; } #endif assert(!"We shouldn't get here"); done: #if !GTK_CHECK_VERSION(2,4,0) if (uc->menu || uc->list) { GList *children; GtkObject *item; uc->list)); item = GTK_OBJECT(g_list_nth_data(children, index)); g_list_free(children); return GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(item), "user-data")); } #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->listmodel) { GtkTreePath *path; GtkTreeIter iter; int ret; path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_model_get_iter(GTK_TREE_MODEL(uc->listmodel), &iter, path); gtk_tree_model_get(GTK_TREE_MODEL(uc->listmodel), &iter, 0, &ret, -1); gtk_tree_path_free(path); return ret; } #endif assert(!"We shouldn't get here"); return -1; /* placate dataflow analysis */ #if !GTK_CHECK_VERSION(2,4,0) if (uc->menu || uc->list) { GList *children; GtkWidget *item, *activeitem; int i; int selected = -1; if (uc->menu) activeitem = gtk_menu_get_active(GTK_MENU(uc->menu)); else activeitem = NULL; /* unnecessarily placate gcc */ uc->list)); for (i = 0; children!=NULL && (item = GTK_WIDGET(children->data))!=NULL; i++, children = children->next) { if (uc->menu ? activeitem == item : GTK_WIDGET_STATE(item) == GTK_STATE_SELECTED) { if (selected == -1) selected = i; else selected = -2; } } g_list_free(children); return selected < 0 ? -1 : selected; } #else if (uc->combo) { /* * This API function already does the right thing in the * case of no current selection. */ return gtk_combo_box_get_active(GTK_COMBO_BOX(uc->combo)); } #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->treeview) { GtkTreeSelection *treesel; GtkTreePath *path; GList *sellist; gint *indices; int ret; assert(uc->treeview != NULL); treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(uc->treeview)); if (gtk_tree_selection_count_selected_rows(treesel) != 1) return -1; sellist = gtk_tree_selection_get_selected_rows(treesel, NULL); assert(sellist && sellist->data); path = sellist->data; if (gtk_tree_path_get_depth(path) != 1) { ret = -1; } else { indices = gtk_tree_path_get_indices(path); if (!indices) { ret = -1; } else { ret = indices[0]; } } g_list_foreach(sellist, (GFunc)gtk_tree_path_free, NULL); g_list_free(sellist); return ret; } #endif assert(!"We shouldn't get here"); return -1; /* placate dataflow analysis */ #if !GTK_CHECK_VERSION(2,4,0) if (uc->menu || uc->list) { GList *children; GtkWidget *item, *activeitem; assert(uc->ctrl->generic.type == CTRL_EDITBOX || uc->ctrl->generic.type == CTRL_LISTBOX); assert(uc->menu != NULL || uc->list != NULL); uc->list)); item = GTK_WIDGET(g_list_nth_data(children, index)); g_list_free(children); if (uc->menu) { activeitem = gtk_menu_get_active(GTK_MENU(uc->menu)); return item == activeitem; } else { return GTK_WIDGET_STATE(item) == GTK_STATE_SELECTED; } } #else if (uc->combo) { /* * This API function already does the right thing in the * case of no current selection. */ return gtk_combo_box_get_active(GTK_COMBO_BOX(uc->combo)) == index; } #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->treeview) { GtkTreeSelection *treesel; GtkTreePath *path; int ret; assert(uc->treeview != NULL); treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(uc->treeview)); path = gtk_tree_path_new_from_indices(index, -1); ret = gtk_tree_selection_path_is_selected(treesel, path); gtk_tree_path_free(path); return ret; } #endif assert(!"We shouldn't get here"); return -1; /* placate dataflow analysis */ } void dlg_listbox_select #if !GTK_CHECK_VERSION(2,4,0) if (uc->optmenu) { gtk_option_menu_set_history(GTK_OPTION_MENU(uc->optmenu), index); return; } if (uc->list) return; } #else if (uc->combo) { gtk_combo_box_set_active(GTK_COMBO_BOX(uc->combo), index); return; } #endif #if GTK_CHECK_VERSION(2,0,0) if (uc->treeview) { GtkTreeSelection *treesel; GtkTreePath *path; treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(uc->treeview)); path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_selection_select_path(treesel, path); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(uc->treeview), path, NULL, FALSE, 0.0, 0.0); gtk_tree_path_free(path); return; } #endif assert(!"We shouldn't get here"); if (uc->entry) { /* Anything containing an edit box gets that focused. */ gtk_widget_grab_focus(uc->entry); } #if GTK_CHECK_VERSION(2,4,0) else if (uc->combo) { /* Failing that, there'll be a combo box. */ gtk_widget_grab_focus(uc->combo); } #endif#if !GTK_CHECK_VERSION(2,4,0) if (uc->optmenu) { gtk_widget_grab_focus(uc->optmenu); break; } #else if (uc->combo) { gtk_widget_grab_focus(uc->combo); break; } #endif #if !GTK_CHECK_VERSION(2,0,0) if (uc->list) { /* * For GTK-1 style list boxes, we tell it to focus one * of its children, which appears to do the Right * Thing. */ gtk_container_focus(GTK_CONTAINER(uc->list), GTK_DIR_TAB_FORWARD); break; } #else if (uc->treeview) { gtk_widget_grab_focus(uc->treeview); break; } #endif assert(!"We shouldn't get here");#if GTK_CHECK_VERSION(2,0,0) gtk_color_selection_set_has_opacity_control(GTK_COLOR_SELECTION(ccs->colorsel), FALSE); #else#endifgboolean editbox_key(GtkWidget *widget, GdkEventKey *event, booleangboolean editbox_lostfocus(GtkWidget *ed, GdkEventFocus *event, edREFRESH); return FALSE; } #if !GTK_CHECK_VERSION(2,0,0) /* * GTK 1 list box event handlers. */ static gboolean listitem_key(GtkWidget *item, GdkEventKey *event, gpointer data,gboolean listitem_single_key(GtkWidget *item, GdkEventKey *event, gpointer data) { return listitem_key(item, event, data, FALSE); } static gboolean listitem_multi_key(GtkWidget *item, GdkEventKey *event, gboolean listitem_button_press(GtkWidget *item, GdkEventButton *event, gboolean listitem_button_release(GtkWidget *item, GdkEventButton *event, #else /* !GTK_CHECK_VERSION(2,0,0) */ /* * GTK 2 list box event handlers. */ static void listbox_doubleclick(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *columstruct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(treeview)); if (uc) uc->ctrl->generic.handler(uc->ctrl, dp, dp->data, EVENT_ACTION); } static void listbox_selchange(GtkTreeSelection *treeselection, GtkTreeView *tree = gtk_tree_selection_get_tree_view(treeselection); struct uctrl *uc = dlg_find_bywidget(dp, GTK_WIDGET(tree)); if (uc) ruct draglist_valchange_ctx { struct uctrl *uc; struct dlgparam *dp; }; static gboolean draglist_valchange(gpointer data) { struct draglist_valchange_ctx *ctx = (struct draglist_valchange_ctx *)data; ctx->uc->ctrl->generic.handler(ctx->uc->ctrl, ctx->dp, ctx->dp->data, EVENT_VALCHANGE); sfree(ctx); return FALSE; } static void listbox_reorder(GtkTreeModel *treemodel, GtkTreePath *path, GtkTreeIter *itergpointer tree; struct uctrl *uc; if (dp->flags & FLAG_UPDATING_LISTBOX) return; /* not a user drag operation */ tree = g_object_get_data(G_OBJECT(treemodel), "user-data"); uc = dlg_find_bywidget(dp, GTK_WIDGET(tree)); if (uc) { /* * We should cause EVENT_VALCHANGE on the list box, now * that its rows have been reordered. However, the GTK 2 * docs say that at the point this signal is received the * new row might not have actually been filled in yet. * * (So what smegging use is it then, eh? Don't suppose it * occurred to you at any point that letting the * application know _after_ the reordering was compelete * might be helpful to someone?) * * To get round this, I schedule an idle function, which I * hope won't be called until the main event loop is * re-entered after the drag-and-drop handler has finished * furtling with the list store. */ struct draglist_valchange_ctx *ctx = snew(struct draglist_valchange_ctx); ctx->uc = uc; ctx->dp = dp; g_idle_add(draglist_valchange, ctx); } } #endif /* !GTK_CHECK_VERSION(2,0,0) */ #if !GTK_CHECK_VERSION(2,4,0)#else static void droplist_selchange(GtkComboBox *combocombo)); if (uc) #endif /* !GTK_CHECK_VERSION(2,4,0) */onst char *name = gtk_file_selection_get_filename #if !GTK_CHECK_VERSION(2,0,0) onst #else unifontsel *fontsel = (unifontsel *)gtk_object_get_data (GTK_OBJECT(button), "user-data"); struct uctrl *uc = (struct uctrl *)fontsel->user_data; char *name = unifontsel_get_name(fontsel); assert(name); /* should always be ok after OK pressed */ gtk_entry_set_text(GTK_ENTRY(uc->entry), name); sfree(name); #endif const gchar *fontname = gtk_entry_get_text(GTK_ENTRY(uc->entry)); #if !GTK_CHECK_VERSION(2,0,0) /* * Use the GTK 1 standard font selector. */ gchar *spacings[] = { "c", "m", NULL } gdk_font_ref(font) #else /* !GTK_CHECK_VERSION(2,0,0) */ /* * Use the unifontsel code provided in gtkfont.c. */ unifontsel *fontsel = unifontsel_new("Select a font"); gtk_window_set_modal(fontsel->window, TRUE); unifontsel_set_name(fontsel, fontname); gtk_object_set_data(GTK_OBJECT(fontsel->ok_button), "user-data", (gpointer)fontsel); fontsel->user_data = uc; gtk_signal_connect(GTK_OBJECT(fontsel->ok_button), "clicked", (GTK_OBJECT(fontsel->ok_button), "clicked", GTK_SIGNAL_FUNC(unifontsel_destroy), (gpointer)fontsel); gtk_signal_connect_object(GTK_OBJECT(fontsel->cancel_button),"clicked", GTK_SIGNAL_FUNC(unifontsel_destroy), (gpointer)fontsel); gtk_widget_show(GTK_WIDGET(fontsel->window)); #endif /* !GTK_CHECK_VERSION(2,0,0) */ NULL; #if !GTK_CHECK_VERSION(2,4,0) uc->list = uc->menu = uc->optmenu = NULL; #else uc->combo = NULL; #endif #if GTK_CHECK_VERSION(2,0,0) uc->treeview = NULL; uc->listmodel = NULL; #endif uc->button GtkWidget *signalobject; if (ctrl->editbox.has_list) { #if !GTK_CHECK_VERSION(2,4,0) /* * GTK 1 combo box. */ signalobject = uc->entry; #else /* * GTK 2 combo box. */ uc->listmodel = gtk_list_store_new(2, G_TYPE_INT, G_TYPE_STRING); w = gtk_combo_box_entry_new_with_model (GTK_TREE_MODEL(uc->listmodel), 1); /* We cannot support password combo boxes. */ assert(!ctrl->editbox.password); uc->combo = w; signalobject = uc->combo; #endif signalobject = w; } uc->entrysig = gtk_signal_connect(GTK_OBJECT(signalobject), "changed", GTK_SIGNAL_FUNC(editbox_changed), dp); gtk_signal_connect(GTK_OBJECT(signalobjectsignalobject), "focus_in_event", GTK_SIGNAL_FUNC(widget_focus), dp); gtk_signal_connect(GTK_OBJECT(signalobject), "focus_out_event", GTK_SIGNAL_FUNC(editbox_lostfocus), dp); gtk_signal_connect(GTK_OBJECT(signalobject), "focus_out_event", GTK_SIGNAL_FUNC(editbox_lostuc->entrysig = gtk_signal_connect(GTK_OBJECT(uc->entry), "changed", #if GTK_CHECK_VERSION(2,0,0) /* * First construct the list data store, with the right * number of columns. */ # if !GTK_CHECK_VERSION(2,4,0) /* (For GTK 2.0 to 2.3, we do this for full listboxes only, * because combo boxes are still done the old GTK1 way.) */ if (ctrl->listbox.height > 0) # endif { GType *types; int i; int cols; cols = ctrl->listbox.ncols; cols = cols ? cols : 1; types = snewn(1 + cols, GType); types[0] = G_TYPE_INT; for (i = 0; i < cols; i++) types[i+1] = G_TYPE_STRING; uc->listmodel = gtk_list_store_newv(1 + cols, types); sfree(types); } #endif /* * See if it's a drop-down list (non-editable combo * box). */ if (ctrl->listbox.height == 0) { #if !GTK_CHECK_VERSION(2,4,0) /* * GTK1 and early-GTK2 option-menu style of * drop-down list. */#else /* * Late-GTK2 style using a GtkComboBox. */ GtkCellRenderer *cr; /* * Create a non-editable GtkComboBox (that is, not * its subclass GtkComboBoxEntry). */ w = gtk_combo_box_new_with_model (GTK_TREE_MODEL(uc->listmodel)); uc->combo = w; /* * Tell it how to render a list item (i.e. which * column to look at in the list model). */ cr = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(w), cr, TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(w), cr, "text", 1, NULL); /* * And tell it to notify us when the selection * changes. */ g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(droplist_selchange), dp); #endif } else { #if !GTK_CHECK_VERSION(2,0,0) /* * GTK1-style full list box. */; get_listitemheight(w)#else /* * GTK2 treeview-based full list box. */ GtkTreeSelection *sel; /* * Create the list box itself, its columns, and * its containing scrolled window. */ w = gtk_tree_view_new_with_model (GTK_TREE_MODEL(uc->listmodel)); g_object_set_data(G_OBJECT(uc->listmodel), "user-data", (gpointer)w); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(w), FALSE); sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(w)); gtk_tree_selection_set_mode (sel, ctrl->listbox.multisel ? GTK_SELECTION_MULTIPLE : GTK_SELECTION_SINGLE); uc->treeview = w; gtk_signal_connect(GTK_OBJECT(w), "row-activated", GTK_SIGNAL_FUNC(listbox_doubleclick), dp); g_signal_connect(G_OBJECT(sel), "changed", G_CALLBACK(listbox_selchange), dp); if (ctrl->listbox.draglist) { gtk_tree_view_set_reorderable(GTK_TREE_VIEW(w), TRUE); g_signal_connect(G_OBJECT(uc->listmodel), "row-inserted", G_CALLBACK(listbox_reorder), dp); } { int i; int cols; cols = ctrl->listbox.ncols; cols = cols ? cols : 1; for (i = 0; i < cols; i++) { GtkTreeViewColumn *column; /* * It appears that GTK 2 doesn't leave us any * particularly sensible way to honour the * "percentages" specification in the ctrl * structure. */ column = gtk_tree_view_column_new_with_attributes ("heading", gtk_cell_renderer_text_new(), "text", i+1, (char *)NULL); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_GROW_ONLY); gtk_tree_view_append_column(GTK_TREE_VIEW(w), column); } } { GtkWidget *scroll; scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_IN); gtk_widget_show(w); gtk_container_add(GTK_CONTAINER(scroll), w); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_widget_set_size_request (scroll, -1, ctrl->listbox.height * get_listitemheight(w)); w = scroll; } #endif } if (ctrl->generic.label) { GtkWidget *label, *container; GtkRequisition req; label = gtk_label_new(ctrl->generic.label); shortcut_add(scs, label, ctrl->listbox.shortcut, SHORTCUT_FOCUS, w); container = columns_new(4); if (ctrl->listbox.percentwidth == 100) { columns_add(COLUMNS(container), w, 0, 1); } else { gint percentages[2]; percentages[1] = ctrl->listbox.percentwidth; percentages[0] = 100 - ctrl->listbox.percentwidth; columns_set_cols(COLUMNS(container), 2, percentages); columns_add(COLUMNS(container), w, 1, 1); /* Centre the label vertically. */ gtk_widget_size_request(w, &req); gtk_widget_set_usize(label, -1, req.height); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); } gtk_widget_show(label); gtk_widget_show(w); w = container; uc->label = label; } ; #if !GTK_CHECK_VERSION(2,0,0) GtkWidget *treeitem; #else int depth; GtkTreePath *treepath; #endif struct Shortcuts shortcuts; }; #if GTK_CHECK_VERSION(2,0,0) static void treeselection_changed(GtkTreeSelection *treeselection, gpointer data) { struct selparam *sps = (struct selparam *)data, *sp; GtkTreeModel *treemodel; GtkTreeIter treeiter; gint spindex; gint page_num; if (!gtk_tree_selection_get_selected(treeselection, &treemodel, &treeiter)) return; gtk_tree_model_get(treemodel, &treeiter, TREESTORE_PARAMS, &spindex, -1); sp = &sps[spindex]} #else#endif static void window_destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } #if !GTK_CHECK_VERSION(2,0,0)#endif int win#if GTK_CHECK_VERSION(2,0,0) gtk_widget_grab_focus(sc->widget); #else tree_grab_focus(dp); #endif #if !GTK_CHECK_VERSION(2,4,0) break; } #else if (sc->uc->combo) { gtk_widget_grab_focus(sc->uc->combo); gtk_combo_box_popup(GTK_COMBO_BOX(sc->uc->combo)); break; } #endif #if !GTK_CHECK_VERSION(2,0,0) if (sc->uc->list) { /* * For GTK-1 style list boxes, we tell it to * focus one of its children, which appears to * do the Right Thing. */ break; } #else if (sc->uc->treeview) { gtk_widget_grab_focus(sc->uc->treeview); break; } #endif assert(!"We shouldn't get here"); break; } break; } } return FALSE; } #if !GTK_CHECK_VERSION(2,0,0)#endifGtkWidget *w) { #if !GTK_CHECK_VERSION(2,0,0)object_sink(GTK_OBJECT(listitem)); return req.height; #else int height; GtkCellRenderer *cr = gtk_cell_renderer_text_new(); gtk_cell_renderer_get_size(cr, w, NULL, NULL, NULL, NULL, &height); g_object_ref(G_OBJECT(cr)); gtk_object_sink(GTK_OBJECT(cr)); g_object_unref(G_OBJECT(cr)); return height; #endif } void set_dialog_action_area(GtkDialog *dlg, GtkWidget *w) { #if !GTK_CHECK_VERSION(2,0,0) /* * In GTK 1, laying out the buttons at the bottom of the * configuration box is nice and easy, because a GtkDialog's * action_area is a GtkHBox which stretches to cover the full * width of the dialog. So we just put our Columns widget * straight into that hbox, and it ends up just where we want * it. */ gtk_box_pack_start(GTK_BOX(dlg->action_area), w, TRUE, TRUE, 0); #else /* * In GTK 2, the action area is now a GtkHButtonBox and its * layout behaviour seems to be different: it doesn't stretch * to cover the full width of the window, but instead finds its * own preferred width and right-aligns that within the window. * This isn't what we want, because we have both left-aligned * and right-aligned buttons coming out of the above call to * layout_ctrls(), and right-aligning the whole thing will * result in the former being centred and looking weird. * * So instead we abandon the dialog's action area completely: * we gtk_widget_hide() it in the below code, and we also call * gtk_dialog_set_has_separator() to remove the separator above * it. We then insert our own action area into the end of the * dialog's main vbox, and add our own separator above that. * * (Ideally, if we were a native GTK app, we would use the * GtkHButtonBox's _own_ innate ability to support one set of * buttons being right-aligned and one left-aligned. But to do * that here, we would have to either (a) pick apart our cross- * platform layout structures and treat them specially for this * particular set of controls, which would be painful, or else * (b) develop a special and simpler cross-platform * representation for these particular controls, and introduce * special-case code into all the _other_ platforms to handle * it. Neither appeals. Therefore, I regretfully discard the * GTKHButtonBox and go it alone.) */ GtkWidget *align; align = gtk_alignment_new(0, 0, 1, 1); gtk_container_add(GTK_CONTAINER(align), w); /* * The purpose of this GtkAlignment is to provide padding * around the buttons. The padding we use is twice the padding * used in our GtkColumns, because we nest two GtkColumns most * of the time (one separating the tree view from the main * controls, and another for the main controls themselves). */ #if GTK_CHECK_VERSION(2,4,0) gtk_alignment_set_padding(GTK_ALIGNMENT(align), 8, 8, 8, 8); #endif gtk_widget_show(align); gtk_box_pack_end(GTK_BOX(dlg->vbox), align, FALSE, TRUE, 0); w = gtk_hseparator_new(); gtk_box_pack_end(GTK_BOX(dlg->vbox), w, FALSE, TRUE, 0); gtk_widget_show(w); gtk_widget_hide(dlg->action_area); gtk_dialog_set_has_separator(dlg, FALSE); #endif; struct controlbox *ctrlbox; char *path; #if GTK_CHECK_VERSION(2,0,0) GtkTreeStore *treestore; GtkCellRenderer *treerenderer; GtkTreeViewColumn *treecolumn; GtkTreeSelection *treeselection; GtkTreeIter treeiterlevels[8]; #else GtkTreeItem *treeitemlevels[8]; GtkTree *treelevels[8]; #endif#if GTK_CHECK_VERSION(2,0,0) treestore = gtk_tree_store_new (TREESTORE_NUM, G_TYPE_STRING, G_TYPE_INT); tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(treestore)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE); treerenderer = gtk_cell_renderer_text_new(); treecolumn = gtk_tree_view_column_new_with_attributes ("Label", treerenderer, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), treecolumn); treeselection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); gtk_tree_selection_set_mode(treeselection, GTK_SELECTION_BROWSE); gtk_container_add(GTK_CONTAINER(treescroll), tree); #else tree = gtk_tree_new(#endifGTK_WINDOW(window)); set_dialog_action_area(GTK_DIALOG(window), w#if GTK_CHECK_VERSION(2,0,0) GtkTreeIter treeiter; #else GtkWidget *treeitem; #endif assert(j-1 < level); #if GTK_CHECK_VERSION(2,0,0) if (j > 0) /* treeiterlevels[j-1] will always be valid because we * don't allow implicit path components; see above. */ gtk_tree_store_append(treestore, &treeiter, &treeiterlevels[j-1]); else gtk_tree_store_append(treestore, &treeiter, NULL); gtk_tree_store_set(treestore, &treeiter, TREESTORE_PATH, c, TREESTORE_PARAMS, nselparams, -1); treeiterlevels[j] = treeiter; selparams[nselparams].depth = j; if (j > 0) { selparams[nselparams].treepath = gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), &treeiterlevels[j-1]); /* * We are going to collapse all tree branches * at depth greater than 2, but not _yet_; see * the comment at the call to * gtk_tree_view_collapse_row below. */ gtk_tree_view_expand_row(GTK_TREE_VIEW(tree), selparams[nselparams].treepath, FALSE); } else { selparams[nselparams].treepath = NULL; } #else treeitem = gtk_tree_item_new_with_label(cif (first) gtk_tree_select_child(GTK_TREE(tree), treeitem); selparams[nselparams].treeitem = treeitem; #endif level = j+1; nselparams++; } w = layout_ctrls(&dp, &selparams[nselparams-1].shortcuts, s#if GTK_CHECK_VERSION(2,0,0) { GtkRequisition req; int i; /* * We want our tree view to come up with all branches at * depth 2 or more collapsed. However, if we start off * with those branches collapsed, then the tree view's * size request will be calculated based on the width of * the collapsed tree. So instead we start with them all * expanded; then we ask for the current size request, * collapse the relevant rows, and force the width to the * value we just computed. This arranges that the tree * view is wide enough to have all branches expanded * safely. */ gtk_widget_size_request(tree, &req); for (i = 0; i < nselparams; i++) if (selparams[i].depth >= 2) gtk_tree_view_collapse_row(GTK_TREE_VIEW(tree), selparams[i].treepath); gtk_widget_set_size_request(tree, req.width, -1); } #endif #if GTK_CHECK_VERSION(2,0,0) g_signal_connect(G_OBJECT(treeselection), "changed", G_CALLBACK(treeselection_changed), selparams); #else#endif dp.data = cfg; dlg_refresh(NULL, &dp); dp.shortcuts = &selparams[0].shortcuts; #if !GTK_CHECK_VERSION(2,0,0) dp.currtreeitem = dp.treeitems[0]; #endif#if !GTK_CHECK_VERSION(2,0,0) gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(treescroll), tree); #endifGTK_WINDOW(window)); set_dialog_action_area(GTK_DIALOG(window), w0); gtk_widget_show(w0); w1 = layout_ctrls(&dp, &scs, s1z�222_FUNC(window_destroy), NULL); gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(win_key_press), &dp); gtk_main(); dlg_cleanup(&dp); ctrl_free_box(ctrlbox); return dp.retval; } static int string_width(char *text) { GtkWidget *label = gtk_label_new(text); GtkRequisition req; gtk_widget_size_request(label, &req); gtk_object_sink(GTK_OBJECT(label)); return req.width; } int reallyclose(void *frontend) { char *title = dupcat(appname, " Exit Confirmation", NULL); int ret = messagebox(GTK_WIDGET(get_window(frontend)), title, "Are you sure you want to close this session?", string_width("Most of the width of the above text"), "Yes", 'y', +1, 1, "No", 'n', -1, 0, NULL); sfree(title); return ret; } int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint, void (*callback)(void *ctx, int result), void *ctx) { static const char absenttxt[] = "The server's host key is not cached. You have no guarantee " "that the server is the computer you think it is.\n" "The server's %s key fingerprint is:\n" "%s\n" "If you trust this host, press \"Accept\" to add the key to " "PuTTY's cache and carry on connecting.\n" "If you want to carry on connecting just once, without " "adding the key to the cache, press \"Connect Once\".\n" "If you do not trust this host, press \"Cancel\" to abandon the " "connection."; static const char wrongtxt[] = "WARNING - POTENTIAL SECURITY BREACH!\n" "The server's host key does not match the one PuTTY has " "cached. This means that either the server administrator " "has changed the host key, or you have actually connected " "to another computer pretending to be the server.\n" "The new %s key fingerprint is:\n" "%s\n" "If you were expecting this change and trust the new key, " "press \"Accept\" to update PuTTY's cache and continue connecting.\n" "If you want to carry on connecting but without updating " "the cache, press \"Connect Once\".\n" "If you want to abandon the connection completely, press " "\"Cancel\" to cancel. Pressing \"Cancel\" is the ONLY guaranteed " "safe choice."; char *text; int ret; /* * Verify the key. */ ret = verify_host_key(host, port, keytype, keystr); if (ret == 0) /* success - key matched OK */ return 1; text = dupprintf((ret == 2 ? wrongtxt : absenttxt), keytype, fingerprint); ret = messagebox(GTK_WIDGET(get_window(frontend)), "PuTTY Security Alert", text, string_width(fingerprint), "Accept", 'a', 0, 2, "Connect Once", 'o', 0, 1, "Cancel", 'c', -1, 0, NULL); sfree(text); if (ret == 2) { store_host_key(host, port, keytype, keystr); return 1; /* continue with connection */ } else if (ret == 1) return 1; /* continue with connection */ return 0; /* do not continue with connection */ } /* * Ask whether the selected algorithm is acceptable (since it was * below the configured 'warn' threshold). */ int askalg(void *frontend, const char *algtype, const char *algname, void (*callback)(void *ctx, int result), void *ctx) { static const char msg[] = "The first %s supported by the server is " "%s, which is below the configured warning threshold.\n" "Continue with connection?"; char *text; int ret; text = dupprintf(msg, algtype, algname); ret = messagebox(GTK_WIDGET(get_window(frontend)), "PuTTY Security Alert", text, string_width("Continue with connection?"), "Yes", 'y', 0, 1, "No", 'n', 0, 0, NULL); sfree(text); if (ret) { return 1; } else { return 0; } } void old_keyfile_warning(void) { /* * This should never happen on Unix. We hope. */ } void fatal_message_box(void *window, char *msg) { messagebox(window, "PuTTY Fatal Error", msg, string_width("REASONABLY LONG LINE OF TEXT FOR BASIC SANITY"), "OK", 'o', 1, 1, NULL); } void fatalbox(char *p, ...) { va_list ap; char *msg; va_start(ap, p); msg = dupvprintf(p, ap); va_end(ap); fatal_message_box(NULL, msg); sfree(msg); cleanup_exit(1); } static GtkWidget *aboutbox = NULL; static void about_close_clicked(GtkButton *button, gpointer data) { gtk_widget_destroy(aboutbox); aboutbox = NULL; } static void licence_clicked(GtkButton *button, gpointer data) { char *title; char *licence = "Copyright 1997-2008 Simon Tatham.\n\n" "Portions copyright Robert de Bath, Joris van Rantwijk, Delian " "Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas " "Barry, Justin Bradford, Ben Harris, Malcolm Smith, Ahmad Khalifa, " "Markus Kuhn, Colin Watson, and CORE SDI S.A.\n\n" "Permission is hereby granted, free of charge, to any person " "obtaining a copy of this software and associated documentation " "files (the ""Software""), to deal in the Software without restriction, " "including without limitation the rights to use, copy, modify, merge, " "publish, distribute, sublicense, and/or sell copies of the Software, " "and to permit persons to whom the Software is furnished to do so, " "subject to the following conditions:\n\n" "The above copyright notice and this permission notice shall be " "included in all copies or substantial portions of the Software.\n\n" "THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT " "WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, " "INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF " "MERCHANTABILITY, FITNESS FOR A PARTICULAR " "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE " "COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES " "OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, " "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN " "CONNECTION WITH THE SOFTWARE OR THE USE OR " "OTHER DEALINGS IN THE SOFTWARE."; title = dupcat(appname, " Licence", NULL); assert(aboutbox != NULL); messagebox(aboutbox, title, licence, string_width("LONGISH LINE OF TEXT SO THE LICENCE" " BOX ISN'T EXCESSIVELY TALL AND THIN"), "OK", 'o', 1, 1, NULL); sfree(title); } void about_box(void *window) { GtkWidget *w; char *title; if (aboutbox) { gtk_widget_grab_focus(aboutbox); return; } aboutbox = gtk_dialog_new(); gtk_container_set_border_width(GTK_CONTAINER(aboutbox), 10); title = dupcat("About ", appname, NULL); gtk_window_set_title(GTK_WINDOW(aboutbox), title); sfree(title); w = gtk_button_new_with_label("Close"); GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT); gtk_window_set_default(GTK_WINDOW(aboutbox), w); gtk_box_pack_end(GTK_BOX(GTK_DIALOG(aboutbox)->action_area), w, FALSE, FALSE, 0); gtk_signal_connect(GTK_OBJECT(w), "clicked", GTK_SIGNAL_FUNC(about_close_clicked), NULL); gtk_widget_show(w); w = gtk_button_new_with_label("View Licence"); GTK_WIDGET_SET_FLAGS(w, GTK_CAN_DEFAULT); gtk_box_pack_end(GTK_BOX(GTK_DIALOG(aboutbox)->action_area), w, FALSE, FALSE, 0); gtk_signal_connect(GTK_OBJECT(w), "clicked", GTK_SIGNAL_FUNC(licence_clicked), NULL); gtk_widget_show(w); w = gtk_label_new(appname); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(aboutbox)->vbox), w, FALSE, FALSE, 0); gtk_widget_show(w); w = gtk_label_new(ver); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(aboutbox)->vbox), w, FALSE, FALSE, 5); gtk_widget_show(w); w = gtk_label_new("Copyright 1997-2008 Simon Tatham. All rights reserved"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(aboutbox)->vbox), w, FALSE, FALSE, 5); gtk_widget_show(w); set_transient_window_pos(GTK_WIDGET(window), aboutbox); gtk_widget_show(aboutbox); } struct eventlog_stuff { GtkWidget *parentwin, *window; struct controlbox *eventbox; struct Shortcuts scs; struct dlgparam dp; union control *listctrl; char **events; int nevents, negsize; char *seldata; int sellen; int ignore_selchange; }; static void eventlog_destroy(GtkWidget *widget, gpointer data) { struct eventlog_stuff *es = (struct eventlog_stuff *)data; es->window = NULL; sfree(es->seldata); dlg_cleanup(&es->dp); ctrl_free_box(es->eventbox); } static void eventlog_ok_handler(union control *ctrl, void *dlg, void *data, int event) { if (event == EVENT_ACTION) dlg_end(dlg, 0); } static void eventlog_list_handler(union control *ctrl, void *dlg, void *data, int event) { struct eventlog_stuff *es = (struct eventlog_stuff *)data; if (event == EVENT_REFRESH) { int i; dlg_update_start(ctrl, dlg); dlg_listbox_clear(ctrl, dlg); for (i = 0; i < es->nevents; i++) { dlg_listbox_add(ctrl, dlg, es->events[i]); } dlg_update_done(ctrl, dlg); } else if (event == EVENT_SELCHANGE) { int i; int selsize = 0; /* * If this SELCHANGE event is happening as a result of * deliberate deselection because someone else has grabbed * the selection, the last thing we want to do is pre-empt * them. */ if (es->ignore_selchange) return; /* * Construct the data to use as the selection. */ sfree(es->seldata); es->seldata = NULL; es->sellen = 0; for (i = 0; i < es->nevents; i++) { if (dlg_listbox_issel(ctrl, dlg, i)) { int extralen = strlen(es->events[i]); if (es->sellen + extralen + 2 > selsize) { selsize = es->sellen + extralen + 512; es->seldata = sresize(es->seldata, selsize, char); } strcpy(es->seldata + es->sellen, es->events[i]); es->sellen += extralen; es->seldata[es->sellen++] = '\n'; } } if (gtk_selection_owner_set(es->window, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME)) { extern GdkAtom compound_text_atom; gtk_selection_add_target(es->window, GDK_SELECTION_PRIMARY, GDK_SELECTION_TYPE_STRING, 1); gtk_selection_add_target(es->window, GDK_SELECTION_PRIMARY, compound_text_atom, 1); } } } void eventlog_selection_get(GtkWidget *widget, GtkSelectionData *seldata, guint info, guint time_stamp, gpointer data) { struct eventlog_stuff *es = (struct eventlog_stuff *)data; gtk_selection_data_set(seldata, seldata->target, 8, (unsigned char *)es->seldata, es->sellen); } gint eventlog_selection_clear(GtkWidget *widget, GdkEventSelection *seldata, gpointer data) { struct eventlog_stuff *es = (struct eventlog_stuff *)data; struct uctrl *uc; /* * Deselect everything in the list box. */ uc = dlg_find_byctrl(&es->dp, es->listctrl); es->ignore_selchange = 1; #if !GTK_CHECK_VERSION(2,0,0) assert(uc->list); gtk_list_unselect_all(GTK_LIST(uc->list)); #else assert(uc->treeview); gtk_tree_selection_unselect_all (gtk_tree_view_get_selection(GTK_TREE_VIEW(uc->treeview))); #endif es->ignore_selchange = 0; sfree(es->seldata); es->sellen = 0; es->seldata = NULL; return TRUE; } void showeventlog(void *estuff, void *parentwin) { struct eventlog_stuff *es = (struct eventlog_stuff *)estuff; GtkWidget *window, *w0, *w1; GtkWidget *parent = GTK_WIDGET(parentwin); struct controlset *s0, *s1; union control *c; int index; char *title; if (es->window) { gtk_widget_grab_focus(es->window); return; } dlg_init(&es->dp); for (index = 0; index < lenof(es->scs.sc); index++) { es->scs.sc[index].action = SHORTCUT_EMPTY; } es->eventbox = ctrl_new_box(); s0 = ctrl_getset(es->eventbox, "", "", ""); ctrl_columns(s0, 3, 33, 34, 33); c = ctrl_pushbutton(s0, "Close", 'c', HELPCTX(no_help), eventlog_ok_handler, P(NULL)); c->button.column = 1; c->button.isdefault = TRUE; s1 = ctrl_getset(es->eventbox, "x", "", ""); es->listctrl = c = ctrl_listbox(s1, NULL, NO_SHORTCUT, HELPCTX(no_help), eventlog_list_handler, P(es)); c->listbox.height = 10; c->listbox.multisel = 2; c->listbox.ncols = 3; c->listbox.percentages = snewn(3, int); c->listbox.percentages[0] = 25; c->listbox.percentages[1] = 10; c->listbox.percentages[2] = 65; es->window = window = gtk_dialog_new(); title = dupcat(appname, " Event Log", NULL); gtk_window_set_title(GTK_WINDOW(window), title); sfree(title); w0 = layout_ctrls(&es->dp, &es->scs, s0, GTK_WINDOW(window)); set_dialog_action_area(GTK_DIALOG(window), w0); gtk_widget_show(w0); w1 = layout_ctrls(&es->dp, &es->scs, s1, GTK_WINDOW(window)); gtk_container_set_border_width(GTK_CONTAINER(w1), 10); gtk_widget_set_usize(w1, 20 + string_width("LINE OF TEXT GIVING WIDTH OF EVENT LOG" " IS QUITE LONG 'COS SSH LOG ENTRIES" " ARE WIDE"), -1); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox), w1, TRUE, TRUE, 0); gtk_widget_show(w1); es->dp.data = es; es->dp.shortcuts = &es->scs; es->dp.lastfocus = NULL; es->dp.retval = 0; es->dp.window = window; dlg_refresh(NULL, &es->dp); if (parent) { set_transient_window_pos(parent, window); gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(parent)); } else gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_widget_show(window); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(eventlog_destroy), es); gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(win_key_press), &es->dp); gtk_signal_connect(GTK_OBJECT(window), "selection_get", GTK_SIGNAL_FUNC(eventlog_selection_get), es); gtk_signal_connect(GTK_OBJECT(window), "selection_clear_event", GTK_SIGNAL_FUNC(eventlog_selection_clear), es); } void *eventlogstuff_new(void) { struct eventlog_stuff *es; es = snew(struct eventlog_stuff); memset(es, 0, sizeof(*es)); return es; } void logevent_dlg(void *estuff, const char *string) { struct eventlog_stuff *es = (struct eventlog_stuff *)estuff; char timebuf[40]; struct tm tm; if (es->nevents >= es->negsize) { es->negsize += 64; es->events = sresize(es->events, es->negsize, char *); } tm=ltime(); strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t", &tm); es->events[es->nevents] = snewn(strlen(timebuf) + strlen(string) + 1, char); strcpy(es->events[es->nevents], timebuf); strcat(es->events[es->nevents], string); if (es->window) { dlg_listbox_add(es->listctrl, &es->dp, es->events[es->nevents]); } es->nevents++; } int askappend(void *frontend, Filename filename, void (*callback)(void *ctx, int result), void *ctx) { static const char msgtemplate[] = "The session log file \"%.*s\" already exists. " "You can overwrite it with a new session log, " "append your session log to the end of it, " "or disable session logging for this session."; char *message; char *mbtitle; int mbret; message = dupprintf(msgtemplate, FILENAME_MAX, filename.path); mbtitle = dupprintf("%s Log to File", appname); mbret = messagebox(get_window(frontend), mbtitle, message, string_width("LINE OF TEXT SUITABLE FOR THE" " ASKAPPEND WIDTH"), "Overwrite", 'o', 1, 2, "Append", 'a', 0, 1, "Disable", 'd', -1, 0, NULL); sfree(message); sfree(mbtitle); return mbret; } Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1790973b99c32b0695da29af44083bdd Text-delta-base-sha1: 1914843e216053aff9b249ea551de68ddb6b5b66 Text-content-length: 9188 Text-content-md5: 747cf5f96fc053657842b012d75ca56d Text-content-sha1: cbd87e5a6e44ca4def187e2570e1b6b039dff4e2 Content-length: 9188 SVN����+�b��^�F{�^}�<[�xZ� ~�wk�b�Y^�!7 �Z2�_wi�b�Tb�H �B2�~nN��|3u�qn�6d��A?#include "gtkfontunifserver:zoomed gtk_window_resize(GTK_WINDOW(inst->window), area_x + offset_x, area_y + offset /* * I can no longer remember what this call to * gtk_container_dequeue_resize_handler is for. It was * introduced in r3092 with no comment, and the commit log * message was uninformative. I'm _guessing_ its purpose is to * prevent gratuitous resize processing on the window given * that we're about to resize it anyway, but I have no idea * why that's so incredibly vital. * * I've tried removing the call, and nothing seems to go * wrong. I've backtracked to r3092 and tried removing the * call there, and still nothing goes wrong. So I'm going to * adopt the working hypothesis that it's superfluous; I won't * actually remove it from the GTK 1.2 code, but I won't * attempt to replicate its functionality in the GTK 2 code * above. */ gtk_container_dequeue_resize_handler(GTK_CONTAINER(inst->window)); && inst->area->window * FIXME: but is that also true of Pango?, boldbold = 1; fontid |= 1; } else { bold = 0; } if (!inst->fonts[fontid]) { int i; /* * Fall back through font ids with subsets of this one's * set bits, in order. */ for (i = fontid; i-- > 0 ;) { if (i & ~fontid) continue; /* some other bit is set */ if (inst->fonts[i]) { fontid = i; break; } } assert(inst->fonts[fontid]); /* we should at least have hit zero */gchar *gcs; /* * FIXME: this length is hardwired on the assumption that * conversions from wide to multibyte characters will * never generate more than 10 bytes for a single wide * character. */ gcs = snewn(len*10+1, gchar); for (combining = 0; combining < ncombining; combining++) { int mblen = wc_to_mb(inst->fonts[fontid]->real_charset, 0, text + combining, len, gcs, len*10+1, ".", NULL, NULL); unifont_draw_text(inst->pixmap, gc, inst->fonts[fontid]mblen, widefactor > 1, bold, inst->font_width); } sfree(g { cursor_font = gdk_font_load("cursor"); if (cursor_font) gdk_font_ref(cursor_font); }assert(flags)void setup_fonts_ucs(struct gui_data *inst) { if (inst->fonts[0]) unifont_destroy(inst->fonts[0]); if (inst->fonts[1]) unifont_destroy(inst->fonts[1]); if (inst->fonts[2]) unifont_destroy(inst->fonts[2]); if (inst->fonts[3]) unifont_destroy(inst->fonts[3]); inst->fonts[0] = unifont_create(inst->area, inst->cfg.font.name, FALSE, FALSE, inst->cfg.shadowboldoffset, inst->cfg.shadowbold if (inst->cfg.shadowbold || !inst->cfg.boldfont.name[0]) { inst->fonts[1] = NULL; } else { inst->fonts[1] = unifont_create(inst->area, inst->cfg.boldfont.name, FALSE, TRUE, inst->cfg.shadowboldoffset, inst->cfg.shadowbold); if (!inst->fonts[1] } if (inst->cfg.widefont.name[0]) { inst->fonts[2] = unifont_create(inst->area, inst->cfg.widefont.name, TRUE, FALSE, inst->cfg.shadowboldoffset, inst->cfg.shadowbold); if (!inst->fonts[2]) { fprintf(stderr, "%s: unable to load wide font \"%s\"\n", appname, inst->cfg.widefont.name); exit(1); } } else { inst->fonts[2] = NULL; } if (inst->cfg.shadowbold || !inst->cfg.wideboldfont.name[0]) { inst->fonts[3] = NULL; } else { inst->fonts[3] = unifont_create(inst->area, inst->cfg.wideboldfont.name, TRUE, TRUE, inst->cfg.shadowboldoffset, inst->cfg.shadowbold); if (!inst->fonts[3]) { fprintf(stderr, "%s: unable to load wide bold font \"%s\"\n", appname, inst->cfg.boldfont.name); exit(1); } } inst->font_width = inst->fonts[0]->width; inst->font_height = inst->fonts[0]->heigh inst->fonts[0]->publicinst->area = gtk_drawing_area_new(ity & 2) y += gdk_screen_height() - req.height; gtk_window_set_position(GTK_WINDOW(inst->window), GTK_WIN_POS_NONE); gtk_widget_set_uposition(GTK_WIDGET(inst->window), x, y); } gtk_signal_connect(GTK_OBJECT(inst->window), "destroy", GTK_SIGNAL_FUNC(destroy), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "delete_event", GTK_SIGNAL_FUNC(delete_window), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "key_press_event", GTK_SIGNAL_FUNC(key_event), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "key_release_event", GTK_SIGNAL_FUNC(key_event), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "focus_in_event", GTK_SIGNAL_FUNC(focus_event), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "focus_out_event", GTK_SIGNAL_FUNC(focus_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "configure_event", GTK_SIGNAL_FUNC(configure_area), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "expose_event", GTK_SIGNAL_FUNC(expose_area), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "button_press_event", GTK_SIGNAL_FUNC(button_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "button_release_event", GTK_SIGNAL_FUNC(button_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "motion_notify_event", GTK_SIGNAL_FUNC(motion_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_received", GTK_SIGNAL_FUNC(selection_received), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_get", GTK_SIGNAL_FUNC(selection_get), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_clear_event", GTK_SIGNAL_FUNC(selection_clear), inst); if (inst->cfg.scrollbar) gtk_signal_connect(GTK_OBJECT(inst->sbar_adjust), "value_changed", GTK_SIGNAL_FUNC(scrollbar_moved), inst); gtk_widget_add_events(GTK_WIDGET(inst->area), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK); { extern const char *const *const main_icon[]; extern const int n_main_icon; set_window_icon(inst->window, main_icon, n_main_icon); } gtk_widget_show(inst->window); set_window_background(inst); /* * Set up the Ctrl+rightclick context menu. */ { GtkWidget *menuitem; char *s; extern const int use_event_log, new_session, saved_sessions; inst->menu = gtk_menu_new(); #define MKMENUITEM(title, func) do { \ menuitem = title ? gtk_menu_item_new_with_label(title) : \ gtk_menu_item_new(); \ gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \ gtk_widget_show(menuitem); \ if (func != NULL) \ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \ GTK_SIGNAL_FUNC(func), inst); \ } while (0) if (new_session) MKMENUITEM("New Session", new_session_menuitem); MKMENUITEM("Restart Session", restart_session_menuitem); inst->restartitem = menuitem; gtk_widget_hide(inst->restartitem); MKMENUITEM("Duplicate Session", dup_session_menuitem); if (saved_sessions) { inst->sessionsmenu = gtk_menu_new(); /* sessionsmenu will be updated when it's invoked */ /* XXX is this the right way to do dynamic menus in Gtk? */ MKMENUITEM("Saved Sessions", update_savedsess_menu); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->sessionsmenu); } MKMENUITEM(NULL, NULL); MKMENUITEM("Change Settings", change_settings_menuitem); MKMENUITEM(NULL, NULL); if (use_event_log) MKMENUITEM("Event Log", event_log_menuitem); MKMENUITEM("Special Commands", NULL); inst->specialsmenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->specialsmenu); inst->specialsitem1 = menuitem; MKMENUITEM(NULL, NULL); inst->specialsitem2 = menuitem; gtk_widget_hide(inst->specialsitem1); gtk_widget_hide(inst->specialsitem2); MKMENUITEM("Clear Scrollback", clear_scrollback_menuitem); MKMENUITEM("Reset Terminal", reset_terminal_menuitem); MKMENUITEM("Copy All", copy_all_menuitem); MKMENUITEM(NULL, NULL); s = dupcat("About ", appname, NULL); MKMENUITEM(s, about_menuitem); sfree(s); #undef MKMENUITEM } inst->textcursor = make_mouse_ptr(inst, GDK_XTERM); inst->rawcursor = make_mouse_ptr(inst, GDK_LEFT_PTR); inst->waitcursor = make_mouse_ptr(inst, GDK_WATCH); inst->blankcursor = make_mouse_ptr(inst, -1); make_mouse_ptr(inst, -2); /* clean up cursor font */ inst->currcursor = inst->textcursor; show_mouseptr(inst, 1); inst->eventlogstuff = eventlogstuff_new(); inst->term = term_init(&inst->cfg, &inst->ucsdata, inst); inst->logctx = log_init(inst, &inst->cfg); term_provide_logctx(inst->term, inst->logctx); uxsel_init(); term_size(inst->term, inst->cfg.height, inst->cfg.width, inst->cfg.savelines); start_backend(inst); ldisc_send(inst->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */ /* now we're reday to deal with the child exit handler bei�o^��^ Node-path: putty/unix/uxsel.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7ad0fd9ca120d3edfa932546eb11fb2 Text-delta-base-sha1: 5e06b16873d11b69003a5a1a0e03deb30e49ec3e Text-content-length: 218 Text-content-md5: 669098f1e34cd3bc0c880a18b18e42cb Text-content-sha1: 29d74c70de371ab9081b0e943ea43123a576e47c Content-length: 218 SVN��(0 B�]�B�; uxsel_del(fd); if (rwx) { newfd = snew(struct fd); newfd->fd = fd; newfd->rwx = rwx; newfd->callback = callback; newfd->id = uxsel_input_add(fd, rwx); add234(fds, newfd); } Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7e2e6bcca364c0f4244779cdcb58253 Text-delta-base-sha1: 58ce8e5aafb07473b1406886f1e1423c5073673e Text-content-length: 1308 Text-content-md5: 8b3a87b9b0973332b62d6cecd4f1ed8a Text-content-sha1: 39ecf9a62c6a197a37ac80a5b72622915e66dd8e Content-length: 1308 SVN��+8|�o�e�v9�WT/* * In GTK1-only PuTTY, we used to store font names simply as a * valid X font description string (logical or alias), under a * bare key such as "Font". * * In GTK2 PuTTY, we have a prefix system where "client:" * indicates a Pango font and "server:" an X one; existing * configuration needs to be reinterpreted as having the * "server:" prefix, so we change the storage key from the * provided name string (e.g. "Font") to a suffixed one * ("FontName"). */ char *suffname = dupcat(name, "Name", NULL); if (read_setting_s(handle, suffname, result->name, sizeof(result->name))) { sfree(suffname); return TRUE; /* got new-style name */ } sfree(suffname); /* Fall back to old-style name. */ memcpy(result->name, "server:", 7); if (!read_setting_s(handle, name, result->name + 7, sizeof(result->name) - 7) || !result->name[7]) { result->name[0] = '\0'; return FALSE; } else { return TRUE; }/* * read_setting_fontspec had to handle two cases, but when * writing our settings back out we simply always generate the * new-style name. */ char *suffname = dupcat(name, "Name", NULL); write_setting_s(handle, suffname, result.name); sfree(suff Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c782d7fc2026600ac157c1b4f3f7dd43 Text-delta-base-sha1: 0a0234363b4b3decdde1624d7bea49467ce8549f Text-content-length: 32 Text-content-md5: 0048470d3a284beae6fdf1887bf28b37 Text-content-sha1: 1bbba2fc96472421c421ec04c8550ffe1d07f83b Content-length: 32 SVN��} �]��#ZColin Watso Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: deaf1c9a5c0d1927a6b2c6b93781e27f Text-delta-base-sha1: 29e80ce3f9a2fe983570397f2b8269ef7e5025f9 Text-content-length: 32 Text-content-md5: baa5ff7a284afa724d55ca9efdb362f3 Text-content-sha1: 1af4b0837f3284c18c4272d989eec694c906765a Content-length: 32 SVN��5C ���$Colin Watso Node-path: putty/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18b40c9aedaedf206eb7f912b28f5643 Text-delta-base-sha1: 9301e7df6e395f7e091f94bc9b9dfeef74f8b8bc Text-content-length: 32 Text-content-md5: 1b0b4b8219d3ba8acb0862ba492a3eb7 Text-content-sha1: d9aede5950aabdf673b02e05bdc5d116d6080ae9 Content-length: 32 SVN��ft ���WColin Watso Revision-number: 8038 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2008-06-04T23:06:28.403770Z K 7 svn:log V 64 And now it's been merged, we can retire the gtk2 branch itself. K 10 svn:author V 5 simon PROPS-END Node-path: putty-gtk2 Node-action: delete Revision-number: 8039 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2008-06-04T23:07:52.720647Z K 7 svn:log V 87 Now Colin's GTK2 work is in the trunk, he should be in the web version of the licence. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1263b4185437bdfdd1800adc1b26b6e4 Text-delta-base-sha1: bcd72a8e679a8dc32f9d69a1f2def4e162269691 Text-content-length: 42 Text-content-md5: 49e8348e5bd54601a5ebf0df77efdd55 Text-content-sha1: 39adb8b126d3362129c8f8f71cdd99a1c649e913 Content-length: 42 SVN��We � ��F Kuhn, Colin Watson, Revision-number: 8040 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2008-06-04T23:12:30.208659Z K 7 svn:log V 55 Bah, there's always something. Check in missing files. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: add Node-copyfrom-rev: 8034 Node-copyfrom-path: putty-gtk2/unix/gtkfont.c Text-copy-source-md5: f86ce9bba1a1068480a691e199251417 Text-copy-source-sha1: 9856da966f01905a86613b9c4b8a18a34285781c Node-path: putty/unix/gtkfont.h Node-kind: file Node-action: add Node-copyfrom-rev: 8034 Node-copyfrom-path: putty-gtk2/unix/gtkfont.h Text-copy-source-md5: 0f07f918fc3213c63254c123e83752e3 Text-copy-source-sha1: ec2c51dbbfdbbf3df0acf0a5a543508c8b1a8b6b Revision-number: 8041 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-05T23:34:13.395631Z PROPS-END Revision-number: 8042 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-05T23:34:13.464274Z PROPS-END Revision-number: 8043 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-05T23:34:13.520675Z PROPS-END Revision-number: 8044 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-05T23:34:13.602040Z PROPS-END Revision-number: 8045 Prop-content-length: 368 Content-length: 368 K 8 svn:date V 27 2008-06-05T17:06:39.741607Z K 7 svn:log V 267 Add an include statement to Makefile.gtk that imports if present a file called Makefile.local. This means that if you're compiling on a platform that needs COMPAT definitions, you can put them in a local file and not have to type them on the command line every time. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef5ed971ffebf66942be79421920630e Text-delta-base-sha1: 54c4dc7c18ed9d84d7726b04cfd1f0e7bf7b2712 Text-content-length: 55 Text-content-md5: c914117f4dad5d7f65deebecf2144fde Text-content-sha1: 8e84cc9dfb1110c191c77665a1405ec586b5f046 Content-length: 55 SVN�� 7�-��q3� "-include Makefile.local Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 225 Content-length: 225 K 10 svn:ignore V 192 Makefile.gtk Makefile.in Makefile.local Makefile aclocal.m4 autom4te.cache config.status configure install-sh local plink pterm putty puttytel psftp pscp puttygen uxconfig.in uxconfig.h *.log PROPS-END Revision-number: 8046 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-05T23:34:14.088714Z PROPS-END Revision-number: 8047 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-05T23:34:14.092070Z PROPS-END Revision-number: 8048 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-05T23:34:14.158499Z PROPS-END Revision-number: 8049 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-05T23:34:14.161771Z PROPS-END Revision-number: 8050 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-07T23:34:09.342760Z PROPS-END Revision-number: 8051 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-07T23:34:09.411378Z PROPS-END Revision-number: 8052 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-07T23:34:09.415173Z PROPS-END Revision-number: 8053 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-07T23:34:09.418473Z PROPS-END Revision-number: 8054 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-07T23:34:09.422156Z PROPS-END Revision-number: 8055 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-07T23:34:09.425585Z PROPS-END Revision-number: 8056 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-07T23:34:09.429174Z PROPS-END Revision-number: 8057 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-07T23:34:09.458571Z PROPS-END Revision-number: 8058 Prop-content-length: 206 Content-length: 206 K 8 svn:date V 27 2008-06-07T16:25:46.532888Z K 7 svn:log V 105 Manfred Schwarb points out that the README contains an outdated comment about GTK 2 not being supported. K 10 svn:author V 5 simon PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 70752deb2513c4c37ac5c3e07b41a669 Text-delta-base-sha1: 9fba5aa5919b98ba4f3f01376ca60e6a1d783649 Text-content-length: 56 Text-content-md5: ce2d8481cf79ed0ce82bc72f4aabf59e Text-content-sha1: c782d399183da5af71dbaa5582183424ba7924ae Content-length: 56 SVN��OI�m��Kn�s\and Gtk+-2.0 should both be Revision-number: 8059 Prop-content-length: 270 Content-length: 270 K 8 svn:date V 27 2008-06-07T16:30:45.297095Z K 7 svn:log V 169 Manfred Schwarb also mentions that Alt+drag is captured by at least one well known window manager (KDE's); document that Shift+Alt+drag is worth trying as a workaround. K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 51368782f3add6925c9679fcf7dee4c8 Text-delta-base-sha1: 3c7bbd60ee594f4d00c6fdf0c553006988b93512 Text-content-length: 239 Text-content-md5: ff5a647ab712140279848ac9711ff7ce Text-content-sha1: 70e25d9880a3316b393edc4d43bff608f177dd53 Content-length: 239 SVN��+SP�Y��|ZP�.}: see \k{config-rectselect} for details. (In some Unix environments, Alt+drag is intercepted by the window manager. Shift+Alt+drag should work for rectangular selection as well, so you could try that instead Revision-number: 8060 Prop-content-length: 118 Content-length: 118 K 8 svn:date V 27 2008-06-09T18:07:35.354911Z K 7 svn:log V 18 This is now done. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/port-unix-gtk2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d5504eedc5e216a2c5a43e4312382d3a Text-delta-base-sha1: 57b438723adf31cd74524fe02c9220ba40cbd7a4 Text-content-length: 293 Text-content-md5: dd3a4ae75f1606e01e8bb4f11c489034 Text-content-sha1: 29afaa6f09bc45e379ea4108e3b575fc40de6aa5 Content-length: 293 SVN��! �U��=TtFixed-in: r8040 2008-06-06We've also been working on this; see svn://svn.tartarus.org/sgt/putty-gtk2 . Update: this is now complete and has been merged onto the trunk, and is thus included in our snapshot releases and will be in the next proper release. Please try it. Revision-number: 8061 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-09T23:34:11.514163Z PROPS-END Revision-number: 8062 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-10T23:34:11.732506Z PROPS-END Revision-number: 8063 Prop-content-length: 496 Content-length: 496 K 8 svn:date V 27 2008-06-10T20:18:23.701837Z K 7 svn:log V 395 Manfred Schwarb points out that scroll wheel support stopped working with the switch to GTK2. This turns out to be because, where GTK1 represented the scroll wheel as mouse buttons 4 and 5 and generated GdkEventButton when it was moved, GTK2 has moved wheel actions out into a new event type GdkEventScroll which we were not handling. Now we do, so scroll wheel support should be back in place. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 747cf5f96fc053657842b012d75ca56d Text-delta-base-sha1: cbd87e5a6e44ca4def187e2570e1b6b039dff4e2 Text-content-length: 2686 Text-content-md5: 4f69f4233b308f469b5649d257f22730 Text-content-sha1: a9e6aacad9ea4165e294d164527255a522545191 Content-length: 2686 SVN����KL���np�_0�r;�Z4�pmC��S7�~�, boolean button_internal(struct gui_data *inst, guint32 timestamp, GdkEventType type, guint ebutton, guint state, gdouble ex, gdouble ey) {timestamp; show_mouseptr(inst, 1); if (ebutton == 4 && type == GDK_BUTTON_PRESS) { term_scroll(inst->term, 0, -5); return TRUE; } if (ebutton == 5 && type == GDK_BUTTON_PRESS) { term_scroll(inst->term, 0, +5); return TRUE; } shift = state & GDK_SHIFT_MASK; ctrl = state & GDK_CONTROL_MASK; alt = state & GDK_MOD1_MASK; if (ebutton, timestamp); return TRUE; } if (ebutton == 1) button = MBT_LEFT; else if (ebutton == 2) button = MBT_MIDDLE; else if (ex - inst->cfg.window_border) / inst->font_width; y = (eact, x, y, shift, ctrl, alt); return TRUE; } gbooleanreturn button_internal(inst, event->time, event->type, event->button, event->state, event->x, event->y); } #if GTK_CHECK_VERSION(2,0,0) /* * In GTK 2, mouse wheel events have become a new type of event. * This handler translates them back into button-4 and button-5 * presses so that I don't have to change my old code too much :-) */ gboolean scroll_event(GtkWidget *widget, GdkEventScrollguint button; if (event->direction == GDK_SCROLL_UP) button = 4; else if (event->direction == GDK_SCROLL_DOWN) button = 5; else return FALSE; return button_internal(inst, event->time, GDK_BUTTON_PRESS, button, event->state, event->x, event->y); } #endif#if GTK_CHECK_VERSION(2,0,0) gtk_signal_connect(GTK_OBJECT(inst->area), "scroll_event", GTK_SIGNAL_FUNC(scroll_event), inst); #endif�^&HH�^�tem); MKMENUITEM(NULL, NULL); s = dupcat("About ", appname, NULL); MKMENUITEM(s, about_menuitem); sfree(s); #undef MKMENUITEM } inst->textcursor = make_mouse_ptr(inst, GDK_XTERM); inst->rawcursor = make_mouse_ptr(inst, GDK_LEFT_PTR); inst->waitcursor = make_mouse_ptr(inst, GDK_WATCH); inst->blankcursor = make_mouse_ptr(inst, -1); make_mouse_ptr(inst, -2); /* clean up cursor font */ inst->currcursor = inst->textcursor; show_mouseptr(inst, 1); inst->eventlogstuff = eventlogstuff_new(); inst->term = term_init(&inst->cfg, &inst->ucsdata, inst); inst->logctx = log_init(inst, &inst->cfg); term_provide_logctx(inst->term, inst->logctx); uxsel_init(); term_size(inst->term, inst->cfg.height, inst->cfg.width, inst->cfg.savelines); start_backend(inst); ldisc_send(inst->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */ /* now we're reday to deal with the child exit handler bei Revision-number: 8064 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-10T23:34:12.469554Z PROPS-END Revision-number: 8065 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-10T23:34:12.473072Z PROPS-END Revision-number: 8066 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2008-06-10T23:44:36.175458Z K 7 svn:log V 146 This is supposed to be fixed by the Gtk2 port, so mark it as fixed at the same time (although I haven't personally verified that it's gone away). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-connreset-spin Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef75748236d26d0d4b03c7b16a3cc7b7 Text-delta-base-sha1: 2b4a85e3122e86442dd5f2acf54ebe3a129f25f5 Text-content-length: 47 Text-content-md5: 3fa249a660d86ea1c2a5d7c6a6ef9089 Text-content-sha1: dc7b211cca3dc21efe414f5df8c435914fc69422 Content-length: 47 SVN��p � ��e Fixed-in: r8040 2008-06-06 Revision-number: 8067 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-11T23:34:13.361488Z PROPS-END Revision-number: 8068 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-11T23:34:13.364757Z PROPS-END Revision-number: 8069 Prop-content-length: 271 Content-length: 271 K 8 svn:date V 27 2008-06-11T18:03:35.900569Z K 7 svn:log V 170 Work around a bug in early versions of GTK (which I'm still forced to use, gah) in which the "model" argument to gtk_tree_selection_get_selected_rows() couldn't be NULL. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6b5ee0db750d2b9c50ac0d330c8650d2 Text-delta-base-sha1: 4c31b53a1378ce6b1dbf61090d31d083cb682600 Text-content-length: 95 Text-content-md5: 2b744b6037a48af8326a2c2672448d94 Text-content-sha1: d8c149418c75b5ab3d7ab8b9c8477226014037cb Content-length: 95 SVN�����N��J�ftkTreeModel *model&model�2J�2�oy", GTK_SIGNAL Revision-number: 8070 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-14T23:33:58.207450Z PROPS-END Revision-number: 8071 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-14T23:33:58.268677Z PROPS-END Revision-number: 8072 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-14T23:33:58.272132Z PROPS-END Revision-number: 8073 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-14T23:33:58.392274Z PROPS-END Revision-number: 8074 Prop-content-length: 971 Content-length: 971 K 8 svn:date V 27 2008-06-15T12:39:09.966017Z K 7 svn:log V 870 Exorcise beeps from the Colours pane in Gtk. The colour list box beeped at the user whenever it found that something other than exactly one colour was selected. This seems to happen implicitly in Gtk when the pane is changed. In Gtk1, this gave you a beep whenever you left the Colours dialog after having selected a colour from the list; in Gtk2, you additionally got a beep _every_ time you subsequently re-entered the Colours dialog (for reasons I haven't investigated). Windows was unaffected. Also, in Gtk (unlike Windows), it's possible for the user to go back to the state where no items in the list box are selected at all. For these reasons, stop beeping at the user, and instead blank the RGB edit boxes as a hint that edits to them would be futile. (Really we should be disabling them entirely, but the cross-platform edit controls aren't up to that yet.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 499ae87a6f36ead362288f5b60dc7ff1 Text-delta-base-sha1: 0609355d4e79c4a5712bd84a58c691b20a272c03 Text-content-length: 533 Text-content-md5: 3e0c63e0eeb5c797c2d3eb492fdb5ca3 Text-content-sha1: ae64ef2f3f212c4a63ef8093734473b19ab04dec Content-length: 533 SVN��0%.Y�\��Z�Kf�s'P�ic�clearclear = TRUE; update = TRUEclear = TRUE; } else { clear = FALSE; r = cfg->colours[i][0]; g = cfg->colours[i][1]; b = cfg->colours[i][2]; }clear = FALSE; update = TRUE; } } } if (update) { if (clear) { else { char buf[40]; sprintf(buf, "%d", r); dlg_editbox_set(cd->redit, dlg, buf); sprintf(buf, "%d", g); dlg_editbox_set(cd->gedit, dlg, buf); sprintf(buf, "%d", b); dlg_editbox_set(cd->bedit, dlg, buf); } Revision-number: 8075 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2008-06-15T13:26:08.225652Z K 7 svn:log V 85 Cosmetic: use `appname' in more places, so that Unix PuTTYtel announces itself thus. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1704eda317f344af0ca4f6b6991cec0c Text-delta-base-sha1: a875bfb2cff0a756650fd29918d2c0285b414a0c Text-content-length: 174 Text-content-md5: 5b569468f521f77986854ec082651932 Text-content-sha1: 61df0b73a86fdd5107557dbcc000992403ce97ec Content-length: 174 SVN��#w� ��>B�char *title = dupcat(appname, " Configuration", NULL); int ret = do_config_box(title, cfg, 0, 0); sfree(title); return ret", appname Revision-number: 8076 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.362412Z PROPS-END Revision-number: 8077 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.431876Z PROPS-END Revision-number: 8078 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.435103Z PROPS-END Revision-number: 8079 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.438814Z PROPS-END Revision-number: 8080 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.496736Z PROPS-END Revision-number: 8081 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.500219Z PROPS-END Revision-number: 8082 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.503873Z PROPS-END Revision-number: 8083 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.507498Z PROPS-END Revision-number: 8084 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.615918Z PROPS-END Revision-number: 8085 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.619744Z PROPS-END Revision-number: 8086 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.669560Z PROPS-END Revision-number: 8087 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.692500Z PROPS-END Revision-number: 8088 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-18T23:34:49.746981Z PROPS-END Revision-number: 8089 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-19T23:34:38.316413Z PROPS-END Revision-number: 8090 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-23T23:35:17.186722Z PROPS-END Revision-number: 8091 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-23T23:35:17.338999Z PROPS-END Revision-number: 8092 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-24T23:34:30.209826Z PROPS-END Revision-number: 8093 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-26T23:34:34.799029Z PROPS-END Revision-number: 8094 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-26T23:34:34.867873Z PROPS-END Revision-number: 8095 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-26T23:34:34.872104Z PROPS-END Revision-number: 8096 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-27T23:34:30.582208Z PROPS-END Revision-number: 8097 Prop-content-length: 252 Content-length: 252 K 7 svn:log V 151 Patch from Aidan Kehoe to extend the Arabic shaping code to Urdu and Persian, by adding some additional Unicode code points to the shapetypes[] array. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-06-29T09:14:26.551867Z PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 798672a9f585241be58610f5d2689af9 Text-delta-base-sha1: 2d91d9e26ba328cba17074292b49daf820c29905 Text-content-length: 3582 Text-content-md5: 3ec742e6f54a8e137f0cadf86e0cb456 Text-content-sha1: 7a9de9a1e03cbf971d14b2f86ab856bb104d3aa2 Content-length: 3582 SVN��4 ]���Z8�@t(SHAPE_FIRST + lenof(shapetypes) - 1), /* 64B */ {SU, 0x0}, /* 64C */ {SU, 0x0}, /* 64D */ {SU, 0x0}, /* 64E */ {SU, 0x0}, /* 64F */ {SU, 0x0}, /* 650 */ {SU, 0x0}, /* 651 */ {SU, 0x0}, /* 652 */ {SU, 0x0}, /* 653 */ {SU, 0x0}, /* 654 */ {SU, 0x0}, /* 655 */ {SU, 0x0}, /* 656 */ {SU, 0x0}, /* 657 */ {SU, 0x0}, /* 658 */ {SU, 0x0}, /* 659 */ {SU, 0x0}, /* 65A */ {SU, 0x0}, /* 65B */ {SU, 0x0}, /* 65C */ {SU, 0x0}, /* 65D */ {SU, 0x0}, /* 65E */ {SU, 0x0}, /* 65F */ {SU, 0x0}, /* 660 */ {SU, 0x0}, /* 661 */ {SU, 0x0}, /* 662 */ {SU, 0x0}, /* 663 */ {SU, 0x0}, /* 664 */ {SU, 0x0}, /* 665 */ {SU, 0x0}, /* 666 */ {SU, 0x0}, /* 667 */ {SU, 0x0}, /* 668 */ {SU, 0x0}, /* 669 */ {SU, 0x0}, /* 66A */ {SU, 0x0}, /* 66B */ {SU, 0x0}, /* 66C */ {SU, 0x0}, /* 66D */ {SU, 0x0}, /* 66E */ {SU, 0x0}, /* 66F */ {SU, 0x0}, /* 670 */ {SU, 0x0}, /* 671 */ {SR, 0xFB50}, /* 672 */ {SU, 0x0}, /* 673 */ {SU, 0x0}, /* 674 */ {SU, 0x0}, /* 675 */ {SU, 0x0}, /* 676 */ {SU, 0x0}, /* 677 */ {SU, 0x0}, /* 678 */ {SU, 0x0}, /* 679 */ {SD, 0xFB66}, /* 67A */ {SD, 0xFB5E}, /* 67B */ {SD, 0xFB52}, /* 67C */ {SU, 0x0}, /* 67D */ {SU, 0x0}, /* 67E */ {SD, 0xFB56}, /* 67F */ {SD, 0xFB62}, /* 680 */ {SD, 0xFB5A}, /* 681 */ {SU, 0x0}, /* 682 */ {SU, 0x0}, /* 683 */ {SD, 0xFB76}, /* 684 */ {SD, 0xFB72}, /* 685 */ {SU, 0x0}, /* 686 */ {SD, 0xFB7A}, /* 687 */ {SD, 0xFB7E}, /* 688 */ {SR, 0xFB88}, /* 689 */ {SU, 0x0}, /* 68A */ {SU, 0x0}, /* 68B */ {SU, 0x0}, /* 68C */ {SR, 0xFB84}, /* 68D */ {SR, 0xFB82}, /* 68E */ {SR, 0xFB86}, /* 68F */ {SU, 0x0}, /* 690 */ {SU, 0x0}, /* 691 */ {SR, 0xFB8C}, /* 692 */ {SU, 0x0}, /* 693 */ {SU, 0x0}, /* 694 */ {SU, 0x0}, /* 695 */ {SU, 0x0}, /* 696 */ {SU, 0x0}, /* 697 */ {SU, 0x0}, /* 698 */ {SR, 0xFB8A}, /* 699 */ {SU, 0x0}, /* 69A */ {SU, 0x0}, /* 69B */ {SU, 0x0}, /* 69C */ {SU, 0x0}, /* 69D */ {SU, 0x0}, /* 69E */ {SU, 0x0}, /* 69F */ {SU, 0x0}, /* 6A0 */ {SU, 0x0}, /* 6A1 */ {SU, 0x0}, /* 6A2 */ {SU, 0x0}, /* 6A3 */ {SU, 0x0}, /* 6A4 */ {SD, 0xFB6A}, /* 6A5 */ {SU, 0x0}, /* 6A6 */ {SD, 0xFB6E}, /* 6A7 */ {SU, 0x0}, /* 6A8 */ {SU, 0x0}, /* 6A9 */ {SD, 0xFB8E}, /* 6AA */ {SU, 0x0}, /* 6AB */ {SU, 0x0}, /* 6AC */ {SU, 0x0}, /* 6AD */ {SD, 0xFBD3}, /* 6AE */ {SU, 0x0}, /* 6AF */ {SD, 0xFB92}, /* 6B0 */ {SU, 0x0}, /* 6B1 */ {SD, 0xFB9A}, /* 6B2 */ {SU, 0x0}, /* 6B3 */ {SD, 0xFB96}, /* 6B4 */ {SU, 0x0}, /* 6B5 */ {SU, 0x0}, /* 6B6 */ {SU, 0x0}, /* 6B7 */ {SU, 0x0}, /* 6B8 */ {SU, 0x0}, /* 6B9 */ {SU, 0x0}, /* 6BA */ {SR, 0xFB9E}, /* 6BB */ {SD, 0xFBA0}, /* 6BC */ {SU, 0x0}, /* 6BD */ {SU, 0x0}, /* 6BE */ {SD, 0xFBAA}, /* 6BF */ {SU, 0x0}, /* 6C0 */ {SR, 0xFBA4}, /* 6C1 */ {SD, 0xFBA6}, /* 6C2 */ {SU, 0x0}, /* 6C3 */ {SU, 0x0}, /* 6C4 */ {SU, 0x0}, /* 6C5 */ {SR, 0xFBE0}, /* 6C6 */ {SR, 0xFBD9}, /* 6C7 */ {SR, 0xFBD7}, /* 6C8 */ {SR, 0xFBDB}, /* 6C9 */ {SR, 0xFBE2}, /* 6CA */ {SU, 0x0}, /* 6CB */ {SR, 0xFBDE}, /* 6CC */ {SD, 0xFBFC}, /* 6CD */ {SU, 0x0}, /* 6CE */ {SU, 0x0}, /* 6CF */ {SU, 0x0}, /* 6D0 */ {SU, 0x0}, /* 6D1 */ {SU, 0x0}, /* 6D2 */ {SR, 0xFBAE}, Revision-number: 8098 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-30T23:36:11.211735Z PROPS-END Revision-number: 8099 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-06-30T23:36:11.987754Z PROPS-END Revision-number: 8100 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-01T23:36:38.702974Z PROPS-END Revision-number: 8101 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-01T23:36:38.978591Z PROPS-END Revision-number: 8102 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-01T23:36:39.005413Z PROPS-END Revision-number: 8103 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 Note here that Vista doesn't support .HLP. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-07-04T09:30:26.417941Z PROPS-END Node-path: putty-website/docs.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7d5989894e5ef43ed3f588694a654577 Text-delta-base-sha1: 5e8d480e39b2b264eccf9915b7e1a319d7aeeec5 Text-content-length: 144 Text-content-md5: 52eb4258f444d52ec43466be87e9c9e4 Text-content-sha1: e6b2f8a16b58096632ddf6740b18fd61d4fc03a3 Content-length: 144 SVN��(u���`�-{ (This format is not supported natively by Windows Vista.) (This format is not supported natively by Windows Vista.) Revision-number: 8104 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-05T23:34:37.996617Z PROPS-END Revision-number: 8105 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-05T23:34:38.048663Z PROPS-END Revision-number: 8106 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-05T23:34:38.052467Z PROPS-END Revision-number: 8107 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-05T23:34:38.056057Z PROPS-END Revision-number: 8108 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-05T23:34:38.073646Z PROPS-END Revision-number: 8109 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2008-07-06T12:11:34.844583Z K 7 svn:log V 88 Patch from Tim Kosse to make PSFTP remember to close files on various error conditions. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb486a83b805b75c0a8bef81a69abed8 Text-delta-base-sha1: 592ce18bac76048390a7d3cfb6c4084370b071b7 Text-content-length: 251 Text-content-md5: 8c4fbead98d742b91d187e2cc11829a4 Text-content-sha1: 8b4959dcbdb96a3a029653209970b79775d73e05 Content-length: 251 SVN��:!'F���t(�5q�G$�e�Vdclose_wfile(file); printf("reget: cannot restart %s - file too large\n", outfname); sftp_register(req = fxp_close_send(fh close_rfile(file);close_rfile(file);close_rfile(file); Revision-number: 8110 Prop-content-length: 458 Content-length: 458 K 7 svn:log V 357 Patch from Tim Kosse: check back->exitcode() in both loops on ssh_sftp_loop_iteration(), not just one. Fixes exiting on a negative response to the host key confirmation prompt on Windows (because winsftp.c doesn't have the equivalent of uxsftp.c's no_fds_ok); on Unix it worked already but gave a suboptimal error message, which is fixed too by this patch. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-07-06T12:24:56.846016Z PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c4fbead98d742b91d187e2cc11829a4 Text-delta-base-sha1: 8b4959dcbdb96a3a029653209970b79775d73e05 Text-content-length: 72 Text-content-md5: f624383f79b9c476e07e2d45572b3447 Text-content-sha1: e3f077ae8f5b923c5f369958163d3bbe88824144 Content-length: 72 SVN��!V /� ��back->exitcode(backhandle) >= 0) return 1; Revision-number: 8111 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 Think this is probably fixed now. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-07-06T21:46:38.149744Z PROPS-END Node-path: putty-wishlist/data/pscp-psftp-fail-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc1e3ac94556b6eb26cc6ca96aed7546 Text-delta-base-sha1: 40abbd8ad83aab58b97f8c4de2ae8246eabe1ca8 Text-content-length: 47 Text-content-md5: afd60ed4d728e50108eabe5539b2a0ec Text-content-sha1: efab43f6f04482268e611665171503b3aad8c7f5 Content-length: 47 SVN��NB ���Fixed-in: r8110 2008-07-07 Revision-number: 8112 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-09T23:34:11.905474Z PROPS-END Revision-number: 8113 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-09T23:34:12.034874Z PROPS-END Revision-number: 8114 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-11T23:34:31.450931Z PROPS-END Revision-number: 8115 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-11T23:34:31.523143Z PROPS-END Revision-number: 8116 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-11T23:34:31.526546Z PROPS-END Revision-number: 8117 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2008-07-11T19:24:56.715863Z K 7 svn:log V 88 Replicate r8110 from PSFTP to PSCP, and various other minor patchery from Roger Picton. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: be54f02d961fe79ac16917c17c702942 Text-delta-base-sha1: a80d7eff579befc3aaf339328c8ae7261e8edca4 Text-content-length: 242 Text-content-md5: 4255da6d3c7888b811d314dddb7a63f7 Text-content-sha1: ae3094c801bda2f1ecc2270f7a6f4e4139b83516 Content-length: 242 SVN��&4Q�>�D�+�z, if (back->exitcode(backhandle) >= 0) { errs++; return; } if (ssh_sftp_loop_iteration() < 0) { errs++; return; /* doom */ } && errs == 0 Revision-number: 8118 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2008-07-11T19:25:31.481700Z K 7 svn:log V 25 Fix for PSCP too (oops). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/pscp-psftp-fail-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: afd60ed4d728e50108eabe5539b2a0ec Text-delta-base-sha1: efab43f6f04482268e611665171503b3aad8c7f5 Text-content-length: 33 Text-content-md5: 2ce43371acf94abc2cde38dd3f4f0d8a Text-content-sha1: ef62307477e46a46f3fe71b293b70772718b845b Content-length: 33 SVN��BB �&��27 2008-07-12 Revision-number: 8119 Prop-content-length: 327 Content-length: 327 K 7 svn:log V 226 At least one version of gcc won't figure out that "clear" is never read uninitialised (because the only circumstance under which it isn't initialised is when "update" is FALSE, in which case it isn't read either). Placate it. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-07-17T17:01:27.016043Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3e0c63e0eeb5c797c2d3eb492fdb5ca3 Text-delta-base-sha1: ae64ef2f3f212c4a63ef8093734473b19ab04dec Text-content-length: 34 Text-content-md5: 24972bd9a5ce0add552279ff5f2aacb8 Text-content-sha1: d9024646661a28a7c8c725af1c39d8fdc4093189 Content-length: 34 SVN��%- �a��Da = FALSE Revision-number: 8120 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2008-07-18T21:39:49.267964Z K 7 svn:log V 78 Another, subtly different version string for ssh2-bug-maxpkt, from Tim Kosse. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: de9b72c0c37365257a8575435355a348 Text-delta-base-sha1: 294da3586ce6e479b073b4bca02dc19a1ba387b6 Text-content-length: 218 Text-content-md5: 569b87713c442871738abd1b36bf3e58 Text-content-sha1: b5f15ebc58edd1c8640af9f9bb651f2bc3700396 Content-length: 218 SVN���� 0�+��%$ || wc_match("1.36 sshlib: GlobalScape���7�I�ile (pktin || inlen > 0); r = ssh->agent_response; �;r7�;�mcpy(addrstr, peeraddr, peeraddrlen); addrstr[peeraddr Node-path: putty-wishlist/data/ssh2-bug-maxpkt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aa75e57e2277b258cd23096b7b3e1870 Text-delta-base-sha1: b4366471ef656d62718acb63c003f7fe6cf14e8a Text-content-length: 322 Text-content-md5: 3f32b550ce2d1a77f71328a78af55316 Text-content-sha1: dc18c285db25cacd03c107a843bd3b8ed5696e99 Content-length: 322 SVN��6/��/ <p><em>Update, 2008-07-19:</em> according to <a href="http://forum.filezilla-project.org/viewtopic.php?f=1&t=7271&p=25857#p25857">this thread</a>, another server with a subtly different version string has the same problem. As of today's snapshot PuTTY should automatically detect that version as well. Revision-number: 8121 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 17 www.winputty.com K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-07-19T16:41:52.532856Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 88d6fa37249e8caf9f204fa3c80c0e9c Text-delta-base-sha1: 4ea244f64af26a9d2da1c95b389f7bef2f91f73b Text-content-length: 134 Text-content-md5: 01cd69e79f6ac031103ce414cda4f7cd Text-content-sha1: 59212e2e60843917f8018709eb4a6d838adc2160 Content-length: 134 SVN��u m�'�m�a$See also \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/dll-frontend.html}{the wishlist entry} Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c0428b2db3be4874d33d3a7556fb8004 Text-delta-base-sha1: 708a8a74fb3be282e61de68251f6a3b8a6c03cce Text-content-length: 137 Text-content-md5: 6e3469f6e46aea6d0826ddd180def0b6 Text-content-sha1: cc0d3c1604bec27f56bf6a8e0cc2915a4d6b17d4 Content-length: 137 SVN��QC q�:�q�9<li><a href="http://www.winputty.com/"> W-PuTTY-CD</a>, a <a href="wishlist/dll-frontend.html">DLL frontend</a> Node-path: putty-wishlist/data/dll-frontend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3e4dc7824fc70415789f59ea34da39c6 Text-delta-base-sha1: 85be4f36e81ae5ac9985026227232603c471aba9 Text-content-length: 122 Text-content-md5: a299a5d9600f36e15ec1b405405b285b Text-content-sha1: e0b2c5e2abdfd73b5ce53fee07cace899d948d28 Content-length: 122 SVN��2i�2�i <p> There's a third-party DLL encapsulation, W-Putty-CD, on our <a href="../links.html">Links page</a>. Revision-number: 8122 Prop-content-length: 116 Content-length: 116 K 8 svn:date V 27 2008-07-19T16:44:50.528395Z K 7 svn:log V 16 Another report. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win-fixed-ttf-underline Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d731664673465fcf1019fe26995d800 Text-delta-base-sha1: d5b8c20560149e3a67029f16d630e0ea066b8e0e Text-content-length: 66 Text-content-md5: 361b2a718fa9114fe4a0b99c899dc85f Text-content-sha1: 149498c290d7b0ec65e5806cecd95c5db278cebd Content-length: 66 SVN��Dv2�D� Another report: 20080624013622.GC26675@pihost.us Revision-number: 8123 Prop-content-length: 110 Content-length: 110 K 8 svn:date V 27 2008-07-22T14:11:17.974156Z K 7 svn:log V 10 Spelling. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/dll-frontend Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a299a5d9600f36e15ec1b405405b285b Text-delta-base-sha1: e0b2c5e2abdfd73b5ce53fee07cace899d948d28 Text-content-length: 22 Text-content-md5: 3b1c2b2b8eadda45622971436c2990de Text-content-sha1: f9a7ac955b61c6617b22e3b3ef873c558723b6bd Content-length: 22 SVN���d�4gTTY Revision-number: 8124 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-24T23:34:26.911024Z PROPS-END Revision-number: 8125 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-25T23:34:21.910361Z PROPS-END Revision-number: 8126 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-25T23:34:21.973714Z PROPS-END Revision-number: 8127 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-26T23:34:22.902064Z PROPS-END Revision-number: 8128 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-26T23:34:22.949876Z PROPS-END Revision-number: 8129 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-26T23:34:22.963543Z PROPS-END Revision-number: 8130 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-26T23:34:22.966939Z PROPS-END Revision-number: 8131 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-27T23:34:11.772358Z PROPS-END Revision-number: 8132 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-27T23:34:11.860604Z PROPS-END Revision-number: 8133 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-27T23:34:11.863966Z PROPS-END Revision-number: 8134 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-27T23:34:11.867341Z PROPS-END Revision-number: 8135 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-28T23:34:33.530784Z PROPS-END Revision-number: 8136 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-07-30T23:34:41.327692Z PROPS-END Revision-number: 8137 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-09T23:34:07.967248Z PROPS-END Revision-number: 8138 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2008-08-10T13:10:31.981603Z K 7 svn:log V 43 Initial commit of GSSAPI Kerberos support. K 10 svn:author V 4 owen PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9a556a673cce4875bd56a7cdff554081 Text-delta-base-sha1: 9aaef7812b4d00299ea03ab5b506faccd2b6c6b0 Text-content-length: 219 Text-content-md5: b52c01e7e0afc0fadcdd6ce0eb83b3dc Text-content-sha1: 6ba6ac34376507973fc3360b137d2518f1c44632 Content-length: 219 SVN��:e8��l�hv�3]� 0NO_GSSAPI # Disables PuTTY's ability to use GSSAPI functions for # authentication and key exchangeCFLAGS = $(CFLAGS) /DHAS_GSSAPI wingss UXSSH = SSH uxnoise uxagentc uxgss Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 24972bd9a5ce0add552279ff5f2aacb8 Text-delta-base-sha1: d9024646661a28a7c8c725af1c39d8fdc4093189 Text-content-length: 419 Text-content-md5: 57e839aedc8481d64d8a23fc5439190c Text-content-sha1: 2785582a1d51226d1d6492abec47b8b972849419 Content-length: 419 SVN��-.~�e�:�*cD�! #ifndef NO_GSSAPI ctrl_checkbox(s, "Attempt GSSAPI auth (SSH-2)", NO_SHORTCUT, HELPCTX(no_help), dlg_stdcheckbox_handler, I(offsetof(Config,try_gssapi_auth))); #endif#ifndef NO_GSSAPI ctrl_checkbox(s, "Allow GSSAPI credential delegation in SSH-2", NO_SHORTCUT, HELPCTX(no_help), dlg_stdcheckbox_handler, I(offsetof(Config,gssapifwd))); #endif Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c914117f4dad5d7f65deebecf2144fde Text-delta-base-sha1: 8e84cc9dfb1110c191c77665a1405ec586b5f046 Text-content-length: 355 Text-content-md5: 30adf4957fb08c8c69ee19366ba6a53d Text-content-sha1: 385fcb4854beac7b384ea529ff3d66bce04c1407 Content-length: 355 SVN��7m9�t�M�vhl�Xt�rEIf necessary set the path to krb5-config here\n". "KRB5CONFIG=krb5-configifeq (,\$(findstring NO_GSSAPI,\$(COMPAT)))\n". "CFLAGS+= `\$(KRB5CONFIG) --cflags gssapi`\n". "XLDFLAGS+= `\$(KRB5CONFIG) --libs gssapi`\n". "ULDFLAGS = `\$(KRB5CONFIG) --libs gssapi`\n". "endif\n"; "INSTALL=install Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eac721d23ddbfa66ce5c26212fdd959e Text-delta-base-sha1: 94afda87f2324de15c05adfd046edb36e2fdfaf4 Text-content-length: 146 Text-content-md5: b5d4b8cd7aa5152b06ea4cca362710f5 Text-content-sha1: 4ff0e2fb60a05348282c0bf9a948854ae3bf0057 Content-length: 146 SVN�� y�H�y�[?try_gssapi_auth; /* attempt gssapi auth */ int gssapifwd; /* forward tgt via gss */ Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f493ccaebf1f109f114dcdfe9d9dc39 Text-delta-base-sha1: cc4e8188290f9a9c773a62b174e6bfb06456f0b3 Text-content-length: 189 Text-content-md5: 8b06d165e9c6bbc76eb7db119f5ab11e Text-content-sha1: 59215d88b2cfb704a5a22215dcfe92a1898fc143 Content-length: 189 SVN��_W% �C��4�~,�,� 3�>!GssapiFwd", cfg->gssapiAuthGSSAPI", cfg->try_gssapget_username()pi(sesskey, "GssapiFwd", 0, &cfg->gssapifwdAuthGSSAPI", 1, &cfg->try_gssap Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 569b87713c442871738abd1b36bf3e58 Text-delta-base-sha1: b5f15ebc58edd1c8640af9f9bb651f2bc3700396 Text-content-length: 7993 Text-content-md5: 7e06a1513792c58b509f4255c73cc154 Text-content-sha1: 4c03135b2a079c06b45a7904fb945085cc7e3142 Content-length: 7993 SVN����2;�I��iEa�t-�Y�wZh�kPI�d:#include "sshgss#define SSH2_MSG_USERAUTH_GSSAPI_RESPONSE 60 #define SSH2_MSG_USERAUTH_GSSAPI_TOKEN 61 #define SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE 63 #define SSH2_MSG_USERAUTH_GSSAPI_ERROR 64 #define SSH2_MSG_USERAUTH_GSSAPI_ERRTOK 65 #define SSH2_MSG_USERAUTH_GSSAPI_MIC 66GSSAPIa(SSH2_MSG_USERAUTH_GSSAPI_RESPONSE,SSH2_PKTCTX_GSSAPI); translatea(SSH2_MSG_USERAUTH_GSSAPI_TOKEN,SSH2_PKTCTX_GSSAPI); translatea(SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE,SSH2_PKTCTX_GSSAPI); translatea(SSH2_MSG_USERAUTH_GSSAPI_ERROR,SSH2_PKTCTX_GSSAPI); translatea(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK,SSH2_PKTCTX_GSSAPI); translatea(SSH2_MSG_USERAUTH_GSSAPI_MIC, SSH2_PKTCTX_GSSAPI); /* * Fully qualified host name, which we need if doing GSSAPI. */ char *fullhostname; ssh->fullhostname = dupstr(*realhost); /* save in case of GSSAPI */���?�_0D��"Unable to use key file \"%.150s\"" " (%s)\r\n", filename_to_str(&ssh->cfg.keyfile), key_type_to_str(keytype)); c_write_str(ssh, msgbuf); sfree(msgbuf); s->publickey_blob = NULL; } } else s->publickey_blob = NULL; while (pktin->type == SSH1_SMSG_FAILURE) { s->pwpkt_type = SSH1_CMSG_AUTH_PASSWORD; if (ssh->cfg.tryagent && agent_exists() && !s->tried_agent) { /* * Attempt RSA authentication using Pageant. */ void *r; s->authed = FALSE; s->tried_agent = 1; logevent("Pageant is running. Requesting keys."); /* Request the keys held by the agent. */ PUT_32BIT(s->request, 1); s->request[4] = SSH1_AGENTC_REQUEST_RSA_IDENTITIES; if (!agent_query(s->request, 5, &r, &s->responselen, ssh_agent_callback, ssh) waiting" " for agent response")); crStop(0); } } wh�rwIKb�g��Sd�N0�{�g�y�"z8�x�2�,Fant_reply = ssh2_pkt_getbool(pktin); /* * We currently don't support any global requests * at all, so we either ignore the request or * respond with REQUEST_FAILURE, depending on * want_reply. */ if (want_reply) { pktout = ssh2_pkt_init(SSH2_MSG_REQUEST_FAILURE); ssh2_pkt_send(ssh, pktout); } } static void ssh2_msg_channel_open(Ssh ssh, struct Packet *pktin) { char *type; int typelen; char *peeraddr; int peeraddrlen; int peerport; char *error = NULL; struct ssh_channel *c; unsigned remid, winsize, pktsize; struct Packet *pktout; ssh_pkt_getstring(pktin, &type, &typelen); c = snew(struct ssh_channel); c->ssh = ssh; remid = ssh_pkt_getuint32(pktin); winsize = ssh_pkt_getuint32(pktin); pktsize = ssh_pkt_getuint32(pktin); if (typelen == 3 && !memcmp(type, "x11", 3)) { char *addrstr; ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen); addrstr = snewn(peeraddrlen+1, char); me AUTH_TYPE_GSSAPIcan_gssapi; int tried_gssapi Ssh_gss_ctx gss_ctx; Ssh_gss_buf gss_buf; Ssh_gss_buf gss_rcvtok, gss_sndtok; Ssh_gss_name gss_srv_name; Ssh_gss_stat gss_stas->tried_gssapi = FALSE; && s->type != AUTH_TYPE_GSSAPI#ifndef NO_GSSAPI s->can_gssapi = ssh->cfg.try_gssapi_auth && in_commasep_string("gssapi-with-mic", methods, methlen) && ssh_gss_init(); #endif#ifndef NO_GSSAPI } else if (s->can_gssapi && !s->tried_gssapi) { /* GSSAPI Authentication */ int micoffset; Ssh_gss_buf mic; s->type = AUTH_TYPE_GSSAPI; s->tried_gssapi = TRUE; s->gotit = TRUE; ssh->pkt_actx = SSH2_PKTCTX_GSSAPI; /* Sending USERAUTH_REQUEST with "gssapi-with-mic" methodssh2_pkt_addstring(s->pktout, "gssapi-with-mic"); /* add mechanism info */ ssh_gss_indicate_mech(&s->gss_buf); /* number of GSSAPI mechanisms */ ssh2_pkt_adduint32(s->pktout,1); /* length of OID + 2 */ ssh2_pkt_adduint32(s->pktout, s->gss_buf.len + 2); ssh2_pkt_addbyte(s->pktout, SSH2_GSS_OIDTYPE); /* length of OID */ ssh2_pkt_addbyte(s->pktout, (unsigned char) s->gss_buf.len); ssh_pkt_adddata(s->pktout, s->gss_buf.data, s->gss_buf.len); ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_USERAUTH_GSSAPI_RESPONSE) { logevent("GSSAPI authentication request refused"); continue; } /* check returned packet ... */ ssh_pkt_getstring(pktin,&s->gss_rcvtok.data,&s->gss_rcvtok.len); if (s->gss_rcvtok.len != s->gss_buf.len + 2 || s->gss_rcvtok.data[0] != SSH2_GSS_OIDTYPE || s->gss_rcvtok.data[1] != s->gss_buf.len || memcmp(s->gss_rcvtok.data+2,s->gss_buf.data,s->gss_buf.len) ) { logevent("GSSAPI authentication - wrong response from server"); continue; } /* now start running */ s->gss_stat = ssh_gss_import_name(ssh->fullhostname, &s->gss_srv_name); if (s->gss_stat != SSH_GSS_OK) { if (s->gss_stat == SSH_GSS_BAD_HOST_NAME) logevent("GSSAPI import name failed - Bad service name"); else logevent("GSSAPI import name failed"); continue; } /* fetch TGT into GSS engine */ s->gss_stat = ssh_gss_acquire_cred(&s->gss_ctx); if (s->gss_stat != SSH_GSS_OK) { logevent("GSSAPI authentication failed to get credentials"); ssh_gss_release_name(&s->gss_srv_name); continue; } /* initial tokens are empty */ s->gss_rcvtok.len = s->gss_sndtok.len = 0; s->gss_rcvtok.data = s->gss_sndtok.data = NULL; /* now enter the loop */ do { s->gss_stat = ssh_gss_init_sec_context(&s->gss_ctx, s->gss_srv_name, ssh->cfg.gssapifwd, &s->gss_rcvtok, &s->gss_sndtok); if (s->gss_stat!=SSH_GSS_S_COMPLETE && s->gss_stat!=SSH_GSS_S_CONTINUE_NEEDED) { logevent("GSSAPI authentication initialisation failed"); if (ssh_gss_display_status(s->gss_ctx,&s->gss_buf) == SSH_GSS_OK) { logevent(s->gss_buf.data); sfree(s->gss_buf.data); } break; } logevent("GSSAPI authentication initialised"); /* Client and server now exchange tokens until GSSAPI * no longer says CONTINUE_NEEDED */ if (s->gss_sndtok.len != 0) { s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_GSSAPI_TOKEN); ssh_pkt_addstring_start(s->pktout); ssh_pkt_addstring_data(s->pktout,s->gss_sndtok.data,s->gss_sndtok.len); ssh2_pkt_send(ssh, s->pktout); ssh_gss_free_tok(&s->gss_sndtok); } if (s->gss_stat == SSH_GSS_S_CONTINUE_NEEDED) { crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_USERAUTH_GSSAPI_TOKEN) { logevent("GSSAPI authentication - bad server response"); s->gss_stat = SSH_GSS_FAILURE; break; } ssh_pkt_getstring(pktin,&s->gss_rcvtok.data,&s->gss_rcvtok.len); } } while (s-> gss_stat == SSH_GSS_S_CONTINUE_NEEDED); if (s->gss_stat != SSH_GSS_OK) { ssh_gss_release_name(&s->gss_srv_name); ssh_gss_release_cred(&s->gss_ctx); continue; } logevent("GSSAPI authentication loop finished OK"); /* Now send the MIC */ s->pktout = ssh2_pkt_init(0); micoffset = s->pktout->length; ssh_pkt_addstring_start(s->pktout); ssh_pkt_addstring_data(s->pktout, (char *)ssh->v2_session_id, ssh->v2_session_id_len); ssh_pkt_addbyte(s->pktout, SSH2_MSG_USERAUTH_REQUEST); ssh_pkt_addstring(s->pktout, s->username); ssh_pkt_addstring(s->pktout, "ssh-connection"); ssh_pkt_addstring(s->pktout, "gssapi-with-mic"); s->gss_buf.data = (char *)s->pktout->data + micoffset; s->gss_buf.len = s->pktout->length - micoffset; ssh_gss_get_mic(s->gss_ctx, &s->gss_buf, &mic); s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_GSSAPI_MIC); ssh_pkt_addstring_start(s->pktout); ssh_pkt_addstring_data(s->pktout, mic.data, mic.len); ssh2_pkt_send(ssh, s->pktout); ssh_gss_free_mic(&mic); s->gotit = FALSE; ssh_gss_release_name(&s->gss_srv_name); ssh_gss_release_cred(&s->gss_ctx); continue; #endifsfree(ssh->fullhostname Node-path: putty/sshgss.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 3327 Text-content-md5: fe8f600e519b4570d4d434f66359410a Text-content-sha1: 9e125f7842c73979df648554f2141e89e6afd87b Content-length: 3337 PROPS-END SVN���qqq#define SSH2_GSS_OIDTYPE 0x06 typedef void *Ssh_gss_ctx; typedef void *Ssh_gss_name; typedef enum Ssh_gss_stat { SSH_GSS_OK = 0, SSH_GSS_S_CONTINUE_NEEDED, SSH_GSS_NO_MEM, SSH_GSS_BAD_HOST_NAME, SSH_GSS_FAILURE } Ssh_gss_stat; #define SSH_GSS_S_COMPLETE SSH_GSS_OK typedef struct Ssh_gss_buf { int len; char *data; } Ssh_gss_buf; #define SSH_GSS_EMPTY_BUF (Ssh_gss_buf) {0,NULL} #define SSH_GSS_CLEAR_BUF(buf) do { \ (*buf).len = 0; \ (*buf).data = NULL; \ } while (0) /* Functions, provided by either wingss.c or uxgss.c */ /* * Do startup-time initialisation for using GSSAPI. (On Windows, * for instance, this dynamically loads the GSSAPI DLL and * retrieves some function pointers.) * * Return value is 1 on success, or 0 if initialisation failed. * * May be called multiple times (since the most convenient place * to call it _from_ is the ssh.c setup code), and will harmlessly * return success if already initialised. */ int ssh_gss_init(void); /* * Fills in buf with a string describing the GSSAPI mechanism in * use. buf->data is not dynamically allocated. */ Ssh_gss_stat ssh_gss_indicate_mech(Ssh_gss_buf *buf); /* * Converts a name such as a hostname into a GSSAPI internal form, * which is placed in "out". The result should be freed by * ssh_gss_release_name(). */ Ssh_gss_stat ssh_gss_import_name(char *in, Ssh_gss_name *out); /* * Frees the contents of an Ssh_gss_name structure filled in by * ssh_gss_import_name(). */ Ssh_gss_stat ssh_gss_release_name(Ssh_gss_name *name); /* * The main GSSAPI security context setup function. The "out" * parameter will need to be freed by ssh_gss_free_tok. */ Ssh_gss_stat ssh_gss_init_sec_context(Ssh_gss_ctx *ctx, Ssh_gss_name name, int delegate, Ssh_gss_buf *in, Ssh_gss_buf *out); /* * Frees the contents of an Ssh_gss_buf filled in by * ssh_gss_init_sec_context(). Do not accidentally call this on * something filled in by ssh_gss_get_mic() (which requires a * different free function) or something filled in by any other * way. */ Ssh_gss_stat ssh_gss_free_tok(Ssh_gss_buf *); /* * Acquires the credentials to perform authentication in the first * place. Needs to be freed by ssh_gss_release_cred(). */ Ssh_gss_stat ssh_gss_acquire_cred(Ssh_gss_ctx *); /* * Frees the contents of an Ssh_gss_ctx filled in by * ssh_gss_acquire_cred(). */ Ssh_gss_stat ssh_gss_release_cred(Ssh_gss_ctx *); /* * Gets a MIC for some input data. "out" needs to be freed by * ssh_gss_free_mic(). */ Ssh_gss_stat ssh_gss_get_mic(Ssh_gss_ctx ctx, Ssh_gss_buf *in, Ssh_gss_buf *out); /* * Frees the contents of an Ssh_gss_buf filled in by * ssh_gss_get_mic(). Do not accidentally call this on something * filled in by ssh_gss_init_sec_context() (which requires a * different free function) or something filled in by any other * way. */ Ssh_gss_stat ssh_gss_free_mic(Ssh_gss_buf *); /* * Return an error message after authentication failed. The * message string is returned in "buf", with buf->len giving the * number of characters of printable message text and buf->data * containing one more character which is a trailing NUL. * buf->data should be manually freed by the caller. */ Ssh_gss_stat ssh_gss_display_status(Ssh_gss_ctx, Ssh_gss_buf *buf); Node-path: putty/unix/uxgss.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 5336 Text-content-md5: 83cfd347a3480fc83924d6d184ccaae1 Text-content-sha1: fbfeafbe71178d1ebe0f34a8d03a0db75aa53d47 Content-length: 5346 PROPS-END SVN���JJJ#ifndef NO_GSSAPI #include <string.h> #include <gssapi/gssapi_krb5.h> #include "sshgss.h" #include "misc.h" typedef struct uxSsh_gss_ctx { OM_uint32 maj_stat; OM_uint32 min_stat; gss_ctx_id_t ctx; } uxSsh_gss_ctx; int ssh_gss_init(void) { /* On Windows this tries to load the SSPI library functions. On Unix we assume we have GSSAPI at runtime if we were linked with it at compile time */ return 1; } Ssh_gss_stat ssh_gss_indicate_mech(Ssh_gss_buf *mech) { /* Copy constant into mech */ mech->len = gss_mech_krb5->length; mech->data = gss_mech_krb5->elements; return SSH_GSS_OK; } Ssh_gss_stat ssh_gss_import_name(char *host, Ssh_gss_name *srv_name) { OM_uint32 min_stat,maj_stat; gss_buffer_desc host_buf; char *pStr; pStr = dupcat("host@", host, NULL); host_buf.value = pStr; host_buf.length = strlen(pStr); maj_stat = gss_import_name(&min_stat, &host_buf, GSS_C_NT_HOSTBASED_SERVICE, (gss_name_t *)srv_name); /* Release buffer */ sfree(pStr); if (maj_stat == GSS_S_COMPLETE) return SSH_GSS_OK; return SSH_GSS_FAILURE; } Ssh_gss_stat ssh_gss_acquire_cred(Ssh_gss_ctx *ctx) { uxSsh_gss_ctx *uxctx = snew(uxSsh_gss_ctx); uxctx->maj_stat = uxctx->min_stat = GSS_S_COMPLETE; uxctx->ctx = GSS_C_NO_CONTEXT; *ctx = (Ssh_gss_ctx) uxctx; return SSH_GSS_OK; } Ssh_gss_stat ssh_gss_init_sec_context(Ssh_gss_ctx *ctx, Ssh_gss_name srv_name, int to_deleg, Ssh_gss_buf *recv_tok, Ssh_gss_buf *send_tok) { uxSsh_gss_ctx *uxctx = (uxSsh_gss_ctx*) *ctx; OM_uint32 ret_flags; if (to_deleg) to_deleg = GSS_C_DELEG_FLAG; uxctx->maj_stat = gss_init_sec_context(&uxctx->min_stat, GSS_C_NO_CREDENTIAL, &uxctx->ctx, (gss_name_t) srv_name, (gss_OID) gss_mech_krb5, GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG | to_deleg, 0, NULL, /* no channel bindings */ (gss_buffer_desc *)recv_tok, NULL, /* ignore mech type */ (gss_buffer_desc *)send_tok, &ret_flags, NULL); /* ignore time_rec */ if (uxctx->maj_stat == GSS_S_COMPLETE) return SSH_GSS_S_COMPLETE; if (uxctx->maj_stat == GSS_S_CONTINUE_NEEDED) return SSH_GSS_S_CONTINUE_NEEDED; return SSH_GSS_FAILURE; } Ssh_gss_stat ssh_gss_display_status(Ssh_gss_ctx ctx, Ssh_gss_buf *buf) { uxSsh_gss_ctx *uxctx = (uxSsh_gss_ctx *) ctx; OM_uint32 lmin,lmax; OM_uint32 ccc; gss_buffer_desc msg_maj=GSS_C_EMPTY_BUFFER; gss_buffer_desc msg_min=GSS_C_EMPTY_BUFFER; /* Return empty buffer in case of failure */ SSH_GSS_CLEAR_BUF(buf); /* get first mesg from GSS */ ccc=0; lmax=gss_display_status(&lmin,uxctx->maj_stat,GSS_C_GSS_CODE,(gss_OID) gss_mech_krb5,&ccc,&msg_maj); if (lmax != GSS_S_COMPLETE) return SSH_GSS_FAILURE; /* get first mesg from Kerberos */ ccc=0; lmax=gss_display_status(&lmin,uxctx->min_stat,GSS_C_MECH_CODE,(gss_OID) gss_mech_krb5,&ccc,&msg_min); if (lmax != GSS_S_COMPLETE) { gss_release_buffer(&lmin, &msg_maj); return SSH_GSS_FAILURE; } /* copy data into buffer */ buf->len = msg_maj.length + msg_min.length + 1; buf->data = snewn(buf->len + 1, char); /* copy mem */ memcpy(buf->data, msg_maj.value, msg_maj.length); buf->data[msg_maj.length] = ' '; memcpy(buf->data + msg_maj.length + 1, msg_min.value, msg_min.length); buf->data[buf->len] = 0; /* free mem & exit */ gss_release_buffer(&lmin, &msg_maj); gss_release_buffer(&lmin, &msg_min); return SSH_GSS_OK; } Ssh_gss_stat ssh_gss_free_tok(Ssh_gss_buf *send_tok) { OM_uint32 min_stat,maj_stat; maj_stat = gss_release_buffer(&min_stat, (gss_buffer_desc *)send_tok); if (maj_stat == GSS_S_COMPLETE) return SSH_GSS_OK; return SSH_GSS_FAILURE; } Ssh_gss_stat ssh_gss_release_cred(Ssh_gss_ctx *ctx) { uxSsh_gss_ctx *uxctx = (uxSsh_gss_ctx *) *ctx; OM_uint32 min_stat; OM_uint32 maj_stat=GSS_S_COMPLETE; if (uxctx == NULL) return SSH_GSS_FAILURE; if (uxctx->ctx != GSS_C_NO_CONTEXT) maj_stat = gss_delete_sec_context(&min_stat,&uxctx->ctx,GSS_C_NO_BUFFER); sfree(uxctx); if (maj_stat == GSS_S_COMPLETE) return SSH_GSS_OK; return SSH_GSS_FAILURE; } Ssh_gss_stat ssh_gss_release_name(Ssh_gss_name *srv_name) { OM_uint32 min_stat,maj_stat; maj_stat = gss_release_name(&min_stat, (gss_name_t) srv_name); if (maj_stat == GSS_S_COMPLETE) return SSH_GSS_OK; return SSH_GSS_FAILURE; } Ssh_gss_stat ssh_gss_get_mic(Ssh_gss_ctx ctx, Ssh_gss_buf *buf, Ssh_gss_buf *hash) { uxSsh_gss_ctx *uxctx = (uxSsh_gss_ctx *) ctx; if (uxctx == NULL) return SSH_GSS_FAILURE; return gss_get_mic(&(uxctx->min_stat), uxctx->ctx, 0, (gss_buffer_desc *)buf, (gss_buffer_desc *)hash); } Ssh_gss_stat ssh_gss_free_mic(Ssh_gss_buf *hash) { /* On Unix this is the same freeing process as ssh_gss_free_tok. */ return ssh_gss_free_tok(hash); } #else /* Dummy function so this source file defines something if NO_GSSAPI is defined. */ int ssh_gss_init(void) { return 1; } #endif Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7b99ed9bf31c7cf44720ab9ab0fa5851 Text-delta-base-sha1: 0ef135b5af375543e28bf16f9dc93d4f030d055f Text-content-length: 57 Text-content-md5: 178221e6850620da60774f602e85e3ac Text-content-sha1: c4ae928532a20a6e100aa4bc81a92943c411c65c Content-length: 57 SVN��su !�]��w| if (!strcmp(name, "UserName")) Node-path: putty/windows/wingss.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 9238 Text-content-md5: 9e3cfeea3de349c487ee7e9dad45deb1 Text-content-sha1: fc20960cb4e7e5b57301b19115d559df152ca0db Content-length: 9248 PROPS-END SVN���#ifndef NO_GSSAPI #include <windows.h> #define SECURITY_WIN32 #include <security.h> #include "sshgss.h" #include "misc.h" #define NOTHING #define DECL_SSPI_FUNCTION(linkage, rettype, name, params) \ typedef rettype (WINAPI *t_##name) params; \ linkage t_##name p_##name #define GET_SSPI_FUNCTION(module, name) \ p_##name = module ? (t_##name) GetProcAddress(module, #name) : NULL DECL_SSPI_FUNCTION(static, SECURITY_STATUS, AcquireCredentialsHandleA, (SEC_CHAR *, SEC_CHAR *, ULONG, PLUID, PVOID, SEC_GET_KEY_FN, PVOID, PCredHandle, PTimeStamp)); DECL_SSPI_FUNCTION(static, SECURITY_STATUS, InitializeSecurityContextA, (PCredHandle, PCtxtHandle, SEC_CHAR *, ULONG, ULONG, ULONG, PSecBufferDesc, ULONG, PCtxtHandle, PSecBufferDesc, PULONG, PTimeStamp)); DECL_SSPI_FUNCTION(static, SECURITY_STATUS, FreeContextBuffer, (PVOID)); DECL_SSPI_FUNCTION(static, SECURITY_STATUS, FreeCredentialsHandle, (PCredHandle)); DECL_SSPI_FUNCTION(static, SECURITY_STATUS, DeleteSecurityContext, (PCtxtHandle)); DECL_SSPI_FUNCTION(static, SECURITY_STATUS, QueryContextAttributesA, (PCtxtHandle, ULONG, PVOID)); DECL_SSPI_FUNCTION(static, SECURITY_STATUS, MakeSignature, (PCtxtHandle, ULONG, PSecBufferDesc, ULONG)); static HMODULE security_module = NULL; typedef struct winSsh_gss_ctx { unsigned long maj_stat; unsigned long min_stat; CredHandle cred_handle; CtxtHandle context; PCtxtHandle context_handle; TimeStamp expiry; } winSsh_gss_ctx; const Ssh_gss_buf gss_mech_krb5={9,"\x2A\x86\x48\x86\xF7\x12\x01\x02\x02"}; int ssh_gss_init(void) { if (security_module) return 1; /* already initialised */ security_module = LoadLibrary("secur32.dll"); if (security_module) { GET_SSPI_FUNCTION(security_module, AcquireCredentialsHandleA); GET_SSPI_FUNCTION(security_module, InitializeSecurityContextA); GET_SSPI_FUNCTION(security_module, FreeContextBuffer); GET_SSPI_FUNCTION(security_module, FreeCredentialsHandle); GET_SSPI_FUNCTION(security_module, DeleteSecurityContext); GET_SSPI_FUNCTION(security_module, QueryContextAttributesA); GET_SSPI_FUNCTION(security_module, MakeSignature); return 1; } return 0; } Ssh_gss_stat ssh_gss_indicate_mech(Ssh_gss_buf *mech) { *mech = gss_mech_krb5; return SSH_GSS_OK; } Ssh_gss_stat ssh_gss_import_name(char *host, Ssh_gss_name *srv_name) { char *pStr; /* Check hostname */ if (host == NULL) return SSH_GSS_FAILURE; /* copy it into form host/FQDN */ pStr = dupcat("host/", host, NULL); *srv_name = (Ssh_gss_name) pStr; return SSH_GSS_OK; } Ssh_gss_stat ssh_gss_acquire_cred(Ssh_gss_ctx *ctx) { winSsh_gss_ctx *winctx = snew(winSsh_gss_ctx); /* prepare our "wrapper" structure */ winctx->maj_stat = winctx->min_stat = SEC_E_OK; winctx->context_handle = NULL; /* Specifying no principal name here means use the credentials of the current logged-in user */ winctx->maj_stat = p_AcquireCredentialsHandleA(NULL, "Kerberos", SECPKG_CRED_OUTBOUND, NULL, NULL, NULL, NULL, &winctx->cred_handle, &winctx->expiry); if (winctx->maj_stat != SEC_E_OK) return SSH_GSS_FAILURE; *ctx = (Ssh_gss_ctx) winctx; return SSH_GSS_OK; } Ssh_gss_stat ssh_gss_init_sec_context(Ssh_gss_ctx *ctx, Ssh_gss_name srv_name, int to_deleg, Ssh_gss_buf *recv_tok, Ssh_gss_buf *send_tok) { winSsh_gss_ctx *winctx = (winSsh_gss_ctx *) *ctx; SecBuffer wsend_tok = {send_tok->len,SECBUFFER_TOKEN,send_tok->data}; SecBuffer wrecv_tok = {recv_tok->len,SECBUFFER_TOKEN,recv_tok->data}; SecBufferDesc output_desc={SECBUFFER_VERSION,1,&wsend_tok}; SecBufferDesc input_desc ={SECBUFFER_VERSION,1,&wrecv_tok}; unsigned long flags=ISC_REQ_MUTUAL_AUTH|ISC_REQ_REPLAY_DETECT| ISC_REQ_CONFIDENTIALITY|ISC_REQ_ALLOCATE_MEMORY; unsigned long ret_flags=0; /* check if we have to delegate ... */ if (to_deleg) flags |= ISC_REQ_DELEGATE; winctx->maj_stat = p_InitializeSecurityContextA(&winctx->cred_handle, winctx->context_handle, (char*) srv_name, flags, 0, /* reserved */ SECURITY_NATIVE_DREP, &input_desc, 0, /* reserved */ &winctx->context, &output_desc, &ret_flags, &winctx->expiry); /* prepare for the next round */ winctx->context_handle = &winctx->context; send_tok->data = (char*) wsend_tok.pvBuffer; send_tok->len = wsend_tok.cbBuffer; /* check & return our status */ if (winctx->maj_stat==SEC_E_OK) return SSH_GSS_S_COMPLETE; if (winctx->maj_stat==SEC_I_CONTINUE_NEEDED) return SSH_GSS_S_CONTINUE_NEEDED; return SSH_GSS_FAILURE; } Ssh_gss_stat ssh_gss_free_tok(Ssh_gss_buf *send_tok) { /* check input */ if (send_tok == NULL) return SSH_GSS_FAILURE; /* free Windows buffer */ p_FreeContextBuffer(send_tok->data); send_tok->len = 0; send_tok->data = NULL; return SSH_GSS_OK; } Ssh_gss_stat ssh_gss_release_cred(Ssh_gss_ctx *ctx) { winSsh_gss_ctx *winctx= (winSsh_gss_ctx *) *ctx; /* check input */ if (winctx == NULL) return SSH_GSS_FAILURE; /* free Windows data */ p_FreeCredentialsHandle(&winctx->cred_handle); p_DeleteSecurityContext(&winctx->context); /* delete our "wrapper" structure */ sfree(winctx); *ctx = (Ssh_gss_ctx) NULL; return SSH_GSS_OK; } Ssh_gss_stat ssh_gss_release_name(Ssh_gss_name *srv_name) { char *pStr= (char *) *srv_name; if (pStr == NULL) return SSH_GSS_FAILURE; sfree(pStr); *srv_name = (Ssh_gss_name) NULL; return SSH_GSS_OK; } Ssh_gss_stat ssh_gss_display_status(Ssh_gss_ctx ctx, Ssh_gss_buf *buf) { winSsh_gss_ctx *winctx = (winSsh_gss_ctx *) ctx; char *msg; if (winctx == NULL) return SSH_GSS_FAILURE; /* decode the error code */ switch (winctx->maj_stat) { case SEC_E_OK: msg="SSPI status OK"; break; case SEC_E_INVALID_HANDLE: msg="The handle passed to the function" " is invalid."; break; case SEC_E_TARGET_UNKNOWN: msg="The target was not recognized."; break; case SEC_E_LOGON_DENIED: msg="The logon failed."; break; case SEC_E_INTERNAL_ERROR: msg="The Local Security Authority cannot" " be contacted."; break; case SEC_E_NO_CREDENTIALS: msg="No credentials are available in the" " security package."; break; case SEC_E_NO_AUTHENTICATING_AUTHORITY: msg="No authority could be contacted for authentication." "The domain name of the authenticating party could be wrong," " the domain could be unreachable, or there might have been" " a trust relationship failure."; break; case SEC_E_INSUFFICIENT_MEMORY: msg="One or more of the SecBufferDesc structures passed as" " an OUT parameter has a buffer that is too small."; break; case SEC_E_INVALID_TOKEN: msg="The error is due to a malformed input token, such as a" " token corrupted in transit, a token" " of incorrect size, or a token passed into the wrong" " security package. Passing a token to" " the wrong package can happen if client and server did not" " negotiate the proper security package."; break; default: msg = "Internal SSPI error"; break; } buf->data = dupstr(msg); buf->len = strlen(buf->data); return SSH_GSS_OK; } Ssh_gss_stat ssh_gss_get_mic(Ssh_gss_ctx ctx, Ssh_gss_buf *buf, Ssh_gss_buf *hash) { winSsh_gss_ctx *winctx= (winSsh_gss_ctx *) ctx; SecPkgContext_Sizes ContextSizes; SecBufferDesc InputBufferDescriptor; SecBuffer InputSecurityToken[2]; if (winctx == NULL) return SSH_GSS_FAILURE; winctx->maj_stat = 0; memset(&ContextSizes, 0, sizeof(ContextSizes)); winctx->maj_stat = p_QueryContextAttributesA(&winctx->context, SECPKG_ATTR_SIZES, &ContextSizes); if (winctx->maj_stat != SEC_E_OK || ContextSizes.cbMaxSignature == 0) return winctx->maj_stat; InputBufferDescriptor.cBuffers = 2; InputBufferDescriptor.pBuffers = InputSecurityToken; InputBufferDescriptor.ulVersion = SECBUFFER_VERSION; InputSecurityToken[0].BufferType = SECBUFFER_DATA; InputSecurityToken[0].cbBuffer = buf->len; InputSecurityToken[0].pvBuffer = buf->data; InputSecurityToken[1].BufferType = SECBUFFER_TOKEN; InputSecurityToken[1].cbBuffer = ContextSizes.cbMaxSignature; InputSecurityToken[1].pvBuffer = snewn(ContextSizes.cbMaxSignature, char); winctx->maj_stat = p_MakeSignature(&winctx->context, 0, &InputBufferDescriptor, 0); if (winctx->maj_stat == SEC_E_OK) { hash->len = InputSecurityToken[1].cbBuffer; hash->data = InputSecurityToken[1].pvBuffer; } return winctx->maj_stat; } Ssh_gss_stat ssh_gss_free_mic(Ssh_gss_buf *hash) { sfree(hash->data); return SSH_GSS_OK; } #else /* Dummy function so this source file defines something if NO_GSSAPI is defined. */ int ssh_gss_init(void) { return 0; } #endif Revision-number: 8139 Prop-content-length: 303 Content-length: 303 K 8 svn:date V 27 2008-08-10T14:28:51.292726Z K 7 svn:log V 202 Link to pTerm, an SSH client for the iPhone that's apparently based on PuTTY. Attempts at damage limitation from the name similarity with pterm. Also try to refresh the ports section of the FAQ a bit. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 01cd69e79f6ac031103ce414cda4f7cd Text-delta-base-sha1: 59212e2e60843917f8018709eb4a6d838adc2160 Text-content-length: 1091 Text-content-md5: 4cdc5122216141d4c8bc666a6a23e6d2 Text-content-sha1: ff99569314de1bbb832c42be3e045938e89a262f Content-length: 1091 SVN��uq"���/\\�$�fFl�.Gpartial ports to the Mac OSes exist (see \k{faq-mac-port}) \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/links.html}{Links page of our website}. There are a couple of ways of building it, including the usual \c{configure}/\c{make}; see the file \c{README} in the source distribution. This; see the \W{http://www.chiark.greenend.org.uk/~sgtatham/putty/links.html}{Links page of our website} for various third-party ports. \S{faq-iphone}{Question} Will there be a port to the iPhone? We have no plans to write such a port ourselves; none of us has an iPhone, and developing and publishing applications for it looks awkward and expensive. Such a port would probably depend upon the stalled Mac OS X port (see \k{faq-mac-port}). However, there is a third-party SSH client for the iPhone and iPod\_Touch called \W{http://www.instantcocoa.com/products/pTerm/}{pTerm}, which is apparently based on PuTTY. (This is nothing to do with our similarly-named \c{pterm}, which is a standalone terminal emulator for Unix systems; see \k{faq-unix}.) Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e3469f6e46aea6d0826ddd180def0b6 Text-delta-base-sha1: cc0d3c1604bec27f56bf6a8e0cc2915a4d6b17d4 Text-content-length: 190 Text-content-md5: 337803cc1c71544232ed11e9ea2566a9 Text-content-sha1: 1a57cf27ccd9d42984917393f4be5cd4cf3843d5 Content-length: 190 SVN��C� $�R�$� 9instantcocoa.com/products/pTerm/"> pTerm</a>, for iPhone and iPod Touch (not to be confused with our own Unix terminal emulator "pterm"). Commercial, but cheap. Revision-number: 8140 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-11T23:34:20.457137Z PROPS-END Revision-number: 8141 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-11T23:34:20.618266Z PROPS-END Revision-number: 8142 Prop-content-length: 202 Content-length: 202 K 7 svn:log V 101 James has made the URL syntax for http://svn.tartarus.org/ more sensible. Update the FAQ link to it. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-08-11T18:03:34.561233Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cdc5122216141d4c8bc666a6a23e6d2 Text-delta-base-sha1: ff99569314de1bbb832c42be3e045938e89a262f Text-content-length: 27 Text-content-md5: 3c48d12c3268d33fcc1dca74b961ea5e Text-content-sha1: eb74ef3b0c38b8d17a19f101bfec6c4cfc27f51a Content-length: 27 SVN��qu �d��csgt Revision-number: 8143 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2008-08-11T18:03:57.459608Z K 7 svn:log V 65 Update to match the new URL format for http://svn.tartarus.org/. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a8422b70e577e30517ce17600987c43b Text-delta-base-sha1: ba080c8a8ab1fc6d3325528863e34260e7ebc732 Text-content-length: 26 Text-content-md5: 7324db426e03edbe0b78376bfee1a90d Text-content-sha1: 2a00c3504c1c44a61cb3dfb364e2bb89dcaa9453 Content-length: 26 SVN��gk �\�� [sgt Revision-number: 8144 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2008-08-11T22:12:48.236992Z K 7 svn:log V 44 Update for new svn.tartarus.org URL format. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9cba9036bbe70a8dda85e2960fdd99cd Text-delta-base-sha1: 112c1867b20bf2fb44396a0426c854865db90323 Text-content-length: 28 Text-content-md5: 30e1a3f93bab5b7c628b8662f93251d7 Text-content-sha1: 3e7578ac6420adb275ac9e1b15e1ab74ea15808e Content-length: 28 SVN��qu �$��N#svn Revision-number: 8145 Prop-content-length: 161 Content-length: 161 K 10 svn:author V 5 simon K 8 svn:date V 27 2008-08-11T23:23:00.749230Z K 7 svn:log V 61 Update for new svn.tartarus.org URL format, without typo :-) PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30e1a3f93bab5b7c628b8662f93251d7 Text-delta-base-sha1: 3e7578ac6420adb275ac9e1b15e1ab74ea15808e Text-content-length: 27 Text-content-md5: 3bf9dec4ebe17bacf77cf988b0f754d7 Text-content-sha1: dd3cd9e8b1fae55a4ef94c2e4b229d18cf30c69a Content-length: 27 SVN��uu �%��N'gt Revision-number: 8146 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-15T23:34:07.299936Z PROPS-END Revision-number: 8147 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-15T23:34:07.395738Z PROPS-END Revision-number: 8148 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-18T23:34:18.399677Z PROPS-END Revision-number: 8149 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-18T23:34:18.480773Z PROPS-END Revision-number: 8150 Prop-content-length: 442 Content-length: 442 K 8 svn:date V 27 2008-08-20T22:21:04.570297Z K 7 svn:log V 341 Fix for portfwd-addr-family: on Unix, when a tunnel is specified as "Auto" (rather than IPv4 or IPv6-only; this is the default), try to open up listening sockets on both address families, rather than (unhelpfully) just IPv6. (And don't open one if the other can't be bound, in a nod to CVE-2008-1483.) Based on a patch from Ben A L Jemmett. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ccfc1e0488a41bd5feb53c3f5d7263a2 Text-delta-base-sha1: cfd666d5552d53721a5e20d0eb8d836750627589 Text-content-length: 1487 Text-content-md5: 951e2c80f7e338bc09b4bfba277cbc82 Text-content-sha1: 31ccb924ea2c3c64d1de1f97a098da0af473c778 Content-length: 1487 SVN��Tm�a��X �l �S�vZ�sE�{8�Y��xP�QCN�_X9�75�#e /* * We sometimes need pairs of Socket structures to be linked: * if we are listening on the same IPv6 and v4 port, for * example. So here we define `parent' and `child' pointers to * track this link. */ Actual_Socket parent, child; }parent = ret->child = NULLparent = ret->child = NULLorig_address_family; int on = 1local_host_only; ret->pending_error = 0; ret->parent = ret->child = NULLorig_address_family == ADDRTYPE_IPV4 ? AF_INET : #ifndef NO_IPV6 orig_#ifndef NO_IPV6 /* * If we were given ADDRTYPE_UNSPEC, we must also create an * IPv4 listening socket and link it to this one. */ if (address_family == AF_INET6 && orig_address_family == ADDRTYPE_UNSPEC) { Actual_Socket other; other = (Actual_Socket) sk_newlistener(srcaddr, port, plug, local_host_only, ADDRTYPE_IPV4); if (other) { if (!other->error) { other->parent = ret; ret->child = other; } else { /* If we couldn't create a listening socket on IPv4 as well * as IPv6, we must return an error overall. */ close(s); sfree(ret); return (Socket) other; } } } #endifif (s->child) sk_tcp_close((Socket)s->child) Node-path: putty-wishlist/data/portfwd-addr-family Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 88295bbb7e258ceecf0243d4cf3e759e Text-delta-base-sha1: 706aad9da2fec5a465a91b91a5f24302cd1bf74b Text-content-length: 47 Text-content-md5: ad6995fb79d213f6689df089d40a3594 Text-content-sha1: 44999956d02ac24cbfb41647555d1d50164a440d Content-length: 47 SVN��W ���9Fixed-in: r8150 2008-08-21 Revision-number: 8151 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-21T23:34:59.902293Z PROPS-END Revision-number: 8152 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-21T23:34:59.994956Z PROPS-END Revision-number: 8153 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-25T23:34:22.791446Z PROPS-END Revision-number: 8154 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-28T23:34:02.624024Z PROPS-END Revision-number: 8155 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-08-29T23:34:15.531749Z PROPS-END Revision-number: 8156 Prop-content-length: 387 Content-length: 387 K 7 svn:log V 286 Minor code cleanup: I just happened to be looking at this file for other reasons and I noticed that the list of TELOPTs is given twice and hence needs to be kept in sync. Replace with my now-standard second-order-macro approach which allows the list to be maintained in only one place. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-08-31T17:12:37.858747Z PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1bc5807ea1ad8255997eb8ab1aedbd98 Text-delta-base-sha1: 2bb6a48f9fbea3c4b0deb8859e9ed2495c92d5f5 Text-content-length: 3815 Text-content-md5: 461713b79f43217350a6605e1a34cb1f Text-content-sha1: ca38762a5243a657cbe8c55f352a0d864b801dc8 Content-length: 3815 SVN��GPD�q�5�92�beS(X) \ X(BINARY, 0) /* 8-bit data path */ \ X(ECHO, 1) /* echo */ \ X(RCP, 2) /* prepare to reconnect */ \ X(SGA, 3) /* suppress go ahead */ \ X(NAMS, 4) /* approximate message size */ \ X(STATUS, 5) /* give status */ \ X(TM, 6) /* timing mark */ \ X(RCTE, 7) /* remote controlled transmission and echo */ \ X(NAOL, 8) /* negotiate about output line width */ \ X(NAOP, 9) /* negotiate about output page size */ \ X(NAOCRD, 10) /* negotiate about CR disposition */ \ X(NAOHTS, 11) /* negotiate about horizontal tabstops */ \ X(NAOHTD, 12) /* negotiate about horizontal tab disposition */ \ X(NAOFFD, 13) /* negotiate about formfeed disposition */ \ X(NAOVTS, 14) /* negotiate about vertical tab stops */ \ X(NAOVTD, 15) /* negotiate about vertical tab disposition */ \ X(NAOLFD, 16) /* negotiate about output LF disposition */ \ X(XASCII, 17) /* extended ascic character set */ \ X(LOGOUT, 18) /* force logout */ \ X(BM, 19) /* byte macro */ \ X(DET, 20) /* data entry terminal */ \ X(SUPDUP, 21) /* supdup protocol */ \ X(SUPDUPOUTPUT, 22) /* supdup output */ \ X(SNDLOC, 23) /* send location */ \ X(TTYPE, 24) /* terminal type */ \ X(EOR, 25) /* end or record */ \ X(TUID, 26) /* TACACS user identification */ \ X(OUTMRK, 27) /* output marking */ \ X(TTYLOC, 28) /* terminal location number */ \ X(3270REGIME, 29) /* 3270 regime */ \ X(X3PAD, 30) /* X.3 PAD */ \ X(NAWS, 31) /* window size */ \ X(TSPEED, 32) /* terminal speed */ \ X(LFLOW, 33) /* remote flow control */ \ X(LINEMODE, 34) /* Linemode option */ \ X(XDISPLOC, 35) /* X Display Location */ \ X(OLD_ENVIRON, 36) /* Old - Environment variables */ \ X(AUTHENTICATION, 37) /* Authenticate */ \ X(ENCRYPT, 38) /* Encryption option */ \ X(NEW_ENVIRON, 39) /* New - Environment variables */ \ X(TN3270E, 40) /* TN3270 enhancements */ \ X(XAUTH, 41) \ X(CHARSET, 42) /* Character set */ \ X(RSP, 43) /* Remote serial port */ \ X(COM_PORT_OPTION, 44) /* Com port control */ \ X(SLE, 45) /* Suppress local echo */ \ X(STARTTLS, 46) /* Start TLS */ \ X(KERMIT, 47) /* Automatic Kermit file transfer */ \ X(SEND_URL, 48) \ X(FORWARD_X, 49) \ X(PRAGMA_LOGON, 138) \ X(SSPI_LOGON, 139) \ X(PRAGMA_HEARTBEAT, 140) \ X(EXOPL, 255) /* extended-options-list */ #define telnet_enum(x,y) TELOPT_##x = y, enum { TELOPTS(telnet_enum) dummy=0 }; #undef telnet_enumtelnet_str(x,y) case TELOPT_##x: return #x; switch (opt) { TELOPTS(telnet_str) default: return "<unknown>"; } #undef telnet_str Revision-number: 8157 Prop-content-length: 301 Content-length: 301 K 8 svn:date V 27 2008-08-31T19:18:17.403650Z K 7 svn:log V 200 Colin Watson points out an apparently erroneous cast: Ssh_gss_name and gss_name_t are supposed to be congruent types, so a pointer to one should never be cast to a non-indirect instance of the other. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 83cfd347a3480fc83924d6d184ccaae1 Text-delta-base-sha1: fbfeafbe71178d1ebe0f34a8d03a0db75aa53d47 Text-content-length: 37 Text-content-md5: 9fc56eacc19758e50b090f69cc9d464c Text-content-sha1: 5ab78f1870a1fec010e01b6e557634e241eb2a6b Content-length: 37 SVN��JL �a��q9�n\ *) srv_name Revision-number: 8158 Prop-content-length: 591 Content-length: 591 K 7 svn:log V 490 Good grief. When I originally wrote the local proxy code two years ago, I apparently caused all data received from local proxies to be unconditionally tagged as TCP Urgent. Most network backends ignore this, but it's critical to the Telnet backend, which will ignore all Urgent-marked data in the assumption that there's a SYNCH on its way that it should wait for. Nobody has noticed in two years, presumably meaning that nobody has ever tried to do Telnet over a local proxy in that time. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-08-31T21:45:39.230791Z PROPS-END Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1a6e36b28b05b4aeb8e16ef59653bbf9 Text-delta-base-sha1: 750ec84bfaeb86ec902b7caf95cc5b607e678121 Text-content-length: 22 Text-content-md5: a0761fe2b55d01f3ad61da1980f29087 Text-content-sha1: 8ba3167a2387f2dcc39601927bf9df0568b5a9eb Content-length: 22 SVN�� �R��6S0 Node-path: putty/windows/winproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 484e1be101daa2292e00519240ef4f4d Text-delta-base-sha1: 66d34b1ffc975a4a433dd8f30c43aba2201899c4 Text-content-length: 22 Text-content-md5: f9735d9c8966c4f4ba63e238f2b3d74f Text-content-sha1: 6b5c6bb27bf950fa0f20db52eeeacae13b7e3c9a Content-length: 22 SVN�� �r��+s0 Revision-number: 8159 Prop-content-length: 289 Content-length: 289 K 7 svn:log V 188 Fix punctuation in the large print statements. In particular, one semicolon which crept in in r8138 was causing a lot of the "make install" implementation to be missing from Makefile.gtk. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-09-01T17:56:20.816486Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30adf4957fb08c8c69ee19366ba6a53d Text-delta-base-sha1: 385fcb4854beac7b384ea529ff3d66bce04c1407 Text-content-length: 517 Text-content-md5: 4ae36651291a28e8c9476862634faf06 Text-content-sha1: 212d27fa5569f58887bb5f06e6451897c3862501 Content-length: 517 SVN��mm_� ��� _�a . "INSTALL=install\n". "INSTALL_PROGRAM=\$(INSTALL)\n". "INSTALL_DATA=\$(INSTALL)\n". "prefix=/usr/local\n". "exec_prefix=\$(prefix)\n". "bindir=\$(exec_prefix)/bin\n". "mandir=\$(prefix)/man\n". "man1dir=\$(mandir)/man1\n".. "INSTALL_PROGRAM=\$(INSTALL)\n". "INSTALL_DATA=\$(INSTALL)\n". "prefix=\@prefix\@\n". "exec_prefix=\@exec_prefix\@\n". "bindir=\@bindir\@\n". "mandir=\@mandir\@\n". "man1dir=\$(mandir)/man1\n". Revision-number: 8160 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-02T23:34:14.912113Z PROPS-END Revision-number: 8161 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-06T23:34:10.145887Z PROPS-END Revision-number: 8162 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-06T23:34:10.292353Z PROPS-END Revision-number: 8163 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-06T23:34:10.296034Z PROPS-END Revision-number: 8164 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-06T23:34:10.299452Z PROPS-END Revision-number: 8165 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-06T23:34:10.335134Z PROPS-END Revision-number: 8166 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-07T23:34:29.204072Z PROPS-END Revision-number: 8167 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-07T23:34:29.292648Z PROPS-END Revision-number: 8168 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-08T23:35:09.036204Z PROPS-END Revision-number: 8169 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-08T23:35:09.166806Z PROPS-END Revision-number: 8170 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-08T23:35:09.170223Z PROPS-END Revision-number: 8171 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-08T23:35:09.173868Z PROPS-END Revision-number: 8172 Prop-content-length: 320 Content-length: 320 K 8 svn:date V 27 2008-09-09T20:36:40.473588Z K 7 svn:log V 219 If we got a keyboard-interactive INFO_REQUEST with an "instruction" string but no actual prompts, we weren't displaying the former, which was wrong. We should now (although I haven't found a server to test it against). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b5d4b8cd7aa5152b06ea4cca362710f5 Text-delta-base-sha1: 4ff0e2fb60a05348282c0bf9a948854ae3bf0057 Text-content-length: 140 Text-content-md5: de77c621d7189079ae9e7e9e62ee49fe Text-content-sha1: 47bd317b5964158c3eb4c446939e06daf9d52d32 Content-length: 140 SVN�� q�e�q�7e /* May be zero (in which case display the foregoing, * if any, and return success) */ Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e06a1513792c58b509f4255c73cc154 Text-delta-base-sha1: 4c03135b2a079c06b45a7904fb945085cc7e3142 Text-content-length: 209 Text-content-md5: 70372bc657de8f5c5936443dc8bf59ff Text-content-sha1: a5333211358c15244100369a87bb105dfafc6291 Content-length: 209 SVN����������������w,�W��&bw�6N�rany prompt(s) * Display any instructions, and get the user's * response(s). */ (s) Revision-number: 8173 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-10T23:34:43.418077Z PROPS-END Revision-number: 8174 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-10T23:34:43.531483Z PROPS-END Revision-number: 8175 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-13T23:34:34.552194Z PROPS-END Revision-number: 8176 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-13T23:34:34.673744Z PROPS-END Revision-number: 8177 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-13T23:34:34.677941Z PROPS-END Revision-number: 8178 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-13T23:34:35.031849Z PROPS-END Revision-number: 8179 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-13T23:34:35.035824Z PROPS-END Revision-number: 8180 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-13T23:34:35.102838Z PROPS-END Revision-number: 8181 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-14T23:34:22.801964Z PROPS-END Revision-number: 8182 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2008-09-14T15:11:42.911181Z K 7 svn:log V 184 Some Windows keymaps, it turns out, don't translate the key combination Ctrl + \ as the Ctrl-\ character. All of mine have, but at least one laptop turns out not to. Do so explicitly. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a913cbd27281778834870484cc4d3e25 Text-delta-base-sha1: 1416951eeb6dfdff222b3beb17126fb47806add0 Text-content-length: 74 Text-content-md5: 5cfc2c09f4e412e8a168d46aba093219 Text-content-sha1: b5e44dfcc2cda241e66aa6a145fad585df2be139 Content-length: 74 SVN���������o "�7��*E(wParam == 0xDF || wParam == 0xDC) Revision-number: 8183 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2008-09-16T12:48:38.547609Z K 7 svn:log V 146 Tim Kosse points out that xfer_upload_gotpkt can return a negative value on error, so the check at the call site shouldn't test for exactly zero. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f624383f79b9c476e07e2d45572b3447 Text-delta-base-sha1: e3f077ae8f5b923c5f369958163d3bbe88824144 Text-content-length: 42 Text-content-md5: 05ba8c62cef9a3c42a2c16012889b4bd Text-content-sha1: 5daf35dcdf3798abecdb97f9b2bcd859e3617fd1 Content-length: 42 SVN��Vb ���6 ret <= 0 && !err Revision-number: 8184 Prop-content-length: 413 Content-length: 413 K 7 svn:log V 312 64-bit cleanliness in int64.c. This is all hideous; really I ought to be trying harder to find a 32-bit type rather than making a uint64 structure out of two potentially 64-bit unsigned longs. And really I ought to be using the C99 64-bit integers anyway if they're available. But this should do for the moment. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-09-16T18:21:33.869357Z PROPS-END Node-path: putty/int64.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a5772f18596272135ace2b2259169d68 Text-delta-base-sha1: 235c66d1bb149db373419c9cf401e3675894216d Text-content-length: 1484 Text-content-md5: 761be6cfb9f6ecc0a86a1feac6eef728 Text-content-sha1: 3c46ef32478ff0d6b62add5872a4735c64093290 Content-length: 1484 SVN��P50�2��C1�_0�km�`3�*�16unsigned429496729; rem += r2 * 6(hi + (lo >> 32)) & 0xFFFFFFFFU; y.lo = lo & 0xFFFFFFFFU; return y; } uint64 uint64_add(uint64 x, uint64 y) { x.lo = (x.lo + y.lo) & 0xFFFFFFFFU= (x.lo - y.lo) & 0xFFFFFFFFU; x.hi = (x.hi - y.hi - (x.lo > (y.lo ^ 0xFFFFFFFFU) ? 1 : 0)) & 0xFFFFFFFFU & 0xFFFFFFFFU= (x.hi << shift) & 0xFFFFFFFFU; x.hi |= (x.lo >> (32-shift)); x.lo = (x.lo << shift) & 0xFFFFFFFFU; } else { x.hi = (x.lo << (shift-32)) & 0xFFFFFFFFU #ifdef TESTMODE #include <stdio.h> int main(void) { uint64 x, y, z; char buf[80]; x = uint64_make(0x3456789AUL, 0xDEF01234UL); printf("%08lx.%08lx\n", x.hi, x.lo); uint64_decimal(x, buf); printf("%s\n", buf); y = uint64_add32(x, 0xFFFFFFFFU); printf("%08lx.%08lx\n", y.hi, y.lo); uint64_decimal(y, buf); printf("%s\n", buf); z = uint64_subtract(y, x); printf("%08lx.%08lx\n", z.hi, z.lo); uint64_decimal(z, buf); printf("%s\n", buf); z = uint64_subtract(x, y); printf("%08lx.%08lx\n", z.hi, z.lo); uint64_decimal(z, buf); printf("%s\n", buf); y = uint64_shift_right(x, 4); printf("%08lx.%08lx\n", y.hi, y.lo); y = uint64_shift_right(x, 36); printf("%08lx.%08lx\n", y.hi, y.lo); y = uint64_shift_left(x, 4); printf("%08lx.%08lx\n", x.hi, x.lo); y = uint64_shift_left(x, 36); printf("%08lx.%08lx\n", x.hi, x.lo); return 0; } #endif Revision-number: 8185 Prop-content-length: 311 Content-length: 311 K 8 svn:date V 27 2008-09-16T22:56:08.072276Z K 7 svn:log V 210 Further correction: on reflection, after examining all the call sites for uint64_make(), we _shouldn't_ attempt to preserve high bits in the low-order argument; it turns out not to be what the call sites want. K 10 svn:author V 5 simon PROPS-END Node-path: putty/int64.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 761be6cfb9f6ecc0a86a1feac6eef728 Text-delta-base-sha1: 3c46ef32478ff0d6b62add5872a4735c64093290 Text-content-length: 23 Text-content-md5: 0f20a23c863a24ee231694dac810db58 Text-content-sha1: 8eaca43e91739cc102f5d879141c34f5a346db37 Content-length: 23 SVN��5& �x��, hi Revision-number: 8186 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-18T00:51:46.399675Z PROPS-END Revision-number: 8187 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-18T00:51:46.496283Z PROPS-END Revision-number: 8188 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2008-09-18T12:13:57.561473Z K 7 svn:log V 51 Summary: Better handling of literal IPv6 addresses K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ipv6-literals Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 693 Text-content-md5: 15c65b2b071d015d60c8c4d52ca1deb8 Text-content-sha1: db3e24b7808a4da2b43346f179d4e2c2bbdcbb16 Content-length: 703 PROPS-END SVN���'''Summary: Better handling of literal IPv6 addresses Class: bug Difficulty: fun Priority: medium Present-in: 0.60 Content-type: text/x-html-body <p> While PuTTY has had IPv6 support since 0.58, its handling of IPv6 literal addresses (e.g., <tt>::1</tt>) still leaves something to be desired. In particular, there are various places where hostnames form part of a colon-delimited syntax (e.g., port-forwarding configuration); this interacts badly with IPv6 addresses containing colons. <p> PuTTY should consistently accept IPv6 literals in the square-bracket notation defined for URLs (in <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC3986</a>) wherever it accepts a hostname. Revision-number: 8189 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-18T23:34:25.206049Z PROPS-END Revision-number: 8190 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-18T23:34:25.209466Z PROPS-END Revision-number: 8191 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-18T23:34:25.309703Z PROPS-END Revision-number: 8192 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-19T23:34:14.985845Z PROPS-END Revision-number: 8193 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2008-09-21T20:39:21.862794Z K 7 svn:log V 69 Document that PSFTP's "open" command allows an optional port number. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30a5e12b48e62348986be420052bb708 Text-delta-base-sha1: 3d076b3472e76c0d53798d15dead7599b68577e5 Text-content-length: 92 Text-content-md5: 1e738dd5dcde30dc301626af5c6fe8d4 Text-content-sha1: d9eb1a1c83b7db1b8134e3bf6a3e12988f34b51a Content-length: 92 SVN��X D�g�D�tdYou can optionally specify a port as well: \c{open user@host.name 22 Revision-number: 8194 Prop-content-length: 234 Content-length: 234 K 8 svn:date V 27 2008-09-25T19:00:42.987690Z K 7 svn:log V 133 The "server refused our key" bit didn't link to the public-key auth chapter, which has some hints on server-side setup. Now it does. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd2670da971b1366d268e6d0dddabfbe Text-delta-base-sha1: bc73e65558da3467b84bd903d63b6608d818b28f Text-content-length: 86 Text-content-md5: b0b11872b20d33e3e274a401244ec13e Text-content-sha1: bddbdce0fbb3003bc8aa5125141c9525a9297ce1 Content-length: 86 SVN��3| @�2�@� )K{pubkey-gettingready} has some hints on server-side public key Revision-number: 8195 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 43 Rationalise duplication between these two. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-09-28T18:02:56.638185Z PROPS-END Node-path: putty-wishlist/data/hostkey-policy Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a93d13bda3409e1c84d7bdfbf053ed62 Text-delta-base-sha1: df58e0683cf7e99b819bb149fc3e847074daedf8 Text-content-length: 15 Text-content-md5: 1da9fc171a48e594d1395f5e93ca81dc Text-content-sha1: 9c67a72a62dab0353f9f1c1711f608686d0ecf7a Content-length: 15 SVN��7*��*� Node-path: putty-wishlist/data/hostkey-rekey Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc3cae9a8cf7edb1595aeb07cd8e2548 Text-delta-base-sha1: 4707862d07ee12b276e04fed0978a7aa5b48d8c4 Text-content-length: 712 Text-content-md5: 627a2debd3efe865e311fa396e49f368 Text-content-sha1: 7aa8a21c47644c1e51e0baa526488c67ff7f5f69 Content-length: 712 SVN��zH5��5x-html-body <p> There's currently undesirable behaviour if you answer "accept once" for a host key at startup and then leave the connection open for long enough to trigger a rekey: since the host key has only been accepted once, the confirmation message is put up again, which is pretty nasty (especially in the command-line tools). Certainly at the very least we should treat "accept once" on a host key to mean accept for the whole of a <em>session</em> rather than for a single KEX; additionally, we probably ought to think about some sort of sensible behaviour if a different host key to that we originally accepted is used at rekey time, or if the key in the client's cache has changed. Revision-number: 8196 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-09-29T23:36:14.759767Z PROPS-END Revision-number: 8197 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-02T23:34:27.258319Z PROPS-END Revision-number: 8198 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-03T23:37:21.106330Z PROPS-END Revision-number: 8199 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-04T23:34:18.458276Z PROPS-END Revision-number: 8200 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-05T23:34:34.837426Z PROPS-END Revision-number: 8201 Prop-content-length: 525 Content-length: 525 K 8 svn:date V 27 2008-10-07T17:48:59.358250Z K 7 svn:log V 424 sshrsa.c now obeys the RFC793 Robustness Principle when it comes to the ordering of the primes in a fully specified RSA private key: when the key format typically has p > q, it will always output p > q but be willing to tolerate p < q on input. (Inspired by seeing an OpenSSH-format key file in the wild which had p < q, which I've never seen before; I suspect a third-party application incautiously generating the format.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 34b6c0a08ed78c362887fd42ca6a5d85 Text-delta-base-sha1: 1287e18db02c40ebed06e3ad722657f7b582aef8 Text-content-length: 539 Text-content-md5: 38e03507c1aea55469d6de5fa81f4650 Text-content-sha1: 03b6db3897abc500a5576a5910b69a928bcc97c4 Content-length: 539 SVN��h=z���!�5Y�35 * I have seen key blobs in the wild which were generated with * p < q, so instead of rejecting the key in this case we * should instead flip them round into the canonical order of * p > q. This also involves regenerating iqmp. */ if (bignum_cmp(key->p, key->q) <= 0) { Bignum tmp = key->p; key->p = key->q; key->q = tmp; freebn(key->iqmp); key->iqmp = modinv(key->q, key->p); }p) freebn(key->p); if (key->q) freebn(key->q); if (key->iqmp) freebn(key->iqmp Revision-number: 8202 Prop-content-length: 196 Content-length: 196 K 7 svn:log V 96 Ahem. Make sure I NULL out any unused pointer field that I later plan to free if it isn't NULL. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-10-08T18:09:56.376144Z PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 38e03507c1aea55469d6de5fa81f4650 Text-delta-base-sha1: 03b6db3897abc500a5576a5910b69a928bcc97c4 Text-content-length: 45 Text-content-md5: 6e6b9555c6b05a3abd39e2370067801c Text-content-sha1: 07f37310b75b1e98270f09108f9ee395dc513b2c Content-length: 45 SVN��=e �b��mPp = rsa->q = rsa->iqmp Revision-number: 8203 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 This just got fixed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-10-09T18:59:50.539925Z PROPS-END Node-path: putty-wishlist/data/rsa-import-primeorder Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d3ed2dd3bf68d70b0419c3a1393762a6 Text-delta-base-sha1: 8625c229bb9dc3287894da5ed51a3a205f406c6c Text-content-length: 268 Text-content-md5: 270b4bd2144968ce2b5a83f0c38733ab Text-content-sha1: 9c29f44f2ece31eb372e6b1232595f07b5e25e2a Content-length: 268 SVN��A.o����U�;Fixed-in: r8202 2008-10-09; there is a <a href="http://groups.google.com/groups?as_umsgid=8fc94842-c68d-4d4a-a827-4480c475ac2d%408g2000hse.googlegroups.com">report</a> that VanDyke SecureCRT generates them in a random order, for instance. Revision-number: 8204 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2008-10-12T11:32:23.654366Z K 7 svn:log V 87 Fix inability to save session on Unix when ~/.putty doesn't exist introduced in r7934. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b3a87b9b0973332b62d6cecd4f1ed8a Text-delta-base-sha1: 39ecf9a62c6a197a37ac80a5b72622915e66dd8e Text-content-length: 47 Text-content-md5: 1da04f01717a3ab3c6a7113558985f9f Text-content-sha1: 55c517720b3c540d0030a4bde637d64859b00198 Content-length: 47 SVN��8< ���mkdir(filename, 0700) != 0 Revision-number: 8205 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-13T23:35:19.113841Z PROPS-END Revision-number: 8206 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-13T23:35:19.234939Z PROPS-END Revision-number: 8207 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-13T23:35:19.238351Z PROPS-END Revision-number: 8208 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2008-10-13T22:16:25.530367Z K 7 svn:log V 34 Erroneously invisible index term. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6015a4f9c0b6877d0bb16ae5364203f0 Text-delta-base-sha1: ec05f9ed10e9037489cf352e4440ab04bcfcc873 Text-content-length: 43 Text-content-md5: 3dfc147cc07d256be371edbcbb9e2ceb Text-content-sha1: 9d4d30a5181d812be05740c45927d7bc0cfb2cae Content-length: 43 SVN���� �y��zi�UU��U� Revision-number: 8209 Prop-content-length: 422 Content-length: 422 K 7 svn:log V 321 Rejig the Translation panel controls and documentation to remove the emphasis on received data. Experiment and suggestion suggest that the character set configuration applies equally to keystrokes sent to the server, or at least that that's close enough to being true that we should document it as a first approximation. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-10-13T22:34:57.816902Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 57e839aedc8481d64d8a23fc5439190c Text-delta-base-sha1: 2785582a1d51226d1d6492abec47b8b972849419 Text-content-length: 58 Text-content-md5: d8082be38c5618d749b0e9a2948ef266 Text-content-sha1: f8b8721aa7cc56d93258c74ac104c5489b22d0e5 Content-length: 58 SVN��. ���Kc"); ctrl_combobox(s, "Remote Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3dfc147cc07d256be371edbcbb9e2ceb Text-delta-base-sha1: 9d4d30a5181d812be05740c45927d7bc0cfb2cae Text-content-length: 984 Text-content-md5: eb6309573b8211708d4be5eab00fb348 Text-content-sha1: 95a8b4d27d79fac5e829ce22103d6e622f72ce8e Content-length: 984 SVN������ �-L �^ Similarly, PuTTY needs to know how to translate your keystrokes into the encoding the server expects. Unfortunately, there is no satisfactory mechanism for PuTTY and the server to communicate this information, so it must usually be manually configured. There are a lot of character sets to choose from. The \q{Remote character set} option lets you select one. By default PuTTY will attempt to choose a character set that is right for your \i{locale} as reported by Windows; if it gets it wrong, you can select a different , and keystrokes are sent UTF-8 encoded. If you select \q{UTF-8} as a character set you can use this mode. Not all server-side applications �U[�U�\b \cq{1G} specifies 1 gigabyte (1024 megabytes). } Disabling data-based rekeys entirely is a bad idea. The \i{integrity}, and to a lesser extent, \i{confidentiality} of the SSH-2 protocol depend in part on rekeys occuring before a 32-bit packet sequence numb Revision-number: 8210 Prop-content-length: 256 Content-length: 256 K 8 svn:date V 27 2008-10-17T20:55:08.061583Z K 7 svn:log V 155 Patch from Iain Patterson: fix crash on Windows when GSSAPI auth is attempted but fails for some reason (such as not having a tgt for the server's realm). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e3cfeea3de349c487ee7e9dad45deb1 Text-delta-base-sha1: fc20960cb4e7e5b57301b19115d559df152ca0db Text-content-length: 65 Text-content-md5: 1d7a88050110eb4cce62ecdde9a63b34 Text-content-sha1: 47134a2d836734fabb063b62b7f93bd3f9174884 Content-length: 65 SVN��7 ,�Z��1W memset(winctx, 0, sizeof(winSsh_gss_ctx) Revision-number: 8211 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2008-10-17T21:04:26.810221Z K 7 svn:log V 74 We've got this. Perhaps if we say so we can get more pre-release testing. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 20cdd84f89332fecd2227385cebbd5a7 Text-delta-base-sha1: fef48fa83dbc1ccf2f2c6fad8f5daa4d7c3dd7d5 Text-content-length: 45 Text-content-md5: 058410770b808b5b1c3f8e1710d6376b Text-content-sha1: 47bf3e9faea55bdc0cd18138cc1ad46b9fbdf6b4 Content-length: 45 SVN��h�b��aFixed-in: r8138 2008-08-10 Revision-number: 8212 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-18T23:34:21.008830Z PROPS-END Revision-number: 8213 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-18T23:34:21.072434Z PROPS-END Revision-number: 8214 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-19T23:34:38.767853Z PROPS-END Revision-number: 8215 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-19T23:34:38.889858Z PROPS-END Revision-number: 8216 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-19T23:34:38.893651Z PROPS-END Revision-number: 8217 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-19T23:34:38.897172Z PROPS-END Revision-number: 8218 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-19T23:34:38.900834Z PROPS-END Revision-number: 8219 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-19T23:34:38.904763Z PROPS-END Revision-number: 8220 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2008-10-19T13:41:33.643496Z K 7 svn:log V 40 Note that we have Kerberos support now. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 337803cc1c71544232ed11e9ea2566a9 Text-delta-base-sha1: 1a57cf27ccd9d42984917393f4be5cd4cf3843d5 Text-content-length: 202 Text-content-md5: f85ef1209758e808b7e4bba6dfc9662c Text-content-sha1: 1aef5f9056c05857981c8bf60886d1dd78030de8 Content-length: 202 SVN���2 0� �0�w !-- XXX-REVIEW-BEFORE-RELEASE --> (note that our post-0.60 development snapshots contain native Kerberos support for Windows and Unix, and this is planned for the next release) Revision-number: 8221 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-30T00:34:30.240586Z PROPS-END Revision-number: 8222 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-30T00:34:30.370943Z PROPS-END Revision-number: 8223 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-30T00:34:30.374736Z PROPS-END Revision-number: 8224 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-30T00:34:30.378368Z PROPS-END Revision-number: 8225 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-30T00:34:30.381694Z PROPS-END Revision-number: 8226 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-30T00:34:30.385444Z PROPS-END Revision-number: 8227 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-31T00:34:41.873982Z PROPS-END Revision-number: 8228 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-31T00:34:41.921113Z PROPS-END Revision-number: 8229 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-31T00:34:41.924504Z PROPS-END Revision-number: 8230 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-10-31T00:34:42.054374Z PROPS-END Revision-number: 8231 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-01T00:35:03.628807Z PROPS-END Revision-number: 8232 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-01T00:35:03.865675Z PROPS-END Revision-number: 8233 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-01T00:35:03.895819Z PROPS-END Revision-number: 8234 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.068342Z PROPS-END Revision-number: 8235 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.277583Z PROPS-END Revision-number: 8236 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.306314Z PROPS-END Revision-number: 8237 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.361750Z PROPS-END Revision-number: 8238 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.396965Z PROPS-END Revision-number: 8239 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.410408Z PROPS-END Revision-number: 8240 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.426459Z PROPS-END Revision-number: 8241 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.478956Z PROPS-END Revision-number: 8242 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.534038Z PROPS-END Revision-number: 8243 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.599222Z PROPS-END Revision-number: 8244 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.693879Z PROPS-END Revision-number: 8245 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.768813Z PROPS-END Revision-number: 8246 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.952433Z PROPS-END Revision-number: 8247 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:32.997642Z PROPS-END Revision-number: 8248 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:33.757758Z PROPS-END Revision-number: 8249 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-02T00:35:34.593680Z PROPS-END Revision-number: 8250 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:36.525547Z PROPS-END Revision-number: 8251 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:36.731640Z PROPS-END Revision-number: 8252 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:36.735518Z PROPS-END Revision-number: 8253 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:36.738866Z PROPS-END Revision-number: 8254 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:36.853041Z PROPS-END Revision-number: 8255 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:36.856423Z PROPS-END Revision-number: 8256 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:36.897116Z PROPS-END Revision-number: 8257 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:36.926637Z PROPS-END Revision-number: 8258 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:37.011223Z PROPS-END Revision-number: 8259 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:37.014987Z PROPS-END Revision-number: 8260 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:38.380469Z PROPS-END Revision-number: 8261 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:38.854299Z PROPS-END Revision-number: 8262 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:38.857586Z PROPS-END Revision-number: 8263 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:38.932016Z PROPS-END Revision-number: 8264 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-03T00:34:38.962918Z PROPS-END Revision-number: 8265 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-04T00:34:45.589941Z PROPS-END Revision-number: 8266 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-04T00:34:45.775324Z PROPS-END Revision-number: 8267 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-04T00:34:45.778907Z PROPS-END Revision-number: 8268 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-04T00:34:45.866293Z PROPS-END Revision-number: 8269 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-04T00:34:45.912092Z PROPS-END Revision-number: 8270 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-04T00:34:45.915782Z PROPS-END Revision-number: 8271 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-04T00:34:45.994795Z PROPS-END Revision-number: 8272 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-04T00:34:45.998714Z PROPS-END Revision-number: 8273 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-04T00:34:46.073893Z PROPS-END Revision-number: 8274 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-05T00:34:55.876886Z PROPS-END Revision-number: 8275 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2008-11-04T18:33:03.255890Z K 7 svn:log V 53 Add some useful information about .Xauthority files. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/x11-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3eff5e671cd145bac9c3bbc2a2031f81 Text-delta-base-sha1: d0dd961cafacbe5863d5bea6fbf61acbb3a991d4 Text-content-length: 1735 Text-content-md5: 25991e54fb9daa2579bcc82b5b133005 Text-content-sha1: d366d4e2dfdeff3366636f2532934a52e862729f Content-length: 1735 SVN��^4�^�4 <p> <b>SGT, 2008-11-04</b>: I've just found <a href="https://lliurex.net/projects/valencia/lliurex-pool-ng/browser/ubuntu-mods/trunk/sabayon/lib/protosession.py?rev=5208&format=txt">this piece of source code</a> which contains a comment describing the format of the <code>.Xauthority</code> file. So as not to lose it, I'll reproduce the format here. The <code>.Xauthority</code> file is an end-to-end concatenation of records consisting of a 2-byte big-endian number followed by four strings. Each string consists of a 2-byte big-endian number giving the length, followed by that many bytes. The strings are, respectively: network address, display number, authorisation method (e.g. "<code>MIT-MAGIC-COOKIE-1</code>") and the authorisation data itself. The initial bare number specifies the address family, i.e. how to interpret the address string. Just to prove it works, the following hacky piece of Perl successfully untangles the first <code>.Xauthority</code> file I could lay my hands on: <pre><code>perl -e 'while (1) { read STDIN,$fam,2 or last; $fam = unpack "n", $fam; @strings = (); for $i (0..3) { read STDIN, $len, 2; $len = unpack "n", $len; $str=""; read STDIN, $str, $len; if ($i==1 or $i==2 or ($i==0 and $fam==256)) { $str = "\"" . $str . "\"" } else { $str = join "", "<", (map{sprintf"%02x",$_}unpack"C*",$str), ">"; } push @strings, $str; } printf "%s\n", join " ", $fam, @strings }' < ~/.Xauthority</code></pre> and the output of this also suggests that family code 0 means the address string is a binary-encoded IPv4 address, code 6 means a binary-encoded IPv6 address, and code 256 means the address string is a hostname and the access method is a Unix-domain socket on that host. Revision-number: 8276 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-05T00:34:56.395913Z PROPS-END Revision-number: 8277 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-05T00:34:56.399425Z PROPS-END Revision-number: 8278 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-05T00:34:56.454517Z PROPS-END Revision-number: 8279 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-06T00:34:55.058764Z PROPS-END Revision-number: 8280 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-06T00:34:55.321655Z PROPS-END Revision-number: 8281 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-06T00:34:55.325405Z PROPS-END Revision-number: 8282 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-06T00:34:55.328751Z PROPS-END Revision-number: 8283 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-06T00:34:55.332335Z PROPS-END Revision-number: 8284 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-06T00:34:55.335668Z PROPS-END Revision-number: 8285 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-07T00:35:52.134004Z PROPS-END Revision-number: 8286 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-07T00:35:52.280409Z PROPS-END Revision-number: 8287 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-08T00:34:35.992557Z PROPS-END Revision-number: 8288 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-08T00:34:36.102662Z PROPS-END Revision-number: 8289 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-08T00:34:36.168998Z PROPS-END Revision-number: 8290 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-09T00:34:40.634718Z PROPS-END Revision-number: 8291 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-09T00:34:40.691637Z PROPS-END Revision-number: 8292 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-09T00:34:40.695392Z PROPS-END Revision-number: 8293 Prop-content-length: 869 Content-length: 869 K 8 svn:date V 27 2008-11-08T16:45:45.176983Z K 7 svn:log V 768 Move out of the SockAddr structure the mutable fields "ai" and "curraddr", and turn "family" into a macro-derived property of the other fields. The idea is that this renders SockAddrs immutable once created, which should open up the possibility of duplicating and reusing one without having to redo the actual DNS lookup. I _hope_ I haven't broken anything. The new code architecture contains several rather dubious-looking operations (namely the arbitrary choice of the first returned address in functions like sk_getaddr and sk_address_is_local - what if, for instance, a DNS lookup returned a local and a non-local address?), but I think they were functionally just as dubious beforehand and all this change has done is to make them more obviously so to a reader. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 951e2c80f7e338bc09b4bfba277cbc82 Text-delta-base-sha1: 31ccb924ea2c3c64d1de1f97a098da0af473c778 Text-content-length: 3834 Text-content-md5: a847541b46b8d6c7fa9bdaed3a416283 Text-content-sha1: cbc5cfbf447abbcd1b220b195db533620258883c Content-length: 3834 SVN�� J!�.�H�++�APh�S�W+8�#[� �P7� �5�pfR�9�x_�j��W�r'�Vkh�|h�S)�7|b�`w�od�_�vp�rM�[�c�c�?f�w%�(/o/* * Mutable state that goes with a SockAddr: stores information * about where in the list of candidate IP(v*) addresses we've * currently got to. */ typedef struct SockAddrStep_tag SockAddrStep; struct SockAddrStep_tag { #ifndef NO_IPV6 struct addrinfo *ai; /* steps along addr->ais */ #endif int curraddr; }SockAddrStep stepenum { UNRESOLVED, UNIX, IP } superfamily; #ifndef NO_IPV6 struct addrinfo *ais; /* Addresses IPv6 style. */ #else unsigned long *addresses; /* Addresses IPv4 style. */ int naddresses; #endif char hostname[512]; /* Store an unresolved host name. */ }; /* * Which address family this address belongs to. AF_INET for IPv4; * AF_INET6 for IPv6; AF_UNSPEC indicates that name resolution has * not been done and a simple host name is held in this SockAddr * structure. */ #ifndef NO_IPV6 #define SOCKADDR_FAMILY(addr, step) \ ((addr)->superfamily == UNRESOLVED ? AF_UNSPEC : \ (addr)->superfamily == UNIX ? AF_UNIX : \ (step).ai ? (step).ai->ai_family : AF_INET) #else #define SOCKADDR_FAMILY(addr, step) \ ((addr)->superfamily == UNRESOLVED ? AF_UNSPEC : \ (addr)->superfamily == UNIX ? AF_UNIX : AF_INET) #endif /* * Start a SockAddrStep structure to step through multiple * addresses. */ #ifndef NO_IPV6 #define START_STEP(addr, step) \ ((step).ai = (addr)->ais, (step).curraddr = 0) #else #define START_STEP(addr, step) \ ((step).curraddr = 0) #endifsuperfamily = UNRESOLVED;if (err != 0) { ret->error = gai_strerror(err); return ret; } ret->superfamily = IP; *realhost = '\0'; if (ret->ais->ai_canonname != NULL) strncat(realhost, ret->aissuperfamily == UNRESOLVEDsuperfamily = IP; } if (ret->superfamily == UNRESOLVEDsuperfamily = IPsuperfamily = UNRESOLVED, SockAddrStep *step) { #ifndef NO_IPV6 if (step->ai && step->ai->ai_next) { step->ai = step->ai->ai_next; return TRUE; } else return FALSE; #else if (step->curraddr+1 < addr->naddresses) { stepsuperfamily == UNRESOLVEDs->ai_addr, addr->aisSockAddrStep step; START_STEP(addr, step); assert(SOCKADDR_FAMILY(addr, step) == AF_INET); a.s_addr = htonl(addr->addresses[0superfamily == UNRESOLVEDs->ai_addr); #else struct in_addr a; SockAddrStep step; START_STEP(addr, step); assert(SOCKADDR_FAMILY(addr, step) == AF_INET); a.s_addr = htonl(addr->addresses[0SockAddrStep step; int family; START_STEP(addr, step); family = SOCKADDR_FAMILY(addr, step); return (family == AF_INET ? ADDRTYPE_IPV4 : #ifndef NO_IPV6 family == AF_INET6 ? ADDRTYPE_IPV6 : #endif ADDRTYPE_NAME); } void sk_addrcopy(SockAddr addr, char *buf) { SockAddrStep step; int family; START_STEP(addr, step); family = SOCKADDR_FAMILY(addr, step); #ifndef NO_IPV6 if (family == AF_INET) memcpy(buf, &((struct sockaddr_in *)step.ai->ai_addr)->sin_addr, sizeof(struct in_addr)); else if (family == AF_INET6) memcpy(buf, &((struct sockaddr_in6 *)step.family == AF_INET); a.s_addr = htonl(addr->addresses[step., familyfamily = SOCKADDR_FAMILY(sock->addr, sock->step); assert(family != AF_UNSPEC); s = socket( (step.ai->ai_addr)->sin_port = htons(sock->port); sa = (const struct sockaddr *)sock->step.ai->ai_addr; salen = sock->step.ai->ai_addrlen; break; case AF_INET6: ((struct sockaddr_in *)sock->step.ai->ai_addr)->sin_port = htons(sock->port); sa = (const struct sockaddr *)sock->step.ai->ai_addr; salen = sock->step.step.START_STEP(ret->addr, ret->step), &ret->step, &s->stepsuperfamily = s = NULL; #else ret->addresses = NULL; Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8f59707ebc5d732a3b2f4b88256e51c5 Text-delta-base-sha1: a8f8735309d9082c57e30c9c5f8b84551be817ac Text-content-length: 4222 Text-content-md5: 5196aafd5081a545aeda362c76701a07 Text-content-sha1: b910a9f2869422065915bfd0784bbd0100ed63b4 Content-length: 4222 SVN��d/o��c�H�`� ]G�K�h�ez`�jc�uR�!}Q�@xS�)�L<m�%r�X,�FI�g@g�y#'�p$�ls�l�w$/�uhw�l{�s~�J j�rX�'P�P}^�v-� )�v8�4�F�SE�L/* * Mutable state that goes with a SockAddr: stores information * about where in the list of candidate IP(v*) addresses we've * currently got to. */ typedef struct SockAddrStep_tag SockAddrStep; struct SockAddrStep_tag { #ifndef NO_IPV6 struct addrinfo *ai; /* steps along addr->ais */ #endif int curraddr; }SockAddrStep stepint resolved; #ifndef NO_IPV6 struct addrinfo *ais; /* Addresses IPv6 style. */ #endif unsigned long *addresses; /* Addresses IPv4 style. */ int naddresses; char hostname[512]; /* Store an unresolved host name. */ }; /* * Which address family this address belongs to. AF_INET for IPv4; * AF_INET6 for IPv6; AF_UNSPEC indicates that name resolution has * not been done and a simple host name is held in this SockAddr * structure. */ #ifndef NO_IPV6 #define SOCKADDR_FAMILY(addr, step) \ (!(addr)->resolved ? AF_UNSPEC : \ (step).ai ? (step).ai->ai_family : AF_INET) #else #define SOCKADDR_FAMILY(addr, step) \ (!(addr)->resolved ? AF_UNSPEC : AF_INET) #endif /* * Start a SockAddrStep structure to step through multiple * addresses. */ #ifndef NO_IPV6 #define START_STEP(addr, step) \ ((step).ai = (addr)->ais, (step).curraddr = 0) #else #define START_STEP(addr, step) \ ((step).curraddr = 0) #endifhint_family; int err; /* Default to IPv4. */ hint_#ifndef NO_IPV6 ret->ais = NULL; #endif ret->addresses = NULL; ret->resolved = FALSEhint_->resolved = TRUE->resolved = TRUE; else err = p_WSAGetLastError(); } if (!ret->resolved #ifndef NO_IPV6 /* If we got an address info use that... */ if (ret->aisais->ai_s-> ai_addr)->sin_addr, sizeof(a)); if (ret->ais->ai_canonname) strncpy(realhost, ret->aisaddresses[0] = p_ntohl(a); ret->resolved = TRUEresolved = FALSE; #ifndef NO_IPV6 , SockAddrStep *step) { #ifndef NO_IPV6 if (step->ai) { if (step->ai->ai_next) { step->ai = step->ai->ai_next; return TRUE; } else return FALSE; } #endif if (step->curraddr+1 < addr->naddresses) { step SockAddrStep step; START_STEP(addr, step); #ifndef NO_IPV6 if (step.ai) { if (p_WSAAddressToStringA) { p_WSAAddressToStringA(step.ai->ai_addr, step.SOCKADDR_FAMILY(addr, step) == AF_INET) { struct in_addr a; assert(addr->addresses && step.curraddr < addr->naddresses); a.s_addr = p_htonl(addr->addresses[step. SockAddrStep step; int family; START_STEP(addr, step); family = SOCKADDR_FAMILY(addr, step); #ifndef NO_IPV6 if (family == AF_INET6) { return IN6_IS_ADDR_LOOPBACK((const struct in6_addr *)step.ai->ai_addr); } else #endif if (family == AF_INET) { #ifndef NO_IPV6 if (step.ai) { return ipv4_is_local_addr(((struct sockaddr_in *)step.step.curraddr < addr->naddresses); a.s_addr = p_htonl(addr->addresses[step.curraddr]); return ipv4_is_local_addr(a); } } else { assert(SockAddrStep step; int family; START_STEP(addr, step); family = SOCKADDR_FAMILY(addr, step); return (family == AF_INET ? ADDRTYPE_IPV4 : #ifndef NO_IPV6 SockAddrStep step; int family; START_STEP(addr, step); family = SOCKADDR_FAMILY(addr, step); assert(family != AF_UNSPEC); #ifndef NO_IPV6 if (step.ai) { if (family == AF_INET) memcpy(buf, &((struct sockaddr_in *)step.ai->ai_addr)->sin_addr, sizeof(struct in_addr)); else if (family == AF_INET6) memcpy(buf, &((struct sockaddr_in6 *)step.family == AF_INET) { struct in_addr a; assert(addr->addresses && step.curraddr < addr->naddresses); a.s_addr = p_htonl(addr->addresses[step. family = SOCKADDR_FAMILY(sock->addr, sock->step);family == AF_INET6 ? (struct sockaddr *) &a6 : (struct sockaddr *) &a), (family == step.step.step.ai->ai_addr)->sin6_flowinfo; a6.sin6_scope_id = ((struct sockaddr_in6 *) sock->step.step.step.step.START_STEP(ret->addr, ret->step), &ret->step, &s->step Revision-number: 8294 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2008-11-08T16:58:55.313142Z K 7 svn:log V 25 Implement sk_addr_dup(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ed054d02c76d6071b8635f098af94f5a Text-delta-base-sha1: 76afa82c328385144a14a99c3cb29494034139f6 Text-content-length: 345 Text-content-md5: ee9755d910f5634e52cbc68b65413115 Text-content-sha1: f9eeac9428071250b1d7d0088f1c2d16ad15bd75 Content-length: 345 SVN��'y A�]�A�[L/* sk_addr_dup generates another SockAddr which contains the same data * as the original one and can be freed independently. May not actually * physically _duplicate_ it: incrementing a reference count so that * one more free is required before it disappears is an acceptable * implementation. */ SockAddr sk_addr_dup Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a847541b46b8d6c7fa9bdaed3a416283 Text-delta-base-sha1: cbc5cfbf447abbcd1b220b195db533620258883c Text-content-length: 232 Text-content-md5: 42c7cea144bb4ced27ba87e7015f0811 Text-content-sha1: e2b5c24e3715f47c93889085ee7232bfd5e68d4c Content-length: 232 SVN�� Z)1�\��ZW�</�c�dK� bzint refcount; ret->refcount = 1->refcount = 1; if (--addr->refcount > 0) return;SockAddr sk_addr_dup(SockAddr addr) { addr->refcount++; return addr->refcount = 1; Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5196aafd5081a545aeda362c76701a07 Text-delta-base-sha1: b910a9f2869422065915bfd0784bbd0100ed63b4 Text-content-length: 248 Text-content-md5: 827638ad72f23c7611056d95c64f3f52 Text-content-sha1: 33fdae301a070f1bad374f7441361da79ced6530 Content-length: 248 SVN��/}(B�9�� 4�7;�l�mK�int refcount;ret->refcount = 1ret->refcount = 1 if (--addr->refcount > 0) return;SockAddr sk_addr_dup(SockAddr addr) { addr->refcount++; return addr->refcount = 1; return ret; } Revision-number: 8295 Prop-content-length: 639 Content-length: 639 K 8 svn:date V 27 2008-11-11T07:47:27.474906Z K 7 svn:log V 538 In SSH packet logging mode, log SSH-2 packet sequence numbers, in both directions. We had a bug report yesterday about a Cisco router sending SSH2_MSG_UNIMPLEMENTED and it wasn't clear for which packet; logging the sequence numbers should make such problems much easier to diagnose. (In fact this logging fix wouldn't have helped in yesterday's case, because the router also didn't bother to fill in the sequence number field in the SSH2_MSG_UNIMPLEMENTED packet! This is a precautionary measure against the next one of these problems.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 74b0eee30aca665bf638eb713f430353 Text-delta-base-sha1: 425dfa2175d9c697d61894f26bd687b5638d748d Text-content-length: 505 Text-content-md5: a4d85ae3e82dacf1d662ec5f79afdd9c Text-content-sha1: 547b0e3262c450e0e9407a9eb8452af90104af4f Content-length: 505 SVN��YQ��h�@@�"!d�sz�lconst void *data, int len, int n_blanks, const struct logblank_t *blanks, const unsigned long *seq) { if (seq) { logprintf(ctx, "%s packet #0x%lx, type %d / 0x%02x (%s)\r\n", direction == PKT_INCOMING ? "Incoming" : "Outgoing", *seq, type, type, texttype); } else { logprintf(ctx, "%s packet type %d / 0x%02x (%s)\r\n", direction == PKT_INCOMING ? "Incoming" : "Outgoing", type, type, texttype); } } else { } Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: de77c621d7189079ae9e7e9e62ee49fe Text-delta-base-sha1: 47bd317b5964158c3eb4c446939e06daf9d52d32 Text-content-length: 133 Text-content-md5: e16e1786af3c08b215edb6cd0be30d19 Text-content-sha1: 8c3c872c9db1d5f243c9213f0b51835d4c80c817 Content-length: 133 SVN�� 4 k�a�k�h%const void *data, int len, int n_blanks, const struct logblank_t *blanks, const unsigned long *sequence Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 70372bc657de8f5c5936443dc8bf59ff Text-delta-base-sha1: a5333211358c15244100369a87bb105dfafc6291 Text-content-length: 330 Text-content-md5: 45eeccc97c83a9666f79f822981a1cc2 Text-content-sha1: 3ae6d66f8191b9abae97fb41badd415ebc0b841a Content-length: 330 SVN����0K�?��!?�$`�d�Bj�!,�jG, NULL, &st->pktin->sequence, NULL 0, NULL, &ssh->v2_outgoing_sequence���OO�1�his key file (%s)", key_type_to_str(keytype)); msgbuf = dupprintf(�,{OO�,� struct Packet *pktout; ssh_pkt_getstring(pktin, &type, &typelen); w Revision-number: 8296 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-16T00:34:40.144517Z PROPS-END Revision-number: 8297 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-16T00:34:40.292125Z PROPS-END Revision-number: 8298 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-17T00:34:40.219956Z PROPS-END Revision-number: 8299 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-17T00:34:40.420074Z PROPS-END Revision-number: 8300 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-17T00:34:40.423887Z PROPS-END Revision-number: 8301 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-17T00:34:40.500579Z PROPS-END Revision-number: 8302 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-18T00:35:05.904977Z PROPS-END Revision-number: 8303 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-18T00:35:06.046432Z PROPS-END Revision-number: 8304 Prop-content-length: 369 Content-length: 369 K 7 svn:log V 268 Avoid freeing the backend in notify_remote_exit(), since that's called from within a backend function which will expect its own backend pointer to still be valid on return. Instead, move all the real functionality of notify_remote_exit() out into a GTK idle function. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-11-17T18:36:27.886902Z PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f69f4233b308f469b5649d257f22730 Text-delta-base-sha1: a9e6aacad9ea4165e294d164527255a522545191 Text-content-length: 498 Text-content-md5: 2dc7a1b395a027123fd46b7763b8159f Text-content-sha1: b2b43cee313f56fb0ac46ca47f37dffb97294e9f Content-length: 498 SVN����%*�z��Pl�J@�]#�h7B�}guint term_exitstatic gint idle_exit_func( gtk_idle_remove(inst->term_exit_idle_id); return TRUE inst->term_exit_idle_id = gtk_idle_add(idle_exit_func, inst);�&*�&�->specialsitem2 = menuitem; gtk_widget_hide(inst->specialsitem1); gtk_widget_hide(inst->specialsitem2); MKMENUITEM("Clear Scrollback", clear_scrollback_menuitem); MKMENUITEM("Reset Terminal", reset_terminal_menuitem); MKMENUITEM("Copy All", copy_all_menui Revision-number: 8305 Prop-content-length: 657 Content-length: 657 K 8 svn:date V 27 2008-11-17T18:38:09.200615Z K 7 svn:log V 556 Revamp of the local X11 connection code. We now parse X display strings more rigorously, and then we look up the local X authority data in .Xauthority _ourself_ rather than delegating to an external xauth program. This is (negligibly) more efficient on Unix, assuming I haven't got it wrong in some subtle way, but its major benefit is that we can now support X authority lookups on Windows as well provided the user points us at an appropriate X authority file in the standard format. A new Windows-specific config option has been added for this purpose. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b52c01e7e0afc0fadcdd6ce0eb83b3dc Text-delta-base-sha1: 6ba6ac34376507973fc3360b137d2518f1c44632 Text-content-length: 39 Text-content-md5: 946448259ee5c71f92d077d71df7a0bb Text-content-sha1: c84e6de77891911d9b72e677bbd495db909730b5 Content-length: 39 SVN��es �q��%p�Qwinx11winx11 Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eb6309573b8211708d4be5eab00fb348 Text-delta-base-sha1: 95a8b4d27d79fac5e829ce22103d6e622f72ce8e Text-content-length: 942 Text-content-md5: 789f50aa0ee361c4625cf0f2aa0dd059 Text-content-sha1: d911fe3ff8ecbebd80940f81b03c28e1688f545d Content-length: 942 SVN���������[b � ��?S{config-ssh-xauthority} X authority file for local display \cfg{winhelp-topic}{ssh.tunnels.xauthority} If you are using X11 forwarding, the local X server to which your forwarded connections are eventually directed may itself require authorisation. Some Windows X servers do not require this: they do authorisation by simpler means, such as accepting any connection from the local machine but not from anywhere else. However, if your X server does require authorisation, then PuTTY needs to know what authorisation is required. One way in which this data might be made available is for the X server to store it somewhere in a file which has the same format as the Unix \c{.Xauthority} file. If this is how your Windows X server works, then you can tell PuTTY where to find this file by configuring this option. By default, PuTTY will not attempt to find any authorisation for your local display Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e16e1786af3c08b215edb6cd0be30d19 Text-delta-base-sha1: 8c3c872c9db1d5f243c9213f0b51835d4c80c817 Text-content-length: 44 Text-content-md5: ce58121ef5542232c9018956c1d10c27 Text-content-sha1: 8a2b40f6ae0851d130fcb7cbc33e049678294198 Content-length: 44 SVN��4L ���!Filename xauthfile Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b06d165e9c6bbc76eb7db119f5ab11e Text-delta-base-sha1: 59215d88b2cfb704a5a22215dcfe92a1898fc143 Text-content-length: 128 Text-content-md5: 32756171cfa98517fbb7a7ac5b5da003 Text-content-sha1: 36895817f07339ea3dfa0581f4bb70f41f7c6c96 Content-length: 128 SVN��WQb�=��m(�Efilename(sesskey, "X11AuthFile", cfg->xauthfile gppfile(sesskey, "X11AuthFile", &cfg->xauthfile Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 45eeccc97c83a9666f79f822981a1cc2 Text-delta-base-sha1: 3ae6d66f8191b9abae97fb41badd415ebc0b841a Text-content-length: 912 Text-content-md5: 53059c0ce00b9228bb40627a83a6337a Text-content-sha1: 70a07a4fbee98f441ae9db58e85bfd877751e97e Content-length: 912 SVN���� �r��tstruct X11Display *x11disp���.:�R��sz�9T�]x�o�|able to use tx11disp, c, logevent("Requesting X11 forwarding"); ssh->x11disp = x11_setup_display(ssh->cfg.x11_display, ssh->cfg.x11_auth, &ssh->cfgssh->x11disp->remoteauthprotoname, PKTT_PASSWORD, PKT_STR, ssh->x11disp->remoteauthdatastring, PKTT_OTHER, PKT_INT, ssh->x11disp->screennumssh->x11disp->remoteauthprotoname, PKTT_PASSWORD, PKT_STR, ssh->x11disp->remoteauthdatastring, PKTT_OTHER, PKT_END); }�{#6&�_��7�4;�t�E~�n�I� nx11disp, c, addrstr, peerport,logevent("Requesting X11 forwarding"); ssh->x11disp = x11_setup_display(ssh->cfg.x11_display, ssh->cfg.x11_auth, &ssh->cfgssh->x11disp->remoteauthprotonamessh->x11disp->remoteauthdatastringssh->x11disp->screennumdispdisp) x11_free_display(ssh->x11disp Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 843888a03601302c22dc5894f017eda5 Text-delta-base-sha1: 23ddd676b5bfb335fa791260072b39ebc66b4004 Text-content-length: 2937 Text-content-md5: 1642da5ec1a55e1610d56abf0df8005c Text-content-sha1: 4a6cf9a64d508d41c0553366384a34eea383354b Content-length: 2937 SVN��s�P�H��:.�l!�Sm�`tree234num { X11_TRANS_IPV4 = 0, X11_TRANS_IPV6 = 6, X11_TRANS_UNIX = 256 }; struct X11Display { /* Broken-down components of the display name itself */ int unixdomain; char *hostname; int displaynum; int screennum; /* OSX sometimes replaces all the above with a full Unix-socket pathname */ char *unixsocketpath; /* PuTTY networking SockAddr to connect to the display, and associated * gubbins */ SockAddr addr; int port; char *realhost; /* Auth details we invented for the virtual display on the SSH server. */ int remoteauthproto; unsigned char *remoteauthdata; int remoteauthdatalen; char *remoteauthprotoname; char *remoteauthdatastring; /* Our local auth details for talking to the real X display. */ int localauthproto; unsigned char *localauthdata; int localauthdatalen; /* * Used inside x11fwd.c to remember recently seen * XDM-AUTHORIZATION-1 strings, to avoid replay attacks. */ tree234 *xdmseen; }; /* * x11_setup_display() parses the display variable and fills in an * X11Display structure. Some remote auth details are invented; * the supplied authtype parameter configures the preferred * authorisation protocol to use at the remote end. The local auth * details are looked up by calling platform_get_x11_auth. */ extern struct X11Display *x11_setup_display(char *display, int authtype, const Config *); void x11_free_display(struct X11Display *disp); extern const char *x11_init(Socket *, struct X11Display *, void *, const char *,char *x11_display(const char *display); /* Platform-dependent X11 functions */ extern void platform_get_x11_auth(struct X11Display *display, const Config *); /* examine a mostly-filled-in X11Display and fill in localauth* */ extern const int platform_uses_x11_unix_by_default; /* choose default X transport in the absence of a specified one */ SockAddr platform_get_x11_unix_address(const char *path, int displaynum); /* make up a SockAddr naming the address for displaynum */ char *platform_get_x_display(void); /* allocated local X display string, if any */ /* Callbacks in x11.c usable _by_ platform X11 functions */ /* * This function does the job of platform_get_x11_auth, provided * it is told where to find a normally formatted .Xauthority file: * it opens that file, parses it to find an auth record which * matches the display details in "display", and fills in the * localauth fields. * * It is expected that most implementations of * platform_get_x11_auth() will work by finding their system's * .Xauthority file, adjusting the display details if necessary * for local oddities like Unix-domain socket transport, and * calling this function to do the rest of the work. */ void x11_get_auth_from_authfile(struct X11Display *display, const char *authfilename); Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b6dd2f1f328cac087719f710c45e3d76 Text-delta-base-sha1: 500be98cb0c5c380b2975a7f7f57c13004af1dab Text-content-length: 1415 Text-content-md5: b9d0d831b01fed7b5e7bd335750f82dc Text-content-sha1: 4cfef99ad1c6d3790fa0d7048469c3624be47e18 Content-length: 1415 SVN�� ut��t<stdlib.h> #include "putty.h" #include "ssh.h" #include "network.h" void platform_get_x11_auth(struct X11Display *disp, const Config *cfg) { char *xauthfile; int needs_free; /* * Upgrade an IP-style localhost display to a Unix-socket * display. */ if (!disp->unixdomain && sk_address_is_local(disp->addr)) { sk_addr_free(disp->addr); disp->unixdomain = TRUE; disp->addr = platform_get_x11_unix_address(NULL, disp->displaynum); disp->realhost = dupprintf("unix:%d", disp->displaynum); disp->port = 0; } /* * Set the hostname for Unix-socket displays, so that we'll * look it up correctly in the X authority file. */ if (disp->unixdomain) { int len; sfree(disp->hostname); len = 128; do { len *= 2; disp->hostname = snewn(len, char); if (gethostname(disp->hostname, len) < 0) { disp->hostname = NULL; return; } } while (strlen(disp->hostname) >= len-1); } /* * Find the .Xauthority file. */ needs_free = FALSE; xauthfile = getenv("XAUTHORITY"); if (!xauthfile) { xauthfile = getenv("HOME"); if (xauthfile) { xauthfile = dupcat(xauthfile, "/.Xauthority", NULL); needs_free = TRUE; } } if (xauthfile) { x11_get_auth_from_authfile(disp, xauthfile); if (needs_free) sfree(xauthfile); } } const int platform_uses_x11_unix_by_default = TRUE; Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 42c7cea144bb4ced27ba87e7015f0811 Text-delta-base-sha1: e2b5c24e3715f47c93889085ee7232bfd5e68d4c Text-content-length: 412 Text-content-md5: 414cab4a4b2fab9c02ac56e2244388b0 Text-content-sha1: 36f17ba7a245b258e5ff32de53b7be4f45ad6ea5 Content-length: 412 SVN��Z5 n�9�� qU�t'�G?�Isockpath, int displaynumIn special circumstances (notably Mac OS X Leopard), we'll * have been passed an explicit Unix socket path. */ if (sockpath) { n = snprintf(ret->hostname, sizeof ret->hostname, "%s", sockpath if (n < 0) ret->error = "snprintf failed"; else if (n >= sizeof ret->hostname) ret->error = "X11 UNIX name too long"; Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cb00763da9b1c37d75ba1bc3e21ca763 Text-delta-base-sha1: e349499ab2a6e922ef241d3251cfac71301bd1ce Text-content-length: 176 Text-content-md5: a3a8059decb67396c315043280c14a01 Text-content-sha1: 2946c2255c3a740a74d6d5c927fb3c50f0201448 Content-length: 176 SVN��/�x��Mj�X?sshstruct X11Display *display, const Config *cfg) { /* Do nothing, therefore no auth. */ } const int platform_uses_x11_unix_by_default = TRUE; Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5feceab5c82fb12b64b754520c69dce2 Text-delta-base-sha1: c8e56e598a10f9090ee73b3d76b2d6afd6c5a096 Text-content-length: 400 Text-content-md5: 26df0b6ad799a4f009fc18f7f0281304 Text-content-sha1: fc550a0499f517abaa09e6f88b162994460400d5 Content-length: 400 SVN��B? z�@�z= /* * $XAUTHORITY is not reliable on Windows, so we provide a * means to override it. */ s = ctrl_getset(b, "Connection/SSH/X11", "x11", "X11 forwarding"); ctrl_filesel(s, "X authority file for local display", 't', NULL, FALSE, "Select X authority file", HELPCTX(ssh_tunnels_xauthority), dlg_stdfilesel_handler, I(offsetof(Config, xauthfile)) Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f65a8520ff3c32c7147ddaf07684d0a1 Text-delta-base-sha1: 25272cab427f8ee1cf77c91934bc9f2b6e7afc5c Text-content-length: 77 Text-content-md5: 79100b96dc1df873e3a9b958b256da84 Text-content-sha1: f1c82f7184ebfabca951c0a5362491fb1a7c98b3 Content-length: 77 SVN��7 8�"��7�xauthority "ssh.tunnels.xauthority:config-ssh-xauthority Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7af13baaf91674206b193b383e702bf0 Text-delta-base-sha1: a00215390095494fb1db569db8745dc844e090b3 Text-content-length: 20 Text-content-md5: cbde5371b250f670a70140cf3a44c3da Text-content-sha1: 96c44db255d6c922befa0cf95e8e49d38ab24b96 Content-length: 20 SVN��d| ����ky Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c94451d073f14592444a3662854a87e Text-delta-base-sha1: a1236e9b4fe32e90b674867e6712cf0828643910 Text-content-length: 203 Text-content-md5: 03c1ef18bebe78976c59b0b5a0b15ac3 Text-content-sha1: fd0d70e720d624f90fb90eb2637a07a4bef35f1d Content-length: 203 SVN��>/�4�/�A@�xvoid platform_get_x11_auth(struct X11Display *display, const Config *cfg) { /* Do nothing, therefore no auth. */ } const int platform_uses_x11_unix_by_default = TRUE; /* Node-path: putty/windows/winx11.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 407 Text-content-md5: 55e9077753c7e73d1ba4df42cf610cf7 Text-content-sha1: 0411e5ebd2c70dbaca98308aba1fa773018b6cef Content-length: 417 PROPS-END SVN���  /* * winx11.c: fetch local auth data for X forwarding. */ #include <ctype.h> #include <assert.h> #include <stdlib.h> #include "putty.h" #include "ssh.h" void platform_get_x11_auth(struct X11Display *disp, const Config *cfg) { if (cfg->xauthfile.path[0]) x11_get_auth_from_authfile(disp, cfg->xauthfile.path); } const int platform_uses_x11_unix_by_default = FALSE; Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c08ebc7d04cc71ae4b385128c9b0635f Text-delta-base-sha1: 7fa247f86060be8fc4aa1c3cd963b121f8bd7fd6 Text-content-length: 9696 Text-content-md5: 3c4c5f16279248daaffe28fd23407470 Text-content-sha1: a886db13981b01efee0131a2714d2da25eaad173 Content-length: 9696 SVN��ID�L��Q]�}8L��W>}�,qF�VW�LW�p'�g�b}� z�~�a��f'�,P�c�'|R�oK�D�1\�Display *dispstruct X11Display *x11_setup_display(char *display, int authtype, const Config *cfg) { struct X11Display *disp = snew(struct X11Display); char *localcopy; int i; if (!display || !*display) { localcopy = platform_get_x_display(); if (!localcopy || !*localcopy) { sfree(localcopy); localcopy = dupstr(":0"); /* plausible default for any platform */ } } else localcopy = dupstr(display); /* * Parse the display name. * * We expect this to have one of the following forms: * * - the standard X format which looks like * [ [ protocol '/' ] host ] ':' displaynumber [ '.' screennumber ] * (X11 also permits a double colon to indicate DECnet, but * that's not our problem, thankfully!) * * - only seen in the wild on MacOS (so far): a pathname to a * Unix-domain socket, which will typically and confusingly * end in ":0", and which I'm currently distinguishing from * the standard scheme by noting that it starts with '/'. */ if (localcopy[0] == '/') { disp->unixsocketpath = localcopy; disp->unixdomain = TRUE; disp->hostname = NULL; disp->displaynum = -1; disp->screennum = 0; } else { char *colon, *dot, *slash; char *protocol, *hostname; colon = strrchr(localcopy, ':'); if (!colon) { sfree(disp); sfree(localcopy); return NULL; /* FIXME: report a specific error? */ } *colon++ = '\0'; dot = strchr(colon, '.'); if (dot) *dot++ = '\0'; disp->displaynum = atoi(colon); if (dot) disp->screennum = atoi(dot); else disp->screennum = 0; protocol = NULL; hostname = localcopy; if (colon > localcopy) { slash = strchr(localcopy, '/'); if (slash) { *slash++ = '\0'; protocol = localcopy; hostname = slash; } } disp->hostname = *hostname ? dupstr(hostname) : NULL; if (protocol) disp->unixdomain = (!strcmp(protocol, "local") || !strcmp(protocol, "unix")); else disp->unixdomain = platform_uses_x11_unix_by_default; if (!disp->hostname && !disp->unixdomain) disp->hostname = dupstr("localhost"); disp->unixsocketpath = NULL; sfree(localcopy); } /* * Look up the display hostname, if we need to. */ if (disp->unixdomain) { disp->addr = platform_get_x11_unix_address(disp->unixsocketpath, disp->displaynum); if (disp->unixsocketpath) disp->realhost = dupstr(disp->unixsocketpath); else disp->realhost = dupprintf("unix:%d", disp->displaynum); disp->port = 0; } else { const char *err; disp->port = 6000 + disp->displaynum; disp->addr = name_lookup(disp->hostname, disp->port, &disp->realhost, cfg, ADDRTYPE_UNSPEC); if ((err = sk_addr_error(disp->addr)) != NULL) { sk_addr_free(disp->addr); sfree(disp->hostname); sfree(disp->unixsocketpath); return NULL; /* FIXME: report an error */ } } /* * Invent the remote authorisation details. */ if (authtype == X11_MIT) { disp->remoteauthproto = X11_MIT; /* MIT-MAGIC-COOKIE-1. Cookie size is 128 bits (16 bytes). */ disp->remoteauthdata = snewn(16, unsigned char); for (i = 0; i < 16; i++) disp->remoteauthdata[i] = random_byte(); disp->remoteauthdatalen = 16; disp->xdmseen = NULL; } else { assert(authtype == X11_XDM); disp->remoteauthproto = X11_XDM; /* XDM-AUTHORIZATION-1. Cookie size is 16 bytes; byte 8 is zero. */ disp->remoteauthdata = snewn(16, unsigned char); for (i = 0; i < 16; i++) disp->remoteauthdata[i] = (i == 8 ? 0 : random_byte()); disp->remoteauthdatalen = 16; disp->xdmseen = newtree234(xdmseen_cmp); } disp->remoteauthprotoname = dupstr(x11_authnames[disp->remoteauthproto]); disp->remoteauthdatastring = snewn(disp->remoteauthdatalen * 2 + 1, char); for (i = 0; i < disp->remoteauthdatalen; i++) sprintf(disp->remoteauthdatastring + i*2, "%02x", disp->remoteauthdata[i]); /* * Fetch the local authorisation details. */ disp->localauthproto = X11_NO_AUTH; disp->localauthdata = NULL; disp->localauthdatalen = 0; platform_get_x11_auth(disp, cfg); return disp; } void x11_free_display(struct X11Display *disp) { if (disp->xdmseen != NULL) { struct XDMSeen *seen; while ((seen = delpos234(disp->xdmseen, 0)) != NULL) sfree(seen); freetree234(disp->xdmseen); } sfree(disp->hostname); sfree(disp->unixsocketpath); if (disp->localauthdata) memset(disp->localauthdata, 0, disp->localauthdatalen); sfree(disp->localauthdata); if (disp->remoteauthdata) memset(disp->remoteauthdata, 0, disp->remoteauthdatalen); sfree(disp->remoteauthdata); sfree(disp->remoteauthprotoname); sfree(disp->remoteauthdatastring); sk_addr_free(disp->addr); sfree(dispDisplay *dispdisp->remoteauthproto]) != 0) return "wrong authorisation protocol attempted"; if (disp->remoteauthproto == X11_MIT) { if (dlen != disp->remoteauthdatalen) return "MIT-MAGIC-COOKIE-1 data was wrong length"; if (memcmp(disp->remoteauthdata, data, dlen) != 0) return "MIT-MAGIC-COOKIE-1 data did not match"; } if (disp->remoteauthdisp->remoteauthdata+9, data, 24); if (memcmp(disp->remoteauthdisp->xdmseen != NULL); ret = add234(dispdispdispvoid x11_get_auth_from_authfile(struct X11Display *disp, const char *authfilename) { FILE *authfp; char *buf, *ptr, *str[4]; int len[4]; int family, protocol; authfp = fopen(authfilename, "rb"); if (!authfp) return; /* Records in .Xauthority contain four strings of up to 64K each */ buf = snewn(65537 * 4, char); while (1) { int c, i, j; #define GET do { c = fgetc(authfp); if (c == EOF) goto done; c = (unsigned char)c; } while (0) /* Expect a big-endian 2-byte number giving address family */ GET; family = c; GET; family = (family << 8) | c; /* Then expect four strings, each composed of a big-endian 2-byte * length field followed by that many bytes of data */ ptr = buf; for (i = 0; i < 4; i++) { GET; len[i] = c; GET; len[i] = (len[i] << 8) | c; str[i] = ptr; for (j = 0; j < len[i]; j++) { GET; *ptr++ = c; } *ptr++ = '\0'; } #undef GET /* * Now we have a full X authority record in memory. See * whether it matches the display we're trying to * authenticate to. * * The details we've just read should be interpreted as * follows: * * - 'family' is the network address family used to * connect to the display. 0 means IPv4; 6 means IPv6; * 256 means Unix-domain sockets. * * - str[0] is the network address itself. For IPv4 and * IPv6, this is a string of binary data of the * appropriate length (respectively 4 and 16 bytes) * representing the address in big-endian format, e.g. * 7F 00 00 01 means IPv4 localhost. For Unix-domain * sockets, this is the host name of the machine on * which the Unix-domain display resides (so that an * .Xauthority file on a shared file system can contain * authority entries for Unix-domain displays on * several machines without them clashing). * * - str[1] is the display number. I've no idea why * .Xauthority stores this as a string when it has a * perfectly good integer format, but there we go. * * - str[2] is the authorisation method, encoded as its * canonical string name (i.e. "MIT-MAGIC-COOKIE-1", * "XDM-AUTHORIZATION-1" or something we don't * recognise). * * - str[3] is the actual authorisation data, stored in * binary form. */ if (disp->displaynum < 0 || disp->displaynum != atoi(str[1])) continue; /* not the one */ for (protocol = 1; protocol < lenof(x11_authnames); protocol++) if (!strcmp(str[2], x11_authnames[protocol])) break; if (protocol == lenof(x11_authnames)) continue; /* don't recognise this protocol, look for another */ switch (family) { case 0: if (!disp->unixdomain && sk_addrtype(disp->addr) == ADDRTYPE_IPV4) { char buf[4]; sk_addrcopy(disp->addr, buf); if (len[0] == 4 && !memcmp(str[0], buf, 4)) goto found; } break; case 6: if (!disp->unixdomain && sk_addrtype(disp->addr) == ADDRTYPE_IPV6) { char buf[16]; sk_addrcopy(disp->addr, buf); if (len[0] == 16 && !memcmp(str[0], buf, 16)) goto found; } break; case 256: if (disp->unixdomain && !strcmp(disp->hostname, str[0])) goto found; break; } } found: disp->localauthproto = protocol; disp->localauthdata = snewn(len[3], unsigned char); memcpy(disp->localauthdata, str[3], len[3]); disp->localauthdatalen = len[3]; done: fclose(authfp); memset(buf, 0, 65537 * 4); sfree(buf)extern const char *x11_init(Socket *s, struct X11Display *disp, void *c, const char *peeraddr, int peerport, const char *err; struct X11Private *pr;disp = dispsk_addr_dup(disp->addr), disp->realhost, disp->orisdisp, pr->auth_protocol, pr->auth_data, pr->auth_dlen); /* * If authorisdisp->localauthdisp->localauthproto == X11_MIT) { assert(pr->disp->localauthdatalen <= lenof(realauthdata)); realauthlen = pr->disp->localauthdatalen; memcpy(realauthdata, pr->disp->localauthdata, realauthlen); } else if (pr->disp->localauthproto == X11_XDM && pr->disp->localauthdatadisp->localauthdisp->localauthdisp->localauthproto], Revision-number: 8306 Prop-content-length: 119 Content-length: 119 K 8 svn:date V 27 2008-11-17T18:40:07.927936Z K 7 svn:log V 19 Now done, I think. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/x11-auth Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25991e54fb9daa2579bcc82b5b133005 Text-delta-base-sha1: d366d4e2dfdeff3366636f2532934a52e862729f Text-content-length: 358 Text-content-md5: 39255e2c29c9c4c5ec385bc2b571b358 Text-content-sha1: d2122bb6d6331c31a197de8fa34e4abca397b29f Content-length: 358 SVN��b O�X��;W@Fixed-in: r8305 <p> <b>SGT, 2008-11-17</b>: should now be done, at least for Windows X servers which provide X authority files in the standard format. There's a new config option on Windows which allows the user to point at the location of their X authority file, and PuTTY has the in-built ability to understand files in that format. Revision-number: 8307 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-22T00:34:29.590580Z PROPS-END Revision-number: 8308 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-22T00:34:29.678805Z PROPS-END Revision-number: 8309 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-22T00:34:29.682246Z PROPS-END Revision-number: 8310 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-22T00:34:29.769847Z PROPS-END Revision-number: 8311 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-22T00:34:29.819472Z PROPS-END Revision-number: 8312 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-22T00:34:29.859712Z PROPS-END Revision-number: 8313 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-22T00:34:29.863455Z PROPS-END Revision-number: 8314 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-23T00:34:37.760908Z PROPS-END Revision-number: 8315 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-23T00:34:37.868704Z PROPS-END Revision-number: 8316 Prop-content-length: 217 Content-length: 217 K 7 svn:log V 118 All CVE IDs now begin "CVE" rather than "CAN". The old ones work, but using the new ones will make searching easier. K 10 svn:author V 3 ben K 8 svn:date V 27 2008-11-22T13:03:10.262462Z PROPS-END Node-path: putty-wishlist/data/vuln-modpow Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 38d39ca61a7ef341d70591f830767eba Text-delta-base-sha1: c8fd4ea8f8f4955d761081e978c27207c7babf00 Text-content-length: 37 Text-content-md5: 124d0ab7a1c33879f8f1518590445d9d Text-content-sha1: 8ad348e4dba1075cce565945c9e8588d1906bd1f Content-length: 37 SVN��ww ���J-VE-2004-1440">CVE Node-path: putty-wishlist/data/vuln-passwd-memdump Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ab4ada471d39e007ace9200d62ab96a Text-delta-base-sha1: 9dd301014abf054da48d435f63f7820f5ae7cf7d Text-content-length: 37 Text-content-md5: 381947d96b3d259bf042a3e6575b205f Text-content-sha1: ad46eacd24d5a84cda821b905c537a318b44008a Content-length: 37 SVN��EE�"�4VE-2003-0048"> CVE Node-path: putty-wishlist/data/vuln-sftp-readdir Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b7977bee98cc2134cd21f7b8b9c33777 Text-delta-base-sha1: 08dde9a25d4102bbb51f969dd80269b34e7ea76d Text-content-length: 38 Text-content-md5: e37723d9e2ddc46e0b9612b66dce0df4 Text-content-sha1: 2fe0fbfe7b570fa0f6180ffa45f1492d30d01505 Content-length: 38 SVN�� �1��ABVE-2005-0467">CVE Node-path: putty-wishlist/data/vuln-sftp-string Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 156f660d9ba98051cd79c1641082944c Text-delta-base-sha1: 0fcf651bfbc296f914d1f0adb4fce8b9fdd01856 Text-content-length: 38 Text-content-md5: 24dc220b5d3d4bc10447b287e8c4b590 Text-content-sha1: 998aadac39f230cbcf5eb49c535392618c25eb33 Content-length: 38 SVN��ii �I��ZVE-2005-0467">CVE Node-path: putty-wishlist/data/vuln-ssh2-debug Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f18eef41c27f614e22254f93c169a7fd Text-delta-base-sha1: 6782f79e90b4a93cf81fec570490f5ef82da903e Text-content-length: 37 Text-content-md5: 1cd1a93fead406f96e6bd07c7faef152 Text-content-sha1: 17e0017b7bc391b9c4bba66434302a485feb5fc0 Content-length: 37 SVN��88 �[��LlVE-2004-1008">CVE Node-path: putty-wishlist/data/vuln-sshredder Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2dfbad490d9d8a765d32adf34972f2f5 Text-delta-base-sha1: fc8424fa385ad85dc740467bc11bbec5d3a3421f Text-content-length: 316 Text-content-md5: 45f732ae17f67a957d03d2b01a11fa88 Text-content-sha1: c7abc6036c6289d3aace05b927b029a52f6a935e Content-length: 316 SVN�� %��%�ZAVE-2002-1357">CVE-2002-1357</a> <li><a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2002-1358">CVE-2002-1358</a> <li><a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2002-1359">CVE-2002-1359</a> <li><a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2002-1360">CVE Revision-number: 8317 Prop-content-length: 331 Content-length: 331 K 8 svn:date V 27 2008-11-22T22:06:42.423086Z K 7 svn:log V 232 Changes to make this compile on Solaris 9: use <gssapi/gssapi.h> rather than <gssapi/gssapi_krb5.h> and provide the OID for Kerberos 5 ourselves (since it's a known constant). I'm not sure this actually works on Solaris yet, mind. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9fc56eacc19758e50b090f69cc9d464c Text-delta-base-sha1: 5ab78f1870a1fec010e01b6e557634e241eb2a6b Text-content-length: 281 Text-content-md5: ec1a6b8c976f272ef35e81dc4d88f8c9 Text-content-sha1: 1f36f5e143f0a2d33da1fada65370b8c6576dd32 Content-length: 281 SVN��Lf�`l#ifndef NO_GSSAPI #include <string.h> #include <gssapi/gssapi.h> #include "sshgss.h" #include "misc.h" static gss_OID_desc gss_mech_krb5_desc = { 9, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x02" }; static gss_OID const gss_mech_krb5 = &gss_mech_krb5_desc; Revision-number: 8318 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2008-11-22T22:49:27.732095Z K 7 svn:log V 77 Autoconfiscate GSS-API support, including support for manually disabling it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b6ad8af00275b4244daa9abc877d1faa Text-delta-base-sha1: 7bd21ace9c30e197881685d2315ef49c0c77ac4c Text-content-length: 339 Text-content-md5: e7d41721b5235f5dc7d769b65eccccea Text-content-sha1: 0e67f6a0652ad06adb37733bc0469d9c53f1ea38 Content-length: 339 SVN��;+��E�Y}M�Uj�i vARG_WITH(gssapi, [ --without-gssapi disable GSS-API support])if test "$with_gssapi" != "no"; then AC_CHECK_HEADERS([gssapi/gssapi.h]) fiif test "$with_gssapi" != "no"; then AC_SEARCH_LIBS([gss_init_sec_context], [gss gssapi gssapi_krb5]) fi#ifndef HAVE_GSSAPI_GSSAPI_H # define NO_GSSAPI Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec1a6b8c976f272ef35e81dc4d88f8c9 Text-delta-base-sha1: 1f36f5e143f0a2d33da1fada65370b8c6576dd32 Text-content-length: 139 Text-content-md5: 2bc5f8311d9a6349bdab8b038d6c5368 Text-content-sha1: 36203109f850eb98295bfef5e831650fb63d1608 Content-length: 139 SVN��fyzz�g#include <string.h> #include <gssapi/gssapi.h> #include "putty.h" #include "sshgss.h" #include "misc.h" #ifndef NO_GSSAPI Revision-number: 8319 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2008-11-23T13:28:03.805785Z K 7 svn:log V 36 Add a reference to GSS-API/SSH RFC. K 10 svn:author V 3 ben PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f85ef1209758e808b7e4bba6dfc9662c Text-delta-base-sha1: 1aef5f9056c05857981c8bf60886d1dd78030de8 Text-content-length: 171 Text-content-md5: 1b4f3d80927dd9e9a895169b80f459a2 Text-content-sha1: fbedd85895a2434d9a721b427914a45a7413a4a8 Content-length: 171 SVN��2z ���cO462.txt"> RFC 4462: Generic Security Service Application Program Interface (GSS-API) Authentication and Key Exchange for the Secure Shell (SSH) Revision-number: 8320 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-24T00:34:34.583948Z PROPS-END Revision-number: 8321 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-24T00:34:34.587881Z PROPS-END Revision-number: 8322 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-24T00:34:34.670895Z PROPS-END Revision-number: 8323 Prop-content-length: 249 Content-length: 249 K 8 svn:date V 27 2008-11-23T20:11:12.237701Z K 7 svn:log V 148 Make key file import robust against a PPK file that has somehow lost its final newline. From Debian bug #414784, based on a patch by Justin Pryzby. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7eec9ae5d59f9d1ba35def33e7d1f585 Text-delta-base-sha1: 185b13f53d5a033db03f7f2dee2e1154b9406c93 Text-content-length: 155 Text-content-md5: 13d19699890354eda30a383e2ccb5eaf Text-content-sha1: 293d12724556a6970dd2a30046d59ff3799e9fc6 Content-length: 155 SVN���b ��2���0P || c == EOF) { if (c != EOF) { c = fgetc(fp); if (c != '\r' && c != '\n') ungetc(c, fp); } return text Revision-number: 8324 Prop-content-length: 734 Content-length: 734 K 8 svn:date V 27 2008-11-24T17:51:42.284950Z K 7 svn:log V 633 New option to allow use of the local OS username for login to the remote side if we have no better ideas, with UI shamelessly stolen from Quest PuTTY. Off by default, which effectively reverts the change to using the local username by default that came in with GSSAPI support in r8138. Anyone wanting seamless single sign-on will need to set the new option. (The previous default behaviour was getting in the way in ad-hoc scenarios.) Note that the PSCP and Unix-Plink behaviour of using the local username by default have remained unchanged throughout; they are not affected by the new option. Not sure if that's the Right Thing. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d8082be38c5618d749b0e9a2948ef266 Text-delta-base-sha1: f8b8721aa7cc56d93258c74ac104c5489b22d0e5 Text-content-length: 524 Text-content-md5: 321ca7593b35f7eca0e3dbaa385f7b3e Text-content-sha1: 3a5c582a28dac9987edf5086d4852e861f46ca9f Content-length: 524 SVN��oo�f�o�e { /* We assume the local username is sufficiently stable * to include on the dialog box. */ char *user = get_username(); char *userlabel = dupprintf("Use system username (%s)", user); sfree(user); ctrl_radiobuttons(s, "When username is not specified:", 'n', 4, HELPCTX(connection_username_from_env), dlg_stdradiobutton_handler, I(offsetof(Config, username_from_env)), "Prompt", I(FALSE), userlabel, I(TRUE), NULL); sfree(userlabel); } Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 789f50aa0ee361c4625cf0f2aa0dd059 Text-delta-base-sha1: d911fe3ff8ecbebd80940f81b03c28e1688f545d Text-content-length: 1416 Text-content-md5: 0d3bd933c54b304287c37dd25cf9db5e Text-content-sha1: 284f4f872ba87187ac906895dae793232414a094 Content-length: 1416 SVN����%�^�%�}Qusername-from-env} \q{Use of system username} \cfg{winhelp-topic}{connection.usernamefromenv} When the previous box (\k{config-username}) is left blank, by default, PuTTY will prompt for a username at the time you make a connection. In some environments, such as large corporate networks with \i{single sign-on}, a more sensible default may be to use the name of the user logged in to the local operating system (if any). This control allows you to change the default behaviour. The current system username is displayed in the dialog as a convenience. It is not saved in the configuration; if a saved session is later used by a different user, that user's name will be used�b22�b� as keepalives. (Except that rekeys have cryptographic value in themselves, so you should bear that in mind when deciding whether to turn them off.) Note, however, the the SSH \e{server} can still initiate rekeys. \b \q{Max data before rekey} specifies the amount of data (in bytes) that is permitted to flow in either direction before a rekey is initiated. If this is set to zero, PuTTY will not rekey due to transferred data. The SSH-2 protocol specification recommends a limit of at most 1 gigabyte. \lcont{ As well as specifying a value in bytes, the following shorthand can be used: \b \cq{1k} specifies 1 kilobyte (1024 bytes). \b \cq{1M} specifies 1 megabyte (1024 kilobytes). Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ce58121ef5542232c9018956c1d10c27 Text-delta-base-sha1: 8a2b40f6ae0851d130fcb7cbc33e049678294198 Text-content-length: 110 Text-content-md5: bcacf8f7c515e83a221da8d645540662 Text-content-sha1: cf2286b8438659630df911371083d50bdf157b47 Content-length: 110 SVN��L%P�|��*v�/int username_from_envint get_remote_username(Config *cfg, char *user, size_t len Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 212ea78fecb64555eb1b092faa02ff73 Text-delta-base-sha1: 2b0521292712efb3ae17e28bac7fa3069292f241 Text-content-length: 139 Text-content-md5: 1acb573d8fea5a839bd4332d39464627 Text-content-sha1: f2794a695496db83d9d4adb0210549c4c0acead9 Content-length: 139 SVN�� Yo�F�Y�C� char ruser[sizeof(cfg->username)]; (void) get_remote_username(cfg, ruser, sizeof(ruser))ruser, strlen(ruser Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 32756171cfa98517fbb7a7ac5b5da003 Text-delta-base-sha1: 36895817f07339ea3dfa0581f4bb70f41f7c6c96 Text-content-length: 610 Text-content-md5: 758de66e4acf4a63a5341d91c1da4d57 Text-content-sha1: d219c9107c1d1b1135007dbe6bc2fb7e28c74b2d Content-length: 610 SVN��Qq:�� ��p{r�2int get_remote_username(Config *cfg, char *user, size_t len) { if (*cfg->username) { strncpy(user, cfg->username, len); user[len-1] = '\0'; } else { if (cfg->username_from_env) { /* Use local username. */ char *luser = get_username(); strncpy(user, luser, len); user[len-1] = '\0'; sfree(luser); } else { *user = '\0'; } } return (*user != '\0')i(sesskey, "UserNameFromEnvironment", cfg->username_from_env"", cfg->username, sizeof(cfg->username)); gppi(sesskey, "UserNameFromEnvironment", 0, &cfg->username_from_env Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 53059c0ce00b9228bb40627a83a6337a Text-delta-base-sha1: 70a07a4fbee98f441ae9db58e85bfd877751e97e Text-content-length: 367 Text-content-md5: 8e6670818f6040812e91f28638a910d7 Text-content-sha1: 90896525895530b0a4dedff929264a460e054e53 Content-length: 367 SVN������E�1�:FJget_remote_username(&ssh->cfg, s->username, sizeof(s->username))able to use this key file (%s)", key_type_to_str(keytype)); m���J�6JJ struct Packet *pktout; ssh_pkt_getstring(pktin, &type, &typelen); �#E�XJE�P4�,wget_remote_username(&ssh->cfg, s->username, sizeof(s->username)) Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 461713b79f43217350a6605e1a34cb1f Text-delta-base-sha1: ca38762a5243a657cbe8c55f352a0d864b801dc8 Text-content-length: 704 Text-content-md5: 7e656a519d341954d1ffd81ec99d079e Text-content-sha1: 3c637eeefbc37091aa1bbaf9200fd0cea9c7724a Content-length: 704 SVN��Pl &��&�E { char user[sizeof(telnet->cfg.username)]; (void) get_remote_username(&telnet->cfg, user, sizeof(user)); if (*user) { b[n++] = var; b[n++] = 'U'; b[n++] = 'S'; b[n++] = 'E'; b[n++] = 'R'; b[n++] = value; e = user; while (*e) b[n++] = *e++; } b[n++] = IAC; b[n++] = SE; telnet->bufsize = sk_write(telnet->s, (char *)b, n); logbuf = dupprintf("client:\tSB %s IS %s%s%s%s", telopt(telnet->sb_opt), *user ? "USER=" : "", user, *user ? " " : "", n == 6 ? "<nothing>" : (*telnet->cfg.environmt ? "<stuff>" : "")); logevent(telnet->frontend, logbuf); sfree(logbuf); } Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 79100b96dc1df873e3a9b958b256da84 Text-delta-base-sha1: f1c82f7184ebfabca951c0a5362491fb1a7c98b3 Text-content-length: 452 Text-content-md5: f06b7e03f99653bcffa2c8ed9f3917fd Text-content-sha1: 3ab97b53771c2c3997f0883c4a295c9ba3f80202 Content-length: 452 SVN��W)c�JF�d-/* * winhelp.h - define Windows Help context names. * Each definition has the form "winhelp-topic:halibut-topic", where: * - "winhelp-topic" matches up with the \cfg{winhelp-topic} directives * in the Halibut source, and is used for WinHelp; * - "halibut-topic" matches up with the Halibut keywords in the source, * and is used for HTML Helpusername_from_env "connection.usernamefromenv:config-username-from-env Revision-number: 8325 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2008-11-24T18:19:55.126314Z K 7 svn:log V 52 Treat lines starting with '#' as comments in PSFTP. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/psftp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e738dd5dcde30dc301626af5c6fe8d4 Text-delta-base-sha1: d9eb1a1c83b7db1b8134e3bf6a3e12988f34b51a Text-content-length: 100 Text-content-md5: 5c6ea5d248c13fac7d6e694ea5105794 Text-content-sha1: 728b5df9831e2f0538543731cf10480a5e66e73e Content-length: 100 SVN��n L�m�L�5jAny line starting with a \cw{#} will be treated as a \i{comment} and ignored Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 05ba8c62cef9a3c42a2c16012889b4bd Text-delta-base-sha1: 5daf35dcdf3798abecdb97f9b2bcd859e3617fd1 Text-content-length: 137 Text-content-md5: d089d5635a7b553da10fdb1ff8002f98 Text-content-sha1: 7615f33a2fd0d57a8103886abca27ca20fc0f218 Content-length: 137 SVN��b]n�n�n�aif (*p == '#') { /* * Special case: comment. Entire line is ignored. */ cmd->nwords = cmd->wordssize = 0 Revision-number: 8326 Prop-content-length: 814 Content-length: 814 K 8 svn:date V 27 2008-11-24T23:44:55.291572Z K 7 svn:log V 715 Change how we handle the Ssh_gss_buf type. Previously, we defined it ourselves, but on Unix then assumed it was compatible with the system's gss_buffer_desc, which wasn't the case on LP64 systems. Now, on Unix we make Ssh_gss_buf into an alias for gss_buffer_desc, though we keep something similar to the existing behaviour on Windows. This requires renaming a couple of the fields in Ssh_gss_buf, and hence fixing all the references. Tested on Linux (MIT Kerberos) and Solaris. Compiled on NetBSD (Heimdal). Not tested on Windows because neither mingw32 nor winegcc worked out of the box for me. I think the Windows changes are all syntactic, though, so if this compiles it should work no worse than before. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e6670818f6040812e91f28638a910d7 Text-delta-base-sha1: 90896525895530b0a4dedff929264a460e054e53 Text-content-length: 827 Text-content-md5: b8402e8cbbde38d4f5c48a5c8a238f24 Text-content-sha1: c0331b3eb06978595a647404bd06c624a9d7526e Content-length: 827 SVN���������������� X5�;��f;� !K��lU�Ij�G�Tx� L�mK�:@�^ �"w, len; char *datagthgth); ssh_pkt_adddata(s->pktout, s->gss_buf.value, s->gss_buf.length &data, &len); s->gss_rcvtok.value = data; s->gss_rcvtok.length = len; if (s->gss_rcvtok.length != s->gss_buf.length + 2 || ((char *)s->gss_rcvtok.value)[0] != SSH2_GSS_OIDTYPE || ((char *)s->gss_rcvtok.value)[1] != s->gss_buf.length || memcmp((char *)s->gss_rcvtok.value + 2, s->gss_buf.value,s->gss_buf.lengthSSH_GSS_CLEAR_BUF(&s->gss_rcvtok)value); sfree(s->gss_buf.valuegthvalue,s->gss_sndtok.length &data, &len); s->gss_rcvtok.value = data; s->gss_rcvtok.length = lenvalue = (char *)s->pktout->data + micoffset; s->gss_buf.lengthvalue, mic.length Node-path: putty/sshgss.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fe8f600e519b4570d4d434f66359410a Text-delta-base-sha1: 9e125f7842c73979df648554f2141e89e6afd87b Text-content-length: 105 Text-content-md5: f6e3544984cc4a42186dda40979fa1dd Text-content-sha1: 8256102d79d808d43aa56ba3599708031ed89b53 Content-length: 105 SVN��qy S� �S�k#define SSH_GSS_CLEAR_BUF(buf) do { \ (*buf).length = 0; \ (*buf).value Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c10bbd509aa09592f608da008b785978 Text-delta-base-sha1: 4877ea1643fabef35654c4824db82af7430ae3f4 Text-content-length: 181 Text-content-md5: 1a65655dcc43cc961177babfefaa63b1 Text-content-sha1: bf1b1969ef77295ff147c473ed3a85b2ce9bf8fe Content-length: 181 SVN��t �I��-G#ifndef NO_GSSAPI /* * GSS-API stuff */ #include <gssapi/gssapi.h> typedef gss_buffer_desc Ssh_gss_buf; #define SSH_GSS_EMPTY_BUF GSS_C_EMPTY_BUFFER #endif Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2bc5f8311d9a6349bdab8b038d6c5368 Text-delta-base-sha1: 36203109f850eb98295bfef5e831650fb63d1608 Text-content-length: 740 Text-content-md5: 08d8074f059fc6a8518cf0eb1cfbc789 Text-content-sha1: 755893074d0a53b3315a62fcd4f67597096aa08c Content-length: 740 SVN��yX.*���F�Yx�6U�V �3aW�@9putty_gss_mech_krb5_desc = { 9, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x02" }; static gss_OID const putty_gss_mech_krb5 = &putty_gth = putty_gss_mech_krb5->length; mech->value = putty_putty_gss_mech_krb5, GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG | to_deleg, 0, GSS_C_NO_CHANNEL_BINDINGS,putty_putty_gth = msg_maj.length + msg_min.length + 1; buf->value = snewn(buf->length + 1, char); /* copy mem */ memcpy((char *)buf->value, msg_maj.value, msg_maj.length); ((char *)buf->value)[msg_maj.length] = ' '; memcpy((char *)buf->value + msg_maj.length + 1, msg_min.value, msg_min.length); ((char *)buf->value)[buf->length Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1d7a88050110eb4cce62ecdde9a63b34 Text-delta-base-sha1: 47134a2d836734fabb063b62b7f93bd3f9174884 Text-content-length: 425 Text-content-md5: dd88359cb033f23f9d820e9335fb7282 Text-content-sha1: 5e13874b0b125f8cf0120ff8c430ee3968c2a326 Content-length: 425 SVN��7</n�o�q�YX�2i�N��xS� y�- gth,SECBUFFER_TOKEN,send_tok->value}; SecBuffer wrecv_tok = {recv_tok->length,SECBUFFER_TOKEN,recv_tok->valuevalue = wsend_tok.pvBuffer; send_tok->length =value); SSH_GSS_CLEAR_BUF(send_tok)value = dupstr(msg); buf->length = strlen(buf->lengthgth; InputSecurityToken[0].pvBuffer = buf->valuegth = InputSecurityToken[1].cbBuffer; hash->valuevalue Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e271f30dce49103cc5086c658bfa139b Text-delta-base-sha1: 9892d54909536a8c09a6c6dc8af2db5a77acbfbc Text-content-length: 199 Text-content-md5: 44e7b4ece4f713d99527cfe9c69e8e95 Text-content-sha1: 459721a0f9873f8b8a5538255f4ea31aeba065de Content-length: 199 SVN��0 /��/�}#ifndef NO_GSSAPI /* * GSS-API stuff */ typedef struct Ssh_gss_buf { int length; char *value; } Ssh_gss_buf; #define SSH_GSS_EMPTY_BUF (Ssh_gss_buf) {0,NULL} #endif Revision-number: 8327 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2008-11-24T23:56:55.778169Z K 7 svn:log V 88 I think sshgss.h needs puttyps.h for Ssh_gss_buf. Makes it compile for Windows, anyway. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/sshgss.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f6e3544984cc4a42186dda40979fa1dd Text-delta-base-sha1: 8256102d79d808d43aa56ba3599708031ed89b53 Text-content-length: 38 Text-content-md5: 1f7a6c251c18e527a4c9a663bd6e3227 Text-content-sha1: 28fdfa7dba2dccfe0c55408b94bd89e49512e645 Content-length: 38 SVN��y�y�#include "puttyps.h" Revision-number: 8328 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-26T00:34:44.027109Z PROPS-END Revision-number: 8329 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-26T00:34:44.030870Z PROPS-END Revision-number: 8330 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-26T00:34:44.163952Z PROPS-END Revision-number: 8331 Prop-content-length: 288 Content-length: 288 K 7 svn:log V 187 Fixed a PuTTYtel startup assertion failure introduced in r8305. While I'm here, a cosmetic PuTTYtel change: remove a reference to SSH from the "logical host name" label in PuTTYtel only. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-11-25T18:43:52.834484Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 321ca7593b35f7eca0e3dbaa385f7b3e Text-delta-base-sha1: 3a5c582a28dac9987edf5086d4852e861f46ca9f Text-content-length: 447 Text-content-md5: ab0c6ffc83e2d463289df1aeda1f7b45 Text-content-sha1: 393f24e6754d3e9acc4bd5a2d728f5afcc131f87 Content-length: 447 SVN��o_"�_�"�^{ char *label = backend_from_proto(PROT_SSH) ? "Logical name of remote host (e.g. for SSH key lookup):" : "Logical name of remote host:"; s = ctrl_getset(b, "Connection", "identity", "Logical name of remote host"); ctrl_editbox(s, label, 'm', 100, HELPCTX(connection_loghost), dlg_stdeditbox_handler, I(offsetof(Config,loghost)), I(sizeof(((Config *)0)->loghost))); } Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 26df0b6ad799a4f009fc18f7f0281304 Text-delta-base-sha1: fc550a0499f517abaa09e6f88b162994460400d5 Text-content-length: 342 Text-content-md5: 87d6e073ac24da92bc7ec96c53891aa3 Text-content-sha1: ad80c011a7160e277f4a8999ae8403d7a032bd30 Content-length: 342 SVN��?sC�0�Cif (backend_from_proto(PROT_SSH)) { s = ctrl_getset(b, "Connection/SSH/X11", "x11", "X11 forwarding"); ctrl_filesel(s, "X authority file for local display", 't', NULL, FALSE, "Select X authority file", HELPCTX(ssh_tunnels_xauthority), dlg_stdfilesel_handler, I(offsetof(Config, xauthfile))); } } Revision-number: 8332 Prop-content-length: 311 Content-length: 311 K 8 svn:date V 27 2008-11-25T18:54:05.511279Z K 7 svn:log V 210 Have wingss.c include <windows.h> by way of putty.h rather than directly. Fixes a build failure involving name clashes between winsock2.h and winsock.h, which had somehow managed to get included in succession. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd88359cb033f23f9d820e9335fb7282 Text-delta-base-sha1: 5e13874b0b125f8cf0120ff8c430ee3968c2a326 Text-content-length: 101 Text-content-md5: 8ac25cc9a1498e95c15fbe68ea26e159 Text-content-sha1: 566cdb4a4f80851817a5e52a871a2dc3261e15c5 Content-length: 101 SVN��<<TT�hT#ifndef NO_GSSAPI #include "putty.h" #define SECURITY_WIN32 #include <security.h> Revision-number: 8333 Prop-content-length: 293 Content-length: 293 K 8 svn:date V 27 2008-11-25T22:11:17.033148Z K 7 svn:log V 194 Now that we use real gss_buffer_ts, there's no need to muck about with casts when passing them to GSS-API functions. Removing them makes the code more readable and allows better type-checking. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 08d8074f059fc6a8518cf0eb1cfbc789 Text-delta-base-sha1: 755893074d0a53b3315a62fcd4f67597096aa08c Text-content-length: 110 Text-content-md5: 92560473dea4b78cf13c99021648c286 Text-content-sha1: da96e5b92bffced1275eba38f3e092af0663e2b9 Content-length: 110 SVN��XUN���L^�=�;recv_tok, NULL, /* ignore mech type */ uxctx->ctx, 0, buf, Revision-number: 8334 Prop-content-length: 480 Content-length: 480 K 7 svn:log V 381 Mitigation for VU#958563: When using a CBC-mode server-to-client cipher under SSH-2, don't risk looking at the length field of an incoming packet until we've successfully MAC'ed the packet. This requires a change to the MAC mechanics so that we can calculate MACs incrementally, and output a MAC for the packet so far while still being able to add more data to the packet later. K 10 svn:author V 3 ben K 8 svn:date V 27 2008-11-26T12:49:25.398418Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b8402e8cbbde38d4f5c48a5c8a238f24 Text-delta-base-sha1: c0331b3eb06978595a647404bd06c624a9d7526e Text-content-length: 10999 Text-content-md5: 99f3d4670e83893b82b94e43fca93821 Text-content-sha1: e538ac60bd21d71dfff957e54a067bd59e9567ce Content-length: 10999 SVN����'z�j�X�"f�W�K�[^ * - OUR_V2_MAXPKT is the official "maximum packet size" we send * to the remote side. This actually has nothing to do with the * size of the _packet_, but is instead a limit on the amount * of data we're willing to receive in a single SSH2 channel * data message. * * - OUR_V2_PACKETLIMIT is actually the maximum size of SSH * _packet_ we're prepared to cope with. It must be a multiple * of the cipher block size, and must be at least 35000#define OUR_V2_PACKETLIMIT 0x9 st->maclen = ssh->scmac ? ssh->scmac->len : 0; if (ssh->sccipher && (ssh->sccipher->flags & SSH_CIPHER_IS_CBC) && ssh->scmac) { /* * When dealing with a CBC-mode cipher, we want to avoid the * possibility of an attacker's tweaking the ciphertext stream * so as to cause us to feed the same block to the block * cipher more than once and thus leak information * (VU#958563). The way we do this is not to take any * decisions on the basis of anything we've decrypted until * we've verified it with a MAC. That includes the packet * length, so we just read data and check the MAC repeatedly, * and when the MAC passes, see if the length we've got is * plausible. */ /* May as well allocate the whole lot now. */ st->pktin->data = snewn(OUR_V2_PACKETLIMIT + st->maclen + APIEXTRA, unsigned char); /* Read an amount corresponding to the MAC. */ for (st->i = 0; st->i < st->maclen; st->i++) { while ((*datalen) == 0) crReturn(NULL); st->pktin->data[st->i] = *(*data)++; (*datalen)--; } st->packetlen = 0; { unsigned char seq[4]; ssh->scmac->start(ssh->sc_mac_ctx); PUT_32BIT(seq, st->incoming_sequence); ssh->scmac->bytes(ssh->sc_mac_ctx, seq, 4); } for (;;) { /* Once around this loop per cipher block. */ /* Read another cipher-block's worth, and tack it onto the end. */ for (st->i = 0; st->i < st->cipherblk; st->i++) { while ((*datalen) == 0) crReturn(NULL); st->pktin->data[st->packetlen+st->maclen+st->i] = *(*data)++; (*datalen)--; } /* Decrypt one more block (a little further back in the stream). */ ssh->sccipher->decrypt(ssh->sc_cipher_ctx, st->pktin->data + st->packetlen, st->cipherblk); /* Feed that block to the MAC. */ ssh->scmac->bytes(ssh->sc_mac_ctx, st->pktin->data + st->packetlen, st->cipherblk); st->packetlen += st->cipherblk; /* See if that gives us a valid packet. */ if (ssh->scmac->verresult(ssh->sc_mac_ctx, st->pktin->data + st->packetlen) && (st->len = GET_32BIT(st->pktin->data)) + 4 == st->packetlen) break; if (st->packetlen >= OUR_V2_PACKETLIMIT) { bombout(("No valid incoming packet found")); ssh_free_packet(st->pktin); crStop(NULL); } } st->pktin->maxlen = st->packetlen + st->maclen; st->pktin->data = sresize(st->pktin->data, st->pktin->maxlen + APIEXTRA, unsigned char); } else { st->pktin->data = snewn(st->cipherblk + APIEXTRA, unsigned char); /* * Acquire and decrypt the first block of the packet. This will * contain the length and padding details. */ for (st->i = st->len = 0; st->i < st->cipherblk; st->i++) { while ((*datalen) == 0) crReturn(NULL); st->pktin->data[st->i] = *(*data)++; (*datalen)--; } if (ssh->sccipher) ssh->sccipher->decrypt(ssh->sc_cipher_ctx, st->pktin->data, st->cipherblk); /* * Now get the length figure. */ st->len = GET_32BIT(st->pktin->data); /* * _Completely_ silly lengths should be stomped on before they * do us any more damage. */ if (st->len < 0 || st->len > OUR_V2_PACKETLIMIT || (st->len + 4) % st->cipherblk != 0) { bombout(("Incoming packet was garbled on decryption")); ssh_free_packet(st->pktin); crStop(NULL); } /* * So now we can work out the total packet length. */ st->packetlen = st->len + 4; /* * Allocate memory for the rest of the packet. */ st->pktin->maxlen = st->packetlen + st->maclen; st->pktin->data = sresize(st->pktin->data, st->pktin->maxlen + APIEXTRA, unsigned char); /* * Read and decrypt the remainder of the packet. */ for (st->i = st->cipherblk; st->i < st->packetlen + st->maclen; st->i++) { while ((*datalen) == 0) crReturn(NULL); st->pktin->data[st->i] = *(*data)++; (*datalen)--; } /* Decrypt everything _except_ the MAC. */ if (ssh->sccipher) ssh->sccipher->decrypt(ssh->sc_cipher_ctx, st->pktin->data + st->cipherblk, st->packetlen - st->cipherblk); /* * Check the MAC. */ if (ssh->scmac && !ssh->scmac->verify(ssh->sc_mac_ctx, st->pktin->data, st->len + 4, st->incoming_sequence)) { bombout(("Incorrect MAC received on packet")); ssh_free_packet(st->pktin); crStop(NULL); } } /* Get and sanity-check the amount of random padding. */ st->pad = st->pktin->data[4]; if (st->pad < 4 || st->len - st->pad < 1) { bombout(("Invalid padding length on received packet")); ssh_free_packet(st->pktin); crStop(NULL); } st->pktin->encrypted_len = st->packetlen;���QG�v �9� (servkey.exponent) { sfree(servkey.exponent); servkey.exponent = NULL; } if (hostkey.modulus) { sfree(hostkey.modulus); hostkey.modulus = NULL; } if (hostkey.exponent) { sfree(hostkey.exponent); hostkey.exponent = NULL; } crWaitUntil(pktin); if (pktin->type != SSH1_SMSG_SUCCESS) { bombout(("Encryption not successfully enabled")); crStop(0); } logevent("Successfully started encryption"); fflush(stdout); /* FIXME eh? */ { if (!get_remote_username(&ssh->cfg, s->username, sizeof(s->username))) { int ret; /* need not be kept over crReturn */ s->cur_prompt = new_prompts(ssh->frontend); s->cur_prompt->to_server = TRUE; s->cur_prompt->name = dupstr("SSH login name"); add_prompt(s->cur_prompt, dupstr("login as: "), TRUE, lenof(s->username)); username. Terminate. */ free_prompts(s->cur_prompt); ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE); crStop(0); } memcpy(s->username, s->cur_prompt->prompts[0]->result, lenof(s->username)); free_prompts(s->cur_prompt); } send_packet(ssh, SSH1_CMSG_USER, PKT_STR, s->username, PKT_END); { char *userlog = dupprintf("Sent username \"%s\"", s->username); logevent(userlog); if (flags & FLAG_INTERACTIVE && (!((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)))) { c_write_str(ssh, userlog); c_write_str(ssh, "\r\n"); } sfree(userlog); } } crWaitUntil(pktin); if ((s->supported_auths_mask & (1 << SSH1_AUTH_RSA)) == 0) { /* We must not attempt PK auth. Pretend we've already tried it. */ s->tried_publickey = s->tried_agent = 1; } else { s->tried_publickey = s->tried_agent = 0; } s->tis_auth_refused = s->ccard_auth_refused = 0; /* * Load the public half of any configured keyfile for later use. */ if (!filename_is_null(ssh->cfg.keyfile)) { int keytype; logeventf(ssh, "Reading private key file \"%.150s\"", filename_to_str(&ssh->cfg.keyfile)); keytype = key_type(&ssh->cfg.keyfile); if (keytype == SSH_KEYTYPE_SSH1) { const char *error; if (rsakey_pubblob(&ssh->cfg.keyfile, &s->publickey_blob, &s->publickey_bloblen, &s->publickey_comment, &error)) { s->publickey_encrypted = rsakey_encrypted(&ssh->cfg.keyfile, NULL); } else { char *msgbuf; logeventf(ssh, "Unable to load private key (%s)", error); msgbuf = dupprintf("Unable to load private key file " "\"%.150s\" (%s)\r\n", filename_to_str(&ssh->cfg.keyfile), error); c_write_str(ssh, msgbuf); sfree(msgbuf); s->publickey_blob = NULL; } } else { char *msgbuf; logeventf(ssh, "Unable to use this key file (%s)", key_type_to_str(keytype)); m� SGG� �&& q+4 <= len && \ ((q = q + 4 + GET_32BIT(p+q))!= 0) && q == len) \ result = TRUE; \ } \ } while(0) CHECK_HYPOTHESIS(4+1, maybe_int); CHECK_HYPOTHESIS(4+num+1, maybe_str); #undef CHECK_HYPOTHESIS if (maybe_int && !maybe_str) is_int = TRUE; else if (!maybe_int && maybe_str) is_int = FALSE; else /* Crikey. Either or neither. Panic. */ is_plausible = FALSE; } } ssh->exitcode = 128; /* means `unknown signal' */ if (is_plausible) { if (is_int) { /* Old non-standard OpenSSH. */ int signum = ssh_pkt_getuint32(pktin); fmt_sig = dupprintf(" %d", signum); ssh->exitcode = 128 + signum; } else { /* As per RFC 4254. */ char *sig; int siglen; ssh_pkt_getstring(pktin, &sig, &siglen); /* Signal name isn't supposed to be blank, but * let's cope gracefully if it is. */ if (siglen) { fmt_sig = dupprintf(" \"%.*s\"", siglen, sig); } /* * Really hideous method of translating the * signal description back into a locally * meaningful number. */ if (0) ; #define TRANSLATE_SIGNAL(s) \ else if (siglen == lenof(#s)-1 && !memcmp(sig, #s, siglen)) \ ssh->exitcode = 128 + SIG ## s #ifdef SIGABRT TRANSLATE_SIGNAL(ABRT); #endif #ifdef SIGALRM TRANSLATE_SIGNAL(ALRM); #endif #ifdef SIGFPE TRANSLATE_SIGNAL(FPE); #endif #ifdef SIGHUP TRANSLATE_SIGNAL(HUP); #endif #ifdef SIGILL TRANSLATE_SIGNAL(ILL); #endif #ifdef SIGINT TRANSLATE_SIGNAL(INT); #endif #ifdef SIGKILL TRANSLATE_SIGNAL(KILL); #endif #ifdef SIGPIPE TRANSLATE_SIGNAL(PIPE); #endif #ifdef SIGQUIT TRANSLATE_SIGNAL(QUIT); #endif #ifdef SIGSEGV TRANSLATE_SIGNAL(SEGV); #endif #ifdef SIGTERM TRANSLATE_SIGNAL(TERM); #endif #ifdef SIGUSR1 TRANSLATE_SIGNAL(USR1); #endif #ifdef SIGUSR2 TRANSLATE_SIGNAL(USR2); #endif #undef TRANSLATE_SIGNAL else ssh->exitcode = 128; } core = ssh2_pkt_getbool(pktin); ssh_pkt_getstring(pktin, &msg, &msglen); if (msglen) { fmt_msg = dupprintf(" (\"%.*s\")", msglen, msg); } /* ignore lang tag */ } /* else don't attempt to parse */ logeventf(ssh, "Server exited on signal%s%s%s", fmt_sig, core ? " (core dumped)" : "", fmt_msg); if (*fmt_sig) sfree(fmt_sig); if (*fmt_msg) sfree(fmt_msg); reply = SSH2_MSG_CHANNEL_SUCCESS; } } else { /* * This is a channel request we don't know * about, so we now either ignore the request * or respond with CHANNEL_FAILURE, depending * on want_reply. */ reply = SSH2_MSG_CHANNEL_FAILURE; } if (want_reply) { pktout = ssh2_pkt_init(reply); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_send(ssh, pktout); } } static void ssh2_msg_global_request(Ssh ssh, struct Packet *pktin) { char *type; int typelen, want_reply; struct Packet *pktout; ssh_pkt_getstring(pktin, &type, &typelen); Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1642da5ec1a55e1610d56abf0df8005c Text-delta-base-sha1: 4a6cf9a64d508d41c0553366384a34eea383354b Text-content-length: 277 Text-content-md5: 204de6b249cabac10ecdc41b36d654c6 Text-content-sha1: 22745bf90cdc75b8e90bd81ea94b0be897e3d9a2 Content-length: 277 SVN���u�9�� 4X�3M/* whole-packet operations *//* partial-packet operations */ void (*start) (void *); void (*bytes) (void *, unsigned char const *, int); void (*genresult) (void *, unsigned char *); int (*verresult) (void *, unsigned char const * Node-path: putty/sshmd5.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 38055193a3eb1d9dbcad42159910d47e Text-delta-base-sha1: ffa837e89c730cb2f8948d9bdad3d7252ce1bbb2 Text-content-length: 827 Text-content-md5: 9155dcd3db6b6fad6f7efed4879ec9ed Text-content-sha1: d11b3489266b35728ea8ae2ab56209cdbee895aa Content-length: 827 SVN��{-�f��ga�n�r/�;O�y{B,n3start(void *handle) { struct MD5Context *keys = (struct MD5Context *)handle; keys[2] = keys[0]; /* structure copy */ } static void hmacmd5_bytes(void *handle, unsigned char const *blk, int len) { struct MD5Context *keys = (struct MD5Context *)handle; MD5Update(&keys[2], blk, len); } static void hmacmd5_genresult(void *handle,2]; /* structure copy */static int hmacmd5_verresult(void *handle, unsigned char const *hmac) { unsigned char correct[16]; hmacmd5_genresult(handle, correct); return !memcmp(correct, hmachmacmd5_start(handle); hmacmd5_bytes(handle, blk, len); if (blk2) hmacmd5_bytes(handle, blk2, len2); hmacmd5_genresult(handle, hmachmacmd5_start, hmacmd5_bytes, hmacmd5_genresult, hmacmd5_verresult Node-path: putty/sshsha.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d810a0a16f907825eecec2012b4d9c08 Text-delta-base-sha1: 9a2b8a3971df9c86117c766b326b874089a37d28 Text-content-length: 1671 Text-content-md5: 529dd7f23408a0c74b583d0bf6b88b8f Text-content-sha1: b5bdee3a157fc8290d6bc8ca447ad12a5a26da9c Content-length: 1671 SVN��*^[ �8��)9S�~/�"�egr�-*�r"�eE�I7�7F�70P�@aF�RP�Cg3hmacsha1_start(void *handle) { SHA_State *keys = (SHA_State *)handle; keys[2] = keys[0]; /* structure copy */ } static void hmacsha1_bytes(void *handle, unsigned char const *blk, int len) { SHA_State *keys = (SHA_State *)handle; SHA_Bytes(&keys[2], (void *)blk, len); } static void hmacsha1_genresult(void *handles = keys[2]; /* structure copy */unsigned char seqbuf[4]; seqbuf[0] = (unsigned char) ((seq >> 24) & 0xFF); seqbuf[1] = (unsigned char) ((seq >> 16) & 0xFF); seqbuf[2] = (unsigned char) ((seq >> 8) & 0xFF); seqbuf[3] = (unsigned char) ((seq) & 0xFF); hmacsha1_start(handle); hmacsha1_bytes(handle, seqbuf, 4); hmacsha1_bytes(handle, blk, len); hmacsha1_genresult(handlehmacsha1_verresult(void *handle, unsigned char const *hmac) { unsigned char correct[20]; hmacsha1_genresult(handle, correct); return !memcmp(correct, hmac, 20hmacsha1_96_genresult(void *handle, unsigned char *hmac) { unsigned char full[20]; hmacsha1_genresult(handle, full); memcpy(hmac, full, 12hmacsha1_96_verresult(void *handle, unsigned char const *hmac) { unsigned char correct[20]; hmacsha1_genresult(handle, correct); return !memcmp(correct, hmac, 12); } static int sha1_96hmacsha1_start, hmacsha1_bytes, hmacsha1_genresult, hmacsha1_verresulthmacsha1_start, hmacsha1_bytes, hmacsha1_96_genresult, hmacsha1_96_verresulthmacsha1_start, hmacsha1_bytes, hmacsha1_genresult, hmacsha1_verresulthmacsha1_start, hmacsha1_bytes, hmacsha1_96_genresult, hmacsha1_96_verresult Revision-number: 8335 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2008-11-26T12:51:48.643809Z K 7 svn:log V 30 Wishlist entry for VU#958563. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/ssh2-cbc-pktlen-weakness Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1878 Text-content-md5: ae770c7776bfe19dd9596df1ac26c10c Text-content-sha1: 4dccc589e9bc36eb5686dee586aa65375a172ac0 Content-length: 1888 PROPS-END SVN���HHHSummary: In CBC modes, decrypting the packet length can leak information Class: semi-bug Content-type: text/x-html-body Difficulty: tricky Priority: high Present-in: 2008-11-25 Absent-in: 0.49 Fixed-in: 2008-11-27 r8334 <p>There is an attack against the CBC-mode ciphers of SSH-2 that can allow an attacker to extract small parts of plaintext. The attack works by inserting a bogus block into the ciphertext stream such that it gets decrypted into a packet length and then seeing how much data the target consumes before reporting a MAC error. <p>PuTTY is intrinsically slightly more resistant to this attack than OpenSSH, as it has tighter restrictions on the packet lengths it will accept. As a result, against PuTTY, the attack has only a 2^-20 or 2^-21 probability of working. To put it another way, if the attacker can guess a certain 20 or 21 bits of a plaintext block, they can have that guess verified and extract a certain other 11 or 12 bits. <p>SDCTR-mode ciphers are not vulnerable to this attack. Since <a href="ssh2-ctr-modes">implementing them</a>, PuTTY has preferred them to CBC, and hence has only used CBC when talking to a server that was incapable of SDCTR. <p>PuTTY now also makes a deliberate effort to counter this problem by only trusting the packet length once the MAC on the packet has been verified. This causes extra work (since the MAC has to be checked for every possible packet length), and makes detection of genuine MAC errors slower, so it's only enabled when using a CBC cipher. In any case, it only defends the data sent by the server to the client. Client-to-server data need to be protected by similar action by the server. <p>This problem corresponds with <a href="http://www.kb.cert.org/vuls/id/958563">US-CERT VU#958563</a>. It is distinct from the previous <a href="ssh2-cbc-weakness">ssh2-cbc-weakness</a>. Revision-number: 8336 Prop-content-length: 232 Content-length: 232 K 8 svn:date V 27 2008-11-26T14:11:49.339663Z K 7 svn:log V 131 Fix a Windows-specific GSS crash introduced in r8326, which (again) apparently triggers in failure cases. Patch by Iain Patterson. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ac25cc9a1498e95c15fbe68ea26e159 Text-delta-base-sha1: 566cdb4a4f80851817a5e52a871a2dc3261e15c5 Text-content-length: 26 Text-content-md5: 7676fff4e79ff78423fcc5da18c88290 Text-content-sha1: 8e7d9f6830b17dbdc99aff152012c1918682783a Content-length: 26 SVN��<; ���%value Revision-number: 8337 Prop-content-length: 365 Content-length: 365 K 8 svn:date V 27 2008-11-26T14:30:58.642954Z K 7 svn:log V 266 Jacob correctly points out that I accidentally lost a clearing of s->gss_sndtok in r8326. I'm not sure it was strictly necessary, since even if there's no send token, gss_init_sec_context() is meant to explicitly make it empty, but it wasn't an intentional change. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99f3d4670e83893b82b94e43fca93821 Text-delta-base-sha1: e538ac60bd21d71dfff957e54a067bd59e9567ce Text-content-length: 89 Text-content-md5: d90cc89d3c4a216ed7b577e69f61ae99 Text-content-sha1: 67b99ee6e3431b647dcbe5c4ce1622b3e64da3f1 Content-length: 89 SVN����������������Sx ���D SSH_GSS_CLEAR_BUF(&s->gss_snd Revision-number: 8338 Prop-content-length: 310 Content-length: 310 K 8 svn:date V 27 2008-11-28T18:28:23.397736Z K 7 svn:log V 209 Move the code that reads the Windows clipboard into a trivial subthread, so that it won't deadlock if fetching the content of the clipboard turns out to depend on a network connection forwarded through PuTTY. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5cfc2c09f4e412e8a168d46aba093219 Text-delta-base-sha1: b5e44dfcc2cda241e66aa6a145fad585df2be139 Text-content-length: 3036 Text-content-md5: 2ec0eddcd4cf3b06cd7f785c444d36ed Text-content-sha1: 8a90d4e022519142a4e1d4a3e3449134cdec72f7 Content-length: 3036 SVN����!}�{��Iy�'?B�oc_�)@#define WM_GOT_CLIPDATA (WM_APP + 6static int process_clipdata(HGLOBAL clipdata, int unicodestatic wchar_t *clipboard_contents; static size_t clipboard_lengthcase WM_GOT_CLIPDATA: if (process_clipdata((HGLOBAL)lParam, wParam)) term_do_paste(term);�]�s��#Zt�W+}�h if (wParam == VK_INSERT && shift_state == 1) { term_do_paste(term); return 0; } if (left_alt && wParam == VK_F4 && cfg.alt_f4) { return -1; } if (left_alt && wParam == VK_SPACE && cfg.alt_space) { SendMessage(hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0); retstatic DWORD WINAPI clipboard_read_threadfunc(void *param) { HWND hwnd = (HWND)param; HGLOBAL clipdata; SendMessage(hwnd, WM_GOT_CLIPDATA, (WPARAM)1, (LPARAM)clipdata); } else if ((clipdata = GetClipboardData(CF_TEXT))) { SendMessage(hwnd, WM_GOT_CLIPDATA, (WPARAM)0, (LPARAM)clipdata); } CloseClipboard(); } return 0; } static int process_clipdata(HGLOBAL clipdata, int unicode) { static wchar_t *converted = 0; sfree(clipboard_contents); clipboard_contents = NULL; clipboard_length = 0; if (unicode) { wchar_t *p = GlobalLock(clipdata); wchar_t *p2; if (p) { /* Unwilling to rely on Windows having wcslen() */ for (p2 = p; *p2; p2++); clipboard_length = p2 - p; clipboard_contents = snewn(clipboard_length + 1, wchar_t); memcpy(clipboard_contents, p, clipboard_length * sizeof(wchar_t)); clipboard_contents[clipboard_length] = L'\0'; return TRUE; } } else { char *s = GlobalLock(clipdata); int i; if (s) { i = MultiByteToWideChar(CP_ACP, 0, s, strlen(s) + 1, 0, 0); clipboard_contents = snewn(i, wchar_t); MultiByteToWideChar(CP_ACP, 0, s, strlen(s) + 1, clipboard_contents, i); clipboard_length = i - 1; clipboard_contents[clipboard_length] = L'\0'; return TRUE; } } return FALSE; } void request_paste(void *frontend) { /* * I always thought pasting was synchronous in Windows; the * clipboard access functions certainly _look_ synchronous, * unlike the X ones. But in fact it seems that in some * situations the contents of the clipboard might not be * immediately available, and the clipboard-reading functions * may block. This leads to trouble if the application * delivering the clipboard data has to get hold of it by - * for example - talking over a network connection which is * forwarded through this very PuTTY. * * Hence, we spawn a subthread to read the clipboard, and do * our paste when it's finished. The thread will send a * message back to our main window when it terminates, and * that tells us it's OK to paste. */ DWORD in_threadid; /* required for Win9x */ CreateThread(NULL, 0, clipboard_read_threadfunc, hwnd, 0, &in_threadid); } void get_clip(void *frontend, wchar_t **p, int *len) { if (p) { *p = clipboard_contents; *len = clipboard_length; } Revision-number: 8339 Prop-content-length: 106 Content-length: 106 K 7 svn:log V 7 Fixed. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-11-28T18:28:54.081865Z PROPS-END Node-path: putty-wishlist/data/rdesktop-paste-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c6ee8a640f987f2054b4cb7ad762e2b Text-delta-base-sha1: e299b7d22f7b2b880b83a56f6f8a3a0295b95d69 Text-content-length: 46 Text-content-md5: 17ed22c7e47116441bc434a2a688537f Text-content-sha1: 926c37f5f10d9cc075a354533768df8881e2faf6 Content-length: 46 SVN��Up ���=Fixed-in: 2008-11-29 r833 Revision-number: 8340 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.520627Z PROPS-END Revision-number: 8341 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.524542Z PROPS-END Revision-number: 8342 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.531467Z PROPS-END Revision-number: 8343 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.642126Z PROPS-END Revision-number: 8344 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.645793Z PROPS-END Revision-number: 8345 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.654572Z PROPS-END Revision-number: 8346 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.738378Z PROPS-END Revision-number: 8347 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.742058Z PROPS-END Revision-number: 8348 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.745434Z PROPS-END Revision-number: 8349 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.861902Z PROPS-END Revision-number: 8350 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-29T00:34:25.912266Z PROPS-END Revision-number: 8351 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-30T00:34:34.403393Z PROPS-END Revision-number: 8352 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-11-30T00:34:34.474829Z PROPS-END Revision-number: 8353 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 60 Mention the name "winadj@putty.projects.tartarus.org" here. K 10 svn:author V 5 jacob K 8 svn:date V 27 2008-11-30T19:42:50.024250Z PROPS-END Node-path: putty-wishlist/data/flow-control Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7815b685c1dffc8d159f946ec4441c37 Text-delta-base-sha1: 66baf3026e43eb68f9cabe0c920c164f61f5763c Text-content-length: 159 Text-content-md5: c21cd7dfb2c83a313fe1c43613582b2c Text-content-sha1: f8aced168b132628caa5c5262351d316d54b3013 Content-length: 159 SVN��u{ ����t [<a href="http://tartarus.org/~simon/putty-snapshots/htmldoc/AppendixF.html#sshnames-channel">winadj@putty.projects.tartarus.org</a>] Revision-number: 8354 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2008-11-30T19:56:48.688393Z K 7 svn:log V 56 Note about noise in OpenSSH logs caused by this change. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/flow-control Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c21cd7dfb2c83a313fe1c43613582b2c Text-delta-base-sha1: f8aced168b132628caa5c5262351d316d54b3013 Text-content-length: 364 Text-content-md5: 9d2b9836c629d3237abc3346021f7ebc Text-content-sha1: ff8f4a01786c62f454a3d5d5c518d38231effd97 Content-length: 364 SVN��{U T�+�T�V%(The new channel requests emitted by PuTTY as part of this change can cause a lot of noise in the logs of the OpenSSH server -- "<tt>sshd[6386]: session_input_channel_req: no session 1 req winadj@putty.projects.tartarus.org</tt>". This should be mitigated as of <a href="https://bugzilla.mindrot.org/show_bug.cgi?id=1395">OpenSSH 5.1</a>.) Revision-number: 8355 Prop-content-length: 274 Content-length: 274 K 8 svn:date V 27 2008-11-30T21:35:33.914646Z K 7 svn:log V 173 As far as I can tell, "simple@putty.projects.tartarus.org" has always been implemented as a channel request, not a global one. Change documentation to match implementation. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/sshnames.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 86a93154e9d3e88499e32a40aacda6dc Text-delta-base-sha1: 0586879cf1b16234582484e973170b3879ca3e7d Text-content-length: 520 Text-content-md5: f3b5f5989a1b0350db9844dc2a86a40d Text-content-sha1: d3797e55895b85700da7a180259a009cf641b168 Content-length: 520 SVN��k.b�N�c� +�U4e� Kchannel} Connection protocol channel request names These names can be sent in a \cw{SSH_MSG_CHANNEn one channel open at a time in the current connection (that one being the one the request is sent on). The intention is that the server, knowing this, can set the window on that one channel to something very large, and leave flow control to TCP. There is no message-specific dataThere is no message-specific data. Servers MUST treat it as an unrecognised request and respond with Revision-number: 8356 Prop-content-length: 234 Content-length: 234 K 8 svn:date V 27 2008-11-30T21:46:39.908542Z K 7 svn:log V 133 Summary: Bombing out with 'Received SSH_MSH_CHANNEL_SUCCESS for "winadj@putty.projects.tartarus.org"' Class: semi-bug Priority: high K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winadj-success Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2125 Text-content-md5: 738c8914e7983abfdcaa9b1fe3ac86d4 Text-content-sha1: 81fd93ff75bc1e4aafa950710adb58fcc259e4dc Content-length: 2135 PROPS-END SVN���???Summary: Bombing out with 'Received SSH_MSH_CHANNEL_SUCCESS for "winadj@putty.projects.tartarus.org"' Class: semi-bug Priority: high Absent-in: 0.60 Present-in: 2008-03-28 Content-type: text/x-html-body <p> We've had a few reports of SSH connections bombing out with the following error message, reportedly under heavy load: <pre>PuTTY Fatal Error (X) Disconnected: Received SSH_MSH_CHANNEL_SUCCESS for "winadj@putty.projects.tartarus.org" [ OK ]</pre> <p> Reports: <ul> <li>E2E34FB668D4874FA28658B489F40BB0028F47DA@BP1XEUEX706-C.bp1.ad.bp.com <br>Using "Portable PuTTY from the Xming project" (not our code) <br>Server: SSH-2.0-OpenSSH_4.3 <li><a href="http://trac.filezilla-project.org/ticket/3452">FileZilla ticket #3452</a> <br>(but also reported with PSFTP 2008-03-28:r7934: E00B544DC95563489A6C43CCD571EDD304EF8AFB@somodd.som.umaryland.edu) <br>Reported as failure shortly after 1Gbyte of a file transfer. <li>OF31BAE29C.9F8D62FE-ON862574FF.00743D6C-852574FF.007508E8@notes.wachovia.com </ul> <p> This message has only existed in PuTTY since the <a href="flow-control.html">'flow-control'</a> feature was implemented, which was after we released 0.60; so <!-- XXX-REVIEW-BEFORE-RELEASE -->at the time of writing, only people using development snapshots, or third-party code incorporating development code, should be seeing this. We probably want to find out what's going on before we make a release with this feature in. <p> On the face of it, it looks like the SSH server is incorrectly responding to our unilaterally-defined channel request message with SUCCESS, which it should never do since it's something we made up. (<a href="http://tartarus.org/~simon/putty-snapshots/htmldoc/AppendixF.html#sshnames-channel">Our documentation</a> mandates a FAILURE response, but that's only a restatement of the RFC 4254 requirement for a FAILURE response to requests that aren't understood -- we don't expect any server to specifically handle this message.) <p> However, perhaps we're getting confused about the mapping of requests to responses, or something. Revision-number: 8357 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-02T00:36:15.419989Z PROPS-END Revision-number: 8358 Prop-content-length: 146 Content-length: 146 K 8 svn:date V 27 2008-12-01T20:28:35.419828Z K 7 svn:log V 46 Bit more info from one of our correspondents. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winadj-success Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 738c8914e7983abfdcaa9b1fe3ac86d4 Text-delta-base-sha1: 81fd93ff75bc1e4aafa950710adb58fcc259e4dc Text-content-length: 187 Text-content-md5: c974f5484f8a2b9a11d82490ac6bdb48 Text-content-sha1: f2e524231327c3da073d9f2d539a252bb8553c63 Content-length: 187 SVN��?A�+��c+�) 2008-12-01but also seen with 2008-12-01:r8355 <br>Server: SSH-2.0-OpenSSH_4.3 <br>Seems to happen readily -- a few "ls -ltr"s are sufficient to break it Revision-number: 8359 Prop-content-length: 310 Content-length: 310 K 7 svn:log V 211 Change the Unix version of Ssh_gss_name to be a gss_name_t rather than void *, and hence eliminate a few casts. The Windows definition is unchanged, but I daresay I've managed to stop it compiling nonetheless. K 10 svn:author V 3 ben K 8 svn:date V 27 2008-12-01T21:18:29.875901Z PROPS-END Node-path: putty/sshgss.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1f7a6c251c18e527a4c9a663bd6e3227 Text-delta-base-sha1: 28fdfa7dba2dccfe0c55408b94bd89e49512e645 Text-content-length: 18 Text-content-md5: adb1efe78338e98f436ddd75e583df14 Text-content-sha1: a0489d9665e8a4c6473366261dcff1eb0484fc5f Content-length: 18 SVN��s��O��$k Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1a65655dcc43cc961177babfefaa63b1 Text-delta-base-sha1: bf1b1969ef77295ff147c473ed3a85b2ce9bf8fe Text-content-length: 53 Text-content-md5: c757ec92c69bd69e0fabd36c7dfccd21 Text-content-sha1: ab600b0c492e5d90bc7b21e4de88e01f13f2037a Content-length: 53 SVN��4 �`��4_typedef gss_name_t Ssh_gss_name; Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 92560473dea4b78cf13c99021648c286 Text-delta-base-sha1: da96e5b92bffced1275eba38f3e092af0663e2b9 Text-content-length: 32 Text-content-md5: 4540cfc3b180079d70b424344b68adca Text-content-sha1: c99b898a44ee22542069ab9174685451a061501e Content-length: 32 SVN��U!�I��hb�RW�8 Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 44e7b4ece4f713d99527cfe9c69e8e95 Text-delta-base-sha1: 459721a0f9873f8b8a5538255f4ea31aeba065de Text-content-length: 48 Text-content-md5: 827a5a62efab99ff465598c50bc76e81 Text-content-sha1: 56a069ddf94c94ed8ef918a5b395a106e1469538 Content-length: 48 SVN��0L �-��,typedef void *Ssh_gss_name; Revision-number: 8360 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-02T00:36:20.580987Z PROPS-END Revision-number: 8361 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-02T00:36:20.694495Z PROPS-END Revision-number: 8362 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-02T00:36:20.890658Z PROPS-END Revision-number: 8363 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-02T00:36:21.032962Z PROPS-END Revision-number: 8364 Prop-content-length: 326 Content-length: 326 K 7 svn:log V 225 Add missing call to gtk_selection_clear_targets(), without which the list of selection targets offered by GTK PuTTY/pterm grows an extra copy of each of the three supported text formats every time the user makes a selection! K 10 svn:author V 5 simon K 8 svn:date V 27 2008-12-01T23:03:11.802538Z PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2dc7a1b395a027123fd46b7763b8159f Text-delta-base-sha1: b2b43cee313f56fb0ac46ca47f37dffb97294e9f Text-content-length: 155 Text-content-md5: 40a6a7ab2b16d31c8d97d7c18981a066 Text-content-sha1: be6cbd3edda5fe389feda6c8d7867108c5f788d9 Content-length: 155 SVN���� 1�~��Qnclear_targets(inst->area, GDK_SELECTION_PRIMARY);�*kAA�*�; inst->specialsitem1 = menuitem; MKMENUITEM(NULL, NULL); inst Revision-number: 8365 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-02T00:36:22.538014Z PROPS-END Revision-number: 8366 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-02T00:36:22.660633Z PROPS-END Revision-number: 8367 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-02T00:36:22.698437Z PROPS-END Revision-number: 8368 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-03T00:34:37.236746Z PROPS-END Revision-number: 8369 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-03T00:34:37.277964Z PROPS-END Revision-number: 8370 Prop-content-length: 223 Content-length: 223 K 7 svn:log V 122 At some point recently, Unix PuTTY started suffering build errors using -DNO_GSSAPI. Move some ifdefs around so it stops. K 10 svn:author V 5 simon K 8 svn:date V 27 2008-12-02T18:18:32.102514Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d90cc89d3c4a216ed7b577e69f61ae99 Text-delta-base-sha1: 67b99ee6e3431b647dcbe5c4ce1622b3e64da3f1 Text-content-length: 311 Text-content-md5: 02ee553af2b2b3dfffe570b0d47eac78 Text-content-sha1: 12246f5635d033302c183e75675b985ee15b423b Content-length: 311 SVN���� *�K�� \fndef NO_GSSAPI #include "sshgss.h" #endif����g�ulus = NULL; } if�x\!�`��M�O�T�r(p+q); \ if (q >= 0 #ifndef NO_GSSAPI int can_gssapi; int tried_gssapi; #endif#ifndef NO_GSSAPI#endif#ifndef NO_GSSAPI s->tried_gssapi = FALSE; #endif Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4540cfc3b180079d70b424344b68adca Text-delta-base-sha1: c99b898a44ee22542069ab9174685451a061501e Text-content-length: 38 Text-content-md5: 3a1aca1b2c4188c82c4ed6440ad79122 Text-content-sha1: fb507e57e0b9d7091a197cd94b52e650738f4b17 Content-length: 38 SVN��!!�i��%|#ifndef NO_GSSAPI Revision-number: 8371 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2008-12-03T00:06:38.506228Z K 7 svn:log V 68 gtk_selection_clear_targets() does not exist on GTK 1, so ifdef it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 40a6a7ab2b16d31c8d97d7c18981a066 Text-delta-base-sha1: be6cbd3edda5fe389feda6c8d7867108c5f788d9 Text-content-length: 177 Text-content-md5: c5cce7e79b01f9fa762cbdade7326a65 Text-content-sha1: d2e496d2218fd1898a899bd5288487aab5929004 Content-length: 177 SVN����d�o�d�-/#if GTK_CHECK_VERSION(2,0,0) gtk_selection_clear_targets(inst->area, GDK_SELECTION_PRIMARY); #endif�k$�k�_ITEM(menuitem), inst->specialsmenu) Revision-number: 8372 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-04T00:35:22.471813Z PROPS-END Revision-number: 8373 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2008-12-13T00:34:42.059154Z PROPS-END Revision-number: 8374 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2008-12-20T18:52:09.083279Z K 7 svn:log V 62 Cosmetic: clarify that term->xterm_mouse is not boolean, etc. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e82a5138266cb0c298250733c97f68bb Text-delta-base-sha1: f82d311bf38fcf9ecfbf5633fd334a7582bf60bc Text-content-length: 111 Text-content-md5: 4f1b6fa2dac77bb3293048f54a9621c3 Text-content-sha1: 93ce92dcfaf6033636fb2455bdc759863a924a25 Content-length: 111 SVN�����t��*y�"�700(normal)(inc. button drags)�Kd�K� compatibility(SCOANSI) Node-path: putty/terminal.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 14630571ae7a0477a0fa15f7a1e0023e Text-delta-base-sha1: f26e4e585f6a5c0c20834b3376d885d5ff357792 Text-content-length: 25 Text-content-md5: 600ef7790e3b82de55f0a6119c348cbc Text-content-sha1: bca5b5bc89823ab429a21e3b706f6a763bdb7075 Content-length: 25 SVN��QR ���6host Revision-number: 8375 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2008-12-20T19:02:09.994303Z K 7 svn:log V 143 "Derek" points out that reporting of wheel event coordinates to the host on Windows was relative to the screen origin, not the window origin. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ec0eddcd4cf3b06cd7f785c444d36ed Text-delta-base-sha1: 8a90d4e022519142a4e1d4a3e3449134cdec72f7 Text-content-length: 804 Text-content-md5: f8d651c601a94f2b33d61572c12436d5 Text-content-sha1: b89818704071e35d7d57053c7418c037269bdd19 Content-length: 804 SVN����Q��Q�LMouse wheel position is in screen coordinates for * some reason */ POINT p; p.x = X_POS(lParam); p.y = Y_POS(lParam); if (ScreenToClient(hwnd, &p)) { /* send a mouse-down followed by a mouse up */ term_mouse(term, b, translate_button(b), MA_CLICK, TO_CHR_X(p.x), TO_CHR_Y(p.y), shift_pressed, control_pressed, is_alt_pressed()); term_mouse(term, b, translate_button(b), MA_RELEASE, TO_CHR_X(p.x), TO_CHR_Y(p.y), shift_pressed, control_pressed, is_alt_pressed()); } /* else: not sure when this can fail */�]""�]�M_VSCROLL, SB_PAGEDOWN, 0); return 0; } if (wParam == VK_NEXT && shift_state == 2) { SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0); return 0; } Revision-number: 8376 Prop-content-length: 697 Content-length: 697 K 8 svn:date V 27 2008-12-20T19:43:20.579470Z K 7 svn:log V 596 "Derek" reports that the DECSLPP report of window-size-in-pixels (CSI 14 t) has width and height swapped. Since both a random xterm I have and <http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt> agree with him, I've changed ours. (This stuff appears to originate in dtterm, but I can't check the behaviour of that right now.) While I'm here, the are-we-iconified report (CSI 11 t) looks to have the wrong sense compared to the same sources, so swap that too. (All this has been this way since it was originally implemented in r1414, which doesn't cite a source. all-escapes is silent too.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f1b6fa2dac77bb3293048f54a9621c3 Text-delta-base-sha1: 93ce92dcfaf6033636fb2455bdc759863a924a25 Text-content-length: 63 Text-content-md5: e85b95449913fae39c867e687a7e9a1f Text-content-sha1: f88f320da1e2e51efa4cc4ccf611080267adc123 Content-length: 63 SVN���������dd�-��i:�='2t" : "\033[1y, x Revision-number: 8377 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2008-12-29T20:04:42.227402Z K 7 svn:log V 124 r8338 broke pasting with Shift-Ins and from the context menu on Windows. Divert these to use the request_paste() interface. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f8d651c601a94f2b33d61572c12436d5 Text-delta-base-sha1: b89818704071e35d7d57053c7418c037269bdd19 Text-content-length: 84 Text-content-md5: 206de6bb71c185512fb45772a1c7aeaa Text-content-sha1: 690a3aeda58da02fc6f5cb922f0444e623ecf514 Content-length: 84 SVN���� �K��#]request_paste(NULL� �W��irequest_paste(NULL Revision-number: 8378 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8379 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Log reason for failure to create a connection to a local X display. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-01-04T21:43:20.942621Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02ee553af2b2b3dfffe570b0d47eac78 Text-delta-base-sha1: 12246f5635d033302c183e75675b985ee15b423b Text-content-length: 245 Text-content-md5: feac11393f05503ac624bde51460cda4 Text-content-sha1: 38c24b926d28399d0d7859c5706629cf45934513 Content-length: 245 SVN����������������\?4�h��ue"�.. const char *x11er(x11err = x11_init(&c->u.x11.s, ssh->x11disp, c, addrstr, peerport, &ssh->cfg)) != NULL) { logeventf(ssh, "Local X11 connection failed: %s", x11err); Revision-number: 8380 Prop-content-length: 423 Content-length: 423 K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-01-04T22:24:08.948953Z K 7 svn:log V 322 Bah, I've bumped into this often enough. Change one unsatisfactory cast for another to shut up "warning: cast from pointer to integer of different size" (and hence a -Werror compile failure) when compiling for Unix with DEBUG defined on atreus (x86_64). Minimally checked that it doesn't introduce upset elsewhere (i386). PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 284e8cf1e48af3f43a43e000a435a5da Text-delta-base-sha1: 70fc4fa09f44ed10117c35161cc7d9008d8b0841 Text-content-length: 35 Text-content-md5: 16ee063dade94f1bd83536193f3435e3 Text-content-sha1: 87a97b3b054621edffa931af908d4ea97c4cccfa Content-length: 35 SVN��5C �?��v?unsigned long Revision-number: 8381 Prop-content-length: 344 Content-length: 344 K 8 svn:date V 27 2009-01-04T23:28:25.222194Z K 7 svn:log V 243 r8305 seems to have made Unix PuTTY rather over-keen on Unix-domain sockets; unless a protocol is explicitly specified with "tcp/foovax:0", it assume a Unix-domain socket, thus not allowing a remote display on a machine other than the client. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c4c5f16279248daaffe28fd23407470 Text-delta-base-sha1: a886db13981b01efee0131a2714d2da25eaad173 Text-content-length: 167 Text-content-md5: dfe8bfc019d6b5f83ae44eee96fb30ec Text-content-sha1: 793b2e9f52631df64841b7fc0f143eb6b23047be Content-length: 167 SVN��I �r� �, if (!*hostname || !strcmp(hostname, "unix")) disp->unixdomain = platform_uses_x11_unix_by_default; else disp->unixdomain = FALSE Revision-number: 8382 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2009-01-04T23:36:24.800085Z K 7 svn:log V 116 r8305 made platform_x11_best_transport[] obsolete, but there still seem to be a few instances around; expunge them. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/mac/macmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e2de896e81a954b941280cff2e6e2bbc Text-delta-base-sha1: f99e937222c505a5fd4b45278d702a6d79285feb Text-content-length: 65 Text-content-md5: c75cdf4f7939afb0afa73c23fffcff9f Text-content-sha1: 59a2f962e9bffa9464b0b414a78293cc82039d9e Content-length: 65 SVN��$! -�|��x,int platform_uses_x11_unix_by_default = FALSE Node-path: putty/macosx/osxmain.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9ab053f9bedccebbdb4275f1bf30b2ef Text-delta-base-sha1: bfa5a501272948fab15fd18a60b1bf370db88d5f Text-content-length: 20 Text-content-md5: f2a1d03dca106fd5eb99903a56d8d861 Text-content-sha1: 010f0c51b441696ecd22ef24b3a2a7eee4f66da9 Content-length: 20 SVN��}I ��h��a Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 43119745f419a38485870b75d7c31b82 Text-delta-base-sha1: 9fb797cd6b3dc66d1e14c9c21ca26f9affd794d3 Text-content-length: 19 Text-content-md5: 74752ea5cf96594c058f04226b189631 Text-content-sha1: e97140207b3b5a58d1a31b22f291d044030f2b3d Content-length: 19 SVN��K��K��L Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b569468f521f77986854ec082651932 Text-delta-base-sha1: 61df0b73a86fdd5107557dbcc000992403ce97ec Text-content-length: 20 Text-content-md5: 0e2e8bcdef280026f222dffbffa0f0a1 Text-content-sha1: ea124347808864e4cc9453e14c683c08a54eb978 Content-length: 20 SVN��wC ��&��Z Revision-number: 8383 Prop-content-length: 345 Content-length: 345 K 8 svn:date V 27 2009-01-05T01:01:58.588482Z K 7 svn:log V 244 Cope with a (non-standard) ENAMETOOLONG return from gethostname(); glibc will do this if the supplied buffer isn't big enough, which shouldn't lead to complete abandonment of X11 auth. (Would only have bitten with hostnames >255 chars anyway.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9d0d831b01fed7b5e7bd335750f82dc Text-delta-base-sha1: 4cfef99ad1c6d3790fa0d7048469c3624be47e18 Text-content-length: 110 Text-content-md5: 543e8a581641c96618b5421015c67f32 Text-content-sha1: 25a181317da29365990b63c044a7401208b0d35a Content-length: 110 SVN��u'R� ��0C�\#include <errno(gethostname(disp->hostname, len) < 0) && (errno != ENAMETOOLONG) Revision-number: 8384 Prop-content-length: 136 Content-length: 136 K 7 svn:log V 36 ...and fix an unlikely memory leak. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-01-05T01:15:06.311928Z PROPS-END Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 543e8a581641c96618b5421015c67f32 Text-delta-base-sha1: 25a181317da29365990b63c044a7401208b0d35a Text-content-length: 151 Text-content-md5: fb04f99346d7a5a1f4aa654e2093dfdd Text-content-sha1: d3f73f6d248e478414eaa99547d41305bcd8c3ee Content-length: 151 SVN��'j|�z�f�^6�disp->hostname = NULL; len = 128; do { len *= 2; disp->hostname = sresize(disp->hostname, sfree(disp->hostname); Revision-number: 8385 Prop-content-length: 528 Content-length: 528 K 8 svn:date V 27 2009-01-05T02:45:38.196975Z K 7 svn:log V 427 Add some hard-coded textual literal-IP representations of localhost to sk_hostname_is_local(), to catch the case where we're doing something like X11 forwarding over SSH through a proxy, and we've thus disabled local lookup of hostnames. (I think this is what's behind the report in <e9a86996-5dc2-4428-9b0c-c65693ca6351@m32g2000hsf.googlegroups.com> in comp.security.ssh, although I'd like to know more of the circumstances.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 414cab4a4b2fab9c02ac56e2244388b0 Text-delta-base-sha1: 36f17ba7a245b258e5ff32de53b7be4f45ad6ea5 Text-content-length: 84 Text-content-md5: 44a69b731aa53f555065c286432a44cf Text-content-sha1: 196962eeb422d71bd22db2f51dd42614b62871c0 Content-length: 84 SVN��5r <��� || !strcmp(name, "::1") || !strncmp(name, "127.", 4 Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 827638ad72f23c7611056d95c64f3f52 Text-delta-base-sha1: 33fdae301a070f1bad374f7441361da79ced6530 Text-content-length: 86 Text-content-md5: 41ccde4778edcd33523ed91854521906 Text-content-sha1: 6a7d4c9a22f2d2e0176e2078fd0c164404f6264f Content-length: 86 SVN��}: <�M��1L || !strcmp(name, "::1") || !strncmp(name, "127.", 4 Revision-number: 8386 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8387 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8388 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8389 Prop-content-length: 476 Content-length: 476 K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-01-05T19:39:27.073872Z K 7 svn:log V 375 r5080 didn't go far enough -- since 0.58, anyone on Unix who didn't previously have default settings for "bell overload" mode will have inherited a twitchy set of defaults where bells are disabled after 2ms and enabled after 5ms, rather than 2s and 5s as intended. This error has probably propagated into some people's saved sessions by now, but there's not much to be done. PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 758de66e4acf4a63a5341d91c1da4d57 Text-delta-base-sha1: d219c9107c1d1b1135007dbe6bc2fb7e28c74b2d Text-content-length: 127 Text-content-md5: 8b86375284cf34732cb218d31574e1f5 Text-content-sha1: 1b43a3df26343ba6ec9e45402a63b412bb7b3943 Content-length: 127 SVN��qQ`�,��y,�L% #ifdef PUTTY_UNIX_H *1000 #endif #ifdef PUTTY_UNIX_H *1000 #endif Revision-number: 8390 Prop-content-length: 257 Content-length: 257 K 8 svn:date V 27 2009-01-05T22:53:14.681065Z K 7 svn:log V 156 Be prepared for x11_setup_display() to return NULL (for instance, if DISPLAY has invalid contents). Simply refuse to try X forwarding in this circumstance. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: feac11393f05503ac624bde51460cda4 Text-delta-base-sha1: 38c24b926d28399d0d7859c5706629cf45934513 Text-content-length: 363 Text-content-md5: 567c91974f5c34cd27a250c74f961863 Text-content-sha1: edb15fdaaeb29107200f365d14dc088efa40970b Content-length: 363 SVN����������� �u� ��{ && (ssh->x11disp = x11_setup_display(ssh->cfg.x11_display, ssh->cfg.x11_auth, &ssh->cfg))) { logevent("Requesting X11 forwarding"�?I�P� �om�xG32BIT && (ssh->x11disp = x11_setup_display(ssh->cfg.x11_display, ssh->cfg.x11_auth, &ssh->cfg))) { logevent("Requesting X11 forwarding"); Revision-number: 8391 Prop-content-length: 407 Content-length: 407 K 7 svn:log V 306 sk_address_is_local() failed to cope when presented with a Unix-domain socket. This could cause Unix PuTTY to segfault when X forwarding over an SSH session through a proxy. (sk_getaddr() wouldn't cope either -- in that case, add an assertion to make it more obvious; I don't think it should ever happen.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-01-05T23:36:14.385886Z PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 44a69b731aa53f555065c286432a44cf Text-delta-base-sha1: 196962eeb422d71bd22db2f51dd42614b62871c0 Text-content-length: 231 Text-content-md5: 698c89505da0f4651adf978c5ac7dda8 Text-content-sha1: fef350ebc858d2b25b901c31fabd5b490e1a2c98 Content-length: 231 SVN��r=B�1��1�r9�Q! /* XXX not clear what we should return for Unix-domain sockets; let's * hope the question never arises */ assert(addr->superfamily != UNIX);if (addr->superfamily == UNIX) return 1; Revision-number: 8392 Prop-content-length: 153 Content-length: 153 K 8 svn:date V 27 2009-01-05T23:49:19.429571Z K 7 svn:log V 53 It's a new year (and there have even been checkins). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: abfb85ed5bf47462ec46c6a7045582b3 Text-delta-base-sha1: 926e571f2a6c1446d88882872bb5792ad7c03275 Text-content-length: 44 Text-content-md5: ae64841d0e1760821c4c0b427af78144 Text-content-sha1: 44748d23700dbf155f4955303ea91e5371089085 Content-length: 44 SVN�� �qPuTTY is copyright 1997-2009 Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f6427d267fc1d44ce28e8389bda6808e Text-delta-base-sha1: b2008090269a36c5582cab0906c1ff761c1fba1f Text-content-length: 22 Text-content-md5: e9df4b744809c5d4bc6bcf44b1fd120a Text-content-sha1: c656a33770f21e85939403153199c9c423fdbd44 Content-length: 22 SVN��bb �R��S9 Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 29bfe12c6b6ce925f9b24446163ad961 Text-delta-base-sha1: 0e48f1faa01bfdc680781ccbb2fa0526d27b1c0a Text-content-length: 20 Text-content-md5: 4d45839bc96f4979c1b5057016a770dd Text-content-sha1: 0164754fd8a98ff1fc869136c722f404d2f18368 Content-length: 20 SVN��``�j��uk9 Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6ee8dc3c5d4c632626394c74c9a81a9f Text-delta-base-sha1: 57209b5a9dfc25c62a63231c2b93d095180ff227 Text-content-length: 34 Text-content-md5: c75827d61f7a813384ed785ff41d7963 Text-content-sha1: 79238adadae5e05f76038e75b1bb1e44c3d3c123 Content-length: 34 SVN��__���a�mr99 Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9eb688ebf96994c1b124c3966f98379 Text-delta-base-sha1: 6bcacaddd8596ccf8acc446f743aa364276eacf6 Text-content-length: 29 Text-content-md5: 1c6e008b1a6569e44ae2259d015fe9a9 Text-content-sha1: 0338b9b91af50a221685308e2a0229a3e1b96dfb Content-length: 29 SVN���>��[?�m99 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b744b6037a48af8326a2c2672448d94 Text-delta-base-sha1: d8c149418c75b5ab3d7ab8b9c8477226014037cb Text-content-length: 45 Text-content-md5: df2174c661ff9642949680081bf0bd03 Text-content-sha1: ca84bb895977e040354eebfecbfdfbf9a14d7760 Content-length: 45 SVN���������JJ���P�^l99 Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0048470d3a284beae6fdf1887bf28b37 Text-delta-base-sha1: 1bbba2fc96472421c421ec04c8550ffe1d07f83b Text-content-length: 29 Text-content-md5: e077c43dc4e9bf54399ae61f57bde5f1 Text-content-sha1: ec7e29d989ac0f6c43050ff12460459488dc4064 Content-length: 29 SVN�� �-��L.�{99 Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: baa5ff7a284afa724d55ca9efdb362f3 Text-delta-base-sha1: 1af4b0837f3284c18c4272d989eec694c906765a Text-content-length: 29 Text-content-md5: e5e15f98760c7b0e84858ae248cbb988 Text-content-sha1: 6951b5804f11c09a814dd173402b5c937c6883f0 Content-length: 29 SVN��CC�d��Le�299 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 33d8fd5758478ae860af352d9b3d6712 Text-delta-base-sha1: 6e7f962b21e9a3d734e569c8ff291e6a7ec55765 Text-content-length: 22 Text-content-md5: 639f4c98843c04fd78e9af46bb8aface Text-content-sha1: 2a3672244753699695ad1bd07c88c327bb89f32d Content-length: 22 SVN��RR �\��u]9 Node-path: putty/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1b0b4b8219d3ba8acb0862ba492a3eb7 Text-delta-base-sha1: d9aede5950aabdf673b02e05bdc5d116d6080ae9 Text-content-length: 29 Text-content-md5: 50ce5c82fa16fb970b9c217e7216a33c Text-content-sha1: ede8ef8bb91b60339a51fb503e2b81ad041f6944 Content-length: 29 SVN��tt�k��Cl�D099 Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 49e8348e5bd54601a5ebf0df77efdd55 Text-delta-base-sha1: 39adb8b126d3362129c8f8f71cdd99a1c649e913 Text-content-length: 22 Text-content-md5: a52a0042ef51b91d0f4bc53b2f54bb9e Text-content-sha1: fc842505266023988b6062033841690080794bc8 Content-length: 22 SVN��ee �+��9,9 Revision-number: 8393 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2009-01-06T00:16:35.451372Z K 7 svn:log V 37 Remove a couple of unused variables. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 206de6bb71c185512fb45772a1c7aeaa Text-delta-base-sha1: 690a3aeda58da02fc6f5cb922f0444e623ecf514 Text-content-length: 40 Text-content-md5: cdeeb9aeafef5930b9f7454053d42326 Text-content-sha1: 15150616c1271d51d36cfdae7069c88e0cc0fce2 Content-length: 40 SVN���������[ ��G��k Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e629f4a8f4a7723c91fdf759a1fd20a1 Text-delta-base-sha1: 7d55415e2430b6f35f1066ba28f2dd0db375e7e6 Text-content-length: 22 Text-content-md5: 771dedcc68e1de746b1350fa23ebd504 Text-content-sha1: 5eba5713dcd93bfae7f331d52d4bb4217383dfda Content-length: 22 SVN��91 ��|��5 Revision-number: 8394 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2009-01-06T00:25:07.660258Z K 7 svn:log V 59 Rejig windlg.c:verify_ssh_host_key() to silence a warning. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a55f9a42bec20241c7310f80d64ffdf8 Text-delta-base-sha1: 49b0a31bd984a1245b72cc486609bf79895064c4 Text-content-length: 125 Text-content-md5: f4363892371a9068a56974d76449b5e6 Text-content-sha1: 9a7002057d385b8ca0f8cd667ac923b309d8f432 Content-length: 125 SVN��'V� ���~U�6felse if (ret == 2) {} else if (ret == 1) {} return 0; /* abandon the connection */ Revision-number: 8395 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8396 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8397 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8398 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8399 Prop-content-length: 399 Content-length: 399 K 7 svn:log V 298 Colin Watson reports a strange problem whereby krb5-config incorporates the environment variable CFLAGS into its output. Avoid exporting our version of it from the Makefile (which actually causes build failures, since quoting phase issues mean that the backticks in our version end up unexpanded). K 10 svn:author V 5 simon K 8 svn:date V 27 2009-01-08T18:18:14.698318Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ae36651291a28e8c9476862634faf06 Text-delta-base-sha1: 212d27fa5569f58887bb5f06e6451897c3862501 Text-content-length: 87 Text-content-md5: 228087913c9a97c52e2d5ff7760f15b1 Text-content-sha1: c305dd5c24c0ed7edfba711a9a9fd8a89ea18355 Content-length: 87 SVN��m= =�1��O"unexport CFLAGS # work around a weird issue with krb5-config Revision-number: 8400 Prop-content-length: 342 Content-length: 342 K 8 svn:date V 27 2009-01-08T18:19:52.519725Z K 7 svn:log V 241 Colin also suggests that we can replace the backticks in the GTK makefile with make's own $(shell ...) function, which means that gtk-config and krb5-config and so on only get run once per make invocation instead of once per gcc invocation. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 228087913c9a97c52e2d5ff7760f15b1 Text-delta-base-sha1: c305dd5c24c0ed7edfba711a9a9fd8a89ea18355 Text-content-length: 369 Text-content-md5: fe7bdf2d885ae08f9720966238868d9d Text-content-sha1: 93249201e1a89bc42f7b1ac0c47c4060c15f61f4 Content-length: 369 SVN��=eG�l��h]F�Xz�rK\$(shell \$(GTK_CONFIG) --cflags)"). " -D _FILE_OFFSET_BITS=64\n". "XLDFLAGS = \$(LDFLAGS) \$(shell \$(GTK_CONFIG) --libs)\$(shell \$(KRB5CONFIG) --cflags gssapi)\n". "XLDFLAGS+= \$(shell \$(KRB5CONFIG) --libs gssapi)\n". "ULDFLAGS = \$(shell \$(KRB5CONFIG) --libs gssapi)\n". "endif\n". "INSTALL=install Revision-number: 8401 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2009-01-08T18:21:33.423314Z K 7 svn:log V 88 Another patch from Colin, providing a "make distclean" target in the autoconf makefile. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fe7bdf2d885ae08f9720966238868d9d Text-delta-base-sha1: 93249201e1a89bc42f7b1ac0c47c4060c15f61f4 Text-content-length: 174 Text-content-md5: 11f93bd14d56b11d30b57dc762d51506 Text-content-sha1: 25419910da6d297e02059ec636603dd280be307b Content-length: 174 SVN��e �I��32distclean: clean\n". "\t". &splitline("rm -f config.status config.cache config.log ". "configure.lineno config.status.lineno Makefile" Revision-number: 8402 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8403 Prop-content-length: 1036 Content-length: 1036 K 8 svn:date V 27 2009-01-09T18:55:45.951547Z K 7 svn:log V 935 Weaken the assertion in general_textout(). It was failing in the case of double-width text (ESC # 3, ESC # 4, ESC # 6), because the string passed to it was not truncated to the same width as the clipping rectangle. (In fact, it _can't_ reliably be, in the case where the window width is odd.) So instead we just assert that we managed to _at least_ fill the clipping rectangle, not that we exactly filled it. The problem is easily reproduced by sending ESC # 8 (fill the screen with Es) followed by ESC # 3. It doesn't typically happen, though, if you _manually_ fill the screen with Es, because in that case PuTTY's terminal buffer ends up being filled with CSET_ACP | 'E' or similar, which means that general_textout() never gets called because one of the other branches of do_text_internal() does the work instead. ESC # 8 will fill the terminal buffer with genuine _Unicode_ 'E' characters, which exercises the failing code path. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cdeeb9aeafef5930b9f7454053d42326 Text-delta-base-sha1: 15150616c1271d51d36cfdae7069c88e0cc0fce2 Text-content-length: 43 Text-content-md5: 361b56938e9b4f22d849f5e882a8eb0f Text-content-sha1: 44277d24cb8d84cc33e1f4a554c69dbdd2b05242 Content-length: 43 SVN���� �B��=C>�[[��[� Revision-number: 8404 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8405 Prop-content-length: 148 Content-length: 148 K 8 svn:date V 27 2009-01-11T14:20:34.622821Z K 7 svn:log V 50 Propagate my ctype fixes (r8404) from libcharset. K 10 svn:author V 3 ben PROPS-END Node-path: putty/charset/localenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da348d574a2c614026013bd1d5fdfdb6 Text-delta-base-sha1: 0a24edad7aba159b0ffabae5de14b9f4558080d9 Text-content-length: 79 Text-content-md5: 6b9dc0abaac15879753f0ae5cc7e0d56 Text-content-sha1: 10b9d0dab59def6ee367aa0dd35166ee08abd51d Content-length: 79 SVN��q :�n��d if (tolower((unsigned char)*p) != tolower((unsigned char) Node-path: putty/charset/mimeenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60896157e6ef01c224569bd282b92375 Text-delta-base-sha1: fc38e6704eb7b881b2df9abb777df5e28f531bcb Text-content-length: 79 Text-content-md5: 85a7a92ad5cb33e753dc2fc3f29e0beb Text-content-sha1: 30787c1cc0d019bf9bb7f92d0d543db4e2161b4b Content-length: 79 SVN��Id :�#��B if (tolower((unsigned char)*p) != tolower((unsigned char) Node-path: putty/charset/xenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18e930734f475a7cf9ddde9da3920076 Text-delta-base-sha1: 3f1d0841293d264662afb3a5c83d08663c294227 Text-content-length: 79 Text-content-md5: 6a5737aaea9eda895100fc5fe3ce60e8 Text-content-sha1: 0c9c2a28c4aa90b2af911de371e9ebb0c7777299 Content-length: 79 SVN�� :�_��~ if (tolower((unsigned char)*p) != tolower((unsigned char) Revision-number: 8406 Prop-content-length: 329 Content-length: 329 K 8 svn:date V 27 2009-01-11T14:26:27.629502Z K 7 svn:log V 230 Arguments to ctype functions are required to be either EOF or representable as unsigned char. This means that passing in a bare char is incorrect on systems where char is signed. Sprinkle some appropriate casts to prevent this. K 10 svn:author V 3 ben PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bcf7b05d2bd660b5395631f308f74691 Text-delta-base-sha1: 436710a54ef9550f60c8bc75bf48fe466c71e89d Text-content-length: 39 Text-content-md5: 8cf91242c670b6e1a0dd9abd82593303 Text-content-sha1: 5bf8f630e7847b18614918c0318744ae11abe6c1 Content-length: 39 SVN��u ���n(unsigned char) Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a4d85ae3e82dacf1d662ec5f79afdd9c Text-delta-base-sha1: 547b0e3262c450e0e9407a9eb8452af90104af4f Text-content-length: 36 Text-content-md5: 2c40b5c4d03223ab10f15ace64c807bd Text-content-sha1: 4deb050f700312a1b25bd1023a515e48681c0c21 Content-length: 36 SVN��Yh �J��J(unsigned char) Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e85b95449913fae39c867e687a7e9a1f Text-delta-base-sha1: f88f320da1e2e51efa4cc4ccf611080267adc123 Text-content-length: 70 Text-content-md5: 9718a788858d7669f028daad8426a8a1 Text-content-sha1: c5be52d1c48fd72be997ddac27e8b1512ddf649e Content-length: 70 SVN���������dp �h��lx c = toupper((unsigned char) Revision-number: 8407 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2009-01-12T10:53:37.067021Z K 7 svn:log V 89 Summary: MSI installer for PuTTY on Windows Class: wish Priority: low Difficulty: tricky K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/msi-installer Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 739 Text-content-md5: c2fc57e26c38fbc0c0657ed492453563 Text-content-sha1: c478d70bad7f2adac8f6dac69fb5cbde684524e1 Content-length: 749 PROPS-END SVN���UUUSummary: MSI installer for PuTTY on Windows Class: wish Priority: low Difficulty: tricky Content-type: text/x-html-body <p> A few people have expressed a desire for an MSI-based Windows installer for PuTTY. Apparently MSI is easier/possible to deploy via various software deployment mechanisms (Group Policy, SMS, Active Directory), compared to our current <a href="http://www.innosetup.com/isinfo.php">Inno Setup</a> installer. <p> Apparently <a href="http://wix.sourceforge.net/">WiX</a> is a free thing that will create MSI-based installers. <a href="http://www.installsite.org/pages/en/msi/authoring.htm">This page</a> lists some others. <p> WiX script: <tt>B9638CACBA387E48927BB56B6A1555070DA08E@svr1.irtnog.org</tt> Revision-number: 8408 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8409 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8410 Prop-content-length: 979 Content-length: 979 K 8 svn:date V 27 2009-01-12T20:41:28.923711Z K 7 svn:log V 878 Patch from Gert-Jan Vons: create an event handle to go in the OVERLAPPED structure in output threads, as we already do for input threads. This apparently sorts out a hanging issue with serial ports when trying to do simultaneous read and write, because (GJV says, and it sounds plausible to me) in the absence of that event object Windows signals the file handle itself to notify GetOverlappedResult that it can return - and since the file handle might be being signalled by a read operation instead, that leads to ambiguity. Using an explicit event object in both directions means Windows always knows which way the data is going. Also a trivial fix in handle_output_new(), which was referencing the wrong element of a union due to a copy and paste error. (Since the result was address-taken and cast to void *, this wasn't a functional error, but it was conceptually wrong.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f771bb4f71270413bff5d46ef180f82c Text-delta-base-sha1: b991b3a5d59f5b48f7cf82a192311d636196699e Text-content-length: 176 Text-content-md5: c243aeb0e17d5eec0204f6a69979c7a3 Text-content-sha1: d24746ee4957fbdb6da9950b31be49b70d90f776 Content-length: 176 SVN��","�[��u� AI�Yu�H�>dHANDLE oev; int writeret { memset(povl, 0, sizeof(OVERLAPPED)); povl->hEvent = oev; } if (povl) CloseHandle(oev);o Revision-number: 8411 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2009-01-13T18:18:35.561260Z K 7 svn:log V 57 Check the two popen() calls in noise_get_heavy for NULL. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnoise.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5952cf99d009e4ec0ec756938e592293 Text-delta-base-sha1: 4016b23facc86597cc284890373cbe3661daf1a3 Text-content-length: 759 Text-content-md5: 0df78d39017eacbe90d703ec5526130c Text-content-sha1: 416ef1908d3f94d9cfcc75436b88e819e019b309 Content-length: 759 SVN�� /[�o��)d>�<Pstdlib.h> #include <errno.h> int got_dev_urandom = 0; if (read_dev_urandom(buf, 32)) { got_dev_urandom = 1; func(buf, 32); } fp = popen("ps -axu 2>/dev/null", "r"); if (fp) { while ( (ret = fread(buf, 1, sizeof(buf), fp)) > 0) func(buf, ret); pclose(fp); } else if (!got_dev_urandom) { fprintf(stderr, "popen: %s\n" "Unable to access fallback entropy source\n", strerror(errno)); exit(1); } fp = popen("ls -al /tmp 2>/dev/null", "r"); if (fp) { while ( (ret = fread(buf, 1, sizeof(buf), fp)) > 0) func(buf, ret); pclose(fp); } else if (!got_dev_urandom) { fprintf(stderr, "popen: %s\n" "Unable to access fallback entropy source\n", strerror(errno)); exit(1); } Revision-number: 8412 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8413 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8414 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8415 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8416 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8417 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8418 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8419 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8420 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8421 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8422 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8423 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8424 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8425 Prop-content-length: 384 Content-length: 384 K 7 svn:log V 283 Don't call ReleaseCapture() on any mouse-button-up event. Instead, only call it when the _last_ mouse button comes back up. Otherwise, xterm mouse tracking will lose a button-up event if you press down two buttons, move the mouse outside the window, then release them one at a time. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-01-21T18:47:03.870171Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 361b56938e9b4f22d849f5e882a8eb0f Text-delta-base-sha1: 44277d24cb8d84cc33e1f4a554c69dbdd2b05242 Text-content-length: 754 Text-content-md5: a610b6444aee68b91ddf5adf22163030 Text-content-sha1: eb889be19ceff3426bb39dc844a77c2889be483b Content-length: 754 SVN����c���M~�ua�YVwParam |= MK_LBUTTONwParam |= MK_MBUTTON; press = 1; break; case WM_RBUTTONDOWN: button = MBT_RIGHT; wParam |= MK_RBUTTON; press = 1; break; case WM_LBUTTONUP: button = MBT_LEFT; wParam &= ~MK_LBUTTON; press = 0; break; case WM_MBUTTONUP: button = MBT_MIDDLE; wParam &= ~MK_MBUTTON; press = 0; break; case WM_RBUTTONUP: button = MBT_RIGHT; wParam &= ~MK_RBUTTONif (!(wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON))) �[,QQ�[�, 0); return 0; } if (wParam == VK_PRIOR && shift_state == 2) { SendMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0); return 0; } if (wParam == VK_NEXT && shift_state == 1) { SendMessage(hwnd, W Revision-number: 8426 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8427 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8428 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8429 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8430 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8431 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8432 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8433 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8434 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8435 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8436 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8437 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8438 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8439 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8440 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8441 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8442 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8443 Prop-content-length: 675 Content-length: 675 K 8 svn:date V 27 2009-02-03T21:22:52.378198Z K 7 svn:log V 574 The Windows config option to point at an X authority file is only read at connection setup time, so don't offer it in the Change Settings dialog box. (In particular, this fixes an assertion failure when selecting Change Settings on a non-SSH connection, since wincfg.c would have added that control to Connection/SSH/X11 when the parent panel Connection/SSH didn't exist. Making the control conditional on the selected protocol would have been sufficient to fix that failure, but I now realise that the setting should never have been presented in mid-session in any case.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 87d6e073ac24da92bc7ec96c53891aa3 Text-delta-base-sha1: ad80c011a7160e277f4a8999ae8403d7a032bd30 Text-content-length: 36 Text-content-md5: 6607bb51a148b820b100c0860dc05849 Text-content-sha1: 8edc77bc55c55c26f86eb5af61aae9df21849c8d Content-length: 36 SVN��s �4��?4!midsession && Revision-number: 8444 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8445 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8446 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8447 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8448 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8449 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8450 Prop-content-length: 113 Content-length: 113 K 8 svn:date V 27 2009-02-20T19:12:58.621869Z K 7 svn:log V 13 Fix linkrot. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/ssh-url-scheme Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db00b926f6b24ef5bcb50ea94ff2d554 Text-delta-base-sha1: 3e63c7f4522582dfcf140177e5421dce7c1b4a25 Text-content-length: 54 Text-content-md5: 8014e75ebc81e1d8c2ec0ad654a31fc7 Text-content-sha1: fff0586ec3d54fea2d924086a4db79eb6b0392a5 Content-length: 54 SVN��H5 "�H��K}en-us/library/aa767914(VS.85).aspx Revision-number: 8451 Prop-content-length: 179 Content-length: 179 K 7 svn:log V 79 Update with someone else's investigation and more details of existing reports. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-02-22T11:47:06.334935Z PROPS-END Node-path: putty-wishlist/data/win-plink-stdin-handle-invalid Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56a10491456d1bee21bca6390d7e559d Text-delta-base-sha1: ad6917035e8b27a016dc06c19eac4047098e3cce Text-content-length: 613 Text-content-md5: 01d8e7d7970ec06b54095863e86ac27b Text-content-sha1: ebbe361629cb2fab6dcc329d20ce5ca20e33dd44 Content-length: 613 SVN��=PR�~�R (rsync under Cygwin; <em>different</em> error with 0.58, "Unable to write to standard output"; works in Cygwin pipe) <li>4da424620707191404i2efbff0che659f39e97f8cd84@mail.gmail.com (rsync under Cygwin) <li>46AA3477.1030701@bellsouth.net (BAT file, so not Cygwin? Regression since 0.58) <li>66E3124EE70FB04A96C81EF18C6C18B306086FE3@ex1.globus (works from Windows command shell, fails from SQL Server script) </ul> <p> <a href="http://diario.beerensalat.info/2009/02/13/rsync_does_work_with_plink.html">This blog posting</a> suggests an understanding of the problem with Cygwin rsync at least. Revision-number: 8452 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8453 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8454 Prop-content-length: 114 Content-length: 114 K 7 svn:log V 14 Another clue. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-02-22T12:10:53.196498Z PROPS-END Node-path: putty-wishlist/data/unclean-close-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eefe6785cac688293d8e5d0c3ca8e394 Text-delta-base-sha1: 51294c682b1866b434a730e09b2543a432c06167 Text-content-length: 134 Text-content-md5: e6285a234cf270675fd9035047704112 Text-content-sha1: 9eb3ffee43aa2a7a44393b2b49e56ecff75fbd63 Content-length: 134 SVN��B/j� ��p _�Iy 2009-02-10li>141902151.20090211120208@kilgus.net <br>2009-02-10; <em>evidence of use of freed memory</em> Revision-number: 8455 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8456 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8457 Prop-content-length: 126 Content-length: 126 K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-02-22T12:27:31.803992Z K 7 svn:log V 26 Current thoughts on this. PROPS-END Node-path: putty-wishlist/data/assert-line-not-null Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 798987dc5defe660a4ac72ca3b5ba268 Text-delta-base-sha1: 814edfdadd5785a2b7c7a42367bd9b0129eb4827 Text-content-length: 228 Text-content-md5: 778b43609b9e7701cb6d2280994ac905 Text-content-sha1: 3097a43af9a61e8dd41caa8e44204e910ba03360 Content-length: 228 SVN��a- L�i�L�xi (fixed in 0.60). <p> In fact, in general, we suspect this is a symptom of some sort of memory corruption to which this assertion is particularly sensitive, rather than evidence of a direct logical error Revision-number: 8458 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8459 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8460 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8461 Prop-content-length: 519 Content-length: 519 K 8 svn:date V 27 2009-02-23T22:40:09.821561Z K 7 svn:log V 418 Stop attempting to make session logs private on Unix. This was introduced in r7084 at the same time as sensible permissions when writing private key files; however, it causes an assertion failure whenever an attempt is made to append to an existing log file on Unix, and it's not clear what "is_private" *should* do for append, so revert to log file security being the user's responsibility. (Fixes Ubuntu LP#212711.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c40b5c4d03223ab10f15ace64c807bd Text-delta-base-sha1: 4deb050f700312a1b25bd1023a515e48681c0c21 Text-content-length: 25 Text-content-md5: 25088e5260a54bed52852a6cb3f68c04 Text-content-sha1: 6c8ce5589fe150879adc246d0ffcbba897863584 Content-length: 25 SVN��hi �2��35FALS Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5990d6331ef0c00cc1b5eddf4ea77f4 Text-delta-base-sha1: ff14791ebc16e1c735c63f024cabd76b60e4d56f Text-content-length: 50 Text-content-md5: ac5c2a098833fa20881e08ad23b073f2 Text-content-sha1: f94f6247fdef39ee29b78fe484464264b46acd12 Content-length: 50 SVN��^| �R�� Q, and tricky for appen Revision-number: 8462 Prop-content-length: 1212 Content-length: 1212 K 7 svn:log V 1110 Since r8305, Unix PuTTY has always "upgraded" an X11 display like "localhost:0" to a Unix-domain socket. This typically works fine when PuTTY is run on the same machine as the X server, but it's broken multi-hop X forwarding through OpenSSH; when OpenSSH creates a proxy X server "localhost:10", it only listens on TCP, not on a Unix-domain socket. Instead, when deciding on the details of the display, we actively probe to see if there's a Unix-domain socket we can use instead, and only use it if it's there, falling back to the specified IP "localhost" if not. Independently, when looking for local auth details in Xauthority for a "localhost" TCP display, we prefer a matching Unix-domain entry, but will fall back to an IP "localhost" entry (which would be unusual, but we don't trust a Windows X server not to do it) -- this is a generalisation of the special case added in r2538 (but removed in r8305, as the automatic upgrade masked the need for it). (This is now done in platform-independent code, so a side-effect is that get_hostname() is now part of the networking abstraction on all platforms.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-02-24T01:01:23.612406Z PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ee9755d910f5634e52cbc68b65413115 Text-delta-base-sha1: f9eeac9428071250b1d7d0088f1c2d16ad15bd75 Text-content-length: 129 Text-content-md5: 807ae71257125276ac3e7d534a2c0c6d Text-content-sha1: 219a5c33f09ecea3df5d1c9117810d05b079b071 Content-length: 129 SVN��yj k��k��y * Look up the local hostname; return value needs freeing. * May return NULL. */ char *get_hostname(void Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb04f99346d7a5a1f4aa654e2093dfdd Text-delta-base-sha1: d3f73f6d248e478414eaa99547d41305bcd8c3ee Text-content-length: 20 Text-content-md5: 3cb8f269dc837972479b7e874546339b Text-content-sha1: 75f39bcbc3ed1275b4944bb183a38b59dc0da136 Content-length: 20 SVN��j ��[��*@ Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 698c89505da0f4651adf978c5ac7dda8 Text-delta-base-sha1: fef350ebc858d2b25b901c31fabd5b490e1a2c98 Text-content-length: 355 Text-content-md5: ef69ffcbb3c031c297a5b55637639c90 Text-content-sha1: 28d19cb90cbf161a3a58bec4b30453b1f08bd3bd Content-length: 355 SVN��= G��G�4 char *get_hostname(void) { int len = 128; char *hostname = NULL; do { len *= 2; hostname = sresize(hostname, len, char); if ((gethostname(hostname, len) < 0) && (errno != ENAMETOOLONG)) { sfree(hostname); hostname = NULL; break; } } while (strlen(hostname) >= len-1); return hostname Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 41ccde4778edcd33523ed91854521906 Text-delta-base-sha1: 6a7d4c9a22f2d2e0176e2078fd0c164404f6264f Text-content-length: 368 Text-content-md5: 91eaf7d45da4e187f81746213e0b2d27 Text-content-sha1: 78292ed363a8a9fd61ae82d67ad6cb36f17a83b3 Content-length: 368 SVN��:]H���e�7L'�<~int, gethostname, (char *, innamechar *get_hostname(void) { int len = 128; char *hostname = NULL; do { len *= 2; hostname = sresize(hostname, len, char); if (p_gethostname(hostname, len) < 0) { sfree(hostname); hostname = NULL; break; } } while (strlen(hostname) >= len-1); return hostname Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dfe8bfc019d6b5f83ae44eee96fb30ec Text-delta-base-sha1: 793b2e9f52631df64841b7fc0f143eb6b23047be Text-content-length: 4177 Text-content-md5: 62dd748022c8612b31aeead895758cd3 Text-content-sha1: b283a0870c1ae8016e45d1f74dd53933d57176df Content-length: 4177 SVN��oNu�'�U�I%� l�om�|z�?8�!ne�< �wZ�)QU�,*�'t/* Do-nothing "plug" implementation, used by x11_setup_display() when it * creates a trial connection (and then immediately closes it). * XXX: bit out of place here, could in principle live in a platform- * independent network.c or something */ static void dummy_plug_log(Plug p, int type, SockAddr addr, int port, const char *error_msg, int error_code) { } static int dummy_plug_closing (Plug p, const char *error_msg, int error_code, int calling_back) { return 1; } static int dummy_plug_receive(Plug p, int urgent, char *data, int len) { return 1; } static void dummy_plug_sent(Plug p, int bufsize) { } static int dummy_plug_accepting(Plug p, OSSocket sock) { return 1; } static const struct plug_function_table dummy_plug = { dummy_plug_log, dummy_plug_closing, dummy_plug_receive, dummy_plug_sent, dummy_plug_accepting }; disp->addr = NULL disp->addr!disp->unixdomain)Try upgrading an IP-style localhost display to a Unix-socket * display (as the standard X connection libraries do). */ if (!disp->unixdomain && sk_address_is_local(disp->addr)) { SockAddr ux = platform_get_x11_unix_address(NULL, disp->displaynum); const char *err = sk_addr_error(ux); if (!err) { /* Create trial connection to see if there is a useful Unix-domain * socket */ const struct plug_function_table *dummy = &dummy_plug; Socket s = sk_new(sk_addr_dup(ux), 0, 0, 0, 0, 0, (Plug)&dummy); err = sk_socket_error(s); sk_close(s); } if (err) { sk_addr_free(ux); } else { sk_addr_free(disp->addr); disp->unixdomain = TRUE; disp->addr = ux; /* Fill in the rest in a moment */ } } if (disp->unixdomain) { if (!disp->addr) disp->addr = platform_get_x11_unix_address(disp->unixsocketpath, int ideal_match = FALSE; char *ourhostname = get_hostname(); /* * Normally we should look for precisely the details specified in * `disp'. However, there's an oddity when the display is local: * displays like "localhost:0" usually have their details stored * in a Unix-domain-socket record (even if there isn't actually a * real Unix-domain socket available, as with OpenSSH's proxy X11 * server). * * This is apparently a fudge to get round the meaninglessness of * "localhost" in a shared-home-directory context -- xauth entries * for Unix-domain sockets already disambiguate this by storing * the *local* hostname in the conveniently-blank hostname field, * but IP "localhost" records couldn't do this. So, typically, an * IP "localhost" entry in the auth database isn't present and if * it were it would be ignored. * * However, we don't entirely trust that (say) Windows X servers * won't rely on a straight "localhost" entry, bad idea though * that is; so if we can't find a Unix-domain-socket entry we'll * fall back to an IP-based entry if we can find one. */ int localhost = !disp->unixdomain && sk_address_is_local(disp->addr)!ideal_match) { int c, i, j, match = FALSE /* IPv4 */ { match = TRUE; /* If this is a "localhost" entry, note it down * but carry on looking for a Unix-domain entry. */ ideal_match = !localhost; } } break; case 6: /* IPv6 */ { match = TRUE; ideal_match = !localhost; } } break; case 256: /* Unix-domain / localhost */ if ((disp->unixdomain || localhost) && ourhostname && !strcmp(ourhostname, str[0])) /* A matching Unix-domain socket is always the best * match. */ match = ideal_match = TRUE; break; } if (match) { /* Current best guess -- may be overridden if !ideal_match */ disp->localauthproto = protocol; sfree(disp->localauthdata); /* free previous guess, if any */ disp->localauthdata = snewn(len[3], unsigned char); memcpy(disp->localauthdata, str[3], len[3]); disp->localauthdatalen = len[3]; } } done: fclose(authfp); memset(buf, 0, 65537 * 4); sfree(buf); sfree(ourhostname Revision-number: 8463 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8464 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8465 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8466 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 Fix inaccurate error message. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-02-24T22:56:44.898719Z PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4255da6d3c7888b811d314dddb7a63f7 Text-delta-base-sha1: ae3094c801bda2f1ecc2270f7a6f4e4139b83516 Text-content-length: 37 Text-content-md5: 145140bba095d0e9e0bf466047779c44 Text-content-sha1: 3735c055f0b816ce938ace99f832feba37b9a45e Content-length: 37 SVN��43 �z��-file listing Revision-number: 8467 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8468 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8469 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8470 Prop-content-length: 537 Content-length: 537 K 10 svn:author V 5 simon K 8 svn:date V 27 2009-02-28T16:52:42.400546Z K 7 svn:log V 436 Debian bug #517535: we were unconditionally interpreting the 'string' field in a GdkEventKey structure as ISO-8859-1, which was correct for GTK 1.2 but in 2.0 that field is encoded according to the current C library locale. Hence, we now process that field by converting it to UTF-8 via trips through both libc and libcharset, and then let lpage_send() convert from UTF-8 back to whatever it's supposed to actually go down the line in. PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5cce7e79b01f9fa762cbdade7326a65 Text-delta-base-sha1: d2e496d2218fd1898a899bd5288487aab5929004 Text-content-length: 3002 Text-content-md5: a3560acb2b194acf08dcac6d87d9a692 Text-content-sha1: d683705790d1c315920842bd88e1188bd67cebdc Content-length: 3002 SVN����M�3�S�Eu�g8)�Cv�4�bP�A�<X�$#�3@�+256]; wchar_t ucsoutput[2]; int ucsval, start, end, special, output_charset output_charset = CS_ISO8859_1/* * FIXME: we might usefully try to do something clever here * about interpreting the generated key code in a way that's * appropriate to the line code page. */#if !GTK_CHECK_VERSION(2,0,0) /* * In vanilla X, and hence also GDK 1.2, the string received * as part of a keyboard event is assumed to be in * ISO-8859-1. (Seems woefully shortsighted in i18n terms, * but it's true: see the man page for XLookupString(3) for * confirmation.) */ output_charset = CS_ISO8859_1; strncpy(output+1, event->string, lenof(output)-1); #else /* * GDK 2.0 arranges to have done some translation for us: in * GDK 2.0, event->string is encoded in the current locale. * * (However, it's also deprecated; we really ought to be * using a GTKIMContext.) * * So we use the standard C library function mbstowcs() to * convert from the current locale into Unicode; from there * we can convert to whatever PuTTY is currently working in. * (In fact I convert straight back to UTF-8 from * wide-character Unicode, for the sake of simplicity: that * way we can still use exactly the same code to manipulate * the string, such as prefixing ESC.) */ output_charset = CS_UTF8; { wchar_t widedata[32], *wp; int wlen; int ulen; wlen = mb_to_wc(DEFAULT_CODEPAGE, 0, event->string, strlen(event->string), widedata, lenof(widedata)-1); wp = widedata; ulen = charset_from_unicode(&wp, &wlen, output+1, lenof(output)-2, CS_UTF8, NULL, NULL, 0); output[1+ulen] = '\0'; } #endif if (!output[1]lenof(output)-output[1output[1output[1output_charset = CS_ISO8859_1if (inst->ldisc) lpage_send(inst->ldisc, output_charset�J;;��, menuitem); \ gtk_widget_show(menuitem); \ if (func != NULL) \ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \ GTK_SIGNAL_FUNC(func), inst); \ } while (0) if (new_session) MKMENUITEM("New Session", new_session_menuitem); MKMENUITEM("Restart Session", restart_session_menuitem); inst->restartitem = menuitem; gtk_widget_hide(inst->restartitem); MKMENUITEM("Duplicate Session", dup_session_menuitem); if (saved_sessions) { inst->sessionsmenu = gtk_menu_new(); /* sessionsmenu will be updated when it's invoked */ /* XXX is this the right way to do dynamic menus in Gtk? */ MKMENUITEM("Saved Sessions", update_savedsess_menu); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), inst->sessionsmenu); } MKMENUITEM(NULL, NULL); MKMENUITEM("Change Settings", change_settings_menuitem); MKMENUITEM(NULL, NULL); if (use_event_log) MKMENUITEM("Event Log", event_log_menuitem); MKMENUITEM("Special Commands", NULL); inst->specialsmenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU Revision-number: 8471 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8472 Prop-content-length: 306 Content-length: 306 K 8 svn:date V 27 2009-02-28T23:04:58.873915Z K 7 svn:log V 205 Stop using physical tabs in Python. (I was goaded into doing this by my editor, which has defaulted to showing them as explicit ^I for a while now, but it seems like a generally prudent idea in any case.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/icons/mkicon.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2c7e27df3925858cde4f811b2e537e33 Text-delta-base-sha1: 4f17518b349e485f2a9adef7dfe39fac9f89a103 Text-content-length: 16458 Text-content-md5: 9dec410a95c5f0f6b138a5e4ea907b29 Text-content-sha1: 5b426ea9a2f52e706d6b3865c04fc9048220d2e4 Content-length: 16458 SVN��]{-�9��n:� )E��H�*I�`s� T�_x �O2��p&�~0�T �`m�eQ�xo�Y:Q�",E�OOW�X[t� �D>N�K~M�uY$�DA(�D"�I8m�_ z� 7�'"D�'S�438�J�F�Iy@� S if minx == None: minx, miny, maxx, maxy = x, y, x+1, y+1 else: minx = min(minx, x) miny = min(miny, y) maxx = max(maxx, x+1) ret.append([outpix(cT)] * w) for (x, y), colour in canvas.items(): if x >= minx and x < maxx and y >= miny and y < maxy: darkness = 0.5 else: for y in range(dmax+1): if max(x, y) < thickness: squadrant[x][y] = darkness if memoisedsqrt(x*x+y*y) < thickness: cquadrant[x][y] = darkness bvalues = {} for (x, y), colour in canvas.items(): for dx in range(-dmax, dmax+1): for dy in range(-dmax, dmax+1): quadrant = 2 * (dx < 0) + (dy < 0) if (x, y, quadrant) in squarecorners: bval = squadrant[abs(dx)][abs(dy)] else: bval = cquadrant[abs(dx)][abs(dy)] if bvalues.get((x+dx,y+dy),0) < bval: bvalues[(x+dx,y+dy)] = bval for (x, y), value in bvalues.items(): if not canvas.has_key((x,y)): for y in range(height): grey = 3 if x < highlight or y < highlight: grey = grey + 1 if x >= width-highlight or y >= height-bothighlight: grey = grey - 1 if y < highlight and x >= width-highlight: v = (highlight-1-y) - (x-(width-highlight)) if v < 0: grey = grey - 1 elif v > 0: grey = grey + 1 if y >= floppytop and y < floppybottom and \ 2*x+2 > floppystart and 2*x < floppyend: if 2*x >= floppystart and 2*x+2 <= floppyend and \ floppyrheight >= 0.7: grey = 0 else: grey = 2 for y in range(height): for y in range(depth): grey = 3 if x >= width-1 - highlight: grey = grey + 1 for y in range(height): if x >= surround and y >= surround and \ x < surround+swidth and y < surround+sheight: # Screen. sx = (float(x-surround) - swidth/3) / swidth sy = (float(y-surround) - sheight/3) / sheight shighlight = 1.0 - (sx*sx+sy*sy)*0.27 pix = bluepix(shighlight) if x < surround+shadow or y < surround+shadow: pix = blend(cD, pix) # sharp-edged shadow on top and left else: # Complicated double bevel on the screen surround. # First, the outer bevel. We compute the distance # from this pixel to each edge of the front # rectangle. list = [ (x, +1), (y, +1), (width-1-x, -1), (height-1-y, -1) ] # Now sort the list to find the distance to the # _nearest_ edge, or the two joint nearest. list.sort() # If there's one nearest edge, that determines our # bevel colour. If there are two joint nearest, our # bevel colour is their shared one if they agree, # and neutral otherwise. outerbevel = 0 if list[0][0] < list[1][0] or list[0][1] == list[1][1]: if list[0][0] < highlight: outerbevel = list[0][1] # Now, the inner bevel. We compute the distance # from this pixel to each edge of the screen # itself. list = [ (surround-1-x, -1), (surround-1-y, -1), (x-(surround+swidth), +1), (y-(surround+sheight), +1) ] # Now we sort to find the _maximum_ distance, which # conveniently ignores any less than zero. list.sort() # And now the strategy is pretty much the same as # above, only we're working from the opposite end # of the list. innerbevel = 0 if list[-1][0] > list[-2][0] or list[-1][1] == list[-2][1]: if list[-1][0] >= 0 and list[-1][0] < highlight: innerbevel = list[-1][1] # Now we know the adjustment we want to make to the # pixel's overall grey shade due to the outer # bevel, and due to the inner one. We break a tie # in favour of a light outer bevel, but otherwise # add. grey = 3 if outerbevel > 0 or outerbevel == innerbevel: innerbevel = 0 grey = grey + outerbevel + innerbevel pix = greypix(grey / 4.0) pixel(x, y, pix, canvas) # The side panel is a parallelogram. for x in range(depth): for y in range(height): pixel(x+width, y-x, greypix(0.5), canvas) # The top panel is another parallelogram. for x in range(width): for y in range(depth-1): list = [] if y <= outery: list.append(width-1-int(outerx * float(y) / outery + 0.3)) if y <= innery: list.append(width-1-int(innerx * float(y) / innery + 0.3)) y0 = height-1-y if y0 <= outery: list.append(int(outerx * float(y0) / outery + 0.3)) if y0 <= innery: list.append(int(innerx * float(y0) / innery + 0.3)) list.sort() for x in range(int(list[0]), int(list[-1]+1)): for x in range(int(width)): pixel(x, y, cW, canvas) # Now draw lines of text. for line in range(nlines): # Decide where this line of text begins. if line == 0: start = round(4*size) elif line < 5*nlines/7: start = round((line - (nlines/7)) * size) else: start = round(1*size) if start < round(1*size): start = round(1*size) # Decide where it ends. endpoints = [10, 8, 11, 6, 5, 7, 5] ey = line * 6.0 / (nlines-1) eyf = math.floor(ey) eyc = math.ceil(ey) exf = endpoints[int(eyf)] exc = endpoints[int(eyc)] if eyf == eyc: end = exf else: end = exf * (eyc-ey) + exc * (ey-eyf) end = round(end * size) liney = height - (lineht+linespc) * (line+1) for x in range(int(start), int(end)): for y in range(int(lineht)): xs = float(x) * (len(topa)-1) / (width-1) xf = math.floor(xs) xc = math.ceil(xs) topf = topa[int(xf)] topc = topa[int(xc)] if xf == xc: top = topf else: top = topf * (xc-xs) + topc * (xs-xf) top = math.floor(top) bot = round(botl + (botr-botl) * x/(width-1)) for y in range(int(top), int(bot)): pixel(x, y, cK, canvas) # Now draw the brim. for x in range(int(width)): brimtop = brimtopc + brimm * x brimbot = brimbotc + brimm * x for y in range(int(math.floor(brimtop)), int(math.ceil(brimbot))): tophere = max(min(brimtop - y, 1), 0) bothere = max(min(brimbot - y, 1), 0) grey = bothere - tophere # Only draw brim pixels over pixels which are (a) part # of the main hat, and (b) not right on its edge. if canvas.has_key((x,y)) and \ canvas.has_key((x,y-1)) and \ canvas.has_key((x,y+1)) and \ canvas.has_key((x-1,y)) and \ canvas.has_key((x+1,y)): dy = (y-(keyheadh-1)/2.0) / (keyheadh/2.0) dyh = (y-(keyheadh-1)/2.0) / (keyholed/2.0) for x in range(int(keyheadw)): dx = (x-(keyheadw-1)/2.0) / (keyheadw/2.0) dxh = (x-(keyheadw-1)/2.0-keyholeoff) / (keyholed/2.0) if dy*dy+dx*dx <= 1 and dyh*dyh+dxh*dxh > 1: top = round((keyheadh - keyshafth) / 2) bot = round((keyheadh + keyshafth) / 2) xs = float(x) * (len(keyhead)-1) / round((len(keyhead)-1)*size) xf = math.floor(xs) xc = math.ceil(xs) in_head = 0 if xc < len(keyhead): in_head = 1 yf = keyhead[int(xf)] yc = keyhead[int(xc)] if xf == xc: bot = yf else: bot = yf * (xc-xs) + yc * (xs-xf) for y in range(int(top),int(bot)): pixel(x, y, cy, canvas) if in_head: last = (x, y) if x == 0: squarepix.append((x, int(top), TL)) if x == 0: squarepix.append(last + (BL,)) if last != None and not in_head: squarepix.append(last + (BR,)) # First, find the nearest point to x,y on the infinite # projection of the line segment. So we construct a vector # n perpendicular to that segment... nx = y2-y1 ny = x1-x2 # ... compute the dot product of (x1,y1)-(x,y) with that # vector... nd = (x1-x)*nx + (y1-y)*ny # ... multiply by the vector we first thought of... ndx = nd * nx ndy = nd * ny # ... and divide twice by the length of n. ndx = ndx / (nx*nx+ny*ny) ndy = ndy / (nx*nx+ny*ny) # That gives us a displacement vector from x,y to the # nearest point. See if it's within the range of the line # segment. cx = x + ndx cy = y + ndy if cx >= min(x1,x2) and cx <= max(x1,x2) and \ cy >= min(y1,y2) and cy <= max(y1,y2): vlen = v[0]*v[0]+v[1]*v[1] if bestlen == None or bestlen > vlen: bestlen = vlen for x in range(int(cmax)): dists = [memoisedsqrt(vx*vx+vy*vy) for (vx,vy) in vectors] # If the distance to the hole line is less than # holeradius, we're not part of the spanner. if dists[0] < holeradius: continue # If the distance to the head `line' is less than # headradius, we are part of the spanner; likewise if # the distance to the shaft line is less than # shaftwidth _and_ the resulting shaft point isn't # beyond the shaft end. if dists[1] > headradius and \ (dists[2] > shaftwidth or x+vectors[2][0] >= shaftend): continue # We're part of the spanner. Now compute the highlight # on this pixel. We do this by computing a `slope # vector', which points from this pixel in the # direction of its nearest edge. We store an array of # slope vectors, in polar coordinates. angles = [math.atan2(vy,vx) for (vx,vy) in vectors] slopes = [] if dists[0] < holeradius + holehighlight: slopes.append(((dists[0]-holeradius)/holehighlight,angles[0])) if dists[1]/headradius < dists[2]/shaftwidth: if dists[1] > headradius - headhighlight and dists[1] < headradius: else: if dists[2] > shaftwidth - shafthighlight and dists[2] < shaftwidth: slopes.append(((shaftwidth-dists[2])/shafthighlight,math.pi+angles[2])) # Now we find the smallest distance in that array, if # any, and that gives us a notional position on a # sphere which we can use to compute the final # highlight level. bestdist = None bestangle = 0 for dist, angle in slopes: if bestdist == None or bestdist > dist: bestdist = dist bestangle = angle if bestdist == None: bestdist = 1.0 sx = (1.0-bestdist) * math.cos(bestangle) sy = (1.0-bestdist) * math.sin(bestangle) sz = math.sqrt(1.0 - sx*sx - sy*sy) shade = sx-sy+sz / math.sqrt(3) # can range from -1 to +1 shade = 1.0 - (1-shade)/3 hx = cx - xrel assert hty.has_key(hx) yrel = cty[cx] - hty[hx] if yrelmin == None: yrelmin = yrel else: canvases.append(func(size)) wid = 0 ht = 0 for canvas in canvases: minx, miny, maxx, maxy = bbox(canvas) wid = max(wid, maxx-minx+4) ht = ht + maxy-miny+4 block = [] for canvas in canvases: minx, miny, maxx, maxy = bbox(canvas) assert len(line) == wid for r, g, b, a in line: # Composite on to orange. r = int(round((r * a + 255 * (255-a)) / 255.0)) g = int(round((g * a + 128 * (255-a)) / 255.0)) b = int(round((b * a + 0 * (255-a)) / 255.0)) assert len(line) == width for r, g, b, a in line: if orangebackground: # Composite on to orange. r = int(round((r * a + 255 * (255-a)) / 255.0)) g = int(round((g * a + 128 * (255-a)) / 255.0)) b = int(round((b * a + 0 * (255-a)) / 255.0)) a = 255 if arg == "-t": test = 1 elif arg == "-it": orangebackground = 1 elif arg == "-2": colours = 0 elif arg == "-T": colours = 2 elif arg == "--": doingargs = 0 else: sys.stderr.write("unrecognised option '%s'\n" % arg) sys.exit(1) else: return [cK,cW][int(round(value))] def yellowpix(value): return [cK,cW][int(round(value))] def bluepix(value): return cK def dark(value): return [cT,cK][int(round(value))] def blend(col1, col2): if col1 == cT: return col2 else: return pixvals[colour] def finalisepix(colour): return [cK,cw,cw,cP,cW][int(round(4*value))] def yellowpix(value): return [cK,cy,cY][int(round(2*value))] def bluepix(value): return [cK,cb,cB][int(round(2*value))] def dark(value): return [cT,cD,cK][int(round(2*value))] def blend(col1, col2): if col1 == cT: return col2 elif col1 == cD: return [cK,cK,cK,cK,cK,cK,cK,cw,cK,cr,cg,cy,cb,cm,cc,cw,cD,cD][col2] else: return pixvals[colour] def finalisepix(colour): # cD is used internally, but can't be output. Convert to cK. if colour == cD: return cK value = max(min(value, 1), 0) value = max(min(value, 1), 0) return (int(round(0xFF*value)),) * 2 + (0, 0xFF) def bluepix(value): value = max(min(value, 1), 0) return (0, 0, int(round(0xFF*value)), 0xFF) def dark(value): value = max(min(value, 1), 0) return (0, 0, 0, int(round(0xFF*value))) def blend(col1, col2): r1,g1,b1,a1 = col1 r2,g2,b2,a2 = col2 r = int(round((r1*a1 + r2*(0xFF-a1)) / 255.0)) g = int(round((g1*a1 + g2*(0xFF-a1)) / 255.0)) b = int(round((b1*a1 + b2*(0xFF-a1)) / 255.0)) a = int(round((255*a1 + a2*(0xFF-a1)) / 255.0)) return r, g, b, a def outpix(colour): return colour if colours == 2: # True colour with no alpha blending: we still have to # finalise half-dark pixels to black. def finalisepix(colour): if colour[3] > 0: return colour[:3] + (0xFF,) return colour else: def finalisepix(colour): return colour def halftone(col1, col2): r1,g1,b1,a1 = col1 Revision-number: 8473 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8474 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8475 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8476 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8477 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8478 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8479 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8480 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8481 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8482 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8483 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8484 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8485 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8486 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8487 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8488 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8489 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8490 Prop-content-length: 468 Content-length: 468 K 8 svn:date V 27 2009-03-03T18:35:53.877386Z K 7 svn:log V 367 Handle more gracefully the possibility of a keyboard-interactive prompts packet containing no actual prompts (perhaps due to odd server organisation, or perhaps so it can print a banner message and do nothing else). Previously, the get_userpass_input functions always returned failure when in '-batch' mode, even in this case where no actual input would be required. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 74752ea5cf96594c058f04226b189631 Text-delta-base-sha1: e97140207b3b5a58d1a31b22f291d044030f2b3d Text-content-length: 37 Text-content-md5: 26028993fd3e3179a1a577aa5f123755 Text-content-sha1: 3df66ad269cb7ed8d92ebb3ea8b2886fabe573d2 Content-length: 37 SVN��' �@��W@p->n_prompts && Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d241270b62d83c28fc66717b955fbc8f Text-delta-base-sha1: 5e40b3c57bbc0ee7983f8b7eeab8e1cf62d42e3f Text-content-length: 832 Text-content-md5: 7c0e61e73700d801f2e153820a852685 Text-content-sha1: 231befbfa23deb5e552b8c0ac2e883f7f5748ebf Content-length: 832 SVN��) (�p�(�/* * The prompts_t might contain a message to be displayed but no * actual prompt. More usually, though, it will contain * questions that the user needs to answer, in which case we * need to ensure that we're able to get the answers. */ if (p->n_prompts) { if (console_batch_mode) return 0; hin = GetStdHandle(STD_INPUT_HANDLE); if (hin == INVALID_HANDLE_VALUE) { fprintf(stderr, "Cannot get standard input handle\n"); cleanup_exit(1); } } /* * And if we have anything to print, we need standard output. */ if ((p->name_reqd && p->name) || p->instruction || p->n_prompts) { hout = GetStdHandle(STD_OUTPUT_HANDLE); if (hout == INVALID_HANDLE_VALUE) { fprintf(stderr, "Cannot get standard output handle\n"); cleanup_exit(1); } Revision-number: 8491 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8492 Prop-content-length: 422 Content-length: 422 K 8 svn:date V 27 2009-03-03T19:57:58.091377Z K 7 svn:log V 321 Fix cosmetic keyboard-interactive issue: at the end of a normal k-i session, some servers (Debian in particular seems prone to this) send a k-i packet with no prompts and nothing to display. We were printing an extra "Using keyboard-interactive authentication" message in this case. (Introduced by me in r8172, I think.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 567c91974f5c34cd27a250c74f961863 Text-delta-base-sha1: edb15fdaaeb29107200f365d14dc088efa40970b Text-content-length: 638 Text-content-md5: 8fc276106c8d99eaac5c2cbfd5e49b60 Text-content-sha1: 80ea37c505d551261f4f0be60de81f81ea4e7aa9 Content-length: 638 SVN����������������IQ".���G�T `�prN�~KWe add a prefix to try to make it clear that a prompt * has come from the server. /* Special case: for reasons best known to themselves, * some servers send k-i requests with no prompts and * nothing to display. Keep quiet in this case. */ if (s->num_prompts || name_len || inst_len) { s->cur_prompt->instruction = dupprintf("Using keyboard-interactive authentication.%s%.*s", inst_len ? "\n" : "", inst_len, inst); s->cur_prompt->instr_reqd = TRUE; } else { s->cur_prompt->instr_reqd = FALSE Revision-number: 8493 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8494 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8495 Prop-content-length: 453 Content-length: 453 K 8 svn:date V 27 2009-03-24T22:24:31.484363Z K 7 svn:log V 352 Support in the cross-platform code for translating to and from UTF-16 when exchanging wchar_t strings with the front end. Enabled by a #define in the platform's header file (one should not promiscuously translate UTF-16 surrogate pairs on 32-bit wchar_t platforms since that could give rise to redundant encoding attacks), which is present on Windows. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldiscucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e9d95b95dde617e6af46d00bc091195 Text-delta-base-sha1: e86f87a0c7f81bbde4333876600d228d7f01b220 Text-content-length: 505 Text-content-md5: 12c041dd265798383d438e1d2cc48fb7 Text-content-sha1: 32e518108855e70ba0c578a239f2b5d3505ae3d7 Content-length: 505 SVN��NU�R�{�C�lVI�'sunsigned long ch = widebuf[i]; if ((ch & 0xF800) == 0xD800) { #ifdef PLATFORM_IS_UTF16 if (i+1 < len) { unsigned long ch2 = widebuf[i+1]; if ((ch & 0xFC00) == 0xD800 && (ch2 & 0xFC00) == 0xDC00) { ch = 0x10000 + ((ch & 0x3FF) << 10) + (ch2 & 0x3FF); i++; } } else #endif { /* Unrecognised UTF-16 sequence */ ch = '.'; } }if (ch < 0x10000) else { *p++ = (0xF0 | (ch >> 18)); *p++ = (0x80 | ((ch >> 12) & 0x3F Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9718a788858d7669f028daad8426a8a1 Text-delta-base-sha1: c5be52d1c48fd72be997ddac27e8b1512ddf649e Text-content-length: 290 Text-content-md5: f35d1a9725ef24e5156cf6259a3fbfef Text-content-sha1: f87c2285e49404f338a7be9363ef23df4c8eee10 Content-length: 290 SVN���������pGu�e�u�m#ifdef PLATFORM_IS_UTF16 if (uc > 0x10000 && uc < 0x110000) { cbuf[0] = 0xD800 | ((uc - 0x10000) >> 10); cbuf[1] = 0xDC00 | ((uc - 0x10000) & 0x3FF); cbuf[2] = 0; } else #endif { cbuf[0] = uc; cbuf[1] = 0; } Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 827a5a62efab99ff465598c50bc76e81 Text-delta-base-sha1: 56a069ddf94c94ed8ef918a5b395a106e1469538 Text-content-length: 135 Text-content-md5: 237796690967a9d5fd4eff42d7406582 Text-content-sha1: 8d11cf872c01b15011ea8b7c9cd18bf923a7e18c Content-length: 135 SVN��L? q�~�q�P|#define PLATFORM_IS_UTF16 /* enable UTF-16 processing when exchanging * wchar_t strings with environment */ Revision-number: 8496 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8497 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8498 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8499 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8500 Prop-content-length: 500 Content-length: 500 K 7 svn:log V 399 When starting a SOCKS connection in dynamic forwarding, freeze the local socket _before_ calling the SSH setup functions. This makes no difference to ssh.c itself, but it makes portfwd.c easier to reuse for other purposes (e.g. as a component of a standalone SOCKS server), because now ssh_send_port_open() can itself call pfd_confirm() without the freeze and unfreeze happening in the wrong order. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-23T17:33:42.869037Z PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8d5ecdd4330e14240e15201a4462808a Text-delta-base-sha1: b47457c120d3ead83d1fa02fd53bd51ab1921ab5 Text-content-length: 38 Text-content-md5: 5fe2e51f4a082975b60c26f6e49e497d Text-content-sha1: 3fa760fea883861daa9eb93b8a060bb56f36b2d0 Content-length: 38 SVN���L��bk�J�=U/* * F Revision-number: 8501 Prop-content-length: 485 Content-length: 485 K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-23T17:39:36.131940Z K 7 svn:log V 384 When giving authorisation errors from the proxy code in x11fwd.c, name the proxy using the global 'appname' variable, instead of statically calling it PuTTY. (Knock-on effect is that PSCP and PSFTP have to declare that variable, though of course they shouldn't ever actually _use_ the X forwarding code. Probably I ought to replace it with a stub nox11fwd.c for those applications.) PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 145140bba095d0e9e0bf466047779c44 Text-delta-base-sha1: 3735c055f0b816ce938ace99f832feba37b9a45e Text-content-length: 58 Text-content-md5: a5e5fefcb3521af9f07461321f1cc0f8 Text-content-sha1: 255a9b758592d7cf0fa38b5a25f025a14977a5ad Content-length: 58 SVN��3X "�(��%const char *const appname = "PSCP" Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d089d5635a7b553da10fdb1ff8002f98 Text-delta-base-sha1: 7615f33a2fd0d57a8103886abca27ca20fc0f218 Text-content-length: 60 Text-content-md5: 48f2d63dc664a04e91e3f263499e71ec Text-content-sha1: 9c94edb36244078e98eaed440f6971ad51a001fa Content-length: 60 SVN��] $�/��0-const char *const appname = "PSFTP"; Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 62dd748022c8612b31aeead895758cd3 Text-delta-base-sha1: b283a0870c1ae8016e45d1f74dd53933d57176df Text-content-length: 51 Text-content-md5: 11912cc3f04643fee74e632f921587b6 Text-content-sha1: 63d63401663a4c7b09146e2d68d9cd2789bcc950 Content-length: 51 SVN��ou �i��r}%s X11 proxy: %s", appname Revision-number: 8502 Prop-content-length: 171 Content-length: 171 K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-24T18:45:22.712916Z K 7 svn:log V 71 Richard Clark points out a missing check for ssh->mainchan being NULL. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8fc276106c8d99eaac5c2cbfd5e49b60 Text-delta-base-sha1: 80ea37c505d551261f4f0be60de81f81ea4e7aa9 Text-content-length: 70 Text-content-md5: 987f05797bd76d51c5f13a6be380957d Text-content-sha1: 1964b000919cd3e08047877c654a412ad3a70e9b Content-length: 70 SVN����������������Qb �d��r_mainchan && Revision-number: 8503 Prop-content-length: 476 Content-length: 476 K 7 svn:log V 375 Create a branch of the PuTTY source tree into which I plan to commit programs which use parts of the same code infrastructure for entirely different purposes. (I seriously considered just checking them into the main source base regardless, on the grounds that that way everything would stay up to date automatically, but couldn't quite make myself believe it was sensible.) K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-25T16:28:43.268437Z PROPS-END Node-path: putty-spinoffs Node-kind: dir Node-action: add Node-copyfrom-rev: 8502 Node-copyfrom-path: putty Revision-number: 8504 Prop-content-length: 602 Content-length: 602 K 8 svn:date V 27 2009-04-25T16:32:44.419704Z K 7 svn:log V 501 First PuTTY spinoff. Reuses the X forwarding code with a local listening socket replacing the SSH connection on the other end, to get a local authorisation-replacing X proxy for virtually zero development cost. Adding some logging code to that produces 'xtrace': looks like strace, quacks like xmon. This initial checkin has all the basic pieces in place, but there's a lengthy TODO at the top. I think it's just reached usability, though, and I plan to actually try debugging with it in anger soon. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 946448259ee5c71f92d077d71df7a0bb Text-delta-base-sha1: c84e6de77891911d9b72e677bbd495db909730b5 Text-content-length: 2491 Text-content-md5: a3291fa923f86f3bfd790c159edbf528 Text-content-sha1: db4792e5e6de4a2cb279b1c302a7b740aa981b93 Content-length: 2491 SVN��s>'�;��L;y�Jwz�L7F�K8?�N:##puttytel : [G] GUITERM NONSSH W_BE_NOSSH WINMISC puttytel.res LIBS #plink : [C] winplink wincons NONSSH WINSSH W_BE_ALL logging WINMISC # + winx11 plink.res LIBS #pscp : [C] pscp winsftp wincons WINSSH BE_SSH SFTP wildcard WINMISC # + pscp.res LIBS #psftp : [C] psftp winsftp wincons WINSSH BE_SSH SFTP wildcard WINMISC # + psftp.res LIBS # ## + misc sshaes sshsha winpgntc sshdss sshsh256 sshsh512 winutils # + winmisc winhelp pageant.res LIBS # ## + sshrand winnoise sshsha winstore misc winctrls sshrsa sshdss winmisc # + sshpubk sshaes sshsh256 sshsh512 import winutils puttygen.res # + tree234 notiming winhelp LIBS wintime # #pterm : [X] GTKTERM uxmisc misc ldisc settings uxpty uxsel BE_NONE uxstore # + uxsignal CHARSET cmdline uxpterm version time xpmpterm xpmptcfg #putty : [X] GTKTERM uxmisc misc ldisc settings uxsel U_BE_ALL uxstore # + uxsignal CHARSET uxputty NONSSH UXSSH UXMISC ux_x11 xpmputty # + xpmpucfg #puttytel : [X] GTKTERM uxmisc misc ldisc settings uxsel U_BE_NOSSH # + uxstore uxsignal CHARSET uxputty NONSSH UXMISC xpmputty xpmpucfg # #plink : [U] uxplink uxcons NONSSH UXSSH U_BE_ALL logging UXMISC uxsignal # + ux_x11 # #puttygen : [U] cmdgen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version ## + sshpubk sshaes sshsh256 sshsh512 import puttygen.res time tree234 # + uxgen notiming # #pscp : [U] pscp uxsftp uxcons UXSSH BE_SSH SFTP wildcard UXMISC #psftp : [U] psftp uxsftp uxcons UXSSH BE_SSH SFTP wildcard UXMISC # #PuTTY : [M] terminal wcwidth ldiscucs logging BE_ALL mac macdlg macevlog ## + stricmp vsnprint dialog config macctrls minibidi #PuTTYtel : [M] terminal wcwidth ldiscucs logging BE_NOSSH mac macdlg # + macevlog macterm macucs mac_res.rsrc testback NONSSH MACMISC # + CHARSET stricmp vsnprint dialog config macctrls minibidi #PuTTYgen : [M] macpgen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version # + sshrand macnoise sshsha macstore misc sshrsa sshdss macmisc sshpubk # + sshaes sshsh256 sshsh512 import macpgen.rsrc macpgkey macabout # #PuTTY : [MX] osxmain OSXTERM OSXMISC CHARSET U_BE_ALL NONSSH UXSSH # + ux_x11 uxpty uxsignal testback putty.icns info.plist xtrace : [U] uxxtrace x11fwd ux_x11 timing misc version tree234 proxy uxsel + uxnet uxmisc pproxy nocproxy time sshdes sshrand sshsha uxnoise Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 122020 Text-content-md5: 864a0ce5a398559354d1f30bd9e5e169 Text-content-sha1: 88b304d176a707eef63abcbfbcc5c9664de15f10 Content-length: 122030 PROPS-END SVN������/* * Main program for an X11 proxy, based on the PuTTY general network * abstraction and X forwarding framework, which will hopefully do X * protocol decoding on the proxied connections and report the * series of protocol transactions in a way more similar to 'strace' * than 'xmon'. * * (More importantly, unlike xmon, this program should automatically * do the Right Thing with regard to authorisation: like SSH X * forwarding, it should invent its own auth details for its proxy X * server and substitute the right ones for the real server. So you * simply run 'xtrace command args' and it should Just Work, with no * setup hassle.) */ /* * Definitely TODO: * * - Take a trawl through the non-Appendix-A part of the protocol * spec and reorder all the parameter lists into the order given * there, which is typically more sane than the order in the * binary encoding (in particular, the things shoehorned into * request[1] tend to be all over the place semantically). * * - Command-line-configurable logging destination, just like * strace -o. * * - Command-line-configurable filtering based on request and event * types. * * - Command-line-configurable suppression of really gigantic * streams of data in protocol packets. (Probably a configurable * limit, like strace -s.) * * - Finish up the few missing pieces in the logging code: strings * of 2-byte characters, the raw binary data used in properties * and images * * - Deal with interleaving log data from multiple clients: * * identify clients by some sort of numeric id (resource-base * is currently favourite) * * when multiple clients appear, start prefixing every log * line with the client id * * log connects and disconnects * * command-line option to request prefixing right from the * start * * perhaps a command-line option to request tracing of only * the first incoming connection and just proxy the rest * untraced? * * - Track responses to QueryExtension and use them to decode any * protocol extensions that we find useful. In particular, we * must definitely support BIG-REQUESTS, since it affects the * basic protocol structure and so we will be completely confused * if anyone ever uses it in anger. (And Xlib always turns it on, * so one has to assume that eventually it will have occasion to * use it.) * * - Rethink the centralised handling of sequence numbers in the * s2c stream parser. Since KeymapNotify hasn't got one, * extension-generated events we don't understand might not have * one either, so perhaps it would be better to move that code * out into a subfunction find_request_for_sequence_number() and * have that called as appropriate from all of xlog_do_reply, * xlog_do_event and xlog_do_error. * * Possibly TODO: * * - Command-line-configurable display format: be able to omit * parameter names for expert users? * * - Command-line configurable display format: alternative methods * of handling separated requests and responses? * * Such as, for instance, "Request(params) = <unfinished * #xxxx>" followed by " ... <#xxxx> = {response}". * * Or perhaps _always_ display the sequence number. * * Perhaps even never combine request and response lines. * * - Prettyprinting of giant data structure returns, by inserting * newlines and appropriate indentation? * * - Tracking of server state to usefully annotate the connection. * * We could certainly track currently known atoms, starting * with the standard predefined set and adding them when we * see the replies to InternAtom and GetAtomName. * + Another more radical approach here would be to establish * our own connection to the server and use it to _look up_ * any atom id we don't already know before we print the * request/response in which it appears. * * We could try tracking currently valid window and pixmap ids * so that we can disambiguate the letter prefix on a * DRAWABLE, and likewise track fonts and graphics contexts so * we can disambiguate FONTABLE. * + Bit fiddly, this one, due to synchronisation issues * between c2s and s2c. A request which changes the current * state should immediately affect annotation of subsequent * requests, but its effect on annotation of responses * would have to be deferred until the sequence numbers in * the response stream caught up with that request. Ick. * + Perhaps in fact this is just a silly and overambitious * idea and I'd be wiser not to try. * * - Other strace-like output options, such as prefixed timestamps * (-t, -tt, -ttt), alignment (-a), and more filtering options * (-e). * * - Perhaps now we've got the basic logging code, we might be able * to find completely different ways of acquiring its input other * than by proxying the X server? One obvious option would be to * actually use _strace_ as our back end, and read the protocol * stream out of the traced process's read() and write() * syscalls. Also a FOAF in the pub on 2009-04-23 mentioned that * there might be other ways of attaching to another X client's * data stream, perhaps through some hideous X extension I don't * know about, but he was regrettably short on details. * * - Find some way of independently testing the correctness of the * vast amount of this program that I translated straight out of * the X protocol specs... */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <assert.h> #include <signal.h> #include <unistd.h> #ifndef HAVE_NO_SYS_SELECT_H #include <sys/select.h> #endif #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include "putty.h" #include "misc.h" #include "storage.h" #include "ssh.h" Config cfg; #define BUFLIMIT 16384 enum { LOG_NONE, LOG_DIALOGUE, LOG_FILES }; int logmode = LOG_NONE; int cindex = 0; const char *const appname = "xtrace"; /* ---------------------------------------------------------------------- * Code to parse and log the data flowing (in both directions) * within an X connection. */ struct request { struct request *next, *prev; int opcode; int seqnum; char *text; /* * Values for the 'replies' field: * - 0 means no reply is expected to this request (though an * error may occur) * - 1 means exactly one reply is expected * - 2 means multiple replies are expected and none has yet * been seen (so that if the incoming sequence numbers skip * the request we should print a notification that something * odd happened) * - 3 means multiple replies are expected and at least one has * appeared (so that when sequence numbers move on we * silently discard this request). */ int replies; /* 0=no reply expected, 1=single reply expected, 2=multiple */ /* * Machine-readable representations of parts of the request, * preserved from xlog_do_request() so they can be referred to * when the reply comes in. */ int first_keycode, keycode_count; /* for GetKeyboardMapping */ }; /* * This global variable records which X request, if any, we have * just printed on a partial line, so that we know whether to print * the reply as if synchronous or whether to write "unfinished" and * reprint the request later. * * It is one of the few pieces of data which is not specific to a * particular one of the X connections being handled by this * program, since the logging of all connections is multiplexed into * the same output channel. */ static struct request *currreq = NULL; struct xlog { int c2sstate, s2cstate; char *textbuf; int textbuflen, textbufsize; unsigned char *c2sbuf, *s2cbuf; int c2slen, c2slimit, c2ssize; int s2clen, s2climit, s2csize; int endianness; int error; int reqlogstate; int overflow; int nextseq; struct request *rhead, *rtail; }; struct xlog *xlog_new(void) { struct xlog *xl = snew(struct xlog); xl->endianness = -1; /* as-yet-unknown */ xl->c2sbuf = NULL; xl->c2sstate = 0; xl->c2ssize = 0; xl->s2cbuf = NULL; xl->s2cstate = 0; xl->s2csize = 0; xl->error = FALSE; xl->textbuf = NULL; xl->textbuflen = xl->textbufsize = 0; xl->rhead = xl->rtail = NULL; xl->nextseq = 1; return xl; } void free_request(struct request *req) { sfree(req->text); sfree(req); } void xlog_free(struct xlog *xl) { while (xl->rhead) { struct request *nexthead = xl->rhead->next; free_request(xl->rhead); xl->rhead = nexthead; } sfree(xl->c2sbuf); sfree(xl->s2cbuf); sfree(xl->textbuf); sfree(xl); } #define crBegin(v) { int *crLine = &v; switch(v) { case 0:; #define crFinish } *crLine = 0; return; } #define crReturn do { \ *crLine=__LINE__; \ return; \ case __LINE__:; \ } while (0) #define ensure(prefix, esize) do { \ int xlNewSize = (esize); \ if (xl->prefix ## size < xlNewSize) { \ xl->prefix ## size = xlNewSize * 5 / 4 + 1024; \ xl->prefix ## buf = sresize(xl->prefix ## buf, \ xl->prefix ## size, unsigned char); \ } \ } while (0) #define readfrom(prefix, size, start) do { \ xl->prefix ## len = (start); \ xl->prefix ## limit = (size) - xl->prefix ## len; \ while (xl->prefix ## limit > 0) { \ if (len == 0) crReturn; \ { \ int clen = (len < xl->prefix ## limit ? \ len : xl->prefix ## limit); \ ensure(prefix, xl->prefix ## len + clen); \ memcpy(xl->prefix ## buf + xl->prefix ## len, data, clen); \ xl->prefix ## limit -= clen; \ xl->prefix ## len += clen; \ data += clen; \ len -= clen; \ } \ } \ } while (0) #define read(prefix, size) readfrom(prefix, size, 0) #define ignore(prefix, size) do { \ xl->prefix ## limit = (size); \ xl->prefix ## len = 0; \ while (xl->prefix ## limit > 0) { \ if (len == 0) crReturn; \ { \ int clen = (len < xl->prefix ## limit ? \ len : xl->prefix ## limit); \ xl->prefix ## limit -= clen; \ xl->prefix ## len += clen; \ data += clen; \ len -= clen; \ } \ } \ } while (0) #define READ8(p) ((unsigned char)*(p)) #define READ16(p) (xl->endianness == 'l' ? \ GET_16BIT_LSB_FIRST(p) : GET_16BIT_MSB_FIRST(p)) #define READ32(p) (xl->endianness == 'l' ? \ GET_32BIT_LSB_FIRST(p) : GET_32BIT_MSB_FIRST(p)) void xlog_error(struct xlog *xl, const char *fmt, ...) { va_list ap; fprintf(stderr, "protocol error: "); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); xl->error = TRUE; } #define err(args) do { xlog_error args; crReturn; } while (0) #define warn(args) do { xlog_error args; crReturn; } while (0) void xlog_text_len(struct xlog *xl, const char *buf, int len) { if (xl->textbuflen + len >= xl->textbufsize) { xl->textbufsize = (xl->textbuflen + len) * 5 / 4 + 1024; xl->textbuf = sresize(xl->textbuf, xl->textbufsize, char); } memcpy(xl->textbuf + xl->textbuflen, buf, len); xl->textbuflen += len; xl->textbuf[xl->textbuflen] = '\0'; } void xlog_text(struct xlog *xl, const char *buf) { xlog_text_len(xl, buf, strlen(buf)); } void xlog_printf(struct xlog *xl, const char *fmt, ...) { char *tmp; va_list ap; va_start(ap, fmt); tmp = dupvprintf(fmt, ap); va_end(ap); xlog_text(xl, tmp); sfree(tmp); } static void print_c_string(struct xlog *xl, const char *data, int len) { while (len--) { char c = *data++; if (c == '\n') xlog_text(xl, "\\n"); else if (c == '\r') xlog_text(xl, "\\r"); else if (c == '\t') xlog_text(xl, "\\t"); else if (c == '\b') xlog_text(xl, "\\b"); else if (c == '\\') xlog_text(xl, "\\\\"); else if (c == '"') xlog_text(xl, "\\\""); else if (c >= 32 && c <= 126) xlog_text_len(xl, &c, 1); else xlog_printf(xl, "\\%03o", (unsigned char)c); } } static void writemask(struct xlog *xl, int ival, ...) { const char *sep = ""; const char *svname; int svi; va_list ap; va_start(ap, ival); while (1) { svname = va_arg(ap, const char *); if (!svname) break; svi = va_arg(ap, int); if (svi & ival) { xlog_text(xl, sep); xlog_text(xl, svname); sep = "|"; } } va_end(ap); if (!*sep) xlog_text(xl, "0"); /* special case: no flags set */ } void xlog_request_name(struct xlog *xl, const char *buf) { /* FIXME: filter logging of requests based on this name */ xlog_printf(xl, "%s", buf); xl->reqlogstate = 0; } #define FETCH8(p, n) ( (n)+1>len ? (xl->overflow=1,0) : READ8((p)+(n)) ) #define FETCH16(p, n) ( (n)+2>len ? (xl->overflow=1,0) : READ16((p)+(n)) ) #define FETCH32(p, n) ( (n)+4>len ? (xl->overflow=1,0) : READ32((p)+(n)) ) #define STRING(p, n, l) ( (n)+(l)>len ? (xl->overflow=1,NULL) : (char *)(p)+(n) ) /* * Enumeration of data type codes. These don't exactly match the X * ones: they're really requests to xlog_param to _render_ the type * in a certain way. */ enum { DECU, /* unsigned decimal integer */ DEC8, /* 8-bit signed decimal */ DEC16, /* 16-bit signed decimal */ DEC32, /* 32-bit signed decimal */ HEX8, HEX16, HEX32, RATIONAL16, BOOLEAN, WINDOW, PIXMAP, FONT, GCONTEXT, CURSOR, COLORMAP, DRAWABLE, FONTABLE, VISUALID, ATOM, EVENTMASK, KEYMASK, CONFREQMASK, /* used in ConfigureRequest event only */ ENUM, STRING, HEXSTRING, SETBEGIN, NOTHING, SPECVAL = 0x8000 }; void xlog_param(struct xlog *xl, const char *paramname, int type, ...) { va_list ap; const char *sval; int ival, ival2; if (xl->reqlogstate == 0) { xlog_printf(xl, "("); xl->reqlogstate = 1; } else if (xl->reqlogstate == 3) { xl->reqlogstate = 1; } else { xlog_printf(xl, ", "); } if (xl->overflow && xl->reqlogstate != 2) { xlog_printf(xl, "<packet ends prematurely>"); xl->reqlogstate = 2; } else { /* FIXME: perhaps optionally omit parameter names? */ xlog_printf(xl, "%s=", paramname); va_start(ap, type); switch (type &~ SPECVAL) { case STRING: ival = va_arg(ap, int); sval = va_arg(ap, const char *); xlog_text(xl, "\""); print_c_string(xl, sval, ival); xlog_text(xl, "\""); break; case HEXSTRING: ival = va_arg(ap, int); sval = va_arg(ap, const char *); while (ival-- > 0) xlog_printf(xl, "%02X", (unsigned char)(*sval++)); break; case SETBEGIN: /* * This type code contains no data at all. We just print * an open brace, and then data fields will be filled in * later and terminated by a call to xlog_set_end(). */ xlog_printf(xl, "{"); xl->reqlogstate = 3; /* suppress comma after open brace */ break; case NOTHING: /* * This type code is even simpler than SETBEGIN: we * print nothing, and expect the caller to write their * own formatting of the data. */ break; case RATIONAL16: ival = va_arg(ap, int); ival &= 0xFFFF; if (ival & 0x8000) ival -= 0x10000; ival2 = va_arg(ap, int); ival2 &= 0xFFFF; if (ival2 & 0x8000) ival2 -= 0x10000; xlog_printf(xl, "%d/%d", ival, ival2); break; default: ival = va_arg(ap, int); if (type & SPECVAL) { const char *svname; int svi; int done = FALSE; while (1) { svname = va_arg(ap, const char *); if (!svname) break; svi = va_arg(ap, int); if (svi == ival) { xlog_text(xl, svname); done = TRUE; break; } } if (done) break; type &= ~SPECVAL; } switch (type) { case DECU: xlog_printf(xl, "%u", (unsigned)ival); break; case DEC8: ival &= 0xFF; if (ival & 0x80) ival -= 0x100; xlog_printf(xl, "%d", ival); break; case DEC16: ival &= 0xFFFF; if (ival & 0x8000) ival -= 0x10000; xlog_printf(xl, "%d", ival); break; case DEC32: #if UINT_MAX > 0xFFFFFFFF ival &= 0xFFFFFFFF; if (ival & 0x80000000) ival -= 0x100000000; #endif xlog_printf(xl, "%d", ival); break; case HEX8: xlog_printf(xl, "0x%02X", ival); break; case HEX16: xlog_printf(xl, "0x%04X", ival); break; case HEX32: xlog_printf(xl, "0x%08X", ival); break; case ENUM: /* This type is used for values which are expected to * _always_ take one of their special values, so we * want a rendition of any non-special value which * makes it clear that something isn't right. */ xlog_printf(xl, "Unknown%d", ival); break; case BOOLEAN: if (ival == 0) xlog_text(xl, "False"); else if (ival == 1) xlog_text(xl, "True"); else xlog_printf(xl, "BadBool%d", ival); break; case WINDOW: xlog_printf(xl, "w#%08X", ival); break; case PIXMAP: xlog_printf(xl, "p#%08X", ival); break; case FONT: xlog_printf(xl, "f#%08X", ival); break; case GCONTEXT: xlog_printf(xl, "g#%08X", ival); break; case VISUALID: xlog_printf(xl, "v#%08X", ival); break; case CURSOR: /* Extra characters in the prefix distinguish from COLORMAP */ xlog_printf(xl, "cur#%08X", ival); break; case COLORMAP: /* Extra characters in the prefix distinguish from CURSOR */ xlog_printf(xl, "col#%08X", ival); break; case DRAWABLE: /* * FIXME: DRAWABLE can be either WINDOW or PIXMAP. * It would be good, I think, to keep track of the * currently live IDs of both so that we can * determine which is which and print the * _appropriate_ type prefix. */ xlog_printf(xl, "wp#%08X", ival); break; case FONTABLE: /* * FIXME: FONTABLE can be either FONT or GCONTEXT. * It would be good, I think, to keep track of the * currently live IDs of both so that we can * determine which is which and print the * _appropriate_ type prefix. */ xlog_printf(xl, "fg#%08X", ival); break; case EVENTMASK: writemask(xl, ival, "KeyPress", 0x00000001, "KeyRelease", 0x00000002, "ButtonPress", 0x00000004, "ButtonRelease", 0x00000008, "EnterWindow", 0x00000010, "LeaveWindow", 0x00000020, "PointerMotion", 0x00000040, "PointerMotionHint", 0x00000080, "Button1Motion", 0x00000100, "Button2Motion", 0x00000200, "Button3Motion", 0x00000400, "Button4Motion", 0x00000800, "Button5Motion", 0x00001000, "ButtonMotion", 0x00002000, "KeymapState", 0x00004000, "Exposure", 0x00008000, "VisibilityChange", 0x00010000, "StructureNotify", 0x00020000, "ResizeRedirect", 0x00040000, "SubstructureNotify", 0x00080000, "SubstructureRedirect", 0x00100000, "FocusChange", 0x00200000, "PropertyChange", 0x00400000, "ColormapChange", 0x00800000, "OwnerGrabButton", 0x01000000, (char *)NULL); break; case KEYMASK: writemask(xl, ival, "Shift", 0x0001, "Lock", 0x0002, "Control", 0x0004, "Mod1", 0x0008, "Mod2", 0x0010, "Mod3", 0x0020, "Mod4", 0x0040, "Mod5", 0x0080, "Button1", 0x0100, "Button2", 0x0200, "Button3", 0x0400, "Button4", 0x0800, "Button5", 0x1000, (char *)NULL); break; case CONFREQMASK: writemask(xl, ival, "x", 0x0001, "y", 0x0002, "width", 0x0004, "height", 0x0008, "border-width", 0x0010, "sibling", 0x0020, "stack-mode", 0x0040, (char *)NULL); break; case ATOM: /* * FIXME: I think we should automatically translate * atom names, at least by default. This may involve * making our _own_ X connection to the real X * server, so that we can send GetAtomName requests * for any we don't already know. Alternatively, we * might not need to bother, if we can just keep * track of all the requests this connection is * sending. */ xlog_printf(xl, "a#%d", ival); break; } break; } va_end(ap); } } void xlog_set_end(struct xlog *xl) { xlog_text(xl, "}"); if (xl->reqlogstate != 2) xl->reqlogstate = 1; } void xlog_reply_begin(struct xlog *xl) { xlog_text(xl, "{"); xl->reqlogstate = 3; } void xlog_reply_end(struct xlog *xl) { xlog_text(xl, "}"); } void xlog_new_line(void) { if (currreq) { /* FIXME: in some modes we might wish to print the sequence number * here, which would be easy of course */ fprintf(stderr, " = <unfinished>\n"); currreq = NULL; } } void xlog_request_done(struct xlog *xl, struct request *req) { if (xl->reqlogstate) xlog_printf(xl, ")"); req->next = NULL; req->prev = xl->rtail; if (xl->rtail) xl->rtail->next = req; else xl->rhead = req; xl->rtail = req; req->seqnum = xl->nextseq; xl->nextseq = (xl->nextseq+1) & 0xFFFF; req->text = dupstr(xl->textbuf); xlog_new_line(); if (req->replies) { fprintf(stderr, "%s", req->text); currreq = req; } else { fprintf(stderr, "%s\n", req->text); } } /* Indicate that we're about to print a response to a particular request */ void xlog_respond_to(struct request *req) { if (currreq != req) { xlog_new_line(); fprintf(stderr, " ... %s = ", req->text); } else { fprintf(stderr, " = "); } } void xlog_response_done(const char *text) { fprintf(stderr, "%s\n", text); currreq = NULL; } void xlog_rectangle(struct xlog *xl, const unsigned char *data, int len, int pos) { xlog_param(xl, "x", DEC16, FETCH16(data, pos)); xlog_param(xl, "y", DEC16, FETCH16(data, pos+2)); xlog_param(xl, "width", DECU, FETCH16(data, pos+4)); xlog_param(xl, "height", DECU, FETCH16(data, pos+6)); } void xlog_point(struct xlog *xl, const unsigned char *data, int len, int pos) { xlog_param(xl, "x", DEC16, FETCH16(data, pos)); xlog_param(xl, "y", DEC16, FETCH16(data, pos+2)); } void xlog_arc(struct xlog *xl, const unsigned char *data, int len, int pos) { xlog_param(xl, "x", DEC16, FETCH16(data, pos)); xlog_param(xl, "y", DEC16, FETCH16(data, pos+2)); xlog_param(xl, "width", DECU, FETCH16(data, pos+4)); xlog_param(xl, "height", DECU, FETCH16(data, pos+6)); xlog_param(xl, "angle1", DEC16, FETCH16(data, pos+8)); xlog_param(xl, "angle2", DEC16, FETCH16(data, pos+10)); } void xlog_segment(struct xlog *xl, const unsigned char *data, int len, int pos) { xlog_param(xl, "x1", DEC16, FETCH16(data, pos)); xlog_param(xl, "y1", DEC16, FETCH16(data, pos+2)); xlog_param(xl, "x2", DEC16, FETCH16(data, pos+4)); xlog_param(xl, "y2", DEC16, FETCH16(data, pos+6)); } void xlog_coloritem(struct xlog *xl, const unsigned char *data, int len, int pos) { int mask = FETCH8(data, pos+10); xlog_param(xl, "pixel", HEX32, FETCH32(data, pos)); if (mask & 1) xlog_param(xl, "red", HEX16, FETCH16(data, pos+4)); if (mask & 2) xlog_param(xl, "green", HEX16, FETCH16(data, pos+6)); if (mask & 4) xlog_param(xl, "blue", HEX16, FETCH16(data, pos+8)); } void xlog_timecoord(struct xlog *xl, const unsigned char *data, int len, int pos) { xlog_param(xl, "timestamp", HEX32, FETCH32(data, pos)); xlog_param(xl, "x", DEC16, FETCH16(data, pos+4)); xlog_param(xl, "y", DEC16, FETCH16(data, pos+6)); } void xlog_fontprop(struct xlog *xl, const unsigned char *data, int len, int pos) { xlog_param(xl, "name", ATOM, FETCH32(data, pos)); xlog_param(xl, "value", HEX32, FETCH32(data, pos+4)); } void xlog_charinfo(struct xlog *xl, const unsigned char *data, int len, int pos) { xlog_param(xl, "left-side-bearing", DEC16, FETCH16(data, pos)); xlog_param(xl, "right-side-bearing", DEC16, FETCH16(data, pos+2)); xlog_param(xl, "character-width", DEC16, FETCH16(data, pos+4)); xlog_param(xl, "ascent", DEC16, FETCH16(data, pos+6)); xlog_param(xl, "descent", DEC16, FETCH16(data, pos+8)); xlog_param(xl, "attributes", DEC16, FETCH16(data, pos+10)); } void xlog_event(struct xlog *xl, const unsigned char *data, int len, int pos) { int event; xl->reqlogstate = 3; event = FETCH8(data, pos); if (event & 0x80) { xlog_printf(xl, "SendEvent-generated "); event &= ~0x80; } switch (event) { case 2: case 3: case 4: case 5: case 6: case 7: case 8: xlog_printf(xl, "%s(", (event==2 ? "KeyPress" : event==3 ? "KeyRelease" : event==4 ? "ButtonPress" : event==5 ? "ButtonRelease" : event==6 ? "MotionNotify" : event==7 ? "EnterNotify" : /* event==8 ? */ "LeaveNotify")); if (event < 6) xlog_param(xl, "detail", DECU, FETCH8(data, pos+1)); else if (event == 6) xlog_param(xl, "detail", ENUM | SPECVAL, FETCH8(data, pos+1), "Normal", 0, "Hint", 1, (char *)NULL); else if (event == 7 || event == 8) xlog_param(xl, "detail", ENUM | SPECVAL, FETCH8(data, pos+1), "Ancestor", 0, "Virtual", 1, "Inferior", 2, "Nonlinear", 3, "NonlinearVirtual", 4, (char *)NULL); xlog_param(xl, "time", HEX32, FETCH32(data, pos+4)); xlog_param(xl, "root", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "event", WINDOW, FETCH32(data, pos+12)); xlog_param(xl, "child", WINDOW | SPECVAL, FETCH32(data, pos+16), "None", 0); xlog_param(xl, "root-x", DEC16, FETCH16(data, pos+20)); xlog_param(xl, "root-y", DEC16, FETCH16(data, pos+22)); xlog_param(xl, "event-x", DEC16, FETCH16(data, pos+24)); xlog_param(xl, "event-y", DEC16, FETCH16(data, pos+26)); xlog_param(xl, "state", HEX16, FETCH16(data, pos+28)); if (event < 7) { xlog_param(xl, "same-screen", BOOLEAN, FETCH8(data, pos+30)); } else if (event == 7 || event == 8) { xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, pos+30), "Normal", 0, "Grab", 1, "Ungrab", 2, (char *)NULL); xlog_param(xl, "focus", BOOLEAN, FETCH8(data, pos+31) & 1); xlog_param(xl, "same-screen", BOOLEAN, (FETCH8(data, pos+31) >> 1) & 1); } xlog_printf(xl, ")"); break; case 9: case 10: xlog_printf(xl, "%s(", (event==9 ? "FocusIn" : /* event==3 ? */ "FocusOut")); xlog_param(xl, "detail", ENUM | SPECVAL, FETCH8(data, pos+1), "Ancestor", 0, "Virtual", 1, "Inferior", 2, "Nonlinear", 3, "NonlinearVirtual", 4, "Pointer", 5, "PointerRoot", 6, "None", 7, (char *)NULL); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, pos+8), "Normal", 0, "Grab", 1, "Ungrab", 2, "WhileGrabbed", 3, (char *)NULL); xlog_printf(xl, ")"); break; case 11: xlog_printf(xl, "KeymapNotify("); { int i; int ppos = pos + 1; for (i = 1; i < 32; i++) { char buf[64]; sprintf(buf, "keys[%d]", i); xlog_param(xl, buf, HEX8, FETCH8(data, ppos)); ppos++; } } xlog_printf(xl, ")"); break; case 12: xlog_printf(xl, "Expose("); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "x", DECU, FETCH16(data, pos+8)); xlog_param(xl, "y", DECU, FETCH16(data, pos+10)); xlog_param(xl, "width", DECU, FETCH16(data, pos+12)); xlog_param(xl, "height", DECU, FETCH16(data, pos+14)); xlog_param(xl, "count", DECU, FETCH16(data, pos+16)); xlog_printf(xl, ")"); break; case 13: xlog_printf(xl, "GraphicsExposure("); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, pos+4)); xlog_param(xl, "x", DECU, FETCH16(data, pos+8)); xlog_param(xl, "y", DECU, FETCH16(data, pos+10)); xlog_param(xl, "width", DECU, FETCH16(data, pos+12)); xlog_param(xl, "height", DECU, FETCH16(data, pos+14)); xlog_param(xl, "minor-opcode", DECU, FETCH16(data, pos+16)); xlog_param(xl, "count", DECU, FETCH16(data, pos+18)); xlog_param(xl, "major-opcode", DECU | SPECVAL, FETCH8(data, pos+20), "CopyArea", 62, "CopyPlane", 63, (char *)NULL); xlog_printf(xl, ")"); break; case 14: xlog_printf(xl, "NoExposure("); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, pos+4)); xlog_param(xl, "minor-opcode", DECU, FETCH16(data, pos+8)); xlog_param(xl, "major-opcode", DECU | SPECVAL, FETCH8(data, pos+10), "CopyArea", 62, "CopyPlane", 63, (char *)NULL); xlog_printf(xl, ")"); break; case 15: xlog_printf(xl, "VisibilityNotify("); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "state", ENUM | SPECVAL, FETCH8(data, pos+8), "Unobscured", 0, "PartiallyObscured", 1, "FullyObscured", 2, (char *)NULL); xlog_printf(xl, ")"); break; case 16: xlog_printf(xl, "CreateNotify("); xlog_param(xl, "parent", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "x", DEC16, FETCH16(data, pos+12)); xlog_param(xl, "y", DEC16, FETCH16(data, pos+14)); xlog_param(xl, "width", DECU, FETCH16(data, pos+16)); xlog_param(xl, "height", DECU, FETCH16(data, pos+18)); xlog_param(xl, "border-width", DECU, FETCH16(data, pos+20)); xlog_param(xl, "override-redirect", BOOLEAN, FETCH8(data, pos+22)); xlog_printf(xl, ")"); break; case 17: xlog_printf(xl, "DestroyNotify("); xlog_param(xl, "event", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_printf(xl, ")"); break; case 18: xlog_printf(xl, "UnmapNotify("); xlog_param(xl, "event", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "from-configure", BOOLEAN, FETCH8(data, pos+12)); xlog_printf(xl, ")"); break; case 19: xlog_printf(xl, "MapNotify("); xlog_param(xl, "event", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "override-redirect", BOOLEAN, FETCH8(data, pos+12)); xlog_printf(xl, ")"); break; case 20: xlog_printf(xl, "MapRequest("); xlog_param(xl, "parent", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_printf(xl, ")"); break; case 21: xlog_printf(xl, "ReparentNotify("); xlog_param(xl, "event", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "parent", WINDOW, FETCH32(data, pos+12)); xlog_param(xl, "x", DEC16, FETCH16(data, pos+16)); xlog_param(xl, "y", DEC16, FETCH16(data, pos+18)); xlog_param(xl, "override-redirect", BOOLEAN, FETCH8(data, pos+20)); xlog_printf(xl, ")"); break; case 22: xlog_printf(xl, "ConfigureNotify("); xlog_param(xl, "event", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "above-sibling", WINDOW | SPECVAL, FETCH32(data, pos+12), "None", 0, (char *)NULL); xlog_param(xl, "x", DEC16, FETCH16(data, pos+16)); xlog_param(xl, "y", DEC16, FETCH16(data, pos+18)); xlog_param(xl, "width", DECU, FETCH16(data, pos+20)); xlog_param(xl, "height", DECU, FETCH16(data, pos+22)); xlog_param(xl, "border-width", DECU, FETCH16(data, pos+24)); xlog_param(xl, "override-redirect", BOOLEAN, FETCH8(data, pos+26)); xlog_printf(xl, ")"); break; case 23: xlog_printf(xl, "ConfigureRequest("); xlog_param(xl, "stack-mode", ENUM | SPECVAL, FETCH8(data, pos+1), "Above", 0, "Below", 1, "TopIf", 2, "BottomIf", 3, "Opposite", 4, (char *)NULL); xlog_param(xl, "parent", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "sibling", WINDOW | SPECVAL, FETCH32(data, pos+12), "None", 0, (char *)NULL); xlog_param(xl, "x", DEC16, FETCH16(data, pos+16)); xlog_param(xl, "y", DEC16, FETCH16(data, pos+18)); xlog_param(xl, "width", DECU, FETCH16(data, pos+20)); xlog_param(xl, "height", DECU, FETCH16(data, pos+22)); xlog_param(xl, "border-width", DECU, FETCH16(data, pos+24)); /* * Mostly, these bit masks appearing in the X protocol with * bit names corresponding to fields in the same packet are * there to indicate that some fields are unused. This one * is unusual in that all fields are filled in regardless of * this bit mask; the bit mask tells the receiving client * which of the fields have just been changed, and which are * unchanged and merely being re-reported as a courtesy. */ xlog_param(xl, "value-mask", CONFREQMASK, FETCH16(data, pos+26)); xlog_printf(xl, ")"); break; case 24: xlog_printf(xl, "GravityNotify("); xlog_param(xl, "event", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "x", DEC16, FETCH16(data, pos+12)); xlog_param(xl, "y", DEC16, FETCH16(data, pos+14)); xlog_printf(xl, ")"); break; case 25: xlog_printf(xl, "ResizeRequest("); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "width", DEC16, FETCH16(data, pos+8)); xlog_param(xl, "height", DEC16, FETCH16(data, pos+10)); xlog_printf(xl, ")"); break; case 26: xlog_printf(xl, "CirculateNotify("); xlog_param(xl, "event", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "place", ENUM | SPECVAL, FETCH8(data, pos+16), "Top", 0, "Bottom", 1, (char *)NULL); xlog_printf(xl, ")"); break; case 27: xlog_printf(xl, "CirculateRequest("); xlog_param(xl, "parent", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "place", ENUM | SPECVAL, FETCH8(data, pos+16), "Top", 0, "Bottom", 1, (char *)NULL); xlog_printf(xl, ")"); break; case 28: xlog_printf(xl, "PropertyNotify("); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "atom", ATOM, FETCH32(data, pos+8)); xlog_param(xl, "time", HEX32, FETCH32(data, pos+12)); xlog_param(xl, "state", ENUM | SPECVAL, FETCH8(data, pos+16), "NewValue", 0, "Deleted", 1, (char *)NULL); xlog_printf(xl, ")"); break; case 29: xlog_printf(xl, "SelectionClear("); xlog_param(xl, "time", HEX32, FETCH32(data, pos+4)); xlog_param(xl, "owner", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "selection", ATOM, FETCH32(data, pos+12)); xlog_printf(xl, ")"); break; case 30: xlog_printf(xl, "SelectionRequest("); xlog_param(xl, "time", HEX32 | SPECVAL, FETCH32(data, pos+4), "CurrentTime", 0, (char *)NULL); xlog_param(xl, "owner", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "requestor", WINDOW, FETCH32(data, pos+12)); xlog_param(xl, "selection", ATOM, FETCH32(data, pos+16)); xlog_param(xl, "target", ATOM, FETCH32(data, pos+20)); xlog_param(xl, "property", ATOM | SPECVAL, FETCH32(data, pos+24), "None", 0, (char *)NULL); xlog_printf(xl, ")"); break; case 31: xlog_printf(xl, "SelectionNotify("); xlog_param(xl, "time", HEX32 | SPECVAL, FETCH32(data, pos+4), "CurrentTime", 0, (char *)NULL); xlog_param(xl, "requestor", WINDOW, FETCH32(data, pos+8)); xlog_param(xl, "selection", ATOM, FETCH32(data, pos+12)); xlog_param(xl, "target", ATOM, FETCH32(data, pos+16)); xlog_param(xl, "property", ATOM | SPECVAL, FETCH32(data, pos+20), "None", 0, (char *)NULL); xlog_printf(xl, ")"); break; case 32: xlog_printf(xl, "ColormapNotify("); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "colormap", COLORMAP | SPECVAL, FETCH32(data, pos+8), "None", 0, (char *)NULL); xlog_param(xl, "new", BOOLEAN, FETCH8(data, pos+12)); xlog_param(xl, "state", ENUM | SPECVAL, FETCH8(data, pos+13), "Uninstalled", 0, "Installed", 1, (char *)NULL); xlog_printf(xl, ")"); break; case 33: xlog_printf(xl, "ClientMessage("); xlog_param(xl, "format", DECU, FETCH8(data, pos+1)); xlog_param(xl, "window", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "type", ATOM, FETCH32(data, pos+8)); xlog_printf(xl, ")"); break; case 34: xlog_printf(xl, "MappingNotify("); xlog_param(xl, "request", ENUM | SPECVAL, FETCH8(data, pos+4), "Modifier", 0, "Keyboard", 1, "Pointer", 2, (char *)NULL); xlog_param(xl, "first-keycode", DECU, FETCH8(data, pos+5)); xlog_param(xl, "count", DECU, FETCH8(data, pos+6)); xlog_printf(xl, ")"); break; default: xlog_printf(xl, "UnknownEvent%d", event); break; } xl->reqlogstate = 1; } void xlog_do_request(struct xlog *xl, const void *vdata, int len) { const unsigned char *data = (const unsigned char *)vdata; struct request *req; xl->textbuflen = 0; xl->overflow = FALSE; req = snew(struct request); req->opcode = data[0]; req->replies = 0; switch (req->opcode) { case 1: case 2: { unsigned i, bitmask; switch (data[0]) { case 1: xlog_request_name(xl, "CreateWindow"); xlog_param(xl, "depth", DECU, FETCH8(data, 1)); xlog_param(xl, "wid", WINDOW, FETCH32(data, 4)); xlog_param(xl, "parent", WINDOW, FETCH32(data, 8)); xlog_param(xl, "x", DEC16, FETCH16(data, 12)); xlog_param(xl, "y", DEC16, FETCH16(data, 14)); xlog_param(xl, "width", DECU, FETCH16(data, 16)); xlog_param(xl, "height", DECU, FETCH16(data, 18)); xlog_param(xl, "border-width", DECU, FETCH16(data, 20)); xlog_param(xl, "class", ENUM | SPECVAL, FETCH16(data, 22), "CopyFromParent", 0, "InputOutput", 1, "InputOnly", 2, (char *)NULL); xlog_param(xl, "visual", VISUALID | SPECVAL, FETCH32(data, 24), "CopyFromParent", 0, (char *)NULL); i = 32; break; default /* case 2 */: xlog_request_name(xl, "ChangeWindowAttributes"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); i = 12; } bitmask = FETCH32(data, i-4); if (bitmask & 0x00000001) { xlog_param(xl, "background-pixmap", PIXMAP | SPECVAL, FETCH32(data, i), "None", 0, "ParentRelative", 1, (char *)NULL); i += 4; } if (bitmask & 0x00000002) { xlog_param(xl, "background-pixel", HEX32, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000004) { xlog_param(xl, "border-pixmap", PIXMAP | SPECVAL, FETCH32(data, i), "None", 0, "CopyFromParent", 1, (char *)NULL); i += 4; } if (bitmask & 0x00000008) { xlog_param(xl, "border-pixel", HEX32, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000010) { xlog_param(xl, "bit-gravity", ENUM | SPECVAL, FETCH8(data, i), "Forget", 0, "NorthWest", 1, "North", 2, "NorthEast", 3, "West", 4, "Center", 5, "East", 6, "SouthWest", 7, "South", 8, "SouthEast", 9, "Static", 10, (char *)NULL); i += 4; } if (bitmask & 0x00000020) { xlog_param(xl, "win-gravity", ENUM | SPECVAL, FETCH8(data, i), "Unmap", 0, "NorthWest", 1, "North", 2, "NorthEast", 3, "West", 4, "Center", 5, "East", 6, "SouthWest", 7, "South", 8, "SouthEast", 9, "Static", 10, (char *)NULL); i += 4; } if (bitmask & 0x00000040) { xlog_param(xl, "backing-store", ENUM | SPECVAL, FETCH8(data, i), "NotUseful", 0, "WhenMapped", 1, "Always", 2, (char *)NULL); i += 4; } if (bitmask & 0x00000080) { xlog_param(xl, "backing-planes", DECU, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000100) { xlog_param(xl, "backing-pixel", HEX32, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000200) { xlog_param(xl, "override-redirect", BOOLEAN, FETCH8(data, i)); i += 4; } if (bitmask & 0x00000400) { xlog_param(xl, "save-under", BOOLEAN, FETCH8(data, i)); i += 4; } if (bitmask & 0x00000800) { xlog_param(xl, "event-mask", EVENTMASK, FETCH32(data, i)); i += 4; } if (bitmask & 0x00001000) { xlog_param(xl, "do-not-propagate-mask", EVENTMASK, FETCH32(data, i)); i += 4; } if (bitmask & 0x00002000) { xlog_param(xl, "colormap", COLORMAP | SPECVAL, FETCH32(data, i), "CopyFromParent", 0, (char *)NULL); i += 4; } if (bitmask & 0x00004000) { xlog_param(xl, "cursor", CURSOR | SPECVAL, FETCH32(data, i), "None", 0, (char *)NULL); i += 4; } } break; case 3: xlog_request_name(xl, "GetWindowAttributes"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); req->replies = 1; break; case 4: xlog_request_name(xl, "DestroyWindow"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 5: xlog_request_name(xl, "DestroySubwindows"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 6: xlog_request_name(xl, "ChangeSaveSet"); xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, 1), "Insert", 0, "Delete", 1, (char *)NULL); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 7: xlog_request_name(xl, "ReparentWindow"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); xlog_param(xl, "parent", WINDOW, FETCH32(data, 8)); xlog_param(xl, "x", DEC16, FETCH16(data, 12)); xlog_param(xl, "y", DEC16, FETCH16(data, 14)); break; case 8: xlog_request_name(xl, "MapWindow"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 9: xlog_request_name(xl, "MapSubwindows"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 10: xlog_request_name(xl, "UnmapWindow"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 11: xlog_request_name(xl, "UnmapSubwindows"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 12: xlog_request_name(xl, "ConfigureWindow"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); { unsigned i = 12; unsigned bitmask = FETCH16(data, i-4); if (bitmask & 0x0001) { xlog_param(xl, "x", DEC16, FETCH16(data, i)); i += 4; } if (bitmask & 0x0002) { xlog_param(xl, "y", DEC16, FETCH16(data, i)); i += 4; } if (bitmask & 0x0004) { xlog_param(xl, "width", DECU, FETCH16(data, i)); i += 4; } if (bitmask & 0x0008) { xlog_param(xl, "height", DECU, FETCH16(data, i)); i += 4; } if (bitmask & 0x0010) { xlog_param(xl, "border-width", DECU, FETCH16(data, i)); i += 4; } if (bitmask & 0x0020) { xlog_param(xl, "sibling", WINDOW, FETCH32(data, i)); i += 4; } if (bitmask & 0x0040) { xlog_param(xl, "stack-mode", ENUM | SPECVAL, FETCH8(data, i), "Above", 0, "Below", 1, "TopIf", 2, "BottomIf", 3, "Opposite", 4, (char *)NULL); i += 4; } } break; case 13: xlog_request_name(xl, "CirculateWindow"); xlog_param(xl, "direction", ENUM | SPECVAL, FETCH8(data, 1), "RaiseLowest", 0, "LowerHighest", 1, (char *)NULL); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 14: xlog_request_name(xl, "GetGeometry"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); req->replies = 1; break; case 15: xlog_request_name(xl, "QueryTree"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); req->replies = 1; break; case 16: xlog_request_name(xl, "InternAtom"); xlog_param(xl, "only-if-exists", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "name", STRING, FETCH16(data, 4), STRING(data, 8, FETCH16(data, 4))); req->replies = 1; break; case 17: xlog_request_name(xl, "GetAtomName"); xlog_param(xl, "atom", ATOM, FETCH32(data, 4)); req->replies = 1; break; case 18: xlog_request_name(xl, "ChangeProperty"); xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, 1), "Replace", 0, "Prepend", 1, "Append", 2, (char *)NULL); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); xlog_param(xl, "property", ATOM, FETCH32(data, 8)); xlog_param(xl, "type", ATOM, FETCH32(data, 12)); xlog_param(xl, "format", DECU, FETCH8(data, 16)); xlog_param(xl, "length", DECU, FETCH32(data, 20)); /* FIXME: then there's an arbitrary amount of data which will want * to be logged too */ break; case 19: xlog_request_name(xl, "DeleteProperty"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); xlog_param(xl, "property", ATOM, FETCH32(data, 8)); break; case 20: xlog_request_name(xl, "GetProperty"); xlog_param(xl, "delete", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); xlog_param(xl, "property", ATOM, FETCH32(data, 8)); xlog_param(xl, "type", ATOM | SPECVAL, FETCH32(data, 12), "AnyPropertyType", 0, (char *)NULL); xlog_param(xl, "long-offset", DECU, FETCH32(data, 16)); xlog_param(xl, "long-length", DECU, FETCH32(data, 20)); req->replies = 1; break; case 21: xlog_request_name(xl, "ListProperties"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); req->replies = 1; break; case 22: xlog_request_name(xl, "SetSelectionOwner"); xlog_param(xl, "owner", WINDOW, FETCH32(data, 4)); xlog_param(xl, "selection", ATOM, FETCH32(data, 8)); xlog_param(xl, "timestamp", HEX32 | SPECVAL, FETCH32(data, 12), "CurrentTime", 0, (char *)NULL); break; case 23: xlog_request_name(xl, "GetSelectionOwner"); xlog_param(xl, "selection", ATOM, FETCH32(data, 4)); req->replies = 1; break; case 24: xlog_request_name(xl, "ConvertSelection"); xlog_param(xl, "requestor", WINDOW, FETCH32(data, 4)); xlog_param(xl, "selection", ATOM, FETCH32(data, 8)); xlog_param(xl, "target", ATOM, FETCH32(data, 12)); xlog_param(xl, "property", ATOM, FETCH32(data, 16)); xlog_param(xl, "timestamp", HEX32 | SPECVAL, FETCH32(data, 20), "CurrentTime", 0, (char *)NULL); break; case 25: xlog_request_name(xl, "SendEvent"); xlog_param(xl, "propagate", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "destination", WINDOW | SPECVAL, FETCH32(data, 4), "PointerWindow", 0, "InputFocus", 1, (char *)NULL); xlog_param(xl, "event-mask", EVENTMASK, FETCH32(data, 8)); xlog_param(xl, "event", NOTHING); xlog_event(xl, data, len, 12); break; case 26: xlog_request_name(xl, "GrabPointer"); xlog_param(xl, "owner-events", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "grab-window", WINDOW | SPECVAL, FETCH32(data, 4), "PointerWindow", 0, "InputFocus", 1, (char *)NULL); xlog_param(xl, "event-mask", EVENTMASK, FETCH16(data, 8)); xlog_param(xl, "pointer-mode", ENUM | SPECVAL, FETCH8(data, 10), "Synchronous", 0, "Asynchronous", 1, (char *)NULL); xlog_param(xl, "keyboard-mode", ENUM | SPECVAL, FETCH8(data, 11), "Synchronous", 0, "Asynchronous", 1, (char *)NULL); xlog_param(xl, "confine-to", WINDOW | SPECVAL, FETCH32(data, 12), "None", 0, (char *)NULL); xlog_param(xl, "cursor", CURSOR | SPECVAL, FETCH32(data, 16), "None", 0, (char *)NULL); xlog_param(xl, "timestamp", HEX32 | SPECVAL, FETCH32(data, 20), "CurrentTime", 0, (char *)NULL); req->replies = 1; break; case 27: xlog_request_name(xl, "UngrabPointer"); xlog_param(xl, "timestamp", HEX32 | SPECVAL, FETCH32(data, 4), "CurrentTime", 0, (char *)NULL); break; case 28: xlog_request_name(xl, "GrabButton"); xlog_param(xl, "owner-events", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "grab-window", WINDOW | SPECVAL, FETCH32(data, 4), "PointerWindow", 0, "InputFocus", 1, (char *)NULL); xlog_param(xl, "event-mask", EVENTMASK, FETCH16(data, 8)); xlog_param(xl, "pointer-mode", ENUM | SPECVAL, FETCH8(data, 10), "Synchronous", 0, "Asynchronous", 1, (char *)NULL); xlog_param(xl, "keyboard-mode", ENUM | SPECVAL, FETCH8(data, 11), "Synchronous", 0, "Asynchronous", 1, (char *)NULL); xlog_param(xl, "confine-to", WINDOW | SPECVAL, FETCH32(data, 12), "None", 0, (char *)NULL); xlog_param(xl, "cursor", CURSOR | SPECVAL, FETCH32(data, 16), "None", 0, (char *)NULL); xlog_param(xl, "button", DECU | SPECVAL, FETCH8(data, 20), "AnyButton", 0, (char *)NULL); xlog_param(xl, "modifiers", KEYMASK | SPECVAL, FETCH16(data, 22), "AnyModifier", 0x8000, (char *)NULL); break; case 29: xlog_request_name(xl, "UngrabButton"); xlog_param(xl, "button", DECU | SPECVAL, FETCH8(data, 1), "AnyButton", 0, (char *)NULL); xlog_param(xl, "grab-window", WINDOW | SPECVAL, FETCH32(data, 4), "PointerWindow", 0, "InputFocus", 1, (char *)NULL); xlog_param(xl, "modifiers", KEYMASK | SPECVAL, FETCH16(data, 8), "AnyModifier", 0x8000, (char *)NULL); break; case 30: xlog_request_name(xl, "ChangeActivePointerGrab"); xlog_param(xl, "cursor", CURSOR | SPECVAL, FETCH32(data, 4), "None", 0, (char *)NULL); xlog_param(xl, "timestamp", HEX32 | SPECVAL, FETCH32(data, 8), "CurrentTime", 0, (char *)NULL); xlog_param(xl, "event-mask", EVENTMASK, FETCH16(data, 12)); break; case 31: xlog_request_name(xl, "GrabKeyboard"); xlog_param(xl, "owner-events", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "grab-window", WINDOW | SPECVAL, FETCH32(data, 4), "PointerWindow", 0, "InputFocus", 1, (char *)NULL); xlog_param(xl, "timestamp", HEX32 | SPECVAL, FETCH32(data, 8), "CurrentTime", 0, (char *)NULL); xlog_param(xl, "pointer-mode", ENUM | SPECVAL, FETCH8(data, 12), "Synchronous", 0, "Asynchronous", 1, (char *)NULL); xlog_param(xl, "keyboard-mode", ENUM | SPECVAL, FETCH8(data, 13), "Synchronous", 0, "Asynchronous", 1, (char *)NULL); req->replies = 1; break; case 32: xlog_request_name(xl, "UngrabKeyboard"); xlog_param(xl, "timestamp", HEX32 | SPECVAL, FETCH32(data, 4), "CurrentTime", 0, (char *)NULL); break; case 33: xlog_request_name(xl, "GrabKey"); xlog_param(xl, "owner-events", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "grab-window", WINDOW | SPECVAL, FETCH32(data, 4), "PointerWindow", 0, "InputFocus", 1, (char *)NULL); xlog_param(xl, "modifiers", KEYMASK | SPECVAL, FETCH16(data, 8), "AnyModifier", 0x8000, (char *)NULL); xlog_param(xl, "keycode", DECU | SPECVAL, FETCH8(data, 10), "AnyKey", 0, (char *)NULL); xlog_param(xl, "pointer-mode", ENUM | SPECVAL, FETCH8(data, 11), "Synchronous", 0, "Asynchronous", 1, (char *)NULL); xlog_param(xl, "keyboard-mode", ENUM | SPECVAL, FETCH8(data, 12), "Synchronous", 0, "Asynchronous", 1, (char *)NULL); break; case 34: xlog_request_name(xl, "UngrabKey"); xlog_param(xl, "keycode", DECU | SPECVAL, FETCH8(data, 1), "AnyKey", 0, (char *)NULL); xlog_param(xl, "grab-window", WINDOW | SPECVAL, FETCH32(data, 4), "PointerWindow", 0, "InputFocus", 1, (char *)NULL); xlog_param(xl, "modifiers", KEYMASK | SPECVAL, FETCH16(data, 8), "AnyModifier", 0x8000, (char *)NULL); break; case 35: xlog_request_name(xl, "AllowEvents"); xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, 1), "AsyncPointer", 0, "SyncPointer", 1, "ReplayPointe", 2, "AsyncKeyboard", 3, "SyncKeyboard", 4, "ReplayKeyboard", 5, "AsyncBoth", 6, "SyncBoth", 7, (char *)NULL); xlog_param(xl, "timestamp", HEX32 | SPECVAL, FETCH32(data, 4), "CurrentTime", 0, (char *)NULL); break; case 36: xlog_request_name(xl, "GrabServer"); /* no arguments */ break; case 37: xlog_request_name(xl, "UngrabServer"); /* no arguments */ break; case 38: xlog_request_name(xl, "QueryPointer"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); req->replies = 1; break; case 39: xlog_request_name(xl, "GetMotionEvents"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); xlog_param(xl, "start", HEX32 | SPECVAL, FETCH32(data, 8), "CurrentTime", 0, (char *)NULL); xlog_param(xl, "stop", HEX32 | SPECVAL, FETCH32(data, 12), "CurrentTime", 0, (char *)NULL); req->replies = 1; break; case 40: xlog_request_name(xl, "TranslateCoordinates"); xlog_param(xl, "src-window", WINDOW, FETCH32(data, 4)); xlog_param(xl, "dst-window", WINDOW, FETCH32(data, 8)); xlog_param(xl, "src-x", DEC16, FETCH16(data, 12)); xlog_param(xl, "src-y", DEC16, FETCH16(data, 14)); req->replies = 1; break; case 41: xlog_request_name(xl, "WarpPointer"); xlog_param(xl, "src-window", WINDOW | SPECVAL, FETCH32(data, 4), "None", 0, (char *)NULL); xlog_param(xl, "dst-window", WINDOW | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); xlog_param(xl, "src-x", DEC16, FETCH16(data, 12)); xlog_param(xl, "src-y", DEC16, FETCH16(data, 14)); xlog_param(xl, "src-width", DECU, FETCH16(data, 16)); xlog_param(xl, "src-height", DECU, FETCH16(data, 18)); xlog_param(xl, "dst-x", DEC16, FETCH16(data, 20)); xlog_param(xl, "dst-y", DEC16, FETCH16(data, 22)); break; case 42: xlog_request_name(xl, "SetInputFocus"); xlog_param(xl, "revert-to", ENUM | SPECVAL, FETCH8(data, 1), "None", 0, "PointerRoot", 1, "Parent", 2, (char *)NULL); xlog_param(xl, "focus", WINDOW, FETCH32(data, 4)); xlog_param(xl, "timestamp", HEX32 | SPECVAL, FETCH32(data, 8), "CurrentTime", 0, (char *)NULL); break; case 43: xlog_request_name(xl, "GetInputFocus"); req->replies = 1; break; case 44: xlog_request_name(xl, "QueryKeymap"); req->replies = 1; break; case 45: xlog_request_name(xl, "OpenFont"); xlog_param(xl, "fid", FONT, FETCH32(data, 4)); xlog_param(xl, "name", STRING, FETCH16(data, 8), STRING(data, 12, FETCH16(data, 8))); break; case 46: xlog_request_name(xl, "CloseFont"); xlog_param(xl, "font", FONT, FETCH32(data, 4)); break; case 47: xlog_request_name(xl, "QueryFont"); xlog_param(xl, "font", FONTABLE, FETCH32(data, 4)); req->replies = 1; break; case 48: xlog_request_name(xl, "QueryTextExtents"); xlog_param(xl, "font", FONTABLE, FETCH32(data, 4)); /* * FIXME: a nasty string parameter here. Partly the reason * it's nasty is that it starts from data+8 and goes on to * the end of the packet (i.e. it's the first packet type * I've seen so far in which the length field is critical to * the semantics); but mostly, it's a STRING16 and I'm not * sure how best to print those yet. */ req->replies = 1; break; case 49: xlog_request_name(xl, "ListFonts"); xlog_param(xl, "max-names", DECU, FETCH16(data, 4)); xlog_param(xl, "pattern", STRING, FETCH16(data, 6), STRING(data, 8, FETCH16(data, 6))); req->replies = 1; break; case 50: xlog_request_name(xl, "ListFontsWithInfo"); xlog_param(xl, "max-names", DECU, FETCH16(data, 4)); xlog_param(xl, "pattern", STRING, FETCH16(data, 6), STRING(data, 8, FETCH16(data, 6))); req->replies = 2; /* this request expects multiple replies */ break; case 51: xlog_request_name(xl, "SetFontPath"); { int i, n; int pos = 8; n = FETCH16(data, 4); for (i = 0; i < n; i++) { char buf[64]; int slen; sprintf(buf, "path[%d]", i); slen = FETCH8(data, pos); xlog_param(xl, buf, STRING, slen, STRING(data, pos+1, slen)); pos += slen + 1; } } break; case 52: xlog_request_name(xl, "GetFontPath"); req->replies = 1; break; case 53: xlog_request_name(xl, "CreatePixmap"); xlog_param(xl, "depth", DECU, FETCH8(data, 1)); xlog_param(xl, "pid", PIXMAP, FETCH32(data, 4)); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 8)); xlog_param(xl, "width", DECU, FETCH16(data, 10)); xlog_param(xl, "height", DECU, FETCH16(data, 12)); break; case 54: xlog_request_name(xl, "FreePixmap"); xlog_param(xl, "pixmap", PIXMAP, FETCH32(data, 4)); break; case 55: case 56: case 57: { unsigned i, bitmask; switch (data[0]) { case 55: xlog_request_name(xl, "CreateGC"); xlog_param(xl, "cid", GCONTEXT, FETCH32(data, 4)); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 8)); i = 16; break; case 56: xlog_request_name(xl, "ChangeGC"); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 4)); i = 12; break; default /* case 57 */: xlog_request_name(xl, "CopyGC"); xlog_param(xl, "src-gc", GCONTEXT, FETCH32(data, 4)); xlog_param(xl, "dst-gc", GCONTEXT, FETCH32(data, 8)); i = 16; break; } bitmask = FETCH32(data, i-4); if (bitmask & 0x00000001) { xlog_param(xl, "function", ENUM | SPECVAL, FETCH8(data, i), "Clear", 0, "And", 1, "AndReverse", 2, "Copy", 3, "AndInverted", 4, "NoOp", 5, "Xor", 6, "Or", 7, "Nor", 8, "Equiv", 9, "Invert", 10, "OrReverse", 11, "CopyInverted", 12, "OrInverted", 13, "Nand", 14, "Set", 15, (char *)NULL); i += 4; } if (bitmask & 0x00000002) { xlog_param(xl, "plane-mask", HEX32, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000004) { xlog_param(xl, "foreground", HEX32, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000008) { xlog_param(xl, "background", HEX32, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000010) { xlog_param(xl, "line-width", DECU, FETCH16(data, i)); i += 4; } if (bitmask & 0x00000020) { xlog_param(xl, "line-style", ENUM | SPECVAL, FETCH8(data, i), "Solid", 0, "OnOffDash", 1, "DoubleDash", 2, (char *)NULL); i += 4; } if (bitmask & 0x00000040) { xlog_param(xl, "cap-style", ENUM | SPECVAL, FETCH8(data, i), "NotLast", 0, "Butt", 1, "Round", 2, "Projecting", 3, (char *)NULL); i += 4; } if (bitmask & 0x00000080) { xlog_param(xl, "join-style", ENUM | SPECVAL, FETCH8(data, i), "Miter", 0, "Round", 1, "Bevel", 2, (char *)NULL); i += 4; } if (bitmask & 0x00000100) { xlog_param(xl, "fill-style", ENUM | SPECVAL, FETCH8(data, i), "Solid", 0, "Tiled", 1, "Stippled", 2, "OpaqueStippled", 3, (char *)NULL); i += 4; } if (bitmask & 0x00000200) { xlog_param(xl, "fill-rule", ENUM | SPECVAL, FETCH8(data, i), "EvenOdd", 0, "Winding", 1, (char *)NULL); i += 4; } if (bitmask & 0x00000400) { xlog_param(xl, "tile", PIXMAP, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000800) { xlog_param(xl, "stipple", PIXMAP, FETCH32(data, i)); i += 4; } if (bitmask & 0x00001000) { xlog_param(xl, "tile-stipple-x-origin", DEC16, FETCH16(data, i)); i += 4; } if (bitmask & 0x00002000) { xlog_param(xl, "tile-stipple-y-origin", DEC16, FETCH16(data, i)); i += 4; } if (bitmask & 0x00004000) { xlog_param(xl, "font", FONT, FETCH32(data, i)); i += 4; } if (bitmask & 0x00008000) { xlog_param(xl, "subwindow-mode", ENUM | SPECVAL, FETCH8(data, i), "ClipByChildren", 0, "IncludeInferiors", 1, (char *)NULL); i += 4; } if (bitmask & 0x00010000) { xlog_param(xl, "graphics-exposures", BOOLEAN, FETCH8(data, i)); i += 4; } if (bitmask & 0x00020000) { xlog_param(xl, "clip-x-origin", DEC16, FETCH16(data, i)); i += 4; } if (bitmask & 0x00040000) { xlog_param(xl, "clip-y-origin", DEC16, FETCH16(data, i)); i += 4; } if (bitmask & 0x00080000) { xlog_param(xl, "clip-mask", PIXMAP | SPECVAL, FETCH32(data, i), "None", 0, (char *)NULL); i += 4; } if (bitmask & 0x00100000) { xlog_param(xl, "dash-offset", DECU, FETCH16(data, i)); i += 4; } if (bitmask & 0x00200000) { xlog_param(xl, "dashes", DECU, FETCH8(data, i)); i += 4; } if (bitmask & 0x00400000) { xlog_param(xl, "arc-mode", ENUM | SPECVAL, FETCH8(data, i), "Chord", 0, "PieSlice", 1, (char *)NULL); i += 4; } } break; case 58: xlog_request_name(xl, "SetDashes"); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 4)); xlog_param(xl, "dash-offset", DECU, FETCH16(data, 8)); { int i, n; n = FETCH16(data, 10); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "dashes[%d]", i); xlog_param(xl, buf, DECU, FETCH8(data, 12+i)); } } break; case 59: xlog_request_name(xl, "SetClipRectangles"); xlog_param(xl, "ordering", ENUM | SPECVAL, FETCH8(data, 1), "UnSorted", 0, "YSorted", 1, "YXSorted", 2, "YXBanded", 3, (char *)NULL); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 4)); xlog_param(xl, "clip-x-origin", DEC16, FETCH16(data, 8)); xlog_param(xl, "clip-y-origin", DEC16, FETCH16(data, 10)); { int pos = 12; int i = 0; char buf[64]; while (pos + 8 <= len) { sprintf(buf, "rectangles[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_rectangle(xl, data, len, pos); xlog_set_end(xl); pos += 8; } } break; case 60: xlog_request_name(xl, "FreeGC"); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 4)); break; case 61: xlog_request_name(xl, "ClearArea"); xlog_param(xl, "exposures", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); xlog_param(xl, "x", DEC16, FETCH16(data, 8)); xlog_param(xl, "y", DEC16, FETCH16(data, 10)); xlog_param(xl, "width", DECU, FETCH16(data, 12)); xlog_param(xl, "height", DECU, FETCH16(data, 14)); break; case 62: xlog_request_name(xl, "CopyArea"); xlog_param(xl, "src-drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "dst-drawable", DRAWABLE, FETCH32(data, 8)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 12)); xlog_param(xl, "src-x", DEC16, FETCH16(data, 16)); xlog_param(xl, "src-y", DEC16, FETCH16(data, 18)); xlog_param(xl, "dst-x", DEC16, FETCH16(data, 20)); xlog_param(xl, "dst-y", DEC16, FETCH16(data, 22)); xlog_param(xl, "width", DECU, FETCH16(data, 24)); xlog_param(xl, "height", DECU, FETCH16(data, 26)); break; case 63: xlog_request_name(xl, "CopyPlane"); xlog_param(xl, "src-drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "dst-drawable", DRAWABLE, FETCH32(data, 8)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 12)); xlog_param(xl, "src-x", DEC16, FETCH16(data, 16)); xlog_param(xl, "src-y", DEC16, FETCH16(data, 18)); xlog_param(xl, "dst-x", DEC16, FETCH16(data, 20)); xlog_param(xl, "dst-y", DEC16, FETCH16(data, 22)); xlog_param(xl, "width", DECU, FETCH16(data, 24)); xlog_param(xl, "height", DECU, FETCH16(data, 26)); xlog_param(xl, "bit-plane", DECU, FETCH32(data, 28)); break; case 64: xlog_request_name(xl, "PolyPoint"); xlog_param(xl, "coordinate-mode", ENUM | SPECVAL, FETCH8(data, 1), "Origin", 0, "Previous", 1, (char *)NULL); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); { int pos = 12; int i = 0; char buf[64]; while (pos + 4 <= len) { sprintf(buf, "points[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_point(xl, data, len, pos); xlog_set_end(xl); pos += 4; i++; } } break; case 65: xlog_request_name(xl, "PolyLine"); xlog_param(xl, "coordinate-mode", ENUM | SPECVAL, FETCH8(data, 1), "Origin", 0, "Previous", 1, (char *)NULL); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); { int pos = 12; int i = 0; char buf[64]; while (pos + 4 <= len) { sprintf(buf, "points[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_point(xl, data, len, pos); xlog_set_end(xl); pos += 4; i++; } } break; case 66: xlog_request_name(xl, "PolySegment"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); { int pos = 12; int i = 0; char buf[64]; while (pos + 8 <= len) { sprintf(buf, "segments[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_segment(xl, data, len, pos); xlog_set_end(xl); pos += 8; i++; } } break; case 67: xlog_request_name(xl, "PolyRectangle"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); { int pos = 12; int i = 0; char buf[64]; while (pos + 8 <= len) { sprintf(buf, "rectangles[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_rectangle(xl, data, len, pos); xlog_set_end(xl); pos += 8; i++; } } break; case 68: xlog_request_name(xl, "PolyArc"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); { int pos = 12; int i = 0; char buf[64]; while (pos + 12 <= len) { sprintf(buf, "arcs[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_arc(xl, data, len, pos); xlog_set_end(xl); pos += 12; i++; } } break; case 69: xlog_request_name(xl, "FillPoly"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); xlog_param(xl, "shape", ENUM | SPECVAL, FETCH8(data, 12), "Complex", 0, "Nonconvex", 1, "Convex", 2, (char *)NULL); xlog_param(xl, "coordinate-mode", ENUM | SPECVAL, FETCH8(data, 13), "Origin", 0, "Previous", 1, (char *)NULL); { int pos = 16; int i = 0; char buf[64]; while (pos + 4 <= len) { sprintf(buf, "points[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_point(xl, data, len, pos); xlog_set_end(xl); pos += 4; i++; } } break; case 70: xlog_request_name(xl, "PolyFillRectangle"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); { int pos = 12; int i = 0; char buf[64]; while (pos + 8 <= len) { sprintf(buf, "rectangles[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_rectangle(xl, data, len, pos); xlog_set_end(xl); pos += 8; i++; } } break; case 71: xlog_request_name(xl, "PolyFillArc"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); { int pos = 12; int i = 0; char buf[64]; while (pos + 12 <= len) { sprintf(buf, "arcs[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_arc(xl, data, len, pos); xlog_set_end(xl); pos += 12; i++; } } break; case 72: xlog_request_name(xl, "PutImage"); xlog_param(xl, "format", ENUM | SPECVAL, FETCH8(data, 1), "Bitmap", 0, "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); xlog_param(xl, "width", DECU, FETCH16(data, 12)); xlog_param(xl, "height", DECU, FETCH16(data, 14)); xlog_param(xl, "dst-x", DEC16, FETCH16(data, 16)); xlog_param(xl, "dst-y", DEC16, FETCH16(data, 18)); xlog_param(xl, "left-pad", DECU, FETCH8(data, 20)); xlog_param(xl, "depth", DECU, FETCH8(data, 21)); /* FIXME: terminal chunk of image data */ break; case 73: xlog_request_name(xl, "GetImage"); xlog_param(xl, "format", ENUM | SPECVAL, FETCH8(data, 1), "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "x", DEC16, FETCH16(data, 8)); xlog_param(xl, "y", DEC16, FETCH16(data, 10)); xlog_param(xl, "width", DECU, FETCH16(data, 12)); xlog_param(xl, "height", DECU, FETCH16(data, 14)); xlog_param(xl, "plane-mask", HEX32, FETCH32(data, 16)); req->replies = 1; break; case 74: xlog_request_name(xl, "PolyText8"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); xlog_param(xl, "x", DEC16, FETCH16(data, 12)); xlog_param(xl, "y", DEC16, FETCH16(data, 14)); { int pos = 16; int i = 0; /* * We now expect a series of TEXTITEM8s packed tightly * together. These take one of two forms: * - a length byte L from 0 to 254, a delta byte * (denoting a horizontal movement), and a string of * L bytes of text * - the special length byte 255 followed by a * four-byte FONT identifier which is always * big-endian regardless of the connection's normal * endianness */ while (pos + 3 <= len) { char buf[64]; int tilen = FETCH8(data, pos); if (tilen == 0 && pos + 3 == len) { /* * Special case. It's valid to have L==0 in the * middle of a PolyText8 request: that encodes a * delta but no text, and Xlib generates * contiguous streams of these to construct a * larger delta than a single delta field can * hold. But the x-coordinate manipulated by * those deltas only has meaning until the end * of the call; thus, a delta-only record * _right_ at the end can have no purpose. In * fact this construction is used as padding * when there are 3 bytes left to align to the * protocol's 4-byte boundary. So in this case, * we finish. */ break; } sprintf(buf, "items[%d]", i); xlog_param(xl, buf, SETBEGIN); if (tilen == 255) { int font = FETCH32(data, pos+1); if (xl->endianness == 'l') { font = (((font >> 24) & 0x000000FF) | ((font >> 8) & 0x0000FF00) | ((font << 8) & 0x00FF0000) | ((font << 24) & 0xFF000000)); } xlog_param(xl, "font", FONT, font); pos += 5; } else { xlog_param(xl, "delta", DEC8, FETCH8(data, pos+1)); xlog_param(xl, "string", STRING, tilen, STRING(data, pos+2, tilen)); pos += tilen + 2; } xlog_set_end(xl); i++; } } break; case 75: xlog_request_name(xl, "PolyText16"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); xlog_param(xl, "x", DEC16, FETCH16(data, 12)); xlog_param(xl, "y", DEC16, FETCH16(data, 14)); { int pos = 16; int i = 0; /* * TEXTITEM16s look just like TEXTITEM8s, except that * the strings of actual text are twice the length (2L * bytes each time). */ while (pos + 3 <= len) { char buf[64]; int tilen = FETCH8(data, pos); if (tilen == 0 && pos + 3 == len) { /* * Special case. It's valid to have L==0 in the * middle of a PolyText8 request: that encodes a * delta but no text, and Xlib generates * contiguous streams of these to construct a * larger delta than a single delta field can * hold. But the x-coordinate manipulated by * those deltas only has meaning until the end * of the call; thus, a delta-only record * _right_ at the end can have no purpose. In * fact this construction is used as padding * when there are 3 bytes left to align to the * protocol's 4-byte boundary. So in this case, * we finish. */ break; } sprintf(buf, "items[%d]", i); xlog_param(xl, buf, SETBEGIN); if (tilen == 255) { xlog_param(xl, "font", FONT, FETCH32(data, pos+1)); pos += 5; } else { xlog_param(xl, "delta", DEC8, FETCH8(data, pos+1)); /* FIXME: decide how to display 2-byte strings */ xlog_param(xl, "string", STRING, 5, "FIXME"); pos += 2*tilen + 2; } xlog_set_end(xl); i++; } } break; case 76: xlog_request_name(xl, "ImageText8"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); xlog_param(xl, "x", DEC16, FETCH16(data, 12)); xlog_param(xl, "y", DEC16, FETCH16(data, 14)); xlog_param(xl, "string", STRING, FETCH8(data, 1), STRING(data, 16, FETCH8(data, 1))); break; case 77: xlog_request_name(xl, "ImageText16"); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); xlog_param(xl, "x", DEC16, FETCH16(data, 12)); xlog_param(xl, "y", DEC16, FETCH16(data, 14)); /* FIXME: decide how to display 2-byte strings */ xlog_param(xl, "string", STRING, 5, "FIXME"); break; case 78: xlog_request_name(xl, "CreateColormap"); xlog_param(xl, "alloc", ENUM | SPECVAL, FETCH8(data, 1), "None", 0, "All", 1, (char *)NULL); xlog_param(xl, "mid", COLORMAP, FETCH32(data, 4)); xlog_param(xl, "window", WINDOW, FETCH32(data, 8)); xlog_param(xl, "visual", VISUALID, FETCH32(data, 12)); break; case 79: xlog_request_name(xl, "FreeColormap"); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); break; case 80: xlog_request_name(xl, "CopyColormapAndFree"); xlog_param(xl, "mid", COLORMAP, FETCH32(data, 4)); xlog_param(xl, "src-cmap", COLORMAP, FETCH32(data, 8)); break; case 81: xlog_request_name(xl, "InstallColormap"); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); break; case 82: xlog_request_name(xl, "UninstallColormap"); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); break; case 83: xlog_request_name(xl, "ListInstalledColormaps"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); req->replies = 1; break; case 84: xlog_request_name(xl, "AllocColor"); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); xlog_param(xl, "red", HEX16, FETCH16(data, 8)); xlog_param(xl, "green", HEX16, FETCH16(data, 10)); xlog_param(xl, "blue", HEX16, FETCH16(data, 12)); req->replies = 1; break; case 85: xlog_request_name(xl, "AllocNamedColor"); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); xlog_param(xl, "name", STRING, FETCH16(data, 8), STRING(data, 12, FETCH16(data, 8))); req->replies = 1; break; case 86: xlog_request_name(xl, "AllocColorCells"); xlog_param(xl, "contiguous", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); xlog_param(xl, "colors", DECU, FETCH16(data, 8)); xlog_param(xl, "planes", DECU, FETCH16(data, 10)); req->replies = 1; break; case 87: xlog_request_name(xl, "AllocColorPlanes"); xlog_param(xl, "contiguous", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); xlog_param(xl, "colors", DECU, FETCH16(data, 8)); xlog_param(xl, "reds", DECU, FETCH16(data, 10)); xlog_param(xl, "greens", DECU, FETCH16(data, 12)); xlog_param(xl, "blues", DECU, FETCH16(data, 14)); req->replies = 1; break; case 88: xlog_request_name(xl, "FreeColors"); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); xlog_param(xl, "plane-mask", HEX32, FETCH32(data, 8)); { int pos = 12; int i = 0; char buf[64]; while (pos + 4 <= len) { sprintf(buf, "pixels[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; i++; } } break; case 89: xlog_request_name(xl, "StoreColors"); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); { int pos = 8; int i = 0; char buf[64]; while (pos + 12 <= len) { sprintf(buf, "items[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_coloritem(xl, data, len, pos); xlog_set_end(xl); pos += 12; i++; } } break; case 90: xlog_request_name(xl, "StoreNamedColor"); xlog_param(xl, "do-red", BOOLEAN, FETCH8(data, 1) & 1); xlog_param(xl, "do-green", BOOLEAN, (FETCH8(data, 1) >> 1) & 1); xlog_param(xl, "do-blue", BOOLEAN, (FETCH8(data, 1) >> 2) & 1); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); xlog_param(xl, "pixel", COLORMAP, FETCH32(data, 8)); xlog_param(xl, "name", STRING, FETCH16(data, 12), STRING(data, 16, FETCH16(data, 12))); break; case 91: xlog_request_name(xl, "QueryColors"); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); { int pos = 8; int i = 0; char buf[64]; while (pos + 4 <= len) { sprintf(buf, "pixels[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; i++; } } req->replies = 1; break; case 92: xlog_request_name(xl, "LookupColor"); xlog_param(xl, "cmap", COLORMAP, FETCH32(data, 4)); xlog_param(xl, "name", STRING, FETCH16(data, 8), STRING(data, 12, FETCH16(data, 8))); req->replies = 1; break; case 93: xlog_request_name(xl, "CreateCursor"); xlog_param(xl, "cid", CURSOR, FETCH32(data, 4)); xlog_param(xl, "source", PIXMAP, FETCH32(data, 8)); xlog_param(xl, "mask", PIXMAP | SPECVAL, FETCH32(data, 12), "None", 0, (char *)NULL); xlog_param(xl, "fore-red", HEX16, FETCH16(data, 16)); xlog_param(xl, "fore-green", HEX16, FETCH16(data, 18)); xlog_param(xl, "fore-blue", HEX16, FETCH16(data, 20)); xlog_param(xl, "back-red", HEX16, FETCH16(data, 22)); xlog_param(xl, "back-green", HEX16, FETCH16(data, 24)); xlog_param(xl, "back-blue", HEX16, FETCH16(data, 26)); xlog_param(xl, "x", DECU, FETCH16(data, 28)); xlog_param(xl, "y", DECU, FETCH16(data, 30)); break; case 94: xlog_request_name(xl, "CreateGlyphCursor"); xlog_param(xl, "cid", CURSOR, FETCH32(data, 4)); xlog_param(xl, "source-font", FONT, FETCH32(data, 8)); xlog_param(xl, "mask-font", FONT | SPECVAL, FETCH32(data, 12), "None", 0, (char *)NULL); xlog_param(xl, "source-char", DECU, FETCH16(data, 16)); xlog_param(xl, "mask-char", DECU, FETCH16(data, 18)); xlog_param(xl, "fore-red", HEX16, FETCH16(data, 20)); xlog_param(xl, "fore-green", HEX16, FETCH16(data, 22)); xlog_param(xl, "fore-blue", HEX16, FETCH16(data, 24)); xlog_param(xl, "back-red", HEX16, FETCH16(data, 26)); xlog_param(xl, "back-green", HEX16, FETCH16(data, 28)); xlog_param(xl, "back-blue", HEX16, FETCH16(data, 30)); break; case 95: xlog_request_name(xl, "FreeCursor"); xlog_param(xl, "cursor", CURSOR, FETCH32(data, 4)); break; case 96: xlog_request_name(xl, "RecolorCursor"); xlog_param(xl, "cursor", CURSOR, FETCH32(data, 4)); xlog_param(xl, "fore-red", HEX16, FETCH16(data, 8)); xlog_param(xl, "fore-green", HEX16, FETCH16(data, 10)); xlog_param(xl, "fore-blue", HEX16, FETCH16(data, 12)); xlog_param(xl, "back-red", HEX16, FETCH16(data, 14)); xlog_param(xl, "back-green", HEX16, FETCH16(data, 16)); xlog_param(xl, "back-blue", HEX16, FETCH16(data, 18)); break; case 97: xlog_request_name(xl, "QueryBestSize"); xlog_param(xl, "class", ENUM | SPECVAL, FETCH8(data, 1), "Cursor", 0, "Tile", 1, "Stipple", 2, (char *)NULL); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "width", DECU, FETCH16(data, 8)); xlog_param(xl, "height", DECU, FETCH16(data, 10)); req->replies = 1; break; case 98: xlog_request_name(xl, "QueryExtension"); xlog_param(xl, "name", STRING, FETCH16(data, 4), STRING(data, 8, FETCH16(data, 4))); req->replies = 1; break; case 99: xlog_request_name(xl, "ListExtensions"); req->replies = 1; break; case 100: xlog_request_name(xl, "ChangeKeyboardMapping"); { int keycode = FETCH8(data, 4); int keycode_count = FETCH8(data, 1); int keysyms_per_keycode = FETCH8(data, 5); int pos = 8; int i; char buf[64]; while (keycode_count > 0) { sprintf(buf, "keycode[%d]", keycode); xlog_param(xl, buf, SETBEGIN); for (i = 0; i < keysyms_per_keycode; i++) { sprintf(buf, "keysyms[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; } xlog_set_end(xl); i++; keycode++; keycode_count--; } } break; case 101: xlog_request_name(xl, "GetKeyboardMapping"); req->first_keycode = FETCH8(data, 4); req->keycode_count = FETCH8(data, 5); xlog_param(xl, "first-keycode", DECU, req->first_keycode); xlog_param(xl, "count", DECU, req->keycode_count); req->replies = 1; break; case 102: xlog_request_name(xl, "ChangeKeyboardControl"); { unsigned i = 8; unsigned bitmask = FETCH32(data, i-4); if (bitmask & 0x00000001) { xlog_param(xl, "key-click-percent", DEC8, FETCH8(data, i)); i += 4; } if (bitmask & 0x00000002) { xlog_param(xl, "bell-percent", DEC8, FETCH8(data, i)); i += 4; } if (bitmask & 0x00000004) { xlog_param(xl, "bell-pitch", DEC16, FETCH16(data, i)); i += 4; } if (bitmask & 0x00000008) { xlog_param(xl, "bell-duration", DEC16, FETCH16(data, i)); i += 4; } if (bitmask & 0x00000010) { xlog_param(xl, "led", DECU, FETCH8(data, i)); i += 4; } if (bitmask & 0x00000020) { xlog_param(xl, "led-mode", ENUM | SPECVAL, FETCH8(data, i), "Off", 0, "On", 1, (char *)NULL); i += 4; } if (bitmask & 0x00000040) { xlog_param(xl, "key", DECU, FETCH8(data, i)); i += 4; } if (bitmask & 0x00000080) { xlog_param(xl, "auto-repeat-mode", ENUM | SPECVAL, FETCH8(data, i), "Off", 0, "On", 1, "Default", 2, (char *)NULL); i += 4; } } break; case 103: xlog_request_name(xl, "GetKeyboardControl"); req->replies = 1; break; case 104: xlog_request_name(xl, "Bell"); xlog_param(xl, "percent", DEC8, FETCH8(data, 1)); break; case 105: xlog_request_name(xl, "ChangePointerControl"); if (FETCH8(data, 10)) xlog_param(xl, "acceleration", RATIONAL16, FETCH16(data, 4), FETCH16(data, 6)); if (FETCH8(data, 11)) xlog_param(xl, "threshold", DEC16, FETCH16(data, 8)); break; case 106: xlog_request_name(xl, "GetPointerControl"); req->replies = 1; break; case 107: xlog_request_name(xl, "SetScreenSaver"); xlog_param(xl, "timeout", DEC16, FETCH16(data, 4)); xlog_param(xl, "interval", DEC16, FETCH16(data, 6)); xlog_param(xl, "prefer-blanking", ENUM | SPECVAL, FETCH8(data, 8), "No", 0, "Yes", 1, "Default", 2, (char *)NULL); xlog_param(xl, "allow-exposures", ENUM | SPECVAL, FETCH8(data, 9), "No", 0, "Yes", 1, "Default", 2, (char *)NULL); break; case 108: xlog_request_name(xl, "GetScreenSaver"); req->replies = 1; break; case 109: xlog_request_name(xl, "ChangeHosts"); xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, 1), "Insert", 0, "Delete", 1, (char *)NULL); xlog_param(xl, "family", ENUM | SPECVAL, FETCH8(data, 4), "Internet", 0, "DECnet", 1, "Chaos", 2, (char *)NULL); xlog_param(xl, "address", HEXSTRING, FETCH16(data, 6), STRING(data, 8, FETCH16(data, 6))); break; case 110: xlog_request_name(xl, "ListHosts"); req->replies = 1; break; case 111: xlog_request_name(xl, "SetAccessControl"); xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, 1), "Disable", 0, "Enable", 1, (char *)NULL); break; case 112: xlog_request_name(xl, "SetCloseDownMode"); xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, 1), "Destroy", 0, "RetainPermanent", 1, "RetainTemporary", 2, (char *)NULL); break; case 113: xlog_request_name(xl, "KillClient"); xlog_param(xl, "resource", HEX32, FETCH32(data, 4)); break; case 114: xlog_request_name(xl, "RotateProperties"); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); xlog_param(xl, "delta", DEC16, FETCH16(data, 10)); { int pos = 8; int i = 0; int n = FETCH16(data, 8); char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "properties[%d]", i); xlog_param(xl, buf, ATOM, FETCH32(data, pos)); pos += 4; } } break; case 115: xlog_request_name(xl, "ForceScreenSaver"); xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, 1), "Reset", 0, "Activate", 1, (char *)NULL); break; case 116: xlog_request_name(xl, "SetPointerMapping"); { int pos = 4; int i = 0; int n = FETCH8(data, 1); char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "map[%d]", i); xlog_param(xl, buf, DECU, FETCH8(data, pos)); pos++; } } req->replies = 1; break; case 117: xlog_request_name(xl, "GetPointerMapping"); req->replies = 1; break; case 118: xlog_request_name(xl, "SetModifierMapping"); { int keycodes_per_modifier = FETCH8(data, 1); int pos = 4; int mod, i; char buf[64]; for (mod = 0; mod < 8; mod++) { sprintf(buf, "modifier[%d]", mod); xlog_param(xl, buf, SETBEGIN); for (i = 0; i < keycodes_per_modifier; i++) { sprintf(buf, "keycodes[%d]", i); xlog_param(xl, buf, DECU, FETCH8(data, pos)); pos++; } xlog_set_end(xl); } } req->replies = 1; break; case 119: xlog_request_name(xl, "GetModifierMapping"); req->replies = 1; break; case 127: /* FIXME: possibly we should not bother to log this by default? */ xlog_request_name(xl, "NoOperation"); break; default: { char buf[64]; sprintf(buf, "UnknownRequest%d", data[0]); xlog_request_name(xl, buf); xlog_param(xl, "bytes", DECU, len); } break; } xlog_request_done(xl, req); } void xlog_do_reply(struct xlog *xl, struct request *req, const void *vdata, int len) { const unsigned char *data = (const unsigned char *)vdata; if (data && !req) { xlog_new_line(); fprintf(stderr, "--- reply received for unknown request sequence" " number %lu\n", (unsigned long)FETCH16(data, 4)); return; } xl->textbuflen = 0; xl->overflow = FALSE; xlog_respond_to(req); if (req->replies == 2) req->replies = 3; /* we've now seen a reply */ xlog_reply_begin(xl); if (!data) { /* * This call is notifying us that the sequence numbering in * the server-to-client stream has now gone past the number * of this request. If it was a multi-reply request to which * we've seen at least one reply already, this is normal and * expected, so we discard the request from the queue and * continue. Otherwise, we print a notification that * something odd happened. */ if (req->replies != 3) xlog_printf(xl, "<no reply received?!>"); req->replies = 1; /* force discard */ xl->textbuflen = 0; /* inhibit printing of actual reply */ } else switch (req->opcode) { case 3: /* GetWindowAttributes */ xlog_param(xl, "backing-store", ENUM | SPECVAL, FETCH8(data, 1), "NotUseful", 0, "WhenMapped", 1, "Always", 2, (char *)NULL); xlog_param(xl, "visual", VISUALID, FETCH32(data, 8)); xlog_param(xl, "class", ENUM | SPECVAL, FETCH16(data, 12), "InputOutput", 1, "InputOnly", 2, (char *)NULL); xlog_param(xl, "bit-gravity", ENUM | SPECVAL, FETCH8(data, 14), "Forget", 0, "NorthWest", 1, "North", 2, "NorthEast", 3, "West", 4, "Center", 5, "East", 6, "SouthWest", 7, "South", 8, "SouthEast", 9, "Static", 10, (char *)NULL); xlog_param(xl, "win-gravity", ENUM | SPECVAL, FETCH8(data, 15), "Unmap", 0, "NorthWest", 1, "North", 2, "NorthEast", 3, "West", 4, "Center", 5, "East", 6, "SouthWest", 7, "South", 8, "SouthEast", 9, "Static", 10, (char *)NULL); xlog_param(xl, "backing-planes", HEX32, FETCH32(data, 16)); xlog_param(xl, "backing-pixel", HEX32, FETCH32(data, 20)); xlog_param(xl, "save-under", BOOLEAN, FETCH8(data, 24)); xlog_param(xl, "map-is-installed", BOOLEAN, FETCH8(data, 25)); xlog_param(xl, "map-state", ENUM | SPECVAL, FETCH8(data, 26), "Unmapped", 0, "Unviewable", 1, "Viewable", 2, (char *)NULL); xlog_param(xl, "override-redirect", BOOLEAN, FETCH8(data, 27)); xlog_param(xl, "colormap", COLORMAP, FETCH32(data, 28)); xlog_param(xl, "all-event-masks", EVENTMASK, FETCH32(data, 32)); xlog_param(xl, "your-event-mask", EVENTMASK, FETCH32(data, 36)); xlog_param(xl, "do-not-propagate-mask", EVENTMASK, FETCH16(data, 40)); break; case 14: /* GetGeometry */ xlog_param(xl, "depth", DECU, FETCH8(data, 1)); xlog_param(xl, "root", WINDOW, FETCH32(data, 8)); xlog_param(xl, "x", DEC16, FETCH16(data, 12)); xlog_param(xl, "y", DEC16, FETCH16(data, 14)); xlog_param(xl, "width", DECU, FETCH16(data, 16)); xlog_param(xl, "height", DECU, FETCH16(data, 18)); xlog_param(xl, "border-width", DECU, FETCH16(data, 20)); break; case 15: /* QueryTree */ xlog_param(xl, "root", WINDOW, FETCH32(data, 8)); xlog_param(xl, "parent", WINDOW | SPECVAL, FETCH32(data, 12), "None", 0, (char *)NULL); { int pos = 32; int i = 0; int n = FETCH16(data, 20); char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "windows[%d]", i); xlog_param(xl, buf, WINDOW, FETCH32(data, pos)); pos += 4; } } break; case 16: /* InternAtom */ xlog_param(xl, "atom", ATOM | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); /* FIXME: here we ought to add to our own list of atom ids, having * recorded enough machine-readable data in req to do so */ break; case 17: /* GetAtomName */ xlog_param(xl, "name", STRING, FETCH16(data, 8), STRING(data, 32, FETCH16(data, 8))); /* FIXME: here we ought to add to our own list of atom ids, having * recorded enough machine-readable data in req to do so */ break; case 20: /* GetProperty */ xlog_param(xl, "format", DECU, FETCH8(data, 1)); xlog_param(xl, "type", ATOM, FETCH32(data, 8)); xlog_param(xl, "bytes-after", DECU, FETCH32(data, 12)); xlog_param(xl, "length", DECU, FETCH32(data, 16)); break; case 21: /* ListProperties */ { int pos = 32; int i = 0; int n = FETCH16(data, 8); char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "atoms[%d]", i); xlog_param(xl, buf, ATOM, FETCH32(data, pos)); pos += 4; } } break; case 23: /* GetSelectionOwner */ xlog_param(xl, "owner", WINDOW | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); break; case 26: /* GrabPointer */ xlog_param(xl, "status", ENUM | SPECVAL, FETCH32(data, 8), "Success", 0, "AlreadyGrabbed", 1, "InvalidTime", 2, "NotViewable", 3, "Frozen", 4, (char *)NULL); break; case 31: /* GrabKeyboard */ xlog_param(xl, "status", ENUM | SPECVAL, FETCH32(data, 8), "Success", 0, "AlreadyGrabbed", 1, "InvalidTime", 2, "NotViewable", 3, "Frozen", 4, (char *)NULL); break; case 38: /* QueryPointer */ xlog_param(xl, "same-screen", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "root", WINDOW, FETCH32(data, 8)); xlog_param(xl, "child", WINDOW | SPECVAL, FETCH32(data, 12), "None", 0, (char *)NULL); xlog_param(xl, "root-x", DEC16, FETCH16(data, 16)); xlog_param(xl, "root-y", DEC16, FETCH16(data, 18)); xlog_param(xl, "win-x", DEC16, FETCH16(data, 20)); xlog_param(xl, "win-y", DEC16, FETCH16(data, 22)); xlog_param(xl, "mask", HEX16, FETCH16(data, 24)); break; case 39: /* GetMotionEvents */ { int pos = 32; int i = 0; int n = FETCH32(data, 8); char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "events[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_timecoord(xl, data, len, pos); xlog_set_end(xl); pos += 8; } } break; case 40: /* TranslateCoordinates */ xlog_param(xl, "child", WINDOW | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); xlog_param(xl, "dst-x", DEC16, FETCH16(data, 12)); xlog_param(xl, "dst-y", DEC16, FETCH16(data, 14)); break; case 43: /* GetInputFocus */ xlog_param(xl, "revert-to", ENUM | SPECVAL, FETCH8(data, 1), "None", 0, "PointerRoot", 1, "Parent", 2, (char *)NULL); xlog_param(xl, "focus", WINDOW | SPECVAL, FETCH32(data, 8), "None", 0, "PointerRoot", 1, (char *)NULL); break; case 44: /* QueryKeymap */ { int pos = 8; int i = 0; int n = 32; char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "keys[%d]", i); xlog_param(xl, buf, DECU, FETCH8(data, pos)); pos++; } } break; case 47: /* QueryFont */ xlog_param(xl, "min-bounds", SETBEGIN); xlog_charinfo(xl, data, len, 8); xlog_set_end(xl); xlog_param(xl, "max-bounds", SETBEGIN); xlog_charinfo(xl, data, len, 24); xlog_set_end(xl); xlog_param(xl, "min-char-or-byte2", DECU, FETCH16(data, 40)); xlog_param(xl, "max-char-or-byte2", DECU, FETCH16(data, 42)); xlog_param(xl, "default-char", DECU, FETCH16(data, 44)); xlog_param(xl, "draw-direction", ENUM | SPECVAL, FETCH8(data, 48), "LeftToRight", 0, "RightToLeft", 1, (char *)NULL); xlog_param(xl, "min-byte1", DECU, FETCH8(data, 49)); xlog_param(xl, "max-byte1", DECU, FETCH8(data, 50)); xlog_param(xl, "all-chars-exist", BOOLEAN, FETCH8(data, 51)); xlog_param(xl, "font-ascent", DEC16, FETCH16(data, 52)); xlog_param(xl, "font-descent", DEC16, FETCH16(data, 54)); { int pos = 32; int i = 0; int n; char buf[64]; n = FETCH16(data, 46); for (i = 0; i < n; i++) { sprintf(buf, "properties[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_fontprop(xl, data, len, pos); xlog_set_end(xl); pos += 8; } n = FETCH32(data, 56); for (i = 0; i < n; i++) { sprintf(buf, "char-infos[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_charinfo(xl, data, len, pos); xlog_set_end(xl); pos += 12; } } break; case 48: /* QueryTextExtents */ xlog_param(xl, "draw-direction", ENUM | SPECVAL, FETCH8(data, 1), "LeftToRight", 0, "RightToLeft", 1, (char *)NULL); xlog_param(xl, "font-ascent", DEC16, FETCH16(data, 8)); xlog_param(xl, "font-descent", DEC16, FETCH16(data, 10)); xlog_param(xl, "overall-ascent", DEC16, FETCH16(data, 12)); xlog_param(xl, "overall-descent", DEC16, FETCH16(data, 14)); xlog_param(xl, "overall-width", DEC32, FETCH32(data, 16)); xlog_param(xl, "overall-left", DEC32, FETCH32(data, 20)); xlog_param(xl, "overall-right", DEC32, FETCH32(data, 24)); break; case 49: /* ListFonts */ { int i, n; int pos = 32; n = FETCH16(data, 8); for (i = 0; i < n; i++) { char buf[64]; int slen; sprintf(buf, "names[%d]", i); slen = FETCH8(data, pos); xlog_param(xl, buf, STRING, slen, STRING(data, pos+1, slen)); pos += slen + 1; } } break; case 50: /* ListFontsWithInfo */ if (FETCH8(data, 1) == 0) { xlog_param(xl, "last-reply", BOOLEAN, 1); break; } xlog_param(xl, "name", STRING, FETCH8(data, 1), STRING(data, 64+8*FETCH16(data, 46), FETCH8(data, 1))); xlog_param(xl, "min-bounds", SETBEGIN); xlog_charinfo(xl, data, len, 8); xlog_set_end(xl); xlog_param(xl, "max-bounds", SETBEGIN); xlog_charinfo(xl, data, len, 24); xlog_set_end(xl); xlog_param(xl, "min-char-or-byte2", DECU, FETCH16(data, 40)); xlog_param(xl, "max-char-or-byte2", DECU, FETCH16(data, 42)); xlog_param(xl, "default-char", DECU, FETCH16(data, 44)); xlog_param(xl, "draw-direction", ENUM | SPECVAL, FETCH8(data, 48), "LeftToRight", 0, "RightToLeft", 1, (char *)NULL); xlog_param(xl, "min-byte1", DECU, FETCH8(data, 49)); xlog_param(xl, "max-byte1", DECU, FETCH8(data, 50)); xlog_param(xl, "all-chars-exist", BOOLEAN, FETCH8(data, 51)); xlog_param(xl, "font-ascent", DEC16, FETCH16(data, 52)); xlog_param(xl, "font-descent", DEC16, FETCH16(data, 54)); xlog_param(xl, "replies-hint", DEC16, FETCH32(data, 56)); { int pos = 64; int i = 0; int n; char buf[64]; n = FETCH16(data, 46); for (i = 0; i < n; i++) { sprintf(buf, "properties[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_fontprop(xl, data, len, pos); xlog_set_end(xl); pos += 8; } } break; case 52: /* GetFontPath */ { int i, n; int pos = 32; n = FETCH16(data, 8); for (i = 0; i < n; i++) { char buf[64]; int slen; sprintf(buf, "path[%d]", i); slen = FETCH8(data, pos); xlog_param(xl, buf, STRING, slen, STRING(data, pos+1, slen)); pos += slen + 1; } } break; case 73: /* GetImage */ xlog_param(xl, "depth", DECU, FETCH8(data, 1)); xlog_param(xl, "visual", VISUALID | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); /* FIXME: arbitrary image data left to be dumped */ break; case 83: /* ListInstalledColormaps */ { int i, n; int pos = 32; n = FETCH16(data, 8); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "cmaps[%d]", i); xlog_param(xl, buf, COLORMAP, FETCH32(data, pos)); pos += 4; } } break; case 84: /* AllocColor */ xlog_param(xl, "red", HEX16, FETCH16(data, 8)); xlog_param(xl, "green", HEX16, FETCH16(data, 10)); xlog_param(xl, "blue", HEX16, FETCH16(data, 12)); xlog_param(xl, "pixel", HEX32, FETCH32(data, 16)); break; case 85: /* AllocNamedColor */ xlog_param(xl, "pixel", HEX32, FETCH32(data, 8)); xlog_param(xl, "exact-red", HEX16, FETCH16(data, 12)); xlog_param(xl, "exact-green", HEX16, FETCH16(data, 14)); xlog_param(xl, "exact-blue", HEX16, FETCH16(data, 16)); xlog_param(xl, "visual-red", HEX16, FETCH16(data, 18)); xlog_param(xl, "visual-green", HEX16, FETCH16(data, 20)); xlog_param(xl, "visual-blue", HEX16, FETCH16(data, 22)); break; case 86: /* AllocColorCells */ { int i, n; int pos = 32; n = FETCH16(data, 8); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "pixels[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; } n = FETCH16(data, 10); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "masks[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; } } break; case 87: /* AllocColorPlanes */ xlog_param(xl, "red-mask", HEX32, FETCH32(data, 12)); xlog_param(xl, "green-mask", HEX32, FETCH32(data, 16)); xlog_param(xl, "blue-mask", HEX32, FETCH32(data, 20)); { int i, n; int pos = 32; n = FETCH16(data, 8); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "pixels[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; } } break; case 91: /* QueryColors */ { int i, n; int pos = 32; n = FETCH16(data, 8); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "colors[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "red", HEX16, FETCH16(data, pos)); xlog_param(xl, "green", HEX16, FETCH16(data, pos+2)); xlog_param(xl, "blue", HEX16, FETCH16(data, pos+4)); xlog_set_end(xl); pos += 4; } } break; case 92: /* LookupColor */ xlog_param(xl, "exact-red", HEX16, FETCH16(data, 8)); xlog_param(xl, "exact-green", HEX16, FETCH16(data, 10)); xlog_param(xl, "exact-blue", HEX16, FETCH16(data, 12)); xlog_param(xl, "visual-red", HEX16, FETCH16(data, 14)); xlog_param(xl, "visual-green", HEX16, FETCH16(data, 16)); xlog_param(xl, "visual-blue", HEX16, FETCH16(data, 18)); break; case 97: /* QueryBestSize */ xlog_param(xl, "width", DECU, FETCH16(data, 8)); xlog_param(xl, "height", DECU, FETCH16(data, 10)); break; case 98: /* QueryExtension */ xlog_param(xl, "major-opcode", DECU, FETCH8(data, 8)); xlog_param(xl, "first-event", DECU, FETCH8(data, 9)); xlog_param(xl, "first-error", DECU, FETCH8(data, 10)); /* FIXME: we should add to our list of known-extension opcodes */ break; case 99: /* ListExtensions */ { int i, n; int pos = 32; n = FETCH8(data, 1); for (i = 0; i < n; i++) { char buf[64]; int slen; sprintf(buf, "names[%d]", i); slen = FETCH8(data, pos); xlog_param(xl, buf, STRING, slen, STRING(data, pos+1, slen)); pos += slen + 1; } } break; case 101: /* GetKeyboardMapping */ { int keycode = req->first_keycode; int keycode_count = req->keycode_count; int keysyms_per_keycode = FETCH8(data, 1); int pos = 32; int i; char buf[64]; while (keycode_count > 0) { sprintf(buf, "keycode[%d]", keycode); xlog_param(xl, buf, SETBEGIN); for (i = 0; i < keysyms_per_keycode; i++) { sprintf(buf, "keysyms[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; } xlog_set_end(xl); i++; keycode++; keycode_count--; } } break; case 103: /* GetKeyboardControl */ xlog_param(xl, "global-auto-repeat", ENUM | SPECVAL, FETCH8(data, 1), "Off", 0, "On", 1, (char *)NULL); xlog_param(xl, "led-mask", HEX32, FETCH32(data, 8)); xlog_param(xl, "key-click-percent", DECU, FETCH8(data, 12)); xlog_param(xl, "bell-percent", DECU, FETCH8(data, 13)); xlog_param(xl, "bell-pitch", DECU, FETCH16(data, 14)); xlog_param(xl, "bell-duration", DECU, FETCH16(data, 16)); { int i, n; int pos = 32; n = 32; for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "auto-repeats[%d]", i); xlog_param(xl, buf, HEX8, FETCH8(data, pos)); pos++; } } break; case 106: /* GetPointerControl */ xlog_param(xl, "acceleration", RATIONAL16, FETCH16(data, 8), FETCH16(data, 10)); xlog_param(xl, "threshold", DEC16, FETCH16(data, 12)); break; case 108: /* GetScreenSaver */ xlog_param(xl, "timeout", DEC16, FETCH16(data, 8)); xlog_param(xl, "interval", DEC16, FETCH16(data, 10)); xlog_param(xl, "prefer-blanking", ENUM | SPECVAL, FETCH8(data, 12), "No", 0, "Yes", 1, (char *)NULL); xlog_param(xl, "allow-exposures", ENUM | SPECVAL, FETCH8(data, 13), "No", 0, "Yes", 1, (char *)NULL); break; case 110: /* ListHosts */ xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, 1), "Disabled", 0, "Enabled", 1, (char *)NULL); { int i, n; int pos = 32; n = FETCH16(data, 8); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "hosts[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "family", ENUM | SPECVAL, FETCH8(data, pos), "Internet", 0, "DECnet", 1, "Chaos", 2, (char *)NULL); xlog_param(xl, "address", HEXSTRING, FETCH16(data, pos+2), STRING(data, pos+4, FETCH16(data, pos+2))); xlog_set_end(xl); pos += 4 + ((FETCH16(data, pos+2) + 3) &~ 3); } } break; case 116: /* SetPointerMapping */ xlog_param(xl, "status", ENUM | SPECVAL, FETCH8(data, 1), "Success", 0, "Busy", 1, (char *)NULL); break; case 117: /* GetPointerMapping */ { int pos = 32; int i = 0; int n = FETCH8(data, 1); char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "map[%d]", i); xlog_param(xl, buf, DECU, FETCH8(data, pos)); pos++; } } break; case 118: /* SetModifierMapping */ xlog_param(xl, "status", ENUM | SPECVAL, FETCH8(data, 1), "Success", 0, "Busy", 1, "Failed", 2, (char *)NULL); break; case 119: /* GetModifierMapping */ { int keycodes_per_modifier = FETCH8(data, 1); int pos = 32; int mod, i; char buf[64]; for (mod = 0; mod < 8; mod++) { sprintf(buf, "modifier[%d]", mod); xlog_param(xl, buf, SETBEGIN); for (i = 0; i < keycodes_per_modifier; i++) { sprintf(buf, "keycodes[%d]", i); xlog_param(xl, buf, DECU, FETCH8(data, pos)); pos++; } xlog_set_end(xl); } } break; default: xlog_printf(xl, "<unable to decode reply data>"); break; } if (xl->textbuflen) { xlog_reply_end(xl); xlog_response_done(xl->textbuf); } if (req->replies == 1) { struct request *newhead = xl->rhead->next; free_request(xl->rhead); xl->rhead = newhead; if (xl->rhead) xl->rhead->prev = NULL; else xl->rtail = NULL; } } void xlog_do_error(struct xlog *xl, struct request *req, const void *vdata, int len) { const unsigned char *data = (const unsigned char *)vdata; int errcode; xl->textbuflen = 0; xl->overflow = FALSE; xlog_respond_to(req); xl->reqlogstate = 3; /* for things with parameters */ errcode = FETCH8(data, 1); switch (errcode) { case 1: xlog_printf(xl, "BadRequest"); break; case 2: xlog_printf(xl, "BadValue("); xlog_param(xl, "value", HEX32, FETCH32(data, 4)); xlog_printf(x��l, ")"); break; case 3: xlog_printf(xl, "BadWindow("); xl->reqlogstate = 3; xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); xlog_printf(xl, ")"); break; case 4: xlog_printf(xl, "BadPixmap("); xl->reqlogstate = 3; xlog_param(xl, "pixmap", PIXMAP, FETCH32(data, 4)); xlog_printf(xl, ")"); break; case 5: xlog_printf(xl, "BadAtom("); xl->reqlogstate = 3; xlog_param(xl, "atom", ATOM, FETCH32(data, 4)); xlog_printf(xl, ")"); break; case 6: xlog_printf(xl, "BadCursor("); xl->reqlogstate = 3; xlog_param(xl, "cursor", CURSOR, FETCH32(data, 4)); xlog_printf(xl, ")"); break; case 7: xlog_printf(xl, "BadFont("); xl->reqlogstate = 3; xlog_param(xl, "font", FONT, FETCH32(data, 4)); xlog_printf(xl, ")"); break; case 8: xlog_printf(xl, "BadMatch"); break; case 9: xlog_printf(xl, "BadDrawable("); xl->reqlogstate = 3; xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_printf(xl, ")"); break; case 10: xlog_printf(xl, "BadAccess"); break; case 11: xlog_printf(xl, "BadAlloc"); break; case 12: xlog_printf(xl, "BadColormap("); xl->reqlogstate = 3; xlog_param(xl, "colormap", COLORMAP, FETCH32(data, 4)); xlog_printf(xl, ")"); break; case 13: xlog_printf(xl, "BadGContext("); xl->reqlogstate = 3; xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 4)); xlog_printf(xl, ")"); break; case 14: xlog_printf(xl, "BadIDChoice("); xl->reqlogstate = 3; xlog_param(xl, "id", HEX32, FETCH32(data, 4)); xlog_printf(xl, ")"); break; case 15: xlog_printf(xl, "BadName"); break; case 16: xlog_printf(xl, "BadLength"); break; case 17: xlog_printf(xl, "BadImplementation"); break; default: xlog_printf(xl, "UnknownError%d", errcode); } xlog_response_done(xl->textbuf); /* * Dequeue this request, now we've seen an error response to it. */ { struct request *newhead = xl->rhead->next; free_request(xl->rhead); xl->rhead = newhead; if (xl->rhead) xl->rhead->prev = NULL; else xl->rtail = NULL; } } void xlog_do_event(struct xlog *xl, const void *vdata, int len) { const unsigned char *data = (const unsigned char *)vdata; xl->textbuflen = 0; xl->overflow = FALSE; xlog_event(xl, data, len, 0); xlog_new_line(); fprintf(stderr, "--- %s\n", xl->textbuf); } void xlog_c2s(struct xlog *xl, const void *vdata, int len) { const unsigned char *data = (const unsigned char *)vdata; /* * Remember that variables declared auto in this function may * not be used across a crReturn, and hence also read() or * ignore(). */ int i; if (xl->error) return; crBegin(xl->c2sstate); /* * Endianness byte and subsequent padding byte. */ read(c2s, 1); if (xl->c2sbuf[0] == 'l' || xl->c2sbuf[0] == 'B') { xl->endianness = xl->c2sbuf[0]; } else { err((xl, "initial endianness byte (0x%02X) unrecognised", *data)); } ignore(c2s, 1); /* * Protocol major and minor version, and authorisation detail * string lengths. * * We only log the protocol version if it doesn't match our * expectations; we definitely don't want to log the auth data, * both for security reasons and because we're meddling with * them ourselves in any case. */ read(c2s, 8); if ((i = READ16(xl->c2sbuf)) != 11) err((xl, "major protocol version (0x%04X) unrecognised", i)); if ((i = READ16(xl->c2sbuf + 2)) != 0) warn((xl, "minor protocol version (0x%04X) unrecognised", i)); i = READ16(xl->c2sbuf + 4); i = (i + 3) &~ 3; i += READ16(xl->c2sbuf + 6); i = (i + 3) &~ 3; ignore(c2s, 2 + i); /* * Now we expect a steady stream of X requests. */ while (1) { read(c2s, 4); i = READ16(xl->c2sbuf + 2); readfrom(c2s, i*4, 4); xlog_do_request(xl, xl->c2sbuf, xl->c2slen); } crFinish; } void xlog_s2c(struct xlog *xl, const void *vdata, int len) { const unsigned char *data = (const unsigned char *)vdata; /* * Remember that variables declared auto in this function may * not be used across a crReturn, and hence also read() or * ignore(). */ int i; if (xl->error) return; crBegin(xl->s2cstate); /* * Initial phase of data coming from the server is expected to * be composed of packets with an 8-byte header whose final two * bytes give the number of 4-byte words beyond that header. */ while (1) { read(s2c, 8); if (xl->endianness == -1) err((xl, "server reply received before client sent endianness")); i = READ16(xl->s2cbuf + 6); readfrom(s2c, 8+i*4, 8); /* * The byte at the front of one of these packets is 0 for a * failed authorisation, 1 for a successful authorisation, * and 2 for an incomplete authorisation indicating more * data should be sent. * * Since we proxy the X authorisation ourselves and have a * fixed set of protocols we understand of which we know * none involve type-2 packets, we never expect to see one. * 0 is also grounds for ceasing to log the connection; that * leaves 1, which terminates this loop and we move on to * the main phase of the protocol. * * (We might some day need to extend this code so that a * type-2 packet is processed and we look for another packet * of this type, which is why I've written this as a while * loop with an unconditional break at the end instead of * simple straight-through code. We would only need to stick * a 'continue' at the end of handling a type-2 packet to * make this change.) */ if (xl->s2cbuf[0] == 0) err((xl, "server refused authorisation, reason \"%.*s\"", xl->s2cbuf + 8, min(xl->s2clen-8, xl->s2cbuf[1]))); else if (xl->s2cbuf[0] == 2) err((xl, "server sent incomplete-authorisation packet, which" " is unsupported by xtrace")); else if (xl->s2cbuf[0] != 1) err((xl, "server sent unrecognised authorisation-time opcode %d", xl->s2cbuf[0])); /* * Now we're sitting on a successful authorisation packet. * FIXME: we might usefully log some of its contents, though * probably optionally. Even if we don't, we could at least * save some resource ids - windows, colormaps, visuals and * so on - to lend context to logging of later requests * which cite them. */ break; } /* * In the main protocol phase, packets received from the server * come in three types: * * - Replies. These are distinguished by their first byte being * 1. They have a base length of 32 bytes, and at offset 4 * they contain a 32-bit length field indicating how many * more 4-byte words should be added to that base length. * - Errors. These are distinguished by their first byte being * 0, and all have a length of exactly 32 bytes. * - Events. These are distinguished by their first byte being * anything other than 0 or 1, and all have a length of * exactly 32 bytes too. */ while (1) { /* Read the base 32 bytes of any server packet. */ read(s2c, 32); /* If it's a reply, read additional data if any. */ if (xl->s2cbuf[0] == 1) { i = READ32(xl->s2cbuf + 4); readfrom(s2c, 32 + i*4, 32); } /* * All three major packet types include a sequence number, * in the same position within the packet. So our first task * is to discard outstanding requests from our stored list * until we reach the one to which this packet refers. * * The sole known exception to this is the KeymapNotify * event. FIXME: should we revise this so it's not * centralised after all, in case extension-defined events * break this invariant further? */ if (xl->s2cbuf[0] != 11) { i = READ16(xl->s2cbuf + 2); while (xl->rhead && xl->rhead->seqnum != i) { struct request *nexthead = xl->rhead->next; if (xl->rhead->replies) { /* A request that expected a reply got none. Report that. */ xlog_do_reply(xl, xl->rhead, NULL, 0); /* That will have taken the request off the list itself. */ } else { sfree(xl->rhead->text); sfree(xl->rhead); } xl->rhead = nexthead; } if (xl->rhead) xl->rhead->prev = NULL; else xl->rtail = NULL; } /* * Now we can hand off to the individual functions that * separately process the three packet types. */ if (xl->s2cbuf[0] == 1) { xlog_do_reply(xl, xl->rhead, xl->s2cbuf, xl->s2clen); } else if (xl->s2cbuf[0] == 0) { xlog_do_error(xl, xl->rhead, xl->s2cbuf, xl->s2clen); } else { xlog_do_event(xl, xl->s2cbuf, xl->s2clen); } } crFinish; } /* ---------------------------------------------------------------------- * The following code implements a `backend' which pretends to be * ssh.c: it receives new X connections on a local listening port * rather than via messages from an SSH server, but then passes them * on to x11fwd.c just as if they had come from the latter. */ struct ssh_channel { const struct plug_function_table *fn; Socket ps; /* proxy-side socket (talking to the X client) */ Socket xs; /* x11fwd.c socket (talking to the X server) */ struct xlog *xl; }; struct X11Display *x11disp; void sshfwd_close(struct ssh_channel *c) { sk_close(c->ps); xlog_free(c->xl); sfree(c); } int sshfwd_write(struct ssh_channel *c, char *buf, int len) { xlog_s2c(c->xl, buf, len); return sk_write(c->ps, buf, len); } void sshfwd_unthrottle(struct ssh_channel *c, int bufsize) { if (bufsize < BUFLIMIT) sk_set_frozen(c->ps, 0); } static void xpconn_log(Plug plug, int type, SockAddr addr, int port, const char *error_msg, int error_code) { fprintf(stderr, "Socket error: %s\n", error_msg); } static int xpconn_closing(Plug plug, const char *error_msg, int error_code, int calling_back) { struct ssh_channel *c = (struct ssh_channel *)plug; x11_close(c->xs); sshfwd_close(c); return 1; } static int xpconn_receive(Plug plug, int urgent, char *data, int len) { struct ssh_channel *c = (struct ssh_channel *)plug; xlog_c2s(c->xl, data, len); return x11_send(c->xs, data, len); } static void xpconn_sent(Plug plug, int bufsize) { struct ssh_channel *c = (struct ssh_channel *)plug; if (bufsize == 0) x11_unthrottle(c->xs); } static int xproxy_accepting(Plug p, OSSocket sock) { static const struct plug_function_table fn_table = { xpconn_log, xpconn_closing, xpconn_receive, xpconn_sent, NULL }; Socket s; struct ssh_channel *c = snew(struct ssh_channel); const char *err; c->fn = &fn_table; /* * FIXME: the network.h abstraction apparently contains no way * to get the remote endpoint address of a connected socket, * either by funnelling back from accept() or by later * getpeername(). If we fix this, we'll be able to replace the * NULL,-1 in the call below, and that'll let us provide * XDM-AUTHORIZATION-1 on the proxy socket if the user wants it. */ if ((err = x11_init(&c->xs, x11disp, c, NULL, -1, &cfg)) != NULL) { fprintf(stderr, "Error opening connection to X display: %s\n", err); return 1; /* reject connection */ } c->ps = s = sk_register(sock, (Plug)c); if ((err = sk_socket_error(s)) != NULL) { sfree(c); return err != NULL; } sk_set_private_ptr(s, c); sk_set_frozen(s, 0); c->xl = xlog_new(); return 0; } static void xproxy_log(Plug plug, int type, SockAddr addr, int port, const char *error_msg, int error_code) { } static int xproxy_closing(Plug plug, const char *error_msg, int error_code, int calling_back) { assert(!"Should never get here"); } static int xproxy_receive(Plug plug, int urgent, char *data, int len) { assert(!"Should never get here"); } static void xproxy_sent(Plug plug, int bufsize) { assert(!"Should never get here"); } /* * Set up a listener for the new X proxy. Returns the display number * allocated. */ int start_xproxy(const Config *cfg, int mindisplaynum) { static const struct plug_function_table fn_table = { xproxy_log, xproxy_closing, xproxy_receive, /* should not happen... */ xproxy_sent, /* also should not happen */ xproxy_accepting }; static const struct plug_function_table *plugptr = &fn_table; const char *err; Socket s; while (1) { int port = mindisplaynum + 6000; s = new_listener(NULL, port, (Plug) &plugptr, FALSE, cfg, ADDRTYPE_IPV4); if ((err = sk_socket_error(s)) != NULL) { char *thaterr = dupstr(err); char *thiserr = strerror(EADDRINUSE); int cmpret = !strcmp(thaterr, thiserr); if (!cmpret) { fprintf(stderr, "Error creating X server socket: %s\n", thaterr); } sfree(thaterr); mindisplaynum++; continue; } else break; } return mindisplaynum; } /* ---------------------------------------------------------------------- * Unix-specific main program. */ int childpid = -1; char *authfilename; void sigchld(int sig) { pid_t ret; int status; while ((ret = waitpid(-1, &status, WNOHANG)) > 0) { if (childpid >= 0 && ret == childpid) { if (WIFEXITED(status)) { unlink(authfilename); exit(WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { unlink(authfilename); exit(128 + WTERMSIG(status)); } } } } void fatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } void modalfatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } void cmdline_error(char *p, ...) { va_list ap; fprintf(stderr, "plink: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } int uxsel_input_add(int fd, int rwx) { return 0; } void uxsel_input_remove(int id) { } void timer_change_notify(long next) { } void read_random_seed(noise_consumer_t consumer) {} void write_random_seed(void *data, int len) {} const char platform_x11_best_transport[] = "unix"; char *platform_get_x_display(void) { return dupstr(getenv("DISPLAY")); } int main(int argc, char **argv) { int *fdlist; int fd; int i, fdcount, fdsize, fdstate; long now; char **cmd = NULL; int displaynum; char hostname[1024]; pid_t pid; fdlist = NULL; fdcount = fdsize = 0; cfg.x11_display[0] = '\0'; while (--argc > 0) { char *p = *++argv; if (*p == '-') { /* No command-line options yet supported */ /* Configure mindisplaynum */ /* Configure proxy-side auth */ /* -display option, of course */ /* A server mode, in which we print our connection details and don't fork? */ /* Logging config: filter requests, filter events, tune display of sequence numbers and connection ids */ /* Log output file */ } else { cmd = argv; break; } } if (!cmd) { fprintf(stderr, "xtrace: must specify a command to run\n"); return 1; } sk_init(); uxsel_init(); random_ref(); /* FIXME: we assume this doesn't overflow, which is technically iffy */ gethostname(hostname, lenof(hostname)); hostname[lenof(hostname)-1] = '\0'; /* FIXME: do we need to initialise more of cfg? */ signal(SIGCHLD, sigchld); displaynum = start_xproxy(&cfg, 10); x11disp = x11_setup_display(cfg.x11_display, X11_MIT, &cfg); /* FIXME: configurable directory? At the very least, look at TMPDIR etc */ authfilename = dupstr("/tmp/xtrace-authority-XXXXXX"); { int authfd, oldumask; FILE *authfp; SockAddr addr; char *canonicalname; char addrbuf[4]; char dispnumstr[64]; oldumask = umask(077); authfd = mkstemp(authfilename); umask(oldumask); authfp = fdopen(authfd, "wb"); addr = name_lookup(hostname, 6000 + displaynum, &canonicalname, &cfg, ADDRTYPE_IPV4); sk_addrcopy(addr, addrbuf); /* Big-endian 2-byte number: zero, meaning IPv4 */ fputc(0, authfp); fputc(0, authfp); /* Length-4 string which is the IP address in binary */ fputc(0, authfp); fputc(4, authfp); fwrite(addrbuf, 1, 4, authfp); /* String form of the display number */ sprintf(dispnumstr, "%d", displaynum); fputc(strlen(dispnumstr) >> 8, authfp); fputc(strlen(dispnumstr) & 0xFF, authfp); fputs(dispnumstr, authfp); /* String giving the auth type */ fputc(strlen(x11disp->remoteauthprotoname) >> 8, authfp); fputc(strlen(x11disp->remoteauthprotoname) & 0xFF, authfp); fputs(x11disp->remoteauthprotoname, authfp); /* String giving the auth data itself */ fputc(x11disp->remoteauthdatalen >> 8, authfp); fputc(x11disp->remoteauthdatalen & 0xFF, authfp); fwrite(x11disp->remoteauthdata, 1, x11disp->remoteauthdatalen, authfp); fclose(authfp); } pid = fork(); if (pid < 0) { perror("fork"); unlink(authfilename); exit(1); } else if (pid == 0) { putenv(dupprintf("DISPLAY=%s:%d", hostname, displaynum)); putenv(dupprintf("XAUTHORITY=%s", authfilename)); execvp(cmd[0], cmd); perror("exec"); exit(127); } else childpid = pid; now = GETTICKCOUNT(); while (1) { fd_set rset, wset, xset; int maxfd; int rwx; int ret; FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&xset); maxfd = 0; /* Count the currently active fds. */ i = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) i++; /* Expand the fdlist buffer if necessary. */ if (i > fdsize) { fdsize = i + 16; fdlist = sresize(fdlist, fdsize, int); } /* * Add all currently open fds to the select sets, and store * them in fdlist as well. */ fdcount = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) { fdlist[fdcount++] = fd; if (rwx & 1) FD_SET_MAX(fd, maxfd, rset); if (rwx & 2) FD_SET_MAX(fd, maxfd, wset); if (rwx & 4) FD_SET_MAX(fd, maxfd, xset); } do { long next, ticks; struct timeval tv, *ptv; if (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); if (ticks < 0) ticks = 0; /* just in case */ tv.tv_sec = ticks / 1000; tv.tv_usec = ticks % 1000 * 1000; ptv = &tv; } else { ptv = NULL; } ret = select(maxfd, &rset, &wset, &xset, ptv); if (ret == 0) now = next; else { long newnow = GETTICKCOUNT(); /* * Check to see whether the system clock has * changed massively during the select. */ if (newnow - now < 0 || newnow - now > next - now) { /* * If so, look at the elapsed time in the * select and use it to compute a new * tickcount_offset. */ long othernow = now + tv.tv_sec * 1000 + tv.tv_usec / 1000; /* So we'd like GETTICKCOUNT to have returned othernow, * but instead it return newnow. Hence ... */ tickcount_offset += othernow - newnow; now = othernow; } else { now = newnow; } } } while (ret < 0 && errno == EINTR); if (ret < 0) { perror("select"); fflush(NULL); exit(1); } for (i = 0; i < fdcount; i++) { fd = fdlist[i]; /* * We must process exceptional notifications before * ordinary readability ones, or we may go straight * past the urgent marker. */ if (FD_ISSET(fd, &xset)) select_result(fd, 4); if (FD_ISSET(fd, &rset)) select_result(fd, 1); if (FD_ISSET(fd, &wset)) select_result(fd, 2); } } } Revision-number: 8505 Prop-content-length: 164 Content-length: 164 K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-25T16:36:23.654276Z K 7 svn:log V 64 Fix obvious gormlessness in decoding the response to QueryTree. PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 864a0ce5a398559354d1f30bd9e5e169 Text-delta-base-sha1: 88b304d176a707eef63abcbfbcc5c9664de15f10 Text-content-length: 43 Text-content-md5: 1571052eff0f76552c5b7977f2b845be Text-content-sha1: 6d4e092f72899987495214733b1bbbe78c17da7f Content-length: 43 SVN���� �g��i16���� Revision-number: 8506 Prop-content-length: 440 Content-length: 440 K 8 svn:date V 27 2009-04-25T16:38:59.948860Z K 7 svn:log V 339 Another PuTTY spinoff: 'psocks', which reuses the simple SOCKS server implementation from PuTTY's dynamic port forwarding to construct a local unauthenticated SOCKS proxy which can be put into a logging mode. Handy when you want to know exactly what your web browser is doing: just tell it to use psocks as its SOCKS server, and log away. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a3291fa923f86f3bfd790c159edbf528 Text-delta-base-sha1: db4792e5e6de4a2cb279b1c302a7b740aa981b93 Text-content-length: 137 Text-content-md5: c59dca416c78e839446ed53b84ce79f0 Text-content-sha1: 193a4d613f32f17d3b7e57ffecd98f3af9602cff Content-length: 137 SVN��>2 s�%�s�$psocks : [U] uxsocks portfwd timing misc version tree234 proxy uxsel uxnet + uxmisc pproxy nocproxy time Node-path: putty-spinoffs/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 239 Content-length: 239 K 10 svn:ignore V 206 Makefile.gtk Makefile.in Makefile.local Makefile aclocal.m4 autom4te.cache config.status configure install-sh local plink pterm putty puttytel psftp pscp puttygen psocks xtrace uxconfig.in uxconfig.h *.log PROPS-END Node-path: putty-spinoffs/unix/uxsocks.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 11021 Text-content-md5: ebe87985bd1cb330ff21a79b3af912f9 Text-content-sha1: 8217bb371c4aee1b0f3f72fddfbae5273d46641f Content-length: 11031 PROPS-END SVN���/* * Main program for a simple Unix SOCKS server based on the PuTTY * SOCKS code. */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #ifndef HAVE_NO_SYS_SELECT_H #include <sys/select.h> #endif #include "putty.h" #include "ssh.h" /* * FIXME: what's with IPV4 not working if I give ADDRTYPE_UNSPEC? * * FIXME: it would be good if we had a means of the network * backend notifying its client when an asynchronous connect call * succeeded. Then we could move the pfd_confirm() to where it * should be. * * FIXME: another missing feature is one-way shutdowns of sockets. * * FIXME: amalgamating successive log lines with the same source * and destination might be another neat feature. * * FIXME: and also splitting the amalgamated data back up into * lines of text, _but_ only if they look like actual text (er, * whatever that means). */ Config cfg; #define BUFLIMIT 16384 enum { LOG_NONE, LOG_DIALOGUE, LOG_FILES }; int logmode = LOG_NONE; int cindex = 0; /* ---------------------------------------------------------------------- * The following code implements a `backend' which pretends to be * ssh.c: it receives notifications of new forwarded connections * from portfwd.c's listener and SOCKS server implementation, but * instead of forwarding them down an SSH connection it simply * gateways them to outgoing connections. * * (Now that we have multiple `backends' supporting port forwarding, * it might be useful to have the five functions new_sock_channel, * ssh_send_port_open, sshfwd_close, sshfwd_unthrottle and * sshfwd_write become part of the official backend interface, so * that portfwd.c is _officially_ a separate module rather than an * adjunct to ssh.c. Then again, perhaps not: that's only really * critical if two backends _in the same binary_ want to talk to * portfwd.c, and as yet I can't think of any sensible reason to * want to run this module's local SOCKS server and SSH port * forwarding in the same process!) */ struct ssh_channel { const struct plug_function_table *fn; Socket clients; Socket s; char *host; int port; int index; FILE *outfp, *infp; }; static void print_c_string(char *data, int len) { while (len--) { char c = *data++; if (c == '\n') fputs("\\n", stdout); else if (c == '\r') fputs("\\r", stdout); else if (c == '\t') fputs("\\t", stdout); else if (c == '\b') fputs("\\b", stdout); else if (c == '\\') fputs("\\\\", stdout); else if (c == '"') fputs("\\\"", stdout); else if (c >= 32 && c <= 126) fputc(c, stdout); else fprintf(stdout, "\\%03o", (unsigned char)c); } } static void socks_log(Plug plug, int type, SockAddr addr, int port, const char *error_msg, int error_code) { /* FIXME? */ } static int socks_closing(Plug plug, const char *error_msg, int error_code, int calling_back) { struct ssh_channel *c = (struct ssh_channel *)plug; pfd_close(c->clients); sshfwd_close(c); return 1; } static int socks_receive(Plug plug, int urgent, char *data, int len) { struct ssh_channel *c = (struct ssh_channel *)plug; if (logmode == LOG_DIALOGUE) { char *p = data; int pl = len; while (pl > 0) { int thislen; char *q = memchr(p, '\n', pl); if (q) thislen = q - p + 1; else thislen = pl; printf("%d -> %s:%d recv \"", c->index, c->host, c->port); print_c_string(p, thislen); printf("\"\n"); p += thislen; pl -= thislen; } fflush(stdout); } else if (logmode == LOG_FILES) { if (c->infp) fwrite(data, 1, len, c->infp); } int bufsize = pfd_send(c->clients, data, len); if (bufsize > BUFLIMIT) sk_set_frozen(c->s, 1); return 1; } static void socks_sent(Plug plug, int bufsize) { struct ssh_channel *c = (struct ssh_channel *)plug; if (bufsize < BUFLIMIT) pfd_unthrottle(c->clients); } void *new_sock_channel(void *handle, Socket s) { struct ssh_channel *c = snew(struct ssh_channel); c->clients = s; c->s = NULL; c->host = NULL; c->port = -1; c->index = cindex++; c->infp = c->outfp = NULL; return c; } void ssh_send_port_open(void *vc, char *hostname, int port, char *org) { static const struct plug_function_table fn_table = { socks_log, socks_closing, socks_receive, socks_sent, NULL }; struct ssh_channel *c = (struct ssh_channel *)vc; SockAddr addr; const char *err; char *dummy_realhost; /* * Try to find host. */ addr = name_lookup(hostname, port, &dummy_realhost, &cfg, ADDRTYPE_IPV4); if ((err = sk_addr_error(addr)) != NULL) { sk_addr_free(addr); return; /* FIXME: what do we do here? */ } c->fn = &fn_table; c->s = new_connection(addr, dummy_realhost, port, 0, 1, 0, 0, (Plug)c, &cfg); c->host = dupstr(hostname); c->port = port; if (logmode == LOG_DIALOGUE) { printf("%d -> %s:%d opened\n", c->index, c->host, c->port); fflush(stdout); } else if (logmode == LOG_FILES) { static int fileindex = 0; char fname[80]; sprintf(fname, "sockin.%d", fileindex); c->infp = fopen(fname, "wb"); sprintf(fname, "sockout.%d", fileindex); c->outfp = fopen(fname, "wb"); fileindex++; } if ((err = sk_socket_error(c->s)) != NULL) { return; /* FIXME: what do we do here? */ } pfd_confirm(c->clients); } void sshfwd_close(struct ssh_channel *c) { if (logmode == LOG_DIALOGUE) { printf("%d -> %s:%d closed\n", c->index, c->host, c->port); fflush(stdout); } else if (logmode == LOG_FILES) { if (c->infp) fclose(c->infp); if (c->outfp) fclose(c->outfp); } sk_close(c->s); sfree(c->host); sfree(c); } int sshfwd_write(struct ssh_channel *c, char *buf, int len) { if (logmode == LOG_DIALOGUE) { char *p = buf; int pl = len; while (pl > 0) { int thislen; char *q = memchr(p, '\n', pl); if (q) thislen = q - p + 1; else thislen = pl; printf("%d -> %s:%d send \"", c->index, c->host, c->port); print_c_string(p, thislen); printf("\"\n"); p += thislen; pl -= thislen; } fflush(stdout); } else if (logmode == LOG_FILES) { if (c->outfp) fwrite(buf, 1, len, c->outfp); } return sk_write(c->s, buf, len); } void sshfwd_unthrottle(struct ssh_channel *c, int bufsize) { if (bufsize < BUFLIMIT) sk_set_frozen(c->s, 0); } /* ---------------------------------------------------------------------- * Unix-specific main program. * * FIXME: it'd be nice to identify platform-independent chunks of * this and move them (plus the above code) out into a cross- * platform SOCKS server module, leaving only the real * Unix-specific stuff here such as daemonisation and logging. * * FIXME: also, much of the below code is snarfed directly from * the event loop in uxplink.c, the main differences being the * removal of specific fd handlers for stdin, stdout, stderr and * the SIGWINCH internal pipe. Surely we ought to be able to * factorise that out into a more general command-line event loop * module? */ void fatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } void modalfatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } void cmdline_error(char *p, ...) { va_list ap; fprintf(stderr, "plink: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } int uxsel_input_add(int fd, int rwx) { return 0; } void uxsel_input_remove(int id) { } void timer_change_notify(long next) { } void noise_ultralight(unsigned long data) { } int main(int argc, char **argv) { const char *err; int socksport = 1080; void *sockssock; /* we could pfd_terminate this if we ever needed to */ int *fdlist; int fd; int i, fdcount, fdsize, fdstate; long now; fdlist = NULL; fdcount = fdsize = 0; while (--argc > 0) { char *p = *++argv; if (*p == '-') { if (!strcmp(p, "-d")) { logmode = LOG_DIALOGUE; } else if (!strcmp(p, "-f")) { logmode = LOG_FILES; } else if (!strcmp(p, "-g")) { cfg.lport_acceptall = TRUE; } } else { socksport = atoi(p); } } sk_init(); uxsel_init(); /* FIXME: initialise cfg */ err = pfd_addforward(NULL, -1, NULL, socksport, NULL, &cfg, &sockssock, ADDRTYPE_IPV4); if (err) { fprintf(stderr, "%s\n", err); return 1; } now = GETTICKCOUNT(); while (1) { fd_set rset, wset, xset; int maxfd; int rwx; int ret; FD_ZERO(&rset); FD_ZERO(&wset); FD_ZERO(&xset); maxfd = 0; /* Count the currently active fds. */ i = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) i++; /* Expand the fdlist buffer if necessary. */ if (i > fdsize) { fdsize = i + 16; fdlist = sresize(fdlist, fdsize, int); } /* * Add all currently open fds to the select sets, and store * them in fdlist as well. */ fdcount = 0; for (fd = first_fd(&fdstate, &rwx); fd >= 0; fd = next_fd(&fdstate, &rwx)) { fdlist[fdcount++] = fd; if (rwx & 1) FD_SET_MAX(fd, maxfd, rset); if (rwx & 2) FD_SET_MAX(fd, maxfd, wset); if (rwx & 4) FD_SET_MAX(fd, maxfd, xset); } do { long next, ticks; struct timeval tv, *ptv; if (run_timers(now, &next)) { ticks = next - GETTICKCOUNT(); if (ticks < 0) ticks = 0; /* just in case */ tv.tv_sec = ticks / 1000; tv.tv_usec = ticks % 1000 * 1000; ptv = &tv; } else { ptv = NULL; } ret = select(maxfd, &rset, &wset, &xset, ptv); if (ret == 0) now = next; else { long newnow = GETTICKCOUNT(); /* * Check to see whether the system clock has * changed massively during the select. */ if (newnow - now < 0 || newnow - now > next - now) { /* * If so, look at the elapsed time in the * select and use it to compute a new * tickcount_offset. */ long othernow = now + tv.tv_sec * 1000 + tv.tv_usec / 1000; /* So we'd like GETTICKCOUNT to have returned othernow, * but instead it return newnow. Hence ... */ tickcount_offset += othernow - newnow; now = othernow; } else { now = newnow; } } } while (ret < 0 && errno == EINTR); if (ret < 0) { perror("select"); fflush(NULL); exit(1); } for (i = 0; i < fdcount; i++) { fd = fdlist[i]; /* * We must process exceptional notifications before * ordinary readability ones, or we may go straight * past the urgent marker. */ if (FD_ISSET(fd, &xset)) select_result(fd, 4); if (FD_ISSET(fd, &rset)) select_result(fd, 1); if (FD_ISSET(fd, &wset)) select_result(fd, 2); } } } Revision-number: 8507 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8508 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8509 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8510 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2009-04-25T18:55:22.973088Z K 7 svn:log V 45 Another couple of typos (plus TODO updates). K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1571052eff0f76552c5b7977f2b845be Text-delta-base-sha1: 6d4e092f72899987495214733b1bbbe78c17da7f Text-content-length: 1260 Text-content-md5: e9a877078d10566fa78d763700535bd8 Text-content-sha1: b3533910ea2b05d30b10f22a3eb3cb5ff38dccfb Content-length: 1260 SVN����(-�B�u�?8�g�`�S0�wLogging of at least some of the data from the server's welcome * packet. Might be scope for making some of it optional, but * certainly things like the root window ids would be useful for * making sense of the subsequent proceedings. * + One somewhat silly option would be to actually use _strace_ * as our back end, and read the protocol stream out of the * traced process's read() and write() syscalls. * + It looks as if an obvious approach would be the X RECORD * protocol extension, which appears to allow us to attach to * running X clients and retrieve their protocol streams. * (Note that this extension also identifies X client * connections by their resource base, which supports my * thought that it's a good id to use in logging.)8(data, 11: /* GrabKeyboard�{uu�� errcode; xl->textbuflen = 0; xl->overflow = FALSE; xlog_respond_to(req); xl->reqlogstate = 3; /* for things with parameters */ errcode = FETCH8(data, 1); switch (errcode) { case 1: xlog_printf(xl, "BadRequest"); break; case 2: xlog_printf(xl, "BadValue("); xlog_param(xl, "value", HEX32, FETCH32(data, 4)); xlog_printf(x Revision-number: 8511 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8512 Prop-content-length: 192 Content-length: 192 K 7 svn:log V 92 Parameter reorderings and a few corrections from another trawl through the X protocol spec. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-26T12:26:14.030148Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e9a877078d10566fa78d763700535bd8 Text-delta-base-sha1: b3533910ea2b05d30b10f22a3eb3cb5ff38dccfb Text-content-length: 5458 Text-content-md5: ffd077b19cdea0536fd864f5c95c094f Text-content-sha1: 06b60f0dc654d4b25fbe6ae1dd02ed2d97ca7070 Content-length: 5458 SVN���� S�-��zv�Fk�E2�X3L�Zk�z�Cp�Q�h1�> \�$f�7k�[�� "�(m�! �pi�NO�h+�-n�i��h;�|O�"!�J-�f.��L@2�L@�KI�o^f�e+�D�eh�y^<�!i�i<�+�q%�� �)�{%�[U�k8�Z>�ux�{#�{m�~h�Z>�Wu�uGn�./� �>�v+�R}� �w�N>�g_�_q�F|�{� �w�v|�` �Zr�u8�_8�{B�i6��M8�h�`qo�<� �T�Vr�r^�q �A+�Jq�M8Q�F}�V$�f�a8�S?�l�S?�9 �kw�M�n�M�8u�ke�fK�g:�X1�bp�g:�h1�s!�l8�i �u�py�y�Eu�l8�|4� �n:�vJ�(1�q0�/Y �gt�~|� 3�l9�g3� E� I�gu�`r�7P�9M�Fw�/�t9�|=�3%�\C�<�C~�1t�,N�r�y�;�7�(�^&�kj�=s��%�zq�+!�O�[L��%�zq�+!�O�vL�t�uw�Z� (�s�Pq�*F�zII�U�Z} �&S + In order to be able to do those lookups synchronously * within do_request and friends, this would require some * tinkering with the event loop code, or alternatively * handling our own X connection entirely outside the main * event loop. The alternative is to turn do_request &c * into coroutines of some sort, but I think all the * queuing gets too hideous if we try that xlog_param(xl, "time", HEX32, FETCH32(data, pos)); } void xlog_fontpropsame-screen", BOOLEAN, (FETCH8(data, pos+31) >> 1) & 1); xlog_param(xl, "focus", BOOLEAN, FETCH8(data, pos+31) & 1); }state", HEX16, FETCH16(data, pos+28)); xlog_param(xl, "time", HEX32, FETCH32(data, pos+4));eventaram(xl, "minor-opcode", DECU, FETCH16(data, pos+16)aram(xl, "minor-opcode", DECU, FETCH16(data, pos+8)sibling", WINDOW | SPECVAL, FETCH32(data, pos+12), "None", 0, (char *)NULLaram(xl, "time", HEX32, FETCH32(data, pos+12)); xlog_printf(xl, ")"); break; case 29: xlog_printf(xl, "SelectionClear("selection", ATOM, FETCH32(data, pos+12)); xlog_param(xl, "time", HEX32, FETCH32(data, pos+4)); xlog_printf(xl, ")"); break; case 30: xlog_printf(xl, "SelectionRequest("aram(xl, "requestor", WINDOW, FETCH32(data, pos+12)rintf(xl, ")"); break; case 31: xlog_printf(xl, "SelectionNotify("); xlog_param(xl, "requestowindow", WINDOW, FETCH32(data, pos+4)); xlog_param(xl, "type", ATOM, FETCH32(data, pos+8)); xlog_param(xl, "format", DECU, FETCH8(data, pos+1)); /* FIXME: more data here to be logged */depth", DECU, FETCH8(data, 1)window", WINDOW, FETCH32(data, 4)); xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, 1), "Insert", 0, "Delete", 1, (char *)NULLwindow", WINDOW, FETCH32(data, 4)name", STRING, FETCH16(data, 4), STRING(data, 8, FETCH16(data, 4))); xlog_param(xl, "only-if-exists", BOOLEAN, FETCH8(data, 1, probably instead of lengthxlog_param(xl, "delete", BOOLEAN, FETCH8(data, 1selection", ATOM, FETCH32(data, 8)); xlog_param(xl, "owner", WINDOW, FETCH32(data, 4)); xlog_param(xl, "timerequestor", WINDOW, FETCH32(data, 4)); xlog_param(xl, "timedestinationpropagate", BOOLEAN, FETCH8(data, 1)owner-events", BOOLEAN, FETCH8(data, 1)28: xlog_request_name(xl, "GrabButton"22), "AnyModifier", 0x800owner-events", BOOLEAN, FETCH8(data, 1)break; case 29: xlog_request_name(xl, "UngrabButton"event-mask", EVENTMASK, FETCH16(data, 12)31: xlog_request_name(xl, "GrabKeyboard"owner-events", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "pointerxlog_param(xl, "time3: xlog_request_name(xl, "GrabKey"); xlog_param(xl, "key", DECU | SPECVAL, FETCH8(data, 10), "AnyKey", 0owner-events", BOOLEAN, FETCH8(data, 1)startxlog_param(xl, "stop", HEX32 | SPECVAL, FETCH32(data, 12), "CurrentTime", 0,focus", WINDOW, FETCH32(data, 4)timexlog_param(xl, "max-names", DECU, FETCH16(data, 4xlog_param(xl, "max-names", DECU, FETCH16(data, 4depth", DECU, FETCH8(data, 1xlog_param(xl, "exposures", BOOLEAN, FETCH8(data, 15: xlog_request_name(xl, "PolyLine"depth", DECU, FETCH8(data, 21mid", COLORMAP, FETCH32(data, 4)); xlog_param(xl, "visual", VISUALID, FETCH32(data, 12)); xlog_param(xl, "window", WINDOW, FETCH32(data, 8)xlog_param(xl, "contiguous", BOOLEAN, FETCH8(data, 1xlog_param(xl, "contiguous", BOOLEAN, FETCH8(data, 1xlog_param(xl, "plane-mask", HEX32, FETCH32(data, 8));colormap", COLORMAP, FETCH32(data, 28xlog_param(xl, "override-redirect", BOOLEAN, FETCH8(data, 27)); break; case 14: /* GetGeometry */ xlog_param(xl, "root", WINDOW, FETCH32(data, 8));childrentype", ATOM, FETCH32(data, 8)); xlog_param(xl, "format", DECU, FETCH8(data, 1/* FIXME: log the raw data in place of length */same-screen", BOOLEAN, FETCH8(data, 1)same-screen", BOOLEAN, FETCH8(data, 1));default-char", DECU, FETCH16(data, 44));default-char", DECU, FETCH16(data, 44));xlog_param(xl, "replies-hint", DEC16, FETCH32(data, 56));pixel", HEX32, FETCH32(data, 16)); } }present", BOOLEAN, FETCH8(data, 8)); xlog_param(xl, "major-opcode", DECU, FETCH8(data, 9)); xlog_param(xl, "first-event", DECU, FETCH8(data, 10)); xlog_param(xl, "first-error", DECU, FETCH8(data, 11xlog_param(xl, "led-mask", HEX32, FETCH32(data, 8)); xlog_param(xl, "global-auto-repeat", ENUM | SPECVAL, FETCH8(data, 1), "Off", 0, "On", 1, (char *)NULL�{6�t1�]:�{�rror(struct xlog *xl, struct request *req, int Revision-number: 8513 Prop-content-length: 228 Content-length: 228 K 8 svn:date V 27 2009-04-26T12:30:23.105921Z K 7 svn:log V 127 CopyGC() takes the same _bitmask_ as CreateGC and ChangeGC, but doesn't follow it with a list of values. Stop expecting it to. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ffd077b19cdea0536fd864f5c95c094f Text-delta-base-sha1: 06b60f0dc654d4b25fbe6ae1dd02ed2d97ca7070 Text-content-length: 3703 Text-content-md5: 800f0562d402fea1bd39018e26b4fa8d Text-content-sha1: 8a8b49612770ff86a6d159b44752fda05dcdffac Content-length: 3703 SVN����S,n�h�O�Ku �<�I��.R�En�tB�s=�Y8�RM8�Y /* * xtrace: looks like strace, quacks like xmon. * * This is essentially a logging X11 proxy. It's based on the PuTTY * general network abstraction and X forwarding framework, so it * reuses PuTTY's code for replacing the X authorisation data at the * start of a forwarded connection. The effect of this is that it * can set up its proxy server with its own authorisation data, and * pass that to its client without being fundamentally unable to * handle complex authorisation methods that don't survive proxying * (e.g. XDM-AUTHORIZATION-1). Practical upshot: instead of having * to run the logging proxy in one terminal, set its authorisation * up painstakingly and then launch the program to be monitored with * carefully chosen environment variables, you just run 'xtrace * <program> <args>' in exactly the same way you would with strace, * and it Just Works. * * Additionally, the output is more like strace's format than * xmon's, which I for one find makes it much easier to read.v(struct xlog *xl, int ival, va_list ap) { const char *sep = ""; const char *svname; int svistatic void writemask(struct xlog *xl, int ival, ...) { va_list ap; va_start(ap, ival); writemaskv(xl, ival, ap); va_end(ap);GENMASK,GENMASK: writemaskv(xl, ival, apGENMASK, FETCH16(data, pos+26), "x", 0x0001, "y", 0x0002, "width", 0x0004, "height", 0x0008, "border-width", 0x0010, "sibling", 0x0020, "stack-mode", 0x0040, (char *)NULLdefault /* case 56 */7: xlog_request_name(xl, "CopyGC"); xlog_param(xl, "src-gc", GCONTEXT, FETCH32(data, 4)); xlog_param(xl, "dst-gc", GCONTEXT, FETCH32(data, 8)); xlog_param(xl, "value-mask", GENMASK, FETCH32(data, 12), "function", 0x00000001, "plane-mask", 0x00000002, "foreground", 0x00000004, "background", 0x00000008, "line-width", 0x00000010, "line-style", 0x00000020, "cap-style", 0x00000040, "join-style", 0x00000080, "fill-style", 0x00000100, "fill-rule", 0x00000200, "tile", 0x00000400, "stipple", 0x00000800, "tile-stipple-x-origin", 0x00001000, "tile-stipple-y-origin", 0x00002000, "font", 0x00004000, "subwindow-mode", 0x00008000, "graphics-exposures", 0x00010000, "clip-x-origin", 0x00020000, "clip-y-origin", 0x00040000, "clip-mask", 0x00080000, "dash-offset", 0x00100000, "dashes", 0x00200000, "arc-mode", 0x00400000, (char *)NULL);� QQ�@l�t 1, (char *)NULL); break; case 117: /* GetPointerMapping */ { int pos = 32; int i = 0; int n = FETCH8(data, 1); char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "map[%d]", i); xlog_param(xl, buf, DECU, FETCH8(data, pos)); pos++; } } break; case 118: /* SetModifierMapping */ xlog_param(xl, "status", ENUM | SPECVAL, FETCH8(data, 1), "Success", 0, "Busy", 1, "Failed", 2, (char *)NULL); break; case 119: /* GetModifierMapping */ { int keycodes_per_modifier = FETCH8(data, 1); int pos = 32; int mod, i; char buf[64]; for (mod = 0; mod < 8; mod++) { sprintf(buf, "modifier[%d]", mod); xlog_param(xl, buf, SETBEGIN); for (i = 0; i < keycodes_per_modifier; i++) { sprintf(buf, "keycodes[%d]", i); xlog_param(xl, buf, DECU, FETCH8(data, pos)); pos++; } xlog_set_end(xl); } } break; default: xlog_printf(xl, "<unable to decode reply data>"); break; } if (xl->textbuflen) { xlog_reply_end(xl); xlog_response_done(xl->textbuf); } if (req->replies == 1) Revision-number: 8514 Prop-content-length: 216 Content-length: 216 K 7 svn:log V 115 Beginnings of command-line parsing, and in particular '-o' to direct the trace output somewhere other than stderr. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-26T12:42:06.035707Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 800f0562d402fea1bd39018e26b4fa8d Text-delta-base-sha1: 8a8b49612770ff86a6d159b44752fda05dcdffac Text-content-length: 1982 Text-content-md5: 508f98d776bfa90175187699903692ff Text-content-sha1: c4921582d459cb708a17005c4ff4cab0e6aa0675 Content-length: 1982 SVN����@^�.��a�#^[�+~�$�@Su�1tF�rW}�N5#include <string/* * Global variable for the FILE * to which we send our log data. */ static FILE *xlogfpxlogfp, "protocol error: "); va_start(ap, fmt); vfprintf(xlogfp, fmt, ap); va_end(ap); fprintf(xlogfp, "\n"); fflush(xlogfpxlogfp, " = <unfinished>\n"); fflush(xlogfpxlogfp, "%s", req->text); currreq = req; } else { fprintf(xlogfp, "%s\n", req->text); } fflush(xlogfp);xlogfp, " ... %s = ", req->text); } else { fprintf(xlogfp, " = "); } } void xlog_response_done(const char *text) { fprintf(xlogfp, "%s\n", text); currreq = NULL; fflush(xlogfp)xlogfp, "--- reply received for unknown request sequence" " number %lu\n", (unsigned long)FETCH16(data, 4)); fflush(xlogfp�)9M�f@�/F�H~�W-�Tx�Mg�\@�ut�>a case 116: /* SetPointxlogfp, "--- %s\n", xl->textbuf); fflush(xlogfp); } void xlog_c2slogfile = NULL int doing_opts = TRUE;doing_opts && *p == '-') { if (p[1] == '-') { if (!p[2]) /* "--" terminates option parsing */ doing_opts = FALSE; else { /* no GNU-style long options currently supported */ fprintf(stderr, "xtrace: unknown option '%s'\n", p); return 1; } } p++; while (*p) { int c = *p++; char *val; switch (c) { case 'o': /* options requiring an argument */ if (*p) val = p; else if (--argc > 0) val = *++argv; else { fprintf(stderr, "xtrace: option '-%c' expects an" " argument\n", c); return 1; } switch (c) { case 'o': logfile = val; break; } break; /* now options not requiring an argument */ } }if (logfile) { xlogfp = fopen(logfile, "w"); if (!xlogfp) { fprintf(stderr, "xtrace: open(\"%s\"): %s\n", logfile, strerror(errno)); return 1; } } else xlogfp = stderr;if (logfile) fclose(xlogfp Revision-number: 8515 Prop-content-length: 214 Content-length: 214 K 8 svn:date V 27 2009-04-26T12:58:37.691905Z K 7 svn:log V 113 Fill in some of the missing bits in the logging code: 2-byte text strings, and arbitrary-format property values. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 508f98d776bfa90175187699903692ff Text-delta-base-sha1: c4921582d459cb708a17005c4ff4cab0e6aa0675 Text-content-length: 3752 Text-content-md5: 41429a8018878576fea2dc8a91783b12 Text-content-sha1: a76c81ad2fd5738f74f1cd6eae361a6e1a0cd7d8 Content-length: 3752 SVN����w<���\5�r�#o�J�J{)�J{ �wG@�tfm�>k�%�K\R�7 ^�5l�*8�'gure out how to log the image data in PutImage requests and * GetImage replies (the protocol spec isn't entirely clear how * it should be interpreted). - --help, --version, --licence. (Sort out the licence, actually. * Probably not _everybody_ in the PuTTY LICENCE document holds * copyright in the pieces I've reused here.)HEXSTRING2, HEXSTRING4, *sepHEXSTRING2sep = ""; while (ival-- > 0) { unsigned val = READ16(sval); xlog_printf(xl, "%s%04X", sep, val); sval += 2; sep = ":"; } break; case HEXSTRING4sep = ""; while (ival-- > 0) { unsigned val = READ32(sval); xlog_printf(xl, "%s%08X", sep, val); sval += 4; sep = ":"; }xlog_param(xl, "data", HEXSTRING, 20, STRING(data, pos+12, 20));switch (FETCH8(data, 16)) { case 8: xlog_param(xl, "data", STRING, FETCH32(data, 20), STRING(data, 24, FETCH32(data, 20))); break; case 16: xlog_param(xl, "data", HEXSTRING2, FETCH32(data, 20), STRING(data, 24, 2*FETCH32(data, 20))); break; case 32: xlog_param(xl, "data", HEXSTRING4, FETCH32(data, 20), STRING(data, 24, 4*FETCH32(data, 20))); break; default: xlog_printf(xl, "<unknown format of data>"); break; }{ int stringlen = len - 8; stringlen /= 2; if (FETCH8(data, 1) != 0) stringlen--; if (stringlen < 0) stringlen = 0; xlog_param(xl, "string", HEXSTRING2, stringlen, STRING(data, 8, 2*stringlen)); }he actual image data is not currently loggedxlog_param(xl, "string", HEXSTRING2, tilen, STRING(data, pos+2, 2*tilen)xlog_param(xl, "string", HEXSTRING2, FETCH8(data, 1), STRING(data, 16, 2*FETCH8(data, 1))switch (FETCH8(data, 1)) { case 8: xlog_param(xl, "data", STRING, FETCH32(data, 16), STRING(data, 32, FETCH32(data, 16))); break; case 16: xlog_param(xl, "data", HEXSTRING2, FETCH32(data, 16), STRING(data, 32, 2*FETCH32(data, 16))); break; case 32: xlog_param(xl, "data", HEXSTRING4, FETCH32(data, 16), STRING(data, 32, 4*FETCH32(data, 16))); break; default: xlog_printf(xl, "<unknown format of data>"); break; }the actual image data is not currently logg�)|SS�)� for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "auto-repeats[%d]", i); xlog_param(xl, buf, HEX8, FETCH8(data, pos)); pos++; } } break; case 106: /* GetPointerControl */ xlog_param(xl, "acceleration", RATIONAL16, FETCH16(data, 8), FETCH16(data, 10)); xlog_param(xl, "threshold", DEC16, FETCH16(data, 12)); break; case 108: /* GetScreenSaver */ xlog_param(xl, "timeout", DEC16, FETCH16(data, 8)); xlog_param(xl, "interval", DEC16, FETCH16(data, 10)); xlog_param(xl, "prefer-blanking", ENUM | SPECVAL, FETCH8(data, 12), "No", 0, "Yes", 1, (char *)NULL); xlog_param(xl, "allow-exposures", ENUM | SPECVAL, FETCH8(data, 13), "No", 0, "Yes", 1, (char *)NULL); break; case 110: /* ListHosts */ xlog_param(xl, "mode", ENUM | SPECVAL, FETCH8(data, 1), "Disabled", 0, "Enabled", 1, (char *)NULL); { int i, n; int pos = 32; n = FETCH16(data, 8); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "hosts[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "family", ENUM | SPECVAL, FETCH8(data, pos), "Internet", 0, "DECnet", 1, "Chaos", 2, (char *)NULL); xlog_param(xl, "address", HEXSTRING, FETCH16(data, pos+2), STRING(data, pos+4, FETCH16(data, pos+2))); xlog_set_end(xl); pos += 4 + ((FETCH16(data, pos+2) + 3) &~ 3); } } break; Revision-number: 8516 Prop-content-length: 218 Content-length: 218 K 7 svn:log V 117 Several people have spotted an uninitialised structure member leading to a potential crash on "reget" in Unix PSFTP. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-04-26T22:19:30.447430Z PROPS-END Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a3a8059decb67396c315043280c14a01 Text-delta-base-sha1: 2946c2255c3a740a74d6d5c927fb3c50f0201448 Text-content-length: 49 Text-content-md5: ef99af8ad1cfd1924e3e700a7fc76d09 Text-content-sha1: 817dcc9b8a6f181741c33d8154e0ecc85d145a14 Content-length: 49 SVN��/M �5��|3 ret->name = dupstr(name) Revision-number: 8517 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2009-04-26T22:32:41.814480Z K 7 svn:log V 151 Reported by Tim Kosse: on Unix, read_random_seed() wasn't correctly checking the return from open() and behaved wrongly in the absence of a seed file. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1da04f01717a3ab3c6a7113558985f9f Text-delta-base-sha1: 55c517720b3c540d0030a4bde637d64859b00198 Text-content-length: 26 Text-content-md5: 3e13e36058a646b755015b2b4bbdd653 Text-content-sha1: b59be63058d7d3fe20ac62181a341fa708c1e572 Content-length: 26 SVN��<A �a��[a >= 0 Revision-number: 8518 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2009-04-26T23:03:02.971007Z K 7 svn:log V 37 Discard hashed hostnames from input. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/contrib/kh2reg.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30034df811469b72571e3f9e28caa7bc Text-delta-base-sha1: 97a27f83d9e0130482e057919e300606c4ed2a65 Text-content-length: 115 Text-content-md5: 95d7988d9c9e9668132708c969e59fba Text-content-sha1: e9c3d20cab8bd7076fa96e5e4def0f6522f074cc Content-length: 115 SVN��FS ]�=�]�9 if re.match (r"\|", host): sys.stderr.write("Skipping hashed hostname '%s'\n" Revision-number: 8519 Prop-content-length: 239 Content-length: 239 K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-04-26T23:44:28.247453Z K 7 svn:log V 138 Ansgar Wiechers points out that known_hosts (at least OpenSSH's) has grown a means of specifying port numbers, so we should support that. PROPS-END Node-path: putty/contrib/kh2reg.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 95d7988d9c9e9668132708c969e59fba Text-delta-base-sha1: e9c3d20cab8bd7076fa96e5e4def0f6522f074cc Text-content-length: 300 Text-content-md5: f5e257f79c69042b259f3f69e1012f92 Text-content-sha1: e8f650fe3c72951f5315d3f9b9ef66f13a0e2a9e Content-length: 300 SVN��ST �^��bqm = re.match (r"\[([^]]*)\]:(\d*)$", host) if m: (host, port) = m.group(1,2) port = int(port) else: port = 22 # Slightly bizarre output key format: 'type@port:hostname' Revision-number: 8520 Prop-content-length: 466 Content-length: 466 K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-27T07:45:32.933407Z K 7 svn:log V 365 Use the X RECORD extension as an alternative input source to proxying the X server. This enables xtrace to support the -p mode, very like that of strace. With only a little more hacking I expect to be able to do the xwininfo-like 'select a window belonging to the client you want to trace' thing too. (We already try, but always end up tracing the window manager.) PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 41429a8018878576fea2dc8a91783b12 Text-delta-base-sha1: a76c81ad2fd5738f74f1cd6eae361a6e1a0cd7d8 Text-content-length: 20661 Text-content-md5: 8edb999da2ab3188c63f6190b8c6b667 Text-content-sha1: ef0653102f2dd285d0bf1578b06451cd00f503da Content-length: 20661 SVN����I��x�| �T�(kO�sP�0D�t� �|'C�=Z2�2Finish up the X RECORD stuff, by polishing its error handling * and finishing the interactive window selection code.#include <ctypeint type; struct request *rhead, *rtail; }; struct xlog *xlog_new(int type0; xl->type = typexl, xl, xl, xl, prefix, size) readfrom(xl, prefix, size, 0) #define ignore(xl, | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); if (FETCH32(data, 8) != 0) { xlog_param(xl, "format", DECU, FETCH8(data, 1)); xlog_param(xl, "bytes-after", DECU, FETCH32(data, 12)); switch (FETCH8(data, 1)) { case 8: xlog_param(xl, "data", STRING, FETCH32(data, 16), STRING(data, 32, FETCH32(data, 16))); break; case 16: xlog_param(xl, "data", HEXSTRING2, FETCH32(data, 16), STRING(data, 32, 2*FETCH32(data, 16))); break; case 32: xlog_param(xl, "data", HEXSTRING4, FETCH32(data, 16), STRING(data, 32, 4*FETCH32(data, 16))); break; default: xlog_printf(xl, "<unknown format of data>"); break; } for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "auto-repeats[%d]", i); xlog_param(xl, buf, HEX8, FETCH8(data, pos)); pos++; } } break; case 106: /* GetPointerControl */ xlog_param(xl, "acceleration", RATIONAL16, FETCH16(data, 8), FETCH16(data, 10)); xlog_param(xl, "threshold", DEC16, FETCH16(data, 12)); break; case 108: /* GetScreenSaver */ xlog_param(xl, "timeout", DEC16, FETCH16(data�|Z $�o2I�[v�9A�qQ� B�L�W�I|L�rN�P�TX�-.j�br�T$�P�)[e�s�L3�K<<�V&if (xl->type == 0) { /* * Endianness byte and subsequent padding byte. */ read(xl, c2s, 1); if (xl->c2sbuf[0] == 'l' || xl->c2sbuf[0] == 'B') { xl->endianness = xl->c2sbuf[0]; } else { err((xl, "initial endianness byte (0x%02X) unrecognised", *data)); } ignore(xl, c2s, 1); /* * Protocol major and minor version, and authorisation * detail string lengths. * * We only log the protocol version if it doesn't match our * expectations; we definitely don't want to log the auth * data, both for security reasons and because we're * meddling with them ourselves in any case. */ read(xl, c2s, 8); if ((i = READ16(xl->c2sbuf)) != 11) err((xl, "major protocol version (0x%04X) unrecognised", i)); if ((i = READ16(xl->c2sbuf + 2)) != 0) warn((xl, "minor protocol version (0x%04X) unrecognised", i)); i = READ16(xl->c2sbuf + 4); i = (i + 3) &~ 3; i += READ16(xl->c2sbuf + 6); i = (i + 3) &~ 3; ignore(xl, c2s, 2 + i); }xl, c2s, 4); i = READ16(xl->c2sbuf + 2); readfrom(xl, if (xl->type == 0) { /* * Initial phase of data coming from the server is expected * to be composed of packets with an 8-byte header whose * final two bytes give the number of 4-byte words beyond * that header. */ while (1) { read(xl, s2c, 8); if (xl->endianness == -1) err((xl, "server reply received before client sent endianness")); i = READ16(xl->s2cbuf + 6); readfrom(xl, s2c, 8+i*4, 8); /* * The byte at the front of one of these packets is 0 * for a failed authorisation, 1 for a successful * authorisation, and 2 for an incomplete authorisation * indicating more data should be sent. * * Since we proxy the X authorisation ourselves and have * a fixed set of protocols we understand of which we * know none involve type-2 packets, we never expect to * see one. 0 is also grounds for ceasing to log the * connection; that leaves 1, which terminates this loop * and we move on to the main phase of the protocol. * * (We might some day need to extend this code so that a * type-2 packet is processed and we look for another * packet of this type, which is why I've written this * as a while loop with an unconditional break at the * end instead of simple straight-through code. We would * only need to stick a 'continue' at the end of * handling a type-2 packet to make this change.) */ if (xl->s2cbuf[0] == 0) err((xl, "server refused authorisation, reason \"%.*s\"", xl->s2cbuf + 8, min(xl->s2clen-8, xl->s2cbuf[1]))); else if (xl->s2cbuf[0] == 2) err((xl, "server sent incomplete-authorisation packet, which" " is unsupported by xtrace")); else if (xl->s2cbuf[0] != 1) err((xl, "server sent unrecognised authorisation-time opcode %d", xl->s2cbuf[0])); /* * Now we're sitting on a successful authorisation * packet. FIXME: we might usefully log some of its * contents, though probably optionally. Even if we * don't, we could at least save some resource ids - * windows, colormaps, visuals and so on - to lend * context to logging of later requests which cite them. */ break; }xl, xl, int type int record_state; unsigned rbase, rmask, rootwin, select, clientid, xrecordopcode; unsigned char *xrecordbuf; int xrecordlen, xrecordlimit, xrecordsize; int xrecord_state; }; struct X11Display *x11disp; void xrecord_gotdata(struct ssh_channel *c, const void *vdata, int len); void sshfwd_close(struct ssh_channel *c) { if (c->type == 0) sk_close(c->ps); xlog_free(c->xl); sfree(c->xrecordbuf); sfree(c); } int sshfwd_write(struct ssh_channel *c, char *buf, int len) { if (c->type == 0) { xlog_s2c(c->xl, buf, len); return sk_write(c->ps, buf, len); } else { xrecord_gotdata(c, buf, len); return 0; }c->type == 0) { if (bufsize < BUFLIMIT) sk_set_frozen(c->ps, 0); } c->type = 0; /* forwarded X connection */ c->xrecordbuf = NULL, TRUE0); /* type 0 = full X connection */ * Make our own connection to the X display with intent to use the X * RECORD extension to eavesdrop on an existing client. */ void start_xrecord(const Config *cfg, int select, unsigned clientid) { struct ssh_channel *c = snew(struct ssh_channel); const char *err; c->fn = NULL; /* no local socket for this 'channel' */ c->type = 1; /* X RECORD channel */ c->xrecordbuf = NULL; c->xrecordlen = c->xrecordlimit = c->xrecordsize = 0; c->xl = xlog_new(1); /* type 1 = recording from after connection setup */ /* * Start an X connection for which proxy-side authorisation will * not be checked. We then supply no auth to that, and x11fwd.c * will put in the right auth to talk to the original display. */ if ((err = x11_init(&c->xs, x11disp, c, NULL, -1, cfg, FALSE)) != NULL) { fprintf(stderr, "Error opening connection to X display: %s\n", err); exit(1); } /* * Set up the coroutine state for this connection, and call its * gotdata function to start it off (since we must send data * first). */ c->xrecord_state = 0; c->select = select; c->clientid = clientid; xrecord_gotdata(c, NULL, 0); } void xrecord_gotdata(struct ssh_channel *cchar buf[512]; crBegin(c->xrecord_state); /* * Start by sending the X init packet, in which we don't need to * bother placing any authorisation data. */ buf[0] = 'B'; buf[1] = 0; /* byte order and padding */ PUT_16BIT_MSB_FIRST(buf+2, 11); /* protocol-major-version */ PUT_16BIT_MSB_FIRST(buf+4, 0); /* protocol-minor-version */ PUT_16BIT_MSB_FIRST(buf+6, 0); /* auth-proto-name len (none) */ PUT_16BIT_MSB_FIRST(buf+8, 0); /* auth-proto-data-len (none) */ PUT_16BIT_MSB_FIRST(buf+10, 0); /* padding */ x11_send(c->xs, buf, 12); /* * We expect to see a successful authorisation and a welcome * message. Extract our resource base and mask, plus the root * window id. * * [FIXME: what are we supposed to do in a multi-screen * situation?] */ read(c, xrecord, 8); readfrom(c, xrecord, 8+4*GET_16BIT_MSB_FIRST(c->xrecordbuf + 6), 8); if (c->xrecordbuf[0] != 1) { fprintf(stderr, "FIXME: proper error [unsuccessful X auth]\n"); exit(1); } c->rbase = GET_32BIT_MSB_FIRST(c->xrecordbuf + 12); c->rmask = GET_32BIT_MSB_FIRST(c->xrecordbuf + 16); { int rootoffset = GET_16BIT_MSB_FIRST(c->xrecordbuf + 24); rootoffset = 40 + ((rootoffset + 3) & ~3); rootoffset += 8 * c->xrecordbuf[29]; c->rootwin = GET_32BIT_MSB_FIRST(c->xrecordbuf + rootoffset); } /* * Simple means of allocating a small number of resource ids in * such a way that they're easy to compute in a static manner * and will not clash with one another no matter what (valid) * value is taken by c->rmask. */ #define FONTID (c->rbase | (c->rmask & 0x11111111)) #define CURID (c->rbase | (c->rmask & 0x22222222)) #define RCID (c->rbase | (c->rmask & 0x33333333)) /* * First check that the RECORD extension is present and correct. * If it isn't, we should find out before we faff about getting * the user to pick a window. */ buf[0] = 98; buf[1] = 0; /* QueryExtension opcode and padding */ PUT_16BIT_MSB_FIRST(buf+2, 4); /* request length */ PUT_16BIT_MSB_FIRST(buf+4, 6); /* name length */ memset(buf+6, 0, 10); memcpy(buf+8, "RECORD", 6); x11_send(c->xs, buf, 16); /* * Read the reply, which hopefully will say Success and tell us * the major opcode for the extension. */ read(c, xrecord, 32); if (c->xrecordbuf[0] == 1) readfrom(c, xrecord, 32+4*GET_32BIT_MSB_FIRST(c->xrecordbuf + 4), 32); if (c->xrecordbuf[0] != 1 || c->xrecordbuf[8] != 1) { fprintf(stderr, "FIXME: proper error [expected successful queryext]\n"); exit(1); } c->xrecordopcode = c->xrecordbuf[9]; /* * Now initialise the RECORD extension. */ buf[0] = c->xrecordopcode; buf[1] = 0;/* RecordQueryVersion */ PUT_16BIT_MSB_FIRST(buf+2, 2); /* request length */ PUT_16BIT_MSB_FIRST(buf+4, 1); /* major version */ PUT_16BIT_MSB_FIRST(buf+6, 13); /* minor version */ x11_send(c->xs, buf, 8); /* * Read the reply, which hopefully will say Success. */ read(c, xrecord, 32); if (c->xrecordbuf[0] == 1) readfrom(c, xrecord, 32+4*GET_32BIT_MSB_FIRST(c->xrecordbuf + 4), 32); if (c->xrecordbuf[0] != 1) { fprintf(stderr, "FIXME: proper error [expected successful rqv]\n"); exit(1); } if (c->select) { fprintf(stderr, "xtrace: click mouse in a window belonging to the " "client you want to trace\n"); /* * Open the 'cursor' font. */ buf[0] = 45; buf[1] = 0; /* OpenFont opcode and padding */ PUT_16BIT_MSB_FIRST(buf+2, 5); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, FONTID); /* font id */ PUT_16BIT_MSB_FIRST(buf+8, 6); /* name length */ memset(buf+10, 0, 10); memcpy(buf+12, "cursor", 6); x11_send(c->xs, buf, 20); /* * Create a cursor based on a crosshair glyph from that * font. */ buf[0] = 94; buf[1] = 0; /* CreateGlyphCursor opcode + padding */ PUT_16BIT_MSB_FIRST(buf+2, 8); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, CURID); /* cursor id */ PUT_32BIT_MSB_FIRST(buf+8, FONTID); /* font id for cursor itself */ PUT_32BIT_MSB_FIRST(buf+12, FONTID); /* font id for cursor mask */ PUT_16BIT_MSB_FIRST(buf+16, 34); /* character code for cursor */ PUT_16BIT_MSB_FIRST(buf+18, 35); /* character code for cursor mask */ PUT_16BIT_MSB_FIRST(buf+20, 0xFFFF); /* foreground red */ PUT_16BIT_MSB_FIRST(buf+22, 0xFFFF); /* foreground green */ PUT_16BIT_MSB_FIRST(buf+24, 0xFFFF); /* foreground blue */ PUT_16BIT_MSB_FIRST(buf+26, 0x0000); /* background red */ PUT_16BIT_MSB_FIRST(buf+28, 0x0000); /* background green */ PUT_16BIT_MSB_FIRST(buf+30, 0x0000); /* background blue */ x11_send(c->xs, buf, 32); /* * Grab the mouse pointer, selecting the cursor we just * created. */ buf[0] = 26; /* GrabPointer opcode */ buf[1] = 0; /* owner-events */ PUT_16BIT_MSB_FIRST(buf+2, 6); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, c->rootwin); /* grab window id */ PUT_16BIT_MSB_FIRST(buf+8, 4); /* event mask (ButtonPress only) */ buf[10] = 1; /* pointer-mode = Asynchronous */ buf[11] = 1; /* keyboard-mode = Asynchronous */ PUT_32BIT_MSB_FIRST(buf+12, c->rootwin); /* confine window id */ PUT_32BIT_MSB_FIRST(buf+16, CURID); /* cursor id */ PUT_32BIT_MSB_FIRST(buf+20, 0); /* timestamp = CurrentTime */ x11_send(c->xs, buf, 24); /* * Now we expect to see a reply to the GrabPointer * operation. If that says Success, we can then sit and wait * for a ButtonPress event which will give us a resource id * to trace. */ read(c, xrecord, 32); if (c->xrecordbuf[0] == 1) readfrom(c, xrecord, 32+4*GET_32BIT_MSB_FIRST(c->xrecordbuf + 4), 32); if (c->xrecordbuf[0] != 1 || c->xrecordbuf[1] != 0) { fprintf(stderr, "FIXME: proper error [expected successful grabpointer]\n"); exit(1); } /* * Wait for our ButtonPress. */ read(c, xrecord, 32); if (c->xrecordbuf[0] == 1) readfrom(c, xrecord, 32+4*GET_32BIT_MSB_FIRST(c->xrecordbuf + 4), 32); if ((c->xrecordbuf[0] & 0x7F) != 4) { fprintf(stderr, "FIXME: proper error [expected buttonpress]\n"); exit(1); } c->clientid = GET_32BIT_MSB_FIRST(c->xrecordbuf + 16); /* * We've got our base window id. Now we can ungrab the * pointer, free our cursor, and close our font. */ buf[0] = 27; buf[1] = 0; /* UngrabPointer opcode and padding */ PUT_16BIT_MSB_FIRST(buf+2, 2); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, 0); /* timestamp = CurrentTime */ x11_send(c->xs, buf, 8); buf[0] = 95; /* FreeCursor opcode */ buf[1] = 0; /* unused */ PUT_16BIT_MSB_FIRST(buf+2, 2); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, CURID); /* cursor id to free */ x11_send(c->xs, buf, 8); buf[0] = 46; /* CloseFont opcode */ buf[1] = 0; /* unused */ PUT_16BIT_MSB_FIRST(buf+2, 2); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, FONTID); /* font id to free */ x11_send(c->xs, buf, 8); /* * FIXME: now we must fiddle about some more, because the * window id we've retrieved was almost certainly owned by * the WM rather than by some actual client. */ } /* * Initialise and start a recording context for the given client * id. */ buf[0] = c->xrecordopcode; buf[1] = 1;/* RecordCreateContext */ PUT_16BIT_MSB_FIRST(buf+2, 12); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, RCID); /* context id */ buf[8] = 0; /* element header (none) */ buf[9] = buf[10] = buf[11] = 0; /* padding */ PUT_32BIT_MSB_FIRST(buf+12, 1); /* number of client ids */ PUT_32BIT_MSB_FIRST(buf+16, 1); /* number of record ranges */ PUT_32BIT_MSB_FIRST(buf+20, c->clientid); /* client id itself */ buf[24] = 0; buf[25] = 127; /* want all core requests */ buf[26] = 0; buf[27] = 127; /* and all core replies */ buf[28] = 128; buf[29] = 255; /* want all extension major opcodes */ PUT_16BIT_MSB_FIRST(buf+30, 0); PUT_16BIT_MSB_FIRST(buf+32, 65535);/* and all extension minor opcodes */ buf[34] = 128; buf[35] = 255; /* and the same in replies */ PUT_16BIT_MSB_FIRST(buf+36, 0); PUT_16BIT_MSB_FIRST(buf+38, 65535); buf[40] = 2; buf[41] = 255; /* want all delivered events */ buf[42] = 0; buf[43] = 0; /* but no device events */ buf[44] = 0; buf[45] = 255; /* want all errors */ buf[46] = 0; /* don't want client-started */ buf[47] = 1; /* but do want client-died */ x11_send(c->xs, buf, 48); buf[0] = c->xrecordopcode; buf[1] = 5;/* RecordEnableContext */ PUT_16BIT_MSB_FIRST(buf+2, 2); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, RCID); /* context id */ x11_send(c->xs, buf, 8); /* * Now we expect to receive an indefinite stream of replies to * that last request. */ while (1) { read(c, xrecord, 32); if (c->xrecordbuf[0] == 1) readfrom(c, xrecord, 32+4*GET_32BIT_MSB_FIRST(c->xrecordbuf + 4), 32); if ((c->xrecordbuf[0] & 0x7F) == 4) { /* * Another ButtonPress event, probably sent to us after * the one we received above but before we managed to * ungrab the pointer. Ignore it. */ continue; } if (c->xrecordbuf[0] != 1) { fprintf(stderr, "FIXME: proper error [expected recorded data]\n"); exit(1); } #if 0 /* Hex dump of the received data, kept in case it comes in handy again. */ { int n,k,i; char dumpbuf[128], tmpbuf[16]; fprintf(stderr, "RECORD output type %d:\n", c->xrecordbuf[1]); for (n = 32; n < c->xrecordlen; n += 16) { k = c->xrecordlen - n; if (k > 16) k = 16; memset(dumpbuf, ' ', 8+2+16*3+1+k); dumpbuf[8+2+16*3+1+k] = '\n'; dumpbuf[8+2+16*3+1+k+1] = '\0'; memcpy(dumpbuf, tmpbuf, sprintf(tmpbuf, "%08X", n-32)); for (i=0;i<k;i++) { memcpy(dumpbuf+8+2+3*i, tmpbuf, sprintf(tmpbuf, "%02X", c->xrecordbuf[n+i])); dumpbuf[8+2+16*3+1+i] = (isprint(c->xrecordbuf[n+i]) ? c->xrecordbuf[n+i] : '.'); } fputs(dumpbuf, stderr); } } #endif switch (c->xrecordbuf[1]) { case 4: /* * StartOfData record, sent immediately after we enabled * the recording context. Ignore it. */ break; case 1: /* * Data from the client, i.e. requests. Expect it to * come with a header telling us its sequence number. */ c->xl->endianness = c->xrecordbuf[9]?'l':'B'; c->xl->nextseq = GET_32BIT_MSB_FIRST(c->xrecordbuf+20); xlog_c2s(c->xl, c->xrecordbuf + 32, c->xrecordlen - 32); break; case 0: /* * Data from the server, i.e. replies, errors and * events. Expect it to come with a header telling us * its sequence number. */ c->xl->endianness = c->xrecordbuf[9]?'l':'B'; xlog_s2c(c->xl, c->xrecordbuf + 32, c->xrecordlen - 32); break; case 3: /* * The client has exited. Successful termination! */ exit(0); default: fprintf(stderr, "FIXME: proper error [unexpected data record]\n"); break; } } crFinishxrecord, selectclient; unsigned clientid; int doing_opts = TRUE; fdlist = NULL; fdcount = fdsize = 0; xrecord = FALSE; selectclient = FALSEcase 'p case 'p': xrecord = TRUE; if (!strcmp(val, "-")) { selectclient = TRUE; } else { selectclient = FALSE; if (!sscanf(val, "%x", &clientid) && !sscanf(val, "0x%x", &clientid) && !sscanf(val, "0X%x", &clientid)) { fprintf(stderr, "xtrace: option '-p' expects" " either a hex resource id or '-'\n"); } }xrecord && x11disp = x11_setup_display(cfg.x11_display, X11_MIT, &cfg); if (xrecord) { start_xrecord(&cfg, selectclient, clientid); } else { displaynum = start_xproxy(&cfg, 10); authfilename = dupstr("/tmp/xtrace-authority-XXXXXX"); { int authfd, oldumask; FILE *authfp; SockAddr addr; char *canonicalname; char addrbuf[4]; char dispnumstr[64]; oldumask = umask(077); authfd = mkstemp(authfilename); umask(oldumask); authfp = fdopen(authfd, "wb"); addr = name_lookup(hostname, 6000 + displaynum, &canonicalname, &cfg, ADDRTYPE_IPV4); sk_addrcopy(addr, addrbuf); /* Big-endian 2-byte number: zero, meaning IPv4 */ fputc(0, authfp); fputc(0, authfp); /* Length-4 string which is the IP address in binary */ fputc(0, authfp); fputc(4, authfp); fwrite(addrbuf, 1, 4, authfp); /* String form of the display number */ sprintf(dispnumstr, "%d", displaynum); fputc(strlen(dispnumstr) >> 8, authfp); fputc(strlen(dispnumstr) & 0xFF, authfp); fputs(dispnumstr, authfp); /* String giving the auth type */ fputc(strlen(x11disp->remoteauthprotoname) >> 8, authfp); fputc(strlen(x11disp->remoteauthprotoname) & 0xFF, authfp); fputs(x11disp->remoteauthprotoname, authfp); /* String giving the auth data itself */ fputc(x11disp->remoteauthdatalen >> 8, authfp); fputc(x11disp->remoteauthdatalen & 0xFF, authfp); fwrite(x11disp->remoteauthdata, 1, x11disp->remoteauthdatalen, authfp); fclose(authfp); } pid = fork(); if (pid < 0) { perror("fork"); unlink(authfilename); exit(1); } else if (pid == 0) { putenv(dupprintf("DISPLAY=%s:%d", hostname, displaynum)); putenv(dupprintf("XAUTHORITY=%s", authfilename)); execvp(cmd[0], cmd); perror("exec"); exit(127); } else childpid = pid; } Revision-number: 8521 Prop-content-length: 294 Content-length: 294 K 8 svn:date V 27 2009-04-27T17:49:59.259386Z K 7 svn:log V 193 Two fixes in sequence number handling (one cosmetic, one fundamental and which I only failed to notice because I kept testing against clients whose sequence numbers hadn't yet gone over 2^16). K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8edb999da2ab3188c63f6190b8c6b667 Text-delta-base-sha1: ef0653102f2dd285d0bf1578b06451cd00f503da Text-content-length: 76 Text-content-md5: cc1edd53c939216419a3d993b7b0d3a6 Text-content-sha1: 6fc3c11c3c71480860474b8307f59333270045e2 Content-length: 76 SVN���� �i��j2�Ze �|��M (xl->rhead->seqnum & 0xFFFF) Revision-number: 8522 Prop-content-length: 454 Content-length: 454 K 8 svn:date V 27 2009-04-27T17:51:22.938802Z K 7 svn:log V 353 Forgot to commit the rest of r8520: a change to the prototype of x11_init() to allow the caller to specify that some X connections are already known to be authorised to use the 'proxy' and don't need to have their fake auth data verified. Used by xtrace when it wants to make connections on its own behalf, as opposed to forwarding them from elsewhere. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 987f05797bd76d51c5f13a6be380957d Text-delta-base-sha1: 1964b000919cd3e08047877c654a412ad3a70e9b Text-content-length: 91 Text-content-md5: 5aaa0d122522ef8486b0c7657b22b6ad Text-content-sha1: e6be93bd66129d7d9621c005e805a296c6bc0168 Content-length: 91 SVN����������� ���_, TRUE�bv �I��I+ GET_, TRUE Node-path: putty-spinoffs/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 204de6b249cabac10ecdc41b36d654c6 Text-delta-base-sha1: 22745bf90cdc75b8e90bd81ea94b0be897e3d9a2 Text-content-length: 28 Text-content-md5: a6f226407fcaa9360e68ab9653070674 Text-content-sha1: a6b0060af263446fd5691ae4143b8367eef938e4 Content-length: 28 SVN�� �(��Y(, int Node-path: putty-spinoffs/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 11912cc3f04643fee74e632f921587b6 Text-delta-base-sha1: 63d63401663a4c7b09146e2d68d9cd2789bcc950 Text-content-length: 1094 Text-content-md5: 254e52e072184189af3de9a159cb9c73 Text-content-sha1: 7bcae00869fe5af3673e90671d648ced9e7251de Content-length: 1094 SVN��u:)�4�� 4�[=�IG�E~�p, need_auth, int need_authneed_auth = need_authif (pr->need_auth) { char *err; pr->auth_protocol[pr->auth_plen] = '\0'; /* ASCIZ */ err = x11_verify(pr->peer_ip, pr->peer_port, pr->disp, pr->auth_protocol, pr->auth_data, pr->auth_dlen); /* * If authorisation failed, construct and send an error * packet, then terminate the connection. */ if (err) { char *message; int msglen, msgsize; unsigned char *reply; message = dupprintf("%s X11 proxy: %s", appname, err); msglen = strlen(message); reply = snewn(8 + msglen+1 + 4, unsigned char); /* include zero */ msgsize = (msglen + 3) & ~3; reply[0] = 0; /* failure */ reply[1] = msglen; /* length of reason string */ PUT_16BIT(pr->firstpkt[0], reply + 6, msgsize >> 2);/* data len */ memset(reply + 8, 0, msgsize); memcpy(reply + 8, message, msglen); sshfwd_write(pr->c, (char *)reply, 8 + msgsize); sshfwd_close(pr->c); x11_close(s); sfree(reply); sfree(message); return 0; } Revision-number: 8523 Prop-content-length: 188 Content-length: 188 K 7 svn:log V 88 Robustness in the face of unexpected X errors that don't match anything in our records. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-27T18:13:17.195216Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cc1edd53c939216419a3d993b7b0d3a6 Text-delta-base-sha1: 6fc3c11c3c71480860474b8307f59333270045e2 Text-content-length: 501 Text-content-md5: 6a5333e094c2240ee84429022b2e39e2 Text-content-sha1: 802a4f03dd6cea6bec05b935e19975c2f5581be0 Content-length: 501 SVN�����.��Qreq != NULL && currreq == req) { fprintf(xlogfp, " = "); } else { if (currreq) { xlog_new_line(); currreq = NULL; } if (req) fprintf(xlogfp, " ... %s = ", req->text); else fprintf(xlogfp, "--- error received for unknown request:�e2�(��An�^~� Yog_param(xl, "threshold", DEC16, FETCH16(data, 12)); break; case 108: /* GetScreenSaver */ xlog_param(xl, "timeout", DEC16, FETCH16(dataif (xl->rheadvent(struct xlog *xl Revision-number: 8524 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2009-04-27T18:15:11.239681Z K 7 svn:log V 138 Fix sequence number handling in the proxy-based trace mode, which I apparently broke while getting it working in the X RECORD mode. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a5333e094c2240ee84429022b2e39e2 Text-delta-base-sha1: 802a4f03dd6cea6bec05b935e19975c2f5581be0 Text-content-length: 41 Text-content-md5: 2ff1431738101fa6f1b4496a53011ea4 Text-content-sha1: fb74e50d6ddfcf1648762aebc792d15678dfeb92 Content-length: 41 SVN���� ���c1���� Revision-number: 8525 Prop-content-length: 263 Content-length: 263 K 7 svn:log V 162 Finish up the X RECORD work: we now bypass window-manager windows in finding the real client to be traced, and also error handling has been generally spruced up. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-27T18:49:11.018908Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ff1431738101fa6f1b4496a53011ea4 Text-delta-base-sha1: fb74e50d6ddfcf1648762aebc792d15678dfeb92 Text-content-length: 13340 Text-content-md5: 7eaf56d06096fe91d336790fb8e40c6d Text-content-sha1: 7052661cfcdae776f3aa771ef8930932fb85ddab Content-length: 13340 SVN����8U���7u�*D�U>w��N|�U�qy�O5�um]�5�)j�O5�2�~7�h+�8�}|L�|�`8�|�c9�&7� |�|�h=�-!�LD�~7�r3�o!�|�5�O5�(�|�^�~7�S�I5A�p<�Y<�p�*�O5�/6�O5�KR�c;const char *xlog_translate_event(int eventtype) { switch (eventtype & 0x7F) { case 2: return "KeyPress"; case 3: return "KeyRelease"; case 4: return "ButtonPress"; case 5: return "ButtonRelease"; case 6: return "MotionNotify"; case 7: return "EnterNotify"; case 8: return "LeaveNotify"; case 9: return "FocusIn"; case 10: return "FocusOut"; case 11: return "KeymapNotify"; case 12: return "Expose"; case 13: return "GraphicsExposure"; case 14: return "NoExposure"; case 15: return "VisibilityNotify"; case 16: return "CreateNotify"; case 17: return "DestroyNotify"; case 18: return "UnmapNotify"; case 19: return "MapNotify"; case 20: return "MapRequest"; case 21: return "ReparentNotify"; case 22: return "ConfigureNotify"; case 23: return "ConfigureRequest"; case 24: return "GravityNotify"; case 25: return "ResizeRequest"; case 26: return "CirculateNotify"; case 27: return "CirculateRequest"; case 28: return "PropertyNotify"; case 29: return "SelectionClear"; case 30: return "SelectionRequest"; case 31: return "SelectionNotify"; case 32: return "ColormapNotify"; case 33: return "ClientMessage"; case 34: return "MappingNotify"; default: return NULL; } } void xlog_event(struct xlog *xl, const unsigned char *data, int len, int pos) { int event; const char *namename = xlog_translate_event(event); xlog_printf(xl, "%s", name);/* KeyPress, KeyRelease, ButtonPress, ButtonRelease, MotionNotify, * EnterNotify, LeaveNotify */ xlog_printf(xl, "("/* FocusIn, FocusOut */ xlog_printf(xl, "/* KeymapNotify */ xlog_printf(xl, "/* Expose */ xlog_printf(xl, "6)); xlog_printf(xl, ")"); break; case 13: /* GraphicsExposure */ xlog_printf(xl, "/* NoExposure */ xlog_printf(xl, "/* VisibilityNotify */ xlog_printf(xl, "/* CreateNotify */ xlog_printf(xl, "/* DestroyNotify */ xlog_printf(xl, "rintf(xl, ")"); break; case 18: /* UnmapNotify */ xlog_printf(xl, "/* MapNotify */ xlog_printf(xl, "/* MapRequest */ xlog_printf(xl, "/* ReparentNotify */ xlog_printf(xl, "/* ConfigureNotify */ xlog_printf(xl, "/* ConfigureRequest */ xlog_printf(xl, "/* GravityNotify */ xlog_printf(xl, "/* ResizeRequest */ xlog_printf(xl, "/* CirculateNotify */ xlog_printf(xl, "/* CirculateRequest */ xlog_printf(xl, "8: /* PropertyNotify */ xlog_printf(xl, "/* SelectionClear */ xlog_printf(xl, "("); xlog_param(xl, "owneime", HEX32, FETCH32(data, pos+4)); xlog_printf(xl, ")"); break; case 30: /* SelectionRequest */ xlog_printf(xl, "("); xlog_param(xl, "owne/* SelectionNotify */ xlog_printf(xl, "/* ColormapNotify */ xlog_printf(xl, "/* ClientMessage */ xlog_printf(xl, "/* MappingNotify */ xlog_printf(xl, "�N&Mb�2�@�;"�6[�~�~�z0�~D�zZJ�$s�.�}M�zf�2�@@�g��ye0�Fg�^_�a.�B0�>R �T5@�=rO�'^en + 1; } } break; case 101: /* GetKeyboardMapping */ { int keycode = req->first_keycode; int keycode_count = req->keycode_count; int keysyms_per_keycode = FETCH8(data, 1); int pos = 32; int i; char buf[64]; while (keycode_count > 0) { sprintf(buf, "keycode[%d]", keycode); xlog_param(xl, buf, SETBEGIN); for (i = 0; i < keysyms_per_keycode; i++) { sprintf(buf, "keysyms[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; } xlog_set_end(xl); i++; keycode++; keycode_count--; } } break; case 103: /* GetKeyboardControl */ xlog_param(xl, "key-click-percent", DECU, FETCH8(data, 12)); xlog_param(xl, "bell-percent", DECU, FETCH8(data, 13)); xlog_param(xl, "bell-pitch", DECU, FETCH16(data, 14)); xlog_param(xl, "bell-duration", DECU, FETCH16(data, 16)); xlog_param(xl, "led-mask", HEX32, FETCH32(data, 8)); xlog_param(xl, "global-auto-repeat", ENUM | SPECVAL, FETCH8(data, 1), "Off", 0, "On", 1, (char *)NULL); { int i, n; int pos = 32; n = 32; for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "auto-repeats[%d]", i); xlog_param(xl, buf, HEX8, FETCH8(data, pos)); pos++; } } break; case 106: /* GetPointerControl */ xlog_param(xl, "acceleration", RATIONAL16, FETCH16(data, 8), FETCH16(data, 10)); xlconst char *xlog_translate_error(int errcode) { switch (errcode) { case 1: return "BadRequest"; case 2: return "BadValue"; case 3: return "BadWindow"; case 4: return "BadPixmap"; case 5: return "BadAtom"; case 6: return "BadCursor"; case 7: return "BadFont"; case 8: return "BadMatch"; case 9: return "BadDrawable"; case 10: return "BadAccess"; case 11: return "BadAlloc"; case 12: return "BadColormap"; case 13: return "BadGContext"; case 14: return "BadIDChoice"; case 15: return "BadName"; case 16: return "BadLength"; case 17: return "BadImplementation"; default: return const char *errorerror = xlog_translate_error(errcode); if (error) xlog_printf(xl, "%s", error); else xlog_printf(xl, "UnknownError%d", errcode); switch (errcode) { case 1: /* BadRequest */ break; case 2: /* BadValue */ xlog_printf(xl, "("); xlog_param(xl, "value", HEX32, FETCH32(data, 4)); xlog_printf(xl, ")"); break; case 3: /* BadWindow */ xlog_printf(xl, "/* BadPixmap */ xlog_printf(xl, "/* BadAtom */ xlog_printf(xl, "/* BadCursor */ xlog_printf(xl, "/* BadFont */ xlog_printf(xl, "/* BadMatch */ break; case 9: /* BadDrawable */ xlog_printf(xl, "/* BadAccess */ break; case 11: /* BadAlloc */ break; case 12: /* BadColormap */ xlog_printf(xl, "/* BadGContext */ xlog_printf(xl, "/* BadIDChoice */ xlog_printf(xl, "/* BadName */ break; case 16: /* BadLength */ break; case 17: /* BadImplementation */ break; default: /* UnknownError */ breakwinq { unsigned winid; struct winq *next; };, wmsatom struct winq *whead, *wtailint n = c->xrecordbuf[1]; if (n > c->xrecordlen - 8) n = c->xrecordlen - 8; fprintf(stderr, "xtrace: X server denied authentication (\"%.*s\")\n", n, c->xrecordbuf + 8 #define EXPECT_REPLY(name) do { \ if (c->xrecordbuf[0] == 0) { \ const char *err = xlog_translate_error(c->xrecordbuf[1]); \ if (err) \ fprintf(stderr, "xtrace: X server returned %s error to" \ " RecordQueryVersion\n", err); \ else \ fprintf(stderr, "xtrace: X server returned unknown error %d to" \ " RecordQueryVersion\n", c->xrecordbuf[1]); \ exit(1); \ } else if (c->xrecordbuf[0] != 1) { \ const char *ev = xlog_translate_event(c->xrecordbuf[0]); \ if (ev) \ fprintf(stderr, "xtrace: unexpected event received (%s)\n", ev); \ else \ fprintf(stderr, "xtrace: unexpected event received (%d)\n", \ c->xrecordbuf[0]); \ exit(1); \ } \ } while (0) EXPECT_REPLY("QueryExtension"); if (c->xrecordbuf[8] != 1) { fprintf(stderr, "xtrace: cannot use -p: X server does not support" " the X RECORD extensionEXPECT_REPLY("RecordQueryVersion");EXPECT_REPLY("GrabPointer"); if (c->xrecordbuf[1] != 0) { char reason[32]; switch (c->xrecordbuf[1]) { case 1: sprintf(reason, "AlreadyGrabbed"); break; case 2: sprintf(reason, "InvalidTime"); break; case 3: sprintf(reason, "NotViewable"); break; case 4: sprintf(reason, "Frozen"); break; default: sprintf(reason, "unknown error code %d", c->xrecordbuf[1]); break; } fprintf(stderr, "xtrace: could not grab mouse pointer for window" " selection: %s\n", reason#define EXPECT_EVENT(num) do { \ if (c->xrecordbuf[0] == 0) { \ const char *err = xlog_translate_error(c->xrecordbuf[1]); \ if (err) \ fprintf(stderr, "xtrace: X server returned unexpected %s " \ "error\n", err); \ else \ fprintf(stderr, "xtrace: X server returned unexpected and " \ "unknown error %d\n", c->xrecordbuf[1]); \ exit(1); \ } else if (c->xrecordbuf[0] == 1) { \ fprintf(stderr, "xtrace: unexpected reply received\n"); \ } else if ((c->xrecordbuf[0] & 0x7F) != num) { \ const char *ev = xlog_translate_event(c->xrecordbuf[0]); \ if (ev) \ fprintf(stderr, "xtrace: unexpected event received (%s)\n", ev); \ else \ fprintf(stderr, "xtrace: unexpected event received (%d)\n", \ c->xrecordbuf[0]); \ exit(1); \ } \ } while (0) EXPECT_EVENT(4);The window id we've retrieved was almost certainly owned * by the WM rather than by some actual client. So now we * must search down the tree of its child windows until we * find one which has a WM_STATE property (meaning that the * window manager has marked it as a top-level client * window). * * We do this in breadth-first order, partly because * managing a queue is marginally easier in a coroutine of * this type than managing a recursion, but mostly because * it seems like a more sensible order to avoid getting too * bogged down in any complicated window furniture we might * encounter before the real client window. */ /* * Start by finding the WM_STATE atom. */ buf[0] = 16; /* InternAtom opcode */ buf[1] = 1; /* don't create the WM_STATE atom */ PUT_16BIT_MSB_FIRST(buf+2, 4); /* request length */ PUT_16BIT_MSB_FIRST(buf+4, 8); /* name length */ PUT_16BIT_MSB_FIRST(buf+6, 0); /* padding */ memcpy(buf+8, "WM_STATE", 8); /* name */ x11_send(c->xs, buf, 16); do { read(c, xrecord, 32); if (c->xrecordbuf[0] == 1) readfrom(c, xrecord, 32+4*GET_32BIT_MSB_FIRST(c->xrecordbuf + 4), 32); } while (c->xrecordbuf[0] > 1);/* ignore events */ EXPECT_REPLY("InternAtom"); c->wmsatom = GET_32BIT_MSB_FIRST(c->xrecordbuf + 8); if (!c->wmsatom) { /* * The WM_STATE atom is not understood by the server at * all, which certainly means no window will have a * property by that name. In this situation (similarly * to if we do not find a WM_STATE-marked window at all) * we return the window we started with. Presumably, in * this situation, no window manager is running at all, * or if it is it's an odd one. */ break; } c->whead = c->wtail = snew(struct winq); c->whead->winid = c->clientid; c->whead->next = NULL; while (c->whead) { /* * Query the WM_STATE property on the window. */ buf[0] = 20; /* GetProperty opcode */ buf[1] = 0; /* do not delete the property! */ PUT_16BIT_MSB_FIRST(buf+2, 6); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, c->whead->winid); /* window */ PUT_32BIT_MSB_FIRST(buf+8, c->wmsatom); /* property ("WM_STATE") */ PUT_32BIT_MSB_FIRST(buf+12, 0); /* type (AnyPropertyType) */ PUT_32BIT_MSB_FIRST(buf+16, 0); /* long-offset */ PUT_32BIT_MSB_FIRST(buf+20, 0); /* long-length */ x11_send(c->xs, buf, 24); do { read(c, xrecord, 32); if (c->xrecordbuf[0] == 1) readfrom(c, xrecord, 32+4*GET_32BIT_MSB_FIRST(c->xrecordbuf + 4), 32); } while (c->xrecordbuf[0] > 1);/* ignore events */ EXPECT_REPLY("GetProperty"); if (GET_32BIT_MSB_FIRST(c->xrecordbuf+8) != 0) { /* * Found it! */ c->clientid = c->whead->winid; while (c->whead) { struct winq *next = c->whead->next; sfree(c->whead); c->whead = next; } c->whead = c->wtail = NULL; break; } /* * This wasn't the droid^Wwindow we're looking for. Get * a list of its child windows, and add them to the * queue. */ buf[0] = 15; buf[1] = 0; /* QueryTree opcode and padding */ PUT_16BIT_MSB_FIRST(buf+2, 2); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, c->whead->winid); /* window */ x11_send(c->xs, buf, 8); do { read(c, xrecord, 32); if (c->xrecordbuf[0] == 1) readfrom(c, xrecord, 32+4*GET_32BIT_MSB_FIRST(c->xrecordbuf + 4), 32); } while (c->xrecordbuf[0] > 1);/* ignore events */ EXPECT_REPLY("QueryTree"); { int i, n = GET_16BIT_MSB_FIRST(c->xrecordbuf + 16); if (n > (c->xrecordlen - 32) / 4) n = (c->xrecordlen - 32) / 4; /* buffer overrun check */ for (i = 0; i < n; i++) { c->wtail->next = snew(struct winq); c->wtail = c->wtail->next; c->wtail->next = NULL; c->wtail->winid = GET_32BIT_MSB_FIRST(c->xrecordbuf + 32 + 4*i); } } /* * And now dequeue the window we've just processed. */ { struct winq *old = c->whead; c->whead = c->whead->next; sfree(old); } }do { read(c, xrecord, 32); if (c->xrecordbuf[0] == 1) readfrom(c, xrecord, 32+4*GET_32BIT_MSB_FIRST(c->xrecordbuf + 4), 32); } while (c->xrecordbuf[0] > 1);/* ignore events */xtrace: unexpected data record type received " "(%d)\n", c->xrecordbuf[1] Revision-number: 8526 Prop-content-length: 374 Content-length: 374 K 8 svn:date V 27 2009-04-27T18:52:45.390073Z K 7 svn:log V 273 Some instances of HEXSTRING2 actually needed to be fixed to big-endian rather than varying with connection endianness (because in the X protocol, a 2-byte-per-character string is nominally a list of (high byte, low byte) pairs rather than a list of 16-bit integers, sigh). K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7eaf56d06096fe91d336790fb8e40c6d Text-delta-base-sha1: 7052661cfcdae776f3aa771ef8930932fb85ddab Text-content-length: 695 Text-content-md5: 86b689af494c3d4c626c54c1b7e531f9 Text-content-sha1: 9eaf086616d61dfb3e3725b41b3bddb220f8a0a3 Content-length: 695 SVN����/6�^��O�~]�Aa�v"� �/!2B2B: /* Fixed big-endian variant of HEXSTRING2, used for CHAR2B * strings which are nominally pairs of bytes rather than * 16-bit integers. */GET_16BIT_MSB_FIRSTBBB�N~00�N�10)); xlog_param(xl, "first-error", DECU, FETCH8(data, 11)); /* FIXME: we should add to our list of known-extension opcodes */ break; case 99: /* ListExtensions */ { int i, n; int pos = 32; n = FETCH8(data, 1); for (i = 0; i < n; i++) { char buf[64]; int slen; sprintf(buf, "names[%d]", i); slen = FETCH8(data, pos); xlog_param(xl, buf, STRING, slen, STRING(data, pos+1, slen)); pos += sl Revision-number: 8527 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8528 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8529 Prop-content-length: 348 Content-length: 348 K 8 svn:date V 27 2009-04-28T17:59:13.941025Z K 7 svn:log V 247 Beginnings of a framework to handle X protocol extensions: we track the responses to QueryExtension requests and use the information to annotate extension data with which extension it belongs to. (Though we still can't actually _understand_ any.) K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 86b689af494c3d4c626c54c1b7e531f9 Text-delta-base-sha1: 9eaf086616d61dfb3e3725b41b3bddb220f8a0a3 Text-content-length: 10779 Text-content-md5: 7c952c22955ff3fbd6146aa7b421153b Text-content-sha1: ea13f01ff3d1ece57301e2504378d66c4978e9d6 Content-length: 10779 SVN���� vo�`mP�gMI�FF �{>c�t9'�_'[�Z|j�(Uc�`x�dR �`0K�7!�{3�&J�Q�cdO�NC�e/* * xtrace: looks like strace, quacks like xmon. * * xtrace monitors the data sent and received between an X client * and the X server, and logs it in a format reminiscent of Linux's * strace(1). Its command-line syntax is also similar to strace: in * the simplest invocation, you just run the target X program * exactly as you normally would but prefix it with 'xtrace', e.g. * 'xtrace xterm -fn 9x15'. If your X server supports the X RECORD * extension, you can also attach xtrace to a client which is * already running, by specifying an X resource id (similarly to * xkill(1)) or by selecting a window interactively with the mouse. * * I wrote it because xmon irritated me by not being enough like * strace: a pain to set up (two confusingly cooperating processes, * no automatic handling of authorisation for the proxy display) and * unreadable in its output (half a screen per request or response, * and no way to see at a glance what request a response was a reply * to). * * This is a spinoff project from the PuTTY code base: the X proxy * code reuses the X forwarding framework from PuTTY, because that * provided for free all the code that invents of new authorisation * data and checks and replaces it in the proxied connections, particularly since it's also the id * used by X RECORD so there's precedentExpand the extension tracking to make it recognise some set of * extensions we actually know how to decode: * * define our own numeric codes for extensions we know about, * each one with its bottom 8 bits clear * * have arrays in xl parallel to extreqs,exterrors,extevents * which map major request opcodes to extension ids and map * error codes and event codes to (extension-id | index). Set * these up when receiving a QueryExtension reply for an * extension we understand. (For the error and event code * tables, we fill in multiple entries if the extension * defines multiple events and errors.) * * then when we're looking up a request, the first thing we * can do is to check to see if the major opcode corresponds * to a recognised extension, and if so replace it with * extension-id | minor_opcode; and when looking up an event * or error, we replace it with the item at that position in * the appropriate lookup table if there is one. Then we can * just add elements to our existing switches to format the * extension-specific protocol elements. * * We'll also need to figure out what to do about the -p mode, * in which we'll inevitably see extension data going past for * which we didn't tune in early enough to see the * QueryExtension. Querying all the extensions in our control * connection before we start sounds like the only sensible * answer. * * - Support at the very least the BIG-REQUESTS extension, since it * affects the basic protocol structure and so we will be * completely confused if anyone ever uses it in anger. (And Xlib * always turns it on, so one has to assume that eventually it * will have occasion toStop defaulting to :0 in the absence of $DISPLAY! * * - Pre-publication polishing: * * -display option. * * --help, --version, --licence. (Sort out the licence, * actually. Probably not _everybody_ in the PuTTY LICENCE * document holds copyright in the pieces I've reused here. * Also, possibly the authors of the X protocol hold some * copyright, since a lot of this code is transcribed straight * out of their definitions?) * * man page. * * figure out how to turn this sprawling directory full of * unused pieces of PuTTY into something that can convincingly * pretend to be a tarball of just xtrace... I definitely * like the one I've got now, but there's scope for others to be * selectable., which has * the virtue that it doesn't repeat enormous request lines in * the output. * * More radically than that, perhaps, never combine request * and response lines at all - just print a sequence number on * absolutely everything, and leave untangling it to the * readerMore xprop/xkill-like command line syntax for choosing a * client to trace via X RECORD? -id 0xXXX as a synonym for -p * XXX, for instance. Perhaps -name (for which we can reuse the * existing bfs loop to look for a window with the given WM_NAME * property). And should just 'xtrace' with no arguments work * like just 'xprop'? /* * Machine-readable representation of the extension name seen in * a QueryExtension, so that when we get its details back we can * start logging requests as belonging to that extension. */ char *extname;char *extreqs[128]; /* extension name for each >=128 request opcode */ char *extevents[128]; /* name of extension based at a given event */ char *exterrors[256]; /* name of extension based at a given error */int ifor (i = 0; i < 128; i++) xl->extreqs[i] = NULL; for (i = 0; i < 128; i++) xl->extevents[i] = NULL; for (i = 0; i < 256; i++) xl->exterrors[i] = NULL->extname); sfree(req); } void xlog_free(struct xlog *xl) { int i;for (i = 0; i < 128; i++) sfree(xl->extreqs[i]); for (i = 0; i < 128; i++) sfree(xl->extevents[i]); for (i = 0; i < 256; i++) sfree(xl->exterrors[i]);if (name) { xlog_printf(xl, "%s", name); } else { int i; for (i = 0; event-i >= 0; i++) if (xl->extevents[event-i]) { xlog_printf(xl, "%s:UnknownEvent%d", xl->extevents[event-i], i); break; } if (event-i < 0) xlog_printf(xl, "UnknownEvent%d"); }/* unknown event */req->extname = NULLif (!xl->overflow) req->extname = dupprintf("%.*s", READ16(data+4), data+8if (data[0] >= 128) { /* * Extension opcode. */ int opcode = data[0] - 128; char buf[64]; if (xl->extreqs[opcode]) { sprintf(buf, "%s:UnknownExtensionRequest%d", xl->extreqs[opcode], data[1]); } else { sprintf(buf, "%d:UnknownExtensionRequest%d", data[0], data[1]); } xlog_request_name(xl, buf); xlog_param(xl, "bytes", DECU, len); } else �~29Fc�>�K7�K7�K*�KH�g�o�jam(xl, "max-byte1", DECU, FETCH8(data, 50)); xlog_param(xl, "all-chars-exist", BOOLEAN, FETCH8(data, 51)); xlog_param(xl, "default-char", DECU, FETCH16(data, 44)); xlog_param(xl, "min-bounds", SETBEGIN); xlog_charinfo(xl, data, len, 8); xlog_set_end(xl); xlog_param(xl, "max-bounds", SETBEGIN); xlog_charinfo(xl, data, len, 24); xlog_set_end(xl); xlog_param(xl, "font-ascent", DEC16, FETCH16(data, 52)); xlog_param(xl, "font-descent", DEC16, FETCH16(data, 54)); { int pos = 64; int i = 0; int n; char buf[64]; n = FETCH16(data, 46); for (i = 0; i < n; i++) { sprintf(buf, "properties[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_fontprop(xl, data, len, pos); xlog_set_end(xl); pos += 8; } } xlog_param(xl, "replies-hint", DEC16, FETCH32(data, 56)); break; case 52: /* GetFontPath */ { int i, n; int pos = 32; n = FETCH16(data, 8); for (i = 0; i < n; i++) { char buf[64]; int slen; sprintf(buf, "path73: /* GetImage */ xlog_param(xl, "depth", DECU, FETCH8(data, 1)); xlog_param(xl, "visual", VISUALID | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); /* FIXME: the actual image data is not currently logged */ break; case 83: /* ListInstalledColormaps */cmaps[%d]", i); xlog_param(xl, buf, COLORMAP, FETCH32(data, pos)); pos += 4; } } break; case 84: /* AllocColor */ xlog_param(xl, "pixel", HEX32, FETCH32(data, 16)); xlog_param(xl, "red", HEX16, FETCH16(data, 8)); xlog_param(xl, "green", HEX16, FETCH16(data, 10)); xlog_param(xl, "blue", HEX16, FETCH16(data, 12)); break; case 85: /* AllocNamedColor */ xlog_param(xl, "pixel", HEX32, FETCH32(data, 8)); xlog_param(xl, "exact-red", HEX16, FETCH16(data, 12)); xlog_param(xl, "exact-green", HEX16, FETCH16(data, 14)); xlog_param(xl, "exact-blue", HEX16, FETCH16(data, 16)); xlog_param(xl, "visual-red", HEX16, FETCH16(data, 18)); xlog_param(xl, "visual-green", HEX16, FETCH16(data, 20)); xlog_param(xl, "visual-blue", HEX16, FETCH16(data, 22)); break; case 86: /* AllocColorCells */pixels[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; } n = FETCH16(data, 10); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "masks[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; } } break; case 87: /* AllocColorPlanes */pixels[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); pos += 4; } } xlog_param(xl, "red-mask", HEX32, FETCH32(data, 12)); xlog_param(xl, "green-mask", HEX32, FETCH32(data, 16)); xlog_param(xl, "blue-mask", HEX32, FETCH32(data, 20)); break; case 91: /* QueryColors */colors[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "red", HEX16, FETCH16(data, pos)); xlog_param(xl, "green", HEX16, FETCH16(data, pos+2)); xlog_param(xl, "blue", HEX16, FETCH16(data, pos+4)); xlog_set_end(xl); pos += 4; } } break; case 92: /* LookupColor */ xlog_param(xl, "exact-red", HEX16, FETCH16(data, 8)); xlog_param(xl, "exact-green", HEX16, FETCH16(data, 10)); xlog_param(xl, "exact-blue", HEX16, FETCH16(data, 12)); xlog_param(xl, "visual-red", HEX16, FETCH16(data, 14)); xlog_param(xl, "visual-green", HEX16, FETCH16(data, 16)); xlog_param(xl, "visual-blue", HEX16, FETCH16(data, 18)); break; case 97: /* QueryBestSize */ xlog_param(xl, "width", DECU, FETCH16(data, 8)); xlog_param(xl, "height", DECU, FETCH16(data, 10)); break; case 98: /* QueryExtension */ xlog_param(xl, "present", BOOLEAN, FETCH8(data, 8)); xlog_param(xl, "major-opcode", DECU, FETCH8(data, 9)); xlog_param(xl, "first-event", DECU, FETCH8(data, 10)); xlog_param(xl, "first-error", DECU, FETCH8(data, 11)); assert(req->extname); if (!xl->overflow && FETCH8(data, 8)) { int opcode = FETCH8(data, 9) - 128; if (!xl->extreqs[opcode]) xl->extreqs[opcode] = dupstr(req->extname); opcode = FETCH8(data, 10); if (opcode < 128 && !xl->extevents[opcode]) xl->extevents[opcode] = dupstr(req->extname); opcode = FETCH8(data, 11); if (!xl->exterrors[opcode]) xl->exterrors[opcode] = dupstr(req->extname); } { int i; for (i = 0; errcode-i >= 0; i++) if (xl->exterrors[errcode-i]) { xlog_printf(xl, "%s:UnknownError%d", xl->exterrors[errcode-i], i); break; } if (errcode-i < 0) xlog_printf(xl, "UnknownError%d"); } Revision-number: 8530 Prop-content-length: 290 Content-length: 290 K 7 svn:log V 189 Introduce a framework for decoding X protocol extensions, and support the decoding of the BIG-REQUESTS extension (though we don't yet do anything about actual big requests, and we should). K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-28T19:26:01.692015Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7c952c22955ff3fbd6146aa7b421153b Text-delta-base-sha1: ea13f01ff3d1ece57301e2504378d66c4978e9d6 Text-content-length: 5073 Text-content-md5: 829c5a533285159a38c380fd029a6f6d Text-content-sha1: 1495d1c1bd3ded2b24ad68af6893caaf95f88553 Content-length: 5073 SVN����\`���9L�~3+�</���b�y 6� u�k$p�5 �8=#�?xSupport the actual format change in the BIG-REQUESTS * extension, since it affects the basic protocol structure and * so we will be completely confused if anyone ever uses it in * anger. (And Xlib always turns it on, so one has to assume that * eventually itDecode more extensions. * * - Work out what to do about extension tracking in -p mode. * * The only thing I can think of at the moment is for our * control connection to do a ListExtensions and then lots of * QueryExtension before we even attach to the target client. * * But are we guaranteed that extension opcode indices will be * the same between all client connections? It'd certainly be * the _obvious_ way to implement an X server, but I don't * think anything in the protocol specifically requires it. * Another thing a server might choose to do would be to * allocate extension number-space sequentially from the base * but independently for each client connection, and translate * the event numbers in SendEvents between clients. The * advantage of doing this would be that the server could * support more extensions than fit into the number space, and * each client could use any subset of them that _would_ fit./* * Parametric macro defining each known extension as an internal * identifier, its protocol-level string id, and the number of * errors and events it defines. */ #define KNOWNEXTENSIONS(X) \ X(EXT_BIGREQUESTS, "BIG-REQUESTS", 0, 0) /* * Define the EXT_* ids as a series of values with the low 8 bits * clear. */ #define EXTENUM(e,s,er,ev) dummy1##e, dummy2##e = dummy1##e+0xFE, e, enum { dummy_min_ext = 0, KNOWNEXTENSIONS(EXTENUM) dummy_max_ext }; /* * Declare arrays such that extnumerrors[ext>>8] and * extnumevents[ext>>8] give the number of errors and events defined * by each known extension, and extname[ext>>8] gives its name. */ #define EXTNAME(e,s,er,ev) s const char *const extname[] = { NULL, KNOWNEXTENSIONS(EXTNAME) }; #define EXTERRORS(e,s,er,ev) er const int extnumerrors[] = { 0, KNOWNEXTENSIONS(EXTERRORS) }; #define EXTEVENTS(e,s,er,ev) ev const int extnumevents[] = { 0, KNOWNEXTENSIONS(EXTEVENTS) };seen in a * int extidxtidreqs[128]; /* our extension ids */ int extidevents[128]; int extiderrors[256];, xl->extidreqs[i] = 0; for (i = 0; i < 128; i++) xl->extevents[i] = NULL, xl->extidevents[i] = 0; for (i = 0; i < 256; i++) xl->exterrors[i] = NULL, xl->extidevents[i] = 0/* Translate events from extensions we know about */ if (xl->extidevents[event]) event = xl->extidevents[event];req->extid = 0; /* * Translate requests belonging to known extensions so we can * switch on them. */ if (req->opcode >= 128 && xl->extidreqs[req->opcode-128]) req->opcode = xl->extidreqs[req->opcode-128] | data[1]; { int i; for (i = 1; i < lenof(extname); i++) { if (!strcmp(req->extname, extname[i])) { req->extid = i << 8; break; } } } case 127: xlog_request_name(xl, "NoOperation"); break; case EXT_BIGREQUESTS | 0: xlog_request_name(xl, "BigReqEnable"); req->replies = 1; break; �2a1J}�wz�6�O�]�Q}S�Ro�<@z�<v "font-descent", DEC16, FETCH16(data, 10)); xlog_param(xl, "overall-ascent", DEC16, FETCH16(data, 12)); xlog_param(xl, "overall-descent", DEC16, FETCH16(data, 14)); xlog_param(xl, "overall-width", DEC32, FETCH32(data, 16)); xlog_param(xl, "overall-left", DEC32, FETCH32(data, 20)); xlog_param(xl, "overall-right", DEC32, FETCH32(data, 24)); break; case 49: /* ListFont50: /* ListFontsWithInfo */ if (FETCH8(data, 1) == 0) { xlog_param(xl, "last-reply", BOOLEAN, 1); break; } xlog_param(xl, "name", STRING, FETCH8(data, 1), STRING(data, 64+8*FETCH16(data, 46), FETCH8(data, 1))); xlog_param(xl, "draw-direction", ENUM | SPECVAL, FETCH8(data, 48), "LeftToRight", 0, "RightToLeft", 1, (char *)NULL); xlog_param(xl, "min-char-or-byte2", DECU, FETCH16(data, 40)); xlog_param(xl, "max-char-or-byte2", DECU, FETCH16(data, 42)); xlog_param(xl, "min-byte1", DECU, FETCH8(data, 49)); xlog_par { xl->extreqs[opcode] = dupstr(req->extname); xl->extidreqs[opcode] = req->extid; } { xl->extevents[opcode] = dupstr(req->extname); if (req->extid) { int i; for (i = 0; i < extnumevents[req->extid >> 8]; i++) xl->extidevents[opcode + i] = req->extid | i; } } opcode = FETCH8(data, 11); if (!xl->exterrors[opcode]) { xl->exterrors[opcode] = dupstr(req->extname); if (req->extid) { int i; for (i = 0; i < extnumerrors[req->extid >> 8]; i++) xl->extiderrors[opcode + i] = req->extid | i; } } case EXT_BIGREQUESTS | 0: /* "BigReqEnable" */ xlog_param(xl, "maximum-request-length", DECU, FETCH32(data, 8)); break; /* Translate errors from extensions we know about */ if (xl->extiderrors[errcode]) errcode = xl->extiderrors[errcode] Revision-number: 8531 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2009-04-28T20:06:01.714494Z K 7 svn:log V 65 Support the actual big requests from the BIG-REQUESTS extension. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 829c5a533285159a38c380fd029a6f6d Text-delta-base-sha1: 1495d1c1bd3ded2b24ad68af6893caaf95f88553 Text-content-length: 1387 Text-content-md5: 74411c3ffe396ec2e3473decdc10cf29 Text-content-sha1: fda40ab82938bbff7c68000bc679a73139a530b2 Content-length: 1387 SVN���� ;���?A; "font-descent", DEC16, FETCH16(data, 10)); xlog_param(xl, "overall-ascent", DEC16, FETCH16(data, 12)); xlog_param(xl, "overall-descent", DEC16, FETCH16(data, 14)); xlog_param(xl, "overall-width", DEC32, FETCH32(data, 16)); xlog_param(xl, "overall-left", DEC32, FETCH32(data, 20)); xlog_param(xl, "overall-righ�aY{�k;{�snif (i == 0) { /* * A zero length field means an extended request packet, * via the BIG-REQUESTS protocol extension. We must be * prepared to cope with big requests at all times: it * can't be conditional on having seen a BigReqEnable, * because in -p mode we might have tuned in after that * went past. */ readfrom(xl, c2s, 8, 4); i = READ32(xl->c2sbuf + 4); readfrom(xl, c2s, i*4, 8); /* * Shift the first four bytes of the packet upwards, so * as to remove the inserted extra length word. Then * pass on to xlog_do_request() as usual, which won't * mind the length field in the packet data it sees * being zero because we're passing the real length as a * separate parameter and it will look at that instead. */ memcpy(xl->c2sbuf + 4, xl->c2sbuf, 4); xlog_do_request(xl, xl->c2sbuf + 4, xl->c2slen - 4); } else { readfrom(xl, c2s, i*4, 4); xlog_do_request(xl, xl->c2sbuf, xl->c2slen); } Revision-number: 8532 Prop-content-length: 238 Content-length: 238 K 8 svn:date V 27 2009-04-28T20:39:48.443846Z K 7 svn:log V 137 Support the MIT-SHM extension, mostly because it's a reasonably small one that lets me do a bit more testing of the extension framework. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 74411c3ffe396ec2e3473decdc10cf29 Text-delta-base-sha1: fda40ab82938bbff7c68000bc679a73139a530b2 Text-content-length: 5015 Text-content-md5: d388fc0d2229692fee390697367947cf Text-content-sha1: 06742a4644483c2065cf30f1f40208b7919c93da Content-length: 5015 SVN����\R���=d�^:�H�W�ijn�0]u� k/�Tm�F0]� k�g7 �r| \ X(EXT_MITSHM, "MIT-SHM", 1, 1, const char *const extname[] = { NULL, KNOWNEXTENSIONS(EXTNAME) }; #define EXTERRORS(e,s,er,ev) er,,case EXT_MITSHM | 0: return "ShmCompletioncase EXT_MITSHM | 0: /* ShmCompletionshmseg", HEX32, FETCH32(data, pos+8)); xlog_param(xl, "minor-event", DECU, FETCH16(data, pos+12)); xlog_param(xl, "major-event", DECU, FETCH8(data, pos+14)); xlog_param(xl, "offset", HEX32, FETCH32(data, pos+16)); xlog_printf(xl, ")")case EXT_MITSHM | 0: xlog_request_name(xl, "ShmQueryVersion"); req->replies = 1; break; case EXT_MITSHM | 1: xlog_request_name(xl, "ShmAttach"); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 4)); xlog_param(xl, "shmid", HEX32, FETCH32(data, 8)); xlog_param(xl, "read-only", BOOLEAN, FETCH8(data, 12)); break; case EXT_MITSHM | 2: xlog_request_name(xl, "ShmDetach"); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 4)); break; case EXT_MITSHM | 3: xlog_request_name(xl, "Shmtotal-width", DECU, FETCH16(data, 12)); xlog_param(xl, "total-height", DECU, FETCH16(data, 14)); xlog_param(xl, "src-x", DECU, FETCH16(data, 16)); xlog_param(xl, "src-y", DECU, FETCH16(data, 18)); xlog_param(xl, "src-width", DECU, FETCH16(data, 20)); xlog_param(xl, "src-height", DECU, FETCH16(data, 22)); xlog_param(xl, "dst-x", DEC16, FETCH16(data, 24)); xlog_param(xl, "dst-y", DEC16, FETCH16(data, 26)); xlog_param(xl, "depth", DECU, FETCH8(data, 28)); xlog_param(xl, "format", ENUM | SPECVAL, FETCH8(data, 29), "Bitmap", 0, "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); xlog_param(xl, "send-event", BOOLEAN, FETCH8(data, 30)); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 32)); xlog_param(xl, "offset", HEX32, FETCH32(data, 36)); break; case EXT_MITSHM | 4: xlog_request_name(xl, "ShmGeplane-mask", HEX32, FETCH32(data, 16)); xlog_param(xl, "format", ENUM | SPECVAL, FETCH8(data, 20), "Bitmap", 0, "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 24)); xlog_param(xl, "offset", HEX32, FETCH32(data, 28)); req->replies = 1; break; case EXT_MITSHM | 5: xlog_request_name(xl, "Shmdepth", DECU, FETCH8(data, 16)); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 20)); xlog_param(xl, "offset", HEX32, FETCH32(data, 24))�Y7)&z�ao�$T��z}�U�r�/+�Q */ { int pos = 32; int i = 0; int n = FETCH32(data, 8); char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "events[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_timecoord(xl, data, len, pos); xlog_set_end(xl); pos += 8; } } break; case 40: /* TranslateCoordinates */ xlog_param(xl, "same-screen", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "child", WINDOW | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); xlog_param(xl, "dst-x", DEC16, FETCH16(data, 12)); xlog_param(xl, "dst-y", DEC16, FETCH16(data, 14)); break; case 43: /* GetInputFocus */ xlog_param(xl, "focus", WINDOW | SPECVAL, FETCH32(data, 8), "None", 0, "PointerRoot", 1, (char *)NULL); xlog_param(xl, "revert-to", ENUM | SPECVAL, FETCH8(data, 1), "None", 0, "PointerRoot", 1, "Parent", 2, (char *)NULL); break; case 44: /* QueryKeymap */ { int pos = 8; int i = 0; int n = 32; char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "keys47: /* QueryFont */32 n = FETCH32(data, 56); for (i = 0; i < n; i++) { sprintf(buf, "char-infos[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_charinfo(xl, data, len, pos); xlog_set_end(xl); pos += 12; } } break; case 48: /* QueryTextExtents */ xlog_param(xl, "draw-direction", ENUM | SPECVAL, FETCH8(data, 1), "LeftToRight", 0, "RightToLeft", 1, (char *)NULL); xlog_param(xl, "font-ascent", DEC16, FETCH16(data, 8)); xlog_param(xl, "font-descent", DEC16, FETCH16(data, 10)); xlog_param(xl, "overall-ascent", DEC16, FETCH16(data, 12)); xlog_param(xl, "overall-descent", DEC16, FETCH16(data, 14)); xlog_param(xl, "overall-width", DEC32, FETCH32(data, 16)); xlog_param(xl, "overall-left", DEC32, FETCH32(data, 20)); xlog_param(xl, "overall-righBigReqEnable */ xlog_param(xl, "maximum-request-length", DECU, FETCH32(data, 8)); break; case EXT_MITSHM | 0: /* ShmQueryVersion */ xlog_param(xl, "shared-pixmaps", BOOLEAN, FETCH8(data, 1)); xlog_param(xl, "major-version", DECU, FETCH16(data, 8)); xlog_param(xl, "minor-version", DECU, FETCH16(data, 10)); xlog_param(xl, "uid", DECU, FETCH16(data, 12)); xlog_param(xl, "gid", DECU, FETCH16(data, 14)); xlog_param(xl, "pixmap-format", ENUM | SPECVAL, FETCH8(data, 16), "Bitmap", 0, "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); break; case EXT_MITSHM | 4: /* ShmGetImage */ xlog_param(xl, "depth", DECU, FETCH8(data, 1)); xlog_param(xl, "visual", VISUALID, FETCH32(data, 8)); xlog_param(xl, "size", DECU, FETCH32(data, 12));case EXT_MITSHM | 0: return "BadShmSeg Revision-number: 8533 Prop-content-length: 247 Content-length: 247 K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-29T07:33:20.152820Z K 7 svn:log V 146 '-s' option to impose an approximate limit on the length of any request or reply logged, by cutting off long lists and long strings. Default 256. PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d388fc0d2229692fee390697367947cf Text-delta-base-sha1: 06742a4644483c2065cf30f1f40208b7919c93da Text-content-length: 5212 Text-content-md5: 99e133a9bc0b8efb7ce1059ae91425d6 Text-content-sha1: c7c40bc7b56cbb56347e129679637a5c1acd6453 Content-length: 5212 SVN����Z�k��x�P[�)�.G7�S/�fzz�_��oz�#n�n�k~,�e�ba�n@� +� 1�J;�E�HD�x int sizelimit = 256;, *trail trail = ""; if (sizelimit > 0 && xl->textbuflen + ival > sizelimit) { int limitlen = sizelimit - xl->textbuflen; if (limitlen < 20) limitlen = 20; if (ival > limitlen) { ival = limitlen; trail = "..."; } } xlog_text(xl, "\""); print_c_string(xl, sval, ival); xlog_printf(xl, "\"%s", trail); break; case HEXSTRING: ival = va_arg(ap, int); sval = va_arg(ap, const char *); trail = ""; if (sizelimit > 0 && xl->textbuflen + 2*ival > sizelimit) { int limitlen = sizelimit - xl->textbuflen; if (limitlen < 8) limitlen = 8; if (ival > limitlen) { ival = limitlen; trail = "..."; } } xlog_text(xl, trail trail = ""; if (sizelimit > 0 && xl->textbuflen + 5*ival-1 > sizelimit) { int limitlen = sizelimit - xl->textbuflen; if (limitlen < 4) limitlen = 4; if (ival > limitlen) { ival = limitlen; trail = "..."; } } if (*trail) xlog_printf(xl, "%s%s", sep, trail); trail = ""; if (sizelimit > 0 && xl->textbuflen + 5*ival-1 > sizelimit) { int limitlen = sizelimit - xl->textbuflen; if (limitlen < 4) limitlen = 4; if (ival > limitlen) { ival = limitlen; trail = "..."; } } if (*trail) xlog_printf(xl, "%s%s", sep, trail); break; case HEXSTRING4: ival = va_arg(ap, int); sval = va_arg(ap, const char *); trail = ""; if (sizelimit > 0 && xl->textbuflen + 9*ival-1 > sizelimit) { int limitlen = sizelimit - xl->textbuflen; if (limitlen < 2) limitlen = 2; if (ival > limitlen) { ival = limitlen; trail = "..."; } } if (*trail) xlog_printf(xl, "%s%s", sep, trail);int xlog_check_list_length(struct xlog *xl) { if (sizelimit > 0 && xl->textbuflen > sizelimit) { xlog_param(xl, "...", NOTHING); return TRUE; } return FALSE; if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break�7x2�M>8�S}��S}�L?���>�R<�Q � Y�#b�|�{�9~�34� d�Tl�o=�<)�b�7n�$"�nC�r.�(�#TRING, FETCH32(data, 16), STRING(data, 32, FETCH32(data, 16))); break; case 16: xlog_param(xl, "data", HEXSTRING2, FETCH32(data, 16), STRING(data, 32, 2*FETCH32(data, 16))); break; case 32: xlog_param(xl, "data", HEXSTRING4, FETCH32(data, 16), STRING(data, 32, 4*FETCH32(data, 16))); break; default: xlog_printf(xl, "<unknown format of data>"); break; } } break; case 21: /* ListProperties */ { int pos = 32; int i = 0; int n = FETCH16atoms[%d]", i); xlog_param(xl, buf, ATOM, FETCH32(data, pos)); pos += 4; if (xlog_check_list_length(xl)) break; } } break; case 23: /* GetSelectionOwner */ xlog_param(xl, "owner", WINDOW | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); break; case 26: /* GrabPointerAlreadyGrabbed", 1, "InvalidTime", 2, "NotViewable", 3, "Frozen", 4, (char *)NULL); break; case 31: /* GrabKeyboardAlreadyGrabbed", 1, "InvalidTime", 2, "NotViewable", 3, "Frozen", 4, (char *)NULL); break; case 38: /* QueryPointer */ xlog_param(xl, "root", WINDOW, FETCH32(data, 8)); xlog_param(xl, "child", WINDOW | SPECVAL, FETCH32(data, 12), "None", 0, (char *)NULL);root-x", DEC16, FETCH16(data, 16)); xlog_param(xl, "root-y", DEC16, FETCH16(data, 18)); xlog_param(xl, "win-x", DEC16, FETCH16(data, 20)); xlog_param(xl, "win-y", DEC16, FETCH16(data, 22)); xlog_param(xl, "mask", HEX16, FETCH16(data, 24)); break; case 39: /* GetMotionEvents if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) break if (xlog_check_list_length(xl)) breaks':s': if (!strcasecmp(val, "infinite") || !strcasecmp(val, "infinity") || !strcasecmp(val, "inf") || !strcasecmp(val, "unlimited") || !strcasecmp(val, "none") || !strcasecmp(val, "nolimit")) sizelimit = 0; else sizelimit = atoi(val); break; Revision-number: 8534 Prop-content-length: 161 Content-length: 161 K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-29T07:35:13.860840Z K 7 svn:log V 61 Er, don't gormlessly print an equals sign after "...". Ahem. PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99e133a9bc0b8efb7ce1059ae91425d6 Text-delta-base-sha1: c7c40bc7b56cbb56347e129679637a5c1acd6453 Text-content-length: 266 Text-content-md5: 5f756551eb86ba0dab863e5d02e347d2 Text-content-sha1: ec15c9fab1feb1f828ef54ba6056ffcbc9d0dcc4 Content-length: 266 SVN����t�]��"WW�+�bCNOTEVENEQUALSIGNtext(xl, paramname); if ((type &~ SPECVAL) != NOTEVENEQUALSIGN) xlog_text(xl, "="EVENEQUALSIGN�xS[[�x�TCH32(data, 12)); switch (FETCH8(data, 1)) { case 8: xlog_param(xl, "data", S Revision-number: 8535 Prop-content-length: 356 Content-length: 356 K 7 svn:log V 255 -e option, with syntax similar to that of strace, allowing filtering of the trace output to a subset of the request and event types. (Replies and errors are only implicitly filtered: they're displayed iff the request to which they respond was displayed.) K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-29T18:01:30.152638Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f756551eb86ba0dab863e5d02e347d2 Text-delta-base-sha1: ec15c9fab1feb1f828ef54ba6056ffcbc9d0dcc4 Text-content-length: 15772 Text-content-md5: 3fe6f8241edea26e414345499b7b8ae9 Text-content-sha1: 5d06d81717da4505dc9169a9a778c36088aa8584 Content-length: 15772 SVN��������kQ�2 g� @�FG@�q �.N�DzB�ey�m@�m�o .�E)�wl�gq�p�^x�e�I7�R�I7�v~B�ej�f^�Q?�I7�j�} �^x�d*�}|(�I7�!T�I7j�I7�qv�^x�}�z�k�fu�4O�P9�m;�b{Z�z�=�d�}i�,�b9�wz�:F�} �B>�?WS�^x�=R�%�2P�GO�B�y@�gK�]=�,=y�sGu�4�<Y�;�d�E��P�Yg �d7�%�i%�d/����h*����*�p��)�p��f)�}{R�p��Tw� ���p��f)�}{V�p��Tw�0 ����}4�s^�M��F��Zn����?�[X����s?����P?� ����P?�t�5�Lz�R�Lz�fz�yx�}�I}�qu�I}�PN�I}�5y�e:�J:� v�I}�w\�J:�T|� �I}� u�"�:D�5�WC�*�a)��a8u�ex�ys�E�T�E}�k>� :x�B>�Xi�B>�|�h�I7�c`�B>v�J�8X�Qt�]1�q����)�M��F��Y`��gy�0�2�DIDecide how to log the image data in PutImage requests and * GetImage replies. I've found the specification of the family * of data formats used (perversely, it's under 'Server * Information' at the very start of the X spec), but now the * question becomes how much translation we should do before * printing it. I'm inclined to think the answer is to divide * each scan line into the smallest sensible unit * (bitmap-scanline-unit for XY format, max(bits-per-pixel,8) for * Z), discard any at the end of the scan line that have no data * at all (via [bitmap-]scanline-pad), and just print the rest as * HEXSTRING{1,2,4} leaving the user to sort out the * bit-endianness and potential pixel divisions within units. * (Incidentally, I think we want HEXSTRING1 with colons between * bytes as opposed to the current unseparated HEXSTRING, and in * fact I think all existing HEXSTRINGs should be changed to that * format.)under -e (e.g. filter on particular resource ids? Though that * doesn't sound _obviously_ useful...struct set { tree234 *strings; /* sorted list of dynamically allocated "char *"s */ int include; /* whether the tree is things to include or exclude */ } requests_to_log, events_to_log; int stringcmp(void *av, void *bv) { const char *a = (const char *)av; const char *b = (const char *)bv; return strcmp(a, b); } int in_set(struct set *s, const char *string) { int found = (find234(s->strings, (void *)string, NULL) != NULL); if (s->include) return found; else return !found; } int printed; /* do we print this request at all? */struct request *req, const char *buf, int known) { if (!in_set(&requests_to_log, known ? buf : "UnknownRequest")) req->printed = FALSE;assert(currreq->printed);if (req->printed) { xlog_new_line(); if (req->replies) { fprintf(xlogfp, "%s", req->text); currreq = req; } else { fprintf(xlogfp, "%s\n", req->text); } fflush(xlogfp); }!req->printed) return; if (req != NULL && currreq == req) { fprintf(xlogfp, " = "); } else { xlog_new_line(); currreq = req; } void xlog_response_done(struct request *req, const char *text) { if (!req || req->printed) { fprintf(xlogfp, "%s\n", text); fflush(xlogfp); } currreq = NULL, int *filterif (filter) *filter = in_set(&events_to_log, name); xlog_printf(xl, "%s", name); } else { int i; if (filter) *filter = in_set(&events_to_log, "UnknownEvent") req->printed = TRUEreq, "CreateWindow", TRUEreq, "ChangeWindowAttributes", TRUEreq, "GetWindowAttributes", TRUE4: xlog_request_name(xl, req, "DestroyWindow", TRUEreq, "DestroySubwindows", TRUE); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 6: xlog_request_name(xl, req, "ChangeSaveSet", TRUEreq, "ReparentWindow", TRUEparent", WINDOWbreak; case 8: xlog_request_name(xl, req, "MapWindow", TRUEreq, "MapSubwindows", TRUEreq, "UnmapWindow", TRUE); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 11: xlog_request_name(xl, req, "UnmapSubwindows", TRUE); xlog_param(xl, "window", WINDOW, FETCH32(data, 4)); break; case 12: xlog_request_name(xl, req, "ConfigureWindow", TRUEreq, "CirculateWindow", TRUEreq, "GetGeometry", TRUEreq, "QueryTree", TRUE16: xlog_request_name(xl, req, "InternAtom", TRUEreq, "GetAtomName", TRUE); xlog_param(xl, "atom", ATOM, FETCH32(data, 4)); req->replies = 1; break; case 18: xlog_request_name(xl, req, "ChangeProperty", TRUEreq, "DeleteProperty", TRUEproperty", ATOM, FETCH32(data, 8)); break; case 20: xlog_request_name(xl, req, "GetProperty", TRUEreq, "ListProperties", TRUE22: xlog_request_name(xl, req, "SetSelectionOwner", TRUEreq, "GetSelectionOwner", TRUEreq, "ConvertSelection", TRUEreq, "SendEvent", TRUE); xlog_param(xl, "destination, NULL); break; case 26: xlog_request_name(xl, req, "GrabPointer", TRUEreq->replies = 1; break; case 27: xlog_request_name(xl, req, "UngrabPointer", TRUEreq, "GrabButton", TRUEreq, "UngrabButton", TRUEreq, "ChangeActivePointerGrab", TRUEreq, "GrabKeyboard", TRUEreq, "UngrabKeyboard", TRUE33: xlog_request_name(xl, req, "GrabKey", TRUEreq, "UngrabKey", TRUEreq, "AllowEvents", TRUEreq, "GrabServer", TRUE); /* no arguments */ break; case 37: xlog_request_name(xl, req, "UngrabServer", TRUE); /* no arguments */ break; case 38: xlog_request_name(xl, req, "QueryPointer", TRUE39: xlog_request_name(xl, req, "GetMotionEvents", TRUEreq, "TranslateCoordinates", TRUEreq, "WarpPointer", TRUEreq, "SetInputFocus", TRUEreq, "GetInputFocus", TRUE); req->replies = 1; break; case 44: xlog_request_name(xl, req, "QueryKeymap", TRUE); req->replies = 1; break; case 45: xlog_request_name(xl, req, "OpenFont", TRUEreq, "CloseFont", TRUE); xlog_param(xl, "font", FONT, FETCH32(data, 4)); break; case 47: xlog_request_name(xl, req, "QueryFont", TRUEreq, "QueryTextExtents", TRUEreq, "ListFonts", TRUEreq, "ListFontsWithInfo", TRUE2; /* this request expects multiple replies */ break; case 51: xlog_request_name(xl, req, "SetFontPath", TRUEreq, "GetFontPath", TRUE); req->replies = 1; break; case 53: xlog_request_name(xl, req, "CreatePixmap", TRUEreq, "FreePixmap", TRUEreq, "CreateGC", TRUEreq, "ChangeGC", TRUEreq, "CopyGC", TRUEreq, "SetDashes", TRUEreq, "SetClipRectangles", TRUEreq, "FreeGC", TRUE); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 4)); break; case 61: xlog_request_name(xl, req, "ClearArea", TRUEreq, "CopyArea", TRUEreq, "CopyPlane", TRUEreq, "PolyPoint", TRUE5: xlog_request_name(xl, req, "PolyLine", TRUEreq, "PolySegment", TRUEreq, "PolyRectangle", TRUE i++; } } break; case 68: xlog_request_name(xl, req, "PolyArc", TRUE{ int pos = 1269: xlog_request_name(xl, req, "FillPoly", TRUEreq, "PolyFillRectangle", TRUE i++; } } break; case 71: xlog_request_name(xl, req, "PolyFillArc", TRUE{ int pos = 12req, "PutImage", TRUEdepth", DECU, FETCH8(data, 21req, "GetImage", TRUEreq, "PolyText8", TRUEreq, "PolyText16", TRUEreq, "ImageText8", TRUEreq, "ImageText16", TRUEreq, "CreateColormap", TRUEreq, "FreeColormap", TRUE0: xlog_request_name(xl, req, "CopyColormapAndFree", TRUEreq, "InstallColormap", TRUE2: xlog_request_name(xl, req, "UninstallColormap", TRUEreq, "ListInstalledColormaps", TRUEreq, "AllocColor", TRUEreq, "AllocNamedColor", TRUE86: xlog_request_name(xl, req, "AllocColorCells", TRUEreq, "AllocColorPlanes", TRUEreq, "FreeColors", TRUEreq, "StoreColors", TRUEreq, "StoreNamedColor", TRUEreq, "QueryColors", TRUE8req, "LookupColor", TRUEreq, "CreateCursor", TRUEreq, "CreateGlyphCursor", TRUEreq, "FreeCursor", TRUE); xlog_param(xl, "cursor", CURSOR, FETCH32(data, 4)); break; case 96: xlog_request_name(xl, req, "RecolorCursor", TRUEreq, "QueryBestSize", TRUEreq, "QueryExtension", TRUEreq, "ListExtensions", TRUE); req->replies = 1; break; case 100: xlog_request_name(xl, req, "ChangeKeyboardMapping", TRUEreq, "GetKeyboardMapping", TRUEreq, "ChangeKeyboardControl", TRUEreq, "GetKeyboardControl", TRUE); req->replies = 1; break; case 104: xlog_request_name(xl, req, "Bell", TRUEreq, "ChangePointerControl", TRUEreq, "GetPointerControl", TRUEreq, "SetScreenSaver", TRUEreq, "GetScreenSaver", TRUEreq, "ChangeHosts", TRUEreq, "ListHosts", TRUE); req->replies = 1; break; case 111: xlog_request_name(xl, req, "SetAccessControl", TRUEreq, "SetCloseDownMode", TRUEreq, "KillClient", TRUEreq, "RotateProperties", TRUEreq, "ForceScreenSaver", TRUEReset", 0, "Activate", 1, (char *)NULL); break; case 116: xlog_request_name(xl, req, "SetPointerMapping", TRUEreq, "GetPointerMapping", TRUE); req->replies = 1; break; case 118: xlog_request_name(xl, req, "SetModifierMapping", TRUEreq, "GetModifierMapping", TRUE); req->replies = 1; break; case 127: xlog_request_name(xl, req, "NoOperation", TRUE); break; case EXT_BIGREQUESTS | 0: xlog_request_name(xl, req, "BigReqEnable", TRUEreq, "ShmQueryVersion", TRUE); req->replies = 1; break; case EXT_MITSHM | 1: xlog_request_name(xl, req, "ShmAttach", TRUEreq, "ShmDetach", TRUEreq, "ShmPutImage", TRUEreq, "ShmGetImage", TRUEreq, "ShmCreatePixmap", TRUEreq, buf, FALSEreq, buf, FALSE�SZUc�C`�os~�N��FN�'�U9r�<h�*�l/�;� J2(data, 8)); xlog_param(xl, "class", ENUM | SPECVAL, FETCH16(data, 12), "InputOutput", 1, "InputOnly", 2, (char *)NULL); xlog_param(xl, "bit-gravity", ENUM | SPECVAL, FETCH8(data, 14), "Forget", 0, "NorthWest", 1, "North", 2, "NorthEast", 3, "West", 4, "Center", 5, "East", 6, "SouthWest", 7, "South", 8, "SouthEast", 9, "Static", 10, (char *)NULL); xlog_param(xl, "win-gravity", ENUM | SPECVAL, FETCH8(data, 15), "Unmap", 0, "NorthWest", 1, "North", 2, "NorthEast", 3, "West", 4, "Center", 5, "East", 6, "SouthWest", 7, "South", 8, "SouthEast", 9, "Static", 10, (char *)NULL); xlog_param(xl, "backing-store", ENUM | SPECVAL, FETCH8(data, 1), "NotUseful", 0, "WhenMapped", 1, "Always", 2, (char *)NULL); xlog_param(xl, "backing-planes", HEX32, FETCH32(data, 16)); xlog_param(xl, "backing-pixel", HEX32, FETCH32(data, 20)); xlog_param(xl, "save-under", BOOLEAN, FETCH8(data, 24)); xlog_param(xl, "colormap", COLORMAP, FETCH32(data, 28)); xlog_param(xl, "map-is-installed", BOOLEAN, FETCH8(data, 25)); xlog_param(xl, "map-state", ENUM | SPECVAL, FETCH8(data, 26), "Unmapped", 0, "Unviewable", 1, "Viewable", 2, (char *)NULL); xlog_param(xl, "all-event-masks", EVENTMASK, FETCH32(data, 32)); xlog_param(xl, "your-event-mask", EVENTMASK, FETCH32(data, 36)); xlog_param(xl, "do-not-propagate-mask", EVENTMASK, FETCH16(data, 40)); xlog_param(xl, "override-redirect", BOOLEAN, FETCH8(data, 27)); break; case 14: /* GetGeometry */ xlog_param(xl, "root", WINDOW, FETCH32(data, 8));x", DEC16, FETCH16(data, 12)); xlog_param(xl, "y", DEC16, FETCH16(data, 14)); xlog_param(xl, "width", DECU, FETCH16(data, 16)); xlog_param(xl, "height", DECU, FETCH16(data, 18)); xlog_param(xl, "border-width", DECU, FETCH16(data, 20)); break; case 15: /* QueryTree */ xlog_param(xl, "root", WINDOW, FETCH32(data, 8)); xlog_param(xl, "parent", WINDOW | SPECVAL, FETCH32(data, 12), "None", 0, (char *)NULL); { int pos = 32; int i = 0; int n = FETCH16(data, 16); char buf[64]; for (i = 0; i < n; i++) { sprintf(buf, "children[%d]", i); xlog_param(xl, buf, WINDOW16: /* InternAtom */ xlog_param(xl, "atom", ATOM | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); /* FIXME: here we ought to add to our own list of atom ids, having * recorded enough machine-readable data in req to do so */ break; case 17: /* GetAtomName */ xlog_param(xl, "name", STRING, FETCH16(data, 8), STRING(data, 32, FETCH16(data, 8))); /* FIXME: here we ought to add to our own list of atom ids, having * recorded enough machine-readable data in req to do so */ break; case 20: /* GetProperty */ xlog_param(xl, "type", ATOM | SPECVAL, FETCH32(data, 8), "None", 0, (char *)NULL); if (FETCH32(data, 8) != 0) { xlog_param(xl, "format", DECU, FETCH8(data, 1)); xlog_param(xl, "bytes-after", DECU, FEreq, req, int filter, &filter); if (filter) { xlog_new_line(); fprintf(xlogfp, "--- %s\n", xl->textbuf); fflush(xlogfp); }/* * Variant form of strcmp, in which the first argument is * NUL-terminated as usual but the second argument has an explicitly * specified length. */ static int strzlencmp(const char *az, const char *bl, int blen) { while (*az && blen>0) { if (*az != *bl) return *az < *bl ? -1 : +1; az++, bl++, blen--; } if (!*az && blen==0) return 0; return *az ? +1 : -1requests_to_log.include = FALSE; requests_to_log.strings = newtree234(stringcmp); events_to_log.include = FALSE; events_to_log.strings = newtree234(stringcmp)case 'e return 1; } } break; case 'e': { char *p; struct set *set; /* * Mimic the strace -e format: a list of * comma-separated strings, optionally * preceded by ! to indicate that those * are things _not_ to print, optionally * preceded further by a string followed * by '=' indicating that we're setting * something other than the default set * of requests to be logged. * * (Currently the only configurable set * _is_ that of requests to be logged, * but I put the machinery in place now * for there to be others since I * anticipate that there might very well * be.) */ p = strchr(val, '='); if (p) { if (!strzlencmp("requests", val, p-val) || !strzlencmp("request", val, p-val) || !strzlencmp("reqs", val, p-val) || !strzlencmp("req", val, p-val)) set = &requests_to_log; else if (!strzlencmp("events", val, p-val) || !strzlencmp("event", val, p-val)) set = &events_to_log; else { fprintf(stderr, "xtrace: unknown keyword" " for '-e': '%.*s'\n", p-val, val); return 1; } p++; /* skip '=' */ } else { /* In the absence of a foo= prefix, default * is to configure the set of X requests which * are printed or not printed. */ set = &requests_to_log; p = val; } if (*p == '!') { set->include = FALSE; p++; } else { set->include = TRUE; } /* Empty the previous contents of the set if any */ while (1) { char *q = delpos234(set->strings, 0); if (!q) break; sfree(q); } while (p && *p) { char *q = strchr(p, ','); if (q) *q++ = '\0'; if (!strcmp(p, "none")) { /* just a placeholder */ } else if (!strcmp(p, "all")) { /* * Special case: everything is * included in this set, so we * have to flip the 'include' * parameter and empty the tree. */ while (1) { char *r = delpos234(set->strings, 0); if (!r) break; sfree(r); } set->include = !set->include; /* And nothing else will change this. */ break; } else { /* Just add to the set normally */ add234(set->strings, dupstr(p)); } p = q Revision-number: 8536 Prop-content-length: 191 Content-length: 191 K 8 svn:date V 27 2009-04-29T18:29:02.450103Z K 7 svn:log V 91 Log the server init message. It's long and unwieldy, but contains occasionally vital data. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3fe6f8241edea26e414345499b7b8ae9 Text-delta-base-sha1: 5d06d81717da4505dc9169a9a778c36088aa8584 Text-content-length: 4849 Text-content-md5: 9553ea5641fbd4c70fa48ec6d568baa0 Text-content-sha1: f90e82437a1dbc6ac0d8ca8bc209e228b15639f2 Content-length: 4849 SVN���� ���k2(data, 8)); xlog_param(xl, "class", ENUM | SPECVAL, FETCH16(data, 12), "InputOutput", 1, "InputOnly", 2, (char *)NULL); xlog_param(xl, "bit-gravity", ENUM | SPECVAL, FETCH8(data, 14), "Forget", 0, "NorthWest", 1, "North", 2, "N�Z|;�W;�jpLog it. */ { /* variables on which the FETCH macros depend */ const unsigned char *data = xl->s2cbuf; int len = xl->s2clen; xl->textbuflen = 0; xlog_printf(xl, "--- server init message: "); xl->reqlogstate = 3; xlog_param(xl, "protocol-major-version", DECU, FETCH16(data, 2)); xlog_param(xl, "protocol-major-version", DECU, FETCH16(data, 4)); xlog_param(xl, "release-number", DECU, FETCH32(data, 8)); xlog_param(xl, "resource-id-base", HEX32, FETCH32(data, 12)); xlog_param(xl, "resource-id-mask", HEX32, FETCH32(data, 16)); xlog_param(xl, "motion-buffer-size", DECU, FETCH32(data, 20)); xlog_param(xl, "maximum-request-length", DECU, FETCH16(data, 26)); xlog_param(xl, "image-byte-order", ENUM | SPECVAL, FETCH8(data, 30), "LSBFirst", 0, "MSBFirst", 1, (char *)NULL); xlog_param(xl, "bitmap-format-bit-order", ENUM | SPECVAL, FETCH8(data, 31), "LeastSignificant", 0, "MostSignificant", 1, (char *)NULL); xlog_param(xl, "bitmap-format-scanline-unit", DECU, FETCH8(data, 32)); xlog_param(xl, "bitmap-format-scanline-pad", DECU, FETCH8(data, 33)); xlog_param(xl, "min-keycode", DECU, FETCH8(data, 34)); xlog_param(xl, "max-keycode", DECU, FETCH8(data, 35)); xlog_param(xl, "vendor", STRING, FETCH16(data, 24), STRING(data, 40, FETCH16(data, 24))); { int i, n; int pos = 40 + FETCH16(data, 24); pos = (pos + 3) &~ 3; n = FETCH8(data, 29); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "pixmap-formats[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "depth", DECU, FETCH8(data, pos)); xlog_param(xl, "bits-per-pixel", DECU, FETCH8(data, pos+1)); xlog_param(xl, "scanline-pad", DECU, FETCH8(data, pos+2)); xlog_set_end(xl); pos += 8; if (xlog_check_list_length(xl)) break; } n = FETCH8(data, 28); for (i = 0; i < n; i++) { char buf[64]; int j, m; sprintf(buf, "roots[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "root", WINDOW, FETCH32(data, pos)); xlog_param(xl, "default-colormap", COLORMAP, FETCH32(data, pos+4)); xlog_param(xl, "white-pixel", HEX32, FETCH32(data, pos+8)); xlog_param(xl, "black-pixel", HEX32, FETCH32(data, pos+12)); xlog_param(xl, "current-input-masks", EVENTMASK, FETCH32(data, pos+16)); xlog_param(xl, "width-in-pixels", DECU, FETCH16(data, pos+20)); xlog_param(xl, "height-in-pixels", DECU, FETCH16(data, pos+22)); xlog_param(xl, "width-in-mm", DECU, FETCH16(data, pos+24)); xlog_param(xl, "height-in-mm", DECU, FETCH16(data, pos+26)); xlog_param(xl, "min-installed-maps", DECU, FETCH16(data, pos+28)); xlog_param(xl, "max-installed-maps", DECU, FETCH16(data, pos+30)); xlog_param(xl, "root-visual", VISUALID, FETCH32(data, pos+32)); xlog_param(xl, "backing-stores", ENUM | SPECVAL, FETCH8(data, pos+36), "Never", 0, "WhenMapped", 1, "Always", 2, (char *)NULL); xlog_param(xl, "save-unders", BOOLEAN, FETCH8(data, pos+37)); xlog_param(xl, "root-depth", DECU, FETCH8(data, pos+38)); m = FETCH8(data, pos+39); pos += 40; for (j = 0; j < m; j++) { char buf[64]; int k, l; sprintf(buf, "allowed-depths[%d]", j); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "depth", DECU, FETCH8(data, pos)); l = FETCH16(data, pos+2); pos += 8; for (k = 0; k < l; k++) { char buf[64]; sprintf(buf, "visuals[%d]", k); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "visual-id", VISUALID, FETCH32(data, pos)); xlog_param(xl, "class", ENUM | SPECVAL, FETCH8(data, pos + 4), "StaticGray", 0, "GrayScale", 1, "StaticColor", 2, "PseudoColor", 3, "TrueColor", 4, "DirectColor", 5, (char *)NULL); xlog_param(xl, "bits-per-rgb-value", DECU, FETCH8(data, pos + 5)); xlog_param(xl, "colormap-entries", DECU, FETCH16(data, pos + 6)); xlog_param(xl, "red-mask", HEX32, FETCH32(data, pos + 8)); xlog_param(xl, "green-mask", HEX32, FETCH32(data, pos + 12)); xlog_param(xl, "blue-mask", HEX32, FETCH32(data, pos + 16)); xlog_set_end(xl); pos += 24; } xlog_set_end(xl); } xlog_set_end(xl); pos += 8; if (xlog_check_list_length(xl)) break; } } fprintf(xlogfp, "%s\n", xl->textbuf); } Revision-number: 8537 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2009-04-29T18:39:11.930440Z K 7 svn:log V 51 Fix persistent misuse of xlog_check_list_length(). K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9553ea5641fbd4c70fa48ec6d568baa0 Text-delta-base-sha1: f90e82437a1dbc6ac0d8ca8bc209e228b15639f2 Text-content-length: 1999 Text-content-md5: f19b01604ac746afcaed8e9ce3d1c447 Text-content-sha1: 21883e11890532487426e17338baa3d67dd7e1f9 Content-length: 1999 SVN����=Z���^�gq�X�S[� .�:�[:� i+1 < 32 && i+1 < n && i+1 < n && keycode_count > 0 && i+1 < n && i+1 < n && mod+1 < 8 && �|*t�fn�}3�E0�u�j�#ps�V�8k�O#�(r�2�5LD�8X�7��G�G�hb�;J�c�H8�0�8�#RQ�M�-�)7F�O-SPECVAL, FETCH8(data, 14), "Forgeti+1 < n && i+1 < n && i+1 < n && i+1 < n && int printing; char buf[64]; n = FETCH16(data, 46); printing = TRUE; for (i = 0; i < n; i++) { if (printing) { sprintf(buf, "properties[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_fontprop(xl, data, len, pos); xlog_set_end(xl); } pos += 8; if (printing && i+1 < n && xlog_check_list_length(xl)) printing = FALSEi+1 < n && i+1 < n && i+1 < n && i+1 < n && i+1 < n && int printing; n = FETCH16(data, 8); printing = TRUE; for (i = 0; i < n; i++) { if (printing) { char buf[64]; sprintf(buf, "pixels[%d]", i); xlog_param(xl, buf, HEX32, FETCH32(data, pos)); } pos += 4; if (printing && i+1 < n && xlog_check_list_length(xl)) printing = FALSEi+1 < n && i+1 < n && i+1 < n && i+1 < n && keycode_count > 0 && i+1 < n && i+1 < n && i+1 < n && mod+1 < 8 && int printing; pos = (pos + 3) &~ 3; n = FETCH8(data, 29); printing = TRUE; for (i = 0; i < n; i++) { if (printing) { char buf[64]; sprintf(buf, "pixmap-formats[%d]", i FETCH8(data, pos)); xlog_param(xl, "bits-per-pixel", DECU, FETCH8(data, pos+1)); xlog_param(xl, "scanline-pad", DECU, FETCH8(data, pos+2)); xlog_set_end(xl); } pos += 8; if (printing && i+1 < n && xlog_check_list_length(xl)) printing = FALSE if (k+1 < l && xlog_check_list_length(xl)) break; } xlog_set_end(xl); if (j+1 < m && xlog_check_list_length(xl)) break; } xlog_set_end(xl); if (i+1 < n && Revision-number: 8538 Prop-content-length: 242 Content-length: 242 K 8 svn:date V 27 2009-04-29T19:25:56.515637Z K 7 svn:log V 141 Changed my mind. The server init message is long and unwieldy. Don't log it unless the user specifically asks for it with the new -I option. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f19b01604ac746afcaed8e9ce3d1c447 Text-delta-base-sha1: 21883e11890532487426e17338baa3d67dd7e1f9 Text-content-length: 240 Text-content-md5: a3ef85b8044e863eab86425307aa409b Text-content-sha1: 2d97650f42c0494e7e90b50cf1407e4876f50aaa Content-length: 240 SVN���� ���Xint print_server_startup = FALSE� �a��lv�)_g_param(xl, "bit-gravity", ENUM | Optionally log it. */ if (print_server_startup) case 'I': print_server_startup = TRUE; break; Revision-number: 8539 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2009-04-29T20:21:05.269560Z K 7 svn:log V 52 Log image data in GetImage and PutImage. (I think.) K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a3ef85b8044e863eab86425307aa409b Text-delta-base-sha1: 2d97650f42c0494e7e90b50cf1407e4876f50aaa Text-content-length: 7900 Text-content-md5: d293e4cde1aa881ac102ae82346b1ee7 Text-content-sha1: 2192c57b934b17d9806904684f2526467fff7a1f Content-length: 7900 SVN����D ���As �K,R�%p�+ �*4�\X�R#�+&�Xu�X}k�k�*X�2P�?J�Xu�X}V�q�Xu�X}�, �j6f��er�bf�fHUnusual 24-bit data marshalling macros, used for 24-bit bitmaps. */ #define GET_24BIT_LSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[0]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8) | \ ((unsigned long)(unsigned char)(cp)[2] << 16)) #define GET_24BIT_MSB_FIRST(cp) \ (((unsigned long)(unsigned char)(cp)[2]) | \ ((unsigned long)(unsigned char)(cp)[1] << 8) | \ ((unsigned long)(unsigned char)(cp)[0] << 16)) /* * Translate a bits-per-image-element count into an appropriate * HEXSTRING* display data type. */ #define STRING_TYPE(byteorder, bits) ( \ (bits) == 32 ? (byteorder ? HEXSTRING4B : HEXSTRING4L) : \ (bits) == 24 ? (byteorder ? HEXSTRING3B : HEXSTRING3L) : \ (bits) == 16 ? (byteorder ? HEXSTRING2B : HEXSTRING2L) : \ HEXSTRING1)/* * Machine-readable representation of the pixmap parameters in a * GetImage, so we can log the image data correctly when it * comes back. */ int pixmapformat, pixmapwidth, pixmapheightpixmapformat { int depth, bits_per_pixel, scanline_pad; } int bitmap_scanline_unit, bitmap_scanline_pad, image_byte_order; struct pixmapformat *pixmapformats; int npixmapformatsxl->pixmapformats = NULLpixmapformats1, HEXSTRING2, HEXSTRING2L, HEXSTRING2B, HEXSTRING3, HEXSTRING3B, HEXSTRING3L, HEXSTRING4, HEXSTRING4B, HEXSTRING4L1:3*ival-1 > sizelimit) { int limitlen = (sizelimit - xl->textbuflen + 1) / 3; if (limitlen < 8) limitlen = 8sep = ""; while (ival-- > 0) { unsigned val = *sval; xlog_printf(xl, "%s%02X", sep, val); sval++2: case HEXSTRING2B: case HEXSTRING2L: if (type == HEXSTRING2) type = (xl->endianness == 'l' ? HEXSTRING2L : HEXSTRING2B); (sizelimit - xl->textbuflen + 1) / 5; if (type == HEXSTRING2L) val = GET_16BIT_LSB_FIRST(sval); else 3: case HEXSTRING3B: case HEXSTRING3L: if (type == HEXSTRING3) type = (xl->endianness == 'l' ? HEXSTRING3L : HEXSTRING3B); 7*ival-1 > sizelimit) { int limitlen = (sizelimit - xl->textbuflen + 1) / 7; if (limitlen < 2) limitlen = 2sep = ""; while (ival-- > 0) { unsigned val; if (type == HEXSTRING3L) val = GET_24BIT_LSB_FIRST(sval); else val = GET_24BIT_MSB_FIRST(sval); xlog_printf(xl, "%s%06X", sep, val); sval += 3case HEXSTRING4B: case HEXSTRING4L: if (type == HEXSTRING4) type = (xl->endianness == 'l' ? HEXSTRING4L : HEXSTRING4B); 9*ival-1 > sizelimit) { int limitlen = (sizelimit - xl->textbuflen + 1) / 9; if (limitlen < 2) limitlen = 2sep = ""; while (ival-- > 0) { unsigned val; if (type == HEXSTRING4L) val = GET_32BIT_LSB_FIRST(sval); else val = GET_32BIT_MSB_FIRST1image_data(struct xlog *xl, const char *paramname, const unsigned char *data, int len, int startoffset, int format, int width, int height, int depth) { int bpp = -1, pad = -1, nbitmaps = 1; /* * Figure out the size and format of the image data, and * log it as a hex string. */ if (format == 2) { /* * Z pixmap. */ int i; for (i = 0; i < xl->npixmapformats; i++) { if (xl->pixmapformats[i].depth == depth) { bpp = xl->pixmapformats[i].bits_per_pixel; pad = xl->pixmapformats[i].scanline_pad; break; } } } else { bpp = xl->bitmap_scanline_unit; pad = xl->bitmap_scanline_pad; nbitmaps = depth; } if (bpp < 0) { xlog_param(xl, "<unrecognised image depth>", NOTEVENEQUALSIGN); } else { int scanlinewidth, unitsize, stringtype, nunits; scanlinewidth = width; scanlinewidth *= bpp; scanlinewidth += pad - 1; scanlinewidth &= ~(pad - 1); scanlinewidth /= 8; unitsize = (bpp + 7) / 8; stringtype = STRING_TYPE(xl->image_byte_order, bpp); nunits = (scanlinewidth / unitsize) * /* units/scanline */ height * nbitmaps; /* number of scanlines */ xlog_param(xl, "image-data", stringtype, nunits, STRING(data, startoffset, nunits * unitsize)); }xlog_image_data(xl, "image-data", data, len, 24, FETCH8(data, 1), FETCH16(data, 12) + FETCH8(data, 20), FETCH16(data, 14), FETCH8(data, 21));req->pixmapformat = FETCH8(data, 1); req->pixmapwidth = FETCH16(data, 12); req->pixmapheight = FETCH16(data, 14)1� C.}�fM�J�/�v@�1,�,]�G�rt!�=L�/^ata, 28)); req->replies = 1; break; case EXT_MITSHM | 5: xlog_request_name(xl, req, "ShmCreatePixmap", TRUE); xlog_param(xl, "pid", PIXMAP, FETCH32(data, 4)); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 8)); xlog_param(xl, "width", DECU, FETCH16(data, 12)); xlog_param(xl, "height", DECU, FETCH16(data, 14)); xlog_param(xl, "depth", DECU, FETCH8(data, 16)); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 20)); xlog_param(xl, "offset", HEX32, FETCH32(data, 24)); break; default: if (data[0] >= 128) { /* * Extension opcode. */ int opcode = data[0] - 128; char buf[64]; if (xl->extreqs[opcode]) { sprintf(buf, "%s:UnknownExtensionRequest%d", xl->extreqs[opcode], data[1]); } else { sprintf(buf, "%d:UnknownExtensionRequest%d", data[0], data[1]); } xlog_request_name(xl, req, buf, FALSE); xlog_param(xl, "bytes", DECU, len); } else { char buf[64]; sprintf(buf, "UnknownRequest%d", data[0]); xlog_request_name(xl, req, buf, FALSE); xlog_param(xl, "bytes", DECU, len); } break; } xlog_request_done(xl, req); } void xlog_do_reply if (data && !req) { xlog_new_line(); fprintf(xlogfp, "--- reply received for unknown request sequence" " number %lu\n", (unsigned long)FETCH16(data, 2)); fflush(xlogfp); return; } xl->textbuflen = 0; xl->overflow = FALSE; xlog_respond_to(req); if (req->replies == 2) req->replies = 3; /* we've now seen a reply */ xlog_reply_begin(xl); if (!data) { /* * This call is notifying us that the sequence numbering in * the server-to-client stream has now gone past the number * of this request. If it was a multi-reply request to which * we've seen at least one reply already, this is normal and * expected, so we discard the request from the queue and * continue. Otherwise, we print a notification that * something odd happened. */ if (req->replies != 3) xlog_printf(xl, "<no reply received?!>"); req->replies = 1; /* force discard */ xl->textbuflen = 0; /* inhibit printing of actual reply */ } else switch (req->opcode) { case 3: /* GetWindowAttributes */ xlog_param(xl, "visual", VISUALID, FETCH32(data, 8)); xlog_param(xl, "class", ENUM | SPECVAL, FETCH16(data, 12), "InputOutput", 1, "InputOnly", 2, (char *)NULL); xloxlog_image_data(xl, "image-data", data, len, 32, req->pixmapformat, req->pixmapwidth, req->pixmapheight, FETCH8(data, 1)); break; case 83: /* ListInstalledColormaps1scanline-unit", DECU, FETCH8(data, 32)); xlog_param(xl, "bitmap /* * Find all the pixmap format information we might need * to decode PutImage and GetImage requests during the * protocol. */ bitmap_scanline_unit = FETCH8(data, 32); xl->bitmap_scanline_pad = FETCH8(data, 33); xl->image_byte_order = FETCH8(data, 30); xl->npixmapformats = FETCH8(data, 29); xl->pixmapformats = snewn(xl->npixmapformats, struct pixmapformat); { int pos = 40 + FETCH16(data, 24); pos = (pos + 3) &~ 3; for (i = 0; i < xl->npixmapformats; i++) { xl->pixmapformats[i].depth = FETCH8(data, pos); xl->pixmapformats[i].bits_per_pixel = FETCH8(data, pos+1); xl->pixmapformats[i].scanline_pad = FETCH8(data, pos+2); pos += 8; } } Revision-number: 8540 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8541 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8542 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2009-04-30T18:02:17.286909Z K 7 svn:log V 70 Get rid of the annoying make-time error in the absence of 'manifest'. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c59dca416c78e839446ed53b84ce79f0 Text-delta-base-sha1: 193a4d613f32f17d3b7e57ffecd98f3af9602cff Text-content-length: 99 Text-content-md5: 17d2582c715cfccdafbef4dec2da1bee Text-content-sha1: 19c5745951139f1f4c4d930ea3010f8b5c8792f2 Content-length: 99 SVN��2m M�i�M�7{test -f manifest && \ md5sum -c manifest 2>/dev/null Revision-number: 8543 Prop-content-length: 218 Content-length: 218 K 7 svn:log V 117 Stop making up an X display in the absence of one specified in the environment. Also, introduce the -display option. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-30T18:06:22.097524Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d293e4cde1aa881ac102ae82346b1ee7 Text-delta-base-sha1: 2192c57b934b17d9806904684f2526467fff7a1f Text-content-length: 1156 Text-content-md5: 247df9db36aa42efb6487651b73a2040 Text-content-sha1: fd80d6432fd07e0e1ec0197cc19c8f6a835d5ae2 Content-length: 1156 SVN���� <��<�.Option to log a hex dump of the raw data in the protocol. This * sounds like a WIBNI feature, but it is before-initial-release * critical: if anyone at any point complains about anything * going subtly wrong, this feature will be 100% vital for remote * debugging. * * - Pre-publication polishing:�n!�M��9�C-n�~f�cxl, "format", ENUM | SPECVAL, FETCH8(data, 20), "Bitmap", 0, "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 24)); xlog_param(xl, "offset", HEX32, FETCH32(dchar *disp = getenv("DISPLAY"); if (!disp || !*disp) { fprintf(stderr, "xtrace: no X display specified (use -display or" " set DISPLAY\n"); exit(1); } return dupstr(disp!strcmp(p, "-display")) { char *val; if (--argc > 0) val = *++argv; else { fprintf(stderr, "xtrace: option \"%s\" expects an" " argument\n", p); return 1; } if (!strcmp(p, "-display")) { strncpy(cfg.x11_display, val, lenof(cfg.x11_display)-1); cfg.x11_display[lenof(cfg.x11_display)-1] = '\0'; } continue; } continue; Revision-number: 8544 Prop-content-length: 335 Content-length: 335 K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-30T18:18:25.325466Z K 7 svn:log V 234 Option to do a raw hex dump of everything going down the connection. Of limited use for debugging X programs, I'd imagine, but it'll be critical for debugging xtrace itself the first time a user reports a hard-to-reproduce problem... PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 247df9db36aa42efb6487651b73a2040 Text-delta-base-sha1: fd80d6432fd07e0e1ec0197cc19c8f6a835d5ae2 Text-content-length: 1490 Text-content-md5: 5878905e8ce11ee350486470d007ec99 Text-content-sha1: 70c3f9bf1d0a8c3e6c82659893c3634fd2a3b1a4 Content-length: 1490 SVN�������d8�p�{�oJint raw_hex_dumunsigned c2soff, s2coffc2soff = xl->s2coffxl, "format", ENUM | SPECVAL, FETCH8(data, 20), "Bitmap", 0, "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 24)); xlog_param(xl, "offset", HEX32, FETCH3�n-i�\Jr�#vm�RGm� �wQ�?/hexdump(FILE *fp, const void *vdata, int len, unsigned startoffset, const char *prefix) { const unsigned char *data = (const unsigned char *)vdata; unsigned lineoffset = startoffset &~ 15; char dumpbuf[128], tmpbuf[16]; int n, i; unsigned char c; for (n = -(int)(startoffset & 15); n < len; n += 16) { memset(dumpbuf, ' ', 8+2+16*3+1+16); dumpbuf[8+2+16*3+1+16] = '\n'; dumpbuf[8+2+16*3+1+16+1] = '\0'; memcpy(dumpbuf, tmpbuf, sprintf(tmpbuf, "%08X", lineoffset)); for (i = 0; i < 16; i++) { if (i + n < 0) continue; if (i + n >= len) break; c = data[i + n]; memcpy(dumpbuf+8+2+3*i, tmpbuf, sprintf(tmpbuf, "%02X", c)); dumpbuf[8+2+16*3+1+i] = (isprint(c) ? c : '.'); } dumpbuf[8+2+16*3+1+i] = '\n'; dumpbuf[8+2+16*3+1+i+1] = '\0'; fputs(prefix, fp); fputs(dumpbuf, fp); lineoffset += 16; } } void xlog_c2sraw_hex_dump) { xlog_new_line(); hexdump(xlogfp, vdata, len, xl->c2soff, ">>> "); xl->c2soff += len; }raw_hex_dump) { xlog_new_line(); hexdump(xlogfp, vdata, len, xl->s2coff, "<<< "); xl->s2coff += len; } case 'R': raw_hex_dum Revision-number: 8545 Prop-content-length: 156 Content-length: 156 K 7 svn:log V 56 Correct a couple of suboptimally worded error messages. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-04-30T18:56:28.515978Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5878905e8ce11ee350486470d007ec99 Text-delta-base-sha1: 70c3f9bf1d0a8c3e6c82659893c3634fd2a3b1a4 Text-content-length: 88 Text-content-md5: ea3ee8362e1081e507da2965823630a2 Text-content-sha1: 41b31b829b1340b2a236ae8f2344458907842720 Content-length: 88 SVN���������>(�"�� '�T<orisEXPECT_REPLY("RecordEnableContext"); Revision-number: 8546 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2009-04-30T19:07:24.726040Z K 7 svn:log V 67 Actually use the 'name' parameter in the EXPECT_REPLY macro, ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ea3ee8362e1081e507da2965823630a2 Text-delta-base-sha1: 41b31b829b1340b2a236ae8f2344458907842720 Text-content-length: 182 Text-content-md5: 4c449052b2c2238718307efc2683df1e Text-content-sha1: 09eab1c4bad505e28f5182a21d6e2d2a793ee707 Content-length: 182 SVN���������>* �m� �4 %s\n", err, name); \ else \ fprintf(stderr, "xtrace: X server returned unknown error %d to" \ " %s\n", c->xrecordbuf[1], name Revision-number: 8547 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8548 Prop-content-length: 560 Content-length: 560 K 8 svn:date V 27 2009-05-02T08:36:41.125160Z K 7 svn:log V 459 When tracing multiple connections through our proxy server, prefix the X resource base (closest thing to an official id for each X client) to each output line to indicate which protocol stream it belongs to. Also add the -C option to do this unconditionally even when we're only tracing one client. (And even in RECORD mode, in which RecordGetContext helpfully provides us a way to convert a specific resource id into the resource base of the owning client). K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4c449052b2c2238718307efc2683df1e Text-delta-base-sha1: 09eab1c4bad505e28f5182a21d6e2d2a793ee707 Text-content-length: 2617 Text-content-md5: 11b2ec749c8aa7d97f1aa204d32023d5 Text-content-sha1: 2c7dcc4846f9c0cb271cfa71004d8c59c60e6fbc Content-length: 2617 SVN����NW���jc1���A�M�O�pp}�I� m� w�{�[ * find a new name, bah, since 'xtrace' turns out to be * already taken by something that lacks half my useful * features. * * Possibly TODO: * * - Arrange to let the network abstraction keep the peer address * of incoming connections, so that we can provide * XDM-AUTHORIZATION-1 on the proxy side at user request. * * - Decode more extensions. * * - Log connection and disconnection of clients? * * - Perhaps a command-line option to request tracing of only the * first incoming connection and just proxy the rest untraced?int print_client_ids = FALSE; int num_clients_seen = 0unsigned clientidxl->clientid = 0xFFFFFFFFU; /* means 'unknown yet' */new_line(struct xlog *xl if (print_client_ids) { if (xl->clientid == 0xFFFFFFFFU) fprintf(xlogfp, "new-conn: "); else fprintf(xlogfp, "%08x: ", xl->clientid); } } void xlog_error(struct xlog *xl, const char *fmt, ...) { va_list ap; xlog_new_line(xl)xlxlog *xl, xl�*4g�0��c0�d�w2�F~�~�b �"�8a=�� �Xnr�i�>l4)); xlog_param(xl, "plane-mask", HEX32, FETCH32(data, 16)); xlog_param(xl, "format", ENUM | SPECVAL, FETCH8(data, 20), "Bitmap", 0, "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 24)); xlog_param(xl, "offset", HEX32, FETCH3xlxl, xl, xl); fprintf(xlogfp, "--- %s\n", xl->textbuf); fflush(xlogfp); } } void hexdump(struct xlog *xl, const void *vdata, int len, unsigned startoffset, const char *prefixxlog_new_line(xl); fputs(prefix, xlogfp); fputs(dumpbuf, xloghexdump(xlhexdump(xlxl->s2clen < 16) { err((xl, "server's init message was far too short\n")); } xl->clientid = READ32(xl->s2cbuf + 12); if (++num_clients_seen > 1) print_client_ids = TRUE; xlog_new_line(xl);if (print_client_ids) { /* * If we're unconditionally printing client ids, we should * call RecordGetContext to find out the official id for the * client we've just attached to. (If we identified it by an * actual resource rather than by its resource base, the * value we already know will have extra bits set.) */ buf[0] = c->xrecordopcode; buf[1] = 4;/* RecordGetContext */ PUT_16BIT_MSB_FIRST(buf+2, 2); /* request length */ PUT_32BIT_MSB_FIRST(buf+4, RCID); /* context id */ x11_send(c->xs, buf, 8);GetContext"); if (c->xrecordlen >= 36) { c->xl->clientid = GET_32BIT_MSB_FIRST(c->xrecordbuf + 32); } } case 'C': print_client_ids Revision-number: 8549 Prop-content-length: 266 Content-length: 266 K 7 svn:log V 165 Deal with the possibility that extension-derived event types we don't recognise might not contain a sequence number in the obvious place, like KeymapNotify doesn't. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-05-02T08:41:29.693093Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 11b2ec749c8aa7d97f1aa204d32023d5 Text-delta-base-sha1: 2c7dcc4846f9c0cb271cfa71004d8c59c60e6fbc Text-content-length: 670 Text-content-md5: 64e703d020ef5ec5e468e6a35b567ee8 Text-content-sha1: 58c2d0b90ff42ca24be1182ce2924929f478714b Content-length: 670 SVN����L���7I�gL FETCH8(data, 20), "Bitmap", 0, "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 24)); xlog_param(xl, "offset", HEX32, FETCH32(data, 28)); req->replies = 1; break; case EXT_MITSHM | 5: xlog_request_name(xl, req, "ShmCreatePixmap", TRUE); xlog_param(xl, "pid", PIXMAP, FETCH3�4<�"3�0_known_ exception to this is the KeymapNotify * event, but we also treat extension events we don't * recognise as potential exceptions. */ if ((xl->s2cbuf[0] & 0x7f) != 11 && (xl->extidevents[xl->s2cbuf[0] & 0x7f] || xlog_translate_event(xl->s2cbuf[0] & 0x7f)) Revision-number: 8550 Prop-content-length: 604 Content-length: 604 K 8 svn:date V 27 2009-05-02T13:23:19.409555Z K 7 svn:log V 503 --help, --version, --licence. The xtrace licence file is not quite the same as the parent PuTTY one: several PuTTY copyright holders whose work was entirely outside the pieces reused in xtrace have been removed, and the X Consortium has been added (along with its no-advertising clause, annoyingly) on the grounds that it seems likely to me that the innards of the protocol decoding functions constitute a substantial derived work of the X protocol specification documents from which I translated them. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/LICENCE.xtrace Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1481 Text-content-md5: 30280415902461552faa60a7d803eb17 Text-content-sha1: 5b115b4cbf63a9ccb735becedb4551098156d3c0 Content-length: 1491 PROPS-END SVN���;;;xtrace is copyright 1997-2009 Simon Tatham. Portions copyright Robert de Bath, Andreas Schultz, Jeroen Massar, Nicolas Barry, Justin Bradford, Ben Harris, Malcolm Smith, Ahmad Khalifa, Colin Watson, and the X Consortium. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 64e703d020ef5ec5e468e6a35b567ee8 Text-delta-base-sha1: 58c2d0b90ff42ca24be1182ce2924929f478714b Text-content-length: 3905 Text-content-md5: d3ecbc135307e56582d9275379278cda Text-content-sha1: 8d2d1f467b213259b7653cc55a3a965838f85a7b Content-length: 3905 SVN����Z�:��pB�|�2(data, 4)); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 8depth", DECU, FETCH8(data, 16)); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 20)); xlog_param(xl, "offset", HEX32, FETCH32(data, 24)); break; �<�)VH�G{8�t+�"const char usagemsg[] = " usage: xtrace [options] command [command arguments] trace a new program\n" " or: xtrace [options] -p <resource id> trace an X client by resource id\n" " or: xtrace [options] -p - trace an X client selected interactively\n" "options: -s <length> set approximate limit on line length\n" " -o <file> send log output to a file (default=stderr)\n" " -e <class>=[!]<item>[,<item>...] filter the packets output, where:\n" " <class> is 'requests' or 'events'\n" " <item> is a request or event name, or 'all' or 'none'\n" " -I log X server initialisation message\n" " -R also give raw hex dump of session traffic\n" " -C unconditionally prefix client id to every line\n" " -display <display> specify X display (overrides $DISPLAY)\n" " also: xtrace --version report version number\n" " xtrace --help display this help text\n" " xtrace --licence display the (MIT) licence text\n" ; void usage(FILE *fp) { fputs(usagemsg, fp); } const char licencemsg[] = "xtrace is copyright 1997-2009 Simon Tatham.\n" "\n" "Portions copyright Robert de Bath, Andreas Schultz, Jeroen Massar,\n" "Nicolas Barry, Justin Bradford, Ben Harris, Malcolm Smith, Ahmad\n" "Khalifa, Colin Watson, and the X Consortium.\n" "\n" "Permission is hereby granted, free of charge, to any person\n" "obtaining a copy of this software and associated documentation files\n" "(the \"Software\"), to deal in the Software without restriction,\n" "including without limitation the rights to use, copy, modify, merge,\n" "publish, distribute, sublicense, and/or sell copies of the Software,\n" "and to permit persons to whom the Software is furnished to do so,\n" "subject to the following conditions:\n" "\n" "The above copyright notice and this permission notice shall be\n" "included in all copies or substantial portions of the Software.\n" "\n" "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n" "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n" "MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n" "NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE\n" "FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n" "CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n" "WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n" "\n" "Except as contained in this notice, the name of the X Consortium\n" "shall not be used in advertising or otherwise to promote the sale,\n" "use or other dealings in this Software without prior written\n" "authorization from the X Consortium.\n" ; void licence(void) { fputs(licencemsg, stdout); } void version(void) { #define SVN_REV "$Revision$" char rev[sizeof(SVN_REV)]; char *p, *q; strcpy(rev, SVN_REV); for (p = rev; *p && *p != ':'; p++); if (*p) { p++; while (*p && isspace(*p)) p++; for (q = p; *q && *q != '$'; q++); if (*q) *q = '\0'; printf("xtrace revision %s\n", p); } else { printf("xtrace: unknown version\n"); }-help") || !strcmp(p, "-help")) { usage(stdout); return 0; } if (!strcmp(p, "--version") || !strcmp(p, "-version")) { version(); return 0; } if (!strcmp(p, "--licence") || !strcmp(p, "-licence") || !strcmp(p, "--license") || !strcmp(p, "-license")) { licence(); return 0; }, or -p\n"); usage(stderr Revision-number: 8551 Prop-content-length: 165 Content-length: 165 K 8 svn:date V 27 2009-05-02T16:18:19.644216Z K 7 svn:log V 65 Shuffle a couple of printf arguments into the right order, oops. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d3ecbc135307e56582d9275379278cda Text-delta-base-sha1: 8d2d1f467b213259b7653cc55a3a965838f85a7b Text-content-length: 90 Text-content-md5: c4b99a726c09e4a2477f8d93b272c1d3 Text-content-sha1: 18c79e4c8b68aba94b1b91c2cce5516052b64d18 Content-length: 90 SVN��������� 0�w��q'min(xl->s2clen-8, xl->s2cbuf[1]), xl->s2cbuf + 8 Revision-number: 8552 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2009-05-02T16:55:24.610728Z K 7 svn:log V 69 Unbreak the matching of requests to replies, which I broke in r8549. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c4b99a726c09e4a2477f8d93b272c1d3 Text-delta-base-sha1: 18c79e4c8b68aba94b1b91c2cce5516052b64d18 Text-content-length: 65 Text-content-md5: 27ace1c865969ac8e332d768f93762bf Text-content-sha1: 9bf27f818e3220df5784b06c90380ef761f3bf12 Content-length: 65 SVN���������3 � ��s2cbuf[0] < 2 || Revision-number: 8553 Prop-content-length: 166 Content-length: 166 K 7 svn:log V 66 Thinko in the online help: the "class=" prefix on -e is optional. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-05-02T17:15:34.144733Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 27ace1c865969ac8e332d768f93762bf Text-delta-base-sha1: 9bf27f818e3220df5784b06c90380ef761f3bf12 Text-content-length: 51 Text-content-md5: e69639d25028556efba63343ca2a9711 Text-content-sha1: 95d998d2aa10f6d75915b213c47c3725bc3edf9b Content-length: 51 SVN���������35 ���,[<class>=] Revision-number: 8554 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2009-05-02T18:43:04.154087Z K 7 svn:log V 29 Initial man page for xtrace. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/doc/Makefile Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 578c768b84cc0e67925bcf8cc47923bc Text-delta-base-sha1: 6dce6506c89018b9ac84d4e7a604182e2cd0d072 Text-content-length: 58 Text-content-md5: dba54726c8117c27568c447cf5000d2c Text-content-sha1: 97d305bbda83df864e075d042d6205bbd7a1b621 Content-length: 58 SVN��'�+�Cx�!all: manxtracextrace.1: xtrace Node-path: putty-spinoffs/doc/xtrace.1 Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 8037 Text-content-md5: 9a06dfddd5b0700c0e550c2acfcc36a0 Text-content-sha1: 4f5491dbc0420bf311ff40e89dd007bd65a31199 Content-length: 8047 PROPS-END SVN���WWW.TH "xtrace" "1" "2009\(hy05\(hy02" "PuTTY\ spinoffs" "PuTTY\ spinoffs" .SH "NAME" .PP \fBxtrace\fP - trace X protocol exchanges, in the manner of \fBstrace\fP .SH "SYNOPSIS" .PP .nf \fBxtrace\fP\ [\ \fIoptions\fP\ ]\ \fIcommand\fP\ [\ \fIcommand-arguments\fP\ ] \fBxtrace\fP\ [\ \fIoptions\fP\ ]\ \fB-p\fP\ \fIX-resource-ID\fP \fBxtrace\fP\ [\ \fIoptions\fP\ ]\ \fB-p\fP\ \fB-\fP .fi .SH "DESCRIPTION" .PP \fBxtrace\fP is a utility which logs everything that passes between the X server and one or more X client programs. In this it is similar to \fBxmon\fP(1), but intended to combine \fBxmon\fP\(aqs basic functionality with an interface much more similar to \fBstrace\fP(1). .PP Unlike \fBxmon\fP, you don\(aqt have to start the trace utility in one terminal and manually attach processes to it from another. The principal mode of use is just to type \fBxtrace\fP followed by the command line of your X program; \fBxtrace\fP will take care itself of setting up an X proxy and adjusting the new program\(aqs environment to point at it, and (also unlike \fBxmon\fP) it will also take care of setting up X authorisation automatically. .PP As an alternative mode of use, you can also attach \fBxtrace\fP to an already-running X application, if you didn\(aqt realise you were going to want to trace it until it had already been started. This mode requires cooperation from the X server - specifically, it can\(aqt work unless the server supports the \fBRECORD\fP protocol extension - but since modern X.Org servers do provide that, it\(aqs often useful. .PP The logging format of \fBxtrace\fP is much more compact than that of \fBxmon\fP, and resembles \fBstrace\fP in that it\(aqs written to look like a series of function calls some of which return values. For instance, where \fBxmon\fP would print .PP .nf \ \ \ \ \ \ \ \ \ ............REQUEST:\ GetSelectionOwner \ \ \ \ \ \ \ \ \ \ \ \ \ sequence\ number:\ 000f \ \ \ \ \ \ \ \ \ \ \ \ \ \ request\ length:\ 0002 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ selection:\ <PRIMARY> \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ..............REPLY:\ GetSelectionOwner \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ sequence\ number:\ 000f \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ reply\ length:\ 00000000 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ owner:\ WIN\ 02c0002b \ \ \ \ \ \ \ \ \ ............REQUEST:\ InternAtom \ \ \ \ \ \ \ \ \ \ \ \ \ sequence\ number:\ 0010 \ \ \ \ \ \ \ \ \ \ \ \ \ \ only-if-exists:\ False \ \ \ \ \ \ \ \ \ \ \ \ \ \ request\ length:\ 0005 \ \ \ \ \ \ \ \ \ \ \ \ \ \ length\ of\ name:\ 000c \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ name:\ "VT_SELECTION" \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ..............REPLY:\ InternAtom \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ sequence\ number:\ 0010 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ reply\ length:\ 00000000 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ atom:\ ATM\ 000002bf .fi .PP \fBxtrace\fP will instead print .PP .nf GetSelectionOwner(selection=a#1)\ =\ {owner=w#02C0002B} InternAtom(name="VT_SELECTION",\ only-if-exists=False)\ =\ {atom=a#703} .fi .PP Note that not only has each request been condensed on to one line (though most lines will be long enough to wrap, at least on a standard 80-column terminal), but also each request and reply have been printed on the \fIsame\fP line. .PP That last is not always possible, of course: sometimes an application will queue multiple requests before receiving the reply to the first one (in fact, this is generally good behaviour since it minimises network round-trip delays), in which case \fBxtrace\fP\(aqs output will look - again mimicking \fBstrace\fP - something like this: .PP .nf InternAtom(name="TARGETS",\ only-if-exists=False)\ =\ <unfinished> InternAtom(name="TIMESTAMP",\ only-if-exists=False)\ =\ <unfinished> \ ...\ InternAtom(name="TARGETS",\ only-if-exists=False)\ =\ {atom=a#378} \ ...\ InternAtom(name="TIMESTAMP",\ only-if-exists=False)\ =\ {atom=a#379} .fi .SH "OPTIONS" .PP If you want to attach \fBxtrace\fP to an already-running X client, then instead of specifying a command to run you should give the following option: .IP "\fB-p\fP \fIresource-ID\fP" Attach to the X client owning the given resource, using the X \fBRECORD\fP extension (which the server must support for this to work). The resource ID can be a decimal integer or a hex integer preceded with `\fB0x\fP'. It typically names an X window, but can name another type of resource instead (e.g. a pixmap or cursor) or just specify the resource base of the client connection. If you don\(aqt know any of those things, you can give the resource ID as just `\fB-\fP', in which case \fBxtrace\fP will allow you to interactively select a window by clicking with the mouse (similarly to \fBxkill\fP(1), \fBxwininfo\fP(1) and \fBxprop\fP(1)) and will trace the client that owns the window you select. .PP The following options apply to both modes of operation: .IP "\fB-s\fP \fIlength\fP" Limit the length of output lines by eliding most of the contents of long arrays, strings and blocks of data. \fBxtrace\fP will begin to shorten lines at the specified length (any line shorter than that should not be interfered with), but lines cannot always be chopped to the exact length and continue to make sense, so the line length is approximate only. Specifying zero or `\fBunlimited\fP' will remove all restriction, so that \fBxtrace\fP will display the full contents of every request it understands, no matter how big. Default is 256. .IP "\fB-o\fP \fIfilename\fP" Send the trace output to the specified file. The default is to log to standard error. .IP "\fB-e\fP [\fIclass\fP\fB=\fP][\fB!\fP]\fIitem\fP[\fB,\fP\fIitem\fP...]" Specify a subset of X requests or X events to log. \fIclass\fP can be either `\fBrequests\fP' or `\fBevents\fP'; if the class is omitted, `\fBrequests\fP' is assumed. The list of \fIitem\fP gives a list of X request names or X event names (respectively) to be logged; all other requests or events are omitted. If the list of items is prefixed with \fB!\fP, it is instead treated as a list of requests or events \fInot\fP to be logged, and anything not in the list is printed. Reply and error packets are not separately filtered: they are logged if and only if the request they respond to was logged. .RS .PP For example, to log only \fBImageText8\fP and \fBImageText16\fP requests, you might say `\fBxtrace -e requests=ImageText8,ImageText16\fP \fIcommand\fP' or just `\fBxtrace -e ImageText8,ImageText16\fP \fIcommand\fP'. To inhibit the display of \fBFocusIn\fP and \fBFocusOut\fP events, you might say `\fBxtrace -e events=!FocusIn,FocusOut\fP \fIcommand\fP'. .PP (Note that the \fB!\fP character might be treated specially by your shell, so you may need to escape it.) .RE .IP "\fB-I\fP" Log the initialisation message sent by the X server at the start of the connection. This is omitted by default because it's particularly long and ugly. .IP "\fB-R\fP" As well as translating the X protocol, also give a raw hex dump of all the data transferred over the connection. (Probably most useful to include in a bug report about \fBxtrace\fP itself!) .IP "\fB-C\fP" Prefix every output line with the X client id (resource base) of the client connection it came from. By default \fBxtrace\fP only starts to do this if it\(aqs tracing more than one X client; before then, lines are unprefixed. This option makes prefixing unconditional from the start of the run. .SH "BUGS" .PP Many commonly used X protocol extensions are not currently decoded. .PP A lot of this program has been only minimally tested. .SH "LICENCE" .PP \fBxtrace\fP is free software, distributed under the MIT/X11 licence. Type \fBxtrace --licence\fP to see the full licence text. Revision-number: 8555 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2009-05-02T18:43:11.228997Z K 7 svn:log V 14 TODO updates. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e69639d25028556efba63343ca2a9711 Text-delta-base-sha1: 95d998d2aa10f6d75915b213c47c3725bc3edf9b Text-content-length: 839 Text-content-md5: 9c2cc038788d8302b793a8eab88d0630 Text-content-sha1: dab480691a07d5674f42a990b11a70a05ec2b0f2 Content-length: 839 SVN�����:��>M�w * - Ability to run as an explicit proxy, as other X tracing * utilities do. Run in this mode, xtrace should print the * appropriate DISPLAY and XAUTHORITY environment variables to * standard output in a form easily pasted into another shell * prompt, and then sit there waiting for connections. * * - Find some way of more reliably cleaning up the X authority * files in /tmp�57�5�TRUE); xlog_param(xl, "pid", PIXMAP, FETCH32(data, 4)); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 8)); xlog_param(xl, "width", DECU, FETCH16(data, 12)); xlog_param(xl, "height", DECU, FETCH16(data, 14)); xlog_param(xl, "depth", DECU, FETCH8(data, 16)); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 20)); xlog_param(xl, "offset", HEX32, FETCH32(data, 24)); break; Revision-number: 8556 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8557 Prop-content-length: 253 Content-length: 253 K 8 svn:date V 27 2009-05-10T13:53:22.995258Z K 7 svn:log V 152 Log the X RENDER extension, the understanding of which appears to be critical to questions like 'why does pterm run so slowly with client-side fonts?'. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9c2cc038788d8302b793a8eab88d0630 Text-delta-base-sha1: dab480691a07d5674f42a990b11a70a05ec2b0f2 Text-content-length: 43977 Text-content-md5: 1016dcfdc69e6531fcc0326d6a4b82d6 Text-content-sha1: aad6f7cf65a9d5c5ee021501263c4fa098645e52 Content-length: 43977 SVN����18��� �r$_�c �+m�0y�'<`�~^�[��"Y&�W]�tAy� 1�8l�!�+<�K8�D@�p�K8� �K8�?�K8�j�K8�E?�r�K8��K8�D@�;�K8�Lj�K8�D@�<�lT�K8�(\�)�K8�P<�F�G \ X(EXT_RENDER, "RENDER", 5, 0resdepth { unsigned long resource; int depth; }; static int resdepthcmp(void *av, void *bv) { const struct resdepth *a = (const struct resdepth *)av; const struct resdepth *b = (const struct resdepth *)bv; if (a->resource < b->resource) return -1; else if (a->resource > b->resource) return +1; else return 0; } static int resdepthfind(void *av, void *bv) { const unsigned long *a = (const unsigned long *)av; const struct resdepth *b = (const struct resdepth *)bv; if (*a < b->resource) return -1; else if (*a > b->resource) return +1; else return 0; } /* * Tree storing a mapping from X resource ids to image depths. * This information has to be retained in order to correctly * decode the RENDER extension request RenderAddGlyphs: we must * remember the depth of every PICTFORMAT from the reply to * RenderQueryPictFormats, and then remember the depth assigned * to every GLYPHSET created. */ tree234 *resdepthxl->resdepths = newtree234(resdepthcmp)struct resdepth *gsd; while ((gsd = delpos234(xl->resdepths, 0)) != NULL) sfree(gsd); freetree234(xl->resdepths)PICTURE, /* RENDER extension */ PICTFORMAT, /* RENDER extension */ GLYPHSET, /* RENDER extension */ GLYPHABLE, /* RENDER extension */ FIXED, /* RENDER extension */0xFF &FIXED.5f", ival / 65536.0PICTURE: xlog_printf(xl, "pc#%08X", ival); break; case PICTFORMAT: xlog_printf(xl, "pf#%08X", ival); break; case GLYPHSET: xlog_printf(xl, "gsGLYPHABLE: /* * GLYPHABLE can be FONTABLE or GLYPHSET. Sigh. */ xlog_printf(xl, "gsint xlog_image_data(struct xlog *xl, const char *paramname, const unsigned char *data, int len, int startoffset, return -1paramname, stringtype, nunits, STRING(data, startoffset, nunits * unitsize)); return nunits * unitsize if (pos < len && xlog_check_list_length(xl)) break if (pos < le65: xlog_request_name(xl, req, "PolyLine if (pos < le if (pos < le if (pos < le if (pos < le69: xlog_request_name(xl, req, "FillPol if (pos < le if (pos < le71: xlog_request_name(xl, req, "PolyFillArc if (pos < le if (pos < le75: xlog_request_name(xl, req, "PolyText16 if (pos < le if (pos < len && xlog_check_list_length(xl)) break if (pos < le90: xlog_request_name(xl, req, "StoreNamedColor if (pos < len && xlog_check_list_length(xl)) break�7�Vp�rl@�|nq��V�K~&�K~~�K~O�K~B� jY�C=y�Y=@�ji�K~^�K~�K~=�K~g�K~!�T1�d;�\J�h`�v�D�J�C=A�F=|�J�e�Y=G�J�M�C=l�N=�[m�EWreq->replies = 1; break; case 119: xlog_request_name(xl, req, "GetModifierMapping", TRUE); req->replies = 1; break; case 127: xlog_request_name(xl, req, "NoOperation", TRUE); break; case EXT_BIGREQUESTS | 0: xlog_request_name(xl, req, "BigReqEnable", TRUE); req->replies = 1; break; case EXT_MITSHM | 0: xlog_request_name(xl, req, "ShmQueryVersion", TRUE); req->replies = 1; break; case EXT_MITSHM | 1: xlog_request_name(xl, req, "ShmAttach", TRUE); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 4)); xlog_param(xl, "shmid", HEX32, FETCH32(data, 8)); xlog_param(xl, "read-only", BOOLEAN, FETCH8(data, 12)); break; case EXT_MITSHM | 2: xlog_request_name(xl, req, "ShmDetach", TRUE); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 4)); break; case EXT_MITSHM | 3: xlog_request_name(xl, req, "ShmPutImage", TRUE); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "gc", GCONTEXT, FETCH32(data, 8)); xlog_param(xl, "total-width", DECU, FETCH16(data, 12)); xlog_param(xl, "total-height", DECU, FETCH16(data, 14)); xlog_param(xl, "src-x", DECU, FETCH16(data, 16)); xlog_param(xl, "src-y", DECU, FETCH16(data, 18)); xlog_param(xl, "src-width", DECU, FETCH16(data, 20)); xlog_param(xl, "src-height", DECU, FETCH16(data, 22)); xlog_param(xl, "dst-x", DEC16, FETCH16(data, 24)); xlog_param(xl, "dst-y", DEC16, FETCH16(data, 26)); xlog_param(xl, "depth", DECU, FETCH8(data, 28)); xlog_param(xl, "format", ENUM | SPECVAL, FETCH8(data, 29), "Bitmap", 0, "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); xlog_param(xl, "send-event", BOOLEAN, FETCH8(data, 30)); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 32)); xlog_param(xl, "offset", HEX32, FETCH32(data, 36)); break; case EXT_MITSHM | 4: xlog_request_name(xl, req, "ShmGetImage", TRUE); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); xlog_param(xl, "x", DEC16, FETCH16(data, 8)); xlog_param(xl, "y", DEC16, FETCH16(data, 10plane-mask", HEX32, FETCH32(data, 16)); xlog_param(xl, "format", ENUM | SPECVAL, FETCH8(data, 20), "Bitmap", 0, "XYPixmap", 1, "ZPixmap", 2, (char *)NULL); xlog_param(xl, "shmseg", HEX32, FETCH32(data, 24)); xlog_param(xl, "offset", HEX32, FETCH32(data, 28)); req->replies = 1; break; case EXT_MITSHM | 5: xlog_request_name(xl, req, "ShmCreatePixmap", case EXT_RENDER | 0: xlog_request_name(xl, req, "RenderQueryVersion", TRUE); xlog_param(xl, "client-major-version", DECU, FETCH32(data, 4)); xlog_param(xl, "client-minor-version", DECU, FETCH32(data, 8)); req->replies = 1; break; case EXT_RENDER | 1: xlog_request_name(xl, req, "RenderQueryPictFormats", TRUE); req->replies = 1; break; case EXT_RENDER | 2: xlog_request_name(xl, req, "RenderQueryPictIndexValues", TRUE); xlog_param(xl, "format", PICTFORMAT, FETCH32(data, 4)); req->replies = 1; break; case EXT_RENDER | 3: xlog_request_name(xl, req, "RenderQueryDithers", TRUE); /* * This request is not supported by X.Org or Xlib at the * time of writing, so I can't be certain of its contents * format. */ xlog_param(xl, "<unknown request format>", NOTEVENEQUALSIGN); req->replies = 1; break; case EXT_RENDER | 4: case EXT_RENDER | 5: { unsigned i, bitmask; switch (req->opcode) { case EXT_RENDER | 4: xlog_request_name(xl, req, "RenderCreatePicture", TRUE); xlog_param(xl, "pid", PICTURE, FETCH32(data, 4)); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 8)); xlog_param(xl, "format", PICTFORMAT, FETCH32(data, 12)); i = 20; break; default /* case EXT_RENDER | 5 */ : xlog_request_name(xl, req, "RenderChangePicture", TRUE); xlog_param(xl, "picture", PICTURE, FETCH32(data, 4)); i = 12; break; } bitmask = FETCH32(data, i-4); if (bitmask & 0x00000001) { xlog_param(xl, "repeat", ENUM | SPECVAL, FETCH32(data, i), "None", 0, "Normal", 1, "Pad", 2, "Reflect", 3, (char *)NULL); i += 4; } if (bitmask & 0x00000002) { xlog_param(xl, "alpha-map", PICTURE | SPECVAL, FETCH32(data, i), "None", 0, (char *)NULL); i += 4; } if (bitmask & 0x00000004) { xlog_param(xl, "alpha-x-origin", DEC16, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000008) { xlog_param(xl, "alpha-y-origin", DEC16, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000010) { xlog_param(xl, "clip-x-origin", DEC16, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000020) { xlog_param(xl, "clip-y-origin", DEC16, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000040) { xlog_param(xl, "clip-mask", PIXMAP | SPECVAL, FETCH32(data, i), "None", 0, (char *)NULL); i += 4; } if (bitmask & 0x00000080) { xlog_param(xl, "graphics-exposures", BOOLEAN, FETCH32(data, i)); i += 4; } if (bitmask & 0x00000100) { xlog_param(xl, "subwindow-mode", ENUM | SPECVAL, FETCH32(data, i), "ClipByChildren", 0, "IncludeInferiors", 1, (char *)NULL); i += 4; } if (bitmask & 0x00000200) { xlog_param(xl, "poly-edge", ENUM | SPECVAL, FETCH32(data, i), "Sharp", 0, "Smooth", 1, (char *)NULL); i += 4; } if (bitmask & 0x00000400) { xlog_param(xl, "poly-mode", ENUM | SPECVAL, FETCH32(data, i), "Precise", 0, "Imprecise", 1, (char *)NULL); i += 4; } if (bitmask & 0x00000800) { xlog_param(xl, "dither", ATOM | SPECVAL, FETCH32(data, i), "None", 0, (char *)NULL); i += 4; } if (bitmask & 0x00001000) { xlog_param(xl, "component-alpha", BOOLEAN, FETCH32(data, i)); i += 4; } } break; case EXT_RENDER | 6: xlog_request_name(xl, req, "RenderSetPictureClipRectangles", TRUE); xlog_param(xl, "picture", PICTURE, FETCH32(data, 4)); xlog_param(xl, "clip-x-origin", DEC16, FETCH16(data, 8)); xlog_param(xl, "clip-y-origin", DEC16, FETCH16(data, 10)); { int pos = 12; int i = 0; char buf[64]; while (pos + 8 <= len) { sprintf(buf, "rectangles[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_rectangle(xl, data, len, pos); xlog_set_end(xl); pos += 8; if (pos < leEXT_RENDER | 7: xlog_request_name(xl, req, "RenderFreePicture", TRUE); xlog_param(xl, "picture", PICTURE, FETCH32(data, 4)); break; case EXT_RENDER | 8: xlog_request_name(xl, req, "RenderComposite", TRUE); xlog_param(xl, "op", ENUM | SPECVAL, FETCH8(data, 4), "Clear", 0, "Src", 1, "Dst", 2, "Over", 3, "OverReverse", 4, "In", 5, "InReverse", 6, "Out", 7, "OutReverse", 8, "Atop", 9, "AtopReverse", 10, "Xor", 11, "Add", 12, "Saturate", 13, "DisjointClear", 0x10, "DisjointSrc", 0x11, "DisjointDst", 0x12, "DisjointOver", 0x13, "DisjointOverReverse", 0x14, "DisjointIn", 0x15, "DisjointInReverse", 0x16, "DisjointOut", 0x17, "DisjointOutReverse", 0x18, "DisjointAtop", 0x19, "DisjointAtopReverse", 0x1a, "DisjointXor", 0x1b, "ConjointClear", 0x20, "ConjointSrc", 0x21, "ConjointDst", 0x22, "ConjointOver", 0x23, "ConjointOverReverse", 0x24, "ConjointIn", 0x25, "ConjointInReverse", 0x26, "ConjointOut", 0x27, "ConjointOutReverse", 0x28, "ConjointAtop", 0x29, "ConjointAtopReverse", 0x2a, "ConjointXor", 0x2b); xlog_param(xl, "src", PICTURE, FETCH32(data, 8)); xlog_param(xl, "mask", PICTURE | SPECVAL, FETCH32(data, 12), "None", 0, (char *)NULL); xlog_param(xl, "dst", PICTURE, FETCH32(data, 16)); xlog_param(xl, "src-x", DEC16, FETCH16(data, 20)); xlog_param(xl, "src-y", DEC16, FETCH16(data, 22)); xlog_param(xl, "mask-x", DEC16, FETCH16(data, 24)); xlog_param(xl, "mask-y", DEC16, FETCH16(data, 26)); xlog_param(xl, "dst-x", DEC16, FETCH16(data, 28)); xlog_param(xl, "dst-y", DEC16, FETCH16(data, 30)); xlog_param(xl, "width", DECU, FETCH16(data, 32)); xlog_param(xl, "height", DECU, FETCH16(data, 34)); break; case EXT_RENDER | 9: xlog_request_name(xl, req, "RenderScale", TRUE); xlog_param(xl, "src", PICTURE, FETCH32(data, 4)); xlog_param(xl, "dst", PICTURE, FETCH32(data, 8)); xlog_param(xl, "color-scale", HEX32, FETCH32(data, 12)); xlog_param(xl, "alpha-scale", HEX32, FETCH32(data, 16)); xlog_param(xl, "src-x", DEC16, FETCH16(data, 20)); xlog_param(xl, "src-y", DEC16, FETCH16(data, 22)); xlog_param(xl, "dst-x", DEC16, FETCH16(data, 24)); xlog_param(xl, "dst-y", DEC16, FETCH16(data, 26)); xlog_param(xl, "width", DECU, FETCH16(data, 28)); xlog_param(xl, "height", DECU, FETCH16(data, 30)); break; case EXT_RENDER | 10: xlog_request_name(xl, req, "RenderTrapezoids", TRUE); xlog_param(xl, "op", ENUM | SPECVAL, FETCH8(data, 4), "Clear", 0, "Src", 1, "Dst", 2, "Over", 3, "OverReverse", 4, "In", 5, "InReverse", 6, "Out", 7, "OutReverse", 8, "Atop", 9, "AtopReverse", 10, "Xor", 11, "Add", 12, "Saturate", 13, "DisjointClear", 0x10, "DisjointSrc", 0x11, "DisjointDst", 0x12, "DisjointOver", 0x13, "DisjointOverReverse", 0x14, "DisjointIn", 0x15, "DisjointInReverse", 0x16, "DisjointOut", 0x17, "DisjointOutReverse", 0x18, "DisjointAtop", 0x19, "DisjointAtopReverse", 0x1a, "DisjointXor", 0x1b, "ConjointClear", 0x20, "ConjointSrc", 0x21, "ConjointDst", 0x22, "ConjointOver", 0x23, "ConjointOverReverse", 0x24, "ConjointIn", 0x25, "ConjointInReverse", 0x26, "ConjointOut", 0x27, "ConjointOutReverse", 0x28, "ConjointAtop", 0x29, "ConjointAtopReverse", 0x2a, "ConjointXor", 0x2b); xlog_param(xl, "src", PICTURE, FETCH32(data, 8)); xlog_param(xl, "src-x", DEC16, FETCH16(data, 20)); xlog_param(xl, "src-y", DEC16, FETCH16(data, 22)); xlog_param(xl, "dst", PICTURE, FETCH32(data, 12)); xlog_param(xl, "mask-format", PICTFORMAT | SPECVAL, FETCH32(data, 16), "None", 0, (char *)NULL); { int pos = 24; int i = 0; char buf[64]; while (pos + 40 <= len) { sprintf(buf, "trapezoids[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "top", FIXED, FETCH32(data, pos)); xlog_param(xl, "bottom", FIXED, FETCH32(data, pos+4)); xlog_param(xl, "left.p1.x", FIXED, FETCH32(data, pos+8)); xlog_param(xl, "left.p1.y", FIXED, FETCH32(data, pos+12)); xlog_param(xl, "left.p2.x", FIXED, FETCH32(data, pos+16)); xlog_param(xl, "left.p2.y", FIXED, FETCH32(data, pos+20)); xlog_param(xl, "right.p1.x", FIXED, FETCH32(data, pos+24)); xlog_param(xl, "right.p1.y", FIXED, FETCH32(data, pos+28)); xlog_param(xl, "right.p2.x", FIXED, FETCH32(data, pos+32)); xlog_param(xl, "right.p2.y", FIXED, FETCH32(data, pos+36)); xlog_set_end(xl); pos += 40; i++; if (pos < leEXT_RENDER | 11: xlog_request_name(xl, req, "RenderTriangles", TRUE); xlog_param(xl, "op", ENUM | SPECVAL, FETCH8(data, 4), "Clear", 0, "Src", 1, "Dst", 2, "Over", 3, "OverReverse", 4, "In", 5, "InReverse", 6, "Out", 7, "OutReverse", 8, "Atop", 9, "AtopReverse", 10, "Xor", 11, "Add", 12, "Saturate", 13, "DisjointClear", 0x10, "DisjointSrc", 0x11, "DisjointDst", 0x12, "DisjointOver", 0x13, "DisjointOverReverse", 0x14, "DisjointIn", 0x15, "DisjointInReverse", 0x16, "DisjointOut", 0x17, "DisjointOutReverse", 0x18, "DisjointAtop", 0x19, "DisjointAtopReverse", 0x1a, "DisjointXor", 0x1b, "ConjointClear", 0x20, "ConjointSrc", 0x21, "ConjointDst", 0x22, "ConjointOver", 0x23, "ConjointOverReverse", 0x24, "ConjointIn", 0x25, "ConjointInReverse", 0x26, "ConjointOut", 0x27, "ConjointOutReverse", 0x28, "ConjointAtop", 0x29, "ConjointAtopReverse", 0x2a, "ConjointXor", 0x2b); xlog_param(xl, "src", PICTURE, FETCH32(data, 8)); xlog_param(xl, "src-x", DEC16, FETCH16(data, 20)); xlog_param(xl, "src-y", DEC16, FETCH16(data, 22)); xlog_param(xl, "dst", PICTURE, FETCH32(data, 12)); xlog_param(xl, "mask-format", PICTFORMAT | SPECVAL, FETCH32(data, 16), "None", 0, (char *)NULL); { int pos = 24; int i = 0; char buf[64]; while (pos + 24 <= len) { sprintf(buf, "triangles[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "p1.x", FIXED, FETCH32(data, pos)); xlog_param(xl, "p1.y", FIXED, FETCH32(data, pos+4)); xlog_param(xl, "p2.x", FIXED, FETCH32(data, pos+8)); xlog_param(xl, "p2.y", FIXED, FETCH32(data, pos+12)); xlog_param(xl, "p3.x", FIXED, FETCH32(data, pos+16)); xlog_param(xl, "p3.y", FIXED, FETCH32(data, pos+20)); xlog_set_end(xl); pos += 24; i++; if (pos < leEXT_RENDER | 12: case EXT_RENDER | 13: switch (req->opcode) { case EXT_RENDER | 12: xlog_request_name(xl, req, "RenderTriStrip", TRUE); break; case EXT_RENDER | 13: xlog_request_name(xl, req, "RenderTriFan", TRUE); break; } xlog_param(xl, "op", ENUM | SPECVAL, FETCH8(data, 4), "Clear", 0, "Src", 1, "Dst", 2, "Over", 3, "OverReverse", 4, "In", 5, "InReverse", 6, "Out", 7, "OutReverse", 8, "Atop", 9, "AtopReverse", 10, "Xor", 11, "Add", 12, "Saturate", 13, "DisjointClear", 0x10, "DisjointSrc", 0x11, "DisjointDst", 0x12, "DisjointOver", 0x13, "DisjointOverReverse", 0x14, "DisjointIn", 0x15, "DisjointInReverse", 0x16, "DisjointOut", 0x17, "DisjointOutReverse", 0x18, "DisjointAtop", 0x19, "DisjointAtopReverse", 0x1a, "DisjointXor", 0x1b, "ConjointClear", 0x20, "ConjointSrc", 0x21, "ConjointDst", 0x22, "ConjointOver", 0x23, "ConjointOverReverse", 0x24, "ConjointIn", 0x25, "ConjointInReverse", 0x26, "ConjointOut", 0x27, "ConjointOutReverse", 0x28, "ConjointAtop", 0x29, "ConjointAtopReverse", 0x2a, "ConjointXor", 0x2b); xlog_param(xl, "src", PICTURE, FETCH32(data, 8)); xlog_param(xl, "src-x", DEC16, FETCH16(data, 20)); xlog_param(xl, "src-y", DEC16, FETCH16(data, 22)); xlog_param(xl, "dst", PICTURE, FETCH32(data, 12)); xlog_param(xl, "mask-format", PICTFORMAT | SPECVAL, FETCH32(data, 16), "None", 0, (char *)NULL); { int pos = 24; int i = 0; char buf[64]; while (pos + 8 <= len) { sprintf(buf, "points[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "x", FIXED, FETCH32(data, pos)); xlog_param(xl, "y", FIXED, FETCH32(data, pos+4)); xlog_set_end(xl); pos += 8; i++; if (pos < leEXT_RENDER | 14: xlog_request_name(xl, req, "RenderColorTrapezoids", TRUE); /* * This request is not supported by X.Org or Xlib at the * time of writing, so I can't be certain of its contents * format. */ xlog_param(xl, "<unknown request format>", NOTEVENEQUALSIGN); break; case EXT_RENDER | 15: xlog_request_name(xl, req, "RenderColorTriangles", TRUE); /* * This request is not supported by X.Org or Xlib at the * time of writing, so I can't be certain of its contents * format. */ xlog_param(xl, "<unknown request format>", NOTEVENEQUALSIGN); break; case EXT_RENDER | 16: xlog_request_name(xl, req, "RenderTransform", TRUE); /* * This request is not supported by X.Org or Xlib at the * time of writing, so I can't be certain of its contents * format. */ xlog_param(xl, "<unknown request format>", NOTEVENEQUALSIGN); break; case EXT_RENDER | 17: case EXT_RENDER | 18: switch (req->opcode) { case EXT_RENDER | 17: xlog_request_name(xl, req, "RenderCreateGlyphSet", TRUE); xlog_param(xl, "gsid", GLYPHSET, FETCH32(data, 4)); xlog_param(xl, "format", PICTFORMAT, FETCH32(data, 8)); break; case EXT_RENDER | 18: xlog_request_name(xl, req, "RenderReferenceGlyphSet", TRUE); xlog_param(xl, "gsid", GLYPHSET, FETCH32(data, 4)); xlog_param(xl, "existing", GLYPHSET, FETCH32(data, 8)); } /* * Now remember the depth for this glyphset, by reading it * out of either the PICTFORMAT or the GLYPHSET. */ { struct resdepth *existing; struct resdepth *gsd; struct resdepth *old; unsigned long oldid = FETCH32(data, 8); existing = find234(xl->resdepths, &oldid, resdepthfind); if (existing) { gsd = snew(struct resdepth); gsd->resource = FETCH32(data, 4); gsd->depth = existing->depth; /* * Find any previous entry for this glyphset id, and * override it. */ old = del234(xl->resdepths, gsd); sfree(old); /* * Now add the new one. */ add234(xl->resdepths, gsd); } } break; case EXT_RENDER | 19: xlog_request_name(xl, req, "RenderFreeGlyphSet", TRUE); xlog_param(xl, "glyphset", GLYPHSET, FETCH32(data, 4)); break; case EXT_RENDER | 20: xlog_request_name(xl, req, "RenderAddGlyphs", TRUE); xlog_param(xl, "glyphset", GLYPHSET, FETCH32(data, 4)); { int pos = 12, whpos; int i = 0; char buf[64]; int n = FETCH32(data, pos-4); int depth; for (i = 0; i < n; i++) { sprintf(buf, "glyphid whpos = pos; for (i = 0; i < n; i++) { sprintf(buf, "glyphs[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "width", DECU, FETCH16(data, pos)); xlog_param(xl, "height", DECU, FETCH16(data, pos+2)); xlog_param(xl, "x", DEC16, FETCH16(data, pos+4)); xlog_param(xl, "y", DEC16, FETCH16(data, pos+6)); xlog_param(xl, "off-x", DEC16, FETCH16(data, pos+8)); xlog_param(xl, "off-y", DEC16, FETCH16(data, pos+10)); xlog_set_end(xl); pos += 12 { unsigned long oldid = FETCH32(data, 4); struct resdepth *rd; rd = find234(xl->resdepths, &oldid, resdepthfind); if (rd) depth = rd->depth; else depth = 0; } for (i = 0; i < n; i++) { int ret; sprintf(buf, "glyphimages[%d]", i); ret = xlog_image_data(xl, buf, data, len, pos, 2, FETCH16(data, whpos+12*i), FETCH16(data, whpos+12*i+2), depth); if (ret < 0) break; /* don't know how to advance to next image */ pos += (ret + 3) &~ 3EXT_RENDER | 21: xlog_request_name(xl, req, "RenderAddGlyphsFromPicture", TRUE); /* * This request is not supported by X.Org or Xlib at the * time of writing, so I can't be certain of its contents * format. */ xlog_param(xl, "<unknown request format>", NOTEVENEQUALSIGN); break; case EXT_RENDER | 22: xlog_request_name(xl, req, "RenderFreeGlyphs", TRUE); xlog_param(xl, "glyphset", GLYPHSET, FETCH32(data, 4)); { int pos = 12; int i = 0; char buf[64]; int n = FETCH32(data, pos-4); for (i = 0; i < n; i++) { sprintf(buf, "glyphbreak; case EXT_RENDER | 23: case EXT_RENDER | 24: case EXT_RENDER | 25: switch (req->opcode) { case EXT_RENDER | 23: xlog_request_name(xl, req, "RenderCompositeGlyphs8", TRUE); break; case EXT_RENDER | 24: xlog_request_name(xl, req, "RenderCompositeGlyphs16", TRUE); break; case EXT_RENDER | 25: xlog_request_name(xl, req, "RenderCompositeGlyphs32", TRUE); break; } xlog_param(xl, "op", ENUM | SPECVAL, FETCH8(data, 4), "Clear", 0, "Src", 1, "Dst", 2, "Over", 3, "OverReverse", 4, "In", 5, "InReverse", 6, "Out", 7, "OutReverse", 8, "Atop", 9, "AtopReverse", 10, "Xor", 11, "Add", 12, "Saturate", 13, "DisjointClear", 0x10, "DisjointSrc", 0x11, "DisjointDst", 0x12, "DisjointOver", 0x13, "DisjointOverReverse", 0x14, "DisjointIn", 0x15, "DisjointInReverse", 0x16, "DisjointOut", 0x17, "DisjointOutReverse", 0x18, "DisjointAtop", 0x19, "DisjointAtopReverse", 0x1a, "DisjointXor", 0x1b, "ConjointClear", 0x20, "ConjointSrc", 0x21, "ConjointDst", 0x22, "ConjointOver", 0x23, "ConjointOverReverse", 0x24, "ConjointIn", 0x25, "ConjointInReverse", 0x26, "ConjointOut", 0x27, "ConjointOutReverse", 0x28, "ConjointAtop", 0x29, "ConjointAtopReverse", 0x2a, "ConjointXor", 0x2b); xlog_param(xl, "src", PICTURE, FETCH32(data, 8)); xlog_param(xl, "dst", PICTURE, FETCH32(data, 12)); xlog_param(xl, "mask-format", PICTFORMAT | SPECVAL, FETCH32(data, 16), "None", 0, (char *)NULL); xlog_param(xl, "glyphset", GLYPHABLE, FETCH32(data, 20)); xlog_param(xl, "src-x", DEC16, FETCH16(data, 24)); xlog_param(xl, "src-y", DEC16, FETCH32(data, 26)); { int pos = 28; int i = 0; /* * We now expect a series of GLYPHITEMs of the * appropriate size packed tightly together. Each of * these starts with an 8-byte header consisting of a * length byte, three padding bytes, and 16-bit delta x * and y values. If L==255, this is followed by a * four-byte GLYPHSET identifier; otherwise it's * followed by L glyph ids of the appropriate size. */ while (pos < len) { char buf[64]; int tilen = FETCH8(data, pos); sprintf(buf, "items[%d]", i); xlog_param(xl, buf, SETBEGIN); if (tilen == 255) { xlog_param(xl, "glyphset", GLYPHSET, FETCH8(data, pos+8)); pos += 12; } else { xlog_param(xl, "delta-x", DEC16, FETCH16(data, pos+4)); xlog_param(xl, "delta-y", DEC16, FETCH16(data, pos+6)); pos += 8; switch (req->opcode) { case EXT_RENDER | 23: xlog_param(xl, "string", HEXSTRING1, tilen, STRING(data, pos, tilen)); pos += tilen; break; case EXT_RENDER | 24: xlog_param(xl, "string", HEXSTRING2, tilen, STRING(data, pos, tilen*2)); pos += tilen*2; break; case EXT_RENDER | 25: xlog_param(xl, "string", HEXSTRING4, tilen, STRING(data, pos, tilen*4)); pos += tilen*4; break; } pos = (pos + 3) & ~3; } xlog_set_end(xl); i++; if (pos < leEXT_RENDER | 26: xlog_request_name(xl, req, "RenderFillRectangles", TRUE); xlog_param(xl, "op", ENUM | SPECVAL, FETCH8(data, 4), "Clear", 0, "Src", 1, "Dst", 2, "Over", 3, "OverReverse", 4, "In", 5, "InReverse", 6, "Out", 7, "OutReverse", 8, "Atop", 9, "AtopReverse", 10, "Xor", 11, "Add", 12, "Saturate", 13, "DisjointClear", 0x10, "DisjointSrc", 0x11, "DisjointDst", 0x12, "DisjointOver", 0x13, "DisjointOverReverse", 0x14, "DisjointIn", 0x15, "DisjointInReverse", 0x16, "DisjointOut", 0x17, "DisjointOutReverse", 0x18, "DisjointAtop", 0x19, "DisjointAtopReverse", 0x1a, "DisjointXor", 0x1b, "ConjointClear", 0x20, "ConjointSrc", 0x21, "ConjointDst", 0x22, "ConjointOver", 0x23, "ConjointOverReverse", 0x24, "ConjointIn", 0x25, "ConjointInReverse", 0x26, "ConjointOut", 0x27, "ConjointOutReverse", 0x28, "ConjointAtop", 0x29, "ConjointAtopReverse", 0x2a, "ConjointXor", 0x2b); xlog_param(xl, "dst", PICTURE, FETCH32(data, 8)); xlog_param(xl, "color", SETBEGIN); xlog_param(xl, "red", HEX16, FETCH16(data, 12)); xlog_param(xl, "green", HEX16, FETCH16(data, 14)); xlog_param(xl, "blue", HEX16, FETCH16(data, 16)); xlog_param(xl, "alpha", HEX16, FETCH16(data, 18)); xlog_set_end(xl); { int pos = 20; int i = 0; char buf[64]; while (pos + 8 <= len) { sprintf(buf, "rectangles[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_rectangle(xl, data, len, pos); xlog_set_end(xl); pos += 8; i++; if (pos < leEXT_RENDER | 27: xlog_request_name(xl, req, "RenderCreateCursor", TRUE); xlog_param(xl, "cid", CURSOR, FETCH32(data, 4)); xlog_param(xl, "src", PICTURE, FETCH32(data, 8)); xlog_param(xl, "x", DECU, FETCH16(data, 12)); xlog_param(xl, "y", DECU, FETCH16(data, 14)); break; case EXT_RENDER | 28: xlog_request_name(xl, req, "RenderSetPictureTransform", TRUE); xlog_param(xl, "picture", PICTURE, FETCH32(data, 4)); xlog_param(xl, "transform", SETBEGIN); xlog_param(xl, "p11", FIXED, FETCH32(data, 8)); xlog_param(xl, "p12", FIXED, FETCH32(data, 12)); xlog_param(xl, "p13", FIXED, FETCH32(data, 16)); xlog_param(xl, "p21", FIXED, FETCH32(data, 20)); xlog_param(xl, "p22", FIXED, FETCH32(data, 24)); xlog_param(xl, "p23", FIXED, FETCH32(data, 28)); xlog_param(xl, "p31", FIXED, FETCH32(data, 32)); xlog_param(xl, "p32", FIXED, FETCH32(data, 36)); xlog_param(xl, "p33", FIXED, FETCH32(data, 40)); xlog_set_end(xl); break; case EXT_RENDER | 29: xlog_request_name(xl, req, "RenderQueryFilters", TRUE); xlog_param(xl, "drawable", DRAWABLE, FETCH32(data, 4)); break; case EXT_RENDER | 30: xlog_request_name(xl, req, "RenderSetPictureFilter", TRUE); xlog_param(xl, "picture", PICTURE, FETCH32(data, 4)); xlog_param(xl, "name", STRING, FETCH16(data, 8), STRING(data, 12, FETCH16(data, 8))); { int pos = (12 + FETCH16(data, 8) + 3) & ~3; int i = 0; char buf[64]; while (pos + 4 <= len) { sprintf(buf, "values[%d]", i); xlog_param(xl, buf, FIXED, FETCH32(data, pos)); pos += 4; i++; if (pos < leEXT_RENDER | 31: xlog_request_name(xl, req, "RenderCreateAnimCursor", TRUE); xlog_param(xl, "cid", CURSOR, FETCH32(data, 4)); { int pos = 8; int i = 0; char buf[64]; while (pos + 8 <= len) { sprintf(buf, "cursors[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "cursor", CURSOR, FETCH32(data, pos)); xlog_param(xl, "delay", DECU, FETCH32(data, pos+4)); xlog_set_end(xl); pos += 8; i++; if (pos < leEXT_RENDER | 32: xlog_request_name(xl, req, "RenderAddTraps", TRUE); xlog_param(xl, "picture", PICTURE, FETCH32(data, 4)); xlog_param(xl, "off-x", DEC16, FETCH16(data, 8)); xlog_param(xl, "off-y", DEC16, FETCH16(data, 10)); { int pos = 12; int i = 0; char buf[64]; while (pos + 24 <= len) { sprintf(buf, "trapezoids[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "top", SETBEGIN); xlog_param(xl, "l", FIXED, FETCH32(data, pos)); xlog_param(xl, "r", FIXED, FETCH32(data, pos+4)); xlog_param(xl, "y", FIXED, FETCH32(data, pos+8)); xlog_set_end(xl); pos += 12; xlog_param(xl, "bot", SETBEGIN); xlog_param(xl, "l", FIXED, FETCH32(data, pos)); xlog_param(xl, "r", FIXED, FETCH32(data, pos+4)); xlog_param(xl, "y", FIXED, FETCH32(data, pos+8)); xlog_set_end(xl); pos += 12; xlog_set_end(xl); i++; if (pos < leEXT_RENDER | 33: xlog_request_name(xl, req, "RenderCreateSolidFill", TRUE); xlog_param(xl, "pid", PICTURE, FETCH32(data, 4)); xlog_param(xl, "color", SETBEGINxlog_param(xl, "alpha", HEX16, FETCH16(data, 14)); xlog_set_end(xl); break; case EXT_RENDER | 34: case EXT_RENDER | 35: case EXT_RENDER | 36: { int pos, n, i; char buf[64]; switch (req->opcode) { case EXT_RENDER | 34: xlog_request_name(xl, req, "RenderCreateLinearGradient", TRUE); xlog_param(xl, "pid", PICTURE, FETCH32(data, 4)); xlog_param(xl, "p1", SETBEGIN); xlog_param(xl, "x", FIXED, FETCH32(data, 8)); xlog_param(xl, "y", FIXED, FETCH32(data, 12)); xlog_set_end(xl); xlog_param(xl, "p2", SETBEGIN); xlog_param(xl, "x", FIXED, FETCH32(data, 16)); xlog_param(xl, "y", FIXED, FETCH32(data, 20)); xlog_set_end(xl); pos = 28; break; case EXT_RENDER | 35: xlog_request_name(xl, req, "RenderCreateRadialGradient", TRUE); xlog_param(xl, "pid", PICTURE, FETCH32(data, 4)); xlog_param(xl, "inner_center", SETBEGIN); xlog_param(xl, "x", FIXED, FETCH32(data, 8)); xlog_param(xl, "y", FIXED, FETCH32(data, 12)); xlog_set_end(xl); xlog_param(xl, "outer_center", SETBEGIN); xlog_param(xl, "x", FIXED, FETCH32(data, 16)); xlog_param(xl, "y", FIXED, FETCH32(data, 20)); xlog_set_end(xl); xlog_param(xl, "inner_radius", FIXED, FETCH32(data, 24)); xlog_param(xl, "outer_radius", FIXED, FETCH32(data, 28)); pos = 36; break; default /* case EXT_RENDER | 36 */: xlog_request_name(xl, req, "RenderCreateConicalGradient", TRUE); xlog_param(xl, "pid", PICTURE, FETCH32(data, 4)); xlog_param(xl, "center", SETBEGIN); xlog_param(xl, "x", FIXED, FETCH32(data, 8)); xlog_param(xl, "y", FIXED, FETCH32(data, 12)); xlog_set_end(xl); xlog_param(xl, "angle", FIXED, FETCH32(data, 16)); pos = 24; break; } n = FETCH32(data, pos-4); for (i = 0; i < n; i++) { sprintf(buf, "stops[%d]", i); xlog_param(xl, buf, FIXED for (i = 0; i < n; i++) { sprintf(buf, "stop_param(xl, "alpha", HEX16, FETCH16(data, pos+6)case EXT_RENDER | 0: /* RenderQueryVersion */ xlog_param(xl, "major-version", DECU, FETCH32(data, 8)); xlog_param(xl, "minor-version", DECU, FETCH32(data, 12)); break; case EXT_RENDER | 1: /* RenderQueryPictFormats */ { int i, n; int pos; /* * Go through the list of picture formats and save the * depth of each one. */ n = FETCH32(data, 8); pos = 32; for (i = 0; i < n; i++) { struct resdepth *gsd; struct resdepth *old; gsd = snew(struct resdepth); gsd->resource = FETCH32(data, pos); gsd->depth = FETCH8(data, pos+5); /* * Find any previous entry for this resource id, and * override it. */ old = del234(xl->resdepths, gsd); sfree(old); /* * Now add the new one. */ add234(xl->resdepths, gsd); pos += 28; } /* * Now reset pos, and log stuff as usual. */ n = FETCH32(data, 8); pos = 32; for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "formats[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "id", PICTFORMAT, FETCH32(data, pos)); xlog_param(xl, "type", ENUM | SPECVAL, FETCH8(data, pos+4), "Indexed", 0, "Direct", 1, (char *)NULL); xlog_param(xl, "depth", DECU, FETCH8(data, pos+5)); xlog_param(xl, "direct", SETBEGIN); xlog_param(xl, "red-shift", DECU, FETCH16(data, pos+8)); xlog_param(xl, "red-mask", HEX16, FETCH16(data, pos+10)); xlog_param(xl, "green-shift", DECU, FETCH16(data, pos+12)); xlog_param(xl, "green-mask", HEX16, FETCH16(data, pos+14)); xlog_param(xl, "blue-shift", DECU, FETCH16(data, pos+16)); xlog_param(xl, "blue-mask", HEX16, FETCH16(data, pos+18)); xlog_param(xl, "alpha-shift", DECU, FETCH16(data, pos+20)); xlog_param(xl, "alpha-mask", HEX16, FETCH16(data, pos+22)); xlog_set_end(xl); xlog_param(xl, "colormap", COLORMAP | SPECVAL, FETCH32(data, pos+24), "None", 0, (char *)NULL); xlog_set_end(xl); pos += 2 n = FETCH32(data, 12); for (i = 0; i < n; i++) { char buf[64]; int m, j, opos = pos; sprintf(buf, "screens[%d]", i); xlog_param(xl, buf, SETBEGIN); m = FETCH32(data, pos); pos += 8; for (j = 0; j < m; j++) { int l, k; sprintf(buf, "depths[%d]", j); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "depth", DECU, FETCH8(data, pos)); l = FETCH16(data, pos+2); pos += 8; for (k = 0; k < l; k++) { sprintf(buf, "visuals[%d]", k); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "visual", VISUALID | SPECVAL, FETCH32(data, pos), "None",0, (char *)NULL); xlog_param(xl, "format", PICTFORMAT, FETCH32(data, pos+4)); xlog_set_end(xl); pos += 8; if (k+1 < l && xlog_check_list_length(xl)) break; } xlog_set_end(xl); if (j+1 < m && xlog_check_list_length(xl)) break; } xlog_param(xl, "fallback", PICTFORMAT, FETCH32(data, opos+4)); xlog_set_end(xl) /* * FIXME: we ought to check the version from * RenderQueryVersion and use it to make this piece * conditional. */ n = FETCH32(data, 24); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "subpixels[%d]", i); xlog_param(xl, buf, ENUM | SPECVAL, FETCH8(data, pos), "Unknown",0, "HorizontalRGB",1, "HorizontalBGR",2, "VerticalRGB",3, "VerticalBGR",4, "None",5, (char *)NULL); pos++ break; case EXT_RENDER | 2: /* RenderQueryPictIndexValues */ { int i, n; int pos = 32; n = FETCH32values[%d]", i); xlog_param(xl, buf, SETBEGIN); xlog_param(xl, "pixel", HEX32, FETCH32(data, pos)); xlog_param(xl, "red", HEX16, FETCH16(data, pos+4)); xlog_param(xl, "green", HEX16, FETCH16(data, pos+6)); xlog_param(xl, "blue", HEX16, FETCH16(data, pos+8)); xlog_param(xl, "alpha", HEX16, FETCH16(data, pos+10)); xlog_set_end(xl); pos += 12EXT_RENDER | 3: /* RenderQueryDithers */ /* * This request is listed in renderproto/render.h but does * not include any description, so we'll just have to log it * as 'unable to decode reply data'. */ break; case EXT_RENDER | 29: /* RenderQueryFilters */ { int i, n; int pos = 32; n = FETCH32aliases[%d]", i); xlog_param(xl, buf, DECU, FETCH16(data, pos)); pos += 2 n = FETCH32(data, 12); for (i = 0; i < n; i++) { char buf[64]; sprintf(buf, "filters[%d]", i); xlog_param(xl, buf, STRING, FETCH8(data, pos), STRING(data, pos+1, FETCH8(data, pos))); pos += 1 + FETCH8(data, pos)case EXT_RENDER | 0: return "BadPictFormat"; case EXT_RENDER | 1: return "BadPicture"; case EXT_RENDER | 2: return "BadPictOp"; case EXT_RENDER | 3: return "BadGlyphSet"; case EXT_RENDER | 4: return "BadGlyph7�7<DE�EF!K5bEVBEG(F@HWFLJD NRD^DOFrD>G2NG4GfV'EsDCGHDQEVEQFPO\P,FFD/D*OV7DeOV7D*HPD9ExOG"GRH"ISDIE3G}HvNImKUH"E1WR8HmHRDlD}E&H G EEE*KxEECFeED%MF2EJD,DZE9F:ExD,EHDJD)FcDEDG@EEHvDZD*FeD,HEpFcDE}D9ExDgDED?D~D`D#DxF6JFwEGDDrFEZN EHFwE8D4D,IgF&EKxEIDIFLF2GNFF4E*DrH*DD]DE(O1K@FwDFGrEDFfE<EElDIEIG]EpHKIkD&DnEEEDjE<IJE<EsFoDPLFKD+D(FEYFNEDH+LOFEqD^FD,EIEG?IEI?QF G_GaQOHGmD!N4J_FNE!GvI0DzD3E7EZGxJ E7HwG;DDjF*I3DF*D E@FkD NE]EmEsI}ID]JmHnGDiDMDrL MH_H2DPDxG/F6DxG�J)D@DEIF3L*E?L*M{D/G"K*DG)DKJEF$FQF3D<FQLSHVE$M{GBGJF3G_F3LhJaE4HHG}NaP DDJDF?H1FV]Nda?F G"IE4G%DD4G0DDKFnElHDBF/M.F<ElF&IODRE%X$GvS@IFYH`mkGmS@LvShY|D2FYH)lkG"HNF0DEKbE%LxG;F7GJFMIQF(F7DEZI,F7GpD&H#\}G>DEO;D<D}PjI%P;XJLG8D6RxDIJF>E^D8DND.FuE G\MGdOLF_G(DJ9Y[HZG+E[]"V[EE^I%G�DxFOHYKEMQMQGQEdH{DHDADKHJ9GD F=H&E;R'G8KCIDD`[POE%HoE5G{F^P:EKKJ>D2E|DZIEqY b#_#Ep_#D"aEpE4E&FpEQFLH(LhDFEH&NVJtEXFlJZF"LIHNFcNpItI9VIPK%GHE0NfftOtGc~I#F/E@E#K5EQD\FEMJIVEHU FzI<G0I?D"E"GHF)GnDE/K"ERG?GDpK"DDIDlJ|DEBFDG^vE@GlGK/HDE%D D'K/E>G>FOGED K/I.DIDtJ/K/ID4D5E5K/F+XxLE6D DK/D]DEFDqL/K!D8E~E LI_D9HDwDBFFEImHQH?DHHGzDG%I+PUjfkeNfE4GDpO F1IHM�FVVfNEV_iMdKFSeGFD]HJDoEzG0P*GKDFEE:FVK6FOEpD<GtHaFzDpI9G(E]JzHlDENE%DwG+G)\DwHFF{LZGGEHQHU,OItNrF/D!F4DXH+DEJ*G%H F0D�EPDImG0E"JwI DJ6JvG%GlR1G'G5EbKhJMHIL.F3H G�FHBG4PnPID:EwFFMLWL}F:E}H[EE G}L%DeD DUIrDLEIHuP)G8c@FbFwPnG}KxFG}LL~JyDFD5ENE;D E<IAOoM4G�DzEHHDBDqK~RIGFFvEeKUJH[M EfIDw]FxI{ENFSDwHtOqFxI{E(_WO9FQJO_GGDxEyH{O G�I{DH%VDfDyLI!F+ELHRDEG)D5E)DDUDXLG!HHHHFVI?E-EpFFDK3DCNVH2E?D~J4E+EGFLqGnIHZE4Z~DuH9D0EtDvDvG-I_DPKJK DZD]EvMD]E$D%FBDLDLDD"DtE ED]D*E;HHHD9D]I8O0LHOID!F{IZFETIGtE,DtD H*E/FE8I![[F{H)HFJ\E9O*G E2K5F{H;DlG?D-D HBRjDwKG_E,EOG_DANfIP2K-D^E^EMGiD[D@GQM:F F DE_DyDETH0F GyE7E/H#DD D$D]F,EMD}D]DGpF0EDLD�DDJD-DDF5HUEXH6FML H6FaHUE9InE<EHMD/G(D|ESDsK%K"DwLJwE@H6DSDyDSH)IJH(DpE+IDD<G-H6WD^EMHJyERELFaQDmECQHH+H"FIDGJJ@DqEG&N!KVS.TMXAF(GVJMUG D%DME b@^X\n\XjOBSXD[@[1WnF,W1E9Z1KGwF=E DvDwDPE]EqGjE>F*DPE/FvUEK-EzLHJGWEJ&KH*RsD GHJEDqI*GDiI)FMEiHOFFzIRGDIEM)DEEEED3EHFDzDI.D�M;DDEFqE<ECD5JF2DJFAGqE]EdGSFrFGDeT+D0E<HGG-DWDjGGJJaHKH"H.DhFPJIE\DvDUFIDD9J|D&DFED)DvDGPE{D;DqHB@UI3D%G^DLEH*D4DQEEyH*JaZlHHNZlHYDvH<F`H1FD=EIDDuDGE GRQPFCFTEHTGEFoE~DFTEtF&L,E9I9DD*P/FfF~LzEF%GE6EGEXM;DDgFKDHHG~VKD?DNDvD GTD}D}DZE>E5EJ!DF D#G|EJDBMH[JYFF]DIrD4DDG H&H$D]D8E8DsFJhD EDFpIzIzEG]J&F\ISEHJ8HKD!D'MPDvE1FpD0GFHG�D�GpF|EpGAEBOJDGXHMFKH0ERJmJJJ^HeDQD E0DTE\HMTF%I)D~L;H+GeG[RFGFH?DmK;EUEFG)H+M'FIDE-EyEGE$DD8O7FoDsD{E6D~PvFOD!OvGvD#EzFXDLF%EzI/RsEV EV%EHV FlHorace a new program\n" " or: xt[options] -p <resource id>an X client by -selected interactively: -s <lengthset approximate limit on line -o <filend log output to a (default=stderr)e [<class>=][!]<item>[,...] ter the packets, where: is 'requests' or 'events'a name,allnone-IX server initialisa messageRalso give raw hex dump of sesstrafficCuncondially prefixideverydisplay <specify X (overrides $DISPLAY--verreport numberhelpthis textlicencee (MIT) ; void u(FILE *fp) { fputs(msg, fp); } const charmsg[] = "is copyright 1997-2009 Simon Tatham.PorRobert de Bath, Andreas Schultz, Jeroen Massar,Nicolas Barry, Justin Bradford, Ben Harris, Malcolm SmihmaKhalifa, Colin Watson, andX Consuermireby granted, freege,ny personbtaining asoftward associadocuments(\"S\")deal in withouttricincludsuse,, modifepublish,tribute, scenand/orliesowhomis furnishedo sosubjecfollowsThe abovenotiisshall b rstan THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KINDEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IES OFMERCHANTABILITY, FITNFOR A PARTICULAR PURPOSE ANDONINFRINGEMENT. IN NO EVENT SHALLCOPYRIGHT HOLDERS BE LIABLENY CLAIM, DAMAGR OTHERWHEIN AN ACTIONCONTRACT, TORTWISE, ARISFROM, OFN CONNEORUSDEALINGSExcept an,not bedvertisor otherwiseromotesaluseingsprior writteauthorizr(, stdout#defSVN_REV "$Revi$"rev[sizeof()];*p, *q; strcpy(rev,)for (p =; *p &&!= ':'; p++)if (*p++whisspace)q = p; *qq$'; qq)= '\0'printf(r %, } else: unknown\n"int main(argc,*argv) *fdlistnt fdi, fdcounttatelong nowlog= NULL*cmdnumhost[1024pid_txrecunsigdoing_opts = TRUE = = 0 = FALSE_to_log.=tree234(cmfg.x11_[0]-- > 0 = *++; == '-'!mp(p, "") || return} sval val f, \"%s\" expects an" "1}n,,of)-1inuep[p[2]) /*" tnatpar*//* no GNU-style currently suped'%nt cswitch (ccase 's':opeip '-%c' case"infyuned")ize atoibreak -scanf%x", &) &&0xXp " eia- struct *set * Mimicrmat: a ofcomma-separ,preceby !indicthat tho * th_not_ifurby aedby '='we'resomethaofbgged.(Conlyfigurabl_is_,ut I he machinin plnowbes siInticipmwelle.hr'='zlen""p-& keyword'-e': '%.* skip /* Iabsofoo=,*toeXwhiche. !->/* Emptpouif1delpos0q s(qp, ',*q++just aholderall * Sal:iset, so whavflip''meerrr!/*wihangs adnadddupstr(p)qwI__startuRraw_hex_C_id/* Nmmand-yetCmy-side ,ourseAmode, w ourne detailn'tk?Loggfig:,, tunequ}!&& !cmmrur -p; sk_xselrandom_ref/* FIXME:assum doesflowechniciffge(d nee morfgxfopen, "wen():error(errnoignal(SIGCHLD,chldx11 =_setupX11_MITfg_(, 1 directory? Aeastok at TMPDIR etc="/tmp/-ty-Xd, oldumasSockAddrrcanobuf[numstr[6 = (077 = mkstemp(d"wb=_up6000 + , ADDRTYPE_IPV4sk_(,/* Big-endian 2-byt: zeroaIPv4c(0,-4he IPesbinar4ebuf, 1, /* Srmsd"strlen) >> 8& 0xFFsgivtyp->reprotodata itselflenclosepiid <"linkexit(=utenv(dup=%s:XAUTHORIT"ecvp(cmd[0],2ild= GETTICKCOUNTfd rwxmaxrwxFD_ZERO(&Cifirst_fd(&, &rwx); fd >nex) iExpbufff necryf (i >i + 16sre(in * Addsstor*mas./[++rwx & 1FD_SET_MAX(,24doext, tickstimetv, *ptun_rs(n& -0intv.tv_se/ 100u% *ptvr(, , , ptv w* Checkseee sy clock had mass du-< 0>nowIfelap*icom_offseow + 'keinstead. H.. +=-}&& EINTRfflush( i <;i/* * Wepro efbefordreadability onermay gopasurgmarker.FD_ISSET_result2 Revision-number: 8558 Prop-content-length: 531 Content-length: 531 K 7 svn:log V 430 Pango-based font handling: combine display of adjacent characters into a single gdk_draw_layout() where conveniently feasible, after some work with xtrace revealed this as a major source of pterm's slow display updates when using client-side fonts. Ideally we ought to be able to do better. I know exactly what sequence of X protocol operations I want to see on the wire, but I don't know how to persuade Pango to generate them. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-05-11T08:46:17.634698Z PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f86ce9bba1a1068480a691e199251417 Text-delta-base-sha1: 9856da966f01905a86613b9c4b8a18a34285781c Text-content-length: 1909 Text-content-md5: 2233f7042c67fea635083c79cc936122 Text-content-sha1: 627a1162dad67c117df69cb78248fb155696f24d Content-length: 1909 SVN��z`43�P�-�D�e;��"�'�F4, n; /* * We want to display every character from this string in * the centre of its own character cell. In the worst case, * this requires a separate text-drawing call for each * character; but in the common case where the font is * properly fixed-width, we can draw many characters in one * go which is much faster. * * This still isn't really ideal. If you look at what * happens in the X protocol as a result of all of this, you * find - naturally enough - that each call to * gdk_draw_layout() generates a separate set of X RENDER * operations involving creating a picture, setting a clip * rectangle, doing some drawing and undoing the whole lot. * In an ideal world, we should _always_ be able to turn the * contents of this loop into a single RenderCompositeGlyphs * operation which internally specifies inter-character * deltas to get the spacing right, which would give us full * speed _even_ in the worst case of a non-fixed-width font. * However, Pango's architecture and documentation are so * unhelpful that I have no idea how if at all to persuade * them to do that. */ /* * Start by extracting a single UTF-8 character from the * n = 1; /* * See if that character has the width we expect. */ if (rect.width == cellwidth) { /* * Try extracting more characters, for as long as they * stay well-behaved. */ while (clen < len) { int oldclen = clen; clen++; /* skip UTF-8 introducer byte */ while (clen < len && (unsigned char)string[clen] >= 0x80 && (unsigned char)string[clen] < 0xC0) clen++; n++; pango_layout_set_text(layout, string, clen); pango_layout_get_pixel_extents(layout, NULL, &rect); if (rect.width != n * cellwidth) { clen = oldclen; n--; break; } } }n*n*n * Revision-number: 8559 Prop-content-length: 219 Content-length: 219 K 7 svn:log V 118 Fix bug when a command-line option takes a value concatenated with it, e.g. "-ofilename" as opposed to "-o filename". K 10 svn:author V 5 simon K 8 svn:date V 27 2009-05-11T09:08:46.611994Z PROPS-END Node-path: putty-spinoffs/unix/uxxtrace.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1016dcfdc69e6531fcc0326d6a4b82d6 Text-delta-base-sha1: aad6f7cf65a9d5c5ee021501263c4fa098645e52 Text-content-length: 144 Text-content-md5: 0f964c67612989b146939a6ef9db43b2 Text-content-sha1: fc8dbdb26949e1367431d3756c7951b9cd37f20b Content-length: 144 SVN����������������6 Z�5�Z�'t { val = p; p += strlen(p); } else if (--argc > 0) { val = *++argv; } Revision-number: 8560 Prop-content-length: 237 Content-length: 237 K 8 svn:date V 27 2009-05-11T09:13:56.931635Z K 7 svn:log V 136 Tweak development Makefile so that it no longer claims to be GTK-based (and also doesn't depend on Kerberos which it doesn't even use). K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 17d2582c715cfccdafbef4dec2da1bee Text-delta-base-sha1: 19c5745951139f1f4c4d930ea3010f8b5c8792f2 Text-content-length: 39 Text-content-md5: 7cea37a11adc689f89939c84d415943d Text-content-sha1: 1d90d2a919eff6e2a0063bb50e994ac3d913433a Content-length: 39 SVN��m< �o��;2unix unix/Makefile Node-path: putty-spinoffs/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 11f93bd14d56b11d30b57dc762d51506 Text-delta-base-sha1: 25419910da6d297e02059ec636603dd280be307b Text-content-length: 312 Text-content-md5: 0fbff3e4bdc65e05f98852978a089f0a Text-content-sha1: 0e3f4b91f6f0b295ef612c4ee9317e886c8b5a81 Content-length: 312 SVN�� z9q�&���#?�s:�ls� � �<(�M7�Y4"uniunix'}) { $dirpfx = &dirpfx($makefiles{'unix'}, "/"); ##-- Plain Unix makefile open OUT, ">$makefiles{'unix'}"; select OUT; print "# Makefile for $project_name under Unix/opt/gcc/bin\n". "CC = \$(TOOLPATH)ccunixU Revision-number: 8561 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2009-05-11T09:18:14.554340Z K 7 svn:log V 126 *blinks* How did I manage to commit xtrace.1 instead of its source xtrace.but? I can only assume I was three-quarters asleep. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/doc/xtrace.but Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 7761 Text-content-md5: e68da59527c65a9368e0b01c2b3bba2c Text-content-sha1: 04f00dcf49dc9102a08f8faeaece019a303b4dd3 Content-length: 7771 PROPS-END SVN���CCC\cfg{man-identity}{xtrace}{1}{2009-05-02}{PuTTY spinoffs}{PuTTY spinoffs} \define{dash} \u2013{-} \H{xtrace-manpage} Man page for xtrace \S{xtrace-manpage-name} NAME \cw{xtrace} \dash trace X protocol exchanges, in the manner of \cw{strace} \S{xtrace-manpage-synopsis} SYNOPSIS \c xtrace [ options ] command [ command-arguments ] \e bbbbbb iiiiiii iiiiiii iiiiiiiiiiiiiiiii \c xtrace [ options ] -p X-resource-ID \e bbbbbb iiiiiii bb iiiiiiiiiiiii \c xtrace [ options ] -p - \e bbbbbb iiiiiii bb b \S{xtrace-manpage-description} DESCRIPTION \cw{xtrace} is a utility which logs everything that passes between the X server and one or more X client programs. In this it is similar to \cw{xmon}(1), but intended to combine \cw{xmon}'s basic functionality with an interface much more similar to \cw{strace}(1). Unlike \cw{xmon}, you don't have to start the trace utility in one terminal and manually attach processes to it from another. The principal mode of use is just to type \cw{xtrace} followed by the command line of your X program; \cw{xtrace} will take care itself of setting up an X proxy and adjusting the new program's environment to point at it, and (also unlike \cw{xmon}) it will also take care of setting up X authorisation automatically. As an alternative mode of use, you can also attach \cw{xtrace} to an already-running X application, if you didn't realise you were going to want to trace it until it had already been started. This mode requires cooperation from the X server \dash specifically, it can't work unless the server supports the \cw{RECORD} protocol extension \dash but since modern X.Org servers do provide that, it's often useful. The logging format of \cw{xtrace} is much more compact than that of \cw{xmon}, and resembles \cw{strace} in that it's written to look like a series of function calls some of which return values. For instance, where \cw{xmon} would print \c ............REQUEST: GetSelectionOwner \c sequence number: 000f \c request length: 0002 \c selection: <PRIMARY> \c ..............REPLY: GetSelectionOwner \c sequence number: 000f \c reply length: 00000000 \c owner: WIN 02c0002b \c ............REQUEST: InternAtom \c sequence number: 0010 \c only-if-exists: False \c request length: 0005 \c length of name: 000c \c name: "VT_SELECTION" \c ..............REPLY: InternAtom \c sequence number: 0010 \c reply length: 00000000 \c atom: ATM 000002bf \cw{xtrace} will instead print \c GetSelectionOwner(selection=a#1) = {owner=w#02C0002B} \c InternAtom(name="VT_SELECTION", only-if-exists=False) = {atom=a#703} Note that not only has each request been condensed on to one line (though most lines will be long enough to wrap, at least on a standard 80-column terminal), but also each request and reply have been printed on the \e{same} line. That last is not always possible, of course: sometimes an application will queue multiple requests before receiving the reply to the first one (in fact, this is generally good behaviour since it minimises network round-trip delays), in which case \cw{xtrace}'s output will look \dash again mimicking \cw{strace} \dash something like this: \c InternAtom(name="TARGETS", only-if-exists=False) = <unfinished> \c InternAtom(name="TIMESTAMP", only-if-exists=False) = <unfinished> \c ... InternAtom(name="TARGETS", only-if-exists=False) = {atom=a#378} \c ... InternAtom(name="TIMESTAMP", only-if-exists=False) = {atom=a#379} \S{xtrace-manpage-options} OPTIONS If you want to attach \cw{xtrace} to an already-running X client, then instead of specifying a command to run you should give the following option: \dt \cw{-p} \e{resource-ID} \dd Attach to the X client owning the given resource, using the X \cw{RECORD} extension (which the server must support for this to work). The resource ID can be a decimal integer or a hex integer preceded with \cq{0x}. It typically names an X window, but can name another type of resource instead (e.g. a pixmap or cursor) or just specify the resource base of the client connection. If you don't know any of those things, you can give the resource ID as just \cq{-}, in which case \cw{xtrace} will allow you to interactively select a window by clicking with the mouse (similarly to \cw{xkill}(1), \cw{xwininfo}(1) and \cw{xprop}(1)) and will trace the client that owns the window you select. The following options apply to both modes of operation: \dt \cw{-s} \e{length} \dd Limit the length of output lines by eliding most of the contents of long arrays, strings and blocks of data. \cw{xtrace} will begin to shorten lines at the specified length (any line shorter than that should not be interfered with), but lines cannot always be chopped to the exact length and continue to make sense, so the line length is approximate only. Specifying zero or \cq{unlimited} will remove all restriction, so that \cw{xtrace} will display the full contents of every request it understands, no matter how big. Default is 256. \dt \cw{-o} \e{filename} \dd Send the trace output to the specified file. The default is to log to standard error. \dt \cw{-e} [\e{class}\cw{=}][\cw{!}]\e{item}[\cw{,}\e{item}...] \dd Specify a subset of X requests or X events to log. \e{class} can be either \cq{requests} or \cq{events}; if the class is omitted, \cq{requests} is assumed. The list of \e{item} gives a list of X request names or X event names (respectively) to be logged; all other requests or events are omitted. If the list of items is prefixed with \cw{!}, it is instead treated as a list of requests or events \e{not} to be logged, and anything not in the list is printed. Reply and error packets are not separately filtered: they are logged if and only if the request they respond to was logged. \lcont{ For example, to log only \cw{ImageText8} and \cw{ImageText16} requests, you might say \q{\cw{xtrace -e requests=ImageText8,ImageText16} \e{command}} or just \q{\cw{xtrace -e ImageText8,ImageText16} \e{command}}. To inhibit the display of \cw{FocusIn} and \cw{FocusOut} events, you might say \q{\cw{xtrace -e events=!FocusIn,FocusOut} \e{command}}. (Note that the \cw{!} character might be treated specially by your shell, so you may need to escape it.) } \dt \cw{-I} \dd Log the initialisation message sent by the X server at the start of the connection. This is omitted by default because it's particularly long and ugly. \dt \cw{-R} \dd As well as translating the X protocol, also give a raw hex dump of all the data transferred over the connection. (Probably most useful to include in a bug report about \cw{xtrace} itself!) \dt \cw{-C} \dd Prefix every output line with the X client id (resource base) of the client connection it came from. By default \cw{xtrace} only starts to do this if it's tracing more than one X client; before then, lines are unprefixed. This option makes prefixing unconditional from the start of the run. \S{xtrace-manpage-bugs} BUGS Many commonly used X protocol extensions are not currently decoded. A lot of this program has been only minimally tested. This man page doesn't really go into enough detail about how the proxying works. \S{xtrace-manpage-licence} LICENCE \cw{xtrace} is free software, distributed under the MIT/X11 licence. Type \cw{xtrace --licence} to see the full licence text. Node-path: putty-spinoffs/doc/xtrace.1 Node-action: delete Revision-number: 8562 Prop-content-length: 208 Content-length: 208 K 8 svn:date V 27 2009-05-11T09:20:29.641374Z K 7 svn:log V 107 Rename to 'xtruss', since the name 'xtrace' turned out to be taken (bah, but not surprising in hindsight). K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7cea37a11adc689f89939c84d415943d Text-delta-base-sha1: 1d90d2a919eff6e2a0063bb50e994ac3d913433a Text-content-length: 41 Text-content-md5: b6cb6793056053bfc91693d52d5b05bc Text-content-sha1: 5154fa6b44551ed10eed92edffe041e9257c15b3 Content-length: 41 SVN��<< �&��:uss : [U] uxxtruss Node-path: putty-spinoffs/doc/xtruss.but Node-kind: file Node-action: add Node-copyfrom-rev: 8561 Node-copyfrom-path: putty-spinoffs/doc/xtrace.but Text-copy-source-md5: e68da59527c65a9368e0b01c2b3bba2c Text-copy-source-sha1: 04f00dcf49dc9102a08f8faeaece019a303b4dd3 Prop-delta: true Prop-content-length: 34 Text-delta: true Text-delta-base-md5: e68da59527c65a9368e0b01c2b3bba2c Text-delta-base-sha1: 04f00dcf49dc9102a08f8faeaece019a303b4dd3 Text-content-length: 937 Text-content-md5: ad0861a50135da00d5766082e77c704c Text-content-sha1: 4a669bf312f420a0e984fe830071f1b48af38e11 Content-length: 971 K 13 svn:mergeinfo V 0 PROPS-END SVN��CCi4%�c%5�/=�+�{6�4�}G�tG�zy�v�; �SJJ�g�m�t�0 �i>r*\cfg{man-identity}{xtruss}{1}{2009-05-02}{PuTTY spinoffs}{PuTTY spinoffs} \define{dash} \u2013{-} \H{xtruss-manpage} Man page for xtruss \S{xtruss-manpage-name} NAME \cw{xtruss} \dash trace X protocol exchanges, in the manner of \cw{strace} \S{xtruss-manpage-synopsis} SYNOPSIS \c xtrussuss [ options ] -p X-resource-ID \e bbbbbb iiiiiii bb iiiiiiiiiiiii \c xtruss [ options ] -p - \e bbbbbb iiiiiii bb b \S{xtruss-manpage-description} DESCRIPTION \cw{xtrussuss} followed by the command line of your X program; \cw{xtrussussussussussuss-manpage-options} OPTIONS If you want to attach \cw{xtrussussussussuss -e requests=ImageText8,ImageText16} \e{command}} or just \q{\cw{xtrussussussussussuss-manpage-licence} LICENCE \cw{xtruss} is free software, distributed under the MIT/X11 licence. Type \cw{xtruss Node-path: putty-spinoffs/doc/xtrace.but Node-action: delete Node-path: putty-spinoffs/unix/uxxtruss.c Node-kind: file Node-action: add Node-copyfrom-rev: 8559 Node-copyfrom-path: putty-spinoffs/unix/uxxtrace.c Text-copy-source-md5: 0f964c67612989b146939a6ef9db43b2 Text-copy-source-sha1: fc8dbdb26949e1367431d3756c7951b9cd37f20b Prop-delta: true Prop-content-length: 34 Text-delta: true Text-delta-base-md5: 0f964c67612989b146939a6ef9db43b2 Text-delta-base-sha1: fc8dbdb26949e1367431d3756c7951b9cd37f20b Text-content-length: 1041 Text-content-md5: 420c2c97bf7d600806448196a1107505 Text-content-sha1: 1055eb0bf27405c237e4d06b63e5709779a55bdb Content-length: 1075 K 13 svn:mergeinfo V 0 PROPS-END SVN����(J�7?v�ll�1d�E�Z`�C=/* * xtruss: looks like strace, quacks like xmon. * * xtrussuss', e.g. * 'xtruss xterm -fn 9x15'. If your X server supports the X RECORD * extension, you can also attach xtrussuss..ussussuss char buf[64]; for (mod = 0; mod < 8; mod++) { sprintf(buf, "modifier[%d]", mod); xlog_param(xl, buf, SETBEGIN); for (i = 0���{h�k�r��32�ah�kL�M:�= �sJ�w@�3:�`p�#S�8y�M:�|�1�78ussussussussussussussussussussussussussussussussuss [options] command [command arguments] trace a new program\n" " or: xtruss [options] -p <resource id> trace an X client by resource id\n" " or: xtruss [options] -p�6/HP�iz�j�(u�X�Br�w7�W1�H � V�6c�(�oGuss --version report version number\n" " xtruss --help display this help text\n" " xtrussussuss revision %s\n", p); } else { printf("xtrussussussussussussussussuss Node-path: putty-spinoffs/unix/uxxtrace.c Node-action: delete Revision-number: 8563 Prop-content-length: 273 Content-length: 273 K 7 svn:log V 172 Nasty hack involving a watchdog subprocess to try to clean up xtruss's authority files even when xtruss dies of a signal. (I wonder if there's a proper way to do this...) K 10 svn:author V 5 simon K 8 svn:date V 27 2009-05-11T09:34:50.892048Z PROPS-END Node-path: putty-spinoffs/unix/uxxtruss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 420c2c97bf7d600806448196a1107505 Text-delta-base-sha1: 1055eb0bf27405c237e4d06b63e5709779a55bdb Text-content-length: 1090 Text-content-md5: 63700639e99d9bc1e8b2849287fb53cf Text-content-sha1: cd0319de06f8677e33ad2387ff56c568bced7452 Content-length: 1090 SVN���� Y�*��}Y; i < keycodes_per_modifier; i++) { sprintf(buf, "keycodes[%d]", i); xlog_par���W�c�kH�m#undef read /* to avoid shadowing the Unix system call, for the below */ - trac�/f>�F�nT>�t;/* * Spawn a subprocess which will try to reliably delete our * auth file when we terminate, in case we die by ^C. */ { int cleanup_pipe[2]; pid_t pid; /* Don't worry if pipe or fork fails; it's not _that_ critical. */ if (!pipe(cleanup_pipe)) { if ((pid = fork()) == 0) { int buf[1024]; /* * Our parent process holds the writing end of * this pipe, and writes nothing to it. Hence, * we expect read() to return EOF as soon as * that process terminates. */ setpgid(0, 0); close(cleanup_pipe[1]); while (read(cleanup_pipe[0], buf, sizeof(buf)) > 0); unlink(authfilename); exit(0); } else if (pid < 0) { close(cleanup_pipe[0]); close(cleanup_pipe[1]); } else { close(cleanup_pipe[0]); cloexec(cleanup_pipe[1]); } } } Revision-number: 8564 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8565 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8566 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8567 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8568 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8569 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8570 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8571 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8572 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8573 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8574 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8575 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8576 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8577 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2009-05-11T18:48:43.201939Z K 7 svn:log V 114 Add a 'unix' Makefile type, for building the non-GUI parts of the PuTTY suite on non-GTK-enabled build platforms. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 946448259ee5c71f92d077d71df7a0bb Text-delta-base-sha1: c84e6de77891911d9b72e677bbd495db909730b5 Text-content-length: 42 Text-content-md5: 5aae5a9fbc5c7fdba58d7886a5d92c27 Text-content-sha1: dd937368c6cdac049adafeb0c42a68e94d3229ab Content-length: 42 SVN��s �>��@3unix unix/Makefile.ux Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 11f93bd14d56b11d30b57dc762d51506 Text-delta-base-sha1: 25419910da6d297e02059ec636603dd280be307b Text-content-length: 405 Text-content-md5: 26463293a11eea1beb7a07617d053f04 Text-content-sha1: d6a3390a1b3d71e1996496bf613c72d54c4a83a6 Content-length: 405 SVN�� iT3��� ]�s:� ?�b}�m�cB�(�>�[�qo�`c�HEunix", "ac","mpw",unix'}) { $dirpfx = &dirpfx($makefiles{'unix'}, "/"); ##-- GTK-free pure-Unix makefile for non-GUI apps only open OUT, ">$makefiles{'unix'}"; select OUT; print "# Makefile for $project_name under Unix). " -D _FILE_OFFSET_BITS=64unixU")); print "\n\n";unixunix Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 237 Content-length: 237 K 10 svn:ignore V 204 Makefile.gtk Makefile.in Makefile.ux Makefile.local Makefile aclocal.m4 autom4te.cache config.status configure install-sh local plink pterm putty puttytel psftp pscp puttygen uxconfig.in uxconfig.h *.log PROPS-END Revision-number: 8578 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8579 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8580 Prop-content-length: 205 Content-length: 205 K 7 svn:log V 104 Essential mirror maintenance: address explicit admin requests for removal, renaming, and reinstatement. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-05-17T11:14:11.792037Z PROPS-END Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c566d8e82f872c28ad64d87cd10059d4 Text-delta-base-sha1: d5f2be9486e30b9199029e8fdad3cf50eff28b53 Text-content-length: 581 Text-content-md5: b74dcb1a0b8268ba4b9c0cdd46bdff5e Text-content-sha1: f95d53e8adef2146a94e680738b5e5215a263fdb Content-length: 581 SVN��p_X�6��P@�Z3�J@�^8�^8� D�&r�P@�J@�xt�N=�be�b~�X��;�b~�[kinghost.net/">putty.kinghost.net</a> in Brazilzone-h.org/">putty.zone-h.org</a> in Estoniamirror.cedratnet.com/putty/">mirror.cedratnet.comwandis.com/">putty.wandis.comwww.putty.spb.ru/">www.putty.spb.ru</a> in Russia<!--MIRRORSTATUS-->www.putty.se/">putty.se</a> in Swedentx.se/">putty.tx.se</a> in Swedenthaismartnetwork.com/">putty.thaismartnetwork.com</a> in Thaimirrors.bbnx.net/putty/">mirrors.bbnxleetnet.com/">putty.leetnet.comnet/goldeneye/putty/">tprinteractive Revision-number: 8581 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8582 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8583 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8584 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8585 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8586 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8587 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8588 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8589 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8590 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8591 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8592 Prop-content-length: 368 Content-length: 368 K 8 svn:date V 27 2009-06-10T17:42:15.724913Z K 7 svn:log V 267 Clearing and refilling the code-pages list box can cause a re-entrant call to its handler in config.c, which destroys the previous value in cfg->line_codepage. Therefore, preserve the right value in an automatic variable until all the re-entrant calls have finished. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ab0c6ffc83e2d463289df1aeda1f7b45 Text-delta-base-sha1: 393f24e6754d3e9acc4bd5a2d728f5afcc131f87 Text-content-length: 172 Text-content-md5: 35e2245bfe27557542f2cb5604b77d40 Text-content-sha1: 7c59a57f6c273b7daaaeb849a3cec73f8b7a9100 Content-length: 172 SVN��_f�=�]�,�l�@, *thiscp; dlg_update_start(ctrl, dlg); thiscp = cp_name(decode_codepage(cfg->line_codepagethiscp); strcpy(cfg->line_codepage, thiscp Revision-number: 8593 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8594 Prop-content-length: 241 Content-length: 241 K 8 svn:date V 27 2009-06-15T20:45:37.181192Z K 7 svn:log V 140 Launchpad has a means of tracking bugs in upstream PuTTY (i.e., us) as well as in Ubuntu's package, so that should probably be linked here. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7324db426e03edbe0b78376bfee1a90d Text-delta-base-sha1: 2a00c3504c1c44a61cb3dfb364e2bb89dcaa9453 Text-content-length: 157 Text-content-md5: 466a9c0bbf2a967e9dd1921de3eaa027 Text-content-sha1: f3c435c99e8f65de8113d6798911829fbe91e628 Content-length: 157 SVN��k. �a��J!Launchpad (<a href="https://bugs.launchpad.net/putty">us</a>, <a href="https://bugs.launchpad.net/ubuntu/+source/putty">Ubuntu</a>) Revision-number: 8595 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8596 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8597 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8598 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8599 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8600 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8601 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8602 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8603 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8604 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8605 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8606 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8607 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 30 Typo: replace a \i with a \I. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-07-12T12:02:58.209225Z PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a46649b2fbb80e0f65285716c28ebad0 Text-delta-base-sha1: 6741403c90c5b82ccbf99709229c67cc71b308c4 Text-content-length: 24 Text-content-md5: e928537c287a7cb93cdf5ee99016e2f8 Text-content-sha1: bce61f1b77bb73a5c26c7b1adc20b4077a4bfb75 Content-length: 24 SVN��`` �R�� SI Revision-number: 8608 Prop-content-length: 247 Content-length: 247 K 8 svn:date V 27 2009-07-28T23:20:50.140339Z K 7 svn:log V 146 Include putty.h (and hence uxconfig.h) before testing for NO_GSSAPI, so that "./configure --without-gssapi" actually works. Spotted by Rob Shinn. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3a1aca1b2c4188c82c4ed6440ad79122 Text-delta-base-sha1: fb507e57e0b9d7091a197cd94b52e650738f4b17 Text-content-length: 39 Text-content-md5: 5477a3198e82f9611f9abac16a27a7aa Text-content-sha1: 0e691ec621553180c2be46c06bbd767927631978 Content-length: 39 SVN��!"�L��B_#include "putty.h" Revision-number: 8609 Prop-content-length: 242 Content-length: 242 K 7 svn:log V 141 Mention Makefile.ux. Be less certain about the possibility of building with vanilla VC6. Provide more details of actively tested toolchains. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-07-28T23:30:38.842393Z PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ce2d8481cf79ed0ce82bc72f4aabf59e Text-delta-base-sha1: c782d399183da5af71dbaa5582183424ba7924ae Text-content-length: 662 Text-content-md5: 266fd0f9295d07f746327ed01d50fef7 Text-content-sha1: 4019a3219a1229155a018bf2a60903480e2ccb57 Content-length: 662 SVN��IMo�W�t�K5�]�= might still be possible to build with vanilla VC6, but you'll certainly have to remove some functionality with(with VC7) and Makefile.cyg (with mingw32), so we'll probably notice problems with those toolchains fairly quickly. Please report any problems with the other and unix/Makefile.ux are for non-autoconfigured builds. These makefiles expect you to change into the `unix' subdirectory, then run `make -f Makefile.gtk' or `make -f Makefile.ux' respectively. Makefile.gtk builds all the programs but relies on Gtk, whereas Makefile.ux builds only the command-line utilities and has no Gtk dependence Revision-number: 8610 Prop-content-length: 265 Content-length: 265 K 8 svn:date V 27 2009-07-28T23:45:48.795349Z K 7 svn:log V 164 Alex Besogonov suggests that our Unix autoconf GSSAPI library search order is sub-optimal -- apparently it prefers shishi above Heimdal, and apparently that's bad. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7d41721b5235f5dc7d769b65eccccea Text-delta-base-sha1: 0e67f6a0652ad06adb37733bc0469d9c53f1ea38 Text-content-length: 40 Text-content-md5: 13c8d201a8d8f029e6cb025c44c55834 Text-content-sha1: 49da458b0db9505e2306fb0be25999d9b99313d0 Content-length: 40 SVN��;; �T��Tgapi gssapi_krb5 gss Revision-number: 8611 Prop-content-length: 112 Content-length: 112 K 7 svn:log V 12 Formatting. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-08-06T19:40:27.673194Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 466a9c0bbf2a967e9dd1921de3eaa027 Text-delta-base-sha1: f3c435c99e8f65de8113d6798911829fbe91e628 Text-content-length: 24 Text-content-md5: 21c683b481c72cc3f954b64199e9d265 Text-content-sha1: fb3ac033bacc0aefb7599974248b1c478261546e Content-length: 24 SVN��./ �d��Jd, Revision-number: 8612 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2009-08-06T22:12:05.451986Z K 7 svn:log V 106 Avoid "dereferencing pointer 'sa' does break strict-aliasing rules" warnings from recent versions of GCC. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef69ffcbb3c031c297a5b55637639c90 Text-delta-base-sha1: 28d19cb90cbf161a3a58bec4b30453b1f08bd3bd Text-content-length: 857 Text-content-md5: 3e8efca36be89e88ce0b6b20ab229e4a Text-content-sha1: a0d6c3dad08039b0a926b2f8e1c38ea794c88931 Content-length: 857 SVN�� g1�c��6__�DL�R�hmA�yv� � * Access to sockaddr types without breaking C strict aliasing rules. */ union sockaddr_union { #ifdef NO_IPV6 struct sockaddr_in storage; #else struct sockaddr_storage storage; struct sockaddr_in6 sin6; #endif struct sockaddr sa; struct sockaddr_in sin; };union sockaddr_union *u = (union sockaddr_union *)sa; switch (u->sa.sa_family) { case AF_INET: return ipv4_is_loopback(u->sin.sin_addr); #ifndef NO_IPV6 case AF_INET6: return IN6_IS_ADDR_LOOPBACK(&u->sin6. union sockaddr_union uu); if (getsockname(s->s, &u.sa, &addrlen) < 0) return NULL; switch(u.sa.u.sin.sin_addr.s_addr)); PUT_16BIT_MSB_FIRST(buf+4, ntohs(u.sin.u.sin6.sin6_addr)) { memcpy(buf, u.sin6.sin6_addr.s6_addr + 12, 4); PUT_16BIT_MSB_FIRST(buf+4, ntohs(u.sin6. Revision-number: 8613 Prop-content-length: 189 Content-length: 189 K 7 svn:log V 89 More use of sockaddr_union (above and beyond that necessary to remove current warnings). K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-08-06T22:55:15.637840Z PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3e8efca36be89e88ce0b6b20ab229e4a Text-delta-base-sha1: a0d6c3dad08039b0a926b2f8e1c38ea794c88931 Text-content-length: 2274 Text-content-md5: 48096b0679dfe7fd561b4f1e9a65bb6d Text-content-sha1: 908d7d27e6cdc60f3313c103dbb77cc8addf761f Content-length: 2274 SVN��g v^�y��$w�9�VAb�#|�Gz�vu�bz4�w�xP�(JR�KY~� +�G@��gs:�Y_�N struct sockaddr_un su union sockaddr_union u; const union sockaddr_unionu,'\0',sizeof(u));u.sin6.sin6_family = AF_INET6; u.sin6.sin6_addr = in6addr_any; u.sin6.sin6_port = htons(localport); retcode = bind(s, &u.sa, sizeof(u.sin6)); } else #endif { assert(family == AF_INET); u.sin.sin_family = AF_INET; u.sin.sin_addr.s_addr = htonl(INADDR_ANY); u.sin.sin_port = htons(localport); retcode = bind(s, &u.sa, sizeof(u.sinunion sockaddr_unionunion sockaddr_unionu.sin.sin_family = AF_INET; u.sin.sin_addr.s_addr = htonl(sock->addr->addresses[sock->step.curraddr]); u.sin.sin_port = htons((short) sock->port); sa = &u; salen = sizeof u.sinu.su.sun_path); u.su.sun_family = AF_UNIX; strcpy(u.su.sun_path, sock->addr->hostname); sa = &u; salen = sizeof u.s&(sa->sa)#endif union sockaddr_union u; union sockaddr_union *addr; int addrlen(union sockaddr_union *)ai->ai_addr; addrlen = ai->ai_addrlen; } #else memset(&u,'\0',sizeof u); u.sin.sin_family = AF_INET; u.sin.sin_port = htons(port); u.sin.sin_addr.s_addr = inet_addr(srcaddr); if (u.sinu.sin.sin_addr); } addr = &u; addrlen = sizeof(u.sin); retcode = 0; #endif } if (retcode != 0) { memset(&u,'\0',sizeof u);u.sin6.sin6_family = AF_INET6; u.sin6.sin6_port = htons(port); if (local_host_only) u.sin6.sin6_addr = in6addr_loopback; else u.sin6.sin6_addr = in6addr_any; addr = &u; addrlen = sizeof(u.sin6); } else #endif { u.sin.sin_family = AF_INET; u.sin.sin_port = htons(port); if (local_host_only) u.sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); else u.sin.sin_addr.s_addr = htonl(INADDR_ANY); addr = &u; addrlen = sizeof(u.sin); } } retcode = bind(s, &addr->sa union sockaddr_union su; socklen_t addrlen = sizeof(su); int t; /* socket of connection */ int fl; memset(&su, 0, addrlen); t = accept(s->s, &su.sa&su.sa Revision-number: 8614 Prop-content-length: 299 Content-length: 299 K 7 svn:log V 198 Workarounds for compiling with -D_FORTIFY_SOURCE=2 (as Ubuntu does), which doesn't like you to ignore the return value from read()/write()/etc (and apparently can't be shut up with a cast to void). K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-08-07T00:19:04.516604Z PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25088e5260a54bed52852a6cb3f68c04 Text-delta-base-sha1: 6c8ce5589fe150879adc246d0ffcbba897863584 Text-content-length: 117 Text-content-md5: 03d7e44056e7da7fe38ea0c96fbd8fd0 Text-content-sha1: d661953d1437431af9ceb9d8090e6ea8fa49bd34 Content-length: 117 SVN��i( _�k�_�^ if (fwrite(data, 1, len, ctx->lgfp) < len) { logfclose(ctx); ctx->state = L_ERROR; } Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a5e5fefcb3521af9f07461321f1cc0f8 Text-delta-base-sha1: 255a9b758592d7cf0fa38b5a25f025a14977a5ad Text-content-length: 79 Text-content-md5: 903f507aeb6b5a66632d35644edc5661 Text-content-sha1: a543699e32c739ede817c3bedda7b5bd449f9d3c Content-length: 79 SVN��Xs 7�{��Aif (fwrite(data, 1, len, stderr) < len) /* oh well */ Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48f2d63dc664a04e91e3f263499e71ec Text-delta-base-sha1: 9c94edb36244078e98eaed440f6971ad51a001fa Text-content-length: 80 Text-content-md5: a1e7c17e2192ba07e2a1f619323d310a Text-content-sha1: 75deb186b7f6c73497b2ba9a41264a12cffc7d17 Content-length: 80 SVN�� 7�z��mif (fwrite(data, 1, len, stderr) < len) /* oh well */ Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 26028993fd3e3179a1a577aa5f123755 Text-delta-base-sha1: 3df66ad269cb7ed8d92ebb3ea8b2886fabe573d2 Text-content-length: 235 Text-content-md5: c80f9590993ac27aa04c8fe03fa9ef33 Text-content-sha1: 02707abc24bd0b9740d7c96b7a6b5aae3e1db6e3 Content-length: 235 SVN��'F��B�M&B�B�q6if (read(0, line, sizeof(line) - 1) <= 0) /* handled below */if (read(0, line, sizeof(line) - 1) <= 0) /* handled below */if (read(0, line, sizeof(line) - 1) <= 0) /* handled below */ Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 178221e6850620da60774f602e85e3ac Text-delta-base-sha1: c4ae928532a20a6e100aa4bc81a92943c411c65c Text-content-length: 167 Text-content-md5: e8c78d36d0ab173eab7f5d3bf0e4877c Text-content-sha1: c36eb30a3d47c853c12fd399e9fff15f18642a9c Content-length: 167 SVN��uF��I�,�eif (write(signalpipe[1], "x", 1) <= 0) /* not much we can do about it */if (read(signalpipe[0], c, 1) <= 0) /* ignore error */; Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9ea78483f3c4d0a4050adbbb355173d8 Text-delta-base-sha1: bdb35405037ab06621cfc84e4b10be9875e164e0 Text-content-length: 177 Text-content-md5: 95e1c9b98859f886f551e5f2707c19a6 Text-content-sha1: b42e718b2451bff5ce147c7caee4f3d68f463bde Content-length: 177 SVN��S#�Z�N�y{C�?if (write(pty_signal_pipe[1], "x", 1) <= 0) /* not much we can do about it */if (read(pty_signal_pipe[0], c, 1) <= 0) /* ignore error */; Revision-number: 8615 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8616 Prop-content-length: 254 Content-length: 254 K 7 svn:log V 153 Fixes for re-entrant calls in the serial configuration list boxes. (I'm starting to think I made an egregious design error somewhere in this mechanism.) K 10 svn:author V 5 simon K 8 svn:date V 27 2009-08-10T20:38:46.452987Z PROPS-END Node-path: putty/sercfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ffbba5d8a969e83df1690ab9e1126f82 Text-delta-base-sha1: a68f3f964d1e31a84b79095ef8f9758139f80006 Text-content-length: 890 Text-content-md5: 06be0e90178df30766ba3a955afb6a06 Text-content-sha1: e6fa3e4504b2e2b1df1431165da69a71c7d68e4a Content-length: 890 SVN��5k0>�u�B� s^�/b�75B�Us�!?X�lb�dQint oldparity = cfg->serparity;/* preserve past reentrant calls */mask & (1 << i)) { if (oldparity == parities[i].val) { dlg_listbox_select(ctrl, dlg, j); break; } j++; } } if (i == lenof(parities)) { /* an unsupported setting was chosen */ dlg_listbox_select(ctrl, dlg, 0); oldparity = SER_PAR_NONE; } dlg_update_done(ctrl, dlg); cfg->serparity = oldparity; /* restore */int oldflow = cfg->serflow; /* preserve past reentrant calls */mask & (1 << i)) { if (oldflow == flows[i].val) { dlg_listbox_select(ctrl, dlg, j); break; } j++; } } if (i == lenof(flows)) { /* an unsupported setting was chosen */ dlg_listbox_select(ctrl, dlg, 0); oldflow = SER_FLOW_NONE; } dlg_update_done(ctrl, dlg); cfg->serflow = oldflow; /* restore */FLOW Revision-number: 8617 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2009-08-10T20:55:19.399471Z K 7 svn:log V 116 Patch from Alan Clucas (somewhat polished) providing command-line options to select and configure serial port mode. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c839a3ff0447529d1dcee7468fe2188e Text-delta-base-sha1: 67f76709a84897117dfc64b2994c604604c89f8e Text-content-length: 2312 Text-content-md5: a3418f8119813d94fdddff433f5eb3bc Text-content-sha1: 0c9ba4e9fb59d2bc4385fa229565a14ff4e65fea Content-length: 2312 SVN��Z]��S�w{E�?��Ky �?serial")) { RETURN(1); /* Serial is not NONNETWORK in an odd sense of the word */ERIAL; /* The host parameter will already be loaded into cfg->host, so copy it across */ strncpy(cfg->serline, cfg->host, sizeof(cfg->serline) - 1); cfg->serline[sizeof(cfg->serline) - 1] = '\0' if (!strcmp(p, "-sercfg")) { char* nextitem; RETURN(21); if (cfg->protocol != PROT_SERIAL) cmdline_error("the -sercfg option can only be used with the " "serial protocol"); /* Value[0] contains one or more , separated values, like 19200,8,n,1,X */ nextitem = value; while (nextitem[0] != '\0') { int length, skip; char *end = strchr(nextitem, ','); if (!end) { length = strlen(nextitem); skip = 0; } else { length = end - nextitem; nextitem[length] = '\0'; skip = 1; } if (length == 1) { switch (*nextitem) { case '1': cfg->serstopbits = 2; break; case '2': cfg->serstopbits = 4; break; case '5': cfg->serdatabits = 5; break; case '6': cfg->serdatabits = 6; break; case '7': cfg->serdatabits = 7; break; case '8': cfg->serdatabits = 8; break; case '9': cfg->serdatabits = 9; break; case 'n': cfg->serparity = SER_PAR_NONE; break; case 'o': cfg->serparity = SER_PAR_ODD; break; case 'e': cfg->serparity = SER_PAR_EVEN; break; case 'm': cfg->serparity = SER_PAR_MARK; break; case 's': cfg->serparity = SER_PAR_SPACE; break; case 'N': cfg->serflow = SER_FLOW_NONE; break; case 'X': cfg->serflow = SER_FLOW_XONXOFF; break; case 'R': cfg->serflow = SER_FLOW_RTSCTS; break; case 'D': cfg->serflow = SER_FLOW_DSRDTR; break; default: cmdline_error("Unrecognised suboption \"-sercfg %c\"", *nextitem); } } else if (length == 3 && !strncmp(nextitem,"1.5",3)) { /* Messy special case */ cfg->serstopbits = 3; } else { int serspeed = atoi(nextitem); if (serspeed != 0) { cfg->serspeed = serspeed; } else { cmdline_error("Unrecognised suboption \"-sercfg %s\"", nextitem); } } nextitem += length + skip; } } Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ba505e88a09b295c98918b2635e1491 Text-delta-base-sha1: 4374b41a78d7fb559afd010e4ba23de6961e7896 Text-content-length: 71 Text-content-md5: 87b569885a05da77f0625424d723f84c Text-content-sha1: a798f8e76ac95861a4844c7dc335086bb0672010 Content-length: 71 SVN��mG)�i��jN�K"serial} \c{-serial\IM{-sercfg} \c{-sercfg Node-path: putty/doc/man-pl.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 40db39df7ff5fe3283b4ffc960909e2f Text-delta-base-sha1: c58215cbccc0e86b332879d1fcad96069ae06408 Text-content-length: 756 Text-content-md5: 3fe598c6da9d03d3d4a705dd4b603c1c Text-content-sha1: ff07d1ac0908d2f03b22acfcb2abbcfe84775285 Content-length: 756 SVN�� vV��� =� serial} \dd Force serialdt \cw{\-sercfg} \e{configuration-string} \dd Specify the configuration parameters for the serial port, in \cw{-serial} mode. \e{configuration-string} should be a comma-separated list of configuration parameters as follows: \lcont{ \b Any single digit from 5 to 9 sets the number of data bits. \b \cq{1}, \cq{1.5} or \cq{2} sets the number of stop bits. \b Any other numeric string is interpreted as a baud rate. \b A single lower-case letter specifies the parity: \cq{n} for none, \cq{o} for odd, \cq{e} for even, \cq{m} for mark and \cq{s} for space. \b A single upper-case letter specifies the flow control: \cq{N} for none, \cq{X} for XON/XOFF, \cq{R} for RTS/CTS and \cq{D} for DSR/DTR. } Node-path: putty/doc/man-putt.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7d30de1650ab3aa3221af2c36514a223 Text-delta-base-sha1: 769b1fdbc9bbf35c62b7a6122f1095a2d1aa5843 Text-content-length: 745 Text-content-md5: 5b091e5c55607ec2aa16219379ac47c0 Text-content-sha1: 1c47dda77091828e1f54661771ca32db24190497 Content-length: 745 SVN��a0K��� =�V , \cw{\-serialdt \cw{\-sercfg} \e{configuration-string} \dd Specify the configuration parameters for the serial port, in \cw{-serial} mode. \e{configuration-string} should be a comma-separated list of configuration parameters as follows: \lcont{ \b Any single digit from 5 to 9 sets the number of data bits. \b \cq{1}, \cq{1.5} or \cq{2} sets the number of stop bits. \b Any other numeric string is interpreted as a baud rate. \b A single lower-case letter specifies the parity: \cq{n} for none, \cq{o} for odd, \cq{e} for even, \cq{m} for mark and \cq{s} for space. \b A single upper-case letter specifies the flow control: \cq{N} for none, \cq{X} for XON/XOFF, \cq{R} for RTS/CTS and \cq{D} for DSR/DTR. } Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d6cda9aa9e9af49dfff0344d8900bc71 Text-delta-base-sha1: 06b34c87f8e65ae3cf79df6c00b9dc814014b74d Text-content-length: 146 Text-content-md5: 4b4b60ec672e444c06fb1849ad4892a9 Text-content-sha1: bba7a763128deee2470464d4925f79ab99f940ba Content-length: 146 SVN��<9v�o��4on�  -serial\c -sercfg configuration-string (e.g. 19200,8,n,1,X) \c Specify the serial configuration (serial Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff5a647ab712140279848ac9711ff7ce Text-delta-base-sha1: 70e25d9880a3316b393edc4d43bff608f177dd53 Text-content-length: 1160 Text-content-md5: dc10fb8505b7bfa97bf242ee9791f23c Text-content-sha1: d8ac5eac19c897795413e1581fb33b3ef38b5455 Content-length: 1160 SVN��SW&T� �c�;cM�� 7�=m\I\c{-serial}These options allow you to bypass the configuration window and launch straight into a To start a connection to a serial port, e.g. COM1: \c putty.exe -serial com1 \c{-serial\b \i\c{-serial} selects a serial connection \S2{using-cmdline-sercfg} \i\c{-sercfg}: specify serial port \i{configuration} This option specifies the configuration parameters for the serial port (baud rate, stop bits etc). Its argument is interpreted as a comma-separated list of configuration options, which can be as follows: \b Any single digit from 5 to 9 sets the number of data bits. \b \cq{1}, \cq{1.5} or \cq{2} sets the number of stop bits. \b Any other numeric string is interpreted as a baud rate. \b A single lower-case letter specifies the parity: \cq{n} for none, \cq{o} for odd, \cq{e} for even, \cq{m} for mark and \cq{s} for space. \b A single upper-case letter specifies the flow control: \cq{N} for none, \cq{X} for XON/XOFF, \cq{R} for RTS/CTS and \cq{D} for DSR/DTR. For example, \cq{-sercfg 19200,8,n,1,N} denotes a baud rate of 19200, 8 data bits, no parity, 1 stop bit and no flow control. Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e8c78d36d0ab173eab7f5d3bf0e4877c Text-delta-base-sha1: c36eb30a3d47c853c12fd399e9fff15f18642a9c Text-content-length: 155 Text-content-md5: 67eeab988e7d28cf52fcaf88ea4f7d7d Text-content-sha1: 3751adf425a8c3534b92f2d89ff955cee1fdfe0a Content-length: 155 SVN��FW ���Quprintf(" -sercfg configuration-string (e.g. 19200,8,n,1,X)\n"); printf(" Specify the serial configuration (serial Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 771dedcc68e1de746b1350fa23ebd504 Text-delta-base-sha1: 5eba5713dcd93bfae7f331d52d4bb4217383dfda Text-content-length: 155 Text-content-md5: c37e61044ef1aff72d788938a298a58a Text-content-sha1: 1e8bf479a5754eb106e6be265e012829ead17343 Content-length: 155 SVN��1B �v��Kfprintf(" -sercfg configuration-string (e.g. 19200,8,n,1,X)\n"); printf(" Specify the serial configuration (serial Revision-number: 8618 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2009-08-13T22:01:20.086430Z K 7 svn:log V 40 Add "-serial" to Plink's usage message. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 67eeab988e7d28cf52fcaf88ea4f7d7d Text-delta-base-sha1: 3751adf425a8c3534b92f2d89ff955cee1fdfe0a Text-content-length: 31 Text-content-md5: cb54890d6c769c75f1274042ad56ba05 Text-content-sha1: e530f0680cceb24feadfab7ff06bdb4bb0dd217f Content-length: 31 SVN��W_ �\��{\ -serial Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c37e61044ef1aff72d788938a298a58a Text-delta-base-sha1: 1e8bf479a5754eb106e6be265e012829ead17343 Text-content-length: 31 Text-content-md5: 3dcf918974118f6dee4c149e7c77221d Text-content-sha1: 06f6aa61e58bb24b0259f37342a694f2bf890370 Content-length: 31 SVN��BJ �M��uM -serial Revision-number: 8619 Prop-content-length: 129 Content-length: 129 K 8 svn:date V 27 2009-08-13T22:02:54.715524Z K 7 svn:log V 29 Fixed by Alan Clucas' patch. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/cmdline-serial Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 83041c57b9d32c6ecff49f90e77e0a72 Text-delta-base-sha1: 50263c9fa2b49dabd3e831f60fc29ca61479903a Text-content-length: 45 Text-content-md5: d94dbc83ec251873c170f123c48494c6 Text-content-sha1: cdfc7fe6e403ef27a809f168005c66d943ac3f0f Content-length: 45 SVN��"=�q��2pFixed-in: r8617 2009-08-11 Revision-number: 8620 Prop-content-length: 226 Content-length: 226 K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-08-15T17:45:17.018406Z K 7 svn:log V 125 Keep the state of the "Full Screen" menu item on the Ctrl+right-click context menu in sync with reality and the system menu. PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a610b6444aee68b91ddf5adf22163030 Text-delta-base-sha1: eb889be19ceff3426bb39dc844a77c2889be483b Text-content-length: 614 Text-content-md5: 18b275b13d0f6ab053506c73324a93a5 Text-content-sha1: dd0e554c0dabadad54f8a2d7de9334887a9492f9 Content-length: 614 SVN����B�*�B�;int i; for (i = 0; i < lenof(popup_menus); i++) EnableMenuItem(popup_menus[i].menu, IDM_FULLSCREEN, MF_BYCOMMAND | (cfg.resize_action == RESIZE_DISABLED) �,_c�u��%L�bJ1) { SendMessage(hwnd, WM_VSCROLL, SB_PAGEUPand context menus. */ { int i; for (i = 0; i < lenof(popup_menus); i++) CheckMenuItem(popup_menus[i].menu, IDM_FULLSCREEN, MF_CHECKED); }and context menus. */ { int i; for (i = 0; i < lenof(popup_menus); i++) CheckMenuItem(popup_menus[i].menu, IDM_FULLSCREEN, MF_UNCHECKED); } Revision-number: 8621 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8622 Prop-content-length: 315 Content-length: 315 K 8 svn:date V 27 2009-08-16T22:51:20.162045Z K 7 svn:log V 214 Quell "config.status: WARNING: Makefile.in seems to ignore the --datarootdir setting" warning when running ./configure, per <http://www.gnu.org/software/autoconf/manual/html_node/Changed-Directory-Variables.html> K 10 svn:author V 5 jacob PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 26463293a11eea1beb7a07617d053f04 Text-delta-base-sha1: d6a3390a1b3d71e1996496bf613c72d54c4a83a6 Text-content-length: 85 Text-content-md5: 5cbd79620fbe4c8bc2e348a7faaa3294 Text-content-sha1: c554920308bb091a75f76e848ca4d5e771dca39a Content-length: 85 SVN��i6�*��E?�i�datarootdir=\@datarootdir\@\n". "mandir=\@mandir\@ Revision-number: 8623 Prop-content-length: 626 Content-length: 626 K 7 svn:log V 525 Fix handling of duplicate port forwardings; they were effectively cancelling out, but are now just ignored. (We should make more effort to prevent duplicates before they get as far as ssh_setup_portfwd() -- it's currently trivially easy to enter them in the GUI and on the command line, let alone both -- but there's bound to be someone with a saved session containing dupes out there by now, and anyway there are duplicates we can't detect before getting this far, for instance "1234:localhost:22" vs "1234:localhost:ssh".) K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-08-18T23:38:48.200508Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 987f05797bd76d51c5f13a6be380957d Text-delta-base-sha1: 1964b000919cd3e08047877c654a412ad3a70e9b Text-content-length: 658 Text-content-md5: 45f4e9aa6aaeed42479d6b7410fc01d1 Text-content-sha1: a2ddb2041c5f8e644ac692f3879d91df6699e8f7 Content-length: 658 SVN��������������cPif (epfrec->status == DESTROY) { /* * We already have a port forwarding up and running * with precisely these parameters. Hence, no need * to do anything; simply re-tag the existing one * as KEEP. */ epfrec->status = KEEP; } /* * Anything else indicates that there was a duplicate * in our input, which we'll silently ignore. */�b/MM�b� is_int = FALSE; } else { int maybe_int = FALSE, maybe_str = FALSE; #define CHECK_HYPOTHESIS(offset, result) \ do { \ long q = offset; \ if (q >= 0 && q+4 <= len) { \ q = q + 4 + GET_ Revision-number: 8624 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2009-08-18T23:51:49.288812Z K 7 svn:log V 61 Attempt to filter out duplicate port forwardings in the GUI. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35e2245bfe27557542f2cb5604b77d40 Text-delta-base-sha1: 7c59a57f6c273b7daaaeb849a3cec73f8b7a9100 Text-content-length: 527 Text-content-md5: 9e9939c44afd9a6cd273f27438d09b1f Text-content-sha1: f9dbfee643593205ebe8b65eb92a0402280a00ae Content-length: 527 SVN��f~r�6�r�Vif (strcmp(p,str) == 0) { dlg_error_msg(dlg, "Specified forwarding already exists"); break; } while (*p) p++; p++; } if (!*p) { if ((p - cfg->portfwd) + strlen(str) + 2 <= sizeof(cfg->portfwd)) { strcpy(p, str); p[strlen(str) + 1] = '\0'; dlg_listbox_add(pfd->listbox, dlg, str); dlg_editbox_set(pfd->sourcebox, dlg, ""); dlg_editbox_set(pfd->destbox, dlg, ""); } else { dlg_error_msg(dlg, "Too many forwardings"); } Revision-number: 8625 Prop-content-length: 225 Content-length: 225 K 7 svn:log V 124 Corey Stup points out that any attempt to display the message "Unable to load any WinSock library" will lead to a segfault. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-08-21T20:05:24.794750Z PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 91eaf7d45da4e187f81746213e0b2d27 Text-delta-base-sha1: 78292ed363a8a9fd61ae82d67ad6cb36f17a83b3 Text-content-length: 43 Text-content-md5: e4d6c0bcff0446e03149937a3c1f18c5 Text-content-sha1: 579a000e2e5fd4c10522fd142cfafa7ffdb7ddd5 Content-length: 43 SVN��]p �F��Fif (p_WSACleanup) Revision-number: 8626 Prop-content-length: 172 Content-length: 172 K 7 svn:log V 72 Corey Stup points out a memory leak in the local-proxy implementations. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-08-21T21:16:22.392105Z PROPS-END Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0761fe2b55d01f3ad61da1980f29087 Text-delta-base-sha1: 8ba3167a2387f2dcc39601927bf9df0568b5a9eb Text-content-length: 32 Text-content-md5: fa503cc7309a6440bb253f6752dbbbfc Text-content-sha1: 51eaf5b8c46bd09aaddd13796d3a187b128af972 Content-length: 32 SVN��  �^��1Xsfree(cmd); Node-path: putty/windows/winproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f9735d9c8966c4f4ba63e238f2b3d74f Text-delta-base-sha1: 6b5c6bb27bf950fa0f20db52eeeacae13b7e3c9a Text-content-length: 30 Text-content-md5: 2ca6cf8b6b7da689ede27a89156b5397 Text-content-sha1: 8dbf3b53686e6a484cda05fbad931c7047345ce6 Content-length: 30 SVN��/ �q��5isfree(cmd Revision-number: 8627 Prop-content-length: 339 Content-length: 339 K 8 svn:date V 27 2009-08-21T22:29:58.587141Z K 7 svn:log V 238 From Corey Stup: when we're declaring stuff for WSAAddressToStringA, we should use the explicitly-narrow type LPSTR, not the switchable type LPTSTR. (Since we currently build without UNICODE this makes no practical difference to us now.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e4d6c0bcff0446e03149937a3c1f18c5 Text-delta-base-sha1: 579a000e2e5fd4c10522fd142cfafa7ffdb7ddd5 Text-content-length: 23 Text-content-md5: 18294a90717f47190721252bfb1d04ee Text-content-sha1: 0d06d3330bb0b53f44ec6a6d22fe95fecccd89c9 Content-length: 23 SVN��po ��7��88 Revision-number: 8628 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2009-08-21T23:25:48.398280Z K 7 svn:log V 25 Remove outdated comment. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a3560acb2b194acf08dcac6d87d9a692 Text-delta-base-sha1: d683705790d1c315920842bd88e1188bd67cebdc Text-content-length: 367 Text-content-md5: 76dea4fb28a6821e0ee1d62935cd8820 Text-content-sha1: 26180f20ef5ed8b5d905b99eb3ef9d01292171e1 Content-length: 367 SVN����D�s�d�I7`/* Dummy routine, only required in plink. */ void ldisc_update(void *frontend, int echo, int edit) {, menuitem); \ gtk_widget_show(menuitem); \ if (func != NULL) \ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \ GTK_SIGNAL_FUNC(func), inst); \ } while (0) if (new_session) MKMENUITEM("New Ses�Jj��j` Revision-number: 8629 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8630 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8631 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8632 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8633 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8634 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8635 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 OpenSSH's behaviour, and wittering therefrom. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-08-29T22:29:45.607458Z PROPS-END Node-path: putty-wishlist/data/ssh2-utf8-strings Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ac2c6c105161436a72bc9c641f4eefd3 Text-delta-base-sha1: 43a36ec4bf3913313e54a4e763f27af7721694ff Text-content-length: 1135 Text-content-md5: 18d8d04def91d4c93f29ca40882a62aa Text-content-sha1: 0bd5288bb780f703bfb61dcd8f1f5055dcd86491 Content-length: 1135 SVN��<P�{��d�Z-= 2009-08-29 Content-type: text/x-html-body <p> This is likely to cause trouble with passwords containing non-ASCII characters, for instance. <p> <p> The OpenSSH client, which has much the same problem as plink, doesn't attempt to have an opinion on character sets (at least as of 5.1p1); everything will work according to the standard if the user's terminal is in UTF-8 mode, and not otherwise, regardless of the locale that OpenSSH is running in. <p> So it's to end up with a setup that mostly works but strictly breaches the standard. For instance, a multi-hop scenario where the user's terminal is in ISO-8859-1, and the end server's banner (say) is also in that character set (illegally), but an intermediate client/server running the OpenSSH client (or Plink) has a UTF-8 locale, works today but would break if the intermediate client started having an opinion on character sets. <p> Given this, if we fix this item, will we need an option to revert to our old (non-standard) behaviour -- using the configured terminal character set -- to cope with setups that have ended up looking like this? Revision-number: 8636 Prop-content-length: 135 Content-length: 135 K 8 svn:date V 27 2009-08-30T00:22:55.048940Z K 7 svn:log V 35 Fix Googleability-affecting typos. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winadj-success Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c974f5484f8a2b9a11d82490ac6bdb48 Text-delta-base-sha1: f2e524231327c3da073d9f2d539a252bb8553c63 Text-content-length: 66 Text-content-md5: ca00d470781380b6c655d7ff0df89dcd Text-content-sha1: ce8d17b588b93f1f73c48a433568cef77f95f85f Content-length: 66 SVN��AA ,�a+�4 Summary: Bombing out with 'Received SSH_MSGG Revision-number: 8637 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 Minor improvements to error reporting in logging. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-08-30T11:09:22.745064Z PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 03d7e44056e7da7fe38ea0c96fbd8fd0 Text-delta-base-sha1: d661953d1437431af9ceb9d8090e6ea8fa49bd34 Text-content-length: 277 Text-content-md5: ecd161d9f9174636a42e0bc8e4955be5 Text-content-sha1: 8f6bb52fc8bd8644434948a2f287060f6416c4d2 Content-length: 277 SVN��(hv�I��8F^�q7 /* Log state is L_ERROR so this won't cause a loop */ logevent(ctx->frontend, "Disabled writing session log due to error while writing")ctx->state == L_ERROR ? (mode == 0 ? "Disabled writing" : "Error writing") : ( Revision-number: 8638 Prop-content-length: 384 Content-length: 384 K 8 svn:date V 27 2009-08-30T13:16:50.386064Z K 7 svn:log V 283 Avoid compiling autoconf test programs with -Wall -Werror; doing so causes trouble on Ubuntu, where the Gtk test programs don't check the return value from system() and thus fall foul of the combination of our -Werror and <https://wiki.ubuntu.com/CompilerFlags#-D_FORTIFY_SOURCE=2>. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5cbd79620fbe4c8bc2e348a7faaa3294 Text-delta-base-sha1: c554920308bb091a75f76e848ca4d5e771dca39a Text-content-length: 73 Text-content-md5: e744f646d91aaac5c42b921136eee7ce Text-content-sha1: be431e96c55110f8db559c328bee0b15df471d0b Content-length: 73 SVN��2 /�(��[3PUTTYCFLAGS\@ \@CPPFLAGS\@ " . " Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 13c8d201a8d8f029e6cb025c44c55834 Text-delta-base-sha1: 49da458b0db9505e2306fb0be25999d9b99313d0 Text-content-length: 98 Text-content-md5: ab42099cb68adbbc4465ccc7d9da7035 Text-content-sha1: aaac8bb37a5d8bfe98672a70f7ec4093cf81b6bf Content-length: 98 SVN��;f L�\�L�>}PUTTYCFLAGS="-Wall -Werror" else PUTTYCFLAGS="" fi AC_SUBST(PUTTYCFLAGS) Revision-number: 8639 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2009-08-30T13:56:54.459897Z K 7 svn:log V 60 More info; suspect "boks_sshd" server; workaround thoughts. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winadj-success Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ca00d470781380b6c655d7ff0df89dcd Text-delta-base-sha1: ce8d17b588b93f1f73c48a433568cef77f95f85f Text-content-length: 1166 Text-content-md5: 2703c45792f9764509ed62b7723ab2d3 Text-content-sha1: 9ec93ddef3e2bfa7c8904be4c33e425563b9f614 Content-length: 1166 SVN��A]c�E��~KA�g+&�N|? claims to be "SSH-2.0-OpenSSH_4.3" -- however, if that were really true I'd have expected <em>many</em> more reports, and looking at the OpenSSH 4.3/p1/p2 source code I can't see how this can happen; apparently the server is actually "boks_sshd" from <a href="http://foxt.com/">foxt.com</a>. <br>Seems to happen readily -- a few "ls -ltr"s are sufficient to break it <br>Session log shows this happening the very first time we send one of our "winadj" requests; there aren't any ambiguities with multiple outstanding requests or anything like that. <br>Again, server claims to be "SSH-2.0-OpenSSH_4.3" <br>Again, shows up under light load ("ls -l" etc) <br>Again, session log shows it happens on the first "winadj" we send. <li>b97d2a650908251029v6d08aadelab7db47c312b4841@mail.gmail.com <br>Again, shows up with "ls -l" type activity.We could just ignore the protocol error, and quietly treat a (bogus) SUCCESS response to "winadj" the same as a FAILURE response -- it won't do any harm, since all we're interested in is when the server replies; we don't actually care about the content Revision-number: 8640 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8641 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8642 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8643 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8644 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8645 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8646 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8647 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8648 Prop-content-length: 309 Content-length: 309 K 8 svn:date V 27 2009-09-13T23:29:11.596205Z K 7 svn:log V 208 If there are no saved sessions, put a grayed "(No sessions)" entry on the saved sessions submenu of the terminal window context menu (as Pageant does), rather than an empty menu (which often renders poorly). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 76dea4fb28a6821e0ee1d62935cd8820 Text-delta-base-sha1: 26180f20ef5ed8b5d905b99eb3ef9d01292171e1 Text-content-length: 564 Text-content-md5: 092815c19ab92395f653833edd9edab1 Text-content-sha1: eaabb790e029ba0096bf5b7ed67e40cb2c1073a3 Content-length: 564 SVN����F���(�`�+ /* skip sesslist.sessions[0] == Default Settings */if (sesslist.nsessions <= 1) { GtkWidget *menuitem = gtk_menu_item_new_with_label("(No sessions)"); gtk_widget_set_sensitive(menuitem, FALSE�j55�j�title) : \ gtk_menu_item_new(); \ gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \ gtk_widget_show(menuitem); \ if (func != NULL) \ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \ GTK_SIGNAL_FUNC(func), inst); \ } while (0) if (new_session) MKMENUITEM("New Ses Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18b275b13d0f6ab053506c73324a93a5 Text-delta-base-sha1: dd0e554c0dabadad54f8a2d7de9334887a9492f9 Text-content-length: 257 Text-content-md5: f7c2b9b85a0ba22b9a4aeb53d6c16557 Text-content-sha1: c574263801e3d2683ff2906a9aaf381a1a35b89e Content-length: 257 SVN����f� ��u f� if (sesslist.nsessions <= 1) AppendMenu(savedsess_menu, MF_GRAYED, IDM_SAVED_MIN, "(No sessions)"�_Ghh�_�33'; /* Lets see if it's a pattern we know all about ... */ if (wParam == VK_PRIOR && shift_state == Revision-number: 8649 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2009-09-13T23:37:55.250898Z K 7 svn:log V 70 Add a couple of ellipses in Unix context menu (like r759 on Windows). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 092815c19ab92395f653833edd9edab1 Text-delta-base-sha1: eaabb790e029ba0096bf5b7ed67e40cb2c1073a3 Text-content-length: 49 Text-content-md5: cd83e825fe2b62fa57c60af4eaa6b952 Text-content-sha1: 9a8f205715ab956593b2d17edd1a91a7f38aeb49 Content-length: 49 SVN���������%�9��j9�|#...... Revision-number: 8650 Prop-content-length: 230 Content-length: 230 K 7 svn:log V 129 In Unix PuTTY, grey out "Restart Session" when it doesn't apply (as the Windows version does), rather than hiding it completely. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-09-13T23:41:55.324463Z PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cd83e825fe2b62fa57c60af4eaa6b952 Text-delta-base-sha1: 9a8f205715ab956593b2d17edd1a91a7f38aeb49 Text-content-length: 196 Text-content-md5: 721373a587955321f055ee8d8c0c01f5 Text-content-sha1: 98a0c534378f99b1348ab582269f76e1a3b566c8 Content-length: 196 SVN����J�X��im�ulet_sensitive(inst->restartitem, TRUEset_sensitive(inst->restartitem, FALSE�%T E�B��MX? gtk_menu_item_new_with_label(set_sensitive(inst->restartitem, FALSE Revision-number: 8651 Prop-content-length: 684 Content-length: 684 K 8 svn:date V 27 2009-09-14T21:26:48.120727Z K 7 svn:log V 583 Since r7266, it's been possible to get a hostname into Default Settings; but plink did not cope gracefully with this -- it was not possible to override that hostname on the command line (attempts at doing so would be treated as part of the remote command). Fix this by applying the principle of r7265: if the user didn't explicitly specify that they wanted to launch the hostname in the default (for instance with '-load "Default Settings"', we assume they don't want to, and such a hostname doesn't count when deciding whether to treat a non-option argument as hostname or command. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cb54890d6c769c75f1274042ad56ba05 Text-delta-base-sha1: e530f0680cceb24feadfab7ff06bdb4bb0dd217f Text-content-length: 236 Text-content-md5: 254aa1ccdd8bf7909905d6918fe5f75e Text-content-sha1: 85da0ec5e20b593824bb8c1f5fef4877d5528455 Content-length: 236 SVN��_'7�W��Q�AS�JP�kt�^int got_host = FALSE || !(got_host || loaded_session got_host = TRUE got_host = TRUE; } else { cfg = cfg2; loaded_session = TRUE || !(got_host || loaded_session Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3dcf918974118f6dee4c149e7c77221d Text-delta-base-sha1: 06f6aa61e58bb24b0259f37342a694f2bf890370 Text-content-length: 228 Text-content-md5: e58bffa4a2d7fc16a87877e68b9afb62 Text-content-sha1: 4a5b8b63528fb44341a1b094130ba43600e06d91 Content-length: 228 SVN��Js#3�<��F2�@w�J3P�k�Igot_host = FALSE || !(got_host || loaded_session got_host = TRUE got_host = TRUE; } else { cfg = cfg2; loaded_session = TRUE || !(got_host || loaded_session Revision-number: 8652 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2009-09-14T23:09:31.369314Z K 7 svn:log V 42 Another report confirmed to be boks_sshd. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winadj-success Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2703c45792f9764509ed62b7723ab2d3 Text-delta-base-sha1: 9ec93ddef3e2bfa7c8904be4c33e425563b9f614 Text-content-length: 186 Text-content-md5: 3c8e1d6889d58f37f47d7b14db79d160 Text-content-sha1: e6476815b6edb98378f0b4af5d4fec9a3b59d5dc Content-length: 186 SVN��]|��T�jH�dy <br>Server claims to be "SSH-2.0-OpenSSH_3.8.1p1" but is in fact boks_sshd 6.0-- which in all the cases positively identified so far is "boks_sshd" -- Revision-number: 8653 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8654 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8655 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8656 Prop-content-length: 175 Content-length: 175 K 8 svn:date V 27 2009-09-16T22:28:20.801249Z K 7 svn:log V 75 Fix minor file descriptor leaks. Found by cppcheck, reported by Tim Kosse. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a3418f8119813d94fdddff433f5eb3bc Text-delta-base-sha1: 0c9ba4e9fb59d2bc4385fa229565a14ff4e65fea Text-content-length: 33 Text-content-md5: a2c479539b98d01521d59314709671b0 Text-content-sha1: 268529675d98b059f46338198e546b9f560e7fdf Content-length: 33 SVN��# �#��t" fclose(fp); Node-path: putty/unix/uxnoise.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0df78d39017eacbe90d703ec5526130c Text-delta-base-sha1: 416ef1908d3f94d9cfcc75436b88e819e019b309 Text-content-length: 31 Text-content-md5: dbbdcc1e48e37cddb52c42947f86397c Text-content-sha1: 89566621283a4839c2d4a874d1bd6ee59e256a1d Content-length: 31 SVN��/? �M��hGclose(fd); Revision-number: 8657 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8658 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8659 Prop-content-length: 289 Content-length: 289 K 7 svn:log V 188 Summary: SSH keyboard-interactive instructions to user can be discarded Class: bug Fixed-in: r8172 2008-09-10 (Added a record for this old fix since it causes real problems with SunSSH.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-09-20T23:18:47.020993Z PROPS-END Node-path: putty-wishlist/data/kbdint-instruction-ignored Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 618 Text-content-md5: 773460be74e05a3c9988f86ee0794bc8 Text-content-sha1: babc54d12b0af4b312937000a1b7786fb897af59 Content-length: 628 PROPS-END SVN���\\\Summary: SSH keyboard-interactive instructions to user can be discarded Class: bug Difficulty: fun Priority: high Absent-in: 0.58 Present-in: 0.59 0.60 Fixed-in: r8172 2008-09-10 Content-type: text/x-html-body <p> If we get a keyboard-interactive INFO_REQUEST with an "instruction" string but no actual prompts, we discard the whole packet without displaying the instruction. <p> SunSSH is known to send such packets when providing instructions for password expiry and the like. <p> This was probably introduced around r6437, and hence probably a regression since 0.58 (although I haven't tested it). Revision-number: 8660 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8661 Prop-content-length: 606 Content-length: 606 K 8 svn:date V 27 2009-09-25T23:32:14.137847Z K 7 svn:log V 505 Change manifest files to declare Windows GUI apps to be "DPI-aware", that is, not fazed by being displayed at other than 96DPI; testing on Vista at a range of DPIs indicates that we cope (with the minor and inevitable exception of the drag-list control). This stops pixel scaling and hence fuzzy display on high-resolution displays. (Hope this is last disastrous than my last set of manifest tweaks! -- <http://support.fogcreek.com/default.asp?copilot.6.26840.1> suggests that this is an OK thing to do.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/pageant.mft Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c22a1ba545670580c79abea56721a243 Text-delta-base-sha1: dc179f3fad20486794ac1c8e4aa29ed94026df8e Text-content-length: 434 Text-content-md5: 3b8315ef7cb1225608e289b15155ef41 Text-content-sha1: 3637d1b15f7ccadbb236349977dbd65faf8aa2b2 Content-length: 434 SVN�� N p�'W)|<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!-- Do not attempt to do anything clever with this file <!-- Declare us to be "DPI-aware". --> <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> </asmv3:windowsSettings> </asmv3:application Node-path: putty/windows/putty.mft Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e778c29e973b600435e3a98aeec471f Text-delta-base-sha1: b22c0dc49bb018687e2148efe48daa8eb9d3a3f6 Text-content-length: 445 Text-content-md5: 7df7508f04c81632429b9aebf67ef509 Text-content-sha1: d73a137b4efa090a3cc65f38a6796089f1434061 Content-length: 445 SVN��T 'p�-W7<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!-- Do not attempt to do anything clever with this file <!-- Declare us to be "DPI-aware". --> <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> </asmv3:windowsSettings> </asmv3:application> </assembly> Node-path: putty/windows/puttygen.mft Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1dea2ab853440cf860c57a240d1ed4c5 Text-delta-base-sha1: 03d41efcb8748d38c17b35d7ce621a002b3cc875 Text-content-length: 434 Text-content-md5: 880b9a53937e38ea3dc31c1f71297f14 Text-content-sha1: ac7c497d3c123150d742f3ff5e95d217805b3a37 Content-length: 434 SVN��L p�%W)z<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!-- Do not attempt to do anything clever with this file <!-- Declare us to be "DPI-aware". --> <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> </asmv3:windowsSettings> </asmv3:application Revision-number: 8662 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8663 Prop-content-length: 139 Content-length: 139 K 7 svn:log V 39 Fix some (probably harmless) warnings. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-09-27T15:31:08.978870Z PROPS-END Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 03c1ef18bebe78976c59b0b5a0b15ac3 Text-delta-base-sha1: fd0d70e720d624f90fb90eb2637a07a4bef35f1d Text-content-length: 57 Text-content-md5: ff021c97434cbbdfd62b30785e8b4a4c Text-content-sha1: b798db94db5842fef9645f02354ab0ad11f0cb38 Content-length: 57 SVN��>c� ��{� �!ssh; DWORD; DWORD Revision-number: 8664 Prop-content-length: 176 Content-length: 176 K 8 svn:date V 27 2009-09-27T15:52:13.530638Z K 7 svn:log V 76 Quell more warnings and, perhaps, avoid alignment faults on 64-bit Windows. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff021c97434cbbdfd62b30785e8b4a4c Text-delta-base-sha1: b798db94db5842fef9645f02354ab0ad11f0cb38 Text-content-length: 487 Text-content-md5: e9d3c6d8ece52bc6b6e95f04bef3e413 Text-content-sha1: a94958449acd17bee5911c112844fd73e48d2c30 Content-length: 487 SVN��cZ O��O�^do { \ ULARGE_INTEGER uli; \ uli.QuadPart = ((ULONGLONG)(t) + 11644473600ull) * 10000000ull; \ (ft).dwLowDateTime = uli.LowPart; \ (ft).dwHighDateTime = uli.HighPart; \ } while(0) #define TIME_WIN_TO_POSIX(ft, t) do { \ ULARGE_INTEGER uli; \ uli.LowPart = (ft).dwLowDateTime; \ uli.HighPart = (ft).dwHighDateTime; \ uli.QuadPart = uli.QuadPart / 10000000ull - 11644473600ull; \ (t) = (unsigned long) uli.QuadPart; \ } while(0 Revision-number: 8665 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2009-09-27T16:07:10.581610Z K 7 svn:log V 43 Another warning fix and cosmetic tweakage. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18294a90717f47190721252bfb1d04ee Text-delta-base-sha1: 0d06d3330bb0b53f44ec6a6d22fe95fecccd89c9 Text-content-length: 249 Text-content-md5: e0361f8e11cd99131b3e5868ee59d361 Text-content-sha1: a87b8a6f3f72c68a3f617c69fb5bd04fc5105632 Content-length: 249 SVN��oQ���nZ�dG�nchar realhost[8192]; int hint_family struct hostent *h = NULL; int err;DWORD dwbuflen; p_WSAAddressToStringA(step.ai->ai_addr, step.ai->ai_addrlen, NULL, buf, &dwbuflen); buflen = dwbuflen Revision-number: 8666 Prop-content-length: 161 Content-length: 161 K 7 svn:log V 61 Remove is_shift_pressed() -- it's not been used since r4906. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-09-27T16:20:39.741340Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f7c2b9b85a0ba22b9a4aeb53d6c16557 Text-delta-base-sha1: c574263801e3d2683ff2906a9aaf381a1a35b89e Text-content-length: 283 Text-content-md5: 8e04a559e25cbcf7c34369e7717490c8 Text-content-sha1: 9233046cd7d2c2967350fd3824b22d0c2b725f95 Content-length: 283 SVN����h���v6�qh33'; /* Lets see if it's a pattern we know all about ... */ if (wParam == VK_PRIOR && shift_state == 1) { SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0); return 0; } if (wParam == VK_PRIOR && shift_state == 2) { Sen�G_��_h Revision-number: 8667 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8668 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8669 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8670 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8671 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8672 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8673 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8674 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8675 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8676 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8677 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2009-10-05T23:54:38.542345Z K 7 svn:log V 184 Summary: Plink using wrong hostname when one is saved in Default Settings Fixed-in: r8651 2009-09-15 Quite a few people seem to be running into this, so it deserves a wishlist entry. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/plink-hostname Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1134 Text-content-md5: dde8866856b1b165f4f3213ef6bc9ce2 Text-content-sha1: 06d25ce32253b0b31fd97fbe45bb9f8725c7f401 Content-length: 1144 PROPS-END SVN���```Summary: Plink using wrong hostname when one is saved in Default Settings Class: bug Difficulty: fun Priority: high Present-in: 0.60 Fixed-in: r8651 2009-09-15 Content-type: text/x-html-body <p> Since <a href="defaults-launchable.html">'defaults-launchable'</a> was fixed, it's been possible to save a hostname in Default Settings. <p> However, Plink did not cope gracefully with that possibility -- it was not possible to override that hostname on the command line. Attempts at doing so would be treated as part of the remote command, but this typically wouldn't be obvious as the connection wouldn't get that far. <p> The most common symptom of this is output like this: <pre>C:\>plink myhost.example.com Unable to open connection: Host does not exist</pre> where a PuTTY connection to <tt>myhost.example.com</tt> works fine. Upon adding the <tt>-v</tt> option you might get: <pre>C:\>plink -v myhost.example.com Looking up host "otherhost.example.com" Unable to open connection: Host does not exist</pre> which "huh?" behaviour is explained by <tt>otherhost.example.com</tt> being in "Default Settings". Revision-number: 8678 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8679 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8680 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8681 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8682 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8683 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8684 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8685 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8686 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8687 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8688 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8689 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8690 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8691 Prop-content-length: 186 Content-length: 186 K 8 svn:date V 27 2009-10-12T08:22:28.652873Z K 7 svn:log V 86 About time this wishlist item stopped mentioning obsolete 3.5" storage technology :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/config-locations Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56771362b2e590b7cba0958a8ea5a858 Text-delta-base-sha1: fc0bbaf88ac0aa30434c0152905f9db67556d3a2 Text-content-length: 120 Text-content-md5: b0d2e7c7f25ff7184b362ec89141cb7d Text-content-sha1: 160bbb810ba24505184b20850eb46fa28e83678d Content-length: 120 SVN��}\�"�S�Xt�+RUSB key tend to want to store their configuration in a disk file on the same devicepen-drive Revision-number: 8692 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8693 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8694 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8695 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8696 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8697 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8698 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8699 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8700 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8701 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8702 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8703 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8704 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8705 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8706 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8707 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8708 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8709 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8710 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8711 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8712 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8713 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8714 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8715 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8716 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8717 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8718 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8719 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8720 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8721 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8722 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8723 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8724 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8725 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8726 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8727 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2009-10-19T23:16:08.371083Z K 7 svn:log V 54 Summary: "Jump list" support in Windows 7 Class: wish K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win7-jumplists Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 472 Text-content-md5: e82177d896e5b1542388658edd3b3334 Text-content-sha1: f2da3f47bd79dd4d9ba8d613596ad016dd0cb8c1 Content-length: 482 PROPS-END SVN���JJJSummary: "Jump list" support in Windows 7 Class: wish Difficulty: fun Priority: medium Content-type: text/x-html-body <p> Several people have suggested that PuTTY could use Windows 7's new <a href="http://msdn.microsoft.com/en-us/library/dd378402%28VS.85%29.aspx">Jump List</a> feature to provide access to saved sessions. <ul> <li>Patch: 001101ca2f2b$03adee30$0b09ca90$@roy@infi.nl (files <a href="http://speeltuin.infi.nl/~daniel/putty/">here</a>) </ul> Revision-number: 8728 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8729 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8730 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8731 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 These spinoff programs don't require GSSAPI, so stop including it. K 10 svn:author V 5 simon K 8 svn:date V 27 2009-10-25T10:35:13.880138Z PROPS-END Node-path: putty-spinoffs/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bcacf8f7c515e83a221da8d645540662 Text-delta-base-sha1: cf2286b8438659630df911371083d50bdf157b47 Text-content-length: 81 Text-content-md5: 997e119e45a3b283f5c39ff2872b8842 Text-content-sha1: 44334bf044a3612fe004f91a6faeacf6313e0285 Content-length: 81 SVN��%8>�z+#ifndef PUTTY_PUTTY_H #define PUTTY_PUTTY_H #define NO_GSSAPI Revision-number: 8732 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2009-10-26T14:55:23.105276Z K 7 svn:log V 25 foxt.com tracking number K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winadj-success Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c8e1d6889d58f37f47d7b14db79d160 Text-delta-base-sha1: e6476815b6edb98378f0b4af5d4fec9a3b59d5dc Text-content-length: 122 Text-content-md5: a65f0e84afe3ba6bb8e2f172de2d39ef Text-content-sha1: ba36c7b96b4f7c0a467bf96e9c67cc900deb890f Content-length: 122 SVN��|f d�~�d�xThe maintainers of boks_sshd, foxt.com, are tracking this interoperability problem as 090916-090424. Revision-number: 8733 Prop-content-length: 265 Content-length: 265 K 7 svn:log V 164 Stop trying to enumerate all the kinds of Windows we support on the download page. Define in more detail what we mean by "Windows" in the Ports section of the FAQ. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-11-01T22:06:05.348474Z PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c48d12c3268d33fcc1dca74b961ea5e Text-delta-base-sha1: eb74ef3b0c38b8d17a19f101bfec6c4cfc27f51a Text-content-length: 593 Text-content-md5: fe135f96a53f0b41a3eb54a06fedc6ec Text-content-sha1: 2a1a19e503cb74b9d2c7be5fc6358967fe7f2591 Content-length: 593 SVN��us1�-�1��{z\i{Win32}} includes versions of Windows from Windows 95 onwards (as opposed to the 16-bit Windows 3.1; see \k{faq-win31}), up to and including Windows 7; and we know of no reason why PuTTY should not continue to work on future versions of Windows. The Windows executables we provide are for the 32-bit \q{\i{x86}} processor architecture, but they should work fine on 64-bit processors that are backward-compatible with that architecture. (We used to also provide executables for Windows for the Alpha processor, but stopped after 0.58 due to lack of interest.) Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3bf9dec4ebe17bacf77cf988b0f754d7 Text-delta-base-sha1: dd3cd9e8b1fae55a4ef94c2e4b229d18cf30c69a Text-content-length: 27 Text-content-md5: 90a29a1c082bca5c6d0ca0f96b1b8016 Text-content-sha1: 9f645d7104191c4d540e862be6d1d3025bd71bfe Content-length: 27 SVN��u/��r��t�I, Revision-number: 8734 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8735 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8736 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8737 Prop-content-length: 439 Content-length: 439 K 7 svn:log V 338 Improve buffer handling in Windows sk_getaddr() -- we were passing uninitialised storage into WSAAddressToString()'s length function (and presumably getting away with it by luck). Also improve error handling (exposed by my Wine installation, which returns an error from WSAAddressToString() for connections to localhost for some reason). K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-11-08T18:25:29.543308Z PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e0361f8e11cd99131b3e5868ee59d361 Text-delta-base-sha1: a87b8a6f3f72c68a3f617c69fb5bd04fc5105632 Text-content-length: 363 Text-content-md5: 0778b1e3fe4e7d8ffd445d2a5f8a17bc Text-content-sha1: d9a8e90a77cb359a6f7a4331129e0a9f35599f89 Content-length: 363 SVN��N��N�BVnt err = 0; if (p_WSAAddressToStringA) { DWORD dwbuflen = buflen; err = p_WSAAddressToStringA(step.ai->ai_addr, step.ai->ai_addrlen, NULL, buf, &dwbuflen); } else err = -1; if (err) { strncpy(buf, addr->hostname, buflen); if (!buf[0]) strncpy(buf, "<unknown>", buflen); buf[buflen-1] = '\0'; } Revision-number: 8738 Prop-content-length: 367 Content-length: 367 K 7 svn:log V 266 Move the two existing DECL/GET_foo_FUNCTION macro sets used for dynamic linking on Windows into a single global one, which can cope with function renaming. Intended to enable eventual removal of ANSI-specific DoSomethingA references (although I've not removed any). K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-11-08T18:47:41.048472Z PROPS-END Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7676fff4e79ff78423fcc5da18c88290 Text-delta-base-sha1: 8e7d9f6830b17dbdc99aff152012c1918682783a Text-content-length: 1350 Text-content-md5: 5da313eb578575f9be9d6b511ed33890 Text-content-sha1: 547f8daaff1dda7f53cdaa3a4ce53e206b92240e Content-length: 1350 SVN��; '�|��/a�8DECL_WINDOWS_FUNCTION(static, SECURITY_STATUS, AcquireCredentialsHandleA, (SEC_CHAR *, SEC_CHAR *, ULONG, PLUID, PVOID, SEC_GET_KEY_FN, PVOID, PCredHandle, PTimeStamp)); DECL_WINDOWS_FUNCTION(static, SECURITY_STATUS, InitializeSecurityContextA, (PCredHandle, PCtxtHandle, SEC_CHAR *, ULONG, ULONG, ULONG, PSecBufferDesc, ULONG, PCtxtHandle, PSecBufferDesc, PULONG, PTimeStamp)); DECL_WINDOWS_FUNCTION(static, SECURITY_STATUS, FreeContextBuffer, (PVOID)); DECL_WINDOWS_FUNCTION(static, SECURITY_STATUS, FreeCredentialsHandle, (PCredHandle)); DECL_WINDOWS_FUNCTION(static, SECURITY_STATUS, DeleteSecurityContext, (PCtxtHandle)); DECL_WINDOWS_FUNCTION(static, SECURITY_STATUS, QueryContextAttributesA, (PCtxtHandle, ULONG, PVOID)); DECL_WINDOWS_FUNCTION(static, SECURITY_STATUS, MakeSignature, WINDOWS_FUNCTION(security_module, AcquireCredentialsHandleA); GET_WINDOWS_FUNCTION(security_module, InitializeSecurityContextA); GET_WINDOWS_FUNCTION(security_module, FreeContextBuffer); GET_WINDOWS_FUNCTION(security_module, FreeCredentialsHandle); GET_WINDOWS_FUNCTION(security_module, DeleteSecurityContext); GET_WINDOWS_FUNCTION(security_module, QueryContextAttributesA); GET_WINDOWS Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0778b1e3fe4e7d8ffd445d2a5f8a17bc Text-delta-base-sha1: d9a8e90a77cb359a6f7a4331129e0a9f35599f89 Text-content-length: 3112 Text-content-md5: f38a6b18bc08ad689370ce44ce55fee2 Text-content-sha1: 95145ddd2c1b12d9c3f82b2d4492d7ea8455e7f5 Content-length: 3112 SVN��"^<�^�f�\6�nz�Z~b�L:[�_aN�A�!SO�GCF�#P!� *�H�*ge�vDECL_WINDOWS_FUNCTION(static, int, WSAStartup, (WORD, LPWSADATA)); DECL_WINDOWS_FUNCTION(static, int, WSACleanup, (void)); DECL_WINDOWS_FUNCTION(static, int, closesocket, (SOCKET)); DECL_WINDOWS_FUNCTION(static, u_long, ntohl, (u_long)); DECL_WINDOWS_FUNCTION(static, u_long, htonl, (u_long)); DECL_WINDOWS_FUNCTION(static, u_short, htons, (u_short)); DECL_WINDOWS_FUNCTION(static, u_short, ntohs, (u_short)); DECL_WINDOWS_FUNCTION(static, int, gethostname, (char *, int)); DECL_WINDOWSDOWSDOWS_FUNCTION(static, unsigned long, inet_addr, (const char FAR *)); DECL_WINDOWS_FUNCTION(static, char FAR *, inet_ntoa, (struct in_addr)); DECL_WINDOWS_FUNCTION(static, int, connect, (SOCKET, const struct sockaddr FAR *, int)); DECL_WINDOWSDOWS_FUNCTION(static, int, setsockopt, (SOCKET, int, int, const char FAR *, int)); DECL_WINDOWS_FUNCTION(static, SOCKET, socket, (int, int, int)); DECL_WINDOWS_FUNCTION(static, int, listen, (SOCKET, int)); DECL_WINDOWSDOWS_FUNCTION(static, int, ioctlsocket, (SOCKET, long, u_long FAR *)); DECL_WINDOWSDOWS_FUNCTION(static, int, recv, (SOCKET, char FAR *, int, int)); DECL_WINDOWSDOWSDOWS_FUNCTION(static, void, freeaddrinfo, (struct addrinfo *res)); DECL_WINDOWSDOWS_FUNCTION(static, char *, gai_strerror, (int ecode)); DECL_WINDOWSDOWS_FUNCTION(winsock_module, getaddrinfo); GET_WINDOWS_FUNCTION(winsock_module, freeaddrinfo); GET_WINDOWS_FUNCTION(winsock_module, getnameinfo); GET_WINDOWSDOWS_FUNCTION(wship6_module, getaddrinfo); GET_WINDOWS_FUNCTION(wship6_module, freeaddrinfo); GET_WINDOWS_FUNCTION(wship6_module, getnameinfo); GET_WINDOWSDOWSDOWS_FUNCTION(winsock_module, WSAAsyncSelect); GET_WINDOWS_FUNCTION(winsock_module, WSAEventSelect); GET_WINDOWS_FUNCTION(winsock_module, select); GET_WINDOWS_FUNCTION(winsock_module, WSAGetLastError); GET_WINDOWS_FUNCTION(winsock_module, WSAEnumNetworkEvents); GET_WINDOWS_FUNCTION(winsock_module, WSAStartup); GET_WINDOWS_FUNCTION(winsock_module, WSACleanup); GET_WINDOWS_FUNCTION(winsock_module, closesocket); GET_WINDOWS_FUNCTION(winsock_module, ntohl); GET_WINDOWS_FUNCTION(winsock_module, htonl); GET_WINDOWS_FUNCTION(winsock_module, htons); GET_WINDOWS_FUNCTION(winsock_module, ntohs); GET_WINDOWS_FUNCTION(winsock_module, gethostname); GET_WINDOWS_FUNCTION(winsock_module, gethostbyname); GET_WINDOWS_FUNCTION(winsock_module, getservbyname); GET_WINDOWS_FUNCTION(winsock_module, inet_addr); GET_WINDOWS_FUNCTION(winsock_module, inet_ntoa); GET_WINDOWS_FUNCTION(winsock_module, connect); GET_WINDOWS_FUNCTION(winsock_module, bind); GET_WINDOWS_FUNCTION(winsock_module, setsockopt); GET_WINDOWS_FUNCTION(winsock_module, socket); GET_WINDOWS_FUNCTION(winsock_module, listen); GET_WINDOWS_FUNCTION(winsock_module, send); GET_WINDOWS_FUNCTION(winsock_module, ioctlsocket); GET_WINDOWS_FUNCTION(winsock_module, accept); GET_WINDOWS_FUNCTION(winsock_module, recv); GET_WINDOWS Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 237796690967a9d5fd4eff42d7406582 Text-delta-base-sha1: 8d11cf872c01b15011ea8b7c9cd18bf923a7e18c Text-content-length: 988 Text-content-md5: c8452fa15d7dc6d26dd7810936eef48c Text-content-sha1: 9feae49a8632af6638dc097da6128ac6c0a6eb9b Content-length: 988 SVN��? <�&�_�]�0Dynamically linked functions. * This is somewhat circuitous to allow function-renaming macros to be * expanded, principally the ANSI/Unicode DoSomethingA/DoSomethingW. */ #define DECL_WINDOWS_FUNCTION(linkage, rettype, name, params) \ typedef rettype (WINAPI *t_##name) params; \ linkage t_##name p_##name #define STR1(x) #x #define STR(x) STR1(x) #define GET_WINDOWS_FUNCTION(module, name) \ p_##name = module ? (t_##name) GetProcAddress(module, STR(name)) : NULLDECL_WINDOWS_FUNCTION(GLOBAL, int, WSAAsyncSelect, (SOCKET, HWND, u_int, long)); DECL_WINDOWS_FUNCTION(GLOBAL, int, WSAEventSelect, (SOCKET, WSAEVENT, long)); DECL_WINDOWS_FUNCTION(GLOBAL, int, select, (int, fd_set FAR *, fd_set FAR *, fd_set FAR *, const struct timeval FAR *)); DECL_WINDOWS_FUNCTION(GLOBAL, int, WSAGetLastError, (void)); DECL_WINDOWS_FUNCTION(GLOBAL, int, WSAEnumNetworkEvents, (SOCKET, WSAEVENT, LPWSANETWORKEVENTS) Revision-number: 8739 Prop-content-length: 188 Content-length: 188 K 7 svn:log V 88 Use DECL/GET_WINDOWS_FUNCTION in a few more places in place of ad-hoc GetProcAddress(). K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-11-08T19:22:28.934641Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e04a559e25cbcf7c34369e7717490c8 Text-delta-base-sha1: 9233046cd7d2c2967350fd3824b22d0c2b725f95 Text-content-length: 164 Text-content-md5: 0f35a0e3d17b48f1880de802d67af48b Text-content-sha1: 34a2f9e1fbadc44a70e1b1fea30bd5be7f8ea2d9 Content-length: 164 SVN���������_wt� �A�cp�IDECL_WINDOWS_FUNCTION(static, BOOL, FlashWindowEx, (PFLASHWINFO))GET_WINDOWS_FUNCTION(user32_module, FlashWindowEx); Node-path: putty/windows/winhelp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e896e00c2343ed38167acbaa5694b2de Text-delta-base-sha1: 2ac05a30fd6523aab9ac608956ddfb94a7d4887c Text-content-length: 329 Text-content-md5: b6bdfebaaad01c8276ea90cde32e7849 Text-content-sha1: 79e717d9893ebfd68a4982e496cc8bb00200c525 Content-length: 329 SVN��2&�$�b�{�KF�,�:M�Vn4~DECL_WINDOWS_FUNCTION(static, HWND, HtmlHelpA, (HWND, LPCSTR, UINT, DWORD)); static char *chm_pathGET_WINDOWS_FUNCTION(dllHH, HtmlHelpA); if (!p_HtmlHelpA) { chm_path = NULL; if (dllHH) FreeLibrary(dllHH); }p_HtmlHelpAp_HtmlHelpAp_HtmlHelpA(NULL, NULL, HH_CLOSE_ALL Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 753a36a517ce2c489dc9401fcee060ce Text-delta-base-sha1: 89306536d34d3427e1b46337122f37f4179f7335 Text-content-length: 542 Text-content-md5: 6a344106fd6b381999e58bf30d906d67 Text-content-sha1: 44bb8137914ebaf5fa3722a7d9e0fb4fa6a3fc35 Content-length: 542 SVN��$%k�_�7�B y�c=x�b%C�>fDECL_WINDOWS_FUNCTION(static, DWORD, GetSecurityInfo, (HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION, PSID *, PSID *, PACL *, PACL *, PSECURITY_DESCRIPTOR *))p_GetSecurityInfo(proc, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &procowner, NULL, NULL, NULL, p_GetSecurityInfo(filemap, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &mapowner, NULL, NULL, NULL, GET_WINDOWS_FUNCTION(advapi, GetSecurityInfo); if (!p_GetSecurityI Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 679bf23bec6de5562c278db89c056df7 Text-delta-base-sha1: a350e1901284956cec23f48ea3e2e7f260452600 Text-content-length: 332 Text-content-md5: db51b509c62483a0e377e0d5200c2c09 Text-content-sha1: bfc3b73a3985afc86c0de9d1420d552c88ec525c Content-length: 332 SVN��]w ��d�5%�><�<�+2DECL_WINDOWS_FUNCTION(static, HRESULT, SHGetFolderPathA, (HWND, int, HANDLE, DWORD, LPSTR))GET_WINDOWS_FUNCTION(shell32_module, SHGetFolderPathA); } if (p_SHGetFolderPathA) { if (SUCCEEDED(p_SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA, A(NULL, CSIDL_APPDATA, Revision-number: 8740 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2009-11-08T19:25:22.907209Z K 7 svn:log V 81 We defined tried_shgetfolderpath but never actually set it. Harmless, but fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db51b509c62483a0e377e0d5200c2c09 Text-delta-base-sha1: bfc3b73a3985afc86c0de9d1420d552c88ec525c Text-content-length: 52 Text-content-md5: f5a88ab53550c6184a25bbaa6f2b042a Text-content-sha1: afb9e823b4b693c748548c8d826c8c480bf74eec Content-length: 52 SVN��w �m�� k tried_shgetfolderpath = TRUE Revision-number: 8741 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8742 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8743 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8744 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8745 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8746 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2009-11-10T19:14:15.322305Z K 7 svn:log V 57 Patch from Tim Kosse to fix 64-bit-cleanness in SHA-512. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshsh512.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b73c7bd1d25d3e2428b8aaa60d1fdfea Text-delta-base-sha1: 01397b55528c595f0ace03e34cd8ab5dcf3cfcbc Text-content-length: 539 Text-content-md5: b856d6e83437765f9601fc7328999cd1 Text-content-sha1: e73b4ed4f597dc1ed63d6cc63c63456eee14267e Content-length: 539 SVN�� } �O��+b(uint32)r.lo < (uint32)y.lo) ) #define rorB(r,x,y) ( r.lo = ((uint32)x.hi >> ((y)-32)) | ((uint32)x.lo << (64-(y))), \ r.hi = ((uint32)x.lo >> ((y)-32)) | ((uint32)x.hi << (64-(y))) ) #define rorL(r,x,y) ( r.lo = ((uint32)x.lo >> (y)) | ((uint32)x.hi << (32-(y))), \ r.hi = ((uint32)x.hi >> (y)) | ((uint32)x.lo << (32-(y))) ) #define shrB(r,x,y) ( r.lo = (uint32)x.hi >> ((y)-32), r.hi = 0 ) #define shrL(r,x,y) ( r.lo = ((uint32)x.lo >> (y)) | ((uint32)x.hi << (32-(y))), \ r.hi = (uint32) Revision-number: 8747 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8748 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8749 Prop-content-length: 248 Content-length: 248 K 8 svn:date V 27 2009-11-13T13:24:32.680694Z K 7 svn:log V 147 Add a keyboard shortcut for the "serial" protocol to the GUI. Will cause non-zero, but hopefully acceptable, disruption to people's finger macros. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e9939c44afd9a6cd273f27438d09b1f Text-delta-base-sha1: f9dbfee643593205ebe8b65eb92a0402280a00ae Text-content-length: 48 Text-content-md5: 654697658962e6c30f12cfbf16769350 Text-content-sha1: d9287c2dff2efde3f61783c669f04559fec3255c Content-length: 48 SVN��~~ �1��2�i2�`9�dwwx Node-path: putty/sercfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06be0e90178df30766ba3a955afb6a06 Text-delta-base-sha1: e6fa3e4504b2e2b1df1431165da69a71c7d68e4a Text-content-length: 24 Text-content-md5: f949a2bcd954ba91e327adc7e86e211f Text-content-sha1: e2f2a866ec8ccb3e75d62baca0c325b111eb4bbb Content-length: 24 SVN��kc �R��]'r' Revision-number: 8750 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8751 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8752 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8753 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8754 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8755 Prop-content-length: 226 Content-length: 226 K 8 svn:date V 27 2009-11-22T19:10:11.976370Z K 7 svn:log V 125 On Windows, character set specifications of the form 'IBM437' would never have worked due to a typo. Spotted by Todd Burkey. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e11a5caf963b50356a25df235b112961 Text-delta-base-sha1: 1cd437a85a1e0e9bc01d3cc7ae01b4cf36aab853 Text-content-length: 26 Text-content-md5: 8ffa2f37663d0206b3eb1bc195ba578a Text-content-sha1: 40c230ddeda7e51e9bb5cbea3b8c5621cd19a07e Content-length: 26 SVN��OO �d��je2 Revision-number: 8756 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8757 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8758 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8759 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8760 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8761 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8762 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8763 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8764 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8765 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8766 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8767 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8768 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8769 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8770 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8771 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8772 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8773 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8774 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8775 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8776 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8777 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8778 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8779 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8780 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8781 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 Change "Win32" to "Windows", for much the same reason as r8733. K 10 svn:author V 5 jacob K 8 svn:date V 27 2009-12-16T11:52:14.290100Z PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e8f8275c0d95aab01cb1bf5379f8b51b Text-delta-base-sha1: 3e145c91dfba7ad29ba579fe7141fdaef3e32d14 Text-content-length: 25 Text-content-md5: 772a710a7de5ec1357144e6fc77b9746 Text-content-sha1: b962ec43cfe736b1fe03947bc9802d10395b33e1 Content-length: 25 SVN��13 �&�� (dows Revision-number: 8782 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8783 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8784 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8785 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8786 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8787 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8788 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8789 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8790 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8791 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8792 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8793 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8794 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8795 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8796 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8797 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8798 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8799 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8800 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8801 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8802 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8803 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8804 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8805 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8806 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8807 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8808 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8809 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8810 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8811 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8812 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8813 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8814 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2010-01-07T12:55:54.367534Z K 7 svn:log V 15 Add reference. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/kbdint-instruction-ignored Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 773460be74e05a3c9988f86ee0794bc8 Text-delta-base-sha1: babc54d12b0af4b312937000a1b7786fb897af59 Text-content-length: 117 Text-content-md5: e6a53567712291e1212410b86425de8e Text-content-sha1: f3345469eead01bc4d84ab058c64672b050e54f6 Content-length: 117 SVN��\< `�_�`�}_ (see for instance <a href="http://forums.sun.com/thread.jspa?threadID=5354958">this thread</a>) Revision-number: 8815 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8816 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8817 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8818 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8819 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8820 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8821 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8822 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8823 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8824 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8825 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8826 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8827 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8828 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8829 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8830 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8831 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8832 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8833 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8834 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8835 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8836 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8837 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8838 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8839 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8840 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8841 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8842 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8843 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8844 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8845 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8846 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2010-01-17T16:20:45.832348Z K 7 svn:log V 151 Plug a few minor memory leaks, based on a patch by Sirp Potijk. While I'm here, add an assertion in sshrand.c to catch mistakes in reference counting. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a2c479539b98d01521d59314709671b0 Text-delta-base-sha1: 268529675d98b059f46338198e546b9f560e7fdf Text-content-length: 470 Text-content-md5: e34e326d14f0f66a54f700befa6183b2 Text-content-sha1: 1bfbeb3932bd9721a65ecbabe251f0a5fdca1c61 Content-length: 470 SVN��#E4�F���v7�!T�4ostatic char *cmdline_password = NULL; void cmdline_cleanup(void) { int pri; if (cmdline_password) { memset(cmdline_password, 0, strlen(cmdline_password)); sfree(cmdline_password); cmdline_password = NULL; } for (pri = 0; pri < NPRIORITIES; pri++) { sfree(saves[pri].params); saves[pri].params = NULL; saves[pri].savesize = 0; saves[pri].nsaved = 0; }sfree(cmdline_password); cmdline_password = NULL Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 45f4e9aa6aaeed42479d6b7410fc01d1 Text-delta-base-sha1: a2ddb2041c5f8e644ac692f3879d91df6699e8f7 Text-content-length: 214 Text-content-md5: 75b2e7352f9694109c84e9fee1de1fbd Text-content-sha1: d022724cb46bce2281f345cce00fb742c664b02a Content-length: 214 SVN���� 3���4 freetree234(ssh->portfwds); ssh->portfwds = NULL;���4�L�key.modulus) { sfree(servkey.modulus); servkey.mod�/c4�/�ardly matters; assume string */ if (num == 0) { Node-path: putty/sshrand.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 09c35b144e7c3331f7a9a76fecd7cddb Text-delta-base-sha1: 978d6d3dbe9f30d7d69586b58150b7f86a77b53a Text-content-length: 140 Text-content-md5: 15406d932db2b96efe2fbc485b9319da Text-content-sha1: a245a2bd2e64d379d3aaf10b484406a92cb4ef1a Content-length: 140 SVN��g\r�l��k_�a#include <assert.h> assert(random_active >= 0); if (random_active) return; expire_timer_context(&pool) Revision-number: 8847 Prop-content-length: 262 Content-length: 262 K 7 svn:log V 161 Change expiry of timers when their contexts go away from lazy to eager. Intended to be of benefit to derived code making many connections from a single process. K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-01-17T16:22:35.633933Z PROPS-END Node-path: putty/timing.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f14fabc8dad64276224cb06b79b826d Text-delta-base-sha1: 1d010acfde2b438c9c14ac03d45a2f9d743c2b8c Text-content-length: 669 Text-content-md5: 27205b18b471ce8d397338ed2537f499 Text-content-sha1: 3a6237477124ef8a22b35f475725d9a6c4135545 Content-length: 669 SVN��AG&k�S��dz�( �ij��}]>struct timer *at = (struct timer *)av; struct timer *bt = (struct timer *)bv; char *a = (char *)at->ctx; char *b = (char *)bt->ctxstruct timer *ptr; struct timer exemplar; if (!timers) return; exemplar.ctx = ctx; /* don't care about initialisation of other members */ /* Dispose of all timers with this context */ while ((ptr = (struct timer *)find234(timers, &exemplar, compare_timer_contexts))) { del234(timers, ptr); sfree(ptr); } /* Dispose of timer tree itself if none are left */ if (count234(timers) == 0) { freetree234(timers); timers = NULL; } Revision-number: 8848 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2010-01-17T17:27:27.295033Z K 7 svn:log V 17 It's a new year. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae64841d0e1760821c4c0b427af78144 Text-delta-base-sha1: 44748d23700dbf155f4955303ea91e5371089085 Text-content-length: 44 Text-content-md5: 0658d4f44048a4bd00578f3850e5aaf2 Text-content-sha1: 79138c5d2f5b8d779108fb46c85515836084bd12 Content-length: 44 SVN�� �qPuTTY is copyright 1997-2010 Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e9df4b744809c5d4bc6bcf44b1fd120a Text-delta-base-sha1: c656a33770f21e85939403153199c9c423fdbd44 Text-content-length: 23 Text-content-md5: 5c505a6c4b25af6d93ff84d18be071b3 Text-content-sha1: 5f473c2e7774b7365d419368a0777d5f49c23e4f Content-length: 23 SVN��bb �Q��S10 Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4d45839bc96f4979c1b5057016a770dd Text-delta-base-sha1: 0164754fd8a98ff1fc869136c722f404d2f18368 Text-content-length: 21 Text-content-md5: 039b6c8e36219c53b993566dbf6d7f93 Text-content-sha1: 2331f46dd5be54ed398aff53b625463320630041 Content-length: 21 SVN��``�i��uk10 Node-path: putty/mac/mac_res.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c75827d61f7a813384ed785ff41d7963 Text-delta-base-sha1: 79238adadae5e05f76038e75b1bb1e44c3d3c123 Text-content-length: 36 Text-content-md5: 002fb206367811690a957be3edee7aa4 Text-content-sha1: bc8c8b845710decc277909df4d705e27186324b5 Content-length: 36 SVN��__���`�mr1010 Node-path: putty/mac/macpgen.r Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c6e008b1a6569e44ae2259d015fe9a9 Text-delta-base-sha1: 0338b9b91af50a221685308e2a0229a3e1b96dfb Text-content-length: 31 Text-content-md5: 6ee57bd8e2a7c5e27849c19586fe399e Text-content-sha1: aaa2f859fdfdb8384d55aa068d0a46e152079fca Content-length: 31 SVN���=��Z?�m1010 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df2174c661ff9642949680081bf0bd03 Text-delta-base-sha1: ca84bb895977e040354eebfecbfdfbf9a14d7760 Text-content-length: 47 Text-content-md5: 7588cea1f9587b76e7cc4cbf5f8cd20c Text-content-sha1: fa495010ee7f40a8b111bf9e0e088dd4baa32030 Content-length: 47 SVN���������JJ���O�^l1010 Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e077c43dc4e9bf54399ae61f57bde5f1 Text-delta-base-sha1: ec7e29d989ac0f6c43050ff12460459488dc4064 Text-content-length: 31 Text-content-md5: d437b50239dc79374ad5638d91d5ad32 Text-content-sha1: 46b1bb04c9aa83beae410484e4aa8b24c601e873 Content-length: 31 SVN�� �,��K.�{1010 Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e5e15f98760c7b0e84858ae248cbb988 Text-delta-base-sha1: 6951b5804f11c09a814dd173402b5c937c6883f0 Text-content-length: 31 Text-content-md5: 04b571ba57939a73d40dd91e00d962d4 Text-content-sha1: 2782d5a55160ae18a2ceee5d5fef04839a0414d0 Content-length: 31 SVN��CC�c��Ke�21010 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 639f4c98843c04fd78e9af46bb8aface Text-delta-base-sha1: 2a3672244753699695ad1bd07c88c327bb89f32d Text-content-length: 23 Text-content-md5: 036fe68af9f890c98b32568346bc52c6 Text-content-sha1: 51fb0c3b4f5b0270c5fbccf06e1ac716c43a7878 Content-length: 23 SVN��RR �[��u]10 Node-path: putty/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 50ce5c82fa16fb970b9c217e7216a33c Text-delta-base-sha1: ede8ef8bb91b60339a51fb503e2b81ad041f6944 Text-content-length: 31 Text-content-md5: bb63f30bc3a550f8577e022b6eee221b Text-content-sha1: e404d20eb97154b1be230b2d80cfb877e5878c85 Content-length: 31 SVN��tt�j��Bl�D01010 Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a52a0042ef51b91d0f4bc53b2f54bb9e Text-delta-base-sha1: fc842505266023988b6062033841690080794bc8 Text-content-length: 23 Text-content-md5: e6ca4e89b971e9d2bd47abf5fd1b87ac Text-content-sha1: f2a9a040977a18cf603c8ffd84e1e7a013c560aa Content-length: 23 SVN��ee �*��9,10 Revision-number: 8849 Prop-content-length: 235 Content-length: 235 K 8 svn:date V 27 2010-01-17T23:53:29.313952Z K 7 svn:log V 134 Revert r8847, which was bilge; I can't magically change the order of a tree just by giving a different sorting function to find234(). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/timing.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 27205b18b471ce8d397338ed2537f499 Text-delta-base-sha1: 3a6237477124ef8a22b35f475725d9a6c4135545 Text-content-length: 758 Text-content-md5: 6f14fabc8dad64276224cb06b79b826d Text-content-sha1: 1d010acfde2b438c9c14ac03d45a2f9d743c2b8c Content-length: 758 SVN��GA(B�S��uB�(E�nhB�L\�d/tree234 *timer_contextchar *a = (char *)av; char *b = (char *)bvtimer_contexts = newtree234(compare_timer_context else { add234(timer_contexts, t->ctx);/* don't care if this failnd234(timer_contexts, first->ctx, NULL) == NULL) { /* * This timer belongs to a context that has been * expired. Delete it without running. */ delpos234(timers, 0); sfree(first); } else init_timers(); /* * We don't bother to check the return value; if the context * already wasn't in the tree (presumably because no timers * ever actually got scheduled for it) then that's fine and we * simply don't need to do anything. */ del234(timer_contexts, ctx); } Revision-number: 8850 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8851 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8852 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8853 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8854 Prop-content-length: 296 Content-length: 296 K 8 svn:date V 27 2010-01-23T12:25:31.526841Z K 7 svn:log V 195 Our handling of timers in Gtk was truncating times on 64-bit systems; one symptom was that the terminal window would not update until a focus-change event. Spotted and patched by Max Kellermann. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 721373a587955321f055ee8d8c0c01f5 Text-delta-base-sha1: 98a0c534378f99b1348ab582269f76e1a3b566c8 Text-content-length: 57 Text-content-md5: c4b7d6ab310580866c52e1ab5450eea1 Text-content-sha1: e3a9dbb3b3623b2efe962371b3bc6c19569c48ca Content-length: 57 SVN�����7��4:� qSIZESIZE�TV�T�e Revision-number: 8855 Prop-content-length: 126 Content-length: 126 K 8 svn:date V 27 2010-01-25T14:33:39.470002Z K 7 svn:log V 26 ...and the rest of r8854. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c4b7d6ab310580866c52e1ab5450eea1 Text-delta-base-sha1: e3a9dbb3b3623b2efe962371b3bc6c19569c48ca Text-content-length: 45 Text-content-md5: e03646f893933456f8c85e9774c13397 Text-content-sha1: a4a91e4328796a3699fe094e8aff867d20ff722d Content-length: 45 SVN���� ���]"SIZE�VW�V�l Revision-number: 8856 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8857 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8858 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8859 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8860 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8861 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8862 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8863 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8864 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8865 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8866 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8867 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8868 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8869 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8870 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8871 Prop-content-length: 383 Content-length: 383 K 8 svn:date V 27 2010-02-17T19:02:04.908332Z K 7 svn:log V 282 Null out the socket pointers in X- and port-forwarding channels for which we close the socket without destroying the channel. John Peterson reports periodic crashes under heavy load which appear to be fixed by this, though I don't know the exact circumstances induced by that load. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 75b2e7352f9694109c84e9fee1de1fbd Text-delta-base-sha1: d022724cb46bce2281f345cce00fb742c664b02a Text-content-length: 139 Text-content-md5: a626e1ee341f258acd917a6a25b8601a Text-content-sha1: 99455398bc84a7e23ef54ebd12b1355b9764122f Content-length: 139 SVN�����������"�?��<� Kc->u.x11.s = NULLc->u.pfd.s = NULL�c (�c�; /* what is it? */ /* If it's 0, it h Revision-number: 8872 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8873 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8874 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8875 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 50 Update to r8614: another -D_FORTIFY_SOURCE=2 fix. K 10 svn:author V 5 simon K 8 svn:date V 27 2010-02-20T11:21:25.516426Z PROPS-END Node-path: putty/unix/uxprint.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f3d513725dd9f416778eadd9eed0d43a Text-delta-base-sha1: a04b6e487b84e63684c7b49c8bf37aa6c91ab03b Text-content-length: 74 Text-content-md5: baa0b19a310c481e150a2bd12118b75d Text-content-sha1: 0d656590fd13b1c86e13b62caf4967fb0b8fe0ee Content-length: 74 SVN�� 5�.��8Jif (fwrite(data, 1, len, pj->fp) < len) /* ignore */ Revision-number: 8876 Prop-content-length: 516 Content-length: 516 K 8 svn:date V 27 2010-02-20T19:06:30.543047Z K 7 svn:log V 415 Colin Watson reports that linking with 'gold' doesn't work, because PuTTY makes explicit use of libX11 without including -lX11 on the link line. (GNU ld appears to pull in libX11 automatically because it's needed for the dependencies of GTK, but gold expects that dependency to be satisfied at run time via DT_NEEDED and hence doesn't bother.) Hence, add explicit -lX11 to both Makefile.gtk and the autoconf world. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e744f646d91aaac5c42b921136eee7ce Text-delta-base-sha1: be431e96c55110f8db559c328bee0b15df471d0b Text-content-length: 85 Text-content-md5: 15994ac1e98571f9367727fc956a4620 Text-content-sha1: b0e269136726ff68060c09d1f00a7ac4ea2367b4 Content-length: 85 SVN��2:.�-��'-�l|�Lf x11x11 \$\$0 2>/dev/null || gtk-config \$\$0' Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ab42099cb68adbbc4465ccc7d9da7035 Text-delta-base-sha1: aaac8bb37a5d8bfe98672a70f7ec4093cf81b6bf Text-content-length: 43 Text-content-md5: cddc3df35ee11a7f82b3d0df2cb38fd1 Text-content-sha1: 9b01a3f3b8ed4f24dfe4076988db56481a82ef63 Content-length: 43 SVN��f �"��OLIB(X11, XOpenDisplay) Revision-number: 8877 Prop-content-length: 182 Content-length: 182 K 8 svn:date V 27 2010-02-20T19:09:53.343940Z K 7 svn:log V 82 Colin Watson points out that we've fixed this, so it ought to be marked as fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/unix-lp64 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2efe8ecfa59a5c5302f48bba78d29889 Text-delta-base-sha1: 180b7608145c1208c637afe9b517b1c120ea0dc0 Text-content-length: 34 Text-content-md5: 4d2bf06fde166fd756cf5a09ac7effdb Text-content-sha1: 566f6faff43604d73dd8420ad9176311c0639b75 Content-length: 34 SVN��,�[��BZFixed-in: r8855 Revision-number: 8878 Prop-content-length: 194 Content-length: 194 K 7 svn:log V 94 Unix console utilities should send prompts to /dev/tty or failing that stderr, not to stdout. K 10 svn:author V 5 simon K 8 svn:date V 27 2010-02-20T19:15:25.487783Z PROPS-END Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c80f9590993ac27aa04c8fe03fa9ef33 Text-delta-base-sha1: 02707abc24bd0b9740d7c96b7a6b5aae3e1db6e3 Text-content-length: 945 Text-content-md5: 651249d97a502084a96022042d83e4a6 Text-content-sha1: 40606e5dad80c400752cc8db1ec47fd1af081abb Content-length: 945 SVN��&1t�(�l�_r�kk�*T]� Qk�|=�RH|�=S/* * Special function to print text to the console for password * prompts and the like. Uses /dev/tty or stderr, in that order of * preference; also sanitises escape sequences out of the text, on * the basis that it might have been sent by a hostile SSH server * doing malicious keyboard-interactive. */ static void console_prompt_text(FILE **confp, const char *data, int len) { int i; if (!*confp) { if ((*confp = fopen("/dev/tty", "w")) == NULL) *confp = stderr; } *confp); fflush(*confp FILE *confp = NULLprompt_text(&confp, p->name, l); if (p->name[l-1] != '\n') console_prompt_text(&confp, prompt_text(&confp, p->instruction, l); if (p->instruction[l-1] != '\n') console_prompt_text(&confp, prompt_text(&confp, console_prompt_text(&confp, "\n", 1); } if (confp && confp != stderr) fclose(confp); return 1; /* success */ Revision-number: 8879 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8880 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8881 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8882 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8883 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8884 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8885 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8886 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8887 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8888 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8889 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8890 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8891 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8892 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8893 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8894 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8895 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8896 Prop-content-length: 545 Content-length: 545 K 10 svn:author V 5 simon K 8 svn:date V 27 2010-03-06T15:50:26.969095Z K 7 svn:log V 444 Centralise generation of the control sequences for arrow keys into a function in terminal.c, and replace the cloned-and-hacked handling code in all our front ends with calls to that. This was intended for code cleanliness, but a side effect is to make the GTK arrow-key handling support disabling of application cursor key mode in the Features panel. Previously that checkbox was accidentally ignored, and nobody seems to have noticed before! PROPS-END Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 16a64be6fd3976fda88017b60fb55813 Text-delta-base-sha1: 80aeb9d59eded8d6841dd9419049642b5749424b Text-content-length: 104 Text-content-md5: 22d8239936e9dd5b8e38db474609a9c4 Text-content-sha1: 5770423da4c3097a3a1b0d6fee2a3d40786696d4 Content-length: 104 SVN��I@ N�m�N�Dend += format_arrow_key(output+end, term, xkey, m & NSControlKeyMask); Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bcacf8f7c515e83a221da8d645540662 Text-delta-base-sha1: cf2286b8438659630df911371083d50bdf157b47 Text-content-length: 92 Text-content-md5: aebca2c8fb01d7733fbec9b9816777c4 Text-content-sha1: 8b91a11a951938416c631b87f3846f8485add61e Content-length: 92 SVN��%k B� �B� int format_arrow_key(char *buf, Terminal *term, int xkey, int ctrl Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f35d1a9725ef24e5156cf6259a3fbfef Text-delta-base-sha1: f87c2285e49404f338a7be9363ef23df4c8eee10 Text-content-length: 1057 Text-content-md5: 7d6be6f924d1f61b72faad0faebb63a9 Text-content-sha1: 81a40e4f82504689c30cb5ea7514fd0bc3e39a06 Content-length: 1057 SVN���������GLn�R�/�M�tSint format_arrow_key(char *buf, Terminal *term, int xkey, int ctrl) { char *p = buf; if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", xkey); else { int app_flg = (term->app_cursor_keys && !term->cfg.no_applic_c); #if 0 /* * RDB: VT100 & VT102 manuals both state the app cursor * keys only work if the app keypad is on. * * SGT: That may well be true, but xterm disagrees and so * does at least one application, so I've #if'ed this out * and the behaviour is back to PuTTY's original: app * cursor and app keypad are independently switchable * modes. If anyone complains about _this_ I'll have to * put in a configurable option. */ if (!term->app_keypad_keys) app_flg = 0; #endif /* Useful mapping of Ctrl-arrows */ if (ctrl) app_flg = !app_flg; if (app_flg) p += sprintf((char *) p, "\x1BO%c", xkey); else p += sprintf((char *) p, "\x1B[%c", xkey); } return p - bufp += format_arrow_key(p, term, xkey, modifiers == PKM_CONTROL); Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e03646f893933456f8c85e9774c13397 Text-delta-base-sha1: a4a91e4328796a3699fe094e8aff867d20ff722d Text-content-length: 486 Text-content-md5: e074141f72ba41d9008f773403d86017 Text-content-sha1: bc1e1ce603d2f98db7f0613efe4c533391002e22 Content-length: 486 SVN����9�O�`�xYend = 1 + format_arrow_key(output+1, inst->term, xkey, event->state & GDK_CONTROL_MASK);le ? gtk_menu_item_new_with_label(title) : \ gtk_menu_item_new(); \ gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \ gtk_widget_show(menuitem); \ if (func != NULL) \ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \ GTK_SIGNAL_FUNC(func), inst); \ } while (0) if (new_session) MKMENUITEM("New Sessi�W~��~Y Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f35a0e3d17b48f1880de802d67af48b Text-delta-base-sha1: 34a2f9e1fbadc44a70e1b1fea30bd5be7f8ea2d9 Text-content-length: 90 Text-content-md5: c1eab62ff0837635c7f7e7e5a2969893 Text-content-sha1: ad74c99c733a1609a18f7a93d4f6dffdd710580f Content-length: 90 SVN���������w| 2���7@p += format_arrow_key(p, term, xkey, shift_state); Revision-number: 8897 Prop-content-length: 220 Content-length: 220 K 8 svn:date V 27 2010-03-13T14:47:14.918293Z K 7 svn:log V 119 Tweak description of dynamic port forwarding, and point people running into 'Out of space for port forwardings' at it. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b0b11872b20d33e3e274a401244ec13e Text-delta-base-sha1: bddbdce0fbb3003bc8aa5125141c9525a9297ce1 Text-content-length: 152 Text-content-md5: 53df1dd1a1e893af7c9ef13d3ca6e99d Text-content-sha1: 980ce72d9f47a2189b30e8b8a3907a415ec4aa7a Content-length: 152 SVN��| �����kIf you're running into this limit, you may want to consider using dynamic port forwarding instead; see \k{using-port-forwarding} Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 87b569885a05da77f0625424d723f84c Text-delta-base-sha1: a798f8e76ac95861a4844c7dc335086bb0672010 Text-content-length: 50 Text-content-md5: 5f1d85cc72be2c7465a23229f2fdc493 Text-content-sha1: 304a8a912e46a4d824ff2be6450a2f9c86d99902 Content-length: 50 SVN��Gf�G� \IM{web browsers} web browser Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc10fb8505b7bfa97bf242ee9791f23c Text-delta-base-sha1: d8ac5eac19c897795413e1581fb33b3ef38b5455 Text-content-length: 622 Text-content-md5: 43506484be16e4c89786bc58396ab7ff Text-content-sha1: 8e7f00dca7a0b49316bc1cdb59d07f7d553655bb Content-length: 622 SVN��WAE� �4�tn�c�TIn this mode, PuTTY acts as a SOCKS server, which SOCKS-aware programs can connect to and open forwarded connections to the destination of their choice, so this can be an alternative to long lists of static forwardings. To use this mode, you will need to select the \q{Dynamic} radio button instead of \q{Local}, and then you should not enter anything into the \q{Destination} box (it will be ignored). PuTTY will then listen for SOCKS connections on the port you have specified. Most \i{web browsers} can be configured to connect to this SOCKS proxy service; also \i{web browsers} Node-path: putty-wishlist/data/portfwd-space Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4dc07c4900a1bfb8f4900a7c77b85e1e Text-delta-base-sha1: cdfcd6aadcef79b54325d377a91621b6efa0b115 Text-content-length: 124 Text-content-md5: 7fe78f8cfc6f3a5005a1c3e1b9be5147 Text-content-sha1: 0dab67bb028d49341ef77fe5186b933546587a5f Content-length: 124 SVN��j f�v�f�t <p> If you're running into this limit, you may want to consider using dynamic port forwarding instead Revision-number: 8898 Prop-content-length: 437 Content-length: 437 K 8 svn:date V 27 2010-03-13T15:14:30.467246Z K 7 svn:log V 336 I think r8738 broke IPv6 in MSVC Windows builds due to conflict with the WspiapiGetAddrInfo wrapper for getaddrinfo() in MSVC. Split GET_WINDOWS_FUNCTION into two variants, one with the old behaviour (bypassing the preprocessor) and another with the new behaviour (for ANSI/Unicode, although it's not actually used anywhere currently). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c8452fa15d7dc6d26dd7810936eef48c Text-delta-base-sha1: 9feae49a8632af6638dc097da6128ac6c0a6eb9b Text-content-length: 907 Text-content-md5: bed60f3facd581611ad9d0f14ba05e24 Text-content-sha1: a574cdee161501027b8e3806ce5935edf6279f73 Content-length: 907 SVN�� ng�C�x�ZO�])l� } These come in two flavours: * * - GET_WINDOWS_FUNCTION does not expose "name" to the preprocessor, * so will always dynamically link against exactly what is specified * in "name". If you're not sure, use this one. * * - GET_WINDOWS_FUNCTION_PP allows "name" to be redirected via * preprocessor definitions like "#define foo bar"; this is principally * intended for the ANSI/Unicode DoSomething/DoSomethingA/DoSomethingW. * If your function has an argument of type "LPTSTR" or similar, this * is the variant to use. * (However, it can't always be used, as it trips over more complicated * macro trickery such as the WspiapiGetAddrInfo wrapper for getaddrinfo.) * * (DECL_WINDOWS_FUNCTION works with both these variants.)_PP#define GET_WINDOWS_FUNCTION(module, name) \ p_##name = module ? (t_##name) GetProcAddress(module, #name Revision-number: 8899 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8900 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8901 Prop-content-length: 161 Content-length: 161 K 7 svn:log V 61 r8854/5 broke compilation with Gtk 1.2. Grow a hack to cope. K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-03-14T18:58:20.485483Z PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e074141f72ba41d9008f773403d86017 Text-delta-base-sha1: bc1e1ce603d2f98db7f0613efe4c533391002e22 Text-content-length: 734 Text-content-md5: 7b73d9ebc1fb1fca4cc9f44cca3235b6 Text-content-sha1: 052836caa9f771d0dff6be3c26d3f0e17f32ec7b Content-length: 734 SVN����#X�i�B�wg�3b�'�nN#if GTK_CHECK_VERSION(2,0,0) ASSERT(sizeof(long) <= sizeof(gsize)); #define LONG_TO_GPOINTER(l) GSIZE_TO_POINTER(l) #define GPOINTER_TO_LONG(p) GPOINTER_TO_SIZE(p) #else /* Gtk 1.2 */ ASSERT(sizeof(long) <= sizeof(gpointer)); #define LONG_TO_GPOINTER(l) ((gpointer)(long)(l)) #define GPOINTER_TO_LONG(p) ((long)(p)) #endifLONGLONG_TO_GLONG_TO_G�~BDD�~�w_with_label(title) : \ gtk_menu_item_new(); \ gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \ gtk_widget_show(menuitem); \ if (func != NULL) \ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \ GTK_SIGNAL_FUNC(func), inst); \ } while (0) if (new_session) MKMENUITEM("New Sessi Revision-number: 8902 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8903 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8904 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8905 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8906 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8907 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8908 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8909 Prop-content-length: 499 Content-length: 499 K 8 svn:date V 27 2010-03-24T20:12:25.832194Z K 7 svn:log V 398 When looking for a local username on Windows, if we can get hold of the NameUserPrincipal, use that; this avoids an issue with SSPI/GSSAPI where the user logged in to the local machine with a different case of username to the (case-sensitive) Kerberos username. Falls back to GetUserName as before if that doesn't work (for machines not on a domain, and Win9x). Based on a patch by SebastianUnger. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 654697658962e6c30f12cfbf16769350 Text-delta-base-sha1: d9287c2dff2efde3f61783c669f04559fec3255c Text-content-length: 52 Text-content-md5: 374a9a3e1efae42d18ef23c16ad4378e Text-content-sha1: 27ef74ea824fc965a2fe3b9906026653a223b3c6 Content-length: 52 SVN��~ �3��F8 user ? user : "" Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b86375284cf34732cb218d31574e1f5 Text-delta-base-sha1: 1b43a3df26343ba6ec9e45402a63b412bb7b3943 Text-content-length: 141 Text-content-md5: a51d66fdda6c5592dc66abbee873e53c Text-content-sha1: 0008b16d6f8947bd8ef1042c69af39ca4b58bfba Content-length: 141 SVN��Q t��t�s^if (luser) { strncpy(user, luser, len); user[len-1] = '\0'; sfree(luser); } else { *user = '\0'; } Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cbde5371b250f670a70140cf3a44c3da Text-delta-base-sha1: 96c44db255d6c922befa0cf95e8e49d38ab24b96 Text-content-length: 1430 Text-content-md5: db30d7704413453decef48e7173316f0 Text-content-sha1: 69698c82a3d996df074f38c2572e168439c144a5 Content-length: 1430 SVN��|:z�v��que�Y##include <security.h> int got_username = FALSE; DECL_WINDOWS_FUNCTION(static, BOOLEAN, GetUserNameExA, (EXTENDED_NAME_FORMAT, LPSTR, PULONG)); { static int tried_usernameex = FALSE; if (!tried_usernameex) { /* Not available on Win9x, so load dynamically */ HMODULE secur32 = LoadLibrary("SECUR32.DLL"); GET_WINDOWS_FUNCTION(secur32, GetUserNameExA); tried_usernameex = TRUE; } } if (p_GetUserNameExA) { /* * If available, use the principal -- this avoids the problem * that the local username is case-insensitive but Kerberos * usernames are case-sensitive. */ /* Get the length */ namelen = 0; (void) p_GetUserNameExA(NameUserPrincipal, NULL, &namelen); user = snewn(namelen, char); got_username = p_GetUserNameExA(NameUserPrincipal, user, &namelen); if (got_username) { char *p = strchr(user, '@'); if (p) *p = 0; } else { sfree(user); } } if (!got_username) { /* Fall back to local user name */ namelen = 0; if (GetUserName(NULL, &namelen) == FALSE) { /* * Apparently this doesn't work at least on Windows XP SP2. * Thus assume a maximum of 256. It will fail again if it * doesn't fit. */ namelen = 256; } user = snewn(namelen, char); got_username = GetUserName(user, &namelen); if (!got_username) { sfree(user); } } return got_username ? user : NULL Revision-number: 8910 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2010-03-25T18:41:27.689163Z K 7 svn:log V 37 r8909 broke the Visual Studio build. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5aae5a9fbc5c7fdba58d7886a5d92c27 Text-delta-base-sha1: dd937368c6cdac049adafeb0c42a68e94d3229ab Text-content-length: 38 Text-content-md5: 45a0efa12b4044c03ef1a234cdf456fa Text-content-sha1: 863e99ac24d2abec1a0973eb3fc13bbcaacb5b23 Content-length: 38 SVN��$ ���x /DSECURITY_WIN32 Revision-number: 8911 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2010-03-26T00:54:05.173229Z K 7 svn:log V 74 Remove SECURITY_WIN32 (knock-on from r8910, which validates it somewhat). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5da313eb578575f9be9d6b511ed33890 Text-delta-base-sha1: 547f8daaff1dda7f53cdaa3a4ce53e206b92240e Text-content-length: 54 Text-content-md5: 6e721ac459e50cdf60997d2ac0452b86 Text-content-sha1: fd0a177cd2686de314252f85aea13bbd3a88113d Content-length: 54 SVN�� s&�M=#ifndef NO_GSSAPI #include "putty.h" Revision-number: 8912 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8913 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8914 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8915 Prop-content-length: 183 Content-length: 183 K 7 svn:log V 83 Summary: Support OpenSSH AES-encrypted keys in PuTTYgen Class: wish Priority: high K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-04-08T18:50:02.600330Z PROPS-END Node-path: putty-wishlist/data/puttygen-openssh-aes Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 650 Text-content-md5: 3aad6afa175021aebe6a935d59f5ed2c Text-content-sha1: 7f8f6b954a814b16e920d0cd45360358164f0490 Content-length: 660 PROPS-END SVN���|||Summary: Support OpenSSH AES-encrypted keys in PuTTYgen Class: wish Priority: high Difficulty: fun Content-type: text/x-html-body <p> From the <a href="http://lists.mindrot.org/pipermail/openssh-unix-announce/2010-March/000098.html">OpenSSH 5.4 changelog</a>: <pre> * Passphrase-protected SSH protocol 2 private keys are now protected with AES-128 instead of 3DES. This applied to newly-generated keys as well as keys that are reencrypted (e.g. by changing their passphrase).</pre> <p> PuTTYgen should certainly learn to import such keys. It should probably also have the option to export keys encrypted with either cipher. Revision-number: 8916 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2010-04-12T10:55:31.177091Z K 7 svn:log V 89 Support importing of new-style OpenSSH private keys (encrypted by AES rather than 3DES). K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5010245651454c14240dff767f3ef046 Text-delta-base-sha1: eb08d18cddf0313c10a3b9ef158dbc70b90d6091 Text-content-length: 1168 Text-content-md5: 1d9fdc4188583685532b5d1aa0f5ff9b Text-content-sha1: 5ba0e67b5ed2a31aff68593586cc821042e60bdd Content-length: 1168 SVN��IL&\�T�x�R?�flG�K�U}�Denum { OSSH_ENC_3DES, OSSH_ENC_AES }; struct openssh_key { int type; int encrypted, encryption; char iv[32];, ivlen; if (!strncmp(p, "DES-EDE3-CBC,", 13)) { ret->encryption = OSSH_ENC_3DES; ivlen = 8; } else if (!strncmp(p, "AES-128-CBC,", 12)) { ret->encryption = OSSH_ENC_AES; ivlen = 16; } else { errmsg = "unsupported cipher"; goto error; } p = strchr(p, ',') + 1;/* always non-NULL, by above checks */ for (i = 0; i < ivlen; i++) { if (1 != sscanf(p, "%2x", &j)) { errmsg = "expected more iv data in DEK-Info"; goto error; } ret->iv[i] = j; p += 2; } if (*p) { errmsg = "more iv data than expectedif (key->encryption == OSSH_ENC_3DES) des3_decrypt_pubkey_ossh(keybuf, (unsigned char *)key->iv, key->keyblob, key->keyblob_len); else { void *ctx; assert(key->encryption == OSSH_ENC_AES); ctx = aes_make_context(); aes128_key(ctx, keybuf); aes_iv(ctx, (unsigned char *)key->iv); aes_ssh2_decrypt_blk(ctx, key->keyblob, key->keyblob_len); aes_free_context(ctx); } Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 204de6b249cabac10ecdc41b36d654c6 Text-delta-base-sha1: 22745bf90cdc75b8e90bd81ea94b0be897e3d9a2 Text-content-length: 431 Text-content-md5: 020ea72dd5d815950dc7740ad785e5ac Text-content-sha1: 501298df1c554d340bdd1237fb4d985d54eff4c7 Content-length: 431 SVN�� �6��L5void *aes_make_context(void); void aes_free_context(void *handle); void aes128_key(void *handle, unsigned char *key); void aes192_key(void *handle, unsigned char *key); void aes256_key(void *handle, unsigned char *key); void aes_iv(void *handle, unsigned char *iv); void aes_ssh2_encrypt_blk(void *handle, unsigned char *blk, int len); void aes_ssh2_decrypt_blk(void *handle, unsigned char *blk, int len); Node-path: putty/sshaes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 52335b49be9eea1bba9e6cf046a4f72d Text-delta-base-sha1: b18c3519337a89ce7340621d7cba5b9a931f7bdb Text-content-length: 200 Text-content-md5: 9c576877bba588b75dcdf146f410af67 Text-content-sha1: 2e9840a9191cc4e8bafdd6b31fc25d6046cb9881 Content-length: 200 SVN��i1,�)�{�9�qZ�O�4Z��36void *aes_make_context(void) { return snew(AESContext); } void aes_free_context(void *handle) { sfree(handle); } void aes19224); } Revision-number: 8917 Prop-content-length: 251 Content-length: 251 K 8 svn:date V 27 2010-04-12T11:02:06.029858Z K 7 svn:log V 150 Add comments on OpenSSH AES-encrypted key support, including one mentioning that I haven't yet switched to _exporting_ OpenSSH keys in the new style. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1d9fdc4188583685532b5d1aa0f5ff9b Text-delta-base-sha1: 5ba0e67b5ed2a31aff68593586cc821042e60bdd Text-content-length: 276 Text-content-md5: 75ae080f930151e06f70d3ccbff5b838 Text-content-sha1: 445493e9a120fabcd076d10c99d7a6cfe677e81f Content-length: 276 SVN��LIq�U��QU�hd * (Note that only 8 bytes of the iv are used for key * derivation, even when the key is encrypted with AES and * hence there are 16 bytes available.) * For the moment, we still encrypt our OpenSSH keys using * old-style 3DES Revision-number: 8918 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2010-04-12T11:03:17.211663Z K 7 svn:log V 27 Update wishlist for r8917. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/puttygen-openssh-aes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3aad6afa175021aebe6a935d59f5ed2c Text-delta-base-sha1: 7f8f6b954a814b16e920d0cd45360358164f0490 Text-content-length: 123 Text-content-md5: 2177fe81a1413b70e171489ce7ebc926 Text-content-sha1: b2fd9a4c4ec397f39d32d90cb4a51ff27cf0f11a Content-length: 123 SVN��|c f�c��bWFixed-in: r8917 <b>SGT, 2010-04-12</b>: r8917 can now import the new keys, but won't export them yet. Revision-number: 8919 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8920 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8921 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8922 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8923 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8924 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8925 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8926 Prop-content-length: 633 Content-length: 633 K 8 svn:date V 27 2010-04-23T18:32:15.257655Z K 7 svn:log V 532 New SSH bug flag, for 'can't handle SSH2_MSG_IGNORE'. Another user today reported an SSH2_MSG_UNIMPLEMENTED from a Cisco router which looks as if it was triggered by SSH2_MSG_IGNORE, so I'm experimentally putting this flag in. Currently must be manually enabled, though if it turns out to solve the user's problem then I'll probably add at least one version string... [Edited commit message: actually, I also committed in error a piece of experimental code as part of this checkin. Serve me right for not running 'svn diff' first.] K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 374a9a3e1efae42d18ef23c16ad4378e Text-delta-base-sha1: 27ef74ea824fc965a2fe3b9906026653a223b3c6 Text-content-length: 156 Text-content-md5: 04c4c4c9066c94ed34178283bb567193 Text-content-sha1: 97084c2e44c98d23d3f4a19fa317ac0877dd95eb Content-length: 156 SVN��/��^���QBChokes on SSH-2 ignore messages", '2', 20, HELPCTX(ssh_bugs_ignore2), sshbug_handler, I(offsetof(Config,sshbug_ignore2 Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0d3bd933c54b304287c37dd25cf9db5e Text-delta-base-sha1: 284f4f872ba87187ac906895dae793232414a094 Text-content-length: 498 Text-content-md5: 00d4d0e9eeb015fbe06631ca5e7d9c7f Text-content-sha1: 17b9217d2ce774db0960c162da1e7e9144a48187 Content-length: 498 SVN���������\#1�w��7WV� f{�Y'`�yignore2} \q{Chokes on SSH-2 \i{ignore message}s} \cfg{winhelp-topic}{ssh.bugs.ignore2in SSH-2 to confuse the encrypted data stream and make it harder to cryptanalyse. It also uses ignore messages for connection \i{keepalives} (see \k{config-keepalive}). If it believes the server to have this bug, PuTTY will stop using ignore messageskeepalives will not work and the session might be less cryptographically secure than it could be Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aebca2c8fb01d7733fbec9b9816777c4 Text-delta-base-sha1: 8b91a11a951938416c631b87f3846f8485add61e Text-content-length: 78 Text-content-md5: 2b88a7a24aee3b4df40a50b792939a82 Text-content-sha1: dd960e94764e0e20a43fdcf3b8808fbe55eee05a Content-length: 78 SVN��k,.�^�� ]��k, sshbug_ignorescroll_to_selection(Terminal * Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a51d66fdda6c5592dc66abbee873e53c Text-delta-base-sha1: 0008b16d6f8947bd8ef1042c69af39ca4b58bfba Text-content-length: 118 Text-content-md5: a7651467da23903566f5bf3e0866f66c Text-content-sha1: 11852be206f1fe2ec03165e945ef355c5091eaaf Content-length: 118 SVN��V�C��>�.QIgnore2", 2-cfg->sshbug_ignore2gppi(sesskey, "BugIgnore2", 0, &i); cfg->sshbug_ignore2 Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a626e1ee341f258acd917a6a25b8601a Text-delta-base-sha1: 99455398bc84a7e23ef54ebd12b1355b9764122f Text-content-length: 1906 Text-content-md5: 095c96ab5704e2f0ff807c0af7aa13b9 Text-content-sha1: cf908f15330c6b0e6e5690c417ba95b3b27786f4 Content-length: 1906 SVN����#����l�r~�nj#define BUG_CHOKES_ON_SSH2_IGNORE 512 && !(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE) && !(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE) if (ssh->cfg.sshbug_ignore2 == FORCE_ON) { /* * Servers that don't support SSH2_MSG_IGNORE. Currently, * none detected automatically. */ ssh->remote_bugs |= BUG_CHOKES_ON_SSH2_IGNORE; logevent("We believe remote version has SSH-2 ignore bug���((�X� == SSH_CIPHER_BLOWFISH ? &ssh_blowfish_ssh1 : s->cipher_type == SSH_CIPHER_DES ? &ssh_des : &ssh_3des); ssh->v1_cipher_ctx = ssh->cipher->make_context(); ssh->cipher->sesskey(ssh->v1_cipher_ctx, ssh->session_key); logeventf(ssh, "Initialised %s encryption", ssh->cipher->text_name); ssh->crcda_ctx = crcda_make_context(); logevent("Installing CRC compensation attack detector"); if (serv� [)3(��x�#M�],�2� E; /* ICK: older versions of OpenSSH (e.g. 3.4p1) * provide an `int' for the signal, despite its * having been a `string' in the drafts of RFC 4254 since at * least 2001. (Fixed in session.c 1.147.) Try to * infer which we can safely parse it as. */ { unsigned char *p = pktin->body + pktin->savedpos; long len = pktin->length - pktin->savedpos; unsigned long num = GET_32BIT(p)ignore_special[] = { {"IGNORE message", TS_NOP}, }; static const struct telnet_special ssh2_rekey_special[] = {ignore_special) + lenof(ssh2_rekey_specialif (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE)) ADD_SPECIALS(ssh2_ignore_special); if (!(ssh->remote_bugs & BUG_SSH2_REKEY)) ADD_SPECIALS(ssh2_rekey_specialif (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE)) { pktout = ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(pktout); ssh2_pkt_send_noqueue(ssh, pktout); } Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7d6be6f924d1f61b72faad0faebb63a9 Text-delta-base-sha1: 81a40e4f82504689c30cb5ea7514fd0bc3e39a06 Text-content-length: 511 Text-content-md5: 32b08fedbc5b32eb45501fbe5936e73c Text-content-sha1: ab63749f666460ef59016b1ea5f6e463d7b8fd5d Content-length: 511 SVN���������L*R�[�R�}OScroll the scrollback to centre it on the beginning or end of the * current selection, if any. */ void term_scroll_to_selection(Terminal *term, int which_end) { pos target; int y; int sbtop = -sblines(term); if (term->selstate != SELECTED) return; if (which_end) target = term->selend; else target = term->selstart; y = target.y - term->rows/2; if (y < sbtop) y = sbtop; else if (y > 0) y = 0; term_scroll(term, -1, y Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c1eab62ff0837635c7f7e7e5a2969893 Text-delta-base-sha1: ad74c99c733a1609a18f7a93d4f6dffdd710580f Text-content-length: 172 Text-content-md5: 89836126b15c5bc4723d03b330e54fb7 Text-content-sha1: 3d1d588a9dc35ca778d7037746f757db6004315f Content-length: 172 SVN���������| �)��m(wParam == VK_PRIOR || wParam == VK_NEXT) && shift_state == 3) { term_scroll_to_selection(term, (wParam == VK_PRIOR ? 0 : 1) Revision-number: 8927 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2010-04-24T07:14:29.038570Z K 7 svn:log V 57 Bah, missed out a tiny but build-breaking part of r8926. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f06b7e03f99653bcffa2c8ed9f3917fd Text-delta-base-sha1: 3ab97b53771c2c3997f0883c4a295c9ba3f80202 Text-content-length: 69 Text-content-md5: 0470edf71eb26614b9bbae9d070f7a12 Text-content-sha1: 3900152ffd1d9a0e51c4c9230b1b65ea71052c59 Content-length: 69 SVN��W& 0�Z��;ignore2 "ssh.bugs.ignore2:config-ssh-bug-ignore2 Revision-number: 8928 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8929 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8930 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8931 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8932 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8933 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8934 Prop-content-length: 201 Content-length: 201 K 10 svn:author V 5 simon K 8 svn:date V 27 2010-04-26T17:28:42.325915Z K 7 svn:log V 100 When doing custom bob builds from a given SVN revision, include the date and time in the About box. PROPS-END Node-path: putty/version.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fa1ba53ce29b03d0dd69edfe4bf0e839 Text-delta-base-sha1: 954986bef1b25427f63636c18d8c4b0493ea9885 Text-content-length: 48 Text-content-md5: 91abcd747562e8eb6683c61aeaea4bca Text-content-sha1: d6c4079af264b7425bf57001cd9714bf112417eb Content-length: 48 SVN��e� � ��[ ", " __DATE__ " " __TIME__ Revision-number: 8935 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8936 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8937 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8938 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8939 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8940 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8941 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8942 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8943 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8944 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8945 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8946 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8947 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8948 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8949 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8950 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8951 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8952 Prop-content-length: 594 Content-length: 594 K 8 svn:date V 27 2010-05-19T18:22:17.606712Z K 7 svn:log V 493 Patch from Alejandro Sedeno, somewhat modified by me, which reorganises the GSSAPI support so that it handles alternative implementations of the GSS-API. In particular, this means PuTTY can now talk to MIT Kerberos for Windows instead of being limited to SSPI. I don't know for sure whether further tweaking will be needed (to the UI, most likely, or to automatic selection of credentials), but testing reports suggest it's now at least worth committing to trunk to get it more widely tested. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 45a0efa12b4044c03ef1a234cdf456fa Text-delta-base-sha1: 863e99ac24d2abec1a0973eb3fc13bbcaacb5b23 Text-content-length: 261 Text-content-md5: 7c59babdb64f6d93892b56f09fff247e Text-content-sha1: db329ec81dc7695340c6e2e68eb72a5a13d25bac Content-length: 261 SVN��$/J�&� �,�f>�R$�t�.�z=�m7STATIC_GSSAPI # Causes PuTTY to try to link statically against the GSSAPI # library instead of the default of doing it at run tim + sshgssc pgssapi sshnogssnogs + nogss + nogss nogss Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04c4c4c9066c94ed34178283bb567193 Text-delta-base-sha1: 97084c2e44c98d23d3f4a19fa317ac0877dd95eb Text-content-length: 685 Text-content-md5: cfffdaefef8da61c614e9386bd170c20 Text-content-sha1: 07e3e641808ca5c7d97f0b9c96193c2ac029913f Content-length: 685 SVN��/U4k�V��o:�O��jn�o:�eX�@�iF#ifndef NO_GSSAPI static void gsslistif (event == EVENT_REFRESH) { int i; ngsslibs; i++) { int id = cfg->ssh_gsslist[i]; assert(id >= 0 && id < ngsslibs); dlg_listbox_addwithid(ctrl, dlg, gsslibnames[id], idngsslibs; i++) cfg->ssh_gsslist[i] = dlg_listbox_getid(ctrl, dlg, i); } } #endif static void kexlistNO_SHORTCUT #ifndef NO_GSSAPI /* * GSSAPI library selection. */ if (ngsslibs > 1) { c = ctrl_draglist(s, "Preference order for GSSAPI libraries:", NO_SHORTCUT, HELPCTX(no_help), gsslist_handler, P(NULL)); c->listbox.height = ngsslibs; } #endif Node-path: putty/mac/macstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 45f61a8a6156c38c119adf6f8751face Text-delta-base-sha1: 95579ca7b86c47cb6fe72e7e8973241cc36429d2 Text-content-length: 72 Text-content-md5: d79f994d159195ccd1bf7cd84d3136da Text-content-sha1: fddbcc0e5b9cfee0ca59c107904aa0f9a64c3b1c Content-length: 72 SVN��x- 3���^typedef UInt32 uint32; #define PUTTY_UINT32_DEFINED Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15994ac1e98571f9367727fc956a4620 Text-delta-base-sha1: b0e269136726ff68060c09d1f00a7ac4ea2367b4 Text-content-length: 249 Text-content-md5: c4b3dfa9201793c227691a9b010818bd Text-content-sha1: 362d9fbeef39ecd72504c51044c6b159db0f7e6f Content-length: 249 SVN��::'D�[� �vc�2Z�4�+�Gsifeq (,\$(findstring STATIC_GSSAPI,\$(COMPAT)))\n". "XLDFLAGS+= -ldl\n". "ULDFLAGS+= -ldl\n". "else\n". "CFLAGS+= -DNO_LIBDL+= \$(shell \$(KRB5CONFIG) --libs gssapi)\n". "endif Node-path: putty/nogss.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 297 Text-content-md5: e03c173e9862996a9dadc252d7f41dbd Text-content-sha1: 966c1a3771d5712104ff2b5676e3d12b8d979790 Content-length: 307 PROPS-END SVN���/* * Stub definitions of the GSSAPI library list, for Unix pterm and * any other application that needs the symbols defined but has no * use for them. */ const int ngsslibs = 0; const char *const gsslibnames[1] = { "dummy" }; const char *const gsslibkeywords[1] = { "dummy" }; Node-path: putty/pgssapi.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 4645 Text-content-md5: c478a2bf2caa4511b2b9c81fceff1771 Text-content-sha1: d51c8177f5e7c46bad265f7c19059936b4c7698e Content-length: 4655 PROPS-END SVN���/* This file actually defines the GSSAPI function pointers for * functions we plan to import from a GSSAPI library. */ #include "putty.h" #ifndef NO_GSSAPI #include "pgssapi.h" #ifndef NO_LIBDL /* Reserved static storage for GSS_oids. Comments are quotes from RFC 2744. */ static const gss_OID_desc oids[] = { /* The implementation must reserve static storage for a * gss_OID_desc object containing the value */ {10, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x01"}, /* corresponding to an object-identifier value of * {iso(1) member-body(2) United States(840) mit(113554) * infosys(1) gssapi(2) generic(1) user_name(1)}. The constant * GSS_C_NT_USER_NAME should be initialized to point * to that gss_OID_desc. * The implementation must reserve static storage for a * gss_OID_desc object containing the value */ {10, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x02"}, /* corresponding to an object-identifier value of * {iso(1) member-body(2) United States(840) mit(113554) * infosys(1) gssapi(2) generic(1) machine_uid_name(2)}. * The constant GSS_C_NT_MACHINE_UID_NAME should be * initialized to point to that gss_OID_desc. * The implementation must reserve static storage for a * gss_OID_desc object containing the value */ {10, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x03"}, /* corresponding to an object-identifier value of * {iso(1) member-body(2) United States(840) mit(113554) * infosys(1) gssapi(2) generic(1) string_uid_name(3)}. * The constant GSS_C_NT_STRING_UID_NAME should be * initialized to point to that gss_OID_desc. * * The implementation must reserve static storage for a * gss_OID_desc object containing the value */ {6, (void *)"\x2b\x06\x01\x05\x06\x02"}, /* corresponding to an object-identifier value of * {iso(1) org(3) dod(6) internet(1) security(5) * nametypes(6) gss-host-based-services(2)). The constant * GSS_C_NT_HOSTBASED_SERVICE_X should be initialized to point * to that gss_OID_desc. This is a deprecated OID value, and * implementations wishing to support hostbased-service names * should instead use the GSS_C_NT_HOSTBASED_SERVICE OID, * defined below, to identify such names; * GSS_C_NT_HOSTBASED_SERVICE_X should be accepted a synonym * for GSS_C_NT_HOSTBASED_SERVICE when presented as an input * parameter, but should not be emitted by GSS-API * implementations * * The implementation must reserve static storage for a * gss_OID_desc object containing the value */ {10, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x04"}, /* corresponding to an object-identifier value of {iso(1) * member-body(2) Unites States(840) mit(113554) infosys(1) * gssapi(2) generic(1) service_name(4)}. The constant * GSS_C_NT_HOSTBASED_SERVICE should be initialized * to point to that gss_OID_desc. * * The implementation must reserve static storage for a * gss_OID_desc object containing the value */ {6, (void *)"\x2b\x06\01\x05\x06\x03"}, /* corresponding to an object identifier value of * {1(iso), 3(org), 6(dod), 1(internet), 5(security), * 6(nametypes), 3(gss-anonymous-name)}. The constant * and GSS_C_NT_ANONYMOUS should be initialized to point * to that gss_OID_desc. * * The implementation must reserve static storage for a * gss_OID_desc object containing the value */ {6, (void *)"\x2b\x06\x01\x05\x06\x04"}, /* corresponding to an object-identifier value of * {1(iso), 3(org), 6(dod), 1(internet), 5(security), * 6(nametypes), 4(gss-api-exported-name)}. The constant * GSS_C_NT_EXPORT_NAME should be initialized to point * to that gss_OID_desc. */ }; /* Here are the constants which point to the static structure above. * * Constants of the form GSS_C_NT_* are specified by rfc 2744. */ const_gss_OID GSS_C_NT_USER_NAME = oids+0; const_gss_OID GSS_C_NT_MACHINE_UID_NAME = oids+1; const_gss_OID GSS_C_NT_STRING_UID_NAME = oids+2; const_gss_OID GSS_C_NT_HOSTBASED_SERVICE_X = oids+3; const_gss_OID GSS_C_NT_HOSTBASED_SERVICE = oids+4; const_gss_OID GSS_C_NT_ANONYMOUS = oids+5; const_gss_OID GSS_C_NT_EXPORT_NAME = oids+6; #endif /* NO_LIBDL */ static gss_OID_desc gss_mech_krb5_desc = { 9, (void *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x02" }; /* iso(1) member-body(2) United States(840) mit(113554) infosys(1) gssapi(2) krb5(2)*/ const gss_OID GSS_MECH_KRB5 = &gss_mech_krb5_desc; #endif /* NO_GSSAPI */ Node-path: putty/pgssapi.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 11754 Text-content-md5: b1dfcd76c98459ff0da7a18e2562e9c5 Text-content-sha1: 51ffaf4fe05563d6c2f365efcc07b2eaa536372e Content-length: 11764 PROPS-END SVN���\\\#ifndef PUTTY_PGSSAPI_H #define PUTTY_PGSSAPI_H #include "putty.h" #ifndef NO_GSSAPI /* * On Unix, if we're statically linking against GSSAPI, we leave the * declaration of all this lot to the official header. If we're * dynamically linking, we declare it ourselves, because that avoids * us needing the official header at compile time. * * However, we still need the function pointer types, because even * with statically linked GSSAPI we use the ssh_gss_library wrapper. */ #ifdef STATIC_GSSAPI #include <gssapi/gssapi.h> typedef gss_OID const_gss_OID; /* for our prototypes below */ #else /* STATIC_GSSAPI */ /******************************************************************************* * GSSAPI Definitions, taken from RFC 2744 ******************************************************************************/ /* GSSAPI Type Definitions */ typedef uint32 OM_uint32; typedef struct gss_OID_desc_struct { OM_uint32 length; void *elements; } gss_OID_desc; typedef const gss_OID_desc *const_gss_OID; typedef gss_OID_desc *gss_OID; typedef struct gss_OID_set_desc_struct { size_t count; gss_OID elements; } gss_OID_set_desc; typedef const gss_OID_set_desc *const_gss_OID_set; typedef gss_OID_set_desc *gss_OID_set; typedef struct gss_buffer_desc_struct { size_t length; void *value; } gss_buffer_desc, *gss_buffer_t; typedef struct gss_channel_bindings_struct { OM_uint32 initiator_addrtype; gss_buffer_desc initiator_address; OM_uint32 acceptor_addrtype; gss_buffer_desc acceptor_address; gss_buffer_desc application_data; } *gss_channel_bindings_t; typedef void * gss_ctx_id_t; typedef void * gss_name_t; typedef void * gss_cred_id_t; typedef OM_uint32 gss_qop_t; /* Flag bits for context-level services. */ #define GSS_C_DELEG_FLAG 1 #define GSS_C_MUTUAL_FLAG 2 #define GSS_C_REPLAY_FLAG 4 #define GSS_C_SEQUENCE_FLAG 8 #define GSS_C_CONF_FLAG 16 #define GSS_C_INTEG_FLAG 32 #define GSS_C_ANON_FLAG 64 #define GSS_C_PROT_READY_FLAG 128 #define GSS_C_TRANS_FLAG 256 /* Credential usage options */ #define GSS_C_BOTH 0 #define GSS_C_INITIATE 1 #define GSS_C_ACCEPT 2 /* Status code types for gss_display_status */ #define GSS_C_GSS_CODE 1 #define GSS_C_MECH_CODE 2 /* The constant definitions for channel-bindings address families */ #define GSS_C_AF_UNSPEC 0 #define GSS_C_AF_LOCAL 1 #define GSS_C_AF_INET 2 #define GSS_C_AF_IMPLINK 3 #define GSS_C_AF_PUP 4 #define GSS_C_AF_CHAOS 5 #define GSS_C_AF_NS 6 #define GSS_C_AF_NBS 7 #define GSS_C_AF_ECMA 8 #define GSS_C_AF_DATAKIT 9 #define GSS_C_AF_CCITT 10 #define GSS_C_AF_SNA 11 #define GSS_C_AF_DECnet 12 #define GSS_C_AF_DLI 13 #define GSS_C_AF_LAT 14 #define GSS_C_AF_HYLINK 15 #define GSS_C_AF_APPLETALK 16 #define GSS_C_AF_BSC 17 #define GSS_C_AF_DSS 18 #define GSS_C_AF_OSI 19 #define GSS_C_AF_X25 21 #define GSS_C_AF_NULLADDR 255 /* Various Null values */ #define GSS_C_NO_NAME ((gss_name_t) 0) #define GSS_C_NO_BUFFER ((gss_buffer_t) 0) #define GSS_C_NO_OID ((gss_OID) 0) #define GSS_C_NO_OID_SET ((gss_OID_set) 0) #define GSS_C_NO_CONTEXT ((gss_ctx_id_t) 0) #define GSS_C_NO_CREDENTIAL ((gss_cred_id_t) 0) #define GSS_C_NO_CHANNEL_BINDINGS ((gss_channel_bindings_t) 0) #define GSS_C_EMPTY_BUFFER {0, NULL} /* Major status codes */ #define GSS_S_COMPLETE 0 /* Some "helper" definitions to make the status code macros obvious. */ #define GSS_C_CALLING_ERROR_OFFSET 24 #define GSS_C_ROUTINE_ERROR_OFFSET 16 #define GSS_C_SUPPLEMENTARY_OFFSET 0 #define GSS_C_CALLING_ERROR_MASK 0377ul #define GSS_C_ROUTINE_ERROR_MASK 0377ul #define GSS_C_SUPPLEMENTARY_MASK 0177777ul /* * The macros that test status codes for error conditions. * Note that the GSS_ERROR() macro has changed slightly from * the V1 GSS-API so that it now evaluates its argument * only once. */ #define GSS_CALLING_ERROR(x) \ (x & (GSS_C_CALLING_ERROR_MASK << GSS_C_CALLING_ERROR_OFFSET)) #define GSS_ROUTINE_ERROR(x) \ (x & (GSS_C_ROUTINE_ERROR_MASK << GSS_C_ROUTINE_ERROR_OFFSET)) #define GSS_SUPPLEMENTARY_INFO(x) \ (x & (GSS_C_SUPPLEMENTARY_MASK << GSS_C_SUPPLEMENTARY_OFFSET)) #define GSS_ERROR(x) \ (x & ((GSS_C_CALLING_ERROR_MASK << GSS_C_CALLING_ERROR_OFFSET) | \ (GSS_C_ROUTINE_ERROR_MASK << GSS_C_ROUTINE_ERROR_OFFSET))) /* Now the actual status code definitions */ /* Calling errors: */ #define GSS_S_CALL_INACCESSIBLE_READ \ (1ul << GSS_C_CALLING_ERROR_OFFSET) #define GSS_S_CALL_INACCESSIBLE_WRITE \ (2ul << GSS_C_CALLING_ERROR_OFFSET) #define GSS_S_CALL_BAD_STRUCTURE \ (3ul << GSS_C_CALLING_ERROR_OFFSET) /* Routine errors: */ #define GSS_S_BAD_MECH (1ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_BAD_NAME (2ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_BAD_NAMETYPE (3ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_BAD_BINDINGS (4ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_BAD_STATUS (5ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_BAD_SIG (6ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_BAD_MIC GSS_S_BAD_SIG #define GSS_S_NO_CRED (7ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_NO_CONTEXT (8ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_DEFECTIVE_TOKEN (9ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_DEFECTIVE_CREDENTIAL (10ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_CREDENTIALS_EXPIRED (11ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_CONTEXT_EXPIRED (12ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_FAILURE (13ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_BAD_QOP (14ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_UNAUTHORIZED (15ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_UNAVAILABLE (16ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_DUPLICATE_ELEMENT (17ul << \ GSS_C_ROUTINE_ERROR_OFFSET) #define GSS_S_NAME_NOT_MN (18ul << \ GSS_C_ROUTINE_ERROR_OFFSET) /* Supplementary info bits: */ #define GSS_S_CONTINUE_NEEDED \ (1ul << (GSS_C_SUPPLEMENTARY_OFFSET + 0)) #define GSS_S_DUPLICATE_TOKEN \ (1ul << (GSS_C_SUPPLEMENTARY_OFFSET + 1)) #define GSS_S_OLD_TOKEN \ (1ul << (GSS_C_SUPPLEMENTARY_OFFSET + 2)) #define GSS_S_UNSEQ_TOKEN \ (1ul << (GSS_C_SUPPLEMENTARY_OFFSET + 3)) #define GSS_S_GAP_TOKEN \ (1ul << (GSS_C_SUPPLEMENTARY_OFFSET + 4)) extern const_gss_OID GSS_C_NT_USER_NAME; extern const_gss_OID GSS_C_NT_MACHINE_UID_NAME; extern const_gss_OID GSS_C_NT_STRING_UID_NAME; extern const_gss_OID GSS_C_NT_HOSTBASED_SERVICE_X; extern const_gss_OID GSS_C_NT_HOSTBASED_SERVICE; extern const_gss_OID GSS_C_NT_ANONYMOUS; extern const_gss_OID GSS_C_NT_EXPORT_NAME; #endif /* STATIC_GSSAPI */ extern const gss_OID GSS_MECH_KRB5; /* GSSAPI functions we use. * TODO: Replace with all GSSAPI functions from RFC? */ /* Calling convention, just in case we need one. */ #ifndef GSS_CC #define GSS_CC #endif /*GSS_CC*/ typedef OM_uint32 (GSS_CC *t_gss_release_cred) (OM_uint32 * /*minor_status*/, gss_cred_id_t * /*cred_handle*/); typedef OM_uint32 (GSS_CC *t_gss_init_sec_context) (OM_uint32 * /*minor_status*/, const gss_cred_id_t /*initiator_cred_handle*/, gss_ctx_id_t * /*context_handle*/, const gss_name_t /*target_name*/, const gss_OID /*mech_type*/, OM_uint32 /*req_flags*/, OM_uint32 /*time_req*/, const gss_channel_bindings_t /*input_chan_bindings*/, const gss_buffer_t /*input_token*/, gss_OID * /*actual_mech_type*/, gss_buffer_t /*output_token*/, OM_uint32 * /*ret_flags*/, OM_uint32 * /*time_rec*/); typedef OM_uint32 (GSS_CC *t_gss_delete_sec_context) (OM_uint32 * /*minor_status*/, gss_ctx_id_t * /*context_handle*/, gss_buffer_t /*output_token*/); typedef OM_uint32 (GSS_CC *t_gss_get_mic) (OM_uint32 * /*minor_status*/, const gss_ctx_id_t /*context_handle*/, gss_qop_t /*qop_req*/, const gss_buffer_t /*message_buffer*/, gss_buffer_t /*msg_token*/); typedef OM_uint32 (GSS_CC *t_gss_display_status) (OM_uint32 * /*minor_status*/, OM_uint32 /*status_value*/, int /*status_type*/, const gss_OID /*mech_type*/, OM_uint32 * /*message_context*/, gss_buffer_t /*status_string*/); typedef OM_uint32 (GSS_CC *t_gss_import_name) (OM_uint32 * /*minor_status*/, const gss_buffer_t /*input_name_buffer*/, const_gss_OID /*input_name_type*/, gss_name_t * /*output_name*/); typedef OM_uint32 (GSS_CC *t_gss_release_name) (OM_uint32 * /*minor_status*/, gss_name_t * /*name*/); typedef OM_uint32 (GSS_CC *t_gss_release_buffer) (OM_uint32 * /*minor_status*/, gss_buffer_t /*buffer*/); struct gssapi_functions { t_gss_delete_sec_context delete_sec_context; t_gss_display_status display_status; t_gss_get_mic get_mic; t_gss_import_name import_name; t_gss_init_sec_context init_sec_context; t_gss_release_buffer release_buffer; t_gss_release_cred release_cred; t_gss_release_name release_name; }; #endif /* NO_GSSAPI */ #endif /* PUTTY_PGSSAPI_H */ Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b88a7a24aee3b4df40a50b792939a82 Text-delta-base-sha1: dd960e94764e0e20a43fdcf3b8808fbe55eee05a Text-content-length: 513 Text-content-md5: ee1aa300ab5347201857fa35ddbf5b8a Text-content-sha1: 53083302fd948fbb6f92ea2eefd039b6ea924b13 Content-length: 513 SVN��,`�2�'�0�o=/* * Tables of string <-> enum value mappings used in settings.c. * Defined here so that backends can export their GSS library tables * to the cross-platform settings code. */ struct keyval { char *s; int v; }; #ifndef NO_GSSAPI extern const int ngsslibs; extern const char *const gsslibnames[];/* for displaying in configuration */ extern const struct keyval gsslibkeywords[]; /* for storing by settings.c */ #endifgsslist[4]; /* preference order for local GSS lib Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a7651467da23903566f5bf3e0866f66c Text-delta-base-sha1: 11852be206f1fe2ec03165e945ef355c5091eaaf Text-content-length: 187 Text-content-md5: d98e670bd7c347f77e3e7cda6905b25b Text-content-sha1: 7cfa7ba373d683a9a7edba9609f0e8856a84a7d0 Content-length: 187 SVN��T�3��= H�>?M�tprefs(sesskey, "GSSLibs", gsslibkeywords, ngsslibs, cfg->ssh_gsslistrefs(sesskey, "GSSList", "\0", gsslibkeywords, ngsslibs, cfg->ssh_gsslist Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 095c96ab5704e2f0ff807c0af7aa13b9 Text-delta-base-sha1: cf908f15330c6b0e6e5690c417ba95b3b27786f4 Text-content-length: 1827 Text-content-md5: d97cb79840c5deae2109db166b5f5c77 Text-content-sha1: 1933e69ffb98187848148b6545ee02aceea495de Content-length: 1827 SVN���� �k��Zc.h"����k�her = (s->cipher_type�[{hm�N��7L�>�.6�YyH�"~�|4�KD�2�c�k ^�r8�a9�Sglen = 0, core = FALSstruct ssh_gss_library *gsslib;sh_gss_init(); s->can_gssapi = ssh->cfg.try_gssapi_auth && in_commasep_string("gssapi-with-mic", methods, methlen) && n_ssh_gss_libraries > 0 * Pick the highest GSS library on the preference * list. */ { int i, j; s->gsslib = NULL; for (i = 0; i < ngsslibs; i++) { int want_id = ssh->cfg.ssh_gsslist[i]; for (j = 0; j < n_ssh_gss_libraries; j++) if (ssh_gss_libraries[j].id == want_id) { s->gsslib = &ssh_gss_libraries[j]; goto got_gsslib; /* double break */ } } got_gsslib: /* * We always expect to have found something in * the above loop: we only came here if there * was at least one viable GSS library, and the * preference list should always mention * everything and only change the order. */ assert(s->gsslib); } if (s->gsslib->gsslogmsg) logevent(s->gsslib->gsslogmsg)->gsslib->indicate_mech(s->gsslib, ->gsslib->import_name(s->gsslib, ssh->fullhostname, ->gsslib->acquire_cred(s->gsslib, ->gsslib->release_name(s->gsslib, ->gsslib->init_sec_context (s->gsslib, &s->gss_ctx, s->gss_srv_name, ssh->cfg.gssapifwd, &s->gss_rcvtok, ->gsslib->display_status(s->gsslib, s->gss_ctx, ->gsslib->free_tok(s->gsslib, ->gsslib->release_name(s->gsslib, &s->gss_srv_name); s->gsslib->release_cred(s->gsslib, ->gsslib->get_mic(s->gsslib, ->gsslib->free_mic(s->gsslib, &mic); s->gotit = FALSE; s->gsslib->release_name(s->gsslib, &s->gss_srv_name); s->gsslib->release_cred(s->gsslib, Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 020ea72dd5d815950dc7740ad785e5ac Text-delta-base-sha1: 501298df1c554d340bdd1237fb4d985d54eff4c7 Text-content-length: 189 Text-content-md5: e8059550478d3b059cd27c1d5232c95a Text-content-sha1: 0032e67161f89b37eba5ee560fa645883702a2e7 Content-length: 189 SVN�� "�>�"�#t#ifndef PUTTY_UINT32_DEFINED /* This makes assumptions about the int type. */ typedef unsigned int uint32; #define PUTTY_UINT32_DEFINED #endif typedef uint32 word Node-path: putty/sshgss.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: adb1efe78338e98f436ddd75e583df14 Text-delta-base-sha1: a0489d9665e8a4c6473366261dcff1eb0484fc5f Text-content-length: 3134 Text-content-md5: 16a3b37904946cfc3ee3e0ecca2cef53 Text-content-sha1: 15af2d604919decd33f5e051189418cda4358832 Content-length: 3134 SVN��sPbh�tC�d<D�aS�4V��gX� �,zP�DX�hxA�1P�Ej,#ifndef PUTTY_SSHGSS_H #define PUTTY_SSHGSS_H #include "putty.h" #include "pgssapi.h" #ifndef NO_GSSAPItypedef gss_buffer_desc Ssh_gss_buf; typedef gss_name_t Ssh_gss_name; /* Functions, provided by either wingss.c or sshgssc.c */ struct ssh_gss_library; /* * Do startup-time initialisation for using GSSAPI. This should * correctly initialise the array of struct ssh_gss_library declared * below. * * Must be callableshould harmlessly * return success if already initialised. */ voidtypedef Ssh_gss_stat (*t_ssh_gss_indicate_mech)(struct ssh_gss_library *lib, typedef Ssh_gss_stat (*t_ssh_gss_import_name)(struct ssh_gss_library *lib, typedef Ssh_gss_stat (*t_ssh_gss_release_name)(struct ssh_gss_library *lib, typedef Ssh_gss_stat (*t_ssh_gss_init_sec_context) (struct ssh_gss_library *lib, Ssh_gss_ctx *ctx, Ssh_gss_name name, int delegate, typedef Ssh_gss_stat (*t_ssh_gss_free_tok)(struct ssh_gss_library *lib, typedef Ssh_gss_stat (*t_ssh_gss_acquire_cred)(struct ssh_gss_library *lib, typedef Ssh_gss_stat (*t_ssh_gss_release_cred)(struct ssh_gss_library *lib, Ssh_gss_ctx *); /* * Gets a MIC for some input data. "out" needs to be freed by * ssh_gss_free_mic(). */ typedef Ssh_gss_stat (*t_ssh_gss_get_mic)(struct ssh_gss_library *lib, Ssh_gss_ctx ctx, Ssh_gss_buf *in, typedef Ssh_gss_stat (*t_ssh_gss_free_mic)(struct ssh_gss_library *lib, typedef Ssh_gss_stat (*t_ssh_gss_display_status)(struct ssh_gss_library *lib, Ssh_gss_ctx, Ssh_gss_buf *buf); struct ssh_gss_library { /* * Identifying number in the enumeration used by the * configuration code to specify a preference order. */ int id; /* * Filled in at initialisation time, if there's anything * interesting to say about how GSSAPI was initialised (e.g. * which of a number of alternative libraries was used). */ const char *gsslogmsg; /* * Function pointers implementing the SSH wrapper layer on top * of GSSAPI. (Defined in sshgssc, typically, though Windows * provides an alternative layer to sit on top of the annoyingly * different SSPI.) */ t_ssh_gss_indicate_mech indicate_mech; t_ssh_gss_import_name import_name; t_ssh_gss_release_name release_name; t_ssh_gss_init_sec_context init_sec_context; t_ssh_gss_free_tok free_tok; t_ssh_gss_acquire_cred acquire_cred; t_ssh_gss_release_cred release_cred; t_ssh_gss_get_mic get_mic; t_ssh_gss_free_mic free_mic; t_ssh_gss_display_status display_status; /* * Additional data for the wrapper layers. */ union { struct gssapi_functions gssapi; /* * The SSPI wrappers don't need to store their Windows API * function pointers in this structure, because there can't * be more than one set of them available. */ } u; }; extern struct ssh_gss_library ssh_gss_libraries[]; extern int n_ssh_gss_libraries; #endif /* NO_GSSAPI */ #endif /*PUTTY_SSHGSS_H*/ Node-path: putty/sshgssc.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 6268 Text-content-md5: 842d4fbfd9a10bb8140b21c572316ab5 Text-content-sha1: eb7551594383144bbd5387f284186dd865129461 Content-length: 6278 PROPS-END SVN���nnn#include "putty.h" #include <string.h> #include "sshgssc.h" #include "misc.h" #ifndef NO_GSSAPI static Ssh_gss_stat ssh_gssapi_indicate_mech(struct ssh_gss_library *lib, Ssh_gss_buf *mech) { /* Copy constant into mech */ mech->length = GSS_MECH_KRB5->length; mech->value = GSS_MECH_KRB5->elements; return SSH_GSS_OK; } static Ssh_gss_stat ssh_gssapi_import_name(struct ssh_gss_library *lib, char *host, Ssh_gss_name *srv_name) { struct gssapi_functions *gss = &lib->u.gssapi; OM_uint32 min_stat,maj_stat; gss_buffer_desc host_buf; char *pStr; pStr = dupcat("host@", host, NULL); host_buf.value = pStr; host_buf.length = strlen(pStr); maj_stat = gss->import_name(&min_stat, &host_buf, GSS_C_NT_HOSTBASED_SERVICE, srv_name); /* Release buffer */ sfree(pStr); if (maj_stat == GSS_S_COMPLETE) return SSH_GSS_OK; return SSH_GSS_FAILURE; } static Ssh_gss_stat ssh_gssapi_acquire_cred(struct ssh_gss_library *lib, Ssh_gss_ctx *ctx) { gssapi_ssh_gss_ctx *gssctx = snew(gssapi_ssh_gss_ctx); gssctx->maj_stat = gssctx->min_stat = GSS_S_COMPLETE; gssctx->ctx = GSS_C_NO_CONTEXT; *ctx = (Ssh_gss_ctx) gssctx; return SSH_GSS_OK; } static Ssh_gss_stat ssh_gssapi_init_sec_context(struct ssh_gss_library *lib, Ssh_gss_ctx *ctx, Ssh_gss_name srv_name, int to_deleg, Ssh_gss_buf *recv_tok, Ssh_gss_buf *send_tok) { struct gssapi_functions *gss = &lib->u.gssapi; gssapi_ssh_gss_ctx *gssctx = (gssapi_ssh_gss_ctx*) *ctx; OM_uint32 ret_flags; if (to_deleg) to_deleg = GSS_C_DELEG_FLAG; gssctx->maj_stat = gss->init_sec_context(&gssctx->min_stat, GSS_C_NO_CREDENTIAL, &gssctx->ctx, srv_name, (gss_OID) GSS_MECH_KRB5, GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG | to_deleg, 0, GSS_C_NO_CHANNEL_BINDINGS, recv_tok, NULL, /* ignore mech type */ send_tok, &ret_flags, NULL); /* ignore time_rec */ if (gssctx->maj_stat == GSS_S_COMPLETE) return SSH_GSS_S_COMPLETE; if (gssctx->maj_stat == GSS_S_CONTINUE_NEEDED) return SSH_GSS_S_CONTINUE_NEEDED; return SSH_GSS_FAILURE; } static Ssh_gss_stat ssh_gssapi_display_status(struct ssh_gss_library *lib, Ssh_gss_ctx ctx, Ssh_gss_buf *buf) { struct gssapi_functions *gss = &lib->u.gssapi; gssapi_ssh_gss_ctx *gssctx = (gssapi_ssh_gss_ctx *) ctx; OM_uint32 lmin,lmax; OM_uint32 ccc; gss_buffer_desc msg_maj=GSS_C_EMPTY_BUFFER; gss_buffer_desc msg_min=GSS_C_EMPTY_BUFFER; /* Return empty buffer in case of failure */ SSH_GSS_CLEAR_BUF(buf); /* get first mesg from GSS */ ccc=0; lmax=gss->display_status(&lmin,gssctx->maj_stat,GSS_C_GSS_CODE,(gss_OID) GSS_MECH_KRB5,&ccc,&msg_maj); if (lmax != GSS_S_COMPLETE) return SSH_GSS_FAILURE; /* get first mesg from Kerberos */ ccc=0; lmax=gss->display_status(&lmin,gssctx->min_stat,GSS_C_MECH_CODE,(gss_OID) GSS_MECH_KRB5,&ccc,&msg_min); if (lmax != GSS_S_COMPLETE) { gss->release_buffer(&lmin, &msg_maj); return SSH_GSS_FAILURE; } /* copy data into buffer */ buf->length = msg_maj.length + msg_min.length + 1; buf->value = snewn(buf->length + 1, char); /* copy mem */ memcpy((char *)buf->value, msg_maj.value, msg_maj.length); ((char *)buf->value)[msg_maj.length] = ' '; memcpy((char *)buf->value + msg_maj.length + 1, msg_min.value, msg_min.length); ((char *)buf->value)[buf->length] = 0; /* free mem & exit */ gss->release_buffer(&lmin, &msg_maj); gss->release_buffer(&lmin, &msg_min); return SSH_GSS_OK; } static Ssh_gss_stat ssh_gssapi_free_tok(struct ssh_gss_library *lib, Ssh_gss_buf *send_tok) { struct gssapi_functions *gss = &lib->u.gssapi; OM_uint32 min_stat,maj_stat; maj_stat = gss->release_buffer(&min_stat, send_tok); if (maj_stat == GSS_S_COMPLETE) return SSH_GSS_OK; return SSH_GSS_FAILURE; } static Ssh_gss_stat ssh_gssapi_release_cred(struct ssh_gss_library *lib, Ssh_gss_ctx *ctx) { struct gssapi_functions *gss = &lib->u.gssapi; gssapi_ssh_gss_ctx *gssctx = (gssapi_ssh_gss_ctx *) *ctx; OM_uint32 min_stat; OM_uint32 maj_stat=GSS_S_COMPLETE; if (gssctx == NULL) return SSH_GSS_FAILURE; if (gssctx->ctx != GSS_C_NO_CONTEXT) maj_stat = gss->delete_sec_context(&min_stat,&gssctx->ctx,GSS_C_NO_BUFFER); sfree(gssctx); if (maj_stat == GSS_S_COMPLETE) return SSH_GSS_OK; return SSH_GSS_FAILURE; } static Ssh_gss_stat ssh_gssapi_release_name(struct ssh_gss_library *lib, Ssh_gss_name *srv_name) { struct gssapi_functions *gss = &lib->u.gssapi; OM_uint32 min_stat,maj_stat; maj_stat = gss->release_name(&min_stat, srv_name); if (maj_stat == GSS_S_COMPLETE) return SSH_GSS_OK; return SSH_GSS_FAILURE; } static Ssh_gss_stat ssh_gssapi_get_mic(struct ssh_gss_library *lib, Ssh_gss_ctx ctx, Ssh_gss_buf *buf, Ssh_gss_buf *hash) { struct gssapi_functions *gss = &lib->u.gssapi; gssapi_ssh_gss_ctx *gssctx = (gssapi_ssh_gss_ctx *) ctx; if (gssctx == NULL) return SSH_GSS_FAILURE; return gss->get_mic(&(gssctx->min_stat), gssctx->ctx, 0, buf, hash); } static Ssh_gss_stat ssh_gssapi_free_mic(struct ssh_gss_library *lib, Ssh_gss_buf *hash) { /* On Unix this is the same freeing process as ssh_gssapi_free_tok. */ return ssh_gssapi_free_tok(lib, hash); } void ssh_gssapi_bind_fns(struct ssh_gss_library *lib) { lib->indicate_mech = ssh_gssapi_indicate_mech; lib->import_name = ssh_gssapi_import_name; lib->release_name = ssh_gssapi_release_name; lib->init_sec_context = ssh_gssapi_init_sec_context; lib->free_tok = ssh_gssapi_free_tok; lib->acquire_cred = ssh_gssapi_acquire_cred; lib->release_cred = ssh_gssapi_release_cred; lib->get_mic = ssh_gssapi_get_mic; lib->free_mic = ssh_gssapi_free_mic; lib->display_status = ssh_gssapi_display_status; } #else /* Dummy function so this source file defines something if NO_GSSAPI is defined. */ int ssh_gssapi_init(void) { return 0; } #endif Node-path: putty/sshgssc.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 411 Text-content-md5: 04d2b1343196ff72fc4f4706eb22fe85 Text-content-sha1: 5344240e6bbe17b1e15cefda4d8feba3ccd0717e Content-length: 421 PROPS-END SVN���  #ifndef PUTTY_SSHGSSC_H #define PUTTY_SSHGSSC_H #include "putty.h" #ifndef NO_GSSAPI #include "pgssapi.h" #include "sshgss.h" typedef struct gssapi_ssh_gss_ctx { OM_uint32 maj_stat; OM_uint32 min_stat; gss_ctx_id_t ctx; } gssapi_ssh_gss_ctx; void ssh_gssapi_bind_fns(struct ssh_gss_library *lib); #else int ssh_gssapi_init(void); #endif /*NO_GSSAPI*/ #endif /*PUTTY_SSHGSSC_H*/ Node-path: putty/sshnogss.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 147 Text-content-md5: c5840d4629c92e0502132f27b43dc872 Text-content-sha1: 9c263caa3c640c02b9e519b7ed7b935f675f1cc2 Content-length: 157 PROPS-END SVN���#include "putty.h" #ifndef NO_GSSAPI /* For platforms not supporting GSSAPI */ void ssh_gss_init(void) { } #endif /* NO_GSSAPI */ Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cddc3df35ee11a7f82b3d0df2cb38fd1 Text-delta-base-sha1: 9b01a3f3b8ed4f24dfe4076988db56481a82ef63 Text-content-length: 885 Text-content-md5: 87bd34cce4860df996b12c1ae03be80a Text-content-sha1: c8eb75423069a96cf63ae4a2fc44c32d80823208 Content-length: 885 SVN��J�6�w�[p�r;x�97 |[gssapi], [AS_HELP_STRING([--without-gssapi], [disable GSSAPI support])], [], [with_gssapi=yes]) WITH_GSSAPI= AS_IF([test "x$with_gssapi" != xno], [AC_DEFINE([WITH_GSSAPI], [1], [Define if building with GSSAPI support.]) # Look for both GTK 1 and GTK 2. # AS_IF([test "x$with_gssapi" != xno], [AC_SEARCH_LIBS( [dlopen],[dl], [], [AC_DEFINE([NO_LIBDL], [1], [Define if we could not find libdl.]) AC_CHECK_HEADERS([gssapi/gssapi.h]) AC_SEARCH_LIBS( [gss_init_sec_context],[gssapi gssapi_krb5 gss], [], [AC_DEFINE([NO_GSSAPI_LIB], [1], [Define if we could not find a gssapi library])])])]) !defined(WITH_GSSAPI) # define NO_GSSAPI #endif #if !defined(NO_GSSAPI) && defined(NO_LIBDL) # if !defined(HAVE_GSSAPI_GSSAPI_H) || defined(NO_GSSAPI_LIB) # define NO_GSSAPI # endif Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c757ec92c69bd69e0fabd36c7dfccd21 Text-delta-base-sha1: ab600b0c492e5d90bc7b21e4de88e01f13f2037a Text-content-length: 261 Text-content-md5: 9968021500e2fad7c74ee70a66d69976 Text-content-sha1: d13871a08bfd856c123b53c41af2652759dac70e Content-length: 261 SVN��4da�A��q4]�&#�+ <stdint.h> /* C99 int types */ #ifndef NO_LIBDL #include <dlfcn.h> /* Dynamic library loading */ #endif /* NO_LIBDLtypedef uint32_t uint32; /* C99: uint32_t defined in stdint.h */ #define PUTTY_UINT32_DEFINED Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5477a3198e82f9611f9abac16a27a7aa Text-delta-base-sha1: 0e691ec621553180c2be46c06bbd767927631978 Text-content-length: 2931 Text-content-md5: cce7cc1b3503aef9d00aa7baf25f1b87 Text-content-sha1: 2ddd441d32d5db16d7a7298657c974af6f21e228 Content-length: 2931 SVN��"ddd#include "putty.h" #ifndef NO_GSSAPI #include "pgssapi.h" #include "sshgss.h" #include "sshgssc.h" /* Unix code to set up the GSSAPI library list. */ struct ssh_gss_library ssh_gss_libraries[3]; int n_ssh_gss_libraries = 0; static int initialised = FALSE; const int ngsslibs = 3; const char *const gsslibnames[3] = { "libgssapi (Heimdal)", "libgssapi_krb5 (MIT Kerberos)", "libgss (Sun)", }; const struct keyval gsslibkeywords[] = { { "libgssapi", 0 }, { "libgssapi_krb5", 1 }, { "libgss", 2 }, }; #ifndef NO_LIBDL /* * Run-time binding against a choice of GSSAPI implementations. We * try loading several libraries, and produce an entry in * ssh_gss_libraries[] for each one. */ static void gss_init(struct ssh_gss_library *lib, void *dlhandle, int id, const char *msg) { lib->id = id; lib->gsslogmsg = msg; #define BIND_GSS_FN(name) \ lib->u.gssapi.name = (t_gss_##name) dlsym(dlhandle, "gss_" #name) BIND_GSS_FN(delete_sec_context); BIND_GSS_FN(display_status); BIND_GSS_FN(get_mic); BIND_GSS_FN(import_name); BIND_GSS_FN(init_sec_context); BIND_GSS_FN(release_buffer); BIND_GSS_FN(release_cred); BIND_GSS_FN(release_name); #undef BIND_GSS_FN ssh_gssapi_bind_fns(lib); } /* Dynamically load gssapi libs. */ void ssh_gss_init(void) { void *gsslib; if (initialised) return; initialised = TRUE; /* Heimdal's GSSAPI Library */ if ((gsslib = dlopen("libgssapi.so.2", RTLD_LAZY)) != NULL) gss_init(&ssh_gss_libraries[n_ssh_gss_libraries++], gsslib, 0, "Using GSSAPI from libgssapi.so.2"); /* MIT Kerberos's GSSAPI Library */ if ((gsslib = dlopen("libgssapi_krb5.so.2", RTLD_LAZY)) != NULL) gss_init(&ssh_gss_libraries[n_ssh_gss_libraries++], gsslib, 1, "Using GSSAPI from libgssapi_krb5.so.2"); /* Sun's GSSAPI Library */ if ((gsslib = dlopen("libgss.so.1", RTLD_LAZY)) != NULL) gss_init(&ssh_gss_libraries[n_ssh_gss_libraries++], gsslib, 2, "Using GSSAPI from libgss.so.1"); } #else /* NO_LIBDL */ /* * Link-time binding against GSSAPI. Here we just construct a single * library structure containing pointers to the functions we linked * against. */ #include <gssapi/gssapi.h> /* Dynamically load gssapi libs. */ void ssh_gss_init(void) { if (initialised) return; initialised = TRUE; n_ssh_gss_libraries = 1; ssh_gss_libraries[0].gsslogmsg = "Using statically linked GSSAPI"; #define BIND_GSS_FN(name) \ ssh_gss_libraries[0].u.gssapi.name = (t_gss_##name) gss_##name BIND_GSS_FN(delete_sec_context); BIND_GSS_FN(display_status); BIND_GSS_FN(get_mic); BIND_GSS_FN(import_name); BIND_GSS_FN(init_sec_context); BIND_GSS_FN(release_buffer); BIND_GSS_FN(release_cred); BIND_GSS_FN(release_name); #undef BIND_GSS_FN ssh_gssapi_bind_fns(&ssh_gss_libraries[0]); } #endif /* NO_LIBDL */ #endif /* NO_GSSAPI */ Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3e13e36058a646b755015b2b4bbdd653 Text-delta-base-sha1: b59be63058d7d3fe20ac62181a341fa708c1e572 Text-content-length: 157 Text-content-md5: ada20c105e11c12421757b7c63ebcfdb Text-content-sha1: 1d7127faf030df91b125a5946ee585abc3f2c868 Content-length: 157 SVN��ANEM���D�}]�Z�/`�=�1L�=}�U:�i:�Px�yHsskeyval *a = (struct skeyval *)av; struct skeyval *b = (struct sssssssss Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e721ac459e50cdf60997d2ac0452b86 Text-delta-base-sha1: fd0a177cd2686de314252f85aea13bbd3a88113d Text-content-length: 3790 Text-content-md5: 8f82423907cff1e7d38ae463b318937c Text-content-sha1: b3c84716c17d8ee652ed9f2dd55e3fbb2e799865 Content-length: 3790 SVN��s�Qq�H�C�Sc�#^5�N�IKF�o&M�j3N�?N�>hR�&Jo�N0�d^pgssapi.h" #include "sshgss.h" #include "sshgssc.h" #include "misc.h" /* Windows code to set up the GSSAPI library list. */ struct ssh_gss_library ssh_gss_libraries[2]; int n_ssh_gss_libraries = 0; static int initialised = FALSE; const int ngsslibs = 2; const char *const gsslibnames[2] = { "GSSAPI32.DLL (MIT Kerberos)", "SSPI.DLL (Microsoft SSPI)", }; const struct keyval gsslibkeywords[] = { { "gssapi32", 0 }, { "sspi", 1 }, };const char *gsslogmsg = NULL; static void ssh_sspi_bind_fns(struct ssh_gss_library *lib); void ssh_gss_init(void) { HMODULE module; if (initialised) return; initialised = TRUE; /* MIT Kerberos GSSAPI implementation */ /* TODO: For 64-bit builds, check for gssapi64.dll */ module = LoadLibrary("gssapi32.dll"); if (module) { struct ssh_gss_library *lib = &ssh_gss_libraries[n_ssh_gss_libraries++]; lib->id = 0; lib->gsslogmsg = "Using GSSAPI from GSSAPI32.DLL"; #define BIND_GSS_FN(name) \ lib->u.gssapi.name = (t_gss_##name) GetProcAddress(module, "gss_" #name) BIND_GSS_FN(delete_sec_context); BIND_GSS_FN(display_status); BIND_GSS_FN(get_mic); BIND_GSS_FN(import_name); BIND_GSS_FN(init_sec_context); BIND_GSS_FN(release_buffer); BIND_GSS_FN(release_cred); BIND_GSS_FN(release_name); #undef BIND_GSS_FN ssh_gssapi_bind_fns(lib); } /* Microsoft SSPI Implementation */ module = LoadLibrary("secur32.dll"); if (module) { struct ssh_gss_library *lib = &ssh_gss_libraries[n_ssh_gss_libraries++]; lib->id = 1; lib->gsslogmsg = "Using SSPI from SECUR32.DLL"; GET_WINDOWS_FUNCTION(module, AcquireCredentialsHandleA); GET_WINDOWS_FUNCTION(module, InitializeSecurityContextA); GET_WINDOWS_FUNCTION(module, FreeContextBuffer); GET_WINDOWS_FUNCTION(module, FreeCredentialsHandle); GET_WINDOWS_FUNCTION(module, DeleteSecurityContext); GET_WINDOWS_FUNCTION(module, QueryContextAttributesA); GET_WINDOWS_FUNCTION(module, MakeSignature); ssh_sspi_bind_fns(lib); } } static Ssh_gss_stat ssh_sspi_indicate_mech(struct ssh_gss_library *lib, Ssh_gss_buf *mech) { *mech = gss_mech_krb5; return SSH_GSS_OK; } static Ssh_gss_stat ssh_sspi_import_name(struct ssh_gss_library *lib, static Ssh_gss_stat ssh_sspi_acquire_cred(struct ssh_gss_library *lib, static Ssh_gss_stat ssh_sspi_init_sec_context(struct ssh_gss_library *lib, Ssh_gss_ctx *ctx, Ssh_gss_name srv_name, int to_deleg, Ssh_gss_buf *recv_tok, static Ssh_gss_stat ssh_sspi_free_tok(struct ssh_gss_library *lib, static Ssh_gss_stat ssh_sspi_release_cred(struct ssh_gss_library *lib, static Ssh_gss_stat ssh_sspi_release_name(struct ssh_gss_library *lib, static Ssh_gss_stat ssh_sspi_display_status(struct ssh_gss_library *lib, static Ssh_gss_stat ssh_sspi_get_mic(struct ssh_gss_library *lib, Ssh_gss_ctx ctx, Ssh_gss_buf *buf, static Ssh_gss_stat ssh_sspi_free_mic(struct ssh_gss_library *lib, Ssh_gss_buf *hash) { sfree(hash->value); return SSH_GSS_OK; } static void ssh_sspi_bind_fns(struct ssh_gss_library *lib) { lib->indicate_mech = ssh_sspi_indicate_mech; lib->import_name = ssh_sspi_import_name; lib->release_name = ssh_sspi_release_name; lib->init_sec_context = ssh_sspi_init_sec_context; lib->free_tok = ssh_sspi_free_tok; lib->acquire_cred = ssh_sspi_acquire_cred; lib->release_cred = ssh_sspi_release_cred; lib->get_mic = ssh_sspi_get_mic; lib->free_mic = ssh_sspi_free_mic; lib->display_status = ssh_sspi_display_statusvoid ssh_gss_init(void) { } #endif Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bed60f3facd581611ad9d0f14ba05e24 Text-delta-base-sha1: a574cdee161501027b8e3806ce5935edf6279f73 Text-content-length: 238 Text-content-md5: c0977b45bb47d1e86e8885f5bd6e8027 Text-content-sha1: bde1614af4203f049d533203317b9cfa9a933052 Content-length: 238 SVN��nsQ�B�O�x�htypedef unsigned int uint32; /* int is 32-bits on Win32 and Win64. */ #define PUTTY_UINT32_DEFINED #ifndef NO_GSSAPI /* * GSS-API stuff */ #define GSS_CC CALLBACK /* typedef struct Ssh_gss_buf { size_*/ Revision-number: 8953 Prop-content-length: 192 Content-length: 192 K 7 svn:log V 92 Brief summary of what is and isn't supported in the snapshots. (This item needs a cleanup.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-05-19T23:22:24.307380Z PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 058410770b808b5b1c3f8e1710d6376b Text-delta-base-sha1: 47bf3e9faea55bdc0cd18138cc1ad46b9fbdf6b4 Text-content-length: 687 Text-content-md5: fcaddf01df676095b39b17bf016923df Text-content-sha1: 8e646ae4572b1c73cf5273c2e2a13b08319feda2 Content-length: 687 SVN��6 �n�� {�WU�W,o952, 2010-05-2overview.html <hr> <em>Update:</em> some forms of Kerberos support are now implemented: <ul> <li>As of 2008-08-10, r8138: support for Kerberos user authentication in SSH-2 using a single library (SSPI in Windows, build-time choice on Unix); <li>As of 2010-05-20, r8952: support for multiple libraries with choice at run time; Windows builds now support <a href="http://web.mit.edu/Kerberos/">MIT Kerberos</a> in addition to SSPI. </ul> Things not done: <ul> <li>GSSAPI key exchange; <li>Any authentication protocol other than Kerberos; <li>SSH-1 support (we are very unlikely to do anything about this; SSH-1 is obsolete). < Revision-number: 8954 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2010-05-22T12:11:35.351006Z K 7 svn:log V 14 Syntax fixes. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/kerberos-gssapi Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fcaddf01df676095b39b17bf016923df Text-delta-base-sha1: 8e646ae4572b1c73cf5273c2e2a13b08319feda2 Text-content-length: 24 Text-content-md5: 68fb7905743e953a6ed32438861073bb Text-content-sha1: 67b680e101a484080fe8c18902f5d9fb0d7c0dd8 Content-length: 24 SVN��66�q��@r/ul> Revision-number: 8955 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8956 Prop-content-length: 283 Content-length: 283 K 7 svn:log V 182 Restore the configure check for GTK 1, which I accidentally removed as part of r8952 (the patch submitter had done it as a temporary measure and I forgot to undo it before checkin). K 10 svn:author V 5 simon K 8 svn:date V 27 2010-05-22T14:07:25.046669Z PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 87bd34cce4860df996b12c1ae03be80a Text-delta-base-sha1: c8eb75423069a96cf63ae4a2fc44c32d80823208 Text-content-length: 20 Text-content-md5: bc6fbf37637231f412015cad010e388a Text-content-sha1: c0a88428828a77bac095f3bdeb65057550d839d9 Content-length: 20 SVN�� ��*��e, Revision-number: 8957 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8958 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2010-05-29T14:04:09.088685Z K 7 svn:log V 32 'perl -w' safety in mkfiles.pl. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c4b3dfa9201793c227691a9b010818bd Text-delta-base-sha1: 362d9fbeef39ecd72504c51044c6b159db0f7e6f Text-content-length: 1241 Text-content-md5: 3134e3fa3b91dcca846ce0ff9f3642f8 Text-content-sha1: 84da7b3bde750589e0e4e403dcaa21b9f269ce17 Content-length: 1241 SVN��:@4�O,�y�er�<\�B�TjA�T7�> �|Ja�!O�2#O�P�Bf�)�@�\4�Z��k�Fy�v@�z�!P�>�jY�>�w� �9@�b �Q*��v>�lT�A�`�>�jY�>�vw�n�O��ST�`(�^� |�8�[<�~6�5#!/usr/bin/env perl -wchomp; @_ = split; # If we're gathering help text, keep doing so. if (defined $divert) { if ((defined $_[0]) && $_[0] eq "!end") { $divert = undef; } else { ${$divert} .= "$_\n"; } next; } # Skip comments and blank lines. next if /^\s*#/ or scalar @_ == 0; ummy = '';''!$dep{$j}ef { my ($x) = shift @_; return (defined $x) ? $x : ""; }; my = ''if (-f "$dir$name") { $outdir = $dir; $i++; $outdir =~ s/^\.\///; }($otmpl, $rtmpl, $ltmpl) = map { defined $_ ? $_ : "" } ($otmpl, $rtmpl, $ltmpl($otmpl, $rtmpl, $ltmpl) = map { defined $_ ? $_ : "" } ($otmpl, $rtmpl, $ltmpl$result = ""; my $len; my$$$&def($makefile_extra{'gtk'}->{'vars'})gtk$&def($makefile_extra{'unix'}->{'vars'})&def($makefile_extra{'unix'}->{'end'})$&def($makefile_extra{'gtk'}->{'vars'})gtk$$''$, "osx&def($makefile_extra{'osx'}->{'end'}). Revision-number: 8959 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8960 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8961 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8962 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8963 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8964 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8965 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8966 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8967 Prop-content-length: 189 Content-length: 189 K 8 svn:date V 27 2010-05-30T22:50:18.183672Z K 7 svn:log V 89 Move '-w' in the #! line into 'use warnings;' in the Perl code, to simplify the #! line. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3134e3fa3b91dcca846ce0ff9f3642f8 Text-delta-base-sha1: 84da7b3bde750589e0e4e403dcaa21b9f269ce17 Text-content-length: 53 Text-content-md5: 779c7f7999afaa3f4b1f939bc9f7f3b5 Text-content-sha1: d2922d04a89e24d51574f6fa1308ce0c0cf0f449 Content-length: 53 SVN��@K �m�B~#!/usr/bin/env perlwarnings; Revision-number: 8968 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8969 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8970 Prop-content-length: 318 Content-length: 318 K 10 svn:author V 3 ben K 8 svn:date V 27 2010-06-29T22:00:43.330935Z K 7 svn:log V 219 Set WM_TRANSIENT_FOR appropriately on the "about" box so that fvwm doesn't insist on finding a bit of spare screen to put it in. Still pondering whether it's sensible to do this with the "change settings" box as well. PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7588cea1f9587b76e7cc4cbf5f8cd20c Text-delta-base-sha1: fa495010ee7f40a8b111bf9e0e088dd4baa32030 Text-content-length: 106 Text-content-md5: 38f72c32efa496b3da5bca1131546992 Text-content-sha1: 96d1ce762312091795552b72922850f7b1adbaee Content-length: 106 SVN���������J D�K�D� >ndow_set_transient_for(GTK_WINDOW(aboutbox), GTK_WINDOW(window) Revision-number: 8971 Prop-content-length: 855 Content-length: 855 K 8 svn:date V 27 2010-07-04T22:53:53.244639Z K 7 svn:log V 754 Patch from Alan Ning (somewhat polished by me): introduce a flag called 'pending_close'. This deals with the situation in which we're forwarding a port, have received and locally buffered some data from the local endpoint but not yet been able to pass it down the SSH connection due to window limitations, and then the local endpoint closes its socket. In this situation what we've been doing until now is to immediately send SSH2_MSG_CHANNEL_CLOSE, causing the data still in our local buffer to be lost; now we instead set the new flag, which will remind us to send SSH2_MSG_CHANNEL_CLOSE _after_ we empty our bufchain. Should fix at least one manifestation of 'portfwd-close', though I don't know if it's the cause of all the reports we've ever seen. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d97cb79840c5deae2109db166b5f5c77 Text-delta-base-sha1: 1933e69ffb98187848148b6545ee02aceea495de Text-content-length: 4157 Text-content-md5: 5855a3b111cdc419103381766ba65bf3 Text-content-sha1: ab5f57e35e7c31109d706041281b833b2682a9f5 Content-length: 4157 SVN����1�Z�1�uY /* * This flag indicates that a close is pending on the outgoing * side of the channel: that is, wherever we're getting the data * for this channel has sent us some data followed by EOF. We * can't actually close the channel until we've finished sending * the data, so we set this flag instead to remind us to * initiate the closing process once our buffer is clear. */ int pending_close; ���Kq2�q�C�~H�m<�t#�J �CWp�y8�O�Y�Sp-DES encryption"); break; case SSH_CIPHER_BLOWFISH: logevent("Using Blowfish encryption"); break; } send_packet(ssh, SSH1_CMSG_SESSION_KEY, PKT_CHAR, s->cipher_type, PKT_DATA, cookie, 8, PKT_CHAR, (s->len * 8) >> 8, PKT_CHAR, (s->len * 8) & 0xFF, PKT_DATA, s->rsabuf, s->len, PKT_INT, ssh->v1_local_protoflags, PKT_END); logevent("Trying to enable encryption..."); sfree(s->rsabuf); ssh->cip c->closes = 1; /* sent MSG_CLOSE */ } else { int bytes_to_send = bufchain_size(&c->v.v2.outbuffer); if (bytes_to_send > 0) { /* * If we still have unsent data in our outgoing * buffer for this channel, we can't actually * initiate a close operation yet or that data * will be lost. Instead, set the pending_close * flag so that when we do clear the buffer * we'll start closing the channel. */ char logmsg[160] = {'\0'}; sprintf( logmsg, "Forwarded port pending to be closed : " "%d bytes remaining", bytes_to_send); logevent(logmsg); c->pending_close = TRUE; } else { /* * No locally buffered data, so we can send the * close message immediately. */ struct Packet *pktout; pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_send(ssh, pktout); c->closes = 1; /* sent MSG_CLOSE */ logevent("Nothing left to send, closing channel"); } } } pending_close = FALSEpending_close = FALSEpending_close = FALSESsh ssh, /* * If we've emptied the channel's output buffer and there's a * pending close event, start the channel-closing procedure. */ if (c->pending_close && bufchain_size(&c->v.v2.outbuffer) == 0) { struct Packet *pktout; c->closes = 1; c->pending_close = FALSE;pending_close = FALSEssh, �{=};�\(%�i�6��E6ode>", "Administratively prohibited", "Connect failed", "Unknown channel type", "Resource shortage", }; unsigned reason_code; char *reason_string; int reason_length; struct ssh_channel *c; c = ssh2_channel_msg(ssh, pktin); if (!c) return; if (c->type != CHAN_SOCKDATA_DORMANT) return; /* dunno why they're failing this */ reason_code = ssh_pkt_getuint32(pktin); if (reason_code >= lenof(reasons)) reason_code = 0; /* ensure reasons[reason_code] in range */ ssh_pkt_getstring(pktin, &reason_string, &reason_length); logeventf(ssh, "Forwarded connection refused by server: %s [%.*s]", reasons[reason_code], reason_length, reason_string); pfd_close(c->u.pfd.s); del234(ssh->channels, c); sfree(c); } static void ssh2_msg_channeint reply = SSH2_MSG_CHANNEL_FAILURE; /* default */ struct ssh_channel *c; struct Packet *pktout; c = ssh2_channel_msg(ssh, pktin); if (!c) return;Having got the channel number, we now look at * the request type string to see if it's something * we recognise. */ if (c == ssh->mainchan) { /* * We recognise "exit-status" and "exit-signal" on * the primary channel. */ if (typelen == 11 && !memcmp(type, "exit-status", 11)) { ssh->exitcode = ssh_pkt_getuint32(pktin); logeventf(ssh, "Server sent command exit status %d", ssh->exitcode); reply = SSH2_MSG_CHANNEL_SUCCESS; } else if (typelen == 11 && !memcmp(type, "exit-signal", 11)) { int is_plausible = TRUE, is_int = FALSE; char *fmt_sig = "", *fmt_msg = ""; char *msg; int msssh, Revision-number: 8972 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8973 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8974 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2010-07-30T19:45:40.286542Z K 7 svn:log V 54 A comment typo fix I've had lying around for a while. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 89836126b15c5bc4723d03b330e54fb7 Text-delta-base-sha1: 3d1d588a9dc35ca778d7037746f757db6004315f Text-content-length: 63 Text-content-md5: 03e3015e5d80a45fcbd159d34faafa9e Text-content-sha1: f33cb560096ffb3472374c0522696f834c8b8429 Content-length: 63 SVN���� � ��N0tentially) twenty-���en Revision-number: 8975 Prop-content-length: 279 Content-length: 279 K 7 svn:log V 178 Cancelling a remote port forwarding that had been refused by the server caused a double-free. Reported and diagnosed by Sven Schaepe. Also fix a minor memory leak in ssh_free(). K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-07-30T20:47:03.567750Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5855a3b111cdc419103381766ba65bf3 Text-delta-base-sha1: ab5f57e35e7c31109d706041281b833b2682a9f5 Text-content-length: 318 Text-content-md5: 4c12ef9692c395a32cb3f4e10b250f23 Text-content-sha1: 774fe5f7e581648f2a00d4033fa4ef8426d4c52b Content-length: 318 SVN�����������n�9��d6V�upf->pfrec->remote = NULL/* epf->remote or epf->local may be NULL if setting up a * forwarding failed. */�=<w�i��Onsg_channel_open_failure(Ssh ssh, struct Packet *pktin) { static const char *const reasons[] = { "<unknown reason cfree_rportfwd Revision-number: 8976 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8977 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8978 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8979 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8980 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2010-08-10T17:21:25.742206Z K 7 svn:log V 62 Mass correction of svn:keywords and svn:eol-style properties. K 10 svn:author V 5 simon PROPS-END Node-path: putty/be_all_s.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/be_nos_s.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/macosx/osx.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/macosx/osxclass.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 13 svn:eol-style V 6 native K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/nogss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/noprint.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/notiming.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/pgssapi.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/pgssapi.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/pinger.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/sercfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/ssharcf.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/sshgss.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/sshgssc.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/sshgssc.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/sshnogss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/time.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/timing.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/unix/gtkcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/unix/gtkfont.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 13 svn:eol-style V 6 native K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/unix/xpmptcfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/unix/xpmpterm.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 13 svn:eol-style V 6 native K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/unix/xpmpucfg.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 13 svn:eol-style V 6 native K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/unix/xpmputty.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/windows/rcstuff.h Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/windows/winhelp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/windows/winproxy.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/windows/winser.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/windows/wintime.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 57 Content-length: 57 K 12 svn:keywords V 23 Author Date Id Revision PROPS-END Node-path: putty/windows/winx11.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Text-delta: true Text-delta-base-md5: 55e9077753c7e73d1ba4df42cf610cf7 Text-delta-base-sha1: 0411e5ebd2c70dbaca98308aba1fa773018b6cef Text-content-length: 390 Text-content-md5: d9cb173439d63460f258c6b49d2eac50 Text-content-sha1: 3759ceab983cd0f736acda881bd88c7ac39d22d2 Content-length: 477 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN�� www/* * winx11.c: fetch local auth data for X forwarding. */ #include <ctype.h> #include <assert.h> #include <stdlib.h> #include "putty.h" #include "ssh.h" void platform_get_x11_auth(struct X11Display *disp, const Config *cfg) { if (cfg->xauthfile.path[0]) x11_get_auth_from_authfile(disp, cfg->xauthfile.path); } const int platform_uses_x11_unix_by_default = FALSE; Revision-number: 8981 Prop-content-length: 356 Content-length: 356 K 8 svn:date V 27 2010-08-10T18:45:51.410917Z K 7 svn:log V 255 When we disconnect because we have no supported authentication methods left to try, it's nice to have the version of that message going to the client contain the list of methods sent by the server. Saves a user having to pull it out of an SSH packet log. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4c12ef9692c395a32cb3f4e10b250f23 Text-delta-base-sha1: 774fe5f7e581648f2a00d4033fa4ef8426d4c52b Text-content-length: 299 Text-content-md5: 9d1259f20d7095f0f05ccd931109ead7 Text-content-sha1: 0b773f33b99c64e197e1ad2ff0605ca484f42673 Content-length: 299 SVN����������������<c$Y�e��`_� _!� �-char *methods = NULL; int methlen = 0; char *str = dupprintf("No supported authentication methods available" " (server sent: %.*s)", methlen, methods); ssh_disconnect(ssh, strsfree(str); Revision-number: 8982 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8983 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8984 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8985 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8986 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8987 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8988 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8989 Prop-content-length: 288 Content-length: 288 K 8 svn:date V 27 2010-09-09T14:32:25.905507Z K 7 svn:log V 187 Cast incoming characters to unsigned char to avoid accidental sign extension. Since ldisc_send() uses bit 8 as an internal flag, we shouldn't be setting it except when we really want to. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 293b6d695ac816e2c14c206d28bb9840 Text-delta-base-sha1: 73ed6f7b79499f802c5f4481959101d35bec0db8 Text-content-length: 44 Text-content-md5: 1955ef7fd2afa554ba0d0f33c77c4d0d Text-content-sha1: fe79254e2c400d9cc28839798a4481811c69ec84 Content-length: 44 SVN��  ���u(unsigned char)(*buf++) Revision-number: 8990 Prop-content-length: 367 Content-length: 367 K 7 svn:log V 266 Remove redundant check for NULL in sshfwd_close(). The thing we're testing against NULL has already been dereferenced by the time we bother to test it, so it's a bit pointless - and in any case, no null pointer can come to this function from any existing call site. K 10 svn:author V 5 simon K 8 svn:date V 27 2010-09-09T14:35:16.484104Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d1259f20d7095f0f05ccd931109ead7 Text-delta-base-sha1: 0b773f33b99c64e197e1ad2ff0605ca484f42673 Text-content-length: 63 Text-content-md5: c88ffb8e849354d38c31e803b84f08f3 Text-content-sha1: e5c3346967fd6943880ab011475a7a9399d4ad6f Content-length: 63 SVN����������� � ��psg_ch�c^��^ Revision-number: 8991 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2010-09-09T14:36:46.406891Z K 7 svn:log V 69 Missing close() causing resource leak when reading from /dev/random. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0e034ec45febb2a5f3a9e0f870b5647a Text-delta-base-sha1: 0e65ca3150e6abed0284036476755fa9f34c8e1b Text-content-length: 46 Text-content-md5: 143d445cd0bff001d58ca6fd6a33180b Text-content-sha1: 2aaa5d0ca8d9449d6f6c2aab79452c4123747129 Content-length: 46 SVN��hx�Z�close(fd); return buf; } Revision-number: 8992 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8993 Prop-content-length: 389 Content-length: 389 K 8 svn:date V 27 2010-09-13T08:29:45.343923Z K 7 svn:log V 288 Create, and use for all loads of system DLLs, a wrapper function called load_system32_dll() which constructs a full pathname for the DLL using GetSystemDirectory. The only DLL load not covered by this change is the one for gssapi32.dll, because that one's not in the system32 directory. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 03e3015e5d80a45fcbd159d34faafa9e Text-delta-base-sha1: f33cb560096ffb3472374c0522696f834c8b8429 Text-content-length: 70 Text-content-md5: bd1af26d747fc1e5e0f85b033a6a71c6 Text-content-sha1: 46d45f505aabe694fc52bf5161a952b14fff7ebc Content-length: 70 SVN��������� �1��QHload_system32_dll("user32.dll Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8f82423907cff1e7d38ae463b318937c Text-delta-base-sha1: b3c84716c17d8ee652ed9f2dd55e3fbb2e799865 Text-content-length: 38 Text-content-md5: 7a451384aaccc9b02ddad882b4da2390 Text-content-sha1: 448571161bafb8979b9ea42e2d735b218a28f6e6 Content-length: 38 SVN��� �u����load_system32_dll Node-path: putty/windows/winhelp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b6bdfebaaad01c8276ea90cde32e7849 Text-delta-base-sha1: 79e717d9893ebfd68a4982e496cc8bb00200c525 Text-content-length: 38 Text-content-md5: 020d1109643ec3c6a7eb40d0943e891e Text-content-sha1: 78cd557df1421a029e338e58e7c276c324bcf204 Content-length: 38 SVN�� �|��load_system32_dll Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db30d7704413453decef48e7173316f0 Text-delta-base-sha1: 69698c82a3d996df074f38c2572e168439c144a5 Text-content-length: 720 Text-content-md5: 9920b06ef86a5a4994ae118be4ce2c53 Text-content-sha1: d951415ec7f7b8af0d9c95b4e01474c6b50f9f2e Content-length: 720 SVN��:Y2���w/�!load_system32_dll("secur32.dllHMODULE load_system32_dll(const char *libname) { /* * Wrapper function to load a DLL out of c:\windows\system32 * without going through the full DLL search path. (Hence no * attack is possible by placing a substitute DLL earlier on that * path.) */ static char *sysdir = NULL; char *fullpath; HMODULE ret; if (!sysdir) { int size = 0, len; do { size = 3*size/2 + 512; sysdir = sresize(sysdir, size, char); len = GetSystemDirectory(sysdir, size); } while (len >= size); } fullpath = dupcat(sysdir, "\\", libname, NULL); ret = LoadLibrary(fullpath); sfree(fullpath); return ret Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f38a6b18bc08ad689370ce44ce55fee2 Text-delta-base-sha1: 95145ddd2c1b12d9c3f82b2d4492d7ea8455e7f5 Text-content-length: 156 Text-content-md5: 90514464d6141bcb17315e09707df89b Text-content-sha1: b1933080dc9f1fa7b21c870ac2eb9909903ae471 Content-length: 156 SVN��"4}�d�l�UD�~$load_system32_dll("ws2_32.dll"); if (!winsock_module) { winsock_module = load_system32_dll("wsock32.dllload_system32_dll Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a344106fd6b381999e58bf30d906d67 Text-delta-base-sha1: 44bb8137914ebaf5fa3722a7d9e0fb4fa6a3fc35 Text-content-length: 56 Text-content-md5: 9f2c027456444dc77315f44d62301b76 Text-content-sha1: 6951680335077580b6e9a7539ed43a2c59d84c10 Content-length: 56 SVN�� �p�� load_system32_dll("advapi32.dll Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f5a88ab53550c6184a25bbaa6f2b042a Text-delta-base-sha1: afb9e823b4b693c748548c8d826c8c480bf74eec Text-content-length: 53 Text-content-md5: a139cda94f7eb75483065d97afac4c4e Text-content-sha1: a6d1d1902f1074774738f1b22d8d6f41c6577776 Content-length: 53 SVN�� ���f0load_system32_dll("shell32.dll Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c0977b45bb47d1e86e8885f5bd6e8027 Text-delta-base-sha1: bde1614af4203f049d533203317b9cfa9a933052 Text-content-length: 66 Text-content-md5: c93f1c16a6eacefeb88c9f214e1f96cb Text-content-sha1: bde727e681d0217363b6cab56fcb09f991c549c8 Content-length: 66 SVN��s# -�_��\HMODULE load_system32_dll(const char *libname Revision-number: 8994 Prop-content-length: 164 Content-length: 164 K 8 svn:date V 27 2010-09-13T08:45:18.890949Z K 7 svn:log V 64 Fix obvious braino in the Windows GSSAPI library display names. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a451384aaccc9b02ddad882b4da2390 Text-delta-base-sha1: 448571161bafb8979b9ea42e2d735b218a28f6e6 Text-content-length: 27 Text-content-md5: aa3f0acc6fe8a11ba7bb991e4226adf6 Text-content-sha1: c1db6b0066cef3a008a9bd9614524b767989ae99 Content-length: 27 SVN�� ���kECUR32 Revision-number: 8995 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8996 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8997 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 8998 Prop-content-length: 185 Content-length: 185 K 10 svn:author V 4 owen K 8 svn:date V 27 2010-09-15T09:58:41.199896Z K 7 svn:log V 86 Can't reproduce several years later, so I think this wasn't a bug in the first place. PROPS-END Node-path: putty-wishlist/data/psftp-missing-subdirs Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bd70de807b9ab819db48c7035f7ba8d3 Text-delta-base-sha1: 1b541a7202b15b648a927341e947c15ede3160a0 Text-content-length: 18 Text-content-md5: 1e8408102349365100edf53daebdeb91 Text-content-sha1: 80273589364f2c079dae2beabd583e69f8f96476 Content-length: 18 SVN�� ��[��2l Revision-number: 8999 Prop-content-length: 216 Content-length: 216 K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-09-15T18:50:34.757470Z K 7 svn:log V 115 Use the same key for both saving and loading the GSSAPI implementation preference list. Spotted by Daniel Kessler. PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d98e670bd7c347f77e3e7cda6905b25b Text-delta-base-sha1: 7cfa7ba373d683a9a7edba9609f0e8856a84a7d0 Text-content-length: 27 Text-content-md5: 6f07422eaaa9721af0ae2a24eb283f56 Text-content-sha1: a6ae034406cb6fdc10a747e1f2e1b53be0638b78 Content-length: 27 SVN��TT � ��H bs Revision-number: 9000 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2010-09-15T19:50:12.770902Z K 7 svn:log V 34 Tracked down when this was fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/psftp-missing-subdirs Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e8408102349365100edf53daebdeb91 Text-delta-base-sha1: 80273589364f2c079dae2beabd583e69f8f96476 Text-content-length: 62 Text-content-md5: eb3854d59780830b9a0b80ed062f2315 Text-content-sha1: 5b4b91a7917158765f4072ca3d2a444b61308d72 Content-length: 62 SVN�� 9+�[��3ZPresent-in: 0.59 Fixed-in: r7438 2007-04-03 Revision-number: 9001 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9002 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9003 Prop-content-length: 796 Content-length: 796 K 8 svn:date V 27 2010-09-25T07:16:56.100426Z K 7 svn:log V 695 Cleanups of the GSSAPI support. On Windows, standard GSS libraries are now loaded from standard locations (system32 for SSPI, the registry-stored MIT KfW install location for KfW) rather than using the risky default DLL search path; I've therefore also added an option to manually specify a GSS DLL we haven't heard of (which should in principle Just Work provided it supports proper GSS-API as specified in the RFC). The same option exists on Unix too, because it seemed like too useful an idea to reserve to Windows. In addition, GSSAPI is now documented, and also (unfortunately) its GUI configuration has been moved out into a sub-subpanel on the grounds that it was too big to fit in Auth. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cfffdaefef8da61c614e9386bd170c20 Text-delta-base-sha1: 07e3e641808ca5c7d97f0b9c96193c2ac029913f Text-content-length: 1737 Text-content-md5: 6ab2644679ca2322f9de9cd3b8ef3ce7 Text-content-sha1: 2eabd86cb872dae36591ed7eff1c127c08c79595 Content-length: 1737 SVN��Ux+�T��0�wr�L<2�)kl�x]Connection/SSH/Auth/GSSAPI, which sadly won't fit on * the main Auth panel. */ ctrl_settitle(b, "Connection/SSH/Auth/GSSAPI", "Options controlling GSSAPI authentication"); s = ctrl_getset(b, "Connection/SSH/Auth/GSSAPI", "gssapi", NULL); ctrl_checkbox(s, "Attempt GSSAPI authentication (SSH-2 only)", NO_SHORTCUT, HELPCTX(ssh_gssapi ctrl_checkbox(s, "Allow GSSAPI credential delegation", NO_SHORTCUT, HELPCTX(ssh_gssapi_delegation), dlg_stdcheckbox_handler, I(offsetof(Config,gssapifwd))); ssh_gssapi_libraries), gsslist_handler, P(NULL)); c->listbox.height = ngsslibs; /* * I currently assume that if more than one GSS * library option is available, then one of them is * 'user-supplied' and so we should present the * following file selector. This is at least half- * reasonable, because if we're using statically * linked GSSAPI then there will only be one option * and no way to load from a user-supplied library, * whereas if we're using dynamic libraries then * there will almost certainly be some default * option in addition to a user-supplied path. If * anyone ever ports PuTTY to a system on which * dynamic-library GSSAPI is available but there is * absolutely no consensus on where to keep the * libraries, there'll need to be a flag alongside * ngsslibs to control whether the file selector is * displayed. */ ctrl_filesel(s, "User-supplied GSSAPI library path:", 'l', FILTER_DYNLIB_FILES, FALSE, "Select library file", HELPCTX(ssh_gssapi_libraries), dlg_stdfilesel_handler, I(offsetof(Config, ssh_gss_custom))) Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 00d4d0e9eeb015fbe06631ca5e7d9c7f Text-delta-base-sha1: 17b9217d2ce774db0960c162da1e7e9144a48187 Text-content-length: 3143 Text-content-md5: 9080aa98d7d4a9aa27e7f08f50cef879 Text-content-sha1: ad9a5665f8bb451966fc9672586d486f6aee5768 Content-length: 3143 SVN���������\ �R��Aauth-gssapi} The GSSAPI panel \cfg{winhelp-topic}{ssh.auth.gssapi} The \q{GSSAPI} subpanel of the \q{Auth} panel controls the use of GSSAPI authentication. This is a mechanism which delegates the authentication exchange to a library elsewhere on the client machine, which in principle can authenticate in many different ways but in practice is usually used with the Kerberos single-sign-on protocol. GSSAPI is only available in the SSH-2 protocol. The topmost control on the GSSAPI subpanel is the checkbox labelled \q{Attempt GSSAPI authentication}. If this is disabled, GSSAPI will not be attempted at all and the rest of this panel is unused. If it is enabled, GSSAPI authentication will be attempted, and (typically) if your client machine has valid Kerberos credentials loaded, then PuTTY should be able to authenticate automatically to servers that support Kerberos logins. \S{config-ssh-auth-gssapi-delegation} \q{Allow GSSAPI credential delegation} \cfg{winhelp-topic}{ssh.auth.gssapi.delegation} GSSAPI credential delegation is a mechanism for passing on your Kerberos (or other) identity to the session on the SSH server. If you enable this option, then not only will PuTTY be able to log in automatically to a server that accepts your Kerberos credentials, but also you will be able to connect out from that server to other Kerberos-supporting services and use the same credentials just as automatically. (This option is the Kerberos analogue of SSH agent forwarding; see \k{pageant-forward} for some information on that.) Note that, like SSH agent forwarding, there is a security implication in the use of this option: the administrator of the server you connect to, or anyone else who has cracked the administrator account on that server, could fake your identity when connecting to further Kerberos-supporting services. However, Kerberos sites are typically run by a central authority, so the administrator of one server is likely to already have access to the other services too; so this would typically be less of a risk than SSH agent forwarding. \S{config-ssh-auth-gssapi-libraries} Preference order for GSSAPI libraries \cfg{winhelp-topic}{ssh.auth.gssapi.libraries} GSSAPI is a mechanism which allows more than one authentication method to be accessed through the same interface. Therefore, more than one authentication library may exist on your system which can be accessed using GSSAPI. PuTTY contains native support for a few well-known such libraries, and will look for all of them on your system and use whichever it finds. If more than one exists on your system and you need to use a specific one, you can adjust the order in which it will search using this preference list control. One of the options in the preference list is to use a user-specified GSSAPI library. If the library you want to use is not mentioned by name in PuTTY's list of options, you can enter its full pathname in the \q{User-supplied GSSAPI library path} field, and move the \q{User-supplied GSSAPI library} option in the preference list to make sure it is selected before anything else Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ee1aa300ab5347201857fa35ddbf5b8a Text-delta-base-sha1: 53083302fd948fbb6f92ea2eefd039b6ea924b13 Text-content-length: 48 Text-content-md5: 82b0dac12ce63cc74db9fbd8f212c52d Text-content-sha1: 1184b42834e95f1c24ed6b4c1a5225296338fe85 Content-length: 48 SVN��< �9��k4Filename ssh_gss_custom; Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f07422eaaa9721af0ae2a24eb283f56 Text-delta-base-sha1: a6ae034406cb6fdc10a747e1f2e1b53be0638b78 Text-content-length: 191 Text-content-md5: 46fdb28d9682f54382d9902d7c914dbc Text-content-sha1: 150d0d0b1e747fad376799a36ef5ff159aa6c114 Content-length: 191 SVN��T�k��cj�6:�^o�E#ifndef NO_GSSAPIfilename(sesskey, "GSSCustom", cfg->ssh_gss_custom); #endif#ifndef NO_GSSAPIfile(sesskey, "GSSCustom", &cfg->ssh_gss_custom); #endif Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c88ffb8e849354d38c31e803b84f08f3 Text-delta-base-sha1: e5c3346967fd6943880ab011475a7a9399d4ad6f Text-content-length: 801 Text-content-md5: 3d222bfbac135b8c7e2745234dac6bdd Text-content-sha1: 442b9afece568451e99650a502598aea183ac9d0 Content-length: 801 SVN����w� �w� #ifndef NO_GSSAPI /* * GSSAPI libraries for this session. */ struct ssh_gss_liblist *gsslibs; #endif���xx�� case SSH_CIPHER_3DES: logevent("Using 3DES encryption"); break; case SSH_CIPHER_DES: logevent("Using single�^,M�hj�t�I�!u�1 �W<N�L_CHANNEL_CLOSEch if (!ssh->gsslibs) ssh->gsslibs = ssh_gss_setup(&ssh->cfg); s->can_gssapi = ssh->cfg.try_gssapi_auth && in_commasep_string("gssapi-with-mic", methods, methlen) && ssh->gsslibs->nssh->gsslibs->nlibraries; j++) if (ssh->gsslibs->libraries[j].id == want_id) { s->gsslib = &ssh->gsslibs->#ifndef NO_GSSAPI ssh->gsslibs = NULL; #endif#ifndef NO_GSSAPI if (ssh->gsslibs) ssh_gss_cleanup(ssh->gsslibs); #endif Node-path: putty/sshgss.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 16a3b37904946cfc3ee3e0ecca2cef53 Text-delta-base-sha1: 15af2d604919decd33f5e051189418cda4358832 Text-content-length: 847 Text-content-md5: e27deb9f3ff25fde37efc4b26d5d70b5 Text-content-sha1: 4a3ec4ad55b59a5e098f8393686331d5861c8e24 Content-length: 847 SVN��1�}�#�2Y5`Prepare a collection of GSSAPI libraries for use in a single SSH * connection. Returns a structure containing a list of libraries, * with their ids (see struct ssh_gss_library below) filled in so * that the client can go through them in the SSH user's preferred * order. * * Must always return non-NULL. (Even if no libraries are available, * it must return an empty structure.) * * The free function cleans up the structure, and its associated * libraries (if any). */ struct ssh_gss_liblist { struct ssh_gss_library *libraries; int nlibraries; }; struct ssh_gss_liblist *ssh_gss_setup(const Config *cfg); void ssh_gss_cleanup(struct ssh_gss_liblist *list /* * Wrapper layers will often also need to store a library handle * of some sort for cleanup time. */ void *handle; } Node-path: putty/sshnogss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5840d4629c92e0502132f27b43dc872 Text-delta-base-sha1: 9c263caa3c640c02b9e519b7ed7b935f675f1cc2 Text-content-length: 289 Text-content-md5: a8fbea13f515706470dc0a7382fb89dc Text-content-sha1: 5ccb0b90d43440b0da31297c833ee260a6979af2 Content-length: 289 SVN��y �Q� jstruct ssh_gss_liblist *ssh_gss_setup(const Config *cfg) { struct ssh_gss_liblist *list = snew(struct ssh_gss_liblist *); list->libraries = NULL; list->nlibraries = 0; return list; } void ssh_gss_cleanup(struct ssh_gss_liblist *list) { sfree(list); Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9968021500e2fad7c74ee70a66d69976 Text-delta-base-sha1: d13871a08bfd856c123b53c41af2652759dac70e Text-content-length: 53 Text-content-md5: 7bbc709341ec910875c53e8e272d373b Text-content-sha1: d6b616a258d8826281ce0e643174da2540ac6b28 Content-length: 53 SVN��d �G��04#define FILTER_DYNLIB_FILES NULL Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cce7cc1b3503aef9d00aa7baf25f1b87 Text-delta-base-sha1: 2ddd441d32d5db16d7a7298657c974af6f21e228 Text-content-length: 2343 Text-content-md5: 340bd9b2e8f8f15391acb928d95b79cb Text-content-sha1: f4083eeecddef99a45edd51b33f8bc09a2c091b0 Content-length: 2343 SVN��dDW��d�Z:�y�<�@X_�qx�:�.[R�_z8�f6 40#if !defined NO_LIBDL && !defined NO_GSSAPI const int ngsslibs = 4; const char *const gsslibnames[4 "User-specified GSSAPI library { "custom", 3 }, }; lib->handle = dlhandlestruct ssh_gss_liblist *ssh_gss_setup(const Config *cfg) { void *gsslib; struct ssh_gss_liblist *list = snew(struct ssh_gss_liblist); list->libraries = snewn(4, struct ssh_gss_library); list->nlibraries = 0list->libraries[list->nlist->libraries[list->nlist->libraries[list->nlibraries++], gsslib, 2, "Using GSSAPI from libgss.so.1"); /* User-specified GSSAPI library */ if (cfg->ssh_gss_custom.path[0] && (gsslib = dlopen(cfg->ssh_gss_custom.path, RTLD_LAZY)) != NULL) gss_init(&list->libraries[list->nlibraries++], gsslib, 3, dupprintf("Using GSSAPI from user-specified" " library '%s'", cfg->ssh_gss_custom.path)); return list; } void ssh_gss_cleanup(struct ssh_gss_liblist *list) { int i; /* * dlopen and dlclose are defined to employ reference counting * in the case where the same library is repeatedly dlopened, so * even in a multiple-sessions-per-process context it's safe to * naively dlclose everything here without worrying about * destroying it under the feet of another SSH instance still * using it. */ for (i = 0; i < list->nlibraries; i++) { dlclose(list->libraries[i].handle); if (list->libraries[i].id == 3) { /* The 'custom' id involves a dynamically allocated message. * Note that we must cast away the 'const' to free it. */ sfree((char *)list->libraries[i].gsslogmsg); } } sfree(list->libraries); sfree(list); } #elif !defined NO_GSSAPI const int ngsslibs = 1; const char *const gsslibnames[1] = { "static", }; const struct keyval gsslibkeywords[] = { { "static", 0 }, };struct ssh_gss_liblist *ssh_gss_setup(const Config *cfg) { struct ssh_gss_liblist *list = snew(struct ssh_gss_liblist); list->libraries = snew(struct ssh_gss_library); list->nlibraries = 1; list->libraries[0].gsslogmsg = "Using statically linked GSSAPI"; #define BIND_GSS_FN(name) \ list->list->libraries[0]); return list; } void ssh_gss_cleanup(struct ssh_gss_liblist *list) { sfree(list->libraries); sfree(list Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aa3f0acc6fe8a11ba7bb991e4226adf6 Text-delta-base-sha1: c1db6b0066cef3a008a9bd9614524b767989ae99 Text-content-length: 2831 Text-content-md5: 725fcd12bc43b2116e724eb571cab893 Text-content-sha1: 5da73b7f73820258eac962805e46108b9407a67e Content-length: 2831 SVN�� ?1R�G��Y3�X �Yx�9�Kx�5Tconst int ngsslibs = 3; const char *const gsslibnames[3] = { "MIT Kerberos GSSAPI32.DLL", "Microsoft SSPI SECUR32.DLL", "User-specified GSSAPI DLL { "custom", 2struct ssh_gss_liblist *ssh_gss_setup(const Config *cfg) { HMODULE module; HKEY regkey; struct ssh_gss_liblist *list = snew(struct ssh_gss_liblist); list->libraries = snewn(3, struct ssh_gss_library); list->nlibraries = 0; /* MIT Kerberos GSSAPI implementation */ /* TODO: For 64-bit builds, check for gssapi64.dll */ module = NULL; if (RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\MIT\\Kerberos", ®key) == ERROR_SUCCESS) { DWORD type, size; LONG ret; char *buffer; /* Find out the string length */ ret = RegQueryValueEx(regkey, "InstallDir", NULL, &type, NULL, &size); if (ret == ERROR_SUCCESS && type == REG_SZ) { buffer = snewn(size + 20, char); ret = RegQueryValueEx(regkey, "InstallDir", NULL, &type, buffer, &size); if (ret == ERROR_SUCCESS && type == REG_SZ) { strcat(buffer, "\\bin\\gssapi32.dll"); module = LoadLibrary(buffer); } sfree(buffer); } RegCloseKey(regkey); } if (module) { struct ssh_gss_library *lib = &list->libraries[list->nlibraries++]; lib->id = 0; lib->gsslogmsg = "Using GSSAPI from GSSAPI32.DLL"; lib->handle = (void *)modulelist->libraries[list->nlibraries++]; lib->id = 1; lib->gsslogmsg = "Using SSPI from SECUR32.DLL"; lib->handle = (void *)module /* * Custom GSSAPI DLL. */ module = NULL; if (cfg->ssh_gss_custom.path[0]) { module = LoadLibrary(cfg->ssh_gss_custom.path); } if (module) { struct ssh_gss_library *lib = &list->libraries[list->nlibraries++]; lib->id = 2; lib->gsslogmsg = dupprintf("Using GSSAPI from user-specified" " library '%s'", cfg->ssh_gss_custom.path); lib->handle = (void *)module return list; } void ssh_gss_cleanup(struct ssh_gss_liblist *list) { int i; /* * LoadLibrary and FreeLibrary are defined to employ reference * counting in the case where the same library is repeatedly * loaded, so even in a multiple-sessions-per-process context * (not that we currently expect ever to have such a thing on * Windows) it's safe to naively FreeLibrary everything here * without worrying about destroying it under the feet of * another SSH instance still using it. */ for (i = 0; i < list->nlibraries; i++) { FreeLibrary((HMODULE)list->libraries[i].handle); if (list->libraries[i].id == 2) { /* The 'custom' id involves a dynamically allocated message. * Note that we must cast away the 'const' to free it. */ sfree((char *)list->libraries[i].gsslogmsg); } } sfree(list->libraries); sfree(list); Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0470edf71eb26614b9bbae9d070f7a12 Text-delta-base-sha1: 3900152ffd1d9a0e51c4c9230b1b65ea71052c59 Text-content-length: 280 Text-content-md5: 01ca8cdab389f7efd4ede6fe56be9469 Text-content-sha1: 347fcf5b96a7ebba2f948c644ae900093e8b9ba3 Content-length: 280 SVN��&= �����$sh_gssapi "ssh.auth.gssapi:config-ssh-auth-gssapi" #define WINHELP_CTX_ssh_gssapi_delegation "ssh.auth.gssapi.delegation:config-ssh-auth-gssapi-delegation" #define WINHELP_CTX_ssh_gssapi_libraries "ssh.auth.gssapi.libraries:config-ssh-auth-gssapi-libraries Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c93f1c16a6eacefeb88c9f214e1f96cb Text-delta-base-sha1: bde727e681d0217363b6cab56fcb09f991c549c8 Text-content-length: 98 Text-content-md5: 94bd8a60234245296d15cb34aa414809 Text-content-sha1: 08b4f326a6421d60f7d1bf2fc4a5404d2305b235 Content-length: 98 SVN��# L� �L�4o#define FILTER_DYNLIB_FILES ("Dynamic Library Files (*.dll)\0*.dll\0" \ Revision-number: 9004 Prop-content-length: 395 Content-length: 395 K 8 svn:date V 27 2010-09-25T07:30:08.444224Z K 7 svn:log V 294 Retire the old Mac Classic port directory! It's been unused for ages, is increasingly irrelevant now that 'Mac' pretty much universally means something running OS X, is probably bit-rotted past usefulness already, and certainly will be after the next time some major reengineering takes place. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mac Node-action: delete Revision-number: 9005 Prop-content-length: 192 Content-length: 192 K 7 svn:log V 92 Oops: r9004 should have removed various pieces from the Makefile and header file setup too. K 10 svn:author V 5 simon K 8 svn:date V 27 2010-09-25T08:37:30.342009Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7c59babdb64f6d93892b56f09fff247e Text-delta-base-sha1: db329ec81dc7695340c6e2e68eb72a5a13d25bac Text-content-length: 44 Text-content-md5: a445e0db7d2462677a7de0f43c34d8ce Text-content-sha1: d3d6d9c24156964f7a2532a4e15f5cc683a927c4 Content-length: 44 SVN��W!��|�� �1�3g�4`�]+�y Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 779c7f7999afaa3f4b1f939bc9f7f3b5 Text-delta-base-sha1: d2922d04a89e24d51574f6fa1308ce0c0cf0f449 Text-content-length: 29 Text-content-md5: 2e02aa29477e8b9d2c31a325bc563863 Text-content-sha1: 0bbaacf2139ff15e979ce1ef0c00f6be4f59a3d1 Content-length: 29 SVN��KI����[$�P{ Node-path: putty/puttyps.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 21e0c7bbaabf09f395f2510cf7310479 Text-delta-base-sha1: 812f595c7c04acb34fd1a7963ca61e67d6c15088 Text-content-length: 19 Text-content-md5: 2e52ea1ea31bbf39d2903f5f42496729 Text-content-sha1: 5b1e0ced9d09faea4c9de045c8cbc74a51b7ea8b Content-length: 19 SVN��k��'��DX Revision-number: 9006 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9007 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9008 Prop-content-length: 192 Content-length: 192 K 7 svn:log V 92 Since GSSAPI is now on its own panel, we may as well have a full set of keyboard shortcuts. K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-09-25T15:51:14.086353Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6ab2644679ca2322f9de9cd3b8ef3ce7 Text-delta-base-sha1: 2eabd86cb872dae36591ed7eff1c127c08c79595 Text-content-length: 64 Text-content-md5: 36388ab3eacc23405eb98fa4aa972058 Text-content-sha1: 876a7fb48ac8d191c80caa8f8dc3a5328a1aa21a Content-length: 64 SVN��x`!�N��Y�w�C �)O't''d' 'l',p Revision-number: 9009 Prop-content-length: 201 Content-length: 201 K 8 svn:date V 27 2010-09-25T16:18:02.001364Z K 7 svn:log V 100 Add index terms for GSSAPI stuff. Mention GSSAPI in "use system username" section and other tweaks. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9080aa98d7d4a9aa27e7f08f50cef879 Text-delta-base-sha1: ad9a5665f8bb451966fc9672586d486f6aee5768 Text-content-length: 607 Text-content-md5: 4f585669c1acbe2ff1d5566d28af60bf Text-content-sha1: 21c3b889d7ecfd2c3883dfe69086a358e23f2777 Content-length: 607 SVN����T�q��] >�^)Use of system usernamethe networks of large organisations implementing \i{single sign-on}, a more sensible default may be to use the name of the user logged in to the local operating system (if any); this is particularly likely to be useful with \i{GSSAPI} authentication (see \k{config-ssh-auth-gssapi}). This control allows you to change � By�c��Yi�mY�'b). See \k{config-keepalive} for more discussion of these issues; for these purposes, rekeys have much the same properties\i{GSSAPI}\i{Kerberos} \i{single sign-on}\i{GSSAPI credential delegation} Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f1d85cc72be2c7465a23229f2fdc493 Text-delta-base-sha1: 304a8a912e46a4d824ff2be6450a2f9c86d99902 Text-content-length: 218 Text-content-md5: 66fa3f4fb9fdc057dc432bbe99b21616 Text-content-sha1: 5a686b5c8048377ae4b2184ae6a9c186eb8e65c0 Content-length: 218 SVN��f*D�f�D \IM{GSSAPI credential delegation} GSSAPI credential delegation \IM{GSSAPI credential delegation} credential delegation, GSSAPI \IM{GSSAPI credential delegation} delegation, of GSSAPI credentials Revision-number: 9010 Prop-content-length: 265 Content-length: 265 K 8 svn:date V 27 2010-09-27T11:33:40.016092Z K 7 svn:log V 164 Bah, r9008 caused an assertion failure on Windows due to a clash with the shortcuts for the preference list buttons. That'll teach me to only test the Gtk version. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 36388ab3eacc23405eb98fa4aa972058 Text-delta-base-sha1: 876a7fb48ac8d191c80caa8f8dc3a5328a1aa21a Text-content-length: 42 Text-content-md5: dc4e2ef816c404307908fbf0c683dfc9 Text-content-sha1: 7f5a3753caf209b2735692d120e971d627190876 Content-length: 42 SVN��``�o���p�Eq�)7lps Revision-number: 9011 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9012 Prop-content-length: 209 Content-length: 209 K 8 svn:date V 27 2010-09-30T14:51:52.752152Z K 7 svn:log V 109 Add bug/wish arising from comp.terminals <4717b5ab-d051-40b9-b72d-0a6577372c46@l38g2000pro.googlegroups.com> K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/ctrl-pgupdn-config Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 459 Text-content-md5: 34d84971d74e9c2fbf5f1e2b1db4f649 Text-content-sha1: 4395b720a9854343461d9512f8efb3b1b1404c51 Content-length: 469 PROPS-END SVN���===Summary: Ctrl-PgUp and Ctrl-PgDn scrolling should be configurable Class: bug Priority: medium Difficulty: fun Present-in: 0.54 0.55 0.56 0.57 0.58 0.59 0.60 Content-Type: text/x-html-body <p>Since we implemented <a href="ctrl-pgupdn.html">ctrl-pgupdn</a> Ctrl-PgUp and Ctrl-PgDn scroll by one line at a time. </p> <p> Some people / applications now expect these keys to generate escape sequences, so this behaviour should be configurable. </p> Revision-number: 9013 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9014 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9015 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9016 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9017 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9018 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9019 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9020 Prop-content-length: 320 Content-length: 320 K 8 svn:date V 27 2010-11-06T17:22:38.104745Z K 7 svn:log V 219 David Laight reports that sometimes reads on a serial port will attempt to block, and hence return EAGAIN/EWOULDBLOCK, in spite of the port having been reported readable by select(2). Don't treat those errors as fatal. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 33ff012a3438a52be040726ee90fc6d5 Text-delta-base-sha1: 646a20ac5ce086f88209f46b2bc9af132abc8458 Text-content-length: 195 Text-content-md5: 8bda9b790afdaa24f60d86849c31b2f8 Text-content-sha1: ac6f115c977c8df3767e531939dc69f2aaaf96d0 Content-length: 195 SVN��f +�3�+�42#ifdef EAGAIN if (errno == EAGAIN) return 1; /* spurious */ #endif #ifdef EWOULDBLOCK if (errno == EWOULDBLOCK) return 1; /* spurious */ #endif Revision-number: 9021 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9022 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9023 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9024 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9025 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9026 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9027 Prop-content-length: 169 Content-length: 169 K 7 svn:log V 69 More sensible (and also more idiomatic) bounds checking on esc_args. K 10 svn:author V 5 simon K 8 svn:date V 27 2010-12-07T00:21:42.617872Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 32b08fedbc5b32eb45501fbe5936e73c Text-delta-base-sha1: ab63749f666460ef59016b1ea5f6e463d7b8fd5d Text-content-length: 110 Text-content-md5: 5f7bdd21f84da0a4a9e66d87b3ba06a9 Text-content-sha1: 13d826623427cb76ef2c0dfbe2165b4aaea3b350 Content-length: 110 SVN���� D���%[term->esc_nargs < ARGS_MAX) term->esc_args[term->esc_nargs++ co�*%��% Revision-number: 9028 Prop-content-length: 329 Content-length: 329 K 8 svn:date V 27 2010-12-08T14:21:35.639237Z K 7 svn:log V 228 Add more possible baud rates to the Unix serial backend. These are the union of rates found in the termios.h of Linux 2.6.24 and "SunOS 5.6 Generic_105181-29 sun4u sparc SUNW,Ultra-4" machines. After a patch by Thomas Bechtold. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8bda9b790afdaa24f60d86849c31b2f8 Text-delta-base-sha1: ac6f115c977c8df3767e531939dc69f2aaaf96d0 Text-content-length: 695 Text-content-md5: 3ad222c4ba37ea0696c1103ed3e0e6a6 Text-content-sha1: 4a468c09575ceb4f4d55f78fd33fc9d34c959f7e Content-length: 695 SVN�� �9��@R153600 CHECKBAUD(153600); #endif #ifdef B230400 CHECKBAUD(230400); #endif #ifdef B307200 CHECKBAUD(307200); #endif #ifdef B460800 CHECKBAUD(460800); #endif #ifdef B500000 CHECKBAUD(500000); #endif #ifdef B576000 CHECKBAUD(576000); #endif #ifdef B921600 CHECKBAUD(921600); #endif #ifdef B1000000 CHECKBAUD(1000000); #endif #ifdef B1152000 CHECKBAUD(1152000); #endif #ifdef B1500000 CHECKBAUD(1500000); #endif #ifdef B2000000 CHECKBAUD(2000000); #endif #ifdef B2500000 CHECKBAUD(2500000); #endif #ifdef B3000000 CHECKBAUD(3000000); #endif #ifdef B3500000 CHECKBAUD(3500000); #endif #ifdef B4000000 CHECKBAUD(40000 Revision-number: 9029 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9030 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9031 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9032 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9033 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9034 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9035 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2010-12-17T13:42:52.481975Z K 7 svn:log V 151 Add some more entries to svn:ignore to cope with stuff left by Visual Studio 10. (Not that I think I'm about to migrate, but I've been experimenting.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 260 Content-length: 260 K 10 svn:ignore V 227 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp *.tds *.td2 *.map Makefile.bor Makefile.cyg Makefile.vc Makefile.lcc MSVC DEVCPP *.log *.GID local Output *.DSA *.RSA *.cnt *.hlp .bmake *.sln *.suo PROPS-END Revision-number: 9036 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9037 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9038 Prop-content-length: 499 Content-length: 499 K 8 svn:date V 27 2010-12-20T13:04:34.829781Z K 7 svn:log V 398 Add an 'XLFLAGS' make variable to Makefile.vc, permitting user- supplied extra link flags. This makes it reasonably convenient to compile for Visual Studio debugging: just build using nmake /f Makefile.vc XFLAGS="/Zi /Od" XLFLAGS="/debug" then load the resulting executable into Visual Studio (using 'Open Project' rather than 'Open File') and the debugger should be able to access the source. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e02aa29477e8b9d2c31a325bc563863 Text-delta-base-sha1: 0bbaacf2139ff15e979ce1ef0c00f6be4f59a3d1 Text-content-length: 30 Text-content-md5: 979fc171ae627db92070ef7731f8f6f5 Text-content-sha1: 239299a3ef7d6b241871e345469d656e5ac2fb52 Content-length: 30 SVN��IU �|��Ut\$(X Revision-number: 9039 Prop-content-length: 226 Content-length: 226 K 7 svn:log V 125 Protect against a (non-security-related) buffer overrun if PuTTY is installed somewhere with an exceptionally long pathname. K 10 svn:author V 5 simon K 8 svn:date V 27 2010-12-21T10:11:32.022619Z PROPS-END Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9f2c027456444dc77315f44d62301b76 Text-delta-base-sha1: 6951680335077580b6e9a7539ed43a2c59d84c10 Text-content-length: 26 Text-content-md5: d38c5dbd0ceda8ac46005e185033a4bc Text-content-sha1: 330bb79ee97fa08eb49cac8ee8299fd9c186785a Content-length: 26 SVN�� �F��OF6 Revision-number: 9040 Prop-content-length: 666 Content-length: 666 K 10 svn:author V 5 simon K 8 svn:date V 27 2010-12-22T15:49:33.627448Z K 7 svn:log V 565 Reorganise handling of WM_SIZE to fix two generality problems. Firstly, maximise and restore events were expected never to occur during an interactive resize process (i.e. between WM_ENTERSIZEMOVE and WM_EXITSIZEMOVE), but in fact Aero now allows this to happen if you move the pointer to the top of the screen while dragging the window. Secondly, plain old WM_SIZE events were expected never to occur _outside_ interactive resizes, but Aero permits that too (e.g. Windows-left and Windows-right), and also third-party window repositioning tools will send these. PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bd1af26d747fc1e5e0f85b033a6a71c6 Text-delta-base-sha1: 46d45f505aabe694fc52bf5161a952b14fff7ebc Text-content-length: 2127 Text-content-md5: d8412e8aea71d43414f80114cc901949 Text-content-sha1: a1bff7d617a64961c33c8f5ed6f0e51bd5a21eae Content-length: 2127 SVN����X�j�X�>| if (wParam == SIZE_MAXIMIZED && !was_zoomed) { was_zoomed = 1; prev_rows = term->rows; prev_cols = term->cols; if (cfg.resize_action == RESIZE_TERM) { w = width / font_width; if (w < 1) w = 1; h = height / font_height; if (h < 1) h = 1; term_size(term, h, w, cfg.savelines); } reset_window(0); } else if (wParam == SIZE_RESTORED && was_zoomed) { was_zoomed = 0; if (cfg.resize_action == RESIZE_TERM) term_size(term, prev_rows, prev_cols, cfg.savelines); if (cfg.resize_action != RESIZE_FONT) reset_window(2); else reset_window(0); } else if (wParam == SIZE_MINIMIZED) { /* do nothing */ } else if (cfg.resize_action != RESIZE_FONT && !is_alt_pressed()) { w = (width-cfg.window_border*2) / font_width; if (w < 1) w = 1; h = (height-cfg.window_border*2) / font_height; if (h < 1) h = 1; if (resizing) { /* * Don't call back->size in mid-resize. (To * prevent massive numbers of resize events * getting sent down the connection during an NT * opaque drag.) */ need_backend_resize = TRUE; cfg.height = h; cfg.width = w; } else { term_size(term, h, w, cfg.savelines); } } else { �eFF�� && !compose_state) { /* Okay, prepare for most alts then ... */ if (left_alt) *p++ = '\033'; /* Lets see if it's a pattern we know all about ... */ if (wParam == VK_PRIOR && shift_state == 1) { SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0); return 0; } if (wParam == VK_PRIOR && shift_state == 2) { S Revision-number: 9041 Prop-content-length: 692 Content-length: 692 K 7 svn:log V 591 Pay attention to the width and height provided in WM_SIZE even when restoring a maximised window. Failure to do this was noticeable in the following scenario (again using Aero UI enhancements): 1. resize window using topmost resize handle, and move pointer to top of screen which 'maximises' the window vertically 2. now maximise the window properly using the maximise button in top right 3. now restore. Notepad restores to its position before step 1, because Aero remembers that position for the purpose, but PuTTY thinks it knows better. Only now it doesn't any more. K 10 svn:author V 5 simon K 8 svn:date V 27 2010-12-22T16:14:11.548927Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d8412e8aea71d43414f80114cc901949 Text-delta-base-sha1: a1bff7d617a64961c33c8f5ed6f0e51bd5a21eae Text-content-length: 473 Text-content-md5: 30afbdd204dc13878477bc23c5839cd2 Text-content-sha1: e9ed71ebc36ad1126081d001dea537ea1d6b464c Content-length: 473 SVN����W�v��NsP�eP { if (w < 1) w = 1; h = (height-cfg.window_border*2) / font_height; if (h < 1) h = 1; term_size(term, h, w, cfg.savelines); } else�e0KK�e�m) { if (keystate[VK_NUMLOCK] & 1) shift_state |= 1; wParam = nParam; } } } /* If a key is pressed and AltGr is not active */ if (key_down && (keystate[VK_RMENU] & 0x80) == 0 Revision-number: 9042 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9043 Prop-content-length: 343 Content-length: 343 K 8 svn:date V 27 2010-12-23T15:22:50.709165Z K 7 svn:log V 242 More careful owner SID selection in the Pageant client code. This should solve some of the SID-mismatch issues we've occasionally had reported. Because it's a modification on the client side, it doesn't affect the security of Pageant itself. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winpgntc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dce558c87f70a31c809a4025d63bee97 Text-delta-base-sha1: 6dd48d5faeac5ee885d65d2c26f336dd52f0bb07 Text-content-length: 3206 Text-content-md5: 56ce13ce7233a9a9284b008843c11732 Text-content-sha1: 84f516ac979be90f6c91cea64b6f3f8857ba1331 Content-length: 3206 SVN��"C!Y�]��#ZE�tx�cv�Xifndef NO_SECURITY #include <aclapi.h> #endif/* * Dynamically load advapi32.dll for SID manipulation. In its absence, * we degrade gracefully. */ #ifndef NO_SECURITY int advapi_initialised = FALSE; static HMODULE advapi; DECL_WINDOWS_FUNCTION(static, BOOL, OpenProcessToken, (HANDLE, DWORD, PHANDLE)); DECL_WINDOWS_FUNCTION(static, BOOL, GetTokenInformation, (HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD)); DECL_WINDOWS_FUNCTION(static, BOOL, InitializeSecurityDescriptor, (PSECURITY_DESCRIPTOR, DWORD)); DECL_WINDOWS_FUNCTION(static, BOOL, SetSecurityDescriptorOwner, (PSECURITY_DESCRIPTOR, PSID, BOOL)); static int init_advapi(void) { advapi = load_system32_dll("advapi32.dll"); return advapi && GET_WINDOWS_FUNCTION(advapi, OpenProcessToken) && GET_WINDOWS_FUNCTION(advapi, GetTokenInformation) && GET_WINDOWS_FUNCTION(advapi, InitializeSecurityDescriptor) && GET_WINDOWS_FUNCTION(advapi, SetSecurityDescriptorOwner); } SECURITY_ATTRIBUTES sa, *psa; PSECURITY_DESCRIPTOR psd = NULL; HANDLE proc, tok; TOKEN_USER *user = NULL #ifndef NO_SECURITY if (advapi_initialised || init_advapi()) { /* * Make the file mapping we create for communication with * Pageant owned by the user SID rather than the default. This * should make communication between processes with slightly * different contexts more reliable: in particular, command * prompts launched as administrator should still be able to * run PSFTPs which refer back to the owning user's * unprivileged Pageant. */ if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE, GetCurrentProcessId())) != NULL) { if (p_OpenProcessToken(proc, TOKEN_QUERY, &tok)) { DWORD retlen; p_GetTokenInformation(tok, TokenUser, NULL, 0, &retlen); user = (TOKEN_USER *)LocalAlloc(LPTR, retlen); if (!p_GetTokenInformation(tok, TokenUser, user, retlen, &retlen)) { LocalFree(user); user = NULL; } CloseHandle(tok); } CloseHandle(proc); } psa = NULL; if (user) { psd = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); if (psd) { if (p_InitializeSecurityDescriptor (psd, SECURITY_DESCRIPTOR_REVISION) && p_SetSecurityDescriptorOwner(psd, user->User.Sid, FALSE)) { sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = psd; psa = &sa; } else { LocalFree(psd); psd = NULL; } } } } #endif /* NO_SECURITY */ filemap = CreateFileMapping(INVALID_HANDLE_VALUE, psaif (psd) LocalFree(psd); if (user) LocalFree(user); return 1; } Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 94bd8a60234245296d15cb34aa414809 Text-delta-base-sha1: 08b4f326a6421d60f7d1bf2fc4a5404d2305b235 Text-content-length: 216 Text-content-md5: e4ff9899ffa476c751ad9d1ededf9099 Text-content-sha1: a85f059570753d15251831f0544ae28c22b90011 Content-length: 216 SVN��  @�-�@�#i(p_##name = module ? (t_##name) GetProcAddress(module, STR(name)) : NULL) #define GET_WINDOWS_FUNCTION(module, name) \ (p_##name = module ? (t_##name) GetProcAddress(module, #name) : NULL) Revision-number: 9044 Prop-content-length: 398 Content-length: 398 K 7 svn:log V 297 Another fix to yesterday's window-resizing revamp: when restoring from maximised state, we must be sure to disable the window offset used to centre the terminal in cases where the window is non-negotiably the wrong size (e.g. maximised). Hence we must call reset_window after our terminal resize. K 10 svn:author V 5 simon K 8 svn:date V 27 2010-12-23T15:44:20.007784Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30afbdd204dc13878477bc23c5839cd2 Text-delta-base-sha1: e9ed71ebc36ad1126081d001dea537ea1d6b464c Text-content-length: 98 Text-content-md5: 598447811a260d3f4915cbf0b622779a Text-content-sha1: 28fd027b884f3c9e8f9b1177ba21db3e72f183d9 Content-length: 98 SVN���� ���Y reset_window(2�0U%�0�CIMAL; break; } if (nPara Revision-number: 9045 Prop-content-length: 292 Content-length: 292 K 8 svn:date V 27 2010-12-23T17:16:19.730409Z K 7 svn:log V 191 The special treatment of Alt-resize (to cause resizing to affect the font instead of the terminal size) should only be active in RESIZE_EITHER mode - in RESIZE_TERM it is worse than useless. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 598447811a260d3f4915cbf0b622779a Text-delta-base-sha1: 28fd027b884f3c9e8f9b1177ba21db3e72f183d9 Text-content-length: 449 Text-content-md5: 4132fe6dc27819ac7c3119e71e2c826a Text-content-sha1: 4daeb63c93e17bcd54167a78374836d07875284c Content-length: 449 SVN����r��t�lP~�N}�=1 if (cfg.resize_action == RESIZE_TERM || (cfg.resize_action == RESIZE_EITHER && !is_alt_pressed()== RESIZE_TERM || (cfg.resize_action == RESIZE_EITHER && !is_alt_pressed())) { �Ug�U�; case VK_UP: nParam = VK_NUMPAD8; break; case VK_PRIOR: nParam = VK_NUMPAD9; break; case VK_DELETE: nParam = VK_DE Revision-number: 9046 Prop-content-length: 706 Content-length: 706 K 8 svn:date V 27 2010-12-23T17:32:28.619668Z K 7 svn:log V 605 Support for Windows 7 jump lists (right-click on a program's taskbar icon, even if the program isn't running at the time, to be presented with an application-defined collection of helpful links). The current jump list is updated every time a saved session is loaded, and shows the last few launchable saved sessions (i.e. not those like Default Settings) that were loaded. Also, if Pageant or PuTTYgen or both is in the same directory as the PuTTY binary, the jump list will present links to launch those too. Based on a patch sent last year by Daniel B. Roy, though it's barely recognisable any more... K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a445e0db7d2462677a7de0f43c34d8ce Text-delta-base-sha1: d3d6d9c24156964f7a2532a4e15f5cc683a927c4 Text-content-length: 93 Text-content-md5: 06a639e515f4cb30aef0a545bd3a6724 Text-content-sha1: 815ba6adb8a5c007be1e0b4545ab691f2099953d Content-length: 93 SVN��W &,�0��//�"Z�b{�d\�I?�Q winjum ole32winnojmpwinnojmpwinnojmpwinnojm Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e34e326d14f0f66a54f700befa6183b2 Text-delta-base-sha1: 1bfbeb3932bd9721a65ecbabe251f0a5fdca1c61 Text-content-length: 57 Text-content-md5: 70010f92c836f44a8c00772029147881 Text-content-sha1: 273658b88b6231cf521ffef2b12b91a827b72652 Content-length: 57 SVN��El $�d��dacmdline_session_name = dupstr(value) Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 82b0dac12ce63cc74db9fbd8f212c52d Text-delta-base-sha1: 1184b42834e95f1c24ed6b4c1a5225296338fe85 Text-content-length: 512 Text-content-md5: 304d2090eef700353f9ce4150096f073 Text-content-sha1: 334cb2c3437eee1e6554a22ff8578e103a9c59c0 Content-length: 512 SVN��<a�F�Z�qD/* * This is set to the name of the loaded session. */ GLOBAL char *cmdline_session_name/* * Define no-op macros for the jump list functions, on platforms that * don't support them. (This is a bit of a hack, and it'd be nicer to * localise even the calls to those functions into the Windows front * end, but it'll do for the moment.) */ #ifndef JUMPLIST_SUPPORTED #define add_session_to_jumplist(x) ((void)0) #define remove_session_from_jumplist(x) ((void)0) #endif #endif Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 46fdb28d9682f54382d9902d7c914dbc Text-delta-base-sha1: 150d0d0b1e747fad376799a36ef5ff159aa6c114 Text-content-length: 96 Text-content-md5: 7a5013230386c896f233af8a9bc933cd Text-content-sha1: 388901ec3ad441904246bc716c17f706e0e41701 Content-length: 96 SVN��NE��E�q if (cfg_launchable(cfg)) add_session_to_jumplist(section Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4132fe6dc27819ac7c3119e71e2c826a Text-delta-base-sha1: 4daeb63c93e17bcd54167a78374836d07875284c Text-content-length: 1611 Text-content-md5: 7ba983797e4ab387eea77657f45a211a Text-content-sha1: a31529b5bb79152e15f2b6670c346f357f601d50 Content-length: 1611 SVN����0@�5���/�\ �^|s�LY�?�FHRESULT hrInitialize COM. */ hr = CoInitialize(NULL); if (hr != S_OK && hr != S_FALSE) { char *str = dupprintf("%s Fatal Error", appname); MessageBox(NULL, "Failed to initialize COM subsystem", str, MB_OK | MB_ICONEXCLAMATION); sfree(str); return 1; } words. * These are the old-fashioned but convenient @sessionname and * the internal-use-only &sharedmemoryhandle, neither of which * /* * An initial @ means that the whole of the rest of the * command line should be treated as the name of a saved * session, with _no quoting or escaping_. This makes it a * very convenient means of automated saved-session * launching, via IDM_SAVEDSESS or Windows 7 jump lists. *//* Clean up COM. */ CoUninitialize�g 99�g� */ if (left_alt || (term->app_keypad_keys && !cfg.no_applic_k && cfg.funky_type != FUNKY_XTERM) || cfg.funky_type == FUNKY_VT400 || cfg.nethack_keypad || compose_state) { if ((HIWORD(lParam) & KF_EXTENDED) == 0) { int nParam = 0; switch (wParam) { case VK_INSERT: nParam = VK_NUMPAD0; break; case VK_END: nParam = VK_NUMPAD1; break; case VK_DOWN: nParam = VK_NUMPAD2; break; case VK_NEXT: nParam = VK_NUMPAD3; break; case VK_LEFT: nParam = VK_NUMPAD4; break; case VK_CLEAR: nParam = VK_NUMPAD5; break; case VK_RIGHT: nParam = VK_NUMPAD6; break; case VK_HOME: nParam = VK_NUMPAD7; break Node-path: putty/windows/winjump.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 22205 Text-content-md5: 16712a8a43f8f52fbc4ad387679465b9 Text-content-sha1: 14bee590e94378df71162ce209481b63d9880eb7 Content-length: 22215 PROPS-END SVN���,,,/* * winjump.c: support for Windows 7 jump lists. * * The Windows 7 jumplist is a customizable list defined by the * application. It is persistent across application restarts: the OS * maintains the list when the app is not running. The list is shown * when the user right-clicks on the taskbar button of a running app * or a pinned non-running application. We use the jumplist to * maintain a list of recently started saved sessions, started either * by doubleclicking on a saved session, or with the command line * "-load" parameter. * * Since the jumplist is write-only: it can only be replaced and the * current list cannot be read, we must maintain the contents of the * list persistantly in the registry. The file winstore.h contains * functions to directly manipulate these registry entries. This file * contains higher level functions to manipulate the jumplist. */ #include <assert.h> #include "putty.h" #include "storage.h" #define MAX_JUMPLIST_ITEMS 30 /* PuTTY will never show more items in * the jumplist than this, regardless of * user preferences. */ /* * COM structures and functions. */ #ifndef PROPERTYKEY_DEFINED #define PROPERTYKEY_DEFINED typedef struct _tagpropertykey { GUID fmtid; DWORD pid; } PROPERTYKEY; #endif #ifndef _REFPROPVARIANT_DEFINED #define _REFPROPVARIANT_DEFINED typedef PROPVARIANT *REFPROPVARIANT; #endif #define IID_IShellLink IID_IShellLinkA typedef struct ICustomDestinationListVtbl { HRESULT ( __stdcall *QueryInterface ) ( /* [in] ICustomDestinationList*/ void *This, /* [in] */ const GUID * const riid, /* [out] */ void **ppvObject); ULONG ( __stdcall *AddRef )( /* [in] ICustomDestinationList*/ void *This); ULONG ( __stdcall *Release )( /* [in] ICustomDestinationList*/ void *This); HRESULT ( __stdcall *SetAppID )( /* [in] ICustomDestinationList*/ void *This, /* [string][in] */ LPCWSTR pszAppID); HRESULT ( __stdcall *BeginList )( /* [in] ICustomDestinationList*/ void *This, /* [out] */ UINT *pcMinSlots, /* [in] */ const GUID * const riid, /* [out] */ void **ppv); HRESULT ( __stdcall *AppendCategory )( /* [in] ICustomDestinationList*/ void *This, /* [string][in] */ LPCWSTR pszCategory, /* [in] IObjectArray*/ void *poa); HRESULT ( __stdcall *AppendKnownCategory )( /* [in] ICustomDestinationList*/ void *This, /* [in] KNOWNDESTCATEGORY*/ int category); HRESULT ( __stdcall *AddUserTasks )( /* [in] ICustomDestinationList*/ void *This, /* [in] IObjectArray*/ void *poa); HRESULT ( __stdcall *CommitList )( /* [in] ICustomDestinationList*/ void *This); HRESULT ( __stdcall *GetRemovedDestinations )( /* [in] ICustomDestinationList*/ void *This, /* [in] */ const IID * const riid, /* [out] */ void **ppv); HRESULT ( __stdcall *DeleteList )( /* [in] ICustomDestinationList*/ void *This, /* [string][unique][in] */ LPCWSTR pszAppID); HRESULT ( __stdcall *AbortList )( /* [in] ICustomDestinationList*/ void *This); } ICustomDestinationListVtbl; typedef struct ICustomDestinationList { ICustomDestinationListVtbl *lpVtbl; } ICustomDestinationList; typedef struct IObjectArrayVtbl { HRESULT ( __stdcall *QueryInterface )( /* [in] IObjectArray*/ void *This, /* [in] */ const GUID * const riid, /* [out] */ void **ppvObject); ULONG ( __stdcall *AddRef )( /* [in] IObjectArray*/ void *This); ULONG ( __stdcall *Release )( /* [in] IObjectArray*/ void *This); HRESULT ( __stdcall *GetCount )( /* [in] IObjectArray*/ void *This, /* [out] */ UINT *pcObjects); HRESULT ( __stdcall *GetAt )( /* [in] IObjectArray*/ void *This, /* [in] */ UINT uiIndex, /* [in] */ const GUID * const riid, /* [out] */ void **ppv); } IObjectArrayVtbl; typedef struct IObjectArray { IObjectArrayVtbl *lpVtbl; } IObjectArray; typedef struct IShellLinkVtbl { HRESULT ( __stdcall *QueryInterface )( /* [in] IShellLink*/ void *This, /* [in] */ const GUID * const riid, /* [out] */ void **ppvObject); ULONG ( __stdcall *AddRef )( /* [in] IShellLink*/ void *This); ULONG ( __stdcall *Release )( /* [in] IShellLink*/ void *This); HRESULT ( __stdcall *GetPath )( /* [in] IShellLink*/ void *This, /* [string][out] */ LPSTR pszFile, /* [in] */ int cch, /* [unique][out][in] */ WIN32_FIND_DATAA *pfd, /* [in] */ DWORD fFlags); HRESULT ( __stdcall *GetIDList )( /* [in] IShellLink*/ void *This, /* [out] LPITEMIDLIST*/ void **ppidl); HRESULT ( __stdcall *SetIDList )( /* [in] IShellLink*/ void *This, /* [in] LPITEMIDLIST*/ void *pidl); HRESULT ( __stdcall *GetDescription )( /* [in] IShellLink*/ void *This, /* [string][out] */ LPSTR pszName, /* [in] */ int cch); HRESULT ( __stdcall *SetDescription )( /* [in] IShellLink*/ void *This, /* [string][in] */ LPCSTR pszName); HRESULT ( __stdcall *GetWorkingDirectory )( /* [in] IShellLink*/ void *This, /* [string][out] */ LPSTR pszDir, /* [in] */ int cch); HRESULT ( __stdcall *SetWorkingDirectory )( /* [in] IShellLink*/ void *This, /* [string][in] */ LPCSTR pszDir); HRESULT ( __stdcall *GetArguments )( /* [in] IShellLink*/ void *This, /* [string][out] */ LPSTR pszArgs, /* [in] */ int cch); HRESULT ( __stdcall *SetArguments )( /* [in] IShellLink*/ void *This, /* [string][in] */ LPCSTR pszArgs); HRESULT ( __stdcall *GetHotkey )( /* [in] IShellLink*/ void *This, /* [out] */ WORD *pwHotkey); HRESULT ( __stdcall *SetHotkey )( /* [in] IShellLink*/ void *This, /* [in] */ WORD wHotkey); HRESULT ( __stdcall *GetShowCmd )( /* [in] IShellLink*/ void *This, /* [out] */ int *piShowCmd); HRESULT ( __stdcall *SetShowCmd )( /* [in] IShellLink*/ void *This, /* [in] */ int iShowCmd); HRESULT ( __stdcall *GetIconLocation )( /* [in] IShellLink*/ void *This, /* [string][out] */ LPSTR pszIconPath, /* [in] */ int cch, /* [out] */ int *piIcon); HRESULT ( __stdcall *SetIconLocation )( /* [in] IShellLink*/ void *This, /* [string][in] */ LPCSTR pszIconPath, /* [in] */ int iIcon); HRESULT ( __stdcall *SetRelativePath )( /* [in] IShellLink*/ void *This, /* [string][in] */ LPCSTR pszPathRel, /* [in] */ DWORD dwReserved); HRESULT ( __stdcall *Resolve )( /* [in] IShellLink*/ void *This, /* [unique][in] */ HWND hwnd, /* [in] */ DWORD fFlags); HRESULT ( __stdcall *SetPath )( /* [in] IShellLink*/ void *This, /* [string][in] */ LPCSTR pszFile); } IShellLinkVtbl; typedef struct IShellLink { IShellLinkVtbl *lpVtbl; } IShellLink; typedef struct IObjectCollectionVtbl { HRESULT ( __stdcall *QueryInterface )( /* [in] IShellLink*/ void *This, /* [in] */ const GUID * const riid, /* [out] */ void **ppvObject); ULONG ( __stdcall *AddRef )( /* [in] IShellLink*/ void *This); ULONG ( __stdcall *Release )( /* [in] IShellLink*/ void *This); HRESULT ( __stdcall *GetCount )( /* [in] IShellLink*/ void *This, /* [out] */ UINT *pcObjects); HRESULT ( __stdcall *GetAt )( /* [in] IShellLink*/ void *This, /* [in] */ UINT uiIndex, /* [in] */ const GUID * const riid, /* [iid_is][out] */ void **ppv); HRESULT ( __stdcall *AddObject )( /* [in] IShellLink*/ void *This, /* [in] */ void *punk); HRESULT ( __stdcall *AddFromArray )( /* [in] IShellLink*/ void *This, /* [in] */ IObjectArray *poaSource); HRESULT ( __stdcall *RemoveObjectAt )( /* [in] IShellLink*/ void *This, /* [in] */ UINT uiIndex); HRESULT ( __stdcall *Clear )( /* [in] IShellLink*/ void *This); } IObjectCollectionVtbl; typedef struct IObjectCollection { IObjectCollectionVtbl *lpVtbl; } IObjectCollection; typedef struct IPropertyStoreVtbl { HRESULT ( __stdcall *QueryInterface )( /* [in] IPropertyStore*/ void *This, /* [in] */ const GUID * const riid, /* [iid_is][out] */ void **ppvObject); ULONG ( __stdcall *AddRef )( /* [in] IPropertyStore*/ void *This); ULONG ( __stdcall *Release )( /* [in] IPropertyStore*/ void *This); HRESULT ( __stdcall *GetCount )( /* [in] IPropertyStore*/ void *This, /* [out] */ DWORD *cProps); HRESULT ( __stdcall *GetAt )( /* [in] IPropertyStore*/ void *This, /* [in] */ DWORD iProp, /* [out] */ PROPERTYKEY *pkey); HRESULT ( __stdcall *GetValue )( /* [in] IPropertyStore*/ void *This, /* [in] */ const PROPERTYKEY * const key, /* [out] */ PROPVARIANT *pv); HRESULT ( __stdcall *SetValue )( /* [in] IPropertyStore*/ void *This, /* [in] */ const PROPERTYKEY * const key, /* [in] */ REFPROPVARIANT propvar); HRESULT ( __stdcall *Commit )( /* [in] IPropertyStore*/ void *This); } IPropertyStoreVtbl; typedef struct IPropertyStore { IPropertyStoreVtbl *lpVtbl; } IPropertyStore; static const CLSID CLSID_DestinationList = { 0x77f10cf0, 0x3db5, 0x4966, {0xb5,0x20,0xb7,0xc5,0x4f,0xd3,0x5e,0xd6} }; static const CLSID CLSID_ShellLink = { 0x00021401, 0x0000, 0x0000, {0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} }; static const CLSID CLSID_EnumerableObjectCollection = { 0x2d3468c1, 0x36a7, 0x43b6, {0xac,0x24,0xd3,0xf0,0x2f,0xd9,0x60,0x7a} }; static const IID IID_IObjectCollection = { 0x5632b1a4, 0xe38a, 0x400a, {0x92,0x8a,0xd4,0xcd,0x63,0x23,0x02,0x95} }; static const IID IID_IShellLink = { 0x000214ee, 0x0000, 0x0000, {0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} }; static const IID IID_ICustomDestinationList = { 0x6332debf, 0x87b5, 0x4670, {0x90,0xc0,0x5e,0x57,0xb4,0x08,0xa4,0x9e} }; static const IID IID_IObjectArray = { 0x92ca9dcd, 0x5622, 0x4bba, {0xa8,0x05,0x5e,0x9f,0x54,0x1b,0xd8,0xc9} }; static const IID IID_IPropertyStore = { 0x886d8eeb, 0x8cf2, 0x4446, {0x8d,0x02,0xcd,0xba,0x1d,0xbd,0xcf,0x99} }; static const PROPERTYKEY PKEY_Title = { {0xf29f85e0, 0x4ff9, 0x1068, {0xab,0x91,0x08,0x00,0x2b,0x27,0xb3,0xd9}}, 0x00000002 }; #define COMPTR(type, obj) &IID_##type, ((sizeof((obj)-(type **)(obj))), (obj)) static char putty_path[2048]; /* * Function to make an IShellLink describing a particular PuTTY * command. If 'appname' is null, the command run will be the one * returned by GetModuleFileName, i.e. our own executable; if it's * non-null then it will be assumed to be a filename in the same * directory as our own executable, and the return value will be NULL * if that file doesn't exist. * * If 'sessionname' is null then no command line will be passed to the * program. If it's non-null, the command line will be that text * prefixed with an @ (to load a PuTTY saved session). * * Hence, you can launch a saved session using make_shell_link(NULL, * sessionname), and launch another app using e.g. * make_shell_link("puttygen.exe", NULL). */ static IShellLink *make_shell_link(const char *appname, const char *sessionname) { IShellLink *ret; char *app_path, *param_string, *desc_string; void *psettings_tmp; IPropertyStore *pPS; PROPVARIANT pv; /* Retrieve path to executable. */ if (!putty_path[0]) GetModuleFileName(NULL, putty_path, sizeof(putty_path) - 1); if (appname) { char *p, *q = putty_path; FILE *fp; if ((p = strrchr(q, '\\')) != NULL) q = p+1; if ((p = strrchr(q, ':')) != NULL) q = p+1; app_path = dupprintf("%.*s%s", (int)(q - putty_path), putty_path, appname); if ((fp = fopen(app_path, "r")) == NULL) { sfree(app_path); return NULL; } fclose(fp); } else { app_path = dupstr(putty_path); } /* Check if this is a valid session, otherwise don't add. */ if (sessionname) { psettings_tmp = open_settings_r(sessionname); if (!psettings_tmp) return NULL; close_settings_r(psettings_tmp); } /* Create the new item. */ if (!SUCCEEDED(CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, COMPTR(IShellLink, &ret)))) return NULL; /* Set path, parameters, icon and description. */ ret->lpVtbl->SetPath(ret, app_path); if (sessionname) { param_string = dupcat("@", sessionname, NULL); } else { param_string = dupstr(""); } ret->lpVtbl->SetArguments(ret, param_string); sfree(param_string); if (sessionname) { desc_string = dupcat("Connect to PuTTY session '", sessionname, "'", NULL); } else { assert(appname); desc_string = dupprintf("Run %.*s", strcspn(appname, "."), appname); } ret->lpVtbl->SetDescription(ret, desc_string); sfree(desc_string); ret->lpVtbl->SetIconLocation(ret, app_path, 0); /* To set the link title, we require the property store of the link. */ if (SUCCEEDED(ret->lpVtbl->QueryInterface(ret, COMPTR(IPropertyStore, &pPS)))) { PropVariantInit(&pv); pv.vt = VT_LPSTR; if (sessionname) { pv.pszVal = dupstr(sessionname); } else { assert(appname); pv.pszVal = dupprintf("Run %.*s", strcspn(appname, "."), appname); } pPS->lpVtbl->SetValue(pPS, &PKEY_Title, &pv); sfree(pv.pszVal); pPS->lpVtbl->Commit(pPS); pPS->lpVtbl->Release(pPS); } sfree(app_path); return ret; } /* Updates jumplist from registry. */ static void update_jumplist_from_registry(void) { const char *piterator; UINT num_items; int jumplist_counter; UINT nremoved; /* Variables used by the cleanup code must be initialised to NULL, * so that we don't try to free or release them if they were never * set up. */ ICustomDestinationList *pCDL = NULL; char *pjumplist_reg_entries = NULL; IObjectCollection *collection = NULL; IObjectArray *array = NULL; IShellLink *link = NULL; IObjectArray *pRemoved = NULL; int need_abort = FALSE; /* * Create an ICustomDestinationList: the top-level object which * deals with jump list management. */ if (!SUCCEEDED(CoCreateInstance(&CLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER, COMPTR(ICustomDestinationList, &pCDL)))) goto cleanup; /* * Call its BeginList method to start compiling a list. This gives * us back 'num_items' (a hint derived from systemwide * configuration about how many things to put on the list) and * 'pRemoved' (user configuration about things to leave off the * list). */ if (!SUCCEEDED(pCDL->lpVtbl->BeginList(pCDL, &num_items, COMPTR(IObjectArray, &pRemoved)))) goto cleanup; need_abort = TRUE; if (!SUCCEEDED(pRemoved->lpVtbl->GetCount(pRemoved, &nremoved))) nremoved = 0; /* * Create an object collection to form the 'Recent Sessions' * category on the jump list. */ if (!SUCCEEDED(CoCreateInstance(&CLSID_EnumerableObjectCollection, NULL, CLSCTX_INPROC_SERVER, COMPTR(IObjectCollection, &collection)))) goto cleanup; /* * Go through the jump list entries from the registry and add each * one to the collection. */ pjumplist_reg_entries = get_jumplist_registry_entries(); piterator = pjumplist_reg_entries; jumplist_counter = 0; while (*piterator != '\0' && (jumplist_counter < min(MAX_JUMPLIST_ITEMS, (int) num_items))) { link = make_shell_link(NULL, piterator); if (link) { UINT i; int found; /* * Check that the link isn't in the user-removed list. */ for (i = 0, found = FALSE; i < nremoved && !found; i++) { IShellLink *rlink; if (SUCCEEDED(pRemoved->lpVtbl->GetAt (pRemoved, i, COMPTR(IShellLink, &rlink)))) { char desc1[2048], desc2[2048]; if (SUCCEEDED(link->lpVtbl->GetDescription (link, desc1, sizeof(desc1)-1)) && SUCCEEDED(rlink->lpVtbl->GetDescription (rlink, desc2, sizeof(desc2)-1)) && !strcmp(desc1, desc2)) { found = TRUE; } rlink->lpVtbl->Release(rlink); } } if (!found) { collection->lpVtbl->AddObject(collection, link); jumplist_counter++; } link->lpVtbl->Release(link); link = NULL; } piterator += strlen(piterator) + 1; } sfree(pjumplist_reg_entries); pjumplist_reg_entries = NULL; /* * Get the array form of the collection we've just constructed, * and put it in the jump list. */ if (!SUCCEEDED(collection->lpVtbl->QueryInterface (collection, COMPTR(IObjectArray, &array)))) goto cleanup; pCDL->lpVtbl->AppendCategory(pCDL, L"Recent Sessions", array); /* * Create an object collection to form the 'Tasks' category on the * jump list. */ if (!SUCCEEDED(CoCreateInstance(&CLSID_EnumerableObjectCollection, NULL, CLSCTX_INPROC_SERVER, COMPTR(IObjectCollection, &collection)))) goto cleanup; /* * Add task entries for PuTTYgen and Pageant. */ piterator = "Pageant.exe\0PuTTYgen.exe\0\0"; while (*piterator != '\0') { link = make_shell_link(piterator, NULL); if (link) { collection->lpVtbl->AddObject(collection, link); link->lpVtbl->Release(link); link = NULL; } piterator += strlen(piterator) + 1; } /* * Get the array form of the collection we've just constructed, * and put it in the jump list. */ if (!SUCCEEDED(collection->lpVtbl->QueryInterface (collection, COMPTR(IObjectArray, &array)))) goto cleanup; pCDL->lpVtbl->AddUserTasks(pCDL, array); /* * Now we can clean up the array and collection variables, so as * to be able to reuse them. */ array->lpVtbl->Release(array); array = NULL; collection->lpVtbl->Release(collection); collection = NULL; /* * Create another object collection to form the user tasks * category. */ if (!SUCCEEDED(CoCreateInstance(&CLSID_EnumerableObjectCollection, NULL, CLSCTX_INPROC_SERVER, COMPTR(IObjectCollection, &collection)))) goto cleanup; /* * Get the array form of the collection we've just constructed, * and put it in the jump list. */ if (!SUCCEEDED(collection->lpVtbl->QueryInterface (collection, COMPTR(IObjectArray, &array)))) goto cleanup; pCDL->lpVtbl->AddUserTasks(pCDL, array); /* * Now we can clean up the array and collection variables, so as * to be able to reuse them. */ array->lpVtbl->Release(array); array = NULL; collection->lpVtbl->Release(collection); collection = NULL; /* * Commit the jump list. */ pCDL->lpVtbl->CommitList(pCDL); need_abort = FALSE; /* * Clean up. */ cleanup: if (pRemoved) pRemoved->lpVtbl->Release(pRemoved); if (pCDL && need_abort) pCDL->lpVtbl->AbortList(pCDL); if (pCDL) pCDL->lpVtbl->Release(pCDL); if (collection) collection->lpVtbl->Release(collection); if (array) array->lpVtbl->Release(array); if (link) link->lpVtbl->Release(link); sfree(pjumplist_reg_entries); } /* Clears the entire jumplist. */ static void clear_jumplist(void) { ICustomDestinationList *pCDL; UINT num_items; IObjectArray *pRemoved; if (CoCreateInstance(&CLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER, COMPTR(ICustomDestinationList, &pCDL)) == S_OK) { pCDL->lpVtbl->DeleteList(pCDL, NULL); pCDL->lpVtbl->Release(pCDL); } } /* Adds a saved session to the Windows 7 jumplist. */ void add_session_to_jumplist(const char * const sessionname) { if ((osVersion.dwMajorVersion < 6) || (osVersion.dwMajorVersion == 6 && osVersion.dwMinorVersion < 1)) return; /* do nothing on pre-Win7 systems */ if (add_to_jumplist_registry(sessionname) == JUMPLISTREG_OK) { update_jumplist_from_registry(); } else { /* Make sure we don't leave the jumplist dangling. */ clear_jumplist(); } } /* Removes a saved session from the Windows jumplist. */ void remove_session_from_jumplist(const char * const sessionname) { if ((osVersion.dwMajorVersion < 6) || (osVersion.dwMajorVersion == 6 && osVersion.dwMinorVersion < 1)) return; /* do nothing on pre-Win7 systems */ if (remove_from_jumplist_registry(sessionname) == JUMPLISTREG_OK) { update_jumplist_from_registry(); } else { /* Make sure we don't leave the jumplist dangling. */ clear_jumplist(); } } Node-path: putty/windows/winnojmp.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 262 Text-content-md5: dd964b67826c62e6ffe5bce9fd072a26 Text-content-sha1: 6452fc76328a11436f08396f22db129ba39bf19f Content-length: 272 PROPS-END SVN���xxx/* * winnojmp.c: stub jump list functions for Windows executables that * don't update the jump list. */ void add_session_to_jumplist(const char * const sessionname) {} void remove_session_from_jumplist(const char * const sessionname) {} Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a139cda94f7eb75483065d97afac4c4e Text-delta-base-sha1: a6d1d1902f1074774738f1b22d8d6f41c6577776 Text-content-length: 5753 Text-content-md5: 2cdd7799bda3055292cc8e9e72ad1610 Text-content-sha1: 334fd05f7fa745e1183b34ad1b4ac2b38ba89156 Content-length: 5753 SVN��R�s�o�tY�cJ6�y#reg_jumplist_key = PUTTY_REG_POS "\\Jumplist"; static const char *const reg_jumplist_value = "Recent sessions"; remove_session_from_jumplist(sessionnameInternal function supporting the jump list registry code. All the * functions to add, remove and read the list have substantially * similar content, so this is a generalisation of all of them which * transforms the list in the registry by prepending 'add' (if * non-null), removing 'rem' from what's left (if non-null), and * returning the resulting concatenated list of strings in 'out' (if * non-null). */ static int transform_jumplist_registry (const char *add, const char *rem, char **out) { int ret; HKEY pjumplist_key, psettings_tmp; DWORD type; int value_length; char *old_value, *new_value; char *piterator_old, *piterator_new, *piterator_tmp; ret = RegCreateKeyEx(HKEY_CURRENT_USER, reg_jumplist_key, 0, NULL, REG_OPTION_NON_VOLATILE, (KEY_READ | KEY_WRITE), NULL, &pjumplist_key, NULL); if (ret != ERROR_SUCCESS) { return JUMPLISTREG_ERROR_KEYOPENCREATE_FAILURE; } /* Get current list of saved sessions in the registry. */ value_length = 200; old_value = snewn(value_length, char); ret = RegQueryValueEx(pjumplist_key, reg_jumplist_value, NULL, &type, old_value, &value_length); /* When the passed buffer is too small, ERROR_MORE_DATA is * returned and the required size is returned in the length * argument. */ if (ret == ERROR_MORE_DATA) { sfree(old_value); old_value = snewn(value_length, char); ret = RegQueryValueEx(pjumplist_key, reg_jumplist_value, NULL, &type, old_value, &value_length); } if (ret == ERROR_FILE_NOT_FOUND) { /* Value doesn't exist yet. Start from an empty value. */ *old_value = '\0'; *(old_value + 1) = '\0'; } else if (ret != ERROR_SUCCESS) { /* Some non-recoverable error occurred. */ sfree(old_value); RegCloseKey(pjumplist_key); return JUMPLISTREG_ERROR_VALUEREAD_FAILURE; } else if (type != REG_MULTI_SZ) { /* The value present in the registry has the wrong type: we * try to delete it and start from an empty value. */ ret = RegDeleteValue(pjumplist_key, reg_jumplist_value); if (ret != ERROR_SUCCESS) { sfree(old_value); RegCloseKey(pjumplist_key); return JUMPLISTREG_ERROR_VALUEREAD_FAILURE; } *old_value = '\0'; *(old_value + 1) = '\0'; } /* Check validity of registry data: REG_MULTI_SZ value must end * with \0\0. */ piterator_tmp = old_value; while (((piterator_tmp - old_value) < (value_length - 1)) && !(*piterator_tmp == '\0' && *(piterator_tmp+1) == '\0')) { ++piterator_tmp; } if ((piterator_tmp - old_value) >= (value_length-1)) { /* Invalid value. Start from an empty value. */ *old_value = '\0'; *(old_value + 1) = '\0'; } /* * Modify the list, if we're modifying. */ if (add || rem) { /* Walk through the existing list and construct the new list of * saved sessions. */ new_value = snewn(value_length + (add ? strlen(add) + 1 : 0), char); piterator_new = new_value; piterator_old = old_value; /* First add the new item to the beginning of the list. */ if (add) { strcpy(piterator_new, add); piterator_new += strlen(piterator_new) + 1; } /* Now add the existing list, taking care to leave out the removed * item, if it was already in the existing list. */ while (*piterator_old != '\0') { if (!rem || strcmp(piterator_old, rem) != 0) { /* Check if this is a valid session, otherwise don't add. */ psettings_tmp = open_settings_r(piterator_old); if (psettings_tmp != NULL) { close_settings_r(psettings_tmp); strcpy(piterator_new, piterator_old); piterator_new += strlen(piterator_new) + 1; } } piterator_old += strlen(piterator_old) + 1; } *piterator_new = '\0'; ++piterator_new; /* Save the new list to the registry. */ ret = RegSetValueEx(pjumplist_key, reg_jumplist_value, 0, REG_MULTI_SZ, new_value, piterator_new - new_value); old_value = new_value; sfree(new_value); } else ret = ERROR_SUCCESS; /* * Either return or free the result. */ if (out) *out = old_value; else sfree(old_value); /* Clean up and return. */ RegCloseKey(pjumplist_key); if (ret != ERROR_SUCCESS) { return JUMPLISTREG_ERROR_VALUEWRITE_FAILURE; } else { return JUMPLISTREG_OK; } } /* Adds a new entry to the jumplist entries in the registry. */ int add_to_jumplist_registry(const char *item) { return transform_jumplist_registry(item, item, NULL); } /* Removes an item from the jumplist entries in the registry. */ int remove_from_jumplist_registry(const char *item) { return transform_jumplist_registry(NULL, item, NULL); } /* Returns the jumplist entries from the registry. Caller must free * the returned pointer. */ char *get_jumplist_registry_entries (void) { char *list_value; if (transform_jumplist_registry(NULL,NULL,&list_value) != ERROR_SUCCESS) { list_value = snewn(2, char); *list_value = '\0'; *(list_value + 1) = '\0'; } return list_value; Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e4ff9899ffa476c751ad9d1ededf9099 Text-delta-base-sha1: a85f059570753d15251831f0544ae28c22b90011 Text-content-length: 1482 Text-content-md5: 59f8d8c4a319ea8c0ecb2140214877ba Text-content-sha1: f8eff47d2760154ce336ae17c9405ab0b118ba8f Content-length: 1482 SVN��9.� �8� v/* Result values for the jumplist registry functions. */ #define JUMPLISTREG_OK 0 #define JUMPLISTREG_ERROR_INVALID_PARAMETER 1 #define JUMPLISTREG_ERROR_KEYOPENCREATE_FAILURE 2 #define JUMPLISTREG_ERROR_VALUEREAD_FAILURE 3 #define JUMPLISTREG_ERROR_VALUEWRITE_FAILURE 4 #define JUMPLISTREG_ERROR_INVALID_VALUE 5/* * Exports from winjump.c. */ #define JUMPLIST_SUPPORTED /* suppress #defines in putty.h */ void add_session_to_jumplist(const char * const sessionname); void remove_session_from_jumplist(const char * const sessionname); /* * Extra functions in winstore.c over and above the interface in * storage.h. * * These functions manipulate the Registry section which mirrors the * current Windows 7 jump list. (Because the real jump list storage is * write-only, we need to keep another copy of whatever we put in it, * so that we can put in a slightly modified version the next time.) */ /* Adds a saved session to the registry jump list mirror. 'item' is a * string naming a saved session. */ int add_to_jumplist_registry(const char *item); /* Removes an item from the registry jump list mirror. */ int remove_from_jumplist_registry(const char *item); /* Returns the current jump list entries from the registry. Caller * must free the returned pointer, which points to a contiguous * sequence of NUL-terminated strings in memory, terminated with an * empty one. */ char *get_jumplist_registry_entries(void); #endif Revision-number: 9047 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2010-12-23T22:19:13.364876Z K 7 svn:log V 81 Document the behaviour of Alt in the "hybrid" resizing mode alluded to in r9045. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f585669c1acbe2ff1d5566d28af60bf Text-delta-base-sha1: 21c3b889d7ecfd2c3883dfe69086a358e23f2777 Text-content-length: 239 Text-content-md5: 4f12d8af34ae87707473d512095aee88 Text-content-sha1: b03c7dfd6d2307da860a015cb13baafde3e4b9e6 Content-length: 239 SVN����a��a� (In this mode, holding down the Alt key while resizing will also cause the font size to change.)�saa��bled then the connection should in principle survive (in the absence of interfering \i{firewalls} Revision-number: 9048 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 Claim this as fixed. K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-12-23T22:32:53.623205Z PROPS-END Node-path: putty-wishlist/data/win7-jumplists Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e82177d896e5b1542388658edd3b3334 Text-delta-base-sha1: f2da3f47bd79dd4d9ba8d613596ad016dd0cb8c1 Text-content-length: 549 Text-content-md5: 9c9b73d564692d26aed285f6504feb6f Text-content-sha1: 654e83fb4d7216775795b8dd31a30cfef970a713 Content-length: 549 SVN��JO�W��pV�CiFixed-in: r9046 2010-12-24p> The main reason we haven't got around to this is that it involves farting around with COM. We'd need a way of doing this that doesn't rely on C++ or anything else that will compromise our source-level portability; patches meeting this criterion are more likely to be accepted. (It should go without saying that it mustn't compromise ability to run on older versions of Windows either.)(bugfix to this submitted by someone else as 4BD8DDAA.9040409@gmail.com, not online unfortunately) </ul> Revision-number: 9049 Prop-content-length: 284 Content-length: 284 K 8 svn:date V 27 2010-12-26T18:29:53.430151Z K 7 svn:log V 183 Optionally define PropVariantInit() locally to restore ability to build with MinGW after r9046, and munge the COMPTR() macro to remove a couple of warnings with my MinGW GCC (3.4.5). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winjump.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 16712a8a43f8f52fbc4ad387679465b9 Text-delta-base-sha1: 14bee590e94378df71162ce209481b63d9880eb7 Text-content-length: 575 Text-content-md5: d2449cebc488ddca506ad3b235fb99f0 Text-content-sha1: 1232a89a987b4c76156f04d9b6ebe82ed90431f9 Content-length: 575 SVN��,��+�+r�/* MinGW doesn't define this yet: */ #ifndef _PROPVARIANTINIT_DEFINED_ #define _PROPVARIANTINIT_DEFINED_ #define PropVariantInit(pvar) memset((pvar),0,sizeof(PROPVARIANT))/* Type-checking macro to provide arguments for CoCreateInstance() etc. * The pointer arithmetic is a compile-time pointer type check that 'obj' * really is a 'type **', but is intended to have no effect at runtime. */ #define COMPTR(type, obj) &IID_##type, \ (void **)(void *)((obj) + (sizeof((obj)-(type **)(obj))) \ - (sizeof((obj)-(type **)(obj)) Revision-number: 9050 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2010-12-26T20:00:45.034852Z K 7 svn:log V 40 Try to delete jump lists in "-cleanup". K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winjump.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d2449cebc488ddca506ad3b235fb99f0 Text-delta-base-sha1: 1232a89a987b4c76156f04d9b6ebe82ed90431f9 Text-content-length: 24 Text-content-md5: 1ef582d879188189a129d02720833173 Text-content-sha1: ddabe07d3b2675f1b31f721ee739891a61f5f4ec Content-length: 24 SVN��~ ��p��w Node-path: putty/windows/winnojmp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd964b67826c62e6ffe5bce9fd072a26 Text-delta-base-sha1: 6452fc76328a11436f08396f22db129ba39bf19f Text-content-length: 46 Text-content-md5: ca145c02dc623206ed13a8e34064ee80 Text-content-sha1: 01fe503d9dd62bb7947f7f95bfc558333fe956f6 Content-length: 46 SVN��x�x�void clear_jumplist(void) {} Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2cdd7799bda3055292cc8e9e72ad1610 Text-delta-base-sha1: 334fd05f7fa745e1183b34ad1b4ac2b38ba89156 Text-content-length: 152 Text-content-md5: 450ca273c37fc85a21a649bcfabb057e Text-content-sha1: d19a6e8ca376c74197217c1b2d0818fe7b7cd3f3 Content-length: 152 SVN��b ~��~�JKAsk Windows to delete any jump list information associated * with this installation of PuTTY. */ clear_jumplist( Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 59f8d8c4a319ea8c0ecb2140214877ba Text-delta-base-sha1: f8eff47d2760154ce336ae17c9405ab0b118ba8f Text-content-length: 49 Text-content-md5: 5dd8b08ca98a92ac5fbc8f5404859952 Text-content-sha1: adfe3746495b9029b45d6fa7e30e90170a5720c1 Content-length: 49 SVN��9T �0�� -void clear_jumplist(void Revision-number: 9051 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2010-12-26T20:11:34.627208Z K 7 svn:log V 55 Mention the name "simple@putty.projects.tartarus.org". K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/flow-control-filexfer Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c029bbf28306a71cf30a90ed3feeef80 Text-delta-base-sha1: 184809be5ed965cf83d04b8b5bc747f71235ce46 Text-content-length: 138 Text-content-md5: 7320f0f2b88aea93584a5970b4d0f514 Text-content-sha1: d97674c4236e954cba1f31390626992efe90260b Content-length: 138 SVN��&y�%�y (We're not aware that any server yet takes any notice of our <tt>simple@putty.projects.tartarus.org</tt> hint, though.) Revision-number: 9052 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2010-12-26T20:15:15.152129Z K 7 svn:log V 38 ...and add a link to its description. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/flow-control-filexfer Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7320f0f2b88aea93584a5970b4d0f514 Text-delta-base-sha1: d97674c4236e954cba1f31390626992efe90260b Text-content-length: 174 Text-content-md5: 09633178f1ada3ee757a620dd5fb6265 Text-content-sha1: 2fbea702091d282c0a35f7ec4ec32744d1d7f47f Content-length: 174 SVN���d�a href="http://tartarus.org/~simon/putty-snapshots/htmldoc/AppendixF.html#sshnames-channel"><tt>simple@putty.projects.tartarus.org</tt></a> hint, though.) Revision-number: 9053 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2010-12-26T23:23:11.030068Z K 7 svn:log V 37 Remove a couple of unused variables. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winjump.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ef582d879188189a129d02720833173 Text-delta-base-sha1: ddabe07d3b2675f1b31f721ee739891a61f5f4ec Text-content-length: 24 Text-content-md5: af57c7eb2dfed39732b837fddeea959b Text-content-sha1: 27b1476c8aeea8bcfffa718834af9f2295a8d9ab Content-length: 24 SVN��~N ��.�� ^ Revision-number: 9054 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2010-12-27T00:24:48.855966Z K 7 svn:log V 52 Fix up svn:eol-style and svn:keywords on new files. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/winjump.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Content-length: 87 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END Node-path: putty/windows/winnojmp.c Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 87 Text-delta: true Text-delta-base-md5: ca145c02dc623206ed13a8e34064ee80 Text-delta-base-sha1: 01fe503d9dd62bb7947f7f95bfc558333fe956f6 Text-content-length: 285 Text-content-md5: c2684a2e439359eb586d1e14901467d9 Text-content-sha1: c0fc078ab9193de14845862ca37bfb2fed138095 Content-length: 372 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN��/* * winnojmp.c: stub jump list functions for Windows executables that * don't update the jump list. */ void add_session_to_jumplist(const char * const sessionname) {} void remove_session_from_jumplist(const char * const sessionname) {} void clear_jumplist(void) {} Revision-number: 9055 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 40 Add an option to disable SSH-2 banners. K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-12-27T01:19:13.987761Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc4e2ef816c404307908fbf0c683dfc9 Text-delta-base-sha1: 7f5a3753caf209b2735692d120e971d627190876 Text-content-length: 204 Text-content-md5: fee891a94b7e133ec72bc5f1e32699ec Text-content-sha1: 2a981e3834054224aa27d10339eb220f62f0a2b6 Content-length: 204 SVN��`0�~�0�gy ctrl_checkbox(s, "Display pre-authentication banner (SSH-2 only)", 'd', HELPCTX(ssh_auth_banner), dlg_stdcheckbox_handler, I(offsetof(Config,ssh_show_banner Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f12d8af34ae87707473d512095aee88 Text-delta-base-sha1: b03c7dfd6d2307da860a015cb13baafde3e4b9e6 Text-content-length: 661 Text-content-md5: 3edf2515dfa67a3985dd6112d1c64bd9 Text-content-sha1: 2ff4d7c7f0a40f495c2580035a136e53c16e9e28 Content-length: 661 SVN���������sn j�-�j�Wbanner} \q{Display pre-authentication banner} \cfg{winhelp-topic}{ssh.auth.banner} SSH-2 servers can provide a message for clients to display to the prospective user before the user logs in; this is sometimes known as a pre-authentication \q{\i{banner}}. Typically this is used to provide information about the server and legal notices. By default, PuTTY displays this message before prompting for a password or similar credentials (although, unfortunately, not before prompting for a login name, due to the nature of the protocol design). By unchecking this option, display of the banner can be suppressed entirely Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 304d2090eef700353f9ce4150096f073 Text-delta-base-sha1: 334cb2c3437eee1e6554a22ff8578e103a9c59c0 Text-content-length: 72 Text-content-md5: 88930ce17d9fc340ec400a255770bda6 Text-content-sha1: 0e28f519985d45b754a18935df4e6a0de57fc5db Content-length: 72 SVN��a 0�F��k-ssh_show_banner; /* show USERAUTH_BANNERs Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7a5013230386c896f233af8a9bc933cd Text-delta-base-sha1: 388901ec3ad441904246bc716c17f706e0e41701 Text-content-length: 98 Text-content-md5: 2e75b5ec909b542b3c39f6048ad6ee60 Text-content-sha1: e393edd1247a7668909721276481317e667bb905 Content-length: 98 SVN��NID�Q��X0�\rSshBanner", cfg->ssh_show_bannerSshBanner", 1, &cfg->ssh_show_banner Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3d222bfbac135b8c7e2745234dac6bdd Text-delta-base-sha1: 442b9afece568451e99650a502598aea183ac9d0 Text-content-length: 126 Text-content-md5: f196471d605223ba43f749845ec3bb26 Text-content-sha1: 3eefcfd285b5b86b04f03917336863e747aced36 Content-length: 126 SVN����������������^@� �� �{#, * if we're going to display themssh->cfg.ssh_show_banner && Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 01ca8cdab389f7efd4ede6fe56be9469 Text-delta-base-sha1: 347fcf5b96a7ebba2f948c644ae900093e8b9ba3 Text-content-length: 62 Text-content-md5: 48244a14372b2bc73002926c59550a2b Text-content-sha1: e353661438a45ca3a623f77258c3b2bfb4ceb39e Content-length: 62 SVN��= )�m��oNbanner "ssh.auth.banner:config-ssh-banner Revision-number: 9056 Prop-content-length: 877 Content-length: 877 K 7 svn:log V 776 Fix resize handling when enabling and disabling full-screen mode. I'm not sure whether I broke this in the recent revamp or whether it was always broken, but: transitions in and out of full-screen mode work by first maximising or restoring the window, which triggers a WM_SIZE, whose handler then fiddles with the window style to disable or re-enable all the furniture, which in turn triggers a recursive WM_SIZE. The trouble is, after returning from the handler for the inner WM_SIZE, the rest of the outer handler runs, and its client area size is now out of date. So I've added a flag which is set when a resize is handled 'properly', so that after returning from the inner WM_SIZE handler the outer one knows not to try to redo badly work that's already been done well. K 10 svn:author V 5 simon K 8 svn:date V 27 2010-12-27T12:58:39.445810Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7ba983797e4ab387eea77657f45a211a Text-delta-base-sha1: a31529b5bb79152e15f2b6670c346f357f601d50 Text-content-length: 1790 Text-content-md5: 9fa6be5f936530529b4b879c6cf753d2 Text-content-sha1: 50c36cf2e81301a66c307507ae276bcf8afeb8de Content-length: 1790 SVN����s�X��C'�kw8�7int processed_resize { processed_resize = FALSE; clear_full_screen(); if (processed_resize) { /* * Inhibit normal processing of this WM_SIZE; a * secondary one was triggered just now by * clear_full_screen which contained the correct * client area size. */ return 0; } }processed_resize = FALSE; make_full_screen(); if (processed_resize) { /* * Inhibit normal processing of this WM_SIZE; a * secondary one was triggered just now by * make_full_screen which contained the correct client * area size. */ return 0; } } processed_resize = TRUE;� jJJ� �DED | 0xFF)); shift_state = ((keystate[VK_SHIFT] & 0x80) != 0) + ((keystate[VK_CONTROL] & 0x80) != 0) * 2; /* Note if AltGr was pressed and if it was used as a compose key */ if (!compose_state) { compose_key = 0x100; if (cfg.compose_key) { if (wParam == VK_MENU && (HIWORD(lParam) & KF_EXTENDED)) compose_key = wParam; } if (wParam == VK_APPS) compose_key = wParam; } if (wParam == compose_key) { if (compose_state == 0 && (HIWORD(lParam) & (KF_UP | KF_REPEAT)) == 0) compose_state = 1; else if (compose_state == 1 && (HIWORD(lParam) & KF_UP)) compose_state = 2; else compose_state = 0; } else if (compose_state == 1 && wParam != VK_CONTROL) compose_state = 0; if (compose_state > 1 && left_alt) compose_state = 0; /* Sanitize the number pad if not using a PC NumPad Revision-number: 9057 Prop-content-length: 157 Content-length: 157 K 8 svn:date V 27 2010-12-27T17:43:38.126820Z K 7 svn:log V 57 Document what the relevant assertion failure looks like. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/short-rsa2-key-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c8e5d129ad9e3150f621f5659dbb7a3 Text-delta-base-sha1: 3e5dca5ea3852904a19554800dd7b94d07360273 Text-content-length: 259 Text-content-md5: 9f5f43cd1a47908be889259d0f14e446 Text-content-sha1: 219cd65e156ab612289c43f94de61cd152896e38 Content-length: 259 SVN��VA k�A�k�A The signature of the assertion failure looks something like this: Assertion failed! Program: putty.exe File: ..\sshrsa.c Line: 793 Expression: 1 <= nbytes - 20 - ASN1_LEN Revision-number: 9058 Prop-content-length: 260 Content-length: 260 K 8 svn:date V 27 2010-12-28T00:39:37.891979Z K 7 svn:log V 159 Summary: Unclean close on Vista/Windows 7 leads to CPU-bound hang Class: bug Finally add an entry for this problem that people have been reporting for years. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unclean-close-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e6285a234cf270675fd9035047704112 Text-delta-base-sha1: 9eb3ffee43aa2a7a44393b2b49e56ecff75fbd63 Text-content-length: 216 Text-content-md5: e8ddf3ae698a8cdd17d49cba193dc2dd Text-content-sha1: 8378d87a4fb9367173c3f709069704cbbcdfd003 Content-length: 216 SVN��/v @�]�@�YVSee also <a href="unclean-close-hang.html">unclean-close-hang</a>, which seems more or less specific to Windows Vista and Windows 7, and definitely doesn't require port forwarding to be active Node-path: putty-wishlist/data/unclean-close-hang Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 4299 Text-content-md5: 6eea135d8ac3cf1fca8f565c7a4c33e8 Text-content-sha1: 2933590dac56c7ea2a55cde6c9aa98d62166d07a Content-length: 4309 PROPS-END SVN���===Summary: Unclean close on Vista/Windows 7 leads to CPU-bound hang Class: bug Present-in: 0.59 0.60 2008-07-02 2008-12-15 2009-01-28 2009-11-17 2010-05-24 2010-07-28 2010-09-20 Content-type: text/x-html-body <p> We've had numerous reports that if a PuTTY session on Windows Vista or Windows 7 closes with a network error -- for instance, "Connection timed out" at startup, or "Software caused connection abort" in an established session -- then after hitting OK, and after the window title has changed to "PuTTY (inactive)", the PuTTY window becomes unresponsive, and the PuTTY process consumes a lot of CPU, and must be killed via Task Manager. <p> This apparently happens with PuTTY's default setting of "Close window on exit": "Only on clean exit". Changing this to "Always" is reported to avoid the problem. <p> Unfortunately, while this is readily reproducible for sufferers, none of the development team who have tried it on a variety of Vista and Win7 systems have managed to reproduce the problem. <p> Intriguingly, some of the reports hint that dwm.exe -- Windows' Desktop Window Manager -- also consumes significant CPU until PuTTY is killed. One report appears to sayS that stopping the 'uxsms' service ("Desktop Window Manager Session Manager") made the problem go away, but that probably isn't a good idea as a workaround. (On this developer's machine at least, that service is running and I still can't reproduce it.) <p> There are also a couple of reports of very similar behaviour on XP, but nowhere near as many as Vista / Windows 7. It could be that this is a manifestation of <a href="unclean-close-crash.html">unclean-close-crash</a> that's just particularly reproducible on the new versions of Windows. <p> (Note that we did fix another Vista-specific CPU-bound hang in r8030, after 0.60 was released, but that was specific to processing of disconnection messages sent by SSH servers -- for instance after entering an incorrect password too many times -- and can't be implicated in these instances of network errors.) <p> Reports on Vista and Windows 7: <ul> <li><tt>4802EEDB.7050908@gmail.com</tt> <br>Vista SP1; hints of RAM munching also </li> <li><tt>42453A7809FE8F4F99CD7697CEF964CD0E0816964C@hpserver-exch.gadellnet.local</tt> <br>Vista SP1; PuTTY 0.60 </li> <li><tt>f685e3ca0807272327r19c24587t722e9278063dd845@mail.gmail.com</tt> <br>Vista 32-bit; PuTTY 0.60; dwm.exe also taking lots of CPU </li> <li><tt>Pine.LNX.4.64.0805122143270.20049@mulva.they.org</tt> <br>Vista Home Premium; PuTTY 0.60, 2008-07-02 </li> <li><tt>D1598C2AF60F433E85E85BC86938AB71@blue</tt> <br>Vista Home Premium; PuTTY 0.60 </li> <li><tt>21aed3f90812142037y224ebb9fw71737392bc6517cd@mail.gmail.com</tt> <br>Vista Home Premium SP1; PuTTY 0.59, 0.60, 2008-12-15 </li> <li><tt>4980A115.50709@gmail.com</tt> <br>Vista; PuTTY 0.60, 2009-01-28; explorer.exe also taking lots of CPU </li> <li><tt>283365400AEE054DA4089467FDA6C78B09643568@PTEEXB02.mtsallstream.com</tt> <br>Vista 64-bit </li> <li><tt>44c111ef0911171632r7d515cd9r72bf83ba1e9a3af4@mail.gmail.com</tt> <br>Vista 32/64-bit and Windows 7 64-bit (but not XP 32-bit) <br>PuTTY 0.59, 0.60, 2009-11-17 </li> <li><tt>CA6A6D14F091ED4B9BAED858B52EE9950132158F@mail0.niksoftware.loc</tt> <br>Windows 7 64-bit <li><tt>AANLkTik4o6rvjnu0RHC5U_G0g8GuyvcUq0PDmXJNH5tS@mail.gmail.com</tt> <br>Windows 7 64-bit; PuTTY 2010-05-24, 2010-07-28 </li> <li><tt>SNT138-w35C7A1ABCA375AA953BC9B82840@phx.gbl</tt> <br>Windows 7 </li> <li><tt>AANLkTinrDMEJSBiTy3pXg6mr_Fd+R81O8eVgwaNsDx4J@mail.gmail.com</tt> <br>Windows 7; PuTTY 0.60, 2010-09-20 </li> <li><a href="http://social.technet.microsoft.com/Forums/en/w7itproappcompat/thread/8c007fbb-fd34-471b-890d-73405bde72e7">Windows Client TechCenter</a> <br>Windows 7 Pro 32-bit; PuTTY 0.60; using Aero <br>Reported to make the taskbar unresponsive too <br>Stopping the 'uxsms' service (Desktop Window Manager Session Manager) is reported to stop the problem </li> </ul> <p> Other reports that don't fit the pattern in some way: <ul> <li><tt>003901c77dd0$44baf080$0100a8c0@cgusa</tt> <br><b>XP SP2</b>; PuTTY 0.59, 2007-04-13 </li> <li><tt>98D6DBD179F61A46AF5C064829A832A0023BD076E5@erebus.totalmanaged.com</tt> <br><b>XP 32-bit</b>; PuTTY 0.59, 0.60, 2008-07-01 </li> </ul> Revision-number: 9059 Prop-content-length: 133 Content-length: 133 K 7 svn:log V 33 Inevitable post-checking tweaks. K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-12-28T00:42:50.297550Z PROPS-END Node-path: putty-wishlist/data/unclean-close-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6eea135d8ac3cf1fca8f565c7a4c33e8 Text-delta-base-sha1: 2933590dac56c7ea2a55cde6c9aa98d62166d07a Text-content-length: 37 Text-content-md5: 2dd4867a2b6791b37713b38c5fa1022a Text-content-sha1: a6b128ef31f5e645d6345cbc5f7f51377a893512 Content-length: 37 SVN��=E ���x�%the problem Revision-number: 9060 Prop-content-length: 250 Content-length: 250 K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-12-29T00:11:32.338577Z K 7 svn:log V 149 Summary: Serial backend on Windows hangs on simultaneous input/output Fixed-in: r8410 2009-01-13 Creating a wishlist item for a bug fixed long ago. PROPS-END Node-path: putty-wishlist/data/win-serial-hang Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 464 Text-content-md5: e6c0dc7a915e1ebdc1069b557714fbf0 Text-content-sha1: 60337f5d0fa517f1e9169dc6602da82248574264 Content-length: 474 PROPS-END SVN���BBBSummary: Serial backend on Windows hangs on simultaneous input/output Class: bug Present-in: 0.60 Fixed-in: r8410 2009-01-13 Content-type: text/x-html-body <p> PuTTY 0.60 for Windows can lock up when using the serial backend and there is simultaneous input and output. <p> For instance, doing <tt>more /var/adm/messages</tt> to a Unix system and pressing and holding 'j' to scroll is reported to be sufficient to cause the session to lock up. Revision-number: 9061 Prop-content-length: 154 Content-length: 154 K 8 svn:date V 27 2010-12-29T11:57:04.848394Z K 7 svn:log V 54 Thou shalt not suffer a misplaced apostrophe to live. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9fa6be5f936530529b4b879c6cf753d2 Text-delta-base-sha1: 50c36cf2e81301a66c307507ae276bcf8afeb8de Text-content-length: 42 Text-content-md5: f78b38ffd8f7b0b45a67e4ad8d6026b1 Text-content-sha1: 0229d45b7812569d2fdd39dda7a66632ae7e8750 Content-length: 42 SVN���� �;��D<D�ji��i Revision-number: 9062 Prop-content-length: 261 Content-length: 261 K 8 svn:date V 27 2010-12-29T13:35:44.588142Z K 7 svn:log V 160 Vyacheslav Andrejev points out a heap management goof in the new jump list code. Free the old value of the pointer variable we just overwrote, not the new one! K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 450ca273c37fc85a21a649bcfabb057e Text-delta-base-sha1: d19a6e8ca376c74197217c1b2d0818fe7b7cd3f3 Text-content-length: 72 Text-content-md5: 1577bd897e2e79c603f0782548966558 Text-content-sha1: d6b71a7335b17d43257fb63c0b98377c91f1fca5 Content-length: 72 SVN��bb /�(�� Wsfree(old_value); old_value = new_value Revision-number: 9063 Prop-content-length: 1152 Content-length: 1152 K 8 svn:date V 27 2010-12-29T14:11:25.687037Z K 7 svn:log V 1050 Support for using variable-pitch fonts for the terminal on Windows. Done in much the same way as it is in the GTK front end: the character cell width is determined using the font's digits (which seems to give generally not-too-offensive spacing in most cases, at the expense of Ms and Ws typically overhanging a bit into adjacent cells) and each character is centred in its cell. Overhangs never leave permanent droppings on the window, because the existing work done in r5003 handles them just fine even in this stressful scenario. There's a hacky new checkbox in the Appearance panel to make variable-pitch fonts appear in the font selector (they still don't by default, because I still think it's _usually_ not What You Want); the checkbox state is not actually stored as part of a saved session, but it should be automatically ticked when reloading a session that's got a variable pitch font selected. (I'm half-expecting a potential flurry of requests for this feature in the wake of http://xkcd.com/840/ , so I thought I'd pre-empt them :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3edf2515dfa67a3985dd6112d1c64bd9 Text-delta-base-sha1: 2ff4d7c7f0a40f495c2580035a136e53c16e9e28 Text-content-length: 794 Text-content-md5: 09d07fd86545b2bda5159e2700f66665 Text-content-sha1: 0a3c4ae0e9194da31d7428e5a8e450dd19cca00a Content-length: 794 SVN����B��B�-, By default, you will be offered a choice from all the fixed-width fonts installed on the system, since VT100-style terminal handling expects a fixed-width font. If you tick the box marked \q{Allow selection of variable-pitch fonts}, however, PuTTY will offer variable-width fonts as well: if you select one of these, the font will be coerced into fixed-size character cells, which will probably not look very good (but can work OK with some fonts).�n''�n�ing a network dropout of several hours in the middle of an SSH connection, but were not actually planning to send \e{data} down that connection during those hours, then an attempted rekey in the middle of the dropout will probably cause the connection to be abandoned, whereas if rekeys are disa Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6607bb51a148b820b100c0860dc05849 Text-delta-base-sha1: 8edc77bc55c55c26f86eb5af61aae9df21849c8d Text-content-length: 497 Text-content-md5: d7dd636d55f807d5d4c68953be63cbc7 Text-content-sha1: 1c4f7ecb5d29413334615128236cb04be7a0bb9d Content-length: 497 SVN��kQ�R�E� F �?Cstatic void variable_pitch_handler(union control *ctrl, void *dlg, void *data, int event) { if (event == EVENT_REFRESH) { dlg_checkbox_set(ctrl, dlg, !dlg_get_fixed_pitch_flag(dlg)); } else if (event == EVENT_VALCHANGE) { dlg_set_fixed_pitch_flag(dlg, !dlg_checkbox_get(ctrl, dlg)checkbox(s, "Allow selection of variable-pitch fonts", NO_SHORTCUT, HELPCTX(appearance_font), variable_pitch_handler, I(0) Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e632554f7e47fb0ef51b72e3d6a12a61 Text-delta-base-sha1: e2e3319d349c4c6a446411c7b3fe199041415e7e Text-content-length: 1748 Text-content-md5: 1d0127ee974df1f46434d971fe2386fb Text-content-sha1: 13c09d21d71e4dccd2bf3f1d237d41272a904a83 Content-length: 1748 SVN��#%$"�$�V�&N�`q�3L�&}(dp->fixed_pitch_fonts ? CF_FIXEDPITCHONLY : 0) | CF_FORCEFONTEXIST | dlg_auto_set_fixed_pitch_flag(dpvoid dlg_auto_set_fixed_pitch_flag(void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; Config *cfg = (Config *)dp->data; HFONT font; HDC hdc; TEXTMETRIC tm; int is_var; /* * Attempt to load the current font, and see if it's * variable-pitch. If so, start off the fixed-pitch flag for the * dialog box as false. * * We assume here that any client of the dlg_* mechanism which is * using font selectors at all is also using a normal 'Config *' * as dp->data. */ font = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg->font_quality), FIXED_PITCH | FF_DONTCARE, cfg->font.name); hdc = GetDC(NULL); if (font && hdc && SelectObject(hdc, font) && GetTextMetrics(hdc, &tm)) { /* Note that the TMPF_FIXED_PITCH bit is defined upside down :-( */ is_var = (tm.tmPitchAndFamily & TMPF_FIXED_PITCH); } else { is_var = FALSE; /* assume it's basically normal */ } if (hdc) ReleaseDC(NULL, hdc); if (font) DeleteObject(font); if (is_var) dp->fixed_pitch_fonts = FALSE; } int dlg_get_fixed_pitch_flag(void *dlg) { struct dlgparam *dp = (struct dlgparam *)dlg; return dp->fixed_pitch_fonts; } void dlg_set_fixed_pitch_flag(void *dlg, int flag) { struct dlgparam *dp = (struct dlgparam *)dlg; dp->fixed_pitch_fonts = flag dp->fixed_pitch_fonts = TRUE Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f4363892371a9068a56974d76449b5e6 Text-delta-base-sha1: 9a7002057d385b8ca0f8cd667ac923b309d8f432 Text-content-length: 101 Text-content-md5: 8e01645632d58f987485d8a891038cbe Text-content-sha1: aa1c742d263692018c73f8a942b5234a2666155c Content-length: 101 SVN��'wB�c��Qo�I-�8olg_auto_set_fixed_pitch_flag(&dp)lg_auto_set_fixed_pitch_flag(&dp) Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f78b38ffd8f7b0b45a67e4ad8d6026b1 Text-delta-base-sha1: 0229d45b7812569d2fdd39dda7a66632ae7e8750 Text-content-length: 11471 Text-content-md5: 69453ab5195366695f6ccdb8574fe004 Text-content-sha1: 7c130d1ac2aeb078590d40a38c69da7a41b1062e Content-length: 11471 SVN����I%�;��:�FAR�:*�L7�h�Yx�KVl�)B\�?, font_varpitcstatic int get_font_width(HDC hdc, const TEXTMETRIC *tm) { int ret; /* Note that the TMPF_FIXED_PITCH bit is defined upside down :-( */ if (!(tm->tmPitchAndFamily & TMPF_FIXED_PITCH)) { ret = tm->tmAveCharWidth; } else { #define FIRST '0' #define LAST '9' ABCFLOAT widths[LAST-FIRST + 1]; int j; font_varpitch = TRUE; font_dualwidth = TRUE; if (GetCharABCWidthsFloat(hdc, FIRST, LAST, widths)) { ret = 0; for (j = 0; j < lenof(widths); j++) { int width = (int)(0.5 + widths[j].abcfA + widths[j].abcfB + widths[j].abcfC); if (ret < width) ret = width; } } else { ret = tm->tmMaxCharWidth; } #undef FIRST #undef LAST } return ret/* Note that the TMPF_FIXED_PITCH bit is defined upside down :-( */ if (!(tm.tmPitchAndFamily & TMPF_FIXED_PITCH)) { font_varpitch = FALSE; font_dualwidth = (tm.tmAveCharWidth != tm.tmMaxCharWidth); } else { font_varpitch = TRUE; font_dualwidth = TRUE; } font_width = get_font_width(hdc, &tm); }get_font_width(hdc, &tm)DEFAULTint xoffset = 0; int maxlen, remaining, opaque; static int *IpDx = 0, IpDxLEN = 0; int *IpDxRealif (font_varpitch) { /* * If we're using a variable-pitch font, we unconditionally * draw the glyphs one at a time and centre them in their * character cells (which means in particular that we must * disable the IpDx mechanism). This gives slightly odd but * generally reasonable results. */ xoffset = char_width / 2; SetTextAlign(hdc, TA_TOP | TA_CENTER | TA_NOUPDATECP); IpDxReal = NULL; maxlen = 1; } else { /* * In a fixed-pitch font, we draw the whole string in one go * in the normal way. */ xoffset = 0; SetTextAlign(hdc, TA_TOP | TA_LEFT | TA_NOUPDATECP); IpDxReal = IpDx; maxlen = len; } opaque = TRUE; /* start by erasing the rectangle */ for (remaining = len; remaining > 0; text += len, remaining -= len, x += char_width * len) { len = (maxlen < remaining ? maxlen : remaining); /* We're using a private area for direct to font. (512 chars.) */ if (ucsdata.dbcs_screenfont && (text[0] & CSET_MASK) == CSET_ACP) { /* Ho Hum, dbcs fonts are a PITA! */ /* To display on W9x I have to convert to UCS */ static wchar_t *uni_buf = 0; static int uni_len = 0; int nlen, mptr; if (len > uni_len) { sfree(uni_buf); uni_len = len; uni_buf = snewn(uni_len, wchar_t); } for(nlen = mptr = 0; mptr<len; mptr++) { uni_buf[nlen] = 0xFFFD; if (IsDBCSLeadByteEx(ucsdata.font_codepage, (BYTE) text[mptr])) { char dbcstext[2]; dbcstext[0] = text[mptr] & 0xFF; dbcstext[1] = text[mptr+1] & 0xFF; IpDx[nlen] += char_width; MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS, dbcstext, 2, uni_buf+nlen, 1); mptr++; } else { char dbcstext[1]; dbcstext[0] = text[mptr] & 0xFF; MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS, dbcstext, 1, uni_buf+nlen, 1); } nlen++; } if (nlen <= 0) return; /* Eeek! */ ExtTextOutW(hdc, x + xoffset, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0), &line_box, uni_buf, nlen, IpDxReal); if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) { SetBkMode(hdc, TRANSPARENT); ExtTextOutW(hdc, x + xoffset - 1, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED, &line_box, uni_buf, nlen, IpDxReal); } IpDx[0] = -1; } else if (DIRECT_FONT(text[0])) { static char *directbuf = NULL; static int directlen = 0; int i; if (len > directlen) { directlen = len; directbuf = sresize(directbuf, directlen, char); } for (i = 0; i < len; i++) directbuf[i] = text[i] & 0xFF; ExtTextOut(hdc, x + xoffset, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0), &line_box, directbuf, len, IpDxReal); if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) { SetBkMode(hdc, TRANSPARENT); /* GRR: This draws the character outside its box and * can leave 'droppings' even with the clip box! I * suppose I could loop it one character at a time ... * yuk. * * Or ... I could do a test print with "W", and use +1 * or -1 for this shift depending on if the leftmost * column is blank... */ ExtTextOut(hdc, x + xoffset - 1, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED, &line_box, directbuf, len, IpDxReal); } } else { /* And 'normal' unicode characters */ static WCHAR *wbuf = NULL; static int wlen = 0; int i; if (wlen < len) { sfree(wbuf); wlen = len; wbuf = snewn(wlen, WCHAR); } for (i = 0; i < len; i++) wbuf[i] = text[i]; /* print Glyphs as they are, without Windows' Shaping*/ general_textout(hdc, x + xoffset, y - font_height * (lattr==LATTR_BOT) + text_adjust, &line_box, wbuf, len, IpDxReal, opaque && !(attr & TATTR_COMBINING)); /* And the shadow bold hack. */ if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) { SetBkMode(hdc, TRANSPARENT); ExtTextOutW(hdc, x + xoffset - 1, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED, &line_box, wbuf, len, IpDxReal); } } /* * If we're looping round again, stop erasing the background * rectangle. */ SetBkMode(hdc, TRANSPARENT); opaque = FALSE;�i(??�i�ibuf) == 1 ) /* This should work on 9x too, but it's "less accurate" */ ; else return 0; } ibuf += font_width / 2 -1; ibuf /= font_width; return ibuf; } /* * Translate a WM_(SYS)?KEY(UP|DOWN) message into a string of ASCII * codes. Returns number of bytes used, zero to drop the message, * -1 to forward the message to Windows, or another negative number * to indicate a NUL-terminated "special" string. */ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, unsigned char *output) { BYTE keystate[256]; int scan, left_alt = 0, key_down, shift_state; int r, i, code; unsigned char *p = output; static int alt_sum = 0; HKL kbd_layout = GetKeyboardLayout(0); /* keys is for ToAsciiEx. There's some ick here, see below. */ static WORD keys[3]; static int compose_char = 0; static WPARAM compose_key = 0; r = GetKeyboardState(keystate); if (!r) memset(keystate, 0, sizeof(keystate)); else { #if 0 #define SHOW_TOASCII_RESULT { /* Tell us all about key events */ static BYTE oldstate[256]; static int first = 1; static int scan; int ch; if (first) memcpy(oldstate, keystate, sizeof(oldstate)); first = 0; if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) == KF_REPEAT) { debug(("+")); } else if ((HIWORD(lParam) & KF_UP) && scan == (HIWORD(lParam) & 0xFF)) { debug((". U")); } else { debug((".\n")); if (wParam >= VK_F1 && wParam <= VK_F20) debug(("K_F%d", wParam + 1 - VK_F1)); else switch (wParam) { case VK_SHIFT: debug(("SHIFT")); break; case VK_CONTROL: debug(("CTRL")); break; case VK_MENU: debug(("ALT")); break; default: debug(("VK_%02x", wParam)); } if (message == WM_SYSKEYDOWN || message == WM_SYSKEYUP) debug(("*")); debug((", S%02x", scan = (HIWORD(lParam) & 0xFF))); ch = MapVirtualKeyEx(wParam, 2, kbd_layout); if (ch >= ' ' && ch <= '~') debug((", '%c'", ch)); else if (ch) debug((", $%02x", ch)); if (keys[0]) debug((", KB0=%02x", keys[0])); if (keys[1]) debug((", KB1=%02x", keys[1])); if (keys[2]) debug((", KB2=%02x", keys[2])); if ((keystate[VK_SHIFT] & 0x80) != 0) debug((", S")); if ((keystate[VK_CONTROL] & 0x80) != 0) debug((", C")); if ((HIWORD(lParam) & KF_EXTENDED)) debug((", E")); if ((HIWORD(lParam) & KF_UP)) debug((", U")); } if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) == KF_REPEAT); else if ((HIWORD(lParam) & KF_UP)) oldstate[wParam & 0xFF] ^= 0x80; else oldstate[wParam & 0xFF] ^= 0x81; for (ch = 0; ch < 256; ch++) if (oldstate[ch] != keystate[ch]) debug((", M%02x=%02x", ch, keystate[ch])); memcpy(oldstate, keystate, sizeof(oldstate)); } #endif if (wParam == VK_MENU && (HIWORD(lParam) & KF_EXTENDED)) { keystate[VK_RMENU] = keystate[VK_MENU]; } /* Nastyness with NUMLock - Shift-NUMLock is left alone though */ if ((cfg.funky_type == FUNKY_VT400 || (cfg.funky_type <= FUNKY_LINUX && term->app_keypad_keys && !cfg.no_applic_k)) && wParam == VK_NUMLOCK && !(keystate[VK_SHIFT] & 0x80)) { wParam = VK_EXECUTE; /* UnToggle NUMLock */ if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) == 0) keystate[VK_NUMLOCK] ^= 1; } /* And write back the 'adjusted' state */ SetKeyboardState(keystate); } /* Disable Auto repeat if required */ if (term->repeat_off && (HIWORD(lParam) & (KF_UP | KF_REPEAT)) == KF_REPEAT) return 0; if ((HIWORD(lParam) & KF_ALTDOWN) && (keystate[VK_RMENU] & 0x80) == 0) left_alt = 1; key_down = ((HIWORD(lParam) & KF_UP) == 0); /* Make sure Ctrl-ALT is not the same as AltGr for ToAscii unless told. */ if (left_alt && (keystate[VK_CONTROL] & 0x80)) { if (cfg.ctrlaltkeys) keystate[VK_MENU] = 0; else { keystate[VK_RMENU] = 0x80; left_alt = 0; } } scan = (HIWORD(lParam) & (KF_UP | KF_EXTEND Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5dd8b08ca98a92ac5fbc8f5404859952 Text-delta-base-sha1: adfe3746495b9029b45d6fa7e30e90170a5720c1 Text-content-length: 245 Text-content-md5: f0a124befc3a5bdd7f01c5f8367d5c2f Text-content-sha1: f28fab8f6e0e124a61f58187b153456d89552ef3 Content-length: 245 SVN��T1T�,�K�' �/% int fixed_pitch_fonts; /* are we constrained to fixed fontsvoid dlg_auto_set_fixed_pitch_flag(void *dlg); int dlg_get_fixed_pitch_flag(void *dlg); void dlg_set_fixed_pitch_flag(void *dlg, int flag Revision-number: 9064 Prop-content-length: 315 Content-length: 315 K 8 svn:date V 27 2010-12-29T16:00:58.789565Z K 7 svn:log V 214 Fix segfault in general_textout with variable-pitch fonts: we can't pass null lpDx, because general_textout depends on it being filled in. Instead we null it out in the calls to subroutines _from_ general_textout. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69453ab5195366695f6ccdb8574fe004 Text-delta-base-sha1: 7c130d1ac2aeb078590d40a38c69da7a41b1062e Text-content-length: 245 Text-content-md5: 0252679bfa5b93ea8e85a1101cfcc4e9 Text-content-sha1: e58c8ed8ab9b1b2b6d557a3f83c37ac9074d24cc Content-length: 245 SVN����`�c��c�tb�JZ font_varpitch ? NULL : font_varpitch ? NULL :�(\\�(� uc, &ibuf) == 1 ) /* Okay that one worked */ ; else if ( GetCharWidthW(hdc, uc, uc, & Revision-number: 9065 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 60 Move some not-compiled-in debug code somewhere more useful. K 10 svn:author V 5 jacob K 8 svn:date V 27 2010-12-29T22:38:36.222538Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0252679bfa5b93ea8e85a1101cfcc4e9 Text-delta-base-sha1: e58c8ed8ab9b1b2b6d557a3f83c37ac9074d24cc Text-content-length: 67 Text-content-md5: 24eee35f2376f19da3e9625a322380e0 Text-content-sha1: 8d3c66971e937a8b3759ee498a26178df1b518ca Content-length: 67 SVN���� �0��C*�7z�I7ExtTextOut ���� Revision-number: 9066 Prop-content-length: 554 Content-length: 554 K 8 svn:date V 27 2010-12-29T23:48:54.301579Z K 7 svn:log V 453 Rationalise the mechanism in do_text_internal for providing the 'lpDx' array to ExtTextOut: - move it inside the new big loop (this should fix a potential bug whereby the DBCS handling altered some elements of it but the loop did not actually step along it) - initialise it more sensibly - rename it to lpDx rather than IpDx, since as far as I can tell the latter name was derived from a misreading of the former in the Windows API docs. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 24eee35f2376f19da3e9625a322380e0 Text-delta-base-sha1: 8d3c66971e937a8b3759ee498a26178df1b518ca Text-content-length: 705 Text-content-md5: 5edab09ca24e57b9f34643838733962b Text-content-sha1: 2d9b22959e41753f0b4a172e1ef3c2070df11234 Content-length: 705 SVN����fM�1��Y�0R�J�~U�_$� o�|{�h�n�r�5v�3�U3�lpDx = NULL; static int lpDx_len = 0; int *lpDx_maybellpDx_maybelpDx_maybe = lif (len > lpDx_len) { if (len > lpDx_len) { lpDx_len = len * 9 / 8 + 16; lpDx = sresize(lpDx, lpDx_len, int); } } { int i; for (i = 0; i < len; i++) lpDx[i] = char_width; }llpDx_maybelpDx_maybe); } llpDx_maybelpDx_maybellpDx_maybe�rnn�� if (uc >= ' ' && uc <= '~') return 1; SelectObject(hdc, fonts[FONT_NORMAL]); if ( GetCharWidth32W(hdc, uc, Revision-number: 9067 Prop-content-length: 687 Content-length: 687 K 7 svn:log V 586 Stop general_textout() from trying to slice up the input clipping rectangle into smaller ones: it doesn't work any more, since the new variable-pitch code can now call general_textout() with a larger clipping rectangle than the text it's meant to be displaying. Instead, general_textout() now uses the same semantics as the next loop up in do_text_internal(): the first piece of text it displays uses the opacity setting passed in, which blanks the entire clipping rectangle if necessary, and then subsequent overlays are non-opaque. And the same clipping rectangle is used throughout. K 10 svn:author V 5 simon K 8 svn:date V 27 2010-12-30T00:06:43.129049Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5edab09ca24e57b9f34643838733962b Text-delta-base-sha1: 2d9b22959e41753f0b4a172e1ef3c2070df11234 Text-content-length: 1448 Text-content-md5: 9e1470ebfa81c0de6c5c93ccea7197c9 Text-content-sha1: 762921dce6e26414b53dbe4388e11b2db2276f59 Content-length: 1448 SVN����!h�5��o@H�c2�oKint bkmode = 0, got_bkmode = FALSE;exact_textout(hdc, xp, y, lprc, lpString+i, j-i, font_varpitch ? NULL : lpDx+i, opaque); } else { ExtTextOutW(hdc, xp, y, ETO_CLIPPED | (opaque ? ETO_OPAQUE : 0), lp bkmode = GetBkMode(hdc); got_bkmode = TRUE; SetBkMode(hdc, TRANSPARENT); opaque = FALSE; } if (got_bkmode) SetBkMode(hdc, bkmode if (uc >= ' ' && uc <= '~') return 1; SelectObject(hdc, fonts[FONT_NORMAL]); if ( GetCharWidth32W(hdc, uc, uc, &ibuf) == 1 ) /* Okay that one worked */ ; else if ( GetCharWidthW(hdc, uc, uc, &ibuf) == 1 ) /* This should work on 9x too, but it's "less accurate" */ ; else return 0; } ibuf += font_width / 2 -1; ibuf /= font_width; return ibuf; } /* * Translate a WM_(SYS)?KEY(UP|DOWN) message into a string of ASCII * codes. Returns number of bytes used, zero to drop the message, * -1 to forward the message to Windows, or another negative number * to indicate a NUL-terminated "special" string. */ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, unsigned char *output) { BYTE keystate[256]; int scan, left_alt = 0, key_down, shift_state; int r, i, code; unsigned char *p = output; static int alt_sum = 0; HKL kbd_layout = GetKeyboardLayout(0); /* keys is for ToAsciiEx. Th�r'��'K Revision-number: 9068 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2010-12-30T00:53:25.850540Z K 7 svn:log V 81 Summary: Support for non-monospaced fonts Class: wish Fixed-in: r9067 2010-12-31 K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/non-fixed-width-fonts Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 633 Text-content-md5: aad0d07d74ee3d4b814dd82f52763906 Text-content-sha1: 7477524313d1f4482dd657984514f6b24293f722 Content-length: 643 PROPS-END SVN���kkkSummary: Support for non-monospaced fonts Class: wish Fixed-in: r9067 2010-12-31 Content-type: text/x-html-body <p> Both Windows and Unix PuTTY can now use fonts which are not internally marked as monospaced. <p> This allows use of fonts which are designed for a fixed-width grid but do not declare themselves as monospaced, such as <a href="http://unifoundry.com/unifont.html">Unifont</a> or <a href="http://www.fixedsysexcelsior.com/">Fixedsys Excelsior</a>. <p> If you <a href="http://xkcd.com/840/">really want to</a>, it's also possible to use a non-monospaced font, although the result may not look very good. Revision-number: 9069 Prop-content-length: 662 Content-length: 662 K 8 svn:date V 27 2011-01-03T16:50:41.162374Z K 7 svn:log V 561 When iterating over all channels for a dead SSH connection, don't miss out those in the CHAN_SOCKDATA_DORMANT state (i.e., local-to-remote forwardings which the SSH server had not yet acknowledged). Marcel Kilgus has been running with the ssh_do_close() patch for nearly two years (*cough*) and reports that it has eliminated frequent 'unclean-close-crash' symptoms for him (due to the unclosed socket generating a pfd_closing() which accessed freed memory), although I've not reproduced that. The patch to ssh_free() is mine and not known to fix any symptoms. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f196471d605223ba43f749845ec3bb26 Text-delta-base-sha1: 3eefcfd285b5b86b04f03917336863e747aced36 Text-content-length: 200 Text-content-md5: 73f0fffff1610ca108a6d4b633ae48a3 Text-content-sha1: e52e48edd5018eacc7decc64cd0bc9c84cee1d60 Content-length: 200 SVN���� �:��&7 case CHAN_SOCKDATA_DORMANT���#�]�} switch (s->cipher_type) { �^$ C�L��I*/ pktout = ssh2_pkt_init(SSH2_MSG case CHAN_SOCKDATA_DORMANT Node-path: putty-wishlist/data/unclean-close-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e8ddf3ae698a8cdd17d49cba193dc2dd Text-delta-base-sha1: 8378d87a4fb9367173c3f709069704cbbcdfd003 Text-content-length: 157 Text-content-md5: 352f6770a8a5876a8aa347465e8d3674 Text-content-sha1: 0cc41b0d32104b23fdd3bd816ea64f19d4ec4e16 Content-length: 157 SVN��vv �-��D-k (this one fixed in r9069)li>not properly closing port-forwardings in CHAN_SOCKDATA_DORMANT state, fixed r9069, s/s 2011-11-04 </ul> Revision-number: 9070 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2011-01-05T11:52:30.658180Z K 7 svn:log V 42 I seem to think 2011 started in November. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unclean-close-crash Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 352f6770a8a5876a8aa347465e8d3674 Text-delta-base-sha1: 0cc41b0d32104b23fdd3bd816ea64f19d4ec4e16 Text-content-length: 28 Text-content-md5: 0e6cd3507ae53c90bd89a7a5a3b89bbf Text-content-sha1: a4253dabda937d3bb7cdb07c04cea1d150b0e305 Content-length: 28 SVN��vv �j�01-04 </ul> Revision-number: 9071 Prop-content-length: 149 Content-length: 149 K 10 svn:author V 5 jacob K 8 svn:date V 27 2011-01-05T11:58:52.213431Z K 7 svn:log V 49 Remove references to the now-dead Mac OS 9 port. PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2052c8f8fd54cc66535124ef30169c78 Text-delta-base-sha1: 2c724b50c836378e0dc75d75c05fb795fa9fab28 Text-content-length: 43 Text-content-md5: 64f8942a929121e8fa5ce7d7bf58747a Text-content-sha1: e4c4bc01936e42cea74de2a5bebe2e28a7b4aeba Content-length: 43 SVN��9% �z���r�j0�5unix/gtkdlg. Revision-number: 9072 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 17 It's a new year. K 10 svn:author V 5 jacob K 8 svn:date V 27 2011-01-05T12:01:00.117547Z PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0658d4f44048a4bd00578f3850e5aaf2 Text-delta-base-sha1: 79138c5d2f5b8d779108fb46c85515836084bd12 Text-content-length: 44 Text-content-md5: 96ddbcf394291b5d406c722f81bf71ce Text-content-sha1: 4dc18d7bb0f82bab8b96b5f74058902c03432c7b Content-length: 44 SVN�� �qPuTTY is copyright 1997-2011 Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c505a6c4b25af6d93ff84d18be071b3 Text-delta-base-sha1: 5f473c2e7774b7365d419368a0777d5f49c23e4f Text-content-length: 22 Text-content-md5: 98541f3d8ad636c032a11dba10ffce1c Text-content-sha1: 8a693efd2076dfb945a37ee751273f4d67ec2783 Content-length: 22 SVN��bb �R��S1 Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 039b6c8e36219c53b993566dbf6d7f93 Text-delta-base-sha1: 2331f46dd5be54ed398aff53b625463320630041 Text-content-length: 20 Text-content-md5: 7268282325c66d80bc43ef4e6a882e9d Text-content-sha1: ecc923b05f8b4ffecb13ad85dfb1e6ec226b82ca Content-length: 20 SVN��``�j��uk1 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 38f72c32efa496b3da5bca1131546992 Text-delta-base-sha1: 96d1ce762312091795552b72922850f7b1adbaee Text-content-length: 45 Text-content-md5: d88ca9e17639d9cf52003ef47d6ed58e Text-content-sha1: 782317401bc2535be77f522281d44afd79bdeb2e Content-length: 45 SVN������������P�/l11 Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d437b50239dc79374ad5638d91d5ad32 Text-delta-base-sha1: 46b1bb04c9aa83beae410484e4aa8b24c601e873 Text-content-length: 29 Text-content-md5: 85d1a799fce0776ebadb69269a53fedf Text-content-sha1: bf1bb26f645f4aed794b653f4547e047668abaa5 Content-length: 29 SVN�� �-��L.�{11 Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 04b571ba57939a73d40dd91e00d962d4 Text-delta-base-sha1: 2782d5a55160ae18a2ceee5d5fef04839a0414d0 Text-content-length: 29 Text-content-md5: e7a75d9bce5eb90e95517a3aa9998eab Text-content-sha1: d1a1734172d78eb347198e4176677efb28927bc7 Content-length: 29 SVN��CC�d��Le�211 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 036fe68af9f890c98b32568346bc52c6 Text-delta-base-sha1: 51fb0c3b4f5b0270c5fbccf06e1ac716c43a7878 Text-content-length: 22 Text-content-md5: c7410bf91a55beff39fb48ccb21df15c Text-content-sha1: 4a8aff92dd26b0bd9b0ad15e1101015da0999b29 Content-length: 22 SVN��RR �\��u]1 Node-path: putty/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bb63f30bc3a550f8577e022b6eee221b Text-delta-base-sha1: e404d20eb97154b1be230b2d80cfb877e5878c85 Text-content-length: 29 Text-content-md5: 3db9f45cd45de7050a36aa1ae09dd325 Text-content-sha1: f2b982eb2fb549e45d0385f6c141c07bc9734f54 Content-length: 29 SVN��tt�k��Cl�D011 Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e6ca4e89b971e9d2bd47abf5fd1b87ac Text-delta-base-sha1: f2a9a040977a18cf603c8ffd84e1e7a013c560aa Text-content-length: 22 Text-content-md5: ae1350c9b6951302a6df3ca36039acf0 Text-content-sha1: 9bded7d19d6eb754eff7485fe95a4af457d0ad01 Content-length: 22 SVN��ee �+��9,1 Revision-number: 9073 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9074 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9075 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9076 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9077 Prop-content-length: 478 Content-length: 478 K 8 svn:date V 27 2011-01-14T19:57:00.435789Z K 7 svn:log V 377 Tweak to r7635: when changing between protocols in the configuration dialog and avoiding trashing a non-default port, don't treat a port of 0 as special; this was causing defaults to "freeze in" for sequences of clicks like SSH, Raw, Telnet. Arrange that a port of 0 (which in a backend indicates no default) is displayed as a blank in the port box, to make this less jarring. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fee891a94b7e133ec72bc5f1e32699ec Text-delta-base-sha1: 2a981e3834054224aa27d10339eb220f62f0a2b6 Text-content-length: 674 Text-content-md5: 7d626a6a5cbbf3871e0d1911f2ac62db Text-content-sha1: 8a4ceade21e9071e70778b5133c6192401f692bc Content-length: 674 SVN��Ou�E��%w�Ys~�aik�6_similarly toif (cfg->port != 0) sprintf(buf, "%d", cfg->port); else /* Display an (invalid) port of 0 as blank */ buf[0] = '\0'old protocol's * default, update it with the new protocol's default. * (This includes a "default" of 0, implying that there is no * sensible default for that protocol; in this case it's * displayed as a blank.) * This helps with the common case of tabbing through the * controls in order and setting a non-default port before * getting to the protocol; we want that non-default port * to be preserved. */ if (cfg->port == ob->default_port Revision-number: 9078 Prop-content-length: 336 Content-length: 336 K 8 svn:date V 27 2011-01-15T11:39:44.815954Z K 7 svn:log V 235 Allow setting the WM_CLASS X window property as a configuration option in saved sessions, so that a programmable window manager can distinguish different PuTTYs/pterms on startup and assign them different window management properties. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 88930ce17d9fc340ec400a255770bda6 Text-delta-base-sha1: 0e28f519985d45b754a18935df4e6a0de57fc5db Text-content-length: 48 Text-content-md5: 699b2791aad0fc84fe2dbe938bf0ba5b Text-content-sha1: 7ad2ca20059367abea314645d8dcb68ae99ceb49 Content-length: 48 SVN��ay �*��9( char winclass[256] Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e75b5ec909b542b3c39f6048ad6ee60 Text-delta-base-sha1: e393edd1247a7668909721276481317e667bb905 Text-content-length: 164 Text-content-md5: 383f752dbb17c61c30464072175a8611 Text-content-sha1: 2dc06da5ab96ef4446623f89c68f424e5cbf2e15 Content-length: 164 SVN��IQ�#�� I�+ write_setting_s(sesskey, "WindowClass", cfg->winclass gpps(sesskey, "WindowClass", "", cfg->winclass, sizeof(cfg->winclass) Node-path: putty/unix/gtkcfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5319843c8da0e8e2a86bc668ef30eb35 Text-delta-base-sha1: aa886c01c1989a1aab6522f7d8447f72d6a51147 Text-content-length: 633 Text-content-md5: 0ccb16331431ceaafb3462c6a39c9ff5 Text-content-sha1: 89365b7ae58dec045b5d56b449137527206a905c Content-length: 633 SVN���df�~�f if (!midsession) { /* * Allow the user to specify the window class as part of the saved * configuration, so that they can have their window manager treat * different kinds of PuTTY and pterm differently if they want to. */ s = ctrl_getset(b, "Window/Behaviour", "x11", "X Window System settings"); ctrl_editbox(s, "Window class name:", 'z', 50, HELPCTX(no_help), dlg_stdeditbox_handler, I(offsetof(Config,winclass)), I(sizeof(((Config *)0)->winclass))); } } Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7b73d9ebc1fb1fca4cc9f44cca3235b6 Text-delta-base-sha1: 052836caa9f771d0dff6be3c26d3f0e17f32ec7b Text-content-length: 362 Text-content-md5: e8319569816844f3078e0030766e344b Text-content-sha1: c285a0a1e3a24fadeb5282126cf3456f34a8b37c Content-length: 362 SVN�����U��R if (inst->cfg.winclass[0]) gtk_window_set_wmclass(GTK_WINDOW(inst->window), inst->cfg.winclass, inst->cfg.winclass�Bb �B�t int use_event_log, new_session, saved_sessions; inst->menu = gtk_menu_new(); #define MKMENUITEM(title, func) do { \ menuitem = title ? gtk_menu_item_ne Revision-number: 9079 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9080 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9081 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9082 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9083 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9084 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9085 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9086 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9087 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9088 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9089 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9090 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9091 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9092 Prop-content-length: 448 Content-length: 448 K 8 svn:date V 27 2011-02-18T08:25:36.894202Z K 7 svn:log V 347 Add some appropriate bignum typedefs for generic 64-bit systems, setting BignumInt to 32 bits. gcc defines _LP64 on x86-64 and presumably on other 64-bit architectures, so I've conditioned my defines on that in the hope that they won't need redoing for the next few such architectures. I've also added a set for _LLP64, but it's untested as yet. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 61ee46d87f640e7f36558ab0edec7198 Text-delta-base-sha1: 13404b83364f544128469ac1e1ea96544a8563c8 Text-content-length: 416 Text-content-md5: 5463298e697a6d11511c0b47d41fbb34 Text-content-sha1: ee220cf420c3b5a24e4240008f1b2f93bccbb3d2 Content-length: 416 SVN��|Ft��w�S9W� 0�|�gif defined _LP64 /* 64-bit architectures can do 32x32->64 chunks at a time */ typedef unsigned int BignumInt; typedef unsigned long BignumDblInt; #define BIGNUM_INT_MASK 0xFFFFFFFFU #define BIGNUM_TOP_BIT 0x80000000U #define BIGNUM_INT_BITS 32lif defined _LLP64 /* 64-bit architectures in which unsigned long is 32 bits, not 64 */lse /* Fallback for all other cases */ Revision-number: 9093 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2011-02-18T08:25:37.527562Z K 7 svn:log V 101 Implement the Karatsuba technique for recursive divide-and-conquer optimisation of large multiplies. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5463298e697a6d11511c0b47d41fbb34 Text-delta-base-sha1: ee220cf420c3b5a24e4240008f1b2f93bccbb3d2 Text-content-length: 6005 Text-content-md5: ec829156a82331c84c6bc02d3cada5ce Text-content-sha1: ef8597880dd4c4e840a2fece96a999dd37e6215c Content-length: 6005 SVN��FtM�x�b�n�zrM�0Internal addition. Sets c = a - b, where 'a', 'b' and 'c' are all * big-endian arrays of 'len' BignumInts. Returns a BignumInt carried * off the top. */ static BignumInt internal_add(const BignumInt *a, const BignumInt *b, BignumInt *c, int len) { int i; BignumDblInt carry = 0; for (i = len-1; i >= 0; i--) { carry += (BignumDblInt)a[i] + b[i]; c[i] = (BignumInt)carry; carry >>= BIGNUM_INT_BITS; } return (BignumInt)carry; } /* * Internal subtraction. Sets c = a - b, where 'a', 'b' and 'c' are * all big-endian arrays of 'len' BignumInts. Any borrow from the top * is ignored. */ static void internal_sub(const BignumInt *a, const BignumInt *b, BignumInt *c, int len) { int i; BignumDblInt carry = 1; for (i = len-1; i >= 0; i--) { carry += (BignumDblInt)a[i] + (b[i] ^ BIGNUM_INT_MASK); c[i] = (BignumInt)carry; carry >>= BIGNUM_INT_BITS; }#define KARATSUBA_THRESHOLD 50if (len > KARATSUBA_THRESHOLD) { /* * Karatsuba divide-and-conquer algorithm. Cut each input in * half, so that it's expressed as two big 'digits' in a giant * base D: * * a = a_1 D + a_0 * b = b_1 D + b_0 * * Then the product is of course * * ab = a_1 b_1 D^2 + (a_1 b_0 + a_0 b_1) D + a_0 b_0 * * and we compute the three coefficients by recursively * calling ourself to do half-length multiplications. * * The clever bit that makes this worth doing is that we only * need _one_ half-length multiplication for the central * coefficient rather than the two that it obviouly looks * like, because we can use a single multiplication to compute * * (a_1 + a_0) (b_1 + b_0) = a_1 b_1 + a_1 b_0 + a_0 b_1 + a_0 b_0 * * and then we subtract the other two coefficients (a_1 b_1 * and a_0 b_0) which we were computing anyway. * * Hence we get to multiply two numbers of length N in about * three times as much work as it takes to multiply numbers of * length N/2, which is obviously better than the four times * as much work it would take if we just did a long * conventional multiply. */ int toplen = len/2, botlen = len - toplen; /* botlen is the bigger */ int midlen = botlen + 1; BignumInt *scratch; BignumDblInt carry; /* * The coefficients a_1 b_1 and a_0 b_0 just avoid overlapping * in the output array, so we can compute them immediately in * place. */ /* a_1 b_1 */ internal_mul(a, b, c, toplen); /* a_0 b_0 */ internal_mul(a + toplen, b + toplen, c + 2*toplen, botlen); /* * We must allocate scratch space for the central coefficient, * and also for the two input values that we multiply when * computing it. Since either or both may carry into the * (botlen+1)th word, we must use a slightly longer length * 'midlen'. */ scratch = snewn(4 * midlen, BignumInt); /* Zero padding. midlen exceeds toplen by at most 2, so just * zero the first two words of each input and the rest will be * copied over. */ scratch[0] = scratch[1] = scratch[midlen] = scratch[midlen+1] = 0; for (j = 0; j < toplen; j++) { scratch[midlen - toplen + j] = a[j]; /* a_1 */ scratch[2*midlen - toplen + j] = b[j]; /* b_1 */ } /* compute a_1 + a_0 */ scratch[0] = internal_add(scratch+1, a+toplen, scratch+1, botlen); /* compute b_1 + b_0 */ scratch[midlen] = internal_add(scratch+midlen+1, b+toplen, scratch+midlen+1, botlen); /* * Now we can do the third multiplication. */ internal_mul(scratch, scratch + midlen, scratch + 2*midlen, midlen); /* * Now we can reuse the first half of 'scratch' to compute the * sum of the outer two coefficients, to subtract from that * product to obtain the middle one. */ scratch[0] = scratch[1] = scratch[2] = scratch[3] = 0; for (j = 0; j < 2*toplen; j++) scratch[2*midlen - 2*toplen + j] = c[j]; scratch[1] = internal_add(scratch+2, c + 2*toplen, scratch+2, 2*botlen); internal_sub(scratch + 2*midlen, scratch, scratch + 2*midlen, 2*midlen); /* * And now all we need to do is to add that middle coefficient * back into the output. We may have to propagate a carry * further up the output, but we can be sure it won't * propagate right the way off the top. */ carry = internal_add(c + 2*len - botlen - 2*midlen, scratch + 2*midlen, c + 2*len - botlen - 2*midlen, 2*midlen); j = 2*len - botlen - 2*midlen - 1; while (carry) { assert(j >= 0); carry += c[j]; c[j] = (BignumInt)carry; carry >>= BIGNUM_INT_BITS; } /* Free scratch. */ for (j = 0; j < 4 * midlen; j++) scratch[j] = 0; sfree(scratch); } else { /* * Multiply in the ordinary O(N^2) way. */ for (j = 0; j < 2 * len; j++) c[j] = 0; for (i = len - 1; i >= 0; i--) { t = 0; for (j = len - 1; j >= 0; j--) { t += MUL_WORD(a[i], (BignumDblInt) b[j]); t += (BignumDblInt) c[i + j + 1]; c[i + j + 1] = (BignumInt) t; t = t >> BIGNUM_INT_BITS; } c[i] = (BignumInt) t; } Revision-number: 9094 Prop-content-length: 466 Content-length: 466 K 8 svn:date V 27 2011-02-18T08:25:38.194465Z K 7 svn:log V 365 Implement the Montgomery technique for speeding up modular exponentiation by replacing the modulo operation by a cleverly chosen multiplication. This was not worth doing in the previous state of the code (because my multiply was about as slow as my modulo), but now that multiplication has been sped up by the Karatsuba optimisation, Montgomery becomes worthwhile. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec829156a82331c84c6bc02d3cada5ce Text-delta-base-sha1: ef8597880dd4c4e840a2fece96a999dd37e6215c Text-content-length: 8148 Text-content-md5: 9cf0ff9445333423eb92f00c04a32773 Text-content-sha1: 039c05d8f393a30b3f6a43e972a2f89db76aa723 Content-length: 8148 SVN��tSVp���*$ �6�a;(�<�r>0�JO�Hke�:MZ�{S�}rK�?5const BignumInt *a, const/* * Variant form of internal_mul used for the initial step of * Montgomery reduction. Only bothers outputting 'len' words * (everything above that is thrown away). */ static void internal_mul_low(const BignumInt *a, const BignumInt *b, -aware version of internal_mul_low. As before, we * express each input value as a shifted combination of two * halves: * * a = a_1 D + a_0 * b = b_1 D + b_0 * * Then the full product is, as before,Provided we choose D on the large side (so that a_0 and b_0 * are _at least_ as long as a_1 and b_1), we don't need the * topmost term at all, and we only need half of the middle * term. So there's no point in doing the proper Karatsuba * optimisation which computes the middle term using the top * one, because we'd take as long computing the top one as * just computing the middle one directly. * * So instead, we do a much more obvious thing: we call the * fully optimised internal_mul to compute a_0 b_0, and we * recursively call ourself to compute the _bottom halves_ of * a_1 b_0 and a_0 b_1, each of which we add into the result * in the obvious way. * * In other words, there's no actual Karatsuba _optimisation_ * in this function; the only benefit in doing it this way is * that we call internal_mul proper for a large part of the * work, and _that_ can optimise its operation. */ int toplen = len/2, botlen = len - toplen; /* botlen is the bigger */ BignumInt *scratch; /* * Allocate scratch space for the various bits and pieces * we're going to be adding together. We need botlen*2 words * for a_0 b_0 (though we may end up throwing away its topmost * word), and toplen words for each of a_1 b_0 and a_0 b_1. * That adds up to exactly 2*len. */ scratch = snewn(len*2, BignumInt); /* a_0 b_0 */ internal_mul(a + toplen, b + toplen, scratch + 2*toplen, botlen); /* a_1 b_0 */ internal_mul_low(a, b + len - toplen, scratch + toplen, toplen); /* a_0 b_1 */ internal_mul_low(a + len - toplen, b, scratch, toplen); /* Copy the bottom half of the big coefficient into place */ for (j = 0; j < botlen; j++) c[toplen + j] = scratch[2*toplen + botlen + j]; /* Add the two small coefficients, throwing away the returned carry */ internal_add(scratch, scratch + toplen, scratch, toplen); /* And add that to the large coefficient, leaving the result in c. */ internal_add(scratch, scratch + 2*toplen + botlen - toplen, c, toplen); /* Free scratch. */ for (j = 0; j < len*2; j++) scratch[j] = 0; sfree(scratch); } else { for (j = 0; j <len - i - 1 - len]; c[i + j + 1 - len] = (BignumInt) t; t = t >> BIGNUM_INT_BITS; } } } } /* * Montgomery reduction. Expects x to be a big-endian array of 2*len * BignumInts whose value satisfies 0 <= x < rn (where r = 2^(len * * BIGNUM_INT_BITS) is the Montgomery base). Returns in the same array * a value x' which is congruent to xr^{-1} mod n, and satisfies 0 <= * x' < n. * * 'n' and 'mninv' should be big-endian arrays of 'len' BignumInts * each, containing respectively n and the multiplicative inverse of * -n mod r. * * 'tmp' is an array of at least '3*len' BignumInts used as scratch * space. */ static void monty_reduce(BignumInt *x, const BignumInt *n, const BignumInt *mninv, BignumInt *tmp, int len) { int i; BignumInt carry; /* * Multiply x by (-n)^{-1} mod r. This gives us a value m such * that mn is congruent to -x mod r. Hence, mn+x is an exact * multiple of r, and is also (obviously) congruent to x mod n. */ internal_mul_low(x + len, mninv, tmp, len); /* * Compute t = (mn+x)/r in ordinary, non-modular, integer * arithmetic. By construction this is exact, and is congruent mod * n to x * r^{-1}, i.e. the answer we want. * * The following multiply leaves that answer in the _most_ * significant half of the 'x' array, so then we must shift it * down. */ internal_mul(tmp, n, tmp+len, len); carry = internal_add(x, tmp+len, x, 2*len); for (i = 0; i < len; i++) x[len + i] = x[i], x[i] = 0; /* * Reduce t mod n. This doesn't require a full-on division by n, * but merely a test and single optional subtraction, since we can * show that 0 <= t < 2n. * * Proof: * + we computed m mod r, so 0 <= m < r. * + so 0 <= mn < rn, obviously * + hence we only need 0 <= x < rn to guarantee that 0 <= mn+x < 2rn * + yielding 0 <= (mn+x)/r < 2n as required. */ if (!carry) { for (i = 0; i < len; i++) if (x[len + i] != n[i]) break; } if (carry || i >= len || x[len + i] > n[i]) internal_sub(x+len, n, x+len, len); Uses the Montgomery multiplication * technique. */ Bignum modpow(Bignum base_in, Bignum exp, Bignum mod) { BignumInt *a, *b, *x, *n, *mninv, *tmp; int len, i, j; Bignum base, base2, r, rn, inv * mod had better be odd, or we can't do Montgomery multiplication * using a power of two at all. */ assert(mod[1] & 1); /* * Compute the inverse of n mod r, for monty_reduce. (In fact we * want the inverse of _minus_ n mod r, but we'll sort that out * below.) */ len = mod[0]; r = bn_power_2(BIGNUM_INT_BITS * len); inv = modinv(mod, r); /* * Multiply the base by r mod n, to get it into Montgomery * representation. */ base2 = modmul(base, r, mod); freebn(base); base = base2; rn = bigmod(r, mod); /* r mod n, i.e. Montgomerified 1 */ freebn(r); /* won't need this any more */ /* * Set up internal arrays of the right lengths, in big-endian * format, containing the base, the modulus, and the modulus's * inverse. */ n = snewn(len, BignumInt); for (j = 0; j < len; j++) n[len - 1 - j] = mod[j + 1]; mninv = snewn(len, BignumInt); for (j = 0; j < len; j++) mninv[len - 1 - j] = (j < inv[0] ? inv[j + 1] : 0); freebn(inv); /* we don't need this copy of it any more */ /* Now negate mninv mod r, so it's the inverse of -n rather than +n. */ x = snewn(len, BignumInt); for (j = 0; j < len; j++) x[j] = 0; internal_sub(x, mninv, mninv, len); /* x = snewn(len, BignumInt); */ /* already done above */ for (j = 0; j < len; j++) x[len - 1 - j] = (j < base[0] ? base[j + 1] : 0); freebn(base); /* we don't need this copy of it any more */ a = snewn(2*len, BignumInt); b = snewn(2*len, BignumInt); for (j = 0; j < len; j++) a[2*len - 1 - j] = (j < rn[0] ? rn[j + 1] : 0); freebn(rn); tmp = snewn(3*len, BignumInt)len, a + len, b, len); monty_reduce(b, n, mninv, tmp, len); if ((exp[exp[0] - i] & (1 << j)) != 0) { internal_mul(b + len, x, a, len); monty_reduce(a, n, mninv, tmp, len * Final monty_reduce to get back from the adjusted Montgomery * representation. */ monty_reduce(a, n, mninv, tmp, len); /* Copy result to buffer */ result = newbn(mod[0]); for (i = 0; i < len; i++) result[result[0] - i] = a[i + 3 * len; i++) tmp[i] = 0; sfree(tmp); for (i = 0; i < 2 * len; i++) a[i] = 0; sfree(a); for (i = 0; i < 2 * len; i++) b[i] = 0; sfree(b); for (i = 0; i < len; i++) mninv[i] = 0; sfree(mninv); for (i = 0; i < len; i++) n[i] = 0; sfree(n); for (i = 0; i < len; i++) x[i] = 0; sfree(x Revision-number: 9095 Prop-content-length: 264 Content-length: 264 K 7 svn:log V 163 Implement the Chinese Remainder Theorem optimisation for speeding up RSA private key operations by making use of the fact that we know the factors of the modulus. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-02-18T08:25:39.674056Z PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e8059550478d3b059cd27c1d5232c95a Text-delta-base-sha1: 0032e67161f89b37eba5ee560fa645883702a2e7 Text-content-length: 80 Text-content-md5: a6a5600b26b0f67436dde7b5a4ed36f9 Text-content-sha1: 45db434c0770f3a8407039c527b646f91438c23d Content-length: 80 SVN��I 9�f��*Yadd(Bignum a, Bignum b); Bignum bigsub(Bignum a, Bignum b Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9cf0ff9445333423eb92f00c04a32773 Text-delta-base-sha1: 039c05d8f393a30b3f6a43e972a2f89db76aa723 Text-content-length: 1424 Text-content-md5: f78560343623c3fac2f379c9cc81ece3 Text-content-sha1: 3bc4fbb83ae35ad229e18eb928e857bd0e427cea Content-length: 1424 SVN��SRt��t�MSimple addition. */ Bignum bigadd(Bignum a, Bignum b) { int alen = a[0], blen = b[0]; int rlen = (alen > blen ? alen : blen) + 1; int i, maxspot; Bignum ret; BignumDblInt carry; ret = newbn(rlen); carry = 0; maxspot = 0; for (i = 1; i <= rlen; i++) { carry += (i <= (int)a[0] ? a[i] : 0); carry += (i <= (int)b[0] ? b[i] : 0); ret[i] = (BignumInt) carry & BIGNUM_INT_MASK; carry >>= BIGNUM_INT_BITS; if (ret[i] != 0 && i > maxspot) maxspot = i; } ret[0] = maxspot; return ret; } /* * Subtraction. Returns a-b, or NULL if the result would come out * negative (recall that this entire bignum module only handles * positive numbers). */ Bignum bigsub(Bignum a, Bignum b) { int alen = a[0], blen = b[0]; int rlen = (alen > blen ? alen : blen); int i, maxspot; Bignum ret; BignumDblInt carry; ret = newbn(rlen); carry = 1; maxspot = 0; for (i = 1; i <= rlen; i++) { carry += (i <= (int)a[0] ? a[i] : 0); carry += (i <= (int)b[0] ? b[i] ^ BIGNUM_INT_MASK : BIGNUM_INT_MASK); ret[i] = (BignumInt) carry & BIGNUM_INT_MASK; carry >>= BIGNUM_INT_BITS; if (ret[i] != 0 && i > maxspot) maxspot = i; } ret[0] = maxspot; if (!carry) { freebn(ret); return NULL; } return ret Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e6b9555c6b05a3abd39e2370067801c Text-delta-base-sha1: 07f37310b75b1e98270f09108f9ee395dc513b2c Text-content-length: 2554 Text-content-md5: bc19e9d78fbd0d3441a5149a978c75ee Text-content-sha1: 6d48ac220862f9dfb54cdc91887f24a88643f6da Content-length: 2554 SVN��e !K�:�x�H~s�Fk� u�"CCompute (base ^ exp) % mod, provided mod == p * q, with p,q * distinct primes, and iqmp is the multiplicative inverse of q mod p. * Uses Chinese Remainder Theorem to speed computation up over the * obvious implementation of a single big modpow. */ Bignum crt_modpow(Bignum base, Bignum exp, Bignum mod, Bignum p, Bignum q, Bignum iqmp) { Bignum pm1, qm1, pexp, qexp, presult, qresult, diff, multiplier, ret0, ret; /* * Reduce the exponent mod phi(p) and phi(q), to save time when * exponentiating mod p and mod q respectively. Of course, since p * and q are prime, phi(p) == p-1 and similarly for q. */ pm1 = copybn(p); decbn(pm1); qm1 = copybn(q); decbn(qm1); pexp = bigmod(exp, pm1); qexp = bigmod(exp, qm1); /* * Do the two modpows. */ presult = modpow(base, pexp, p); qresult = modpow(base, qexp, q); /* * Recombine the results. We want a value which is congruent to * qresult mod q, and to presult mod p. * * We know that iqmp * q is congruent to 1 * mod p (by definition * of iqmp) and to 0 mod q (obviously). So we start with qresult * (which is congruent to qresult mod both primes), and add on * (presult-qresult) * (iqmp * q) which adjusts it to be congruent * to presult mod p without affecting its value mod q. */ if (bignum_cmp(presult, qresult) < 0) { /* * Can't subtract presult from qresult without first adding on * p. */ Bignum tmp = presult; presult = bigadd(presult, p); freebn(tmp); } diff = bigsub(presult, qresult); multiplier = bigmul(iqmp, q); ret0 = bigmuladd(multiplier, diff, qresult); /* * Finally, reduce the result mod n. */ ret = bigmod(ret0, mod); /* * Free all the intermediate results before returning. */ freebn(pm1); freebn(qm1); freebn(pexp); freebn(qexp); freebn(presult); freebn(qresult); freebn(diff); freebn(multiplier); freebn(ret0); return ret; } /* * This function is a wrapper on modpow(). It has the same effect as * and also uses the Chinese Remainder Theorem (implemented * above, in crt_modpow()) to speed up the main operationcrt_modpow(random, key->exponent, key->modulus, key->p, key->q, key->iqmpcrt_modpow(input_blinded, key->private_exponent, key->modulus, key->p, key->q, key->iqmp Revision-number: 9096 Prop-content-length: 339 Content-length: 339 K 8 svn:date V 27 2011-02-18T19:12:20.553057Z K 7 svn:log V 238 Prompt for a remote username in rlogin connections, if one wasn't specified in the configuration. Jacob's userpass abstraction proves its worth in making this a trivial job. (Actually reported by a user - somebody's still using rlogin!) K 10 svn:author V 5 simon PROPS-END Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1acb573d8fea5a839bd4332d39464627 Text-delta-base-sha1: f2794a695496db83d9d4adb0210549c4c0acead9 Text-content-length: 2485 Text-content-md5: 7abf86e045374f1e86c053700b5d7dc8 Text-content-sha1: 47016ad191499b3c7affd2ebc39fadb6cd6a8a72 Content-length: 2485 SVN��Y:o�N�v�gL=�>.�jR�tl�FG�{?�)Q�qh Config cfg; /* In case we need to read a username from the terminal before starting */ prompts_t *promptstatic void rlogin_startup(Rlogin rlogin, const char *ruser) { char z = 0; char *p; sk_write(rlogin->s, &z, 1); sk_write(rlogin->s, rlogin->cfg.localusername, strlen(rlogin->cfg.localusername)); sk_write(rlogin->s, &z, 1); sk_write(rlogin->s, ruser, strlen(ruser)); sk_write(rlogin->s, &z, 1); sk_write(rlogin->s, rlogin->cfg.termtype, strlen(rlogin->cfg.termtype)); sk_write(rlogin->s, "/", 1); for (p = rlogin->cfg.termspeed; isdigit((unsigned char)*p); p++) continue; sk_write(rlogin->s, rlogin->cfg.termspeed, p - rlogin->cfg.termspeed); rlogin->bufsize = sk_write(rlogin->s, &z, 1); rlogin->prompt = NULL char ruser[sizeof(cfg->username)]rlogin->prompt = NULL; rlogin->cfg = *cfg; /* STRUCTURE COPY *//* * Send local username, remote username, terminal type and * terminal speed - unless we don't have the remote username yet, * in which case we prompt for it and may end up deferring doing * anything else until the local prompt mechanism returns. */ if (get_remote_username(cfg, ruser, sizeof(ruser))) { rlogin_startup(rlogin, ruser); } else { int ret; rlogin->prompt = new_prompts(rlogin->frontend); rlogin->prompt->to_server = TRUE; rlogin->prompt->name = dupstr("Rlogin login name"); add_prompt(rlogin->prompt, dupstr("rlogin username: "), TRUE, sizeof(cfg->username)); ret = get_userpass_input(rlogin->prompt, NULL, 0); if (ret >= 0) { rlogin_startup(rlogin, rlogin->prompt->prompts[0]->result); prompt) free_prompts(rlogin->prompt);if (rlogin->prompt) { /* * We're still prompting for a username, and aren't talking * directly to the network connection yet. */ int ret = get_userpass_input(rlogin->prompt, (unsigned char *)buf, len); if (ret >= 0) { rlogin_startup(rlogin, rlogin->prompt->prompts[0]->result); /* that nulls out rlogin->prompt, so then we'll start sending * data down the wire in the obvious way */ } } else { rlogin->bufsize = sk_write(rlogin->s, buf, len); } Revision-number: 9097 Prop-content-length: 349 Content-length: 349 K 8 svn:date V 27 2011-02-20T14:59:00.440291Z K 7 svn:log V 248 Beginnings of a test suite for the bignum code. The output of testdata/bignum.py is twice the size of the rest of the PuTTY source put together, so I'm not checking it in. This reveals bugs in the new multiplication code, which I have yet to fix. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f78560343623c3fac2f379c9cc81ece3 Text-delta-base-sha1: 3bc4fbb83ae35ad229e18eb928e857bd0e427cea Text-content-length: 4739 Text-content-md5: 0ad5f61de37705461f3eef123c71e887 Text-content-sha1: cc6fcfa381d9af5191ffc385918680904a4a80c4 Content-length: 4739 SVN��RGL)���9�\w<�uR;�&FB�kS�_A�haJ�H.�w[+#ifdef KARA_DEBUG int i; #endif#ifdef KARA_DEBUG printf("a1,a0 = 0x"); for (i = 0; i < len; i++) { if (i == toplen) printf(", 0x"); printf("%0*x", BIGNUM_INT_BITS/4, a[i]); } printf("\n"); printf("b1,b0 = 0x"); for (i = 0; i < len; i++) { if (i == toplen) printf(", 0x"); printf("%0*x", BIGNUM_INT_BITS/4, b[i]); } printf("\n"); #endif /* a_1 b_1 */ internal_mul(a, b, c, toplen); #ifdef KARA_DEBUG printf("a1b1 = 0x"); for (i = 0; i < 2*toplen; i++) { printf("%0*x", BIGNUM_INT_BITS/4, c[i]); } printf("\n"); #endif#ifdef KARA_DEBUG printf("a0b0 = 0x"); for (i = 0; i < 2*botlen; i++) { printf("%0*x", BIGNUM_INT_BITS/4, c[2*toplen+i]); } printf("\n"); #endif#ifdef KARA_DEBUG printf("a1plusa0 = 0x"); for (i = 0; i < midlen; i++) { printf("%0*x", BIGNUM_INT_BITS/4, scratch[i]); } printf("\n"); #endif#ifdef KARA_DEBUG printf("b1plusb0 = 0x"); for (i = 0; i < midlen; i++) { printf("%0*x", BIGNUM_INT_BITS/4, scratch[midlen+i]); } printf("\n"); #endif#ifdef KARA_DEBUG printf("a1plusa0timesb1plusb0 = 0x"); for (i = 0; i < 2*midlen; i++) { printf("%0*x", BIGNUM_INT_BITS/4, scratch[2*midlen+i]); } printf("\n"); #endif#ifdef KARA_DEBUG printf("a1b1plusa0b0 = 0x"); for (i = 0; i < 2*midlen; i++) { printf("%0*x", BIGNUM_INT_BITS/4, scratch[i]); } printf("\n"); #endif#ifdef KARA_DEBUG printf("a1b0plusa0b1 = 0x"); for (i = 0; i < 2*midlen; i++) { printf("%0*x", BIGNUM_INT_BITS/4, scratch[2*midlen+i]); } printf("\n"); #endif#ifdef KARA_DEBUG printf("ab = 0x"); for (i = 0; i < 2*len; i++) { printf("%0*x", BIGNUM_INT_BITS/4, c[i]); } printf("\n"); #endif #ifdef TESTBN #include <stdio.h> #include <stdlib.h> #include <ctype.h> /* * gcc -g -O0 -DTESTBN -o testbn sshbn.c misc.c -I unix -I charset */ void modalfatalbox(char *p, ...) { va_list ap; fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); vfprintf(stderr, p, ap); va_end(ap); fputc('\n', stderr); exit(1); } #define fromxdigit(c) ( (c)>'9' ? ((c)&0xDF) - 'A' + 10 : (c) - '0' ) int main(int argc, char **argv) { char *buf; int line = 0; int passes = 0, fails = 0; while ((buf = fgetline(stdin)) != NULL) { int maxlen = strlen(buf); unsigned char *data = snewn(maxlen, unsigned char); unsigned char *ptrs[4], *q; int ptrnum; char *bufp = buf; line++; q = data; ptrnum = 0; while (*bufp) { char *start, *end; int i; while (*bufp && !isxdigit((unsigned char)*bufp)) bufp++; start = bufp; if (!*bufp) break; while (*bufp && isxdigit((unsigned char)*bufp)) bufp++; end = bufp; if (ptrnum >= lenof(ptrs)) break; ptrs[ptrnum++] = q; for (i = -((end - start) & 1); i < end-start; i += 2) { unsigned char val = (i < 0 ? 0 : fromxdigit(start[i])); val = val * 16 + fromxdigit(start[i+1]); *q++ = val; } ptrs[ptrnum] = q; } if (ptrnum == 3) { Bignum a = bignum_from_bytes(ptrs[0], ptrs[1]-ptrs[0]); Bignum b = bignum_from_bytes(ptrs[1], ptrs[2]-ptrs[1]); Bignum c = bignum_from_bytes(ptrs[2], ptrs[3]-ptrs[2]); Bignum p = bigmul(a, b); if (bignum_cmp(c, p) == 0) { passes++; } else { char *as = bignum_decimal(a); char *bs = bignum_decimal(b); char *cs = bignum_decimal(c); char *ps = bignum_decimal(p); printf("%d: fail: %s * %s gave %s expected %s\n", line, as, bs, ps, cs); fails++; sfree(as); sfree(bs); sfree(cs); sfree(ps); } freebn(a); freebn(b); freebn(c); freebn(p); } sfree(buf); sfree(data); } printf("passed %d failed %d total %d\n", passes, fails, passes+fails); return fails != 0; } #endif Node-path: putty/testdata/bignum.py Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2710 Text-content-md5: 031ee811502892c2008ecccf657d53b2 Text-content-sha1: f95e93c17bf2922e09848bb8f707e1c3c982d95a Content-length: 2720 PROPS-END SVN���# Generate test cases for a bignum implementation. import sys import mathlib def findprod(target, dir = +1, ratio=(1,1)): # Return two numbers whose product is as close as we can get to # 'target', with any deviation having the sign of 'dir', and in # the same approximate ratio as 'ratio'. r = mathlib.sqrt(target * ratio[0] * ratio[1]) a = r / ratio[1] b = r / ratio[0] if a*b * dir < target * dir: a = a + 1 b = b + 1 assert a*b * dir >= target * dir best = (a,b,a*b) while 1: improved = 0 a, b = best[:2] terms = mathlib.confracr(a, b, output=None) coeffs = [(1,0),(0,1)] for t in terms: coeffs.append((coeffs[-2][0]-t*coeffs[-1][0], coeffs[-2][1]-t*coeffs[-1][1])) for c in coeffs: # a*c[0]+b*c[1] is as close as we can get it to zero. So # if we replace a and b with a+c[1] and b+c[0], then that # will be added to our product, along with c[0]*c[1]. da, db = c[1], c[0] # Flip signs as appropriate. if (a+da) * (b+db) * dir < target * dir: da, db = -da, -db # Multiply up. We want to get as close as we can to a # solution of the quadratic equation in n # # (a + n da) (b + n db) = target # => n^2 da db + n (b da + a db) + (a b - target) = 0 A,B,C = da*db, b*da+a*db, a*b-target discrim = B^2-4*A*C if discrim > 0 and A != 0: root = mathlib.sqrt(discrim) vals = [] vals.append((-B + root) / (2*A)) vals.append((-B - root) / (2*A)) if root * root != discrim: root = root + 1 vals.append((-B + root) / (2*A)) vals.append((-B - root) / (2*A)) for n in vals: ap = a + da*n bp = b + db*n pp = ap*bp if pp * dir >= target * dir and pp * dir < best[2]*dir: best = (ap, bp, pp) improved = 1 if not improved: break return best def hexstr(n): s = hex(n) if s[:2] == "0x": s = s[2:] if s[-1:] == "L": s = s[:-1] return s # Tests of multiplication which exercise the propagation of the last # carry to the very top of the number. for i in range(1,4200): a, b, p = findprod((1<<i)+1, +1, (i, i*i+1)) print hexstr(a), hexstr(b), hexstr(p) a, b, p = findprod((1<<i)+1, +1, (i, i+1)) print hexstr(a), hexstr(b), hexstr(p) Revision-number: 9098 Prop-content-length: 249 Content-length: 249 K 7 svn:log V 148 Fix bug in Karatsuba multiplication, which affected propagation of a carry by more than one word. Now the current set of test cases all pass again. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-02-20T15:06:39.451358Z PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0ad5f61de37705461f3eef123c71e887 Text-delta-base-sha1: cc6fcfa381d9af5191ffc385918680904a4a80c4 Text-content-length: 31 Text-content-md5: 8673930c5443a0a0b36e2b2a7c500483 Text-content-sha1: 7f90ed9ba4e24f159c4217171dda495cefab6feb Content-length: 31 SVN��GX �u��\k j-- Revision-number: 9099 Prop-content-length: 406 Content-length: 406 K 8 svn:date V 27 2011-02-20T15:14:02.674336Z K 7 svn:log V 305 Nearly forgot. Reinstate the original unoptimised modpow, as a fallback for when Montgomery is inapplicable. (I may also at some point switch to using it for small exponents, if speed testing should reveal that there's a noticeable threshold beyond which preparing the Montgomery setup is uneconomical.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8673930c5443a0a0b36e2b2a7c500483 Text-delta-base-sha1: 7f90ed9ba4e24f159c4217171dda495cefab6feb Text-content-length: 1550 Text-content-md5: b0e1b910529733b91c0138a9b205aef2 Text-content-sha1: 1ba70c85fcbf40cd03604dbc57dc8c7c3b6cd021 Content-length: 1550 SVN��Xn_!��*�He�?�:L�{&`�^:q�V�,v�Uq�WE�p5A�+ �H, the pedestrian way. */ Bignum modpow_simple(Bignum base_in, Bignum exp, Bignum mod) { BignumInt *a, *b, *n, *m; int mshift; int mlen, i, j; Bignum base/* Allocate n of size mlen, copy base to n */ n = snewn(mlen, BignumInt); i = mlen - base[0]; for (j = 0; j < i; j++) n[j] = 0; for (j = 0; j < (int)base[0]; j++) n[i + j] = base[base[0] - j]; /* Allocate a and b of size 2*mlen. Set a = 1 */ a = snewn(2 * mlen, BignumInt); b = snewn(2 * mlen, BignumInt); for (i = 0; i < 2 * mlen; i++) a[i] = 0; a[2 * mlen - 1] = 1mlen, a + mlen, b, mlen); internal_mod(b, mlen * 2, m, mlen, NULL, 0); if ((exp[exp[0] - i] & (1 << j)) != 0) { internal_mul(b + mlen, n, a, mlen); internal_mod(a, mlen * 2, m, mlen, NULL, 0 Fixup result in case the modulus was shifted */ if (mshift) { for (i = mlen - 1; i < 2 * mmlen - 1] = a[2 * mlen - 1] << mshift; internal_mod(a, mlen * 2, m, mlen, NULL, 0); for (i = 2 * mlen - 1; i >=esult = newbn(mod[0]); for (i = 0; i < mlen; i++) result[result[0] - i] = a[i + mmlen; i++) a[i] = 0; sfree(a); for (i = 0; i < 2 * mlen; i++) b[i] = 0; sfree(b); for (i = 0; i < mlen; i++) m[i] = 0; sfree(m); for (i = 0; i < mlen; i++) n[i] = 0; sfree(n); freebn(base); return result; where possible, falling back to modpow_simple otherwisif (!(mod[1] & 1)) return modpow_simple(base_in, exp, mod Revision-number: 9100 Prop-content-length: 121 Content-length: 121 K 7 svn:log V 21 Add tests of modpow. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-02-20T15:27:48.372671Z PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b0e1b910529733b91c0138a9b205aef2 Text-delta-base-sha1: 1ba70c85fcbf40cd03604dbc57dc8c7c3b6cd021 Text-content-length: 1902 Text-content-md5: f3c161e5c17ba83642a201bc26a4f98d Text-content-sha1: 0d2f171e90239ef5791987f39bbc2cc6b8bdba48 Content-length: 1902 SVN��n#?!�V�T�S�pd�k[ �3R�cf\�T1�Q * Then feed to this program's standard input the output of * testdata/bignum.py .5 && !isspace((unsigned char)*bufp)) bufp++; if (bufp) *bufp++ = '\0'!strcmp(buf, "mul")) { Bignum a, b, c, p; if (ptrnum != 3) { printf("%d: mul with %d parameters, expected 3\n", line); exit(1); } a = bignum_from_bytes(ptrs[0], ptrs[1]-ptrs[0]); b = bignum_from_bytes(ptrs[1], ptrs[2]-ptrs[1]); c = bignum_from_bytes(ptrs[2], ptrs[3]-ptrs[2]); else if (!strcmp(buf, "pow")) { Bignum base, expt, modulus, expected, answer; if (ptrnum != 4) { printf("%d: mul with %d parameters, expected 3\n", line); exit(1); } base = bignum_from_bytes(ptrs[0], ptrs[1]-ptrs[0]); expt = bignum_from_bytes(ptrs[1], ptrs[2]-ptrs[1]); modulus = bignum_from_bytes(ptrs[2], ptrs[3]-ptrs[2]); expected = bignum_from_bytes(ptrs[3], ptrs[4]-ptrs[3]); answer = modpow(base, expt, modulus); if (bignum_cmp(expected, answerbase); char *bs = bignum_decimal(expt); char *cs = bignum_decimal(modulus); char *ds = bignum_decimal(answer); char *ps = bignum_decimal(expected); printf("%d: fail: %s ^ %s mod %s gave %s expected %s\n", line, as, bs, cs, ds, pds); sfree(ps); } freebn(base); freebn(expt); freebn(modulus); freebn(expected); freebn(answer); } else { printf("%d: unrecognised test keyword: '%s'\n", line, buf); exit(1); } Node-path: putty/testdata/bignum.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 031ee811502892c2008ecccf657d53b2 Text-delta-base-sha1: f95e93c17bf2922e09848bb8f707e1c3c982d95a Text-content-length: 447 Text-content-md5: dcaf8489ea121b26d3eb43304a88cf91 Text-content-sha1: e1dae7cf220579926a7fad90dbbde7e82b4d0480 Content-length: 447 SVN��;,��,"mul", hexstr(a), hexstr(b), hexstr(p) a, b, p = findprod((1<<i)+1, +1, (i, i+1)) print "mul", hexstr(a), hexstr(b), hexstr(p) # Simple tests of modpow. for i in range(64, 4097, 63): modulus = mathlib.sqrt(1<<(2*i-1)) | 1 base = mathlib.sqrt(3*modulus*modulus) % modulus expt = mathlib.sqrt(modulus*modulus*2/5) print "pow", hexstr(base), hexstr(expt), hexstr(modulus), hexstr(pow(base, expt, modulus)) Revision-number: 9101 Prop-content-length: 329 Content-length: 329 K 8 svn:date V 27 2011-02-20T15:42:44.636852Z K 7 svn:log V 228 A few more modpow tests, exercising the fallback option. This is mostly so I can valgrind both and make sure they free all their workspace - a memory leak in this code would be not merely an inconvenience but a security hazard. K 10 svn:author V 5 simon PROPS-END Node-path: putty/testdata/bignum.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dcaf8489ea121b26d3eb43304a88cf91 Text-delta-base-sha1: e1dae7cf220579926a7fad90dbbde7e82b4d0480 Text-content-length: 136 Text-content-md5: 988bd374a2900e59619de89e144bf9e9 Text-content-sha1: 26c2370891456b07c5f040905c1eadce129605a5 Content-length: 136 SVN��; s�;�s�_\ if i <= 1024: # Test even moduli, which can't be done by Montgomery. modulus = modulus - 1 Revision-number: 9102 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2011-02-20T15:45:23.004503Z K 7 svn:log V 96 svn:ignore property mentioning 'bignum.txt', which is what I'm calling the output of bignum.py. K 10 svn:author V 5 simon PROPS-END Node-path: putty/testdata Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 43 Content-length: 43 K 10 svn:ignore V 11 bignum.txt PROPS-END Revision-number: 9103 Prop-content-length: 491 Content-length: 491 K 8 svn:date V 27 2011-02-21T19:47:28.356463Z K 7 svn:log V 390 Move the malloc and free of scratch space out of the internal_mul routines into their callers, where they'll be done once for a whole modpow rather than many times within each multiply. Doesn't save much time as far as I can see - perhaps a couple of percent, one second in the minute it takes to run the new bignum test suite - but seems like a sensible idea anyway on general principles. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f3c161e5c17ba83642a201bc26a4f98d Text-delta-base-sha1: 0d2f171e90239ef5791987f39bbc2cc6b8bdba48 Text-content-length: 2419 Text-content-md5: 36cb740945b428cce115775a84886f48 Text-content-sha1: ff6c772f496d7cecee032d542bd308a9d49cb01b Content-length: 2419 SVN��#yqs�]�7�x[�[}�X�Ju�?�KN�7�5�"6�lX�VDJ�_4-�Zp�xG�4W�2g��p�%f�I�r�ix�GJ�mq�]�e"�7�;�&b�\=�'�H*�il�w�Z�@c * 'scratch' must point to an array of BignumInt of size at least * mul_compute_scratch(len). (This covers the needs of internal_mul * and all its recursive calls to itself.) */ #define KARATSUBA_THRESHOLD 50 static int mul_compute_scratch(int len) { int ret = 0; while (len > KARATSUBA_THRESHOLD) {ret += 4*midlen; len = midlen; } return ret; }, BignumInt *scratch, scratch, scratch, scratch + 4*, BignumInt *scratch /* * Scratch space for the various bits and pieces we're going * to be adding together: we need botlen*2 words for a_0 b_0 * (though we may end up throwing away its topmost word), and * toplen words for each of a_1 b_0 and a_0 b_1. That adds up * to exactly 2*len. */, scratch + 2*len); /* a_1 b_0 */ internal_mul_low(a, b + len - toplen, scratch + toplen, toplen, scratch + 2*, scratch + 2*BignumInt used as scratch space, of length at * least 3*len + mul_compute_scratch(len), tmp + 3*, tmp + 3*, *scratch; int mshift; int mlen, scratchcratch space for multiplies */ scratchlen = mul_compute_scratch(mlen); scratch = snewn(scratchmlen, a + mlen, b, mlen, scratch, scratchscratchlen; i++) scratch[i] = 0; sfree(scratchscratch; int len, scratch/* Scratch space for multiplies */ scratchlen = 3*len + mul_compute_scratch(len); scratch = snewn(scratch, scratch); monty_reduce(b, n, mninv, scratch, scratch); monty_reduce(a, n, mninv, scratchscratchscratchlen; i++) scratch[i] = 0; sfree(scratch, *scratch; int mshift, scratchlenScratch space for multiplies */ scratchlen = mul_compute_scratch(pqlen); scratch = snewn(scratchlen, BignumInt); /* Main computation */ internal_mul(n, o, a, pqlen, scratchscratchlen; i++) scratch[i] = 0; sfree(scratch);int wslen, * plus scratch space for multiplication */ wslen = mlen * 4 + mul_compute_scratch(mlen); workspace = snewn(wslen, workspace + 4 *for (i = 0; i < wslen; i++) workspace[i] = 0; Revision-number: 9104 Prop-content-length: 240 Content-length: 240 K 8 svn:date V 27 2011-02-22T00:06:12.917551Z K 7 svn:log V 139 Make bignum.py self-contained, by importing versions of the two functions I was depending on from my personal Python maths utility module. K 10 svn:author V 5 simon PROPS-END Node-path: putty/testdata/bignum.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 988bd374a2900e59619de89e144bf9e9 Text-delta-base-sha1: 26c2370891456b07c5f040905c1eadce129605a5 Text-content-length: 872 Text-content-md5: e366a9a8b64854191ab77efb795a30bc Text-content-sha1: 39471ea6fcf5cc7f8cb7b534ac3afe1f2346fdac Content-length: 872 SVN�� ":>�mM�B�)�Bg�_.�R;# Generate test cases for a bignum implementation. import sys # integer square roots def sqrt(n): d = long(n) a = 0L # b must start off as a power of 4 at least as large as n ndigits = len(hex(long(n))) b = 1L << (ndigits*4) while 1: a = a >> 1 di = 2*a + b if di <= d: d = d - di a = a + b b = b >> 2 if b == 0: break return a # continued fraction convergents of a rational def confrac(n, d): coeffs = [(1,0),(0,1)] while d != 0: i = n / d n, d = d, n % d coeffs.append((coeffs[-2][0]-i*coeffs[-1][0], coeffs[-2][1]-i*coeffs[-1][1])) return coeffscoeffs = confrac(a, bsqrt(1<<(2*i-1)) | 1 base = sqrt(3*modulus*modulus) % modulus expt = sqrt(modulus*modulus*2/5) Revision-number: 9105 Prop-content-length: 398 Content-length: 398 K 8 svn:date V 27 2011-02-22T19:09:27.168771Z K 7 svn:log V 297 Rejig the bottom-level loops in internal_mul_* to use pointers instead of array indices. You'd hope that compilers could automatically turn the one representation into the other if it was faster to do so, but apparently not: even on gcc -O3, this source transformation gains over 15% performance. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 36cb740945b428cce115775a84886f48 Text-delta-base-sha1: ff6c772f496d7cecee032d542bd308a9d49cb01b Text-content-length: 1811 Text-content-md5: 147829143bf705fbb4e1e9e4b52da58f Text-content-sha1: 9993139122b40723acca41e311972f83ccf48da7 Content-length: 1811 SVN��yW@E�B��b�XkL�5K�KH�U;�'RQ�WJ4�C6f (len > KARATSUBA_THRESHOLD) { int i;i = 0; i < toplen; i++) { scratch[midlen - toplen + i] = a[i]; /* a_1 */ scratch[2*midlen - toplen + i] = b[ii = 0; i < 2*toplen; i++) scratch[2*midlen - 2*toplen + i] = c[ii = 2*len - botlen - 2*midlen - 1; while (carry) { assert(i >= 0); carry += c[i]; c[i] = (BignumInt)carry; carry >>= BIGNUM_INT_BITS; i int i; BignumInt carry; BignumDblInt t; const BignumInt *ap, *bp; BignumInt *cp, *cps; /* * Multiply in the ordinary O(N^2) way. */ for (i = 0; i < 2 * len; i++) c[i] = 0; for (cps = c + 2*len, ap = a + len; ap-- > a; cps--) { carry = 0; for (cp = cps, bp = b + len; cp--, bp-- > b ;) { t = (MUL_WORD(*ap, *bp) + carry) + *cp; *cp = (BignumInt) t; carry = t >> BIGNUM_INT_BITS; } *cp = carryf (len > KARATSUBA_THRESHOLD) { int i;i = 0; i < botlen; i++) c[toplen + i] = scratch[2*toplen + botlen + i int i; BignumInt carry; BignumDblInt t; const BignumInt *ap, *bp; BignumInt *cp, *cps; /* * Multiply in the ordinary O(N^2) way. */ for (i = 0; i < len; i++) c[i] = 0; for (cps = c + len, ap = a + len; ap-- > a; cps--) { carry = 0; for (cp = cps, bp = b + len; bp--, cp-- > c ;) { t = (MUL_WORD(*ap, *bp) + carry) + *cp; *cp = (BignumInt) t; carry = t >> BIGNUM_INT_BITS; } } Revision-number: 9106 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9107 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9108 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9109 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9110 Prop-content-length: 256 Content-length: 256 K 8 svn:date V 27 2011-03-01T23:00:32.478477Z K 7 svn:log V 155 Use pid_t more consistently. Should shut up a warning from GCC 4.6, and may conceivably help on platforms where int and pid_t aren't sufficiently similar. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 95e1c9b98859f886f551e5f2707c19a6 Text-delta-base-sha1: b42e718b2451bff5ce147c7caee4f3d68f463bde Text-content-length: 102 Text-content-md5: 355b86ab12b1899bfd2c4542072af19e Text-content-sha1: e17ee8f7dca78c7db944c9dffb2c727591e9753e Content-length: 102 SVN��# 9���:�bZ�,T�5 �RQpid_pid_t a = *(pid_pid_t pty_utmp_helper_pid; static int Revision-number: 9111 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2011-03-01T23:04:37.094848Z K 7 svn:log V 67 Remove an unused variable (should shut up a warning from GCC 4.6). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a1e7c17e2192ba07e2a1f619323d310a Text-delta-base-sha1: 75deb186b7f6c73497b2ba9a41264a12cffc7d17 Text-content-length: 30 Text-content-md5: 08b53d2f896e2aa66c8d734cb082f340 Text-content-sha1: d13d5e70b35d9fecf214856d807995e293e89b69 Content-length: 30 SVN��z��V��3j�q- Revision-number: 9112 Prop-content-length: 192 Content-length: 192 K 8 svn:date V 27 2011-03-01T23:10:16.102449Z K 7 svn:log V 92 Add some "#ifdef OPTIMISE_SCROLL" scar tissue to placate GCC 4.6 -Wunused-but-set-variable. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5f7bdd21f84da0a4a9e66d87b3ba06a9 Text-delta-base-sha1: 13d826623427cb76ef2c0dfbe2165b4aaea3b350 Text-content-length: 403 Text-content-md5: 62262df12fb218583396a48a3b32684e Text-content-sha1: 4eb54341928cd9134a0897a996576ba65f79b43d Content-length: 403 SVN����t�0�t�\4; #ifdef OPTIMISE_SCROLL int olddisptop, shift; #endif /* OPTIMISE_SCROLL */ if (topline != 0 || term->alt_which != 0) sb = FALSE; #ifdef OPTIMISE_SCROLL olddisptop = term->disptop; shift = lines; #endif /* OPTIMISE_SCROLL */�%pp�%�_remote_charset) break; term->sco_acs = 1; break; case 12: /* SCO acs on, |0x80 */ co Revision-number: 9113 Prop-content-length: 190 Content-length: 190 K 7 svn:log V 90 Add some extra validation to zlib decompression (primarily to shut up a GCC 4.6 warning). K 10 svn:author V 5 jacob K 8 svn:date V 27 2011-03-01T23:44:06.685546Z PROPS-END Node-path: putty/sshzlib.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 78188ba29b0d06bee1158a3368899588 Text-delta-base-sha1: ca3c8ca51e26c8f638fff8492ebe5fbbcc5758b1 Text-content-length: 64 Text-content-md5: f4c0d7e787c69bbf6a2b2336c69fa149 Text-content-sha1: 7eb3422648e36a2ed8ce8ec407ba54b7c5c329eb Content-length: 64 SVN��W '�N��$3!= (nlen ^ 0xFFFF)) goto decode_error Revision-number: 9114 Prop-content-length: 243 Content-length: 243 K 8 svn:date V 27 2011-03-02T00:18:03.756810Z K 7 svn:log V 142 Fix probably-harmless type mismatch in nogss.c (and #include "putty.h" to stop it happening again; this was spotted by GCC's "-flto" option). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/nogss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e03c173e9862996a9dadc252d7f41dbd Text-delta-base-sha1: 966c1a3771d5712104ff2b5676e3d12b8d979790 Text-content-length: 171 Text-content-md5: b2e83a9dac26cf02b0f291dbde4b741c Text-content-sha1: dfe35f02e0548fe43102106ad8aa2c8c2e45c505 Content-length: 171 SVN��7��#include "putty.h" const int ngsslibs = 0; const char *const gsslibnames[1] = { "dummy" }; const struct keyval gsslibkeywords[1] = { { "dummy", 0 } }; Revision-number: 9115 Prop-content-length: 332 Content-length: 332 K 8 svn:date V 27 2011-03-02T18:52:03.236323Z K 7 svn:log V 231 Set the 'must_close_session' flag at the end of close_session(), so that we won't keep calling close_session() again the next time we go round the message loop. Should fix unclean-close-hang. Thanks to Simon Coleman for debugging. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e1470ebfa81c0de6c5c93ccea7197c9 Text-delta-base-sha1: 762921dce6e26414b53dbe4388e11b2db2276f59 Text-content-length: 732 Text-content-md5: 512f7fb0acab6b996ff1f638f6833427 Text-content-sha1: 78ececb9f44dc4a64e11dd45e18f09df84063305 Content-length: 732 SVN���� V�K�V�_J /* * Unset the 'must_close_session' flag, or else we'll come * straight back here the next time we go round the main message * loop - which, worse still, will be immediately (without * blocking) because we've just triggered a WM_SETTEXT by the * window title change above. */ must_close_session = FALSE;�'~WW�'�al" string. */ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, unsigned char *output) { BYTE keystate[256]; int scan, left_alt = 0, key_down, shift_state; int r, i, code; unsigned char *p = output; static int alt_sum = 0; HKL kbd_layout = GetKeyboardLayout(0); /* keys is for ToAsciiEx. Th Revision-number: 9116 Prop-content-length: 125 Content-length: 125 K 8 svn:date V 27 2011-03-02T19:08:04.018653Z K 7 svn:log V 25 Believed probably fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/unclean-close-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2dd4867a2b6791b37713b38c5fa1022a Text-delta-base-sha1: a6b128ef31f5e645d6345cbc5f7f51377a893512 Text-content-length: 302 Text-content-md5: 81c033e743605c69e8e171233260fd71 Text-content-sha1: 7de72fc5825e075f25fc56e4c052860be2f99a16 Content-length: 302 SVN��E`�E� <p> <b>SGT, 2011-03-02</b>: Committed r9115, which looks like a probable cause of this. I hesitate to mark the whole thing as fixed, but if anyone still experiences it, please try updating to r9115 or later; if anyone does see the problem in an updated version, please let us know. Revision-number: 9117 Prop-content-length: 489 Content-length: 489 K 8 svn:date V 27 2011-03-02T19:12:42.405206Z K 7 svn:log V 388 Colin Watson reports that gnome-session has been known to leave SIGPIPE ignored in its child processes, leading to unexpected behaviour inside pterms. (The gnome-session I'm sitting in front of doesn't seem to do this as far as I can tell, but I don't doubt there are some that do.) Add SIGPIPE to the list of signals we reset to default behaviour before launching pterm's child process. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 355b86ab12b1899bfd2c4542072af19e Text-delta-base-sha1: e17ee8f7dca78c7db944c9dffb2c727591e9753e Text-content-length: 380 Text-content-md5: 7d182aa6b3fb58570d349824a47401db Text-content-sha1: ce2a2f8e82c21aae526a73341a6f4bb4b75dc8e2 Content-length: 380 SVN��O`�A�`�.l, SIGQUIT and SIGPIPE may have been set to ignored by * our parent, particularly by things like sh -c 'pterm &' and * some window or session managers. SIGCHLD, meanwhile, was * blocked during pt_main() startup. Reverse all this for our * child process. */ putty_signal(SIGINT, SIG_DFL); putty_signal(SIGQUIT, SIG_DFL); putty_signal(SIGPIPE Revision-number: 9118 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9119 Prop-content-length: 131 Content-length: 131 K 8 svn:date V 27 2011-03-04T09:00:22.411479Z K 7 svn:log V 31 Update an out-of-date SVN URL. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/accept-host-keys Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 876a9f0c62a8f1cab6e8e5ec7ef23325 Text-delta-base-sha1: dd64f78a1f9c8e73074fa5ab38072a49403785ff Text-content-length: 58 Text-content-md5: 3aac6ac6f0a06b1a885869f5d8592b8e Text-content-sha1: 49f95ce92fb2c71bc8b517792cb4366d07db8194 Content-length: 58 SVN�� %�[��| <a href="http://svn.tartarus.org/sgt Revision-number: 9120 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2011-03-04T22:34:47.937916Z K 7 svn:log V 99 Implement zlib@openssh.com, using the rekey-after-userauth method suggested in the wishlist entry. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73f0fffff1610ca108a6d4b633ae48a3 Text-delta-base-sha1: e52e48edd5018eacc7decc64cd0bc9c84cee1d60 Text-content-length: 5971 Text-content-md5: 62717f71b838b751d6c71597cbfca360 Text-content-sha1: cdde96154fe5171f91982c12dd73e6238628689a Content-length: 5971 SVN���� �a��` NULL���^@�T�N�M�HQ�Ky;�J�41H�=e�&3�\:��m#�[} userauth_succeeded; /* for delayed compression */ int pending_compression s->userauth_succeeded = FALSE; s->pending_compressio, * then server->client compression algorithms. (We use the * same set twice.) */ for (j = 0; j < 2; j++) { ssh2_pkt_addstring_start(s->pktout); assert(lenof(compressions) > 1); /* Prefer non-delayed versions */ ssh2_pkt_addstring_str(s->pktout, s->preferred_comp->name); /* We don't even list delayed versions of algorithms until * they're allowed to be used, to avoid a race. See the end of * this function. */ if (s->userauth_succeeded && s->preferred_comp->delayed_name) { s->preferred_comp->delayed_name); } for (i = 0; i < lenof(compressions); i++) { const struct ssh_compress *c = compressions[i]; if (c != s->preferred_comp) { ssh2_pkt_addstring_str(s->pktout, ","); ssh2_pkt_addstring_str(s->pktout, c->name); if (s->userauth_succeeded && c->delayed_name) { ssh2_pkt_addstring_str(s->pktout, ","); ssh2_pkt_addstring_str(s->pktout, c->delayed_name); } } else if (in_commasep_string(c->delayed_name, str, len)) { if (s->userauth_succeeded) { s->cscomp_tobe = c; break; } else { s->pending_compression = TRUE; /* try this later */ } else if (in_commasep_string(c->delayed_name, str, len)) { if (s->userauth_succeeded) { s->sccomp_tobe = c; break; } else { s->pending_compression = TRUE; /* try this later */ } } } if (s->pending_compression) { logevent("Server supports delayed compression; " "will try this later"); negative * inlen==-1 means always initiate a rekey; * inlen==-2 means that userauth has completed successfully and * we should consider rekeying (for delayed compression)< 0 if (inlen == -2) { /* * authconn has seen a USERAUTH_SUCCEEDED. Time to enable * delayed compression, if it's available. * * draft-miller-secsh-compression-delayed-00 says that you * negotiate delayed compression in the first key exchange, and * both sides start compressing when the server has sent * USERAUTH_SUCCESS. This has a race condition -- the server * can't know when the client has seen it, and thus which incoming * packets it should treat as compressed. * * Instead, we do the initial key exchange without offering the * delayed methods, but note if the server offers them; when we * get here, if a delayed method was available that was higher * on our list than what we got, we initiate a rekey in which we * _do_ list the delayed methods (and hopefully get it as a * result). Subsequent rekeys will do the same. */ assert(!s->userauth_succeeded); /* should only happen once */ s->userauth_succeeded = TRUE; if (!s->pending_compression) /* Can't see any point rekeying. */ goto wait_for_rekey; /* this is utterly horrid */ /* else fall through to rekey... */ s->pending_compression = FALSE; } /* * Now we've decided to rekey. still�$b9Ep�wWD�[�wW�4��s4�Q$�rd�'} } else if (c->type == CHAN_AGENT) { sshfwd_close(c); } else if (c->type == CHAN_SOCKDATA) { pfd_close(c->u.pfd.s); c->u.pfd.s = NULL; sshfwd_close(c); } } static void ssh2_msg_channel_close(Ssh ssh, struct Packet *pktin) {/* Do pre-close processing on the channel. */ switch (c->type) { case CHAN_MAINSESSION: ssh->mainchan = NULL; update_specials_menu(ssh->frontend); break; case CHAN_X11: if (c->u.x11.s != NULL) x11_close(c->u.x11.s); sshfwd_close(c); break; case CHAN_AGENT: sshfwd_close(c); break; case CHAN_SOCKDATA: if (c->u.pfd.s != NULL) pfd_close(c->u.pfd.s); sshfwd_close(c); break; } if (c->closes == 0) { del234(ssh->channels, c); bufchain_clear(&c->v.v2.outbuffer); sfree(c); /* * See if that was the last channel left open. * (This is only our termination condition if we're * not running in -N mode.) */ if (!ssh->cfg.ssh_no_shell && count234(ssh->channels) == 0) { /* * We used to send SSH_MSG_DISCONNECT here, * because I'd believed that _every_ conforming * SSH-2 connection had to end with a disconnect * being sent by at least one side; apparently * I was wrong and it's perfectly OK to * unceremoniously slam the connection shut * when you're done, and indeed OpenSSH feels * this is more polite than sending a * DISCONNECT. So now we don't. */ ssh_disconnect(ssh, "All channels closed", NULL, 0, TRUE); } } static void ssh2_msg_channel_open_confirmation(Ssh ssh, struct Packet *pktin) {if (c->type != CHAN_SOCKDATA_DORMANT) return; /* dunno why they're confirming this */ c->remoteid = ssh_pkt_getuint32(pktin); c->halfopen = FALSE; c->type = CHAN_SOCKDATA; c->v.v2.remwindow = ssh_pkt_getuint32(pktin); c->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin); if (c->u.pfd.s) pfd_confirm(c->u.pfd.s); if (c->closes) { /* * We have a pending close on this channel, * which we decided on before the server acked * the channel open. So now we know the * remoteid, we can close it again. , userauth_successs->userauth_successs->userauth_successif (s->userauth_success) { /* * We've just received USERAUTH_SUCCESS, and we haven't sent any * packets since. Signal the transport layer to consider enacting * delayed compression. * * (Relying on we_are_in is not sufficient, as * draft-miller-secsh-compression-delayed is quite clear that it * triggers on USERAUTH_SUCCESS specifically, and we_are_in can * become set for other reasons.) */ do_ssh2_transport(ssh, "enabling delayed compression", -2, NULL); } Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a6a5600b26b0f67436dde7b5a4ed36f9 Text-delta-base-sha1: 45db434c0770f3a8407039c527b646f91438c23d Text-content-length: 163 Text-content-md5: 03cd3dddd9f117c6902b7897dcdc4ca4 Text-content-sha1: fa12fbb23d7a467b487291557622addbfa76139b Content-length: 163 SVN��I\ �� �M|/* For zlib@openssh.com: if non-NULL, this name will be considered once * userauth has completed successfully. */ char *delayed_ Node-path: putty/sshzlib.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f4c0d7e787c69bbf6a2b2336c69fa149 Text-delta-base-sha1: 7eb3422648e36a2ed8ce8ec407ba54b7c5c329eb Text-content-length: 66 Text-content-md5: 23fcd9d70ff79ec70590e3f83bb00885 Text-content-sha1: ebb6e6f7194cce2bee51decaa8a6b808a3325858 Content-length: 66 SVN��G )�A��]<"zlib@openssh.com", /* delayed version */ Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1b4f3d80927dd9e9a895169b80f459a2 Text-delta-base-sha1: fbedd85895a2434d9a721b427914a45a7413a4a8 Text-content-length: 176 Text-content-md5: 488de87adc880b8686ed95857df5767f Text-content-sha1: d7b5d17230238d49522279ecc5a2049e4fe9a73f Content-length: 176 SVN��z �Z��.Lli>Independent drafts: <ul> <li><a href="http://tools.ietf.org/html/draft-miller-secsh-compression-delayed">draft-miller-secsh-compression-delayed Node-path: putty-wishlist/data/zlib-openssh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d9bf408ea144fe4edc2f6c702e2f80c7 Text-delta-base-sha1: 336787881985bb1c0c67f8adc26e3f8b918b29c4 Text-content-length: 315 Text-content-md5: 44b8b420c916433e85a4dd3e2a852fe1 Text-content-sha1: 9db04a0f8d775a8d5dac6b43e7e2d9efc648046a Content-length: 315 SVN��v1�X��gW(�U![Fixed-in: r9120 2011-03-05only this by default (or with the "Compression delayed" option in sshd_config), which means that PuTTY cannot negotiate compression; ordinary "zlib" compression can be <p> <em>Update, 2011-03-05:</em> this is now supported, using the method described above. Revision-number: 9121 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2011-03-05T00:35:43.686523Z K 7 svn:log V 58 Unless I'm mistaken, this was fixed nearly two years ago. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/windows-utf16 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 36e616cb9ce28bb43c9b2f326e9c0a1c Text-delta-base-sha1: 70abebe64d55bd247431da8a2f59f71fd6f8b2e8 Text-content-length: 111 Text-content-md5: 271e505c5e41138948491dfca095c3df Text-content-sha1: 4a2e21dd19ff8ecca8754d6791c7d14f1360aa59 Content-length: 111 SVN��R- Z�P��O@Fixed-in: r8495 2009-03-25 <p> <em>Update, 2009-03:</em> fixed (using the second option). Revision-number: 9122 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9123 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2011-03-06T00:48:28.265491Z K 7 svn:log V 84 One independent confirmation (as will as the fixer), so I'm claiming this as fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unclean-close-hang Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 81c033e743605c69e8e171233260fd71 Text-delta-base-sha1: 7de72fc5825e075f25fc56e4c052860be2f99a16 Text-content-length: 333 Text-content-md5: dfc24978d9dba67c1b3b7913a49088d4 Text-content-sha1: fac89aca4d4d14639c4f85ac10ca216b15407d4b Content-length: 333 SVN��` 4�0��/Fixed-in: r9115 2011-03-03Update, 2011-03-02</b>: Committed r9115, which looks like a probable cause of this; it's made it go away for at least two people, so we've counted it as fixed despite never being able to reproduce it; if anyone still sees the problem with a version after r9115, please let us know. Revision-number: 9124 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9125 Prop-content-length: 161 Content-length: 161 K 7 svn:log V 61 Note the possibility of a pause due to /dev/random blocking. K 10 svn:author V 5 jacob K 8 svn:date V 27 2011-03-09T18:10:47.398431Z PROPS-END Node-path: putty/doc/man-pg.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 946a376817c7e66bdd170987766d859e Text-delta-base-sha1: 066e1c955dfb9923710911207a03a4e0ad0da027 Text-content-length: 248 Text-content-md5: 4cdaaecccd21d4af75b62633acf49d3c Text-content-sha1: 73db2d770c6606169236676c21bf05ea1926e5ea Content-length: 248 SVN��B `�u�`�2Note that generating a key requires random data (from \c{/dev/random}), which can cause \c{puttygen} to pause, possibly for some time if your system does not have much randomness available. The options to control this phase Revision-number: 9126 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9127 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9128 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9129 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9130 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9131 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9132 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9133 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9134 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9135 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9136 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9137 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9138 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9139 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9140 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9141 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9142 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9143 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9144 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9145 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9146 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9147 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9148 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9149 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2011-04-08T15:52:02.097094Z K 7 svn:log V 69 The documentation was still claiming that we don't support x11-auth. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/using.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 43506484be16e4c89786bc58396ab7ff Text-delta-base-sha1: 8e7f00dca7a0b49316bc1cdb59d07f7d553655bb Text-content-length: 23 Text-content-md5: 56acab5719d632997216c9bf9d6023c5 Text-content-sha1: b6fbed3d456f9652905baaefa9fb27097e76dc04 Content-length: 23 SVN��AQ ����3 Revision-number: 9150 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9151 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9152 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9153 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9154 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9155 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9156 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9157 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9158 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9159 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9160 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9161 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9162 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9163 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9164 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9165 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9166 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9167 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9168 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9169 Prop-content-length: 252 Content-length: 252 K 10 svn:author V 5 simon K 8 svn:date V 27 2011-05-07T10:57:19.074894Z K 7 svn:log V 151 Fixes (mostly from Colin Watson, a couple redone by me) to make Unix PuTTY compile cleanly under gcc 4.6.0 without triggering any of its new warnings. PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8cf91242c670b6e1a0dd9abd82593303 Text-delta-base-sha1: 5bf8f630e7847b18614918c0318744ae11abe6c1 Text-content-length: 1724 Text-content-md5: eae79c8cd6f8b1ad2eecd5799efef2e5 Text-content-sha1: f874f1a7362ccf38bde84676e6fdcbb87956e037 Content-length: 1724 SVN���9�Z�E@� val = NULL; if (!strcmp(opt, "-help")) { if (val) { errs = TRUE; fprintf(stderr, "puttygen: option `-%s'" " expects no argument\n", opt); } else { help(); nogo = TRUE; } } else if (!strcmp(opt, "-version")) { if (val) { errs = TRUE; fprintf(stderr, "puttygen: option `-%s'" " expects no argument\n", opt); } else { showversion(); nogo = TRUE; } } else if (!strcmp(opt, "-pgpfp")) { if (val) { errs = TRUE; fprintf(stderr, "puttygen: option `-%s'" " expects no argument\n", opt); } else { /* support --pgpfp for consistency */ pgp_fingerprints(); nogo = TRUE; } } /* * For long options requiring an argument, add * code along the lines of { * errs = TRUE; * fprintf(stderr, "puttygen: option `-%s'" * " expects an argument\n", opt); * } Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ec742e6f54a8e137f0cadf86e0cb456 Text-delta-base-sha1: 7a9de9a1e03cbf971d14b2f86ab856bb104d3aa2 Text-content-length: 186 Text-content-md5: 3f488895df8966ebb328569c5c827360 Text-content-sha1: faddee00b4bb96e70298ccd4405dc5f3b3cfb5ca Content-length: 186 SVN�� S�N�� T�M?=0; tempType = levels[0]; while (i < count) { if (levels[i] > tempType) tempType = levels[i]; i++; } /* maximum level in tempType Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 62717f71b838b751d6c71597cbfca360 Text-delta-base-sha1: cdde96154fe5171f91982c12dd73e6238628689a Text-content-length: 134 Text-content-md5: 6de5bace8ba7541d1c278d7d9df1eed3 Text-content-sha1: 8abd4352232178a28876a125184ec06545cc037e Content-length: 134 SVN����������������bEK�8�K�B /* XXX maybe we should actually take notice of the return value */ Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 62262df12fb218583396a48a3b32684e Text-delta-base-sha1: 4eb54341928cd9134a0897a996576ba65f79b43d Text-content-length: 65 Text-content-md5: 0bca3d5a64478b8341decf905bd33166 Text-content-sha1: 40c1999084e3806958f6ceb6a7f43bdc8c3bad6e Content-length: 65 SVN���������.$����\,�^!��L1�~ Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e8319569816844f3078e0030766e344b Text-delta-base-sha1: c285a0a1e3a24fadeb5282126cf3456f34a8b37c Text-content-length: 1599 Text-content-md5: 2ed0edb0bf2ea68415e61142043862d5 Text-content-sha1: 0e62375e2368f8defbeadaffa2af51ed315e2b76 Content-length: 1599 SVN���������b�%~�u��s7�J=j��0�%= \ { \ menuitem = gtk_menu_item_new_with_label(title); \ gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \ gtk_widget_show(menuitem); \ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \ GTK_SIGNAL_FUNC(func), inst); \ } while (0) #define MKSUBMENU(title) do \ { \ menuitem = gtk_menu_item_new_with_label(title); \ gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \ gtk_widget_show(menuitem); \ } while (0) #define MKSEP() do \ { \ menuitem = gtk_menu_item_new(); \ gtk_container_add(GTK_CONTAINER(inst->menu), menuitem); \ gtk_widget_show(menuitem); \ } while (0) SEP(SEP(); if (use_event_log) MKMENUITEM("Event Log", event_log_menuitem); MKSUBMENU("Special Commands"SEP(SEP(); s = dupcat("About ", appname, NULL); MKMENUITEM(s, about_menuitem); sfree(s); #undef MKMENUITEM #undef MKSUBMENU #undef MKSEP Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 254aa1ccdd8bf7909905d6918fe5f75e Text-delta-base-sha1: 85da0ec5e20b593824bb8c1f5fef4877d5528455 Text-content-length: 28 Text-content-md5: 13d63f076f7102bd906b318e849a39b8 Text-content-sha1: 71945d3a1c1558065cc3296db55011d7aef2336c Content-length: 28 SVN��o��q��X�&b Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ad222c4ba37ea0696c1103ed3e0e6a6 Text-delta-base-sha1: 4a468c09575ceb4f4d55f78fd33fc9d34c959f7e Text-content-length: 130 Text-content-md5: f7cfc2b136376e354380c8c9d1549ce5 Text-content-sha1: b1c084ea7953224342638c6a7430b762eba565db Content-length: 130 SVN��| l�a�l�/i /* * FIXME: what should we do if this returns an error? */ serial_configure(serial, cfg); Revision-number: 9170 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9171 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9172 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9173 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9174 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9175 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9176 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9177 Prop-content-length: 347 Content-length: 347 K 8 svn:date V 27 2011-06-08T20:39:06.262048Z K 7 svn:log V 246 When we fail to get a response from Pageant, we should log the fact. Currently, if the IPC exchange goes wrong, the Event Log just prints "Pageant is running. Requesting keys." and then goes on to the next step without ever saying what happened. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6de5bace8ba7541d1c278d7d9df1eed3 Text-delta-base-sha1: 8abd4352232178a28876a125184ec06545cc037e Text-content-length: 299 Text-content-md5: 8a2b23f5335a36ab755b56454dbac272 Text-content-sha1: 4fe13eebd1532e06eb57be388be3f8ac28f2138b Content-length: 299 SVN����������� N�a�N�Q\ else { logevent("Failed to get reply from Pageant"); �EdS��E�-annel ourselves. */ x11_close(c->u.x11.s); c->u.x11.s = NULL; sshfwd_close(c); else { logevent("Failed to get reply from Pageant"); Revision-number: 9178 Prop-content-length: 772 Content-length: 772 K 8 svn:date V 27 2011-06-08T20:47:07.944429Z K 7 svn:log V 671 Make Pageant use the same SID-selection logic as the Pageant client code (as introduced in r9043), so that it uses the user SID rather than the default SID. This does change the access-control model, in that a Pageant running with administrator privilege will now serve keys to an unprivileged PuTTY running as the same user who started Pageant. Owen and I think this isn't a problem (in particular, it will still not serve keys to a _different_ user). More importantly, making the Pageant client and server code work the same way means that PuTTY and Pageant can still talk to each other when UAC is turned off, which we've had several reports of r9043 having broken. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d38c5dbd0ceda8ac46005e185033a4bc Text-delta-base-sha1: 330bb79ee97fa08eb49cac8ee8299fd9c186785a Text-content-length: 1061 Text-content-md5: 6ec62b8127b6ce6571eca3d24ed3ce2c Text-content-sha1: b8b85e304698f31c8368d6358d2df26bebe830ac Content-length: 1061 SVN��,:]�<�o�;:�Z{�  �?#N�,J�^�<Zifdef DEBUG_IPC #define _WIN32_WINNT 0x0500 /* for ConvertSidToStringSid */ #include <sddl.h> #endifexternPSID mapowner, ourself if ((ourself = get_user_sid()) == NULL) { #ifdef DEBUG_IPC debug(("couldn't get user SID\n")); #endif return 0; } ("couldn't get owner info for filemap: %d\n", rc)); #endif return 0; } #ifdef DEBUG_IPC { LPTSTR ours, theirs; ConvertSidToStringSid(mapowner, &theirs); ConvertSidToStringSid(ourself, &ours); debug(("got both sids: ours=%s theirs=%s\n", ours, theirs)); LocalFree(ours); LocalFree(theirs); } #endif if (!EqualSid(mapowner, ourself("p[%d]=%02x\n", i, ((unsigned char *) p)[i])); if (!init_advapi() Node-path: putty/windows/winpgntc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56ce13ce7233a9a9284b008843c11732 Text-delta-base-sha1: 84f516ac979be90f6c91cea64b6f3f8857ba1331 Text-content-length: 1586 Text-content-md5: 30358f320b50f1160a8b4f63c4f063de Text-content-sha1: 6cee836ed9ad035434b92c2fec94a487d6ea24bf Content-length: 1586 SVN��C20v�#�3�]*�p1�Or�ygJ�.�CM0DECL_WINDOWS_FUNCTION(, DWORD, GetSecurityInfo, (HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION, PSID *, PSID *, PACL *, PACL *, PSECURITY_DESCRIPTOR *)); GET_WINDOWS_FUNCTION(advapi, GetSecurityInfo) PSID get_user_sid(void) { HANDLE proc = NULL, tok = NULL; TOKEN_USER *user = NULL; DWORD toklen, sidlen; PSID sid = NULL, ret = NULL; if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE, GetCurrentProcessId())) == NULL) goto cleanup; if (!p_OpenProcessToken(proc, TOKEN_QUERY, &tok)) goto cleanup; if (!p_GetTokenInformation(tok, TokenUser, NULL, 0, &toklen) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) goto cleanup; if ((user = (TOKEN_USER *)LocalAlloc(LPTR, toklen)) == NULL) goto cleanup; if (!p_GetTokenInformation(tok, TokenUser, user, toklen, &toklen)) goto cleanup; sidlen = GetLengthSid(user->User.Sid); sid = (PSID)smalloc(sidlen); if (!CopySid(sidlen, sid, user->User.Sid)) goto cleanup; /* Success. Move sid into the return value slot, and null it out * to stop the cleanup code freeing it. */ ret = sid; sid = NULL; cleanup: if (proc != NULL) CloseHandle(proc); if (tok != NULL) CloseHandle(tok); if (user != NULL) LocalFree(user); if (sid != NULL) sfree(sid); return ret; } PSID usersid usersid = get_user_sid(); psa = NULL; if (usersidssfree(usersid Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f0a124befc3a5bdd7f01c5f8367d5c2f Text-delta-base-sha1: f28fab8f6e0e124a61f58187b153456d89552ef3 Text-content-length: 295 Text-content-md5: 425525f105e1eaf4e14bff0a2c99e430 Text-content-sha1: a9c5857625d5e23402795049778641890235eca0 Content-length: 295 SVN��1:�(��8-�T]winpgwinpgntc.c also exports these two functions which are used by the * server side of Pageant as well, to get the user SID for comparing * with clients'. */ int init_advapi(void); /* initialises everything needed by get_user_sid */ PSID get_user_sid(void); Revision-number: 9179 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9180 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2011-06-23T11:57:16.404843Z K 7 svn:log V 88 Mark Bannister points out that the list of programs Pageant is useful with omits PSFTP. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 90a29a1c082bca5c6d0ca0f96b1b8016 Text-delta-base-sha1: 9f645d7104191c4d540e862be6d1d3025bd71bfe Text-content-length: 31 Text-content-md5: d762e0f9939e84834f7bcd347f7fd371 Text-content-sha1: 8db60fd2b5380eb34bb20767338684173db8ef22 Content-length: 31 SVN��/7 � ��" , PSFTP, Revision-number: 9181 Prop-content-length: 650 Content-length: 650 K 8 svn:date V 27 2011-06-25T17:37:31.842468Z K 7 svn:log V 549 Rewrite gprefs() in settings.c so that its input mapping includes information about where to put items that aren't mentioned in the saved configuration. So far the only nontrivial use I've made of this facility is to default to placing KEX_RSA just above KEX_WARN in the absence of any other information, which should fix 'ssh2-rsa-kex-pref'. While I'm here I've rewritten wprefs() on general principles to remove the needless length limit, since I was touching it anyway. The length limit is still in gprefs (but I've lengthened it just in case). K 10 svn:author V 5 simon PROPS-END Node-path: putty/nogss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b2e83a9dac26cf02b0f291dbde4b741c Text-delta-base-sha1: dfe35f02e0548fe43102106ad8aa2c8c2e45c505 Text-content-length: 70 Text-content-md5: 1f584e05ef69ac8a707f99de73ea6071 Text-content-sha1: eea18372f8c46d6aaabf5de84761dead9a962071 Content-length: 70 SVN��7D6��where gsslibkeywords[1] = { { "dummy", 0, -1, -1 } }; Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 699b2791aad0fc84fe2dbe938bf0ba5b Text-delta-base-sha1: 7ad2ca20059367abea314645d8dcb68ae99ceb49 Text-content-length: 1673 Text-content-md5: 8528d87b37907198f751b23e22b0c5a2 Text-content-sha1: e1d66c95ace72ab0390ca6434cb4017695eb7072 Content-length: 1673 SVN��y n�s�n�5Dwhere { /* * Two fields which define a string and enum value to be * equivalent to each other. */ char *s; int v; /* * The next pair of fields are used by gprefs() in settings.c to * arrange that when it reads a list of strings representing a * preference list and translates it into the corresponding list * of integers, strings not appearing in the list are entered in a * configurable position rather than uniformly at the end. */ /* * 'vrel' indicates which other value in the list to place this * element relative to. It should be a value that has occurred in * a 'v' field of some other element of the array, or -1 to * indicate that we simply place relative to one or other end of * the list. * * gprefs will try to process the elements in an order which makes * this field work (i.e. so that the element referenced has been * added before processing this one). */ int vrel; /* * 'where' indicates whether to place the new value before or * after the one referred to by vrel. -1 means before; +1 means * after. * * When vrel is -1, this also implicitly indicates which end of * the array to use. So vrel=-1, where=-1 means to place _before_ * some end of the list (hence, at the last element); vrel=-1, * where=+1 means to place _after_ an end (hence, at the first). */ int where; }; #ifndef NO_GSSAPI extern const int ngsslibs; extern const char *const gsslibnames[]; /* for displaying in configuration */ extern const struct keyvalwhere gsslibkeywords[]; /* for Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 383f752dbb17c61c30464072175a8611 Text-delta-base-sha1: 2dc06da5ab96ef4446623f89c68f424e5cbf2e15 Text-content-length: 3584 Text-content-md5: 3ad795f592b98894f27fc85344714f8c Text-content-sha1: d372ce0147c5f4d81952fce5296d715a26dcce3a Content-length: 3584 SVN��Q1(J���G�:i�E-�yiB�T}where ciphernames[] = { { "aes", CIPHER_AES, -1, -1 }, { "blowfish", CIPHER_BLOWFISH, -1, -1 }, { "3des", CIPHER_3DES, -1, -1 }, { "WARN", CIPHER_WARN, -1, -1 }, { "arcfour", CIPHER_ARCFOUR, -1, -1 }, { "des", CIPHER_DES, -1, -1 } }; static const struct keyvalwhere kexnames[] = { { "dh-gex-sha1", KEX_DHGEX, -1, -1 }, { "dh-group14-sha1", KEX_DHGROUP14, -1, -1 }, { "dh-group1-sha1", KEX_DHGROUP1, -1, -1 }, { "rsa", KEX_RSA, KEX_WARN, -1 }, { "WARN", KEX_WARN, -1, -1where *mapping, where *mapping, where *mapping, int nvals, int *array) { char commalist[256]; char *p, *q; int i, j, n, v, pos; unsigned long seen = 0; /* bitmap for weeding dups etc */ /* * Fetch the string which we'll parse as a comma-separated list. */ gpps(sesskey, name, def, commalist, sizeof(commalist)); /* * Go through that list and convert it into values. */ n = 0; p = commalist; while (1) { while (*p && *p == ',') p++; if (!*p) break; /* no more words */ q = p; while (*p && *p != ',') p++; if (*p) *p++ = '\0'; v = key2val(mapping, nvals, q); if (v != -1 && !(seen & (1 << v))) { seen |= (1 << v); array[n++] = v; } } /* * Now go through 'mapping' and add values that weren't mentioned * in the list we fetched. We may have to loop over it multiple * times so that we add values before other values whose default * positions depend on them. */ while (n < nvals) { for (i = 0; i < nvals; i++) { assert(mapping[i].v < 32); if (!(seen & (1 << mapping[i].v))) { /* * This element needs adding. But can we add it yet? */ if (mapping[i].vrel != -1 && !(seen & (1 << mapping[i].vrel))) continue; /* nope */ /* * OK, we can work out where to add this element, so * do so. */ if (mapping[i].vrel == -1) { pos = (mapping[i].where < 0 ? n : 0); } else { for (j = 0; j < n; j++) if (array[j] == mapping[i].vrel) break; assert(j < n); /* implied by (seen & (1<<vrel)) */ pos = (mapping[i].where < 0 ? j : j+1); } /* * And add it. */ for (j = n-1; j >= pos; j--) array[j+1] = array[j]; array[pos] = mapping[i].v; n++; } where *mapping, int nvals, int *array) { char *buf, *p; int i, maxlen; for (maxlen = i = 0; i < nvals; i++) { const char *s = val2key(mapping, nvals, array[i]); if (s) { maxlen += 1 + strlen(s); } } buf = snewn(maxlen, char); p = buf; for (i = 0; i < nvals; i++) { const char *s = val2key(mapping, nvals, array[i]); if (s) { p += sprintf(p, "%s%s", (p > buf ? "," : ""), s); } } assert(p - buf == maxlen - 1); /* maxlen counted the NUL */ write_setting_s(sesskey, name, buf); sfree( Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 340bd9b2e8f8f15391acb928d95b79cb Text-delta-base-sha1: f4083eeecddef99a45edd51b33f8bc09a2c091b0 Text-content-length: 232 Text-content-md5: 158c67e673abfe51b016501400243009 Text-content-sha1: 8eeb370940781f02af25a955f038547b78c83f52 Content-length: 232 SVN��BJ���'�@Pwhere gsslibkeywords[] = { { "libgssapi", 0, -1, -1 }, { "libgssapi_krb5", 1, -1, -1 }, { "libgss", 2, -1, -1 }, { "custom", 3, -1, -1where gsslibkeywords[] = { { "static", 0, -1, -1 Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 725fcd12bc43b2116e724eb571cab893 Text-delta-base-sha1: 5da73b7f73820258eac962805e46108b9407a67e Text-content-length: 132 Text-content-md5: 701a5a29b636068ee44d828cb0117a3b Text-content-sha1: 781b2ccfa2830742fa4d81759c8f0801e2e07f2c Content-length: 132 SVN��?\ n�~�n�pOwhere gsslibkeywords[] = { { "gssapi32", 0, -1, -1 }, { "sspi", 1, -1, -1 }, { "custom", 2, -1, -1 Revision-number: 9182 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2011-06-25T17:44:30.392033Z K 7 svn:log V 17 Just fixed this. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/ssh2-rsa-kex-pref Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e7ff70a7c4b0853dfecaa536c30c7f2 Text-delta-base-sha1: a473ed927d22c49b8c0f38a4e8bf0833c01f0e7e Text-content-length: 245 Text-content-md5: bb85f66f37579f8716f72dbb6265107c Text-content-sha1: e00568284233e851915c0ec7a3e5855d95b3cd48 Content-length: 245 SVN��_< \���MMFixed-in: r9181 <p><b>sgt, 2011-06-25</b>: introduced a mechanism for specifying the default position of new items in a preference list as just before or after some existing item, which is good enough to solve this one. Revision-number: 9183 Prop-content-length: 212 Content-length: 212 K 8 svn:date V 27 2011-07-01T21:01:46.169882Z K 7 svn:log V 111 Wishlist now has separate sections for bugs that were found and fixed before they ever made it into a release. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 21c683b481c72cc3f954b64199e9d265 Text-delta-base-sha1: fb3ac033bacc0aefb7599974248b1c478261546e Text-content-length: 1305 Text-content-md5: ab507c148d64ecb63911332cc00f7091 Text-content-sha1: 88faf1186a6ea789413b90b96cc7abdeea356852 Content-length: 1305 SVN��/lx� �y�Y^�{4my $oldclass = undef; foreach my $class (sort compareverclass_s (keys %fixedvers)) { if (defined($oldclass)) { # Pull out bugs that never affected any release, only snapshots. # We occasionally like to track these in the wishlist, but # we don't want to give the impression that they were in # release N-1 by listing them as "fixed" in release N. # # We assume only things that can be described as "breakage" # (i.e., bugs) will be listed in this class, and in any case # most users don't care about these, so we don't bother to # classify them further. nest(<<EOF); <h3>Broken and fixed between $oldclass and $class</h3> <ul> EOF # This horror wouldn't work too well if # $oldclass = "current snapshots". Fortunately, it never will. my @tmp = grep(grep(($_ eq $oldclass), map(classifyver($_), (split / /,$bugs{$_}->{hdrs}->{"absent-in"}))), @{$fixedvers{$class}}); subtractbugs(\@fullbuglist, printbugs(\@tmp)); unnest("</ul>\n"); } # Keep track of "previous" release. add_release_fixes() should # have ensured there are no gaps. $oldclass = $class Revision-number: 9184 Prop-content-length: 176 Content-length: 176 K 7 svn:log V 76 Rearrange so that all the interesting stuff is at the top. No other change. K 10 svn:author V 5 jacob K 8 svn:date V 27 2011-07-01T21:48:01.694185Z PROPS-END Node-path: putty-wishlist/data/winadj-success Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a65f0e84afe3ba6bb8e2f172de2d39ef Text-delta-base-sha1: ba36c7b96b4f7c0a467bf96e9c67cc900deb890f Text-content-length: 25 Text-content-md5: 6c6ca6f3e897b35db87ed2040be6d8de Text-content-sha1: c39a0c407104da3178b9f273a5b595aaac8fee71 Content-length: 25 SVN��ff��s��ss��n Revision-number: 9185 Prop-content-length: 484 Content-length: 484 K 10 svn:author V 5 jacob K 8 svn:date V 27 2011-07-01T21:53:41.972576Z K 7 svn:log V 383 Fix 'winadj-success': since at least one server (boks_sshd) blithely responds to "winadj@putty.projects.tartarus.org" with SSH_MSG_CHANNEL_SUCCESS despite probably having no idea what it means, treat this just the same as SSH_MSG_CHANNEL_FAILURE instead of killing the connection. Tested only as far as making sure that winadj/FAILURE with a normal server isn't _completely_ broken. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a2b23f5335a36ab755b56454dbac272 Text-delta-base-sha1: 4fe13eebd1532e06eb57be388be3f8ac28f2138b Text-content-length: 1089 Text-content-md5: 9d2fc634403340b76c2d0d4b45ea37f5 Text-content-sha1: 876d3b4147af4917809995a75289a7d7d4028845 Content-length: 1089 SVN�����������6"� ��W>�9K�X7�WT�E~�*�4int ssh2_handle_winadj_response(struct ssh_channel *c) { struct winadj *wa = c->v.v2.winadj_head; if (!wa) return FALSE; return TRUE, are sent before this handler gets * installed, or are "winadj@putty" requests, which servers should * never respond to with success. * * However, at least one server ("boks_sshd") is known to return * SUCCESS for channel requests it's never heard of, such as * "winadj@putty". Raised with foxt.com as bug 090916-090424, but * for the sake of a quiet life, we handle it just the same as the * expected FAILURE. */ if (!ssh2_handle_winadj_response(c))ssh2_handle_winadj_response(c))�d77�d� ssh_throttle_conn(ssh, +1); } } } static void ssh2_msg_channel_eof(Ssh ssh, struct Packet *pktin) { struct ssh_channel *c; c = ssh2_channel_msg(ssh, pktin); if (!c) return; if (c->type == CHAN_X11) { /* * Remote EOF on an X11 channel means we should * wrap up and close the ch Node-path: putty-wishlist/data/winadj-success Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6c6ca6f3e897b35db87ed2040be6d8de Text-delta-base-sha1: c39a0c407104da3178b9f273a5b595aaac8fee71 Text-content-length: 499 Text-content-md5: acc86f5dfff1c4e464d5237aac7170c5 Text-content-sha1: 8c0aa858b19a432a44ae5cac6caec5c030c27a54 Content-length: 499 SVN��f1N�7��Z6s�OA�cFixed-in: r9185 2011-07-02 only people using development snapshots, or third-party code incorporating development code, should have seen thisThe obvious workaround for this server's behaviour is to just ignore the protocol error, and quietly treat a (bogus) SUCCESS response to "winadj@putty" the same as a FAILURE response -- it won't do any harm, since all we're interested in is when the server replies; we don't actually care about the content. So we did tha Revision-number: 9186 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2011-07-01T23:46:29.544097Z K 7 svn:log V 63 Oops. Found-and-fixed-between-releases bugs were listed twice. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ab507c148d64ecb63911332cc00f7091 Text-delta-base-sha1: 88faf1186a6ea789413b90b96cc7abdeea356852 Text-content-length: 132 Text-content-md5: b2efbbc4b3ed77aea0bd9de5d5a0bafb Text-content-sha1: 183de92987a693f5ffa76d70f9dc96b8e932a0ad Content-length: 132 SVN��l, l�J�l�vvprintbugs(\@tmp); subtractbugs($fixedvers{$class}, \@tmp); subtractbugs(\@fullbuglist, \@tmp Revision-number: 9187 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2011-07-05T12:41:19.861386Z K 7 svn:log V 52 FoxT report that boks_sshd was fixed some time ago. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winadj-success Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: acc86f5dfff1c4e464d5237aac7170c5 Text-delta-base-sha1: 8c0aa858b19a432a44ae5cac6caec5c030c27a54 Text-content-length: 465 Text-content-md5: cffcec8b6aed78b169decc22b505ecc4 Text-content-sha1: f7fef4b710ecabb0f2dacb4303d5a6fcb88811e3 Content-length: 465 SVN��1~ 9�,�9�cknowledged this server issue (case 090916-090424). It was fixed in BoKS 6.5.4, released on June 2, 2010. <p> The obvious workaround for the behaviour of old versions of this server behaviour is to just ignore the protocol error, and quietly treat a (bogus) SUCCESS response to "winadj@putty" the same as a FAILURE response -- it won't do any harm, since all we're interested in is when the server replies; we don't actually care about the Revision-number: 9188 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9189 Prop-content-length: 236 Content-length: 236 K 8 svn:date V 27 2011-07-10T11:45:52.554483Z K 7 svn:log V 135 Generate some checksum files with more up-to-date hash functions than MD5. Shipped (and signed) alongside the existing 'md5sums' file. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ea5749cc4d428a70ac9829e37093b24 Text-delta-base-sha1: 0d98916d6a04782f56a8763688e016aadafb4853 Text-content-length: 533 Text-content-md5: b9a68b6ed2f3b4bd1da8a96a88698c01 Text-content-sha1: 38cba639eafb285c90a7a28a4502a0c46bdb9ea8 Content-length: 533 SVN��_X }�K�}�OCreate files of cryptographic checksums, which will be signed along # with the files they verify. We've provided MD5 checksums for a # while, but now MD5 is looking iffy, we're expanding our selection. # # Creating these files is most easily done in the destination # directory, where all the files we're delivering are already in their # final relative layout. in-dest putty do a=`\find * -type f -print`; md5sum $$a > md5sums && sha1sum $$a > sha1sums && sha256sum $$a > sha256sums && sha512sum $$a > sha512 Node-path: putty/sign.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6df67e30e5f20ffd41cb7de2a516b37e Text-delta-base-sha1: 6b6b016fc25456682ffc6fffaa1314a869fe5947 Text-content-length: 237 Text-content-md5: f73e4dd04320d8fbdc800921e6db18be Text-content-sha1: 60cf8262abf0d942364b8ad24067ac337d37461b Content-length: 237 SVN��R9 U�s�u�q8`h sign.sh <builddir> <keytype> # e.g. sh sign.sh putty Snapshots (probably in the build.out directory) # or shfor i in md5sums sha1sums sha256sums sha512sums; do sign --clearsign $i ${i}.$t done done Revision-number: 9190 Prop-content-length: 301 Content-length: 301 K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-10T11:49:12.907144Z K 7 svn:log V 200 Should have marked this as (believed) fixed weeks ago, when I committed r9178. (In fact, I _should_ have done so when I committed r9043, though I'd then have had to add an embarrassing retraction :-) PROPS-END Node-path: putty-wishlist/data/cygwin-clobbers-pageant Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dab9c23298a5801c02c0bc17bebc101c Text-delta-base-sha1: a9e67b75935d83c53edd917853641a428fe60226 Text-content-length: 377 Text-content-md5: 9b7f3791b6b8ecf15aa7d0929fb8649f Text-content-sha1: c12e347484939c480aaaba4f4661018ff57ad187 Content-length: 377 SVN��d `� ��w QFixed-in: r9178 <p> <b>SGT, 2011-07-10</b>: this <em>should</em> be fixed in r9178 (which in turn fixes a bug introduced by r9043 which was my first attempt to fix this). Both PuTTY and Pageant now use the SID corresponding to the current user account for their access control, whether or not that account is also a member of the administrators group. Revision-number: 9191 Prop-content-length: 265 Content-length: 265 K 7 svn:log V 164 Add a directory 'contrib/cygtermd', containing the source code for my hacky helper program to let PuTTY act as a local pterm-oid on Cygwin-enabled Windows systems. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-10T14:22:32.317297Z PROPS-END Node-path: putty/contrib/cygtermd Node-kind: dir Node-action: add Prop-content-length: 45 Content-length: 45 K 10 svn:ignore V 13 cygtermd.exe PROPS-END Node-path: putty/contrib/cygtermd/Makefile Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 120 Text-content-md5: c595ab2cca4d49e01939afa00b25f0b2 Text-content-sha1: 34909dea191fdd0832488aaea09833a261504bff Content-length: 130 PROPS-END SVN���mmmcygtermd.exe: main.c sel.c telnet.c pty.c malloc.c gcc -o cygtermd.exe main.c sel.c telnet.c pty.c malloc.c Node-path: putty/contrib/cygtermd/README Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 536 Text-content-md5: bc28524d5c4c2a06f7ade368fa39c891 Text-content-sha1: db4f2921e74b61cbba2df99045cbf62459cd6c53 Content-length: 546 PROPS-END SVN���  This directory contains 'cygtermd', a small and specialist Telnet server designed to act as middleware between PuTTY and a Cygwin shell session running on the same machine, so that PuTTY can act as an xterm-alike for Cygwin. To install it, you must compile it from source using Cygwin gcc, install it in Cygwin's /bin, and configure PuTTY to use it as a local proxy process. For detailed instructions, see the PuTTY Wishlist page at http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/cygwin-terminal-window.html Node-path: putty/contrib/cygtermd/main.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 3600 Text-content-md5: 466e2de109dfe97c7a4772fea7c384cd Text-content-sha1: d584333d9f5f7beccb12650b4c6283f2842cb1aa Content-length: 3610 PROPS-END SVN���/* * Main program. */ #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <stdarg.h> #include <signal.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include "sel.h" #include "pty.h" #include "telnet.h" int signalpipe[2]; sel *asel; sel_rfd *netr, *ptyr, *sigr; int ptyfd; sel_wfd *netw, *ptyw; Telnet telnet; #define BUF 65536 void sigchld(int signum) { write(signalpipe[1], "C", 1); } void fatal(const char *fmt, ...) { va_list ap; fprintf(stderr, "FIXME: "); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); exit(1); } void net_readdata(sel_rfd *rfd, void *data, size_t len) { if (len == 0) exit(0); /* EOF on network - client went away */ telnet_from_net(telnet, data, len); if (sel_write(netw, NULL, 0) > BUF) sel_rfd_freeze(ptyr); if (sel_write(ptyw, NULL, 0) > BUF) sel_rfd_freeze(netr); } void net_readerr(sel_rfd *rfd, int error) { fprintf(stderr, "standard input: read: %s\n", strerror(errno)); exit(1); } void net_written(sel_wfd *wfd, size_t bufsize) { if (bufsize < BUF) sel_rfd_unfreeze(ptyr); } void net_writeerr(sel_wfd *wfd, int error) { fprintf(stderr, "standard input: write: %s\n", strerror(errno)); exit(1); } void pty_readdata(sel_rfd *rfd, void *data, size_t len) { if (len == 0) exit(0); /* EOF on pty */ telnet_from_pty(telnet, data, len); if (sel_write(netw, NULL, 0) > BUF) sel_rfd_freeze(ptyr); if (sel_write(ptyw, NULL, 0) > BUF) sel_rfd_freeze(netr); } void pty_readerr(sel_rfd *rfd, int error) { if (error == EIO) /* means EOF, on a pty */ exit(0); fprintf(stderr, "pty: read: %s\n", strerror(errno)); exit(1); } void pty_written(sel_wfd *wfd, size_t bufsize) { if (bufsize < BUF) sel_rfd_unfreeze(netr); } void pty_writeerr(sel_wfd *wfd, int error) { fprintf(stderr, "pty: write: %s\n", strerror(errno)); exit(1); } void sig_readdata(sel_rfd *rfd, void *data, size_t len) { char *p = data; while (len > 0) { if (*p == 'C') { int status; pid_t pid = waitpid(-1, &status, WNOHANG); if (WIFEXITED(status) || WIFSIGNALED(status)) exit(0); /* child process vanished */ } } } void sig_readerr(sel_rfd *rfd, int error) { fprintf(stderr, "signal pipe: read: %s\n", strerror(errno)); exit(1); } int main(int argc, char **argv) { int ret; int shell_started = 0; char *directory = NULL; char **program_args = NULL; if (argc > 1 && argv[1][0]) { directory = argv[1]; argc--, argv++; } if (argc > 1) { program_args = argv + 1; } pty_preinit(); asel = sel_new(NULL); netr = sel_rfd_add(asel, 0, net_readdata, net_readerr, NULL); netw = sel_wfd_add(asel, 1, net_written, net_writeerr, NULL); ptyr = sel_rfd_add(asel, -1, pty_readdata, pty_readerr, NULL); ptyw = sel_wfd_add(asel, -1, pty_written, pty_writeerr, NULL); telnet = telnet_new(netw, ptyw); if (pipe(signalpipe) < 0) { perror("pipe"); return 1; } sigr = sel_rfd_add(asel, signalpipe[0], sig_readdata, sig_readerr, NULL); signal(SIGCHLD, sigchld); do { struct shell_data shdata; ret = sel_iterate(asel, -1); if (!shell_started && telnet_shell_ok(telnet, &shdata)) { ptyfd = run_program_in_pty(&shdata, directory, program_args); sel_rfd_setfd(ptyr, ptyfd); sel_wfd_setfd(ptyw, ptyfd); shell_started = 1; } } while (ret == 0); return 0; } Node-path: putty/contrib/cygtermd/malloc.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 622 Text-content-md5: 5188e2d878b6e86246542a2f2b5aa534 Text-content-sha1: 0f76b04529b9a3e6a8ebb15748cd0f2ff3d12e7f Content-length: 632 PROPS-END SVN���```/* * malloc.c: implementation of malloc.h */ #include <stdlib.h> #include <string.h> #include "malloc.h" extern void fatal(const char *, ...); void *smalloc(size_t size) { void *p; p = malloc(size); if (!p) { fatal("out of memory"); } return p; } void sfree(void *p) { if (p) { free(p); } } void *srealloc(void *p, size_t size) { void *q; if (p) { q = realloc(p, size); } else { q = malloc(size); } if (!q) fatal("out of memory"); return q; } char *dupstr(const char *s) { char *r = smalloc(1+strlen(s)); strcpy(r,s); return r; } Node-path: putty/contrib/cygtermd/malloc.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1500 Text-content-md5: ba2d2785734466e6afa7c42c71f86eab Text-content-sha1: e23337640266df44083289b79a2091964c43e0d8 Content-length: 1510 PROPS-END SVN���NNN/* * malloc.h: safe wrappers around malloc, realloc, free, strdup */ #ifndef UMLWRAP_MALLOC_H #define UMLWRAP_MALLOC_H #include <stddef.h> /* * smalloc should guarantee to return a useful pointer - Halibut * can do nothing except die when it's out of memory anyway. */ void *smalloc(size_t size); /* * srealloc should guaranteeably be able to realloc NULL */ void *srealloc(void *p, size_t size); /* * sfree should guaranteeably deal gracefully with freeing NULL */ void sfree(void *p); /* * dupstr is like strdup, but with the never-return-NULL property * of smalloc (and also reliably defined in all environments :-) */ char *dupstr(const char *s); /* * snew allocates one instance of a given type, and casts the * result so as to type-check that you're assigning it to the * right kind of pointer. Protects against allocation bugs * involving allocating the wrong size of thing. */ #define snew(type) \ ( (type *) smalloc (sizeof (type)) ) /* * snewn allocates n instances of a given type, for arrays. */ #define snewn(number, type) \ ( (type *) smalloc ((number) * sizeof (type)) ) /* * sresize wraps realloc so that you specify the new number of * elements and the type of the element, with the same type- * checking advantages. Also type-checks the input pointer. */ #define sresize(array, number, type) \ ( (void)sizeof((array)-(type *)0), \ (type *) srealloc ((array), (number) * sizeof (type)) ) #endif /* UMLWRAP_MALLOC_H */ Node-path: putty/contrib/cygtermd/pty.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 3927 Text-content-md5: 14e5df4676a56f1757d9a67ca4d8632b Text-content-sha1: c23d9c4a39dfd7cd0a8bf8951130dee4e69a59ab Content-length: 3937 PROPS-END SVN���III/* * pty.c - pseudo-terminal handling */ #define _XOPEN_SOURCE #include <features.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> #include <sys/ioctl.h> #include <sys/types.h> #include <pwd.h> #include "pty.h" #include "malloc.h" static char ptyname[FILENAME_MAX]; int master = -1; void pty_preinit(void) { /* * Allocate the pty. */ master = open("/dev/ptmx", O_RDWR); if (master < 0) { perror("/dev/ptmx: open"); exit(1); } if (grantpt(master) < 0) { perror("grantpt"); exit(1); } if (unlockpt(master) < 0) { perror("unlockpt"); exit(1); } } void pty_resize(int w, int h) { struct winsize sz; assert(master >= 0); sz.ws_row = h; sz.ws_col = w; sz.ws_xpixel = sz.ws_ypixel = 0; ioctl(master, TIOCSWINSZ, &sz); } int run_program_in_pty(const struct shell_data *shdata, char *directory, char **program_args) { int slave, pid; char *fallback_args[2]; assert(master >= 0); ptyname[FILENAME_MAX-1] = '\0'; strncpy(ptyname, ptsname(master), FILENAME_MAX-1); #if 0 { struct winsize ws; struct termios ts; /* * FIXME: think up some good defaults here */ if (!ioctl(0, TIOCGWINSZ, &ws)) ioctl(master, TIOCSWINSZ, &ws); if (!tcgetattr(0, &ts)) tcsetattr(master, TCSANOW, &ts); } #endif slave = open(ptyname, O_RDWR | O_NOCTTY); if (slave < 0) { perror("slave pty: open"); return 1; } /* * Fork and execute the command. */ pid = fork(); if (pid < 0) { perror("fork"); return 1; } if (pid == 0) { int i, fd; /* * We are the child. */ close(master); fcntl(slave, F_SETFD, 0); /* don't close on exec */ dup2(slave, 0); dup2(slave, 1); if (slave != 0 && slave != 1) close(slave); dup2(1, 2); setsid(); setpgrp(); i = 0; #ifdef TIOCNOTTY if ((fd = open("/dev/tty", O_RDWR)) >= 0) { ioctl(fd, TIOCNOTTY, &i); close(fd); } #endif #ifdef TIOCSCTTY ioctl(0, TIOCSCTTY, &i); #endif tcsetpgrp(0, getpgrp()); for (i = 0; i < shdata->nenvvars; i++) putenv(shdata->envvars[i]); if (shdata->termtype) putenv(shdata->termtype); if (directory) chdir(directory); /* * Use the provided shell program name, if the user gave * one. Failing that, use $SHELL; failing that, look up * the user's default shell in the password file; failing * _that_, revert to the bog-standard /bin/sh. */ if (!program_args) { char *shell; shell = getenv("SHELL"); if (!shell) { const char *login; uid_t uid; struct passwd *pwd; /* * For maximum generality in the face of multiple * /etc/passwd entries with different login names and * shells but a shared uid, we start by using * getpwnam(getlogin()) if it's available - but we * insist that its uid must match our real one, or we * give up and fall back to getpwuid(getuid()). */ uid = getuid(); login = getlogin(); if (login && (pwd = getpwnam(login)) && pwd->pw_uid == uid) shell = pwd->pw_shell; else if ((pwd = getpwuid(uid))) shell = pwd->pw_shell; } if (!shell) shell = "/bin/sh"; fallback_args[0] = shell; fallback_args[1] = NULL; program_args = fallback_args; } execv(program_args[0], program_args); /* * If we're here, exec has gone badly foom. */ perror("exec"); exit(127); } close(slave); return master; } Node-path: putty/contrib/cygtermd/pty.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 628 Text-content-md5: bde3d7aba043fb355e52bdd44031059f Text-content-sha1: a9c6899b5f6665d725baa360f5171fc55f54d151 Content-length: 638 PROPS-END SVN���fff/* * pty.h - FIXME */ #ifndef FIXME_PTY_H #define FIXME_PTY_H #include "telnet.h" /* for struct shdata */ /* * Called at program startup to actually allocate a pty, so that * we can start passing in resize events as soon as they arrive. */ void pty_preinit(void); /* * Set the terminal size for the pty. */ void pty_resize(int w, int h); /* * Start a program in a subprocess running in the pty we allocated. * Returns the fd of the pty master. */ int run_program_in_pty(const struct shell_data *shdata, char *directory, char **program_args); #endif /* FIXME_PTY_H */ Node-path: putty/contrib/cygtermd/sel.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 8088 Text-content-md5: 8263cd709d25fda0a5e6a75607b39a5e Text-content-sha1: 1a95b56bc8e4d4d3c9c7ed2fe101539dc3bc07ca Content-length: 8098 PROPS-END SVN���  /* * sel.c: implementation of sel.h. */ #include <stddef.h> #include <string.h> #include <errno.h> #include <assert.h> #include <fcntl.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #include <sys/select.h> #include "sel.h" #include "malloc.h" /* ---------------------------------------------------------------------- * Chunk of code lifted from PuTTY's misc.c to manage buffers of * data to be written to an fd. */ #define BUFFER_GRANULE 512 typedef struct bufchain_tag { struct bufchain_granule *head, *tail; size_t buffersize; /* current amount of buffered data */ } bufchain; struct bufchain_granule { struct bufchain_granule *next; size_t buflen, bufpos; char buf[BUFFER_GRANULE]; }; static void bufchain_init(bufchain *ch) { ch->head = ch->tail = NULL; ch->buffersize = 0; } static void bufchain_clear(bufchain *ch) { struct bufchain_granule *b; while (ch->head) { b = ch->head; ch->head = ch->head->next; sfree(b); } ch->tail = NULL; ch->buffersize = 0; } static size_t bufchain_size(bufchain *ch) { return ch->buffersize; } static void bufchain_add(bufchain *ch, const void *data, size_t len) { const char *buf = (const char *)data; if (len == 0) return; ch->buffersize += len; if (ch->tail && ch->tail->buflen < BUFFER_GRANULE) { size_t copylen = BUFFER_GRANULE - ch->tail->buflen; if (copylen > len) copylen = len; memcpy(ch->tail->buf + ch->tail->buflen, buf, copylen); buf += copylen; len -= copylen; ch->tail->buflen += copylen; } while (len > 0) { struct bufchain_granule *newbuf; size_t grainlen = BUFFER_GRANULE; if (grainlen > len) grainlen = len; newbuf = snew(struct bufchain_granule); newbuf->bufpos = 0; newbuf->buflen = grainlen; memcpy(newbuf->buf, buf, grainlen); buf += grainlen; len -= grainlen; if (ch->tail) ch->tail->next = newbuf; else ch->head = ch->tail = newbuf; newbuf->next = NULL; ch->tail = newbuf; } } static void bufchain_consume(bufchain *ch, size_t len) { struct bufchain_granule *tmp; assert(ch->buffersize >= len); while (len > 0) { size_t remlen = len; assert(ch->head != NULL); if (remlen >= ch->head->buflen - ch->head->bufpos) { remlen = ch->head->buflen - ch->head->bufpos; tmp = ch->head; ch->head = tmp->next; sfree(tmp); if (!ch->head) ch->tail = NULL; } else ch->head->bufpos += remlen; ch->buffersize -= remlen; len -= remlen; } } static void bufchain_prefix(bufchain *ch, void **data, size_t *len) { *len = ch->head->buflen - ch->head->bufpos; *data = ch->head->buf + ch->head->bufpos; } /* ---------------------------------------------------------------------- * The actual implementation of the sel interface. */ struct sel { void *ctx; sel_rfd *rhead, *rtail; sel_wfd *whead, *wtail; }; struct sel_rfd { sel *parent; sel_rfd *prev, *next; sel_readdata_fn_t readdata; sel_readerr_fn_t readerr; void *ctx; int fd; int frozen; }; struct sel_wfd { sel *parent; sel_wfd *prev, *next; sel_written_fn_t written; sel_writeerr_fn_t writeerr; void *ctx; int fd; bufchain buf; }; sel *sel_new(void *ctx) { sel *sel = snew(struct sel); sel->ctx = ctx; sel->rhead = sel->rtail = NULL; sel->whead = sel->wtail = NULL; return sel; } sel_wfd *sel_wfd_add(sel *sel, int fd, sel_written_fn_t written, sel_writeerr_fn_t writeerr, void *ctx) { sel_wfd *wfd = snew(sel_wfd); wfd->written = written; wfd->writeerr = writeerr; wfd->ctx = ctx; wfd->fd = fd; bufchain_init(&wfd->buf); wfd->next = NULL; wfd->prev = sel->wtail; if (sel->wtail) sel->wtail->next = wfd; else sel->whead = wfd; sel->wtail = wfd; wfd->parent = sel; return wfd; } sel_rfd *sel_rfd_add(sel *sel, int fd, sel_readdata_fn_t readdata, sel_readerr_fn_t readerr, void *ctx) { sel_rfd *rfd = snew(sel_rfd); rfd->readdata = readdata; rfd->readerr = readerr; rfd->ctx = ctx; rfd->fd = fd; rfd->frozen = 0; rfd->next = NULL; rfd->prev = sel->rtail; if (sel->rtail) sel->rtail->next = rfd; else sel->rhead = rfd; sel->rtail = rfd; rfd->parent = sel; return rfd; } size_t sel_write(sel_wfd *wfd, const void *data, size_t len) { bufchain_add(&wfd->buf, data, len); return bufchain_size(&wfd->buf); } void sel_wfd_setfd(sel_wfd *wfd, int fd) { wfd->fd = fd; } void sel_rfd_setfd(sel_rfd *rfd, int fd) { rfd->fd = fd; } void sel_rfd_freeze(sel_rfd *rfd) { rfd->frozen = 1; } void sel_rfd_unfreeze(sel_rfd *rfd) { rfd->frozen = 0; } int sel_wfd_delete(sel_wfd *wfd) { sel *sel = wfd->parent; int ret; if (wfd->prev) wfd->prev->next = wfd->next; else sel->whead = wfd->next; if (wfd->next) wfd->next->prev = wfd->prev; else sel->wtail = wfd->prev; bufchain_clear(&wfd->buf); ret = wfd->fd; sfree(wfd); return ret; } int sel_rfd_delete(sel_rfd *rfd) { sel *sel = rfd->parent; int ret; if (rfd->prev) rfd->prev->next = rfd->next; else sel->rhead = rfd->next; if (rfd->next) rfd->next->prev = rfd->prev; else sel->rtail = rfd->prev; ret = rfd->fd; sfree(rfd); return ret; } void sel_free(sel *sel) { while (sel->whead) sel_wfd_delete(sel->whead); while (sel->rhead) sel_rfd_delete(sel->rhead); sfree(sel); } void *sel_get_ctx(sel *sel) { return sel->ctx; } void sel_set_ctx(sel *sel, void *ctx) { sel->ctx = ctx; } void *sel_wfd_get_ctx(sel_wfd *wfd) { return wfd->ctx; } void sel_wfd_set_ctx(sel_wfd *wfd, void *ctx) { wfd->ctx = ctx; } void *sel_rfd_get_ctx(sel_rfd *rfd) { return rfd->ctx; } void sel_rfd_set_ctx(sel_rfd *rfd, void *ctx) { rfd->ctx = ctx; } int sel_iterate(sel *sel, long timeout) { sel_rfd *rfd; sel_wfd *wfd; fd_set rset, wset; int maxfd = 0; struct timeval tv, *ptv; char buf[65536]; int ret; FD_ZERO(&rset); FD_ZERO(&wset); for (rfd = sel->rhead; rfd; rfd = rfd->next) { if (rfd->fd >= 0 && !rfd->frozen) { FD_SET(rfd->fd, &rset); if (maxfd < rfd->fd + 1) maxfd = rfd->fd + 1; } } for (wfd = sel->whead; wfd; wfd = wfd->next) { if (wfd->fd >= 0 && bufchain_size(&wfd->buf)) { FD_SET(wfd->fd, &wset); if (maxfd < wfd->fd + 1) maxfd = wfd->fd + 1; } } if (timeout < 0) { ptv = NULL; } else { ptv = &tv; tv.tv_sec = timeout / 1000; tv.tv_usec = 1000 * (timeout % 1000); } do { ret = select(maxfd, &rset, &wset, NULL, ptv); } while (ret < 0 && (errno == EINTR || errno == EAGAIN)); if (ret < 0) return errno; /* * Just in case one of the callbacks destroys an rfd or wfd we * had yet to get round to, we must loop from the start every * single time. Algorithmically irritating, but necessary * unless we want to store the rfd structures in a heavyweight * tree sorted by fd. And let's face it, if we cared about * good algorithmic complexity it's not at all clear we'd be * using select in the first place. */ do { for (wfd = sel->whead; wfd; wfd = wfd->next) if (wfd->fd >= 0 && FD_ISSET(wfd->fd, &wset)) { void *data; size_t len; FD_CLR(wfd->fd, &wset); bufchain_prefix(&wfd->buf, &data, &len); ret = write(wfd->fd, data, len); assert(ret != 0); if (ret < 0) { if (wfd->writeerr) wfd->writeerr(wfd, errno); } else { bufchain_consume(&wfd->buf, len); if (wfd->written) wfd->written(wfd, bufchain_size(&wfd->buf)); } break; } } while (wfd); do { for (rfd = sel->rhead; rfd; rfd = rfd->next) if (rfd->fd >= 0 && !rfd->frozen && FD_ISSET(rfd->fd, &rset)) { FD_CLR(rfd->fd, &rset); ret = read(rfd->fd, buf, sizeof(buf)); if (ret < 0) { if (rfd->readerr) rfd->readerr(rfd, errno); } else { if (rfd->readdata) rfd->readdata(rfd, buf, ret); } break; } } while (rfd); return 0; } Node-path: putty/contrib/cygtermd/sel.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 5092 Text-content-md5: af04236c35b03c2bf949b596a275813d Text-content-sha1: 8ff75fa89686ee64c410c5b5dcd4cfd69f5ab1bc Content-length: 5102 PROPS-END SVN���VVV/* * sel.h: subsystem to manage the grubby details of a select loop, * buffering data to write, and performing the actual writes and * reads. */ #ifndef FIXME_SEL_H #define FIXME_SEL_H typedef struct sel sel; typedef struct sel_wfd sel_wfd; typedef struct sel_rfd sel_rfd; /* * Callback called when some data is written to a wfd. "bufsize" * is the remaining quantity of data buffered in that wfd. */ typedef void (*sel_written_fn_t)(sel_wfd *wfd, size_t bufsize); /* * Callback called when an error occurs on a wfd, preventing * further writing to it. "error" is the errno value. */ typedef void (*sel_writeerr_fn_t)(sel_wfd *wfd, int error); /* * Callback called when some data is read from an rfd. On EOF, * this will be called with len==0. */ typedef void (*sel_readdata_fn_t)(sel_rfd *rfd, void *data, size_t len); /* * Callback called when an error occurs on an rfd, preventing * further reading from it. "error" is the errno value. */ typedef void (*sel_readerr_fn_t)(sel_rfd *rfd, int error); /* * Create a sel structure, which will oversee a select loop. * * "ctx" is user-supplied data stored in the sel structure; it can * be read and written with sel_get_ctx() and sel_set_ctx(). */ sel *sel_new(void *ctx); /* * Add a new fd for writing. Returns a sel_wfd which identifies * that fd in the sel structure, e.g. for putting data into its * output buffer. * * "ctx" is user-supplied data stored in the sel structure; it can * be read and written with sel_wfd_get_ctx() and sel_wfd_set_ctx(). * * "written" and "writeerr" are called from the event loop when * things happen. * * The fd passed in can be -1, in which case it will be assumed to * be unwritable at all times. An actual fd can be passed in later * using sel_wfd_setfd. */ sel_wfd *sel_wfd_add(sel *sel, int fd, sel_written_fn_t written, sel_writeerr_fn_t writeerr, void *ctx); /* * Add a new fd for reading. Returns a sel_rfd which identifies * that fd in the sel structure. * * "ctx" is user-supplied data stored in the sel structure; it can * be read and written with sel_rfd_get_ctx() and sel_rfd_set_ctx(). * * "readdata" and "readerr" are called from the event loop when * things happen. "ctx" is passed to both of them. */ sel_rfd *sel_rfd_add(sel *sel, int fd, sel_readdata_fn_t readdata, sel_readerr_fn_t readerr, void *ctx); /* * Write data into the output buffer of a wfd. Returns the new * size of the output buffer. (You can call it with len==0 if you * just want to know the buffer size; in that situation data==NULL * is also safe.) */ size_t sel_write(sel_wfd *wfd, const void *data, size_t len); /* * Freeze and unfreeze an rfd. When frozen, sel will temporarily * not attempt to read from it, but all its state is retained so * it can be conveniently unfrozen later. (You might use this * facility, for instance, if what you were doing with the * incoming data could only accept it at a certain rate: freeze * the rfd when you've got lots of backlog, and unfreeze it again * when things get calmer.) */ void sel_rfd_freeze(sel_rfd *rfd); void sel_rfd_unfreeze(sel_rfd *rfd); /* * Delete a wfd structure from its containing sel. Returns the * underlying fd, which the client may now consider itself to own * once more. */ int sel_wfd_delete(sel_wfd *wfd); /* * Delete an rfd structure from its containing sel. Returns the * underlying fd, which the client may now consider itself to own * once more. */ int sel_rfd_delete(sel_rfd *rfd); /* * NOT IMPLEMENTED YET: useful functions here might be ones which * enumerated all the wfds/rfds in a sel structure in some * fashion, so you could go through them and remove them all while * doing sensible things to them. Or, at the very least, just * return an arbitrary one of the wfds/rfds. */ /* * Free a sel structure and all its remaining wfds and rfds. */ void sel_free(sel *sel); /* * Read and write the ctx parameters in sel, sel_wfd and sel_rfd. */ void *sel_get_ctx(sel *sel); void sel_set_ctx(sel *sel, void *ctx); void *sel_wfd_get_ctx(sel_wfd *wfd); void sel_wfd_set_ctx(sel_wfd *wfd, void *ctx); void *sel_rfd_get_ctx(sel_rfd *rfd); void sel_rfd_set_ctx(sel_rfd *rfd, void *ctx); /* * Run one iteration of the sel event loop, calling callbacks as * necessary. Returns zero on success; in the event of a fatal * error, returns the errno value. * * "timeout" is a value in microseconds to limit the length of the * select call. Less than zero means to wait indefinitely. */ int sel_iterate(sel *sel, long timeout); /* * Change the underlying fd in a wfd. If set to -1, no write * attempts will take place and the wfd's buffer will simply store * everything passed to sel_write(). If later set to something * other than -1, all that buffered data will become eligible for * real writing. */ void sel_wfd_setfd(sel_wfd *wfd, int fd); /* * Change the underlying fd in a rfd. If set to -1, no read * attempts will take place. */ void sel_rfd_setfd(sel_rfd *rfd, int fd); #endif /* FIXME_SEL_H */ Node-path: putty/contrib/cygtermd/telnet.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 17099 Text-content-md5: 0234c4eeb145e835c7f2d0ea1a3ecac8 Text-content-sha1: b89740375be49b3a4e69d67b62113e06ed5c8358 Content-length: 17109 PROPS-END SVN���:::/* * Simple Telnet server code, adapted from PuTTY's own Telnet * client code for use as a Cygwin local pty proxy. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "sel.h" #include "telnet.h" #include "malloc.h" #include "pty.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define IAC 255 /* interpret as command: */ #define DONT 254 /* you are not to use option */ #define DO 253 /* please, you use option */ #define WONT 252 /* I won't use option */ #define WILL 251 /* I will use option */ #define SB 250 /* interpret as subnegotiation */ #define SE 240 /* end sub negotiation */ #define GA 249 /* you may reverse the line */ #define EL 248 /* erase the current line */ #define EC 247 /* erase the current character */ #define AYT 246 /* are you there */ #define AO 245 /* abort output--but let prog finish */ #define IP 244 /* interrupt process--permanently */ #define BREAK 243 /* break */ #define DM 242 /* data mark--for connect. cleaning */ #define NOP 241 /* nop */ #define EOR 239 /* end of record (transparent mode) */ #define ABORT 238 /* Abort process */ #define SUSP 237 /* Suspend process */ #define xEOF 236 /* End of file: EOF is already used... */ #define TELOPTS(X) \ X(BINARY, 0) /* 8-bit data path */ \ X(ECHO, 1) /* echo */ \ X(RCP, 2) /* prepare to reconnect */ \ X(SGA, 3) /* suppress go ahead */ \ X(NAMS, 4) /* approximate message size */ \ X(STATUS, 5) /* give status */ \ X(TM, 6) /* timing mark */ \ X(RCTE, 7) /* remote controlled transmission and echo */ \ X(NAOL, 8) /* negotiate about output line width */ \ X(NAOP, 9) /* negotiate about output page size */ \ X(NAOCRD, 10) /* negotiate about CR disposition */ \ X(NAOHTS, 11) /* negotiate about horizontal tabstops */ \ X(NAOHTD, 12) /* negotiate about horizontal tab disposition */ \ X(NAOFFD, 13) /* negotiate about formfeed disposition */ \ X(NAOVTS, 14) /* negotiate about vertical tab stops */ \ X(NAOVTD, 15) /* negotiate about vertical tab disposition */ \ X(NAOLFD, 16) /* negotiate about output LF disposition */ \ X(XASCII, 17) /* extended ascic character set */ \ X(LOGOUT, 18) /* force logout */ \ X(BM, 19) /* byte macro */ \ X(DET, 20) /* data entry terminal */ \ X(SUPDUP, 21) /* supdup protocol */ \ X(SUPDUPOUTPUT, 22) /* supdup output */ \ X(SNDLOC, 23) /* send location */ \ X(TTYPE, 24) /* terminal type */ \ X(EOR, 25) /* end or record */ \ X(TUID, 26) /* TACACS user identification */ \ X(OUTMRK, 27) /* output marking */ \ X(TTYLOC, 28) /* terminal location number */ \ X(3270REGIME, 29) /* 3270 regime */ \ X(X3PAD, 30) /* X.3 PAD */ \ X(NAWS, 31) /* window size */ \ X(TSPEED, 32) /* terminal speed */ \ X(LFLOW, 33) /* remote flow control */ \ X(LINEMODE, 34) /* Linemode option */ \ X(XDISPLOC, 35) /* X Display Location */ \ X(OLD_ENVIRON, 36) /* Old - Environment variables */ \ X(AUTHENTICATION, 37) /* Authenticate */ \ X(ENCRYPT, 38) /* Encryption option */ \ X(NEW_ENVIRON, 39) /* New - Environment variables */ \ X(TN3270E, 40) /* TN3270 enhancements */ \ X(XAUTH, 41) \ X(CHARSET, 42) /* Character set */ \ X(RSP, 43) /* Remote serial port */ \ X(COM_PORT_OPTION, 44) /* Com port control */ \ X(SLE, 45) /* Suppress local echo */ \ X(STARTTLS, 46) /* Start TLS */ \ X(KERMIT, 47) /* Automatic Kermit file transfer */ \ X(SEND_URL, 48) \ X(FORWARD_X, 49) \ X(PRAGMA_LOGON, 138) \ X(SSPI_LOGON, 139) \ X(PRAGMA_HEARTBEAT, 140) \ X(EXOPL, 255) /* extended-options-list */ #define telnet_enum(x,y) TELOPT_##x = y, enum { TELOPTS(telnet_enum) dummy=0 }; #undef telnet_enum #define TELQUAL_IS 0 /* option is... */ #define TELQUAL_SEND 1 /* send option */ #define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */ #define BSD_VAR 1 #define BSD_VALUE 0 #define RFC_VAR 0 #define RFC_VALUE 1 #define CR 13 #define LF 10 #define NUL 0 #define iswritable(x) ( (x) != IAC && (x) != CR ) static char *telopt(int opt) { #define telnet_str(x,y) case TELOPT_##x: return #x; switch (opt) { TELOPTS(telnet_str) default: return "<unknown>"; } #undef telnet_str } static void telnet_size(void *handle, int width, int height); struct Opt { int send; /* what we initially send */ int nsend; /* -ve send if requested to stop it */ int ack, nak; /* +ve and -ve acknowledgements */ int option; /* the option code */ int index; /* index into telnet->opt_states[] */ enum { REQUESTED, ACTIVE, INACTIVE, REALLY_INACTIVE } initial_state; }; enum { OPTINDEX_NAWS, OPTINDEX_TSPEED, OPTINDEX_TTYPE, OPTINDEX_OENV, OPTINDEX_NENV, OPTINDEX_ECHO, OPTINDEX_WE_SGA, OPTINDEX_THEY_SGA, OPTINDEX_WE_BIN, OPTINDEX_THEY_BIN, NUM_OPTS }; static const struct Opt o_naws = { DO, DONT, WILL, WONT, TELOPT_NAWS, OPTINDEX_NAWS, REQUESTED }; static const struct Opt o_ttype = { DO, DONT, WILL, WONT, TELOPT_TTYPE, OPTINDEX_TTYPE, REQUESTED }; static const struct Opt o_oenv = { DO, DONT, WILL, WONT, TELOPT_OLD_ENVIRON, OPTINDEX_OENV, INACTIVE }; static const struct Opt o_nenv = { DO, DONT, WILL, WONT, TELOPT_NEW_ENVIRON, OPTINDEX_NENV, REQUESTED }; static const struct Opt o_echo = { WILL, WONT, DO, DONT, TELOPT_ECHO, OPTINDEX_ECHO, REQUESTED }; static const struct Opt o_they_sga = { DO, DONT, WILL, WONT, TELOPT_SGA, OPTINDEX_WE_SGA, REQUESTED }; static const struct Opt o_we_sga = { WILL, WONT, DO, DONT, TELOPT_SGA, OPTINDEX_THEY_SGA, REQUESTED }; static const struct Opt *const opts[] = { &o_echo, &o_we_sga, &o_they_sga, &o_naws, &o_ttype, &o_oenv, &o_nenv, NULL }; struct telnet_tag { int opt_states[NUM_OPTS]; int sb_opt, sb_len; unsigned char *sb_buf; int sb_size; enum { TOP_LEVEL, SEENIAC, SEENWILL, SEENWONT, SEENDO, SEENDONT, SEENSB, SUBNEGOT, SUBNEG_IAC, SEENCR } state; sel_wfd *net, *pty; /* * Options we must finish processing before launching the shell */ int old_environ_done, new_environ_done, ttype_done; /* * Ready to start shell? */ int shell_ok; int envvarsize; struct shell_data shdata; }; #define TELNET_MAX_BACKLOG 4096 #define SB_DELTA 1024 static void send_opt(Telnet telnet, int cmd, int option) { unsigned char b[3]; b[0] = IAC; b[1] = cmd; b[2] = option; sel_write(telnet->net, (char *)b, 3); } static void deactivate_option(Telnet telnet, const struct Opt *o) { if (telnet->opt_states[o->index] == REQUESTED || telnet->opt_states[o->index] == ACTIVE) send_opt(telnet, o->nsend, o->option); telnet->opt_states[o->index] = REALLY_INACTIVE; } /* * Generate side effects of enabling or disabling an option. */ static void option_side_effects(Telnet telnet, const struct Opt *o, int enabled) { } static void activate_option(Telnet telnet, const struct Opt *o) { if (o->option == TELOPT_NEW_ENVIRON || o->option == TELOPT_OLD_ENVIRON || o->option == TELOPT_TTYPE) { char buf[6]; buf[0] = IAC; buf[1] = SB; buf[2] = o->option; buf[3] = TELQUAL_SEND; buf[4] = IAC; buf[5] = SE; sel_write(telnet->net, buf, 6); } option_side_effects(telnet, o, 1); } static void done_option(Telnet telnet, int option) { if (option == TELOPT_OLD_ENVIRON) telnet->old_environ_done = 1; else if (option == TELOPT_NEW_ENVIRON) telnet->new_environ_done = 1; else if (option == TELOPT_TTYPE) telnet->ttype_done = 1; if (telnet->old_environ_done && telnet->new_environ_done && telnet->ttype_done) { telnet->shell_ok = 1; } } static void refused_option(Telnet telnet, const struct Opt *o) { done_option(telnet, o->option); if (o->send == WILL && o->option == TELOPT_NEW_ENVIRON && telnet->opt_states[o_oenv.index] == INACTIVE) { send_opt(telnet, WILL, TELOPT_OLD_ENVIRON); telnet->opt_states[o_oenv.index] = REQUESTED; telnet->old_environ_done = 0; } option_side_effects(telnet, o, 0); } static void proc_rec_opt(Telnet telnet, int cmd, int option) { const struct Opt *const *o; for (o = opts; *o; o++) { if ((*o)->option == option && (*o)->ack == cmd) { switch (telnet->opt_states[(*o)->index]) { case REQUESTED: telnet->opt_states[(*o)->index] = ACTIVE; activate_option(telnet, *o); break; case ACTIVE: break; case INACTIVE: telnet->opt_states[(*o)->index] = ACTIVE; send_opt(telnet, (*o)->send, option); activate_option(telnet, *o); break; case REALLY_INACTIVE: send_opt(telnet, (*o)->nsend, option); break; } return; } else if ((*o)->option == option && (*o)->nak == cmd) { switch (telnet->opt_states[(*o)->index]) { case REQUESTED: telnet->opt_states[(*o)->index] = INACTIVE; refused_option(telnet, *o); break; case ACTIVE: telnet->opt_states[(*o)->index] = INACTIVE; send_opt(telnet, (*o)->nsend, option); option_side_effects(telnet, *o, 0); break; case INACTIVE: case REALLY_INACTIVE: break; } return; } } /* * If we reach here, the option was one we weren't prepared to * cope with. If the request was positive (WILL or DO), we send * a negative ack to indicate refusal. If the request was * negative (WONT / DONT), we must do nothing. */ if (cmd == WILL || cmd == DO) send_opt(telnet, (cmd == WILL ? DONT : WONT), option); } static void process_subneg(Telnet telnet) { unsigned char b[2048], *p, *q; int var, value, n; char *e; switch (telnet->sb_opt) { case TELOPT_OLD_ENVIRON: case TELOPT_NEW_ENVIRON: if (telnet->sb_buf[0] == TELQUAL_IS) { if (telnet->sb_opt == TELOPT_NEW_ENVIRON) { var = RFC_VAR; value = RFC_VALUE; } else { if (telnet->sb_len > 1 && !(telnet->sb_buf[0] &~ 1)) { var = telnet->sb_buf[0]; value = BSD_VAR ^ BSD_VALUE ^ var; } else { var = BSD_VAR; value = BSD_VALUE; } } } n = 1; while (n < telnet->sb_len && telnet->sb_buf[n] == var) { int varpos, varlen, valpos, vallen; char *result; varpos = ++n; while (n < telnet->sb_len && telnet->sb_buf[n] != value) n++; if (n == telnet->sb_len) break; varlen = n - varpos; valpos = ++n; while (n < telnet->sb_len && telnet->sb_buf[n] != var) n++; vallen = n - valpos; result = snewn(varlen + vallen + 2, char); sprintf(result, "%.*s=%.*s", varlen, telnet->sb_buf+varpos, vallen, telnet->sb_buf+valpos); if (telnet->shdata.nenvvars >= telnet->envvarsize) { telnet->envvarsize = telnet->shdata.nenvvars * 3 / 2 + 16; telnet->shdata.envvars = sresize(telnet->shdata.envvars, telnet->envvarsize, char *); } telnet->shdata.envvars[telnet->shdata.nenvvars++] = result; } done_option(telnet, telnet->sb_opt); break; case TELOPT_TTYPE: if (telnet->sb_len >= 1 && telnet->sb_buf[0] == TELQUAL_IS) { telnet->shdata.termtype = snewn(5 + telnet->sb_len, char); strcpy(telnet->shdata.termtype, "TERM="); for (n = 0; n < telnet->sb_len-1; n++) { char c = telnet->sb_buf[n+1]; if (c >= 'A' && c <= 'Z') c = c + 'a' - 'A'; telnet->shdata.termtype[n+5] = c; } telnet->shdata.termtype[telnet->sb_len+5-1] = '\0'; } done_option(telnet, telnet->sb_opt); break; case TELOPT_NAWS: if (telnet->sb_len == 4) { int w, h; w = (unsigned char)telnet->sb_buf[0]; w = (w << 8) | (unsigned char)telnet->sb_buf[1]; h = (unsigned char)telnet->sb_buf[2]; h = (h << 8) | (unsigned char)telnet->sb_buf[3]; pty_resize(w, h); } break; } } void telnet_from_net(Telnet telnet, char *buf, int len) { while (len--) { int c = (unsigned char) *buf++; switch (telnet->state) { case TOP_LEVEL: case SEENCR: /* * PuTTY sends Telnet's new line sequence (CR LF on * the wire) in response to the return key. We must * therefore treat that as equivalent to CR NUL, and * send CR to the pty. */ if ((c == NUL || c == '\n') && telnet->state == SEENCR) telnet->state = TOP_LEVEL; else if (c == IAC) telnet->state = SEENIAC; else { char cc = c; sel_write(telnet->pty, &cc, 1); telnet->state = SEENCR; } break; case SEENIAC: if (c == DO) telnet->state = SEENDO; else if (c == DONT) telnet->state = SEENDONT; else if (c == WILL) telnet->state = SEENWILL; else if (c == WONT) telnet->state = SEENWONT; else if (c == SB) telnet->state = SEENSB; else if (c == DM) telnet->state = TOP_LEVEL; else { /* ignore everything else; print it if it's IAC */ if (c == IAC) { char cc = c; sel_write(telnet->pty, &cc, 1); } telnet->state = TOP_LEVEL; } break; case SEENWILL: proc_rec_opt(telnet, WILL, c); telnet->state = TOP_LEVEL; break; case SEENWONT: proc_rec_opt(telnet, WONT, c); telnet->state = TOP_LEVEL; break; case SEENDO: proc_rec_opt(telnet, DO, c); telnet->state = TOP_LEVEL; break; case SEENDONT: proc_rec_opt(telnet, DONT, c); telnet->state = TOP_LEVEL; break; case SEENSB: telnet->sb_opt = c; telnet->sb_len = 0; telnet->state = SUBNEGOT; break; case SUBNEGOT: if (c == IAC) telnet->state = SUBNEG_IAC; else { subneg_addchar: if (telnet->sb_len >= telnet->sb_size) { telnet->sb_size += SB_DELTA; telnet->sb_buf = sresize(telnet->sb_buf, telnet->sb_size, unsigned char); } telnet->sb_buf[telnet->sb_len++] = c; telnet->state = SUBNEGOT; /* in case we came here by goto */ } break; case SUBNEG_IAC: if (c != SE) goto subneg_addchar; /* yes, it's a hack, I know, but... */ else { process_subneg(telnet); telnet->state = TOP_LEVEL; } break; } } } Telnet telnet_new(sel_wfd *net, sel_wfd *pty) { Telnet telnet; telnet = snew(struct telnet_tag); telnet->sb_buf = NULL; telnet->sb_size = 0; telnet->state = TOP_LEVEL; telnet->net = net; telnet->pty = pty; telnet->shdata.envvars = NULL; telnet->shdata.nenvvars = telnet->envvarsize = 0; telnet->shdata.termtype = NULL; /* * Initialise option states. */ { const struct Opt *const *o; for (o = opts; *o; o++) { telnet->opt_states[(*o)->index] = (*o)->initial_state; if (telnet->opt_states[(*o)->index] == REQUESTED) send_opt(telnet, (*o)->send, (*o)->option); } } telnet->old_environ_done = 1; /* initially don't want to bother */ telnet->new_environ_done = 0; telnet->ttype_done = 0; telnet->shell_ok = 0; return telnet; } void telnet_free(Telnet telnet) { sfree(telnet->sb_buf); sfree(telnet); } void telnet_from_pty(Telnet telnet, char *buf, int len) { unsigned char *p, *end; static const unsigned char iac[2] = { IAC, IAC }; static const unsigned char cr[2] = { CR, NUL }; #if 0 static const unsigned char nl[2] = { CR, LF }; #endif p = (unsigned char *)buf; end = (unsigned char *)(buf + len); while (p < end) { unsigned char *q = p; while (p < end && iswritable(*p)) p++; sel_write(telnet->net, (char *)q, p - q); while (p < end && !iswritable(*p)) { sel_write(telnet->net, (char *)(*p == IAC ? iac : cr), 2); p++; } } } int telnet_shell_ok(Telnet telnet, struct shell_data *shdata) { if (telnet->shell_ok) *shdata = telnet->shdata; /* structure copy */ return telnet->shell_ok; } Node-path: putty/contrib/cygtermd/telnet.h Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 921 Text-content-md5: 614684f1935b91a1eaead191e01a7995 Text-content-sha1: 222beba498ac19536a922dff066c74bb0934c163 Content-length: 931 PROPS-END SVN���  /* * Header declaring Telnet-handling functions. */ #ifndef FIXME_TELNET_H #define FIXME_TELNET_H #include "sel.h" typedef struct telnet_tag *Telnet; struct shell_data { char **envvars; /* array of "VAR=value" terms */ int nenvvars; char *termtype; }; /* * Create and destroy a Telnet structure. */ Telnet telnet_new(sel_wfd *net, sel_wfd *pty); void telnet_free(Telnet telnet); /* * Process data read from the pty. */ void telnet_from_pty(Telnet telnet, char *buf, int len); /* * Process Telnet protocol data received from the network. */ void telnet_from_net(Telnet telnet, char *buf, int len); /* * Return true if pre-shell-startup negotiations are complete and * it's safe to start the shell subprocess now. On a true return, * also fills in the shell_data structure. */ int telnet_shell_ok(Telnet telnet, struct shell_data *shdata); #endif /* FIXME_TELNET_H */ Revision-number: 9192 Prop-content-length: 987 Content-length: 987 K 8 svn:date V 27 2011-07-10T14:28:16.757377Z K 7 svn:log V 886 Reorganise the wishlist page 'win-command-prompt'. I've broken the Cygwin case out of it and moved it to a separate bug page; on that page I've documented the current state of Cygwin local terminal support, including detailed instructions for setting up my 'cygtermd' helper program. (This has also required me to document the bug fixed in r8158, which is critical to speaking Telnet over local proxies and hence to the cygtermd mechanism working at all.) I've left cygwin-terminal-window at 'taxing' (despite it being _sort_ of done), because really what it wants is fixes outside our codebase - if Cygwin's own telnetd had a couple more command-line options, we could use that in place of a dedicated cygtermd. I've also upgraded win-command-prompt to be our first genuine 'mayhem'-difficulty feature request, since I have actually tried it since its difficulty grade was assigned! K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/cygwin-terminal-window Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 6027 Text-content-md5: 342f63c7dbd8bfc2c4fcb855d8d55107 Text-content-sha1: 3dac197cb683731bbb49f5e47b9098be48ad78a7 Content-length: 6037 PROPS-END SVN���}}}Summary: Use PuTTY as a local GUI terminal app for the Cygwin shell Class: wish Priority: low Difficulty: taxing Depends: local-proxy-telnet Content-type: text/x-html-body <p> It would be nice to be able to use PuTTY as a local terminal window application for Cygwin shell sessions: a sort of local <code>xterm</code>-alike (or rather, <code>pterm</code>-alike). <p> This is a perfectly feasible piece of work (much, much more so than the superficially similar-looking but far more difficult <a href="win-command-prompt.html">win-command-prompt</a>), and in fact it can just about be achieved without any actual changes to PuTTY. PuTTY's support for talking to a local Windows proxy subprocess in place of making a network connection permits a solution in which that proxy subprocess sets up a Cygwin pseudo-terminal, and speaks Telnet on its standard input and output (which connect to PuTTY). So you would configure PuTTY to think it was making a telnet connection to localhost, but actually interpose this helper program via the Proxy configuration panel – and the effect is that PuTTY speaks directly to the Telnet implementation in the helper program, which starts a Cygwin pty and runs a shell in it. <p> So the helper process has to be a Cygwin application (it must link against the Cygwin DLL so it can work with the Cygwin emulation of ptys), and it needs to speak Telnet on its standard I/O channels and at the other end talk to a pty. In other words, it's actually very similar to a Unix telnet daemon, of the type that can be launched from <code>inetd</code>. <p> In fact, it would be <em>really</em> nice if Cygwin's own <code>telnetd</code> could be used to do this job. Then an unmodified PuTTY could talk to an unmodified Cygwin installation with only a mildly fiddly piece of configuration. <p> However, when I actually tried this I found that Cygwin's telnet server wouldn't quite do the job: for instance, it wouldn't operate in the absence of syslogd, and it didn't have a command-line option to make it invoke some program other than <code>login</code> in its pseudo-terminal. I wouldn't expect that those should be difficult features to add, but I've never got round to making a serious effort to write them properly and get them accepted upstream. <p> However, I have written a small and specialist Telnet server of my own which <em>is</em> suitable for this job. (That was a lot less work than it sounds, since several pieces of PuTTY were easily reused to do most of the heavy lifting – client-side and server-side Telnet are very similar.) I'm just not sure how to sensibly package it, since really it should be a Cygwin application so as to work with Cygwin installations of all versions, but in that case it's better just to adapt Cygwin telnetd... <p> In the meantime, though, for anyone who wants to use it, here's the (currently rather long and involved) process for setting it up: <ul> <li> For a start, make sure you have a PuTTY containing the fix for <a href="local-proxy-telnet.html">local-proxy-telnet</a>, which is critical to this mechanism working at all. <li> Get the source code for my Telnet server, which is in the subdirectory <code>contrib/cygtermd</code> of the PuTTY source tree. (You can get the PuTTY source code from the <a href="../download.html">Download page</a>, as a zip or tar file or by checking it out from Subversion.) <li> In the <code>contrib/cygtermd</code> directory, run the Cygwin <code>make</code> command. (You will need Cygwin's <code>make</code> and <code>gcc</code> installed.) This will create an executable file called <code>cygtermd.exe</code>. <li> Copy <code>cygtermd.exe</code> into Cygwin's <code>/bin</code> directory. (This is unfortunately necessary because it will be run by a non-Cygwin application and will therefore need to be in the same directory as the Cygwin DLL in order to find it.) <li> Now configure PuTTY to run a session using cygtermd, as follows. <ul> <li> On the front page (Session panel): <ul> <li> Set connection type to Telnet. <li> Enter something in the host name box. (PuTTY won't launch a session at all unless it believes it's connecting to <em>something</em>; also whatever you type here will go in the window title bar. "localhost" is probably sufficient, if you have no better idea.) </ul> <li> In the Proxy panel: <ul> <li> Tick the box labelled "Consider proxying local host connections". (Otherwise, PuTTY will not use the information in this panel to override its default behaviour of just making a normal Telnet connection to your local machine.) <li> Set "Proxy type" to Local. <li> Enter in the command line field a Windows command line which launches cygtermd in the right directory and with the right subcommand. cygtermd will expect a directory name as its first argument (in Cygwin style), and will interpret the rest of its arguments as a command line. So you might, for instance, do something like this: <pre>c:\cygwin\bin\cygtermd.exe /home/simon /bin/bash -login </pre> which would arrange that the helper program will be run in Cygwin's <code>/home/simon</code> directory, and will launch the program "<code>/bin/bash -login</code>" (i.e. a normal Cygwin login shell) inside the telnet session. </ul> <li> In the Data panel: <ul> <li> You should be able to configure your terminal type and set environment variables, if you want to do either of those things. cygtermd supports the Telnet options for both. </ul> </ul> </ul> <p> This is all a lot of hassle, even though it only has to be set up once. If Cygwin telnetd were fixed so that it could do the job of my cygtermd utility, I would probably think it reasonable to add a piece of dedicated PuTTY user interface to make it trivially easy to run a local Cygwin shell session. <p> Our <a href="../links.html">Links page</a> links to a modified version of PuTTY called PuTTYcyg, which was able to act as a Cygwin local terminal (again using a helper process linked against Cygwin) before PuTTY proper could do so. Node-path: putty-wishlist/data/local-proxy-telnet Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 559 Text-content-md5: 81d901c2592940fa3b2a868d73bfeaaa Text-content-sha1: b8ea7149adc567ac99990b245f3ee7f2b4535ae8 Content-length: 569 PROPS-END SVN���!!!Summary: Data received from local proxy commands tagged as TCP Urgent (breaks telnet) Class: bug Priority: low Difficulty: fun Absent-in: r6807 Present-in: r6808 Fixed-in: r8158 Content-type: text/x-html-body <p> When I implemented the <a href="proxy-command.html">proxy-command</a> feature, I accidentally set it up so that all data received from a local proxy subprocess (on both Unix and Windows) was tagged as TCP Urgent. <p> This made no difference to SSH (which is how I didn't notice), but it completely breaks Telnet. Fixed in r8158. Node-path: putty-wishlist/data/win-command-prompt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5534b0701d1cff90c9d805af4748048b Text-delta-base-sha1: 8dcd2aa90be3e352933cfe7d62c846922c60acb7 Text-content-length: 3994 Text-content-md5: f1e4f422b4384fdb91882c2042695fd8 Text-content-sha1: ed9c0f833ac1b812592d86a53d57f767bad4dff7 Content-length: 3994 SVN��}} ^�x]'Summary: Ability to backend on to a Windows command interpreter Class: wish Difficulty: mayhem(SGT) have done some experimental work in this direction, but it doesn't look promising, since Windows's interface to its console devices is fundamentally different in nature from Unix's system of terminals and pseudo-terminals. <p> Unix programs communicate with their terminal via a serialised stream of data in which literal text to be written to the screen is intermixed with control codes to do operations such as positioning the cursor, clearing the screen, and setting the colour. This architecture makes it very natural and simple to put a network connection in between the terminal application and the software or hardware which is converting that serialised data stream into a rectangular view of a terminal window; Unix supports this by providing "pseudo-terminal" devices, which look and behave just like an ordinary Unix terminal from the point of view of the applications running in them, but which pass the data stream to another application which can interpret it itself. Unix programs such as <code>xterm</code>, and also network servers such as <code>sshd</code>, all work by using these pseudo-terminal devices to retrieve the stream of terminal data. In <code>sshd</code>'s case, the data is then passed on to a remote network client such as PuTTY, which receives that stream of terminal data and interprets all the control codes so as to display the literal text into its window as those codes instruct it. <p> By contrast, Windows's console device is much more geared to direct access via the Windows API: there are API functions to ask Windows to read or write out the contents of a console's rectangular screen buffer, to change the colour, and so on. Windows has no analogue of Unix's pseudo-terminal device: there is no convenient way to create something that looks like a Windows console to its client application but passes all requests on to another application which can decide how to answer them. <p> (This is a slight oversimplification. Unix does include one or two terminal operations which are not serialised into the usual data stream but are instead performed by direct Unix API calls, such as resizing the window. However, in such cases Unix is careful to provide an out-of-band mechanism for applications using pseudo-terminals to arrange correct handling of the operation.) <p> It is just about possible (though extremely fiddly) to construct an application which instantiates a Windows console as a hidden window, and uses the same console API used by applications running in the console to read out its screen buffer and transfer that into the PuTTY window. This would give a window that had the look and feel of PuTTY (and, in particular, PuTTY's cut and paste interface), but running a Windows command prompt inside it. I have an experimental branch of the PuTTY code base (last touched in 2009) which attempts this. <p> However, it's not of production quality and probably never will be. Many things go subtly wrong when you attempt this sort of hackery, and handling of errors and exceptional cases is often very hard to get right. For example, it's extremely hard to arrange that if the PuTTY managing the invisible console window crashes, all processes using the console are cleaned up correctly. It's also hard to get GUI processes started from the invisible console not to be invisible themselves. Also, important keystrokes like Ctrl-C are difficult to pass through properly to the underlying console. <p> On the other hand, making PuTTY behave like a local terminal window for <em>Cygwin</em> processes in particular is a much more feasible piece of work, since Cygwin carefully emulates the Unix-like terminal model which PuTTY already understands, so all that PuTTY has to do is to arrange to be able to talk to that emulation. See <a href="cygwin-terminal-window.html">cygwin-terminal-window</a> for thoughts on this. Revision-number: 9193 Prop-content-length: 311 Content-length: 311 K 8 svn:date V 27 2011-07-10T22:31:11.124505Z K 7 svn:log V 210 Add <link rel="canonical"> to all pages, in the hope of having Google more reliably find the main page first (after the incident a few months back where it lost it for a while in favour of an outdated mirror). K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/autogen.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 71b8b86365c3c3d83e335b0bf0b28835 Text-delta-base-sha1: 0ecad03a774e0c90bde70d02351d28f1ab15587e Text-content-length: 98 Text-content-md5: 61f3220e95f320b2a79112ed87bcd741 Text-content-sha1: a4ea1bb67687491093a80e04e643205e13221cbf Content-length: 98 SVN���Y L�c�L�*Vcanonical" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/$ARGV[0]" Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc98f2fdf05287d981289e91b943621f Text-delta-base-sha1: 8ca6e4e982f9120d33e30c2f5f71787adf092704 Text-content-length: 103 Text-content-md5: 356b2e865468764acac34449b85fa51a Text-content-sha1: 882eb7c0b2ee80c09ca17faf9d37d6218560b076 Content-length: 103 SVN��^; P�x�P�skcanonical" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/changes.html" Node-path: putty-website/docs.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 52eb4258f444d52ec43466be87e9c9e4 Text-delta-base-sha1: e6b2f8a16b58096632ddf6740b18fd61d4fc03a3 Text-content-length: 98 Text-content-md5: 3fca57821fd047e8327a13ed065b17f5 Text-content-sha1: 7e41a26cb1e26c7ef7573ae09c1959145fccf6a2 Content-length: 98 SVN��w M���M�*scanonical" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/docs.html" Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d762e0f9939e84834f7bcd347f7fd371 Text-delta-base-sha1: 8db60fd2b5380eb34bb20767338684173db8ef22 Text-content-length: 104 Text-content-md5: 59cd177e9062791e72d9873a192c61f4 Text-content-sha1: b5404d8c8b5994e1870e4bcb8db160ac3a8073f9 Content-length: 104 SVN��7 Q�{�Q�Incanonical" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 772a710a7de5ec1357144e6fc77b9746 Text-delta-base-sha1: b962ec43cfe736b1fe03947bc9802d10395b33e1 Text-content-length: 89 Text-content-md5: 860cb4e006f610d549944a9dfbba055f Text-content-sha1: 9fd6c8f11353d6dbfcc0cc3070fcb7b5b7950f82 Content-length: 89 SVN��3 D��D�9zcanonical" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/" Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae1350c9b6951302a6df3ca36039acf0 Text-delta-base-sha1: 9bded7d19d6eb754eff7485fe95a4af457d0ad01 Text-content-length: 100 Text-content-md5: 238289a4d907662fb459bad5f775db8c Text-content-sha1: f6663ccbcc80e76710eafb7306d6b11bcfd0988c Content-length: 100 SVN��eB P�u�P�}hcanonical" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/licence.html" Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 488de87adc880b8686ed95857df5767f Text-delta-base-sha1: d7b5d17230238d49522279ecc5a2049e4fe9a73f Text-content-length: 101 Text-content-md5: ebd7d2074c5951c5562582fce02152ff Text-content-sha1: 7cd25b6ab8dc8cf7be8e7902ed3ff39ea9313c53 Content-length: 101 SVN��y N�s�N�8fcanonical" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/links.html" Node-path: putty-website/maillist.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ede62c1e6ed822e34bba4fce7c2a55b2 Text-delta-base-sha1: 64120afe452c9916716336fa60c402cbbcaf776d Text-content-length: 101 Text-content-md5: 7c5342a5e4e89f2b73708c8a7630a7c3 Text-content-sha1: d494a3865f663db69a01e79ddaeee4cfe5210eb4 Content-length: 101 SVN��o Q�u�Q�)hcanonical" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/maillist.html" Node-path: putty-website/mirrors.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b74dcb1a0b8268ba4b9c0cdd46bdff5e Text-delta-base-sha1: f95d53e8adef2146a94e680738b5e5215a263fdb Text-content-length: 103 Text-content-md5: 5140b8188b42c3b78c196ca0abbaa9fb Text-content-sha1: 6d21fc134511755047f1120603975b09ceba862c Content-length: 103 SVN��k P�~�P�qcanonical" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/mirrors.html" Node-path: putty-website/team.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15328e5ece2a6729d4a296a246261af2 Text-delta-base-sha1: d7727bf50d8634f5a7803a7bf80f7886159c47b1 Text-content-length: 97 Text-content-md5: 73cd90cb6185ef8a8fff215f78d32386 Text-content-sha1: fd5f6130d8fff406d2b457fb719b5900856de675 Content-length: 97 SVN��R, M�z�M�emcanonical" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/team.html" Revision-number: 9194 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2011-07-10T22:31:32.906196Z K 7 svn:log V 78 Commit a piece of news that's been lying around here uncommitted for a while! K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 860cb4e006f610d549944a9dfbba055f Text-delta-base-sha1: 9fd6c8f11353d6dbfcc0cc3070fcb7b5b7950f82 Text-content-length: 438 Text-content-md5: 119531ab1d69276f4c3044f314972912 Text-content-sha1: 17dd134a3af2e7fa2d4a5a0597c8e694df5d85c1 Content-length: 438 SVN��. �9��W-10-05-17 Google listing confusion</b> <p> Several users have pointed out to us recently that the top Google hit for "putty" is now not the official PuTTY site but a mirror that used to be listed on our Mirrors page. <p> The official PuTTY web page is still where it has always been: <p align=center><a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">http://www.chiark.greenend.org.uk/~sgtatham/putty/</a Revision-number: 9195 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2011-07-10T22:32:00.416175Z K 7 svn:log V 121 Update link for PuTTYcyg, but also link to the new wishlist page giving a partial solution to this for unmodified PuTTY. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ebd7d2074c5951c5562582fce02152ff Text-delta-base-sha1: 7cd25b6ab8dc8cf7be8e7902ed3ff39ea9313c53 Text-content-length: 366 Text-content-md5: db1b94e0d8f61432f47d793478d5ef91 Text-content-sha1: 867dee1c2ba0aca7752a6bcc98dd94d075fef5a9 Content-length: 366 SVN��y T�+�T� Ycode.google.com/p/puttycyg/"> PuTTYcyg</a>, to use PuTTY as a terminal for <a href="http://www.cygwin.com">Cygwin</a>. (The standard PuTTY can just about do this too, with a bit of fiddly configuration including compiling a helper program. See <a href="wishlist/cygwin-terminal-window.html">this wishlist entry</a> for details.) Revision-number: 9196 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9197 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9198 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9199 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2011-07-12T14:23:16.650738Z K 7 svn:log V 69 Replicate r9193 <link rel="canonical"> for generated wishlist pages. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b2efbbc4b3ed77aea0bd9de5d5a0bafb Text-delta-base-sha1: 183de92987a693f5ffa76d70f9dc96b8e932a0ad Text-content-length: 372 Text-content-md5: 132d0f209da758f42a8fc0ad933391c9 Text-content-sha1: 66e67392b483f32ea8b0e6adfbb8d59d5afc2f1c Content-length: 372 SVN��,.8�b��?b#��[� � 7�0}� ; # don't include the trailing slash$canonical = ($baseurl =~ m#^http://#) ? $baseurl : "http://www.chiark.greenend.org.uk/~sgtatham/putty"; my $site = $canonical; $site =~ s#^http://([^/]*).*$#$1#canonical" href="$canonical/wishlist/"Known Bugs and Wish Listcanonical" href="$canonical/wishlist/$bugname.html" Revision-number: 9200 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2011-07-12T18:09:46.873820Z K 7 svn:log V 55 Fix Windows compile warnings by adding explicit casts. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 147829143bf705fbb4e1e9e4b52da58f Text-delta-base-sha1: 9993139122b40723acca41e311972f83ccf48da7 Text-content-length: 133 Text-content-md5: 908a614cbaec0a418ca2fa5427529751 Text-content-sha1: 15000f3347ec58bbf6d1c751bc30ce29a62d09c1 Content-length: 133 SVN��W�'Q�S���g�q{�l�\�x_(BignumInt)(t >> BIGNUM_INT_BITS)(BignumInt)(t >> BIGNUM_INT_BITS)(int)(int)(int) Revision-number: 9201 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2011-07-12T18:13:33.128451Z K 7 svn:log V 55 Fix the _rest_ of the Windows compile warnings. (ahem) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ldiscucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 12c041dd265798383d438e1d2cc48fb7 Text-delta-base-sha1: 32e518108855e70ba0c578a239f2b5d3505ae3d7 Text-content-length: 397 Text-content-md5: 0cdc84b38cc3ab6cbcb3481c95c1aa3a Text-content-sha1: 1af0a952b2c2a725fafdc194c58516e5608c368f Content-length: 397 SVN��N u�#�u�uYchar) (0xC0 | (ch >> 6)); *p++ = (char) (0x80 | (ch & 0x3F)); } else if (ch < 0x10000) { *p++ = (char) (0xE0 | (ch >> 12)); *p++ = (char) (0x80 | ((ch >> 6) & 0x3F)); *p++ = (char) (0x80 | (ch & 0x3F)); } else { *p++ = (char) (0xF0 | (ch >> 18)); *p++ = (char) (0x80 | ((ch >> 12) & 0x3F)); *p++ = (char) (0x80 | ((ch >> 6) & 0x3F)); *p++ = (char) Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ecd161d9f9174636a42e0bc8e4955be5 Text-delta-base-sha1: 8f6bb52fc8bd8644434948a2f287060f6416c4d2 Text-content-length: 29 Text-content-md5: 29b0f4b173edbe1f959ff63316102b29 Text-content-sha1: 0c969ed913955c0aece097f5b1c95c9dc050855c Content-length: 29 SVN��hp ���W(size_t) Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 90514464d6141bcb17315e09707df89b Text-delta-base-sha1: b1933080dc9f1fa7b21c870ac2eb9909903ae471 Text-content-length: 40 Text-content-md5: 0762630f24f65a4c53db8e89f5fdaf7d Text-content-sha1: 9b0dd3bf837ffd5eac10ee33448a2df6e91cdbd2 Content-length: 40 SVN��4> �]��Rb(size_t)(len-1) Revision-number: 9202 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Bump version number prior to tagging 0.61 release. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-12T18:26:18.964811Z PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e4eb3bf839f0b4bc25c33a4f1128de9 Text-delta-base-sha1: fe5825b67322733f9d2a32632d56c8811123aa49 Text-content-length: 15 Text-content-md5: 25e33d33b64f95aa3af081adfdf0c043 Text-content-sha1: 5b3beea4d672694501c862bdec39fe2e86fb6e91 Content-length: 15 SVN��0.61 Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4b4b60ec672e444c06fb1849ad4892a9 Text-delta-base-sha1: bba7a763128deee2470464d4925f79ab99f940ba Text-content-length: 22 Text-content-md5: b261d7b995ff3d6f872b594bc563a1e8 Text-content-sha1: 6b0955f9588ec01eefc01a6ae572c3d87fdc465a Content-length: 22 SVN��99 ���1 Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 097d40c854de4e52692e71d4af7c40d3 Text-delta-base-sha1: 70185333f73942e8430e482be1a7497c7381e0ef Text-content-length: 22 Text-content-md5: 765372e750033f47f00bfb7629039e7d Text-content-sha1: be7d41c6281b0fd1eae7365d86ebc2cb9e1a99e9 Content-length: 22 SVN��`` ���[1 Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 88e545c609c6f5c19883a4c2b24b6eeb Text-delta-base-sha1: 1a8359a84b6754e2a4d63e36776606cfc2372d67 Text-content-length: 102 Text-content-md5: b74e0cb0d88db79d29cb18e12f752693 Text-content-sha1: aa3cf9cf85b019dd8ed21fbd2191bcde10fa3bc2 Content-length: 102 SVN�� P�=�P� 1 VersionInfoTextVersion=Release 0.61 AppVersion=0.61 VersionInfoVersion=0.61 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c7410bf91a55beff39fb48ccb21df15c Text-delta-base-sha1: 4a8aff92dd26b0bd9b0ad15e1101015da0999b29 Text-content-length: 22 Text-content-md5: bff36c30bcd40f81e2c0b88aab213d8d Text-content-sha1: 6662a068ce64142fdaf13ebd8cdff35e8f654a91 Content-length: 22 SVN��RR �\��u]1 Revision-number: 9203 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2011-07-12T18:26:44.756780Z K 7 svn:log V 27 Drop tag for 0.61 release. K 10 svn:author V 5 simon PROPS-END Node-path: putty-0.61 Node-kind: dir Node-action: add Node-copyfrom-rev: 9202 Node-copyfrom-path: putty Revision-number: 9204 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2011-07-12T19:49:50.685245Z K 7 svn:log V 40 Website update for the release of 0.61. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d334fe88d0c6ce45acde625bab030cd7 Text-delta-base-sha1: d2ad0536b81fcbfc59f38562b5b4851e72be77f8 Text-content-length: 90 Text-content-md5: ff962867c76f710ea5b9876fdad61248 Text-content-sha1: c7f6e77e68197380d754b99bf401351ff2fea1a8 Content-length: 90 SVN��V% D��D�Ptemp /~sgtatham/putty/0.61/ http://the.earth.li/~sgtatham/putty/0.61 Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 356b2e865468764acac34449b85fa51a Text-delta-base-sha1: 882eb7c0b2ee80c09ca17faf9d37d6218560b076 Text-content-length: 1124 Text-content-md5: 7888429a0507f03dc186cbaa52e1b36c Text-content-sha1: 1b2ff8d821970e74798d871a2694201df68653bd Content-length: 1124 SVN��;+ I��I�Jq1 (released 2011-07-12): <ul> <li> Kerberos/GSSAPI authentication in SSH-2. <li> Local X11 authorisation support on Windows. (Unix already had it, of course.) <li> Support for non-fixed-width fonts on Windows. <li> GTK 2 support on Unix. <li> Specifying the logical host name independently of the physical network address to connect to. <li> Crypto and flow control optimisations. <li> Support for the <code>zlib@openssh.com</code> SSH-2 compression method. <li> Support for new Windows 7 UI features: Aero resizing and jump lists. <li> Support for OpenSSH AES-encrypted private key files in PuTTYgen. <li> Bug fix: handles OpenSSH private keys with primes in either order. <li> Bug fix: corruption of port forwarding is fixed (we think). <li> Bug fix: various crashes and hangs when exiting on failure, <li> Bug fix: hang in the serial back end on Windows. <li> Bug fix: Windows clipboard is now read asynchronously, in case of deadlock due to the clipboard owner being at the far end of the same PuTTY's network connection (either via X forwarding or via tunnelled <code>rdesktop</code>). </ul> Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 119531ab1d69276f4c3044f314972912 Text-delta-base-sha1: 17dd134a3af2e7fa2d4a5a0597c8e694df5d85c1 Text-content-length: 224 Text-content-md5: 4f15ac95bbc33c239cd7799b1ab168dd Text-content-sha1: 34d540d5d810d0d590eb153957344f5292da9a37 Content-length: 224 SVN��.{B�K��nLA��.11-07-12 PuTTY 0.61 is released</b> <p> PuTTY 0.61 is out, after over four years (sorry!), with new features, bug fixes, and compatibility updates for Windows 7 and various SSH server software. Revision-number: 9205 Prop-content-length: 427 Content-length: 427 K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-12T19:56:00.377516Z K 7 svn:log V 326 Various updates to the release checklist: - for 'ixion' read 'atreus' throughout - the signature-checking commands needed minor modifications to cope with more *sums files - stated a few things explicitly which were previously implied, in case the next inter-release gap is also long enough for me to forget them. PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 64f8942a929121e8fa5ce7d7bf58747a Text-delta-base-sha1: e4c4bc01936e42cea74de2a5bebe2e28a7b4aeba Text-content-length: 1060 Text-content-md5: ea599235c4e12c73f09bde0cbdbed95c Text-content-sha1: 25031954552351723dad054d535e725be5fe3906 Content-length: 1060 SVN��%_:^�6��;�}O�Q �(G�S0�u�&m�atreusatreusatreussums*) gpg --verify $i;; *) gpg --verify $i ${i%%.?SA};; esac; done + check the checksum files: md5sum -c md5sums sha1sum -c sha1sums sha256sum -c sha256sums sha512sum -c sha512sums - Having double-checked the release, copy it from atreuswebsite to refer to the new release: + on the front page, add a news item. + also on the front page, update the line that says "The latest version is beta 0.XX". (This one's really important, because the 'update-rsync' website mirror script on chiark greps for it!) + write a section on the Changes pageatreusatreus that the rsync mirror package (~/ftp/putty-website-mirror) contains a subdirectory for the new version and mentions it in its .htaccess. - Announce the release! + Mail the announcement to <putty-announce@lists.tartarus.org>. * Put a 'Reply-To: putty@projects.tartarus.org' header on the mail so that people don't keep replying to my personal Revision-number: 9206 Prop-content-length: 300 Content-length: 300 K 8 svn:date V 27 2011-07-12T19:59:15.614876Z K 7 svn:log V 199 Readjust checklist, because actually the section on updating the website _wasn't_ missing - I just looked straight past it somehow. Fold the two versions together into one more complete than either. K 10 svn:author V 5 simon PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ea599235c4e12c73f09bde0cbdbed95c Text-delta-base-sha1: 25031954552351723dad054d535e725be5fe3906 Text-content-length: 310 Text-content-md5: 7fbf715a54e4a6942b9749c71529b298 Text-content-sha1: 7dd2aebf1733cb2686ad521549e8bd86710faddc Content-length: 310 SVN��_���w�9&to say 'The latest version is <ver>'. + Adjust front page to add a news item. + Adjust Download page to say 'The latest release version (<ver>)'. + Adjust Download page to update filenames of installer and Unix tarball (both in the hrefs themselves and the link text) Revision-number: 9207 Prop-content-length: 128 Content-length: 128 K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-12T20:00:29.729764Z K 7 svn:log V 28 Add 0.61 to releases array. PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 132d0f209da758f42a8fc0ad933391c9 Text-delta-base-sha1: 66e67392b483f32ea8b0e6adfbb8d59d5afc2f1c Text-content-length: 71 Text-content-md5: 9b3b0ee51ff8a75761fdd6e360aa074f Text-content-sha1: 820408db99f91c060249d7c3babc82652ae3ec75 Content-length: 71 SVN��- /�N��0W [ "0.61", "2011-07-12", "r9203" ] # [ "0.62 Revision-number: 9208 Prop-content-length: 228 Content-length: 228 K 7 svn:log V 127 Ahem. Add vital missing comma, and also two more commas which should mean I don't make that mistake again in the next release. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-12T20:05:20.606586Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9b3b0ee51ff8a75761fdd6e360aa074f Text-delta-base-sha1: 820408db99f91c060249d7c3babc82652ae3ec75 Text-content-length: 104 Text-content-md5: bb9e2afc1bbb43f1b4f6d24848078e6a Text-content-sha1: 03bb9bdc3396d4a2c2a63e8a6df82664d323c1d7 Content-length: 104 SVN��-0 O�K�O�, [ "0.61", "2011-07-12", "r9203" ], # [ "0.62", "YYYY-MM-DD", "rXXXX" ], Revision-number: 9209 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9210 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9211 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9212 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9213 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9214 Prop-content-length: 1809 Content-length: 1809 K 8 svn:date V 27 2011-07-14T18:52:21.952067Z K 7 svn:log V 1707 Post-release destabilisation! Completely remove the struct type 'Config' in putty.h, which stores all PuTTY's settings and includes an arbitrary length limit on every single one of those settings which is stored in string form. In place of it is 'Conf', an opaque data type everywhere outside the new file conf.c, which stores a list of (key, value) pairs in which every key contains an integer identifying a configuration setting, and for some of those integers the key also contains extra parts (so that, for instance, CONF_environmt is a string-to-string mapping). Everywhere that a Config was previously used, a Conf is now; everywhere there was a Config structure copy, conf_copy() is called; every lookup, adjustment, load and save operation on a Config has been rewritten; and there's a mechanism for serialising a Conf into a binary blob and back for use with Duplicate Session. User-visible effects of this change _should_ be minimal, though I don't doubt I've introduced one or two bugs here and there which will eventually be found. The _intended_ visible effects of this change are that all arbitrary limits on configuration strings and lists (e.g. limit on number of port forwardings) should now disappear; that list boxes in the configuration will now be displayed in a sorted order rather than the arbitrary order in which they were added to the list (since the underlying data structure is now a sorted tree234 rather than an ad-hoc comma-separated string); and one more specific change, which is that local and dynamic port forwardings on the same port number are now mutually exclusive in the configuration (putting 'D' in the key rather than the value was a mistake in the first place). K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06a639e515f4cb30aef0a545bd3a6724 Text-delta-base-sha1: 815ba6adb8a5c007be1e0b4545ab691f2099953d Text-content-length: 68 Text-content-md5: 884b6351c6fa7490c9cfc85949977f92 Text-content-sha1: 6b772e623b909dd09edf9502fa22367beb3fe98f Content-length: 68 SVN�� &"� ��o �)x� �>=�{ conf confconfconf conf Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 70010f92c836f44a8c00772029147881 Text-delta-base-sha1: 273658b88b6231cf521ffef2b12b91a827b72652 Text-content-length: 5156 Text-content-md5: 5bd91fc602d7d4134031bafb6dc2e404 Text-content-sha1: 58540cd5df9d3c866edd5e20ee470858683bbee0 Content-length: 5156 SVN��l]:���'�]H�� ]� 8��QIZ�+u(�Y{[�zJ�g'�c�W;�S� l:�v�v!�#�$UF�_?B�_?�*�~<E�Z?C�~v�_?G�HzE�Hz� �9�|]�K�YC�B# *confonfPROT_SSH; default_port = 22; conf_set_int(conf, CONF_protocol, default_protocol); conf_set_int(conf, CONF_port, default_port)PROT_TELNET; default_port = 23; conf_set_int(conf, CONF_protocol, default_protocol); conf_set_int(conf, CONF_port, default_port)PROT_RLOGIN; default_port = 513; conf_set_int(conf, CONF_protocol, default_protocol); conf_set_int(conf, CONF_port, default_port)PROT_RAW; conf_set_int(conf, CONF_protocol, default_protocol)PROT_SERIAL; conf_set_int(conf, CONF_protocol, default_protocol); /* The host parameter will already be loaded into CONF_host, * so copy it across */ conf_set_str(conf, CONF_serline, conf_get_str(conf, CONF_host))conf_set_str(conf, CONF_username, value); } if (!strcmp(p, "-loghost")) { RETURN(2); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); SAVEABLE(0); conf_set_str(conf, CONF_loghost, value); } if ((!strcmp(p, "-L") || !strcmp(p, "-R") || !strcmp(p, "-D"))) { char type, *q, *qq, *key, *val; if (strcmp(p, "-D")) { /* * For -L or -R forwarding types: * (This looks like a foolish way of doing it given the * existence of strrchr, but it's more efficient than * two strrchrs - not to mention that the second strrchr * would require us to modify the input string!) */ type = p[1]; /* 'L' or 'R' */ q = qq = strchr(value if (!q) { cmdline_error("-%c expects at least two colons in its" " argument", type); return ret; } key = dupprintf("%c%.*s", type, q - value, value); val = dupstr(q+1); } else { /* * Dynamic port forwardings are entered under the same key * as if they were local (because they occupy the same * port space - a local and a dynamic forwarding on the * same local port are mutually exclusive), with the * special value "D" (which can be distinguished from * anything in the ordinary -L case by containing no * colon). */ key = dupprintf("L%s", value); val = dupstr("D"); } conf_set_str_str(conf, CONF_portfwd, key, val); sfree(key); sfree(val);portp = strchr(value, ':'); if (!portp) host = dupprintf("%.*s", portp - value, value); conf_set_str(conf, CONF_ssh_nc_host, host); conf_set_int(conf, CONF_ssh_nc_port, atoi(portp + 1));fclose(fp); conf_set_str(conf, CONF_remote_cmd, command); conf_set_str(conf, CONF_remote_cmd2, ""); conf_set_int(conf, CONF_nopty, TRUE); /* command => no terminal */ sfree(commandonf_set_int(conf, CONF_port, atoi(value)onf_get_int(conf, CONF_protocol)onf_set_int(conf, CONF_tryagent, TRUE)onf_set_int(conf, CONF_tryagent, FALSE); } if (!strcmp(p, "-Aconf_set_int(conf, CONF_agentfwd, 1); } if (!strcmp(p, "-aconf_set_int(conf, CONF_agentfwd, 0)onf_set_int(conf, CONF_x11_forward, 1)onf_set_int(conf, CONF_x11_forward, 0); } if (!strcmp(p, "-t1); /* lower priority than -m */ conf_set_int(conf, CONF_nopty, 0)onf_set_int(conf, CONF_nopty, 1); } if (!strcmp(p, "-Nconf_set_int(conf, CONF_ssh_no_shell, 1); } if (!strcmp(p, "-Conf_set_int(conf, CONF_compression, 1); } if (!strcmp(p, "-1onf_set_int(conf, CONF_sshprot, 0);onf_set_int(conf, CONF_sshprot, 3); /* ssh protocol 2 only */ } if (!strcmp(p, "-i")) { Filename fn; RETURN(2); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); SAVEABLE(0); fn = filename_from_str(value); conf_set_filename(conf, CONF_keyfile, &fn); } if (!strcmp(p, "-4") || !strcmp(p, "-ipv4")) { RETURN(1); SAVEABLE(1); conf_set_int(conf, CONF_addressfamily, ADDRTYPE_IPV4); } if (!strcmp(p, "-6") || !strcmp(p, "-ipv6")) { RETURN(1); SAVEABLE(1); conf_set_int(conf, CONF_addressfamily, ADDRTYPE_IPV6)onf_get_int(conf, CONF_protocol)case '2': conf_set_int(conf, CONF_serstopbits, 2 * (*nextitem-'0')); break; case '5': conf_set_int(conf, CONF_serdatabits, *nextitem-'0'); break; case 'n': conf_set_int(conf, CONF_serparity, SER_PAR_NONE); break; case 'o': conf_set_int(conf, CONF_serparity, SER_PAR_ODD); break; case 'e': conf_set_int(conf, CONF_serparity, SER_PAR_EVEN); break; case 'm': conf_set_int(conf, CONF_serparity, SER_PAR_MARK); break; case 's': conf_set_int(conf, CONF_serparity, SER_PAR_SPACE); break; case 'N': conf_set_int(conf, CONF_serflow, SER_FLOW_NONE); break; case 'X': conf_set_int(conf, CONF_serflow, SER_FLOW_XONXOFF); break; case 'R': conf_set_int(conf, CONF_serflow, SER_FLOW_RTSCTS); break; case 'D': conf_set_int(conf, CONF_serflow, SER_FLOW_DSRDTR)onf_set_int(conf, CONF_serstopbits, 3); } else { int serspeed = atoi(nextitem); if (serspeed != 0) { conf_set_int(conf, CONF_serspeed, serspeed) *confonf); } Node-path: putty/conf.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 15344 Text-content-md5: 4874b323aed000e846833605668df848 Text-content-sha1: 2f947650176adfec665907eac7432ecbdee35181 Content-length: 15354 PROPS-END SVN���bbb/* * conf.c: implementation of the internal storage format used for * the configuration of a PuTTY session. */ #include <stdio.h> #include <stddef.h> #include <assert.h> #include "tree234.h" #include "putty.h" /* * Enumeration of types used in keys and values. */ typedef enum { TYPE_NONE, TYPE_INT, TYPE_STR, TYPE_FILENAME, TYPE_FONT } Type; /* * Arrays which allow us to look up the subkey and value types for a * given primary key id. */ #define CONF_SUBKEYTYPE_DEF(valtype, keytype, keyword) TYPE_ ## keytype, static int subkeytypes[] = { CONFIG_OPTIONS(CONF_SUBKEYTYPE_DEF) }; #define CONF_VALUETYPE_DEF(valtype, keytype, keyword) TYPE_ ## valtype, static int valuetypes[] = { CONFIG_OPTIONS(CONF_VALUETYPE_DEF) }; /* * Configuration keys are primarily integers (big enum of all the * different configurable options); some keys have string-designated * subkeys, such as the list of environment variables (subkeys * defined by the variable names); some have integer-designated * subkeys (wordness, colours, preference lists). */ struct key { int primary; union { int i; char *s; } secondary; }; struct value { union { int intval; char *stringval; Filename fileval; FontSpec fontval; } u; }; struct conf_entry { struct key key; struct value value; }; struct conf_tag { tree234 *tree; }; /* * Because 'struct key' is the first element in 'struct conf_entry', * it's safe (guaranteed by the C standard) to cast arbitrarily back * and forth between the two types. Therefore, we only need one * comparison function, which can double as a main sort function for * the tree (comparing two conf_entry structures with each other) * and a search function (looking up an externally supplied key). */ static int conf_cmp(void *av, void *bv) { struct key *a = (struct key *)av; struct key *b = (struct key *)bv; if (a->primary < b->primary) return -1; else if (a->primary > b->primary) return +1; switch (subkeytypes[a->primary]) { case TYPE_INT: if (a->secondary.i < b->secondary.i) return -1; else if (a->secondary.i > b->secondary.i) return +1; return 0; case TYPE_STR: return strcmp(a->secondary.s, b->secondary.s); default: return 0; } } /* * Free any dynamic data items pointed to by a 'struct key'. We * don't free the structure itself, since it's probably part of a * larger allocated block. */ static void free_key(struct key *key) { if (subkeytypes[key->primary] == TYPE_STR) sfree(key->secondary.s); } /* * Copy a 'struct key' into another one, copying its dynamic data * if necessary. */ static void copy_key(struct key *to, struct key *from) { to->primary = from->primary; switch (subkeytypes[to->primary]) { case TYPE_INT: to->secondary.i = from->secondary.i; break; case TYPE_STR: to->secondary.s = dupstr(from->secondary.s); break; } } /* * Free any dynamic data items pointed to by a 'struct value'. We * don't free the value itself, since it's probably part of a larger * allocated block. */ static void free_value(struct value *val, int type) { if (type == TYPE_STR) sfree(val->u.stringval); } /* * Copy a 'struct value' into another one, copying its dynamic data * if necessary. */ static void copy_value(struct value *to, struct value *from, int type) { switch (type) { case TYPE_INT: to->u.intval = from->u.intval; break; case TYPE_STR: to->u.stringval = dupstr(from->u.stringval); break; case TYPE_FILENAME: to->u.fileval = from->u.fileval; break; case TYPE_FONT: to->u.fontval = from->u.fontval; break; } } /* * Free an entire 'struct conf_entry' and its dynamic data. */ static void free_entry(struct conf_entry *entry) { free_key(&entry->key); free_value(&entry->value, valuetypes[entry->key.primary]); sfree(entry); } Conf *conf_new(void) { Conf *conf = snew(struct conf_tag); conf->tree = newtree234(conf_cmp); return conf; } static void conf_clear(Conf *conf) { struct conf_entry *entry; while ((entry = delpos234(conf->tree, 0)) != NULL) free_entry(entry); } void conf_free(Conf *conf) { conf_clear(conf); freetree234(conf->tree); sfree(conf); } static void conf_insert(Conf *conf, struct conf_entry *entry) { struct conf_entry *oldentry = add234(conf->tree, entry); if (oldentry && oldentry != entry) { del234(conf->tree, oldentry); free_entry(oldentry); oldentry = add234(conf->tree, entry); assert(oldentry == entry); } } void conf_copy_into(Conf *newconf, Conf *oldconf) { struct conf_entry *entry, *entry2; int i; for (i = 0; (entry = index234(oldconf->tree, i)) != NULL; i++) { entry2 = snew(struct conf_entry); copy_key(&entry2->key, &entry->key); copy_value(&entry2->value, &entry->value, valuetypes[entry->key.primary]); add234(newconf->tree, entry2); } } Conf *conf_copy(Conf *oldconf) { Conf *newconf = conf_new(); conf_copy_into(newconf, oldconf); return newconf; } int conf_get_int(Conf *conf, int primary) { struct key key; struct conf_entry *entry; assert(subkeytypes[primary] == TYPE_NONE); assert(valuetypes[primary] == TYPE_INT); key.primary = primary; entry = find234(conf->tree, &key, NULL); assert(entry); return entry->value.u.intval; } int conf_get_int_int(Conf *conf, int primary, int secondary) { struct key key; struct conf_entry *entry; assert(subkeytypes[primary] == TYPE_INT); assert(valuetypes[primary] == TYPE_INT); key.primary = primary; key.secondary.i = secondary; entry = find234(conf->tree, &key, NULL); assert(entry); return entry->value.u.intval; } char *conf_get_str(Conf *conf, int primary) { struct key key; struct conf_entry *entry; assert(subkeytypes[primary] == TYPE_NONE); assert(valuetypes[primary] == TYPE_STR); key.primary = primary; entry = find234(conf->tree, &key, NULL); assert(entry); return entry->value.u.stringval; } char *conf_get_str_str_opt(Conf *conf, int primary, const char *secondary) { struct key key; struct conf_entry *entry; assert(subkeytypes[primary] == TYPE_STR); assert(valuetypes[primary] == TYPE_STR); key.primary = primary; key.secondary.s = (char *)secondary; entry = find234(conf->tree, &key, NULL); return entry ? entry->value.u.stringval : NULL; } char *conf_get_str_str(Conf *conf, int primary, const char *secondary) { char *ret = conf_get_str_str_opt(conf, primary, secondary); assert(ret); return ret; } char *conf_get_str_strs(Conf *conf, int primary, char *subkeyin, char **subkeyout) { struct key key; struct conf_entry *entry; assert(subkeytypes[primary] == TYPE_STR); assert(valuetypes[primary] == TYPE_STR); key.primary = primary; if (subkeyin) { key.secondary.s = subkeyin; entry = findrel234(conf->tree, &key, NULL, REL234_GT); } else { key.secondary.s = ""; entry = findrel234(conf->tree, &key, NULL, REL234_GE); } if (!entry || entry->key.primary != primary) return NULL; *subkeyout = entry->key.secondary.s; return entry->value.u.stringval; } char *conf_get_str_nthstrkey(Conf *conf, int primary, int n) { struct key key; struct conf_entry *entry; int index; assert(subkeytypes[primary] == TYPE_STR); assert(valuetypes[primary] == TYPE_STR); key.primary = primary; key.secondary.s = ""; entry = findrelpos234(conf->tree, &key, NULL, REL234_GE, &index); if (!entry || entry->key.primary != primary) return NULL; entry = index234(conf->tree, index + n); if (!entry || entry->key.primary != primary) return NULL; return entry->key.secondary.s; } Filename *conf_get_filename(Conf *conf, int primary) { struct key key; struct conf_entry *entry; assert(subkeytypes[primary] == TYPE_NONE); assert(valuetypes[primary] == TYPE_FILENAME); key.primary = primary; entry = find234(conf->tree, &key, NULL); assert(entry); return &entry->value.u.fileval; } FontSpec *conf_get_fontspec(Conf *conf, int primary) { struct key key; struct conf_entry *entry; assert(subkeytypes[primary] == TYPE_NONE); assert(valuetypes[primary] == TYPE_FONT); key.primary = primary; entry = find234(conf->tree, &key, NULL); assert(entry); return &entry->value.u.fontval; } void conf_set_int(Conf *conf, int primary, int value) { struct conf_entry *entry = snew(struct conf_entry); assert(subkeytypes[primary] == TYPE_NONE); assert(valuetypes[primary] == TYPE_INT); entry->key.primary = primary; entry->value.u.intval = value; conf_insert(conf, entry); } void conf_set_int_int(Conf *conf, int primary, int secondary, int value) { struct conf_entry *entry = snew(struct conf_entry); assert(subkeytypes[primary] == TYPE_INT); assert(valuetypes[primary] == TYPE_INT); entry->key.primary = primary; entry->key.secondary.i = secondary; entry->value.u.intval = value; conf_insert(conf, entry); } void conf_set_str(Conf *conf, int primary, const char *value) { struct conf_entry *entry = snew(struct conf_entry); assert(subkeytypes[primary] == TYPE_NONE); assert(valuetypes[primary] == TYPE_STR); entry->key.primary = primary; entry->value.u.stringval = dupstr(value); conf_insert(conf, entry); } void conf_set_str_str(Conf *conf, int primary, const char *secondary, const char *value) { struct conf_entry *entry = snew(struct conf_entry); assert(subkeytypes[primary] == TYPE_STR); assert(valuetypes[primary] == TYPE_STR); entry->key.primary = primary; entry->key.secondary.s = dupstr(secondary); entry->value.u.stringval = dupstr(value); conf_insert(conf, entry); } void conf_del_str_str(Conf *conf, int primary, const char *secondary) { struct key key; struct conf_entry *entry; assert(subkeytypes[primary] == TYPE_STR); assert(valuetypes[primary] == TYPE_STR); key.primary = primary; key.secondary.s = (char *)secondary; entry = find234(conf->tree, &key, NULL); if (entry) { del234(conf->tree, entry); free_entry(entry); } } void conf_set_filename(Conf *conf, int primary, const Filename *value) { struct conf_entry *entry = snew(struct conf_entry); assert(subkeytypes[primary] == TYPE_NONE); assert(valuetypes[primary] == TYPE_FILENAME); entry->key.primary = primary; entry->value.u.fileval = *value; /* structure copy */ conf_insert(conf, entry); } void conf_set_fontspec(Conf *conf, int primary, const FontSpec *value) { struct conf_entry *entry = snew(struct conf_entry); assert(subkeytypes[primary] == TYPE_NONE); assert(valuetypes[primary] == TYPE_FONT); entry->key.primary = primary; entry->value.u.fontval = *value; /* structure copy */ conf_insert(conf, entry); } int conf_serialised_size(Conf *conf) { int i; struct conf_entry *entry; int size = 0; for (i = 0; (entry = index234(conf->tree, i)) != NULL; i++) { size += 4; /* primary key */ switch (subkeytypes[entry->key.primary]) { case TYPE_INT: size += 4; break; case TYPE_STR: size += 1 + strlen(entry->key.secondary.s); break; } switch (valuetypes[entry->key.primary]) { case TYPE_INT: size += 4; break; case TYPE_STR: size += 1 + strlen(entry->value.u.stringval); break; case TYPE_FILENAME: size += sizeof(entry->value.u.fileval); break; case TYPE_FONT: size += sizeof(entry->value.u.fontval); break; } } size += 4; /* terminator value */ return size; } void conf_serialise(Conf *conf, void *vdata) { unsigned char *data = (unsigned char *)vdata; int i, len; struct conf_entry *entry; for (i = 0; (entry = index234(conf->tree, i)) != NULL; i++) { PUT_32BIT_MSB_FIRST(data, entry->key.primary); data += 4; switch (subkeytypes[entry->key.primary]) { case TYPE_INT: PUT_32BIT_MSB_FIRST(data, entry->key.secondary.i); data += 4; break; case TYPE_STR: len = strlen(entry->key.secondary.s); memcpy(data, entry->key.secondary.s, len); data += len; *data++ = 0; break; } switch (valuetypes[entry->key.primary]) { case TYPE_INT: PUT_32BIT_MSB_FIRST(data, entry->value.u.intval); data += 4; break; case TYPE_STR: len = strlen(entry->value.u.stringval); memcpy(data, entry->value.u.stringval, len); data += len; *data++ = 0; break; case TYPE_FILENAME: memcpy(data, &entry->value.u.fileval, sizeof(entry->value.u.fileval)); data += sizeof(entry->value.u.fileval); break; case TYPE_FONT: memcpy(data, &entry->value.u.fontval, sizeof(entry->value.u.fontval)); data += sizeof(entry->value.u.fontval); break; } } PUT_32BIT_MSB_FIRST(data, 0xFFFFFFFFU); } int conf_deserialise(Conf *conf, void *vdata, int maxsize) { unsigned char *data = (unsigned char *)vdata; unsigned char *start = data; struct conf_entry *entry; int primary; unsigned char *zero; while (maxsize >= 4) { primary = GET_32BIT_MSB_FIRST(data); data += 4, maxsize -= 4; if ((unsigned)primary >= N_CONFIG_OPTIONS) break; entry = snew(struct conf_entry); entry->key.primary = primary; switch (subkeytypes[entry->key.primary]) { case TYPE_INT: if (maxsize < 4) { sfree(entry); goto done; } entry->key.secondary.i = GET_32BIT_MSB_FIRST(data); data += 4, maxsize -= 4; break; case TYPE_STR: zero = memchr(data, 0, maxsize); if (!zero) { sfree(entry); goto done; } entry->key.secondary.s = dupstr((char *)data); maxsize -= (zero + 1 - data); data = zero + 1; break; } switch (valuetypes[entry->key.primary]) { case TYPE_INT: if (maxsize < 4) { if (subkeytypes[entry->key.primary] == TYPE_STR) sfree(entry->key.secondary.s); sfree(entry); goto done; } entry->value.u.intval = GET_32BIT_MSB_FIRST(data); data += 4, maxsize -= 4; break; case TYPE_STR: zero = memchr(data, 0, maxsize); if (!zero) { if (subkeytypes[entry->key.primary] == TYPE_STR) sfree(entry->key.secondary.s); sfree(entry); goto done; } entry->value.u.stringval = dupstr((char *)data); maxsize -= (zero + 1 - data); data = zero + 1; break; case TYPE_FILENAME: if (maxsize < sizeof(entry->value.u.fileval)) { if (subkeytypes[entry->key.primary] == TYPE_STR) sfree(entry->key.secondary.s); sfree(entry); goto done; } memcpy(&entry->value.u.fileval, data, sizeof(entry->value.u.fileval)); data += sizeof(entry->value.u.fileval); maxsize -= sizeof(entry->value.u.fileval); break; case TYPE_FONT: if (maxsize < sizeof(entry->value.u.fontval)) { if (subkeytypes[entry->key.primary] == TYPE_STR) sfree(entry->key.secondary.s); sfree(entry); goto done; } memcpy(&entry->value.u.fontval, data, sizeof(entry->value.u.fontval)); data += sizeof(entry->value.u.fontval); maxsize -= sizeof(entry->value.u.fontval); break; } conf_insert(conf, entry); } done: return (int)(data - start); } Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7d626a6a5cbbf3871e0d1911f2ac62db Text-delta-base-sha1: 8a4ceade21e9071e70778b5133c6192401f692bc Text-content-length: 22021 Text-content-md5: f51ff23cbf80888faac8cdd715667f80 Text-content-sha1: 3d7b08489b84a3e12ef555cb112a4f82cd99ccf8 Content-length: 22021 SVN��OEl �L��O~=�n-�b:�{B�pI��\#>�P�i/�5)v�&�c8u�[k�%Sz�C9�s �Sp�KFA�?�V�!NU�xx�)�?�Q~�"� Kx�Q~�(�I5�3V�q=�?� ^ �o��|I�|L�@J�m,� i�`D�3�:4�x�3�sb�fb�^f�QW�/9�Z-e�%i^�}$ �yb�($�$]�L6�u<s�k6o�n1a�u|�"�L6e�}D � @�,#�$`�L6g�`"� E�$X�is@�:b�m�F�a{��rZ�,��`c�2z�_a�\r+�[1�*j�LK�N�#1��Gx�U�z �d7.�]e�Uv:�f!�o?�un�t�}R�m�v@�bw5�],�t9�w^8�j7C� ��9M�.;�U�B'�}$�d{C�0�)�"i�I�J��h�l=�bi��tJ�zz�C3�E8��Z�c5� _3�~~�;�`2�K�o[M�4�K@�qv�>d�Ff�%s�v[�Q�8L�Ly�d3�Zq�s/F�Z��|�v<�xo�P$�u4�Ii�jk�p�>>�0�!o�C�p�MF�GU�R0�|F�[�|!�'`�&�}J�}c�w��7�\���"@void conf_radiobuttonint button; Conf *conf = (Conf *)data; /* * For a standard radio button set, the context parameter gives * the primary key (CONF_foo), and the extra data per button * gives the value the target field should take if that button * is the one selected. */ if (event == EVENT_REFRESH) { int val = conf_get_int(conf, ctrl->radio.context.i); for (button = 0; button < ctrl->radio.nbuttons; button++) if (vaonf_set_int(conf, ctrl->radio.context.i, ctrl->radio.buttondata[button].i); } } #define CHECKBOX_INVERT (1<<30) void conf_checkbox_handler(union control *ctrl, void *dlg, void *data, int event) { int key, invert; Conf *conf = (Conf *)data; /* * For a standard checkbox, the context parameter gives the * primary key (CONF_foo), optionally ORed with CHECKBOX_INVERT. */ key = ctrl->checkbox.context.i; if (key & CHECKBOX_INVERT) { key &= ~CHECKBOX_INVERT; invert = 1; } else invert = 0; /* * C lacks a logical XOR, so the following code uses the idiom * (!a ^ !b) to obtain the logical XOR of a and b. (That is, 1 * iff exactly one of a and b is nonzero, otherwise 0.) */ if (event == EVENT_REFRESH) { int val = conf_get_int(conf, key); dlg_checkbox_set(ctrl, dlg, (!val ^ !invert)); } else if (event == EVENT_VALCHANGE) { conf_set_int(conf, key, !dlg_checkbox_get(ctrl,dlg) ^ !invert); } } void conf_editbox_handler(union control *ctrl, void *dlg, void *data, int event) { /* * The standard edit-box handler expects the main `context' * field to contain the primary key. The secondary `context2' * field indicates the type of this field: * * - if context2 > 0, the field is a string. * - if context2 == -1, the field is an int and the edit box * is numeric. * - if context2 < -1, the field is an int and the edit box is * _floating_, and (-context2) gives the scale. (E.g. if * context2 == -1000, then typing 1.2 into the box will set * the field to 1200.) */ int key = ctrl->editbox.context.i; int length = ctrl->editbox.context2.i; Conf *conf = (Conf *)data; if (length > 0) { if (event == EVENT_REFRESH) { char *field = conf_get_str(conf, key); dlg_editbox_set(ctrl, dlg, field); } else if (event == EVENT_VALCHANGE) { char *field = dlg_editbox_get(ctrl, dlg); conf_set_str(conf, key, field); sfree(field); } } else if (length < 0) { if (event == EVENT_REFRESH) { char str[80]; int value = conf_get_int(conf, key); if (length == -1) sprintf(str, "%d", value); else sprintf(str, "%g", (double)value / (double)(-length)); dlg_editbox_set(ctrl, dlg, str); } else if (event == EVENT_VALCHANGE) { char *str = dlg_editbox_get(ctrl, dlg); if (length == -1) conf_set_int(conf, key, atoi(str)); else conf_set_int(conf, key, (int)((-length) * atof(str))); sfree(str); } } } void conf_filesel_handler(union control *ctrl, void *dlg, void *data, int event) { int key = ctrl->fileselect.context.i; Conf *conf = (Conf *)data; if (event == EVENT_REFRESH) { dlg_filesel_set(ctrl, dlg, *conf_get_filename(conf, key)); } else if (event == EVENT_VALCHANGE) { Filename filename; dlg_filesel_get(ctrl, dlg, &filename); conf_set_filename(conf, key, &filename); /* If Filenames ever become dynamic, free this one. */ } } void conf_fontsel_handler(union control *ctrl, void *dlg, void *data, int event) { int key = ctrl->fontselect.context.i; Conf *conf = (Conf *)data; if (event == EVENT_REFRESH) { dlg_fontsel_set(ctrl, dlg, *conf_get_fontspec(conf, key)); } else if (event == EVENT_VALCHANGE) { FontSpec fontspec; dlg_fontsel_get(ctrl, dlg, &fontspec); conf_set_fontspec(conf, key, &fontspec); /* If FontSpecs ever become dynamic, free this one. */ } } static void config_host_handler(union control *ctrl, void *dlg, void *data, int event) { Conf *conf = (Confonf_get_int(conf, CONF_protocol)onf_get_str(conf, CONF_serline)); } else { dlg_label_change(ctrl, dlg, HOST_BOX_TITLE); dlg_editbox_set(ctrl, dlg, conf_get_str(conf, CONF_host)); } } else if (event == EVENT_VALCHANGE) { char *s = dlg_editbox_get(ctrl, dlg); if (conf_get_int(conf, CONF_protocol) == PROT_SERIAL) conf_set_str(conf, CONF_serline, s); else conf_set_str(conf, CONF_host, s); sfree(s); } } static void config_port_handler(union control *ctrl, void *dlg, void *data, int event) { Conf *conf = (Confonf_get_int(conf, CONF_protocol)onf_get_int(conf, CONF_serspeed)); } else { dlg_label_change(ctrl, dlg, PORT_BOX_TITLE); if (conf_get_int(conf, CONF_port) != 0) sprintf(buf, "%d", conf_get_int(conf, CONF_port)char *s = dlg_editbox_get(ctrl, dlg); int i = atoi(s); sfree(s); if (conf_get_int(conf, CONF_protocol) == PROT_SERIAL) conf_set_int(conf, CONF_serspeed, i); else conf_set_int(conf, CONF_port, i *conf = (Confint protocol = conf_get_int(conf, CONF_protocol); for (button = 0; button < ctrl->radio.nbuttons; button++) if (onf_get_int(conf, CONF_protocol); int newproto, port; newproto = ctrl->radio.buttondata[button].i; conf_set_int(conf, CONF_protocol, newproto); if (oldproto != newprotonewprotoport = conf_get_int(conf, CONF_port); if (port == ob->default_port) conf_set_int(conf, CONF_port, nb->default_port) *conf = (Conf int logtype = conf_get_int(conf, CONF_logtype); logtype == ctrl->radio.buttondata[button].i) break; /* We fell off the end, so we lack the configured logging type */ if (button == ctrl->radio.nbuttons) { button = 0; conf_set_int(conf, CONF_logtype, LGTYP_NONE); } onf_set_int(conf, CONF_logtype, ctrl->radio.buttondata[button].i) *conf = (Conf. */ if (event == EVENT_REFRESH) { if (conf_get_int(conf, CONF_nethack_keypad)) button = 2; else if (conf_get_int(conf, CONF_app_keypad)onf_set_int(conf, CONF_app_keypad, FALSE); conf_set_int(conf, CONF_nethack_keypad, TRUE); } else { conf_set_int(conf, CONF_app_keypad, (button != 0)); conf_set_int(conf, CONF_nethack_keypad, FALSE) *conf = (Confonf_get_int_int(conf, CONF_ssh_cipherlist, i)onf_set_int_int(conf, CONF_ssh_cipherlist, i, dlg_listbox_getid(ctrl, dlg, i)); } } #ifndef NO_GSSAPI static void gsslist *conf = (Confonf_get_int_int(conf, CONF_ssh_gsslist, i)onf_set_int_int(conf, CONF_ssh_gsslist, i, dlg_listbox_getid(ctrl, dlg, i)); } } #endif static void kexlist *conf = (Confonf_get_int_int(conf, CONF_ssh_kexlist, i)onf_set_int_int(conf, CONF_ssh_kexlist, i, dlg_listbox_getid(ctrl, dlg, i)); } } static void printerbox_handler(union control *ctrl, void *dlg, void *data, int event) { Conf *conf = (Conf *)data; if (event == EVENT_REFRESH) { int nprinters, i; printer_enum *pe; char *printerprinter = conf_get_str(conf, CONF_printer); if (!printer) printer = PRINTER_DISABLED_STRING; dlg_editbox_set(ctrl, dlg, printer); dlg_update_done(ctrl, dlg); } else if (event == EVENT_VALCHANGE) { char *printer = dlg_editbox_get(ctrl, dlg); if (!strcmp(printer, PRINTER_DISABLED_STRING)) printer[0] = '\0'; conf_set_str(conf, CONF_printer, printer); sfree(printer) *conf = (Confonf_get_str(conf, CONF_line_codepage)conf_set_str(conf, CONF_line_codepage, thiscp); dlg_update_done(ctrl, dlg); } else if (event == EVENT_VALCHANGE) { char *codepage = dlg_editbox_get(ctrl, dlg); conf_set_str(conf, CONF_line_codepage, cp_name(decode_codepage(codepage))); sfree(codepage); } } static void sshbug_handler(union control *ctrl, void *dlg, void *data, int event) { Conf *conf = (Conf *)data;conf_get_int(confconf_set_int(conf, ctrl->listbox.context.i, i) *confonf *conf = (Conf). * * FIXME: this is disgusting, and we'd do much better to have * the persistent storage be dynamically allocated and get rid * of the arbitrary limit SAVEDSESSION_LEN. To do that would * require a means of making sure the memory gets freed at the * appropriate momentchar *tmp = dlg_editbox_get(ctrl, dlg); strncpy(savedsession, tmp, SAVEDSESSION_LEN); sfree(tmponf, &mbl) && (mbl && ctrl == ssd->listbox && conf_launchable(confonfonf_launchable(conf)) { Conf *conf2 = conf_new(); int mbl = FALSE; if (!load_selected_session(ssd, savedsession, dlg, conf2, &mbl)) { dlg_beep(dlg); conf_free(conf2); return; } /* If at this point we have a valid session, go! */ if (mbl && conf_launchable(conf2)) { conf_copy_into(conf, conf2); dlg_end(dlg, 1); } else dlg_beep(dlg); conf_free(conf2onf_launchable(conf *conf = (Conf conf_get_int_int(conf, CONF_wordness, i)*str; int i, n; str = dlg_editbox_get(ccd->editbox, dlg); n = atoi(str); sfreeonf_set_int_int(conf, CONF_wordness, i, n) *conf = (Confonf_get_int_int(conf, CONF_colours, i*3+0); g = conf_get_int_int(conf, CONF_colours, i*3+0); b = conf_get_int_int(conf, CONF_colours, i*3+0)*str; int i, cval; str = dlg_editbox_get(ctrl, dlg); cval = atoi(str); sfree(stronf_set_int_int(conf, CONF_colours, i*3+0, cval); else if (ctrl == cd->gedit) conf_set_int_int(conf, CONF_colours, i*3+1, cval); else if (ctrl == cd->bedit) conf_set_int_int(conf, CONF_colours, i*3+2, cval)onf_get_int_int(conf, CONF_colours, i*3+0), conf_get_int_int(conf, CONF_colours, i*3+1), conf_get_int_int(conf, CONF_colours, i*3+2)onf_set_int_int(conf, CONF_colours, i*3+0, r); conf_set_int_int(conf, CONF_colours, i*3+0, g); conf_set_int_int(conf, CONF_colours, i*3+0, b) *conf = (Confkey, *valfor (val = conf_get_str_strs(conf, CONF_ttymodes, NULL, &key); val != NULL; val = conf_get_str_strs(conf, CONF_ttymodes, key, &key)) { char *disp = dupprintf("%s\t%s", key, (val[0] == 'A') ? "(auto)" : val+1); dlg_listbox_add(ctrl, dlg, disp)const char *key; char *str, *val; /* Construct new entry */ key = ttymodes[ind]; str = dlg_editbox_get(td->valbox, dlg); val = dupprintf("%c%s", type, str); sfree(str); conf_set_str_str(conf, CONF_ttymodes, key, val); sfree(valint i = 0; char *key, *val; int multisel = dlg_listbox_index(td->listbox, dlg) < 0; for (val = conf_get_str_strs(conf, CONF_ttymodes, NULL, &key); val != NULL; val = conf_get_str_strs(conf, CONF_ttymodes, key, &key)) {int ind = 0; val++; while (ttymodes[ind]) { if (!strcmp(ttymodes[ind], key)) break; ind++; } dlg_listbox_select(td->modelist, dlg, ind); dlg_radiobutton_set(td->valradio, dlg, (*val == 'V')); dlg_editbox_set(td->valbox, dlg, val+1); } conf_del_str_str(conf, CONF_ttymodes, key); } i++; } *conf = (Confkey, *valfor (val = conf_get_str_strs(conf, CONF_environmt, NULL, &key); val != NULL; val = conf_get_str_strs(conf, CONF_environmt, key, &key)) { char *p = dupprintf("%s\t%s", key, val); dlg_listbox_add(ctrl, dlg, p); sfree(p)*key, *val, *str; key = dlg_editbox_get(ed->varbox, dlg); if (!*key) { sfree(key); dlg_beep(dlg); return; } val = dlg_editbox_get(ed->valbox, dlg); if (!*val) { sfree(key); sfree(val); dlg_beep(dlg); return; } conf_set_str_str(conf, CONF_environmt, key, val); str = dupcat(key, "\t", val, NULL); dlg_editbox_set(ed->varbox, dlg, ""); dlg_editbox_set(ed->valbox, dlg, ""); sfree(str); sfree(key); sfree(val); dlg_refresh(ed->listbox, dlg);key, *val; key = conf_get_str_nthstrkey(conf, CONF_environmt, i); if (key) { /* Populate controls with the entry we're about to delete * for ease of editing */ val = conf_get_str_str(conf, CONF_environmt, key); dlg_editbox_set(ed->varbox, dlg, key); dlg_editbox_set(ed->valbox, dlg, val); /* And delete it */ conf_del_str_str(conf, CONF_environmt, key); } } dlg_refresh(ed->listbox, dlg); *conf = (Confkey, *valfor (val = conf_get_str_strs(conf, CONF_portfwd, NULL, &key); val != NULL; val = conf_get_str_strs(conf, CONF_portfwd, key, &key)) { char *p; if (!strcmp(val, "D")) p = dupprintf("D%s\t", key+1); else p = dupprintf("%s\t%s", key, val); dlg_listbox_add(ctrl, dlg, p); sfree(p)*family, *type, *src, *key, *val; int i,family = "4"; else if (whichbutton == 2) family = "6"; else family = ""; #endif whichbutton = dlg_radiobutton_get(pfd->direction, dlg); if (whichbutton == 0) type = "L"; else if (whichbutton == 1) type = "R"; else type = "D"; src = dlg_editbox_get(pfd->sourcebox, dlg); if (!*src) { dlg_error_msg(dlg, "You need to specify a source port number"); sfree(src); return; } if (*type != 'D') { val = dlg_editbox_get(pfd->destbox, dlg); if (!*val || !strchr(valsfree(src); sfree(val); return; } } else { type = "L"; val = dupstr("D"); /* special case */ } key = dupcat(family, type, src, NULL); sfree(src); if (conf_get_str_str_opt(conf, CONF_portfwd, key)) { dlg_error_msg(dlg, "Specified forwarding already exists"); } else { conf_set_str_str(conf, CONF_portfwd, key, val); } sfree(key); sfree(val); dlg_refresh(pfd->listbox, dlg); { dlg_beep(dlg); } else { char *key, *val, *p; key = conf_get_str_nthstrkey(conf, CONF_portfwd, i); if (key) { static const char *const afs = "A46"; static const char *const dirs = "LRD"; char *afp; int dir; #ifndef NO_IPV6 int idx; #endif /* Populate controls with the entry we're about to delete * for ease of editing */ p = key; afp = strchr(afs, *p); #ifndef NO_IPV6 dir = *p; val = conf_get_str_str(conf, CONF_portfwd, key); if (!strcmp(val, "D")) { dir = 'D'; val = ""; } dlg_radiobutton_set(pfd->direction, dlg, strchr(dirs, dir) - dirs); p++; dlg_editbox_set(pfd->sourcebox, dlg, p); dlg_editbox_set(pfd->destbox, dlg, val); /* And delete it */ conf_del_str_str(conf, CONF_portfwd, key); } } dlg_refresh(pfd->listbox, dlg);conf_radiobutton_handler, I(CONF_close_on_exitCONF_logtypeconf_filesel_handler, I(CONF_logfilenameconf_radiobutton_handler, I(CONF_logxfovrconf_checkbox_handler, I(CONF_logflushconf_checkbox_handler, I(CONF_logomitpassconf_checkbox_handler, I(CONF_logomitdataconf_checkbox_handler, I(CONF_wrap_modeconf_checkbox_handler, I(CONF_dec_omconf_checkbox_handler, I(CONF_lfhascr)); ctrl_checkbox(s, "Implicit LF in every CR", 'f', HELPCTX(terminal_crhaslf), conf_checkbox_handler, I(CONF_crhaslf)); ctrl_checkbox(s, "Use background colour to erase screen", 'e', HELPCTX(terminal_bce), conf_checkbox_handler, I(CONF_bce)); ctrl_checkbox(s, "Enable blinking text", 'n', HELPCTX(terminal_blink), conf_checkbox_handler, I(CONF_blinktextconf_editbox_handler, I(CONF_answerback), I(1conf_radiobutton_handler,I(CONF_localechoconf_radiobutton_handler,I(CONF_localeditconf_radiobutton_handler, I(CONF_bksp_is_deleteconf_radiobutton_handler, I(CONF_rxvt_homeendconf_radiobutton_handler, I(CONF_funky_typeconf_radiobutton_handler, I(CONF_app_cursorconf_radiobutton_handler, I(CONF_beepconf_checkbox_handler, I(CONF_bellovlconf_editbox_handler, I(CONF_bellovl_n), I(-1)); ctrl_editbox(s, "... in this many seconds", 't', 20, HELPCTX(bell_overload), conf_editbox_handler, I(CONF_bellovl_tconf_editbox_handler, I(CONF_bellovl_sconf_checkbox_handler, I(CONF_no_applic_c)); ctrl_checkbox(s, "Disable application keypad mode", 'k', HELPCTX(features_application), conf_checkbox_handler, I(CONF_no_applic_kconf_checkbox_handler, I(CONF_no_mouse_repconf_checkbox_handler, I(CONF_no_remote_resizeconf_checkbox_handler, I(CONF_no_alt_screenconf_checkbox_handler, I(CONF_no_remote_wintitleconf_radiobutton_handler, I(CONF_remote_qtitle_actionconf_checkbox_handler, I(CONF_no_dbackspaceconf_checkbox_handler, I(CONF_no_remote_charsetconf_checkbox_handler, I(CONF_arabicshaping)); ctrl_checkbox(s, "Disable bidirectional text display", 'd', HELPCTX(features_bidi), conf_checkbox_handler, I(CONF_bidiconf_editbox_handler, I(CONF_widthconf_editbox_handler, I(CONF_heightconf_editbox_handler, I(CONF_savelines), I(-1)); ctrl_checkbox(s, "Display scrollbar", 'd', HELPCTX(window_scrollback), conf_checkbox_handler, I(CONF_scrollbar)); ctrl_checkbox(s, "Reset scrollback on keypress", 'k', HELPCTX(window_scrollback), conf_checkbox_handler, I(CONF_scroll_on_keyconf_checkbox_handler, I(CONF_scroll_on_disp)); ctrl_checkbox(s, "Push erased text into scrollback", 'e', HELPCTX(window_erased), conf_checkbox_handler, I(CONF_erase_to_scrollbackconf_radiobutton_handler, I(CONF_cursor_typeconf_checkbox_handler, I(CONF_blink_curconf_fontsel_handler, I(CONF_fontconf_checkbox_handler, I(CONF_hide_mouseptrconf_editbox_handler, I(CONF_window_borderconf_editbox_handler, I(CONF_wintitle), I(1conf_checkbox_handler, I(CHECKBOX_INVERT | CONF_win_name_alwaysconf_checkbox_handler, I(CONF_warn_on_closeconf_checkbox_handler, I(CONF_cjk_ambig_wideconf_radiobutton_handler, I(CONF_vtmodeconf_checkbox_handler, I(CONF_rawcnpconf_checkbox_handler, I(CONF_mouse_overrideconf_radiobutton_handler, I(CONF_rect_selectconf_checkbox_handler, I(CONF_ansi_colourconf_checkbox_handler, I(CONF_xterm_256_colourconf_checkbox_handler, I(CONF_bold_colourconf_editbox_handler, I(CONF_ping_intervalconf_checkbox_handler, I(CONF_tcp_nodelayconf_checkbox_handler, I(CONF_tcp_keepalivesconf_radiobutton_handler, I(CONF_addressfamilyconf_editbox_handler, I(CONF_loghost), I(1conf_editbox_handler, I(CONF_username), I(1conf_radiobutton_handler, I(CONF_username_from_envconf_editbox_handler, I(CONF_termtype), I(1)); ctrl_editbox(s, "Terminal speeds", 's', 50, HELPCTX(connection_termspeed), conf_editbox_handler, I(CONF_termspeed), I(1conf_radiobutton_handler, I(CONF_proxy_typeconf_editbox_handler, I(CONF_proxy_host), I(1conf_editbox_handler, I(CONF_proxy_portconf_editbox_handler, I(CONF_proxy_exclude_list), I(1conf_checkbox_handler, I(CONF_even_proxy_localhost)); ctrl_radiobuttons(s, "Do DNS name lookup at proxy end:", 'd', 3, HELPCTX(proxy_dns), conf_radiobutton_handler, I(CONF_proxy_dnsconf_editbox_handler, I(CONF_proxy_username), I(1conf_editbox_handler, I(CONF_proxy_password), I(1conf_editbox_handler, I(CONF_proxy_telnet_command), I(1conf_radiobutton_handler, I(CONF_rfc_environconf_radiobutton_handler, I(CONF_passive_telnetconf_checkbox_handler, I(CONF_telnet_keyboardconf_checkbox_handler, I(CONF_telnet_newlineconf_editbox_handler, I(CONF_localusername), I(1conf_editbox_handler, I(CONF_remote_cmd), I(1)); conf_checkbox_handler, I(CONF_ssh_no_shell)conf_checkbox_handler, I(CONF_compression)); } if (!midsessionradiobuttons(s, "Preferred SSH protocol version:", NO_SHORTCUT, 4, HELPCTX(ssh_protocol), conf_radiobutton_handler, I(CONF_sshprotconf_checkbox_handler, I(CONF_ssh2_des_cbcconf_editbox_handler, I(CONF_ssh_rekey_timeconf_editbox_handler, I(CONF_ssh_rekey_dataconf_checkbox_handler, I(CONF_ssh_no_userauthconf_checkbox_handler, I(CONF_ssh_show_bannerconf_checkbox_handler, I(CONF_tryagentconf_checkbox_handler, I(CONF_try_tis_authconf_checkbox_handler, I(CONF_try_ki_authconf_checkbox_handler, I(CONF_agentfwdconf_checkbox_handler, I(CONF_change_usernameconf_filesel_handler, I(CONF_keyfileconf_checkbox_handler, I(CONF_try_gssapi_authconf_checkbox_handler, I(CONF_gssapifwdconf_filesel_handler, I(CONF_ssh_gss_customconf_checkbox_handler, I(CONF_noptyconf_checkbox_handler,I(CONF_x11_forward)); ctrl_editbox(s, "X display location", 'x', 50, HELPCTX(ssh_tunnels_x11), conf_editbox_handler, I(CONF_x11_display), I(1conf_radiobutton_handler, I(CONF_x11_authconf_checkbox_handler, I(CONF_lport_acceptallconf_checkbox_handler, I(CONF_rport_acceptallCONF_sshbug_ignore1CONF_sshbug_plainpw1CONF_sshbug_rsa1CONF_sshbug_ignore2CONF_sshbug_hmac2CONF_sshbug_derivekey2CONF_sshbug_rsapad2CONF_sshbug_pksessid2CONF_sshbug_rekey2CONF_sshbug_maxpkt2 Node-path: putty/cproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f82427f479916df00fd6626850f7c9e6 Text-delta-base-sha1: 1a9ba2fd99c911ca5e5dc40ed0cc7e66648bda09 Text-content-length: 239 Text-content-md5: 8a698e28d31cf0260a0c0dc2e8d1e107 Text-content-sha1: df46cb106c5dd55941c5aba61930534894eab2f0 Content-length: 239 SVN��lH� ��>� �h�t conf_get_str(p->conf, CONF_proxy_password), char *username = conf_get_str(p->conf, CONF_proxy_username); char *password = conf_get_str(p->conf, CONF_proxy_password); if (username[0] || Node-path: putty/dialog.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fddcf94bf9b081058edad94323138df3 Text-delta-base-sha1: 95f02a273f0fa49075e0ad9f073ec811a8c54340 Text-content-length: 16 Text-content-md5: da92b4584d4ae937b0fc7a0669fab8fa Text-content-sha1: 98b9f18ff113383a9d920f8686a06829065b6a0e Content-length: 16 SVN��r1��1� Node-path: putty/dialog.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7af24eed66258f399ec4bcdd7b74631a Text-delta-base-sha1: ba96472a613cc0b0aa398e41dbb103050198d530 Text-content-length: 129 Text-content-md5: 46866661329c7ac449ea1dd765abdd19 Text-content-sha1: 614c171d6d9d993741f54efe6edc1af31d891e24 Content-length: 129 SVN��n}]�d��f�-r]��nchar *dlg_editbox_get(union control *ctrl, void *dlg); /* result must be freed by caller */ Node-path: putty/ldisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1955ef7fd2afa554ba0d0f33c77c4d0d Text-delta-base-sha1: fe79254e2c400d9cc28839798a4481811c69ec84 Text-content-length: 1053 Text-content-md5: b2c2045b1c670983d1a453b8df30e1cf Text-content-sha1: 2ba3161587f5634c3a424528d506465b3ed10b05 Content-length: 1053 SVN��jR?�r��&.�O9�Tj�eG �:+�eU�A?���,�� ��}!�x#localecho == FORCE_ON || \ (ldisclocaledit == FORCE_ON || \ (ldisc->localedit *confback = back; ldisc->backhandle = backhandle; ldisc->term = term; ldisc->frontend = frontend; ldisc_configure(ldisc, conf)configure(void *handle, Conf *conf) { Ldisc ldisc = (Ldisc) handle; ldisc->telnet_keyboard = conf_get_int(conf, CONF_telnet_keyboard); ldisc->telnet_newline = conf_get_int(conf, CONF_telnet_newline); ldisc->protocol = conf_get_int(conf, CONF_protocol); ldisc->localecho = conf_get_int(conf, CONF_localecho); ldisc->localedit = conf_get_int(conf, CONF_localedit)protocol == PROT_RAW) ldisc->back->send(ldisc->backhandle, "\r\n", 2); else if (ldisc->protocol == PROT_TELNET && ldiscprotocol == PROT_TELNET && len == 1) { switch (buf[0]) { case CTRL('M'): if (ldisc->protocol == PROT_TELNET && ldiscbreak; case CTRL('?'): case CTRL('H'): if (ldisc Node-path: putty/ldisc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 358bcb5060ef588974307c0204a31749 Text-delta-base-sha1: 3664752fd0bb7192584abbc75f0510b3b1be4751 Text-content-length: 182 Text-content-md5: 7a3050678dcd7daffb8b185bcd599989 Text-content-sha1: 351e8626a01f17108874447110705546d22e3e56 Content-length: 182 SVN��xb �h��[void *backhandle; void *frontend; /* * Values cached out of conf. */ int telnet_keyboard, telnet_newline, protocol, localecho, localedit Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 29b0f4b173edbe1f959ff63316102b29 Text-delta-base-sha1: 0c969ed913955c0aece097f5b1c95c9dc050855c Text-content-length: 1010 Text-content-md5: 0c8c35159a3e842737f6492dff1b83f4 Text-content-sha1: ae41f33e70818739f60a36e31bcb7a05d8b7db2d Content-length: 1010 SVN��p&Z �a��h�Ho�`�{~d�vv�b�>�np�m�P�y?�n?.�iyp�b *conf; int logtype; /* cached out of conf */logtype == LGTYP_ASCII ? "ASCII" : ctx->logtype == LGTYP_DEBUG ? "raw" : ctx->logtype == LGTYP_PACKETS ? "SSH packets" : ctx-> *conf_get_filename(ctx->conf, CONF_logfilename), conf_get_str(ctx->conf, CONF_host)int logxfovr = conf_get_int(ctx->conf, CONF_logxfovr); fclose(ctx->lgfp); if (logxfovr != LGXF_ASK) { mode = ((logtype > 0) { if (ctx->logtype != LGTYP_PACKETS && ctx->logtype == LGTYP_SSHRAW || (ctx-> *confonf = conf_copy(conf); ctx->logtype = conf_get_int(ctx->conf, CONF_logtype); *conf*conf_get_filename(ctx->conf, CONF_logfilename), *conf_get_filename(conf, CONF_logfilename)) || conf_get_int(ctx->conf, CONF_logtype) != conf_get_int(conf, CONF_logtype)onf_free(ctx->conf); ctx->conf = conf_copy(conf); ctx->logtype = conf_get_int(ctx->conf, CONF_logtype); Node-path: putty/macosx/README.OSX Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 105316dd51fd379d2b193120daf0dc63 Text-delta-base-sha1: 9999cbc5abcbb5fc455f6a9e7762504486bf1129 Text-content-length: 263 Text-content-md5: 012a7b94868069b71aac40093ad5fcec Text-content-sha1: 2abfd9af547de7e0da04e00192f1c7ebcc62a679 Content-length: 263 SVN��?0 o�%�o�#Bit rot ------- - the conversion of the old fixed-size 'Config' structure to the new dynamic 'Conf' was never applied to this directory - probably other things are out of date too; it would need some work to make it compile again Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 16ee063dade94f1bd83536193f3435e3 Text-delta-base-sha1: 87a97b3b054621edffa931af908d4ea97c4cccfa Text-content-length: 476 Text-content-md5: 768ed5c394ed61d7ec5ee646797e4878 Text-content-sha1: cb1d16b32161f97c3f6ac04c6e4e4028ac04fdbb Content-length: 476 SVN��C# F�Y�F? represents a session which can * sensibly be launched right now. */ int conf_launchable(Conf *conf) { if (conf_get_int(conf, CONF_protocol) == PROT_SERIAL) return conf_get_str(conf, CONF_serline)[0] != 0; else return conf_get_str(conf, CONF_host)[0] != 0; } char const *conf_dest(Conf *conf) { if (conf_get_int(conf, CONF_protocol) == PROT_SERIAL) return conf_get_str(conf, CONF_serline); else return conf_get_str(conf, CONF_host) Node-path: putty/network.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 807ae71257125276ac3e7d534a2c0c6d Text-delta-base-sha1: 219a5c33f09ecea3df5d1c9117810d05b079b071 Text-content-length: 183 Text-content-md5: 0491b322832bae519609403be2dd8896 Text-content-sha1: 9792ef8e1c92aafd4771b48d53bd0a64258887cb Content-length: 183 SVN��jJ�g��/t�V4r�, �#G_tag ConfConf *confConf *conf, int addressfamily); SockAddr name_lookup(char *host, int port, char **canonicalname, Conf *confConf *conf Node-path: putty/pinger.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 605ddd7434cc6a5768c60ba0edbcf26d Text-delta-base-sha1: d6737e5e6844e09af633cd9453890b7095172a4a Text-content-length: 262 Text-content-md5: 0c7231539a750014a0820092c9db55f8 Text-content-sha1: 1a2530c5d6ae39a72f4abcd7c3ffec1d0624f502 Content-length: 262 SVN��sEc�8��k?�9;8�m *confonf_get_int(conf, CONF_ping_interval) *oldconf, Conf *newconf) { int newinterval = conf_get_int(newconf, CONF_ping_interval); if (conf_get_int(oldconf, CONF_ping_interval) != newinterval) { pinger->interval = new Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5fe2e51f4a082975b60c26f6e49e497d Text-delta-base-sha1: 3fa760fea883861daa9eb93b8a060bb56f36b2d0 Text-content-length: 124 Text-content-md5: 6f069f30ebaab806f083fba018c6a95c Text-content-sha1: c9681b9a502a9be1cc5bfe0540d40c7abe948d60 Content-length: 124 SVN�� "O�h��Oy�]J�<)�^v�#lConf *confonfonfConf *confonf_get_int(conf, CONF_lport_acceptall), conf Node-path: putty/pproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c17c138c3ef9a5a1b29c30f3ac481d3c Text-delta-base-sha1: 4060fa38e46f1c4ec2c88ec45f1c6056db49a70f Text-content-length: 49 Text-content-md5: 33d3b23bc58c74721a111a9765db1eb1 Text-content-sha1: 6ffea7e3d2acad601dd82615dcfe1db705c0871e Content-length: 49 SVN��#!�{�Conf *conf) { return NULL; } Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3623e255f0708fd0e18b01e59f4e3370 Text-delta-base-sha1: 753cdea81418b91d7bc76ffc0985759c68337923 Text-content-length: 3650 Text-content-md5: 4fceeea869b72e5cb3f6d58f4c927b0b Text-content-sha1: 2ba3f043fbab4c22ecc61893a8873dd74c401447 Content-length: 3650 SVN��0�I��: �ik�l�|"�')�;ae�pl��Z�n\� p3�,o�1�E�U�][1�Z�*p�-�=�^g�W;K�3k:�.~�I9�L�^*�h!|�*h�#+��IH�M~�od�Yl�lm�U#�Rr}�53�@�NHonf) \ (conf_get_int(conf, CONF_proxy_dns) == FORCE_ON || \ (conf_get_int(conf, CONF_proxy_dns) == AUTO && \ conf_get_int(conf, CONF_proxy_type)Conf *confonf_get_int(conf, CONF_even_proxy_localhost)onf_get_str(conf, CONF_proxy_exclude_list)Conf *conf, int addressfamily) { if (conf_get_int(conf, CONF_proxy_type) != PROXY_NONE && do_proxy_dns(conf) && proxy_for_destination(NULL, host, port, confConf *confonf_get_int(conf, CONF_proxy_type) != PROXY_NONE && proxy_for_destination(addr, hostname, port, conf int typeonfonf = conf_copy(conf); type = conf_get_int(conf, CONF_proxy_type); if (type == PROXY_HTTP) { ret->negotiate = proxy_http_negotiate; } else if (type == PROXY_SOCKS4) { ret->negotiate = proxy_socks4_negotiate; } else if (type == PROXY_SOCKS5) { ret->negotiate = proxy_socks5_negotiate; } else if (onf_get_str(conf, CONF_proxy_host), &proxy_canonical_name, conf_get_int(conf, CONF_addressfamily) conf_get_int(conf, CONF_proxy_port)Conf *conf char *username, *passwordusername = conf_get_str(p->conf, CONF_proxy_username); password = conf_get_str(p->conf, CONF_proxy_password); if (username[0] || password[0]) { char *buf, *buf2; int i, j, len; buf = dupprintf("%s:%s", username, password); len = strlen(buf); buf2 = snewn(len * 4 / 3 + 100, char sfree(buf); sfree(buf2 char *usernameusername = conf_get_str(p->conf, CONF_proxy_username); length = strlen(username) + namelen + 9; command = snewn(length, char); strcpy(command + 8, usernamechar *username, *password; int len; command[0] = 5; /* version 5 */ username = conf_get_str(p->conf, CONF_proxy_username); password = conf_get_str(p->conf, CONF_proxy_password); if (username[0] || char *username = conf_get_str(p->conf, CONF_proxy_username); char *password = conf_get_str(p->conf, CONF_proxy_password); if (username[0] || password[0]) { char userpwbuf[255 + 255 + 3]; int ulen, plen; ulen = strlen(username); if (ulen > 255) ulen = 255; if (ulen < 1) ulen = 1; plen = strlen(Conf *conf) { char *fmt = conf_get_str(conf, CONF_proxy_telnet_command);fmtfmt[eo] != 0 && fmt[eo] != '%' && fmt[eo] != '\\') eo++; /* if we hit eol, break out of our escaping loop */ if (fmtfmtfmt[eo] == 0) break; if (fmtfmtfmt[eo] >= '0' && fmt[eo] <= '9') v += fmt[eo] - '0'; else if (fmt[eo] >= 'a' && fmt[eo] <= 'f') v += fmt[eo] - 'a' + 10; else if (fmt[eo] >= 'A' && fmt[eo] <= 'F') v += fmtfmtfmtfmt + eo,fmt + eo,fmt + eo, "user", 4) == 0) { char *username = conf_get_str(conf, CONF_proxy_username); int userlen = strlen(username); ENSURE(userlen); memcpy(ret+retlen, fmt + eo, "pass", 4) == 0) { char *password = conf_get_str(conf, CONF_proxy_password); int passlen = strlen(password); ENSURE(passlen); memcpy(ret+retlen, password, passlen); retlen += passlen; eo += 4; } else if (strnicmp(fmt + eo, "proxyhost", 9) == 0) { char *host = conf_get_str(conf, CONF_proxy_host); int phlen = strlen(host); ENSURE(phlen); memcpy(ret+retlen, host, phlen); retlen += phlen; eo += 9; } else if (strnicmp(fmt + eo, "proxyport", 9) == 0) { int port = conf_get_int(conf, CONF_proxy_port); char pport[50]; int pplen; sprintf(pport, "%d", fmtp->conf Node-path: putty/proxy.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ce422ad086060654f3e1085a93301381 Text-delta-base-sha1: 8e9119e92175408b850744d80ad30af9aa788c5b Text-content-length: 43 Text-content-md5: d3a4038ef49a28f0a59660fe230d4991 Text-content-sha1: 21eb84eddbd7fcb15cbb735905499cc4f2423c29 Content-length: 43 SVN��e^�|���;* *confConf *conf Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 903f507aeb6b5a66632d35644edc5661 Text-delta-base-sha1: a543699e32c739ede817c3bedda7b5bd449f9d3c Text-content-length: 2980 Text-content-md5: 0337374e85d526ee51f90195f751143a Text-content-sha1: 807a50690bf201832d4c5bedae71518dc031843f Content-length: 2980 SVN��sDX>�6�� <y��t �]�%g�Mu�s2�U>#�n �Qa�1H�v} *conf *conf2 = conf_new(); conf_set_str(conf2, CONF_host, ""); do_defaults(host, conf2); if (conf_get_str(conf2, CONF_host)confconf_set_str(conf, CONF_host, host); } } else { /* Patch in hostname `host' to session details. */ conf_set_str(conf, CONF_host, host)onf_get_int(conf, CONF_protocol) != PROT_SSH) { conf_set_int(conf, CONF_protocol, PROT_SSH); conf_set_int(conf, CONF_port, 22); } /* * Enact command-line overrides. */ cmdline_run_saved(conf); /* * Muck about with the hostname in various ways. */ { char *hostbuf = dupstr(conf_get_str(conf, CONF_host)); char *host = hostbuf; char *p, *q; /* * Trim leading whitespace. */ host += strspn(host, " \t"); /* * See if host is of the form user@host, and separate out * the username if so. */ if (host[0] != '\0') { char *atsign = strrchr(host, '@'); if (atsign) { *atsign = '\0'; conf_set_str(conf, CONF_username, host); host = atsign + 1; } } /* * Remove any remaining whitespace. */ p = hostbuf; q = host; while (*q) { if (*q != ' ' && *q != '\t') *p++ = *q; q++; } *p = '\0'; conf_set_str(conf, CONF_host, hostbuf); sfree(hostbuf); } /* Set username */ if (user != NULL && user[0] != '\0') { conf_set_str(conf, CONF_username, user); } else if (conf_get_str(conf, CONF_username)conf_set_str(conf, CONF_username, user)onf_set_int(conf, CONF_x11_forward, 0); conf_set_int(conf, CONF_agentfwd, 0); conf_set_int(conf, CONF_ssh_simple, TRUE); { char *key; while ((key = conf_get_str_nthstrkey(conf, CONF_portfwd, 0)) != NULL) conf_del_str_str(conf, CONF_portfwd, key); }onf_set_str(conf, CONF_remote_cmd2, "")conf_set_str(conf, CONF_remote_cmd, "sftp"); conf_set_int(conf, CONF_ssh_subsys, TRUE); if (try_scp) { /* Fallback is to use the provided scp command. */ fallback_cmd_is_sftp = 0; conf_set_str(conf, CONF_remote_cmd2, "sftp"); conf_set_int(conf, CONF_ssh_subsys2, FALSE)onf_set_str(conf, CONF_remote_cmd2, "test -x /usr/lib/sftp-server &&" " exec /usr/lib/sftp-server\n" "test -x /usr/local/lib/sftp-server &&" " exec /usr/local/lib/sftp-server\n" "exec sftp-server"); conf_set_int(conf, CONF_ssh_subsys2, FALSE); } } else { /* Don't try SFTP at all; just try the scp command. */ main_cmd_is_sftp = 0; conf_set_str(conf, CONF_remote_cmd, cmd); conf_set_int(conf, CONF_ssh_subsys, FALSE); } conf_set_int(conf, CONF_nopty, TRUE); back = &ssh_backend; err = back->init(NULL, &backhandle, conf, conf_get_str(conf, CONF_host), conf_get_int(conf, CONF_port), &realhost, 0, conf_get_int(conf, CONF_tcp_keepalives)); if (err != NULL) bump("ssh_init: %s", err); logctx = log_init(NULL, confconf = conf_new(); do_defaults(NULL, confconf Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 08b53d2f896e2aa66c8d734cb082f340 Text-delta-base-sha1: d13d5e70b35d9fecf214856d807995e293e89b69 Text-content-length: 2693 Text-content-md5: dead8cdd188797666b55beb25c8c10fa Text-content-sha1: 68005f3d0d20a235f0285e9fb53c5652feddc553 Content-length: 2693 SVN��zg�i��E~�m7y�l�tu �^�%4F�2':�K?_�p_�|S�)e�[�/K *conf; *conf2 = conf_new(); conf_set_str(conf2, CONF_host, ""); do_defaults(host, conf2); if (conf_get_str(conf2, CONF_host)confconf_set_str(conf, CONF_host, host); } } else { /* Patch in hostname `host' to session details. */ conf_set_str(conf, CONF_host, host)onf_get_int(conf, CONF_protocol) != PROT_SSH) { conf_set_int(conf, CONF_protocol, PROT_SSH); conf_set_int(conf, CONF_port, 22)(conf_get_int(conf, CONF_sshprot) & ~1) != 2) /* is it 2 or 3? */ conf_set_int(conf, CONF_sshprot, 2); /* * Enact command-line overrides. */ cmdline_run_saved(conf); /* * Muck about with the hostname in various ways. */ { char *hostbuf = dupstr(conf_get_str(conf, CONF_host)); char *host = hostbuf; char *p, *q; /* * Trim leading whitespace. */ host += strspn(host, " \t"); /* * See if host is of the form user@host, and separate out * the username if so. */ if (host[0] != '\0') { char *atsign = strrchr(host, '@'); if (atsign) { *atsign = '\0'; conf_set_str(conf, CONF_username, host); host = atsign + 1; } } /* * Remove any remaining whitespace. */ p = hostbuf; q = host; while (*q) { if (*q != ' ' && *q != '\t') *p++ = *q; q++; } *p = '\0'; conf_set_str(conf, CONF_host, hostbuf); sfree(hostbuf); } /* Set username */ if (user != NULL && user[0] != '\0') { conf_set_str(conf, CONF_username, user); } if (portnumber) conf_set_int(conf, CONF_port, portnumber)onf_set_int(conf, CONF_x11_forward, 0); conf_set_int(conf, CONF_agentfwd, 0); conf_set_int(conf, CONF_ssh_simple, TRUE); { char *key; while ((key = conf_get_str_nthstrkey(conf, CONF_portfwd, 0)) != NULL) conf_del_str_str(conf, CONF_portfwd, key); } /* Set up subsystem name. */ conf_set_str(conf, CONF_remote_cmd, "sftp"); conf_set_int(conf, CONF_ssh_subsys, TRUE); conf_set_int(conf, CONF_nopty, TRUE)onf_set_str(conf, CONF_remote_cmd2, "test -x /usr/lib/sftp-server &&" " exec /usr/lib/sftp-server\n" "test -x /usr/local/lib/sftp-server &&" " exec /usr/local/lib/sftp-server\n" "exec sftp-server"); conf_set_int(conf, CONF_ssh_subsys2, FALSE); back = &ssh_backend; err = back->init(NULL, &backhandle, conf, conf_get_str(conf, CONF_host), conf_get_int(conf, CONF_port), &realhost, 0, conf_get_int(conf, CONF_tcp_keepalives)confconf = conf_new(); do_defaults(NULL, confconfonf_get_str(conf, CONF_host)[0] != '\0') { userhost = dupstr(conf_get_str(conf, CONF_host) Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8528d87b37907198f751b23e22b0c5a2 Text-delta-base-sha1: e1d66c95ace72ab0390ca6434cb4017695eb7072 Text-content-length: 12150 Text-content-md5: 07cf54ae1b26d9be6af0167773f5d4e3 Text-content-sha1: a81864438e4b45d2fcafe2ff8a464111e120100c Content-length: 12150 SVN��@ ^�8��5E�_~� a�]q�uR�qK���B#�`i*�4�T>��p�5P�-M�(kc�Uy��;j�@V_tag ConfCONF_CONF_CONF_CONF_CONF_ *conf, char *host, int port, char **realhost, int nodelay, *confconf.c, and a big enum (via parametric macro) of * configuration option keys. */ #define CONFIG_OPTIONS(X) \ /* X(value-type, subkey-type, keyword) */ \ X(STR, NONE, host) \ X(INT, NONE, port) \ X(INT, NONE, protocol) \ X(INT, NONE, addressfamily) \ X(INT, NONE, close_on_exit) \ X(INT, NONE, warn_on_close) \ X(INT, NONE, ping_interval) /* in seconds */ \ X(INT, NONE, tcp_nodelay) \ X(INT, NONE, tcp_keepalives) \ X(STR, NONE, loghost) /* logical host being contacted, for host key check */ \ /* Proxy options */ \ X(STR, NONE, proxy_exclude_list) \ X(INT, NONE, proxy_dns) \ X(INT, NONE, even_proxy_localhost) \ X(INT, NONE, proxy_type) \ X(STR, NONE, proxy_host) \ X(INT, NONE, proxy_port) \ X(STR, NONE, proxy_username) \ X(STR, NONE, proxy_password) \ X(STR, NONE, proxy_telnet_command) \ /* SSH options */ \ X(STR, NONE, remote_cmd) \ X(STR, NONE, remote_cmd2) /* fallback if remote_cmd fails; never loaded or saved */ \ X(INT, NONE, nopty) \ X(INT, NONE, compression) \ X(INT, INT, ssh_kexlist) \ X(INT, NONE, ssh_rekey_time) /* in minutes */ \ X(STR, NONE, ssh_rekey_data) /* string encoding e.g. "100K", "2M", "1G" */ \ X(INT, NONE, tryagent) \ X(INT, NONE, agentfwd) \ X(INT, NONE, change_username) /* allow username switching in SSH-2 */ \ X(INT, INT, ssh_cipherlist) \ X(FILENAME, NONE, keyfile) \ X(INT, NONE, sshprot) /* use v1 or v2 when both available */ \ X(INT, NONE, ssh2_des_cbc) /* "des-cbc" unrecommended SSH-2 cipher */ \ X(INT, NONE, ssh_no_userauth) /* bypass "ssh-userauth" (SSH-2 only) */ \ X(INT, NONE, ssh_show_banner) /* show USERAUTH_BANNERs (SSH-2 only) */ \ X(INT, NONE, try_tis_auth) \ X(INT, NONE, try_ki_auth) \ X(INT, NONE, try_gssapi_auth) /* attempt gssapi auth */ \ X(INT, NONE, gssapifwd) /* forward tgt via gss */ \ X(INT, INT, ssh_gsslist) /* preference order for local GSS libs */ \ X(FILENAME, NONE, ssh_gss_custom) \ X(INT, NONE, ssh_subsys) /* run a subsystem rather than a command */ \ X(INT, NONE, ssh_subsys2) /* fallback to go with remote_cmd_ptr2 */ \ X(INT, NONE, ssh_no_shell) /* avoid running a shell */ \ X(STR, NONE, ssh_nc_host) /* host to connect to in `nc' mode */ \ X(INT, NONE, ssh_nc_port) /* port to connect to in `nc' mode */ \ /* Telnet options */ \ X(STR, NONE, termtype) \ X(STR, NONE, termspeed) \ X(STR, STR, ttymodes) /* values are "Vvalue" or "A" */ \ X(STR, STR, environmt) \ X(STR, NONE, username) \ X(INT, NONE, username_from_env) \ X(STR, NONE, localusername) \ X(INT, NONE, rfc_environ) \ X(INT, NONE, passive_telnet) \ /* Serial port options */ \ X(STR, NONE, serline) \ X(INT, NONE, serspeed) \ X(INT, NONE, serdatabits) \ X(INT, NONE, serstopbits) \ X(INT, NONE, serparity) \ X(INT, NONE, serflow) \ /* Keyboard options */ \ X(INT, NONE, bksp_is_delete) \ X(INT, NONE, rxvt_homeend) \ X(INT, NONE, funky_type) \ X(INT, NONE, no_applic_c) /* totally disable app cursor keys */ \ X(INT, NONE, no_applic_k) /* totally disable app keypad */ \ X(INT, NONE, no_mouse_rep) /* totally disable mouse reporting */ \ X(INT, NONE, no_remote_resize) /* disable remote resizing */ \ X(INT, NONE, no_alt_screen) /* disable alternate screen */ \ X(INT, NONE, no_remote_wintitle) /* disable remote retitling */ \ X(INT, NONE, no_dbackspace) /* disable destructive backspace */ \ X(INT, NONE, no_remote_charset) /* disable remote charset config */ \ X(INT, NONE, remote_qtitle_action) /* remote win title query action */ \ X(INT, NONE, app_cursor) \ X(INT, NONE, app_keypad) \ X(INT, NONE, nethack_keypad) \ X(INT, NONE, telnet_keyboard) \ X(INT, NONE, telnet_newline) \ X(INT, NONE, alt_f4) /* is it special? */ \ X(INT, NONE, alt_space) /* is it special? */ \ X(INT, NONE, alt_only) /* is it special? */ \ X(INT, NONE, localecho) \ X(INT, NONE, localedit) \ X(INT, NONE, alwaysontop) \ X(INT, NONE, fullscreenonaltenter) \ X(INT, NONE, scroll_on_key) \ X(INT, NONE, scroll_on_disp) \ X(INT, NONE, erase_to_scrollback) \ X(INT, NONE, compose_key) \ X(INT, NONE, ctrlaltkeys) \ X(STR, NONE, wintitle) /* initial window title */ \ /* Terminal options */ \ X(INT, NONE, savelines) \ X(INT, NONE, dec_om) \ X(INT, NONE, wrap_mode) \ X(INT, NONE, lfhascr) \ X(INT, NONE, cursor_type) /* 0=block 1=underline 2=vertical */ \ X(INT, NONE, blink_cur) \ X(INT, NONE, beep) \ X(INT, NONE, beep_ind) \ X(INT, NONE, bellovl) /* bell overload protection active? */ \ X(INT, NONE, bellovl_n) /* number of bells to cause overload */ \ X(INT, NONE, bellovl_t) /* time interval for overload (seconds) */ \ X(INT, NONE, bellovl_s) /* period of silence to re-enable bell (s) */ \ X(FILENAME, NONE, bell_wavefile) \ X(INT, NONE, scrollbar) \ X(INT, NONE, scrollbar_in_fullscreen) \ X(INT, NONE, resize_action) \ X(INT, NONE, bce) \ X(INT, NONE, blinktext) \ X(INT, NONE, win_name_always) \ X(INT, NONE, width) \ X(INT, NONE, height) \ X(FONT, NONE, font) \ X(INT, NONE, font_quality) \ X(FILENAME, NONE, logfilename) \ X(INT, NONE, logtype) \ X(INT, NONE, logxfovr) \ X(INT, NONE, logflush) \ X(INT, NONE, logomitpass) \ X(INT, NONE, logomitdata) \ X(INT, NONE, hide_mouseptr) \ X(INT, NONE, sunken_edge) \ X(INT, NONE, window_border) \ X(STR, NONE, answerback) \ X(STR, NONE, printer) \ X(INT, NONE, arabicshaping) \ X(INT, NONE, bidi) \ /* Colour options */ \ X(INT, NONE, ansi_colour) \ X(INT, NONE, xterm_256_colour) \ X(INT, NONE, system_colour) \ X(INT, NONE, try_palette) \ X(INT, NONE, bold_colour) \ X(INT, INT, colours) \ /* Selection options */ \ X(INT, NONE, mouse_is_xterm) \ X(INT, NONE, rect_select) \ X(INT, NONE, rawcnp) \ X(INT, NONE, rtf_paste) \ X(INT, NONE, mouse_override) \ X(INT, INT, wordness) \ /* translations */ \ X(INT, NONE, vtmode) \ X(STR, NONE, line_codepage) \ X(INT, NONE, cjk_ambig_wide) \ X(INT, NONE, utf8_override) \ X(INT, NONE, xlat_capslockcyr) \ /* X11 forwarding */ \ X(INT, NONE, x11_forward) \ X(STR, NONE, x11_display) \ X(INT, NONE, x11_auth) \ X(FILENAME, NONE, xauthfile) \ /* port forwarding */ \ X(INT, NONE, lport_acceptall) /* accept conns from hosts other than localhost */ \ X(INT, NONE, rport_acceptall) /* same for remote forwarded ports (SSH-2 only) */ \ /* \ * Subkeys for 'portfwd' can have the following forms: \ * \ * [LR]localport \ * [LR]localaddr:localport \ * \ * Dynamic forwardings are indicated by an 'L' key, and the \ * special value "D". For all other forwardings, the value \ * should be of the form 'host:port'. \ */ \ X(STR, STR, portfwd) \ /* SSH bug compatibility modes */ \ X(INT, NONE, sshbug_ignore1) \ X(INT, NONE, sshbug_plainpw1) \ X(INT, NONE, sshbug_rsa1) \ X(INT, NONE, sshbug_hmac2) \ X(INT, NONE, sshbug_derivekey2) \ X(INT, NONE, sshbug_rsapad2) \ X(INT, NONE, sshbug_pksessid2) \ X(INT, NONE, sshbug_rekey2) \ X(INT, NONE, sshbug_maxpkt2) \ X(INT, NONE, sshbug_ignore2) \ /* \ * ssh_simple means that we promise never to open any channel \ * other than the main one, which means it can safely use a very \ * large window in SSH-2. \ */ \ X(INT, NONE, ssh_simple) \ /* Options for pterm. Should split out into platform-dependent part. */ \ X(INT, NONE, stamp_utmp) \ X(INT, NONE, login_shell) \ X(INT, NONE, scrollbar_on_left) \ X(INT, NONE, shadowbold) \ X(FONT, NONE, boldfont) \ X(FONT, NONE, widefont) \ X(FONT, NONE, wideboldfont) \ X(INT, NONE, shadowboldoffset) \ X(INT, NONE, crhaslf) \ X(STR, NONE, winclass) \ /* Now define the actual enum of option keywords using that macro. */ #define CONF_ENUM_DEF(valtype, keytype, keyword) CONF_ ## keyword, enum config_primary_key { CONFIG_OPTIONS(CONF_ENUM_DEF) N_CONFIG_OPTIONS }; #undef CONF_ENUM_DEF #define NCFGCOLOURS 22 /* number of colours in CONF_colours above */ /* Functions handling configuration structures. */ Conf *conf_new(void); /* create an empty configuration */ void conf_free(Conf *conf); Conf *conf_copy(Conf *oldconf); void conf_copy_into(Conf *dest, Conf *src); /* Mandatory accessor functions: enforce by assertion that keys exist. */ int conf_get_int(Conf *conf, int key); int conf_get_int_int(Conf *conf, int key, int subkey); char *conf_get_str(Conf *conf, int key); /* result still owned by conf */ char *conf_get_str_str(Conf *conf, int key, const char *subkey); Filename *conf_get_filename(Conf *conf, int key); FontSpec *conf_get_fontspec(Conf *conf, int key); /* Optional accessor function: return NULL if key does not exist. */ char *conf_get_str_str_opt(Conf *conf, int key, const char *subkey); /* Accessor function to step through a string-subkeyed list. * Returns the next subkey after the provided one, or the first if NULL. * Returns NULL if there are none left. * Both the return value and *subkeyout are still owned by conf. */ char *conf_get_str_strs(Conf *conf, int key, char *subkeyin, char **subkeyout); /* Return the nth string subkey in a list. Owned by conf. NULL if beyond end */ char *conf_get_str_nthstrkey(Conf *conf, int key, int n); /* Functions to set entries in configuration. Always copy their inputs. */ void conf_set_int(Conf *conf, int key, int value); void conf_set_int_int(Conf *conf, int key, int subkey, int value); void conf_set_str(Conf *conf, int key, const char *value); void conf_set_str_str(Conf *conf, int key, const char *subkey, const char *val); void conf_del_str_str(Conf *conf, int key, const char *subkey); void conf_set_filename(Conf *conf, int key, const Filename *val); void conf_set_fontspec(Conf *conf, int key, const FontSpec *val); /* Serialisation functions for Duplicate Session */ int conf_serialised_size(Conf *conf); void conf_serialise(Conf *conf, void *data); int conf_deserialise(Conf *conf, void *data, int maxsize);/*returns size used*/char *get_remote_username(Conf *conf); /* dynamically allocated */ char *save_settings(char *section, Conf *conf); void save_open_settings(void *sesskey, Conf *conf); void load_settings(char *section, Conf *conf); void load_open_settings(void *sesskey, Conf *conf *conf); void log_free(void *logctx); void log_reconfig(void *logctx, Conf *conf *, Terminal *, Backend *, void *, void *); void ldisc_configure(void *, Conf *conf, Backend *back, void *backhandle); void pinger_reconfig(Pinger, Conf *oldconf, Conf *newconfonf_launchable(Conf *conf); char const *conf_dest(Conf *conf *); void cmdline_run_saved(Confunion control; void conf_radiobutton_handler(union control *ctrl, void *dlg, void *data, int event); #define CHECKBOX_INVERT (1<<30) void conf_checkbox_handler(union control *ctrl, void *dlg, void *data, int event); void conf_editbox_handler(union control *ctrl, void *dlg, void *data, int event); void conf_filesel_handler(union control *ctrl, void *dlg, void *data, int event); void conf_fontsel_handler(union control *ctrl, void *dlg, void *data, int event) Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c59c1f6d97e716845f8232798f5e2211 Text-delta-base-sha1: 6a18f668143f426c3a41160f0fe367a4adf23c2c Text-content-length: 523 Text-content-md5: c037d79137b2f173dd6ac6aea59f15b8 Text-content-sha1: 34fba07083e012301aa0fc89afd9904ca558bda0 Content-length: 523 SVN��,S�o��zv�n[�5�-W?�v�z *conf int addressfamily; char *loghostaddressfamily = conf_get_int(conf, CONF_addressfamily); /* * Try to find host. */ { char *buf; buf = dupprintf("Looking up host \"%s\"%s", host, (addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" : (onf, onf); if ((err = sk_socket_error(raw->s)) != NULL) return err; loghost = conf_get_str(conf, CONF_loghost); if (*loghost) { char *colon; sfree(*realhost); *realhost = dupstr( *conf Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7abf86e045374f1e86c053700b5d7dc8 Text-delta-base-sha1: 47016ad191499b3c7affd2ebc39fadb6cd6a8a72 Text-content-length: 1509 Text-content-md5: 711afc4eb386bf05ddc5c1edc5be70bf Text-content-sha1: 1f729251a5d5ecc752788358a5e9fdcad09938e3 Content-length: 1509 SVN�� N �W��*]P�t��KK�q�7B�hd�MKm�}~�t� *conf sk_write(rlogin->s, &z, 1); p = conf_get_str(rlogin->conf, CONF_localusername); sk_write(rlogin->s, p, strlen(p)); sk_write(rlogin->s, &z, 1); sk_write(rlogin->s, ruser, strlen(ruser)); sk_write(rlogin->s, &z, 1); p = conf_get_str(rlogin->conf, CONF_termtype); sk_write(rlogin->s, p, strlen(p)); sk_write(rlogin->s, "/", 1); p = conf_get_str(rlogin->conf, CONF_termspeed); sk_write(rlogin->s, p, strspn(p, "0123456789") *conf*ruser; int addressfamily; char *loghostonf_get_int(conf, CONF_width); rlogin->term_height = conf_get_int(conf, CONF_height); rlogin->firstbyte = 1; rlogin->cansize = 0; rlogin->prompt = NULL; rlogin->conf = conf_copy(conf); *backend_handle = rlogin; addressfamily = conf_get_int(conf, CONF_addressfamily); /* * Try to find host. */ { char *buf; buf = dupprintf("Looking up host \"%s\"%s", host, (addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" : (onf, onf); if ((err = sk_socket_error(rlogin->s)) != NULL) return err; loghost = conf_get_str(conf, CONF_loghost); if (*loghost) { char *colon; sfree(*realhost); *realhost = dupstr((ruser = get_remote_username(conf)) == NULL) { rlogin_startup(rlogin, ruser); sfree(/* 512 is an arbitrary limit :-( */ add_prompt(rlogin->prompt, dupstr("rlogin username: "), TRUE, 512conf_free(rlogin->conf *conf Node-path: putty/sercfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f949a2bcd954ba91e327adc7e86e211f Text-delta-base-sha1: e2f2a866ec8ccb3e75d62baca0c325b111eb4bbb Text-content-length: 1132 Text-content-md5: 84157b834f4facbc1f840f7278de9ff2 Text-content-sha1: 6c3e48e06818f2db26131a77605f7b4a344c4038 Content-length: 1132 SVN��cD�7�'�?7�:�oZ#�U7�N�y_�"O�)M%� 5�jy *conf = (Conf *)data; if (event == EVENT_REFRESH) { /* Fetching this once at the start of the function ensures we * remember what the right value is supposed to be when * operations below cause reentrant calls to this function. */ int oldparity = conf_get_int(conf, CONF_serparity); onf_set_int(conf, CONF_serparity, oldparity)onf_set_int(conf, CONF_serparity, i) *conf = (Conf *)data; if (event == EVENT_REFRESH) { /* Fetching this once at the start of the function ensures we * remember what the right value is supposed to be when * operations below cause reentrant calls to this function. */ int oldflow = conf_get_int(conf, CONF_serflow); onf_set_int(conf, CONF_serflow, oldflow);FLOW_NONE; else i = dlg_listbox_getid(ctrl, dlg, i); conf_set_int(conf, CONF_serflow, i)conf_editbox_handler, I(CONF_serline), I(1conf_editbox_handler, I(CONF_serspeed), I(-1)); ctrl_editbox(s, "Data bits", 'b', 40, HELPCTX(serial_databits), conf_editbox_handler, I(CONF_serdatabits), conf_editbox_handler, I(CONF_serstopbits), Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ad795f592b98894f27fc85344714f8c Text-delta-base-sha1: d372ce0147c5f4d81952fce5296d715a26dcce3a Text-content-length: 32995 Text-content-md5: 55b3efd5e203459e527c7988f9bd943d Text-content-sha1: 97f1b7449ccf3fca720679d09fcecfb90e7cbde9 Content-length: 32995 SVN��1:P���X�OJ/�o*T�/u�JI�)Hc�FA�V_1�Fu�DC�:LC�~��a5�sv�|`�+d �P;�c;i�W6m�[�ap�fn�tl*�N:� �wIb�hR�'/=�X~N�Uj�0qb� B�/:�Jgchar *get_remote_username(Conf *conf) { char *username = conf_get_str(conf, CONF_username); if (*username) { return dupstr(username); } else if (conf_get_int(conf, CONF_username_from_env)) { /* Use local username. */ return get_username(); /* might still be NULL */ } else { return NULL; } } static char *gpps_raw(void *handle, const char *name, const char *def) { char *ret = read_setting_s(handle, name); if (!ret) ret = platform_default_s(name); if (!ret) ret = def ? dupstr(def) : NULL; /* permit NULL as final fallback */ return ret; } static void gpps(void *handle, const char *name, const char *def, Conf *conf, int primary) { char *val = gpps_raw(handle, name, def); conf_set_str(conf, primary, val); sfree(val);Conf *conf, int primary) { FontSpec result; if (!read_setting_fontspec(handle, name, &result)) result = platform_default_fontspec(name); conf_set_fontspec(conf, primary, &result); } static void gppfile(void *handle, const char *name, Conf *conf, int primary) { Filename result; if (!read_setting_filename(handle, name, &result)) result = platform_default_filename(name); conf_set_filename(conf, primary, &result); } static int gppi_raw(void *handle, char *name, int def) { def = platform_default_i(name, def); return read_setting_i(handle, name, def); } static void gppi(void *handle, char *name, int def, Conf *conf, int primary) { conf_set_int(conf, primary, gppi_raw(handle, name, def)int gppmap(void *handle, char *name, Conf *conf, int primary) { char *buf, *p, *q, *key, *val; /* * Start by clearing any existing subkeys of this key from conf. */ for (val = conf_get_str_strs(conf, primary, NULL, &key); val != NULL; val = conf_get_str_strs(conf, primary, key, &key)) conf_del_str_str(conf, primary, key); /* * Now read a serialised list from the settings and unmarshal it * into its components. */ buf = gpps_raw(handle, name, NULL); if (!buf) return FALSE; p = buf; while (*p) { q = buf; val = NULL; while (*p && *p != ',') { int c = *p++; if (c == '=') c = '\0'; if (c == '\\') c = *p++; *q++ = c; if (!c) val = q; } if (*p == ',') p++; if (!val) val = q; *q = '\0'; if (primary == CONF_portfwd && buf[0] == 'D') { /* * Backwards-compatibility hack: dynamic forwardings are * indexed in the data store as a third type letter in the * key, 'D' alongside 'L' and 'R' - but really, they * should be filed under 'L' with a special _value_, * because local and dynamic forwardings both involve * _listening_ on a local port, and are hence mutually * exclusive on the same port number. So here we translate * the legacy storage format into the sensible internal * form. */ char *newkey = dupcat("L", buf+1, NULL); conf_set_str_str(conf, primary, newkey, "D"); sfree(newkey); } else { conf_set_str_str(conf, primary, buf, val); } } sfree(buf); return TRUEoutkey, Conf *conf, int primary) { char *buf, *p, *q, *key, *realkey, *val; int len; len = 1; /* allow for NUL */ for (val = conf_get_str_strs(conf, primary, NULL, &key); val != NULL; val = conf_get_str_strs(conf, primary, key, &key)) len += 2 + 2 * (strlen(key) + strlen(val)); /* allow for escaping */ buf = snewn(len, char); p = buf; for (val = conf_get_str_strs(conf, primary, NULL, &key); val != NULL; val = conf_get_str_strs(conf, primary, key, &key)) { if (primary == CONF_portfwd && !strcmp(val, "D")) { /* * Backwards-compatibility hack, as above: translate from * the sensible internal representation of dynamic * forwardings (key "L<port>", value "D") to the * conceptually incoherent legacy storage format (key * "D<port>", value empty). */ realkey = key; /* restore it at end of loop */ val = ""; key = dupcat("D", key+1, NULL); } else { realkey = NULL; } if (p != buf) *p++ = ','; for (q = key; *q; q++) { if (*q == '=' || *q == ',' || *q == '\\') *p++ = '\\'; *p++ = *q; } *p++ = '='; for (q = val; *q; q++) { if (*q == '=' || *q == ',' || *q == '\\') *p++ = '\\'; *p++ = *q; } if (realkey) { free(key); key = realkey; } } *p = '\0'; write_setting_s(handle, outConf *conf, int primary) { char *commalistcommalist = gpps_raw(sesskey, name, def conf_set_int_int(conf, primary, n, v); n++; } } sfree(commalist);conf_get_int_int(conf, primary, j) == conf_set_int_int(conf, primary, j+1, conf_get_int_int(conf, primary, j)); conf_set_int_int(conf, primary, pos, mapping[i].v)Conf *conf, int primar conf_get_int_int(conf, primary, i) conf_get_int_int(conf, primary, i) *confonf *confonf_get_str(conf, CONF_host)); write_setting_filename(sesskey, "LogFileName", *conf_get_filename(conf, CONF_logfilename)); write_setting_i(sesskey, "LogType", conf_get_int(conf, CONF_logtype)); write_setting_i(sesskey, "LogFileClash", conf_get_int(conf, CONF_logxfovr)); write_setting_i(sesskey, "LogFlush", conf_get_int(conf, CONF_logflush)); write_setting_i(sesskey, "SSHLogOmitPasswords", conf_get_int(conf, CONF_logomitpass)); write_setting_i(sesskey, "SSHLogOmitData", conf_get_int(conf, CONF_logomitdata)); p = "raw"; { const Backend *b = backend_from_proto(conf_get_int(conf, CONF_protocol)onf_get_int(conf, CONF_port)onf_get_int(conf, CONF_close_on_exit)+2)%3); write_setting_i(sesskey, "WarnOnClose", !!conf_get_int(conf, CONF_warn_on_close)); write_setting_i(sesskey, "PingInterval", conf_get_int(conf, CONF_ping_interval) / 60); /* minutes */ write_setting_i(sesskey, "PingIntervalSecs", conf_get_int(conf, CONF_ping_interval) % 60); /* seconds */ write_setting_i(sesskey, "TCPNoDelay", conf_get_int(conf, CONF_tcp_nodelay)); write_setting_i(sesskey, "TCPKeepalives", conf_get_int(conf, CONF_tcp_keepalives)); write_setting_s(sesskey, "TerminalType", conf_get_str(conf, CONF_termtype)); write_setting_s(sesskey, "TerminalSpeed", conf_get_str(conf, CONF_termspeed)); wmap(sesskey, "TerminalModes", conf, CONF_ttymodes); /* Address family selection */ write_setting_i(sesskey, "AddressFamily", conf_get_int(conf, CONF_addressfamily)); /* proxy settings */ write_setting_s(sesskey, "ProxyExcludeList", conf_get_str(conf, CONF_proxy_exclude_list)); write_setting_i(sesskey, "ProxyDNS", (conf_get_int(conf, CONF_proxy_dns)+2)%3); write_setting_i(sesskey, "ProxyLocalhost", conf_get_int(conf, CONF_even_proxy_localhost)); write_setting_i(sesskey, "ProxyMethod", conf_get_int(conf, CONF_proxy_type)); write_setting_s(sesskey, "ProxyHost", conf_get_str(conf, CONF_proxy_host)); write_setting_i(sesskey, "ProxyPort", conf_get_int(conf, CONF_proxy_port)); write_setting_s(sesskey, "ProxyUsername", conf_get_str(conf, CONF_proxy_username)); write_setting_s(sesskey, "ProxyPassword", conf_get_str(conf, CONF_proxy_password)); write_setting_s(sesskey, "ProxyTelnetCommand", conf_get_str(conf, CONF_proxy_telnet_command)); wmap(sesskey, "Environment", conf, CONF_environmt); write_setting_s(sesskey, "UserName", conf_get_str(conf, CONF_username)); write_setting_i(sesskey, "UserNameFromEnvironment", conf_get_int(conf, CONF_username_from_env)); write_setting_s(sesskey, "LocalUserName", conf_get_str(conf, CONF_localusername)); write_setting_i(sesskey, "NoPTY", conf_get_int(conf, CONF_nopty)); write_setting_i(sesskey, "Compression", conf_get_int(conf, CONF_compression)); write_setting_i(sesskey, "TryAgent", conf_get_int(conf, CONF_tryagent)); write_setting_i(sesskey, "AgentFwd", conf_get_int(conf, CONF_agentfwd)); write_setting_i(sesskey, "GssapiFwd", conf_get_int(conf, CONF_gssapifwd)); write_setting_i(sesskey, "ChangeUsername", conf_get_int(conf, CONF_change_username)); wprefs(sesskey, "Cipher", ciphernames, CIPHER_MAX, conf, CONF_ssh_cipherlist); wprefs(sesskey, "KEX", kexnames, KEX_MAX, conf, CONF_ssh_kexlist); write_setting_i(sesskey, "RekeyTime", conf_get_int(conf, CONF_ssh_rekey_time)); write_setting_s(sesskey, "RekeyBytes", conf_get_str(conf, CONF_ssh_rekey_data)); write_setting_i(sesskey, "SshNoAuth", conf_get_int(conf, CONF_ssh_no_userauth)); write_setting_i(sesskey, "SshBanner", conf_get_int(conf, CONF_ssh_show_banner)); write_setting_i(sesskey, "AuthTIS", conf_get_int(conf, CONF_try_tis_auth)); write_setting_i(sesskey, "AuthKI", conf_get_int(conf, CONF_try_ki_auth)); write_setting_i(sesskey, "AuthGSSAPI", conf_get_int(conf, CONF_try_gssapi_auth)); #ifndef NO_GSSAPI wprefs(sesskey, "GSSLibs", gsslibkeywords, ngsslibs, conf, CONF_ssh_gsslist); write_setting_filename(sesskey, "GSSCustom", *conf_get_filename(conf, CONF_ssh_gss_custom)); #endif write_setting_i(sesskey, "SshNoShell", conf_get_int(conf, CONF_ssh_no_shell)); write_setting_i(sesskey, "SshProt", conf_get_int(conf, CONF_sshprot)); write_setting_s(sesskey, "LogHost", conf_get_str(conf, CONF_loghost)); write_setting_i(sesskey, "SSH2DES", conf_get_int(conf, CONF_ssh2_des_cbc)); write_setting_filename(sesskey, "PublicKeyFile", *conf_get_filename(conf, CONF_keyfile)); write_setting_s(sesskey, "RemoteCommand", conf_get_str(conf, CONF_remote_cmd)); write_setting_i(sesskey, "RFCEnviron", conf_get_int(conf, CONF_rfc_environ)); write_setting_i(sesskey, "PassiveTelnet", conf_get_int(conf, CONF_passive_telnet)); write_setting_i(sesskey, "BackspaceIsDelete", conf_get_int(conf, CONF_bksp_is_delete)); write_setting_i(sesskey, "RXVTHomeEnd", conf_get_int(conf, CONF_rxvt_homeend)); write_setting_i(sesskey, "LinuxFunctionKeys", conf_get_int(conf, CONF_funky_type)); write_setting_i(sesskey, "NoApplicationKeys", conf_get_int(conf, CONF_no_applic_k)); write_setting_i(sesskey, "NoApplicationCursors", conf_get_int(conf, CONF_no_applic_c)); write_setting_i(sesskey, "NoMouseReporting", conf_get_int(conf, CONF_no_mouse_rep)); write_setting_i(sesskey, "NoRemoteResize", conf_get_int(conf, CONF_no_remote_resize)); write_setting_i(sesskey, "NoAltScreen", conf_get_int(conf, CONF_no_alt_screen)); write_setting_i(sesskey, "NoRemoteWinTitle", conf_get_int(conf, CONF_no_remote_wintitle)); write_setting_i(sesskey, "RemoteQTitleAction", conf_get_int(conf, CONF_remote_qtitle_action)); write_setting_i(sesskey, "NoDBackspace", conf_get_int(conf, CONF_no_dbackspace)); write_setting_i(sesskey, "NoRemoteCharset", conf_get_int(conf, CONF_no_remote_charset)); write_setting_i(sesskey, "ApplicationCursorKeys", conf_get_int(conf, CONF_app_cursor)); write_setting_i(sesskey, "ApplicationKeypad", conf_get_int(conf, CONF_app_keypad)); write_setting_i(sesskey, "NetHackKeypad", conf_get_int(conf, CONF_nethack_keypad)); write_setting_i(sesskey, "AltF4", conf_get_int(conf, CONF_alt_f4)); write_setting_i(sesskey, "AltSpace", conf_get_int(conf, CONF_alt_space)); write_setting_i(sesskey, "AltOnly", conf_get_int(conf, CONF_alt_only)); write_setting_i(sesskey, "ComposeKey", conf_get_int(conf, CONF_compose_key)); write_setting_i(sesskey, "CtrlAltKeys", conf_get_int(conf, CONF_ctrlaltkeys)); write_setting_i(sesskey, "TelnetKey", conf_get_int(conf, CONF_telnet_keyboard)); write_setting_i(sesskey, "TelnetRet", conf_get_int(conf, CONF_telnet_newline)); write_setting_i(sesskey, "LocalEcho", conf_get_int(conf, CONF_localecho)); write_setting_i(sesskey, "LocalEdit", conf_get_int(conf, CONF_localedit)); write_setting_s(sesskey, "Answerback", conf_get_str(conf, CONF_answerback)); write_setting_i(sesskey, "AlwaysOnTop", conf_get_int(conf, CONF_alwaysontop)); write_setting_i(sesskey, "FullScreenOnAltEnter", conf_get_int(conf, CONF_fullscreenonaltenter)); write_setting_i(sesskey, "HideMousePtr", conf_get_int(conf, CONF_hide_mouseptr)); write_setting_i(sesskey, "SunkenEdge", conf_get_int(conf, CONF_sunken_edge)); write_setting_i(sesskey, "WindowBorder", conf_get_int(conf, CONF_window_border)); write_setting_i(sesskey, "CurType", conf_get_int(conf, CONF_cursor_type)); write_setting_i(sesskey, "BlinkCur", conf_get_int(conf, CONF_blink_cur)); write_setting_i(sesskey, "Beep", conf_get_int(conf, CONF_beep)); write_setting_i(sesskey, "BeepInd", conf_get_int(conf, CONF_beep_ind)); write_setting_filename(sesskey, "BellWaveFile", *conf_get_filename(conf, CONF_bell_wavefile)); write_setting_i(sesskey, "BellOverload", conf_get_int(conf, CONF_bellovl)); write_setting_i(sesskey, "BellOverloadN", conf_get_int(conf, CONF_bellovl_n)); write_setting_i(sesskey, "BellOverloadT", conf_get_int(conf, CONF_bellovl_t)BellOverloadS", conf_get_int(conf, CONF_bellovl_s)onf_get_int(conf, CONF_savelines)); write_setting_i(sesskey, "DECOriginMode", conf_get_int(conf, CONF_dec_om)); write_setting_i(sesskey, "AutoWrapMode", conf_get_int(conf, CONF_wrap_mode)); write_setting_i(sesskey, "LFImpliesCR", conf_get_int(conf, CONF_lfhascr)); write_setting_i(sesskey, "CRImpliesLF", conf_get_int(conf, CONF_crhaslf)); write_setting_i(sesskey, "DisableArabicShaping", conf_get_int(conf, CONF_arabicshaping)); write_setting_i(sesskey, "DisableBidi", conf_get_int(conf, CONF_bidi)); write_setting_i(sesskey, "WinNameAlways", conf_get_int(conf, CONF_win_name_always)); write_setting_s(sesskey, "WinTitle", conf_get_str(conf, CONF_wintitle)); write_setting_i(sesskey, "TermWidth", conf_get_int(conf, CONF_width)); write_setting_i(sesskey, "TermHeight", conf_get_int(conf, CONF_height)); write_setting_fontspec(sesskey, "Font", *conf_get_fontspec(conf, CONF_font)); write_setting_i(sesskey, "FontQuality", conf_get_int(conf, CONF_font_quality)); write_setting_i(sesskey, "FontVTMode", conf_get_int(conf, CONF_vtmode)); write_setting_i(sesskey, "UseSystemColours", conf_get_int(conf, CONF_system_colour)); write_setting_i(sesskey, "TryPalette", conf_get_int(conf, CONF_try_palette)); write_setting_i(sesskey, "ANSIColour", conf_get_int(conf, CONF_ansi_colour)); write_setting_i(sesskey, "Xterm256Colour", conf_get_int(conf, CONF_xterm_256_colour)); write_setting_i(sesskey, "BoldAsColour", conf_get_int(conf, CONF_bold_colour)); for (i = 0; i < 22; i++) { char buf[20], buf2[30]; sprintf(buf, "Colour%d", i); sprintf(buf2, "%d,%d,%d", conf_get_int_int(conf, CONF_colours, i*3+0), conf_get_int_int(conf, CONF_colours, i*3+1), conf_get_int_int(conf, CONF_colours, i*3+2)onf_get_int(conf, CONF_rawcnp)); write_setting_i(sesskey, "PasteRTF", conf_get_int(conf, CONF_rtf_paste)); write_setting_i(sesskey, "MouseIsXterm", conf_get_int(conf, CONF_mouse_is_xterm)); write_setting_i(sesskey, "RectSelect", conf_get_int(conf, CONF_rect_select)); write_setting_i(sesskey, "MouseOverride", conf_get_int(conf, CONF_mouse_override) conf_get_int_int(conf, CONF_wordness, j)); } write_setting_s(sesskey, buf, buf2); } write_setting_s(sesskey, "LineCodePage", conf_get_str(conf, CONF_line_codepage)); write_setting_i(sesskey, "CJKAmbigWide", conf_get_int(conf, CONF_cjk_ambig_wide)); write_setting_i(sesskey, "UTF8Override", conf_get_int(conf, CONF_utf8_override)); write_setting_s(sesskey, "Printer", conf_get_str(conf, CONF_printer)); write_setting_i(sesskey, "CapsLockCyr", conf_get_int(conf, CONF_xlat_capslockcyr)); write_setting_i(sesskey, "ScrollBar", conf_get_int(conf, CONF_scrollbar)); write_setting_i(sesskey, "ScrollBarFullScreen", conf_get_int(conf, CONF_scrollbar_in_fullscreen)); write_setting_i(sesskey, "ScrollOnKey", conf_get_int(conf, CONF_scroll_on_key)); write_setting_i(sesskey, "ScrollOnDisp", conf_get_int(conf, CONF_scroll_on_disp)); write_setting_i(sesskey, "EraseToScrollback", conf_get_int(conf, CONF_erase_to_scrollback)); write_setting_i(sesskey, "LockSize", conf_get_int(conf, CONF_resize_action)); write_setting_i(sesskey, "BCE", conf_get_int(conf, CONF_bce)); write_setting_i(sesskey, "BlinkText", conf_get_int(conf, CONF_blinktext)); write_setting_i(sesskey, "X11Forward", conf_get_int(conf, CONF_x11_forward)); write_setting_s(sesskey, "X11Display", conf_get_str(conf, CONF_x11_display)); write_setting_i(sesskey, "X11AuthType", conf_get_int(conf, CONF_x11_auth)); write_setting_filename(sesskey, "X11AuthFile", *conf_get_filename(conf, CONF_xauthfile)); write_setting_i(sesskey, "LocalPortAcceptAll", conf_get_int(conf, CONF_lport_acceptall)); write_setting_i(sesskey, "RemotePortAcceptAll", conf_get_int(conf, CONF_rport_acceptall)); wmap(sesskey, "PortForwardings", conf, CONF_portfwd); write_setting_i(sesskey, "BugIgnore1", 2-conf_get_int(conf, CONF_sshbug_ignore1)); write_setting_i(sesskey, "BugPlainPW1", 2-conf_get_int(conf, CONF_sshbug_plainpw1)); write_setting_i(sesskey, "BugRSA1", 2-conf_get_int(conf, CONF_sshbug_rsa1)); write_setting_i(sesskey, "BugIgnore2", 2-conf_get_int(conf, CONF_sshbug_ignore2)); write_setting_i(sesskey, "BugHMAC2", 2-conf_get_int(conf, CONF_sshbug_hmac2)); write_setting_i(sesskey, "BugDeriveKey2", 2-conf_get_int(conf, CONF_sshbug_derivekey2)); write_setting_i(sesskey, "BugRSAPad2", 2-conf_get_int(conf, CONF_sshbug_rsapad2)); write_setting_i(sesskey, "BugPKSessID2", 2-conf_get_int(conf, CONF_sshbug_pksessid2)); write_setting_i(sesskey, "BugRekey2", 2-conf_get_int(conf, CONF_sshbug_rekey2)); write_setting_i(sesskey, "BugMaxPkt2", 2-conf_get_int(conf, CONF_sshbug_maxpkt2)); write_setting_i(sesskey, "StampUtmp", conf_get_int(conf, CONF_stamp_utmp)); write_setting_i(sesskey, "LoginShell", conf_get_int(conf, CONF_login_shell)); write_setting_i(sesskey, "ScrollbarOnLeft", conf_get_int(conf, CONF_scrollbar_on_left)); write_setting_fontspec(sesskey, "BoldFont", *conf_get_fontspec(conf, CONF_boldfont)); write_setting_fontspec(sesskey, "WideFont", *conf_get_fontspec(conf, CONF_widefont)); write_setting_fontspec(sesskey, "WideBoldFont", *conf_get_fontspec(conf, CONF_wideboldfont)); write_setting_i(sesskey, "ShadowBold", conf_get_int(conf, CONF_shadowbold)); write_setting_i(sesskey, "ShadowBoldOffset", conf_get_int(conf, CONF_shadowboldoffset)); write_setting_s(sesskey, "SerialLine", conf_get_str(conf, CONF_serline)); write_setting_i(sesskey, "SerialSpeed", conf_get_int(conf, CONF_serspeed)); write_setting_i(sesskey, "SerialDataBits", conf_get_int(conf, CONF_serdatabits)); write_setting_i(sesskey, "SerialStopHalfbits", conf_get_int(conf, CONF_serstopbits)); write_setting_i(sesskey, "SerialParity", conf_get_int(conf, CONF_serparity)); write_setting_i(sesskey, "SerialFlowControl", conf_get_int(conf, CONF_serflow)); write_setting_s(sesskey, "WindowClass", conf_get_str(conf, CONF_winclass)); } void load_settings(char *section, Conf *confonf); close_settings_r(sesskey); if (conf_launchable(conf)) add_session_to_jumplist(section); } void load_open_settings(void *sesskey, Conf *conf) { int i; char *prot; conf_set_int(conf, CONF_ssh_subsys, 0); /* FIXME: load this properly */ conf_set_str(conf, CONF_remote_cmd, ""); conf_set_str(conf, CONF_remote_cmd2, ""); conf_set_str(conf, CONF_ssh_nc_host, ""); gpps(sesskey, "HostName", "", conf, CONF_host); gppfile(sesskey, "LogFileName", conf, CONF_logfilename); gppi(sesskey, "LogType", 0, conf, CONF_logtype); gppi(sesskey, "LogFileClash", LGXF_ASK, conf, CONF_logxfovr); gppi(sesskey, "LogFlush", 1, conf, CONF_logflush); gppi(sesskey, "SSHLogOmitPasswords", 1, conf, CONF_logomitpass); gppi(sesskey, "SSHLogOmitData", 0, conf, CONF_logomitdata); prot = gpps_raw(sesskey, "Protocol", "default"); conf_set_int(conf, CONF_protocol, default_protocol); conf_set_int(conf, CONF_port, default_port); { const Backend *b = backend_from_name(prot); if (b) { conf_set_int(conf, CONF_protocol, b->protocol); gppi(sesskey, "PortNumber", default_port, conf, CONF_port); } } sfree(prot); /* Address family selection */ gppi(sesskey, "AddressFamily", ADDRTYPE_UNSPEC, conf, CONF_addressfamily); i = gppi_raw(sesskey, "CloseOnExit", 1); conf_set_int(conf, CONF_close_on_exit, (i+1)%3); gppi(sesskey, "WarnOnClose", 1, conf, CONF_warn_on_close); { /* This is two values for backward compatibility with 0.50/0.51 */ int pingmin, pingsec; pingmin = gppi_raw(sesskey, "PingInterval", 0); pingsec = gppi_raw(sesskey, "PingIntervalSecs", 0); conf_set_int(conf, CONF_ping_interval, pingmin * 60 + pingsec); } gppi(sesskey, "TCPNoDelay", 1, conf, CONF_tcp_nodelay); gppi(sesskey, "TCPKeepalives", 0, conf, CONF_tcp_keepalives); gpps(sesskey, "TerminalType", "xterm", conf, CONF_termtype); gpps(sesskey, "TerminalSpeed", "38400,38400", conf, CONF_termspeed); if (!gppmap(sesskey, "TerminalModes", conf, CONF_ttymodes))for (i = 0; ttymodes[i]; i++) conf_set_str_str(conf, CONF_ttymodes, ttymodes[i], "A"); } /* proxy settings */ gpps(sesskey, "ProxyExcludeList", "", conf, CONF_proxy_exclude_list); i = gppi_raw(sesskey, "ProxyDNS", 1); conf_set_int(conf, CONF_proxy_dns, (i+1)%3); gppi(sesskey, "ProxyLocalhost", 0, conf, CONF_even_proxy_localhost); gppi(sesskey, "ProxyMethod", -1, conf, CONF_proxy_type); if (conf_get_int(conf, CONF_proxy_type) == -1) { int i; i = gppi_raw(sesskey, "ProxyType", 0); if (i == 0) conf_set_int(conf, CONF_proxy_type, PROXY_NONE); else if (i == 1) conf_set_int(conf, CONF_proxy_type, PROXY_HTTP); else if (i == 3) conf_set_int(conf, CONF_proxy_type, PROXY_TELNET); else if (i == 4) conf_set_int(conf, CONF_proxy_type, PROXY_CMD); else { i = gppi_raw(sesskey, "ProxySOCKSVersion", 5); if (i == 5) conf_set_int(conf, CONF_proxy_type, PROXY_SOCKS5); else conf_set_int(conf, CONF_proxy_type, PROXY_SOCKS4); } } gpps(sesskey, "ProxyHost", "proxy", conf, CONF_proxy_host); gppi(sesskey, "ProxyPort", 80, conf, CONF_proxy_port); gpps(sesskey, "ProxyUsername", "", conf, CONF_proxy_username); gpps(sesskey, "ProxyPassword", "", conf, CONF_proxy_password); gpps(sesskey, "ProxyTelnetCommand", "connect %host %port\\n", conf, CONF_proxy_telnet_command); gppmap(sesskey, "Environment", conf, CONF_environmt); gpps(sesskey, "UserName", "", conf, CONF_username); gppi(sesskey, "UserNameFromEnvironment", 0, conf, CONF_username_from_env); gpps(sesskey, "LocalUserName", "", conf, CONF_localusername); gppi(sesskey, "NoPTY", 0, conf, CONF_nopty); gppi(sesskey, "Compression", 0, conf, CONF_compression); gppi(sesskey, "TryAgent", 1, conf, CONF_tryagent); gppi(sesskey, "AgentFwd", 0, conf, CONF_agentfwd); gppi(sesskey, "ChangeUsername", 0, conf, CONF_change_username); gppi(sesskey, "GssapiFwd", 0, conf, CONF_onf, CONF_i = 2 - gppi_raw(sesskey, "BugDHGEx2", 0)onf, CONF_ssh_kexlist); } gppi(sesskey, "RekeyTime", 60, conf, CONF_ssh_rekey_time); gpps(sesskey, "RekeyBytes", "1G", conf, CONF_ssh_rekey_data); gppi(sesskey, "SshProt", 2, conf, CONF_sshprot); gpps(sesskey, "LogHost", "", conf, CONF_loghost); gppi(sesskey, "SSH2DES", 0, conf, CONF_ssh2_des_cbc); gppi(sesskey, "SshNoAuth", 0, conf, CONF_ssh_no_userauth); gppi(sesskey, "SshBanner", 1, conf, CONF_ssh_show_banner); gppi(sesskey, "AuthTIS", 0, conf, CONF_try_tis_auth); gppi(sesskey, "AuthKI", 1, conf, CONF_try_ki_auth); gppi(sesskey, "AuthGSSAPI", 1, conf, CONF_onf, CONF_ssh_gsslist); gppfile(sesskey, "GSSCustom", conf, CONF_ssh_gss_custom); #endif gppi(sesskey, "SshNoShell", 0, conf, CONF_ssh_no_shell); gppfile(sesskey, "PublicKeyFile", conf, CONF_keyfile); gpps(sesskey, "RemoteCommand", "", conf, CONF_remote_cmd); gppi(sesskey, "RFCEnviron", 0, conf, CONF_rfc_environ); gppi(sesskey, "PassiveTelnet", 0, conf, CONF_passive_telnet); gppi(sesskey, "BackspaceIsDelete", 1, conf, CONF_bksp_is_delete); gppi(sesskey, "RXVTHomeEnd", 0, conf, CONF_rxvt_homeend); gppi(sesskey, "LinuxFunctionKeys", 0, conf, CONF_funky_type); gppi(sesskey, "NoApplicationKeys", 0, conf, CONF_no_applic_k); gppi(sesskey, "NoApplicationCursors", 0, conf, CONF_no_applic_c); gppi(sesskey, "NoMouseReporting", 0, conf, CONF_no_mouse_rep); gppi(sesskey, "NoRemoteResize", 0, conf, CONF_no_remote_resize); gppi(sesskey, "NoAltScreen", 0, conf, CONF_no_alt_screen); gppi(sesskey, "NoRemoteWinTitle", 0, conf, CONF_no_remote_wintitle); { /* Backward compatibility */ int no_remote_qtitle = gppi_raw(sesskey, "NoRemoteQTitle", 1conf, CONF_remote_qtitle_action); } gppi(sesskey, "NoDBackspace", 0, conf, CONF_no_dbackspace); gppi(sesskey, "NoRemoteCharset", 0, conf, CONF_no_remote_charset); gppi(sesskey, "ApplicationCursorKeys", 0, conf, CONF_app_cursor); gppi(sesskey, "ApplicationKeypad", 0, conf, CONF_app_keypad); gppi(sesskey, "NetHackKeypad", 0, conf, CONF_nethack_keypad); gppi(sesskey, "AltF4", 1, conf, CONF_alt_f4); gppi(sesskey, "AltSpace", 0, conf, CONF_alt_space); gppi(sesskey, "AltOnly", 0, conf, CONF_alt_only); gppi(sesskey, "ComposeKey", 0, conf, CONF_compose_key); gppi(sesskey, "CtrlAltKeys", 1, conf, CONF_ctrlaltkeys); gppi(sesskey, "TelnetKey", 0, conf, CONF_telnet_keyboard); gppi(sesskey, "TelnetRet", 1, conf, CONF_telnet_newline); gppi(sesskey, "LocalEcho", AUTO, conf, CONF_localecho); gppi(sesskey, "LocalEdit", AUTO, conf, CONF_localedit); gpps(sesskey, "Answerback", "PuTTY", conf, CONF_answerback); gppi(sesskey, "AlwaysOnTop", 0, conf, CONF_alwaysontop); gppi(sesskey, "FullScreenOnAltEnter", 0, conf, CONF_fullscreenonaltenter); gppi(sesskey, "HideMousePtr", 0, conf, CONF_hide_mouseptr); gppi(sesskey, "SunkenEdge", 0, conf, CONF_sunken_edge); gppi(sesskey, "WindowBorder", 1, conf, CONF_window_border); gppi(sesskey, "CurType", 0, conf, CONF_cursor_type); gppi(sesskey, "BlinkCur", 0, conf, CONF_blink_cur); /* pedantic compiler tells me I can't use conf, CONF_beep as an int * :-) */ gppi(sesskey, "Beep", 1, conf, CONF_beep); gppi(sesskey, "BeepInd", 0, conf, CONF_beep_ind); gppfile(sesskey, "BellWaveFile", conf, CONF_bell_wavefile); gppi(sesskey, "BellOverload", 1, conf, CONF_bellovl); gppi(sesskey, "BellOverloadN", 5, conf, CONF_bellovl_n); i = gppi_raw(sesskey, "BellOverloadT", 2*TICKSPERSEC #ifdef PUTTY_UNIX_H *1000 #endif ); conf_set_int(conf, CONF_bellovl_t, i #ifdef PUTTY_UNIX_H / 1000 #endif ); i = gppi_raw); conf_set_int(conf, CONF_bellovl_s, i #ifdef PUTTY_UNIX_H / 1000 #endif ); gppi(sesskey, "ScrollbackLines", 200, conf, CONF_savelines); gppi(sesskey, "DECOriginMode", 0, conf, CONF_dec_om); gppi(sesskey, "AutoWrapMode", 1, conf, CONF_wrap_mode); gppi(sesskey, "LFImpliesCR", 0, conf, CONF_lfhascr); gppi(sesskey, "CRImpliesLF", 0, conf, CONF_crhaslf); gppi(sesskey, "DisableArabicShaping", 0, conf, CONF_arabicshaping); gppi(sesskey, "DisableBidi", 0, conf, CONF_bidi); gppi(sesskey, "WinNameAlways", 1, conf, CONF_win_name_always); gpps(sesskey, "WinTitle", "", conf, CONF_wintitle); gppi(sesskey, "TermWidth", 80, conf, CONF_width); gppi(sesskey, "TermHeight", 24, conf, CONF_height); gppfont(sesskey, "Font", conf, CONF_font); gppi(sesskey, "FontQuality", FQ_DEFAULT, conf, CONF_font_quality); gppi(sesskey, "FontVTMode", VT_UNICODE, conf, CONF_vtmode); gppi(sesskey, "UseSystemColours", 0, conf, CONF_system_colour); gppi(sesskey, "TryPalette", 0, conf, CONF_try_palette); gppi(sesskey, "ANSIColour", 1, conf, CONF_ansi_colour); gppi(sesskey, "Xterm256Colour", 1, conf, CONF_xterm_256_colour); gppi(sesskey, "BoldAsColour", 1, conf, CONF_*buf2; int c0, c1, c2; sprintf(buf, "Colour%d", i); buf2 = gpps_raw(sesskey, buf, defaults[i]); if (sscanf(buf2, "%d,%d,%d", &c0, &c1, &c2) == 3) { conf_set_int_int(conf, CONF_colours, i*3+0, c0); conf_set_int_int(conf, CONF_colours, i*3+1, c1); conf_set_int_int(conf, CONF_colours, i*3+2, c2); } sfree(buf2); } gppi(sesskey, "RawCNP", 0, conf, CONF_rawcnp); gppi(sesskey, "PasteRTF", 0, conf, CONF_rtf_paste); gppi(sesskey, "MouseIsXterm", 0, conf, CONF_mouse_is_xterm); gppi(sesskey, "RectSelect", 0, conf, CONF_rect_select); gppi(sesskey, "MouseOverride", 1, conf, CONF_*buf2, *p; int j; sprintf(buf, "Wordness%d", i); buf2 = gpps_raw(sesskey, buf, defaults[i / 32]onf_set_int_int(conf, CONF_wordness, j, atoi(q)); } sfree(buf2);onf, CONF_line_codepage); gppi(sesskey, "CJKAmbigWide", 0, conf, CONF_cjk_ambig_wide); gppi(sesskey, "UTF8Override", 1, conf, CONF_utf8_override); gpps(sesskey, "Printer", "", conf, CONF_printer); gppi(sesskey, "CapsLockCyr", 0, conf, CONF_xlat_capslockcyr); gppi(sesskey, "ScrollBar", 1, conf, CONF_scrollbar); gppi(sesskey, "ScrollBarFullScreen", 0, conf, CONF_scrollbar_in_fullscreen); gppi(sesskey, "ScrollOnKey", 0, conf, CONF_scroll_on_key); gppi(sesskey, "ScrollOnDisp", 1, conf, CONF_scroll_on_disp); gppi(sesskey, "EraseToScrollback", 1, conf, CONF_erase_to_scrollback); gppi(sesskey, "LockSize", 0, conf, CONF_resize_action); gppi(sesskey, "BCE", 1, conf, CONF_bce); gppi(sesskey, "BlinkText", 0, conf, CONF_blinktext); gppi(sesskey, "X11Forward", 0, conf, CONF_x11_forward); gpps(sesskey, "X11Display", "", conf, CONF_x11_display); gppi(sesskey, "X11AuthType", X11_MIT, conf, CONF_x11_auth); gppfile(sesskey, "X11AuthFile", conf, CONF_xauthfile); gppi(sesskey, "LocalPortAcceptAll", 0, conf, CONF_lport_acceptall); gppi(sesskey, "RemotePortAcceptAll", 0, conf, CONF_rport_acceptall); gppmap(sesskey, "PortForwardings", conf, CONF_portfwd); i = gppi_raw(sesskey, "BugIgnore1", 0); conf_set_int(conf, CONF_sshbug_ignore1, 2-i); i = gppi_raw(sesskey, "BugPlainPW1", 0); conf_set_int(conf, CONF_sshbug_plainpw1, 2-i); i = gppi_raw(sesskey, "BugRSA1", 0); conf_set_int(conf, CONF_sshbug_rsa1, 2-i); i = gppi_raw(sesskey, "BugIgnore2", 0); conf_set_int(conf, CONF_sshbug_ignore2, 2-i); { int i; i = gppi_raw(sesskey, "BugHMAC2", 0); conf_set_int(conf, CONF_sshbug_hmac2, 2-i); if (2-i == AUTO) { i = gppi_raw(sesskey, "BuggyMAC", 0); if (i == 1) conf_set_int(conf, CONF_sshbug_hmac2, FORCE_ON); } } i = gppi_raw(sesskey, "BugDeriveKey2", 0); conf_set_int(conf, CONF_sshbug_derivekey2, 2-i); i = gppi_raw(sesskey, "BugRSAPad2", 0); conf_set_int(conf, CONF_sshbug_rsapad2, 2-i); i = gppi_raw(sesskey, "BugPKSessID2", 0); conf_set_int(conf, CONF_sshbug_pksessid2, 2-i); i = gppi_raw(sesskey, "BugRekey2", 0); conf_set_int(conf, CONF_sshbug_rekey2, 2-i); i = gppi_raw(sesskey, "BugMaxPkt2", 0); conf_set_int(conf, CONF_sshbug_maxpkt2, 2-i); conf_set_int(conf, CONF_ssh_simple, FALSE); gppi(sesskey, "StampUtmp", 1, conf, CONF_stamp_utmp); gppi(sesskey, "LoginShell", 1, conf, CONF_login_shell); gppi(sesskey, "ScrollbarOnLeft", 0, conf, CONF_scrollbar_on_left); gppi(sesskey, "ShadowBold", 0, conf, CONF_shadowbold); gppfont(sesskey, "BoldFont", conf, CONF_boldfont); gppfont(sesskey, "WideFont", conf, CONF_widefont); gppfont(sesskey, "WideBoldFont", conf, CONF_wideboldfont); gppi(sesskey, "ShadowBoldOffset", 1, conf, CONF_shadowboldoffset); gpps(sesskey, "SerialLine", "", conf, CONF_serline); gppi(sesskey, "SerialSpeed", 9600, conf, CONF_serspeed); gppi(sesskey, "SerialDataBits", 8, conf, CONF_serdatabits); gppi(sesskey, "SerialStopHalfbits", 2, conf, CONF_serstopbits); gppi(sesskey, "SerialParity", SER_PAR_NONE, conf, CONF_serparity); gppi(sesskey, "SerialFlowControl", SER_FLOW_XONXOFF, conf, CONF_serflow); gpps(sesskey, "WindowClass", "", conf, CONF_winclass); } void do_defaults(char *session, Conf *conf) { load_settings(session, conf Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d2fc634403340b76c2d0d4b45ea37f5 Text-delta-base-sha1: 876d3b4147af4917809995a75289a7d7d4028845 Text-content-length: 14531 Text-content-md5: 609f7e2e31af6bd81133a0a8df376310 Text-content-sha1: 5584fca7aeb2e87926ffae6eeb9f481bf0cd8b4e Content-length: 14531 SVN����i�I��DS�u+�8$~�6�}.�`J�,.j�l�h_d�Jf�Yp�{&j�an�;h�Wj�;'�Sy�\�o�K�Nl�ZC)�l0�an�Nl�~Cb��� Y�Ly�zC�rWour own copy of a Conf structure here. That way, * when we're passed a new one for reconfiguration, we can check * the differences and potentially reconfigure port forwardings * etc in mid-session. */ Conf *conf; /* * Values cached out of conf so as to avoid the tree234 lookup * cost every time they're used. */ int logomitdata; /* * Dynamically allocated username string created during SSH * login. Stored in here rather than in the coroutine state so * that it'll be reliably freed if we shut down the SSH session * at some unexpected moment. */ char *usernameconf_get_int(ssh->conf, CONF_logomitpass)ttymodes. */ static void parse_ttymodes(Ssh ssh, void (*do_mode)(void *data, char *mode, char *val), void *data) { char *key, *val; for (val = conf_get_str_strs(ssh->conf, CONF_ttymodes, NULL, &key); val != NULL; val = conf_get_str_strs(ssh->conf, CONF_ttymodes, key, &key)) { /* * val[0] is either 'V', indicating that an explicit value * follows it, or 'A' indicating that we should pass the * value through from the local environment via get_ttymode. */ if (val[0] == 'A') val = get_ttymode(ssh->frontend, key); else val++; /* skip the 'V' */ if (val) do_mode(data, key, val)conf_get_int(ssh->conf, CONF_sshbug_ignore1) == FORCE_ON || (conf_get_int(ssh->conf, CONF_sshbug_ignore1)conf_get_int(ssh->conf, CONF_sshbug_plainpw1) == FORCE_ON || (conf_get_int(ssh->conf, CONF_sshbug_plainpw1)conf_get_int(ssh->conf, CONF_sshbug_rsa1) == FORCE_ON || (conf_get_int(ssh->conf, CONF_sshbug_rsa1)conf_get_int(ssh->conf, CONF_sshbug_hmac2) == FORCE_ON || (conf_get_int(ssh->conf, CONF_sshbug_hmac2)conf_get_int(ssh->conf, CONF_sshbug_derivekey2) == FORCE_ON || (conf_get_int(ssh->conf, CONF_sshbug_derivekey2)conf_get_int(ssh->conf, CONF_sshbug_rsapad2) == FORCE_ON || (conf_get_int(ssh->conf, CONF_sshbug_rsapad2)conf_get_int(ssh->conf, CONF_sshbug_pksessid2) == FORCE_ON || (conf_get_int(ssh->conf, CONF_sshbug_pksessid2)conf_get_int(ssh->conf, CONF_sshbug_rekey2) == FORCE_ON || (conf_get_int(ssh->conf, CONF_sshbug_rekey2)conf_get_int(ssh->conf, CONF_sshbug_maxpkt2) == FORCE_ON || (conf_get_int(ssh->conf, CONF_sshbug_maxpkt2)conf_get_int(ssh->conf, CONF_sshbug_ignore2)conf_get_int(ssh->conf, CONF_sshprot)conf_get_int(ssh->conf, CONF_sshprot)conf_get_int(ssh->conf, CONF_sshprot)conf_get_int(ssh->conf, CONF_sshprot)ssh->conf char *loghost; int addressfamily, sshprot; loghost = conf_get_str(ssh->conf, CONF_loghost); if (*loghost) { char *colon; ssh->savedhost = dupstr(addressfamily = conf_get_int(ssh->conf, CONF_addressfamily); logeventf(ssh, "Looking up host \"%s\"%s", host, (addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" : (ssh->conf, ssh->confsshprot = conf_get_int(ssh->conf, CONF_sshprot); if (sshprot == 0) ssh->version = 1; if (loghost) { sfree(*realhost); *realhost = dupstr( Filename *keyfileconf_get_int_int(ssh->conf, CONF_ssh_cipherlist, i)���\ah�8�vd�^xG�B��Hw�v|��UyU�uW�e3�3�`S�N=� �Q0�Ky�NO�X�a��/�iI�\px�b r�s_�Jmm�,S�s|�h�U+�K^�+�U�%]�$ �<@3�"p|�Iy� T�Uo�}`�eqC�0s�:� U�|u�0�e &�}m� }3DES"; break; case CIPHER_BLOWFISH: s->cipher_type = SSH_CIPHER_BLOWFISH; cipher_string = "Blowfish"; break; case CIPHER_DES: s->cipher_type = SSH_CIPHER_DES; cipher_string = "single-DES"; break; } if (s->supported_ciphers_mask & (1 << s->cipher_type)) cipher_chosen = 1; } } if (!cipher_chosen) { if ((s->supported_ciphers_mask & (1 << SSH_CIPHER_3DES)) == 0) bombout(("Server violates SSH-1 protocol by not " "supporting 3DES encryption")); else /* shouldn't happen */ bombout(("No supported ciphers found")); crStop(0); } /* Warn about chosen cipher if necessary. */ if (warn) { ssh_set_frozen(ssh, 1); s->dlgret = askalg(ssh->frontend, "cipher", cipher_string waiting" " cipher warning", NULL, 0, TRUE); crStop(0); } (ssh->username = get_remote_username(ssh->conf)) == NULL/* 512 is an arbitrary upper limit on username size */ add_prompt(s->cur_prompt, dupstr("login as: "), TRUE, 512);ssh->username = dupstr(s->cur_prompt->prompts[0]->resultsh->username, PKT_END); { char *userlog = dupprintf("Sent username \"%s\"", sshs->keyfile = conf_get_filename(ssh->conf, CONF_keyfile); if (!filename_is_null(*s->s->keyfile)); keytype = key_type(s->keyfile); if (keytype == SSH_KEYTYPE_SSH1) { const char *error; if (rsakey_pubblob(s->s->s->s->conf_get_int(ssh->conf, CONF_tryagent)s->keyfile = conf_get_filename(ssh->conf, CONF_keyfiles->s->keyfile = conf_get_filename(ssh->conf, CONF_keyfile); ret = loadrsakey(s->s->conf_get_int(ssh->conf, CONF_try_tis_auth)conf_get_int(ssh->conf, CONF_try_tis_auth)s@%s's password: ", sshConf *conf) { struct ssh_portfwd *epf; int i; char *key, *valfor (val = conf_get_str_strs(conf, CONF_portfwd, NULL, &key); val != NULL; val = conf_get_str_strs(conf, CONF_portfwd, key, &key)) { char *kp, *kp2, *vp, *vp2; char address_family, type; int sport,dport,sserv,dserv; char *sports, *dports, *saddr, *host; kp = key; address_family = 'A'; type = 'L'; if (*kp == 'A' || *kp == '4' || *kp == '6') address_family = *kp++; if (*kp == 'L' || *kp == 'R') type = *kp++; if ((kp2 = strchr(kp, ':')) != NULL) { /* * There's a colon in the middle of the source port * string, which means that the part before it is * actually a source address. */ saddr = dupprintf("%.*s", (int)(kp2 - kp), kp); sports = kp2+1; } else { saddr = NULL; sports = kp; if (type == 'L' && !strcmp(val, "D")) { /* dynamic forwarding */ host = NULL; dports = NULL; dport = -1; dserv = 0; type = 'D'; } else { /* ordinary forwarding */ vp = val; vp2 = vp + strcspn(vp, ":"); host = dupprintf("%.*s", (int)(vp2 - vp), vp); if (vp2) vp2++; dports = vp2 saddr; pfrec->sserv = sserv ? dupstr(sports) : NULL; pfrec->sport = sport; pfrec->daddr = host else { sfree(saddr); sfree(host);conf_get_int(conf, CONF_rport_acceptall)) { /* XXX: onfonfonf_get_int(conf, CONF_rport_acceptall)ssh->confssh->confconf_get_int(ssh->conf, CONF_agentfwd)conf_get_int(ssh->conf, CONF_x11_forward) && (ssh->x11disp = x11_setup_display(conf_get_str(ssh->conf, CONF_x11_display), conf_get_int(ssh->conf, CONF_x11_auth), ssh->confssh->conf); ssh->packet_dispatch[SSH1_MSG_PORT_OPEN] = ssh1_msg_port_open; if (!conf_get_int(ssh->conf, CONF_nopty)conf_get_str(ssh->conf, CONF_termspeed)conf_get_str(ssh->conf, CONF_termtype)conf_get_int(ssh->conf, CONF_compression)conf_get_str(ssh->conf, CONF_remote_cmd); if (conf_get_int(ssh->conf, CONF_ssh_subsys) && conf_get_str(ssh->conf, CONF_remote_cmd2)) { cmd = conf_get_str(ssh->conf, CONF_remote_cmd2)conf_get_int_int(ssh->conf, CONF_ssh_kexlist, i)conf_get_int_int(ssh->conf, CONF_ssh_cipherlist, i)conf_get_int(ssh->conf, CONF_ssh2_des_cbc)conf_get_int(ssh->conf, CONF_compression)conf_get_int(ssh->conf, CONF_ssh_rekey_time) != 0) ssh->next_rekey = schedule_timer(conf_get_int(ssh->conf, CONF_ssh_rekey_time)conf_get_int(ssh->conf, CONF_ssh_rekey_time) != 0) { ssh->next_rekey = schedule_timer(conf_get_int(ssh->conf, CONF_ssh_rekey_time)conf_get_int(ssh->conf, CONF_ssh_simple)�[~u�,��OA��V3�w!�g%�, �=NT�q*�xR�@T�r�-�AQ�)#�hg�(g�HUb�#n�5_��"�AK� K�h�-o� ~� %�]2n�HN�J~�W`�nN�X<�&�A8�y�,��y�N0�~~�hX�V0�}t�M�WR�t�N7�[X�h<�75�;z�PG�(�3aH�wy�%"V�c{�5�Kn�8eB�]g�Yk�MB`�TE�Q0�L~�yQ9�*6�or��wh� m� .a.message, c->u.a.totallen, &reply, &replylen, ssh_agentf_callback, c)) ssh_agentf_callback(c, reply, replylen); sfree(c->u.a.message); c->u.a.lensofar = 0; } } bufsize = 0; break; } /* * If it looks like the remote end hit the end of its window, * and we didn't want it to do that, think about using a * larger window. */ if (c->v.v2.remlocwin <= 0 && c->v.v2.throttle_state == UNTHROTTLED && c->v.v2.locmaxwin < 0x40000000) c->v.v2.locmaxwin += OUR_V2_WINSIZE; /* * If we are not buffering too much data, * enlarge the window again at the remote side. * If we are buffering too much, we may still * need to adjust the window if the server's * sent excess data. */ ssh2_set_window(c, bufsize < c->v.v2.locmaxwin ? c->v.v2.locmaxwin - bufsize : 0); /* * If we're either buffering way too much data, or if we're * buffering anything at all and we're in "simple" mode, * throttle the whole channel. */ if ((bufsize > c->v.v2.locmaxwin || (conf_get_int(ssh->conf, CONF_ssh_simple) && bufsize > 0)) && !c->throttling_conn) { c->throttling_conn = 1; conf_get_int(ssh->conf, CONF_ssh_no_shell)ssh->confssh->confconf_get_int(ssh->conf, CONF_ssh_show_banner)*username Filename *keyfileconf_get_int(ssh->conf, CONF_ssh_no_userauth)s->keyfile = conf_get_filename(ssh->conf, CONF_keyfile); if (!filename_is_null(*s->s->keyfile)); keytype = key_type(s->s->s->s->s->conf_get_int(ssh->conf, CONF_tryagent)conf_get_int(ssh->conf, CONF_change_username)(ssh->username = get_remote_username(ssh->conf)) == NULL/* 512 is an arbitrary limit :-( */ add_prompt(s->cur_prompt, dupstr("login as: "), TRUE, 512ssh->username = dupstr(s->cur_prompt->prompts[0]->resultshshconf_get_int(ssh->conf, CONF_change_username)conf_get_int(ssh->conf, CONF_try_ki_auth)ssh->conf); s->can_gssapi = conf_get_int(ssh->conf, CONF_try_gssapi_auth)shshshs->keyfile = conf_get_filename(ssh->conf, CONF_keyfile); key = ssh2_load_userkey(s->keyfile, passphrase,shconf_get_int_int(ssh->conf, CONF_ssh_gsslist, i)shconf_get_int(ssh->conf, CONF_gssapifwd)shshs@%s's password: ", sshshshconf_get_int(ssh->conf, CONF_ssh_no_shell)) { ssh->mainchan = NULL; } else if (*conf_get_str(ssh->conf, CONF_ssh_nc_host)conf_get_str(ssh->conf, CONF_ssh_nc_host), conf_get_int(ssh->conf, CONF_ssh_nc_port)conf_get_str(ssh->conf, CONF_ssh_nc_host)); ssh2_pkt_adduint32(s->pktout, conf_get_int(ssh->conf, CONF_ssh_nc_port)conf_get_int(ssh->conf, CONF_ssh_simple)conf_get_int(ssh->conf, CONF_x11_forward) && (ssh->x11disp = x11_setup_display(conf_get_str(ssh->conf, CONF_x11_display), conf_get_int(ssh->conf, CONF_x11_auth), ssh->conf))) { logevent("Requesting X11x11ssh->confconf_get_int(ssh->conf, CONF_agentfwd)conf_get_int(ssh->conf, CONF_nopty)conf_get_str(ssh->conf, CONF_termspeed)conf_get_str(ssh->conf, CONF_termtype)) { char *key, *val; s->num_env = 0; for (val = conf_get_str_strs(ssh->conf, CONF_environmt, NULL, &key); val != NULL; val = conf_get_str_strs(ssh->conf, CONF_environmt, key, &key)) {(s->pktout, key); ssh2_pkt_addstring(s->pktout, val); ssh2_pkt_send(ssh, s->pktout); s->num_env++; } if (s->num_env) { logeventf(ssh, "Sent %d environment variables", s->num_env); s->env_ok = 0; s->env_left = s->num_env; while (s->env_left > 0) { crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Unexpected response to environment request:" " packet type %d", pktin->type)); crStopV; } } else { s->env_ok++; } s->env_left--; } if (s->env_ok == s->num_env) { logevent("All environment variables successfully set"); } else if (s->env_ok == 0) { logevent("All environment variables refused"); c_write_str(ssh, "Server refused to set environment variables\r\n"); } else { logeventf(ssh, "%d environment variables refused", s->num_env - s->env_ok); c_write_str(ssh, "Server refused to set all environment variables\r\n"); }conf_get_int(ssh->conf, CONF_ssh_subsys2); cmd = conf_get_str(ssh->conf, CONF_remote_cmd2); } else { subsys = conf_get_int(ssh->conf, CONF_ssh_subsys); cmd = conf_get_str(ssh->conf, CONF_remote_cmd) *conf_get_str(ssh->conf, CONF_remote_cmd2)conf_get_int(ssh->conf, CONF_ssh_rekey_time)static void ssh_cache_conf_values(Ssh ssh) { ssh->logomitdata = conf_get_int(ssh->conf, CONF_logomitdata); *conf, char *host, int port, char **realhost, int nodelay,onf = conf_copy(conf); ssh_cache_conf_values(ssh); ssh->username = NULLconf_get_int(ssh->conf, CONF_width); ssh->term_height = conf_get_int(ssh->conf, CONF_height)conf_get_str(ssh->conf, CONF_ssh_rekey_data) sfree(ssh->username); conf_free(ssh->conf *conf int i, rekey_time; pinger_reconfig(ssh->pinger, ssh->conf, conf); if (ssh->portfwds) ssh_setup_portfwd(ssh, conf); rekey_time = conf_get_int(conf, CONF_ssh_rekey_time); if (conf_get_int(ssh->conf, CONF_ssh_rekey_time) != rekey_time && rekey_time != 0) { long new_next = ssh->last_rekey + onf_get_str(ssh->conf, CONF_ssh_rekey_data)conf_get_int(ssh->conf, CONF_compression) != conf_get_int(conf, CONF_compression)) { rekeying = "compression setting changed"; rekey_mandatory = TRUE; } for (i = 0; i < CIPHER_MAX; i++) if (conf_get_int_int(ssh->conf, CONF_ssh_cipherlist, i) != conf_get_int_int(conf, CONF_ssh_cipherlist, i)) { rekeying = "cipher settings changed"; rekey_mandatory = TRUE; } if (conf_get_int(ssh->conf, CONF_ssh2_des_cbc) != conf_get_int(conf, CONF_ssh2_des_cbc)) { rekeying = "cipher settings changed"; rekey_mandatory = TRUE; } conf_free(ssh->conf); ssh->conf = conf_copy(conf); ssh_cache_conf_values(ssh);conf_get_int(ssh->conf, CONF_nopty)conf_get_int(ssh->conf, CONF_ssh_simple) Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 03cd3dddd9f117c6902b7897dcdc4ca4 Text-delta-base-sha1: fa12fbb23d7a467b487291557622addbfa76139b Text-content-length: 106 Text-content-md5: fece3c9680cf549e936787d138461c39 Text-content-sha1: 9b2b3c1ec1d73ddbba511a78acb128c5fcbdd62f Content-length: 106 SVN��\$";�7��FO�LE��9;�UConf *conf, Conf *conf, void **sockdata,ConfConf Conf Node-path: putty/sshgss.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e27deb9f3ff25fde37efc4b26d5d70b5 Text-delta-base-sha1: 4a3ec4ad55b59a5e098f8393686331d5861c8e24 Text-content-length: 31 Text-content-md5: a02753ff4187d15dbe3844fcf5a5deb1 Text-content-sha1: 631368256c7f638ab315a9f899295a55a41e21ff Content-length: 31 SVN�� �[��)lConf *conf Node-path: putty/sshnogss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a8fbea13f515706470dc0a7382fb89dc Text-delta-base-sha1: 5ccb0b90d43440b0da31297c833ee260a6979af2 Text-content-length: 30 Text-content-md5: 71ef5fd430c9fa724e0e385ec54ed66d Text-content-sha1: 897d6208418cd2f65f7a8e76d73f3b42eaff00a3 Content-length: 30 SVN��yr �w��qConf *conf Node-path: putty/storage.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 500a70e1612f5b087e148d550f8183c1 Text-delta-base-sha1: 829567794a346f978fe9c088971e611f6615b5f3 Text-content-length: 240 Text-content-md5: ac15e291ce74a19ce5bf25e4ed800550 Text-content-sha1: 5ba93a56b78fa7cb3d9cc2339f7ceb9f7555b61e Content-length: 240 SVN��L� ��\lD�m�mn internal Conf structure into * a set of (key,value) pairs in their external storage format is * elsewhere, since it doesn't (mostly)returns a dynamically allocated string which the * caller must free Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e656a519d341954d1ffd81ec99d079e Text-delta-base-sha1: 3c637eeefbc37091aa1bbaf9200fd0cea9c7724a Text-content-length: 3640 Text-content-md5: 7e1903c7d6a9b6dafae34a1e6cb3791a Text-content-sha1: 086bd6a2f6529ab067c3ec68c7f1c510264e0459 Content-length: 3640 SVN��lI�s��PyJ�|�a4S�Nep�h,q�<H�H��q_�D'�V.�c{i�0)�?�5m�e.�u~�Ra�m,(�75 *conf*b, *p, *q; int var, value, n, bsize; char *e, *eval, *ekey, *userchar *termspeed = conf_get_str(telnet->conf, CONF_termspeed); b = snewn(20 + strlen(termspeed), unsigned char); b[0] = IAC; b[1] = SB; b[2] = TELOPT_TSPEED; b[3] = TELQUAL_IS; strcpy((char *)(b + 4), termspeed); n = 4 + strlen(rmspeed); logevent(telnet->frontend, logbuf); sfree(logbuf); sfree(bchar *termtype = conf_get_str(telnet->conf, CONF_termtype); b = snewn(20 + strlen(termtype), unsigned char)rmtype[n]; n++) b[n + 4] = (termtype[n] >= 'a' && termtype[n] <= 'z' ? termtype[n] + 'A' - 'a' : sfree(bconf_get_str(telnet->conf, CONF_rfc_environ)size = 20; for (eval = conf_get_str_strs(telnet->conf, CONF_environmt, NULL, &ekey); eval != NULL; eval = conf_get_str_strs(telnet->conf, CONF_environmt, ekey, &ekey)) bsize += strlen(ekey) + strlen(eval) + 2; user = get_remote_username(telnet->conf); if (user) bsize += 6 + strlen(user); b = snewn(bsize, unsigned char); b[0] = IAC; b[1] = SB; b[2] = telnet->sb_opt; b[3] = TELQUAL_IS; n = 4; for (eval = conf_get_str_strs(telnet->conf, CONF_environmt, NULL, &ekey); eval != NULL; eval = conf_get_str_strs(telnet->conf, CONF_environmt, ekey, &ekey)) { b[n++] = var; for (e = ekey; *e; e++) b[n++] = *e; b[n++] = value; for (e = eval; *e; e++) b[n++] = *e; } if (user) { b[n++] = var; b[n++] = 'U'; b[n++] = 'S'; b[n++] = 'E'; b[n++] = 'R'; b[n++] = value; for (e = user; *e; e++) b[n++] = *e; } b[n++] = IAC; b[n++] = SE; telnet->bufsize = sk_write(telnet->s, (char *)b, n); if (n == 6) { logbuf = dupprintf("client:\tSB %s IS <nothing>", telopt(telnet->sb_opt)); logevent(telnet->frontend, logbuf); sfree(logbuf); } else { logbuf = dupprintf("client:\tSB %s IS:", telopt(telnet->sb_opt)); logevent(telnet->frontend, logbuf); sfree(logbuf); for (eval = conf_get_str_strs(telnet->conf, CONF_environmt, NULL, &ekey); eval != NULL; eval = conf_get_str_strs(telnet->conf, CONF_environmt, ekey, &ekey)) { logbuf = dupprintf("\t%s=%s", ekey, eval); logevent(telnet->frontend, logbuf); sfree(logbuf); } if (user) { logbuf = dupprintf("\tUSER=%s", user); logevent(telnet->frontend, logbuf); sfree(logbuf); } } sfree(b); sfree(user); *conf, char *host, int port, char **realhost, char *loghost; int addressfamily; telnet = snew(struct telnet_tag); telnet->fn = &fn_table; telnet->conf = conf_copy(conf);conf_get_int(telnet->conf, CONF_width); telnet->term_height = conf_get_int(telnet->conf, CONF_height)addressfamily = conf_get_int(telnet->conf, CONF_addressfamily); buf = dupprintf("Looking up host \"%s\"%s", host, (addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" : (telnet->conf, telnet->conftelnet->conf, &telnet_backend, telnet); /* * Initialise option states. */ if (conf_get_int(telnet->conf, CONF_passive_telnet)loghost = conf_get_str(telnet->conf, CONF_loghost); if (*loghost) { char *colon; sfree(*realhost); *realhost = dupstr(conf_free(telnet->conf *conf) { Telnet telnet = (Telnet) handle; pinger_reconfig(telnet->pinger, telnet->conf, conf); conf_free(telnet->conf); telnet->conf = conf_copy(conf); Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0bca3d5a64478b8341decf905bd33166 Text-delta-base-sha1: 40c1999084e3806958f6ceb6a7f43bdc8c3bad6e Text-content-length: 11214 Text-content-md5: 03cf5d65878b174c2a4bd0a35fe8eb7e Text-content-sha1: 10ed3bc7289c3365b25ceeed4001d61d9e7100d8 Content-length: 11214 SVN�����,��0�O�l�.�El�su�u}�v�ax�n�1��!�B^0�UrA�0'� �<�[{�,O�ns�e�m�� �)�FC� C�nx�Gj�(5c�6;�Fu�?Y�d �Gt�Q?�GE� ([�+/�"e�y&�]|�k(�_z�k]�fL� 6� D� R�0c� � %� 3�hD�x0�-,�1conf_get_int(term->conf, CONF_dec_om)conf_get_int(term->conf, CONF_wrap_mode)conf_get_int(term->conf, CONF_app_cursor); term->app_keypad_keys = conf_get_int(term->conf, CONF_app_keypad); term->use_bce = conf_get_int(term->conf, CONF_bce); term->blink_is_real = conf_get_int(term->conf, CONF_blinktext)conf_get_int_int(term->conf, CONF_wordness, i)e copy a bunch of stuff out of the Conf structure into local * fields in the Terminal structure, to avoid the repeated tree234 * lookups which would be involved in fetching them from the former * every time. */ void term_copy_stuff_from_conf(Terminal *term) { term->ansi_colour = conf_get_int(term->conf, CONF_ansi_colour); term->arabicshaping = conf_get_int(term->conf, CONF_arabicshaping); term->beep = conf_get_int(term->conf, CONF_beep); term->bellovl = conf_get_int(term->conf, CONF_bellovl); term->bellovl_n = conf_get_int(term->conf, CONF_bellovl_n); term->bellovl_s = conf_get_int(term->conf, CONF_bellovl_s); term->bellovl_t = conf_get_int(term->conf, CONF_bellovl_t); term->bidi = conf_get_int(term->conf, CONF_bidi); term->bksp_is_delete = conf_get_int(term->conf, CONF_bksp_is_delete); term->blink_cur = conf_get_int(term->conf, CONF_blink_cur); term->blinktext = conf_get_int(term->conf, CONF_blinktext); term->cjk_ambig_wide = conf_get_int(term->conf, CONF_cjk_ambig_wide); term->conf_height = conf_get_int(term->conf, CONF_height); term->conf_width = conf_get_int(term->conf, CONF_width); term->crhaslf = conf_get_int(term->conf, CONF_crhaslf); term->erase_to_scrollback = conf_get_int(term->conf, CONF_erase_to_scrollback); term->funky_type = conf_get_int(term->conf, CONF_funky_type); term->lfhascr = conf_get_int(term->conf, CONF_lfhascr); term->logflush = conf_get_int(term->conf, CONF_logflush); term->logtype = conf_get_int(term->conf, CONF_logtype); term->mouse_override = conf_get_int(term->conf, CONF_mouse_override); term->nethack_keypad = conf_get_int(term->conf, CONF_nethack_keypad); term->no_alt_screen = conf_get_int(term->conf, CONF_no_alt_screen); term->no_applic_c = conf_get_int(term->conf, CONF_no_applic_c); term->no_applic_k = conf_get_int(term->conf, CONF_no_applic_k); term->no_dbackspace = conf_get_int(term->conf, CONF_no_dbackspace); term->no_mouse_rep = conf_get_int(term->conf, CONF_no_mouse_rep); term->no_remote_charset = conf_get_int(term->conf, CONF_no_remote_charset); term->no_remote_resize = conf_get_int(term->conf, CONF_no_remote_resize); term->no_remote_wintitle = conf_get_int(term->conf, CONF_no_remote_wintitle); term->rawcnp = conf_get_int(term->conf, CONF_rawcnp); term->rect_select = conf_get_int(term->conf, CONF_rect_select); term->remote_qtitle_action = conf_get_int(term->conf, CONF_remote_qtitle_action); term->rxvt_homeend = conf_get_int(term->conf, CONF_rxvt_homeend); term->scroll_on_disp = conf_get_int(term->conf, CONF_scroll_on_disp); term->scroll_on_key = conf_get_int(term->conf, CONF_scroll_on_key); term->xterm_256_colour = conf_get_int(term->conf, CONF_xterm_256_colour); /* * Parse the control-character escapes in the configured * answerback string. */ { char *answerback = conf_get_str(term->conf, CONF_answerback); int maxlen = strlen(answerback); term->answerback = snewn(maxlen, char); term->answerbacklen = 0; while (*answerback) { char *n; char c = ctrlparse(answerback, &n); if (n) { term->answerback[term->answerbacklen++] = c; answerback = n; } else { term->answerback[term->answerbacklen++] = *answerback++; } } } *confconf_get_int(term->conf, CONF_wrap_mode) != conf_get_int(conf, CONF_wrap_mode)); reset_decom = (conf_get_int(term->conf, CONF_dec_om) != conf_get_int(conf, CONF_dec_om)); reset_bce = (conf_get_int(term->conf, CONF_bce) != conf_get_int(conf, CONF_bce)); reset_tblink = (conf_get_int(term->conf, CONF_blinktext) != conf_get_int(conf, CONF_blinktext)); reset_charclass = 0; for (i = 0; i < 256; i++) if (conf_get_int_int(term->conf, CONF_wordness, i) != conf_get_int_int(conf, CONF_wordness, i)conf_get_int(term->conf, CONF_arabicshaping) != conf_get_int(conf, CONF_arabicshaping) || conf_get_int(term->conf, CONF_bidi) != conf_get_int(conf, CONF_bidi)conf_free(term->conf); term->conf = conf_copy(conf); if (reset_wrap) term->alt_wrap = term->wrap = conf_get_int(term->conf, CONF_wrap_mode); if (reset_decom) term->alt_om = term->dec_om = conf_get_int(term->conf, CONF_dec_om); if (reset_bce) { term->use_bce = conf_get_int(term->conf, CONF_bce); set_erase_char(term); } if (reset_tblink) { term->blink_is_real = conf_get_int(term->conf, CONF_blinktext)conf_get_int_int(term->conf, CONF_wordness, i); if (conf_get_int(term->conf, CONF_no_alt_screen)) swap_screen(term, 0, FALSE, FALSE); if (conf_get_int(term->conf, CONF_no_mouse_rep)) { term->xterm_mouse = 0; set_raw_mouse_mode(term->frontend, 0); } if (conf_get_int(term->conf, CONF_no_remote_charset)conf_get_str(term->conf, CONF_printer)) { term_print_finish(term); } term_schedule_tblink(term); term_schedule_cblink(term); term_copy_stuff_from_conf *myconfonf = conf_copy(myconf);term_copy_stuff_from_conf(term)conf_free(term->confno_alt_screen ? 0 : state, TRUE, FALSE); if (!state && !term->, char *printer) { bufchain_clear(&term->printer_buf); term->print_job = printer_start_job(lpage_send(term->ldisc, DEFAULT_CODEPAGE, term->answerback, term->answerbacklenbellovl && !term->beep_overloaded && term->nbeeps >= term->bellovl || !term->beep_overloaded) { do_beep(term->frontend, term->beep); if (term-> if (term->crhaslf) {lfhascr) char *printer; if (term->esc_nargs != 1) break; if (term->esc_args[0] == 5 && (printer = conf_get_str(term->conf, CONF_printer))[0], printer); } else if (term->esc_arg�.(y"&����c}�:�E�_d�n�J/�t}�t�S �x`�a\�FA�n�Cm�yS�uP�i[�HD�<�c[� B�O�9m� M�/^�5�4J�4&�\^�>�Y�/c�"�<�)W�O�W�jW�N`s[0] == 4 && term->printing) { term_print_finish(term); } } break; case 'l': /* RM: toggle modes to low */ case ANSI_QUE('l'): compatibility(VT100); { int i; for (i = 0; i < term->esc_nargs; i++) toggle_mode(term, term->esc_args[i], term->esc_query, FALSE); } break; case 'g': /* TBC: clear tabs */ compatibility(VT100); if (term->esc_nargs == 1) { if (term->esc_args[0] == 0) { term->tabs[term->curs.x] = FALSE; } else if (term->esc_args[0] == 3) { int i; for (i = 0; i < term->cols; i++) term->tabs[i] = FALSE; } } break; case 'r': /* DECSTBM: set scroll margins */ compatibility(VT100); if (term->esc_nargs <= 2) { int top, bot; top = def(term->esc_args[0], 1) - 1; bot = (term->esc_nargs <= 1 || term->esc_args[1] == 0 ? term->rows : def(term->esc_args[1], term->rows)) - 1; if (bot >= term->rows) bot = term->rows - 1; /* VTTEST Bug 9 - if region is less than 2 lines * don't change region. */ if (bot - top > 0) { term->marg_t = top; term->marg_b = bot; term->curs.x = 0; /* * I used to think the cursor should be * placed at the top of the newly marginned * area. Apparently not: VMS TPU falls over * if so. * * Well actually it should for * Origin mode - RDB */ term->curs.y = (term->dec_om ? term->marg_t : 0); seen_disp_event(term); } } break; case 'm': /* SGR: set graphics rendition */ { /* * A VT100 without the AVO only had one * attribute, either underline or * reverse video depending on the * cursor type, this was selected by * CSI 7m. * * case 2: * This is sometimes DIM, eg on the * GIGI and Linux * case 8: * This is sometimes INVIS various ANSI. * case 21: * This like 22 disables BOLD, DIM and INVIS * * The ANSI colours appear on any * terminal that has colour (obviously) * but the interaction between sgr0 and * the colours varies but is usually * related to the background colour * erase item. The interaction between * colour attributes and the mono ones * is also very implementation * dependent. * * The 39 and 49 attributes are likely * to be unimplemented. */ int i; for (i = 0; i < term->esc_nargs; i++) { switch (def(term->esc_args[i], 0)) { case 0: /* restore defaults */ term->curr_attr = term->default_attr; break; case 1: /* enable bold */ compatibility(VT100AVO); term->curr_attr |= ATTR_BOLD; break; case 21: /* (enable double underline) */ compatibility(OTHER); case 4: /* enable underline */ compatibility(VT100AVO); term->curr_attr |= ATTR_UNDER; break; case 5: /* enable blink */ compatibility(VT100AVO); term->curr_attr |= ATTR_BLINK; break; case 6: /* SCO light bkgrd */ compatibility(SCOANSI); term->blink_is_real = FALSE; term->curr_attr |= ATTR_BLINK; term_schedule_tblink(term); break; case 7: /* enable reverse video */ term->curr_attr |= ATTR_REVERSE; break; case 10: /* SCO acs off */ compatibility(SCOANSI); if (term->no_remote_charset) break; term->sco_acs = 0; break; case 11: /* SCO acs on */ compatibility(SCOANSI); if (term->nono_remote_resize) request_resize(term->frontend, def(term->esc_args[2], term->conf_width), def(term->esc_args[1], term->conf_remote_qtitle_action != TITLE_NONE) { if(term->remote_qtitle_action != TITLE_NONE) { if(term->onf_no_remote_resize) request_resize(term->frontend, def(term->esc_args[0], term->conf_width), bidi || !term->bidi && term->blinkpc, blink_is_real, tblinker, * curs.y, curs.x, cblinker, no_mouse_rep && !(term->funky_type == FUNKY_VT400 || ((term->funky_type == FUNKY_LINUX || term->funky_type == FUNKY_TILDE) && term->app_keypad_keys && !term->bksp_is_delete ? "^?" : "^H"; } /* FIXME: perhaps we should set ONLCR based on Node-path: putty/terminal.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 600ef7790e3b82de55f0a6119c348cbc Text-delta-base-sha1: bca5b5bc89823ab429a21e3b706f6a763bdb7075 Text-content-length: 1388 Text-content-md5: 98503234d32c9b90de059ea2633d4117 Text-content-sha1: d1e15e4086be43a49842a36306b42365f91a4647 Content-length: 1388 SVN��R�M� ��M+:�\vcopy of a Conf here, not merely a pointer * to it. That way, when we're passed a new one for * reconfiguration, we can check the differences and adjust the * _current_ setting of (e.g.) auto wrap mode rather than only * the default. */ Conf *conf /* * We copy a bunch of stuff out of the Conf structure into local * fields in the Terminal structure, to avoid the repeated * tree234 lookups which would be involved in fetching them from * the former every time. */ int ansi_colour; char *answerback; int answerbacklen; int arabicshaping; int beep; int bellovl; int bellovl_n; int bellovl_s; int bellovl_t; int bidi; int bksp_is_delete; int blink_cur; int blinktext; int cjk_ambig_wide; int conf_height; int conf_width; int crhaslf; int erase_to_scrollback; int funky_type; int lfhascr; int logflush; int logtype; int mouse_override; int nethack_keypad; int no_alt_screen; int no_applic_c; int no_applic_k; int no_dbackspace; int no_mouse_rep; int no_remote_charset; int no_remote_resize; int no_remote_wintitle; int rawcnp; int rect_select; int remote_qtitle_action; int rxvt_homeend; int scroll_on_disp; int scroll_on_key; int xterm_256_colour Node-path: putty/testback.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48c85ae8cb51288fbf23506db5368a10 Text-delta-base-sha1: fc501783926a4ef0faf37ab6266bf28cf4a07519 Text-content-length: 65 Text-content-md5: ac350c79231496dba01cc8aa147ab26e Text-content-sha1: 0dd6c361097527155fe566c9c81c28458f4712ae Content-length: 65 SVN��4+$�"��_$��+�;J�f �;y *conf *conf *conf Node-path: putty/unix/gtkcfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0ccb16331431ceaafb3462c6a39c9ff5 Text-delta-base-sha1: 89365b7ae58dec045b5d56b449137527206a905c Text-content-length: 526 Text-content-md5: 986643d1c6c68b4db1fbc469260bb43d Text-content-sha1: e5fa1f7e706b39df8cfe3613e98adaade8f4d286 Content-length: 526 SVN��d':H�e�A�'4� u�V1�>:�U+�a7�&R�yD�]zLconf_checkbox_handler, I(CONF_scrollbar_on_leftCONF_scrollbarconf_fontsel_handler, I(CONF_fontconf_fontsel_handler, I(CONF_widefontconf_fontsel_handler, I(CONF_boldfontconf_fontsel_handler, I(CONF_wideboldfontconf_checkbox_handler, I(CONF_shadowboldconf_editbox_handler, I(CONF_shadowboldoffsetconf_checkbox_handler, I(CONF_utf8_overrideconf_editbox_handler, I(CONF_winclass), I(1)); } } Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d88ca9e17639d9cf52003ef47d6ed58e Text-delta-base-sha1: 782317401bc2535be77f522281d44afd79bdeb2e Text-content-length: 831 Text-content-md5: 3dc14bc7596ba562232feb41c0ad996e Text-content-sha1: 55938fcffaf2e068e27ac726febff38ef5c86380 Content-length: 831 SVN����Bb�4�5�`r�Y|�X4�[1�>�H�b�6a�gX the * Conf structure, which is precisely where our `text' pointer * is probably pointing, so the second editing operation will * insert that instead of the string wechar *dlg_editbox_getreturn dupstr(gtk_combo_box_get_active_text(GTK_COMBO_BOX(uc->combo))); #else return dupstr(gtk_entry_get_text (GTK_ENTRY(gtk_bin_get_child(GTK_BIN(uc->combo))))); #endif } #endif if (uc->entry) { return dupstr(gtk_entry_get_text(GTK_ENTRY(uc->entry))) *conf, protocoprotocol = conf_get_int(conf, CONF_protocol); setup_config_box(ctrlbox, midsession, protocol, protcfginfo); unix_setup_config_box(ctrlbox, midsession, onfoy", GTK_SIGNAL_FUNC(window_destroy), NULL); gtk_signal_connect(GTK_OBJECT(�C��CX Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ed0edb0bf2ea68415e61142043862d5 Text-delta-base-sha1: 0e62375e2368f8defbeadaffa2af51ed315e2b76 Text-content-length: 15823 Text-content-md5: 4a46fc4517ddf3f2feb77cb68e50ba3c Text-content-sha1: d11a08f17bda4451d8a0e53322b861d16a6d8255 Content-length: 15823 SVN����^Q�|��Y0�>g�6+�?c�b9�s2�<<f�^n&�(5V�tf�nm�_�6x�rI�NV�D<�m�� '�v:�H:�E �[�+i�H�6_�6�[t�bt�v�wf�_B�(7�p#�Lo�Sr*�m#�3)g�^~�A@y�$=�et�?l�r/�T%�k}� �_�G-=�)A�*�&_ �^!��8�G�4M�hDE�8y �M�n�)h�R7�Td�r�Y)A�2~W�G �2i� �h,n�]o�r'L�ry�H~R�\z�w5�1?B�ykA�X-�;� �vn�~B�^&� ��z6V�[e#�X �7c�al�qb�P�.2)�%?8�LW�Q �s� �%V�%�Smv� 3�Gl�J<b�]|�ig:�c�5 � EH�:c�'�Ce�Xt�[t#�o;�E�Yo�Z[*wintitle; char *icontitle *conf /* Cached things out of conf that we refer to a lot */ int bold_colour; int window_border; int cursor_type; }; static void cache_conf_values(struct gui_data *inst) { inst->bold_colour = conf_get_int(inst->conf, CONF_bold_colour); inst->window_border = conf_get_int(inst->conf, CONF_window_border); inst->cursor_type = conf_get_int(inst->conf, CONF_cursor_type); }conf_get_int(inst->conf, CONF_close_on_exit)conf_get_int(inst->conf, CONF_warn_on_close)conf_get_int(inst->conf, CONF_hide_mouseptr)width * inst->font_width + 2*inst->window_border, inst->height * inst->font_height + 2*inst->window_border) / inst->font_width; h = (event->height - 2*inst->window_border) / inst->font_height; if (w != inst->width || h != inst->height) { inst->width = w; inst->height = h; conf_set_int(inst->conf, CONF_width, inst->width); conf_set_int(inst->conf, CONF_height, inst->height)w * inst->font_width + 2*inst->window_border), (h * inst->font_height + 2*inst->conf_get_int(inst->conf, CONF_savelines)conf_get_int(inst->conf, CONF_bksp_is_delete) ? conf_get_int(inst->conf, CONF_bksp_is_delete) ? conf_get_int(inst->conf, CONF_nethack_keypad) !conf_get_int(inst->conf, CONF_no_applic_k)conf_get_int(inst->conf, CONF_funky_type)int funky_type = conf_get_int(inst->conf, CONF_funky_type)(code == 1 || code == 4) && conf_get_int(inst->conf, CONF_rxvt_homeendshift && conf_get_int(inst->conf, CONF_mouse_override)window_border) / inst->font_width; y = (ey - inst->window_border) / inst->font_width; y = (event->y - inst->, close_on_exitclose_on_exit = conf_get_int(inst->conf, CONF_close_on_exit); if (close_on_exit == FORCE_ON || (conf_get_int(inst->conf, CONF_no_mouse_rep)window_border; area_y = inst->font_height * h + 2*inst->onf conf_get_int_int(inst->conf, CONF_colours, i*3+0) * 0x0101; inst->cols[ww[i]].green = conf_get_int_int(inst->conf, CONF_colours, i*3+1) * 0x0101; inst->cols[ww[i]].blue = conf_get_int_int(inst->conf, CONF_colours, i*3+2) conf_get_int_int(inst->conf, CONF_colours, i*3+0), conf_get_int_int(inst->conf, CONF_colours, i*3+1), conf_get_int_int(inst->conf, CONF_colours, i*3+2)conf_get_int(inst->conf, CONF_win_name_always)free(inst->wintitle); inst->wintitle = dupstr(title); set_window_titles(inst); } void set_iconfree(inst->icontitle); inst->icontitle = dupstr(title); set_window_titles(inst); } void set_title_and_icon(void *frontend, char *title, char *iconsfree(inst->wintitle); inst->wintitle = dupstr(title); sfree(inst->icontitle); inst->icontitle = dupstr(icon)conf_get_int(inst->conf, CONF_scrollbar)conf_get_int(inst->conf, CONF_scrollbar)window_border; r.y = y*inst->font_height+inst->window_border, y*inst->font_height+inst->window_border, y*inst->font_height+inst->window_border, y*inst->font_height + uheight + inst->window_border, (x+len)*widefactor*inst->font_width-1+inst->window_border, y*inst->font_height + uheight + inst->window_border + 2*i, y*inst->font_height+inst->window_border, x*inst->font_width+inst->window_border + 2*i+1, y*inst->font_height+inst->window_border, y*inst->font_height+inst->window_border+dt*i+db, x*inst->font_width+inst->window_border, y*inst->font_height+inst->window_border, y*inst->font_height+inst->window_border, x*inst->font_width+inst->window_border, y*inst->font_height+inst->window_border, y*inst->font_height+inst->window_border; starty = y * inst->font_height + inst->window_border + xadjust; starty = y * inst->font_height + inst->window_border, y*inst->font_height+inst->window_border, x*inst->font_width+inst->window_border, y*inst->font_height+inst-> *confonfFontSpec fs; EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(fs.name, val, sizeof(fs.name)); fs.name[sizeof(fs.name)-1] = '\0'; conf_set_fontspec(conf, CONF_font, &fs); } else if (!strcmp(p, "-fb")) { FontSpec fs; EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(fs.name, val, sizeof(fs.name)); fs.name[sizeof(fs.name)-1] = '\0'; conf_set_fontspec(conf, CONF_boldfont, &fs); } else if (!strcmp(p, "-fw")) { FontSpec fs; EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(fs.name, val, sizeof(fs.name)); fs.name[sizeof(fs.name)-1] = '\0'; conf_set_fontspec(conf, CONF_widefont, &fs); } else if (!strcmp(p, "-fwb")) { FontSpec fs; EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(fs.name, val, sizeof(fs.name)); fs.name[sizeof(fs.name)-1] = '\0'; conf_set_fontspec(conf, CONF_wideboldfont, &fs)conf_set_str(conf, CONF_line_codepage, val)onf_set_int(conf, CONF_width, w); if (flags & HeightValue) conf_set_int(conf, CONF_height, h)onf_set_int(conf, CONF_savelines, atoi(val)onf_set_int_int(conf, CONF_colours, index*3+0, col.red / 256); conf_set_int_int(conf, CONF_colours, index*3+1,col.green/ 256); conf_set_int_int(conf, CONF_colours, index*3+2, col.blue/ 256)conf_set_str(conf, CONF_wintitle, val); } else if (!strcmp(p, "-log")) { Filename fn; EXPECTS_ARG; SECOND_PASS_ONLY; strncpy(fn.path, val, sizeof(fn.path)); fn.path[sizeof(fn.path)-1] = '\0'; conf_set_filename(conf, CONF_logfilename, &fn); conf_set_int(conf, CONF_logtype, LGTYP_DEBUG); } else if (!strcmp(p, "-ut-") || !strcmp(p, "+ut")) { SECOND_PASS_ONLY; conf_set_int(conf, CONF_stamp_utmp, 0); } else if (!strcmp(p, "-ut")) { SECOND_PASS_ONLY; conf_set_int(conf, CONF_stamp_utmp, 1); } else if (!strcmp(p, "-ls-") || !strcmp(p, "+ls")) { SECOND_PASS_ONLY; conf_set_int(conf, CONF_login_shell, 0); } else if (!strcmp(p, "-ls")) { SECOND_PASS_ONLY; conf_set_int(conf, CONF_login_shell, 1); } else if (!strcmp(p, "-nethack")) { SECOND_PASS_ONLY; conf_set_int(conf, CONF_nethack_keypad, 1); } else if (!strcmp(p, "-sb-") || !strcmp(p, "+sb")) { SECOND_PASS_ONLY; conf_set_int(conf, CONF_scrollbar, 0); } else if (!strcmp(p, "-sb")) { SECOND_PASS_ONLY; conf_set_int(conf, CONF_scrollbar, 1)onfnt shadowbold = conf_get_int(inst->conf, CONF_shadowbold); int shadowboldoffset = conf_get_int(inst->conf, CONF_shadowboldoffset); FontSpec *fs; fs = conf_get_fontspec(inst->conf, CONF_font); inst->fonts[0] = unifont_create(inst->area, fs->name, FALSE, FALSE, shadowboldoffset, fs->name); exit(1); } fs = conf_get_fontspec(inst->conf, CONF_boldfont); if (shadowbold || !fs->fs->name, FALSE, TRUE, shadowboldoffset, fs->name); exit(1); } } fs = conf_get_fontspec(inst->conf, CONF_widefont); if (fs->name[0]) { inst->fonts[2] = unifont_create(inst->area, fs->name, TRUE, FALSE, shadowboldoffset, fs->fs = conf_get_fontspec(inst->conf, CONF_wideboldfont); if (shadowbold || !fs-> fs->name, TRUE, TRUE, shadowboldoffset, fs-> conf_get_str(inst->conf, CONF_line_codepage), conf_get_int(inst->conf, CONF_utf8_override), inst->fonts[0]->public_charset, conf_get_int(inst->conf, CONF_vtmode)window_border; geom.min_height = inst->font_height + 2*inst->window_border; geom.base_height = 2*inst->onf *oldconf, *newconf; int i, joldconf = inst->conf; newconf = conf_copy(inst->conf); if (do_config_box(title, newconf, 1, inst->back?inst->back->cfg_info(inst->backhandle):0)) { inst->conf = newconf;inst->conf ldisc_configure(inst->ldisc, inst->conf);inst->confinst->conf); cache_conf_values(inst); /* * Just setting inst->conf have * to the new default, on the assumption that the user is * most likely to want an immediate update. */ for (i = 0; i < NCFGCOLOURS; i++) { for (j = 0; j < 3; j++) if (conf_get_int_int(oldconf, CONF_colours, i*3+j) != conf_get_int_int(newconf, CONF_colours, i*3+j)) break; if (j < 3) { real_palette_set(inst, ww[i], conf_get_int_int(newconf,CONF_colours,i*3+0), conf_get_int_int(newconf,CONF_colours,i*3+1), conf_get_int_int(newconf,CONF_colours,i*3+2)conf_get_int(oldconf, CONF_scrollbar) != conf_get_int(newconf, CONF_scrollbar)) { if (conf_get_int(newconf, CONF_scrollbar)conf_get_int(oldconf, CONF_scrollbar_on_left) != conf_get_int(newconf, CONF_scrollbar_on_left)onf_get_int(newconf, CONF_scrollbar_on_left) conf_get_str(oldconf, CONF_wintitle), conf_get_str(newconf, CONF_wintitle))) set_title(inst, conf_get_str(oldconf, CONF_wintitle)conf_get_fontspec(oldconf, CONF_font)->name, conf_get_fontspec(newconf, CONF_font)->name) || strcmp(conf_get_fontspec(oldconf, CONF_boldfont)->name, conf_get_fontspec(newconf, CONF_boldfont)->name) || strcmp(conf_get_fontspec(oldconf, CONF_widefont)->name, conf_get_fontspec(newconf, CONF_widefont)->name) || strcmp(conf_get_fontspec(oldconf, CONF_wideboldfont)->name, conf_get_fontspec(newconf, CONF_wideboldfont)->name) || strcmp(conf_get_str(oldconf, CONF_line_codepage), conf_get_str(newconf, CONF_line_codepage)) || conf_get_int(oldconf, CONF_vtmode) != conf_get_int(newconf, CONF_vtmode) || conf_get_int(oldconf, CONF_shadowbold) != conf_get_int(newconf, CONF_shadowbold) || conf_get_int(oldconf, CONF_shadowboldoffset) != conf_get_int(newconf, CONF_shadowboldoffset)conf_get_int(oldconf, CONF_width) != conf_get_int(newconf, CONF_width) || conf_get_int(oldconf, CONF_height) != conf_get_int(newconf, CONF_height) || conf_get_int(oldconf, CONF_window_border) != conf_get_int(newconf, CONF_window_border) || need_size) { set_geom_hints(inst); request_resize(inst, conf_get_int(newconf, CONF_width), conf_get_int(newconf, CONF_height)conf_get_int(oldconf, CONF_savelines) != conf_get_int(newconf, CONF_savelines)) term_size(inst->term, inst->term->rows, inst->term->cols, conf_get_int(newconf, CONF_savelines) conf_free(oldconf); } else { conf_free(newconfonfersizeersize = conf_serialised_size(inst->confconf_serialise(inst->conf, data); if (use_pty_argv && pty_argv) { int p = sersize *conf, char *arg) { int fd, i, ret, size, size_usedsize_used = conf_deserialise(conf, data, size); if (use_pty_argv && size > size_used) { int n = 0; i = size_used_used *conf); char *realhost; const char *error; char *s; inst->back = select_backend(inst->confinst->conf, conf_get_str(inst->conf, CONF_host), conf_get_int(inst->conf, CONF_port), &realhost, conf_get_int(inst->conf, CONF_tcp_nodelay), conf_get_int(inst->conf, CONF_tcp_keepalives)conf_get_str(inst->conf, CONF_host)s = conf_get_str(inst->conf, CONF_wintitle); if (s[0]) { set_title_and_icon(inst, s, s); } else { char *title = make_default_wintitle(realhost); set_title_and_icon(inst, titleinst->conf *conf inst->conf = conf_new(); inst->wintitle = inst->icontitle = NULLinst->confinst->conf)) exit(1); /* pre-defaults pass to get -class */ do_defaults(NULL, inst->conf); if (do_cmdline(argc, argv, 1, &allow_launch, inst, inst->conf)) exit(1); /* post-defaults, do everything */ cmdline_run_saved(inst->conf); if (loaded_session) allow_launch = TRUE; if ((!allow_launch || !conf_launchable(inst->conf)) && !cfgbox(inst->conf{ const char *winclass = conf_get_str(inst->conf, CONF_winclass); if (*winclass) winclass, winclass); }conf_get_int(inst->conf, CONF_width); inst->height = conf_get_int(inst->conf, CONF_height); cache_conf_values(inst); gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area), inst->font_width * inst->width + 2*inst->window_border, inst->font_height * inst->height + 2*inst->conf_get_int(inst->conf, CONF_scrollbar_on_left)conf_get_int(inst->conf, CONF_scrollbar_on_left)conf_get_int(inst->conf, CONF_scrollbar)��ts`��O�j_D�y if (inst->gravity & 2) y += gdk_screen_height() - req.height; gtk_window_set_position(GTK_WINDOW(inst->window), GTK_WIN_POS_NONE); gtk_widget_set_uposition(GTK_WIDGET(inst->window), x, y); } gtk_signal_connect(GTK_OBJECT(inst->window), "destroy", GTK_SIGNAL_FUNC(destroy), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "delete_event", GTK_SIGNAL_FUNC(delete_window), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "key_press_event", GTK_SIGNAL_FUNC(key_event), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "key_release_event", GTK_SIGNAL_FUNC(key_event), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "focus_in_event", GTK_SIGNAL_FUNC(focus_event), inst); gtk_signal_connect(GTK_OBJECT(inst->window), "focus_out_event", GTK_SIGNAL_FUNC(focus_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "configure_event", GTK_SIGNAL_FUNC(configure_area), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "expose_event", GTK_SIGNAL_FUNC(expose_area), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "button_press_event", GTK_SIGNAL_FUNC(button_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "button_release_event", GTK_SIGNAL_FUNC(button_event), inst); #if GTK_CHECK_VERSION(2,0,0) gtk_signal_connect(GTK_OBJECT(inst->area), "scroll_event", GTK_SIGNAL_FUNC(scroll_event), inst); #endif gtk_signal_connect(GTK_OBJECT(inst->area), "motion_notify_event", GTK_SIGNAL_FUNC(motion_event), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_received", GTK_SIGNAL_FUNC(selection_received), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_get", GTK_SIGNAL_FUNC(selection_get), inst); gtk_signal_connect(GTK_OBJECT(inst->area), "selection_clear_event", GTK_SIGNAL_FUNC(selection_clear), inst); if (conf_get_int(inst->conf, CONF_scrollbar)) gtk_signal_connect(GTK_OBJECT(inst->sbar_adjust), "value_changed", GTK_SIGNAL_FUNC(scrollbar_moved), inst); gtk_widget_add_events(GTK_WIDGET(inst->area), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK); { extern const char *const *const main_icon[]; extern const int n_main_icon; set_window_icon(inst->window, main_icon, n_main_icon); } gtk_widget_show(inst->window); set_window_background(inst); /* * Set up the Ctrl+rightclick context menu. */ { GtkWidget *menuitem; char *s; extern consinst->conf, &inst->ucsdata, inst); inst->logctx = log_init(inst, inst->confheight, inst->width, conf_get_int(inst->conf, CONF_savelines) Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7bbc709341ec910875c53e8e272d373b Text-delta-base-sha1: d6b616a258d8826281ce0e643174da2540ac6b28 Text-content-length: 39 Text-content-md5: 135fad8c846c8126e8f59eadd472f530 Text-content-sha1: f6e79a2ffb15ecd992f21268cb70ebb843efde68 Content-length: 39 SVN�� �h��(o�y *conf *conf Node-path: putty/unix/ux_x11.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3cb8f269dc837972479b7e874546339b Text-delta-base-sha1: 75f39bcbc3ed1275b4944bb183a38b59dc0da136 Text-content-length: 31 Text-content-md5: 22fd44cce6f49ac8b7791ca3fe2a2d0d Text-content-sha1: 95e09a37da55af045dc35bef1369b6c8d20327df Content-length: 31 SVN��~ ���fConf *conf Node-path: putty/unix/uxcfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fb244ae95c6869cff5813f94fd6ca081 Text-delta-base-sha1: c6202224510227b609ffa6270ef55ca801efa3cb Text-content-length: 421 Text-content-md5: 5fc7025aa3b0088e7c4a533cc5cc4f02 Text-content-sha1: e0507caf1ae6eae78e3a21f9eace4917ee902acb Content-length: 421 SVN��yW��N��,W�hIB�u structure contains two Unix-specific elements which * are not configured in here: stamp_utmp and login_shell. This * is because pterm does not put up a configuration box right at * the start, which is the only time when these elements would *CONF_proxy_type) { assert(c->generic.handler == conf_ CONF_proxy_telnet_command) { assert(c->generic.handler == conf_ Node-path: putty/unix/uxgss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 158c67e673abfe51b016501400243009 Text-delta-base-sha1: 8eeb370940781f02af25a955f038547b78c83f52 Text-content-length: 205 Text-content-md5: b30591a4916d69865e2750f8b6a1929e Text-content-sha1: bc45a9519fa089ffc28190aa6b807348264c92da Content-length: 205 SVN��BS$�i��f� t�e(�$Conf *conf) { void *gsslib; char *gsspathgsspath = conf_get_filename(conf, CONF_ssh_gss_custom)->path; if (*gsspath && (gsslib = dlopen(gssgssConf *conf Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 13d63f076f7102bd906b318e849a39b8 Text-delta-base-sha1: 71945d3a1c1558065cc3296db55011d7aef2336c Text-content-length: 3034 Text-content-md5: d638ec4c39a2655eefe579107685edc7 Text-content-sha1: 5181366eec746120a6502d16f802635939e89008 Content-length: 3034 SVN��o)0�)��//6�]S�w�W�Xr�2\�'~��:M�zTa�z!D�P!�e^q�m_�> �0S�^�L;� q�4�U *confconf = conf_new(); do_defaults(NULL, conf); loaded_session = FALSE; default_protocol = conf_get_int(conf, CONF_protocol); default_port = conf_get_int(conf, CONF_port)b->protocol; default_port = b->default_port; conf_set_int(conf, CONF_protocol, default_protocol); conf_set_int(conf, CONF_port, default_port)confonfonf_launchable(confonf_set_int(conf, CONF_protocol, PROT_TELNET)onf_set_int(conf, CONF_port, atoi(p)); else conf_set_int(conf, CONF_port, -1); conf_set_str(conf, CONF_host, q)b->protocol; conf_set_int(conf, CONF_protocol, default_protocol) *conf2 = conf_new(); do_defaults(host, conf2); if (loaded_session || !conf_launchable(confconf_set_str(conf, CONF_host, host); conf_set_int(conf, CONF_port, default_port); got_host = TRUE; } else { conf_copy_into(conf, conf2); loaded_session = TRUE; } conf_free(conf2); } if (user) { /* Patch in specified username. */ conf_set_str(conf, CONF_username, user)onf_set_str(conf, CONF_remote_cmd, command); conf_set_str(conf, CONF_remote_cmd2, ""); conf_set_int(conf, CONF_nopty, TRUE); /* command => no ttyonf_launchable(conf) || !(got_host || loaded_session)) { usage(); } /* * Muck about with the hostname in various ways. */ { char *hostbuf = dupstr(conf_get_str(conf, CONF_host)); char *host = hostbuf; char *p, *q; /* * Trim leading whitespace. */ host += strspn(host, " \t"); /* * See if host is of the form user@host, and separate out * the username if so. */ if (host[0] != '\0') { char *atsign = strrchr(host, '@'); if (atsign) { *atsign = '\0'; conf_set_str(conf, CONF_username, host); host = atsign + 1; } } /* * Trim off a colon suffix if it's there. */ host[strcspn(host, ":")] = '\0'; /* * Remove any remaining whitespace. */ p = hostbuf; q = host; while (*q) { if (*q != ' ' && *q != '\t') *p++ = *q; q++; } *p = '\0'; conf_set_str(conf, CONF_host, hostbuf); sfree(hostbuf);conf); /* * Apply subsystem status. */ if (use_subsystem) conf_set_int(conf, CONF_ssh_subsys, TRUE); if (!*conf_get_str(conf, CONF_remote_cmd) && !*conf_get_str(conf, CONF_remote_cmd2) && !*conf_get_str(conf, CONF_ssh_nc_host)onf_get_int(conf, CONF_protocol)onf_set_int(conf, CONF_port, portnumber)onf_get_int(conf, CONF_protocol) == PROT_SSH && !conf_get_int(conf, CONF_x11_forward) && !conf_get_int(conf, CONF_agentfwd) && !conf_get_str_nthstrkey(conf, CONF_portfwd, 0)) conf_set_int(conf, CONF_ssh_simple, TRUE); confonf_get_int(conf, CONF_tcp_nodelay) && isatty(0); error = back->init(NULL, &backhandle, conf, conf_get_str(conf, CONF_host), conf_get_int(conf, CONF_port), &realhost, nodelay, conf_get_int(conf, CONF_tcp_keepalives)conf Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fa503cc7309a6440bb253f6752dbbbfc Text-delta-base-sha1: 51eaf5b8c46bd09aaddd13796d3a187b128af972 Text-content-length: 79 Text-content-md5: 6da35f2221e8e0ac28bf52ad8d095365 Text-content-sha1: 45842731ae3ae22a037ee548786c921fce11e743 Content-length: 79 SVN��(/�E��V�K�NLConf *confonf_get_int(conf, CONF_proxy_type)onf Node-path: putty/unix/uxpterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 72831b69597d5f7c7df9d7a848ea6262 Text-delta-base-sha1: 9a0d963770053b5ee5f3c606751a42d732fa2be0 Text-content-length: 133 Text-content-md5: 5359fa8b280cef2277b7aef87690f16f Text-content-sha1: 9c4ab8d2ccca6bd43d83390c967142dff0a77851 Content-length: 133 SVN��oe�<��5y�m?�<3 *conf) { return &pty_backend; } int cfgbox(Conf *confonf_set_int(conf, CONF_protocol, -1) *conf Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7d182aa6b3fb58570d349824a47401db Text-delta-base-sha1: ce2a2f8e82c21aae526a73341a6f4bb4b75dc8e2 Text-content-length: 763 Text-content-md5: 0edbf37ffcaea638a1aec26c7c2a1029 Text-content-sha1: 116018d6b13920ad02f865419e6c914c98138445 Content-length: 763 SVN��OIZ�8��/>�6kf�+[� ��F�s�8 K�xO�lV�tI�ej *confint close_on_exit; close_on_exit = conf_get_int(pty->conf, CONF_close_on_exit); if (close_on_exit == FORCE_OFF || ( *confonf = conf_copy(conf); pty->term_width = conf_get_int(conf, CONF_width); pty->term_height = conf_get_int(conf, CONF_height)onf_get_int(conf, CONF_bksp_is_delete) onf_get_int(conf, CONF_stamp_utmp) conf_get_str(conf, CONF_termtype)key, *val; for (val = conf_get_str_strs(conf, CONF_environmt, NULL, &key); val != NULL; val = conf_get_str_strs(conf, CONF_environmt, key, &key)) { char *varval = dupcat(key, "=", val, NULLonf_get_int(conf, CONF_login_shell) *confconf_copy_into(pty->conf, conf); Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0e2e8bcdef280026f222dffbffa0f0a1 Text-delta-base-sha1: ea124347808864e4cc9453e14c683c08a54eb978 Text-content-length: 528 Text-content-md5: baf226927c3b7f4add95d30f76e5a86d Text-content-sha1: 8c76ee84a29b8ad4b4748416b680af423415ab47 Content-length: 528 SVN��C,X�~�~�4i�t$�Q�+�{R�* *conf) { Backend *back = backend_from_proto(conf_get_int(conf, CONF_protocol)); assert(back != NULL); return back; } int cfgbox(Conf *conf) { char *title = dupcat(appname, " Configuration", NULL); int ret = do_config_box(title, conf *confonfonf_set_int(conf, CONF_protocol, PROT_TELNET)onf_set_int(conf, CONF_port, atoi(p)); else conf_set_int(conf, CONF_port, -1); conf_set_str(conf, CONF_host, q)conf_set_str(conf, CONF_host, q) Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f7cfc2b136376e354380c8c9d1549ce5 Text-delta-base-sha1: b1c084ea7953224342638c6a7430b762eba565db Text-content-length: 1039 Text-content-md5: 0db113058dd6b3acb67911db127054b9 Text-content-sha1: 3a373884a0693b7d7de132fad6926733d31c132c Content-length: 1039 SVN��|\V-�V�N�c{�G�6p��7#�>;���`(�/l�WZ�8�1K *conf) { struct termios options; int bflag, bval, speed, flow, parity speed = conf_get_int(conf, CONF_serspeed); #define SETBAUD(x) (bflag = B ## x, bval = x) #define CHECKBAUD(x) do { if (onf_get_int(conf, CONF_serdatabits) conf_get_int(conf, CONF_serdatabits)); logevent(serial->frontend, msg); sfree(msg); if (conf_get_int(conf, CONF_serstopbits)flow = conf_get_int(conf, CONF_serflow); if (flow == SER_FLOW_XONXOFF) { options.c_iflag |= IXON | IXOFF; str = "XON/XOFF"; } else if (parity = conf_get_int(conf, CONF_serparity); if (parity == SER_PAR_ODD) { options.c_cflag |= PARENB; options.c_cflag |= PARODD; str = "odd"; } else if ( *conf char *lineline = conf_get_str(conf, CONF_serline); { char *msg = dupprintf("Opening serial device %s", line); logevent(serial->frontend, msg); } serial->fd = open(onf); if (err) return err; *realhost = dupstr( *confonf Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef99af8ad1cfd1924e3e700a7fc76d09 Text-delta-base-sha1: 817dcc9b8a6f181741c33d8154e0ecc85d145a14 Text-content-length: 31 Text-content-md5: 9a0b0c6637beadcf5b7e45e9fd196b9e Text-content-sha1: 768e175fff292bc185d8ddf4d212df77d725e087 Content-length: 31 SVN��MF �d��XuConf *conf Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ada20c105e11c12421757b7c63ebcfdb Text-delta-base-sha1: 1d7127faf030df91b125a5946ee585abc3f2c868 Text-content-length: 825 Text-content-md5: eafb7a3de6cf069a1c02bc52f2e574e6 Text-content-sha1: 7bb6331f821cb6cff49aafad54b3be1974a59140 Content-length: 825 SVN��N �_��Cy�* G�y3�L return dupstr(val);char *tmp; if ((tmp = read_setting_s(handle, suffname)) != NULL) { strncpy(result->name, tmp, sizeof(result->name)-1); result->name[sizeof(result->name)-1] = '\0'; sfree(suffname); sfree(tmptmp = read_setting_s(handle, name); if (tmp && *tmp) { strcpy(result->name, "server:"); strncpy(result->name + 7, tmp, sizeof(result->name) - 8); result->name[sizeof(result->name)-1] = '\0'; sfree(tmp); return TRUE; } else { sfree(tmp); return FALSE; } } int read_setting_filename(void *handle, const char *name, Filename *result) { char *tmp = read_setting_s(handle, name); if (tmp) { strncpy(result->path, tmp, sizeof(result->path)-1); result->path[sizeof(result->path)-1] = '\0'; sfree(tmp); return TRUE; } else return FALSE Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 67333cf93f56817eaee957d4faea3463 Text-delta-base-sha1: de1765e1643007dafcd6ef92f818e71cb37c367b Text-content-length: 24 Text-content-md5: b773013f1a07a0517a2e93a70f99055a Text-content-sha1: 697c489aba4adc2e1857aaeb8a2033351e04a72c Content-length: 24 SVN��bc �:��&<onf Node-path: putty/windows/wincfg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d7dd636d55f807d5d4c68953be63cbc7 Text-delta-base-sha1: 1c4f7ecb5d29413334615128236cb04be7a0bb9d Text-content-length: 1551 Text-content-md5: b2c566a4b9ab15585668b0e17b90ba5d Text-content-sha1: 44386ef2407177be6d2fdd7c220e1c3111c44f9b Content-length: 1551 SVN��k���LL�2�h�i�$G�e$��I� ��O�u*�ia�y�>E�w8�Vt�g|3�h2>�rt�h,B�Cgconf_checkbox_handler, I(CONF_scrollbar_in_fullscreenCONF_scrollbarconf_checkbox_handler, I(CONF_compose_keyconf_checkbox_handler, I(CONF_ctrlaltkeysCONF_beep) { assert(c->generic.handler == conf_conf_filesel_handler, I(CONF_bell_wavefileconf_radiobutton_handler, I(CONF_beep_indconf_checkbox_handler, I(CONF_sunken_edgeconf_radiobutton_handler, I(CONF_font_qualityconf_checkbox_handler, I(CONF_xlat_capslockcyrCONF_vtmode) { assert(c->generic.handler == conf_conf_checkbox_handler, I(CONF_rtf_pasteconf_radiobutton_handler, I(CONF_mouse_is_xtermconf_checkbox_handler, I(CONF_try_palette)); ctrl_checkbox(s, "Use system colours", 's', HELPCTX(colours_system), conf_checkbox_handler, I(CONF_system_colourconf_radiobutton_handler, I(CONF_resize_actionconf_checkbox_handler, I(CONF_alt_f4conf_checkbox_handler, I(CONF_alt_space)); ctrl_checkbox(s, "System menu appears on ALT alone", 'l', HELPCTX(behaviour_altonly), conf_checkbox_handler, I(CONF_alt_onlyconf_checkbox_handler, I(CONF_alwaysontop)); ctrl_checkbox(s, "Full screen on Alt-Enter", 'f', HELPCTX(behaviour_altenter), conf_checkbox_handler, I(CONF_fullscreenonaltenterCONF_proxy_type) { assert(c->generic.handler == conf_ CONF_proxy_telnet_command) { assert(c->generic.handler == conf_conf_filesel_handler, I(CONF_xauthfile)); } } Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1d0127ee974df1f46434d971fe2386fb Text-delta-base-sha1: 13c09d21d71e4dccd2bf3f1d237d41272a904a83 Text-content-length: 932 Text-content-md5: 0525ef025c56740cffd1f98bbccb9abc Text-content-sha1: 76e5d6810b799bba167a3c2fe0df0abf6c928947 Content-length: 932 SVN��%#-i�f�� ?#�e*K�d7J�< �Cbchar *dlg_editbox_gechar *ret; int size; assert(c && c->ctrl->generic.type == CTRL_EDITBOX); size = 0; ret = NULL; do { size = size * 4 / 3 + 512; ret = sresize(ret, size, char); GetDlgItemText(dp->hwnd, c->base_id+1, ret, size); } while (!memchr(ret, '\0', size-1)); return ret *conf = (Conf *)dp->data; FontSpec *font; int quality; HFONT h *' * as dp->data. */ quality = conf_get_int(conf, CONF_font_quality); font = conf_get_fontspec(conf, CONF_font); hfont = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, FONT_QUALITY(quality), FIXED_PITCH | FF_DONTCARE, font->name); hdc = GetDC(NULL); if (font && hdc && SelectObject(hdc, hhfont) DeleteObject(h Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e01645632d58f987485d8a891038cbe Text-delta-base-sha1: aa1c742d263692018c73f8a942b5234a2666155c Text-content-length: 493 Text-content-md5: edbfee334ac5c7f39dee1159d8f4e70b Text-content-sha1: 7aff43f137fbc34f755aa77114b768e59b8a99e6 Content-length: 493 SVN��w-2���8 �\�t�y\� W�` *confconf *backup_conf; int ret, protocol; backup_conf = conf_copy(conf); ctrlbox = ctrl_new_box(); protocol = conf_get_int(conf, CONF_protocol); setup_config_box(ctrlbox, TRUE, protocol, protcfginfo); win_setup_config_box(ctrlbox, &dp.hwnd, has_help(), TRUE, conf base); winctrl_cleanup(&ctrls_panel); dp_cleanup(&dp); if (!ret) conf_copy_into(conf, backup_conf); conf_free(backup_conf); Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 512f7fb0acab6b996ff1f638f6833427 Text-delta-base-sha1: 78ececb9f44dc4a64e11dd45e18f09df84063305 Text-content-length: 16647 Text-content-md5: 96de4e95110594d270a7e55e8bb4a1c5 Text-content-sha1: 445b1446f2bdc98811f4bf067a707bcccd174b37 Content-length: 16647 SVN����k�4��m6l�}N�VI�2/�m�d&� �GE�X �2�W�Lp�@�u|�6��y '�JJ�l�m*�y]f�;o�a:b�]b�DJ�:�fg�^O1�g�v�\N�)e�8�'MR�;c�'�/'�IS�)A�ts�/`�"x�zg�_>� �iLR��OX�3�j;�`d�$;�l�|��3�[�{�{qa�J7#�gdH�3?� p�n4A�N+&�~H�vQ#�M�U%�~� 6�y?�c:&�Zn��n--�'�|D�|D�X{�xP�|\r�V{k� �o�]2#�;y�p3�q7�,F�~A�rC�G; �e2�qd�a_�k��]o�%P2�i�xA�H6��X�<donf *conf; /* exported to windlg.c */ static void conf_cache_data(void); int cursor_type; int vtmode;onf_get_int(conf, CONF_protocol)conf, conf_get_str(conf, CONF_host), conf_get_int(conf, CONF_port), &realhost, conf_get_int(conf, CONF_tcp_nodelay), conf_get_int(conf, CONF_tcp_keepalives)onf_dest(conftitle = conf_get_str(conf, CONF_wintitle); if (!*title)confconf = conf_neonf_set_int(conf, CONF_logtype, LGTYP_NONE); do_defaults(NULL, confconf); if (!conf_launchable(confinterpret as a * serialised Conf. */ HANDLE filemap; void *cp; unsigned cpsize; if (sscanf(p + 1, "%p:%u", &filemap, &cpsize) == 1 && (cp = MapViewOfFile(filemap, FILE_MAP_READ, 0, 0, cpsize)) != NULL) { conf_deserialise(conf, cp, cpsize)confconfonf_set_int(conf, CONF_protocol, PROT_TELNET)onf_set_int(conf, CONF_port, atoi(p)); else conf_set_int(conf, CONF_port, -1); conf_set_str(conf, CONF_host, q)conf_set_str(conf, CONF_host, q)conf); if (loaded_session || got_host) allow_launch = TRUE; if ((!allow_launch || !conf_launchable(conf)) && !do_config()) { cleanup_exit(0); } /* * Muck about with the hostname in various ways. */ { char *hostbuf = dupstr(conf_get_str(conf, CONF_host)); char *host = hostbuf; char *p, *q; /* * Trim leading whitespace. */ host += strspn(host, " \t"); /* * See if host is of the form user@host, and separate * out the username if so. */ if (host[0] != '\0') { char *atsign = strrchr(host, '@'); if (atsign) { *atsign = '\0'; conf_set_str(conf, CONF_username, host); host = atsign + 1; } } /* * Trim off a colon suffix if it's there. */ host[strcspn(host, ":")] = '\0'; /* * Remove any remaining whitespace. */ p = hostbuf; q = host; while (*q) { if (*q != ' ' && *q != '\t') *p++ = *q; q++; } *p = '\0'; conf_set_str(conf, CONF_host, hostbuf); sfree(hostbuf)onf_cache_data(); confonf_get_int(conf, CONF_width); guess_height = extra_height + font_height*conf_get_int(conf, CONF_height)onf_get_int(conf, CONF_scrollbar)) winmode &= ~(WS_VSCROLL); if (conf_get_int(conf, CONF_resize_action) == RESIZE_DISABLED) winmode &= ~(WS_THICKFRAME | WS_MAXIMIZEBOX); if (conf_get_int(conf, CONF_alwaysontop)) exwinmode |= WS_EX_TOPMOST; if (conf_get_int(conf, CONF_sunken_edge)conf, &ucsdata, NULL); logctx = log_init(NULL, conf); term_provide_logctx(term, logctx); term_size(term, conf_get_int(conf, CONF_height), conf_get_int(conf, CONF_width), conf_get_int(conf, CONF_savelines)onf_get_int(conf, CONF_window_border)onf_get_int(conf, CONF_resize_action) == RESIZE_DISABLED) ? MF_GRAYED : MF_ENABLED, onf_get_int(conf, CONF_protocol)onf_get_int(conf, CONF_no_mouse_rep)onf_get_int(conf, CONF_close_on_exit)onfonf_get_int_int(conf, CONF_colours, i*3+0); defpal[w].rgbtGreen = conf_get_int_int(conf, CONF_colours, i*3+1); defpal[w].rgbtBlue = conf_get_int_int(conf, CONF_colours, i*3+2)onf_get_int(conf, CONF_system_colour)onf_get_int(conf, CONF_try_palette) && FontSpec *font; int fontsize[3]; int i; int quality; HDC hdc; int fw_dontcare, fw_bold; for (i = 0; i < FONT_MAXNO; i++) fonts[i] = NULL; bold_mode = conf_get_int(conf, CONF_bold_colour) ? BOLD_COLOURS : BOLD_FONT; und_mode = UND_FONT; font = conf_get_fontspec(conf, CONF_font); if (font->hdc = GetDC(hwnd); if (pick_height) font_height = pick_height; else { font_height = font-> quality = conf_get_int(conf, CONF_font_quality);quality, \ FIXED_PITCH | FF_DONTCARE, font->name) f(FONT_NORMAL, font->font->font->conf, &ucsdata); } static void another_font(int fontno) { int basefont; int fw_dontcare, fw_bold, quality; int c, u, w, x; char *s; FontSpec *fontfont = conf_get_fontspec(conf, CONF_font); if (font->font->charset; w = fw_dontcare; u = FALSE; s = font->quality = conf_get_int(conf, CONF_font_quality)onf_get_int(conf, CONF_resize_action) == RESIZE_TERM) return; } if (conf_get_int(conf, CONF_resize_action)onf_get_int(conf, CONF_savelines)); if (conf_get_int(conf, CONF_resize_action) != RESIZE_FONT && , resize_action, window_borderresize_action = conf_get_int(conf, CONF_resize_action); window_border = conf_get_int(conf, CONF_window_border); if (resize_action == RESIZE_DISABLED) resize_action != RESIZE_TERM) { if (font_width != win_width/term->cols || font_width * term->cols != win_width || onf_get_int(conf, CONF_savelines)resize_action == RESIZE_TERM && reinit<=0) || ( conf_get_int(conf, CONF_savelines)window_border*2)/term->cols || font_height != (win_height-window_border*2)/term->rows) { deinit_fonts(); init_fonts((win_width-window_border*2)/term->cols, (win_height- !(shift && conf_get_int(conf, CONF_mouse_override)onf_get_int(conf, CONF_mouse_is_xterm) == 1 ? MBT_PASTE : MBT_EXTEND; if (button == MBT_RIGHT) return conf_get_int(conf, CONF_mouse_is_xterm) == 1 ? onf_get_int(conf, CONF_hide_mouseptr)) show = 1; /* override if this feature disabled */, close_on_exit; if (!session_closed && (exitcode = back->exitcode(backhandle)) >= 0) { close_on_exit = conf_get_int(conf, CONF_close_on_exit); /* Abnormal exits will already have set session_closed and taken * appropriate action. */ if (close_on_exit == FORCE_ON || (void conf_cache_data(void) { /* Cache some items from conf to speed lookups in very hot code */ cursor_type = conf_get_int(conf, CONF_cursor_type); vtmode = conf_get_int(conf, CONF_vtmode) int resize_actionsession_closed || !conf_get_int(conf, CONF_warn_on_close)void *p; int size; size = conf_serialised_size(conf), NULL); if (filemap && filemap != INVALID_HANDLE_VALUE) { p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, size); if (p) { conf_serialise(conf, p); UnmapViewOfFile(p); } } inherit_handles = TRUE; sprintf(c, "putty &%p:%u", filemap, (unsigned)size *prev_conf/* * Copy the current window title into the stored * previous configuration, so that doing nothing to * the window title field in the config box doesn't * reset the title to its startup state. */ conf_set_str(conf, CONF_wintitle, window_name); prev_conf = conf_copy(conf)conf_cache_data(); resize_action = conf_get_int(conf, CONF_resize_action); (resize_action == RESIZE_DISABLED)) ShowWindow(hwnd, SW_RESTORE); } /* Pass new config data to the logging module */ log_reconfig(logctx, confldisc_configure(ldisc, conf);onfconf); /* Pass new config data to the back end */ if (back) back->reconfig(backhandle, conf); /* Screen size changed ? */ if (conf_get_int(conf, CONF_height) != conf_get_int(prev_conf, CONF_height) || conf_get_int(conf, CONF_width) != conf_get_int(prev_conf, CONF_width) || conf_get_int(conf, CONF_savelines) != conf_get_int(prev_conf, CONF_savelines) || resize_action == RESIZE_FONT || (resize_action == RESIZE_EITHER && IsZoomed(hwnd)) || resize_action == RESIZE_DISABLED) term_size(term, conf_get_int(conf, CONF_height), conf_get_int(conf, CONF_width), conf_get_int(conf, CONF_savelines)onf_get_int(conf, CONF_alwaysontop) != conf_get_int(prev_conf, CONF_alwaysontop)) { if (conf_get_int(conf, CONF_alwaysontop)onf_get_int(conf, CONF_sunken_edge)conf_get_int(conf, is_full_screen() ? CONF_scrollbar_in_fullscreen : CONF_scrollbar)) nflg |= WS_VSCROLL; else nflg &= ~WS_VSCROLL; if (onf_get_str(conf, CONF_wintitle)); if (IsIconic(hwnd)) { SetWindowText(hwnd, conf_get_int(conf, CONF_win_name_always) ? window_name : icon_name); } { FontSpec *font = conf_get_fontspec(conf, CONF_font); FontSpec *prev_font = conf_get_fontspec(prev_conf, CONF_font); if (!strcmp(font->name, prev_font->name) || !strcmp(conf_get_str(conf, CONF_line_codepage), conf_get_str(prev_conf, CONF_line_codepage)) || font->isbold != prev_font->isbold || font->height != prev_font->height || font->charset != prev_font->charset || conf_get_int(conf, CONF_font_quality) != conf_get_int(prev_conf, CONF_font_quality) || conf_get_int(conf, CONF_vtmode) != conf_get_int(prev_conf, CONF_vtmode) || conf_get_int(conf, CONF_bold_colour) != conf_get_int(prev_conf, CONF_bold_colour) || resize_action == RESIZE_DISABLED || resize_action == RESIZE_EITHER || resize_action != conf_get_int(prev_conf, CONF_resize_action)) init_lvl = 2; } conf_free(prev_conf (conf_get_int(conf, CONF_mouse_is_xterm)onf_get_int(conf, CONF_height), conf_get_int(conf, CONF_width), conf_get_int(conf, CONF_savelines) resize_action = conf_get_int(conf, CONF_resize_action); if (resize_action == RESIZE_TERM || (!need_backend_resize && resize_action == RESIZE_EITHER && (conf_get_int(conf, CONF_height) != term->rows || conf_get_int(conf, CONF_width) != term->cols */ conf_set_int(conf, CONF_height, term->rows); conf_set_int(conf, CONF_width, term->cols)window_border = conf_get_int(conf, CONF_window_border); int ex_width = extra_width + (window_border - offset_width) * 2; int ex_height = extra_height + ( resize_action = conf_get_int(conf, CONF_resize_action);onf_get_int(conf, CONF_win_name_always) ? int window_border = conf_get_int(conf, CONF_window_border)onf_get_int(conf, CONF_savelines)); } RESTORED && was_zoomed) { was_zoomed = 0; if (resize_action == RESIZE_TERM) { w = (width-onf_get_int(conf, CONF_savelines)); reset_window(2); } else if (resize_action == RESIZE_TERM || (onf_set_int(conf, CONF_height, h); conf_set_int(conf, CONF_height, w); } else { term_size(term, h, w, conf_get_int(conf, CONF_savelines)onf_get_int(conf, CONF_system_colour) shift_pressed && !(conf_get_int(conf, CONF_mouse_override)�~{U`� �r�I�lQb�J+�zyw�LER�.s�tuc�1�RZ�9�yU�RR.�p^�9_�3)�Y`S�y��Q.��lE�[3J�@?�A �P]�?]�3�7Nv�}H�]I�v{�|u�pu<�_�p�=i�$ �H;�@�hm�aoldpen); DeleteObject(oldpen); } else if ((attr & (TATTR_ACTCURS | TATTR_PASCURS)) && ctype != 0) { int startx, starty, dx, dy, length, i; if (ctype == 1) { startx = x; starty = y + descent; dx = 1; dy = 0; length = char_width; } else { int xadjust = 0; if (attr & TATTR_RIGHTCURS) xadjust = char_width - 1; startx = x + xadjust; starty = y; dx = 0; dy = 1; length = font_height; } if (attr & TATTR_ACTCURS) { HPEN oldpen; oldpen = SelectObject(hdc, CreatePen(PS_SOLID, 0, colours[261])); MoveToEx(hdc, startx, starty, NULL); LineTo(hdc, startx + dx * length, starty + dy * length); oldpen = SelectObject(hdc, oldpen); DeleteObject(oldpen); } else { for (i = 0; i < length; i++) { if (i % 2 == 0) { SetPixel(hdc, startx, starty, colours[261]); } startx += dx; starty += dy; } } } } /* This function gets the actual width of a character in the normal font. */ int char_width(Context ctx, int uc) { HDC hdc = ctx; int ibuf = 0; /* If the font max is the same as the font ave width then this * function is a no-op. */ if (!font_dualwidth) return 1; switch (uc & CSET_MASK) { case CSET_ASCII: uc = ucsdata.unitab_line[uc & 0xFF]; break; case CSET_LINEDRW: uc = ucsdata.unitab_xterm[uc & 0xFF]; break; case CSET_SCOACS: uc = ucsdata.unitab_scoacs[uc & 0xFF]; break; } if (DIRECT_FONT(uc)) { if (ucsdata.dbcs_screenfont) return 1; /* Speedup, I know of no font where ascii is the wrong width */ if ((uc&~CSET_MASK) >= ' ' && (uc&~CSET_MASK)<= '~') return 1; if ( (uc & CSET_MASK) == CSET_ACP ) { SelectObject(hdc, fonts[FONT_NORMAL]); } else if ( (uc & CSET_MASK) == CSET_OEMCP ) { another_font(FONT_OEM); if (!fonts[FONT_OEM]) return 0; SelectObject(hdc, fonts[FONT_OEM]); } else return 0; if ( GetCharWidth32(hdc, uc&~CSET_MASK, uc&~CSET_MASK, &ibuf) != 1 && GetCharWidth(hdc, uc&~CSET_MASK, uc&~CSET_MASK, &ibuf) != 1) return 0; } else { /* Speedup, I know of no font where ascii is the wrong width */ if (uc >= ' ' && uc <= '~') return 1; SelectObject(hdc, fonts[FONT_NORMAL]); if ( GetCharWidth32W(hdc, uc, uc, &ibuf) == 1 ) /* Okay that one worked */ ; else if ( GetCharWidthW(hdc, uc, uc, &ibuf) == 1 ) /* This should work on 9x too, but it's "less accurate" */ ; else return 0; } ibuf += font_width / 2 -1; ibuf /= font_width; return ibuf; } /* * Translate a WM_(SYS)?KEY(UP|DOWN) message into a string of ASCII * codes. Returns number of bytes used, zero to drop the message, * -1 to forward the message to Windows, or another negative number * to indicate a NUL-terminated "speci int funky_type = conf_get_int(conf, CONF_funky_type); int no_applic_k = conf_get_int(conf, CONF_no_applic_k); int ctrlaltkeys = conf_get_int(conf, CONF_ctrlaltkeys); int nethack_keypad = conf_get_int(conf, CONF_nethack_keypad)codefunky_type == FUNKY_VT400 || (funky_type <= FUNKY_LINUX && term->app_keypad_keys && !code = 0x100; if (conf_get_int(conf, CONF_compose_key)) { if (wParam == VK_MENU && (HIWORD(lParam) & KF_EXTENDED)) compose_keycode = wParam; } if (wParam == VK_APPS) compose_keycode = wParam; } if (wParam == compose_keycodeno_applic_k && funky_type != FUNKY_XTERM) || funky_type == FUNKY_VT400 || onf_get_int(conf, CONF_alt_f4)) { return -1; } if (left_alt && wParam == VK_SPACE && conf_get_int(conf, CONF_alt_space) conf_get_int(conf, CONF_fullscreenonaltenter) && (conf_get_int(conf, CONF_resize_action)funky_type == FUNKY_VT400 || (funky_type <= FUNKY_LINUX && term->app_keypad_keys && !funky_type == FUNKY_XTERM) xkey = 'o'; break; case VK_MULTIPLY: if (funky_type == FUNKY_XTERM) xkey = 'j'; break; case VK_SUBTRACT: if (onf_get_int(conf, CONF_bksp_is_delete)onf_get_int(conf, CONF_bksp_is_delete)funky_type == FUNKY_SCO && code >= 11 && code <= 34) { /* SCO function keys */(code == 1 || code == 4) && conf_get_int(conf, CONF_rxvt_homeendkeystate[VK_CAPITAL] != 0 && conf_get_int(conf, CONF_xlat_capslockcyr)onf_get_int(conf, CONF_alt_only)onf_get_int(conf, CONF_win_name_always)onf_get_int(conf, CONF_win_name_always)!conf_get_int(conf, is_full_screen() ? CONF_scrollbar_in_fullscreen : CONF_scrollbar)onf_get_int(conf, CONF_rtf_paste) FontSpec *font = conf_get_fontspec(conf, CONF_font); get_unitab(CP_ACP, unitab, 0); rtfsize = 100 + strlen(font->font->name, font->nt beep_ind = conf_get_int(conf, CONF_beep_ind); if ((mode == 0) || (Filename *bell_wavefile = conf_get_filename(conf, CONF_bell_wavefile); if (!PlaySound(bell_wavefile->path, NULL, SND_ASYNC | SND_FILENAME)) { char buf[sizeof(bell_wavefile->bell_wavefile->onf_set_int(conf, CONF_beep, BELL_DEFAULT)nt resize_action = conf_get_int(conf, CONF_resize_action); if (resize_action == RESIZE_DISABLED || onf_get_int(conf, CONF_alwaysontop)onf_get_int(conf, CONF_scrollbar_in_fullscreen)onf_get_int(conf, CONF_resize_action)onf_get_int(conf, CONF_scrollbar) Node-path: putty/windows/wingss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 701a5a29b636068ee44d828cb0117a3b Text-delta-base-sha1: 781b2ccfa2830742fa4d81759c8f0801e2e07f2c Text-content-length: 264 Text-content-md5: 27b76eeba8a02cb0afecf86755dcf2dd Text-content-sha1: 497d3cf0c87453a31f39dad44d939ecf81aa3d84 Content-length: 264 SVN��\f`�j��j{�#cn�ioZ�&6Conf *conf char *pathpath = conf_get_filename(conf, CONF_ssh_gss_custom)->path; if (*path) { module = LoadLibrary(path); }2; lib->gsslogmsg = dupprintf("Using GSSAPI from user-specified" " library '%s'", Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e58bffa4a2d7fc16a87877e68b9afb62 Text-delta-base-sha1: 4a5b8b63528fb44341a1b094130ba43600e06d91 Text-content-length: 2822 Text-content-md5: f8453e15fef704aebe21d64ba912b53a Text-content-sha1: 04a7ce41c252dffe53753210ebc150b6939b09a5 Content-length: 2822 SVN��s_||���%6�]+�O�Iq�C<�1�[~��nM�za�zUD�PUl�m�>8�0�E�]�rz�A2 *confconf = conf_new(); do_defaults(NULL, conf); loaded_session = FALSE; default_protocol = conf_get_int(conf, CONF_protocol); default_port = conf_get_int(conf, CONF_port)b->protocol; default_port = b->default_port; conf_set_int(conf, CONF_protocol, default_protocol); conf_set_int(conf, CONF_port, default_port)confonfonf_launchable(confonf_set_int(conf, CONF_protocol, PROT_TELNET)onf_set_int(conf, CONF_port, atoi(p)); else conf_set_int(conf, CONF_port, -1); conf_set_str(conf, CONF_host, q)b->protocol; conf_set_int(conf, CONF_protocol, default_protocol) *conf2 = conf_new(); do_defaults(host, conf2); if (loaded_session || !conf_launchable(confconf_set_str(conf, CONF_host, host); conf_set_int(conf, CONF_port, default_port); got_host = TRUE; } else { conf_copy_into(conf, conf2); loaded_session = TRUE; } conf_free(conf2); } if (user) { /* Patch in specified username. */ conf_set_str(conf, CONF_username, user)onf_set_str(conf, CONF_remote_cmd, command); conf_set_str(conf, CONF_remote_cmd2, ""); conf_set_int(conf, CONF_nopty, TRUE); /* command => no tty */ break; /* done with cmdline */ } } } if (errors) return 1; if (!conf_launchable(conf) || !(got_host || loaded_session)) { usage(); } /* * Muck about with the hostname in various ways. */ { char *hostbuf = dupstr(conf_get_str(conf, CONF_host)); char *host = hostbuf; char *p, *q; /* * Trim leading whitespace. */ host += strspn(host, " \t"); /* * See if host is of the form user@host, and separate out * the username if so. */ if (host[0] != '\0') { char *atsign = strrchr(host, '@'); if (atsign) { *atsign = '\0'; conf_set_str(conf, CONF_username, host); host = atsign + 1; } } /* * Trim off a colon suffix if it's there. */ host[strcspn(host, ":")] = '\0'; /* * Remove any remaining whitespace. */ p = hostbuf; q = host; while (*q) { if (*q != ' ' && *q != '\t') *p++ = *q; q++; } *p = '\0'; conf_set_str(conf, CONF_host, hostbuf); sfree(hostbuf);conf); /* * Apply subsystem status. */ if (use_subsystem) conf_set_int(conf, CONF_ssh_subsys, TRUE); if (!*conf_get_str(conf, CONF_remote_cmd) && !*conf_get_str(conf, CONF_remote_cmd2) && !*conf_get_str(conf, CONF_ssh_nc_host)onf_get_int(conf, CONF_protocol)onf_set_int(conf, CONF_port, portnumber)confonf_get_int(conf, CONF_tcp_nodelay)conf, conf_get_str(conf, CONF_host), conf_get_int(conf, CONF_port), &realhost, nodelay, conf_get_int(conf, CONF_tcp_keepalives) Node-path: putty/windows/winproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2ca6cf8b6b7da689ede27a89156b5397 Text-delta-base-sha1: 8dbf3b53686e6a484cda05fbad931c7047345ce6 Text-content-length: 150 Text-content-md5: 98873d963af15ad63b7811491491c959 Text-content-sha1: b12c2a5248b69ebf9e18eae1c792132470c2f2d2 Content-length: 150 SVN��/=z�M��s^p�,Conf *confonf_get_int(conf, CONF_proxy_type) != PROXY_CMD) return NULL; cmd = format_telnet_command(addr, port, conf Node-path: putty/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0900423a410f648429fb4afe0e807d81 Text-delta-base-sha1: a73583522a80667f0f67cbe2939777c7660a77b6 Text-content-length: 822 Text-content-md5: e67456711b23ca3f2a8936d136d0bcf3 Text-content-sha1: 8f502f68882a4aea16a38b5ce6cffd4d5d090495 Content-length: 822 SVN��6)Ia�$��+]�fR�AE�C$� pe�I6�!B�Xe�SB�q�' *confonf_get_int(conf, CONF_serspeed); msg = dupprintf("Configuring baud rate %d", dcb.BaudRate); logevent(serial->frontend, msg); sfree(msg); dcb.ByteSize = conf_get_int(conf, CONF_serdatabits); msg = dupprintf("Configuring %d data bits", dcb.ByteSize); logevent(serial->frontend, msg); sfree(msg); switch (conf_get_int(conf, CONF_serstopbits)onf_get_int(conf, CONF_serparity)onf_get_int(conf, CONF_serflow) *conf, char *host, int port, char **realhost, int nodelay, int keepalive) { Serial serial; HANDLE serport; const char *err; char *serlineserline = conf_get_str(conf, CONF_serline); { char *msg = dupprintf("Opening serial device %s", strchr(serline, '\\') ? "" : "\\\\.\\", onf *confonf Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e9d3c6d8ece52bc6b6e95f04bef3e413 Text-delta-base-sha1: a94958449acd17bee5911c112844fd73e48d2c30 Text-content-length: 31 Text-content-md5: 572f45a0034dcac36e04843e76b77609 Text-content-sha1: fb4ce2dd7304a3ff9f63460db5e401ab40a6fd9e Content-length: 31 SVN��ZS �|��M Conf *conf Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1577bd897e2e79c603f0782548966558 Text-delta-base-sha1: d6b71a7335b17d43257fb63c0b98377c91f1fca5 Text-content-length: 882 Text-content-md5: 18a0124716716ede8ac782a408ce03b9 Text-content-sha1: 7a8feb0e15e69a87a01ce438b993cf04b4100033 Content-length: 882 SVN��b%'=���7sS�'x�*�<GO�L) { DWORD type, size; char *ret; if (!handle) return NULL; /* Find out the type and size of the data. */ if (RegQueryValueEx((HKEY) handle, key, 0, &type, NULL, &size) != ERROR_SUCCESS || type != REG_SZ) return NULL; ret = snewn(size+1, char); if (RegQueryValueEx((HKEY) handle, key, 0, &type, ret, &size) != ERROR_SUCCESS || type != REG_SZ) return NULL; return ret char *fontname; fontname = read_setting_s(handle, name); if (!fontname) return 0; strncpy(ret.name, fontname, sizeof(ret.name)-1); ret.name[sizeof(ret.name)-1] = '\0'; sfree(fontname); char *tmp = read_setting_s(handle, name); if (tmp) { strncpy(result->path, tmp, sizeof(result->path)-1); result->path[sizeof(result->path)-1] = '\0'; sfree(tmp); return TRUE; } else return FALSE Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 425525f105e1eaf4e14bff0a2c99e430 Text-delta-base-sha1: a9c5857625d5e23402795049778641890235eca0 Text-content-length: 37 Text-content-md5: 575503e325b37519ed940e4ac005a4fc Text-content-sha1: 25387d75d7ae74cbd4bfba8868d1df6c0d16141c Content-length: 37 SVN��:4 �J��xW�iQ_tag Conf Node-path: putty/windows/winucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ffa2f37663d0206b3eb1bc195ba578a Text-delta-base-sha1: 40c230ddeda7e51e9bb5cbea3b8c5621cd19a07e Text-content-length: 273 Text-content-md5: 558f1f4affa58fb166206da167158827 Text-content-sha1: 335479f92314714250bd12db828243a5b9ff5f6b Content-length: 273 SVN��OwG<�u��Z|�T�qs�em�|W�/u�*)�:u�3Q�F *conf int vtmodeonf_get_str(conf, CONF_line_codepage)vtmode = conf_get_int(conf, CONF_vtmode); if (vtmode == VT_OEMANSI || vtmode == VT_OEMANSI || vtmode == VT_OEMANSI || Node-path: putty/windows/winx11.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d9cb173439d63460f258c6b49d2eac50 Text-delta-base-sha1: 3759ceab983cd0f736acda881bd88c7ac39d22d2 Text-content-length: 166 Text-content-md5: 38f526129b07123b8301e5111eab00c2 Text-content-sha1: b16d7be92388d94acbc68622c93069aa6e5225a7 Content-length: 166 SVN��w! �R�?8Conf *conf) { char *xauthpath = conf_get_filename(conf, CONF_xauthfile)->path; if (xauthpath[0]) x11_get_auth_from_authfile(disp, xauth Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 11912cc3f04643fee74e632f921587b6 Text-delta-base-sha1: 63d63401663a4c7b09146e2d68d9cd2789bcc950 Text-content-length: 80 Text-content-md5: 9e958a747a678e8086af5989f065cd02 Text-content-sha1: e6b822ef3d2125b3689cf5b157823e40dc7764b1 Content-length: 80 SVN��uZ$�?��Z�sy�6n�=�] Conf *confonfonf Conf *confonf Revision-number: 9215 Prop-content-length: 187 Content-length: 187 K 8 svn:date V 27 2011-07-15T12:24:54.687049Z K 7 svn:log V 87 Final changes to website from 0.61 release. Forgot to check these in on Tuesday, ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7888429a0507f03dc186cbaa52e1b36c Text-delta-base-sha1: 1b2ff8d821970e74798d871a2694201df68653bd Text-content-length: 26 Text-content-md5: 35d2a743d815af0da75700b101970646 Text-content-sha1: d5eab75000345c8e148aba2ed19b00c4a734a4ec Content-length: 26 SVN��+, �u��5vwe Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 59cd177e9062791e72d9873a192c61f4 Text-delta-base-sha1: b5404d8c8b5994e1870e4bcb8db160ac3a8073f9 Text-content-length: 204 Text-content-md5: bb8d93f74e4b39332a633b3d7f86bb15 Text-content-sha1: f53bfc48354f38f88c38b120c58db49315a9da47 Content-length: 204 SVN��4 ���1�]>�X>�l=�^*�T4�O:�Q�RC11-installer.exe">putty-0.61-installerutty-0.61-installerutty-0.6111.tar.gz">putty-0.61.tar.gzputty-0.61.tar.gzputty-0.61.tar.gzputty-0.61 Revision-number: 9216 Prop-content-length: 223 Content-length: 223 K 8 svn:date V 27 2011-07-15T12:51:23.737265Z K 7 svn:log V 122 Add links to all the non-MD5 checksum files. Also try not to imply that the executables contain cryptographic signatures. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bb8d93f74e4b39332a633b3d7f86bb15 Text-delta-base-sha1: f53bfc48354f38f88c38b120c58db49315a9da47 Text-content-length: 1422 Text-content-md5: bf040068087b7ea189a66fcfe279283a Text-content-sha1: 9cff62b36346ddf975a73591e11b7b82e2a8c7fa Content-length: 1422 SVN��vw���U�x2Z�X}�O:�Q�X}�O:�Q �X}�O:�Q�@�s ^�O5�O?�Qy �O5�O?�Qy�O5�O?�Qy�;Zre are cryptographic signatures available for all the files we offer below. We also supply cryptographically signed lists of checksums. To download our public keys and find out more about our signature policy, visit the <a href="keys.html">Keys page</a>. If you need a Windows program Checksums for all the above files</b></td> </tr> <tr> <td>MD5tr> <td>SHA-1:</td> <td><a href="http://the.earth.li/~sgtatham/putty/latest/sha1sums">sha1sha1sumssha1sumssha1sums.DSA">(DSA sig)</a></td> </tr> <tr> <td>SHA-256:</td> <td><a href="http://the.earth.li/~sgtatham/putty/latest/sha256sums">sha256sha256sumssha256sumssha256sums.DSA">(DSA sig)</a></td> </tr> <tr> <td>SHA-512:</td> <td><a href="http://the.earth.li/~sgtatham/putty/latest/sha512sums">sha512sha512sumssha512sumssha512Checksums for all the above files</b></td> </tr> <tr> <td>MD5tr> <td>SHA-1:</td> <td><a href="http://tartarus.org/~simon/putty-snapshots/sha1sums">sha1sumssha1sumssha1sumssha1sums.DSA">(DSA sig)</a></td> </tr> <tr> <td>SHA-256:</td> <td><a href="http://tartarus.org/~simon/putty-snapshots/sha256sums">sha256sumssha256sumssha256sumssha256sums.DSA">(DSA sig)</a></td> </tr> <tr> <td>SHA-512:</td> <td><a href="http://tartarus.org/~simon/putty-snapshots/sha512sums">sha512sumssha512sumssha512sumssha512 Revision-number: 9217 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2011-07-15T16:03:06.850078Z K 7 svn:log V 143 When doing manual underlining, underline the text in question rather than a box to the right of it. Probably introduced sometime around r9063. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 96de4e95110594d270a7e55e8bb4a1c5 Text-delta-base-sha1: 445b1446f2bdc98811f4bf067a707bcccd174b37 Text-content-length: 154 Text-content-md5: ae742550600dfb65c9dd7f5aba1a314e Text-content-sha1: 5807e3956371da5418c7ae22a2c224999b28288f Content-length: 154 SVN���� S�^�S�Oline_box.left, line_box.top + dec, NULL); LineTo(hdc, line_box.right, line_box.top�{�{� oldpen = SelectObject(hdc, Revision-number: 9218 Prop-content-length: 300 Content-length: 300 K 8 svn:date V 27 2011-07-15T18:18:28.178023Z K 7 svn:log V 199 conf_copy_into must empty the entire target conf before filling it with the entries from the source one, otherwise add234 will keep failing ("this key already exists"). Completely broke Plink, ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/conf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4874b323aed000e846833605668df848 Text-delta-base-sha1: 2f947650176adfec665907eac7432ecbdee35181 Text-content-length: 40 Text-content-md5: b3a78624bef44e65ec81dca2f5740efa Text-content-sha1: a52d1af75edb46d543ba9c15f43d882d8626fe2b Content-length: 40 SVN��b| �)��@"conf_clear(newconf) Revision-number: 9219 Prop-content-length: 114 Content-length: 114 K 8 svn:date V 27 2011-07-15T18:21:30.447255Z K 7 svn:log V 14 Missing free. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5bd91fc602d7d4134031bafb6dc2e404 Text-delta-base-sha1: 58540cd5df9d3c866edd5e20ee470858683bbee0 Text-content-length: 35 Text-content-md5: f8d95f5576dd0429ade84746bdd06973 Text-content-sha1: aada5cd8a4d1443a645ea31acdfb289719c28a77 Content-length: 35 SVN��$ ��� sfree(host Revision-number: 9220 Prop-content-length: 560 Content-length: 560 K 8 svn:date V 27 2011-07-15T18:30:47.901812Z K 7 svn:log V 459 Don't delete everything under a string-subkeyed primary key by using a loop that fetches the next item using conf_get_str_strs and passing the previous key as a parameter, because the previous key will have been freed by the intervening conf_del_str_str. Instead, use the technique of repeatedly using conf_get_str_nthstrkey with index 0 and deleting what comes back, as PSCP and PSFTP do. Spotted by Minefield with the aid of Jacob, or possibly vice versa. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 55b3efd5e203459e527c7988f9bd943d Text-delta-base-sha1: 97f1b7449ccf3fca720679d09fcecfb90e7cbde9 Text-content-length: 98 Text-content-md5: 021303541815d141bda567214779f472 Text-content-sha1: 1396cae312a1c459008a0111821cc303644d1c7f Content-length: 98 SVN��: I� �I�3while ((key = conf_get_str_nthstrkey(conf, primary, 0)) != NULL) Revision-number: 9221 Prop-content-length: 541 Content-length: 541 K 8 svn:date V 27 2011-07-16T11:13:00.838879Z K 7 svn:log V 440 Fix display of VT100 vertically-offset horizontal line characters (o,p,r,s). They are displayed in Windows by actually writing the centred one (q) with a vertical offset, in case fonts don't have the offset versions; this requires terminal.c to separate those characters into distinct calls to do_text(). Unfortunately, it was only breaking up a text-drawing call _before_ one of those characters, not after one. Spotted by Robert de Bath. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 03cf5d65878b174c2a4bd0a35fe8eb7e Text-delta-base-sha1: 10ed3bc7289c3365b25ceeed4001d61d9e7100d8 Text-content-length: 197 Text-content-md5: 69262bbc9c5c280c418acb984d3417ca Text-content-sha1: 1c708556cdba0afbd033e8c6e83edd280843f3a0 Content-length: 197 SVN���������(�(��^J(tchar >= 0x23BA && tchar <= 0x23BD) || (j > 0 && (newline[j-1].chr >= 0x23BA && newline[j-1].chr <= 0x23BD)) Revision-number: 9222 Prop-content-length: 474 Content-length: 474 K 7 svn:log V 373 Make a branch from just before the destabilising r9214. There have been a few particularly annoying bugs reported in 0.61, which is only to be expected given four years of development with not enough people testing the development snapshots, and so I intend to merge critical bug fixes only from trunk to this branch and probably release an 0.62 reasonably soon from here. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-16T11:25:00.263833Z PROPS-END Node-path: putty-branch-0.61 Node-kind: dir Node-action: add Node-copyfrom-rev: 9213 Node-copyfrom-path: putty Revision-number: 9223 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2011-07-16T11:26:19.109564Z K 7 svn:log V 39 Merge r9217 (Jacob's underlining fix). K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.61/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 512f7fb0acab6b996ff1f638f6833427 Text-delta-base-sha1: 78ececb9f44dc4a64e11dd45e18f09df84063305 Text-content-length: 154 Text-content-md5: 88a6e68abd0011d02492c1f34af3ede7 Text-content-sha1: 00624927604bf3762b96d626f569a9b9c139131a Content-length: 154 SVN���� S�z�S�31line_box.left, line_box.top + dec, NULL); LineTo(hdc, line_box.right, line_box.top�~�~�cate a NUL-terminated "speci Revision-number: 9224 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 Merge r9221 (the VT100 line drawing fix). K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-16T11:27:05.724782Z PROPS-END Node-path: putty-branch-0.61/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0bca3d5a64478b8341decf905bd33166 Text-delta-base-sha1: 40c1999084e3806958f6ceb6a7f43bdc8c3bad6e Text-content-length: 197 Text-content-md5: 610cf9f4686ea521b0ed5871e5f05e28 Text-content-sha1: 5ffb9243b6c042ae8dc20842e65f794bb6a291f3 Content-length: 197 SVN���������.$�V��6x(tchar >= 0x23BA && tchar <= 0x23BD) || (j > 0 && (newline[j-1].chr >= 0x23BA && newline[j-1].chr <= 0x23BD)) Revision-number: 9225 Prop-content-length: 310 Content-length: 310 K 8 svn:date V 27 2011-07-16T12:03:14.425977Z K 7 svn:log V 209 Mostly cosmetic change: don't claim to have found an SSH agent if SSH_AUTH_SOCK is defined to the empty string. (Because a common way to 'unset' it is to run commands like 'SSH_AUTH_SOCK= putty -load thing'.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxagentc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 19b5d552085934cc7736798784efbc62 Text-delta-base-sha1: a38369b19f59af20a1a55004d19e6aeab881253e Text-content-length: 77 Text-content-md5: 8c02d2c527422463bf265988e8a7eb48 Text-content-sha1: 3d658c985992c42d3f0b40f47e8c3d929ffa3966 Content-length: 77 SVN��0 8���YBconst char *p = getenv("SSH_AUTH_SOCK"); if (p && *p Revision-number: 9226 Prop-content-length: 546 Content-length: 546 K 8 svn:date V 27 2011-07-16T12:06:32.403948Z K 7 svn:log V 445 Reorganise the logging and display of messages about SSH authentication. We should now produce an Event Log entry for every authentication attempted and every authentication failure; meanwhile, messages in the PuTTY window will not be generated for the failure of auth types unless we also announced in the PuTTY window that we were trying them. (GSSAPI was getting the latter wrong, leading to spurious 'Access denied' for many users of 0.61.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 609f7e2e31af6bd81133a0a8df376310 Text-delta-base-sha1: 5584fca7aeb2e87926ffae6eeb9f481bf0cd8b4e Text-content-length: 2367 Text-content-md5: 56a322ed8a8aae401f688c34723cbda7 Text-content-sha1: 4a02ef75a022b2c02e5fc0b7b05e79b383936891 Content-length: 2367 SVN����������������[>S�\��K\V�1^�n�0�2Y�C@�x �ir /* always QUIET */, or no message at all. * * For forms of authentication which are attempted * implicitly, by which I mean without printing * anything in the window indicating that we're * trying them, we should never print 'Access * denied'. * * If we do print a message saying that we're * attempting some kind of authentication, it's OK * to print a followup message saying it failed - * but the message may sometimes be more specific * than simply 'Access denied'. *our key"); } else if (s->type == AUTH_TYPE_PUBLICKEY) { /* This _shouldn't_ happen except by a * protocol bug causing client and server to * disagree on what is a correct signature. */ c_write_str(ssh, "Server refused public-key signature" " despite accepting key!\r\n"); logevent("Server refused public-key signature" " despite accepting key!"); } else if (s->type==AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET) { /* quiet, so no c_write */ logevent("Server refused keyboard-interactive authentication"); } else if (s->type==AUTH_TYPE_GSSAPI) { /* always quiet, so no c_write */ logevent("GSSAPI authentication failed"); } else if (s->type == AUTH_TYPE_KEYBOARD_INTERACTIVE) { logevent("Keyboard-interactive authentication failed"); c_write_str(ssh, "Access denied\r\n"); } else { assert(s->type == AUTH_TYPE_PASSWORD); logevent("Password authentication failed"); c_write_str(ssh, "Access denied\r\n"); if ( logevent("Sent public key signature" logevent("Attempting GSSAPI authentication logevent("Attempting keyboard-interactive authentication Revision-number: 9227 Prop-content-length: 622 Content-length: 622 K 8 svn:date V 27 2011-07-17T22:17:30.757034Z K 7 svn:log V 521 Support for re-running autoconf in the absence of the autoconf macro files which provide auto-detection of GTK 1 and GTK 2. This makes it easier for casual PuTTY developers to rerun autoconf for their own purposes without having to install obscure extra packages. Obviously the resulting configure script will not know how to detect whichever version of GTK they didn't have support for, so it won't be product- quality by my standards, but it should be good enough that they can prepare unrelated patches to send to us. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc6fbf37637231f412015cad010e388a Text-delta-base-sha1: c0a88428828a77bac095f3bdeb65057550d839d9 Text-content-length: 299 Text-content-md5: e597d110d232ce29e088fe73836198db Text-content-sha1: 0d48143e508cf43c3bcc797425a393767630e715 Content-length: 299 SVN��U �*��wifdef([AM_PATH_GTK],[ AM_PATH_GTK([1.2.0], [gtk=1], [gtk=none]) ],[AC_WARNING([generating configure script without GTK 1 autodetection])]) ifdef([AM_PATH_GTK_2_0],[ AM_PATH_GTK_2_0([2.0.0], [gtk=2], []) ],[AC_WARNING([generating configure script without GTK 2 autodetection]) Revision-number: 9228 Prop-content-length: 296 Content-length: 296 K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-17T22:17:40.384592Z K 7 svn:log V 195 --with-gtk-version option to configure, so you can explicitly tell it which GTK version you want to build with if both are installed. Based on a patch by Malcolm Smith, though somewhat modified. PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e597d110d232ce29e088fe73836198db Text-delta-base-sha1: 0d48143e508cf43c3bcc797425a393767630e715 Text-content-length: 681 Text-content-md5: 8b72dbd50f85919074b2fee838cbfca3 Text-content-sha1: c4e4f561c9319ed27188325a5e791cd3a26470fa Content-length: 681 SVN��U�4�.�{/G�Ku�_?�8ARG_WITH([gtk-version], [AS_HELP_STRING([--with-gtk-version], [specify GTK version to use (1 or 2) (optional)])], [gtk_version_desired="$withval"], [gtk_version_desired="any"]) case "$gtk_version_desired" in 1 | 2 | any) ;; *) AC_ERROR([Invalid GTK version specified]) esac gtk=none case "$gtk_version_desired" in 1 | any) ifdef([AM_PATH_GTK],[ AM_PATH_GTK([1.2.0], [gtk=1], []) ],[AC_WARNING([generating configure script without GTK 1 autodetection])]) ;; esac case "$gtk_version_desired" in 2 | any) ifdef([AM_PATH_GTK_2_0],[ AM_PATH_GTK_2_0([2.0.0], [gtk=2], []) ;; esac Revision-number: 9229 Prop-content-length: 532 Content-length: 532 K 7 svn:log V 431 Fix version reporting in Unix builds versioned by a specific svn revision ('Custom build r1234'). Those builds were passing '-DSVN_REV=r1234' to version.c, instead of -DSVN_REV=1234 as they should have, leading to silly run-time version messages such as 'plink: Custom build rr9226'. To chop the r off the front of the revision string passed in, I've used a bashism in mkunxarc.sh. I think this is an acceptable extra dependency. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-17T22:17:53.453792Z PROPS-END Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f86fc61c64a9c462a502fdc311961540 Text-delta-base-sha1: 60b1653e5b7b854e498ff165b4f92748572b9072 Text-content-length: 36 Text-content-md5: 84839424a828329d4daec2bc629b9526 Text-content-sha1: c099de2bec919bcec4d59ade008dda6cf6108910 Content-length: 36 SVN��28 �+�3#!/bin/ba{1#r} Revision-number: 9230 Prop-content-length: 206 Content-length: 206 K 7 svn:log V 105 Fix a typo in r9214 that plausibly explains a resizing weirdness I had with today's snapshot on Windows. K 10 svn:author V 5 jacob K 8 svn:date V 27 2011-07-17T22:35:08.798461Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae742550600dfb65c9dd7f5aba1a314e Text-delta-base-sha1: 5807e3956371da5418c7ae22a2c224999b28288f Text-content-length: 49 Text-content-md5: 12b9c274cae83261884d58787043e077 Text-content-sha1: 336f3053fc86eab406bc7342e2eb22442032b021 Content-length: 49 SVN�����:��@@width ��� Revision-number: 9231 Prop-content-length: 213 Content-length: 213 K 8 svn:date V 27 2011-07-18T18:04:39.585039Z K 7 svn:log V 112 Reinstate a missing invocation of the FONT_QUALITY macro which I accidentally removed in the big config revamp. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 12b9c274cae83261884d58787043e077 Text-delta-base-sha1: 336f3053fc86eab406bc7342e2eb22442032b021 Text-content-length: 78 Text-content-md5: d6cb45f9e09eac70e6767a94d424d3a9 Text-content-sha1: 871b2fdb358840824ebca7fe07e81f851a5e9701 Content-length: 78 SVN���� �E��&LFONT_QUALITY(quality)�$��dc, pts, 5); Revision-number: 9232 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 2011-07-18T18:09:36.354700Z K 7 svn:log V 161 Minor amendment to r9226: don't log GSSAPI failure in the Event Log twice. (Once in the GSSAPI code, once at the top of the main auth loop. Removed the latter.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56a322ed8a8aae401f688c34723cbda7 Text-delta-base-sha1: 4a02ef75a022b2c02e5fc0b7b05e79b383936891 Text-content-length: 172 Text-content-md5: 737330abc9baa583ee9de184844190b8 Text-content-sha1: 38f0dd2bca1458b4e9971dba18306356dfcd23e5 Content-length: 172 SVN����������������Nq�,�q�1U/* also, the code down in the GSSAPI block has * already logged this in the Event Log */ Revision-number: 9233 Prop-content-length: 205 Content-length: 205 K 8 svn:date V 27 2011-07-18T18:10:46.720012Z K 7 svn:log V 104 Merge r9226 and r9232 (userauth messaging cleanup, fixing spurious "Access denied" from failed GSSAPI). K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.61/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d2fc634403340b76c2d0d4b45ea37f5 Text-delta-base-sha1: 876d3b4147af4917809995a75289a7d7d4028845 Text-content-length: 2435 Text-content-md5: dbf1e4a1d903bea90e2cc9ec842222f7 Text-content-sha1: 36dac5ff0463cbb312e521ca9868c56cd189a451 Content-length: 2435 SVN����������������9�$��$V�1vb�x3�(��,Z�:)�HS /* always QUIET */, or no message at all. * * For forms of authentication which are attempted * implicitly, by which I mean without printing * anything in the window indicating that we're * trying them, we should never print 'Access * denied'. * * If we do print a message saying that we're * attempting some kind of authentication, it's OK * to print a followup message saying it failed - * but the message may sometimes be more specific * than simply 'Access denied'. *our key"); } else if (s->type == AUTH_TYPE_PUBLICKEY) { /* This _shouldn't_ happen except by a * protocol bug causing client and server to * disagree on what is a correct signature. */ c_write_str(ssh, "Server refused public-key signature" " despite accepting key!\r\n"); logevent("Server refused public-key signature" " despite accepting key!"); } else if (s->type==AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET) { /* quiet, so no c_write */ logevent("Server refused keyboard-interactive authentication"); } else if (s->type==AUTH_TYPE_GSSAPI) { /* always quiet, so no c_write */ /* also, the code down in the GSSAPI block has * already logged this in the Event Log */ } else if (s->type == AUTH_TYPE_KEYBOARD_INTERACTIVE) { logevent("Keyboard-interactive authentication failed"); c_write_str(ssh, "Access denied\r\n"); } else { assert(s->type == AUTH_TYPE_PASSWORD); logevent("Password authentication failed"); c_write_str(ssh, "Access denied\r\n"); if ( logevent("Sent public key signature" logevent("Attempting GSSAPI authentication logevent("Attempting keyboard-interactive authentication" Revision-number: 9234 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9235 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 Add note about the bug this exposed in the Dropbear SSH server. K 10 svn:author V 5 jacob K 8 svn:date V 27 2011-07-19T00:12:01.418698Z PROPS-END Node-path: putty-wishlist/data/flow-control Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d2b9836c629d3237abc3346021f7ebc Text-delta-base-sha1: ff8f4a01786c62f454a3d5d5c518d38231effd97 Text-content-length: 537 Text-content-md5: 800430514ae2ec7a75ec310456c3ffce Text-content-sha1: 7a5695a864bd04f32bbbc22d37a706d2e6b1b860 Content-length: 537 SVN��U8{�+��R,Q�@Knock-on effects of this change: <ul> <li> </li> <li>The frequent new channel requests exposed a bug in the <a href="http://matt.ucc.asn.au/dropbear/dropbear.html">Dropbear</a> SSH server, leading to PuTTY terminating sessions with a "Received SSH2_MSG_CHANNEL_FAILURE for nonexistent channel" message. This bug has been fixed in new versions of Dropbear (probably <a href="http://lists.ucc.gu.uwa.edu.au/pipermail/dropbear/2008q4/000831.html">0.52</a> onwards).</li> </ul> <p> Another approach (not taken) Revision-number: 9236 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2011-07-19T17:06:43.839477Z K 7 svn:log V 96 Trivial fix for assertion failure introduced by the config revamp. Spotted by Leonid Lisovskiy. K 10 svn:author V 5 simon PROPS-END Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e1903c7d6a9b6dafae34a1e6cb3791a Text-delta-base-sha1: 086bd6a2f6529ab067c3ec68c7f1c510264e0459 Text-content-length: 27 Text-content-md5: 94700f1f50da947c86414a8bd4ca43b3 Text-content-sha1: 0ad3c15aaa6aaaaae1a5c57164344b943f16fe4b Content-length: 27 SVN��II ���6int Revision-number: 9237 Prop-content-length: 370 Content-length: 370 K 8 svn:date V 27 2011-07-20T15:55:07.424562Z K 7 svn:log V 269 Fix 'Duplicate Session' on Windows, broken during the config revamp. (In an embarrassingly silly way, too. No end of difficult stuff about Conf serialisation done with great care and working just fine, and then a trivial goof in using sscanf lets the whole lot down.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d6cb45f9e09eac70e6767a94d424d3a9 Text-delta-base-sha1: 871b2fdb358840824ebca7fe07e81f851a5e9701 Text-content-length: 41 Text-content-md5: 4bccac17da64f0940a60be3dbf6ccb38 Text-content-sha1: 2fcb554a372183586bdc42826d442262554b6478 Content-length: 41 SVN���� �Q��.R2�$$��$� Revision-number: 9238 Prop-content-length: 303 Content-length: 303 K 8 svn:date V 27 2011-07-20T17:50:02.318691Z K 7 svn:log V 202 When we check for libX11 in the autoconf script, add it to $GTK_LIBS on success rather than to $LIBS, because it's only used in the GUI tools and we don't want the command-line tools linked against it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b72dbd50f85919074b2fee838cbfca3 Text-delta-base-sha1: c4e4f561c9319ed27188325a5e791cd3a26470fa Text-content-length: 141 Text-content-md5: 6debcf2a84396d7ac842bd41f264230b Text-content-sha1: 67de7ec0e0b232ef9a47866d850ec78bcc121cee Content-length: 141 SVN�� w�7�w�[7, [GTK_LIBS="-lX11 $GTK_LIBS" AC_DEFINE([HAVE_LIBX11],[],[Define if libX11.a is available])] Revision-number: 9239 Prop-content-length: 1225 Content-length: 1225 K 7 svn:log V 1123 Switch to using automake for the Unix autoconfigured build. mkfiles.pl no longer generates a Makefile.in, but instead generates a Makefile.am on which mkauto.sh runs automake. This means that the autoconfigured makefile now does build-time dependency tracking (a standard feature of automake-generated makefiles), and is generally more like what Unix people will expect. Some of the old-style make command-line settings (VER=-DRELEASE=foo, XFLAGS=-DDEBUG) will still work; the COMPAT settings are better done by autoconfiguration, and my habitual 'XFLAGS="-g -O0"' for an easily debuggable build will actually not work any more because CFLAGS is specified _after_ XFLAGS, so I should instead write 'make CFLAGS=-O0' (-g is the default in automake, removed at 'make install' time). The new makefile will automatically degrade into one that builds the command-line tools only, in the case where GTK could not be found. In principle, therefore, it should be an adequate replacement for _both_ the static Unix makefiles, Makefile.gtk and Makefile.ux. I haven't actually retired those in this commit, but I'm pretty tempted. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-23T11:33:29.661739Z PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 266fd0f9295d07f746327ed01d50fef7 Text-delta-base-sha1: 4019a3219a1229155a018bf2a60903480e2ccb57 Text-content-length: 1402 Text-content-md5: d63d3de33758f82233cf51333304d991 Text-content-sha1: 627349e3b4f2918d6edda423f00e0da897c693aa Content-length: 1402 SVN��MTS�e�1�an ��#* In the absence of either, the configure script will automatically construct a Makefile which builds only the command-line utilities. - pterm would like to be setuid or setgid, as appropriate, to permit it to write records of user logins to /var/run/utmp and /var/log/wtmp. (Of course it will not use this privilege for anything else, and in particular it will drop all privileges before starting up complex subsystems like GTK.) By default the makefile will not attempt to add privileges to the pterm executable at 'make install' time, but you can ask it to do so by running configure with the option '--enable-setuid=USER' or '--enable-setgid=GROUP'. - The; if you have fetched the source via Subversion then you will need to have built these using Halibut first - see below. All of the Makefiles are generated automatically from the file `Recipe' by the Perl script `mkfiles.pl' (except for the Unix one, which is generated by the `configure' script; mkfiles.pl only generates the input to automake). Additions and corrections to Recipe, mkfiles.pl and/or configure.ac are much more useful than additions and corrections to the actual Makefiles, Makefile.am or Makefile.in The input file to Automake is generated by mkfiles.pl along with all the rest of the makefiles, so you will need to run mkfiles.pl and then mkauto.sh Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 884b6351c6fa7490c9cfc85949977f92 Text-delta-base-sha1: 6b772e623b909dd09edf9502fa22367beb3fe98f Text-content-length: 1060 Text-content-md5: 47fba86399ba1d40af7f50822dddd072 Text-content-sha1: a758bc1cb6c7004bac0e135a29dd17ce4d8fc12f Content-length: 1060 SVN��&~�_��]qi�;M�'m unix/Makefile.am# In the automake build, we have to do the whole job by supplying # extra CFLAGS, so we have to put the if statement inside one big # backtick expression. We also force rebuilding via a -D option that # makes version.o include empty.h, which we construct ourselves and # touch whenever any source file is updated. !cflags am version $(VER) -DINCLUDE_EMPTY_H `if test -z "$(VER)" && (cd $(srcdir)/..; md5sum -c manifest >/dev/null 2>&1); then cat $(srcdir)/../version.def; else echo "$(VER)"; fi` !begin am BUILT_SOURCES = empty.h CLEANFILES = empty.h empty.h: $(allsources) echo '/* nothing to see here */' >$@ !endList the man pages for the automake makefile. !begin am man1_MANS = ../doc/plink.1 ../doc/pscp.1 ../doc/psftp.1 ../doc/pterm.1 \ ../doc/putty.1 ../doc/puttygen.1 ../doc/puttytel.1 !end # In automake, chgrp/chmod pterm after installation, if configured to. !begin am if HAVE_SETID_CMD install-exec-local: @SETID_CMD@ $(bindir)/pterm chmod @SETID_MODE@ $(bindir)/pterm endif Node-path: putty/mkauto.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ba690e257bd082c86c44f71b9a560ff5 Text-delta-base-sha1: 112936aae96daa59a267ca34aa5b25abf3bdb7b9 Text-content-length: 108 Text-content-md5: 9127b32c2e9bd2d22bdc729bad73cc18 Text-content-sha1: 6a9fc0b2f36bfefb0c93d20d34f70101b5be1b0d Content-length: 108 SVN���[�%�[Run autoconf on our real configure.in. (cd unix && autoreconf -i && rm -rf autom4te.cache) Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 979fc171ae627db92070ef7731f8f6f5 Text-delta-base-sha1: 239299a3ef7d6b241871e345469d656e5ac2fb52 Text-content-length: 3197 Text-content-md5: 997192d65c0511ce58cb382d1fcca83d Text-content-sha1: 7c2153eb7073d59b0f31576b31ef74d464670da6 Content-length: 3197 SVN��U-1>�F�>�3�7A�&t�h�B� Jcflags" and &mfval($_[1])) { ($rest = $_) =~ s/^\s*\S+\s+\S+\s+\S+\s*//; # find rest of input line $rest = 1 if $rest eq ""; $cflags{$_[1]}->{$_[2]} = $rest; next; %allsourcefiles = (); # this is wanted by some makefiles$allsourcefiles{$dirfile} = 1mm'}) { $dirpfx = "\$(srcdir)/" . &dirpfx($makefiles{'am'}, "/"); ##-- Unix/autoconf Makefile.am open OUT, ">$makefiles{'am'}"; select OUT; print "# Makefile.am for $project_name under Unix with Autoconf/Automake\n"; # Complete list of source and header files. Not used by the # auto-generated parts of this makefile, but Recipe might like to # have it available as a variable so that mandatory-rebuild things # (version.o) can conveniently be made to depend on it. @sources = ("allsources", "=", map {"${dirpfx}$_"} sort keys %allsourcefiles); print &splitline(join " ", @sources), "\n\n"; @cliprogs = ("bin_PROGRAMS", "="); foreach $p (&prognames("U")) { ($prog, $type) = split ",", $p; push @cliprogs, $prog; } @allprogs = @cliprogs; foreach $p (&prognames("X")) { ($prog, $type) = split ",", $p; push @allprogs, $prog; } print "if HAVE_GTK\n"; print &splitline(join " ", @allprogs), "\n"; print "else\n"; print &splitline(join " ", @cliprogs), "\n"; print "endif\n\n"; %objtosrc = (); foreach $d (&deps("X", undef, $dirpfx, "/", "am")) { $objtosrc{$d->{obj}} = $d->{deps}->[0]; } @amcflags = ("\$(COMPAT)", "\$(XFLAGS)", map {"-I$dirpfx$_"} @srcdirs); print "if HAVE_GTK\n"; print &splitline(join " ", "AM_CFLAGS", "=", "\$(GTK_CFLAGS)", @amcflags), "\n"; print "else\n"; print &splitline(join " ", "AM_CFLAGS", "=", @amcflags), "\n"; print "endif\n\n"; %amspeciallibs = (); foreach $obj (sort { $a cmp $b } keys %{$cflags{'am'}}) { print "lib${obj}_a_SOURCES = ", $objtosrc{$obj}, "\n"; print &splitline(join " ", "lib${obj}_a_CFLAGS", "=", @amcflags, $cflags{'am'}->{$obj}), "\n"; $amspeciallibs{$obj} = "lib${obj}.a"; } print &splitline(join " ", "noinst_LIBRARIES", "=", sort { $a cmp $b } values %amspeciallibs), "\n\n"; foreach $p (&prognames("X:U")) { ($prog, $type) = split ",", $p; print "if HAVE_GTK\n" if $type eq "X"; @progsources = ("${prog}_SOURCES", "="); %sourcefiles = (); @ldadd = (); $objstr = &objects($p, "X", undef, undef); foreach $obj (split / /,$objstr) { if ($amspeciallibs{$obj}) { push @ldadd, $amspeciallibs{$obj}; } else { $sourcefiles{$objtosrc{$obj}} = 1; } } push @progsources, sort { $a cmp $b } keys %sourcefiles; print &splitline(join " ", @progsources), "\n"; if ($type eq "X") { push @ldadd, "\$(GTK_LIBS)"; } if (@ldadd) { print &splitline(join " ", "${prog}_LDADD", "=", @ldadd), "\n"; } print "endif\n" if $type eq "X"; print "\n"; } print $makefile_extra{'am'}->{'end'} Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 84839424a828329d4daec2bc629b9526 Text-delta-base-sha1: c099de2bec919bcec4d59ade008dda6cf6108910 Text-content-length: 557 Text-content-md5: e09cab6da57644916fcade107a4097e0 Text-content-sha1: 1d5160f7ea5fec3dda68629c12d1f1114bc76f84 Content-length: 557 SVN��8#~�;� �S� f�}�k9;}utoconfver="`cat LATEST.VER`-$1" arcsuffix="-$autoconfver" ver="-DSNAPSHOT=$1" docver= ;; r*) autoconfver="$1" arcsuffix="-$autoconfver" ver="-DSVN_REV=${1#r}" docver= ;; '') autoconfver="X.XX" # got to put something in here!utoconfver="$1" arcsuffix="-$autoconfverconfigure.acsed "s/^AC_INIT(putty,.*/AC_INIT(putty, $autoconfver)/" unix/configure.ac > uxarc/$arcname/unix/configure.ac (cd uxarc/$arcname && sh mkauto.sh) 2>errors || { cat errors >&2; exit 1; } Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 288 Content-length: 288 K 10 svn:ignore V 255 Makefile.am Makefile.in Makefile.gtk Makefile.ux Makefile.local Makefile aclocal.m4 autom4te.cache config.status configure depcomp empty.h install-sh local missing plink pterm putty puttytel psftp pscp puttygen stamp-h1 uxconfig.in uxconfig.h *.log .deps PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6debcf2a84396d7ac842bd41f264230b Text-delta-base-sha1: 67de7ec0e0b232ef9a47866d850ec78bcc121cee Text-content-length: 1821 Text-content-md5: 5a81319ec245256ad40af2ca70ceccce Text-content-sha1: a6b4d3b8d6fcdf3e422d17fd46b9e1559b1cd408 Content-length: 1821 SVN�� *&k�O�@�5'I�![� Y�}1� ~# Version number is substituted by Buildscr for releases, snapshots # and custom builds out of svn; X.XX shows up in ad-hoc developer # builds, which shouldn't matter AC_INIT(putty, X.XX) AC_CONFIG_FILES([Makefile]) AC_CONFIG_HEADERS([uxconfig.h:uxconfig.in]) AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AC_PROG_INSTALL AC_PROG_RANLIB # Mild abuse of the '--enable' option format to allow manual # specification of setuid or setgid setup in pterm. setidtype=none AC_ARG_ENABLE([setuid], [AS_HELP_STRING([--enable-setuid=USER], [make pterm setuid to a given user])], [case "$enableval" in no) setidtype=none;; *) setidtype=setuid; setidval="$enableval";; esac]) AC_ARG_ENABLE([setgid], [AS_HELP_STRING([--enable-setgid=GROUP], [make pterm setgid to a given group])], [case "$enableval" in no) setidtype=none;; *) setidtype=setgid; setidval="$enableval";; esac]) AM_CONDITIONAL(HAVE_SETID_CMD, [test "$setidtype" != "none"]) AS_IF([test "x$setidtype" = "xsetuid"], [SETID_CMD="chown $setidval"; SETID_MODE="4755"]) AS_IF([test "x$setidtype" = "xsetgid"], [SETID_CMD="chgrp $setidval"; SETID_MODE="2755"]) AC_SUBST(SETID_CMD) AC_SUBST(SETID_MODE If we can't find either, have the # makefile only build the CLI programsAM_CONDITIONAL(HAVE_GTK, [test "$gtk" != "none"])if test "$gtk" = "none"; then cat <<EOF 'configure' was unable to find either the GTK 1 or GTK 2 libraries on your system. Therefore, PuTTY itself and the other GUI utilities will not be built by the generated Makefile: only the command-line tools such as puttygen, plink and psftp will be built. EOF fi Node-path: putty/version.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 91abcd747562e8eb6683c61aeaea4bca Text-delta-base-sha1: d6c4079af264b7425bf57001cd9714bf112417eb Text-content-length: 619 Text-content-md5: 101df939b7f5528054d1df02d4adb2b7 Text-content-sha1: ee53b0be4d1a5ad9e9fa539a778294045956384b Content-length: 619 SVN���Z U�Q�U�4Ldef INCLUDE_EMPTY_H /* * Horrible hack to force version.o to be rebuilt unconditionally in * the automake world: empty.h is an empty header file, created by the * makefile and forcibly updated every time make is run. Including it * here causes automake to track it as a dependency, which will cause * version.o to be rebuilt too. * * The space between # and include causes mkfiles.pl's dependency * scanner (for all other makefile types) to ignore this include, * which is correct because only the automake makefile passes * -DINCLUDE_EMPTY_H to enable it. */ # include "empty.h" #endif Revision-number: 9240 Prop-content-length: 336 Content-length: 336 K 7 svn:log V 235 Rename --with-gtk-version to --with-gtk, and support its negation --without-gtk as a means of manually overriding the makefile into one building the command-line tools only (as it would if GTK were not found at all at configure time). K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-23T11:36:25.509277Z PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d63d3de33758f82233cf51333304d991 Text-delta-base-sha1: 627349e3b4f2918d6edda423f00e0da897c693aa Text-content-length: 310 Text-content-md5: 0f718af3c15089762f2b9316b0001823 Text-content-sha1: 8e588ea3776e09dd006c7b344ca37d3be846f43e Content-length: 310 SVN��Tm�g�=� eZ�eof you have both installed, you can manually specify which one you want by giving the option '--with-gtk=1' or '--with-gtk=2' to the configure script. (2 is the default, of course.); you can manually create this condition by giving configure the option '--without-gtk' Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5a81319ec245256ad40af2ca70ceccce Text-delta-base-sha1: a6b4d3b8d6fcdf3e422d17fd46b9e1559b1cd408 Text-content-length: 549 Text-content-md5: d0cc91a79bd5d506597f4e49c03fb7c7 Text-content-sha1: a721ecd0dd5559502d02215d44f066ca6cac81e0 Content-length: 549 SVN��*C��)�D�v�h�<n], [AS_HELP_STRING([--with-gtk=VER], [specify GTK version to use (`1' or `2')]) AS_HELP_STRING([--without-gtk], [do not use GTK (build command-line tools only | no) ;; yes) gtk_version_desired="any"_version_desired" = "no"; then cat <<EOF 'configure' was instructed not to build using GTK. Therefore, PuTTY itself and the other GUI utilities will not be built by the generated Makefile: only the command-line tools such as puttygen, plink and psftp will be built. EOF el Revision-number: 9241 Prop-content-length: 489 Content-length: 489 K 8 svn:date V 27 2011-07-23T11:40:26.332369Z K 7 svn:log V 388 Add a wrapper script called 'configure' at the top level, which runs the real configure script from the unix subdirectory, but with cwd unchanged so that you end up doing a VPATH build in the top-level source directory. Should, ideally, placate the people who expect 'configure' to be at the top level, while still letting _me_ keep all the Unix-specific stuff in the Unix subdirectory. K 10 svn:author V 5 simon PROPS-END Node-path: putty Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 373 Content-length: 373 K 10 svn:ignore V 340 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp *.tds *.td2 *.map Makefile.bor Makefile.cyg Makefile.vc Makefile.lcc MSVC *.log *.GID local Output pageant plink pscp psftp putty puttytel puttygen pterm *.DSA *.RSA *.cnt *.hlp .bmake build.log build.out uxconfig.h empty.h config.status .deps Makefile stamp-h1 PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f718af3c15089762f2b9316b0001823 Text-delta-base-sha1: 8e588ea3776e09dd006c7b344ca37d3be846f43e Text-content-length: 376 Text-content-md5: a2dc6b8da231213be69da37471a54666 Text-content-sha1: 9c40d04fdc177348c5f5b1b7fc23b562a48aa043 Content-length: 376 SVN��m `�,�`�~o into the `unix' subdirectory, run `./configure' and then `make'. Or you can do the same in the top-level directory (we provide a little wrapper that invokes configure one level down), which is more like a normal Unix source archive but doesn't do so well at keeping the per-platform stuff in each platform's subdirectory; it's up to you Node-path: putty/configure Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 78 Text-content-md5: ca366bc56e6badb0c8dce2c34cbee886 Text-content-sha1: 79e12c0de470576c7f86b61ba1283941d4a78800 Content-length: 88 PROPS-END SVN���CCC#!/bin/sh $(echo "$0" | sed '$s!configure$!unix/configure!') "$@" Revision-number: 9242 Prop-content-length: 510 Content-length: 510 K 8 svn:date V 27 2011-07-23T11:58:37.998070Z K 7 svn:log V 409 Add a convenience option to mkfiles.pl for Unix users. If you run 'mkfiles.pl -u', it will do its normal processing, then run mkauto.sh to regenerate configure and Makefile.in, then run configure in the Unix subdirectory to regenerate unix/Makefile. So it's a handy one-stop shop for going all the way from a modified Recipe to the end-product Unix makefile, if you're adding source files during development. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 997192d65c0511ce58cb382d1fcca83d Text-delta-base-sha1: 7c2153eb7073d59b0f31576b31ef74d464670da6 Text-content-length: 913 Text-content-md5: 67129f906817a70e2bebb852c0fe7d7d Text-content-sha1: c77fed6873dd860b07d079e150e45e5f2b7cbc39 Content-length: 913 SVN��-\)Z��3�["�s{�^k�!{�nFile::Basename; use Cwd; if ($#ARGV >= 0 and $ARGV[0] eq "-u") { # Convenience for Unix users: -u means that after we finish what # we're doing here, we also run mkauto.sh and then 'configure' in # the Unix subdirectory. So it's a one-stop shop for regenerating # the actual end-product Unix makefile. # # Arguments supplied after -u go to configure. shift @ARGV; @confargs = @ARGV; $do_unix = 1; }$orig_dir = cwd;##-- MSVC 6 Workspace andchdir $orig_dir; # All done, so do the Unix postprocessing if asked to. if ($do_unix) { chdir $orig_dir; system "./mkauto.sh"; die "mkfiles.pl: mkauto.sh returned $?\n" if $? > 0; chdir ($targetdir = dirname($makefiles{"am"})) or die "$targetdir: chdir: $!\n"; system "./configure", @confargs; die "mkfiles.pl: configure returned $?\n" if $? > 0; } Revision-number: 9243 Prop-content-length: 239 Content-length: 239 K 8 svn:date V 27 2011-07-23T12:10:14.952740Z K 7 svn:log V 138 Make the top-level configure wrapper executable. (I thought I'd done that in the last commit, but svn must have ignored the permissions.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/configure Node-kind: file Node-action: change Prop-delta: true Prop-content-length: 36 Content-length: 36 K 14 svn:executable V 1 * PROPS-END Revision-number: 9244 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9245 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9246 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9247 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9248 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9249 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9250 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9251 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9252 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9253 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9254 Prop-content-length: 1107 Content-length: 1107 K 7 svn:log V 1005 Fix bug in which the SSH-only tools (pscp, psftp) did not honour a nonstandard port number when loading a saved session. Occurs because those tools include be_none.c which defines no entries in backends[] at all, as a result of which settings.c doesn't recognise the word 'ssh' in the saved session's protocol field and instead sets the protocol to something idiotic - which _then_ means that when pscp.c forces the protocol to PROT_SSH, it also resets the port number as it would when overriding a saved session specifying a protocol other than SSH. The immediate solution is to define a new be_ssh.c citing only ssh_backend, and include that in the SSH-only tools. However, I wonder if a better approach (perhaps when I redesign session loading and saving) would be not to be so clever, and just have all the tools contain a complete list of known protocol names for purposes of understanding what's in the saved session data, and complain if you try to use one they don't know how to actually speak. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-07-27T18:43:16.559255Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 47fba86399ba1d40af7f50822dddd072 Text-delta-base-sha1: a758bc1cb6c7004bac0e135a29dd17ce4d8fc12f Text-content-length: 24 Text-content-md5: 58a204096899163765243d463549b974 Text-content-sha1: 858fba8a4c300839e7839f7fea7b86701e9004a7 Content-length: 24 SVN�� �:��^>ssh Node-path: putty/be_none.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 394c1a1a9996d3051f157183eddd80b4 Text-delta-base-sha1: fe1b0b31e9f2a5815c6dc82cd3d8a6ef06cc9f73 Text-content-length: 17 Text-content-md5: 9b5f2eeebfb9f39456f79885d2e5b7a6 Text-content-sha1: 93d4165dc9f1124e1eef1642921e51b8c41c12c3 Content-length: 17 SVN��7/��X��W` Node-path: putty/be_ssh.c Node-kind: file Node-action: add Prop-content-length: 87 Text-delta: true Text-content-length: 415 Text-content-md5: d366887ecf4aef3a55930363cc8423be Text-content-sha1: 89d6c00a736b47ea8d73e45c29c19fbb6c0ec49c Content-length: 502 K 12 svn:keywords V 23 Author Date Id Revision K 13 svn:eol-style V 6 native PROPS-END SVN���/* * Linking module for programs that are restricted to only using SSH * (pscp and psftp). These do not support selection of backend, but * must still have a backends[] array mentioning SSH because * settings.c will want to consult it during session load. */ #include <stdio.h> #include "putty.h" const int be_default_protocol = PROT_SSH; Backend *backends[] = { &ssh_backend, NULL }; Revision-number: 9255 Prop-content-length: 152 Content-length: 152 K 8 svn:date V 27 2011-07-27T18:46:33.926147Z K 7 svn:log V 52 Merge r9254 (the PSCP/PSFTP protocol override fix). K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.61/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06a639e515f4cb30aef0a545bd3a6724 Text-delta-base-sha1: 815ba6adb8a5c007be1e0b4545ab691f2099953d Text-content-length: 24 Text-content-md5: f4a8b4e6b7e7548f92c9483e1e82f01b Text-content-sha1: 633ff3e33b9f23ca07f8f65c0ed26265bef24870 Content-length: 24 SVN�� �:��O>ssh Node-path: putty-branch-0.61/be_none.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 394c1a1a9996d3051f157183eddd80b4 Text-delta-base-sha1: fe1b0b31e9f2a5815c6dc82cd3d8a6ef06cc9f73 Text-content-length: 17 Text-content-md5: 9b5f2eeebfb9f39456f79885d2e5b7a6 Text-content-sha1: 93d4165dc9f1124e1eef1642921e51b8c41c12c3 Content-length: 17 SVN��7/��X��W` Node-path: putty-branch-0.61/be_ssh.c Node-kind: file Node-action: add Node-copyfrom-rev: 9254 Node-copyfrom-path: putty/be_ssh.c Text-copy-source-md5: d366887ecf4aef3a55930363cc8423be Text-copy-source-sha1: 89d6c00a736b47ea8d73e45c29c19fbb6c0ec49c Revision-number: 9256 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9257 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9258 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9259 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9260 Prop-content-length: 453 Content-length: 453 K 7 svn:log V 352 Propagate file permissions in both directions in Unix pscp and psftp. I think I have to consider this to be a separate but related change to the wishlist item 'pscp-filemodes'; that was written before the Unix port existed, and referred to the ability to configure the permissions used for files copied from Windows to Unix - which is still not done. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-08-11T17:59:30.091068Z PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0337374e85d526ee51f90195f751143a Text-delta-base-sha1: 807a50690bf201832d4c5bedae71518dc031843f Text-content-length: 820 Text-content-md5: 09d5231b0c85d39f79c781ff7d647390 Text-content-sha1: d60d3f07034f1c78089cd6f4665868b4e01025a9 Content-length: 820 SVN��D]dB�H��4Z�y.r�EG�7-�Rh� >�q\�Y.�`&�t��Nt�qF� 7permissions) { if (using_sftp) { char *fullname; struct sftp_packet *pktin; struct sftp_request *req, *rreq; struct fxp_attrs attrs attrs.flags = 0; PUT_PERMISSIONS(attrs, permissions); sftp_register(req = fxp_open_send(fullname, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_TRUNC, &attrs if (permissions < 0) permissions = 0644; sprintf(buf, "C%04o %s ", (int)(permissions & 07777)long permissions; /* access permissionspermissionspermissionslo %s %n", &act->permissions, , NULLlong permissions, &permissionspermissions, act.permissions Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dead8cdd188797666b55beb25c8c10fa Text-delta-base-sha1: 68005f3d0d20a235f0285e9fb53c5652feddc553 Text-content-length: 619 Text-content-md5: 02e61d300c2962f4a17bfe8dc9191d4c Text-content-sha1: ec82ad7f43b0900fb0197cc827095a8a5ba8b030 Content-length: 619 SVN��J�-��k+�]/�c;�T��f}�ic�!+�lk�apt�rq�Q=�Z= struct fxp_attrs attrsif (!fxp_stat_recv(pktin, rreq, &attrs)) attrs.flags = 0; sftp_register(req = fxp_open_send(fname, SSH_FXF_READ, NULL, GET_PERMISSIONS(attrs) struct fxp_attrs attrs; long permissions, &permissions); if (!file) { printf("local: unable to open %s\n", fname); return 0; } attrs.flags = 0; PUT_PERMISSIONS(attrs, permissions); if (restart) { sftp_register(req = fxp_open_send(outfname, SSH_FXF_WRITE, &attrs, &attrs)); } Node-path: putty/psftp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 468bc0f1fd530dffbe188d264dc36485 Text-delta-base-sha1: 04c40bb3f35b2650b9e7deaaee03ea5326c58c63 Text-content-length: 201 Text-content-md5: 688b09f589efae16bb9ecee5cda1402f Text-content-sha1: c4c4c89f4e1a54729e63b5bed3f55d39ba6d9d66 Content-length: 201 SVN��-*'�E�t�go�V�Cjperms, mtime and atime can all be NULL if * desired. perms will be -1 if the OS does not support POSIX permissions., long *perms, long perms Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a83eda4dd091da5e06e20dabe5fc45dc Text-delta-base-sha1: 20a24720cc13e8bb9a17d070c510ddb084510594 Text-content-length: 197 Text-content-md5: d31a9b8b81e5aa4a6c18680faf9ec23e Text-content-sha1: fea4ccc93d4af24a5d51b690ee7f19a9e577a22c Content-length: 197 SVN��*!�D��>��Ah�<n, struct fxp_attrs *if (attrs) sftp_pkt_addattrs(pktout, *attrs); else sftp_pkt_adduint32(pktout, 0); /* Node-path: putty/sftp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6921e22d4f4261d8e33f8b269f256970 Text-delta-base-sha1: 6276419f3d2e2b36dbbde4a330557b6db0b3236c Text-content-length: 811 Text-content-md5: d68d657f8b01d1f1ddfcc5ee9c3dc21a Text-content-sha1: 59c1f497286dda499ff2aa90f8b687dc6b567a86 Content-length: 811 SVN��|M � �C�"H�e/* * Copy between the possibly-unused permissions field in an fxp_attrs * and a possibly-negative integer containing the same permissions. */ #define PUT_PERMISSIONS(attrs, perms) \ ((perms) >= 0 ? \ ((attrs).flags |= SSH_FILEXFER_ATTR_PERMISSIONS, \ (attrs).permissions = (perms)) : \ ((attrs).flags &= ~SSH_FILEXFER_ATTR_PERMISSIONS)) #define GET_PERMISSIONS(attrs) \ ((attrs).flags & SSH_FILEXFER_ATTR_PERMISSIONS ? \ (attrs).permissions : -1) 'attrs' contains attributes to be applied to the file * if it's being created. */ struct sftp_request *fxp_open_send(char *path, int type, struct fxp_attrs *attrs Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9a0b0c6637beadcf5b7e45e9fd196b9e Text-delta-base-sha1: 768e175fff292bc185d8ddf4d212df77d725e087 Text-content-length: 270 Text-content-md5: 10ba0d3010162c9716d6e2e9ffeb0cfc Text-content-sha1: 485e65c062507c23a670b98705c83bafd4677993 Content-length: 270 SVN��FVd���'�^)� �\j, long *perms || perms if (perms) *perms = statbuf.st_mod, long perms) { int fd; WFile *ret; fd = open(name, O_CREAT | O_TRUNC | O_WRONLY, (mode_t)(perms ? perms : 0666) Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 572f45a0034dcac36e04843e76b77609 Text-delta-base-sha1: fb4ce2dd7304a3ff9f63460db5e401ab40a6fd9e Text-content-length: 115 Text-content-md5: 7e0be6a43c114eb9f9df4371e80ffc58 Text-content-sha1: 03c2b1b2f04c9508312a4023c87a8b6f9ceb6d1a Content-length: 115 SVN��S+R�U��cU�o2�2!, long *permsif (perms) *perms = -1;, long perms Revision-number: 9261 Prop-content-length: 238 Content-length: 238 K 8 svn:date V 27 2011-08-11T18:11:07.785709Z K 7 svn:log V 137 Bring description up to date for 'pscp-filemodes'. The previous wording predated the Unix port :-) and also predated my revamp in r9260. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/pscp-filemodes Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cd87146bc1852258d133aabadbb39885 Text-delta-base-sha1: fc1731374396d028a018b05f473e3a9b2dd4c342 Text-content-length: 1874 Text-content-md5: 94e09475324e76bac6ad33f062da3eca Text-content-sha1: 6c9834f940e202a5bab310580c0c7559ac65cc96 Content-length: 1874 SVN��|CCCSummary: Control of file permissions in PSCP and PSFTP Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body <p> It would be nice if PSCP and PSFTP could allow user control of the file permissions on files they create during transfers in both directions. <p> As of r9260, permissions are preserved (modulo umask) by the Unix file transfer tools, in both directions and in both SCP and SFTP protocols, and the Windows tools use a non-configurable default (which is 0644 when we're speaking SCP, and unspecified in SFTP meaning that the server will use <em>its</em> default). <p> It would be nice to have more control over this. Thoughts include: <ul> <li> Ability to configure the default used on Windows. <li> Ability to inhibit propagation of existing permissions on Unix, reverting to the Windows-like behaviour (and, as per previous bullet point, ability to configure that default again). <li> Ability to <em>partially</em> propagate existing permissions on Unix. For instance, sometimes you only want to propagate the one property of whether a file is executable or not: imagine a situation in which on one machine all your files are habitually <code>go-rwx</code> and on another they're merely <code>o-rwx</code>. Copying executable files like scripts from the one to the other would want to translate <code>-rwx------</code> to <code>-rwxr-x---</code> and vice versa, whereas copying non-executable files would want to translate <code>-rw-------</code> to <code>-rw-r-----</code> and vice versa. It's not clear how extensive needs in this area might be, and hence what the configuration interface ought to look like. Perhaps a good starting point would just be to add an option to normalise the input permissions into one of <code>-rwxrwxrwx</code> or <code>-rw-rw-rw</code>, and then let the umask take care of the rest. </ul> Revision-number: 9262 Prop-content-length: 522 Content-length: 522 K 8 svn:date V 27 2011-08-11T18:13:34.158409Z K 7 svn:log V 421 If we're printing password prompts to /dev/tty rather than standard error, we should also read the corresponding password inputs from /dev/tty. That way, redirection of Plink's standard input will play nicely with SSH sessions that need interactive login. (This is what we get for disdaining getpass(3) and going it alone, of course. But we had no choice, due to the extra output part way through keyboard-interactive.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 651249d97a502084a96022042d83e4a6 Text-delta-base-sha1: 40606e5dad80c400752cc8db1ec47fd1af081abb Text-content-length: 1183 Text-content-md5: cb2b1d4b6d330a98ae47fd990bd1fa22 Text-content-sha1: ae3dda817fef964b3ad7b37b53b30c23ab28e25e Content-length: 1183 SVN��& JI�7��b\{�D.;�w � �4K��S0�<�"D� x�\J #include <termios.h> #include <unistd.h> #include <fcntls to read and print to the console for password * prompts and the like. Uses /dev/tty or stdin/stderr, in that order * ofopen(FILE **outfp, int *infd) { int fd; if ((fd = open("/dev/tty", O_RDWR)) >= 0) { *infd = fd; *outfp = fdopen(*infd, "w"); } else { *infd = 0; *outfp = stderr; } } static void console_close(FILE *outfp, int infd) { if (outfp != stderr) fclose(outfp); /* will automatically close infd too */ } static void console_prompt_text(FILE *outfp, const char *data, int len) { int i; for (i = 0; i < len; i++) if ((data[i] & 0x60) || (data[i] == '\n')) fputc(data[i], outfp); fflush(outoutfp = NULL; int infdconsole_open(&outfp, &infd)outfp, p->name, l); if (p->name[l-1] != '\n') console_prompt_text(outoutoutinfdinfd, TCSANOW, &newmode); console_prompt_text(outfp, pr->prompt, strlen(pr->prompt)); i = read(infd, pr->result, pr->result_len - 1); tcsetattr(infdoutfp, "\n", 1); } console_close(outfp, infd Revision-number: 9263 Prop-content-length: 299 Content-length: 299 K 8 svn:date V 27 2011-08-12T17:28:47.404774Z K 7 svn:log V 198 Updates to svn:ignore: ignore libversion.a in the top-level directory (for people doing their builds there), and ignore 'compile' in the unix subdirectory (a dropping from autotools that I missed). K 10 svn:author V 5 simon PROPS-END Node-path: putty Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 377 Content-length: 377 K 10 svn:ignore V 344 *.pdb *.ilk *.res *.RES *.pch *.rsp *.obj *.exe *.ncb *.plg *.dsw *.opt *.dsp *.tds *.td2 *.map Makefile.bor Makefile.cyg Makefile.vc Makefile.lcc MSVC *.log *.GID local Output pageant plink pscp psftp putty puttytel puttygen pterm *.DSA *.RSA *.cnt *.hlp .bmake build.log build.out uxconfig.h empty.h config.status .deps Makefile stamp-h1 *.a PROPS-END Node-path: putty/unix Node-kind: dir Node-action: change Prop-delta: true Prop-content-length: 296 Content-length: 296 K 10 svn:ignore V 263 Makefile.am Makefile.in Makefile.gtk Makefile.ux Makefile.local Makefile aclocal.m4 autom4te.cache compile config.status configure depcomp empty.h install-sh local missing plink pterm putty puttytel psftp pscp puttygen stamp-h1 uxconfig.in uxconfig.h *.log .deps PROPS-END Revision-number: 9264 Prop-content-length: 473 Content-length: 473 K 8 svn:date V 27 2011-08-13T14:48:36.666153Z K 7 svn:log V 372 Readjust Pageant's SID check _again_, to make it the union of the policies before and after r9178, and hence able to talk to both 0.60-like and 0.61-like clients. I had failed to consider that many pieces of code derived from PuTTY would have imported the Pageant client code, so we shouldn't randomly stop supporting things just because _we_ aren't using them any more. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6ec62b8127b6ce6571eca3d24ed3ce2c Text-delta-base-sha1: b8b85e304698f31c8368d6358d2df26bebe830ac Text-content-length: 1868 Text-content-md5: a548e39e80973643ce99a3c183847828 Text-content-sha1: c8f25799efb0803f9def4c53f10d4c14b95d555b Content-length: 1868 SVN��,MFx�N�o�L�qr�BS�l�#�-�Ws�q%�ti�y3#ifndef NO_SECURITY /* * Versions of Pageant prior to 0.61 expected this SID on incoming * communications. For backwards compatibility, and more particularly * for compatibility with derived works of PuTTY still using the old * Pageant client code, we accept it as an alternative to the one * returned from get_user_sid() in winpgntc.c. */ PSID get_default_sid(void) { HANDLE proc = NULL; DWORD sidlen; PSECURITY_DESCRIPTOR psd = NULL; PSID sid = NULL, copy = NULL, ret = NULL; if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE, GetCurrentProcessId())) == NULL) goto cleanup; if (p_GetSecurityInfo(proc, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &sid, NULL, NULL, NULL, &psd) != ERROR_SUCCESS) goto cleanup; sidlen = GetLengthSid(sid); copy = (PSID)smalloc(sidlen); if (!CopySid(sidlen, copy, sid)) goto cleanup; /* Success. Move sid into the return value slot, and null it out * to stop the cleanup code freeing it. */ ret = copy; copy = NULL; cleanup: if (proc != NULL) CloseHandle(proc); if (psd != NULL) LocalFree(psd); if (copy != NULL) sfree(copy); return ret; } #endif, ourself2; #endif PSECURITY_DESCRIPTOR psd = NULL; if ((ourself2 = get_default_sid()) == NULL) { #ifdef DEBUG_IPC debug(("couldn't get defaultours2ConvertSidToStringSid(ourself2, &ours2); debug(("got sids:\n oursnew=%s\n oursold=%s\n" " theirs=%s\n", ours, ours2ours2 && !EqualSid(mapowner, ourself2 LocalFree(psd); sfree(ourself); sfree(ourself Revision-number: 9265 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2011-08-13T14:50:54.059841Z K 7 svn:log V 55 Merge r9264 (the Pageant backwards compatibility fix). K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.61/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6ec62b8127b6ce6571eca3d24ed3ce2c Text-delta-base-sha1: b8b85e304698f31c8368d6358d2df26bebe830ac Text-content-length: 1868 Text-content-md5: a548e39e80973643ce99a3c183847828 Text-content-sha1: c8f25799efb0803f9def4c53f10d4c14b95d555b Content-length: 1868 SVN��,MFx�N�o�L�qr�BS�l�#�-�Ws�q%�ti�y3#ifndef NO_SECURITY /* * Versions of Pageant prior to 0.61 expected this SID on incoming * communications. For backwards compatibility, and more particularly * for compatibility with derived works of PuTTY still using the old * Pageant client code, we accept it as an alternative to the one * returned from get_user_sid() in winpgntc.c. */ PSID get_default_sid(void) { HANDLE proc = NULL; DWORD sidlen; PSECURITY_DESCRIPTOR psd = NULL; PSID sid = NULL, copy = NULL, ret = NULL; if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE, GetCurrentProcessId())) == NULL) goto cleanup; if (p_GetSecurityInfo(proc, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &sid, NULL, NULL, NULL, &psd) != ERROR_SUCCESS) goto cleanup; sidlen = GetLengthSid(sid); copy = (PSID)smalloc(sidlen); if (!CopySid(sidlen, copy, sid)) goto cleanup; /* Success. Move sid into the return value slot, and null it out * to stop the cleanup code freeing it. */ ret = copy; copy = NULL; cleanup: if (proc != NULL) CloseHandle(proc); if (psd != NULL) LocalFree(psd); if (copy != NULL) sfree(copy); return ret; } #endif, ourself2; #endif PSECURITY_DESCRIPTOR psd = NULL; if ((ourself2 = get_default_sid()) == NULL) { #ifdef DEBUG_IPC debug(("couldn't get defaultours2ConvertSidToStringSid(ourself2, &ours2); debug(("got sids:\n oursnew=%s\n oursold=%s\n" " theirs=%s\n", ours, ours2ours2 && !EqualSid(mapowner, ourself2 LocalFree(psd); sfree(ourself); sfree(ourself Revision-number: 9266 Prop-content-length: 178 Content-length: 178 K 7 svn:log V 78 Restore data-bits options for "-sercfg" that were accidentally lost in r9214. K 10 svn:author V 5 jacob K 8 svn:date V 27 2011-08-18T10:45:25.135315Z PROPS-END Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f8d95f5576dd0429ade84746bdd06973 Text-delta-base-sha1: aada5cd8a4d1443a645ea31acdfb289719c28a77 Text-content-length: 70 Text-content-md5: 8235bf6bdf011746603592ceef939475 Text-content-sha1: 21fc5dba3864098132ce36239869f70f9300f82e Content-length: 70 SVN��$\ 1�l��?ecase '6': case '7': case '8': case '9 Revision-number: 9267 Prop-content-length: 245 Content-length: 245 K 8 svn:date V 27 2011-08-18T10:47:45.687614Z K 7 svn:log V 144 Fix a suspected bug in PSCP's SCP protocol fallback from r9214 (untested since I don't have access to a server that still needs this fallback). K 10 svn:author V 5 jacob PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 09d5231b0c85d39f79c781ff7d647390 Text-delta-base-sha1: d60d3f07034f1c78089cd6f4665868b4e01025a9 Text-content-length: 27 Text-content-md5: 950b1a09f407ccc527663a0b45ce16d8 Text-content-sha1: b9336864fb16eeef9b924b3588b04a208ae27d87 Content-length: 27 SVN��]Z �-��*3cmd Revision-number: 9268 Prop-content-length: 167 Content-length: 167 K 8 svn:date V 27 2011-08-19T14:55:24.205666Z K 7 svn:log V 67 Fix bug with setting window title on Unix that came in with r9214. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a46fc4517ddf3f2feb77cb68e50ba3c Text-delta-base-sha1: d11a08f17bda4451d8a0e53322b861d16a6d8255 Text-content-length: 42 Text-content-md5: c19aaa5f0f2456a6f7d6a7b4b515235f Text-content-sha1: fe6faad9e2347f23af19ad5974dde91f307a23dd Content-length: 42 SVN���� �$��Y'new�tt��t� Revision-number: 9269 Prop-content-length: 659 Content-length: 659 K 8 svn:date V 27 2011-08-20T07:56:19.588639Z K 7 svn:log V 558 Add a -U option to mkfiles.pl, which is just like -u except that it runs configure at the top level rather than the unix subdirectory. I'm getting into the idea of even doing it that way myself, because then I can do VPATH builds from the same source tree elsewhere. (Autoconf seems to be fine with doing multiple VPATH builds from the same source tree in different build directories, but gets upset if you try to do a VPATH build when you've done a normal build in the real configure directory. So this way I do what autoconf sees as _only_ VPATH builds.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 67129f906817a70e2bebb852c0fe7d7d Text-delta-base-sha1: c77fed6873dd860b07d079e150e45e5f2b7cbc39 Text-content-length: 393 Text-content-md5: abc239a4430565d20f7be40831c0c6d7 Text-content-sha1: bd0bf87039838d7458462f4930306eb12767640c Content-length: 393 SVN��\!a�L��>\<�UN�a{($ARGV[0] eq "-u" or $ARGV[0] eq "-U")# # -U is identical, but runs 'configure' at the _top_ level, for # people who habitually do that. $do_unix = ($ARGV[0] eq "-U" ? 2 : 1); shift @ARGV; @confargs = @ARGVif ($do_unix == 1) { chdir ($targetdir = dirname($makefiles{"am"})) or die "$targetdir: chdir: $!\n"; } Revision-number: 9270 Prop-content-length: 550 Content-length: 550 K 8 svn:date V 27 2011-08-20T08:18:56.936071Z K 7 svn:log V 449 Instead of testing for different versions of GTK in increasing order of preference so that the later ones overwrite the configured stuff from the older ones, test in decreasing order of preference and stop as soon as one is successful. Fixes a problem in which autoconfiguration on a system containing only GTK 1 would go wrong because the _failed_ test for GTK 2 would overwrite some but not all of the variables set by the successful test for v1. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d0cc91a79bd5d506597f4e49c03fb7c7 Text-delta-base-sha1: a721ecd0dd5559502d02215d44f066ca6cac81e0 Text-content-length: 278 Text-content-md5: d6a0dd54b0240d482e63522c53c17a5b Text-content-sha1: 9030751cc19747118b2aac17290de56263c5cac3 Content-length: 278 SVN��Cs�2�<�&�<�(2 and GTK 1, in descending order of preference. If # we can't find either, have the makefile only build the CLI programs. gtk=none case "$gtk_version_desired:$gtk" in 2:none | any:nonecase "$gtk_version_desired:$gtk" in 1:none | any:none Revision-number: 9271 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9272 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9273 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9274 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2011-08-25T18:10:58.777486Z K 7 svn:log V 17 Punctuation fix. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35d2a743d815af0da75700b101970646 Text-delta-base-sha1: d5eab75000345c8e148aba2ed19b00c4a734a4ec Text-content-length: 25 Text-content-md5: bb0e615983bc13998e833cdd82b8a4a7 Text-content-sha1: 8823a47176d55d80a84ca56801312d0146a6a98b Content-length: 25 SVN��,, �;��p<. Revision-number: 9275 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2011-08-31T17:05:09.111026Z K 7 svn:log V 85 Expand on this bug entry, since I've just been bitten by another special case of it. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/half-closed Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e2d9fbde22eae4dfc07d900eae68cb09 Text-delta-base-sha1: e7f1d23eb84470c297aac0fab227c5c5ef209d4d Text-content-length: 1695 Text-content-md5: 0f4b30364348a0ee3f68acca85d07fae Text-content-sha1: 5f6d25368d52a71ed5e0965ebe874f5ba9bc89cc Content-length: 1695 SVN��u �u� <p> <b>SGT, 2011-08-31</b>: This also affects Plink in some circumstances. For instance, if you do a command along the lines of<pre>plink myhost 'cat > thing' < thing</pre>then Plink can (intermittently, depending on how the server's window behaviour) accidentaly send the <code>SSH2_MSG_CHANNEL_EOF</code> <em>before</em> the rest of the data in the channel's outbuffer. This could be sort-of-fixed by setting the <code>pending_close</code> flag in <code>ssh_special</code> rather than immediately sending the EOF message, but that's only a partial fix since it would cause sending of CLOSE rather than EOF. I think it would be better to treat that as part of the full revamp described here, and fix it in a unified way. <p> While I'm here, another thing we would have to work out is when to <em>break</em> the rule about EOFs being independent in each direction. GUI PuTTY, for instance, <em>cannot</em> generate an EOF from client to server, since there's no UI action to cause one; for that case we'd have to adopt a rule that has more or less the effect of the current behaviour, in the assumption that that's what login sessions generally expect. <p> Another possibly relevant issue is <a href="https://bugzilla.mindrot.org/show_bug.cgi?id=1818">this bug</a> which I raised against OpenSSH last year. If our channel-closing behaviour changes so that the sending of EOF is decoupled from sending the first of the CLOSE messages which actually destroy the channel itself, it would make it more convenient to work around that ambiguous aspect of the ssh-connection protocol by waiting until we've seen replies to all our winadj requests before sending the actual CLOSE. Revision-number: 9276 Prop-content-length: 238 Content-length: 238 K 7 svn:log V 137 Fix assertion failure in wprefs() when the list is zero-length. Breaks any session-save operation in PuTTYtel due to the empty GSS list. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-09-13T07:35:14.773871Z PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 021303541815d141bda567214779f472 Text-delta-base-sha1: 1396cae312a1c459008a0111821cc303644d1c7f Text-content-length: 125 Text-content-md5: d4cfbfdfb3241924e9b55090e750746c Text-content-sha1: a59038099eb98e5073b4f7c9f4b52a18937deea6 Content-length: 125 SVN��^�3�M�i�`%(maxlen > 0 ? 1 : 0) + strlen(s); } } buf = snewn(maxlen + 1); *p = '\0'; Revision-number: 9277 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 Merge r9276 (the PuTTYtel session-saving assertion failure fix). K 10 svn:author V 5 simon K 8 svn:date V 27 2011-09-13T07:35:55.297479Z PROPS-END Node-path: putty-branch-0.61/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ad795f592b98894f27fc85344714f8c Text-delta-base-sha1: d372ce0147c5f4d81952fce5296d715a26dcce3a Text-content-length: 125 Text-content-md5: 9ad67376a8b7fa96f39b1417625a6fd4 Text-content-sha1: 735a2d0d86c18952ccb98dcfa858f7e2dd45c58a Content-length: 125 SVN��12^�o�M�[%� '(maxlen > 0 ? 1 : 0) + strlen(s); } } buf = snewn(maxlen + 1); *p = '\0'; Revision-number: 9278 Prop-content-length: 273 Content-length: 273 K 10 svn:author V 5 simon K 8 svn:date V 27 2011-09-13T10:27:00.780341Z K 7 svn:log V 172 In term_init(), copy stuff out of the conf _before_ calling power_on(), since the latter calls term_schedule_cblink which expects term->blink_cur to have been initialised. PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 69262bbc9c5c280c418acb984d3417ca Text-delta-base-sha1: 1c708556cdba0afbd033e8c6e83edd280843f3a0 Text-content-length: 75 Text-content-md5: 1e56465400531a89e704bfc92ff9f0d2 Text-content-sha1: 4baf49817bb1fc3137661d8a14e91ed7087b6b59 Content-length: 75 SVN�����w��vl�x_copy_stuff_from_conf(term)���� Revision-number: 9279 Prop-content-length: 1108 Content-length: 1108 K 8 svn:date V 27 2011-09-13T11:44:03.604945Z K 7 svn:log V 1006 Revamp of EOF handling in all network connections, pipes and other data channels. Should comprehensively fix 'half-closed', in principle, though it's a big and complicated change and so there's a good chance I've made at least one mistake somewhere. All connections should now be rigorous about propagating end-of-file (or end-of-data-stream, or socket shutdown, or whatever) independently in both directions, except in frontends with no mechanism for sending explicit EOF (e.g. interactive terminal windows) or backends which are basically always used for interactive sessions so it's unlikely that an application would be depending on independent EOF (telnet, rlogin). EOF should now never accidentally be sent while there's still buffered data to go out before it. (May help fix 'portfwd-corrupt', and also I noticed recently that the ssh main session channel can accidentally have MSG_EOF sent before the output bufchain is clear, leading to embarrassment when it subsequently does send the output). K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0491b322832bae519609403be2dd8896 Text-delta-base-sha1: 9792ef8e1c92aafd4771b48d53bd0a64258887cb Text-content-length: 81 Text-content-md5: e746142572ca9e6a31f83634910e9d20 Text-content-sha1: 5ad0f4a6ad1071fe3f56acd73ebeb115fe80e8b1 Content-length: 81 SVN��J6�#��R�qYwrite_eof) (Socket swrite_eof(s) (((*s)->write_eof) (s Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f069f30ebaab806f083fba018c6a95c Text-delta-base-sha1: c9681b9a502a9be1cc5bfe0540d40c7abe948d60 Text-content-length: 287 Text-content-md5: a0f527a513facf78c84c77d322012f5a Text-content-sha1: e7bdfcc26d784f65653636778d8025f918634b1b Content-length: 287 SVN�� f�?�M�\{�JV * FIXME: except we could initiate a full close here instead of * just an outgoing EOF? ssh.c currently has no API for that, but * it could. */ if (pr->c) sshfwd_write_eof(pr->c); void pfd_send_eof(Socket s) { sk_write_eof(s); } Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4fceeea869b72e5cb3f6d58f4c927b0b Text-delta-base-sha1: 2ba3f043fbab4c22ecc61893a8873dd74c401447 Text-content-length: 232 Text-content-md5: 3ec86070744167b459cfbd6b140cdd60 Text-content-sha1: dd841d6a5f4c5853e76de64e7e9902fefffae19b Content-length: 232 SVN��0$6�S�N�,7�bhK�H�<[�% we have a pending EOF to send, send it */ if (p->pending_eof) sk_write_eofwrite_eof ps->pending_eof = 1; return; } sk_write_eof(ps->sub_socketwrite_eofpending_eof Node-path: putty/proxy.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d3a4038ef49a28f0a59660fe230d4991 Text-delta-base-sha1: 21eb84eddbd7fcb15cbb735905499cc4f2423c29 Text-content-length: 40 Text-content-md5: acd3216a9e790ac6d1e17c5e3acdab5e Text-content-sha1: f74d31d6f07ffa021ae511cef07a4158165d97da Content-length: 40 SVN��^s �~��b| int pending_eof Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 950b1a09f407ccc527663a0b45ce16d8 Text-delta-base-sha1: b9336864fb16eeef9b924b3588b04a208ae27d87 Text-content-length: 467 Text-content-md5: 1c4282d64fa04ce37e73d6bdec60c524 Text-content-sha1: 5973595d19ae351336d41a6b41ff412ceab0201a Content-length: 467 SVN��Z %�>��]<c��=�Tint sent_eof = FALSEint from_backend_eof(void *frontend) { /* * We expect to be the party deciding when to close the * connection, so if we see EOF before we sent it ourselves, we * should panic. */ if (!sent_eof) { connection_fatal(frontend, "Received unexpected end-of-file from server"); } return FALSE; sent_eof = TRUE sent_eof = TRUE Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02e61d300c2962f4a17bfe8dc9191d4c Text-delta-base-sha1: ec82ad7f43b0900fb0197cc827095a8a5ba8b030 Text-content-length: 509 Text-content-md5: f11729db176985568bdea27726fd8482 Text-content-sha1: 9ce11d4500691639ef6097c2480f03bc6a44e4c0 Content-length: 509 SVN��e/@�q��E��7�AK� d�n�+nint sent_eof = FALSE; sent_eof = TRUE sent_eof = TRUEfrom_backend_eof(void *frontend) { /* * We expect to be the party deciding when to close the * connection, so if we see EOF before we sent it ourselves, we * should panic. */ if (!sent_eof) { connection_fatal(frontend, "Received unexpected end-of-file from SFTP server"); } return FALSE; sent_eof = TRUE Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 07cf54ae1b26d9be6af0167773f5d4e3 Text-delta-base-sha1: a81864438e4b45d2fcafe2ff8a464111e120100c Text-content-length: 320 Text-content-md5: d849d4d549cbde718329e01e721b9e24 Text-content-sha1: f83646618a5de2310597fab6569798b60bcb03a2 Content-length: 320 SVN��@f#�.�#�+/* Called when the back end wants to indicate that EOF has arrived on * the server-to-client stream. Returns FALSE to indicate that we * intend to keep the session open in the other direction, or TRUE to * indicate that if they're closing so are we. */ int from_backend_eof(void *frontend Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c037d79137b2f173dd6ac6aea59f15b8 Text-delta-base-sha1: 34fba07083e012301aa0fc89afd9904ca558bda0 Text-content-length: 1675 Text-content-md5: 628ece2c2ed9d784376ff62d56d6dbdd Text-content-sha1: 6231949a9c02488a8bae85cc4a1e3ad19f196bfe Content-length: 1675 SVN��Y(W�x��v� ~j�9Q�a �P@ int sent_console_eof, sent_socket_eofvoid raw_check_close(Raw raw) { /* * Called after we send EOF on either the socket or the console. * Its job is to wind up the session once we have sent EOF on both. */ if (raw->sent_console_eof && raw->sent_socket_eof) { if (raw->s) { sk_close(raw->s); raw->s = NULL; notify_remote_exit(raw->frontend); } }error_msg) { /* A socket error has occurred. */ if (raw->s) { sk_close(raw->s); raw->s = NULL; notify_remote_exit(raw->frontend); } logevent(raw->frontend, error_msg); connection_fatal(raw->frontend, "%s", error_msg); } else { /* Otherwise, the remote side closed the connection normally. */ if (!raw->sent_console_eof && from_backend_eof(raw->frontend)) { /* * The front end wants us to close the outgoing side of the * connection as soon as we see EOF from the far end. */ if (!raw->sent_socket_eof) { if (raw->s) sk_write_eof(raw->s); raw->sent_socket_eof= TRUE; } } raw->sent_console_eof = TRUE; raw_check_close(raw); } raw->sent_console_eof = raw->sent_socket_eof = FALSE We only handle outgoing EOF here. */ static void raw_special(void *handle, Telnet_Special code) { Raw raw = (Raw) handle; if (code == TS_EOF && raw->s) { sk_write_eof(raw->s); raw->sent_socket_eof= TRUE; raw_check_close(raw); } Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 711afc4eb386bf05ddc5c1edc5be70bf Text-delta-base-sha1: 1f729251a5d5ecc752788358a5e9fdcad09938e3 Text-content-length: 232 Text-content-md5: cb2dbd3c458bab4b374504c2ff990d66 Text-content-sha1: 3b30d52fd0c9ad9fba6f671aaeb675f8432ac62e Content-length: 232 SVN�� [ P��P� ~ /* * We don't implement independent EOF in each direction for Telnet * connections; as soon as we get word that the remote side has * sent us EOF, we wind up the whole connection. */ Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 737330abc9baa583ee9de184844190b8 Text-delta-base-sha1: 38f0dd2bca1458b4e9971dba18306356dfcd23e5 Text-content-length: 10230 Text-content-md5: 0310e80c20bb6363fc9736bd612aff4d Text-content-sha1: 77784ec330a4420a9840cfc4c0adee7ffedd8a55 Content-length: 10230 SVN����X�a��p^ �v�astatic void ssh_channel_destroy(struct ssh_channel *c * In SSH-2, the four bits mean: * * 1 We have sent SSH2_MSG_CHANNEL_EOF. * 2 We have sent SSH2_MSG_CHANNEL_CLOSE. * 4 We have received SSH2_MSG_CHANNEL_EOF. * 8 We have received SSH2_MSG_CHANNEL_CLOSE. * * A channel is completely finished with when we have both sent * and received CLOSE. * * The symbolic constants below use the SSH-2 terminology, which * is a bit confusing in SSH-1, but we have to use _something_. */ #define CLOSES_SENT_EOF 1 #define CLOSES_SENT_CLOSE 2 #define CLOSES_RCVD_EOF 4 #define CLOSES_RCVD_CLOSE 8 int closes; /* * This flag indicates that an EOF is pending on the outgoing side * of the channel: that is, wherever we're getting the data for * this channel has sent us some data followed by EOF. We can't * actually send the EOF until we've finished sending the data, so * we set this flag instead to remind us to do so once our buffer * is clear. */ int pending_eof int sent_console_eof���]�j�7�k{d�@�}Y�m[�E� d�8v�{v�d~�v_W�rzT�S!�P�c�f �h|o bad formatting")); crStop(0); } logevent("Encrypted session key"); { int cipher_chosen = 0, warn = 0; char *cipher_string = NULL; int i; for (i = 0; !cipher_chosen && i < CIPHER_MAX; i++) { int next_cipher = conf_get_int_int(ssh->conf, CONF_ssh_cipherlist, i); if (next_cipher == CIPHER_WARN) { /* If/when we choose a cipher, warn about it */ warn = 1; } else if (next_cipher == CIPHER_AES) { /* XXX Probably don't need to mention this. */ logevent("AES not supported in SSH-1, skipping"); } else { switch (next_cipher) { case CIPHER_3DES: s->cipher_type = SSH_CIPHER_3DES; cipher_string = "static void ssh_channel_try_eof(struct ssh_channel *c) { Ssh ssh = c->ssh; assert(c->pending_eof); /* precondition for calling us */ if (c->halfopen) return; /* can't close: not even opened yet */ if (ssh->version == 2 && bufchain_size(&c->v.v2.outbuffer) > 0) return; /* can't send EOF: pending outgoing data */ if (ssh->version == 1) { send_packet(ssh, SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid, PKT_END); c->closes |= CLOSES_SENT_EOF; } else { struct Packet *pktout; pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_EOF); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_send(ssh, pktout); c->closes |= CLOSES_SENT_EOF; if (!((CLOSES_SENT_EOF | CLOSES_RCVD_EOF) & ~c->closes)) { /* * Also send MSG_CLOSE. */ pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_send(ssh, pktout); c->closes |= CLOSES_SENT_CLOSE; } } c->pending_eof = FALSE; /* we've sent it now */ } void sshfwd_write_eofc->closes & CLOSES_SENT_EOF) return; c->pending_eof = TRUE; ssh_channel_try_eof(c);eofeofc->u.a.message = NULLeofpending_eof ssh_channel_try_eof(c if (pktin->type == SSH1_MSG_CHANNEL_CLOSE && !(c->closes & CLOSES_RCVD_EOF)) { /* * Received CHANNEL_CLOSE, which we translate into * outgoing EOF. */ int send_close = FALSE; c->closes |= CLOSES_RCVD_EOF; switch (c->type) { case CHAN_X11: if (c->u.x11.s) x11_send_eof(c->u.x11.s); else send_close = TRUE; case CHAN_SOCKDATA: if (c->u.pfd.s) x11_send_eof(c->u.pfd.s); else send_close = TRUE; case CHAN_AGENT: send_close = TRUE; } if (send_close && !(c->closes & CLOSES_SENT_EOF)) { send_packet(ssh, SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid, PKT_END); c->closes |= CLOSES_SENT_EOF; } } if (pktin->type == SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION && !(c->closes & CLOSES_RCVD_CLOSE)) { if (!(c->closes & CLOSES_SENT_EOF)) { bombout(("Received CHANNEL_CLOSE_CONFIRMATION for channel %d" " for which we never sent CHANNEL_CLOSE\n", i)); } c->closes |= CLOSES_RCVD_CLOSE; } if (!((CLOSES_SENT_EOF | CLOSES_RCVD_EOF) & ~c->closes) && !(c->closes & CLOSES_SENT_CLOSE)) { send_packet(ssh, SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION, PKT_INT, c->remoteid, PKT_END); c->closes |= CLOSES_SENT_CLOSE; } if (!((CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE) & ~c->closes)) ssh_channel_destroy(c); int re = bufchain_size(&c->v.v2.outbuffer); /* * And if there's no data pending but we need to send an EOF, send * it. */ if (!ret && c->pending_eof) ssh_channel_try_eof(c); return ret & CLOSES_SENT_EOF) return; /* don't send on channels we've EOFedeof has * already sent EOF on; there's no point, since it won't be * sending any more data anyway. */ if (c->closes & CLOSES_RCVD_EOF(c->closes & CLOSES_SENT_EOF)�NTW(�*��"(�Y`2��B!�7B�~[H�wW� 4�v�!C�Lb�zK�o_, length); break; case CHAN_X11: bufsize = x11_send(c->u.x11.s, data, length); break; case CHAN_SOCKDATA: bufsize = pfd_send(c->u.pfd.s, data, length); break; case CHAN_AGENT: while (length > 0) { if (c->u.a.lensofar < 4) { unsigned int l = min(4 - c->u.a.lensofar, (unsigned)length); memcpy(c->u.a.msglen + c->u.a.lensofar, data, l); data += l; length -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == 4) { c->u.a.totallen = 4 + GET_32BIT(c->u.a.msglen); c->u.a.message = snewn(c->u.a.totallen, unsigned char); memcpy(c->u.a.message, c->u.a.msglen, 4); } if (c->u.a.lensofar >= 4 && length > 0) { unsigned int l = min(c->u.a.totallen - c->u.a.lensofar, (unsigned)length); memcpy(c->u.a.message + c->u.a.lensofar, data, l); data += l; length -= l; c->u.a.lensofar += l; } if (c->u.a.lensofar == c->u.a.totallen) { void *reply; int replylen; if (agent_query(c->u c->u.a.message = NULL_channel_destroy(struct ssh_channel *c) { Ssh ssh = c->ssh; switch (c->type) { case CHAN_MAINSESSION: ssh->mainchan = NULL; update_specials_menu(ssh->frontend); break; case CHAN_X11: if (c->u.x11.s != NULL) x11_close(c->u.x11.s); logevent("Forwarded X11 connection terminated"); break; case CHAN_AGENT: sfree(c->u.a.message); break; case CHAN_SOCKDATA: if (c->u.pfd.s != NULL) pfd_close(c->u.pfd.s); logevent("Forwarded port closed"); break; } del234(ssh->channels, c); if (ssh->version == 2) ssh->version == 2 && !conf_get_int(ssh->conf, CONF_ssh_no_shell) && count234(ssh->channels) == 0) { /* * We used to send SSH_MSG_DISCONNECT here, * because I'd believed that _every_ conforming * SSH-2 connection had to end with a disconnect * being sent by at least one side; apparently * I was wrong and it's perfectly OK to * unceremoniously slam the connection shut * when you're done, and indeed OpenSSH feels * this is more polite than sending a * DISCONNECT. So now we don't. */ ssh_disconnect(ssh, "All channels closed", NULL, 0, TRUE); } } static void ssh2_channel_check_close(struct ssh_channel *c) { Ssh ssh = c->ssh; struct Packet *pktout; if ((c->closes & (CLOSES_SENT_EOF | CLOSES_RCVD_EOF | CLOSES_SENT_CLOSE)) == (CLOSES_SENT_EOF | CLOSES_RCVD_EOF)) { /* * We have both sent and received EOF, which means the channel * is in final wind-up. But we haven't sent CLOSE, so let's. c->closes |= CLOSES_SENT_CLOSE; } if (!((CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE) & ~c->closes)) { /* * We have both sent and received CLOSE, which means we're * completely done with the channel. */ ssh_channel_destroy(c); } } static void ssh2_channel_got_eof(struct ssh_channel *c) { if (c->closes & CLOSES_RCVD_EOF) return; /* already seen EOF */ c->closes |= CLOSES_RCVD_EOF; if (c->type == CHAN_X11) { x11_send_eof(c->u.x11.s); } else if (c->type == CHAN_AGENT) { /* Manufacture an outgoing EOF in response to the incoming one. */ sshfwd_write_eof(c); } else if (c->type == CHAN_SOCKDATA) { pfd_send_eof(c->u.pfd.s); } else if (c->type == CHAN_MAINSESSION) { Ssh ssh = c->ssh; if (!ssh->sent_console_eof && from_backend_eof(ssh->frontend)) { /* * The front end wants us to close the outgoing side of the * connection as soon as we see EOF from the far end. */ sshfwd_write_eof(c); } ssh->sent_console_eof = TRUE; } ssh2_channel_check_close(c); ssh2_channel_got_eof(c); } static void ssh2_msg_channel_close/* * When we receive CLOSE on a channel, we assume it comes with an * implied EOF if we haven't seen EOF yet. */ ssh2_channel_got_eof(c); /* * Now process the actual close. */ if (!(c->closes & CLOSES_RCVD_CLOSE)) { c->closes |= CLOSES_RCVD_CLOSE; ssh2_channel_check_close(cpending_eof) ssh_channel_try_eof(c); ssh->sent_console_eof = FALSE sshfwd_write_eof(ssh->mainchan Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fece3c9680cf549e936787d138461c39 Text-delta-base-sha1: 9b2b3c1ec1d73ddbba511a78acb128c5fcbdd62f Text-content-length: 175 Text-content-md5: ade8154c1b4fc0e13ce0bdae5f0bd351 Text-content-sha1: 4e1562797ed1111ba7107b56674b1d239144adc8 Content-length: 175 SVN��$p �*�h�C�1>�H\int sshfwd_write(struct ssh_channel *c, char *, int); extern void sshfwd_write_eof(struct ssh_channel *csend_eof(Socket ssend_eof(Socket s Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 94700f1f50da947c86414a8bd4ca43b3 Text-delta-base-sha1: 0ad3c15aaa6aaaaae1a5c57164344b943f16fe4b Text-content-length: 230 Text-content-md5: 3b3da6ad8e804ee21ae49ed96a4290c2 Text-content-sha1: fc9356002e292e50f65d1263531529b5f157adbe Content-length: 230 SVN��IJ�Y�J�vS/* * We don't implement independent EOF in each direction for Telnet * connections; as soon as we get word that the remote side has * sent us EOF, we wind up the whole connection. */ Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c19aaa5f0f2456a6f7d6a7b4b515235f Text-delta-base-sha1: fe6faad9e2347f23af19ad5974dde91f307a23dd Text-content-length: 248 Text-content-md5: 5ff5420720feaf3b11d11a2f05ae8cf7 Text-content-sha1: 6f4a207fdf415296ca39f3f95ed47d1628de60b8 Content-length: 248 SVN���� d�g�d�5_from_backend_eof(void *frontend) { return TRUE; /* do respond to incoming EOF with outgoing */�t`ll�t�equest(GTK_WIDGET(inst->window), &req); if (inst->gravity & 1) x += gdk_screen_width() - req.width; Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48096b0679dfe7fd561b4f1e9a65bb6d Text-delta-base-sha1: 908d7d27e6cdc60f3313c103dbb77cc8addf761f Text-content-length: 1094 Text-content-md5: c43addcafa048055ed9ceabbd3555b4e Text-content-sha1: 81301445cdd814fc95aeee35bf285bf93a290f36 Content-length: 1094 SVN�� ^`X�r�G�l�ai�=�"=�pL�i)n� ��{%X�y�w_�4 �I@enum { EOF_NO, EOF_PENDING, EOF_SENT } outgoingeof; int incomingeofwrite_eof(Socket swrite_eofoutgoingeof = EOF_NO; ret->incomingeofoutgoingeof = EOF_NO; ret->incomingeofoutgoingeof = EOF_NO; ret->incomingeof /* * If we reach here, we've finished sending everything we might * have needed to send. Send EOF, if we need to. */ if (s->outgoingeof == EOF_PENDING) { shutdown(s->s, SHUT_WR); s->outgoingeof = EOF_SENT; } /* * Also update the select status, because we don't need to select * for writing any more. */assert(s->outgoingeof == EOF_NO)assert(s->outgoingeof == EOF_NO)void sk_tcp_write_eof(Socket sock) { Actual_Socket s = (Actual_Socket) sock; assert(s->outgoingeof == EOF_NO); /* * Mark the socket as pending outgoing EOF. */ s->outgoingeof = EOF_PENDING s->incomingeof = TRUE; /* stop trying to read now */ uxsel_tell(s); && !s->incomingeof Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d638ec4c39a2655eefe579107685edc7 Text-delta-base-sha1: 5181366eec746120a6502d16f802635939e89008 Text-content-length: 1182 Text-content-md5: 715acc1f584d81ed1d6ec048fa47faa6 Text-content-sha1: 413c28b78780f12c13317ac9bba6881a823f7a3f Content-length: 1182 SVN��)p+e�M��jKq�F?�>.�kF�eV�Edenum { EOF_NO, EOF_PENDING, EOF_SENT } outgoingeof> 0) { fl = fcntl(fd, F_GETFL); if (fl != -1 && !(fl & O_NONBLOCK)) fcntl(fd, F_SETFL, fl | O_NONBLOCK); do { bufchain_prefix(chain, &senddata, &sendlen); ret = write(fd, senddata, sendlen); if (ret > 0) bufchain_consume(chain, ret); } while (ret == sendlen && bufchain_size(chain) != 0); if (fl != -1 && !(fl & O_NONBLOCK)) fcntl(fd, F_SETFL, fl); if (ret < 0 && errno != EAGAIN) { perror(is_stderr ? "stderr: write" : "stdout: write"); exit(1); } } if (outgoingeof == EOF_PENDING && bufchain_size(&stdout_data) == 0) { close(STDOUT_FILENO); outgoingeof = EOF_SENT; } assert(outgoingeof == EOF_NO);from_backend_eof(void *frontend_handle) { assert(outgoingeof == EOF_NO); outgoingeof = EOF_PENDING; try_output(FALSE); return FALSE; /* do not respond to incoming EOF with outgoingbufchain_init(&stdout_data); bufchain_init(&stderr_data); outgoingeof = EOF_NO Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6da35f2221e8e0ac28bf52ad8d095365 Text-delta-base-sha1: 45842731ae3ae22a037ee548786c921fce11e743 Text-content-length: 746 Text-content-md5: 6a55d8cab4fa2c17ae05f7603d888c34 Text-content-sha1: 26750fb9480f8c640d3b80521b94fe6067f3e7bb Content-length: 746 SVN��(4*�1��3/<�q@�)|� 1� �[~�QW enum { EOF_NO, EOF_PENDING, EOF_SENT } outgoingeofif (ps->to_cmd >= 0) { del234(localproxy_by_tofd, ps); uxsel_del(ps->to_cmd); close(ps->to_cmd); } del234(localproxy_by_fromfd, ps); uxsel_del(ps->fromps->outgoingeof == EOF_PENDING) { del234(localproxy_by_tofd, ps); close(ps->to_cmd); uxsel_del(ps->to_cmd); ps->to_cmd = -1; ps->outgoingeof = EOF_SENT;assert(ps->outgoingeof == EOF_NO)write_eof (Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; assert(ps->outgoingeof == EOF_NO); ps->outgoingeof = EOF_PENDING; localproxy_try_send(pswrite_eof ret->outgoingeof = EOF_NO Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4bccac17da64f0940a60be3dbf6ccb38 Text-delta-base-sha1: 2fcb554a372183586bdc42826d442262554b6478 Text-content-length: 142 Text-content-md5: 67b30a7aa8d681889d1b5dadeb8e1f51 Text-content-sha1: a138aa4c1b78bdf7c1008d54b59f6ca114164bfe Content-length: 142 SVN���������$ d�w�d�5ofrom_backend_eof(void *frontend) { return TRUE; /* do respond to incoming EOF with outgoing */ Node-path: putty/windows/winhandl.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c243aeb0e17d5eec0204f6a69979c7a3 Text-delta-base-sha1: d24746ee4957fbdb6da9950b31be49b70d90f776 Text-content-length: 887 Text-content-md5: e67ce2ad59b8b44a190d7e9245733042 Text-content-sha1: 55e846a5ce0375e098ee6e7a4bb8a7ab23373ab7 Content-length: 887 SVN��,~*@�=��b<h�C��h�xx�ij�@l enum { EOF_NO, EOF_PENDING, EOF_SENT } outgoingeof; else if (!ctx->busy && bufchain_size(&ctx->queued_data) == 0 && ctx->outgoingeof == EOF_PENDING) { CloseHandle(ctx->h); ctx->h = INVALID_HANDLE_VALUE; ctx->outgoingeof = EOF_SENT; } } /* outgoingeof = EOF_NOassert(h->u.o.outgoingeof == EOF_NOvoid handle_write_eof(struct handle *h) { /* * This function is called when we want to proactively send an * end-of-file notification on the handle. We can only do this by * actually closing the handle - so never call this on a * bidirectional handle if we're still interested in its incoming * direction! */ assert(h->output); if (!h->u.o.outgoingeof == EOF_NO) { h->u.o.outgoingeof = EOF_PENDING; handle_try_output(&h->u.o); } Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0762630f24f65a4c53db8e89f5fdaf7d Text-delta-base-sha1: 9b0dd3bf837ffd5eac10ee33448a2df6e91cdbd2 Text-content-length: 850 Text-content-md5: b986e274e89c50e20ae0809efd7cc32f Text-content-sha1: 659f0b95a9fe7ad22d972390849d2cdc3d68646f Content-length: 850 SVN��>BzJ�����^k�63�A_�S�x_�kV�'6�x_�QK�O6�Y`w�|2�'�b'_�o{�8enum { EOF_NO, EOF_PENDING, EOF_SENT } outgoingeofshutdown, (SOCKETshutdownwrite_eof(Socket swrite_eofoutgoingeof = EOF_NOwrite_eofoutgoingeof = EOF_NOwrite_eofoutgoingeof = EOF_NO /* * If we reach here, we've finished sending everything we might * have needed to send. Send EOF, if we need to. */ if (s->outgoingeof == EOF_PENDING) { p_shutdown(s->s, SD_SEND); s->outgoingeof = EOF_SENT;assert(s->outgoingeof == EOF_NO)assert(s->outgoingeof == EOF_NO)static void sk_tcp_write_eof(Socket sock) { Actual_Socket s = (Actual_Socket) sock; assert(s->outgoingeof == EOF_NO); /* * Mark the socket as pending outgoing EOF. */ s->outgoingeof = EOF_PENDING Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f8453e15fef704aebe21d64ba912b53a Text-delta-base-sha1: 04a7ce41c252dffe53753210ebc150b6939b09a5 Text-content-length: 173 Text-content-md5: f07bec5c920ccc8b28b7a1a87eef9ede Text-content-sha1: 64acf1f16b329eca8211008972e1d146fead9b2d Content-length: 173 SVN��_| ���S from_backend_eof(void *frontend_handle) { handle_write_eof(stdout_handle); return FALSE; /* do not respond to incoming EOF with outgoing Node-path: putty/windows/winproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 98873d963af15ad63b7811491491c959 Text-delta-base-sha1: b12c2a5248b69ebf9e18eae1c792132470c2f2d2 Text-content-length: 145 Text-content-md5: ee6306dc58db4cdd615f1ab7b4d6d9fe Text-content-sha1: 1ff780515e74a2c24f6778d20312a4c79c623883 Content-length: 145 SVN��=cu��l�(o�7write_eof(Socket s) { Local_Proxy_Socket ps = (Local_Proxy_Socket) s; handle_write_eof(ps->to_cmd_hwrite_eof Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 575503e325b37519ed940e4ac005a4fc Text-delta-base-sha1: 25387d75d7ae74cbd4bfba8868d1df6c0d16141c Text-content-length: 61 Text-content-md5: e9f3d3b5b3975f4f210b9597d713b78c Text-content-sha1: 360795719866ce0f773c5e99bb7019c53ea12ae6 Content-length: 61 SVN��4] &���void handle_write_eof(struct handle *h Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e958a747a678e8086af5989f065cd02 Text-delta-base-sha1: e6b822ef3d2125b3689cf5b157823e40dc7764b1 Text-content-length: 293 Text-content-md5: 4c667c458079d0bb6397e6ac87f5bb10 Text-content-sha1: 277541ede67e274cf4f83477fa423bf884dac60a Content-length: 293 SVN��Z�W�>�y�> * FIXME: except we could initiate a full close here instead of * just an outgoing EOF? ssh.c currently has no API for that, but * it could. */ sshfwd_write_eof(pr->cwrite_eof(pr->c void x11_send_eof(Socket s) { sk_write_eof(s); } Revision-number: 9280 Prop-content-length: 308 Content-length: 308 K 8 svn:date V 27 2011-09-13T11:56:25.332090Z K 7 svn:log V 207 Nearly forgot noting this down in the 'half-closed' bug entry: don't send CHANNEL_CLOSE until we have acks for all our winadj requests. Should work around https://bugzilla.mindrot.org/show_bug.cgi?id=1818 . K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0310e80c20bb6363fc9736bd612aff4d Text-delta-base-sha1: 77784ec330a4420a9840cfc4c0adee7ffedd8a55 Text-content-length: 873 Text-content-md5: 8501b8433ad9c24e3ebfbc13bdadbce8 Text-content-sha1: 4db2fa6df74f17621ce7089145f4118fa745fdf1 Content-length: 873 SVN���� +�p��e^2_channel_check_close(struct ssh_channel *c���q�}�4�w(!ret) { bombout(("SSH-1 public key encryptions failed due t/* * We may now initiate channel-closing procedures, if that winadj * was the last thing outstanding before we send CHANNEL_CLOSE. */ ssh2_channel_check_close(c)�T7|w���3!f (data) { int bufsize = 0; c->v.v2.locwindow -= length; c->v.v2.remlocwin -= length; switch (c->type) { case CHAN_MAINSESSION: bufsize = from_backend(ssh->frontend, pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA, data && !c->v.v2.winadj_head) { /* * We have both sent and received EOF, and we have no * outstanding winadj channel requests, which means the * channel is in final wind-up. But we haven't sent CLOSE, so * let's do so now Revision-number: 9281 Prop-content-length: 354 Content-length: 354 K 8 svn:date V 27 2011-09-13T11:57:33.053054Z K 7 svn:log V 253 Mark 'half-closed' as fixed (perhaps a little optimistically, but that's always been our policy with complicated bug fixes - we can always open it again if it turns out not to be quite fixed after all), and add a note on the subject to portfwd-corrupt. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/half-closed Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f4b30364348a0ee3f68acca85d07fae Text-delta-base-sha1: 5f6d25368d52a71ed5e0965ebe874f5ba9bc89cc Text-content-length: 264 Text-content-md5: 96258eea3200d51fcb76e66a25a0e2d3 Text-content-sha1: fd3f034fa1daea4a557b28aabfbecc29dd0d81c2 Content-length: 264 SVN��rn�v�� u_Fixed-in: r9280 <b>SGT, 2011-09-13</b>: just committed r9279 and r9280, which <em>should</em> fix these issues throughout the code base. However, it's quite likely I've made a mistake or two somewhere, since it was quite a complicated fix Node-path: putty-wishlist/data/portfwd-corrupt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9fcc7929e8b77e5bde3bfd9063ced9f Text-delta-base-sha1: 0ee933dd730a697c17439d66f46f3900a1fe3573 Text-content-length: 141 Text-content-md5: f5792d542d764fce28d2423c20f2099f Text-content-sha1: 5527b9900febd26d9a17178df1a750a382aa540e Content-length: 141 SVN��MF w�0�w�.<em>Update, 2011-09-13: I (SGT) have just (hopefully) fixed the half-closed issue, so perhaps that will be improved now Revision-number: 9282 Prop-content-length: 639 Content-length: 639 K 8 svn:date V 27 2011-09-13T15:38:12.288748Z K 7 svn:log V 538 Changed my mind about the EOF policy in SSH mode: I think the SSH backend should unilaterally assume outgoing EOF when it sees incoming EOF, if and only if the main session channel is talking to a pty. (Because ptys don't have a strong concept of EOF in the first place, that seems like a sensible place to draw the line.) This fixes a bug introduced by today's revamp in which if you used Unix Plink to run a console session it would hang after you hit ^D - because the server had sent EOF, but it was waiting for a client-side EOF too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8501b8433ad9c24e3ebfbc13bdadbce8 Text-delta-base-sha1: 4db2fa6df74f17621ce7089145f4118fa745fdf1 Text-content-length: 1061 Text-content-md5: be0fa96f6be34bb1a2de3fb5a8421c93 Text-content-sha1: aa8bf10a7437b5d83a16503a75075208f163ad69 Content-length: 1061 SVN����F�^�F�\] int got_pty; /* affects EOF behaviour on main channel */���sG�3�,�Z ret = rsaencrypt(s->rsabuf, hostkey.bytes, &servkey); } if else { logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)", ssh->ospeed, ssh->ispeed); ssh->got_pty = TRUE; }�7 �j�D�I%�nl�gPpkt_getuint32(pktin) != SSH2_EXTENDED_DATA_STDERR) return; /* extended but not stderr */ ssh_pkt_getstring(pktin, &data, &length); i (from_backend_eof(ssh->frontend) || ssh->got_pty)) { /* * Either from_backend_eof told us that the front end * wants us to close the outgoing side of the connection * as soon as we see EOF from the far end, or else we've * unilaterally decided to do that because we've allocated * a remote pty and hence EOF isn't a particularly * meaningful concept ssh->got_pty = TRUE ssh->got_pty Revision-number: 9283 Prop-content-length: 583 Content-length: 583 K 10 svn:author V 5 simon K 8 svn:date V 27 2011-09-14T09:09:35.597207Z K 7 svn:log V 482 Another tweak to EOF policy: invent an outgoing EOF on receipt of an incoming CHANNEL_CLOSE, if it's the main session channel. The idea is that invocations such as 'plink -T hostname sh' (running a shell without a remote pty) can be exited by typing 'exit' to the remote shell, without plink blocking forever waiting for outgoing EOF. I think it would be better to do the same for all other channel types too, but that would need an extra API call which I haven't implemented yet. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: be0fa96f6be34bb1a2de3fb5a8421c93 Text-delta-base-sha1: aa8bf10a7437b5d83a16503a75075208f163ad69 Text-content-length: 1149 Text-content-md5: e43d3454fcff85e381e349957ade0d79 Text-content-sha1: 754c4c9994b6ff630a283fcf272c2e8348049e7a Content-length: 1149 SVN����������������� T�W�T�UGAnd we also send an outgoing EOF, if we haven't already, on the * assumption that CLOSE is a pretty forceful announcement that * the remote side is doing away with the entire channel. (If it * had wanted to send us EOF and continue receiving data from us, * it would have just sent CHANNEL_EOF.) * * For the moment, this policy applies to the main session channel * only, because we have a convenient mechanism (ssh->send_ok) for * ceasing to read from our local data source. Ideally I think * we'd do this for auxiliary channels too, which would need an * extra API call in the forwarding modules. */ if (c->type == CHAN_MAINSESSION && !(c->closes & CLOSES_SENT_EOF)) { sshfwd_write_eof(ssh->mainchan); ssh->send_ok = 0; /* now stop trying to read from stdin */ }�uE DDEI,J9J9NYKYKFJ9HJ9KfLJ9J9YuJ9KFF9F9F9sh->fallback_cmd; } Backend ssh_= { init,freereconfigsendbufferizspecialgetsconnectereturn_exitcodendokldiscprovideogctxunthrottlcfg_info"ssh"PROT_SSH22 }; Revision-number: 9284 Prop-content-length: 431 Content-length: 431 K 8 svn:date V 27 2011-09-14T09:49:00.564674Z K 7 svn:log V 330 No, I take that back: we _do_ have a mechanism for suppressing reads from forwarding data sources which will be good enough to last until we close the socket, in the form of the override_throttle() functions. So this finishes up the work in r9283, by manufacturing outgoing EOF in response to incoming CLOSE on all channel types. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e43d3454fcff85e381e349957ade0d79 Text-delta-base-sha1: 754c4c9994b6ff630a283fcf272c2e8348049e7a Text-content-length: 732 Text-content-md5: cebc8b2b25e0e646c3bd512deb3a0f12 Text-content-sha1: 0f27e4cb3df4a2259191f7891ac17d7f9f96e042 Content-length: 732 SVN������������������ O��O�%/ if (!(c->closes & CLOSES_SENT_EOF)) { /* * Make sure we don't read any more from whatever our local * data source is for this channel. */ switch (c->type) { case CHAN_MAINSESSION: ssh->send_ok = 0; /* stop trying to read from stdin */ break; case CHAN_X11: x11_override_throttle(c->u.x11.s, 1); break; case CHAN_SOCKDATA: pfd_override_throttle(c->u.pfd.s, 1); break; } /* * Send outgoing EOF. */ sshfwd_write_eof(ssh->mainchan);�u8CC�u�llback_cmd(void *handle) { Ssh ssh = (Ssh) handle; return s Revision-number: 9285 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2011-09-14T10:44:16.023885Z K 7 svn:log V 37 Fix spurious newline in <pre> block. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/half-closed Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 96258eea3200d51fcb76e66a25a0e2d3 Text-delta-base-sha1: fd3f034fa1daea4a557b28aabfbecc29dd0d81c2 Text-content-length: 586 Text-content-md5: d51111328f2ca2b6a26328c4b269e511 Text-content-sha1: 44c1ad17f2ae3e01cb26660c62a45b123dfd3d9d Content-length: 586 SVN��rt 2��2�=5 <pre>plink myhost 'cat > thing' < thing</pre> then Plink can (intermittently, depending on how the server's window behaviour) accidentaly send the <code>SSH2_MSG_CHANNEL_EOF</code> <em>before</em> the rest of the data in the channel's outbuffer. This could be sort-of-fixed by setting the <code>pending_close</code> flag in <code>ssh_special</code> rather than immediately sending the EOF message, but that's only a partial fix since it would cause sending of CLOSE rather than EOF. I think it would be better to treat that as part of the full revamp described Revision-number: 9286 Prop-content-length: 123 Content-length: 123 K 8 svn:date V 27 2011-09-14T10:45:28.220915Z K 7 svn:log V 23 More formatting fixes. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/half-closed Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d51111328f2ca2b6a26328c4b269e511 Text-delta-base-sha1: 44c1ad17f2ae3e01cb26660c62a45b123dfd3d9d Text-content-length: 70 Text-content-md5: ecec237849f1c34c5b0ddb6749cc0936 Text-content-sha1: 4a39eb35b690aea19811a7e714e33b30fe6f374c Content-length: 70 SVN��tu+�a�� �athe server's window behaviour) accidentalp> Revision-number: 9287 Prop-content-length: 124 Content-length: 124 K 8 svn:date V 27 2011-09-14T10:45:56.288903Z K 7 svn:log V 24 Another formatting fix! K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/portfwd-corrupt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f5792d542d764fce28d2423c20f2099f Text-delta-base-sha1: 5527b9900febd26d9a17178df1a750a382aa540e Text-content-length: 26 Text-content-md5: ec5af3e68a8288fca5857c8f7283c3d1 Text-content-sha1: 0ad5545849ae239a39007160d72e64d78cea57b6 Content-length: 26 SVN��FK �F���F</em> Revision-number: 9288 Prop-content-length: 730 Content-length: 730 K 7 svn:log V 629 Create empty.h (used to force rebuilds of version.o by the automake makefile) as a side effect of running mkfiles.pl. The automake docs observe that the BUILT_SOURCES list is only automatically built by plain 'make' or 'make all' or a couple of other targets, so the sequence './configure && make plink' from a freshly unpacked tar file would previously fail for lack of empty.h. If empty.h had important _content_ that needed to be built at compile time, of course, I wouldn't be able to fix it like this; but since the only important thing is the timestamp, I can just make sure it already exists at the time of first build. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-09-14T15:54:26.983034Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 58a204096899163765243d463549b974 Text-delta-base-sha1: 858fba8a4c300839e7839f7fea7b86701e9004a7 Text-content-length: 199 Text-content-md5: d75a7eb7ac4e7b01bfdca957a2fd3261 Text-content-sha1: 0d4e5a88a212037deb247e986969b26b837a87a7 Content-length: 199 SVN��. /��/�i2Empty file touched by automake makefile to force rebuild of version.o */' >$@ !end !begin >empty.h /* Empty file touched by automake makefile to force rebuild of version.o */ Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: abc239a4430565d20f7be40831c0c6d7 Text-delta-base-sha1: bd0bf87039838d7458462f4930306eb12767640c Text-content-length: 200 Text-content-md5: 9d1c1d396e4345ebe3c040c17a3d0a24 Text-content-sha1: f2d6caa7e76555eba95a749a9404fa0e8bd5136b Content-length: 200 SVN��!O(�4��~0k�u,$_[1] =~ /^>(.*)/) { $divert = \$auxfiles{$1}; } elsforeach $aux (sort keys %auxfiles) { open AUX, ">$aux"; print AUX $auxfiles{$aux}; close AUX; } Revision-number: 9289 Prop-content-length: 544 Content-length: 544 K 8 svn:date V 27 2011-09-16T08:49:08.890760Z K 7 svn:log V 443 Stop using GDK's wrapper on the X11 font functions (GdkFont). All X11 font operations are now done directly using Xlib calls, and the only interaction with GDK within the x11font mechanism is to get the X ids for drawables, GCs and the X display itself. This should remove an obstacle to porting to GTK3, and also makes the XFontStruct for loaded fonts more readily available, which I hope will come in handy for another plan I have in mind. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2233f7042c67fea635083c79cc936122 Text-delta-base-sha1: 627a1162dad67c117df69cb78248fb155696f24d Text-content-length: 3933 Text-content-md5: 930719b42fb66babd54f600cb423bdfa Text-content-sha1: df33164be77d5d2c47d807208f343086d30f64d1 Content-length: 3933 SVN��`==�Z��P�s�=�2jq�v:�j=T�'U�1w�$D�+DP�$B�(j� �k&�{ ;�%u�%� H�r4�j$�*�AN�r �k�Q$[�P �t�RX11 font implementation, directly using Xlib callsXFontStrucXDrawString or XDrawString16, etcstatic char *x11_guess_derived_font_name(XFontStruct *xfs, int bold, int wide) { Display *disp = GDK_DISPLAY(XFontStruct *xfsXTextWidth16(xfs, &space, 1); } else { return XTextWidth(xfs, "0", 1); } } { struct x11font *xfont; XFontStruct *xfs; Display *disp = GDK_DISPLAY()xfs = XLoadQueryFont(disp, name); if (!xfs) return NULLdir, asc, desc; XCharStruct cs; XChar2b text; text.byte1 = '\0'; text.byte2 = '\x12'; XTextExtents16(xfs, &text, 1, &dir, &asc, &desc, &cs); xfs, sixteen_bit); xfont->u.ascent = xfs->ascent; xfont->u.descent = xfsxfsDisplay *disp = GDK_DISPLAY();XFreeFont(disp, Display *disp = GDK_DISPLAY();XLoadQueryFont(disp, derived_name); xfont->allocated[sfid] = TRUE; sfree(derived_name); /* Note that xfont->fonts[sfid] may still be NULL, if XLQF failed. */ } #if !GTK_CHECK_VERSION(2,0,0) #define GDK_DRAWABLE_XID(d) GDK_WINDOW_XWINDOW(d) /* GTK1's name for this */ #endif static void x11font_really_draw_text_16(GdkDrawable *target, XFontStruct *xfs, GC gc, int x, int y, const XChar2b *string, int nchars, int shadowoffset, int fontvariable, int cellwidth) { Display *disp = GDK_DISPLAY(); int step, nsteps, centre1; nsteps = nchars; centre = TRUE; } else { /* * In a fixed-pitch font, we can draw the whole lot in one go. */ step = nchars; nsteps = 1; centre = FALSE; } while (nsteps-- > 0) { int X = x; if (centre) X += (cellwidth - XTextWidth16(xfs, string, step)) / 2; XDrawString16(disp, GDK_DRAWABLE_XID(target), gc, X, y, string, step); if (shadowoffset) XDrawString16(disp, GDK_DRAWABLE_XID(target), gc, X + shadowoffset, y, string, step); x += cellwidth; string += step; } } static void x11font_really_draw_text(GdkDrawable *target, XFontStruct *xfs, GC gc, int x, int y, const char *string, int nchars, int shadowoffset, int fontvariable, int cellwidth) { Display *disp = GDK_DISPLAY(); int step, nsteps, centre1; nsteps = nchars; centre = TRUE; } else { /* * In a fixed-pitch font, we can draw the whole lot in one go. */ step = nchars; nsteps = 1; centre = FALSE; } while (nsteps-- > 0) { int X = x; if (centre) X += (cellwidth - XTextWidth(xfs, string, step)) / 2; XDrawString(disp, GDK_DRAWABLE_XID(target), gc, X, y, string, step); if (shadowoffset) XDrawString(disp, GDK_DRAWABLE_XID(target), gc, dk { Display *disp = GDK_DISPLAY(); struct x11font *xfont = (struct x11font *)font; GC gc = GDK_GC_XGC(gdkgc); int sfid; int shadowoffset = 0offset = xfont->shadowoffsetoffset = xfont->shadowoffsetXSetFont(disp, gc, xfont->fonts[sfid]->fid);_16(target, xfont->fonts[sfid], gc, x, y, xcs, nchars, shadowoffset, len, XFontStruct *xfs; Display *disp = GDK_DISPLAY(); Atom fontprop, fontprop2; unsigned long ret; xfs = XLoadQueryFont(disp, name); if (!xfs) return NULL; /* didn't make sense to us, sorry */ XFreeFont(disp, xfsXFreeFont(disp, xfs); Revision-number: 9290 Prop-content-length: 438 Content-length: 438 K 8 svn:date V 27 2011-09-16T09:01:41.819196Z K 7 svn:log V 337 Remove empty.h from CLEANFILES, so that after mkfiles.pl has constructed it it won't be deleted again by 'make clean'. The effect is that not only does this work (as r9288 arranged), ./configure; make plink but these work too: ./configure; make; make clean; make plink ./configure; make; make distclean; ./configure; make plink K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d75a7eb7ac4e7b01bfdca957a2fd3261 Text-delta-base-sha1: 0d4e5a88a212037deb247e986969b26b837a87a7 Text-content-length: 20 Text-content-md5: e126d772c899e8b7ec8fe505d1799fae Text-content-sha1: b6f36b03cedb7dda25efb570d1170f961f1fe11e Content-length: 20 SVN��. ��`��9u Revision-number: 9291 Prop-content-length: 151 Content-length: 151 K 8 svn:date V 27 2011-09-16T19:18:52.325503Z K 7 svn:log V 51 Add some missing consts in character set handling. K 10 svn:author V 5 simon PROPS-END Node-path: putty/charset/charset.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 55b7537173fa138ab2c42580adc88db6 Text-delta-base-sha1: 31fc4f7ad6a5cff51e42639605e6d265115b77e2 Text-content-length: 139 Text-content-md5: 958bde3d3bf8ab9bb579dedbd9c7f216 Text-content-sha1: 7a6979864ebd34a269cfd58f5917e34ad99f8569 Content-length: 139 SVN��Ap��� �8Monst char **input, int *inlen, const wchar_t **input, int *inlen, Node-path: putty/charset/fromucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ed7bb4af4f69225aca07207b799e46a Text-delta-base-sha1: 7340a0e1c8a885914b27dce1af36c720073d4341 Text-content-length: 80 Text-content-md5: f42eeb105d2317f3591e7968cb7a102a Text-content-sha1: e1d435fa967c3b1205955dd216ce184cf9597a3e Content-length: 80 SVN��` ;�h��\const wchar_t **input, int *inlen, Node-path: putty/charset/toucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f0a85c60f40b459c1f69005a1b99175 Text-delta-base-sha1: 46d5e09f8d7d0e0179900700a3fb1d2d45437ae9 Text-content-length: 74 Text-content-md5: 5cc0fcbd9131798d1f53668bae5af68a Text-content-sha1: fcec5074bf21d3fa42668383a18da747c94dc8c4 Content-length: 74 SVN��'D 5�s�� onst char **input, int *inlen, Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d849d4d549cbde718329e01e721b9e24 Text-delta-base-sha1: f83646618a5de2310597fab6569798b60bcb03a2 Text-content-length: 40 Text-content-md5: 5d1c1f0bb1a26e2746319a159170a4eb Text-content-sha1: 0e7ead0cd4ea67a7f4cb62ac6861afeb76ca012b Content-length: 40 SVN��fr �,��a*�\ onstconst Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5ff5420720feaf3b11d11a2f05ae8cf7 Text-delta-base-sha1: 6f4a207fdf415296ca39f3f95ed47d1628de60b8 Text-content-length: 113 Text-content-md5: 7953d3617da83a7c2a377e3f2b3dcd87 Text-content-sha1: b4a570a7f479f441b51fb4c1fba23d7f84d5e6d8 Content-length: 113 SVN����!� ��z �[; const wchar_tconst �`� �`�n req; gtk_widget_size_r Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b773013f1a07a0517a2e93a70f99055a Text-delta-base-sha1: 697c489aba4adc2e1857aaeb8a2033351e04a72c Text-content-length: 88 Text-content-md5: aed64a9759340afad60e4b32a3f9a66b Text-content-sha1: 7b7862718dcd2d68b258677fc9d0364d00dcc8b0 Content-length: 88 SVN��c1� ��X �<b�T�otonstconst; const char; const char Node-path: putty/windows/winucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 558f1f4affa58fb166206da167158827 Text-delta-base-sha1: 335479f92314714250bd12db828243a5b9ff5f6b Text-content-length: 41 Text-content-md5: a6ca4610d1ec95e0077558a2486414f2 Text-content-sha1: 77d3468860e6030e7f296aa6eeefc8cd3c4bd538 Content-length: 41 SVN��w �?��P>�k constonst Revision-number: 9292 Prop-content-length: 392 Content-length: 392 K 7 svn:log V 291 Change the unifont API so that text is passed right down to the individual font implementation as wchar_t, rather than having to be converted by the client into the appropriate MBCS/SBCS. This also means I can remove 'real_charset' from the public-facing contents of the unifont structure. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-09-16T19:18:53.537317Z PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 930719b42fb66babd54f600cb423bdfa Text-delta-base-sha1: df33164be77d5d2c47d807208f343086d30f64d1 Text-content-length: 1934 Text-content-md5: 4ec02d1401e9da494022d1f63fb16284 Text-content-sha1: 64ff49a6745f3d5f4342e50a5940db536cd5408a Content-length: 1934 SVN��= %Z���3�yQG�:�;Q�{?�uv�eq`�Cv�N=�#0�*W�{C�iV��U�[[�`6"�A5�T|R�>�jJ�L4���%wchar_twchar_treal_charset is the charset used when translating text into the * font's internal encoding inside draw_text(). This need not be * the same as the public_charset provided to the client; for * example, public_charset might be CS_ISO8859_1 while * real_charset is CS_ISO8859_1_X11. */ int real_charsetwchar_tcan directly use our Unicode input string. */ XChar2b *xcs; int i; xcs = snewn(len, XChar2b); for (i = 0; i < len; i++) { xcs[i].byte1 = string[i] >> 8; xcs[i].byte2 = stringlen } else { /* * This X font has 8-bit indices, so we must convert to the * appropriate character set. */ char *sbstring = snewn(len+1, char); int sblen = wc_to_mb(xfont->real_charset, 0, string, len, sbstring, len+1, ".", NULL, NULL); x11font_really_draw_text(target, xfont->fonts[sfid], gc, x, y, sbstring, sblen, shadowoffset, xfont->variable, cellwidth * mult); sfree(sbstringwchar_twchar_tchar *utfstring, *utfptr; int utflen/* * Pango always expects UTF-8, so convert the input wide character * string to UTF-8. */ utfstring = snewn(len*6+1, char); /* UTF-8 has max 6 bytes/char */ utflen = wc_to_mb(CS_UTF8, 0, string, len, utfstring, len*6+1, ".", NULL, NULL); utfptr = utfstring; while (utfutflen && (unsigned char)utfptr[clen] >= 0x80 && (unsigned char)utfptrutfptrutfutflen && (unsigned char)utfptr[clen] >= 0x80 && (unsigned char)utfptr[clen] < 0xC0) clen++; n++; pango_layout_set_text(layout, utfptrutfptrutflen -= clen; utfptr += clen; x += n * cellwidth; } sfree(utfstring);wchar_tLLL Node-path: putty/unix/gtkfont.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f07f918fc3213c63254c123e83752e3 Text-delta-base-sha1: ec2c51dbbfdbbf3df0acf0a5a543508c8b1a8b6b Text-content-length: 50 Text-content-md5: 20bb23e233d4421c28580733831a0090 Text-content-sha1: 2fd873930785bf9d1b1255cbc510d296de94b382 Content-length: 50 SVN��0�c��|�(/ int publicwchar_t Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7953d3617da83a7c2a377e3f2b3dcd87 Text-delta-base-sha1: b4a570a7f479f441b51fb4c1fba23d7f84d5e6d8 Text-content-length: 738 Text-content-md5: 99a379972a77be1485ba865aa0a2eafe Text-content-sha1: d7abd592baafe4de9b3408a495a20fa7c58ebaa4 Content-length: 738 SVN����4�0� �d+for (combining = 0; combining < ncombining; combining++) { unifont_draw_text(inst->pixmap, gc, inst->fonts[fontid], x*inst->font_width+inst->window_border, y*inst->font_height+inst->window_border+inst->fonts[0]->ascent, text + combining, len, widefactor > 1, bold, inst->font_widthn req; gtk_widget_size_request(GTK_WIDGET(inst->window), &req); if (inst->gravity & 1) x += gdk_screen_width() - req.width; if (inst->gravity & 2) y += gdk_screen_height() - req.height; gtk_window_set_position(GTK_WINDOW(inst->window), GTK_WIN_POS_NONE); gtk_widget_set_upo��U��U+ Revision-number: 9293 Prop-content-length: 464 Content-length: 464 K 7 svn:log V 363 Support font fallback even when an X11 server-side font is selected, by introducing a wrapper around an individual unifont which falls back to Pango (which already has built-in fallback) in the case where the selected font doesn't support the glyph in question. The wrapper itself is a (vestigial) subclass of unifont, to minimise disturbance at the call sites. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-09-16T19:18:54.660226Z PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ec02d1401e9da494022d1f63fb16284 Text-delta-base-sha1: 64ff49a6745f3d5f4342e50a5940db536cd5408a Text-content-length: 9050 Text-content-md5: ae20c39e1399a5a5b4ff5b3e3528f467 Text-content-sha1: 66e8f3d4db54de8a5e30dae9fb1fc06cbb8e7cd7 Content-length: 9050 SVN�� N}��i�;2�pel�;dN�S�=o�No� W�1�_i�:@)�4M�:�S=�@a�[��q�=RQ�J�Vj�)?�`A�Uq�A@5�R�R]�A@�x(unifont *(*create_fallback)(GtkWidget *widget, int height, int wide, int bold, int shadowoffset, int shadowalways); void (*destroy)(unifont *font); int (*has_glyph)(unifont *font, wchar_t glyphint x11font_has_glyph(unifont *font, wchar_t glyph);NULL, /* no fallback fonts in X11 */ x11font_destroy, x11font_has_glyphint x11_font_has_glyph(XFontStruct *xfs, int byte1, int byte2) { int index; /* * Not to be confused with x11font_has_glyph, which is a method of * the x11font 'class' and hence takes a unifont as argument. This * is the low-level function which grubs about in an actual * XFontStruct to see if a given glyph exists. * * We must do this ourselves rather than letting Xlib's * XTextExtents16 do the job, because XTextExtents will helpfully * substitute the font's default_char for any missing glyph and * not tell us it did so, which precisely won't help us find out * which glyphs _are_ missing. * * The man page for XQueryFont is rather confusing about how the * per_char array in the XFontStruct is laid out, because it gives * formulae for determining the two-byte X character code _from_ * an index into the per_char array. Going the other way, it's * rather simpler: * * The valid character codes have byte1 between min_byte1 and * max_byte1 inclusive, and byte2 between min_char_or_byte2 and * max_char_or_byte2 inclusive. This gives a rectangle of size * (max_byte2-min_byte1+1) by * (max_char_or_byte2-min_char_or_byte2+1), which is precisely the * rectangle encoded in the per_char array. Hence, given a * character code which is valid in the sense that it falls * somewhere in that rectangle, its index in per_char is given by * setting * * x = byte2 - min_char_or_byte2 * y = byte1 - min_byte1 * index = y * (max_char_or_byte2-min_char_or_byte2+1) + x * * If min_byte1 and min_byte2 are both zero, that's a special case * which can be treated as if min_byte2 was 1 instead, i.e. the * per_char array just runs from min_char_or_byte2 to * max_char_or_byte2 inclusive, and byte1 should always be zero. */ if (byte2 < xfs->min_char_or_byte2 || byte2 > xfs->max_char_or_byte2) return FALSE; if (xfs->min_byte1 == 0 && xfs->max_byte1 == 0) { index = byte2 - xfs->min_char_or_byte2; } else { if (byte1 < xfs->min_byte1 || byte1 > xfs->max_byte1) return FALSE; index = ((byte2 - xfs->min_char_or_byte2) + ((byte1 - xfs->min_byte1) * (xfs->max_char_or_byte2 - xfs->min_char_or_byte2 + 1))); } return (xfs->per_char[index].ascent + xfs->per_char[index].descent > 0 || xfs->per_char[index].width > 0); font * is encoded as ISO-8859-1, and has valid glyphs in the * low character positions, it is assumed that those * glyphs are the VT100 line-drawing character set. */ if (pubcs == CS_ISO8859_1) { int ch; for (ch = 1; ch < 32; ch++) if (!x11_font_has_glyph(xfs, 0, ch)) break; if (ch == 32) realcs = CS_ISO8859_1_X11; u.want_fallback = TRUEstatic int x11font_has_glyph(unifont *font, wchar_t glyph) { struct x11font *xfont = (struct x11font *)fontvalue. */ return x11_font_has_glyph(xfont->fonts[0], glyph >> 8, glyph & 0xFFsbstring[2]; int sblen = wc_to_mb(xfont->real_charset, 0, &glyph, 1, sbstring, 2, "", NULL, NULL); if (!sbstring[0]) return FALSE; /* not even in the charset */ return x11_font_has_glyph(xfont->fonts[0], 0, sbstring[0]); }int pangofont_has_glyph(unifont *font, wchar_t glyph);unifont *pangofont_create_fallback(GtkWidget *widget, int height, int wide, int bold, create_fallback, pangofont_destroy, pangofont_has_glyph_internal(GtkWidget *widget, PangoContext *ctx, PangoFontDescription *desc, int wide, int bold, int shadowoffset, int shadowalways) { struct pangofont *pfont; #ifndef PANGO_PRE_1POINT6 PangoFontMap *map; #endif PangoFontset *fset; PangoFontMetrics *metrics; pfont->u.want_fallback = FALSE { PangoContext *ctx; PangoFontDescription *desc return pangofont_create_internal(widget, ctx, desc, wide, bold, shadowoffset, shadowalways); } static unifont *pangofont_create_fallback(GtkWidget *widget, int height, int wide, int bold, int shadowoffset, int shadowalways) { PangoContext *ctx; PangoFontDescription *desc; desc = pango_font_description_from_string("Monospace"pango_font_description_set_absolute_size(desc, height * PANGO_SCALE); return pangofont_create_internal(widget, ctx, desc, wide, bold, shadowoffset, shadowalways)int pangofont_has_glyph(unifont *font, wchar_t glyph) { /* Pango implements font fallback, so assume it has everything */ return TRUE; } * The 'multifont' subclass is omitted here, as discussed above./* ----- * Multiple-font wrapper. This is a type of unifont which encapsulates * up to two other unifonts, permitting missing glyphs in the main * font to be filled in by a fallback font. * * This is a type of unifont just like the previous two, but it has a * separate constructor which is manually called by the client, so it * doesn't appear in the list of available font types enumerated by * unifont_create. This means it's not used by unifontsel either, so * it doesn't need to support any methods except draw_text and * destroy. */ static void multivoid multifont_destroy(unifont *font); struct multifont { struct unifont u; unifont *main; unifont *fallback; }; static const struct unifont_vtable multifont_vtable = { NULL, /* creation is done specially */ NULL, multifont_destroy, NULL, multifont_draw_text, NULL, NULL, NULL, "client", }; unifont *multifont_create(GtkWidget *widget, const char *name, int wide, int bold, int shadowoffset, int shadowalways) { int i; unifont *font, *fallback; struct multifont *mfont; font = unifont_create(widget, name, wide, bold, shadowoffset, shadowalways); if (!font) return NULL; if (font->want_fallback) { for (i = 0; i < lenof(unifont_types); i++) { if (unifont_types[i]->create_fallback) { fallback = unifont_types[i]->create_fallback (widget, font->height, wide, bold, shadowoffset, shadowalways); if (fallback) break; } } } /* * Construct our multifont. Public members are all copied from the * primary font we're wrapping. */ mfont = snew(struct multifont); mfont->u.vt = &multifont_vtable; mfont->u.width = font->width; mfont->u.ascent = font->ascent; mfont->u.descent = font->descent; mfont->u.height = font->height; mfont->u.public_charset = font->public_charset; mfont->u.want_fallback = FALSE; /* shouldn't be needed, but just in case */ mfont->main = font; mfont->fallback = fallback; return (unifont *)mfont; } static void multifont_destroy(unifont *font) { struct multifont *mfont = (struct multifont *)font; unifont_destroy(mfont->main); if (mfont->fallback) unifont_destroy(mfont->fallback); sfree(font); } static void multi { struct multifont *mfont = (struct multifont *)font; int ok, i; while (len > 0) { /* * Find a maximal sequence of characters which are, or are * not, supported by our main font. */ ok = mfont->main->vt->has_glyph(mfont->main, string[0]); for (i = 1; i < len && !mfont->main->vt->has_glyph(mfont->main, string[i]) == !ok; i++); /* * Now display it. */ unifont_draw_text(target, gc, ok ? mfont->main : mfont->fallback, x, y, string, i, wide, bold, cellwidth); string += i; len -= i; x += i * cellwidth; } } #if GTK_CHECK_VERSION(2,0,0) /* Node-path: putty/unix/gtkfont.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 20bb23e233d4421c28580733831a0090 Text-delta-base-sha1: 2fd873930785bf9d1b1255cbc510d296de94b382 Text-content-length: 805 Text-content-md5: 9c7769d639dce88d2ac06a2e50119f90 Text-content-sha1: 87d48043fe0ddba831c873073eb6389fe43ea952 Content-length: 805 SVN��/�_�%�`]`�k3 /* * Indicates whether this font is capable of handling all glyphs * (Pango fonts can do this because Pango automatically supplies * missing glyphs from other fonts), or whether it would like a * fallback font to cope with missing glyphs. */ int want_fallbackThis function behaves exactly like the low-level unifont_create, * except that as well as the requested font it also allocates (if * necessary) a fallback font for filling in replacement glyphs. * * Return value is usable with unifont_destroy and unifont_draw_text * as if it were an ordinary unifont. */ unifont *multifont_create(GtkWidget *widget, const char *name, int wide, int bold, int shadowoffset, int shadowalways Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99a379972a77be1485ba865aa0a2eafe Text-delta-base-sha1: d7abd592baafe4de9b3408a495a20fa7c58ebaa4 Text-content-length: 586 Text-content-md5: d212403a1f31024f8f4b35379b5d313a Text-content-sha1: 70389bc90b190ac5031d7cdd08cf9da302916e43 Content-length: 586 SVN����&p��W�.L^�1^�do]�b multifont_create(inst->area, fs->name, FALSE, FALSE, multifont_create(inst->area, fs->name, FALSE, TRUE, multifont_create(inst->area, fs->name, TRUE, FALSE, multifont_create(inst->area, fs->name, TRUE, TRUE, �Uj�U� (inst->gravity & 2) y += gdk_screen_height() - req.height; gtk_window_set_position(GTK_WINDOW(inst->window), GTK_WIN_POS_NONE); gtk_widget_set_upo Revision-number: 9294 Prop-content-length: 419 Content-length: 419 K 8 svn:date V 27 2011-09-16T19:18:58.105672Z K 7 svn:log V 318 Suppress Pango's bidi, by displaying RTL characters one at a time. I hadn't previously noticed, but Pango was helpfully re-reversing text that PuTTY's own bidi module had already reversed, leading to Arabic text being wrongly displayed and also total chaos when you move the cursor over it or try to cut and paste it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae20c39e1399a5a5b4ff5b3e3528f467 Text-delta-base-sha1: 66e8f3d4db54de8a5e30dae9fb1fc06cbb8e7cd7 Text-content-length: 1423 Text-content-md5: dce714000aa4957bc428f0ed178c5626 Text-content-sha1: 62e8152f3f11aa95bfca1c098e2e2715d1439409 Content-length: 1423 SVN��f�a�T�e�6(�4[ /* * If it's a right-to-left character, we must display it on * its own, to stop Pango helpfully re-reversing our already * reversed text. */ if (!is_rtl(string[0])) { /* * See if that character has the width we expect. */ pango_layout_set_text(layout, utfptr, clen); pango_layout_get_pixel_extents(layout, NULL, &rect); if (rect.width == cellwidth) { /* * Try extracting more characters, for as long as they * stay well-behaved. */ while (clen < utflen) { int oldclen = clen; clen++; /* skip UTF-8 introducer byte */ while (clen < utflen && (unsigned char)utfptr[clen] >= 0x80 && (unsigned char)utfptr[clen] < 0xC0) clen++; n++; pango_layout_set_text(layout, utfptr, clen); pango_layout_get_pixel_extents(layout, NULL, &rect); if (rect.width != n * cellwidth) { clen = oldclen; n--; break; } } } } string += Revision-number: 9295 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 Fix x11font_has_glyph so it doesn't get caught out by signed chars. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-09-17T08:11:11.125444Z PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dce714000aa4957bc428f0ed178c5626 Text-delta-base-sha1: 62e8152f3f11aa95bfca1c098e2e2715d1439409 Text-content-length: 74 Text-content-md5: ad82c1e4dd1e0f82d530936c740f75f5 Text-content-sha1: bb9ded98b4b0fc654af670789fffe95134c35d40 Content-length: 74 SVN��G 2�k��*l (unsigned char) Revision-number: 9296 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9297 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9298 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9299 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9300 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9301 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9302 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9303 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2011-09-17T14:50:18.991516Z K 7 svn:log V 116 Cope with XFontStructs having a NULL per_char array, which happened to me this morning under strange circumstances. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ad82c1e4dd1e0f82d530936c740f75f5 Text-delta-base-sha1: bb9ded98b4b0fc654af670789fffe95134c35d40 Text-content-length: 117 Text-content-md5: 1d32c90ddfb06a2cdb3aee19be3a8b57 Text-content-sha1: 4107421ec0854afbb8774ef25f98d3a3cfbdb3ff Content-length: 117 SVN��G) \�\�\�qVif (!xfs->per_char) /* per_char NULL => everything in range exists */ return TRUE; Revision-number: 9304 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9305 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9306 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9307 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9308 Prop-content-length: 138 Content-length: 138 K 7 svn:log V 38 Add a missing initialisation to NULL. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-09-19T16:21:25.096627Z PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1d32c90ddfb06a2cdb3aee19be3a8b57 Text-delta-base-sha1: 4107421ec0854afbb8774ef25f98d3a3cfbdb3ff Text-content-length: 42 Text-content-md5: 9dead025eede34845021e3ab40364452 Text-content-sha1: 347db9eb381234bc78613ec1e66daeac86eddce7 Content-length: 42 SVN��)> �`��N[fallback = NULL; Revision-number: 9309 Prop-content-length: 555 Content-length: 555 K 8 svn:date V 27 2011-09-19T16:38:23.738991Z K 7 svn:log V 454 We shouldn't fork off a utmp helper subprocess when we aren't setuid, because (a) under that circumstance we won't be writing to utmp anyway, and (b) if we aren't setuid, then we won't have created the pty at the point we fork, so even if our subprocess _could_ have written to utmp it wouldn't have done it right! Spotted by valgrind (triggering on the access beyond the end of the ttyname string in setup_utmp, clueing me in to it having been empty). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0edbf37ffcaea638a1aec26c7c2a1029 Text-delta-base-sha1: 116018d6b13920ad02f865419e6c914c98138445 Text-content-length: 3662 Text-content-md5: b294eb2445885f48d6e252b078a48338 Text-content-sha1: fa5104a1f53e453abdcfe8e273055a4711cb4383 Content-length: 3662 SVN��I} �[��T|Z�F>}�b�cf = -1; static int pty_utmp_helper_pipe = -1 #ifndef OMIT_UTMP /* * Fork off the utmp helper. */ if (pipe(pipefd) < 0) { perror("pterm: pipe"); exit(1); } cloexec(pipefd[0]); cloexec(pipefd[1]); pid = fork(); if (pid < 0) { perror("pterm: fork"); exit(1); } else if (pid == 0) { char display[128], buffer[128]; int dlen, ret; close(pipefd[1]); /* * Now sit here until we receive a display name from the * other end of the pipe, and then stamp utmp. Unstamp utmp * again, and exit, when the pipe closes. */ dlen = 0; while (1) { ret = read(pipefd[0], buffer, lenof(buffer)); if (ret <= 0) { cleanup_utmp(); _exit(0); } else if (!pty_stamped_utmp) { if (dlen < lenof(display)) memcpy(display+dlen, buffer, min(ret, lenof(display)-dlen)); if (buffer[ret-1] == '\0') { /* * Now we have a display name. NUL-terminate * it, and stamp utmp. */ display[lenof(display)-1] = '\0'; /* * Trap as many fatal signals as we can in the * hope of having the best possible chance to * clean up utmp before termination. We are * unfortunately unprotected against SIGKILL, * but that's life. */ putty_signal(SIGHUP, fatal_sig_handler); putty_signal(SIGINT, fatal_sig_handler); putty_signal(SIGQUIT, fatal_sig_handler); putty_signal(SIGILL, fatal_sig_handler); putty_signal(SIGABRT, fatal_sig_handler); putty_signal(SIGFPE, fatal_sig_handler); putty_signal(SIGPIPE, fatal_sig_handler); putty_signal(SIGALRM, fatal_sig_handler); putty_signal(SIGTERM, fatal_sig_handler); putty_signal(SIGSEGV, fatal_sig_handler); putty_signal(SIGUSR1, fatal_sig_handler); putty_signal(SIGUSR2, fatal_sig_handler); #ifdef SIGBUS putty_signal(SIGBUS, fatal_sig_handler); #endif #ifdef SIGPOLL putty_signal(SIGPOLL, fatal_sig_handler); #endif #ifdef SIGPROF putty_signal(SIGPROF, fatal_sig_handler); #endif #ifdef SIGSYS putty_signal(SIGSYS, fatal_sig_handler); #endif #ifdef SIGTRAP putty_signal(SIGTRAP, fatal_sig_handler); #endif #ifdef SIGVTALRM putty_signal(SIGXCPU, fatal_sig_handler); #endif #ifdef SIGXFSZ putty_signal(SIGXFSZ, fatal_sig_handler); #endif #ifdef SIGIO putty_signal(SIGIO, fatal_sig_handler); #endif setup_utmp(pty->name, display); } } } } else { close(pipefd[0]); pty_utmp_helper_pid = pid; pty_utmp_helper_pipe = pipefd[1]; } #endif }if (pty_utmp_helper_pipe >= 0) Revision-number: 9310 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9311 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9312 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9313 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9314 Prop-content-length: 512 Content-length: 512 K 8 svn:date V 27 2011-10-01T17:38:59.809050Z K 7 svn:log V 411 Change the semantics of 'FontSpec' so that it's a dynamically allocated type. The main reason for this is to stop it from taking up a fixed large amount of space in every 'struct value' subunion in conf.c, although that makes little difference so far because Filename is still doing the same thing (and is therefore next on my list). However, the removal of its arbitrary length limit is not to be sneezed at. K 10 svn:author V 5 simon PROPS-END Node-path: putty/conf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b3a78624bef44e65ec81dca2f5740efa Text-delta-base-sha1: a52d1af75edb46d543ba9c15f43d882d8626fe2b Text-content-length: 476 Text-content-md5: fd659b739ed63a22909c10ca79d42e78 Text-content-sha1: 4496d0f0d4b6462cc22802bc824b053a99540136 Content-length: 476 SVN��|tA�D��*D�6h�8,�,e�-/�yC�w�D|�s�_* else if (type == TYPE_FONT) fontspec_free(val->u.fontontspec_copy(from->u.fontval)fontspec_copy(value);fontspec_serialise(entry->value.u.fontval, NULL data += fontspec_serialise(entry->value.u.fontval, data, used entry->value.u.fontval = fontspec_deserialise(data, maxsize, &used); if (!entry->value.u.fontvaldata += used; maxsize -= used Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f51ff23cbf80888faac8cdd715667f80 Text-delta-base-sha1: 3d7b08489b84a3e12ef555cb112a4f82cd99ccf8 Text-content-length: 142 Text-content-md5: 466a22bfce8b4dbfc874c32c495ffcb1 Text-content-sha1: aae26ebe06d34181532d0be9f86b7fd9eb4886d0 Content-length: 142 SVN��E"q�s��Ttq�j[*fontspec = dlg_fontsel_get(ctrl, dlg); conf_set_fontspec(conf, key, fontspec); fontspec_free(fontspec); Node-path: putty/dialog.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 46866661329c7ac449ea1dd765abdd19 Text-delta-base-sha1: 614c171d6d9d993741f54efe6edc1af31d891e24 Text-content-length: 87 Text-content-md5: 6f991a91044d6632b8f18f652c6385e6 Text-content-sha1: 246a3dbecadeb384ec05348950b1660885b5aa4a Content-length: 87 SVN��}u >�a��V'*fn); FontSpec *dlg_fontsel_get(union control *ctrl, void *dlg Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d1c1f0bb1a26e2746319a159170a4eb Text-delta-base-sha1: 0e7ead0cd4ea67a7f4cb62ac6861afeb76ca012b Text-content-length: 742 Text-content-md5: 2acc7c6c786664693e388514d7a8df65 Text-content-sha1: 637b30219228ddc3302034ff9a8ad50596ebdf13 Content-length: 742 SVN��r1$4�J��NJ �Yy�#f�i /* still owned by conf */Functions to copy, free, serialise and deserialise FontSpecs. * Provided per-platform, to go with the platform's idea of a * FontSpec's contents. * * fontspec_serialise returns the number of bytes written, and can * handle data==NULL without crashing. So you can call it once to find * out a size, then again once you've allocated a buffer. */ FontSpec *fontspec_copy(const FontSpec *f); void fontspec_free(FontSpec *f); int fontspec_serialise(FontSpec *f, void *data); FontSpec *fontspec_deserialise(void *data, int maxsize, int *used); * The 'FontSpec *' returned by platform_default_fontspec has * ownership transferred to the caller, and must be freed.* Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4cfbfdfb3241924e9b55090e750746c Text-delta-base-sha1: a59038099eb98e5073b4f7c9f4b52a18937deea6 Text-content-length: 314 Text-content-md5: 91c5cca243f39162b99fdc7e176859ae Text-content-sha1: 9a1165305f2f4ed1faa0890ccaf2ecbe801c7d35 Content-length: 314 SVN��$! �N�2�R^�1Y�]'�*result = read_setting_fontspec(handle, name); if (!result) result = platform_default_fontspec(name); conf_set_fontspec(conf, primary, result); fontspec_free(conf_get_fontspec(conf, CONF_boldfont)); write_setting_fontspec(sesskey, "WideFont", Node-path: putty/storage.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ac15e291ce74a19ce5bf25e4ed800550 Text-delta-base-sha1: 5ba93a56b78fa7cb3d9cc2339f7ceb9f7555b61e Text-content-length: 148 Text-content-md5: ae3b38e3b41107a65f08d0fb26d7fd3a Text-content-sha1: e282c2b354f28501c43a31e6752cf6ee658ed298 Content-length: 148 SVN��u�C��A@�v;�x*font); void close_settings_w(void *handle); /* * ReadFontSpec *read_setting_fontspec(void *handle, const char *key Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3dc14bc7596ba562232feb41c0ad996e Text-delta-base-sha1: 55938fcffaf2e068e27ac726febff38ef5c86380 Text-content-length: 315 Text-content-md5: 3689a28549586e5e9491ae1c888345f2 Text-content-sha1: 8ae282b9656c5e3a9d306e65e70726bb53c900a9 Content-length: 315 SVN����!���E;P�Y|�Y?l�yCgtk_entry_set_text(GTK_ENTRY(uc->entry), fs->name); } FontSpec *dlg_fontsel_getONTSELECT); assert(uc->entry != NULL); return fontspec_new(gtk_entry_get_text(GTK_ENTRY(uc->entry)))window), "key_press_event", GTK_SIGNAL_FUNC(win_key_press)�C����C Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d212403a1f31024f8f4b35379b5d313a Text-delta-base-sha1: 70389bc90b190ac5031d7cdd08cf9da302916e43 Text-content-length: 1084 Text-content-md5: 59d775882025d273a88a0471aa91a4b0 Text-content-sha1: fccdbdc1fdae9392391cc2cf137a899e1d9382d2 Content-length: 1084 SVN�����J��hv�F:h*platform_default_fontspec(const char *name) { if (!strcmp(name, "Font")) return fontspec_new("server:fixed"); else return fontspec_new("")*fs; EXPECTS_ARG; SECOND_PASS_ONLY; fs = fontspec_new(val); conf_set_fontspec(conf, CONF_font, fs); fontspec_free(fs); } else if (!strcmp(p, "-fb")) { FontSpec *fs; EXPECTS_ARG; SECOND_PASS_ONLY; fs = fontspec_new(val); conf_set_fontspec(conf, CONF_font, fs); fontspec_free(fs); } else if (!strcmp(p, "-fw")) { FontSpec *fs; EXPECTS_ARG; SECOND_PASS_ONLY; fs = fontspec_new(val); conf_set_fontspec(conf, CONF_font, fs); fontspec_free(fs); } else if (!strcmp(p, "-fwb")) { FontSpec *fs; EXPECTS_ARG; SECOND_PASS_ONLY; fs = fontspec_new(val); conf_set_fontspec(conf, CONF_font, fs); fontspec_free( (inst->gravity & 2) y += gdk_screen_height() - req.height; gtk_window_set_position(GTK_WINDOW(inst->wi�j��h Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 135fad8c846c8126e8f59eadd472f530 Text-delta-base-sha1: f6e79a2ffb15ecd992f21268cb70ebb843efde68 Text-content-length: 134 Text-content-md5: dc5de4547901e477e835d3335943b71b Text-content-sha1: 5659e8218826c41cfe7af2a06836bdee4d320cd1 Content-length: 134 SVN��y p�_�p�*k*name; /* may be "" to indicate no selected font at all */ }; struct FontSpec *fontspec_new(const char *name) Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ac5c2a098833fa20881e08ad23b073f2 Text-delta-base-sha1: f94f6247fdef39ee29b78fe484464264b46acd12 Text-content-length: 729 Text-content-md5: 02e41eeda49cce1ec2ee9787f368bcec Text-content-sha1: 7927cc436c662998d5a0913d8d1943863ef15512 Content-length: 729 SVN��|BF�|�F FontSpec *fontspec_new(const char *name) { FontSpec *f = snew(FontSpec); f->name = dupstr(name); return f; } FontSpec *fontspec_copy(const FontSpec *f) { return fontspec_new(f->name); } void fontspec_free(FontSpec *f) { sfree(f->name); sfree(f); } int fontspec_serialise(FontSpec *f, void *data) { int len = strlen(f->name); if (data) strcpy(data, f->name); return len + 1; /* include trailing NUL */ } FontSpec *fontspec_deserialise(void *vdata, int maxsize, int *used) { char *data = (char *)vdata; char *end = memchr(data, '\0', maxsize); if (!end) return NULL; *used = end - data + 1; return fontspec_new(data); } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 715acc1f584d81ed1d6ec048fa47faa6 Text-delta-base-sha1: 413c28b78780f12c13317ac9bba6881a823f7a3f Text-content-length: 99 Text-content-md5: b311ed85057cbb2b31eca812f7fb490e Text-content-sha1: 0438b94d188a59aa905d05c5c31ec27e56224ae4 Content-length: 99 SVN��pV J��J�m*platform_default_fontspec(const char *name) { return fontspec_new("") Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 10ba0d3010162c9716d6e2e9ffeb0cfc Text-delta-base-sha1: 485e65c062507c23a670b98705c83bafd4677993 Text-content-length: 96 Text-content-md5: 9fa97c53d42c9e0ab7cec5f6a9ac3bba Text-content-sha1: d1df2a96882737f08cb0c86f96f57d0b622d8a0f Content-length: 96 SVN��V< J��J�X~*platform_default_fontspec(const char *name) { return fontspec_new("") Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eafb7a3de6cf069a1c02bc52f2e574e6 Text-delta-base-sha1: 7bb6331f821cb6cff49aafad54b3be1974a59140 Text-content-length: 372 Text-content-md5: 31c6731cf746132e888a84e58c908fb0 Text-content-sha1: 6378839a6dc52454f99a5f6b2e07bc50889c263e Content-length: 372 SVN�� 1%C�W��!S�%7+�u)�$�r.FontSpec *read_setting_fontspec(void *handle, const char *name FontSpec *fs = fontspec_new(tmp); sfree(suffname); sfree(tmp); return fs char *tmp2 = dupcat("server:", tmp, NULL); FontSpec *fs = fontspec_new(tmp2); sfree(tmp2); sfree(tmp); return fs; } else { sfree(tmp); return NULL*fsfs-> Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0525ef025c56740cffd1f98bbccb9abc Text-delta-base-sha1: 76e5d6810b799bba167a3c2fe0df0abf6c928947 Text-content-length: 1108 Text-content-md5: 3818acced605e1788209e198658a5359 Text-content-sha1: 6b5ae6609dd88fc508b97a5cbb8112e122cd2c7d Content-length: 1108 SVN��#db�f�@�P�S{�^}�d\T�D|�Zm�i��<� >e�Oi�];��6m data = fontspec_new("", 0, 0, 0); sfree(escaped*fs = (FontSpec *)c->data; hdc = GetDC(0); lf.lfHeight = -MulDiv(fs->->isbold ? FW_BOLD : 0); lf.lfCharSet = fs->-> fs = fontspec_new(lf.lfFaceName, (lf.lfWeight == FW_BOLD), cf.iPointSize / 10, lf.lfCharSet); dlg_fontsel_set(ctrl, dp, fs); fontspec_free(fs); *fs) { char *buf, *boldstr;assert(c && c->ctrl->generic.type == CTRL_FONTSELECT); fontspec_free((FontSpec *)c->data); c->data = fontspec_copy(fs); boldstr = (fs->isbold ? "bold, " : ""); if (fs->height == 0) buf = dupprintf("Font: %s, %sdefault height", fs->name, boldstr); else buf = dupprintf("Font: %s, %s%d-%s", fs->name, boldstr, (fs->height < 0 ? -fs->height : fs->height), (fs->FontSpec *dlg_fontsel_geassert(c && c->ctrl->generic.type == CTRL_FONTSELECT); return fontspec_copy((FontSpec *)c->data);sss->name); hdc = GetDC(NULL); if ( Node-path: putty/windows/windefs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e602fc91c226e328c0057d639eda669 Text-delta-base-sha1: 2643a53f32f099248881c9eeee14f9913471df52 Text-content-length: 215 Text-content-md5: 1ae120fde86e7452469eb7cc692903a4 Text-content-sha1: 9d253148db971bb3a83778851f99cce0ea54fb7e Content-length: 215 SVN��y@ @�y�@�r*platform_default_fontspec(const char *name) { if (!strcmp(name, "Font")) return fontspec_new("Courier New", 0, 10, ANSI_CHARSET); else return fontspec_new("", 0, 0, 0) Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 67b30a7aa8d681889d1b5dadeb8e1f51 Text-delta-base-sha1: a138aa4c1b78bdf7c1008d54b59f6ca114164bfe Text-content-length: 150 Text-content-md5: b3cd45681005b6fd739484fa5d97905b Text-content-sha1: 5a055a715c36711931c31ad525c4bfa3180ff444 Content-length: 150 SVN���� 9���)% �B2��CreatePen(PS_SOLID, 0, colours[261])); Polyline(h Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9920b06ef86a5a4994ae118be4ce2c53 Text-delta-base-sha1: d951415ec7f7b8af0d9c95b4e01474c6b50f9f2e Text-content-length: 1370 Text-content-md5: 5486cdc88da5d942f779937c2facdd49 Text-content-sha1: 9f5b34ff5fc22eeaf244ee9d7a90fb1e090b7afe Content-length: 1370 SVN��Y G�Y�G FontSpec *fontspec_new(const char *name, int bold, int height, int charset) { FontSpec *f = snew(FontSpec); f->name = dupstr(name); f->isbold = bold; f->height = height; f->charset = charset; return f; } FontSpec *fontspec_copy(const FontSpec *f) { return fontspec_new(f->name, f->isbold, f->height, f->charset); } void fontspec_free(FontSpec *f) { sfree(f->name); sfree(f); } int fontspec_serialise(FontSpec *f, void *vdata) { char *data = (char *)vdata; int len = strlen(f->name) + 1; /* include trailing NUL */ if (data) { strcpy(data, f->name); PUT_32BIT_MSB_FIRST(data + len, f->isbold); PUT_32BIT_MSB_FIRST(data + len + 4, f->height); PUT_32BIT_MSB_FIRST(data + len + 8, f->charset); } return len + 12; /* also include three 4-byte ints */ } FontSpec *fontspec_deserialise(void *vdata, int maxsize, int *used) { char *data = (char *)vdata; char *end; if (maxsize < 13) return NULL; end = memchr(data, '\0', maxsize-12); if (!end) return NULL; end++; *used = end - data + 12; return fontspec_new(data, GET_32BIT_MSB_FIRST(end), GET_32BIT_MSB_FIRST(end + 4), GET_32BIT_MSB_FIRST(end + 8)); } Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 18a0124716716ede8ac782a408ce03b9 Text-delta-base-sha1: 7a8feb0e15e69a87a01ce438b993cf04b4100033 Text-content-length: 894 Text-content-md5: 7344b98c18885757be68059bf177fad8 Text-content-sha1: 2938e25888992793aeae639c0b229b5eafd18c54 Content-length: 894 SVN��%J#M�i�Y�W=n�de�J�J�[JFontSpec *read_setting_fontspec(void *handle, const char *name) { char *settingname; char *fontname; int isbold, height, charset; fontname = read_setting_s(handle, name); if (!fontname) return NULL; settingname = dupcat(name, "IsBold", NULL); isbold = read_setting_i(handle, settingname, -1); sfree(settingname); if (isbold == -1) return NULL; settingname = dupcat(name, "CharSet", NULL); charset = read_setting_i(handle, settingname, -1); sfree(settingname); if (charset == -1) return NULL; settingname = dupcat(name, "Height", NULL); height == INT_MIN) return NULL; return fontspec_new(fontname, isbold, height, charset); } void write_setting_fontspec(void *handle, const char *name, FontSpec *font) { char *settingname; write_setting_s(handle, name, font->->->-> Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e9f3d3b5b3975f4f210b9597d713b78c Text-delta-base-sha1: 360795719866ce0f773c5e99bb7019c53ea12ae6 Text-content-length: 199 Text-content-md5: 0ac295158711ed47ba095264d8b79197 Text-content-sha1: 10675ffd250b6eea43b0b54ef274c1d23df76f32 Content-length: 199 SVN��]M ,�0�,�ql*name; int isbold; int height; int charset; }; struct FontSpec *fontspec_new(const char *name, int bold, int height, int charset) Revision-number: 9315 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2011-10-01T18:00:49.725455Z K 7 svn:log V 66 Fix copy-and-paste error in command-line font selection in r9314. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 59d775882025d273a88a0471aa91a4b0 Text-delta-base-sha1: fccdbdc1fdae9392391cc2cf137a899e1d9382d2 Text-content-length: 86 Text-content-md5: 22f92416b20b8316692d6c594bb4a0ad Text-content-sha1: 2fca222a7b0dc69caef495a1cc4d3ac323f88d92 Content-length: 86 SVN�������N�O^�C-boldwidewidebold���_WINDOW(inst->wi Revision-number: 9316 Prop-content-length: 220 Content-length: 220 K 10 svn:author V 5 simon K 8 svn:date V 27 2011-10-02T11:01:57.015459Z K 7 svn:log V 119 Turn 'Filename' into a dynamically allocated type with no arbitrary length limit, just as I did to FontSpec yesterday. PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eae79c8cd6f8b1ad2eecd5799efef2e5 Text-delta-base-sha1: f874f1a7362ccf38bde84676e6fdcbb87956e037 Text-content-length: 177 Text-content-md5: c30d21a1dfd0aa5f7cddd95284aecceb Text-content-sha1: 20db35ccc48e6c223b938e50733a832a9037cb59 Content-length: 177 SVN��PT�)��{+� @�&N�iuC�/#�QS�i%�o�l�Rl�G?�f�+n*infilename, *outinfilename, &origcomment); else encrypted = import_encrypted( Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8235bf6bdf011746603592ceef939475 Text-delta-base-sha1: 21fc5dba3864098132ce36239869f70f9300f82e Text-content-length: 55 Text-content-md5: e7f5d4cc4f3eee631fd0036076af4638 Text-content-sha1: 930bc3ae4426b8d1b72fb8f46667d51d50295103 Content-length: 55 SVN��\w�'�� '�)3*fn); filename_free( Node-path: putty/conf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fd659b739ed63a22909c10ca79d42e78 Text-delta-base-sha1: 4496d0f0d4b6462cc22802bc824b053a99540136 Text-content-length: 442 Text-content-md5: b83004f9eabb7a5fbd111d47078579f8 Text-content-sha1: 42df43553a510738fec94fa4c10b44bcb913607f Content-length: 442 SVN��tj<r�1��Y1�6i�>-�l�6 �DsC�62�.�/E*ILENAME) filename_free(val->u.fileilename_copy(from->u.fileval)filename_copy(value);filename_serialise(entry->value.u.fileval, NULL data += filename_serialise(entry->value.u.fileval, data entry->value.u.fileval = filename_deserialise(data, maxsize, &used); if (!entry->value.u.filevaldata += used; maxsize -= used Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 466a22bfce8b4dbfc874c32c495ffcb1 Text-delta-base-sha1: aae26ebe06d34181532d0be9f86b7fd9eb4886d0 Text-content-length: 224 Text-content-md5: 765b11d1b324ae925230758c130f9f7b Text-content-sha1: a0746e7fd59a119712afd0233fb736cedb065c58 Content-length: 224 SVN��" E�!�E� conf_get_filename(conf, key)); } else if (event == EVENT_VALCHANGE) { Filename *filename = dlg_filesel_get(ctrl, dlg); conf_set_filename(conf, key, filename); filename_free(filename); Node-path: putty/dialog.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f991a91044d6632b8f18f652c6385e6 Text-delta-base-sha1: 246a3dbecadeb384ec05348950b1660885b5aa4a Text-content-length: 93 Text-content-md5: b25f4c90121ae330d40253bc1b0b19ac Text-content-sha1: 7974406f8456e3d0064705d8c5e6c4f3b9c9173c Content-length: 93 SVN��un>�s��hr�U *fn); Filename *dlg_filesel_get(union control *ctrl, void *dlg Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 75ae080f930151e06f70d3ccbff5b838 Text-delta-base-sha1: 445493e9a120fabcd076d10c99d7a6cfe677e81f Text-content-length: 47 Text-content-md5: 11eea36d67f75b4d4fb896c73f29e892 Text-content-sha1: eac06fbfe0fbf84ffa8278490056d08d72b4a764 Content-length: 47 SVN��IE"��V��^6�d5��(6�j_ Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c8c35159a3e842737f6492dff1b83f4 Text-delta-base-sha1: ae41f33e70818739f60a36e31bcb7a05d8b7db2d Text-content-length: 1037 Text-content-md5: 5033afc067ca158337c29f2ab177683e Text-content-sha1: 8ff57fa0ef6ab5df163721dcf47a9f91be689bd4 Content-length: 1037 SVN��&(:G�4��r4� L�W2�N�GOC�/�0r%�i*?*Filename *xlatlognam(Filename *if (ctx->currlogfilename) filename_free(ctx->currlogfilename); ctx->currlogfilename = xlatlognam(conf_get_filename(ctx->conf, CONF_logfilename), ctx->currlogfilename = NULLif (ctx->currlogfilename) filename_free(ctx->currlogfilenamconf_get_filename(ctx->conf, CONF_logfilename), Filename *xlatlognam(Filename *src, char *hostname, struct tm *tm) { char buf[10], *bufp; int size; char *buffer; int buflen, bufsize; const char *s; Filename *ret; bufsize = FILENAME_MAX; buffer = snewn(bufsize, char); buflen = 0; s = filename_to_str( if (bufsize <= buflen + size) { bufsize = (buflen + size) * 5 / 4 + 512; buffer = sresize(buffer, bufsize, char); } memcpy(buffer + buflen, bufp, size); buflen += size; } buffer[buflen] = '\0'; ret = filename_from_str(buffer); sfree(buffer); return ret; } Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2acc7c6c786664693e388514d7a8df65 Text-delta-base-sha1: 637b30219228ddc3302034ff9a8ad50596ebdf13 Text-content-length: 616 Text-content-md5: f7a672944ea8458de7ee9d5d0dacf160 Text-content-sha1: 8bb4724ba6d05d03827b19126d70053d3c3615c6 Content-length: 616 SVN��1W--�5��v�w��k#�hIilename *' returned by platform_default_filename, and the * 'FontSpec *' returned by platform_default_fontspec, have ownership *** * filename_serialise and filename_deserialise have the same semantics * as fontspec_serialise and fontspec_deserialise above. */ Filename *const Filename *f1, const Filename *f2); int filename_is_null(const Filename *fn); Filename *filename_copy(const Filename *fn); void filename_free(Filename *fn); int filename_serialise(const Filename *f, void *data); Filename *filename_deserialise(void *data, int maxsize, int *used Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 91c5cca243f39162b99fdc7e176859ae Text-delta-base-sha1: 9a1165305f2f4ed1faa0890ccaf2ecbe801c7d35 Text-content-length: 237 Text-content-md5: ad81e64252f0c8257f197c17e90c39c2 Text-content-sha1: 36717a5960788cc4a38c2441a09d463b32dd0e85 Content-length: 237 SVN��$>0/���X+� w��$ �$/�bT�m7Spec*result = read_setting_filename(handle, name); if (!result) result = platform_default_filename(name); conf_set_filename(conf, primary, result); filename_free( Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cebc8b2b25e0e646c3bd512deb3a0f12 Text-delta-base-sha1: 0f27e4cb3df4a2259191f7891ac17d7f9f96e042 Text-content-length: 80 Text-content-md5: 8b5dd8472f7037fca47e776b71f0691c Text-content-sha1: 66ecb8962ac2c116911c20e1fb6c2d686ab02491 Content-length: 80 SVN����������� �A��>Bp��� �h�jll�86��6 Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 13d19699890354eda30a383e2ccb5eaf Text-delta-base-sha1: 293d12724556a6970dd2a30046d59ff3799e9fc6 Text-content-length: 77 Text-content-md5: 371a3f65a6fe35e9ffc56393d7bd32c1 Text-content-sha1: af56ad6d8be56cdeef7e7b75073cfefdae3ba86c Content-length: 77 SVN��bY@��"���/�>#�Lb�/�QE�9�GP�H� a�!k�U Node-path: putty/storage.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae3b38e3b41107a65f08d0fb26d7fd3a Text-delta-base-sha1: e282c2b354f28501c43a31e6752cf6ee658ed298 Text-content-length: 209 Text-content-md5: 072cbd93bec62c09e773061ea746c184 Text-content-sha1: 7fcfe64a2fa5038ede2aa8d0cddfe18d1cc0da57 Content-length: 209 SVN��c)�w��@wk�6�(?�W/* read_setting_filename() and * read_setting_fontspec() likewise return dynamically allocated * structuresFilename *read_setting_filename(void *handle, const char *key Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3689a28549586e5e9491ae1c888345f2 Text-delta-base-sha1: 8ae282b9656c5e3a9d306e65e70726bb53c900a9 Text-content-length: 308 Text-content-md5: 3241ed86973523dd6873cbb0d3cd505d Text-content-sha1: 37d7c32c388a0b8258eddb3531280ef00bb3e67d Content-length: 308 SVN����$W�J��l=�8�Y|�Y@q�@@*fn->path); } Filename *dlg_filesel_getILESELECT); assert(uc->entry != NULL); return filename_from_str(gtk_entry_get_text(GTK_ENTRY(uc->entry))), &dp); gtk_main(); dlg_cleanup(&dp); ctrl_free_��D�&>�R@�CA�{*filename, -> Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 22f92416b20b8316692d6c594bb4a0ad Text-delta-base-sha1: 2fca222a7b0dc69caef495a1cc4d3ac323f88d92 Text-content-length: 459 Text-content-md5: c71056c3dcb1d57303397479c2de264d Text-content-sha1: 75d5a0e48d73885336ed37e11eac638c1d4a44d1 Content-length: 459 SVN�����t�#�8$[�<D*platform_default_filename(const char *name) { if (!strcmp(name, "LogFileName")) return filename_from_str("putty.log"); else return filename_from_str("")*fn; EXPECTS_ARG; SECOND_PASS_ONLY; fn = filename_from_str(val); conf_set_filename(conf, CONF_logfilename, fn); conf_set_int(conf, CONF_logtype, LGTYP_DEBUG); filename_free(fn_WINDOW(inst->window), GTK�x��x Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc5de4547901e477e835d3335943b71b Text-delta-base-sha1: 5659e8218826c41cfe7af2a06836bdee4d320cd1 Text-content-length: 67 Text-content-md5: b175b69546a7cc9b02c342c8f74f07d8 Text-content-sha1: f67af406c70926d09807564d1dbf90632ff383d5 Content-length: 67 SVN��yt .�z��L-*path; }; FILE *f_open(const struct Filename * Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cb2b1d4b6d330a98ae47fd990bd1fa22 Text-delta-base-sha1: ae3dda817fef964b3ad7b37b53b30c23ab28e25e Text-content-length: 129 Text-content-md5: 0be779eb84794b2da4ff299c5d3e5b01 Text-content-sha1: 645a574de1836b3e60b4554de7a6367cc0290b4d Content-length: 129 SVN�� e�W��iWd�i"*->path); fflush(stderr); return 0; } fprintf(stderr, msgtemplate, FILENAME_MAX, filename-> Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 02e41eeda49cce1ec2ee9787f368bcec Text-delta-base-sha1: 7927cc436c662998d5a0913d8d1943863ef15512 Text-content-length: 952 Text-content-md5: d2d360b4216b4b8afa4134feae3d527b Text-content-sha1: a8a9496505d7d17794b38988644b842fdcfac7a4 Content-length: 952 SVN��B=+�\�N�bxZ�aa�J?A�'Wm�j�3*filename_from_str(const char *str) { Filename *ret = snew(Filename); ret->path = dupstr(str); return ret; } Filename *filename_copy(const Filename *fn) { return filename_from_str(fn->path)const Filename *f1, const Filename *f2) { return !strcmp(f1->path, f2->path); } int filename_is_null(const Filename *fn) { return !fn->path[0]; } void filename_free(Filename *fn) { sfree(fn->path); sfree(fn); } int filename_serialise(const Filename *f, void *vdata) { char *data = (char *)vdata; int len = strlen(f->path) + 1; /* include trailing NUL */ if (data) { strcpy(data, f->path); } return len; } Filename *filename; end++; *used = end - data; return filename_from_str(data)const Filename *filename, char const *mode, int is_private) { if (!is_private) { return fopen(filename->->path, O_WRONLY | O_CREAT | O_TRUNC, Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b311ed85057cbb2b31eca812f7fb490e Text-delta-base-sha1: 0438b94d188a59aa905d05c5c31ec27e56224ae4 Text-content-length: 190 Text-content-md5: d568612e1013f4b4e67897ade8dd5e20 Text-content-sha1: 4e4a464beed4c3d2c23b244ebc62e257a7036842 Content-length: 190 SVN��VI #�w�#�/'*platform_default_filename(const char *name) { if (!strcmp(name, "LogFileName")) return filename_from_str("putty.log"); else return filename_from_str("") Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9fa97c53d42c9e0ab7cec5f6a9ac3bba Text-delta-base-sha1: d1df2a96882737f08cb0c86f96f57d0b622d8a0f Text-content-length: 187 Text-content-md5: 7fef11e60f28c87d551723eed0fd7048 Text-content-sha1: 65987c3c4410bcdd944b2fef863b7d1c776b3bbc Content-length: 187 SVN��</ #�r�#�"*platform_default_filename(const char *name) { if (!strcmp(name, "LogFileName")) return filename_from_str("putty.log"); else return filename_from_str("") Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 31c6731cf746132e888a84e58c908fb0 Text-delta-base-sha1: 6378839a6dc52454f99a5f6b2e07bc50889c263e Text-content-length: 307 Text-content-md5: 726e3655f1d07b5f5f2c1b9b13349d57 Text-content-sha1: 2eaabcfcfbaf6111ca9e7c9f319d2d6a7e36d30b Content-length: 307 SVN��1r�J�`�7k�\UFilename *read_setting_filename(void *handle, const char *name) { char *tmp = read_setting_s(handle, name); if (tmp) { Filename *ret = filename_from_str(tmp); sfree(tmp); return ret; } else return NULL*result) { write_setting_s(handle, name, result-> Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7c0e61e73700d801f2e153820a852685 Text-delta-base-sha1: 231befbfa23deb5e552b8c0ac2e883f7f5748ebf Text-content-length: 55 Text-content-md5: c9e5691d9e67c0710381dcd014ce1940 Text-content-sha1: f9007bbba93647428d70f51b55b804c7714e5df6 Content-length: 55 SVN��),���z6�a�`y�OZ*filename, ->-> Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3818acced605e1788209e198658a5359 Text-delta-base-sha1: 6b5ae6609dd88fc508b97a5cbb8112e122cd2c7d Text-content-length: 625 Text-content-md5: d31f217d8309603da22b7448304c80e8 Text-content-sha1: f459c9df7708f91f455d6bae2adcd7a1406892c6 Content-length: 625 SVN�� 7,�b�_�Wqi� }k�-%�l@�d@� }Q��static char *getdlgitemtext_alloc(HWND hwnd, int id) { char *ret = NULL; int size = 0; hwnd, id, ret, size); } while (!memchr(ret, '\0', size-1)); return ret; } char *dlg_editbox_getassert(c && c->ctrl->generic.type == CTRL_EDITBOX); return getdlgitemtext_alloc(dp->hwnd, c->base_id+1)*fn->path); } Filename *dlg_filesel_getchar *tmp; Filename *ret; assert(c && c->ctrl->generic.type == CTRL_FILESELECT); tmp = getdlgitemtext_alloc(dp->hwnd, c->base_id+1); ret = filename_from_str(tmp); sfree(tmp); return ret Node-path: putty/windows/windefs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1ae120fde86e7452469eb7cc692903a4 Text-delta-base-sha1: 9d253148db971bb3a83778851f99cce0ea54fb7e Text-content-length: 187 Text-content-md5: 16c381632c816a445db5e102756e8b92 Text-content-sha1: 07e20bcf607074e1f2e4654ab6131450b69cb840 Content-length: 187 SVN��@3 #�G�#�Iw*platform_default_filename(const char *name) { if (!strcmp(name, "LogFileName")) return filename_from_str("putty.log"); else return filename_from_str("") Node-path: putty/windows/windlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: edbfee334ac5c7f39dee1159d8f4e70b Text-delta-base-sha1: 7aff43f137fbc34f755aa77114b768e59b8a99e6 Text-content-length: 35 Text-content-md5: e12c6e838b8014471aa6a465eccca45f Text-content-sha1: 12e05b8d0d2d7c0499ad4dd2d73a52e6dd32ace7 Content-length: 35 SVN���[��y[�?U*-> Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5486cdc88da5d942f779937c2facdd49 Text-delta-base-sha1: 9f5b34ff5fc22eeaf244ee9d7a90fb1e090b7afe Text-content-length: 873 Text-content-md5: 7495fc3c921b2b1861807355c9261e3d Text-content-sha1: 1c3677a5e488ac87c5ed05fa0ef297024d514a40 Content-length: 873 SVN�� E�>� �N~�g^ �g9*filename_from_str(const char *str) { Filename *ret = snew(Filename); ret->path = dupstr(str); return ret; } Filename *filename_copy(const Filename *fn) { return filename_from_str(fn->path); } const char *filename_to_str(const Filename *fn) { return fn->path; } int filename_equal(const Filename *f1, const Filename *f2) { return !strcmp(f1->path, f2->path); } int filename_is_null(const Filename *fn) { return !*fn->path; } void filename_free(Filename *fn) { sfree(fn->path); sfree(fn); } int filename_serialise(const Filename *f, void *vdata) { char *data = (char *)vdata; int len = strlen(f->pathpath); } return len; } Filename *filenameend = memchr(data, '\0', maxsize); if (!end) return NULL; end++; *used = end - data; return filename_from_str(data) Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 80aa3c5ccd894eff1125b8d3f2aa1708 Text-delta-base-sha1: cdff007bff7bf4fe5557e62789fee90f7bd20f1d Text-content-length: 827 Text-content-md5: 8e84562d1c1004a12da02a811607756d Text-content-sha1: aadd4d738e433fb78d7708420382000594adc6df Content-length: 827 SVN��m3[R�R��<R�5� e6�_(�|}�O?�Qq�G?�~}�1|�`.�+�76*filename, &comment); else if (realtype == SSH_KEYTYPE_SSH2) needs_pass = ssh2_userkey_encrypted(filename, &comment); else needs_pass = import_encrypted(filename, realtype,filename, &newkey1, passphrase, &errmsg); else ret = import_ssh1(filename, realtype, &newkey1, passphrase, &errmsg); } else { if (realtype == type) newkey2 = ssh2_load_userkey(filename, passphrase, &errmsg); else newkey2 = import_ssh2(filename, realtype,*2(fn, type, &state->ssh2key, fn, &state->ssh2key, NULL); filename_free(fn); } else { Filename * filename_free(fn Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a548e39e80973643ce99a3c183847828 Text-delta-base-sha1: c8f25799efb0803f9def4c53f10d4c14b95d555b Text-content-length: 197 Text-content-md5: e1941c0b57bdf9966102dfe2ea9c6a53 Text-content-sha1: c8d3ebac8de950889550f07f522dace947a68ab8 Content-length: 197 SVN��MG(�/��>/�n�V�:_C� ^K�5*filename, &comment); else needs_pass = ssh2_userkey_encrypted(filename, rkey, passphrase, &error); else { skey = ssh2_load_userkey( Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7344b98c18885757be68059bf177fad8 Text-delta-base-sha1: 2938e25888992793aeae639c0b229b5eafd18c54 Text-content-length: 378 Text-content-md5: f42a605400b93bda6bb371e0b1d1fee1 Text-content-sha1: b4019da885c40d5f84d609b2d496688d93c4705f Content-length: 378 SVN��J _��_�1Filename *read_setting_filename(void *handle, const char *name) { char *tmp = read_setting_s(handle, name); if (tmp) { Filename *ret = filename_from_str(tmp); sfree(tmp); return ret; } else return NULL; } void write_setting_filename(void *handle, const char *name, Filename *result) { write_setting_s(handle, name, result-> Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0ac295158711ed47ba095264d8b79197 Text-delta-base-sha1: 10675ffd250b6eea43b0b54ef274c1d23df76f32 Text-content-length: 97 Text-content-md5: 953c266d0de76df9c12376cd4d5b5586 Text-content-sha1: d6f94ead14df9f6b5620d06cfba010bb1b2130c3 Content-length: 97 SVN��MA H�0�H�I*path; }; #define f_open(filename, mode, isprivate) ( fopen((filename)-> Revision-number: 9317 Prop-content-length: 287 Content-length: 287 K 8 svn:date V 27 2011-10-02T11:50:45.367547Z K 7 svn:log V 186 While I'm crusading against arbitrary limits, here's a redesign of prompt_t to arrange that the buffer in which each prompt is stored can be reallocated larger during the input process. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c30d21a1dfd0aa5f7cddd95284aecceb Text-delta-base-sha1: 20db35ccc48e6c223b938e50733a832a9037cb59 Text-content-length: 99 Text-content-md5: 3a309dbbe3e114a9502da60183b14113 Text-content-sha1: 8adb7394a25a13e4e2d768b83ae0bb8a49b1f994 Content-length: 99 SVN��sB�E��JB�^$); add_prompt(p, dupstr("Re-enter passphrase to verify: "), FALSE Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7f5d4cc4f3eee631fd0036076af4638 Text-delta-base-sha1: 930bc3ae4426b8d1b72fb8f46667d51d50295103 Text-content-length: 76 Text-content-md5: b4ce8e0c0aba636a41c1162993d9f496 Text-content-sha1: d821a50f694c38457d76d7d3e277b12075ca02e5 Content-length: 76 SVN��w2� ���A6prompt_set_result(p->prompts[0], cmdline_password) Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 768ed5c394ed61d7ec5ee646797e4878 Text-delta-base-sha1: cb1d16b32161f97c3f6ac04c6e4e4028ac04fdbb Text-content-length: 1031 Text-content-md5: da62f2f2185111e61d554536cff84b81 Text-content-sha1: cf6737fe020330235a8044f14d5f1e50ae64698b Content-length: 1031 SVN��#N`���JW�C�Ab) { prompt_t *pr = snew(prompt_t); pr->prompt = promptstr; pr->echo = echo; pr->result = NULL; pr->resultsize = 0prompt_ensure_result_size(prompt_t *pr, int newlen) { if ((int)pr->resultsize < newlen) { char *newbuf; newlen = newlen * 5 / 4 + 512; /* avoid too many small allocs */ /* * We don't use sresize / realloc here, because we will be * storing sensitive stuff like passwords in here, and we want * to make sure that the data doesn't get copied around in * memory without the old copy being destroyed. */ newbuf = snewn(newlen, char); memcpy(newbuf, pr->result, pr->resultsize); memset(pr->result, '\0', pr->resultsize); sfree(pr->result); pr->result = newbuf; pr->resultsize = newlen; } } void prompt_set_result(prompt_t *pr, const char *newstr) { prompt_ensure_result_size(pr, strlen(newstr) + 1); strcpy(pr->result, newstr)size Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f7a672944ea8458de7ee9d5d0dacf160 Text-delta-base-sha1: 8bb4724ba6d05d03827b19126d70053d3c3615c6 Text-content-length: 709 Text-content-md5: 75cf4a217fd926b6633ef7ab59309d75 Text-content-sha1: c33f8502c327296963baf45fdbce632855d88791 Content-length: 709 SVN��W- ��4�^l�S/* * 'result' must be a dynamically allocated array of exactly * 'resultsize' chars. The code for actually reading input may * realloc it bigger (and adjust resultsize accordingly) if it has * to. The caller should free it again when finished with it. * * If resultsize==0, then result may be NULL. When setting up a * prompt_t, it's therefore easiest to initialise them this way, * which means all actual allocation is done by the callee. This * is what add_prompt does. */ char *result; size_t resultsize); void prompt_set_result(prompt_t *pr, const char *newstr); void prompt_ensure_result_size(prompt_t *pr, in Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cb2dbd3c458bab4b374504c2ff990d66 Text-delta-base-sha1: 3b30d52fd0c9ad9fba6f671aaeb675f8432ac62e Text-content-length: 81 Text-content-md5: 1774b381e0176ea45d1ced66323bed24 Text-content-sha1: a62d4da04fb56f3617a525451835a1ecc2a2ac76 Content-length: 81 SVN��[* <�2��<add_prompt(rlogin->prompt, dupstr("rlogin username: "), TRUE Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b5dd8472f7037fca47e776b71f0691c Text-delta-base-sha1: 66ecb8962ac2c116911c20e1fb6c2d686ab02491 Text-content-length: 1252 Text-content-md5: 76d9f55a25a740a6694cbbb2609386d8 Text-content-sha1: 409bcae31a3cff77e4d56eb5fcd5e51dd304cf2a Content-length: 1252 SVN����\�`��D<\ ret = rsaencrypt(s->rsabuf, hostkey.bytes, &servkey); } if (!ret) { bombout(("S���&9�=\�0�od�di�7c�P0add_prompt(s->cur_prompt, dupstr("login as: "), TRUE FALSEkt_getuint32(pktin) != SSH2_EXTENDED_DATA_STDERR) return; /* extended but not stderr */ ssh_pkt_getstring(pktin, &data, &length); if (data) { int bufsize = 0; c->v.v2.locwindow -= length; c->v.v2.remlocwin -= length; switch (c->type)���4�6�i�//� G�u�&�madd_prompt(s->cur_prompt, dupstr("login as: "), TRUE); echo); add_prompt(s->cur_prompt, dupstr("Enter new password: "), FALSE); add_prompt(s->cur_prompt, dupstr("Confirm new password: "), FALSEback_cmd(void *handle) { Ssh ssh = (Ssh) handle; return ssh->fallback_cmd; } Backend ssh_backend = { ssh_init, ssh_free, ssh_reconfig, ssh_send, ssh_sendbuffer, ssh_size, ssh_special, ssh_get_specials, ssh_connected, ssh_return_exitcode, ssh_sendok, ssh_ldisc, ssh_provide_ldisc, ssh_provide_logctx, ssh_unthrottle, ssh_cfg_info, �6!! "ssh", PROT_SSH, 22 }; Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e56465400531a89e704bfc92ff9f0d2 Text-delta-base-sha1: 4baf49817bb1fc3137661d8a14e91ed7087b6b59 Text-content-length: 326 Text-content-md5: b9908fb0d60db602ed26822c35fda624 Text-content-sha1: 74ce6bd62b35291c5cae64e59536def75e4ae355 Content-length: 326 SVN���������8 �G��iN�p( �  prompt_set_result(p->prompts[i], "" prompt_ensure_result_size(pr, s->pos + 1); pr->result[s->pos!pr->echo || (c >= ' ' && c <= '~') || ((unsigned char) c >= 160)) { prompt_ensure_result_size(pr, s->pos + 1); Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0be779eb84794b2da4ff299c5d3e5b01 Text-delta-base-sha1: 645a574de1836b3e60b4554de7a6367cc0290b4d Text-content-length: 780 Text-content-md5: 94b227fdaa222b7f7a507b3ba7bab117 Text-content-sha1: 2d6b93b16a73732664bff147be91f9f1ba4e3645 Content-length: 780 SVN��[h�d��X#�6|6� prompt_set_result(p->prompts[i], ""len len = 0; while (1) { int ret; prompt_ensure_result_size(pr, len * 5 / 4 + 512); ret = read(infd, pr->result + len, pr->resultsize - len - 1); if (ret <= 0) { len = -1; break; } len += ret; if (pr->result[len - 1] == '\n') { len--; break; } } tcsetattr(infd, TCSANOW, &oldmode); if (!pr->echo) console_prompt_text(outfp, "\n", 1); if (len < 0) { console_close(outfp, infd); return 0; /* failure due to read error */ } pr->result[len] = '\0'; Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c9e5691d9e67c0710381dcd014ce1940 Text-delta-base-sha1: f9007bbba93647428d70f51b55b804c7714e5df6 Text-content-length: 913 Text-content-md5: 64b252e4c6f8ac9e91a2b0ca2b63322e Text-content-sha1: dc07db56e36b344d52266aac5db6879509e96063 Content-length: 913 SVN��,5g�&��+e�#I^�^3 �|0 prompt_set_result(p->prompts[i], ""; int len; prompt_t *pr = p->prompts[curr_prompt] len = 0; while (1) { DWORD ret = 0; BOOL r; prompt_ensure_result_size(pr, len * 5 / 4 + 512); r = ReadFile(hin, pr->result + len, pr->resultsize - len - 1, &ret, NULL); if (!r || ret == 0) { len = -1; break; } len += ret; if (pr->result[len - 1] == '\n') { len--; if (pr->result[len - 1] == '\r') len--; break; } } SetConsoleMode(hin, savemode) if (len < 0) { return 0; /* failure due to read error */ } pr->result[len] = '\0'; } return 1; /* success */ Revision-number: 9318 Prop-content-length: 255 Content-length: 255 K 8 svn:date V 27 2011-10-02T13:53:58.052584Z K 7 svn:log V 154 Move a recently introduced utility function out of the file in which I declared it static, and into winutils.c where it can be more generally accessible. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d31f217d8309603da22b7448304c80e8 Text-delta-base-sha1: f459c9df7708f91f455d6bae2adcd7a1406892c6 Text-content-length: 60 Text-content-md5: 7c687410c89244e25d79b3d6896d106c Text-content-sha1: 8958fbd6c187383ffb61757a976942bbf56bde5d Content-length: 60 SVN�� ��b��_l�4V�uGetDlgItemTGetDlgItemT Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 953c266d0de76df9c12376cd4d5b5586 Text-delta-base-sha1: d6f94ead14df9f6b5620d06cfba010bb1b2130c3 Text-content-length: 65 Text-content-md5: 11958315257c0444b85defecd0cad2bf Text-content-sha1: 876f9dc93eead5bf54767c176b377bf2703dc6fd Content-length: 65 SVN��Ap *�9�� 4char *GetDlgItemText_alloc(HWND hwnd, int Node-path: putty/windows/winutils.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 752c2c2eebd7dbc297f3fa8656c516b5 Text-delta-base-sha1: 295b694f51775bd8cd27365291e0efece4d6af9b Text-content-length: 465 Text-content-md5: c2f8d97050bbaa081dc303c605a597bc Text-content-sha1: ee56f35e65bdd41de0209ddc30985a92fa6f91c1 Content-length: 465 SVN��n/ 6�Z�6�OHandy wrapper around GetDlgItemText which doesn't make you invent * an arbitrary length limit on the output string. Returned string is * dynamically allocated; caller must free. */ char *GetDlgItemText_alloc(HWND hwnd, int id) { char *ret = NULL; int size = 0; do { size = size * 4 / 3 + 512; ret = sresize(ret, size, char); GetDlgItemText(hwnd, id, ret, size); } while (!memchr(ret, '\0', size-1)); return ret Revision-number: 9319 Prop-content-length: 170 Content-length: 170 K 7 svn:log V 70 Another utility function, to free a string containing sensitive data. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-10-02T14:03:47.675589Z PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da62f2f2185111e61d554536cff84b81 Text-delta-base-sha1: cf6737fe020330235a8044f14d5f1e50ae64698b Text-content-length: 194 Text-content-md5: 749597efff7d7692ab4461350aa29be5 Text-content-sha1: 50994dc64d20b22efdd7753138d9839b4491bae2 Content-length: 194 SVN��Nz (�t�(�^pvoid burnstr(char *string) /* sfree(str), only clear it first */ { if (string) { memset(string, 0, strlen(string)); sfree(string); } Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7b0a6fb38bc5abc98ee6443e5506dca4 Text-delta-base-sha1: 381951b2954e42d9dc7e1a7de6b285a6b5670717 Text-content-length: 46 Text-content-md5: 6cc6e4dab07f6db0175602cea2638f2e Text-content-sha1: cdbb0353fa5494e97e75a4c587817f0adb7534a6 Content-length: 46 SVN��Nj �p��amvoid burnstr(char *string Revision-number: 9320 Prop-content-length: 333 Content-length: 333 K 8 svn:date V 27 2011-10-02T14:14:21.231268Z K 7 svn:log V 232 More arbitrary-limit hunting: retire PASSPHRASE_MAXLEN in the Windows GUIs of Pageant and PuTTYgen. With that and the prompts_t redesign, there should no longer be any limit on passphrase length other than the patience of the user. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8e84562d1c1004a12da02a811607756d Text-delta-base-sha1: aadd4d738e433fb78d7708420382000594adc6df Text-content-length: 1235 Text-content-md5: 062024929e7dc3373c18e1149ff647cf Text-content-sha1: b2ac3834d848bb2e87c8b82c1a56f6e5ee66d6c2 Content-length: 1235 SVN��3P{J�n��8j�Jh�\1\�E:c� s�x�+6�TY�+IL�X�qj�|�+g ��"d�,[�J�W\#include <assertstruct PassphraseProcStruct { char * burnstr(*passphrase); *passphrase = dupstr(""); SetDlgItemText(hwnd, 102, * burnstr(*passphrase); *passphrase = GetDlgItemText_alloc(hwnd, 102)*passphrasepassphrasedo { burnstr(passphrase); passphrase = NULL; if (needs_pass) { int dlgret; struct PassphraseProcStruct pps; pps.passphrase = &passphrase; pps.comment = commen assert(passphrase != NULL); } else passphrase = dupstr("") burnstr(passphrase);*passphrase, *passphrase2passphrase = GetDlgItemText_alloc(hwnd, IDC_PASSPHRASE1EDIT); passphrase2 = GetDlgItemText_alloc(hwnd, IDC_PASSPHRASE2EDIT burnstr(passphrase); burnstr(passphrase2); break; } burnstr(passphrase2); { burnstr(passphrase); break; } { burnstr(passphrase); break; } burnstr(passphrase); Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e1941c0b57bdf9966102dfe2ea9c6a53 Text-delta-base-sha1: c8d3ebac8de950889550f07f522dace947a68ab8 Text-content-length: 945 Text-content-md5: 6be7ae0fb41a0ba4925f122eed9bb6cd Text-content-sha1: ddf435e74af170ab38e3b95cbb3ba92c68bb4ab0 Content-length: 945 SVN��G2G\�|��PB�s\�E1c�[j�0b�7j� <�0WZ�7.j�I~struct PassphraseProcStruct { char * burnstr(*passphrase); *passphrase = dupstr(""); SetDlgItemText(hwnd, 102, * burnstr(*passphrase); *passphrase = GetDlgItemText_alloc(hwnd, 102)*passphraseassphrase = NULL; original_pass = 0; do { burnstr(passphrase); passphrase = NULL; passphrase = dupstr(pp); } else { int dlgret; struct PassphraseProcStruct pps; pps.passphrase = &passphrase; pps.comment = comment; assert(passphrase != NULL); } } else passphrase = dupstr(""); if(original_pass && ret) { /* If they typed in an ok passphrase, remember it */ addpos234(passphrases, passphrase, 0); } else { /* Otherwise, destroy it */ burnstr(passphrase); } passphrase = NULL; Revision-number: 9321 Prop-content-length: 236 Content-length: 236 K 7 svn:log V 135 Private files saved on Unix should have mode 0600, not 0700. They're generally private-key files, which have no need to be executable. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-10-02T14:16:08.660520Z PROPS-END Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d2d360b4216b4b8afa4134feae3d527b Text-delta-base-sha1: a8a9496505d7d17794b38988644b842fdcfac7a4 Text-content-length: 22 Text-content-md5: 7f7a830cf771ef13a23bc3c5aa6b6507 Text-content-sha1: 98e745f06fd1a78257d8cccaff97159023ef2fe0 Content-length: 22 SVN��== �0�� 16 Revision-number: 9322 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9323 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9324 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9325 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9326 Prop-content-length: 147 Content-length: 147 K 10 svn:author V 5 simon K 8 svn:date V 27 2011-10-14T07:03:29.402460Z K 7 svn:log V 47 Support code page 852. Thanks to Tamas Tevesz. PROPS-END Node-path: putty/charset/charset.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 958bde3d3bf8ab9bb579dedbd9c7f216 Text-delta-base-sha1: 7a6979864ebd34a269cfd58f5917e34ad99f8569 Text-content-length: 23 Text-content-md5: 5d1a0c0e5406aba5dc28ae3e020446c6 Text-content-sha1: b59ebef36016ef656f32616ca80aaab1377b59e3 Content-length: 23 SVN��AO �T��yH52 Node-path: putty/charset/localenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6b9dc0abaac15879753f0ae5cc7e0d56 Text-delta-base-sha1: 10b9d0dab59def6ee367aa0dd35166ee08abd51d Text-content-length: 34 Text-content-md5: 8fab6584820cd9e14e443b5744c1a5a5 Text-content-sha1: 16fc5c23d15adf638a69eb6e11b62484b4ffa48c Content-length: 34 SVN�� * �^��?M52", CS_CP852 Node-path: putty/charset/mimeenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85a7a92ad5cb33e753dc2fc3f29e0beb Text-delta-base-sha1: 30787c1cc0d019bf9bb7f92d0d543db4e2161b4b Text-content-length: 117 Text-content-md5: 7d73ed0e9d5da3e4afd72c0e52943a32 Text-content-sha1: 1958875446d909ef34ad7039840118a2b691527a Content-length: 117 SVN��dS _�g�_� W52", CS_CP852 }, { "cp852", CS_CP852 }, { "852", CS_CP852 }, { "csIBM852", CS_CP852 Node-path: putty/charset/sbcs.dat Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 40ee83fde71f0c9b60f3853e808a39fa Text-delta-base-sha1: b421294d40c409e7caab629a5db3b28dfbfa1c66 Text-content-length: 834 Text-content-md5: 85963101e923c6e2a644fcff435dd731 Text-content-sha1: 3acadbf89938dff1b0c826b97506260ed5006570 Content-length: 834 SVN��<�4�*�?s�h&Another old DOS code page, submitted by a user and checked against the translation table at http://msdn.microsoft.com/en-us/goglobal/cc305161.aspx . charset CS_CP852c7 00fc 00e9 00e2 00e4 016f 0107 00e7 0142 00eb 0150 0151 00ee 0179 00c4 0106 00c9 0139 013a 00f4 00f6 013d 013e 015a 015b 00d6 00dc 0164 0165 0141 00d7 010d 00e1 00ed 00f3 00fa 0104 0105 017d 017e 0118 0119 00ac 017a 010c 015f 00ab 00bb 2591 2592 2593 2502 2524 00c1 00c2 011a 015e 2563 2551 2557 255d 017b 017c 2510 2514 2534 252c 251c 2500 253c 0102 0103 255a 2554 2569 2566 2560 2550 256c 00a4 0111 0110 010e 00cb 010f 0147 00cd 00ce 011b 2518 250c 2588 2584 0162 016e 2580 00d3 00df 00d4 0143 0144 0148 0160 0161 0154 00da 0155 0170 00fd 00dd 0163 00b4 00ad 02dd 02db 02c7 02d8 00a7 00f7 00b8 00b0 00a8 02d9 0171 0158 0159 Node-path: putty/charset/xenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a5737aaea9eda895100fc5fe3ce60e8 Text-delta-base-sha1: 0c9c2a28c4aa90b2af911de371e9ebb0c7777299 Text-content-length: 34 Text-content-md5: 55152dcfc599a4ef7b0d14438f046686 Text-content-sha1: ec687980dc94414000c9bfc7d22d9afff921baf9 Content-length: 34 SVN��< � ��"{52", CS_CP852 Node-path: putty/windows/winucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a6ca4610d1ec95e0077558a2486414f2 Text-delta-base-sha1: 77d3468860e6030e7f296aa6eeefc8cd3c4bd538 Text-content-length: 34 Text-content-md5: da87e08405f0359546ac26cc4330b741 Text-content-sha1: 887a34d9f53c92e077eefb1a25d87b1042a97a6a Content-length: 34 SVN�� �^��1R52", 852 Revision-number: 9327 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9328 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9329 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9330 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9331 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9332 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9333 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9334 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9335 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9336 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9337 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9338 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9339 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9340 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9341 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9342 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9343 Prop-content-length: 336 Content-length: 336 K 8 svn:date V 27 2011-11-26T17:35:21.654278Z K 7 svn:log V 235 Introduce a new version type, 'prerelease'. Quotes the version number it's a pre-release of, and the revision number so you can tell two pre-releases apart. I intend to use this for builds from branch-0.61 until I call it 0.62 proper. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9a68b6ed2f3b4bd1da8a96a88698c01 Text-delta-base-sha1: 38cba639eafb285c90a7a28a4502a0c46bdb9ea8 Text-content-length: 528 Text-content-md5: 8fc9c9fe1c78448677367203d1719a4d Text-content-sha1: 83f4ab8e3e8b014068ff2af5cda452af47f2db62 Content-length: 528 SVN��XM$`�G��5T�ZB��� NPRERELEASE)" "" set Makever $(Makever) -DPRERELEASE=$(PREPRERELEASE)" "" set Docmakeargs VERSION="PuTTY pre-release $(PRERELEASE):r$(revisionPRERELEASE)" "" set Unxver $(PRERELEASE)pre $(revisionPRERELEASE)" "" set Iversion $(PRERELEASE):r$(revision) ifneq "$(PRERELEASE)" "" set Iname PuTTY pre-release $(PRERELEASE):r$(revision) ifneq "$(PRERELEASE)" "" set Ivertext Pre-release $(PRERELEASE):r$(revision) ifneq "$(PRERELEASE)" "" set Ifilename putty-$(PRERELEASE)-pre$(revision Node-path: putty/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e09cab6da57644916fcade107a4097e0 Text-delta-base-sha1: 1d5160f7ea5fec3dda68629c12d1f1114bc76f84 Text-content-length: 415 Text-content-md5: 26d270463d167d5b8ee9420a53a61655 Text-content-sha1: b3d4102b78fe9a58d0945e85eba71fc33f280bc8 Content-length: 415 SVN��} �w��pre) set -- "${1%pre}" "$2" case "$1" in *[!.0-9a-z~]*) echo "Malformed prerelease ID '$1'">&2;exit 1;;esac case "$2" in *[!.0-9a-z~]*) echo "Malformed prerelease revision '$1'">&2;exit 1;;esac autoconfver="$1~pre$2" arcsuffix="-$autoconfver" ver="-DPRERELEASE=$1 -DSVN_REV=$2" docver="VERSION=\"PuTTY prerelease $1:r$2\"" ;; *) case "$1" in *[!.0-9a-z~ Node-path: putty/version.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 101df939b7f5528054d1df02d4adb2b7 Text-delta-base-sha1: ee53b0be4d1a5ad9e9fa539a778294045956384b Text-content-length: 167 Text-content-md5: 8c301f3b311bd21e46051ba5bcd8625f Text-content-sha1: c1b0dac0cf63d37e43d25eaf08793fd8fb3e12c0 Content-length: 167 SVN��Z{ �1��;PRERELEASE char ver[] = "Pre-release " STR(PRERELEASE) ":r" STR(SVN_REV); char sshver[] = "PuTTY-Prerelease-" STR(PRERELEASE) ":r" STR(SVN_REV Revision-number: 9344 Prop-content-length: 150 Content-length: 150 K 8 svn:date V 27 2011-11-26T17:45:51.000565Z K 7 svn:log V 50 Merge r9343 (the new 'pre-release' version type). K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.61/Buildscr Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9a68b6ed2f3b4bd1da8a96a88698c01 Text-delta-base-sha1: 38cba639eafb285c90a7a28a4502a0c46bdb9ea8 Text-content-length: 528 Text-content-md5: 8fc9c9fe1c78448677367203d1719a4d Text-content-sha1: 83f4ab8e3e8b014068ff2af5cda452af47f2db62 Content-length: 528 SVN��XM$`�G��5T�ZB��� NPRERELEASE)" "" set Makever $(Makever) -DPRERELEASE=$(PREPRERELEASE)" "" set Docmakeargs VERSION="PuTTY pre-release $(PRERELEASE):r$(revisionPRERELEASE)" "" set Unxver $(PRERELEASE)pre $(revisionPRERELEASE)" "" set Iversion $(PRERELEASE):r$(revision) ifneq "$(PRERELEASE)" "" set Iname PuTTY pre-release $(PRERELEASE):r$(revision) ifneq "$(PRERELEASE)" "" set Ivertext Pre-release $(PRERELEASE):r$(revision) ifneq "$(PRERELEASE)" "" set Ifilename putty-$(PRERELEASE)-pre$(revision Node-path: putty-branch-0.61/mkunxarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f86fc61c64a9c462a502fdc311961540 Text-delta-base-sha1: 60b1653e5b7b854e498ff165b4f92748572b9072 Text-content-length: 415 Text-content-md5: 7bfe57374380d038e2e354c5c00056f9 Text-content-sha1: 19671e24609f2af0fac1776c39388306847629b9 Content-length: 415 SVN��2 �|��pre) set -- "${1%pre}" "$2" case "$1" in *[!.0-9a-z~]*) echo "Malformed prerelease ID '$1'">&2;exit 1;;esac case "$2" in *[!.0-9a-z~]*) echo "Malformed prerelease revision '$1'">&2;exit 1;;esac autoconfver="$1~pre$2" arcsuffix="-$autoconfver" ver="-DPRERELEASE=$1 -DSVN_REV=$2" docver="VERSION=\"PuTTY prerelease $1:r$2\"" ;; *) case "$1" in *[!.0-9a-z~ Node-path: putty-branch-0.61/version.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 91abcd747562e8eb6683c61aeaea4bca Text-delta-base-sha1: d6c4079af264b7425bf57001cd9714bf112417eb Text-content-length: 167 Text-content-md5: 3d627d93c0934642d67d89617bdbac43 Text-content-sha1: 1db47d7364cc3d2211dba7521990574e0a7d41f0 Content-length: 167 SVN���! �W��;EPRERELEASE char ver[] = "Pre-release " STR(PRERELEASE) ":r" STR(SVN_REV); char sshver[] = "PuTTY-Prerelease-" STR(PRERELEASE) ":r" STR(SVN_REV Revision-number: 9345 Prop-content-length: 319 Content-length: 319 K 8 svn:date V 27 2011-11-26T19:14:35.873490Z K 7 svn:log V 218 Job lot of new bug entries, covering all the fixes I've merged to branch-0.61 to go in the 0.62 release. It would be silly to start talking about an upcoming bug-fix release without having a list of the fixed bugs :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/gssapi-access-denied Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1052 Text-content-md5: 7b437e08f71c8f6a994dd003bcccb973 Text-content-sha1: 64ffb30f9931d787c41ec4e3d975f71430fa6987 Content-length: 1062 PROPS-END SVN���Summary: Spurious "Access denied" printed in the PuTTY window after GSSAPI failure Class: bug Difficulty: fun Priority: high Absent-in: 0.60 Present-in: 0.61 Fixed-in: r9232 Content-type: text/x-html-fragment <p> PuTTY 0.61 attempts GSSAPI authentication by default, before asking the user for any other kinds of authentication such as passwords or key passphrases. If that authentication fails (which it does in the very common case where GSSAPI is not set up) it prints "Access denied" in the window, and then proceeds with other methods of authentication. The "Access denied" message is ugly, and also confusing: it has confused a few users into thinking that the entire authentication phase had failed, instead of just one method. <p> As of r9232, this is fixed, and the logging of authentication messages in both the PuTTY window and the Event Log has been generally cleaned up so that a message about authentication failure is only printed if a message had already been displayed indicating that that method was even being tried. Node-path: putty-wishlist/data/pageant-backwards-compatibility Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1195 Text-content-md5: 5b8ad0694a8c1faad9a479a0bec3cb46 Text-content-sha1: 33c8bf2e44381f0756e5346c05be377a9d1db183 Content-length: 1205 PROPS-END SVN���Summary: 0.61-style Pageant does not work with 0.60-style PuTTY Class: bug Difficulty: fun Priority: high Present-in: 0.61 Fixed-in: r9264 Content-type: text/x-html-fragment <p> Pageant ensures that other concurrent users of the same Windows machine do not connect to it by checking that a SID on the file mapping object passed to it in each request matches its own. In 0.60, it checked the SID against its default one, which caused some troubles with Cygwin (see <a href="cygwin-clobbers-pageant.html">cygwin-clobbers-pageant</a>) which does something odd to the default SID. In 0.61, it was reworked to check the SID against the one identifying the running <em>user</em>, and all the Pageant clients were correspondingly modified to make that SID the owner of the file mapping. <p> Unfortunately, this has the side effect that Pageant 0.61 will not talk to PuTTY 0.60, and (perhaps even more importantly) not to any other program that still uses 0.60's SID selection, such as WinSCP. <p> The fix is to allow Pageant to accept <em>either</em> the default or user SID as the owner of the file mapping. We think this is still safe in terms of keeping other users out of Pageant. Node-path: putty-wishlist/data/pscp-nonstd-port-number Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 528 Text-content-md5: ecdfbdfed83141a7d508508ac195a78a Text-content-sha1: cbc3259061fc3903678c7ed1f1728e42e63d4507 Content-length: 538 PROPS-END SVN���Summary: PSCP and PSFTP do not honour nonstandard port numbers in saved sessions Class: bug Difficulty: fun Priority: high Present-in: 0.61 Fixed-in: r9254 Content-type: text/x-html-fragment <p> If you have a saved session directing PuTTY to connect to a machine by SSH but to use a port number other than 22, and then use that saved session as the host name in a PSCP or PSFTP command line, the non-standard port number is ignored and PSCP/PSFTP attempts to connect to the standard SSH port 22 on the same host. Node-path: putty-wishlist/data/puttytel-gssapi-assertion Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 421 Text-content-md5: 71544596bea4c20efe7dd4ce2042ae5f Text-content-sha1: a7c26d182e1582c7af10063e277e0980aa86b916 Content-length: 431 PROPS-END SVN���Summary: PuTTYtel fails a assertion when saving a session Class: bug Difficulty: fun Priority: high Absent-in: 0.60 Present-in: 0.61 Fixed-in: r9276 Content-type: text/x-html-fragment <p> PuTTYtel fails an assertion if you try to save a session, because the session saving code can't cope with an empty list of GSSAPI method strings (and PuTTYtel, unlike PuTTY proper, does not link any in). Easily fixed. Node-path: putty-wishlist/data/underlining-shifted-right Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 507 Text-content-md5: 040b896c9aff90a5b2fc57b2efa49fa8 Text-content-sha1: a12047a8f9660e98255f2c550030ddc909705b25 Content-length: 517 PROPS-END SVN���mmmSummary: Underlining on text displayed to the right of where it should be Class: bug Difficulty: fun Priority: high Absent-in: 0.60 Present-in: 0.61 Fixed-in: r9217 Content-type: text/x-html-fragment <p> During the Windows text-drawing reorganisation required to implement <a href="non-fixed-width-fonts.html">non-fixed-width-fonts</a>, a bug was introduced which can cause the underline on underlined text to be displayed somewhere off to the right rather than under the correct characters. Node-path: putty-wishlist/data/vt100-line-drawing-oprs Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 718 Text-content-md5: 14ae296b43789871d772dd5e3f685822 Text-content-sha1: e78cbef259cc5d4829eae0e0d3eb368dad9e4be0 Content-length: 728 PROPS-END SVN���@@@Summary: VT100 vertically offset horizontal line characters mis-displayed on Windows Class: bug Difficulty: fun Priority: high Present-in: 0.61 Fixed-in: r9221 Content-type: text/x-html-fragment <p> The VT100 line drawing character set contains four characters (encoded as o,p,r,s) which are vertically offset versions of the normal box-drawing horizontal line character (q). On Windows, PuTTY displays these by displaying the ordinary horizontal line with a vertical offset, since some fonts do not include the offset versions. <p> A bug in PuTTY's Windows text display code was causing other VT100 characters immediately to the right of one of those to be displayed using the same horizontal offset. Revision-number: 9346 Prop-content-length: 128 Content-length: 128 K 7 svn:log V 28 Oops. Always misspell that. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-11-26T23:26:35.731437Z PROPS-END Node-path: putty-wishlist/data/gssapi-access-denied Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7b437e08f71c8f6a994dd003bcccb973 Text-delta-base-sha1: 64ffb30f9931d787c41ec4e3d975f71430fa6987 Text-content-length: 25 Text-content-md5: 63857a2a0d4e839632ad685b81c0ed37 Text-content-sha1: bbf5d949e58842f1bb8b68a79508c1e50e0ae613 Content-length: 25 SVN�� �H��>Pbody Node-path: putty-wishlist/data/pageant-backwards-compatibility Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b8ad0694a8c1faad9a479a0bec3cb46 Text-delta-base-sha1: 33c8bf2e44381f0756e5346c05be377a9d1db183 Text-content-length: 25 Text-content-md5: e70ee287a65a58de3b2191b7672d0c6a Text-content-sha1: 721d67638b7580d7e4f3a7c59529b70d494cd659 Content-length: 25 SVN�� �%��p-body Node-path: putty-wishlist/data/pscp-nonstd-port-number Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ecdfbdfed83141a7d508508ac195a78a Text-delta-base-sha1: cbc3259061fc3903678c7ed1f1728e42e63d4507 Text-content-length: 25 Text-content-md5: 047547bbe87dc3905e28b2f84d607995 Text-content-sha1: 61915129aa1f73c515eec59c2c4616eb8508a610 Content-length: 25 SVN��~ �6��D>body Node-path: putty-wishlist/data/puttytel-gssapi-assertion Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 71544596bea4c20efe7dd4ce2042ae5f Text-delta-base-sha1: a7c26d182e1582c7af10063e277e0980aa86b916 Text-content-length: 25 Text-content-md5: b52dd1ce3c4fabb05c84ebaec8061fff Text-content-sha1: 4168b3f475b087508439580e78bbd559961da4cd Content-length: 25 SVN�� �/��`7body Node-path: putty-wishlist/data/underlining-shifted-right Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 040b896c9aff90a5b2fc57b2efa49fa8 Text-delta-base-sha1: a12047a8f9660e98255f2c550030ddc909705b25 Text-content-length: 25 Text-content-md5: b616eddf05525117c8ce2c8e3d8113d5 Text-content-sha1: 5c9fb13e858aa9b2e2c04515086aba1ed1a532f9 Content-length: 25 SVN��mi �?��&Gbody Node-path: putty-wishlist/data/vt100-line-drawing-oprs Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 14ae296b43789871d772dd5e3f685822 Text-delta-base-sha1: e78cbef259cc5d4829eae0e0d3eb368dad9e4be0 Text-content-length: 25 Text-content-md5: 72d5e00033dd5990d9bdaa2d71e588c8 Text-content-sha1: 96dd5e8f4ae51debfe9aff23ebac92ccd957c442 Content-length: 25 SVN��@< �:��~Bbody Revision-number: 9347 Prop-content-length: 114 Content-length: 114 K 7 svn:log V 14 Another typo. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-11-26T23:30:08.958470Z PROPS-END Node-path: putty-wishlist/data/puttytel-gssapi-assertion Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b52dd1ce3c4fabb05c84ebaec8061fff Text-delta-base-sha1: 4168b3f475b087508439580e78bbd559961da4cd Text-content-length: 42 Text-content-md5: 5d6506ad15678a9b0a2912180cbe18eb Text-content-sha1: 658dd7e354f4425915d59839ff5c250997e7caee Content-length: 42 SVN���zSummary: PuTTYtel fails an Revision-number: 9348 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2011-11-26T23:31:34.486922Z K 7 svn:log V 102 Cosmetic fix: make wishlist bug pages link back to .../wishlist/ instead of .../wishlist/index.html . K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bb9e2afc1bbb43f1b4f6d24848078e6a Text-delta-base-sha1: 03bb9bdc3396d4a2c2a63e8a6df82664d323c1d7 Text-content-length: 25 Text-content-md5: 16cf03780e99f4e545abde63f6a93eff Text-content-sha1: 93491872eedded5fe6a9caf937d064c1013480c0 Content-length: 25 SVN��0( �N��XX./ Revision-number: 9349 Prop-content-length: 462 Content-length: 462 K 8 svn:date V 27 2011-11-27T10:59:59.386343Z K 7 svn:log V 361 Enhance bugs2html to handle the situation in which we're making pre-release builds from a branch: you list the upcoming release in @releases as if it were already made from the branch, but add "pre" to the end of its entry. Also, mark the list of 0.62 bug fixes as Fixed-in: 0.62, so that they will show up in the new pre-release section on the Wishlist page. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 16cf03780e99f4e545abde63f6a93eff Text-delta-base-sha1: 93491872eedded5fe6a9caf937d064c1013480c0 Text-content-length: 1515 Text-content-md5: bf50de8432624c24fbbef6d629500069 Text-content-sha1: 86a55f6da29152ad2b885dea904e527067daac52 Content-length: 1515 SVN��({-0��L��E�W9�s�(�$is used to automatically add release version numbers to # the Fixed-in header, by inferring them from snapshot dates or SVN # revision numbers. # # Each entry maps a release version number to a _trunk_ snapshot date # and revision number. (The revision number is omitted for historic # releases when we didn't record it.) In the case of releases made # from a branch, the entry in this array should be the location on # trunk from which the branch started. We cannot (currently) # automatically handle fixes made on branches, so those must be # explicitly stated in bug records. # # You can also mark a release as "pre", meaning that it hasn't been # released yet. This only changes the wording on the output page. ## 0.56 and 0.57 were both released from a branch, so their dates # below are identical and both refer to the branch start point. [ "0.56", "2004-10-13" ], # real release date: 2004-10-26 [ "0.57", "2004-10-13" ], # real release date: 2005-02-20 # 0.62 will be from a branch made just after the 0.61 release, so # its date and rev are those of the branch start point. [ "0.62", "2011-07-12", "r9213", "pre" ], # [ "0.63($ver =~ m/^\d{4}-\d{2}-\d{2}$/ || $ver =~ m/^r\d+$/) { $name = "current snapshots"; } elsif (grep {$_->[0] eq $ver and $_->[3] eq "pre"} @releases) { $name = "pre-release builds of " . $ver; } else { $name = "release " . $ver; map s/^pre-release builds of Node-path: putty-wishlist/data/gssapi-access-denied Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 63857a2a0d4e839632ad685b81c0ed37 Text-delta-base-sha1: bbf5d949e58842f1bb8b68a79508c1e50e0ae613 Text-content-length: 25 Text-content-md5: 3ae488e1702e7b61edf3c9c261e9b7df Text-content-sha1: ca9319355d31376b4c976dd9dfd66393c447e63d Content-length: 25 SVN��  �-��^, 0.6 Node-path: putty-wishlist/data/pageant-backwards-compatibility Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e70ee287a65a58de3b2191b7672d0c6a Text-delta-base-sha1: 721d67638b7580d7e4f3a7c59529b70d494cd659 Text-content-length: 26 Text-content-md5: 403d530842c457bf745bd65b3a23f663 Text-content-sha1: 154d389de396a70181c07cfc7611bf88f3c7267a Content-length: 26 SVN�� � �� 0.62 Node-path: putty-wishlist/data/pscp-nonstd-port-number Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 047547bbe87dc3905e28b2f84d607995 Text-delta-base-sha1: 61915129aa1f73c515eec59c2c4616eb8508a610 Text-content-length: 26 Text-content-md5: 19e566747cf83d2827861bced14a6ffb Text-content-sha1: a93df37c4949a08ed98f521fd36a7c37423d8120 Content-length: 26 SVN��~ ���c 0.62 Node-path: putty-wishlist/data/puttytel-gssapi-assertion Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d6506ad15678a9b0a2912180cbe18eb Text-delta-base-sha1: 658dd7e354f4425915d59839ff5c250997e7caee Text-content-length: 26 Text-content-md5: a763191d490a0335403c7a7f8c25be13 Text-content-sha1: 496b268a47bce419522e547fd691b41004d13e77 Content-length: 26 SVN�� ��� 0.62 Node-path: putty-wishlist/data/underlining-shifted-right Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b616eddf05525117c8ce2c8e3d8113d5 Text-delta-base-sha1: 5c9fb13e858aa9b2e2c04515086aba1ed1a532f9 Text-content-length: 26 Text-content-md5: 135ed8449e226278f05fbcbb8711024d Text-content-sha1: 7fc760fc6edbb472d6c28eb8a1d9481f231faa9e Content-length: 26 SVN��in �$��E$ 0.62 Node-path: putty-wishlist/data/vt100-line-drawing-oprs Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 72d5e00033dd5990d9bdaa2d71e588c8 Text-delta-base-sha1: 96dd5e8f4ae51debfe9aff23ebac92ccd957c442 Text-content-length: 26 Text-content-md5: b35d959aaf94a76847b91e879e9bd98d Text-content-sha1: 3ee929400c4126d75fe02d9b3cc17d8508d53002 Content-length: 26 SVN��<A ��� 0.62 Revision-number: 9350 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2011-11-27T11:08:00.716082Z K 7 svn:log V 69 Changes to the website to provide pre-release branch builds of 0.62. K 10 svn:author V 5 simon PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bf040068087b7ea189a66fcfe279283a Text-delta-base-sha1: 9cff62b36346ddf975a73591e11b7b82e2a8c7fa Text-content-length: 3655 Text-content-md5: 9a22d09920ecd8f343c18db5f17420d0 Text-content-sha1: d7a4e9fa7cfadc9eb7bf11219c1b4737328423e1 Content-length: 3655 SVN��v_>z�v�� L�gl�H}�^/�ZzC�H�_v�F@�{6�e1�I@�]q�xN�H�\-�F@�yg�g`�H}�F@�k|�^g�F@�~%�m#�H}�ao�|Ps�\3�F@�3x�B�F@�H1�_yp�J@�ayc�Y1�v �e�e�[>�V+ �Yv�J@g�~r-�r8U�00�ht�v\�F@�B@�m�o��koh�^6�D2!-- Special section for pre-releases. I expect to comment this whole section in and out depending on whether any version of PuTTY is currently in the pre-release stage. The wording in this introductory paragraph will probably want to change slightly each time - it mentions specific version numbers, and it also says 'contain bug fixes not present in the previous release' when it might in some cases want to say 'features'. --> <p><i>Pre-releases of 0.62</i>. These are snapshots of the PuTTY code which we hope will shortly become the 0.62 release. They do not contain all the features of the development snapshots (below), but they contain bug fixes that are not present in the 0.61 release, and should be stable. If you find any serious bugs in these, let us know, so we can fix them before making a proper release! </p> <p> (The filename of the pre-release installer contains the revision number of the pre-release code, so it may change sometimes. It is not offered by FTP, because FTP does not support the redirect mechanism that 062pre062pre-snapshots/x86/putty062pre062pre-snapshotsartarus.org/~simon/putty062pre-snapshots/x86/puttytel.exe">puttytel062pre062pre-snapshots/x86/puttytel.exe062pre062pre062pre-snapshots/x86/psc062pre062pre062pre-snapshots/x86/psftp.exe">psftp062pre062pre-snapshots/x86/psftp.exe062pre062pre062pre-snapshots/x86/plink062pre-snapshots/x86/plink.exe062pre-snapshots/x86/plink.exe.DSA">(DSA sig)</a></td> </tr> <tr> <td>Pageant:</td> <td><a href="http://tartarus.org/~simon/putty062pre062pre062pre-snapshots/x86/pageant.exe062pre062pre062pre-snapshots/x86/puttygen062pre062pre062pre-snapshots/x86/putty.zip">putty.zip</a></td> <td><a href="ftp://ftp.tartarus.org/pub/people/simon/putty062pre062pre-snapshots/x86/putty.zip062pre-snapshotsartarus.org/~simon/putty062pre062pre-snapshots/x86/putty-installer.exe062pre062pre062pre-snapshots/md5sums">(or by FTP)</a></td> <td><a href="http://tartarus.org/~simon/putty062pre-snapshots/md5062pre-snapshots/md5sums.DSA">(DSA sig)</a></td> </tr> <tr> <td>SHA-1:</td> <td><a href="http://tartarus.org/~simon/putty062pre062pre-snapshots/sha1sums">(or by FTP)</a></td> <td><a href="http://tartarus.org/~simon/putty062pre062pre062pre062pre-snapshots/sha256sums">(or by FTP)</a></td> <td><a href="http://tartarus.org/~simon/putty062pre062pre-snapshotsartarus.org/~simon/putty062pre-snapshots/sha512sums">sha512sums</a></td> <td><a href="ftp://ftp.tartarus.org/pub/people/simon/putty062pre062pre-snapshots/sha512062pre-snapshots/sha512sums.DSA">(DSA sig)</a></td> </tr> </table> <!-- End of pre-releases section. --release or pre-release source, you will need to unpack one of these archives, change into the "<code>unix</code>" subdirectory, and type "<code>make -f Makefile.gtk</code>". To build the development snapshot source, you can just do the standard thing of <code>./configure && make</code>. See the file the snapshot date, so it will change every night. The pre-release source archive similarly contains a revision number. These files are not offered by FTP, because FTP does not support the redirect mechanism that 0.62 pre-release062pre062pre-snapshots/putty.tar.gz062pre-snapshots/putty.tar.gz0.62 pre-release062pre062pre-snapshots/putty-src.zip">(or by FTP)</a></td> <td><a href="http://tartarus.org/~simon/putty062pre062pre-snapshots Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f15ac95bbc33c239cd7799b1ab168dd Text-delta-base-sha1: 34d540d5d810d0d590eb153957344f5292da9a37 Text-content-length: 521 Text-content-md5: f9324a0175c8af28ef9287f9c97b0e6c Text-content-sha1: 83b433b9f35a6a70ba9d38dbf5e0f5e8d473f913 Content-length: 521 SVN��{z q�<�q�M.11-27 PuTTY 0.62 pre-release builds available</b> <p> PuTTY 0.61 had a few noticeable bugs in it (but nothing security-related), so we are planning to make a 0.62 release containing just bug fixes. The Wishlist page lists the bugs that will be fixed by the 0.62 release. The Download page now contains pre-release snapshots of 0.62, which contain those bug fixes and should be otherwise stable. (The usual development snapshots, containing other development since 0.61, are also still available.) Revision-number: 9351 Prop-content-length: 203 Content-length: 203 K 7 svn:log V 102 Add a release checklist entry to remind me to get rid of 'pre-release' sections on the Download page. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-11-27T11:10:15.016175Z PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fbf715a54e4a6942b9749c71529b298 Text-delta-base-sha1: 7dd2aebf1733cb2686ad521549e8bd86710faddc Text-content-length: 263 Text-content-md5: 82673e356ac755d6d480cc8cdacf931f Text-content-sha1: 9ee9dcdd40d11d27d3622c2fa1af161c9e450c88 Content-length: 263 SVN��~ o�V�o�9OCheck over the Download page and remove any mention of pre-releases, if there were any before this release. Comment out the big pre-release section at the top, and also adjust the sections about source archives at the bottom Revision-number: 9352 Prop-content-length: 273 Content-length: 273 K 8 svn:date V 27 2011-11-27T11:11:20.431250Z K 7 svn:log V 172 Merge r9351 (release checklist update). I can easily see myself using the branch copy of the checklist for 0.62 and forgetting things I only added to the trunk version :-) K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.61/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fbf715a54e4a6942b9749c71529b298 Text-delta-base-sha1: 7dd2aebf1733cb2686ad521549e8bd86710faddc Text-content-length: 263 Text-content-md5: 82673e356ac755d6d480cc8cdacf931f Text-content-sha1: 9ee9dcdd40d11d27d3622c2fa1af161c9e450c88 Content-length: 263 SVN��~ o�V�o�9OCheck over the Download page and remove any mention of pre-releases, if there were any before this release. Comment out the big pre-release section at the top, and also adjust the sections about source archives at the bottom Revision-number: 9353 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2011-11-28T19:17:04.345282Z K 7 svn:log V 106 I missed a bit in r9343: windows/version.rc2 also needed updating for the new 'pre-release' version type. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bff36c30bcd40f81e2c0b88aab213d8d Text-delta-base-sha1: 6662a068ce64142fdaf13ebd8cdff35e8f654a91 Text-content-length: 148 Text-content-md5: a1a55046065b95c2e3f746bcada6a384 Text-content-sha1: ed08d56de438728927b0b278abfa339052ad5bdd Content-length: 148 SVN��Rb ~�k�~�yYPRERELEASE #define VERSION_TEXT "Pre-release " STR(PRERELEASE) ":r" STR(SVN_REV); #define BINARY_VERSION BASE_VERSION,SVN_REV Revision-number: 9354 Prop-content-length: 159 Content-length: 159 K 8 svn:date V 27 2011-11-28T19:19:34.158567Z K 7 svn:log V 59 Merge r9353 (missing bit of 'pre-release' version spport). K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.61/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bff36c30bcd40f81e2c0b88aab213d8d Text-delta-base-sha1: 6662a068ce64142fdaf13ebd8cdff35e8f654a91 Text-content-length: 148 Text-content-md5: a1a55046065b95c2e3f746bcada6a384 Text-content-sha1: ed08d56de438728927b0b278abfa339052ad5bdd Content-length: 148 SVN��Rb ~�k�~�yYPRERELEASE #define VERSION_TEXT "Pre-release " STR(PRERELEASE) ":r" STR(SVN_REV); #define BINARY_VERSION BASE_VERSION,SVN_REV Revision-number: 9355 Prop-content-length: 351 Content-length: 351 K 8 svn:date V 27 2011-11-28T19:23:43.553867Z K 7 svn:log V 250 Tiny patch from Martin Packman to fix a Windows handle leak in Pageant's IPC mechanism. It's incomplete (he sent a much more comprehensive set of fixes that I haven't reviewed), but should be adequate to mitigate a particular issue for Bazaar users. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6be7ae0fb41a0ba4925f122eed9bb6cd Text-delta-base-sha1: ddf435e74af170ab38e3b95cbb3ba92c68bb4ab0 Text-content-length: 142 Text-content-md5: 417514aacc514f194ff717149979bd29 Text-content-sha1: 48e4f6968a0093e38f97024d6e89f61dca11d4bd Content-length: 142 SVN��2x t�^�t�& { CloseHandle(filemap); return 0; /* security ID mismatch! */ } Revision-number: 9356 Prop-content-length: 139 Content-length: 139 K 8 svn:date V 27 2011-11-28T19:24:15.599710Z K 7 svn:log V 39 Merge r9355 (Pageant handle leak fix). K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.61/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a548e39e80973643ce99a3c183847828 Text-delta-base-sha1: c8f25799efb0803f9def4c53f10d4c14b95d555b Text-content-length: 142 Text-content-md5: a1019f13053fa77943c0213c73af54ef Text-content-sha1: 1eaa7dc467a11e4f76eaff41b406f918b1881031 Content-length: 142 SVN��M t�y�t�&' { CloseHandle(filemap); return 0; /* security ID mismatch! */ } Revision-number: 9357 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2011-12-07T19:07:02.433286Z K 7 svn:log V 68 Add a missing free_prompts() call in the keyboard-interactive code. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 76d9f55a25a740a6694cbbb2609386d8 Text-delta-base-sha1: 409bcae31a3cff77e4d56eb5fcd5e51dd304cf2a Text-content-length: 687 Text-content-md5: 061714d91e5020f99ba70c29eff37896 Text-content-sha1: 422cfc3c2dab9a7d8d0cf21f706221d152f5d1e6 Content-length: 687 SVN������������������0�"�0�. /* * Free the prompts structure from this iteration. * If there's another, a new one will be allocated * when we return to the top of this while loop. */ free_prompts(s->cur_prompt�!U44!�_backend = { ssh_init, ssh_free, ssh_reconfig, ssh_send, ssh_sendbuffer, ssh_size, ssh_special, ssh_get_specials, ssh_connected, ssh_return_exitcode, ssh_sendok, ssh_ldisc, ssh_provide_ldisc, ssh_provide_logctx, ssh_unthrottle, ssh_cfg_info, Revision-number: 9358 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2011-12-07T19:09:29.238151Z K 7 svn:log V 36 Merge r9357 (missing free_prompts). K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.61/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dbf1e4a1d903bea90e2cc9ec842222f7 Text-delta-base-sha1: 36dac5ff0463cbb312e521ca9868c56cd189a451 Text-content-length: 365 Text-content-md5: 2097f9608e31ec69c457d2e21c2f28a5 Text-content-sha1: 3a4a8b93f4ba01b0d16e575d15fdef63dc44ae87 Content-length: 365 SVN����������������B0�)�0�i% /* * Free the prompts structure from this iteration. * If there's another, a new one will be allocated * when we return to the top of this while loop. */ free_prompts(s->cur_prompt Revision-number: 9359 Prop-content-length: 403 Content-length: 403 K 8 svn:date V 27 2011-12-08T19:15:52.203369Z K 7 svn:log V 302 Block SIGPIPE in Unix plink. In a port-forwarding run we may have lots of local sockets and pipes all open at once, and if one of them is uncleanly closed from the remote end we don't want the whole application to die - we want to close that socket's SSH channel and continue with the rest of the run. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d568612e1013f4b4e67897ade8dd5e20 Text-delta-base-sha1: 4e4a464beed4c3d2c23b244ebc62e257a7036842 Text-content-length: 177 Text-content-md5: 3e696b8dfed04dfe4cc8fb926ecb3c0f Text-content-sha1: 897f2f189512c2aba71ce5bf253b4e2fdcd53ca5 Content-length: 177 SVN��Ip�H��6Block SIGPIPE, so that we'll get EPIPE individually on * particular network connections that go wrong. */ putty_signal(SIGPIPE, SIG_IGN Revision-number: 9360 Prop-content-length: 374 Content-length: 374 K 8 svn:date V 27 2011-12-08T19:15:53.029493Z K 7 svn:log V 273 Make sure we never send window adjustments (or winadjes) on channels for which we've already sent CHANNEL_CLOSE. It would be embarrassing if the remote end had also sent CHANNEL_CLOSE in response and then received our communication once it had forgotten about the channel. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 061714d91e5020f99ba70c29eff37896 Text-delta-base-sha1: 422cfc3c2dab9a7d8d0cf21f706221d152f5d1e6 Text-content-length: 317 Text-content-md5: 5c66f6e3f7d08ffd0a43c089e8494452 Text-content-sha1: e55bfd314800a0362eedf5d0307c503a9d1a5329 Content-length: 317 SVN����������� n�<�n�Vh Ditto if _we've_ already sent * CLOSE. */ if (c->closes & (CLOSES_RCVD_EOF | CLOSES_SENT_CLOSE)���BB�>�cwindow -= length; c->v.v2.remlocwin -= length; switch (c->type)�UBB�U�h ssh = (Ssh) handle; return ssh->fallback_cmd; } Backend ssh Revision-number: 9361 Prop-content-length: 136 Content-length: 136 K 7 svn:log V 36 Whitespace fix while I was passing. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-12-08T19:15:54.093156Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c66f6e3f7d08ffd0a43c089e8494452 Text-delta-base-sha1: e55bfd314800a0362eedf5d0307c503a9d1a5329 Text-content-length: 75 Text-content-md5: 03aca42d22f90039e45f1ac56a11ad04 Text-content-sha1: 89d7dfb77f520dfe60c18bb8b873d0b8c1e7c996 Content-length: 75 SVN����������� �H��6Jcw����~h ��� Revision-number: 9362 Prop-content-length: 257 Content-length: 257 K 7 svn:log V 156 When we receive CHANNEL_CLOSE on an SSH-2 channel and haven't sent EOF on it yet, we should send EOF on _that channel_, not the main session channel! Oops. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-12-08T19:15:55.456040Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 03aca42d22f90039e45f1ac56a11ad04 Text-delta-base-sha1: 89d7dfb77f520dfe60c18bb8b873d0b8c1e7c996 Text-content-length: 83 Text-content-md5: 0f2e644fce182e53c46fc23e0ee092be Text-content-sha1: a02ee1d02b6e5f9c4a5b2ad17b6ee53901829414 Content-length: 83 SVN������������������ ���Z&cssh = (Ssh) � �� Revision-number: 9363 Prop-content-length: 314 Content-length: 314 K 8 svn:date V 27 2011-12-08T19:15:57.387905Z K 7 svn:log V 213 Arrange to call net_pending_errors on Unix, which we've never actually remembered to do before! Also some related fixes, such as that after we do so we should immediately stop selecting on the socket in question. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c71056c3dcb1d57303397479c2de264d Text-delta-base-sha1: 75d5a0e48d73885336ed37e11eac638c1d4a44d1 Text-content-length: 1110 Text-content-md5: 3ac79083ce030ff7c598a146ff8ae220 Text-content-sha1: df45a66d825f6a9c64183a05a7b917c7aa3aa18b Content-length: 1110 SVN����� ��eint frontend_net_pending_error_idle_id; int frontend_got_net_pending_errors = FALSE; gboolean frontend_net_pending_errors(gpointer data) { net_pending_errors(); gtk_idle_remove(frontend_net_pending_error_idle_id); frontend_got_net_pending_errors = FALSE; return FALSE; } void frontend_net_error_pending(void) { if (!frontend_got_net_pending_errors) { frontend_got_net_pending_errors = TRUE; frontend_net_pending_error_idle_id = gtk_idle_add(frontend_net_pending_errors, NULL); }�x�x�ow(inst->area); if (conf_get_int(inst->conf, CONF_scrollbar)) gtk_widget_show(inst->sbar); else gtk_widget_hide(inst->sbar); gtk_widget_show(GTK_WIDGET(inst->hbox)); if (inst->gotpos) { int x = inst->xpos, y = inst->ypos; GtkRequisition req; gtk_widget_size_request(GTK_WIDGET(inst->window), &req); if (inst->gravity & 1) x += gdk_screen_width() - req.width; if (inst->gravity & 2) y += gdk_screen_height() - req.height; gtk_window_set_position(GTK_WINDOW(inst->window), GTK Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b175b69546a7cc9b02c342c8f74f07d8 Text-delta-base-sha1: f67af406c70926d09807564d1dbf90632ff383d5 Text-content-length: 269 Text-content-md5: 0f170f308bb73bb99354d2800f609596 Text-content-sha1: 18aaef11e974ef183e2f165878dce6ed5c1cc303 Content-length: 269 SVN��ts u�R�u�,HFunction provided by front ends, and called by uxnet.c to indicate * that net_pending_errors() would like to be called back when the * front end has a spare moment and isn't deep in any other recursion. */ void frontend_net_error_pending(void Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c43addcafa048055ed9ceabbd3555b4e Text-delta-base-sha1: 81301445cdd814fc95aeee35bf285bf93a290f36 Text-content-length: 894 Text-content-md5: 4a247bdb95a74e6406183527cb18214e Text-content-sha1: 1f5fc396d1933caa194152545886a93089399635 Content-length: 894 SVN��^#Y�:��18?�_ /* * Immediately cease selecting on this socket, so that * we don't tight-loop repeatedly trying to do * whatever it was that went wrong. */ uxsel_tell(s); /* * Notify the front end that it might want to call us. */ frontend_net_error_pending()!s->pending_error) { if (s->listener) { rwx |= 1; /* read == accept */ } else { if (!s->connected) rwx |= 2; /* write == connect */ if (s->connected && !s->frozen && !s->incomingeof) rwx |= 1 | 4; /* read, except */ if (bufchain_size(&s->output_data)) rwx |= 2; /* write */ } Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3e696b8dfed04dfe4cc8fb926ecb3c0f Text-delta-base-sha1: 897f2f189512c2aba71ce5bf253b4e2fdcd53ca5 Text-content-length: 98 Text-content-md5: f17d20f5575c4e6c69e931185ea013a0 Text-content-sha1: fbacd2075741ab8f1704e71dd21e56638a488999 Content-length: 98 SVN��p9D�9��\6�`void frontend_net_error_pending(void) { net_pending_errors(); Node-path: putty/unix/uxpterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5359fa8b280cef2277b7aef87690f16f Text-delta-base-sha1: 9c4ab8d2ccca6bd43d83390c967142dff0a77851 Text-content-length: 316 Text-content-md5: 3e93863a37db61e55908a45ebc994e7f Text-content-sha1: 738110002dc187aafbece2afcd531e10f9a0e658 Content-length: 316 SVN��' $�b�$�!^void net_pending_errors(void) { /* * Stub version of net_pending_errors(), because gtkwin.c has to * be prepared to call it when linked into PuTTY and therefore we * have to avoid a link failure when linking gtkwin.c in turn into * a non-networked application. */ Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fef11e60f28c87d551723eed0fd7048 Text-delta-base-sha1: 65987c3c4410bcdd944b2fef863b7d1c776b3bbc Text-content-length: 60 Text-content-md5: d36ae5d71c1930009cc24b93d374c08a Text-content-sha1: 9b402e90bc594ee42ec5326bb5a58415881fae46 Content-length: 60 SVN��/Y '�z��8wvoid frontend_net_error_pending(void) { Revision-number: 9364 Prop-content-length: 1239 Content-length: 1239 K 8 svn:date V 27 2011-12-08T19:15:58.987644Z K 7 svn:log V 1137 Introduce a function sshfwd_unclean_close(), supplied by ssh.c to subsidiary network modules like portfwd.c. To be called when the subsidiary module experiences a socket error: it sends an emergency CHANNEL_CLOSE (not just outgoing CHANNEL_EOF), and immediately deletes the local side of the channel. (I've invented a new channel type in ssh.c called CHAN_ZOMBIE, for channels whose original local side has already been thrown away and they're just hanging around waiting to receive the acknowledging CHANNEL_CLOSE.) As a result of this and the last few commits, I can now run a port forwarding session in which a local socket error occurs on a forwarded port, and PuTTY now handles it apparently correctly, closing both the SSH channel and the local socket and then actually recognising that it's OK to terminate when all _other_ channels have been closed. Previously the channel corresponding to the duff connection would linger around (because of net_pending_errors never being called), and keep being selected on (hence chewing CPU), and inhibit program termination at the end of the session (because not all channels were closed). K 10 svn:author V 5 simon PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a0f527a513facf78c84c77d322012f5a Text-delta-base-sha1: e7bdfcc26d784f65653636778d8025f918634b1b Text-content-length: 346 Text-content-md5: 758b0bed9d05ea5d32207c7eb11f2a84 Text-content-sha1: 4172a8c964645dccc5dc9dff9dc925a0af136f0f Content-length: 346 SVN��f& B� �B�[ if (error_msg) { /* * Socket error. Slam the connection instantly shut. */ sshfwd_unclean_close(pr->c); } else { /* * Ordinary EOF received on socket. Send an EOF on the SSH * channel. */ if (pr->c) sshfwd_write_eof(pr->c); } Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f2e644fce182e53c46fc23e0ee092be Text-delta-base-sha1: a02ee1d02b6e5f9c4a5b2ad17b6ee53901829414 Text-content-length: 3081 Text-content-md5: 0dda595b0a2e6583dec971645abf13fc Text-content-sha1: c92feaf081bb749e98d11c7ff270a05f8f8c0aec Content-length: 3081 SVN����v�3�v�W`, /* one the remote hasn't confirmed */ /* * CHAN_ZOMBIE is used to indicate a channel for which we've * already destroyed the local data source: for instance, if a * forwarded port experiences a socket error on the local side, we * immediately destroy its local socket and turn the SSH channel * into CHAN_ZOMBIE. */ CHAN_ZOMBIE���{I��b�UoP� _id[i]; } if (hostkey.bytes > servkey.bytes) { ret = rsaencrypt(s->rsabuf, 32, &servkey); if (ret) ret = rsaencrypt(s->rsabuf, servkey.bytes, &hostkey); } else { ret = rsaencrypt(s->rsabuf, 32, &hostkey); if (ret) ret = rsaencrypt(s->rsabuf, hostkey.bytes, &servkey); } if (!ret) { bombout(("Svoid sshfwd_unclean_close(struct ssh_channel *c) { Ssh ssh = c->ssh; struct Packet *pktoutCLOSE) return; pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_send(ssh, pktout); c->closes |= CLOSES_SENT_EOF | CLOSES_SENT_CLOSE; switch (c->type) { case CHAN_X11: x11_close(c->u.x11.s); break; case CHAN_SOCKDATA: case CHAN_SOCKDATA_DORMANT: pfd_close(c->u.pfd.s); break; } c->type = CHAN_ZOMBIE; ssh2_channel_check_close���G�L=t�_f]�f_v�(�!ssh2_handle_winadj_response(c)) ssh_disconnect(ssh, NULL, "Received unsolicited SSH_MSG_CHANNEL_FAILURE", SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE); } static void ssh2_msg_channel_window_adjust(Ssh ssh, struct Packet *pktin) {!(c->closes & CLOSES_SENT_EOF)) { c->v.v2.remwindow += ssh_pkt_getuint32(pktin); ssh2_try_send_and_unthrottle(ssh, c); } } static void ssh2_msg_channel_data(Ssh ssh, struct Packet *pktin) { char *data; int pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA && ssh_pkt_getuint32(pktin) != SSH2_EXTENDED_DATA_STDERR) return; /* extended but not stderr */ ssh_pkt_getstring(pktin, &data, &length); if (data) { int bufsize = 0; c->v.v2.locw� aXX� �h->echoing; if (option == LD_EDIT) return ssh->editing; return FALSE; } static void ssh_provide_ldisc(void *handle, void *ldisc) { Ssh ssh = (Ssh) handle; ssh->ldisc = ldisc; } static void ssh_provide_logctx(void *handle, void *logctx) { Ssh ssh = (Ssh) handle; ssh->logctx = logctx; } static int ssh_return_exitcode(void *handle) { Ssh ssh = (Ssh) handle; if (ssh->s != NULL) return -1; else return (ssh->exitcode >= 0 ? ssh->exitcode : INT_MAX); } /* * cfg_info for SSH is the currently running version of the * protocol. (1 for 1; 2 for 2; 0 for not-decided-yet.) */ static int ssh_cfg_info(void *handle) { Ssh ssh = (Ssh) handle; return ssh->version; } /* * Gross hack: pscp will try to start SFTP but fall back to scp1 if * that fails. This variable is the means by which scp.c can reach * into the SSH code and find out which one it got. */ extern int ssh_fallback_cmd(void *handle) { Ssh ssh = (Ssh) Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ade8154c1b4fc0e13ce0bdae5f0bd351 Text-delta-base-sha1: 4e1562797ed1111ba7107b56674b1d239144adc8 Text-content-length: 35 Text-content-md5: 0c491742e4d0b5b6247dd245bb3f438a Text-content-sha1: 94eb396dc190b7e3d03af2b5646dccb7178ae47b Content-length: 35 SVN��p) �*��t|clean_close Revision-number: 9365 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2011-12-10T12:07:46.682594Z K 7 svn:log V 66 Bump version number on trunk prior to tagging 0.62 on the branch. K 10 svn:author V 5 simon PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25e33d33b64f95aa3af081adfdf0c043 Text-delta-base-sha1: 5b3beea4d672694501c862bdec39fe2e86fb6e91 Text-content-length: 15 Text-content-md5: c58a166d50ab58c0991b57965c5555ca Text-content-sha1: c58b92b3476de1d38a9875bd590d5da421492d7e Content-length: 15 SVN��0.62 Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b261d7b995ff3d6f872b594bc563a1e8 Text-delta-base-sha1: 6b0955f9588ec01eefc01a6ae572c3d87fdc465a Text-content-length: 22 Text-content-md5: a3b0d2d97beaae22565746d74b00314f Text-content-sha1: 8987d9de45840d03304f6fe36c6e8026d08c9753 Content-length: 22 SVN��99 ���2 Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 765372e750033f47f00bfb7629039e7d Text-delta-base-sha1: be7d41c6281b0fd1eae7365d86ebc2cb9e1a99e9 Text-content-length: 22 Text-content-md5: 4d57cbafc24a804d711939dce9f77385 Text-content-sha1: 2c5f998878d3d197feae9a7cd924ec92efabf04d Content-length: 22 SVN��`` ���[2 Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b74e0cb0d88db79d29cb18e12f752693 Text-delta-base-sha1: aa3cf9cf85b019dd8ed21fbd2191bcde10fa3bc2 Text-content-length: 102 Text-content-md5: a4602aaeab7dc553235952d7efc4ba08 Text-content-sha1: 9056464cfe28edbe7ad974571f51ca3606aa9043 Content-length: 102 SVN�� P�=�P� 2 VersionInfoTextVersion=Release 0.62 AppVersion=0.62 VersionInfoVersion=0.62 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a1a55046065b95c2e3f746bcada6a384 Text-delta-base-sha1: ed08d56de438728927b0b278abfa339052ad5bdd Text-content-length: 22 Text-content-md5: a3eacac9b46f03bc178ed5cf54f0ac50 Text-content-sha1: e7c92159c5a42bd2e106e26530292be92f457312 Content-length: 22 SVN��bb �\��]2 Revision-number: 9366 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2011-12-10T12:08:09.707133Z K 7 svn:log V 43 Merge r9365 (bump version number to 0.62). K 10 svn:author V 5 simon PROPS-END Node-path: putty-branch-0.61/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25e33d33b64f95aa3af081adfdf0c043 Text-delta-base-sha1: 5b3beea4d672694501c862bdec39fe2e86fb6e91 Text-content-length: 15 Text-content-md5: c58a166d50ab58c0991b57965c5555ca Text-content-sha1: c58b92b3476de1d38a9875bd590d5da421492d7e Content-length: 15 SVN��0.62 Node-path: putty-branch-0.61/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b261d7b995ff3d6f872b594bc563a1e8 Text-delta-base-sha1: 6b0955f9588ec01eefc01a6ae572c3d87fdc465a Text-content-length: 22 Text-content-md5: a3b0d2d97beaae22565746d74b00314f Text-content-sha1: 8987d9de45840d03304f6fe36c6e8026d08c9753 Content-length: 22 SVN��99 ���2 Node-path: putty-branch-0.61/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 765372e750033f47f00bfb7629039e7d Text-delta-base-sha1: be7d41c6281b0fd1eae7365d86ebc2cb9e1a99e9 Text-content-length: 22 Text-content-md5: 4d57cbafc24a804d711939dce9f77385 Text-content-sha1: 2c5f998878d3d197feae9a7cd924ec92efabf04d Content-length: 22 SVN��`` ���[2 Node-path: putty-branch-0.61/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b74e0cb0d88db79d29cb18e12f752693 Text-delta-base-sha1: aa3cf9cf85b019dd8ed21fbd2191bcde10fa3bc2 Text-content-length: 102 Text-content-md5: a4602aaeab7dc553235952d7efc4ba08 Text-content-sha1: 9056464cfe28edbe7ad974571f51ca3606aa9043 Content-length: 102 SVN�� P�=�P� 2 VersionInfoTextVersion=Release 0.62 AppVersion=0.62 VersionInfoVersion=0.62 Node-path: putty-branch-0.61/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a1a55046065b95c2e3f746bcada6a384 Text-delta-base-sha1: ed08d56de438728927b0b278abfa339052ad5bdd Text-content-length: 22 Text-content-md5: a3eacac9b46f03bc178ed5cf54f0ac50 Text-content-sha1: e7c92159c5a42bd2e106e26530292be92f457312 Content-length: 22 SVN��bb �\��]2 Revision-number: 9367 Prop-content-length: 118 Content-length: 118 K 10 svn:author V 5 simon K 8 svn:date V 27 2011-12-10T12:08:39.065868Z K 7 svn:log V 18 Tag 0.62 release. PROPS-END Node-path: putty-0.62 Node-kind: dir Node-action: add Node-copyfrom-rev: 9366 Node-copyfrom-path: putty-branch-0.61 Revision-number: 9368 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2011-12-10T13:47:29.440409Z K 7 svn:log V 38 Add entry for password-not-wiped fix. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/password-not-wiped Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1758 Text-content-md5: 7f6364ecfca915001e07346b21854bc2 Text-content-sha1: 42e4d73943c4d42c975e5da760a0653f351eb31c Content-length: 1768 PROPS-END SVN���PPPSummary: Passwords left in memory using SSH keyboard-interactive auth Class: vulnerability Difficulty: fun Priority: high Absent-in: 0.58 Present-in: 0.59 0.60 0.61 Fixed-in: r9357 2011-12-08 0.62 Content-type: text/x-html-body <p> When PuTTY has sensitive data in memory and has no further need for it, it should wipe the data out of its memory, in case malware later gains access to the PuTTY process or the memory is swapped out to disk or written into a crash dump file. An obvious example of this is the password typed during SSH login; other examples include obsolete session keys, public-key passphrases, and the private halves of public keys. <p> PuTTY 0.59 to 0.61 inclusive had a bug in which they failed to wipe from memory the replies typed by the user during <code>keyboard-interactive</code> authentication. Since most modern SSH-2 servers use the <code>keyboard-interactive</code> method for password logins (rather than SSH-2's dedicated <code>password</code> method), this meant that those versions of PuTTY would store your login password in memory for as long as they were running. <p> PuTTY 0.62 fixes this bug. Keyboard-interactive responses, including passwords, are now correctly wiped from PuTTY's memory again. <p> However, it is still <em>unavoidably</em> very dangerous if malicious software is in a position to read the memory of your PuTTY processes: there is still a lot of sensitive data in there which cannot be wiped because it's still being used, e.g. session keys. If you're using public-key authentication and malware can read a Pageant process, that's even worse, because the decrypted private keys are stored in Pageant! This fix somewhat mitigates the risks, but no fix can eliminate them completely. Revision-number: 9369 Prop-content-length: 128 Content-length: 128 K 8 svn:date V 27 2011-12-10T13:50:17.839302Z K 7 svn:log V 28 Add 0.62 to releases array. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bf50de8432624c24fbbef6d629500069 Text-delta-base-sha1: 86a55f6da29152ad2b885dea904e527067daac52 Text-content-length: 175 Text-content-md5: 6d7b3c8830304b5f7615c7d7d77a51e4 Text-content-sha1: b1756b68b1398c1a134309d73e50b31f7805361e Content-length: 175 SVN��{p ���C8as from a branch made just after the 0.61 release, so its # date and rev are those of the branch start point. [ "0.62", "2011-07-12", "r9213 Revision-number: 9370 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 34 Website changes for 0.62 release. K 10 svn:author V 5 simon K 8 svn:date V 27 2011-12-10T13:54:11.634021Z PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff962867c76f710ea5b9876fdad61248 Text-delta-base-sha1: c7f6e77e68197380d754b99bf401351ff2fea1a8 Text-content-length: 90 Text-content-md5: e6132a7a65aee823515d62240060f5e6 Text-content-sha1: bc299423d24a26a238100c5f78b6b7a454ce3d03 Content-length: 90 SVN��%t D�`�D�PUtemp /~sgtatham/putty/0.62/ http://the.earth.li/~sgtatham/putty/0.62 Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bb0e615983bc13998e833cdd82b8a4a7 Text-delta-base-sha1: 8823a47176d55d80a84ca56801312d0146a6a98b Text-content-length: 835 Text-content-md5: 06ed490a34fd85f46c2bfe1f7e0cea14 Text-content-sha1: 7998b4a9186b101df45a95f3a2a3bd929d422b17 Content-length: 835 SVN��,f (��(�&2 (released 2011-12-10): <ul> <li> Security fix: PuTTY no longer retains passwords in memory by mistake. <li> Bug fix: Pageant now talks to both new-style clients (0.61 and above) and old-style (0.60 and below). <li> Bug fix: PuTTY no longer prints a spurious "Access denied" message when GSSAPI authentication fails. <li> Bug fix: PSCP and PSFTP now honour nonstandard port numbers in SSH saved sessions. <li> Bug fix: Pageant no longer leaks a file handle when an authentication fails. <li> Bug fix: PuTTYtel no longer crashes when saving a session. <li> Bug fix: PuTTY now draws underlines under the underlined text instead of sometimes putting them somewhere off to the right. <li> Bug fix: PuTTY now should not draw VT100 line drawing characters at the wrong vertical offset. </ul> <p>These features we Node-path: putty-website/docs.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3fca57821fd047e8327a13ed065b17f5 Text-delta-base-sha1: 7e41a26cb1e26c7ef7573ae09c1959145fccf6a2 Text-content-length: 37 Text-content-md5: 9c0a468bc70a2998cfdbf4746e6b7af3 Text-content-sha1: c46cb207e3a247ce89f066d6c215561fbd69b005 Content-length: 37 SVN��w �-��-�/H or 7 or 7 Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9a22d09920ecd8f343c18db5f17420d0 Text-delta-base-sha1: d7a4e9fa7cfadc9eb7bf11219c1b4737328423e1 Text-content-length: 376 Text-content-md5: a638de38b5af7f2272747911f35fe23e Text-content-sha1: 52f828a3616922e1fa81e422e65ef72b143cc965 Content-length: 376 SVN��_iL�)��1*�ov�Xy�Q��f>�/"�OQ�d4�O}�ayr�*��7(22-installer.exe">putty-0.622-installerutty-0.62-installer.exex86/putty-0.62!-- (currently commented out, following 0.62 release--> 2.tar.gz">putty-0.622.tar.gzputty-0.622.tar.gz.DSA">(DSA sig)</a></td> </tr> <!-- commented out following 0.62 release - no current prereleases any more-- Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f9324a0175c8af28ef9287f9c97b0e6c Text-delta-base-sha1: 83b433b9f35a6a70ba9d38dbf5e0f5e8d473f913 Text-content-length: 266 Text-content-md5: ed13f4c0f4171a5c9283f04da758eb45 Text-content-sha1: 96ae2d8b195062c0e3300494c466fc1d96419f8a Content-length: 266 SVN��z5g�K��qLf�y.�a22-10 PuTTY 0.62 released</b> <p> PuTTY 0.62 is out, containing only bug fixes from 0.61, in particular a <a href="wishlist/password-not-wiped.html">security fix</a> preventing passwords from being accidentally retained in memory. Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db1b94e0d8f61432f47d793478d5ef91 Text-delta-base-sha1: 867dee1c2ba0aca7752a6bcc98dd94d075fef5a9 Text-content-length: 111 Text-content-md5: f620809fe5c13c20484f97ed07527b1f Text-content-sha1: c3953a015632f59a53a9cde99f42fce6cd292ad2 Content-length: 111 SVN��F W�e�W� (note that 0.61 and later releases contain native Kerberos support for Windows and Unix Revision-number: 9371 Prop-content-length: 353 Content-length: 353 K 7 svn:log V 252 Checklist update following the 0.62 release. I managed to send out the announcement email without a subject line, so I'm reorganising the announcement entry in the checklist in the hope that it'll make it harder for me to get that one wrong in future! K 10 svn:author V 5 simon K 8 svn:date V 27 2011-12-10T14:03:02.347136Z PROPS-END Node-path: putty/CHECKLST.txt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 82673e356ac755d6d480cc8cdacf931f Text-delta-base-sha1: 9ee9dcdd40d11d27d3622c2fa1af161c9e450c88 Text-content-length: 342 Text-content-md5: 9a402c0cedd2347c48468b7567947450 Text-content-sha1: 6bb3ab68998615a1b2233ed8fb5efbd8804a03c8 Content-length: 342 SVN��~w >�/�>� tConstruct a release announcement email whose message body is the announcement written above, and which includes the following headers: * Reply-To: <putty@projects.tartarus.org> * Subject: PuTTY X.YZ is released + Mail that release announcement to <putty-announce@lists.tartarus.org> Revision-number: 9372 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9373 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9374 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9375 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9376 Prop-content-length: 300 Content-length: 300 K 8 svn:date V 27 2012-01-03T19:43:19.893884Z K 7 svn:log V 199 Patch from Colin Watson to use g_ascii_strcasecmp in place of the deprecated g_strcasecmp (since all the strings being compared are parts of XLFDs and won't be in interesting character sets anyway). K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9dead025eede34845021e3ab40364452 Text-delta-base-sha1: 347db9eb381234bc78613ec1e66daeac86eddce7 Text-content-length: 1120 Text-content-md5: 993c8b80343dfc7c7baebdfde14bcd8c Text-content-sha1: b8f23a1174c39019fef1293c233c2284b1568a55 Content-length: 1120 SVN��>(H �m�w�k�P�9�Zwn�[3S�IUL�[:�+�Tx�sK#if !GLIB_CHECK_VERSION(1,3,7) #define g_ascii_strcasecmp g_strcasecmp #define g_ascii_strncasecmp g_strncasecmp #endifasciiascii_strcasecmp(components[3], "o")) p += sprintf(p, " oblique"); else if (!g_ascii_strcasecmp(components[3], "ri")) p += sprintf(p, " reverse italic"); else if (!g_asciiascii_strcasecmp(components[3], "ot")) p += sprintf(p, " other-slant"); if (components[4][0] && g_asciiascii_strcasecmp(components[10], "m")) p += sprintf(p, " [M]"); if (!g_asciiascii_strcasecmp(components[2], "medium") || !g_ascii_strcasecmp(components[2], "regular") || !g_ascii_strcasecmp(components[2], "normal") || !g_ascii_strcasecmp(components[2], "book")) weightkey = 0; else if (!g_ascii_strncasecmp(components[2], "demi", 4) || !g_ascii_strncasecmp(components[2], "semi", 4)) weightkey = 1; else weightkey = 2; if (!g_ascii_strcasecmp(components[3], "r")) slantkey = 0; else if (!g_asciiasciiascii_strcasecmp(pango_font_family_get_name(families[i]), ascii Revision-number: 9377 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9378 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9379 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9380 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9381 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9382 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9383 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9384 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9385 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9386 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9387 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9388 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9389 Prop-content-length: 419 Content-length: 419 K 8 svn:date V 27 2012-01-26T18:22:28.318396Z K 7 svn:log V 318 If we're called on to uncleanly close an SSH channel for which we've already sent SSH2_MSG_CHANNEL_CLOSE, we should not skip the _whole_ of sshfwd_unclean_close(), only the part about sending SSH2_MSG_CHANNEL_CLOSE. It's still important to retag the SSH channel as CHAN_ZOMBIE and clean up its previous data provider. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0dda595b0a2e6583dec971645abf13fc Text-delta-base-sha1: c92feaf081bb749e98d11c7ff270a05f8f8c0aec Text-content-length: 227 Text-content-md5: 39c847d245ef167fa0619ce16b917075 Text-content-sha1: 2dbfa3f6ac395ba652bbbd3921e310beb92d870b Content-length: 227 SVN�����������u�|�Y�|Z�fb�-G!(c->closes & CLOSES_SENT_CLOSE)) { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE | CLOSES_SENT_CLOSE; } ��� �t�uct ssh_chan�am �a�) return ss Revision-number: 9390 Prop-content-length: 117 Content-length: 117 K 8 svn:date V 27 2012-01-26T18:53:53.648196Z K 7 svn:log V 17 It's a new year. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 96ddbcf394291b5d406c722f81bf71ce Text-delta-base-sha1: 4dc18d7bb0f82bab8b96b5f74058902c03432c7b Text-content-length: 44 Text-content-md5: ea8a24aa9faa58869857e5a0fc87d01d Text-content-sha1: 719c8f9f14c446e781eadd298dab940002d39e14 Content-length: 44 SVN�� �qPuTTY is copyright 1997-2012 Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 98541f3d8ad636c032a11dba10ffce1c Text-delta-base-sha1: 8a693efd2076dfb945a37ee751273f4d67ec2783 Text-content-length: 22 Text-content-md5: e95f167fd3f2cd6586ab451b988c5307 Text-content-sha1: 818011d68570f588b4135d50995db9b4fbbee014 Content-length: 22 SVN��bb �R��S2 Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7268282325c66d80bc43ef4e6a882e9d Text-delta-base-sha1: ecc923b05f8b4ffecb13ad85dfb1e6ec226b82ca Text-content-length: 20 Text-content-md5: 25bc022bb63d78546f2ebd1f18365ad1 Text-content-sha1: 5f66075e0e058aa7059cbd86c43f0b2d82e99e27 Content-length: 20 SVN��``�j��uk2 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3241ed86973523dd6873cbb0d3cd505d Text-delta-base-sha1: 37d7c32c388a0b8258eddb3531280ef00bb3e67d Text-content-length: 45 Text-content-md5: 4ebceaeb0c1219e99748b3b9866be984 Text-content-sha1: f6dd3e8d6f59093840a24937eee987e24a841c22 Content-length: 45 SVN���������DD�A��PB�122 Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85d1a799fce0776ebadb69269a53fedf Text-delta-base-sha1: bf1bb26f645f4aed794b653f4547e047668abaa5 Text-content-length: 29 Text-content-md5: 64e28b0eb8bdd929f21b4300a4f88bb6 Text-content-sha1: 1718f89af6f4c1999c8dc93f0abbd260382beb36 Content-length: 29 SVN�� �-��L.�{22 Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7a75d9bce5eb90e95517a3aa9998eab Text-delta-base-sha1: d1a1734172d78eb347198e4176677efb28927bc7 Text-content-length: 29 Text-content-md5: 5511939bb9b8f3a72d5e60c422a25cb8 Text-content-sha1: 28fc81c42c2d04753c28a389694976d6e9e63deb Content-length: 29 SVN��CC�d��Le�222 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a3eacac9b46f03bc178ed5cf54f0ac50 Text-delta-base-sha1: e7c92159c5a42bd2e106e26530292be92f457312 Text-content-length: 22 Text-content-md5: 37c2f3fec9c50033e9f429f971accfb4 Text-content-sha1: 285ea12b05a8f343b196ffb93b4c5d852c1bcf5e Content-length: 22 SVN��bb �l��um2 Node-path: putty/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3db9f45cd45de7050a36aa1ae09dd325 Text-delta-base-sha1: f2b982eb2fb549e45d0385f6c141c07bc9734f54 Text-content-length: 29 Text-content-md5: dfaef47369d368646717ef51f2d730f2 Text-content-sha1: 3339bda4e513fb6393c5bcd07da7406e6ab41b8a Content-length: 29 SVN��tt�k��Cl�D022 Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 238289a4d907662fb459bad5f775db8c Text-delta-base-sha1: f6663ccbcc80e76710eafb7306d6b11bcfd0988c Text-content-length: 22 Text-content-md5: 1b98fe7d2e5a82c979c609568b50bafd Text-content-sha1: 229015707fb87d4852b638edc47b4b45803fe1d4 Content-length: 22 SVN��BB ���9 2 Revision-number: 9391 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2012-01-30T00:29:32.062846Z K 7 svn:log V 143 New FAQ: "When I put PuTTY in C:\WINDOWS\SYSTEM32 on my 64-bit Windows system, `Duplicate Session' doesn't work." (Explanation courtesy Owen.) K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/faq.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fe135f96a53f0b41a3eb54a06fedc6ec Text-delta-base-sha1: 2a1a19e503cb74b9d2c7be5fc6358967fe7f2591 Text-content-length: 882 Text-content-md5: 632ecd61cb1295cff01225f606f8fc4f Text-content-sha1: 40e21a1499d4cfd540f7e155da53e3f47a8cb489 Content-length: 882 SVN��sLU�e�U�aS{faq-system32}{Question} When I put PuTTY in \cw{C:\\WINDOWS\\\i{SYSTEM32}} on my \i{64-bit Windows} system, \i{\q{Duplicate Session}} doesn't work. The short answer is not to put the PuTTY executables in that location. On 64-bit systems, \cw{C:\\WINDOWS\\SYSTEM32} is intended to contain only 64-bit binaries; Windows' 32-bit binaries live in \cw{C:\\WINDOWS\\SYSWOW64}. When a 32-bit program such as PuTTY runs on a 64-bit system, it cannot by default see the \q{real} \cw{C:\\WINDOWS\\SYSTEM32} at all, because the \W{http://msdn.microsoft.com/en-us/library/aa384187(v=vs.85).aspx}{File System Redirector} arranges that the running program sees the appropriate kind of binaries in \cw{SYSTEM32}. Thus, operations in the PuTTY suite that involve it accessing its own executables, such as \i{\q{New Session}} and \q{Duplicate Session}, will not work Node-path: putty/doc/index.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 66fa3f4fb9fdc057dc432bbe99b21616 Text-delta-base-sha1: 5a686b5c8048377ae4b2184ae6a9c186eb8e65c0 Text-content-length: 143 Text-content-md5: cd5a7a58bbd4ee8752d2e2950519e190 Text-content-sha1: b35cd3d7b533067095d993588acc2b15a21b4bd7 Content-length: 143 SVN��*%{�*�{ \IM{SYSTEM32} \cw{SYSTEM32} directory, on Windows \IM{64-bit Windows} 64-bit Windows \IM{64-bit Windows} Windows, 64-bit Revision-number: 9392 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9393 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9394 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9395 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9396 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9397 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9398 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9399 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9400 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9401 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9402 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9403 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9404 Prop-content-length: 559 Content-length: 559 K 8 svn:date V 27 2012-02-05T10:08:20.050587Z K 7 svn:log V 458 WM_SIZE/SIZE_MAXIMIZED can show up even during an interactive resize, so we should ensure we treat it the same way as other WM_SIZEs that show up during that time: set the width and height in conf, and set the flag to have that width and height enacted on WM_EXITSIZEMOVE. Fixes a bug in which dragging a PuTTY window directly from the Win7 snapped-to-half-screen position to the snapped-to-maximised state would leave the terminal in the pre-snapped size. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b3cd45681005b6fd739484fa5d97905b Text-delta-base-sha1: 5a055a715c36711931c31ad525c4bfa3180ff444 Text-content-length: 1407 Text-content-md5: 127d8b0723e7d2a47efed653be1f799d Text-content-sha1: b9c90ee3de96e23743d553839d0c168c2f3a1c18 Content-length: 1407 SVN����D�X�D�dif (resizing) { /* * As below, if we're in the middle of an * interactive resize we don't call * back->size. In Windows 7, this case can * arise in maximisation as well via the Aero * snap UI. */ need_backend_resize = TRUE; conf_set_int(conf, CONF_height, h); conf_set_int(conf, CONF_width, w); } else { term_size(term, h, w, conf_get_int(conf, CONF_savelines)); }�BL �B� term->big_cursor)) { if (*text != UCSWIDE) { do_text(ctx, x, y, text, len, attr, lattr); return; } ctype = 2; attr |= TATTR_RIGHTCURS; } fnt_width = char_width = font_width * (1 + (lattr != LATTR_NORM)); if (attr & ATTR_WIDE) char_width *= 2; x *= fnt_width; y *= font_height; x += offset_width; y += offset_height; if ((attr & TATTR_PASCURS) && (ctype == 0 || term->big_cursor)) { POINT pts[5]; HPEN oldpen; pts[0].x = pts[1].x = pts[4].x = x; pts[2].x = pts[3].x = x + char_width - 1; pts[0].y = pts[3].y = pts[4].y = y; pts[1].y = pts[2].y = y + font_height - 1; oldpen = SelectObject(hdc, Revision-number: 9405 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9406 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9407 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9408 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9409 Prop-content-length: 564 Content-length: 564 K 7 svn:log V 463 Patch from Yoshida Masato to fill in the missing pieces of Windows UTF-16 support. High Unicode characters in the terminal are now converted back into surrogates during copy and draw operations, and the Windows drawing code takes account of that when splitting up the UTF-16 string for display. Meanwhile, accidental uses of wchar_t have been replaced with 32-bit integers in parts of the cross-platform code which were expecting not to have to deal with UTF-16. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-02-17T19:28:55.616057Z PROPS-END Node-path: putty/ldiscucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0cdc84b38cc3ab6cbcb3481c95c1aa3a Text-delta-base-sha1: 1af0a952b2c2a725fafdc194c58516e5608c368f Text-content-length: 199 Text-content-md5: f61bdbaa9b54a2cca1c23a01061290ae Text-content-sha1: 4d74e753855e7049a0496f3a27b0429ef4cbb654 Content-length: 199 SVN�� T /�{�/�*cIS_SURROGATE(ch)) { #ifdef PLATFORM_IS_UTF16 if (i+1 < len) { unsigned long ch2 = widebuf[i+1]; if (IS_SURROGATE_PAIR(ch, ch2)) { ch = FROM_SURROGATES(ch, ch2 Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3f488895df8966ebb328569c5c827360 Text-delta-base-sha1: faddee00b4bb96e70298ccd4405dc5f3b3cfb5ca Text-content-length: 35 Text-content-md5: 4d18af15fdd7650c66ea8cc2f6367fa2 Text-content-sha1: f9ea874f2eb8882ac25adf161a2d1e7b69f0b7a1 Content-length: 35 SVN��SX ���G unsigned in Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 75cf4a217fd926b6633ef7ab59309d75 Text-delta-base-sha1: c33f8502c327296963baf45fdbce632855d88791 Text-content-length: 1187 Text-content-md5: 50e0d742dc84de2bfc1df19cfae49175 Text-content-sha1: 6b36bc407ccfa766d27200d3b832e1bf982ee788 Content-length: 1187 SVN��-}���$�m9_unsigned int ucs); int mk_wcswidth(const unsigned int *pwcs, size_t n); int mk_wcwidth_cjk(unsigned int ucs); int mk_wcswidth_cjk(const unsigned inunsigned in/* SURROGATE PAIR */ #ifndef IS_HIGH_SURROGATE #define HIGH_SURROGATE_START 0xd800 #define HIGH_SURROGATE_END 0xdbff #define LOW_SURROGATE_START 0xdc00 #define LOW_SURROGATE_END 0xdfff #define IS_HIGH_SURROGATE(wch) (((wch) >= HIGH_SURROGATE_START) && \ ((wch) <= HIGH_SURROGATE_END)) #define IS_LOW_SURROGATE(wch) (((wch) >= LOW_SURROGATE_START) && \ ((wch) <= LOW_SURROGATE_END)) #define IS_SURROGATE_PAIR(hs, ls) (IS_HIGH_SURROGATE(hs) && \ IS_LOW_SURROGATE(ls)) #endif #define IS_SURROGATE(wch) (((wch) >= HIGH_SURROGATE_START) && \ ((wch) <= LOW_SURROGATE_END)) #define HIGH_SURROGATE_OF(codept) \ (HIGH_SURROGATE_START + (((codept) - 0x10000) >> 10)) #define LOW_SURROGATE_OF(codept) \ (LOW_SURROGATE_START + (((codept) - 0x10000) & 0x3FF)) #define FROM_SURROGATES(wch1, wch2) \ (0x10000 + (((wch1) & 0x3FF) << 10) + ((wch2) & 0x3FF)) #endif Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9908fb0d60db602ed26822c35fda624 Text-delta-base-sha1: 74ce6bd62b35291c5cae64e59536def75e4ae355 Text-content-length: 748 Text-content-md5: e67cba32afd494bb11d746b10e871b0a Text-content-sha1: 14ce55d0c0cac65ed6e5297fa6c196c075ba0c4f Content-length: 748 SVN���� /���C3unsigned int) c) : mk_wcwidth((unsigned in�8 x����.��i5�};m->esc_argunsigned in+2 > chlen) { chlen = ccount + 256; ch = sresize(ch, chlen, wchar_t); } #ifdef PLATFORM_IS_UTF16 if (tchar > 0x10000 && tchar < 0x110000) { ch[ccount++] = (wchar_t) HIGH_SURROGATE_OF(tchar); ch[ccount++] = (wchar_t) LOW_SURROGATE_OF(tchar); } else #endif /* PLATFORM_IS_UTF16 */+2 > chlen) { chlen = ccount + 256; ch = sresize(ch, chlen, wchar_t); } #ifdef PLATFORM_IS_UTF16 if (schar > 0x10000 && schar < 0x110000) { ch[ccount++] = (wchar_t) HIGH_SURROGATE_OF(schar); ch[ccount++] = (wchar_t) LOW_SURROGATE_OF(schar); } else #endif /* PLATFORM_IS_UTF16 */ Node-path: putty/wcwidth.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cd22188cbf200dd3cde37dddcb526b64 Text-delta-base-sha1: 483ce42a281c9c32f21c215b2900bd3bdf1c4ddd Text-content-length: 100 Text-content-md5: 4cfd5e59bf63aec614dbde9cc8156877 Text-content-sha1: dc9aab02c8b025334da8b45077bf4531425291a6 Content-length: 100 SVN��@Y"7�s��yy�Jx� H�/W�4 unsigned inunsigned inunsigned inunsigned inunsigned in Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 127d8b0723e7d2a47efed653be1f799d Text-delta-base-sha1: b9c90ee3de96e23743d553839d0c168c2f3a1c18 Text-content-length: 5759 Text-content-md5: 3c422bbe2ee84240d8154a7e5763aa3b Text-content-sha1: 94f587bdc6284847e9e15f72a3325dca3d849944 Content-length: 5759 SVN����Dj�/�"�r-8�.�00�]__�C?�$~n�e^a�n#define IS_HIGH_VARSEL(wch1, wch2) \ ((wch1) == 0xDB40 && ((wch2) >= 0xDD00 && (wch2) <= 0xDDEF)) #define IS_LOW_VARSEL(wch) \ (((wch) >= 0x180B && (wch) <= 0x180D) || /* MONGOLIAN FREE VARIATION SELECTOR */ \ ((wch) >= 0xFE00 && (wch) <= 0xFE0F)) /* VARIATION SELECTOR 1-16 *//* don't divide SURROGATE PAIR */ if (ldisc) { for (i = 0; i < n; i += 2) { WCHAR hs = *(unsigned short *)(buff+i); if (IS_HIGH_SURROGATE(hs) && i+2 < n) { WCHAR ls = *(unsigned short *)(buff+i+2); if (IS_LOW_SURROGATE(ls)) { luni_send(ldisc, (unsigned short *)(buff+i), 2, 1); i += 2; continue; } } luni_send(ldisc, (unsigned short *)(buff+i), 1, 1); } int len2; /* for SURROGATE PAIR */ && (len < 2 || !IS_SURROGATE_PAIR(text[0], text[1]) /* adjust line_box.right for SURROGATE PAIR & VARIATION SELECTOR */ { int i; int rc_width = 0; for (i = 0; i < len ; i++) { if (i+1 < len && IS_HIGH_VARSEL(text[i], text[i+1])) { i++; } else if (i+1 < len && IS_SURROGATE_PAIR(text[i], text[i+1])) { rc_width += char_width; i++; } else if (IS_LOW_VARSEL(text[i])) { /* do nothing */ } else { rc_width += char_width; } } line_box.right = line_box.left + rc_width; }2) { len = (maxlen < remaining ? maxlen : remaining); /* don't divide SURROGATE PAIR and VARIATION SELECTOR */ len2 = len; if (maxlen == 1) { if (remaining >= 1 && IS_SURROGATE_PAIR(text[0], text[1])) len++; if (remaining-len >= 1 && IS_LOW_VARSEL(text[len])) len++; else if (remaining-len >= 2 && IS_HIGH_VARSEL(text[len], text[len+1])) len += 2; }/* only last char has dx width in SURROGATE PAIR and * VARIATION sequence */ for (i = 0; i < len; i++) { lpDx[i] = char_width; if (i+1 < len && IS_HIGH_VARSEL(text[i], text[i+1])) { if (i > 0) lpDx[i-1] = 0; lpDx[i] = 0; i++; lpDx[i] = char_width; } else if (i+1 < len && IS_SURROGATE_PAIR(text[i],text[i+1])) { lpDx[i] = 0; i++; lpDx[i] = char_width; } else if (IS_LOW_VARSEL(text[i])) { if (i > 0) lpDx[i-1] = 0; lpDx[i] = char_width; } }�L{//�L� 0; int i; if (wlen < len) { sfree(wbuf); wlen = len; wbuf = snewn(wlen, WCHAR); } for (i = 0; i < len; i++) wbuf[i] = text[i]; /* print Glyphs as they are, without Windows' Shaping*/ general_textout(hdc, x + xoffset, y - font_height * (lattr==LATTR_BOT) + text_adjust, &line_box, wbuf, len, lpDx, opaque && !(attr & TATTR_COMBINING)); /* And the shadow bold hack. */ if (bold_mode == BOLD_SHADOW && (attr & ATTR_BOLD)) { SetBkMode(hdc, TRANSPARENT); ExtTextOutW(hdc, x + xoffset - 1, y - font_height * (lattr == LATTR_BOT) + text_adjust, ETO_CLIPPED, &line_box, wbuf, len, lpDx_maybe); } } /* * If we're looping round again, stop erasing the background * rectangle. */ SetBkMode(hdc, TRANSPARENT); opaque = FALSE; } if (lattr != LATTR_TOP && (force_manual_underline || (und_mode == UND_LINE && (attr & ATTR_UNDER)))) { HPEN oldpen; int dec = descent; if (lattr == LATTR_BOT) dec = dec * 2 - font_height; oldpen = SelectObject(hdc, CreatePen(PS_SOLID, 0, fg)); MoveToEx(hdc, line_box.left, line_box.top + dec, NULL); LineTo(hdc, line_box.right, line_box.top + dec); oldpen = SelectObject(hdc, oldpen); DeleteObject(oldpen); } } /* * Wrapper that handles combining characters. */ void do_text(Context ctx, int x, int y, wchar_t *text, int len, unsigned long attr, int lattr) { if (attr & TATTR_COMBINING) { unsigned long a = 0; int len0 = 1; /* don't divide SURROGATE PAIR and VARIATION SELECTOR */ if (len >= 2 && IS_SURROGATE_PAIR(text[0], text[1])) len0 = 2; if (len-len0 >= 1 && IS_LOW_VARSEL(text[len0])) { attr &= ~TATTR_COMBINING; do_text_internal(ctx, x, y, text, len0+1, attr, lattr); text += len0+1; len -= len0+1; a = TATTR_COMBINING; } else if (len-len0 >= 2 && IS_HIGH_VARSEL(text[len0], text[len0+1])) { attr &= ~TATTR_COMBINING; do_text_internal(ctx, x, y, text, len0+2, attr, lattr); text += len0+2; len -= len0+2; a = TATTR_COMBINING; } else { attr &= ~TATTR_COMBINING; } while (len--) { if (len >= 1 && IS_SURROGATE_PAIR(text[0], text[1])) { do_text_internal(ctx, x, y, text, 2, attr | a, lattr); len--; text++; } else { do_text_internal(ctx, x, y, text, 1, attr | a, lattr); } text++; a = TATTR_COMBINING; } } else do_text_internal(ctx, x, y, text, len, attr, lattr); } void do_cursor(Context ctx, int x, int y, wchar_t *text, int len, unsigned long attr, int lattr) { int fnt_width; int char_width; HDC hdc = ctx; int ctype = cursor_type; lattr &= LATTR_MODE; if ((attr & TATTR_ACTCURS) && (ctype == 0 || Revision-number: 9410 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9411 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9412 Prop-content-length: 512 Content-length: 512 K 8 svn:date V 27 2012-02-19T10:27:18.240238Z K 7 svn:log V 411 Patch from Matsui Nag to implement xterm's "bracketed paste mode", in which text pasted into the terminal is preceded and followed by special function-key-like escape sequences ESC[200~ and ESC[201~ so that the application can identify it and treat it specially (e.g. disabling auto-indent-same-as-previous-line in text editors). Enabled and disabled by ESC[?2004h and ESC[?2004l, and of course off by default. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e67cba32afd494bb11d746b10e871b0a Text-delta-base-sha1: 14ce55d0c0cac65ed6e5297fa6c196c075ba0c4f Text-content-length: 697 Text-content-md5: beca8d9f9bbbb1e8e69ed24e73131c89 Text-content-sha1: 27e568e8924156ca1b1f1279642ec3f60b6601ef Content-length: 697 SVN��������[c� cterm->bracketed_paste = FALSE case 2004: /* xterm bracketed paste */ term->bracketed_paste = state ? TRUE : FALSE� n� �-�-�v->printing = TRUE; term->only_printing = !term->esc_query; term->print_state = 0; term_print_setup(term, printer); } else if (ter + 12, wchar_t); if (term->bracketed_paste) { memcpy(term->paste_buffer, L"\033[200~", 6 * sizeof(wchar_t)); term->paste_len += 6; }if (term->bracketed_paste) { memcpy(term->paste_buffer + term->paste_len, L"\033[201~", 6 * sizeof(wchar_t)); term->paste_len += 6 Node-path: putty/terminal.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 98503234d32c9b90de059ea2633d4117 Text-delta-base-sha1: d1e15e4086be43a49842a36306b42365f91a4647 Text-content-length: 37 Text-content-md5: 6da8a73f37dfa7378a03f6674a543ef3 Text-content-sha1: 4fb0792657ab22dffe75f278af65aa23ed7446dd Content-length: 37 SVN��� �p��fbracketed_paste; Revision-number: 9413 Prop-content-length: 152 Content-length: 152 K 10 svn:author V 5 simon K 8 svn:date V 27 2012-02-19T10:32:44.329438Z K 7 svn:log V 52 Update to 2007-05-26 version of upstream wcwidth.c. PROPS-END Node-path: putty/wcwidth.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cfd5e59bf63aec614dbde9cc8156877 Text-delta-base-sha1: dc9aab02c8b025334da8b45077bf4531425291a6 Text-content-length: 2428 Text-content-md5: eb55cce9a8a50d1436db7e1f500663e8 Text-content-sha1: 185df05b6eaeb22168f0cc0ec8f6693781880068 Content-length: 2428 SVN��Y9,D���;+�]hA�h|A�/ �-#��Y7-05-26 (Unicode 56F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 }, { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 }, { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0CE2, 0x0CE335F, 0x135F }, { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 }, { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF }, { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 }, { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F }, { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, 10 && ucs <= 0xfe19) || /* Vertical formswidth Revision-number: 9414 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2012-02-19T10:44:04.222315Z K 7 svn:log V 47 Update default key length in PuTTYgen to 2048. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3a309dbbe3e114a9502da60183b14113 Text-delta-base-sha1: 8adb7394a25a13e4e2d768b83ae0bb8a49b1f994 Text-content-length: 28 Text-content-md5: ff5b4358c3a7cae3bb6232adc5578d1e Text-content-sha1: 9a440509604d1c4e83bd78c423446451b3b928ca Content-length: 28 SVN��ss ���a2048 Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 062024929e7dc3373c18e1149ff647cf Text-delta-base-sha1: b2ac3834d848bb2e87c8b82c1a56f6e5ee66d6c2 Text-content-length: 28 Text-content-md5: 318b8afb6f4ec8bf99eebe21ab9dcf70 Text-content-sha1: 941bb1410245bac29d955ad2eb25f8ef6377b13c Content-length: 28 SVN��PP �A�� E2048 Revision-number: 9415 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9416 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9417 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9418 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9419 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9420 Prop-content-length: 264 Content-length: 264 K 7 svn:log V 163 Long overdue rewrapping of the primes[] array for legibility. I think the previous ghastly formatting arose when I ran the whole source base through GNU indent... K 10 svn:author V 5 simon K 8 svn:date V 27 2012-03-04T00:24:47.605872Z PROPS-END Node-path: putty/sshprime.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 19ee5eecf9e35503f385352f4801a2ed Text-delta-base-sha1: 1f197056e6b7c800410525e142650584be3b67ca Text-content-length: 44106 Text-content-md5: 6b29dea2eaa023b02239c7913ba912ed Text-content-sha1: d0e7785fc8342e9970496ce1f8978114af8ae51d Content-length: 44106 SVN��!Mm�}�7�Rx$�R:�R.�R<�Q>S�QzS�Q6S�Qr�Q~S�Q:S�QvS�Q2�Q>S�QzS�Q6S�Qr�Q~S�Q:S�QvS�Q2�Q>S�QzS�Q6S�Qr�Q~S�Q:S�QvS�Q2�Q>S�QzS�Q6S�Qr�Q~S�Q:S�QvS�Q2�Q>S�QzS�Q6S�Qr�Q~�.s 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10337, 10343, 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, 11257, 11261, 11273, 11279, 11287, 11411, 11423, 11437, 11443, 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, 12301, 12323, 12329, 12437, 12451, 12457, 12473, 12479, 12487, 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, 13313, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, 15683, 15727, 15731, 15809, 15817, 15823, 15859, 15877, 15881, 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, 16823, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, 18911, 18913, 18917, 18919, 18947, 18959, 18973, 19087, 19121, 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22639, 22643, 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, 23563, 23567, 23581, 23593, 23599, 23689, 23719, 23741, 23743, 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, 24671, 24677, 24683, 24821, 24841, 24847, 24851, 24859, 24877, 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, 27239, 27241, 27253, 27259, 27271, 27427, 27431, 27437, 27449, 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, 28409, 28411, 28429, 28547, 28549, 28559, 28571, 28573, 28579, 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, 29453, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, 33223, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35591, 35593, 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, 36599, 36607, 36629, 36637, 36643, 36761, 36767, 36779, 36781, 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39409, 39419, 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, 40459, 40471, 40483, 40487, 40493, 40609, 40627, 40637, 40639, 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, 41609, 41611, 41617, 41737, 41759, 41761, 41771, 41777, 41801, 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, 42683, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, 45413, 45427, 45433, 45587, 45589, 45599, 45613, 45631, 45641, 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, 46649, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49121, 49123, 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, 52817, 52837, 52859, 52861, 52879, 52883, 52889, 53003, 53017, 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, 54001, 54011, 54013, 54037, 54049, 54193, 54217, 54251, 54269, 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, 55219, 55229, 55243, 55381, 55399, 55411, 55439, 55441, 55457, 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, 57847, 57853, 57859, 57881, 57899, 58043, 58049, 58057, 58061, 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, 59063, 59069, 59077, 59197, 59207, 59209, 59219, 59221, 59233, 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, 60257, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, 64327, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, Revision-number: 9421 Prop-content-length: 283 Content-length: 283 K 7 svn:log V 182 Generate keys more carefully, so that when the user asks for an n-bit key they always get an n-bit number instead of n-1. The latter was perfectly harmless but kept confusing users. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-03-04T00:24:49.440016Z PROPS-END Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c491742e4d0b5b6247dd245bb3f438a Text-delta-base-sha1: 94eb396dc190b7e3d03af2b5646dccb7178ae47b Text-content-length: 99 Text-content-md5: ae0c79f3002686299c54927d70e2a61c Text-content-sha1: 8d4a106a195537b7d8aacf366656a5cb7e19080a Content-length: 99 SVN��)r I���I�)�, unsigned firstbits); void invent_firstbits(unsigned *one, unsigned *two Node-path: putty/sshdssg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7aa4a54ee538be24967d712ec73cd246 Text-delta-base-sha1: 846f7c2f16641888d67ba9ae28fe155b9990e048 Text-content-length: 223 Text-content-md5: f7260c5dbc579fe08c77d6551520acab Text-content-sha1: 96ae3909dbd6f978303a2109f521f9aa214eac41 Content-length: 223 SVN��m;�<��]6�)�p(unsigned pfirst, qfirstinvent_firstbits(&pfirst, &qfirst); /* * Generate q: a prime of length 160. */ key->q = primegen(160, 2, 2, NULL, 1, pfn, pfnparam, qfirst, pfirst Node-path: putty/sshprime.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6b29dea2eaa023b02239c7913ba912ed Text-delta-base-sha1: d0e7785fc8342e9970496ce1f8978114af8ae51d Text-content-length: 2037 Text-content-md5: 34ceab028d25730406fb042abe65aaf0 Text-content-sha1: 77351e853448ecdd0f4f747bcc7992f570d10036 Content-length: 2037 SVN��)>��7�rN�r#f�(�5`= * - for the basically cosmetic purposes of generating keys of the * length actually specified rather than off by one bit, we permit * the caller to provide an unsigned integer 'firstbits' which will * match the top few bits of the returned prime. (That is, there * will exist some n such that (returnvalue >> n) == firstbits.) If * 'firstbits' is not needed, specifying it to either 0 or 1 is * an adequate no-op, unsigned firstbits) { int i, k, v, byte, bitsleft, check, checks, fbsize fbsize = 0; while (firstbits >> fbsize) /* work out how to align this */ fbsize++ { v = (i != 0 || !factor) ? 1 : 0; } else if (i >= bits - fbsize) { v = (firstbits >> (i - (bits - fbsize))) & 1; } /* * Invent a pair of values suitable for use as 'firstbits' in the * above function, such that their product is at least 2. * * This is used for generating both RSA and DSA keys which have * exactly the specified number of bits rather than one fewer - if you * generate an a-bit and a b-bit number completely at random and * multiply them together, you could end up with either an (ab-1)-bit * number or an (ab)-bit number. The former happens log(2)*2-1 of the * time (about 39%) and, though actually harmless, every time it * occurs it has a non-zero probability of sparking a user email along * the lines of 'Hey, I asked PuTTYgen for a 2048-bit key and I only * got 2047 bits! Bug!' */ void invent_firstbits(unsigned *one, unsigned *two) { /* * Our criterion is that any number in the range [one,one+1) * multiplied by any number in the range [two,two+1) should have * the highest bit set. It should be clear that we can trivially * test this by multiplying the smallest values in each interval, * i.e. the ones we actually invented. */ do { *one = 0x100 | random_byte(); *two = 0x100 | random_byte(); } while (*one * *two < 0x20000); } Node-path: putty/sshrsag.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e8bf46506f5748777287b4c969f21528 Text-delta-base-sha1: a7c9e29daf2040d8ad3f9bcffba7450b1768c5fc Text-content-length: 192 Text-content-md5: ba62bb6e9721f194b354584d6412ff1e Text-content-sha1: 9dbcecf4ab30e55bd8b56fa9e57ad3e9606323bd Content-length: 192 SVN��*�Y��W{�Y7� unsigned pfirst, qfirstinvent_firstbits(&pfirst, &qfirst); key->p = primegen(bits / 2, RSA_EXPONENT, 1, NULL, 1, pfn, pfnparam, pfirst, qfirst Revision-number: 9422 Prop-content-length: 182 Content-length: 182 K 8 svn:date V 27 2012-03-04T01:01:11.550321Z K 7 svn:log V 82 Remove comment about 1024/1023 RSA key lengths that's no longer true as of r9421. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/pubkey.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e928537c287a7cb93cdf5ee99016e2f8 Text-delta-base-sha1: bce61f1b77bb73a5c26c7b1adc20b4077a4bfb75 Text-content-length: 22 Text-content-md5: 021322facc72470db8f86d1809a7b2e4 Text-content-sha1: 5e2f6461dc9d5f6cc293b03699302b12253b8165 Content-length: 22 SVN��`U ��g��nr Revision-number: 9423 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9424 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9425 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2012-03-05T18:32:27.123487Z K 7 svn:log V 58 Initialise some variables to NULL, to placate optimisers. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff5b4358c3a7cae3bb6232adc5578d1e Text-delta-base-sha1: 9a440509604d1c4e83bd78c423446451b3b928ca Text-content-length: 52 Text-content-md5: 063d7502ff893a867c4378f689bbd1a8 Text-content-sha1: 37387e7b2be7744fba7d2f7e3c73accfc8e2d459 Content-length: 52 SVN��s �4��1B = NULL, *outfilename = NULL Revision-number: 9426 Prop-content-length: 309 Content-length: 309 K 8 svn:date V 27 2012-03-05T18:34:40.298602Z K 7 svn:log V 208 Fix a type mismatch in minibidi.c - r9409 changed the 'wc' fields in bidi_char from wchar_t to unsigned int, but omitted to similarly adjust the parameter to doMirror which is passed a pointer to that field. K 10 svn:author V 5 simon PROPS-END Node-path: putty/minibidi.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4d18af15fdd7650c66ea8cc2f6367fa2 Text-delta-base-sha1: f9ea874f2eb8882ac25adf161a2d1e7b69f0b7a1 Text-content-length: 59 Text-content-md5: 99fd1cbfb348df7589a225e56d4c9a0b Text-content-sha1: 51dfaa3dbedc2d11233f360f2dd17569e2bd2893 Content-length: 59 SVN��Xb���E�seunsigned int *unsigned int * Revision-number: 9427 Prop-content-length: 147 Content-length: 147 K 8 svn:date V 27 2012-03-05T18:40:36.071037Z K 7 svn:log V 47 Fix another type mismatch introduced by r9409. K 10 svn:author V 5 simon PROPS-END Node-path: putty/wcwidth.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eb55cce9a8a50d1436db7e1f500663e8 Text-delta-base-sha1: 185df05b6eaeb22168f0cc0ec8f6693781880068 Text-content-length: 51 Text-content-md5: 4d7fa0f11ceecedaa39ddab786f4b187 Text-content-sha1: 5b2c5dde75a2199bb6491df7c950ab06cda4ac16 Content-length: 51 SVN��9K ���&unsigned int first; unsigned Revision-number: 9428 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9429 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9430 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9431 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9432 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9433 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9434 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9435 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9436 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9437 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9438 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9439 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9440 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9441 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9442 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9443 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9444 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9445 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9446 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9447 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9448 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9449 Prop-content-length: 344 Content-length: 344 K 7 svn:log V 243 Fallout from the big revamp in r9214: colour handling was going a bit wonky because I'd used the subkey for the red component in four places where I should have used the green/blue subkeys instead. Thanks to Martin Kletzander for spotting it. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-04-08T09:42:58.782841Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 765b11d1b324ae925230758c130f9f7b Text-delta-base-sha1: a0746e7fd59a119712afd0233fb736cedb065c58 Text-content-length: 136 Text-content-md5: 774dbd563f10cffdcb220b22137dfac5 Text-content-sha1: aad66b635c5b6c7fd17d800be6ab6acc2d0b4d6d Content-length: 136 SVN��g���7�v 1); b = conf_get_int_int(conf, CONF_colours, i*3+21, g); conf_set_int_int(conf, CONF_colours, i*3+2 Revision-number: 9450 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9451 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9452 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9453 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9454 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9455 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9456 Prop-content-length: 611 Content-length: 611 K 8 svn:date V 27 2012-04-13T18:02:30.618640Z K 7 svn:log V 510 Add code in dlg_filesel_set and dlg_fontsel_set which makes them duplicate the strings they pass to gtk_entry_set_text. I was already doing that in dlg_editbox_set, but forgot to add the same code when I revamped FontSpec and Filename to contain dynamically allocated strings (r9314 and r9316 respectively). This fixes a bug where, on some versions of GTK (but apparently not up-to-date versions), loading a saved session causes gibberish to appear in file-selector edit boxes accompanied by a valgrind error. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4ebceaeb0c1219e99748b3b9866be984 Text-delta-base-sha1: f6dd3e8d6f59093840a24937eee987e24a841c22 Text-content-length: 524 Text-content-md5: e684afa45a036135b3597af73ca15eda Text-content-sha1: c13272922200fe831de709f841bf18dcca2407db Content-length: 524 SVN����&p�9�!�2�x<!�-�S7/* We must copy fn->path before passing it to gtk_entry_set_text. * See comment in dlg_editbox_set() for the reasons. */ char *duppath = dupstr(fn->pathduppath); sfree(dup/* We must copy fs->name before passing it to gtk_entry_set_text. * See comment in dlg_editbox_set() for the reasons. */ char *dupname = dupstr(fs->namedupname); sfree(dup�D:P�;"�kr�D�window_destroy), NULLdp); gtk_main(); dlg_cleanup(&dp); ctrl_free_ Revision-number: 9457 Prop-content-length: 1543 Content-length: 1543 K 8 svn:date V 27 2012-04-14T17:24:12.341870Z K 7 svn:log V 1441 New utility script to parse an SSH packet dump and write out an interpretation with some analysis done on it. The script will do its own tracking of the set of open channels and their states, and its output is in a one-line-per-packet format such that every distinct channel has a unique identifier in it which should make it easy to grep out all lines relating to that channel. The script also matches up {CHANNEL,REQUEST}_{SUCCESS_FAILURE} to the requests that caused them, by tracking a queue of requests in each direction per channel and for global requests. Command-line options permit generating a final dump of all channels ever known to the script and their various ids and final state, and also dumping out the data transferred over each channel in each direction. Output is not complete, in the sense that some parameters in some messages (e.g. pixel sizes in window-size specifications) are deliberately omitted due to being boring, and the entire contents of some messages (e.g. KEXINIT) are omitted because I haven't yet seen any purpose in decoding them. Filling them in might be a useful thing, although I'm inclined to think that the default should still be to show only the potentially interesting stuff (e.g. still not pixel sizes!) and enable the rest using a -v option. Hopefully this should do a lot of the legwork in debugging issues in which a channel mysteriously remains partially open and prevents PuTTY closing. K 10 svn:author V 5 simon PROPS-END Node-path: putty/contrib/logparse.pl Node-kind: file Node-action: add Prop-content-length: 36 Text-delta: true Text-content-length: 21955 Text-content-md5: 8c9a0cc1fd8cd6ca3fbaac366e4c7847 Text-content-sha1: fcb62144dadeeaebc9480b287aa034739f3262e3 Content-length: 21991 K 14 svn:executable V 1 * PROPS-END SVN���222#!/usr/bin/perl use strict; use warnings; use FileHandle; my $dumpchannels = 0; my $dumpdata = 0; while ($ARGV[0] =~ /^-/) { my $opt = shift @ARGV; if ($opt eq "--") { last; # stop processing options } elsif ($opt eq "-c") { $dumpchannels = 1; } elsif ($opt eq "-d") { $dumpdata = 1; } else { die "unrecognised option '$opt'\n"; } } my @channels = (); # ultimate channel ids are indices in this array my %chan_by_id = (); # indexed by 'c%d' or 's%d' for client and server ids my %globalreq = (); # indexed by 'i' or 'o' my %packets = ( #define SSH2_MSG_DISCONNECT 1 /* 0x1 */ 'SSH2_MSG_DISCONNECT' => sub { my ($direction, $seq, $data) = @_; my ($reason, $description, $lang) = &parse("uss", $data); printf "%s\n", &str($description); }, #define SSH2_MSG_IGNORE 2 /* 0x2 */ 'SSH2_MSG_IGNORE' => sub { my ($direction, $seq, $data) = @_; my ($str) = &parse("s", $data); printf "(%d bytes)\n", length $str; }, #define SSH2_MSG_UNIMPLEMENTED 3 /* 0x3 */ 'SSH2_MSG_UNIMPLEMENTED' => sub { my ($direction, $seq, $data) = @_; my ($rseq) = &parse("u", $data); printf "i%d\n", $rseq; }, #define SSH2_MSG_DEBUG 4 /* 0x4 */ 'SSH2_MSG_DEBUG' => sub { my ($direction, $seq, $data) = @_; my ($disp, $message, $lang) = &parse("bss", $data); printf "%s\n", &str($message); }, #define SSH2_MSG_SERVICE_REQUEST 5 /* 0x5 */ 'SSH2_MSG_SERVICE_REQUEST' => sub { my ($direction, $seq, $data) = @_; my ($service) = &parse("s", $data); printf "%s\n", &str($service); }, #define SSH2_MSG_SERVICE_ACCEPT 6 /* 0x6 */ 'SSH2_MSG_SERVICE_ACCEPT' => sub { my ($direction, $seq, $data) = @_; my ($service) = &parse("s", $data); printf "%s\n", &str($service); }, #define SSH2_MSG_KEXINIT 20 /* 0x14 */ 'SSH2_MSG_KEXINIT' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_NEWKEYS 21 /* 0x15 */ 'SSH2_MSG_NEWKEYS' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_KEXDH_INIT 30 /* 0x1e */ 'SSH2_MSG_KEXDH_INIT' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_KEXDH_REPLY 31 /* 0x1f */ 'SSH2_MSG_KEXDH_REPLY' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_KEX_DH_GEX_REQUEST 30 /* 0x1e */ 'SSH2_MSG_KEX_DH_GEX_REQUEST' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_KEX_DH_GEX_GROUP 31 /* 0x1f */ 'SSH2_MSG_KEX_DH_GEX_GROUP' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_KEX_DH_GEX_INIT 32 /* 0x20 */ 'SSH2_MSG_KEX_DH_GEX_INIT' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_KEX_DH_GEX_REPLY 33 /* 0x21 */ 'SSH2_MSG_KEX_DH_GEX_REPLY' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_KEXRSA_PUBKEY 30 /* 0x1e */ 'SSH2_MSG_KEXRSA_PUBKEY' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_KEXRSA_SECRET 31 /* 0x1f */ 'SSH2_MSG_KEXRSA_SECRET' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_KEXRSA_DONE 32 /* 0x20 */ 'SSH2_MSG_KEXRSA_DONE' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_REQUEST 50 /* 0x32 */ 'SSH2_MSG_USERAUTH_REQUEST' => sub { my ($direction, $seq, $data) = @_; my ($user, $service, $method) = &parse("sss", $data); my $out = sprintf "%s %s %s", &str($user), &str($service), &str($method); if ($method eq "publickey") { my ($real) = &parse("b", $data); $out .= " real=$real"; } elsif ($method eq "password") { my ($change) = &parse("b", $data); $out .= " change=$change"; } print "$out\n"; }, #define SSH2_MSG_USERAUTH_FAILURE 51 /* 0x33 */ 'SSH2_MSG_USERAUTH_FAILURE' => sub { my ($direction, $seq, $data) = @_; my ($options) = &parse("s", $data); printf "%s\n", &str($options); }, #define SSH2_MSG_USERAUTH_SUCCESS 52 /* 0x34 */ 'SSH2_MSG_USERAUTH_SUCCESS' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_BANNER 53 /* 0x35 */ 'SSH2_MSG_USERAUTH_BANNER' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_PK_OK 60 /* 0x3c */ 'SSH2_MSG_USERAUTH_PK_OK' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60 /* 0x3c */ 'SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_INFO_REQUEST 60 /* 0x3c */ 'SSH2_MSG_USERAUTH_INFO_REQUEST' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_INFO_RESPONSE 61 /* 0x3d */ 'SSH2_MSG_USERAUTH_INFO_RESPONSE' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_GLOBAL_REQUEST 80 /* 0x50 */ 'SSH2_MSG_GLOBAL_REQUEST' => sub { my ($direction, $seq, $data) = @_; my ($type, $wantreply) = &parse("sb", $data); printf "%s (%s)", $type, $wantreply eq "yes" ? "reply" : "noreply"; my $request = [$seq, $type]; push @{$globalreq{$direction}}, $request if $wantreply; if ($type eq "tcpip-forward" or $type eq "cancel-tcpip-forward") { my ($addr, $port) = &parse("su", $data); printf " %s:%s", $addr, $port; push @$request, $port; } print "\n"; }, #define SSH2_MSG_REQUEST_SUCCESS 81 /* 0x51 */ 'SSH2_MSG_REQUEST_SUCCESS' => sub { my ($direction, $seq, $data) = @_; my $otherdir = ($direction eq "i" ? "o" : "i"); my $request = shift @{$globalreq{$otherdir}}; if (defined $request) { printf "to %s", $request->[0]; if ($request->[1] eq "tcpip-forward" and $request->[2] == 0) { my ($port) = &parse("u", $data); printf " port=%s", $port; } } else { print "(spurious?)"; } print "\n"; }, #define SSH2_MSG_REQUEST_FAILURE 82 /* 0x52 */ 'SSH2_MSG_REQUEST_FAILURE' => sub { my ($direction, $seq, $data) = @_; my $otherdir = ($direction eq "i" ? "o" : "i"); my $request = shift @{$globalreq{$otherdir}}; if (defined $request) { printf "to %s", $request->[0]; } else { print "(spurious?)"; } print "\n"; }, #define SSH2_MSG_CHANNEL_OPEN 90 /* 0x5a */ 'SSH2_MSG_CHANNEL_OPEN' => sub { my ($direction, $seq, $data) = @_; my ($type, $sid, $winsize, $packet) = &parse("suuu", $data); # CHANNEL_OPEN tells the other side the _sender's_ id for the # channel, so this choice between "s" and "c" prefixes is # opposite to every other message in the protocol, which all # quote the _recipient's_ id of the channel. $sid = ($direction eq "i" ? "s" : "c") . $sid; my $chan = {'id'=>$sid, 'state'=>'halfopen'}; push @channels, $chan; my $index = $#channels; $chan_by_id{$sid} = $index; printf "ch%d (%s) %s", $index, $chan->{'id'}, $type; if ($type eq "x11") { my ($addr, $port) = &parse("su", $data); printf " from %s:%s", $addr, $port; } elsif ($type eq "forwarded-tcpip") { my ($saddr, $sport, $paddr, $pport) = &parse("susu", $data); printf " to %s:%s from %s:%s", $saddr, $sport, $paddr, $pport; } elsif ($type eq "direct-tcpip") { my ($daddr, $dport, $saddr, $sport) = &parse("susu", $data); printf " to %s:%s from %s:%s", $daddr, $dport, $saddr, $sport; } print "\n"; }, #define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91 /* 0x5b */ 'SSH2_MSG_CHANNEL_OPEN_CONFIRMATION' => sub { my ($direction, $seq, $data) = @_; my ($rid, $sid, $winsize, $packet) = &parse("uuuu", $data); $rid = ($direction eq "i" ? "c" : "s") . $rid; my $index = $chan_by_id{$rid}; $sid = ($direction eq "i" ? "s" : "c") . $sid; $chan_by_id{$sid} = $index; my $chan = $channels[$index]; $chan->{'id'} = ($direction eq "i" ? "$rid/$sid" : "$sid/$rid"); $chan->{'state'} = 'open'; printf "ch%d (%s)\n", $index, $chan->{'id'}; }, #define SSH2_MSG_CHANNEL_OPEN_FAILURE 92 /* 0x5c */ 'SSH2_MSG_CHANNEL_OPEN_FAILURE' => sub { my ($direction, $seq, $data) = @_; my ($rid, $reason, $desc, $lang) = &parse("uuss", $data); $rid = ($direction eq "i" ? "c" : "s") . $rid; my $index = $chan_by_id{$rid}; my $chan = $channels[$index]; $chan->{'state'} = 'rejected'; printf "ch%d (%s) %s\n", $index, $chan->{'id'}, &str($reason); }, #define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93 /* 0x5d */ 'SSH2_MSG_CHANNEL_WINDOW_ADJUST' => sub { my ($direction, $seq, $data) = @_; my ($rid, $bytes) = &parse("uu", $data); $rid = ($direction eq "i" ? "c" : "s") . $rid; my $index = $chan_by_id{$rid}; my $chan = $channels[$index]; printf "ch%d (%s) +%s\n", $index, $chan->{'id'}, $bytes; }, #define SSH2_MSG_CHANNEL_DATA 94 /* 0x5e */ 'SSH2_MSG_CHANNEL_DATA' => sub { my ($direction, $seq, $data) = @_; my ($rid, $bytes) = &parse("uu", $data); $rid = ($direction eq "i" ? "c" : "s") . $rid; my $index = $chan_by_id{$rid}; my $chan = $channels[$index]; printf "ch%d (%s), %s bytes\n", $index, $chan->{'id'}, $bytes; if ($dumpdata) { my $filekey = $direction . "file"; if (!defined $chan->{$filekey}) { my $filename = sprintf "ch%d.%s", $index, $direction; $chan->{$filekey} = FileHandle->new(">$filename"); if (!defined $chan->{$filekey}) { die "$filename: $!\n"; } } my @realdata = splice @$data, 0, $bytes; die "channel data not present in $seq\n" if @realdata < $bytes; my $rawdata = pack "C*", @realdata; my $fh = $chan->{$filekey}; print $fh $rawdata; } }, #define SSH2_MSG_CHANNEL_EXTENDED_DATA 95 /* 0x5f */ 'SSH2_MSG_CHANNEL_EXTENDED_DATA' => sub { my ($direction, $seq, $data) = @_; my ($rid, $bytes) = &parse("uu", $data); $rid = ($direction eq "i" ? "c" : "s") . $rid; my $index = $chan_by_id{$rid}; my $chan = $channels[$index]; printf "ch%d (%s), %s bytes\n", $index, $chan->{'id'}, $bytes; if ($dumpdata) { # We treat EXTENDED_DATA as equivalent to DATA, for the # moment. It's not clear what else would be a better thing # to do with it, and this at least is the Right Answer if # the data is going to a terminal and the aim is to debug # the terminal emulator. my $filekey = $direction . "file"; if (!defined $chan->{$filekey}) { my $filename = sprintf "ch%d.%s", $index, $direction; $chan->{$filekey} = FileHandle->new; if (!$chan->{$filekey}->open(">", $filename)) { die "$filename: $!\n"; } } my @realdata = splice @$data, 0, $bytes; die "channel data not present in $seq\n" if @realdata < $bytes; my $rawdata = pack "C*", @realdata; my $fh = $chan->{$filekey}; print $fh $rawdata; } }, #define SSH2_MSG_CHANNEL_EOF 96 /* 0x60 */ 'SSH2_MSG_CHANNEL_EOF' => sub { my ($direction, $seq, $data) = @_; my ($rid) = &parse("uu", $data); $rid = ($direction eq "i" ? "c" : "s") . $rid; my $index = $chan_by_id{$rid}; my $chan = $channels[$index]; printf "ch%d (%s)\n", $index, $chan->{'id'}; }, #define SSH2_MSG_CHANNEL_CLOSE 97 /* 0x61 */ 'SSH2_MSG_CHANNEL_CLOSE' => sub { my ($direction, $seq, $data) = @_; my ($rid) = &parse("uu", $data); $rid = ($direction eq "i" ? "c" : "s") . $rid; my $index = $chan_by_id{$rid}; my $chan = $channels[$index]; $chan->{'state'} = ($chan->{'state'} eq "open" ? "halfclosed" : $chan->{'state'} eq "halfclosed" ? "closed" : "confused"); if ($chan->{'state'} eq "closed") { $chan->{'ifile'}->close if defined $chan->{'ifile'}; $chan->{'ofile'}->close if defined $chan->{'ofile'}; } printf "ch%d (%s)\n", $index, $chan->{'id'}; }, #define SSH2_MSG_CHANNEL_REQUEST 98 /* 0x62 */ 'SSH2_MSG_CHANNEL_REQUEST' => sub { my ($direction, $seq, $data) = @_; my ($rid, $type, $wantreply) = &parse("usb", $data); $rid = ($direction eq "i" ? "c" : "s") . $rid; my $index = $chan_by_id{$rid}; my $chan = $channels[$index]; printf "ch%d (%s) %s (%s)", $index, $chan->{'id'}, $type, $wantreply eq "yes" ? "reply" : "noreply"; push @{$chan->{'requests_'.$direction}}, [$seq, $type] if $wantreply; if ($type eq "pty-req") { my ($term, $w, $h, $pw, $ph, $modes) = &parse("suuuus", $data); printf " %s %sx%s", &str($term), $w, $h; } elsif ($type eq "x11-req") { my ($single, $xprot, $xcookie, $xscreen) = &parse("bssu", $data); print " one-off" if $single eq "yes"; printf " %s :%s", $xprot, $xscreen; } elsif ($type eq "exec") { my ($command) = &parse("s", $data); printf " %s", &str($command); } elsif ($type eq "subsystem") { my ($subsys) = &parse("s", $data); printf " %s", &str($subsys); } elsif ($type eq "window-change") { my ($w, $h, $pw, $ph) = &parse("uuuu", $data); printf " %sx%s", $w, $h; } elsif ($type eq "xon-xoff") { my ($can) = &parse("b", $data); printf " %s", $can; } elsif ($type eq "signal") { my ($sig) = &parse("s", $data); printf " %s", &str($sig); } elsif ($type eq "exit-status") { my ($status) = &parse("u", $data); printf " %s", $status; } elsif ($type eq "exit-signal") { my ($sig, $core, $error, $lang) = &parse("sbss", $data); printf " %s", &str($sig); print " (core dumped)" if $core eq "yes"; } print "\n"; }, #define SSH2_MSG_CHANNEL_SUCCESS 99 /* 0x63 */ 'SSH2_MSG_CHANNEL_SUCCESS' => sub { my ($direction, $seq, $data) = @_; my ($rid) = &parse("uu", $data); $rid = ($direction eq "i" ? "c" : "s") . $rid; my $index = $chan_by_id{$rid}; my $chan = $channels[$index]; printf "ch%d (%s)", $index, $chan->{'id'}; my $otherdir = ($direction eq "i" ? "o" : "i"); my $request = shift @{$chan->{'requests_' . $otherdir}}; if (defined $request) { printf " to %s", $request->[0]; } else { print " (spurious?)"; } print "\n"; }, #define SSH2_MSG_CHANNEL_FAILURE 100 /* 0x64 */ 'SSH2_MSG_CHANNEL_FAILURE' => sub { my ($direction, $seq, $data) = @_; my ($rid) = &parse("uu", $data); $rid = ($direction eq "i" ? "c" : "s") . $rid; my $index = $chan_by_id{$rid}; my $chan = $channels[$index]; printf "ch%d (%s)", $index, $chan->{'id'}; my $otherdir = ($direction eq "i" ? "o" : "i"); my $request = shift @{$chan->{'requests_' . $otherdir}}; if (defined $request) { printf " to %s", $request; } else { print " (spurious?)"; } print "\n"; }, #define SSH2_MSG_USERAUTH_GSSAPI_RESPONSE 60 'SSH2_MSG_USERAUTH_GSSAPI_RESPONSE' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_GSSAPI_TOKEN 61 'SSH2_MSG_USERAUTH_GSSAPI_TOKEN' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE 63 'SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_GSSAPI_ERROR 64 'SSH2_MSG_USERAUTH_GSSAPI_ERROR' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_GSSAPI_ERRTOK 65 'SSH2_MSG_USERAUTH_GSSAPI_ERRTOK' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, #define SSH2_MSG_USERAUTH_GSSAPI_MIC 66 'SSH2_MSG_USERAUTH_GSSAPI_MIC' => sub { my ($direction, $seq, $data) = @_; print "\n"; }, ); my ($direction, $seq, $ourseq, $type, $data, $recording); my %ourseqs = ('i'=>0, 'o'=>0); $recording = 0; while (<>) { if ($recording) { if (/^ [0-9a-fA-F]{8} ((?:[0-9a-fA-F]{2} )*[0-9a-fA-F]{2})/) { push @$data, map { $_ eq "XX" ? -1 : hex $_ } split / /, $1; } else { $recording = 0; my $fullseq = "$direction$ourseq"; print "$fullseq: $type "; if (defined $packets{$type}) { $packets{$type}->($direction, $fullseq, $data); } else { printf "raw %s\n", join "", map { sprintf "%02x", $_ } @$data; } } } if (/^(Incoming|Outgoing) packet #0x([0-9a-fA-F]+), type \d+ \/ 0x[0-9a-fA-F]+ \((.*)\)/) { $direction = ($1 eq "Incoming" ? 'i' : 'o'); # $seq is the sequence number quoted in the log file. $ourseq # is our own count of the sequence number, which differs in # that it shouldn't wrap at 2^32, should anyone manage to run # this script over such a huge log file. $seq = hex $2; $ourseq = $ourseqs{$direction}++; $type = $3; $data = []; $recording = 1; } } if ($dumpchannels) { my %stateorder = ('closed'=>0, 'rejected'=>1, 'halfclosed'=>2, 'open'=>3, 'halfopen'=>4); for my $index (0..$#channels) { my $chan = $channels[$index]; my $so = $stateorder{$chan->{'state'}} or 1000; # unknown sorts highest $chan->{'index'} = sprintf "ch%d", $index; $chan->{'order'} = sprintf "%08d %08d", $so, $index; } my @sortedchannels = sort { $a->{'order'} cmp $b->{'order'} } @channels; for my $chan (@sortedchannels) { printf "%s (%s): %s\n", $chan->{'index'}, $chan->{'id'}, $chan->{'state'}; } } sub parseone { my ($type, $data) = @_; if ($type eq "u") { # uint32 my @bytes = splice @$data, 0, 4; return "<missing>" if @bytes < 4 or grep { $_<0 } @bytes; return unpack "N", pack "C*", @bytes; } elsif ($type eq "U") { # uint64 my @bytes = splice @$data, 0, 4; return "<missing>" if @bytes < 8 or grep { $_<0 } @bytes; my @words = unpack "NN", pack "C*", @bytes; return ($words[0] << 32) + $words[1]; } elsif ($type eq "b") { # boolean my $byte = shift @$data; return "<missing>" if !defined $byte or $byte < 0; return $byte ? "yes" : "no"; } elsif ($type eq "B") { # byte my $byte = shift @$data; return "<missing>" if !defined $byte or $byte < 0; return $byte; } elsif ($type eq "s" or $type eq "m") { # string, mpint my @bytes = splice @$data, 0, 4; return "<missing>" if @bytes < 4 or grep { $_<0 } @bytes; my $len = unpack "N", pack "C*", @bytes; @bytes = splice @$data, 0, $len; return "<missing>" if @bytes < $len or grep { $_<0 } @bytes; if ($type eq "mpint") { my $str = ""; if ($bytes[0] >= 128) { # Take two's complement. @bytes = map { 0xFF ^ $_ } @bytes; for my $i (reverse 0..$#bytes) { if ($bytes[$i] < 0xFF) { $bytes[$i]++; last; } else { $bytes[$i] = 0; } } $str = "-"; } $str .= "0x" . join "", map { sprintf "%02x", $_ } @bytes; return $str; } else { return pack "C*", @bytes; } } } sub parse { my ($template, $data) = @_; return map { &parseone($_, $data) } split //, $template; } sub str { # Quote as a string. If I get enthusiastic I might arrange for # strange characters inside the string to be quoted. my $str = shift @_; return "'$str'"; } Revision-number: 9458 Prop-content-length: 168 Content-length: 168 K 8 svn:date V 27 2012-04-16T18:21:31.836907Z K 7 svn:log V 68 Fix a Perl warning about useless use of a constant in void context. K 10 svn:author V 5 simon PROPS-END Node-path: putty/contrib/logparse.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c9a0cc1fd8cd6ca3fbaac366e4c7847 Text-delta-base-sha1: fcb62144dadeeaebc9480b287aa034739f3262e3 Text-content-length: 105 Text-content-md5: 4e9cf69b1b8f528f324e61e865c47a66 Text-content-sha1: f5a414c4b71f113c20250f05daad06a2f1922a45 Content-length: 105 SVN��2b O�1�O�bP; $so = 1000 unless defined $so; # any state I've missed above comes la Revision-number: 9459 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9460 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9461 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9462 Prop-content-length: 821 Content-length: 821 K 7 svn:log V 720 Conditionalise the calls to premsg and postmsg in uxcons.c's logevent(), which temporarily turn off the raw mode we've put stderr into, so that they don't get called if the log_eventlog() call between them is not _actually_ going to write to stderr. Fixes a bug in which, if you define a Unix PuTTY saved session which uses 'plink -nc' as a local proxy command and then run PuTTY backgrounded from the shell with that session loaded, the subprocess Plink would get SIGTTOU when it tried to muck about with stderr and the whole thing would grind to a halt. I'm prepared to consider that acceptable if Plink _really_ wants to write on standard error, but if it doesn't, it should just carry on working in the background! K 10 svn:author V 5 simon K 8 svn:date V 27 2012-04-18T06:36:46.038805Z PROPS-END Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 94b227fdaa222b7f7a507b3ba7bab117 Text-delta-base-sha1: 2d6b93b16a73732664bff147be91f9f1ba4e3645 Text-content-length: 222 Text-content-md5: a290ea3b67fc59758c9e428ce8f977ca Text-content-sha1: 79e4504704b08629078861b4716e91b29f50d3d4 Content-length: 222 SVN��[U F�^�F�1*if ((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)) premsg(&cf); if (console_logctx) log_eventlog(console_logctx, string); if ((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)) Revision-number: 9463 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9464 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9465 Prop-content-length: 309 Content-length: 309 K 8 svn:date V 27 2012-04-22T14:22:08.093629Z K 7 svn:log V 208 Bug fix from Robert de Bath: if wc_to_mb returns a length of zero, it will not even initialise sbstring[0], so we shouldn't even look at it let alone depend on it to tell us the desired character was absent. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 993c8b80343dfc7c7baebdfde14bcd8c Text-delta-base-sha1: b8f23a1174c39019fef1293c233c2284b1568a55 Text-content-length: 38 Text-content-md5: 6cb9c26b02c7bfbaa73ffefc99211b90 Text-content-sha1: 01316232759d24d549eb3ac61033f88a8a0404b7 Content-length: 38 SVN��(6 �=��k=sblen == 0 || Revision-number: 9466 Prop-content-length: 293 Content-length: 293 K 8 svn:date V 27 2012-04-22T14:22:08.964259Z K 7 svn:log V 192 Bug fix from Robert de Bath: if the utf8_override setting is changed in mid-session, it affects translation and hence display, so it should be listed among the settings that require a redraw. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ac79083ce030ff7c598a146ff8ae220 Text-delta-base-sha1: df45a66d825f6a9c64183a05a7b917c7aa3aa18b Text-content-length: 203 Text-content-md5: 56868a436939d94e7f17266a8d121f53 Text-content-sha1: c6b4ce7ada755cf8d85283358a041eb5c20a4745 Content-length: 203 SVN���� ?�E��| utf8_override) != conf_get_int(newconf, CONF_utf8_override�rdd��(GTK_CONTAINER(inst->window), GTK_WIDGET(inst->hbox)); set_geom_hints(inst); gtk_widget_sh Revision-number: 9467 Prop-content-length: 385 Content-length: 385 K 8 svn:date V 27 2012-04-22T14:22:10.886936Z K 7 svn:log V 284 Patch from Robert de Bath to ifdef out the Windows-specific hack for the offset horizontal line characters in the VT100 line-drawing set (o,p,r,s), so that no trace of it - and hence no pointless performance hit - is compiled into the cross-platform modules on non-Windows platforms. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: beca8d9f9bbbb1e8e69ed24e73131c89 Text-delta-base-sha1: 27e568e8924156ca1b1f1279642ec3f60b6601ef Text-content-length: 78 Text-content-md5: fc73eec0b2c9df214675ccfbdaa34207 Text-content-sha1: 359e267dd18422aae5359206cbcee7bf287834c3 Content-length: 78 SVN��������� ���j� x#ifdef USES_VTLINE_HACK#endif Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c422bbe2ee84240d8154a7e5763aa3b Text-delta-base-sha1: 94f587bdc6284847e9e15f72a3325dca3d849944 Text-content-length: 109 Text-content-md5: 675cba0921995e1716ee520c93cc0d91 Text-content-sha1: 8c3313d4b2074f535495cbaf3190fabc00d43fba Content-length: 109 SVN�����<��b;�E#ifdef USES_VTLINE_HACK#endif�{�{�; static int wlen = Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 11958315257c0444b85defecd0cad2bf Text-delta-base-sha1: 876f9dc93eead5bf54767c176b377bf2703dc6fd Text-content-length: 47 Text-content-md5: 775e69deffa0e41b06274b183e14e899 Text-content-sha1: 61666ae6c9790e1c449c90f971b3dba3ec8f5dbc Content-length: 47 SVN��p �I��(H#define USES_VTLINE_HACK Revision-number: 9468 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9469 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9470 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2012-04-23T17:59:53.911511Z K 7 svn:log V 184 Call sshfwd_unclean_close() in the event of a local socket error on a forwarded X connection. (I somehow forgot to do this in r9364, despite making the identical change in portfwd.c.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4c667c458079d0bb6397e6ac87f5bb10 Text-delta-base-sha1: 277541ede67e274cf4f83477fa423bf884dac60a Text-content-length: 349 Text-content-md5: 618a2428a043ab354f586df413777f5c Text-content-sha1: 43db9f1e3bc772b029f9845640e2426d21bb2bc9 Content-length: 349 SVN��^ C�!�C�zif (error_msg) { /* * Socket error. Slam the connection instantly shut. */ sshfwd_unclean_close(pr->c); } else { /* * Ordinary EOF received on socket. Send an EOF on the SSH * channel. */ if (pr->c) sshfwd_write_eof(pr->c); } Revision-number: 9471 Prop-content-length: 232 Content-length: 232 K 8 svn:date V 27 2012-04-24T17:33:06.718045Z K 7 svn:log V 131 Fix an inverted comparison in rlogin.c which must surely have broken logins completely, with or without a supplied username. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1774b381e0176ea45d1ced66323bed24 Text-delta-base-sha1: a62d4da04fb56f3617a525451835a1ecc2a2ac76 Text-content-length: 22 Text-content-md5: 6a80ea81746bb37a6e185437ac769841 Text-content-sha1: e3e3c5ce9670ab4ccfb7291fc84b12372c6b0f53 Content-length: 22 SVN��** �%��&! Revision-number: 9472 Prop-content-length: 255 Content-length: 255 K 8 svn:date V 27 2012-04-30T17:28:28.386674Z K 7 svn:log V 154 Fix trivial Perl goof in logparse.pl which caused SSH2_MSG_CHANNEL_FAILURE to be reported as replying to ARRAY(0xrubbish) instead of to a message number. K 10 svn:author V 5 simon PROPS-END Node-path: putty/contrib/logparse.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4e9cf69b1b8f528f324e61e865c47a66 Text-delta-base-sha1: f5a414c4b71f113c20250f05daad06a2f1922a45 Text-content-length: 30 Text-content-md5: b132ea0c4e44db000b61325de9a891fc Text-content-sha1: f14552cac95a50c14ecee5889d8996e099f3736a Content-length: 30 SVN��bg �{��g{->[0] Revision-number: 9473 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9474 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9475 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9476 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9477 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9478 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9479 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9480 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9481 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9482 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9483 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9484 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9485 Prop-content-length: 183 Content-length: 183 K 8 svn:date V 27 2012-05-03T18:06:08.489639Z K 7 svn:log V 83 Fix implicit split to @_, which breaks mkfiles.pl on Ubuntu 12.04's perl (5.14.2). K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0fbff3e4bdc65e05f98852978a089f0a Text-delta-base-sha1: 0e3f4b91f6f0b295ef612c4ee9317e886c8b5a81 Text-content-length: 28 Text-content-md5: 883b98ce29ed736e563ba9197208cc12 Text-content-sha1: 8d7141b337e1e47ec68c25c55513f84462667179 Content-length: 28 SVN��z �y��x@_ = Revision-number: 9486 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9487 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9488 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9489 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9490 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9491 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9492 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9493 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9494 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9495 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9496 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9497 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9498 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9499 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9500 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9501 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9502 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9503 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9504 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9505 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9506 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9507 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9508 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9509 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9510 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9511 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2012-05-08T16:32:01.713264Z K 7 svn:log V 211 Summary: Windows "jump list" duplicates items between pinned and recent lists Class: semi-bug Difficulty: taxing This is becoming a FAQ. Put it on the website in the hope that someone tells us how to fix it :) K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/win7-jumplist-duplicates Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1461 Text-content-md5: 95d26110cc5f6f6d4291b970fcc4f9e4 Text-content-sha1: feaa455cf194449dec56011bf75aeb92d439be81 Content-length: 1471 PROPS-END SVN���'''Summary: Windows "jump list" duplicates items between pinned and recent lists Class: semi-bug Difficulty: taxing Present-in: 0.61 Content-type: text/x-html-body <p> Several people have reported that in PuTTY's implementation of the Windows <a href="win7-jumplists.html">jump list</a>, when a session is "pinned" to the taskbar, it does not disappear from the "Recent Sessions" section (so it appears in two places). <p> We've reproduced this, and it's not ideal. Unfortunately it doesn't seem to be under our control -- this part of the "jump list" feature is managed by Windows. <a href="http://msdn.microsoft.com/en-us/library/dd378396(v=VS.85).aspx">Microsoft's documentation</a> says: <blockquote> The user might decide to pin one or more of the destinations provided in the custom category to the Jump List. The list of pinned destinations is not available to the application, but duplication is prevented by the UI so no extra action is required of the application. Visually, a pinned item moves to the Pinned section of the Jump List and disappears from its original location. </blockquote> <p> But Windows seems to be failing to do this here. <p> This aberrant behaviour is not apparent with other applications using Jump Lists, such as Notepad and Internet Explorer. Not sure what the significant difference is. The other apps are using the standard Recent/Frequent categories, whereas PuTTY has a custom "Recent Session" category. Revision-number: 9512 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9513 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9514 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9515 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9516 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9517 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9518 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9519 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9520 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9521 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9522 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9523 Prop-content-length: 495 Content-length: 495 K 8 svn:date V 27 2012-05-12T17:00:54.910720Z K 7 svn:log V 394 When we are asked to unthrottle an SSH connection (by the front end calling back->unthrottle), we should immediately call ssh_process_queued_incoming_data to handle the SSH packets that have been saved for later functioning while we were throttled. Otherwise, they'll sit there unhandled until the next call to ssh_gotdata, which might not be for ages if the server thinks it's waiting for us. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 39c847d245ef167fa0619ce16b917075 Text-delta-base-sha1: 2dbfa3f6ac395ba652bbbd3921e310beb92d870b Text-content-length: 398 Text-content-md5: 99b851f435474f1f842620e79a1c3b51 Text-content-sha1: bea019f2082933e29fd242dc242727cba384b413 Content-length: 398 SVN������������������ �=� �#< /* * Now process any SSH connection data that was stashed in our * queue while we were frozen. */ ssh_process_queued_incoming_data(ssh);�m!!�m� { Ssh ssh = (Ssh) handle; return ssh->send_ok; } static int ssh_ldisc(void *handle, int option) { Ssh ssh = (Ssh) handle; if (option == LD_ECHO Revision-number: 9524 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9525 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9526 Prop-content-length: 249 Content-length: 249 K 8 svn:date V 27 2012-05-13T15:59:22.992189Z K 7 svn:log V 148 Bug fix from Robert de Bath: since lpDx_maybe is always supposed to equal either lpDx or NULL, we mustn't forget to update it when we realloc lpDx. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 675cba0921995e1716ee520c93cc0d91 Text-delta-base-sha1: 8c3313d4b2074f535495cbaf3190fabc00d43fba Text-content-length: 230 Text-content-md5: 7dc21817fb302d89d4b068e8275b0fb7 Text-content-sha1: a5380edcbcfb262973b549b45c655569b71ca38f Content-length: 230 SVN����9�m��Z& if (len > lpDx_len) { lpDx_len = len * 9 / 8 + 16; lpDx = sresize(lpDx, lpDx_len, int); if (lpDx_maybe) lpDx_maybe = lpDx; } ; static int wlen = 0; �p��p* Revision-number: 9527 Prop-content-length: 303 Content-length: 303 K 8 svn:date V 27 2012-05-13T15:59:24.390279Z K 7 svn:log V 202 Fix from Robert de Bath which reorders the Windows initialisation sequence: since init_fonts sets up ucsdata based on the available Windows fonts, we should call it before passing ucsdata to term_init. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7dc21817fb302d89d4b068e8275b0fb7 Text-delta-base-sha1: a5380edcbcfb262973b549b45c655569b71ca38f Text-content-length: 52 Text-content-md5: 66fb62bf08179c2b54516ca3095f28c7 Text-content-sha1: 44d93d0894755b6bec5e9f62b1a28fdf0da1b76e Content-length: 52 SVN������s��y� d�x�pp��p� Revision-number: 9528 Prop-content-length: 1032 Content-length: 1032 K 8 svn:date V 27 2012-05-13T15:59:26.184823Z K 7 svn:log V 931 Patch from Robert de Bath to substantially simplify timing.c. The previous platform-dependent ifdefs, switching between a system which tried to cope with spurious callbacks (which UI'd observed on Windows) and one which tried to cope with system clock jumps (which can happen on Unix, if you use gettimeofday) have been completely removed, and replaced with a much simpler approach which just copes with system clock jumps by triggering any timers immediately. None of the resulting effects should be catastrophic (the worst thing might be the waste of CPU in a spurious rekey, but as long as the system clock isn't jumping around _all_ the time that's hardly critical) and in any case the Unix port has had a long-standing oddity involving occasional lockups if pterm or PuTTY runs for too long, which hopefully this should replace with a much less bad failure mode. And the code is much simpler, which is not to be sneezed at. K 10 svn:author V 5 simon PROPS-END Node-path: putty/timing.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6f14fabc8dad64276224cb06b79b826d Text-delta-base-sha1: 1d010acfde2b438c9c14ac03d45a2f9d743c2b8c Text-content-length: 1224 Text-content-md5: 09c8de23861b24706369bc4c4ea265bd Text-content-sha1: 38ed2ba4a26fcdad07e959f581e99cd7969c0c3c Content-length: 1224 SVN��A*��z��b'�M&��q��(�& * * The problem is that computer clocks aren't perfectly accurate. * The GETTICKCOUNT function returns a 32bit number that normally * increases by about 1000 every second. On windows this uses the PC's * interrupt timer and so is only accurate to around 20ppm. On unix it's * a value that's calculated from the current UTC time and so is in theory * accurate in the long term but may jitter and jump in the short term. * * What PuTTY needs from these timers is simply a way of delaying the * calling of a function for a little while, if it's occasionally called a * little early or late that's not a problem. So to protect against clock * jumps schedule_timer records the time that it was called in the timer * structure. With this information the run_timers function can see when * the current GETTICKCOUNT value is after the time the event should be * fired OR before the time it was set. In the latter case the clock must * have jumped, the former is (probably) just the normal passage of time. * long when_setnow = GETTICKCOUNT(); when = ticks + now t->when_set = now now = GETTICKCOUNT() || now - (first->when_set - 10) < Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0f170f308bb73bb99354d2800f609596 Text-delta-base-sha1: 18aaef11e974ef183e2f165878dce6ed5c1cc303 Text-content-length: 20 Text-content-md5: db846e539ab3b0db6737f6c334018adc Text-content-sha1: 1a8ea6056bc8d4fa6e66e76f8510a90d4fcc5f9b Content-length: 20 SVN��s ��3��[ Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f7a830cf771ef13a23bc3c5aa6b6507 Text-delta-base-sha1: 98e745f06fd1a78257d8cccaff97159023ef2fe0 Text-content-length: 76 Text-content-md5: 0169800814894f2ae2ef276fffcc0f53 Text-content-sha1: 16cde25c374f324cbb956f753e9a4dc86742ac24 Content-length: 76 SVN��=(2�_��({�oNTICKSPERSEC + tv.tv_usec / (1000000 / TICKSPERSEC) Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f17d20f5575c4e6c69e931185ea013a0 Text-delta-base-sha1: fbacd2075741ab8f1704e71dd21e56638a488999 Text-content-length: 49 Text-content-md5: d716d465875c2bd72915e75ebbb31974 Text-content-sha1: bb5aaa58084eff925ce2ef794289c546ad2fb067 Content-length: 49 SVN��9i � ��Fs now = GETTICKCOUNT(); Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d36ae5d71c1930009cc24b93d374c08a Text-delta-base-sha1: 9b402e90bc594ee42ec5326bb5a58415881fae46 Text-content-length: 45 Text-content-md5: a7406ab3544b7d85a1b00f3cb221a63a Text-content-sha1: f8184bceef91a9ba94721e9deec37c95c6f2bf80 Content-length: 45 SVN��Y �J��'2 now = GETTICKCOUNT(); Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 775e69deffa0e41b06274b183e14e899 Text-delta-base-sha1: 61666ae6c9790e1c449c90f971b3dba3ec8f5dbc Text-content-length: 22 Text-content-md5: 969ff10db2e1e34f78b357e22b9b2088 Text-content-sha1: a72e40c8394cbad9fd2765824a70b35eb6564c4e Content-length: 22 SVN�� m ��3��:O Revision-number: 9529 Prop-content-length: 178 Content-length: 178 K 8 svn:date V 27 2012-05-13T15:59:27.884003Z K 7 svn:log V 78 Use clock_gettime(CLOCK_MONOTONIC) as the Unix getticks(), if it's available. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d6a0dd54b0240d482e63522c53c17a5b Text-delta-base-sha1: 9030751cc19747118b2aac17290de56263c5cac3 Text-content-length: 203 Text-content-md5: 1e5dbc0c03fb68a71a485762e0a78147 Text-content-sha1: 8c1a510bf2a65563fbc494753f0859f7534ca439 Content-length: 203 SVN��: 3��3�jAC_CHECK_DECLS([CLOCK_MONOTONIC], [], [], [[#include <time.h>]]) AC_SEARCH_LIBS([clock_gettime], [rt], [AC_DEFINE([HAVE_CLOCK_GETTIME],[],[Define if clock_gettime() is available]) Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0169800814894f2ae2ef276fffcc0f53 Text-delta-base-sha1: 16cde25c374f324cbb956f753e9a4dc86742ac24 Text-content-length: 814 Text-content-md5: e1e32fdaf7147ef97e4d01d0dd532376 Text-content-sha1: c74b25a5999abab8543bda4b2b1a2be8a59d77f6 Content-length: 814 SVN��(���z �n:time/* * We want to use milliseconds rather than the microseconds or * nanoseconds given by the underlying clock functions, because we * need a decent number of them to fit into a 32-bit word so it * can be used for keepalives. */ #if defined HAVE_CLOCK_GETTIME && defined HAVE_DECL_CLOCK_MONOTONIC { /* Use CLOCK_MONOTONIC if available, so as to be unconfused if * the system clock changes. */ struct timespec ts; if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) return ts.tv_sec * TICKSPERSEC + ts.tv_nsec / (1000000 / TICKSPERSEC); } #endif { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec * TICKSPERSEC + tv.tv_usec / (1000000 / TICKSPERSEC); } Revision-number: 9530 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9531 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9532 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9533 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9534 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9535 Prop-content-length: 243 Content-length: 243 K 8 svn:date V 27 2012-05-15T22:19:21.215057Z K 7 svn:log V 142 Fix bug in the new CLOCK_MONOTONIC implementation. I was treating the nanoseconds field as a microseconds field, with hilarious consequences. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e1e32fdaf7147ef97e4d01d0dd532376 Text-delta-base-sha1: c74b25a5999abab8543bda4b2b1a2be8a59d77f6 Text-content-length: 20 Text-content-md5: e284cef500978ab4a5b5268882b4a028 Text-content-sha1: 48c6471a5a4eb0455645a61f420bab93e3c2d77d Content-length: 20 SVN�� ��m��%j Revision-number: 9536 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9537 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9538 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9539 Prop-content-length: 263 Content-length: 263 K 7 svn:log V 162 Enhance my 'sresize' macro so that it type-checks the pointer you pass _in_ to it, as well as the one it returns. Why have I never thought of doing that before?! K 10 svn:author V 5 simon K 8 svn:date V 27 2012-05-18T19:51:11.285876Z PROPS-END Node-path: putty/puttymem.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c1d2f6aa95ceb8fa19f8643a0706fc2 Text-delta-base-sha1: 1d286f689c8381bff933197bb8eec49fd54d2206 Text-content-length: 78 Text-content-md5: 0c2e11b72ae657f924f24f3e2943c37c Text-content-sha1: acc8421846f67aa08a685edbdd7eabcceff49ab2 Content-length: 78 SVN��Im;��*\ ((type *)snrealloc((sizeof((type *)0 == (ptr)), (ptr) Revision-number: 9540 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9541 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9542 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9543 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9544 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9545 Prop-content-length: 417 Content-length: 417 K 8 svn:date V 27 2012-06-01T06:50:37.557018Z K 7 svn:log V 316 Fix a bug in cygtermd, spotted by Casey Zacek, in which we unconditionally set the telnet state to SEENCR regardless of whether we have actually seen a CR, and as a result sending a NUL through PuTTY (via Ctrl-Space or whatever) does not work. Must have arisen through some kind of really weird cut-and-paste error! K 10 svn:author V 5 simon PROPS-END Node-path: putty/contrib/cygtermd/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0234c4eeb145e835c7f2d0ea1a3ecac8 Text-delta-base-sha1: b89740375be49b3a4e69d67b62113e06ed5c8358 Text-content-length: 105 Text-content-md5: a681164b71b5ad73911bc7b0c47222c1 Text-content-sha1: 0c2c132ecfc576e42bf5fcd4463dcddce0967ef1 Content-length: 105 SVN��:u Q�@�Q�dVif (c == CR) telnet->state = SEENCR; else telnet->state = TOP_LEVEL Revision-number: 9546 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9547 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9548 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9549 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9550 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9551 Prop-content-length: 118 Content-length: 118 K 7 svn:log V 18 Missing #include. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-06-01T19:43:05.447558Z PROPS-END Node-path: putty/sshzlib.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 23fcd9d70ff79ec70590e3f83bb00885 Text-delta-base-sha1: ebb6e6f7194cce2bee51decaa8a6b808a3325858 Text-content-length: 30 Text-content-md5: d3728621f0bc7d71365a3fbc13467346 Text-content-sha1: 8b22c033f1404184dcb5c1a06acfc835ca7ec73e Content-length: 30 SVN��G[ ���Bstring Revision-number: 9552 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9553 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9554 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9555 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9556 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9557 Prop-content-length: 161 Content-length: 161 K 8 svn:date V 27 2012-06-04T23:32:36.674666Z K 7 svn:log V 61 Add missing check for failure to agree a host key algorithm. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99b851f435474f1f842620e79a1c3b51 Text-delta-base-sha1: bea019f2082933e29fd242dc242727cba384b413 Text-content-length: 506 Text-content-md5: 2b14f76bccd87d738bf6214e068a828c Text-content-sha1: 46c636e931b4c01154c71dbee8ae20becee91275 Content-length: 506 SVN����������� �y� �{wif (!ssh->hostkey) { bombout(("Couldn't agree a host key algorithm (available: %s)", str ? str : "(null)")); crStop(0); } ����r�All other channel requests are either * sent with want_reply false or are sent before this handler gets * installed. */ str��� } } static int ssh_connected(void *handle) { Ssh ssh = (Ssh) handle; return ssh->s != NULL; } static int ssh_sendok(void *handle) Revision-number: 9558 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9559 Prop-content-length: 283 Content-length: 283 K 8 svn:date V 27 2012-06-09T15:09:22.187053Z K 7 svn:log V 182 Introduce a third setting for the 'bold as colour' mode, which lets you both brighten the colour _and_ bold the font at the same time. (Fixes 'bold-font-colour' and Debian #193352.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 774dbd563f10cffdcb220b22137dfac5 Text-delta-base-sha1: aad66b635c5b6c7fd17d800be6ab6acc2d0b4d6d Text-content-length: 347 Text-content-md5: 111190e85b591f3d9a6ad8e8428bbdb4 Text-content-sha1: a388cfebfaadc587f0f0cacf5bb3b63de0f2fa05 Content-length: 347 SVN��>>��>�bradiobuttons(s, "Indicate bolded text by changing:", 'b', 3, HELPCTX(colours_bold), conf_radiobutton_handler, I(CONF_bold_style), "The font", I(1), "The colour", I(2), "Both", I(3), NULL Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 09d07fd86545b2bda5159e2700f66665 Text-delta-base-sha1: 0a3c4ae0e9194da31d7428e5a8e450dd19cca00a Text-content-length: 870 Text-content-md5: fae76b6ed0ecb07ca373e60c38907eb2 Text-content-sha1: a2e5830295a266ac50b81914427552b59dea5dde Content-length: 870 SVN�����!��$Bc�8Indicate bolded text by changingin several ways. It can either change the \i{font} for a bold version, or use the same font in a brighter colour, or it can do both (brighten the colour \e{and} embolden the font). This control lets you choose which. By default bold is indicated by colour, so non-bold text is displayed in light grey and bold text is displayed in bright white (and similarly in other colours). If you change the setting to \q{The font} box, bold and non-bold text will be displayed in the same colour, and instead the font will change to indicate the difference. If you select \q{Both}, the font and the colour will both chang�@++��at most 60 minutes. You might have a need to disable time-based rekeys completely for the same reasons that \i{keepalives} aren't always helpful. If you anticipate suffer Node-path: putty/doc/man-ptel.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4fe068485d28504310704bdbe9e42029 Text-delta-base-sha1: 0eb6b702c87e9a0b4c6367f5755bb7ee7ab09588 Text-content-length: 59 Text-content-md5: 0d364d8531f20d10182ef989d5f02d23 Text-content-sha1: 0a14b32fd75cdae62e7156f5f7a27ec019a77a5a Content-length: 59 SVN��K_���i�Zz�T�Xs or 2 or 2 or 2 or 2 Node-path: putty/doc/man-pter.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eef3e9a117715fa1edb2257a82b3d78f Text-delta-base-sha1: 3f6fbe6f338d5ef70d872ac1d4186249e40fa872 Text-content-length: 278 Text-content-md5: 635e1eb053afc5caaa3f602976d2893f Text-content-sha1: c2aed74b51422d2aadf529f58fb1938e41aae930 Content-length: 278 SVN��<-:N�=��f=�Z#�}�g�� �K�uU�8 or 2 or 2 or 2 or 2set to 0 or 2set to 0 or 2, 1, or 2; the default is 1. It specifies how bold text should be displayed; when set to 2, both effects happen at once (a heavy font \e{and} a brighter colour) Node-path: putty/doc/man-putt.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5b091e5c55607ec2aa16219379ac47c0 Text-delta-base-sha1: 1c47dda77091828e1f54661771ca32db24190497 Text-content-length: 58 Text-content-md5: 4d72a8f9f0509ae3c7d44a6cb895df39 Text-content-sha1: 448a6c0d4bbd83b6a6627250f703eaff7ba7d3e7 Content-length: 58 SVN��0D�3��f2�Z�r�or 2 or 2 or 2 or 2 Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 22d8239936e9dd5b8e38db474609a9c4 Text-delta-base-sha1: 5770423da4c3097a3a1b0d6fee2a3d40786696d4 Text-content-length: 96 Text-content-md5: 9e9d812aaec9c1771f67219d8594fd0c Text-content-sha1: 5304f9e7d4dc2dc5550378a5eac44f826db9b869 Content-length: 96 SVN��@H=�_��an�G^�<(cfg.bold_style & 2)(cfg.bold_style & 2)if cfg.bold_style & 1 Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 50e0d742dc84de2bfc1df19cfae49175 Text-delta-base-sha1: 6b36bc407ccfa766d27200d3b832e1bf982ee788 Text-content-length: 31 Text-content-md5: e5cc4888942122c04f99dcf9a118b441 Text-content-sha1: 0f021b62f9cb25dd92730301e9b2dd2a8acf0061 Content-length: 31 SVN�� �L��LRstyle Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ad81e64252f0c8257f197c17e90c39c2 Text-delta-base-sha1: 36717a5960788cc4a38c2441a09d463b32dd0e85 Text-content-length: 122 Text-content-md5: 3cde03ee0c7b5eff67d4d938b7ca583e Text-content-sha1: 3ff2d7c7b665dc0d2284b12eb6743111b246492f Content-length: 122 SVN��>YY�V��?]Q�kSstyle)-1i = gppi_raw(sesskey, "BoldAsColour", 0); conf_set_int(conf, CONF_bold_style, i+1 Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56868a436939d94e7f17266a8d121f53 Text-delta-base-sha1: c6b4ce7ada755cf8d85283358a041eb5c20a4745 Text-content-length: 288 Text-content-md5: f5c73b1b756599510312d4cb2d131f3b Text-content-sha1: dfdfd4bec841bf17bab911bdd01b4e8305e3762c Content-length: 288 SVN����!X�5��x;� e �Bt�-Hstylestyle = conf_get_int(inst->conf, CONF_bold_style(inst->bold_style & 2) && (attr & ATTR_BOLD)) { if (nfg < 16) nfg |= 8; else if (nfg >= 256) nfg |= 1; } if ((inst->bold_style & 2)(inst->bold_style & 1)�r} �r�ntainer_add Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 66fb62bf08179c2b54516ca3095f28c7 Text-delta-base-sha1: 44d93d0894755b6bec5e9f62b1a28fdf0da1b76e Text-content-length: 956 Text-content-md5: ff22e8eddf8f814819be30e71352bd1a Text-content-sha1: 7c76a14359ae770c317007f2860068de639f9f09 Content-length: 956 SVN����_t�{�F�N&�+;�geU�V�;#�UXg�04�c�Dw� :�[:�lNONE, BOLD_SHADOW, BOLD_FONT } bold_font_mode; static int bold_coloursfont_mode = conf_get_int(conf, CONF_bold_style) & 1 ? BOLD_FONT : BOLD_NONE; bold_colours = conf_get_int(conf, CONF_bold_style) & 2 ? TRUE : FALSEfontfont_mode == BOLD_FONT && fontsize[FONT_BOLD] != fontsize[FONT_NORMAL]) { bold_fontstyle) != conf_get_int(prev_conf, CONF_bold_styleint is_cursor = FALSE/* cursor fg and bg */ attr |= (260 << ATTR_FGSHIFT) | (261 << ATTR_BGSHIFT); is_cursor = TRUEfontcolours && (attr & ATTR_BOLD) && !is_cursor) { if (nfg < 16) nfg |= 8; else if (nfg >= 256) nfg |= 1; } if (bold_coloursfontfont�pF*%v�f��Re�5K�i� �?1 /* And 'normal' unicode characters */ static WCHAR *wbuf = NULL; static int wlen = 0; fontcolourscoloursfont_mode != BOLD_NONEcolours Revision-number: 9560 Prop-content-length: 106 Content-length: 106 K 8 svn:date V 27 2012-06-09T15:09:56.997970Z K 7 svn:log V 7 Fixed. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/bold-font-colour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9dc39c43d740823cd045a042a0ed7aa5 Text-delta-base-sha1: 85223168fba94c1c0c3fcc72dd87ad5176e51c5b Text-content-length: 90 Text-content-md5: 29d319cc727200c193feafe9e7840f1b Text-content-sha1: d60134066aee41fc399e77066a2b8d021763ad2d Content-length: 90 SVN��,q D��� Fixed-in: 9559 <p><b>SGT, 2012-06-09</b>: Now implemented on trunk. Revision-number: 9561 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9562 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9563 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9564 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2012-06-12T14:52:27.805949Z K 7 svn:log V 21 Fix revision markup. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/bold-font-colour Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 29d319cc727200c193feafe9e7840f1b Text-delta-base-sha1: d60134066aee41fc399e77066a2b8d021763ad2d Text-content-length: 37 Text-content-md5: f78a8f4844fdb62e3d1900f2e6f8d43b Text-content-sha1: 18bfb92464f6f2c9cf04801f33a8236fb171892a Content-length: 37 SVN��q} ���Ur9559 2012-06-10 Revision-number: 9565 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9566 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9567 Prop-content-length: 400 Content-length: 400 K 8 svn:date V 27 2012-06-17T07:26:23.891595Z K 7 svn:log V 299 Support for dead keys and compose sequences on Unix, by instantiating a GtkIMMulticontext and having that filter most keypresses. I think I've got this right so that it doesn't break any previous deliberate keyboard-handling behaviour that's now _after_ the 'if (filter keypress) return' statement. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f5c73b1b756599510312d4cb2d131f3b Text-delta-base-sha1: dfdfd4bec841bf17bab911bdd01b4e8305e3762c Text-content-length: 3226 Text-content-md5: 9cac10279306f322358f91476e269529 Text-content-sha1: 7dcb9fbba35ad14417cd848c530e3a5625f5cf25 Content-length: 3226 SVN����[+�"��e�"v�?d�Tu�BW�E�#&Y�L~�dG�*�T4N�'localeif GTK_CHECK_VERSION(2,0,0) #include <gtk/gtkimmodule.h> #endif#if GTK_CHECK_VERSION(2,0,0) GtkIMContext *imc; #endif#if GTK_CHECK_VERSION(2,0,0) gtk_im_context_set_client_window(inst->imc, widget->window); #endif) { if ((event->keyval == GDK_Meta_L || event->keyval == GDK_Alt_L || event->keyval == GDK_Meta_R || event->keyval == GDK_Alt_R) && inst->alt_keycode >= 0 && inst->alt_digits > 1) { #ifdef KEY_DEBUGGING printf("Alt key up, keycode = %d\n", inst->alt_keycode); #endif /* * FIXME: we might usefully try to do something clever here * about interpreting the generated key code in a way that's * appropriate to the line code page. */ output[0] = inst->alt_keycode; end = 1; goto done; } #if GTK_CHECK_VERSION(2,0,0) if (gtk_im_context_filter_keypress(inst->imc, event)) return TRUE; #endif if (gtk_im_context_filter_keypress(inst->imc, event)) return TRUE; #if GTK_CHECK_VERSION(2,0,0) void input_method_commit_event(GtkIMContext *imc, gchar *strlpage_send(inst->ldisc, CS_UTF8, str, strlen(str), 1); } #endif #if GTK_CHECK_VERSION(2,0,0) { GdkRectangle cursorrect; cursorrect.x = x*inst->font_width+inst->window_border; cursorrect.y = y*inst->font_height+inst->window_border; cursorrect.width = len*widefactor*inst->font_width; cursorrect.height = inst->font_height; gtk_im_context_set_cursor_location(inst->imc, &cursorrect); } #endifsetlocale(LC_CTYPE, "")#if GTK_CHECK_VERSION(2,0,0) inst->imc = gtk_im_multicontext_new(); #endif�}kmS�(��V'nf, CONF_winclass); if (*winclass) gtk_window_set_wmclass(GTK_WINDOW(inst->window), winclass, winclass); } /* * Set up the colour map. */ palette_reset(inst); inst->width = conf_get_int(inst->conf, CONF_width); inst->height = conf_get_int(inst->conf, CONF_height); cache_conf_values(inst); gtk_drawing_area_size(GTK_DRAWING_AREA(inst->area), inst->font_width * inst->width + 2*inst->window_border, inst->font_height * inst->height + 2*inst->window_border); inst->sbar_adjust = GTK_ADJUSTMENT(gtk_adjustment_new(0,0,0,0,0,0)); inst->sbar = gtk_vscrollbar_new(inst->sbar_adjust); inst->hbox = GTK_BOX(gtk_hbox_new(FALSE, 0)); /* * We always create the scrollbar; it remains invisible if * unwanted, so we can pop it up quickly if it suddenly becomes * desirable. */ if (conf_get_int(inst->conf, CONF_scrollbar_on_left)) gtk_box_pack_start(inst->hbox, inst->sbar, FALSE, FALSE, 0); gtk_box_pack_start(inst->hbox, inst->area, TRUE, TRUE, 0); if (!conf_get_int(inst->conf, CONF_scrollbar_on_left)) gtk_box_pack_start(inst->hbox, inst->sbar, FALSE, FALSE, 0); gtk_co#if GTK_CHECK_VERSION(2,0,0) g_signal_connect(G_OBJECT(inst->imc), "commit", G_CALLBACK(input_method_commit_event), inst); #endif Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aed64a9759340afad60e4b32a3f9a66b Text-delta-base-sha1: 7b7862718dcd2d68b258677fc9d0364d00dcc8b0 Text-content-length: 35 Text-content-md5: 3a74cdb65c4a28c009843cf3f8b16344 Text-content-sha1: e2685c31e8705f85fd02cddf7d86452b5eddcdc8 Content-length: 35 SVN��)��6��=P�')�Ij�FO Revision-number: 9568 Prop-content-length: 250 Content-length: 250 K 8 svn:date V 27 2012-06-18T18:10:59.840832Z K 7 svn:log V 149 Add the missing code to treat data coming from the input method as keypresses for purposes of hiding the mouse pointer and resetting the scrollback. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9cac10279306f322358f91476e269529 Text-delta-base-sha1: 7dcb9fbba35ad14417cd848c530e3a5625f5cf25 Text-content-length: 168 Text-content-md5: dd698fab6f2ee792ce47571bc553cc86 Text-content-sha1: 9aac64d4d91251126214a24aaff5077fc5885d73 Content-length: 168 SVN���� >�$��! show_mouseptr(inst, 0); term_seen_key_event(inst->term�k,AA�k�EVEL); { const char *winclass = conf_get_str(inst->co Revision-number: 9569 Prop-content-length: 372 Content-length: 372 K 8 svn:date V 27 2012-06-20T17:39:32.245794Z K 7 svn:log V 271 John Hartnup reports that Apache SSHD's SFTP server responds to FXP_READDIR on an empty directory by returning a zero-length list of filenames, instead of the more common response of a list containing just "." and "..". Stop PSFTP failing an assertion when that happens. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f11729db176985568bdea27726fd8482 Text-delta-base-sha1: 9ce11d4500691639ef6097c2480f03bc6a44e4c0 Text-content-length: 532 Text-content-md5: f5340fd7436eea88c31c23a0efe6d737 Text-content-sha1: 9010b03d4ef4edeb261308a326e2f5ee23b712a0 Content-length: 532 SVN��eaw�2�w�8- else if (swcm->names->nnames == 0) { /* * Another failure mode which we treat as EOF is if * the server reports success from FXP_READDIR but * returns no actual names. This is unusual, since * from most servers you'd expect at least "." and * "..", but there's nothing forbidding a server from * omitting those if it wants to. */ return NULL; Revision-number: 9570 Prop-content-length: 216 Content-length: 216 K 8 svn:date V 27 2012-06-22T21:23:28.152211Z K 7 svn:log V 115 Since a user just asked, let's note down a list of the servers I know of that can be persuaded to support RSA KEX. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/ssh2-rsa-kex Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e3c35842bfd5beda75c9e730b71fd718 Text-delta-base-sha1: e5a91a4708bdad08f7c3c94aedbaa833b7871819 Text-content-length: 1061 Text-content-md5: 2d9e1664201ac4b60fa844da4bf62861 Text-content-sha1: fe3e88e6f38bec315607e03dfad42aa48a62184f Content-length: 1061 SVN��4F�4� <p> <b>SGT, 2012-06-22</b>: Perhaps this is as good a place as any to keep a list of known server-side implementations. <ul> <li> <a href="https://bugzilla.mindrot.org/show_bug.cgi?id=1314">OpenSSH bug #1314</a> includes a patch which adds RSA key exchange to OpenSSH, although the OpenSSH maintainers decided not to integrate it in the end. <li> <a href="ftp://sparkle.rodents-montreal.org/pub/mouse/local/src/moussh">MouSSH</a> supports RSA key exchange. (It looks as if the FTP link here is the most convenient way to get MouSSH: you'll need the contents of that directory and several libraries in directories alongside it – see the <code>INSTALL</code> file for a list – and I haven't personally confirmed that it compiles and works.) <li> The <a href="http://www.proftpd.org/docs/contrib/mod_sftp.html"><code>mod_sftp</code></a> module for <a href="http://www.proftpd.org/">ProFTPD</a> is documented as supporting RSA key exchange. (But it looks as if you can't do anything except SFTP over the resulting connection.) </ul> Revision-number: 9571 Prop-content-length: 202 Content-length: 202 K 8 svn:date V 27 2012-07-01T16:55:36.720209Z K 7 svn:log V 101 Stop including <gtk/gtkcontainer.h> directly, since a user points out that it'll be absent in GTK 3. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkcols.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a44cacc75f09a0a2cf2d23012143ebda Text-delta-base-sha1: 9ee15c3830d9eeab11f15d5531fdbed78ca8bb8d Text-content-length: 20 Text-content-md5: e0413c1faa228e36c564027d2768d6a1 Text-content-sha1: ec17c7e054623484be244f1b4cc4468cdc227527 Content-length: 20 SVN��;2 ��_��Sh Revision-number: 9572 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9573 Prop-content-length: 757 Content-length: 757 K 7 svn:log V 656 Turns out that the compose-keys fix in r9567 did in fact break one piece of keyboard handling: if Num Lock is on, numeric keypad keys are eaten by the IM, so we must avoid passing them to the IM in the first place if we're in any non-default numeric keypad mode (application or Nethack). This is a grubby way to do it, but the more obvious approach of just moving the Nethack and app-keypad if statements up to above the IM call doesn't work because those statements depend on the generic Alt-prefix handling that happens just _below_ the IM call. So instead I just repeat the list of keystrokes and modes in an if statement conditionalising the IM call. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-07-05T23:45:20.640053Z PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd698fab6f2ee792ce47571bc553cc86 Text-delta-base-sha1: 9aac64d4d91251126214a24aaff5077fc5885d73 Text-content-length: 5973 Text-content-md5: dc7aa6b9e2eb65b15b2757f56a67205b Text-content-sha1: 54ed79dc9006a898221df17483d05e371b8a9664 Content-length: 5973 SVN����+h���nG�Ga�s�&<�,1 int nethack_mode, app_keypad_mode nethack_mode = conf_get_int(inst->conf, CONF_nethack_keypad); app_keypad_mode = (inst->term->app_keypad_keys && !conf_get_int(inst->conf, CONF_no_applic_k))/* * Most things can now be passed to * gtk_im_context_filter_keypress without breaking anything * below this point. An exception is the numeric keypad if * we're in Nethack or application mode: the IM will eat * numeric keypad presses if Num Lock is on, but we don't want * it to. */ if (app_keypad_mode && (event->keyval == GDK_Num_Lock || event->keyval == GDK_KP_Divide || event->keyval == GDK_KP_Multiply || event->keyval == GDK_KP_Subtract || event->keyval == GDK_KP_Add || event->keyval == GDK_KP_Enter || event->keyval == GDK_KP_0 || event->keyval == GDK_KP_Insert || event->keyval == GDK_KP_1 || event->keyval == GDK_KP_End || event->keyval == GDK_KP_2 || event->keyval == GDK_KP_Down || event->keyval == GDK_KP_3 || event->keyval == GDK_KP_Page_Down || event->keyval == GDK_KP_4 || event->keyval == GDK_KP_Left || event->keyval == GDK_KP_5 || event->keyval == GDK_KP_Begin || event->keyval == GDK_KP_6 || event->keyval == GDK_KP_Right || event->keyval == GDK_KP_7 || event->keyval == GDK_KP_Home || event->keyval == GDK_KP_8 || event->keyval == GDK_KP_Up || event->keyval == GDK_KP_9 || event->keyval == GDK_KP_Page_Up || event->keyval == GDK_KP_Decimal || event->keyval == GDK_KP_Delete)) { /* app keypad; do nothing */ } else if (nethack_mode && (event->keyval == GDK_KP_1 || event->keyval == GDK_KP_End || event->keyval == GDK_KP_2 || event->keyval == GDK_KP_Down || event->keyval == GDK_KP_3 || event->keyval == GDK_KP_Page_Down || event->keyval == GDK_KP_4 || event->keyval == GDK_KP_Left || event->keyval == GDK_KP_5 || event->keyval == GDK_KP_Begin || event->keyval == GDK_KP_6 || event->keyval == GDK_KP_Right || event->keyval == GDK_KP_7 || event->keyval == GDK_KP_Home || event->keyval == GDK_KP_8 || event->keyval == GDK_KP_Up || event->keyval == GDK_KP_9 || event->keyval == GDK_KP_Page_Up)) { /* nethack mode; do nothing */ } else { if (gtk_im_context_filter_keypress(inst->imc, event)) return TRUE; }nethack_modeapp_keypad_mode�,O##�,� = conf_get_str(inst->conf, CONF_wintitle); if (s[0]) { set_title_and_icon(inst, s, s); } else { char *title = make_default_wintitle(realhost); set_title_and_icon(inst, title, title); sfree(title); } sfree(realhost); inst->back->provide_logctx(inst->backhandle, inst->logctx); term_provide_resize_fn(inst->term, inst->back->size, inst->backhandle); inst->ldisc = ldisc_create(inst->conf, inst->term, inst->back, inst->backhandle, inst); gtk_widget_set_sensitive(inst->restartitem, FALSE); } int pt_main(int argc, char **argv) { extern int cfgbox(Conf *conf); struct gui_data *inst; setlocale(LC_CTYPE, ""); /* * Create an instance structure and initialise to zeroes */ inst = snew(struct gui_data); memset(inst, 0, sizeof(*inst)); inst->alt_keycode = -1; /* this one needs _not_ to be zero */ inst->busy_status = BUSY_NOT; inst->conf = conf_new(); inst->wintitle = inst->icontitle = NULL; /* defer any child exit handling until we're ready to deal with * it */ block_signal(SIGCHLD, 1); inst->progname = argv[0]; /* * Copy the original argv before letting gtk_init fiddle with * it. It will be required later. */ { int i, oldargc; inst->gtkargvstart = snewn(argc-1, char *); for (i = 1; i < argc; i++) inst->gtkargvstart[i-1] = dupstr(argv[i]); oldargc = argc; gtk_init(&argc, &argv); inst->ngtkargs = oldargc - argc; } if (argc > 1 && !strncmp(argv[1], "---", 3)) { read_dupsession_data(inst, inst->conf, argv[1]); /* Splatter this argument so it doesn't clutter a ps listing */ memset(argv[1], 0, strlen(argv[1])); } else { /* By default, we bring up the config dialog, rather than launching * a session. This gets set to TRUE if something happens to change * that (e.g., a hostname is specified on the command-line). */ int allow_launch = FALSE; if (do_cmdline(argc, argv, 0, &allow_launch, inst, inst->conf)) exit(1); /* pre-defaults pass to get -class */ do_defaults(NULL, inst->conf); if (do_cmdline(argc, argv, 1, &allow_launch, inst, inst->conf)) exit(1); /* post-defaults, do everything */ cmdline_run_saved(inst->conf); if (loaded_session) allow_launch = TRUE; if ((!allow_launch || !conf_launchable(inst->conf)) && !cfgbox(inst->conf)) exit(0); /* config box hit Cancel */ } if (!compound_text_atom) compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE); if (!utf8_string_atom) utf8_string_atom = gdk_atom_intern("UTF8_STRING", FALSE); inst->area = gtk_drawing_area_new(); #if GTK_CHECK_VERSION(2,0,0) inst->imc = gtk_im_multicontext_new(); #endif setup_fonts_ucs(inst); init_cutbuffers(); inst->window = gtk_window_new(GTK_WINDOW_TOPL Revision-number: 9574 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2012-07-10T16:29:09.510764Z K 7 svn:log V 41 New/updated links from Michael Gliwinski K 10 svn:author V 4 owen PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f620809fe5c13c20484f97ed07527b1f Text-delta-base-sha1: c3953a015632f59a53a9cde99f42fce6cd292ad2 Text-content-length: 1703 Text-content-md5: cac7e7e4d0b4d312f9e537cc287cbce9 Text-content-sha1: 8795a7e76e2d41041101dc3c20033ed525e4235a Content-length: 1703 SVN��F/,m�?��bo�p63�A&�id*�?s://puttytray.goeswhere.com/"> PuTTY Tray</a>, minimising to system tray, transparency, <a href="wishlist/url-launching.html">URL hyperlinks</a>, <a href="wishlist/config-locations.html">settings storage in files</a>, reconnecting on failure, Android adb support<a href="wishlist/config-locations.html">settings storage in files</a>, and automatically sending a command (as if typed at the keyboard) after successful session startup. <li><a href="http://www.extraputty.com/">ExtraPuTTY</a>, a (Windows-only) fork featuring a DLL wrapper, scripting with lua, URL hyperlinks, <a href="wishlist/config-locations.html">settings storage in files</a>, bundled <a href="http://puttysm.sourceforge.net/">PuTTY Session Manager</a>, and a couple of other things (no source) (no source) <li><a href="http://code.google.com/p/putty-tunnel-manager/">PuTTY Tunnel Manager</a>, for maintaining multiple, long-running sessions each providing a set of tunnelsli><a href="http://www.launchy.net/">Launchy</a> with <a href="http://code.google.com/p/putty-launchy-plugin/">PuTTY Plugin</a> allows launching PuTTY sessions by typing first characters of their name, also works with versions storing sessions in fileli><a href="http://puttymanager.sourceforge.net/">PuTTY Manager</a> allows launching PuTTY sessions in a tabbed interface and/or dockable windows <li><a href="http://code.google.com/p/superputty/">SuperPutty</a> provides tabbed/docking interface for PuTTY sessions and file uploads <li><a href="http://ttyplus.com/multi-tabbed-putty/">MTPuTTY</a> embeds PuTTY sessions in a tabbed interface, provides automation features Revision-number: 9575 Prop-content-length: 778 Content-length: 778 K 8 svn:date V 27 2012-07-11T18:12:17.704049Z K 7 svn:log V 677 If pterm's execvp fails when given the whole argument list after -e, and the argument list contains only one string, try again by passing that single string to "$SHELL -c" to be parsed as a shell command. This matches xterm's behaviour (as of xterm 261, at least), and means in practice that users can do _either_ of 'pterm -e some command' and 'pterm -e "some command"'. (A quick survey suggests that the majority of X terminal programs agree with pterm's old behaviour of only supporting '-e some command', except that gnome-terminal only supports the other behaviour and xterm supports both. With that disagreement, I think supporting both is probably the sensible thing.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b294eb2445885f48d6e252b078a48338 Text-delta-base-sha1: fa5104a1f53e453abdcfe8e273055a4711cb4383 Text-content-length: 1581 Text-content-md5: a304bf6657f0606e97e97f752acd6a56 Text-content-sha1: 31b294db2f4ddb4e55ce8cfc936c9c4916dfd7e3 Content-length: 1581 SVN��}h�~��Y$ { /* * Exec the exact argument list we were given. */ execvp(pty_argv[0], pty_argv); /* * If that fails, and if we had exactly one argument, pass * that argument to $SHELL -c. * * This arranges that we can _either_ follow 'pterm -e' * with a list of argv elements to be fed directly to * exec, _or_ with a single argument containing a command * to be parsed by a shell (but, in cases of doubt, the * former is more reliable). * * A quick survey of other terminal emulators' -e options * (as of Debian squeeze) suggests that: * * - xterm supports both modes, more or less like this * - gnome-terminal will only accept a one-string shell command * - Eterm, kterm and rxvt will only accept a list of * argv elements (as did older versions of pterm). * * It therefore seems important to support both usage * modes in order to be a drop-in replacement for either * xterm or gnome-terminal, and hence for anyone's * plausible uses of the Debian-style alias * 'x-terminal-emulator'... */ if (pty_argv[1] == NULL) { char *shell = getenv("SHELL"); if (shell) execl(shell, shell, "-c", pty_argv[0], (void *)NULL); } } Revision-number: 9576 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9577 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9578 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9579 Prop-content-length: 372 Content-length: 372 K 7 svn:log V 272 Remove term_key, which was intended to handle function keys in a cross- platform manner, but which nothing ever called. It thus served only to trap up the unwary. The live function key handling code lives in the frontends, i.e. window.c on Windows and gtkwin.c on Unix. K 10 svn:author V 4 owen K 8 svn:date V 27 2012-07-18T16:08:54.519165Z PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fc73eec0b2c9df214675ccfbdaa34207 Text-delta-base-sha1: 359e267dd18422aae5359206cbcee7bf287834c3 Text-content-length: 40 Text-content-md5: 9ec1be9cd777f78386d02fa4384fede0 Text-content-sha1: 06e8cf4df5ca18a4507244ab37c98f51554d97e6 Content-length: 40 SVN���������  ���� Revision-number: 9580 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9581 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9582 Prop-content-length: 483 Content-length: 483 K 8 svn:date V 27 2012-07-19T04:29:50.560954Z K 7 svn:log V 382 Rework the new type-check in sresize so that it doesn't cause a compile warning ('left-hand operand of comma expression has no effect'), which of course becomes fatal under -Werror. (This would have been instantly noticeable to people compiling with the old-fashioned Makefile.gtk, which does include -Wall -Werror, but those of us using the new autoconf makefile hadn't noticed.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/puttymem.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c2e11b72ae657f924f24f3e2943c37c Text-delta-base-sha1: acc8421846f67aa08a685edbdd7eabcceff49ab2 Text-content-length: 667 Text-content-md5: c26ad4abc2b41535a84828343ab023ea Text-content-sha1: cd9f1720c2c32c2041d9ccb022215abbdacb44a7 Content-length: 667 SVN��m���W�{) * The nasty trick in sresize with sizeof arranges for the compiler, * in passing, to type-check the expression ((type *)0 == (ptr)), i.e. * to type-check that the input pointer is a pointer to the correct * type. The construction sizeof(stuff) ? (b) : (b) looks like a * violation of the first principle of safe macros, but in fact it's * OK - although it _expands_ the macro parameter more than once, it * only _evaluates_ it once, so it's still side-effect safe \ ((type *)snrealloc(sizeof((type *)0 == (ptr)) ? (ptr) : (ptr), \ (n), sizeof(type))) #endif Revision-number: 9583 Prop-content-length: 349 Content-length: 349 K 8 svn:date V 27 2012-07-19T04:42:34.619151Z K 7 svn:log V 248 Add '-Wall -Werror' to the compile options in the autotools makefile, having just noticed that Makefile.gtk had it and this one doesn't. (Of course, this being autoconf, we can easily enough make it conditional on the compiler actually being gcc.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d1c1d396e4345ebe3c040c17a3d0a24 Text-delta-base-sha1: f2d6caa7e76555eba95a749a9404fa0e8bd5136b Text-content-length: 39 Text-content-md5: 680f8a556caf729ec21e791b71de73ac Text-content-sha1: 2ff52df0a22e168e808fb67e4c4947700e4ea8ad Content-length: 39 SVN��Ob �n��fi"\$(WARNINGOPT Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1e5dbc0c03fb68a71a485762e0a78147 Text-delta-base-sha1: 8c1a510bf2a65563fbc494753f0859f7534ca439 Text-content-length: 139 Text-content-md5: 2f8778e37716b90eb5db3310bfd3b776 Text-content-sha1: 034c99dcec729f92c201ea657202ecc964566261 Content-length: 139 SVN��:1 u�T�u�hRif test "x$GCC" = "xyes"; then : AC_SUBST(WARNINGOPTS, ['-Wall -Werror']) else : AC_SUBST(WARNINGOPTS, []) fi Revision-number: 9584 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9585 Prop-content-length: 203 Content-length: 203 K 8 svn:date V 27 2012-07-22T19:48:39.472695Z K 7 svn:log V 102 Remove a bashism in mksrcarc.sh, without which bob builds fail on Ubuntu (whose /bin/sh is not bash). K 10 svn:author V 5 simon PROPS-END Node-path: putty/mksrcarc.sh Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 037d0e99b0b8d914bc4615a349830b7f Text-delta-base-sha1: 9024e5dd8de15170a0eea9e8975af486302259a7 Text-content-length: 34 Text-content-md5: 23f315fd85ec136eafb397efccbdd1e8 Text-content-sha1: b6228f61a64977c0131d798edab1b679c2b38c37 Content-length: 34 SVN��LP��'% /dev/null 2>&1 Revision-number: 9586 Prop-content-length: 494 Content-length: 494 K 7 svn:log V 393 Introduce a new utility function smemclr(), which memsets things to zero but does it in such a way that over-clever compilers hopefully won't helpfully optimise the call away if you do it just before freeing something or letting it go out of scope. Use this for (hopefully) every memset whose job is to destroy sensitive data that might otherwise be left lying around in the process's memory. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-07-22T19:51:50.742158Z PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 063d7502ff893a867c4378f689bbd1a8 Text-delta-base-sha1: 37387e7b2be7744fba7d2f7e3c73accfc8e2d459 Text-content-length: 90 Text-content-md5: 3274abc723704fe6186ba97fb325b010 Text-content-sha1: f34c053eea4c8738fd23b4a80c3e7dc0a93395c9 Content-length: 90 SVN��{3���j-�8+� wsmemclr(entropysmemclr(passphrasesmemclr(passphrase Node-path: putty/cmdline.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b4ce8e0c0aba636a41c1162993d9f496 Text-delta-base-sha1: d821a50f694c38457d76d7d3e277b12075ca02e5 Text-content-length: 94 Text-content-md5: aa64b37248ebf3e80b7169b14ede7481 Text-content-sha1: 1334aff4c1534be2a5a9d314f5ec5661601a480d Content-length: 94 SVN��=�5��vO�'_�smemclr(cmdline_passwordsmemclr(cmdline_passwordsmemclr(value Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 11eea36d67f75b4d4fb896c73f29e892 Text-delta-base-sha1: eac06fbfe0fbf84ffa8278490056d08d72b4a764 Text-content-length: 1541 Text-content-md5: 5763147291e49b81d26b5d78db15e6d5 Text-content-sha1: 8b5f1ff5297fa8863dc292f6f21641afecf572ac Content-length: 1541 SVN��Ew8>�G��H)�fL�$/�w�h0�I7�by�3oR�dx�F �Kj� 0�Aw?�F}�GT�x)�q0�m/�c*�I7�iyR�L8�Z< �R&�0d�F}; smemclr(linesmemclr(out, sizeof(out)); } p++; } } smemclr(linesmemclr(base64_bitsmemclr(line, strlen(line)); sfree(line); line = NULL; } smemclr(base64_bit, sizeof(base64_bit)); if (ret) { if (ret->keyblob) { smemclr(ret->keyblobsmemclr(retsmemclr(key->keyblob, key->keyblob_size); sfree(key->keyblob); smemclr(keysmemclr(&md5c, sizeof(md5c)); smemclr(keybufsmemclr(blob, blobsize); sfree(blob); } smemclr(key->keyblob, key->keyblob_size); sfree(key->keyblob); smemclr(keysmemclr(&md5c, sizeof(md5c)); smemclr(keybufsmemclr(outblob, outlen); sfree(outblob); } if (spareblob) { smemclr(spareblob, sparelen); sfree(spareblob); } if (privblob) { smemclr(privblobsmemclr(pubblobsmemclr(linesmemclr(line2smemclr(linesmemclr(linesmemclr(ret->keyblobsmemclr(retsmemclr(key->keyblob, key->keyblob_size); sfree(key->keyblob); smemclr(keysmemclr(&md5c, sizeof(md5c)); smemclr(keybufsmemclr(blob, blobsize); sfree(blob); } smemclr(key->keyblob, key->keyblob_size); sfree(key->keyblob); smemclr(keysmemclr(&md5c, sizeof(md5c)); smemclr(keybufsmemclr(outblob, outlen); sfree(outblob); } if (privblob) { smemclr(privblobsmemclr(pubblob Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 749597efff7d7692ab4461350aa29be5 Text-delta-base-sha1: 50994dc64d20b22efdd7753138d9839b4491bae2 Text-content-length: 1368 Text-content-md5: 488b5f685c94038447556089d1ce5be2 Text-content-sha1: 2223f2c6419db45e394810c5f9ef5165235880d7 Content-length: 1368 SVN��zp1�S��j�`}� msmemclr(pr->resultsmemclr(pr->resultsmemclr(string #ifndef PLATFORM_HAS_SMEMCLR /* * Securely wipe memory. * * The actual wiping is no different from what memset would do: the * point of 'securely' is to try to be sure over-clever compilers * won't optimise away memsets on variables that are about to be freed * or go out of scope. See * https://buildsecurityin.us-cert.gov/bsi-rules/home/g1/771-BSI.html * * Some platforms (e.g. Windows) may provide their own version of this * function. */ void smemclr(void *b, size_t n) { volatile char *vp; if (b && n > 0) { /* * Zero out the memory. */ memset(b, 0, n); /* * Perform a volatile access to the object, forcing the * compiler to admit that the previous memset was important. * * This while loop should in practice run for zero iterations * (since we know we just zeroed the object out), but in * theory (as far as the compiler knows) it might range over * the whole object. (If we had just written, say, '*vp = * *vp;', a compiler could in principle have 'helpfully' * optimised the memset into only zeroing out the first byte. * This should be robust.) */ vp = b; while (*vp) vp++; } } #endif Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e5cc4888942122c04f99dcf9a118b441 Text-delta-base-sha1: 0f021b62f9cb25dd92730301e9b2dd2a8acf0061 Text-content-length: 59 Text-content-md5: 5c2131ee56ae621d7ce62ffe63ffe2ab Text-content-sha1: 55ac572883e2b6cbd9311ff73be6788c1ba45753 Content-length: 59 SVN��@ "�`��>_void smemclr(void *b, size_t len); Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b14f76bccd87d738bf6214e068a828c Text-delta-base-sha1: 46c636e931b4c01154c71dbee8ae20becee91275 Text-content-length: 260 Text-content-md5: 01d62f99917641fc91cdef7ca7134921 Text-content-sha1: edfae0559f5c1c45f62719a29d6c1f5b813b326e Content-length: 260 SVN�����������8�8��oL�0M�qsmemclr(passphrasesmemclr(keyspacesmemclr(keyspaceAll ot���$Y�k�I�dc�\� usmemclr(passphrasesmemclr(s->passwordsmemclr(s->passwordsmemclr(s->password } } static��� Node-path: putty/sshaes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9c576877bba588b75dcdf146f410af67 Text-delta-base-sha1: 2e9840a9191cc4e8bafdd6b31fc25d6046cb9881 Text-content-length: 122 Text-content-md5: a933eefac2742312b5ac4dab7263e0c9 Text-content-sha1: e9c17491b7f69f3dac95c5fa0517222f79ff39e0 Content-length: 122 SVN��1-Z���%;�-smemclr(&ctx, sizeof(ctx)); } void aes256_dedecrypt_cbc(blk, len, &ctx); smemclr(&ctx Node-path: putty/ssharcf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e25fdf2995d2d337d05155153a587533 Text-delta-base-sha1: 0674ecc27149b7588eca721c2b262e54239d46ec Text-content-length: 33 Text-content-md5: 3564c932d112a8ceb2bfccb9aacbffc2 Text-content-sha1: 1386c22620a04c0608c9facad56d4cee301e69a1 Content-length: 33 SVN�� �4��ABsmemclr(junk Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 908a614cbaec0a418ca2fa5427529751 Text-delta-base-sha1: 15000f3347ec58bbf6d1c751bc30ce29a62d09c1 Text-content-length: 33 Text-content-md5: 52049d5aca4f8db90b425b6d8b055184 Text-content-sha1: 386614c1a64d43dec9fc048b89e18017935390f4 Content-length: 33 SVN���~ �:��;Esmemclr(b Node-path: putty/sshdes.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 20bbb8a93ad4cd5093839a7490a6f48b Text-delta-base-sha1: bb24818b01593ce6b239050f4b6c66280114852c Text-content-length: 106 Text-content-md5: c1f47f3bd0154c52f55c4d3b20626f5e Text-content-sha1: ad4b821612ef3e9ee542b754fd66902614134c5b Content-length: 106 SVN��>6!<�h��Dy�IN�I(�<smemclr(ourkeyssmemclr(ourkeyssmemclr(ourkeyssmemclr(ourkeys Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2a549a206a18417111c91cab80c1fbb8 Text-delta-base-sha1: a8c21d6849603f668d994fb41d4afdd789379886 Text-content-length: 97 Text-content-md5: e8206db08a5765e21ae275ec4a506694 Text-content-sha1: 435c177e2d4989db948bf17fbdbf6f485baaa79c Content-length: 97 SVN��d\8�:��<J��L(�]smemclr(lenbufsmemclr(lenbufsmemclr(&sssmemclr(digest512 Node-path: putty/sshmd5.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9155dcd3db6b6fad6f7efed4879ec9ed Text-delta-base-sha1: d11b3489266b35728ea8ae2ab56209cdbee895aa Text-content-length: 32 Text-content-md5: f48a6a1a52fd3700c4c3d1d3c3273e3a Text-content-sha1: a59d508db5c78cd45d15719bcb73912453986277 Content-length: 32 SVN��{y �>��0Ksmemclr(foo Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 371a3f65a6fe35e9ffc56393d7bd32c1 Text-delta-base-sha1: af56ad6d8be56cdeef7e7b75073cfefdae3ba86c Text-content-length: 316 Text-content-md5: 3262bb511beaa47c650395d233c09fc3 Text-content-sha1: 85065dd793bef3bdbf51798d19612509aef8b44e Content-length: 316 SVN��YA9u�'��M7�$�>E�`7�r(X�x�>�nksmemclr(keybufsmemclr(bufsmemclr(keybufsmemclr(mackey, sizeof(mackey)); smemclr(&ssmemclr(macdatasmemclr(macdata, maclen); sfree(macdata); smemclr(mackey, sizeof(mackey)); smemclr(&ssmemclr(key, sizeof(key)); smemclr(&ssmemclr(priv_blob Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bc19e9d78fbd0d3441a5149a978c75ee Text-delta-base-sha1: 6d48ac220862f9dfb54cdc91887f24a88643f6da Text-content-length: 38 Text-content-md5: 62c2e862936cb2bb03b47957e22dd30c Text-content-sha1: fde4d97dab7c11848dee26c5089ad001947bbf43 Content-length: 38 SVN��  ���ksmemclr(lenbuf Node-path: putty/sshsha.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 529dd7f23408a0c74b583d0bf6b88b8f Text-delta-base-sha1: b5bdee3a157fc8290d6bc8ca447ad12a5a26da9c Text-content-length: 32 Text-content-md5: 5c85862a8656b84911534b165a0ab3d6 Text-content-sha1: dd66874d077415d8f047df032cde27f7918136cf Content-length: 32 SVN��^\ �Q���^smemclr(foo Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc7aa6b9e2eb65b15b2757f56a67205b Text-delta-base-sha1: 54ed79dc9006a898221df17483d05e371b8a9664 Text-content-length: 52 Text-content-md5: c909b9327bed77d0f50b109468ec057c Text-content-sha1: 89abcac8c7c0099d40d28b105c1a7eb1697113b3 Content-length: 52 SVN���������OM �y��E smemclr(argv[1] Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7495fc3c921b2b1861807355c9261e3d Text-delta-base-sha1: 1c3677a5e488ac87c5ed05fa0ef297024d514a40 Text-content-length: 188 Text-content-md5: 102bd9df15c3acd5a6f7bfe466f46f9a Text-content-sha1: 2dbba5760a39ba090db5b27eeac4114d6b212a70 Content-length: 188 SVN��I $�=�$�h7/* * Windows implementation of smemclr (see misc.c) using SecureZeroMemory. */ void smemclr(void *b, size_t n) { if (b && n > 0) SecureZeroMemory(b, n Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 318b8afb6f4ec8bf99eebe21ab9dcf70 Text-delta-base-sha1: 941bb1410245bac29d955ad2eb25f8ef6377b13c Text-content-length: 47 Text-content-md5: 8ed91425c562bbfd56c39f075738a1e0 Text-content-sha1: d5d82491afeef5452d06e7ff1ed4348f7de9a0ad Content-length: 47 SVN��PN �b��Vzsmemclr(state->entropy Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 417514aacc514f194ff717149979bd29 Text-delta-base-sha1: 48e4f6968a0093e38f97024d6e89f61dca11d4bd Text-content-length: 65 Text-content-md5: 8d0746e9c3dbfbb91d8e2fc5a4ab9d40 Text-content-sha1: a7f0843e86d07f96b84e94d22d11fd6e254b7983 Content-length: 65 SVN��xt!�:��}F�\smemclr(ppsmemclr(response_source Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 969ff10db2e1e34f78b357e22b9b2088 Text-delta-base-sha1: a72e40c8394cbad9fd2765824a70b35eb6564c4e Text-content-length: 95 Text-content-md5: 5e0973b60efd703c67bd847d28f39a06 Text-content-sha1: 068858e8ed45c1f98de9c7d9b0009779e8eb09d7 Content-length: 95 SVN��m6 G��G�k#define PLATFORM_HAS_SMEMCLR /* inhibit cross-platform one in misc.c */ Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 618a2428a043ab354f586df413777f5c Text-delta-base-sha1: 43db9f1e3bc772b029f9845640e2426d21bb2bc9 Text-content-length: 188 Text-content-md5: d75fab530e16d20ea15192bf63d3fdf5 Text-content-sha1: 580d62ac3aaea70b1b141d8a094e2bd86e74a6da Content-length: 188 SVN��^X�&��?;�Wsmemclr(disp->localauthdata, disp->localauthdatalen); sfree(disp->localauthdata); if (disp->remoteauthdata) smemclr(disp->remoteauthdatasmemclr(buf Revision-number: 9587 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9588 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9589 Prop-content-length: 127 Content-length: 127 K 8 svn:date V 27 2012-07-28T16:33:17.002892Z K 7 svn:log V 27 Remove an unused variable. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 111190e85b591f3d9a6ad8e8428bbdb4 Text-delta-base-sha1: a388cfebfaadc587f0f0cacf5bb3b63de0f2fa05 Text-content-length: 39 Text-content-md5: 4de414086ffda80bcf65d6d4607d2b7b Text-content-sha1: 2d22d0907b9399b9ad5905be3b93e8339a565a13 Content-length: 39 SVN��>/ �0��rLwhichbutton; Revision-number: 9590 Prop-content-length: 273 Content-length: 273 K 8 svn:date V 27 2012-07-28T16:33:51.316217Z K 7 svn:log V 172 Move the declaration of smemclr() out of putty.h into misc.h, because one of its uses (in sshaes.c) wasn't picking up the former. Thanks to Ubuntu's gcc for spotting that. K 10 svn:author V 5 simon PROPS-END Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6cc6e4dab07f6db0175602cea2638f2e Text-delta-base-sha1: cdbb0353fa5494e97e75a4c587817f0adb7534a6 Text-content-length: 53 Text-content-md5: e63a4913757d45cd3bdba57f764a2727 Text-content-sha1: bc3eabd583193a759e63d1c5312cbdb2b5c9bf70 Content-length: 53 SVN��j �u��yqvoid smemclr(void *b, size_t len Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c2131ee56ae621d7ce62ffe63ffe2ab Text-delta-base-sha1: 55ac572883e2b6cbd9311ff73be6788c1ba45753 Text-content-length: 24 Text-content-md5: e5cc4888942122c04f99dcf9a118b441 Text-content-sha1: 0f021b62f9cb25dd92730301e9b2dd2a8acf0061 Content-length: 24 SVN��@ ��`��= Revision-number: 9591 Prop-content-length: 286 Content-length: 286 K 8 svn:date V 27 2012-07-28T16:53:09.703254Z K 7 svn:log V 185 Fix an embarrassing mistake in config box handling which was causing changes to any SSH bug config option to be lost when the config box switched to a different panel, at least on GTK. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4de414086ffda80bcf65d6d4607d2b7b Text-delta-base-sha1: 2d22d0907b9399b9ad5905be3b93e8339a565a13 Text-content-length: 383 Text-content-md5: a5bc84f870392ae8c05c8b9c3d703938 Text-content-sha1: b7490e8f529ea9138c370d9b895e2f0fe7be0530 Content-length: 383 SVN��/b]�I�V�`H�\S /* * We must fetch the previously configured value from the Conf * before we start modifying the drop-down list, otherwise the * spurious SELCHANGE we trigger in the process will overwrite * the value we wanted to keep. */ int oldconf = conf_get_int(conf, ctrl->listbox.context.i);oldconf Revision-number: 9592 Prop-content-length: 271 Content-length: 271 K 7 svn:log V 170 Add a bug-compatibility flag to disable the winadj@putty.projects.tartarus.org request. Not currently enabled automatically, but should be usable as a manual workaround. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-07-28T19:30:12.125432Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a5bc84f870392ae8c05c8b9c3d703938 Text-delta-base-sha1: b7490e8f529ea9138c370d9b895e2f0fe7be0530 Text-content-length: 174 Text-content-md5: cd503d349ee01c2f5bbd59cab734eb82 Text-content-sha1: 5fcf4a0ed68cc6befcf5c69ef5370db9ba5c0443 Content-length: 174 SVN��b�u��ZChokes on PuTTY's SSH-2 'winadj' requests", 'j', 20, HELPCTX(ssh_bugs_winadj), sshbug_handler, I(CONF_sshbug_winadj Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fae76b6ed0ecb07ca373e60c38907eb2 Text-delta-base-sha1: a2e5830295a266ac50b81914427552b59dea5dde Text-content-length: 1255 Text-content-md5: ef51568de3c47ddf5da56166566e0c71 Text-content-sha1: b798e49c259c80173ae0ac8bdcaac7f3ee745c1a Content-length: 1255 SVN���������@;�f�;�^bS{config-ssh-bug-winadj} \q{Chokes on PuTTY's SSH-2 \cq{winadj} requests} \cfg{winhelp-topic}{ssh.bugs.winadj} PuTTY sometimes sends a special request to SSH servers in the middle of channel data, with the name \cw{winadj@putty.projects.tartarus.org} (see \k{sshnames-channel}). The purpose of this request is to measure the round-trip time to the server, which PuTTY uses to tune its flow control. The server does not actually have to \e{understand} the message; it is expected to send back a \cw{SSH_MSG_CHANNEL_FAILURE} message indicating that it didn't understand it. (All PuTTY needs for its timing calculations is \e{some} kind of response.) It has been known for some SSH servers to get confused by this message in one way or another \dash because it has a long name, or because they can't cope with unrecognised request names even to the extent of sending back the correct failure response, or because they handle it sensibly but fill up the server's log file with pointless spam, or whatever. PuTTY therefore supports this bug-compatibility flag: if it believes the server has this bug, it will never send its \cq{winadj@putty.projects.tartarus.org} request, and will make do without its timing data Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e5cc4888942122c04f99dcf9a118b441 Text-delta-base-sha1: 0f021b62f9cb25dd92730301e9b2dd2a8acf0061 Text-content-length: 52 Text-content-md5: 77549068aad13b4ec211829cc0c1909a Text-content-sha1: 9cdf4e15b65d01e3a31fdec5b4746f11bb20de07 Content-length: 52 SVN��? �%���X(INT, NONE, sshbug_winadj Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3cde03ee0c7b5eff67d4d938b7ca583e Text-delta-base-sha1: 3ff2d7c7b665dc0d2284b12eb6743111b246492f Text-content-length: 161 Text-content-md5: 56a16a8e6a8f944c87ca8ee55b5ccd3c Text-content-sha1: 4ccc5865c36278834cc791cb267ca30fe82c21e8 Content-length: 161 SVN��Y�w��UL�QBugWinadj", 2-conf_get_int(conf, CONF_sshbug_winadji = gppi_raw(sesskey, "BugWinadj", 0); conf_set_int(conf, CONF_sshbug_winadj Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 01d62f99917641fc91cdef7ca7134921 Text-delta-base-sha1: edfae0559f5c1c45f62719a29d6c1f5b813b326e Text-content-length: 1507 Text-content-md5: a402fa1a2673ad8b8cde812995eef0e0 Text-content-sha1: 23d139951b8970c3daec5de8190ce413cd4e5128 Content-length: 1507 SVN����S�L��ZK �#define BUG_CHOKES_ON_WINADJ 1024 if (conf_get_int(ssh->conf, CONF_sshbug_winadj) == FORCE_ON) { /* * Servers that don't support our winadj request for one * reason or another. Currently, none detected automatically. */ ssh->remote_bugs |= BUG_CHOKES_ON_WINADJ; logevent("We believe remote version has winadj���b���R0); s->dlgret = ssh->user_response; } ssh_set_frozen(ssh, 0); if (s->dlgret == 0) { ssh_disconnect(ssh, "User aborted at host key verification", NULL, 0, TRUE); crStop(0); } } for (i = 0; i < 32; i++) { s->rsabuf[i] = ssh->session_key[i]; if (i < 16) s->rsabuf[i] ^= s->session && !(ssh->remote_bugs & BUG_CHOKES_ON_WINADJ)��� p�,p�d�SUCCESS", SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE); } static void ssh2_msg_channel_failure(Ssh ssh, struct Packet *pktin) { /* * The only time this should get called is for "winadj@putty" * messages sent above. All ot�*��le to keep track, and partly I'm not * convinced the server should be told details like that * about my local network configuration. * The "originator IP address" is syntactically a numeric * IP address, and some servers (e.g., Tectia) get upset * if it doesn't match this syntax. */ ssh2_pkt_addstring(pktout, "0.0.0.0"); ssh2_pkt_adduint32(pktout, 0); ssh2_pkt_send(ssh, pktout); } } static Node-path: putty/windows/winhelp.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 48244a14372b2bc73002926c59550a2b Text-delta-base-sha1: e353661438a45ca3a623f77258c3b2bfb4ceb39e Text-content-length: 74 Text-content-md5: 56717f11ef751748129124b5662c7903 Text-content-sha1: 471caeaa41c2f59d0c60236156f0dd2e928c0fab Content-length: 74 SVN��Q 5�[��ADsh_bugs_winadj "ssh.bugs.winadj:config-ssh-bug-winadj Revision-number: 9593 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 65 Add a missing \define I accidentally assumed was there in r9592. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-07-29T13:38:31.922903Z PROPS-END Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e95f167fd3f2cd6586ab451b988c5307 Text-delta-base-sha1: 818011d68570f588b4135d50995db9b4fbbee014 Text-content-length: 81 Text-content-md5: c2c609c7cbc19ee737b2674acf9ba63c Text-content-sha1: 0ff7f4d94afed816ebd6ff74ef60cb96984ba32e Content-length: 81 SVN��b{@@�;'\define{versionidblurb} \versionid $Id$ \define{dash} \u2013{-} Revision-number: 9594 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9595 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9596 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9597 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9598 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9599 Prop-content-length: 500 Content-length: 500 K 7 svn:log V 401 Reduce the number of round-trips involved in opening an SSH-2 session by sending most of the initial SSH_MSG_CHANNEL_REQUEST messages before waiting for any replies. The initial version of this code was a clever thing with a two-pass loop, but that got hairy so I went for the simpler approach of separating the request and reply code and having flags to keep track of which requests have been sent. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-08-02T22:18:18.116704Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a402fa1a2673ad8b8cde812995eef0e0 Text-delta-base-sha1: 23d139951b8970c3daec5de8190ce413cd4e5128 Text-content-length: 2622 Text-content-md5: 2d864850daba6b65082620aee75069a4 Text-content-sha1: e79ff4815f127d34c089af631b859b03192f2429 Content-length: 2622 SVN������������������n4�z��"sJ�[8�=�aC�am�A]I�e�p�]b�p�p�vmD�F�/�,wrequested_x11; int requested_agent; int requested_ttyEnable port forwardings. */ ssh_setup_portfwd(ssh, ssh->conf); /* * Send the CHANNEL_REQUESTS for the main channel. We send them all * and then start looking for responses, so it's important that the * sending and receiving code below it is kept in sync. */ /* * Potentially enable X11 s->requested_x11 = TRUE; } else s->requested_x11 = FALSE s->requested_agent = TRUE; } else s->requested_agent = FALSE; s->requested_tty = TRUE; } else s->requested_tty = FALSE;s->num_env = 0; if (ssh->mainchan && !ssh->ncmode) { char *key, *val if (s->num_env) logeventf(ssh, "Sent %d environment variables", s->num_env); } /* * All CHANNEL_REQUESTs sent. Now collect up the replies. These * must be in precisely the same order as the requests. */ if (s->requested_x11) {if (s->requested_agent) {if (s->requested_tty) {if (s->num_env) { s->env_ok = 0; s->env_left = s->num_env; while (s->env_left > 0) { crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Unexpected response to environment request:" " packet type %d", pktin->type)); crStopV; } } else { s->env_ok++; } s->env_left--; } if (s->env_ok == s->num_env) { logevent("All environment variables successfully set"); } else if (s->env_ok == 0) { logevent("All environment variables refused"); } else { logeventf(ssh, "%d environment variables refused", s->num_env - s->env_ok); c_write_str(ssh, "Server refused to set all environment variables\r\n");�*]]�*�uct Packet *pktout; logeventf(ssh, "Opening forwarded connection to %s:%d", hostname, port); if (ssh->version == 1) { send_packet(ssh, SSH1_MSG_PORT_OPEN, PKT_INT, c->localid, PKT_STR, hostname, PKT_INT, port, /* PKT_STR, <org:orgport>, */ PKT_END); } else { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring(pktout, "direct-tcpip"); ssh2_pkt_adduint32(pktout, c->localid); ssh2_pkt_adduint32(pktout, c->v.v2.locwindow);/* our window size */ ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */ ssh2_pkt_addstring(pktout, hostname); ssh2_pkt_adduint32(pktout, port); /* * We make up values for the originator data; partly it's * too much hass Revision-number: 9600 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9601 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9602 Prop-content-length: 476 Content-length: 476 K 7 svn:log V 377 Rework bufchain code to allow for variable-sized granules. bufchain_add() now allocates at most one new granule. Granules still have a minimum size, so small adds still get coalesced. The main practical consequence of this is that PSCP and PSFTP now generate 4K SSH packets rather than 512-byte ones. Also, the compiled code (on my Ubuntu box) is fractionally smaller. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-08-11T09:10:31.826764Z PROPS-END Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 488b5f685c94038447556089d1ce5be2 Text-delta-base-sha1: 2223f2c6419db45e394810c5f9ef5165235880d7 Text-content-length: 1162 Text-content-md5: bf06444ceda7733517c2fc7816bb1412 Text-content-sha1: 8f9fb7f8767beddd8f572b5b21c0261a9113dc49 Content-length: 1162 SVN��p(T�/�q�.B�_03�3B�"(K�P MIN_GRANULE 512 struct bufchain_granule { struct bufchain_granule *next; char *bufpos, *bufend, *bufmaxwhile (len > 0) { if (ch->tail && ch->tail->bufend < ch->tail->bufmax) { int copylen = min(len, ch->tail->bufmax - ch->tail->bufend); memcpy(ch->tail->bufend, buf, copylen); buf += copylen; len -= copylen; ch->tail->bufend += copylen; } if (len > 0) { int grainlen = max(sizeof(struct bufchain_granule) + len, BUFFER_MIN_GRANULE); struct bufchain_granule *newbuf; newbuf = smalloc(grainlen); newbuf->bufpos = newbuf->bufend = (char *)newbuf + sizeof(struct bufchain_granule); newbuf->bufmax = (char *)newbuf + grainlen; newbuf->next = NULL; if (ch->tail) ch->tail->next = newbuf; else ch->head = newbuf; ch->tail = newbuf; }end - ch->head->bufpos) { remlen = ch->head->bufend - ch->head->bufpos; tmp = ch->head; ch->head = tmp->next; if (!ch->head) ch->tail = NULL; sfree(tmp)end - ch->head->bufpos; *data =end - tmp->bufpos) remlen = tmp->bufend - tmp->bufpos; memcpy(data_c, Revision-number: 9603 Prop-content-length: 472 Content-length: 472 K 7 svn:log V 371 Use a single sftp_senddata() to send each SFTP packet, rather than using one for the length field and one for the rest of the packet contents. Since sftp_senddata() has no queuing or deferral mechanism but instead constructs and sends an SSH2_MSG_CHANNEL_DATA message immediately, this change has the effect of ceasing to split every SFTP packet across two SSH messages. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-08-12T20:17:13.797503Z PROPS-END Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d31a9b8b81e5aa4a6c18680faf9ec23e Text-delta-base-sha1: fea4ccc93d4af24a5d51b690ee7f19a9e577a22c Text-content-length: 190 Text-content-md5: f5cbf652958892fa71f59b937c609ac4 Text-content-sha1: 41dc2d84c9538bbfb33f8ec05197fa81536d678e Content-length: 190 SVN��!P!�(��-<�[(�_r�K~U�g:uint32(pkt, 0); /* length field will be filled in later */PUT_32BIT(pkt->data, pkt->length - 4); ret = sftp_senddata(pkt->data, pkt->length Revision-number: 9604 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9605 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9606 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9607 Prop-content-length: 244 Content-length: 244 K 8 svn:date V 27 2012-08-18T09:30:01.305856Z K 7 svn:log V 145 Tweak to SSH coroutine code: put line number in the coroutine state structure, which is consistent with Simon's canonical version of the macros. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2d864850daba6b65082620aee75069a4 Text-delta-base-sha1: e79ff4815f127d34c089af631b859b03192f2429 Text-content-length: 771 Text-content-md5: 4cbebe12f6d8188e9a1bc928669e61fd Text-content-sha1: 53100310c06b24474cdeea7bfefbdc6458f3ff17 Content-length: 771 SVN����3>�o�A�H�~��?9� r�iBeginState crBegin(s->crLine) #define crStateP(t, v) \ struct t *s; \ if (!(v)) { s = (v) = snew(struct t); s->crLine = 0; } \ s = (v); #define crState(t) crStateP(t, ssh->t)ssh_gotdata_crstate; int do_ssh1_connectiocrLine; crBeginStatecrLine;State0); s->dlgret = ssh->user_r���A�'�s=�0PcrLine;State c = ssh2_channel_msg(ssh, pktin); if (!c) retu���"g�T5�o�=�Qt�H8Wint crLine;Stateuct Packet *pktout; logeventf(ssh, "Opening forwarded connection to %s:%d", hostname, port); if (ssh->version == 1) { send_packet(ssh, SSH1_MSG_PORT_OPEN, PKT_INT, c->localid, PKT_STR, hostnam�0��0W Revision-number: 9608 Prop-content-length: 262 Content-length: 262 K 8 svn:date V 27 2012-08-19T11:35:26.224984Z K 7 svn:log V 163 Fix an erroneous "case" fallthrough in ssh1_msg_channel_close, which was causing assertion failures when closing X11 channels in SSH-1. Also fix another pasto. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4cbebe12f6d8188e9a1bc928669e61fd Text-delta-base-sha1: 53100310c06b24474cdeea7bfefbdc6458f3ff17 Text-content-length: 316 Text-content-md5: 509a520f46db165cbcc20302d9558fb2 Text-content-sha1: fc4c84990c9f6e6fbc645d180a65e28b76a39d2d Content-length: 316 SVN�����������4�Z�b�S3R�F break; case CHAN_SOCKDATA: if (c->u.pfd.s) pfd break; case CHAN_AGENT: send_close = TRUE; break����e�, pktin); if (!c) retu�0K�0�lid, PKT_STR, hostnam Revision-number: 9609 Prop-content-length: 632 Content-length: 632 K 7 svn:log V 533 Reworking of packet delivery to coroutines in SSH-2. Before, NULL in the dispatch table meant "send to the appropriate one of do_ssh2_transport() and do_ssh2_authconn()". Now those (via small shims) are specified directly in the dispatch table, so ssh2_protocol() is much simpler. In the process, this has somewhat centralised the handling of gross server protocol violations. PuTTY will now disconnect with a rude message when (e.g.) OpenSSH sends us an SSH_MSG_UNIMPLEMENTED when we try to KEXINIT during authentication. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-08-21T22:04:56.756481Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 509a520f46db165cbcc20302d9558fb2 Text-delta-base-sha1: fc4c84990c9f6e6fbc645d180a65e28b76a39d2d Text-content-length: 9165 Text-content-md5: 19fb1a95bbd1258f44dcd09111602bbc Text-content-sha1: c7bccd57e5460e3dcd93bde7aeb3249342c14544 Content-length: 9165 SVN���� 3���5 handler_fn_t q_saved_handler1, q_saved_handler2���=�m��q�Xxg�w'�'IW�'�sB�p>in || inlen > 0); s->dlgret = ssh->user_rssh->q_saved_handler1ssh->q_saved_handler2ssh->q_saved_handler1 = ssh->packet_dispatch[ssh->qhead->msg1]; ssh->packet_dispatch[ssh->qhead->msg1] = ssh_queueing_handler; } if (ssh->qhead->msg2 > 0) { ssh->q_saved_handler2 = ssh->packet_dispatch[ssh->qhead->msg2]ssh->q_saved_handler1 = ssh->packet_dispatch[ssh->qhead->msg1]; ssh->packet_dispatch[qh->msg1] = ssh_queueing_handler; } if (qh->msg2 > 0) { ssh->q_saved_handler2 = ssh->packet_dispatch[ssh->qhead->msg2]if (!ssh->protocol_initial_phase_done) { ssh->protocol_initial_phase_done = TRUE; /* * Allow authconn to initialise itself. */ do_ssh2_authconn(ssh, NULL, 0, NULL); }, pktin); if (!c) return; if (!ssh2_handle_winadj_response(c)) ssh_disconnect(ssh, NULL, "Received unsolicited SSH_MSG_CHANNEL_SUCCESS", SSH2_DISCONNECT_PROTOCOL_���Ck�4>`�eM�X0|�Ap1�w�X0[�Er?�~3ssh2_msg_authconn(Ssh ssh, struct Packet *pktin) { do_ssh2_authconn(ssh, NULL, 0, pktin); } /* Register as a handler for all the messages this coroutine handles. */ ssh->packet_dispatch[SSH2_MSG_SERVICE_ACCEPT] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_USERAUTH_REQUEST] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_USERAUTH_FAILURE] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_USERAUTH_SUCCESS] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_USERAUTH_PK_OK] = ssh2_msg_authconn; /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ] = ssh2_msg_authconnssh2_msg_authconn; duplicate case value */ ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_RESPONSE] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_REQUEST_SUCCESS] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_REQUEST_FAILURE] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = ssh2_msg_authconn; ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_authconn; transport(Ssh ssh, struct Packet *pktin) { do_ssh2_transport(ssh, NULL, 0, pktin); } /* * Called if we receive a packet that isn't allowed by the protocol. * This only applies to packets whose meaning PuTTY understands. * Entirely unknown packets are handled below. */ static void ssh2_msg_unexpected(Ssh ssh, struct Packet *pktin) { char *buf = dupprintf("Server protocol violation: unexpected %s packet", ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx, pktin->type)); ssh_disconnect(ssh, NULL, buf, SSH2_DISCONNECT_PROTOCOL_ERROR, FALSEInitially, we only accept transport messages (and a few generic * ones). do_ssh2_authconn will add more when it starts. * Messages that are understood but not currently acceptable go to * ssh2_msg_unexpected. */ ssh->packet_dispatch[SSH2_MSG_UNIMPLEMENTED] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_SERVICE_REQUEST] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_SERVICE_ACCEPT] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_KEXINIT] = ssh2_msg_transport; ssh->packet_dispatch[SSH2_MSG_NEWKEYS] = ssh2_msg_transport; ssh->packet_dispatch[SSH2_MSG_KEXDH_INIT] = ssh2_msg_transport; ssh->packet_dispatch[SSH2_MSG_KEXDH_REPLY] = ssh2_msg_transport; /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REQUEST] = ssh2_msg_transport; duplicate case value */ /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_GROUP] = ssh2_msg_transport; duplicate case value */ ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_INIT] = ssh2_msg_transport; ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REPLY] = ssh2_msg_transport; ssh->packet_dispatch[SSH2_MSG_USERAUTH_REQUEST] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_USERAUTH_FAILURE] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_USERAUTH_SUCCESS] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_USERAUTH_PK_OK] = ssh2_msg_unexpected; /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ] = ssh2_msg_unexpectedssh2_msg_unexpected; duplicate case value */ ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_RESPONSE] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_REQUEST_SUCCESS] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_REQUEST_FAILURE] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = ssh2_msg_unexpected; ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_unexpected; /* * These messages have a special handler from the start) ssh->packet_dispatch[pktin->type](ssh, pktin); else if (!ssh->protocol_initial_phase_done) do_ssh2_transport(ssh, in, inlen, pktin); else do_ssh2_authconn(ssh, in, inlen, pktin);�KOO�K�name = "ILL"; if (code == TS_SIGINT) signame = "INT"; if (code == TS_SIGKILL) signame = "KILL"; if (code == TS_SIGPIPE) signame = "PIPE"; if (code == TS_SIGQUIT) signame = "QUIT"; if (code == TS_SIGSEGV) signame = "SEGV"; if (code == TS_SIGTERM) signame = "TERM"; if (code == TS_SIGUSR1) signame = "USR1"; if (code == TS_SIGUSR2) signame = "USR2"; /* The SSH-2 protocol does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */ if (ssh->version == 2 && ssh->mainchan) { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(pktout, "signal"); ssh2_pkt_addbool(pktout, 0); ssh2_pkt_addstring(pktout, signame); ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Sent signal SIG%s", signame); } } else { /* Never heard of it. Do nothing */ } } } void *new_sock_channel(void *handle, Socket s) { Ssh ssh = (Ssh) handle; struct ssh_channel *c; c = snew(struct ssh_channel); c->ssh = ssh; ssh2_channel_init(c); c->halfopen = TRUE; c->type = CHAN_SOCKDATA_DORMANT;/* identify channel type */ c->u.pfd.s = s; add234(ssh->channels, c); return c; } /* * This is called when stdout/stderr (the entity to which * from_backend sends data) manages to clear some backlog. */ static void ssh_unthrottle(void *handle, int bufsize) { Ssh ssh = (Ssh) handle; int buflimit; if (ssh->version == 1) { if (ssh->v1_stdout_throttling && bufsize < SSH1_BUFFER_LIMIT) { ssh->v1_stdout_throttling = 0; ssh_throttle_conn(ssh, -1); } } else { if (ssh->mainchan) { ssh2_set_window(ssh->mainchan, bufsize < ssh->mainchan->v.v2.locmaxwin ? ssh->mainchan->v.v2.locmaxwin - bufsize : 0); if (conf_get_int(ssh->conf, CONF_ssh_simple)) buflimit = 0; else buflimit = ssh->mainchan->v.v2.locmaxwin; if (ssh->mainchan->throttling_conn && bufsize <= buflimit) { ssh->mainchan->throttling_conn = 0; ssh_throttle_conn(ssh, -1); } } } /* * Now process any SSH connection data that was stashed in our * queue while we were frozen. */ ssh_process_queued_incoming_data(ssh); } void ssh_send_port_open(void *channel, char *hostname, int port, char *org) { struct ssh_channel *c = (struct ssh_channel *)channel; Ssh ssh = c->ssh; struct Packet *pktout; logeventf(ssh, "Opening forwarded connection to %s:%d", hostname, port); if (ssh->version == 1) { send_packet(ssh, SSH1_MSG_PORT_OPEN, PKT_INT, c->loca Revision-number: 9610 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2012-08-21T22:33:31.956819Z K 7 svn:log V 213 De-duplicate code in KEXINIT generation. There's no need to have identical code generating server-to-client and client-to-server versions of the cipher and MAC lists; a couple of twice-around loops will do fine. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 19fb1a95bbd1258f44dcd09111602bbc Text-delta-base-sha1: c7bccd57e5460e3dcd93bde7aeb3249342c14544 Text-content-length: 1886 Text-content-md5: d6f817326c646b8e17a5163a2ed6e98d Text-content-sha1: 3049565a79f2606748f0f6689f21385016442327 Content-length: 1886 SVN����������� 6�G��0EB�;�T�kencryption algorithms (client->server then server->client). */ for (k = 0; k < 2; k++) { ssh2_pkt_addstring_start(s->pktout); commalist_started = 0; for (i = 0; i < s->n_preferred_ciphers; i++) { const struct ssh2_ciphers *c = s->preferred_ciphers[i]; if (!c) continue; /* warning flag */ for (j = 0; j < c->nciphers; j++) { if (commalist_started) ssh2_pkt_addstring_str(s->pktout, ","); ssh2_pkt_addstring_str(s->pktout, c->list[j]->name); commalist_started = 1; } } } /* List MAC algorithms (client->server then server->client). */ for (j = 0; j < 2; j++) { ssh2_pkt_addstring_start(s->pktout); for (i = 0; i < s->nmacs; i++) { ssh2_pkt_addstring_str(s->pktout, s->maclist[i]->name); if (i < s->nmacs - 1) ssh2_pkt_addstring_str(s->pktout, ","); }ERROR, FALSE); } static void ssh2_msg_channel_failure(Ssh ssh, struct Packet *pktin) { /* * The only time this should get called is for "winadj@putty" * messages sent above. All other channel requests are either * sent with want_reply false or are sent before this handler gets * installedFAILURE", SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE��� G�9GGname = "ILL"; if (code == TS_SIGINT) signame = "INT"; if (code == TS_SIGKILL) signame = "KILL"; if (code == TS_SIGPIPE) signame = "PIPE"; if (code == TS_SIGQUIT) signame = "QUIT"; if (code == TS_SIGSEGV) signame = "SEGV"; if (code == TS_SIGTERM) signame = "TERM"; if (code == TS_SIGUSR1) signame = "USR1"; if (code == TS_SIGUSR2) signame = "USR2"; /* The SSH-2 protocol does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */ if (ssh->version == 2 && ssh->mainchan) { �S��SG Revision-number: 9611 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2012-08-21T23:04:22.986265Z K 7 svn:log V 62 Fix recently-introduced memory leak in ssh2_msg_unexpected(). K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d6f817326c646b8e17a5163a2ed6e98d Text-delta-base-sha1: 3049565a79f2606748f0f6689f21385016442327 Text-content-length: 101 Text-content-md5: a94295630cc7bd9a8577b277a817e57d Text-content-sha1: f6cee84b14039abf5a349fecf502fc83099d47f0 Content-length: 101 SVN������������������ �s���p sfree(buf�Sc�S�->mainchan) { Revision-number: 9612 Prop-content-length: 285 Content-length: 285 K 8 svn:date V 27 2012-08-22T18:25:28.819832Z K 7 svn:log V 184 Enhance logparse.pl so that it detects channels running SFTP and decodes the SFTP message layer in addition to the underlying SSH. Requests and responses are matched up via their ids. K 10 svn:author V 5 simon PROPS-END Node-path: putty/contrib/logparse.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b132ea0c4e44db000b61325de9a891fc Text-delta-base-sha1: f14552cac95a50c14ecee5889d8996e099f3736a Text-content-length: 13151 Text-content-md5: 30e8a1367014c8771bd5b926b8cd7003 Text-content-sha1: e100dfc0f4b142f0f295aea59aa69b6b98641f5f Content-length: 13151 SVN��gfD ���r�F9C�0o�N �F9C�FO�8QA�y�i~8my @realdata = splice @$data, 0 if (@realdata == $bytes and defined $chan->{$direction."data"}) { my $rawdata = pack "C*", @realdata; $chan->{$direction."data"}->($chan, $index, $direction, $rawdata)my @realdata = splice @$data, 0 if (@realdata == $bytes and defined $chan->{$direction."data"}) { my $rawdata = pack "C*", @realdata; $chan->{$direction."data"}->($chan, $index, $direction, $rawdata) if ($subsys eq "sftp") { &sftp_setup($index); }%sftp_packets = ( #define SSH_FXP_INIT 1 /* 0x1 */ 0x1 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($ver) = &parse("u", $data); printf "SSH_FXP_INIT %d\n", $ver; }, #define SSH_FXP_VERSION 2 /* 0x2 */ 0x2 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($ver) = &parse("u", $data); printf "SSH_FXP_VERSION %d\n", $ver; }, #define SSH_FXP_OPEN 3 /* 0x3 */ 0x3 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $path, $pflags) = &parse("usu", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_OPEN"); printf " \"%s\" ", $path; if ($pflags eq 0) { print "0"; } else { my $sep = ""; if ($pflags & 1) { $pflags ^= 1; print "${sep}READ"; $sep = "|"; } if ($pflags & 2) { $pflags ^= 2; print "${sep}WRITE"; $sep = "|"; } if ($pflags & 4) { $pflags ^= 4; print "${sep}APPEND"; $sep = "|"; } if ($pflags & 8) { $pflags ^= 8; print "${sep}CREAT"; $sep = "|"; } if ($pflags & 16) { $pflags ^= 16; print "${sep}TRUNC"; $sep = "|"; } if ($pflags & 32) { $pflags ^= 32; print "${sep}EXCL"; $sep = "|"; } if ($pflags) { print "${sep}${pflags}"; } } print "\n"; }, #define SSH_FXP_CLOSE 4 /* 0x4 */ 0x4 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $handle) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_CLOSE"); printf " \"%s\"", &stringescape($handle); print "\n"; }, #define SSH_FXP_READ 5 /* 0x5 */ 0x5 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $handle, $offset, $len) = &parse("usUu", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_READ"); printf " \"%s\" %d %d", &stringescape($handle), $offset, $len; print "\n"; }, #define SSH_FXP_WRITE 6 /* 0x6 */ 0x6 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $handle, $offset, $wdata) = &parse("usUs", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_WRITE"); printf " \"%s\" %d [%d bytes]", &stringescape($handle), $offset, length $wdata; print "\n"; }, #define SSH_FXP_LSTAT 7 /* 0x7 */ 0x7 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $path) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_LSTAT"); printf " \"%s\"", $path; print "\n"; }, #define SSH_FXP_FSTAT 8 /* 0x8 */ 0x8 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $handle) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_FSTAT"); printf " \"%s\"", &stringescape($handle); print "\n"; }, #define SSH_FXP_SETSTAT 9 /* 0x9 */ 0x9 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $path) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_SETSTAT"); my $attrs = &sftp_parse_attrs($data); printf " \"%s\" %s", $path, $attrs; print "\n"; }, #define SSH_FXP_FSETSTAT 10 /* 0xa */ 0xa => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $handle) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_FSETSTAT"); my $attrs = &sftp_parse_attrs($data); printf " \"%s\" %s", &stringescape($handle), $attrs; print "\n"; }, #define SSH_FXP_OPENDIR 11 /* 0xb */ 0xb => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $path) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_OPENDIR"); printf " \"%s\"", $path; print "\n"; }, #define SSH_FXP_READDIR 12 /* 0xc */ 0xc => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $handle) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_READDIR"); printf " \"%s\"", &stringescape($handle); print "\n"; }, #define SSH_FXP_REMOVE 13 /* 0xd */ 0xd => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $path) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_REMOVE"); printf " \"%s\"", $path; print "\n"; }, #define SSH_FXP_MKDIR 14 /* 0xe */ 0xe => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $path) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_MKDIR"); printf " \"%s\"", $path; print "\n"; }, #define SSH_FXP_RMDIR 15 /* 0xf */ 0xf => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $path) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_RMDIR"); printf " \"%s\"", $path; print "\n"; }, #define SSH_FXP_REALPATH 16 /* 0x10 */ 0x10 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $path) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_REALPATH"); printf " \"%s\"", $path; print "\n"; }, #define SSH_FXP_STAT 17 /* 0x11 */ 0x11 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $path) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_STAT"); printf " \"%s\"", $path; print "\n"; }, #define SSH_FXP_RENAME 18 /* 0x12 */ 0x12 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $srcpath, $dstpath) = &parse("uss", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_RENAME"); printf " \"%s\" \"%s\"", $srcpath, $dstpath; print "\n"; }, #define SSH_FXP_STATUS 101 /* 0x65 */ 0x65 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $status) = &parse("uu", $data); &sftp_logreply($chan, $direction, $reqid, $id, "SSH_FXP_STATUS"); print " "; if ($status eq "0") { print "SSH_FX_OK"; } elsif ($status eq "1") { print "SSH_FX_EOF"; } elsif ($status eq "2") { print "SSH_FX_NO_SUCH_FILE"; } elsif ($status eq "3") { print "SSH_FX_PERMISSION_DENIED"; } elsif ($status eq "4") { print "SSH_FX_FAILURE"; } elsif ($status eq "5") { print "SSH_FX_BAD_MESSAGE"; } elsif ($status eq "6") { print "SSH_FX_NO_CONNECTION"; } elsif ($status eq "7") { print "SSH_FX_CONNECTION_LOST"; } elsif ($status eq "8") { print "SSH_FX_OP_UNSUPPORTED"; } else { printf "[unknown status %d]", $status; } print "\n"; }, #define SSH_FXP_HANDLE 102 /* 0x66 */ 0x66 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $handle) = &parse("us", $data); &sftp_logreply($chan, $direction, $reqid, $id, "SSH_FXP_HANDLE"); printf " \"%s\"", &stringescape($handle); print "\n"; }, #define SSH_FXP_DATA 103 /* 0x67 */ 0x67 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $retdata) = &parse("us", $data); &sftp_logreply($chan, $direction, $reqid, $id, "SSH_FXP_DATA"); printf " [%d bytes]", length $retdata; print "\n"; }, #define SSH_FXP_NAME 104 /* 0x68 */ 0x68 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $count) = &parse("uu", $data); &sftp_logreply($chan, $direction, $reqid, $id, "SSH_FXP_NAME"); for my $i (1..$count) { my ($name, $longname) = &parse("ss", $data); my $attrs = &sftp_parse_attrs($data); print " [name=\"$name\", longname=\"$longname\", attrs=$attrs]"; } print "\n"; }, #define SSH_FXP_ATTRS 105 /* 0x69 */ 0x69 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid) = &parse("u", $data); &sftp_logreply($chan, $direction, $reqid, $id, "SSH_FXP_ATTRS"); my $attrs = &sftp_parse_attrs($data); printf " %s", $attrs; print "\n"; }, #define SSH_FXP_EXTENDED 200 /* 0xc8 */ 0xc8 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid, $type) = &parse("us", $data); &sftp_logreq($chan, $direction, $reqid, $id, "SSH_FXP_EXTENDED"); printf " \"%s\"", $type; print "\n"; }, #define SSH_FXP_EXTENDED_REPLY 201 /* 0xc9 */ 0xc9 => sub { my ($chan, $index, $direction, $id, $data) = @_; my ($reqid) = &parse("u", $data); print "\n"; &sftp_logreply($chan, $direction, $reqid,$id,"SSH_FXP_EXTENDED_REPLY")8 sub sftp_setup { my $index = shift @_; my $chan = $channels[$index]; $chan->{'obuf'} = $chan->{'ibuf'} = ''; $chan->{'ocnt'} = $chan->{'icnt'} = 0; $chan->{'odata'} = $chan->{'idata'} = \&sftp_data; $chan->{'sftpreqs'} = {}; } sub sftp_data { my ($chan, $index, $direction, $data) = @_; my $buf = \$chan->{$direction."buf"}; my $cnt = \$chan->{$direction."cnt"}; $$buf .= $data; while (length $$buf >= 4) { my $msglen = unpack "N", $$buf; last if length $$buf < 4 + $msglen; my $msg = substr $$buf, 4, $msglen; $$buf = substr $$buf, 4 + $msglen; $msg = [unpack "C*", $msg]; my $type = shift @$msg; my $id = sprintf "ch%d_sftp_%s%d", $index, $direction, ${$cnt}++; print "$id: "; if (defined $sftp_packets{$type}) { $sftp_packets{$type}->($chan, $index, $direction, $id, $msg); } else { printf "unknown SFTP packet type %d\n", $type; } } } sub sftp_logreq { my ($chan, $direction, $reqid, $id, $name) = @_; print "$name"; if ($direction eq "o") { # requests coming _in_ are too weird to track $chan->{'sftpreqs'}->{$reqid} = $id; } } sub sftp_logreply { my ($chan, $direction, $reqid, $id, $name) = @_; print "$name"; if ($direction eq "i") { # replies going _out_ are too weird to track if (defined $chan->{'sftpreqs'}->{$reqid}) { print " to ", $chan->{'sftpreqs'}->{$reqid}; $chan->{'sftpreqs'}->{$reqid} = undef; } } } sub sftp_parse_attrs { my ($data) = @_; my ($flags) = &parse("u", $data); return $flags if $flags eq "<missing>"; my $out = "{"; my $sep = ""; if ($flags & 0x00000001) { # SSH_FILEXFER_ATTR_SIZE $out .= $sep . sprintf "size=%d", &parse("U", $data); $sep = ", "; } if ($flags & 0x00000002) { # SSH_FILEXFER_ATTR_UIDGID $out .= $sep . sprintf "uid=%d", &parse("u", $data); $out .= $sep . sprintf "gid=%d", &parse("u", $data); $sep = ", "; } if ($flags & 0x00000004) { # SSH_FILEXFER_ATTR_PERMISSIONS $out .= $sep . sprintf "perms=%#o", &parse("u", $data); $sep = ", "; } if ($flags & 0x00000008) { # SSH_FILEXFER_ATTR_ACMODTIME $out .= $sep . sprintf "atime=%d", &parse("u", $data); $out .= $sep . sprintf "mtime=%d", &parse("u", $data); $sep = ", "; } if ($flags & 0x80000000) { # SSH_FILEXFER_ATTR_EXTENDED my $extcount = &parse("u", $data); while ($extcount-- > 0) { $out .= $sep . sprintf "\"%s\"=\"%s\"", &parse("ss", $data); $sep = ", "; } } $out .= "}"; return $out; } sub stringescape { my ($str) = @_; $str =~ s!\\!\\\\!g; $str =~ s![^ -~]!sprintf "\\x%02X", ord $&!eg; return $str; } Revision-number: 9613 Prop-content-length: 282 Content-length: 282 K 8 svn:date V 27 2012-08-22T18:36:44.647035Z K 7 svn:log V 181 Fix a bug in the PSFTP command parser which would cause it to hallucinate an extra empty argument word at the end of a line if the line ended in more than one whitespace character. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f5340fd7436eea88c31c23a0efe6d737 Text-delta-base-sha1: 9010b03d4ef4edeb261308a326e2f5ee23b712a0 Text-content-length: 188 Text-content-md5: 0a335e83e13e415a00546035a513668b Text-content-sha1: 7202c95c01c6a9ab3089abdcfe9f1d4aa7b7411a Content-length: 188 SVN��a-���}d1) { /* skip whitespace */ while (*p && (*p == ' ' || *p == '\t')) p++; /* terminate loop */ if (!*p) break Revision-number: 9614 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9615 Prop-content-length: 544 Content-length: 544 K 8 svn:date V 27 2012-08-25T11:12:14.338519Z K 7 svn:log V 445 Generalise SSH_MSG_CHANNEL_{SUCCESS,FAILURE} handling. Now each channel has a queue of arbitrary handlers for those messages, with anything that sends a CHANNEL_REQUEST with want_reply true pushing a new entry onto the queue, and a shared handler that dispatches responses appropriately. Currently, this is only used for winadj@putty.projects.tartarus.org, but extending it to cover the initial requests as well shouldn't be too painful. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a94295630cc7bd9a8577b277a817e57d Text-delta-base-sha1: f6cee84b14039abf5a349fecf502fc83099d47f0 Text-content-length: 3685 Text-content-md5: 85eba14b5ad2d048dd342cb3d85a2d19 Text-content-sha1: e9f2e6b08ffcc40b93a002288200cce24508300f Content-length: 3685 SVN����*I�J��&'�QEz�Uw�r4�O-typedef void (*cchandler_fn_t)(struct ssh_channel *, struct Packet *, void *); /* * Each channel has a queue of outstanding CHANNEL_REQUESTS and their * handlers. */ struct outstanding_channel_request { cchandler_fn_t handler; void *ctx; struct outstanding_channel_request *next;channel requests that haven't * been acked. */ struct outstanding_channel_request *chanreq_head, *chanreqstatic void ssh2_msg_unexpected(Ssh ssh,���:8�^6n�%�@�`�.y�6U�u(�rs ssh_dialog_callback, ssh); sfree(keystr); if (s->dlgret < 0) { do { crReturn(0); if (pktin) { " for user host key response")); crStop(0); } } while (pktchanreq_head = NULL; c->v.v2.throttle_state = UNTHROTTLED; bufchain_init(&c->v.v2.outbuffer); } /* * CHANNEL_FAILURE doesn't come with any indication of what message * caused it, so we have to keep track of the outstanding * CHANNEL_REQUESTs ourselves. */ static void ssh2_queue_chanreq_handler(struct ssh_channel *c, cchandler_fn_t handler, void *ctx) { struct outstanding_channel_request *ocr = snew(struct outstanding_channel_request); ocr->handler = handler; ocr->ctx = ctx; ocr->next = NULL; if (!c->v.v2.chanreq_head) c->v.v2.chanreq_head = ocr; else c->v.v2.chanreq_tail->next = ocr; c->v.v2.chanreq_tail = ocr; } /* * Potentially enlarge the window on an SSH-2 channel. */ static void ssh2_handle_winadj_response(struct ssh_channel *, struct Packet *, void *);unsigned *up/ if (newwin == c->v.v2.locmaxwinup = snew(unsigned); *up = newwin - c->v.v2.locwindow; ssh2_queue_chanreq_handler(c, ssh2_handle_winadj_response, up)void ssh2_handle_winadj_response(struct ssh_channel *c, struct Packet *pktin, void *ctx) { unsigned *sizep = ctx; /* * Winadj responses should always be failures. However, at least * one server ("boks_sshd") is known to return SUCCESS for channel * requests it's never heard of, such as "winadj@putty". Raised * with foxt.com as bug 090916-090424, but for the sake of a quiet * life, we don't worry about what kind of response we got. */ c->v.v2.remlocwin += *sizep; sfree(sizep} static void ssh2_msg_channel_response(Ssh ssh, struct Packet *pktin) { struct ssh_channel *c = ssh2_channel_msg(ssh, pktin); struct outstanding_channel_request *ocr; if (!c) return; ocr = c->v.v2.chanreq_head; if (!ocr) { ssh2_msg_unexpected(ssh, pktin); return; } ocr->handler(c, pktin, ocr->ctx); c->v.v2.chanreq_head = ocr->next; sfree(ocr); /* * We may now initiate channel-closing procedures, if that * CHANNEL_REQUEST was the last thing outstanding before we send * CHANNEL_CLOSE. */ ssh2_channel_check_close(c); } static void ssh2_msg_channel_window_adjust(Ssh ssh, struct Packet *pktin) { struct ssh_channel *c; c = ssh2_channel_msg(ssh, pktin); if (!c) return; if (!(c->closes & CLOSES_SENT_EOF)) { c->v.v2.remwindow += ssh_pkt_getuint32(pktin); ssh2_try_send_and_unthrottle(ssh, c); ���L�")�oQ7� t�:chanreqresponse handler. */ ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = ssh2_msg_channel_response; ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_channel_responssignal"); ssh2_pkt_addbool(pktout, 0); ssh2_pkt_addstring(pktout, signame); ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Sent signal SI�c>��>% Revision-number: 9616 Prop-content-length: 469 Content-length: 469 K 8 svn:date V 27 2012-08-25T13:39:32.089621Z K 7 svn:log V 370 Handle all replies to CHANNEL_REQUESTs through the per-channel queue. Each of the minor start-of-session requests is now dealt with by its own little co-routine, while the shell/command is done in do_ssh2_authconn() itself. This eliminates one more round-trip in session setup: PuTTY gets all the way up to sending a shell request before worrying about any replies. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 85eba14b5ad2d048dd342cb3d85a2d19 Text-delta-base-sha1: e9f2e6b08ffcc40b93a002288200cce24508300f Text-content-length: 5525 Text-content-md5: 1bc689d84681da1f2ba7955827ee8d8a Text-content-sha1: 62c599dc55fb35a285b180fb0d2c61c7f2d134a4 Content-length: 5525 SVN������������������CH�~�L�F6�FP�v$�"{H�q7�o�Fu�"{�]8�},/�w�Fy�"{�qd<�3u� �n�xu�CZ�9yp� �w�wV�!2�MM�bG�;{static void ssh2_msg_authconn(Ssh ssh, struct Packet *pktin); static void ssh2_maybe_setup_x11(struct ssh_channel *c, struct Packet *pktin, void *ctx) { struct ssh2_maybe_setup_x11_state { int crLine; }; Ssh ssh = c->ssh; struct Packet *pktout; crStateP(ssh2_maybe_setup_x11_state, ctx); crBeginState;pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(pktout, "x11-req"); ssh2_pkt_addbool(pktout, 1); /* want reply */ ssh2_pkt_addbool(pktout, 0); /* many connections */ ssh2_pkt_addstring(pktout, PKTLOG_BLANK); ssh2_pkt_addstring(pktout, ssh->x11disp->remoteauthdatastring); end_log_omission(ssh, pktout); ssh2_pkt_adduint32(pktout, ssh->x11disp->screennum); ssh2_pkt_send(ssh, pktout); ssh2_queue_chanreq_handler(ssh->mainchan, ssh2_maybe_setup_x11, sX11 forwarding request:" " packet type %d", pktin->type)); sfree(s sfree(s); crFinishV; } static void ssh2_maybe_setup_agent(struct ssh_channel *c, struct Packet *pktin, void *ctx) { struct ssh2_maybe_setup_agent_state { int crLine; }; Ssh ssh = c->ssh; struct Packet *pktout; crStateP(ssh2_maybe_setup_agent_state, ctx); crBeginState; pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(pktout, "auth-agent-req@openssh.com"); ssh2_pkt_addbool(pktout, 1); /* want reply */ ssh2_pkt_send(ssh, pktout); ssh2_queue_chanreq_handler(ssh->mainchan, ssh2_maybe_setup_agent, sagent sfree(s); crFinishV; } static void ssh2_maybe_setup_pty(struct ssh_channel *c, struct Packet *pktin, void *ctx) { struct ssh2_maybe_setup_pty_state { int crLine; }; Ssh ssh = c->ssh; struct Packet *pktout; crStateP(ssh2_maybe_setup_pty_state, ctx); crBeginState; pktout, ssh->mainchan->remoteid); /* recipient channel */ ssh2_pkt_addstring(pktout, "pty-req"); ssh2_pkt_addbool(pktout, 1); /* want reply */ ssh2_pkt_addstring(pktout, conf_get_str(ssh->conf, CONF_termtype)); ssh2_pkt_adduint32(pktout, ssh->term_width); ssh2_pkt_adduint32(pktout, ssh->term_height); ssh2_pkt_adduint32(pktout, 0); /* pixel width */ ssh2_pkt_adduint32(pktout, 0); /* pixel height */ ssh2_pkt_addstring_start(pktout); parse_ttymodes(ssh, ssh2_send_ttymode, (void *)pktout); ssh2_pkt_addbyte(pktout, SSH2_TTY_OP_ISPEED); ssh2_pkt_adduint32(pktout, ssh->ispeed); ssh2_pkt_addbyte(pktout, SSH2_TTY_OP_OSPEED); ssh2_pkt_adduint32(pktout, ssh->ospeed); ssh2_pkt_addstring_data(pktout, "\0", 1); /* TTY_OP_END */ ssh2_pkt_send(ssh, pktout); ssh->state = SSH_STATE_INTERMED; ssh2_queue_chanreq_handler(ssh->mainchan, ssh2_maybe_setup_pty, s sfree(s); crFinishV; } static void ssh2_setup_env(struct ssh_channel *c, struct Packet *pktin, void *ctx) { struct ssh2_setup_env_state { int crLine; int num_env, env_left, env_ok; }; Ssh ssh = c->ssh; struct Packet *pktout; crStateP(ssh2_setup_env_state, ctx); crBeginStateenv"); ssh2_pkt_addbool(pktout, 1); /* want reply */ ssh2_pkt_addstring(pktout, key); ssh2_pkt_addstring(pktout, val); ssh2_pkt_send(ssh, pktout); ssh2_queue_chanreq_handler(ssh->mainchan, ssh2_setup_env, s sfree(s); crFinishVssh2_response_authconn(struct ssh_channel *c, struct Packet *pktin, void *ctx) { do_ssh2_authconn(c->Each one is * handled by its own little asynchronous co-routine. */ /* * Potentially enable X11 forwarding. */ ssh2_maybe_setup_x11(ssh->mainchan, NULL, NULL); /* * Potentially enable agent forwarding. */ ssh2_maybe_setup_agent(ssh->mainchan, NULL, NULL); /* * Now allocate a pty for the session. */ ssh2_maybe_setup_pty(ssh->mainchan, NULL, NULL); /* * Send environment variables. */ ssh2_setup_env(ssh->mainchan, NULL, NULL); ssh2_queue_chanreq_handler(ssh->mainchan, ssh2_response_authconn, NULL�>JJ�>� ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(pktout, "break"); ssh2_pkt_addbool(pktout, 0); ssh2_pkt_adduint32(pktout, 0); /* default break length */ ssh2_pkt_send(ssh, pktout); } } else { /* Is is a POSIX signal? */ char *signame = NULL; if (code == TS_SIGABRT) signame = "ABRT"; if (code == TS_SIGALRM) signame = "ALRM"; if (code == TS_SIGFPE) signame = "FPE"; if (code == TS_SIGHUP) signame = "HUP"; if (code == TS_SIGILL) signame = "ILL"; if (code == TS_SIGINT) signame = "INT"; if (code == TS_SIGKILL) signame = "KILL"; if (code == TS_SIGPIPE) signame = "PIPE"; if (code == TS_SIGQUIT) signame = "QUIT"; if (code == TS_SIGSEGV) signame = "SEGV"; if (code == TS_SIGTERM) signame = "TERM"; if (code == TS_SIGUSR1) signame = "USR1"; if (code == TS_SIGUSR2) signame = "USR2"; /* The SSH-2 protocol does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */ if (ssh->version == 2 && ssh->mainchan) { pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(pktout, "signal"); ssh2_pkt_addbool(pktout, 0); ssh2_pkt_addstring(pktout, signame); ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Sent signal SI Revision-number: 9617 Prop-content-length: 316 Content-length: 316 K 8 svn:date V 27 2012-08-25T13:54:56.945613Z K 7 svn:log V 217 Fix matching of channel and global requests with replies in logparse.pl. In each case, want_reply was being treated as true even when it wasnt, because it got decoded into "yes"/"no", both of which are true in Perl. K 10 svn:author V 3 ben PROPS-END Node-path: putty/contrib/logparse.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30e8a1367014c8771bd5b926b8cd7003 Text-delta-base-sha1: e100dfc0f4b142f0f295aea59aa69b6b98641f5f Text-content-length: 67 Text-content-md5: 7fcf330c3c9696ba9a386ac263306ef1 Text-content-sha1: 3493591257fb9ae15ba39e41ac4ae546f6d0cc6a Content-length: 67 SVN��f}%�!��F!�qu eq "yes" if $wantreply eq "yes" Revision-number: 9618 Prop-content-length: 147 Content-length: 147 K 7 svn:log V 49 Add some kind of window tracking to logparse.pl. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-08-25T14:34:20.753941Z PROPS-END Node-path: putty/contrib/logparse.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fcf330c3c9696ba9a386ac263306ef1 Text-delta-base-sha1: 3493591257fb9ae15ba39e41ac4ae546f6d0cc6a Text-content-length: 917 Text-content-md5: 238a107bf56e7e441c184762ec50f241 Text-content-sha1: 6d88a8bb556f1655ae36c25e3f238c7462005b65 Content-length: 917 SVN��}u<K�Z�k�[G�Y{�,�Np9�Xm�M[Q�<�8E, 'i'=>{'win'=>0, 'seq'=>0}, 'o'=>{'win'=>0, 'seq'=>0}}; $chan->{$direction}{'win'} = $winsize (--%d)", $index, $chan->{'id'}, $type, $chan->{$direction}{'win'} $chan->{$direction}{'win'} = $winsize; printf "ch%d (%s) (--%d)\n", $index, $chan->{'id'}, $chan->{$direction}{'win $chan->{$direction}{'win'} += $bytes; printf "ch%d (%s) +%d (--%d)\n", $index, $chan->{'id'}, $bytes, $chan->{$direction}{'win'} $chan->{$direction}{'seq'} += $bytes; printf "ch%d (%s), %s bytes (%d--%d)\n", $index, $chan->{'id'}, $bytes, $chan->{$direction}{'seq'}-$bytes, $chan->{$direction}{'seq'} my $dir = $direction eq "i" ? 'sc' : 'cs'; $chan->{$dir}{'seq'} += $bytes; printf "ch%d (%s), %s bytes (%d--%d)\n", $index, $chan->{'id'}, $bytes, $chan->{$dir}{$seq}-$bytes, $chan->{$dir}{$seq} Revision-number: 9619 Prop-content-length: 357 Content-length: 357 K 7 svn:log V 258 Simplify handling of responses to channel requests. The various setup routines can only receive CHANNEL_REQUEST or CHANNEL_FAILURE, so there's no need for the to worry about receiving anything else. Strange packets will end up in do_ssh2_authconn instead. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-08-25T15:04:29.413641Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1bc689d84681da1f2ba7955827ee8d8a Text-delta-base-sha1: 62c599dc55fb35a285b180fb0d2c61c7f2d134a4 Text-content-length: 1333 Text-content-md5: fbb1bef996b8ff187ef8b35544cf311e Text-content-sha1: 37599cae0e83f754739cbea08f6557dcb8bd63cf Content-length: 1333 SVN������������������2G�V��D)�;� yi��@�mI== SSH2_MSG_CHANNEL_SUCCESS) { logevent("X11 forwarding enabled"); ssh->X11_fwd_enabled = TRUE; } else logevent("X11 forwarding refused");== SSH2_MSG_CHANNEL_SUCCESS) { logevent("Agent forwarding enabled"); ssh->agentfwd_enabled = TRUE; } else logevent("Agent forwarding refused");== SSH2_MSG_CHANNEL_SUCCESS) else { c_write_str(ssh, "Server refused to allocate pty\r\n"); ssh->editing = ssh->echoing = 1 if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) s->env_ok++; ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid); ssh2_pkt_addstring(pktout, "break"); ssh2_pkt_addbool(pktout, 0); ssh2_pkt_adduint32(pktout, 0); /* default break length */ ssh2_pkt_send(ssh, pktout); } } else { /* Is is a POSIX signal? */ char *signame = NULL; if (code == TS_SIGABRT) signame = "ABRT"; if (code == TS_SIGALRM) signame = "ALRM"; if (code == TS_SIGFPE) signame = "FPE"; if (code == TS_SIGHUP) signame = "HUP"; if (code == TS_SIGILL) signame = "ILL"; if (code == TS_SIGINT) signame = "INT"; if (code == TS_SIGKILL) signame = "KILL"; if (code == TS_SIGPIPE) signame = "PIPE"; if (code == TS_SIGQUIT) signame = "QUIT"; if (code == TS_SIGSEGV) signame =�?��?I Revision-number: 9620 Prop-content-length: 300 Content-length: 300 K 7 svn:log V 201 Factor out common code to construct CHANNEL_REQUESTS. This reduces code size a little and also makes it harder to accidentally request a reply without putting in place a handler for it or vice versa. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-08-25T15:57:05.505953Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fbb1bef996b8ff187ef8b35544cf311e Text-delta-base-sha1: 37599cae0e83f754739cbea08f6557dcb8bd63cf Text-content-length: 3388 Text-content-md5: eaa0358993fc195bb6f8a1a04cc55674 Text-content-sha1: 19563b5310fe7b67e6d38455181b444c706ced73 Content-length: 3388 SVN�����������F�U�s�FJS�Construct the common parts of a CHANNEL_REQUEST. If handler is not * NULL then a reply will be requested and the handler will be called * when it arrives. The returned packet is ready to have any * request-specific data added and be sent. Note that if a handler is * provided, it's essential that the request actually be sent. */ static struct Packet *ssh2_chanreq_init(struct ssh_channel *c, char *type, cchandler_fn_t handler, void *ctx) { struct Packet *pktout; pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_addstring(pktout, type); ssh2_pkt_addbool(pktout, handler != NULL); if (handler != NULL) ssh2_queue_chanreq_handler(c, handler, ctx); return pktoutup = snew(unsigned); *up = newwin - c->v.v2.locwindow; pktout = ssh2_chanreq_init(c, "winadj@putty.projects.tartarus.org", ssh2_handle_winadj_response, up); ssh2_pkt_send(ssh, pktout); ���o8�_ky���G�U�,/w�X?�.`G�!]�S/��nq� "b�8D�8|�5Z�J6j); return; } ocr->handler(c, pktin, ocr->ctx); c->v.v2.chanreq_head = ocr->next; sfree(ocr); /* * We may now initiate channel-closing procedures, if that * CHANNEL_REQUEST was the last thing outstanding before we send * CHANNEL_CLOSE. */ ssh2_channel_check_close(c); } static void ssh2_msg_channel_window_adjust(Ssh ssh, struct Packet *pktin) {!(c->closes & CLOSES_SENT_EOF)) { c->v.v2.remwindow += ssh_pkt_getuint32(pktin); ssh2_try_send_and_unthrottle(ssh, c); chanreq_init(ssh->mainchan, "x11-req", ssh2_maybe_setup_x11, s);chanreq_init(ssh->mainchan, "auth-agent-req@openssh.com", ssh2_maybe_setup_agent, s); ssh2_pkt_send(ssh, pktoutchanreq_init(ssh->mainchan, "pty-req", ssh2_maybe_setup_pty, s);chanreq_init(ssh->mainchan, "env", ssh2_setup_env, s);chanreq_init(ssh->mainchan, "simple@putty.projects.tartarus.org", NULL, NULL);if (subsys) { s->pktout = ssh2_chanreq_init(ssh->mainchan, "subsystem", ssh2_response_authconn, NULL); ssh2_pkt_addstring(s->pktout, cmd); } else if (*cmd) { s->pktout = ssh2_chanreq_init(ssh->mainchan, "exec", ssh2_response_authconn, NULL); ssh2_pkt_addstring(s->pktout, cmd); } else { s->pktout = ssh2_chanreq_init(ssh->mainchan, "shell", ssh2_response_authconn, NULL); } ssh2_pkt_send(ssh, s->pktoutchanreq_init(ssh->mainchan, "window-change", NULL, NULLchanreq_init(ssh->mainchan, "break", NULL, NULL "SEGV"; if (code == TS_SIGTERM) signame = "TERM"; if (code == TS_SIGUSR1) signame = "USR1"; if (code == TS_SIGUSR2) signame = "USR2"; /* The SSH-2 protocol does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */ if (ssh->version == 2 && ssh->mainchan) { pktout = ssh2_chanreq_init(ssh->mainchan, "signal", NULL, NULL); ssh2_pkt_addstring(pktout, signame); ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Sent signal SIG%s", signame); } } else { /* Never heard of it. Do nothing */ } } } void *new_sock_channel(void *handle, Socket s) { Ssh ssh = (Ssh) handle; struct ssh_channel *c; c = snew(struct ssh_ch�?f��fY Revision-number: 9621 Prop-content-length: 168 Content-length: 168 K 10 svn:author V 3 ben K 8 svn:date V 27 2012-08-25T16:52:14.245164Z K 7 svn:log V 70 I can't reproduce this, and I've found a commit that seems to fix it. PROPS-END Node-path: putty-wishlist/data/unix-sigpipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 68bc17328e1b3fc30969d3fe8aa994bd Text-delta-base-sha1: cae4eab7423e33106311b1687fe131c12e190395 Text-content-length: 34 Text-content-md5: 4d9436a4c56c04c7a6b2eefdaef38c96 Text-content-sha1: 89128f1cf88a7c35e18f8e1a2560f99cd5ef8a50 Content-length: 34 SVN��| �`��_Fixed-in: r9359 Revision-number: 9622 Prop-content-length: 152 Content-length: 152 K 10 svn:author V 3 ben K 8 svn:date V 27 2012-08-25T17:00:23.408011Z K 7 svn:log V 54 kexinit-unimplemented was fixed by my recent changes. PROPS-END Node-path: putty-wishlist/data/kexinit-unimplemented Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e9493f466164e3abe025d1d37d5b9d6 Text-delta-base-sha1: 062671466c8a8752df7a805f0e75ddc99a3dd88f Text-content-length: 36 Text-content-md5: 0826d0e219330b3941a043675d21cc29 Text-content-sha1: dc704530cfa952284265229fe638be149c0e2d87 Content-length: 36 SVN��w �-��J,Fixed-in: r9609 Revision-number: 9623 Prop-content-length: 674 Content-length: 674 K 8 svn:date V 27 2012-08-25T21:06:48.931724Z K 7 svn:log V 575 Better handling of outstanding CHANNEL_REQUESTS on channel destruction. Part the first: make sure that all structures describing channel requests are freed when the SSH connection is freed. This involves adding a means to ask a response handler to free any memory it holds. Part the second: in ssh_channel_try_eof(), call ssh2_channel_check_close() rather than emitting an SSH_MSG_CHANNEL_EOF directly. This avoids the possibility of closing the channel while a CHANNEL_REQUEST is outstanding. Also add some assertions that helped with tracking down the latter problem. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eaa0358993fc195bb6f8a1a04cc55674 Text-delta-base-sha1: 19563b5310fe7b67e6d38455181b444c706ced73 Text-content-length: 2261 Text-content-md5: e56c6bf4fbe6d0274b84e827d17bf13a Text-content-sha1: f9881e0f70ed9057e6b924b081cf015e4e001e25 Content-length: 2261 SVN�����������+^�I��D�c�(}~�!�q7c->pending_eof = FALSE; /* we're about to send it */ ssh2_channel_check_close(c); }assert(!(c->closes & (CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE))); * The handler will usually be passed the response packet in pktin. * If pktin is NULL, this means that no reply will ever be forthcoming * (e.g. because the entire connection is being destroyed) and the * handler should free any storage it's holdingassert(!(c->closes & (CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE)));���QwX��[�82�~i�K%1�D>�CU6�C>�K�Y�+f�4 return; ocr = c->v.v2.chanreq_head; if (!ocr) { ssh2_msg_unexpected(ssh, pktin { bufchain_clear(&c->v.v2.outbuffer); assert(c->v.v2.chanreq_head == NULL); } assert(c->v.v2.chanreq_head == NULL);) { if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) { logevent("X11 forwarding enabled"); ssh->X11_fwd_enabled = TRUE; } else logevent("X11 forwarding refused"); }) { if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) { logevent("Agent forwarding enabled"); ssh->agentfwd_enabled = TRUE; } else logevent("Agent forwarding refused"); }) { if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) { logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)", ssh->ospeed, ssh->ispeed); ssh->got_pty = TRUE; } else { c_write_str(ssh, "Server refused to allocate pty\r\n"); ssh->editing = ssh->echoing = 1; }!pktin) goto outout:if (ssh->version == 2) { struct outstanding_channel_request *ocr, *nocr; ocr = c->v.v2.chanreq_head; while (ocr) { ocr->handler(c, NULL, ocr->ctx); nocr = ocr->next; sfree(ocr); ocr = nocr; } bufchain_clear(&c->v.v2.outbuffer)�f/II�f� /* It's a signal. */ if (ssh->version == 2 && ssh->mainchan) { pktout = ssh2_chanreq_init(ssh->mainchan, "signal", NULL, NULL); ssh2_pkt_addstring(pktout, signame); ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Sent signal SIG%s", signame); } } else { /* Never heard of it. Do nothing */ } } } void *new_sock_channel(void *handle, Socket s) { Ssh ssh = (Ssh) handle; struct ssh_channel *c; c = snew(struct ssh_ch Revision-number: 9624 Prop-content-length: 388 Content-length: 388 K 8 svn:date V 27 2012-08-25T22:57:39.090417Z K 7 svn:log V 289 Improve window-size handling in Unix Plink. Unconditionally override the configured terminal size with the one from stdin if it's available. This avoids the silliness whereby if Default Settings had a terminal size set, Plink used this and thus caused the server to use the wrong size. K 10 svn:author V 3 ben PROPS-END Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d716d465875c2bd72915e75ebbb31974 Text-delta-base-sha1: bb5aaa58084eff925ce2ef794289c546ad2fb067 Text-content-length: 352 Text-content-md5: a55443e56f8c3bee37e1851acfebfbe1 Text-content-sha1: 78128b418203c602a20024c87052a50778e5db1a Content-length: 352 SVN��iA3�%��a�\f�3<�yp struct winsize size/* * Now that we've got the SIGWINCH handler installed, try to find * out the initial terminal size. */ if (ioctl(STDIN_FILENO, TIOCGWINSZ, &size) >= 0) { conf_set_int(conf, CONF_width, size.ws_col); conf_set_int(conf, CONF_height, size.ws_row); }STDIN_FILENO Revision-number: 9625 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2012-08-25T23:00:03.307476Z K 7 svn:log V 45 Add a wishlist entry for a bug I just fixed. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/uxplink-winsize-override Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 528 Text-content-md5: 9cdc5b51710b44dee7220bdc35cfd72e Text-content-sha1: e43ac138d6b0c73516ddf8e08d38fc18f50f3671 Content-length: 538 PROPS-END SVN���Summary: Unix Plink inappropriately uses configured window size Class: bug Priority: medium Difficulty: fun Present-in: r2513 r9528 Fixed-in: r9624 Content-Type: text/x-html-body <p>When there are Default Settings configured, Plink on Unix will use the terminal height and width from there rather than querying the terminal itself. This is inappropriate, since the default settings are there to configure the size of PuTTY's terminal windows rather than to override the size of the terminal Plink is running in. Revision-number: 9626 Prop-content-length: 256 Content-length: 256 K 8 svn:date V 27 2012-08-26T09:19:34.408347Z K 7 svn:log V 157 Remove documentation for "Out of space for port forwardings" error. It no longer exists in the code, and should have been obsoleted by r9214 at the latest. K 10 svn:author V 3 ben PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 53df1dd1a1e893af7c9ef13d3ca6e99d Text-delta-base-sha1: 980ce72d9f47a2189b30e8b8a3907a415ec4aa7a Text-content-length: 22 Text-content-md5: 99f932585b641671d3f35e70db5a3a33 Text-content-sha1: 6d7d1df422f1730a0bb8d79355bc4cec203a954f Content-length: 22 SVN��o ���^!s Revision-number: 9627 Prop-content-length: 138 Content-length: 138 K 8 svn:date V 27 2012-08-26T09:50:57.142141Z K 7 svn:log V 38 Fix markup error introduced in r9626. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/errors.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 99f932585b641671d3f35e70db5a3a33 Text-delta-base-sha1: 6d7d1df422f1730a0bb8d79355bc4cec203a954f Text-content-length: 15 Text-content-md5: 0ee8956141f604b226c20f4d2b1900ca Text-content-sha1: 53fbc7473f00cfd9083a2d38da200b4bd4a52843 Content-length: 15 SVN��on��n Revision-number: 9628 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 52 A couple of bugs fixed by Simon's config reworking. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-08-26T09:53:22.008192Z PROPS-END Node-path: putty-wishlist/data/config-struct Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 09d7e0626656fe838f315b2f080c6413 Text-delta-base-sha1: f35bd7bfb18862e49c90db41062c9cea77f2e275 Text-content-length: 36 Text-content-md5: aa8e7f6c96280a0e1b6e848761d5e1b2 Text-content-sha1: 773330c674f9f6ca909a9002ed9d57feebcdf4da Content-length: 36 SVN��HX �)�� (Fixed-in: r9214 Node-path: putty-wishlist/data/portfwd-space Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fe78f8cfc6f3a5005a1c3e1b9be5147 Text-delta-base-sha1: 0dab67bb028d49341ef77fe5186b933546587a5f Text-content-length: 125 Text-content-md5: e7eb6b3d132902298082da572c4f99d5 Text-content-sha1: 55584dda4bbe67d93f946839c5731b63fd54e2b0 Content-length: 125 SVN��jW f�&��K%WFixed-in: r9214This has now been corrected: PuTTY uses a dynamic structure to store port-forwardings. Revision-number: 9629 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2012-08-26T09:54:08.027546Z K 7 svn:log V 23 Update Telnet URI RFC. K 10 svn:author V 3 ben PROPS-END Node-path: putty-wishlist/data/telnet-url-userinfo Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 43d70a4eddbc603563209318e7d26eb1 Text-delta-base-sha1: 9fbc156db050147d580a53058753af83f8955320 Text-content-length: 57 Text-content-md5: 039f8edd0c348ea5909b1f0f86001eec Text-content-sha1: 4e55ebc137725c21bc65f5eaf62347cd11366c30 Content-length: 57 SVN��nj $�4��\http://www.rfc-editor.org/rfc/rfc424 Revision-number: 9630 Prop-content-length: 445 Content-length: 445 K 8 svn:date V 27 2012-08-27T14:34:41.045990Z K 7 svn:log V 344 It's not legal to free a coroutine's state structure before invoking crFinish or crFinishV, since they will attempt to write to the coroutine state variable contained in that structure. Introduced some new all-in-one macros crFinishFree and crFinishFreeV, and used those instead. Should fix today's report of a crash just after authentication. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e56c6bf4fbe6d0274b84e827d17bf13a Text-delta-base-sha1: f9881e0f70ed9057e6b924b081cf015e4e001e25 Text-content-length: 641 Text-content-md5: ee1be9daf76f05a6abeaffc6c44b4f97 Text-content-sha1: 3c5728e14ed9798b8847a9790f4f6c7989c76a5f Content-length: 641 SVN����h��h�FinishFree(z, s) } *crLine = 0; sfree(s); return (z); } #define crFinishFreeV(s) } *crLine = 0; sfree(s)���~~�� ssh->savedhost, ssh->savedport, "rsa", keystr, fingerprint, ���$J~���&3�}p��b9 *pktin) { struct ssh_channel *c = ssh2_channel_msg(ssh, pktin); struct outstanding_channel_request *ocr; if (!c)crFinishFreeV(s)crFinishFreeV(s)crFinishFreeV(s) out:; crFinishFreeV(s)�/ee�/�rbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { Revision-number: 9631 Prop-content-length: 416 Content-length: 416 K 8 svn:date V 27 2012-08-27T17:37:44.036497Z K 7 svn:log V 317 Don't close SSH-2 channels with outstanding channel requests on local error. In sshfwd_unclean_close(), get ssh2_check_close() to handle sending SSH_MSG_CHANNEL_CLOSE. That way, it can hold off doing so until any outstanding channel requests are processed. Also add event log message for unclean channel closures. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ee1be9daf76f05a6abeaffc6c44b4f97 Text-delta-base-sha1: 3c5728e14ed9798b8847a9790f4f6c7989c76a5f Text-content-length: 970 Text-content-md5: 6651b1fd8237528b1a316e40a133fdca Text-content-sha1: 68fbc006e2a6edbe604eeb0df24639c4b9b54359 Content-length: 970 SVN������������d�G�ut�"^ if (ssh->state == SSH_STATE_CLOSED) return; switch (c->type) { case CHAN_X11: x11_close(c->u.x11.s); logevent("Forwarded X11 connection terminated due to local error"logevent("Forwarded port closed due to local error" *pktin) { struct ssh_channel *c = ssh2_channel_msg(ssh, pktin); struct outstanding_channel_request *ocr; if (!c) return; ���`�z �7g�oY!((CLOSES_SENT_EOF | CLOSES_RCVD_EOF) & ~c->closes) || c->type == CHAN_ZOMBIE) && !c->v.v2.chanreq_head && !(c->closes & CLOSES_SENT_CLOSE)) { /* * We have both sent and received EOF (or the channel is a * zombie), and we have no outstanding channel requests, which * means the channel is in final wind-up. But we haven't sent * CLOSE, soEOF |rbitrary named * signals, including signame@domain, but we don't support those. */ if �;��;Y Revision-number: 9632 Prop-content-length: 393 Content-length: 393 K 8 svn:date V 27 2012-08-27T18:44:06.586449Z K 7 svn:log V 294 Slightly simplify crFinishFree{,V}. They're only likely to be useful for freeing a coroutine state structure, in which case there's no need to reset the line number (since all such coroutines keep their line number in the state structure) and the state structure pointer is always called "s". K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6651b1fd8237528b1a316e40a133fdca Text-delta-base-sha1: 68fbc006e2a6edbe604eeb0df24639c4b9b54359 Text-content-length: 258 Text-content-md5: 6e8efa60688c55808595ccda5ea29188 Text-content-sha1: e5819e95ce59fefa8a56936ba9b7af8ad9448ced Content-length: 258 SVN����S�#�� v) } sfree(s); return (z); } #define crFinishFreeV } ssh->savedhos��� �` ocr = c->v.v2.chanreq_head; ���,�. �3Q� �.�;E(signame) { /* It's a signal. */ i�;��, Revision-number: 9633 Prop-content-length: 166 Content-length: 166 K 8 svn:date V 27 2012-08-27T19:11:39.139518Z K 7 svn:log V 68 Fix a memory leak in parse_ttymodes() (found by Memcheck/Valgrind). K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e8efa60688c55808595ccda5ea29188 Text-delta-base-sha1: e5819e95ce59fefa8a56936ba9b7af8ad9448ced Text-content-length: 357 Text-content-md5: 2f1f313702b62629517a8744f3478c04 Text-content-sha1: 7e8f3f201691e90d1fbb4020a61409d0d4b2631e Content-length: 357 SVN����2�%�2�)& { val = get_ttymode(ssh->frontend, key); if (val) { do_mode(data, key, val); sfree(val); } } else do_mode(data, key, val + 1); /* skip the 'V' */��� ��h"�7���1�O�(!c) return; ocr = c->v.v2.chanreq_head; �@1�� if (signame) { /* It's a signal. */ i Revision-number: 9634 Prop-content-length: 235 Content-length: 235 K 8 svn:date V 27 2012-08-27T21:55:45.909718Z K 7 svn:log V 136 Make bombout() less of a macro and more of a function. This gives GCC slightly fewer opportunities to gratuitously inflate its output. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f1f313702b62629517a8744f3478c04 Text-delta-base-sha1: 7e8f3f201691e90d1fbb4020a61409d0d4b2631e Text-content-length: 312 Text-content-md5: 74c8359791f1790118c809138c284dcf Text-content-sha1: 2a8a0a200e11e81fcc19ae9be6e24e0d841f6ebc Content-length: 312 SVN����[�`�S�E;static void bomb_out(Ssh ssh, char *text) { ssh_do_close(ssh, FALSE); logevent(text); connection_fatal(ssh->frontend, "%s", text); sfree(text); } #define bombout(msg) bomb_out(ssh, dupprintf msg ����x(!c) ret����x if (si�@8��8 Revision-number: 9635 Prop-content-length: 197 Content-length: 197 K 7 svn:log V 99 Change return type of do_ssh2_transport() to void. Nothing pays attention to it any more, anyway. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-08-27T22:02:17.790360Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 74c8359791f1790118c809138c284dcf Text-delta-base-sha1: 2a8a0a200e11e81fcc19ae9be6e24e0d841f6ebc Text-content-length: 680 Text-content-md5: 39a6db01ff71d03917678fac01add166 Text-content-sha1: 904b019e37ef29a082512b31bc84cc65effa6032 Content-length: 680 SVN���� :�!��%Yvoid do_ssh2_transport(Ssh ssh, void *vin, int inlen, ���v�4��v7�-�3�ZL�#)�GO�L�s1�S?�_z�C�s1�S?�z�)�s1�S?�z�]�El�(1�l\�\K�'�h?�`*� �"�D�0]�t�_�4i� �""q�-6�+f�l voidVVVVVVVVkex warning", NULL, 0, TRUE); crStopVVVVVVVVVVVVVVVVVVVVVVVV(pktin); if (pktin->type != SSH2_MSG_NEWKEYS) { bombout(("expected new-keys packet from server")); crStopVVVurn; ocr = c->v.v2.chanreq_head; if (!���.�R.gname) { /* It's a signal. */ if (ss�8 �� . Revision-number: 9636 Prop-content-length: 442 Content-length: 442 K 8 svn:date V 27 2012-08-27T23:16:49.560664Z K 7 svn:log V 343 Clang, like LCC, objects to using '<' and '>' on function pointers. I'm not entirely sure that using memcmp() is any more defined by the C standard, but at least Clang doesn't complain about it. While I'm here, tree234 doesn't require that comparison functions return precisely +1 or -1, so we can use the return value of memcmp() directly. K 10 svn:author V 3 ben PROPS-END Node-path: putty/timing.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 09c8de23861b24706369bc4c4ea265bd Text-delta-base-sha1: 38ed2ba4a26fcdad07e959f581e99cd7969c0c3c Text-content-length: 188 Text-content-md5: ba5d303bbbe8dfb85d78b6db6cadad3f Text-content-sha1: 9e43cef010ac2395dc41fc1ffe3799eb625fdce1 Content-length: 188 SVN��] $��$�&b defined(__LCC__) || defined(__clang__) /* lcc won't let us compare function pointers. Legal, but annoying. */ return memcmp(&a->fn, &b->fn, sizeof(a->fn)); Revision-number: 9637 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2012-08-28T17:41:10.811749Z K 7 svn:log V 211 Partially revert r9636. It is true that we can directly return the result of memcmp, but untrue that we can do so _unconditionally_: if memcmp returns zero, we still need to fall through to the next comparison. K 10 svn:author V 5 simon PROPS-END Node-path: putty/timing.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ba5d303bbbe8dfb85d78b6db6cadad3f Text-delta-base-sha1: 9e43cef010ac2395dc41fc1ffe3799eb625fdce1 Text-content-length: 100 Text-content-md5: b36368233cd6d2596e82a45d34e88a34 Text-content-sha1: f2a18334bab7162b0d5ee095d8cbf2f7d8114cdb Content-length: 100 SVN��]~ N� �N�&7{ int c = memcmp(&a->fn, &b->fn, sizeof(a->fn)); if (c) return c; } Revision-number: 9638 Prop-content-length: 442 Content-length: 442 K 10 svn:author V 5 simon K 8 svn:date V 27 2012-08-28T17:42:47.134580Z K 7 svn:log V 341 Fix a controlling-terminal bug reported by Anthony Heading: Cygwin doesn't have TIOCSCTTY, so my attempt to set the ctty of the child process isn't doing anything, and only works by chance when you run bash because bash does the thing that _will_ set the ctty, namely opening the terminal file again without O_NOCTTY. So now we do that too. PROPS-END Node-path: putty/contrib/cygtermd/pty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 14e5df4676a56f1757d9a67ca4d8632b Text-delta-base-sha1: c23d9c4a39dfd7cd0a8bf8951130dee4e69a59ab Text-content-length: 665 Text-content-md5: cf5ae3f7dc0cd05c9abd2465b6670217 Text-content-sha1: dd6d2232f4409425015e2c6df79d96ceef9dafa7 Content-length: 665 SVN��I �,��ed /* * Make the new pty our controlling terminal. On some OSes * this is done with TIOCSCTTY; Cygwin doesn't have that, so * instead it's done by simply opening the pty without * O_NOCTTY. This code is primarily intended for Cygwin, but * it's useful to have it work in other contexts for testing * purposes, so I leave the TIOCSCTTY here anyway. */ if ((fd = open(ptyname, O_RDWR)) >= 0) { #ifdef TIOCSCTTY ioctl(fd, TIOCSCTTY, &i); #endif close(fd); } else { perror("slave pty: open"); exit(127); } Revision-number: 9639 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9640 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9641 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9642 Prop-content-length: 184 Content-length: 184 K 8 svn:date V 27 2012-08-30T18:44:33.944517Z K 7 svn:log V 84 Avoid leaking file handles in load_openssh_key(), as reported by David Wedderwille. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5763147291e49b81d26b5d78db15e6d5 Text-delta-base-sha1: 8b5f1ff5297fa8863dc292f6f21641afecf572ac Text-content-length: 87 Text-content-md5: d6e2c153b378e4200b85d024794a9013 Text-content-sha1: 6107e79fdbe6e704ed970e3d6d887bdaddb4fa9a Content-length: 87 SVN��w63�!��d!�L�2E = NULLfclose(fp); fp = NULL;if (fp) fclose(fp) Revision-number: 9643 Prop-content-length: 674 Content-length: 674 K 7 svn:log V 573 In openssh_read(), we shouldn't ever return SSH2_WRONG_PASSPHRASE for an unencrypted key. (The other import function, sshcom_read(), already got this right.) Thanks to David Wedderwille for the report. This is more than just an error-reporting mistake; it actually causes Windows PuTTYgen to tight-loop on attempting to load a corrupt OpenSSH key, because the 'wrong passphrase' return value causes the caller to loop round and try again, but of course it knows the key is unencrypted so it doesn't prompt for a different passphrase and just tries again with no change... K 10 svn:author V 5 simon K 8 svn:date V 27 2012-08-30T18:44:34.494004Z PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d6e2c153b378e4200b85d024794a9013 Text-delta-base-sha1: 6107e79fdbe6e704ed970e3d6d887bdaddb4fa9a Text-content-length: 185 Text-content-md5: 605ff99e37047e7603b8b317786c9fd2 Text-content-sha1: 0bc8f1f2ade080df774e31a0b683ba55350a2f21 Content-length: 185 SVN��6����5W�! * decrypt, if the key was encrypted retval = key->encrypted ? SSH2_WRONG_PASSPHRASE : NULLkey->encrypted ? SSH2_WRONG_PASSPHRASE : NULL Revision-number: 9644 Prop-content-length: 380 Content-length: 380 K 8 svn:date V 27 2012-08-30T18:44:35.071091Z K 7 svn:log V 279 Rename the various ssh2_maybe_setup_* functions to ssh2_setup_*, and move the primary conditions out of them into their callers. Fixes a crash in 'plink -N', since those functions would be called with a NULL channel parameter and immediately dereference it to try to get c->ssh. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 39a6db01ff71d03917678fac01add166 Text-delta-base-sha1: 904b019e37ef29a082512b31bc84cc65effa6032 Text-content-length: 4238 Text-content-md5: ac13078fb784cd83d0246d469eb126ae Text-content-sha1: 65cbcd25f64ac8135138f68247e5570514e1c0b0 Content-length: 4238 SVN������������������`Q��n�jx�l'6�Zw�`3`�Vr�D>� T�Q���g[N�RpF�Jsetup_x11(struct ssh_channel *c, struct Packet *pktin, void *ctx) { struct ssh2setup_x11_state, ctx); crBeginState; logevent("Requesting X11 forwarding"); pktout = ssh2_chanreq_init(ssh->mainchan, "x11-req", ssh2_setup_x11, s); ssh2_pkt_addbool(pktout, 0); /* many connections */ ssh2_pkt_addstring(pktout, ssh->x11disp->remoteauthprotoname); /* * Note that while we blank the X authentication data here, we don't * take any special action to blank the start of an X11 channel, * so using MIT-MAGIC-COOKIE-1 and actually opening an X connection * without having session blanking enabled is likely to leak your * cookie into the log. */ dont_log_password(ssh, pktout, PKTLOG_BLANK); ssh2_pkt_addstring(pktout, ssh->x11disp->remoteauthdatastring); end_log_omission(ssh, pktout); ssh2_pkt_adduint32(pktout, ssh->x11disp->screennum); ssh2_pkt_send(ssh, pktout); crWaitUntilV(pktin); if (pktin) { if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) { logevent("X11 forwarding enabled"); ssh->X11_fwd_enabled = TRUE; } else logevent("X11 forwarding refused"); } crFinishFreeV; } static void ssh2_setup_agent(struct ssh_channel *c, struct Packet *pktin, void *ctx) { struct ssh2setup_agent_state, ctx); crBeginState; logevent("Requesting OpenSSH-style agent forwarding"); pktout = ssh2_chanreq_init(ssh->mainchan, "auth-agent-req@openssh.com", ssh2_setup_agent, s); ssh2_pkt_send(ssh, pktout); crWaitUntilV(pktin); if (pktin) { if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) { logevent("Agent forwarding enabled"); ssh->agentfwd_enabled = TRUE; } else logevent("Agent forwarding refused"); } crFinishFreeV; } static void ssh2setup_ptysetup_pty_state, ctx); crBeginState; /* Unpick the terminal-speed string. */ /* XXX perhaps we should allow no speeds to be sent. */ ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */ /* Build the pty request. */ pktout = ssh2_chanreq_init(ssh->mainchan, "pty-req", ssh2_setup_pty, s); ssh2_pkt_adduint32(pktout, ssh->term_width); ssh2_pkt_adduint32(pktout, ssh->term_height); ssh2_pkt_adduint32(pktout, 0); /* pixel width */ ssh2_pkt_adduint32(pktout, 0); /* pixel height */ ssh2_pkt_addstring_start(pktout); parse_ttymodes(ssh, ssh2_send_ttymode, (void *)pktout); ssh2_pkt_addbyte(pktout, SSH2_TTY_OP_ISPEED); ssh2_pkt_adduint32(pktout, ssh->ispeed); ssh2_pkt_addbyte(pktout, SSH2_TTY_OP_OSPEED); ssh2_pkt_adduint32(pktout, ssh->ospeed); ssh2_pkt_addstring_data(pktout, "\0", 1); /* TTY_OP_END */ ssh2_pkt_send(ssh, pktout); ssh->state = SSH_STATE_INTERMED; crWaitUntilV(pktin); if (pktin) { if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) { logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)", ssh->ospeed, ssh->ispeed); ssh->got_pty = TRUE; } else { c_write_str(ssh, "Server refused to allocate pty\r\n"); ssh->editing = ssh->echoing = 1; } } ssh2if (ssh->mainchan && !ssh->ncmode && conf_get_int(ssh->conf, CONF_agentfwd) && agent_exists()) ssh2_setup_agent(ssh->mainchan, NULL, NULL); /* * Now allocate a pty for the session. */ ssh2_setup_pty(ssh->mainchan, NULL, NULL); } else { ssh->editing = ssh->echoing = 1; } /* * Send environment variables. */ if (ssh->mainchan && !ssh->ncmode) � (� �e = "TERM"; if (code == TS_SIGUSR1) signame = "USR1"; if (code == TS_SIGUSR2) signame = "USR2"; /* The SSH-2 protocol does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */ if (ss Revision-number: 9645 Prop-content-length: 145 Content-length: 145 K 10 svn:author V 5 simon K 8 svn:date V 27 2012-08-30T18:48:08.208169Z K 7 svn:log V 45 Memory leak fixes reported by Balazs Domjan. PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9ec1be9cd777f78386d02fa4384fede0 Text-delta-base-sha1: 06e8cf4df5ca18a4507244ab37c98f51554d97e6 Text-content-length: 489 Text-content-md5: aa9b4ec7638d32d016385276504ecad7 Text-content-sha1: 19cf07dc5a4c66b9fd2950da6c25ce8b533de42a Content-length: 489 SVN�����e�=�}'U� V sfree(term->post_bidi_cache[i].forward); sfree(term->post_bidi_cache[i].backward); } sfree(term->pre_bidi_cache); sfree(term->post_bidi_cache); sfree(term->tabs line = delpos234(term->screen, term->rows - 1); freeline(line�4��er; if (term->esc_nargs != 1) break; if (term->esc_args[0] == 5 && (printer = conf_get_str(term->conf, CONF_printer))[0]) { term Revision-number: 9646 Prop-content-length: 279 Content-length: 279 K 10 svn:author V 3 ben K 8 svn:date V 27 2012-09-01T11:32:53.461795Z K 7 svn:log V 180 do_ssh2_authconn() now installs the standard handlers for CHANNEL_SUCCESS and CHANNEL_FAILURE as soon as it's opened a channel, so there's no need for it to set them again later. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ac13078fb784cd83d0246d469eb126ae Text-delta-base-sha1: 65cbcd25f64ac8135138f68247e5570514e1c0b0 Text-content-length: 349 Text-content-md5: 2f7d32ca314ac0e95b9d6217a6b988f7 Text-content-sha1: 7a788dbd9691b579a7c95689caeb6047df02300d Content-length: 349 SVN�������������������u��ye = "TERM"; if (code == TS_SIGUSR1) signame = "USR1"; if (code == TS_SIGUSR2) signame = "USR2"; /* The SSH-2 protocol does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */�(�� Revision-number: 9647 Prop-content-length: 277 Content-length: 277 K 7 svn:log V 178 All of the initial CHANNEL_REQUESTs are conditional on (ssh->mainchan && !ssh->ncmode), so bundle them up in a big block conditional on this rather than checking it five times. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-09-01T12:03:12.006562Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f7d32ca314ac0e95b9d6217a6b988f7 Text-delta-base-sha1: 7a788dbd9691b579a7c95689caeb6047df02300d Text-content-length: 2949 Text-content-md5: 8b14f9ab0af10e1a432500ff42bc53b0 Text-content-sha1: 316898e826487f7b0b18c5074009ddd8d4405737 Content-length: 2949 SVN������������������7��I�H8nif (ssh->mainchan && !ssh->ncmode) { /* * Send the CHANNEL_REQUESTS for the main session channel. * Each one is handled by its own little asynchronous * co-routine. */ /* Potentially enable X11 forwarding. */ if (conf_get_int(ssh->conf, CONF_x11_forward) && (ssh->x11disp = x11_setup_display(conf_get_str(ssh->conf, CONF_x11_display), conf_get_int(ssh->conf, CONF_x11_auth), ssh->conf))) ssh2_setup_x11(ssh->mainchan, NULL, NULL); /* Potentially enable agent forwarding. */ if (conf_get_int(ssh->conf, CONF_agentfwd) && agent_exists()) ssh2_setup_agent(ssh->mainchan, NULL, NULL); /* Now allocate a pty for the session. */ if (!conf_get_int(ssh->conf, CONF_nopty)) ssh2_setup_pty(ssh->mainchan, NULL, NULL); /* Send environment variables. */ ssh2_setup_env(ssh->mainchan, NULL, NULL); /* * Start a shell or a remote command. We may have to attempt * this twice if the config data has provided a second choice * of command. */ while (1) { int subsys; char *cmd; if (ssh->fallback_cmd) { subsys = conf_get_int(ssh->conf, CONF_ssh_subsys2); cmd = conf_get_str(ssh->conf, CONF_remote_cmd2); } else { subsys = conf_get_int(ssh->conf, CONF_ssh_subsys); cmd = conf_get_str(ssh->conf, CONF_remote_cmd); } if (subsys) { s->pktout = ssh2_chanreq_init(ssh->mainchan, "subsystem", ssh2_response_authconn, NULL); ssh2_pkt_addstring(s->pktout, cmd); } else if (*cmd) { s->pktout = ssh2_chanreq_init(ssh->mainchan, "exec", ssh2_response_authconn, NULL); ssh2_pkt_addstring(s->pktout, cmd); } else { s->pktout = ssh2_chanreq_init(ssh->mainchan, "shell", ssh2_response_authconn, NULL); } ssh2_pkt_send(ssh, s->pktout); crWaitUntilV(pktin); if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) { if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) { bombout(("Unexpected response to shell/command request:" " packet type %d", pktin->type)); crStopV; } /* * We failed to start the command. If this is the * fallback command, we really are finished; if it's * not, and if the fallback command exists, try falling * back to it before complaining. */ if (!ssh->fallback_cmd && *conf_get_str(ssh->conf, CONF_remote_cmd2)) { logevent("Primary command failed; attempting fallback"); ssh->fallback_cmd = TRUE; continue; } bombout(("Server refused to start a shell/command")); crStopV; } else { logevent("Started a shell/command"); } break; } } else { ssh->editing = ssh->echoing = TRUE if (ssh->version == 2 && ssh->mainchan) { pktout = ssh2_chanreq_init(ssh->mainchan, "signal", NULL, NULL); ssh2_pkt_addstring(pktout, signame); ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Sent signal SIG%s", signame); }�(��(n Revision-number: 9648 Prop-content-length: 136 Content-length: 136 K 8 svn:date V 27 2012-09-01T12:10:27.036196Z K 7 svn:log V 38 struct winadj is unused now. G/c it. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b14f9ab0af10e1a432500ff42bc53b0 Text-delta-base-sha1: 316898e826487f7b0b18c5074009ddd8d4405737 Text-content-length: 490 Text-content-md5: 802e3e8a0e32a10c688cf6fd9d7c9983 Text-content-sha1: 002e850c907cb8e2c082ffde6a16fa28aef73d69 Content-length: 490 SVN�����`��g ssh->savedhost, ssh->savedport, "rsa", keystr, fingerprint, ��� �yocr) { ssh2_msg_unexpected(ssh, pktin); return; } ocr->handler(c, pktin, ocr->ctx); c->v.v2.chanreq_head = ocr->next; ��� �y } else { /* Never heard of it. Do nothing */ } } } void *new_sock_channel(void *handle, Socket s) { Ssh ssh = (Ssh) ha�(!��! Revision-number: 9649 Prop-content-length: 162 Content-length: 162 K 7 svn:log V 64 Factor out some common code for constructing SSH2_CHANNEL_OPEN. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-09-01T12:28:38.954016Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 802e3e8a0e32a10c688cf6fd9d7c9983 Text-delta-base-sha1: 002e850c907cb8e2c082ffde6a16fa28aef73d69 Text-content-length: 1219 Text-content-md5: 002b69aec632e621c117d9b3726d58e6 Text-content-sha1: 019d03ec81e6db33bb0c60a5448a259c1544228c Content-length: 1219 SVN�����������D�.�D�"onstruct the common parts of a CHANNEL_OPEN. */ static struct Packet *ssh2_chanopen_init(struct ssh_channel *c, char *type) { struct Packet *pktout; pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN); ssh2_pkt_addstring(pktout, type); ssh2_pkt_adduint32(pktout, c->localid); ssh2_pkt_adduint32(pktout, c->v.v2.locwindow);/* our window size */ ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */ return pktout���%nP�w�� H�y2�6?�` */ if (c->v.v2.throttle_state == UNTHROTTLING) c->v.v2.throttle_state = UNTHROTTLED; } static void ssh2_msg_channel_response(Ssh ssh, struct Packet *pktin) { struct ssh_channel *c = ssh2_channel_msg(ssh, pktin); struct outstanding_channel_request *ocr; if (!c) return; ocr = c->v.v2.chanreq_head; if (!ocr) { ssh2_msg_unexpected(ssh, pktin); return; } ocr->handler(c, pktin, ocr->ctx); c->v.v2.chanreq_head = ocr->next; chanopen_init(ssh->mainchan, "direct-tcpip");chanopen_init(ssh->mainchan, "session"); ssh2_pkt_send(ssh, s->pktout);sessionndle; struct ssh_channel *c; �! !�7"�E\chanopen_init(c, "direct-tcpip"); Revision-number: 9650 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9651 Prop-content-length: 688 Content-length: 688 K 8 svn:date V 27 2012-09-08T10:40:36.064589Z K 7 svn:log V 587 Hiroshi Oota points out that PuTTY's agent forwarding sockets can get confused if they receive a request followed by immediate EOF, since we currently send outgoing EOF as soon as we see the incoming one - and then, when the response comes back from the real SSH agent, we send it along anyway as channel data in spite of having sent EOF. To fix this, I introduce a new field for each agent channel which counts the number of calls to ssh_agentf_callback that are currently expected, and we don't send EOF on an agent channel until we've both received EOF and that value drops to zero. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 002b69aec632e621c117d9b3726d58e6 Text-delta-base-sha1: 019d03ec81e6db33bb0c60a5448a259c1544228c Text-content-length: 1882 Text-content-md5: ffbd6a50cf6b6343795852a8ecbf276b Text-content-sha1: dfac041c63f1db4b53333098c84ecfe18e33aa9a Content-length: 1882 SVN����/�x��<v�--m�pW int outstanding_requestsc->u.a.outstanding_requests--; /* * If we've already seen an incoming EOF but haven't sent an * outgoing one, this may be the moment to send it. */ if (c->u.a.outstanding_requests == 0 && (c->closes & CLOSES_RCVD_EOF)) sshfwd_write_eof(c���6y�Srm�n��8k�Q!r_fmt(keystr, &hostkey); rsa_fingerprint(fingerprint, sizeof(fingerprint), &hostkey); ssh_set_frozen(ssh, 1); ssh->savedhost, ssh->savedport, "rsa", keystr, fingerprint, c->u.a.outstanding_requests = 0 c->u.a.outstanding_requests++��� 4�\��aZ�S3�p�Ld of, such as "winadj@putty". Raised * with foxt.com as bug 090916-090424, but for the sake of a quiet * life, we don't worry about what kind of response we got. */ c->v.v2.remlocwin += *sizep; sfree(sizep); /* * winadj messages are only sent when the window is fully open, so * if we get an ack of one, we know any pending unthrottle is * complete. c->u.a.outstanding_requests++if (c->u.a.outstanding_requests == 0) { sshfwd_write_eof(c); } c->u.a.outstanding_requests�M00��does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */ if (ssh->version == 2 && ssh->mainchan) { pktout = ssh2_chanreq_init(ssh->mainchan, "signal", NULL, NULL); ssh2_pkt_addstring(pktout, signame); ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Sent signal SIG%s", signame); } } else { /* Never heard of it. Do nothing */ } } } void *new_sock_channel(void *handle, Socket s) { Ssh ssh = (Ssh) handle; struct ssh_channel *c; Revision-number: 9652 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9653 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9654 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9655 Prop-content-length: 292 Content-length: 292 K 8 svn:date V 27 2012-09-08T19:46:07.824586Z K 7 svn:log V 193 Most of the code for "nc" mode duplicated that for opening a session or a fowarded port. Arrange that this code is shared instead. The main visible change is a slight change of log messages. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ffbd6a50cf6b6343795852a8ecbf276b Text-delta-base-sha1: dfac041c63f1db4b53333098c84ecfe18e33aa9a Text-content-length: 1928 Text-content-md5: 71df71236fe62b5e6ab2bef38b7b4e11 Text-content-sha1: 1cb6dd1fd68292c0da12034c26f5e4fc81bd58af Content-length: 1928 SVN������������������#s�G��k3�w8�=>�'YN if (*conf_get_str(ssh->conf, CONF_ssh_nc_host)) { /* * Just start a direct-tcpip channel and use it as the main * channel. */ ssh_send_port_open(ssh->mainchan, conf_get_str(ssh->conf, CONF_ssh_nc_host), conf_get_int(ssh->conf, CONF_ssh_nc_port), "main channel"); ssh->ncmode = TRUE; } else { s->pktout = ssh2_chanopen_init(ssh->mainchan, "session"); logevent("Opening session as main channel"); ssh2_pkt_send(ssh, s->pktout); ssh->ncmode = FALSE; }main channel")does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */ if (ssh->version == 2 && ssh->mainchan) { pktout = ssh2_chanreq_init(ssh->mainchan, "signal", NULL, NULL); ssh2_pkt_addstring(pktout, signame); ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Sent signal SIG%s", signame); } } else { /* Never heard of it. Do nothing */ } } } void *new_sock_channel(void *handle, Socket s) { Ssh ssh = (Ssh) handle; struct ssh_channel *c; c = snew(struct ssh_channel); c->ssh = ssh; ssh2_channel_init(c); c->halfopen = TRUE; c->type = CHAN_SOCKDATA_DORMANT;/* identify channel type */ c->u.pfd.s = s; add234(ssh->channels, c); return c; } /* * This is called when stdout/stderr (the entity to which * from_backend sends data) manages to clear some backlog. */ static void ssh_unthrottle(void *handle, int bufsize) { Ssh ssh = (Ssh) handle; int buflimit; if (ssh->version == 1) { if (ssh->v1_stdout_throttling && bufsize < SSH1_BUFFER_LIMIT) { ssh->v1_stdout_throttling = 0; ssh_throttle_conn(ssh, -1); } } else { if (ssh->mainchan) { ssh2�M 0� N�Fconnection to %s:%d for %s", hostname, port, org Revision-number: 9656 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9657 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9658 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9659 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9660 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9661 Prop-content-length: 286 Content-length: 286 K 8 svn:date V 27 2012-09-13T21:53:47.210067Z K 7 svn:log V 187 In the cygwin Makefile, use "-o" on the windres command line to specify the output file. This appears to be supported by windres, and is required by wrc (the Winelib resource compiler). K 10 svn:author V 3 ben PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 680f8a556caf729ec21e791b71de73ac Text-delta-base-sha1: 2ff52df0a22e168e808fb67e4c4947700e4ea8ad Text-content-length: 26 Text-content-md5: b2bbeaf77b881ca3183d207263c1c705 Text-content-sha1: 73868becc68ba1ba37ab8607f9ae12c0a899bf99 Content-length: 26 SVN��be �1��20-o Revision-number: 9662 Prop-content-length: 330 Content-length: 330 K 7 svn:log V 231 Define SECURITY_WIN32 for Winelib/Cygwin builds as well as for VC. This should perhaps go into winmisc.c: it's caused problems for other people too: <http://stackoverflow.com/questions/8530159/vs2010-build-error-at-putty-source> K 10 svn:author V 3 ben K 8 svn:date V 27 2012-09-13T22:33:27.098086Z PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e126d772c899e8b7ec8fe505d1799fae Text-delta-base-sha1: b6f36b03cedb7dda25efb570d1170f961f1fe11e Text-content-length: 47 Text-content-md5: abf241c24dee95324ec49d90a6e15085 Text-content-sha1: e808ae88a96518ea8ddf3b26acbcc82cf790f9f0 Content-length: 47 SVN��4 ���CFLAGS += -DSECURITY_WIN32 Revision-number: 9663 Prop-content-length: 185 Content-length: 185 K 8 svn:date V 27 2012-09-13T22:34:18.643177Z K 7 svn:log V 87 Don't try to use SecureZeroMemory under Winelib, since it isn't available there (yet). K 10 svn:author V 3 ben PROPS-END Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 102bd9df15c3acd5a6f7bfe466f46f9a Text-delta-base-sha1: 2dbba5760a39ba090db5b27eeac4114d6b212a70 Text-content-length: 90 Text-content-md5: 7835ba92ca7dc18f0f499d0d3604a82a Text-content-sha1: b95847e9293883f8e35e9cd06c654a25afc0c22c Content-length: 90 SVN��I ?�=��*<�de#ifndef __WINE__ /* No SecureZeroMemory in Winelib 1.4 */#endif Revision-number: 9664 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2012-09-13T22:34:53.616675Z K 7 svn:log V 65 Tweak comment in Recipe that had become separated from its code. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: abf241c24dee95324ec49d90a6e15085 Text-delta-base-sha1: e808ae88a96518ea8ddf3b26acbcc82cf790f9f0 Text-content-length: 51 Text-content-md5: 0b728ba6b09e8f96820554cda3c7bbae Text-content-sha1: 5791c5e41dbd3eda0377e5f5dc8f0074b37d4911 Content-length: 51 SVN��44�;��I:�CFLAGS += -DSECURITY_WIN32 Revision-number: 9665 Prop-content-length: 211 Content-length: 211 K 8 svn:date V 27 2012-09-13T23:00:29.045746Z K 7 svn:log V 112 Should have been part of r9663: do use the platform-independent version of smemclr when compiling with Winelib. K 10 svn:author V 3 ben PROPS-END Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e0973b60efd703c67bd847d28f39a06 Text-delta-base-sha1: 068858e8ed45c1f98de9c7d9b0009779e8eb09d7 Text-content-length: 161 Text-content-md5: 101c8878e34c4745e4d3846ec0b85f97 Text-content-sha1: 741efdda5e02672e76b1bded5bda92fa8f831f97 Content-length: 161 SVN��6w ���kKifndef __WINE__ /* No SecureZeroMemory in Winelib 1.4 */ #define PLATFORM_HAS_SMEMCLR /* inhibit cross-platform one in misc.c */ #endif Revision-number: 9666 Prop-content-length: 153 Content-length: 153 K 7 svn:log V 55 Quell a (correct) GCC warning in the NO_HTMLHELP case. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-09-17T22:28:07.378676Z PROPS-END Node-path: putty/windows/winhelp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 020d1109643ec3c6a7eb40d0943e891e Text-delta-base-sha1: 78cd557df1421a029e338e58e7c276c324bcf204 Text-content-length: 29 Text-content-md5: 10413def2abc9c423cf2bb89719c4680 Text-content-sha1: abd2b2411bae66b8f33c920d4154a2e1182e941d Content-length: 29 SVN�� �{��{ != NULL Revision-number: 9667 Prop-content-length: 752 Content-length: 752 K 8 svn:date V 27 2012-09-18T21:42:48.873685Z K 7 svn:log V 653 Two related changes to timing code: First, make absolute times unsigned. This means that it's safe to depend on their overflow behaviour (which is undefined for signed integers). This requires a little extra care in handling comparisons, but I think I've correctly adjusted them all. Second, functions registered with schedule_timer() are guaranteed to be called with precisely the time that was returned by schedule_timer(). Thus, it's only necessary to check these values for equality rather than doing risky range checks, so do that. The timing code still does lots that's undefined, unnecessary, or just wrong, but this is a good start. K 10 svn:author V 3 ben PROPS-END Node-path: putty/notiming.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c9fe17d454b003915273b35e39b7670a Text-delta-base-sha1: 4cd9e8a4cb1131b0e8edc380f9164646b373b98a Text-content-length: 29 Text-content-md5: ae49bd018169b62c4e426498b8536879 Text-content-sha1: cc60f7888c2c25f7118312fc5d4794c1741506a4 Content-length: 29 SVN��HQ �S��uSunsigned Node-path: putty/pinger.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c7231539a750014a0820092c9db55f8 Text-delta-base-sha1: 1a2530c5d6ae39a72f4abcd7c3ffec1d0624f502 Text-content-length: 137 Text-content-md5: 224b725dd6226b11a744d706cc930db6 Text-content-sha1: 3590a9ca3ae0c07f8d0b4551dbe7673494af2728 Content-length: 137 SVN��ESm�[�� Ze�Dunsignedunsigned long now) { Pinger pinger = (Pinger)ctx; if (pinger->pending && now == pinger->next Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 77549068aad13b4ec211829cc0c1909a Text-delta-base-sha1: 9cdf4e15b65d01e3a31fdec5b4746f11bb20de07 Text-content-length: 136 Text-content-md5: 1c0d6cfa9cce3b71e602af4242fd1dfd Text-content-sha1: 23e97af052e3f06fa0a31cd69c426bd483243269 Content-length: 136 SVN��?lh�)��o4K�lSunsigned long now); unsigned unsigned long now, unsigned long *next); void timer_change_notify(unsigned Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 71df71236fe62b5e6ab2bef38b7b4e11 Text-delta-base-sha1: 1cb6dd1fd68292c0da12034c26f5e4fc81bd58af Text-content-length: 418 Text-content-md5: 226328a37781c928048c1a9cec5a177d Text-content-sha1: 4ce7e8a5b17bc7a769014a3bf8329541288de213 Content-length: 418 SVN�����.��j-�Xunsignedunsigned����n�len, char); rsast���N���3��L"�{=ts it's never hearunsigned== ssh->next_rekeyunsigned long new_next = ssh->last_rekey + rekey_time*60*TICKSPERSEC; unsigned long now = GETTICKCOUNT(); if (now - ssh->last_rekey > rekey_time*60*TICKSPERSEC�IHH��_throttle_conn(ssh, -1); } } else { if (ssh->mainchan) { ssh2 Node-path: putty/sshrand.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15406d932db2b96efe2fbc485b9319da Text-delta-base-sha1: a245a2bd2e64d379d3aaf10b484406a92cb4ef1a Text-content-length: 125 Text-content-md5: f600391de36ffe1cabd6348825767bbb Text-content-sha1: 608cbef1523001db40ebe337c698e67514a8f6ec Content-length: 125 SVN��\ac�}�c�br�=unsigned long now) { if (random_active > 0 && now == next_noise_collection) { noise_regular(); Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: aa9b4ec7638d32d016385276504ecad7 Text-delta-base-sha1: 19cf07dc5a4c66b9fd2950da6c25ce8b533de42a Text-content-length: 162 Text-content-md5: e218aee450414474a70386e4b7514ea4 Text-content-sha1: 0684fa034736df38f30341ea53ae69632d5df320 Content-length: 162 SVN����(]�}��p|��:�kh�kunsigned== term->next_tblink== term->next_cblink== term->vbell_end== term->next_updateer; �4-��- Node-path: putty/timing.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b36368233cd6d2596e82a45d34e88a34 Text-delta-base-sha1: f2a18334bab7162b0d5ee095d8cbf2f7d8114cdb Text-content-length: 260 Text-content-md5: da460bd4eaf6a5230ffd07e74e100ffc Text-content-sha1: b80cb3355ad332a57a8467192c35212b0ed607bf Content-length: 260 SVN��~;#U���a)� P� M�@`B�dunsigned long now; unsignedunsignedunsigned long schedule_timer(int ticks, timer_fn_t fn, void *ctx) { unsignedunsigned long anow, unsignednow - first->when_set - 10 > first->now - first->when_set - 1 Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c909b9327bed77d0f50b109468ec057c Text-delta-base-sha1: 89abcac8c7c0099d40d28b105c1a7eb1697113b3 Text-content-length: 431 Text-content-md5: 6e298e9419f4e449bebaf6212d0c095a Text-content-sha1: c44e109a25c4c701e67cae509a8f8f1fc8e9361e Content-length: 431 SVN�����g��Z�&wunsigned long now = GPOINTER_TO_LONG(data); unsigned long next, then; long ticks; if (run_timers(now, &next)) { then = now; now = GETTICKCOUNT(); if (now - then > next - then) ticks = 0; else ticks = next - now; timer_id = gtk_timeout_add(ticksunsigned �M0cc�M�); inst->exited = TRUE; fatal_message_box(inst->window, msg); sfree(msg); exit(0); } s Node-path: putty/unix/uxcons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a290ea3b67fc59758c9e428ce8f977ca Text-delta-base-sha1: 79e4504704b08629078861b4716e91b29f50d3d4 Text-content-length: 30 Text-content-md5: 52252d5075969b6365c190569aaf588d Text-content-sha1: 6722af2276419facee6b87f005fdeff4b81dbb98 Content-length: 30 SVN��U^ ���Tunsigned Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a55443e56f8c3bee37e1851acfebfbe1 Text-delta-base-sha1: 78128b418203c602a20024c87052a50778e5db1a Text-content-length: 269 Text-content-md5: 7873642b996c6ff0838c3ef58cdcd68d Text-content-sha1: fef5578c32e59444e3e01c2f4d24433416825f27 Content-length: 269 SVN��A l�|��i{d�8 unsignedunsigned long next, then; long ticks; struct timeval tv, *ptv; if (run_timers(now, &next)) { then = now; now = GETTICKCOUNT(); if (now - then > next - then) ticks = 0; else ticks = next - now; Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a7406ab3544b7d85a1b00f3cb221a63a Text-delta-base-sha1: f8184bceef91a9ba94721e9deec37c95c6f2bf80 Text-content-length: 266 Text-content-md5: 63613e73d31bc7fc9eaa814a92b9908b Text-content-sha1: da48bbf6315f3f86ead2bf3947ab398c52eabcfe Content-length: 266 SVN�� El�1��0d�{unsignedunsigned long next, then; long ticks; struct timeval tv, *ptv; if (run_timers(now, &next)) { then = now; now = GETTICKCOUNT(); if (now - then > next - then) ticks = 0; else ticks = next - now; Node-path: putty/windows/wincons.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 64b252e4c6f8ac9e91a2b0ca2b63322e Text-delta-base-sha1: dc07db56e36b344d52266aac5db6879509e96063 Text-content-length: 30 Text-content-md5: 8fe9b126d6b26d5397ed4b81577475c0 Text-content-sha1: 4ccb855787b2a59d2380e84a84a1f5766da68c92 Content-length: 30 SVN��5> �n��Gnunsigned Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ff22e8eddf8f814819be30e71352bd1a Text-delta-base-sha1: 7c76a14359ae770c317007f2860068de639f9f09 Text-content-length: 324 Text-content-md5: 82bc1c9266a50cd61b272c6a6cdd81c7 Text-content-sha1: 1778a39eb2bb7a0d7fc2e87d054d3a7eba908dd2 Content-length: 324 SVN�����-��p�F unsigned long next) { unsigned long now = GETTICKCOUNT(); long ticks; if (now - next < INT_MAX) ticks = 0; else ticks = next - now;unsigned�F| k�[��6aybe); } } else { unsigned long now) { if (flashing && now == next_flash Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f07bec5c920ccc8b28b7a1a87eef9ede Text-delta-base-sha1: 64acf1f16b329eca8211008972e1d146fead9b2d Text-content-length: 173 Text-content-md5: 2e1730b5ad6d90477282c380c81a3eee Text-content-sha1: 18ee585c7e611cebcc36dbc312c7713ddb213f86 Content-length: 173 SVN��|& � ��p�yunsigned long now, next, thenthen = now; now = GETTICKCOUNT(); if (now - then > next - then) ticks = 0; else ticks = next - now; Node-path: putty/windows/winser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e67456711b23ca3f2a8936d136d0bcf3 Text-delta-base-sha1: 8f502f68882a4aea16a38b5ce6cffd4d5d090495 Text-content-length: 90 Text-content-md5: dbb1cd3b3dea633194a4ab469b2a3d9d Text-content-sha1: 79dcfbb1d8415d905081e3455613734ec5433167 Content-length: 90 SVN��)2 D�T�D�unsigned long now) { Serial serial = (Serial)ctx; if (now = Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e0be6a43c114eb9f9df4371e80ffc58 Text-delta-base-sha1: 03c2b1b2f04c9508312a4023c87a8b6f9ceb6d1a Text-content-length: 312 Text-content-md5: e3ba71e96a151138c79fa29d8c2225d6 Text-content-sha1: 81d5d76bfe2cad685d5a0d723c9f9921dbe07064 Content-length: 312 SVN��+o �� �Ajunsigned long next, then; long ticks; HANDLE *handles; SOCKET *sklist; int skcount; unsigned long now = GETTICKCOUNT(); if (run_timers(now, &next)) { then = now; now = GETTICKCOUNT(); if (now - then > next - then) ticks = 0; else ticks = next - now; Revision-number: 9668 Prop-content-length: 660 Content-length: 660 K 8 svn:date V 27 2012-09-18T21:50:47.177445Z K 7 svn:log V 561 Allow remote-to-local forwardings to use IPv6. RFC 4245 section 7.1 specifies the meaning of the "address to bind" parameter in a "tcpip-forward" request. "0.0.0.0" and "127.0.0.1" are specified to be all interfaces and the loopback interface respectively in IPv4, while "" and "localhost" are the address-family-agnostic equivalents. Switch PuTTY to using the latter, since it doesn't seem right to force IPv4. There's an argument that PuTTY should provide a means of configuring the address family used for remote forwardings like it does for local ones. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 226328a37781c928048c1a9cec5a177d Text-delta-base-sha1: 4ce7e8a5b17bc7a769014a3bf8329541288de213 Text-content-length: 228 Text-content-md5: 25a01b25798dc9d0bacf8fb17215b516 Text-content-sha1: e54bd9b2ba95175a7e5378e8d557d3ca07ff8d24 Content-length: 228 SVN��������������D�b"); } else { ssh2_pkt_addstring(pktout, "localhost"); } else { ssh2_pkt_addstring(pktout, "localhostts it's never ����r_throttle_conn�I;��; Revision-number: 9669 Prop-content-length: 258 Content-length: 258 K 8 svn:date V 27 2012-09-18T23:05:29.643026Z K 7 svn:log V 159 Add a new COMPAT option for environments lacking SecureZeroMemory(), rather than explicitly checking for Winelib. It seems that w32api is lacking it as well. K 10 svn:author V 3 ben PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0b728ba6b09e8f96820554cda3c7bbae Text-delta-base-sha1: 5791c5e41dbd3eda0377e5f5dc8f0074b37d4911 Text-content-length: 238 Text-content-md5: d51a157c034814c5dd46cbbd37b26507 Text-content-sha1: 8e0976b201400cf8491fb9850d2be0553bb36e57 Content-length: 238 SVN��4 V�U�V�hLCOMPAT=/DNO_SECUREZEROMEMORY (Windows only) # Disables PuTTY's use of SecureZeroMemory(), which is missing # from some environments' header files. This is enabled by # default in the Cygwin Makefile Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b2bbeaf77b881ca3183d207263c1c705 Text-delta-base-sha1: 73868becc68ba1ba37ab8607f9ae12c0a899bf99 Text-content-length: 45 Text-content-md5: 92ae5be53ab95e3252eeff864f82c60b Text-content-sha1: a4771121b0b31cd15d0dd3a2783467dc5a62a216 Content-length: 45 SVN��e{ �J��I-DNO_SECUREZEROMEMORY Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7835ba92ca7dc18f0f499d0d3604a82a Text-delta-base-sha1: b95847e9293883f8e35e9cd06c654a25afc0c22c Text-content-length: 40 Text-content-md5: 94617eb5e92df1a24059d551a0486726 Text-content-sha1: b0e9fc6c28057aed81f90eda38da4cf92ce460e9 Content-length: 40 SVN�� l �E��vNO_SECUREZEROMEMORY Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 101c8878e34c4745e4d3846ec0b85f97 Text-delta-base-sha1: 741efdda5e02672e76b1bded5bda92fa8f831f97 Text-content-length: 42 Text-content-md5: 4fe97d802f521264bfb5145e27401786 Text-content-sha1: 80f566b6bd461dcd350b17c2672069f38043e0c8 Content-length: 42 SVN��wY � ��:=NO_SECUREZEROMEMORY Revision-number: 9670 Prop-content-length: 170 Content-length: 170 K 8 svn:date V 27 2012-09-18T23:07:42.129033Z K 7 svn:log V 72 Better document the various environments with which Makefile.cyg works. K 10 svn:author V 3 ben PROPS-END Node-path: putty/README Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a2dc6b8da231213be69da37471a54666 Text-delta-base-sha1: 9c40d04fdc177348c5f5b1b7fc23b562a48aa043 Text-content-length: 229 Text-content-md5: 95715431e352ec608c1ea0cbed7b6d40 Text-content-sha1: 5b657a90a44033bb1d1ddffdbaf0ace50ca9e162 Content-length: 229 SVN�� MG�A��dHB�a)MinGW - It's also possible to build the Windows version of PuTTY to run on Unix by using Winelib. To do this, change to the `windows' directory and run `make -f Makefile.cyg CC=winegcc RC=wrc' Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 92ae5be53ab95e3252eeff864f82c60b Text-delta-base-sha1: a4771121b0b31cd15d0dd3a2783467dc5a62a216 Text-content-length: 55 Text-content-md5: 14c5a9a28b9df726fcff995ee86fc86e Text-content-sha1: dfe4df90bd290e12496b2c8fff8d043b194d011e Content-length: 55 SVN��{���s:�p Cygwin, MinGW, or Winelib Revision-number: 9671 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9672 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9673 Prop-content-length: 404 Content-length: 404 K 10 svn:author V 5 simon K 8 svn:date V 27 2012-09-19T17:08:15.455250Z K 7 svn:log V 303 Make --help and --version work consistently across all tools. Well, at least across all command-line tools on both Windows and Unix, and the GTK apps on Unix too. The Windows GUI apps fundamentally can't write to standard output and it doesn't seem sensible to use message boxes for these purposes :-) PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3274abc723704fe6186ba97fb325b010 Text-delta-base-sha1: f34c053eea4c8738fd23b4a80c3e7dc0a93395c9 Text-content-length: 51 Text-content-md5: 60c68c0740c78ea5aad33fdc678ad2c5 Text-content-sha1: 7e21f5224110cab5b212277e7b71739e311adf27 Content-length: 51 SVN��{ �S��%Vprintf("puttygen: %s\n", ve Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c4282d64fa04ce37e73d6bdec60c524 Text-delta-base-sha1: 5973595d19ae351336d41a6b41ff412ceab0201a Text-content-length: 232 Text-content-md5: 908a1de67dcf4ee4e6d1e2335284aab5 Text-content-sha1: 4c0faa300e66ca062857d4e7708e19e740e02687 Content-length: 232 SVN��L�d�L�X0 strcmp(argv[i], "-?") == 0 || strcmp(argv[i], "--help") == 0) { usage(); } else if (strcmp(argv[i], "-V") == 0 || strcmp(argv[i], "--version Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0a335e83e13e415a00546035a513668b Text-delta-base-sha1: 7202c95c01c6a9ab3089abdcfe9f1d4aa7b7411a Text-content-length: 127 Text-content-md5: d6deee21b20282d5499e77a8d12ed119 Text-content-sha1: 5cd261cca4e1fc42cd4011bbce8b201adcd5205e Content-length: 127 SVN��-_�h��*a�) || strcmp(argv[i], "--help || strcmp(argv[i], "--version Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6e298e9419f4e449bebaf6212d0c095a Text-delta-base-sha1: c44e109a25c4c701e67cae509a8f8f1fc8e9361e Text-content-length: 451 Text-content-md5: 1425819f4ec9b9b8431e4971a78645bb Text-content-sha1: 9b08da33e2b9982eedbc09773c7197b7de039b0b Content-length: 451 SVN�����1�K� jL�.[static void version(FILE *fp) { if(fprintf(fp, "%s: %s\n", appname, ver } else if(!strcmp(p, "-version") || !strcmp(p, "--version")) { version�0'ww�0�lhost, conf_get_int(inst->conf, CONF_tcp_nodelay), conf_get_int(inst->conf, CONF_tcp_keepalives)); if (error) { char *msg = dupprintf("Unable to open connection to %s:\n%s", conf_get_str(inst->conf, CONF_host), error Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7873642b996c6ff0838c3ef58cdcd68d Text-delta-base-sha1: fef5578c32e59444e3e01c2f4d24433416825f27 Text-content-length: 173 Text-content-md5: 76d330139bcb41ad382f9b4332758c82 Text-content-sha1: 918abb67f3b2afa6b0a712e2ca1be92af957e185 Content-length: 173 SVN�� ~�J��#f || !strcmp(p, "--version")) { version(); } else if (!strcmp(p, "--help")) { usage(); exit(0 Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e1730b5ad6d90477282c380c81a3eee Text-delta-base-sha1: 18ee585c7e611cebcc36dbc312c7713ddb213f86 Text-content-length: 143 Text-content-md5: 4f2c47c0a2b641f94d73947e287f0ddb Text-content-sha1: a1c371747d9ad886e2bf30e64fb9998cfe4eef69 Content-length: 143 SVN��& w�6�w�UQ || !strcmp(p, "--version")) { version(); } else if (!strcmp(p, "--help")) { usage Revision-number: 9674 Prop-content-length: 215 Content-length: 215 K 8 svn:date V 27 2012-09-19T22:12:00.922665Z K 7 svn:log V 116 Fix a stupid sign bug in run_timers() that broke Windows Plink (and should really have broken everything else too). K 10 svn:author V 3 ben PROPS-END Node-path: putty/timing.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da460bd4eaf6a5230ffd07e74e100ffc Text-delta-base-sha1: b80cb3355ad332a57a8467192c35212b0ed607bf Text-content-length: 87 Text-content-md5: c9b1dac128c04a8b0537ab6d9441e4d6 Text-content-sha1: b945540b7b4ae81c0f17e72a100c26d38e997070 Content-length: 87 SVN��;? A�e�A�"(first->when_set - 10) > first->now - (first->when_set - 10) Revision-number: 9675 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 44 Fix indentation mess in my timing overhaul. K 10 svn:author V 3 ben K 8 svn:date V 27 2012-09-19T22:16:30.284129Z PROPS-END Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4f2c47c0a2b641f94d73947e287f0ddb Text-delta-base-sha1: a1c371747d9ad886e2bf30e64fb9998cfe4eef69 Text-content-length: 129 Text-content-md5: d9d132c6e6e286729e5bf9373a3d35df Text-content-sha1: b33dedc1309db417475812ab51f444461227da30 Content-length: 129 SVN�� g��g� v then = now; now = GETTICKCOUNT(); if (now - then > next - then) ticks = 0; else Revision-number: 9676 Prop-content-length: 197 Content-length: 197 K 8 svn:date V 27 2012-09-19T22:17:10.238660Z K 7 svn:log V 99 Windows PSFTP has two places that call run_timers and I'd only updated one of them. Correct that. K 10 svn:author V 3 ben PROPS-END Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e3ba71e96a151138c79fa29d8c2225d6 Text-delta-base-sha1: 81d5d76bfe2cad685d5a0d723c9f9921dbe07064 Text-content-length: 292 Text-content-md5: 82d2cf1eb58cad06d807ca0a5ea0e514 Text-content-sha1: 7501f773e74778023c539f96173acc2687a26258 Content-length: 292 SVN��o+�;��CT^�'Hunsigned long now = GETTICKCOUNT(), thenunsigned long next; long ticks; struct timeval tv, *ptv; if (run_timers(now, &next)) { then = now; now = GETTICKCOUNT(); if (now - then > next - then) ticks = 0; else ticks = next - now; Revision-number: 9677 Prop-content-length: 884 Content-length: 884 K 8 svn:date V 27 2012-09-23T15:36:54.851559Z K 7 svn:log V 783 Clip the 'lines' parameter to scroll() at the size of the scroll window. scroll() iterates that many times, so this prevents a tedious wait if you give a very large parameter to ESC[L or ESC[M, for example. A side effect is that very large requests for upward scrolling in a context that affects the scrollback will not actually wipe out the whole scrollback: instead they push just the current lines of the screen into the scrollback, and don't continue on to fill it up with endless boring blank lines. I think this is likely to be more useful in general, since it avoids wiping out lots of useful scrollback data by mistake. I can imagine that people might have been using it precisely _to_ wipe the scrollback in some situations, but if so then they should use CSI 3 J instead. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e218aee450414474a70386e4b7514ea4 Text-delta-base-sha1: 0684fa034736df38f30341ea53ae69632d5df320 Text-content-length: 561 Text-content-md5: da7c82ebb8d6a65e304f58a5063abd7c Text-content-sha1: a9e7117a331aa086647a6f0890025ad5c6791825 Content-length: 561 SVN����$%�8��u81�Qe�N�Ln, scrollwinsize scrollwinsize = botline - topline + 1; if (lines < 0) { lines = -lines; if (lines > scrollwinsize) lines = scrollwinsize; while (lines-- > } } else { if (lines > scrollwinsize) lines = scrollwinsize; while (lines--�-sFF�-�e(term, term->esc_args[i], term->esc_query, TRUE); } break; case 'i': /* MC: Media copy */ case ANSI_QUE('i'): compatibility(VT100); { char *printer; Revision-number: 9678 Prop-content-length: 217 Content-length: 217 K 8 svn:date V 27 2012-09-28T15:53:44.775194Z K 7 svn:log V 116 Add '-p' option, to pipe incoming and outgoing socket data through a subprogram which can handle it as it sees fit. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxsocks.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ebe87985bd1cb330ff21a79b3af912f9 Text-delta-base-sha1: 8217bb371c4aee1b0f3f72fddfbae5273d46641f Text-content-length: 693 Text-content-md5: 2f304ed74098b8fba169f335414d03ff Text-content-sha1: 8b49061221a7c7dd201a539c6883231035f0cc2d Content-length: 693 SVN��+-|�3��M�c�4cZ�)�h*!� t, LOG_PIPE }; int logmode = LOG_NONE; char *pipecmd = NULL || logmode == LOG_PIPE else if (logmode == LOG_PIPE) { static int fileindex = 0; char *command; command = dupprintf("%s in %d", pipecmd, fileindex); c->infp = popen(command, "w"); sfree(command); command = dupprintf("%s out %d", pipecmd, fileindex); c->outfp = popen(command, "w"); sfree(command else if (logmode == LOG_PIPE) { if (c->infp) pclose(c->infp); if (c->outfp) p || logmode == LOG_PIPEp")) { logmode = LOG_PIPE; if (--argc > 0) { pipecmd = *++argv; } else { fprintf(stderr, "expected an argument to '-p'\n"); return 1; } Revision-number: 9679 Prop-content-length: 349 Content-length: 349 K 8 svn:date V 27 2012-10-02T19:31:33.604482Z K 7 svn:log V 248 Sumudu Fernando points out that in the big r9214 destabilisation I mistakenly rearranged the logic in an if statement in window.c, with the effect that scroll-wheel events are no longer sent via xterm mouse tracking. Put it back to the way it was. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 82bc1c9266a50cd61b272c6a6cdd81c7 Text-delta-base-sha1: 1778a39eb2bb7a0d7fc2e87d054d3a7eba908dd2 Text-content-length: 152 Text-content-md5: 4d3de5667a470b95b5d3c1e04f325661 Text-content-sha1: e1a6197563073c6ab74687897bdcd9e781a532e1 Content-length: 152 SVN���� W�K�W�^ !(conf_get_int(conf, CONF_mouse_override) && shift_pressed�|�|�directbuf, len, lpDx_m Revision-number: 9680 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9681 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9682 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9683 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9684 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9685 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9686 Prop-content-length: 251 Content-length: 251 K 7 svn:log V 150 A user points out that we should free the 'hProcess' and 'hThread' handles returned in the PROCESS_INFORMATION structure after we call CreateProcess. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-10-10T18:29:16.751304Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4d3de5667a470b95b5d3c1e04f325661 Text-delta-base-sha1: e1a6197563073c6ab74687897bdcd9e781a532e1 Text-content-length: 208 Text-content-md5: df9b75900965d220a03d7d0344b6ba00 Text-content-sha1: 152398819f4938d643f4753ba635e967587ad5d3 Content-length: 208 SVN����P�:�P�v7 CloseHandle(pi.hProcess); CloseHandle(pi.hThread�eSS�� LATTR_BOT) + text_adjust, ETO_CLIPPED, &line_box, Node-path: putty/windows/winproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ee6306dc58db4cdd615f1ab7b4d6d9fe Text-delta-base-sha1: 1ff780515e74a2c24f6778d20312a4c79c623883 Text-content-length: 77 Text-content-md5: fa1eb0e6abe50d644258a54247d3fe82 Text-content-sha1: 634b50e5760d331180291af647f5c35dfd977755 Content-length: 77 SVN��c 8� ��F CloseHandle(pi.hProcess); CloseHandle(pi.hThread Revision-number: 9687 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Add timestamps to the 'SSH raw data' logging mode. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-10-10T18:32:23.229378Z PROPS-END Node-path: putty/logging.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5033afc067ca158337c29f2ab177683e Text-delta-base-sha1: 8ff57fa0ef6ab5df163721dcf47a9f91be689bd4 Text-content-length: 682 Text-content-md5: 9469d1917e227a8c186465c7a6b0d01f Text-content-sha1: bfd33a98ac9f3e6e728f169ad2d6df36da72c6e0 Content-length: 682 SVN��(S ���/y/* * Raw data is logged with a timestamp, so that it's possible * to determine whether a mysterious delay occurred at the * client or server end. (Timestamping the raw data avoids * cluttering the normal case of only logging decrypted SSH * messages, and also adds conceptual rigour in the case where * an SSH message arrives in several pieces.) */ char buf[256]; struct tm tm; tm = ltime(); strftime(buf, 24, "%Y-%m-%d %H:%M:%S", &tm); logprintf(ctx, "%s raw data at %s\r\n", direction == PKT_INCOMING ? "Incoming" : "Outgoing", buf Revision-number: 9688 Prop-content-length: 476 Content-length: 476 K 7 svn:log V 375 If you configure Unix PuTTY to use a proxy, tell it to even proxy localhost connections, and also enable X forwarding in such a way that it will attempt to connect to a Unix-domain X server socket, an assertion will fail when proxy_for_destination() tries to call sk_getaddr(). Fix by ensuring that Unix-domain sockets are _never_ proxied, since they fundamentally can't be. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-10-16T20:15:51.348636Z PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e746142572ca9e6a31f83634910e9d20 Text-delta-base-sha1: 5ad0f4a6ad1071fe3f56acd73ebeb115fe80e8b1 Text-content-length: 35 Text-content-md5: ee1b22bf46a21e9cb5bebff0a2f95223 Text-content-sha1: eb05e8b66fe8972c12bbd2f6ec69344cd14d9d42 Content-length: 35 SVN��L �|��BZess_is_special Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3ec86070744167b459cfbd6b140cdd60 Text-delta-base-sha1: dd841d6a5f4c5853e76de64e7e9902fefffae19b Text-content-length: 346 Text-content-md5: 3e99b07ed7ae7e903a1bd628e32f5821 Text-content-sha1: a6739421c53887c6da84b787354fd54b4acc29cb Content-length: 346 SVN��f ?�c�?�DSSpecial local connections such as Unix-domain sockets * unconditionally cannot be proxied, even in proxy-localhost * mode. There just isn't any way to ask any known proxy type for * them. */ if (addr && sk_address_is_special_local(addr)) return 0; /* do not proxy */ Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4a247bdb95a74e6406183527cb18214e Text-delta-base-sha1: 1f5fc396d1933caa194152545886a93089399635 Text-content-length: 100 Text-content-md5: 689a7c719ac391d73c2edfb1c28b9c78 Text-content-sha1: 62dc49fc327fd4892323af50575431bab060940f Content-length: 100 SVN��#} K�<�K�v-ess_is_special_local(SockAddr addr) { return addr->superfamily == UNIX; Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b986e274e89c50e20ae0809efd7cc32f Text-delta-base-sha1: 659f0b95a9fe7ad22d972390849d2cdc3d68646f Text-content-length: 160 Text-content-md5: ef54b84abfe50c5cf41b7912bef6a329 Text-content-sha1: 82a2bd64291529d8fa23fdc6f9ad236798b03b72 Content-length: 160 SVN��B=�V���q�hZess_is_special_local(SockAddr addr) { return 0; /* no Unix-domain socket analogue here */ } int sk_addrtype Revision-number: 9689 Prop-content-length: 517 Content-length: 517 K 8 svn:date V 27 2012-10-16T20:15:52.295198Z K 7 svn:log V 416 When a proxy negotiation function is called with PROXY_CHANGE_NEW, it should not call plug functions, because it's being called from within new_connection(), and the state on which the plug functions depend will not have been set up until new_connection() returns success. Instead, we set the error string in the Proxy_Socket, which will cause the same error message to be returned as a failure of new_connection(). K 10 svn:author V 5 simon PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3e99b07ed7ae7e903a1bd628e32f5821 Text-delta-base-sha1: a6739421c53887c6da84b787354fd54b4acc29cb Text-content-length: 102 Text-content-md5: e83ca4d9df86093ab9adda87ee3b3fec Text-content-sha1: 71d81744b7fc8f50b0d247d944468fb8a8a025ee Content-length: 102 SVN��fBK�4�K�C# p->error = "Proxy error: SOCKS version 4 does not support IPv6" Revision-number: 9690 Prop-content-length: 306 Content-length: 306 K 7 svn:log V 205 Windows's sk_address_is_local() was returning the wrong answers for IPv6 addresses, because I'd mistakenly cast an ai_addr to the low- level 'struct in6_addr' instead of the correct 'struct sockaddr_in6'. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-10-17T20:48:07.596242Z PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef54b84abfe50c5cf41b7912bef6a329 Text-delta-base-sha1: 82a2bd64291529d8fa23fdc6f9ad236798b03b72 Text-content-length: 80 Text-content-md5: 5daf7b35c44ffea7d4afc3132b08ef35 Text-content-sha1: 1531bc2ba5013fe081639d72311d3e8a692dd5f7 Content-length: 80 SVN��=O 6�@��Yd&((const struct sockaddr_in6 *)step.ai->ai_addr)->sin6 Revision-number: 9691 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9692 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9693 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9694 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9695 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9696 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9697 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9698 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9699 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9700 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9701 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9702 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9703 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9704 Prop-content-length: 692 Content-length: 692 K 8 svn:date V 27 2012-11-13T18:36:27.503356Z K 7 svn:log V 591 Add a fallback case to winsock_error_string() which makes it call FormatMessage to get the OS's text for any error not in our own translation table. Should eliminate the frustrating 'unknown error'. (I haven't chosen to use FormatMessage unconditionally, because it comes out with enormous messages along the lines of "No connection could be made because the target machine actively refused it" in place of "Connection refused" and I'm Unixy enough to prefer the latter. Also, on older Windowses, Winsock error codes are in a separate API segment and don't work with FormatMessage anyway.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5daf7b35c44ffea7d4afc3132b08ef35 Text-delta-base-sha1: 1531bc2ba5013fe081639d72311d3e8a692dd5f7 Text-content-length: 2423 Text-content-md5: 101aa805c3804f18ebe89dd031d74a03 Text-content-sha1: 96c461ef9961375b37115333842f580aa16d32f8 Content-length: 2423 SVN��OKT�5�2�\"�('struct errstring { int error; char *text; }; static int errstring_find(void *av, void *bv) { int *a = (int *)av; struct errstring *b = (struct errstring *)bv; if (*a < b->error) return -1; if (*a > b->error) return +1; return 0; } static int errstring_compare(void *av, void *bv) { struct errstring *a = (struct errstring *)av; return errstring_find(&a->error, bv); } static tree234 *errstrings = NULL; char *winsock_error_string(int error) { const char prefix[] = "Network error: "; struct errstring *es; /* * Error codes we know about and have historically had reasonably * sensible error messages for. */} /* * Generic code to handle any other error. * * Slightly nasty hack here: we want to return a static string * which the caller will never have to worry about freeing, but on * the other hand if we call FormatMessage to get it then it will * want to either allocate a buffer or write into one we own. * * So what we do is to maintain a tree234 of error strings we've * already used. New ones are allocated from the heap, but then * put in this tree and kept forever. */ if (!errstrings) errstrings = newtree234(errstring_compare); es = find234(errstrings, &error, errstring_find); if (!es) { int bufsize, bufused; es = snew(struct errstring); es->error = error; /* maximum size for FormatMessage is 64K */ bufsize = 65535 + sizeof(prefix); es->text = snewn(bufsize, char); strcpy(es->text, prefix); bufused = strlen(es->text); if (!FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS), NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), es->text + bufused, bufsize - bufused, NULL)) { sprintf(es->text + bufused, "Windows error code %d (and FormatMessage returned %d)", error, GetLastError()); } else { int len = strlen(es->text); if (len > 0 && es->text[len-1] == '\n') es->text[len-1] = '\0'; } es->text = sresize(es->text, strlen(es->text) + 1, char); add234(errstrings, es); } return es->text; Revision-number: 9705 Prop-content-length: 425 Content-length: 425 K 8 svn:date V 27 2012-11-13T21:34:12.756813Z K 7 svn:log V 324 When manually initialising a 'struct RSAKey' due to loading an SSH1 public key but not the private half, NULL out all the CRT-optimisation fields as well as the private exponent pointer. Otherwise segfaults - security-harmless, but annoying - can happen in freersakey() when we notice they aren't null and try to free them. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60c68c0740c78ea5aad33fdc678ad2c5 Text-delta-base-sha1: 7e21f5224110cab5b212277e7b71739e311adf27 Text-content-length: 82 Text-content-md5: 8ee4902596a763d88fc6f353317ef091 Text-content-sha1: 7459a082088263abd2bc2c64a0bb714137bbd902 Content-length: 82 SVN��U 8��� ssh1key->p = NULL; ssh1key->q = NULL; ssh1key->iqmp Revision-number: 9706 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9707 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9708 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2012-11-14T18:32:09.307319Z K 7 svn:log V 211 Fix another error-reporting bug, in which sk_newlistener would fail to capture the error code if listen() returned an error, and instead pass 0 (saved from the previous successful bind) to winsock_error_string. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 101aa805c3804f18ebe89dd031d74a03 Text-delta-base-sha1: 96c461ef9961375b37115333842f580aa16d32f8 Text-content-length: 80 Text-content-md5: 3340b7933ff650f18787f62db3792f61 Text-content-sha1: 876df1cc82dcdfd385ef824d026186164278a916 Content-length: 80 SVN��K[1�I��.�Lp_WSAGetLastError()); return (Socket) ret; } Revision-number: 9709 Prop-content-length: 122 Content-length: 122 K 8 svn:date V 27 2012-11-17T11:04:50.223814Z K 7 svn:log V 23 Copy of WinRT blather. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/winrt Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1195 Text-content-md5: cbdd179e93218d02825f36fd71a12043 Text-content-sha1: fe158ff0f0e090f48e46d66a625b0b93eb0953f1 Content-length: 1205 PROPS-END SVN���Summary: Port PuTTY to Windows RT (aka Metro) Class: wish Difficulty: tricky Priority: medium Content-type: text/plain Various people have asked us for a port of PuTTY to Windows RT so that it could run on the "Metro" side of Windows 8 and thus on Microsoft's ARM-based "Surface" tablets. A WinRT port of PuTTY would be a lot of work. The platform independent code would probably work mostly unmodified, but you would have to implement all the platform-specific parts of PuTTY (the networking abstraction, user input, terminal display and settings GUI) in terms of the WinRT API. Not impossible, and probably easier with PuTTY than with many other applications, but still a lot of work. Also, all applications to work on ARM WinRT devices have to be certified by Microsoft and have to be `sold' through the Windows App Store. That's likely to be a lot of faff, and Microsoft would probably want to gouge some money from us for the privilege. (Also I wouldn't bet on a PuTTY port passing any kind of MS certification.) It's something we'd like to see, but there's nothing imminently happening. For one thing none of us has a Windows 8 box of any CPU persuasion at all yet! Revision-number: 9710 Prop-content-length: 115 Content-length: 115 K 8 svn:date V 27 2012-11-17T11:10:07.589857Z K 7 svn:log V 16 Stub for ECDSA. K 10 svn:author V 4 owen PROPS-END Node-path: putty-wishlist/data/ecdsa Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 293 Text-content-md5: f7911001298d55befede79b7d021e018 Text-content-sha1: 88ee62a3b10220b59883579cac6749cb3f71e003 Content-length: 303 PROPS-END SVN���Summary: Support for ECDSA keys in PuTTY and PuTTYgen Class: wish Difficulty: tricky Priority: medium Content-type: text/plain PuTTY does not currently support ECDSA keys. It probably should. The only niggle I (OSD) have is that I'm not 100% sure what the patent situation is. Revision-number: 9711 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9712 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9713 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9714 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9715 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9716 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9717 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9718 Prop-content-length: 198 Content-length: 198 K 8 svn:date V 27 2012-12-02T15:23:10.931448Z K 7 svn:log V 98 This seems as good a place as any to note reported compatibility with the "desktop" side of Win8. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/winrt Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cbdd179e93218d02825f36fd71a12043 Text-delta-base-sha1: fe158ff0f0e090f48e46d66a625b0b93eb0953f1 Text-content-length: 451 Text-content-md5: 82473e20ed637821ab47245799dc9117 Text-content-sha1: 974f17ca60a6dfe603e0a1d49bb0e784b1cc5481 Content-length: 451 SVN��M0��0(This isn't to say that the existing PuTTY cannot run on the "desktop" side of Windows 8 on Intel systems; as far as we know this should be fine. A couple of people have reported that the Windows 8 "compatibility wizard" or some such is flagging PuTTY as incompatible with Windows 8. We don't know what this is about; the same people who've reported this have gone on to use PuTTY regardless, without noticing any actual problems.) Revision-number: 9719 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9720 Prop-content-length: 294 Content-length: 294 K 7 svn:log V 193 Patch from Hideki Eiraku to make PuTTY call GetScrollInfo, so it can use 32-bit scrollbar position data instead of being limited to the 16-bit version that comes in scrollbar messages' wParam. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-12-04T20:53:19.962696Z PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: df9b75900965d220a03d7d0344b6ba00 Text-delta-base-sha1: 152398819f4938d643f4753ba635e967587ad5d3 Text-content-length: 592 Text-content-md5: e9e6aacf8ca7ca3f56038b1abf74932c Text-content-sha1: 4f96690a464ecf629bdd04cc01a2df0bbb285f54 Content-length: 592 SVN����4��4�K&/* * Use GetScrollInfo instead of HIWORD(wParam) to get * 32-bit scroll position. */ { SCROLLINFO si; si.cbSize = sizeof(si); si.fMask = SIF_TRACKPOS; if (GetScrollInfo(hwnd, SB_VERT, &si) == 0) si.nTrackPos = HIWORD(wParam); term_scroll(term, 1, si.nTrackPos); }�et gg�c@�*; * or -1 for this shift depending on if the leftmost * column is blank... */ ExtTextOut(hdc, x + xoffset - 1, y - font_height * (lattr == Revision-number: 9721 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9722 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9723 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9724 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9725 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9726 Prop-content-length: 648 Content-length: 648 K 8 svn:date V 27 2012-12-17T08:40:33.481994Z K 7 svn:log V 547 Add a bounds check in the word-by-word selection code to prevent attempting to call lineptr() with a y-coordinate off the bottom of the screen and triggering the dreaded 'line==NULL' message box. This crash can only occur if the bottommost line of the screen has the LATTR_WRAPPED flag set, which as far as I can see you can only contrive by constructing a LATTR_WRAPPED line further up the screen and then moving it down using an insert-line escape sequence. That's probably why this bug has been around forever without anyone coming across it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da7c82ebb8d6a65e304f58a5063abd7c Text-delta-base-sha1: a9e7117a331aa086647a6f0890025ad5c6791825 Text-content-length: 120 Text-content-md5: 21f969be933aa759916eaec6619b4b76 Text-content-sha1: d9a98a957c390f7063a1f18d82d8bf5652209c4c Content-length: 120 SVN���������s$M� �M�7<p.y+1 < term->rows && (ldata->lattr & LATTR_WRAPPED) Revision-number: 9727 Prop-content-length: 432 Content-length: 432 K 7 svn:log V 331 Use O_NOCTTY (if available) when opening /dev/ptmx, just in case any OS doesn't automatically assume it. (It would seem faintly weird to me - surely opening the master end of a given pty is a fairly good indication that you're _not_ a process running inside it which wants to have it available as /dev/tty! But you never know...) K 10 svn:author V 5 simon K 8 svn:date V 27 2012-12-18T09:02:38.220506Z PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a304bf6657f0606e97e97f752acd6a56 Text-delta-base-sha1: 31b294db2f4ddb4e55ce8cfc936c9c4916dfd7e3 Text-content-length: 152 Text-content-md5: 7fcbf121d28cafce0affd076c5d17512 Text-content-sha1: 0720d9fce73326f7fc6a1062a61f8d9d2894bc09 Content-length: 152 SVN��h: �I��rv const int flags = O_RDWR #ifdef O_NOCTTY | O_NOCTTY #endif ; pty->master_fd = open("/dev/ptmx", flags Revision-number: 9728 Prop-content-length: 377 Content-length: 377 K 10 svn:author V 5 simon K 8 svn:date V 27 2012-12-18T09:02:38.929071Z K 7 svn:log V 276 Patch from Brad Smith to use posix_openpt() instead of open("/dev/ptmx"), where the former is available. Improves portability, since at least one OS (OpenBSD) supports the POSIX pty functions but does it via an underlying mechanism which doesn't involving having a /dev/ptmx. PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f8778e37716b90eb5db3310bfd3b776 Text-delta-base-sha1: 034c99dcec729f92c201ea657202ecc964566261 Text-content-length: 32 Text-content-md5: 8aa2c7ca9e2c0ea0dda62284c98567e9 Text-content-sha1: 328c6aa7fc45cb91302cd37b04564b8bfdfb9beb Content-length: 32 SVN��1> �w��<uosix_openpt Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7fcbf121d28cafce0affd076c5d17512 Text-delta-base-sha1: 0720d9fce73326f7fc6a1062a61f8d9d2894bc09 Text-content-length: 182 Text-content-md5: 65458070837f559cb100322e9366106f Text-content-sha1: 09dc480b3c68ab667abdadef6cb709c7e440e692 Content-length: 182 SVN��:R���{�%#ifdef HAVE_POSIX_OPENPT pty->master_fd = posix_openpt(flags); if (pty->master_fd < 0) { perror("posix_openpt"); exit(1); } #else#endif Revision-number: 9729 Prop-content-length: 320 Content-length: 320 K 8 svn:date V 27 2012-12-18T09:19:04.726912Z K 7 svn:log V 219 Switch round a bogus if statement I've just noticed. Both the write to pty_utmp_helper_pipe _and_ the close of it if we're not going to write should be conditionalised on the pipe existing, rather than just the former! K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 65458070837f559cb100322e9366106f Text-delta-base-sha1: 09dc480b3c68ab667abdadef6cb709c7e440e692 Text-content-length: 840 Text-content-md5: e9b350c73703655c6efb8d03603a5eaa Text-content-sha1: a2002f98aae1e8d2c310aa94a0c4eb8bd6ba1d93 Content-length: 840 SVN��R>,�R�,�@pty_utmp_helper_pipe >= 0) { /* if it's < 0, we can't anyway */ if (!conf_get_int(conf, CONF_stamp_utmp)) { close(pty_utmp_helper_pipe); /* just let the child process die */ pty_utmp_helper_pipe = -1; } else { char *location = get_x_display(pty->frontend); int len = strlen(location)+1, pos = 0; /* +1 to include NUL */ while (pos < len) { int ret = write(pty_utmp_helper_pipe, location+pos, len - pos); if (ret < 0) { perror("pterm: writing to utmp helper process"); close(pty_utmp_helper_pipe); /* arrgh, just give up */ pty_utmp_helper_pipe = -1; break; } pos += ret; } Revision-number: 9730 Prop-content-length: 729 Content-length: 729 K 7 svn:log V 628 Ronald Landheer-Cieslak points out that the various back ends which treat all socket closures as clean exits (because the protocol doesn't provide for transferring a process exit code) could usefully at least treat _socket errors_ as unclean exits. Patch the Telnet, Rlogin and Raw backends to retain that information and return INT_MAX to the frontend. I wasn't sure whether it was better to solve this by modifying each affected frontend, or each affected backend. Neither is really ideal; this is the sort of thing that makes me wish we had a piece of fixed middleware in between, independent of both platform and protocol. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-12-22T09:40:47.460684Z PROPS-END Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 628ece2c2ed9d784376ff62d56d6dbdd Text-delta-base-sha1: 6231949a9c02488a8bae85cc4a1e3ad19f196bfe Text-content-length: 257 Text-content-md5: 10526770ea1f8cae3c35fe918cbef4d4 Text-content-sha1: 47ec7f8b8408ee84bb2bf05f3ebf6a3cdc3b44d2 Content-length: 257 SVN��Y[!T�A��=�Q�H�rIi�*/#include <limitsclosed_on_socket_errorraw->closed_on_socket_error = TRUEraw->closed_on_socket_error = FALSE if (raw->closed_on_socket_error) return INT_MAX; /* a socket error counts as an unclean exit Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a80ea81746bb37a6e185437ac769841 Text-delta-base-sha1: e3e3c5ce9670ab4ccfb7291fc84b12372c6b0f53 Text-content-length: 284 Text-content-md5: bbcc3355ad5915991ebac78bb92b273e Text-content-sha1: 7f46cdd1b9b249d07bb832314ae06a55e8446199 Content-length: 284 SVN��*L"n�L��.>�:bH�:�|Fl�t6limitsclosed_on_socket_error if (error_msg) rlogin->closed_on_socket_error = TRUEclosed_on_socket_error = FALSE if (rlogin->closed_on_socket_error) return INT_MAX; /* a socket error counts as an unclean exit Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b3da6ad8e804ee21ae49ed96a4290c2 Text-delta-base-sha1: fc9356002e292e50f65d1263531529b5f157adbe Text-content-length: 307 Text-content-md5: 9159d750f7580ba5c8f17fa732294f81 Text-content-sha1: 0aedb6804e5d410f45ab6f15fdfa58ecb9a39af2 Content-length: 307 SVN��;%��B��3>�oH�"o�;l�g2#include <limits int closed_on_socket_error if (error_msg) telnet->closed_on_socket_error = TRUEclosed_on_socket_error = FALSE if (telnet->closed_on_socket_error) return INT_MAX; /* a socket error counts as an unclean exit Revision-number: 9731 Prop-content-length: 302 Content-length: 302 K 8 svn:date V 27 2012-12-22T18:09:02.141098Z K 7 svn:log V 201 Fix two gcc warnings about confused printf format strings in the bignum code's test harness. Thanks to Sup Yut Sum for fixing this in TortoisePlink and Sven Strickroth for bringing it to my attention. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 52049d5aca4f8db90b425b6d8b055184 Text-delta-base-sha1: 386614c1a64d43dec9fc048b89e18017935390f4 Text-content-length: 58 Text-content-md5: 46fc2220d1b88de8addedff7b25dd130 Text-content-sha1: 2c80432c8fdacdccffdf65dbe4f85ed8a54f2022 Content-length: 58 SVN��~���B�"\, ptrnum4\n", line, ptrnum Revision-number: 9732 Prop-content-length: 160 Content-length: 160 K 7 svn:log V 60 Update the suggested compile command in sshbn.c's test rig. K 10 svn:author V 5 simon K 8 svn:date V 27 2012-12-22T18:10:08.288810Z PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 46fc2220d1b88de8addedff7b25dd130 Text-delta-base-sha1: 2c80432c8fdacdccffdf65dbe4f85ed8a54f2022 Text-content-length: 106 Text-content-md5: d4459a76baa6c08dd4543633670c5d12 Text-content-sha1: 5442b02103ff66f96936270e41e40f3d97eb031e Content-length: 106 SVN��7 P�t�P�sWall -g -O0 -DTESTBN -o testbn sshbn.c misc.c conf.c tree234.c unix/uxmisc.c -I. Revision-number: 9733 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9734 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9735 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9736 Prop-content-length: 774 Content-length: 774 K 8 svn:date V 27 2013-01-07T19:08:33.321963Z K 7 svn:log V 673 Move the -I options for all our source subdirectories out of AM_CFLAGS and into AM_CPPFLAGS. This is more conceptually sensible according to my reading of the automake manual, and also has the specific desirable effect that they move to the front of the command line, ahead of any 'system' type -I options that autoconf might have felt a need for. A user reported that autoconf had added -I/usr/local/include to their command line for the sake of a required header file, but their /usr/local/include also turned out to include a thing called 'proxy.h' (from libproxy, nothing to do with us) which shadowed our own proxy.h and caused a build failure. This should fix that. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 14c5a9a28b9df726fcff995ee86fc86e Text-delta-base-sha1: dfe4df90bd290e12496b2c8fff8d043b194d011e Text-content-length: 196 Text-content-md5: 849194ba994229db9704992f271c01ab Text-content-sha1: b2710b3c5fca3e4084f44ce63ff6d89512a9825e Content-length: 196 SVN��^(�q�(�EIprint &splitline(join " ", "AM_CPPFLAGS", "=", map {"-I$dirpfx$_"} @srcdirs), "\n"; @amcflags = ("\$(COMPAT)", "\$(XFLAGS)", "\$(WARNINGOPTS)" Revision-number: 9737 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9738 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9739 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9740 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9741 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9742 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9743 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9744 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9745 Prop-content-length: 484 Content-length: 484 K 8 svn:date V 27 2013-01-13T21:59:10.796804Z K 7 svn:log V 383 Reorganise setup_fonts_ucs so that in case of error it does nothing and returns its error message as a string, instead of actually printing it on standard error and exiting. Now we can preserve the previous error behaviour when we get a nonexistent font name at startup time, but no longer rudely terminate in mid-session if the user configures a bogus font name in Change Settings. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e684afa45a036135b3597af73ca15eda Text-delta-base-sha1: c13272922200fe831de709f841bf18dcca2407db Text-content-length: 36 Text-content-md5: bba69f563b26f0c8f5b56b26c4b01969 Text-content-sha1: fe736fc80cad6f8cf0086e0ff5cef580d9e9012a Content-length: 36 SVN���������:3 ����% Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1425819f4ec9b9b8431e4971a78645bb Text-delta-base-sha1: 9b08da33e2b9982eedbc09773c7197b7de039b0b Text-content-length: 3207 Text-content-md5: 9798b8d6ed3c69b948dfcb6699cfc8fa Text-content-sha1: d874b359ff28e38f1de7e1ec8ad6b376c10c7728 Content-length: 3207 SVN����Jg���@ �GR4�ca7�\de�zc�_�!q�X 7�q<define MAY_REFER_TO_GTK_IN_HEADERSchar * unifont *fonts[4]; int i; fs = conf_get_fontspec(inst->conf, CONF_font); fonts[0] = multifont_create(inst->area, fs->name, FALSE, FALSE, shadowboldoffset, shadowbold); if (!fonts[0]) { return dupprintf("unable to load font \"%s\"", fs->name); } fs = conf_get_fontspec(inst->conf, CONF_boldfont); if (shadowbold || !fs->name[0]) { fonts[1] = NULL; } else { shadowboldoffset, shadowbold); if (!fonts[1]) { if (fonts[0]) unifont_destroy(fonts[0]); return dupprintf("unable to load bold font \"%s\"", fs->namefonts[2] = multifont_create(inst->area, fs->name, TRUE, FALSE, shadowboldoffset, shadowbold); if (!fonts[2]) { for (i = 0; i < 2; i++) if (fonts[i]) unifont_destroy(fonts[i]); return dupprintf("%s: unable to load wide font \"%s\"", fs->name); } } else { fonts[3] = NULL; } else { fonts[3] = multifont_create(inst->area, fs->name, TRUE, TRUE, shadowboldoffset, shadowbold); if (!fonts[3]) { for (i = 0; i < 3; i++) if (fonts[i]) unifont_destroy(fonts[i]); return dupprintf("%s: unable to load wide bold font \"%s\"", fs->name); } } /* * Now we've got past all the possible error conditions, we can * actually update our state. */ for (i = 0; i < 4; i++) { if (inst->fonts[i]) unifont_destroy(inst->fonts[i]); inst->fonts[i] = fonts[i]; return NULLneed_size = FALSE;char *errmsg = setup_fonts_ucs(inst); if (errmsg) { char *msgboxtext = dupprintf("Could not change fonts in terminal window: %s\n", errmsg); messagebox(inst->window, "Font setup error", msgboxtext, string_width("Could not change fonts in terminal window:"), "OK", 'o', +1, 1, NULL); sfree(errmsg); } else { need_size = TRUE; } }�'(y�Ou ��$�v1FUNC(special_menuitem), inst); break; } if (menuitem) { gtk_container_add(GTK_CONTAINER(menu), menuitem); gtk_widget_show(menuitem); } } gtk_widget_show(inst->specialsitem1); gtk_widget_show(inst->specialsitem2); } else { } } static void start_backend(struct gui_data *inst) { extern Backend *select_backend(Conf *conf); char *realhost; const char *error; char *s; inst->back = select_backend(inst->conf); error = inst->back->init((void *)inst, &inst->backhandle, inst->conf, conf_get_str(inst->conf, CONF_host), conf_get_int(inst->conf, CONF_port), &rea{ char *errmsg = setup_fonts_ucs(inst); if (errmsg) { fprintf(stderr, "%s: %s\n", appname, errmsg); exit(1); } } Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db846e539ab3b0db6737f6c334018adc Text-delta-base-sha1: 1a8ea6056bc8d4fa6e66e76f8510a90d4fcc5f9b Text-content-length: 174 Text-content-md5: 95bc3a7f85ad19d8e176f2d87cc4bb16 Text-content-sha1: fe396761c5532830746619cbfd85ced4d253e7a7 Content-length: 174 SVN��% ��� #ifdef MAY_REFER_TO_GTK_IN_HEADERS int messagebox(GtkWidget *parentwin, char *title, char *msg, int minwid, ...); int string_width(char *text); #endif Revision-number: 9746 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9747 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9748 Prop-content-length: 278 Content-length: 278 K 8 svn:date V 27 2013-01-19T17:17:44.738979Z K 7 svn:log V 177 Adjust comments around split_into_argv() to clarify that it's not *Windows's* command-line splitting rules we're mimicking here; it's VC7's, and they're not the same as VC10's. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winutils.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c2f8d97050bbaa081dc303c605a597bc Text-delta-base-sha1: ee56f35e65bdd41de0209ddc30985a92fa6f91c1 Text-content-length: 942 Text-content-md5: 634ed7d2353553ebbd08ec2c7308f6f8 Text-content-sha1: c34a89bb793335016902875df11ce66c777fbc63 Content-length: 942 SVN��/  �Y�:�6fR�nA it * exactly the same way the Visual Studio C library would do it (so * that our console utilities, which receive argc and argv already * broken apart by the C library, will have their command lines * processed in the same way as the GUI utilities which get a whole * command line and must call this functionThese argument-breaking rules apply to Visual Studio 7, which * is currently the compiler expected to be used for PuTTY. Visual * Studio 10 has different rules, lacking the curious mod 3 * behaviour of consecutive quotes described below; I presume they * fixed a bug. As and when we migrate to a newer compiler, we'll * have to adjust this to match; however, for the moment we * faithfully imitate in our GUI utilities what our CLI utilities * can't be prevented from doing. * * When I investigated this, at first glance the rules appeared to * Revision-number: 9749 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9750 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9751 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9752 Prop-content-length: 448 Content-length: 448 K 10 svn:author V 5 simon K 8 svn:date V 27 2013-01-23T22:59:17.834186Z K 7 svn:log V 347 Patch from Egmont Koblinger to implement two extended variants of xterm mouse tracking, both supported by the current up-to-date xterm (288). They take the form of two new DEC terminal modes, 1006 and 1015, which do not in themselves _enable_ mouse tracking but they modify the escape sequences sent if mouse tracking is enabled in the usual way. PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 21f969be933aa759916eaec6619b4b76 Text-delta-base-sha1: d9a98a957c390f7063a1f18d82d8bf5652209c4c Text-content-length: 1491 Text-content-md5: 9aeba01a2dfab696b30437490f7dfc1b Text-content-sha1: be6d14755dfe969983addb876ac3d9ee50a09b86 Content-length: 1491 SVN����|�f��VD� Qterm->xterm_extended_mouse = 0; term->urxvt_extended06: /* xterm extended mouse */ term->xterm_extended_mouse = state ? 1 : 0; break; case 1015: /* urxvt extended mouse */ term->urxvt_extended_mouse = state ? 1 : 0�$.x9� +�@5�Rxt�d>�70�OU else if (term->esc_args[0] == 5) { ldisc_send(term->ldisc, "\033[0n", 4, 0); } } break; case 'h': /* SM: toggle modes to high */ case ANSI_QUE('h32]; int len = 000; /* left button down */ break; case MBT_MIDDLE: encstate = 0x01; break; case MBT_RIGHT: encstate = 0x02; break; case MBT_WHEEL_UP: encstate = 0x40; break; case MBT_WHEEL_DOWN: encstate = 0x4/* If multiple extensions are enabled, the xterm 1006 is used, so it's okay to check for only that */ if (!term->xterm_extended_mouse) encstate = 0x01; c = x + 1; /* Check the extensions in decreasing order of preference. Encoding the release event above assumes that 1006 comes first. */ if (term->xterm_extended_mouse) { len = sprintf(abuf, "\033[<%d;%d;%d%c", encstate, c, r, a == MA_RELEASE ? 'm' : 'M'); } else if (term->urxvt_extended_mouse) { len = sprintf(abuf, "\033[%d;%d;%dM", encstate + 32, c, r); } else if (c <= 223 && r <= 223) { len = sprintf(abuf, "\033[M%c%c%c", encstate + 32, c + 32, r + 32); } ldisc_send(term->ldisc, abuf, len Node-path: putty/terminal.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6da8a73f37dfa7378a03f6674a543ef3 Text-delta-base-sha1: 4fb0792657ab22dffe75f278af65aa23ed7446dd Text-content-length: 72 Text-content-md5: 8d0f19a8d3f21b458ba15cd12159cd32 Text-content-sha1: c5da79483ac588d0872bc91e206493d7df409a91 Content-length: 72 SVN��V 3�(��{xterm_extended_mouse; int urxvt_extended_mouse; Revision-number: 9753 Prop-content-length: 121 Content-length: 121 K 8 svn:date V 27 2013-02-08T09:20:00.808180Z K 7 svn:log V 22 Update cryptolaw URL. K 10 svn:author V 4 owen PROPS-END Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ed13f4c0f4171a5c9283f04da758eb45 Text-delta-base-sha1: 96ae2d8b195062c0e3300494c466fc1d96419f8a Text-content-length: 38 Text-content-md5: e97fe7c4106133a396fe875669f67d68 Text-content-sha1: 731ba1d1df74456de0418a3cfaa0c4986b10b4af Content-length: 38 SVN��5( �(��oFwww.cryptolaw.org Revision-number: 9754 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 30 Another cryptolaw URL change. K 10 svn:author V 4 owen K 8 svn:date V 27 2013-02-08T09:21:53.000814Z PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a638de38b5af7f2272747911f35fe23e Text-delta-base-sha1: 52f828a3616922e1fa81e422e65ef72b143cc965 Text-content-length: 41 Text-content-md5: f13412c335c28ccf12613834f9404c30 Text-content-sha1: bd80f6a7345646f7cbb3d2476a9ed6ffd193e11e Content-length: 41 SVN��i\ ���54www.cryptolaw.org Revision-number: 9755 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9756 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9757 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9758 Prop-content-length: 179 Content-length: 179 K 8 svn:date V 27 2013-02-20T22:37:34.727495Z K 7 svn:log V 81 Take advantage of PUT_32BIT_MSB_FIRST when constructing sequence numbers to MAC. K 10 svn:author V 3 ben PROPS-END Node-path: putty/sshmd5.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f48a6a1a52fd3700c4c3d1d3c3273e3a Text-delta-base-sha1: a59d508db5c78cd45d15719bcb73912453986277 Text-content-length: 54 Text-content-md5: 5cf50f408e838f1d3ac9c15a012f06e9 Text-content-sha1: 919be229a45196105c5fd73f969b78e4d6be968b Content-length: 54 SVN��yM !�`��L-PUT_32BIT_MSB_FIRST(seqbuf, seq); Node-path: putty/sshsha.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c85862a8656b84911534b165a0ab3d6 Text-delta-base-sha1: dd66874d077415d8f047df032cde27f7918136cf Text-content-length: 54 Text-content-md5: 53c86c5c5e10038f642cfb595bb55bac Text-content-sha1: c5bb7ce8de6c7d729221c494b11470e3f20cca8a Content-length: 54 SVN��\0 !���LPUT_32BIT_MSB_FIRST(seqbuf, seq); Revision-number: 9759 Prop-content-length: 436 Content-length: 436 K 8 svn:date V 27 2013-02-20T23:30:55.979483Z K 7 svn:log V 337 Add support for HMAC-SHA-256 as an SSH-2 MAC algorithm ("hmac-sha2-256") as specified in RFC 6668. This is not so much because I think it's necessary, but because scrypt uses HMAC-SHA-256 and once we've got it we may as well use it. Code very closely derived from the HMAC-SHA-1 code. Tested against OpenSSH 5.9p1 Debian-5ubuntu1. K 10 svn:author V 3 ben PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25a01b25798dc9d0bacf8fb17215b516 Text-delta-base-sha1: e54bd9b2ba95175a7e5378e8d557d3ca07ff8d24 Text-content-length: 132 Text-content-md5: d652c226dcac54489c57af9adc0c34eb Text-content-sha1: cdd2148974b85194c02edf7e0f00dcba4462eabe Content-length: 132 SVN���� �^��P256,����n�r *keystr = snewn(����n�quests it's never �;M�;� ssh_throttle_conn Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae0c79f3002686299c54927d70e2a61c Text-delta-base-sha1: 8d4a106a195537b7d8aacf366656a5cb7e19080a Text-content-length: 66 Text-content-md5: 0221c7f39448fdf718f03768ba00c8df Text-content-sha1: e06a911b6fc7e2ff57b350a2936afb8a01aca7cf Content-length: 66 SVN��r +�q��oextern const struct ssh_mac ssh_hmac_sha256 Node-path: putty/sshsh256.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f970f302a0af9ba4bad794149d6e1758 Text-delta-base-sha1: ad1aa049377befaedab623c7425710fda6d3a7e6 Text-content-length: 2845 Text-content-md5: 1f7fa63d4bc9c7499dcf74b69089e8ec Text-content-sha1: 7ba3be560d6b2c06e473b5d5b518e1a0232fb159 Content-length: 2845 SVN��i{ �8��>+/* ---------------------------------------------------------------------- * The above is the SHA-256 algorithm itself. Now we implement the * HMAC wrapper on it. */ static void *sha256_make_context(void) { return snewn(3, SHA256_State); } static void sha256_free_context(void *handle) { sfree(handle); } static void sha256_key_internal(void *handle, unsigned char *key, int len) { SHA256_State *keys = (SHA256_State *)handle; unsigned char foo[64]; int i; memset(foo, 0x36, 64); for (i = 0; i < len && i < 64; i++) foo[i] ^= key[i]; SHA256_Init(&keys[0]); SHA256_Bytes(&keys[0], foo, 64); memset(foo, 0x5C, 64); for (i = 0; i < len && i < 64; i++) foo[i] ^= key[i]; SHA256_Init(&keys[1]); SHA256_Bytes(&keys[1], foo, 64); smemclr(foo, 64); /* burn the evidence */ } static void sha256_key(void *handle, unsigned char *key) { sha256_key_internal(handle, key, 32); } static void hmacsha256_start(void *handle) { SHA256_State *keys = (SHA256_State *)handle; keys[2] = keys[0]; /* structure copy */ } static void hmacsha256_bytes(void *handle, unsigned char const *blk, int len) { SHA256_State *keys = (SHA256_State *)handle; SHA256_Bytes(&keys[2], (void *)blk, len); } static void hmacsha256_genresult(void *handle, unsigned char *hmac) { SHA256_State *keys = (SHA256_State *)handle; SHA256_State s; unsigned char intermediate[32]; s = keys[2]; /* structure copy */ SHA256_Final(&s, intermediate); s = keys[1]; /* structure copy */ SHA256_Bytes(&s, intermediate, 32); SHA256_Final(&s, hmac); } static void sha256_do_hmac(void *handle, unsigned char *blk, int len, unsigned long seq, unsigned char *hmac) { unsigned char seqbuf[4]; PUT_32BIT_MSB_FIRST(seqbuf, seq); hmacsha256_start(handle); hmacsha256_bytes(handle, seqbuf, 4); hmacsha256_bytes(handle, blk, len); hmacsha256_genresult(handle, hmac); } static void sha256_generate(void *handle, unsigned char *blk, int len, unsigned long seq) { sha256_do_hmac(handle, blk, len, seq, blk + len); } static int hmacsha256_verresult(void *handle, unsigned char const *hmac) { unsigned char correct[32]; hmacsha256_genresult(handle, correct); return !memcmp(correct, hmac, 32); } static int sha256_verify(void *handle, unsigned char *blk, int len, unsigned long seq) { unsigned char correct[32]; sha256_do_hmac(handle, blk, len, seq, correct); return !memcmp(correct, blk + len, 32); } const struct ssh_mac ssh_hmac_sha256 = { sha256_make_context, sha256_free_context, sha256_key, sha256_generate, sha256_verify, hmacsha256_start, hmacsha256_bytes, hmacsha256_genresult, hmacsha256_verresult, "hmac-sha2-256", 32, "HMAC- Revision-number: 9760 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9761 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9762 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9763 Prop-content-length: 266 Content-length: 266 K 8 svn:date V 27 2013-02-22T21:39:02.569593Z K 7 svn:log V 165 Give a better error message if a PuTTY private key file has a version number we don't understand. It's nicer to report 'format too new' than 'not a PuTTY key file'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ee4902596a763d88fc6f353317ef091 Text-delta-base-sha1: 7459a082088263abd2bc2c64a0bb714137bbd902 Text-content-length: 306 Text-content-md5: e58f6a4cdc3e86b1dab43b40b331aac5 Text-content-sha1: ebb2bd856c33cdc4a22e1901834c119568d62e7c Content-length: 306 SVN��Ua���5 if (ssh2blob) { ssh2algf = find_pubkey_alg(ssh2alg); if (ssh2algf) bits = ssh2algf->pubkey_bits(ssh2blob, ssh2bloblen); else bits = -1; } Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3262bb511beaa47c650395d233c09fc3 Text-delta-base-sha1: 85065dd793bef3bdbf51798d19612509aef8b44e Text-content-length: 405 Text-content-md5: 73fb447c11bb9f08894ebd81ae662b6b Text-content-sha1: 2345d428d1203e41b426acca443d5b32444ad840 Content-length: 405 SVN��A?r�A�k�w4�,if (0 == strncmp(header, "PuTTY-User-Key-File-", 20)) { /* this is a key file FROM THE FUTURE; refuse it, but with a * more specific error message than the generic one below */ error = "PuTTY key format too new"; goto error if (0 == strncmp(header, "PuTTY-User-Key-File-", 20)) error = "PuTTY key format too new"; else Revision-number: 9764 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2013-02-23T21:00:29.579770Z K 7 svn:log V 63 Don't forget to check the return values of setuid and friends. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e9b350c73703655c6efb8d03603a5eaa Text-delta-base-sha1: a2002f98aae1e8d2c310aa94a0c4eb8bd6ba1d93 Text-content-length: 412 Text-content-md5: 2dccea8232f28e33d4b2714472c01041 Text-content-sha1: d04a91249e6e818869ef5982996968fd46f574c0 Content-length: 412 SVN��>` � ��Uiif (setresgid(gid, gid, gid) < 0) { perror("setresgid"); exit(1); } if (setresuid(uid, uid, uid) < 0) { perror("setresuid"); exit(1); } #else if (setgid(getgid()) < 0) { perror("setgid"); exit(1); } if (setuid(getuid()) < 0) { perror("setuid"); exit(1); } Revision-number: 9765 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9766 Prop-content-length: 453 Content-length: 453 K 8 svn:date V 27 2013-02-24T19:28:13.035573Z K 7 svn:log V 352 Remove the half-hearted attempt to make the utmp helper process drop privileges just before dying of a fatal signal. I'm not sure what I intended it for in the first place; it certainly isn't doing its job properly (no setgid), it's causing compiler warnings due to not checking the setuid return code, and we can't think of any useful purpose for it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2dccea8232f28e33d4b2714472c01041 Text-delta-base-sha1: d04a91249e6e818869ef5982996968fd46f574c0 Text-content-length: 23 Text-content-md5: 1b9a00de2d54cf4ea975983a551c3cc9 Text-content-sha1: 0dccf1a3368ae4716a331dc5a5538aaeac3b8f65 Content-length: 23 SVN��`J ��C��Y Revision-number: 9767 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9768 Prop-content-length: 677 Content-length: 677 K 8 svn:date V 27 2013-03-10T11:04:07.689079Z K 7 svn:log V 576 Fix a bug in which terminal output received from the session could be buffered in terminal.c indefinitely and only released when further output turned up. Arose because we suppress the call to term_out from term_data if a drag-select is in progress, but when the drag-select ends we weren't proactively calling term_out to release the buffered data. So if your session generated some terminal output while you were in mid-select, _and had stopped by the time you let go of the mouse button_, then the output would just sit there until released by the next call to term_data. K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9aeba01a2dfab696b30437490f7dfc1b Text-delta-base-sha1: be6d14755dfe969983addb876ac3d9ee50a09b86 Text-content-length: 495 Text-content-md5: 8a89837784081f01524a06b812d7325c Text-content-sha1: 9c9161d6556f13220aa1e35c36700cf4e148f17d Content-length: 495 SVN���������[:�<�^�D7\�!s/* * Since terminal output is suppressed during drag-selects, we * should make sure to write any pending output if one has just * finished. */ if (term->selstate != DRAGGING) term_out(term); /* * Since terminal output is suppressed during drag-selects, we * should make sure to write any pending output if one has just * finished. */ if (term->selstate != DRAGGING) term_out Revision-number: 9769 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9770 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9771 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9772 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9773 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9774 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9775 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9776 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9777 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9778 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9779 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9780 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9781 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9782 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9783 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9784 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9785 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9786 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9787 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9788 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9789 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9790 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9791 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9792 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9793 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9794 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9795 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9796 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9797 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9798 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9799 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9800 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9801 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9802 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9803 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9804 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9805 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9806 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9807 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9808 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9809 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9810 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9811 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9812 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9813 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9814 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9815 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9816 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9817 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9818 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9819 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9820 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9821 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9822 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9823 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9824 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9825 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9826 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9827 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9828 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9829 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9830 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9831 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9832 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9833 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9834 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9835 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9836 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9837 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9838 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9839 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9840 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9841 Prop-content-length: 168 Content-length: 168 K 7 svn:log V 68 A bit more detail, plus a(nother) reason why might want to do this. K 10 svn:author V 5 jacob K 8 svn:date V 27 2013-05-18T16:43:46.101735Z PROPS-END Node-path: putty-wishlist/data/ecdsa Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f7911001298d55befede79b7d021e018 Text-delta-base-sha1: 88ee62a3b10220b59883579cac6749cb3f71e003 Text-content-length: 848 Text-content-md5: 2e325fac86f98b4da728c4cd88874895 Text-content-sha1: 12b87ad4e4eca8ea0acce97df3785005e0fd3526 Content-length: 848 SVN��7>�y�>x-html-body <p> <a href="http://tools.ietf.org/html/rfc5656">RFC 5656</a> defines elliptic-curve (ECDSA) key formats (host and user) for use with SSH-2, and associated ECDH key exchange methods. OpenSSH has supported these since 5.7. <p> PuTTY does not currently support these. It probably should. <p> The only niggle I (OSD) have is that I'm not 100% sure what the patent situation is. (Wikipedia has <a href="http://en.wikipedia.org/wiki/ECC_patents">some words</a> on the subject.) <p> A user reports <!-- comp.security.ssh 13fd429a-9909-47f9-834f-c9029f742793@googlegroups.com --> that the French government computing security agency <a href="http://www.ssi.gouv.fr/">ANSSI</a> has <a href="http://www.ssi.gouv.fr/IMG/pdf/NP_OpenSSH_NoteTech.pdf">recommendations</a> for configuring OpenSSH that prefer use of ECDSA keys. Revision-number: 9842 Prop-content-length: 225 Content-length: 225 K 8 svn:date V 27 2013-05-25T11:45:57.338509Z K 7 svn:log V 124 Summary: Make UTF-8 the default line character set Class: wish Including my understanding of what we default to currently. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/utf8-default Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 666 Text-content-md5: a4dedac8d08d813552f88e783d51b058 Text-content-sha1: 33d55f482fa4cd2a56b3423b54d8a51c1e11385d Content-length: 676 PROPS-END SVN���  Summary: Make UTF-8 the default line character set Class: wish Difficulty: fun Priority: high It's 2013. Every major current Linux distribution defaults to emitting UTF-8 in terminals. It's time for our default to change from ISO-8859-x. (The previous default isn't always ISO-8859-1, although that's what many people get. On Windows, we pick a line character set -- usually ISO-8859-x -- that vaguely resembles the local Win125x codepage, for want of a better idea. On Unix, we look at the selected font and promote its declared character set, if any, to the line character set -- this option will continue to be available via "Use font encoding".) Revision-number: 9843 Prop-content-length: 433 Content-length: 433 K 8 svn:date V 27 2013-05-25T14:03:19.999334Z K 7 svn:log V 332 It's probably well past time for this: change PuTTY's default character set configuration to UTF-8, on both Windows and Unix, and reorganise the dropdown lists in the Translation menu so that UTF-8 appears at the top (and Unix's odd "use font encoding" is relegated to the bottom of the list like the special-purpose oddity it is). K 10 svn:author V 5 simon PROPS-END Node-path: putty/charset/localenc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8fab6584820cd9e14e443b5744c1a5a5 Text-delta-base-sha1: 16fc5c23d15adf638a69eb6e11b62484b4ffa48c Text-content-length: 44 Text-content-md5: 6de2302ef30774268f54ea7957e7a9ab Text-content-sha1: 9337dc1c2bf5a8551915c529d98d3ce31b3f1f66 Content-length: 44 SVN��**� ��X~�7sUTF-8", CS_UTF8, 1 Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3a74cdb65c4a28c009843cf3f8b16344 Text-delta-base-sha1: e2685c31e8705f85fd02cddf7d86452b5eddcdc8 Text-content-length: 283 Text-content-md5: 883de0bc59a9e306c42e9663ce4f0d3d Text-content-sha1: ea9eed28f6a8395fe95556bbe4960c966eed7a86 Content-length: 283 SVN��)��c�{�pf.{charset = charset_localenc_nth(index); if (charset == CS_NONE) { /* "Use font encoding" comes after all the named charsets */ if (charset_localenc_nth(index-1) != CS_NONE) return "Use font encoding"; return NULL; }UTF8; Node-path: putty/windows/winucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da87e08405f0359546ac26cc4330b741 Text-delta-base-sha1: 887a34d9f53c92e077eefb1a25d87b1042a97a6a Text-content-length: 110 Text-content-md5: 062b3a53d9ab77911ea6149e5fceb9a5 Text-content-sha1: 061dc91d089786f4c627863372fd60468c97fd32 Content-length: 110 SVN��5G�j��@c�=<�UTF-8", CP_UTF8}, return CP_UTF8; /* default */ Revision-number: 9844 Prop-content-length: 106 Content-length: 106 K 8 svn:date V 27 2013-05-27T00:07:38.555351Z K 7 svn:log V 7 Fixed. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/utf8-default Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a4dedac8d08d813552f88e783d51b058 Text-delta-base-sha1: 33d55f482fa4cd2a56b3423b54d8a51c1e11385d Text-content-length: 401 Text-content-md5: 88034d8b5dbe16433f26575f0d715f5f Text-content-sha1: 18a34b5e24a2e2527ef0988901967dc31578e199 Content-length: 401 SVN�� "w�^��)]]$hFixed-in: r9843 2013-05-27wasn't always ISO-8859-1, although that's what many people got. On Windows, we picked a line character set -- usually ISO-8859-x -- that vaguely resembled the local Win125x codepage, for want of a better idea. On Unix, we looked at the selected font and promoted its declared character set, if any, to the line character set -- this option is still Revision-number: 9845 Prop-content-length: 133 Content-length: 133 K 8 svn:date V 27 2013-05-27T00:08:50.285382Z K 7 svn:log V 33 Fixed longer ago than I thought. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/utf8-default Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 88034d8b5dbe16433f26575f0d715f5f Text-delta-base-sha1: 18a34b5e24a2e2527ef0988901967dc31578e199 Text-content-length: 20 Text-content-md5: ac07ef74f863c7e550818e2ab743d6da Text-content-sha1: 34e5d794463cfacc0829d42478a5c83ca4814ae5 Content-length: 20 SVN��""�w��*x6 Revision-number: 9846 Prop-content-length: 180 Content-length: 180 K 8 svn:date V 27 2013-05-28T23:46:44.571149Z K 7 svn:log V 80 Update docs for change to UTF-8 by default, and emphasise UTF-8 more generally. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/doc/config.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef51568de3c47ddf5da56166566e0c71 Text-delta-base-sha1: b798e49c259c80173ae0ac8bdcaac7f3ee745c1a Text-content-length: 546 Text-content-md5: 8f6bde7a228c46f1b56e853840fc7c88 Text-content-sha1: fa017a97b52eeb2cf9c4040322cadbb8415ffbcb Content-length: 546 SVN����m�� �Q�~c By default PuTTY will use the \i{UTF-8} encoding of \i{Unicode}, which can represent pretty much any character; data coming from the server is interpreted as UTF-8, and keystrokes are sent UTF-8 encoded. This is what most modern distributions of Linux will expect by default. However, if this is wrong for your server, you can select a different character set using this control. A few otherat most 60 minutes. You might have a need to disable time-based rekeys completely for the same rea���c Revision-number: 9847 Prop-content-length: 297 Content-length: 297 K 7 svn:log V 196 Avoid complaints from gcc about multiple side effects between sequence points due to my FETCH macros all setting xl->overflow, by moving the setting of the overflow flag out into a function call. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-06-01T16:23:55.053794Z PROPS-END Node-path: putty-spinoffs/unix/uxxtruss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 63700639e99d9bc1e8b2849287fb53cf Text-delta-base-sha1: cd0319de06f8677e33ad2387ff56c568bced7452 Text-content-length: 486 Text-content-md5: 0331de0bad9bf3a63e96a78b7b9dcfd0 Text-content-sha1: 1fa3cd31f8bfe127c56d3a0866cff07c970e5140 Content-length: 486 SVN����]���]�#void set_overflow(struct xlog *xl) { xl->overflow = 1; } #define FETCH8(p, n) ( (n)+1>len ? (set_overflow(xl),0) : READ8((p)+(n)) ) #define FETCH16(p, n) ( (n)+2>len ? (set_overflow(xl),0) : READ16((p)+(n)) ) #define FETCH32(p, n) ( (n)+4>len ? (set_overflow(xl),0) : READ32((p)+(n)) ) #define STRING(p, n, l) ( (n)+(l)>len ? (set_overflow(xl)��� ��XD�(�f,FF�f� client by resource id\n" " or: xtruss [options] -p - trac Revision-number: 9848 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2013-06-01T16:25:29.543917Z K 7 svn:log V 40 Fix a non-64-bit-clean printf argument. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxxtruss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0331de0bad9bf3a63e96a78b7b9dcfd0 Text-delta-base-sha1: 1fa3cd31f8bfe127c56d3a0866cff07c970e5140 Text-content-length: 110 Text-content-md5: 69ce3957b3ff0296dd0c1106b2d501a7 Text-content-sha1: a48354119559d9b9c6dc8749aedf4bcbd009a8c8 Content-length: 110 SVN����������������,_ 9�8��n> (int)(p-val) Revision-number: 9849 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9850 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9851 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9852 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9853 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9854 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9855 Prop-content-length: 221 Content-length: 221 K 8 svn:date V 27 2013-06-04T21:35:58.344171Z K 7 svn:log V 120 Miscellaneous cleanups to psocks: add a help message, and add a couple of fflushes to try to keep output files current. K 10 svn:author V 5 simon PROPS-END Node-path: putty-spinoffs/unix/uxsocks.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2f304ed74098b8fba169f335414d03ff Text-delta-base-sha1: 8b49061221a7c7dd201a539c6883231035f0cc2d Text-content-length: 707 Text-content-md5: bc172f49be084dba3608c7da6f439972 Text-content-sha1: e722cfef1316fae5e1c5bf29107ef19d974526d7 Content-length: 707 SVN��+�+�M�ZON�M�Gd { fwrite(data, 1, len, c->infp); fflush(c->infp); } { fwrite(buf, 1, len, c->outfp); fflush(c->outfp); } else if (!strcmp(p, "--help")) { printf("\ usage: psocks [ -d | -f | -p pipe-cmd ] [ -g ] port-number\n\ where: -d log all connection contents to standard output\n\ -f write each half-connection to a file sockin.N/sockout.N\n\ -p pipe-cmd pipe each connection direction to 'pipe-cmd [in|out] N'\n\ -g accept connections from anywhere, not just localhost\n\ also: psocks --help display this help text\n"); return 0; Revision-number: 9856 Prop-content-length: 294 Content-length: 294 K 7 svn:log V 193 Remove xtruss from this general PuTTY-spinoffs directory, since it has its own top-level svn dir now. I got confused the other day by there being two of them, so let's delete the outdated one! K 10 svn:author V 5 simon K 8 svn:date V 27 2013-06-04T21:37:11.316588Z PROPS-END Node-path: putty-spinoffs/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b6cb6793056053bfc91693d52d5b05bc Text-delta-base-sha1: 5154fa6b44551ed10eed92edffe041e9257c15b3 Text-content-length: 15 Text-content-md5: 0f6ca8216f40544de2bae24ef67cb1fa Text-content-sha1: 9a275c6b4760cc295097b4bdf1cdd1aeafc8817b Content-length: 15 SVN��<#��#� Node-path: putty-spinoffs/unix/uxxtruss.c Node-action: delete Revision-number: 9857 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9858 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9859 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9860 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9861 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9862 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9863 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9864 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9865 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9866 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9867 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9868 Prop-content-length: 431 Content-length: 431 K 7 svn:log V 330 Fallback for manual setup of GTK 1, if autoconf is run on a system where the GTK1 detection function AM_PATH_GTK hasn't been provided by /usr/share/aclocal/gtk.m4 or equivalent. (Systems without gtk.m4 are becoming more common, but on the other hand I know at least one person is still using GTK 1 PuTTY since the 0.62 release.) K 10 svn:author V 5 simon K 8 svn:date V 27 2013-06-15T19:58:10.577293Z PROPS-END Node-path: putty/unix/configure.ac Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8aa2c7ca9e2c0ea0dda62284c98567e9 Text-delta-base-sha1: 328c6aa7fc45cb91302cd37b04564b8bfdfb9beb Text-content-length: 253 Text-content-md5: 558231d74b4bef1b7836c79f024700ca Text-content-sha1: d2f8375f543d28a51af076963beaa3d6bcb5790f Content-length: 253 SVN��>^ e��e�eY # manual check for gtk1 AC_PATH_PROG(GTK1_CONFIG, gtk-config, absent) if test "$GTK1_CONFIG" != "absent"; then GTK_CFLAGS=`"$GTK1_CONFIG" --cflags` GTK_LIBS=`"$GTK1_CONFIG" --libs` gtk=1 fi Revision-number: 9869 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9870 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9871 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9872 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9873 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9874 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9875 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9876 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9877 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9878 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9879 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9880 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9881 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9882 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9883 Prop-content-length: 146 Content-length: 146 K 7 svn:log V 46 Comment out all mention of 0.62 pre-releases. K 10 svn:author V 5 jacob K 8 svn:date V 27 2013-06-28T11:37:34.347928Z PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f13412c335c28ccf12613834f9404c30 Text-delta-base-sha1: bd80f6a7345646f7cbb3d2476a9ed6ffd193e11e Text-content-length: 1116 Text-content-md5: 21bf1f37e70954aae676eab49729f828 Text-content-sha1: 4a288130d0286deff81b7b62a39bc047744fcc0f Content-length: 1116 SVN��\&Vx� �4�SK� �<6M�}6A�z,�#E�,�^w�D?�\@�[>]�C, part 1 of 3. I expect to comment this whole section in and out depending on whether any version of PuTTY is currently in the pre-release stage. The wording in this introductory paragraph will probably want to change slightly each time - it mentions specific version numbers, and it also says 'contain bug fixes not present in the previous release' when it might in some cases want to say 'features'. There are more sections like this for source code below, and a couple of other commented-out fragments. --> <!-- (currently commented out, following 0.62 release) 1/3<!-- or pre-release --><!-- The pre-release source archive similarly contains a revision number. -->Special section for pre-releases, part 2/3. See comment above. -- <!-- End of pre-releases section part 2/3. !-- Special section for pre-releases, part 3/3. See comment above. --062pre-snapshots/putty-src.zip">putty-src.zip062pre062pre-snapshots/putty-srcputty-src.zip.DSA">(DSA sig)</a></td> </tr> --> <!-- End of pre-releases section part 3/3. -- Revision-number: 9884 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9885 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9886 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9887 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9888 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9889 Prop-content-length: 295 Content-length: 295 K 7 svn:log V 194 A collection of small bug fixes from Chris West, apparently spotted by Coverity: assorted language-use goofs like freeing the wrong thing or forgetting to initialise a string on all code paths. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-01T17:56:33.071241Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d652c226dcac54489c57af9adc0c34eb Text-delta-base-sha1: cdd2148974b85194c02edf7e0f00dcba4462eabe Text-content-length: 81 Text-content-md5: 31aa443583a69453ddadea19a95766af Text-content-sha1: d9795d9788c922fdc17d5e6e2362d19549f071dc Content-length: 81 SVN������������������ ���_!qh ssh_thr�ME��E Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 73fb447c11bb9f08894ebd81ae662b6b Text-delta-base-sha1: 2345d428d1203e41b426acca443d5b32444ad840 Text-content-length: 106 Text-content-md5: ec1c5c57605dfc93a6d7563665533dde Text-content-sha1: 1465f7413d130f9a7aeeaae29608133674d61f9d Content-length: 106 SVN��?WG�[��Bl�ty�@} fp = NULL; /* loadrsakey_main unconditionally closes fp */goto error Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9798b8d6ed3c69b948dfcb6699cfc8fa Text-delta-base-sha1: d874b359ff28e38f1de7e1ec8ad6b376c10c7728 Text-content-length: 42 Text-content-md5: 6533230b3832cb9fc857ca4898fb1ca4 Text-content-sha1: 9b51ddc4ed27c851e8e07fac49e53a557b3f87de Content-length: 42 SVN���� �a��a=� ��_ Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1b9a00de2d54cf4ea975983a551c3cc9 Text-delta-base-sha1: 0dccf1a3368ae4716a331dc5a5538aaeac3b8f65 Text-content-length: 54 Text-content-md5: 44f062ee0d6db6e99e4cdadb0101b1d7 Text-content-sha1: a95b7cf52e541cbc81cf2ab1afb9cdbd41323799 Content-length: 54 SVN��Ji �p��\n message[0] = '\0' Revision-number: 9890 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9891 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9892 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9893 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9894 Prop-content-length: 1237 Content-length: 1237 K 8 svn:date V 27 2013-07-06T20:43:21.028534Z K 7 svn:log V 1135 Clean up handling of the return value from sftp_find_request. In many places we simply enforce by assertion that it will match the request we sent out a moment ago: in fact it can also return NULL, so it makes more sense to report a proper error message if it doesn't return the expected value, and while we're at it, have that error message whatever message was helpfully left in fxp_error() by sftp_find_request when it failed. To do this, I've written a centralised function in psftp.c called sftp_wait_for_reply, which is handed a request that's just been sent out and deals with the mechanics of waiting for its reply, returning the reply when it arrives, and aborting with a sensible error if anything else arrives instead. The numerous sites in psftp.c which called sftp_find_request have all been rewritten to do this instead, and as a side effect they now look more sensible. The only other uses of sftp_find_request were in xfer_*load_gotpkt, which had to be tweaked in its own way. While I'm here, also fix memory management in sftp_find_request, which was freeing its input packet on some but not all error return paths. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 908a1de67dcf4ee4e6d1e2335284aab5 Text-delta-base-sha1: 4c0faa300e66ca062857d4e7708e19e740e02687 Text-content-length: 3446 Text-content-md5: c72441d82a12977ec0783deb7a1baf7d Text-content-sha1: 7cd119b32c1f7cb49279484ed44fca1b9907c608 Content-length: 3446 SVN��WU�~��Ws�NQj�$?q�)]�?6�!|c�K��Nw�Ld�b3�T8��k!g�c'{�W4��8�>?%�J�� D�Vb�Y�v�w�D!j�>�3�W�ht �l,l�X0Wait for the reply to a single SFTP request. Parallels the same * function in psftp.c (but isn't centralised into sftp.c because the * latter module handles SFTP only and shouldn't assume that SFTP is * the only thing going on by calling connection_fatal). */ struct sftp_packet *sftp_wait_for_reply(struct sftp_request *req) { struct sftp_packet *pktin; struct sftp_request *rreq; sftp_register(req); pktin = sftp_recv(); if (pktin == NULL) connection_fatal(NULL, "did not receive SFTP response packet " "from server"); rreq = sftp_find_request(pktin); if (rreq != req) connection_fatal(NULL, "unable to understand SFTP response packet " "from server: %s", fxp_error()); return pktinreq = fxp_opendir_send(dirname); pktin = sftp_wait_for_reply(req); dirh = fxp_opendir_recv(pktin, req = fxp_readdir_send(dirh); pktin = sftp_wait_for_reply(req); names = fxp_readdir_recv(pktin, req = fxp_close_send(dirh); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, req = fxp_stat_send(target); pktin = sftp_wait_for_reply(req); ret = fxp_stat_recv(pktin, req = fxp_open_send(fullname, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_TRUNC, &attrs); pktin = sftp_wait_for_reply(req); scp_sftp_filehandle = fxp_open_recv(pktin, ret <= 0; int ret; while (!xfer_doneret <= 0) { tell_user(stderr, "error while writing: %s\n", fxp_error()); errs++; return 1; }req = fxp_fsetstat_send(scp_sftp_filehandle, attrs); pktin = sftp_wait_for_reply(req); ret = fxp_fsetstat_recv(pktin, req); if (!ret) { tell_user(stderr, "unable to set file times: %s\n", fxp_error()); errs++; } } req = fxp_close_send(scp_sftp_filehandle); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, req); scp_has_times = 0req = fxp_mkdir_send(fullname); pktin = sftp_wait_for_reply(req); ret = fxp_mkdir_recv(pktin, req); if (!ret) err = fxp_error(); else err = "server reported no error"; req = fxp_stat_send(fullname); pktin = sftp_wait_for_reply(req); ret = fxp_stat_recv(pktin, req = fxp_stat_send(fname); pktin = sftp_wait_for_reply(req); ret = fxp_stat_recv(pktin, req = fxp_opendir_send(fname); pktin = sftp_wait_for_reply(req); dirhandle = fxp_opendir_recv(pktin, req = fxp_readdir_send(dirhandle); pktin = sftp_wait_for_reply(req); names = fxp_readdir_recv(pktin, req = fxp_close_send(dirhandle); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, ; req = fxp_open_send(scp_sftp_currentname, SSH_FXF_READ, NULL); pktin = sftp_wait_for_reply(req); scp_sftp_filehandle = fxp_open_recv(pktin, if (ret <=ret, len; pktin = sftp_recv(); ret = xfer_download_gotpkt(scp_sftp_xfer, pktin); if (ret <= 0) { tell_user(stderr, "pscp: error while reading: %s", fxp_error()); errs++; return -1; }req = fxp_close_send(scp_sftp_filehandle); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d6deee21b20282d5499e77a8d12ed119 Text-delta-base-sha1: 5cd261cca4e1fc42cd4011bbce8b201adcd5205e Text-content-length: 4873 Text-content-md5: 75a41eaf185f70e0b2029ece2b1d4e50 Text-content-sha1: 3301f66ca7c34b46551072dcacae88032cd266a2 Content-length: 4873 SVN��2Z �U�@�R:�rU�TNr�EJ�nm�sbm�mg�Mw�Rij�8U��0yc�a1c�\%� Z�V+�/h�Kr�n�IM�Bpa�?Z�}k�]og�Di�(4}�) i�aX�k@g� Hq�D ]�)V�D=�-Yf�l"\�g �D=�|re�{�YR�Bg���{w�F��Pd�jq�`#�� k�o+Manage sending requests and waiting for replies. */ struct sftp_packet *sftp_wait_for_reply(struct sftp_request *req) { struct sftp_packet *pktin; struct sftp_request *rreq; sftp_register(req); pktin = sftp_recv(); if (pktin == NULL) connection_fatal(NULL, "did not receive SFTP response packet " "from server"); rreq = sftp_find_request(pktin); if (rreq != req) connection_fatal(NULL, "unable to understand SFTP response packet " "from server: %s", fxp_error()); return pktinreq = fxp_realpath_send(fullname); pktin = sftp_wait_for_reply(req); canonname = fxp_realpath_recv(pktin, req = fxp_realpath_send("/"); } else { req = fxp_realpath_send(fullname); } pktin = sftp_wait_for_reply(req); canonname = fxp_realpath_recv(pktin, req = fxp_stat_send(fname); pktin = sftp_wait_for_reply(req); result = fxp_stat_recv(pktin, req = fxp_opendir_send(fname); pktin = sftp_wait_for_reply(req); dirhandle = fxp_opendir_recv(pktin, req = fxp_readdir_send(dirhandle); pktin = sftp_wait_for_reply(req); names = fxp_readdir_recv(pktin, req = fxp_close_send(dirhandle); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, req = fxp_stat_send(fname); pktin = sftp_wait_for_reply(req); if (!fxp_stat_recv(pktin, req, &attrs)) attrs.flags = 0; req = fxp_open_send(fname, SSH_FXF_READ, NULL); pktin = sftp_wait_for_reply(req); fh = fxp_open_recv(pktin, req = fxp_close_send(fh); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, req = fxp_close_send(fh); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, if (ret <=req = fxp_close_send(fh); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, req = fxp_stat_send(outfname); pktin = sftp_wait_for_reply(req); result = fxp_stat_recv(pktin, req = fxp_mkdir_send(outfname); pktin = sftp_wait_for_reply(req); result = fxp_mkdir_recv(pktin, req = fxp_stat_send(nextoutfname); pktin = sftp_wait_for_reply(req); result = fxp_stat_recv(pktin, req = fxp_open_send(outfname, SSH_FXF_WRITE, &attrs); } else { req = fxp_open_send(outfname, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_TRUNC, &attrs); } pktin = sftp_wait_for_reply(req); fh = fxp_open_recv(pktin, req = fxp_fstat_send(fh); pktin = sftp_wait_for_reply(req); ret = fxp_fstat_recv(pktin, req = fxp_close_send(fh); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, req = fxp_opendir_send(cdir); pktin = sftp_wait_for_reply(req); dirh = fxp_opendir_recv(pktin, req = fxp_readdir_send(swcm->dirh); pktin = sftp_wait_for_reply(req); swcm->names = fxp_readdir_recv(pktin, ; req = fxp_close_send(swcm->dirh); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, req = fxp_opendir_send(cdir); pktin = sftp_wait_for_reply(req); dirh = fxp_opendir_recv(pktin, req = fxp_readdir_send(dirh); pktin = sftp_wait_for_reply(req); names = fxp_readdir_recv(pktin, req = fxp_close_send(dirh); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, ; char *dirreq = fxp_opendir_send(dir); pktin = sftp_wait_for_reply(req); dirh = fxp_opendir_recv(pktin, req = fxp_close_send(dirh); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, ; int result; int i, retreq = fxp_mkdir_send(dir); pktin = sftp_wait_for_reply(req); result = fxp_mkdir_recv(pktin, ; int result; req = fxp_rmdir_send(dir); pktin = sftp_wait_for_reply(req); result = fxp_rmdir_recv(pktin, ; int result; req = fxp_remove_send(fname); pktin = sftp_wait_for_reply(req); result = fxp_remove_recv(pktin, ; struct fxp_attrs attrs; int result; req = fxp_stat_send(dstfname); pktin = sftp_wait_for_reply(req); result = fxp_stat_recv(pktin, req = fxp_rename_send(srcfname, finalfname); pktin = sftp_wait_for_reply(req); result = fxp_rename_recv(pktin, req = fxp_stat_send(fname); pktin = sftp_wait_for_reply(req); result = fxp_stat_recv(pktin, req = fxp_setstat_send(fname, attrs); pktin = sftp_wait_for_reply(req); result = fxp_setstat_recv(pktin, req = fxp_realpath_send("."); pktin = sftp_wait_for_reply(req); homedir = fxp_realpath_recv(pktin, Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f5cbf652958892fa71f59b937c609ac4 Text-delta-base-sha1: 41dc2d84c9538bbfb33f8ec05197fa81536d678e Text-content-length: 207 Text-content-md5: c710ae26dc02bca71ec669627264ca75 Text-content-sha1: a04afbb95572e31a8d977c7486f2c86422870500 Content-length: 207 SVN��P^"� ��_+Q�rb�pwQ�nbif (!rreq) return 0; /* this packet doesn't even make sense */if (!rreq) return 0; /* this packet doesn't even make sense */ Revision-number: 9895 Prop-content-length: 628 Content-length: 628 K 8 svn:date V 27 2013-07-07T14:34:37.633102Z K 7 svn:log V 527 Move the SSH-1 servkey and hostkey variables into the coroutine state, since there is a theoretical code path (via the crReturn loop after asking an interactive question about a host key or crypto algorithm) on which we can leave and return to do_ssh1_login between allocating and freeing those keys. (In practice it shouldn't come up anyway with any of the current implementations of the interactive question functions, not to mention the unlikelihood of anyone non-specialist still using SSH-1, but better safe than sorry.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 31aa443583a69453ddadea19a95766af Text-delta-base-sha1: d9795d9788c922fdc17d5e6e2362d19549f071dc Text-content-length: 1699 Text-content-md5: c5eeab349f97950fd10ec477273fbec0 Text-content-sha1: 739a10a321b615926d38a045e2a510cf2cb38453 Content-length: 1699 SVN����1w���<�IL�Jm�4�mdv�#! struct RSAKey servkey, hostkey->servkey, &s->keystr1) || !ssh1_pkt_getrsakey(pktin, &s->s->hostkey.comment = NULL; rsa_fingerprint(logmsg + strlen(logmsg), sizeof(logmsg) - strlen(logmsg), &s->s->hostkey.bytes); MD5Update(&md5c, s->keystr1, s->s->hostkey.bits > s->hostkey.bytes * 8 || s->servkey.bits > s->servkey.bytes * 8) { bombout(("SSH-1 public keys were badly formatted")); crStop(0); } s->len = (s->hostkey.bytes > s->servkey.bytes ? s->hostkey.bytes : s->���"6�yq�4pN�1Nint len = rsastr_len(&s->hostkey); char fingerprint[100]; char *keystr = snewn(len, char); rsastr_fmt(keystr, &s->hostkey); rsa_fingerprint(fingerprint, sizeof(fingerprint), &s->s->hostkey.bytes > s->servkey.bytes) { ret = rsaencrypt(s->rsabuf, 32, &s->servkey); if (ret) ret = rsaencrypt(s->rsabuf, s->servkey.bytes, &s->hostkey); } else { ret = rsaencrypt(s->rsabuf, 32, &s->hostkey); if (ret) ret = rsaencrypt(s->rsabuf, s->hostkey.bytes, &s->->servkey.modulus) { sfree(s->servkey.modulus); s->servkey.modulus = NULL; } if (s->servkey.exponent) { sfree(s->servkey.exponent); s->servkey.exponent = NULL; } if (s->hostkey.modulus) { sfree(s->hostkey.modulus); s->hostkey.modulus = NULL; } if (s->hostkey.exponent) { sfree(s->hostkey.exponent); s->�����ses should always be failures. However, at least * one server ("boks_sshd") is known to return SUCCESS for channel * re�EF�E�version == 1) { if (ssh->v1_stdout_throttling && bufsize < SSH1_BUFFER_LIMIT) { ssh->v1_stdout_throttling = 0; ssh_thr Revision-number: 9896 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 42 Add an assortment of extra safety checks. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-08T22:36:04.709585Z PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 605ff99e37047e7603b8b317786c9fd2 Text-delta-base-sha1: 0bc8f1f2ade080df774e31a0b683ba55350a2f21 Text-content-length: 59 Text-content-md5: 3dffec813e4d2108b9adbc111d7d302d Text-content-sha1: 6c5de531bce5755db44fc14535d00f482c9ff506 Content-length: 59 SVN���F��jO�A@�|bytes < 0 || len-4 < /* Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e8206db08a5765e21ae275ec4a506694 Text-delta-base-sha1: 435c177e2d4989db948bf17fbdbf6f485baaa79c Text-content-length: 69 Text-content-md5: dc66d4d777d94b6a50bc1cc6076bc912 Text-content-sha1: 6d4113f14a99aea945339f9fbbf182bfba55368e Content-length: 69 SVN��\(�D��Q>�Q if (*length < 0) returnslen != 7 Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 62c2e862936cb2bb03b47957e22dd30c Text-delta-base-sha1: fde4d97dab7c11848dee26c5089ad001947bbf43 Text-content-length: 54 Text-content-md5: fa8f3b9d48713adc08b43ee528e38ede Text-content-sha1: 02081b87d25de836d5dda38626ed07ee9f69431c Content-length: 54 SVN��, �}��wif (*length < 0) return Revision-number: 9897 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9898 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9899 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9900 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9901 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9902 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9903 Prop-content-length: 417 Content-length: 417 K 8 svn:date V 27 2013-07-11T17:23:56.726512Z K 7 svn:log V 316 Get rid of the fixed-size 'hostname' buffer in every port-forwarded connection, and replace it with sensible dynamically allocated storage. While I'm at it, get rid of the disgusting dual use between storing an actual hostname and storing an incoming SOCKS request; we now have a separate pointer variable for each. K 10 svn:author V 5 simon PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 758b0bed9d05ea5d32207c7eb11f2a84 Text-delta-base-sha1: 4172a8c964645dccc5dc9dff9dc925a0af136f0f Text-content-length: 3675 Text-content-md5: d7651e4c37fdfe9cb9cd8c1e5a178c3b Text-content-sha1: 76179fcad7b4a4d46daff34a6604995ca799a6e9 Content-length: 3675 SVN��&_?�+�0��d&Q�T �ci �L~)�7 V�&:�H �yG�|!�2B�kxA�W h�K[�x.g� V �j1��NZ�",�1}�R2�s�$d�g8l�l$�u�$. */ char *hostname; int port; /* * `socksbuf' is the buffer we use to accumulate a SOCKS request. */ char *socksbuf; int sockslen, sockssizestruct PFwdPrivate *new_portfwd_private(void) { struct PFwdPrivate *pr = snew(struct PFwdPrivate); pr->hostname = NULL; pr->socksbuf = NULL; pr->sockslen = pr->sockssize = 0; pr->buffer = NULL; return pr; } static void free_portfwd_private(struct PFwdPrivate *pr) { if (!pr) return; sfree(pr->hostname); sfree(pr->socksbuf); sfree(pr->buffer); sfree(pr); }if (pr->sockslen >= pr->sockssize) { pr->sockssize = pr->sockslen * 5 / 4 + 256; pr->socksbuf = sresize(pr->socksbuf, pr->sockssize, char); } pr->socksbuf[pr->sockslensocksbufsockslen < 2) continue; /* don't have command code yet */ if (pr->socksbuf[1] != 1) { /* Not CONNECT. */ pfd_close(pr->s); return 1; } if (pr->sockslen <= 8) continue; /* haven't started user/hostname */ if (pr->socksbuf[pr->sockslensocksbuf[4] == 0 && pr->socksbuf[5] == 0 && pr->socksbuf[6] == 0 && pr->socksbufsockslen = 8; /* reset buffer to overwrite name */ continue; } pr->socksbuf[0] = 0; /* reply version code */ pr->socksbuf[1] = 90; /* request granted */ sk_write(pr->s, pr->socksbuf, 8); len = pr->sockslen - 8; pr->port = GET_16BIT_MSB_FIRST(pr->socksbuf+2); pr->hostname = snewn(len+1, char); pr->hostname[len] = '\0'; memcpy(pr->hostname, pr->socksbufsocksbuf[0] = 0; /* reply version code */ pr->socksbuf[1] = 90; /* request granted */ sk_write(pr->s, pr->socksbuf, 8); pr->port = GET_16BIT_MSB_FIRST(pr->socksbuf+2); pr->hostname = dupprintf("%d.%d.%d.%d", (unsigned char)pr->socksbuf[4], (unsigned char)pr->socksbuf[5], (unsigned char)pr->socksbuf[6], (unsigned char)pr->socksbuf[7]); goto connect; } } if ((pr->dynamic == 1 || (pr->dynamic >> 12) == 5) && pr->socksbufsockslen < 2) continue; /* no method count yet */ if (pr->sockslen < 2 + (unsigned char)pr->socksbufsocksbuf[1]; i++) if (pr->socksbufsockslensockslen < 6) continue; atype = (unsigned char)pr->socksbufsocksbuf[4]; if (pr->sockslen < 6 + alen) continue; if (pr->socksbuf[1] != 1 || pr->socksbufsocksbufpr->hostname = dupprintf("%d.%d.%d.%d", (unsigned char)pr->socksbuf[4], (unsigned char)pr->socksbuf[5], (unsigned char)pr->socksbuf[6], (unsigned char)pr->socksbuf pr->hostname = snewn(alen, char); pr->hostname[alen-1] = '\0'; memcpy(pr->hostname, pr->socksbuf + 5, alen-1) sfree(pr->socksbuf); pr->socksbuf = NULL;new_portfwd_private()free_portfwd_privatnew_portfwd_private()free_portfwd_privatpr->hostname = dupstr(free_portfwd_private(prnew_portfwd_private(); pr->fn = &fn_table; pr->c = NULL; if (desthost) { pr->hostname = dupstr(free_portfwd_privatfree_portfwd_privat Revision-number: 9904 Prop-content-length: 166 Content-length: 166 K 7 svn:log V 66 Add another missing bounds check in the SSH-1 private key loader. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-11T17:24:01.246648Z PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ec1c5c57605dfc93a6d7563665533dde Text-delta-base-sha1: 1465f7413d130f9a7aeeaae29608133674d61f9d Text-content-length: 33 Text-content-md5: ab2a142b01d19cade8768272fe7708fd Text-content-sha1: fed19b16c90ed663c848d5a0ab65938d72d3d67b Content-length: 33 SVN��W` �3��$3j < 0 || Revision-number: 9905 Prop-content-length: 183 Content-length: 183 K 8 svn:date V 27 2013-07-11T17:24:04.387324Z K 7 svn:log V 83 Fix a mishandling of error returns from makekey() in the SSH-1 private key loader. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ab2a142b01d19cade8768272fe7708fd Text-delta-base-sha1: fed19b16c90ed663c848d5a0ab65938d72d3d67b Text-content-length: 125 Text-content-md5: 28e3614f4ba718f431a4b6fbb218a49e Text-content-sha1: 75382570c7ff6cec639c7a64be5e7bdc44a059ef Content-length: 125 SVN��`k d��d�^j = makekey(buf + i, len, key, NULL, 1); if (j < 0) goto end; /* overran */ i += j; Revision-number: 9906 Prop-content-length: 310 Content-length: 310 K 8 svn:date V 27 2013-07-11T17:24:10.747273Z K 7 svn:log V 209 Remove redundant null checks for arguments to sftp_{get,put}_file which are (a) never NULL anyway, and (b) have already been dereferenced by the time we make those checks so it would be too late if they were. K 10 svn:author V 5 simon PROPS-END Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 75a41eaf185f70e0b2029ece2b1d4e50 Text-delta-base-sha1: 3301f66ca7c34b46551072dcacae88032cd266a2 Text-content-length: 178 Text-content-md5: 89e203a9013f55b119b51291b9f633e4 Text-content-sha1: 9f8e6df66d0a865d7a191387c01fcc280d4f2b46 Content-length: 178 SVN��2/�`��\0�xk� `�S_nextoutfname = dir_file_cat(outfname, nextoutfname = dir_file_cat(outfname, nextfname = dir_file_cat(fname, Revision-number: 9907 Prop-content-length: 231 Content-length: 231 K 8 svn:date V 27 2013-07-11T17:24:14.296954Z K 7 svn:log V 130 Remove another pointless null check, this time of inst->back in the function which has just dereferenced it to get the exit code. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6533230b3832cb9fc857ca4898fb1ca4 Text-delta-base-sha1: 9b51ddc4ed27c851e8e07fac49e53a557b3f87de Text-content-length: 252 Text-content-md5: c6452d693e79dc5dc438a5fd2a5b389e Text-content-sha1: b674140d8355e8731cf08ae8eca95f09e7007c7d Content-length: 252 SVN����Q�e�C�J6 inst->back->free(inst->backhandle); inst->backhandle = NULL; inst->back = NULL; term_provide_resize_fn(inst->term, NULL, NULL); update_specials_menu(inst);_FUNC(special_� {��{ Revision-number: 9908 Prop-content-length: 330 Content-length: 330 K 8 svn:date V 27 2013-07-11T17:24:20.777528Z K 7 svn:log V 229 Add some missing null checks for inst->ldisc, which were causing segfaults if a PuTTY or pterm did not close on exit and then you either typed something via input_method_commit_event or changed the line editing or echo settings. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c6452d693e79dc5dc438a5fd2a5b389e Text-delta-base-sha1: b674140d8355e8731cf08ae8eca95f09e7007c7d Text-content-length: 251 Text-content-md5: 89b15bfd5abba4246dc84a779fd2f055 Text-content-sha1: c364659ec99e0a2a694ab19c3ff841e9914cce80 Content-length: 251 SVN�����5��c1�Oif (inst->ldisc) if (inst->ldisc) { ldisc_configure(inst->ldisc, inst->conf); ldisc_send(inst->ldisc, NULL, 0, 0); }�{+0�{�em), "activate", GTK_SIGNAL_FUNC(special_ Revision-number: 9909 Prop-content-length: 224 Content-length: 224 K 7 svn:log V 123 Fix a pty-freeing error which caused a segfault if you attempted to use Restart Session in a post-not-close-on-exit pterm. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-11T17:24:23.837171Z PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 44f062ee0d6db6e99e4cdadb0101b1d7 Text-delta-base-sha1: a95b7cf52e541cbc81cf2ab1afb9cdbd41323799 Text-content-length: 306 Text-content-md5: 663faa36b5e80e4e7f9d705695b5f482 Text-content-sha1: 3d1ae4ae10c759219ae1dba61f020d21bdb21d29 Content-length: 306 SVN��it �H��IB�y]�` pty->conf = NULL assert(pty->conf == NULL)conf_free(pty->conf); pty->conf = NULL; if (pty == single_pty) { /* * Leave this structure around in case we need to Restart * Session. */ } else { sfree(pty); } Revision-number: 9910 Prop-content-length: 486 Content-length: 486 K 8 svn:date V 27 2013-07-11T17:24:28.297291Z K 7 svn:log V 385 Add missing checks in update_for_intended_size() in the font selector code, which would have coped badly if ever asked to select the first font in the list at a size smaller than it supported. Luckily the first font tended to be one of the X numeric aliases (e.g. 10x20) which was stored with size zero, so this probably didn't actually come up for anyone, but better safe than sorry. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6cb9c26b02c7bfbaa73ffefc99211b90 Text-delta-base-sha1: 01316232759d24d549eb3ac61033f88a8a0404b7 Text-content-length: 70 Text-content-md5: 012cfbd5af6f6dbb82f2043cee2ea8eb Text-content-sha1: f178600d6cb10273b60595b8aea43c801178f211 Content-length: 70 SVN��6a%�'�� !� ,if (!below) pos = -1below && Revision-number: 9911 Prop-content-length: 257 Content-length: 257 K 7 svn:log V 156 Fixes for the tree234 unit test: break its dependencies on half of the rest of PuTTY, and fix a couple of format string type mismatches pointed out by gcc. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-11T17:24:32.617457Z PROPS-END Node-path: putty/tree234.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2667a2a270720052dd9dbd322c0eb58f Text-delta-base-sha1: 2c6bc106131abdae37ffbea25ebe63b140bdbe14 Text-content-length: 489 Text-content-md5: a8a8e18bfb9404fce46639ec00eed67e Text-content-sha1: 465534c1d657f3595a65c4c15132acc002ab9a31 Content-length: 489 SVN��/C�n��T;�V=rtree234.h" #ifdef TEST #define LOG(x) (printf x) #define snew(type) ((type *)malloc(sizeof(type))) #define snewn(n, type) ((type *)malloc((n) * sizeof(type))) #define sresize(ptr, n, type) \ ((type *)realloc(sizeof((type *)0 == (ptr)) ? (ptr) : (ptr), \ (n) * sizeof(type))) #define sfree(ptr) free(ptr) #else #include "puttymem.h"(int)(np - n->kids) (const char *) Revision-number: 9912 Prop-content-length: 370 Content-length: 370 K 8 svn:date V 27 2013-07-11T17:24:39.178047Z K 7 svn:log V 269 It's not actually legal by the C standard to call qsort with a null array pointer, _even_ if you're asking it to sort zero elements so that in principle it should never dereference that pointer. Fix the four instances in PSCP/PSFTP where this was previously occurring. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c72441d82a12977ec0783deb7a1baf7d Text-delta-base-sha1: 7cd119b32c1f7cb49279484ed44fca1b9907c608 Text-content-length: 62 Text-content-md5: 7e49812d38dc452c596aa311189adf48 Text-content-sha1: 8349f7baa1bc4faed2931ffa8045012e2778d822 Content-length: 62 SVN��Wz $�1��%2 if (nnames > 0) Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 89e203a9013f55b119b51291b9f633e4 Text-delta-base-sha1: 9f8e6df66d0a865d7a191387c01fcc280d4f2b46 Text-content-length: 149 Text-content-md5: d12203949064a7c0554458a768072a92 Text-content-sha1: bea47abde876c8e4b4f96236d49e84b70fbbc0de Content-length: 149 SVN��/p�L��rM�k@�, if (nnames > 0) if (nnames > 0) if (nnames > 0) Revision-number: 9913 Prop-content-length: 259 Content-length: 259 K 8 svn:date V 27 2013-07-11T17:24:44.177700Z K 7 svn:log V 158 Fix a couple of code paths on which, if fxp_readdir returned an error, we would return without first closing the directory handle we had used as an argument. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7e49812d38dc452c596aa311189adf48 Text-delta-base-sha1: 8349f7baa1bc4faed2931ffa8045012e2778d822 Text-content-length: 185 Text-content-md5: b5f6e632ea3da17351a51598527e4e1e Text-content-sha1: 957f8bcd3357e7735bb74dd43670c800b44d37ea Content-length: 185 SVN��z�E��6D req = fxp_close_send(dirhandle); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, req); Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d12203949064a7c0554458a768072a92 Text-delta-base-sha1: bea47abde876c8e4b4f96236d49e84b70fbbc0de Text-content-length: 183 Text-content-md5: 963f1ee0983d61624b50ccc05e19a6e1 Text-content-sha1: 38a248a8c7c1a3001b1854c87c1a2fdb3e472c53 Content-length: 183 SVN��9 ���  req = fxp_close_send(dirhandle); pktin = sftp_wait_for_reply(req); fxp_close_recv(pktin, req); Revision-number: 9914 Prop-content-length: 347 Content-length: 347 K 8 svn:date V 27 2013-07-11T17:24:47.847806Z K 7 svn:log V 246 Fix a collection of calls to tell_user so that they don't add their own newline before the one tell_user puts on the end anyway. Also, while I'm here, make up my mind about whether to prefix messages with "scp:" or "pscp:" - I choose the latter. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b5f6e632ea3da17351a51598527e4e1e Text-delta-base-sha1: 957f8bcd3357e7735bb74dd43670c800b44d37ea Text-content-length: 112 Text-content-md5: de21971d5ea33f04caabb2749179045e Text-content-sha1: f756990998eb5a3fe36a711d5d7e54a22268f422 Content-length: 112 SVN�� C � ��3 �M@�&�_7�9�4Q�$�kC�;0�,kppscp: reading directory %s: %sp Revision-number: 9915 Prop-content-length: 511 Content-length: 511 K 8 svn:date V 27 2013-07-11T17:24:53.468333Z K 7 svn:log V 410 xfer_{up,down}load_gotpkt free their input sftp_packet as a side effect of handling it, but they do not free it if it isn't a packet they recognise as part of their upload/download. Invent a return value that specifically signals this, and consistently free pktin at every call site if that return value comes back. Also, ensure that that return value also always comes with something meaningful in fxp_error. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: de21971d5ea33f04caabb2749179045e Text-delta-base-sha1: f756990998eb5a3fe36a711d5d7e54a22268f422 Text-content-length: 432 Text-content-md5: 7d1a35f6f93cbc8ba28c429346716e24 Text-content-sha1: ec7d05d9ae68c8a0c807bd75bfc8d7025d193a1c Content-length: 432 SVN�� "&|��e�)e�a=]�U�t if (ret == INT_MIN) /* pktin not even freed */ sfree(pktin if (ret == INT_MIN) /* pktin not even freed */ sfree(pktin if (ret == INT_MIN) /* pktin not even freed */ sfree(pktinif (ret == INT_MIN) /* pktin not even freed */ sfree(pktin Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 963f1ee0983d61624b50ccc05e19a6e1 Text-delta-base-sha1: 38a248a8c7c1a3001b1854c87c1a2fdb3e472c53 Text-content-length: 370 Text-content-md5: 9a7fcb6148620b634306ab7a2c1416af Text-content-sha1: 307483aadcd38af88d88126ef3de63fb5d89c6b5 Content-length: 370 SVN��9KO��S�|�Grif (ret == INT_MIN) /* pktin not even freed */ sfree(pktin);) { if (ret == INT_MIN) /* pktin not even freed */ sfree(pktin); if (!err) { printf("error while writing: %s\n", fxp_error()); err = 1; } Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c710ae26dc02bca71ec669627264ca75 Text-delta-base-sha1: a04afbb95572e31a8d977c7486f2c86422870500 Text-content-length: 615 Text-content-md5: a91e1988e221618946329e6ce8af4dd1 Text-content-sha1: 01175426be660e95ff77c6674e394a3e956b8cd9 Content-length: 615 SVN��^8!�B��qg�F@�r: �3)x�^[�r: �\/* * Returns INT_MIN to indicate that it didn't even get as far as * fxp_read_recv and hence has not freed pktin. */ int xfer_downINT_MIN { fxp_internal_error("request ID is not part of the current download"); return INT_MIN; /* this packet isn't ours */ }/* * Returns INT_MIN to indicate that it didn't even get as far as * fxp_write_recv and hence has not freed pktin. */INT_MIN { fxp_internal_error("request ID is not part of the current upload"); return INT_MIN; /* this packet isn't ours */ } Revision-number: 9916 Prop-content-length: 263 Content-length: 263 K 7 svn:log V 162 Add an assortment of missing frees, and one missing file close. Mostly on error paths, although the one in PSFTP's wildcard_iterate will come up in normal usage. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-11T17:43:41.785648Z PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7d1a35f6f93cbc8ba28c429346716e24 Text-delta-base-sha1: ec7d05d9ae68c8a0c807bd75bfc8d7025d193a1c Text-content-length: 683 Text-content-md5: 0c692103807e5b08ff9f945b0dcb6712 Text-content-sha1: 12ff056156377c8cdc986437b88887c99aef824d Content-length: 683 SVN��" HU�u��Q=�JK�y�M�wR�=0� ;�pq�s/ sfree(ournames); } sfree(fullname sfree(fullname if (must_free_fname) sfree(fname sfree( sfree(destfname); continue; } } sink(destfname, NULL); /* can we set the timestamp for directories ? */ sfree(destfname); sfree(destfname); continue; } if (scp_accept_filexfer()) { sfree(destfname); close_wfile(f); return; }sfree(stat_name); close_wfile(f); if (wrerror) { run_err("%s: Write error", destfname); sfree( Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9a7fcb6148620b634306ab7a2c1416af Text-delta-base-sha1: 307483aadcd38af88d88126ef3de63fb5d89c6b5 Text-content-length: 53 Text-content-md5: e3688e3802f5980a208d2258d3229a1c Text-content-sha1: f5a3ffa05c54ab7227ceaa4821b60a35c50a5982 Content-length: 53 SVN��Kg �P��|O sfree(newname); Revision-number: 9917 Prop-content-length: 238 Content-length: 238 K 8 svn:date V 27 2013-07-14T10:45:48.502550Z K 7 svn:log V 137 Fix an always-false if statement which was causing the window border not to be redrawn when the user reconfigured the background colour. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 89b15bfd5abba4246dc84a779fd2f055 Text-delta-base-sha1: c364659ec99e0a2a694ab19c3ff841e9914cce80 Text-content-length: 48 Text-content-md5: 329c61846af46894c7fa9b47fba85d01 Text-content-sha1: a5023687b8a245400500447cf7f0db255a9ae813 Content-length: 48 SVN���� �t��uww[i]�+/�+�nuit Revision-number: 9918 Prop-content-length: 493 Content-length: 493 K 7 svn:log V 392 Tighten up a lot of casts from unsigned to int which are read by one of the GET_32BIT macros and then used as length fields. Missing bounds checks against zero have been added, and also I've introduced a helper function toint() which casts from unsigned to int in such a way as to avoid C undefined behaviour, since I'm not sure I trust compilers any more to do the obviously sensible thing. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-14T10:45:54.802727Z PROPS-END Node-path: putty/conf.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b83004f9eabb7a5fbd111d47078579f8 Text-delta-base-sha1: 42df43553a510738fec94fa4c10b44bcb913607f Text-content-length: 129 Text-content-md5: 56b3e966888b4a33ce74674a56782d2f Text-content-sha1: 45a0e1230308d4f965ae6edebef8d84319db6eb2 Content-length: 129 SVN��j{W�5��A�M�i�yi�j�unsigned primary; inttoint(GET_32BIT_MSB_FIRST(data)toint(GET_32BIT_MSB_FIRST(data) Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3dffec813e4d2108b9adbc111d7d302d Text-delta-base-sha1: 6c5de531bce5755db44fc14535d00f482c9ff506 Text-content-length: 1194 Text-content-md5: 8b82c5b2d2bfc695a4e6fcf66cb99376 Text-content-sha1: 1c7957cc783a16b7a938605dbf330587b8f1ba14 Content-length: 1194 SVN��Jv&�0�� ;y�`=�y�8=�}f_�4t�m9�O;� �;�N;�6�]y�`=��aey�^=toint(GET_32BIT(d)/* * These blobs were generated from inside PuTTY, so we needn't * treat them as untrusted. *//* * These blobs were generated from inside PuTTY, so we needn't * treat them as untrusted. */len = toint(GET_32BIT(key->keyblob + pos)); if (len < 0 || len > key->keyblob_len - pos - 4) goto done; /* key is far too short */ pos += 4 + len; /* skip key type */ len = toint(GET_32BIT(key->keyblob + pos)); /* find cipher-type length */ if (len < 0 || len > key->keyblob_len - pos - 4unsigned bits,toint(GET_32BIT(key->keyblob + pos))) < 0 || lentoint(GET_32BIT(key->keyblob + pos))) < 0 || lentoint(GET_32BIT(key->keyblob + pos))) < 0 || lentoint(GET_32BIT(ciphertext)/* * These blobs were generated from inside PuTTY, so we needn't * treat them as untrusted. *//* * These blobs were generated from inside PuTTY, so we needn't * treat them as untrusted. */ Node-path: putty/misc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bf06444ceda7733517c2fc7816bb1412 Text-delta-base-sha1: 8f9fb7f8767beddd8f572b5b21c0261a9113dc49 Text-content-length: 951 Text-content-md5: c6391d7e6daa053a5795103ab6d76b90 Text-content-sha1: 93d6de8d9a9d2a3e55c7d9ddda7815153d9c86bb Content-length: 951 SVN��6 ���int toint(unsigned u) { /* * Convert an unsigned to an int, without running into the * undefined behaviour which happens by the strict C standard if * the value overflows. You'd hope that sensible compilers would * do the sensible thing in response to a cast, but actually I * don't trust modern compilers not to do silly things like * assuming that _obviously_ you wouldn't have caused an overflow * and so they can elide an 'if (i < 0)' test immediately after * the cast. * * Sensible compilers ought of course to optimise this entire * function into 'just return the input value'! */ if (u <= (unsigned)INT_MAX) return (int)u; else if (u >= (unsigned)INT_MIN) /* wrap in cast _to_ unsigned is OK */ return INT_MIN + (int)(u - (unsigned)INT_MIN); else return INT_MIN; /* fallback; should never occur on binary machines */ Node-path: putty/misc.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e63a4913757d45cd3bdba57f764a2727 Text-delta-base-sha1: bc3eabd583193a759e63d1c5312cbdb2b5c9bf70 Text-content-length: 39 Text-content-md5: fdde0a4f3d9b576c0a44eac791e59994 Text-content-sha1: bce7416936dc4115567a67e3c646ae55836bc853 Content-length: 39 SVN��$ � �� int toint(unsigned Node-path: putty/sftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a91e1988e221618946329e6ce8af4dd1 Text-delta-base-sha1: 01175426be660e95ff77c6674e394a3e956b8cd9 Text-content-length: 66 Text-content-md5: 4923f9222db27f1f0ab62e2f392090dd Text-content-sha1: 6eaba51d1f0f654638c4fc8ea34648c64401209a Content-length: 66 SVN�� *�e�� toint(GET_32BIT(pkt->data + pkt->savedpos) Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c5eeab349f97950fd10ec477273fbec0 Text-delta-base-sha1: 739a10a321b615926d38a045e2a510cf2cb38453 Text-content-length: 9634 Text-content-md5: cf0970292e6d0c2cf07c56a60544d419 Text-content-sha1: 74f3763e1d10d71b6a41e7f7ef84156e58150462 Content-length: 9634 SVN����?}�{�R�V5�$�Z�=\�q)�Q$ �w(st->len = toint(GET_32BIT(st->pktin->data))) == st->packetlen-4)toint(GET_32BIT(st->pktin->data)toint(GET_32BIT(pkt->body + pkt->savedpos) pkblob_len > 4+7+4 len = toint(GET_32BIT(pkblob+pos)); /* get length of exponent */ if (len < 0 || len > pkblob_len - pos - 4) goto give_up; pos += 4 + len; /* skip over exponent */ if (pkblob_len - pos < 4) goto give_up; len = toint(GET_32BIT(pkblob+pos)); /* find length of modulus */ if (len < 0 || len > pkblob_len - pos - 4) goto give_up; if (sigblob_len < pos+4) goto give_up; siglen = toint(GET_32BIT(sigblob+pos)); if (siglen != sigblob_len - pos - 4) goto give_upWe also come * here as a fallback if we discover above that the key blob * is misformatted in some way. */ give_up:;���#|n�2�e�.B�qo�sP�@pdate(&md5c, cookie, 8); MD5Final(s->session_id, &md5c); for (i = 0; i < 32; i++) ssh->session_key[i] = random_byte(); /* * Verify that the `bits' and `bytes' parameters match. */ if (s->hostkey.bits > s->hostkey.bytes * 8 || s->servkey.bits > s->servkey.bytes * 8) { bombout(("SSH-1 public keys were badly formatted")); crStop(0); } s->len = (s->hostkey.bytes > s->servkey.bytes ? s->hostkey.bytes : s->servkey.bytes); s->rsabuf = snewn(s->len, unsigned char); /* * Verify the host key. */ { /* * First format the key into a string. */ toint(GET_32BIT(s->p)); if (s->nkeys < 0) { logeventf(ssh, "Pageant reported negative key count %d", s->nkeys); s->nkeys = 0; }toint(s->responselen-(s->p-s->response)toint(s->responselen-(s->p-s->response)), &s->key.modulus); if (n < 0) toint(GET_32BIT(s->p)); s->p += 4; if (s->commentlen < 0 || toint(s->responselen - (s->p-s->response)���I.�G}P���mjv�Ld�6;�a|� \Z�4A�Snnel associated with a message. If there's no channel, * or it's not properly open, make a noise about it and return NULL. */ static struct ssh_channel *ssh2_channel_msg(Ssh ssh, struct Packet *pktin) { unsigned localid = ssh_pkt_getuint32(pktin); struct ssh_channel *c; c = find234(ssh->channels, &localid, ssh_channelfind); if (!c || (c->halfopen && pktin->type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION && pktin->type != SSH2_MSG_CHANNEL_OPEN_FAILURE)) { char *buf = dupprintf("Received %s for %s channel %u", ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx, pktin->type), c ? "half-open" : "nonexistent", localid); sfree(buf); return NULL; } return c; } static void ssh2_handle_winadj_response(struct ssh_channel *c, struct Packet *pktin, void *ctx) { unsigned *sizep = ctx; /* * Winadj respon \ do \ { \ int q = toint(offset); \ if (q >= 0 && q+4 <= len) { \ q = toint(q + 4 + GET_32BIT(p+q)); \ if (q >= 0 && q+4 <= len && \ ((q = toint(q + 4 + GET_32BIT(p+q))) != 0) && \ q == len) \ result = TRUE; \ } \ toint(GET_32BIT(p)); /* * Vet the Pageant response to ensure that the key * count and blob lengths make sense. */ if (s->nkeys < 0) { logeventf(ssh, "Pageant response contained a negative" " key count %d", s->nkeys); s->nkeys = 0; goto done_agent_query; } else { unsigned char *q = p + 4; int lenleft = s->agent_responselen - 5 - 4; for (keyi = 0; keyi < s->nkeys; keyi++) { int bloblen, commentlen; if (lenleft < 4) { logeventf(ssh, "Pageant response was truncated"); s->nkeys = 0; goto done_agent_query; } bloblen = toint(GET_32BIT(q)); if (bloblen < 0 || bloblen > lenleft) { logeventf(ssh, "Pageant response was truncated"); s->nkeys = 0; goto done_agent_query; } lenleft -= 4 + bloblen; q += 4 + bloblen; commentlen = toint(GET_32BIT(q)); if (commentlen < 0 || commentlen > lenleft) { logeventf(ssh, "Pageant response was truncated"); s->nkeys = 0; goto done_agent_query; } lenleft -= 4 + commentlen; q += 4 + commentlen; } } toint(GET_32BIT(p)toint(GET_32BIT(p) done_agent_query:;toint(GET_32BIT(s->agentp)); s->agentp += 4; s->pkblob = (char *)s->agentp; s->agentp += s->pklen; s->alglen = toint(GET_32BIT(s->pkblob)); s->alg = s->pkblob + 4; s->commentlen = toint(GET_32BIT(s->agentp)len >= 9 && s->ret[4] == SSH2_AGENT_SIGN_RESPONSE && GET_32BIT(s->ret + 5) <= (unsigned)(s->retlen-9)�F_�F� * Send special codes. TS_EOF is useful for `plink', so you * can send an EOF and collect resulting output (e.g. `plink * hostname sort'). */ static void ssh_special(void *handle, Telnet_Special code) { Ssh ssh = (Ssh) handle; struct Packet *pktout; if (code == TS_EOF) { if (ssh->state != SSH_STATE_SESSION) { /* * Buffer the EOF in case we are pre-SESSION, so we can * send it as soon as we reach SESSION. */ if (code == TS_EOF) ssh->eof_needed = TRUE; return; } if (ssh->version == 1) { send_packet(ssh, SSH1_CMSG_EOF, PKT_END); } else if (ssh->mainchan) { sshfwd_write_eof(ssh->mainchan); ssh->send_ok = 0; /* now stop trying to read from stdin */ } logevent("Sent EOF message"); } else if (code == TS_PING || code == TS_NOP) { if (ssh->state == SSH_STATE_CLOSED || ssh->state == SSH_STATE_PREPACKET) return; if (ssh->version == 1) { if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) send_packet(ssh, SSH1_MSG_IGNORE, PKT_STR, "", PKT_END); } else { if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE)) { pktout = ssh2_pkt_init(SSH2_MSG_IGNORE); ssh2_pkt_addstring_start(pktout); ssh2_pkt_send_noqueue(ssh, pktout); } } } else if (code == TS_REKEY) { if (!ssh->kex_in_progress && ssh->version == 2) { do_ssh2_transport(ssh, "at user request", -1, NULL); } } else if (code == TS_BRK) { if (ssh->state == SSH_STATE_CLOSED || ssh->state == SSH_STATE_PREPACKET) return; if (ssh->version == 1) { logevent("Unable to send BREAK signal in SSH-1"); } else if (ssh->mainchan) { pktout = ssh2_chanreq_init(ssh->mainchan, "break", NULL, NULL); ssh2_pkt_adduint32(pktout, 0); /* default break length */ ssh2_pkt_send(ssh, pktout); } } else { /* Is is a POSIX signal? */ char *signame = NULL; if (code == TS_SIGABRT) signame = "ABRT"; if (code == TS_SIGALRM) signame = "ALRM"; if (code == TS_SIGFPE) signame = "FPE"; if (code == TS_SIGHUP) signame = "HUP"; if (code == TS_SIGILL) signame = "ILL"; if (code == TS_SIGINT) signame = "INT"; if (code == TS_SIGKILL) signame = "KILL"; if (code == TS_SIGPIPE) signame = "PIPE"; if (code == TS_SIGQUIT) signame = "QUIT"; if (code == TS_SIGSEGV) signame = "SEGV"; if (code == TS_SIGTERM) signame = "TERM"; if (code == TS_SIGUSR1) signame = "USR1"; if (code == TS_SIGUSR2) signame = "USR2"; /* The SSH-2 protocol does in principle support arbitrary named * signals, including signame@domain, but we don't support those. */ if (signame) { /* It's a signal. */ if (ssh->version == 2 && ssh->mainchan) { pktout = ssh2_chanreq_init(ssh->mainchan, "signal", NULL, NULL); ssh2_pkt_addstring(pktout, signame); ssh2_pkt_send(ssh, pktout); logeventf(ssh, "Sent signal SIG%s", signame); } } else { /* Never heard of it. Do nothing */ } } } void *new_sock_channel(void *handle, Socket s) { Ssh ssh = (Ssh) handle; struct ssh_channel *c; c = snew(struct ssh_channel); c->ssh = ssh; ssh2_channel_init(c); c->halfopen = TRUE; c->type = CHAN_SOCKDATA_DORMANT;/* identify channel type */ c->u.pfd.s = s; add234(ssh->channels, c); return c; } /* * This is called when stdout/stderr (the entity to which * from_backend sends data) manages to clear some backlog. */ static void ssh_unthrottle(void *handle, int bufsize) { Ssh ssh = (Ssh) handle; int buflimit; if (ssh-> Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dc66d4d777d94b6a50bc1cc6076bc912 Text-delta-base-sha1: 6d4113f14a99aea945339f9fbbf182bfba55368e Text-content-length: 45 Text-content-md5: 5d5f605ad4b400d5b6123d12551a92ff Text-content-sha1: d31028ea7fe92b47933a3e54c47c3e297da965ab Content-length: 45 SVN�� �.��Q=toint(GET_32BIT(*data) Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 28e3614f4ba718f431a4b6fbb218a49e Text-delta-base-sha1: 75382570c7ff6cec639c7a64be5e7bdc44a059ef Text-content-length: 48 Text-content-md5: db1fcfef183ade3571a3101f284c2c9f Text-content-sha1: cce6fb0f54029aea61b54eba6871d54e8f7f1778 Content-length: 48 SVN��kr ���D'toint(GET_32BIT(buf + i) Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fa8f3b9d48713adc08b43ee528e38ede Text-delta-base-sha1: 02081b87d25de836d5dda38626ed07ee9f69431c Text-content-length: 45 Text-content-md5: e349b8559ac6847b00a80f7eaba81b98 Text-content-sha1: 394642090b7b5a665c308443dc8ba2cb85314326 Content-length: 45 SVN��,3 �g��6vtoint(GET_32BIT(*data) Node-path: putty/unix/uxagentc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c02d2c527422463bf265988e8a7eb48 Text-delta-base-sha1: 3d658c985992c42d3f0b40f47e8c3d929ffa3966 Text-content-length: 154 Text-content-md5: 117a08282bd929683decad9df8127b63 Text-content-sha1: 59f704326697e643ca331d411d95895d9b89303e Content-length: 154 SVN��0& �}��' toint(GET_32BIT(conn->retbuf) + 4); if (conn->retsize <= 0) { conn->retbuf = NULL; conn->retlen = 0; goto done; } Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8d0746e9c3dbfbb91d8e2fc5a4ab9d40 Text-delta-base-sha1: a7f0843e86d07f96b84e94d22d11fd6e254b7983 Text-content-length: 721 Text-content-md5: 15d2a9a3dcca2a28066f19d72e795025 Text-content-sha1: e2fee68d17ebcedefedd197ca67168f145dd6411 Content-length: 721 SVN��t@Ot�M��qT�#f�(/�FM�/s�ZrN�zH�t)L�lRO�iuK�atoint(GET_32BIT(keylist)); if (nkeys < 0toint(4 + GET_32BIT(p)); if (n < 0 || toint(4 + GET_32BIT(p)); if (n < 0 || toint(GET_32BIT(p)); if (b.len < 0 || b.len > msgend - (p+4)) goto failure; p += 4toint(GET_32BIT(p)); p += 4; if (datalen < 0 || datalen > msgend - ptoint(GET_32BIT(p)); if (commentlen < 0 || commentlen > msgend - ptoint(GET_32BIT(p)); p += 4; if (alglen < 0 || alglen > msgend - ptoint(GET_32BIT(p)); p += 4; if (commlen < 0 || commlen > msgend - ptoint(GET_32BIT(p)); p += 4; if (b.len < 0 || b.len > msgend - p Revision-number: 9919 Prop-content-length: 196 Content-length: 196 K 7 svn:log V 96 Fix another giant batch of resource leaks. (Mostly memory, but there's one missing fclose too.) K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-14T10:46:07.133031Z PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b82c5b2d2bfc695a4e6fcf66cb99376 Text-delta-base-sha1: 1c7957cc783a16b7a938605dbf330587b8f1ba14 Text-content-length: 622 Text-content-md5: 0626214c08a51c655bb4f7ae3d611e9b Text-content-sha1: 925b096921492cbef7e62a10c575b6b64705fe08 Content-length: 622 SVN��JZ1/��D�;W�P;�<l�e �!x�(" { sfree(line); break; /* done */ } { sfree(line); break; /* done */ }fclose(fp); if (errmsg_p) *errmsg_p = NULL; return ret; error: if (fp) fclose(fp); answer = 0; *comment = NULL; if (!key) goto done; /* * Check magic number. */ if (GET_32BIT(key->keyblob) != 0x3f6ff9eb) { goto done; /* key is invalid */ } /* * Find the cipher-type string. */ ? key->comment : "" Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d7651e4c37fdfe9cb9cd8c1e5a178c3b Text-delta-base-sha1: 76179fcad7b4a4d46daff34a6604995ca799a6e9 Text-content-length: 41 Text-content-md5: 020eb520d26814f8f0d10b973bc3ec3b Text-content-sha1: c158e82178b38cf05a4793b447727d3115d5cc3e Content-length: 41 SVN��_z �3��3,sfree(dummy_realhost Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e83ca4d9df86093ab9adda87ee3b3fec Text-delta-base-sha1: 71d81744b7fc8f50b0d247d944468fb8a8a025ee Text-content-length: 48 Text-content-md5: 9bcafab8522046be77aecc28901d51ec Text-content-sha1: d3f4ec7401285d39af4a3f867fb9961e2bfb8005 Content-length: 48 SVN��B\ �Z��jX sfree(pplug) Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0c692103807e5b08ff9f945b0dcb6712 Text-delta-base-sha1: 12ff056156377c8cdc986437b88887c99aef824d Text-content-length: 158 Text-content-md5: e5fd1c87b5b96e788eb972a74a55d74b Text-content-sha1: b83a629de6dc2c02d2e6a035d3773ec872a1c2e2 Content-length: 158 SVN�� v�n��?m�F9� sfree(newsource); { close_rfile(f); return; } { close_rfile(f); return; } Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e3688e3802f5980a208d2258d3229a1c Text-delta-base-sha1: f5a3ffa05c54ab7227ceaa4821b60a35c50a5982 Text-content-length: 75 Text-content-md5: afd7e980247a184ab61e2a0f9d02c5c5 Text-content-sha1: 1c16723a08d17834620436674fe6c436deb06d70 Content-length: 75 SVN��g)�v��*u�K sfree(unwcdir); sfree(line Node-path: putty/raw.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 10526770ea1f8cae3c35fe918cbef4d4 Text-delta-base-sha1: 47ec7f8b8408ee84bb2bf05f3ebf6a3cdc3b44d2 Text-content-length: 31 Text-content-md5: a9053ae35b1ff611e79220ef046f42ff Text-content-sha1: 16f9bcd6244462eb49bad087c528740691ab0e38 Content-length: 31 SVN��[k �^��X sfree( Node-path: putty/rlogin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bbcc3355ad5915991ebac78bb92b273e Text-delta-base-sha1: 7f46cdd1b9b249d07bb832314ae06a55e8446199 Text-content-length: 31 Text-content-md5: b4edd67494793ce3b3e194c6d1a98566 Text-content-sha1: 2254ad311bcdc8bd807e26fb0dfde92f73799ff0 Content-length: 31 SVN��L\ �(��*" sfree( Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cf0970292e6d0c2cf07c56a60544d419 Text-delta-base-sha1: 74f3763e1d10d71b6a41e7f7ef84156e58150462 Text-content-length: 261 Text-content-md5: 3a578ec00016e104cb2f651dd05dff87 Text-content-sha1: 83b4c6f92d6ecc19a93837bc770b2e2b255b181b Content-length: 261 SVN�����������.�s�^� P�D:rportfwd pf, *pfp; int remoteid; int hostsize, port; char *host; const char *e struct ssh_channel *c = snew(struct ssh_channel); c->ssh = ssh; ����~�ha�_a�_�* Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d5f605ad4b400d5b6123d12551a92ff Text-delta-base-sha1: d31028ea7fe92b47933a3e54c47c3e297da965ab Text-content-length: 67 Text-content-md5: b9443a402404f425c9c16a20ef05483f Text-content-sha1: 545237c44d271b4f6cd58d8ba9296210c4af3400 Content-length: 67 SVN��L&� ��{��u1); freebn(u2 freebn(ytest Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: db1fcfef183ade3571a3101f284c2c9f Text-delta-base-sha1: cce6fb0f54029aea61b54eba6871d54e8f7f1778 Text-content-length: 56 Text-content-md5: ce593c54d1cdd9a0b066eb6cc1b6dfe8 Text-content-sha1: 0183ac3093a0d2743f4901a2760df58bbe187e53 Content-length: 56 SVN��r �O��%M else sfree(comment) Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e349b8559ac6847b00a80f7eaba81b98 Text-delta-base-sha1: 394642090b7b5a665c308443dc8ba2cb85314326 Text-content-length: 49 Text-content-md5: d958d48dec77b0f7fa691945b7e928e3 Text-content-sha1: 60050037bc66c2baf1693952df1874cdfaa3aa69 Content-length: 49 SVN��3U���<|�U}�/freebn(freebn(q Node-path: putty/telnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9159d750f7580ba5c8f17fa732294f81 Text-delta-base-sha1: 0aedb6804e5d410f45ab6f15fdfa58ecb9a39af2 Text-content-length: 35 Text-content-md5: f2856637cf7818211ac8942d4c137dd6 Text-content-sha1: 5471a276b2bc6a96dd4e330b2abdbb625095a3bd Content-length: 35 SVN��;K �}��Dw sfree( Node-path: putty/unix/gtkfont.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 012cfbd5af6f6dbb82f2043cee2ea8eb Text-delta-base-sha1: f178600d6cb10273b60595b8aea43c801178f211 Text-content-length: 120 Text-content-md5: f3e78bb3db7c8dd79d6cbdb77c46e9e4 Text-content-sha1: 8a216f270cba8fa99fa36ca4b13994236d0edd7b Content-length: 120 SVN��a _�Q�_�a� { sfree(dupname); return NULL; /* XLFD was malformed */ } Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 329c61846af46894c7fa9b47fba85d01 Text-delta-base-sha1: a5023687b8a245400500447cf7f0db255a9ae813 Text-content-length: 286 Text-content-md5: 1301857887e66b3d3a87bab21a83de45 Text-content-sha1: a16e577bf1311edd13cf069d3fcb3cd6bdfab121 Content-length: 286 SVN����.j� ��;8�sl�F�2U�g�1etitle = dupcat(appname, " Reconfiguration", NULL)msgboxtext sfree(args sfree(args)sfree(data�/jj�/�ECT(menuitem), "user-data", GINT_TO_POINTER(specials[i].code)); gtk_signal_connect(GTK_OBJECT(me Node-path: putty/unix/uxgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 143d445cd0bff001d58ca6fd6a33180b Text-delta-base-sha1: 2aaa5d0ca8d9449d6f6c2aab79452c4123747129 Text-content-length: 42 Text-content-md5: 8b32fb074383b39f6ef5cfe2cfaca79c Text-content-sha1: 9b1ec586c25a66b8b8b95da47fc30edb0f28dfdf Content-length: 42 SVN��x �w��t sfree(buf Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a55d8cab4fa2c17ae05f7603d888c34 Text-delta-base-sha1: 26750fb9480f8c640d3b80521b94fe6067f3e7bb Text-content-length: 38 Text-content-md5: e13a56633a960c9e5c1ff149452d7ca6 Text-content-sha1: e741c750615227c69d43b2360b37ba5ae695d2fc Content-length: 38 SVN��# �-��e* sfree(cmd Node-path: putty/unix/uxser.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0db113058dd6b3acb67911db127054b9 Text-delta-base-sha1: 3a373884a0693b7d7de132fad6926733d31c132c Text-content-length: 31 Text-content-md5: b9e28d689203df9aa57d0c00a464a60b Text-content-sha1: 553290e6f78f729fe5e94fb0e8144ca88cfce28b Content-length: 31 SVN��\p �:��,0 sfree( Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 63613e73d31bc7fc9eaa814a92b9908b Text-delta-base-sha1: da48bbf6315f3f86ead2bf3947ab398c52eabcfe Text-content-length: 202 Text-content-md5: 60b56ff597d4a2f9386bc09a973c5c4f Text-content-sha1: 1fd773a3bce0f2ef74b50fe2515137409c661d74 Content-length: 202 SVN��E,�'��l$�Vo sfree(buf sfree(buf); return NULL; } if (ret == 0) { /* eof on stdin; no error, but no answer either */ sfree(buf); Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 726e3655f1d07b5f5f2c1b9b13349d57 Text-delta-base-sha1: 2eaabcfcfbaf6111ca9e7c9f319d2d6a7e36d30b Text-content-length: 115 Text-content-md5: 4174f9109d1f4fdad036b4c8d0cc797c Text-content-sha1: e3a82c3eb30e2ed4441f9a168744f25a7d07a754 Content-length: 115 SVN��r0I�u��Z �Ku�e�!J�` { sfree(line); continue; } sfree(line Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d75fab530e16d20ea15192bf63d3fdf5 Text-delta-base-sha1: 580d62ac3aaea70b1b141d8a094e2bd86e74a6da Text-content-length: 72 Text-content-md5: 062288aa464dd9ace81b09f8486265cb Text-content-sha1: e8d47ea7ffc0aef8c7d2aea8735a6eb39e1250d4 Content-length: 72 SVN��X|&���Z�lz�y_sfree(dispourhostname = get_hostname() Revision-number: 9920 Prop-content-length: 312 Content-length: 312 K 8 svn:date V 27 2013-07-14T10:46:17.993813Z K 7 svn:log V 211 Add a missing null pointer check in wc_unescape, to bring it in line with the usage comment saying you're allowed to pass NULL to find out only the return value. No caller actually does pass NULL at the moment. K 10 svn:author V 5 simon PROPS-END Node-path: putty/wildcard.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ae8fc5f0684067464d098be448e6e051 Text-delta-base-sha1: d091225f7d3c7a065476638eff503ef5a06d7f01 Text-content-length: 37 Text-content-md5: 7548f3da36cd6a7b5bb171807ddf0071 Text-content-sha1: 624d9f43f17a5428ec3f46be25f78c9793d8ae11 Content-length: 37 SVN��+? ���if (output) Revision-number: 9921 Prop-content-length: 340 Content-length: 340 K 7 svn:log V 239 Move the calculation of the exchange hash to above the various warnings about insecure crypto components. The latter may crReturn (though not in any current implementation, I believe), which invalidates pktin, which is used by the former. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-14T10:46:27.103927Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3a578ec00016e104cb2f651dd05dff87 Text-delta-base-sha1: 83b4c6f92d6ecc19a93837bc770b2e2b255b181b Text-content-length: 82 Text-content-md5: caf2ddecf246120c0d84421c60aa2596 Text-content-sha1: 30b2e365678e0b6da1bedffaaa5a08709abb6174 Content-length: 82 SVN�������������M��R�~T� `��������aa��a� Revision-number: 9922 Prop-content-length: 307 Content-length: 307 K 8 svn:date V 27 2013-07-14T10:46:29.363567Z K 7 svn:log V 206 Add an extended version of ctrl_alloc which permits you to provide a custom free function, in case you need to ctrl_alloc a structure which then has additional dynamically allocated things dangling off it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/dialog.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: da92b4584d4ae937b0fc7a0669fab8fa Text-delta-base-sha1: 98b9f18ff113383a9d920f8686a06829065b6a0e Text-content-length: 599 Text-content-md5: 07e777893d0578c03fe659ebc335b9a8 Text-content-sha1: b2e5cc95c298edc2b0310876c86db9cb4953c2a6 Content-length: 599 SVN��1V +���I`�-_� e[�# ret->freefuncb->freefuncs[i](b->frees[i]); sfree(b->ctrlsets); sfree(b->frees); sfree(b->freefunc_with_free(struct controlbox *b, size_t size, ctrl_freefn_t freefunc b->freefuncs = sresize(b->freefuncs, b->freesize, ctrl_freefn_t); } b->frees[b->nfrees] = p; b->freefuncs[b->nfrees] = freefunc; b->nfrees++; return p; } static void ctrl_default_free(void *p) { sfree(p); } void *ctrl_alloc(struct controlbox *b, size_t size) { return ctrl_alloc_with_free(b, size, ctrl_default_free) Node-path: putty/dialog.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b25f4c90121ae330d40253bc1b0b19ac Text-delta-base-sha1: 7974406f8456e3d0064705d8c5e6c4f3b9c9173c Text-content-length: 529 Text-content-md5: d2c14744f4c45c1855fb2cb7b07637b5 Text-content-sha1: 9b647072f809e044266c063fc0168ebb4d74ad79 Content-length: 529 SVN��n)i�|�L�wzJ�mS�95typedef void (*ctrl_freefn_t)(void *); /* used by ctrl_alloc_with_free */ ctrl_freefn_t *freefuncs; /* parallel array of free functions * ctrl_alloc_with_free also allows you to provide a function to free * the structure, in case there are other dynamically allocated bits * and pieces dangling off it. */ void *ctrl_alloc(struct controlbox *b, size_t size); void *ctrl_alloc_with_free(struct controlbox *b, size_t size, ctrl_freefn_t freefunc Revision-number: 9923 Prop-content-length: 538 Content-length: 538 K 7 svn:log V 437 Use the new ctrl_alloc_with_free to clean up a long-standing FIXME in the session saving code, in which the contents of the edit box giving the current saved session name was stored in a horrid place with a fixed length. Now it's dangling off sessionsaver_data as it always ought to have been, and it's dynamically reallocated to the appropriate length, and there's a free function that cleans it up at the end of the dialog's lifetime. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-14T10:46:34.973706Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cd503d349ee01c2f5bbd59cab734eb82 Text-delta-base-sha1: 5fcf4a0ed68cc6befcf5c69ef5370db9ba5c0443 Text-content-length: 1170 Text-content-md5: 45661743bfc57d128d07ab62b212be9e Text-content-sha1: 958af0481f0bad0d2113a6b492a50f78f5e195fc Content-length: 1170 SVN��&a#�5��ETq�c��#9e�!_��p�T�;p�5V�V%)�NA char *savedsession; /* the current contents of ssd->editbox */ }; static void sessionsaver_data_free(void *ssdv) { struct sessionsaver_data *ssd = (struct sessionsaver_data *)ssdv; sfree(ssd->savedsession); sfree(ssd); }sfree(ssd->savedsession); ssd->savedsession = dupstr(isdef ? "" : ssd->sesslist.sessions[i]); if (maybe_launch) *maybe_launch = !isdef; if (event == EVENT_REFRESH) { if (ctrl == ssd->editbox) { dlg_editbox_set(ctrl, dlg, ssd-> sfree(ssd->savedsession); ssd->savedsession = dlg_editbox_get(ctrl, dlgsd->sd->savedsession, "Default Settings"); if (!ssd-> sfree(ssd->savedsession); ssd->savedsession = dupstr(isdef ? "" : ssd->sesslist.sessions[i]); } { char *errmsg = save_settings(ssd->dlg,_with_free(b, sizeof(struct sessionsaver_data), sessionsaver_data_free); memset(ssd, 0, sizeof(*ssd)); ssd->savedsession = dupstr("" Revision-number: 9924 Prop-content-length: 463 Content-length: 463 K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-14T10:46:39.163840Z K 7 svn:log V 362 Remove a return path from sshcom_write() which was both unreachable (it would trigger if !type==RSA and !type==DSA, but one of those must have been true to get there in the first place) and erroneous (it would return NULL without going through the cleanup code). Since the code's internal structure guarantees that path isn't reached, replace it with an assert. PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0626214c08a51c655bb4f7ae3d611e9b Text-delta-base-sha1: 925b096921492cbef7e62a10c575b6b64705fe08 Text-content-length: 108 Text-content-md5: 572b6f78858e11426cd7cbec3360fc0d Text-content-sha1: f79b0d4cb18f54f230ed8f405a67334ca4f667b4 Content-length: 108 SVN��ZL��L�3/�eu{ assert(type == DSA); /* the only other option from the if above */ Revision-number: 9925 Prop-content-length: 151 Content-length: 151 K 7 svn:log V 51 Remove a pointless assignment in setup_config_box. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-14T10:46:42.873922Z PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 45661743bfc57d128d07ab62b212be9e Text-delta-base-sha1: 958af0481f0bad0d2113a6b492a50f78f5e195fc Text-content-length: 329 Text-content-md5: 5273e2f0595f24e854ce6bf496ae4531 Text-content-sha1: aecdc01b8356c197a36e1320d16b9ba1ef402148 Content-length: 329 SVN��&,� �,�RTtrl_radiobuttons(s, "Close window on exit:", 'x', 4, HELPCTX(session_coe), conf_radiobutton_handler, I(CONF_close_on_exit), "Always", I(FORCE_ON), "Never", I(FORCE_OFF), Revision-number: 9926 Prop-content-length: 446 Content-length: 446 K 8 svn:date V 27 2013-07-14T10:46:55.684644Z K 7 svn:log V 345 Remove a redundant while-loop condition when reading RFC822-style header text from a PuTTY key file. (It's silly to have both while (len > 0) at the top of the loop _and_ an if (len == 0) return in the middle, and in fact the former was the erroneous one since it would have prohibited a 39-character header, which I intended to be permitted.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshpubk.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ce593c54d1cdd9a0b066eb6cc1b6dfe8 Text-delta-base-sha1: 0183ac3093a0d2743f4901a2760df58bbe187e53 Text-content-length: 25 Text-content-md5: af01b329b1711166398e0ab70ea8645e Text-content-sha1: b1cd348a7be137e75543a6c6fb237d3d46e72cdf Content-length: 25 SVN�� �"��j)1 Revision-number: 9927 Prop-content-length: 366 Content-length: 366 K 8 svn:date V 27 2013-07-14T17:08:35.236931Z K 7 svn:log V 265 In the various channel request mini-coroutines, replace crWaitUntilV(pktin) with plain crReturnV, because those coroutines can be called back either with a response packet from the channel request _or_ with NULL by ssh_free meaning 'please just clean yourself up'. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: caf2ddecf246120c0d84421c60aa2596 Text-delta-base-sha1: 30b2e365678e0b6da1bedffaaa5a08709abb6174 Text-content-length: 1071 Text-content-md5: 84169ef7fda3a5ff21d523f4338f1486 Text-content-sha1: 9e57224a1c98dbe022124151148c2389d1c7fd70 Content-length: 1071 SVN������������������1�r�{�a�f{�h{�_�\Y�|M/* Wait to be called back with either a response packet, or NULL * meaning clean up and free our data */ crReturnV/* Wait to be called back with either a response packet, or NULL * meaning clean up and free our data */ crReturnV/* Wait to be called back with either a response packet, or NULL * meaning clean up and free our data */ crReturnV /* Wait to be called back with either a response packet, * or NULL meaning clean up and free our data */ crReturnV�a77�a�ial); } else if (ssh->version == 2) { if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE)) ADD_SPECIALS(ssh2_ignore_special); if (!(ssh->remote_bugs & BUG_SSH2_REKEY)) ADD_SPECIALS(ssh2_rekey_special); if (ssh->mainchan) ADD_SPECIALS(ssh2_session_specials); } /* else we're not ready yet */ if (i) { ADD_SPECIALS(specials_end); return ssh_specials; } else { return NULL; } #undef ADD_SPECIALS } / Revision-number: 9928 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2013-07-15T06:40:59.445966Z K 7 svn:log V 117 Fix a build failure: r9924 thoughtlessly put an assert before some declarations, and gcc didn't complain but VC did. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 572b6f78858e11426cd7cbec3360fc0d Text-delta-base-sha1: f79b0d4cb18f54f230ed8f405a67334ca4f667b4 Text-content-length: 157 Text-content-md5: a96ff0f10ffa679401b22c978ae5175c Text-content-sha1: 840018c5f46b4cd5f9af8d9882a7839dd5151037 Content-length: 157 SVN���'��[&struct mpint_pos p, q, g, x, y; int pos = 4; assert(type == DSA); /* the only other option from the if above */ Revision-number: 9929 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9930 Prop-content-length: 359 Content-length: 359 K 7 svn:log V 258 It suddenly strikes me as probably a good idea to enforce that anyone calling random_byte has previously called random_ref. (I'm not aware of any current code getting this wrong! It just seems to me to be the sort of thing you'd want to be really sure of.) K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-19T17:44:20.690689Z PROPS-END Node-path: putty/sshrand.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f600391de36ffe1cabd6348825767bbb Text-delta-base-sha1: 608cbef1523001db40ebe337c698e67514a8f6ec Text-content-length: 44 Text-content-md5: 960804e7b0033c3fbd6ab5c7ed8a4e8d Text-content-sha1: 440c97452bc77857ee71ea1603463859936b1edd Content-length: 44 SVN��a} �!��Eassert(random_active); Revision-number: 9931 Prop-content-length: 212 Content-length: 212 K 7 svn:log V 111 Add a missing error check in pterm's child-process setup. Shouldn't really fail, but might as well be careful. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-19T17:44:22.600723Z PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 663faa36b5e80e4e7f9d705695b5f482 Text-delta-base-sha1: 3d1ae4ae10c759219ae1dba61f020d21bdb21d29 Text-content-length: 159 Text-content-md5: a391d8d882054aab30f754d2827b7515 Text-content-sha1: 8970481265d14cecf3958ea67a18259061a8659e Content-length: 159 SVN��tR���8< { int ptyfd = open(pty->name, O_WRONLY, 0); if (ptyfd >= 0) close(ptyfd); } Revision-number: 9932 Prop-content-length: 302 Content-length: 302 K 7 svn:log V 201 Add a nonfatal() function everywhere, to be used for reporting things that the user really ought to know but that are not actually fatal to continued operation of PuTTY or a single network connection. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-19T17:44:28.490902Z PROPS-END Node-path: putty/cmdgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e58f6a4cdc3e86b1dab43b40b331aac5 Text-delta-base-sha1: ebb2bd856c33cdc4a22e1901834c119568d62e7c Text-content-length: 96 Text-content-md5: 3d4133c70793c794cce1ac9ba26fee5a Text-content-sha1: 97a2d3898f50e2ff8cd314471d87f3b2e94a11a4 Content-length: 96 SVN��a C�t�C�fv�pqvoid nonfatal(char *p, ...) { va_list ap; fprintf(stderr, " Node-path: putty/macosx/osxmain.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f2a1d03dca106fd5eb99903a56d8d861 Text-delta-base-sha1: 010f0c51b441696ecd22ef24b3a2a7eee4f66da9 Text-content-length: 396 Text-content-md5: 5f2b38721c76c6eccacc77fff4203a80 Text-content-sha1: 3b6e9838c20e139893c09c4a8dfbadf3c24049bc Content-length: 396 SVN��IH t�a�t�sVnonfatal(void *frontend, char *p, ...) { char *errorbuf; NSAlert *alert; va_list ap; va_start(ap, p); errorbuf = dupvprintf(p, ap); va_end(ap); alert = [[[NSAlert alloc] init] autorelease]; [alert addButtonWithTitle:@"Error"]; [alert setInformativeText:[NSString stringWithCString:errorbuf]]; [alert runModal]; sfree(errorbuf Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e5fd1c87b5b96e788eb972a74a55d74b Text-delta-base-sha1: b83a629de6dc2c02d2e6a035d3773ec872a1c2e2 Text-content-length: 48 Text-content-md5: b47d11dd2ccff0e77234b6e2afa7698a Text-content-sha1: cad2afb42fd2629782827aa4d9cec3f6cef8fc70 Content-length: 48 SVN�����;�pl�nnonfatal(Error Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: afd7e980247a184ab61e2a0f9d02c5c5 Text-delta-base-sha1: 1c16723a08d17834620436674fe6c436deb06d70 Text-content-length: 97 Text-content-md5: c20b6211508a0f80368c65591a63ab73 Text-content-sha1: e69d2e66ffd45b2644bf024c77bfdfa937cc9003 Content-length: 97 SVN�� 5�M��6�a=�7�'mnonfatalError} void connection_fatal(void *frontend, Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c0d6cfa9cce3b71e602af4242fd1dfd Text-delta-base-sha1: 23e97af052e3f06fa0a31cd69c426bd483243269 Text-content-length: 35 Text-content-md5: d47435bf6d083f64858279d55abe5086 Text-content-sha1: 03c4bafabeed632025c7d5734aaf113761c58471 Content-length: 35 SVN��l �_�� Lnonfatal( Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bba69f563b26f0c8f5b56b26c4b01969 Text-delta-base-sha1: fe736fc80cad6f8cf0086e0ff5cef580d9e9012a Text-content-length: 69 Text-content-md5: b81fd419a33d144926fe67ce7e6ce824 Text-content-sha1: 6dbb8ffd0d03bea45d8e8fff73a9eba6ffa96b45 Content-length: 69 SVN���������3?�P��Ku�NF�$X�"nonvoid nonfatal Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 95bc3a7f85ad19d8e176f2d87cc4bb16 Text-delta-base-sha1: fe396761c5532830746619cbfd85ced4d253e7a7 Text-content-length: 24 Text-content-md5: 5d7c8df868db2f410d50149018032d51 Text-content-sha1: 40c3f0ae5a30437141f70ad5a10af88f81a98c41 Content-length: 24 SVN��%Y �F��non Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 76d330139bcb41ad382f9b4332758c82 Text-delta-base-sha1: 918abb67f3b2afa6b0a712e2ca1be92af957e185 Text-content-length: 42 Text-content-md5: 60a729a0d876c699c57dbf58337ae640 Text-content-sha1: 347b2eff6a714b2e0dacb02b01c645581e74cf7d Content-length: 42 SVN��~, �^��]�A3�'Wnonfatal( Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e9e6aacf8ca7ca3f56038b1abf74932c Text-delta-base-sha1: 4f96690a464ecf629bdd04cc01a2df0bbb285f54 Text-content-length: 128 Text-content-md5: 8b12b817ca2e6be82f7a29415b22f398 Text-content-sha1: 2d471a7a5158738dc953e2f04e23c14a17ff7b0b Content-length: 128 SVN���������tOK��K�+J�bs�i /* * Print a message box and don't close the connection. */ void nonfatal Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d9d132c6e6e286729e5bf9373a3d35df Text-delta-base-sha1: b33dedc1309db417475812ab51f444461227da30 Text-content-length: 91 Text-content-md5: ef8ef972502e5b66663cdf3b50bff4ad Text-content-sha1: 0ce003b5cb2bb37cf251d11c11da3caa41117522 Content-length: 91 SVN�� �>�e��/�.^nonfatal(char *p, ...) { va_list ap; fprintf(stderr, " Revision-number: 9933 Prop-content-length: 196 Content-length: 196 K 8 svn:date V 27 2013-07-19T17:44:33.891447Z K 7 svn:log V 96 Add proper error reports in write_random_seed, via the new 'nonfatal' error reporting function. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4174f9109d1f4fdad036b4c8d0cc797c Text-delta-base-sha1: e3a82c3eb30e2ed4441f9a168744f25a7d07a754 Text-content-length: 1255 Text-content-md5: 10f11540fd4d75f22eb7209716eff382 Text-content-sha1: cdc27948aba733c5bfce579c67f28f4b21dca009 Content-length: 1255 SVN��0* O�k�O�p@ if (errno != ENOENT) { char *msg = dupprintf("Unable to write random seed: open(\"%s\") " "returned '%s'", fname, strerror(errno)); nonfatal(msg); sfree(msg); return; } char *dir; dir = make_filename(INDEX_DIR, NULL); if (mkdir(dir, 0700) < 0) { char *msg = dupprintf("Unable to write random seed: mkdir(\"%s\") " "returned '%s'", dir, strerror(errno)); nonfatal(msg); sfree(msg); sfree(dir); return; } sfree(dir); fd = open(fname, O_CREAT | O_WRONLY, 0600); if (errno != ENOENT) { char *msg = dupprintf("Unable to write random seed: open(\"%s\") " "returned '%s'", fname, strerror(errno)); nonfatal(msg); sfree(msg); return; } } while (len > 0) { int ret = write(fd, data, len); if (ret < 0) { char *msg = dupprintf("Unable to write random seed: write " "returned '%s'", strerror(errno)); nonfatal(msg); sfree(msg); break; } Revision-number: 9934 Prop-content-length: 137 Content-length: 137 K 8 svn:date V 27 2013-07-19T17:44:38.301583Z K 7 svn:log V 37 Report errors in store_host_key too. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 10f11540fd4d75f22eb7209716eff382 Text-delta-base-sha1: cdc27948aba733c5bfce579c67f28f4b21dca009 Text-content-length: 570 Text-content-md5: 22501c5e84da19ebac7d60ec292aedfe Text-content-sha1: bc622d8a1aebb74b6413354b4cd258817be319a4 Content-length: 570 SVN��* �-�8� `�<n && errno == ENOENT) { char *dir; dir = make_filename(INDEX_DIR, NULL); if (mkdir(dir, 0700) < 0) { char *msg = dupprintf("Unable to store host keydir); sfree(tmpfilename); return; } sfree(dir); wfp = fopen(tmpfilename, "w"); } if (!wfp) { char *msg = dupprintf("Unable to store host key: open(\"%s\") " "returned '%s'", tmpfilename, strerror(errno)); nonfatal(msg); sfree(tmpfilename); Revision-number: 9935 Prop-content-length: 194 Content-length: 194 K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-19T17:44:42.451234Z K 7 svn:log V 94 Run the random pool setup and teardown functions with random_active nonzero rather than zero. PROPS-END Node-path: putty/sshrand.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 960804e7b0033c3fbd6ab5c7ed8a4e8d Text-delta-base-sha1: 440c97452bc77857ee71ea1603463859936b1edd Text-content-length: 234 Text-content-md5: c48194b7953778d21d9544c5046074be Text-content-sha1: c96fd925110f8f84f1619eeb133e49f391adecc7 Content-length: 234 SVN��}$L�5��&34�}� random_active++;} void random_unref(void) { assert(random_active > 0); if (random_active == 1) { random_save_seed(); expire_timer_context(&pool); } random_active-- Revision-number: 9936 Prop-content-length: 140 Content-length: 140 K 8 svn:date V 27 2013-07-19T17:44:47.001826Z K 7 svn:log V 40 Add some missing calls to cleanup_exit. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1301857887e66b3d3a87bab21a83de45 Text-delta-base-sha1: a16e577bf1311edd13cf069d3fcb3cd6bdfab121 Text-content-length: 56 Text-content-md5: 539723ac803cdfde6b96ae2d8651ebaf Text-content-sha1: 62018d2c35c48d9bb228aafb7a81491393bebeaf Content-length: 56 SVN���� �s��scleanup_�!��(GTK_OBJ Node-path: putty/unix/uxpterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3e93863a37db61e55908a45ebc994e7f Text-delta-base-sha1: 738110002dc187aafbece2afcd531e10f9a0e658 Text-content-length: 155 Text-content-md5: b00890a4aa4d4e6569806b4e4b861e71 Text-content-sha1: 9760faba77e09f73076852a669a8b8341af0dae1 Content-length: 155 SVN��' �'��f&x int ret; = pt_main(argc, argv); cleanup_exit(ret); return ret; /* not reached, but placates optimisers */ } Node-path: putty/unix/uxputty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: baf226927c3b7f4add95d30f76e5a86d Text-delta-base-sha1: 8c76ee84a29b8ad4b4748416b680af423415ab47 Text-content-length: 153 Text-content-md5: 16f98313822e96c000061c100536c69e Text-content-sha1: 0eeefb90a8addca082038b68a9b2aaa9b02c3f25 Content-length: 153 SVN��y �M��+Hxint ret; = pt_main(argc, argv); cleanup_exit(ret); return ret; /* not reached, but placates optimisers */ } Revision-number: 9937 Prop-content-length: 155 Content-length: 155 K 8 svn:date V 27 2013-07-19T17:44:53.511972Z K 7 svn:log V 55 Better error reporting when failing to save a session. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 22501c5e84da19ebac7d60ec292aedfe Text-delta-base-sha1: bc622d8a1aebb74b6413354b4cd258817be319a4 Text-content-length: 730 Text-content-md5: 6a67574211e8fd67f78d4a7f2edf4df9 Text-content-sha1: d09fac6e3e94ed74161fe7301210226e74fcadbc Content-length: 730 SVN�� |9�{�p�-I�o */ filename = make_filename(INDEX_DIR, NULL); if (mkdir(filename, 0700) < 0 && errno != EEXIST) { *errmsg = dupprintf("Unable to save session: mkdir(\"%s\") " "returned '%s'", filename, strerror(errno)); sfree(filename); return NULL; } sfree(filename); filename = make_filename(INDEX_SESSIONDIR, NULL); if (mkdir(filename, 0700) < 0 && errno != EEXIST) { *errmsg = dupprintf("Unable to save session: mkdir(\"%s\") " "returned '%s'", filename, strerror(errno)); sfree(filename); return NULLsave session: open(\"%s\") " "returned '%s'", Revision-number: 9938 Prop-content-length: 376 Content-length: 376 K 8 svn:date V 27 2013-07-19T17:44:58.122014Z K 7 svn:log V 275 Add some conditionally-compilable diagnostics to the RNG. I got briefly worried that it might not be doing what I thought it was doing, but examining these diagnostics shows that it is after all, and now I've written them it would be a shame not to keep them for future use. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshrand.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c48194b7953778d21d9544c5046074be Text-delta-base-sha1: c96fd925110f8f84f1619eeb133e49f391adecc7 Text-content-length: 2323 Text-content-md5: 30ed17f58d032ddcbe967a35efe5c143 Text-content-sha1: e44b0a1cedd329eaccf1f414d2e52cadcbb54dda Content-length: 2323 SVN��$"e�+��z)O�!�*8L�Ca#ifdef RANDOM_DIAGNOSTICS int random_diagnostics = 0; #endif#ifdef RANDOM_DIAGNOSTICS { int p, q; printf("random stir starting\npool:\n"); for (p = 0; p < POOLSIZE; p += HASHSIZE) { printf(" "); for (q = 0; q < HASHSIZE; q += 4) { printf(" %08x", *(word32 *)(pool.pool + p + q)); } printf("\n"); } printf("incoming:\n "); for (q = 0; q < HASHSIZE; q += 4) { printf(" %08x", *(word32 *)(pool.incoming + q)); } printf("\nincomingb:\n "); for (q = 0; q < HASHINPUT; q += 4) { printf(" %08x", *(word32 *)(pool.incomingb + q)); } printf("\n"); random_diagnostics++; } #endif #ifdef RANDOM_DIAGNOSTICS if (i == 0) { int p, q; printf("random stir midpoint\npool:\n"); for (p = 0; p < POOLSIZE; p += HASHSIZE) { printf(" "); for (q = 0; q < HASHSIZE; q += 4) { printf(" %08x", *(word32 *)(pool.pool + p + q)); } printf("\n"); } printf("incoming:\n "); for (q = 0; q < HASHSIZE; q += 4) { printf(" %08x", *(word32 *)(pool.incoming + q)); } printf("\nincomingb:\n "); for (q = 0; q < HASHINPUT; q += 4) { printf(" %08x", *(word32 *)(pool.incomingb + q)); } printf("\n"); } #endif #ifdef RANDOM_DIAGNOSTICS { int p, q; printf("random stir done\npool:\n"); for (p = 0; p < POOLSIZE; p += HASHSIZE) { printf(" "); for (q = 0; q < HASHSIZE; q += 4) { printf(" %08x", *(word32 *)(pool.pool + p + q)); } printf("\n"); } printf("incoming:\n "); for (q = 0; q < HASHSIZE; q += 4) { printf(" %08x", *(word32 *)(pool.incoming + q)); } printf("\nincomingb:\n "); for (q = 0; q < HASHINPUT; q += 4) { printf(" %08x", *(word32 *)(pool.incomingb + q)); } printf("\n"); random_diagnostics--; } #endif Node-path: putty/sshsha.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 53c86c5c5e10038f642cfb595bb55bac Text-delta-base-sha1: c5bb7ce8de6c7d729221c494b11470e3f20cca8a Text-content-length: 680 Text-content-md5: 5a81f469141d8c95f730c27e86bc0c16 Text-content-sha1: 7b6b5393c11054f1f259d3b1c5cce813d921d1e1 Content-length: 680 SVN��0;�I�q�vG�t<#ifdef RANDOM_DIAGNOSTICS { extern int random_diagnostics; if (random_diagnostics) { int i; printf("SHATransform:"); for (i = 0; i < 5; i++) printf(" %08x", digest[i]); printf(" +"); for (i = 0; i < 16; i++) printf(" %08x", block[i]); } } #endif #ifdef RANDOM_DIAGNOSTICS { extern int random_diagnostics; if (random_diagnostics) { int i; printf(" ="); for (i = 0; i < 5; i++) printf(" %08x", digest[i]); printf("\n"); } } #endif Revision-number: 9939 Prop-content-length: 156 Content-length: 156 K 8 svn:date V 27 2013-07-19T17:45:01.891724Z K 7 svn:log V 56 Add an error check to every setsockopt call in uxnet.c. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 689a7c719ac391d73c2edfb1c28b9c78 Text-delta-base-sha1: 62dc49fc327fd4892323af50575431bab060940f Text-content-length: 855 Text-content-md5: 723ef27e29c9c269b628acf25b1affca Text-content-sha1: fc09c46bf9a3f64495bc1e535d3cbad00bab6d35 Content-length: 855 SVN��}E3��t�H,?�B;if (setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (void *) &b, sizeof(b)) < 0) { err = errno; close(s); goto ret; } } if (sock->nodelay) { int b = TRUE; if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *) &b, sizeof(b)) < 0) { err = errno; close(s); goto ret; } } if (sock->keepalive) { int b = TRUE; if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void *) &b, sizeof(b)) < 0) { err = errno; close(s); goto ret; }if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)) < 0) { ret->error = strerror(errno); close(s); return (Socket) ret; } Revision-number: 9940 Prop-content-length: 181 Content-length: 181 K 8 svn:date V 27 2013-07-19T18:10:02.658605Z K 7 svn:log V 81 Centralise calls to fcntl into functions that carefully check the error returns. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 539723ac803cdfde6b96ae2d8651ebaf Text-delta-base-sha1: 62018d2c35c48d9bb228aafb7a81491393bebeaf Text-content-length: 66 Text-content-md5: dea8131d11fe703c940008f672300d5f Text-content-sha1: 7c1e85d085a080e2f5b0e607df366073c329f9b7 Content-length: 66 SVN���� �4��1Ononcloexec(pipefd[0](GTK_OB�!�� Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5d7c8df868db2f410d50149018032d51 Text-delta-base-sha1: 40c3f0ae5a30437141f70ad5a10af88f81a98c41 Text-content-length: 97 Text-content-md5: 61682121f91b39fbb535bc2499d0253c Text-content-sha1: 83523910f97d0b260006d8d6a207df433e027702 Content-length: 97 SVN��Y K� �K�Evoid cloexec(int); void noncloexec(int); int nonblock(int); int no_nonblock Node-path: putty/unix/uxmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e284cef500978ab4a5b5268882b4a028 Text-delta-base-sha1: 48c6471a5a4eb0455645a61f420bab93e3c2d77d Text-content-length: 2002 Text-content-md5: d2c9e5f568ec4dc5e85c33e9d2b0b5fa Text-content-sha1: abf515270d8751b52c14269128d6e5440785b5ec Content-length: 2002 SVN��5��� t0�PBerrnoand clear fcntl options on a file descriptor. We don't * realistically expect any of these operations to fail (the most * plausible error condition is EBADF, but we always believe ourselves * to be passing a valid fd so even that's an assertion-fail sort of * response), so we don't make any effort to return sensible error * codes to the caller - we just log to standard error and die * unceremoniously. However, nonblock and no_nonblock do return the * previous state of O_NONBLOCK. */ void cloexec(int fd) { int fdflags; fdflags = fcntl(fd, F_GETFD); if (fdflags < 0) { fprintf(stderr, "%d: fcntl(F_GETFD): %s\n", fd, strerror(errno)); exit(1); } if (fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC) < 0) { fprintf(stderr, "%d: fcntl(F_SETFD): %s\n", fd, strerror(errno)); exit(1); } } void noncloexec(int fd) { int fdflags; fdflags = fcntl(fd, F_GETFD); if (fdflags < 0) { fprintf(stderr, "%d: fcntl(F_GETFD): %s\n", fd, strerror(errno)); exit(1); } if (fcntl(fd, F_SETFD, fdflags & ~FD_CLOEXEC) < 0) { fprintf(stderr, "%d: fcntl(F_SETFD): %s\n", fd, strerror(errno)); exit(1); } } int nonblock(int fd) { int fdflags; fdflags = fcntl(fd, F_GETFL); if (fdflags < 0) { fprintf(stderr, "%d: fcntl(F_GETFL): %s\n", fd, strerror(errno)); exit(1); } if (fcntl(fd, F_SETFL, fdflags | O_NONBLOCK) < 0) { fprintf(stderr, "%d: fcntl(F_SETFL): %s\n", fd, strerror(errno)); exit(1); } return fdflags & O_NONBLOCK; } int no_nonblock(int fd) { int fdflags; fdflags = fcntl(fd, F_GETFL); if (fdflags < 0) { fprintf(stderr, "%d: fcntl(F_GETFL): %s\n", fd, strerror(errno)); exit(1); } if (fcntl(fd, F_SETFL, fdflags & ~O_NONBLOCK) < 0) { fprintf(stderr, "%d: fcntl(F_SETFL): %s\n", fd, strerror(errno)); exit(1); } return fdflags & O_NONBLOCK Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 723ef27e29c9c269b628acf25b1affca Text-delta-base-sha1: fc09c46bf9a3f64495bc1e535d3cbad00bab6d35 Text-content-length: 61 Text-content-md5: ca42fd171e28240219d1669d6fc347a9 Text-content-sha1: 2b101ebab5ba2d4d2358dc68f31ffb70b6739d5c Content-length: 61 SVN��E�F��VJ�vl�wv�uPnonblock(snonblock(t Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60a729a0d876c699c57dbf58337ae640 Text-delta-base-sha1: 347b2eff6a714b2e0dacb02b01c645581e74cf7d Text-content-length: 151 Text-content-md5: 933d0f6ede818f33abee3894e4fa237c Text-content-sha1: f80c410488e6c404f7c6ca3f5b6c97e6e7edd131 Content-length: 151 SVN��,=x�j�N� �P\; if (bufchain_size(chain) > 0) { int prev_nonblock = nonblock(fd!prev_nonblock) no_nonblock(fd Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e13a56633a960c9e5c1ff149452d7ca6 Text-delta-base-sha1: e741c750615227c69d43b2360b37ba5ae695d2fc Text-content-length: 49 Text-content-md5: fd793439a3ceda5d9ef459530c863e60 Text-content-sha1: 708a259d33db6d3a39db9faec5b0526c58226589 Content-length: 49 SVN��# �p�� noncloexec(0); noncloexec(1 Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a391d8d882054aab30f754d2827b7515 Text-delta-base-sha1: 8970481265d14cecf3958ea67a18259061a8659e Text-content-length: 49 Text-content-md5: 3c21d41b748b78f9c589ef7a31fe6997 Text-content-sha1: c2636dfa5adf6d118a71edbe03e26fd99cf2f221 Content-length: 49 SVN��R �H��%-nonblock(pty->master_fd); Revision-number: 9941 Prop-content-length: 329 Content-length: 329 K 8 svn:date V 27 2013-07-20T08:34:54.256084Z K 7 svn:log V 228 Been meaning to get round to this for a while: use CryptGenRandom to gather extra entropy at Windows PuTTY startup time. (It's only used as one of the inputs to PuTTY's internal entropy pool, so nobody is required to trust it.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winnoise.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0a2cd72de1f807554adcfb88413017d1 Text-delta-base-sha1: 774b8e0a0789c70db4557fe7f689e2e092c46931 Text-content-length: 1219 Text-content-md5: 41ff60041aee39161f311b9f3a8c5968 Text-content-sha1: 31ab20318e841c6dac0d77712ddc2cbe20943919 Content-length: 1219 SVN��E@� �A�|O�|ED� ;#include <wincrypt.h> DECL_WINDOWS_FUNCTION(static, BOOL, CryptAcquireContextA, (HCRYPTPROV *, LPCTSTR, LPCTSTR, DWORD, DWORD)); DECL_WINDOWS_FUNCTION(static, BOOL, CryptGenRandom, (HCRYPTPROV, DWORD, BYTE *)); DECL_WINDOWS_FUNCTION(static, BOOL, CryptReleaseContext, (HCRYPTPROV, DWORD)); static HMODULE wincrypt_module = NULL; /* * This function is called once, at PuTTY startupHCRYPTPROV crypt_providerif (!wincrypt_module) { wincrypt_module = load_system32_dll("advapi32.dll"); GET_WINDOWS_FUNCTION(wincrypt_module, CryptAcquireContextA); GET_WINDOWS_FUNCTION(wincrypt_module, CryptGenRandom); GET_WINDOWS_FUNCTION(wincrypt_module, CryptReleaseContext); } if (wincrypt_module && p_CryptAcquireContextA && p_CryptGenRandom && p_CryptReleaseContext && p_CryptAcquireContextA(&crypt_provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { BYTE buf[32]; if (p_CryptGenRandom(crypt_provider, 32, buf)) { func(buf, sizeof(buf)); } p_CryptReleaseContext(crypt_provider, 0); } Revision-number: 9942 Prop-content-length: 507 Content-length: 507 K 8 svn:date V 27 2013-07-20T11:31:24.543738Z K 7 svn:log V 406 Switch to translating keystrokes using ToUnicodeEx rather than ToAsciiEx, where possible. This enables support for keys which generate Unicode characters that aren't in the system code page, which seems to me like a perverse way for Windows to have set up the system code page but apparently does happen, e.g. (I'm told) U+0219 and U+021B on Romanian keyboards. Patch mostly due to Andrei Damian-Fekete. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8b12b817ca2e6be82f7a29415b22f398 Text-delta-base-sha1: 2d471a7a5158738dc953e2f04e23c14a17ff7b0b Text-content-length: 1507 Text-content-md5: 6191822639c6c44d31960c87aa256117 Text-content-sha1: f7afbc07acaf89ecc2f85c83c8e1c107e1ac4dce Content-length: 1507 SVN���������O\h]�<���>�o~�#l�x�{�K Q�X9�5�wC�}[�n���Jstatic wchar_t keys_unicode_unicode[0]) debug((", KB0=%04x", keys_unicode[0])); if (keys_unicode[1]) debug((", KB1=%04x", keys_unicode[1])); if (keys_unicode[2]) debug((", KB2=%04x", keys_unicoder = ToUnicodeEx(wParam, scan, keystate, keys_unicode, lenof(keys_unicode), 0, kbd_layout); } elseint i; static WORD keys[3]; static BYTE keysb[3]; r = ToAsciiEx(wParam, scan, keystate, keys, 0, kbd_layout); if (r > 0) { for (i = 0; i < r; i++) { keysb[i] = (BYTE)keys[i]; } MultiByteToWideChar(CP_ACP, 0, (LPCSTR)keysb, r, keys_unicode, lenof(keys_unicode)); }_unicode_unicodewchar_t wch = keys_unicode[i]; if (compose_state == 2 && wch >= ' ' && wch < 0x80) { compose_char = wch; compose_state++; continue; } if (compose_state == 3 && wch >= ' ' && wch < 0x80waruni_send(ldisc, &wch, 1, 1); } } else { if(capsOn && wch < 0x80) { WCHAR cbuf[2]; cbuf[0] = 27; cbuf[1] = xlat_uskbd2cyrllic(wWCHAR cbuf[2]; cbuf[0] = '\033'; cbuf[1] = wch; term_seen_key_event(term); if (ldisc) luni_send(ldisc, cbuf _unicode_unicode[0] = 0; /* If we will be using alt_sum fix the 256s */ else if (keys_unicode[0] && (in_utf(term) || ucsdata.dbcs_screenfont)) keys_unicode Revision-number: 9943 Prop-content-length: 323 Content-length: 323 K 7 svn:log V 222 Redo a mis-fix of a memory leak in r9919: I added sfree(data) immediately after conf_deserialise in the Duplicate Session receiver, whereas I should have put it after the subsequent loop that extracts the pty argv if any. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-20T13:15:10.516435Z PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dea8131d11fe703c940008f672300d5f Text-delta-base-sha1: 7c1e85d085a080e2f5b0e607df366073c329f9b7 Text-content-length: 98 Text-content-md5: eafbd83259485bd6a4cbffd8fbc27661 Text-content-sha1: b3120833d194bb7c013278a582ef1a66a28ed5d2 Content-length: 98 SVN����/�F��uW�cy�3Lsfree(data); return 0; } void new_session���B Revision-number: 9944 Prop-content-length: 303 Content-length: 303 K 8 svn:date V 27 2013-07-20T13:15:11.976514Z K 7 svn:log V 202 Another two mis-fixes from r9919: when we sfree(line) on exit from the ssh.com and OpenSSH key import loops, we should also null it out so that the cleanup path doesn't try to re-free the same pointer. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a96ff0f10ffa679401b22c978ae5175c Text-delta-base-sha1: 840018c5f46b4cd5f9af8d9882a7839dd5151037 Text-content-length: 66 Text-content-md5: 70be67c2318f41f24f9f8c15ec210131 Text-content-sha1: 29a87f55a40a60cdc1f763bf09737babdfbe0a3b Content-length: 66 SVN��5"�8��Q6� y line = NULLline = NULL Revision-number: 9945 Prop-content-length: 177 Content-length: 177 K 7 svn:log V 77 Fix leak of 'fname' introduced by the rewrite of write_random_seed in r9933. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-20T13:15:16.387025Z PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6a67574211e8fd67f78d4a7f2edf4df9 Text-delta-base-sha1: d09fac6e3e94ed74161fe7301210226e74fcadbc Text-content-length: 64 Text-content-md5: bed3db1ab51b1e87d448eaaf4163062d Text-content-sha1: 5837da9adc2602818bdd94dd87fcc89de5ed0621 Content-length: 64 SVN��|J�6��Q'�mc�;Asfree(fnamefnamesfree(fname Revision-number: 9946 Prop-content-length: 163 Content-length: 163 K 8 svn:date V 27 2013-07-20T13:15:20.877160Z K 7 svn:log V 63 Fix a null-dereference introduced by another mis-fix in r9919. K 10 svn:author V 5 simon PROPS-END Node-path: putty/import.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 70be67c2318f41f24f9f8c15ec210131 Text-delta-base-sha1: 29a87f55a40a60cdc1f763bf09737babdfbe0a3b Text-content-length: 264 Text-content-md5: 372c4aff459e8e57fc1bba9de133e5dd Text-content-sha1: 8618a0c20592d44a2189ab7ce051444c46b47edb Content-length: 264 SVN��5l�;�l�X]if (key) { *comment = dupstr(key->comment); smemclr(key->keyblob, key->keyblob_size); sfree(key->keyblob); smemclr(key, sizeof(*key)); sfree(key); } else { *comment = dupstr(""); } Revision-number: 9947 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9948 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 Two more memory leak fixes, on error paths I didn't spot in r9919. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-21T07:40:26.620583Z PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 020eb520d26814f8f0d10b973bc3ec3b Text-delta-base-sha1: c158e82178b38cf05a4793b447727d3115d5cc3e Text-content-length: 49 Text-content-md5: 3772cf1f8ac16b6dc8bef54c762e0823 Text-content-sha1: 7e9e2b9611a2d98dbacdf40d2e5f5cb87cc0a805 Content-length: 49 SVN��z �<��A9 sfree(dummy_realhost Node-path: putty/unix/uxproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fd793439a3ceda5d9ef459530c863e60 Text-delta-base-sha1: 708a259d33db6d3a39db9faec5b0526c58226589 Text-content-length: 38 Text-content-md5: 5eead9106c960e6fb907d7731bee4250 Text-content-sha1: 1f26bb642aa62e3dbf79035cf51647e289e73311 Content-length: 38 SVN��) �y��v sfree(cmd Revision-number: 9949 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2013-07-21T07:40:28.710643Z K 7 svn:log V 62 When I turned fcntls into noncloexecs in r9940, I missed one. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxpty.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c21d41b748b78f9c589ef7a31fe6997 Text-delta-base-sha1: c2636dfa5adf6d118a71edbe03e26fd99cf2f221 Text-content-length: 45 Text-content-md5: 9ab86078b65e3afc21a94a0e6248a43a Text-content-sha1: bfe3c96ee92d17ef420a70ae6920d33cd638a468 Content-length: 45 SVN��b �O��noncloexec(slavefd); Revision-number: 9950 Prop-content-length: 188 Content-length: 188 K 8 svn:date V 27 2013-07-21T07:40:30.991113Z K 7 svn:log V 88 Fix error checking in uxstore.c: add a missing check, and fix a mis-cut-and-pasted one. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bed3db1ab51b1e87d448eaaf4163062d Text-delta-base-sha1: 5837da9adc2602818bdd94dd87fcc89de5ed0621 Text-content-length: 307 Text-content-md5: c60e8b053269084852bcfc4162c42168 Text-content-sha1: 87332f4f89678e4b69be113c84d7dad269da4914 Content-length: 307 SVN��J/��� �y�$&if (rename(tmpfilename, filename) < 0) { char *msg = dupprintf("Unable to store host key: rename(\"%s\",\"%s\")" " returned '%s'", tmpfilename, filename, strerror(errno)); nonfatal(msg); }fd < 0 Revision-number: 9951 Prop-content-length: 1001 Content-length: 1001 K 8 svn:date V 27 2013-07-21T07:40:36.220839Z K 7 svn:log V 900 Completely remove the 'frozen_readable' mechanism from uxnet.c. It parallels a similar mechanism in winnet.c and came over by copy and paste, but is pointless in the Unix networking API. On Windows, if you're using a mechanism such as WSAAsyncSelect which delivers readability notifications as messages rather than return values from a system call, you only get notified that a socket is readable once - it remembers that it's told you, and doesn't tell you again until after you've done a read. So in the case where we intentionally stop reading from a socket because our local buffer is full, and later want to start reading again, we do a read from the socket with MSG_PEEK set, and that clears Windows's flag and tells it to start sending us readability notifications again. On Unix, select() and friends didn't do anything so strange in the first place, so the whole mechanism is unnecessary. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ca42fd171e28240219d1669d6fc347a9 Text-delta-base-sha1: 2b101ebab5ba2d4d2358dc68f31ffb70b6739d5c Text-content-length: 74 Text-content-md5: 010da7bb4085f76d789e564e58175cbe Text-content-sha1: f88ebf29734eba516985dee540d19a1707193941 Content-length: 74 SVN��+1 �@��a6�5�c5� c�+S�,�4v�s break; Revision-number: 9952 Prop-content-length: 283 Content-length: 283 K 7 svn:log V 182 Add '.so' to the list of file extensions cleared up by 'make clean' in Makefile.cyg, since if you're building against Winelib it will generate one of those alongside each .exe file. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-21T09:16:37.461204Z PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 849194ba994229db9704992f271c01ab Text-delta-base-sha1: b2710b3c5fca3e4084f44ce63ff6d89512a9825e Text-content-length: 25 Text-content-md5: 06cbf6f25ea6dc501aa1720b37053879 Text-content-sha1: 18903a623d000848877e36e9b97f8e416619b7d8 Content-length: 25 SVN��^c �V�� Rs Revision-number: 9953 Prop-content-length: 531 Content-length: 531 K 8 svn:date V 27 2013-07-21T10:12:58.853621Z K 7 svn:log V 430 If the SSH server sends us CHANNEL_CLOSE for a channel on which we're sitting on a pile of buffered data waiting for WINDOW_ADJUSTs, we should throw away that buffered data, because the CHANNEL_CLOSE tells us that we won't be receiving those WINDOW_ADJUSTs, and if we hang on to the data and keep trying then it'll prevent ssh_channel_try_eof from sending the CHANNEL_EOF which is a prerequisite of sending our own CHANNEL_CLOSE. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 84169ef7fda3a5ff21d523f4338f1486 Text-delta-base-sha1: 9e57224a1c98dbe022124151148c2389d1c7fd70 Text-content-length: 838 Text-content-md5: 0cb608f6b8e9562ad04b96eab010475a Text-content-sha1: c546cd1227754712cb699611008676ca03b6d247 Content-length: 838 SVN������������������ q�9�q�V!Abandon any buffered data we still wanted to send to this * channel. Receiving a CHANNEL_CLOSE is an indication that * the server really wants to get on and _destroy_ this * channel, and it isn't going to send us any further * WINDOW_ADJUSTs to permit us to send pending stuff. */ bufchain_clear(&c->v.v2.outbuffer);�! ��((i + lenof(name)) <= lenof(ssh_specials)); \ memcpy(&ssh_specials[i], name, sizeof name); \ i += lenof(name); \ } while(0) if (ssh->version == 1) { /* Don't bother offering IGNORE if we've decided the remote * won't cope with it, since we wouldn't bother sending it if * asked anyway. */ if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) ADD_SPECIALS(ssh1_ignore_spec Revision-number: 9954 Prop-content-length: 236 Content-length: 236 K 8 svn:date V 27 2013-07-21T11:01:22.214549Z K 7 svn:log V 135 Initialise 'psa' to NULL on every code path in the Pageant client code, fixing a potential segfault when compiling with -DNO_SECURITY. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winpgntc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 30358f320b50f1160a8b4f63c4f063de Text-delta-base-sha1: 6cee836ed9ad035434b92c2fec94a487d6ea24bf Text-content-length: 41 Text-content-md5: d82ba178928bac885fe93a6d28185ab6 Text-content-sha1: 5df8bd498198f2546c56562afd27a786a42e59f2 Content-length: 41 SVN��2.�H��:G� psa = NULL; Revision-number: 9955 Prop-content-length: 180 Content-length: 180 K 7 svn:log V 80 Rework keylist_update() to fix both a buffer-size limitation and a memory leak. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-22T07:11:35.600737Z PROPS-END Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 15d2a9a3dcca2a28066f19d72e795025 Text-delta-base-sha1: e2fee68d17ebcedefedd197ca67168f145dd6411 Text-content-length: 420 Text-content-md5: 3168e92da1001cc6b14e0b99cfdbdedc Text-content-sha1: 0bf032569d6c312b9b9f0e56cb4c4e00427fa576 Content-length: 420 SVN��@,���x�N�W+�Jv*listentry, *p; int fp_lenp = skey->alg->fingerprint(skey->data); listentry = dupprintf("%s\t%s", p, skey->comment); fp_len = strlen(listentry); sfree(p); p = strchr(listentry, ' '); if (p && p < listentry + fp_len) *p = '\t'; p = strchr(listentry, ' '); if (p && p < listentry + fp_len) *p = '\t'; sfree( Revision-number: 9956 Prop-content-length: 335 Content-length: 335 K 8 svn:date V 27 2013-07-22T07:11:39.231340Z K 7 svn:log V 234 Invent a win_strerror() function which behaves as much like Unix strerror as I can arrange, wrapping up all the ugly FormatMessage nonsense and caching previously looked-up messages for reuse so that callers can treat them as static. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 94617eb5e92df1a24059d551a0486726 Text-delta-base-sha1: b0e9fc6c28057aed81f90eda38da4cf92ce460e9 Text-content-length: 1690 Text-content-md5: 928bebe88bb660ea02db2079b0c2b33c Text-content-sha1: 45135a3f00a0e1a40c20e4102d0f343108e595d8 Content-length: 1690 SVN��lt ���a /* * A tree234 containing mappings from system error codes to strings. */ struct errstring { int error; char *text; }; static int errstring_find(void *av, void *bv) { int *a = (int *)av; struct errstring *b = (struct errstring *)bv; if (*a < b->error) return -1; if (*a > b->error) return +1; return 0; } static int errstring_compare(void *av, void *bv) { struct errstring *a = (struct errstring *)av; return errstring_find(&a->error, bv); } static tree234 *errstrings = NULL; const char *win_strerror(int error) { struct errstring *es; if (!errstrings) errstrings = newtree234(errstring_compare); es = find234(errstrings, &error, errstring_find); if (!es) { int bufsize, bufused; es = snew(struct errstring); es->error = error; /* maximum size for FormatMessage is 64K */ bufsize = 65535; es->text = snewn(bufsize, char); if (!FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS), NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), es->text + bufused, bufsize - bufused, NULL)) { sprintf(es->text, "Windows error code %d (and FormatMessage returned %d)", error, GetLastError()); } else { int len = strlen(es->text); if (len > 0 && es->text[len-1] == '\n') es->text[len-1] = '\0'; } es->text = sresize(es->text, strlen(es->text) + 1, char); add234(errstrings, es); } return es->tex Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4fe97d802f521264bfb5145e27401786 Text-delta-base-sha1: 80f566b6bd461dcd350b17c2672069f38043e0c8 Text-content-length: 57 Text-content-md5: 218a84903ab43388c728c28ab1e947fd Text-content-sha1: 40e5277ba266cfaf208e1b24899d83b8eb98d20a Content-length: 57 SVN��Y~ "� ��Qconst char *win_strerror(int error Revision-number: 9957 Prop-content-length: 337 Content-length: 337 K 8 svn:date V 27 2013-07-22T07:11:44.761542Z K 7 svn:log V 236 Report an error if deleting a random seed file fails. (This has also required me to add a currently unused nonfatal() to PuTTYgen, since although PuTTYgen won't actually try to delete putty.rnd, it does link in winstore.c as a whole.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8ed91425c562bbfd56c39f075738a1e0 Text-delta-base-sha1: d5d82491afeef5452d06e7ff1ed4348f7de9a0ad Text-content-length: 172 Text-content-md5: 0e8d8f1426b4458d639befdc5ecda4e6 Text-content-sha1: 74fb78589f8142b00be688377b2ef927862ab123 Content-length: 172 SVN��N �O�D�#JG�G * Print a non-fatal message box and do not exit. */ void nonfatalError", MB_SYSTEMMODAL | MB_ICONERROR | MB_OK); sfree(stuff Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f42a605400b93bda6bb371e0b1d1fee1 Text-delta-base-sha1: b4019da885c40d5f84d609b2d496688d93c4705f Text-content-length: 218 Text-content-md5: 5c4804a71eb08d945f1e03d1ffbccefd Text-content-sha1: 95cecfbf6659963143d80c64f3d5a71d12e23b4d Content-length: 218 SVN�� = @�%�@�X3 if (!DeleteFile(path) && GetLastError() != ERROR_FILE_NOT_FOUND) { nonfatal("Unable to delete '%s': %s", path, win_strerror(GetLastError())); } Revision-number: 9958 Prop-content-length: 169 Content-length: 169 K 8 svn:date V 27 2013-07-22T07:11:48.241064Z K 7 svn:log V 69 Add a missing null pointer check in one of the dialog box functions. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7c687410c89244e25d79b3d6896d106c Text-delta-base-sha1: 8958fbd6c187383ffb61757a976942bbf56bde5d Text-content-length: 47 Text-content-md5: 8637eeec63fd3deb88ae6789cc9c96f6 Text-content-sha1: 6ef21a45aa45b3ca6bfb0488a85dd3fcedb9dbb3 Content-length: 47 SVN��� �?��G9if (!c) return Revision-number: 9959 Prop-content-length: 357 Content-length: 357 K 8 svn:date V 27 2013-07-22T07:11:54.141670Z K 7 svn:log V 256 Another big batch of memory leak fixes, again mostly on error paths. The most interesting one is printer_add_enum, which I've modified to take a char ** rather than a char * so that it can both realloc its input buffer _and_ return NULL to indicate error. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8637eeec63fd3deb88ae6789cc9c96f6 Text-delta-base-sha1: 6ef21a45aa45b3ca6bfb0488a85dd3fcedb9dbb3 Text-content-length: 87 Text-content-md5: f07df97c08731d493633b48191f883bb Text-content-sha1: 33116a303ab9f9b97e30c8a19bb1f401d4d2b968 Content-length: 87 SVN��[7�8��\1� sfree(pwidths) else { sfree(data); Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6191822639c6c44d31960c87aa256117 Text-delta-base-sha1: f7afbc07acaf89ecc2f85c83c8e1c107e1ac4dce Text-content-length: 422 Text-content-md5: 3c3f5afcf3114f779f971f33ede80c3a Text-content-sha1: bdf0489ef9b883d303d158e33a2b49dfa46083d2 Content-length: 422 SVN����K�S�K�b` { conf_free(prev_conf); break; }�\D$�v�f�*2 * Or ... I could do a test print with "W", and use +1 { GlobalFree(clipdata); GlobalFree(clipdata2); return; } if (!(lock2 = GlobalLock(clipdata2))) { GlobalUnlock(clipdata); GlobalFree(clipdata); GlobalFree(clipdata2); return; } Node-path: putty/windows/winjump.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: af57c7eb2dfed39732b837fddeea959b Text-delta-base-sha1: 27b1476c8aeea8bcfffa718834af9f2295a8d9ab Text-content-length: 86 Text-content-md5: d4d7bade1a64bfed296d6957a5c1ed8c Text-content-sha1: 189132fcb987e21f603fdb8129af55d61be3d739 Content-length: 86 SVN��N6�w��K<�|�$* { sfree(app_path); return NULL; } Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0e8d8f1426b4458d639befdc5ecda4e6 Text-delta-base-sha1: 74fb78589f8142b00be688377b2ef927862ab123 Text-content-length: 278 Text-content-md5: 8f2a1a685dcede936ab0731be3de2f38 Text-content-sha1: 69b9e52d9efb84f826e0d60bdda6c4960fed3454 Content-length: 278 SVN��`p���Zz� =�|fp = fopen(filename, "wb"); if (!fp) return 0; { Filename *fn = filename_from_str(filename); load_key_file(hwnd, state, fn, LOWORD(wParam) != IDC_LOAD); filename_free(fn); } Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3168e92da1001cc6b14e0b99cfdbdedc Text-delta-base-sha1: 0bf032569d6c312b9b9f0e56cb4c4e00427fa576 Text-content-length: 1165 Text-content-md5: 2e33e8dec2b8e89ab754895b3f84ccaf Text-content-sha1: c40f63aec27cce9aa689e2c791edd8ade7ae87c6 Content-length: 1165 SVN��,a`���#�)#�wvI�S}q�C`!�b{o�l�)qU�<~�oTv� @i�6v { sfree(response); return NULL; } { sfree(response); return NULL; } { freebn(reqkey.exponent); goto failure; } { freebn(reqkey.exponent); freebn(reqkey.modulus); goto failure; } { /* Only one filename returned? */ Filename *fn = filename_from_str(filelist); add_keyfile(fn); filename_free(fn); } Filename *fn = filename_from_str(filename); add_keyfile(fn); filename_free(fn CloseHandle(filemap); CloseHandle(filemap); sfree(ourself); CloseHandle(filemap); sfree(ourself); sfree(ourself2); LocalFree(psd); sfree(ourself); sfree(ourself2 Filename *fn = filename_from_str(argv[i]); add_keyfile(fn); filename_free(fn Node-path: putty/windows/winpgntc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d82ba178928bac885fe93a6d28185ab6 Text-delta-base-sha1: 5df8bd498198f2546c56562afd27a786a42e59f2 Text-content-length: 136 Text-content-md5: efde747c6b65b62258af54a83a5adf33 Text-content-sha1: b2de0a0b165e0fdfbacae1acd38c7b5472fc05d7 Content-length: 136 SVN��.sg�V�R�Z�Y�Lb { sfree(mapname); return 1; /* *out == NULL, so failure */ }mapname)sfree(mapname Node-path: putty/windows/winprint.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d2c663e745c35b39be7a47568d6d3744 Text-delta-base-sha1: 271ab3b98277b411a74109f5c86e66e7a730ecd0 Text-content-length: 636 Text-content-md5: 222ff20953be7e2edf49dc7f440c9f8e Text-content-sha1: 807c3f89ac472ce8e76583aa895f31447461c2d3 Content-length: 636 SVN�� d%K��7�O�Ymm�/� 7�int printer_add_enum(int param, DWORD level, char **buffer, int offset, int *nprinters_ptr) { DWORD needed = 0, nprinters = 0; *buffer = sresize(*(*buffer)*buffer = sresize(*buffer, offset+needed, char); if (EnumPrinters(param, NULL, level, (*buffer)+offset, needed, &needed, &nprinters) == 0) return FALSE; *nprinters_ptr += nprinters; return TRUEif (!printer_add_enum(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, ret->enum_level, &buffer, 0, nprinters_ptr)) goto error Node-path: putty/windows/winproxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fa1eb0e6abe50d644258a54247d3fe82 Text-delta-base-sha1: 634b50e5760d331180291af647f5c35dfd977755 Text-content-length: 61 Text-content-md5: 38945b492f72cc31732de9a9f3d98d60 Text-content-sha1: 90e82e2ccf185672537db6d672d174022ee6d56b Content-length: 61 SVN��F"�-��Q*�&x sfree(cmd sfree(cmd Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5c4804a71eb08d945f1e03d1ffbccefd Text-delta-base-sha1: 95cecfbf6659963143d80c64f3d5a71d12e23b4d Text-content-length: 554 Text-content-md5: 136b7203b821a0ea7cfc34b826c9d784 Text-content-sha1: 278dc8ab747c57ed0062f141a540a0945819fe45 Content-length: 554 SVN��=M;a� ��A�T�g� �t� q�W6 �fX��={ sfree(ret); return NULL; }FontSpec *ret{ sfree(fontname); return NULL; }{ sfree(fontname); return NULL; }{ sfree(fontname); return NULL; } ret = fontspec_new(fontname, isbold, height, charset); sfree(fontname); return ret { sfree(regname); return 1; /* key does not exist in registry */ } readlen = len; otherstr = snewn(len, char) sfree(oldstyle); Revision-number: 9960 Prop-content-length: 438 Content-length: 438 K 8 svn:date V 27 2013-07-22T07:11:58.851946Z K 7 svn:log V 337 Fix a double error handling goof in the winstore side of the jump list support: transform_jumplist_registry should give its caller dynamically allocated data if and only if it returns JUMPLISTREG_OK, and get_jumplist_registry_entries should test the return value against JUMPLISTREG_OK rather than a value from a totally different enum. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winstore.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 136b7203b821a0ea7cfc34b826c9d784 Text-delta-base-sha1: 278dc8ab747c57ed0062f141a540a0945819fe45 Text-content-length: 70 Text-content-md5: 38eda4af7a25d12b16225910f4271a7f Text-content-sha1: b826b90ddb0a9620a9a03c2ed93598aeb1de1461 Content-length: 70 SVN��Mf&�0��N0�B && ret == ERROR_SUCCESSJUMPLISTREG_OK Revision-number: 9961 Prop-content-length: 261 Content-length: 261 K 7 svn:log V 160 Rationalise null pointer checks in both decode_codepage functions, so that decode_codepage(NULL) and decode_codepage("") both return the default character set. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-22T07:12:05.191959Z PROPS-END Node-path: putty/unix/uxucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 883de0bc59a9e306c42e9663ce4f0d3d Text-delta-base-sha1: ea9eed28f6a8395fe95556bbe4960c966eed7a86 Text-content-length: 31 Text-content-md5: caf012a9118e0192ec8b73c88b853c20 Text-content-sha1: d5c6c54574dea5636d2a08c02dfe7c64618d7f01 Content-length: 31 SVN�� �9��I8cp_name || Node-path: putty/windows/winucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 062b3a53d9ab77911ea6149e5fceb9a5 Text-delta-base-sha1: 061dc91d089786f4c627863372fd60468c97fd32 Text-content-length: 1409 Text-content-md5: a66dc456e2f970ad422bbb7daf236fb4 Text-content-sha1: 584db624e0a72436d5d7821f11d9615eb5075558 Content-length: 1409 SVN��5e�p�e�Jkcp_name || !*cp_name) return CP_UTF8; /* default */ for (cpi = cp_list; cpi->name; cpi++) { s = cp_name; d = cpi->name; for (;;) { while (*s && !isalnum(*s) && *s != ':') s++; while (*d && !isalnum(*d) && *d != ':') d++; if (*s == 0) { codepage = cpi->codepage; if (codepage == CP_UTF8) goto break_break; if (codepage == -1) return codepage; if (codepage == 0) { codepage = 65536 + (cpi - cp_list); goto break_break; } if (GetCPInfo(codepage, &cpinfo) != 0) goto break_break; } if (tolower(*s++) != tolower(*d++)) break; } } d = cp_name; if (tolower(d[0]) == 'c' && tolower(d[1]) == 'p') d += 2; if (tolower(d[0]) == 'i' && tolower(d[1]) == 'b' && tolower(d[2]) == 'm') d += 3; for (s = d; *s >= '0' && *s <= '9'; s++); if (*s == 0 && s != d) codepage = atoi(d); /* CP999 or IBM999 */ if (codepage == CP_ACP) codepage = GetACP(); if (codepage == CP_OEMCP) codepage = GetOEMCP(); if (codepage > 65535) codepage = -2; Revision-number: 9962 Prop-content-length: 151 Content-length: 151 K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-22T07:12:10.522053Z K 7 svn:log V 51 Add missing casts in arguments to ctype functions. PROPS-END Node-path: putty/windows/winucs.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a66dc456e2f970ad422bbb7daf236fb4 Text-delta-base-sha1: 584db624e0a72436d5d7821f11d9615eb5075558 Text-content-length: 298 Text-content-md5: 909fe5d3b26fb91ab7ffa0917d7681df Text-content-sha1: b1b187987cd9bda963c1caddf79de035d57f0daf Content-length: 298 SVN���/��P@Y�(unsigned char)*s++) != tolower((unsigned char)(unsigned char)d[0]) == 'c' && tolower((unsigned char)d[1]) == 'p') d += 2; if (tolower((unsigned char)d[0]) == 'i' && tolower((unsigned char)d[1]) == 'b' && tolower((unsigned char) Revision-number: 9963 Prop-content-length: 199 Content-length: 199 K 8 svn:date V 27 2013-07-22T07:12:15.371764Z K 7 svn:log V 99 Replace the type-checking COMPTR macro with my current idea of best practice in type-check macros. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winjump.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4d7bade1a64bfed296d6957a5c1ed8c Text-delta-base-sha1: 189132fcb987e21f603fdb8129af55d61be3d739 Text-content-length: 264 Text-content-md5: f2d9317d41770c3c4316ea5dc784a58f Text-content-sha1: 6a422faf15f95acf989e316151f7ce49052e9743 Content-length: 264 SVN��V n�7�n�1g * etc, ensuring that 'obj' really is a 'type **'. */ #define typecheck(checkexpr, result) \ (sizeof(checkexpr) ? (result) : (result)) #define COMPTR(type, obj) &IID_##type, \ typecheck((obj)-(type **)(obj), (void **)(void *)(obj Revision-number: 9964 Prop-content-length: 116 Content-length: 116 K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-22T07:12:21.282358Z K 7 svn:log V 16 Missing assert. PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f07df97c08731d493633b48191f883bb Text-delta-base-sha1: 33116a303ab9f9b97e30c8a19bb1f401d4d2b968 Text-content-length: 39 Text-content-md5: eb4e2aab7d0f315951570070661b5c8f Text-content-sha1: 87d4ffe7ea974b4d2d02c5dc99fe7a842eadfb5f Content-length: 39 SVN��[q �f��~]assert(ret == Revision-number: 9965 Prop-content-length: 528 Content-length: 528 K 8 svn:date V 27 2013-07-22T07:12:26.232058Z K 7 svn:log V 427 Correct an inequality sign causing the bounds check in Windows palette_set() to be bogus. Fortunately, this isn't exploitable through the terminal emulator, because the palette escape sequence parser contains its own bounds check before even calling palette_set(). While I'm at it, fix the same goof in the OS X version! That port is more or less abandoned, but that's no excuse for leaving obviously wrong code lying around. K 10 svn:author V 5 simon PROPS-END Node-path: putty/macosx/osxwin.m Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e9d812aaec9c1771f67219d8594fd0c Text-delta-base-sha1: 5304f9e7d4dc2dc5550378a5eac44f826db9b869 Text-content-length: 26 Text-content-md5: 2db64bef89c5f812c19932d9721d8f2a Text-content-sha1: d206c8ba2222e187ea470a6adc4d685f6b169788 Content-length: 26 SVN��HI �7��7= Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3c3f5afcf3114f779f971f33ede80c3a Text-delta-base-sha1: bdf0489ef9b883d303d158e33a2b49dfa46083d2 Text-content-length: 43 Text-content-md5: 8a032fe7c0c849d64c5527d056ce46e0 Text-content-sha1: 0c250e5395286078c699391aa814049f8d251275 Content-length: 43 SVN���������DE �.��.= Revision-number: 9966 Prop-content-length: 263 Content-length: 263 K 8 svn:date V 27 2013-07-22T07:12:31.102137Z K 7 svn:log V 162 Increase FONT_MAXNO from 0x2f to 0x40, to ensure the fonts[] array includes every possible combination of the font bitfields, in particular ATTR_OEM|ATTR_NARROW. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a032fe7c0c849d64c5527d056ce46e0 Text-delta-base-sha1: 0c250e5395286078c699391aa814049f8d251275 Text-content-length: 42 Text-content-md5: 87cb32b4ddada9985960ff1cfa5c6d14 Text-content-sha1: 9900a7ad91330f275b1af2e6bc7b12ca479fd992 Content-length: 42 SVN���� �u�� w40�EE��E� Revision-number: 9967 Prop-content-length: 207 Content-length: 207 K 8 svn:date V 27 2013-07-22T19:55:53.311196Z K 7 svn:log V 106 Remove the variable 'bufused', which came over from winnet.c in mistaken cut and paste and is just a bug. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winmisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 928bebe88bb660ea02db2079b0c2b33c Text-delta-base-sha1: 45135a3f00a0e1a40c20e4102d0f343108e595d8 Text-content-length: 35 Text-content-md5: 858e2dfe82fd0bfde0a73dc74e2dc2d0 Text-content-sha1: 59a09e3524385fbd0e2e4bdd469801c88968b14d Content-length: 35 SVN��tW � ��$�V, bufsize Revision-number: 9968 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2013-07-22T19:55:55.481744Z K 7 svn:log V 42 Fix a few more memory and resource leaks. K 10 svn:author V 5 simon PROPS-END Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9bcafab8522046be77aecc28901d51ec Text-delta-base-sha1: d3f4ec7401285d39af4a3f867fb9961e2bfb8005 Text-content-length: 59 Text-content-md5: 9bbd9d00e403f6adefbd37b4cbb6f75c Text-content-sha1: e9f1893d4660077d1cca10a5498b3b20a1a0186a Content-length: 59 SVN��\ #�t��kq sk_addr_free(proxy_addr Node-path: putty/psftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c20b6211508a0f80368c65591a63ab73 Text-delta-base-sha1: e69d2e66ffd45b2644bf024c77bfdfa937cc9003 Text-content-length: 185 Text-content-md5: 12b1b26aaf2cd05b1a1b67ce018ec2db Text-content-sha1: 14b5590992bb7a5b6bd651841b98b453b3960c29 Content-length: 185 SVN�� o�"���\X�\/ sftp_finish_wildcard_matching(swcm); printf("%s: canonify: %s\n", origwfname, fxp_error()); sfree(origwfname conf_free(conf2); Node-path: putty/windows/winpgen.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8f2a1a685dcede936ab0731be3de2f38 Text-delta-base-sha1: 69b9e52d9efb84f826e0d60bdda6c4960fed3454 Text-content-length: 174 Text-content-md5: eed7279714e7927236370bfdfaebe807 Text-content-sha1: ac56239f642e0720048fee31b03fb5f16e36298a Content-length: 174 SVN��`*�R��F { Filename *fn = filename_from_str(cmdline_keyfile); load_key_file(hwnd, state, fn, 0); filename_free(fn); } Revision-number: 9969 Prop-content-length: 142 Content-length: 142 K 8 svn:date V 27 2013-07-22T19:56:00.771424Z K 7 svn:log V 42 Add a bob script to do Coverity scanning. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Buildscr.cv Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1262 Text-content-md5: 353e2228472a4d8d31e739d39c119160 Text-content-sha1: 28c225708459076235879ee7e70c3bed669a2236 Content-length: 1272 PROPS-END SVN���```# -*- sh -*- # Build script to scan PuTTY with the downloadable Coverity scanner # and generate a tar file to upload to their open-source scanning # service. module putty # Preparations. in putty do ./mkfiles.pl in putty do ./mkauto.sh in putty/doc do make # Scan the Unix build, on a 64-bit system to differentiate as much as # possible from the other scan of the cross-platform files. delegate covscan64 in putty do ./configure in putty do cov-build --dir cov-int make in putty do tar czvf cov-int.tar.gz cov-int return putty/cov-int.tar.gz enddelegate # Scan the Windows build, by means of building with Winelib (since as # of 2013-07-22, the Coverity Scan website doesn't offer a 32-bit # Windows scanner for download). delegate covscan32wine in putty do tar xzvf cov-int.tar.gz in putty/windows do cov-build --dir ../cov-int make -f Makefile.cyg CC=winegcc RC=wrc in putty do tar czvf cov-int.tar.gz cov-int return putty/cov-int.tar.gz enddelegate # Provide the revision number as one of the build outputs, to make it # easy to construct a curl upload command which will annotate it # appropriately when uploaded. in putty do echo $(revision) > revision.txt deliver putty/revision.txt $@ deliver putty/cov-int.tar.gz $@ Revision-number: 9970 Prop-content-length: 222 Content-length: 222 K 8 svn:date V 27 2013-07-22T19:56:04.121580Z K 7 svn:log V 121 Back out r9964. I wasn't paying attention: every control is in the byid tree but not all of them are in the byctrl tree. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/winctrls.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eb4e2aab7d0f315951570070661b5c8f Text-delta-base-sha1: 87d4ffe7ea974b4d2d02c5dc99fe7a842eadfb5f Text-content-length: 25 Text-content-md5: f07df97c08731d493633b48191f883bb Text-content-sha1: 33116a303ab9f9b97e30c8a19bb1f401d4d2b968 Content-length: 25 SVN��q[ ��f��u| Revision-number: 9971 Prop-content-length: 276 Content-length: 276 K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-24T19:18:06.035286Z K 7 svn:log V 175 Get rid of the variable 'advapi' in Pageant's WinMain, which was never actually used for anything sensible and could have been freed while containing nonsense at program end. PROPS-END Node-path: putty/windows/winpgnt.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2e33e8dec2b8e89ab754895b3f84ccaf Text-delta-base-sha1: c40f63aec27cce9aa689e2c791edd8ade7ae87c6 Text-content-length: 47 Text-content-md5: f7d3101457a2be7b6171ac7ffeb8b32a Text-content-sha1: 552813a391a278c7a9a470e4171055536d37e9ea Content-length: 47 SVN��aB"�����U,�y)�I�b Revision-number: 9972 Prop-content-length: 155 Content-length: 155 K 7 svn:log V 55 Add an assortment of missing consts I've just noticed. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-07-27T18:35:48.387918Z PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ee1b22bf46a21e9cb5bebff0a2f95223 Text-delta-base-sha1: eb05e8b66fe8972c12bbd2f6ec69344cd14d9d42 Text-content-length: 26 Text-content-md5: 82f4db64a52e37bdb055a5a5f8b19d6b Text-content-sha1: 1c90d0708ec8d601ee5b3e01c5c809deca2e2749 Content-length: 26 SVN��LR �=��<onst Node-path: putty/proxy.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9bbd9d00e403f6adefbd37b4cbb6f75c Text-delta-base-sha1: e9f1893d4660077d1cca10a5498b3b20a1a0186a Text-content-length: 89 Text-content-md5: a007511b94769977fe3011a1a54577b2 Text-content-sha1: a764607cca52cdf109f0543b57802d613322d382 Content-length: 89 SVN��$ @�<�@�(Zonst char *hostname, int port, Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0cb608f6b8e9562ad04b96eab010475a Text-delta-base-sha1: c546cd1227754712cb699611008676ca03b6d247 Text-content-length: 584 Text-content-md5: 305f7b3be71161fd5494eb285c72810e Text-content-sha1: bf958749770e7e16c5d1a03e34056721153bc75f Content-length: 584 SVN����3[�x��Mw�H�J�BI�1�iDconstonst char *data); static void ssh_pkt_addstring_data(struct Packet *, const char *data, int len); static void ssh_pkt_addstring(struct Packet *, constconstonstonst char *data, onst���SS�-�r2, s->hostkey.bytes); MD5Update(&md5c, s->keystr1, s->servkey.bytes); MD5U���SS�-� ssh2_pkt_send(ssh, pktout); c->v.v2.locwindow = newwin; } } /* * Find the c�!tSS�!� ssh = (Ssh) handle; int i = 0; #define ADD_SPECIALS(name) \ do { \ assert Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0221c7f39448fdf718f03768ba00c8df Text-delta-base-sha1: e06a911b6fc7e2ff57b350a2936afb8a01aca7cf Text-content-length: 126 Text-content-md5: c9b9913a120127d3bd56eda7cdf292c1 Text-content-sha1: 895bb9a2d403e0871b329ef1532b92a7bc14492e Content-length: 126 SVN��+ e�d�e�b=const void *p, int len); void SHA_Final(SHA_State * s, unsigned char *output); void SHA_Simple(const Node-path: putty/sshsha.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5a81f469141d8c95f730c27e86bc0c16 Text-delta-base-sha1: 7b6b5393c11054f1f259d3b1c5cce813d921d1e1 Text-content-length: 95 Text-content-md5: 4168fc1bd14ca1abc30731677d040134 Text-content-sha1: 2eb8869d8f6be14fd48b298e6c55c9a9c23fdf1c Content-length: 95 SVN��;SD�`��O �`[const void *p, int len) { const unsigned char *q = (const const Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 010da7bb4085f76d789e564e58175cbe Text-delta-base-sha1: f88ebf29734eba516985dee540d19a1707193941 Text-content-length: 29 Text-content-md5: 0db630cd719bca34ca2ef2b74b60fc1a Text-content-sha1: 6a0731ebc118c77dab837624da1119bb31ad4823 Content-length: 29 SVN��+1 ���onst Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3340b7933ff650f18787f62db3792f61 Text-delta-base-sha1: 876df1cc82dcdfd385ef824d026186164278a916 Text-content-length: 31 Text-content-md5: 65cb1ee61ff633e1674649e1c40bb534 Text-content-sha1: dd924666a84bb31e29ef858c427524b05d95069b Content-length: 31 SVN��[a ���N onst Revision-number: 9973 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9974 Prop-content-length: 374 Content-length: 374 K 8 svn:date V 27 2013-07-29T17:47:33.793048Z K 7 svn:log V 273 Remove one of the frees added in r9916. stat_name points to somewhere within the same string that destfname points to the start of, so freeing it causes at best a double-free of destfname and more likely a free of something that isn't even the start of an allocated block. K 10 svn:author V 5 simon PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b47d11dd2ccff0e77234b6e2afa7698a Text-delta-base-sha1: cad2afb42fd2629782827aa4d9cec3f6cef8fc70 Text-content-length: 24 Text-content-md5: 9ac67fd99265467f3909daa6cb740c25 Text-content-sha1: e23a8accb118c5e09c24b40e005c33c2f49c712b Content-length: 24 SVN��t ��#��Q6 Revision-number: 9975 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9976 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9977 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2013-08-02T06:27:54.276107Z K 7 svn:log V 60 Fix an array-size bug in modmul, and add some tests for it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d4459a76baa6c08dd4543633670c5d12 Text-delta-base-sha1: 5442b02103ff66f96936270e41e40f3d97eb031e Text-content-length: 684 Text-content-md5: b2d37638dbd7c781fae7fcc58547c4ae Text-content-sha1: e189e86911f64e95c549cbb2d2951d1e34b4d2a4 Content-length: 684 SVN��7 =a�P�G�G*�=4 �N=�rM�jd� �& * Make sure that we're allowing enough space. The shifting below * will underflow the vectors we allocate if pqlen is too small. */ if (2*pqlen <= mlen) pqlen = mlen/2 + 1modmul")) { Bignum a, b, m, c, p; if (ptrnum != 4) { printf("%d: modmul with %d parameters, expected 4\n", m = bignum_from_bytes(ptrs[2], ptrs[3]-ptrs[2]); c = bignum_from_bytes(ptrs[3], ptrs[4]-ptrs[3]); p = modmul(a, b, mms = bignum_decimal(mmod %s gave %s expected %s\n", line, as, bs, ms, ps, cmm Node-path: putty/testdata/bignum.py Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e366a9a8b64854191ab77efb795a30bc Text-delta-base-sha1: 39471ea6fcf5cc7f8cb7b534ac3afe1f2346fdac Text-content-length: 389 Text-content-md5: 95ba74fdadd54e4a3dc7f2e067ce71d7 Text-content-sha1: 91fb4d130efe31ab4c160217f3e559c65173d6ed Content-length: 389 SVN��k�L��a4]mul. for ai in range(20, 200, 60): a = sqrt(3<<(2*ai-1)) for bi in range(20, 200, 60): b = sqrt(5<<(2*bi-1)) for m in range(20, 600, 32): m = sqrt(2**(m+1)) print "modmul", hexstr(a), hexstr(b), hexstr(m), hexstr((a*b) % m print "pow", hexstr(i), hexstr(expt), hexstr(modulus), hexstr(pow(i, expt, modulus)) Revision-number: 9978 Prop-content-length: 167 Content-length: 167 K 7 svn:log V 67 Add some missing bounds checks in signature verification routines. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-02T06:27:56.456126Z PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b9443a402404f425c9c16a20ef05483f Text-delta-base-sha1: 545237c44d271b4f6cd58d8ba9296210c4af3400 Text-content-length: 61 Text-content-md5: 92b8c9c9a70795c54543571180b2180a Text-content-sha1: fe59b864eabadb791395f67097806a74eac7a2af Content-length: 61 SVN��Ly &�a��rZif (*datalen < 20) return NULL Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d958d48dec77b0f7fa691945b7e928e3 Text-delta-base-sha1: 60050037bc66c2baf1693952df1874cdfaa3aa69 Text-content-length: 50 Text-content-md5: ac1947cb16743ada681d61e48c693a17 Text-content-sha1: 5ebe45044601a859070f6e6b7f21097dd024a32b Content-length: 50 SVN��Ut ���<if (!in) return 0 Revision-number: 9979 Prop-content-length: 164 Content-length: 164 K 7 svn:log V 64 Replace some 'sfree' calls of bignums with the proper 'freebn'. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-02T06:28:00.566250Z PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 92b8c9c9a70795c54543571180b2180a Text-delta-base-sha1: fe59b864eabadb791395f67097806a74eac7a2af Text-content-length: 98 Text-content-md5: efb121e2d572d0ec2216c2ed79a8ddab Text-content-sha1: b5106faedcb0d07a209b0261590b520c7df71e62 Content-length: 98 SVN��y~ J�*�J� ofreebn(dss->p); freebn(dss->q); freebn(dss->g); freebn(dss->y); freebn Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ac1947cb16743ada681d61e48c693a17 Text-delta-base-sha1: 5ebe45044601a859070f6e6b7f21097dd024a32b Text-content-length: 73 Text-content-md5: 1c0dd47a4526f9f4744ed1d96dcdc384 Text-content-sha1: 6483dbbedd4098de5e22860ac71a6ceb27cc2d71 Content-length: 73 SVN��t"�6��>;�y~�D|�B��y{freebnfreebnfreebn Revision-number: 9980 Prop-content-length: 151 Content-length: 151 K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-02T06:28:05.756388Z K 7 svn:log V 51 Verify RSA keys created by rsa2_openssh_createkey. PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1c0dd47a4526f9f4744ed1d96dcdc384 Text-delta-base-sha1: 6483dbbedd4098de5e22860ac71a6ceb27cc2d71 Text-content-length: 29 Text-content-md5: f2bbb16e2f922a12fe5f58604adc8111 Text-content-sha1: e4aa12ce5818b52ecad68a5efb56ba75aeedc8c6 Content-length: 29 SVN��K��w��[j�y Revision-number: 9981 Prop-content-length: 221 Content-length: 221 K 8 svn:date V 27 2013-08-02T19:51:36.076891Z K 7 svn:log V 120 Found a lot of places in sshbn.c where for-loops zeroing out memory just before freeing it really ought to be smemclrs. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b2d37638dbd7c781fae7fcc58547c4ae Text-delta-base-sha1: e189e86911f64e95c549cbb2d2951d1e34b4d2a4 Text-content-length: 1063 Text-content-md5: 72fddff4cd79d30ed11a49376ea805f1 Text-content-sha1: 6a03bd85b6f80f1b769be7822861f800c5aa2103 Content-length: 1063 SVN�� P6c�T��br9�'-���qN� M�> �FEsmemclr(a, 2 * mlen * sizeof(*a)); sfree(a); smemclr(scratch, scratchlen * sizeof(*scratch)); sfree(scratch); smemclr(b, 2 * mlen * sizeof(*b)); sfree(b); smemclr(m, mlen * sizeof(*m)); sfree(m); smemclr(n, mlen * sizeof(*n))smemclr(scratch, scratchlen * sizeof(*scratch)); sfree(scratch); smemclr(a, 2 * len * sizeof(*a)); sfree(a); smemclr(b, 2 * len * sizeof(*b)); sfree(b); smemclr(mninv, len * sizeof(*mninv)); sfree(mninv); smemclr(n, len * sizeof(*n)); sfree(n); smemclr(x, len * sizeof(*x))smemclr(scratch, scratchlen * sizeof(*scratch)); sfree(scratch); smemclr(a, 2 * pqlen * sizeof(*a)); sfree(a); smemclr(m, mlen * sizeof(*m)); sfree(m); smemclr(n, pqlen * sizeof(*n)); sfree(n); smemclr(o, pqlen * sizeof(*o))smemclr(m, mlen * sizeof(*m)); sfree(m); smemclr(n, plen * sizeof(*n))smemclr(workspace, wslen * sizeof(*workspace))memclr(workspace, x[0] * sizeof(*workspace)); Revision-number: 9982 Prop-content-length: 302 Content-length: 302 K 8 svn:date V 27 2013-08-02T22:33:40.808216Z K 7 svn:log V 201 Raise the default scrollback from 200 to 2000 lines. The former was not so silly in the 1990s and before I implemented scrollback compression, but it's been a ridiculously low default for a while now. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 56a16a8e6a8f944c87ca8ee55b5ccd3c Text-delta-base-sha1: 4ccc5865c36278834cc791cb267ca30fe82c21e8 Text-content-length: 24 Text-content-md5: 556383ddbfdd6bad227265941e54686c Text-content-sha1: e618daf881a8710fbe5aacc5b1bc1e88a75a2cca Content-length: 24 SVN�� ��O��8N Revision-number: 9983 Prop-content-length: 489 Content-length: 489 K 8 svn:date V 27 2013-08-04T19:32:10.792966Z K 7 svn:log V 388 Reinstate a piece of code accidentally removed in r9214, where Windows PuTTY does not trim a colon suffix off the hostname if it contains _more than one_ colon. This allows IPv6 literals to be entered. (Really we need to do a much bigger revamp of all uses of hostnames to arrange that square-bracketed IPv6 literals work consistently, but this at least removes a regression over 0.62.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 87cb32b4ddada9985960ff1cfa5c6d14 Text-delta-base-sha1: 9900a7ad91330f275b1af2e6bc7b12ca479fd992 Text-content-length: 814 Text-content-md5: 6244f0913f3fb1e07fd3c3520b109dd2 Text-content-sha1: f29cfdd740ea5cac5b5559222d31c3115b9d7d21 Content-length: 814 SVN����i��i�t /* * Trim a colon suffix off the hostname if it's there. In * order to protect IPv6 address literals against this * treatment, we do not do this if there's _more_ than one * colon. */ { char *c = strchr(host, ':'); if (c) { char *d = strchr(c+1, ':'); if (!d) *c = '\0'; } }�EI �u-�E�Dx_maybe); /* GRR: This draws the character outside its box and * can leave 'droppings' even with the clip box! I * suppose I could loop it one character at a time ... * yuk. * Revision-number: 9984 Prop-content-length: 130 Content-length: 130 K 8 svn:date V 27 2013-08-04T19:33:43.745244Z K 7 svn:log V 30 Sanitise freeing of DSA keys. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: efb121e2d572d0ec2216c2ed79a8ddab Text-delta-base-sha1: b5106faedcb0d07a209b0261590b520c7df71e62 Text-content-length: 241 Text-content-md5: 86ab433ae852b9a0eb6546d02fb271af Text-content-sha1: a550896ef28ee3768da72a9681b7d41b283fbf19 Content-length: 241 SVN��~ R�5��q3A�m dss->x = NULLif (dss->p) freebn(dss->p); if (dss->q) freebn(dss->q); if (dss->g) freebn(dss->g); if (dss->y) freebn(dss->y); if (dss->x) freebn(dss->x Revision-number: 9985 Prop-content-length: 218 Content-length: 218 K 8 svn:date V 27 2013-08-04T19:33:46.355764Z K 7 svn:log V 117 Remove some redundant null-pointer checks from code that must have been written before I wrote a never-failing snew. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 86ab433ae852b9a0eb6546d02fb271af Text-delta-base-sha1: a550896ef28ee3768da72a9681b7d41b283fbf19 Text-content-length: 27 Text-content-md5: 95ac04ff0739def89f22f18a50ff2489 Text-content-sha1: a979cab7ebb4a463c9e94cf7d9b523225b0abaf0 Content-length: 27 SVN�� Q�����/�"g Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f2bbb16e2f922a12fe5f58604adc8111 Text-delta-base-sha1: e4aa12ce5818b52ecad68a5efb56ba75aeedc8c6 Text-content-length: 28 Text-content-md5: b5e610a0a06f7bba9c48273e1d958a3e Text-content-sha1: 1565c99776efb4f96d314aa119d43ab3eb626561 Content-length: 28 SVN��K��D��`�P{ Revision-number: 9986 Prop-content-length: 204 Content-length: 204 K 8 svn:date V 27 2013-08-04T19:33:49.215379Z K 7 svn:log V 103 Validate newly created DSA keys more carefully. Don't want a structure half-filled with null pointers. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 95ac04ff0739def89f22f18a50ff2489 Text-delta-base-sha1: a979cab7ebb4a463c9e94cf7d9b523225b0abaf0 Text-content-length: 593 Text-content-md5: 7db785b8e9da57e732bbad2d3938e123 Text-content-sha1: 2b237614888c56e998a1d424d1deba79ec6beee0 Content-length: 593 SVN��Q�(���;vA�f+ �H0�5_�Cdss_freekey(void *key); /* forward reference */if (!dss->p || !dss->q || !dss->g || !dss->y || !bignum_cmp(dss->q, Zero) || !bignum_cmp(dss->p, Zero)) { /* Invalid key. */ dss_freekey(dss); return NULL; }if (!dss) return NULL; dss->x = getmp(&pb, &priv_len); if (!dss->x) { dss_freekey(dss); return NULL; } || !bignum_cmp(dss->q, Zero) || !bignum_cmp(dss->p, Zero)) { /* Invalid key. */ dss_freekey(dss); if (!dss) return -1 Revision-number: 9987 Prop-content-length: 328 Content-length: 328 K 8 svn:date V 27 2013-08-04T19:33:53.135955Z K 7 svn:log V 227 More consistently defend against division by zero with assertions. We now check that all the modular functions (modpow, modinv, modmul, bigdivmod) have nonzero moduli, and that modinv also has a nonzero thing to try to invert. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 72fddff4cd79d30ed11a49376ea805f1 Text-delta-base-sha1: 6a03bd85b6f80f1b769be7822861f800c5aa2103 Text-content-length: 175 Text-content-md5: 35079ab3bcc62764de4837c09996673b Text-content-sha1: d6c107cebfa9f7e1b85e1f7e1d480db1592f1edb Content-length: 175 SVN��P8j�q��xk�}�4��g�}�4�EkD�')assert(m0 >> (BIGNUM_INT_BITS-1) == 1)assert(number[number[0]] != 0); assert(modulus[modulus[0]] != 0) Revision-number: 9988 Prop-content-length: 132 Content-length: 132 K 8 svn:date V 27 2013-08-04T19:33:57.495598Z K 7 svn:log V 32 Another couple of memory leaks. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7db785b8e9da57e732bbad2d3938e123 Text-delta-base-sha1: 2b237614888c56e998a1d424d1deba79ec6beee0 Text-content-length: 127 Text-content-md5: 595e66946cd17d84759c67224ea8ecd9 Text-content-sha1: 3052764f918bfa8e1b5826b7cf200329f8770e67 Content-length: 127 SVN���c`�T�_�F_�i { if (r) freebn(r); if (s) freebn(s); return 0; }k Revision-number: 9989 Prop-content-length: 201 Content-length: 201 K 7 svn:log V 100 Avoid trying to take the modular inverse of zero in response to a sufficiently silly DSA signature. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-04T19:34:00.646105Z PROPS-END Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 595e66946cd17d84759c67224ea8ecd9 Text-delta-base-sha1: 3052764f918bfa8e1b5826b7cf200329f8770e67 Text-content-length: 98 Text-content-md5: 5e42d494eb30f540a7ea97df00315ce7 Text-content-sha1: 9f69225d779a366aed12cecbf87a9ffb41200c91 Content-length: 98 SVN��cB J�9�J�?$if (!bignum_cmp(s, Zero)) { freebn(r); freebn(s); Revision-number: 9990 Prop-content-length: 219 Content-length: 219 K 8 svn:date V 27 2013-08-04T19:34:07.496288Z K 7 svn:log V 118 Make modinv able to return NULL if its inputs are not coprime, and check for that return value everywhere it is used. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 35079ab3bcc62764de4837c09996673b Text-delta-base-sha1: d6c107cebfa9f7e1b85e1f7e1d480db1592f1edb Text-content-length: 368 Text-content-md5: 9e31c448535e31c6624756ffbf0ad6f2 Text-content-sha1: fcb7ae51804d02be8df0f813fc468a0d47ff0493 Content-length: 368 SVN��7K�v�J�u�]& assert(inv); /* cannot fail, since mod is odd and r is a power of 2 */, q; if (bignum_cmp(b, Zero) == 0) { /* * Found a common factor between the inputs, so we cannot * return a modular inverse at all. */ return NULL; } t = newbn(b[0]); Node-path: putty/sshdss.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5e42d494eb30f540a7ea97df00315ce7 Text-delta-base-sha1: 9f69225d779a366aed12cecbf87a9ffb41200c91 Text-content-length: 848 Text-content-md5: 60eb0b4c87a634d7c0c7f455fffb17c1 Text-content-sha1: 00f10f9082d8ee2df0e0de6682e59f5f65f314e1 Content-length: 848 SVN��B@)�^�K�j]^�8=�+ if (!w) { freebn(r); freebn(s); return 0; } while (1) { SHA512_State ss2 = ss; /* structure copy */ SHA512_Final(&ss2, digest512); smemclr(&ss2, sizeof(ss2)); /* * Now convert the result into a bignum, and reduce it mod q. */ proto_k = bignum_from_bytes(digest512, 64); k = bigmod(proto_k, dss->q); freebn(proto_k); kinv = modinv(k, dss->q); /* k^-1 mod q */ if (!kinv) { /* very unlikely */ freebn(k); /* Perturb the hash to think of a different k. */ SHA512_Bytes(&ss, "x", 1); /* Go round and try again. */ continue; } break; } smemclr(&ss, sizeof(ss) Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b5e610a0a06f7bba9c48273e1d958a3e Text-delta-base-sha1: 1565c99776efb4f96d314aa119d43ab3eb626561 Text-content-length: 307 Text-content-md5: fda5a0bf2bee729bc29100b3f5094797 Text-content-sha1: 361d4015201c71fc7b425465714d2854408d6eb2 Content-length: 307 SVN��^��f�O�G�3` /* * Also, make sure it has an inverse mod modulus. */ random_inverse = modinv(random, key->modulus); if (!random_inverse) { freebn(random); continue; } break; if (!key->iqmp) return 0 Node-path: putty/sshrsag.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ba62bb6e9721f194b354584d6412ff1e Text-delta-base-sha1: 9dbcecf4ab30e55bd8b56fa9e57ad3e9606323bd Text-content-length: 120 Text-content-md5: a91f543d83652d8bc528aeef63b5003e Text-content-sha1: 276a51813842260264b1a24784f0a92f70bb8029 Content-length: 120 SVN��N]��Y)�z/* * RSA key generation. */ #include <assert.h>assert(key->private_exponentassert(key->iqm Revision-number: 9991 Prop-content-length: 269 Content-length: 269 K 7 svn:log V 168 Spot when we didn't successfully create an RSA public key from a public blob, and return a proper error in that situation rather than a struct with unhelpful NULLs in. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-04T19:34:10.776349Z PROPS-END Node-path: putty/sshrsa.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fda5a0bf2bee729bc29100b3f5094797 Text-delta-base-sha1: 361d4015201c71fc7b425465714d2854408d6eb2 Text-content-length: 173 Text-content-md5: e2aa79b843bfffe0c6816ac5306a1b22 Text-content-sha1: 0b3e99b0a26ff25d1e904f943ec33a91f4b416dc Content-length: 173 SVN��^����;\�#;rsa2_freekey(void *key); /* forward reference */if (!rsa->exponent || !rsa->modulus) { rsa2_freekey(rsa); return NULL; } Revision-number: 9992 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 54 Fix memory leaks in the new error return from modinv. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-04T22:33:50.130007Z PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e31c448535e31c6624756ffbf0ad6f2 Text-delta-base-sha1: fcb7ae51804d02be8df0f813fc468a0d47ff0493 Text-content-length: 106 Text-content-md5: 3da19a01c15391a8396f8d829adaf80f Text-content-sha1: f65a9bcdd84dfa7540a1aa390af5ce32b357d2f1 Content-length: 106 SVN��7 P�(�P�freebn(b); freebn(a); freebn(xp); freebn(x); Revision-number: 9993 Prop-content-length: 145 Content-length: 145 K 8 svn:date V 27 2013-08-05T15:15:17.764282Z K 7 svn:log V 45 Belatedly update the copyright year to 2013. K 10 svn:author V 5 jacob PROPS-END Node-path: putty/LICENCE Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ea8a24aa9faa58869857e5a0fc87d01d Text-delta-base-sha1: 719c8f9f14c446e781eadd298dab940002d39e14 Text-content-length: 44 Text-content-md5: c7e8b8d28dcd0da93085254378ad19fb Text-content-sha1: 61d55ad94a7f6f1db2057e105b6eb48ec2e3481e Content-length: 44 SVN�� �qPuTTY is copyright 1997-2013 Node-path: putty/doc/blurb.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c2c609c7cbc19ee737b2674acf9ba63c Text-delta-base-sha1: 0ff7f4d94afed816ebd6ff74ef60cb96984ba32e Text-content-length: 22 Text-content-md5: b82eaa5f06c09de1b0303b8b10bba93d Text-content-sha1: 042b6b962b04b1111e0dff73a665954b1ae716b9 Content-length: 22 SVN��{{ �k��l3 Node-path: putty/doc/licence.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 25bc022bb63d78546f2ebd1f18365ad1 Text-delta-base-sha1: 5f66075e0e058aa7059cbd86c43f0b2d82e99e27 Text-content-length: 20 Text-content-md5: 937e485db48641fd05c16e3a46dc16e9 Text-content-sha1: fd278985c3743b2b3ee18d084035fa78ec95f315 Content-length: 20 SVN��``�j��uk3 Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b81fd419a33d144926fe67ce7e6ce824 Text-delta-base-sha1: 6dbb8ffd0d03bea45d8e8fff73a9eba6ffa96b45 Text-content-length: 47 Text-content-md5: 6d60a92577ba5a83b4f7fc73df31f3df Text-content-sha1: c1b4ec795cc676c17ded811edfeb6f556ceaec8b Content-length: 47 SVN���������??�<��P=�133 Node-path: putty/windows/pageant.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 64e28b0eb8bdd929f21b4300a4f88bb6 Text-delta-base-sha1: 1718f89af6f4c1999c8dc93f0abbd260382beb36 Text-content-length: 29 Text-content-md5: 23303f88e07d2f6b2758d23d95bb2913 Text-content-sha1: 9a3db5788e1787e02848b02045be8d0c5b509a7d Content-length: 29 SVN�� �-��L.�{33 Node-path: putty/windows/puttygen.rc Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5511939bb9b8f3a72d5e60c422a25cb8 Text-delta-base-sha1: 28fc81c42c2d04753c28a389694976d6e9e63deb Text-content-length: 29 Text-content-md5: ad51d8d9bdff63536de1bacc1bef229e Text-content-sha1: e1f229a28043d2ef8579fb524da4f9aab26ff1d0 Content-length: 29 SVN��CC�d��Le�233 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 37c2f3fec9c50033e9f429f971accfb4 Text-delta-base-sha1: 285ea12b05a8f343b196ffb93b4c5d852c1bcf5e Text-content-length: 22 Text-content-md5: 1603a08c407ceff9ae475a47853e7e40 Text-content-sha1: 16c6066fab81b6cdb9e415fbec1090c16182d560 Content-length: 22 SVN��bb �l��um3 Node-path: putty/windows/win_res.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dfaef47369d368646717ef51f2d730f2 Text-delta-base-sha1: 3339bda4e513fb6393c5bcd07da7406e6ab41b8a Text-content-length: 29 Text-content-md5: 00b079fa420b78b9eff8450926619531 Text-content-sha1: 0d68ae59fca78aa297ba4bde5853bd9b7f84769b Content-length: 29 SVN��tt�k��Cl�D033 Node-path: putty-website/licence.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1b98fe7d2e5a82c979c609568b50bafd Text-delta-base-sha1: 229015707fb87d4852b638edc47b4b45803fe1d4 Text-content-length: 22 Text-content-md5: f456963f8001547ce88349d84ed2a388 Text-content-sha1: 6c9e807c50fd75f09b403adfb3dcb44f5b2e600a Content-length: 22 SVN��BB ���9 3 Revision-number: 9994 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 9995 Prop-content-length: 223 Content-length: 223 K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-05T19:50:47.331699Z K 7 svn:log V 122 Add some more precautionary assertions, just in case anything wildly out of range manages to get past other recent fixes. PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3da19a01c15391a8396f8d829adaf80f Text-delta-base-sha1: f65a9bcdd84dfa7540a1aa390af5ce32b357d2f1 Text-content-length: 359 Text-content-md5: b1818fff6123fe4b79c6e73661755036 Text-content-sha1: 6ece31e2b6d753df94cadfb803d809a91faee413 Content-length: 359 SVN��OC���=�F�`;��{&��"6� QU�o�#include <limits; assert(length >= 0 && length < INT_MAX / BIGNUM_INT_BITS); ; assert(n >= 0); assert(nbytes >= 0 && nbytes < INT_MAX/8)< 0 || < 0 || < 0 || ; assert(amax == 0 || a[amax] != 0); assert(bmax == 0 || b[bmax] != 0); assert(shift >= 0) Revision-number: 9996 Prop-content-length: 497 Content-length: 497 K 7 svn:log V 396 The bignum code has two representations of zero, since bn_restore_invariant (and the many loops that duplicate it) leaves a single zero word in a bignum representing 0, whereas the constant 'Zero' does not have any data words at all. Cope with this in bignum_cmp. (It would be a better plan to decide on one representation and stick with it, but this is the less disruptive fix for the moment.) K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-05T19:50:51.731807Z PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b1818fff6123fe4b79c6e73661755036 Text-delta-base-sha1: 6ece31e2b6d753df94cadfb803d809a91faee413 Text-content-length: 186 Text-content-md5: 450026aef276e7316d30084b662cfff4 Text-content-sha1: a761af23125ab7a272ed61d0bfac850929324120 Content-length: 186 SVN��Os�C��</* Annoyingly we have two representations of zero */ if (amax == 1 && a[amax] == 0) amax = 0; if (bmax == 1 && b[bmax] == 0) bmax = 0 Revision-number: 9997 Prop-content-length: 144 Content-length: 144 K 8 svn:date V 27 2013-08-06T16:45:49.994979Z K 7 svn:log V 44 One more defensive assert, just to be sure. K 10 svn:author V 5 simon PROPS-END Node-path: putty/sshbn.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 450026aef276e7316d30084b662cfff4 Text-delta-base-sha1: a761af23125ab7a272ed61d0bfac850929324120 Text-content-length: 60 Text-content-md5: 9c3d9fe76f33680aebb49a468cded310 Text-content-sha1: 9fd1c48769f965d8ae1149b114cc832f38cafc1a Content-length: 60 SVN��s "���Y assert(word <= number[0]); Revision-number: 9998 Prop-content-length: 143 Content-length: 143 K 8 svn:date V 27 2013-08-06T17:09:07.109500Z K 7 svn:log V 43 Bump version number prior to tagging 0.63. K 10 svn:author V 5 simon PROPS-END Node-path: putty/LATEST.VER Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c58a166d50ab58c0991b57965c5555ca Text-delta-base-sha1: c58b92b3476de1d38a9875bd590d5da421492d7e Text-content-length: 15 Text-content-md5: 7ecf611a91c01de854f7cb9de43fe0c7 Text-content-sha1: f27a9bd13cf40cc2cb77d6082b04202fccfd5c2b Content-length: 15 SVN��0.63 Node-path: putty/doc/plink.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a3b0d2d97beaae22565746d74b00314f Text-delta-base-sha1: 8987d9de45840d03304f6fe36c6e8026d08c9753 Text-content-length: 22 Text-content-md5: f476c52513c3677824189bd390f6a144 Text-content-sha1: eb9bbaa415e4f99479f2218783a7c3c4f6fd3eb3 Content-length: 22 SVN��99 ���3 Node-path: putty/doc/pscp.but Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4d57cbafc24a804d711939dce9f77385 Text-delta-base-sha1: 2c5f998878d3d197feae9a7cd924ec92efabf04d Text-content-length: 22 Text-content-md5: db2f92e6945de19568bc2b0a2e9fbe52 Text-content-sha1: 1eb37aa286a69104d77c44156b94fac43fae3588 Content-length: 22 SVN��`` ���[3 Node-path: putty/windows/putty.iss Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: a4602aaeab7dc553235952d7efc4ba08 Text-delta-base-sha1: 9056464cfe28edbe7ad974571f51ca3606aa9043 Text-content-length: 102 Text-content-md5: 29175c9fbce8f311e6c3d272ad77ccf1 Text-content-sha1: cba3880d9b54d09e9a4c4416db9b975f0de80b8a Content-length: 102 SVN�� P�=�P� 3 VersionInfoTextVersion=Release 0.63 AppVersion=0.63 VersionInfoVersion=0.63 Node-path: putty/windows/version.rc2 Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1603a08c407ceff9ae475a47853e7e40 Text-delta-base-sha1: 16c6066fab81b6cdb9e415fbec1090c16182d560 Text-content-length: 22 Text-content-md5: 7a997099a1ca424726559ab1216ac4ca Text-content-sha1: 1ba6380fa2da899a09e0019996df666e3697b383 Content-length: 22 SVN��bb �\��]3 Revision-number: 9999 Prop-content-length: 127 Content-length: 127 K 7 svn:log V 27 Drop tag for 0.63 release. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-06T17:09:20.409776Z PROPS-END Node-path: putty-0.63 Node-kind: dir Node-action: add Node-copyfrom-rev: 9998 Node-copyfrom-path: putty Revision-number: 10000 Prop-content-length: 174 Content-length: 174 K 8 svn:date V 27 2013-08-06T17:45:27.053634Z K 7 svn:log V 74 Update wishlist for 0.63, including adding the new vulnerability entries. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d7b3c8830304b5f7615c7d7d77a51e4 Text-delta-base-sha1: b1756b68b1398c1a134309d73e50b31f7805361e Text-content-length: 72 Text-content-md5: 9d2397f58e9f83a0d97f056b072db9c3 Text-content-sha1: e7ea6facd45fb8452724b6d7a5047a3b97ba8e4d Content-length: 72 SVN��p 0�4��3= [ "0.63", "2013-08-06", "r9998" ], # [ "0.64 Node-path: putty-wishlist/data/private-key-not-wiped Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 3003 Text-content-md5: 3a4061c60020bb03d566abaa747bebbd Text-content-sha1: 818eecff831aef4f9f194638362ac0b0aeba88a7 Content-length: 3013 PROPS-END SVN���---Summary: Private keys left in memory after being used by PuTTY tools Class: vulnerability Difficulty: fun Priority: high Absent-in: r1020 Present-in: 0.52 0.53 0.53b 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 Fixed-in: r9988 2013-07-14 0.63 Content-type: text/x-html-body <p> When PuTTY has sensitive data in memory and has no further need for it, it should wipe the data out of its memory, in case malware later gains access to the PuTTY process or the memory is swapped out to disk or written into a crash dump file. An obvious example of this is the password typed during SSH login; other examples include obsolete session keys, public-key passphrases, and the private halves of public keys. <p> After loading an RSA key, PuTTY runs the internal routine <code>rsa_verify()</code> to check that it makes sense. Every version of PuTTY since 2001, up to and including 0.62, has a bug in which <code>rsa_verify()</code> fails to wipe from memory two large integer variables containing <i>p</i>−1 and <i>q</i>−1, where <i>p</i> and <i>q</i> are the two primes whose product is the RSA key modulus. Recovering these from a PuTTY memory image would be sufficient to reconstruct the private half of the RSA key; so those versions of PuTTY would effectively store your private key in memory for as long as they were running. <p> Similar problems apply to DSA keys: PuTTY fails to free the private key component <i>x</i>, and also does not free the random number <i>k</i> that it generates when making a DSA signature, possession of which is sufficient to expose the private key. <p> This applies to every program in the PuTTY suite which loads private keys: PuTTY, PSCP, PSFTP and Plink. If any of those programs loads a private key directly (rather than getting a signature from an SSH agent such as Pageant) then they will have left information equivalent to the private key in memory for their entire run. <p> Pageant also had the same bug, but of course since its <em>job</em> is to retain decrypted private keys in memory that isn't important in most cases. However, if you ever told Pageant to delete a key from memory, it would not have properly deleted it: it would still have retained a copy by mistake due to this bug. <p> PuTTY 0.63 fixes this bug in all the tools: those variables are now correctly wiped from memory. <p> However, it is still <em>unavoidably</em> very dangerous if malicious software is in a position to read the memory of your PuTTY processes: there is still a lot of sensitive data in there which cannot be wiped because it's still being used, e.g. session keys. And, as mentioned above, Pageant retains decrypted private keys in memory for long periods <em>on purpose</em> if you use it. So this fix somewhat mitigates the risks of malicious access to your PuTTY processes' memory, but no fix can eliminate those risks completely. <p> The RSA part of this vulnerability was spotted by <a href="https://scan.coverity.com/">Coverity Scan</a>. Node-path: putty-wishlist/data/vuln-bignum-division-by-zero Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1672 Text-content-md5: 6fb524ce139661dec0be1f76aa1cf698 Text-content-sha1: cda67a984f19809e8ee21ff0c440934126df6bee Content-length: 1682 PROPS-END SVN���zzzSummary: Vulnerability: non-coprime values in DSA signatures can cause buffer overflow in modular inverse Class: vulnerability Difficulty: fun Priority: high Absent-in: r568 Present-in: 0.52 0.53 0.53b 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 Fixed-in: r9996 2013-08-05 0.63 Content-type: text/x-html-body <p> Many versions of PuTTY prior to 0.63 have a buffer overflow vulnerability in the calculation of modular inverses when verifying a DSA signature. <p> One step of the DSA signature verification procedure involves computing the modular inverse of the integer <i>s</i> (part of the signature) with respect to the integer <i>q</i> (part of the public key). If <i>s</i> and <i>q</i> have any common factor, this modular inverse cannot exist. Of course, such a signature is invalid (and probably the private key is invalid too), but PuTTY will react to that situation by its bignum code overflowing a buffer when it attempts to divide by zero during Euclid's algorithm. <p> This bug applies to any DSA signature received by PuTTY, including during the initial key exchange phase. Therefore, this bug can be exploited by a malicious server, <em>before</em> the client has received and verified a host key signature. So this attack can be performed by a man-in-the-middle between the SSH client and server, and the normal host key protections against MITM attacks are bypassed. Even if you trust the server you <em>think</em> you are connecting to, you are not safe. <p> We are unaware of any way in which this can lead to remote code execution, since there is no control over the data written into the heap. <p> This bug does not affect RSA keys. Node-path: putty-wishlist/data/vuln-modmul Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2549 Text-content-md5: d30133235facf7722173d8bc7ca2817a Text-content-sha1: 73f0924f22bbf7d17b1cfafbc99bc648354e14d7 Content-length: 2559 PROPS-END SVN���gggSummary: Vulnerability: buffer underrun in modmul can corrupt the heap Class: vulnerability Difficulty: fun Priority: high Absent-in: r571 Present-in: 0.52 0.53 0.53b 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 Fixed-in: r9977 2013-07-09 0.63 Content-type: text/x-html-body <p> Many versions of PuTTY prior to 0.63 have a heap-corrupting buffer underrun bug in the <code>modmul</code> function which performs modular multiplication. <p> In order to get as many useful bits as possible out of each division, <code>modmul</code> starts by shifting the modulus left so that its highest set bit appears at the top of a machine word. To correct for that shift in the following calculation, the last thing it does is to shift the entire output value left by the same number of bits, reduce it again, and shift back down. A missing bounds check can cause it to allocate the array it uses to store that output value with too little capacity, with the effect that the bit-shifting process runs off the beginning of the array and corrupts data preceding it in memory. <p> The corrupted data will typically consist of other values involved in the same modular multiplication, and the heap block headers in between them. Since the shifted data is shifted back again immediately after the final modular reduction, this bug would be harmless (though still wrong) except for the fact that one word at the bottom of the data is <em>not</em> shifted back down. By choosing the inputs to <code>modmul</code> to have appropriate lengths relative to each other, that one unrestored word can be made to point at a heap block header. <p> The <code>modmul</code> function is called during validation of any DSA signature received by PuTTY, including during the initial key exchange phase. Therefore, this bug can be exploited by a malicious server, <em>before</em> the client has received and verified a host key signature. So this attack can be performed by a man-in-the-middle between the SSH client and server, and the normal host key protections against MITM attacks are bypassed. Even if you trust the server you <em>think</em> you are connecting to, you are not safe. <p> We are currently unaware of any way in which this can lead to remote code execution or controlled memory overwriting, since the overwritten heap block cannot be assigned an arbitrary value by the attacker, only shifted left by a chosen number of bits. However, we cannot be sure of that. <p> This bug does not affect RSA keys. <p> This bug was discovered by Mark Wooding. Node-path: putty-wishlist/data/vuln-signature-stringlen Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1985 Text-content-md5: c051687b4724f425f03d22b6a4054642 Text-content-sha1: b21543acfdaaae4a31357bccdc279a95d6beb001 Content-length: 1995 PROPS-END SVN���333Summary: Vulnerability: negative string length in public-key signatures can cause integer overflow and overwrite all of memory Class: vulnerability Difficulty: fun Priority: high Absent-in: r968 Present-in: 0.52 0.53 0.53b 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 Fixed-in: r9896 2013-07-09 0.63 Content-type: text/x-html-body <p> Many versions of PuTTY prior to 0.63 have an integer overflow vulnerability in their treatment of string length fields in public-key signatures. <p> An RSA signature blob contains a multiprecision integer stored as an SSH-2 string, i.e. with a 4-byte length field at the front. Setting this length field to 0xFFFFFFFF (-1) is mistakenly permitted by the signature decoding code due to a missing bounds check, and the effect is that PuTTY allocates zero memory to store the integer in (because it adds one to the length first) and then tries to write zeroes over 4Gb of memory starting from that location. <p> This bug applies to any RSA signature received by PuTTY, including during the initial key exchange phase. Therefore, this bug can be exploited by a malicious server, <em>before</em> the client has received and verified a host key signature. So this attack can be performed by a man-in-the-middle between the SSH client and server, and the normal host key protections against MITM attacks are bypassed. Even if you trust the server you <em>think</em> you are connecting to, you are not safe. <p> We are unaware of any way in which this can lead to remote code execution, since it will typically overwrite the entire heap with zeroes and PuTTY is expected to crash almost immediately. <p> This bug does not affect DSA keys. <p> This bug was discovered by <a href="http://www.search-lab.hu/">SEARCH-LAB</a> and documented in <a href="http://www.search-lab.hu/advisories/secadv-20130722">their advisory</a>. It has been assigned CVE ID <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-4852">CVE-2013-4852</a>. Revision-number: 10001 Prop-content-length: 133 Content-length: 133 K 7 svn:log V 33 Update website for 0.63 release. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-06T17:45:34.234157Z PROPS-END Node-path: putty-website/.htaccess Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e6132a7a65aee823515d62240060f5e6 Text-delta-base-sha1: bc299423d24a26a238100c5f78b6b7a454ce3d03 Text-content-length: 90 Text-content-md5: 92aa17c609a0bbdab5f34b1e150d141d Text-content-sha1: 2c246c8c326d4f7540f4c4e5d1d471f4f21b19cc Content-length: 90 SVN��tC D�/�D�P$temp /~sgtatham/putty/0.63/ http://the.earth.li/~sgtatham/putty/0.63 Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06ed490a34fd85f46c2bfe1f7e0cea14 Text-delta-base-sha1: 7998b4a9186b101df45a95f3a2a3bd929d422b17 Text-content-length: 2451 Text-content-md5: f495aaa13cac976b65d7896b181e654f Text-content-sha1: 64c2a44ccbdd1217a4db63b05cbae6240d65d793 Content-length: 2451 SVN��fp x��x�`3 (released 2013-08-06): <ul> <li> Security fix: prevent a nefarious SSH server or network attacker from crashing PuTTY at startup in three different ways by presenting a maliciously constructed public key and signature. <li> Security fix: PuTTY no longer retains the private half of users' keys in memory by mistake after authenticating with them. <li> Revamped the internal configuration storage system to remove all fixed arbitrary limits on string lengths. In particular, there should now no longer be an unreasonably small limit on the number of port forwardings PuTTY can store. <li> Port-forwarded TCP connections which close one direction before the other should now be reliably supported, with EOF propagated independently in the two directions. This also fixes some instances of port-forwarding data corruption (if the corruption consisted of losing data from the very end of the connection) and some instances of PuTTY failing to close when the session is over (because it wrongly thought a forwarding channel was still active when it was not). <li> The terminal emulation now supports <code>xterm</code>'s bracketed paste mode (allowing aware applications to tell the difference between typed and pasted text, so that e.g. editors need not apply inappropriate auto-indent). <li> You can now choose to display bold text by both brightening the foreground colour <em>and</em> changing the font, not just one or the other. <li> PuTTYgen will now never generate a 2047-bit key when asked for 2048 (or more generally <i>n</i>−1 bits when asked for <i>n</i>). <li> Some updates to default settings: PuTTYgen now generates 2048-bit keys by default (rather than 1024), and PuTTY defaults to UTF-8 encoding and 2000 lines of scrollback (rather than ISO 8859-1 and 200). <li> Unix: PSCP and PSFTP now preserve the Unix file permissions, on copies in both directions. <li> Unix: dead keys and compose-character sequences are now supported. <li> Unix: PuTTY and pterm now permit font fallback (where glyphs not present in your selected font are automatically filled in from other fonts on the system) even if you are using a server-side X11 font rather than a Pango client-side one. <li> Bug fixes too numerous to list, mostly resulting from running the code through Coverity Scan which spotted an assortment of memory and resource leaks, logic errors, and crashes in various circumstances. </ul> <p>These features we Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 21bf1f37e70954aae676eab49729f828 Text-delta-base-sha1: 4a288130d0286deff81b7b62a39bc047744fcc0f Text-content-length: 225 Text-content-md5: 3b475f4dec0d91e775332976d2112c4c Text-content-sha1: 4236948526b8632c6142d1a9dc4783e1e5ce2e11 Content-length: 225 SVN��&&6���1�T��\=�^z�(1�T��O?�Q~�33-installer.exe">putty-0.63-installer.exex86/putty-0.63-installer-0.63-installer-0.633.tar.gz">putty-0.63.tar.gzputty-0.63.tar.gzputty-0.63.tar.gzputty-0.63 Node-path: putty-website/index.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e97fe7c4106133a396fe875669f67d68 Text-delta-base-sha1: 731ba1d1df74456de0418a3cfaa0c4986b10b4af Text-content-length: 543 Text-content-md5: 3aee41a8555fe5a2e6d3cb4b205764c9 Text-content-sha1: c8387e3f529073ff6fda252f9e0eee16a7364afc Content-length: 543 SVN��(4�K��aL��!33-08-06 PuTTY 0.63 released, fixing SECURITY HOLES</b> <p> PuTTY 0.63, released today, fixes <b>four security holes</b> in 0.62 and before: <a href="wishlist/vuln-modmul.html">vuln-modmul</a>, <a href="wishlist/vuln-signature-stringlen.html">vuln-signature-stringlen</a>, <a href="wishlist/vuln-bignum-division-by-zero.html">vuln-bignum-division-by-zero</a>, <a href="wishlist/private-key-not-wiped.html">private-key-not-wiped</a>. Other than that, there are mostly bug fixes from 0.62 and a few small features. Revision-number: 10002 Prop-content-length: 327 Content-length: 327 K 7 svn:log V 226 Suppress implicit "(0.63)" additions to Fixed-In if "0.63" is explicitly listed, because it looks silly otherwise. (Also reword the text about vulnerabilities to admit the possibility of DoS and the like, while I'm in there.) K 10 svn:author V 5 jacob K 8 svn:date V 27 2013-08-06T21:00:49.154674Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9d2397f58e9f83a0d97f056b072db9c3 Text-delta-base-sha1: e7ea6facd45fb8452724b6d7a5047a3b97ba8e4d Text-content-length: 139 Text-content-md5: 37ef7332b639b9d5cdc4032c14ed7651 Text-content-sha1: b84035e0f8b706002302b3d94c0d721698d9f0ad Content-length: 139 SVN��l�3���3O�d3, or otherwise cause mischief$bugs{$bug}->{"hdrs"}->{"fixed-in"} !~ m/\b\Q$rel\E\b/ and Revision-number: 10003 Prop-content-length: 162 Content-length: 162 K 8 svn:date V 27 2013-08-06T22:56:17.367399Z K 7 svn:log V 62 This was actually fixed a while ago (and the fix is in 0.63). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/unix-dead-keys Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1563d5cb821ea3217e9e0fd4bdca38f8 Text-delta-base-sha1: d29745fd746360134b52d7c3b6f2170142f8f366 Text-content-length: 129 Text-content-md5: a286b4f063610dd4f1cc645038a0984b Text-content-sha1: 1f5f185f8a8cd97b53acf67d7d5c0b2b4ef36e8b Content-length: 129 SVN�� l�U��@TRFixed-in: r9567 2012-06-18 <p> <em>Update:</em> fixed in r9567 (with fallout addressed in r9568 and r9573). Revision-number: 10004 Prop-content-length: 149 Content-length: 149 K 8 svn:date V 27 2013-08-06T22:56:44.468123Z K 7 svn:log V 49 Note what happened to the code behind this idea. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/portable-keyboard Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 4618f7956318f922643cacac0e0724cc Text-delta-base-sha1: 997621be4d7213834feec0bb0c0cded48bf8298d Text-content-length: 211 Text-content-md5: b7f40088f7ab043cbdfa8e3aaffb7eaa Text-content-sha1: 1518879a5debd9539c5ccdae9660ba2d0bacaf48 Content-length: 211 SVN��X@��@ (Update: this idea appeared in the code in the form of term_key() in terminal.c in r2728; however it was never adopted in any of the mainstream ports, so was finally removed again in r9579.) Revision-number: 10005 Prop-content-length: 317 Content-length: 317 K 7 svn:log V 216 Summary: Unicode character input on Windows (for Romanian, etc) Class: bug Fixed-in: r9942 2013-07-21 Retrospective wishlist entry for a thing fixed in 0.63, since this one was quite popular and requested long ago. K 10 svn:author V 5 jacob K 8 svn:date V 27 2013-08-06T23:35:35.705336Z PROPS-END Node-path: putty-wishlist/data/win-tounicodeex Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 738 Text-content-md5: 89629953d12aee430b3e58032e3e838f Text-content-sha1: 82734b2683dd0b40de1175b37106cba299b67de8 Content-length: 748 PROPS-END SVN���TTTSummary: Unicode character input on Windows (for Romanian, etc) Class: bug Priority: medium Fixed-in: r9942 2013-07-21 On Windows, some locales are such that there are keys on the keyboard corresponding to characters that are not in the system code page. PuTTY's use of ToAsciiEx() means that such characters can't easily be entered with PuTTY. Apparently this is a particular problem with Romanian keyboards and the characters U+0219 LATIN SMALL LETTER S WITH COMMA BELOW U+021B LATIN SMALL LETTER T WITH COMMA BELOW which are standardised in ISO-8859-16, which isn't supported by Windows XP. It's also been suggested that Armenian and Georgian locales are affected. Switching to ToUnicodeEx() avoids the problem. Revision-number: 10006 Prop-content-length: 160 Content-length: 160 K 8 svn:date V 27 2013-08-06T23:47:13.742074Z K 7 svn:log V 60 Mention RFC 6668, since partial support was added in r9759. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/links.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: cac7e7e4d0b4d312f9e537cc287cbce9 Text-delta-base-sha1: 8795a7e76e2d41041101dc3c20033ed525e4235a Text-content-length: 256 Text-content-md5: 3d390ac0dc488993ba1991039fc4705e Text-content-sha1: 1b10df550d5e35fcbe0ecd43c4f328cc4226c132 Content-length: 256 SVN��/+ f�;�f� %www.ietf.org/rfc/rfc6668.txt"> RFC 6668: SHA-2 Data Integrity Verification for the Secure Shell (SSH) Transport Layer Protocol</a> <ul> <li>(<tt>hmac-sha2-256</tt> only; we don't implement <tt>hmac-sha2-512</tt>)</li> </ul Revision-number: 10007 Prop-content-length: 158 Content-length: 158 K 8 svn:date V 27 2013-08-07T00:24:31.207836Z K 7 svn:log V 58 'sftp-ascii' was a duplicate of the older 'line-endings'. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/line-endings Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: de46084235a8712415f8b27888a83972 Text-delta-base-sha1: 9a51f8f448adb6eeb95f8f2fff074c44927d8867 Text-content-length: 173 Text-content-md5: f96b046c6ae76d6bec163942eb512bcc Text-content-sha1: 3cdef772b2d90eb83a6548e6815061d3e1be6807 Content-length: 173 SVN��., �g�x6Summary: Line ending conversion ("ASCII mode")(The SCP protocol continues to have no notion of transferring a file in anything other than binary mode Node-path: putty-wishlist/data/sftp-ascii Node-action: delete Revision-number: 10008 Prop-content-length: 410 Content-length: 410 K 8 svn:date V 27 2013-08-07T06:22:52.934229Z K 7 svn:log V 309 Revert the default for font bolding style back to using colours rather than fonts. I broke this in r9559 when I added the option for 'both', because the internal representation got offset by one so as to change from a boolean to two bitfields and I must have confused myself about what the default should be. K 10 svn:author V 5 simon PROPS-END Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 556383ddbfdd6bad227265941e54686c Text-delta-base-sha1: e618daf881a8710fbe5aacc5b1bc1e88a75a2cca Text-content-length: 26 Text-content-md5: fbee53ff8c1601af3b65ce5c0feede40 Text-content-sha1: eacc0d87a5611c50a494797df400490f9794dcbc Content-length: 26 SVN�� ���m1 Revision-number: 10009 Prop-content-length: 252 Content-length: 252 K 8 svn:date V 27 2013-08-07T08:50:39.444090Z K 7 svn:log V 151 CVE IDs for new vulnerabilities (ref <http://www.openwall.com/lists/oss-security/2013/08/06/13> and Colin Watson's changelog for Debian putty-0.63-1). K 10 svn:author V 5 jacob PROPS-END Node-path: putty-wishlist/data/private-key-not-wiped Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3a4061c60020bb03d566abaa747bebbd Text-delta-base-sha1: 818eecff831aef4f9f194638362ac0b0aeba88a7 Text-content-length: 147 Text-content-md5: 1414fb2dc5ee9ea162e1ae806be64dde Text-content-sha1: 6f3fbf1088ac7e3ebaa02dfbd42a558a5b70b892 Content-length: 147 SVN��--��-�� <p> This bug has been assigned CVE ID <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-4208">CVE-2013-4208</a>. Node-path: putty-wishlist/data/vuln-bignum-division-by-zero Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6fb524ce139661dec0be1f76aa1cf698 Text-delta-base-sha1: cda67a984f19809e8ee21ff0c440934126df6bee Text-content-length: 147 Text-content-md5: efec75b1d972602c65c3e55876351ce4 Text-content-sha1: a76efeacf04fa1bf5a999f8883e93414c8ca684b Content-length: 147 SVN��zz��z�� <p> This bug has been assigned CVE ID <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-4207">CVE-2013-4207</a>. Node-path: putty-wishlist/data/vuln-modmul Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d30133235facf7722173d8bc7ca2817a Text-delta-base-sha1: 73f0924f22bbf7d17b1cfafbc99bc648354e14d7 Text-content-length: 135 Text-content-md5: c447433b0bd23da4ba5a6a3ba42716de Text-content-sha1: 7bbb8a56b6c3713a9a61b2d388a00a9bfd8d2a6f Content-length: 135 SVN��g\v�f�v It has been assigned CVE ID <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-4206">CVE-2013-4206</a>. Revision-number: 10010 Prop-content-length: 227 Content-length: 227 K 8 svn:date V 27 2013-08-07T08:56:51.042934Z K 7 svn:log V 126 Link from the change log summary to the detailed wishlist entries for security vulnerabilities, as has been done in the past. K 10 svn:author V 5 jacob PROPS-END Node-path: putty-website/changes.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f495aaa13cac976b65d7896b181e654f Text-delta-base-sha1: 64c2a44ccbdd1217a4db63b05cbae6240d65d793 Text-content-length: 445 Text-content-md5: 9c9359307940a43c9590f67569dfd18e Text-content-sha1: 6cef14d38b9defd07855f0114bf04c9de64fa5b9 Content-length: 445 SVN��p]% �t��N&�s�I�s�I�g modmul.html">vuln-modmul</a>, <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/vuln-signature-stringlen.html">vuln-signature-stringlen</a>, <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/vuln-bignum-division-by-zero.html">vuln-bignum-division-by-zero</a>private-key-not-wiped.html">private-key-not-wiped</a>password-not-wiped.html">password-not-wiped</a> Revision-number: 10011 Prop-content-length: 192 Content-length: 192 K 8 svn:date V 27 2013-08-07T12:48:08.773112Z K 7 svn:log V 92 Add links to CVE-2011-4607, which Colin tells me is the name for 0.62's password-not-wiped. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/password-not-wiped Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7f6364ecfca915001e07346b21854bc2 Text-delta-base-sha1: 42e4d73943c4d42c975e5da760a0653f351eb31c Text-content-length: 486 Text-content-md5: 337c96387ce843a8e320e12af12bd722 Text-content-sha1: c8b40422414941e064edbe232ba5a3679e9bfd22 Content-length: 486 SVN��P#S�P�S <p> Various web pages link this bug with CVE ID CVE-2011-4607 (<a href="http://people.canonical.com/~ubuntu-security/cve/2011/CVE-2011-4607.html">Ubuntu Security</a>, <a href="https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2011-4607">Red Hat</a>, <a href="http://seclists.org/oss-sec/2011/q4/500">oss-sec</a>), although the page at <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4607">cve.mitre.org</a> claims that CVE is reserved but unpublished. Revision-number: 10012 Prop-content-length: 363 Content-length: 363 K 8 svn:date V 27 2013-08-08T11:54:54.075509Z K 7 svn:log V 262 Add some new wishlist entries. handle-unimplemented has been hanging around half-written in one of my checkout directories for a while; win-message-loop has recently been reported repeatedly by an impatient user; I noticed pscp-recursion-dest-dir the other day. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/handle-unimplemented Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2228 Text-content-md5: 334535c00b6e8eeb9673835c1c5d48f7 Text-content-sha1: 076cea6faf72fabe240005bcd59d2bf7f9123196 Content-length: 2238 PROPS-END SVN���&&&Summary: Handle SSH2_MSG_UNIMPLEMENTED more usefully Class: wish Priority: medium Difficulty: fun Content-type: text/x-html-body <p> If an SSH server sends us <code>SSH2_MSG_UNIMPLEMENTED</code>, we currently report it as "Strange packet received: type 3" and close the connection. It would at the very least be better if we reported it as SSH2_MSG_UNIMPLEMENTED, and ideally also gave some idea of <em>what</em> the server had claimed not to understand. <p> It's not completely clear to me how far we can sensibly take this sort of error reporting, but we could usefully at least be prepared to deal with common cases. For instance, servers which don't support rekeying: when we initiate a rekey, we could remember the sequence number of the SSH2_MSG_KEXINIT we send out, and if we subsequently see SSH2_MSG_UNIMPLEMENTED citing that sequence number then we could give an error message which actually suggested a corrective measure to the user ("try manually enabling 'Handles SSH-2 key re-exchange badly' in the Connection > SSH > Bugs panel"). <p> (In that particular case, it might even be possible to abandon the rekey and proceed with the rest of the connection – see <a href="kexinit-unimplemented.html">kexinit-unimplemented</a> – although I don't know if servers would in general even cope with that, and also I think it would be a bad idea not to at least warn the user of the drop in security.) <p> If we felt enthusiastic, we could try being more ambitious: it might be feasible, for instance, to keep track of <em>all</em> the message type codes for messages we've recently sent out. Whenever we see any message we can identify as the reply to some specific thing we sent, we can delete that and everything before it from our queue; then for any <code>SSH2_MSG_UNIMPLEMENTED</code>, we'll always be able to specify exactly what type of message the server didn't understand. <p> All of this, of course, assumes the server is sending out <code>SSH2_MSG_UNIMPLEMENTED</code> messages containing a correct packet sequence number. Some servers (in violation of the SSH spec) do not bother, and just put zero in the sequence number field when they send <code>SSH2_MSG_UNIMPLEMENTED</code>. Node-path: putty-wishlist/data/pscp-recursion-dest-dir Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 789 Text-content-md5: 3b228e5cc0619a91ec443291c817ef00 Text-content-sha1: 57851cb79678964ed02e00a861f0b3bd31b042b8 Content-length: 799 PROPS-END SVN���Summary: PSCP recursive copy to a new directory tries to copy all files over that dir Class: bug Priority: medium Difficulty: fun Content-type: text/x-html-body <p> If I try to copy a whole directory to an SFTP server using a command of the form <code>pscp -r srcdir desthost:destdir</code>, where <code>destdir</code> does not already exist on the destination host, I would like to end up with <code>destdir</code> existing and being an exact copy of <code>srcdir</code>. <p> Instead, what happens is that PSCP creates <code>destdir</code> but then tries to copy every file from <code>srcdir</code> over the top of it, i.e. it attempts to open <code>destdir</code> as a file repeatedly rather than opening <code>destdir/file1</code>, <code>destdir/file2</code> and so on. Node-path: putty-wishlist/data/win-message-loop Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 2543 Text-content-md5: 6fecbf770bd8da528ab301ecf6a6512d Text-content-sha1: 80f6e18bd12837c9994a7b22deda104a878cca63 Content-length: 2553 PROPS-END SVN���aaaSummary: Using modal dialog boxes on Windows invokes a substandard message loop Class: bug Present-in: 0.63 Difficulty: taxing Priority: medium Content-type: text/x-html-body <p> Windows PuTTY launches many of its dialog boxes using modal Windows API functions (<code>DialogBox</code>, <code>DialogBoxParam</code>, <code>GetSaveFileName</code>, <code>MessageBox</code> and so on) which do not return until the dialog box has been closed by the user. Windows implements these functions by running its own message loop, since it can't return to the application's top-level message loop. <p> Unfortunately, PuTTY's top-level message loop does important things other than fetching and dispatching window messages. In particular, it calls <code>enact_pending_netevent</code>, which is what actually does the work of responding to incoming data on network connections. So it would be better not to delegate to a subsidiary message loop we don't control. <p> For the dialog box types we invented ourselves, such as the Change Settings and About boxes, this requires only a structural change to make the Windows front end slightly more event-driven than it already is: we should launch the dialog box using <code>CreateDialog</code> rather than <code>DialogBox</code>, return to the main PuTTY message loop, and when the user closes the dialog box we should enact whatever change they requested (if any). For example, the current handler for <code>IDM_RECONF</code> would stop at the point where it calls <code>do_reconfig</code>, and all the subsequent code would move out into a window message handler for whatever message indicates the closing of the reconfiguration box. This won't necessarily be <em>easy</em> in every case (and will also require some state-tracking to ensure we don't open an endless series of reconfiguration boxes in parallel if the user selects Change Settings a second time), but it's probably feasible. <p> For Windows standard dialogs such as the load and save file ones, however, there isn't a comparably easy solution that I know of. <code>GetOpenFileName</code> and <code>GetSaveFileName</code> don't have non-modal equivalents that I know of, and as far as I can see neither do the horrible modern replacements based on <code>IFileDialog</code>. So it might be difficult to use our top-level message loop while one of those dialog boxes is active. (Unless running modal dialog API functions in a separate thread does what you want, perhaps? I currently have no idea whether that would work, though.) Revision-number: 10013 Prop-content-length: 333 Content-length: 333 K 8 svn:date V 27 2013-08-08T17:22:07.688572Z K 7 svn:log V 232 sbcsgen.pl uses 'select' to point Perl at a different default output handle. Revert that when we hackily call it from mkfiles.pl, so that if I have a need to insert diagnostics in the latter they won't go into the end of sbcsdat.c. K 10 svn:author V 5 simon PROPS-END Node-path: putty/mkfiles.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 06cbf6f25ea6dc501aa1720b37053879 Text-delta-base-sha1: 18903a623d000848877e36e9b97f8e416619b7d8 Text-content-length: 40 Text-content-md5: dc16a28e2ae4655c5100b187e3ed22de Text-content-sha1: cc41f2ee6f4452f3ae01374457b5ee122da5a7fe Content-length: 40 SVN��cs �F��F; select STDOUT; Revision-number: 10014 Prop-content-length: 348 Content-length: 348 K 7 svn:log V 247 Add some more anchor names to the wishlist page. In the 0.63 announcement I would have liked to be able to provide a URL pointing directly at the 'vulnerabilities fixed in 0.63' section, but there wasn't an anchor for it. There will be next time. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-08T17:28:15.337665Z PROPS-END Node-path: putty-wishlist/control/bugs2html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 37ef7332b639b9d5cdc4032c14ed7651 Text-delta-base-sha1: b84035e0f8b706002302b3d94c0d721698d9f0ad Text-content-length: 648 Text-content-md5: 9a37bc45bd7a208e4d44bf9f4ecba065 Text-content-sha1: 51f9dd1f9ebbc0e229d57e5a1a4d0c8991a9871c Content-length: 648 SVN��|"X��)�^eD�W�jz4�&]<a name="fixed-@{[&veranchor($class)]}">Fixed in $class</a></h3> <ul> EOF nest(<<EOF); <li><a name="fixed-vuln-@{[&veranchor($class)]}">Security vulnerabilities</a><a name="fixed-bug-@{[&veranchor($class)]}">Bugs (and semi-bugs)</a><a name="fixed-wish-@{[&veranchor($class)]}">Wishes</a>Given a canonical textual name as returned from &classifyver, give a # version of it better suited for being an anchor name. sub veranchor { my ($ver) = @_; $ver =~ s/^current snapshots/snapshots/; $ver =~ s/^release /release-/; $ver =~ s/^pre-release builds of /prerelease-/; return $ver Revision-number: 10015 Prop-content-length: 239 Content-length: 239 K 10 svn:author V 5 jacob K 8 svn:date V 27 2013-08-12T20:15:14.895795Z K 7 svn:log V 138 Remove the links to ftp.tartarus.org (for development snapshots). They've not been working since at least June, and possibly much longer. PROPS-END Node-path: putty-website/download.html Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3b475f4dec0d91e775332976d2112c4c Text-delta-base-sha1: 4236948526b8632c6142d1a9dc4783e1e5ce2e11 Text-content-length: 1414 Text-content-md5: f37caffa96a95bddb39e836ca395e726 Text-content-sha1: bd598d978c704774c2cd4a78426237e4671af9ce Content-length: 1414 SVN��&r�O��n(�Q��`��TsG�Y��V?�pk�M��`��P>A�M��`��).�IF�P��`�A�k �Rz�t*�Ul�n>�]p�H��W@�h;�H��W@�k?�H��W@�+�v,�((�:9�4_�/{�^:�y�G��N|�Yu�G���Qy�+ �L��F@I�t*�mT�bK�]p�B��F@�'0�';�F@�x �B��F@�`T�?5�Mu�t0�P6�W@�%0�B��F@�bD) </p> <table> <tr> <td colspan=3062pre-snapshots/x86/putty.exe">putty.exeartarus.org/~simon/putty062pre-snapshots/x86/puttytel.exe">puttytel.exe062pre-snapshots/x86/pscp.exe">pscp.exescpartarus.org/~simon/putty062pre-snapshots/x86/psftp.exe">psftp.exesftphttp://tartarus.org/~simon/putty062pre-snapshots/x86/puttygenuttygen.exe.DSA">(DSA sig)</a></td> </tr> <tr> <tr> <td colspan=33artarus.org/~simon/putty062pre3artarus.org/~simon/putty062pre-snapshots/md5sums">md5sumsmd5sums062pre-snapshots/sha1sums">sha1sumssha1sums062pre-snapshots/sha256sums">sha256sumssha256sums) </p> <table> <tr> <td colspan=3http://tartarus.org/~simon/putty-snapshots/x86/plink.exe">plink.exe-snapshotsartarus.org/~simon/putty-snapshots/x86/pageant.exe">pageant.exe3-snapshots/x86/putty.zip">putty.zipzip-snapshots/x86/putty.zip.DSA">(DSA sig)</a></td> </tr> <tr> <td colspan=33artarus.org/~simon/putty-snapshots/md5sums">md5sumsmd5sumshttp://tartarus.org/~simon/putty-snapshots/sha256sums-snapshots/sha512sums">sha512sumssha512sumsamp;&-src.zip Revision-number: 10016 Prop-content-length: 506 Content-length: 506 K 7 svn:log V 405 It turns out I was a little over-strict in my handling of EOF in pscp.c when I did the big revamp in r9279: I assumed that in any SCP connection we would be the first to send EOF, but in fact this isn't true - doing downloads with old-SCP, EOF is initiated by the server, so we were spuriously reporting an error for 'unexpected' EOF when everything had gone fine. Thanks to Nathan Phelan for the report. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-13T06:46:51.693434Z PROPS-END Node-path: putty/pscp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9ac67fd99265467f3909daa6cb740c25 Text-delta-base-sha1: e23a8accb118c5e09c24b40e005c33c2f49c712b Text-content-length: 244 Text-content-md5: f838fec76c0c013f050b2951798c40e8 Text-content-sha1: 5244bfaf832510313720cf5a78d88ed8d7ca02de Content-length: 244 SVN��t7'?�{��xu� l ��U�dstatic int uploadingusually The exception is if we're using old-style scp and * downloading rather than uploading. */ if ((using_sftp || uploading) && uploading = 1uploading = 0 Revision-number: 10017 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 10018 Prop-content-length: 644 Content-length: 644 K 8 svn:date V 27 2013-08-15T06:42:36.434138Z K 7 svn:log V 543 Sebastian Kuschel reports that pfd_closing can be called for a socket error with pr->c NULL, in which case calling sshfwd_unclean_close on it will dereference NULL and segfault. Write an alternative error handling path for that possibility. (I don't know if it's the only way, but one way this can happen is if you're doing dynamic forwarding and the socket error occurs during SOCKS negotiation, in which case no SSH channel has been set up yet because we haven't yet found out what we want to put in the direct-tcpip channel open message.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3772cf1f8ac16b6dc8bef54c762e0823 Text-delta-base-sha1: 7e9e2b9611a2d98dbacdf40d2e5f5cb87cc0a805 Text-content-length: 400 Text-content-md5: d8f9fcf30fd917517c61903d0b2540ac Text-content-sha1: 7500214128c37bfe4b4d3385c357f63e9d49ec21 Content-length: 400 SVN��u x�Y�x�$uif (pr->c) { sshfwd_unclean_close(pr->c); } else { /* * We might not have an SSH channel, if a socket error * occurred during SOCKS negotiation. If not, we must * clean ourself up without sshfwd_unclean_close's call * back to pfd_close. */ pfd_close(pr->s); } Revision-number: 10019 Prop-content-length: 710 Content-length: 710 K 8 svn:date V 27 2013-08-17T16:06:08.318494Z K 7 svn:log V 609 Add a general way to request an immediate top-level callback. This is a little like schedule_timer, in that the callback you provide will be run from the top-level message loop of whatever application you're in; but unlike the timer mechanism, it will happen _immediately_. The aim is to provide a general way to avoid re-entrance of code, in cases where just _doing_ the thing you want done is liable to trigger a confusing recursive call to the function in which you came to the decision to do it; instead, you just request a top-level callback at the message loop's earliest convenience, and do it then. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d51a157c034814c5dd46cbbd37b26507 Text-delta-base-sha1: 8e0976b201400cf8491fb9850d2be0553bb36e57 Text-content-length: 44 Text-content-md5: 98def77350326be917e64f60c1e0efdc Text-content-sha1: 5a4d92a4610bf84565c6cb51e82c6405c9988284 Content-length: 44 SVN��%�x��Px�LG callbackcallback Node-path: putty/callback.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 1711 Text-content-md5: 7797ac7237dbffc5e13cb8f3a70b7f15 Text-content-sha1: 507db6d9148b6fbabb32d8ea19e0b02a94873759 Content-length: 1721 PROPS-END SVN���!!!/* * Facility for queueing callback functions to be run from the * top-level event loop after the current top-level activity finishes. */ #include <stddef.h> #include "putty.h" struct callback { struct callback *next; toplevel_callback_fn_t fn; void *ctx; }; struct callback *cbhead = NULL, *cbtail = NULL; toplevel_callback_notify_fn_t notify_frontend = NULL; void *frontend = NULL; void request_callback_notifications(toplevel_callback_notify_fn_t fn, void *fr) { notify_frontend = fn; frontend = fr; } void queue_toplevel_callback(toplevel_callback_fn_t fn, void *ctx) { struct callback *cb; cb = snew(struct callback); cb->fn = fn; cb->ctx = ctx; /* If the front end has requested notification of pending * callbacks, and we didn't already have one queued, let it know * we do have one now. */ if (notify_frontend && !cbhead) notify_frontend(frontend); if (cbtail) cbtail->next = cb; else cbhead = cb; cbtail = cb; cb->next = NULL; } void run_toplevel_callbacks(void) { while (cbhead) { struct callback *cb = cbhead; /* * Careful ordering here. We call the function _before_ * advancing cbhead (though, of course, we must free cb * _after_ advancing it). This means that if the very last * callback schedules another callback, cbhead does not become * NULL at any point in this while loop, and so the frontend * notification function won't be needlessly pestered. */ cb->fn(cb->ctx); cbhead = cb->next; sfree(cb); } cbtail = NULL; } Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d47435bf6d083f64858279d55abe5086 Text-delta-base-sha1: 03c4bafabeed632025c7d5734aaf113761c58471 Text-content-length: 1148 Text-content-md5: d08f670645c8aae6c0a31af942768e0f Text-content-sha1: 9a29d9d15b3807688019b10c0509a406f058989c Content-length: 1148 SVN��r`�/�`�c%Exports from callback.c. * * This provides a method of queuing function calls to be run at the * earliest convenience from the top-level event loop. Use it if * you're deep in a nested chain of calls and want to trigger an * action which will probably lead to your function being re-entered * recursively if you just call the initiating function the normal * way. * * Most front ends run the queued callbacks by simply calling * run_toplevel_callbacks() after handling each event in their * top-level event loop. However, if a front end doesn't have control * over its own event loop (e.g. because it's using GTK) then it can * instead request notifications when a callback is available, so that * it knows to ask its delegate event loop to do the same thing. */ typedef void (*toplevel_callback_fn_t)(void *ctx); void queue_toplevel_callback(toplevel_callback_fn_t fn, void *ctx); void run_toplevel_callbacks(void); typedef void (*toplevel_callback_notify_fn_t)(void *frontend); void request_callback_notifications(toplevel_callback_notify_fn_t notify, void *frontend Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: eafbd83259485bd6a4cbffd8fbc27661 Text-delta-base-sha1: b3120833d194bb7c013278a582ef1a66a28ed5d2 Text-content-length: 859 Text-content-md5: 09402c2a8fbba3868de7a42574e6127c Text-content-sha1: 490f8f0bbccbf744d3ba2632da46e6a467a52697 Content-length: 859 SVN����" �]��-O�F?�L=R�W_guint toplevel_callbackidle_toplevel_callback_func( run_toplevel_callbacks(); gtk_idle_remove(inst->toplevel_callback_idle_id); return TRUE; } void notify_toplevel_callback inst->toplevel_callback_idle_id = gtk_idle_add(idle_toplevel_callback�* J����#xEM(menuitem), menu); gtk_container_add(GTK_CONTAINER(saved_menu), menuitem); gtk_widget_show(menuitem); menuitem = NULL; nesting++; break; case TS_EXITMENU: nesting--; if (nesting) { menu = saved_menu; /* XXX lame stacking */ saved_menu = NULL; } break; case TS_SEP: menuitem = gtk_menu_item_new(); break; default: menuitem = gtk_menu_item_new_with_label(specials[i].name); gtk_object_set_data(GTK_Orequest_callback_notifications(notify_toplevel_callback, inst Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 933d0f6ede818f33abee3894e4fa237c Text-delta-base-sha1: f80c410488e6c404f7c6ca3f5b6c97e6e7edd131 Text-content-length: 54 Text-content-md5: 9e4714ed07e48b64b68614ed7dde6c73 Text-content-sha1: b14f1c44d7d9827e6c1849a03ff44071215ea7ac Content-length: 54 SVN��=` �_��dY run_toplevel_callback Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 60b56ff597d4a2f9386bc09a973c5c4f Text-delta-base-sha1: 1fd773a3bce0f2ef74b50fe2515137409c661d74 Text-content-length: 43 Text-content-md5: e75ab9d1b69c3eeb23d3f07fbee91b53 Text-content-sha1: 5acfa97edad9cec252576d99ec8770b65fb31077 Content-length: 43 SVN��4 ���un_toplevel_callbacks( Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6244f0913f3fb1e07fd3c3520b109dd2 Text-delta-base-sha1: f29cfdd740ea5cac5b5559222d31c3115b9d7d21 Text-content-length: 170 Text-content-md5: ab350affa928b7de4c5d2372d70a3220 Text-content-sha1: 9892dee49f53a923c7c9977e17e188fc207f48aa Content-length: 170 SVN����s�K��4GT�3M�[r run_toplevel_callbacks( if (must_close_session) close_session(); run_toplevel_callbacks�In��n[ Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ef8ef972502e5b66663cdf3b50bff4ad Text-delta-base-sha1: 0ce003b5cb2bb37cf251d11c11da3caa41117522 Text-content-length: 58 Text-content-md5: f3c09f5ce6922d7ed5c6f2c3637ab696 Text-content-sha1: 4670d557e0d2092ef235365f267201bfc9f03f6b Content-length: 58 SVN���# !����~ run_toplevel_callbacks(); Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 82d2cf1eb58cad06d807ca0a5ea0e514 Text-delta-base-sha1: 7501f773e74778023c539f96173acc2687a26258 Text-content-length: 44 Text-content-md5: 819a68e280e8492c57087785220b94b5 Text-content-sha1: 70997e686c46c63efdb94ad831c086268c6c7c80 Content-length: 44 SVN��+J �8��{0run_toplevel_callbacks( Revision-number: 10020 Prop-content-length: 844 Content-length: 844 K 8 svn:date V 27 2013-08-17T16:06:12.759038Z K 7 svn:log V 743 Revamp the terminal paste mechanism using toplevel callbacks. I've removed the ad-hoc front-end bodgery in the Windows and GTK ports to arrange for term_paste to be called at the right moments, and instead, terminal.c itself deals with knowing when to send the next chunk of pasted data using a combination of timers and the new top-level callback mechanism. As a happy side effect, it's now all in one place so I can actually understand what it's doing! It turns out that what all that confusing code was up to is: send a line of pasted data, and delay sending the next line until either a CR or LF is returned from the server (typically indicating that the pasted text has been received and echoed) or 450ms elapse, whichever comes first. K 10 svn:author V 5 simon PROPS-END Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d08f670645c8aae6c0a31af942768e0f Text-delta-base-sha1: 9a29d9d15b3807688019b10c0509a406f058989c Text-content-length: 25 Text-content-md5: c2da23063ebea0666155c84e143c5400 Text-content-sha1: 9b590990eca4aeee782a2bec16c552306013c1a7 Content-length: 25 SVN��r1 ��-��n Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8a89837784081f01524a06b812d7325c Text-delta-base-sha1: 9c9161d6556f13220aa1e35c36700cf4e148f17d Text-content-length: 2388 Text-content-md5: 98229f882a7bb5a99979060fee2ab6e5 Text-content-sha1: 70d374f8d5e03183979673c8df6a5700ceac5b3d Content-length: 2388 SVN����/�-��!,�gB�"9�l3�`<�*2static void term_resume_pasting(Terminal *term); static void term_paste_callback(void *vterm); static void term_paste_queue(Terminal *term, int timed); term_resume_pasting(term); if (term->crhaslf) {} term_resume_pasting(term)�[-7Q$�c�u�W�r��Lc�Bd��\.�irgs[0] == 6) { char buf[32]; sprintf(buf, "\033[%d;%dR", term->curs.y + 1, term->curs.x + 1); ldisc_send(term->ldisc, buf, strlen(buf), 0); }static void term_resume_pasting(Terminal *term) { expire_timer_context(&term->paste_timer_ctx); term_paste_queue(term, FALSE); } static void term_paste_timing_callback(void *vterm, unsigned long now) { Terminal *term = *(Terminal **)vterm; term_resume_pasting(term); } static void term_paste_queue(Terminal *term, int timed) { if (timed) { /* * Delay sending the rest of the paste buffer until we have * seen a newline coming back from the server (indicating that * it's absorbed the data we've sent so far). As a fallback, * continue sending anyway after a longish timeout. * * We use the pointless structure field term->paste_timer_ctx * (which is a Terminal *, and we'll make sure it points * straight back to term) as our timer context, so that it can * be distinguished from term itself. That way, if we see a * reason to continue pasting before the timer goes off, we * can cancel just this timer and none of the other terminal * timers handling display updates, blinking text and cursor, * and visual bells. */ term->paste_timer_ctx = term; schedule_timer(450, term_paste_timing_callback, &term->paste_timer_ctx); } else { /* * Just arrange to call term_paste_callback from the top level * at the next opportunity. */ queue_toplevel_callback(term_paste_callback, term); } } static void term_paste_callback(void *vterm) { Terminal *term = (Terminal *)vterm; if (term->paste_len == 0) return term_paste_queue(term, TRUE)len = 0; } } get_clip(term->frontend, NULL, NULL); term_paste_queue(term, FALSEexpire_timer_context(&term->paste_timer_ctx) Node-path: putty/terminal.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8d0f19a8d3f21b458ba15cd12159cd32 Text-delta-base-sha1: c5da79483ac588d0872bc91e206493d7df409a91 Text-content-length: 52 Text-content-md5: 80c2da2e44365cc959d111eea54fc2b3 Text-content-sha1: f7f6d14e4e42620aa4d2154eecd0d41627ec4ab1 Content-length: 52 SVN��VT �~��7; Terminal *paste_timer_ctx Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 09402c2a8fbba3868de7a42574e6127c Text-delta-base-sha1: 490f8f0bbccbf744d3ba2632da46e6a467a52697 Text-content-length: 500 Text-content-md5: b7997905ac6ca800d9ff18dbd0b25405 Text-content-sha1: 3b6cc51107a1902b25317e490b59083112e5743d Content-length: 500 SVN����B�-��5KR�\$pfree_list_required) XFreeStringList(list); if (free_required) XFree(text); }EM(menuitem), menu); gtk_container_add(GTK_CONTAINER(saved_menu), menuitem); gtk_widget_show(menuitem); menuitem = NULL; nesting++; break; case TS_EXITMENU: nesting--; if (nesting) { menu = saved_menu; /* XXX lame stacking */ saved_menu = NULL; } break; case TS_SEP: menuitem = gtk_menu_item_new(); break; default�*:��:p Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: ab350affa928b7de4c5d2372d70a3220 Text-delta-base-sha1: 9892dee49f53a923c7c9977e17e188fc207f48aa Text-content-length: 127 Text-content-md5: 9cb7929e3f6900ef329618334d22e5b5 Text-content-sha1: d41cf85c9b03c4446ad974fbf2f10bcf04730c3f Content-length: 127 SVN����T�J��bT SetBkMode(hdc, TRANSPARENT); /* GRR: This draws the characte�n��T Revision-number: 10021 Prop-content-length: 345 Content-length: 345 K 8 svn:date V 27 2013-08-17T16:06:18.218735Z K 7 svn:log V 244 Revamp Windows's close_session() using toplevel callbacks. Instead of setting a must_close_session flag and having special code in the message loop to check it, we'll schedule the call to close_session using the new top-level callback system. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9cb7929e3f6900ef329618334d22e5b5 Text-delta-base-sha1: d41cf85c9b03c4446ad974fbf2f10bcf04730c3f Text-content-length: 687 Text-content-md5: 9e46c5fd53fcaa54d2f5ca6e75dd0412 Text-content-sha1: 1c7ce2a667b5d39ee611ec279da474fa6455b092 Content-length: 687 SVN����4\�y��k J�Q�Q-�.�h|�_}�z.session_closed = FALSE; } static void close_session(void *ignored_contextqueue_toplevel_callback(close_session, NULL) queue_toplevel_callback(close_session, NULL)r outside its box and * can leave 'droppings' even with the clip box! I * suppose I could loop it one character at a time ... * yuk. * * Or ... I could do a test print with "W", and use +1 * or -1 for this shift depending on if the leftmost * column is blank... */ ExtTextOut(h�l��l. Revision-number: 10022 Prop-content-length: 675 Content-length: 675 K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-17T16:06:22.459260Z K 7 svn:log V 574 Revamp GTK's session close handling using toplevel callbacks. Instead of having a special GTK idle function for dealing with session closing, I now use the new top-level callback mechanism which is slightly simpler for calling a one-off function. Also in this commit, I've arranged for connection_fatal to queue a call to the same session close function after displaying the message box, with the effect that now all the same processing takes place no matter whether the session closes cleanly or uncleanly - e.g. the SSH specials submenu is cleaned out, as it should be. PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b7997905ac6ca800d9ff18dbd0b25405 Text-delta-base-sha1: 3b6cc51107a1902b25317e490b59083112e5743d Text-content-length: 501 Text-content-md5: 2b91a496eee3f4244c2f3c06d584477f Text-content-sha1: d7c5b8148a3fe95e14e219c79b026268b6e5d332 Content-length: 501 SVN����0)�)��F�=Zf�W>V�m�L>�kstatic void exit_callback(void *vfatal_message_box(inst->window, msg); sfree(msg); queue_toplevel_callback(exit_callback, instvoid exit_callback(void *vinst) { struct gui_data *inst = (struct gui_data *)vinst} void notify_remote_exit queue_toplevel_callback(exit_callback: menuitem = gtk_menu_item_new_with_label(specials[i].name); gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", GINT_TO_�:2��2 Revision-number: 10023 Prop-content-length: 417 Content-length: 417 K 8 svn:date V 27 2013-08-17T16:06:27.519379Z K 7 svn:log V 316 Revamp net_pending_errors using toplevel callbacks. Again, I've removed the special-purpose ad-hockery from the assorted front end message loops that dealt with deferred handling of socket errors, and instead uxnet.c and winnet.c arrange that for themselves by calling the new general top-level callback mechanism. K 10 svn:author V 5 simon PROPS-END Node-path: putty/network.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 82f4db64a52e37bdb055a5a5f8b19d6b Text-delta-base-sha1: 1c90d0708ec8d601ee5b3e01c5c809deca2e2749 Text-content-length: 20 Text-content-md5: 1b28318c34511e4561807023a23f4281 Text-content-sha1: 2487e1300f050ae29052ce171a3f879aee5e86d7 Content-length: 20 SVN��R5 ��v��? Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2b91a496eee3f4244c2f3c06d584477f Text-delta-base-sha1: d7c5b8148a3fe95e14e219c79b026268b6e5d332 Text-content-length: 577 Text-content-md5: 2440ea604ae6e3ca59c0464eab8e2faa Text-content-sha1: d1a724108fbdd07825705ccf4c313cd92c64b523 Content-length: 577 SVN�����B��(XPOINTER(specials[i].code)); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(special_menuitem), inst); break; } if (menuitem) { gtk_container_add(GTK_CONTAINER(menu), menuitem); gtk_widget_show(menuitem); } } gtk_widget_show(inst->specialsitem1); gtk_widget_show(inst->specialsitem2); } else { gtk_widget_hide(inst->specialsitem1); gtk_widget_hide(inst->specialsitem2); } } static void start_backend(struct gui_data *inst) { extern Backend *select_backend(Conf *conf�2�� Node-path: putty/unix/unix.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 61682121f91b39fbb535bc2499d0253c Text-delta-base-sha1: 83523910f97d0b260006d8d6a207df433e027702 Text-content-length: 20 Text-content-md5: 8cdef67f3ae27e786b90b1575f7f4eb2 Text-content-sha1: c466fd58f7555d04dfb7f35181ccabb14f034586 Content-length: 20 SVN�� ��x��"w Node-path: putty/unix/uxnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 0db630cd719bca34ca2ef2b74b60fc1a Text-delta-base-sha1: 6a0731ebc118c77dab837624da1119bb31ad4823 Text-content-length: 765 Text-content-md5: cf97bbcac7772109d780f18126480ec4 Text-content-sha1: e0124f57a1602d83953919520a98189706380db3 Content-length: 765 SVN��1[R�� �v|E� e��1Deal with socket errors detected in try_send(). */ static void socket_error_callback(void *vs) { Actual_Socket s = (Actual_Socket)vs; /* * Just in case other socket work has caused this socket to vanish * or become somehow non-erroneous before this callback arrived... */ if (!find234(sktree, s, NULL) || !s->pending_error) return; /* * An error has occurred on this socket. Pass it to the plug. */ plug_closing(s->plug, strerror(s->pending_error), s->pending_error, 0)Arrange to be called back from the top level to * deal with the error condition on this socket. */ queue_toplevel_callback(socket_error_callback, s Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e4714ed07e48b64b68614ed7dde6c73 Text-delta-base-sha1: b14f1c44d7d9827e6c1849a03ff44071215ea7ac Text-content-length: 24 Text-content-md5: 5921dc8112edb066d602b4a76d43ed1a Text-content-sha1: 0b3fe8a47ed1d746e426ffbbdc6d8f4423c102f9 Content-length: 24 SVN��`A ��H��yg Node-path: putty/unix/uxpterm.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b00890a4aa4d4e6569806b4e4b861e71 Text-delta-base-sha1: 9760faba77e09f73076852a669a8b8341af0dae1 Text-content-length: 20 Text-content-md5: 1a7da6250cbdb6010f28373a5167f2f6 Text-content-sha1: 9510647afd537d9fcd753797890aa9fb47c22d51 Content-length: 20 SVN��i ��b�� Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 9e46c5fd53fcaa54d2f5ca6e75dd0412 Text-delta-base-sha1: 1c7ce2a667b5d39ee611ec279da474fa6455b092 Text-content-length: 186 Text-content-md5: 1247d4dc441e1b96ce7ca73a83cc5be3 Text-content-sha1: df57e805428eaceeaaefba6fbfadf2db1e52b6e2 Content-length: 186 SVN����'v�~��`� �3�qQ�'Yvdc, x + xoffset - 1, y - font_height * (lattr == �lv��vv Node-path: putty/windows/winnet.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 65cb1ee61ff633e1674649e1c40bb534 Text-delta-base-sha1: dd924666a84bb31e29ef858c427524b05d95069b Text-content-length: 631 Text-content-md5: ec48362c0fc421c1c3684ef6287095d9 Text-content-sha1: 00a702ae4bed60ececd7ec9fa79c01040e19c89f Content-length: 631 SVN��ahM�a� �UA�;R��aDeal with socket errors detected in try_send(). */ static void socket_error_callback(void *vs) { Actual_Socket s = (Actual_Socket)vs; /* * Just in case other socket work has caused this socket to vanish * or become somehow non-erroneous before this callback arrived... */ if (!find234(sktree, s, NULL) || !s->pending_error) return; /* * An error has occurred on this socket. Pass it to the plug. */ plug_closing(s->plug, strerror(s->pending_error), s->pending_error, 0 queue_toplevel_callback(socket_error_callback, s) Revision-number: 10024 Prop-content-length: 271 Content-length: 271 K 8 svn:date V 27 2013-08-17T16:06:35.359167Z K 7 svn:log V 170 Revamp Windows pending_netevent using toplevel callbacks. This greatly simplifies the process of calling select_result() from the top level after receiving WM_NETEVENT. K 10 svn:author V 5 simon PROPS-END Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 1247d4dc441e1b96ce7ca73a83cc5be3 Text-delta-base-sha1: df57e805428eaceeaaefba6fbfadf2db1e52b6e2 Text-content-length: 992 Text-content-md5: 8c6948b09151f33711591f7417b95f56 Text-content-sha1: 346b80513b03a2329ec303b9134d7d0a3cd2134e Content-length: 992 SVN����,�;��6Vw�> �h~0�C]�pstruct wm_netevent_params { /* Used to pass data to wm_netevent_callback */ WPARAM wParam; LPARAM lParam; }wm_netevent_callback(void *vctx) { struct wm_netevent_params *params = (struct wm_netevent_params *)vctx; select_result(params->wParam, params->lParam); sfree(vctx) { /* * To protect against re-entrancy when Windows's recv() * immediately triggers a new WSAAsyncSelect window * message, we don't call select_result directly from this * handler but instead wait until we're back out at the * top level of the message loop. */ struct wm_netevent_params *params = snew(struct wm_netevent_params); params->wParam = wParam; params->lParam = lParam; queue_toplevel_callback(wm_netevent_callback, params); } LATTR_BOT) + t�vd��d Node-path: putty/windows/winstuff.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 218a84903ab43388c728c28ab1e947fd Text-delta-base-sha1: 40e5277ba266cfaf208e1b24899d83b8eb98d20a Text-content-length: 92 Text-content-md5: 5becede994e7a5aa2683c631a2675fc0 Text-content-sha1: ac4e0b010db7d5d2f72904acf2547cf4c38885bf Content-length: 92 SVN��~J D��D�gExports from winnet.c. */ extern int select_result(WPARAM, LPARAM); Revision-number: 10025 Prop-content-length: 543 Content-length: 543 K 8 svn:date V 27 2013-08-17T16:06:40.249702Z K 7 svn:log V 442 Make calling term_nopaste() a cross-platform feature. It was one of those things that went in ages ago on Windows and never got replicated in the Unix front end. And it needn't be: ldisc.c is a perfect place to put it, since it knows which of the data it's sending is based on a keystroke and which is automatically generated, and it also has access to the terminal context. So now a keypress can interrupt a runaway paste on all platforms. K 10 svn:author V 5 simon PROPS-END Node-path: putty/Recipe Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 98def77350326be917e64f60c1e0efdc Text-delta-base-sha1: 5a4d92a4610bf84565c6cb51e82c6405c9988284 Text-content-length: 40 Text-content-md5: d065dedde3bcc37cfaa43ece1e280a08 Text-content-sha1: 81cb1dccad403a9810b9c3b3c8f62ba1b3e15545 Content-length: 40 SVN��%3 � ��x�noterm noterm Node-path: putty/ldisc.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: b2c2045b1c670983d1a453b8df30e1cf Text-delta-base-sha1: 2ba3161587f5634c3a424528d506465b3ed10b05 Text-content-length: 480 Text-content-md5: de6ba9ac30ac3a4ac1bf7b6299e39874 Text-content-sha1: 7f4438401a1917aa28d95e579863696c5614d94f Content-length: 480 SVN��j8 H��H�l~if (interactive && ldisc->term) { /* * Interrupt a paste from the clipboard, if one was in * progress when the user pressed a key. This is easier than * buffering the current piece of data and saving it until the * terminal has finished pasting, and has the potential side * benefit of permitting a user to cancel an accidental huge * paste. */ term_nopaste(ldisc->term); } Node-path: putty/noterm.c Node-kind: file Node-action: add Prop-content-length: 10 Text-delta: true Text-content-length: 190 Text-content-md5: 1fa4fac042794b941bae7eb762592f5b Text-content-sha1: ed09b31dfc47fe60c724e42971a0d5967f6b7fd4 Content-length: 200 PROPS-END SVN���000/* * Stubs of functions in terminal.c, for use in programs that don't * have a terminal. */ #include "putty.h" #include "terminal.h" void term_nopaste(Terminal *term) { } Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 8c6948b09151f33711591f7417b95f56 Text-delta-base-sha1: 346b80513b03a2329ec303b9134d7d0a3cd2134e Text-content-length: 271 Text-content-md5: 599445a542a22c45703bd604bf8f84c2 Text-content-sha1: 15a8b2bdaaa34ac1317b9579d9d074ddb62a6d4a Content-length: 271 SVN����Z�l��:FZext_adjust, ETO_CLIPPED, &line_box, directbuf, len, lpDx_maybe); } } else { /* And 'normal' unicode characters */ static WCHAR *wbuf = NULL; �d? ��}Z�B" Revision-number: 10026 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 10027 Prop-content-length: 484 Content-length: 484 K 7 svn:log V 383 Sensibly enforce non-interactive rekeying. We now only present the full set of host key algorithms we can handle in the first key exchange. In subsequent rekeys, we present only the host key algorithm that we agreed on the previous time, and then we verify the host key by simply enforcing that it's exactly the same as the one we saw at first and disconnecting rudely if it isn't. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-18T06:48:20.080559Z PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 305f7b3be71161fd5494eb285c72810e Text-delta-base-sha1: bf958749770e7e16c5d1a03e34056721153bc75f Text-content-length: 5768 Text-content-md5: 6645ff58f543ac28f9b08da40ab92d1f Text-content-sha1: 9a03bd48e760c308f10039326bf76b483aa65c69 Content-length: 5768 SVN����K��K�char *hostkey_str; /* string representation, for easy checking in rekeys */���0 P�{�#�3^B�#d�@z�=�?eSSH1_PROTOFLAG_SCREEN_NUMBER; MD5Init(&md5c); MD5Update(&md5c, s->keyst if (!s->got_session_id) { /* * In the first key exchange, we list all the algorithms * we're prepared to cope with. */ ssh2_pkt_addstring_start(s->pktout); for (i = 0; i < lenof(hostkey_algs); i++) { ssh2_pkt_addstring_str(s->pktout, hostkey_algs[i]->name); if (i < lenof(hostkey_algs) - 1) ssh2_pkt_addstring_str(s->pktout, ","); } } else { /* * In subsequent key exchanges, we list only the kex * algorithm that was selected in the first key exchange, * so that we keep getting the same host key and hence * don't have to interrupt the user's session to ask for * reverification. */ assert(ssh->kex); ssh2_pkt_addstring(s->pktout, ssh->hostkey->name); s->keystr = ssh->hostkey->fmtkey(s->hkey); if (!s->got_session_id) { /* * Authenticate remote host: verify host key. (We've already * checked the signature of the exchange hash.) */ s->fingerprint = ssh->hostkey->fingerprint(s->hkey); ssh_set_frozen(ssh, 1); ssh->hostkey->keytype, s->keystr, s->fingerprint, ssh_dialog_callback, ssh); if (s->dlgret < 0) { do { crReturnVV if (s->dlgret == 0) { ssh_disconnect(ssh, "User aborted at host key verification", NULL, 0, TRUE); crStopV; } logevent("Host key fingerprint is:"); logevent(s->fingerprint); sfree(s->fingerprint); /* * Save this host key, to check against the one presented in * subsequent rekeys. */ ssh->hostkey_str = s->keystr; } else { /* * In a rekey, we never present an interactive host key * verification request to the user. Instead, we simply * enforce that the key we're seeing this time is identical to * the one we saw before. */ if (strcmp(ssh->hostkey_str, s->keystr)) { bombout(("Host key was different in repeat key exchange")); crStopV; } sfree(s->keystr); }���}\�}��k�xrnly send a WINDOW_ADJUST if there's significantly more window * available than the other end thinks there is. This saves us * sending a WINDOW_ADJUST for every character in a shell session. * * "Significant" is arbitrarily defined as half the window size. */ if (newwin / 2 >= c->v.v2.locwindow) { struct Packet *pktout; unsigned *up; /* * In order to keep track of how much window the client * actually has available, we'd like it to acknowledge each * WINDOW_ADJUST. We can't do that directly, so we accompany * it with a CHANNEL_REQUEST that has to be acknowledged. * * This is only necessary if we're opening the window wide. * If we're not, then throughput is being constrained by * something other than the maximum window size anyway. */ if (newwin == c->v.v2.locmaxwin && !(ssh->remote_bugs & BUG_CHOKES_ON_WINADJ)) { up = snew(unsigned); *up = newwin - c->v.v2.locwindow; pktout = ssh2_chanreq_init(c, "winadj@putty.projects.tartarus.org", ssh2_handle_winadj_response, up); ssh2_pkt_send(ssh, pktout); if (c->v.v2.throttle_state != UNTHROTTLED) c->v.v2.throttle_state = UNTHROTTLING; } else { /* Pretend the WINDOW_ADJUST was acked immediately. */ c->v.v2.remlocwin = newwin; c->v.v2.throttle_state = THROTTLED; } pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST); ssh2_pkt_adduint32(pktout, c->remoteid); ssh2_pkt_adduint32(pktout, newwin - c->v.v2.locwindow); hostkey_strsfree(ssh->hostkey_str�t �t�t32(pktout, 0); ssh2_pkt_send(ssh, pktout); } } break; } } /* * Return a list of the special codes that make sense in this * protocol. */ static const struct telnet_special *ssh_get_specials(void *handle) { static const struct telnet_special ssh1_ignore_special[] = { {"IGNORE message", TS_NOP} }; static const struct telnet_special ssh2_ignore_special[] = { {"IGNORE message", TS_NOP}, }; static const struct telnet_special ssh2_rekey_special[] = { {"Repeat key exchange", TS_REKEY}, }; static const struct telnet_special ssh2_session_specials[] = { {NULL, TS_SEP}, {"Break", TS_BRK}, /* These are the signal names defined by RFC 4254. * They include all the ISO C signals, but are a subset of the POSIX * required signals. */ {"SIGINT (Interrupt)", TS_SIGINT}, {"SIGTERM (Terminate)", TS_SIGTERM}, {"SIGKILL (Kill)", TS_SIGKILL}, {"SIGQUIT (Quit)", TS_SIGQUIT}, {"SIGHUP (Hangup)", TS_SIGHUP}, {"More signals", TS_SUBMENU}, {"SIGABRT", TS_SIGABRT}, {"SIGALRM", TS_SIGALRM}, {"SIGFPE", TS_SIGFPE}, {"SIGILL", TS_SIGILL}, {"SIGPIPE", TS_SIGPIPE}, {"SIGSEGV", TS_SIGSEGV}, {"SIGUSR1", TS_SIGUSR1}, {"SIGUSR2", TS_SIGUSR2}, {NULL, TS_EXITMENU} }; static const struct telnet_special specials_end[] = { {NULL, TS_EXITMENU} }; /* XXX review this length for any changes: */ static struct telnet_special ssh_specials[lenof(ssh2_ignore_special) + lenof(ssh2_rekey_special) + lenof(ssh2_session_specials) + lenof(specials_end)]; Ssh Revision-number: 10028 Prop-content-length: 134 Content-length: 134 K 8 svn:date V 27 2013-08-18T06:50:51.034211Z K 7 svn:log V 34 hostkey-rekey is fixed by r10027. K 10 svn:author V 5 simon PROPS-END Node-path: putty-wishlist/data/hostkey-rekey Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 627a2debd3efe865e311fa396e49f368 Text-delta-base-sha1: 7aa8a21c47644c1e51e0baa526488c67ff7f5f69 Text-content-length: 36 Text-content-md5: 276bbe5c19349df518c3c52c0a32f290 Text-content-sha1: 66fcd564f9514d0f74f8c7dbb4696c1a2527dbf1 Content-length: 36 SVN��HY ����IFixed-in: r10027 Revision-number: 10029 Prop-content-length: 245 Content-length: 245 K 8 svn:date V 27 2013-08-18T10:56:20.548166Z K 7 svn:log V 144 Don't run toplevel callbacks in modal dialogs. Because some of them can call gtk_main_quit(), which completely confuses the dialog box system. K 10 svn:author V 5 simon PROPS-END Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 2440ea604ae6e3ca59c0464eab8e2faa Text-delta-base-sha1: d1a724108fbdd07825705ccf4c313cd92c64b523 Text-content-length: 1208 Text-content-md5: bb85c7ebbaf8d31605b0b0d6a6765a02 Text-content-sha1: 8dc8dfcf2e39c44629abe5ddb6a72d75fcf86caf Content-length: 1208 SVN����&�v�@�c�xj �M{�L�y1void notify_toplevel_callback(void *frontend); static gint quitnotify_toplevel_callback(inst); return 0if (gtk_main_level() > 1) { /* * We don't run the callbacks if we're in the middle of a * subsidiary gtk_main. Instead, ask for a callback when we * get back out of the subsidiary main loop, so we can * reschedule ourself then. */ gtk_quit_add(2, quit_toplevel_callback_func, inst); } else { run_toplevel_callbacks(); }static void notify_toplevel_callback�rVV��ect_set_data(GTK_OBJECT(menuitem), "user-data", GINT_TO_POINTER(specials[i].code)); gtk_signal_connect(GTK_OBJECT(menuitem), "activate", GTK_SIGNAL_FUNC(special_menuitem), inst); break; } if (menuitem) { gtk_container_add(GTK_CONTAINER(menu), menuitem); gtk_widget_show(menuitem); } } gtk_widget_show(inst->specialsitem1); gtk_widget_show(inst->specialsitem2); } else { gtk_widget_hide(inst->specialsitem1); gtk_widget_hide(inst->specialsitem2); } } static void start_backend(struct gui_data *inst) { extern Backend *select_backend(Conf *conf Revision-number: 10030 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 10031 Prop-content-length: 648 Content-length: 648 K 8 svn:date V 27 2013-08-22T17:45:26.674454Z K 7 svn:log V 547 Fix handling of IPv6 dynamic forwardings. During the Conf revamp, I changed the internal representation of dynamic forwardings so that they were stored as the conceptually sensible L12345=D rather than the old D12345, and added compensation code to translate to the latter form for backwards-compatible data storage and for OpenSSH-harmonised GUI display. Unfortunately I forgot that keys in the forwarding data can also prefix the L/R with a character indicating IPv4/IPv6, and my translations didn't take account of that possibility. Fix them. K 10 svn:author V 5 simon PROPS-END Node-path: putty/config.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5273e2f0595f24e854ce6bf496ae4531 Text-delta-base-sha1: aecdc01b8356c197a36e1320d16b9ba1ef402148 Text-content-length: 853 Text-content-md5: 704fbb7ac545fa49389cf5030c484e88 Text-content-sha1: 7323582a73373aa4bc48c6d0ba7f14c0b39b9354 Content-length: 853 SVN��}8�a�8�d$ { char *L; /* * A dynamic forwarding is stored as L12345=D or * 6L12345=D (since it's mutually exclusive with * L12345=anything else), but displayed as D12345 * to match the fiction that 'Local', 'Remote' and * 'Dynamic' are three distinct modes and also to * align with OpenSSH's command line option syntax * that people will already be used to. So, for * display purposes, find the L in the key string * and turn it into a D. */ p = dupprintf("%s\t", key); L = strchr(p, 'L'); if (L) *L = 'D'; } Node-path: putty/settings.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: fbee53ff8c1601af3b65ce5c0feede40 Text-delta-base-sha1: eacc0d87a5611c50a494797df400490f9794dcbc Text-content-length: 287 Text-content-md5: 6ad6373b1e62d62886793ca482d941fa Text-content-sha1: 669fe893642e48a0effdcd47f1f2b556cb8ca414 Content-length: 287 SVN��r�#��D0 �R9�s~G�strchr(buf, 'D') != NULL, by finding the D and turning it into a L. */ char *newkey = dupstr(buf); *strchr(newkey, 'D') = 'L'char *L; str(key); L = strchr(key, 'L'); if (L) *L = 'D' Revision-number: 10032 Prop-content-length: 387 Content-length: 387 K 10 svn:author V 5 simon K 8 svn:date V 27 2013-08-26T11:55:56.173052Z K 7 svn:log V 286 Fix free of an uninitialised pointer. CHAN_AGENT channels need c->u.a.message to be either NULL or valid dynamically allocated memory, because it'll be freed by ssh_channel_destroy. This bug triggers if an agent forwarding channel is opened and closed without having sent any queries. PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6645ff58f543ac28f9b08da40ab92d1f Text-delta-base-sha1: 9a03bd48e760c308f10039326bf76b483aa65c69 Text-content-length: 121 Text-content-md5: d01bea7f674005b650f9a28fbe24cb18 Text-content-sha1: f01903b995ffe5dab1897fb8532393ba69b41701 Content-length: 121 SVN������������������ �c��Nmessage = NULL� -#� �int32(pktout, 0); ssh2_pkt_adduin Revision-number: 10033 Prop-content-length: 173 Content-length: 173 K 7 svn:log V 73 Pretty sure this was addressed with the same change as 'unix-dead-keys'. K 10 svn:author V 5 jacob K 8 svn:date V 27 2013-08-27T13:44:23.127733Z PROPS-END Node-path: putty-wishlist/data/multi-key Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 27df247b532db5e610478233d0b54e0c Text-delta-base-sha1: 260a84421ad226662365f8a9f3ebfdca5931ec3d Text-content-length: 129 Text-content-md5: 24f752a96a2a88a417378660068a77f3 Text-content-sha1: cf645f5ef53803808bc2f45fe2830b59aaff5d8e Content-length: 129 SVN��N; l�h��ggRFixed-in: r9567 2012-06-18 <p> <em>Update:</em> fixed in r9567 (with fallout addressed in r9568 and r9573). Revision-number: 10034 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 10035 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 10036 Prop-content-length: 366 Content-length: 366 K 8 svn:date V 27 2013-09-07T16:15:10.092343Z K 7 svn:log V 265 Make logparse handle completely bogus channel numbers. Previously it would throw a bunch of Perl undefined-variable-usage warnings; now it cleanly detects the problem, dumps as much of the message as it still reasonably can, and doesn't update any channel states. K 10 svn:author V 5 simon PROPS-END Node-path: putty/contrib/logparse.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 238a107bf56e7e441c184762ec50f241 Text-delta-base-sha1: 6d88a8bb556f1655ae36c25e3f238c7462005b65 Text-content-length: 1591 Text-content-md5: 5bc1bd14eef9eafaa2c0db7d6acb29c6 Text-content-sha1: 7f85b7f37e3ef42860409a4e13d7b690273db545 Content-length: 1591 SVN��u0UT��x�:xy�L)s�ely�gH�p&g� g�B�[g�h�_g� hif (!defined $index) { printf "UNKNOWN_CHANNEL (%s) (--%d)\n", $rid, $winsize; return; }if (!defined $index) { printf "UNKNOWN_CHANNEL (%s) %s\n", $rid, &str($reason); return; }if (!defined $index) { printf "UNKNOWN_CHANNEL (%s) +%d\n", $rid, $bytes; return; }if (!defined $index) { printf "UNKNOWN_CHANNEL (%s), %s bytes\n", $rid, $bytes; return; }if (!defined $index) { printf "UNKNOWN_CHANNEL (%s), type %s, %s bytes\n", $rid, $type, $bytes; return; }if (!defined $index) { printf "UNKNOWN_CHANNEL (%s)\n", $rid; return; }if (!defined $index) { printf "UNKNOWN_CHANNEL (%s)\n", $rid; return; }; if (!defined $index) { printf "UNKNOWN_CHANNEL (%s) %s (%s)", $rid, $type, $wantreply eq "yes" ? "reply" : "noreply"; } else { $chan = $channels[$index]; printf "ch%d (%s) %s (%s)", $index, $chan->{'id'}, $type, $wantreply eq "yes" ? "reply" : "noreply"; push @{$chan->{'requests_'.$direction}}, [$seq, $type] if $wantreply eq "yes"; }if (!defined $index) { printf "UNKNOWN_CHANNEL (%s)\n", $rid; return; }if (!defined $index) { printf "UNKNOWN_CHANNEL (%s)\n", $rid; return; } Revision-number: 10037 Prop-content-length: 533 Content-length: 533 K 8 svn:date V 27 2013-09-07T16:15:11.372366Z K 7 svn:log V 432 Fix SSH2_MSG_CHANNEL_EXTENDED_DATA in logparse. It looks as if it's never worked at all: it had a spurious second printf, it completely forgot to allow for the uint32 type code that SSH2_MSG_CHANNEL_DATA doesn't have, it accessed the channel state's sequence number fields in a way that made no sense and didn't match the rest of the program, *and* it misinvoked the file opening API. I must have never had an occasion to test it. K 10 svn:author V 5 simon PROPS-END Node-path: putty/contrib/logparse.pl Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5bc1bd14eef9eafaa2c0db7d6acb29c6 Text-delta-base-sha1: 7f85b7f37e3ef42860409a4e13d7b690273db545 Text-content-length: 365 Text-content-md5: daa7bd543f8274d90b631cc170b9353c Text-content-sha1: 1ccde1e27b0503ac6aee8983808cb96545cf0e7f Content-length: 365 SVN��0O'8�,�y�&<�o?�s�`�OK�{5type, $bytes) = &parse("uuu", $data); if ($type == 1) { $type = "SSH_EXTENDED_DATA_STDERR"; }$chan->{$direction}{'seq'} += $bytes; printf "ch%d (%s), type %s, %s bytes (%d--%d)\n", $index,$chan->{'id'}, $type, $bytes, $chan->{$direction}{'seq'}-$bytes, Revision-number: 10038 Prop-content-length: 273 Content-length: 273 K 8 svn:date V 27 2013-09-08T07:14:56.018959Z K 7 svn:log V 172 Pass an error message through to sshfwd_unclean_close. We have access to one at every call site, so there's really no reason not to send it through to ssh.c to be logged. K 10 svn:author V 5 simon PROPS-END Node-path: putty/portfwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d8f9fcf30fd917517c61903d0b2540ac Text-delta-base-sha1: 7500214128c37bfe4b4d3385c357f63e9d49ec21 Text-content-length: 32 Text-content-md5: 58413059208befcf48340ca6b381888f Text-content-sha1: faf9faf0e8d97ddf2a32d39a5ef4f5709acd0985 Content-length: 32 SVN��u� � ��i , error_msg Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: d01bea7f674005b650f9a28fbe24cb18 Text-delta-base-sha1: f01903b995ffe5dab1897fb8532393ba69b41701 Text-content-length: 394 Text-content-md5: dd1cfab1463793f0e43377042e6f1e0b Text-content-sha1: ab7c5d0dc81738b35e2ba740cc11630c55176b1d Content-length: 394 SVN�����������(�|��(|]�}]�7, const char *errf(ssh, "Forwarded X11 connection terminated due to local " "error: %s", errf(ssh, "Forwarded port closed due to local error: %s", err���DD�<�&& newwin > OUR_V2_MAXPKT) newwin = OUR_V2_MAXPKT; /* * O�-qDD�-�th); ssh2_pkt_adduint32(pktout, ssh->term_height); ssh2_pkt_addu Node-path: putty/ssh.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c9b9913a120127d3bd56eda7cdf292c1 Text-delta-base-sha1: 895bb9a2d403e0871b329ef1532b92a7bc14492e Text-content-length: 41 Text-content-md5: 897d62da5be79e3b1f65a743702a1e84 Text-content-sha1: e9f67d189c2786ea324878c51082711762b31bb2 Content-length: 41 SVN��+< �K��`K, const char *err Node-path: putty/x11fwd.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 062288aa464dd9ace81b09f8486265cb Text-delta-base-sha1: e8d47ea7ffc0aef8c7d2aea8735a6eb39e1250d4 Text-content-length: 34 Text-content-md5: 8a56f14ffb846937389f3d1e1a6d8bac Text-content-sha1: 6bb16111b4207d9ab30ffe4a520077aaa1965646 Content-length: 34 SVN��| �F��6F, error_msg Revision-number: 10039 Prop-content-length: 1008 Content-length: 1008 K 8 svn:date V 27 2013-09-08T13:20:49.842305Z K 7 svn:log V 907 Handle socket errors on half-open channels. Anthony Ho reports that this can occur naturally in some situation involving Windows 8 + IE 11 and dynamic port forwarding: apparently we get through the SOCKS negotiation, send our CHANNEL_OPEN, and then *immediately* suffer a local WSAECONNABORTED error before the server has sent back its OPEN_CONFIRMATION or OPEN_FAILURE. In this situation ssh2_channel_check_close was failing to notice that the channel didn't yet have a valid server id, and sending out a CHANNEL_CLOSE anyway containing 32 bits of uninitialised nonsense. We now handle this by turning our half-open CHAN_SOCKDATA_DORMANT into a half-open CHAN_ZOMBIE, which means in turn that our handler functions for OPEN_CONFIRMATION and OPEN_FAILURE have to recognise and handle that case, the former by immediately initiating channel closure once we _do_ have the channel's server id to do it with. K 10 svn:author V 5 simon PROPS-END Node-path: putty/ssh.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: dd1cfab1463793f0e43377042e6f1e0b Text-delta-base-sha1: ab7c5d0dc81738b35e2ba740cc11630c55176b1d Text-content-length: 6104 Text-content-md5: 4f0f2c6dcaeae94742be191902c5c364 Text-content-sha1: 65d6fc0ac7375117ef2873c40437f620f8859617 Content-length: 6104 SVN�����������F�|�F�>{ c->pending_eof = FALSE; /* this will confuse a zombie channel */���$.G���L �U0 �rd�(` window as well). */ if ((ssh->remote_bugs & BUG_SSH2_MAXPKT) c->halfopen) { /* * If we've sent out our own CHANNEL_OPEN but not yet seen * either OPEN_CONFIRMATION or OPEN_FAILURE in response, then * it's too early to be sending close messages of any kind. */ return; }assert(c->halfopen); /* ssh2_channel_msg will have enforcedv.v2.remwindow = ssh_pkt_getuint32(pktin); c->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin); if (c->type == CHAN_SOCKDATA_DORMANT) { c->type = CHAN_SOCKDATA; if (c->u.pfd.s) pfd_confirm(c->u.pfd.s); } else if (c->type == CHAN_ZOMBIE) { /* * This case can occur if a local socket error occurred * between us sending out CHANNEL_OPEN and receiving * OPEN_CONFIRMATION. In this case, all we can do is * immediately initiate close proceedings now that we know the * server's id to put in the close message. */ ssh2_channel_check_close(c); } else { /* * We never expect to receive OPEN_CONFIRMATION for any * *other* channel type (since only local-to-remote port * forwardings cause us to send CHANNEL_OPEN after the main * channel is live - all other auxiliary channel types are * initiated from the server end). It's safe to enforce this * by assertion rather than by ssh_disconnect, because the * real point is that we never constructed a half-open channel * structure in the first place with any type other than the * above. */ assert(!"Funny channel type in ssh2_msg_channel_open_confirmation"); } if (c->pending_eof) ssh_channel_try_eof(c); /* in case we had a pending EOF */ c = ssh2_channel_msg(ssh, pktin); if (!c) return; assert(c->halfopen); /* ssh2_channel_msg will have enforced this */ if (c->type == CHAN_SOCKDATA_DORMANT) { reason_code = ssh_pkt_getuint32(pktin); if (reason_code >= lenof(reasons)) reason_code = 0; /* ensure reasons[reason_code] in range */ ssh_pkt_getstring(pktin, &reason_string, &reason_length); logeventf(ssh, "Forwarded connection refused by server: %s [%.*s]", reasons[reason_code], reason_length, reason_string); pfd_close(c->u.pfd.s); } else if (c->type == CHAN_ZOMBIE) { /* * This case can occur if a local socket error occurred * between us sending out CHANNEL_OPEN and receiving * OPEN_FAILURE. In this case, we need do nothing except allow * the code below to throw the half-open channel away. */ } else { /* * We never expect to receive OPEN_FAILURE for any *other* * channel type (since only local-to-remote port forwardings * cause us to send CHANNEL_OPEN after the main channel is * live - all other auxiliary channel types are initiated from * the server end). It's safe to enforce this by assertion * rather than by ssh_disconnect, because the real point is * that we never constructed a half-open channel structure in * the first place with any type other than the above. */ assert(!"Funny channel type in ssh2_msg_channel_open_failure"); }�qixx�q�t(ssh->conf, CONF_ssh_cipherlist, i) != conf_get_int_int(conf, CONF_ssh_cipherlist, i)) { rekeying = "cipher settings changed"; rekey_mandatory = TRUE; } if (conf_get_int(ssh->conf, CONF_ssh2_des_cbc) != conf_get_int(conf, CONF_ssh2_des_cbc)) { rekeying = "cipher settings changed"; rekey_mandatory = TRUE; } conf_free(ssh->conf); ssh->conf = conf_copy(conf); ssh_cache_conf_values(ssh); if (rekeying) { if (!ssh->kex_in_progress) { do_ssh2_transport(ssh, rekeying, -1, NULL); } else if (rekey_mandatory) { ssh->deferred_rekey_reason = rekeying; } } } /* * Called to send data down the SSH connection. */ static int ssh_send(void *handle, char *buf, int len) { Ssh ssh = (Ssh) handle; if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL) return 0; ssh->protocol(ssh, (unsigned char *)buf, len, 0); return ssh_sendbuffer(ssh); } /* * Called to query the current amount of buffered stdin data. */ static int ssh_sendbuffer(void *handle) { Ssh ssh = (Ssh) handle; int override_value; if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL) return 0; /* * If the SSH socket itself has backed up, add the total backup * size on that to any individual buffer on the stdin channel. */ override_value = 0; if (ssh->throttled_all) override_value = ssh->overall_bufsize; if (ssh->version == 1) { return override_value; } else if (ssh->version == 2) { if (!ssh->mainchan) return override_value; else return (override_value + bufchain_size(&ssh->mainchan->v.v2.outbuffer)); } return 0; } /* * Called to set the size of the window from SSH's POV. */ static void ssh_size(void *handle, int width, int height) { Ssh ssh = (Ssh) handle; struct Packet *pktout; ssh->term_width = width; ssh->term_height = height; switch (ssh->state) { case SSH_STATE_BEFORE_SIZE: case SSH_STATE_PREPACKET: case SSH_STATE_CLOSED: break; /* do nothing */ case SSH_STATE_INTERMED: ssh->size_needed = TRUE; /* buffer for later */ break; case SSH_STATE_SESSION: if (!conf_get_int(ssh->conf, CONF_nopty)) { if (ssh->version == 1) { send_packet(ssh, SSH1_CMSG_WINDOW_SIZE, PKT_INT, ssh->term_height, PKT_INT, ssh->term_width, PKT_INT, 0, PKT_INT, 0, PKT_END); } else if (ssh->mainchan) { pktout = ssh2_chanreq_init(ssh->mainchan, "window-change", NULL, NULL); ssh2_pkt_adduint32(pktout, ssh->term_wid Revision-number: 10040 Prop-content-length: 585 Content-length: 585 K 8 svn:date V 27 2013-09-15T14:05:31.497341Z K 7 svn:log V 484 Only run one toplevel callback per event loop iteration. This change attempts to reinstate as a universal property something which was sporadically true of the ad-hockery that came before toplevel callbacks: that if there's a _very long_ queue of things to be done through the callback mechanism, the doing of them will be interleaved with re-checks of other event sources, which might (e.g.) cause a flag to be set which makes the next callback decide not to do anything after all. K 10 svn:author V 5 simon PROPS-END Node-path: putty/callback.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 7797ac7237dbffc5e13cb8f3a70b7f15 Text-delta-base-sha1: 507db6d9148b6fbabb32d8ea19e0b02a94873759 Text-content-length: 583 Text-content-md5: 3eaebf849a5720025fb1ad804220d01a Text-content-sha1: 81b817df676b04309e2e988ce92615970adce541 Content-length: 583 SVN��!q�A�B�g8�K�ch� stoat_callback(void *ctx) { static int stoat = 0; if (++stoat % 1000 == 0) debug(("stoat %d\n", stoat)); queue_toplevel_callback(stoat_callback, NULL); } void queue_stoat(void) { static int stoat = 0; if (!stoat) { stoat = 1; queue_toplevel_callback(stoat_callback, NULL); }queue_stoat()queue_stoat(); if, and so the frontend notification * if (!cbhead) cbtail = NULL; } } int toplevel_callback_pending(void) { queue_stoat(); return cbhead != NULL; } Node-path: putty/putty.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: c2da23063ebea0666155c84e143c5400 Text-delta-base-sha1: 9b590990eca4aeee782a2bec16c552306013c1a7 Text-content-length: 333 Text-content-md5: 4c7ca446dd3c58c263caf281263e3f19 Text-content-sha1: 2b102ea7c2088d4c29c63ecc020d4e11d42f0e6a Content-length: 333 SVN��1d*�s� � r�' Also, * if a front end needs to know whether a callback is pending without * actually running it (e.g. so as to put a zero timeout on a select() * call) then it can call toplevel_callback_pending(), which will * return true if at least one callback is in the queueint toplevel_callback_pending Node-path: putty/unix/gtkwin.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: bb85c7ebbaf8d31605b0b0d6a6765a02 Text-delta-base-sha1: 8dc8dfcf2e39c44629abe5ddb6a72d75fcf86caf Text-content-length: 120 Text-content-md5: da52e5beeac6133b63221af6be810df1 Text-content-sha1: 696a5438d31abd7c3de3ed3bd11ef60ac68702ca Content-length: 120 SVN���� &�P�� Lif (!toplevel_callback_pending()) �r*�r�ew_with_label(specials[i].name); gtk_obj Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 5921dc8112edb066d602b4a76d43ed1a Text-delta-base-sha1: 0b3fe8a47ed1d746e426ffbbdc6d8f4423c102f9 Text-content-length: 741 Text-content-md5: e7063b751634251c4f76a13ab01ab9cd Text-content-sha1: 3f8878833f6b488a22d5cfabe61f1fcd30da2044 Content-length: 741 SVN��A:9�m��,j]�9 C�/ unsigned long nex if (toplevel_callback_pending()) { struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; ret = select(maxfd, &rset, &wset, &xset, &tv); } else if (run_timers(now, &next)) { do { unsigned long then; long ticks; struct timeval tv; ret = select(maxfd, &rset, &wset, &xset, &tv); if (ret == 0) now = next; else now = GETTICKCOUNT(); } while (ret < 0 && errno == EINTR); } else { ret = select(maxfd, &rset, &wset, &xset, NULL); } Node-path: putty/unix/uxsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e75ab9d1b69c3eeb23d3f07fbee91b53 Text-delta-base-sha1: 5acfa97edad9cec252576d99ec8770b65fb31077 Text-content-length: 800 Text-content-md5: 3a73963b84031c04ad1ea77c30f05854 Text-content-sha1: d6b8f3a80f1e0ab59bf7caf4b0056fc3f2fd61dc Content-length: 800 SVN��4mz�U��uS!�9?C�pD unsigned long next if (toplevel_callback_pending()) { struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; ret = select(maxfd, &rset, &wset, &xset, &tv); if (ret == 0) run_toplevel_callbacks(); } else if (run_timers(now, &next)) { do { unsigned long then; long ticks; struct timeval tv; ret = select(maxfd, &rset, &wset, &xset, &tv); if (ret == 0) now = next; else now = GETTICKCOUNT(); } while (ret < 0 && errno == EINTR); } else { ret = select(maxfd, &rset, &wset, &xset, NULL); } Node-path: putty/windows/window.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 599445a542a22c45703bd604bf8f84c2 Text-delta-base-sha1: 15a8b2bdaaa34ac1317b9579d9d074ddb62a6d4a Text-content-length: 701 Text-content-md5: 4cbddf1b8ff19e123dfdcb4bd759f4e0 Text-content-sha1: aa378915f6f5a648586d9e20f703ffa4a7469b6c Content-length: 701 SVN����a�X�;�1O�V)�@# DWORD timeout; if (toplevel_callback_pending()) { timeout = 0; } else { timeout = INFINITE; /* The messages seem unreliable; especially if we're being tricky */ term_set_focus(term, GetForegroundWindow() == hwnd); } handles = handle_get_events(&nhandles); n = MsgWaitForMultipleObjects(nhandles, handles, FALSE, timeout, if } run_toplevel_callbacks(�?\�?�, directbuf, len, lpDx_maybe); } } else { /* And 'normal' unicode characters */ static WCHAR *wbuf = NULL; Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: f3c09f5ce6922d7ed5c6f2c3637ab696 Text-delta-base-sha1: 4670d557e0d2092ef235365f267201bfc9f03f6b Text-content-length: 107 Text-content-md5: 45aed03a268d27c4d15c3e5ff0cbf236 Text-content-sha1: 38424dd7b1decc947947a9c2b021882fc7ae1b14 Content-length: 107 SVN��#s Q�m�Q�5n if (toplevel_callback_pending()) { ticks = 0; } else Node-path: putty/windows/winsftp.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 819a68e280e8492c57087785220b94b5 Text-delta-base-sha1: 70997e686c46c63efdb94ad831c086268c6c7c80 Text-content-length: 81 Text-content-md5: ae5eb46f9aac001b264b26744beb34c3 Text-content-sha1: 95f9cab388c3a692fc3a37cd3157da2c8c86c22e Content-length: 81 SVN��J <�#��,toplevel_callback_pending()) { ticks = 0; } else Revision-number: 10041 Prop-content-length: 1846 Content-length: 1846 K 8 svn:date V 27 2013-09-15T14:05:38.617513Z K 7 svn:log V 1744 Remove the timed part of the terminal paste mechanism. In r10020 I carefully reimplemented using timing.c and callback.c the same policy for large pastes that the previous code appeared to be implementing ad-hoc, which included a 450ms delay between sending successive lines of pasted text if no visible acknowledgment of the just-sent line (in the form of a \n or \r) came back from the application. However, it turns out that that *wasn't* what the old code was doing. It *would* have done that, but for the bug that it never actually set the 'last_paste' variable, and never has done since it was first introduced way back in r516! So the policy I thought had been in force forever has in fact only been in force since I unwittingly fixed that bug in r10020 - and it turns out to be a bad idea, breaking pastes into vi in particular. So I've removed the timed paste code completely, on the basis that it's never actually worked and nobody seems to have been unhappy about that. Now we still break large pastes into separate lines and send them in successive top-level callbacks, and the user can still press a key to interrupt a paste if they manage to catch it still going on, but there's no attempted *delay* any more. (It's possible that what I *really* ought to be doing is calling back->sendbuffer() to see whether the backend is consuming the data pasted so far, and if not, deferring the rest of the paste until the send buffer becomes smaller. Then we could have pasting be delayed by back-pressure from the recipient, and still manually interruptible during that delay, but not have it delayed by anything else. But what we have here should at least manage to be equivalent to the *actual* rather than the intended old policy.) K 10 svn:author V 5 simon PROPS-END Node-path: putty/terminal.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 98229f882a7bb5a99979060fee2ab6e5 Text-delta-base-sha1: 70d374f8d5e03183979673c8df6a5700ceac5b3d Text-content-length: 423 Text-content-md5: ffbecbf22501ef50b3ce7c854a5d4bed Text-content-sha1: 1222585346b2176e161f4808d00f1287401090cc Content-length: 423 SVN����n�-��7E�'�kb�=Cngs[0] == 6) { char buf[32]; sprintf(buf, "\033[%d;%dR", term->curs.y + 1, term->curs.x + 1); ldisc_send(term->ldisc, buf, strlen(buf), 0); } else if (term->esc_args[0] == 5) { ldisc_send(term->ldisc, "\033[0n",�-@ b�*n�O�z��?nqueue_toplevel_callback(term_paste_callback, termqueue_toplevel_callback(term_paste_callback, term Node-path: putty/terminal.h Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 80c2da2e44365cc959d111eea54fc2b3 Text-delta-base-sha1: f7f6d14e4e42620aa4d2154eecd0d41627ec4ab1 Text-content-length: 20 Text-content-md5: c261f7775b48c510026b4ffcb480533e Text-content-sha1: 8b34dabd14ee1b465ede97822341e2bd5244c547 Content-length: 20 SVN��T5 �����5 Revision-number: 10042 Prop-content-length: 306 Content-length: 306 K 8 svn:date V 27 2013-09-15T14:40:46.509790Z K 7 svn:log V 205 Oops! Remove a tight-looping diagnostic. I temporarily applied it as a means of testing the revised event loops in r10040, and accidentally folded it into my final commit instead of backing it out. Ahem. K 10 svn:author V 5 simon PROPS-END Node-path: putty/callback.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 3eaebf849a5720025fb1ad804220d01a Text-delta-base-sha1: 81b817df676b04309e2e988ce92615970adce541 Text-content-length: 140 Text-content-md5: 4fbf797b4ef9024069ce288516e1d530 Text-content-sha1: 8632a74ca8e85249722be5a09213b6bae49998f5 Content-length: 140 SVN��qlp�A�W�Kw�pUqueue_toplevel_callback(toplevel_callback_fn_t fn, void *ctx) { struct callback *cbreturn cbhead != NULL; } Revision-number: 10043 Prop-content-length: 10 Content-length: 10 PROPS-END Revision-number: 10044 Prop-content-length: 431 Content-length: 431 K 7 svn:log V 330 Fix cut-and-paste errors in nonfatal() implementations. Unix GUI programs should not say 'Fatal Error' in the message box title, and Plink should not destroy its logging context as a side effect of printing a non-fatal error. Both appear to have been due to inattentive cut and paste from the pre-existing fatal error functions. K 10 svn:author V 5 simon K 8 svn:date V 27 2013-09-23T14:35:08.215973Z PROPS-END Node-path: putty/unix/gtkdlg.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 6d60a92577ba5a83b4f7fc73df31f3df Text-delta-base-sha1: c1b4ec795cc676c17ded811edfeb6f556ceaec8b Text-content-length: 42 Text-content-md5: f61a33f74ae1a6a52f6bb09340b4db38 Text-content-sha1: 4d38ded04c3866bff55c0cdac0e28e16706d1b06 Content-length: 42 SVN���������?B �o��Ponon Node-path: putty/unix/uxplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: e7063b751634251c4f76a13ab01ab9cd Text-delta-base-sha1: 3f8878833f6b488a22d5cfabe61f1fcd30da2044 Text-content-length: 73 Text-content-md5: 33410d8121a82e5a136f3e4e4b0ee78c Text-content-sha1: c451e88b65de8eee31468518e8e94c9b9c4b32fd Content-length: 73 SVN��:q(�<��]{�c{�Mm} void connection_fatal(void *frontend, Node-path: putty/windows/winplink.c Node-kind: file Node-action: change Text-delta: true Text-delta-base-md5: 45aed03a268d27c4d15c3e5ff0cbf236 Text-delta-base-sha1: 38424dd7b1decc947947a9c2b021882fc7ae1b14 Text-content-length: 23 Text-content-md5: ab8fdbf079a44dec822b2db4993545d3 Text-content-sha1: e66d84e4072e6365f5fabe450e86eaec8f67e73d Content-length: 23 SVN��s* �� ��!R Revision-number: 10045 Prop-content-length: 10 Content-length: 10 PROPS-END